diff --git a/.github/ISSUE_TEMPLATE/translation.yml b/.github/ISSUE_TEMPLATE/translation.yml deleted file mode 100644 index 780ebc7227..0000000000 --- a/.github/ISSUE_TEMPLATE/translation.yml +++ /dev/null @@ -1,46 +0,0 @@ -name: Translation Issue Report -description: File a translation issue report -title: "[Typo]: " -labels: ["translation"] -body: - - type: markdown - attributes: - value: | - Thanks for taking the time to fill out this translation issue report! - - type: input - id: version - attributes: - label: Python Version - description: Which version of the Python documentation covers this issue? - placeholder: ex. 3.12 - validations: - required: true - - type: input - id: url - attributes: - label: Docs Page - description: What is the url of the page containing the issue? - placeholder: https://docs.python.org/3/about.html - validations: - required: true - - type: textarea - id: zh-original - attributes: - label: Original Translation - description: Which translated paragraph in Chinese contains the issue? - validations: - required: true - - type: textarea - id: en-original - attributes: - label: Original Docs Paragraph - description: Which original paragraph in English contains the issue? - validations: - required: false - - type: textarea - id: zh-suggested - attributes: - label: Suggested Fix - description: What is your suggested fix? - validations: - required: true \ No newline at end of file diff --git a/.github/scripts/build.sh b/.github/scripts/build.sh deleted file mode 100755 index 46c229e10b..0000000000 --- a/.github/scripts/build.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -set -e -set -u -set -o pipefail - -error() { - while read -r line; do - echo - echo ::error::"$line" - done -} - -cd cpython/Doc || exit 1 -mkdir -p locales/"$LOCALE"/ -ln -sfn "$(realpath ../../docs)" locales/"$LOCALE"/LC_MESSAGES -pip3 install -q -r requirements.txt -sphinx-build -b dummy -d build/doctrees -j auto -D language=$LOCALE -D gettext_compact=0 -E --keep-going -W . build/html 2> >(error) diff --git a/.github/scripts/commit.sh b/.github/scripts/commit.sh deleted file mode 100755 index 878c0d57e6..0000000000 --- a/.github/scripts/commit.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash - -set -ex - -cd docs || exit 1 -git config user.email "github-actions[bot]@users.noreply.github.com" -git config user.name "github-actions[bot]" -if ! git status -s|grep '\.po'; then - echo "Nothing to commit" - exit 0 -fi -git add . -git commit -m '[po] auto sync' -git push diff --git a/.github/scripts/generate_tx_config.py b/.github/scripts/generate_tx_config.py deleted file mode 100755 index ebcc3b2dd4..0000000000 --- a/.github/scripts/generate_tx_config.py +++ /dev/null @@ -1,87 +0,0 @@ -"""Please note that this script requires a Transifex API token to run.""" -import glob -import subprocess -from functools import partial -from pathlib import Path -import re -import os - -run = partial(subprocess.run, check=True) - - -def init_project(): - run(["tx", "init"]) - - -def add_files(project_name: str): - run( - [ - "tx", - "add", - "remote", - "--file-filter", - "trans//.", - f"https://www.transifex.com/python-doc/{project_name}/dashboard/", - ] - ) - - -FILTER_PATTERN = re.compile( - r"^(?Pfile_filter( *)=( *))(?P.+)$", re.MULTILINE -) - - -def name_replacer(match: re.Match[str]): - prefix, resource = match.group("prefix", "resource") - override_prefix = prefix.replace("file_filter", "trans.zh_CN") - pattern = ( - resource.replace("trans//", "") - .replace("glossary_", "glossary") - .replace("--", "/") - .replace("_", "?") - ) - matches = list(glob.glob(pattern.replace(".po", ".rst"))) - if not matches: - print("missing", pattern) - return f"{prefix}{resource}\n{override_prefix}{pattern.replace('?', '_')}" - elif len(matches) == 1: - filename = matches[0].replace(".rst", ".po").replace("\\", "/") - else: - raise ValueError("multi match", resource, pattern, matches) - return f"{prefix}{resource}\n{override_prefix}{filename}" - - -def patch_config(path: str): - tx_config_path = Path(".tx", "config") - - config_content = tx_config_path.read_text("utf-8") - - cwd = os.getcwd() - os.chdir(path) - config_content = FILTER_PATTERN.sub(name_replacer, config_content) - config_content = re.sub(r'replace_edited_strings.*\n','', config_content) - config_content = re.sub(r'keep_translations.*\n','', config_content) - config_content = re.sub(r'0\ntrans\.zh_CN.*\n','0\n', config_content) - config_content = config_content.replace(' =','=') - os.chdir(cwd) - - tx_config_path.write_text(config_content, "utf-8") - - -if __name__ == "__main__": - from argparse import ArgumentParser - - parser = ArgumentParser() - - parser.add_argument("--token", default="") - parser.add_argument("--project-name", required=True) - parser.add_argument("--doc-path", required=True) - - params = parser.parse_args() - - if params.token: - os.environ["TX_TOKEN"] = params.token - - init_project() - add_files(params.project_name) - patch_config(params.doc_path) diff --git a/.github/scripts/prepare.sh b/.github/scripts/prepare.sh deleted file mode 100755 index 1ca5daab0b..0000000000 --- a/.github/scripts/prepare.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -set -ex - -curl -o- https://raw.githubusercontent.com/transifex/cli/master/install.sh | bash \ No newline at end of file diff --git a/.github/scripts/tx_stat.py b/.github/scripts/tx_stat.py deleted file mode 100644 index 00dcf965cb..0000000000 --- a/.github/scripts/tx_stat.py +++ /dev/null @@ -1,33 +0,0 @@ -import json -import os -import urllib.request -from datetime import datetime - -key = os.environ.get('TX_TOKEN') -project = os.environ.get('TX_PROJECT') - -url = "https://rest.api.transifex.com/resource_language_stats?filter[project]=o%3Apython-doc%3Ap%3A{}&filter[language]=l%3Azh_CN".format(project) - -headers = { - "accept": "application/vnd.api+json", - "authorization": "Bearer " + key -} - -total = 0 -translated = 0 - -while(url): - request = urllib.request.Request(url=url,headers=headers) - - with urllib.request.urlopen(request) as response: - data = json.loads(response.read().decode("utf-8")) - url = data['links'].get('next') - for resourse in data['data']: - translated = translated + resourse['attributes']['translated_strings'] - total = total + resourse['attributes']['total_strings'] - -p = '{:.2%}'.format(translated/total) -print(json.dumps({ - 'translation':p, - 'updated_at':datetime.utcnow().isoformat(timespec='seconds') + 'Z', - })) \ No newline at end of file diff --git a/.github/scripts/update.sh b/.github/scripts/update.sh deleted file mode 100755 index 0f2231d9f0..0000000000 --- a/.github/scripts/update.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash - -set -u - -cd cpython || exit 1 - -# Restore git timestamp for enabling build cache -rev=HEAD -for f in $(git ls-tree -r -t --full-name --name-only "$rev" Doc) ; do - touch -d $(git log --pretty=format:%cI -1 "$rev" -- "$f") "$f"; -done - -cd .. -cd docs || exit 1 - -# Restore git timestamp for enabling build cache -rev=HEAD -for f in $(git ls-tree -r -t --full-name --name-only "$rev") ; do - touch -d $(git log --pretty=format:%cI -1 "$rev" -- "$f") "$f"; -done - -$(realpath ../tx) pull --languages "$LOCALE" -t --use-git-timestamps --workers 25 --silent diff --git a/.github/workflows/python-310.yml b/.github/workflows/python-310.yml deleted file mode 100644 index 35a148f472..0000000000 --- a/.github/workflows/python-310.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: python-310 - -on: - workflow_dispatch: - push: - branches: - - master - schedule: - - cron: "22 * * * *" - -jobs: - sync: - uses: ./.github/workflows/sync.yml - with: - version: "3.10" - tx_project: "python-310" - secrets: inherit - \ No newline at end of file diff --git a/.github/workflows/python-311.yml b/.github/workflows/python-311.yml deleted file mode 100644 index 4fa85bb77f..0000000000 --- a/.github/workflows/python-311.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: python-311 - -on: - workflow_dispatch: - push: - branches: - - master - schedule: - - cron: "32 * * * *" - -jobs: - sync: - uses: ./.github/workflows/sync.yml - with: - version: "3.11" - tx_project: "python-311" - secrets: inherit - diff --git a/.github/workflows/python-312.yml b/.github/workflows/python-312.yml deleted file mode 100644 index 75cc1d35e5..0000000000 --- a/.github/workflows/python-312.yml +++ /dev/null @@ -1,17 +0,0 @@ -name: python-312 - -on: - workflow_dispatch: - push: - branches: - - master - schedule: - - cron: "42 * * * *" - -jobs: - sync: - uses: ./.github/workflows/sync.yml - with: - version: "3.12" - tx_project: "python-312" - secrets: inherit diff --git a/.github/workflows/python-313.yml b/.github/workflows/python-313.yml deleted file mode 100644 index 5cf9c8340e..0000000000 --- a/.github/workflows/python-313.yml +++ /dev/null @@ -1,17 +0,0 @@ -name: python-313 - -on: - workflow_dispatch: - push: - branches: - - master - schedule: - - cron: "52 * * * *" - -jobs: - sync: - uses: ./.github/workflows/sync.yml - with: - version: "3.13" - tx_project: "python-313" - secrets: inherit diff --git a/.github/workflows/python-314.yml b/.github/workflows/python-314.yml deleted file mode 100644 index 7f4d564260..0000000000 --- a/.github/workflows/python-314.yml +++ /dev/null @@ -1,17 +0,0 @@ -name: python-314 - -on: - workflow_dispatch: - push: - branches: - - master - schedule: - - cron: "2 * * * *" - -jobs: - sync: - uses: ./.github/workflows/sync.yml - with: - version: "3.14" - tx_project: "python-314" - secrets: inherit diff --git a/.github/workflows/python-315.yml b/.github/workflows/python-315.yml deleted file mode 100644 index 6618f4c556..0000000000 --- a/.github/workflows/python-315.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: python-315 - -on: - workflow_dispatch: - push: - branches: - - master - schedule: - - cron: "12 * * * *" - -jobs: - sync: - uses: ./.github/workflows/sync.yml - with: - version: "3.15" - tx_project: "python-newest" - secrets: inherit - \ No newline at end of file diff --git a/.github/workflows/python-37.yml b/.github/workflows/python-37.yml deleted file mode 100644 index 47c224c3b5..0000000000 --- a/.github/workflows/python-37.yml +++ /dev/null @@ -1,10 +0,0 @@ -name: python-37 - -on: workflow_dispatch - -jobs: - sync: - uses: ./.github/workflows/sync.yml - with: - version: "3.7" - secrets: inherit \ No newline at end of file diff --git a/.github/workflows/python-38.yml b/.github/workflows/python-38.yml deleted file mode 100644 index 9d0bc6daf1..0000000000 --- a/.github/workflows/python-38.yml +++ /dev/null @@ -1,11 +0,0 @@ -name: python-38 - -on: workflow_dispatch - -jobs: - sync: - uses: ./.github/workflows/sync.yml - with: - version: "3.8" - tx_project: "python-38" - secrets: inherit \ No newline at end of file diff --git a/.github/workflows/python-39.yml b/.github/workflows/python-39.yml deleted file mode 100644 index 9a6868d926..0000000000 --- a/.github/workflows/python-39.yml +++ /dev/null @@ -1,13 +0,0 @@ -name: python-39 - -on: - workflow_dispatch: - -jobs: - sync: - uses: ./.github/workflows/sync.yml - with: - version: "3.9" - tx_project: "python-39" - secrets: inherit - \ No newline at end of file diff --git a/.github/workflows/sync.yml b/.github/workflows/sync.yml deleted file mode 100644 index 370eac13fe..0000000000 --- a/.github/workflows/sync.yml +++ /dev/null @@ -1,68 +0,0 @@ -name: Reusable workflow example - -on: - workflow_call: - inputs: - version: - required: true - type: string - tx_project: - required: true - type: string - secrets: - TRANSIFEX_APIKEY: - required: true - -jobs: - sync: - runs-on: ubuntu-latest - env: - LOCALE: zh_CN - VERSION: ${{ inputs.version }} - steps: - - uses: actions/checkout@v6 - - name: Checkout CPython - uses: actions/checkout@v6 - with: - repository: 'python/cpython' - ref: ${{env.VERSION}} - path: cpython - - uses: actions/cache/restore@v5 - with: - path: | - cpython/Doc/build - docs - key: cache-${{ inputs.version }}-${{ github.run_id }} - restore-keys: cache-${{ inputs.version }}- - - name: Checkout Current Branch - uses: actions/checkout@v6 - with: - ref: ${{env.VERSION}} - path: docs - clean: false - - name: prepare - run: .github/scripts/prepare.sh - - name: update - run: .github/scripts/update.sh - env: - TX_TOKEN: ${{ secrets.TRANSIFEX_APIKEY }} - - uses: actions/cache/restore@v5 - with: - path: cpython/Doc/build - key: cache-${{ inputs.version }}-${{ github.run_id }} - restore-keys: cache-${{ inputs.version }}- - - name: build - run: .github/scripts/build.sh - - uses: actions/cache/save@v5 - with: - path: | - cpython/Doc/build - docs - key: cache-${{ inputs.version }}-${{ github.run_id }} - - name: stat - run: python .github/scripts/tx_stat.py > ./docs/.stat.json - env: - TX_TOKEN: ${{ secrets.TRANSIFEX_APIKEY }} - TX_PROJECT: ${{ inputs.tx_project }} - - name: commit - run: .github/scripts/commit.sh \ No newline at end of file diff --git a/.github/workflows/update-tx-config.yml b/.github/workflows/update-tx-config.yml deleted file mode 100644 index de03f247f5..0000000000 --- a/.github/workflows/update-tx-config.yml +++ /dev/null @@ -1,78 +0,0 @@ -name: Update Transifex Config - -on: - workflow_dispatch: - -jobs: - update-config: - runs-on: ubuntu-latest - strategy: - matrix: - version: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.15"] - include: - - version: "3.10" - tx_project: "python-310" - - version: "3.11" - tx_project: "python-311" - - version: "3.12" - tx_project: "python-312" - - version: "3.13" - tx_project: "python-313" - - version: "3.14" - tx_project: "python-314" - - version: "3.15" - tx_project: "python-newest" - steps: - - name: Checkout repository at version branch - uses: actions/checkout@v6 - with: - ref: ${{ matrix.version }} - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Checkout CPython - uses: actions/checkout@v6 - with: - repository: 'python/cpython' - ref: ${{ matrix.version }} - path: cpython - - - name: Set up Python - uses: actions/setup-python@v6 - with: - python-version: '3.14' - - - name: Install Transifex CLI - run: | - mkdir -p /tmp - curl -o- https://raw.githubusercontent.com/transifex/cli/master/install.sh | bash - sudo mv ~/bin/tx /usr/local/bin/tx - - - name: Generate Transifex config - run: | - python .github/scripts/generate_tx_config.py \ - --project-name "${{ matrix.tx_project }}" \ - --doc-path "./cpython/Doc" - env: - TX_TOKEN: ${{ secrets.TRANSIFEX_APIKEY }} - - - name: Check for changes - id: check_changes - run: | - if git diff --quiet .tx/config; then - echo "has_changes=false" >> $GITHUB_OUTPUT - else - echo "has_changes=true" >> $GITHUB_OUTPUT - fi - - - name: Configure git - if: steps.check_changes.outputs.has_changes == 'true' - run: | - git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" - - - name: Commit and push changes - if: steps.check_changes.outputs.has_changes == 'true' - run: | - git add .tx/config - git commit -m "chore: update Transifex config for Python ${{ matrix.version }}" - git push diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..cd1f2c9439 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.mo diff --git a/.stat.json b/.stat.json new file mode 100644 index 0000000000..1191111e9d --- /dev/null +++ b/.stat.json @@ -0,0 +1 @@ +{"translation": "96.47%", "updated_at": "2026-07-23T22:31:55Z"} diff --git a/.tx/config b/.tx/config new file mode 100644 index 0000000000..369b212917 --- /dev/null +++ b/.tx/config @@ -0,0 +1,4817 @@ +[main] +host = https://app.transifex.com + +[o:python-doc:p:python-314:r:about] +file_filter = trans//about.po +trans.zh_CN = about.po +source_file = trans/en/about.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = about + +[o:python-doc:p:python-314:r:bugs] +file_filter = trans//bugs.po +trans.zh_CN = bugs.po +source_file = trans/en/bugs.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = bugs + +[o:python-doc:p:python-314:r:c-api--abstract] +file_filter = trans//c-api--abstract.po +trans.zh_CN = c-api/abstract.po +source_file = trans/en/c-api--abstract.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--abstract + +[o:python-doc:p:python-314:r:c-api--allocation] +file_filter = trans//c-api--allocation.po +trans.zh_CN = c-api/allocation.po +source_file = trans/en/c-api--allocation.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--allocation + +[o:python-doc:p:python-314:r:c-api--apiabiversion] +file_filter = trans//c-api--apiabiversion.po +trans.zh_CN = c-api/apiabiversion.po +source_file = trans/en/c-api--apiabiversion.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--apiabiversion + +[o:python-doc:p:python-314:r:c-api--arg] +file_filter = trans//c-api--arg.po +trans.zh_CN = c-api/arg.po +source_file = trans/en/c-api--arg.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--arg + +[o:python-doc:p:python-314:r:c-api--bool] +file_filter = trans//c-api--bool.po +trans.zh_CN = c-api/bool.po +source_file = trans/en/c-api--bool.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--bool + +[o:python-doc:p:python-314:r:c-api--buffer] +file_filter = trans//c-api--buffer.po +trans.zh_CN = c-api/buffer.po +source_file = trans/en/c-api--buffer.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--buffer + +[o:python-doc:p:python-314:r:c-api--bytearray] +file_filter = trans//c-api--bytearray.po +trans.zh_CN = c-api/bytearray.po +source_file = trans/en/c-api--bytearray.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--bytearray + +[o:python-doc:p:python-314:r:c-api--bytes] +file_filter = trans//c-api--bytes.po +trans.zh_CN = c-api/bytes.po +source_file = trans/en/c-api--bytes.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--bytes + +[o:python-doc:p:python-314:r:c-api--call] +file_filter = trans//c-api--call.po +trans.zh_CN = c-api/call.po +source_file = trans/en/c-api--call.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--call + +[o:python-doc:p:python-314:r:c-api--capsule] +file_filter = trans//c-api--capsule.po +trans.zh_CN = c-api/capsule.po +source_file = trans/en/c-api--capsule.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--capsule + +[o:python-doc:p:python-314:r:c-api--cell] +file_filter = trans//c-api--cell.po +trans.zh_CN = c-api/cell.po +source_file = trans/en/c-api--cell.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--cell + +[o:python-doc:p:python-314:r:c-api--code] +file_filter = trans//c-api--code.po +trans.zh_CN = c-api/code.po +source_file = trans/en/c-api--code.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--code + +[o:python-doc:p:python-314:r:c-api--codec] +file_filter = trans//c-api--codec.po +trans.zh_CN = c-api/codec.po +source_file = trans/en/c-api--codec.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--codec + +[o:python-doc:p:python-314:r:c-api--complex] +file_filter = trans//c-api--complex.po +trans.zh_CN = c-api/complex.po +source_file = trans/en/c-api--complex.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--complex + +[o:python-doc:p:python-314:r:c-api--concrete] +file_filter = trans//c-api--concrete.po +trans.zh_CN = c-api/concrete.po +source_file = trans/en/c-api--concrete.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--concrete + +[o:python-doc:p:python-314:r:c-api--contextvars] +file_filter = trans//c-api--contextvars.po +trans.zh_CN = c-api/contextvars.po +source_file = trans/en/c-api--contextvars.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--contextvars + +[o:python-doc:p:python-314:r:c-api--conversion] +file_filter = trans//c-api--conversion.po +trans.zh_CN = c-api/conversion.po +source_file = trans/en/c-api--conversion.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--conversion + +[o:python-doc:p:python-314:r:c-api--coro] +file_filter = trans//c-api--coro.po +trans.zh_CN = c-api/coro.po +source_file = trans/en/c-api--coro.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--coro + +[o:python-doc:p:python-314:r:c-api--curses] +file_filter = trans//c-api--curses.po +trans.zh_CN = c-api/curses.po +source_file = trans/en/c-api--curses.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--curses + +[o:python-doc:p:python-314:r:c-api--datetime] +file_filter = trans//c-api--datetime.po +trans.zh_CN = c-api/datetime.po +source_file = trans/en/c-api--datetime.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--datetime + +[o:python-doc:p:python-314:r:c-api--descriptor] +file_filter = trans//c-api--descriptor.po +trans.zh_CN = c-api/descriptor.po +source_file = trans/en/c-api--descriptor.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--descriptor + +[o:python-doc:p:python-314:r:c-api--dict] +file_filter = trans//c-api--dict.po +trans.zh_CN = c-api/dict.po +source_file = trans/en/c-api--dict.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--dict + +[o:python-doc:p:python-314:r:c-api--exceptions] +file_filter = trans//c-api--exceptions.po +trans.zh_CN = c-api/exceptions.po +source_file = trans/en/c-api--exceptions.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--exceptions + +[o:python-doc:p:python-314:r:c-api--extension-modules] +file_filter = trans//c-api--extension-modules.po +trans.zh_CN = c-api/extension-modules.po +source_file = trans/en/c-api--extension-modules.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--extension-modules + +[o:python-doc:p:python-314:r:c-api--file] +file_filter = trans//c-api--file.po +trans.zh_CN = c-api/file.po +source_file = trans/en/c-api--file.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--file + +[o:python-doc:p:python-314:r:c-api--float] +file_filter = trans//c-api--float.po +trans.zh_CN = c-api/float.po +source_file = trans/en/c-api--float.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--float + +[o:python-doc:p:python-314:r:c-api--frame] +file_filter = trans//c-api--frame.po +trans.zh_CN = c-api/frame.po +source_file = trans/en/c-api--frame.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--frame + +[o:python-doc:p:python-314:r:c-api--function] +file_filter = trans//c-api--function.po +trans.zh_CN = c-api/function.po +source_file = trans/en/c-api--function.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--function + +[o:python-doc:p:python-314:r:c-api--gcsupport] +file_filter = trans//c-api--gcsupport.po +trans.zh_CN = c-api/gcsupport.po +source_file = trans/en/c-api--gcsupport.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--gcsupport + +[o:python-doc:p:python-314:r:c-api--gen] +file_filter = trans//c-api--gen.po +trans.zh_CN = c-api/gen.po +source_file = trans/en/c-api--gen.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--gen + +[o:python-doc:p:python-314:r:c-api--hash] +file_filter = trans//c-api--hash.po +trans.zh_CN = c-api/hash.po +source_file = trans/en/c-api--hash.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--hash + +[o:python-doc:p:python-314:r:c-api--import] +file_filter = trans//c-api--import.po +trans.zh_CN = c-api/import.po +source_file = trans/en/c-api--import.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--import + +[o:python-doc:p:python-314:r:c-api--index] +file_filter = trans//c-api--index.po +trans.zh_CN = c-api/index.po +source_file = trans/en/c-api--index.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--index + +[o:python-doc:p:python-314:r:c-api--init] +file_filter = trans//c-api--init.po +trans.zh_CN = c-api/init.po +source_file = trans/en/c-api--init.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--init + +[o:python-doc:p:python-314:r:c-api--init_config] +file_filter = trans//c-api--init_config.po +trans.zh_CN = c-api/init_config.po +source_file = trans/en/c-api--init_config.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--init_config + +[o:python-doc:p:python-314:r:c-api--interp-lifecycle] +file_filter = trans//c-api--interp-lifecycle.po +trans.zh_CN = c-api/interp-lifecycle.po +source_file = trans/en/c-api--interp-lifecycle.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--interp-lifecycle + +[o:python-doc:p:python-314:r:c-api--intro] +file_filter = trans//c-api--intro.po +trans.zh_CN = c-api/intro.po +source_file = trans/en/c-api--intro.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--intro + +[o:python-doc:p:python-314:r:c-api--iter] +file_filter = trans//c-api--iter.po +trans.zh_CN = c-api/iter.po +source_file = trans/en/c-api--iter.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--iter + +[o:python-doc:p:python-314:r:c-api--iterator] +file_filter = trans//c-api--iterator.po +trans.zh_CN = c-api/iterator.po +source_file = trans/en/c-api--iterator.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--iterator + +[o:python-doc:p:python-314:r:c-api--lifecycle] +file_filter = trans//c-api--lifecycle.po +trans.zh_CN = c-api/lifecycle.po +source_file = trans/en/c-api--lifecycle.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--lifecycle + +[o:python-doc:p:python-314:r:c-api--list] +file_filter = trans//c-api--list.po +trans.zh_CN = c-api/list.po +source_file = trans/en/c-api--list.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--list + +[o:python-doc:p:python-314:r:c-api--long] +file_filter = trans//c-api--long.po +trans.zh_CN = c-api/long.po +source_file = trans/en/c-api--long.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--long + +[o:python-doc:p:python-314:r:c-api--mapping] +file_filter = trans//c-api--mapping.po +trans.zh_CN = c-api/mapping.po +source_file = trans/en/c-api--mapping.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--mapping + +[o:python-doc:p:python-314:r:c-api--marshal] +file_filter = trans//c-api--marshal.po +trans.zh_CN = c-api/marshal.po +source_file = trans/en/c-api--marshal.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--marshal + +[o:python-doc:p:python-314:r:c-api--memory] +file_filter = trans//c-api--memory.po +trans.zh_CN = c-api/memory.po +source_file = trans/en/c-api--memory.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--memory + +[o:python-doc:p:python-314:r:c-api--memoryview] +file_filter = trans//c-api--memoryview.po +trans.zh_CN = c-api/memoryview.po +source_file = trans/en/c-api--memoryview.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--memoryview + +[o:python-doc:p:python-314:r:c-api--method] +file_filter = trans//c-api--method.po +trans.zh_CN = c-api/method.po +source_file = trans/en/c-api--method.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--method + +[o:python-doc:p:python-314:r:c-api--module] +file_filter = trans//c-api--module.po +trans.zh_CN = c-api/module.po +source_file = trans/en/c-api--module.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--module + +[o:python-doc:p:python-314:r:c-api--monitoring] +file_filter = trans//c-api--monitoring.po +trans.zh_CN = c-api/monitoring.po +source_file = trans/en/c-api--monitoring.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--monitoring + +[o:python-doc:p:python-314:r:c-api--none] +file_filter = trans//c-api--none.po +trans.zh_CN = c-api/none.po +source_file = trans/en/c-api--none.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--none + +[o:python-doc:p:python-314:r:c-api--number] +file_filter = trans//c-api--number.po +trans.zh_CN = c-api/number.po +source_file = trans/en/c-api--number.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--number + +[o:python-doc:p:python-314:r:c-api--object] +file_filter = trans//c-api--object.po +trans.zh_CN = c-api/object.po +source_file = trans/en/c-api--object.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--object + +[o:python-doc:p:python-314:r:c-api--objimpl] +file_filter = trans//c-api--objimpl.po +trans.zh_CN = c-api/objimpl.po +source_file = trans/en/c-api--objimpl.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--objimpl + +[o:python-doc:p:python-314:r:c-api--perfmaps] +file_filter = trans//c-api--perfmaps.po +trans.zh_CN = c-api/perfmaps.po +source_file = trans/en/c-api--perfmaps.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--perfmaps + +[o:python-doc:p:python-314:r:c-api--picklebuffer] +file_filter = trans//c-api--picklebuffer.po +trans.zh_CN = c-api/picklebuffer.po +source_file = trans/en/c-api--picklebuffer.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--picklebuffer + +[o:python-doc:p:python-314:r:c-api--profiling] +file_filter = trans//c-api--profiling.po +trans.zh_CN = c-api/profiling.po +source_file = trans/en/c-api--profiling.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--profiling + +[o:python-doc:p:python-314:r:c-api--refcounting] +file_filter = trans//c-api--refcounting.po +trans.zh_CN = c-api/refcounting.po +source_file = trans/en/c-api--refcounting.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--refcounting + +[o:python-doc:p:python-314:r:c-api--reflection] +file_filter = trans//c-api--reflection.po +trans.zh_CN = c-api/reflection.po +source_file = trans/en/c-api--reflection.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--reflection + +[o:python-doc:p:python-314:r:c-api--sequence] +file_filter = trans//c-api--sequence.po +trans.zh_CN = c-api/sequence.po +source_file = trans/en/c-api--sequence.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--sequence + +[o:python-doc:p:python-314:r:c-api--set] +file_filter = trans//c-api--set.po +trans.zh_CN = c-api/set.po +source_file = trans/en/c-api--set.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--set + +[o:python-doc:p:python-314:r:c-api--slice] +file_filter = trans//c-api--slice.po +trans.zh_CN = c-api/slice.po +source_file = trans/en/c-api--slice.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--slice + +[o:python-doc:p:python-314:r:c-api--stable] +file_filter = trans//c-api--stable.po +trans.zh_CN = c-api/stable.po +source_file = trans/en/c-api--stable.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--stable + +[o:python-doc:p:python-314:r:c-api--structures] +file_filter = trans//c-api--structures.po +trans.zh_CN = c-api/structures.po +source_file = trans/en/c-api--structures.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--structures + +[o:python-doc:p:python-314:r:c-api--subinterpreters] +file_filter = trans//c-api--subinterpreters.po +trans.zh_CN = c-api/subinterpreters.po +source_file = trans/en/c-api--subinterpreters.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--subinterpreters + +[o:python-doc:p:python-314:r:c-api--synchronization] +file_filter = trans//c-api--synchronization.po +trans.zh_CN = c-api/synchronization.po +source_file = trans/en/c-api--synchronization.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--synchronization + +[o:python-doc:p:python-314:r:c-api--sys] +file_filter = trans//c-api--sys.po +trans.zh_CN = c-api/sys.po +source_file = trans/en/c-api--sys.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--sys + +[o:python-doc:p:python-314:r:c-api--threads] +file_filter = trans//c-api--threads.po +trans.zh_CN = c-api/threads.po +source_file = trans/en/c-api--threads.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--threads + +[o:python-doc:p:python-314:r:c-api--time] +file_filter = trans//c-api--time.po +trans.zh_CN = c-api/time.po +source_file = trans/en/c-api--time.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--time + +[o:python-doc:p:python-314:r:c-api--tls] +file_filter = trans//c-api--tls.po +trans.zh_CN = c-api/tls.po +source_file = trans/en/c-api--tls.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--tls + +[o:python-doc:p:python-314:r:c-api--tuple] +file_filter = trans//c-api--tuple.po +trans.zh_CN = c-api/tuple.po +source_file = trans/en/c-api--tuple.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--tuple + +[o:python-doc:p:python-314:r:c-api--type] +file_filter = trans//c-api--type.po +trans.zh_CN = c-api/type.po +source_file = trans/en/c-api--type.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--type + +[o:python-doc:p:python-314:r:c-api--typehints] +file_filter = trans//c-api--typehints.po +trans.zh_CN = c-api/typehints.po +source_file = trans/en/c-api--typehints.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--typehints + +[o:python-doc:p:python-314:r:c-api--typeobj] +file_filter = trans//c-api--typeobj.po +trans.zh_CN = c-api/typeobj.po +source_file = trans/en/c-api--typeobj.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--typeobj + +[o:python-doc:p:python-314:r:c-api--unicode] +file_filter = trans//c-api--unicode.po +trans.zh_CN = c-api/unicode.po +source_file = trans/en/c-api--unicode.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--unicode + +[o:python-doc:p:python-314:r:c-api--utilities] +file_filter = trans//c-api--utilities.po +trans.zh_CN = c-api/utilities.po +source_file = trans/en/c-api--utilities.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--utilities + +[o:python-doc:p:python-314:r:c-api--veryhigh] +file_filter = trans//c-api--veryhigh.po +trans.zh_CN = c-api/veryhigh.po +source_file = trans/en/c-api--veryhigh.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--veryhigh + +[o:python-doc:p:python-314:r:c-api--weakref] +file_filter = trans//c-api--weakref.po +trans.zh_CN = c-api/weakref.po +source_file = trans/en/c-api--weakref.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = c-api--weakref + +[o:python-doc:p:python-314:r:contents] +file_filter = trans//contents.po +trans.zh_CN = contents.po +source_file = trans/en/contents.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = contents + +[o:python-doc:p:python-314:r:copyright] +file_filter = trans//copyright.po +trans.zh_CN = copyright.po +source_file = trans/en/copyright.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = copyright + +[o:python-doc:p:python-314:r:deprecations--c-api-pending-removal-in-3_14] +file_filter = trans//deprecations--c-api-pending-removal-in-3_14.po +trans.zh_CN = deprecations/c-api-pending-removal-in-3.14.po +source_file = trans/en/deprecations--c-api-pending-removal-in-3_14.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = deprecations--c-api-pending-removal-in-3_14 + +[o:python-doc:p:python-314:r:deprecations--c-api-pending-removal-in-3_15] +file_filter = trans//deprecations--c-api-pending-removal-in-3_15.po +trans.zh_CN = deprecations/c-api-pending-removal-in-3.15.po +source_file = trans/en/deprecations--c-api-pending-removal-in-3_15.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = deprecations--c-api-pending-removal-in-3_15 + +[o:python-doc:p:python-314:r:deprecations--c-api-pending-removal-in-3_16] +file_filter = trans//deprecations--c-api-pending-removal-in-3_16.po +trans.zh_CN = deprecations/c-api-pending-removal-in-3.16.po +source_file = trans/en/deprecations--c-api-pending-removal-in-3_16.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = deprecations--c-api-pending-removal-in-3_16 + +[o:python-doc:p:python-314:r:deprecations--c-api-pending-removal-in-3_18] +file_filter = trans//deprecations--c-api-pending-removal-in-3_18.po +trans.zh_CN = deprecations/c-api-pending-removal-in-3.18.po +source_file = trans/en/deprecations--c-api-pending-removal-in-3_18.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = deprecations--c-api-pending-removal-in-3_18 + +[o:python-doc:p:python-314:r:deprecations--c-api-pending-removal-in-future] +file_filter = trans//deprecations--c-api-pending-removal-in-future.po +trans.zh_CN = deprecations/c-api-pending-removal-in-future.po +source_file = trans/en/deprecations--c-api-pending-removal-in-future.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = deprecations--c-api-pending-removal-in-future + +[o:python-doc:p:python-314:r:deprecations--index] +file_filter = trans//deprecations--index.po +trans.zh_CN = deprecations/index.po +source_file = trans/en/deprecations--index.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = deprecations--index + +[o:python-doc:p:python-314:r:deprecations--pending-removal-in-3_13] +file_filter = trans//deprecations--pending-removal-in-3_13.po +trans.zh_CN = deprecations/pending-removal-in-3.13.po +source_file = trans/en/deprecations--pending-removal-in-3_13.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = deprecations--pending-removal-in-3_13 + +[o:python-doc:p:python-314:r:deprecations--pending-removal-in-3_14] +file_filter = trans//deprecations--pending-removal-in-3_14.po +trans.zh_CN = deprecations/pending-removal-in-3.14.po +source_file = trans/en/deprecations--pending-removal-in-3_14.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = deprecations--pending-removal-in-3_14 + +[o:python-doc:p:python-314:r:deprecations--pending-removal-in-3_15] +file_filter = trans//deprecations--pending-removal-in-3_15.po +trans.zh_CN = deprecations/pending-removal-in-3.15.po +source_file = trans/en/deprecations--pending-removal-in-3_15.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = deprecations--pending-removal-in-3_15 + +[o:python-doc:p:python-314:r:deprecations--pending-removal-in-3_16] +file_filter = trans//deprecations--pending-removal-in-3_16.po +trans.zh_CN = deprecations/pending-removal-in-3.16.po +source_file = trans/en/deprecations--pending-removal-in-3_16.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = deprecations--pending-removal-in-3_16 + +[o:python-doc:p:python-314:r:deprecations--pending-removal-in-3_17] +file_filter = trans//deprecations--pending-removal-in-3_17.po +trans.zh_CN = deprecations/pending-removal-in-3.17.po +source_file = trans/en/deprecations--pending-removal-in-3_17.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = deprecations--pending-removal-in-3_17 + +[o:python-doc:p:python-314:r:deprecations--pending-removal-in-3_18] +file_filter = trans//deprecations--pending-removal-in-3_18.po +trans.zh_CN = deprecations/pending-removal-in-3.18.po +source_file = trans/en/deprecations--pending-removal-in-3_18.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = deprecations--pending-removal-in-3_18 + +[o:python-doc:p:python-314:r:deprecations--pending-removal-in-3_19] +file_filter = trans//deprecations--pending-removal-in-3_19.po +trans.zh_CN = deprecations/pending-removal-in-3.19.po +source_file = trans/en/deprecations--pending-removal-in-3_19.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = deprecations--pending-removal-in-3_19 + +[o:python-doc:p:python-314:r:deprecations--pending-removal-in-future] +file_filter = trans//deprecations--pending-removal-in-future.po +trans.zh_CN = deprecations/pending-removal-in-future.po +source_file = trans/en/deprecations--pending-removal-in-future.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = deprecations--pending-removal-in-future + +[o:python-doc:p:python-314:r:distributing--index] +file_filter = trans//distributing--index.po +trans.zh_CN = distributing/index.po +source_file = trans/en/distributing--index.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = distributing--index + +[o:python-doc:p:python-314:r:extending--building] +file_filter = trans//extending--building.po +trans.zh_CN = extending/building.po +source_file = trans/en/extending--building.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = extending--building + +[o:python-doc:p:python-314:r:extending--embedding] +file_filter = trans//extending--embedding.po +trans.zh_CN = extending/embedding.po +source_file = trans/en/extending--embedding.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = extending--embedding + +[o:python-doc:p:python-314:r:extending--extending] +file_filter = trans//extending--extending.po +trans.zh_CN = extending/extending.po +source_file = trans/en/extending--extending.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = extending--extending + +[o:python-doc:p:python-314:r:extending--index] +file_filter = trans//extending--index.po +trans.zh_CN = extending/index.po +source_file = trans/en/extending--index.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = extending--index + +[o:python-doc:p:python-314:r:extending--newtypes] +file_filter = trans//extending--newtypes.po +trans.zh_CN = extending/newtypes.po +source_file = trans/en/extending--newtypes.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = extending--newtypes + +[o:python-doc:p:python-314:r:extending--newtypes_tutorial] +file_filter = trans//extending--newtypes_tutorial.po +trans.zh_CN = extending/newtypes_tutorial.po +source_file = trans/en/extending--newtypes_tutorial.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = extending--newtypes_tutorial + +[o:python-doc:p:python-314:r:extending--windows] +file_filter = trans//extending--windows.po +trans.zh_CN = extending/windows.po +source_file = trans/en/extending--windows.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = extending--windows + +[o:python-doc:p:python-314:r:faq--design] +file_filter = trans//faq--design.po +trans.zh_CN = faq/design.po +source_file = trans/en/faq--design.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = faq--design + +[o:python-doc:p:python-314:r:faq--extending] +file_filter = trans//faq--extending.po +trans.zh_CN = faq/extending.po +source_file = trans/en/faq--extending.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = faq--extending + +[o:python-doc:p:python-314:r:faq--general] +file_filter = trans//faq--general.po +trans.zh_CN = faq/general.po +source_file = trans/en/faq--general.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = faq--general + +[o:python-doc:p:python-314:r:faq--gui] +file_filter = trans//faq--gui.po +trans.zh_CN = faq/gui.po +source_file = trans/en/faq--gui.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = faq--gui + +[o:python-doc:p:python-314:r:faq--index] +file_filter = trans//faq--index.po +trans.zh_CN = faq/index.po +source_file = trans/en/faq--index.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = faq--index + +[o:python-doc:p:python-314:r:faq--installed] +file_filter = trans//faq--installed.po +trans.zh_CN = faq/installed.po +source_file = trans/en/faq--installed.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = faq--installed + +[o:python-doc:p:python-314:r:faq--library] +file_filter = trans//faq--library.po +trans.zh_CN = faq/library.po +source_file = trans/en/faq--library.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = faq--library + +[o:python-doc:p:python-314:r:faq--programming] +file_filter = trans//faq--programming.po +trans.zh_CN = faq/programming.po +source_file = trans/en/faq--programming.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = faq--programming + +[o:python-doc:p:python-314:r:faq--windows] +file_filter = trans//faq--windows.po +trans.zh_CN = faq/windows.po +source_file = trans/en/faq--windows.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = faq--windows + +[o:python-doc:p:python-314:r:glossary_] +file_filter = trans//glossary_.po +trans.zh_CN = glossary.po +source_file = trans/en/glossary_.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = glossary_ + +[o:python-doc:p:python-314:r:howto--a-conceptual-overview-of-asyncio] +file_filter = trans//howto--a-conceptual-overview-of-asyncio.po +trans.zh_CN = howto/a-conceptual-overview-of-asyncio.po +source_file = trans/en/howto--a-conceptual-overview-of-asyncio.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = howto--a-conceptual-overview-of-asyncio + +[o:python-doc:p:python-314:r:howto--annotations] +file_filter = trans//howto--annotations.po +trans.zh_CN = howto/annotations.po +source_file = trans/en/howto--annotations.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = howto--annotations + +[o:python-doc:p:python-314:r:howto--argparse] +file_filter = trans//howto--argparse.po +trans.zh_CN = howto/argparse.po +source_file = trans/en/howto--argparse.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = howto--argparse + +[o:python-doc:p:python-314:r:howto--argparse-optparse] +file_filter = trans//howto--argparse-optparse.po +trans.zh_CN = howto/argparse-optparse.po +source_file = trans/en/howto--argparse-optparse.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = howto--argparse-optparse + +[o:python-doc:p:python-314:r:howto--clinic] +file_filter = trans//howto--clinic.po +trans.zh_CN = howto/clinic.po +source_file = trans/en/howto--clinic.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = howto--clinic + +[o:python-doc:p:python-314:r:howto--cporting] +file_filter = trans//howto--cporting.po +trans.zh_CN = howto/cporting.po +source_file = trans/en/howto--cporting.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = howto--cporting + +[o:python-doc:p:python-314:r:howto--curses] +file_filter = trans//howto--curses.po +trans.zh_CN = howto/curses.po +source_file = trans/en/howto--curses.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = howto--curses + +[o:python-doc:p:python-314:r:howto--descriptor] +file_filter = trans//howto--descriptor.po +trans.zh_CN = howto/descriptor.po +source_file = trans/en/howto--descriptor.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = howto--descriptor + +[o:python-doc:p:python-314:r:howto--enum] +file_filter = trans//howto--enum.po +trans.zh_CN = howto/enum.po +source_file = trans/en/howto--enum.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = howto--enum + +[o:python-doc:p:python-314:r:howto--free-threading-extensions] +file_filter = trans//howto--free-threading-extensions.po +trans.zh_CN = howto/free-threading-extensions.po +source_file = trans/en/howto--free-threading-extensions.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = howto--free-threading-extensions + +[o:python-doc:p:python-314:r:howto--free-threading-python] +file_filter = trans//howto--free-threading-python.po +trans.zh_CN = howto/free-threading-python.po +source_file = trans/en/howto--free-threading-python.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = howto--free-threading-python + +[o:python-doc:p:python-314:r:howto--functional] +file_filter = trans//howto--functional.po +trans.zh_CN = howto/functional.po +source_file = trans/en/howto--functional.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = howto--functional + +[o:python-doc:p:python-314:r:howto--gdb_helpers] +file_filter = trans//howto--gdb_helpers.po +trans.zh_CN = howto/gdb_helpers.po +source_file = trans/en/howto--gdb_helpers.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = howto--gdb_helpers + +[o:python-doc:p:python-314:r:howto--index] +file_filter = trans//howto--index.po +trans.zh_CN = howto/index.po +source_file = trans/en/howto--index.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = howto--index + +[o:python-doc:p:python-314:r:howto--instrumentation] +file_filter = trans//howto--instrumentation.po +trans.zh_CN = howto/instrumentation.po +source_file = trans/en/howto--instrumentation.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = howto--instrumentation + +[o:python-doc:p:python-314:r:howto--ipaddress] +file_filter = trans//howto--ipaddress.po +trans.zh_CN = howto/ipaddress.po +source_file = trans/en/howto--ipaddress.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = howto--ipaddress + +[o:python-doc:p:python-314:r:howto--isolating-extensions] +file_filter = trans//howto--isolating-extensions.po +trans.zh_CN = howto/isolating-extensions.po +source_file = trans/en/howto--isolating-extensions.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = howto--isolating-extensions + +[o:python-doc:p:python-314:r:howto--logging] +file_filter = trans//howto--logging.po +trans.zh_CN = howto/logging.po +source_file = trans/en/howto--logging.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = howto--logging + +[o:python-doc:p:python-314:r:howto--logging-cookbook] +file_filter = trans//howto--logging-cookbook.po +trans.zh_CN = howto/logging-cookbook.po +source_file = trans/en/howto--logging-cookbook.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = howto--logging-cookbook + +[o:python-doc:p:python-314:r:howto--mro] +file_filter = trans//howto--mro.po +trans.zh_CN = howto/mro.po +source_file = trans/en/howto--mro.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = howto--mro + +[o:python-doc:p:python-314:r:howto--perf_profiling] +file_filter = trans//howto--perf_profiling.po +trans.zh_CN = howto/perf_profiling.po +source_file = trans/en/howto--perf_profiling.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = howto--perf_profiling + +[o:python-doc:p:python-314:r:howto--pyporting] +file_filter = trans//howto--pyporting.po +trans.zh_CN = howto/pyporting.po +source_file = trans/en/howto--pyporting.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = howto--pyporting + +[o:python-doc:p:python-314:r:howto--regex] +file_filter = trans//howto--regex.po +trans.zh_CN = howto/regex.po +source_file = trans/en/howto--regex.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = howto--regex + +[o:python-doc:p:python-314:r:howto--remote_debugging] +file_filter = trans//howto--remote_debugging.po +trans.zh_CN = howto/remote_debugging.po +source_file = trans/en/howto--remote_debugging.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = howto--remote_debugging + +[o:python-doc:p:python-314:r:howto--sockets] +file_filter = trans//howto--sockets.po +trans.zh_CN = howto/sockets.po +source_file = trans/en/howto--sockets.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = howto--sockets + +[o:python-doc:p:python-314:r:howto--sorting] +file_filter = trans//howto--sorting.po +trans.zh_CN = howto/sorting.po +source_file = trans/en/howto--sorting.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = howto--sorting + +[o:python-doc:p:python-314:r:howto--timerfd] +file_filter = trans//howto--timerfd.po +trans.zh_CN = howto/timerfd.po +source_file = trans/en/howto--timerfd.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = howto--timerfd + +[o:python-doc:p:python-314:r:howto--unicode] +file_filter = trans//howto--unicode.po +trans.zh_CN = howto/unicode.po +source_file = trans/en/howto--unicode.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = howto--unicode + +[o:python-doc:p:python-314:r:howto--urllib2] +file_filter = trans//howto--urllib2.po +trans.zh_CN = howto/urllib2.po +source_file = trans/en/howto--urllib2.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = howto--urllib2 + +[o:python-doc:p:python-314:r:improve-page] +file_filter = trans//improve-page.po +trans.zh_CN = improve-page.po +source_file = trans/en/improve-page.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = improve-page + +[o:python-doc:p:python-314:r:improve-page-nojs] +file_filter = trans//improve-page-nojs.po +trans.zh_CN = improve-page-nojs.po +source_file = trans/en/improve-page-nojs.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = improve-page-nojs + +[o:python-doc:p:python-314:r:installing--index] +file_filter = trans//installing--index.po +trans.zh_CN = installing/index.po +source_file = trans/en/installing--index.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = installing--index + +[o:python-doc:p:python-314:r:library--abc] +file_filter = trans//library--abc.po +trans.zh_CN = library/abc.po +source_file = trans/en/library--abc.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--abc + +[o:python-doc:p:python-314:r:library--aifc] +file_filter = trans//library--aifc.po +trans.zh_CN = library/aifc.po +source_file = trans/en/library--aifc.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--aifc + +[o:python-doc:p:python-314:r:library--allos] +file_filter = trans//library--allos.po +trans.zh_CN = library/allos.po +source_file = trans/en/library--allos.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--allos + +[o:python-doc:p:python-314:r:library--annotationlib] +file_filter = trans//library--annotationlib.po +trans.zh_CN = library/annotationlib.po +source_file = trans/en/library--annotationlib.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--annotationlib + +[o:python-doc:p:python-314:r:library--archiving] +file_filter = trans//library--archiving.po +trans.zh_CN = library/archiving.po +source_file = trans/en/library--archiving.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--archiving + +[o:python-doc:p:python-314:r:library--argparse] +file_filter = trans//library--argparse.po +trans.zh_CN = library/argparse.po +source_file = trans/en/library--argparse.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--argparse + +[o:python-doc:p:python-314:r:library--array] +file_filter = trans//library--array.po +trans.zh_CN = library/array.po +source_file = trans/en/library--array.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--array + +[o:python-doc:p:python-314:r:library--ast] +file_filter = trans//library--ast.po +trans.zh_CN = library/ast.po +source_file = trans/en/library--ast.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--ast + +[o:python-doc:p:python-314:r:library--asynchat] +file_filter = trans//library--asynchat.po +trans.zh_CN = library/asynchat.po +source_file = trans/en/library--asynchat.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--asynchat + +[o:python-doc:p:python-314:r:library--asyncio] +file_filter = trans//library--asyncio.po +trans.zh_CN = library/asyncio.po +source_file = trans/en/library--asyncio.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--asyncio + +[o:python-doc:p:python-314:r:library--asyncio-api-index] +file_filter = trans//library--asyncio-api-index.po +trans.zh_CN = library/asyncio-api-index.po +source_file = trans/en/library--asyncio-api-index.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--asyncio-api-index + +[o:python-doc:p:python-314:r:library--asyncio-dev] +file_filter = trans//library--asyncio-dev.po +trans.zh_CN = library/asyncio-dev.po +source_file = trans/en/library--asyncio-dev.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--asyncio-dev + +[o:python-doc:p:python-314:r:library--asyncio-eventloop] +file_filter = trans//library--asyncio-eventloop.po +trans.zh_CN = library/asyncio-eventloop.po +source_file = trans/en/library--asyncio-eventloop.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--asyncio-eventloop + +[o:python-doc:p:python-314:r:library--asyncio-exceptions] +file_filter = trans//library--asyncio-exceptions.po +trans.zh_CN = library/asyncio-exceptions.po +source_file = trans/en/library--asyncio-exceptions.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--asyncio-exceptions + +[o:python-doc:p:python-314:r:library--asyncio-extending] +file_filter = trans//library--asyncio-extending.po +trans.zh_CN = library/asyncio-extending.po +source_file = trans/en/library--asyncio-extending.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--asyncio-extending + +[o:python-doc:p:python-314:r:library--asyncio-future] +file_filter = trans//library--asyncio-future.po +trans.zh_CN = library/asyncio-future.po +source_file = trans/en/library--asyncio-future.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--asyncio-future + +[o:python-doc:p:python-314:r:library--asyncio-graph] +file_filter = trans//library--asyncio-graph.po +trans.zh_CN = library/asyncio-graph.po +source_file = trans/en/library--asyncio-graph.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--asyncio-graph + +[o:python-doc:p:python-314:r:library--asyncio-llapi-index] +file_filter = trans//library--asyncio-llapi-index.po +trans.zh_CN = library/asyncio-llapi-index.po +source_file = trans/en/library--asyncio-llapi-index.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--asyncio-llapi-index + +[o:python-doc:p:python-314:r:library--asyncio-platforms] +file_filter = trans//library--asyncio-platforms.po +trans.zh_CN = library/asyncio-platforms.po +source_file = trans/en/library--asyncio-platforms.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--asyncio-platforms + +[o:python-doc:p:python-314:r:library--asyncio-policy] +file_filter = trans//library--asyncio-policy.po +trans.zh_CN = library/asyncio-policy.po +source_file = trans/en/library--asyncio-policy.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--asyncio-policy + +[o:python-doc:p:python-314:r:library--asyncio-protocol] +file_filter = trans//library--asyncio-protocol.po +trans.zh_CN = library/asyncio-protocol.po +source_file = trans/en/library--asyncio-protocol.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--asyncio-protocol + +[o:python-doc:p:python-314:r:library--asyncio-queue] +file_filter = trans//library--asyncio-queue.po +trans.zh_CN = library/asyncio-queue.po +source_file = trans/en/library--asyncio-queue.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--asyncio-queue + +[o:python-doc:p:python-314:r:library--asyncio-runner] +file_filter = trans//library--asyncio-runner.po +trans.zh_CN = library/asyncio-runner.po +source_file = trans/en/library--asyncio-runner.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--asyncio-runner + +[o:python-doc:p:python-314:r:library--asyncio-stream] +file_filter = trans//library--asyncio-stream.po +trans.zh_CN = library/asyncio-stream.po +source_file = trans/en/library--asyncio-stream.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--asyncio-stream + +[o:python-doc:p:python-314:r:library--asyncio-subprocess] +file_filter = trans//library--asyncio-subprocess.po +trans.zh_CN = library/asyncio-subprocess.po +source_file = trans/en/library--asyncio-subprocess.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--asyncio-subprocess + +[o:python-doc:p:python-314:r:library--asyncio-sync] +file_filter = trans//library--asyncio-sync.po +trans.zh_CN = library/asyncio-sync.po +source_file = trans/en/library--asyncio-sync.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--asyncio-sync + +[o:python-doc:p:python-314:r:library--asyncio-task] +file_filter = trans//library--asyncio-task.po +trans.zh_CN = library/asyncio-task.po +source_file = trans/en/library--asyncio-task.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--asyncio-task + +[o:python-doc:p:python-314:r:library--asyncore] +file_filter = trans//library--asyncore.po +trans.zh_CN = library/asyncore.po +source_file = trans/en/library--asyncore.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--asyncore + +[o:python-doc:p:python-314:r:library--atexit] +file_filter = trans//library--atexit.po +trans.zh_CN = library/atexit.po +source_file = trans/en/library--atexit.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--atexit + +[o:python-doc:p:python-314:r:library--audioop] +file_filter = trans//library--audioop.po +trans.zh_CN = library/audioop.po +source_file = trans/en/library--audioop.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--audioop + +[o:python-doc:p:python-314:r:library--audit_events] +file_filter = trans//library--audit_events.po +trans.zh_CN = library/audit_events.po +source_file = trans/en/library--audit_events.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--audit_events + +[o:python-doc:p:python-314:r:library--base64] +file_filter = trans//library--base64.po +trans.zh_CN = library/base64.po +source_file = trans/en/library--base64.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--base64 + +[o:python-doc:p:python-314:r:library--bdb] +file_filter = trans//library--bdb.po +trans.zh_CN = library/bdb.po +source_file = trans/en/library--bdb.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--bdb + +[o:python-doc:p:python-314:r:library--binary] +file_filter = trans//library--binary.po +trans.zh_CN = library/binary.po +source_file = trans/en/library--binary.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--binary + +[o:python-doc:p:python-314:r:library--binascii] +file_filter = trans//library--binascii.po +trans.zh_CN = library/binascii.po +source_file = trans/en/library--binascii.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--binascii + +[o:python-doc:p:python-314:r:library--bisect] +file_filter = trans//library--bisect.po +trans.zh_CN = library/bisect.po +source_file = trans/en/library--bisect.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--bisect + +[o:python-doc:p:python-314:r:library--builtins] +file_filter = trans//library--builtins.po +trans.zh_CN = library/builtins.po +source_file = trans/en/library--builtins.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--builtins + +[o:python-doc:p:python-314:r:library--bz2] +file_filter = trans//library--bz2.po +trans.zh_CN = library/bz2.po +source_file = trans/en/library--bz2.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--bz2 + +[o:python-doc:p:python-314:r:library--calendar] +file_filter = trans//library--calendar.po +trans.zh_CN = library/calendar.po +source_file = trans/en/library--calendar.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--calendar + +[o:python-doc:p:python-314:r:library--cgi] +file_filter = trans//library--cgi.po +trans.zh_CN = library/cgi.po +source_file = trans/en/library--cgi.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--cgi + +[o:python-doc:p:python-314:r:library--cgitb] +file_filter = trans//library--cgitb.po +trans.zh_CN = library/cgitb.po +source_file = trans/en/library--cgitb.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--cgitb + +[o:python-doc:p:python-314:r:library--chunk] +file_filter = trans//library--chunk.po +trans.zh_CN = library/chunk.po +source_file = trans/en/library--chunk.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--chunk + +[o:python-doc:p:python-314:r:library--cmath] +file_filter = trans//library--cmath.po +trans.zh_CN = library/cmath.po +source_file = trans/en/library--cmath.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--cmath + +[o:python-doc:p:python-314:r:library--cmd] +file_filter = trans//library--cmd.po +trans.zh_CN = library/cmd.po +source_file = trans/en/library--cmd.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--cmd + +[o:python-doc:p:python-314:r:library--cmdline] +file_filter = trans//library--cmdline.po +trans.zh_CN = library/cmdline.po +source_file = trans/en/library--cmdline.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--cmdline + +[o:python-doc:p:python-314:r:library--cmdlinelibs] +file_filter = trans//library--cmdlinelibs.po +trans.zh_CN = library/cmdlinelibs.po +source_file = trans/en/library--cmdlinelibs.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--cmdlinelibs + +[o:python-doc:p:python-314:r:library--code] +file_filter = trans//library--code.po +trans.zh_CN = library/code.po +source_file = trans/en/library--code.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--code + +[o:python-doc:p:python-314:r:library--codecs] +file_filter = trans//library--codecs.po +trans.zh_CN = library/codecs.po +source_file = trans/en/library--codecs.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--codecs + +[o:python-doc:p:python-314:r:library--codeop] +file_filter = trans//library--codeop.po +trans.zh_CN = library/codeop.po +source_file = trans/en/library--codeop.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--codeop + +[o:python-doc:p:python-314:r:library--collections] +file_filter = trans//library--collections.po +trans.zh_CN = library/collections.po +source_file = trans/en/library--collections.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--collections + +[o:python-doc:p:python-314:r:library--collections_abc] +file_filter = trans//library--collections_abc.po +trans.zh_CN = library/collections.abc.po +source_file = trans/en/library--collections_abc.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--collections_abc + +[o:python-doc:p:python-314:r:library--colorsys] +file_filter = trans//library--colorsys.po +trans.zh_CN = library/colorsys.po +source_file = trans/en/library--colorsys.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--colorsys + +[o:python-doc:p:python-314:r:library--compileall] +file_filter = trans//library--compileall.po +trans.zh_CN = library/compileall.po +source_file = trans/en/library--compileall.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--compileall + +[o:python-doc:p:python-314:r:library--compression] +file_filter = trans//library--compression.po +trans.zh_CN = library/compression.po +source_file = trans/en/library--compression.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--compression + +[o:python-doc:p:python-314:r:library--compression_zstd] +file_filter = trans//library--compression_zstd.po +trans.zh_CN = library/compression.zstd.po +source_file = trans/en/library--compression_zstd.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--compression_zstd + +[o:python-doc:p:python-314:r:library--concurrency] +file_filter = trans//library--concurrency.po +trans.zh_CN = library/concurrency.po +source_file = trans/en/library--concurrency.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--concurrency + +[o:python-doc:p:python-314:r:library--concurrent] +file_filter = trans//library--concurrent.po +trans.zh_CN = library/concurrent.po +source_file = trans/en/library--concurrent.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--concurrent + +[o:python-doc:p:python-314:r:library--concurrent_futures] +file_filter = trans//library--concurrent_futures.po +trans.zh_CN = library/concurrent.futures.po +source_file = trans/en/library--concurrent_futures.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--concurrent_futures + +[o:python-doc:p:python-314:r:library--concurrent_interpreters] +file_filter = trans//library--concurrent_interpreters.po +trans.zh_CN = library/concurrent.interpreters.po +source_file = trans/en/library--concurrent_interpreters.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--concurrent_interpreters + +[o:python-doc:p:python-314:r:library--configparser] +file_filter = trans//library--configparser.po +trans.zh_CN = library/configparser.po +source_file = trans/en/library--configparser.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--configparser + +[o:python-doc:p:python-314:r:library--constants] +file_filter = trans//library--constants.po +trans.zh_CN = library/constants.po +source_file = trans/en/library--constants.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--constants + +[o:python-doc:p:python-314:r:library--contextlib] +file_filter = trans//library--contextlib.po +trans.zh_CN = library/contextlib.po +source_file = trans/en/library--contextlib.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--contextlib + +[o:python-doc:p:python-314:r:library--contextvars] +file_filter = trans//library--contextvars.po +trans.zh_CN = library/contextvars.po +source_file = trans/en/library--contextvars.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--contextvars + +[o:python-doc:p:python-314:r:library--copy] +file_filter = trans//library--copy.po +trans.zh_CN = library/copy.po +source_file = trans/en/library--copy.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--copy + +[o:python-doc:p:python-314:r:library--copyreg] +file_filter = trans//library--copyreg.po +trans.zh_CN = library/copyreg.po +source_file = trans/en/library--copyreg.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--copyreg + +[o:python-doc:p:python-314:r:library--crypt] +file_filter = trans//library--crypt.po +trans.zh_CN = library/crypt.po +source_file = trans/en/library--crypt.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--crypt + +[o:python-doc:p:python-314:r:library--crypto] +file_filter = trans//library--crypto.po +trans.zh_CN = library/crypto.po +source_file = trans/en/library--crypto.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--crypto + +[o:python-doc:p:python-314:r:library--csv] +file_filter = trans//library--csv.po +trans.zh_CN = library/csv.po +source_file = trans/en/library--csv.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--csv + +[o:python-doc:p:python-314:r:library--ctypes] +file_filter = trans//library--ctypes.po +trans.zh_CN = library/ctypes.po +source_file = trans/en/library--ctypes.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--ctypes + +[o:python-doc:p:python-314:r:library--curses] +file_filter = trans//library--curses.po +trans.zh_CN = library/curses.po +source_file = trans/en/library--curses.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--curses + +[o:python-doc:p:python-314:r:library--curses_ascii] +file_filter = trans//library--curses_ascii.po +trans.zh_CN = library/curses.ascii.po +source_file = trans/en/library--curses_ascii.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--curses_ascii + +[o:python-doc:p:python-314:r:library--curses_panel] +file_filter = trans//library--curses_panel.po +trans.zh_CN = library/curses.panel.po +source_file = trans/en/library--curses_panel.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--curses_panel + +[o:python-doc:p:python-314:r:library--custominterp] +file_filter = trans//library--custominterp.po +trans.zh_CN = library/custominterp.po +source_file = trans/en/library--custominterp.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--custominterp + +[o:python-doc:p:python-314:r:library--dataclasses] +file_filter = trans//library--dataclasses.po +trans.zh_CN = library/dataclasses.po +source_file = trans/en/library--dataclasses.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--dataclasses + +[o:python-doc:p:python-314:r:library--datatypes] +file_filter = trans//library--datatypes.po +trans.zh_CN = library/datatypes.po +source_file = trans/en/library--datatypes.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--datatypes + +[o:python-doc:p:python-314:r:library--datetime] +file_filter = trans//library--datetime.po +trans.zh_CN = library/datetime.po +source_file = trans/en/library--datetime.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--datetime + +[o:python-doc:p:python-314:r:library--dbm] +file_filter = trans//library--dbm.po +trans.zh_CN = library/dbm.po +source_file = trans/en/library--dbm.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--dbm + +[o:python-doc:p:python-314:r:library--debug] +file_filter = trans//library--debug.po +trans.zh_CN = library/debug.po +source_file = trans/en/library--debug.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--debug + +[o:python-doc:p:python-314:r:library--decimal] +file_filter = trans//library--decimal.po +trans.zh_CN = library/decimal.po +source_file = trans/en/library--decimal.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--decimal + +[o:python-doc:p:python-314:r:library--development] +file_filter = trans//library--development.po +trans.zh_CN = library/development.po +source_file = trans/en/library--development.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--development + +[o:python-doc:p:python-314:r:library--devmode] +file_filter = trans//library--devmode.po +trans.zh_CN = library/devmode.po +source_file = trans/en/library--devmode.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--devmode + +[o:python-doc:p:python-314:r:library--dialog] +file_filter = trans//library--dialog.po +trans.zh_CN = library/dialog.po +source_file = trans/en/library--dialog.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--dialog + +[o:python-doc:p:python-314:r:library--difflib] +file_filter = trans//library--difflib.po +trans.zh_CN = library/difflib.po +source_file = trans/en/library--difflib.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--difflib + +[o:python-doc:p:python-314:r:library--dis] +file_filter = trans//library--dis.po +trans.zh_CN = library/dis.po +source_file = trans/en/library--dis.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--dis + +[o:python-doc:p:python-314:r:library--distribution] +file_filter = trans//library--distribution.po +trans.zh_CN = library/distribution.po +source_file = trans/en/library--distribution.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--distribution + +[o:python-doc:p:python-314:r:library--distutils] +file_filter = trans//library--distutils.po +trans.zh_CN = library/distutils.po +source_file = trans/en/library--distutils.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--distutils + +[o:python-doc:p:python-314:r:library--doctest] +file_filter = trans//library--doctest.po +trans.zh_CN = library/doctest.po +source_file = trans/en/library--doctest.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--doctest + +[o:python-doc:p:python-314:r:library--email] +file_filter = trans//library--email.po +trans.zh_CN = library/email.po +source_file = trans/en/library--email.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--email + +[o:python-doc:p:python-314:r:library--email_charset] +file_filter = trans//library--email_charset.po +trans.zh_CN = library/email.charset.po +source_file = trans/en/library--email_charset.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--email_charset + +[o:python-doc:p:python-314:r:library--email_compat32-message] +file_filter = trans//library--email_compat32-message.po +trans.zh_CN = library/email.compat32-message.po +source_file = trans/en/library--email_compat32-message.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--email_compat32-message + +[o:python-doc:p:python-314:r:library--email_contentmanager] +file_filter = trans//library--email_contentmanager.po +trans.zh_CN = library/email.contentmanager.po +source_file = trans/en/library--email_contentmanager.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--email_contentmanager + +[o:python-doc:p:python-314:r:library--email_encoders] +file_filter = trans//library--email_encoders.po +trans.zh_CN = library/email.encoders.po +source_file = trans/en/library--email_encoders.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--email_encoders + +[o:python-doc:p:python-314:r:library--email_errors] +file_filter = trans//library--email_errors.po +trans.zh_CN = library/email.errors.po +source_file = trans/en/library--email_errors.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--email_errors + +[o:python-doc:p:python-314:r:library--email_examples] +file_filter = trans//library--email_examples.po +trans.zh_CN = library/email.examples.po +source_file = trans/en/library--email_examples.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--email_examples + +[o:python-doc:p:python-314:r:library--email_generator] +file_filter = trans//library--email_generator.po +trans.zh_CN = library/email.generator.po +source_file = trans/en/library--email_generator.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--email_generator + +[o:python-doc:p:python-314:r:library--email_header] +file_filter = trans//library--email_header.po +trans.zh_CN = library/email.header.po +source_file = trans/en/library--email_header.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--email_header + +[o:python-doc:p:python-314:r:library--email_headerregistry] +file_filter = trans//library--email_headerregistry.po +trans.zh_CN = library/email.headerregistry.po +source_file = trans/en/library--email_headerregistry.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--email_headerregistry + +[o:python-doc:p:python-314:r:library--email_iterators] +file_filter = trans//library--email_iterators.po +trans.zh_CN = library/email.iterators.po +source_file = trans/en/library--email_iterators.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--email_iterators + +[o:python-doc:p:python-314:r:library--email_message] +file_filter = trans//library--email_message.po +trans.zh_CN = library/email.message.po +source_file = trans/en/library--email_message.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--email_message + +[o:python-doc:p:python-314:r:library--email_mime] +file_filter = trans//library--email_mime.po +trans.zh_CN = library/email.mime.po +source_file = trans/en/library--email_mime.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--email_mime + +[o:python-doc:p:python-314:r:library--email_parser] +file_filter = trans//library--email_parser.po +trans.zh_CN = library/email.parser.po +source_file = trans/en/library--email_parser.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--email_parser + +[o:python-doc:p:python-314:r:library--email_policy] +file_filter = trans//library--email_policy.po +trans.zh_CN = library/email.policy.po +source_file = trans/en/library--email_policy.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--email_policy + +[o:python-doc:p:python-314:r:library--email_utils] +file_filter = trans//library--email_utils.po +trans.zh_CN = library/email.utils.po +source_file = trans/en/library--email_utils.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--email_utils + +[o:python-doc:p:python-314:r:library--ensurepip] +file_filter = trans//library--ensurepip.po +trans.zh_CN = library/ensurepip.po +source_file = trans/en/library--ensurepip.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--ensurepip + +[o:python-doc:p:python-314:r:library--enum] +file_filter = trans//library--enum.po +trans.zh_CN = library/enum.po +source_file = trans/en/library--enum.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--enum + +[o:python-doc:p:python-314:r:library--errno] +file_filter = trans//library--errno.po +trans.zh_CN = library/errno.po +source_file = trans/en/library--errno.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--errno + +[o:python-doc:p:python-314:r:library--exceptions] +file_filter = trans//library--exceptions.po +trans.zh_CN = library/exceptions.po +source_file = trans/en/library--exceptions.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--exceptions + +[o:python-doc:p:python-314:r:library--faulthandler] +file_filter = trans//library--faulthandler.po +trans.zh_CN = library/faulthandler.po +source_file = trans/en/library--faulthandler.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--faulthandler + +[o:python-doc:p:python-314:r:library--fcntl] +file_filter = trans//library--fcntl.po +trans.zh_CN = library/fcntl.po +source_file = trans/en/library--fcntl.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--fcntl + +[o:python-doc:p:python-314:r:library--filecmp] +file_filter = trans//library--filecmp.po +trans.zh_CN = library/filecmp.po +source_file = trans/en/library--filecmp.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--filecmp + +[o:python-doc:p:python-314:r:library--fileformats] +file_filter = trans//library--fileformats.po +trans.zh_CN = library/fileformats.po +source_file = trans/en/library--fileformats.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--fileformats + +[o:python-doc:p:python-314:r:library--fileinput] +file_filter = trans//library--fileinput.po +trans.zh_CN = library/fileinput.po +source_file = trans/en/library--fileinput.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--fileinput + +[o:python-doc:p:python-314:r:library--filesys] +file_filter = trans//library--filesys.po +trans.zh_CN = library/filesys.po +source_file = trans/en/library--filesys.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--filesys + +[o:python-doc:p:python-314:r:library--fnmatch] +file_filter = trans//library--fnmatch.po +trans.zh_CN = library/fnmatch.po +source_file = trans/en/library--fnmatch.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--fnmatch + +[o:python-doc:p:python-314:r:library--fractions] +file_filter = trans//library--fractions.po +trans.zh_CN = library/fractions.po +source_file = trans/en/library--fractions.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--fractions + +[o:python-doc:p:python-314:r:library--frameworks] +file_filter = trans//library--frameworks.po +trans.zh_CN = library/frameworks.po +source_file = trans/en/library--frameworks.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--frameworks + +[o:python-doc:p:python-314:r:library--ftplib] +file_filter = trans//library--ftplib.po +trans.zh_CN = library/ftplib.po +source_file = trans/en/library--ftplib.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--ftplib + +[o:python-doc:p:python-314:r:library--functional] +file_filter = trans//library--functional.po +trans.zh_CN = library/functional.po +source_file = trans/en/library--functional.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--functional + +[o:python-doc:p:python-314:r:library--functions] +file_filter = trans//library--functions.po +trans.zh_CN = library/functions.po +source_file = trans/en/library--functions.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--functions + +[o:python-doc:p:python-314:r:library--functools] +file_filter = trans//library--functools.po +trans.zh_CN = library/functools.po +source_file = trans/en/library--functools.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--functools + +[o:python-doc:p:python-314:r:library--__future__] +file_filter = trans//library--__future__.po +trans.zh_CN = library/__future__.po +source_file = trans/en/library--__future__.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--__future__ + +[o:python-doc:p:python-314:r:library--gc] +file_filter = trans//library--gc.po +trans.zh_CN = library/gc.po +source_file = trans/en/library--gc.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--gc + +[o:python-doc:p:python-314:r:library--getopt] +file_filter = trans//library--getopt.po +trans.zh_CN = library/getopt.po +source_file = trans/en/library--getopt.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--getopt + +[o:python-doc:p:python-314:r:library--getpass] +file_filter = trans//library--getpass.po +trans.zh_CN = library/getpass.po +source_file = trans/en/library--getpass.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--getpass + +[o:python-doc:p:python-314:r:library--gettext] +file_filter = trans//library--gettext.po +trans.zh_CN = library/gettext.po +source_file = trans/en/library--gettext.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--gettext + +[o:python-doc:p:python-314:r:library--glob] +file_filter = trans//library--glob.po +trans.zh_CN = library/glob.po +source_file = trans/en/library--glob.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--glob + +[o:python-doc:p:python-314:r:library--graphlib] +file_filter = trans//library--graphlib.po +trans.zh_CN = library/graphlib.po +source_file = trans/en/library--graphlib.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--graphlib + +[o:python-doc:p:python-314:r:library--grp] +file_filter = trans//library--grp.po +trans.zh_CN = library/grp.po +source_file = trans/en/library--grp.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--grp + +[o:python-doc:p:python-314:r:library--gzip] +file_filter = trans//library--gzip.po +trans.zh_CN = library/gzip.po +source_file = trans/en/library--gzip.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--gzip + +[o:python-doc:p:python-314:r:library--hashlib] +file_filter = trans//library--hashlib.po +trans.zh_CN = library/hashlib.po +source_file = trans/en/library--hashlib.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--hashlib + +[o:python-doc:p:python-314:r:library--heapq] +file_filter = trans//library--heapq.po +trans.zh_CN = library/heapq.po +source_file = trans/en/library--heapq.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--heapq + +[o:python-doc:p:python-314:r:library--hmac] +file_filter = trans//library--hmac.po +trans.zh_CN = library/hmac.po +source_file = trans/en/library--hmac.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--hmac + +[o:python-doc:p:python-314:r:library--html] +file_filter = trans//library--html.po +trans.zh_CN = library/html.po +source_file = trans/en/library--html.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--html + +[o:python-doc:p:python-314:r:library--html_entities] +file_filter = trans//library--html_entities.po +trans.zh_CN = library/html.entities.po +source_file = trans/en/library--html_entities.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--html_entities + +[o:python-doc:p:python-314:r:library--html_parser] +file_filter = trans//library--html_parser.po +trans.zh_CN = library/html.parser.po +source_file = trans/en/library--html_parser.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--html_parser + +[o:python-doc:p:python-314:r:library--http] +file_filter = trans//library--http.po +trans.zh_CN = library/http.po +source_file = trans/en/library--http.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--http + +[o:python-doc:p:python-314:r:library--http_client] +file_filter = trans//library--http_client.po +trans.zh_CN = library/http.client.po +source_file = trans/en/library--http_client.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--http_client + +[o:python-doc:p:python-314:r:library--http_cookiejar] +file_filter = trans//library--http_cookiejar.po +trans.zh_CN = library/http.cookiejar.po +source_file = trans/en/library--http_cookiejar.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--http_cookiejar + +[o:python-doc:p:python-314:r:library--http_cookies] +file_filter = trans//library--http_cookies.po +trans.zh_CN = library/http.cookies.po +source_file = trans/en/library--http_cookies.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--http_cookies + +[o:python-doc:p:python-314:r:library--http_server] +file_filter = trans//library--http_server.po +trans.zh_CN = library/http.server.po +source_file = trans/en/library--http_server.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--http_server + +[o:python-doc:p:python-314:r:library--i18n] +file_filter = trans//library--i18n.po +trans.zh_CN = library/i18n.po +source_file = trans/en/library--i18n.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--i18n + +[o:python-doc:p:python-314:r:library--idle] +file_filter = trans//library--idle.po +trans.zh_CN = library/idle.po +source_file = trans/en/library--idle.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--idle + +[o:python-doc:p:python-314:r:library--imaplib] +file_filter = trans//library--imaplib.po +trans.zh_CN = library/imaplib.po +source_file = trans/en/library--imaplib.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--imaplib + +[o:python-doc:p:python-314:r:library--imghdr] +file_filter = trans//library--imghdr.po +trans.zh_CN = library/imghdr.po +source_file = trans/en/library--imghdr.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--imghdr + +[o:python-doc:p:python-314:r:library--imp] +file_filter = trans//library--imp.po +trans.zh_CN = library/imp.po +source_file = trans/en/library--imp.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--imp + +[o:python-doc:p:python-314:r:library--importlib] +file_filter = trans//library--importlib.po +trans.zh_CN = library/importlib.po +source_file = trans/en/library--importlib.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--importlib + +[o:python-doc:p:python-314:r:library--importlib_metadata] +file_filter = trans//library--importlib_metadata.po +trans.zh_CN = library/importlib.metadata.po +source_file = trans/en/library--importlib_metadata.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--importlib_metadata + +[o:python-doc:p:python-314:r:library--importlib_resources] +file_filter = trans//library--importlib_resources.po +trans.zh_CN = library/importlib.resources.po +source_file = trans/en/library--importlib_resources.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--importlib_resources + +[o:python-doc:p:python-314:r:library--importlib_resources_abc] +file_filter = trans//library--importlib_resources_abc.po +trans.zh_CN = library/importlib.resources.abc.po +source_file = trans/en/library--importlib_resources_abc.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--importlib_resources_abc + +[o:python-doc:p:python-314:r:library--index] +file_filter = trans//library--index.po +trans.zh_CN = library/index.po +source_file = trans/en/library--index.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--index + +[o:python-doc:p:python-314:r:library--inspect] +file_filter = trans//library--inspect.po +trans.zh_CN = library/inspect.po +source_file = trans/en/library--inspect.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--inspect + +[o:python-doc:p:python-314:r:library--internet] +file_filter = trans//library--internet.po +trans.zh_CN = library/internet.po +source_file = trans/en/library--internet.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--internet + +[o:python-doc:p:python-314:r:library--intro] +file_filter = trans//library--intro.po +trans.zh_CN = library/intro.po +source_file = trans/en/library--intro.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--intro + +[o:python-doc:p:python-314:r:library--io] +file_filter = trans//library--io.po +trans.zh_CN = library/io.po +source_file = trans/en/library--io.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--io + +[o:python-doc:p:python-314:r:library--ipaddress] +file_filter = trans//library--ipaddress.po +trans.zh_CN = library/ipaddress.po +source_file = trans/en/library--ipaddress.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--ipaddress + +[o:python-doc:p:python-314:r:library--ipc] +file_filter = trans//library--ipc.po +trans.zh_CN = library/ipc.po +source_file = trans/en/library--ipc.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--ipc + +[o:python-doc:p:python-314:r:library--itertools] +file_filter = trans//library--itertools.po +trans.zh_CN = library/itertools.po +source_file = trans/en/library--itertools.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--itertools + +[o:python-doc:p:python-314:r:library--json] +file_filter = trans//library--json.po +trans.zh_CN = library/json.po +source_file = trans/en/library--json.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--json + +[o:python-doc:p:python-314:r:library--keyword] +file_filter = trans//library--keyword.po +trans.zh_CN = library/keyword.po +source_file = trans/en/library--keyword.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--keyword + +[o:python-doc:p:python-314:r:library--language] +file_filter = trans//library--language.po +trans.zh_CN = library/language.po +source_file = trans/en/library--language.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--language + +[o:python-doc:p:python-314:r:library--linecache] +file_filter = trans//library--linecache.po +trans.zh_CN = library/linecache.po +source_file = trans/en/library--linecache.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--linecache + +[o:python-doc:p:python-314:r:library--locale] +file_filter = trans//library--locale.po +trans.zh_CN = library/locale.po +source_file = trans/en/library--locale.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--locale + +[o:python-doc:p:python-314:r:library--logging] +file_filter = trans//library--logging.po +trans.zh_CN = library/logging.po +source_file = trans/en/library--logging.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--logging + +[o:python-doc:p:python-314:r:library--logging_config] +file_filter = trans//library--logging_config.po +trans.zh_CN = library/logging.config.po +source_file = trans/en/library--logging_config.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--logging_config + +[o:python-doc:p:python-314:r:library--logging_handlers] +file_filter = trans//library--logging_handlers.po +trans.zh_CN = library/logging.handlers.po +source_file = trans/en/library--logging_handlers.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--logging_handlers + +[o:python-doc:p:python-314:r:library--lzma] +file_filter = trans//library--lzma.po +trans.zh_CN = library/lzma.po +source_file = trans/en/library--lzma.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--lzma + +[o:python-doc:p:python-314:r:library--mailbox] +file_filter = trans//library--mailbox.po +trans.zh_CN = library/mailbox.po +source_file = trans/en/library--mailbox.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--mailbox + +[o:python-doc:p:python-314:r:library--mailcap] +file_filter = trans//library--mailcap.po +trans.zh_CN = library/mailcap.po +source_file = trans/en/library--mailcap.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--mailcap + +[o:python-doc:p:python-314:r:library--__main__] +file_filter = trans//library--__main__.po +trans.zh_CN = library/__main__.po +source_file = trans/en/library--__main__.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--__main__ + +[o:python-doc:p:python-314:r:library--markup] +file_filter = trans//library--markup.po +trans.zh_CN = library/markup.po +source_file = trans/en/library--markup.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--markup + +[o:python-doc:p:python-314:r:library--marshal] +file_filter = trans//library--marshal.po +trans.zh_CN = library/marshal.po +source_file = trans/en/library--marshal.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--marshal + +[o:python-doc:p:python-314:r:library--math] +file_filter = trans//library--math.po +trans.zh_CN = library/math.po +source_file = trans/en/library--math.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--math + +[o:python-doc:p:python-314:r:library--mimetypes] +file_filter = trans//library--mimetypes.po +trans.zh_CN = library/mimetypes.po +source_file = trans/en/library--mimetypes.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--mimetypes + +[o:python-doc:p:python-314:r:library--mm] +file_filter = trans//library--mm.po +trans.zh_CN = library/mm.po +source_file = trans/en/library--mm.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--mm + +[o:python-doc:p:python-314:r:library--mmap] +file_filter = trans//library--mmap.po +trans.zh_CN = library/mmap.po +source_file = trans/en/library--mmap.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--mmap + +[o:python-doc:p:python-314:r:library--modulefinder] +file_filter = trans//library--modulefinder.po +trans.zh_CN = library/modulefinder.po +source_file = trans/en/library--modulefinder.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--modulefinder + +[o:python-doc:p:python-314:r:library--modules] +file_filter = trans//library--modules.po +trans.zh_CN = library/modules.po +source_file = trans/en/library--modules.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--modules + +[o:python-doc:p:python-314:r:library--msilib] +file_filter = trans//library--msilib.po +trans.zh_CN = library/msilib.po +source_file = trans/en/library--msilib.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--msilib + +[o:python-doc:p:python-314:r:library--msvcrt] +file_filter = trans//library--msvcrt.po +trans.zh_CN = library/msvcrt.po +source_file = trans/en/library--msvcrt.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--msvcrt + +[o:python-doc:p:python-314:r:library--multiprocessing] +file_filter = trans//library--multiprocessing.po +trans.zh_CN = library/multiprocessing.po +source_file = trans/en/library--multiprocessing.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--multiprocessing + +[o:python-doc:p:python-314:r:library--multiprocessing_shared_memory] +file_filter = trans//library--multiprocessing_shared_memory.po +trans.zh_CN = library/multiprocessing.shared_memory.po +source_file = trans/en/library--multiprocessing_shared_memory.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--multiprocessing_shared_memory + +[o:python-doc:p:python-314:r:library--netdata] +file_filter = trans//library--netdata.po +trans.zh_CN = library/netdata.po +source_file = trans/en/library--netdata.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--netdata + +[o:python-doc:p:python-314:r:library--netrc] +file_filter = trans//library--netrc.po +trans.zh_CN = library/netrc.po +source_file = trans/en/library--netrc.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--netrc + +[o:python-doc:p:python-314:r:library--nis] +file_filter = trans//library--nis.po +trans.zh_CN = library/nis.po +source_file = trans/en/library--nis.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--nis + +[o:python-doc:p:python-314:r:library--nntplib] +file_filter = trans//library--nntplib.po +trans.zh_CN = library/nntplib.po +source_file = trans/en/library--nntplib.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--nntplib + +[o:python-doc:p:python-314:r:library--numbers] +file_filter = trans//library--numbers.po +trans.zh_CN = library/numbers.po +source_file = trans/en/library--numbers.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--numbers + +[o:python-doc:p:python-314:r:library--numeric] +file_filter = trans//library--numeric.po +trans.zh_CN = library/numeric.po +source_file = trans/en/library--numeric.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--numeric + +[o:python-doc:p:python-314:r:library--operator] +file_filter = trans//library--operator.po +trans.zh_CN = library/operator.po +source_file = trans/en/library--operator.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--operator + +[o:python-doc:p:python-314:r:library--optparse] +file_filter = trans//library--optparse.po +trans.zh_CN = library/optparse.po +source_file = trans/en/library--optparse.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--optparse + +[o:python-doc:p:python-314:r:library--os] +file_filter = trans//library--os.po +trans.zh_CN = library/os.po +source_file = trans/en/library--os.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--os + +[o:python-doc:p:python-314:r:library--os_path] +file_filter = trans//library--os_path.po +trans.zh_CN = library/os.path.po +source_file = trans/en/library--os_path.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--os_path + +[o:python-doc:p:python-314:r:library--ossaudiodev] +file_filter = trans//library--ossaudiodev.po +trans.zh_CN = library/ossaudiodev.po +source_file = trans/en/library--ossaudiodev.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--ossaudiodev + +[o:python-doc:p:python-314:r:library--pathlib] +file_filter = trans//library--pathlib.po +trans.zh_CN = library/pathlib.po +source_file = trans/en/library--pathlib.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--pathlib + +[o:python-doc:p:python-314:r:library--pdb] +file_filter = trans//library--pdb.po +trans.zh_CN = library/pdb.po +source_file = trans/en/library--pdb.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--pdb + +[o:python-doc:p:python-314:r:library--persistence] +file_filter = trans//library--persistence.po +trans.zh_CN = library/persistence.po +source_file = trans/en/library--persistence.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--persistence + +[o:python-doc:p:python-314:r:library--pickle] +file_filter = trans//library--pickle.po +trans.zh_CN = library/pickle.po +source_file = trans/en/library--pickle.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--pickle + +[o:python-doc:p:python-314:r:library--pickletools] +file_filter = trans//library--pickletools.po +trans.zh_CN = library/pickletools.po +source_file = trans/en/library--pickletools.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--pickletools + +[o:python-doc:p:python-314:r:library--pipes] +file_filter = trans//library--pipes.po +trans.zh_CN = library/pipes.po +source_file = trans/en/library--pipes.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--pipes + +[o:python-doc:p:python-314:r:library--pkgutil] +file_filter = trans//library--pkgutil.po +trans.zh_CN = library/pkgutil.po +source_file = trans/en/library--pkgutil.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--pkgutil + +[o:python-doc:p:python-314:r:library--platform] +file_filter = trans//library--platform.po +trans.zh_CN = library/platform.po +source_file = trans/en/library--platform.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--platform + +[o:python-doc:p:python-314:r:library--plistlib] +file_filter = trans//library--plistlib.po +trans.zh_CN = library/plistlib.po +source_file = trans/en/library--plistlib.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--plistlib + +[o:python-doc:p:python-314:r:library--poplib] +file_filter = trans//library--poplib.po +trans.zh_CN = library/poplib.po +source_file = trans/en/library--poplib.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--poplib + +[o:python-doc:p:python-314:r:library--posix] +file_filter = trans//library--posix.po +trans.zh_CN = library/posix.po +source_file = trans/en/library--posix.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--posix + +[o:python-doc:p:python-314:r:library--pprint] +file_filter = trans//library--pprint.po +trans.zh_CN = library/pprint.po +source_file = trans/en/library--pprint.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--pprint + +[o:python-doc:p:python-314:r:library--profile] +file_filter = trans//library--profile.po +trans.zh_CN = library/profile.po +source_file = trans/en/library--profile.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--profile + +[o:python-doc:p:python-314:r:library--pty] +file_filter = trans//library--pty.po +trans.zh_CN = library/pty.po +source_file = trans/en/library--pty.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--pty + +[o:python-doc:p:python-314:r:library--pwd] +file_filter = trans//library--pwd.po +trans.zh_CN = library/pwd.po +source_file = trans/en/library--pwd.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--pwd + +[o:python-doc:p:python-314:r:library--pyclbr] +file_filter = trans//library--pyclbr.po +trans.zh_CN = library/pyclbr.po +source_file = trans/en/library--pyclbr.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--pyclbr + +[o:python-doc:p:python-314:r:library--py_compile] +file_filter = trans//library--py_compile.po +trans.zh_CN = library/py_compile.po +source_file = trans/en/library--py_compile.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--py_compile + +[o:python-doc:p:python-314:r:library--pydoc] +file_filter = trans//library--pydoc.po +trans.zh_CN = library/pydoc.po +source_file = trans/en/library--pydoc.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--pydoc + +[o:python-doc:p:python-314:r:library--pyexpat] +file_filter = trans//library--pyexpat.po +trans.zh_CN = library/pyexpat.po +source_file = trans/en/library--pyexpat.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--pyexpat + +[o:python-doc:p:python-314:r:library--python] +file_filter = trans//library--python.po +trans.zh_CN = library/python.po +source_file = trans/en/library--python.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--python + +[o:python-doc:p:python-314:r:library--queue] +file_filter = trans//library--queue.po +trans.zh_CN = library/queue.po +source_file = trans/en/library--queue.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--queue + +[o:python-doc:p:python-314:r:library--quopri] +file_filter = trans//library--quopri.po +trans.zh_CN = library/quopri.po +source_file = trans/en/library--quopri.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--quopri + +[o:python-doc:p:python-314:r:library--random] +file_filter = trans//library--random.po +trans.zh_CN = library/random.po +source_file = trans/en/library--random.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--random + +[o:python-doc:p:python-314:r:library--re] +file_filter = trans//library--re.po +trans.zh_CN = library/re.po +source_file = trans/en/library--re.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--re + +[o:python-doc:p:python-314:r:library--readline] +file_filter = trans//library--readline.po +trans.zh_CN = library/readline.po +source_file = trans/en/library--readline.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--readline + +[o:python-doc:p:python-314:r:library--removed] +file_filter = trans//library--removed.po +trans.zh_CN = library/removed.po +source_file = trans/en/library--removed.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--removed + +[o:python-doc:p:python-314:r:library--reprlib] +file_filter = trans//library--reprlib.po +trans.zh_CN = library/reprlib.po +source_file = trans/en/library--reprlib.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--reprlib + +[o:python-doc:p:python-314:r:library--resource] +file_filter = trans//library--resource.po +trans.zh_CN = library/resource.po +source_file = trans/en/library--resource.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--resource + +[o:python-doc:p:python-314:r:library--rlcompleter] +file_filter = trans//library--rlcompleter.po +trans.zh_CN = library/rlcompleter.po +source_file = trans/en/library--rlcompleter.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--rlcompleter + +[o:python-doc:p:python-314:r:library--runpy] +file_filter = trans//library--runpy.po +trans.zh_CN = library/runpy.po +source_file = trans/en/library--runpy.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--runpy + +[o:python-doc:p:python-314:r:library--sched] +file_filter = trans//library--sched.po +trans.zh_CN = library/sched.po +source_file = trans/en/library--sched.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--sched + +[o:python-doc:p:python-314:r:library--secrets] +file_filter = trans//library--secrets.po +trans.zh_CN = library/secrets.po +source_file = trans/en/library--secrets.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--secrets + +[o:python-doc:p:python-314:r:library--security_warnings] +file_filter = trans//library--security_warnings.po +trans.zh_CN = library/security_warnings.po +source_file = trans/en/library--security_warnings.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--security_warnings + +[o:python-doc:p:python-314:r:library--select] +file_filter = trans//library--select.po +trans.zh_CN = library/select.po +source_file = trans/en/library--select.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--select + +[o:python-doc:p:python-314:r:library--selectors] +file_filter = trans//library--selectors.po +trans.zh_CN = library/selectors.po +source_file = trans/en/library--selectors.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--selectors + +[o:python-doc:p:python-314:r:library--shelve] +file_filter = trans//library--shelve.po +trans.zh_CN = library/shelve.po +source_file = trans/en/library--shelve.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--shelve + +[o:python-doc:p:python-314:r:library--shlex] +file_filter = trans//library--shlex.po +trans.zh_CN = library/shlex.po +source_file = trans/en/library--shlex.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--shlex + +[o:python-doc:p:python-314:r:library--shutil] +file_filter = trans//library--shutil.po +trans.zh_CN = library/shutil.po +source_file = trans/en/library--shutil.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--shutil + +[o:python-doc:p:python-314:r:library--signal] +file_filter = trans//library--signal.po +trans.zh_CN = library/signal.po +source_file = trans/en/library--signal.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--signal + +[o:python-doc:p:python-314:r:library--site] +file_filter = trans//library--site.po +trans.zh_CN = library/site.po +source_file = trans/en/library--site.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--site + +[o:python-doc:p:python-314:r:library--smtpd] +file_filter = trans//library--smtpd.po +trans.zh_CN = library/smtpd.po +source_file = trans/en/library--smtpd.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--smtpd + +[o:python-doc:p:python-314:r:library--smtplib] +file_filter = trans//library--smtplib.po +trans.zh_CN = library/smtplib.po +source_file = trans/en/library--smtplib.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--smtplib + +[o:python-doc:p:python-314:r:library--sndhdr] +file_filter = trans//library--sndhdr.po +trans.zh_CN = library/sndhdr.po +source_file = trans/en/library--sndhdr.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--sndhdr + +[o:python-doc:p:python-314:r:library--socket] +file_filter = trans//library--socket.po +trans.zh_CN = library/socket.po +source_file = trans/en/library--socket.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--socket + +[o:python-doc:p:python-314:r:library--socketserver] +file_filter = trans//library--socketserver.po +trans.zh_CN = library/socketserver.po +source_file = trans/en/library--socketserver.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--socketserver + +[o:python-doc:p:python-314:r:library--spwd] +file_filter = trans//library--spwd.po +trans.zh_CN = library/spwd.po +source_file = trans/en/library--spwd.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--spwd + +[o:python-doc:p:python-314:r:library--sqlite3] +file_filter = trans//library--sqlite3.po +trans.zh_CN = library/sqlite3.po +source_file = trans/en/library--sqlite3.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--sqlite3 + +[o:python-doc:p:python-314:r:library--ssl] +file_filter = trans//library--ssl.po +trans.zh_CN = library/ssl.po +source_file = trans/en/library--ssl.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--ssl + +[o:python-doc:p:python-314:r:library--stat] +file_filter = trans//library--stat.po +trans.zh_CN = library/stat.po +source_file = trans/en/library--stat.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--stat + +[o:python-doc:p:python-314:r:library--statistics] +file_filter = trans//library--statistics.po +trans.zh_CN = library/statistics.po +source_file = trans/en/library--statistics.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--statistics + +[o:python-doc:p:python-314:r:library--stdtypes] +file_filter = trans//library--stdtypes.po +trans.zh_CN = library/stdtypes.po +source_file = trans/en/library--stdtypes.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--stdtypes + +[o:python-doc:p:python-314:r:library--string] +file_filter = trans//library--string.po +trans.zh_CN = library/string.po +source_file = trans/en/library--string.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--string + +[o:python-doc:p:python-314:r:library--stringprep] +file_filter = trans//library--stringprep.po +trans.zh_CN = library/stringprep.po +source_file = trans/en/library--stringprep.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--stringprep + +[o:python-doc:p:python-314:r:library--string_templatelib] +file_filter = trans//library--string_templatelib.po +trans.zh_CN = library/string.templatelib.po +source_file = trans/en/library--string_templatelib.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--string_templatelib + +[o:python-doc:p:python-314:r:library--struct] +file_filter = trans//library--struct.po +trans.zh_CN = library/struct.po +source_file = trans/en/library--struct.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--struct + +[o:python-doc:p:python-314:r:library--subprocess] +file_filter = trans//library--subprocess.po +trans.zh_CN = library/subprocess.po +source_file = trans/en/library--subprocess.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--subprocess + +[o:python-doc:p:python-314:r:library--sunau] +file_filter = trans//library--sunau.po +trans.zh_CN = library/sunau.po +source_file = trans/en/library--sunau.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--sunau + +[o:python-doc:p:python-314:r:library--superseded] +file_filter = trans//library--superseded.po +trans.zh_CN = library/superseded.po +source_file = trans/en/library--superseded.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--superseded + +[o:python-doc:p:python-314:r:library--symtable] +file_filter = trans//library--symtable.po +trans.zh_CN = library/symtable.po +source_file = trans/en/library--symtable.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--symtable + +[o:python-doc:p:python-314:r:library--sys] +file_filter = trans//library--sys.po +trans.zh_CN = library/sys.po +source_file = trans/en/library--sys.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--sys + +[o:python-doc:p:python-314:r:library--sysconfig] +file_filter = trans//library--sysconfig.po +trans.zh_CN = library/sysconfig.po +source_file = trans/en/library--sysconfig.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--sysconfig + +[o:python-doc:p:python-314:r:library--syslog] +file_filter = trans//library--syslog.po +trans.zh_CN = library/syslog.po +source_file = trans/en/library--syslog.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--syslog + +[o:python-doc:p:python-314:r:library--sys_monitoring] +file_filter = trans//library--sys_monitoring.po +trans.zh_CN = library/sys.monitoring.po +source_file = trans/en/library--sys_monitoring.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--sys_monitoring + +[o:python-doc:p:python-314:r:library--sys_path_init] +file_filter = trans//library--sys_path_init.po +trans.zh_CN = library/sys_path_init.po +source_file = trans/en/library--sys_path_init.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--sys_path_init + +[o:python-doc:p:python-314:r:library--tabnanny] +file_filter = trans//library--tabnanny.po +trans.zh_CN = library/tabnanny.po +source_file = trans/en/library--tabnanny.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--tabnanny + +[o:python-doc:p:python-314:r:library--tarfile] +file_filter = trans//library--tarfile.po +trans.zh_CN = library/tarfile.po +source_file = trans/en/library--tarfile.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--tarfile + +[o:python-doc:p:python-314:r:library--telnetlib] +file_filter = trans//library--telnetlib.po +trans.zh_CN = library/telnetlib.po +source_file = trans/en/library--telnetlib.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--telnetlib + +[o:python-doc:p:python-314:r:library--tempfile] +file_filter = trans//library--tempfile.po +trans.zh_CN = library/tempfile.po +source_file = trans/en/library--tempfile.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--tempfile + +[o:python-doc:p:python-314:r:library--termios] +file_filter = trans//library--termios.po +trans.zh_CN = library/termios.po +source_file = trans/en/library--termios.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--termios + +[o:python-doc:p:python-314:r:library--test] +file_filter = trans//library--test.po +trans.zh_CN = library/test.po +source_file = trans/en/library--test.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--test + +[o:python-doc:p:python-314:r:library--text] +file_filter = trans//library--text.po +trans.zh_CN = library/text.po +source_file = trans/en/library--text.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--text + +[o:python-doc:p:python-314:r:library--textwrap] +file_filter = trans//library--textwrap.po +trans.zh_CN = library/textwrap.po +source_file = trans/en/library--textwrap.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--textwrap + +[o:python-doc:p:python-314:r:library--_thread] +file_filter = trans//library--_thread.po +trans.zh_CN = library/_thread.po +source_file = trans/en/library--_thread.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--_thread + +[o:python-doc:p:python-314:r:library--threading] +file_filter = trans//library--threading.po +trans.zh_CN = library/threading.po +source_file = trans/en/library--threading.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--threading + +[o:python-doc:p:python-314:r:library--threadsafety] +file_filter = trans//library--threadsafety.po +trans.zh_CN = library/threadsafety.po +source_file = trans/en/library--threadsafety.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--threadsafety + +[o:python-doc:p:python-314:r:library--time] +file_filter = trans//library--time.po +trans.zh_CN = library/time.po +source_file = trans/en/library--time.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--time + +[o:python-doc:p:python-314:r:library--timeit] +file_filter = trans//library--timeit.po +trans.zh_CN = library/timeit.po +source_file = trans/en/library--timeit.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--timeit + +[o:python-doc:p:python-314:r:library--tk] +file_filter = trans//library--tk.po +trans.zh_CN = library/tk.po +source_file = trans/en/library--tk.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--tk + +[o:python-doc:p:python-314:r:library--tkinter] +file_filter = trans//library--tkinter.po +trans.zh_CN = library/tkinter.po +source_file = trans/en/library--tkinter.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--tkinter + +[o:python-doc:p:python-314:r:library--tkinter_colorchooser] +file_filter = trans//library--tkinter_colorchooser.po +trans.zh_CN = library/tkinter.colorchooser.po +source_file = trans/en/library--tkinter_colorchooser.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--tkinter_colorchooser + +[o:python-doc:p:python-314:r:library--tkinter_dnd] +file_filter = trans//library--tkinter_dnd.po +trans.zh_CN = library/tkinter.dnd.po +source_file = trans/en/library--tkinter_dnd.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--tkinter_dnd + +[o:python-doc:p:python-314:r:library--tkinter_font] +file_filter = trans//library--tkinter_font.po +trans.zh_CN = library/tkinter.font.po +source_file = trans/en/library--tkinter_font.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--tkinter_font + +[o:python-doc:p:python-314:r:library--tkinter_messagebox] +file_filter = trans//library--tkinter_messagebox.po +trans.zh_CN = library/tkinter.messagebox.po +source_file = trans/en/library--tkinter_messagebox.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--tkinter_messagebox + +[o:python-doc:p:python-314:r:library--tkinter_scrolledtext] +file_filter = trans//library--tkinter_scrolledtext.po +trans.zh_CN = library/tkinter.scrolledtext.po +source_file = trans/en/library--tkinter_scrolledtext.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--tkinter_scrolledtext + +[o:python-doc:p:python-314:r:library--tkinter_ttk] +file_filter = trans//library--tkinter_ttk.po +trans.zh_CN = library/tkinter.ttk.po +source_file = trans/en/library--tkinter_ttk.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--tkinter_ttk + +[o:python-doc:p:python-314:r:library--token] +file_filter = trans//library--token.po +trans.zh_CN = library/token.po +source_file = trans/en/library--token.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--token + +[o:python-doc:p:python-314:r:library--tokenize] +file_filter = trans//library--tokenize.po +trans.zh_CN = library/tokenize.po +source_file = trans/en/library--tokenize.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--tokenize + +[o:python-doc:p:python-314:r:library--tomllib] +file_filter = trans//library--tomllib.po +trans.zh_CN = library/tomllib.po +source_file = trans/en/library--tomllib.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--tomllib + +[o:python-doc:p:python-314:r:library--trace] +file_filter = trans//library--trace.po +trans.zh_CN = library/trace.po +source_file = trans/en/library--trace.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--trace + +[o:python-doc:p:python-314:r:library--traceback] +file_filter = trans//library--traceback.po +trans.zh_CN = library/traceback.po +source_file = trans/en/library--traceback.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--traceback + +[o:python-doc:p:python-314:r:library--tracemalloc] +file_filter = trans//library--tracemalloc.po +trans.zh_CN = library/tracemalloc.po +source_file = trans/en/library--tracemalloc.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--tracemalloc + +[o:python-doc:p:python-314:r:library--tty] +file_filter = trans//library--tty.po +trans.zh_CN = library/tty.po +source_file = trans/en/library--tty.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--tty + +[o:python-doc:p:python-314:r:library--turtle] +file_filter = trans//library--turtle.po +trans.zh_CN = library/turtle.po +source_file = trans/en/library--turtle.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--turtle + +[o:python-doc:p:python-314:r:library--types] +file_filter = trans//library--types.po +trans.zh_CN = library/types.po +source_file = trans/en/library--types.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--types + +[o:python-doc:p:python-314:r:library--typing] +file_filter = trans//library--typing.po +trans.zh_CN = library/typing.po +source_file = trans/en/library--typing.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--typing + +[o:python-doc:p:python-314:r:library--unicodedata] +file_filter = trans//library--unicodedata.po +trans.zh_CN = library/unicodedata.po +source_file = trans/en/library--unicodedata.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--unicodedata + +[o:python-doc:p:python-314:r:library--unittest] +file_filter = trans//library--unittest.po +trans.zh_CN = library/unittest.po +source_file = trans/en/library--unittest.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--unittest + +[o:python-doc:p:python-314:r:library--unittest_mock] +file_filter = trans//library--unittest_mock.po +trans.zh_CN = library/unittest.mock.po +source_file = trans/en/library--unittest_mock.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--unittest_mock + +[o:python-doc:p:python-314:r:library--unittest_mock-examples] +file_filter = trans//library--unittest_mock-examples.po +trans.zh_CN = library/unittest.mock-examples.po +source_file = trans/en/library--unittest_mock-examples.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--unittest_mock-examples + +[o:python-doc:p:python-314:r:library--unix] +file_filter = trans//library--unix.po +trans.zh_CN = library/unix.po +source_file = trans/en/library--unix.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--unix + +[o:python-doc:p:python-314:r:library--urllib] +file_filter = trans//library--urllib.po +trans.zh_CN = library/urllib.po +source_file = trans/en/library--urllib.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--urllib + +[o:python-doc:p:python-314:r:library--urllib_error] +file_filter = trans//library--urllib_error.po +trans.zh_CN = library/urllib.error.po +source_file = trans/en/library--urllib_error.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--urllib_error + +[o:python-doc:p:python-314:r:library--urllib_parse] +file_filter = trans//library--urllib_parse.po +trans.zh_CN = library/urllib.parse.po +source_file = trans/en/library--urllib_parse.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--urllib_parse + +[o:python-doc:p:python-314:r:library--urllib_request] +file_filter = trans//library--urllib_request.po +trans.zh_CN = library/urllib.request.po +source_file = trans/en/library--urllib_request.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--urllib_request + +[o:python-doc:p:python-314:r:library--urllib_robotparser] +file_filter = trans//library--urllib_robotparser.po +trans.zh_CN = library/urllib.robotparser.po +source_file = trans/en/library--urllib_robotparser.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--urllib_robotparser + +[o:python-doc:p:python-314:r:library--uu] +file_filter = trans//library--uu.po +trans.zh_CN = library/uu.po +source_file = trans/en/library--uu.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--uu + +[o:python-doc:p:python-314:r:library--uuid] +file_filter = trans//library--uuid.po +trans.zh_CN = library/uuid.po +source_file = trans/en/library--uuid.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--uuid + +[o:python-doc:p:python-314:r:library--venv] +file_filter = trans//library--venv.po +trans.zh_CN = library/venv.po +source_file = trans/en/library--venv.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--venv + +[o:python-doc:p:python-314:r:library--warnings] +file_filter = trans//library--warnings.po +trans.zh_CN = library/warnings.po +source_file = trans/en/library--warnings.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--warnings + +[o:python-doc:p:python-314:r:library--wave] +file_filter = trans//library--wave.po +trans.zh_CN = library/wave.po +source_file = trans/en/library--wave.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--wave + +[o:python-doc:p:python-314:r:library--weakref] +file_filter = trans//library--weakref.po +trans.zh_CN = library/weakref.po +source_file = trans/en/library--weakref.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--weakref + +[o:python-doc:p:python-314:r:library--webbrowser] +file_filter = trans//library--webbrowser.po +trans.zh_CN = library/webbrowser.po +source_file = trans/en/library--webbrowser.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--webbrowser + +[o:python-doc:p:python-314:r:library--windows] +file_filter = trans//library--windows.po +trans.zh_CN = library/windows.po +source_file = trans/en/library--windows.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--windows + +[o:python-doc:p:python-314:r:library--winreg] +file_filter = trans//library--winreg.po +trans.zh_CN = library/winreg.po +source_file = trans/en/library--winreg.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--winreg + +[o:python-doc:p:python-314:r:library--winsound] +file_filter = trans//library--winsound.po +trans.zh_CN = library/winsound.po +source_file = trans/en/library--winsound.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--winsound + +[o:python-doc:p:python-314:r:library--wsgiref] +file_filter = trans//library--wsgiref.po +trans.zh_CN = library/wsgiref.po +source_file = trans/en/library--wsgiref.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--wsgiref + +[o:python-doc:p:python-314:r:library--xdrlib] +file_filter = trans//library--xdrlib.po +trans.zh_CN = library/xdrlib.po +source_file = trans/en/library--xdrlib.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--xdrlib + +[o:python-doc:p:python-314:r:library--xml] +file_filter = trans//library--xml.po +trans.zh_CN = library/xml.po +source_file = trans/en/library--xml.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--xml + +[o:python-doc:p:python-314:r:library--xml_dom] +file_filter = trans//library--xml_dom.po +trans.zh_CN = library/xml.dom.po +source_file = trans/en/library--xml_dom.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--xml_dom + +[o:python-doc:p:python-314:r:library--xml_dom_minidom] +file_filter = trans//library--xml_dom_minidom.po +trans.zh_CN = library/xml.dom.minidom.po +source_file = trans/en/library--xml_dom_minidom.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--xml_dom_minidom + +[o:python-doc:p:python-314:r:library--xml_dom_pulldom] +file_filter = trans//library--xml_dom_pulldom.po +trans.zh_CN = library/xml.dom.pulldom.po +source_file = trans/en/library--xml_dom_pulldom.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--xml_dom_pulldom + +[o:python-doc:p:python-314:r:library--xml_etree_elementtree] +file_filter = trans//library--xml_etree_elementtree.po +trans.zh_CN = library/xml.etree.elementtree.po +source_file = trans/en/library--xml_etree_elementtree.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--xml_etree_elementtree + +[o:python-doc:p:python-314:r:library--xmlrpc] +file_filter = trans//library--xmlrpc.po +trans.zh_CN = library/xmlrpc.po +source_file = trans/en/library--xmlrpc.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--xmlrpc + +[o:python-doc:p:python-314:r:library--xmlrpc_client] +file_filter = trans//library--xmlrpc_client.po +trans.zh_CN = library/xmlrpc.client.po +source_file = trans/en/library--xmlrpc_client.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--xmlrpc_client + +[o:python-doc:p:python-314:r:library--xmlrpc_server] +file_filter = trans//library--xmlrpc_server.po +trans.zh_CN = library/xmlrpc.server.po +source_file = trans/en/library--xmlrpc_server.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--xmlrpc_server + +[o:python-doc:p:python-314:r:library--xml_sax] +file_filter = trans//library--xml_sax.po +trans.zh_CN = library/xml.sax.po +source_file = trans/en/library--xml_sax.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--xml_sax + +[o:python-doc:p:python-314:r:library--xml_sax_handler] +file_filter = trans//library--xml_sax_handler.po +trans.zh_CN = library/xml.sax.handler.po +source_file = trans/en/library--xml_sax_handler.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--xml_sax_handler + +[o:python-doc:p:python-314:r:library--xml_sax_reader] +file_filter = trans//library--xml_sax_reader.po +trans.zh_CN = library/xml.sax.reader.po +source_file = trans/en/library--xml_sax_reader.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--xml_sax_reader + +[o:python-doc:p:python-314:r:library--xml_sax_utils] +file_filter = trans//library--xml_sax_utils.po +trans.zh_CN = library/xml.sax.utils.po +source_file = trans/en/library--xml_sax_utils.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--xml_sax_utils + +[o:python-doc:p:python-314:r:library--zipapp] +file_filter = trans//library--zipapp.po +trans.zh_CN = library/zipapp.po +source_file = trans/en/library--zipapp.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--zipapp + +[o:python-doc:p:python-314:r:library--zipfile] +file_filter = trans//library--zipfile.po +trans.zh_CN = library/zipfile.po +source_file = trans/en/library--zipfile.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--zipfile + +[o:python-doc:p:python-314:r:library--zipimport] +file_filter = trans//library--zipimport.po +trans.zh_CN = library/zipimport.po +source_file = trans/en/library--zipimport.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--zipimport + +[o:python-doc:p:python-314:r:library--zlib] +file_filter = trans//library--zlib.po +trans.zh_CN = library/zlib.po +source_file = trans/en/library--zlib.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--zlib + +[o:python-doc:p:python-314:r:library--zoneinfo] +file_filter = trans//library--zoneinfo.po +trans.zh_CN = library/zoneinfo.po +source_file = trans/en/library--zoneinfo.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = library--zoneinfo + +[o:python-doc:p:python-314:r:license] +file_filter = trans//license.po +trans.zh_CN = license.po +source_file = trans/en/license.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = license + +[o:python-doc:p:python-314:r:reference--compound_stmts] +file_filter = trans//reference--compound_stmts.po +trans.zh_CN = reference/compound_stmts.po +source_file = trans/en/reference--compound_stmts.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = reference--compound_stmts + +[o:python-doc:p:python-314:r:reference--datamodel] +file_filter = trans//reference--datamodel.po +trans.zh_CN = reference/datamodel.po +source_file = trans/en/reference--datamodel.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = reference--datamodel + +[o:python-doc:p:python-314:r:reference--executionmodel] +file_filter = trans//reference--executionmodel.po +trans.zh_CN = reference/executionmodel.po +source_file = trans/en/reference--executionmodel.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = reference--executionmodel + +[o:python-doc:p:python-314:r:reference--expressions] +file_filter = trans//reference--expressions.po +trans.zh_CN = reference/expressions.po +source_file = trans/en/reference--expressions.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = reference--expressions + +[o:python-doc:p:python-314:r:reference--grammar] +file_filter = trans//reference--grammar.po +trans.zh_CN = reference/grammar.po +source_file = trans/en/reference--grammar.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = reference--grammar + +[o:python-doc:p:python-314:r:reference--import] +file_filter = trans//reference--import.po +trans.zh_CN = reference/import.po +source_file = trans/en/reference--import.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = reference--import + +[o:python-doc:p:python-314:r:reference--index] +file_filter = trans//reference--index.po +trans.zh_CN = reference/index.po +source_file = trans/en/reference--index.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = reference--index + +[o:python-doc:p:python-314:r:reference--introduction] +file_filter = trans//reference--introduction.po +trans.zh_CN = reference/introduction.po +source_file = trans/en/reference--introduction.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = reference--introduction + +[o:python-doc:p:python-314:r:reference--lexical_analysis] +file_filter = trans//reference--lexical_analysis.po +trans.zh_CN = reference/lexical_analysis.po +source_file = trans/en/reference--lexical_analysis.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = reference--lexical_analysis + +[o:python-doc:p:python-314:r:reference--simple_stmts] +file_filter = trans//reference--simple_stmts.po +trans.zh_CN = reference/simple_stmts.po +source_file = trans/en/reference--simple_stmts.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = reference--simple_stmts + +[o:python-doc:p:python-314:r:reference--toplevel_components] +file_filter = trans//reference--toplevel_components.po +trans.zh_CN = reference/toplevel_components.po +source_file = trans/en/reference--toplevel_components.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = reference--toplevel_components + +[o:python-doc:p:python-314:r:sphinx] +file_filter = trans//sphinx.po +trans.zh_CN = sphinx.po +source_file = trans/en/sphinx.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = sphinx + +[o:python-doc:p:python-314:r:tutorial--appendix] +file_filter = trans//tutorial--appendix.po +trans.zh_CN = tutorial/appendix.po +source_file = trans/en/tutorial--appendix.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = tutorial--appendix + +[o:python-doc:p:python-314:r:tutorial--appetite] +file_filter = trans//tutorial--appetite.po +trans.zh_CN = tutorial/appetite.po +source_file = trans/en/tutorial--appetite.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = tutorial--appetite + +[o:python-doc:p:python-314:r:tutorial--classes] +file_filter = trans//tutorial--classes.po +trans.zh_CN = tutorial/classes.po +source_file = trans/en/tutorial--classes.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = tutorial--classes + +[o:python-doc:p:python-314:r:tutorial--controlflow] +file_filter = trans//tutorial--controlflow.po +trans.zh_CN = tutorial/controlflow.po +source_file = trans/en/tutorial--controlflow.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = tutorial--controlflow + +[o:python-doc:p:python-314:r:tutorial--datastructures] +file_filter = trans//tutorial--datastructures.po +trans.zh_CN = tutorial/datastructures.po +source_file = trans/en/tutorial--datastructures.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = tutorial--datastructures + +[o:python-doc:p:python-314:r:tutorial--errors] +file_filter = trans//tutorial--errors.po +trans.zh_CN = tutorial/errors.po +source_file = trans/en/tutorial--errors.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = tutorial--errors + +[o:python-doc:p:python-314:r:tutorial--floatingpoint] +file_filter = trans//tutorial--floatingpoint.po +trans.zh_CN = tutorial/floatingpoint.po +source_file = trans/en/tutorial--floatingpoint.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = tutorial--floatingpoint + +[o:python-doc:p:python-314:r:tutorial--index] +file_filter = trans//tutorial--index.po +trans.zh_CN = tutorial/index.po +source_file = trans/en/tutorial--index.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = tutorial--index + +[o:python-doc:p:python-314:r:tutorial--inputoutput] +file_filter = trans//tutorial--inputoutput.po +trans.zh_CN = tutorial/inputoutput.po +source_file = trans/en/tutorial--inputoutput.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = tutorial--inputoutput + +[o:python-doc:p:python-314:r:tutorial--interactive] +file_filter = trans//tutorial--interactive.po +trans.zh_CN = tutorial/interactive.po +source_file = trans/en/tutorial--interactive.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = tutorial--interactive + +[o:python-doc:p:python-314:r:tutorial--interpreter] +file_filter = trans//tutorial--interpreter.po +trans.zh_CN = tutorial/interpreter.po +source_file = trans/en/tutorial--interpreter.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = tutorial--interpreter + +[o:python-doc:p:python-314:r:tutorial--introduction] +file_filter = trans//tutorial--introduction.po +trans.zh_CN = tutorial/introduction.po +source_file = trans/en/tutorial--introduction.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = tutorial--introduction + +[o:python-doc:p:python-314:r:tutorial--modules] +file_filter = trans//tutorial--modules.po +trans.zh_CN = tutorial/modules.po +source_file = trans/en/tutorial--modules.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = tutorial--modules + +[o:python-doc:p:python-314:r:tutorial--stdlib] +file_filter = trans//tutorial--stdlib.po +trans.zh_CN = tutorial/stdlib.po +source_file = trans/en/tutorial--stdlib.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = tutorial--stdlib + +[o:python-doc:p:python-314:r:tutorial--stdlib2] +file_filter = trans//tutorial--stdlib2.po +trans.zh_CN = tutorial/stdlib2.po +source_file = trans/en/tutorial--stdlib2.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = tutorial--stdlib2 + +[o:python-doc:p:python-314:r:tutorial--venv] +file_filter = trans//tutorial--venv.po +trans.zh_CN = tutorial/venv.po +source_file = trans/en/tutorial--venv.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = tutorial--venv + +[o:python-doc:p:python-314:r:tutorial--whatnow] +file_filter = trans//tutorial--whatnow.po +trans.zh_CN = tutorial/whatnow.po +source_file = trans/en/tutorial--whatnow.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = tutorial--whatnow + +[o:python-doc:p:python-314:r:using--android] +file_filter = trans//using--android.po +trans.zh_CN = using/android.po +source_file = trans/en/using--android.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = using--android + +[o:python-doc:p:python-314:r:using--cmdline] +file_filter = trans//using--cmdline.po +trans.zh_CN = using/cmdline.po +source_file = trans/en/using--cmdline.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = using--cmdline + +[o:python-doc:p:python-314:r:using--configure] +file_filter = trans//using--configure.po +trans.zh_CN = using/configure.po +source_file = trans/en/using--configure.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = using--configure + +[o:python-doc:p:python-314:r:using--editors] +file_filter = trans//using--editors.po +trans.zh_CN = using/editors.po +source_file = trans/en/using--editors.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = using--editors + +[o:python-doc:p:python-314:r:using--index] +file_filter = trans//using--index.po +trans.zh_CN = using/index.po +source_file = trans/en/using--index.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = using--index + +[o:python-doc:p:python-314:r:using--ios] +file_filter = trans//using--ios.po +trans.zh_CN = using/ios.po +source_file = trans/en/using--ios.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = using--ios + +[o:python-doc:p:python-314:r:using--mac] +file_filter = trans//using--mac.po +trans.zh_CN = using/mac.po +source_file = trans/en/using--mac.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = using--mac + +[o:python-doc:p:python-314:r:using--unix] +file_filter = trans//using--unix.po +trans.zh_CN = using/unix.po +source_file = trans/en/using--unix.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = using--unix + +[o:python-doc:p:python-314:r:using--windows] +file_filter = trans//using--windows.po +trans.zh_CN = using/windows.po +source_file = trans/en/using--windows.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = using--windows + +[o:python-doc:p:python-314:r:whatsnew--2_0] +file_filter = trans//whatsnew--2_0.po +trans.zh_CN = whatsnew/2.0.po +source_file = trans/en/whatsnew--2_0.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = whatsnew--2_0 + +[o:python-doc:p:python-314:r:whatsnew--2_1] +file_filter = trans//whatsnew--2_1.po +trans.zh_CN = whatsnew/2.1.po +source_file = trans/en/whatsnew--2_1.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = whatsnew--2_1 + +[o:python-doc:p:python-314:r:whatsnew--2_2] +file_filter = trans//whatsnew--2_2.po +trans.zh_CN = whatsnew/2.2.po +source_file = trans/en/whatsnew--2_2.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = whatsnew--2_2 + +[o:python-doc:p:python-314:r:whatsnew--2_3] +file_filter = trans//whatsnew--2_3.po +trans.zh_CN = whatsnew/2.3.po +source_file = trans/en/whatsnew--2_3.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = whatsnew--2_3 + +[o:python-doc:p:python-314:r:whatsnew--2_4] +file_filter = trans//whatsnew--2_4.po +trans.zh_CN = whatsnew/2.4.po +source_file = trans/en/whatsnew--2_4.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = whatsnew--2_4 + +[o:python-doc:p:python-314:r:whatsnew--2_5] +file_filter = trans//whatsnew--2_5.po +trans.zh_CN = whatsnew/2.5.po +source_file = trans/en/whatsnew--2_5.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = whatsnew--2_5 + +[o:python-doc:p:python-314:r:whatsnew--2_6] +file_filter = trans//whatsnew--2_6.po +trans.zh_CN = whatsnew/2.6.po +source_file = trans/en/whatsnew--2_6.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = whatsnew--2_6 + +[o:python-doc:p:python-314:r:whatsnew--2_7] +file_filter = trans//whatsnew--2_7.po +trans.zh_CN = whatsnew/2.7.po +source_file = trans/en/whatsnew--2_7.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = whatsnew--2_7 + +[o:python-doc:p:python-314:r:whatsnew--3_0] +file_filter = trans//whatsnew--3_0.po +trans.zh_CN = whatsnew/3.0.po +source_file = trans/en/whatsnew--3_0.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = whatsnew--3_0 + +[o:python-doc:p:python-314:r:whatsnew--3_1] +file_filter = trans//whatsnew--3_1.po +trans.zh_CN = whatsnew/3.1.po +source_file = trans/en/whatsnew--3_1.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = whatsnew--3_1 + +[o:python-doc:p:python-314:r:whatsnew--3_10] +file_filter = trans//whatsnew--3_10.po +trans.zh_CN = whatsnew/3.10.po +source_file = trans/en/whatsnew--3_10.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = whatsnew--3_10 + +[o:python-doc:p:python-314:r:whatsnew--3_11] +file_filter = trans//whatsnew--3_11.po +trans.zh_CN = whatsnew/3.11.po +source_file = trans/en/whatsnew--3_11.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = whatsnew--3_11 + +[o:python-doc:p:python-314:r:whatsnew--3_12] +file_filter = trans//whatsnew--3_12.po +trans.zh_CN = whatsnew/3.12.po +source_file = trans/en/whatsnew--3_12.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = whatsnew--3_12 + +[o:python-doc:p:python-314:r:whatsnew--3_13] +file_filter = trans//whatsnew--3_13.po +trans.zh_CN = whatsnew/3.13.po +source_file = trans/en/whatsnew--3_13.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = whatsnew--3_13 + +[o:python-doc:p:python-314:r:whatsnew--3_14] +file_filter = trans//whatsnew--3_14.po +trans.zh_CN = whatsnew/3.14.po +source_file = trans/en/whatsnew--3_14.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = whatsnew--3_14 + +[o:python-doc:p:python-314:r:whatsnew--3_2] +file_filter = trans//whatsnew--3_2.po +trans.zh_CN = whatsnew/3.2.po +source_file = trans/en/whatsnew--3_2.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = whatsnew--3_2 + +[o:python-doc:p:python-314:r:whatsnew--3_3] +file_filter = trans//whatsnew--3_3.po +trans.zh_CN = whatsnew/3.3.po +source_file = trans/en/whatsnew--3_3.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = whatsnew--3_3 + +[o:python-doc:p:python-314:r:whatsnew--3_4] +file_filter = trans//whatsnew--3_4.po +trans.zh_CN = whatsnew/3.4.po +source_file = trans/en/whatsnew--3_4.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = whatsnew--3_4 + +[o:python-doc:p:python-314:r:whatsnew--3_5] +file_filter = trans//whatsnew--3_5.po +trans.zh_CN = whatsnew/3.5.po +source_file = trans/en/whatsnew--3_5.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = whatsnew--3_5 + +[o:python-doc:p:python-314:r:whatsnew--3_6] +file_filter = trans//whatsnew--3_6.po +trans.zh_CN = whatsnew/3.6.po +source_file = trans/en/whatsnew--3_6.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = whatsnew--3_6 + +[o:python-doc:p:python-314:r:whatsnew--3_7] +file_filter = trans//whatsnew--3_7.po +trans.zh_CN = whatsnew/3.7.po +source_file = trans/en/whatsnew--3_7.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = whatsnew--3_7 + +[o:python-doc:p:python-314:r:whatsnew--3_8] +file_filter = trans//whatsnew--3_8.po +trans.zh_CN = whatsnew/3.8.po +source_file = trans/en/whatsnew--3_8.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = whatsnew--3_8 + +[o:python-doc:p:python-314:r:whatsnew--3_9] +file_filter = trans//whatsnew--3_9.po +trans.zh_CN = whatsnew/3.9.po +source_file = trans/en/whatsnew--3_9.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = whatsnew--3_9 + +[o:python-doc:p:python-314:r:whatsnew--changelog] +file_filter = trans//whatsnew--changelog.po +trans.zh_CN = whatsnew/changelog.po +source_file = trans/en/whatsnew--changelog.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = whatsnew--changelog + +[o:python-doc:p:python-314:r:whatsnew--index] +file_filter = trans//whatsnew--index.po +trans.zh_CN = whatsnew/index.po +source_file = trans/en/whatsnew--index.po +source_lang = en +type = PO +minimum_perc = 0 +resource_name = whatsnew--index diff --git a/README.md b/README.md new file mode 100644 index 0000000000..aef4540237 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# zh\_CN Translation of the Python Documentation + +Check out [master](https://github.com/python/python-docs-zh-cn/tree/master) branch for more information. diff --git a/README.rst b/README.rst deleted file mode 100644 index b9ff9a9954..0000000000 --- a/README.rst +++ /dev/null @@ -1,100 +0,0 @@ -zh_CN Translation of the Python Documentation -============================================= - -All translations are done on transifex. -https://www.transifex.com/python-doc/public/ - -Maintained versions: - -.. list-table:: - :header-rows: 1 - - * - Version - - Sync status - - Translation progress - * - `3.15 `_ - - .. image:: https://github.com/python/python-docs-zh-cn/workflows/python-315/badge.svg - :target: https://github.com/python/python-docs-zh-cn/actions?workflow=python-315 - - .. image:: https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Fpython%2Fpython-docs-zh-cn%2F3.15%2F.stat.json&query=%24.translation&label=zh-CN - :target: https://app.transifex.com/python-doc/python-newest/ - * - `3.14 `_ - - .. image:: https://github.com/python/python-docs-zh-cn/workflows/python-314/badge.svg - :target: https://github.com/python/python-docs-zh-cn/actions?workflow=python-314 - - .. image:: https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Fpython%2Fpython-docs-zh-cn%2F3.14%2F.stat.json&query=%24.translation&label=zh-CN - :target: https://app.transifex.com/python-doc/python-314/ - * - `3.13 `_ - - .. image:: https://github.com/python/python-docs-zh-cn/workflows/python-313/badge.svg - :target: https://github.com/python/python-docs-zh-cn/actions?workflow=python-313 - - .. image:: https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Fpython%2Fpython-docs-zh-cn%2F3.13%2F.stat.json&query=%24.translation&label=zh-CN - :target: https://app.transifex.com/python-doc/python-313/ - * - `3.12 `_ - - .. image:: https://github.com/python/python-docs-zh-cn/workflows/python-312/badge.svg - :target: https://github.com/python/python-docs-zh-cn/actions?workflow=python-312 - - .. image:: https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Fpython%2Fpython-docs-zh-cn%2F3.12%2F.stat.json&query=%24.translation&label=zh-CN - :target: https://app.transifex.com/python-doc/python-312/ - * - `3.11 `_ - - .. image:: https://github.com/python/python-docs-zh-cn/workflows/python-311/badge.svg - :target: https://github.com/python/python-docs-zh-cn/actions?workflow=python-311 - - .. image:: https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Fpython%2Fpython-docs-zh-cn%2F3.11%2F.stat.json&query=%24.translation&label=zh-CN - :target: https://app.transifex.com/python-doc/python-311/ - * - `3.10 `_ - - .. image:: https://github.com/python/python-docs-zh-cn/workflows/python-310/badge.svg - :target: https://github.com/python/python-docs-zh-cn/actions?workflow=python-310 - - .. image:: https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Fpython%2Fpython-docs-zh-cn%2F3.10%2F.stat.json&query=%24.translation&label=zh-CN - :target: https://app.transifex.com/python-doc/python-310/ - -EOL versions: - -.. list-table:: - :header-rows: 1 - - * - Version - - Sync status - - Translation progress - * - `3.9 `_ - - .. image:: https://github.com/python/python-docs-zh-cn/workflows/python-39/badge.svg - :target: https://github.com/python/python-docs-zh-cn/actions?workflow=python-39 - - .. image:: https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Fpython%2Fpython-docs-zh-cn%2F3.9%2F.stat.json&query=%24.translation&label=zh-CN - :target: https://app.transifex.com/python-doc/python-39/ - * - `3.8 `_ - - .. image:: https://github.com/python/python-docs-zh-cn/workflows/python-38/badge.svg - :target: https://github.com/python/python-docs-zh-cn/actions?workflow=python-38 - - .. image:: https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Fpython%2Fpython-docs-zh-cn%2F3.8%2F.stat.json&query=%24.translation&label=zh-CN - :target: https://app.transifex.com/python-doc/python-38/ - * - `3.7 `_ - - .. image:: https://github.com/python/python-docs-zh-cn/workflows/python-37/badge.svg - :target: https://github.com/python/python-docs-zh-cn/actions?workflow=python-37 - - .. image:: https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Fpython%2Fpython-docs-zh-cn%2F3.7%2F.stat.json&query=%24.translation&label=zh-CN - :target: https://app.transifex.com/python-doc/python-37/ - -Documentation Contribution Agreement ------------------------------------- - -NOTE REGARDING THE LICENSE FOR TRANSLATIONS: Python's documentation is -maintained using a global network of volunteers. By posting this -project on Transifex, GitHub, and other public places, and inviting -you to participate, we are proposing an agreement that you will -provide your improvements to Python's documentation or the translation -of Python's documentation for the PSF's use under the CC0 license -(available at -https://creativecommons.org/publicdomain/zero/1.0/legalcode). In -return, you may publicly claim credit for the portion of the -translation you contributed and if your translation is accepted by the -PSF, you may (but are not required to) submit a patch including an -appropriate annotation in the Misc/ACKS or TRANSLATORS file. Although -nothing in this Documentation Contribution Agreement obligates the PSF -to incorporate your textual contribution, your participation in the -Python community is welcomed and appreciated. - -You signify acceptance of this agreement by submitting your work to -the PSF for inclusion in the documentation. - -Contributing to the Translation -------------------------------- - -Join the Chinese (China) team on transifex to get start. - -You're recommended to read -`大陆简中自由软件本地化工作指南:Free Software Localization Guide for Chinese (China)`__ first. - -__ http://mirrors.ustc.edu.cn/anthon/aosc-l10n/zh_CN_l10n.pdf diff --git a/TRANSLATORS b/TRANSLATORS deleted file mode 100644 index 8c653ac281..0000000000 --- a/TRANSLATORS +++ /dev/null @@ -1,118 +0,0 @@ -# The latest translators list is in each po file. -# Following are the names that translators set at Transifex. -# Generated by: -# grep -ohP '(?<=^# )(.+)(?=, \d+$)' -r .|sed 's| <.*>||g' | sort -u - -3vilive D -443 -ailin zhang -allenjuly7 -Aloxaf -ausaki -banxi -cdarlint -chen_chao -Chengeng Ning -ChenYuan -chordy -cissoid -CommonZ -c pan -Danny Vi -dgy18787 -dhcn -dykai -emrich -eric R -Fei Yin -focusheart -Fred -Freesand Leo -gashero liu -hanfeng -Hanxi Fu -Harry Z -Henry Zhu -isaced -isombyt -Jack Wu -Jann Li -Jarry Shaw -Jerry Chen -Josh Ouyang -jsgang -Junkai Shao -Kaizhao Zhang -Kder -keelii -kevin wong -Larry wang -Larry Wang -Madlee -Meng Du -Menghua Xiao -Ming Jia -musan cheng -MuSheng Chen -Nasy -Natasha Li -Pandaaaa906 -Pan Felix -Pikachu -QR Wang -RSNOW -ryohei -Saiyang Gou -sgqy -Shengjing Zhu -shiyu Peng -Siyuan Xu -SKY H. -SonnyZhang -Steve Ni -sunsol s -Thomas ZHANG -tom smith -Tony Tong -Trim21 -TX Lee -walkinrain -Wang Saul -wenhui -wevsty -Woko -Woostundy -Wu Pipi -wwj402 -ww song -xiao xu -Yan Gao -Yinuo Huang -Yiyi Python -YIZHU LIN -yuan chen -yuxin wang -zc Jin -Zephyr Waitzman -Zhe He -Ziqi Wang -zkonge -Zombie110year -付裕如 -兴然 刘 -刘士 -叶浚安 -启迪 吴 -吴彬 -开 方 -张俊(fighting) -志正 韩 -操旭 -林行众 -梁启凡 -欢 王 -殷平乐 -汇民 王 -演奏王 -非法操作 -马强 diff --git a/about.po b/about.po new file mode 100644 index 0000000000..3122adb859 --- /dev/null +++ b/about.po @@ -0,0 +1,91 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-09 14:43+0000\n" +"PO-Revision-Date: 2025-09-16 00:00+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../about.rst:3 +msgid "About this documentation" +msgstr "关于本文档" + +#: ../../about.rst:6 +msgid "" +"Python's documentation is generated from `reStructuredText`_ sources using " +"`Sphinx`_, a documentation generator originally created for Python and now " +"maintained as an independent project." +msgstr "" +"Python 的文档是用 `Sphinx`_ 从 `reStructuredText`_ 源生成的,Sphinx 是一个最初为 Python " +"创建、现在作为独立项目维护的文档生成器。" + +#: ../../about.rst:16 +msgid "" +"Development of the documentation and its toolchain is an entirely volunteer " +"effort, just like Python itself. If you want to contribute, please take a " +"look at the :ref:`reporting-bugs` page for information on how to do so. New" +" volunteers are always welcome!" +msgstr "" +"本文档及其工具链之开发,皆在于志愿者之努力,亦恰如 Python 本身。如果您想为此作出贡献,请阅读 :ref:`reporting-bugs` " +"了解如何参与。我们随时欢迎新的志愿者!" + +#: ../../about.rst:21 +msgid "Many thanks go to:" +msgstr "特别鸣谢:" + +#: ../../about.rst:23 +msgid "" +"Fred L. Drake, Jr., the creator of the original Python documentation toolset" +" and author of much of the content;" +msgstr "Fred L. Drake, Jr.,原始 Python 文档工具集之创造者,众多文档之作者;" + +#: ../../about.rst:25 +msgid "" +"the `Docutils `_ project for creating " +"reStructuredText and the Docutils suite;" +msgstr "" +"用于创建 reStructuredText 和 Docutils 套件的 `Docutils " +"`_ 项目;" + +#: ../../about.rst:27 +msgid "" +"Fredrik Lundh for his Alternative Python Reference project from which Sphinx" +" got many good ideas." +msgstr "Fredrik Lundh 的 Alternative Python Reference 项目,为 Sphinx 提供许多好的点子。" + +#: ../../about.rst:32 +msgid "Contributors to the Python documentation" +msgstr "Python 文档的贡献者" + +#: ../../about.rst:34 +msgid "" +"Many people have contributed to the Python language, the Python standard " +"library, and the Python documentation. See the `CPython GitHub repository " +"`__ for a partial " +"list of contributors." +msgstr "" +"有很多人为 Python 语言,Python 标准库和 Python 文档作出了贡献。 请参阅 `CPython GitHub 仓库 " +"`__ 获取部分贡献者的清单。" + +#: ../../about.rst:39 +msgid "" +"It is only with the input and contributions of the Python community that " +"Python has such wonderful documentation -- Thank You!" +msgstr "有了 Python 社区的输入和贡献,Python 才有了如此出色的文档——谢谢你们!" diff --git a/bugs.po b/bugs.po new file mode 100644 index 0000000000..af2df88285 --- /dev/null +++ b/bugs.po @@ -0,0 +1,243 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:00+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../bugs.rst:5 +msgid "Dealing with Bugs" +msgstr "处理 Bug" + +#: ../../bugs.rst:7 +msgid "" +"Python is a mature programming language which has established a reputation " +"for stability. In order to maintain this reputation, the developers would " +"like to know of any deficiencies you find in Python." +msgstr "Python 是一门成熟的编程语言,以稳定著称。为维持其美誉,开发者希望获悉所有您在 Python 中发现的缺陷。" + +#: ../../bugs.rst:11 +msgid "" +"It can be sometimes faster to fix bugs yourself and contribute patches to " +"Python as it streamlines the process and involves fewer people. Learn how to" +" :ref:`contribute `." +msgstr "" +"有时候自己修复程序缺陷并向 Python 提交补丁能更快地解决问题因为它简化了处理流程并减少了人力消耗。 了解如何 :ref:`提交补丁 " +"`。" + +#: ../../bugs.rst:16 +msgid "Documentation bugs" +msgstr "文档错误" + +#: ../../bugs.rst:18 +msgid "" +"If you find a bug in this documentation or would like to propose an " +"improvement, please submit a bug report on the :ref:`issue tracker `. If you have a suggestion on how to fix it, include that as " +"well." +msgstr "" +"如果您在本文档中发现错误或想要提出改进建议,请在 :ref:`问题追踪器 ` " +"上提交错误报告。如果您有修复建议,也请一并提供。" + +#: ../../bugs.rst:24 +msgid "" +"If the bug or suggested improvement concerns the translation of this " +"documentation, submit the report to the `translation’s repository " +"`_ instead." +msgstr "" +"如果程序缺陷或建议的改进涉及此文档的翻译,请提交报告至 `translation’s repository `_。" + +#: ../../bugs.rst:28 +msgid "" +"You can also open a discussion item on our `Documentation Discourse forum " +"`_." +msgstr "" +"你还可以在我们的 `文档论坛 `_ 上发起一个讨论。" + +#: ../../bugs.rst:31 +msgid "" +"If you find a bug in the theme (HTML / CSS / JavaScript) of the " +"documentation, please submit a bug report on the `python-doc-theme issue " +"tracker `_." +msgstr "" +"如果你在文档的主题(HTML / CSS / JavaScript)中发现错误,请在 `python-doc-theme 问题追踪器 " +"`_ 上提交错误报告。" + +#: ../../bugs.rst:37 +msgid "`Documentation bugs`_" +msgstr "`Documentation bugs`_" + +#: ../../bugs.rst:38 +msgid "" +"A list of documentation bugs that have been submitted to the Python issue " +"tracker." +msgstr "已提交给 Python 问题追踪系统的文档错误列表。" + +#: ../../bugs.rst:40 +msgid "`Issue Tracking `_" +msgstr "`问题跟踪 `_" + +#: ../../bugs.rst:41 +msgid "" +"Overview of the process involved in reporting an improvement on the tracker." +msgstr "在追踪系统上参与问题改进的过程概述。" + +#: ../../bugs.rst:43 +msgid "" +"`Helping with Documentation " +"`_" +msgstr "" +"`改进文档 `_" + +#: ../../bugs.rst:44 +msgid "" +"Comprehensive guide for individuals that are interested in contributing to " +"Python documentation." +msgstr "给有兴趣为 Python 文档做出贡献的人的综合指南。" + +#: ../../bugs.rst:46 +msgid "" +"`Documentation Translations " +"`_" +msgstr "" +"`文档翻译 " +"`_" + +#: ../../bugs.rst:47 +msgid "" +"A list of GitHub pages for documentation translation and their coordination " +"teams." +msgstr "文档翻译的 GitHub 页面及其主要协调团队的列表。" + +#: ../../bugs.rst:53 +msgid "Using the Python issue tracker" +msgstr "使用 Python 的问题追踪系统" + +#: ../../bugs.rst:55 +msgid "" +"Issue reports for Python itself should be submitted via the GitHub issues " +"tracker (https://github.com/python/cpython/issues). The GitHub issues " +"tracker offers a web form which allows pertinent information to be entered " +"and submitted to the developers." +msgstr "" +"针对 Python 本身的问题报告应当通过 GitHub 问题追踪系统 " +"(https://github.com/python/cpython/issues) 来提交。GitHub " +"问题追踪系统提供了一个网页表单用来输入并提交相关信息给开发者。" + +#: ../../bugs.rst:60 +msgid "" +"The first step in filing a report is to determine whether the problem has " +"already been reported. The advantage in doing so, aside from saving the " +"developers' time, is that you learn what has been done to fix it; it may be " +"that the problem has already been fixed for the next release, or additional " +"information is needed (in which case you are welcome to provide it if you " +"can!). To do this, search the tracker using the search box at the top of the" +" page." +msgstr "" +"第一步是确定问题是否已经被报告了。 " +"这样做的好处除了可以节省开发者的时间,还可以让你了解该问题是如何解决的;有可能该问题已在下一发布版中被修复,或者还需要额外的信息(在此情况下非常欢迎你来提供信息!)。" +" 要确定这一点,请使用页面顶部的搜索框来搜索问题追踪系统。" + +#: ../../bugs.rst:67 +msgid "" +"If the problem you're reporting is not already in the list, log in to " +"GitHub. If you don't already have a GitHub account, create a new account " +"using the \"Sign up\" link. It is not possible to submit a bug report " +"anonymously." +msgstr "" +"如果你要报告的问题未出现在列表中,请登录 GitHub 报告。如果你还没有 GitHub 账号,请使用 \"Sign up\" 链接新建一个账号。 " +"错误报告无法匿名提交。" + +#: ../../bugs.rst:72 +msgid "" +"Being now logged in, you can submit an issue. Click on the \"New issue\" " +"button in the top bar to report a new issue." +msgstr "当你登录之后,就可以提交问题了。请点击顶端栏的 \"New issue\" 按钮来报告新问题。" + +#: ../../bugs.rst:75 +msgid "The submission form has two fields, \"Title\" and \"Comment\"." +msgstr "提交表单有两个字段,\"Title\" 和 \"Comment\"。" + +#: ../../bugs.rst:77 +msgid "" +"For the \"Title\" field, enter a *very* short description of the problem; " +"fewer than ten words is good." +msgstr "对于 \"Title\" 字段,请输入对问题的 *非常* 简短的描述;最好是少于十个单词。" + +#: ../../bugs.rst:80 +msgid "" +"In the \"Comment\" field, describe the problem in detail, including what you" +" expected to happen and what did happen. Be sure to include whether any " +"extension modules were involved, and what hardware and software platform you" +" were using (including version information as appropriate)." +msgstr "" +"在“说明(Comment)”栏,请详细描述问题,包括您预期的情况和实际的情况。请确保包含任何涉及的拓展模块,以及您当时所使用的硬件和软件平台(如果可能,请附上版本信息)。" + +#: ../../bugs.rst:85 +msgid "" +"Each issue report will be reviewed by a developer who will determine what " +"needs to be done to correct the problem. You will receive an update each " +"time an action is taken on the issue." +msgstr "每个问题报告将由一位开发者进行审查并决定要以何种方式来修正该问题。每当对该问题有新的处理措施时你都会收到更新的消息。" + +#: ../../bugs.rst:92 +msgid "" +"`How to Report Bugs Effectively " +"`_" +msgstr "`如何有效地报告错误 `_" + +#: ../../bugs.rst:93 +msgid "" +"Article which goes into some detail about how to create a useful bug report." +" This describes what kind of information is useful and why it is useful." +msgstr "该文章详细介绍了如何创建一份有用的错误报告。它描述了什么样的信息是有用的,以及为什么是有用的。" + +#: ../../bugs.rst:96 +msgid "" +"`Bug Writing Guidelines `_" +msgstr "" +"`Bug Writing Guidelines `_" + +#: ../../bugs.rst:97 +msgid "" +"Information about writing a good bug report. Some of this is specific to " +"the Mozilla project, but describes general good practices." +msgstr "关于写一份好的错误报告。部分仅针对 Mozilla 项目,不过其描述了通用的恰当做法。" + +#: ../../bugs.rst:103 +msgid "Getting started contributing to Python yourself" +msgstr "开始亲自为 Python 做贡献" + +#: ../../bugs.rst:105 +msgid "" +"Beyond just reporting bugs that you find, you are also welcome to submit " +"patches to fix them. You can find more information on how to get started " +"patching Python in the `Python Developer's Guide`_. If you have questions, " +"the `core-mentorship mailing list`_ is a friendly place to get answers to " +"any and all questions pertaining to the process of fixing issues in Python." +msgstr "" +"除了仅仅报告您所发现的错误之外,同样欢迎您提交修复它们的补丁。您可以在 `Python Developer's Guide`_ 中找到更多为 " +"Python 打补丁的信息。如果您有任何问题,`core-mentorship mailing list`_ 是一个友好的去处,在那里,您可以寻求修复 " +"Python 相关问题的答案。" diff --git a/c-api/abstract.po b/c-api/abstract.po new file mode 100644 index 0000000000..08fb24cf2e --- /dev/null +++ b/c-api/abstract.po @@ -0,0 +1,45 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/abstract.rst:7 +msgid "Abstract Objects Layer" +msgstr "抽象对象层" + +#: ../../c-api/abstract.rst:9 +msgid "" +"The functions in this chapter interact with Python objects regardless of " +"their type, or with wide classes of object types (e.g. all numerical types, " +"or all sequence types). When used on object types for which they do not " +"apply, they will raise a Python exception." +msgstr "" +"本章中的函数可与任意类型的 Python " +"对象交互,或适用于范围较广的对象类型(例如,所有数值类型,或所有序列类型)。当对不适用的对象类型使用这些函数时,将会引发 Python 异常。" + +#: ../../c-api/abstract.rst:14 +msgid "" +"It is not possible to use these functions on objects that are not properly " +"initialized, such as a list object that has been created by " +":c:func:`PyList_New`, but whose items have not been set to some non-\\ " +"``NULL`` value yet." +msgstr "" +"这些函数不能用于未正确初始化的对象,例如由 :c:func:`PyList_New` 创建但其中的项目尚未被设置为非 ``NULL`` 值的列表对象。" diff --git a/c-api/allocation.po b/c-api/allocation.po new file mode 100644 index 0000000000..46a5a7071b --- /dev/null +++ b/c-api/allocation.po @@ -0,0 +1,269 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/allocation.rst:6 +msgid "Allocating objects on the heap" +msgstr "" + +#: ../../c-api/allocation.rst:17 +msgid "" +"Initialize a newly allocated object *op* with its type and initial " +"reference. Returns the initialized object. Other fields of the object are " +"not initialized. Despite its name, this function is unrelated to the " +"object's :meth:`~object.__init__` method (:c:member:`~PyTypeObject.tp_init` " +"slot). Specifically, this function does **not** call the object's " +":meth:`!__init__` method." +msgstr "" +"为新分配的对象 *op* 初始化它的类型和初始引用。返回初始化后的对象。对象的其他字段不会被初始化。虽然被如此命名,但该函数与对象的 " +":meth:`~object.__init__` 方法 (:c:member:`~PyTypeObject.tp_init` 槽位) 无关。 " +"具体而言,该函数 **不会** 调用对象的 :meth:`!__init__` 方法。" + +#: ../../c-api/allocation.rst:24 +msgid "" +"In general, consider this function to be a low-level routine. Use " +":c:member:`~PyTypeObject.tp_alloc` where possible. For implementing " +":c:member:`!tp_alloc` for your type, prefer :c:func:`PyType_GenericAlloc` or" +" :c:func:`PyObject_New`." +msgstr "" +"一般来说,可将该函数视为一个低层级的例程。如有可能请使用 :c:member:`~PyTypeObject.tp_alloc`。要为你的类型实现 " +":c:member:`!tp_alloc`,推荐使用 :c:func:`PyType_GenericAlloc` 或 " +":c:func:`PyObject_New` 函数。" + +#: ../../c-api/allocation.rst:31 +msgid "" +"This function only initializes the object's memory corresponding to the " +"initial :c:type:`PyObject` structure. It does not zero the rest." +msgstr "该函数只初始化与初始 :c:type:`PyObject` 结构体相对应的对象内存。它不会为其余内存写入零值。" + +#: ../../c-api/allocation.rst:37 +msgid "" +"This does everything :c:func:`PyObject_Init` does, and also initializes the " +"length information for a variable-size object." +msgstr "它的功能和 :c:func:`PyObject_Init` 一样,并且会初始化变量大小对象的长度信息。" + +#: ../../c-api/allocation.rst:42 +msgid "" +"This function only initializes some of the object's memory. It does not " +"zero the rest." +msgstr "该函数只初始化对象的部分内存。它不会为其余内存写入零值。" + +#: ../../c-api/allocation.rst:48 +msgid "" +"Allocates a new Python object using the C structure type *TYPE* and the " +"Python type object *typeobj* (``PyTypeObject*``) by calling " +":c:func:`PyObject_Malloc` to allocate memory and initializing it like " +":c:func:`PyObject_Init`. The caller will own the only reference to the " +"object (i.e. its reference count will be one)." +msgstr "" +"使用 C 结构类型 *TYPE* 和 Python 类型对象 *typeobj* (``PyTypeObject*``) 分配一个新的 Python " +"对象,通过调用 :c:func:`PyObject_Malloc` 来分配内存并像 :c:func:`PyObject_Init` 那样对其进行初始化。" +" 调用方将拥有对该对象的唯一引用(即其引用计数将为一)。" + +#: ../../c-api/allocation.rst:54 ../../c-api/allocation.rst:107 +msgid "" +"Avoid calling this directly to allocate memory for an object; call the " +"type's :c:member:`~PyTypeObject.tp_alloc` slot instead." +msgstr "请避免直接调用此函数为对象分配内存;而应调用类型的 :c:member:`~PyTypeObject.tp_alloc` 槽位。" + +#: ../../c-api/allocation.rst:57 ../../c-api/allocation.rst:110 +msgid "" +"When populating a type's :c:member:`~PyTypeObject.tp_alloc` slot, " +":c:func:`PyType_GenericAlloc` is preferred over a custom function that " +"simply calls this macro." +msgstr "" +"在填充类型的 :c:member:`~PyTypeObject.tp_alloc` 槽位时,推荐使用 " +":c:func:`PyType_GenericAlloc` 而不是使用简单调用此宏的自定义函数。" + +#: ../../c-api/allocation.rst:61 +msgid "" +"This macro does not call :c:member:`~PyTypeObject.tp_alloc`, " +":c:member:`~PyTypeObject.tp_new` (:meth:`~object.__new__`), or " +":c:member:`~PyTypeObject.tp_init` (:meth:`~object.__init__`)." +msgstr "" +"这个宏不会调用 :c:member:`~PyTypeObject.tp_alloc`, :c:member:`~PyTypeObject.tp_new`" +" (:meth:`~object.__new__`) 或 :c:member:`~PyTypeObject.tp_init` " +"(:meth:`~object.__init__`) 方法。" + +#: ../../c-api/allocation.rst:65 +msgid "" +"This cannot be used for objects with :c:macro:`Py_TPFLAGS_HAVE_GC` set in " +":c:member:`~PyTypeObject.tp_flags`; use :c:macro:`PyObject_GC_New` instead." +msgstr "" +"这不能被用于在 :c:member:`~PyTypeObject.tp_flags` 中设置了 " +":c:macro:`Py_TPFLAGS_HAVE_GC` 的对象;请改用 :c:macro:`PyObject_GC_New`。" + +#: ../../c-api/allocation.rst:68 +msgid "" +"Memory allocated by this macro must be freed with :c:func:`PyObject_Free` " +"(usually called via the object's :c:member:`~PyTypeObject.tp_free` slot)." +msgstr "" +"由此宏分配的内存必须用 :c:func:`PyObject_Free` 来释放(一般是通过对象的 " +":c:member:`~PyTypeObject.tp_free` 槽位进行调用)。" + +#: ../../c-api/allocation.rst:73 ../../c-api/allocation.rst:123 +msgid "" +"The returned memory is not guaranteed to have been completely zeroed before " +"it was initialized." +msgstr "返回的内存并不保证在其初始化之前被完全置为零值。" + +#: ../../c-api/allocation.rst:78 ../../c-api/allocation.rst:128 +msgid "" +"This macro does not construct a fully initialized object of the given type; " +"it merely allocates memory and prepares it for further initialization by " +":c:member:`~PyTypeObject.tp_init`. To construct a fully initialized object," +" call *typeobj* instead. For example::" +msgstr "" +"此宏并不会构造给定类型的完全初始化的对象;它只是分配内存并准备好由 :c:member:`~PyTypeObject.tp_init` " +"来进一步初始化。要构造完全初始化的对象,应改为调用 *typeobj*。例如::" + +#: ../../c-api/allocation.rst:83 +msgid "PyObject *foo = PyObject_CallNoArgs((PyObject *)&PyFoo_Type);" +msgstr "PyObject *foo = PyObject_CallNoArgs((PyObject *)&PyFoo_Type);" + +#: ../../c-api/allocation.rst:87 ../../c-api/allocation.rst:137 +#: ../../c-api/allocation.rst:184 ../../c-api/allocation.rst:186 +#: ../../c-api/allocation.rst:188 +msgid ":c:func:`PyObject_Free`" +msgstr ":c:func:`PyObject_Free`" + +#: ../../c-api/allocation.rst:88 +msgid ":c:macro:`PyObject_GC_New`" +msgstr ":c:macro:`PyObject_GC_New`" + +#: ../../c-api/allocation.rst:89 ../../c-api/allocation.rst:139 +msgid ":c:func:`PyType_GenericAlloc`" +msgstr ":c:func:`PyType_GenericAlloc`" + +#: ../../c-api/allocation.rst:90 ../../c-api/allocation.rst:140 +msgid ":c:member:`~PyTypeObject.tp_alloc`" +msgstr ":c:member:`~PyTypeObject.tp_alloc`" + +#: ../../c-api/allocation.rst:95 +msgid "Like :c:macro:`PyObject_New` except:" +msgstr "与 :c:macro:`PyObject_New` 相似,但:" + +#: ../../c-api/allocation.rst:97 +msgid "" +"It allocates enough memory for the *TYPE* structure plus *size* " +"(``Py_ssize_t``) fields of the size given by the " +":c:member:`~PyTypeObject.tp_itemsize` field of *typeobj*." +msgstr "" +"它将分配足够容纳 *TYPE* 结构加上由 *typeobj* 的 :c:member:`~PyTypeObject.tp_itemsize` " +"字段所给出的大小的 *size* (``Py_ssize_t``) 个字段的内存。" + +#: ../../c-api/allocation.rst:100 +msgid "The memory is initialized like :c:func:`PyObject_InitVar`." +msgstr "该内存将像 :c:func:`PyObject_InitVar` 一样被初始化。" + +#: ../../c-api/allocation.rst:102 +msgid "" +"This is useful for implementing objects like tuples, which are able to " +"determine their size at construction time. Embedding the array of fields " +"into the same allocation decreases the number of allocations, improving the " +"memory management efficiency." +msgstr "这适用于实现像元组那样的对象,它能够在构造时确定其大小。将字段数组嵌入到同一分配块中可减少分配次数,从而提高内存管理效率。" + +#: ../../c-api/allocation.rst:114 +msgid "" +"This cannot be used for objects with :c:macro:`Py_TPFLAGS_HAVE_GC` set in " +":c:member:`~PyTypeObject.tp_flags`; use :c:macro:`PyObject_GC_NewVar` " +"instead." +msgstr "" +"这不能被用于在 :c:member:`~PyTypeObject.tp_flags` 中设置了 " +":c:macro:`Py_TPFLAGS_HAVE_GC` 的对象;请改用 :c:macro:`PyObject_GC_NewVar`。" + +#: ../../c-api/allocation.rst:118 +msgid "" +"Memory allocated by this function must be freed with :c:func:`PyObject_Free`" +" (usually called via the object's :c:member:`~PyTypeObject.tp_free` slot)." +msgstr "" +"由此函数分配的内存必须用 :c:func:`PyObject_Free` 来释放(一般是通过对象的 " +":c:member:`~PyTypeObject.tp_free` 槽位进行调用)。" + +#: ../../c-api/allocation.rst:133 +msgid "" +"PyObject *list_instance = PyObject_CallNoArgs((PyObject *)&PyList_Type);" +msgstr "" +"PyObject *list_instance = PyObject_CallNoArgs((PyObject *)&PyList_Type);" + +#: ../../c-api/allocation.rst:138 +msgid ":c:macro:`PyObject_GC_NewVar`" +msgstr ":c:macro:`PyObject_GC_NewVar`" + +#: ../../c-api/allocation.rst:145 +msgid "" +"Object which is visible in Python as ``None``. This should only be accessed" +" using the :c:macro:`Py_None` macro, which evaluates to a pointer to this " +"object." +msgstr "" +"在 Python 中表现为 ``None`` 的对象。只应通过 :c:macro:`Py_None` 宏来访问它,该宏的求值结果为指向该对象的指针。" + +#: ../../c-api/allocation.rst:152 +msgid ":ref:`moduleobjects`" +msgstr ":ref:`moduleobjects`" + +#: ../../c-api/allocation.rst:153 +msgid "To allocate and create extension modules." +msgstr "分配内存和创建扩展模块" + +#: ../../c-api/allocation.rst:157 +msgid "Soft-deprecated aliases" +msgstr "" + +#: ../../c-api/allocation.rst:161 +msgid "" +"These are aliases to existing functions and macros. They exist solely for " +"backwards compatibility." +msgstr "" + +#: ../../c-api/allocation.rst:169 +msgid "Soft-deprecated alias" +msgstr "" + +#: ../../c-api/allocation.rst:170 +msgid "Function" +msgstr "函数" + +#: ../../c-api/allocation.rst:172 +msgid ":c:macro:`PyObject_New`" +msgstr ":c:macro:`PyObject_New`" + +#: ../../c-api/allocation.rst:174 +msgid ":c:macro:`PyObject_NewVar`" +msgstr ":c:macro:`PyObject_NewVar`" + +#: ../../c-api/allocation.rst:176 +msgid ":c:func:`PyObject_Init`" +msgstr ":c:func:`PyObject_Init`" + +#: ../../c-api/allocation.rst:178 +msgid ":c:func:`PyObject_InitVar`" +msgstr ":c:func:`PyObject_InitVar`" + +#: ../../c-api/allocation.rst:180 +msgid ":c:func:`PyObject_Malloc`" +msgstr ":c:func:`PyObject_Malloc`" + +#: ../../c-api/allocation.rst:182 +msgid ":c:func:`PyObject_Realloc`" +msgstr ":c:func:`PyObject_Realloc`" diff --git a/c-api/apiabiversion.po b/c-api/apiabiversion.po new file mode 100644 index 0000000000..94447983ae --- /dev/null +++ b/c-api/apiabiversion.po @@ -0,0 +1,310 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/apiabiversion.rst:7 +msgid "API and ABI Versioning" +msgstr "API 和 ABI 版本管理" + +#: ../../c-api/apiabiversion.rst:11 +msgid "Build-time version constants" +msgstr "构建时版本常量" + +#: ../../c-api/apiabiversion.rst:13 +msgid "" +"CPython exposes its version number in the following macros. Note that these " +"correspond to the version code is **built** with. See :c:var:`Py_Version` " +"for the version used at **run time**." +msgstr "" +"CPython 在下列宏中公开其版本号。请注意这对应于 **构建** 所用的版本代码。请查看 :c:var:`Py_Version` 获取在 " +"**运行时** 所用的版本。" + +#: ../../c-api/apiabiversion.rst:17 +msgid "" +"See :ref:`stable` for a discussion of API and ABI stability across versions." +msgstr "请参阅 :ref:`stable` 查看跨版本的 API 和 ABI 稳定情况。" + +#: ../../c-api/apiabiversion.rst:21 +msgid "The ``3`` in ``3.4.1a2``." +msgstr "``3`` (``3.4.1a2`` 中的第一段)。" + +#: ../../c-api/apiabiversion.rst:25 +msgid "The ``4`` in ``3.4.1a2``." +msgstr "``4`` (``3.4.1a2`` 中的第二段)。" + +#: ../../c-api/apiabiversion.rst:29 +msgid "The ``1`` in ``3.4.1a2``." +msgstr "``1`` (``3.4.1a2`` 中第三段的数字)。" + +#: ../../c-api/apiabiversion.rst:33 +msgid "" +"The ``a`` in ``3.4.1a2``. This can be ``0xA`` for alpha, ``0xB`` for beta, " +"``0xC`` for release candidate or ``0xF`` for final." +msgstr "" +"``a`` (``3.4.1a2`` 中第三段的字母)。可能为 ``0xA`` 即 alpha, ``0xB`` 即 beta, ``0xC`` 即 " +"release candidate 或 ``0xF`` 即 final。" + +#: ../../c-api/apiabiversion.rst:39 +msgid "The ``2`` in ``3.4.1a2``. Zero for final releases." +msgstr "``2`` (``3.4.1a2`` 中的末尾数字)。零代表最终发布版。" + +#: ../../c-api/apiabiversion.rst:43 +msgid "" +"The Python version number encoded in a single integer. See " +":c:func:`Py_PACK_FULL_VERSION` for the encoding details." +msgstr "Python 版本号被编码为一个整数。请查看 :c:func:`Py_PACK_FULL_VERSION` 了解编码细节。" + +#: ../../c-api/apiabiversion.rst:46 +msgid "" +"Use this for numeric comparisons, for example, ``#if PY_VERSION_HEX >= " +"...``." +msgstr "可将其用于数字比较,例如 ``#if PY_VERSION_HEX >= ...``。" + +#: ../../c-api/apiabiversion.rst:49 +msgid "These macros are defined in :source:`Include/patchlevel.h`." +msgstr "这些宏都定义在 :source:`Include/patchlevel.h` 中。" + +#: ../../c-api/apiabiversion.rst:53 +msgid "Run-time version" +msgstr "运行时版本" + +#: ../../c-api/apiabiversion.rst:57 +msgid "" +"The Python runtime version number encoded in a single constant integer. See " +":c:func:`Py_PACK_FULL_VERSION` for the encoding details. This contains the " +"Python version used at run time." +msgstr "" +"Python 运行时版本号被编码为一个整数常量。请查看 :c:func:`Py_PACK_FULL_VERSION` " +"了解编码细节。这包含了在运行时使用的 Python 版本。" + +#: ../../c-api/apiabiversion.rst:61 +msgid "" +"Use this for numeric comparisons, for example, ``if (Py_Version >= ...)``." +msgstr "可将其用于数字比较,例如 ``if (Py_Version >= ...)``。" + +#: ../../c-api/apiabiversion.rst:67 +msgid "Bit-packing macros" +msgstr "比特位打包宏" + +#: ../../c-api/apiabiversion.rst:71 +msgid "" +"Return the given version, encoded as a single 32-bit integer with the " +"following structure:" +msgstr "返回给定的版本,编码为一个具有如下结构的 32 位整数:" + +#: ../../c-api/apiabiversion.rst:77 +msgid "Argument" +msgstr "参数" + +#: ../../c-api/apiabiversion.rst:75 +msgid "No. of bits" +msgstr "位编号" + +#: ../../c-api/apiabiversion.rst:77 +msgid "Bit mask" +msgstr "位掩码" + +#: ../../c-api/apiabiversion.rst:77 +msgid "Bit shift" +msgstr "位移" + +#: ../../c-api/apiabiversion.rst:75 +msgid "Example values" +msgstr "示例值" + +#: ../../c-api/apiabiversion.rst:77 ../../c-api/apiabiversion.rst:95 +msgid "``3.4.1a2``" +msgstr "``3.4.1a2``" + +#: ../../c-api/apiabiversion.rst:77 ../../c-api/apiabiversion.rst:97 +msgid "``3.10.0``" +msgstr "``3.10.0``" + +#: ../../c-api/apiabiversion.rst:79 +msgid "*major*" +msgstr "*major*" + +#: ../../c-api/apiabiversion.rst:79 ../../c-api/apiabiversion.rst:81 +#: ../../c-api/apiabiversion.rst:83 +msgid "8" +msgstr "8" + +#: ../../c-api/apiabiversion.rst:79 +msgid "``0xFF000000``" +msgstr "``0xFF000000``" + +#: ../../c-api/apiabiversion.rst:79 +msgid "24" +msgstr "24" + +#: ../../c-api/apiabiversion.rst:79 +msgid "``0x03``" +msgstr "``0x03``" + +#: ../../c-api/apiabiversion.rst:81 +msgid "*minor*" +msgstr "*minor*" + +#: ../../c-api/apiabiversion.rst:81 +msgid "``0x00FF0000``" +msgstr "``0x00FF0000``" + +#: ../../c-api/apiabiversion.rst:81 +msgid "16" +msgstr "16" + +#: ../../c-api/apiabiversion.rst:81 +msgid "``0x04``" +msgstr "``0x04``" + +#: ../../c-api/apiabiversion.rst:81 +msgid "``0x0A``" +msgstr "``0x0A``" + +#: ../../c-api/apiabiversion.rst:83 +msgid "*micro*" +msgstr "*micro*" + +#: ../../c-api/apiabiversion.rst:83 +msgid "``0x0000FF00``" +msgstr "``0x0000FF00``" + +#: ../../c-api/apiabiversion.rst:83 +msgid "``0x01``" +msgstr "``0x01``" + +#: ../../c-api/apiabiversion.rst:83 +msgid "``0x00``" +msgstr "``0x00``" + +#: ../../c-api/apiabiversion.rst:85 +msgid "*release_level*" +msgstr "*release_level*" + +#: ../../c-api/apiabiversion.rst:85 ../../c-api/apiabiversion.rst:87 +msgid "4" +msgstr "4" + +#: ../../c-api/apiabiversion.rst:85 +msgid "``0x000000F0``" +msgstr "``0x000000F0``" + +#: ../../c-api/apiabiversion.rst:85 +msgid "``0xA``" +msgstr "``0xA``" + +#: ../../c-api/apiabiversion.rst:85 +msgid "``0xF``" +msgstr "``0xF``" + +#: ../../c-api/apiabiversion.rst:87 +msgid "*release_serial*" +msgstr "*release_serial*" + +#: ../../c-api/apiabiversion.rst:87 +msgid "``0x0000000F``" +msgstr "``0x0000000F``" + +#: ../../c-api/apiabiversion.rst:87 +msgid "0" +msgstr "0" + +#: ../../c-api/apiabiversion.rst:87 +msgid "``0x2``" +msgstr "``0x2``" + +#: ../../c-api/apiabiversion.rst:87 +msgid "``0x0``" +msgstr "``0x0``" + +#: ../../c-api/apiabiversion.rst:90 +msgid "For example:" +msgstr "例如:" + +#: ../../c-api/apiabiversion.rst:93 +msgid "Version" +msgstr "版本" + +#: ../../c-api/apiabiversion.rst:93 +msgid "``Py_PACK_FULL_VERSION`` arguments" +msgstr "``Py_PACK_FULL_VERSION`` 参数" + +#: ../../c-api/apiabiversion.rst:93 +msgid "Encoded version" +msgstr "已编码版本" + +#: ../../c-api/apiabiversion.rst:95 +msgid "``(3, 4, 1, 0xA, 2)``" +msgstr "``(3, 4, 1, 0xA, 2)``" + +#: ../../c-api/apiabiversion.rst:95 +msgid "``0x030401a2``" +msgstr "``0x030401a2``" + +#: ../../c-api/apiabiversion.rst:97 +msgid "``(3, 10, 0, 0xF, 0)``" +msgstr "``(3, 10, 0, 0xF, 0)``" + +#: ../../c-api/apiabiversion.rst:97 +msgid "``0x030a00f0``" +msgstr "``0x030a00f0``" + +#: ../../c-api/apiabiversion.rst:100 +msgid "" +"Out-of range bits in the arguments are ignored. That is, the macro can be " +"defined as:" +msgstr "参数中超范围的比特位将被忽略。也就是说,该宏可以被定义为:" + +#: ../../c-api/apiabiversion.rst:103 +msgid "" +"#ifndef Py_PACK_FULL_VERSION\n" +"#define Py_PACK_FULL_VERSION(X, Y, Z, LEVEL, SERIAL) ( \\\n" +" (((X) & 0xff) << 24) | \\\n" +" (((Y) & 0xff) << 16) | \\\n" +" (((Z) & 0xff) << 8) | \\\n" +" (((LEVEL) & 0xf) << 4) | \\\n" +" (((SERIAL) & 0xf) << 0))\n" +"#endif" +msgstr "" +"#ifndef Py_PACK_FULL_VERSION\n" +"#define Py_PACK_FULL_VERSION(X, Y, Z, LEVEL, SERIAL) ( \\\n" +" (((X) & 0xff) << 24) | \\\n" +" (((Y) & 0xff) << 16) | \\\n" +" (((Z) & 0xff) << 8) | \\\n" +" (((LEVEL) & 0xf) << 4) | \\\n" +" (((SERIAL) & 0xf) << 0))\n" +"#endif" + +#: ../../c-api/apiabiversion.rst:114 +msgid "" +"``Py_PACK_FULL_VERSION`` is primarily a macro, intended for use in ``#if`` " +"directives, but it is also available as an exported function." +msgstr "``Py_PACK_FULL_VERSION`` 本质上是一个宏,主要在 ``#if`` 指令中使用,但也可作为导出的函数使用。" + +#: ../../c-api/apiabiversion.rst:121 +msgid "" +"Equivalent to ``Py_PACK_FULL_VERSION(major, minor, 0, 0, 0)``. The result " +"does not correspond to any Python release, but is useful in numeric " +"comparisons." +msgstr "" +"等价于 ``Py_PACK_FULL_VERSION(major, minor, 0, 0, 0)``。其结果不与任何 Python " +"发布版对应,但在数字比较中很有用处。" diff --git a/c-api/arg.po b/c-api/arg.po new file mode 100644 index 0000000000..f2dbd6d367 --- /dev/null +++ b/c-api/arg.po @@ -0,0 +1,1442 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:00+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/arg.rst:6 +msgid "Parsing arguments and building values" +msgstr "解析参数并构建值变量" + +#: ../../c-api/arg.rst:8 +msgid "" +"These functions are useful when creating your own extension functions and " +"methods. Additional information and examples are available in " +":ref:`extending-index`." +msgstr "这些函数在创建你自己的扩展函数和方法时很有用处。更多信息和示例可在 :ref:`extending-index` 查看。" + +#: ../../c-api/arg.rst:12 +msgid "" +"The first three of these functions described, :c:func:`PyArg_ParseTuple`, " +":c:func:`PyArg_ParseTupleAndKeywords`, and :c:func:`PyArg_Parse`, all use " +"*format strings* which are used to tell the function about the expected " +"arguments. The format strings use the same syntax for each of these " +"functions." +msgstr "" +"这些函数描述的前三个,:c:func:`PyArg_ParseTuple`,:c:func:`PyArg_ParseTupleAndKeywords`,以及" +" :c:func:`PyArg_Parse`,它们都使用 *格式化字符串* 来将函数期待的参数告知函数。这些函数都使用相同语法规则的格式化字符串。" + +#: ../../c-api/arg.rst:19 +msgid "Parsing arguments" +msgstr "解析参数" + +#: ../../c-api/arg.rst:21 +msgid "" +"A format string consists of zero or more \"format units.\" A format unit " +"describes one Python object; it is usually a single character or a " +"parenthesized sequence of format units. With a few exceptions, a format " +"unit that is not a parenthesized sequence normally corresponds to a single " +"address argument to these functions. In the following description, the " +"quoted form is the format unit; the entry in (round) parentheses is the " +"Python object type that matches the format unit; and the entry in [square] " +"brackets is the type of the C variable(s) whose address should be passed." +msgstr "" +"一个格式化字符串包含 0 或者更多的格式单元。一个格式单元用来描述一个 Python " +"对象;它通常是一个字符或者由括号括起来的格式单元序列。除了少数例外,一个非括号序列的格式单元通常对应这些函数的具有单一地址的参数。在接下来的描述中,双引号内的表达式是格式单元;圆括号" +" () 内的是对应这个格式单元的 Python 对象类型;方括号 [] 内的是传递的 C 变量(变量集)类型。" + +#: ../../c-api/arg.rst:33 +msgid "Strings and buffers" +msgstr "字符串和缓冲区" + +#: ../../c-api/arg.rst:37 +msgid "" +"On Python 3.12 and older, the macro :c:macro:`!PY_SSIZE_T_CLEAN` must be " +"defined before including :file:`Python.h` to use all ``#`` variants of " +"formats (``s#``, ``y#``, etc.) explained below. This is not necessary on " +"Python 3.13 and later." +msgstr "" +"在 Python 3.12 和之前的版本中,宏 :c:macro:`!PY_SSIZE_T_CLEAN` 必须在包括 :file:`Python.h` " +"之前定义以使用下文介绍的所有 ``#`` 类格式 (``s#``, ``y#`` 等)。这在 Python 3.13 和之后的版本中已不再必要。" + +#: ../../c-api/arg.rst:42 +msgid "" +"These formats allow accessing an object as a contiguous chunk of memory. You" +" don't have to provide raw storage for the returned unicode or bytes area." +msgstr "这些格式允许将对象按照连续的内存块形式进行访问。你没必要提供返回的 unicode 字符或者字节区的原始数据存储。" + +#: ../../c-api/arg.rst:46 +msgid "Unless otherwise stated, buffers are not NUL-terminated." +msgstr "除非另有说明,缓冲区是不会以空终止的。" + +#: ../../c-api/arg.rst:48 +msgid "There are three ways strings and buffers can be converted to C:" +msgstr "有三种办法可以将字符串和缓冲区转换到 C 类型:" + +#: ../../c-api/arg.rst:50 +msgid "" +"Formats such as ``y*`` and ``s*`` fill a :c:type:`Py_buffer` structure. This" +" locks the underlying buffer so that the caller can subsequently use the " +"buffer even inside a :c:type:`Py_BEGIN_ALLOW_THREADS` block without the risk" +" of mutable data being resized or destroyed. As a result, **you have to " +"call** :c:func:`PyBuffer_Release` after you have finished processing the " +"data (or in any early abort case)." +msgstr "" +"像 ``y*`` 和 ``s*`` 这样的格式会填充一个 :c:type:`Py_buffer` 结构体。 " +"这将锁定下层缓冲区以便调用者随后使用这个缓冲区即使是在 :c:type:`Py_BEGIN_ALLOW_THREADS` " +"块中也不会有可变数据因大小调整或销毁所带来的风险。因此,在你结束处理数据(或任何更早的中止场景)之前 **你必须调用** " +":c:func:`PyBuffer_Release` 函数。" + +#: ../../c-api/arg.rst:57 +msgid "" +"The ``es``, ``es#``, ``et`` and ``et#`` formats allocate the result buffer. " +"**You have to call** :c:func:`PyMem_Free` after you have finished processing" +" the data (or in any early abort case)." +msgstr "" +"``es``, ``es#``, ``et`` 和 ``et#`` 等格式会分配结果缓冲区。在你结束处理数据(或任何更早的中止场景)之后 " +"**你必须调用** :c:func:`PyMem_Free`。" + +#: ../../c-api/arg.rst:63 +msgid "" +"Other formats take a :class:`str` or a read-only :term:`bytes-like object`, " +"such as :class:`bytes`, and provide a ``const char *`` pointer to its " +"buffer. In this case the buffer is \"borrowed\": it is managed by the " +"corresponding Python object, and shares the lifetime of this object. You " +"won't have to release any memory yourself." +msgstr "" +"其他格式接受一个 :class:`str` 或只读的 :term:`bytes-like object`,如 " +":class:`bytes`,并向其缓冲区提供一个 ``const char *`` 指针。在此情况下缓冲区是“借入”的:它将由对应的 Python " +"对象来管理,并共享此对象的生命期。你不需要自行释放任何内存。" + +#: ../../c-api/arg.rst:70 +msgid "" +"To ensure that the underlying buffer may be safely borrowed, the object's " +":c:member:`PyBufferProcs.bf_releasebuffer` field must be ``NULL``. This " +"disallows common mutable objects such as :class:`bytearray`, but also some " +"read-only objects such as :class:`memoryview` of :class:`bytes`." +msgstr "" +"为确保下层缓冲区可以安全地被借入,对象的 :c:member:`PyBufferProcs.bf_releasebuffer` 字段必须为 " +"``NULL``。这将不允许普通的可变对象如 :class:`bytearray`,以及某些只读对象如 :class:`bytes` 的 " +":class:`memoryview` 对象。" + +#: ../../c-api/arg.rst:76 +msgid "" +"Besides this ``bf_releasebuffer`` requirement, there is no check to verify " +"whether the input object is immutable (e.g. whether it would honor a request" +" for a writable buffer, or whether another thread can mutate the data)." +msgstr "" +"在这个 ``bf_releasebuffer`` " +"要求以外,没有用于验证输入对象是否为不可变对象的检查(例如它是否会接受可写缓冲区的请求,或者另一个线程是否能改变此数据)。" + +#: ../../c-api/arg.rst:80 +msgid "``s`` (:class:`str`) [const char \\*]" +msgstr "``s`` (:class:`str`) [const char \\*]" + +#: ../../c-api/arg.rst:81 +msgid "" +"Convert a Unicode object to a C pointer to a character string. A pointer to " +"an existing string is stored in the character pointer variable whose address" +" you pass. The C string is NUL-terminated. The Python string must not " +"contain embedded null code points; if it does, a :exc:`ValueError` exception" +" is raised. Unicode objects are converted to C strings using ``'utf-8'`` " +"encoding. If this conversion fails, a :exc:`UnicodeError` is raised." +msgstr "" +"将一个 Unicode 对象转换成一个指向字符串的 C 指针。一个指针指向一个已经存在的字符串,这个字符串存储的是传入的字符指针变量。C " +"字符串是以空值结束的。Python 字符串不能包含嵌入的空代码点;如果有,一个 :exc:`ValueError` 异常会被引发。Unicode " +"对象被转化成 ``'utf-8'`` 编码的 C 字符串。如果转换失败,一个 :exc:`UnicodeError` 异常被引发。" + +#: ../../c-api/arg.rst:90 +msgid "" +"This format does not accept :term:`bytes-like objects `." +" If you want to accept filesystem paths and convert them to C character " +"strings, it is preferable to use the ``O&`` format with " +":c:func:`PyUnicode_FSConverter` as *converter*." +msgstr "" +"这个表达式不接受 :term:`bytes-like objects `。如果你想接受文件系统路径并将它们转化成 " +"C 字符串,建议使用 ``O&`` 表达式配合 :c:func:`PyUnicode_FSConverter` 作为 *转化函数*。" + +#: ../../c-api/arg.rst:96 +msgid "" +"Previously, :exc:`TypeError` was raised when embedded null code points were " +"encountered in the Python string." +msgstr "以前,当 Python 字符串中遇到了嵌入的 null 代码点会引发 :exc:`TypeError`。" + +#: ../../c-api/arg.rst:100 +msgid "``s*`` (:class:`str` or :term:`bytes-like object`) [Py_buffer]" +msgstr "``s*`` (:class:`str` or :term:`bytes-like object`) [Py_buffer]" + +#: ../../c-api/arg.rst:101 +msgid "" +"This format accepts Unicode objects as well as bytes-like objects. It fills " +"a :c:type:`Py_buffer` structure provided by the caller. In this case the " +"resulting C string may contain embedded NUL bytes. Unicode objects are " +"converted to C strings using ``'utf-8'`` encoding." +msgstr "" +"这个表达式既接受 Unicode 对象也接受类字节类型对象。它为由调用者提供的 :c:type:`Py_buffer` 结构赋值。这里结果的 C " +"字符串可能包含嵌入的 NUL 字节。Unicode 对象通过 ``'utf-8'`` 编码转化成 C 字符串。" + +#: ../../c-api/arg.rst:106 +msgid "" +"``s#`` (:class:`str`, read-only :term:`bytes-like object`) [const char \\*, " +":c:type:`Py_ssize_t`]" +msgstr "" +"``s#`` (:class:`str`, read-only :term:`bytes-like object`) [const char \\*, " +":c:type:`Py_ssize_t`]" + +#: ../../c-api/arg.rst:107 +msgid "" +"Like ``s*``, except that it provides a :ref:`borrowed buffer `. The result is stored into two C variables, the first one " +"a pointer to a C string, the second one its length. The string may contain " +"embedded null bytes. Unicode objects are converted to C strings using " +"``'utf-8'`` encoding." +msgstr "" +"像是 ``s*``,区别在于它提供了一个 :ref:`借入的缓冲区 `。结果存储在两个 C " +"变量中,第一个是指向 C 字符串的指针,第二个是其长度。该字符串可能包含嵌入的空字节。Unicode 对象会使用 ``'utf-8'`` 编码格式转换为" +" C 字符串。" + +#: ../../c-api/arg.rst:113 ../../c-api/arg.rst:643 +msgid "``z`` (:class:`str` or ``None``) [const char \\*]" +msgstr "``z`` (:class:`str` or ``None``) [const char \\*]" + +#: ../../c-api/arg.rst:114 +msgid "" +"Like ``s``, but the Python object may also be ``None``, in which case the C " +"pointer is set to ``NULL``." +msgstr "与 ``s`` 类似,但 Python 对象也可能为 ``None``,在这种情况下 C 指针将被设为 ``NULL``。" + +#: ../../c-api/arg.rst:117 +msgid "" +"``z*`` (:class:`str`, :term:`bytes-like object` or ``None``) [Py_buffer]" +msgstr "" +"``z*`` (:class:`str`, :term:`bytes-like object` or ``None``) [Py_buffer]" + +#: ../../c-api/arg.rst:118 +msgid "" +"Like ``s*``, but the Python object may also be ``None``, in which case the " +"``buf`` member of the :c:type:`Py_buffer` structure is set to ``NULL``." +msgstr "" +"与 ``s*`` 类似,但该 Python 对象也可以是 ``None``,此时 :c:type:`Py_buffer` 结构体的 ``buf`` " +"成员将被设为 ``NULL``。" + +#: ../../c-api/arg.rst:121 +msgid "" +"``z#`` (:class:`str`, read-only :term:`bytes-like object` or ``None``) " +"[const char \\*, :c:type:`Py_ssize_t`]" +msgstr "" +"``z#`` (:class:`str`, read-only :term:`bytes-like object` 或者 ``None``) " +"[const char \\*, :c:type:`Py_ssize_t`]" + +#: ../../c-api/arg.rst:122 +msgid "" +"Like ``s#``, but the Python object may also be ``None``, in which case the C" +" pointer is set to ``NULL``." +msgstr "与 ``s#`` 类似,但 Python 对象也可能为 ``None``,在这种情况下 C 指针将被设为 ``NULL``。" + +#: ../../c-api/arg.rst:125 +msgid "``y`` (read-only :term:`bytes-like object`) [const char \\*]" +msgstr "``y`` (read-only :term:`bytes-like object`) [const char \\*]" + +#: ../../c-api/arg.rst:126 +msgid "" +"This format converts a bytes-like object to a C pointer to a :ref:`borrowed " +"` character string; it does not accept Unicode " +"objects. The bytes buffer must not contain embedded null bytes; if it does," +" a :exc:`ValueError` exception is raised." +msgstr "" +"这个格式会将一个类字节对象转换为一个指向 :ref:`借入的 ` 字符串的 C 指针;它不接受 " +"Unicode 对象。字节缓冲区不可包含嵌入的空字节;如果包含这样的内容,将会引发 :exc:`ValueError` 异常。" + +#: ../../c-api/arg.rst:132 +msgid "" +"Previously, :exc:`TypeError` was raised when embedded null bytes were " +"encountered in the bytes buffer." +msgstr "以前,当字节缓冲区中遇到了嵌入的 null 字节会引发 :exc:`TypeError`。" + +#: ../../c-api/arg.rst:136 +msgid "``y*`` (:term:`bytes-like object`) [Py_buffer]" +msgstr "``y*`` (:term:`bytes-like object`) [Py_buffer]" + +#: ../../c-api/arg.rst:137 +msgid "" +"This variant on ``s*`` doesn't accept Unicode objects, only bytes-like " +"objects. **This is the recommended way to accept binary data.**" +msgstr "``s*`` 的变式,不接受 Unicode 对象,只接受类字节类型变量。**这是接受二进制数据的推荐方法。**" + +#: ../../c-api/arg.rst:141 +msgid "" +"``y#`` (read-only :term:`bytes-like object`) [const char \\*, " +":c:type:`Py_ssize_t`]" +msgstr "" +"``y#`` (read-only :term:`bytes-like object`) [const char \\*, " +":c:type:`Py_ssize_t`]" + +#: ../../c-api/arg.rst:142 +msgid "" +"This variant on ``s#`` doesn't accept Unicode objects, only bytes-like " +"objects." +msgstr "``s#`` 的变式,不接受 Unicode 对象,只接受类字节类型变量。" + +#: ../../c-api/arg.rst:145 +msgid "``S`` (:class:`bytes`) [PyBytesObject \\*]" +msgstr "``S`` (:class:`bytes`) [PyBytesObject \\*]" + +#: ../../c-api/arg.rst:146 +msgid "" +"Requires that the Python object is a :class:`bytes` object, without " +"attempting any conversion. Raises :exc:`TypeError` if the object is not a " +"bytes object. The C variable may also be declared as :c:expr:`PyObject*`." +msgstr "" +"要求 Python 对象为 :class:`bytes` 对象,不尝试进行任何转换。如果该对象不为 bytes 对象则会引发 " +":exc:`TypeError`。C 变量也可被声明为 :c:expr:`PyObject*`。" + +#: ../../c-api/arg.rst:150 +msgid "``Y`` (:class:`bytearray`) [PyByteArrayObject \\*]" +msgstr "``Y`` (:class:`bytearray`) [PyByteArrayObject \\*]" + +#: ../../c-api/arg.rst:151 +msgid "" +"Requires that the Python object is a :class:`bytearray` object, without " +"attempting any conversion. Raises :exc:`TypeError` if the object is not a " +":class:`bytearray` object. The C variable may also be declared as " +":c:expr:`PyObject*`." +msgstr "" +"要求 Python 对象为 :class:`bytearray` 对象,不尝试进行任何转换。如果该对象不为 :class:`bytearray` " +"对象则会引发 :exc:`TypeError`。C 变量也可被声明为 :c:expr:`PyObject*`。" + +#: ../../c-api/arg.rst:155 +msgid "``U`` (:class:`str`) [PyObject \\*]" +msgstr "``U`` (:class:`str`) [PyObject \\*]" + +#: ../../c-api/arg.rst:156 +msgid "" +"Requires that the Python object is a Unicode object, without attempting any " +"conversion. Raises :exc:`TypeError` if the object is not a Unicode object." +" The C variable may also be declared as :c:expr:`PyObject*`." +msgstr "" +"要求 Python 对象为 Unicode 对象,不尝试进行任何转换。如果该对象不为 Unicode 对象则会引发 :exc:`TypeError`。C" +" 变量也可被声明为 :c:expr:`PyObject*`。" + +#: ../../c-api/arg.rst:160 +msgid "``w*`` (read-write :term:`bytes-like object`) [Py_buffer]" +msgstr "``w*`` (可读写 :term:`bytes-like object`) [Py_buffer]" + +#: ../../c-api/arg.rst:161 +msgid "" +"This format accepts any object which implements the read-write buffer " +"interface. It fills a :c:type:`Py_buffer` structure provided by the caller. " +"The buffer may contain embedded null bytes. The caller has to call " +":c:func:`PyBuffer_Release` when it is done with the buffer." +msgstr "" +"此格式接受任何实现了可读写缓冲区接口的对象。它将填充一个由调用方提供的 :c:type:`Py_buffer` " +"结构体。缓冲区可能包含嵌入的空字节。调用方必须在用完缓冲区之后调用 :c:func:`PyBuffer_Release`。" + +#: ../../c-api/arg.rst:166 +msgid "``es`` (:class:`str`) [const char \\*encoding, char \\*\\*buffer]" +msgstr "``es`` (:class:`str`) [const char \\*encoding, char \\*\\*buffer]" + +#: ../../c-api/arg.rst:167 +msgid "" +"This variant on ``s`` is used for encoding Unicode into a character buffer. " +"It only works for encoded data without embedded NUL bytes." +msgstr "``s`` 的变式,它将编码后的 Unicode 字符存入字符缓冲区。它只处理没有嵌 NUL 字节的已编码数据。" + +#: ../../c-api/arg.rst:170 +msgid "" +"This format requires two arguments. The first is only used as input, and " +"must be a :c:expr:`const char*` which points to the name of an encoding as a" +" NUL-terminated string, or ``NULL``, in which case ``'utf-8'`` encoding is " +"used. An exception is raised if the named encoding is not known to Python. " +"The second argument must be a :c:expr:`char**`; the value of the pointer it " +"references will be set to a buffer with the contents of the argument text. " +"The text will be encoded in the encoding specified by the first argument." +msgstr "" +"此格式需要两个参数。第一个仅用作输入,并且必须为 :c:expr:`const char*`,它指向一个以 NUL " +"结束的字符串表示的编码格式名称,或者为 ``NULL``,这种情况会使用 ``'utf-8'`` 编码格式。如果 Python " +"无法识别指定的编码格式则会引发异常。第二个参数必须为 " +":c:expr:`char**`;它所引用的指针值将被设为带有参数文本内容的缓冲区。文本将以第一个参数所指定的编码格式进行编码。" + +#: ../../c-api/arg.rst:178 +msgid "" +":c:func:`PyArg_ParseTuple` will allocate a buffer of the needed size, copy " +"the encoded data into this buffer and adjust *\\*buffer* to reference the " +"newly allocated storage. The caller is responsible for calling " +":c:func:`PyMem_Free` to free the allocated buffer after use." +msgstr "" +":c:func:`PyArg_ParseTuple` 会分配一个足够大小的缓冲区,将编码后的数据拷贝进这个缓冲区并且设置 *\\*buffer* " +"引用这个新分配的内存空间。调用者有责任在使用后调用 :c:func:`PyMem_Free` 去释放已经分配的缓冲区。" + +#: ../../c-api/arg.rst:183 +msgid "" +"``et`` (:class:`str`, :class:`bytes` or :class:`bytearray`) [const char " +"\\*encoding, char \\*\\*buffer]" +msgstr "" +"``et`` (:class:`str`, :class:`bytes` or :class:`bytearray`) [const char " +"\\*encoding, char \\*\\*buffer]" + +#: ../../c-api/arg.rst:184 +msgid "" +"Same as ``es`` except that byte string objects are passed through without " +"recoding them. Instead, the implementation assumes that the byte string " +"object uses the encoding passed in as parameter." +msgstr "和 ``es`` 相同,除了不用重编码传入的字符串对象。相反,它假设传入的参数是编码后的字符串类型。" + +#: ../../c-api/arg.rst:188 +msgid "" +"``es#`` (:class:`str`) [const char \\*encoding, char \\*\\*buffer, " +":c:type:`Py_ssize_t` \\*buffer_length]" +msgstr "" +"``es#`` (:class:`str`) [const char \\*encoding, char \\*\\*buffer, " +":c:type:`Py_ssize_t` \\*buffer_length]" + +#: ../../c-api/arg.rst:189 +msgid "" +"This variant on ``s#`` is used for encoding Unicode into a character buffer." +" Unlike the ``es`` format, this variant allows input data which contains NUL" +" characters." +msgstr "``s#`` 的变式,它将已编码的 Unicode 字符存入字符缓冲区。不像 ``es`` 表达式,它允许传入的数据包含 NUL 字符。" + +#: ../../c-api/arg.rst:193 +msgid "" +"It requires three arguments. The first is only used as input, and must be a" +" :c:expr:`const char*` which points to the name of an encoding as a NUL-" +"terminated string, or ``NULL``, in which case ``'utf-8'`` encoding is used. " +"An exception is raised if the named encoding is not known to Python. The " +"second argument must be a :c:expr:`char**`; the value of the pointer it " +"references will be set to a buffer with the contents of the argument text. " +"The text will be encoded in the encoding specified by the first argument. " +"The third argument must be a pointer to an integer; the referenced integer " +"will be set to the number of bytes in the output buffer." +msgstr "" +"它需要三个参数。第一个仅用作输入,并且必须为 :c:expr:`const char*`,它指向一个以 NUL 结束的字符串表示的编码格式名称,或者为 " +"``NULL``,这种情况会使用 ``'utf-8'`` 编码格式。如果 Python 无法识别指定的编码格式则会引发异常。第二个参数必须为 " +":c:expr:`char**`;它所引用的指针值将被设为带有参数文本内容的缓冲区。文本将以第一个参数所指定的编码格式进行编码。第三个参数必须为指向一个整数的指针;被引用的整数将被设为输出缓冲区中的字节数。" + +#: ../../c-api/arg.rst:203 +msgid "There are two modes of operation:" +msgstr "有两种操作方式:" + +#: ../../c-api/arg.rst:205 +msgid "" +"If *\\*buffer* points a ``NULL`` pointer, the function will allocate a " +"buffer of the needed size, copy the encoded data into this buffer and set " +"*\\*buffer* to reference the newly allocated storage. The caller is " +"responsible for calling :c:func:`PyMem_Free` to free the allocated buffer " +"after usage." +msgstr "" +"如果 *\\*buffer* 指向 ``NULL`` 指针,则函数将分配所需大小的缓冲区,将编码的数据复制到此缓冲区,并设置 *\\*buffer* " +"以引用新分配的存储。调用者负责调用 :c:func:`PyMem_Free` 以在使用后释放分配的缓冲区。" + +#: ../../c-api/arg.rst:210 +msgid "" +"If *\\*buffer* points to a non-``NULL`` pointer (an already allocated " +"buffer), :c:func:`PyArg_ParseTuple` will use this location as the buffer and" +" interpret the initial value of *\\*buffer_length* as the buffer size. It " +"will then copy the encoded data into the buffer and NUL-terminate it. If " +"the buffer is not large enough, a :exc:`ValueError` will be set." +msgstr "" +"如果 *\\*buffer* 指向非 ``NULL`` 指针(已分配的缓冲区),则 :c:func:`PyArg_ParseTuple` " +"将使用此位置作为缓冲区,并将 *\\*buffer_length* " +"的初始值解释为缓冲区大小。然后,它将将编码的数据复制到缓冲区,并终止它。如果缓冲区不够大,将设置一个 :exc:`ValueError`。" + +#: ../../c-api/arg.rst:216 +msgid "" +"In both cases, *\\*buffer_length* is set to the length of the encoded data " +"without the trailing NUL byte." +msgstr "在这两种情况下,*\\*buffer_length* 都将被设为编码数据不含末尾 NUL 字节的长度。" + +#: ../../c-api/arg.rst:219 +msgid "" +"``et#`` (:class:`str`, :class:`bytes` or :class:`bytearray`) [const char " +"\\*encoding, char \\*\\*buffer, :c:type:`Py_ssize_t` \\*buffer_length]" +msgstr "" +"``et#`` (:class:`str`, :class:`bytes` 或 :class:`bytearray`) [const char " +"\\*encoding, char \\*\\*buffer, :c:type:`Py_ssize_t` \\*buffer_length]" + +#: ../../c-api/arg.rst:220 +msgid "" +"Same as ``es#`` except that byte string objects are passed through without " +"recoding them. Instead, the implementation assumes that the byte string " +"object uses the encoding passed in as parameter." +msgstr "和 ``es#`` 相同,除了不用重编码传入的字符串对象。相反,它假设传入的参数是编码后的字符串类型。" + +#: ../../c-api/arg.rst:224 +msgid "" +"``u``, ``u#``, ``Z``, and ``Z#`` are removed because they used a legacy " +"``Py_UNICODE*`` representation." +msgstr "``u``, ``u#``, ``Z`` 和 ``Z#`` 已被移除因为它们只用于旧式的 ``Py_UNICODE*`` 表示形式。" + +#: ../../c-api/arg.rst:230 +msgid "Numbers" +msgstr "数字" + +#: ../../c-api/arg.rst:232 +msgid "" +"These formats allow representing Python numbers or single characters as C " +"numbers. Formats that require :class:`int`, :class:`float` or " +":class:`complex` can also use the corresponding special methods " +":meth:`~object.__index__`, :meth:`~object.__float__` or " +":meth:`~object.__complex__` to convert the Python object to the required " +"type." +msgstr "" +"这些格式允许将 Python 数字或单个字符表示为 C 数字。需要 :class:`int`, :class:`float` 或 " +":class:`complex` 的格式还可以使用相应的特殊方法 :meth:`~object.__index__`, " +":meth:`~object.__float__` 或 :meth:`~object.__complex__` 将 Python 对象转换为所需的类型。" + +#: ../../c-api/arg.rst:238 +msgid "" +"For signed integer formats, :exc:`OverflowError` is raised if the value is " +"out of range for the C type. For unsigned integer formats, the most " +"significant bits are silently truncated when the receiving field is too " +"small to receive the value, and :exc:`DeprecationWarning` is emitted when " +"the value is larger than the maximal value for the C type or less than the " +"minimal value for the corresponding signed integer type of the same size." +msgstr "" + +#: ../../c-api/arg.rst:246 +msgid "``b`` (:class:`int`) [unsigned char]" +msgstr "``b`` (:class:`int`) [unsigned char]" + +#: ../../c-api/arg.rst:247 +msgid "" +"Convert a nonnegative Python integer to an unsigned tiny integer, stored in " +"a C :c:expr:`unsigned char`." +msgstr "将一个非负的 Python 整数转换为无符号微整数,存储于 C :c:expr:`unsigned char` 中。" + +#: ../../c-api/arg.rst:250 ../../c-api/arg.rst:677 +msgid "``B`` (:class:`int`) [unsigned char]" +msgstr "``B`` (:class:`int`) [unsigned char]" + +#: ../../c-api/arg.rst:251 +msgid "" +"Convert a Python integer to a tiny integer without overflow checking, stored" +" in a C :c:expr:`unsigned char`. Convert a Python integer to a C " +":c:expr:`unsigned char`." +msgstr "" + +#: ../../c-api/arg.rst:255 ../../c-api/arg.rst:671 +msgid "``h`` (:class:`int`) [short int]" +msgstr "``h`` (:class:`int`) [short int]" + +#: ../../c-api/arg.rst:256 +msgid "Convert a Python integer to a C :c:expr:`short int`." +msgstr "将 Python 整数转换为 C :c:expr:`short int`。" + +#: ../../c-api/arg.rst:258 ../../c-api/arg.rst:680 +msgid "``H`` (:class:`int`) [unsigned short int]" +msgstr "``H`` (:class:`int`) [unsigned short int]" + +#: ../../c-api/arg.rst:259 +msgid "Convert a Python integer to a C :c:expr:`unsigned short int`." +msgstr "" + +#: ../../c-api/arg.rst:261 ../../c-api/arg.rst:665 +msgid "``i`` (:class:`int`) [int]" +msgstr "``i`` (:class:`int`) [int]" + +#: ../../c-api/arg.rst:262 +msgid "Convert a Python integer to a plain C :c:expr:`int`." +msgstr "将 Python 整数转换为 C :c:expr:`int`。" + +#: ../../c-api/arg.rst:264 ../../c-api/arg.rst:683 +msgid "``I`` (:class:`int`) [unsigned int]" +msgstr "``I`` (:class:`int`) [unsigned int]" + +#: ../../c-api/arg.rst:265 +msgid "Convert a Python integer to a C :c:expr:`unsigned int`." +msgstr "" + +#: ../../c-api/arg.rst:267 ../../c-api/arg.rst:674 +msgid "``l`` (:class:`int`) [long int]" +msgstr "``l`` (:class:`int`) [long int]" + +#: ../../c-api/arg.rst:268 +msgid "Convert a Python integer to a C :c:expr:`long int`." +msgstr "将 Python 整数转换为 C :c:expr:`long int`。" + +#: ../../c-api/arg.rst:270 ../../c-api/arg.rst:686 +msgid "``k`` (:class:`int`) [unsigned long]" +msgstr "``k`` (:class:`int`) [unsigned long]" + +#: ../../c-api/arg.rst:271 +msgid "Convert a Python integer to a C :c:expr:`unsigned long`." +msgstr "" + +#: ../../c-api/arg.rst:273 ../../c-api/arg.rst:282 +msgid "Use :meth:`~object.__index__` if available." +msgstr "如果可能将使用 :meth:`~object.__index__`。" + +#: ../../c-api/arg.rst:276 ../../c-api/arg.rst:689 +msgid "``L`` (:class:`int`) [long long]" +msgstr "``L`` (:class:`int`) [long long]" + +#: ../../c-api/arg.rst:277 +msgid "Convert a Python integer to a C :c:expr:`long long`." +msgstr "将 Python 整数转换为 C :c:expr:`long long`。" + +#: ../../c-api/arg.rst:279 ../../c-api/arg.rst:694 +msgid "``K`` (:class:`int`) [unsigned long long]" +msgstr "``K`` (:class:`int`) [unsigned long long]" + +#: ../../c-api/arg.rst:280 +msgid "Convert a Python integer to a C :c:expr:`unsigned long long`." +msgstr "" + +#: ../../c-api/arg.rst:285 ../../c-api/arg.rst:697 +msgid "``n`` (:class:`int`) [:c:type:`Py_ssize_t`]" +msgstr "``n`` (:class:`int`) [:c:type:`Py_ssize_t`]" + +#: ../../c-api/arg.rst:286 +msgid "Convert a Python integer to a C :c:type:`Py_ssize_t`." +msgstr "将一个 Python 整数转换为 C :c:type:`Py_ssize_t`。" + +#: ../../c-api/arg.rst:288 +msgid "``c`` (:class:`bytes` or :class:`bytearray` of length 1) [char]" +msgstr "``c`` (:class:`bytes` 或者 :class:`bytearray` 长度为 1) [char]" + +#: ../../c-api/arg.rst:289 +msgid "" +"Convert a Python byte, represented as a :class:`bytes` or :class:`bytearray`" +" object of length 1, to a C :c:expr:`char`." +msgstr "" +"将一个 Python 字节类型,如一个长度为 1 的 :class:`bytes` 或 :class:`bytearray` 对象,转换为 C " +":c:expr:`char` 类型。" + +#: ../../c-api/arg.rst:292 +msgid "Allow :class:`bytearray` objects." +msgstr "允许 :class:`bytearray` 类型的对象。" + +#: ../../c-api/arg.rst:295 ../../c-api/arg.rst:715 +msgid "``C`` (:class:`str` of length 1) [int]" +msgstr "``C`` (:class:`str` 长度为 1) [int]" + +#: ../../c-api/arg.rst:296 +msgid "" +"Convert a Python character, represented as a :class:`str` object of length " +"1, to a C :c:expr:`int`." +msgstr "将一个 Python 字符,如一个长度为 1 的 :class:`str` 对象,转换为 C :c:expr:`int`。" + +#: ../../c-api/arg.rst:299 ../../c-api/arg.rst:722 +msgid "``f`` (:class:`float`) [float]" +msgstr "``f`` (:class:`float`) [float]" + +#: ../../c-api/arg.rst:300 +msgid "Convert a Python floating-point number to a C :c:expr:`float`." +msgstr "将 Python 浮点数转换成 C 的 :c:expr:`float`" + +#: ../../c-api/arg.rst:302 ../../c-api/arg.rst:719 +msgid "``d`` (:class:`float`) [double]" +msgstr "``d`` (:class:`float`) [double]" + +#: ../../c-api/arg.rst:303 +msgid "Convert a Python floating-point number to a C :c:expr:`double`." +msgstr "将 Python 浮点数转换成 C 的 :c:expr:`double`" + +#: ../../c-api/arg.rst:305 +msgid "``D`` (:class:`complex`) [Py_complex]" +msgstr "``D`` (:class:`complex`) [Py_complex]" + +#: ../../c-api/arg.rst:306 +msgid "Convert a Python complex number to a C :c:type:`Py_complex` structure." +msgstr "将一个 Python 复数转换为 C :c:type:`Py_complex` 结构体。" + +#: ../../c-api/arg.rst:310 +msgid "" +"For unsigned integer formats ``B``, ``H``, ``I``, ``k`` and ``K``, " +":exc:`DeprecationWarning` is emitted when the value is larger than the " +"maximal value for the C type or less than the minimal value for the " +"corresponding signed integer type of the same size." +msgstr "" + +#: ../../c-api/arg.rst:317 +msgid "Other objects" +msgstr "其他对象" + +#: ../../c-api/arg.rst:319 ../../c-api/arg.rst:728 +msgid "``O`` (object) [PyObject \\*]" +msgstr "``O`` (object) [PyObject \\*]" + +#: ../../c-api/arg.rst:320 +msgid "" +"Store a Python object (without any conversion) in a C object pointer. The C" +" program thus receives the actual object that was passed. A new " +":term:`strong reference` to the object is not created (i.e. its reference " +"count is not increased). The pointer stored is not ``NULL``." +msgstr "" +"将 Python 对象(未经任何转换)存储到一个 C 对象指针中。这样 C 程序就能接收到实际传递的对象。对象的新 :term:`strong " +"reference` 不会被创建(即其引用计数不会增加)。存储的指针将不为 ``NULL``。" + +#: ../../c-api/arg.rst:326 +msgid "``O!`` (object) [*typeobject*, PyObject \\*]" +msgstr "``O!`` (object) [*typeobject*, PyObject \\*]" + +#: ../../c-api/arg.rst:327 +msgid "" +"Store a Python object in a C object pointer. This is similar to ``O``, but " +"takes two C arguments: the first is the address of a Python type object, the" +" second is the address of the C variable (of type :c:expr:`PyObject*`) into " +"which the object pointer is stored. If the Python object does not have the " +"required type, :exc:`TypeError` is raised." +msgstr "" +"将一个 Python 对象存入一个 C 对象指针。这类似于 ``O``,但是接受两个 C 参数:第一个是 Python " +"类型对象的地址,第二个是存储对象指针的 C 变量 (类型为 :c:expr:`PyObject*`)。如果 Python " +"对象不具有所要求的类型,则会引发 :exc:`TypeError`。" + +#: ../../c-api/arg.rst:335 +msgid "``O&`` (object) [*converter*, *address*]" +msgstr "``O&`` (object) [*converter*, *address*]" + +#: ../../c-api/arg.rst:336 +msgid "" +"Convert a Python object to a C variable through a *converter* function. " +"This takes two arguments: the first is a function, the second is the address" +" of a C variable (of arbitrary type), converted to :c:expr:`void *`. The " +"*converter* function in turn is called as follows::" +msgstr "" +"通过 *converter* 函数将 Python 对象转换为 C 变量。这需要两个参数:第一个是函数,第二个是 C 变量(任意类型)的地址,转换为 " +":c:expr:`void *`。*转换器* 函数依次调用如下:" + +#: ../../c-api/arg.rst:341 +msgid "status = converter(object, address);" +msgstr "status = converter(object, address);" + +#: ../../c-api/arg.rst:343 +msgid "" +"where *object* is the Python object to be converted and *address* is the " +":c:expr:`void*` argument that was passed to the ``PyArg_Parse*`` function. " +"The returned *status* should be ``1`` for a successful conversion and ``0`` " +"if the conversion has failed. When the conversion fails, the *converter* " +"function should raise an exception and leave the content of *address* " +"unmodified." +msgstr "" +"其中 *object* 是待转换的 Python 对象而 *address* 为传给 ``PyArg_Parse*`` 函数的 " +":c:expr:`void*` 参数。返回的 *status* 应当以 ``1`` 代表转换成功而以 ``0`` " +"代表转换失败。当转换失败时,*converter* 函数应当引发异常并让 *address* 的内容保持未修改状态。" + +#: ../../c-api/arg.rst:352 +msgid "" +"If the *converter* returns :c:macro:`!Py_CLEANUP_SUPPORTED`, it may get " +"called a second time if the argument parsing eventually fails, giving the " +"converter a chance to release any memory that it had already allocated. In " +"this second call, the *object* parameter will be ``NULL``; *address* will " +"have the same value as in the original call." +msgstr "" +"如果 *converter* 返回 " +":c:macro:`!Py_CLEANUP_SUPPORTED`,则如果参数解析最终失败它可能会再次被调用,以使转换器有机会释放已分配的任何内存。 " +"在第二次调用中,*object* 形参将为 ``NULL``; *address* 将具有与原始调用相同的值。" + +#: ../../c-api/arg.rst:358 +msgid "" +"Examples of converters: :c:func:`PyUnicode_FSConverter` and " +":c:func:`PyUnicode_FSDecoder`." +msgstr "" +"转换器的例子::c:func:`PyUnicode_FSConverter` 和 :c:func:`PyUnicode_FSDecoder`。" + +#: ../../c-api/arg.rst:361 +msgid ":c:macro:`!Py_CLEANUP_SUPPORTED` was added." +msgstr "增加了 :c:macro:`!Py_CLEANUP_SUPPORTED`。" + +#: ../../c-api/arg.rst:364 ../../c-api/arg.rst:700 +msgid "``p`` (:class:`bool`) [int]" +msgstr "``p`` (:class:`bool`) [int]" + +#: ../../c-api/arg.rst:365 +msgid "" +"Tests the value passed in for truth (a boolean **p**\\ redicate) and " +"converts the result to its equivalent C true/false integer value. Sets the " +"int to ``1`` if the expression was true and ``0`` if it was false. This " +"accepts any valid Python value. See :ref:`truth` for more information about" +" how Python tests values for truth." +msgstr "" +"测试传入的值是否为真(一个布尔判断),并且将结果转化为相对应的 C true/false 整型值。如果表达式为真置 ``1``,假则置 " +"``0``。它接受任何合法的 Python 值。参见 :ref:`truth` 获取更多关于 Python 如何测试值为真的信息。" + +#: ../../c-api/arg.rst:373 +msgid "``(items)`` (sequence) [*matching-items*]" +msgstr "``(items)`` (sequence) [*matching-items*]" + +#: ../../c-api/arg.rst:374 +msgid "" +"The object must be a Python sequence (except :class:`str`, :class:`bytes` or" +" :class:`bytearray`) whose length is the number of format units in *items*." +" The C arguments must correspond to the individual format units in *items*." +" Format units for sequences may be nested." +msgstr "" +"对象必须是 Python 序列 (除了 :class:`str`、:class:`bytes` 或 :class:`bytearray`),它的长度是 " +"*items* 中格式单元的数量。 C 参数必须对应 *items* 中每一个独立的格式单元。序列中的格式单元可能有嵌套。" + +#: ../../c-api/arg.rst:379 +msgid "" +"If *items* contains format units which store a :ref:`borrowed buffer ` (``s``, ``s#``, ``z``, ``z#``, ``y``, or ``y#``) or a " +":term:`borrowed reference` (``S``, ``Y``, ``U``, ``O``, or ``O!``), the " +"object must be a Python tuple. The *converter* for the ``O&`` format unit in" +" *items* must not store a borrowed buffer or a borrowed reference." +msgstr "" +"如果 *items* 包含存储 :ref:`借用缓冲区 ` " +"(``s``、``s#``、``z``、``z#``、``y`` 或 ``y#``) 或 :term:`borrowed reference` " +"(``S``、``Y``、``U``、``O`` 或 ``O!``) 的格式单元,则对象必须是 Python 元组。 *items* 中 ``O&`` " +"格式单元的 *转换器* 不得存储借用缓冲区或借用引用。" + +#: ../../c-api/arg.rst:386 +msgid "" +":class:`str` and :class:`bytearray` objects no longer accepted as a " +"sequence." +msgstr ":class:`str` 和 :class:`bytearray` 对象不再被接受为序列。" + +#: ../../c-api/arg.rst:389 +msgid "" +"Non-tuple sequences are deprecated if *items* contains format units which " +"store a borrowed buffer or a borrowed reference." +msgstr "如果 *items* 包含存储借用缓冲区或借用引用的格式单元,则非元组序列将被弃用。" + +#: ../../c-api/arg.rst:393 +msgid "" +"A few other characters have a meaning in a format string. These may not " +"occur inside nested parentheses. They are:" +msgstr "格式化字符串中还有一些其他的字符具有特殊的涵义。这些可能并不嵌套在圆括号中。它们是:" + +#: ../../c-api/arg.rst:396 +msgid "``|``" +msgstr "``|``" + +#: ../../c-api/arg.rst:397 +msgid "" +"Indicates that the remaining arguments in the Python argument list are " +"optional. The C variables corresponding to optional arguments should be " +"initialized to their default value --- when an optional argument is not " +"specified, :c:func:`PyArg_ParseTuple` does not touch the contents of the " +"corresponding C variable(s)." +msgstr "" +"表明在 Python 参数列表中剩下的参数都是可选的。C 变量对应的可选参数需要初始化为默认值——当一个可选参数没有指定时, " +":c:func:`PyArg_ParseTuple` 不会修改相应的 C 变量(变量集)的内容。" + +#: ../../c-api/arg.rst:403 +msgid "``$``" +msgstr "``$``" + +#: ../../c-api/arg.rst:404 +msgid "" +":c:func:`PyArg_ParseTupleAndKeywords` only: Indicates that the remaining " +"arguments in the Python argument list are keyword-only. Currently, all " +"keyword-only arguments must also be optional arguments, so ``|`` must always" +" be specified before ``$`` in the format string." +msgstr "" +":c:func:`PyArg_ParseTupleAndKeywords` only:表明在 Python " +"参数列表中剩下的参数都是强制关键字参数。当前,所有强制关键字参数都必须也是可选参数,所以格式化字符串中 ``|`` 必须一直在 ``$`` 前面。" + +#: ../../c-api/arg.rst:412 +msgid "``:``" +msgstr "``:``" + +#: ../../c-api/arg.rst:413 +msgid "" +"The list of format units ends here; the string after the colon is used as " +"the function name in error messages (the \"associated value\" of the " +"exception that :c:func:`PyArg_ParseTuple` raises)." +msgstr "" +"格式单元的列表结束标志;冒号后的字符串被用来作为错误消息中的函数名 (:c:func:`PyArg_ParseTuple` 函数引发的“关联值”异常)。" + +#: ../../c-api/arg.rst:417 +msgid "``;``" +msgstr "``;``" + +#: ../../c-api/arg.rst:418 +msgid "" +"The list of format units ends here; the string after the semicolon is used " +"as the error message *instead* of the default error message. ``:`` and " +"``;`` mutually exclude each other." +msgstr "格式单元的列表结束标志;分号后的字符串被用来作为错误消息取代默认的错误消息。``:`` 和 ``;`` 相互排斥。" + +#: ../../c-api/arg.rst:422 +msgid "" +"Note that any Python object references which are provided to the caller are " +"*borrowed* references; do not release them (i.e. do not decrement their " +"reference count)!" +msgstr "请注意提供给调用者的任何 Python 对象引用都是 *借入* 引用;不要释放它们(即不要递减它们的引用计数)!" + +#: ../../c-api/arg.rst:426 +msgid "" +"Additional arguments passed to these functions must be addresses of " +"variables whose type is determined by the format string; these are used to " +"store values from the input tuple. There are a few cases, as described in " +"the list of format units above, where these parameters are used as input " +"values; they should match what is specified for the corresponding format " +"unit in that case." +msgstr "" +"传递给这些函数的附加参数必须是由格式化字符串确定的变量的地址;这些都是用来存储输入元组的值。有一些情况,如上面的格式单元列表中所描述的,这些参数作为输入值使用;在这种情况下,它们应该匹配指定的相应的格式单元。" + +#: ../../c-api/arg.rst:432 +msgid "" +"For the conversion to succeed, the *arg* object must match the format and " +"the format must be exhausted. On success, the ``PyArg_Parse*`` functions " +"return true, otherwise they return false and raise an appropriate exception." +" When the ``PyArg_Parse*`` functions fail due to conversion failure in one " +"of the format units, the variables at the addresses corresponding to that " +"and the following format units are left untouched." +msgstr "" +"为了让转换成功,*arg* 对象必须匹配格式并且格式必须被用尽。当成功时,``PyArg_Parse*`` " +"函数将返回真值,否则将返回假值并引发适当的异常。当 ``PyArg_Parse*`` " +"函数由于某个格式单元转换出错而失败时,该格式单元及其后续格式单元对应的地址上的变量都将保持原样。" + +#: ../../c-api/arg.rst:441 +msgid "API Functions" +msgstr "API 函数" + +#: ../../c-api/arg.rst:445 +msgid "" +"Parse the parameters of a function that takes only positional parameters " +"into local variables. Returns true on success; on failure, it returns false" +" and raises the appropriate exception." +msgstr "解析一个函数的参数,表达式中的参数按参数位置顺序存入局部变量中。成功返回 true;失败返回 false 并且引发相应的异常。" + +#: ../../c-api/arg.rst:452 +msgid "" +"Identical to :c:func:`PyArg_ParseTuple`, except that it accepts a va_list " +"rather than a variable number of arguments." +msgstr "和 :c:func:`PyArg_ParseTuple` 相同,然而它接受一个 va_list 类型的参数而不是可变数量的参数集。" + +#: ../../c-api/arg.rst:458 +msgid "" +"Parse the parameters of a function that takes both positional and keyword " +"parameters into local variables. The *keywords* argument is a " +"``NULL``-terminated array of keyword parameter names specified as null-" +"terminated ASCII or UTF-8 encoded C strings. Empty names denote " +":ref:`positional-only parameters `. Returns true " +"on success; on failure, it returns false and raises the appropriate " +"exception." +msgstr "" +"解析一个将位置参数和关键字参数同时转为局部变量的函数的形参。 *keywords* 参数是由以空值结束的 ASCII 或 UTF-8 编码 C " +"字符串表示的关键字形参名称组成的以 ``NULL`` 结束的数组。空名称代表 :ref:`仅限位置形参 `。成功时返回真值;失败时,它将返回假值并引发相应的异常。" + +#: ../../c-api/arg.rst:469 +msgid "" +"The *keywords* parameter declaration is :c:expr:`char * const *` in C and " +":c:expr:`const char * const *` in C++. This can be overridden with the " +":c:macro:`PY_CXX_CONST` macro." +msgstr "" +"*keywords* 形参声明在 C 中为 :c:expr:`char * const *` 而在 C++ 中为 :c:expr:`const char" +" * const *`。这可以通过 :c:macro:`PY_CXX_CONST` 宏来重写。" + +#: ../../c-api/arg.rst:473 +msgid "" +"Added support for :ref:`positional-only parameters `." +msgstr "" +"添加了 :ref:`positional-only parameters ` 的支持。" + +#: ../../c-api/arg.rst:477 +msgid "" +"The *keywords* parameter has now type :c:expr:`char * const *` in C and " +":c:expr:`const char * const *` in C++, instead of :c:expr:`char **`. Added " +"support for non-ASCII keyword parameter names." +msgstr "" +"现在 *keywords* 形参类型在 C 中为 :c:expr:`char * const *` 而在 C++ 中为 :c:expr:`const " +"char * const *`,而不是 :c:expr:`char **`。增加了对非 ASCII 关键字形参名称的支持。" + +#: ../../c-api/arg.rst:486 +msgid "" +"Identical to :c:func:`PyArg_ParseTupleAndKeywords`, except that it accepts a" +" va_list rather than a variable number of arguments." +msgstr "" +"和 :c:func:`PyArg_ParseTupleAndKeywords` 相同,然而它接受一个 va_list 类型的参数而不是可变数量的参数集。" + +#: ../../c-api/arg.rst:492 +msgid "" +"Ensure that the keys in the keywords argument dictionary are strings. This " +"is only needed if :c:func:`PyArg_ParseTupleAndKeywords` is not used, since " +"the latter already does this check." +msgstr "" +"确保字典中的关键字参数都是字符串。这个函数只在不使用 :c:func:`PyArg_ParseTupleAndKeywords` " +"的情况下才需要,因为后者已经会做这样的检查。" + +#: ../../c-api/arg.rst:501 +msgid "" +"Parse the parameter of a function that takes a single positional parameter " +"into a local variable. Returns true on success; on failure, it returns " +"false and raises the appropriate exception." +msgstr "解析一个将单独位置形参转为局部变量的函数的形参。成功时返回真值;失败时,它将返回假值并引发相应的异常。" + +#: ../../c-api/arg.rst:505 +msgid "Example::" +msgstr "示例::" + +#: ../../c-api/arg.rst:507 +msgid "" +"// Function using METH_O calling convention\n" +"static PyObject*\n" +"my_function(PyObject *module, PyObject *arg)\n" +"{\n" +" int value;\n" +" if (!PyArg_Parse(arg, \"i:my_function\", &value)) {\n" +" return NULL;\n" +" }\n" +" // ... use value ...\n" +"}" +msgstr "" +"// 使用 METH_O 调用规范的函数\n" +"static PyObject*\n" +"my_function(PyObject *module, PyObject *arg)\n" +"{\n" +" int value;\n" +" if (!PyArg_Parse(arg, \"i:my_function\", &value)) {\n" +" return NULL;\n" +" }\n" +" // ... 使用 value ...\n" +"}" + +#: ../../c-api/arg.rst:521 +msgid "" +"Parse the parameters of a function that takes only array parameters into " +"local variables (that is, a function using the :c:macro:`METH_FASTCALL` " +"calling convention). Returns true on success; on failure, it returns false " +"and raises the appropriate exception." +msgstr "" + +#: ../../c-api/arg.rst:532 +msgid "" +"Parse the parameters of a function that takes both array and keyword " +"parameters into local variables (that is, a function using the " +":c:macro:`METH_FASTCALL` ``|`` :c:macro:`METH_KEYWORDS` calling convention)." +" Returns true on success; on failure, it returns false and raises the " +"appropriate exception." +msgstr "" + +#: ../../c-api/arg.rst:543 +msgid "" +"A simpler form of parameter retrieval which does not use a format string to " +"specify the types of the arguments. Functions which use this method to " +"retrieve their parameters should be declared as :c:macro:`METH_VARARGS` in " +"function or method tables. The tuple containing the actual parameters " +"should be passed as *args*; it must actually be a tuple. The length of the " +"tuple must be at least *min* and no more than *max*; *min* and *max* may be " +"equal. Additional arguments must be passed to the function, each of which " +"should be a pointer to a :c:expr:`PyObject*` variable; these will be filled " +"in with the values from *args*; they will contain :term:`borrowed references" +" `. The variables which correspond to optional " +"parameters not given by *args* will not be filled in; these should be " +"initialized by the caller. This function returns true on success and false " +"if *args* is not a tuple or contains the wrong number of elements; an " +"exception will be set if there was a failure." +msgstr "" +"一个更简单的形参提取形式,它不使用格式字符串来指定参数类型。使用此方法来提取其形参的函数应当在函数或方法表中声明为 " +":c:macro:`METH_VARARGS`。包含实际形参的元组应当作为 *args* 传入;它必须确实是一个元组。该元组的长度必须至少为 *min*" +" 且不超过 *max*;*min* 和 *max* 可能相等。额外的参数必须被传给函数,每个参数应当是一个指向 :c:expr:`PyObject*` " +"变量的指针;它们将以来自 *args* 的值来填充;它们将包含 :term:`借入引用 `。对应于 *args*" +" 未给出的可选形参的变量不会被填充;它们应当由调用方来初始化。此函数在执行成功时返回真值而在 *args* " +"不为元组或包含错误数量的元素时返回假值;如果执行失败则还将设置一个异常。" + +#: ../../c-api/arg.rst:558 +msgid "" +"This is an example of the use of this function, taken from the sources for " +"the :mod:`!_weakref` helper module for weak references::" +msgstr "这是一个使用该函数的示例,取自 :mod:`!_weakref` 弱引用辅助模块的源代码::" + +#: ../../c-api/arg.rst:561 +msgid "" +"static PyObject *\n" +"weakref_ref(PyObject *self, PyObject *args)\n" +"{\n" +" PyObject *object;\n" +" PyObject *callback = NULL;\n" +" PyObject *result = NULL;\n" +"\n" +" if (PyArg_UnpackTuple(args, \"ref\", 1, 2, &object, &callback)) {\n" +" result = PyWeakref_NewRef(object, callback);\n" +" }\n" +" return result;\n" +"}" +msgstr "" +"static PyObject *\n" +"weakref_ref(PyObject *self, PyObject *args)\n" +"{\n" +" PyObject *object;\n" +" PyObject *callback = NULL;\n" +" PyObject *result = NULL;\n" +"\n" +" if (PyArg_UnpackTuple(args, \"ref\", 1, 2, &object, &callback)) {\n" +" result = PyWeakref_NewRef(object, callback);\n" +" }\n" +" return result;\n" +"}" + +#: ../../c-api/arg.rst:574 +msgid "" +"The call to :c:func:`PyArg_UnpackTuple` in this example is entirely " +"equivalent to this call to :c:func:`PyArg_ParseTuple`::" +msgstr "" +"这个例子中调用 :c:func:`PyArg_UnpackTuple` 完全等价于调用 :c:func:`PyArg_ParseTuple`::" + +#: ../../c-api/arg.rst:577 +msgid "PyArg_ParseTuple(args, \"O|O:ref\", &object, &callback)" +msgstr "PyArg_ParseTuple(args, \"O|O:ref\", &object, &callback)" + +#: ../../c-api/arg.rst:581 +msgid "" +"The value to be inserted, if any, before :c:expr:`char * const *` in the " +"*keywords* parameter declaration of :c:func:`PyArg_ParseTupleAndKeywords` " +"and :c:func:`PyArg_VaParseTupleAndKeywords`. Default empty for C and " +"``const`` for C++ (:c:expr:`const char * const *`). To override, define it " +"to the desired value before including :file:`Python.h`." +msgstr "" +"要插入到 :c:func:`PyArg_ParseTupleAndKeywords` 和 " +":c:func:`PyArg_VaParseTupleAndKeywords` 的 *keywords* 形参声明中位于 :c:expr:`char *" +" const *` 之前的值,如果有的话。默认在 C 中为空而在 C++ 中为 ``const`` (:c:expr:`const char * " +"const *`)。如需重写,可在包括 :file:`Python.h` 之前将其定义为想要的值。" + +#: ../../c-api/arg.rst:595 +msgid "Building values" +msgstr "创建变量" + +#: ../../c-api/arg.rst:599 +msgid "" +"Create a new value based on a format string similar to those accepted by the" +" ``PyArg_Parse*`` family of functions and a sequence of values. Returns the" +" value or ``NULL`` in the case of an error; an exception will be raised if " +"``NULL`` is returned." +msgstr "" +"基于类似 ``PyArg_Parse*`` 函数族所接受内容的格式字符串和一个值序列来创建一个新值。返回该值或在发生错误的情况下返回 " +"``NULL``;如果返回 ``NULL`` 则将引发一个异常。" + +#: ../../c-api/arg.rst:604 +msgid "" +":c:func:`Py_BuildValue` does not always build a tuple. It builds a tuple " +"only if its format string contains two or more format units. If the format " +"string is empty, it returns ``None``; if it contains exactly one format " +"unit, it returns whatever object is described by that format unit. To force" +" it to return a tuple of size 0 or one, parenthesize the format string." +msgstr "" +":c:func:`Py_BuildValue` " +"并不一直创建一个元组。只有当它的格式化字符串包含两个或更多的格式单元才会创建一个元组。如果格式化字符串是空,它返回 " +"``None``;如果它包含一个格式单元,它返回由格式单元描述的的任一对象。用圆括号包裹格式化字符串可以强制它返回一个大小为 0 或者 1 的元组。" + +#: ../../c-api/arg.rst:610 +msgid "" +"When memory buffers are passed as parameters to supply data to build " +"objects, as for the ``s`` and ``s#`` formats, the required data is copied. " +"Buffers provided by the caller are never referenced by the objects created " +"by :c:func:`Py_BuildValue`. In other words, if your code invokes " +":c:func:`malloc` and passes the allocated memory to :c:func:`Py_BuildValue`," +" your code is responsible for calling :c:func:`free` for that memory once " +":c:func:`Py_BuildValue` returns." +msgstr "" +"当内存缓存区的数据以参数形式传递用来构建对象时,如 ``s`` 和 ``s#`` 格式单元,会拷贝需要的数据。调用者提供的缓冲区从来都不会被由 " +":c:func:`Py_BuildValue` 创建的对象来引用。换句话说,如果你的代码调用 :c:func:`malloc` " +"并且将分配的内存空间传递给 :c:func:`Py_BuildValue`,你的代码就有责任在 :c:func:`Py_BuildValue` " +"返回时调用 :c:func:`free`。" + +#: ../../c-api/arg.rst:618 +msgid "" +"In the following description, the quoted form is the format unit; the entry " +"in (round) parentheses is the Python object type that the format unit will " +"return; and the entry in [square] brackets is the type of the C value(s) to " +"be passed." +msgstr "" +"在下面的描述中,双引号的表达式是格式单元;圆括号 () 内的是格式单元将要返回的 Python 对象类型;方括号 [] 内的是传递的 C " +"变量(变量集)的类型。" + +#: ../../c-api/arg.rst:622 +msgid "" +"The characters space, tab, colon and comma are ignored in format strings " +"(but not within format units such as ``s#``). This can be used to make long" +" format strings a tad more readable." +msgstr "" +"字符例如空格、制表符、冒号和逗号在格式化字符串中会被忽略 (但是不包括格式单元,如 ``s#``)。 这可以使很长的格式化字符串具有更好的可读性。" + +#: ../../c-api/arg.rst:626 +msgid "``s`` (:class:`str` or ``None``) [const char \\*]" +msgstr "``s`` (:class:`str` 或 ``None``) [const char \\*]" + +#: ../../c-api/arg.rst:627 +msgid "" +"Convert a null-terminated C string to a Python :class:`str` object using " +"``'utf-8'`` encoding. If the C string pointer is ``NULL``, ``None`` is used." +msgstr "" +"使用 ``'utf-8'`` 编码将空终止的 C 字符串转换为 Python :class:`str` 对象。如果 C 字符串指针为 " +"``NULL``,则使用 ``None``。" + +#: ../../c-api/arg.rst:630 +msgid "``s#`` (:class:`str` or ``None``) [const char \\*, :c:type:`Py_ssize_t`]" +msgstr "``s#`` (:class:`str` 或 ``None``) [const char \\*, :c:type:`Py_ssize_t`]" + +#: ../../c-api/arg.rst:631 +msgid "" +"Convert a C string and its length to a Python :class:`str` object using " +"``'utf-8'`` encoding. If the C string pointer is ``NULL``, the length is " +"ignored and ``None`` is returned." +msgstr "" +"使用 ``'utf-8'`` 编码将 C 字符串及其长度转换为 Python :class:`str` 对象。如果 C 字符串指针为 " +"``NULL``,则长度将被忽略,并返回 ``None``。" + +#: ../../c-api/arg.rst:635 +msgid "``y`` (:class:`bytes`) [const char \\*]" +msgstr "``y`` (:class:`bytes`) [const char \\*]" + +#: ../../c-api/arg.rst:636 +msgid "" +"This converts a C string to a Python :class:`bytes` object. If the C string" +" pointer is ``NULL``, ``None`` is returned." +msgstr "" +"这将 C 字符串转换为 Python :class:`bytes` 对象。如果 C 字符串指针为 ``NULL``,则返回 ``None``。" + +#: ../../c-api/arg.rst:639 +msgid "``y#`` (:class:`bytes`) [const char \\*, :c:type:`Py_ssize_t`]" +msgstr "``y#`` (:class:`bytes`) [const char \\*, :c:type:`Py_ssize_t`]" + +#: ../../c-api/arg.rst:640 +msgid "" +"This converts a C string and its lengths to a Python object. If the C " +"string pointer is ``NULL``, ``None`` is returned." +msgstr "这会将 C 字符串及其长度转换为一个 Python 对象。如果该 C 字符串指针为 ``NULL``,则返回 ``None``。" + +#: ../../c-api/arg.rst:644 ../../c-api/arg.rst:660 +msgid "Same as ``s``." +msgstr "和 ``s`` 一样。" + +#: ../../c-api/arg.rst:646 +msgid "``z#`` (:class:`str` or ``None``) [const char \\*, :c:type:`Py_ssize_t`]" +msgstr "``z#`` (:class:`str` 或 ``None``) [const char \\*, :c:type:`Py_ssize_t`]" + +#: ../../c-api/arg.rst:647 ../../c-api/arg.rst:663 +msgid "Same as ``s#``." +msgstr "和 ``s#`` 一样。" + +#: ../../c-api/arg.rst:649 +msgid "``u`` (:class:`str`) [const wchar_t \\*]" +msgstr "``u`` (:class:`str`) [const wchar_t \\*]" + +#: ../../c-api/arg.rst:650 +msgid "" +"Convert a null-terminated :c:type:`wchar_t` buffer of Unicode (UTF-16 or " +"UCS-4) data to a Python Unicode object. If the Unicode buffer pointer is " +"``NULL``, ``None`` is returned." +msgstr "" +"将空终止的 :c:type:`wchar_t` 的 Unicode(UTF-16 或 UCS-4)数据缓冲区转换为 Python Unicode " +"对象。如果 Unicode 缓冲区指针为 ``NULL``,则返回 ``None``。" + +#: ../../c-api/arg.rst:654 +msgid "``u#`` (:class:`str`) [const wchar_t \\*, :c:type:`Py_ssize_t`]" +msgstr "``u#`` (:class:`str`) [const wchar_t \\*, :c:type:`Py_ssize_t`]" + +#: ../../c-api/arg.rst:655 +msgid "" +"Convert a Unicode (UTF-16 or UCS-4) data buffer and its length to a Python " +"Unicode object. If the Unicode buffer pointer is ``NULL``, the length is " +"ignored and ``None`` is returned." +msgstr "" +"将 Unicode(UTF-16 或 UCS-4)数据缓冲区及其长度转换为 Python Unicode 对象。如果 Unicode 缓冲区指针为 " +"``NULL``,则长度将被忽略,并返回 ``None``。" + +#: ../../c-api/arg.rst:659 +msgid "``U`` (:class:`str` or ``None``) [const char \\*]" +msgstr "``U`` (:class:`str` 或 ``None``) [const char \\*]" + +#: ../../c-api/arg.rst:662 +msgid "``U#`` (:class:`str` or ``None``) [const char \\*, :c:type:`Py_ssize_t`]" +msgstr "``U#`` (:class:`str` 或 ``None``) [const char \\*, :c:type:`Py_ssize_t`]" + +#: ../../c-api/arg.rst:666 +msgid "Convert a plain C :c:expr:`int` to a Python integer object." +msgstr "将一个基本 C :c:expr:`int` 转换为 Python 整数对象。" + +#: ../../c-api/arg.rst:668 +msgid "``b`` (:class:`int`) [char]" +msgstr "``b`` (:class:`int`) [char]" + +#: ../../c-api/arg.rst:669 +msgid "Convert a plain C :c:expr:`char` to a Python integer object." +msgstr "将一个基本 C :c:expr:`char` 转换为 Python 整数对象。" + +#: ../../c-api/arg.rst:672 +msgid "Convert a plain C :c:expr:`short int` to a Python integer object." +msgstr "将一个基本 C :c:expr:`short int` 转换为 Python 整数对象。" + +#: ../../c-api/arg.rst:675 +msgid "Convert a C :c:expr:`long int` to a Python integer object." +msgstr "将一个 C :c:expr:`long int` 转换为 Python 整数对象。" + +#: ../../c-api/arg.rst:678 +msgid "Convert a C :c:expr:`unsigned char` to a Python integer object." +msgstr "将一个 C :c:expr:`unsigned char` 转换为 Python 整数对象。" + +#: ../../c-api/arg.rst:681 +msgid "Convert a C :c:expr:`unsigned short int` to a Python integer object." +msgstr "将一个 C :c:expr:`unsigned short int` 转换为 Python 整数对象。" + +#: ../../c-api/arg.rst:684 +msgid "Convert a C :c:expr:`unsigned int` to a Python integer object." +msgstr "将一个 C :c:expr:`unsigned int` 转换为 Python 整数对象。" + +#: ../../c-api/arg.rst:687 +msgid "Convert a C :c:expr:`unsigned long` to a Python integer object." +msgstr "将一个 C :c:expr:`unsigned long` 转换为 Python 整数对象。" + +#: ../../c-api/arg.rst:690 +msgid "Convert a C :c:expr:`long long` to a Python integer object." +msgstr "将一个 C :c:expr:`long long` 转换为 Python 整数对象。" + +#: ../../c-api/arg.rst:695 +msgid "Convert a C :c:expr:`unsigned long long` to a Python integer object." +msgstr "将一个 C :c:expr:`unsigned long long` 转换为 Python 整数对象。" + +#: ../../c-api/arg.rst:698 +msgid "Convert a C :c:type:`Py_ssize_t` to a Python integer." +msgstr "将一个 C :c:type:`Py_ssize_t` 类型转化为 Python 整型。" + +#: ../../c-api/arg.rst:701 +msgid "Convert a C :c:expr:`int` to a Python :class:`bool` object." +msgstr "将一个 C :c:expr:`int` 转换为 Python :class:`bool` 对象。" + +#: ../../c-api/arg.rst:703 +msgid "" +"Be aware that this format requires an ``int`` argument. Unlike most other " +"contexts in C, variadic arguments are not coerced to a suitable type " +"automatically. You can convert another type (for example, a pointer or a " +"float) to a suitable ``int`` value using ``(x) ? 1 : 0`` or ``!!x``." +msgstr "" +"请注意,这种格式需要一个 ``int`` 参数。与 C 语言中的大多数其他上下文不同,可变参数不会自动强制转换为合适的类型。你可以使用 ``(x) ? " +"1 : 0`` 或 ``!!x`` 将另一种类型(例如,指针或浮点数)转换为合适的 ``int`` 值。" + +#: ../../c-api/arg.rst:711 +msgid "``c`` (:class:`bytes` of length 1) [char]" +msgstr "``c`` (:class:`bytes` 长度为 1) [char]" + +#: ../../c-api/arg.rst:712 +msgid "" +"Convert a C :c:expr:`int` representing a byte to a Python :class:`bytes` " +"object of length 1." +msgstr "将一个代表单个字节的 C :c:expr:`int` 转换为长度为 1 的 Python :class:`bytes` 对象。" + +#: ../../c-api/arg.rst:716 +msgid "" +"Convert a C :c:expr:`int` representing a character to Python :class:`str` " +"object of length 1." +msgstr "将一个代表单个字符的 C :c:expr:`int` 转换为长度为 1 的 Python :class:`str` 对象。" + +#: ../../c-api/arg.rst:720 +msgid "Convert a C :c:expr:`double` to a Python floating-point number." +msgstr "将 C :c:expr:`double` 转换成 Python 浮点数" + +#: ../../c-api/arg.rst:723 +msgid "Convert a C :c:expr:`float` to a Python floating-point number." +msgstr "将 C :c:expr:`float` 转换成 Python 浮点数" + +#: ../../c-api/arg.rst:725 +msgid "``D`` (:class:`complex`) [Py_complex \\*]" +msgstr "``D`` (:class:`complex`) [Py_complex \\*]" + +#: ../../c-api/arg.rst:726 +msgid "Convert a C :c:type:`Py_complex` structure to a Python complex number." +msgstr "将一个 C :c:type:`Py_complex` 类型的结构转化为 Python 复数类型。" + +#: ../../c-api/arg.rst:729 +msgid "" +"Pass a Python object untouched but create a new :term:`strong reference` to " +"it (i.e. its reference count is incremented by one). If the object passed in" +" is a ``NULL`` pointer, it is assumed that this was caused because the call " +"producing the argument found an error and set an exception. Therefore, " +":c:func:`Py_BuildValue` will return ``NULL`` but won't raise an exception. " +"If no exception has been raised yet, :exc:`SystemError` is set." +msgstr "" +"原封不动地传递一个 Python 对象,但为其创建一个新的 :term:`strong reference` (即其引用计数加一)。 " +"如果传入的对象是一个 ``NULL`` 指针,则会假定这是因为产生该参数的调用发现了错误并设置了异常。 " +"因此,:c:func:`Py_BuildValue` 将返回 ``NULL`` 但不会引发异常。如果尚未引发异常,则会设置 " +":exc:`SystemError` 异常。" + +#: ../../c-api/arg.rst:738 +msgid "``S`` (object) [PyObject \\*]" +msgstr "``S`` (object) [PyObject \\*]" + +#: ../../c-api/arg.rst:739 +msgid "Same as ``O``." +msgstr "和 ``O`` 相同。" + +#: ../../c-api/arg.rst:741 +msgid "``N`` (object) [PyObject \\*]" +msgstr "``N`` (object) [PyObject \\*]" + +#: ../../c-api/arg.rst:742 +msgid "" +"Same as ``O``, except it doesn't create a new :term:`strong reference`. " +"Useful when the object is created by a call to an object constructor in the " +"argument list." +msgstr "" +"与 ``O`` 相同,但它不会创建新的 :term:`strong reference`。 " +"如果对象是通过调用参数列表中的对象构造器来创建的则该方法将很有用处。" + +#: ../../c-api/arg.rst:746 +msgid "``O&`` (object) [*converter*, *anything*]" +msgstr "``O&`` (object) [*converter*, *anything*]" + +#: ../../c-api/arg.rst:747 +msgid "" +"Convert *anything* to a Python object through a *converter* function. The " +"function is called with *anything* (which should be compatible with " +":c:expr:`void*`) as its argument and should return a \"new\" Python object, " +"or ``NULL`` if an error occurred." +msgstr "" +"通过 *converter* 函数将 *anything* 转换为 Python 对象。该函数在调用时附带 *anything* (它应当兼容 " +":c:expr:`void*`) 作为其参数并且应返回一个 \"新的\" Python 对象,或者如果发生错误则返回 ``NULL``。" + +#: ../../c-api/arg.rst:752 +msgid "``(items)`` (:class:`tuple`) [*matching-items*]" +msgstr "``(items)`` (:class:`tuple`) [*matching-items*]" + +#: ../../c-api/arg.rst:753 +msgid "" +"Convert a sequence of C values to a Python tuple with the same number of " +"items." +msgstr "将一个 C 变量序列转换成 Python 元组并保持相同的元素数量。" + +#: ../../c-api/arg.rst:755 +msgid "``[items]`` (:class:`list`) [*matching-items*]" +msgstr "``[items]`` (:class:`list`) [*matching-items*]" + +#: ../../c-api/arg.rst:756 +msgid "" +"Convert a sequence of C values to a Python list with the same number of " +"items." +msgstr "将一个 C 变量序列转换成 Python 列表并保持相同的元素数量。" + +#: ../../c-api/arg.rst:758 +msgid "``{items}`` (:class:`dict`) [*matching-items*]" +msgstr "``{items}`` (:class:`dict`) [*matching-items*]" + +#: ../../c-api/arg.rst:759 +msgid "" +"Convert a sequence of C values to a Python dictionary. Each pair of " +"consecutive C values adds one item to the dictionary, serving as key and " +"value, respectively." +msgstr "将一个 C 变量序列转换成 Python 字典。每一对连续的 C 变量对作为一个条目插入字典中,分别作为键和值。" + +#: ../../c-api/arg.rst:763 +msgid "" +"If there is an error in the format string, the :exc:`SystemError` exception " +"is set and ``NULL`` returned." +msgstr "如果格式字符串中出现错误,则设置 :exc:`SystemError` 异常并返回 ``NULL``。" + +#: ../../c-api/arg.rst:768 +msgid "" +"Identical to :c:func:`Py_BuildValue`, except that it accepts a va_list " +"rather than a variable number of arguments." +msgstr "和 :c:func:`Py_BuildValue` 相同,然而它接受一个 va_list 类型的参数而不是可变数量的参数集。" diff --git a/c-api/bool.po b/c-api/bool.po new file mode 100644 index 0000000000..47d36e8a48 --- /dev/null +++ b/c-api/bool.po @@ -0,0 +1,84 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/bool.rst:6 +msgid "Boolean Objects" +msgstr "布尔对象" + +#: ../../c-api/bool.rst:8 +msgid "" +"Booleans in Python are implemented as a subclass of integers. There are " +"only two booleans, :c:data:`Py_False` and :c:data:`Py_True`. As such, the " +"normal creation and deletion functions don't apply to booleans. The " +"following macros are available, however." +msgstr "" +"在 Python 中布尔值是作为整数的子类实现的。只有两个布尔值,:c:data:`Py_False` 和 " +":c:data:`Py_True`。因此,正常的创建和删除函数不适用于布尔值。不过,下列宏是可用的。" + +#: ../../c-api/bool.rst:16 +msgid "" +"This instance of :c:type:`PyTypeObject` represents the Python boolean type; " +"it is the same object as :class:`bool` in the Python layer." +msgstr "" +"这个 :c:type:`PyTypeObject` 的实例代表一个 Python 布尔类型;它与 Python 层面的 :class:`bool` " +"是相同的对象。" + +#: ../../c-api/bool.rst:22 +msgid "" +"Return true if *o* is of type :c:data:`PyBool_Type`. This function always " +"succeeds." +msgstr "如果 *o* 的类型为 :c:data:`PyBool_Type` 则返回真值。此函数总是会成功执行。" + +#: ../../c-api/bool.rst:28 +msgid "" +"The Python ``False`` object. This object has no methods and is " +":term:`immortal`." +msgstr "Python ``False`` 对象。该对象没有任何方法并且属于 :term:`immortal` 对象。" + +#: ../../c-api/bool.rst:31 +msgid ":c:data:`Py_False` is :term:`immortal`." +msgstr ":c:data:`Py_False` 属于 :term:`immortal` 对象。" + +#: ../../c-api/bool.rst:37 +msgid "" +"The Python ``True`` object. This object has no methods and is " +":term:`immortal`." +msgstr "Python ``True`` 对象。该对象没有任何方法并且属于 :term:`immortal` 对象。" + +#: ../../c-api/bool.rst:40 +msgid ":c:data:`Py_True` is :term:`immortal`." +msgstr ":c:data:`Py_True` 属于 :term:`immortal` 对象。" + +#: ../../c-api/bool.rst:46 +msgid "Return :c:data:`Py_False` from a function." +msgstr "从一个函数返回 :c:data:`Py_False`。" + +#: ../../c-api/bool.rst:51 +msgid "Return :c:data:`Py_True` from a function." +msgstr "从一个函数返回 :c:data:`Py_True`。" + +#: ../../c-api/bool.rst:56 +msgid "" +"Return :c:data:`Py_True` or :c:data:`Py_False`, depending on the truth value" +" of *v*." +msgstr "返回 :c:data:`Py_True` 或 :c:data:`Py_False`,具体取决于 *v* 的逻辑值。" diff --git a/c-api/buffer.po b/c-api/buffer.po new file mode 100644 index 0000000000..58aa58e30e --- /dev/null +++ b/c-api/buffer.po @@ -0,0 +1,967 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-07 17:18+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/buffer.rst:11 +msgid "Buffer Protocol" +msgstr "缓冲协议" + +#: ../../c-api/buffer.rst:18 +msgid "" +"Certain objects available in Python wrap access to an underlying memory " +"array or *buffer*. Such objects include the built-in :class:`bytes` and " +":class:`bytearray`, and some extension types like :class:`array.array`. " +"Third-party libraries may define their own types for special purposes, such " +"as image processing or numeric analysis." +msgstr "" +"在 Python 中可使用一些对象来包装对底层内存数组或称 *缓冲* 的访问。此类对象包括内置的 :class:`bytes` 和 " +":class:`bytearray` 以及一些如 :class:`array.array` " +"这样的扩展类型。第三方库也可能会为了特殊的目的而定义它们自己的类型,例如用于图像处理和数值分析等。" + +#: ../../c-api/buffer.rst:24 +msgid "" +"While each of these types have their own semantics, they share the common " +"characteristic of being backed by a possibly large memory buffer. It is " +"then desirable, in some situations, to access that buffer directly and " +"without intermediate copying." +msgstr "虽然这些类型各有不同的语义,但它们有一个共同特征:由可能较大的内存缓冲区支撑。在某些情况下,我们希望能直接访问该缓冲区,而无需中间复制。" + +#: ../../c-api/buffer.rst:29 +msgid "" +"Python provides such a facility at the C and Python level in the form of the" +" :ref:`buffer protocol `. This protocol has two sides:" +msgstr "" +"Python 以 :ref:`缓冲区协议 ` 的形式在 C 和 Python 层级上提供这样的功能。此协议包括两个方面:" + +#: ../../c-api/buffer.rst:34 +msgid "" +"on the producer side, a type can export a \"buffer interface\" which allows " +"objects of that type to expose information about their underlying buffer. " +"This interface is described in the section :ref:`buffer-structs`; for Python" +" see :ref:`python-buffer-protocol`." +msgstr "" +"在生产者方面,一个类型可以导出一个“缓冲区接口”,它允许将该类型的所有对象对外暴露有关其下层缓冲区的信息。此接口的描述参见 :ref:`buffer-" +"structs` 一节;Python 层级参见 :ref:`python-buffer-protocol`。" + +#: ../../c-api/buffer.rst:39 +msgid "" +"on the consumer side, several means are available to obtain a pointer to the" +" raw underlying data of an object (for example a method parameter). For " +"Python see :class:`memoryview`." +msgstr "" +"在消费者方面,有几种方式可被用于获得指向一个对象的原始底层数据的指针(例如一个方法的形参)。Python 层级参见类 " +":class:`memoryview` 视图。" + +#: ../../c-api/buffer.rst:43 +msgid "" +"Simple objects such as :class:`bytes` and :class:`bytearray` expose their " +"underlying buffer in byte-oriented form. Other forms are possible; for " +"example, the elements exposed by an :class:`array.array` can be multi-byte " +"values." +msgstr "" +"一些简单的对象例如 :class:`bytes` 和 :class:`bytearray` 会以面向字节的形式公开它们的底层缓冲区。 " +"也可能会用其他形式;例如 :class:`array.array` 所公开的元素可以是多字节值。" + +#: ../../c-api/buffer.rst:47 +msgid "" +"An example consumer of the buffer interface is the " +":meth:`~io.BufferedIOBase.write` method of file objects: any object that can" +" export a series of bytes through the buffer interface can be written to a " +"file. While :meth:`!write` only needs read-only access to the internal " +"contents of the object passed to it, other methods such as " +":meth:`~io.BufferedIOBase.readinto` need write access to the contents of " +"their argument. The buffer interface allows objects to selectively allow or" +" reject exporting of read-write and read-only buffers." +msgstr "" +"缓冲区接口的消费者的一个例子是文件对象的 :meth:`~io.BufferedIOBase.write` " +"方法:任何可以输出为一系列字节流的对象都可以被写入文件。然而 :meth:`!write` 只需要对传入对象内容的只读权限,其他的方法如 " +":meth:`~io.BufferedIOBase.readinto` 需要对参数内容的写入权限。 " +"缓冲区接口使得对象可以选择性地允许或拒绝读写或只读缓冲区的导出。" + +#: ../../c-api/buffer.rst:55 +msgid "" +"There are two ways for a consumer of the buffer interface to acquire a " +"buffer over a target object:" +msgstr "对于缓冲区接口的使用者而言,有两种方式来获取一个目的对象的缓冲:" + +#: ../../c-api/buffer.rst:58 +msgid "call :c:func:`PyObject_GetBuffer` with the right parameters;" +msgstr "使用正确的参数来调用 :c:func:`PyObject_GetBuffer` 函数;" + +#: ../../c-api/buffer.rst:60 +msgid "" +"call :c:func:`PyArg_ParseTuple` (or one of its siblings) with one of the " +"``y*``, ``w*`` or ``s*`` :ref:`format codes `." +msgstr "" +"调用 :c:func:`PyArg_ParseTuple` (或其同级函数之一) 并传入 ``y*``, ``w*`` 或 ``s*`` " +":ref:`格式代码 ` 中的一个。" + +#: ../../c-api/buffer.rst:63 +msgid "" +"In both cases, :c:func:`PyBuffer_Release` must be called when the buffer " +"isn't needed anymore. Failure to do so could lead to various issues such as" +" resource leaks." +msgstr "" +"在这两种情况下,当不再需要缓冲区时必须调用 :c:func:`PyBuffer_Release`。如果没有这样做,可能会导致各种问题,例如资源泄漏。" + +#: ../../c-api/buffer.rst:69 +msgid "" +"The buffer protocol is now accessible in Python, see :ref:`python-buffer-" +"protocol` and :class:`memoryview`." +msgstr "" +"现在可在 Python 中使用缓冲区协议,参见 :ref:`python-buffer-protocol` 和 :class:`memoryview`。" + +#: ../../c-api/buffer.rst:75 +msgid "Buffer structure" +msgstr "缓冲区结构" + +#: ../../c-api/buffer.rst:77 +msgid "" +"Buffer structures (or simply \"buffers\") are useful as a way to expose the " +"binary data from another object to the Python programmer. They can also be " +"used as a zero-copy slicing mechanism. Using their ability to reference a " +"block of memory, it is possible to expose any data to the Python programmer " +"quite easily. The memory could be a large, constant array in a C extension," +" it could be a raw block of memory for manipulation before passing to an " +"operating system library, or it could be used to pass around structured data" +" in its native, in-memory format." +msgstr "" +"缓冲区结构(或者简单地称为 \"buffers\")对于将二进制数据从另一个对象公开给 Python " +"程序员非常有用。它们还可以用作零拷贝切片机制。使用它们引用内存块的能力,可以很容易地将任何数据公开给 Python 程序员。内存可以是 C " +"扩展中的一个大的常量数组,也可以是在传递到操作系统库之前用于操作的原始内存块,或者可以用来传递本机内存格式的结构化数据。" + +#: ../../c-api/buffer.rst:86 +msgid "" +"Contrary to most data types exposed by the Python interpreter, buffers are " +"not :c:type:`PyObject` pointers but rather simple C structures. This allows" +" them to be created and copied very simply. When a generic wrapper around a" +" buffer is needed, a :ref:`memoryview ` object can be " +"created." +msgstr "" +"与 Python 解释器公开的大多数数据类型不同,缓冲区不是 :c:type:`PyObject` 指针而是简单的 C " +"结构。这使得它们可以非常简单地创建和复制。当需要为缓冲区加上泛型包装器时,可以创建一个 :ref:`内存视图 `" +" 对象。" + +#: ../../c-api/buffer.rst:92 +msgid "" +"For short instructions how to write an exporting object, see :ref:`Buffer " +"Object Structures `. For obtaining a buffer, see " +":c:func:`PyObject_GetBuffer`." +msgstr "" +"有关如何编写并导出对象的简短说明,请参阅 :ref:`缓冲区对象结构 `。要获取缓冲区对象,请参阅 函数 " +":c:func:`PyObject_GetBuffer`。" + +#: ../../c-api/buffer.rst:100 +msgid "" +"A pointer to the start of the logical structure described by the buffer " +"fields. This can be any location within the underlying physical memory block" +" of the exporter. For example, with negative :c:member:`~Py_buffer.strides` " +"the value may point to the end of the memory block." +msgstr "" +"指向由缓冲区字段描述的逻辑结构开始的指针。这可以是导出程序底层物理内存块中的任何位置。例如,使用负的 " +":c:member:`~Py_buffer.strides` 值可能指向内存块的末尾。" + +#: ../../c-api/buffer.rst:105 +msgid "" +"For :term:`contiguous` arrays, the value points to the beginning of the " +"memory block." +msgstr "对于 :term:`contiguous` (邻接) 数组,值指向内存块的开头。" + +#: ../../c-api/buffer.rst:110 +msgid "" +"A new reference to the exporting object. The reference is owned by the " +"consumer and automatically released (i.e. reference count decremented) and " +"set to ``NULL`` by :c:func:`PyBuffer_Release`. The field is the equivalent " +"of the return value of any standard C-API function." +msgstr "" +"对导出对象的新引用。该引用由消费方拥有,并由 :c:func:`PyBuffer_Release` 自动释放(即引用计数递减)并设置为 " +"``NULL``。该字段相当于任何标准 C-API 函数的返回值。" + +#: ../../c-api/buffer.rst:117 +msgid "" +"As a special case, for *temporary* buffers that are wrapped by " +":c:func:`PyMemoryView_FromBuffer` or :c:func:`PyBuffer_FillInfo` this field " +"is ``NULL``. In general, exporting objects MUST NOT use this scheme." +msgstr "" +"作为一种特殊情况,对于由 :c:func:`PyMemoryView_FromBuffer` 或 :c:func:`PyBuffer_FillInfo`" +" 包装的 *临时* 缓冲区,此字段为 ``NULL``。通常,导出对象不得使用此方案。" + +#: ../../c-api/buffer.rst:124 +msgid "" +"``product(shape) * itemsize``. For contiguous arrays, this is the length of " +"the underlying memory block. For non-contiguous arrays, it is the length " +"that the logical structure would have if it were copied to a contiguous " +"representation." +msgstr "" +"``product(shape) * " +"itemsize``。对于连续数组,这是基础内存块的长度。对于非连续数组,它是逻辑结构复制到连续表示形式时将具有的长度。" + +#: ../../c-api/buffer.rst:129 +msgid "" +"Accessing ``((char *)buf)[0] up to ((char *)buf)[len-1]`` is only valid if " +"the buffer has been obtained by a request that guarantees contiguity. In " +"most cases such a request will be :c:macro:`PyBUF_SIMPLE` or " +":c:macro:`PyBUF_WRITABLE`." +msgstr "" +"仅当缓冲区是通过保证连续性的请求获取时,访问 ``((char *)buf)[0] up to ((char *)buf)[len-1]`` " +"才有效。在大多数情况下,此类请求将为 :c:macro:`PyBUF_SIMPLE` 或 :c:macro:`PyBUF_WRITABLE`。" + +#: ../../c-api/buffer.rst:135 +msgid "" +"An indicator of whether the buffer is read-only. This field is controlled by" +" the :c:macro:`PyBUF_WRITABLE` flag." +msgstr "缓冲区是否为只读的指示器。此字段由 :c:macro:`PyBUF_WRITABLE` 标志控制。" + +#: ../../c-api/buffer.rst:140 +msgid "" +"Item size in bytes of a single element. Same as the value of " +":func:`struct.calcsize` called on non-``NULL`` :c:member:`~Py_buffer.format`" +" values." +msgstr "" +"单个元素的项大小(以字节为单位)。与 :func:`struct.calcsize` 调用非 ``NULL`` " +":c:member:`~Py_buffer.format` 的值相同。" + +#: ../../c-api/buffer.rst:143 +msgid "" +"Important exception: If a consumer requests a buffer without the " +":c:macro:`PyBUF_FORMAT` flag, :c:member:`~Py_buffer.format` will be set to " +"``NULL``, but :c:member:`~Py_buffer.itemsize` still has the value for the " +"original format." +msgstr "" +"重要例外:如果使用者请求的缓冲区没有 :c:macro:`PyBUF_FORMAT` 标志,:c:member:`~Py_buffer.format` " +"将设置为 ``NULL``,但 :c:member:`~Py_buffer.itemsize` 仍具有原始格式的值。" + +#: ../../c-api/buffer.rst:148 +msgid "" +"If :c:member:`~Py_buffer.shape` is present, the equality ``product(shape) * " +"itemsize == len`` still holds and the consumer can use " +":c:member:`~Py_buffer.itemsize` to navigate the buffer." +msgstr "" +"如果 :c:member:`~Py_buffer.shape` 存在,则等式 ``product(shape) * itemsize == len`` " +"仍然成立,使用者可以使用 :c:member:`~Py_buffer.itemsize` 来导航缓冲区。" + +#: ../../c-api/buffer.rst:152 +msgid "" +"If :c:member:`~Py_buffer.shape` is ``NULL`` as a result of a " +":c:macro:`PyBUF_SIMPLE` or a :c:macro:`PyBUF_WRITABLE` request, the consumer" +" must disregard :c:member:`~Py_buffer.itemsize` and assume ``itemsize == " +"1``." +msgstr "" +"如果 :c:member:`~Py_buffer.shape` 由于 :c:macro:`PyBUF_SIMPLE` 或 " +":c:macro:`PyBUF_WRITABLE` 请求而为 ``NULL``,则使用者必须忽略 " +":c:member:`~Py_buffer.itemsize`,并假设 ``itemsize == 1``。" + +#: ../../c-api/buffer.rst:158 +msgid "" +"A *NULL* terminated string in :mod:`struct` module style syntax describing " +"the contents of a single item. If this is ``NULL``, ``\"B\"`` (unsigned " +"bytes) is assumed." +msgstr "" +"以 :mod:`struct` 模块风格语法表示的 *NULL* 结尾字符串,描述单个条目的内容。如果这是 ``NULL``,将假定为 " +"``\"B\"`` (无符号字节型)。" + +#: ../../c-api/buffer.rst:162 +msgid "This field is controlled by the :c:macro:`PyBUF_FORMAT` flag." +msgstr "此字段由 :c:macro:`PyBUF_FORMAT` 标志控制。" + +#: ../../c-api/buffer.rst:166 +msgid "" +"The number of dimensions the memory represents as an n-dimensional array. If" +" it is ``0``, :c:member:`~Py_buffer.buf` points to a single item " +"representing a scalar. In this case, :c:member:`~Py_buffer.shape`, " +":c:member:`~Py_buffer.strides` and :c:member:`~Py_buffer.suboffsets` MUST be" +" ``NULL``. The maximum number of dimensions is given by " +":c:macro:`PyBUF_MAX_NDIM`." +msgstr "" +"内存表示为 n 维数组形式对应的维度数。如果为 ``0``,则 :c:member:`~Py_buffer.buf` 指向表示标量的单个条目。 " +"在这种情况下,:c:member:`~Py_buffer.shape`, :c:member:`~Py_buffer.strides` 和 " +":c:member:`~Py_buffer.suboffsets` 必须为 ``NULL``。最大维度数由 " +":c:macro:`PyBUF_MAX_NDIM` 给出。" + +#: ../../c-api/buffer.rst:174 +msgid "" +"An array of :c:type:`Py_ssize_t` of length :c:member:`~Py_buffer.ndim` " +"indicating the shape of the memory as an n-dimensional array. Note that " +"``shape[0] * ... * shape[ndim-1] * itemsize`` MUST be equal to " +":c:member:`~Py_buffer.len`." +msgstr "" +"一个类型为 :c:type:`Py_ssize_t`、长度为 :c:member:`~Py_buffer.ndim` 的数组,表示作为 n " +"维数组的内存形状。请注意,``shape[0] * ... * shape[ndim-1] * itemsize`` 必须等于 " +":c:member:`~Py_buffer.len` 的值。" + +#: ../../c-api/buffer.rst:179 +msgid "" +"Shape values are restricted to ``shape[n] >= 0``. The case ``shape[n] == 0``" +" requires special attention. See `complex arrays`_ for further information." +msgstr "" +"Shape 形状数组中的值被限定在 ``shape[n] >= 0``。``shape[n] == 0`` 这一情形需要特别注意。更多信息请参阅 链接 " +"`complex arrays`_。" + +#: ../../c-api/buffer.rst:183 +msgid "The shape array is read-only for the consumer." +msgstr "shape 数组对于使用者来说是只读的。" + +#: ../../c-api/buffer.rst:187 +msgid "" +"An array of :c:type:`Py_ssize_t` of length :c:member:`~Py_buffer.ndim` " +"giving the number of bytes to skip to get to a new element in each " +"dimension." +msgstr "" +"一个类型为 :c:type:`Py_ssize_t`、长度为 :c:member:`~Py_buffer.ndim` " +"的数组,给出要跳过的字节数以获取每个维度中的新元素。" + +#: ../../c-api/buffer.rst:191 +msgid "" +"Stride values can be any integer. For regular arrays, strides are usually " +"positive, but a consumer MUST be able to handle the case ``strides[n] <= " +"0``. See `complex arrays`_ for further information." +msgstr "" +"Stride 步幅数组中的值可以为任何整数。对于常规数组,步幅通常为正数,但是使用者必须能够处理 ``strides[n] <= 0`` " +"的情况。更多信息请参阅 `complex arrays`_。" + +#: ../../c-api/buffer.rst:195 +msgid "The strides array is read-only for the consumer." +msgstr "strides 数组对于使用者来说是只读的。" + +#: ../../c-api/buffer.rst:199 +msgid "" +"An array of :c:type:`Py_ssize_t` of length :c:member:`~Py_buffer.ndim`. If " +"``suboffsets[n] >= 0``, the values stored along the nth dimension are " +"pointers and the suboffset value dictates how many bytes to add to each " +"pointer after de-referencing. A suboffset value that is negative indicates " +"that no de-referencing should occur (striding in a contiguous memory block)." +msgstr "" +"一个长度为 :c:member:`~Py_buffer.ndim` 类型为 :c:type:`Py_ssize_t` 的数组。如果 " +"``suboffsets[n] >= 0``,则第 n 维存储的是指针,suboffset " +"值决定了解除引用时要给指针增加多少字节的偏移。suboffset 为负值,则表示不应解除引用(在连续内存块中移动)。" + +#: ../../c-api/buffer.rst:206 +msgid "" +"If all suboffsets are negative (i.e. no de-referencing is needed), then this" +" field must be ``NULL`` (the default value)." +msgstr "如果所有子偏移均为负(即无需取消引用),则此字段必须为 ``NULL`` (默认值)。" + +#: ../../c-api/buffer.rst:209 +msgid "" +"This type of array representation is used by the Python Imaging Library " +"(PIL). See `complex arrays`_ for further information how to access elements " +"of such an array." +msgstr "" +"Python Imaging Library (PIL) 中使用了这种类型的数组表达方式。请参阅 `complex arrays`_ " +"来了解如何从这样一个数组中访问元素。" + +#: ../../c-api/buffer.rst:213 +msgid "The suboffsets array is read-only for the consumer." +msgstr "suboffsets 数组对于使用者来说是只读的。" + +#: ../../c-api/buffer.rst:217 +msgid "" +"This is for use internally by the exporting object. For example, this might " +"be re-cast as an integer by the exporter and used to store flags about " +"whether or not the shape, strides, and suboffsets arrays must be freed when " +"the buffer is released. The consumer MUST NOT alter this value." +msgstr "" +"供输出对象内部使用。比如可能被输出程序重组为一个整数,用于存储一个标志,标明在缓冲区释放时是否必须释放 shape、strides 和 " +"suboffsets 数组。消费者程序 *不得* 修改该值。" + +#: ../../c-api/buffer.rst:224 +msgid "Constants:" +msgstr "常量:" + +#: ../../c-api/buffer.rst:228 +msgid "" +"The maximum number of dimensions the memory represents. Exporters MUST " +"respect this limit, consumers of multi-dimensional buffers SHOULD be able to" +" handle up to :c:macro:`!PyBUF_MAX_NDIM` dimensions. Currently set to 64." +msgstr "" +"内存表示的最大维度数。导出程序必须遵守这个限制,多维缓冲区的使用者应该能够处理最多 :c:macro:`!PyBUF_MAX_NDIM` 个维度。 " +"目前设置为 64。" + +#: ../../c-api/buffer.rst:237 +msgid "Buffer request types" +msgstr "缓冲区请求的类型" + +#: ../../c-api/buffer.rst:239 +msgid "" +"Buffers are usually obtained by sending a buffer request to an exporting " +"object via :c:func:`PyObject_GetBuffer`. Since the complexity of the logical" +" structure of the memory can vary drastically, the consumer uses the *flags*" +" argument to specify the exact buffer type it can handle." +msgstr "" +"通常,通过 :c:func:`PyObject_GetBuffer` " +"向输出对象发送缓冲区请求,即可获得缓冲区。由于内存的逻辑结构复杂,可能会有很大差异,缓冲区使用者可用 *flags* " +"参数指定其能够处理的缓冲区具体类型。" + +#: ../../c-api/buffer.rst:244 +msgid "" +"All :c:type:`Py_buffer` fields are unambiguously defined by the request " +"type." +msgstr "所有 :c:type:`Py_buffer` 字段均由请求类型无歧义地定义。" + +#: ../../c-api/buffer.rst:248 +msgid "request-independent fields" +msgstr "与请求无关的字段" + +#: ../../c-api/buffer.rst:249 +msgid "" +"The following fields are not influenced by *flags* and must always be filled" +" in with the correct values: :c:member:`~Py_buffer.obj`, " +":c:member:`~Py_buffer.buf`, :c:member:`~Py_buffer.len`, " +":c:member:`~Py_buffer.itemsize`, :c:member:`~Py_buffer.ndim`." +msgstr "" +"以下字段不会被 *flags* " +"影响,并且必须总是用正确的值填充::c:member:`~Py_buffer.obj`、:c:member:`~Py_buffer.buf` " +"字段、:c:member:`~Py_buffer.len` 字段、:c:member:`~Py_buffer.itemsize` 和 " +":c:member:`~Py_buffer.ndim`。" + +#: ../../c-api/buffer.rst:254 +msgid "readonly, format" +msgstr "只读,格式" + +#: ../../c-api/buffer.rst:258 +msgid "" +"Controls the :c:member:`~Py_buffer.readonly` field. If set, the exporter " +"MUST provide a writable buffer or else report failure. Otherwise, the " +"exporter MAY provide either a read-only or writable buffer, but the choice " +"MUST be consistent for all consumers. For example, :c:expr:`PyBUF_SIMPLE | " +"PyBUF_WRITABLE` can be used to request a simple writable buffer." +msgstr "" +"控制 :c:member:`~Py_buffer.readonly` 字段。如果设置了,输出程序必须提供一个可写的缓冲区,否则将报告失败。 " +"在其他情况下,输出程序可以提供一个只读或可写的缓冲区,但该选择必须对所有消费者程序保持一致。例如,可以使用 :c:expr:`PyBUF_SIMPLE " +"| PyBUF_WRITABLE` 来请求一个简单的可写缓冲区。" + +#: ../../c-api/buffer.rst:266 +msgid "This is an alias to :c:macro:`PyBUF_WRITABLE`." +msgstr "" + +#: ../../c-api/buffer.rst:272 +msgid "" +"Controls the :c:member:`~Py_buffer.format` field. If set, this field MUST be" +" filled in correctly. Otherwise, this field MUST be ``NULL``." +msgstr "" +"控制 :c:member:`~Py_buffer.format` 字段。如果设置,则必须正确填写此字段。其他情况下,此字段必须为 ``NULL``。" + +#: ../../c-api/buffer.rst:276 +msgid "" +":c:macro:`PyBUF_WRITABLE` can be \\|'d to any of the flags in the next " +"section. Since :c:macro:`PyBUF_SIMPLE` is defined as 0, " +":c:macro:`PyBUF_WRITABLE` can be used as a stand-alone flag to request a " +"simple writable buffer." +msgstr "" +":c:macro:`PyBUF_WRITABLE` 可以和下一节的所有标志联用。由于 :c:macro:`PyBUF_SIMPLE` 定义为 0,所以 " +":c:macro:`PyBUF_WRITABLE` 可以作为一个独立的标志,用于请求一个简单的可写缓冲区。" + +#: ../../c-api/buffer.rst:280 +msgid "" +":c:macro:`PyBUF_FORMAT` must be \\|'d to any of the flags except " +":c:macro:`PyBUF_SIMPLE`, because the latter already implies format ``B`` " +"(unsigned bytes). :c:macro:`!PyBUF_FORMAT` cannot be used on its own." +msgstr "" +":c:macro:`PyBUF_FORMAT` 必须与除 :c:macro:`PyBUF_SIMPLE` 之外的任何标志执行 \\| " +"运算,因为后者已隐含了格式 ``B`` (无符号字节型)。 :c:macro:`!PyBUF_FORMAT` 不可单独使用。" + +#: ../../c-api/buffer.rst:286 +msgid "shape, strides, suboffsets" +msgstr "形状,步幅,子偏移量" + +#: ../../c-api/buffer.rst:288 +msgid "" +"The flags that control the logical structure of the memory are listed in " +"decreasing order of complexity. Note that each flag contains all bits of the" +" flags below it." +msgstr "控制内存逻辑结构的标志按照复杂度的递减顺序列出。注意,每个标志包含它下面的所有标志。" + +#: ../../c-api/buffer.rst:295 ../../c-api/buffer.rst:319 +#: ../../c-api/buffer.rst:344 +msgid "Request" +msgstr "请求" + +#: ../../c-api/buffer.rst:295 ../../c-api/buffer.rst:319 +#: ../../c-api/buffer.rst:344 +msgid "shape" +msgstr "形状" + +#: ../../c-api/buffer.rst:295 ../../c-api/buffer.rst:319 +#: ../../c-api/buffer.rst:344 +msgid "strides" +msgstr "步幅" + +#: ../../c-api/buffer.rst:295 ../../c-api/buffer.rst:319 +#: ../../c-api/buffer.rst:344 +msgid "suboffsets" +msgstr "子偏移量" + +#: ../../c-api/buffer.rst:297 ../../c-api/buffer.rst:299 +#: ../../c-api/buffer.rst:301 ../../c-api/buffer.rst:321 +#: ../../c-api/buffer.rst:323 ../../c-api/buffer.rst:325 +#: ../../c-api/buffer.rst:327 ../../c-api/buffer.rst:346 +#: ../../c-api/buffer.rst:348 ../../c-api/buffer.rst:350 +#: ../../c-api/buffer.rst:352 ../../c-api/buffer.rst:354 +#: ../../c-api/buffer.rst:356 ../../c-api/buffer.rst:358 +#: ../../c-api/buffer.rst:360 +msgid "yes" +msgstr "是" + +#: ../../c-api/buffer.rst:297 ../../c-api/buffer.rst:346 +#: ../../c-api/buffer.rst:348 +msgid "if needed" +msgstr "如果需要的话" + +#: ../../c-api/buffer.rst:299 ../../c-api/buffer.rst:301 +#: ../../c-api/buffer.rst:303 ../../c-api/buffer.rst:321 +#: ../../c-api/buffer.rst:323 ../../c-api/buffer.rst:325 +#: ../../c-api/buffer.rst:327 ../../c-api/buffer.rst:350 +#: ../../c-api/buffer.rst:352 ../../c-api/buffer.rst:354 +#: ../../c-api/buffer.rst:356 ../../c-api/buffer.rst:358 +#: ../../c-api/buffer.rst:360 +msgid "NULL" +msgstr "NULL" + +#: ../../c-api/buffer.rst:310 +msgid "contiguity requests" +msgstr "连续性的请求" + +#: ../../c-api/buffer.rst:312 +msgid "" +"C or Fortran :term:`contiguity ` can be explicitly requested, " +"with and without stride information. Without stride information, the buffer " +"must be C-contiguous." +msgstr "" +"可以显式地请求 C 或 Fortran :term:`连续 `,不管有没有步幅信息。若没有步幅信息,则缓冲区必须是 C-连续的。" + +#: ../../c-api/buffer.rst:319 ../../c-api/buffer.rst:344 +msgid "contig" +msgstr "邻接" + +#: ../../c-api/buffer.rst:321 ../../c-api/buffer.rst:327 +#: ../../c-api/buffer.rst:358 ../../c-api/buffer.rst:360 +msgid "C" +msgstr "C" + +#: ../../c-api/buffer.rst:323 +msgid "F" +msgstr "F" + +#: ../../c-api/buffer.rst:325 +msgid "C or F" +msgstr "C 或 F" + +#: ../../c-api/buffer.rst:327 +msgid ":c:macro:`PyBUF_ND`" +msgstr ":c:macro:`PyBUF_ND`" + +#: ../../c-api/buffer.rst:332 +msgid "compound requests" +msgstr "复合请求" + +#: ../../c-api/buffer.rst:334 +msgid "" +"All possible requests are fully defined by some combination of the flags in " +"the previous section. For convenience, the buffer protocol provides " +"frequently used combinations as single flags." +msgstr "所有可能的请求都由上一节中某些标志的组合完全定义。为方便起见,缓冲区协议提供常用的组合作为单个标志。" + +#: ../../c-api/buffer.rst:338 +msgid "" +"In the following table *U* stands for undefined contiguity. The consumer " +"would have to call :c:func:`PyBuffer_IsContiguous` to determine contiguity." +msgstr "在下表中,*U* 代表连续性未定义。消费者程序必须调用 :c:func:`PyBuffer_IsContiguous` 以确定连续性。" + +#: ../../c-api/buffer.rst:344 +msgid "readonly" +msgstr "只读" + +#: ../../c-api/buffer.rst:344 +msgid "format" +msgstr "format" + +#: ../../c-api/buffer.rst:346 ../../c-api/buffer.rst:348 +#: ../../c-api/buffer.rst:350 ../../c-api/buffer.rst:352 +#: ../../c-api/buffer.rst:354 ../../c-api/buffer.rst:356 +msgid "U" +msgstr "U" + +#: ../../c-api/buffer.rst:346 ../../c-api/buffer.rst:350 +#: ../../c-api/buffer.rst:354 ../../c-api/buffer.rst:358 +msgid "0" +msgstr "0" + +#: ../../c-api/buffer.rst:348 ../../c-api/buffer.rst:352 +#: ../../c-api/buffer.rst:356 ../../c-api/buffer.rst:360 +msgid "1 or 0" +msgstr "1 或 0" + +#: ../../c-api/buffer.rst:365 +msgid "Complex arrays" +msgstr "复杂数组" + +#: ../../c-api/buffer.rst:368 +msgid "NumPy-style: shape and strides" +msgstr "NumPy-风格:形状和步幅" + +#: ../../c-api/buffer.rst:370 +msgid "" +"The logical structure of NumPy-style arrays is defined by " +":c:member:`~Py_buffer.itemsize`, :c:member:`~Py_buffer.ndim`, " +":c:member:`~Py_buffer.shape` and :c:member:`~Py_buffer.strides`." +msgstr "" +"NumPy 风格数组的逻辑结构由 " +":c:member:`~Py_buffer.itemsize`、:c:member:`~Py_buffer.ndim`、:c:member:`~Py_buffer.shape`" +" 和 :c:member:`~Py_buffer.strides` 定义。" + +#: ../../c-api/buffer.rst:373 +msgid "" +"If ``ndim == 0``, the memory location pointed to by " +":c:member:`~Py_buffer.buf` is interpreted as a scalar of size " +":c:member:`~Py_buffer.itemsize`. In that case, both " +":c:member:`~Py_buffer.shape` and :c:member:`~Py_buffer.strides` are " +"``NULL``." +msgstr "" +"如果 ``ndim == 0``,:c:member:`~Py_buffer.buf` 指向的内存位置被解释为大小为 " +":c:member:`~Py_buffer.itemsize` 的标量。这时,:c:member:`~Py_buffer.shape` 和 " +":c:member:`~Py_buffer.strides` 都为 ``NULL``。" + +#: ../../c-api/buffer.rst:377 +msgid "" +"If :c:member:`~Py_buffer.strides` is ``NULL``, the array is interpreted as a" +" standard n-dimensional C-array. Otherwise, the consumer must access an " +"n-dimensional array as follows:" +msgstr "" +"如果 :c:member:`~Py_buffer.strides` 为 ``NULL``,则数组将被解释为一个标准的 n 维 C " +"语言数组。否则,消费者程序必须按如下方式访问 n 维数组:" + +#: ../../c-api/buffer.rst:381 +msgid "" +"ptr = (char *)buf + indices[0] * strides[0] + ... + indices[n-1] * strides[n-1];\n" +"item = *((typeof(item) *)ptr);" +msgstr "" +"ptr = (char *)buf + indices[0] * strides[0] + ... + indices[n-1] * strides[n-1];\n" +"item = *((typeof(item) *)ptr);" + +#: ../../c-api/buffer.rst:387 +msgid "" +"As noted above, :c:member:`~Py_buffer.buf` can point to any location within " +"the actual memory block. An exporter can check the validity of a buffer with" +" this function:" +msgstr "如上所述,:c:member:`~Py_buffer.buf` 可以指向实际内存块中的任意位置。输出者程序可以用该函数检查缓冲区的有效性。" + +#: ../../c-api/buffer.rst:391 +msgid "" +"def verify_structure(memlen, itemsize, ndim, shape, strides, offset):\n" +" \"\"\"Verify that the parameters represent a valid array within\n" +" the bounds of the allocated memory:\n" +" char *mem: start of the physical memory block\n" +" memlen: length of the physical memory block\n" +" offset: (char *)buf - mem\n" +" \"\"\"\n" +" if offset % itemsize:\n" +" return False\n" +" if offset < 0 or offset+itemsize > memlen:\n" +" return False\n" +" if any(v % itemsize for v in strides):\n" +" return False\n" +"\n" +" if ndim <= 0:\n" +" return ndim == 0 and not shape and not strides\n" +" if 0 in shape:\n" +" return True\n" +"\n" +" imin = sum(strides[j]*(shape[j]-1) for j in range(ndim)\n" +" if strides[j] <= 0)\n" +" imax = sum(strides[j]*(shape[j]-1) for j in range(ndim)\n" +" if strides[j] > 0)\n" +"\n" +" return 0 <= offset+imin and offset+imax+itemsize <= memlen" +msgstr "" +"def verify_structure(memlen, itemsize, ndim, shape, strides, offset):\n" +" \"\"\"验证形参代表已分配内存范围内一个可用的数组:\n" +" char *mem: 物理内存块的起始\n" +" memlen: 物理内存块的长度\n" +" offset: (char *)buf - mem\n" +" \"\"\"\n" +" if offset % itemsize:\n" +" return False\n" +" if offset < 0 or offset+itemsize > memlen:\n" +" return False\n" +" if any(v % itemsize for v in strides):\n" +" return False\n" +"\n" +" if ndim <= 0:\n" +" return ndim == 0 and not shape and not strides\n" +" if 0 in shape:\n" +" return True\n" +"\n" +" imin = sum(strides[j]*(shape[j]-1) for j in range(ndim)\n" +" if strides[j] <= 0)\n" +" imax = sum(strides[j]*(shape[j]-1) for j in range(ndim)\n" +" if strides[j] > 0)\n" +"\n" +" return 0 <= offset+imin and offset+imax+itemsize <= memlen" + +#: ../../c-api/buffer.rst:421 +msgid "PIL-style: shape, strides and suboffsets" +msgstr "PIL-风格:形状,步幅和子偏移量" + +#: ../../c-api/buffer.rst:423 +msgid "" +"In addition to the regular items, PIL-style arrays can contain pointers that" +" must be followed in order to get to the next element in a dimension. For " +"example, the regular three-dimensional C-array ``char v[2][2][3]`` can also " +"be viewed as an array of 2 pointers to 2 two-dimensional arrays: ``char " +"(*v[2])[2][3]``. In suboffsets representation, those two pointers can be " +"embedded at the start of :c:member:`~Py_buffer.buf`, pointing to two ``char " +"x[2][3]`` arrays that can be located anywhere in memory." +msgstr "" +"除了常规项之外,PIL 风格的数组还可以包含指针,必须跟随这些指针才能到达维度的下一个元素。 例如,常规的三维 C 语言数组 ``char " +"v[2][2][3]`` 可以看作是一个指向 2 个二维数组的 2 个指针: ``char (*v[2])[2][3]``。 " +"在子偏移表示中,这两个指针可以嵌入在 :c:member:`~Py_buffer.buf` 的开头,指向两个可以位于内存任何位置的 ``char " +"x[2][3]`` 数组。" + +#: ../../c-api/buffer.rst:432 +msgid "" +"Here is a function that returns a pointer to the element in an N-D array " +"pointed to by an N-dimensional index when there are both non-``NULL`` " +"strides and suboffsets::" +msgstr "这是一个函数,当存在非 ``NULL`` 的步长和子偏移量时,它返回一个指向 N 维索引所指向的 N 维数组中元素的指针" + +#: ../../c-api/buffer.rst:436 +msgid "" +"void *get_item_pointer(int ndim, void *buf, Py_ssize_t *strides,\n" +" Py_ssize_t *suboffsets, Py_ssize_t *indices) {\n" +" char *pointer = (char*)buf;\n" +" int i;\n" +" for (i = 0; i < ndim; i++) {\n" +" pointer += strides[i] * indices[i];\n" +" if (suboffsets[i] >=0 ) {\n" +" pointer = *((char**)pointer) + suboffsets[i];\n" +" }\n" +" }\n" +" return (void*)pointer;\n" +"}" +msgstr "" +"void *get_item_pointer(int ndim, void *buf, Py_ssize_t *strides,\n" +" Py_ssize_t *suboffsets, Py_ssize_t *indices) {\n" +" char *pointer = (char*)buf;\n" +" int i;\n" +" for (i = 0; i < ndim; i++) {\n" +" pointer += strides[i] * indices[i];\n" +" if (suboffsets[i] >=0 ) {\n" +" pointer = *((char**)pointer) + suboffsets[i];\n" +" }\n" +" }\n" +" return (void*)pointer;\n" +"}" + +#: ../../c-api/buffer.rst:451 +msgid "Buffer-related functions" +msgstr "缓冲区相关函数" + +#: ../../c-api/buffer.rst:455 +msgid "" +"Return ``1`` if *obj* supports the buffer interface otherwise ``0``. When " +"``1`` is returned, it doesn't guarantee that :c:func:`PyObject_GetBuffer` " +"will succeed. This function always succeeds." +msgstr "" +"如果 *obj* 支持缓冲区接口,则返回 ``1``,否则返回 ``0``。返回 ``1`` 时不保证 " +":c:func:`PyObject_GetBuffer` 一定成功。本函数一定调用成功。" + +#: ../../c-api/buffer.rst:462 +msgid "" +"Send a request to *exporter* to fill in *view* as specified by *flags*. If " +"the exporter cannot provide a buffer of the exact type, it MUST raise " +":exc:`BufferError`, set ``view->obj`` to ``NULL`` and return ``-1``." +msgstr "" +"向 *exporter* 发送请求以按照 *flags* 指定的内容填充 *view*。如果 exporter 无法提供要求类型的缓冲区,则它必须引发 " +":exc:`BufferError`,将 ``view->obj`` 设为 ``NULL`` 并返回 ``-1``。" + +#: ../../c-api/buffer.rst:467 +msgid "" +"On success, fill in *view*, set ``view->obj`` to a new reference to " +"*exporter* and return 0. In the case of chained buffer providers that " +"redirect requests to a single object, ``view->obj`` MAY refer to this object" +" instead of *exporter* (See :ref:`Buffer Object Structures `)." +msgstr "" +"成功时,填充 *view*,将 ``view->obj`` 设为对 *exporter* 的新引用,并返回 0。 " +"当链式缓冲区提供程序将请求重定向到一个对象时,``view->obj`` 可以引用该对象而不是 *exporter* (参见 " +":ref:`缓冲区对象结构 `)。" + +#: ../../c-api/buffer.rst:472 +msgid "" +"Successful calls to :c:func:`PyObject_GetBuffer` must be paired with calls " +"to :c:func:`PyBuffer_Release`, similar to :c:func:`malloc` and " +":c:func:`free`. Thus, after the consumer is done with the buffer, " +":c:func:`PyBuffer_Release` must be called exactly once." +msgstr "" +"对 :c:func:`PyObject_GetBuffer` 的成功调用必须与对 :c:func:`PyBuffer_Release` " +"的调用配对,类似于 :c:func:`malloc` 和 :c:func:`free`。因此,消费者程序用完缓冲区后,必须恰好调用一次 " +":c:func:`PyBuffer_Release` 函数。" + +#: ../../c-api/buffer.rst:480 +msgid "" +"Release the buffer *view* and release the :term:`strong reference` (i.e. " +"decrement the reference count) to the view's supporting object, " +"``view->obj``. This function MUST be called when the buffer is no longer " +"being used, otherwise reference leaks may occur." +msgstr "" +"释放缓冲区 *view* 并释放对视图的支持对象 ``view->obj`` 的 :term:`strong reference` (即递减引用计数)。" +" 该函数必须在缓冲区不再使用时调用,否则可能会发生引用泄漏。" + +#: ../../c-api/buffer.rst:485 +msgid "" +"It is an error to call this function on a buffer that was not obtained via " +":c:func:`PyObject_GetBuffer`." +msgstr "若该函数针对的缓冲区不是通过 :c:func:`PyObject_GetBuffer` 获得的,将会出错。" + +#: ../../c-api/buffer.rst:491 +msgid "" +"Return the implied :c:member:`~Py_buffer.itemsize` from " +":c:member:`~Py_buffer.format`. On error, raise an exception and return -1." +msgstr "" +"从 :c:member:`~Py_buffer.format` 返回隐含的 :c:member:`~Py_buffer.itemsize`。 " +"如果出错,则引发异常并返回 -1。" + +#: ../../c-api/buffer.rst:499 +msgid "" +"Return ``1`` if the memory defined by the *view* is C-style (*order* is " +"``'C'``) or Fortran-style (*order* is ``'F'``) :term:`contiguous` or either " +"one (*order* is ``'A'``). Return ``0`` otherwise. This function always " +"succeeds." +msgstr "" +"如果 *view* 定义的内存是 C 风格 (*order* 为 ``'C'``) 或 Fortran 风格 (*order* 为 ``'F'``) " +":term:`contiguous` 或其中之一 (*order* 是 ``'A'``),则返回 ``1``。否则返回 ``0``。该函数总会成功。" + +#: ../../c-api/buffer.rst:506 +msgid "" +"Get the memory area pointed to by the *indices* inside the given *view*. " +"*indices* must point to an array of ``view->ndim`` indices." +msgstr "" +"获取给定 *view* 内的 *indices* 所指向的内存区域。*indices* 必须指向一个 ``view->ndim`` 索引的数组。" + +#: ../../c-api/buffer.rst:512 +msgid "" +"Copy contiguous *len* bytes from *buf* to *view*. *fort* can be ``'C'`` or " +"``'F'`` (for C-style or Fortran-style ordering). ``0`` is returned on " +"success, ``-1`` on error." +msgstr "" +"从 *buf* 复制连续的 *len* 字节到 *view*。 *fort* 可以是 ``'C'`` 或 ``'F'`` (对应于 C 风格或 " +"Fortran 风格的顺序)。 成功时返回 ``0``,错误时返回 ``-1``。" + +#: ../../c-api/buffer.rst:519 +msgid "" +"Copy *len* bytes from *src* to its contiguous representation in *buf*. " +"*order* can be ``'C'`` or ``'F'`` or ``'A'`` (for C-style or Fortran-style " +"ordering or either one). ``0`` is returned on success, ``-1`` on error." +msgstr "" +"从 *src* 复制 *len* 字节到 *buf* ,成为连续字节串的形式。*order* 可以是 ``'C'`` 或 ``'F'`` 或 " +"``'A'`` (对应于 C 风格、Fortran 风格的顺序或其中任意一种)。成功时返回 ``0``,出错时返回 ``-1``。" + +#: ../../c-api/buffer.rst:523 +msgid "This function fails if *len* != *src->len*." +msgstr "如果 *len* != *src->len* 则此函数将报错。" + +#: ../../c-api/buffer.rst:528 +msgid "" +"Copy data from *src* to *dest* buffer. Can convert between C-style and or " +"Fortran-style buffers." +msgstr "将数据从 *src* 拷贝到 *dest* 缓冲区。可以在 C 风格或 Fortran 风格的缓冲区之间进行转换。" + +#: ../../c-api/buffer.rst:531 +msgid "``0`` is returned on success, ``-1`` on error." +msgstr "成功时返回 ``0``,出错时返回 ``-1``。" + +#: ../../c-api/buffer.rst:535 +msgid "" +"Fill the *strides* array with byte-strides of a :term:`contiguous` (C-style " +"if *order* is ``'C'`` or Fortran-style if *order* is ``'F'``) array of the " +"given shape with the given number of bytes per element." +msgstr "" +"用给定形状的 :term:`contiguous` 字节串数组 (如果 *order* 为 ``'C'`` 则为 C 风格,如果 *order* 为 " +"``'F'`` 则为 Fortran 风格) 来填充 *strides* 数组,每个元素具有给定的字节数。" + +#: ../../c-api/buffer.rst:542 +msgid "" +"Handle buffer requests for an exporter that wants to expose *buf* of size " +"*len* with writability set according to *readonly*. *buf* is interpreted as " +"a sequence of unsigned bytes." +msgstr "" +"处理导出程序的缓冲区请求,该导出程序要公开大小为 *len* 的 *buf* ,并根据 *readonly* 设置可写性。*buf* " +"被解释为一个无符号字节序列。" + +#: ../../c-api/buffer.rst:546 +msgid "" +"The *flags* argument indicates the request type. This function always fills " +"in *view* as specified by flags, unless *buf* has been designated as read-" +"only and :c:macro:`PyBUF_WRITABLE` is set in *flags*." +msgstr "" +"参数 *flags* 表示请求的类型。该函数总是按照 *flags* 指定的内容填入 *view*,除非 *buf* 设为只读,并且 *flags* " +"中设置了 :c:macro:`PyBUF_WRITABLE` 标志。" + +#: ../../c-api/buffer.rst:550 +msgid "" +"On success, set ``view->obj`` to a new reference to *exporter* and return 0." +" Otherwise, raise :exc:`BufferError`, set ``view->obj`` to ``NULL`` and " +"return ``-1``;" +msgstr "" +"成功时,将 ``view->obj`` 设为对 *exporter* 的新引用并返回 0。否则,引发 :exc:`BufferError`,将 " +"``view->obj`` 设为 ``NULL`` 并返回 ``-1``;" + +#: ../../c-api/buffer.rst:554 +msgid "" +"If this function is used as part of a :ref:`getbufferproc `," +" *exporter* MUST be set to the exporting object and *flags* must be passed " +"unmodified. Otherwise, *exporter* MUST be ``NULL``." +msgstr "" +"如果此函数用作 :ref:`getbufferproc ` 的一部分,则 *exporter* " +"必须设置为导出对象,并且必须在未修改的情况下传递 *flags*。否则,*exporter* 必须是 ``NULL``。" + +#: ../../c-api/buffer.rst:3 +msgid "buffer protocol" +msgstr "缓冲协议" + +#: ../../c-api/buffer.rst:3 +msgid "buffer interface" +msgstr "缓冲接口" + +#: ../../c-api/buffer.rst:3 +msgid "(see buffer protocol)" +msgstr "(参见缓冲协议)" + +#: ../../c-api/buffer.rst:3 +msgid "buffer object" +msgstr "缓冲对象" + +#: ../../c-api/buffer.rst:32 +msgid "PyBufferProcs (C type)" +msgstr "PyBufferProcs (C 类型)" + +#: ../../c-api/buffer.rst:307 +msgid "contiguous" +msgstr "contiguous -- 连续" + +#: ../../c-api/buffer.rst:307 +msgid "C-contiguous" +msgstr "C 连续" + +#: ../../c-api/buffer.rst:307 +msgid "Fortran contiguous" +msgstr "Fortran 连续" diff --git a/c-api/bytearray.po b/c-api/bytearray.po new file mode 100644 index 0000000000..4bda815bc7 --- /dev/null +++ b/c-api/bytearray.po @@ -0,0 +1,137 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/bytearray.rst:6 +msgid "Byte Array Objects" +msgstr "字节数组对象" + +#: ../../c-api/bytearray.rst:13 +msgid "" +"This subtype of :c:type:`PyObject` represents a Python bytearray object." +msgstr "这个 :c:type:`PyObject` 的子类型表示一个 Python 字节数组对象。" + +#: ../../c-api/bytearray.rst:18 +msgid "" +"This instance of :c:type:`PyTypeObject` represents the Python bytearray " +"type; it is the same object as :class:`bytearray` in the Python layer." +msgstr "" +"Python bytearray 类型表示为 :c:type:`PyTypeObject` 的实例;这与 Python 层面的 " +":class:`bytearray` 是相同的对象。" + +#: ../../c-api/bytearray.rst:23 +msgid "Type check macros" +msgstr "类型检查宏" + +#: ../../c-api/bytearray.rst:27 +msgid "" +"Return true if the object *o* is a bytearray object or an instance of a " +"subtype of the bytearray type. This function always succeeds." +msgstr "如果对象 *o* 是一个 bytearray 对象或者 bytearray 类型的子类型的实例则返回真值。此函数总是会成功执行。" + +#: ../../c-api/bytearray.rst:33 +msgid "" +"Return true if the object *o* is a bytearray object, but not an instance of " +"a subtype of the bytearray type. This function always succeeds." +msgstr "如果对象 *o* 是一个 bytearray 对象但不是 bytearray 类型的子类型的实例则返回真值。此函数总是会成功执行。" + +#: ../../c-api/bytearray.rst:38 +msgid "Direct API functions" +msgstr "直接 API 函数" + +#: ../../c-api/bytearray.rst:42 +msgid "" +"Return a new bytearray object from any object, *o*, that implements the " +":ref:`buffer protocol `." +msgstr "根据任何实现了 :ref:`缓冲区协议` 的对象 *o*,返回一个新的字节数组对象。" + +#: ../../c-api/bytearray.rst:45 ../../c-api/bytearray.rst:56 +#: ../../c-api/bytearray.rst:63 +msgid "On failure, return ``NULL`` with an exception set." +msgstr "当失败时,将返回 ``NULL`` 并设置一个异常。" + +#: ../../c-api/bytearray.rst:48 ../../c-api/bytearray.rst:66 +msgid "" +"If the object implements the buffer protocol, then the buffer must not be " +"mutated while the bytearray object is being created." +msgstr "如果对象实现了缓冲区协议,则缓冲区在 bytearray 对象创建时不可被修改。" + +#: ../../c-api/bytearray.rst:54 +msgid "Create a new bytearray object from *string* and its length, *len*." +msgstr "根据 *string* 和它的长度 *len* 新建一个字节数组对象。" + +#: ../../c-api/bytearray.rst:61 +msgid "" +"Concat bytearrays *a* and *b* and return a new bytearray with the result." +msgstr "连接字节数组 *a* 和 *b* 并返回一个带有结果的新的字节数组。" + +#: ../../c-api/bytearray.rst:72 +msgid "Return the size of *bytearray* after checking for a ``NULL`` pointer." +msgstr "在检查 ``NULL`` 指针后返回 *bytearray* 的大小。" + +#: ../../c-api/bytearray.rst:77 +msgid "" +"Return the contents of *bytearray* as a char array after checking for a " +"``NULL`` pointer. The returned array always has an extra null byte " +"appended." +msgstr "在检查 ``NULL`` 指针后将 *bytearray* 的内容作为一个字符数组返回。返回的数组总是会附加一个额外的空字节。" + +#: ../../c-api/bytearray.rst:82 ../../c-api/bytearray.rst:104 +msgid "" +"It is not thread-safe to mutate the bytearray object while using the " +"returned char array." +msgstr "在使用返回的字符数组时修改 bytearray 对象将不是线程安全的。" + +#: ../../c-api/bytearray.rst:87 +msgid "" +"Resize the internal buffer of *bytearray* to *len*. Failure is a ``-1`` " +"return with an exception set." +msgstr "将 *bytearray* 的内部缓冲区调整为 *len*。失败时返回 ``-1``,并设置一个异常。" + +#: ../../c-api/bytearray.rst:90 +msgid "" +"A negative *len* will now result in an exception being set and -1 returned." +msgstr "现在,为负的 *len* 将导致异常并返回 -1。" + +#: ../../c-api/bytearray.rst:95 +msgid "Macros" +msgstr "宏" + +#: ../../c-api/bytearray.rst:97 +msgid "These macros trade safety for speed and they don't check pointers." +msgstr "这些宏减低安全性以换取性能,它们不检查指针。" + +#: ../../c-api/bytearray.rst:101 +msgid "Similar to :c:func:`PyByteArray_AsString`, but without error checking." +msgstr "类似于 :c:func:`PyByteArray_AsString`,但是不带错误检测。" + +#: ../../c-api/bytearray.rst:109 +msgid "Similar to :c:func:`PyByteArray_Size`, but without error checking." +msgstr "类似于 :c:func:`PyByteArray_Size`,但是不带错误检测。" + +#: ../../c-api/bytearray.rst:8 +msgid "object" +msgstr "object -- 对象" + +#: ../../c-api/bytearray.rst:8 +msgid "bytearray" +msgstr "bytearray" diff --git a/c-api/bytes.po b/c-api/bytes.po new file mode 100644 index 0000000000..e86bb7ec18 --- /dev/null +++ b/c-api/bytes.po @@ -0,0 +1,469 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-01 17:14+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/bytes.rst:6 +msgid "Bytes Objects" +msgstr "bytes 对象" + +#: ../../c-api/bytes.rst:8 +msgid "" +"These functions raise :exc:`TypeError` when expecting a bytes parameter and " +"called with a non-bytes parameter." +msgstr "这些函数在期望附带一个字节串形参但却附带了一个非字节串形参被调用时会引发 :exc:`TypeError`。" + +#: ../../c-api/bytes.rst:16 +msgid "This subtype of :c:type:`PyObject` represents a Python bytes object." +msgstr "这种 :c:type:`PyObject` 的子类型表示一个 Python 字节对象。" + +#: ../../c-api/bytes.rst:21 +msgid "" +"This instance of :c:type:`PyTypeObject` represents the Python bytes type; it" +" is the same object as :class:`bytes` in the Python layer." +msgstr "" +":c:type:`PyTypeObject` 的实例代表一个 Python 字节类型,在 Python 层面它与 :class:`bytes` " +"是相同的对象。" + +#: ../../c-api/bytes.rst:27 +msgid "" +"Return true if the object *o* is a bytes object or an instance of a subtype " +"of the bytes type. This function always succeeds." +msgstr "如果对象 *o* 是一个 bytes 对象或者 bytes 类型的子类型的实例则返回真值。此函数总是会成功执行。" + +#: ../../c-api/bytes.rst:33 +msgid "" +"Return true if the object *o* is a bytes object, but not an instance of a " +"subtype of the bytes type. This function always succeeds." +msgstr "如果对象 *o* 是一个 bytes 对象但不是 bytes 类型的子类型的实例则返回真值。此函数总是会成功执行。" + +#: ../../c-api/bytes.rst:39 +msgid "" +"Return a new bytes object with a copy of the string *v* as value on success," +" and ``NULL`` on failure. The parameter *v* must not be ``NULL``; it will " +"not be checked." +msgstr "" +"成功时返回一个以字符串 *v* 的副本为值的新字节串对象,失败时返回 ``NULL``。形参 *v* 不可为 ``NULL``;它不会被检查。" + +#: ../../c-api/bytes.rst:46 +msgid "" +"Return a new bytes object with a copy of the string *v* as value and length " +"*len* on success, and ``NULL`` on failure. If *v* is ``NULL``, the contents" +" of the bytes object are uninitialized." +msgstr "" +"成功时返回一个以字符串 *v* 的副本为值且长度为 *len* 的新字节串对象,失败时返回 ``NULL``。如果 *v* 为 " +"``NULL``,则不初始化字节串对象的内容。" + +#: ../../c-api/bytes.rst:53 +msgid "" +"Take a C :c:func:`printf`\\ -style *format* string and a variable number of " +"arguments, calculate the size of the resulting Python bytes object and " +"return a bytes object with the values formatted into it. The variable " +"arguments must be C types and must correspond exactly to the format " +"characters in the *format* string. The following format characters are " +"allowed:" +msgstr "" +"接受一个 C :c:func:`printf` 风格的 *format* 字符串和可变数量的参数,计算结果 Python " +"字节串对象的大小并返回参数值经格式化后的字节串对象。可变数量的参数必须均为 C 类型并且必须恰好与 *format* " +"字符串中的格式字符相对应。允许使用下列格式字符:" + +#: ../../c-api/bytes.rst:65 +msgid "Format Characters" +msgstr "格式字符" + +#: ../../c-api/bytes.rst:65 +msgid "Type" +msgstr "类型" + +#: ../../c-api/bytes.rst:65 +msgid "Comment" +msgstr "注释" + +#: ../../c-api/bytes.rst:67 +msgid "``%%``" +msgstr "``%%``" + +#: ../../c-api/bytes.rst:67 +msgid "*n/a*" +msgstr "*不适用*" + +#: ../../c-api/bytes.rst:67 +msgid "The literal % character." +msgstr "文字%字符。" + +#: ../../c-api/bytes.rst:69 +msgid "``%c``" +msgstr "``%c``" + +#: ../../c-api/bytes.rst:69 ../../c-api/bytes.rst:72 ../../c-api/bytes.rst:90 +#: ../../c-api/bytes.rst:93 +msgid "int" +msgstr "int" + +#: ../../c-api/bytes.rst:69 +msgid "A single byte, represented as a C int." +msgstr "一个字节,被表示为一个 C int。" + +#: ../../c-api/bytes.rst:72 +msgid "``%d``" +msgstr "``%d``" + +#: ../../c-api/bytes.rst:72 +msgid "Equivalent to ``printf(\"%d\")``. [1]_" +msgstr "相当于 ``printf(\"%d\")``。[1]_" + +#: ../../c-api/bytes.rst:75 +msgid "``%u``" +msgstr "``%u``" + +#: ../../c-api/bytes.rst:75 +msgid "unsigned int" +msgstr "unsigned int" + +#: ../../c-api/bytes.rst:75 +msgid "Equivalent to ``printf(\"%u\")``. [1]_" +msgstr "相当于 ``printf(\"%u\")``。[1]_" + +#: ../../c-api/bytes.rst:78 +msgid "``%ld``" +msgstr "``%ld``" + +#: ../../c-api/bytes.rst:78 +msgid "long" +msgstr "long" + +#: ../../c-api/bytes.rst:78 +msgid "Equivalent to ``printf(\"%ld\")``. [1]_" +msgstr "相当于 ``printf(\"%ld\")``。[1]_" + +#: ../../c-api/bytes.rst:81 +msgid "``%lu``" +msgstr "``%lu``" + +#: ../../c-api/bytes.rst:81 +msgid "unsigned long" +msgstr "unsigned long" + +#: ../../c-api/bytes.rst:81 +msgid "Equivalent to ``printf(\"%lu\")``. [1]_" +msgstr "相当于 ``printf(\"%lu\")``。[1]_" + +#: ../../c-api/bytes.rst:84 +msgid "``%zd``" +msgstr "``%zd``" + +#: ../../c-api/bytes.rst:84 +msgid ":c:type:`\\ Py_ssize_t`" +msgstr ":c:type:`\\ Py_ssize_t`" + +#: ../../c-api/bytes.rst:84 +msgid "Equivalent to ``printf(\"%zd\")``. [1]_" +msgstr "相当于 ``printf(\"%zd\")``。[1]_" + +#: ../../c-api/bytes.rst:87 +msgid "``%zu``" +msgstr "``%zu``" + +#: ../../c-api/bytes.rst:87 +msgid "size_t" +msgstr "size_t" + +#: ../../c-api/bytes.rst:87 +msgid "Equivalent to ``printf(\"%zu\")``. [1]_" +msgstr "相当于 ``printf(\"%zu\")``。[1]_" + +#: ../../c-api/bytes.rst:90 +msgid "``%i``" +msgstr "``%i``" + +#: ../../c-api/bytes.rst:90 +msgid "Equivalent to ``printf(\"%i\")``. [1]_" +msgstr "相当于 ``printf(\"%i\")``。[1]_" + +#: ../../c-api/bytes.rst:93 +msgid "``%x``" +msgstr "``%x``" + +#: ../../c-api/bytes.rst:93 +msgid "Equivalent to ``printf(\"%x\")``. [1]_" +msgstr "相当于 ``printf(\"%x\")``。[1]_" + +#: ../../c-api/bytes.rst:96 +msgid "``%s``" +msgstr "``%s``" + +#: ../../c-api/bytes.rst:96 +msgid "const char\\*" +msgstr "const char\\*" + +#: ../../c-api/bytes.rst:96 +msgid "A null-terminated C character array." +msgstr "以 null 为终止符的 C 字符数组。" + +#: ../../c-api/bytes.rst:99 +msgid "``%p``" +msgstr "``%p``" + +#: ../../c-api/bytes.rst:99 +msgid "const void\\*" +msgstr "const void\\*" + +#: ../../c-api/bytes.rst:99 +msgid "" +"The hex representation of a C pointer. Mostly equivalent to " +"``printf(\"%p\")`` except that it is guaranteed to start with the literal " +"``0x`` regardless of what the platform's ``printf`` yields." +msgstr "" +"一个 C 指针的十六进制表示形式。基本等价于 ``printf(\"%p\")`` 但它会确保以字面值 ``0x`` 开头,不论系统平台上 " +"``printf`` 的输出是什么。" + +#: ../../c-api/bytes.rst:108 +msgid "" +"An unrecognized format character causes all the rest of the format string to" +" be copied as-is to the result object, and any extra arguments discarded." +msgstr "无法识别的格式字符会导致将格式字符串的其余所有内容原样复制到结果对象,并丢弃所有多余的参数。" + +#: ../../c-api/bytes.rst:111 +msgid "" +"For integer specifiers (d, u, ld, lu, zd, zu, i, x): the 0-conversion flag " +"has effect even when a precision is given." +msgstr "对于整数说明符(d,u,ld,lu,zd,zu,i,x):当给出精度时,0 转换标志是有效的。" + +#: ../../c-api/bytes.rst:117 +msgid "" +"Identical to :c:func:`PyBytes_FromFormat` except that it takes exactly two " +"arguments." +msgstr "与 :c:func:`PyBytes_FromFormat` 完全相同,除了它需要两个参数。" + +#: ../../c-api/bytes.rst:123 +msgid "" +"Return the bytes representation of object *o* that implements the buffer " +"protocol." +msgstr "返回实现了缓冲区协议的对象 *o* 的字节串表示形式。" + +#: ../../c-api/bytes.rst:127 +msgid "" +"If the object implements the buffer protocol, then the buffer must not be " +"mutated while the bytes object is being created." +msgstr "" + +#: ../../c-api/bytes.rst:133 +msgid "Return the length of the bytes in bytes object *o*." +msgstr "返回字节串对象 *o* 中字节的长度。" + +#: ../../c-api/bytes.rst:138 +msgid "Similar to :c:func:`PyBytes_Size`, but without error checking." +msgstr "类似于 :c:func:`PyBytes_Size`,但是不带错误检测。" + +#: ../../c-api/bytes.rst:143 +msgid "" +"Return a pointer to the contents of *o*. The pointer refers to the internal" +" buffer of *o*, which consists of ``len(o) + 1`` bytes. The last byte in " +"the buffer is always null, regardless of whether there are any other null " +"bytes. The data must not be modified in any way, unless the object was just" +" created using ``PyBytes_FromStringAndSize(NULL, size)``. It must not be " +"deallocated. If *o* is not a bytes object at all, " +":c:func:`PyBytes_AsString` returns ``NULL`` and raises :exc:`TypeError`." +msgstr "" +"返回对应 *o* 的内容的指针。该指针指向 *o* 的内部缓冲区,其中包含 ``len(o) + 1`` " +"个字节。缓冲区的最后一个字节总是为空,不论是否存在其他空字节。该数据不可通过任何形式来修改,除非是刚使用 " +"``PyBytes_FromStringAndSize(NULL, size)`` 创建该对象。它不可被撤销分配。如果 *o* " +"根本不是一个字节串对象,则 :c:func:`PyBytes_AsString` 将返回 ``NULL`` 并引发 :exc:`TypeError`。" + +#: ../../c-api/bytes.rst:155 +msgid "Similar to :c:func:`PyBytes_AsString`, but without error checking." +msgstr "类似于 :c:func:`PyBytes_AsString`,但是不带错误检测。" + +#: ../../c-api/bytes.rst:160 +msgid "" +"Return the null-terminated contents of the object *obj* through the output " +"variables *buffer* and *length*. Returns ``0`` on success." +msgstr "通过输出变量 *buffer* 和 *length* 返回对象 *obj* 以空值作为结束的内容。成功时返回 ``0``。" + +#: ../../c-api/bytes.rst:164 +msgid "" +"If *length* is ``NULL``, the bytes object may not contain embedded null " +"bytes; if it does, the function returns ``-1`` and a :exc:`ValueError` is " +"raised." +msgstr "" +"如果 *length* 为 ``NULL``,字节串对象不可包含嵌入的空字节;如果包含,则该函数将返回 ``-1`` 并引发 " +":exc:`ValueError` 异常。" + +#: ../../c-api/bytes.rst:168 +msgid "" +"The buffer refers to an internal buffer of *obj*, which includes an " +"additional null byte at the end (not counted in *length*). The data must " +"not be modified in any way, unless the object was just created using " +"``PyBytes_FromStringAndSize(NULL, size)``. It must not be deallocated. If " +"*obj* is not a bytes object at all, :c:func:`PyBytes_AsStringAndSize` " +"returns ``-1`` and raises :exc:`TypeError`." +msgstr "" +"该缓冲区指向 *obj* 的内部缓冲,它的末尾包含一个额外的空字节(不算在 *length* 当中)。该数据不可通过任何方式来修改,除非是刚使用 " +"``PyBytes_FromStringAndSize(NULL, size)`` 创建该对象。它不可被撤销分配。如果 *obj* " +"根本不是一个字节串对象,则 :c:func:`PyBytes_AsStringAndSize` 将返回 ``-1`` 并引发 " +":exc:`TypeError` 异常。" + +#: ../../c-api/bytes.rst:175 +msgid "" +"Previously, :exc:`TypeError` was raised when embedded null bytes were " +"encountered in the bytes object." +msgstr "以前,当字节串对象中出现嵌入的空字节时将引发 :exc:`TypeError`。" + +#: ../../c-api/bytes.rst:182 +msgid "" +"Create a new bytes object in *\\*bytes* containing the contents of *newpart*" +" appended to *bytes*; the caller will own the new reference. The reference " +"to the old value of *bytes* will be \":term:`stolen `\". If the new " +"object cannot be created, the old reference to *bytes* will still be " +"\"stolen\", the value of *\\*bytes* will be set to ``NULL``, and the " +"appropriate exception will be set." +msgstr "" + +#: ../../c-api/bytes.rst:190 ../../c-api/bytes.rst:200 +msgid "" +"If *newpart* implements the buffer protocol, then the buffer must not be " +"mutated while the new bytes object is being created." +msgstr "" + +#: ../../c-api/bytes.rst:195 +msgid "" +"Create a new bytes object in *\\*bytes* containing the contents of *newpart*" +" appended to *bytes*. This version releases the :term:`strong reference` to" +" *newpart* (i.e. decrements its reference count)." +msgstr "" +"在 *\\*bytes* 中创建一个新的字节串对象,其中包含添加到 *bytes* 的 *newpart* 的内容。此版本将释放对 *newpart* " +"的 :term:`strong reference` (即递减其引用计数)。" + +#: ../../c-api/bytes.rst:206 +msgid "Similar to ``sep.join(iterable)`` in Python." +msgstr "类似于 Python 中的 ``sep.join(iterable)``。" + +#: ../../c-api/bytes.rst:208 +msgid "" +"*sep* must be Python :class:`bytes` object. (Note that " +":c:func:`PyUnicode_Join` accepts ``NULL`` separator and treats it as a " +"space, whereas :c:func:`PyBytes_Join` doesn't accept ``NULL`` separator.)" +msgstr "" +"*sep* 必须为 Python :class:`bytes` 对象。 (请注意 :c:func:`PyUnicode_Join` 接受 " +"``NULL`` 分隔符并会将其视为空格,而 :c:func:`PyBytes_Join` 则不接受 ``NULL`` 分隔符。)" + +#: ../../c-api/bytes.rst:213 +msgid "" +"*iterable* must be an iterable object yielding objects that implement the " +":ref:`buffer protocol `." +msgstr "*iterable* 必须是一个产生实现了 :ref:`缓冲区协议 ` 的对象的可迭代对象。" + +#: ../../c-api/bytes.rst:216 +msgid "" +"On success, return a new :class:`bytes` object. On error, set an exception " +"and return ``NULL``." +msgstr "成功时,返回一个新的 :class:`bytes` 对象。失败时,设置一个异常并返回 ``NULL``。" + +#: ../../c-api/bytes.rst:222 +msgid "" +"If *iterable* objects implement the buffer protocol, then the buffers must " +"not be mutated while the new bytes object is being created." +msgstr "" + +#: ../../c-api/bytes.rst:227 +msgid "" +"Resize a bytes object. *newsize* will be the new length of the bytes object." +" You can think of it as creating a new bytes object and destroying the old " +"one, only more efficiently. Pass the address of an existing bytes object as " +"an lvalue (it may be written into), and the new size desired. On success, " +"*\\*bytes* holds the resized bytes object and ``0`` is returned; the address" +" in *\\*bytes* may differ from its input value. If the reallocation fails, " +"the original bytes object at *\\*bytes* is deallocated, *\\*bytes* is set to" +" ``NULL``, :exc:`MemoryError` is set, and ``-1`` is returned." +msgstr "" +"改变字节串对象的大小。*newsize* " +"将为字节串对象的新长度。你可以将它当作是创建一个新的字节串对象并销毁旧的对象,但是更为高效。传入一个现有字节串对象的地址作为 " +"lvalue(它可以被写入),以及想要的新大小。当成功时,*\\*bytes* 将存放改变大小后的字节串对象并返回 ``0``;*\\*bytes* " +"中的地址可能与其输入值不同。如果重新分配失败,则位于 *\\*bytes* 的原始字节串对象将被释放,*\\*bytes* 将被设为 " +"``NULL``,同时设置 :exc:`MemoryError`,然后返回 ``-1``。" + +#: ../../c-api/bytes.rst:241 +msgid "" +"Get the string representation of *bytes*. This function is currently used to" +" implement :meth:`!bytes.__repr__` in Python." +msgstr "获取 *bytes* 的字符串表示形式。此函数目前被用于实现 Python 中的 :meth:`!bytes.__repr__`。" + +#: ../../c-api/bytes.rst:244 +msgid "" +"This function does not do type checking; it is undefined behavior to pass " +"*bytes* as a non-bytes object or ``NULL``." +msgstr "此函数不会进行类型检测;向 *bytes* 传入非字节对象或 ``NULL`` 是未定义的行为。" + +#: ../../c-api/bytes.rst:247 +msgid "" +"If *smartquotes* is true, the representation will use a double-quoted string" +" instead of single-quoted string when single-quotes are present in *bytes*. " +"For example, the byte string ``'Python'`` would be represented as " +"``b\"'Python'\"`` when *smartquotes* is true, or ``b'\\'Python\\''`` when it" +" is false." +msgstr "" +"如果 *smartquotes* 为真值,表示形式将在 *bytes* 中存在单引号时使用带双引号的字符串而不是带单引号的字符串。例如,当 " +"*smartquotes* 为真值时字节串 ``'Python'`` 将被表示为 ``b\"'Python'\"``,当其为假值时则为 " +"``b'\\'Python\\''`` 这种形式。" + +#: ../../c-api/bytes.rst:253 +msgid "" +"On success, this function returns a :term:`strong reference` to a " +":class:`str` object containing the representation. On failure, this returns " +"``NULL`` with an exception set." +msgstr "" +"成功时,此函数将返回一个指向包含该表示形式的 :class:`str` 对象的 :term:`strong reference`。失败时,此函数将返回 " +"``NULL`` 并设置一个异常。" + +#: ../../c-api/bytes.rst:260 +msgid "" +"Unescape a backslash-escaped string *s*. *s* must not be ``NULL``. *len* " +"must be the size of *s*." +msgstr "取消带反斜杠转义的字符串 *s* 的转义。 *s* 必须不为 ``NULL``。 *len* 必须为 *s* 的长度。" + +#: ../../c-api/bytes.rst:263 +msgid "" +"*errors* must be one of ``\"strict\"``, ``\"replace\"``, or ``\"ignore\"``. " +"If *errors* is ``NULL``, then ``\"strict\"`` is used by default." +msgstr "" +"*errors* 必须为 ``\"strict\"``, ``\"replace\"`` 或 ``\"ignore\"`` 之一。如果 *errors*" +" 为 ``NULL``,则默认使用 ``\"strict\"``。" + +#: ../../c-api/bytes.rst:266 +msgid "" +"On success, this function returns a :term:`strong reference` to a Python " +":class:`bytes` object containing the unescaped string. On failure, this " +"function returns ``NULL`` with an exception set." +msgstr "" +"成功时,此函数将返回一个指向包含未转义文本的 Python :class:`bytes` 对象的 :term:`strong reference`。 " +"失败时,此函数将返回 ``NULL`` 并设置一个异常。" + +#: ../../c-api/bytes.rst:270 +msgid "*unicode* and *recode_encoding* are now unused." +msgstr "*unicode* 和 *recode_encoding* 现在未被使用。" + +#: ../../c-api/bytes.rst:11 +msgid "object" +msgstr "object -- 对象" + +#: ../../c-api/bytes.rst:11 +msgid "bytes" +msgstr "字节串" diff --git a/c-api/call.po b/c-api/call.po new file mode 100644 index 0000000000..26e4c53977 --- /dev/null +++ b/c-api/call.po @@ -0,0 +1,649 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/call.rst:6 +msgid "Call Protocol" +msgstr "调用协议" + +#: ../../c-api/call.rst:8 +msgid "" +"CPython supports two different calling protocols: *tp_call* and vectorcall." +msgstr "CPython 支持两种不同的调用协议:*tp_call* 和 vectorcall。" + +#: ../../c-api/call.rst:12 +msgid "The *tp_call* Protocol" +msgstr "*tp_call* 协议" + +#: ../../c-api/call.rst:14 +msgid "" +"Instances of classes that set :c:member:`~PyTypeObject.tp_call` are " +"callable. The signature of the slot is::" +msgstr "设置 :c:member:`~PyTypeObject.tp_call` 的类的实例都是可调用的。槽位的签名为::" + +#: ../../c-api/call.rst:17 +msgid "" +"PyObject *tp_call(PyObject *callable, PyObject *args, PyObject *kwargs);" +msgstr "" +"PyObject *tp_call(PyObject *callable, PyObject *args, PyObject *kwargs);" + +#: ../../c-api/call.rst:19 +msgid "" +"A call is made using a tuple for the positional arguments and a dict for the" +" keyword arguments, similarly to ``callable(*args, **kwargs)`` in Python " +"code. *args* must be non-NULL (use an empty tuple if there are no arguments)" +" but *kwargs* may be *NULL* if there are no keyword arguments." +msgstr "" +"一个调用会使用一个元组表示位置参数,使用一个 dict 表示关键字参数,类似于 Python 代码中的 ``callable(*args, " +"**kwargs)``。*args* 必须是非空的(如果没有参数,会使用一个空元组),但如果没有关键字参数,*kwargs* 可以是 *NULL*。" + +#: ../../c-api/call.rst:25 +msgid "" +"This convention is not only used by *tp_call*: " +":c:member:`~PyTypeObject.tp_new` and :c:member:`~PyTypeObject.tp_init` also " +"pass arguments this way." +msgstr "" +"这个约定不仅被*tp_call*使用: :c:member:`~PyTypeObject.tp_new` 和 " +":c:member:`~PyTypeObject.tp_init` 也这样传递参数。" + +#: ../../c-api/call.rst:29 +msgid "" +"To call an object, use :c:func:`PyObject_Call` or another :ref:`call API " +"`." +msgstr "要调用一个对象,请使用 :c:func:`PyObject_Call` 或者其他的 :ref:`调用 API `。" + +#: ../../c-api/call.rst:36 +msgid "The Vectorcall Protocol" +msgstr "Vectorcall 协议" + +#: ../../c-api/call.rst:40 +msgid "" +"The vectorcall protocol was introduced in :pep:`590` as an additional " +"protocol for making calls more efficient." +msgstr "vectorcall 协议是在 :pep:`590` 被引入的,它是使调用函数更加有效的附加协议。" + +#: ../../c-api/call.rst:43 +msgid "" +"As rule of thumb, CPython will prefer the vectorcall for internal calls if " +"the callable supports it. However, this is not a hard rule. Additionally, " +"some third-party extensions use *tp_call* directly (rather than using " +":c:func:`PyObject_Call`). Therefore, a class supporting vectorcall must also" +" implement :c:member:`~PyTypeObject.tp_call`. Moreover, the callable must " +"behave the same regardless of which protocol is used. The recommended way to" +" achieve this is by setting :c:member:`~PyTypeObject.tp_call` to " +":c:func:`PyVectorcall_Call`. This bears repeating:" +msgstr "" +"作为经验法则,如果可调用对象支持 vectorcall,CPython " +"会更倾向于在内部调用中使用它。然而,这并不是一个硬性规定。此外,一些第三方扩展直接使用 *tp_call* (而不是使用 " +":c:func:`PyObject_Call`)。因此,一个支持 vectorcall 的类也必须实现 " +":c:member:`~PyTypeObject.tp_call`。此外,无论使用哪种协议,可调用对象的行为都必须是相同的。推荐的方法是将 " +":c:member:`~PyTypeObject.tp_call` 设置为 :c:func:`PyVectorcall_Call`。值得再次强调的是:" + +#: ../../c-api/call.rst:57 +msgid "" +"A class supporting vectorcall **must** also implement " +":c:member:`~PyTypeObject.tp_call` with the same semantics." +msgstr "" +"一个支持 Vectorcall 的类 **必须** 也实现具有相同语义的 :c:member:`~PyTypeObject.tp_call`。" + +#: ../../c-api/call.rst:62 +msgid "" +"The :c:macro:`Py_TPFLAGS_HAVE_VECTORCALL` flag is now removed from a class " +"when the class's :py:meth:`~object.__call__` method is reassigned. (This " +"internally sets :c:member:`~PyTypeObject.tp_call` only, and thus may make it" +" behave differently than the vectorcall function.) In earlier Python " +"versions, vectorcall should only be used with :c:macro:`immutable " +"` or static types." +msgstr "" +"现在 :c:macro:`Py_TPFLAGS_HAVE_VECTORCALL` 旗标在类的 :py:meth:`~object.__call__` " +"方法被重新赋值时将会从类中移除。 (这将仅在内部设置 :c:member:`~PyTypeObject.tp_call`,因此可能使其行为不同于 " +"vectorcall 函数。)在更早的 Python 版本中,vectorcall 应当仅被用于 :c:macro:`不可变类型 " +"` 或静态类型。" + +#: ../../c-api/call.rst:69 +msgid "" +"A class should not implement vectorcall if that would be slower than " +"*tp_call*. For example, if the callee needs to convert the arguments to an " +"args tuple and kwargs dict anyway, then there is no point in implementing " +"vectorcall." +msgstr "" +"如果一个类的 vectorcall 比 *tp_call* 慢,就不应该实现 vectorcall。例如,如果被调用者需要将参数转换为 args 元组和" +" kwargs dict,那么实现 vectorcall 就没有意义。" + +#: ../../c-api/call.rst:74 +msgid "" +"Classes can implement the vectorcall protocol by enabling the " +":c:macro:`Py_TPFLAGS_HAVE_VECTORCALL` flag and setting " +":c:member:`~PyTypeObject.tp_vectorcall_offset` to the offset inside the " +"object structure where a *vectorcallfunc* appears. This is a pointer to a " +"function with the following signature:" +msgstr "" +"类可以通过启用 :c:macro:`Py_TPFLAGS_HAVE_VECTORCALL` 旗标并将 " +":c:member:`~PyTypeObject.tp_vectorcall_offset` 设为对象结构体中 *vectorcallfunc* " +"出现位置偏移量来实现 vectorcall 协议。这是一个指向具有以下签名的函数的指针:" + +#: ../../c-api/call.rst:82 +msgid "*callable* is the object being called." +msgstr "*callable* 是指被调用的对象。" + +#: ../../c-api/call.rst:83 +msgid "" +"*args* is a C array consisting of the positional arguments followed by the" +msgstr "*args* 是一个 C 语言数组,由位置参数和后面的" + +#: ../../c-api/call.rst:84 +msgid "" +"values of the keyword arguments. This can be *NULL* if there are no " +"arguments." +msgstr "关键字参数的值。如果没有参数,这个值可以是 *NULL* 。" + +#: ../../c-api/call.rst:86 +msgid "*nargsf* is the number of positional arguments plus possibly the" +msgstr "*nargsf* 是位置参数的数量加上可能的" + +#: ../../c-api/call.rst:87 +msgid "" +":c:macro:`PY_VECTORCALL_ARGUMENTS_OFFSET` flag. To get the actual number of " +"positional arguments from *nargsf*, use :c:func:`PyVectorcall_NARGS`." +msgstr "" +":c:macro:`PY_VECTORCALL_ARGUMENTS_OFFSET` 旗标。要从 *nargsf* 获得位置参数的实际数量,请使用 函数 " +":c:func:`PyVectorcall_NARGS`。" + +#: ../../c-api/call.rst:90 +msgid "*kwnames* is a tuple containing the names of the keyword arguments;" +msgstr "*kwnames* 是一个包含所有关键字名称的元组;" + +#: ../../c-api/call.rst:91 +msgid "" +"in other words, the keys of the kwargs dict. These names must be strings " +"(instances of ``str`` or a subclass) and they must be unique. If there are " +"no keyword arguments, then *kwnames* can instead be *NULL*." +msgstr "" +"换句话说,就是 kwargs 字典的键。这些名字必须是字符串 (``str`` 或其子类的实例),并且它们必须是唯一的。如果没有关键字参数,那么 " +"*kwnames* 可以用 *NULL* 代替。" + +#: ../../c-api/call.rst:98 +msgid "" +"If this flag is set in a vectorcall *nargsf* argument, the callee is allowed" +" to temporarily change ``args[-1]``. In other words, *args* points to " +"argument 1 (not 0) in the allocated vector. The callee must restore the " +"value of ``args[-1]`` before returning." +msgstr "" +"如果在 vectorcall 的 *nargsf* 参数中设置了此标志,则允许被调用者临时更改 ``args[-1]`` 的值。 换句话说, " +"*args* 指向分配向量中的参数 1(不是 0)。 被调用方必须在返回之前还原 ``args[-1]`` 的值。" + +#: ../../c-api/call.rst:103 +msgid "" +"For :c:func:`PyObject_VectorcallMethod`, this flag means instead that " +"``args[0]`` may be changed." +msgstr "对于 :c:func:`PyObject_VectorcallMethod`,这个标志意味着 ``args[0]`` 可能会被改变。" + +#: ../../c-api/call.rst:106 +msgid "" +"Whenever they can do so cheaply (without additional allocation), callers are" +" encouraged to use :c:macro:`PY_VECTORCALL_ARGUMENTS_OFFSET`. Doing so will " +"allow callables such as bound methods to make their onward calls (which " +"include a prepended *self* argument) very efficiently." +msgstr "" +"只要调用方能以低代价(不额外分配内存)这样做,就推荐使用 :c:macro:`PY_VECTORCALL_ARGUMENTS_OFFSET`。 " +"这样做将允许诸如绑定方法之类的可调用对象非常高效地执行前向调用(这种调用将包括一个加在开头的 *self* 参数)。" + +#: ../../c-api/call.rst:113 +msgid "" +"To call an object that implements vectorcall, use a :ref:`call API ` function as with any other callable. :c:func:`PyObject_Vectorcall` " +"will usually be most efficient." +msgstr "" +"要调用一个实现了 vectorcall 的对象,请使用某个 :ref:`call API ` 函数,就像其他可调对象一样。 " +":c:func:`PyObject_Vectorcall` 通常是最有效的。" + +#: ../../c-api/call.rst:119 +msgid "Recursion Control" +msgstr "递归控制" + +#: ../../c-api/call.rst:121 +msgid "" +"When using *tp_call*, callees do not need to worry about :ref:`recursion " +"`: CPython uses :c:func:`Py_EnterRecursiveCall` and " +":c:func:`Py_LeaveRecursiveCall` for calls made using *tp_call*." +msgstr "" +"在使用 *tp_call* 时,被调用者不必担心 :ref:`递归 `: CPython 对于使用 *tp_call* " +"进行的调用会使用 :c:func:`Py_EnterRecursiveCall` 和 :c:func:`Py_LeaveRecursiveCall`。" + +#: ../../c-api/call.rst:126 +msgid "" +"For efficiency, this is not the case for calls done using vectorcall: the " +"callee should use *Py_EnterRecursiveCall* and *Py_LeaveRecursiveCall* if " +"needed." +msgstr "" +"为保证效率,这不适用于使用 vectorcall 的调用:被调用方在需要时应当使用 *Py_EnterRecursiveCall* 和 " +"*Py_LeaveRecursiveCall* 函数。" + +#: ../../c-api/call.rst:132 +msgid "Vectorcall Support API" +msgstr "Vectorcall 支持 API" + +#: ../../c-api/call.rst:136 +msgid "" +"Given a vectorcall *nargsf* argument, return the actual number of arguments." +" Currently equivalent to::" +msgstr "给定一个 vectorcall *nargsf* 实参,返回参数的实际数量。目前等同于::" + +#: ../../c-api/call.rst:140 +msgid "(Py_ssize_t)(nargsf & ~PY_VECTORCALL_ARGUMENTS_OFFSET)" +msgstr "(Py_ssize_t)(nargsf & ~PY_VECTORCALL_ARGUMENTS_OFFSET)" + +#: ../../c-api/call.rst:142 +msgid "" +"However, the function ``PyVectorcall_NARGS`` should be used to allow for " +"future extensions." +msgstr "然而,应使用 ``PyVectorcall_NARGS`` 函数以便将来扩展。" + +#: ../../c-api/call.rst:149 +msgid "" +"If *op* does not support the vectorcall protocol (either because the type " +"does not or because the specific instance does not), return *NULL*. " +"Otherwise, return the vectorcall function pointer stored in *op*. This " +"function never raises an exception." +msgstr "" +"如果 *op* 不支持 vectorcall 协议(要么是因为类型不支持,要么是因为具体实例不支持),返回 *NULL*。否则,返回存储在 *op* " +"中的 vectorcall 函数指针。这个函数从不触发异常。" + +#: ../../c-api/call.rst:154 +msgid "" +"This is mostly useful to check whether or not *op* supports vectorcall, " +"which can be done by checking ``PyVectorcall_Function(op) != NULL``." +msgstr "" +"这在检查 *op* 是否支持 vectorcall 时最有用处,可以通过检查 ``PyVectorcall_Function(op) != NULL``" +" 来实现。" + +#: ../../c-api/call.rst:161 +msgid "" +"Call *callable*'s :c:type:`vectorcallfunc` with positional and keyword " +"arguments given in a tuple and dict, respectively." +msgstr "调用 *callable* 的 :c:type:`vectorcallfunc`,其位置参数和关键字参数分别以元组和 dict 形式给出。" + +#: ../../c-api/call.rst:164 +msgid "" +"This is a specialized function, intended to be put in the " +":c:member:`~PyTypeObject.tp_call` slot or be used in an implementation of " +"``tp_call``. It does not check the :c:macro:`Py_TPFLAGS_HAVE_VECTORCALL` " +"flag and it does not fall back to ``tp_call``." +msgstr "" +"这是一个专用函数,用于放入 :c:member:`~PyTypeObject.tp_call` 槽位或是用于 ``tp_call`` 的实现。 " +"它不会检查 :c:macro:`Py_TPFLAGS_HAVE_VECTORCALL` 旗标并且它也不会回退到 ``tp_call``。" + +#: ../../c-api/call.rst:175 +msgid "Object Calling API" +msgstr "调用对象的 API" + +#: ../../c-api/call.rst:177 +msgid "" +"Various functions are available for calling a Python object. Each converts " +"its arguments to a convention supported by the called object – either " +"*tp_call* or vectorcall. In order to do as little conversion as possible, " +"pick one that best fits the format of data you have available." +msgstr "" +"有多个函数可被用来调用 Python 对象。各个函数会将其参数转换为被调用对象所支持的惯例 – 可以是 *tp_call* 或 vectorcall。 " +"为了尽可能少地进行转换,请选择一个适合你所拥有的数据格式的函数。" + +#: ../../c-api/call.rst:183 +msgid "" +"The following table summarizes the available functions; please see " +"individual documentation for details." +msgstr "下表总结了可用的函数;请参阅各个文档以了解详细信息。" + +#: ../../c-api/call.rst:187 +msgid "Function" +msgstr "函数" + +#: ../../c-api/call.rst:187 +msgid "callable" +msgstr "callable -- 可调用对象" + +#: ../../c-api/call.rst:187 +msgid "args" +msgstr "args" + +#: ../../c-api/call.rst:187 +msgid "kwargs" +msgstr "kwargs" + +#: ../../c-api/call.rst:189 +msgid ":c:func:`PyObject_Call`" +msgstr ":c:func:`PyObject_Call`" + +#: ../../c-api/call.rst:189 ../../c-api/call.rst:191 ../../c-api/call.rst:193 +#: ../../c-api/call.rst:195 ../../c-api/call.rst:197 ../../c-api/call.rst:201 +#: ../../c-api/call.rst:209 ../../c-api/call.rst:211 +msgid "``PyObject *``" +msgstr "``PyObject *``" + +#: ../../c-api/call.rst:189 +msgid "tuple" +msgstr "元组" + +#: ../../c-api/call.rst:189 ../../c-api/call.rst:211 +msgid "dict/``NULL``" +msgstr "dict/``NULL``" + +#: ../../c-api/call.rst:191 +msgid ":c:func:`PyObject_CallNoArgs`" +msgstr ":c:func:`PyObject_CallNoArgs`" + +#: ../../c-api/call.rst:191 ../../c-api/call.rst:193 ../../c-api/call.rst:195 +#: ../../c-api/call.rst:197 ../../c-api/call.rst:199 ../../c-api/call.rst:201 +#: ../../c-api/call.rst:203 ../../c-api/call.rst:205 ../../c-api/call.rst:207 +msgid "---" +msgstr "---" + +#: ../../c-api/call.rst:193 +msgid ":c:func:`PyObject_CallOneArg`" +msgstr ":c:func:`PyObject_CallOneArg`" + +#: ../../c-api/call.rst:193 ../../c-api/call.rst:207 +msgid "1 object" +msgstr "1 个对象" + +#: ../../c-api/call.rst:195 +msgid ":c:func:`PyObject_CallObject`" +msgstr ":c:func:`PyObject_CallObject`" + +#: ../../c-api/call.rst:195 +msgid "tuple/``NULL``" +msgstr "元组/``NULL``" + +#: ../../c-api/call.rst:197 +msgid ":c:func:`PyObject_CallFunction`" +msgstr ":c:func:`PyObject_CallFunction`" + +#: ../../c-api/call.rst:197 ../../c-api/call.rst:199 +msgid "format" +msgstr "format" + +#: ../../c-api/call.rst:199 +msgid ":c:func:`PyObject_CallMethod`" +msgstr ":c:func:`PyObject_CallMethod`" + +#: ../../c-api/call.rst:199 +msgid "obj + ``char*``" +msgstr "对象 + ``char*``" + +#: ../../c-api/call.rst:201 +msgid ":c:func:`PyObject_CallFunctionObjArgs`" +msgstr ":c:func:`PyObject_CallFunctionObjArgs`" + +#: ../../c-api/call.rst:201 ../../c-api/call.rst:203 +msgid "variadic" +msgstr "可变参数" + +#: ../../c-api/call.rst:203 +msgid ":c:func:`PyObject_CallMethodObjArgs`" +msgstr ":c:func:`PyObject_CallMethodObjArgs`" + +#: ../../c-api/call.rst:203 ../../c-api/call.rst:205 ../../c-api/call.rst:207 +msgid "obj + name" +msgstr "对象 + 名称" + +#: ../../c-api/call.rst:205 +msgid ":c:func:`PyObject_CallMethodNoArgs`" +msgstr ":c:func:`PyObject_CallMethodNoArgs`" + +#: ../../c-api/call.rst:207 +msgid ":c:func:`PyObject_CallMethodOneArg`" +msgstr ":c:func:`PyObject_CallMethodOneArg`" + +#: ../../c-api/call.rst:209 +msgid ":c:func:`PyObject_Vectorcall`" +msgstr ":c:func:`PyObject_Vectorcall`" + +#: ../../c-api/call.rst:209 ../../c-api/call.rst:211 ../../c-api/call.rst:213 +msgid "vectorcall" +msgstr "vectorcall" + +#: ../../c-api/call.rst:211 +msgid ":c:func:`PyObject_VectorcallDict`" +msgstr ":c:func:`PyObject_VectorcallDict`" + +#: ../../c-api/call.rst:213 +msgid ":c:func:`PyObject_VectorcallMethod`" +msgstr ":c:func:`PyObject_VectorcallMethod`" + +#: ../../c-api/call.rst:213 +msgid "arg + name" +msgstr "参数 + 名称" + +#: ../../c-api/call.rst:219 +msgid "" +"Call a callable Python object *callable*, with arguments given by the tuple " +"*args*, and named arguments given by the dictionary *kwargs*." +msgstr "" +"调用一个可调用的 Python 对象 *callable*,附带由元组 *args* 所给出的参数,以及由字典 *kwargs* 所给出的关键字参数。" + +#: ../../c-api/call.rst:222 +msgid "" +"*args* must not be *NULL*; use an empty tuple if no arguments are needed. If" +" no named arguments are needed, *kwargs* can be *NULL*." +msgstr "*args* 必须不为 *NULL*;如果不想要参数请使用一个空元组。如果不想要关键字参数,则 *kwargs* 可以为 *NULL*。" + +#: ../../c-api/call.rst:225 ../../c-api/call.rst:237 ../../c-api/call.rst:248 +#: ../../c-api/call.rst:259 ../../c-api/call.rst:271 ../../c-api/call.rst:291 +#: ../../c-api/call.rst:310 ../../c-api/call.rst:324 ../../c-api/call.rst:333 +#: ../../c-api/call.rst:345 ../../c-api/call.rst:360 ../../c-api/call.rst:399 +msgid "" +"Return the result of the call on success, or raise an exception and return " +"*NULL* on failure." +msgstr "成功时返回结果,在失败时抛出一个异常并返回 *NULL*。" + +#: ../../c-api/call.rst:228 +msgid "" +"This is the equivalent of the Python expression: ``callable(*args, " +"**kwargs)``." +msgstr "这等价于 Python 表达式 ``callable(*args, **kwargs)``。" + +#: ../../c-api/call.rst:234 +msgid "" +"Call a callable Python object *callable* without any arguments. It is the " +"most efficient way to call a callable Python object without any argument." +msgstr "调用一个可调用的 Python 对象 *callable* 并不附带任何参数。这是不带参数调用 Python 可调用对象的最有效方式。" + +#: ../../c-api/call.rst:245 +msgid "" +"Call a callable Python object *callable* with exactly 1 positional argument " +"*arg* and no keyword arguments." +msgstr "调用一个可调用的 Python 对象 *callable* 并附带恰好 1 个位置参数 *arg* 而没有关键字参数。" + +#: ../../c-api/call.rst:256 +msgid "" +"Call a callable Python object *callable*, with arguments given by the tuple " +"*args*. If no arguments are needed, then *args* can be *NULL*." +msgstr "" +"调用一个可调用的 Python 对象 *callable*,附带由元组 *args* 所给出的参数。如果不想要传入参数,则 *args* 可以为 " +"*NULL* 值。" + +#: ../../c-api/call.rst:262 ../../c-api/call.rst:274 +msgid "This is the equivalent of the Python expression: ``callable(*args)``." +msgstr "这等价于 Python 表达式 ``callable(*args)``。" + +#: ../../c-api/call.rst:267 +msgid "" +"Call a callable Python object *callable*, with a variable number of C " +"arguments. The C arguments are described using a :c:func:`Py_BuildValue` " +"style format string. The format can be *NULL*, indicating that no arguments" +" are provided." +msgstr "" +"调用一个可调用的 Python 对象 *callable*,附带可变数量的 C 参数。这些 C 参数使用 :c:func:`Py_BuildValue`" +" 风格的格式字符串来描述。其中 format 可以为 *NULL*,表示没有提供任何参数。" + +#: ../../c-api/call.rst:276 +msgid "" +"Note that if you only pass :c:expr:`PyObject *` args, " +":c:func:`PyObject_CallFunctionObjArgs` is a faster alternative." +msgstr "" +"请注意如果你只传入 :c:expr:`PyObject *` 参数,则 :c:func:`PyObject_CallFunctionObjArgs` " +"是更快速的选择。" + +#: ../../c-api/call.rst:279 +msgid "The type of *format* was changed from ``char *``." +msgstr "这个 *format* 类型已从 ``char *`` 更改。" + +#: ../../c-api/call.rst:285 +msgid "" +"Call the method named *name* of object *obj* with a variable number of C " +"arguments. The C arguments are described by a :c:func:`Py_BuildValue` " +"format string that should produce a tuple." +msgstr "" +"调用 *obj* 对象中名为 *name* 的方法并附带可变数量的 C 参数。这些 C 参数由 :c:func:`Py_BuildValue` " +"格式字符串来描述并应当生成一个元组。" + +#: ../../c-api/call.rst:289 +msgid "The format can be *NULL*, indicating that no arguments are provided." +msgstr "格式可以为 *NULL* ,表示未提供任何参数。" + +#: ../../c-api/call.rst:294 +msgid "" +"This is the equivalent of the Python expression: ``obj.name(arg1, arg2, " +"...)``." +msgstr "这和 Python 表达式 ``obj.name(arg1, arg2, ...)`` 是一样的。" + +#: ../../c-api/call.rst:297 +msgid "" +"Note that if you only pass :c:expr:`PyObject *` args, " +":c:func:`PyObject_CallMethodObjArgs` is a faster alternative." +msgstr "" +"请注意如果你只传入 :c:expr:`PyObject *` 参数,则 :c:func:`PyObject_CallMethodObjArgs` " +"是更快速的选择。" + +#: ../../c-api/call.rst:300 +msgid "The types of *name* and *format* were changed from ``char *``." +msgstr " *name* 和 *format* 类型已从 ``char *`` 更改。" + +#: ../../c-api/call.rst:306 +msgid "" +"Call a callable Python object *callable*, with a variable number of " +":c:expr:`PyObject *` arguments. The arguments are provided as a variable " +"number of parameters followed by *NULL*." +msgstr "" +"调用一个 Python 可调用对象 *callable*,附带可变数量的 :c:expr:`PyObject *` 参数。 " +"这些参数以可变数量的形参的形式提供并以 *NULL* 结尾。" + +#: ../../c-api/call.rst:313 +msgid "" +"This is the equivalent of the Python expression: ``callable(arg1, arg2, " +"...)``." +msgstr "这和 Python 表达式 ``callable(arg1, arg2, ...)`` 是一样的。" + +#: ../../c-api/call.rst:319 +msgid "" +"Call a method of the Python object *obj*, where the name of the method is " +"given as a Python string object in *name*. It is called with a variable " +"number of :c:expr:`PyObject *` arguments. The arguments are provided as a " +"variable number of parameters followed by *NULL*." +msgstr "" +"调用 Python 对象 *obj* 中的一个方法,其中方法名称由 *name* 中的 Python 字符串对象给出。它将附带可变数量的 " +":c:expr:`PyObject *` 参数被调用。这些参数以可变数量的形参的形式提供并以 *NULL* 结尾。" + +#: ../../c-api/call.rst:330 +msgid "" +"Call a method of the Python object *obj* without arguments, where the name " +"of the method is given as a Python string object in *name*." +msgstr "调用 Python 对象 *obj* 中的一个方法并不附带任何参数,其中方法名称由 *name* 中的 Python 字符串对象给出。" + +#: ../../c-api/call.rst:341 +msgid "" +"Call a method of the Python object *obj* with a single positional argument " +"*arg*, where the name of the method is given as a Python string object in " +"*name*." +msgstr "" +"调用 Python 对象 *obj* 中的一个方法并附带单个位置参数 *arg*,其中方法名称由 *name* 中的 Python 字符串对象给出。" + +#: ../../c-api/call.rst:355 +msgid "" +"Call a callable Python object *callable*. The arguments are the same as for " +":c:type:`vectorcallfunc`. If *callable* supports vectorcall_, this directly " +"calls the vectorcall function stored in *callable*." +msgstr "" +"调用一个可调用的 Python 对象 *callable*。附带的参数与 :c:type:`vectorcallfunc` 相同。如果 " +"*callable* 支持 vectorcall_,则它会直接调用存放在 *callable* 中的 vectorcall 函数。" + +#: ../../c-api/call.rst:363 +msgid "as ``_PyObject_Vectorcall``" +msgstr "同 ``_PyObject_Vectorcall``" + +#: ../../c-api/call.rst:367 +msgid "" +"Renamed to the current name, without the leading underscore. The old " +"provisional name is :term:`soft deprecated`." +msgstr "重命名为当前名称,不带开头的下划线。旧的暂定名称已设为 :term:`soft deprecated`。" + +#: ../../c-api/call.rst:372 +msgid "" +"Call *callable* with positional arguments passed exactly as in the " +"vectorcall_ protocol, but with keyword arguments passed as a dictionary " +"*kwdict*. The *args* array contains only the positional arguments." +msgstr "" +"调用 *callable* 并附带与在 vectorcall_ 协议中传入的完全相同的位置参数,但会加上以字典 *kwdict* 形式传入的关键字参数。" +" *args* 数组将只包含位置参数。" + +#: ../../c-api/call.rst:376 +msgid "" +"Regardless of which protocol is used internally, a conversion of arguments " +"needs to be done. Therefore, this function should only be used if the caller" +" already has a dictionary ready to use for the keyword arguments, but not a " +"tuple for the positional arguments." +msgstr "无论在内部使用哪种协议,都需要进行参数的转换。因此,此函数应当仅在调用方已经拥有作为关键字参数的字典,但没有作为位置参数的元组时才被使用。" + +#: ../../c-api/call.rst:386 +msgid "" +"Call a method using the vectorcall calling convention. The name of the " +"method is given as a Python string *name*. The object whose method is called" +" is *args[0]*, and the *args* array starting at *args[1]* represents the " +"arguments of the call. There must be at least one positional argument. " +"*nargsf* is the number of positional arguments including *args[0]*, plus " +":c:macro:`PY_VECTORCALL_ARGUMENTS_OFFSET` if the value of ``args[0]`` may " +"temporarily be changed. Keyword arguments can be passed just like in " +":c:func:`PyObject_Vectorcall`." +msgstr "" +"使用 vectorcall 调用惯例来调用一个方法。方法的名称以 Python 字符串 *name* 的形式给出。调用方法的对象为 " +"*args[0]*,而 *args* 数组从 *args[1]* 开始的部分则代表调用的参数。必须传入至少一个位置参数。 *nargsf* 为包括 " +"*args[0]* 在内的位置参数的数量,如果 ``args[0]`` 的值可能被临时改变则还要加上 " +":c:macro:`PY_VECTORCALL_ARGUMENTS_OFFSET`。关键字参数可以像在 " +":c:func:`PyObject_Vectorcall` 中那样传入。" + +#: ../../c-api/call.rst:395 +msgid "" +"If the object has the :c:macro:`Py_TPFLAGS_METHOD_DESCRIPTOR` feature, this " +"will call the unbound method object with the full *args* vector as " +"arguments." +msgstr "" +"如果对象具有 :c:macro:`Py_TPFLAGS_METHOD_DESCRIPTOR` 特性,此函数将调用未绑定的方法对象并传入完整的 " +"*args* vector 作为参数。" + +#: ../../c-api/call.rst:406 +msgid "Call Support API" +msgstr "调用支持 API" + +#: ../../c-api/call.rst:410 +msgid "" +"Determine if the object *o* is callable. Return ``1`` if the object is " +"callable and ``0`` otherwise. This function always succeeds." +msgstr "确定对象 *o* 是否可调用。如果对象是可调用的则返回 ``1``,其他情况返回 ``0``。这个函数不会调用失败。" diff --git a/c-api/capsule.po b/c-api/capsule.po new file mode 100644 index 0000000000..cf7efe5bbd --- /dev/null +++ b/c-api/capsule.po @@ -0,0 +1,265 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/capsule.rst:6 +msgid "Capsules" +msgstr "Capsule 对象" + +#: ../../c-api/capsule.rst:10 +msgid "" +"Refer to :ref:`using-capsules` for more information on using these objects." +msgstr "有关使用这些对象的更多信息请参阅 :ref:`using-capsules`。" + +#: ../../c-api/capsule.rst:17 +msgid "" +"This subtype of :c:type:`PyObject` represents an opaque value, useful for C " +"extension modules which need to pass an opaque value (as a :c:expr:`void*` " +"pointer) through Python code to other C code. It is often used to make a C " +"function pointer defined in one module available to other modules, so the " +"regular import mechanism can be used to access C APIs defined in dynamically" +" loaded modules." +msgstr "" +"这个 :c:type:`PyObject` 的子类代表一个隐藏值,适用于需要将一个隐藏值(作为 :c:expr:`void*` 指针)通过 Python" +" 代码传递到其他 C 代码的 C 扩展模块。它常常被用于使得在一个模块中定义的 C " +"函数指针在其他模块中可用,这样就可以使用常规导入机制来访问在动态加载的模块中定义的 C API。" + +#: ../../c-api/capsule.rst:27 +msgid "" +"The type object corresponding to capsule objects. This is the same object as" +" :class:`types.CapsuleType` in the Python layer." +msgstr "对应于 capsule 对象的类型对象。它与 Python 层级中的 :class:`types.CapsuleType` 是同一对象。" + +#: ../../c-api/capsule.rst:33 +msgid "The type of a destructor callback for a capsule. Defined as::" +msgstr "Capsule 的析构器回调的类型。定义如下:" + +#: ../../c-api/capsule.rst:35 +msgid "typedef void (*PyCapsule_Destructor)(PyObject *);" +msgstr "typedef void (*PyCapsule_Destructor)(PyObject *);" + +#: ../../c-api/capsule.rst:37 +msgid "" +"See :c:func:`PyCapsule_New` for the semantics of PyCapsule_Destructor " +"callbacks." +msgstr "参阅 :c:func:`PyCapsule_New` 来获取 PyCapsule_Destructor 回调的语义。" + +#: ../../c-api/capsule.rst:43 +msgid "" +"Return true if its argument is a :c:type:`PyCapsule`. This function always " +"succeeds." +msgstr "如果参数是一个 :c:type:`PyCapsule` 则返回真值。此函数总是会成功执行。" + +#: ../../c-api/capsule.rst:49 +msgid "" +"Create a :c:type:`PyCapsule` encapsulating the *pointer*. The *pointer* " +"argument may not be ``NULL``." +msgstr "创建一个封装了 *pointer* 的 :c:type:`PyCapsule`。 *pointer* 参数不可为 ``NULL``。" + +#: ../../c-api/capsule.rst:52 +msgid "On failure, set an exception and return ``NULL``." +msgstr "在失败时设置一个异常并返回 ``NULL``。" + +#: ../../c-api/capsule.rst:54 +msgid "" +"The *name* string may either be ``NULL`` or a pointer to a valid C string. " +"If non-``NULL``, this string must outlive the capsule. (Though it is " +"permitted to free it inside the *destructor*.)" +msgstr "" +"字符串 *name* 可以是 ``NULL`` 或是一个指向有效的 C 字符串的指针。如果不为 ``NULL``,则此字符串的存在时间必须长于 " +"capsule。(虽然也允许在 *destructor* 中释放它。)" + +#: ../../c-api/capsule.rst:58 +msgid "" +"If the *destructor* argument is not ``NULL``, it will be called with the " +"capsule as its argument when it is destroyed." +msgstr "如果 *destructor* 参数不为 ``NULL``,则当它被销毁时将附带 capsule 作为参数来调用。" + +#: ../../c-api/capsule.rst:61 +msgid "" +"If this capsule will be stored as an attribute of a module, the *name* " +"should be specified as ``modulename.attributename``. This will enable other" +" modules to import the capsule using :c:func:`PyCapsule_Import`." +msgstr "" +"如果此 capsule 将被保存为一个模块的属性,则 *name* 应当被指定为 ``modulename.attributename``。 " +"这将允许其他模块使用 :c:func:`PyCapsule_Import` 来导入此 capsule。" + +#: ../../c-api/capsule.rst:68 +msgid "" +"Retrieve the *pointer* stored in the capsule. On failure, set an exception " +"and return ``NULL``." +msgstr "提取保存在 capsule 中的 *pointer*。在失败时设置一个异常并返回 ``NULL``。" + +#: ../../c-api/capsule.rst:71 +msgid "" +"The *name* parameter must compare exactly to the name stored in the capsule." +" If the name stored in the capsule is ``NULL``, the *name* passed in must " +"also be ``NULL``. Python uses the C function :c:func:`!strcmp` to compare " +"capsule names." +msgstr "" +"*name* 参数必须与 capsule 中存储的名称完全一致。如果存储在 capsule 中的名称是 ``NULL``,传入的 *name* 也必须是" +" ``NULL``。Python 使用 C 函数 :c:func:`!strcmp` 来比较 capsule 名称。" + +#: ../../c-api/capsule.rst:79 +msgid "" +"Return the current destructor stored in the capsule. On failure, set an " +"exception and return ``NULL``." +msgstr "返回保存在 capsule 中的当前析构器。在失败时设置一个异常并返回 ``NULL``。" + +#: ../../c-api/capsule.rst:82 +msgid "" +"It is legal for a capsule to have a ``NULL`` destructor. This makes a " +"``NULL`` return code somewhat ambiguous; use :c:func:`PyCapsule_IsValid` or " +":c:func:`PyErr_Occurred` to disambiguate." +msgstr "" +"capsule 具有 ``NULL`` 析构器是合法的。这会使得 ``NULL`` 返回码有些歧义;请使用 " +":c:func:`PyCapsule_IsValid` 或 :c:func:`PyErr_Occurred` 来消除歧义。" + +#: ../../c-api/capsule.rst:89 +msgid "" +"Return the current context stored in the capsule. On failure, set an " +"exception and return ``NULL``." +msgstr "返回保存在 capsule 中的当前上下文。在失败时设置一个异常并返回 ``NULL``。" + +#: ../../c-api/capsule.rst:92 +msgid "" +"It is legal for a capsule to have a ``NULL`` context. This makes a ``NULL``" +" return code somewhat ambiguous; use :c:func:`PyCapsule_IsValid` or " +":c:func:`PyErr_Occurred` to disambiguate." +msgstr "" +"capsule 具有 ``NULL`` 上下文是合法的。这会使得 ``NULL`` 返回码有些歧义;请使用 " +":c:func:`PyCapsule_IsValid` 或 :c:func:`PyErr_Occurred` 来消除歧义。" + +#: ../../c-api/capsule.rst:99 +msgid "" +"Return the current name stored in the capsule. On failure, set an exception" +" and return ``NULL``." +msgstr "返回保存在 capsule 中的当前名称。在失败时设置一个异常并返回 ``NULL``。" + +#: ../../c-api/capsule.rst:102 +msgid "" +"It is legal for a capsule to have a ``NULL`` name. This makes a ``NULL`` " +"return code somewhat ambiguous; use :c:func:`PyCapsule_IsValid` or " +":c:func:`PyErr_Occurred` to disambiguate." +msgstr "" +"capsule 具有 ``NULL`` 名称是合法的。这会使得 ``NULL`` 返回码有些歧义;请使用 " +":c:func:`PyCapsule_IsValid` 或 :c:func:`PyErr_Occurred` 来消除歧义。" + +#: ../../c-api/capsule.rst:109 +msgid "" +"Import a pointer to a C object from a capsule attribute in a module. The " +"*name* parameter should specify the full name to the attribute, as in " +"``module.attribute``. The *name* stored in the capsule must match this " +"string exactly." +msgstr "" +"从一个模块内的 capsule 属性导入一个指向 C 对象的指针。 *name* 形参应当指定该属性的完整名称,就像 " +"``module.attribute`` 这样。储存在 capsule 中的 *name* 必须与此字符串完全匹配。" + +#: ../../c-api/capsule.rst:114 +msgid "" +"This function splits *name* on the ``.`` character, and imports the first " +"element. It then processes further elements using attribute lookups." +msgstr "此函数会按 ``.`` 字符拆分 *name*,并导入第一个元素。随后它会使用属性查找来处理其他元素。" + +#: ../../c-api/capsule.rst:117 +msgid "" +"Return the capsule's internal *pointer* on success. On failure, set an " +"exception and return ``NULL``." +msgstr "成功时返回 capsule 的内部 *指针*。在失败时设置一个异常并返回 ``NULL``。" + +#: ../../c-api/capsule.rst:122 +msgid "" +"If *name* points to an attribute of some submodule or subpackage, this " +"submodule or subpackage must be previously imported using other means (for " +"example, by using :c:func:`PyImport_ImportModule`) for the attribute lookups" +" to succeed." +msgstr "" +"如果 *name* 指向某个子模块或子包的属性,要使属性查找能够成功这个子模块或子包必须在此之前已使用其他方式导入 (例如,通过使用 " +":c:func:`PyImport_ImportModule` 函数)。" + +#: ../../c-api/capsule.rst:127 +msgid "*no_block* has no effect anymore." +msgstr "*no_block* 不再有任何影响。" + +#: ../../c-api/capsule.rst:133 +msgid "" +"Determines whether or not *capsule* is a valid capsule. A valid capsule is " +"non-``NULL``, passes :c:func:`PyCapsule_CheckExact`, has a non-``NULL`` " +"pointer stored in it, and its internal name matches the *name* parameter. " +"(See :c:func:`PyCapsule_GetPointer` for information on how capsule names are" +" compared.)" +msgstr "" +"确定 *capsule* 是否是一个有效的 capsule。有效的 capsule 必须不为 ``NULL``,传递 " +":c:func:`PyCapsule_CheckExact`,在其中存储一个不为 ``NULL`` 的指针,并且其内部名称与 *name* 形参相匹配。" +" (请参阅 :c:func:`PyCapsule_GetPointer` 了解如何对 capsule 名称进行比较的有关信息。)" + +#: ../../c-api/capsule.rst:139 +msgid "" +"In other words, if :c:func:`PyCapsule_IsValid` returns a true value, calls " +"to any of the accessors (any function starting with ``PyCapsule_Get``) are " +"guaranteed to succeed." +msgstr "" +"换句话说,如果 :c:func:`PyCapsule_IsValid` 返回真值,则对任何访问器(以 ``PyCapsule_Get`` " +"开头的任何函数)的调用都保证会成功。" + +#: ../../c-api/capsule.rst:143 +msgid "" +"Return a nonzero value if the object is valid and matches the name passed " +"in. Return ``0`` otherwise. This function will not fail." +msgstr "如果对象有效并且匹配传入的名称则返回非零值。否则返回 ``0``。此函数一定不会失败。" + +#: ../../c-api/capsule.rst:149 +msgid "Set the context pointer inside *capsule* to *context*." +msgstr "将 *capsule* 内部的上下文指针设为 *context*。" + +#: ../../c-api/capsule.rst:151 ../../c-api/capsule.rst:158 +#: ../../c-api/capsule.rst:167 ../../c-api/capsule.rst:175 +msgid "" +"Return ``0`` on success. Return nonzero and set an exception on failure." +msgstr "成功时返回 ``0``。失败时返回非零值并设置一个异常。" + +#: ../../c-api/capsule.rst:156 +msgid "Set the destructor inside *capsule* to *destructor*." +msgstr "将 *capsule* 内部的析构器设为 *destructor*。" + +#: ../../c-api/capsule.rst:163 +msgid "" +"Set the name inside *capsule* to *name*. If non-``NULL``, the name must " +"outlive the capsule. If the previous *name* stored in the capsule was not " +"``NULL``, no attempt is made to free it." +msgstr "" +"将 *capsule* 内部的名称设为 *name*。如果不为 ``NULL``,则名称的存在期必须比 capsule 更长。如果之前保存在 " +"capsule 中的 *name* 不为 ``NULL``,则不会尝试释放它。" + +#: ../../c-api/capsule.rst:172 +msgid "" +"Set the void pointer inside *capsule* to *pointer*. The pointer may not be " +"``NULL``." +msgstr "将 *capsule* 内部的空指针设为 *pointer*。指针不可为 ``NULL``。" + +#: ../../c-api/capsule.rst:8 +msgid "object" +msgstr "object -- 对象" + +#: ../../c-api/capsule.rst:8 +msgid "Capsule" +msgstr "Capsule" diff --git a/c-api/cell.po b/c-api/cell.po new file mode 100644 index 0000000000..6ee6b9244a --- /dev/null +++ b/c-api/cell.po @@ -0,0 +1,100 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/cell.rst:6 +msgid "Cell Objects" +msgstr "Cell 对象" + +#: ../../c-api/cell.rst:8 +msgid "" +"\"Cell\" objects are used to implement variables referenced by multiple " +"scopes. For each such variable, a cell object is created to store the value;" +" the local variables of each stack frame that references the value contain a" +" reference to the cells from outer scopes which also use that variable. " +"When the value is accessed, the value contained in the cell is used instead " +"of the cell object itself. This de-referencing of the cell object requires " +"support from the generated byte-code; these are not automatically de-" +"referenced when accessed. Cell objects are not likely to be useful " +"elsewhere." +msgstr "" +"\"Cell\" 对象用于实现由多个作用域引用的变量。对于每个这样的变量,将创建一个 Cell " +"对象来存储该值;引用该值的每个栈帧的局部变量将包含同样使用该变量的对外部作用域的 Cell 的引用。当该值被访问时,将使用包含在 Cell 中的值而不是" +" Cell 对象本身。这种对 Cell 对象的解引用需要来自所生成字节码的支持;它们在被访问时不会自动解引用。Cell 对象在其他地方不太可能会被用到。" + +#: ../../c-api/cell.rst:20 +msgid "The C structure used for cell objects." +msgstr "用于 Cell 对象的 C 结构体。" + +#: ../../c-api/cell.rst:25 +msgid "The type object corresponding to cell objects." +msgstr "与 Cell 对象对应的类型对象。" + +#: ../../c-api/cell.rst:30 +msgid "" +"Return true if *ob* is a cell object; *ob* must not be ``NULL``. This " +"function always succeeds." +msgstr "如果 *ob* 是一个 cell 对象则返回真值;*ob* 必须不为 ``NULL``。此函数总是会成功执行。" + +#: ../../c-api/cell.rst:36 +msgid "" +"Create and return a new cell object containing the value *ob*. The parameter" +" may be ``NULL``." +msgstr "创建并返回一个包含值 *ob* 的新 cell 对象。形参可以为 ``NULL``。" + +#: ../../c-api/cell.rst:42 +msgid "" +"Return the contents of the cell *cell*, which can be ``NULL``. If *cell* is " +"not a cell object, returns ``NULL`` with an exception set." +msgstr "" +"返回 cell 对象 *cell* 的内容,可以为 ``NULL``。如果 *cell* 不是一个 cell 对象,则返回 ``NULL`` " +"并设置一个异常。" + +#: ../../c-api/cell.rst:48 +msgid "" +"Return the contents of the cell *cell*, but without checking that *cell* is " +"non-``NULL`` and a cell object." +msgstr "返回 cell 对象 *cell* 的内容,但是不检测 *cell* 是否非 ``NULL`` 并且为一个 cell 对象。" + +#: ../../c-api/cell.rst:54 +msgid "" +"Set the contents of the cell object *cell* to *value*. This releases the " +"reference to any current content of the cell. *value* may be ``NULL``. " +"*cell* must be non-``NULL``." +msgstr "" +"将 cell 对象 *cell* 的内容设为 *value*。这将释放任何对该 cell 对象当前内容的引用。*value* 可以为 " +"``NULL``。*cell* 必须不为 ``NULL``。" + +#: ../../c-api/cell.rst:58 +msgid "" +"On success, return ``0``. If *cell* is not a cell object, set an exception " +"and return ``-1``." +msgstr "当成功时,返回 ``0``。如果 *cell* 不是一个 cell 对象,则设置一个异常并返回 ``-1``。" + +#: ../../c-api/cell.rst:64 +msgid "" +"Sets the value of the cell object *cell* to *value*. No reference counts " +"are adjusted, and no checks are made for safety; *cell* must be non-``NULL``" +" and must be a cell object." +msgstr "" +"将 cell 对象 *cell* 的值设为 *value*。不会调整引用计数,并且不会进行检测以保证安全;*cell* 必须为非 ``NULL`` " +"并且为一个 cell 对象。" diff --git a/c-api/code.po b/c-api/code.po new file mode 100644 index 0000000000..e619cd4e9e --- /dev/null +++ b/c-api/code.po @@ -0,0 +1,528 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-07 17:18+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/code.rst:8 +msgid "Code Objects" +msgstr "代码对象" + +#: ../../c-api/code.rst:12 +msgid "" +"Code objects are a low-level detail of the CPython implementation. Each one " +"represents a chunk of executable code that hasn't yet been bound into a " +"function." +msgstr "代码对象是 CPython 实现的低层级细节。每个代表一块尚未绑定到函数中的可执行代码。" + +#: ../../c-api/code.rst:18 +msgid "" +"The C structure of the objects used to describe code objects. The fields of" +" this type are subject to change at any time." +msgstr "用于描述代码对象的对象的 C 结构。此类型字段可随时更改。" + +#: ../../c-api/code.rst:24 +msgid "" +"This is an instance of :c:type:`PyTypeObject` representing the Python " +":ref:`code object `." +msgstr "这是一个代表 Python :ref:`代码对象 ` 的 :c:type:`PyTypeObject` 实例。" + +#: ../../c-api/code.rst:30 +msgid "" +"Return true if *co* is a :ref:`code object `. This function " +"always succeeds." +msgstr "如果 *co* 是一个 :ref:`代码对象 ` 则返回真值。此函数总是会成功执行。" + +#: ../../c-api/code.rst:35 +msgid "" +"Return the number of :term:`free (closure) variables ` in " +"a code object." +msgstr "返回代码对象中 :term:`自由(闭包)变量 ` 的数量。" + +#: ../../c-api/code.rst:40 +msgid "" +"Return the position of the first :term:`free (closure) variable ` in a code object." +msgstr "返回代码对象中第一个 :term:`自由(闭包)变量 ` 的位置。" + +#: ../../c-api/code.rst:45 +msgid "" +"Renamed from ``PyCode_GetFirstFree`` as part of :ref:`unstable-c-api`. The " +"old name is deprecated, but will remain available until the signature " +"changes again." +msgstr "" +"作为 :ref:`unstable-c-api` 的一部分由 ``PyCode_GetFirstFree`` 更名而来。 " +"旧名称已被弃用,但在签名再次更改之前将保持可用。" + +#: ../../c-api/code.rst:51 +msgid "" +"Return a new code object. If you need a dummy code object to create a " +"frame, use :c:func:`PyCode_NewEmpty` instead." +msgstr "返回一个新的代码对象。如果你需要一个空代码对象来创建帧,请改用 :c:func:`PyCode_NewEmpty`。" + +#: ../../c-api/code.rst:54 +msgid "" +"Since the definition of the bytecode changes often, calling " +":c:func:`PyUnstable_Code_New` directly can bind you to a precise Python " +"version." +msgstr "" +"由于字节码的定义经常变化,直接调用 :c:func:`PyUnstable_Code_New` 可能会使你受限于某个特定的 Python 版本。" + +#: ../../c-api/code.rst:57 +msgid "" +"The many arguments of this function are inter-dependent in complex ways, " +"meaning that subtle changes to values are likely to result in incorrect " +"execution or VM crashes. Use this function only with extreme care." +msgstr "此函数的许多参数以复杂的方式相互依赖,这意味着参数值的细微改变可能导致不正确的执行或 VM 崩溃。使用此函数需要极度小心。" + +#: ../../c-api/code.rst:61 +msgid "Added ``qualname`` and ``exceptiontable`` parameters." +msgstr "添加了 ``qualname`` 和 ``exceptiontable`` 形参。" + +#: ../../c-api/code.rst:68 +msgid "" +"Renamed from ``PyCode_New`` as part of :ref:`unstable-c-api`. The old name " +"is deprecated, but will remain available until the signature changes again." +msgstr "" +"由 ``PyCode_New`` 更名而来,是 :ref:`unstable-c-api` 的一部分。旧名称已被弃用,但在签名再次更改之前仍然可用。" + +#: ../../c-api/code.rst:77 +msgid "" +"Similar to :c:func:`PyUnstable_Code_New`, but with an extra " +"\"posonlyargcount\" for positional-only arguments. The same caveats that " +"apply to ``PyUnstable_Code_New`` also apply to this function." +msgstr "" +"与 :c:func:`PyUnstable_Code_New` 类似,但额外增加了一个针对仅限位置参数的 \"posonlyargcount\"。 " +"适用于 ``PyUnstable_Code_New`` 的注意事项同样适用于这个函数。" + +#: ../../c-api/code.rst:80 +msgid "as ``PyCode_NewWithPosOnlyArgs``" +msgstr "作为 ``PyCode_NewWithPosOnlyArgs``" + +#: ../../c-api/code.rst:82 +msgid "Added ``qualname`` and ``exceptiontable`` parameters." +msgstr "增加了 ``qualname`` 和 ``exceptiontable`` 形参。" + +#: ../../c-api/code.rst:87 +msgid "" +"Renamed to ``PyUnstable_Code_NewWithPosOnlyArgs``. The old name is " +"deprecated, but will remain available until the signature changes again." +msgstr "重命名为 ``PyUnstable_Code_NewWithPosOnlyArgs``。旧名称已被弃用,但在签名再次更改之前将保持可用。" + +#: ../../c-api/code.rst:93 +msgid "" +"Return a new empty code object with the specified filename, function name, " +"and first line number. The resulting code object will raise an ``Exception``" +" if executed." +msgstr "返回一个具有指定文件名、函数名和首行行号的空代码对象。结果代码对象如果被执行则将引发一个 ``Exception``。" + +#: ../../c-api/code.rst:99 +msgid "" +"Return the line number of the instruction that occurs on or before " +"``byte_offset`` and ends after it. If you just need the line number of a " +"frame, use :c:func:`PyFrame_GetLineNumber` instead." +msgstr "" +"返回在 ``byte_offset`` 位置或之前出现且在该位置之后结束的指令的行号。如果你只需要一个帧的行号,请改用 " +":c:func:`PyFrame_GetLineNumber` 函数。" + +#: ../../c-api/code.rst:102 +msgid "" +"For efficiently iterating over the line numbers in a code object, use " +":pep:`the API described in PEP 626 <0626#out-of-process-debuggers-and-" +"profilers>`." +msgstr "" +"要高效地对代码对象中的行号进行迭代,请使用 :pep:`在 PEP 626 中描述的 API <0626#out-of-process-" +"debuggers-and-profilers>` 规范。" + +#: ../../c-api/code.rst:107 +msgid "" +"Sets the passed ``int`` pointers to the source code line and column numbers " +"for the instruction at ``byte_offset``. Sets the value to ``0`` when " +"information is not available for any particular element." +msgstr "" +"将传入的 ``int`` 指针设为 ``byte_offset`` 处的指令的源代码行编号和列编号。当没有任何特定元素的信息时则将值设为 ``0``。" + +#: ../../c-api/code.rst:111 +msgid "Returns ``1`` if the function succeeds and 0 otherwise." +msgstr "如果函数执行成功则返回 ``1`` 否则返回 0。" + +#: ../../c-api/code.rst:117 +msgid "" +"Equivalent to the Python code ``getattr(co, 'co_code')``. Returns a strong " +"reference to a :c:type:`PyBytesObject` representing the bytecode in a code " +"object. On error, ``NULL`` is returned and an exception is raised." +msgstr "" +"等价于 Python 代码 ``getattr(co, 'co_code')``。返回一个指向表示代码对象中的字节码的 " +":c:type:`PyBytesObject` 的强引用。当出错时,将返回 ``NULL`` 并引发一个异常。" + +#: ../../c-api/code.rst:122 +msgid "" +"This ``PyBytesObject`` may be created on-demand by the interpreter and does " +"not necessarily represent the bytecode actually executed by CPython. The " +"primary use case for this function is debuggers and profilers." +msgstr "" +"这个 ``PyBytesObject`` 可以由解释器按需创建并且不必代表 CPython 所实际执行的字节码。 " +"此函数的主要用途是调试器和性能分析工具。" + +#: ../../c-api/code.rst:130 +msgid "" +"Equivalent to the Python code ``getattr(co, 'co_varnames')``. Returns a new " +"reference to a :c:type:`PyTupleObject` containing the names of the local " +"variables. On error, ``NULL`` is returned and an exception is raised." +msgstr "" +"等价于 Python 代码 ``getattr(co, 'co_varnames')``。返回一个指向包含局部变量名称的 " +":c:type:`PyTupleObject` 的新引用。当出错时,将返回 ``NULL`` 并引发一个异常。" + +#: ../../c-api/code.rst:139 +msgid "" +"Equivalent to the Python code ``getattr(co, 'co_cellvars')``. Returns a new " +"reference to a :c:type:`PyTupleObject` containing the names of the local " +"variables that are referenced by nested functions. On error, ``NULL`` is " +"returned and an exception is raised." +msgstr "" +"等价于 Python 代码 ``getattr(co, 'co_cellvars')``。返回一个包含被嵌套的函数所引用的局部变量名称的 " +":c:type:`PyTupleObject` 的新引用。当出错时,将返回 ``NULL`` 并引发一个异常。" + +#: ../../c-api/code.rst:148 +msgid "" +"Equivalent to the Python code ``getattr(co, 'co_freevars')``. Returns a new " +"reference to a :c:type:`PyTupleObject` containing the names of the " +":term:`free (closure) variables `. On error, ``NULL`` is " +"returned and an exception is raised." +msgstr "" +"等价于 Python 代码 ``getattr(co, 'co_freevars')``。返回一个指向包含 :term:`自由(闭包)变量 " +"` 名称的 :c:type:`PyTupleObject` 的新引用。当出错时,将返回 ``NULL`` " +"并引发一个异常。" + +#: ../../c-api/code.rst:157 +msgid "" +"Register *callback* as a code object watcher for the current interpreter. " +"Return an ID which may be passed to :c:func:`PyCode_ClearWatcher`. In case " +"of error (e.g. no more watcher IDs available), return ``-1`` and set an " +"exception." +msgstr "" +"注册 *callback* 作为当前解释器的代码对象监视器。返回一个可被传给 :c:func:`PyCode_ClearWatcher` 的 " +"ID。如果出现错误(例如没有足够的可用监视器 ID),则返回 ``-1`` 并设置一个异常。" + +#: ../../c-api/code.rst:166 +msgid "" +"Clear watcher identified by *watcher_id* previously returned from " +":c:func:`PyCode_AddWatcher` for the current interpreter. Return ``0`` on " +"success, or ``-1`` and set an exception on error (e.g. if the given " +"*watcher_id* was never registered.)" +msgstr "" +"清除之前从 :c:func:`PyCode_AddWatcher` 返回的当前解释器中由 *watcher_id* 所标识的监视器。成功时返回 " +"``0``,或者出错时(例如当给定的 *watcher_id* 未被注册)返回 ``-1`` 并设置异常。" + +#: ../../c-api/code.rst:175 +msgid "" +"Enumeration of possible code object watcher events: - " +"``PY_CODE_EVENT_CREATE`` - ``PY_CODE_EVENT_DESTROY``" +msgstr "" +"由可能的代码对象监视器事件组成的枚举: ``PY_CODE_EVENT_CREATE``、``PY_CODE_EVENT_DESTROY``" + +#: ../../c-api/code.rst:183 +msgid "Type of a code object watcher callback function." +msgstr "代码对象监视器回调函数的类型。" + +#: ../../c-api/code.rst:185 +msgid "" +"If *event* is ``PY_CODE_EVENT_CREATE``, then the callback is invoked after " +"*co* has been fully initialized. Otherwise, the callback is invoked before " +"the destruction of *co* takes place, so the prior state of *co* can be " +"inspected." +msgstr "" +"如果 *event* 为 ``PY_CODE_EVENT_CREATE``,则回调会在 *co* 完全初始化之后被唤起。在其他情况下,回调会在 *co*" +" 的销毁执行之前被唤起,因此可以检查 *co* 在之前的状态。" + +#: ../../c-api/code.rst:190 +msgid "" +"If *event* is ``PY_CODE_EVENT_DESTROY``, taking a reference in the callback " +"to the about-to-be-destroyed code object will resurrect it and prevent it " +"from being freed at this time. When the resurrected object is destroyed " +"later, any watcher callbacks active at that time will be called again." +msgstr "" +"如果 *event* 为 " +"``PY_CODE_EVENT_DESTROY``,则在回调中接受一个即将被销毁的代码对象的引用将使其重生,并阻止其在此时被释放。 " +"当重生的对象以后再被销毁时,任何在当时已激活的监视器回调将再次被调用。" + +#: ../../c-api/code.rst:195 +msgid "" +"Users of this API should not rely on internal runtime implementation " +"details. Such details may include, but are not limited to, the exact order " +"and timing of creation and destruction of code objects. While changes in " +"these details may result in differences observable by watchers (including " +"whether a callback is invoked or not), it does not change the semantics of " +"the Python code being executed." +msgstr "" +"本 API " +"的用户不应依赖内部运行时的实现细节。这类细节可能包括但不限于创建和销毁代码对象的确切顺序和时间。虽然这些细节的变化可能会导致监视器可观察到的差异(包括回调是否被唤起),但不会改变正在执行的" +" Python 代码的语义。" + +#: ../../c-api/code.rst:202 +msgid "" +"If the callback sets an exception, it must return ``-1``; this exception " +"will be printed as an unraisable exception using " +":c:func:`PyErr_WriteUnraisable`. Otherwise it should return ``0``." +msgstr "" +"如果该回调设置了一个异常,则它必须返回 ``-1``;此异常将作为不可引发的异常使用 :c:func:`PyErr_WriteUnraisable` " +"打印出来。在其他情况下它应当返回 ``0``。" + +#: ../../c-api/code.rst:206 +msgid "" +"There may already be a pending exception set on entry to the callback. In " +"this case, the callback should return ``0`` with the same exception still " +"set. This means the callback may not call any other API that can set an " +"exception unless it saves and clears the exception state first, and restores" +" it before returning." +msgstr "" +"在进入回调时可能已经设置了尚未处理的异常。在此情况下,回调应当返回 ``0`` 并仍然设置同样的异常。这意味着该回调不可调用任何其他可设置异常的 " +"API,除非它先保存并清空异常状态,并在返回之前恢复它。" + +#: ../../c-api/code.rst:217 +msgid "This is a function that does nothing." +msgstr "" + +#: ../../c-api/code.rst:219 +msgid "" +"Prior to Python 3.10, this function would perform basic optimizations to a " +"code object." +msgstr "在 Python 3.10 之前,此函数将对代码对象执行基本的优化。" + +#: ../../c-api/code.rst:222 +msgid "This function now does nothing." +msgstr "此函数现在不执行任何操作。" + +#: ../../c-api/code.rst:231 +msgid "Code Object Flags" +msgstr "代码对象标志" + +#: ../../c-api/code.rst:233 +msgid "" +"Code objects contain a bit-field of flags, which can be retrieved as the " +":attr:`~codeobject.co_flags` Python attribute (for example using " +":c:func:`PyObject_GetAttrString`), and set using a *flags* argument to " +":c:func:`PyUnstable_Code_New` and similar functions." +msgstr "" +"代码对象包含一个标志位字段,可以通过 :attr:`~codeobject.co_flags` Python 属性检索 (例如使用 " +":c:func:`PyObject_GetAttrString`),并通过 *flags* 参数设置 " +":c:func:`PyUnstable_Code_New` 及类似函数。" + +#: ../../c-api/code.rst:238 +msgid "" +"Flags whose names start with ``CO_FUTURE_`` correspond to features normally " +"selectable by :ref:`future statements `. These flags can be used in " +":c:member:`PyCompilerFlags.cf_flags`. Note that many ``CO_FUTURE_`` flags " +"are mandatory in current versions of Python, and setting them has no effect." +msgstr "" +"以 ``CO_FUTURE_`` 开头的标志名称对应于通常可通过 :ref:`未来语句 ` 选择的功能。这些标志可以在 " +":c:member:`PyCompilerFlags.cf_flags` 中使用。请注意,许多 ``CO_FUTURE_`` 标志在当前版本的 " +"Python 中是强制性的,设置它们没有效果。" + +#: ../../c-api/code.rst:244 +msgid "" +"The following flags are available. For their meaning, see the linked " +"documentation of their Python equivalents." +msgstr "以下是可用的标志位。有关其具体含义,请参阅对应 Python 原生标志位的官方文档说明。" + +#: ../../c-api/code.rst:252 +msgid "Flag" +msgstr "标志位" + +#: ../../c-api/code.rst:253 +msgid "Meaning" +msgstr "含义" + +#: ../../c-api/code.rst:255 +msgid ":py:data:`inspect.CO_OPTIMIZED`" +msgstr ":py:data:`inspect.CO_OPTIMIZED`" + +#: ../../c-api/code.rst:257 +msgid ":py:data:`inspect.CO_NEWLOCALS`" +msgstr ":py:data:`inspect.CO_NEWLOCALS`" + +#: ../../c-api/code.rst:259 +msgid ":py:data:`inspect.CO_VARARGS`" +msgstr ":py:data:`inspect.CO_VARARGS`" + +#: ../../c-api/code.rst:261 +msgid ":py:data:`inspect.CO_VARKEYWORDS`" +msgstr ":py:data:`inspect.CO_VARKEYWORDS`" + +#: ../../c-api/code.rst:263 +msgid ":py:data:`inspect.CO_NESTED`" +msgstr ":py:data:`inspect.CO_NESTED`" + +#: ../../c-api/code.rst:265 +msgid ":py:data:`inspect.CO_GENERATOR`" +msgstr ":py:data:`inspect.CO_GENERATOR`" + +#: ../../c-api/code.rst:267 +msgid ":py:data:`inspect.CO_COROUTINE`" +msgstr ":py:data:`inspect.CO_COROUTINE`" + +#: ../../c-api/code.rst:269 +msgid ":py:data:`inspect.CO_ITERABLE_COROUTINE`" +msgstr ":py:data:`inspect.CO_ITERABLE_COROUTINE`" + +#: ../../c-api/code.rst:271 +msgid ":py:data:`inspect.CO_ASYNC_GENERATOR`" +msgstr ":py:data:`inspect.CO_ASYNC_GENERATOR`" + +#: ../../c-api/code.rst:273 +msgid ":py:data:`inspect.CO_HAS_DOCSTRING`" +msgstr ":py:data:`inspect.CO_HAS_DOCSTRING`" + +#: ../../c-api/code.rst:275 +msgid ":py:data:`inspect.CO_METHOD`" +msgstr ":py:data:`inspect.CO_METHOD`" + +#: ../../c-api/code.rst:278 +msgid "no effect (:py:data:`__future__.division`)" +msgstr "无效果 (:py:data:`__future__.division`)" + +#: ../../c-api/code.rst:280 +msgid "no effect (:py:data:`__future__.absolute_import`)" +msgstr "无效果 (:py:data:`__future__.absolute_import`)" + +#: ../../c-api/code.rst:282 +msgid "no effect (:py:data:`__future__.with_statement`)" +msgstr "无效果 (:py:data:`__future__.with_statement`)" + +#: ../../c-api/code.rst:284 +msgid "no effect (:py:data:`__future__.print_function`)" +msgstr "无效果 (:py:data:`__future__.print_function`)" + +#: ../../c-api/code.rst:286 +msgid "no effect (:py:data:`__future__.unicode_literals`)" +msgstr "无效果 (:py:data:`__future__.unicode_literals`)" + +#: ../../c-api/code.rst:288 +msgid "no effect (:py:data:`__future__.generator_stop`)" +msgstr "无效果 (:py:data:`__future__.generator_stop`)" + +#: ../../c-api/code.rst:290 +msgid ":py:data:`__future__.annotations`" +msgstr ":py:data:`__future__.annotations`" + +#: ../../c-api/code.rst:294 +msgid "Extra information" +msgstr "附加信息" + +#: ../../c-api/code.rst:296 +msgid "" +"To support low-level extensions to frame evaluation, such as external just-" +"in-time compilers, it is possible to attach arbitrary extra data to code " +"objects." +msgstr "为了支持对帧求值的低层级扩展,如外部即时编译器等,可以在代码对象上附加任意的额外数据。" + +#: ../../c-api/code.rst:300 +msgid "" +"These functions are part of the unstable C API tier: this functionality is a" +" CPython implementation detail, and the API may change without deprecation " +"warnings." +msgstr "这些函数是不稳定 C API 层的一部分:该功能是 CPython 的实现细节,此 API 可能随时改变而不发出弃用警告。" + +#: ../../c-api/code.rst:309 +msgid "Return a new opaque index value used to adding data to code objects." +msgstr "返回一个新的不透明索引值用于向代码对象添加数据。" + +#: ../../c-api/code.rst:311 +msgid "" +"You generally call this function once (per interpreter) and use the result " +"with ``PyCode_GetExtra`` and ``PyCode_SetExtra`` to manipulate data on " +"individual code objects." +msgstr "" +"通常情况下(对于每个解释器)你只需调用该函数一次然后将调用结果与 ``PyCode_GetExtra`` 和 ``PyCode_SetExtra`` " +"一起使用以操作单个代码对象上的数据。" + +#: ../../c-api/code.rst:315 +msgid "" +"If *free* is not ``NULL``: when a code object is deallocated, *free* will be" +" called on non-``NULL`` data stored under the new index. Use " +":c:func:`Py_DecRef` when storing :c:type:`PyObject`." +msgstr "" +"如果 *free* 不为 ``NULL``: 当代码对象被释放时,*free* 将在存储于新索引下的非 ``NULL`` 数据上被调用。当存储 " +":c:type:`PyObject` 时使用 :c:func:`Py_DecRef`。" + +#: ../../c-api/code.rst:319 +msgid "as ``_PyEval_RequestCodeExtraIndex``" +msgstr "作为 ``_PyEval_RequestCodeExtraIndex``" + +#: ../../c-api/code.rst:323 +msgid "" +"Renamed to ``PyUnstable_Eval_RequestCodeExtraIndex``. The old private name " +"is deprecated, but will be available until the API changes." +msgstr "" +"重命名为 ``PyUnstable_Eval_RequestCodeExtraIndex``。旧的私有名称已被弃用,但在 API 更改之前仍将可用。" + +#: ../../c-api/code.rst:332 +msgid "" +"Set *extra* to the extra data stored under the given index. Return 0 on " +"success. Set an exception and return -1 on failure." +msgstr "将 *extra* 设为存储在给定索引下的额外数据。成功时将返回 0。失败时将设置一个异常并返回 -1。" + +#: ../../c-api/code.rst:335 +msgid "" +"If no data was set under the index, set *extra* to ``NULL`` and return 0 " +"without setting an exception." +msgstr "如果未在索引下设置数据,则将 *extra* 设为 ``NULL`` 并返回 0 而不设置异常。" + +#: ../../c-api/code.rst:338 +msgid "as ``_PyCode_GetExtra``" +msgstr "作为 ``_PyCode_GetExtra``" + +#: ../../c-api/code.rst:342 +msgid "" +"Renamed to ``PyUnstable_Code_GetExtra``. The old private name is deprecated," +" but will be available until the API changes." +msgstr "重命名为 ``PyUnstable_Code_GetExtra``。旧的私有名称已被弃用,但在 API 更改之前仍将可用。" + +#: ../../c-api/code.rst:351 +msgid "" +"Set the extra data stored under the given index to *extra*. Return 0 on " +"success. Set an exception and return -1 on failure." +msgstr "将存储在给定索引下的额外数据设为 *extra*。成功时将返回 0。失败时将设置一个异常并返回 -1。" + +#: ../../c-api/code.rst:354 +msgid "as ``_PyCode_SetExtra``" +msgstr "作为 ``_PyCode_SetExtra``" + +#: ../../c-api/code.rst:358 +msgid "" +"Renamed to ``PyUnstable_Code_SetExtra``. The old private name is deprecated," +" but will be available until the API changes." +msgstr "重命名为 ``PyUnstable_Code_SetExtra``。旧的私有名称已被弃用,但在 API 更改之前仍将可用。" + +#: ../../c-api/code.rst:3 +msgid "object" +msgstr "object -- 对象" + +#: ../../c-api/code.rst:3 +msgid "code" +msgstr "code -- 代码" + +#: ../../c-api/code.rst:3 +msgid "code object" +msgstr "代码对象" + +#: ../../c-api/code.rst:64 +msgid "PyCode_New (C function)" +msgstr "PyCode_New (C 函数)" diff --git a/c-api/codec.po b/c-api/codec.po new file mode 100644 index 0000000000..751a7aa589 --- /dev/null +++ b/c-api/codec.po @@ -0,0 +1,201 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/codec.rst:4 +msgid "Codec registry and support functions" +msgstr "编解码器注册与支持功能" + +#: ../../c-api/codec.rst:8 +msgid "Register a new codec search function." +msgstr "注册一个新的编解码器搜索函数。" + +#: ../../c-api/codec.rst:10 +msgid "" +"As a side effect, this tries to load the :mod:`!encodings` package, if not " +"yet done, to make sure that it is always first in the list of search " +"functions." +msgstr "作为附带影响,这将尝试加载 :mod:`!encodings` 包,如果还没有加载的话,以确保它始终位于搜索函数列表的第一位。" + +#: ../../c-api/codec.rst:15 +msgid "" +"Unregister a codec search function and clear the registry's cache. If the " +"search function is not registered, do nothing. Return 0 on success. Raise an" +" exception and return -1 on error." +msgstr "注销一个编解码器搜索函数并清空注册表缓存。如果指定搜索函数未被注册,则不做任何操作。成功时返回 0。出错时引发一个异常并返回 -1。" + +#: ../../c-api/codec.rst:23 +msgid "" +"Return ``1`` or ``0`` depending on whether there is a registered codec for " +"the given *encoding*. This function always succeeds." +msgstr "根据注册的给定 *encoding* 的编解码器是否已存在而返回 ``1`` 或 ``0``。此函数总能成功。" + +#: ../../c-api/codec.rst:28 +msgid "Generic codec based encoding API." +msgstr "通用的基于编解码器的编码 API。" + +#: ../../c-api/codec.rst:30 +msgid "" +"*object* is passed through the encoder function found for the given " +"*encoding* using the error handling method defined by *errors*. *errors* " +"may be ``NULL`` to use the default method defined for the codec. Raises a " +":exc:`LookupError` if no encoder can be found." +msgstr "" +"*object* 使用由 *errors* 所定义的错误处理方法传递给定 *encoding* 的编码器函数。 *errors* 可以为 " +"``NULL`` 表示使用为编码器所定义的默认方法。如果找不到编码器则会引发 :exc:`LookupError`。" + +#: ../../c-api/codec.rst:37 +msgid "Generic codec based decoding API." +msgstr "通用的基于编解码器的解码 API。" + +#: ../../c-api/codec.rst:39 +msgid "" +"*object* is passed through the decoder function found for the given " +"*encoding* using the error handling method defined by *errors*. *errors* " +"may be ``NULL`` to use the default method defined for the codec. Raises a " +":exc:`LookupError` if no decoder can be found." +msgstr "" +"*object* 使用由 *errors* 所定义的错误处理方法传递给定 *encoding* 的解码器函数。 *errors* 可以为 " +"``NULL`` 表示使用为编解码器所定义的默认方法。如果找不到编解码器则会引发 :exc:`LookupError`。" + +#: ../../c-api/codec.rst:46 +msgid "Codec lookup API" +msgstr "Codec 查找 API" + +#: ../../c-api/codec.rst:48 +msgid "" +"In the following functions, the *encoding* string is looked up converted to " +"all lower-case characters, which makes encodings looked up through this " +"mechanism effectively case-insensitive. If no codec is found, a " +":exc:`KeyError` is set and ``NULL`` returned." +msgstr "" +"在下列函数中,*encoding* 字符串会被查找并转换为小写字母形式,这使得通过此机制查找编码格式实际上对大小写不敏感。 " +"如果未找到任何编解码器,则将设置 :exc:`KeyError` 并返回 ``NULL``。" + +#: ../../c-api/codec.rst:55 +msgid "Get an encoder function for the given *encoding*." +msgstr "为给定的 *encoding* 获取一个编码器函数。" + +#: ../../c-api/codec.rst:59 +msgid "Get a decoder function for the given *encoding*." +msgstr "为给定的 *encoding* 获取一个解码器函数。" + +#: ../../c-api/codec.rst:63 +msgid "" +"Get an :class:`~codecs.IncrementalEncoder` object for the given *encoding*." +msgstr "为给定的 *encoding* 获取一个 :class:`~codecs.IncrementalEncoder` 对象。" + +#: ../../c-api/codec.rst:67 +msgid "" +"Get an :class:`~codecs.IncrementalDecoder` object for the given *encoding*." +msgstr "为给定的 *encoding* 获取一个 :class:`~codecs.IncrementalDecoder` 对象。" + +#: ../../c-api/codec.rst:71 +msgid "" +"Get a :class:`~codecs.StreamReader` factory function for the given " +"*encoding*." +msgstr "为给定的 *encoding* 获取一个 :class:`~codecs.StreamReader` 工厂函数。" + +#: ../../c-api/codec.rst:75 +msgid "" +"Get a :class:`~codecs.StreamWriter` factory function for the given " +"*encoding*." +msgstr "为给定的 *encoding* 获取一个 :class:`~codecs.StreamWriter` 工厂函数。" + +#: ../../c-api/codec.rst:79 +msgid "Registry API for Unicode encoding error handlers" +msgstr "用于 Unicode 编码错误处理程序的注册表 API" + +#: ../../c-api/codec.rst:83 +msgid "" +"Register the error handling callback function *error* under the given " +"*name*. This callback function will be called by a codec when it encounters " +"unencodable characters/undecodable bytes and *name* is specified as the " +"error parameter in the call to the encode/decode function." +msgstr "" +"在给定的 *name* 之下注册错误处理回调函数 *error*。该回调函数将在一个编解码器遇到无法编码的字符/无法解码的字节数据并且 *name* " +"被指定为 encode/decode 函数调用的 error 形参时由该编解码器来调用。" + +#: ../../c-api/codec.rst:88 +msgid "" +"The callback gets a single argument, an instance of " +":exc:`UnicodeEncodeError`, :exc:`UnicodeDecodeError` or " +":exc:`UnicodeTranslateError` that holds information about the problematic " +"sequence of characters or bytes and their offset in the original string (see" +" :ref:`unicodeexceptions` for functions to extract this information). The " +"callback must either raise the given exception, or return a two-item tuple " +"containing the replacement for the problematic sequence, and an integer " +"giving the offset in the original string at which encoding/decoding should " +"be resumed." +msgstr "" +"该回调函数会接受一个 :exc:`UnicodeEncodeError`, :exc:`UnicodeDecodeError` 或 " +":exc:`UnicodeTranslateError` 的实例作为单独参数,其中包含关于有问题的字符或字节序列及其在原始字符串中的偏移量信息(请参阅 " +":ref:`unicodeexceptions` 了解提取此信息的函数详情)。 " +"该回调函数必须引发给定的异常,或者返回一个二元组,其中包含有问题序列的替换内容以及一个整数,该整数给出应在原始字符串中恢复编码/解码操作的偏移量。" + +#: ../../c-api/codec.rst:98 +msgid "Return ``0`` on success, ``-1`` on error." +msgstr "成功则返回 ``0``,失败则返回 ``-1``。" + +#: ../../c-api/codec.rst:102 +msgid "" +"Lookup the error handling callback function registered under *name*. As a " +"special case ``NULL`` can be passed, in which case the error handling " +"callback for \"strict\" will be returned." +msgstr "" +"查找在 *name* 之下注册的错误处理回调函数。作为特例还可以传入 ``NULL``,在此情况下将返回针对 \"strict\" 的错误处理回调函数。" + +#: ../../c-api/codec.rst:108 +msgid "Raise *exc* as an exception." +msgstr "引发 *exc* 作为异常。" + +#: ../../c-api/codec.rst:112 +msgid "Ignore the unicode error, skipping the faulty input." +msgstr "忽略 unicode 错误,跳过错误的输入。" + +#: ../../c-api/codec.rst:116 +msgid "Replace the unicode encode error with ``?`` or ``U+FFFD``." +msgstr "使用 ``?`` 或 ``U+FFFD`` 替换 unicode 编码错误。" + +#: ../../c-api/codec.rst:120 +msgid "Replace the unicode encode error with XML character references." +msgstr "使用 XML 字符引用替换 unicode 编码错误。" + +#: ../../c-api/codec.rst:124 +msgid "" +"Replace the unicode encode error with backslash escapes (``\\x``, ``\\u`` " +"and ``\\U``)." +msgstr "使用反斜杠转义符 (``\\x``, ``\\u`` 和 ``\\U``) 替换 unicode 编码错误。" + +#: ../../c-api/codec.rst:129 +msgid "Replace the unicode encode error with ``\\N{...}`` escapes." +msgstr "使用 ``\\N{...}`` 转义符替换 unicode 编码错误。" + +#: ../../c-api/codec.rst:135 +msgid "Codec utility variables" +msgstr "编解码器工具变量" + +#: ../../c-api/codec.rst:139 +msgid "" +"A string constant containing the lowercase hexadecimal digits: " +"``\"0123456789abcdef\"``." +msgstr "一个包含小写形式十六进制数位的字符串: ``\"0123456789abcdef\"``。" diff --git a/c-api/complex.po b/c-api/complex.po new file mode 100644 index 0000000000..57f3958dfc --- /dev/null +++ b/c-api/complex.po @@ -0,0 +1,264 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:00+0000\n" +"Last-Translator: 99 , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/complex.rst:6 +msgid "Complex Number Objects" +msgstr "复数对象" + +#: ../../c-api/complex.rst:13 +msgid "" +"This subtype of :c:type:`PyObject` represents a Python complex number " +"object." +msgstr "这个 C 类型 :c:type:`PyObject` 的子类型代表一个 Python 复数对象。" + +#: ../../c-api/complex.rst:17 +msgid "" +"The complex number value, using the C :c:type:`Py_complex` representation." +msgstr "" + +#: ../../c-api/complex.rst:19 +msgid "" +"Use :c:func:`PyComplex_AsCComplex` and :c:func:`PyComplex_FromCComplex` to " +"convert a Python complex number to/from the C :c:type:`Py_complex` " +"representation." +msgstr "" + +#: ../../c-api/complex.rst:28 +msgid "" +"This instance of :c:type:`PyTypeObject` represents the Python complex number" +" type. It is the same object as :class:`complex` in the Python layer." +msgstr "" +"这是个属于 :c:type:`PyTypeObject` 的代表 Python 复数类型的实例。在 Python 层面的类型 " +":class:`complex` 是同一个对象。" + +#: ../../c-api/complex.rst:34 +msgid "" +"Return true if its argument is a :c:type:`PyComplexObject` or a subtype of " +":c:type:`PyComplexObject`. This function always succeeds." +msgstr "" +"如果它的参数是一个 :c:type:`PyComplexObject` 或者 :c:type:`PyComplexObject` 的子类型则返回真值。 " +"此函数总是会成功执行。" + +#: ../../c-api/complex.rst:40 +msgid "" +"Return true if its argument is a :c:type:`PyComplexObject`, but not a " +"subtype of :c:type:`PyComplexObject`. This function always succeeds." +msgstr "" +"如果它的参数是一个 :c:type:`PyComplexObject` 但不是 :c:type:`PyComplexObject` 的子类型则返回真值。" +" 此函数总是会成功执行。" + +#: ../../c-api/complex.rst:46 +msgid "" +"Return a new :c:type:`PyComplexObject` object from *real* and *imag*. Return" +" ``NULL`` with an exception set on error." +msgstr "" +"根据 *real* 和 *imag* 返回一个新的 :c:type:`PyComplexObject` 对象。当发生错误时将返回 ``NULL`` " +"并设置一个异常。" + +#: ../../c-api/complex.rst:52 +msgid "Return the real part of *op* as a C :c:expr:`double`." +msgstr "以 C 类型 :c:expr:`double` 返回 *op* 的实部。" + +#: ../../c-api/complex.rst:54 +msgid "" +"If *op* is not a Python complex number object but has a " +":meth:`~object.__complex__` method, this method will first be called to " +"convert *op* to a Python complex number object. If :meth:`!__complex__` is " +"not defined then it falls back to call :c:func:`PyFloat_AsDouble` and " +"returns its result." +msgstr "" +"如果 *op* 不是一个 Python 复数对象但是具有 :meth:`~object.__complex__` 方法,则会先调用该方法将 *op* " +"转换为 Python 复数对象。如果未定义 :meth:`!__complex__` 则将回退为调用 " +":c:func:`PyFloat_AsDouble` 并返回其结果。" + +#: ../../c-api/complex.rst:60 ../../c-api/complex.rst:76 +msgid "" +"Upon failure, this method returns ``-1.0`` with an exception set, so one " +"should call :c:func:`PyErr_Occurred` to check for errors." +msgstr "" +"当失败时,此方法将返回 ``-1.0`` 并设置一个异常,因此开发者应当调用 :c:func:`PyErr_Occurred` 来检查错误。" + +#: ../../c-api/complex.rst:63 ../../c-api/complex.rst:79 +msgid "Use :meth:`~object.__complex__` if available." +msgstr "如果可能将使用 :meth:`~object.__complex__`。" + +#: ../../c-api/complex.rst:68 +msgid "Return the imaginary part of *op* as a C :c:expr:`double`." +msgstr "以 C 类型 :c:expr:`double` 返回 *op* 的虚部。" + +#: ../../c-api/complex.rst:70 +msgid "" +"If *op* is not a Python complex number object but has a " +":meth:`~object.__complex__` method, this method will first be called to " +"convert *op* to a Python complex number object. If :meth:`!__complex__` is " +"not defined then it falls back to call :c:func:`PyFloat_AsDouble` and " +"returns ``0.0`` on success." +msgstr "" +"如果 *op* 不是一个 Python 复数对象但是具有 :meth:`~object.__complex__` 方法,则会先调用该方法将 *op* " +"转换为 Python 复数对象。如果未定义 :meth:`!__complex__` 则将回退为调用 " +":c:func:`PyFloat_AsDouble` 并在成功时返回 ``0.0``。" + +#: ../../c-api/complex.rst:85 +msgid "" +"This C structure defines an export format for a Python complex number " +"object." +msgstr "" + +#: ../../c-api/complex.rst:91 +msgid "The structure is defined as::" +msgstr "其结构定义如下::" + +#: ../../c-api/complex.rst:93 +msgid "" +"typedef struct {\n" +" double real;\n" +" double imag;\n" +"} Py_complex;" +msgstr "" +"typedef struct {\n" +" double real;\n" +" double imag;\n" +"} Py_complex;" + +#: ../../c-api/complex.rst:101 +msgid "" +"Create a new Python complex number object from a C :c:type:`Py_complex` " +"value. Return ``NULL`` with an exception set on error." +msgstr "" +"根据一个 C :c:type:`Py_complex` 值新建 Python 复数对象。当发生错误时将返回 ``NULL`` 并设置一个异常。" + +#: ../../c-api/complex.rst:107 +msgid "Return the :c:type:`Py_complex` value of the complex number *op*." +msgstr "返回复数 *op* 的 C 类型 :c:type:`Py_complex` 值。" + +#: ../../c-api/complex.rst:109 +msgid "" +"If *op* is not a Python complex number object but has a " +":meth:`~object.__complex__` method, this method will first be called to " +"convert *op* to a Python complex number object. If :meth:`!__complex__` is " +"not defined then it falls back to :meth:`~object.__float__`. If " +":meth:`!__float__` is not defined then it falls back to " +":meth:`~object.__index__`." +msgstr "" +"如果 *op* 不是一个 Python 复数对象但是具有 :meth:`~object.__complex__` 方法,则会先调用该方法将 *op* " +"转换为 Python 复数对象。如果未定义 :meth:`!__complex__` 则将回退至 :meth:`~object.__float__`。 " +"如果未定义 :meth:`!__float__` 则将回退至 :meth:`~object.__index__`。" + +#: ../../c-api/complex.rst:115 +msgid "" +"Upon failure, this method returns :c:type:`Py_complex` with " +":c:member:`~Py_complex.real` set to ``-1.0`` and with an exception set, so " +"one should call :c:func:`PyErr_Occurred` to check for errors." +msgstr "" +"当失败时,此方法将返回 :c:type:`Py_complex` 其中 :c:member:`~Py_complex.real` 为 ``-1.0`` " +"并设置一个异常,因此开发者应当调用 :c:func:`PyErr_Occurred` 来检查错误。" + +#: ../../c-api/complex.rst:119 +msgid "Use :meth:`~object.__index__` if available." +msgstr "如果可能将使用 :meth:`~object.__index__`。" + +#: ../../c-api/complex.rst:124 +msgid "Complex Numbers as C Structures" +msgstr "表示复数的 C 结构体" + +#: ../../c-api/complex.rst:126 +msgid "" +"The API also provides functions for working with complex numbers, using the " +":c:type:`Py_complex` representation. Note that the functions which accept " +"these structures as parameters and return them as results do so *by value* " +"rather than dereferencing them through pointers." +msgstr "" + +#: ../../c-api/complex.rst:131 +msgid "" +"Please note, that these functions are :term:`soft deprecated` since Python " +"3.15. Avoid using this API in a new code to do complex arithmetic: either " +"use the `Number Protocol `_ API or use native complex types, like " +":c:expr:`double complex`." +msgstr "" + +#: ../../c-api/complex.rst:139 +msgid "" +"Return the sum of two complex numbers, using the C :c:type:`Py_complex` " +"representation." +msgstr "返回两个复数的和,用 C 类型 :c:type:`Py_complex` 表示。" + +#: ../../c-api/complex.rst:147 +msgid "" +"Return the difference between two complex numbers, using the C " +":c:type:`Py_complex` representation." +msgstr "返回两个复数的差,用 C 类型 :c:type:`Py_complex` 表示。" + +#: ../../c-api/complex.rst:155 +msgid "" +"Return the negation of the complex number *num*, using the C " +":c:type:`Py_complex` representation." +msgstr "返回复数 *num* 的负值,用 C :c:type:`Py_complex` 表示。" + +#: ../../c-api/complex.rst:163 +msgid "" +"Return the product of two complex numbers, using the C :c:type:`Py_complex` " +"representation." +msgstr "返回两个复数的乘积,用 C 类型 :c:type:`Py_complex` 表示。" + +#: ../../c-api/complex.rst:171 +msgid "" +"Return the quotient of two complex numbers, using the C :c:type:`Py_complex`" +" representation." +msgstr "返回两个复数的商,用 C 类型 :c:type:`Py_complex` 表示。" + +#: ../../c-api/complex.rst:174 +msgid "" +"If *divisor* is null, this method returns zero and sets :c:data:`errno` to " +":c:macro:`!EDOM`." +msgstr "如果 *divisor* 为空,则此方法将返回零并将 :c:data:`errno` 设为 :c:macro:`!EDOM`。" + +#: ../../c-api/complex.rst:182 +msgid "" +"Return the exponentiation of *num* by *exp*, using the C " +":c:type:`Py_complex` representation." +msgstr "返回 *num* 的 *exp* 次幂,用 C 类型 :c:type:`Py_complex` 表示。" + +#: ../../c-api/complex.rst:185 +msgid "" +"If *num* is null and *exp* is not a positive real number, this method " +"returns zero and sets :c:data:`errno` to :c:macro:`!EDOM`." +msgstr "" +"如果 *num* 为空且 *exp* 不是正实数,则此方法将返回零并将 :c:data:`errno` 设为 :c:macro:`!EDOM`。" + +#: ../../c-api/complex.rst:188 ../../c-api/complex.rst:197 +msgid "Set :c:data:`errno` to :c:macro:`!ERANGE` on overflows." +msgstr "当溢出时将 :c:data:`errno` 设为 :c:macro:`!ERANGE`。" + +#: ../../c-api/complex.rst:195 +msgid "Return the absolute value of the complex number *num*." +msgstr "" + +#: ../../c-api/complex.rst:8 +msgid "object" +msgstr "object -- 对象" + +#: ../../c-api/complex.rst:8 +msgid "complex number" +msgstr "complex number -- 复数" diff --git a/c-api/concrete.po b/c-api/concrete.po new file mode 100644 index 0000000000..3dffad5cfc --- /dev/null +++ b/c-api/concrete.po @@ -0,0 +1,108 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/concrete.rst:8 +msgid "Concrete Objects Layer" +msgstr "具体的对象层" + +#: ../../c-api/concrete.rst:10 +msgid "" +"The functions in this chapter are specific to certain Python object types. " +"Passing them an object of the wrong type is not a good idea; if you receive " +"an object from a Python program and you are not sure that it has the right " +"type, you must perform a type check first; for example, to check that an " +"object is a dictionary, use :c:func:`PyDict_Check`. The chapter is " +"structured like the \"family tree\" of Python object types." +msgstr "" +"本章中的函数特定于某些 Python 对象类型。将错误类型的对象传递给它们并不是一个好主意;如果您从 Python " +"程序接收到一个对象,但不确定它是否具有正确的类型,则必须首先执行类型检查;例如,要检查对象是否为字典,请使用 " +":c:func:`PyDict_Check`。本章的结构类似于 Python 对象类型的“家族树”。" + +#: ../../c-api/concrete.rst:19 +msgid "" +"While the functions described in this chapter carefully check the type of " +"the objects which are passed in, many of them do not check for ``NULL`` " +"being passed instead of a valid object. Allowing ``NULL`` to be passed in " +"can cause memory access violations and immediate termination of the " +"interpreter." +msgstr "" +"虽然本章所描述的函数会仔细检查传入对象的类型,但是其中许多函数不会检查传入的对象是否为 ``NULL``。允许传入 ``NULL`` " +"可能导致内存访问冲突和解释器的立即终止。" + +#: ../../c-api/concrete.rst:28 +msgid "Fundamental Objects" +msgstr "基本对象" + +#: ../../c-api/concrete.rst:30 +msgid "" +"This section describes Python type objects and the singleton object " +"``None``." +msgstr "本节描述 Python 类型对象和单例对象 ``None``。" + +#: ../../c-api/concrete.rst:41 +msgid "Numeric Objects" +msgstr "数值对象" + +#: ../../c-api/concrete.rst:56 +msgid "Sequence Objects" +msgstr "序列对象" + +#: ../../c-api/concrete.rst:60 +msgid "" +"Generic operations on sequence objects were discussed in the previous " +"chapter; this section deals with the specific kinds of sequence objects that" +" are intrinsic to the Python language." +msgstr "序列对象的一般操作在前一章中讨论过;本节介绍 Python 语言固有的特定类型的序列对象。" + +#: ../../c-api/concrete.rst:78 +msgid "Container Objects" +msgstr "容器对象" + +#: ../../c-api/concrete.rst:91 +msgid "Function Objects" +msgstr "函数对象" + +#: ../../c-api/concrete.rst:102 +msgid "Other Objects" +msgstr "其他对象" + +#: ../../c-api/concrete.rst:123 +msgid "C API for extension modules" +msgstr "针对扩展模块的 C API" + +#: ../../c-api/concrete.rst:43 ../../c-api/concrete.rst:58 +#: ../../c-api/concrete.rst:80 +msgid "object" +msgstr "object -- 对象" + +#: ../../c-api/concrete.rst:43 +msgid "numeric" +msgstr "数字" + +#: ../../c-api/concrete.rst:58 +msgid "sequence" +msgstr "sequence" + +#: ../../c-api/concrete.rst:80 +msgid "mapping" +msgstr "mapping -- 映射" diff --git a/c-api/contextvars.po b/c-api/contextvars.po new file mode 100644 index 0000000000..fcd103d5a5 --- /dev/null +++ b/c-api/contextvars.po @@ -0,0 +1,265 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/contextvars.rst:6 +msgid "Context Variables Objects" +msgstr "上下文变量对象" + +#: ../../c-api/contextvars.rst:15 +msgid "" +"In Python 3.7.1 the signatures of all context variables C APIs were " +"**changed** to use :c:type:`PyObject` pointers instead of " +":c:type:`PyContext`, :c:type:`PyContextVar`, and :c:type:`PyContextToken`, " +"e.g.::" +msgstr "" +"在 Python 3.7.1 中,所有上下文变量 C API 的签名被 **更改** 为使用 :c:type:`PyObject` 指针而不是 " +":c:type:`PyContext`, :c:type:`PyContextVar` 以及 :c:type:`PyContextToken`,例如::" + +#: ../../c-api/contextvars.rst:20 +msgid "" +"// in 3.7.0:\n" +"PyContext *PyContext_New(void);\n" +"\n" +"// in 3.7.1+:\n" +"PyObject *PyContext_New(void);" +msgstr "" +"// 在 3.7.0:\n" +"PyContext *PyContext_New(void);\n" +"\n" +"// 在 3.7.1+:\n" +"PyObject *PyContext_New(void);" + +#: ../../c-api/contextvars.rst:26 +msgid "See :issue:`34762` for more details." +msgstr "请参阅 :issue:`34762` 了解详情。" + +#: ../../c-api/contextvars.rst:29 +msgid "" +"This section details the public C API for the :mod:`contextvars` module." +msgstr "本节深入介绍了 :mod:`contextvars` 模块的公用 C API。" + +#: ../../c-api/contextvars.rst:33 +msgid "" +"The C structure used to represent a :class:`contextvars.Context` object." +msgstr "用于表示 :class:`contextvars.Context` 对象的 C 结构体。" + +#: ../../c-api/contextvars.rst:38 +msgid "" +"The C structure used to represent a :class:`contextvars.ContextVar` object." +msgstr "用于表示 :class:`contextvars.ContextVar` 对象的 C 结构体。" + +#: ../../c-api/contextvars.rst:43 +msgid "The C structure used to represent a :class:`contextvars.Token` object." +msgstr "用于表示 :class:`contextvars.Token` 对象的 C 结构体。" + +#: ../../c-api/contextvars.rst:47 +msgid "The type object representing the *context* type." +msgstr "表示 *context* 类型的类型对象。" + +#: ../../c-api/contextvars.rst:51 +msgid "The type object representing the *context variable* type." +msgstr "表示 *context variable* 类型的类型对象。" + +#: ../../c-api/contextvars.rst:55 +msgid "The type object representing the *context variable token* type." +msgstr "表示 *context variable token* 类型的类型对象。" + +#: ../../c-api/contextvars.rst:58 +msgid "Type-check macros:" +msgstr "类型检查宏:" + +#: ../../c-api/contextvars.rst:62 +msgid "" +"Return true if *o* is of type :c:data:`PyContext_Type`. *o* must not be " +"``NULL``. This function always succeeds." +msgstr "" +"如果 *o* 的类型为 :c:data:`PyContext_Type` 则返回真值。 *o* 必须不为 ``NULL``。此函数总是会成功执行。" + +#: ../../c-api/contextvars.rst:67 +msgid "" +"Return true if *o* is of type :c:data:`PyContextVar_Type`. *o* must not be " +"``NULL``. This function always succeeds." +msgstr "" +"如果 *o* 的类型为 :c:data:`PyContextVar_Type` 则返回真值。 *o* 必须不为 ``NULL``。 " +"此函数总是会成功执行。" + +#: ../../c-api/contextvars.rst:72 +msgid "" +"Return true if *o* is of type :c:data:`PyContextToken_Type`. *o* must not be" +" ``NULL``. This function always succeeds." +msgstr "" +"如果 *o* 的类型为 :c:data:`PyContextToken_Type` 则返回真值。 *o* 必须不为 ``NULL``。 " +"此函数总是会成功执行。" + +#: ../../c-api/contextvars.rst:76 +msgid "Context object management functions:" +msgstr "上下文对象管理函数:" + +#: ../../c-api/contextvars.rst:80 +msgid "" +"Create a new empty context object. Returns ``NULL`` if an error has " +"occurred." +msgstr "创建一个新的空上下文对象。如果发生错误则返回 ``NULL``。" + +#: ../../c-api/contextvars.rst:85 +msgid "" +"Create a shallow copy of the passed *ctx* context object. Returns ``NULL`` " +"if an error has occurred." +msgstr "创建所传入的 *ctx* 上下文对象的浅拷贝。如果发生错误则返回 ``NULL``。" + +#: ../../c-api/contextvars.rst:90 +msgid "" +"Create a shallow copy of the current thread context. Returns ``NULL`` if an " +"error has occurred." +msgstr "创建当前线程上下文的浅拷贝。如果发生错误则返回 ``NULL``。" + +#: ../../c-api/contextvars.rst:95 +msgid "" +"Set *ctx* as the current context for the current thread. Returns ``0`` on " +"success, and ``-1`` on error." +msgstr "将 *ctx* 设为当前线程的当前上下文。成功时返回 ``0``,出错时返回 ``-1``。" + +#: ../../c-api/contextvars.rst:100 +msgid "" +"Deactivate the *ctx* context and restore the previous context as the current" +" context for the current thread. Returns ``0`` on success, and ``-1`` on " +"error." +msgstr "取消激活 *ctx* 上下文并将之前的上下文恢复为当前线程的当前上下文。成功时返回 ``0``,出错时返回 ``-1``。" + +#: ../../c-api/contextvars.rst:106 +msgid "" +"Register *callback* as a context object watcher for the current interpreter." +" Return an ID which may be passed to :c:func:`PyContext_ClearWatcher`. In " +"case of error (e.g. no more watcher IDs available), return ``-1`` and set an" +" exception." +msgstr "" +"注册 *callback* 作为当前解释器的上下文对象监视器。返回一个可被传递给 :c:func:`PyContext_ClearWatcher` 的 " +"ID。当出错时(例如没有可用的监视器 ID),则返回 ``-1`` 并设置一个异常。" + +#: ../../c-api/contextvars.rst:115 +msgid "" +"Clear watcher identified by *watcher_id* previously returned from " +":c:func:`PyContext_AddWatcher` for the current interpreter. Return ``0`` on " +"success, or ``-1`` and set an exception on error (e.g. if the given " +"*watcher_id* was never registered.)" +msgstr "" +"清除之前从 :c:func:`PyContext_AddWatcher` 返回的当前解释器中由 *watcher_id* 所标识的监视器。成功时返回 " +"``0``,或者出错时(例如当给定的 *watcher_id* 未被注册)返回 ``-1`` 并设置异常。" + +#: ../../c-api/contextvars.rst:124 +msgid "Enumeration of possible context object watcher events:" +msgstr "由可能的上下文对象监视器事件组成的枚举:" + +#: ../../c-api/contextvars.rst:126 +msgid "" +"``Py_CONTEXT_SWITCHED``: The :term:`current context` has switched to a " +"different context. The object passed to the watch callback is the now-" +"current :class:`contextvars.Context` object, or None if no context is " +"current." +msgstr "" +"``Py_CONTEXT_SWITCHED``: :term:`current context` 已切换到不同的上下文。 " +"传递给监视回调函数的对象是当前的 :class:`contextvars.Context` 对象,或 None(如果没有当前上下文)。" + +#: ../../c-api/contextvars.rst:135 +msgid "" +"Context object watcher callback function. The object passed to the callback" +" is event-specific; see :c:type:`PyContextEvent` for details." +msgstr "上下文对象监视器回调函数。传递给回调函数的对象是特定于事件的;有关详细信息,请参阅 :c:type:`PyContextEvent`。" + +#: ../../c-api/contextvars.rst:138 +msgid "" +"If the callback returns with an exception set, it must return ``-1``; this " +"exception will be printed as an unraisable exception using " +":c:func:`PyErr_FormatUnraisable`. Otherwise it should return ``0``." +msgstr "" +"如果回调函数返回时设置了一个异常,则它必须返回 ``-1``;此异常将作为不可引发的异常使用 " +":c:func:`PyErr_FormatUnraisable` 打印出来。在其他情况下它应当返回 ``0``。" + +#: ../../c-api/contextvars.rst:142 +msgid "" +"There may already be a pending exception set on entry to the callback. In " +"this case, the callback should return ``0`` with the same exception still " +"set. This means the callback may not call any other API that can set an " +"exception unless it saves and clears the exception state first, and restores" +" it before returning." +msgstr "" +"在进入回调时可能已经设置了尚未处理的异常。在此情况下,回调应当返回 ``0`` 并仍然设置同样的异常。这意味着该回调可能不会调用任何其他可设置异常的 " +"API 除非它先保存并清空异常状态,并在返回之前恢复它。" + +#: ../../c-api/contextvars.rst:151 +msgid "Context variable functions:" +msgstr "上下文变量函数:" + +#: ../../c-api/contextvars.rst:155 +msgid "" +"Create a new ``ContextVar`` object. The *name* parameter is used for " +"introspection and debug purposes. The *def* parameter specifies a default " +"value for the context variable, or ``NULL`` for no default. If an error has " +"occurred, this function returns ``NULL``." +msgstr "" +"创建一个新的 ``ContextVar`` 对象。形参 *name* 用于内省和调试目的。形参 *def* 为上下文变量指定默认值,或为 " +"``NULL`` 表示无默认值。如果发生错误,这个函数会返回 ``NULL``。" + +#: ../../c-api/contextvars.rst:162 +msgid "" +"Get the value of a context variable. Returns ``-1`` if an error has " +"occurred during lookup, and ``0`` if no error occurred, whether or not a " +"value was found." +msgstr "获取上下文变量的值。如果在查找过程中发生错误,返回 ``-1``,如果没有发生错误,无论是否找到值,都返回 ``0``。" + +#: ../../c-api/contextvars.rst:166 +msgid "" +"If the context variable was found, *value* will be a pointer to it. If the " +"context variable was *not* found, *value* will point to:" +msgstr "如果找到上下文变量,*value* 将是指向它的指针。如果上下文变量 *没有* 找到,*value* 将指向:" + +#: ../../c-api/contextvars.rst:169 +msgid "*default_value*, if not ``NULL``;" +msgstr "*default_value*,如果非 ``NULL``;" + +#: ../../c-api/contextvars.rst:170 +msgid "the default value of *var*, if not ``NULL``;" +msgstr "*var* 的默认值,如果不是 ``NULL``;" + +#: ../../c-api/contextvars.rst:171 +msgid "``NULL``" +msgstr "``NULL``" + +#: ../../c-api/contextvars.rst:173 +msgid "Except for ``NULL``, the function returns a new reference." +msgstr "除了返回 ``NULL``,这个函数会返回一个新的引用。" + +#: ../../c-api/contextvars.rst:177 +msgid "" +"Set the value of *var* to *value* in the current context. Returns a new " +"token object for this change, or ``NULL`` if an error has occurred." +msgstr "在当前上下文中将 *var* 设为 *value*。返回针对此修改的新令牌对象,或者如果发生错误则返回 ``NULL``。" + +#: ../../c-api/contextvars.rst:182 +msgid "" +"Reset the state of the *var* context variable to that it was in before " +":c:func:`PyContextVar_Set` that returned the *token* was called. This " +"function returns ``0`` on success and ``-1`` on error." +msgstr "" +"将上下文变量 *var* 的状态重置为它在返回 *token* 的 :c:func:`PyContextVar_Set` 被调用之前的状态。 " +"此函数成功时返回 ``0``,出错时返回 ``-1``。" diff --git a/c-api/conversion.po b/c-api/conversion.po new file mode 100644 index 0000000000..2973ff3481 --- /dev/null +++ b/c-api/conversion.po @@ -0,0 +1,397 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:00+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/conversion.rst:6 +msgid "String conversion and formatting" +msgstr "字符串转换与格式化" + +#: ../../c-api/conversion.rst:8 +msgid "Functions for number conversion and formatted string output." +msgstr "用于数字转换和格式化字符串输出的函数" + +#: ../../c-api/conversion.rst:13 +msgid "" +"Output not more than *size* bytes to *str* according to the format string " +"*format* and the extra arguments. See the Unix man page " +":manpage:`snprintf(3)`." +msgstr "" +"根据格式字符串 *format* 和额外参数,输出不超过 *size* 个字节到 *str*。参见 Unix 手册页面 " +":manpage:`snprintf(3)` 了解更多。" + +#: ../../c-api/conversion.rst:19 +msgid "" +"Output not more than *size* bytes to *str* according to the format string " +"*format* and the variable argument list *va*. Unix man page " +":manpage:`vsnprintf(3)`." +msgstr "" +"根据格式字符串 *format* 和变量参数列表 *va*,输出不超过 *size* 个字节到 *str*。参见 Unix 手册页面 " +":manpage:`vsnprintf(3)` 了解更多。" + +#: ../../c-api/conversion.rst:23 +msgid "" +":c:func:`PyOS_snprintf` and :c:func:`PyOS_vsnprintf` wrap the Standard C " +"library functions :c:func:`snprintf` and :c:func:`vsnprintf`. Their purpose " +"is to guarantee consistent behavior in corner cases, which the Standard C " +"functions do not." +msgstr "" +":c:func:`PyOS_snprintf` 和 :c:func:`PyOS_vsnprintf` 包装 C 标准库函数 " +":c:func:`snprintf` 和 :c:func:`vsnprintf`。它们的目的是保证在极端情况下的一致行为,而标准 C 的函数则不然。" + +#: ../../c-api/conversion.rst:28 +msgid "" +"The wrappers ensure that ``str[size-1]`` is always ``'\\0'`` upon return. " +"They never write more than *size* bytes (including the trailing ``'\\0'``) " +"into str. Both functions require that ``str != NULL``, ``size > 0``, " +"``format != NULL`` and ``size < INT_MAX``. Note that this means there is no " +"equivalent to the C99 ``n = snprintf(NULL, 0, ...)`` which would determine " +"the necessary buffer size." +msgstr "" +"此包装器会确保 ``str[size-1]`` 在返回时始终为 ``'\\0'``。它们从不写入超过 *size* 字节 (包括末尾的 " +"``'\\0'``) 到 str。两个函数都要求 ``str != NULL``, ``size > 0``, ``format != NULL`` 且" +" ``size < INT_MAX``。请注意这意味着不存在可确定所需缓冲区大小的 C99 ``n = snprintf(NULL, 0, ...)``" +" 的等价物。" + +#: ../../c-api/conversion.rst:34 +msgid "" +"The return value (*rv*) for these functions should be interpreted as " +"follows:" +msgstr "这些函数的返回值( *rv* )应按照以下规则被解释:" + +#: ../../c-api/conversion.rst:36 +msgid "" +"When ``0 <= rv < size``, the output conversion was successful and *rv* " +"characters were written to *str* (excluding the trailing ``'\\0'`` byte at " +"``str[rv]``)." +msgstr "" +"当 ``0 <= rv < size`` 时,输出转换即成功并将 *rv* 个字符写入到 *str* (不包括末尾 ``str[rv]`` 位置的 " +"``'\\0'`` 字节)。" + +#: ../../c-api/conversion.rst:40 +msgid "" +"When ``rv >= size``, the output conversion was truncated and a buffer with " +"``rv + 1`` bytes would have been needed to succeed. ``str[size-1]`` is " +"``'\\0'`` in this case." +msgstr "" +"当 ``rv >= size`` 时,输出转换会被截断并且需要一个具有 ``rv + 1`` 字节的缓冲区才能成功执行。在此情况下 " +"``str[size-1]`` 为 ``'\\0'``。" + +#: ../../c-api/conversion.rst:44 +msgid "" +"When ``rv < 0``, the output conversion failed and ``str[size-1]`` is " +"``'\\0'`` in this case too, but the rest of *str* is undefined. The exact " +"cause of the error depends on the underlying platform." +msgstr "" +"当 ``rv < 0`` 时,在此场景下输出转换将失败并且 ``str[size-1]`` 为 ``'\\0'``,但 *str* " +"的其余部分是未定义的。错误的确切原因取决于底层平台。" + +#: ../../c-api/conversion.rst:49 +msgid "" +"The following functions provide locale-independent string to number " +"conversions." +msgstr "以下函数提供与语言环境无关的字符串到数字转换。" + +#: ../../c-api/conversion.rst:53 +msgid "" +"Convert the initial part of the string in ``str`` to an :c:expr:`unsigned " +"long` value according to the given ``base``, which must be between ``2`` and" +" ``36`` inclusive, or be the special value ``0``." +msgstr "" +"根据给定的 ``base`` 将 ``str`` 中字符串的初始部分转换为 :c:expr:`unsigned long` 值,基数必须在 ``2`` " +"至 ``36`` 之间(包括边界值),或者为特殊值 ``0``。" + +#: ../../c-api/conversion.rst:57 +msgid "" +"Leading white space and case of characters are ignored. If ``base`` is zero" +" it looks for a leading ``0b``, ``0o`` or ``0x`` to tell which base. If " +"these are absent it defaults to ``10``. Base must be 0 or between 2 and 36 " +"(inclusive). If ``ptr`` is non-``NULL`` it will contain a pointer to the " +"end of the scan." +msgstr "" +"空白前缀和字符大小写将被忽略。如果 ``base`` 为零则会查找 ``0b``、``0o`` 或 ``0x`` 前缀以确定基数。如果没有则默认基数为 " +"``10``。基数必须为 0 或在 2 和 36 之间(包括边界值)。如果 ``ptr`` 不为 ``NULL`` " +"则它将包含一个指向扫描结束位置的指针。" + +#: ../../c-api/conversion.rst:63 +msgid "" +"If the converted value falls out of range of corresponding return type, " +"range error occurs (:c:data:`errno` is set to :c:macro:`!ERANGE`) and " +":c:macro:`!ULONG_MAX` is returned. If no conversion can be performed, ``0``" +" is returned." +msgstr "" +"如果转换后的值不在对应返回类型的取值范围之内,则会发生取值范围错误 (:c:data:`errno` 被设为 :c:macro:`!ERANGE`) " +"并返回 :c:macro:`!ULONG_MAX`。如果无法执行转换,则返回 ``0``。" + +#: ../../c-api/conversion.rst:68 +msgid "See also the Unix man page :manpage:`strtoul(3)`." +msgstr "另请参阅 Unix 手册页 :manpage:`strtoul(3)`。" + +#: ../../c-api/conversion.rst:75 +msgid "" +"Convert the initial part of the string in ``str`` to an :c:expr:`long` value" +" according to the given ``base``, which must be between ``2`` and ``36`` " +"inclusive, or be the special value ``0``." +msgstr "" +"根据给定的 ``base`` 将 ``str`` 中字符串的初始部分转换为 :c:expr:`long` 值,基数必须在 ``2`` 至 ``36`` " +"之间(包括边界值),或者为特殊值 ``0``。" + +#: ../../c-api/conversion.rst:79 +msgid "" +"Same as :c:func:`PyOS_strtoul`, but return a :c:expr:`long` value instead " +"and :c:macro:`LONG_MAX` on overflows." +msgstr "" +"类似于 :c:func:`PyOS_strtoul`,但改为返回 :c:expr:`long` 值,溢出时返回 :c:macro:`LONG_MAX`。" + +#: ../../c-api/conversion.rst:82 +msgid "See also the Unix man page :manpage:`strtol(3)`." +msgstr "另请参阅 Unix 手册页 :manpage:`strtol(3)`。" + +#: ../../c-api/conversion.rst:89 +msgid "" +"Convert a string ``s`` to a :c:expr:`double`, raising a Python exception on " +"failure. The set of accepted strings corresponds to the set of strings " +"accepted by Python's :func:`float` constructor, except that ``s`` must not " +"have leading or trailing whitespace. The conversion is independent of the " +"current locale." +msgstr "" +"将字符串 ``s`` 转换为 :c:expr:`double` 类型,失败时会引发 Python 异常。接受的字符串集合对应于可被 Python 的 " +":func:`float` 构造器所接受的字符串集合,除了 ``s`` 必须没有前导或尾随空格。转换独立于当前的语言区域。" + +#: ../../c-api/conversion.rst:95 +msgid "" +"If ``endptr`` is ``NULL``, convert the whole string. Raise " +":exc:`ValueError` and return ``-1.0`` if the string is not a valid " +"representation of a floating-point number." +msgstr "" +"如果 ``endptr`` 是 ``NULL``,则转换整个字符串。如果字符串不是浮点数的有效表示,则引发 :exc:`ValueError` 并返回 " +"``-1.0``。" + +#: ../../c-api/conversion.rst:99 +msgid "" +"If endptr is not ``NULL``, convert as much of the string as possible and set" +" ``*endptr`` to point to the first unconverted character. If no initial " +"segment of the string is the valid representation of a floating-point " +"number, set ``*endptr`` to point to the beginning of the string, raise " +"ValueError, and return ``-1.0``." +msgstr "" +"如果 ``endptr`` 不是 ``NULL``,尽可能多的转换字符串并将 ``*endptr`` " +"设置为指向第一个未转换的字符。如果字符串的初始段不是浮点数的有效的表达方式,将 ``*endptr`` 设置为指向字符串的开头,引发 " +"ValueError 异常,并且返回 ``-1.0``。" + +#: ../../c-api/conversion.rst:106 +msgid "" +"If ``s`` represents a value that is too large to store in a float (for " +"example, ``\"1e500\"`` is such a string on many platforms) then if " +"``overflow_exception`` is ``NULL`` return :c:macro:`!INFINITY` (with an " +"appropriate sign) and don't set any exception. Otherwise, " +"``overflow_exception`` must point to a Python exception object; raise that " +"exception and return ``-1.0``. In both cases, set ``*endptr`` to point to " +"the first character after the converted value." +msgstr "" + +#: ../../c-api/conversion.rst:114 +msgid "" +"If any other error occurs during the conversion (for example an out-of-" +"memory error), set the appropriate Python exception and return ``-1.0``." +msgstr "如果在转换期间发生任何其他错误(比如一个内存不足的错误),设置适当的 Python 异常并且返回 ``-1.0``。" + +#: ../../c-api/conversion.rst:123 +msgid "" +"Convert a :c:expr:`double` *val* to a string using supplied *format_code*, " +"*precision*, and *flags*." +msgstr "" +"将 :c:expr:`double` *val* 转换为一个使用给定的 *format_code*, *precision* 和 *flags* " +"的字符串。" + +#: ../../c-api/conversion.rst:126 +msgid "" +"*format_code* must be one of ``'e'``, ``'E'``, ``'f'``, ``'F'``, ``'g'``, " +"``'G'`` or ``'r'``. For ``'r'``, the supplied *precision* must be 0 and is " +"ignored. The ``'r'`` format code specifies the standard :func:`repr` " +"format." +msgstr "" +"*format_code* 必须是以下其中之一: ``'e'``, ``'E'``, ``'f'``, ``'F'``, ``'g'``, " +"``'G'`` 或 ``'r'``。 对于 ``'r'``,提供的 *precision* 必须为 0 且会被忽略。 ``'r'`` 格式码指定了标准 " +":func:`repr` 格式。" + +#: ../../c-api/conversion.rst:131 +msgid "*flags* can be zero or more of the following values or-ed together:" +msgstr "*flags* 可以为零或多个下列值进行或运算的结果:" + +#: ../../c-api/conversion.rst:137 +msgid "" +"Always precede the returned string with a sign character, even if *val* is " +"non-negative." +msgstr "总是在返回的字符串前加一个正负号字符,即使 *val* 为非负数。" + +#: ../../c-api/conversion.rst:142 +msgid "Ensure that the returned string will not look like an integer." +msgstr "确保返回的字符串看起来不像是一个整数。" + +#: ../../c-api/conversion.rst:146 +msgid "" +"Apply \"alternate\" formatting rules. See the documentation for the " +":c:func:`PyOS_snprintf` ``'#'`` specifier for details." +msgstr "应用“替代”格式化规则。请参阅 :c:func:`PyOS_snprintf` ``'#'`` 格式符的文档了解详情。" + +#: ../../c-api/conversion.rst:152 +msgid "Negative zero is converted to positive zero." +msgstr "负零将被转换为正零。" + +#: ../../c-api/conversion.rst:156 +msgid "" +"If *ptype* is non-``NULL``, then the value it points to will be set to one " +"of the following constants depending on the type of *val*:" +msgstr "如果 *ptype* 不为 ``NULL``,则它指向的值将根据 *val* 的类型被设为以下常量之一:" + +#: ../../c-api/conversion.rst:163 +msgid "*\\*ptype*" +msgstr "*\\*ptype*" + +#: ../../c-api/conversion.rst:164 +msgid "type of *val*" +msgstr "*val* 的类型" + +#: ../../c-api/conversion.rst:166 +msgid "finite number" +msgstr "有限数字" + +#: ../../c-api/conversion.rst:168 +msgid "infinite number" +msgstr "无穷大数字" + +#: ../../c-api/conversion.rst:170 +msgid "not a number" +msgstr "非数字" + +#: ../../c-api/conversion.rst:172 +msgid "" +"The return value is a pointer to *buffer* with the converted string or " +"``NULL`` if the conversion failed. The caller is responsible for freeing the" +" returned string by calling :c:func:`PyMem_Free`." +msgstr "" +"返回值是一个指向包含转换后字符串的 *buffer* 的指针,如果转换失败则为 ``NULL``。调用方要负责调用 " +":c:func:`PyMem_Free` 来释放返回的字符串。" + +#: ../../c-api/conversion.rst:182 +msgid "" +"Case insensitive comparison of strings. These functions work almost " +"identically to :c:func:`!strcmp` and :c:func:`!strncmp` (respectively), " +"except that they ignore the case of ASCII characters." +msgstr "" +"不区分大小写的字符串比较。这些函数的工作方式(分别)与 :c:func:`!strcmp` 和 :c:func:`!strncmp` " +"几乎一样,只是它们会忽略 ASCII 字符的大小写。" + +#: ../../c-api/conversion.rst:186 +msgid "" +"Return ``0`` if the strings are equal, a negative value if *str1* sorts " +"lexicographically before *str2*, or a positive value if it sorts after." +msgstr "如果字符串相等则返回 ``0``,如果 *str1* 的词典排序在 *str2* 之前则返回负值,或者如果排序在其后则返回正值。" + +#: ../../c-api/conversion.rst:189 +msgid "" +"In the *str1* or *str2* arguments, a NUL byte marks the end of the string. " +"For :c:func:`!PyOS_mystrnicmp`, the *size* argument gives the maximum size " +"of the string, as if NUL was present at the index given by *size*." +msgstr "" +"在 *str1* 或 *str2* 参数中,NUL 字符表示字符串结束。对于 :c:func:`!PyOS_mystrnicmp`,*size* " +"参数给出了字符串的最大长度,就像 NUL 出现在由 *size* 给出的索引位置。" + +#: ../../c-api/conversion.rst:193 +msgid "These functions do not use the locale." +msgstr "这些函数不使用语言区域设置。" + +#: ../../c-api/conversion.rst:199 +msgid "Case insensitive comparison of strings." +msgstr "忽略大小写的字符串比较。" + +#: ../../c-api/conversion.rst:201 +msgid "" +"On Windows, these are aliases of :c:func:`!stricmp` and :c:func:`!strnicmp`," +" respectively." +msgstr "在 Windows 上,它们分别是 :c:func:`!stricmp` 和 :c:func:`!strnicmp` 的别名。" + +#: ../../c-api/conversion.rst:204 +msgid "" +"On other platforms, they are aliases of :c:func:`PyOS_mystricmp` and " +":c:func:`PyOS_mystrnicmp`, respectively." +msgstr "" +"在其他平台上,它们分别是 :c:func:`PyOS_mystricmp` 和 :c:func:`PyOS_mystrnicmp` 的别名。" + +#: ../../c-api/conversion.rst:209 +msgid "Character classification and conversion" +msgstr "字符分类与转换" + +#: ../../c-api/conversion.rst:211 +msgid "" +"The following macros provide locale-independent (unlike the C standard " +"library ``ctype.h``) character classification and conversion. The argument " +"must be a signed or unsigned :c:expr:`char`." +msgstr "" +"下列宏提供了独立于语言区域 (不同于 C 标准库 ``ctype.h``) 的字符分类与转换。其参数必须是一个有符号或无符号的 " +":c:expr:`char` 值。" + +#: ../../c-api/conversion.rst:218 +msgid "Return true if the character *c* is an alphanumeric character." +msgstr "如果字符 *c* 为字母数字类字符则返回真值。" + +#: ../../c-api/conversion.rst:223 +msgid "" +"Return true if the character *c* is an alphabetic character (``a-z`` and " +"``A-Z``)." +msgstr "如果字符 *c* 为字母类字符 (``a-z`` 和 ``A-Z``) 则返回真值。" + +#: ../../c-api/conversion.rst:228 +msgid "Return true if the character *c* is a decimal digit (``0-9``)." +msgstr "如果字符 *c* 为十进制数码 (``0-9``) 则返回真值。" + +#: ../../c-api/conversion.rst:233 +msgid "" +"Return true if the character *c* is a lowercase ASCII letter (``a-z``)." +msgstr "如果字符 *c* 为小写 ASCII 字母 (``a-z``) 则返回真值。" + +#: ../../c-api/conversion.rst:238 +msgid "" +"Return true if the character *c* is an uppercase ASCII letter (``A-Z``)." +msgstr "如果字符 *c* 是一个大写 ASCII 字母 (``A-Z``) 则返回真值。" + +#: ../../c-api/conversion.rst:243 +msgid "" +"Return true if the character *c* is a whitespace character (space, tab, " +"carriage return, newline, vertical tab, or form feed)." +msgstr "如果字符 *c* 是一个空白字符 (空格符,制表符,回车符,换行符,垂直制表符或换页符) 则返回真值。" + +#: ../../c-api/conversion.rst:249 +msgid "" +"Return true if the character *c* is a hexadecimal digit (``0-9``, ``a-f``, " +"and ``A-F``)." +msgstr "如果字符 *c* 是一个十六进制数码 (``0-9``, ``a-f`` 和 ``A-F``) 则返回真值。" + +#: ../../c-api/conversion.rst:255 +msgid "Return the lowercase equivalent of the character *c*." +msgstr "返回字符 *c* 的小写形式。" + +#: ../../c-api/conversion.rst:260 +msgid "Return the uppercase equivalent of the character *c*." +msgstr "返回字符 *c* 的大写形式。" diff --git a/c-api/coro.po b/c-api/coro.po new file mode 100644 index 0000000000..ba819507a3 --- /dev/null +++ b/c-api/coro.po @@ -0,0 +1,57 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/coro.rst:6 +msgid "Coroutine Objects" +msgstr "协程对象" + +#: ../../c-api/coro.rst:10 +msgid "" +"Coroutine objects are what functions declared with an ``async`` keyword " +"return." +msgstr "协程对象是使用 ``async`` 关键字声明的函数返回的。" + +#: ../../c-api/coro.rst:16 +msgid "The C structure used for coroutine objects." +msgstr "用于协程对象的 C 结构体。" + +#: ../../c-api/coro.rst:21 +msgid "The type object corresponding to coroutine objects." +msgstr "与协程对象对应的类型对象。" + +#: ../../c-api/coro.rst:26 +msgid "" +"Return true if *ob*'s type is :c:type:`PyCoro_Type`; *ob* must not be " +"``NULL``. This function always succeeds." +msgstr "" +"如果 *ob* 的类型是 :c:type:`PyCoro_Type` 则返回真值;*ob* 必须不为 ``NULL``。此函数总是会成功执行。" + +#: ../../c-api/coro.rst:32 +msgid "" +"Create and return a new coroutine object based on the *frame* object, with " +"``__name__`` and ``__qualname__`` set to *name* and *qualname*. A reference " +"to *frame* is stolen by this function. The *frame* argument must not be " +"``NULL``." +msgstr "" +"基于 *frame* 对象创建并返回一个新的协程对象,其中 ``__name__`` 和 ``__qualname__`` 设为 *name* 和 " +"*qualname*。此函数会窃取一个对 *frame* 的引用。 *frame* 参数必须不为 ``NULL``。" diff --git a/c-api/curses.po b/c-api/curses.po new file mode 100644 index 0000000000..817f610459 --- /dev/null +++ b/c-api/curses.po @@ -0,0 +1,225 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/curses.rst:4 +msgid "Curses C API" +msgstr "Curses C API" + +#: ../../c-api/curses.rst:6 +msgid "" +":mod:`curses` exposes a small C interface for extension modules. Consumers " +"must include the header file :file:`py_curses.h` (which is not included by " +"default by :file:`Python.h`) and :c:func:`import_curses` must be invoked, " +"usually as part of the module initialisation function, to populate " +":c:var:`PyCurses_API`." +msgstr "" +":mod:`curses` 针对扩展模块对外公开了一个小型 C 接口。使用方必须包含头文件 :file:`py_curses.h` (该文件默认不被 " +":file:`Python.h` 包含) 并且 :c:func:`import_curses` 必须被调用,通常是作为模块初始化函数的一部分,以便填充 " +":c:var:`PyCurses_API` 指针。" + +#: ../../c-api/curses.rst:14 +msgid "" +"Neither the C API nor the pure Python :mod:`curses` module are compatible " +"with subinterpreters." +msgstr "该 C API 和纯 Python :mod:`curses` 模块均不兼容子解释器。" + +#: ../../c-api/curses.rst:19 +msgid "" +"Import the curses C API. The macro does not need a semi-colon to be called." +msgstr "导入 curses C API。调用该宏不需要带分号。" + +#: ../../c-api/curses.rst:21 +msgid "On success, populate the :c:var:`PyCurses_API` pointer." +msgstr "成功时,填充 :c:var:`PyCurses_API` 指针。" + +#: ../../c-api/curses.rst:23 +msgid "" +"On failure, set :c:var:`PyCurses_API` to NULL and set an exception. The " +"caller must check if an error occurred via :c:func:`PyErr_Occurred`:" +msgstr "" +"失败时,将 :c:var:`PyCurses_API` 设为 NULL 并设置一个异常。调用方必须通过 :c:func:`PyErr_Occurred`" +" 检查是否发生了错误:" + +#: ../../c-api/curses.rst:26 +msgid "" +"import_curses(); // semi-colon is optional but recommended\n" +"if (PyErr_Occurred()) { /* cleanup */ }" +msgstr "" +"import_curses(); // semi-colon is optional but recommended\n" +"if (PyErr_Occurred()) { /* cleanup */ }" + +#: ../../c-api/curses.rst:34 +msgid "" +"Dynamically allocated object containing the curses C API. This variable is " +"only available once :c:macro:`import_curses` succeeds." +msgstr "包含 curses C API 的动态分配对象。该变量仅在 :c:macro:`import_curses` 执行成功后可用。" + +#: ../../c-api/curses.rst:37 +msgid "``PyCurses_API[0]`` corresponds to :c:data:`PyCursesWindow_Type`." +msgstr "``PyCurses_API[0]`` 对应于 :c:data:`PyCursesWindow_Type`。" + +#: ../../c-api/curses.rst:39 +msgid "" +"``PyCurses_API[1]``, ``PyCurses_API[2]``, and ``PyCurses_API[3]`` are " +"pointers to predicate functions of type ``int (*)(void)``." +msgstr "" +"``PyCurses_API[1]``, ``PyCurses_API[2]`` 和 ``PyCurses_API[3]`` 是指向 ``int " +"(*)(void)`` 类型的谓词函数的指针。" + +#: ../../c-api/curses.rst:42 +msgid "" +"When called, these predicates return whether :func:`curses.setupterm`, " +":func:`curses.initscr`, and :func:`curses.start_color` have been called " +"respectively." +msgstr "" +"当被调用时,这些谓词函数将分别返回 :func:`curses.setupterm`, :func:`curses.initscr` 和 " +":func:`curses.start_color` 是否已被调用。" + +#: ../../c-api/curses.rst:46 +msgid "" +"See also the convenience macros :c:macro:`PyCursesSetupTermCalled`, " +":c:macro:`PyCursesInitialised`, and :c:macro:`PyCursesInitialisedColor`." +msgstr "" +"另请参阅 :c:macro:`PyCursesSetupTermCalled`, :c:macro:`PyCursesInitialised` 和 " +":c:macro:`PyCursesInitialisedColor` 便捷宏。" + +#: ../../c-api/curses.rst:51 +msgid "" +"The number of entries in this structure is subject to changes. Consider " +"using :c:macro:`PyCurses_API_pointers` to check if new fields are available " +"or not." +msgstr "此结构体中的条目数可能发生变化。请考虑使用 :c:macro:`PyCurses_API_pointers` 来检查是否有新字段可用。" + +#: ../../c-api/curses.rst:58 +msgid "" +"The number of accessible fields (``4``) in :c:var:`PyCurses_API`. This " +"number is incremented whenever new fields are added." +msgstr "在 :c:var:`PyCurses_API` 中的可访问字段数 (``4``)。此数值会在新字段被添加时递增。" + +#: ../../c-api/curses.rst:64 +msgid "" +"The :ref:`heap type ` corresponding to :class:`curses.window`." +msgstr "对应于 :class:`curses.window` 的 :ref:`堆类型 `。" + +#: ../../c-api/curses.rst:69 +msgid "" +"Return true if *op* is a :class:`curses.window` instance, false otherwise." +msgstr "如果 *op* 是一个 :class:`curses.window` 实例则返回真值,否则返回假值。" + +#: ../../c-api/curses.rst:72 +msgid "" +"The following macros are convenience macros expanding into C statements. In " +"particular, they can only be used as ``macro;`` or ``macro``, but not " +"``macro()`` or ``macro();``." +msgstr "" +"下列宏属于扩展为 C 语句的便捷宏。具体而言,它们只能以 ``macro;`` 或 ``macro`` 的形式,而不能以 ``macro()`` 或 " +"``macro();`` 的形式被使用。" + +#: ../../c-api/curses.rst:78 +msgid "Macro checking if :func:`curses.setupterm` has been called." +msgstr "检查 :func:`curses.setupterm` 是否已被调用的宏。" + +#: ../../c-api/curses.rst:80 ../../c-api/curses.rst:97 +#: ../../c-api/curses.rst:114 +msgid "The macro expansion is roughly equivalent to:" +msgstr "这个宏扩展大致等价于:" + +#: ../../c-api/curses.rst:82 +msgid "" +"{\n" +" typedef int (*predicate_t)(void);\n" +" predicate_t was_setupterm_called = (predicate_t)PyCurses_API[1];\n" +" if (!was_setupterm_called()) {\n" +" return NULL;\n" +" }\n" +"}" +msgstr "" +"{\n" +" typedef int (*predicate_t)(void);\n" +" predicate_t was_setupterm_called = (predicate_t)PyCurses_API[1];\n" +" if (!was_setupterm_called()) {\n" +" return NULL;\n" +" }\n" +"}" + +#: ../../c-api/curses.rst:95 +msgid "Macro checking if :func:`curses.initscr` has been called." +msgstr "检查 :func:`curses.initscr` 是否已被调用的宏。" + +#: ../../c-api/curses.rst:99 +msgid "" +"{\n" +" typedef int (*predicate_t)(void);\n" +" predicate_t was_initscr_called = (predicate_t)PyCurses_API[2];\n" +" if (!was_initscr_called()) {\n" +" return NULL;\n" +" }\n" +"}" +msgstr "" +"{\n" +" typedef int (*predicate_t)(void);\n" +" predicate_t was_initscr_called = (predicate_t)PyCurses_API[2];\n" +" if (!was_initscr_called()) {\n" +" return NULL;\n" +" }\n" +"}" + +#: ../../c-api/curses.rst:112 +msgid "Macro checking if :func:`curses.start_color` has been called." +msgstr "检查 :func:`curses.start_color` 是否已被调用的宏。" + +#: ../../c-api/curses.rst:116 +msgid "" +"{\n" +" typedef int (*predicate_t)(void);\n" +" predicate_t was_start_color_called = (predicate_t)PyCurses_API[3];\n" +" if (!was_start_color_called()) {\n" +" return NULL;\n" +" }\n" +"}" +msgstr "" +"{\n" +" typedef int (*predicate_t)(void);\n" +" predicate_t was_start_color_called = (predicate_t)PyCurses_API[3];\n" +" if (!was_start_color_called()) {\n" +" return NULL;\n" +" }\n" +"}" + +#: ../../c-api/curses.rst:128 +msgid "Internal data" +msgstr "内部数据" + +#: ../../c-api/curses.rst:130 +msgid "" +"The following objects are exposed by the C API but should be considered " +"internal-only." +msgstr "下列对象由 C API 对外暴露但是应当被视为仅限内部使用。" + +#: ../../c-api/curses.rst:135 +msgid "Name of the curses capsule to pass to :c:func:`PyCapsule_Import`." +msgstr "传给 :c:func:`PyCapsule_Import` 的 curses capsule 的名称。" + +#: ../../c-api/curses.rst:137 +msgid "Internal usage only. Use :c:macro:`import_curses` instead." +msgstr "仅限内部使用。请改用 :c:macro:`import_curses`。" diff --git a/c-api/datetime.po b/c-api/datetime.po new file mode 100644 index 0000000000..8cd7d3f1ed --- /dev/null +++ b/c-api/datetime.po @@ -0,0 +1,436 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/datetime.rst:6 +msgid "DateTime Objects" +msgstr "DateTime 对象" + +#: ../../c-api/datetime.rst:8 +msgid "" +"Various date and time objects are supplied by the :mod:`datetime` module. " +"Before using any of these functions, the header file :file:`datetime.h` must" +" be included in your source (note that this is not included by " +":file:`Python.h`), and the macro :c:macro:`PyDateTime_IMPORT` must be " +"invoked, usually as part of the module initialisation function. The macro " +"puts a pointer to a C structure into a static variable, " +":c:data:`PyDateTimeAPI`, that is used by the following macros." +msgstr "" +":mod:`datetime` 模块提供了各种日期和时间对象。在使用任何这些函数之前,必须在你的源码中包含头文件 :file:`datetime.h` " +"(请注意此文件并未包含在 :file:`Python.h` 中),并且宏 :c:macro:`PyDateTime_IMPORT` " +"必须被发起调用,通常是作为模块初始化函数的一部分。这个宏会将指向特定 C 结构的指针放入一个静态变量 :c:data:`PyDateTimeAPI` " +"中,它会由下面的宏来使用。" + +#: ../../c-api/datetime.rst:18 +msgid "Import the datetime C API." +msgstr "导入 datetime C API。" + +#: ../../c-api/datetime.rst:20 +msgid "" +"On success, populate the :c:var:`PyDateTimeAPI` pointer. On failure, set " +":c:var:`PyDateTimeAPI` to ``NULL`` and set an exception. The caller must " +"check if an error occurred via :c:func:`PyErr_Occurred`:" +msgstr "" +"成功时,填充 :c:var:`PyDateTimeAPI` 指针。失败时,将 :c:var:`PyDateTimeAPI` 设为 ``NULL`` " +"并设置一个异常。调用方必须通过 :c:func:`PyErr_Occurred` 检查是否发生了错误:" + +#: ../../c-api/datetime.rst:24 +msgid "" +"PyDateTime_IMPORT;\n" +"if (PyErr_Occurred()) { /* cleanup */ }" +msgstr "" +"PyDateTime_IMPORT;\n" +"if (PyErr_Occurred()) { /* cleanup */ }" + +#: ../../c-api/datetime.rst:31 +msgid "This is not compatible with subinterpreters." +msgstr "此特性不兼容子解释器。" + +#: ../../c-api/datetime.rst:35 +msgid "Structure containing the fields for the datetime C API." +msgstr "包含用于 datetime C API 的字段的结构体。" + +#: ../../c-api/datetime.rst:37 +msgid "The fields of this structure are private and subject to change." +msgstr "该结构体的字段是私有的并可能发生改变。" + +#: ../../c-api/datetime.rst:39 +msgid "Do not use this directly; prefer ``PyDateTime_*`` APIs instead." +msgstr "不要直接使用此字段;建议改用 ``PyDateTime_*`` API。" + +#: ../../c-api/datetime.rst:43 +msgid "Dynamically allocated object containing the datetime C API." +msgstr "包含 datetime C API 的动态分配的对象。" + +#: ../../c-api/datetime.rst:45 +msgid "" +"This variable is only available once :c:macro:`PyDateTime_IMPORT` succeeds." +msgstr "此变量仅在 :c:macro:`PyDateTime_IMPORT` 执行成功时才可用。" + +#: ../../c-api/datetime.rst:49 +msgid "This subtype of :c:type:`PyObject` represents a Python date object." +msgstr ":c:type:`PyObject` 的这个子类型表示 Python 日期对象。" + +#: ../../c-api/datetime.rst:53 +msgid "" +"This subtype of :c:type:`PyObject` represents a Python datetime object." +msgstr ":c:type:`PyObject` 的这个子类型表示 Python 日期时间对象。" + +#: ../../c-api/datetime.rst:57 +msgid "This subtype of :c:type:`PyObject` represents a Python time object." +msgstr ":c:type:`PyObject` 的这个子类型表示 Python 时间对象。" + +#: ../../c-api/datetime.rst:61 +msgid "" +"This subtype of :c:type:`PyObject` represents the difference between two " +"datetime values." +msgstr ":c:type:`PyObject` 的这个子类型表示两个日期时间值之间的差值。" + +#: ../../c-api/datetime.rst:65 +msgid "" +"This instance of :c:type:`PyTypeObject` represents the Python date type; it " +"is the same object as :class:`datetime.date` in the Python layer." +msgstr "" +"这个 :c:type:`PyTypeObject` 的实例代表 Python 日期类型;它与 Python 层面的 " +":class:`datetime.date` 对象相同。" + +#: ../../c-api/datetime.rst:70 +msgid "" +"This instance of :c:type:`PyTypeObject` represents the Python datetime type;" +" it is the same object as :class:`datetime.datetime` in the Python layer." +msgstr "" +"这个 :c:type:`PyTypeObject` 的实例代表 Python 日期时间类型;它与 Python 层面的 " +":class:`datetime.datetime` 对象相同。" + +#: ../../c-api/datetime.rst:75 +msgid "" +"This instance of :c:type:`PyTypeObject` represents the Python time type; it " +"is the same object as :class:`datetime.time` in the Python layer." +msgstr "" +"这个 :c:type:`PyTypeObject` 的实例代表 Python 时间类型;它与 Python 层面的 " +":class:`datetime.time` 对象相同。" + +#: ../../c-api/datetime.rst:80 +msgid "" +"This instance of :c:type:`PyTypeObject` represents the Python type for the " +"difference between two datetime values; it is the same object as " +":class:`datetime.timedelta` in the Python layer." +msgstr "" +"这个 :c:type:`PyTypeObject` 的实例代表两个日期时间值之间差值的 Python 类型;它与 Python 层面的 " +":class:`datetime.timedelta` 是同一对象。" + +#: ../../c-api/datetime.rst:86 +msgid "" +"This instance of :c:type:`PyTypeObject` represents the Python time zone info" +" type; it is the same object as :class:`datetime.tzinfo` in the Python " +"layer." +msgstr "" +"这个 :c:type:`PyTypeObject` 的实例代表 Python 时区信息类型;它与 Python 层面的 " +":class:`datetime.tzinfo` 对象相同。" + +#: ../../c-api/datetime.rst:90 +msgid "Macro for access to the UTC singleton:" +msgstr "用于访问 UTC 单例的宏:" + +#: ../../c-api/datetime.rst:94 +msgid "" +"Returns the time zone singleton representing UTC, the same object as " +":attr:`datetime.timezone.utc`." +msgstr "返回表示 UTC 的时区单例,与 :attr:`datetime.timezone.utc` 为同一对象。" + +#: ../../c-api/datetime.rst:100 +msgid "Type-check macros:" +msgstr "类型检查宏:" + +#: ../../c-api/datetime.rst:104 +msgid "" +"Return true if *ob* is of type :c:data:`PyDateTime_DateType` or a subtype of" +" :c:data:`!PyDateTime_DateType`. *ob* must not be ``NULL``. This function " +"always succeeds." +msgstr "" +"如果 *ob* 为 :c:data:`PyDateTime_DateType` 类型或 :c:data:`!PyDateTime_DateType` " +"的某个子类型则返回真值。 *ob* 不能为 ``NULL``。此函数总是会成功执行。" + +#: ../../c-api/datetime.rst:111 +msgid "" +"Return true if *ob* is of type :c:data:`PyDateTime_DateType`. *ob* must not " +"be ``NULL``. This function always succeeds." +msgstr "" +"如果 *ob* 为 :c:data:`PyDateTime_DateType` 类型则返回真值。 *ob* 不能为 ``NULL``。 " +"此函数总是会成功执行。" + +#: ../../c-api/datetime.rst:117 +msgid "" +"Return true if *ob* is of type :c:data:`PyDateTime_DateTimeType` or a " +"subtype of :c:data:`!PyDateTime_DateTimeType`. *ob* must not be ``NULL``. " +"This function always succeeds." +msgstr "" +"如果 *ob* 为 :c:data:`PyDateTime_DateTimeType` 类型或 " +":c:data:`!PyDateTime_DateTimeType` 的某个子类型则返回真值。 *ob* 不能为 ``NULL``。 " +"此函数总是会成功执行。" + +#: ../../c-api/datetime.rst:124 +msgid "" +"Return true if *ob* is of type :c:data:`PyDateTime_DateTimeType`. *ob* must " +"not be ``NULL``. This function always succeeds." +msgstr "" +"如果 *ob* 为 :c:data:`PyDateTime_DateTimeType` 类型则返回真值。 *ob* 不能为 ``NULL``。 " +"此函数总是会成功执行。" + +#: ../../c-api/datetime.rst:130 +msgid "" +"Return true if *ob* is of type :c:data:`PyDateTime_TimeType` or a subtype of" +" :c:data:`!PyDateTime_TimeType`. *ob* must not be ``NULL``. This function " +"always succeeds." +msgstr "" +"如果 *ob* 为 :c:data:`PyDateTime_TimeType` 类型或 :c:data:`!PyDateTime_TimeType` " +"的某个子类型则返回真值。 *ob* 不能为 ``NULL``。此函数总是会成功执行。" + +#: ../../c-api/datetime.rst:137 +msgid "" +"Return true if *ob* is of type :c:data:`PyDateTime_TimeType`. *ob* must not " +"be ``NULL``. This function always succeeds." +msgstr "" +"如果 *ob* 为 :c:data:`PyDateTime_TimeType` 类型则返回真值。 *ob* 不能为 ``NULL``。 " +"此函数总是会成功执行。" + +#: ../../c-api/datetime.rst:143 +msgid "" +"Return true if *ob* is of type :c:data:`PyDateTime_DeltaType` or a subtype " +"of :c:data:`!PyDateTime_DeltaType`. *ob* must not be ``NULL``. This " +"function always succeeds." +msgstr "" +"如果 *ob* 为 :c:data:`PyDateTime_DeltaType` 类型或 :c:data:`!PyDateTime_DeltaType`" +" 的某个子类型则返回真值。 *ob* 不能为 ``NULL``。此函数总是会成功执行。" + +#: ../../c-api/datetime.rst:150 +msgid "" +"Return true if *ob* is of type :c:data:`PyDateTime_DeltaType`. *ob* must not" +" be ``NULL``. This function always succeeds." +msgstr "" +"如果 *ob* 为 :c:data:`PyDateTime_DeltaType` 类型则返回真值。 *ob* 不能为 ``NULL``。 " +"此函数总是会成功执行。" + +#: ../../c-api/datetime.rst:156 +msgid "" +"Return true if *ob* is of type :c:data:`PyDateTime_TZInfoType` or a subtype " +"of :c:data:`!PyDateTime_TZInfoType`. *ob* must not be ``NULL``. This " +"function always succeeds." +msgstr "" +"如果 *ob* 为 :c:data:`PyDateTime_TZInfoType` 类型或 " +":c:data:`!PyDateTime_TZInfoType` 的某个子类型则返回真值。 *ob* 不能为 ``NULL``。 " +"此函数总是会成功执行。" + +#: ../../c-api/datetime.rst:163 +msgid "" +"Return true if *ob* is of type :c:data:`PyDateTime_TZInfoType`. *ob* must " +"not be ``NULL``. This function always succeeds." +msgstr "" +"如果 *ob* 为 :c:data:`PyDateTime_TZInfoType` 类型则返回真值。 *ob* 不能为 ``NULL``。 " +"此函数总是会成功执行。" + +#: ../../c-api/datetime.rst:167 +msgid "Macros to create objects:" +msgstr "用于创建对象的宏:" + +#: ../../c-api/datetime.rst:171 +msgid "" +"Return a :class:`datetime.date` object with the specified year, month and " +"day." +msgstr "返回指定年、月、日的 :class:`datetime.date` 对象。" + +#: ../../c-api/datetime.rst:176 +msgid "" +"Return a :class:`datetime.datetime` object with the specified year, month, " +"day, hour, minute, second and microsecond." +msgstr "" +"返回具有指定 year, month, day, hour, minute, second 和 microsecond 属性的 " +":class:`datetime.datetime` 对象。" + +#: ../../c-api/datetime.rst:182 +msgid "" +"Return a :class:`datetime.datetime` object with the specified year, month, " +"day, hour, minute, second, microsecond and fold." +msgstr "" +"返回具有指定 year, month, day, hour, minute, second, microsecond 和 fold 属性的 " +":class:`datetime.datetime` 对象。" + +#: ../../c-api/datetime.rst:190 +msgid "" +"Return a :class:`datetime.time` object with the specified hour, minute, " +"second and microsecond." +msgstr "" +"返回具有指定 hour, minute, second 和 microsecond 属性的 :class:`datetime.time` 对象。" + +#: ../../c-api/datetime.rst:196 +msgid "" +"Return a :class:`datetime.time` object with the specified hour, minute, " +"second, microsecond and fold." +msgstr "" +"返回具有指定 hour, minute, second, microsecond 和 fold 属性的 :class:`datetime.time` " +"对象。" + +#: ../../c-api/datetime.rst:204 +msgid "" +"Return a :class:`datetime.timedelta` object representing the given number of" +" days, seconds and microseconds. Normalization is performed so that the " +"resulting number of microseconds and seconds lie in the ranges documented " +"for :class:`datetime.timedelta` objects." +msgstr "" +"返回代表给定天、秒和微秒数的 :class:`datetime.timedelta` 对象。将执行正规化操作以使最终的微秒和秒数处在 " +":class:`datetime.timedelta` 对象的文档指明的区间之内。" + +#: ../../c-api/datetime.rst:212 +msgid "" +"Return a :class:`datetime.timezone` object with an unnamed fixed offset " +"represented by the *offset* argument." +msgstr "返回一个 :class:`datetime.timezone` 对象,该对象具有以 *offset* 参数表示的未命名固定时差。" + +#: ../../c-api/datetime.rst:220 +msgid "" +"Return a :class:`datetime.timezone` object with a fixed offset represented " +"by the *offset* argument and with tzname *name*." +msgstr "" +"返回一个 :class:`datetime.timezone` 对象,该对象具有以 *offset* 参数表示的固定时差和时区名称 *name*。" + +#: ../../c-api/datetime.rst:226 +msgid "" +"Macros to extract fields from date objects. The argument must be an " +"instance of :c:type:`PyDateTime_Date`, including subclasses (such as " +":c:type:`PyDateTime_DateTime`). The argument must not be ``NULL``, and the " +"type is not checked:" +msgstr "" +"一些用来从日期对象中提取字段的宏。参数必须是 :c:type:`PyDateTime_Date` 包括其子类 (如 " +":c:type:`PyDateTime_DateTime`) 的实例。参数不能为 ``NULL``,且不会检查类型:" + +#: ../../c-api/datetime.rst:233 +msgid "Return the year, as a positive int." +msgstr "以正整数的形式返回年份值。" + +#: ../../c-api/datetime.rst:238 +msgid "Return the month, as an int from 1 through 12." +msgstr "返回月,从 1 到 12 的整数。" + +#: ../../c-api/datetime.rst:243 +msgid "Return the day, as an int from 1 through 31." +msgstr "返回日,从 1 到 31 的整数。" + +#: ../../c-api/datetime.rst:246 +msgid "" +"Macros to extract fields from datetime objects. The argument must be an " +"instance of :c:type:`PyDateTime_DateTime`, including subclasses. The " +"argument must not be ``NULL``, and the type is not checked:" +msgstr "" +"一些用来从日期时间对象中提取字段的宏。参数必须是 :c:type:`PyDateTime_DateTime` 包括其子类的实例。参数不能为 " +"``NULL``,并且不会检查类型:" + +#: ../../c-api/datetime.rst:252 ../../c-api/datetime.rst:290 +msgid "Return the hour, as an int from 0 through 23." +msgstr "返回小时,从 0 到 23 的整数。" + +#: ../../c-api/datetime.rst:257 ../../c-api/datetime.rst:295 +msgid "Return the minute, as an int from 0 through 59." +msgstr "返回分钟,从 0 到 59 的整数。" + +#: ../../c-api/datetime.rst:262 ../../c-api/datetime.rst:300 +msgid "Return the second, as an int from 0 through 59." +msgstr "返回秒,从 0 到 59 的整数。" + +#: ../../c-api/datetime.rst:267 ../../c-api/datetime.rst:305 +msgid "Return the microsecond, as an int from 0 through 999999." +msgstr "返回微秒,从 0 到 999999 的整数。" + +#: ../../c-api/datetime.rst:272 ../../c-api/datetime.rst:310 +msgid "Return the fold, as an int from 0 through 1." +msgstr "返回折叠值,为整数 0 或 1。" + +#: ../../c-api/datetime.rst:279 ../../c-api/datetime.rst:317 +msgid "Return the tzinfo (which may be ``None``)." +msgstr "返回 tzinfo (可以为 ``None``)。" + +#: ../../c-api/datetime.rst:284 +msgid "" +"Macros to extract fields from time objects. The argument must be an " +"instance of :c:type:`PyDateTime_Time`, including subclasses. The argument " +"must not be ``NULL``, and the type is not checked:" +msgstr "" +"一些用来从时间对象中提取字段的宏。参数必须是 :c:type:`PyDateTime_Time` 包括其子类的实例。参数不能为 " +"``NULL``,且不会检查类型:" + +#: ../../c-api/datetime.rst:322 +msgid "" +"Macros to extract fields from time delta objects. The argument must be an " +"instance of :c:type:`PyDateTime_Delta`, including subclasses. The argument " +"must not be ``NULL``, and the type is not checked:" +msgstr "" +"一些用来从时间差对象中提取字段的宏。参数必须是 :c:type:`PyDateTime_Delta` 包括其子类的实例。参数不能为 " +"``NULL``,并且不会检查类型:" + +#: ../../c-api/datetime.rst:328 +msgid "Return the number of days, as an int from -999999999 to 999999999." +msgstr "返回天数,从 -999999999 到 999999999 的整数。" + +#: ../../c-api/datetime.rst:335 +msgid "Return the number of seconds, as an int from 0 through 86399." +msgstr "返回秒数,从 0 到 86399 的整数。" + +#: ../../c-api/datetime.rst:342 +msgid "Return the number of microseconds, as an int from 0 through 999999." +msgstr "返回微秒数,从 0 到 999999 的整数。" + +#: ../../c-api/datetime.rst:347 +msgid "Macros for the convenience of modules implementing the DB API:" +msgstr "一些便于模块实现 DB API 的宏:" + +#: ../../c-api/datetime.rst:351 +msgid "" +"Create and return a new :class:`datetime.datetime` object given an argument " +"tuple suitable for passing to :meth:`datetime.datetime.fromtimestamp`." +msgstr "" +"创建并返回一个新的 :class:`datetime.datetime` 对象,给定一个适合传递给 " +":meth:`datetime.datetime.fromtimestamp` 的参数元组。" + +#: ../../c-api/datetime.rst:357 +msgid "" +"Create and return a new :class:`datetime.date` object given an argument " +"tuple suitable for passing to :meth:`datetime.date.fromtimestamp`." +msgstr "" +"创建并返回一个新的 :class:`datetime.date` 对象,给定一个适合传递给 " +":meth:`datetime.date.fromtimestamp` 的参数元组。" + +#: ../../c-api/datetime.rst:362 +msgid "Internal data" +msgstr "内部数据" + +#: ../../c-api/datetime.rst:364 +msgid "" +"The following symbols are exposed by the C API but should be considered " +"internal-only." +msgstr "下列符号由 C API 对外暴露但是应当被视为仅限内部使用。" + +#: ../../c-api/datetime.rst:369 +msgid "Name of the datetime capsule to pass to :c:func:`PyCapsule_Import`." +msgstr "要传给 :c:func:`PyCapsule_Import` 的 datetime capsule 的名称。" + +#: ../../c-api/datetime.rst:371 +msgid "Internal usage only. Use :c:macro:`PyDateTime_IMPORT` instead." +msgstr "仅限内部使用。请改用 :c:macro:`PyDateTime_IMPORT`。" diff --git a/c-api/descriptor.po b/c-api/descriptor.po new file mode 100644 index 0000000000..7120024a6d --- /dev/null +++ b/c-api/descriptor.po @@ -0,0 +1,257 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-15 16:14+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/descriptor.rst:6 +msgid "Descriptor Objects" +msgstr "描述器对象" + +#: ../../c-api/descriptor.rst:8 +msgid "" +"\"Descriptors\" are objects that describe some attribute of an object. They " +"are found in the dictionary of type objects." +msgstr "“描述器”是描述对象的某些属性的对象。它们存在于类型对象的字典中。" + +#: ../../c-api/descriptor.rst:13 +msgid "The type object for the built-in descriptor types." +msgstr "内建描述器类型的类型对象。" + +#: ../../c-api/descriptor.rst:18 +msgid "" +"Create a new get-set descriptor for extension type *type* from the " +":c:type:`PyGetSetDef` structure *getset*." +msgstr "" + +#: ../../c-api/descriptor.rst:21 +msgid "" +"Get-set descriptors expose attributes implemented by C getter and setter " +"functions rather than stored directly in the instance. This is the same kind" +" of descriptor created for entries in :c:member:`~PyTypeObject.tp_getset`, " +"and it appears in Python as a :class:`types.GetSetDescriptorType` object." +msgstr "" + +#: ../../c-api/descriptor.rst:26 ../../c-api/descriptor.rst:39 +#: ../../c-api/descriptor.rst:70 ../../c-api/descriptor.rst:101 +#: ../../c-api/descriptor.rst:123 +msgid "" +"On success, return a :term:`strong reference` to the descriptor. Return " +"``NULL`` with an exception set on failure." +msgstr "" + +#: ../../c-api/descriptor.rst:31 +msgid "" +"Create a new member descriptor for extension type *type* from the " +":c:type:`PyMemberDef` structure *member*." +msgstr "" + +#: ../../c-api/descriptor.rst:34 +msgid "" +"Member descriptors expose fields in the type's C struct as Python " +"attributes. This is the same kind of descriptor created for entries in " +":c:member:`~PyTypeObject.tp_members`, and it appears in Python as a " +":class:`types.MemberDescriptorType` object." +msgstr "" + +#: ../../c-api/descriptor.rst:44 +msgid "" +"The type object for member descriptor objects created from " +":c:type:`PyMemberDef` structures. These descriptors expose fields of a C " +"struct as attributes on a type, and correspond to " +":class:`types.MemberDescriptorType` objects in Python." +msgstr "" +"基于 :c:type:`PyMemberDef` 结构体创建的成员描述器对象的类型对象。这种描述器将 C 结构的字段暴露为类型的属性,对应 Python" +" 中的 :class:`types.MemberDescriptorType` 对象。" + +#: ../../c-api/descriptor.rst:53 +msgid "" +"The type object for get/set descriptor objects created from " +":c:type:`PyGetSetDef` structures. These descriptors implement attributes " +"whose value is computed by C getter and setter functions, and are used for " +"many built-in type attributes. They correspond to " +":class:`types.GetSetDescriptorType` objects in Python." +msgstr "" + +#: ../../c-api/descriptor.rst:62 +msgid "" +"Create a new method descriptor for extension type *type* from the " +":c:type:`PyMethodDef` structure *meth*." +msgstr "" + +#: ../../c-api/descriptor.rst:65 +msgid "" +"Method descriptors expose C functions as methods on a type. This is the same" +" kind of descriptor created for entries in " +":c:member:`~PyTypeObject.tp_methods`, and it appears in Python as a " +":class:`types.MethodDescriptorType` object." +msgstr "" + +#: ../../c-api/descriptor.rst:75 +msgid "" +"The type object for method descriptor objects created from " +":c:type:`PyMethodDef` structures. These descriptors expose C functions as " +"methods on a type, and correspond to :class:`types.MethodDescriptorType` " +"objects in Python." +msgstr "" + +#: ../../c-api/descriptor.rst:83 +msgid "Describes a slot wrapper used by :c:func:`PyDescr_NewWrapper`." +msgstr "" + +#: ../../c-api/descriptor.rst:85 +msgid "" +"Each ``wrapperbase`` record stores the Python-visible name and metadata for " +"a special method implemented by a type slot, together with the wrapper " +"function used to adapt that slot to Python's calling convention." +msgstr "" + +#: ../../c-api/descriptor.rst:91 +msgid "" +"Create a new wrapper descriptor for extension type *type* from the " +":c:struct:`wrapperbase` structure *base* and the wrapped slot function " +"pointer *wrapped*." +msgstr "" + +#: ../../c-api/descriptor.rst:96 +msgid "" +"Wrapper descriptors expose special methods implemented by type slots. This " +"is the same kind of descriptor that CPython creates for slot-based special " +"methods such as ``__repr__`` or ``__add__``, and it appears in Python as a " +":class:`types.WrapperDescriptorType` object." +msgstr "" + +#: ../../c-api/descriptor.rst:106 +msgid "" +"The type object for wrapper descriptor objects created by " +":c:func:`PyDescr_NewWrapper` and :c:func:`PyWrapper_New`. Wrapper " +"descriptors are used internally to expose special methods implemented via " +"wrapper structures, and appear in Python as " +":class:`types.WrapperDescriptorType` objects." +msgstr "" +"由 :c:func:`PyDescr_NewWrapper` 和 :c:func:`PyWrapper_New` 创建的包装器描述器对象的类型对象。 " +"包装器描述器在内部被用于暴露通过包装器结构体实现的特殊方法,对应 Python 中的 " +":class:`types.WrapperDescriptorType` 对象。" + +#: ../../c-api/descriptor.rst:115 +msgid "" +"Create a new class method descriptor for extension type *type* from the " +":c:type:`PyMethodDef` structure *method*." +msgstr "" + +#: ../../c-api/descriptor.rst:118 +msgid "" +"Class method descriptors expose C methods that receive the class rather than" +" an instance when accessed. This is the same kind of descriptor created for " +"``METH_CLASS`` entries in :c:member:`~PyTypeObject.tp_methods`, and it " +"appears in Python as a :class:`types.ClassMethodDescriptorType` object." +msgstr "" + +#: ../../c-api/descriptor.rst:128 +msgid "" +"Return non-zero if the descriptor object *descr* describes a data attribute," +" or ``0`` if it describes a method. *descr* must be a descriptor object; " +"there is no error checking." +msgstr "" +"如果描述器对象 *descr* 描述的是一个数据属性则返回非零值,或者如果它描述的是一个方法则返回 ``0``。 *descr* " +"必须是一个描述器对象;不会进行错误检查。" + +#: ../../c-api/descriptor.rst:135 +msgid "" +"Create a new bound wrapper object from the wrapper descriptor *d* and the " +"instance *self*." +msgstr "" + +#: ../../c-api/descriptor.rst:138 +msgid "" +"This is the bound form of a wrapper descriptor created by " +":c:func:`PyDescr_NewWrapper`. CPython creates these objects when a slot " +"wrapper is accessed through an instance, and they appear in Python as " +":class:`types.MethodWrapperType` objects." +msgstr "" + +#: ../../c-api/descriptor.rst:143 +msgid "" +"On success, return a :term:`strong reference` to the wrapper object. Return " +"``NULL`` with an exception set on failure." +msgstr "" + +#: ../../c-api/descriptor.rst:147 +msgid "Built-in descriptors" +msgstr "内置描述器" + +#: ../../c-api/descriptor.rst:151 +msgid "" +"The type object for super objects. This is the same object as :class:`super`" +" in the Python layer." +msgstr "super 对象的类型对象。它与 Python 层面的 :class:`super` 是相同的对象。" + +#: ../../c-api/descriptor.rst:157 +msgid "" +"The type of class method objects. This is the same object as " +":class:`classmethod` in the Python layer." +msgstr "类方法对象的类型。它与 Python 层面的 :class:`classmethod` 是相同的对象。" + +#: ../../c-api/descriptor.rst:163 +msgid "" +"The type object for C-level class method descriptor objects. This is the " +"type of the descriptors created for :func:`classmethod` defined in C " +"extension types, and corresponds to :class:`types.ClassMethodDescriptorType`" +" objects in Python." +msgstr "" + +#: ../../c-api/descriptor.rst:171 +msgid "" +"Create a new :class:`classmethod` object wrapping *callable*. *callable* " +"must be a callable object and must not be ``NULL``." +msgstr "" +"新建一个包裹 *callable* 的 :class:`classmethod` 对象。*callable* 必须是一个可调用对象,并且不可为 " +"``NULL`` 值。" + +#: ../../c-api/descriptor.rst:174 +msgid "" +"On success, this function returns a :term:`strong reference` to a new class " +"method descriptor. On failure, this function returns ``NULL`` with an " +"exception set." +msgstr "" +"成功时,此函数将返回一个指向新类方法描述器的 :term:`strong reference`。失败时,此函数将返回 ``NULL`` 并设置一个异常。" + +#: ../../c-api/descriptor.rst:181 +msgid "" +"The type of static method objects. This is the same object as " +":class:`staticmethod` in the Python layer." +msgstr "静态方法对象的类型。它与 Python 层面的 :class:`staticmethod` 是相同的对象。" + +#: ../../c-api/descriptor.rst:187 +msgid "" +"Create a new :class:`staticmethod` object wrapping *callable*. *callable* " +"must be a callable object and must not be ``NULL``." +msgstr "" +"新建一个包裹 *callable* 的 :class:`staticmethod` 对象。*callable* 必须是一个可调用对象,并且不可为 " +"``NULL`` 值。" + +#: ../../c-api/descriptor.rst:190 +msgid "" +"On success, this function returns a :term:`strong reference` to a new static" +" method descriptor. On failure, this function returns ``NULL`` with an " +"exception set." +msgstr "" +"成功时,此函数将返回一个指向新静态方法描述器的 :term:`strong reference`。失败时,此函数将返回 ``NULL`` " +"并设置一个异常。" diff --git a/c-api/dict.po b/c-api/dict.po new file mode 100644 index 0000000000..fc5e814c0b --- /dev/null +++ b/c-api/dict.po @@ -0,0 +1,865 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-01 17:14+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/dict.rst:6 +msgid "Dictionary Objects" +msgstr "字典对象" + +#: ../../c-api/dict.rst:13 +msgid "" +"This subtype of :c:type:`PyObject` represents a Python dictionary object." +msgstr "这个 :c:type:`PyObject` 的子类型代表一个 Python 字典对象。" + +#: ../../c-api/dict.rst:18 +msgid "" +"This instance of :c:type:`PyTypeObject` represents the Python dictionary " +"type. This is the same object as :class:`dict` in the Python layer." +msgstr "" +"Python 字典类型表示为 :c:type:`PyTypeObject` 的实例。这与 Python 层面的 :class:`dict` " +"是相同的对象。" + +#: ../../c-api/dict.rst:24 +msgid "" +"Return true if *p* is a dict object or an instance of a subtype of the dict " +"type. This function always succeeds." +msgstr "如果 *p* 是一个 dict 对象或者 dict 类型的子类型的实例则返回真值。此函数总是会成功执行。" + +#: ../../c-api/dict.rst:30 +msgid "" +"Return true if *p* is a dict object, but not an instance of a subtype of the" +" dict type. This function always succeeds." +msgstr "如果 *p* 是一个 dict 对象但不是 dict 类型的子类型的实例则返回真值。此函数总是会成功执行。" + +#: ../../c-api/dict.rst:36 +msgid "Return a new empty dictionary, or ``NULL`` on failure." +msgstr "返回一个新的空字典,失败时返回 ``NULL``。" + +#: ../../c-api/dict.rst:41 +msgid "" +"Return a :class:`types.MappingProxyType` object for a mapping which enforces" +" read-only behavior. This is normally used to create a view to prevent " +"modification of the dictionary for non-dynamic class types." +msgstr "" +"返回 :class:`types.MappingProxyType` 对象,用于强制执行只读行为的映射。这通常用于创建视图以防止修改非动态类类型的字典。" + +#: ../../c-api/dict.rst:48 +msgid "" +"The type object for mapping proxy objects created by " +":c:func:`PyDictProxy_New` and for the read-only ``__dict__`` attribute of " +"many built-in types. A :c:type:`PyDictProxy_Type` instance provides a " +"dynamic, read-only view of an underlying dictionary: changes to the " +"underlying dictionary are reflected in the proxy, but the proxy itself does " +"not support mutation operations. This corresponds to " +":class:`types.MappingProxyType` in Python." +msgstr "" +"对应于由 :c:func:`PyDictProxy_New` 创建的映射代理对象和许多内置类型的只读 ``__dict__`` " +"属性的类型对象。:c:type:`PyDictProxy_Type` " +"实例提供下层字典的动态、只读视图:对下层字典的修改将反映在代理中,但代理本身不支持修改操作。这对应于 Python 中的 " +":class:`types.MappingProxyType`。" + +#: ../../c-api/dict.rst:59 +msgid "Empty an existing dictionary of all key-value pairs." +msgstr "清空现有字典的所有键值对。" + +#: ../../c-api/dict.rst:64 +msgid "" +"Determine if dictionary *p* contains *key*. If an item in *p* matches " +"*key*, return ``1``, otherwise return ``0``. On error, return ``-1``. This " +"is equivalent to the Python expression ``key in p``." +msgstr "" +"确定字典 *p* 是否包含 *key*。如果 *p* 中的某一项与 *key* 匹配,则返回 ``1``,否则返回 ``0``。当出错时,返回 " +"``-1``。这等价于 Python 表达式 ``key in p``。" + +#: ../../c-api/dict.rst:70 ../../c-api/dict.rst:97 ../../c-api/dict.rst:117 +#: ../../c-api/dict.rst:140 ../../c-api/dict.rst:257 ../../c-api/dict.rst:279 +msgid "" +"The operation is atomic on :term:`free threading ` when" +" *key* is :class:`str`, :class:`int`, :class:`float`, :class:`bool` or " +":class:`bytes`." +msgstr "" + +#: ../../c-api/dict.rst:76 +msgid "" +"This is the same as :c:func:`PyDict_Contains`, but *key* is specified as a " +":c:expr:`const char*` UTF-8 encoded bytes string, rather than a " +":c:expr:`PyObject*`." +msgstr "" +"这与 :c:func:`PyDict_Contains` 相同,但 *key* 被指定为一个 :c:expr:`const char*` UTF-8 " +"编码的字节串,而不是 :c:expr:`PyObject*`。" + +#: ../../c-api/dict.rst:85 +msgid "Return a new dictionary that contains the same key-value pairs as *p*." +msgstr "返回与 *p* 包含相同键值对的新字典。" + +#: ../../c-api/dict.rst:90 +msgid "" +"Insert *val* into the dictionary *p* with a key of *key*. *key* must be " +":term:`hashable`; if it isn't, :exc:`TypeError` will be raised. Return ``0``" +" on success or ``-1`` on failure. This function *does not* \":term:`steal`\"" +" a reference to *val*." +msgstr "" + +#: ../../c-api/dict.rst:103 +msgid "" +"This is the same as :c:func:`PyDict_SetItem`, but *key* is specified as a " +":c:expr:`const char*` UTF-8 encoded bytes string, rather than a " +":c:expr:`PyObject*`." +msgstr "" +"这与 :c:func:`PyDict_SetItem` 相同,但 *key* 被指定为 :c:expr:`const char*` UTF-8 " +"编码的字节串,而不是 :c:expr:`PyObject*`。" + +#: ../../c-api/dict.rst:110 +msgid "" +"Remove the entry in dictionary *p* with key *key*. *key* must be " +":term:`hashable`; if it isn't, :exc:`TypeError` is raised. If *key* is not " +"in the dictionary, :exc:`KeyError` is raised. Return ``0`` on success or " +"``-1`` on failure." +msgstr "" +"移除字典 *p* 中键为 *key* 的条目。*key* 必须是 :term:`hashable`;如果不是,则会引发 " +":exc:`TypeError`。如果字典中没有 *key*,则会引发 :exc:`KeyError`。成功时返回 ``0`` 或者失败时返回 " +"``-1``。" + +#: ../../c-api/dict.rst:123 +msgid "" +"This is the same as :c:func:`PyDict_DelItem`, but *key* is specified as a " +":c:expr:`const char*` UTF-8 encoded bytes string, rather than a " +":c:expr:`PyObject*`." +msgstr "" +"这与 :c:func:`PyDict_DelItem` 相同,但 *key* 被指定为 :c:expr:`const char*` UTF-8 " +"编码的字节串,而不是 :c:expr:`PyObject*`。" + +#: ../../c-api/dict.rst:130 +msgid "" +"Return a new :term:`strong reference` to the object from dictionary *p* " +"which has a key *key*:" +msgstr "返回一个新的指向字典 *p* 中对应键 *key* 的对象的 :term:`strong reference`:" + +#: ../../c-api/dict.rst:133 +msgid "" +"If the key is present, set *\\*result* to a new :term:`strong reference` to " +"the value and return ``1``." +msgstr "如果存在该键,则将 *\\*result* 设为一个新的指向该值的 :term:`strong reference` 并返回 ``1``。" + +#: ../../c-api/dict.rst:135 +msgid "If the key is missing, set *\\*result* to ``NULL`` and return ``0``." +msgstr "如果不存在该键,则将 *\\*result* 设为 ``NULL`` 并返回 ``0``。" + +#: ../../c-api/dict.rst:136 +msgid "" +"On error, raise an exception, set *\\*result* to ``NULL`` and return ``-1``." +msgstr "" + +#: ../../c-api/dict.rst:145 +msgid "See also the :c:func:`PyObject_GetItem` function." +msgstr "另请参阅 :c:func:`PyObject_GetItem` 函数。" + +#: ../../c-api/dict.rst:150 +msgid "" +"Return a :term:`borrowed reference` to the object from dictionary *p* which " +"has a key *key*. Return ``NULL`` if the key *key* is missing *without* " +"setting an exception." +msgstr "" +"返回一个指向字典 *p* 中对应键 *key* 的对象的 :term:`borrowed reference`。如果不存在键 *key* 则返回 " +"``NULL`` 且 *不会* 设置异常。" + +#: ../../c-api/dict.rst:156 +msgid "" +"Exceptions that occur while this calls :meth:`~object.__hash__` and " +":meth:`~object.__eq__` methods are silently ignored. Prefer the " +":c:func:`PyDict_GetItemWithError` function instead." +msgstr "" +"在调用 :meth:`~object.__hash__` 和 :meth:`~object.__eq__` 方法时发生的异常将被静默地忽略。建议改用 " +":c:func:`PyDict_GetItemWithError` 函数。" + +#: ../../c-api/dict.rst:162 ../../c-api/dict.rst:181 +msgid "" +"In the :term:`free-threaded build`, the returned :term:`borrowed reference` " +"may become invalid if another thread modifies the dictionary concurrently. " +"Prefer :c:func:`PyDict_GetItemRef`, which returns a :term:`strong " +"reference`." +msgstr "" + +#: ../../c-api/dict.rst:167 +msgid "" +"Calling this API without an :term:`attached thread state` had been allowed " +"for historical reason. It is no longer allowed." +msgstr "" +"出于历史原因,曾经允许在没有附加线程状态 :term:`attached thread state` 的情况下调用这个 API,但现在已经不再允许了。" + +#: ../../c-api/dict.rst:174 +msgid "" +"Variant of :c:func:`PyDict_GetItem` that does not suppress exceptions. " +"Return ``NULL`` **with** an exception set if an exception occurred. Return " +"``NULL`` **without** an exception set if the key wasn't present." +msgstr "" +":c:func:`PyDict_GetItem` 的变种,它不会屏蔽异常。当异常发生时将返回 ``NULL`` **并且** " +"设置一个异常。如果键不存在则返回 ``NULL`` **并且不会** 设置一个异常。" + +#: ../../c-api/dict.rst:189 +msgid "" +"This is the same as :c:func:`PyDict_GetItem`, but *key* is specified as a " +":c:expr:`const char*` UTF-8 encoded bytes string, rather than a " +":c:expr:`PyObject*`." +msgstr "" +"这与 :c:func:`PyDict_GetItem` 一样,但 *key* 是由一个 :c:expr:`const char*` UTF-8 " +"编码的字节串来指定的,而不是 :c:expr:`PyObject*`。" + +#: ../../c-api/dict.rst:195 +msgid "" +"Exceptions that occur while this calls :meth:`~object.__hash__` and " +":meth:`~object.__eq__` methods or while creating the temporary :class:`str` " +"object are silently ignored. Prefer using the " +":c:func:`PyDict_GetItemWithError` function with your own " +":c:func:`PyUnicode_FromString` *key* instead." +msgstr "" +"在调用 :meth:`~object.__hash__` 和 :meth:`~object.__eq__` 方法时或者在创建临时 " +":class:`str` 对象期间发生的异常将被静默地忽略。建议改用 :c:func:`PyDict_GetItemWithError` " +"函数并附带你自己的 :c:func:`PyUnicode_FromString` *key*。" + +#: ../../c-api/dict.rst:203 +msgid "" +"In the :term:`free-threaded build`, the returned :term:`borrowed reference` " +"may become invalid if another thread modifies the dictionary concurrently. " +"Prefer :c:func:`PyDict_GetItemStringRef`, which returns a :term:`strong " +"reference`." +msgstr "" + +#: ../../c-api/dict.rst:211 +msgid "" +"Similar to :c:func:`PyDict_GetItemRef`, but *key* is specified as a " +":c:expr:`const char*` UTF-8 encoded bytes string, rather than a " +":c:expr:`PyObject*`." +msgstr "" +"类似于 :c:func:`PyDict_GetItemRef`,但 *key* 被指定为一个 :c:expr:`const char*` UTF-8 " +"编码的字节串,而不是 :c:expr:`PyObject*`。" + +#: ../../c-api/dict.rst:220 +msgid "" +"This is the same as the Python-level :meth:`dict.setdefault`. If present, " +"it returns the value corresponding to *key* from the dictionary *p*. If the" +" key is not in the dict, it is inserted with value *defaultobj* and " +"*defaultobj* is returned. This function evaluates the hash function of " +"*key* only once, instead of evaluating it independently for the lookup and " +"the insertion." +msgstr "" +"这跟 Python 层面的 :meth:`dict.setdefault` 一样。如果键 *key* 存在,它返回在字典 *p* " +"里面对应的值。如果键不存在,它会和值 *defaultobj* 一起插入并返回 *defaultobj* 。这个函数只计算 *key* " +"的哈希函数一次,而不是在查找和插入时分别计算它。" + +#: ../../c-api/dict.rst:230 +msgid "" +"In the :term:`free-threaded build`, the returned :term:`borrowed reference` " +"may become invalid if another thread modifies the dictionary concurrently. " +"Prefer :c:func:`PyDict_SetDefaultRef`, which returns a :term:`strong " +"reference`." +msgstr "" + +#: ../../c-api/dict.rst:239 +msgid "" +"Inserts *default_value* into the dictionary *p* with a key of *key* if the " +"key is not already present in the dictionary. If *result* is not ``NULL``, " +"then *\\*result* is set to a :term:`strong reference` to either " +"*default_value*, if the key was not present, or the existing value, if *key*" +" was already present in the dictionary. Returns ``1`` if the key was present" +" and *default_value* was not inserted, or ``0`` if the key was not present " +"and *default_value* was inserted. On failure, returns ``-1``, sets an " +"exception, and sets ``*result`` to ``NULL``." +msgstr "" +"如果键 *key* 在字典 *p* 中尚不存在则将该键和值 *default_value* 插入到该字典中。如果 *result* 不为 " +"``NULL``,那么当该键不存在时将 *\\*result* 设为指向 *default_value* 的 :term:`strong " +"reference`,或者当 *key* 已存在于该字典中时将其设为原有的值。如果该键已存在并且未插入 *default_value* 则返回 " +"``1``,或者如果该键不存在并且已插入 *default_value* 则返回 ``0``。当执行失败时,将返回 ``-1``,设置一个异常,并将 " +"``*result`` 设为 ``NULL``。" + +#: ../../c-api/dict.rst:249 +msgid "" +"For clarity: if you have a strong reference to *default_value* before " +"calling this function, then after it returns, you hold a strong reference to" +" both *default_value* and *\\*result* (if it's not ``NULL``). These may " +"refer to the same object: in that case you hold two separate references to " +"it." +msgstr "" +"澄清一点:如果你在调用此函数前持有指向 *default_value* 的强引用,那么在它返回之后,你将同时持有指向 *default_value* 和" +" *\\*result* (如果它不为 ``NULL``) 的强引用。两者可能指向同一个对象:在此情况下你将持有两个指向它的单独引用。" + +#: ../../c-api/dict.rst:265 +msgid "" +"Remove *key* from dictionary *p* and optionally return the removed value. Do" +" not raise :exc:`KeyError` if the key is missing." +msgstr "将 *key* 从字典 *p* 中移除并可选择返回被移除的值。当键不存在时不会引发 :exc:`KeyError`。" + +#: ../../c-api/dict.rst:268 +msgid "" +"If the key is present, set *\\*result* to a new reference to the removed " +"value if *result* is not ``NULL``, and return ``1``." +msgstr "如果键存在,则在 *result* 不为 ``NULL`` 时将 *\\*result* 设为一个新的指向被移除值的引用,并返回 ``1``。" + +#: ../../c-api/dict.rst:270 +msgid "" +"If the key is missing, set *\\*result* to ``NULL`` if *result* is not " +"``NULL``, and return ``0``." +msgstr "如果不存在该键,则在 *result* 不为 ``NULL`` 时将 *\\*result* 设为 ``NULL``,并返回 ``0``。" + +#: ../../c-api/dict.rst:272 +msgid "On error, raise an exception and return ``-1``." +msgstr "发生错误时,将引发异常并返回 ``-1``。" + +#: ../../c-api/dict.rst:274 +msgid "" +"Similar to :meth:`dict.pop`, but without the default value and not raising " +":exc:`KeyError` if the key is missing." +msgstr "类似于 :meth:`dict.pop`,但没有默认值并且当键不存在时不会引发 :exc:`KeyError`。" + +#: ../../c-api/dict.rst:287 +msgid "" +"Similar to :c:func:`PyDict_Pop`, but *key* is specified as a :c:expr:`const " +"char*` UTF-8 encoded bytes string, rather than a :c:expr:`PyObject*`." +msgstr "" +"类似于 :c:func:`PyDict_Pop`,但 *key* 是以一个 :c:expr:`const char*` UTF-8 " +"编码的字节串形式指定的,而不是 :c:expr:`PyObject*`。" + +#: ../../c-api/dict.rst:296 +msgid "" +"Return a :c:type:`PyListObject` containing all the items from the " +"dictionary." +msgstr "返回一个包含字典中所有键值项的 :c:type:`PyListObject`。" + +#: ../../c-api/dict.rst:301 +msgid "" +"Return a :c:type:`PyListObject` containing all the keys from the dictionary." +msgstr "返回一个包含字典中所有键 (keys) 的 :c:type:`PyListObject`。" + +#: ../../c-api/dict.rst:306 +msgid "" +"Return a :c:type:`PyListObject` containing all the values from the " +"dictionary *p*." +msgstr "返回一个包含字典中所有值 (values) 的 :c:type:`PyListObject`。" + +#: ../../c-api/dict.rst:314 +msgid "" +"Return the number of items in the dictionary. This is equivalent to " +"``len(p)`` on a dictionary." +msgstr "返回字典中项目数,等价于对字典 *p* 使用 ``len(p)``。" + +#: ../../c-api/dict.rst:320 +msgid "Similar to :c:func:`PyDict_Size`, but without error checking." +msgstr "类似于 :c:func:`PyDict_Size`,但是不带错误检查。" + +#: ../../c-api/dict.rst:325 +msgid "" +"Iterate over all key-value pairs in the dictionary *p*. The " +":c:type:`Py_ssize_t` referred to by *ppos* must be initialized to ``0`` " +"prior to the first call to this function to start the iteration; the " +"function returns true for each pair in the dictionary, and false once all " +"pairs have been reported. The parameters *pkey* and *pvalue* should either " +"point to :c:expr:`PyObject*` variables that will be filled in with each key " +"and value, respectively, or may be ``NULL``. Any references returned " +"through them are borrowed. *ppos* should not be altered during iteration. " +"Its value represents offsets within the internal dictionary structure, and " +"since the structure is sparse, the offsets are not consecutive." +msgstr "" +"迭代字典 *p* 中的所有键值对。在第一次调用此函数开始迭代之前,由 *ppos* 所引用的 :c:type:`Py_ssize_t` 必须被初始化为 " +"``0``;该函数将为字典中的每个键值对返回真值,一旦所有键值对都报告完毕则返回假值。形参 *pkey* 和 *pvalue* 应当指向 " +":c:expr:`PyObject*` 变量,它们将分别使用每个键和值来填充,或者也可以为 " +"``NULL``。通过它们返回的任何引用都是暂借的。*ppos* " +"在迭代期间不应被更改。它的值表示内部字典结构中的偏移量,并且由于结构是稀疏的,因此偏移量并不连续。" + +#: ../../c-api/dict.rst:336 +msgid "For example::" +msgstr "例如::" + +#: ../../c-api/dict.rst:338 +msgid "" +"PyObject *key, *value;\n" +"Py_ssize_t pos = 0;\n" +"\n" +"while (PyDict_Next(self->dict, &pos, &key, &value)) {\n" +" /* do something interesting with the values... */\n" +" ...\n" +"}" +msgstr "" +"PyObject *key, *value;\n" +"Py_ssize_t pos = 0;\n" +"\n" +"while (PyDict_Next(self->dict, &pos, &key, &value)) {\n" +" /* 用这些值做些有趣的事... */\n" +" ...\n" +"}" + +#: ../../c-api/dict.rst:346 +msgid "" +"The dictionary *p* should not be mutated during iteration. It is safe to " +"modify the values of the keys as you iterate over the dictionary, but only " +"so long as the set of keys does not change. For example::" +msgstr "字典 *p* 不应该在遍历期间发生改变。在遍历字典时,改变键对应的值是安全的,但仅限于键的集合不发生改变。例如::" + +#: ../../c-api/dict.rst:350 +msgid "" +"PyObject *key, *value;\n" +"Py_ssize_t pos = 0;\n" +"\n" +"while (PyDict_Next(self->dict, &pos, &key, &value)) {\n" +" long i = PyLong_AsLong(value);\n" +" if (i == -1 && PyErr_Occurred()) {\n" +" return -1;\n" +" }\n" +" PyObject *o = PyLong_FromLong(i + 1);\n" +" if (o == NULL)\n" +" return -1;\n" +" if (PyDict_SetItem(self->dict, key, o) < 0) {\n" +" Py_DECREF(o);\n" +" return -1;\n" +" }\n" +" Py_DECREF(o);\n" +"}" +msgstr "" +"PyObject *key, *value;\n" +"Py_ssize_t pos = 0;\n" +"\n" +"while (PyDict_Next(self->dict, &pos, &key, &value)) {\n" +" long i = PyLong_AsLong(value);\n" +" if (i == -1 && PyErr_Occurred()) {\n" +" return -1;\n" +" }\n" +" PyObject *o = PyLong_FromLong(i + 1);\n" +" if (o == NULL)\n" +" return -1;\n" +" if (PyDict_SetItem(self->dict, key, o) < 0) {\n" +" Py_DECREF(o);\n" +" return -1;\n" +" }\n" +" Py_DECREF(o);\n" +"}" + +#: ../../c-api/dict.rst:368 +msgid "" +"The function is not thread-safe in the :term:`free-threaded ` build without external synchronization. You can use " +":c:macro:`Py_BEGIN_CRITICAL_SECTION` to lock the dictionary while iterating " +"over it::" +msgstr "" +"此函数在没有外部同步的 :term:`自由线程 ` 编译版中不是线程安全的。你可以使用 " +":c:macro:`Py_BEGIN_CRITICAL_SECTION` 在迭代字典时锁定它::" + +#: ../../c-api/dict.rst:373 +msgid "" +"Py_BEGIN_CRITICAL_SECTION(self->dict);\n" +"while (PyDict_Next(self->dict, &pos, &key, &value)) {\n" +" ...\n" +"}\n" +"Py_END_CRITICAL_SECTION();" +msgstr "" +"Py_BEGIN_CRITICAL_SECTION(self->dict);\n" +"while (PyDict_Next(self->dict, &pos, &key, &value)) {\n" +" ...\n" +"}\n" +"Py_END_CRITICAL_SECTION();" + +#: ../../c-api/dict.rst:381 +msgid "" +"On the free-threaded build, this function can be used safely inside a " +"critical section. However, the references returned for *pkey* and *pvalue* " +"are :term:`borrowed ` and are only valid while the " +"critical section is held. If you need to use these objects outside the " +"critical section or when the critical section can be suspended, create a " +":term:`strong reference ` (for example, using " +":c:func:`Py_NewRef`)." +msgstr "" +"在自由线程构建版中,此函数可在关键节内部安全地使用。不过,针对 *pkey* 和 *pvalue* 返回的引用是 :term:`借入引用 " +"` 并且仅在关键节被持有时有效。如果你需要在关键节之外或是在关键节可被挂起时使用这些对象,则要创建 " +":term:`强引用 ` (例如,使用 :c:func:`Py_NewRef`)。" + +#: ../../c-api/dict.rst:391 +msgid "" +"Iterate over mapping object *b* adding key-value pairs to dictionary *a*. " +"*b* may be a dictionary, or any object supporting :c:func:`PyMapping_Keys` " +"and :c:func:`PyObject_GetItem`. If *override* is true, existing pairs in *a*" +" will be replaced if a matching key is found in *b*, otherwise pairs will " +"only be added if there is not a matching key in *a*. Return ``0`` on success" +" or ``-1`` if an exception was raised." +msgstr "" +"对映射对象 *b* 进行迭代,将键值对添加到字典 *a*。*b* 可以是一个字典,或任何支持 :c:func:`PyMapping_Keys` 和 " +":c:func:`PyObject_GetItem` 的对象。如果 *override* 为真值,则如果在 *b* 中找到相同的键则 *a* " +"中已存在的相应键值对将被替换,否则如果在 *a* 中没有相同的键则只是添加键值对。当成功时返回 ``0`` 或者当引发异常时返回 ``-1``。" + +#: ../../c-api/dict.rst:400 ../../c-api/dict.rst:416 +msgid "" +"In the :term:`free-threaded build`, when *b* is a :class:`dict` (with the " +"standard iterator), both *a* and *b* are locked for the duration of the " +"operation. When *b* is a non-dict mapping, only *a* is locked; *b* may be " +"concurrently modified by another thread." +msgstr "" + +#: ../../c-api/dict.rst:408 +msgid "" +"This is the same as ``PyDict_Merge(a, b, 1)`` in C, and is similar to " +"``a.update(b)`` in Python except that :c:func:`PyDict_Update` doesn't fall " +"back to the iterating over a sequence of key value pairs if the second " +"argument has no \"keys\" attribute. Return ``0`` on success or ``-1`` if an" +" exception was raised." +msgstr "" +"这与 C 中的 ``PyDict_Merge(a, b, 1)`` 一样,也类似于 Python 中的 ``a.update(b)``,差别在于 " +":c:func:`PyDict_Update` 在第二个参数没有 \"keys\" 属性时不会回退到迭代键值对的序列。当成功时返回 ``0`` " +"或者当引发异常时返回 ``-1``。" + +#: ../../c-api/dict.rst:424 +msgid "" +"Update or merge into dictionary *a*, from the key-value pairs in *seq2*. " +"*seq2* must be an iterable object producing iterable objects of length 2, " +"viewed as key-value pairs. In case of duplicate keys, the last wins if " +"*override* is true, else the first wins. Return ``0`` on success or ``-1`` " +"if an exception was raised. Equivalent Python (except for the return " +"value)::" +msgstr "" +"将 *seq2* 中的键值对更新或合并到字典 *a*。*seq2* 必须为产生长度为 2 的用作键值对的元素的可迭代对象。当存在重复的键时,如果 " +"*override* 为真值则最后出现的键胜出,否则先出现的键胜出。当成功时返回 ``0`` 或者当引发异常时返回 ``-1``。等价的 Python " +"代码(返回值除外)::" + +#: ../../c-api/dict.rst:431 +msgid "" +"def PyDict_MergeFromSeq2(a, seq2, override):\n" +" for key, value in seq2:\n" +" if override or key not in a:\n" +" a[key] = value" +msgstr "" +"def PyDict_MergeFromSeq2(a, seq2, override):\n" +" for key, value in seq2:\n" +" if override or key not in a:\n" +" a[key] = value" + +#: ../../c-api/dict.rst:438 +msgid "" +"In the :term:`free-threaded ` build, only *a* is locked. The" +" iteration over *seq2* is not synchronized; *seq2* may be concurrently " +"modified by another thread." +msgstr "" + +#: ../../c-api/dict.rst:445 +msgid "" +"Register *callback* as a dictionary watcher. Return a non-negative integer " +"id which must be passed to future calls to :c:func:`PyDict_Watch`. In case " +"of error (e.g. no more watcher IDs available), return ``-1`` and set an " +"exception." +msgstr "" +"在字典上注册 *callback* 来作为 watcher。返回值为非负数的整数 id,作为将来调用 :c:func:`PyDict_Watch` " +"的时候使用。如果出现错误(比如没有足够的可用 watcher ID),返回 ``-1`` 并且设置异常。" + +#: ../../c-api/dict.rst:452 ../../c-api/dict.rst:467 +msgid "" +"This function is not internally synchronized. In the :term:`free-threaded " +"` build, callers should ensure no concurrent calls to " +":c:func:`PyDict_AddWatcher` or :c:func:`PyDict_ClearWatcher` are in " +"progress." +msgstr "" + +#: ../../c-api/dict.rst:461 +msgid "" +"Clear watcher identified by *watcher_id* previously returned from " +":c:func:`PyDict_AddWatcher`. Return ``0`` on success, ``-1`` on error (e.g. " +"if the given *watcher_id* was never registered.)" +msgstr "" +"清空由之前从 :c:func:`PyDict_AddWatcher` 返回的 *watcher_id* 所标识的 watcher。成功时返回 " +"``0``,出错时(例如当给定的 *watcher_id* 未被注册)返回 ``-1``。" + +#: ../../c-api/dict.rst:476 +msgid "" +"Mark dictionary *dict* as watched. The callback granted *watcher_id* by " +":c:func:`PyDict_AddWatcher` will be called when *dict* is modified or " +"deallocated. Return ``0`` on success or ``-1`` on error." +msgstr "" +"将字典 *dict* 标记为已被监视。由 :c:func:`PyDict_AddWatcher` 授权 *watcher_id* 对应的回调将在 " +"*dict* 被修改或释放时被调用。成功时返回 ``0``,出错时返回 ``-1``。" + +#: ../../c-api/dict.rst:484 +msgid "" +"Mark dictionary *dict* as no longer watched. The callback granted " +"*watcher_id* by :c:func:`PyDict_AddWatcher` will no longer be called when " +"*dict* is modified or deallocated. The dict must previously have been " +"watched by this watcher. Return ``0`` on success or ``-1`` on error." +msgstr "" +"将字典 *dict* 标记为不再被监视。由 :c:func:`PyDict_AddWatcher` 授权 *watcher_id* 对应的回调在 " +"*dict* 被修改或释放时将不再被调用。该字典在此之前必须已被此监视器所监视。成功时返回 ``0``,出错时返回 ``-1``。" + +#: ../../c-api/dict.rst:493 +msgid "" +"Enumeration of possible dictionary watcher events: ``PyDict_EVENT_ADDED``, " +"``PyDict_EVENT_MODIFIED``, ``PyDict_EVENT_DELETED``, " +"``PyDict_EVENT_CLONED``, ``PyDict_EVENT_CLEARED``, or " +"``PyDict_EVENT_DEALLOCATED``." +msgstr "" +"由以下可能的字典监视器事件组成的枚举: ``PyDict_EVENT_ADDED``, ``PyDict_EVENT_MODIFIED``, " +"``PyDict_EVENT_DELETED``, ``PyDict_EVENT_CLONED``, ``PyDict_EVENT_CLEARED`` " +"或 ``PyDict_EVENT_DEALLOCATED``。" + +#: ../../c-api/dict.rst:501 +msgid "Type of a dict watcher callback function." +msgstr "字典监视器回调函数的类型。" + +#: ../../c-api/dict.rst:503 +msgid "" +"If *event* is ``PyDict_EVENT_CLEARED`` or ``PyDict_EVENT_DEALLOCATED``, both" +" *key* and *new_value* will be ``NULL``. If *event* is " +"``PyDict_EVENT_ADDED`` or ``PyDict_EVENT_MODIFIED``, *new_value* will be the" +" new value for *key*. If *event* is ``PyDict_EVENT_DELETED``, *key* is being" +" deleted from the dictionary and *new_value* will be ``NULL``." +msgstr "" +"如果 *event* 是 ``PyDict_EVENT_CLEARED`` 或 ``PyDict_EVENT_DEALLOCATED``,则 *key*" +" 和 *new_value* 都将为 ``NULL``。如果 *event* 是 ``PyDict_EVENT_ADDED`` 或 " +"``PyDict_EVENT_MODIFIED``,则 *new_value* 将为 *key* 的新值。如果 *event* 是 " +"``PyDict_EVENT_DELETED``,则将从字典中删除 *key* 而 *new_value* 将为 ``NULL``。" + +#: ../../c-api/dict.rst:509 +msgid "" +"``PyDict_EVENT_CLONED`` occurs when *dict* was previously empty and another " +"dict is merged into it. To maintain efficiency of this operation, per-key " +"``PyDict_EVENT_ADDED`` events are not issued in this case; instead a single " +"``PyDict_EVENT_CLONED`` is issued, and *key* will be the source dictionary." +msgstr "" +"``PyDict_EVENT_CLONED`` 会在另一个字典合并到之前为空的 *dict* 时发生。为保证此操作的效率,该场景不会发出针对单个键的 " +"``PyDict_EVENT_ADDED`` 事件;而是发出单个 ``PyDict_EVENT_CLONED``,而 *key* 将为源字典。" + +#: ../../c-api/dict.rst:515 +msgid "" +"The callback may inspect but must not modify *dict*; doing so could have " +"unpredictable effects, including infinite recursion. Do not trigger Python " +"code execution in the callback, as it could modify the dict as a side " +"effect." +msgstr "" +"该回调可以检查但不能修改 *dict*;否则会产生不可预料的影响,包括无限递归。请不要在该回调中触发 Python 代码的执行,因为它可能产生修改 " +"dict 的附带影响。" + +#: ../../c-api/dict.rst:519 +msgid "" +"If *event* is ``PyDict_EVENT_DEALLOCATED``, taking a new reference in the " +"callback to the about-to-be-destroyed dictionary will resurrect it and " +"prevent it from being freed at this time. When the resurrected object is " +"destroyed later, any watcher callbacks active at that time will be called " +"again." +msgstr "" +"如果 *event* 是 " +"``PyDict_EVENT_DEALLOCATED``,则在回调中接受一个对即将销毁的字典的新引用将使其重生并阻止其在此时被释放。当重生的对象以后再被销毁时,任何在当时已激活的监视器回调将再次被调用。" + +#: ../../c-api/dict.rst:525 +msgid "" +"Callbacks occur before the notified modification to *dict* takes place, so " +"the prior state of *dict* can be inspected." +msgstr "回调会在已通知的对 *dict* 的修改完成之前执行,这样在此之前的 *dict* 状态可以被检查。" + +#: ../../c-api/dict.rst:528 +msgid "" +"If the callback sets an exception, it must return ``-1``; this exception " +"will be printed as an unraisable exception using " +":c:func:`PyErr_WriteUnraisable`. Otherwise it should return ``0``." +msgstr "" +"如果该回调设置了一个异常,则它必须返回 ``-1``;此异常将作为不可引发的异常使用 :c:func:`PyErr_WriteUnraisable` " +"打印出来。在其他情况下它应当返回 ``0``。" + +#: ../../c-api/dict.rst:532 +msgid "" +"There may already be a pending exception set on entry to the callback. In " +"this case, the callback should return ``0`` with the same exception still " +"set. This means the callback may not call any other API that can set an " +"exception unless it saves and clears the exception state first, and restores" +" it before returning." +msgstr "" +"在进入回调时可能已经设置了尚未处理的异常。在此情况下,回调应当返回 ``0`` 并仍然设置同样的异常。这意味着该回调可能不会调用任何其他可设置异常的 " +"API 除非它先保存并清空异常状态,并在返回之前恢复它。" + +#: ../../c-api/dict.rst:542 +msgid "Dictionary View Objects" +msgstr "字典视图对象" + +#: ../../c-api/dict.rst:546 +msgid "" +"Return true if *op* is a view of a set inside a dictionary. This is " +"currently equivalent to :c:expr:`PyDictKeys_Check(op) || " +"PyDictItems_Check(op)`. This function always succeeds." +msgstr "" +"如果 *op* 是一个字典内集合的视图则返回真值。此函数目前等价于 :c:expr:`PyDictKeys_Check(op) || " +"PyDictItems_Check(op)`。此函数总是会成功执行。" + +#: ../../c-api/dict.rst:553 +msgid "" +"Type object for a view of dictionary keys. In Python, this is the type of " +"the object returned by :meth:`dict.keys`." +msgstr "由字典键组成的视图的类型对象。在 Python 中,这就是由 :meth:`dict.keys` 返回的对象的类型。" + +#: ../../c-api/dict.rst:559 +msgid "" +"Return true if *op* is an instance of a dictionary keys view. This function " +"always succeeds." +msgstr "如果 *op* 是一个字典键视图的实例则返回真值。此函数总是会成功执行。" + +#: ../../c-api/dict.rst:565 +msgid "" +"Type object for a view of dictionary values. In Python, this is the type of " +"the object returned by :meth:`dict.values`." +msgstr "由字典值组成的视图的类型对象。在 Python 中,这就是由 :meth:`dict.values` 返回的对象的类型。" + +#: ../../c-api/dict.rst:571 +msgid "" +"Return true if *op* is an instance of a dictionary values view. This " +"function always succeeds." +msgstr "如果 *op* 是一个字典值视图的实例则返回真值。此函数总是会成功执行。" + +#: ../../c-api/dict.rst:577 +msgid "" +"Type object for a view of dictionary items. In Python, this is the type of " +"the object returned by :meth:`dict.items`." +msgstr "由字典条目组成的视图的类型对象。在 Python 中,这就是由 :meth:`dict.items` 返回的对象的类型。" + +#: ../../c-api/dict.rst:583 +msgid "" +"Return true if *op* is an instance of a dictionary items view. This function" +" always succeeds." +msgstr "如果 *op* 是一个字典条目视图的实例则返回真值。此函数总是会成功执行。" + +#: ../../c-api/dict.rst:588 +msgid "Ordered Dictionaries" +msgstr "有序字典" + +#: ../../c-api/dict.rst:590 +msgid "" +"Python's C API provides interface for :class:`collections.OrderedDict` from " +"C. Since Python 3.7, dictionaries are ordered by default, so there is " +"usually little need for these functions; prefer ``PyDict*`` where possible." +msgstr "" +"Python 的 C API 提供了针对来自 C 的 :class:`collections.OrderedDict` 的接口。从 Python 3.7" +" 开始,字典默认就是有序的,因此通常不需要使用这些函数;只要有可能就建议使用 ``PyDict*``。" + +#: ../../c-api/dict.rst:597 +msgid "" +"Type object for ordered dictionaries. This is the same object as " +":class:`collections.OrderedDict` in the Python layer." +msgstr "有序字典的类型对象。它与 Python 层面的 :class:`collections.OrderedDict` 是相同的对象。" + +#: ../../c-api/dict.rst:603 +msgid "" +"Return true if *od* is an ordered dictionary object or an instance of a " +"subtype of the :class:`~collections.OrderedDict` type. This function always" +" succeeds." +msgstr "" +"如果 *od* 是一个有序字典对象或 :class:`~collections.OrderedDict` " +"类型的子类型的实例则返回真值。此函数总是会成功执行。" + +#: ../../c-api/dict.rst:610 +msgid "" +"Return true if *od* is an ordered dictionary object, but not an instance of " +"a subtype of the :class:`~collections.OrderedDict` type. This function " +"always succeeds." +msgstr "" +"如果 *od* 是一个有序字典对象,但不是 :class:`~collections.OrderedDict` " +"类型的子类型的实例则返回真值。此函数总是会成功执行。" + +#: ../../c-api/dict.rst:617 +msgid "Analogous to :c:type:`PyDictKeys_Type` for ordered dictionaries." +msgstr "等同于针对有序字典的 :c:type:`PyDictKeys_Type`。" + +#: ../../c-api/dict.rst:622 +msgid "Analogous to :c:type:`PyDictValues_Type` for ordered dictionaries." +msgstr "等同于针对有序字典的 :c:type:`PyDictValues_Type`。" + +#: ../../c-api/dict.rst:627 +msgid "Analogous to :c:type:`PyDictItems_Type` for ordered dictionaries." +msgstr "等同于针对有序字典的 :c:type:`PyDictItems_Type`。" + +#: ../../c-api/dict.rst:632 +msgid "Return a new empty ordered dictionary, or ``NULL`` on failure." +msgstr "返回一个新的空有序字典,或在失败时返回 ``NULL``。" + +#: ../../c-api/dict.rst:634 +msgid "This is analogous to :c:func:`PyDict_New`." +msgstr "这等同于 :c:func:`PyDict_New`。" + +#: ../../c-api/dict.rst:639 +msgid "" +"Insert *value* into the ordered dictionary *od* with a key of *key*. Return " +"``0`` on success or ``-1`` with an exception set on failure." +msgstr "" +"将 *value* 插入到有序字典 *od* 并将键设为 *key*。成功时返回 ``0`` 或在失败时返回 ``-1`` 并设置一个异常。" + +#: ../../c-api/dict.rst:642 +msgid "This is analogous to :c:func:`PyDict_SetItem`." +msgstr "这等同于 :c:func:`PyDict_SetItem`。" + +#: ../../c-api/dict.rst:647 +msgid "" +"Remove the entry in the ordered dictionary *od* with key *key*. Return ``0``" +" on success or ``-1`` with an exception set on failure." +msgstr "移除有序字典 *od* 中键为 *key* 的条目。成功时返回 ``0`` 或在失败时返回 ``-1`` 并设置一个异常。" + +#: ../../c-api/dict.rst:650 +msgid "This is analogous to :c:func:`PyDict_DelItem`." +msgstr "这等同于 :c:func:`PyDict_DelItem`。" + +#: ../../c-api/dict.rst:653 +msgid "These are :term:`soft deprecated` aliases to ``PyDict`` APIs:" +msgstr "这些是已被设为 :term:`soft deprecated` 状态的 ``PyDict`` API 的别名:" + +#: ../../c-api/dict.rst:660 +msgid "``PyODict``" +msgstr "``PyODict``" + +#: ../../c-api/dict.rst:661 +msgid "``PyDict``" +msgstr "``PyDict``" + +#: ../../c-api/dict.rst:663 +msgid ":c:func:`PyDict_GetItem`" +msgstr ":c:func:`PyDict_GetItem`" + +#: ../../c-api/dict.rst:665 +msgid ":c:func:`PyDict_GetItemWithError`" +msgstr ":c:func:`PyDict_GetItemWithError`" + +#: ../../c-api/dict.rst:667 +msgid ":c:func:`PyDict_GetItemString`" +msgstr ":c:func:`PyDict_GetItemString`" + +#: ../../c-api/dict.rst:669 +msgid ":c:func:`PyDict_Contains`" +msgstr ":c:func:`PyDict_Contains`" + +#: ../../c-api/dict.rst:671 +msgid ":c:func:`PyDict_Size`" +msgstr ":c:func:`PyDict_Size`" + +#: ../../c-api/dict.rst:673 +msgid ":c:func:`PyDict_GET_SIZE`" +msgstr ":c:func:`PyDict_GET_SIZE`" + +#: ../../c-api/dict.rst:8 +msgid "object" +msgstr "object -- 对象" + +#: ../../c-api/dict.rst:8 +msgid "dictionary" +msgstr "dictionary -- 字典" + +#: ../../c-api/dict.rst:312 +msgid "built-in function" +msgstr "内置函数" + +#: ../../c-api/dict.rst:312 +msgid "len" +msgstr "len" diff --git a/c-api/exceptions.po b/c-api/exceptions.po new file mode 100644 index 0000000000..a52ea7c79f --- /dev/null +++ b/c-api/exceptions.po @@ -0,0 +1,1821 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-19 15:34+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/exceptions.rst:8 +msgid "Exception Handling" +msgstr "异常处理" + +#: ../../c-api/exceptions.rst:10 +msgid "" +"The functions described in this chapter will let you handle and raise Python" +" exceptions. It is important to understand some of the basics of Python " +"exception handling. It works somewhat like the POSIX :c:data:`errno` " +"variable: there is a global indicator (per thread) of the last error that " +"occurred. Most C API functions don't clear this on success, but will set it" +" to indicate the cause of the error on failure. Most C API functions also " +"return an error indicator, usually ``NULL`` if they are supposed to return a" +" pointer, or ``-1`` if they return an integer (exception: the ``PyArg_*`` " +"functions return ``1`` for success and ``0`` for failure)." +msgstr "" +"本章描述的函数将让你处理和触发 Python 异常。了解一些 Python 异常处理的基础知识是很重要的。它的工作原理有点像 POSIX " +":c:data:`errno` 变量:(每个线程) 有一个最近发生的错误的全局指示器。大多数 C API 函数在成功执行时将不理会它。大多数 C API" +" 函数也会返回一个错误指示器,如果它们应当返回一个指针则会返回 ``NULL``,或者如果它们应当返回一个整数则会返回 ``-1`` (例外情况: " +"``PyArg_*`` 函数返回 ``1`` 表示成功而 ``0`` 表示失败)。" + +#: ../../c-api/exceptions.rst:20 +msgid "" +"Concretely, the error indicator consists of three object pointers: the " +"exception's type, the exception's value, and the traceback object. Any of " +"those pointers can be ``NULL`` if non-set (although some combinations are " +"forbidden, for example you can't have a non-``NULL`` traceback if the " +"exception type is ``NULL``)." +msgstr "" +"具体地说,错误指示器由三个对象指针组成:异常的类型,异常的值,和回溯对象。如果没有错误被设置,这些指针都可以是 ``NULL`` " +"(尽管一些组合是禁止的,例如,如果异常类型是 ``NULL``,你不能有一个非 ``NULL`` 的回溯)。" + +#: ../../c-api/exceptions.rst:26 +msgid "" +"When a function must fail because some function it called failed, it " +"generally doesn't set the error indicator; the function it called already " +"set it. It is responsible for either handling the error and clearing the " +"exception or returning after cleaning up any resources it holds (such as " +"object references or memory allocations); it should *not* continue normally " +"if it is not prepared to handle the error. If returning due to an error, it" +" is important to indicate to the caller that an error has been set. If the " +"error is not handled or carefully propagated, additional calls into the " +"Python/C API may not behave as intended and may fail in mysterious ways." +msgstr "" +"当一个函数由于它调用的某个函数失败而必须失败时,通常不会设置错误指示器;它调用的那个函数已经设置了它。而它负责处理错误和清理异常,或在清除其拥有的所有资源后返回(如对象引用或内存分配)。如果不准备处理异常,则" +" *不* 应该正常地继续。如果是由于一个错误返回,那么一定要向调用者表明已经设置了错误。如果错误没有得到处理或小心传播,对 Python/C API " +"的其它调用可能不会有预期的行为,并且可能会以某种神秘的方式失败。" + +#: ../../c-api/exceptions.rst:37 +msgid "" +"The error indicator is **not** the result of :func:`sys.exc_info`. The " +"former corresponds to an exception that is not yet caught (and is therefore " +"still propagating), while the latter returns an exception after it is caught" +" (and has therefore stopped propagating)." +msgstr "" +"错误指示器 **不是** :func:`sys.exc_info` 的执行结果。 " +"前者对应于尚未捕获(因而仍在传播)的异常,而后者会在异常被捕获之后(因而已停止传播)返回它。" + +#: ../../c-api/exceptions.rst:44 +msgid "Printing and clearing" +msgstr "打印和清理" + +#: ../../c-api/exceptions.rst:49 +msgid "" +"Clear the error indicator. If the error indicator is not set, there is no " +"effect." +msgstr "清除错误指示器。如果没有设置错误指示器,则不会有作用。" + +#: ../../c-api/exceptions.rst:55 +msgid "" +"Print a standard traceback to ``sys.stderr`` and clear the error indicator. " +"**Unless** the error is a ``SystemExit``, in that case no traceback is " +"printed and the Python process will exit with the error code specified by " +"the ``SystemExit`` instance." +msgstr "" +"将标准回溯打印到 ``sys.stderr`` 并清除错误指示器。**除非** 错误是 ``SystemExit``,这种情况下不会打印回溯,且 " +"Python 进程会退出,并显示 ``SystemExit`` 实例指定的错误代码。" + +#: ../../c-api/exceptions.rst:60 +msgid "" +"Call this function **only** when the error indicator is set. Otherwise it " +"will cause a fatal error!" +msgstr "只有在错误指示器被设置时才需要调用这个函数,否则这会导致致命错误!" + +#: ../../c-api/exceptions.rst:63 +msgid "" +"If *set_sys_last_vars* is nonzero, the variable :data:`sys.last_exc` is set " +"to the printed exception. For backwards compatibility, the deprecated " +"variables :data:`sys.last_type`, :data:`sys.last_value` and " +":data:`sys.last_traceback` are also set to the type, value and traceback of " +"this exception, respectively." +msgstr "" +"如果 *set_sys_last_vars* 为非零值,则变量 :data:`sys.last_exc` 将被设为要打印的异常。 " +"出于向下兼容性考虑,已弃用的变量 :data:`sys.last_type`, :data:`sys.last_value` 和 " +":data:`sys.last_traceback` 也会被分别设为该异常的类型,值和回溯。" + +#: ../../c-api/exceptions.rst:69 +msgid "The setting of :data:`sys.last_exc` was added." +msgstr "增加了对 :data:`sys.last_exc` 的设置。" + +#: ../../c-api/exceptions.rst:75 +msgid "Alias for ``PyErr_PrintEx(1)``." +msgstr "``PyErr_PrintEx(1)`` 的别名。" + +#: ../../c-api/exceptions.rst:80 +msgid "" +"Call :func:`sys.unraisablehook` using the current exception and *obj* " +"argument." +msgstr "使用当前异常和 *obj* 参数调用 :func:`sys.unraisablehook`。" + +#: ../../c-api/exceptions.rst:83 +msgid "" +"This utility function prints a warning message to ``sys.stderr`` when an " +"exception has been set but it is impossible for the interpreter to actually " +"raise the exception. It is used, for example, when an exception occurs in " +"an :meth:`~object.__del__` method." +msgstr "" +"当异常已被设置但解释器不可能实际引发该异常时,这个工具函数会向 ``sys.stderr`` 打印一条警告消息。例如,当异常发生在 " +":meth:`~object.__del__` 方法中时就会使用该函数。" + +#: ../../c-api/exceptions.rst:88 +msgid "" +"The function is called with a single argument *obj* that identifies the " +"context in which the unraisable exception occurred. If possible, the repr of" +" *obj* will be printed in the warning message. If *obj* is ``NULL``, only " +"the traceback is printed." +msgstr "" +"该函数调用时将传入单个参数 *obj*,它标识发生不可引发的异常所在的上下文。如果可能,*obj* 的表示形式将打印在警告消息中。如果 *obj* 为 " +"``NULL``,将只打印回溯。" + +#: ../../c-api/exceptions.rst:93 +msgid "An exception must be set when calling this function." +msgstr "调用此函数时必须设置一个异常。" + +#: ../../c-api/exceptions.rst:95 +msgid "Print a traceback. Print only traceback if *obj* is ``NULL``." +msgstr "打印回溯信息。如果 *obj* 为 ``NULL`` 将只打印回溯。" + +#: ../../c-api/exceptions.rst:98 +msgid "Use :func:`sys.unraisablehook`." +msgstr "使用 :func:`sys.unraisablehook`。" + +#: ../../c-api/exceptions.rst:104 +msgid "" +"Similar to :c:func:`PyErr_WriteUnraisable`, but the *format* and subsequent " +"parameters help format the warning message; they have the same meaning and " +"values as in :c:func:`PyUnicode_FromFormat`. ``PyErr_WriteUnraisable(obj)`` " +"is roughly equivalent to ``PyErr_FormatUnraisable(\"Exception ignored in: " +"%R\", obj)``. If *format* is ``NULL``, only the traceback is printed." +msgstr "" +"与 :c:func:`PyErr_WriteUnraisable` 类似,但 *format* 和后续的形参有助于格式化警告消息;它们的含义和值与 " +":c:func:`PyUnicode_FromFormat` 中的相同。``PyErr_WriteUnraisable(obj)`` 大致等价于 " +"``PyErr_FormatUnraisable(\"Exception ignored in: %R\", obj)``。如果 *format* 为 " +"``NULL``,则只打印回溯信息。" + +#: ../../c-api/exceptions.rst:116 +msgid "" +"Print the standard traceback display of ``exc`` to ``sys.stderr``, including" +" chained exceptions and notes." +msgstr "将 ``exc`` 的标准回溯显示打印到 ``sys.stderr``,包括链式异常和注释。" + +#: ../../c-api/exceptions.rst:123 +msgid "Raising exceptions" +msgstr "抛出异常" + +#: ../../c-api/exceptions.rst:125 +msgid "" +"These functions help you set the current thread's error indicator. For " +"convenience, some of these functions will always return a ``NULL`` pointer " +"for use in a ``return`` statement." +msgstr "这些函数可帮助你设置当前线程的错误指示器。为了方便起见,一些函数将始终返回 ``NULL`` 指针,以便用于 ``return`` 语句。" + +#: ../../c-api/exceptions.rst:132 +msgid "" +"This is the most common way to set the error indicator. The first argument " +"specifies the exception type; it is normally one of the standard exceptions," +" e.g. :c:data:`PyExc_RuntimeError`. You need not create a new :term:`strong" +" reference` to it (e.g. with :c:func:`Py_INCREF`). The second argument is an" +" error message; it is decoded from ``'utf-8'``." +msgstr "" +"这是设置错误指示器最常用的方式。第一个参数指定异常类型;它通常为某个标准异常,例如 :c:data:`PyExc_RuntimeError`。 " +"你无需为其创建新的 :term:`strong reference` (例如使用 :c:func:`Py_INCREF`)。 " +"第二个参数是一条错误消息;它是用 ``'utf-8'`` 解码的。" + +#: ../../c-api/exceptions.rst:141 +msgid "" +"This function is similar to :c:func:`PyErr_SetString` but lets you specify " +"an arbitrary Python object for the \"value\" of the exception." +msgstr "此函数类似于 :c:func:`PyErr_SetString`,但是允许你为异常的“值”指定任意一个 Python 对象。" + +#: ../../c-api/exceptions.rst:147 +msgid "" +"This function sets the error indicator and returns ``NULL``. *exception* " +"should be a Python exception class. The *format* and subsequent parameters " +"help format the error message; they have the same meaning and values as in " +":c:func:`PyUnicode_FromFormat`. *format* is an ASCII-encoded string." +msgstr "" +"这个函数设置了一个错误指示器并且返回了 ``NULL``,*exception* 应当是一个 Python 中的异常类。*format* " +"和随后的形参会帮助格式化这个错误的信息;它们与 :c:func:`PyUnicode_FromFormat` 有着相同的含义和值。*format* " +"是一个 ASCII 编码的字符串。" + +#: ../../c-api/exceptions.rst:156 +msgid "" +"Same as :c:func:`PyErr_Format`, but taking a :c:type:`va_list` argument " +"rather than a variable number of arguments." +msgstr "" +"和 :c:func:`PyErr_Format` 相同,但它接受一个 :c:type:`va_list` 类型的参数而不是可变数量的参数集。" + +#: ../../c-api/exceptions.rst:164 +msgid "This is a shorthand for ``PyErr_SetObject(type, Py_None)``." +msgstr "这是 ``PyErr_SetObject(type, Py_None)`` 的简写。" + +#: ../../c-api/exceptions.rst:169 +msgid "" +"This is a shorthand for ``PyErr_SetString(PyExc_TypeError, message)``, where" +" *message* indicates that a built-in operation was invoked with an illegal " +"argument. It is mostly for internal use." +msgstr "" +"这是 ``PyErr_SetString(PyExc_TypeError, message)`` 的简写,其中 *message* " +"指出使用了非法参数调用内置操作。它主要用于内部使用。" + +#: ../../c-api/exceptions.rst:176 +msgid "" +"This is a shorthand for ``PyErr_SetNone(PyExc_MemoryError)``; it returns " +"``NULL`` so an object allocation function can write ``return " +"PyErr_NoMemory();`` when it runs out of memory." +msgstr "" +"这是 ``PyErr_SetNone(PyExc_MemoryError)`` 的简写;它返回 ``NULL``,以便当内存耗尽时,对象分配函数可以写 " +"``return PyErr_NoMemory();`` 这一语句。" + +#: ../../c-api/exceptions.rst:185 +msgid "" +"This is a convenience function to raise an exception when a C library " +"function has returned an error and set the C variable :c:data:`errno`. It " +"constructs a tuple object whose first item is the integer :c:data:`errno` " +"value and whose second item is the corresponding error message (gotten from " +":c:func:`!strerror`), and then calls ``PyErr_SetObject(type, object)``. On " +"Unix, when the :c:data:`errno` value is :c:macro:`!EINTR`, indicating an " +"interrupted system call, this calls :c:func:`PyErr_CheckSignals`, and if " +"that set the error indicator, leaves it set to that. The function always " +"returns ``NULL``, so a wrapper function around a system call can write " +"``return PyErr_SetFromErrno(type);`` when the system call returns an error." +msgstr "" +"这是一个便捷函数,当在 C 库函数返回错误并设置 C 变量 :c:data:`errno` 时它会引发一个异常。它构造了一个元组对象,其第一项是整数值 " +":c:data:`errno` 而第二项是对应的错误信息(从 :c:func:`!strerror` 获取),然后调用 " +"``PyErr_SetObject(type, object)``。在 Unix 上,当 :c:data:`errno` 的值为 " +":c:macro:`!EINTR` 时,表示有一个中断的系统调用,这将会调用 " +":c:func:`PyErr_CheckSignals`,如果它设置了错误指示符,则让其保持该设置。该函数总是返回 " +"``NULL``,因此当系统调用返回错误时该系统调用的包装函数可以写入 ``return PyErr_SetFromErrno(type);``。" + +#: ../../c-api/exceptions.rst:199 +msgid "" +"Similar to :c:func:`PyErr_SetFromErrno`, with the additional behavior that " +"if *filenameObject* is not ``NULL``, it is passed to the constructor of " +"*type* as a third parameter. In the case of :exc:`OSError` exception, this " +"is used to define the :attr:`!filename` attribute of the exception instance." +msgstr "" +"与 :c:func:`PyErr_SetFromErrno` 类似,但如果 *filenameObject* 不为 " +"``NULL``,它将作为第三个参数传递给 *type* 的构造函数。在 :exc:`OSError` 异常的情况下,它将被用于定义异常实例的 " +":attr:`!filename` 属性。" + +#: ../../c-api/exceptions.rst:208 +msgid "" +"Similar to :c:func:`PyErr_SetFromErrnoWithFilenameObject`, but takes a " +"second filename object, for raising errors when a function that takes two " +"filenames fails." +msgstr "" +"类似于 :c:func:`PyErr_SetFromErrnoWithFilenameObject`,但接受第二个 filename " +"对象,用于当一个接受两个 filename 的函数失败时触发错误。" + +#: ../../c-api/exceptions.rst:217 +msgid "" +"Similar to :c:func:`PyErr_SetFromErrnoWithFilenameObject`, but the filename " +"is given as a C string. *filename* is decoded from the :term:`filesystem " +"encoding and error handler`." +msgstr "" +"类似于 :c:func:`PyErr_SetFromErrnoWithFilenameObject`,但文件名以 C 字符串形式给出。 " +"*filename* 是用 :term:`filesystem encoding and error handler` 解码的。" + +#: ../../c-api/exceptions.rst:224 +msgid "" +"This is a convenience function to raise :exc:`OSError`. If called with " +"*ierr* of ``0``, the error code returned by a call to " +":c:func:`!GetLastError` is used instead. It calls the Win32 function " +":c:func:`!FormatMessage` to retrieve the Windows description of error code " +"given by *ierr* or :c:func:`!GetLastError`, then it constructs a " +":exc:`OSError` object with the :attr:`~OSError.winerror` attribute set to " +"the error code, the :attr:`~OSError.strerror` attribute set to the " +"corresponding error message (gotten from :c:func:`!FormatMessage`), and then" +" calls ``PyErr_SetObject(PyExc_OSError, object)``. This function always " +"returns ``NULL``." +msgstr "" +"这是一个用于引发 :exc:`OSError` 的便捷函数。如果调用时传入的 *ierr* 值为 ``0``,则会改用对 " +":c:func:`!GetLastError` 的调用所返回的错误代码。它将调用 Win32 函数 :c:func:`!FormatMessage` " +"来获取 *ierr* 或 :c:func:`!GetLastError` 所给出的错误代码的 Windows 描述,然后构造一个 " +":exc:`OSError` 对象,其中 :attr:`~OSError.winerror` " +"属性将设为该错误代码,:attr:`~OSError.strerror` 属性将设为相应的错误消息(从 :c:func:`!FormatMessage`" +" 获得),然后再调用 ``PyErr_SetObject(PyExc_OSError, object)``。该函数将总是返回 ``NULL``。" + +#: ../../c-api/exceptions.rst:234 ../../c-api/exceptions.rst:242 +#: ../../c-api/exceptions.rst:253 ../../c-api/exceptions.rst:263 +#: ../../c-api/exceptions.rst:271 ../../c-api/exceptions.rst:281 +msgid "Availability" +msgstr "Availability" + +#: ../../c-api/exceptions.rst:239 +msgid "" +"Similar to :c:func:`PyErr_SetFromWindowsErr`, with an additional parameter " +"specifying the exception type to be raised." +msgstr "类似于 :c:func:`PyErr_SetFromWindowsErr`,额外的参数指定要触发的异常类型。" + +#: ../../c-api/exceptions.rst:247 +msgid "" +"Similar to :c:func:`PyErr_SetFromWindowsErr`, with the additional behavior " +"that if *filename* is not ``NULL``, it is decoded from the filesystem " +"encoding (:func:`os.fsdecode`) and passed to the constructor of " +":exc:`OSError` as a third parameter to be used to define the " +":attr:`!filename` attribute of the exception instance." +msgstr "" +"与 :c:func:`PyErr_SetFromWindowsErr` 类似,额外的不同点是如果 *filename* 不为 ``NULL`` " +",则会使用文件系统编码格式 (:func:`os.fsdecode`) 进行解码并作为第三个参数传递给 :exc:`OSError` " +"的构造器用于定义异常实例的 :attr:`!filename` 属性。" + +#: ../../c-api/exceptions.rst:258 +msgid "" +"Similar to :c:func:`PyErr_SetExcFromWindowsErr`, with the additional " +"behavior that if *filename* is not ``NULL``, it is passed to the constructor" +" of :exc:`OSError` as a third parameter to be used to define the " +":attr:`!filename` attribute of the exception instance." +msgstr "" +"与 :c:func:`PyErr_SetExcFromWindowsErr` 类似,额外的不同点是如果 *filename* 不为 " +"``NULL``,它将作为第三个参数传递给 :exc:`OSError` 的构造器用于定义异常实例的 :attr:`!filename` 属性。" + +#: ../../c-api/exceptions.rst:268 +msgid "" +"Similar to :c:func:`PyErr_SetExcFromWindowsErrWithFilenameObject`, but " +"accepts a second filename object." +msgstr "" +"类似于 :c:func:`PyErr_SetExcFromWindowsErrWithFilenameObject`,但是接受第二个 filename " +"对象。" + +#: ../../c-api/exceptions.rst:278 +msgid "" +"Similar to :c:func:`PyErr_SetFromWindowsErrWithFilename`, with an additional" +" parameter specifying the exception type to be raised." +msgstr "类似于 :c:func:`PyErr_SetFromWindowsErrWithFilename`,额外参数指定要触发的异常类型。" + +#: ../../c-api/exceptions.rst:286 +msgid "" +"This is a convenience function to raise :exc:`ImportError`. *msg* will be " +"set as the exception's message string. *name* and *path*, both of which can " +"be ``NULL``, will be set as the :exc:`ImportError`'s respective ``name`` and" +" ``path`` attributes." +msgstr "" +"这是引发 :exc:`ImportError` 的便捷函数。*msg* 将被设为异常的消息字符串。*name* 和 *path* (都可以为 " +"``NULL``),将分别被用于设置 :exc:`ImportError` 的 ``name`` 和 ``path`` 属性。" + +#: ../../c-api/exceptions.rst:296 +msgid "" +"Much like :c:func:`PyErr_SetImportError` but this function allows for " +"specifying a subclass of :exc:`ImportError` to raise." +msgstr "" +"和 :c:func:`PyErr_SetImportError` 很类似,但这个函数允许指定一个 :exc:`ImportError` 的子类来触发。" + +#: ../../c-api/exceptions.rst:304 +msgid "" +"Set file, line, and offset information for the current exception. If the " +"current exception is not a :exc:`SyntaxError`, then it sets additional " +"attributes, which make the exception printing subsystem think the exception " +"is a :exc:`SyntaxError`." +msgstr "" +"设置当前异常的文件,行和偏移信息。如果当前异常不是 :exc:`SyntaxError`,则它设置额外的属性,使异常打印子系统认为异常是 " +":exc:`SyntaxError` 异常。" + +#: ../../c-api/exceptions.rst:314 +msgid "" +"Similar to :c:func:`PyErr_SyntaxLocationObject`, but also sets the " +"*end_lineno* and *end_col_offset* information for the current exception." +msgstr "" +"类似于 :c:func:`PyErr_SyntaxLocationObject`,但还会为当前异常设置 *end_lineno* 和 " +"*end_col_offset* 信息。" + +#: ../../c-api/exceptions.rst:322 +msgid "" +"Like :c:func:`PyErr_SyntaxLocationObject`, but *filename* is a byte string " +"decoded from the :term:`filesystem encoding and error handler`." +msgstr "" +"类似于 :c:func:`PyErr_SyntaxLocationObject`,但 *filename* 是用 :term:`filesystem " +"encoding and error handler` 解码的字节串。" + +#: ../../c-api/exceptions.rst:330 +msgid "" +"Like :c:func:`PyErr_SyntaxLocationEx`, but the *col_offset* parameter is " +"omitted." +msgstr "类似于 :c:func:`PyErr_SyntaxLocationEx`,但省略了 *col_offset* 形参。" + +#: ../../c-api/exceptions.rst:336 +msgid "" +"This is a shorthand for ``PyErr_SetString(PyExc_SystemError, message)``, " +"where *message* indicates that an internal operation (e.g. a Python/C API " +"function) was invoked with an illegal argument. It is mostly for internal " +"use." +msgstr "" +"这是 ``PyErr_SetString(PyExc_SystemError, message)`` 的缩写,其中 *message* " +"表示使用了非法参数调用内部操作(例如,Python/C API 函数)。它主要用于内部使用。" + +#: ../../c-api/exceptions.rst:344 +msgid "" +"Get the source line in *filename* at line *lineno*. *filename* should be a " +"Python :class:`str` object." +msgstr "" +"获取 *filename* 中位于第 *lineno* 行的源代码行。 *filename* 应为一个 Python :class:`str` 对象。" + +#: ../../c-api/exceptions.rst:347 +msgid "" +"On success, this function returns a Python string object with the found " +"line. On failure, this function returns ``NULL`` without an exception set." +msgstr "成功时,此函数将返回内容为所找到行的 Python 字符串。失败时,此函数将返回 ``NULL`` 且不设置任何异常。" + +#: ../../c-api/exceptions.rst:353 +msgid "" +"Similar to :c:func:`PyErr_ProgramTextObject`, but *filename* is a " +":c:expr:`const char *`, which is decoded with the :term:`filesystem encoding" +" and error handler`, instead of a Python object reference." +msgstr "" +"类似于 :c:func:`PyErr_ProgramTextObject`,但 *filename* 是一个 :c:expr:`const char " +"*`,它使用 :term:`filesystem encoding and error handler` 来解码,而不是一个 Python 对象引用。" + +#: ../../c-api/exceptions.rst:360 +msgid "Issuing warnings" +msgstr "发出警告" + +#: ../../c-api/exceptions.rst:362 +msgid "" +"Use these functions to issue warnings from C code. They mirror similar " +"functions exported by the Python :mod:`warnings` module. They normally " +"print a warning message to *sys.stderr*; however, it is also possible that " +"the user has specified that warnings are to be turned into errors, and in " +"that case they will raise an exception. It is also possible that the " +"functions raise an exception because of a problem with the warning " +"machinery. The return value is ``0`` if no exception is raised, or ``-1`` if" +" an exception is raised. (It is not possible to determine whether a warning" +" message is actually printed, nor what the reason is for the exception; this" +" is intentional.) If an exception is raised, the caller should do its " +"normal exception handling (for example, :c:func:`Py_DECREF` owned references" +" and return an error value)." +msgstr "" +"这些函数可以从 C 代码中发出警告。它们仿照了由 Python 模块 :mod:`warnings` 导出的那些函数。它们通常向 " +"*sys.stderr* " +"打印一条警告信息;当然,用户也有可能已经指定将警告转换为错误,在这种情况下,它们将触发异常。也有可能由于警告机制出现问题,使得函数触发异常。如果没有触发异常,返回值为" +" ``0``;如果触发异常,返回值为 " +"``-1``。(无法确定是否实际打印了警告信息,也无法确定异常触发的原因。这是故意为之)。如果触发了异常,调用者应该进行正常的异常处理(例如,:c:func:`Py_DECREF`" +" 持有引用并返回一个错误值)。" + +#: ../../c-api/exceptions.rst:377 +msgid "" +"Issue a warning message. The *category* argument is a warning category (see" +" below) or ``NULL``; the *message* argument is a UTF-8 encoded string. " +"*stack_level* is a positive number giving a number of stack frames; the " +"warning will be issued from the currently executing line of code in that " +"stack frame. A *stack_level* of 1 is the function calling " +":c:func:`PyErr_WarnEx`, 2 is the function above that, and so forth." +msgstr "" +"发出一个警告信息。参数 *category* 是一个警告类别(见下面)或 ``NULL``;*message* 是一个 UTF-8 编码的字符串。 " +"*stack_level* 是一个给出栈帧数量的正数;警告将从该栈帧中当前正在执行的代码行发出。 *stack_level* 为 1 的是调用 " +":c:func:`PyErr_WarnEx` 的函数,2 是在此之上的函数,以此类推。" + +#: ../../c-api/exceptions.rst:384 +msgid "" +"Warning categories must be subclasses of :c:data:`PyExc_Warning`; " +":c:data:`PyExc_Warning` is a subclass of :c:data:`PyExc_Exception`; the " +"default warning category is :c:data:`PyExc_RuntimeWarning`. The standard " +"Python warning categories are available as global variables whose names are " +"enumerated at :ref:`standardwarningcategories`." +msgstr "" +"警告类别必须是 :c:data:`PyExc_Warning` 的子类, :c:data:`PyExc_Warning` 是 " +":c:data:`PyExc_Exception` 的子类;默认警告类别是 :c:data:`PyExc_RuntimeWarning`。标准 " +"Python 警告类别作为全局变量可用,所有其名称见 :ref:`standardwarningcategories`。" + +#: ../../c-api/exceptions.rst:390 +msgid "" +"For information about warning control, see the documentation for the " +":mod:`warnings` module and the :option:`-W` option in the command line " +"documentation. There is no C API for warning control." +msgstr "" +"有关警告控制的信息,参见模块文档 :mod:`warnings` 和命令行文档中的 :option:`-W` 选项。没有用于警告控制的 C API。" + +#: ../../c-api/exceptions.rst:397 +msgid "" +"Issue a warning message with explicit control over all warning attributes. " +"This is a straightforward wrapper around the Python function " +":func:`warnings.warn_explicit`; see there for more information. The " +"*module* and *registry* arguments may be set to ``NULL`` to get the default " +"effect described there." +msgstr "" +"发出一个对所有警告属性进行显式控制的警告消息。这是位于 Python 函数 :func:`warnings.warn_explicit` " +"外层的直接包装;请查看其文档了解详情。 *module* 和 *registry* 参数可被设为 ``NULL`` 以得到相关文档所描述的默认效果。" + +#: ../../c-api/exceptions.rst:408 +msgid "" +"Similar to :c:func:`PyErr_WarnExplicitObject` except that *message* and " +"*module* are UTF-8 encoded strings, and *filename* is decoded from the " +":term:`filesystem encoding and error handler`." +msgstr "" +"类似于 :c:func:`PyErr_WarnExplicitObject` 不过 *message* 和 *module* 是 UTF-8 " +"编码的字符串,而 *filename* 是由 :term:`filesystem encoding and error handler` 解码的。" + +#: ../../c-api/exceptions.rst:415 +msgid "" +"Function similar to :c:func:`PyErr_WarnEx`, but uses " +":c:func:`PyUnicode_FromFormat` to format the warning message. *format* is " +"an ASCII-encoded string." +msgstr "" + +#: ../../c-api/exceptions.rst:424 +msgid "" +"Similar to :c:func:`PyErr_WarnExplicit`, but uses " +":c:func:`PyUnicode_FromFormat` to format the warning message. *format* is an" +" ASCII-encoded string." +msgstr "" +"类似于 :c:func:`PyErr_WarnExplicit`,但使用 :c:func:`PyUnicode_FromFormat` " +"来格式化警告消息。 *format* 是使用 ASCII 编码的字符串。" + +#: ../../c-api/exceptions.rst:433 +msgid "" +"Function similar to :c:func:`PyErr_WarnFormat`, but *category* is " +":exc:`ResourceWarning` and it passes *source* to " +":class:`!warnings.WarningMessage`." +msgstr "" +"类似于 :c:func:`PyErr_WarnFormat` 的函数,但 *category* 是 :exc:`ResourceWarning` " +"并且它会将 *source* 传给 :class:`!warnings.WarningMessage`。" + +#: ../../c-api/exceptions.rst:440 +msgid "Querying the error indicator" +msgstr "查询错误指示器" + +#: ../../c-api/exceptions.rst:444 +msgid "" +"Test whether the error indicator is set. If set, return the exception " +"*type* (the first argument to the last call to one of the ``PyErr_Set*`` " +"functions or to :c:func:`PyErr_Restore`). If not set, return ``NULL``. You" +" do not own a reference to the return value, so you do not need to " +":c:func:`Py_DECREF` it." +msgstr "" +"测试是否设置了错误指示器。如已设置,则返回异常 *type* (传给对某个 ``PyErr_Set*`` 函数或 " +":c:func:`PyErr_Restore` 的最后一次调用的第一个参数)。如未设置,则返回 ``NULL``。 " +"你并不会拥有对返回值的引用,因此你不需要对它执行 :c:func:`Py_DECREF`。" + +#: ../../c-api/exceptions.rst:450 +msgid "The caller must have an :term:`attached thread state`." +msgstr "调用方必须有已附加的线程状态 :term:`attached thread state`。" + +#: ../../c-api/exceptions.rst:454 +msgid "" +"Do not compare the return value to a specific exception; use " +":c:func:`PyErr_ExceptionMatches` instead, shown below. (The comparison " +"could easily fail since the exception may be an instance instead of a class," +" in the case of a class exception, or it may be a subclass of the expected " +"exception.)" +msgstr "" +"不要将返回值与特定的异常进行比较;请改为使用 :c:func:`PyErr_ExceptionMatches`,如下所示。 " +"(比较很容易失败因为对于类异常来说,异常可能是一个实例而不是类,或者它可能是预期的异常的一个子类。)" + +#: ../../c-api/exceptions.rst:462 +msgid "" +"Equivalent to ``PyErr_GivenExceptionMatches(PyErr_Occurred(), exc)``. This " +"should only be called when an exception is actually set; a memory access " +"violation will occur if no exception has been raised." +msgstr "" +"等价于 ``PyErr_GivenExceptionMatches(PyErr_Occurred(), exc)``。 " +"此函数应当只在实际设置了异常时才被调用;如果没有任何异常被引发则将发生非法内存访问。" + +#: ../../c-api/exceptions.rst:469 +msgid "" +"Return true if the *given* exception matches the exception type in *exc*. " +"If *exc* is a class object, this also returns true when *given* is an " +"instance of a subclass. If *exc* is a tuple, all exception types in the " +"tuple (and recursively in subtuples) are searched for a match." +msgstr "" +"如果 *given* 异常与 *exc* 中的异常类型相匹配则返回真值。如果 *exc* 是一个类对象,则当 *given* " +"是一个子类的实例时也将返回真值。如果 *exc* 是一个元组,则该元组(以及递归的子元组)中的所有异常类型都将被搜索进行匹配。" + +#: ../../c-api/exceptions.rst:477 +msgid "" +"Return the exception currently being raised, clearing the error indicator at" +" the same time. Return ``NULL`` if the error indicator is not set." +msgstr "返回当前被引发的异常,同时清除错误指示器。如果错误指示器尚未设置则返回 ``NULL``。" + +#: ../../c-api/exceptions.rst:480 +msgid "" +"This function is used by code that needs to catch exceptions, or code that " +"needs to save and restore the error indicator temporarily." +msgstr "此函数会被需要捕获异常的代码,或需要临时保存和恢复错误指示器的代码所使用。" + +#: ../../c-api/exceptions.rst:483 ../../c-api/exceptions.rst:528 +msgid "For example::" +msgstr "例如:" + +#: ../../c-api/exceptions.rst:485 +msgid "" +"{\n" +" PyObject *exc = PyErr_GetRaisedException();\n" +"\n" +" /* ... code that might produce other errors ... */\n" +"\n" +" PyErr_SetRaisedException(exc);\n" +"}" +msgstr "" +"{\n" +" PyObject *exc = PyErr_GetRaisedException();\n" +"\n" +" /* ... 可能产生其他错误的代码 ... */\n" +"\n" +" PyErr_SetRaisedException(exc);\n" +"}" + +#: ../../c-api/exceptions.rst:493 +msgid "" +":c:func:`PyErr_GetHandledException`, to save the exception currently being " +"handled." +msgstr ":c:func:`PyErr_GetHandledException`,保存当前正在处理的异常。" + +#: ../../c-api/exceptions.rst:501 +msgid "" +"Set *exc* as the exception currently being raised, clearing the existing " +"exception if one is set. If *exc* is ``NULL``, just clear the existing " +"exception." +msgstr "" + +#: ../../c-api/exceptions.rst:505 +msgid "*exc* must be a valid exception or ``NULL``." +msgstr "" + +#: ../../c-api/exceptions.rst:507 +msgid "This call \":term:`steals `\" a reference to *exc*." +msgstr "" + +#: ../../c-api/exceptions.rst:516 +msgid "Use :c:func:`PyErr_GetRaisedException` instead." +msgstr "使用 :c:func:`PyErr_GetRaisedException` 代替。" + +#: ../../c-api/exceptions.rst:518 +msgid "" +"Retrieve the error indicator into three variables whose addresses are " +"passed. If the error indicator is not set, set all three variables to " +"``NULL``. If it is set, it will be cleared and you own a reference to each " +"object retrieved. The value and traceback object may be ``NULL`` even when " +"the type object is not." +msgstr "" +"将错误指示符提取到三个变量中并传递其地址。如果未设置错误指示符,则将三个变量都设为 " +"``NULL``。如果已设置,则将其清除并且你将得到对所提取的每个对象的引用。值和回溯对象可以为 ``NULL`` 即使类型对象不为空。" + +#: ../../c-api/exceptions.rst:525 +msgid "" +"This function is normally only used by legacy code that needs to catch " +"exceptions or save and restore the error indicator temporarily." +msgstr "此函数通常只被需要捕获异常或临时保存和恢复错误指示符的旧式代码所使用。" + +#: ../../c-api/exceptions.rst:530 +msgid "" +"{\n" +" PyObject *type, *value, *traceback;\n" +" PyErr_Fetch(&type, &value, &traceback);\n" +"\n" +" /* ... code that might produce other errors ... */\n" +"\n" +" PyErr_Restore(type, value, traceback);\n" +"}" +msgstr "" +"{\n" +" PyObject *type, *value, *traceback;\n" +" PyErr_Fetch(&type, &value, &traceback);\n" +"\n" +" /* ... 可能产生其他错误的代码 ... */\n" +"\n" +" PyErr_Restore(type, value, traceback);\n" +"}" + +#: ../../c-api/exceptions.rst:544 +msgid "Use :c:func:`PyErr_SetRaisedException` instead." +msgstr "请改用 :c:func:`PyErr_SetRaisedException`。" + +#: ../../c-api/exceptions.rst:546 +msgid "" +"Set the error indicator from the three objects, *type*, *value*, and " +"*traceback*, clearing the existing exception if one is set. If the objects " +"are ``NULL``, the error indicator is cleared. Do not pass a ``NULL`` type " +"and non-``NULL`` value or traceback. The exception type should be a class." +" Do not pass an invalid exception type or value. (Violating these rules " +"will cause subtle problems later.) This call takes away a reference to each" +" object: you must own a reference to each object before the call and after " +"the call you no longer own these references. (If you don't understand this," +" don't use this function. I warned you.)" +msgstr "" +"根据 *type*, *value* 和 *traceback* 这三个对象设置错误指示符,如果已设置了错误指示符则先清除它。如果三个对象均为 " +"``NULL``,则清除错误指示符。请不要传入 ``NULL`` 类型和非 ``NULL`` 的值或回溯。异常类型应当是一个类。 " +"请不要传入无效的异常类型或值。 (违反这些规则将导致微妙的后继问题。) " +"此调用会带走对每个对象的引用:你必须在调用之前拥有对每个对象的引用并且在调用之后你将不再拥有这些引用。 (如果你不理解这一点,就不要使用此函数。 " +"勿谓言之不预。)" + +#: ../../c-api/exceptions.rst:560 +msgid "" +"This function is normally only used by legacy code that needs to save and " +"restore the error indicator temporarily. Use :c:func:`PyErr_Fetch` to save " +"the current error indicator." +msgstr "此函数通常只被需要临时保存和恢复错误指示符的旧代码所使用。请使用 :c:func:`PyErr_Fetch` 来保存当前的错误指示符。" + +#: ../../c-api/exceptions.rst:569 +msgid "" +"Use :c:func:`PyErr_GetRaisedException` instead, to avoid any possible de-" +"normalization." +msgstr "请改用 :c:func:`PyErr_GetRaisedException`,以避免任何可能的去正规化。" + +#: ../../c-api/exceptions.rst:572 +msgid "" +"Under certain circumstances, the values returned by :c:func:`PyErr_Fetch` " +"below can be \"unnormalized\", meaning that ``*exc`` is a class object but " +"``*val`` is not an instance of the same class. This function can be used " +"to instantiate the class in that case. If the values are already " +"normalized, nothing happens. The delayed normalization is implemented to " +"improve performance." +msgstr "" +"在特定情况下,下面 :c:func:`PyErr_Fetch` 所返回的值可以是“非正规化的”,即 ``*exc`` 是一个类对象而 ``*val`` " +"不是同一个类的实例。在这种情况下此函数可以被用来实例化类。如果值已经是正规化的,则不做任何操作。实现这种延迟正规化是为了提升性能。" + +#: ../../c-api/exceptions.rst:580 +msgid "" +"This function *does not* implicitly set the " +":attr:`~BaseException.__traceback__` attribute on the exception value. If " +"setting the traceback appropriately is desired, the following additional " +"snippet is needed::" +msgstr "" +"此函数 *不会* 隐式地在异常值上设置 :attr:`~BaseException.__traceback__` 属性。 " +"如果想要适当地设置回溯,还需要以下附加代码片段::" + +#: ../../c-api/exceptions.rst:585 +msgid "" +"if (tb != NULL) {\n" +" PyException_SetTraceback(val, tb);\n" +"}" +msgstr "" +"if (tb != NULL) {\n" +" PyException_SetTraceback(val, tb);\n" +"}" + +#: ../../c-api/exceptions.rst:592 +msgid "" +"Retrieve the active exception instance, as would be returned by " +":func:`sys.exception`. This refers to an exception that was *already " +"caught*, not to an exception that was freshly raised. Returns a new " +"reference to the exception or ``NULL``. Does not modify the interpreter's " +"exception state." +msgstr "" +"提取激活的异常实例,就如 :func:`sys.exception` 所返回的一样。这是指一个 *已被捕获* " +"的异常,而不是刚被引发的异常。返回一个指向该异常的新引用或者 ``NULL``。不会修改解释器的异常状态。" + +#: ../../c-api/exceptions.rst:599 +msgid "" +"This function is not normally used by code that wants to handle exceptions. " +"Rather, it can be used when code needs to save and restore the exception " +"state temporarily. Use :c:func:`PyErr_SetHandledException` to restore or " +"clear the exception state." +msgstr "" +"此函数通常不会被需要处理异常的代码所使用。它可被使用的场合是当代码需要临时保存并恢复异常状态的时候。请使用 " +":c:func:`PyErr_SetHandledException` 来恢复或清除异常状态。" + +#: ../../c-api/exceptions.rst:608 +msgid "" +"Set the active exception, as known from ``sys.exception()``. This refers to" +" an exception that was *already caught*, not to an exception that was " +"freshly raised. To clear the exception state, pass ``NULL``." +msgstr "" +"设置激活的异常,就是从 ``sys.exception()`` 所获得的。这是指一个 *已被捕获* 的异常,而不是刚被引发的异常。要清空异常状态,请传入" +" ``NULL``。" + +#: ../../c-api/exceptions.rst:615 +msgid "" +"This function is not normally used by code that wants to handle exceptions. " +"Rather, it can be used when code needs to save and restore the exception " +"state temporarily. Use :c:func:`PyErr_GetHandledException` to get the " +"exception state." +msgstr "" +"此函数通常不会被需要处理异常的代码所使用。它被使用的场合是在代码需要临时保存并恢复异常状态的时候。请使用 " +":c:func:`PyErr_GetHandledException` 来获取异常状态。" + +#: ../../c-api/exceptions.rst:624 +msgid "" +"Retrieve the old-style representation of the exception info, as known from " +":func:`sys.exc_info`. This refers to an exception that was *already " +"caught*, not to an exception that was freshly raised. Returns new " +"references for the three objects, any of which may be ``NULL``. Does not " +"modify the exception info state. This function is kept for backwards " +"compatibility. Prefer using :c:func:`PyErr_GetHandledException`." +msgstr "" +"提取旧式的异常信息表示形式,就是从 :func:`sys.exc_info` 所获得的。这是指一个 *已被捕获* " +"的异常,而不是刚被引发的异常。返回分别指向三个对象的新引用,其中任何一个都可以为 " +"``NULL``。不会修改异常信息的状态。此函数是为了向下兼容而保留的。更推荐使用 " +":c:func:`PyErr_GetHandledException` 函数。" + +#: ../../c-api/exceptions.rst:633 +msgid "" +"This function is not normally used by code that wants to handle exceptions. " +"Rather, it can be used when code needs to save and restore the exception " +"state temporarily. Use :c:func:`PyErr_SetExcInfo` to restore or clear the " +"exception state." +msgstr "" +"此函数通常不会被需要处理异常的代码所使用。它被使用的场合是在代码需要临时保存并恢复异常状态的时候。请使用 " +":c:func:`PyErr_SetExcInfo` 来恢复或清除异常状态。" + +#: ../../c-api/exceptions.rst:643 +msgid "" +"Set the exception info, as known from ``sys.exc_info()``. This refers to an" +" exception that was *already caught*, not to an exception that was freshly " +"raised. This function \":term:`steals `\" the references of the " +"arguments. To clear the exception state, pass ``NULL`` for all three " +"arguments. This function is kept for backwards compatibility. Prefer using " +":c:func:`PyErr_SetHandledException`." +msgstr "" + +#: ../../c-api/exceptions.rst:653 +msgid "" +"This function is not normally used by code that wants to handle exceptions. " +"Rather, it can be used when code needs to save and restore the exception " +"state temporarily. Use :c:func:`PyErr_GetExcInfo` to read the exception " +"state." +msgstr "" +"此函数通常不会被需要处理异常的代码所使用。它被使用的场合是在代码需要临时保存并恢复异常状态的情况。请使用 " +":c:func:`PyErr_GetExcInfo` 来读取异常状态。" + +#: ../../c-api/exceptions.rst:660 +msgid "" +"The ``type`` and ``traceback`` arguments are no longer used and can be NULL." +" The interpreter now derives them from the exception instance (the ``value``" +" argument). The function still \":term:`steals `\" references of all " +"three arguments." +msgstr "" + +#: ../../c-api/exceptions.rst:668 +msgid "Signal Handling" +msgstr "信号处理" + +#: ../../c-api/exceptions.rst:678 +msgid "" +"Handle external interruptions, such as signals or activating a debugger, " +"whose processing has been delayed until it is safe to run Python code and/or" +" raise exceptions." +msgstr "处理 外部中断,如信号或激活调试器 ,其处理被延迟,直到可以安全运行Python 代码和/或引发 异常 。" + +#: ../../c-api/exceptions.rst:682 +msgid "" +"For example, pressing :kbd:`Ctrl-C` causes a terminal to send the " +":py:data:`signal.SIGINT` signal. This function executes the corresponding " +"Python signal handler, which, by default, raises the " +":exc:`KeyboardInterrupt` exception." +msgstr "" + +#: ../../c-api/exceptions.rst:687 +msgid "" +":c:func:`!PyErr_CheckSignals` should be called by long-running C code " +"frequently enough so that the response appears immediate to humans." +msgstr "" + +#: ../../c-api/exceptions.rst:690 +msgid "Handlers invoked by this function currently include:" +msgstr "" + +#: ../../c-api/exceptions.rst:692 +msgid "" +"Signal handlers, including Python functions registered using the " +":mod:`signal` module." +msgstr "" + +#: ../../c-api/exceptions.rst:695 +msgid "" +"Signal handlers are only run in the main thread of the main interpreter." +msgstr "" + +#: ../../c-api/exceptions.rst:697 +msgid "" +"(This is where the function got the name: originally, signals were the only " +"way to interrupt the interpreter.)" +msgstr "(这就是函数名称的由来:最初,信号是中断解释器的唯一方式。)" + +#: ../../c-api/exceptions.rst:700 +msgid "Running the garbage collector, if necessary." +msgstr "如有必要,则运行垃圾回收器。" + +#: ../../c-api/exceptions.rst:702 +msgid "Executing a pending :ref:`remote debugger ` script." +msgstr "执行挂起的 :ref:`远程调试器 ` 脚本。" + +#: ../../c-api/exceptions.rst:704 +msgid "" +"If any handler raises an exception, immediately return ``-1`` with that " +"exception set. Any remaining interruptions are left to be processed on the " +"next :c:func:`PyErr_CheckSignals()` invocation, if appropriate." +msgstr "" +"如有任何处理器引发了异常,则立即返回 ``-1`` 并设置该异常。 如果条件合适,任何剩余的中断将留到下次唤起 " +":c:func:`PyErr_CheckSignals()` 时处理。" + +#: ../../c-api/exceptions.rst:709 +msgid "" +"If all handlers finish successfully, or there are no handlers to run, return" +" ``0``." +msgstr "如果所有处理器成功结束,或没有要运行的处理器,则返回 ``0``。" + +#: ../../c-api/exceptions.rst:712 +msgid "This function may now invoke the garbage collector." +msgstr "现在此函数可能会唤起垃圾回收器。" + +#: ../../c-api/exceptions.rst:715 +msgid "" +"This function may now execute a remote debugger script, if remote debugging " +"is enabled." +msgstr "现在此函数可以执行远程调试器脚本,如果启用了远程调试的话。" + +#: ../../c-api/exceptions.rst:727 +msgid "" +"Simulate the effect of a :c:macro:`!SIGINT` signal arriving. This is " +"equivalent to ``PyErr_SetInterruptEx(SIGINT)``." +msgstr "" +"模拟一个 :c:macro:`!SIGINT` 信号到达的效果。这等价于 ``PyErr_SetInterruptEx(SIGINT)``。" + +#: ../../c-api/exceptions.rst:731 ../../c-api/exceptions.rst:758 +msgid "" +"This function is async-signal-safe. It can be called without an " +":term:`attached thread state` and from a C signal handler." +msgstr "此函数是异步信号安全的。它可以在没有 :term:`attached thread state` 的情况下以及从 C 信号处理器中被调用。" + +#: ../../c-api/exceptions.rst:741 +msgid "" +"Simulate the effect of a signal arriving. The next time " +":c:func:`PyErr_CheckSignals` is called, the Python signal handler for the " +"given signal number will be called." +msgstr "" +"模拟一个信号到达的效果。当下次 :c:func:`PyErr_CheckSignals` 被调用时,将会调用针对指定的信号编号的 Python " +"信号处理器。" + +#: ../../c-api/exceptions.rst:745 +msgid "" +"This function can be called by C code that sets up its own signal handling " +"and wants Python signal handlers to be invoked as expected when an " +"interruption is requested (for example when the user presses Ctrl-C to " +"interrupt an operation)." +msgstr "" +"此函数可由自行设置信号处理,并希望 Python 信号处理器会在请求中断时(例如当用户按下 Ctrl-C 来中断操作时)按照预期被调用的 C " +"代码来调用。" + +#: ../../c-api/exceptions.rst:750 +msgid "" +"If the given signal isn't handled by Python (it was set to " +":py:const:`signal.SIG_DFL` or :py:const:`signal.SIG_IGN`), it will be " +"ignored." +msgstr "" +"如果给定的信号不是由 Python 来处理的 (即被设为 :py:const:`signal.SIG_DFL` 或 " +":py:const:`signal.SIG_IGN`),它将会被忽略。" + +#: ../../c-api/exceptions.rst:753 +msgid "" +"If *signum* is outside of the allowed range of signal numbers, ``-1`` is " +"returned. Otherwise, ``0`` is returned. The error indicator is never " +"changed by this function." +msgstr "" +"如果 *signum* 在被允许的信号编号范围之外,将返回 ``-1``。在其他情况下,则返回 ``0``。错误指示符绝不会被此函数所修改。" + +#: ../../c-api/exceptions.rst:766 +msgid "" +"This utility function specifies a file descriptor to which the signal number" +" is written as a single byte whenever a signal is received. *fd* must be " +"non-blocking. It returns the previous such file descriptor." +msgstr "" +"这个工具函数指定了一个文件描述符,每当收到信号时将以单个字节的形式向其写入信号编号。*fd* 必须是非阻塞的。它将返回前一个这样的文件描述符。" + +#: ../../c-api/exceptions.rst:770 +msgid "" +"The value ``-1`` disables the feature; this is the initial state. This is " +"equivalent to :func:`signal.set_wakeup_fd` in Python, but without any error " +"checking. *fd* should be a valid file descriptor. The function should only" +" be called from the main thread." +msgstr "" +"设置值 ``-1`` 将禁用该特性;这是初始状态。这等价于 Python 中的 " +":func:`signal.set_wakeup_fd`,但是没有任何错误检查。*fd* 应当是一个有效的文件描述符。此函数应当只从主线程来调用。" + +#: ../../c-api/exceptions.rst:775 +msgid "On Windows, the function now also supports socket handles." +msgstr "在 Windows 上,此函数现在也支持套接字句柄。" + +#: ../../c-api/exceptions.rst:780 +msgid "Exception Classes" +msgstr "Exception 类" + +#: ../../c-api/exceptions.rst:784 +msgid "" +"This utility function creates and returns a new exception class. The *name* " +"argument must be the name of the new exception, a C string of the form " +"``module.classname``. The *base* and *dict* arguments are normally " +"``NULL``. This creates a class object derived from :exc:`Exception` " +"(accessible in C as :c:data:`PyExc_Exception`)." +msgstr "" +"这个工具函数会创建并返回一个新的异常类。 *name* 参数必须为新异常的名称,是 ``module.classname`` 形式的 C 字符串。 " +"*base* 和 *dict* 参数通常为 ``NULL``。这将创建一个派生自 :exc:`Exception` 的类对象(在 C 中可以通过 " +":c:data:`PyExc_Exception` 访问)。" + +#: ../../c-api/exceptions.rst:790 +msgid "" +"The :attr:`~type.__module__` attribute of the new class is set to the first " +"part (up to the last dot) of the *name* argument, and the class name is set " +"to the last part (after the last dot). The *base* argument can be used to " +"specify alternate base classes; it can either be only one class or a tuple " +"of classes. The *dict* argument can be used to specify a dictionary of class" +" variables and methods." +msgstr "" +"新类的 :attr:`~type.__module__` 属性将被设为 *name* " +"参数的前半部分(最后一个点号之前),而类名将被设为后半部分(最后一个点号之后)。 *base* " +"参数可被用来指定替代基类;它可以是一个类或是一个由类组成的元组。 *dict* 参数可被用来指定一个由类变量和方法组成的字典。" + +#: ../../c-api/exceptions.rst:799 +msgid "" +"Same as :c:func:`PyErr_NewException`, except that the new exception class " +"can easily be given a docstring: If *doc* is non-``NULL``, it will be used " +"as the docstring for the exception class." +msgstr "" +"和 :c:func:`PyErr_NewException` 一样,除了可以轻松地给新的异常类一个文档字符串:如果 *doc* 为非 " +"``NULL``,它将用作异常类的文档字符串。" + +#: ../../c-api/exceptions.rst:808 +msgid "" +"Return non-zero if *ob* is an exception class, zero otherwise. This function" +" always succeeds." +msgstr "如果 *ob* 是异常类则返回非零,否则返回零。此函数总是会成功执行。" + +#: ../../c-api/exceptions.rst:813 +msgid "Return :c:member:`~PyTypeObject.tp_name` of the exception class *ob*." +msgstr "返回异常类 *ob* 的 :c:member:`~PyTypeObject.tp_name`。" + +#: ../../c-api/exceptions.rst:817 +msgid "Exception Objects" +msgstr "异常对象" + +#: ../../c-api/exceptions.rst:821 +msgid "" +"Return true if *op* is an instance of :class:`BaseException`, false " +"otherwise. This function always succeeds." +msgstr "如果 *op* 是 :class:`BaseException` 的实例则返回真值,否则返回假值。此函数总是会成功执行。" + +#: ../../c-api/exceptions.rst:827 +msgid "Equivalent to :c:func:`Py_TYPE(op) `." +msgstr "等价于 :c:func:`Py_TYPE(op) `。" + +#: ../../c-api/exceptions.rst:832 +msgid "" +"Return the traceback associated with the exception as a new reference, as " +"accessible from Python through the :attr:`~BaseException.__traceback__` " +"attribute. If there is no traceback associated, this returns ``NULL``." +msgstr "" +"将与异常相关联的回溯作为一个新引用返回,可以通过 :attr:`~BaseException.__traceback__` 属性在 Python " +"中访问。如果没有已关联的回溯,则返回 ``NULL``。" + +#: ../../c-api/exceptions.rst:840 +msgid "" +"Set the traceback associated with the exception to *tb*. Use ``Py_None`` to" +" clear it." +msgstr "将异常关联的回溯设置为 *tb* 。使用 ``Py_None`` 清除它。" + +#: ../../c-api/exceptions.rst:846 +msgid "" +"Return the context (another exception instance during whose handling *ex* " +"was raised) associated with the exception as a new reference, as accessible " +"from Python through the :attr:`~BaseException.__context__` attribute. If " +"there is no context associated, this returns ``NULL``." +msgstr "" +"将与异常相关联的上下文(在处理过程中引发了 *ex* 的另一个异常实例)作为一个新引用返回,可以通过 " +":attr:`~BaseException.__context__` 属性在 Python 中访问。如果没有已关联的上下文,则返回 ``NULL``。" + +#: ../../c-api/exceptions.rst:854 +msgid "" +"Set the context associated with the exception to *ctx*. Use ``NULL`` to " +"clear it. There is no type check to make sure that *ctx* is an exception " +"instance. This \":term:`steals `\" a reference to *ctx*." +msgstr "" + +#: ../../c-api/exceptions.rst:861 +msgid "" +"Return the cause (either an exception instance, or ``None``, set by ``raise " +"... from ...``) associated with the exception as a new reference, as " +"accessible from Python through the :attr:`~BaseException.__cause__` " +"attribute." +msgstr "" +"将与异常相关联的原因(一个异常实例,或为 ``None``,由 ``raise ... from ...`` 设置)作为一个新引用返回,可通过 " +":attr:`~BaseException.__cause__` 属性在 Python 中访问。" + +#: ../../c-api/exceptions.rst:869 +msgid "" +"Set the cause associated with the exception to *cause*. Use ``NULL`` to " +"clear it. There is no type check to make sure that *cause* is either an " +"exception instance or ``None``. This \":term:`steals `\" a reference " +"to *cause*." +msgstr "" + +#: ../../c-api/exceptions.rst:874 +msgid "" +"The :attr:`~BaseException.__suppress_context__` attribute is implicitly set " +"to ``True`` by this function." +msgstr ":attr:`~BaseException.__suppress_context__` 属性会被此函数隐式地设为 ``True``。" + +#: ../../c-api/exceptions.rst:880 +msgid "Return :attr:`~BaseException.args` of exception *ex*." +msgstr "返回异常 *ex* 的 :attr:`~BaseException.args`。" + +#: ../../c-api/exceptions.rst:885 +msgid "Set :attr:`~BaseException.args` of exception *ex* to *args*." +msgstr "将异常 *ex* 的 :attr:`~BaseException.args` 设为 *args*。" + +#: ../../c-api/exceptions.rst:889 +msgid "" +"Implement part of the interpreter's implementation of :keyword:`!except*`. " +"*orig* is the original exception that was caught, and *excs* is the list of " +"the exceptions that need to be raised. This list contains the unhandled part" +" of *orig*, if any, as well as the exceptions that were raised from the " +":keyword:`!except*` clauses (so they have a different traceback from *orig*)" +" and those that were reraised (and have the same traceback as *orig*). " +"Return the :exc:`ExceptionGroup` that needs to be reraised in the end, or " +"``None`` if there is nothing to reraise." +msgstr "" +"实现解释器的 :keyword:`!except*` 实现的一部分。 *orig* 是被捕获的原始异常,而 *excs* 是需要被引发的异常组成的列表。" +" 该列表包含 *orig* 可能存在的未被处理的部分,以及在 :keyword:`!except*` 子句中被引发的异常(因而它们具有与 *orig* " +"不同的回溯数据)和被重新引发的异常(因而它们具有与 *orig* 相同的回溯)。返回需要被最终引发的 " +":exc:`ExceptionGroup`,或者如果没有要被引发的异常则返回 ``None``。" + +#: ../../c-api/exceptions.rst:903 +msgid "Unicode Exception Objects" +msgstr "Unicode 异常对象" + +#: ../../c-api/exceptions.rst:905 +msgid "" +"The following functions are used to create and modify Unicode exceptions " +"from C." +msgstr "下列函数被用于创建和修改来自 C 的 Unicode 异常。" + +#: ../../c-api/exceptions.rst:909 +msgid "" +"Create a :class:`UnicodeDecodeError` object with the attributes *encoding*, " +"*object*, *length*, *start*, *end* and *reason*. *encoding* and *reason* are" +" UTF-8 encoded strings." +msgstr "" +"创建一个 :class:`UnicodeDecodeError` 对象并附带 *encoding*, *object*, *length*, " +"*start*, *end* 和 *reason* 等属性。 *encoding* 和 *reason* 为 UTF-8 编码的字符串。" + +#: ../../c-api/exceptions.rst:916 +msgid "Return the *encoding* attribute of the given exception object." +msgstr "返回给定异常对象的 *encoding* 属性" + +#: ../../c-api/exceptions.rst:922 +msgid "Return the *object* attribute of the given exception object." +msgstr "返回给定异常对象的 *object* 属性" + +#: ../../c-api/exceptions.rst:928 +msgid "" +"Get the *start* attribute of the given exception object and place it into " +"*\\*start*. *start* must not be ``NULL``. Return ``0`` on success, ``-1`` " +"on failure." +msgstr "" +"获取给定异常对象的 *start* 属性并将其放入 *\\*start*。*start* 必须不为 ``NULL``。成功时返回 ``0``,失败时返回" +" ``-1``。" + +#: ../../c-api/exceptions.rst:932 +msgid "" +"If the :attr:`UnicodeError.object` is an empty sequence, the resulting " +"*start* is ``0``. Otherwise, it is clipped to ``[0, len(object) - 1]``." +msgstr "" +"如果 :attr:`UnicodeError.object` 是一个空序列,则得到的 *start* 将为 ``0``。在其他情况下,它会被剪切到 " +"``[0, len(object) - 1]`` 区间内。" + +#: ../../c-api/exceptions.rst:935 +msgid ":attr:`UnicodeError.start`" +msgstr ":attr:`UnicodeError.start`" + +#: ../../c-api/exceptions.rst:941 +msgid "" +"Set the *start* attribute of the given exception object to *start*. Return " +"``0`` on success, ``-1`` on failure." +msgstr "将给定异常对象的 *start* 属性设为 *start*。成功时返回 ``0``,失败时返回 ``-1``。" + +#: ../../c-api/exceptions.rst:946 +msgid "" +"While passing a negative *start* does not raise an exception, the " +"corresponding getters will not consider it as a relative offset." +msgstr "虽然传入负的 *start* 不会引发异常,但是对应的获取器也不会把它当作是相对偏移量。" + +#: ../../c-api/exceptions.rst:954 +msgid "" +"Get the *end* attribute of the given exception object and place it into " +"*\\*end*. *end* must not be ``NULL``. Return ``0`` on success, ``-1`` on " +"failure." +msgstr "" +"获取给定异常对象的 *end* 属性并将其放入 *\\*end*。*end* 必须不为 ``NULL``。成功时返回 ``0``,失败时返回 " +"``-1``。" + +#: ../../c-api/exceptions.rst:958 +msgid "" +"If the :attr:`UnicodeError.object` is an empty sequence, the resulting *end*" +" is ``0``. Otherwise, it is clipped to ``[1, len(object)]``." +msgstr "" +"如果 :attr:`UnicodeError.object` 是一个空序列,则得到的 *end* 将为 ``0``。在其他情况下,它会被剪切到 " +"``[1, len(object)]`` 区间内。" + +#: ../../c-api/exceptions.rst:965 +msgid "" +"Set the *end* attribute of the given exception object to *end*. Return " +"``0`` on success, ``-1`` on failure." +msgstr "将给定异常对象的 *end* 属性设为 *end*。成功时返回 ``0``,失败时返回 ``-1``。" + +#: ../../c-api/exceptions.rst:968 +msgid ":attr:`UnicodeError.end`" +msgstr ":attr:`UnicodeError.end`" + +#: ../../c-api/exceptions.rst:974 +msgid "Return the *reason* attribute of the given exception object." +msgstr "返回给定异常对象的 *reason* 属性" + +#: ../../c-api/exceptions.rst:980 +msgid "" +"Set the *reason* attribute of the given exception object to *reason*. " +"Return ``0`` on success, ``-1`` on failure." +msgstr "将给定异常对象的 *reason* 属性设为 *reason*。成功时返回 ``0``,失败时返回 ``-1``。" + +#: ../../c-api/exceptions.rst:987 +msgid "Recursion Control" +msgstr "递归控制" + +#: ../../c-api/exceptions.rst:989 +msgid "" +"These two functions provide a way to perform safe recursive calls at the C " +"level, both in the core and in extension modules. They are needed if the " +"recursive code does not necessarily invoke Python code (which tracks its " +"recursion depth automatically). They are also not needed for *tp_call* " +"implementations because the :ref:`call protocol ` takes care of " +"recursion handling." +msgstr "" +"这两个函数提供了一种在 C 层级上进行安全的递归调用的方式,在核心模块与扩展模块中均适用。当递归代码不一定会调用 Python " +"代码(后者会自动跟踪其递归深度)时就需要用到它们。它们对于 *tp_call* 实现来说也无必要,因为 :ref:`调用协议 ` " +"会负责递归处理。" + +#: ../../c-api/exceptions.rst:998 +msgid "Marks a point where a recursive C-level call is about to be performed." +msgstr "标记一个递归的 C 层级调用即将被执行的点位。" + +#: ../../c-api/exceptions.rst:1000 +msgid "" +"The function then checks if the stack limit is reached. If this is the " +"case, a :exc:`RecursionError` is set and a nonzero value is returned. " +"Otherwise, zero is returned." +msgstr "" +"随后此函数将检查是否达到栈限制。如果是的话,将设置一个 :exc:`RecursionError` 并返回一个非零值。在其他情况下,将返回零。" + +#: ../../c-api/exceptions.rst:1004 +msgid "" +"*where* should be a UTF-8 encoded string such as ``\" in instance check\"`` " +"to be concatenated to the :exc:`RecursionError` message caused by the " +"recursion depth limit." +msgstr "" +"*where* 应为一个 UTF-8 编码的字符串如 ``\" in instance check\"``,它将与由递归深度限制所导致的 " +":exc:`RecursionError` 消息相拼接。" + +#: ../../c-api/exceptions.rst:1009 +msgid "The :c:func:`PyUnstable_ThreadState_SetStackProtection` function." +msgstr ":c:func:`PyUnstable_ThreadState_SetStackProtection` 函数。" + +#: ../../c-api/exceptions.rst:1011 ../../c-api/exceptions.rst:1019 +msgid "" +"This function is now also available in the :ref:`limited API `." +msgstr "此函数现在也在 :ref:`受限 API ` 中可用。" + +#: ../../c-api/exceptions.rst:1016 +msgid "" +"Ends a :c:func:`Py_EnterRecursiveCall`. Must be called once for each " +"*successful* invocation of :c:func:`Py_EnterRecursiveCall`." +msgstr "" +"结束一个 :c:func:`Py_EnterRecursiveCall`。必须针对 :c:func:`Py_EnterRecursiveCall` " +"的每个 *成功的* 调用操作执行一次调用。" + +#: ../../c-api/exceptions.rst:1022 +msgid "" +"Properly implementing :c:member:`~PyTypeObject.tp_repr` for container types " +"requires special recursion handling. In addition to protecting the stack, " +":c:member:`~PyTypeObject.tp_repr` also needs to track objects to prevent " +"cycles. The following two functions facilitate this functionality. " +"Effectively, these are the C equivalent to :func:`reprlib.recursive_repr`." +msgstr "" +"正确地针对容器类型实现 :c:member:`~PyTypeObject.tp_repr` 需要特别的递归处理。 " +"在保护栈之外,:c:member:`~PyTypeObject.tp_repr` " +"还需要追踪对象以防止出现循环。以下两个函数将帮助完成此功能。从实际效果来说,这两个函数是 C 中对应 " +":func:`reprlib.recursive_repr` 的等价物。" + +#: ../../c-api/exceptions.rst:1030 +msgid "" +"Called at the beginning of the :c:member:`~PyTypeObject.tp_repr` " +"implementation to detect cycles." +msgstr "在 :c:member:`~PyTypeObject.tp_repr` 实现的开头被调用以检测循环。" + +#: ../../c-api/exceptions.rst:1033 +msgid "" +"If the object has already been processed, the function returns a positive " +"integer. In that case the :c:member:`~PyTypeObject.tp_repr` implementation " +"should return a string object indicating a cycle. As examples, " +":class:`dict` objects return ``{...}`` and :class:`list` objects return " +"``[...]``." +msgstr "" +"如果对象已经被处理,此函数将返回一个正整数。在此情况下 :c:member:`~PyTypeObject.tp_repr` " +"实现应当返回一个指明发生循环的字符串对象。例如,:class:`dict` 对象将返回 ``{...}`` 而 :class:`list` 对象将返回 " +"``[...]``。" + +#: ../../c-api/exceptions.rst:1039 +msgid "" +"The function will return a negative integer if the recursion limit is " +"reached. In that case the :c:member:`~PyTypeObject.tp_repr` implementation " +"should typically return ``NULL``." +msgstr "" +"如果已达到递归限制则此函数将返回一个负整数。在此情况下 :c:member:`~PyTypeObject.tp_repr` 实现通常应当返回 " +"``NULL`` 值。" + +#: ../../c-api/exceptions.rst:1043 +msgid "" +"Otherwise, the function returns zero and the " +":c:member:`~PyTypeObject.tp_repr` implementation can continue normally." +msgstr "在其他情况下,此函数将返回零而 :c:member:`~PyTypeObject.tp_repr` 实现将可正常继续。" + +#: ../../c-api/exceptions.rst:1048 +msgid "" +"Ends a :c:func:`Py_ReprEnter`. Must be called once for each invocation of " +":c:func:`Py_ReprEnter` that returns zero." +msgstr "" +"结束一个 :c:func:`Py_ReprEnter`。必须针对每个返回零的 :c:func:`Py_ReprEnter` 的调用操作调用一次。" + +#: ../../c-api/exceptions.rst:1053 +msgid "" +"Get the recursion limit for the current interpreter. It can be set with " +":c:func:`Py_SetRecursionLimit`. The recursion limit prevents the Python " +"interpreter stack from growing infinitely." +msgstr "" +"获取当前解释器的递归上限。它可以通过 :c:func:`Py_SetRecursionLimit` 来设置。递归上限可以防止 Python " +"解释器栈无限增长。" + +#: ../../c-api/exceptions.rst:1057 ../../c-api/exceptions.rst:1067 +msgid "" +"This function cannot fail, and the caller must hold an :term:`attached " +"thread state`." +msgstr "此函数不会失败,并且调用方必须持有 :term:`attached thread state`。" + +#: ../../c-api/exceptions.rst:1061 +msgid ":py:func:`sys.getrecursionlimit`" +msgstr ":py:func:`sys.getrecursionlimit`" + +#: ../../c-api/exceptions.rst:1065 +msgid "Set the recursion limit for the current interpreter." +msgstr "为当前解释器设置递归次数限制。" + +#: ../../c-api/exceptions.rst:1071 +msgid ":py:func:`sys.setrecursionlimit`" +msgstr ":py:func:`sys.setrecursionlimit`" + +#: ../../c-api/exceptions.rst:1076 +msgid "Exception and warning types" +msgstr "异常与警告类型" + +#: ../../c-api/exceptions.rst:1078 +msgid "" +"All standard Python exceptions and warning categories are available as " +"global variables whose names are ``PyExc_`` followed by the Python exception" +" name. These have the type :c:expr:`PyObject*`; they are all class objects." +msgstr "" +"所有的标准 Python 异常和警告类别都可以用作全局变量,其名称为 ``PyExc_`` 加上 Python 异常名称。 它们的类型为 " +":c:expr:`PyObject*`;它们都是类对象。" + +#: ../../c-api/exceptions.rst:1082 +msgid "For completeness, here are all the variables:" +msgstr "为完整说明,以下是全部的变量:" + +#: ../../c-api/exceptions.rst:1085 +msgid "Exception types" +msgstr "异常类型" + +#: ../../c-api/exceptions.rst:1092 ../../c-api/exceptions.rst:1238 +#: ../../c-api/exceptions.rst:1268 +msgid "C name" +msgstr "C 名称" + +#: ../../c-api/exceptions.rst:1093 ../../c-api/exceptions.rst:1239 +#: ../../c-api/exceptions.rst:1269 +msgid "Python name" +msgstr "Python 名称" + +#: ../../c-api/exceptions.rst:1095 +msgid ":exc:`BaseException`" +msgstr ":exc:`BaseException`" + +#: ../../c-api/exceptions.rst:1097 +msgid ":exc:`BaseExceptionGroup`" +msgstr ":exc:`BaseExceptionGroup`" + +#: ../../c-api/exceptions.rst:1099 +msgid ":exc:`Exception`" +msgstr ":exc:`Exception`" + +#: ../../c-api/exceptions.rst:1101 +msgid ":exc:`ArithmeticError`" +msgstr ":exc:`ArithmeticError`" + +#: ../../c-api/exceptions.rst:1103 +msgid ":exc:`AssertionError`" +msgstr ":exc:`AssertionError`" + +#: ../../c-api/exceptions.rst:1105 +msgid ":exc:`AttributeError`" +msgstr ":exc:`AttributeError`" + +#: ../../c-api/exceptions.rst:1107 +msgid ":exc:`BlockingIOError`" +msgstr ":exc:`BlockingIOError`" + +#: ../../c-api/exceptions.rst:1109 +msgid ":exc:`BrokenPipeError`" +msgstr ":exc:`BrokenPipeError`" + +#: ../../c-api/exceptions.rst:1111 +msgid ":exc:`BufferError`" +msgstr ":exc:`BufferError`" + +#: ../../c-api/exceptions.rst:1113 +msgid ":exc:`ChildProcessError`" +msgstr ":exc:`ChildProcessError`" + +#: ../../c-api/exceptions.rst:1115 +msgid ":exc:`ConnectionAbortedError`" +msgstr ":exc:`ConnectionAbortedError`" + +#: ../../c-api/exceptions.rst:1117 +msgid ":exc:`ConnectionError`" +msgstr ":exc:`ConnectionError`" + +#: ../../c-api/exceptions.rst:1119 +msgid ":exc:`ConnectionRefusedError`" +msgstr ":exc:`ConnectionRefusedError`" + +#: ../../c-api/exceptions.rst:1121 +msgid ":exc:`ConnectionResetError`" +msgstr ":exc:`ConnectionResetError`" + +#: ../../c-api/exceptions.rst:1123 +msgid ":exc:`EOFError`" +msgstr ":exc:`EOFError`" + +#: ../../c-api/exceptions.rst:1125 +msgid ":exc:`FileExistsError`" +msgstr ":exc:`FileExistsError`" + +#: ../../c-api/exceptions.rst:1127 +msgid ":exc:`FileNotFoundError`" +msgstr ":exc:`FileNotFoundError`" + +#: ../../c-api/exceptions.rst:1129 +msgid ":exc:`FloatingPointError`" +msgstr ":exc:`FloatingPointError`" + +#: ../../c-api/exceptions.rst:1131 +msgid ":exc:`GeneratorExit`" +msgstr ":exc:`GeneratorExit`" + +#: ../../c-api/exceptions.rst:1133 +msgid ":exc:`ImportError`" +msgstr ":exc:`ImportError`" + +#: ../../c-api/exceptions.rst:1135 +msgid ":exc:`IndentationError`" +msgstr ":exc:`IndentationError`" + +#: ../../c-api/exceptions.rst:1137 +msgid ":exc:`IndexError`" +msgstr ":exc:`IndexError`" + +#: ../../c-api/exceptions.rst:1139 +msgid ":exc:`InterruptedError`" +msgstr ":exc:`InterruptedError`" + +#: ../../c-api/exceptions.rst:1141 +msgid ":exc:`IsADirectoryError`" +msgstr ":exc:`IsADirectoryError`" + +#: ../../c-api/exceptions.rst:1143 +msgid ":exc:`KeyError`" +msgstr ":exc:`KeyError`" + +#: ../../c-api/exceptions.rst:1145 +msgid ":exc:`KeyboardInterrupt`" +msgstr ":exc:`KeyboardInterrupt`" + +#: ../../c-api/exceptions.rst:1147 +msgid ":exc:`LookupError`" +msgstr ":exc:`LookupError`" + +#: ../../c-api/exceptions.rst:1149 +msgid ":exc:`MemoryError`" +msgstr ":exc:`MemoryError`" + +#: ../../c-api/exceptions.rst:1151 +msgid ":exc:`ModuleNotFoundError`" +msgstr ":exc:`ModuleNotFoundError`" + +#: ../../c-api/exceptions.rst:1153 +msgid ":exc:`NameError`" +msgstr ":exc:`NameError`" + +#: ../../c-api/exceptions.rst:1155 +msgid ":exc:`NotADirectoryError`" +msgstr ":exc:`NotADirectoryError`" + +#: ../../c-api/exceptions.rst:1157 +msgid ":exc:`NotImplementedError`" +msgstr ":exc:`NotImplementedError`" + +#: ../../c-api/exceptions.rst:1159 ../../c-api/exceptions.rst:1242 +#: ../../c-api/exceptions.rst:1245 ../../c-api/exceptions.rst:1248 +msgid ":exc:`OSError`" +msgstr ":exc:`OSError`" + +#: ../../c-api/exceptions.rst:1161 +msgid ":exc:`OverflowError`" +msgstr ":exc:`OverflowError`" + +#: ../../c-api/exceptions.rst:1163 +msgid ":exc:`PermissionError`" +msgstr ":exc:`PermissionError`" + +#: ../../c-api/exceptions.rst:1165 +msgid ":exc:`ProcessLookupError`" +msgstr ":exc:`ProcessLookupError`" + +#: ../../c-api/exceptions.rst:1167 +msgid ":exc:`PythonFinalizationError`" +msgstr ":exc:`PythonFinalizationError`" + +#: ../../c-api/exceptions.rst:1169 +msgid ":exc:`RecursionError`" +msgstr ":exc:`RecursionError`" + +#: ../../c-api/exceptions.rst:1171 +msgid ":exc:`ReferenceError`" +msgstr ":exc:`ReferenceError`" + +#: ../../c-api/exceptions.rst:1173 +msgid ":exc:`RuntimeError`" +msgstr ":exc:`RuntimeError`" + +#: ../../c-api/exceptions.rst:1175 +msgid ":exc:`StopAsyncIteration`" +msgstr ":exc:`StopAsyncIteration`" + +#: ../../c-api/exceptions.rst:1177 +msgid ":exc:`StopIteration`" +msgstr ":exc:`StopIteration`" + +#: ../../c-api/exceptions.rst:1179 +msgid ":exc:`SyntaxError`" +msgstr ":exc:`SyntaxError`" + +#: ../../c-api/exceptions.rst:1181 +msgid ":exc:`SystemError`" +msgstr ":exc:`SystemError`" + +#: ../../c-api/exceptions.rst:1183 +msgid ":exc:`SystemExit`" +msgstr ":exc:`SystemExit`" + +#: ../../c-api/exceptions.rst:1185 +msgid ":exc:`TabError`" +msgstr ":exc:`TabError`" + +#: ../../c-api/exceptions.rst:1187 +msgid ":exc:`TimeoutError`" +msgstr ":exc:`TimeoutError`" + +#: ../../c-api/exceptions.rst:1189 +msgid ":exc:`TypeError`" +msgstr ":exc:`TypeError`" + +#: ../../c-api/exceptions.rst:1191 +msgid ":exc:`UnboundLocalError`" +msgstr ":exc:`UnboundLocalError`" + +#: ../../c-api/exceptions.rst:1193 +msgid ":exc:`UnicodeDecodeError`" +msgstr ":exc:`UnicodeDecodeError`" + +#: ../../c-api/exceptions.rst:1195 +msgid ":exc:`UnicodeEncodeError`" +msgstr ":exc:`UnicodeEncodeError`" + +#: ../../c-api/exceptions.rst:1197 +msgid ":exc:`UnicodeError`" +msgstr ":exc:`UnicodeError`" + +#: ../../c-api/exceptions.rst:1199 +msgid ":exc:`UnicodeTranslateError`" +msgstr ":exc:`UnicodeTranslateError`" + +#: ../../c-api/exceptions.rst:1201 +msgid ":exc:`ValueError`" +msgstr ":exc:`ValueError`" + +#: ../../c-api/exceptions.rst:1203 +msgid ":exc:`ZeroDivisionError`" +msgstr ":exc:`ZeroDivisionError`" + +#: ../../c-api/exceptions.rst:1205 +msgid "" +":c:data:`PyExc_BlockingIOError`, :c:data:`PyExc_BrokenPipeError`, " +":c:data:`PyExc_ChildProcessError`, :c:data:`PyExc_ConnectionError`, " +":c:data:`PyExc_ConnectionAbortedError`, " +":c:data:`PyExc_ConnectionRefusedError`, " +":c:data:`PyExc_ConnectionResetError`, :c:data:`PyExc_FileExistsError`, " +":c:data:`PyExc_FileNotFoundError`, :c:data:`PyExc_InterruptedError`, " +":c:data:`PyExc_IsADirectoryError`, :c:data:`PyExc_NotADirectoryError`, " +":c:data:`PyExc_PermissionError`, :c:data:`PyExc_ProcessLookupError` and " +":c:data:`PyExc_TimeoutError` were introduced following :pep:`3151`." +msgstr "" +":c:data:`PyExc_BlockingIOError`, :c:data:`PyExc_BrokenPipeError`, " +":c:data:`PyExc_ChildProcessError`, :c:data:`PyExc_ConnectionError`, " +":c:data:`PyExc_ConnectionAbortedError`, " +":c:data:`PyExc_ConnectionRefusedError`, " +":c:data:`PyExc_ConnectionResetError`, :c:data:`PyExc_FileExistsError`, " +":c:data:`PyExc_FileNotFoundError`, :c:data:`PyExc_InterruptedError`, " +":c:data:`PyExc_IsADirectoryError`, :c:data:`PyExc_NotADirectoryError`, " +":c:data:`PyExc_PermissionError`, :c:data:`PyExc_ProcessLookupError` 和 " +":c:data:`PyExc_TimeoutError` 是在 :pep:`3151` 之后引入的。" + +#: ../../c-api/exceptions.rst:1215 +msgid ":c:data:`PyExc_StopAsyncIteration` and :c:data:`PyExc_RecursionError`." +msgstr ":c:data:`PyExc_StopAsyncIteration` 和 :c:data:`PyExc_RecursionError`." + +#: ../../c-api/exceptions.rst:1218 +msgid ":c:data:`PyExc_ModuleNotFoundError`." +msgstr ":c:data:`PyExc_ModuleNotFoundError`." + +#: ../../c-api/exceptions.rst:1221 +msgid ":c:data:`PyExc_BaseExceptionGroup`." +msgstr ":c:data:`PyExc_BaseExceptionGroup`." + +#: ../../c-api/exceptions.rst:1226 +msgid "OSError aliases" +msgstr "OSError 别名" + +#: ../../c-api/exceptions.rst:1228 +msgid "The following are a compatibility aliases to :c:data:`PyExc_OSError`." +msgstr "以下均为 :c:data:`PyExc_OSError` 的兼容性别名。" + +#: ../../c-api/exceptions.rst:1230 +msgid "These aliases used to be separate exception types." +msgstr "这些别名曾经是单独的异常类型。" + +#: ../../c-api/exceptions.rst:1240 +msgid "Notes" +msgstr "备注" + +#: ../../c-api/exceptions.rst:1249 +msgid "[win]_" +msgstr "[win]_" + +#: ../../c-api/exceptions.rst:1251 +msgid "Notes:" +msgstr "注:" + +#: ../../c-api/exceptions.rst:1254 +msgid "" +":c:var:`!PyExc_WindowsError` is only defined on Windows; protect code that " +"uses this by testing that the preprocessor macro ``MS_WINDOWS`` is defined." +msgstr "" +":c:var:`!PyExc_WindowsError` 仅在 Windows 上定义;通过测试是否定义了预处理器宏 ``MS_WINDOWS`` " +"来保护用到它的代码。" + +#: ../../c-api/exceptions.rst:1261 +msgid "Warning types" +msgstr "警告类型" + +#: ../../c-api/exceptions.rst:1271 +msgid ":exc:`Warning`" +msgstr ":exc:`Warning`" + +#: ../../c-api/exceptions.rst:1273 +msgid ":exc:`BytesWarning`" +msgstr ":exc:`BytesWarning`" + +#: ../../c-api/exceptions.rst:1275 +msgid ":exc:`DeprecationWarning`" +msgstr ":exc:`DeprecationWarning`" + +#: ../../c-api/exceptions.rst:1277 +msgid ":exc:`EncodingWarning`" +msgstr ":exc:`EncodingWarning`" + +#: ../../c-api/exceptions.rst:1279 +msgid ":exc:`FutureWarning`" +msgstr ":exc:`FutureWarning`" + +#: ../../c-api/exceptions.rst:1281 +msgid ":exc:`ImportWarning`" +msgstr ":exc:`ImportWarning`" + +#: ../../c-api/exceptions.rst:1283 +msgid ":exc:`PendingDeprecationWarning`" +msgstr ":exc:`PendingDeprecationWarning`" + +#: ../../c-api/exceptions.rst:1285 +msgid ":exc:`ResourceWarning`" +msgstr ":exc:`ResourceWarning`" + +#: ../../c-api/exceptions.rst:1287 +msgid ":exc:`RuntimeWarning`" +msgstr ":exc:`RuntimeWarning`" + +#: ../../c-api/exceptions.rst:1289 +msgid ":exc:`SyntaxWarning`" +msgstr ":exc:`SyntaxWarning`" + +#: ../../c-api/exceptions.rst:1291 +msgid ":exc:`UnicodeWarning`" +msgstr ":exc:`UnicodeWarning`" + +#: ../../c-api/exceptions.rst:1293 +msgid ":exc:`UserWarning`" +msgstr ":exc:`UserWarning`" + +#: ../../c-api/exceptions.rst:1295 +msgid ":c:data:`PyExc_ResourceWarning`." +msgstr ":c:data:`PyExc_ResourceWarning`." + +#: ../../c-api/exceptions.rst:1298 +msgid ":c:data:`PyExc_EncodingWarning`." +msgstr ":c:data:`PyExc_EncodingWarning`." + +#: ../../c-api/exceptions.rst:1303 +msgid "Tracebacks" +msgstr "回溯" + +#: ../../c-api/exceptions.rst:1307 +msgid "" +"Type object for traceback objects. This is available as " +":class:`types.TracebackType` in the Python layer." +msgstr "回溯对象的类型对象。它在 Python 层面上对应 :class:`types.TracebackType`。" + +#: ../../c-api/exceptions.rst:1313 +msgid "" +"Return true if *op* is a traceback object, false otherwise. This function " +"does not account for subtypes." +msgstr "如果 *op* 是一个回溯对象则返回真值,否则返回假值。此函数不会考虑子类型。" + +#: ../../c-api/exceptions.rst:1319 +msgid "" +"Replace the :attr:`~BaseException.__traceback__` attribute on the current " +"exception with a new traceback prepending *f* to the existing chain." +msgstr "将当前异常中的 :attr:`~BaseException.__traceback__` 替换为一个向现有链添加了 *f* 的新回溯。" + +#: ../../c-api/exceptions.rst:1322 +msgid "Calling this function without an exception set is undefined behavior." +msgstr "调用此函数而不设置异常是未定义的行为。" + +#: ../../c-api/exceptions.rst:1324 ../../c-api/exceptions.rst:1332 +msgid "" +"This function returns ``0`` on success, and returns ``-1`` with an exception" +" set on failure." +msgstr "此函数成功时返回 ``0``,失败时返回 ``-1`` 并设置一个异常。" + +#: ../../c-api/exceptions.rst:1330 +msgid "Write the traceback *tb* into the file *f*." +msgstr "将回溯 *tb* 写入到文件 *f*。" + +#: ../../c-api/exceptions.rst:183 +msgid "strerror (C function)" +msgstr "strerror (C 函数)" + +#: ../../c-api/exceptions.rst:673 ../../c-api/exceptions.rst:722 +#: ../../c-api/exceptions.rst:737 +msgid "module" +msgstr "module" + +#: ../../c-api/exceptions.rst:673 ../../c-api/exceptions.rst:722 +#: ../../c-api/exceptions.rst:737 +msgid "signal" +msgstr "signal" + +#: ../../c-api/exceptions.rst:673 ../../c-api/exceptions.rst:722 +msgid "SIGINT (C macro)" +msgstr "SIGINT (C 宏)" + +#: ../../c-api/exceptions.rst:673 ../../c-api/exceptions.rst:722 +#: ../../c-api/exceptions.rst:737 +msgid "KeyboardInterrupt (built-in exception)" +msgstr "KeyboardInterrupt (内置异常)" diff --git a/c-api/extension-modules.po b/c-api/extension-modules.po new file mode 100644 index 0000000000..24d1f11672 --- /dev/null +++ b/c-api/extension-modules.po @@ -0,0 +1,543 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-09 14:43+0000\n" +"PO-Revision-Date: 2025-09-16 00:00+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/extension-modules.rst:6 +msgid "Defining extension modules" +msgstr "定义扩展模块" + +#: ../../c-api/extension-modules.rst:8 +msgid "" +"A C extension for CPython is a shared library (for example, a ``.so`` file " +"on Linux, ``.pyd`` DLL on Windows), which is loadable into the Python " +"process (for example, it is compiled with compatible compiler settings), and" +" which exports an :dfn:`export hook` function (or an old-style " +":ref:`initialization function `)." +msgstr "" +"针对 CPython 的 C 扩展就是一个共享库(例如,Linux 上的 ``.so`` 文件,Windows 上的 ``.pyd`` " +"DLL),它可被加载到 Python 进程中(例如,它可以用兼容的编译器设置进行编译),而这会导出一个 :dfn:`导出钩子` 函数 (或旧式的 " +":ref:`初始化函数 `)。" + +#: ../../c-api/extension-modules.rst:14 +msgid "" +"To be importable by default (that is, by " +":py:class:`importlib.machinery.ExtensionFileLoader`), the shared library " +"must be available on :py:attr:`sys.path`, and must be named after the module" +" name plus an extension listed in " +":py:attr:`importlib.machinery.EXTENSION_SUFFIXES`." +msgstr "" +"要在默认情况下可被导入 (也就是说,通过 " +":py:class:`importlib.machinery.ExtensionFileLoader`),共享库必须在 " +":py:attr:`sys.path` 中可用,并且必须命名为模块名之后加一个在 " +":py:attr:`importlib.machinery.EXTENSION_SUFFIXES` 中列出的扩展名。" + +#: ../../c-api/extension-modules.rst:22 +msgid "" +"Building, packaging and distributing extension modules is best done with " +"third-party tools, and is out of scope of this document. One suitable tool " +"is Setuptools, whose documentation can be found at " +"https://setuptools.pypa.io/en/latest/setuptools.html." +msgstr "" +"构建、打包和分发扩展模块最好使用第三方工具完成,并且超出了本文的范围。一个合适的工具是 Setuptools,其文档可以在 " +"https://setuptools.pypa.io/en/latest/setuptools.html 上找到。" + +#: ../../c-api/extension-modules.rst:30 +msgid "Extension export hook" +msgstr "扩展导出钩子" + +#: ../../c-api/extension-modules.rst:34 +msgid "" +"Support for the :samp:`PyModExport_{}` export hook was added in Python" +" 3.15. The older way of defining modules is still available: consult either " +"the :ref:`extension-pyinit` section or earlier versions of this " +"documentation if you plan to support earlier Python versions." +msgstr "" +"对 :samp:`PyModExport_{}` 导出钩子的支持是在 Python 3.15 中增加的。 " +"定义模块的旧方式仍然可用:如果你计划支持更早的 Python 版本可以查阅 :ref:`extension-pyinit` 一节或本文档的较早版本。" + +#: ../../c-api/extension-modules.rst:39 +msgid "" +"The export hook must be an exported function with the following signature:" +msgstr "导出钩子必须是具有以下签名的导出函数:" + +#: ../../c-api/extension-modules.rst:43 +msgid "" +"For modules with ASCII-only names, the :ref:`export hook ` must be named :samp:`PyModExport_{}`, with ```` replaced " +"by the module's name." +msgstr "" +"对于具有仅限 ASCII 名称的模块,:ref:`导出钩子 ` 必须被命名为 " +":samp:`PyModExport_{}`,其中 ```` 以模块名称替换。" + +#: ../../c-api/extension-modules.rst:47 +msgid "" +"For non-ASCII module names, the export hook must instead be named " +":samp:`PyModExportU_{}` (note the ``U``), with ```` encoded " +"using Python's *punycode* encoding with hyphens replaced by underscores. In " +"Python:" +msgstr "" +"对于非 ASCII 模块名称,则导出钩子必须被命名为 :samp:`PyModExportU_{}` (注意增加了 ``U``),其中 " +"```` 使用 Python 的 *punycode* 编码格式进行编码并将连字符替换为下划线。 在 Python 中:" + +#: ../../c-api/extension-modules.rst:51 +msgid "" +"def hook_name(name):\n" +" try:\n" +" suffix = b'_' + name.encode('ascii')\n" +" except UnicodeEncodeError:\n" +" suffix = b'U_' + name.encode('punycode').replace(b'-', b'_')\n" +" return b'PyModExport' + suffix" +msgstr "" + +#: ../../c-api/extension-modules.rst:60 +msgid "" +"The export hook returns an array of :c:type:`PySlot` entries, terminated by " +"an entry with a slot ID of ``0``. These slots describe how the module should" +" be created and initialized." +msgstr "" + +#: ../../c-api/extension-modules.rst:64 +msgid "" +"This array must remain valid and constant until interpreter shutdown. " +"Typically, it should use ``static`` storage. Prefer using the " +":c:macro:`Py_mod_create` and :c:macro:`Py_mod_exec` slots for any dynamic " +"behavior." +msgstr "" + +#: ../../c-api/extension-modules.rst:69 +msgid "" +"The export hook may return ``NULL`` with an exception set to signal failure." +msgstr "" + +#: ../../c-api/extension-modules.rst:71 +msgid "" +"It is recommended to define the export hook function using a helper macro:" +msgstr "" + +#: ../../c-api/extension-modules.rst:75 +msgid "Declare an extension module export hook. This macro:" +msgstr "" + +#: ../../c-api/extension-modules.rst:78 +msgid "specifies the :c:expr:`PySlot*` return type," +msgstr "" + +#: ../../c-api/extension-modules.rst:79 ../../c-api/extension-modules.rst:224 +msgid "adds any special linkage declarations required by the platform, and" +msgstr "添加平台所需的任何特殊链接声明,以及" + +#: ../../c-api/extension-modules.rst:80 ../../c-api/extension-modules.rst:225 +msgid "for C++, declares the function as ``extern \"C\"``." +msgstr "对于 C++,将函数声明为 ``extern \"C\"``。" + +#: ../../c-api/extension-modules.rst:82 ../../c-api/extension-modules.rst:255 +msgid "For example, a module called ``spam`` would be defined like this::" +msgstr "例如,一个名为 ``spam`` 的模块可以这样定义::" + +#: ../../c-api/extension-modules.rst:84 +msgid "" +"PyABIInfo_VAR(abi_info);\n" +"\n" +"static PySlot spam_slots[] = {\n" +" PySlot_STATIC_DATA(Py_mod_abi, &abi_info),\n" +" PySlot_STATIC_DATA(Py_mod_name, \"spam\"),\n" +" PySlot_FUNC(Py_mod_init, spam_init_function),\n" +" ...\n" +" PySlot_END\n" +"};\n" +"\n" +"PyMODEXPORT_FUNC\n" +"PyModExport_spam(void)\n" +"{\n" +" return spam_slots;\n" +"}" +msgstr "" + +#: ../../c-api/extension-modules.rst:100 +msgid "" +"The export hook is typically the only non-\\ ``static`` item defined in the " +"module's C source." +msgstr "" + +#: ../../c-api/extension-modules.rst:103 +msgid "" +"The hook should be kept short -- ideally, one line as above. If you do need " +"to use Python C API in this function, it is recommended to call " +"``PyABIInfo_Check(&abi_info, \"modulename\")`` first to raise an exception, " +"rather than crash, in common cases of ABI mismatch." +msgstr "" + +#: ../../c-api/extension-modules.rst:111 +msgid "" +"It is possible to export multiple modules from a single shared library by " +"defining multiple export hooks. However, importing them requires a custom " +"importer or suitably named copies/links of the extension file, because " +"Python's import machinery only finds the function corresponding to the " +"filename. See the `Multiple modules in one library " +"`__ " +"section in :pep:`489` for details." +msgstr "" + +#: ../../c-api/extension-modules.rst:123 +msgid "Multi-phase initialization" +msgstr "多阶段初始化" + +#: ../../c-api/extension-modules.rst:125 +msgid "The process of creating an extension module follows several phases:" +msgstr "" + +#: ../../c-api/extension-modules.rst:127 +msgid "" +"Python finds and calls the export hook to get information on how to create " +"the module." +msgstr "" + +#: ../../c-api/extension-modules.rst:129 +msgid "" +"Before any substantial code is executed, Python can determine which " +"capabilities the module supports, and it can adjust the environment or " +"refuse loading an incompatible extension. Slots like :c:data:`Py_mod_abi`, " +":c:data:`Py_mod_gil` and :c:data:`Py_mod_multiple_interpreters` influence " +"this step." +msgstr "" + +#: ../../c-api/extension-modules.rst:134 +msgid "" +"By default, Python itself then creates the module object -- that is, it does" +" the equivalent of calling :py:meth:`~object.__new__` when creating an " +"object. This step can be overridden using the :c:data:`Py_mod_create` slot." +msgstr "" + +#: ../../c-api/extension-modules.rst:137 +msgid "" +"Python sets initial module attributes like :attr:`~module.__package__` and " +":attr:`~module.__loader__`, and inserts the module object into " +":py:attr:`sys.modules`." +msgstr "" + +#: ../../c-api/extension-modules.rst:140 +msgid "" +"Afterwards, the module object is initialized in an extension-specific way --" +" the equivalent of :py:meth:`~object.__init__` when creating an object, or " +"of executing top-level code in a Python-language module. The behavior is " +"specified using the :c:data:`Py_mod_exec` slot." +msgstr "" + +#: ../../c-api/extension-modules.rst:145 +msgid "" +"This is called *multi-phase initialization* to distinguish it from the " +"legacy (but still supported) :ref:`single-phase initialization `, where an initialization function returns a fully " +"constructed module." +msgstr "" + +#: ../../c-api/extension-modules.rst:151 +msgid "Added support for multi-phase initialization (:pep:`489`)." +msgstr "增加了对多阶段初始化的支持 (:pep:`489`)。" + +#: ../../c-api/extension-modules.rst:155 +msgid "Multiple module instances" +msgstr "多个模块实例" + +#: ../../c-api/extension-modules.rst:157 +msgid "" +"By default, extension modules are not singletons. For example, if the " +":py:attr:`sys.modules` entry is removed and the module is re-imported, a new" +" module object is created and, typically, populated with fresh method and " +"type objects. The old module is subject to normal garbage collection. This " +"mirrors the behavior of pure-Python modules." +msgstr "" + +#: ../../c-api/extension-modules.rst:164 +msgid "" +"Additional module instances may be created in :ref:`sub-interpreters ` or after Python runtime reinitialization " +"(:c:func:`Py_Finalize` and :c:func:`Py_Initialize`). In these cases, sharing" +" Python objects between module instances would likely cause crashes or " +"undefined behavior." +msgstr "" +"额外的模块实例可能会在 :ref:`子解释器 ` 中或者 Python 运行时重新初始化之后 " +"(:c:func:`Py_Finalize` 和 :c:func:`Py_Initialize`) 被创建。在这些情况下,模块实例间共享 Python" +" 对象可能导致程序崩溃或未定义的行为。" + +#: ../../c-api/extension-modules.rst:171 +msgid "" +"To avoid such issues, each instance of an extension module should be " +"*isolated*: changes to one instance should not implicitly affect the others," +" and all state owned by the module, including references to Python objects, " +"should be specific to a particular module instance. See :ref:`isolating-" +"extensions-howto` for more details and a practical guide." +msgstr "" +"为避免这种问题,每个扩展模块的实例都应当是 *隔离的*: 对一个实例的修改不应隐式地影响其他的实例,以及模块所拥有的全部状态,包括对 Python " +"对象的引用,都应当是特定模块实例专属的。请参阅 :ref:`isolating-extensions-howto` 了解更多的细节和实用的指南。" + +#: ../../c-api/extension-modules.rst:177 +msgid "" +"A simpler way to avoid these issues is :ref:`raising an error on repeated " +"initialization `." +msgstr "一个避免这些问题的简单方式是 :ref:`针对重复的初始化引发一个错误 `。" + +#: ../../c-api/extension-modules.rst:180 +msgid "" +"All modules are expected to support :ref:`sub-interpreters `, or otherwise explicitly signal a lack of support. This is usually" +" achieved by isolation or blocking repeated initialization, as above. A " +"module may also be limited to the main interpreter using the " +":c:data:`Py_mod_multiple_interpreters` slot." +msgstr "" +"所有模块都应当支持 :ref:`子解释器 `,否则就要显式地发出缺乏支持的信号。 " +"这往往是通过隔离或阻止重复的初始化,如上文所述。一个模块也可以使用 :c:data:`Py_mod_multiple_interpreters` " +"槽位将其限制于主解释器中。" + +#: ../../c-api/extension-modules.rst:192 +msgid "``PyInit`` function" +msgstr "``PyInit`` 函数" + +#: ../../c-api/extension-modules.rst:196 +msgid "" +"This functionality will not get new features, but there are no plans to " +"remove it." +msgstr "" + +#: ../../c-api/extension-modules.rst:199 +msgid "" +"Instead of :c:func:`PyModExport_modulename`, an extension module can define " +"an older-style :dfn:`initialization function` with the signature:" +msgstr "" + +#: ../../c-api/extension-modules.rst:204 +msgid "" +"Its name should be :samp:`PyInit_{}`, with ```` replaced by the " +"name of the module. For non-ASCII module names, use :samp:`PyInitU_{}`" +" instead, with ```` encoded in the same way as for the :ref:`export " +"hook ` (that is, using Punycode with underscores)." +msgstr "" + +#: ../../c-api/extension-modules.rst:211 +msgid "" +"If a module exports both :samp:`PyInit_{}` and " +":samp:`PyModExport_{}`, the :samp:`PyInit_{}` function is " +"ignored." +msgstr "" + +#: ../../c-api/extension-modules.rst:215 +msgid "" +"Like with :c:macro:`PyMODEXPORT_FUNC`, it is recommended to define the " +"initialization function using a helper macro:" +msgstr "" + +#: ../../c-api/extension-modules.rst:220 +msgid "Declare an extension module initialization function. This macro:" +msgstr "声明一个扩展模块初始化函数。这个宏:" + +#: ../../c-api/extension-modules.rst:223 +msgid "specifies the :c:expr:`PyObject*` return type," +msgstr "指定了 :c:expr:`PyObject*` 返回类型," + +#: ../../c-api/extension-modules.rst:228 +msgid "" +"Normally, the initialization function (``PyInit_modulename``) returns a " +":c:type:`PyModuleDef` instance with non-``NULL`` " +":c:member:`~PyModuleDef.m_slots`. This allows Python to use :ref:`multi-" +"phase initialization `." +msgstr "" + +#: ../../c-api/extension-modules.rst:233 +msgid "" +"Before it is returned, the ``PyModuleDef`` instance must be initialized " +"using the following function:" +msgstr "" + +#: ../../c-api/extension-modules.rst:238 +msgid "" +"Ensure a module definition is a properly initialized Python object that " +"correctly reports its type and a reference count." +msgstr "确保模块定义是一个正确初始化的 Python 对象,并正确报告其类型以及引用计数。" + +#: ../../c-api/extension-modules.rst:241 +msgid "Return *def* cast to ``PyObject*``, or ``NULL`` if an error occurred." +msgstr "返回强制转换为 ``PyObject*`` 的 *def*,或者如果出现错误则返回 ``NULL``。" + +#: ../../c-api/extension-modules.rst:243 +msgid "" +"Calling this function is required before returning a :c:type:`PyModuleDef` " +"from a module initialization function. It should not be used in other " +"contexts." +msgstr "" + +#: ../../c-api/extension-modules.rst:247 +msgid "" +"Note that Python assumes that ``PyModuleDef`` structures are statically " +"allocated. This function may return either a new reference or a borrowed " +"one; this reference must not be released." +msgstr "请注意 Python 会假定 ``PyModuleDef`` 结构体是静态分配的。此函数可以返回一个新引用或借用引用;这个引用不可被释放。" + +#: ../../c-api/extension-modules.rst:257 +msgid "" +"static struct PyModuleDef spam_module = {\n" +" .m_base = PyModuleDef_HEAD_INIT,\n" +" .m_name = \"spam\",\n" +" ...\n" +"};\n" +"\n" +"PyMODINIT_FUNC\n" +"PyInit_spam(void)\n" +"{\n" +" return PyModuleDef_Init(&spam_module);\n" +"}" +msgstr "" +"static struct PyModuleDef spam_module = {\n" +" .m_base = PyModuleDef_HEAD_INIT,\n" +" .m_name = \"spam\",\n" +" ...\n" +"};\n" +"\n" +"PyMODINIT_FUNC\n" +"PyInit_spam(void)\n" +"{\n" +" return PyModuleDef_Init(&spam_module);\n" +"}" + +#: ../../c-api/extension-modules.rst:273 +msgid "Legacy single-phase initialization" +msgstr "旧式的单阶段初始化" + +#: ../../c-api/extension-modules.rst:277 +msgid "" +"Single-phase initialization is a legacy mechanism to initialize extension " +"modules, with known drawbacks and design flaws. Extension module authors are" +" encouraged to use multi-phase initialization instead." +msgstr "单阶段初始化是一种用于初始化扩展模块的旧机制,它具有已知的缺点和设计瑕疵。建议扩展模块作者改用多阶段初始化。" + +#: ../../c-api/extension-modules.rst:281 +msgid "However, there are no plans to remove support for it." +msgstr "" + +#: ../../c-api/extension-modules.rst:283 +msgid "" +"In single-phase initialization, the old-style :ref:`initialization function " +"` (``PyInit_modulename``) should create, populate and " +"return a module object. This is typically done using " +":c:func:`PyModule_Create` and functions like " +":c:func:`PyModule_AddObjectRef`." +msgstr "" + +#: ../../c-api/extension-modules.rst:289 +msgid "" +"Single-phase initialization differs from the :ref:`default ` in the following ways:" +msgstr "单阶段初始化与 :ref:`默认方式 ` 的主要区别如下:" + +#: ../../c-api/extension-modules.rst:292 +msgid "Single-phase modules are, or rather *contain*, “singletons”." +msgstr "单阶段模块本质上是(更准确地说,*包含*)\"单例对象\"。" + +#: ../../c-api/extension-modules.rst:294 +msgid "" +"When the module is first initialized, Python saves the contents of the " +"module's ``__dict__`` (that is, typically, the module's functions and " +"types)." +msgstr "当模块首次初始化时,Python 会保存该模块 ``__dict__`` 中的内容(通常包括模块的函数和类型等)。" + +#: ../../c-api/extension-modules.rst:298 +msgid "" +"For subsequent imports, Python does not call the initialization function " +"again. Instead, it creates a new module object with a new ``__dict__``, and " +"copies the saved contents to it. For example, given a single-phase module " +"``_testsinglephase`` [#testsinglephase]_ that defines a function ``sum`` and" +" an exception class ``error``:" +msgstr "" +"对于后续导入操作,Python 不会再次调用初始化函数,而是创建一个带有新 ``__dict__`` " +"的模块对象,并将已保存的内容复制到其中。例如,假设有一个单阶段模块 ``_testsinglephase`` [#testsinglephase]_ " +"定义了函数 ``sum`` 和异常类 ``error``:" + +#: ../../c-api/extension-modules.rst:306 +msgid "" +">>> import sys\n" +">>> import _testsinglephase as one\n" +">>> del sys.modules['_testsinglephase']\n" +">>> import _testsinglephase as two\n" +">>> one is two\n" +"False\n" +">>> one.__dict__ is two.__dict__\n" +"False\n" +">>> one.sum is two.sum\n" +"True\n" +">>> one.error is two.error\n" +"True" +msgstr "" +">>> import sys\n" +">>> import _testsinglephase as one\n" +">>> del sys.modules['_testsinglephase']\n" +">>> import _testsinglephase as two\n" +">>> one is two\n" +"False\n" +">>> one.__dict__ is two.__dict__\n" +"False\n" +">>> one.sum is two.sum\n" +"True\n" +">>> one.error is two.error\n" +"True" + +#: ../../c-api/extension-modules.rst:321 +msgid "" +"The exact behavior should be considered a CPython implementation detail." +msgstr "该具体行为应被视为 CPython 的实现细节。" + +#: ../../c-api/extension-modules.rst:323 +msgid "" +"To work around the fact that ``PyInit_modulename`` does not take a *spec* " +"argument, some state of the import machinery is saved and applied to the " +"first suitable module created during the ``PyInit_modulename`` call. " +"Specifically, when a sub-module is imported, this mechanism prepends the " +"parent package name to the name of the module." +msgstr "" +"为解决 ``PyInit_modulename`` 函数不接受 *spec* 参数的限制,导入机制会保存部分状态,并在 " +"``PyInit_modulename`` 调用期间将其应用于首个匹配的模块对象。具体表现为:当导入子模块时,该机制会将父包名称自动前置到模块名前。" + +#: ../../c-api/extension-modules.rst:329 +msgid "" +"A single-phase ``PyInit_modulename`` function should create “its” module " +"object as soon as possible, before any other module objects can be created." +msgstr "单阶段 ``PyInit_modulename`` 函数应当尽早创建\"其所属\"模块对象,该操作需在任何其他模块对象创建之前完成。" + +#: ../../c-api/extension-modules.rst:332 +msgid "Non-ASCII module names (``PyInitU_modulename``) are not supported." +msgstr "不支持非 ASCII 模块名 (``PyInitU_modulename``)。" + +#: ../../c-api/extension-modules.rst:334 +msgid "" +"Single-phase modules support module lookup functions like " +":c:func:`PyState_FindModule`." +msgstr "单阶段模块支持模块查找函数如 :c:func:`PyState_FindModule`。" + +#: ../../c-api/extension-modules.rst:337 +msgid "The module's :c:member:`PyModuleDef.m_slots` must be NULL." +msgstr "" + +#: ../../c-api/extension-modules.rst:339 +msgid "" +"``_testsinglephase`` is an internal module used in CPython's self-test " +"suite; your installation may or may not include it." +msgstr "``_testsinglephase`` 是一个在 CPython 的自我测试套件中使用的内部模块;你的安装版可能包括它也可能不包括它。" diff --git a/c-api/file.po b/c-api/file.po new file mode 100644 index 0000000000..7af395a06c --- /dev/null +++ b/c-api/file.po @@ -0,0 +1,243 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/file.rst:6 +msgid "File objects" +msgstr "" + +#: ../../c-api/file.rst:10 +msgid "" +"These APIs are a minimal emulation of the Python 2 C API for built-in file " +"objects, which used to rely on the buffered I/O (:c:expr:`FILE*`) support " +"from the C standard library. In Python 3, files and streams use the new " +":mod:`io` module, which defines several layers over the low-level unbuffered" +" I/O of the operating system. The functions described below are convenience" +" C wrappers over these new APIs, and meant mostly for internal error " +"reporting in the interpreter; third-party code is advised to access the " +":mod:`io` APIs instead." +msgstr "" +"这些 API 是对内置文件对象的 Python 2 C API 的最小化模拟,它过去依赖于 C 标准库的带缓冲 I/O " +"(:c:expr:`FILE*`) 支持。在 Python 3 中,文件和流使用新的 :mod:`io` 模块,它在操作系统的低层级无缓冲 I/O " +"之上定义了几个层。下面介绍的函数是针对这些新 API 的便捷 C 包装器,主要用于解释器的内部错误报告;建议第三方代码改为访问 :mod:`io` " +"API 接口。" + +#: ../../c-api/file.rst:22 +msgid "" +"Create a Python file object from the file descriptor of an already opened " +"file *fd*. The arguments *name*, *encoding*, *errors* and *newline* can be " +"``NULL`` to use the defaults; *buffering* can be *-1* to use the default. " +"*name* is ignored and kept for backward compatibility. Return ``NULL`` on " +"failure. For a more comprehensive description of the arguments, please refer" +" to the :func:`io.open` function documentation." +msgstr "" +"根据已打开文件 *fd* 的文件描述符创建一个 Python 文件对象。参数 *name*, *encoding*, *errors* 和 " +"*newline* 可以为 ``NULL`` 表示使用默认值;*buffering* 可以为 *-1* 表示使用默认值。 *name* " +"会被忽略仅保留用于向下兼容。失败时返回 ``NULL``。有关参数的更全面描述,请参阅 :func:`io.open` 函数的文档。" + +#: ../../c-api/file.rst:31 +msgid "" +"Since Python streams have their own buffering layer, mixing them with OS-" +"level file descriptors can produce various issues (such as unexpected " +"ordering of data)." +msgstr "由于 Python 流具有自己的缓冲层,因此将它们与 OS 级文件描述符混合会产生各种问题(例如数据的意外排序)。" + +#: ../../c-api/file.rst:35 +msgid "Ignore *name* attribute." +msgstr "忽略 *name* 属性。" + +#: ../../c-api/file.rst:41 +msgid "" +"Return the file descriptor associated with *p* as an :c:expr:`int`. If the " +"object is an integer, its value is returned. If not, the object's " +":meth:`~io.IOBase.fileno` method is called if it exists; the method must " +"return an integer, which is returned as the file descriptor value. Sets an " +"exception and returns ``-1`` on failure." +msgstr "" +"将与 *p* 关联的文件描述符作为 :c:expr:`int` 返回。如果对象是整数,则返回其值。如果不是,则如果对象存在 " +":meth:`~io.IOBase.fileno` 方法则调用该方法;该方法必须返回一个整数,它将作为文件描述符的值返回。失败时将设置异常并返回 " +"``-1``。" + +#: ../../c-api/file.rst:52 +msgid "" +"Equivalent to ``p.readline([n])``, this function reads one line from the " +"object *p*. *p* may be a file object or any object with a " +":meth:`~io.IOBase.readline` method. If *n* is ``0``, exactly one line is " +"read, regardless of the length of the line. If *n* is greater than ``0``, " +"no more than *n* bytes will be read from the file; a partial line can be " +"returned. In both cases, an empty string is returned if the end of the file" +" is reached immediately. If *n* is less than ``0``, however, one line is " +"read regardless of length, but :exc:`EOFError` is raised if the end of the " +"file is reached immediately." +msgstr "" +"等价于 ``p.readline([n])``,这个函数从对象 *p* 中读取一行。 *p* 可以是文件对象或具有 " +":meth:`~io.IOBase.readline` 方法的任何对象。如果 *n* 是 ``0``,则无论该行的长度如何,都会读取一行。如果 *n* " +"大于 ``0``,则从文件中读取不超过 *n* 个字节;可以返回行的一部分。在这两种情况下,如果立即到达文件末尾,则返回空字符串。但是,如果 *n* " +"小于 ``0``,则无论长度如何都会读取一行,但是如果立即到达文件末尾,则引发 :exc:`EOFError`。" + +#: ../../c-api/file.rst:65 +msgid "" +"Overrides the normal behavior of :func:`io.open_code` to pass its parameter " +"through the provided handler." +msgstr "重写 :func:`io.open_code` 的正常行为,将其形参通过所提供的处理程序来传递。" + +#: ../../c-api/file.rst:68 +msgid "The *handler* is a function of type:" +msgstr "*handler* 函数的类型为:" + +#: ../../c-api/file.rst:73 +msgid "" +"Equivalent of :c:expr:`PyObject *(\\*)(PyObject *path, void *userData)`, " +"where *path* is guaranteed to be :c:type:`PyUnicodeObject`." +msgstr "" +"等价于 :c:expr:`PyObject *(\\*)(PyObject *path, void *userData)`,其中 *path* 会确保为" +" :c:type:`PyUnicodeObject` 类型对象。" + +#: ../../c-api/file.rst:77 +msgid "" +"The *userData* pointer is passed into the hook function. Since hook " +"functions may be called from different runtimes, this pointer should not " +"refer directly to Python state." +msgstr "*userData* 指针会被传入钩子函数。由于钩子函数可能由不同的运行时调用,该指针不应直接指向 Python 状态。" + +#: ../../c-api/file.rst:81 +msgid "" +"As this hook is intentionally used during import, avoid importing new " +"modules during its execution unless they are known to be frozen or available" +" in ``sys.modules``." +msgstr "鉴于这个钩子是在导入期间有意使用的,请避免在其执行期间导入新模块,除非已知它们为冻结状态或者是在 ``sys.modules`` 中可用。" + +#: ../../c-api/file.rst:85 +msgid "" +"Once a hook has been set, it cannot be removed or replaced, and later calls " +"to :c:func:`PyFile_SetOpenCodeHook` will fail. On failure, the function " +"returns -1 and sets an exception if the interpreter has been initialized." +msgstr "" +"一旦钩子被设定,它就不能被移除或替换,之后对 :c:func:`PyFile_SetOpenCodeHook` " +"的调用也将失败,如果解释器已经被初始化,函数将返回 -1 并设置一个异常。" + +#: ../../c-api/file.rst:89 +msgid "This function is safe to call before :c:func:`Py_Initialize`." +msgstr "此函数可以安全地在 :c:func:`Py_Initialize` 之前调用。" + +#: ../../c-api/file.rst:91 +msgid "" +"Raises an :ref:`auditing event ` ``setopencodehook`` with no " +"arguments." +msgstr "引发一个不带参数的 :ref:`审计事件 ` ``setopencodehook``。" + +#: ../../c-api/file.rst:98 +msgid "" +"Open *path* with the mode ``'rb'``. *path* must be a Python :class:`str` " +"object. The behavior of this function may be overridden by " +":c:func:`PyFile_SetOpenCodeHook` to allow for some preprocessing of the " +"text." +msgstr "" +"使用 ``'rb'`` 模式打开 *path*。 *path* 必须是一个 Python :class:`str` 对象。此函数的行为可能被 " +":c:func:`PyFile_SetOpenCodeHook` 重写以允许对文本进行某些预处理。" + +#: ../../c-api/file.rst:103 +msgid "This is analogous to :func:`io.open_code` in Python." +msgstr "这对应于 Python 中的 :func:`io.open_code`。" + +#: ../../c-api/file.rst:105 +msgid "" +"On success, this function returns a :term:`strong reference` to a Python " +"file object. On failure, this function returns ``NULL`` with an exception " +"set." +msgstr "" +"成功时,此函数将返回一个指向 Python 文件对象的 :term:`strong reference`。失败时,此函数将返回 ``NULL`` " +"并设置一个异常。" + +#: ../../c-api/file.rst:114 +msgid "" +"Similar to :c:func:`PyFile_OpenCodeObject`, but *path* is a UTF-8 encoded " +":c:expr:`const char*`." +msgstr "" +"类似于 :c:func:`PyFile_OpenCodeObject`,但 *path* 是一个 UTF-8 编码的 :c:expr:`const " +"char*` 字符串。" + +#: ../../c-api/file.rst:124 +msgid "" +"Write object *obj* to file object *p*. The only supported flag for *flags* " +"is :c:macro:`Py_PRINT_RAW`; if given, the :func:`str` of the object is " +"written instead of the :func:`repr`." +msgstr "" + +#: ../../c-api/file.rst:128 +msgid "If *obj* is ``NULL``, write the string ``\"\"``." +msgstr "" + +#: ../../c-api/file.rst:130 +msgid "" +"Return ``0`` on success or ``-1`` on failure; the appropriate exception will" +" be set." +msgstr "" + +#: ../../c-api/file.rst:135 +msgid "" +"Write string *s* to file object *p*. Return ``0`` on success or ``-1`` on " +"failure; the appropriate exception will be set." +msgstr "将字符串 *s* 写入文件对象 *p*。成功返回 ``0`` 失败返回 ``-1``;将设定相应的异常。" + +#: ../../c-api/file.rst:140 +msgid "Soft-deprecated API" +msgstr "" + +#: ../../c-api/file.rst:144 +msgid "" +"These are APIs that were included in Python's C API by mistake. They are " +"documented solely for completeness; use other ``PyFile*`` APIs instead." +msgstr "" + +#: ../../c-api/file.rst:150 +msgid "" +"Use :c:func:`PyFile_FromFd` with defaults (``fd, NULL, \"w\", -1, NULL, " +"NULL, NULL, 0``) instead." +msgstr "" +"请改用 :c:func:`PyFile_FromFd` 并保持默认值 (``fd, NULL, \"w\", -1, NULL, NULL, NULL," +" 0``)。" + +#: ../../c-api/file.rst:154 +msgid "" +"Type of file-like objects used internally at Python startup when " +":py:mod:`io` is not yet available. Use Python :py:func:`open` or " +":c:func:`PyFile_FromFd` to create file objects instead." +msgstr "" +"在 Python 启动期间当 :py:mod:`io` 尚不可用时内部使用的文件型对象的类型。请改用 Python :py:func:`open` 或 " +":c:func:`PyFile_FromFd` 来创建文件对象。" + +#: ../../c-api/file.rst:8 +msgid "object" +msgstr "object -- 对象" + +#: ../../c-api/file.rst:8 +msgid "file" +msgstr "文件" + +#: ../../c-api/file.rst:50 +msgid "EOFError (built-in exception)" +msgstr "EOFError (内置异常)" + +#: ../../c-api/file.rst:122 +msgid "Py_PRINT_RAW (C macro)" +msgstr "Py_PRINT_RAW (C 宏)" diff --git a/c-api/float.po b/c-api/float.po new file mode 100644 index 0000000000..6641c5cc91 --- /dev/null +++ b/c-api/float.po @@ -0,0 +1,351 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:00+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/float.rst:6 +msgid "Floating-Point Objects" +msgstr "浮点数对象" + +#: ../../c-api/float.rst:13 +msgid "" +"This subtype of :c:type:`PyObject` represents a Python floating-point " +"object." +msgstr "这个 :c:type:`PyObject` 的子类型代表一个 Python 浮点数对象。" + +#: ../../c-api/float.rst:18 +msgid "" +"This instance of :c:type:`PyTypeObject` represents the Python floating-point" +" type. This is the same object as :class:`float` in the Python layer." +msgstr "" +"这个 :c:type:`PyTypeObject` 实例代表 Python 浮点数类型。这与 Python 层面的 :class:`float` " +"是同一个对象。" + +#: ../../c-api/float.rst:24 +msgid "" +"Return true if its argument is a :c:type:`PyFloatObject` or a subtype of " +":c:type:`PyFloatObject`. This function always succeeds." +msgstr "" +"如果它的参数是一个 :c:type:`PyFloatObject` 或者 :c:type:`PyFloatObject` 的子类型则返回真值。 " +"此函数总是会成功执行。" + +#: ../../c-api/float.rst:30 +msgid "" +"Return true if its argument is a :c:type:`PyFloatObject`, but not a subtype " +"of :c:type:`PyFloatObject`. This function always succeeds." +msgstr "" +"如果它的参数是一个 :c:type:`PyFloatObject` 但不是 :c:type:`PyFloatObject` 的子类型则返回真值。 " +"此函数总是会成功执行。" + +#: ../../c-api/float.rst:36 +msgid "" +"Create a :c:type:`PyFloatObject` object based on the string value in *str*, " +"or ``NULL`` on failure." +msgstr "根据字符串 *str* 的值创建一个 :c:type:`PyFloatObject`,失败时返回 ``NULL``。" + +#: ../../c-api/float.rst:42 +msgid "" +"Create a :c:type:`PyFloatObject` object from *v*, or ``NULL`` on failure." +msgstr "根据 *v* 创建一个 :c:type:`PyFloatObject` 对象,失败时返回 ``NULL``。" + +#: ../../c-api/float.rst:47 +msgid "" +"Return a C :c:expr:`double` representation of the contents of *pyfloat*. If" +" *pyfloat* is not a Python floating-point object but has a " +":meth:`~object.__float__` method, this method will first be called to " +"convert *pyfloat* into a float. If :meth:`!__float__` is not defined then it" +" falls back to :meth:`~object.__index__`. This method returns ``-1.0`` upon " +"failure, so one should call :c:func:`PyErr_Occurred` to check for errors." +msgstr "" +"返回 *pyfloat* 的内容的 C :c:expr:`double` 表示形式。如果 *pyfloat* 不是一个 Python 浮点数对象但是具有" +" :meth:`~object.__float__` 方法,则会先调用此方法来将 *pyfloat* 转换为浮点数。如果 " +":meth:`!__float__` 未定义则将回退至 :meth:`~object.__index__`。此方法在失败时将返回 " +"``-1.0``,因此开发者应当调用 :c:func:`PyErr_Occurred` 来检测错误。" + +#: ../../c-api/float.rst:54 +msgid "Use :meth:`~object.__index__` if available." +msgstr "如果可能将使用 :meth:`~object.__index__`。" + +#: ../../c-api/float.rst:60 +msgid "" +"Return a C :c:expr:`double` representation of the contents of *pyfloat*, but" +" without error checking." +msgstr "返回 *pyfloat* 的 C :c:expr:`double` 表示形式,但不带错误检测。" + +#: ../../c-api/float.rst:66 +msgid "" +"Return a structseq instance which contains information about the precision, " +"minimum and maximum values of a float. It's a thin wrapper around the header" +" file :file:`float.h`." +msgstr "" +"返回一个 structseq 实例,其中包含有关 float 的精度、最小值和最大值的信息。它是头文件 :file:`float.h` 的一个简单包装。" + +#: ../../c-api/float.rst:73 +msgid "" +"Return the maximum representable finite float *DBL_MAX* as C " +":c:expr:`double`." +msgstr "返回 C :c:expr:`double` 形式的最大可表示有限浮点数 *DBL_MAX*。" + +#: ../../c-api/float.rst:78 +msgid "" +"Return the minimum normalized positive float *DBL_MIN* as C " +":c:expr:`double`." +msgstr "返回 C :c:expr:`double` 形式的最小正规化正浮点数 *DBL_MIN*。" + +#: ../../c-api/float.rst:83 +msgid "" +"This macro expands to a constant expression of type :c:expr:`double`, that " +"represents the positive infinity." +msgstr "这个宏会扩展为一个 :c:expr:`double` 类型的常量表达式,它代表正无穷大。" + +#: ../../c-api/float.rst:86 +msgid "" +"It is equivalent to the :c:macro:`!INFINITY` macro from the C11 standard " +"```` header." +msgstr "" + +#: ../../c-api/float.rst:94 +msgid "" +"This macro expands to a constant expression of type :c:expr:`double`, that " +"represents a quiet not-a-number (qNaN) value." +msgstr "" +"这个宏会扩展为一个 :c:expr:`double` 类型的常量表达式,它代表一个 quiet not-a-number (qNaN) 值。" + +#: ../../c-api/float.rst:97 +msgid "" +"On most platforms, this is equivalent to the :c:macro:`!NAN` macro from the " +"C11 standard ```` header." +msgstr "在大多数平台上,这等价于 C11 标准 ```` 头文件中的 :c:macro:`!NAN` 宏。" + +#: ../../c-api/float.rst:103 +msgid "Equivalent to :c:macro:`!INFINITY`." +msgstr "等价于 :c:macro:`!INFINITY`。" + +#: ../../c-api/float.rst:110 +msgid "" +"The definition (accurate for a :c:expr:`double` type) of the :data:`math.e` " +"constant." +msgstr ":data:`math.e` 常量的定义(基于 :c:expr:`double` 类型的精度)。" + +#: ../../c-api/float.rst:115 +msgid "High precision (long double) definition of :data:`~math.e` constant." +msgstr "高精度 (long double) 的 :data:`~math.e` 常量定义。" + +#: ../../c-api/float.rst:122 +msgid "" +"The definition (accurate for a :c:expr:`double` type) of the :data:`math.pi`" +" constant." +msgstr ":data:`math.pi` 常量的定义(基于 :c:expr:`double` 类型的精度)。" + +#: ../../c-api/float.rst:127 +msgid "High precision (long double) definition of :data:`~math.pi` constant." +msgstr "高精度 (long double) 的 :data:`~math.pi` 常量定义。" + +#: ../../c-api/float.rst:134 +msgid "" +"The definition (accurate for a :c:expr:`double` type) of the " +":data:`math.tau` constant." +msgstr ":data:`math.tau` 常量的定义(基于 :c:expr:`double` 类型的精度)。" + +#: ../../c-api/float.rst:141 +msgid "Return :data:`math.nan` from a function." +msgstr "从一个函数返回 :data:`math.nan`。" + +#: ../../c-api/float.rst:143 +msgid "" +"On most platforms, this is equivalent to ``return PyFloat_FromDouble(NAN)``." +msgstr "在大多数平台上,这等价于 ``return PyFloat_FromDouble(NAN)``。" + +#: ../../c-api/float.rst:148 +msgid "" +"Return :data:`math.inf` or :data:`-math.inf ` from a function, " +"depending on the sign of *sign*." +msgstr "" +"从一个函数返回 :data:`math.inf` 或 :data:`-math.inf `,具体取决于 *sign* 的符号值。" + +#: ../../c-api/float.rst:151 +msgid "On most platforms, this is equivalent to the following::" +msgstr "在大多数平台上,这等价于以下代码::" + +#: ../../c-api/float.rst:153 +msgid "return PyFloat_FromDouble(copysign(INFINITY, sign));" +msgstr "return PyFloat_FromDouble(copysign(INFINITY, sign));" + +#: ../../c-api/float.rst:158 +msgid "" +"Return ``1`` if the given floating-point number *X* is finite, that is, it " +"is normal, subnormal or zero, but not infinite or NaN. Return ``0`` " +"otherwise." +msgstr "如果给定的浮点数 *X* 为有限值,即为规格数、非规格数或零,而不是无穷大或 NaN 则返回 ``1``。否则返回 ``0``。" + +#: ../../c-api/float.rst:162 +msgid "Use :c:macro:`!isfinite` instead." +msgstr "" + +#: ../../c-api/float.rst:168 +msgid "" +"Return ``1`` if the given floating-point number *X* is positive or negative " +"infinity. Return ``0`` otherwise." +msgstr "如果给定的浮点数 *X* 为正或负无穷大则返回 ``1``。否则返回 ``0``。" + +#: ../../c-api/float.rst:171 +msgid "Use :c:macro:`!isinf` instead." +msgstr "" + +#: ../../c-api/float.rst:177 +msgid "" +"Return ``1`` if the given floating-point number *X* is a not-a-number (NaN) " +"value. Return ``0`` otherwise." +msgstr "如果给定的浮点数 *X* 为非数字 (NaN) 值则返回 ``1``。否则返回 ``0``。" + +#: ../../c-api/float.rst:180 +msgid "Use :c:macro:`!isnan` instead." +msgstr "" + +#: ../../c-api/float.rst:185 +msgid "Pack and Unpack functions" +msgstr "打包与解包函数" + +#: ../../c-api/float.rst:187 +msgid "" +"The pack and unpack functions provide an efficient platform-independent way " +"to store floating-point values as byte strings. The Pack routines produce a " +"bytes string from a C :c:expr:`double`, and the Unpack routines produce a C " +":c:expr:`double` from such a bytes string. The suffix (2, 4 or 8) specifies " +"the number of bytes in the bytes string:" +msgstr "" + +#: ../../c-api/float.rst:193 +msgid "The 2-byte format is the IEEE 754 binary16 half-precision format." +msgstr "" + +#: ../../c-api/float.rst:194 +msgid "The 4-byte format is the IEEE 754 binary32 single-precision format." +msgstr "" + +#: ../../c-api/float.rst:195 +msgid "The 8-byte format is the IEEE 754 binary64 double-precision format." +msgstr "" + +#: ../../c-api/float.rst:197 +msgid "" +"The NaN type may not be preserved on some platforms while unpacking " +"(signaling NaNs become quiet NaNs), for example on x86 systems in 32-bit " +"mode." +msgstr "" + +#: ../../c-api/float.rst:200 +msgid "" +"It's assumed that the :c:expr:`double` type has the IEEE 754 binary64 double" +" precision format. What happens if it's not true is partly accidental " +"(alas). On non-IEEE platforms with more precision, or larger dynamic range, " +"than IEEE 754 supports, not all values can be packed; on non-IEEE platforms " +"with less precision, or smaller dynamic range, not all values can be " +"unpacked. The packing of special numbers like INFs and NaNs (if such things" +" exist on the platform) may not be handled correctly, and attempting to " +"unpack a bytes string containing an IEEE INF or NaN may raise an exception." +msgstr "" + +#: ../../c-api/float.rst:212 +msgid "Pack functions" +msgstr "打包函数" + +#: ../../c-api/float.rst:214 +msgid "" +"The pack routines write 2, 4 or 8 bytes, starting at *p*. *le* is an " +":c:expr:`int` argument, non-zero if you want the bytes string in little-" +"endian format (exponent last, at ``p+1``, ``p+3``, or ``p+6`` and ``p+7``), " +"zero if you want big-endian format (exponent first, at *p*). Use the " +":c:macro:`!PY_LITTLE_ENDIAN` constant to select the native endian: it is " +"equal to ``0`` on big endian processor, or ``1`` on little endian processor." +msgstr "" + +#: ../../c-api/float.rst:221 +msgid "" +"Return value: ``0`` if all is OK, ``-1`` if error (and an exception is set, " +"most likely :exc:`OverflowError`)." +msgstr "" +"返回值:如果一切正常则为 ``0``,如果出错则为 ``-1`` (并会设置一个异常,最大可能为 :exc:`OverflowError`)。" + +#: ../../c-api/float.rst:226 +msgid "Pack a C double as the IEEE 754 binary16 half-precision format." +msgstr "将 C double 打包为 IEEE 754 binary16 半精度格式。" + +#: ../../c-api/float.rst:230 +msgid "Pack a C double as the IEEE 754 binary32 single precision format." +msgstr "将 C double 打包为 IEEE 754 binary32 单精度格式。" + +#: ../../c-api/float.rst:234 +msgid "Pack a C double as the IEEE 754 binary64 double precision format." +msgstr "将 C double 打包为 IEEE 754 binary64 双精度格式。" + +#: ../../c-api/float.rst:237 +msgid "This function always succeeds in CPython." +msgstr "" + +#: ../../c-api/float.rst:241 +msgid "Unpack functions" +msgstr "解包函数" + +#: ../../c-api/float.rst:243 +msgid "" +"The unpack routines read 2, 4 or 8 bytes, starting at *p*. *le* is an " +":c:expr:`int` argument, non-zero if the bytes string is in little-endian " +"format (exponent last, at ``p+1``, ``p+3`` or ``p+6`` and ``p+7``), zero if " +"big-endian (exponent first, at *p*). Use the :c:macro:`!PY_LITTLE_ENDIAN` " +"constant to select the native endian: it is equal to ``0`` on big endian " +"processor, or ``1`` on little endian processor." +msgstr "" + +#: ../../c-api/float.rst:250 +msgid "" +"Return value: The unpacked double. On error, this is ``-1.0`` and " +":c:func:`PyErr_Occurred` is true (and an exception is set, most likely " +":exc:`OverflowError`)." +msgstr "" +"返回值:解包后的 double。出错时,返回值为 ``-1.0`` 且 :c:func:`PyErr_Occurred` 为真值 " +"(并且会设置一个异常,最大可能为 :exc:`OverflowError`)。" + +#: ../../c-api/float.rst:255 +msgid "These functions always succeed in CPython." +msgstr "" + +#: ../../c-api/float.rst:259 +msgid "Unpack the IEEE 754 binary16 half-precision format as a C double." +msgstr "将 IEEE 754 binary16 半精度格式解包为 C double。" + +#: ../../c-api/float.rst:263 +msgid "Unpack the IEEE 754 binary32 single precision format as a C double." +msgstr "将 IEEE 754 binary32 单精度格式解包为 C double。" + +#: ../../c-api/float.rst:267 +msgid "Unpack the IEEE 754 binary64 double precision format as a C double." +msgstr "将 IEEE 754 binary64 双精度格式解包为 C double。" + +#: ../../c-api/float.rst:8 +msgid "object" +msgstr "object -- 对象" + +#: ../../c-api/float.rst:8 +msgid "floating-point" +msgstr "浮点数" diff --git a/c-api/frame.po b/c-api/frame.po new file mode 100644 index 0000000000..d540907b6a --- /dev/null +++ b/c-api/frame.po @@ -0,0 +1,292 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/frame.rst:4 +msgid "Frame objects" +msgstr "帧对象" + +#: ../../c-api/frame.rst:8 +msgid "The C structure of the objects used to describe frame objects." +msgstr "用于描述帧对象的对象的 C 结构体。" + +#: ../../c-api/frame.rst:10 +msgid "There are no public members in this structure." +msgstr "此结构体中无公有成员。" + +#: ../../c-api/frame.rst:12 +msgid "" +"The members of this structure were removed from the public C API. Refer to " +"the :ref:`What's New entry ` for details." +msgstr "" +"此结构体的成员已从公有 C API 中移除。请参阅 :ref:`What's New entry " +"` 了解详情。" + +#: ../../c-api/frame.rst:17 +msgid "" +"The :c:func:`PyEval_GetFrame` and :c:func:`PyThreadState_GetFrame` functions" +" can be used to get a frame object." +msgstr "" +"可以使用函数 :c:func:`PyEval_GetFrame` 与 :c:func:`PyThreadState_GetFrame` " +"去获取一个帧对象。" + +#: ../../c-api/frame.rst:20 +msgid "See also :ref:`Reflection `." +msgstr "另请参阅 :ref:`Reflection `。" + +#: ../../c-api/frame.rst:24 +msgid "" +"The type of frame objects. It is the same object as " +":py:class:`types.FrameType` in the Python layer." +msgstr "帧对象的类型。它与 Python 层中的 :py:class:`types.FrameType` 是同一对象。" + +#: ../../c-api/frame.rst:29 +msgid "" +"Previously, this type was only available after including " +"````." +msgstr "在之前版本中,此类型仅在包含 ```` 之后可用。" + +#: ../../c-api/frame.rst:34 +msgid "" +"Create a new frame object. This function returns a :term:`strong reference` " +"to the new frame object on success, and returns ``NULL`` with an exception " +"set on failure." +msgstr "" +"新建一个帧对象。此函数成功时将返回一个指向新帧对象的 :term:`strong reference`,失败时则返回 ``NULL`` 并设置一个异常。" + +#: ../../c-api/frame.rst:40 +msgid "Return non-zero if *obj* is a frame object." +msgstr "如果 *obj* 是一个帧对象则返回非零值。" + +#: ../../c-api/frame.rst:44 +msgid "" +"Previously, this function was only available after including " +"````." +msgstr "在之前版本中,此函数仅在包含 ```` 之后可用。" + +#: ../../c-api/frame.rst:49 +msgid "Get the *frame* next outer frame." +msgstr "获取 *frame* 的下一个外部帧。" + +#: ../../c-api/frame.rst:51 +msgid "" +"Return a :term:`strong reference`, or ``NULL`` if *frame* has no outer " +"frame. This raises no exceptions." +msgstr "" +"返回一个 :term:`strong reference`,或者如果 *frame* 没有外部帧则返回 ``NULL``。 此函数不会引发异常。" + +#: ../../c-api/frame.rst:60 +msgid "Get the *frame*'s :attr:`~frame.f_builtins` attribute." +msgstr "获取 *frame* 的 :attr:`~frame.f_builtins` 属性。" + +#: ../../c-api/frame.rst:62 ../../c-api/frame.rst:93 +msgid "Return a :term:`strong reference`. The result cannot be ``NULL``." +msgstr "返回一个 :term:`strong reference`。此结果不可为 ``NULL``。" + +#: ../../c-api/frame.rst:69 +msgid "Get the *frame* code." +msgstr "获取 *frame* 的代码。" + +#: ../../c-api/frame.rst:71 ../../c-api/frame.rst:137 +msgid "Return a :term:`strong reference`." +msgstr "返回一个 :term:`strong reference`。" + +#: ../../c-api/frame.rst:73 +msgid "The result (frame code) cannot be ``NULL``." +msgstr "结果(帧代码)不可为 ``NULL``。" + +#: ../../c-api/frame.rst:80 +msgid "" +"Get the generator, coroutine, or async generator that owns this frame, or " +"``NULL`` if this frame is not owned by a generator. Does not raise an " +"exception, even if the return value is ``NULL``." +msgstr "" +"获取拥有该帧的生成器、协程或异步生成器,或者如果该帧不被某个生成器所拥有则为 ``NULL``。不会引发异常,即使其返回值为 ``NULL``。" + +#: ../../c-api/frame.rst:84 +msgid "Return a :term:`strong reference`, or ``NULL``." +msgstr "返回一个 :term:`strong reference`,或者 ``NULL``。" + +#: ../../c-api/frame.rst:91 +msgid "Get the *frame*'s :attr:`~frame.f_globals` attribute." +msgstr "获取 *frame* 的 :attr:`~frame.f_globals` 属性。" + +#: ../../c-api/frame.rst:100 +msgid "Get the *frame*'s :attr:`~frame.f_lasti` attribute." +msgstr "获取 *frame* 的 :attr:`~frame.f_lasti` 属性。" + +#: ../../c-api/frame.rst:102 +msgid "Returns -1 if ``frame.f_lasti`` is ``None``." +msgstr "如果 ``frame.f_lasti`` 为 ``None`` 则返回 -1。" + +#: ../../c-api/frame.rst:109 +msgid "Get the variable *name* of *frame*." +msgstr "获取 *frame* 的变量 *name*。" + +#: ../../c-api/frame.rst:111 +msgid "Return a :term:`strong reference` to the variable value on success." +msgstr "成功时返回一个指向变量值的 :term:`strong reference`。" + +#: ../../c-api/frame.rst:112 +msgid "" +"Raise :exc:`NameError` and return ``NULL`` if the variable does not exist." +msgstr "如果该变量不存在,则引发 :exc:`NameError` 并返回 ``NULL``。" + +#: ../../c-api/frame.rst:113 +msgid "Raise an exception and return ``NULL`` on error." +msgstr "如果出错,则引发异常并返回 ``NULL``。" + +#: ../../c-api/frame.rst:115 +msgid "*name* type must be a :class:`str`." +msgstr "*name* 必须是 :class:`str` 类型的。" + +#: ../../c-api/frame.rst:122 +msgid "" +"Similar to :c:func:`PyFrame_GetVar`, but the variable name is a C string " +"encoded in UTF-8." +msgstr "和 :c:func:`PyFrame_GetVar` 相似,但该变量名是一个使用 UTF-8 编码的 C 字符串。" + +#: ../../c-api/frame.rst:130 +msgid "" +"Get the *frame*'s :attr:`~frame.f_locals` attribute. If the frame refers to " +"an :term:`optimized scope`, this returns a write-through proxy object that " +"allows modifying the locals. In all other cases (classes, modules, " +":func:`exec`, :func:`eval`) it returns the mapping representing the frame " +"locals directly (as described for :func:`locals`)." +msgstr "" +"获取 *frame* 的 :attr:`~frame.f_locals` 属性。如果该帧指向一个 :term:`optimized " +"scope`,这将返回一个允许修改 locals 的直写代理对象。在所有其他情况下 (类、模块、:func:`exec`、:func:`eval`) " +"它将直接返回代表该帧的 locals 的映射 (如为 :func:`locals` 所描述的)。" + +#: ../../c-api/frame.rst:141 +msgid "" +"As part of :pep:`667`, return an instance of " +":c:var:`PyFrameLocalsProxy_Type`." +msgstr "作为 :pep:`667` 的组成部分,返回一个 :c:var:`PyFrameLocalsProxy_Type` 的实例。" + +#: ../../c-api/frame.rst:147 +msgid "Return the line number that *frame* is currently executing." +msgstr "返回 *frame* 当前正在执行的行号。" + +#: ../../c-api/frame.rst:151 +msgid "Frame locals proxies" +msgstr "" + +#: ../../c-api/frame.rst:155 +msgid "" +"The :attr:`~frame.f_locals` attribute on a :ref:`frame object ` is an instance of a \"frame-locals proxy\". The proxy object " +"exposes a write-through view of the underlying locals dictionary for the " +"frame. This ensures that the variables exposed by ``f_locals`` are always up" +" to date with the live local variables in the frame itself." +msgstr "" +":ref:`帧对象 ` 的 :attr:`~frame.f_locals` 属性是“帧 locals 代理”的一个实例。 " +"该代理对象将对外公开一个下层帧 locals 字典的直写视图。这确保了由 ``f_locals`` 暴露的变量总是与帧本身的现有局部变量内容一致。" + +#: ../../c-api/frame.rst:161 +msgid "See :pep:`667` for more information." +msgstr "请参阅 :pep:`667` 了解详情。" + +#: ../../c-api/frame.rst:165 +msgid "The type of frame :func:`locals` proxy objects." +msgstr "帧 :func:`locals` 代理对象的类型。" + +#: ../../c-api/frame.rst:169 +msgid "Return non-zero if *obj* is a frame :func:`locals` proxy." +msgstr "如果 *obj* 是一个帧 :func:`locals` 代理则返回非零值。" + +#: ../../c-api/frame.rst:173 +msgid "Legacy local variable APIs" +msgstr "" + +#: ../../c-api/frame.rst:175 +msgid "" +"These APIs are :term:`soft deprecated`. As of Python 3.13, they do nothing. " +"They exist solely for backwards compatibility." +msgstr "" +"这些 API 已处于 :term:`soft deprecated` 状态。从 Python 3.13 起,它们不做任何事。 " +"它们的存在只是为了向下兼容。" + +#: ../../c-api/frame.rst:181 +msgid "" +"Prior to Python 3.13, this function would copy the :attr:`~frame.f_locals` " +"attribute of *f* to the internal \"fast\" array of local variables, allowing" +" changes in frame objects to be visible to the interpreter. If *clear* was " +"true, this function would process variables that were unset in the locals " +"dictionary." +msgstr "" +"在 Python 3.13 之前,此函数会将 *f* 的 :attr:`~frame.f_locals` 属性拷贝至内部的由局部变量组成的 " +"\"fast\" 数组,以允许在帧对象中的变化对解释器可见。如果 *clear* 为真值,此函数将处理在 locals 字典中未设置的变量。" + +#: ../../c-api/frame.rst:187 ../../c-api/frame.rst:198 +#: ../../c-api/frame.rst:208 +msgid "This function now does nothing." +msgstr "此函数现在不执行任何操作。" + +#: ../../c-api/frame.rst:193 +msgid "" +"Prior to Python 3.13, this function would copy the internal \"fast\" array " +"of local variables (which is used by the interpreter) to the " +":attr:`~frame.f_locals` attribute of *f*, allowing changes in local " +"variables to be visible to frame objects." +msgstr "" +"在 Python 3.13 之前,此函数会将内部的由(供解释器使用的)局部变量组成的 \"fast\" 数组拷贝至 *f* 的 " +":attr:`~frame.f_locals` 属性,以允许在局部变量中的变化对帧对象可见。" + +#: ../../c-api/frame.rst:204 +msgid "" +"Prior to Python 3.13, this function was similar to " +":c:func:`PyFrame_FastToLocals`, but would return ``0`` on success, and " +"``-1`` with an exception set on failure." +msgstr "" +"在 Python 3.13 之前,此函数类似于 :c:func:`PyFrame_FastToLocals`,但成功时返回 ``0``,而在失败时返回 " +"``-1`` 并设置一个异常。" + +#: ../../c-api/frame.rst:213 +msgid ":pep:`667`" +msgstr ":pep:`667`" + +#: ../../c-api/frame.rst:217 +msgid "Internal frames" +msgstr "" + +#: ../../c-api/frame.rst:219 +msgid "Unless using :pep:`523`, you will not need this." +msgstr "除非使用 :pep:`523`,否则你不会需要它。" + +#: ../../c-api/frame.rst:223 +msgid "The interpreter's internal frame representation." +msgstr "解释器的内部帧表示。" + +#: ../../c-api/frame.rst:229 +msgid "Return a :term:`strong reference` to the code object for the frame." +msgstr "返回一个指向帧的代码对象的 :term:`strong reference`。" + +#: ../../c-api/frame.rst:236 +msgid "Return the byte offset into the last executed instruction." +msgstr "返回最后执行的指令的字节偏移量。" + +#: ../../c-api/frame.rst:243 +msgid "" +"Return the currently executing line number, or -1 if there is no line " +"number." +msgstr "返回当前正在执行的行号,如果没有行号则返回 -1。" diff --git a/c-api/function.po b/c-api/function.po new file mode 100644 index 0000000000..6cdf50e1c3 --- /dev/null +++ b/c-api/function.po @@ -0,0 +1,312 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# Freesand Leo , 2025 +# 99 , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:00+0000\n" +"Last-Translator: 99 , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/function.rst:6 +msgid "Function Objects" +msgstr "Function 对象" + +#: ../../c-api/function.rst:10 +msgid "There are a few functions specific to Python functions." +msgstr "有一些特定于 Python 函数的函数。" + +#: ../../c-api/function.rst:15 +msgid "The C structure used for functions." +msgstr "用于函数的 C 结构体。" + +#: ../../c-api/function.rst:22 +msgid "" +"This is an instance of :c:type:`PyTypeObject` and represents the Python " +"function type. It is exposed to Python programmers as " +"``types.FunctionType``." +msgstr "" +"这是一个 :c:type:`PyTypeObject` 实例并表示 Python 函数类型。它作为 ``types.FunctionType`` 向 " +"Python 程序员公开。" + +#: ../../c-api/function.rst:28 +msgid "" +"Return true if *o* is a function object (has type " +":c:data:`PyFunction_Type`). The parameter must not be ``NULL``. This " +"function always succeeds." +msgstr "" +"如果 *o* 是一个函数对象 (类型为 :c:data:`PyFunction_Type`) 则返回真值。形参必须不为 ``NULL``。 " +"此函数总是会成功执行。" + +#: ../../c-api/function.rst:34 +msgid "" +"Return a new function object associated with the code object *code*. " +"*globals* must be a dictionary with the global variables accessible to the " +"function." +msgstr "返回与代码对象 *code* 关联的新函数对象。 *globals* 必须是一个包含该函数可访问的全局变量的字典。" + +#: ../../c-api/function.rst:37 +msgid "" +"The function's docstring and name are retrieved from the code object. " +":attr:`~function.__module__` is retrieved from *globals*. The argument " +"defaults, annotations and closure are set to ``NULL``. " +":attr:`~function.__qualname__` is set to the same value as the code object's" +" :attr:`~codeobject.co_qualname` field." +msgstr "" +"函数的文档字符串和名称是从代码对象中提取的。:attr:`~function.__module__` 是从 *globals* 中提取的。参数 " +"defaults, annotations 和 closure 被设为 ``NULL``。:attr:`~function.__qualname__` " +"被设为与代码对象的 :attr:`~codeobject.co_qualname` 字段相同的值。" + +#: ../../c-api/function.rst:46 +msgid "" +"As :c:func:`PyFunction_New`, but also allows setting the function object's " +":attr:`~function.__qualname__` attribute. *qualname* should be a unicode " +"object or ``NULL``; if ``NULL``, the :attr:`!__qualname__` attribute is set " +"to the same value as the code object's :attr:`~codeobject.co_qualname` " +"field." +msgstr "" +"类似 :c:func:`PyFunction_New`,但还允许设置函数对象的 :attr:`~function.__qualname__` 属性。 " +"*qualname* 应当是一个 unicode 对象或为 ``NULL``;如为 ``NULL``,则 :attr:`!__qualname__` " +"属性会被设为与代码对象的 :attr:`~codeobject.co_qualname` 字段相同的值。" + +#: ../../c-api/function.rst:57 +msgid "Return the code object associated with the function object *op*." +msgstr "返回与函数对象 *op* 关联的代码对象。" + +#: ../../c-api/function.rst:62 +msgid "" +"Return the globals dictionary associated with the function object *op*." +msgstr "返回与函数对象*op*相关联的全局字典。" + +#: ../../c-api/function.rst:67 +msgid "" +"Return a :term:`borrowed reference` to the :attr:`~function.__module__` " +"attribute of the :ref:`function object ` *op*. It can be" +" *NULL*." +msgstr "" +"向 :ref:`函数对象 ` *op* 的 :attr:`~function.__module__` " +"属性返回一个 :term:`borrowed reference`。该值可以为 *NULL*。" + +#: ../../c-api/function.rst:71 +msgid "" +"This is normally a :class:`string ` containing the module name, but can" +" be set to any other object by Python code." +msgstr "这通常为一个包含模块名称的 :class:`字符串 `,但可以通过 Python 代码设为任何其他对象。" + +#: ../../c-api/function.rst:77 +msgid "" +"Return the argument default values of the function object *op*. This can be " +"a tuple of arguments or ``NULL``." +msgstr "返回函数对象 *op* 的参数默认值。这可以是一个参数元组或 ``NULL``。" + +#: ../../c-api/function.rst:83 +msgid "" +"Set the argument default values for the function object *op*. *defaults* " +"must be ``Py_None`` or a tuple." +msgstr "为函数对象 *op* 设置参数默认值。 *defaults* 必须为 ``Py_None`` 或一个元组。" + +#: ../../c-api/function.rst:86 ../../c-api/function.rst:125 +#: ../../c-api/function.rst:139 +msgid "Raises :exc:`SystemError` and returns ``-1`` on failure." +msgstr "失败时引发 :exc:`SystemError` 异常并返回 ``-1``。" + +#: ../../c-api/function.rst:91 +msgid "Set the vectorcall field of a given function object *func*." +msgstr "设置给定函数对象 *func* 的 vectorcall 字段。" + +#: ../../c-api/function.rst:93 +msgid "" +"Warning: extensions using this API must preserve the behavior of the " +"unaltered (default) vectorcall function!" +msgstr "警告:使用此 API 的扩展必须保留未修改的(默认)vectorcall 函数的行为!" + +#: ../../c-api/function.rst:101 +msgid "" +"Return the keyword-only argument default values of the function object *op*." +" This can be a dictionary of arguments or ``NULL``." +msgstr "返回函数对象 *op* 的仅限关键字参数默认值。这可以是一个参数字典或 ``NULL``。" + +#: ../../c-api/function.rst:107 +msgid "" +"Set the keyword-only argument default values of the function object *op*. " +"*defaults* must be a dictionary of keyword-only arguments or ``Py_None``." +msgstr "设置函数对象 *op* 的仅限关键字参数默认值。 *defaults* 必须是由仅限关键字参数组成的字典或为 ``Py_None``。" + +#: ../../c-api/function.rst:110 +msgid "" +"This function returns ``0`` on success, and returns ``-1`` with an exception" +" set on failure." +msgstr "此函数成功时返回 ``0``,失败时返回 ``-1`` 并设置一个异常。" + +#: ../../c-api/function.rst:116 +msgid "" +"Return the closure associated with the function object *op*. This can be " +"``NULL`` or a tuple of cell objects." +msgstr "返回关联到函数对象 *op* 的闭包。这可以是 ``NULL`` 或 cell 对象的元组。" + +#: ../../c-api/function.rst:122 +msgid "" +"Set the closure associated with the function object *op*. *closure* must be " +"``Py_None`` or a tuple of cell objects." +msgstr "设置关联到函数对象 *op* 的闭包。 *closure* 必须为 ``Py_None`` 或 cell 对象的元组。" + +#: ../../c-api/function.rst:130 +msgid "" +"Return the annotations of the function object *op*. This can be a mutable " +"dictionary or ``NULL``." +msgstr "返回函数对象 *op* 的标注。这可以是一个可变字典或 ``NULL``。" + +#: ../../c-api/function.rst:136 +msgid "" +"Set the annotations for the function object *op*. *annotations* must be a " +"dictionary or ``Py_None``." +msgstr "设置函数对象 *op* 的标注。 *annotations* 必须为一个字典或 ``Py_None``。" + +#: ../../c-api/function.rst:150 +msgid "" +"These functions are similar to their ``PyFunction_Get*`` counterparts, but " +"do not do type checking. Passing anything other than an instance of " +":c:data:`PyFunction_Type` is undefined behavior." +msgstr "" +"这些函数与它们的 ``PyFunction_Get*`` 对应物类似,但不会进行类型检查。传入 :c:data:`PyFunction_Type` " +"的实例以外的任何东西都是未定义的行为。" + +#: ../../c-api/function.rst:157 +msgid "" +"Register *callback* as a function watcher for the current interpreter. " +"Return an ID which may be passed to :c:func:`PyFunction_ClearWatcher`. In " +"case of error (e.g. no more watcher IDs available), return ``-1`` and set an" +" exception." +msgstr "" +"注册 *callback* 作为当前解释器的函数监视器。返回一个可被传给 :c:func:`PyFunction_ClearWatcher` 的 " +"ID。如果出现错误(比如没有足够的可用监视器 ID),则返回 ``-1`` 并设置一个异常。" + +#: ../../c-api/function.rst:167 +msgid "" +"Clear watcher identified by *watcher_id* previously returned from " +":c:func:`PyFunction_AddWatcher` for the current interpreter. Return ``0`` on" +" success, or ``-1`` and set an exception on error (e.g. if the given " +"*watcher_id* was never registered.)" +msgstr "" +"清空当前解释器在之前从 :c:func:`PyFunction_AddWatcher` 返回的由 *watcher_id* 所标识的监视器。成功时返回 " +"``0``,或者出错时(比如当给定的 *watcher_id* 未被注册)返回 ``-1`` 并设置一个异常。" + +#: ../../c-api/function.rst:177 +msgid "Enumeration of possible function watcher events:" +msgstr "由可能的函数监视事件组成的枚举:" + +#: ../../c-api/function.rst:179 +msgid "``PyFunction_EVENT_CREATE``" +msgstr "``PyFunction_EVENT_CREATE``" + +#: ../../c-api/function.rst:180 +msgid "``PyFunction_EVENT_DESTROY``" +msgstr "``PyFunction_EVENT_DESTROY``" + +#: ../../c-api/function.rst:181 +msgid "``PyFunction_EVENT_MODIFY_CODE``" +msgstr "``PyFunction_EVENT_MODIFY_CODE``" + +#: ../../c-api/function.rst:182 +msgid "``PyFunction_EVENT_MODIFY_DEFAULTS``" +msgstr "``PyFunction_EVENT_MODIFY_DEFAULTS``" + +#: ../../c-api/function.rst:183 +msgid "``PyFunction_EVENT_MODIFY_KWDEFAULTS``" +msgstr "``PyFunction_EVENT_MODIFY_KWDEFAULTS``" + +#: ../../c-api/function.rst:187 +msgid "``PyFunction_PYFUNC_EVENT_MODIFY_QUALNAME``" +msgstr "" + +#: ../../c-api/function.rst:193 +msgid "Type of a function watcher callback function." +msgstr "函数监视器回调函数的类型。" + +#: ../../c-api/function.rst:195 +msgid "" +"If *event* is ``PyFunction_EVENT_CREATE`` or ``PyFunction_EVENT_DESTROY`` " +"then *new_value* will be ``NULL``. Otherwise, *new_value* will hold a " +":term:`borrowed reference` to the new value that is about to be stored in " +"*func* for the attribute that is being modified." +msgstr "" +"如果 *event* 为 ``PyFunction_EVENT_CREATE`` 或 ``PyFunction_EVENT_DESTROY`` 则 " +"*new_value* 将为 ``NULL``。在其他情况下,*new_value* 将为被修改的属性持有一个指向要保存在 *func* 中的新值的 " +":term:`borrowed reference` 引用。" + +#: ../../c-api/function.rst:200 +msgid "" +"The callback may inspect but must not modify *func*; doing so could have " +"unpredictable effects, including infinite recursion." +msgstr "该回调可以检查但不能修改 *func*; 这样做可能具有不可预知的影响,包括无限递归。" + +#: ../../c-api/function.rst:203 +msgid "" +"If *event* is ``PyFunction_EVENT_CREATE``, then the callback is invoked " +"after *func* has been fully initialized. Otherwise, the callback is invoked " +"before the modification to *func* takes place, so the prior state of *func* " +"can be inspected. The runtime is permitted to optimize away the creation of " +"function objects when possible. In such cases no event will be emitted. " +"Although this creates the possibility of an observable difference of runtime" +" behavior depending on optimization decisions, it does not change the " +"semantics of the Python code being executed." +msgstr "" +"如果 *event* 是 ``PyFunction_EVENT_CREATE``,则回调会在 *func* " +"完成初始化之后被调用。在其他情况下,回调会在对 *func* 的修改执行之前被调用,这样就可以对 *func* " +"之前的状态进行检查。在可能的情况下运行时允许优化掉函数对象的创建。在此情况下将不发出任何事件。 " +"虽然根据不同的优化决定这会产生可被观察到的运行时行为变化,但是它不会改变所执行的 Python 代码的语义。" + +#: ../../c-api/function.rst:212 +msgid "" +"If *event* is ``PyFunction_EVENT_DESTROY``, taking a reference in the " +"callback to the about-to-be-destroyed function will resurrect it, preventing" +" it from being freed at this time. When the resurrected object is destroyed " +"later, any watcher callbacks active at that time will be called again." +msgstr "" + +#: ../../c-api/function.rst:217 +msgid "" +"If the callback sets an exception, it must return ``-1``; this exception " +"will be printed as an unraisable exception using " +":c:func:`PyErr_WriteUnraisable`. Otherwise it should return ``0``." +msgstr "" +"如果该回调设置了一个异常,则它必须返回 ``-1``;此异常将作为不可引发的异常使用 :c:func:`PyErr_WriteUnraisable` " +"打印出来。在其他情况下它应当返回 ``0``。" + +#: ../../c-api/function.rst:221 +msgid "" +"There may already be a pending exception set on entry to the callback. In " +"this case, the callback should return ``0`` with the same exception still " +"set. This means the callback may not call any other API that can set an " +"exception unless it saves and clears the exception state first, and restores" +" it before returning." +msgstr "" +"在进入回调时可能已经设置了尚未处理的异常。在此情况下,回调应当返回 ``0`` 并仍然设置同样的异常。这意味着该回调可能不会调用任何其他可设置异常的 " +"API 除非它先保存并清空异常状态,并在返回之前恢复它。" + +#: ../../c-api/function.rst:8 +msgid "object" +msgstr "object -- 对象" + +#: ../../c-api/function.rst:8 +msgid "function" +msgstr "function -- 函数" + +#: ../../c-api/function.rst:20 +msgid "MethodType (in module types)" +msgstr "MethodType (types 模块)" diff --git a/c-api/gcsupport.po b/c-api/gcsupport.po new file mode 100644 index 0000000000..e57842ed10 --- /dev/null +++ b/c-api/gcsupport.po @@ -0,0 +1,784 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# 99 , 2026 +# python-doc bot, 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-09 14:43+0000\n" +"PO-Revision-Date: 2025-09-16 00:00+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/gcsupport.rst:6 +msgid "Supporting Cyclic Garbage Collection" +msgstr "使对象类型支持循环垃圾回收" + +#: ../../c-api/gcsupport.rst:8 +msgid "" +"Python's support for detecting and collecting garbage which involves " +"circular references requires support from object types which are " +"\"containers\" for other objects which may also be containers. Types which " +"do not store references to other objects, or which only store references to " +"atomic types (such as numbers or strings), do not need to provide any " +"explicit support for garbage collection." +msgstr "" +"Python " +"对循环引用的垃圾检测与回收需要“容器”对象类型的支持,此类型的容器对象中可能包含其它容器对象。不保存其它对象的引用的类型,或者只保存原子类型(如数字或字符串)的引用的类型,不需要显式提供垃圾回收的支持。" + +#: ../../c-api/gcsupport.rst:15 +msgid "" +"To create a container type, the :c:member:`~PyTypeObject.tp_flags` field of " +"the type object must include the :c:macro:`Py_TPFLAGS_HAVE_GC` and provide " +"an implementation of the :c:member:`~PyTypeObject.tp_traverse` handler. If " +"instances of the type are mutable, a :c:member:`~PyTypeObject.tp_clear` " +"implementation must also be provided." +msgstr "" +"要创建一个容器类,类型对象的 :c:member:`~PyTypeObject.tp_flags` 字段必须包括 " +":c:macro:`Py_TPFLAGS_HAVE_GC` 并提供一个 :c:member:`~PyTypeObject.tp_traverse` " +"处理器的实现。如果该类型的实例是可变的,则还必须提供 :c:member:`~PyTypeObject.tp_clear` 的实现。" + +#: ../../c-api/gcsupport.rst:21 +msgid ":c:macro:`Py_TPFLAGS_HAVE_GC`" +msgstr ":c:macro:`Py_TPFLAGS_HAVE_GC`" + +#: ../../c-api/gcsupport.rst:22 +msgid "" +"Objects with a type with this flag set must conform with the rules " +"documented here. For convenience these objects will be referred to as " +"container objects." +msgstr "设置了此标志位的类型的对象必须符合此处记录的规则。为方便起见,下文把这些对象称为容器对象。" + +#: ../../c-api/gcsupport.rst:26 +msgid "Constructors for container types must conform to two rules:" +msgstr "容器类型的构造函数必须符合两个规则:" + +#: ../../c-api/gcsupport.rst:28 +msgid "" +"The memory for the object must be allocated using :c:macro:`PyObject_GC_New`" +" or :c:macro:`PyObject_GC_NewVar`." +msgstr "" +"该对象的内存必须使用 :c:macro:`PyObject_GC_New` 或 :c:macro:`PyObject_GC_NewVar` 来分配。" + +#: ../../c-api/gcsupport.rst:31 +msgid "" +"Once all the fields which may contain references to other containers are " +"initialized, it must call :c:func:`PyObject_GC_Track`." +msgstr "初始化了所有可能包含其他容器的引用的字段后,它必须调用 :c:func:`PyObject_GC_Track`。" + +#: ../../c-api/gcsupport.rst:34 +msgid "" +"Similarly, the deallocator for the object must conform to a similar pair of " +"rules:" +msgstr "同样的,对象的释放器必须符合两个类似的规则:" + +#: ../../c-api/gcsupport.rst:37 +msgid "" +"Before fields which refer to other containers are invalidated, " +":c:func:`PyObject_GC_UnTrack` must be called." +msgstr "在引用其它容器的字段失效前,必须调用 :c:func:`PyObject_GC_UnTrack`。" + +#: ../../c-api/gcsupport.rst:40 +msgid "" +"The object's memory must be deallocated using :c:func:`PyObject_GC_Del`." +msgstr "必须使用 :c:func:`PyObject_GC_Del` 释放对象的内存。" + +#: ../../c-api/gcsupport.rst:43 +msgid "" +"If a type adds the Py_TPFLAGS_HAVE_GC, then it *must* implement at least a " +":c:member:`~PyTypeObject.tp_traverse` handler or explicitly use one from its" +" subclass or subclasses." +msgstr "" +"如果一个类型添加了 Py_TPFLAGS_HAVE_GC,则它 *必须* 实现至少一个 " +":c:member:`~PyTypeObject.tp_traverse` 句柄或显式地使用来自其一个或多个子类的句柄。" + +#: ../../c-api/gcsupport.rst:47 +msgid "" +"When calling :c:func:`PyType_Ready` or some of the APIs that indirectly call" +" it like :c:func:`PyType_FromSpecWithBases` or :c:func:`PyType_FromSpec` the" +" interpreter will automatically populate the " +":c:member:`~PyTypeObject.tp_flags`, :c:member:`~PyTypeObject.tp_traverse` " +"and :c:member:`~PyTypeObject.tp_clear` fields if the type inherits from a " +"class that implements the garbage collector protocol and the child class " +"does *not* include the :c:macro:`Py_TPFLAGS_HAVE_GC` flag." +msgstr "" +"当调用 :c:func:`PyType_Ready` 或者某些间接调用该函数的 API 如 " +":c:func:`PyType_FromSpecWithBases` 或 :c:func:`PyType_FromSpec` 时解释器将自动填充 " +":c:member:`~PyTypeObject.tp_flags`, :c:member:`~PyTypeObject.tp_traverse` 和 " +":c:member:`~PyTypeObject.tp_clear` 字段,如果该类型是继承自实现了垃圾回收器协议的类并且该子类 *没有* 包括 " +":c:macro:`Py_TPFLAGS_HAVE_GC` 旗标的话。" + +#: ../../c-api/gcsupport.rst:57 +msgid "" +"Analogous to :c:macro:`PyObject_New` but for container objects with the " +":c:macro:`Py_TPFLAGS_HAVE_GC` flag set." +msgstr "" +"类似于 :c:macro:`PyObject_New` 但专用于设置了 :c:macro:`Py_TPFLAGS_HAVE_GC` 旗标的容器对象。" + +#: ../../c-api/gcsupport.rst:60 ../../c-api/gcsupport.rst:84 +msgid "" +"Do not call this directly to allocate memory for an object; call the type's " +":c:member:`~PyTypeObject.tp_alloc` slot instead." +msgstr "请不要直接调用此函数为对象分配内存;而应调用类型的 :c:member:`~PyTypeObject.tp_alloc` 槽位。" + +#: ../../c-api/gcsupport.rst:63 ../../c-api/gcsupport.rst:87 +msgid "" +"When populating a type's :c:member:`~PyTypeObject.tp_alloc` slot, " +":c:func:`PyType_GenericAlloc` is preferred over a custom function that " +"simply calls this macro." +msgstr "" +"在填充类型的 :c:member:`~PyTypeObject.tp_alloc` 槽位时,推荐使用 " +":c:func:`PyType_GenericAlloc` 而不是使用简单调用此宏的自定义函数。" + +#: ../../c-api/gcsupport.rst:67 ../../c-api/gcsupport.rst:91 +msgid "" +"Memory allocated by this macro must be freed with :c:func:`PyObject_GC_Del` " +"(usually called via the object's :c:member:`~PyTypeObject.tp_free` slot)." +msgstr "" +"由此宏分配的内存必须用 :c:func:`PyObject_GC_Del` 来释放(通常是通过对象的 " +":c:member:`~PyTypeObject.tp_free` 槽位来调用)。" + +#: ../../c-api/gcsupport.rst:73 ../../c-api/gcsupport.rst:97 +msgid ":c:func:`PyObject_GC_Del`" +msgstr ":c:func:`PyObject_GC_Del`" + +#: ../../c-api/gcsupport.rst:74 +msgid ":c:macro:`PyObject_New`" +msgstr ":c:macro:`PyObject_New`" + +#: ../../c-api/gcsupport.rst:75 ../../c-api/gcsupport.rst:99 +#: ../../c-api/gcsupport.rst:193 +msgid ":c:func:`PyType_GenericAlloc`" +msgstr ":c:func:`PyType_GenericAlloc`" + +#: ../../c-api/gcsupport.rst:76 ../../c-api/gcsupport.rst:100 +msgid ":c:member:`~PyTypeObject.tp_alloc`" +msgstr ":c:member:`~PyTypeObject.tp_alloc`" + +#: ../../c-api/gcsupport.rst:81 +msgid "" +"Analogous to :c:macro:`PyObject_NewVar` but for container objects with the " +":c:macro:`Py_TPFLAGS_HAVE_GC` flag set." +msgstr "" +"与 :c:macro:`PyObject_NewVar` 类似但专用于设置了 :c:macro:`Py_TPFLAGS_HAVE_GC` " +"旗标的容器对象。" + +#: ../../c-api/gcsupport.rst:98 +msgid ":c:macro:`PyObject_NewVar`" +msgstr ":c:macro:`PyObject_NewVar`" + +#: ../../c-api/gcsupport.rst:105 +msgid "" +"Analogous to :c:macro:`PyObject_GC_New` but allocates *extra_size* bytes at " +"the end of the object (at offset :c:member:`~PyTypeObject.tp_basicsize`). " +"The allocated memory is initialized to zeros, except for the :c:type:`Python" +" object header `." +msgstr "" +"与 :c:macro:`PyObject_GC_New` 类似但会在对象的末尾分配 *extra_size* 个字节(在 " +":c:member:`~PyTypeObject.tp_basicsize` 偏移量处)。除 :c:type:`Python 对象标头 " +"` 外,分配的内存将初始化为零。" + +#: ../../c-api/gcsupport.rst:111 +msgid "" +"The extra data will be deallocated with the object, but otherwise it is not " +"managed by Python." +msgstr "附加数据将与对象一起被释放,但在其他情况下则不会由 Python 来管理。" + +#: ../../c-api/gcsupport.rst:114 +msgid "" +"Memory allocated by this function must be freed with " +":c:func:`PyObject_GC_Del` (usually called via the object's " +":c:member:`~PyTypeObject.tp_free` slot)." +msgstr "" +"由此函数分配的内存必须用 :c:func:`PyObject_GC_Del` 来释放(通常是通过对象的 " +":c:member:`~PyTypeObject.tp_free` 槽位来调用)。" + +#: ../../c-api/gcsupport.rst:119 +msgid "" +"The function is marked as unstable because the final mechanism for reserving" +" extra data after an instance is not yet decided. For allocating a variable " +"number of fields, prefer using :c:type:`PyVarObject` and " +":c:member:`~PyTypeObject.tp_itemsize` instead." +msgstr "" +"此函数被标记为非稳定的因为在实例之后保留附加数据的机制尚未确定。要分配可变数量的字段,推荐改用 :c:type:`PyVarObject` 和 " +":c:member:`~PyTypeObject.tp_itemsize` 字段。" + +#: ../../c-api/gcsupport.rst:130 +msgid "" +"Resize an object allocated by :c:macro:`PyObject_NewVar`. Returns the " +"resized object of type ``TYPE*`` (refers to any C type) or ``NULL`` on " +"failure." +msgstr "" +"重新调整 :c:macro:`PyObject_NewVar` 所分配对象的大小。返回调整大小后的类型为 ``TYPE*`` 的对象(指向任意 C " +"类型)或在失败时返回 ``NULL``。" + +#: ../../c-api/gcsupport.rst:134 +msgid "" +"*op* must be of type :c:expr:`PyVarObject *` and must not be tracked by the " +"collector yet. *newsize* must be of type :c:type:`Py_ssize_t`." +msgstr "" +"*op* 必须为 :c:expr:`PyVarObject *` 类型并且不能已被回收器所追踪。 *newsize* 必须为 " +":c:type:`Py_ssize_t` 类型。" + +#: ../../c-api/gcsupport.rst:141 +msgid "" +"Adds the object *op* to the set of container objects tracked by the " +"collector. The collector can run at unexpected times so objects must be " +"valid while being tracked. This should be called once all the fields " +"followed by the :c:member:`~PyTypeObject.tp_traverse` handler become valid, " +"usually near the end of the constructor." +msgstr "" +"把对象 *op* 加入到垃圾回收器跟踪的容器对象中。对象在被回收器跟踪时必须保持有效的,因为回收器可能在任何时候开始运行。在 " +":c:member:`~PyTypeObject.tp_traverse` 处理前的所有字段变为有效后,必须调用此函数,通常在靠近构造函数末尾的位置。" + +#: ../../c-api/gcsupport.rst:150 +msgid "" +"Returns non-zero if the object implements the garbage collector protocol, " +"otherwise returns 0." +msgstr "如果对象实现了垃圾回收器协议则返回非零值,否则返回 0。" + +#: ../../c-api/gcsupport.rst:153 +msgid "" +"The object cannot be tracked by the garbage collector if this function " +"returns 0." +msgstr "如果此函数返回 0 则对象无法被垃圾回收器追踪。" + +#: ../../c-api/gcsupport.rst:158 +msgid "" +"Returns 1 if the object type of *op* implements the GC protocol and *op* is " +"being currently tracked by the garbage collector and 0 otherwise." +msgstr "如果 *op* 对象的类型实现了 GC 协议且 *op* 目前正被垃圾回收器追踪则返回 1,否则返回 0。" + +#: ../../c-api/gcsupport.rst:161 +msgid "This is analogous to the Python function :func:`gc.is_tracked`." +msgstr "这类似于 Python 函数 :func:`gc.is_tracked`。" + +#: ../../c-api/gcsupport.rst:168 +msgid "" +"Returns 1 if the object type of *op* implements the GC protocol and *op* has" +" been already finalized by the garbage collector and 0 otherwise." +msgstr "如果 *op* 对象的类型实现了 GC 协议且 *op* 已经被垃圾回收器终结则返回 1,否则返回 0。" + +#: ../../c-api/gcsupport.rst:171 +msgid "This is analogous to the Python function :func:`gc.is_finalized`." +msgstr "这类似于 Python 函数 :func:`gc.is_finalized`。" + +#: ../../c-api/gcsupport.rst:178 +msgid "" +"Releases memory allocated to an object using :c:macro:`PyObject_GC_New` or " +":c:macro:`PyObject_GC_NewVar`." +msgstr "" +"释放之前使用 :c:macro:`PyObject_GC_New` 或 :c:macro:`PyObject_GC_NewVar` 分配给对象的内存。" + +#: ../../c-api/gcsupport.rst:181 +msgid "" +"Do not call this directly to free an object's memory; call the type's " +":c:member:`~PyTypeObject.tp_free` slot instead." +msgstr "请不要直接调用此函数来释放对象的内存;而应调用类型的 :c:member:`~PyTypeObject.tp_free` 槽位。" + +#: ../../c-api/gcsupport.rst:184 +msgid "" +"Do not use this for memory allocated by :c:macro:`PyObject_New`, " +":c:macro:`PyObject_NewVar`, or related allocation functions; use " +":c:func:`PyObject_Free` instead." +msgstr "" +"请不要为由 :c:macro:`PyObject_New`, :c:macro:`PyObject_NewVar` " +"或相关联的分配函数分配的内存使用此宏;而应改用 :c:func:`PyObject_Free`。" + +#: ../../c-api/gcsupport.rst:190 +msgid ":c:func:`PyObject_Free` is the non-GC equivalent of this function." +msgstr ":c:func:`PyObject_Free` 是此函数的非 GC 对应物。" + +#: ../../c-api/gcsupport.rst:191 +msgid ":c:macro:`PyObject_GC_New`" +msgstr ":c:macro:`PyObject_GC_New`" + +#: ../../c-api/gcsupport.rst:192 +msgid ":c:macro:`PyObject_GC_NewVar`" +msgstr ":c:macro:`PyObject_GC_NewVar`" + +#: ../../c-api/gcsupport.rst:194 +msgid ":c:member:`~PyTypeObject.tp_free`" +msgstr ":c:member:`~PyTypeObject.tp_free`" + +#: ../../c-api/gcsupport.rst:199 +msgid "" +"Remove the object *op* from the set of container objects tracked by the " +"collector. Note that :c:func:`PyObject_GC_Track` can be called again on " +"this object to add it back to the set of tracked objects. The deallocator " +"(:c:member:`~PyTypeObject.tp_dealloc` handler) should call this for the " +"object before any of the fields used by the " +":c:member:`~PyTypeObject.tp_traverse` handler become invalid." +msgstr "" +"从回收器跟踪的容器对象集合中移除 *op* 对象。请注意可以在此对象上再次调用 :c:func:`PyObject_GC_Track` " +"以将其加回到被跟踪对象集合。释放器 (:c:member:`~PyTypeObject.tp_dealloc` 句柄) 应当在 " +":c:member:`~PyTypeObject.tp_traverse` 句柄所使用的任何字段失效之前为对象调用此函数。" + +#: ../../c-api/gcsupport.rst:208 +msgid "" +"The :c:func:`!_PyObject_GC_TRACK` and :c:func:`!_PyObject_GC_UNTRACK` macros" +" have been removed from the public C API." +msgstr "" +":c:func:`!_PyObject_GC_TRACK` 和 :c:func:`!_PyObject_GC_UNTRACK` 宏已从公有 C API " +"中删除。" + +#: ../../c-api/gcsupport.rst:211 +msgid "" +"The :c:member:`~PyTypeObject.tp_traverse` handler accepts a function " +"parameter of this type:" +msgstr ":c:member:`~PyTypeObject.tp_traverse` 处理接收以下类型的函数形参。" + +#: ../../c-api/gcsupport.rst:216 +msgid "" +"Type of the visitor function passed to the " +":c:member:`~PyTypeObject.tp_traverse` handler. The function should be called" +" with an object to traverse as *object* and the third parameter to the " +":c:member:`~PyTypeObject.tp_traverse` handler as *arg*. The Python core " +"uses several visitor functions to implement cyclic garbage detection; it's " +"not expected that users will need to write their own visitor functions." +msgstr "" +"传给 :c:member:`~PyTypeObject.tp_traverse` 处理的访问函数的类型。*object* " +"是容器中需要被遍历的一个对象,第三个形参对应于 :c:member:`~PyTypeObject.tp_traverse` 处理的 *arg* " +"。Python 核心使用多个访问者函数实现循环引用的垃圾检测,不需要用户自行实现访问者函数。" + +#: ../../c-api/gcsupport.rst:223 +msgid "" +"The :c:member:`~PyTypeObject.tp_clear` handler must be of the " +":c:type:`inquiry` type, or ``NULL`` if the object is immutable." +msgstr "" +":c:member:`~PyTypeObject.tp_clear` 处理程序必须为 :c:type:`inquiry` 类型,如果对象不可变则为 " +"``NULL`` 值。" + +#: ../../c-api/gcsupport.rst:229 +msgid "" +"Drop references that may have created reference cycles. Immutable objects " +"do not have to define this method since they can never directly create " +"reference cycles. Note that the object must still be valid after calling " +"this method (don't just call :c:func:`Py_DECREF` on a reference). The " +"collector will call this method if it detects that this object is involved " +"in a reference cycle." +msgstr "" +"丢弃产生循环引用的引用。不可变对象不需要声明此方法,因为它们不可能直接产生循环引用。需要注意的是,对象在调用此方法后必须仍是有效的(不能对引用只调用 " +":c:func:`Py_DECREF` 方法)。当垃圾回收器检测到该对象在循环引用中时,此方法会被调用。" + +#: ../../c-api/gcsupport.rst:240 +msgid "Traversal" +msgstr "遍历" + +#: ../../c-api/gcsupport.rst:242 +msgid "" +"The :c:member:`~PyTypeObject.tp_traverse` handler must have the following " +"type:" +msgstr ":c:member:`~PyTypeObject.tp_traverse` 处理必须是以下类型:" + +#: ../../c-api/gcsupport.rst:246 +msgid "" +"Traversal function for a garbage-collected object, used by the garbage " +"collector to detect reference cycles. Implementations must call the *visit* " +"function for each object directly contained by *self*, with the parameters " +"to *visit* being the contained object and the *arg* value passed to the " +"handler. The *visit* function must not be called with a ``NULL`` object " +"argument. If *visit* returns a non-zero value, that value should be " +"returned immediately." +msgstr "" +"针对垃圾收集对象的遍历函数,被垃圾收集器用于检测引用循环。 具体实现必须为 *self* 直接包含的每个对象调用 *visit* 函数,传给 " +"*visit* 的形参为所包含对象和传给处理器的 *arg* 值。 *visit* 函数调用不可附带 ``NULL`` 对象作为参数。 如果 " +"*visit* 返回非零值,则该值应当被立即返回。" + +#: ../../c-api/gcsupport.rst:255 +msgid "" +"A typical :c:member:`!tp_traverse` function calls the :c:func:`Py_VISIT` " +"convenience macro on each of the instance's members that are Python objects " +"that the instance owns. For example, this is a (slightly outdated) traversal" +" function for the :py:class:`threading.local` class::" +msgstr "" +"一个典型的 :c:member:`!tp_traverse` 函数会在实例所拥有的每个属于 Python 对象的实例成员上调用 " +":c:func:`Py_VISIT` 便捷宏。 例如,下面是一个针对 :py:class:`threading.local` " +"类的(略微过时的)遍历函数::" + +#: ../../c-api/gcsupport.rst:261 +msgid "" +"static int\n" +"local_traverse(PyObject *op, visitproc visit, void *arg)\n" +"{\n" +" localobject *self = (localobject *) op;\n" +" Py_VISIT(Py_TYPE(self));\n" +" Py_VISIT(self->args);\n" +" Py_VISIT(self->kw);\n" +" Py_VISIT(self->dict);\n" +" return 0;\n" +"}" +msgstr "" +"static int\n" +"local_traverse(PyObject *op, visitproc visit, void *arg)\n" +"{\n" +" localobject *self = (localobject *) op;\n" +" Py_VISIT(Py_TYPE(self));\n" +" Py_VISIT(self->args);\n" +" Py_VISIT(self->kw);\n" +" Py_VISIT(self->dict);\n" +" return 0;\n" +"}" + +#: ../../c-api/gcsupport.rst:273 +msgid "" +":c:func:`Py_VISIT` requires the *visit* and *arg* parameters to " +":c:func:`!local_traverse` to have these specific names; don't name them just" +" anything." +msgstr "" +":c:func:`Py_VISIT` 要求传给 :c:func:`!local_traverse` 的 *visit* 和 *arg* " +"形参具有这些指定名称;请不要随意命名它们。" + +#: ../../c-api/gcsupport.rst:277 +msgid "" +"Instances of :ref:`heap-allocated types ` hold a reference to " +"their type. Their traversal function must therefore visit the type::" +msgstr ":ref:`堆分配类型 ` 的实例会持有一个对其类型的引用。 因此它们的遍历函数必须访问其类型::" + +#: ../../c-api/gcsupport.rst:280 +msgid "Py_VISIT(Py_TYPE(self));" +msgstr "Py_VISIT(Py_TYPE(self));" + +#: ../../c-api/gcsupport.rst:282 +msgid "" +"Alternately, the type may delegate this responsibility by calling " +"``tp_traverse`` of a heap-allocated superclass (or another heap-allocated " +"type, if applicable). If they do not, the type object may not be garbage-" +"collected." +msgstr "" + +#: ../../c-api/gcsupport.rst:287 +msgid "" +"If the :c:macro:`Py_TPFLAGS_MANAGED_DICT` bit is set in the " +":c:member:`~PyTypeObject.tp_flags` field, the traverse function must call " +":c:func:`PyObject_VisitManagedDict` like this::" +msgstr "" +"如果在 :c:member:`~PyTypeObject.tp_flags` 字段中设置了 " +":c:macro:`Py_TPFLAGS_MANAGED_DICT` 比特位,则遍历函数必须这样调用 " +":c:func:`PyObject_VisitManagedDict`::" + +#: ../../c-api/gcsupport.rst:291 +msgid "" +"int err = PyObject_VisitManagedDict((PyObject*)self, visit, arg);\n" +"if (err) {\n" +" return err;\n" +"}" +msgstr "" +"int err = PyObject_VisitManagedDict((PyObject*)self, visit, arg);\n" +"if (err) {\n" +" return err;\n" +"}" + +#: ../../c-api/gcsupport.rst:296 +msgid "" +"Only the members that the instance *owns* (by having :term:`strong " +"references ` to them) must be visited. For instance, if an" +" object supports weak references via the " +":c:member:`~PyTypeObject.tp_weaklist` slot, the pointer supporting the " +"linked list (what *tp_weaklist* points to) must **not** be visited as the " +"instance does not directly own the weak references to itself." +msgstr "" + +#: ../../c-api/gcsupport.rst:303 +msgid "The traversal function has a limitation:" +msgstr "" + +#: ../../c-api/gcsupport.rst:307 +msgid "" +"The traversal function must not have any side effects. Implementations may " +"not modify the reference counts of any Python objects nor create or destroy " +"any Python objects, directly or indirectly." +msgstr "" + +#: ../../c-api/gcsupport.rst:311 +msgid "" +"This means that *most* Python C API functions may not be used, since they " +"can raise a new exception, return a new reference to a result object, have " +"internal logic that uses side effects. Also, unless documented otherwise, " +"functions that happen to not have side effects may start having them in " +"future versions, without warning." +msgstr "" + +#: ../../c-api/gcsupport.rst:317 +msgid "" +"For a list of safe functions, see a :ref:`separate section ` below." +msgstr "" + +#: ../../c-api/gcsupport.rst:322 +msgid "" +"The :c:func:`Py_VISIT` call may be skipped for those members that provably " +"cannot participate in reference cycles. In the ``local_traverse`` example " +"above, there is also a ``self->key`` member, but it can only be ``NULL`` or " +"a Python string and therefore cannot be part of a reference cycle." +msgstr "" + +#: ../../c-api/gcsupport.rst:328 +msgid "" +"On the other hand, even if you know a member can never be part of a cycle, " +"as a debugging aid you may want to visit it anyway just so the :mod:`gc` " +"module's :func:`~gc.get_referents` function will include it." +msgstr "" +"在另一方面,即使你知道某个成员永远不会成为循环引用的一部分,作为调试的辅助你仍然可能想要访问它因此 :mod:`gc` 模块的 " +":func:`~gc.get_referents` 函数将会包括它。" + +#: ../../c-api/gcsupport.rst:334 +msgid "" +"The :c:member:`~PyTypeObject.tp_traverse` function can be called from any " +"thread." +msgstr ":c:member:`~PyTypeObject.tp_traverse` 函数可以从任何线程调用。" + +#: ../../c-api/gcsupport.rst:339 +msgid "" +"Garbage collection is a \"stop-the-world\" operation: even in :term:`free " +"threading` builds, only one thread state is :term:`attached ` when :c:member:`!tp_traverse` handlers run." +msgstr "" + +#: ../../c-api/gcsupport.rst:346 +msgid "" +"Heap-allocated types are expected to visit ``Py_TYPE(self)`` in " +"``tp_traverse``. In earlier versions of Python, due to `bug 40217 " +"`_, doing this may lead to crashes in " +"subclasses." +msgstr "" +"堆分配类型应当访问 ``tp_traverse`` 中的 ``Py_TYPE(self)``。在较早的 Python 版本中,由于 `bug 40217" +" `_,这样做可能会导致在子类中发生崩溃。" + +#: ../../c-api/gcsupport.rst:351 +msgid "" +"To simplify writing :c:member:`~PyTypeObject.tp_traverse` handlers, a " +":c:func:`Py_VISIT` macro is provided. In order to use this macro, the " +":c:member:`~PyTypeObject.tp_traverse` implementation must name its arguments" +" exactly *visit* and *arg*:" +msgstr "" + +#: ../../c-api/gcsupport.rst:358 +msgid "" +"If the :c:expr:`PyObject *` *o* is not ``NULL``, call the *visit* callback, " +"with arguments *o* and *arg*. If *visit* returns a non-zero value, then " +"return it." +msgstr "" + +#: ../../c-api/gcsupport.rst:362 +msgid "This corresponds roughly to::" +msgstr "" + +#: ../../c-api/gcsupport.rst:364 +msgid "" +"#define Py_VISIT(o) \\\n" +" if (op) { \\\n" +" int visit_result = visit(o, arg); \\\n" +" if (visit_result != 0) { \\\n" +" return visit_result; \\\n" +" } \\\n" +" }" +msgstr "" + +#: ../../c-api/gcsupport.rst:374 +msgid "Traversal-safe functions" +msgstr "" + +#: ../../c-api/gcsupport.rst:376 +msgid "" +"The following functions and macros are safe to use in a " +":c:member:`~PyTypeObject.tp_traverse` handler:" +msgstr "" + +#: ../../c-api/gcsupport.rst:379 +msgid "the *visit* function passed to ``tp_traverse``" +msgstr "" + +#: ../../c-api/gcsupport.rst:380 +msgid ":c:func:`Py_VISIT`" +msgstr "" + +#: ../../c-api/gcsupport.rst:381 +msgid ":c:func:`Py_SIZE`" +msgstr "" + +#: ../../c-api/gcsupport.rst:382 +msgid "" +":c:func:`Py_TYPE`: if called from a :c:member:`!tp_traverse` handler, " +":c:func:`!Py_TYPE`'s result will be valid for the duration of the handler " +"call" +msgstr "" + +#: ../../c-api/gcsupport.rst:384 +msgid ":c:func:`PyObject_VisitManagedDict`" +msgstr "" + +#: ../../c-api/gcsupport.rst:385 +msgid "" +":c:func:`PyObject_TypeCheck`, :c:func:`PyType_IsSubtype`, " +":c:func:`PyType_HasFeature`" +msgstr "" + +#: ../../c-api/gcsupport.rst:387 +msgid "" +":samp:`Py{}_Check` and :samp:`Py{}_CheckExact` -- for example, " +":c:func:`PyTuple_Check`" +msgstr "" + +#: ../../c-api/gcsupport.rst:389 +msgid ":ref:`duringgc-functions`" +msgstr "" + +#: ../../c-api/gcsupport.rst:394 +msgid "\"DuringGC\" functions" +msgstr "" + +#: ../../c-api/gcsupport.rst:396 +msgid "" +"The following functions should *only* be used in a " +":c:member:`~PyTypeObject.tp_traverse` handler; calling them in other " +"contexts may have unintended consequences." +msgstr "" + +#: ../../c-api/gcsupport.rst:400 +msgid "" +"These functions act like their counterparts without the ``_DuringGC`` " +"suffix, but they are guaranteed to not have side effects, they do not set an" +" exception on failure, and they return/set :term:`borrowed references " +"` as detailed in the individual documentation." +msgstr "" + +#: ../../c-api/gcsupport.rst:405 +msgid "" +"Note that these functions may fail (return ``NULL`` or ``-1``), but as they " +"do not set an exception, no error information is available. In some cases, " +"failure is not distinguishable from a successful ``NULL`` result." +msgstr "" + +#: ../../c-api/gcsupport.rst:415 ../../c-api/gcsupport.rst:430 +#: ../../c-api/gcsupport.rst:443 +msgid "See :ref:`duringgc-functions` for common information." +msgstr "" + +#: ../../c-api/gcsupport.rst:421 +msgid "" +":c:func:`PyObject_GetTypeData`, :c:func:`PyObject_GetItemData`, " +":c:func:`PyType_GetModuleState`, :c:func:`PyModule_GetState`, " +":c:func:`PyModule_GetToken`, :c:func:`PyType_GetBaseByToken`" +msgstr "" + +#: ../../c-api/gcsupport.rst:432 +msgid "" +"Sets *\\*result* to a :term:`borrowed reference` rather than a strong one. " +"The reference is valid for the duration of the :c:member:`!tp_traverse` " +"handler call." +msgstr "" + +#: ../../c-api/gcsupport.rst:438 +msgid ":c:func:`PyType_GetBaseByToken`" +msgstr "" + +#: ../../c-api/gcsupport.rst:445 +msgid "" +"These functions return a :term:`borrowed reference`, which is valid for the " +"duration of the :c:member:`!tp_traverse` handler call." +msgstr "" +"这些函数将返回 :term:`borrowed reference`,它会在 :c:member:`!tp_traverse` " +"处理器调用持续期间保持可用。" + +#: ../../c-api/gcsupport.rst:452 +msgid ":c:func:`PyType_GetModule`, :c:func:`PyType_GetModuleByToken`" +msgstr ":c:func:`PyType_GetModule`, :c:func:`PyType_GetModuleByToken`" + +#: ../../c-api/gcsupport.rst:457 +msgid "Controlling the Garbage Collector State" +msgstr "控制垃圾回收器状态" + +#: ../../c-api/gcsupport.rst:459 +msgid "" +"The C-API provides the following functions for controlling garbage " +"collection runs." +msgstr "这个 C-API 提供了以下函数用于控制垃圾回收的运行。" + +#: ../../c-api/gcsupport.rst:464 +msgid "" +"Perform a full garbage collection, if the garbage collector is enabled. " +"(Note that :func:`gc.collect` runs it unconditionally.)" +msgstr "执行完全的垃圾回收,如果垃圾回收器已启用的话。 (请注意 :func:`gc.collect` 会无条件地执行它。)" + +#: ../../c-api/gcsupport.rst:467 +msgid "" +"Returns the number of collected + unreachable objects which cannot be " +"collected. If the garbage collector is disabled or already collecting, " +"returns ``0`` immediately. Errors during garbage collection are passed to " +":data:`sys.unraisablehook`. This function does not raise exceptions." +msgstr "" +"返回已回收的 + 无法回收的不可获取对象的数量。如果垃圾回收器被禁用或已在执行回收,则立即返回 ``0``。在垃圾回收期间发生的错误会被传给 " +":data:`sys.unraisablehook`。此函数不会引发异常。" + +#: ../../c-api/gcsupport.rst:477 +msgid "" +"Enable the garbage collector: similar to :func:`gc.enable`. Returns the " +"previous state, 0 for disabled and 1 for enabled." +msgstr "启用垃圾回收器:类似于 :func:`gc.enable`。返回之前的状态,0 为禁用而 1 为启用。" + +#: ../../c-api/gcsupport.rst:485 +msgid "" +"Disable the garbage collector: similar to :func:`gc.disable`. Returns the " +"previous state, 0 for disabled and 1 for enabled." +msgstr "禁用垃圾回收器:类似于 :func:`gc.disable`。返回之前的状态,0 为禁用而 1 为启用。" + +#: ../../c-api/gcsupport.rst:493 +msgid "" +"Query the state of the garbage collector: similar to :func:`gc.isenabled`. " +"Returns the current state, 0 for disabled and 1 for enabled." +msgstr "查询垃圾回收器的状态:类似于 :func:`gc.isenabled`。返回当前的状态,0 为禁用而 1 为启用。" + +#: ../../c-api/gcsupport.rst:500 +msgid "Querying Garbage Collector State" +msgstr "查询垃圾回收器状态" + +#: ../../c-api/gcsupport.rst:502 +msgid "" +"The C-API provides the following interface for querying information about " +"the garbage collector." +msgstr "该 C-API 提供了以下接口用于查询有关垃圾回收器的信息。" + +#: ../../c-api/gcsupport.rst:507 +msgid "" +"Run supplied *callback* on all live GC-capable objects. *arg* is passed " +"through to all invocations of *callback*." +msgstr "在全部活动的支持 GC 的对象上运行所提供的 *callback*。 *arg* 会被传递给所有 *callback* 的调用。" + +#: ../../c-api/gcsupport.rst:511 +msgid "" +"If new objects are (de)allocated by the callback it is undefined if they " +"will be visited." +msgstr "如果新对象被回调所(取消)分配,则它们是否会被访问是未定义的。" + +#: ../../c-api/gcsupport.rst:514 +msgid "" +"Garbage collection is disabled during operation. Explicitly running a " +"collection in the callback may lead to undefined behaviour e.g. visiting the" +" same objects multiple times or not at all." +msgstr "垃圾回收在运行期间被禁用。在回调中显式地运行回收可能导致未定义的行为,例如多次访问同一对象或完全不访问。" + +#: ../../c-api/gcsupport.rst:522 +msgid "" +"Type of the visitor function to be passed to " +":c:func:`PyUnstable_GC_VisitObjects`. *arg* is the same as the *arg* passed " +"to ``PyUnstable_GC_VisitObjects``. Return ``1`` to continue iteration, " +"return ``0`` to stop iteration. Other return values are reserved for now so " +"behavior on returning anything else is undefined." +msgstr "" +"要传给 :c:func:`PyUnstable_GC_VisitObjects` 的访问者函数的类型。 *arg* 与传给 " +"``PyUnstable_GC_VisitObjects`` 的 *arg* 相同。返回 ``1`` 以继续迭代,返回 ``0`` 以停止迭代。 " +"其他返回值目前被保留因此返回任何其他值的行为都是未定义的。" diff --git a/c-api/gen.po b/c-api/gen.po new file mode 100644 index 0000000000..2c1dfd21d5 --- /dev/null +++ b/c-api/gen.po @@ -0,0 +1,125 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-07 17:18+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/gen.rst:6 +msgid "Generator Objects" +msgstr "生成器对象" + +#: ../../c-api/gen.rst:8 +msgid "" +"Generator objects are what Python uses to implement generator iterators. " +"They are normally created by iterating over a function that yields values, " +"rather than explicitly calling :c:func:`PyGen_New` or " +":c:func:`PyGen_NewWithQualName`." +msgstr "" +"生成器对象是 Python 用来实现生成器迭代器的对象。它们通常通过迭代产生值的函数来创建,而不是显式调用 :c:func:`PyGen_New` 或 " +":c:func:`PyGen_NewWithQualName` 函数。" + +#: ../../c-api/gen.rst:15 +msgid "The C structure used for generator objects." +msgstr "用于生成器对象的 C 结构体。" + +#: ../../c-api/gen.rst:20 +msgid "The type object corresponding to generator objects." +msgstr "与生成器对象对应的类型对象。" + +#: ../../c-api/gen.rst:25 +msgid "" +"Return true if *ob* is a generator object; *ob* must not be ``NULL``. This " +"function always succeeds." +msgstr "如果 *ob* 是一个 generator 对象则返回真值;*ob* 必须不为 ``NULL``。此函数总是会成功执行。" + +#: ../../c-api/gen.rst:31 +msgid "" +"Return true if *ob*'s type is :c:type:`PyGen_Type`; *ob* must not be " +"``NULL``. This function always succeeds." +msgstr "" +"如果 *ob* 的类型是 :c:type:`PyGen_Type` 则返回真值;*ob* 必须不为 ``NULL``。此函数总是会成功执行。" + +#: ../../c-api/gen.rst:37 +msgid "" +"Create and return a new generator object based on the *frame* object. A " +"reference to *frame* is \":term:`stolen `\" by this function (even on" +" error). The argument must not be ``NULL``." +msgstr "" + +#: ../../c-api/gen.rst:43 +msgid "" +"Create and return a new generator object based on the *frame* object, with " +"``__name__`` and ``__qualname__`` set to *name* and *qualname*. A reference " +"to *frame* is \":term:`stolen `\" by this function (even on error). " +"The *frame* argument must not be ``NULL``." +msgstr "" + +#: ../../c-api/gen.rst:51 +msgid "" +"Return a new :term:`strong reference` to the code object wrapped by *gen*. " +"This function always succeeds." +msgstr "返回一个新的指向 *gen* 所包装的代码对象的 :term:`strong reference`。此函数总是会成功执行。" + +#: ../../c-api/gen.rst:56 +msgid "Asynchronous Generator Objects" +msgstr "异步生成器对象" + +#: ../../c-api/gen.rst:59 +msgid ":pep:`525`" +msgstr ":pep:`525`" + +#: ../../c-api/gen.rst:63 +msgid "" +"The type object corresponding to asynchronous generator objects. This is " +"available as :class:`types.AsyncGeneratorType` in the Python layer." +msgstr "对应异步生成器对象的类型对象。它在 Python 层面上为 :class:`types.AsyncGeneratorType`。" + +#: ../../c-api/gen.rst:70 +msgid "" +"Create a new asynchronous generator wrapping *frame*, with ``__name__`` and " +"``__qualname__`` set to *name* and *qualname*. *frame* is \":term:`stolen " +"`\" by this function (even on error) and must not be ``NULL``." +msgstr "" + +#: ../../c-api/gen.rst:75 +msgid "" +"On success, this function returns a :term:`strong reference` to the new " +"asynchronous generator. On failure, this function returns ``NULL`` with an " +"exception set." +msgstr "" +"成功时,此函数将返回一个指向新异步生成器的 :term:`strong reference`。失败时,此函数将返回 ``NULL`` 并设置一个异常。" + +#: ../../c-api/gen.rst:83 +msgid "" +"Return true if *op* is an asynchronous generator object, false otherwise. " +"This function always succeeds." +msgstr "如果 *op* 是一个异步生成器对象则返回真值,否则返回假值。此函数总是会成功执行。" + +#: ../../c-api/gen.rst:90 +msgid "Deprecated API" +msgstr "已弃用的 API" + +#: ../../c-api/gen.rst:94 +msgid "This is an API that was included in Python's C API by mistake." +msgstr "" + +#: ../../c-api/gen.rst:97 +msgid "It is solely here for completeness; do not use this API." +msgstr "它出现在这里只是出于完整性考虑;请不要使用此 API。" diff --git a/c-api/hash.po b/c-api/hash.po new file mode 100644 index 0000000000..8b5996b58a --- /dev/null +++ b/c-api/hash.po @@ -0,0 +1,220 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/hash.rst:4 +msgid "PyHash API" +msgstr "PyHash API" + +#: ../../c-api/hash.rst:6 +msgid "" +"See also the :c:member:`PyTypeObject.tp_hash` member and :ref:`numeric-" +"hash`." +msgstr "另请参阅 :c:member:`PyTypeObject.tp_hash` 成员和 :ref:`numeric-hash`。" + +#: ../../c-api/hash.rst:10 +msgid "Hash value type: signed integer." +msgstr "哈希值类型:有符号整数。" + +#: ../../c-api/hash.rst:17 +msgid "Hash value type: unsigned integer." +msgstr "哈希值类型:无符号整数。" + +#: ../../c-api/hash.rst:24 +msgid "" +"A numerical value indicating the algorithm for hashing of :class:`str`, " +":class:`bytes`, and :class:`memoryview`." +msgstr "一个指明用于 :class:`str`, :class:`bytes` 和 :class:`memoryview` 的哈希算法的数字值。" + +#: ../../c-api/hash.rst:27 +msgid "The algorithm name is exposed by :data:`sys.hash_info.algorithm`." +msgstr "算法名称由 :data:`sys.hash_info.algorithm` 对外公开。" + +#: ../../c-api/hash.rst:36 +msgid "" +"Numerical values to compare to :c:macro:`Py_HASH_ALGORITHM` to determine " +"which algorithm is used for hashing. The hash algorithm can be configured " +"via the configure :option:`--with-hash-algorithm` option." +msgstr "" +"与 :c:macro:`Py_HASH_ALGORITHM` 进行比较以确定使用哪种哈希算法的数字值。哈希算法可通过 :option:`--with-" +"hash-algorithm` 选项来配置。" + +#: ../../c-api/hash.rst:40 +msgid "Add :c:macro:`!Py_HASH_FNV` and :c:macro:`!Py_HASH_SIPHASH24`." +msgstr "增加 :c:macro:`!Py_HASH_FNV` 和 :c:macro:`!Py_HASH_SIPHASH24`。" + +#: ../../c-api/hash.rst:43 +msgid "Add :c:macro:`!Py_HASH_SIPHASH13`." +msgstr "增加 :c:macro:`!Py_HASH_SIPHASH13`。" + +#: ../../c-api/hash.rst:49 +msgid "" +"Buffers of length in range ``[1, Py_HASH_CUTOFF)`` are hashed using DJBX33A " +"instead of the algorithm described by :c:macro:`Py_HASH_ALGORITHM`." +msgstr "" +"长度在 ``[1, Py_HASH_CUTOFF)`` 范围内的缓冲区将使用 DJBX33A 而不是由 " +":c:macro:`Py_HASH_ALGORITHM` 所指定的哈希算法。" + +#: ../../c-api/hash.rst:52 +msgid "A :c:macro:`!Py_HASH_CUTOFF` of 0 disables the optimization." +msgstr ":c:macro:`!Py_HASH_CUTOFF` 值为 0 将禁用优化。" + +#: ../../c-api/hash.rst:53 +msgid "" +":c:macro:`!Py_HASH_CUTOFF` must be non-negative and less or equal than 7." +msgstr ":c:macro:`!Py_HASH_CUTOFF` 必须为小于等于 7 的非负数。" + +#: ../../c-api/hash.rst:55 +msgid "" +"32-bit platforms should use a cutoff smaller than 64-bit platforms because " +"it is easier to create colliding strings. A cutoff of 7 on 64-bit platforms " +"and 5 on 32-bit platforms should provide a decent safety margin." +msgstr "" +"32 位平台应当使用比 64 位平台更小的截断值,因为在 32 位平台上更容易创建碰撞字符串。截断值在 64 位平台上为 7 而在 32 位平台上为 5" +" 应当能够提供足够的安全边界。" + +#: ../../c-api/hash.rst:59 +msgid "This corresponds to the :data:`sys.hash_info.cutoff` constant." +msgstr "这对应于 :data:`sys.hash_info.cutoff` 常量。" + +#: ../../c-api/hash.rst:66 +msgid "" +"The `Mersenne prime `_ ``P = " +"2**n -1``, used for numeric hash scheme." +msgstr "" +"`梅森素数 `_ ``P = 2**n " +"-1``,用于数字哈希方案。" + +#: ../../c-api/hash.rst:69 +msgid "This corresponds to the :data:`sys.hash_info.modulus` constant." +msgstr "这对应于 :data:`sys.hash_info.modulus` 常量。" + +#: ../../c-api/hash.rst:76 +msgid "The exponent ``n`` of ``P`` in :c:macro:`PyHASH_MODULUS`." +msgstr ":c:macro:`PyHASH_MODULUS` 中 ``P`` 的指数 ``n``。" + +#: ../../c-api/hash.rst:83 +msgid "Prime multiplier used in string and various other hashes." +msgstr "用于字符串和多种其他哈希算法的质数乘数。" + +#: ../../c-api/hash.rst:90 +msgid "The hash value returned for a positive infinity." +msgstr "针对正无穷大返回的哈希值。" + +#: ../../c-api/hash.rst:92 +msgid "This corresponds to the :data:`sys.hash_info.inf` constant." +msgstr "这对应于 :data:`sys.hash_info.inf` 常量。" + +#: ../../c-api/hash.rst:99 +msgid "The multiplier used for the imaginary part of a complex number." +msgstr "用于复数虚部的乘数。" + +#: ../../c-api/hash.rst:101 +msgid "This corresponds to the :data:`sys.hash_info.imag` constant." +msgstr "这对应于 :data:`sys.hash_info.imag` 常量。" + +#: ../../c-api/hash.rst:108 +msgid "Hash function definition used by :c:func:`PyHash_GetFuncDef`." +msgstr ":c:func:`PyHash_GetFuncDef` 使用的哈希函数定义。" + +#: ../../c-api/hash.rst:112 +msgid "Hash function." +msgstr "哈希函数。" + +#: ../../c-api/hash.rst:116 +msgid "Hash function name (UTF-8 encoded string)." +msgstr "哈希函数名称(UTF-8 编码的字符串)。" + +#: ../../c-api/hash.rst:118 +msgid "This corresponds to the :data:`sys.hash_info.algorithm` constant." +msgstr "这对应于 :data:`sys.hash_info.algorithm` 常量。" + +#: ../../c-api/hash.rst:122 +msgid "Internal size of the hash value in bits." +msgstr "以比特位表示的哈希值内部大小。" + +#: ../../c-api/hash.rst:124 +msgid "This corresponds to the :data:`sys.hash_info.hash_bits` constant." +msgstr "这对应于 :data:`sys.hash_info.hash_bits` 常量。" + +#: ../../c-api/hash.rst:128 +msgid "Size of seed input in bits." +msgstr "以比特位表示的输入种子值大小。" + +#: ../../c-api/hash.rst:130 +msgid "This corresponds to the :data:`sys.hash_info.seed_bits` constant." +msgstr "这对应于 :data:`sys.hash_info.seed_bits` 常量。" + +#: ../../c-api/hash.rst:137 +msgid "Get the hash function definition." +msgstr "获取哈希函数定义。" + +#: ../../c-api/hash.rst:140 +msgid ":pep:`456` \"Secure and interchangeable hash algorithm\"." +msgstr ":pep:`456` \"安全且可互换的哈希算法\"。" + +#: ../../c-api/hash.rst:147 +msgid "" +"Hash a pointer value: process the pointer value as an integer (cast it to " +"``uintptr_t`` internally). The pointer is not dereferenced." +msgstr "对指针值执行哈希运算:将指针值作为整数来处理(在内部将其转换为 ``uintptr_t`` 类型)。指针不会被解引用。" + +#: ../../c-api/hash.rst:150 +msgid "The function cannot fail: it cannot return ``-1``." +msgstr "此函数不会失败:它不可能返回 ``-1``。" + +#: ../../c-api/hash.rst:157 +msgid "" +"Compute and return the hash value of a buffer of *len* bytes starting at " +"address *ptr*. The hash is guaranteed to match that of :class:`bytes`, " +":class:`memoryview`, and other built-in objects that implement the " +":ref:`buffer protocol `." +msgstr "" +"计算并返回从地址 *ptr* 开始的 *len* 字节缓冲区的哈希值。哈希保证与 :class:`bytes`、:class:`memoryview` " +"和其他实现 :ref:`缓冲区协议 ` 的内置对象的哈希匹配。" + +#: ../../c-api/hash.rst:162 +msgid "" +"Use this function to implement hashing for immutable objects whose " +":c:member:`~PyTypeObject.tp_richcompare` function compares to another " +"object's buffer." +msgstr "" +"使用此函数为不可变对象实现哈希,这些对象的 :c:member:`~PyTypeObject.tp_richcompare` " +"函数会与另一个对象的缓冲区进行比较。" + +#: ../../c-api/hash.rst:166 +msgid "*len* must be greater than or equal to ``0``." +msgstr "*len* 必须大于或等于 ``0``。" + +#: ../../c-api/hash.rst:168 +msgid "This function always succeeds." +msgstr "这个函数总是能够成功执行。" + +#: ../../c-api/hash.rst:175 +msgid "" +"Generic hashing function that is meant to be put into a type object's " +"``tp_hash`` slot. Its result only depends on the object's identity." +msgstr "旨在放入类型对象的 ``tp_hash`` 槽位的通用哈希函数。其结果仅取决于对象的标识。" + +#: ../../c-api/hash.rst:180 +msgid "In CPython, it is equivalent to :c:func:`Py_HashPointer`." +msgstr "在 CPython 中,它等价于 :c:func:`Py_HashPointer`。" diff --git a/c-api/import.po b/c-api/import.po new file mode 100644 index 0000000000..a2d6d1ddbe --- /dev/null +++ b/c-api/import.po @@ -0,0 +1,580 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:00+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/import.rst:6 +msgid "Importing Modules" +msgstr "导入模块" + +#: ../../c-api/import.rst:16 +msgid "" +"This is a wrapper around :c:func:`PyImport_Import()` which takes a " +":c:expr:`const char *` as an argument instead of a :c:expr:`PyObject *`." +msgstr "" +"这是一个对 :c:func:`PyImport_Import()` 的包装器,它接受一个 :c:expr:`const char *` 作为参数而不是 " +":c:expr:`PyObject *`。" + +#: ../../c-api/import.rst:24 +msgid "" +"Import a module. This is best described by referring to the built-in Python" +" function :func:`__import__`." +msgstr "导入一个模块。 请参阅内置 Python 函数 :func:`__import__` 获取完善的相关描述。" + +#: ../../c-api/import.rst:27 ../../c-api/import.rst:43 +msgid "" +"The return value is a new reference to the imported module or top-level " +"package, or ``NULL`` with an exception set on failure. Like for " +":func:`__import__`, the return value when a submodule of a package was " +"requested is normally the top-level package, unless a non-empty *fromlist* " +"was given." +msgstr "" +"返回值是一个对所导入模块或最高层级包的新引用,或是在导入失败时则为 ``NULL`` 并设置一个异常。 与 :func:`__import__` " +"类似,当请求一个包的子模块时返回值通常为该最高层级包,除非给出了一个非空的 *fromlist*。" + +#: ../../c-api/import.rst:33 +msgid "" +"Failing imports remove incomplete module objects, like with " +":c:func:`PyImport_ImportModule`." +msgstr "导入失败将移除不完整的模块对象,就像 :c:func:`PyImport_ImportModule` 那样。" + +#: ../../c-api/import.rst:39 +msgid "" +"Import a module. This is best described by referring to the built-in Python" +" function :func:`__import__`, as the standard :func:`__import__` function " +"calls this function directly." +msgstr "" +"导入一个模块。 关于此函数的最佳说明请参考内置 Python 函数 :func:`__import__`,因为标准 :func:`__import__`" +" 函数会直接调用此函数。" + +#: ../../c-api/import.rst:53 +msgid "" +"Similar to :c:func:`PyImport_ImportModuleLevelObject`, but the name is a " +"UTF-8 encoded string instead of a Unicode object." +msgstr "" +"类似于 :c:func:`PyImport_ImportModuleLevelObject`,但其名称为 UTF-8 编码的字符串而不是 Unicode" +" 对象。" + +#: ../../c-api/import.rst:56 +msgid "Negative values for *level* are no longer accepted." +msgstr "不再接受 *level* 为负数值。" + +#: ../../c-api/import.rst:61 +msgid "" +"This is a higher-level interface that calls the current \"import hook " +"function\" (with an explicit *level* of 0, meaning absolute import). It " +"invokes the :func:`__import__` function from the ``__builtins__`` of the " +"current globals. This means that the import is done using whatever import " +"hooks are installed in the current environment." +msgstr "" +"这是一个调用了当前“导入钩子函数”的更高层级接口(显式指定 *level* 为 0,表示绝对导入)。 它将调用当前全局作用域下 " +"``__builtins__`` 中的 :func:`__import__` 函数。 这意味着将使用当前环境下安装的任何导入钩子来完成导入。" + +#: ../../c-api/import.rst:67 +msgid "This function always uses absolute imports." +msgstr "该函数总是使用绝对导入。" + +#: ../../c-api/import.rst:72 +msgid "" +"Reload a module. Return a new reference to the reloaded module, or ``NULL``" +" with an exception set on failure (the module still exists in this case)." +msgstr "重载一个模块。 返回一个指向被重载模块的新引用,或者在失败时返回 ``NULL`` 并设置一个异常(在此情况下模块仍然会存在)。" + +#: ../../c-api/import.rst:78 +msgid "Return the module object corresponding to a module name." +msgstr "返回对应于模块名称的模块对象。" + +#: ../../c-api/import.rst:80 +msgid "" +"The *name* argument may be of the form ``package.module``. First check the " +"modules dictionary if there's one there, and if not, create a new one and " +"insert it in the modules dictionary." +msgstr "" +"*name* 参数的形式可以为 ``package.module``。 首先检查 modules " +"字典中是否已存在该模块,如果不存在,则创建一个新模块并将其插入 modules 字典中。" + +#: ../../c-api/import.rst:84 +msgid "" +"Return a :term:`strong reference` to the module on success. Return ``NULL`` " +"with an exception set on failure." +msgstr "成功时返回一个指向模块的 :term:`strong reference`。 失败时返回 ``NULL`` 并设置一个异常。" + +#: ../../c-api/import.rst:87 +msgid "The module name *name* is decoded from UTF-8." +msgstr "模块名称 *name* 将使用 UTF-8 解码。" + +#: ../../c-api/import.rst:89 +msgid "" +"This function does not load or import the module; if the module wasn't " +"already loaded, you will get an empty module object. Use " +":c:func:`PyImport_ImportModule` or one of its variants to import a module. " +"Package structures implied by a dotted name for *name* are not created if " +"not already present." +msgstr "" +"此函数不会加载或导入指定模块;如果模块还未被加载,你将得到一个空的模块对象。 请使用 :c:func:`PyImport_ImportModule` " +"或它的某个变体形式来导入模块。 *name* 使用的带点号名称的包结构如果尚不存在则不会被创建。" + +#: ../../c-api/import.rst:100 +msgid "" +"Similar to :c:func:`PyImport_AddModuleRef`, but return a :term:`borrowed " +"reference` and *name* is a Python :class:`str` object." +msgstr "" +"类似于 :c:func:`PyImport_AddModuleRef`,但会返回一个 :term:`borrowed reference` 并且 " +"*name* 将是一个 Python :class:`str` 对象。" + +#: ../../c-api/import.rst:108 +msgid "" +"Similar to :c:func:`PyImport_AddModuleRef`, but return a :term:`borrowed " +"reference`." +msgstr "" +"类似于 :c:func:`PyImport_AddModuleRef`,但会返回一个 :term:`borrowed reference`。" + +#: ../../c-api/import.rst:116 +msgid "" +"Given a module name (possibly of the form ``package.module``) and a code " +"object read from a Python bytecode file or obtained from the built-in " +"function :func:`compile`, load the module. Return a new reference to the " +"module object, or ``NULL`` with an exception set if an error occurred. " +"*name* is removed from :data:`sys.modules` in error cases, even if *name* " +"was already in :data:`sys.modules` on entry to " +":c:func:`PyImport_ExecCodeModule`. Leaving incompletely initialized modules" +" in :data:`sys.modules` is dangerous, as imports of such modules have no way" +" to know that the module object is an unknown (and probably damaged with " +"respect to the module author's intents) state." +msgstr "" +"给定一个模块名称(可能为 ``package.module`` 形式)和一个从 Python 字节码文件读取或从内置函数 :func:`compile`" +" 获取的代码对象,加载该模块。 返回对该模块对象的新引用,或者如果发生错误则返回 ``NULL`` 并设置一个异常。 在发生错误的情况下 *name* " +"会从 :data:`sys.modules` 中被移除,即使 *name* 在进入 :c:func:`PyImport_ExecCodeModule` " +"时已存在于 :data:`sys.modules` 中。 在 :data:`sys.modules` " +"中保留未完全初始化的模块是危险的,因为导入这样的模块没有办法知道模块对象是否处于一种未知的(对于模块作者的意图来说可能是已损坏的)状态。" + +#: ../../c-api/import.rst:126 +msgid "" +"The module's :attr:`~module.__spec__` and :attr:`~module.__loader__` will be" +" set, if not set already, with the appropriate values. The spec's loader " +"will be set to the module's :attr:`!__loader__` (if set) and to an instance " +"of :class:`~importlib.machinery.SourceFileLoader` otherwise." +msgstr "" +"模块的 :attr:`~module.__spec__` 和 :attr:`~module.__loader__` 如果尚未设置,则会被设为适当的值。 " +"相应 spec 的加载器会被设为模块的 :attr:`!__loader__` (如已设置),否则会被设为 " +":class:`~importlib.machinery.SourceFileLoader` 的实例。" + +#: ../../c-api/import.rst:131 +msgid "" +"The module's :attr:`~module.__file__` attribute will be set to the code " +"object's :attr:`~codeobject.co_filename`." +msgstr "" + +#: ../../c-api/import.rst:134 +msgid "" +"This function will reload the module if it was already imported. See " +":c:func:`PyImport_ReloadModule` for the intended way to reload a module." +msgstr "如果模块已被导入则此函数将重载它。 请参阅 :c:func:`PyImport_ReloadModule` 了解重载模块的预定方式。" + +#: ../../c-api/import.rst:137 +msgid "" +"If *name* points to a dotted name of the form ``package.module``, any " +"package structures not already created will still not be created." +msgstr "如果 *name* 指向一个形式为 ``package.module`` 的带点号的名称,则任何尚未创建的包结构仍然不会被创建。" + +#: ../../c-api/import.rst:140 +msgid "" +"See also :c:func:`PyImport_ExecCodeModuleEx` and " +":c:func:`PyImport_ExecCodeModuleWithPathnames`." +msgstr "" +"另请参阅 :c:func:`PyImport_ExecCodeModuleEx` 和 " +":c:func:`PyImport_ExecCodeModuleWithPathnames`。" + +#: ../../c-api/import.rst:143 +msgid "" +"The setting of ``__cached__`` and :attr:`~module.__loader__` is deprecated. " +"See :class:`~importlib.machinery.ModuleSpec` for alternatives." +msgstr "" + +#: ../../c-api/import.rst:148 +msgid "``__cached__`` is no longer set." +msgstr "" + +#: ../../c-api/import.rst:154 +msgid "" +"Like :c:func:`PyImport_ExecCodeModule`, but the :attr:`~module.__file__` " +"attribute of the module object is set to *pathname* if it is non-``NULL``." +msgstr "" +"类似于 :c:func:`PyImport_ExecCodeModule`,但是如果 *pathname* 不为 ``NULL`` 则会将其设为模块对象" +" :attr:`~module.__file__` 属性的值。" + +#: ../../c-api/import.rst:157 +msgid "See also :c:func:`PyImport_ExecCodeModuleWithPathnames`." +msgstr "参见 :c:func:`PyImport_ExecCodeModuleWithPathnames`。" + +#: ../../c-api/import.rst:162 +msgid "" +"Like :c:func:`PyImport_ExecCodeModuleEx`, but the path to any compiled file " +"via *cpathname* is used appropriately when non-``NULL``. Of the three " +"functions, this is the preferred one to use." +msgstr "" + +#: ../../c-api/import.rst:168 +msgid "" +"Setting ``__cached__`` is deprecated. See " +":class:`~importlib.machinery.ModuleSpec` for alternatives." +msgstr "" + +#: ../../c-api/import.rst:172 +msgid "``__cached__`` no longer set." +msgstr "" + +#: ../../c-api/import.rst:178 +msgid "" +"Like :c:func:`PyImport_ExecCodeModuleObject`, but *name*, *pathname* and " +"*cpathname* are UTF-8 encoded strings. Attempts are also made to figure out " +"what the value for *pathname* should be from *cpathname* if the former is " +"set to ``NULL``." +msgstr "" +"类似于 :c:func:`PyImport_ExecCodeModuleObject`,但 *name*, *pathname* 和 " +"*cpathname* 为 UTF-8 编码的字符串。如果 *pathname* 也被设为 ``NULL`` 则还会尝试根据 *cpathname* " +"推断出前者的值。" + +#: ../../c-api/import.rst:184 +msgid "" +"Uses :func:`!imp.source_from_cache` in calculating the source path if only " +"the bytecode path is provided." +msgstr "如果只提供了字节码路径则会使用 :func:`!imp.source_from_cache` 来计算源路径。" + +#: ../../c-api/import.rst:187 +msgid "No longer uses the removed :mod:`!imp` module." +msgstr "不再使用已移除的 :mod:`!imp` 模块。" + +#: ../../c-api/import.rst:193 +msgid "" +"Return the magic number for Python bytecode files (a.k.a. :file:`.pyc` " +"file). The magic number should be present in the first four bytes of the " +"bytecode file, in little-endian byte order. Returns ``-1`` on error." +msgstr "" +"返回 Python 字节码文件(即 :file:`.pyc` 文件)的魔数。 此魔数应当存在于字节码文件的开头四个字节中,按照小端字节序。 出错时返回 " +"``-1``。" + +#: ../../c-api/import.rst:197 +msgid "Return value of ``-1`` upon failure." +msgstr "失败时返回值 ``-1``。" + +#: ../../c-api/import.rst:203 +msgid "" +"Return the magic tag string for :pep:`3147` format Python bytecode file " +"names. Keep in mind that the value at ``sys.implementation.cache_tag`` is " +"authoritative and should be used instead of this function." +msgstr "" +"针对 :pep:`3147` 格式的 Python 字节码文件名返回魔术标签字符串。 请记住在 " +"``sys.implementation.cache_tag`` 上的值是应当被用来代替此函数的更权威的值。" + +#: ../../c-api/import.rst:211 +msgid "" +"Return the dictionary used for the module administration (a.k.a. " +"``sys.modules``). Note that this is a per-interpreter variable." +msgstr "返回用于模块管理的字典 (即 ``sys.modules``)。 请注意这是针对每个解释器的变量。" + +#: ../../c-api/import.rst:216 +msgid "" +"Return the already imported module with the given name. If the module has " +"not been imported yet then returns ``NULL`` but does not set an error. " +"Returns ``NULL`` and sets an error if the lookup failed." +msgstr "返回给定名称的已导入模块。 如果模块尚未导入则返回 ``NULL`` 但不会设置错误。 如果查找失败则返回 ``NULL`` 并设置错误。" + +#: ../../c-api/import.rst:224 +msgid "" +"Return a finder object for a :data:`sys.path`/:attr:`!pkg.__path__` item " +"*path*, possibly by fetching it from the :data:`sys.path_importer_cache` " +"dict. If it wasn't yet cached, traverse :data:`sys.path_hooks` until a hook" +" is found that can handle the path item. Return ``None`` if no hook could; " +"this tells our caller that the :term:`path based finder` could not find a " +"finder for this path item. Cache the result in " +":data:`sys.path_importer_cache`. Return a new reference to the finder " +"object." +msgstr "" +"返回针对一个 :data:`sys.path`/:attr:`!pkg.__path__` 中条目 *path* 的查找器对象,可能会从 " +":data:`sys.path_importer_cache` 字典中获取。 如果它尚未被缓存,则会遍历 :data:`sys.path_hooks` " +"直至找到一个能处理该路径条目的钩子。 如果没有可用的钩子则返回 ``None``;这将告知调用方 :term:`path based finder` " +"无法为该路径条目找到查找器。 结果将缓存到 :data:`sys.path_importer_cache` 中。 返回一个指向查找器对象的新引用。" + +#: ../../c-api/import.rst:235 +msgid "" +"Load a frozen module named *name*. Return ``1`` for success, ``0`` if the " +"module is not found, and ``-1`` with an exception set if the initialization " +"failed. To access the imported module on a successful load, use " +":c:func:`PyImport_ImportModule`. (Note the misnomer --- this function would" +" reload the module if it was already imported.)" +msgstr "" +"加载名称为 *name* 的已冻结模块。 成功时返回 ``1``,如果未找到模块则返回 ``0``,如果初始化失败则返回 ``-1`` 并设置一个异常。" +" 要在加载成功后访问被导入的模块,请使用 :c:func:`PyImport_ImportModule`。 (请注意此名称有误导性 --- " +"如果模块已被导入此函数将重载它。)" + +#: ../../c-api/import.rst:243 +msgid "The ``__file__`` attribute is no longer set on the module." +msgstr "``__file__`` 属性将不再在模块上设置。" + +#: ../../c-api/import.rst:249 +msgid "" +"Similar to :c:func:`PyImport_ImportFrozenModuleObject`, but the name is a " +"UTF-8 encoded string instead of a Unicode object." +msgstr "" +"类似于 :c:func:`PyImport_ImportFrozenModuleObject`,但其名称为 UTF-8 编码的字符串而不是 " +"Unicode 对象。" + +#: ../../c-api/import.rst:257 +msgid "" +"This is the structure type definition for frozen module descriptors, as " +"generated by the :program:`freeze` utility (see :file:`Tools/freeze/` in the" +" Python source distribution). Its definition, found in " +":file:`Include/import.h`, is::" +msgstr "" +"这是针对已冻结模块描述器的结构类型定义,与由 :program:`freeze` 工具所生成的一致 (请参看 Python 源代码发行版中的 " +":file:`Tools/freeze/`)。 其定义可在 :file:`Include/import.h` 中找到::" + +#: ../../c-api/import.rst:262 +msgid "" +"struct _frozen {\n" +" const char *name;\n" +" const unsigned char *code;\n" +" int size;\n" +" bool is_package;\n" +"};" +msgstr "" +"struct _frozen {\n" +" const char *name;\n" +" const unsigned char *code;\n" +" int size;\n" +" bool is_package;\n" +"};" + +#: ../../c-api/import.rst:269 +msgid "" +"The new ``is_package`` field indicates whether the module is a package or " +"not. This replaces setting the ``size`` field to a negative value." +msgstr "新的 ``is_package`` 字段指明模块是否为一个包。 这替代了将 ``size`` 设为负值的做法。" + +#: ../../c-api/import.rst:275 +msgid "" +"This pointer is initialized to point to an array of :c:struct:`_frozen` " +"records, terminated by one whose members are all ``NULL`` or zero. When a " +"frozen module is imported, it is searched in this table. Third-party code " +"could play tricks with this to provide a dynamically created collection of " +"frozen modules." +msgstr "" +"该指针被初始化为指向一个 :c:struct:`_frozen` 记录的数组,以一个所有成员均为 ``NULL`` 或零的记录表示结束。 " +"当一个冻结模块被导入时,它将在此表中被搜索。 第三方代码可以利用此方式来提供动态创建的冻结模块集。" + +#: ../../c-api/import.rst:283 +msgid "" +"Add a single module to the existing table of built-in modules. This is a " +"convenience wrapper around :c:func:`PyImport_ExtendInittab`, returning " +"``-1`` if the table could not be extended. The new module can be imported " +"by the name *name*, and uses the function *initfunc* as the initialization " +"function called on the first attempted import. This should be called before" +" :c:func:`Py_Initialize`." +msgstr "" +"向现有的内置模块表添加一个模块。 这是对 :c:func:`PyImport_ExtendInittab` 的便捷包装,如果无法扩展表则返回 " +"``-1``。 新的模块可使用名称 *name* 来导入,并使用函数 *initfunc* 作为在第一次尝试导入时调用的初始化函数。 此函数应当在 " +":c:func:`Py_Initialize` 之前调用。" + +#: ../../c-api/import.rst:293 +msgid "" +"Structure describing a single entry in the list of built-in modules. " +"Programs which embed Python may use an array of these structures in " +"conjunction with :c:func:`PyImport_ExtendInittab` to provide additional " +"built-in modules. The structure consists of two members:" +msgstr "" +"描述内置模块列表中一个单独条目的结构体。 嵌入 Python 的程序可以将这些结构体的数组与 " +":c:func:`PyImport_ExtendInittab` 结合使用以提供额外的内置模块。 该结构体由两个成员组成:" + +#: ../../c-api/import.rst:301 +msgid "The module name, as an ASCII encoded string." +msgstr "模块名称,为一个 ASCII 编码的字符串。" + +#: ../../c-api/import.rst:305 +msgid "Initialization function for a module built into the interpreter." +msgstr "针对内置于解释器的模块的初始化函数。" + +#: ../../c-api/import.rst:310 +msgid "" +"Add a collection of modules to the table of built-in modules. The *newtab* " +"array must end with a sentinel entry which contains ``NULL`` for the " +":c:member:`~_inittab.name` field; failure to provide the sentinel value can " +"result in a memory fault. Returns ``0`` on success or ``-1`` if insufficient" +" memory could be allocated to extend the internal table. In the event of " +"failure, no modules are added to the internal table. This must be called " +"before :c:func:`Py_Initialize`." +msgstr "" +"向内置模块表添加一组模块。 *newtab* 数组必须以一个包含 ``NULL`` 作为 :c:member:`~_inittab.name` " +"字段的哨兵条目结束;未提供哨兵值可能导致内存错误。 成功时返回 ``0`` 或者如果无法分配足够内存来扩展内部表则返回 ``-1``。 " +"当失败时,将不会向内部表添加任何模块。 该函数必须在 :c:func:`Py_Initialize` 之前调用。" + +#: ../../c-api/import.rst:317 +msgid "" +"If Python is initialized multiple times, :c:func:`PyImport_AppendInittab` or" +" :c:func:`PyImport_ExtendInittab` must be called before each Python " +"initialization." +msgstr "" +"如果 Python 要被多次初始化,则 :c:func:`PyImport_AppendInittab` 或 " +":c:func:`PyImport_ExtendInittab` 必须在每次 Python 初始化之前调用。" + +#: ../../c-api/import.rst:324 +msgid "" +"The table of built-in modules used by Python initialization. Do not use this" +" directly; use :c:func:`PyImport_AppendInittab` and " +":c:func:`PyImport_ExtendInittab` instead." +msgstr "" +"由 Python 初始化使用的内置模块表。 请勿直接使用;应改用 :c:func:`PyImport_AppendInittab` 和 " +":c:func:`PyImport_ExtendInittab`。" + +#: ../../c-api/import.rst:331 +msgid "Import the module *mod_name* and get its attribute *attr_name*." +msgstr "导入 *mod_name* 模块并获取其 *attr_name* 属性。" + +#: ../../c-api/import.rst:333 +msgid "Names must be Python :class:`str` objects." +msgstr "名称必须为 Python :class:`str` 对象。" + +#: ../../c-api/import.rst:335 +msgid "" +"Helper function combining :c:func:`PyImport_Import` and " +":c:func:`PyObject_GetAttr`. For example, it can raise :exc:`ImportError` if " +"the module is not found, and :exc:`AttributeError` if the attribute doesn't " +"exist." +msgstr "" +"结合了 :c:func:`PyImport_Import` 和 :c:func:`PyObject_GetAttr` 的辅助函数。 " +"例如,它可以在模块未找到时引发 :exc:`ImportError`,而在属性不存在时引发 :exc:`AttributeError`。" + +#: ../../c-api/import.rst:344 ../../c-api/import.rst:364 +msgid "" +"Similar to :c:func:`PyImport_ImportModuleAttr`, but names are UTF-8 encoded " +"strings instead of Python :class:`str` objects." +msgstr "" +"类似于 :c:func:`PyImport_ImportModuleAttr`,但名称为 UTF-8 编码的字符串而不是 Python " +":class:`str` 对象。" + +#: ../../c-api/import.rst:351 +msgid "Gets the current lazy imports mode." +msgstr "" + +#: ../../c-api/import.rst:357 +msgid "" +"Return a :term:`strong reference` to the current lazy imports filter, or " +"``NULL`` if none exists. This function always succeeds." +msgstr "" + +#: ../../c-api/import.rst:367 +msgid "This function always returns ``0``." +msgstr "" + +#: ../../c-api/import.rst:373 +msgid "" +"Sets the current lazy imports filter. The *filter* should be a callable that" +" will receive ``(importing_module_name, imported_module_name, [fromlist])`` " +"when an import can potentially be lazy. The ``imported_module_name`` value " +"is the resolved module name, so ``lazy from .spam import eggs`` passes " +"``package.spam``. The callable must return ``True`` if the import should be " +"lazy and ``False`` otherwise." +msgstr "" + +#: ../../c-api/import.rst:380 +msgid "Return ``0`` on success and ``-1`` with an exception set otherwise." +msgstr "" + +#: ../../c-api/import.rst:386 +msgid "Enumeration of possible lazy import modes." +msgstr "" + +#: ../../c-api/import.rst:390 +msgid "Respect the ``lazy`` keyword in source code. This is the default mode." +msgstr "" + +#: ../../c-api/import.rst:394 +msgid "Make all imports lazy by default." +msgstr "" + +#: ../../c-api/import.rst:398 +msgid "" +"Disable lazy imports entirely. Even explicit ``lazy`` statements become " +"eager imports." +msgstr "" + +#: ../../c-api/import.rst:405 +msgid "" +"This function is a building block that enables embedders to implement the " +":py:meth:`~importlib.abc.Loader.create_module` step of custom static " +"extension importers (e.g. of statically-linked extensions)." +msgstr "" + +#: ../../c-api/import.rst:409 +msgid "*spec* must be a :class:`~importlib.machinery.ModuleSpec` object." +msgstr "" + +#: ../../c-api/import.rst:411 +msgid "" +"*initfunc* must be an :ref:`initialization function `, the same as for :c:func:`PyImport_AppendInittab`." +msgstr "" + +#: ../../c-api/import.rst:414 +msgid "" +"On success, create and return a module object. This module will not be " +"initialized; call :c:func:`PyModule_Exec` to initialize it. (Custom " +"importers should do this in their " +":py:meth:`~importlib.abc.Loader.exec_module` method.)" +msgstr "" + +#: ../../c-api/import.rst:420 +msgid "On error, return NULL with an exception set." +msgstr "" + +#: ../../c-api/import.rst:11 +msgid "package variable" +msgstr "包变量" + +#: ../../c-api/import.rst:11 +msgid "__all__" +msgstr "__all__" + +#: ../../c-api/import.rst:11 +msgid "__all__ (package variable)" +msgstr "__all__ (包变量)" + +#: ../../c-api/import.rst:11 +msgid "modules (in module sys)" +msgstr "modules (在 sys 模块中)" + +#: ../../c-api/import.rst:22 ../../c-api/import.rst:114 +msgid "built-in function" +msgstr "内置函数" + +#: ../../c-api/import.rst:22 +msgid "__import__" +msgstr "__import__" + +#: ../../c-api/import.rst:114 +msgid "compile" +msgstr "compile" + +#: ../../c-api/import.rst:255 +msgid "freeze utility" +msgstr "冻结工具" diff --git a/c-api/index.po b/c-api/index.po new file mode 100644 index 0000000000..5fda4c2e51 --- /dev/null +++ b/c-api/index.po @@ -0,0 +1,36 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/index.rst:5 +msgid "Python/C API reference manual" +msgstr "Python/C API 参考手册" + +#: ../../c-api/index.rst:7 +msgid "" +"This manual documents the API used by C and C++ programmers who want to " +"write extension modules or embed Python. It is a companion to " +":ref:`extending-index`, which describes the general principles of extension " +"writing but does not document the API functions in detail." +msgstr "" +"本手册描述了希望编写扩展模块或嵌入 Python 的 C 和 C++ 程序员可用的 API。它是 :ref:`extending-index` " +"的配套文档,后者描述了扩展编写的一般原则,但没有详细描述 API 函数。" diff --git a/c-api/init.po b/c-api/init.po new file mode 100644 index 0000000000..f58ff24c4a --- /dev/null +++ b/c-api/init.po @@ -0,0 +1,54 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/init.rst:4 +msgid "Initialization, finalization, and threads" +msgstr "初始化、最终化和线程" + +#: ../../c-api/init.rst:6 +msgid "This page has been split up into the following:" +msgstr "本页面分为以下几部分:" + +#: ../../c-api/init.rst:8 +msgid ":ref:`initialization`" +msgstr ":ref:`initialization`" + +#: ../../c-api/init.rst:9 +msgid ":ref:`threads`" +msgstr ":ref:`threads`" + +#: ../../c-api/init.rst:10 +msgid ":ref:`synchronization`" +msgstr ":ref:`synchronization`" + +#: ../../c-api/init.rst:11 +msgid ":ref:`thread-local-storage`" +msgstr ":ref:`thread-local-storage`" + +#: ../../c-api/init.rst:12 +msgid ":ref:`sub-interpreter-support`" +msgstr ":ref:`sub-interpreter-support`" + +#: ../../c-api/init.rst:13 +msgid ":ref:`profiling`" +msgstr ":ref:`profiling`" diff --git a/c-api/init_config.po b/c-api/init_config.po new file mode 100644 index 0000000000..bb7ddef7fa --- /dev/null +++ b/c-api/init_config.po @@ -0,0 +1,3941 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# 99 , 2026 +# Freesand Leo , 2026 +# python-doc bot, 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:00+0000\n" +"Last-Translator: python-doc bot, 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/init_config.rst:7 +msgid "Python Initialization Configuration" +msgstr "Python 初始化配置" + +#: ../../c-api/init_config.rst:13 +msgid "PyInitConfig C API" +msgstr "PyInitConfig C API" + +#: ../../c-api/init_config.rst:17 +msgid "Python can be initialized with :c:func:`Py_InitializeFromInitConfig`." +msgstr "Python 可以用 :c:func:`Py_InitializeFromInitConfig` 来初始化。" + +#: ../../c-api/init_config.rst:19 ../../c-api/init_config.rst:650 +msgid "" +"The :c:func:`Py_RunMain` function can be used to write a customized Python " +"program." +msgstr ":c:func:`Py_RunMain` 函数可被用来编写定制的 Python 程序。" + +#: ../../c-api/init_config.rst:22 ../../c-api/init_config.rst:653 +msgid "" +"See also :ref:`Initialization, Finalization, and Threads `." +msgstr "另请参阅 :ref:`初始化、最终化与线程 `。" + +#: ../../c-api/init_config.rst:25 +msgid ":pep:`741` \"Python Configuration C API\"." +msgstr ":pep:`741` \"Python 配置 C API\"。" + +#: ../../c-api/init_config.rst:29 ../../c-api/init_config.rst:660 +msgid "Example" +msgstr "示例" + +#: ../../c-api/init_config.rst:31 +msgid "" +"Example of customized Python always running with the :ref:`Python " +"Development Mode ` enabled; return ``-1`` on error:" +msgstr "运行时始终启用 :ref:`Python 开发模式 ` 的定制版 Python 的例子;出错时将返回 ``-1``:" + +#: ../../c-api/init_config.rst:34 +msgid "" +"int init_python(void)\n" +"{\n" +" PyInitConfig *config = PyInitConfig_Create();\n" +" if (config == NULL) {\n" +" printf(\"PYTHON INIT ERROR: memory allocation failed\\n\");\n" +" return -1;\n" +" }\n" +"\n" +" // Enable the Python Development Mode\n" +" if (PyInitConfig_SetInt(config, \"dev_mode\", 1) < 0) {\n" +" goto error;\n" +" }\n" +"\n" +" // Initialize Python with the configuration\n" +" if (Py_InitializeFromInitConfig(config) < 0) {\n" +" goto error;\n" +" }\n" +" PyInitConfig_Free(config);\n" +" return 0;\n" +"\n" +"error:\n" +" {\n" +" // Display the error message.\n" +" //\n" +" // This uncommon braces style is used, because you cannot make\n" +" // goto targets point to variable declarations.\n" +" const char *err_msg;\n" +" (void)PyInitConfig_GetError(config, &err_msg);\n" +" printf(\"PYTHON INIT ERROR: %s\\n\", err_msg);\n" +" PyInitConfig_Free(config);\n" +" return -1;\n" +" }\n" +"}" +msgstr "" +"int init_python(void)\n" +"{\n" +" PyInitConfig *config = PyInitConfig_Create();\n" +" if (config == NULL) {\n" +" printf(\"PYTHON INIT ERROR: memory allocation failed\\n\");\n" +" return -1;\n" +" }\n" +"\n" +" // 启用 Python 开发模式\n" +" if (PyInitConfig_SetInt(config, \"dev_mode\", 1) < 0) {\n" +" goto error;\n" +" }\n" +"\n" +" // 使用配置初始化 Python\n" +" if (Py_InitializeFromInitConfig(config) < 0) {\n" +" goto error;\n" +" }\n" +" PyInitConfig_Free(config);\n" +" return 0;\n" +"\n" +"error:\n" +" {\n" +" // 显示错误消息\n" +" //\n" +" // 使用这种不常见的花括号风格,因为你不能\n" +" // 将跳转目标指向变量声明。\n" +" const char *err_msg;\n" +" (void)PyInitConfig_GetError(config, &err_msg);\n" +" printf(\"PYTHON INIT ERROR: %s\\n\", err_msg);\n" +" PyInitConfig_Free(config);\n" +" return -1;\n" +" }\n" +"}" + +#: ../../c-api/init_config.rst:71 +msgid "Create Config" +msgstr "创建配置" + +#: ../../c-api/init_config.rst:75 +msgid "Opaque structure to configure the Python initialization." +msgstr "用于配置 Python 初始化的不透明结构体。" + +#: ../../c-api/init_config.rst:80 +msgid "" +"Create a new initialization configuration using :ref:`Isolated Configuration" +" ` default values." +msgstr "使用 :ref:`隔离配置 ` 的默认值新建一个初始化配置。" + +#: ../../c-api/init_config.rst:83 +msgid "It must be freed by :c:func:`PyInitConfig_Free`." +msgstr "它必须由 :c:func:`PyInitConfig_Free` 来释放。" + +#: ../../c-api/init_config.rst:85 +msgid "Return ``NULL`` on memory allocation failure." +msgstr "内存分配失败时返回 ``NULL``。" + +#: ../../c-api/init_config.rst:90 +msgid "Free memory of the initialization configuration *config*." +msgstr "释放初始化配置 *config* 的内存。" + +#: ../../c-api/init_config.rst:92 +msgid "If *config* is ``NULL``, no operation is performed." +msgstr "如果 *config* 为 ``NULL``,则不执行任何操作。" + +#: ../../c-api/init_config.rst:96 +msgid "Error Handling" +msgstr "错误处理" + +#: ../../c-api/init_config.rst:100 +msgid "Get the *config* error message." +msgstr "获取 *config* 错误消息。" + +#: ../../c-api/init_config.rst:102 +msgid "Set *\\*err_msg* and return ``1`` if an error is set." +msgstr "如果设置了一个错误则设置 *\\*err_msg* 并返回 ``1``。" + +#: ../../c-api/init_config.rst:103 +msgid "Set *\\*err_msg* to ``NULL`` and return ``0`` otherwise." +msgstr "在其他情况下将 *\\*err_msg* 设为 ``NULL`` 并返回 ``0``。" + +#: ../../c-api/init_config.rst:105 +msgid "An error message is a UTF-8 encoded string." +msgstr "错误消息是一个 UTF-8 编码的字符串。" + +#: ../../c-api/init_config.rst:107 +msgid "" +"If *config* has an exit code, format the exit code as an error message." +msgstr "如果 *config* 具有一个退出码,则将退出码格式化为错误消息。" + +#: ../../c-api/init_config.rst:110 +msgid "" +"The error message remains valid until another ``PyInitConfig`` function is " +"called with *config*. The caller doesn't have to free the error message." +msgstr "错误消息将保持有效直到对 *config* 调用另一个 ``PyInitConfig`` 函数。调用方不必释放错误消息。" + +#: ../../c-api/init_config.rst:117 +msgid "Get the *config* exit code." +msgstr "获取 *config* 退出码。" + +#: ../../c-api/init_config.rst:119 +msgid "Set *\\*exitcode* and return ``1`` if *config* has an exit code set." +msgstr "如果 *config* 设置了一个退出码则设置 *\\*exitcode* 并返回 ``1``。" + +#: ../../c-api/init_config.rst:120 +msgid "Return ``0`` if *config* has no exit code set." +msgstr "如果 *config* 没有设置退出码则返回 ``0``。" + +#: ../../c-api/init_config.rst:122 +msgid "" +"Only the ``Py_InitializeFromInitConfig()`` function can set an exit code if " +"the ``parse_argv`` option is non-zero." +msgstr "" +"如果 ``parse_argv`` 选项为非零值则只有 ``Py_InitializeFromInitConfig()`` 函数能设置退出码。" + +#: ../../c-api/init_config.rst:125 +msgid "" +"An exit code can be set when parsing the command line failed (exit code " +"``2``) or when a command line option asks to display the command line help " +"(exit code ``0``)." +msgstr "退出码的设置可以在解析命令行失败时 (退出码 ``2``) 或是在命令行选项请求显示命令行帮助时 (退出码 ``0``) 进行。" + +#: ../../c-api/init_config.rst:131 +msgid "Get Options" +msgstr "获取选项" + +#: ../../c-api/init_config.rst:133 ../../c-api/init_config.rst:187 +#: ../../c-api/init_config.rst:559 +msgid "" +"The configuration option *name* parameter must be a non-NULL null-terminated" +" UTF-8 encoded string. See :ref:`Configuration Options `." +msgstr "" +"配置选项的 *name* 形参必须是一个非 NULL 的以空值结束的 UTF-8 编码字符串。参见 :ref:`配置选项 ` 一节。" + +#: ../../c-api/init_config.rst:138 +msgid "Test if the configuration has an option called *name*." +msgstr "检测配置是否具有一个名为 *name* 的选项。" + +#: ../../c-api/init_config.rst:140 +msgid "Return ``1`` if the option exists, or return ``0`` otherwise." +msgstr "如果选项存在则返回 ``1``,否则返回 ``0``。" + +#: ../../c-api/init_config.rst:145 +msgid "Get an integer configuration option." +msgstr "获取一个整数形式的配置选项。" + +#: ../../c-api/init_config.rst:147 ../../c-api/init_config.rst:156 +msgid "Set *\\*value*, and return ``0`` on success." +msgstr "在成功时设置 *\\*value*,并返回 ``0``。" + +#: ../../c-api/init_config.rst:148 ../../c-api/init_config.rst:157 +#: ../../c-api/init_config.rst:172 ../../c-api/init_config.rst:200 +#: ../../c-api/init_config.rst:209 ../../c-api/init_config.rst:218 +#: ../../c-api/init_config.rst:233 ../../c-api/init_config.rst:249 +msgid "Set an error in *config* and return ``-1`` on error." +msgstr "在出错时在 *config* 中设置一个错误并返回 ``-1``。" + +#: ../../c-api/init_config.rst:153 +msgid "" +"Get a string configuration option as a null-terminated UTF-8 encoded string." +msgstr "获取一个以空值结束的 UTF-8 编码字符串形式的字符串配置选项。" + +#: ../../c-api/init_config.rst:159 +msgid "" +"*\\*value* can be set to ``NULL`` if the option is an optional string and " +"the option is unset." +msgstr "如果选项是一个可选字符串并且选项被取消设置则 *\\*value* 可被设为 ``NULL``。" + +#: ../../c-api/init_config.rst:162 +msgid "" +"On success, the string must be released with ``free(value)`` if it's not " +"``NULL``." +msgstr "在成功时,字符串如果不为 ``NULL`` 则必须用 ``free(value)`` 来释放它。" + +#: ../../c-api/init_config.rst:168 +msgid "" +"Get a string list configuration option as an array of null-terminated UTF-8 " +"encoded strings." +msgstr "获取一个由以空值结束的 UTF-8 编码字符串组成的数组形式的字符串列表配置选项。" + +#: ../../c-api/init_config.rst:171 +msgid "Set *\\*length* and *\\*value*, and return ``0`` on success." +msgstr "在成功时设置 *\\*length* 和 *\\*value*,并返回 ``0``。" + +#: ../../c-api/init_config.rst:174 +msgid "" +"On success, the string list must be released with " +"``PyInitConfig_FreeStrList(length, items)``." +msgstr "在成功时,字符串列表必须用 ``PyInitConfig_FreeStrList(length, items)`` 来释放。" + +#: ../../c-api/init_config.rst:180 +msgid "Free memory of a string list created by ``PyInitConfig_GetStrList()``." +msgstr "释放由 ``PyInitConfig_GetStrList()`` 创建的字符串列表的内存。" + +#: ../../c-api/init_config.rst:185 +msgid "Set Options" +msgstr "设置选项" + +#: ../../c-api/init_config.rst:190 +msgid "" +"Some configuration options have side effects on other options. This logic is" +" only implemented when ``Py_InitializeFromInitConfig()`` is called, not by " +"the \"Set\" functions below. For example, setting ``dev_mode`` to ``1`` does" +" not set ``faulthandler`` to ``1``." +msgstr "" +"某些配置选项具有对其他选项的附带影响。这种逻辑仅限于调用了 ``Py_InitializeFromInitConfig()`` " +"的时候,而不被下面的“设置”函数所实现。例如,将 ``dev_mode`` 设为 ``1`` 并不会将 ``faulthandler`` 设为 " +"``1``。" + +#: ../../c-api/init_config.rst:197 +msgid "Set an integer configuration option." +msgstr "设置一个整数形式的配置选项。" + +#: ../../c-api/init_config.rst:199 ../../c-api/init_config.rst:208 +#: ../../c-api/init_config.rst:217 ../../c-api/init_config.rst:232 +#: ../../c-api/init_config.rst:248 ../../c-api/init_config.rst:591 +msgid "Return ``0`` on success." +msgstr "成功时返回 ``0``。" + +#: ../../c-api/init_config.rst:205 +msgid "" +"Set a string configuration option from a null-terminated UTF-8 encoded " +"string. The string is copied." +msgstr "设置一个以空值结束的 UTF-8 编码字符串形式的字符串配置选项。该字符串将被拷贝。" + +#: ../../c-api/init_config.rst:214 +msgid "" +"Set a string list configuration option from an array of null-terminated " +"UTF-8 encoded strings. The string list is copied." +msgstr "设置一个由以空值结束的 UTF-8 编码字符串组成的数组形式的字符串列表配置选项。该字符串列表将被拷贝。" + +#: ../../c-api/init_config.rst:222 +msgid "Module" +msgstr "模块" + +#: ../../c-api/init_config.rst:226 +msgid "Add a built-in extension module to the table of built-in modules." +msgstr "将一个内置扩展模块添加到内置模块表。" + +#: ../../c-api/init_config.rst:228 +msgid "" +"The new module can be imported by the name *name*, and uses the function " +"*initfunc* as the initialization function called on the first attempted " +"import." +msgstr "这个新模块可按名称 *name* 导入,并使用函数 *initfunc* 作为在首次尝试导入时要调用的初始化函数。" + +#: ../../c-api/init_config.rst:235 +msgid "" +"If Python is initialized multiple times, ``PyInitConfig_AddModule()`` must " +"be called at each Python initialization." +msgstr "" +"如果 Python 要被多次初始化,则 ``PyInitConfig_AddModule()`` 必须在每次 Python 初始化时被调用。" + +#: ../../c-api/init_config.rst:238 +msgid "Similar to the :c:func:`PyImport_AppendInittab` function." +msgstr "类似于 :c:func:`PyImport_AppendInittab` 函数。" + +#: ../../c-api/init_config.rst:242 +msgid "Initialize Python" +msgstr "初始化 Python" + +#: ../../c-api/init_config.rst:246 +msgid "Initialize Python from the initialization configuration." +msgstr "根据初始化配置来初始化 Python。" + +#: ../../c-api/init_config.rst:250 +msgid "" +"Set an exit code in *config* and return ``-1`` if Python wants to exit." +msgstr "如果 Python 想要退出则在 *config* 中设置一个退出码并返回 ``-1``。" + +#: ../../c-api/init_config.rst:253 +msgid "See ``PyInitConfig_GetExitcode()`` for the exit code case." +msgstr "请参阅 ``PyInitConfig_GetExitcode()`` 了解退出码用例。" + +#: ../../c-api/init_config.rst:259 +msgid "Configuration Options" +msgstr "配置选项" + +#: ../../c-api/init_config.rst:264 +msgid "Option" +msgstr "选项" + +#: ../../c-api/init_config.rst:265 +msgid "PyConfig/PyPreConfig member" +msgstr "PyConfig/PyPreConfig 成员" + +#: ../../c-api/init_config.rst:266 +msgid "Type" +msgstr "类型" + +#: ../../c-api/init_config.rst:267 +msgid "Visibility" +msgstr "可见性" + +#: ../../c-api/init_config.rst:268 +msgid "``\"allocator\"``" +msgstr "``\"allocator\"``" + +#: ../../c-api/init_config.rst:269 +msgid ":c:member:`allocator `" +msgstr ":c:member:`allocator `" + +#: ../../c-api/init_config.rst:270 ../../c-api/init_config.rst:294 +#: ../../c-api/init_config.rst:322 ../../c-api/init_config.rst:358 +#: ../../c-api/init_config.rst:366 ../../c-api/init_config.rst:378 +#: ../../c-api/init_config.rst:406 ../../c-api/init_config.rst:494 +#: ../../c-api/init_config.rst:522 ../../c-api/init_config.rst:576 +msgid "``int``" +msgstr "``int``" + +#: ../../c-api/init_config.rst:271 ../../c-api/init_config.rst:291 +#: ../../c-api/init_config.rst:299 ../../c-api/init_config.rst:303 +#: ../../c-api/init_config.rst:307 ../../c-api/init_config.rst:311 +#: ../../c-api/init_config.rst:315 ../../c-api/init_config.rst:319 +#: ../../c-api/init_config.rst:327 ../../c-api/init_config.rst:331 +#: ../../c-api/init_config.rst:335 ../../c-api/init_config.rst:347 +#: ../../c-api/init_config.rst:351 ../../c-api/init_config.rst:355 +#: ../../c-api/init_config.rst:359 ../../c-api/init_config.rst:363 +#: ../../c-api/init_config.rst:367 ../../c-api/init_config.rst:375 +#: ../../c-api/init_config.rst:387 ../../c-api/init_config.rst:391 +#: ../../c-api/init_config.rst:395 ../../c-api/init_config.rst:399 +#: ../../c-api/init_config.rst:411 ../../c-api/init_config.rst:415 +#: ../../c-api/init_config.rst:423 ../../c-api/init_config.rst:427 +#: ../../c-api/init_config.rst:439 ../../c-api/init_config.rst:451 +#: ../../c-api/init_config.rst:455 ../../c-api/init_config.rst:459 +#: ../../c-api/init_config.rst:463 ../../c-api/init_config.rst:467 +#: ../../c-api/init_config.rst:471 ../../c-api/init_config.rst:475 +#: ../../c-api/init_config.rst:479 ../../c-api/init_config.rst:483 +#: ../../c-api/init_config.rst:487 ../../c-api/init_config.rst:495 +#: ../../c-api/init_config.rst:503 ../../c-api/init_config.rst:507 +#: ../../c-api/init_config.rst:511 ../../c-api/init_config.rst:515 +#: ../../c-api/init_config.rst:519 ../../c-api/init_config.rst:527 +#: ../../c-api/init_config.rst:543 +msgid "Read-only" +msgstr "只读" + +#: ../../c-api/init_config.rst:272 +msgid "``\"argv\"``" +msgstr "``\"argv\"``" + +#: ../../c-api/init_config.rst:273 +msgid ":c:member:`argv `" +msgstr ":c:member:`argv `" + +#: ../../c-api/init_config.rst:274 ../../c-api/init_config.rst:402 +#: ../../c-api/init_config.rst:410 ../../c-api/init_config.rst:530 +#: ../../c-api/init_config.rst:578 +msgid "``list[str]``" +msgstr "``list[str]``" + +#: ../../c-api/init_config.rst:275 ../../c-api/init_config.rst:279 +#: ../../c-api/init_config.rst:283 ../../c-api/init_config.rst:287 +#: ../../c-api/init_config.rst:295 ../../c-api/init_config.rst:323 +#: ../../c-api/init_config.rst:339 ../../c-api/init_config.rst:343 +#: ../../c-api/init_config.rst:371 ../../c-api/init_config.rst:379 +#: ../../c-api/init_config.rst:383 ../../c-api/init_config.rst:403 +#: ../../c-api/init_config.rst:407 ../../c-api/init_config.rst:419 +#: ../../c-api/init_config.rst:431 ../../c-api/init_config.rst:435 +#: ../../c-api/init_config.rst:443 ../../c-api/init_config.rst:447 +#: ../../c-api/init_config.rst:491 ../../c-api/init_config.rst:499 +#: ../../c-api/init_config.rst:523 ../../c-api/init_config.rst:531 +#: ../../c-api/init_config.rst:535 ../../c-api/init_config.rst:539 +msgid "Public" +msgstr "公有" + +#: ../../c-api/init_config.rst:276 +msgid "``\"base_exec_prefix\"``" +msgstr "``\"base_exec_prefix\"``" + +#: ../../c-api/init_config.rst:277 +msgid ":c:member:`base_exec_prefix `" +msgstr ":c:member:`base_exec_prefix `" + +#: ../../c-api/init_config.rst:278 ../../c-api/init_config.rst:282 +#: ../../c-api/init_config.rst:286 ../../c-api/init_config.rst:298 +#: ../../c-api/init_config.rst:334 ../../c-api/init_config.rst:338 +#: ../../c-api/init_config.rst:342 ../../c-api/init_config.rst:350 +#: ../../c-api/init_config.rst:354 ../../c-api/init_config.rst:362 +#: ../../c-api/init_config.rst:430 ../../c-api/init_config.rst:434 +#: ../../c-api/init_config.rst:438 ../../c-api/init_config.rst:442 +#: ../../c-api/init_config.rst:450 ../../c-api/init_config.rst:454 +#: ../../c-api/init_config.rst:458 ../../c-api/init_config.rst:462 +#: ../../c-api/init_config.rst:482 ../../c-api/init_config.rst:486 +#: ../../c-api/init_config.rst:490 ../../c-api/init_config.rst:577 +msgid "``str``" +msgstr "``str``" + +#: ../../c-api/init_config.rst:280 +msgid "``\"base_executable\"``" +msgstr "``\"base_executable\"``" + +#: ../../c-api/init_config.rst:281 +msgid ":c:member:`base_executable `" +msgstr ":c:member:`base_executable `" + +#: ../../c-api/init_config.rst:284 +msgid "``\"base_prefix\"``" +msgstr "``\"base_prefix\"``" + +#: ../../c-api/init_config.rst:285 +msgid ":c:member:`base_prefix `" +msgstr ":c:member:`base_prefix `" + +#: ../../c-api/init_config.rst:288 +msgid "``\"buffered_stdio\"``" +msgstr "``\"buffered_stdio\"``" + +#: ../../c-api/init_config.rst:289 +msgid ":c:member:`buffered_stdio `" +msgstr ":c:member:`buffered_stdio `" + +#: ../../c-api/init_config.rst:290 ../../c-api/init_config.rst:302 +#: ../../c-api/init_config.rst:306 ../../c-api/init_config.rst:310 +#: ../../c-api/init_config.rst:314 ../../c-api/init_config.rst:318 +#: ../../c-api/init_config.rst:326 ../../c-api/init_config.rst:330 +#: ../../c-api/init_config.rst:346 ../../c-api/init_config.rst:370 +#: ../../c-api/init_config.rst:374 ../../c-api/init_config.rst:382 +#: ../../c-api/init_config.rst:386 ../../c-api/init_config.rst:390 +#: ../../c-api/init_config.rst:394 ../../c-api/init_config.rst:398 +#: ../../c-api/init_config.rst:414 ../../c-api/init_config.rst:418 +#: ../../c-api/init_config.rst:422 ../../c-api/init_config.rst:426 +#: ../../c-api/init_config.rst:446 ../../c-api/init_config.rst:466 +#: ../../c-api/init_config.rst:470 ../../c-api/init_config.rst:474 +#: ../../c-api/init_config.rst:478 ../../c-api/init_config.rst:498 +#: ../../c-api/init_config.rst:502 ../../c-api/init_config.rst:506 +#: ../../c-api/init_config.rst:510 ../../c-api/init_config.rst:514 +#: ../../c-api/init_config.rst:518 ../../c-api/init_config.rst:526 +#: ../../c-api/init_config.rst:534 ../../c-api/init_config.rst:542 +#: ../../c-api/init_config.rst:575 +msgid "``bool``" +msgstr "``bool``" + +#: ../../c-api/init_config.rst:292 +msgid "``\"bytes_warning\"``" +msgstr "``\"bytes_warning\"``" + +#: ../../c-api/init_config.rst:293 +msgid ":c:member:`bytes_warning `" +msgstr ":c:member:`bytes_warning `" + +#: ../../c-api/init_config.rst:296 +msgid "``\"check_hash_pycs_mode\"``" +msgstr "``\"check_hash_pycs_mode\"``" + +#: ../../c-api/init_config.rst:297 +msgid ":c:member:`check_hash_pycs_mode `" +msgstr ":c:member:`check_hash_pycs_mode `" + +#: ../../c-api/init_config.rst:300 +msgid "``\"code_debug_ranges\"``" +msgstr "``\"code_debug_ranges\"``" + +#: ../../c-api/init_config.rst:301 +msgid ":c:member:`code_debug_ranges `" +msgstr ":c:member:`code_debug_ranges `" + +#: ../../c-api/init_config.rst:304 +msgid "``\"coerce_c_locale\"``" +msgstr "``\"coerce_c_locale\"``" + +#: ../../c-api/init_config.rst:305 +msgid ":c:member:`coerce_c_locale `" +msgstr ":c:member:`coerce_c_locale `" + +#: ../../c-api/init_config.rst:308 +msgid "``\"coerce_c_locale_warn\"``" +msgstr "``\"coerce_c_locale_warn\"``" + +#: ../../c-api/init_config.rst:309 +msgid ":c:member:`coerce_c_locale_warn `" +msgstr ":c:member:`coerce_c_locale_warn `" + +#: ../../c-api/init_config.rst:312 +msgid "``\"configure_c_stdio\"``" +msgstr "``\"configure_c_stdio\"``" + +#: ../../c-api/init_config.rst:313 +msgid ":c:member:`configure_c_stdio `" +msgstr ":c:member:`configure_c_stdio `" + +#: ../../c-api/init_config.rst:316 +msgid "``\"configure_locale\"``" +msgstr "``\"configure_locale\"``" + +#: ../../c-api/init_config.rst:317 +msgid ":c:member:`configure_locale `" +msgstr ":c:member:`configure_locale `" + +#: ../../c-api/init_config.rst:320 +msgid "``\"cpu_count\"``" +msgstr "``\"cpu_count\"``" + +#: ../../c-api/init_config.rst:321 +msgid ":c:member:`cpu_count `" +msgstr ":c:member:`cpu_count `" + +#: ../../c-api/init_config.rst:324 +msgid "``\"dev_mode\"``" +msgstr "``\"dev_mode\"``" + +#: ../../c-api/init_config.rst:325 +msgid ":c:member:`dev_mode `" +msgstr ":c:member:`dev_mode `" + +#: ../../c-api/init_config.rst:328 +msgid "``\"dump_refs\"``" +msgstr "``\"dump_refs\"``" + +#: ../../c-api/init_config.rst:329 +msgid ":c:member:`dump_refs `" +msgstr ":c:member:`dump_refs `" + +#: ../../c-api/init_config.rst:332 +msgid "``\"dump_refs_file\"``" +msgstr "``\"dump_refs_file\"``" + +#: ../../c-api/init_config.rst:333 +msgid ":c:member:`dump_refs_file `" +msgstr ":c:member:`dump_refs_file `" + +#: ../../c-api/init_config.rst:336 +msgid "``\"exec_prefix\"``" +msgstr "``\"exec_prefix\"``" + +#: ../../c-api/init_config.rst:337 +msgid ":c:member:`exec_prefix `" +msgstr ":c:member:`exec_prefix `" + +#: ../../c-api/init_config.rst:340 +msgid "``\"executable\"``" +msgstr "``\"executable\"``" + +#: ../../c-api/init_config.rst:341 +msgid ":c:member:`executable `" +msgstr ":c:member:`executable `" + +#: ../../c-api/init_config.rst:344 +msgid "``\"faulthandler\"``" +msgstr "``\"faulthandler\"``" + +#: ../../c-api/init_config.rst:345 +msgid ":c:member:`faulthandler `" +msgstr ":c:member:`faulthandler `" + +#: ../../c-api/init_config.rst:348 +msgid "``\"filesystem_encoding\"``" +msgstr "``\"filesystem_encoding\"``" + +#: ../../c-api/init_config.rst:349 +msgid ":c:member:`filesystem_encoding `" +msgstr ":c:member:`filesystem_encoding `" + +#: ../../c-api/init_config.rst:352 +msgid "``\"filesystem_errors\"``" +msgstr "``\"filesystem_errors\"``" + +#: ../../c-api/init_config.rst:353 +msgid ":c:member:`filesystem_errors `" +msgstr ":c:member:`filesystem_errors `" + +#: ../../c-api/init_config.rst:356 +msgid "``\"hash_seed\"``" +msgstr "``\"hash_seed\"``" + +#: ../../c-api/init_config.rst:357 +msgid ":c:member:`hash_seed `" +msgstr ":c:member:`hash_seed `" + +#: ../../c-api/init_config.rst:360 +msgid "``\"home\"``" +msgstr "``\"home\"``" + +#: ../../c-api/init_config.rst:361 +msgid ":c:member:`home `" +msgstr ":c:member:`home `" + +#: ../../c-api/init_config.rst:364 +msgid "``\"import_time\"``" +msgstr "``\"import_time\"``" + +#: ../../c-api/init_config.rst:365 +msgid ":c:member:`import_time `" +msgstr ":c:member:`import_time `" + +#: ../../c-api/init_config.rst:368 +msgid "``\"inspect\"``" +msgstr "``\"inspect\"``" + +#: ../../c-api/init_config.rst:369 +msgid ":c:member:`inspect `" +msgstr ":c:member:`inspect `" + +#: ../../c-api/init_config.rst:372 +msgid "``\"install_signal_handlers\"``" +msgstr "``\"install_signal_handlers\"``" + +#: ../../c-api/init_config.rst:373 +msgid ":c:member:`install_signal_handlers `" +msgstr "" +":c:member:`install_signal_handlers `" + +#: ../../c-api/init_config.rst:376 +msgid "``\"int_max_str_digits\"``" +msgstr "``\"int_max_str_digits\"``" + +#: ../../c-api/init_config.rst:377 +msgid ":c:member:`int_max_str_digits `" +msgstr ":c:member:`int_max_str_digits `" + +#: ../../c-api/init_config.rst:380 +msgid "``\"interactive\"``" +msgstr "``\"interactive\"``" + +#: ../../c-api/init_config.rst:381 +msgid ":c:member:`interactive `" +msgstr ":c:member:`interactive `" + +#: ../../c-api/init_config.rst:384 +msgid "``\"isolated\"``" +msgstr "``\"isolated\"``" + +#: ../../c-api/init_config.rst:385 +msgid ":c:member:`isolated `" +msgstr ":c:member:`isolated `" + +#: ../../c-api/init_config.rst:388 +msgid "``\"legacy_windows_fs_encoding\"``" +msgstr "``\"legacy_windows_fs_encoding\"``" + +#: ../../c-api/init_config.rst:389 +msgid "" +":c:member:`legacy_windows_fs_encoding " +"`" +msgstr "" +":c:member:`legacy_windows_fs_encoding " +"`" + +#: ../../c-api/init_config.rst:392 +msgid "``\"legacy_windows_stdio\"``" +msgstr "``\"legacy_windows_stdio\"``" + +#: ../../c-api/init_config.rst:393 +msgid ":c:member:`legacy_windows_stdio `" +msgstr ":c:member:`legacy_windows_stdio `" + +#: ../../c-api/init_config.rst:396 +msgid "``\"malloc_stats\"``" +msgstr "``\"malloc_stats\"``" + +#: ../../c-api/init_config.rst:397 +msgid ":c:member:`malloc_stats `" +msgstr ":c:member:`malloc_stats `" + +#: ../../c-api/init_config.rst:400 +msgid "``\"module_search_paths\"``" +msgstr "``\"module_search_paths\"``" + +#: ../../c-api/init_config.rst:401 +msgid ":c:member:`module_search_paths `" +msgstr ":c:member:`module_search_paths `" + +#: ../../c-api/init_config.rst:404 +msgid "``\"optimization_level\"``" +msgstr "``\"optimization_level\"``" + +#: ../../c-api/init_config.rst:405 +msgid ":c:member:`optimization_level `" +msgstr ":c:member:`optimization_level `" + +#: ../../c-api/init_config.rst:408 +msgid "``\"orig_argv\"``" +msgstr "``\"orig_argv\"``" + +#: ../../c-api/init_config.rst:409 +msgid ":c:member:`orig_argv `" +msgstr ":c:member:`orig_argv `" + +#: ../../c-api/init_config.rst:412 +msgid "``\"parse_argv\"``" +msgstr "``\"parse_argv\"``" + +#: ../../c-api/init_config.rst:413 +msgid ":c:member:`parse_argv `" +msgstr ":c:member:`parse_argv `" + +#: ../../c-api/init_config.rst:416 +msgid "``\"parser_debug\"``" +msgstr "``\"parser_debug\"``" + +#: ../../c-api/init_config.rst:417 +msgid ":c:member:`parser_debug `" +msgstr ":c:member:`parser_debug `" + +#: ../../c-api/init_config.rst:420 +msgid "``\"pathconfig_warnings\"``" +msgstr "``\"pathconfig_warnings\"``" + +#: ../../c-api/init_config.rst:421 +msgid ":c:member:`pathconfig_warnings `" +msgstr ":c:member:`pathconfig_warnings `" + +#: ../../c-api/init_config.rst:424 +msgid "``\"perf_profiling\"``" +msgstr "``\"perf_profiling\"``" + +#: ../../c-api/init_config.rst:425 +msgid ":c:member:`perf_profiling `" +msgstr ":c:member:`perf_profiling `" + +#: ../../c-api/init_config.rst:428 +msgid "``\"platlibdir\"``" +msgstr "``\"platlibdir\"``" + +#: ../../c-api/init_config.rst:429 +msgid ":c:member:`platlibdir `" +msgstr ":c:member:`platlibdir `" + +#: ../../c-api/init_config.rst:432 +msgid "``\"prefix\"``" +msgstr "``\"prefix\"``" + +#: ../../c-api/init_config.rst:433 +msgid ":c:member:`prefix `" +msgstr ":c:member:`prefix `" + +#: ../../c-api/init_config.rst:436 +msgid "``\"program_name\"``" +msgstr "``\"program_name\"``" + +#: ../../c-api/init_config.rst:437 +msgid ":c:member:`program_name `" +msgstr ":c:member:`program_name `" + +#: ../../c-api/init_config.rst:440 +msgid "``\"pycache_prefix\"``" +msgstr "``\"pycache_prefix\"``" + +#: ../../c-api/init_config.rst:441 +msgid ":c:member:`pycache_prefix `" +msgstr ":c:member:`pycache_prefix `" + +#: ../../c-api/init_config.rst:444 +msgid "``\"quiet\"``" +msgstr "``\"quiet\"``" + +#: ../../c-api/init_config.rst:445 +msgid ":c:member:`quiet `" +msgstr ":c:member:`quiet `" + +#: ../../c-api/init_config.rst:448 +msgid "``\"run_command\"``" +msgstr "``\"run_command\"``" + +#: ../../c-api/init_config.rst:449 +msgid ":c:member:`run_command `" +msgstr ":c:member:`run_command `" + +#: ../../c-api/init_config.rst:452 +msgid "``\"run_filename\"``" +msgstr "``\"run_filename\"``" + +#: ../../c-api/init_config.rst:453 +msgid ":c:member:`run_filename `" +msgstr ":c:member:`run_filename `" + +#: ../../c-api/init_config.rst:456 +msgid "``\"run_module\"``" +msgstr "``\"run_module\"``" + +#: ../../c-api/init_config.rst:457 +msgid ":c:member:`run_module `" +msgstr ":c:member:`run_module `" + +#: ../../c-api/init_config.rst:460 +msgid "``\"run_presite\"``" +msgstr "``\"run_presite\"``" + +#: ../../c-api/init_config.rst:461 +msgid ":c:member:`run_presite `" +msgstr ":c:member:`run_presite `" + +#: ../../c-api/init_config.rst:464 +msgid "``\"safe_path\"``" +msgstr "``\"safe_path\"``" + +#: ../../c-api/init_config.rst:465 +msgid ":c:member:`safe_path `" +msgstr ":c:member:`safe_path `" + +#: ../../c-api/init_config.rst:468 +msgid "``\"show_ref_count\"``" +msgstr "``\"show_ref_count\"``" + +#: ../../c-api/init_config.rst:469 +msgid ":c:member:`show_ref_count `" +msgstr ":c:member:`show_ref_count `" + +#: ../../c-api/init_config.rst:472 +msgid "``\"site_import\"``" +msgstr "``\"site_import\"``" + +#: ../../c-api/init_config.rst:473 +msgid ":c:member:`site_import `" +msgstr ":c:member:`site_import `" + +#: ../../c-api/init_config.rst:476 +msgid "``\"skip_source_first_line\"``" +msgstr "``\"skip_source_first_line\"``" + +#: ../../c-api/init_config.rst:477 +msgid ":c:member:`skip_source_first_line `" +msgstr ":c:member:`skip_source_first_line `" + +#: ../../c-api/init_config.rst:480 +msgid "``\"stdio_encoding\"``" +msgstr "``\"stdio_encoding\"``" + +#: ../../c-api/init_config.rst:481 +msgid ":c:member:`stdio_encoding `" +msgstr ":c:member:`stdio_encoding `" + +#: ../../c-api/init_config.rst:484 +msgid "``\"stdio_errors\"``" +msgstr "``\"stdio_errors\"``" + +#: ../../c-api/init_config.rst:485 +msgid ":c:member:`stdio_errors `" +msgstr ":c:member:`stdio_errors `" + +#: ../../c-api/init_config.rst:488 +msgid "``\"stdlib_dir\"``" +msgstr "``\"stdlib_dir\"``" + +#: ../../c-api/init_config.rst:489 +msgid ":c:member:`stdlib_dir `" +msgstr ":c:member:`stdlib_dir `" + +#: ../../c-api/init_config.rst:492 +msgid "``\"tracemalloc\"``" +msgstr "``\"tracemalloc\"``" + +#: ../../c-api/init_config.rst:493 +msgid ":c:member:`tracemalloc `" +msgstr ":c:member:`tracemalloc `" + +#: ../../c-api/init_config.rst:496 +msgid "``\"use_environment\"``" +msgstr "``\"use_environment\"``" + +#: ../../c-api/init_config.rst:497 +msgid ":c:member:`use_environment `" +msgstr ":c:member:`use_environment `" + +#: ../../c-api/init_config.rst:500 +msgid "``\"use_frozen_modules\"``" +msgstr "``\"use_frozen_modules\"``" + +#: ../../c-api/init_config.rst:501 +msgid ":c:member:`use_frozen_modules `" +msgstr ":c:member:`use_frozen_modules `" + +#: ../../c-api/init_config.rst:504 +msgid "``\"use_hash_seed\"``" +msgstr "``\"use_hash_seed\"``" + +#: ../../c-api/init_config.rst:505 +msgid ":c:member:`use_hash_seed `" +msgstr ":c:member:`use_hash_seed `" + +#: ../../c-api/init_config.rst:508 +msgid "``\"use_system_logger\"``" +msgstr "``\"use_system_logger\"``" + +#: ../../c-api/init_config.rst:509 +msgid ":c:member:`use_system_logger `" +msgstr ":c:member:`use_system_logger `" + +#: ../../c-api/init_config.rst:512 +msgid "``\"user_site_directory\"``" +msgstr "``\"user_site_directory\"``" + +#: ../../c-api/init_config.rst:513 +msgid ":c:member:`user_site_directory `" +msgstr ":c:member:`user_site_directory `" + +#: ../../c-api/init_config.rst:516 +msgid "``\"utf8_mode\"``" +msgstr "``\"utf8_mode\"``" + +#: ../../c-api/init_config.rst:517 +msgid ":c:member:`utf8_mode `" +msgstr ":c:member:`utf8_mode `" + +#: ../../c-api/init_config.rst:520 +msgid "``\"verbose\"``" +msgstr "``\"verbose\"``" + +#: ../../c-api/init_config.rst:521 +msgid ":c:member:`verbose `" +msgstr ":c:member:`verbose `" + +#: ../../c-api/init_config.rst:524 +msgid "``\"warn_default_encoding\"``" +msgstr "``\"warn_default_encoding\"``" + +#: ../../c-api/init_config.rst:525 +msgid ":c:member:`warn_default_encoding `" +msgstr ":c:member:`warn_default_encoding `" + +#: ../../c-api/init_config.rst:528 +msgid "``\"warnoptions\"``" +msgstr "``\"warnoptions\"``" + +#: ../../c-api/init_config.rst:529 +msgid ":c:member:`warnoptions `" +msgstr ":c:member:`warnoptions `" + +#: ../../c-api/init_config.rst:532 +msgid "``\"write_bytecode\"``" +msgstr "``\"write_bytecode\"``" + +#: ../../c-api/init_config.rst:533 +msgid ":c:member:`write_bytecode `" +msgstr ":c:member:`write_bytecode `" + +#: ../../c-api/init_config.rst:536 +msgid "``\"xoptions\"``" +msgstr "``\"xoptions\"``" + +#: ../../c-api/init_config.rst:537 +msgid ":c:member:`xoptions `" +msgstr ":c:member:`xoptions `" + +#: ../../c-api/init_config.rst:538 ../../c-api/init_config.rst:579 +msgid "``dict[str, str]``" +msgstr "``dict[str, str]``" + +#: ../../c-api/init_config.rst:540 +msgid "``\"_pystats\"``" +msgstr "``\"_pystats\"``" + +#: ../../c-api/init_config.rst:541 +msgid ":c:member:`_pystats `" +msgstr ":c:member:`_pystats `" + +#: ../../c-api/init_config.rst:545 +msgid "Visibility:" +msgstr "可见性:" + +#: ../../c-api/init_config.rst:547 +msgid "" +"Public: Can be retrieved by :c:func:`PyConfig_Get` and set by " +":c:func:`PyConfig_Set`." +msgstr "公有:可由 :c:func:`PyConfig_Get` 获取并由 :c:func:`PyConfig_Set` 设置。" + +#: ../../c-api/init_config.rst:549 +msgid "" +"Read-only: Can be retrieved by :c:func:`PyConfig_Get`, but cannot be set by " +":c:func:`PyConfig_Set`." +msgstr "只读:可由 :c:func:`PyConfig_Get` 获取,但不可由 :c:func:`PyConfig_Set` 设置。." + +#: ../../c-api/init_config.rst:554 +msgid "Runtime Python configuration API" +msgstr "运行时 Python 配置 API" + +#: ../../c-api/init_config.rst:556 +msgid "" +"At runtime, it's possible to get and set configuration options using " +":c:func:`PyConfig_Get` and :c:func:`PyConfig_Set` functions." +msgstr "" +"在运行时,有可能使用 :c:func:`PyConfig_Get` 和 :c:func:`PyConfig_Set` 函数来获取和设置配置选项。" + +#: ../../c-api/init_config.rst:562 +msgid "" +"Some options are read from the :mod:`sys` attributes. For example, the " +"option ``\"argv\"`` is read from :data:`sys.argv`." +msgstr "有些选项是从 :mod:`sys` 的属性读取的。例如,选项 ``\"argv\"`` 是从 :data:`sys.argv` 读取的。" + +#: ../../c-api/init_config.rst:568 +msgid "" +"Get the current runtime value of a configuration option as a Python object." +msgstr "获取一个配置选项的以 Python 对象表示的当前运行时值。" + +#: ../../c-api/init_config.rst:570 ../../c-api/init_config.rst:601 +msgid "Return a new reference on success." +msgstr "成功时返回一个新的引用。" + +#: ../../c-api/init_config.rst:571 ../../c-api/init_config.rst:602 +msgid "Set an exception and return ``NULL`` on error." +msgstr "出错时设置一个异常并返回 ``NULL``。" + +#: ../../c-api/init_config.rst:573 +msgid "The object type depends on the configuration option. It can be:" +msgstr "对象类型取决于具体的配置选项。它可以是:" + +#: ../../c-api/init_config.rst:581 ../../c-api/init_config.rst:604 +#: ../../c-api/init_config.rst:619 +msgid "" +"The caller must have an :term:`attached thread state`. The function cannot " +"be called before Python initialization nor after Python finalization." +msgstr "" +"调用方必须拥有一个 :term:`attached thread state`。这个函数不能在 Python 初始化之前或 Python " +"最终化之后被调用。" + +#: ../../c-api/init_config.rst:589 +msgid "Similar to :c:func:`PyConfig_Get`, but get the value as a C int." +msgstr "类似于 :c:func:`PyConfig_Get`,但会获取 C int 形式的值。" + +#: ../../c-api/init_config.rst:592 +msgid "Set an exception and return ``-1`` on error." +msgstr "出错时设置一个异常并返回 ``-1``。" + +#: ../../c-api/init_config.rst:599 +msgid "Get all configuration option names as a ``frozenset``." +msgstr "获取以一个 ``frozenset`` 表示的全部配置选项名称。" + +#: ../../c-api/init_config.rst:612 +msgid "Set the current runtime value of a configuration option." +msgstr "设置一个配置选项的当前运行时值。" + +#: ../../c-api/init_config.rst:614 +msgid "Raise a :exc:`ValueError` if there is no option *name*." +msgstr "如果没有选项 *name* 则会引发 :exc:`ValueError`。" + +#: ../../c-api/init_config.rst:615 +msgid "Raise a :exc:`ValueError` if *value* is an invalid value." +msgstr "如果 *value* 是一个无效的值则会引发 :exc:`ValueError`。" + +#: ../../c-api/init_config.rst:616 +msgid "Raise a :exc:`ValueError` if the option is read-only (cannot be set)." +msgstr "如果选项是只读的(无法被设置)则会引发 :exc:`ValueError`。" + +#: ../../c-api/init_config.rst:617 +msgid "Raise a :exc:`TypeError` if *value* has not the proper type." +msgstr "如果 *value* 的类型不正确则会引发 :exc:`TypeError`。" + +#: ../../c-api/init_config.rst:622 +msgid "" +"Raises an :ref:`auditing event ` ``cpython.PyConfig_Set`` with " +"arguments ``name``, ``value``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``cpython.PyConfig_Set`` 并附带 ``name`` 和 " +"``value`` 两个参数。" + +#: ../../c-api/init_config.rst:630 +msgid "PyConfig C API" +msgstr "PyConfig C API" + +#: ../../c-api/init_config.rst:634 +msgid "" +"Python can be initialized with :c:func:`Py_InitializeFromConfig` and the " +":c:type:`PyConfig` structure. It can be preinitialized with " +":c:func:`Py_PreInitialize` and the :c:type:`PyPreConfig` structure." +msgstr "" +"Python 可以使用 :c:func:`Py_InitializeFromConfig` 和 :c:type:`PyConfig` " +"结构体来初始化。它可以使用 :c:func:`Py_PreInitialize` 和 :c:type:`PyPreConfig` 结构体来预初始化。" + +#: ../../c-api/init_config.rst:638 +msgid "There are two kinds of configuration:" +msgstr "有两种配置方式:" + +#: ../../c-api/init_config.rst:640 +msgid "" +"The :ref:`Python Configuration ` can be used to build a " +"customized Python which behaves as the regular Python. For example, " +"environment variables and command line arguments are used to configure " +"Python." +msgstr "" +":ref:`Python 配置 ` 可被用于构建一个定制的 Python,其行为与常规 Python " +"类似。例如,环境变量和命令行参数可被用于配置 Python。" + +#: ../../c-api/init_config.rst:645 +msgid "" +"The :ref:`Isolated Configuration ` can be used to embed " +"Python into an application. It isolates Python from the system. For example," +" environment variables are ignored, the LC_CTYPE locale is left unchanged " +"and no signal handler is registered." +msgstr "" +":ref:`隔离配置 ` 可被用于将 Python 嵌入到应用程序。它将 Python " +"与系统隔离开来。例如,环境变量将被忽略,LC_CTYPE 语言区域设置保持不变并且不会注册任何信号处理器。" + +#: ../../c-api/init_config.rst:656 +msgid ":pep:`587` \"Python Initialization Configuration\"." +msgstr ":pep:`587` \"Python 初始化配置\"." + +#: ../../c-api/init_config.rst:662 +msgid "Example of customized Python always running in isolated mode::" +msgstr "总是以隔离模式运行的定制 Python 的示例::" + +#: ../../c-api/init_config.rst:664 +msgid "" +"int main(int argc, char **argv)\n" +"{\n" +" PyStatus status;\n" +"\n" +" PyConfig config;\n" +" PyConfig_InitPythonConfig(&config);\n" +" config.isolated = 1;\n" +"\n" +" /* Decode command line arguments.\n" +" Implicitly preinitialize Python (in isolated mode). */\n" +" status = PyConfig_SetBytesArgv(&config, argc, argv);\n" +" if (PyStatus_Exception(status)) {\n" +" goto exception;\n" +" }\n" +"\n" +" status = Py_InitializeFromConfig(&config);\n" +" if (PyStatus_Exception(status)) {\n" +" goto exception;\n" +" }\n" +" PyConfig_Clear(&config);\n" +"\n" +" return Py_RunMain();\n" +"\n" +"exception:\n" +" PyConfig_Clear(&config);\n" +" if (PyStatus_IsExit(status)) {\n" +" return status.exitcode;\n" +" }\n" +" /* Display the error message and exit the process with\n" +" non-zero exit code */\n" +" Py_ExitStatusException(status);\n" +"}" +msgstr "" +"int main(int argc, char **argv)\n" +"{\n" +" PyStatus status;\n" +"\n" +" PyConfig config;\n" +" PyConfig_InitPythonConfig(&config);\n" +" config.isolated = 1;\n" +"\n" +" /* 解码命令行参数。\n" +" 隐式地预初始化 Python (隔离模式)。*/\n" +" status = PyConfig_SetBytesArgv(&config, argc, argv);\n" +" if (PyStatus_Exception(status)) {\n" +" goto exception;\n" +" }\n" +"\n" +" status = Py_InitializeFromConfig(&config);\n" +" if (PyStatus_Exception(status)) {\n" +" goto exception;\n" +" }\n" +" PyConfig_Clear(&config);\n" +"\n" +" return Py_RunMain();\n" +"\n" +"exception:\n" +" PyConfig_Clear(&config);\n" +" if (PyStatus_IsExit(status)) {\n" +" return status.exitcode;\n" +" }\n" +" /* 显示错误消息然后退出进程\n" +" 并设置非零值退出码 */\n" +" Py_ExitStatusException(status);\n" +"}" + +#: ../../c-api/init_config.rst:699 +msgid "PyWideStringList" +msgstr "PyWideStringList" + +#: ../../c-api/init_config.rst:703 +msgid "List of ``wchar_t*`` strings." +msgstr "由 ``wchar_t*`` 字符串组成的列表。" + +#: ../../c-api/init_config.rst:705 +msgid "" +"If *length* is non-zero, *items* must be non-``NULL`` and all strings must " +"be non-``NULL``." +msgstr "如果 *length* 为非零值,则 *items* 必须不为 ``NULL`` 并且所有字符串均必须不为 ``NULL``。" + +#: ../../c-api/init_config.rst:710 +msgid "Methods:" +msgstr "方法" + +#: ../../c-api/init_config.rst:714 +msgid "Append *item* to *list*." +msgstr "将 *item* 添加到 *list*。" + +#: ../../c-api/init_config.rst:716 ../../c-api/init_config.rst:727 +msgid "Python must be preinitialized to call this function." +msgstr "Python 必须被预初始化以便调用此函数。" + +#: ../../c-api/init_config.rst:720 +msgid "Insert *item* into *list* at *index*." +msgstr "将 *item* 插入到 *list* 的 *index* 位置上。" + +#: ../../c-api/init_config.rst:722 +msgid "" +"If *index* is greater than or equal to *list* length, append *item* to " +"*list*." +msgstr "如果 *index* 大于等于 *list* 的长度,则将 *item* 添加到 *list*。" + +#: ../../c-api/init_config.rst:725 +msgid "*index* must be greater than or equal to ``0``." +msgstr "*index* 必须大于等于 ``0``。" + +#: ../../c-api/init_config.rst:731 ../../c-api/init_config.rst:751 +#: ../../c-api/init_config.rst:858 ../../c-api/init_config.rst:1175 +msgid "Structure fields:" +msgstr "结构体字段:" + +#: ../../c-api/init_config.rst:735 +msgid "List length." +msgstr "列表长度。" + +#: ../../c-api/init_config.rst:739 +msgid "List items." +msgstr "列表项目。" + +#: ../../c-api/init_config.rst:742 +msgid "PyStatus" +msgstr "PyStatus" + +#: ../../c-api/init_config.rst:746 +msgid "" +"Structure to store an initialization function status: success, error or " +"exit." +msgstr "存储初始化函数状态:成功、错误或退出的结构体。" + +#: ../../c-api/init_config.rst:749 +msgid "" +"For an error, it can store the C function name which created the error." +msgstr "对于错误,它可以存储造成错误的 C 函数的名称。" + +#: ../../c-api/init_config.rst:755 +msgid "Exit code. Argument passed to ``exit()``." +msgstr "退出码。传给 ``exit()`` 的参数。" + +#: ../../c-api/init_config.rst:759 +msgid "Error message." +msgstr "错误信息" + +#: ../../c-api/init_config.rst:763 +msgid "Name of the function which created an error, can be ``NULL``." +msgstr "造成错误的函数的名称,可以为 ``NULL``。" + +#: ../../c-api/init_config.rst:767 +msgid "Functions to create a status:" +msgstr "创建状态的函数:" + +#: ../../c-api/init_config.rst:771 +msgid "Success." +msgstr "成功。" + +#: ../../c-api/init_config.rst:775 +msgid "Initialization error with a message." +msgstr "带消息的初始化错误。" + +#: ../../c-api/init_config.rst:777 +msgid "*err_msg* must not be ``NULL``." +msgstr "*err_msg* 不可为 ``NULL``。" + +#: ../../c-api/init_config.rst:781 +msgid "Memory allocation failure (out of memory)." +msgstr "内存分配失败(内存不足)。" + +#: ../../c-api/init_config.rst:785 +msgid "Exit Python with the specified exit code." +msgstr "以指定的退出代码退出 Python。" + +#: ../../c-api/init_config.rst:787 +msgid "Functions to handle a status:" +msgstr "处理状态的函数:" + +#: ../../c-api/init_config.rst:791 +msgid "" +"Is the status an error or an exit? If true, the exception must be handled; " +"by calling :c:func:`Py_ExitStatusException` for example." +msgstr "状态为错误还是退出?如为真值,则异常必须被处理;例如通过调用 :c:func:`Py_ExitStatusException`。" + +#: ../../c-api/init_config.rst:796 +msgid "Is the result an error?" +msgstr "结果是否为错误?" + +#: ../../c-api/init_config.rst:800 +msgid "Is the result an exit?" +msgstr "结果是否为退出?" + +#: ../../c-api/init_config.rst:804 +msgid "" +"Call ``exit(exitcode)`` if *status* is an exit. Print the error message and " +"exit with a non-zero exit code if *status* is an error. Must only be called" +" if ``PyStatus_Exception(status)`` is non-zero." +msgstr "" +"如果 *status* 是一个退出码则调用 ``exit(exitcode)``。如果 *status* " +"是一个错误码则打印错误消息并设置一个非零退出码再退出。必须在 ``PyStatus_Exception(status)`` 为非零值时才能被调用。" + +#: ../../c-api/init_config.rst:809 +msgid "" +"Internally, Python uses macros which set ``PyStatus.func``, whereas " +"functions to create a status set ``func`` to ``NULL``." +msgstr "" +"在内部,Python 将使用设置 ``PyStatus.func`` 的宏,而创建状态的函数则会将 ``func`` 设为 ``NULL``。" + +#: ../../c-api/init_config.rst:812 +msgid "Example::" +msgstr "示例::" + +#: ../../c-api/init_config.rst:814 +msgid "" +"PyStatus alloc(void **ptr, size_t size)\n" +"{\n" +" *ptr = PyMem_RawMalloc(size);\n" +" if (*ptr == NULL) {\n" +" return PyStatus_NoMemory();\n" +" }\n" +" return PyStatus_Ok();\n" +"}\n" +"\n" +"int main(int argc, char **argv)\n" +"{\n" +" void *ptr;\n" +" PyStatus status = alloc(&ptr, 16);\n" +" if (PyStatus_Exception(status)) {\n" +" Py_ExitStatusException(status);\n" +" }\n" +" PyMem_Free(ptr);\n" +" return 0;\n" +"}" +msgstr "" +"PyStatus alloc(void **ptr, size_t size)\n" +"{\n" +" *ptr = PyMem_RawMalloc(size);\n" +" if (*ptr == NULL) {\n" +" return PyStatus_NoMemory();\n" +" }\n" +" return PyStatus_Ok();\n" +"}\n" +"\n" +"int main(int argc, char **argv)\n" +"{\n" +" void *ptr;\n" +" PyStatus status = alloc(&ptr, 16);\n" +" if (PyStatus_Exception(status)) {\n" +" Py_ExitStatusException(status);\n" +" }\n" +" PyMem_Free(ptr);\n" +" return 0;\n" +"}" + +#: ../../c-api/init_config.rst:836 +msgid "PyPreConfig" +msgstr "PyPreConfig" + +#: ../../c-api/init_config.rst:840 +msgid "Structure used to preinitialize Python." +msgstr "用于预初始化 Python 的结构体。" + +#: ../../c-api/init_config.rst:844 +msgid "Function to initialize a preconfiguration:" +msgstr "用于初始化预先配置的函数:" + +#: ../../c-api/init_config.rst:848 +msgid "" +"Initialize the preconfiguration with :ref:`Python Configuration `." +msgstr "通过 :ref:`Python 配置 ` 来初始化预先配置。" + +#: ../../c-api/init_config.rst:853 +msgid "" +"Initialize the preconfiguration with :ref:`Isolated Configuration `." +msgstr "通过 :ref:`隔离配置 ` 来初始化预先配置。" + +#: ../../c-api/init_config.rst:862 +msgid "Name of the Python memory allocators:" +msgstr "Python 内存分配器名称:" + +#: ../../c-api/init_config.rst:864 +msgid "" +"``PYMEM_ALLOCATOR_NOT_SET`` (``0``): don't change memory allocators (use " +"defaults)." +msgstr "``PYMEM_ALLOCATOR_NOT_SET`` (``0``): 不改变内存分配器 (使用默认)。" + +#: ../../c-api/init_config.rst:866 +msgid "" +"``PYMEM_ALLOCATOR_DEFAULT`` (``1``): :ref:`default memory allocators " +"`." +msgstr "" +"``PYMEM_ALLOCATOR_DEFAULT`` (``1``): :ref:`默认内存分配器 ` 设置。" + +#: ../../c-api/init_config.rst:868 +msgid "" +"``PYMEM_ALLOCATOR_DEBUG`` (``2``): :ref:`default memory allocators ` with :ref:`debug hooks `." +msgstr "" +"``PYMEM_ALLOCATOR_DEBUG`` (``2``): :ref:`默认内存分配器 ` 附带 :ref:`调试钩子 `。" + +#: ../../c-api/init_config.rst:871 +msgid "``PYMEM_ALLOCATOR_MALLOC`` (``3``): use ``malloc()`` of the C library." +msgstr "``PYMEM_ALLOCATOR_MALLOC`` (``3``): 使用 C 库的 ``malloc()``。" + +#: ../../c-api/init_config.rst:872 +msgid "" +"``PYMEM_ALLOCATOR_MALLOC_DEBUG`` (``4``): force usage of ``malloc()`` with " +":ref:`debug hooks `." +msgstr "" +"``PYMEM_ALLOCATOR_MALLOC_DEBUG`` (``4``): 强制使用 ``malloc()`` 附带 :ref:`调试钩子 " +"` 功能。" + +#: ../../c-api/init_config.rst:874 +msgid "" +"``PYMEM_ALLOCATOR_PYMALLOC`` (``5``): :ref:`Python pymalloc memory allocator" +" `." +msgstr "" +"``PYMEM_ALLOCATOR_PYMALLOC`` (``5``): :ref:`Python pymalloc 内存分配器 " +"` 实现。" + +#: ../../c-api/init_config.rst:876 +msgid "" +"``PYMEM_ALLOCATOR_PYMALLOC_DEBUG`` (``6``): :ref:`Python pymalloc memory " +"allocator ` with :ref:`debug hooks `." +msgstr "" +"``PYMEM_ALLOCATOR_PYMALLOC_DEBUG`` (``6``): :ref:`Python pymalloc 内存分配器 " +"` 附带 :ref:`调试钩子 `。" + +#: ../../c-api/init_config.rst:879 +msgid "" +"``PYMEM_ALLOCATOR_MIMALLOC`` (``6``): use ``mimalloc``, a fast malloc " +"replacement." +msgstr "" +"``PYMEM_ALLOCATOR_MIMALLOC`` (``6``): 使用 ``mimalloc``,一个快速的 malloc 替代。" + +#: ../../c-api/init_config.rst:881 +msgid "" +"``PYMEM_ALLOCATOR_MIMALLOC_DEBUG`` (``7``): use ``mimalloc``, a fast malloc " +"replacement with :ref:`debug hooks `." +msgstr "" +"``PYMEM_ALLOCATOR_MIMALLOC_DEBUG`` (``7``): 使用 ``mimalloc``,一个快速的 malloc " +"替代,它带有 :ref:`调试钩子 `。" + +#: ../../c-api/init_config.rst:885 +msgid "" +"``PYMEM_ALLOCATOR_PYMALLOC`` and ``PYMEM_ALLOCATOR_PYMALLOC_DEBUG`` are not " +"supported if Python is :option:`configured using --without-pymalloc " +"<--without-pymalloc>`." +msgstr "" +"如果 Python 是 :option:`使用 --without-pymalloc 进行配置 <--without-pymalloc>` 则 " +"``PYMEM_ALLOCATOR_PYMALLOC`` 和 ``PYMEM_ALLOCATOR_PYMALLOC_DEBUG`` 将不被支持。" + +#: ../../c-api/init_config.rst:889 +msgid "" +"``PYMEM_ALLOCATOR_MIMALLOC`` and ``PYMEM_ALLOCATOR_MIMALLOC_DEBUG`` are not " +"supported if Python is :option:`configured using --without-mimalloc " +"<--without-mimalloc>` or if the underlying atomic support isn't available." +msgstr "" +"如果 Python 是 :option:`使用 --without-mimalloc 进行配置 <--without-mimalloc>` " +"或者如果下层的原子化支持不可用则 ``PYMEM_ALLOCATOR_MIMALLOC`` 和 " +"``PYMEM_ALLOCATOR_MIMALLOC_DEBUG`` 将不被支持。" + +#: ../../c-api/init_config.rst:894 +msgid "See :ref:`Memory Management `." +msgstr "参见 :ref:`Memory Management `." + +#: ../../c-api/init_config.rst:896 +msgid "Default: ``PYMEM_ALLOCATOR_NOT_SET``." +msgstr "默认值: ``PYMEM_ALLOCATOR_NOT_SET``。" + +#: ../../c-api/init_config.rst:900 +msgid "Set the LC_CTYPE locale to the user preferred locale." +msgstr "将 LC_CTYPE 语言区域设为用户选择的语言区域。" + +#: ../../c-api/init_config.rst:902 +msgid "" +"If equals to ``0``, set :c:member:`~PyPreConfig.coerce_c_locale` and " +":c:member:`~PyPreConfig.coerce_c_locale_warn` members to ``0``." +msgstr "" +"如果等于 ``0``,则将 :c:member:`~PyPreConfig.coerce_c_locale` 和 " +":c:member:`~PyPreConfig.coerce_c_locale_warn` 的成员设为 ``0``。" + +#: ../../c-api/init_config.rst:905 ../../c-api/init_config.rst:916 +msgid "See the :term:`locale encoding`." +msgstr "参见 :term:`locale encoding`。" + +#: ../../c-api/init_config.rst:907 ../../c-api/init_config.rst:962 +#: ../../c-api/init_config.rst:1336 +msgid "Default: ``1`` in Python config, ``0`` in isolated config." +msgstr "默认值:在 Python 配置中为 ``1``,在隔离配置中为 ``0``。" + +#: ../../c-api/init_config.rst:911 +msgid "If equals to ``2``, coerce the C locale." +msgstr "如果等于 ``2``,强制转换 C 语言区域。" + +#: ../../c-api/init_config.rst:913 +msgid "" +"If equals to ``1``, read the LC_CTYPE locale to decide if it should be " +"coerced." +msgstr "如果等于 ``1``,则读取 LC_CTYPE 语言区域来确定其是否应当被强制转换。" + +#: ../../c-api/init_config.rst:918 ../../c-api/init_config.rst:924 +msgid "Default: ``-1`` in Python config, ``0`` in isolated config." +msgstr "默认值:在 Python 配置中为 ``-1``,在隔离配置中为 ``0``。" + +#: ../../c-api/init_config.rst:922 +msgid "If non-zero, emit a warning if the C locale is coerced." +msgstr "如为非零值,则会在 C 语言区域被强制转换时发出警告。" + +#: ../../c-api/init_config.rst:928 +msgid "" +":ref:`Python Development Mode `: see :c:member:`PyConfig.dev_mode`." +msgstr ":ref:`Python 开发模式 `: 参见 :c:member:`PyConfig.dev_mode`。" + +#: ../../c-api/init_config.rst:931 ../../c-api/init_config.rst:1345 +#: ../../c-api/init_config.rst:1401 ../../c-api/init_config.rst:1895 +msgid "Default: ``-1`` in Python mode, ``0`` in isolated mode." +msgstr "默认值:在 Python 模式中为 ``-1``,在隔离模式中为 ``0``。" + +#: ../../c-api/init_config.rst:935 +msgid "Isolated mode: see :c:member:`PyConfig.isolated`." +msgstr "隔离模式:参见 :c:member:`PyConfig.isolated`。" + +#: ../../c-api/init_config.rst:937 ../../c-api/init_config.rst:1572 +msgid "Default: ``0`` in Python mode, ``1`` in isolated mode." +msgstr "默认值:在 Python 模式中为 ``0``,在隔离模式中为 ``1``。" + +#: ../../c-api/init_config.rst:941 +msgid "If non-zero:" +msgstr "如为非零值:" + +#: ../../c-api/init_config.rst:943 +msgid "Set :c:member:`PyPreConfig.utf8_mode` to ``0``," +msgstr "设置 :c:member:`PyPreConfig.utf8_mode` 为 ``0``," + +#: ../../c-api/init_config.rst:944 +msgid "Set :c:member:`PyConfig.filesystem_encoding` to ``\"mbcs\"``," +msgstr "设置 :c:member:`PyConfig.filesystem_encoding` 为 ``\"mbcs\"``," + +#: ../../c-api/init_config.rst:945 +msgid "Set :c:member:`PyConfig.filesystem_errors` to ``\"replace\"``." +msgstr "设置 :c:member:`PyConfig.filesystem_errors` 为 ``\"replace\"``." + +#: ../../c-api/init_config.rst:947 +msgid "" +"Initialized from the :envvar:`PYTHONLEGACYWINDOWSFSENCODING` environment " +"variable value." +msgstr "基于 :envvar:`PYTHONLEGACYWINDOWSFSENCODING` 环境变量值完成初始化。" + +#: ../../c-api/init_config.rst:950 ../../c-api/init_config.rst:1586 +msgid "" +"Only available on Windows. ``#ifdef MS_WINDOWS`` macro can be used for " +"Windows specific code." +msgstr "仅在 Windows 上可用。``#ifdef MS_WINDOWS`` 宏可被用于 Windows 专属的代码。" + +#: ../../c-api/init_config.rst:953 ../../c-api/init_config.rst:1279 +#: ../../c-api/init_config.rst:1291 ../../c-api/init_config.rst:1358 +#: ../../c-api/init_config.rst:1490 ../../c-api/init_config.rst:1508 +#: ../../c-api/init_config.rst:1522 ../../c-api/init_config.rst:1589 +#: ../../c-api/init_config.rst:1603 ../../c-api/init_config.rst:1663 +#: ../../c-api/init_config.rst:1715 ../../c-api/init_config.rst:1777 +#: ../../c-api/init_config.rst:1831 ../../c-api/init_config.rst:1860 +#: ../../c-api/init_config.rst:1974 ../../c-api/init_config.rst:2021 +msgid "Default: ``0``." +msgstr "默认值: ``0``。" + +#: ../../c-api/init_config.rst:957 +msgid "" +"If non-zero, :c:func:`Py_PreInitializeFromArgs` and " +":c:func:`Py_PreInitializeFromBytesArgs` parse their ``argv`` argument the " +"same way the regular Python parses command line arguments: see :ref:`Command" +" Line Arguments `." +msgstr "" +"如为非零值,:c:func:`Py_PreInitializeFromArgs` 和 " +":c:func:`Py_PreInitializeFromBytesArgs` 将以与常规 Python 解析命令行参数的相同方式解析其 " +"``argv`` 参数:参见 :ref:`命令行参数 `。" + +#: ../../c-api/init_config.rst:966 +msgid "" +"Use :ref:`environment variables `? See " +":c:member:`PyConfig.use_environment`." +msgstr "" +"使用 :ref:`环境变量 `? 参见 :c:member:`PyConfig.use_environment`。" + +#: ../../c-api/init_config.rst:969 ../../c-api/init_config.rst:1936 +msgid "Default: ``1`` in Python config and ``0`` in isolated config." +msgstr "默认值:在 Python 配置中为 ``1`` 而在隔离配置中为 ``0``。" + +#: ../../c-api/init_config.rst:973 +msgid "If non-zero, enable the :ref:`Python UTF-8 Mode `." +msgstr "如为非零值,则启用 :ref:`Python UTF-8 模式 `。" + +#: ../../c-api/init_config.rst:975 +msgid "" +"Set to ``0`` or ``1`` by the :option:`-X utf8 <-X>` command line option and " +"the :envvar:`PYTHONUTF8` environment variable." +msgstr "" +"通过 :option:`-X utf8 <-X>` 命令行选项和 :envvar:`PYTHONUTF8` 环境变量设为 ``0`` 或 ``1``。" + +#: ../../c-api/init_config.rst:978 ../../c-api/init_config.rst:1266 +#: ../../c-api/init_config.rst:1304 ../../c-api/init_config.rst:1848 +#: ../../c-api/init_config.rst:2006 +msgid "Default: ``1``." +msgstr "默认值: ``1``。" + +#: ../../c-api/init_config.rst:984 +msgid "Preinitialize Python with PyPreConfig" +msgstr "使用 PyPreConfig 预初始化 Python" + +#: ../../c-api/init_config.rst:986 +msgid "The preinitialization of Python:" +msgstr "Python 的预初始化:" + +#: ../../c-api/init_config.rst:988 +msgid "Set the Python memory allocators (:c:member:`PyPreConfig.allocator`)" +msgstr "设置 Python 内存分配器 (:c:member:`PyPreConfig.allocator`)" + +#: ../../c-api/init_config.rst:989 +msgid "Configure the LC_CTYPE locale (:term:`locale encoding`)" +msgstr "配置 LC_CTYPE 语言区域 (:term:`locale encoding`)" + +#: ../../c-api/init_config.rst:990 +msgid "" +"Set the :ref:`Python UTF-8 Mode ` " +"(:c:member:`PyPreConfig.utf8_mode`)" +msgstr "" +"设置 :ref:`Python UTF-8 模式 ` (:c:member:`PyPreConfig.utf8_mode`)" + +#: ../../c-api/init_config.rst:993 +msgid "" +"The current preconfiguration (``PyPreConfig`` type) is stored in " +"``_PyRuntime.preconfig``." +msgstr "当前的预配置 (``PyPreConfig`` 类型) 保存在 ``_PyRuntime.preconfig`` 中。" + +#: ../../c-api/init_config.rst:996 +msgid "Functions to preinitialize Python:" +msgstr "用于预初始化 Python 的函数:" + +#: ../../c-api/init_config.rst:1000 ../../c-api/init_config.rst:1006 +#: ../../c-api/init_config.rst:1015 +msgid "Preinitialize Python from *preconfig* preconfiguration." +msgstr "根据 *preconfig* 预配置来预初始化 Python。" + +#: ../../c-api/init_config.rst:1002 ../../c-api/init_config.rst:1011 +#: ../../c-api/init_config.rst:1020 +msgid "*preconfig* must not be ``NULL``." +msgstr "*preconfig* 不可为 ``NULL``。" + +#: ../../c-api/init_config.rst:1008 +msgid "" +"Parse *argv* command line arguments (bytes strings) if " +":c:member:`~PyPreConfig.parse_argv` of *preconfig* is non-zero." +msgstr "" +"如果 *preconfig* 的 :c:member:`~PyPreConfig.parse_argv` 为非零值则解析 *argv* " +"命令行参数(字节串)。" + +#: ../../c-api/init_config.rst:1017 +msgid "" +"Parse *argv* command line arguments (wide strings) if " +":c:member:`~PyPreConfig.parse_argv` of *preconfig* is non-zero." +msgstr "" +"如果 *preconfig* 的 :c:member:`~PyPreConfig.parse_argv` 为非零值则解析 *argv* " +"命令行参数(宽字符串)。" + +#: ../../c-api/init_config.rst:1022 ../../c-api/init_config.rst:2044 +msgid "" +"The caller is responsible to handle exceptions (error or exit) using " +":c:func:`PyStatus_Exception` and :c:func:`Py_ExitStatusException`." +msgstr "" +"调用方要负责使用 :c:func:`PyStatus_Exception` 和 :c:func:`Py_ExitStatusException` " +"来处理异常(错误或退出)。" + +#: ../../c-api/init_config.rst:1025 +msgid "" +"For :ref:`Python Configuration ` " +"(:c:func:`PyPreConfig_InitPythonConfig`), if Python is initialized with " +"command line arguments, the command line arguments must also be passed to " +"preinitialize Python, since they have an effect on the pre-configuration " +"like encodings. For example, the :option:`-X utf8 <-X>` command line option " +"enables the :ref:`Python UTF-8 Mode `." +msgstr "" +"对于 :ref:`Python 配置 ` " +"(:c:func:`PyPreConfig_InitPythonConfig`),如果 Python 是用命令行参数初始化的,那么在预初始化 " +"Python 时也必须传递命令行参数,因为它们会对编码格式等预配置产生影响。例如,:option:`-X utf8<-X>` 命令行选项将启用 " +":ref:`Python UTF-8 模式`。" + +#: ../../c-api/init_config.rst:1032 +msgid "" +"``PyMem_SetAllocator()`` can be called after :c:func:`Py_PreInitialize` and " +"before :c:func:`Py_InitializeFromConfig` to install a custom memory " +"allocator. It can be called before :c:func:`Py_PreInitialize` if " +":c:member:`PyPreConfig.allocator` is set to ``PYMEM_ALLOCATOR_NOT_SET``." +msgstr "" +"``PyMem_SetAllocator()`` 可在 :c:func:`Py_PreInitialize` " +"之后、:c:func:`Py_InitializeFromConfig` 之前被调用以安装自定义的内存分配器。如果 " +":c:member:`PyPreConfig.allocator` 被设为 ``PYMEM_ALLOCATOR_NOT_SET`` 则可在 " +":c:func:`Py_PreInitialize` 之前被调用。" + +#: ../../c-api/init_config.rst:1037 +msgid "" +"Python memory allocation functions like :c:func:`PyMem_RawMalloc` must not " +"be used before the Python preinitialization, whereas calling directly " +"``malloc()`` and ``free()`` is always safe. :c:func:`Py_DecodeLocale` must " +"not be called before the Python preinitialization." +msgstr "" +"像 :c:func:`PyMem_RawMalloc` 这样的 Python 内存分配函数不能在 Python 预初始化之前使用,而直接调用 " +"``malloc()`` 和 ``free()`` 则始终会是安全的。:c:func:`Py_DecodeLocale` 不能在 Python " +"预初始化之前被调用。" + +#: ../../c-api/init_config.rst:1042 +msgid "" +"Example using the preinitialization to enable the :ref:`Python UTF-8 Mode " +"`::" +msgstr "使用预初始化来启用 :ref:`Python UTF-8 模式 ` 的例子::" + +#: ../../c-api/init_config.rst:1045 +msgid "" +"PyStatus status;\n" +"PyPreConfig preconfig;\n" +"PyPreConfig_InitPythonConfig(&preconfig);\n" +"\n" +"preconfig.utf8_mode = 1;\n" +"\n" +"status = Py_PreInitialize(&preconfig);\n" +"if (PyStatus_Exception(status)) {\n" +" Py_ExitStatusException(status);\n" +"}\n" +"\n" +"/* at this point, Python speaks UTF-8 */\n" +"\n" +"Py_Initialize();\n" +"/* ... use Python API here ... */\n" +"Py_Finalize();" +msgstr "" +"PyStatus status;\n" +"PyPreConfig preconfig;\n" +"PyPreConfig_InitPythonConfig(&preconfig);\n" +"\n" +"preconfig.utf8_mode = 1;\n" +"\n" +"status = Py_PreInitialize(&preconfig);\n" +"if (PyStatus_Exception(status)) {\n" +" Py_ExitStatusException(status);\n" +"}\n" +"\n" +"/* 此时,Python 将使用 UTF-8 */\n" +"\n" +"Py_Initialize();\n" +"/* ... 在此使用 Python API ... */\n" +"Py_Finalize();" + +#: ../../c-api/init_config.rst:1064 +msgid "PyConfig" +msgstr "PyConfig" + +#: ../../c-api/init_config.rst:1068 +msgid "Structure containing most parameters to configure Python." +msgstr "包含了大部分用于配置 Python 的形参的结构体。" + +#: ../../c-api/init_config.rst:1070 +msgid "" +"When done, the :c:func:`PyConfig_Clear` function must be used to release the" +" configuration memory." +msgstr "在完成后,必须使用 :c:func:`PyConfig_Clear` 函数来释放配置内存。" + +#: ../../c-api/init_config.rst:1075 +msgid "Structure methods:" +msgstr "结构体方法:" + +#: ../../c-api/init_config.rst:1079 +msgid "" +"Initialize configuration with the :ref:`Python Configuration `." +msgstr "通过 :ref:`Python 配置 ` 来初始化配置。" + +#: ../../c-api/init_config.rst:1084 +msgid "" +"Initialize configuration with the :ref:`Isolated Configuration `." +msgstr "通过 :ref:`隔离配置 ` 来初始化配置。" + +#: ../../c-api/init_config.rst:1089 +msgid "Copy the wide character string *str* into ``*config_str``." +msgstr "将宽字符串 *str* 拷贝至 ``*config_str``。" + +#: ../../c-api/init_config.rst:1091 ../../c-api/init_config.rst:1098 +#: ../../c-api/init_config.rst:1105 ../../c-api/init_config.rst:1113 +#: ../../c-api/init_config.rst:1119 ../../c-api/init_config.rst:1136 +msgid ":ref:`Preinitialize Python ` if needed." +msgstr "在必要时 :ref:`预初始化 Python `。" + +#: ../../c-api/init_config.rst:1095 +msgid "" +"Decode *str* using :c:func:`Py_DecodeLocale` and set the result into " +"``*config_str``." +msgstr "使用 :c:func:`Py_DecodeLocale` 对 *str* 进行解码并将结果设置到 ``*config_str``。" + +#: ../../c-api/init_config.rst:1102 +msgid "" +"Set command line arguments (:c:member:`~PyConfig.argv` member of *config*) " +"from the *argv* list of wide character strings." +msgstr "根据宽字符串列表 *argv* 设置命令行参数 (*config* 的 :c:member:`~PyConfig.argv` 成员)。" + +#: ../../c-api/init_config.rst:1109 +msgid "" +"Set command line arguments (:c:member:`~PyConfig.argv` member of *config*) " +"from the *argv* list of bytes strings. Decode bytes using " +":c:func:`Py_DecodeLocale`." +msgstr "" +"根据字节串列表 *argv* 设置命令行参数 (*config* 的 :c:member:`~PyConfig.argv` 成员)。使用 " +":c:func:`Py_DecodeLocale` 对字节串进行解码。" + +#: ../../c-api/init_config.rst:1117 +msgid "Set the list of wide strings *list* to *length* and *items*." +msgstr "将宽字符串列表 *list* 设置为 *length* 和 *items*。" + +#: ../../c-api/init_config.rst:1123 +msgid "Read all Python configuration." +msgstr "读取所有 Python 配置。" + +#: ../../c-api/init_config.rst:1125 +msgid "Fields which are already initialized are left unchanged." +msgstr "已经初始化的字段会保持不变。" + +#: ../../c-api/init_config.rst:1127 +msgid "" +"Fields for :ref:`path configuration ` are no longer " +"calculated or modified when calling this function, as of Python 3.11." +msgstr "自 Python 3.11 起,调用此函数时不再计算或修改用于 :ref:`路径配置 ` 的字段。" + +#: ../../c-api/init_config.rst:1130 ../../c-api/init_config.rst:1692 +msgid "" +"The :c:func:`PyConfig_Read` function only parses :c:member:`PyConfig.argv` " +"arguments once: :c:member:`PyConfig.parse_argv` is set to ``2`` after " +"arguments are parsed. Since Python arguments are stripped from " +":c:member:`PyConfig.argv`, parsing arguments twice would parse the " +"application options as Python options." +msgstr "" +":c:func:`PyConfig_Read` 函数对 :c:member:`PyConfig.argv` 参数只会解析一次:在参数解析完成后 " +":c:member:`PyConfig.parse_argv` 将被设为 ``2``。由于 Python 参数是从 " +":c:member:`PyConfig.argv` 提取的,因此解析参数两次会将应用程序选项解析为 Python 选项。" + +#: ../../c-api/init_config.rst:1138 +msgid "" +"The :c:member:`PyConfig.argv` arguments are now only parsed once, " +":c:member:`PyConfig.parse_argv` is set to ``2`` after arguments are parsed, " +"and arguments are only parsed if :c:member:`PyConfig.parse_argv` equals " +"``1``." +msgstr "" +":c:member:`PyConfig.argv` " +"参数现在只会被解析一次,在参数解析完成后,:c:member:`PyConfig.parse_argv` 将被设为 ``2``,只有当 " +":c:member:`PyConfig.parse_argv` 等于 ``1`` 时才会解析参数。" + +#: ../../c-api/init_config.rst:1144 +msgid "" +":c:func:`PyConfig_Read` no longer calculates all paths, and so fields listed" +" under :ref:`Python Path Configuration ` may no longer be " +"updated until :c:func:`Py_InitializeFromConfig` is called." +msgstr "" +":c:func:`PyConfig_Read` 不会再计算所有路径,因此在 :ref:`Python 路径配置 ` " +"下列出的字段可能不会再更新直到 :c:func:`Py_InitializeFromConfig` 被调用。" + +#: ../../c-api/init_config.rst:1152 +msgid "Release configuration memory." +msgstr "释放配置内存" + +#: ../../c-api/init_config.rst:1154 +msgid "" +"Most ``PyConfig`` methods :ref:`preinitialize Python ` if needed." +" In that case, the Python preinitialization configuration " +"(:c:type:`PyPreConfig`) is based on the :c:type:`PyConfig`. If configuration" +" fields which are in common with :c:type:`PyPreConfig` are tuned, they must " +"be set before calling a :c:type:`PyConfig` method:" +msgstr "" +"如有必要大多数 ``PyConfig`` 方法都会 :ref:`预初始化 Python `。 在这种情况下,Python " +"预初始化配置 (:c:type:`PyPreConfig`) 将以 :c:type:`PyConfig` 为基础。 如果要调整与 " +":c:type:`PyPreConfig` 相同的配置字段,它们必须在调用 :c:type:`PyConfig` 方法之前被设置:" + +#: ../../c-api/init_config.rst:1160 +msgid ":c:member:`PyConfig.dev_mode`" +msgstr ":c:member:`PyConfig.dev_mode`" + +#: ../../c-api/init_config.rst:1161 +msgid ":c:member:`PyConfig.isolated`" +msgstr ":c:member:`PyConfig.isolated`" + +#: ../../c-api/init_config.rst:1162 +msgid ":c:member:`PyConfig.parse_argv`" +msgstr ":c:member:`PyConfig.parse_argv`" + +#: ../../c-api/init_config.rst:1163 +msgid ":c:member:`PyConfig.use_environment`" +msgstr ":c:member:`PyConfig.use_environment`" + +#: ../../c-api/init_config.rst:1165 +msgid "" +"Moreover, if :c:func:`PyConfig_SetArgv` or :c:func:`PyConfig_SetBytesArgv` " +"is used, this method must be called before other methods, since the " +"preinitialization configuration depends on command line arguments (if " +":c:member:`~PyConfig.parse_argv` is non-zero)." +msgstr "" +"此外,如果使用了 :c:func:`PyConfig_SetArgv` 或 " +":c:func:`PyConfig_SetBytesArgv`,则必须在调用其他方法之前调用该方法,因为预初始化配置取决于命令行参数(如果 " +":c:member:`~PyConfig.parse_argv` 为非零值)。" + +#: ../../c-api/init_config.rst:1170 +msgid "" +"The caller of these methods is responsible to handle exceptions (error or " +"exit) using ``PyStatus_Exception()`` and ``Py_ExitStatusException()``." +msgstr "" +"这些方法的调用者要负责使用 ``PyStatus_Exception()`` 和 ``Py_ExitStatusException()`` " +"来处理异常(错误或退出)。" + +#: ../../c-api/init_config.rst:1183 +msgid "" +"Set :data:`sys.argv` command line arguments based on " +":c:member:`~PyConfig.argv`. These parameters are similar to those passed to" +" the program's :c:func:`main` function with the difference that the first " +"entry should refer to the script file to be executed rather than the " +"executable hosting the Python interpreter. If there isn't a script that " +"will be run, the first entry in :c:member:`~PyConfig.argv` can be an empty " +"string." +msgstr "" +"根据 :c:member:`~PyConfig.argv` 设置 :data:`sys.argv` 命令行参数。这些形参与传给程序的 " +":c:func:`main` 函数的类似,区别在于其中第一项应当指向要执行的脚本文件而不是 Python " +"解释器对应的可执行文件。如果没有要运行的脚本,则 :c:member:`~PyConfig.argv` 中的第一项可以为空字符串。" + +#: ../../c-api/init_config.rst:1191 +msgid "" +"Set :c:member:`~PyConfig.parse_argv` to ``1`` to parse " +":c:member:`~PyConfig.argv` the same way the regular Python parses Python " +"command line arguments and then to strip Python arguments from " +":c:member:`~PyConfig.argv`." +msgstr "" +"将 :c:member:`~PyConfig.parse_argv` 设为 ``1`` 将以与普通 Python 解析 Python " +"命令行参数相同的方式解析 :c:member:`~PyConfig.argv` 再从 :c:member:`~PyConfig.argv` 中剥离 " +"Python 参数。" + +#: ../../c-api/init_config.rst:1196 +msgid "" +"If :c:member:`~PyConfig.argv` is empty, an empty string is added to ensure " +"that :data:`sys.argv` always exists and is never empty." +msgstr "" +"如果 :c:member:`~PyConfig.argv` 为空,则会添加一个空字符串以确保 :data:`sys.argv` 始终存在并且永远不为空。" + +#: ../../c-api/init_config.rst:1199 ../../c-api/init_config.rst:1226 +#: ../../c-api/init_config.rst:1240 ../../c-api/init_config.rst:1250 +#: ../../c-api/init_config.rst:1366 ../../c-api/init_config.rst:1375 +#: ../../c-api/init_config.rst:1386 ../../c-api/init_config.rst:1477 +#: ../../c-api/init_config.rst:1633 ../../c-api/init_config.rst:1734 +#: ../../c-api/init_config.rst:1753 ../../c-api/init_config.rst:1768 +#: ../../c-api/init_config.rst:1785 ../../c-api/init_config.rst:1798 +#: ../../c-api/init_config.rst:1806 ../../c-api/init_config.rst:1820 +#: ../../c-api/init_config.rst:1923 +msgid "Default: ``NULL``." +msgstr "默认值: ``NULL``。" + +#: ../../c-api/init_config.rst:1201 +msgid "See also the :c:member:`~PyConfig.orig_argv` member." +msgstr "另请参阅 :c:member:`~PyConfig.orig_argv` 成员。" + +#: ../../c-api/init_config.rst:1205 +msgid "" +"If equals to zero, ``Py_RunMain()`` prepends a potentially unsafe path to " +":data:`sys.path` at startup:" +msgstr "如果等于零,``Py_RunMain()`` 会在启动时向 :data:`sys.path` 开头添加一个可能不安全的路径:" + +#: ../../c-api/init_config.rst:1208 +msgid "" +"If :c:member:`argv[0] ` is equal to ``L\"-m\"`` (``python -m " +"module``), prepend the current working directory." +msgstr "" +"如果 :c:member:`argv[0] ` 等于 ``L\"-m\"`` (``python -m " +"module``),则添加当前工作目录。" + +#: ../../c-api/init_config.rst:1210 +msgid "" +"If running a script (``python script.py``), prepend the script's directory." +" If it's a symbolic link, resolve symbolic links." +msgstr "如果是运行脚本 (``python script.py``),则添加脚本的目录。如果是符号链接,则会解析符号链接。" + +#: ../../c-api/init_config.rst:1212 +msgid "" +"Otherwise (``python -c code`` and ``python``), prepend an empty string, " +"which means the current working directory." +msgstr "在其他情况下 (``python -c code`` 和 ``python``),将添加一个空字符串,这表示当前工作目录。" + +#: ../../c-api/init_config.rst:1215 +msgid "" +"Set to ``1`` by the :option:`-P` command line option and the " +":envvar:`PYTHONSAFEPATH` environment variable." +msgstr "通过 :option:`-P` 命令行选项和 :envvar:`PYTHONSAFEPATH` 环境变量设置为 ``1``。" + +#: ../../c-api/init_config.rst:1218 +msgid "Default: ``0`` in Python config, ``1`` in isolated config." +msgstr "默认值:Python 配置中为 ``0``,隔离配置中为 ``1``。" + +#: ../../c-api/init_config.rst:1224 +msgid ":data:`sys.base_exec_prefix`." +msgstr ":data:`sys.base_exec_prefix`." + +#: ../../c-api/init_config.rst:1228 ../../c-api/init_config.rst:1242 +#: ../../c-api/init_config.rst:1252 ../../c-api/init_config.rst:1377 +#: ../../c-api/init_config.rst:1388 ../../c-api/init_config.rst:1650 +#: ../../c-api/init_config.rst:1736 +msgid "" +"Part of the :ref:`Python Path Configuration ` output." +msgstr ":ref:`Python 路径配置 ` 的一部分。" + +#: ../../c-api/init_config.rst:1230 +msgid "See also :c:member:`PyConfig.exec_prefix`." +msgstr "另请参阅 :c:member:`PyConfig.exec_prefix`。" + +#: ../../c-api/init_config.rst:1234 +msgid "Python base executable: :data:`sys._base_executable`." +msgstr "Python 基础可执行文件::data:`sys._base_executable`。" + +#: ../../c-api/init_config.rst:1236 +msgid "Set by the :envvar:`__PYVENV_LAUNCHER__` environment variable." +msgstr "由 :envvar:`__PYVENV_LAUNCHER__` 环境变量设置。" + +#: ../../c-api/init_config.rst:1238 +msgid "Set from :c:member:`PyConfig.executable` if ``NULL``." +msgstr "如为 ``NULL`` 则从 :c:member:`PyConfig.executable` 设置。" + +#: ../../c-api/init_config.rst:1244 +msgid "See also :c:member:`PyConfig.executable`." +msgstr "另请参阅 :c:member:`PyConfig.executable`。" + +#: ../../c-api/init_config.rst:1248 +msgid ":data:`sys.base_prefix`." +msgstr ":data:`sys.base_prefix`." + +#: ../../c-api/init_config.rst:1254 +msgid "See also :c:member:`PyConfig.prefix`." +msgstr "另请参阅 :c:member:`PyConfig.prefix`。" + +#: ../../c-api/init_config.rst:1258 +msgid "" +"If equals to ``0`` and :c:member:`~PyConfig.configure_c_stdio` is non-zero, " +"disable buffering on the C streams stdout and stderr." +msgstr "" +"如果等于 ``0`` 且 :c:member:`~PyConfig.configure_c_stdio` 为非零值,则禁用 C 数据流 stdout 和" +" stderr 的缓冲。" + +#: ../../c-api/init_config.rst:1261 +msgid "" +"Set to ``0`` by the :option:`-u` command line option and the " +":envvar:`PYTHONUNBUFFERED` environment variable." +msgstr "通过 :option:`-u` 命令行选项和 :envvar:`PYTHONUNBUFFERED` 环境变量设置为 ``0``。" + +#: ../../c-api/init_config.rst:1264 +msgid "stdin is always opened in buffered mode." +msgstr "stdin 始终以缓冲模式打开。" + +#: ../../c-api/init_config.rst:1270 +msgid "" +"If equals to ``1``, issue a warning when comparing :class:`bytes` or " +":class:`bytearray` with :class:`str`, or comparing :class:`bytes` with " +":class:`int`." +msgstr "" +"如果等于 ``1``,则在将 :class:`bytes` 或 :class:`bytearray` 与 :class:`str` 进行比较,或将 " +":class:`bytes` 与 :class:`int` 进行比较时发出警告。" + +#: ../../c-api/init_config.rst:1274 +msgid "" +"If equal or greater to ``2``, raise a :exc:`BytesWarning` exception in these" +" cases." +msgstr "如果大于等于 ``2``,则在这些情况下引发 :exc:`BytesWarning` 异常。" + +#: ../../c-api/init_config.rst:1277 +msgid "Incremented by the :option:`-b` command line option." +msgstr "由 :option:`-b` 命令行选项执行递增。" + +#: ../../c-api/init_config.rst:1283 +msgid "" +"The :option:`-b` and :option:`!-bb` options will become no-op in 3.17. " +":c:member:`~PyConfig.bytes_warning` member will be removed in 3.17." +msgstr "" + +#: ../../c-api/init_config.rst:1288 +msgid "" +"If non-zero, emit a :exc:`EncodingWarning` warning when " +":class:`io.TextIOWrapper` uses its default encoding. See :ref:`io-encoding-" +"warning` for details." +msgstr "" +"如为非零值,则在 :class:`io.TextIOWrapper` 使用默认编码格式时发出 :exc:`EncodingWarning` " +"警告。详情请参阅 :ref:`io-encoding-warning`。" + +#: ../../c-api/init_config.rst:1297 +msgid "" +"If equals to ``0``, disables the inclusion of the end line and column " +"mappings in code objects. Also disables traceback printing carets to " +"specific error locations." +msgstr "如果等于 ``0``,则禁用在代码对象中包括末尾行和列映射。并且禁用在特定错误位置打印回溯标记。" + +#: ../../c-api/init_config.rst:1301 +msgid "" +"Set to ``0`` by the :envvar:`PYTHONNODEBUGRANGES` environment variable and " +"by the :option:`-X no_debug_ranges <-X>` command line option." +msgstr "" +"通过 :envvar:`PYTHONNODEBUGRANGES` 环境变量和 :option:`-X no_debug_ranges <-X>` " +"命令行选项设置为 ``0``。" + +#: ../../c-api/init_config.rst:1310 +msgid "" +"Control the validation behavior of hash-based ``.pyc`` files: value of the " +":option:`--check-hash-based-pycs` command line option." +msgstr "控制基于哈希值的 ``.pyc`` 文件的验证行为::option:`--check-hash-based-pycs` 命令行选项的值。" + +#: ../../c-api/init_config.rst:1313 +msgid "Valid values:" +msgstr "有效的值:" + +#: ../../c-api/init_config.rst:1315 +msgid "" +"``L\"always\"``: Hash the source file for invalidation regardless of value " +"of the 'check_source' flag." +msgstr "``L\"always\"``: 无论 'check_source' 旗标的值是什么都会对源文件进行哈希验证。" + +#: ../../c-api/init_config.rst:1317 +msgid "``L\"never\"``: Assume that hash-based pycs always are valid." +msgstr "``L\"never\"``: 假定基于哈希值的 pyc 始终是有效的。" + +#: ../../c-api/init_config.rst:1318 +msgid "" +"``L\"default\"``: The 'check_source' flag in hash-based pycs determines " +"invalidation." +msgstr "``L\"default\"``: 基于哈希值的 pyc 中的 'check_source' 旗标确定是否验证无效。" + +#: ../../c-api/init_config.rst:1321 +msgid "Default: ``L\"default\"``." +msgstr "默认值: ``L\"default\"``。" + +#: ../../c-api/init_config.rst:1323 +msgid "See also :pep:`552` \"Deterministic pycs\"." +msgstr "参见 :pep:`552` \"Deterministic pycs\"。" + +#: ../../c-api/init_config.rst:1327 +msgid "If non-zero, configure C standard streams:" +msgstr "如为非零值,则配置 C 标准流:" + +#: ../../c-api/init_config.rst:1329 +msgid "" +"On Windows, set the binary mode (``O_BINARY``) on stdin, stdout and stderr." +msgstr "在 Windows 中,在 stdin, stdout 和 stderr 上设置二进制模式 (``O_BINARY``)。" + +#: ../../c-api/init_config.rst:1331 +msgid "" +"If :c:member:`~PyConfig.buffered_stdio` equals zero, disable buffering of " +"stdin, stdout and stderr streams." +msgstr "" +"如果 :c:member:`~PyConfig.buffered_stdio` 等于零,则禁用 stdin, stdout 和 stderr 流的缓冲。" + +#: ../../c-api/init_config.rst:1333 +msgid "" +"If :c:member:`~PyConfig.interactive` is non-zero, enable stream buffering on" +" stdin and stdout (only stdout on Windows)." +msgstr "" +"如果 :c:member:`~PyConfig.interactive` 为非零值,则启用 stdin 和 stdout 上的流缓冲(Windows " +"中仅限 stdout)。" + +#: ../../c-api/init_config.rst:1340 +msgid "If non-zero, enable the :ref:`Python Development Mode `." +msgstr "如果为非零值,则启用 :ref:`Python 开发模式 `。" + +#: ../../c-api/init_config.rst:1342 +msgid "" +"Set to ``1`` by the :option:`-X dev <-X>` option and the " +":envvar:`PYTHONDEVMODE` environment variable." +msgstr "通过 :option:`-X dev <-X>` 选项和 :envvar:`PYTHONDEVMODE` 环境变量设置为 ``1``。" + +#: ../../c-api/init_config.rst:1349 +msgid "Dump Python references?" +msgstr "转储 Python 引用?" + +#: ../../c-api/init_config.rst:1351 +msgid "If non-zero, dump all objects which are still alive at exit." +msgstr "如果为非零值,则转储所有在退出时仍存活的对象。" + +#: ../../c-api/init_config.rst:1353 +msgid "Set to ``1`` by the :envvar:`PYTHONDUMPREFS` environment variable." +msgstr "由 :envvar:`PYTHONDUMPREFS` 环境变量设置为 ``1``。" + +#: ../../c-api/init_config.rst:1355 +msgid "" +"Needs a special build of Python with the ``Py_TRACE_REFS`` macro defined: " +"see the :option:`configure --with-trace-refs option <--with-trace-refs>`." +msgstr "" +"需要定义了 ``Py_TRACE_REFS`` 宏的特殊 Python 编译版:参见 :option:`configure --with-trace-" +"refs 选项 <--with-trace-refs>`。" + +#: ../../c-api/init_config.rst:1362 +msgid "Filename where to dump Python references." +msgstr "转储 Python 引用的目标文件名。" + +#: ../../c-api/init_config.rst:1364 +msgid "Set by the :envvar:`PYTHONDUMPREFSFILE` environment variable." +msgstr "由 :envvar:`PYTHONDUMPREFSFILE` 环境变量设置。" + +#: ../../c-api/init_config.rst:1372 +msgid "" +"The site-specific directory prefix where the platform-dependent Python files" +" are installed: :data:`sys.exec_prefix`." +msgstr "安装依赖于平台的 Python 文件的站点专属目录前缀::data:`sys.exec_prefix`。" + +#: ../../c-api/init_config.rst:1379 +msgid "See also :c:member:`PyConfig.base_exec_prefix`." +msgstr "另请参阅 :c:member:`PyConfig.base_exec_prefix`。" + +#: ../../c-api/init_config.rst:1383 +msgid "" +"The absolute path of the executable binary for the Python interpreter: " +":data:`sys.executable`." +msgstr "Python 解释器可执行二进制文件的绝对路径::data:`sys.executable`。" + +#: ../../c-api/init_config.rst:1390 +msgid "See also :c:member:`PyConfig.base_executable`." +msgstr "另请参阅 :c:member:`PyConfig.base_executable`。" + +#: ../../c-api/init_config.rst:1394 +msgid "Enable faulthandler?" +msgstr "启用 faulthandler?" + +#: ../../c-api/init_config.rst:1396 +msgid "If non-zero, call :func:`faulthandler.enable` at startup." +msgstr "如果为非零值,则在启动时调用 :func:`faulthandler.enable`。" + +#: ../../c-api/init_config.rst:1398 +msgid "" +"Set to ``1`` by :option:`-X faulthandler <-X>` and the " +":envvar:`PYTHONFAULTHANDLER` environment variable." +msgstr "" +"通过 :option:`-X faulthandler <-X>` 和 :envvar:`PYTHONFAULTHANDLER` 环境变量设为 " +"``1``。" + +#: ../../c-api/init_config.rst:1405 +msgid "" +":term:`Filesystem encoding `: " +":func:`sys.getfilesystemencoding`." +msgstr "" +":term:`文件系统编码格式 `: 可通过 " +":func:`sys.getfilesystemencoding` 获取。" + +#: ../../c-api/init_config.rst:1408 +msgid "On macOS, Android and VxWorks: use ``\"utf-8\"`` by default." +msgstr "在 macOS, Android 和 VxWorks 上:默认使用 ``\"utf-8\"``。" + +#: ../../c-api/init_config.rst:1410 +msgid "" +"On Windows: use ``\"utf-8\"`` by default, or ``\"mbcs\"`` if " +":c:member:`~PyPreConfig.legacy_windows_fs_encoding` of :c:type:`PyPreConfig`" +" is non-zero." +msgstr "" +"在 Windows 上:默认使用 ``\"utf-8\"``,或者如果 :c:type:`PyPreConfig` 的 " +":c:member:`~PyPreConfig.legacy_windows_fs_encoding` 为非零值则使用 ``\"mbcs\"``。" + +#: ../../c-api/init_config.rst:1414 +msgid "Default encoding on other platforms:" +msgstr "在其他平台上的默认编码格式:" + +#: ../../c-api/init_config.rst:1416 +msgid "``\"utf-8\"`` if :c:member:`PyPreConfig.utf8_mode` is non-zero." +msgstr "如果 :c:member:`PyPreConfig.utf8_mode` 为非零值则使用 ``\"utf-8\"``。" + +#: ../../c-api/init_config.rst:1417 +msgid "" +"``\"ascii\"`` if Python detects that ``nl_langinfo(CODESET)`` announces the " +"ASCII encoding, whereas the ``mbstowcs()`` function decodes from a different" +" encoding (usually Latin1)." +msgstr "" +"如果 Python 检测到 ``nl_langinfo(CODESET)`` 声明为 ASCII 编码格式,而 ``mbstowcs()`` " +"是从其他的编码格式解码(通常为 Latin1)则使用 ``\"ascii\"``。" + +#: ../../c-api/init_config.rst:1420 +msgid "``\"utf-8\"`` if ``nl_langinfo(CODESET)`` returns an empty string." +msgstr "如果 ``nl_langinfo(CODESET)`` 返回空字符串则使用 ``\"utf-8\"``。" + +#: ../../c-api/init_config.rst:1421 +msgid "" +"Otherwise, use the :term:`locale encoding`: ``nl_langinfo(CODESET)`` result." +msgstr "在其他情况下,使用 :term:`locale encoding`: ``nl_langinfo(CODESET)`` 的结果。" + +#: ../../c-api/init_config.rst:1424 +msgid "" +"At Python startup, the encoding name is normalized to the Python codec name." +" For example, ``\"ANSI_X3.4-1968\"`` is replaced with ``\"ascii\"``." +msgstr "" +"在 Python 启动时,编码格式名称会规范化为 Python 编解码器名称。例如,``\"ANSI_X3.4-1968\"`` 将被替换为 " +"``\"ascii\"``。" + +#: ../../c-api/init_config.rst:1427 +msgid "See also the :c:member:`~PyConfig.filesystem_errors` member." +msgstr "参见 :c:member:`~PyConfig.filesystem_errors` 成员。" + +#: ../../c-api/init_config.rst:1431 +msgid "" +":term:`Filesystem error handler `: " +":func:`sys.getfilesystemencodeerrors`." +msgstr "" +":term:`文件系统错误处理器 `: 可通过 " +":func:`sys.getfilesystemencodeerrors` 获取。" + +#: ../../c-api/init_config.rst:1434 +msgid "" +"On Windows: use ``\"surrogatepass\"`` by default, or ``\"replace\"`` if " +":c:member:`~PyPreConfig.legacy_windows_fs_encoding` of :c:type:`PyPreConfig`" +" is non-zero." +msgstr "" +"在 Windows 上:默认使用 ``\"surrogatepass\"``,或者如果 :c:type:`PyPreConfig` 的 " +":c:member:`~PyPreConfig.legacy_windows_fs_encoding` 为非零值则使用 ``\"replace\"``。" + +#: ../../c-api/init_config.rst:1438 +msgid "On other platforms: use ``\"surrogateescape\"`` by default." +msgstr "在其他平台上:默认使用 ``\"surrogateescape\"``。" + +#: ../../c-api/init_config.rst:1440 +msgid "Supported error handlers:" +msgstr "支持的错误处理器:" + +#: ../../c-api/init_config.rst:1442 +msgid "``\"strict\"``" +msgstr "``\"strict\"``" + +#: ../../c-api/init_config.rst:1443 +msgid "``\"surrogateescape\"``" +msgstr "``\"surrogateescape\"``" + +#: ../../c-api/init_config.rst:1444 +msgid "``\"surrogatepass\"`` (only supported with the UTF-8 encoding)" +msgstr "``\"surrogatepass\"`` (仅支持 UTF-8 编码格式)" + +#: ../../c-api/init_config.rst:1446 +msgid "See also the :c:member:`~PyConfig.filesystem_encoding` member." +msgstr "参见 :c:member:`~PyConfig.filesystem_encoding` 成员。" + +#: ../../c-api/init_config.rst:1450 +msgid "If non-zero, use frozen modules." +msgstr "如为非零值,则使用冻结模块。" + +#: ../../c-api/init_config.rst:1452 +msgid "Set by the :envvar:`PYTHON_FROZEN_MODULES` environment variable." +msgstr "由 :envvar:`PYTHON_FROZEN_MODULES` 环境变量设置。" + +#: ../../c-api/init_config.rst:1454 +msgid "" +"Default: ``1`` in a release build, or ``0`` in a :ref:`debug build `." +msgstr "默认值:在发布构建版中为 ``1``,而在 :ref:`调试构建版 ` 中为 ``0``。" + +#: ../../c-api/init_config.rst:1460 +msgid "Randomized hash function seed." +msgstr "随机化的哈希函数种子。" + +#: ../../c-api/init_config.rst:1462 +msgid "" +"If :c:member:`~PyConfig.use_hash_seed` is zero, a seed is chosen randomly at" +" Python startup, and :c:member:`~PyConfig.hash_seed` is ignored." +msgstr "" +"如果 :c:member:`~PyConfig.use_hash_seed` 为零,则在 Python 启动时随机选择一个种子,并忽略 " +":c:member:`~PyConfig.hash_seed` 字段。" + +#: ../../c-api/init_config.rst:1465 +msgid "Set by the :envvar:`PYTHONHASHSEED` environment variable." +msgstr "由 :envvar:`PYTHONHASHSEED` 环境变量设置。" + +#: ../../c-api/init_config.rst:1467 +msgid "" +"Default *use_hash_seed* value: ``-1`` in Python mode, ``0`` in isolated " +"mode." +msgstr "默认的 *use_hash_seed* 值:在 Python 模式下为 ``-1``,在隔离模式下为 ``0``。" + +#: ../../c-api/init_config.rst:1472 +msgid "" +"Set the default Python \"home\" directory, that is, the location of the " +"standard Python libraries (see :envvar:`PYTHONHOME`)." +msgstr "设置默认的 Python \"home\" 目录,即标准 Python 库所在的位置 (参见 :envvar:`PYTHONHOME`)。" + +#: ../../c-api/init_config.rst:1475 +msgid "Set by the :envvar:`PYTHONHOME` environment variable." +msgstr "由 :envvar:`PYTHONHOME` 环境变量设置。" + +#: ../../c-api/init_config.rst:1479 ../../c-api/init_config.rst:1615 +#: ../../c-api/init_config.rst:1635 ../../c-api/init_config.rst:1724 +#: ../../c-api/init_config.rst:1755 +msgid "Part of the :ref:`Python Path Configuration ` input." +msgstr ":ref:`Python 路径配置 ` 输入的一部分。" + +#: ../../c-api/init_config.rst:1483 +msgid "" +"If ``1``, profile import time. If ``2``, include additional output that " +"indicates when an imported module has already been loaded." +msgstr "如为 ``1``,则会针对导入时间进行性能分析。如为 ``2``,则会包括提示当被导入模块已被加载的额外输出。" + +#: ../../c-api/init_config.rst:1487 +msgid "" +"Set by the :option:`-X importtime <-X>` option and the " +":envvar:`PYTHONPROFILEIMPORTTIME` environment variable." +msgstr "" +"通过 :option:`-X importtime <-X>` 选项和 :envvar:`PYTHONPROFILEIMPORTTIME` " +"环境变量设置。" + +#: ../../c-api/init_config.rst:1494 +msgid "Added support for ``import_time = 2``" +msgstr "添加了对 ``import_time = 2`` 的支持" + +#: ../../c-api/init_config.rst:1498 +msgid "Enter interactive mode after executing a script or a command." +msgstr "在执行脚本或命令之后进入交互模式。" + +#: ../../c-api/init_config.rst:1500 +msgid "" +"If greater than ``0``, enable inspect: when a script is passed as first " +"argument or the -c option is used, enter interactive mode after executing " +"the script or the command, even when :data:`sys.stdin` does not appear to be" +" a terminal." +msgstr "" +"如果大于 ``0``,则启用检查:当脚本作为第一个参数传入或使用了 -c 选项时,在执行脚本或命令后进入交互模式,即使在 " +":data:`sys.stdin` 看来并非一个终端时也是如此。" + +#: ../../c-api/init_config.rst:1505 +msgid "" +"Incremented by the :option:`-i` command line option. Set to ``1`` if the " +":envvar:`PYTHONINSPECT` environment variable is non-empty." +msgstr "" +"通过 :option:`-i` 命令行选项执行递增。如果 :envvar:`PYTHONINSPECT` 环境变量为非空值则设为 ``1``。" + +#: ../../c-api/init_config.rst:1512 +msgid "Install Python signal handlers?" +msgstr "安装 Python 信号处理器?" + +#: ../../c-api/init_config.rst:1514 ../../c-api/init_config.rst:1698 +#: ../../c-api/init_config.rst:1722 ../../c-api/init_config.rst:1958 +msgid "Default: ``1`` in Python mode, ``0`` in isolated mode." +msgstr "默认值:在 Python 模式下为 ``1``,在隔离模式下为 ``0``。" + +#: ../../c-api/init_config.rst:1518 +msgid "If greater than ``0``, enable the interactive mode (REPL)." +msgstr "如果大于 ``0``,则启用交互模式(REPL)。" + +#: ../../c-api/init_config.rst:1520 +msgid "Incremented by the :option:`-i` command line option." +msgstr "由 :option:`-i` 命令行选项执行递增。" + +#: ../../c-api/init_config.rst:1526 +msgid "" +"Configures the :ref:`integer string conversion length limitation " +"`. An initial value of ``-1`` means the value will be " +"taken from the command line or environment or otherwise default to 4300 " +"(:data:`sys.int_info.default_max_str_digits`). A value of ``0`` disables " +"the limitation. Values greater than zero but less than 640 " +"(:data:`sys.int_info.str_digits_check_threshold`) are unsupported and will " +"produce an error." +msgstr "" +"配置 :ref:`整数字符串转换长度限制 `。初始值为 ``-1`` 表示该值将从命令行或环境获取否则默认为 " +"4300 (:data:`sys.int_info.default_max_str_digits`)。值为 ``0`` 表示禁用限制。大于 0 但小于 " +"640 (:data:`sys.int_info.str_digits_check_threshold`) 的值将不被支持并会产生错误。" + +#: ../../c-api/init_config.rst:1534 +msgid "" +"Configured by the :option:`-X int_max_str_digits <-X>` command line flag or " +"the :envvar:`PYTHONINTMAXSTRDIGITS` environment variable." +msgstr "" +"通过 :option:`-X int_max_str_digits <-X>` 命令行旗标或 " +":envvar:`PYTHONINTMAXSTRDIGITS` 环境变量配置。" + +#: ../../c-api/init_config.rst:1537 +msgid "" +"Default: ``-1`` in Python mode. 4300 " +"(:data:`sys.int_info.default_max_str_digits`) in isolated mode." +msgstr "" +"默认值:在 Python 模式下为 ``-1``。在隔离模式下为 4300 (即 " +":data:`sys.int_info.default_max_str_digits` 的值)。" + +#: ../../c-api/init_config.rst:1544 +msgid "" +"If the value of :c:member:`~PyConfig.cpu_count` is not ``-1`` then it will " +"override the return values of :func:`os.cpu_count`, " +":func:`os.process_cpu_count`, and :func:`multiprocessing.cpu_count`." +msgstr "" +"如果 :c:member:`~PyConfig.cpu_count` 的值不为 ``-1`` 则它将覆盖 :func:`os.cpu_count`, " +":func:`os.process_cpu_count` 和 :func:`multiprocessing.cpu_count` 的返回值。" + +#: ../../c-api/init_config.rst:1548 +msgid "" +"Configured by the :samp:`-X cpu_count={n|default}` command line flag or the " +":envvar:`PYTHON_CPU_COUNT` environment variable." +msgstr "" +"通过 :samp:`-X cpu_count={n|default}` 命令行旗标或 :envvar:`PYTHON_CPU_COUNT` " +"环境变量来配置。" + +#: ../../c-api/init_config.rst:1551 ../../c-api/init_config.rst:1912 +msgid "Default: ``-1``." +msgstr "默认值: ``-1``。" + +#: ../../c-api/init_config.rst:1557 +msgid "If greater than ``0``, enable isolated mode:" +msgstr "如果大于 ``0``,则启用隔离模式:" + +#: ../../c-api/init_config.rst:1559 +msgid "" +"Set :c:member:`~PyConfig.safe_path` to ``1``: don't prepend a potentially " +"unsafe path to :data:`sys.path` at Python startup, such as the current " +"directory, the script's directory or an empty string." +msgstr "" +"将 :c:member:`~PyConfig.safe_path` 设为 ``1``: 在 Python 启动时将不在 :data:`sys.path`" +" 前添加有潜在不安全性的路径,如当前目录、脚本所在目录或空字符串。" + +#: ../../c-api/init_config.rst:1563 +msgid "" +"Set :c:member:`~PyConfig.use_environment` to ``0``: ignore ``PYTHON`` " +"environment variables." +msgstr "将 :c:member:`~PyConfig.use_environment` 设为 ``0``: 忽略 ``PYTHON`` 环境变量。" + +#: ../../c-api/init_config.rst:1565 +msgid "" +"Set :c:member:`~PyConfig.user_site_directory` to ``0``: don't add the user " +"site directory to :data:`sys.path`." +msgstr "" +"将 :c:member:`~PyConfig.user_site_directory` 设为 ``0``: 不要将用户级站点目录添加到 " +":data:`sys.path` 列表。" + +#: ../../c-api/init_config.rst:1567 +msgid "" +"Python REPL doesn't import :mod:`readline` nor enable default readline " +"configuration on interactive prompts." +msgstr "Python REPL 将不导入 :mod:`readline` 也不在交互提示符中启用默认的 readline 配置。" + +#: ../../c-api/init_config.rst:1570 +msgid "Set to ``1`` by the :option:`-I` command line option." +msgstr "通过 :option:`-I` 命令行选项设置为 ``1``。" + +#: ../../c-api/init_config.rst:1574 +msgid "" +"See also the :ref:`Isolated Configuration ` and " +":c:member:`PyPreConfig.isolated`." +msgstr "" +"另请参阅 :ref:`隔离配置 ` 和 :c:member:`PyPreConfig.isolated`。" + +#: ../../c-api/init_config.rst:1579 +msgid "" +"If non-zero, use :class:`io.FileIO` instead of " +":class:`!io._WindowsConsoleIO` for :data:`sys.stdin`, :data:`sys.stdout` and" +" :data:`sys.stderr`." +msgstr "" +"如为非零值,则使用 :class:`io.FileIO` 代替 :class:`!io._WindowsConsoleIO` 作为 " +":data:`sys.stdin`、:data:`sys.stdout` 和 :data:`sys.stderr`。" + +#: ../../c-api/init_config.rst:1583 +msgid "" +"Set to ``1`` if the :envvar:`PYTHONLEGACYWINDOWSSTDIO` environment variable " +"is set to a non-empty string." +msgstr "如果 :envvar:`PYTHONLEGACYWINDOWSSTDIO` 环境变量被设为非空字符串则设为 ``1``。" + +#: ../../c-api/init_config.rst:1591 +msgid "See also the :pep:`528` (Change Windows console encoding to UTF-8)." +msgstr "另请参阅 :pep:`528` (将 Windows 控制台编码格式更改为 UTF-8)。" + +#: ../../c-api/init_config.rst:1595 +msgid "" +"If non-zero, dump statistics on :ref:`Python pymalloc memory allocator " +"` at exit." +msgstr "如为非零值,则在退出时转储 :ref:`Python pymalloc 内存分配器 ` 的统计数据。" + +#: ../../c-api/init_config.rst:1598 +msgid "Set to ``1`` by the :envvar:`PYTHONMALLOCSTATS` environment variable." +msgstr "由 :envvar:`PYTHONMALLOCSTATS` 环境变量设置为 ``1``。" + +#: ../../c-api/init_config.rst:1600 +msgid "" +"The option is ignored if Python is :option:`configured using the --without-" +"pymalloc option <--without-pymalloc>`." +msgstr "" +"如果 Python 是 :option:`使用 --without-pymalloc 选项进行配置 <--without-pymalloc>` " +"则该选项将被忽略。" + +#: ../../c-api/init_config.rst:1607 +msgid "Platform library directory name: :data:`sys.platlibdir`." +msgstr "平台库目录名称::data:`sys.platlibdir`。" + +#: ../../c-api/init_config.rst:1609 +msgid "Set by the :envvar:`PYTHONPLATLIBDIR` environment variable." +msgstr "由 :envvar:`PYTHONPLATLIBDIR` 环境变量设置。" + +#: ../../c-api/init_config.rst:1611 +msgid "" +"Default: value of the ``PLATLIBDIR`` macro which is set by the " +":option:`configure --with-platlibdir option <--with-platlibdir>` (default: " +"``\"lib\"``, or ``\"DLLs\"`` on Windows)." +msgstr "" +"默认值:由 :option:`configure --with-platlibdir 选项 <--with-platlibdir>` 设置的 " +"``PLATLIBDIR`` 宏的值 (默认值: ``\"lib\"``,在 Windows 上则为 ``\"DLLs\"``)。" + +#: ../../c-api/init_config.rst:1619 +msgid "" +"This macro is now used on Windows to locate the standard library extension " +"modules, typically under ``DLLs``. However, for compatibility, note that " +"this value is ignored for any non-standard layouts, including in-tree builds" +" and virtual environments." +msgstr "" +"目前在 Windows 系统中该宏被用于定位标准库扩展模块,通常位于 ``DLLs`` " +"下。不过,出于兼容性考虑,请注意在任何非标准布局包括树内构建和虚拟环境中,该值都将被忽略。" + +#: ../../c-api/init_config.rst:1628 +msgid "" +"Module search paths (:data:`sys.path`) as a string separated by ``DELIM`` " +"(:data:`os.pathsep`)." +msgstr "模块搜索路径 (:data:`sys.path`) 为一个用 ``DELIM`` (:data:`os.pathsep`) 分隔的字符串。" + +#: ../../c-api/init_config.rst:1631 +msgid "Set by the :envvar:`PYTHONPATH` environment variable." +msgstr "由 :envvar:`PYTHONPATH` 环境变量设置。" + +#: ../../c-api/init_config.rst:1640 +msgid "Module search paths: :data:`sys.path`." +msgstr "模块搜索路径::data:`sys.path`。" + +#: ../../c-api/init_config.rst:1642 +msgid "" +"If :c:member:`~PyConfig.module_search_paths_set` is equal to ``0``, " +":c:func:`Py_InitializeFromConfig` will replace " +":c:member:`~PyConfig.module_search_paths` and sets " +":c:member:`~PyConfig.module_search_paths_set` to ``1``." +msgstr "" +"如果 :c:member:`~PyConfig.module_search_paths_set` 等于 " +"``0``,:c:func:`Py_InitializeFromConfig` 将替代 " +":c:member:`~PyConfig.module_search_paths` 并将 " +":c:member:`~PyConfig.module_search_paths_set` 设为 ``1``。" + +#: ../../c-api/init_config.rst:1647 +msgid "" +"Default: empty list (``module_search_paths``) and ``0`` " +"(``module_search_paths_set``)." +msgstr "" +"默认值:空列表 (``module_search_paths``) 和 ``0`` (``module_search_paths_set``)。" + +#: ../../c-api/init_config.rst:1654 +msgid "Compilation optimization level:" +msgstr "编译优化级别:" + +#: ../../c-api/init_config.rst:1656 +msgid "``0``: Peephole optimizer, set ``__debug__`` to ``True``." +msgstr "``0``: Peephole 优化器,将 ``__debug__`` 设为 ``True``。" + +#: ../../c-api/init_config.rst:1657 +msgid "``1``: Level 0, remove assertions, set ``__debug__`` to ``False``." +msgstr "``1``: 0 级,移除断言,将 ``__debug__`` 设为 ``False``。" + +#: ../../c-api/init_config.rst:1658 +msgid "``2``: Level 1, strip docstrings." +msgstr "``2``: 1 级,去除文档字符串。" + +#: ../../c-api/init_config.rst:1660 +msgid "" +"Incremented by the :option:`-O` command line option. Set to the " +":envvar:`PYTHONOPTIMIZE` environment variable value." +msgstr "通过 :option:`-O` 命令行选项递增。设置为 :envvar:`PYTHONOPTIMIZE` 环境变量值。" + +#: ../../c-api/init_config.rst:1667 +msgid "" +"The list of the original command line arguments passed to the Python " +"executable: :data:`sys.orig_argv`." +msgstr "传给 Python 可执行程序的原始命令行参数列表::data:`sys.orig_argv`。" + +#: ../../c-api/init_config.rst:1670 +msgid "" +"If :c:member:`~PyConfig.orig_argv` list is empty and " +":c:member:`~PyConfig.argv` is not a list only containing an empty string, " +":c:func:`PyConfig_Read` copies :c:member:`~PyConfig.argv` into " +":c:member:`~PyConfig.orig_argv` before modifying :c:member:`~PyConfig.argv` " +"(if :c:member:`~PyConfig.parse_argv` is non-zero)." +msgstr "" +"如果 :c:member:`~PyConfig.orig_argv` 列表为空并且 :c:member:`~PyConfig.argv` " +"不是一个只包含空字符串的列表,:c:func:`PyConfig_Read` 将在修改 :c:member:`~PyConfig.argv` 之前把 " +":c:member:`~PyConfig.argv` 拷贝至 :c:member:`~PyConfig.orig_argv` (如果 " +":c:member:`~PyConfig.parse_argv` 为非零值)。" + +#: ../../c-api/init_config.rst:1677 +msgid "" +"See also the :c:member:`~PyConfig.argv` member and the " +":c:func:`Py_GetArgcArgv` function." +msgstr "另请参阅 :c:member:`~PyConfig.argv` 成员和 :c:func:`Py_GetArgcArgv` 函数。" + +#: ../../c-api/init_config.rst:1680 ../../c-api/init_config.rst:1993 +#: ../../c-api/init_config.rst:2012 +msgid "Default: empty list." +msgstr "默认值:空列表。" + +#: ../../c-api/init_config.rst:1686 +msgid "Parse command line arguments?" +msgstr "解析命令行参数?" + +#: ../../c-api/init_config.rst:1688 +msgid "" +"If equals to ``1``, parse :c:member:`~PyConfig.argv` the same way the " +"regular Python parses :ref:`command line arguments `, and " +"strip Python arguments from :c:member:`~PyConfig.argv`." +msgstr "" +"如果等于 ``1``,则以与常规 Python 解析 :ref:`命令行参数 ` 相同的方式解析 " +":c:member:`~PyConfig.argv`,并从 :c:member:`~PyConfig.argv` 中剥离 Python 参数。" + +#: ../../c-api/init_config.rst:1700 +msgid "" +"The :c:member:`PyConfig.argv` arguments are now only parsed if " +":c:member:`PyConfig.parse_argv` equals to ``1``." +msgstr "" +"现在只有当 :c:member:`PyConfig.parse_argv` 等于 ``1`` 时才会解析 " +":c:member:`PyConfig.argv` 参数。" + +#: ../../c-api/init_config.rst:1706 +msgid "" +"Parser debug mode. If greater than ``0``, turn on parser debugging output " +"(for expert only, depending on compilation options)." +msgstr "解析器调试模式。如果大于 ``0``,则打开解析器调试输出(仅针对专家,取决于编译选项)。" + +#: ../../c-api/init_config.rst:1709 +msgid "" +"Incremented by the :option:`-d` command line option. Set to the " +":envvar:`PYTHONDEBUG` environment variable value." +msgstr "通过 :option:`-d` 命令行选项递增。设置为 :envvar:`PYTHONDEBUG` 环境变量值。" + +#: ../../c-api/init_config.rst:1712 ../../c-api/init_config.rst:1817 +msgid "" +"Needs a :ref:`debug build of Python ` (the ``Py_DEBUG`` macro " +"must be defined)." +msgstr "需要 :ref:`Python 调试编译版 ` (必须已定义 ``Py_DEBUG`` 宏)。" + +#: ../../c-api/init_config.rst:1719 +msgid "" +"If non-zero, calculation of path configuration is allowed to log warnings " +"into ``stderr``. If equals to ``0``, suppress these warnings." +msgstr "如为非零值,则允许计算路径配置以将警告记录到 ``stderr`` 中。如果等于 ``0``,则抑制这些警告。" + +#: ../../c-api/init_config.rst:1726 +msgid "Now also applies on Windows." +msgstr "现在也适用于 Windows。" + +#: ../../c-api/init_config.rst:1731 +msgid "" +"The site-specific directory prefix where the platform independent Python " +"files are installed: :data:`sys.prefix`." +msgstr "安装不依赖于平台的 Python 文件的站点专属目录前缀::data:`sys.prefix`。" + +#: ../../c-api/init_config.rst:1738 +msgid "See also :c:member:`PyConfig.base_prefix`." +msgstr "另请参阅 :c:member:`PyConfig.base_prefix`。" + +#: ../../c-api/init_config.rst:1742 +msgid "" +"Program name used to initialize :c:member:`~PyConfig.executable` and in " +"early error messages during Python initialization." +msgstr "用于初始化 :c:member:`~PyConfig.executable` 和在 Python 初始化期间早期错误消息中使用的程序名称。" + +#: ../../c-api/init_config.rst:1745 +msgid "On macOS, use :envvar:`PYTHONEXECUTABLE` environment variable if set." +msgstr "在 macOS 上,如果设置了 :envvar:`PYTHONEXECUTABLE` 环境变量则会使用它。" + +#: ../../c-api/init_config.rst:1746 +msgid "" +"If the ``WITH_NEXT_FRAMEWORK`` macro is defined, use " +":envvar:`__PYVENV_LAUNCHER__` environment variable if set." +msgstr "" +"如果定义了 ``WITH_NEXT_FRAMEWORK`` 宏,当设置了 :envvar:`__PYVENV_LAUNCHER__` " +"环境变量时将会使用它。" + +#: ../../c-api/init_config.rst:1748 +msgid "" +"Use ``argv[0]`` of :c:member:`~PyConfig.argv` if available and non-empty." +msgstr "如果 :c:member:`~PyConfig.argv` 的 ``argv[0]`` 可用并且不为空值则会使用它。" + +#: ../../c-api/init_config.rst:1750 +msgid "" +"Otherwise, use ``L\"python\"`` on Windows, or ``L\"python3\"`` on other " +"platforms." +msgstr "否则,在 Windows 上将使用 ``L\"python\"``,在其他平台上将使用 ``L\"python3\"``。" + +#: ../../c-api/init_config.rst:1759 +msgid "" +"Directory where cached ``.pyc`` files are written: " +":data:`sys.pycache_prefix`." +msgstr "缓存 ``.pyc`` 文件被写入到的目录::data:`sys.pycache_prefix`。" + +#: ../../c-api/init_config.rst:1762 +msgid "" +"Set by the :option:`-X pycache_prefix=PATH <-X>` command line option and the" +" :envvar:`PYTHONPYCACHEPREFIX` environment variable. The command-line option" +" takes precedence." +msgstr "" +"通过 :option:`-X pycache_prefix=PATH <-X>` 命令行选项和 " +":envvar:`PYTHONPYCACHEPREFIX` 环境变量设置。命令行选项优先级更高。" + +#: ../../c-api/init_config.rst:1766 +msgid "If ``NULL``, :data:`sys.pycache_prefix` is set to ``None``." +msgstr "如果为 ``NULL``,则 :data:`sys.pycache_prefix` 将被设为 ``None``。" + +#: ../../c-api/init_config.rst:1772 +msgid "" +"Quiet mode. If greater than ``0``, don't display the copyright and version " +"at Python startup in interactive mode." +msgstr "安静模式。如果大于 ``0``,则在交互模式下启动 Python 时不显示版权和版本。" + +#: ../../c-api/init_config.rst:1775 +msgid "Incremented by the :option:`-q` command line option." +msgstr "由 :option:`-q` 命令行选项执行递增。" + +#: ../../c-api/init_config.rst:1781 +msgid "Value of the :option:`-c` command line option." +msgstr ":option:`-c` 命令行选项的值。" + +#: ../../c-api/init_config.rst:1783 ../../c-api/init_config.rst:1804 +msgid "Used by :c:func:`Py_RunMain`." +msgstr "由 :c:func:`Py_RunMain` 使用。" + +#: ../../c-api/init_config.rst:1789 +msgid "" +"Filename passed on the command line: trailing command line argument without " +":option:`-c` or :option:`-m`. It is used by the :c:func:`Py_RunMain` " +"function." +msgstr "" +"通过命令行传入的文件名:不包含 :option:`-c` 或 :option:`-m` 的附加命令行参数。它会被 " +":c:func:`Py_RunMain` 函数使用。" + +#: ../../c-api/init_config.rst:1793 +msgid "" +"For example, it is set to ``script.py`` by the ``python3 script.py arg`` " +"command line." +msgstr "例如,对于命令行 ``python3 script.py arg`` 它将被设为 ``script.py``。" + +#: ../../c-api/init_config.rst:1796 +msgid "See also the :c:member:`PyConfig.skip_source_first_line` option." +msgstr "另请参阅 :c:member:`PyConfig.skip_source_first_line` 选项。" + +#: ../../c-api/init_config.rst:1802 +msgid "Value of the :option:`-m` command line option." +msgstr ":option:`-m` 命令行选项的值。" + +#: ../../c-api/init_config.rst:1810 +msgid "" +"``module`` or ``module:func`` entry point that should be executed before the" +" :mod:`site` module is imported." +msgstr "" + +#: ../../c-api/init_config.rst:1813 +msgid "" +"Set by the :option:`-X presite=module:func <-X>` command-line option and the" +" :envvar:`PYTHON_PRESITE` environment variable. The command-line option " +"takes precedence." +msgstr "" + +#: ../../c-api/init_config.rst:1824 +msgid "" +"Show total reference count at exit (excluding :term:`immortal` objects)?" +msgstr "是否要在退出时显示总引用计数 (不包括 :term:`immortal` 对象)?" + +#: ../../c-api/init_config.rst:1826 +msgid "Set to ``1`` by :option:`-X showrefcount <-X>` command line option." +msgstr "通过 :option:`-X showrefcount <-X>` 命令行选项设置为 ``1``。" + +#: ../../c-api/init_config.rst:1828 +msgid "" +"Needs a :ref:`debug build of Python ` (the ``Py_REF_DEBUG`` " +"macro must be defined)." +msgstr "需要 :ref:`Python 调试编译版 ` (必须已定义 ``Py_REF_DEBUG`` 宏)。" + +#: ../../c-api/init_config.rst:1835 +msgid "Import the :mod:`site` module at startup?" +msgstr "在启动时导入 :mod:`site` 模块?" + +#: ../../c-api/init_config.rst:1837 +msgid "" +"If equal to zero, disable the import of the module site and the site-" +"dependent manipulations of :data:`sys.path` that it entails." +msgstr "如果等于零,则禁用模块站点的导入以及由此产生的与站点相关的 :data:`sys.path` 操作。" + +#: ../../c-api/init_config.rst:1840 +msgid "" +"Also disable these manipulations if the :mod:`site` module is explicitly " +"imported later (call :func:`site.main` if you want them to be triggered)." +msgstr "" +"如果以后显式地导入 :mod:`site` 模块也要禁用这些操作(如果你希望触发这些操作,请调用 :func:`site.main` 函数)。" + +#: ../../c-api/init_config.rst:1843 +msgid "Set to ``0`` by the :option:`-S` command line option." +msgstr "通过 :option:`-S` 命令行选项设置为 ``0``。" + +#: ../../c-api/init_config.rst:1845 +msgid "" +":data:`sys.flags.no_site ` is set to the inverted value of " +":c:member:`~PyConfig.site_import`." +msgstr "" +":data:`sys.flags.no_site ` 会被设为 :c:member:`~PyConfig.site_import`" +" 取反后的值。" + +#: ../../c-api/init_config.rst:1852 +msgid "" +"If non-zero, skip the first line of the :c:member:`PyConfig.run_filename` " +"source." +msgstr "如为非零值,则跳过 :c:member:`PyConfig.run_filename` 源的第一行。" + +#: ../../c-api/init_config.rst:1855 +msgid "" +"It allows the usage of non-Unix forms of ``#!cmd``. This is intended for a " +"DOS specific hack only." +msgstr "它将允许使用非 Unix 形式的 ``#!cmd``。这是一个针对 DOS 专属的技巧。" + +#: ../../c-api/init_config.rst:1858 +msgid "Set to ``1`` by the :option:`-x` command line option." +msgstr "通过 :option:`-x` 命令行选项设置为 ``1``。" + +#: ../../c-api/init_config.rst:1865 +msgid "" +"Encoding and encoding errors of :data:`sys.stdin`, :data:`sys.stdout` and " +":data:`sys.stderr` (but :data:`sys.stderr` always uses " +"``\"backslashreplace\"`` error handler)." +msgstr "" +":data:`sys.stdin`、:data:`sys.stdout` 和 :data:`sys.stderr` 的编码格式和编码格式错误(但 " +":data:`sys.stderr` 将始终使用 ``\"backslashreplace\"`` 错误处理器)。" + +#: ../../c-api/init_config.rst:1869 +msgid "" +"Use the :envvar:`PYTHONIOENCODING` environment variable if it is non-empty." +msgstr "如果 :envvar:`PYTHONIOENCODING` 环境变量非空则会使用它。" + +#: ../../c-api/init_config.rst:1872 +msgid "Default encoding:" +msgstr "默认编码格式:" + +#: ../../c-api/init_config.rst:1874 +msgid "``\"UTF-8\"`` if :c:member:`PyPreConfig.utf8_mode` is non-zero." +msgstr "如果 :c:member:`PyPreConfig.utf8_mode` 为非零值则使用 ``\"UTF-8\"``。" + +#: ../../c-api/init_config.rst:1875 +msgid "Otherwise, use the :term:`locale encoding`." +msgstr "在其他情况下,使用 :term:`locale encoding`。" + +#: ../../c-api/init_config.rst:1877 +msgid "Default error handler:" +msgstr "默认错误处理器:" + +#: ../../c-api/init_config.rst:1879 +msgid "On Windows: use ``\"surrogateescape\"``." +msgstr "在 Windows 上:使用 ``\"surrogateescape\"``。" + +#: ../../c-api/init_config.rst:1880 +msgid "" +"``\"surrogateescape\"`` if :c:member:`PyPreConfig.utf8_mode` is non-zero, or" +" if the LC_CTYPE locale is \"C\" or \"POSIX\"." +msgstr "" +"如果 :c:member:`PyPreConfig.utf8_mode` 为非零值,或者如果 LC_CTYPE 语言区域为 \"C\" 或 " +"\"POSIX\" 则使用 ``\"surrogateescape\"``。" + +#: ../../c-api/init_config.rst:1882 +msgid "``\"strict\"`` otherwise." +msgstr "在其他情况下则使用 ``\"strict\"``。" + +#: ../../c-api/init_config.rst:1884 +msgid "See also :c:member:`PyConfig.legacy_windows_stdio`." +msgstr "另请参阅 :c:member:`PyConfig.legacy_windows_stdio`。" + +#: ../../c-api/init_config.rst:1888 +msgid "Enable tracemalloc?" +msgstr "启用 tracemalloc?" + +#: ../../c-api/init_config.rst:1890 +msgid "If non-zero, call :func:`tracemalloc.start` at startup." +msgstr "如果为非零值,则在启动时调用 :func:`tracemalloc.start`。" + +#: ../../c-api/init_config.rst:1892 +msgid "" +"Set by :option:`-X tracemalloc=N <-X>` command line option and by the " +":envvar:`PYTHONTRACEMALLOC` environment variable." +msgstr "" +"通过 :option:`-X tracemalloc=N <-X>` 命令行选项和 :envvar:`PYTHONTRACEMALLOC` " +"环境变量设置。" + +#: ../../c-api/init_config.rst:1899 +msgid "Enable the Linux ``perf`` profiler support?" +msgstr "是否启用 Linux ``perf`` 性能分析器支持?" + +#: ../../c-api/init_config.rst:1901 +msgid "If equals to ``1``, enable support for the Linux ``perf`` profiler." +msgstr "如果等于 ``1``,则启用对 Linux ``perf`` 性能分析器的支持。" + +#: ../../c-api/init_config.rst:1903 +msgid "" +"If equals to ``2``, enable support for the Linux ``perf`` profiler with " +"DWARF JIT support." +msgstr "如果等于 ``2``,则启用对带有 DWARF JIT 支持的 Linux ``perf`` 性能分析器的支持。" + +#: ../../c-api/init_config.rst:1906 +msgid "" +"Set to ``1`` by :option:`-X perf <-X>` command-line option and the " +":envvar:`PYTHONPERFSUPPORT` environment variable." +msgstr "" +"通过 :option:`-X perf <-X>` 命令行选项和 :envvar:`PYTHONPERFSUPPORT` 环境变量设置为 ``1``。" + +#: ../../c-api/init_config.rst:1909 +msgid "" +"Set to ``2`` by the :option:`-X perf_jit <-X>` command-line option and the " +":envvar:`PYTHON_PERF_JIT_SUPPORT` environment variable." +msgstr "" +"通过 :option:`-X perf_jit <-X>` 命令行选项和 :envvar:`PYTHON_PERF_JIT_SUPPORT` " +"环境变量设置为 ``2``。" + +#: ../../c-api/init_config.rst:1915 +msgid "See :ref:`perf_profiling` for more information." +msgstr "请参阅 :ref:`perf_profiling` 了解详情。" + +#: ../../c-api/init_config.rst:1921 +msgid "Directory of the Python standard library." +msgstr "Python 标准库的目录。" + +#: ../../c-api/init_config.rst:1929 +msgid "Use :ref:`environment variables `?" +msgstr "使用 :ref:`环境变量 `?" + +#: ../../c-api/init_config.rst:1931 +msgid "" +"If equals to zero, ignore the :ref:`environment variables `." +msgstr "如果等于零,则忽略 :ref:`环境变量 `。" + +#: ../../c-api/init_config.rst:1934 +msgid "Set to ``0`` by the :option:`-E` environment variable." +msgstr "由 :option:`-E` 环境变量设置为 ``0``。" + +#: ../../c-api/init_config.rst:1940 +msgid "" +"If non-zero, ``stdout`` and ``stderr`` will be redirected to the system log." +msgstr "如为非零值,则 ``stdout`` 和 ``stderr`` 将被重定向到系统日志。" + +#: ../../c-api/init_config.rst:1943 +msgid "Only available on macOS 10.12 and later, and on iOS." +msgstr "仅在 macOS 10.12 和更新版本,以及 iOS 上可用。" + +#: ../../c-api/init_config.rst:1945 +msgid "" +"Default: ``0`` (don't use the system log) on macOS; ``1`` on iOS (use the " +"system log)." +msgstr "默认值:在 macOS 上为 ``0`` (不使用系统日志); 在 iOS 上为 ``1`` (使用系统日志)。" + +#: ../../c-api/init_config.rst:1952 +msgid "If non-zero, add the user site directory to :data:`sys.path`." +msgstr "如果为非零值,则将用户站点目录添加到 :data:`sys.path`。" + +#: ../../c-api/init_config.rst:1954 +msgid "" +"Set to ``0`` by the :option:`-s` and :option:`-I` command line options." +msgstr "通过 :option:`-s` 和 :option:`-I` 命令行选项设置为 ``0``。" + +#: ../../c-api/init_config.rst:1956 +msgid "Set to ``0`` by the :envvar:`PYTHONNOUSERSITE` environment variable." +msgstr "由 :envvar:`PYTHONNOUSERSITE` 环境变量设置为 ``0``。" + +#: ../../c-api/init_config.rst:1962 +msgid "" +"Verbose mode. If greater than ``0``, print a message each time a module is " +"imported, showing the place (filename or built-in module) from which it is " +"loaded." +msgstr "详细模式。如果大于 ``0``,则每次导入模块时都会打印一条消息,显示加载模块的位置(文件名或内置模块)。" + +#: ../../c-api/init_config.rst:1966 +msgid "" +"If greater than or equal to ``2``, print a message for each file that is " +"checked for when searching for a module. Also provides information on module" +" cleanup at exit." +msgstr "如果大于等于 ``2``,则为搜索模块时每个被检查的文件打印一条消息。还在退出时提供关于模块清理的信息。" + +#: ../../c-api/init_config.rst:1970 +msgid "Incremented by the :option:`-v` command line option." +msgstr "由 :option:`-v` 命令行选项执行递增。" + +#: ../../c-api/init_config.rst:1972 +msgid "Set by the :envvar:`PYTHONVERBOSE` environment variable value." +msgstr "通过 :envvar:`PYTHONVERBOSE` 环境变量值设置。" + +#: ../../c-api/init_config.rst:1978 +msgid "" +"Options of the :mod:`warnings` module to build warnings filters, lowest to " +"highest priority: :data:`sys.warnoptions`." +msgstr ":mod:`warnings` 模块用于构建警告过滤器的选项,优先级从低到高::data:`sys.warnoptions`。" + +#: ../../c-api/init_config.rst:1981 +msgid "" +"The :mod:`warnings` module adds :data:`sys.warnoptions` in the reverse " +"order: the last :c:member:`PyConfig.warnoptions` item becomes the first item" +" of :data:`warnings.filters` which is checked first (highest priority)." +msgstr "" +":mod:`warnings` 模块以相反的顺序添加 :data:`sys.warnoptions`: 最后一个 " +":c:member:`PyConfig.warnoptions` 条目将成为 :data:`warnings.filters` " +"的第一个条目并将最先被检查(最高优先级)。" + +#: ../../c-api/init_config.rst:1986 +msgid "" +"The :option:`-W` command line options adds its value to " +":c:member:`~PyConfig.warnoptions`, it can be used multiple times." +msgstr "" +":option:`-W` 命令行选项会将其值添加到 :c:member:`~PyConfig.warnoptions` 中,它可以被多次使用。" + +#: ../../c-api/init_config.rst:1989 +msgid "" +"The :envvar:`PYTHONWARNINGS` environment variable can also be used to add " +"warning options. Multiple options can be specified, separated by commas " +"(``,``)." +msgstr ":envvar:`PYTHONWARNINGS` 环境变量也可被用于添加警告选项。可以指定多个选项,并以逗号 (``,``) 分隔。" + +#: ../../c-api/init_config.rst:1997 +msgid "" +"If equal to ``0``, Python won't try to write ``.pyc`` files on the import of" +" source modules." +msgstr "如果等于 ``0``,Python 将不会尝试在导入源模块时写入 ``.pyc`` 文件。" + +#: ../../c-api/init_config.rst:2000 +msgid "" +"Set to ``0`` by the :option:`-B` command line option and the " +":envvar:`PYTHONDONTWRITEBYTECODE` environment variable." +msgstr "" +"通过 :option:`-B` 命令行选项和 :envvar:`PYTHONDONTWRITEBYTECODE` 环境变量设置为 ``0``。" + +#: ../../c-api/init_config.rst:2003 +msgid "" +":data:`sys.dont_write_bytecode` is initialized to the inverted value of " +":c:member:`~PyConfig.write_bytecode`." +msgstr "" +":data:`sys.dont_write_bytecode` 会被初始化为 :c:member:`~PyConfig.write_bytecode` " +"取反后的值。" + +#: ../../c-api/init_config.rst:2010 +msgid "" +"Values of the :option:`-X` command line options: :data:`sys._xoptions`." +msgstr ":option:`-X` 命令行选项的值::data:`sys._xoptions`。" + +#: ../../c-api/init_config.rst:2016 +msgid "If non-zero, write performance statistics at Python exit." +msgstr "如为非零值,则在 Python 退出时写入性能统计数据。" + +#: ../../c-api/init_config.rst:2018 +msgid "" +"Need a special build with the ``Py_STATS`` macro: see :option:`--enable-" +"pystats`." +msgstr "需要带有 ``Py_STATS`` 宏的特殊构建版:参见 :option:`--enable-pystats`。" + +#: ../../c-api/init_config.rst:2023 +msgid "" +"If :c:member:`~PyConfig.parse_argv` is non-zero, :c:member:`~PyConfig.argv` " +"arguments are parsed the same way the regular Python parses :ref:`command " +"line arguments `, and Python arguments are stripped from " +":c:member:`~PyConfig.argv`." +msgstr "" +"如果 :c:member:`~PyConfig.parse_argv` 为非零值,则 :c:member:`~PyConfig.argv` " +"参数将以与常规 Python 解析 :ref:`命令行参数 ` 相同的方式被解析,并从 " +":c:member:`~PyConfig.argv` 中剥离 Python 参数。" + +#: ../../c-api/init_config.rst:2028 +msgid "" +"The :c:member:`~PyConfig.xoptions` options are parsed to set other options: " +"see the :option:`-X` command line option." +msgstr ":c:member:`~PyConfig.xoptions` 选项将会被解析以设置其他选项:参见 :option:`-X` 命令行选项。" + +#: ../../c-api/init_config.rst:2033 +msgid "The ``show_alloc_count`` field has been removed." +msgstr "``show_alloc_count`` 字段已被移除。" + +#: ../../c-api/init_config.rst:2039 +msgid "Initialization with PyConfig" +msgstr "使用 PyConfig 初始化" + +#: ../../c-api/init_config.rst:2041 +msgid "" +"Initializing the interpreter from a populated configuration struct is " +"handled by calling :c:func:`Py_InitializeFromConfig`." +msgstr "基于一个已填充内容的配置结构体初始化解释器是通过调用 :c:func:`Py_InitializeFromConfig` 来处理的。" + +#: ../../c-api/init_config.rst:2047 +msgid "" +"If :c:func:`PyImport_FrozenModules`, :c:func:`PyImport_AppendInittab` or " +":c:func:`PyImport_ExtendInittab` are used, they must be set or called after " +"Python preinitialization and before the Python initialization. If Python is " +"initialized multiple times, :c:func:`PyImport_AppendInittab` or " +":c:func:`PyImport_ExtendInittab` must be called before each Python " +"initialization." +msgstr "" +"如果使用了 :c:func:`PyImport_FrozenModules`、:c:func:`PyImport_AppendInittab` 或 " +":c:func:`PyImport_ExtendInittab`,则必须在 Python 预初始化之后、Python 初始化之前设置或调用它们。如果 " +"Python 被多次初始化,则必须在每次初始化 Python 之前调用 :c:func:`PyImport_AppendInittab` 或 " +":c:func:`PyImport_ExtendInittab` 函数。" + +#: ../../c-api/init_config.rst:2054 +msgid "" +"The current configuration (``PyConfig`` type) is stored in " +"``PyInterpreterState.config``." +msgstr "当前的配置 (``PyConfig`` 类型) 保存在 ``PyInterpreterState.config`` 中。" + +#: ../../c-api/init_config.rst:2057 +msgid "Example setting the program name::" +msgstr "设置程序名称的示例::" + +#: ../../c-api/init_config.rst:2059 +msgid "" +"void init_python(void)\n" +"{\n" +" PyStatus status;\n" +"\n" +" PyConfig config;\n" +" PyConfig_InitPythonConfig(&config);\n" +"\n" +" /* Set the program name. Implicitly preinitialize Python. */\n" +" status = PyConfig_SetString(&config, &config.program_name,\n" +" L\"/path/to/my_program\");\n" +" if (PyStatus_Exception(status)) {\n" +" goto exception;\n" +" }\n" +"\n" +" status = Py_InitializeFromConfig(&config);\n" +" if (PyStatus_Exception(status)) {\n" +" goto exception;\n" +" }\n" +" PyConfig_Clear(&config);\n" +" return;\n" +"\n" +"exception:\n" +" PyConfig_Clear(&config);\n" +" Py_ExitStatusException(status);\n" +"}" +msgstr "" +"void init_python(void)\n" +"{\n" +" PyStatus status;\n" +"\n" +" PyConfig config;\n" +" PyConfig_InitPythonConfig(&config);\n" +"\n" +" /* 设置程序名称。隐式地预初始化 Python。*/\n" +" status = PyConfig_SetString(&config, &config.program_name,\n" +" L\"/path/to/my_program\");\n" +" if (PyStatus_Exception(status)) {\n" +" goto exception;\n" +" }\n" +"\n" +" status = Py_InitializeFromConfig(&config);\n" +" if (PyStatus_Exception(status)) {\n" +" goto exception;\n" +" }\n" +" PyConfig_Clear(&config);\n" +" return;\n" +"\n" +"exception:\n" +" PyConfig_Clear(&config);\n" +" Py_ExitStatusException(status);\n" +"}" + +#: ../../c-api/init_config.rst:2085 +msgid "" +"More complete example modifying the default configuration, read the " +"configuration, and then override some parameters. Note that since 3.11, many" +" parameters are not calculated until initialization, and so values cannot be" +" read from the configuration structure. Any values set before initialize is " +"called will be left unchanged by initialization::" +msgstr "" +"更完整的示例会修改默认配置,读取配置,然后覆盖某些参数。请注意自 3.11 " +"版开始,许多参数在初始化之前不会被计算,因此无法从配置结构体中读取值。在调用初始化之前设置的任何值都将不会被初始化操作改变::" + +#: ../../c-api/init_config.rst:2092 +msgid "" +"PyStatus init_python(const char *program_name)\n" +"{\n" +" PyStatus status;\n" +"\n" +" PyConfig config;\n" +" PyConfig_InitPythonConfig(&config);\n" +"\n" +" /* Set the program name before reading the configuration\n" +" (decode byte string from the locale encoding).\n" +"\n" +" Implicitly preinitialize Python. */\n" +" status = PyConfig_SetBytesString(&config, &config.program_name,\n" +" program_name);\n" +" if (PyStatus_Exception(status)) {\n" +" goto done;\n" +" }\n" +"\n" +" /* Read all configuration at once */\n" +" status = PyConfig_Read(&config);\n" +" if (PyStatus_Exception(status)) {\n" +" goto done;\n" +" }\n" +"\n" +" /* Specify sys.path explicitly */\n" +" /* If you want to modify the default set of paths, finish\n" +" initialization first and then use PySys_GetAttrString(\"path\") */\n" +" config.module_search_paths_set = 1;\n" +" status = PyWideStringList_Append(&config.module_search_paths,\n" +" L\"/path/to/stdlib\");\n" +" if (PyStatus_Exception(status)) {\n" +" goto done;\n" +" }\n" +" status = PyWideStringList_Append(&config.module_search_paths,\n" +" L\"/path/to/more/modules\");\n" +" if (PyStatus_Exception(status)) {\n" +" goto done;\n" +" }\n" +"\n" +" /* Override executable computed by PyConfig_Read() */\n" +" status = PyConfig_SetString(&config, &config.executable,\n" +" L\"/path/to/my_executable\");\n" +" if (PyStatus_Exception(status)) {\n" +" goto done;\n" +" }\n" +"\n" +" status = Py_InitializeFromConfig(&config);\n" +"\n" +"done:\n" +" PyConfig_Clear(&config);\n" +" return status;\n" +"}" +msgstr "" + +#: ../../c-api/init_config.rst:2148 +msgid "Isolated Configuration" +msgstr "隔离配置" + +#: ../../c-api/init_config.rst:2150 +msgid "" +":c:func:`PyPreConfig_InitIsolatedConfig` and " +":c:func:`PyConfig_InitIsolatedConfig` functions create a configuration to " +"isolate Python from the system. For example, to embed Python into an " +"application." +msgstr "" +":c:func:`PyPreConfig_InitIsolatedConfig` 和 " +":c:func:`PyConfig_InitIsolatedConfig` 函数会创建一个配置来将 Python 与系统隔离开来。例如,将 Python" +" 嵌入到某个应用程序。" + +#: ../../c-api/init_config.rst:2155 +msgid "" +"This configuration ignores global configuration variables, environment " +"variables, command line arguments (:c:member:`PyConfig.argv` is not parsed) " +"and user site directory. The C standard streams (ex: ``stdout``) and the " +"LC_CTYPE locale are left unchanged. Signal handlers are not installed." +msgstr "" +"该配置将忽略全局配置变量、环境变量、命令行参数 (:c:member:`PyConfig.argv` 将不会被解析) 和用户站点目录。C 标准流 (例如" +" ``stdout``) 和 LC_CTYPE 语言区域将保持不变。信号处理器将不会被安装。" + +#: ../../c-api/init_config.rst:2160 +msgid "" +"Configuration files are still used with this configuration to determine " +"paths that are unspecified. Ensure :c:member:`PyConfig.home` is specified to" +" avoid computing the default path configuration." +msgstr "该配置仍然会使用配置文件来确定未被指明的路径。请确保指定了 :c:member:`PyConfig.home` 以避免计算默认的路径配置。" + +#: ../../c-api/init_config.rst:2168 +msgid "Python Configuration" +msgstr "Python 配置" + +#: ../../c-api/init_config.rst:2170 +msgid "" +":c:func:`PyPreConfig_InitPythonConfig` and " +":c:func:`PyConfig_InitPythonConfig` functions create a configuration to " +"build a customized Python which behaves as the regular Python." +msgstr "" +":c:func:`PyPreConfig_InitPythonConfig` 和 :c:func:`PyConfig_InitPythonConfig`" +" 函数会创建一个配置来构建一个行为与常规 Python 相同的自定义 Python。" + +#: ../../c-api/init_config.rst:2174 +msgid "" +"Environments variables and command line arguments are used to configure " +"Python, whereas global configuration variables are ignored." +msgstr "环境变量和命令行参数将被用于配置 Python,而全局配置变量将被忽略。" + +#: ../../c-api/init_config.rst:2177 +msgid "" +"This function enables C locale coercion (:pep:`538`) and :ref:`Python UTF-8 " +"Mode ` (:pep:`540`) depending on the LC_CTYPE locale, " +":envvar:`PYTHONUTF8` and :envvar:`PYTHONCOERCECLOCALE` environment " +"variables." +msgstr "" +"此函数将根据 LC_CTYPE 语言区域、:envvar:`PYTHONUTF8` 和 :envvar:`PYTHONCOERCECLOCALE` " +"环境变量启用 C 语言区域强制转换 (:pep:`538`) 和 :ref:`Python UTF-8 模式 ` " +"(:pep:`540`) 功能。" + +#: ../../c-api/init_config.rst:2186 +msgid "Python Path Configuration" +msgstr "Python 路径配置" + +#: ../../c-api/init_config.rst:2188 +msgid "" +":c:type:`PyConfig` contains multiple fields for the path configuration:" +msgstr ":c:type:`PyConfig` 包含多个用于路径配置的字段:" + +#: ../../c-api/init_config.rst:2190 +msgid "Path configuration inputs:" +msgstr "路径配置输入:" + +#: ../../c-api/init_config.rst:2192 +msgid ":c:member:`PyConfig.home`" +msgstr ":c:member:`PyConfig.home`" + +#: ../../c-api/init_config.rst:2193 +msgid ":c:member:`PyConfig.platlibdir`" +msgstr ":c:member:`PyConfig.platlibdir`" + +#: ../../c-api/init_config.rst:2194 +msgid ":c:member:`PyConfig.pathconfig_warnings`" +msgstr ":c:member:`PyConfig.pathconfig_warnings`" + +#: ../../c-api/init_config.rst:2195 +msgid ":c:member:`PyConfig.program_name`" +msgstr ":c:member:`PyConfig.program_name`" + +#: ../../c-api/init_config.rst:2196 +msgid ":c:member:`PyConfig.pythonpath_env`" +msgstr ":c:member:`PyConfig.pythonpath_env`" + +#: ../../c-api/init_config.rst:2197 +msgid "current working directory: to get absolute paths" +msgstr "当前工作目录:用于获取绝对路径" + +#: ../../c-api/init_config.rst:2198 +msgid "" +"``PATH`` environment variable to get the program full path (from " +":c:member:`PyConfig.program_name`)" +msgstr "``PATH`` 环境变量用于获取程序的完整路径 (来自 :c:member:`PyConfig.program_name`)" + +#: ../../c-api/init_config.rst:2200 +msgid "``__PYVENV_LAUNCHER__`` environment variable" +msgstr "``__PYVENV_LAUNCHER__`` 环境变量" + +#: ../../c-api/init_config.rst:2201 +msgid "" +"(Windows only) Application paths in the registry under " +"\"Software\\Python\\PythonCore\\X.Y\\PythonPath\" of HKEY_CURRENT_USER and " +"HKEY_LOCAL_MACHINE (where X.Y is the Python version)." +msgstr "" +"(仅限 Windows)注册表 HKEY_CURRENT_USER 和 HKEY_LOCAL_MACHINE 的 " +"\"Software\\Python\\PythonCore\\X.Y\\PythonPath\" 项下的应用程序目录(其中 X.Y 为 Python " +"版本)。" + +#: ../../c-api/init_config.rst:2205 +msgid "Path configuration output fields:" +msgstr "路径配置输出字段:" + +#: ../../c-api/init_config.rst:2207 +msgid ":c:member:`PyConfig.base_exec_prefix`" +msgstr ":c:member:`PyConfig.base_exec_prefix`" + +#: ../../c-api/init_config.rst:2208 +msgid ":c:member:`PyConfig.base_executable`" +msgstr ":c:member:`PyConfig.base_executable`" + +#: ../../c-api/init_config.rst:2209 +msgid ":c:member:`PyConfig.base_prefix`" +msgstr ":c:member:`PyConfig.base_prefix`" + +#: ../../c-api/init_config.rst:2210 +msgid ":c:member:`PyConfig.exec_prefix`" +msgstr ":c:member:`PyConfig.exec_prefix`" + +#: ../../c-api/init_config.rst:2211 +msgid ":c:member:`PyConfig.executable`" +msgstr ":c:member:`PyConfig.executable`" + +#: ../../c-api/init_config.rst:2212 +msgid "" +":c:member:`PyConfig.module_search_paths_set`, " +":c:member:`PyConfig.module_search_paths`" +msgstr "" +":c:member:`PyConfig.module_search_paths_set`, " +":c:member:`PyConfig.module_search_paths`" + +#: ../../c-api/init_config.rst:2214 +msgid ":c:member:`PyConfig.prefix`" +msgstr ":c:member:`PyConfig.prefix`" + +#: ../../c-api/init_config.rst:2216 +msgid "" +"If at least one \"output field\" is not set, Python calculates the path " +"configuration to fill unset fields. If " +":c:member:`~PyConfig.module_search_paths_set` is equal to ``0``, " +":c:member:`~PyConfig.module_search_paths` is overridden and " +":c:member:`~PyConfig.module_search_paths_set` is set to ``1``." +msgstr "" +"如果至少有一个“输出字段”未被设置,Python 就会计算路径配置来填充未设置的字段。如果 " +":c:member:`~PyConfig.module_search_paths_set` 等于 ``0``,则 " +":c:member:`~PyConfig.module_search_paths` 将被覆盖并且 " +":c:member:`~PyConfig.module_search_paths_set` 将被设置为 ``1``。" + +#: ../../c-api/init_config.rst:2222 +msgid "" +"It is possible to completely ignore the function calculating the default " +"path configuration by setting explicitly all path configuration output " +"fields listed above. A string is considered as set even if it is non-empty. " +"``module_search_paths`` is considered as set if ``module_search_paths_set`` " +"is set to ``1``. In this case, ``module_search_paths`` will be used without " +"modification." +msgstr "" +"通过显式地设置上述所有路径配置输出字段可以完全忽略计算默认路径配置的函数。即使字符串不为空也会被视为已设置。如果 " +"``module_search_paths_set`` 被设为 ``1`` 则 ``module_search_paths`` " +"会被视为已设置。在这种情况下,``module_search_paths`` 将不加修改地被使用。" + +#: ../../c-api/init_config.rst:2229 +msgid "" +"Set :c:member:`~PyConfig.pathconfig_warnings` to ``0`` to suppress warnings " +"when calculating the path configuration (Unix only, Windows does not log any" +" warning)." +msgstr "" +"将 :c:member:`~PyConfig.pathconfig_warnings` 设为 ``0`` 以便在计算路径配置时抑制警告(仅限 " +"Unix,Windows 不会记录任何警告)。" + +#: ../../c-api/init_config.rst:2232 +msgid "" +"If :c:member:`~PyConfig.base_prefix` or " +":c:member:`~PyConfig.base_exec_prefix` fields are not set, they inherit " +"their value from :c:member:`~PyConfig.prefix` and " +":c:member:`~PyConfig.exec_prefix` respectively." +msgstr "" +"如果 :c:member:`~PyConfig.base_prefix` 或 " +":c:member:`~PyConfig.base_exec_prefix` 字段未设置,它们将分别从 " +":c:member:`~PyConfig.prefix` 和 :c:member:`~PyConfig.exec_prefix` 继承其值。" + +#: ../../c-api/init_config.rst:2236 +msgid ":c:func:`Py_RunMain` and :c:func:`Py_Main` modify :data:`sys.path`:" +msgstr ":c:func:`Py_RunMain` 和 :c:func:`Py_Main` 将修改 :data:`sys.path`:" + +#: ../../c-api/init_config.rst:2238 +msgid "" +"If :c:member:`~PyConfig.run_filename` is set and is a directory which " +"contains a ``__main__.py`` script, prepend " +":c:member:`~PyConfig.run_filename` to :data:`sys.path`." +msgstr "" +"如果 :c:member:`~PyConfig.run_filename` 已设置并且是一个包含 ``__main__.py`` 脚本的目录,则会将 " +":c:member:`~PyConfig.run_filename` 添加到 :data:`sys.path` 的开头。" + +#: ../../c-api/init_config.rst:2241 +msgid "If :c:member:`~PyConfig.isolated` is zero:" +msgstr "如果 :c:member:`~PyConfig.isolated` 为零:" + +#: ../../c-api/init_config.rst:2243 +msgid "" +"If :c:member:`~PyConfig.run_module` is set, prepend the current directory to" +" :data:`sys.path`. Do nothing if the current directory cannot be read." +msgstr "" +"如果设置了 :c:member:`~PyConfig.run_module`,则将当前目录添加到 :data:`sys.path` " +"的开头。如果无法读取当前目录则不执行任何操作。" + +#: ../../c-api/init_config.rst:2245 +msgid "" +"If :c:member:`~PyConfig.run_filename` is set, prepend the directory of the " +"filename to :data:`sys.path`." +msgstr "" +"如果设置了 :c:member:`~PyConfig.run_filename`,则将文件名的目录添加到 :data:`sys.path` 的开头。" + +#: ../../c-api/init_config.rst:2247 +msgid "Otherwise, prepend an empty string to :data:`sys.path`." +msgstr "在其他情况下,则将一个空字符串添加到 :data:`sys.path` 的开头。" + +#: ../../c-api/init_config.rst:2249 +msgid "" +"If :c:member:`~PyConfig.site_import` is non-zero, :data:`sys.path` can be " +"modified by the :mod:`site` module. If " +":c:member:`~PyConfig.user_site_directory` is non-zero and the user's site-" +"package directory exists, the :mod:`site` module appends the user's site-" +"package directory to :data:`sys.path`." +msgstr "" +"如果 :c:member:`~PyConfig.site_import` 为非零值,则 :data:`sys.path` 可通过 :mod:`site`" +" 模块修改。如果 :c:member:`~PyConfig.user_site_directory` 为非零值且用户的 site-package " +"目录存在,则 :mod:`site` 模块会将用户的 site-package 目录附加到 :data:`sys.path`。" + +#: ../../c-api/init_config.rst:2255 +msgid "The following configuration files are used by the path configuration:" +msgstr "路径配置会使用以下配置文件:" + +#: ../../c-api/init_config.rst:2257 +msgid "``pyvenv.cfg``" +msgstr "``pyvenv.cfg``" + +#: ../../c-api/init_config.rst:2258 +msgid "``._pth`` file (ex: ``python._pth``)" +msgstr "``._pth`` 文件 (例如: ``python._pth``)" + +#: ../../c-api/init_config.rst:2259 +msgid "``pybuilddir.txt`` (Unix only)" +msgstr "``pybuilddir.txt`` (仅 Unix)" + +#: ../../c-api/init_config.rst:2261 +msgid "If a ``._pth`` file is present:" +msgstr "如果存在 ``._pth`` 文件:" + +#: ../../c-api/init_config.rst:2263 +msgid "Set :c:member:`~PyConfig.isolated` to ``1``." +msgstr "将 :c:member:`~PyConfig.isolated` 设为 ``1``。" + +#: ../../c-api/init_config.rst:2264 +msgid "Set :c:member:`~PyConfig.use_environment` to ``0``." +msgstr "将 :c:member:`~PyConfig.use_environment` 设为 ``0``。" + +#: ../../c-api/init_config.rst:2265 +msgid "Set :c:member:`~PyConfig.site_import` to ``0``." +msgstr "将 :c:member:`~PyConfig.site_import` 设为 ``0``。" + +#: ../../c-api/init_config.rst:2266 +msgid "Set :c:member:`~PyConfig.user_site_directory` to ``0`` (since 3.15)." +msgstr "" + +#: ../../c-api/init_config.rst:2267 +msgid "Set :c:member:`~PyConfig.safe_path` to ``1``." +msgstr "将 :c:member:`~PyConfig.safe_path` 设为 ``1``。" + +#: ../../c-api/init_config.rst:2269 +msgid "" +"If :c:member:`~PyConfig.home` is not set and a ``pyvenv.cfg`` file is " +"present in the same directory as :c:member:`~PyConfig.executable`, or its " +"parent, :c:member:`~PyConfig.prefix` and :c:member:`~PyConfig.exec_prefix` " +"are set that location. When this happens, :c:member:`~PyConfig.base_prefix` " +"and :c:member:`~PyConfig.base_exec_prefix` still keep their value, pointing " +"to the base installation. See :ref:`sys-path-init-virtual-environments` for " +"more information." +msgstr "" +"如果未设置 :c:member:`~PyConfig.home` 并且 :c:member:`~PyConfig.executable` " +"的目录或其父目录下存在 ``pyvenv.cfg`` 文件,则 :c:member:`~PyConfig.prefix` 和 " +":c:member:`~PyConfig.exec_prefix` 将被设为该目录,:c:member:`~PyConfig.base_prefix` " +"和 :c:member:`~PyConfig.base_exec_prefix` 仍会保持其原值,即指向基础安装目录。请参阅 :ref:`sys-" +"path-init-virtual-environments` 了解详情。" + +#: ../../c-api/init_config.rst:2277 +msgid "" +"The ``__PYVENV_LAUNCHER__`` environment variable is used to set " +":c:member:`PyConfig.base_executable`." +msgstr "" +"使用 ``__PYVENV_LAUNCHER__`` 环境变量来设置 :c:member:`PyConfig.base_executable`。" + +#: ../../c-api/init_config.rst:2282 +msgid "" +":c:member:`~PyConfig.prefix`, and :c:member:`~PyConfig.exec_prefix`, are now" +" set to the ``pyvenv.cfg`` directory. This was previously done by " +":mod:`site`, therefore affected by :option:`-S`." +msgstr "" +"现在 :c:member:`~PyConfig.prefix` 和 :c:member:`~PyConfig.exec_prefix` 会被设为 " +"``pyvenv.cfg`` 目录。在之前版本中这是由 :mod:`site` 完成的,因而会受 :option:`-S` 影响。" + +#: ../../c-api/init_config.rst:2289 +msgid "" +":c:member:`~PyConfig.user_site_directory` is now set to ``0`` when a " +"``._pth`` file is present." +msgstr "" + +#: ../../c-api/init_config.rst:2294 +msgid "Py_GetArgcArgv()" +msgstr "Py_GetArgcArgv()" + +#: ../../c-api/init_config.rst:2298 +msgid "Get the original command line arguments, before Python modified them." +msgstr "在 Python 修改原始命令行参数之前,获取这些参数。" + +#: ../../c-api/init_config.rst:2300 +msgid "See also :c:member:`PyConfig.orig_argv` member." +msgstr "另请参阅 :c:member:`PyConfig.orig_argv` 成员。" + +#: ../../c-api/init_config.rst:2304 +msgid "Multi-Phase Initialization Private Provisional API" +msgstr "多阶段初始化私有暂定 API" + +#: ../../c-api/init_config.rst:2306 +msgid "" +"This section is a private provisional API introducing multi-phase " +"initialization, the core feature of :pep:`432`:" +msgstr "本节介绍的私有暂定 API 引入了多阶段初始化,它是 :pep:`432` 的核心特性:" + +#: ../../c-api/init_config.rst:2309 +msgid "\"Core\" initialization phase, \"bare minimum Python\":" +msgstr "“核心”初始化阶段,“最小化的基本 Python”:" + +#: ../../c-api/init_config.rst:2311 +msgid "Builtin types;" +msgstr "内置类型;" + +#: ../../c-api/init_config.rst:2312 +msgid "Builtin exceptions;" +msgstr "内置异常;" + +#: ../../c-api/init_config.rst:2313 +msgid "Builtin and frozen modules;" +msgstr "内置和已冻结模块;" + +#: ../../c-api/init_config.rst:2314 +msgid "" +"The :mod:`sys` module is only partially initialized (ex: :data:`sys.path` " +"doesn't exist yet)." +msgstr ":mod:`sys` 模块仅部分初始化(例如: :data:`sys.path` 尚不存在)。" + +#: ../../c-api/init_config.rst:2317 +msgid "\"Main\" initialization phase, Python is fully initialized:" +msgstr "\"主要\"初始化阶段,Python 被完全初始化:" + +#: ../../c-api/init_config.rst:2319 +msgid "Install and configure :mod:`importlib`;" +msgstr "安装并配置 :mod:`importlib`;" + +#: ../../c-api/init_config.rst:2320 +msgid "Apply the :ref:`Path Configuration `;" +msgstr "应用 :ref:`路径配置 `;" + +#: ../../c-api/init_config.rst:2321 +msgid "Install signal handlers;" +msgstr "安装信号处理器;" + +#: ../../c-api/init_config.rst:2322 +msgid "" +"Finish :mod:`sys` module initialization (ex: create :data:`sys.stdout` and " +":data:`sys.path`);" +msgstr "完成 :mod:`sys` 模块初始化 (例如:创建 :data:`sys.stdout` 和 :data:`sys.path`);" + +#: ../../c-api/init_config.rst:2324 +msgid "" +"Enable optional features like :mod:`faulthandler` and :mod:`tracemalloc`;" +msgstr "启用 :mod:`faulthandler` 和 :mod:`tracemalloc` 等可选功能;" + +#: ../../c-api/init_config.rst:2325 +msgid "Import the :mod:`site` module;" +msgstr "导入 :mod:`site` 模块;" + +#: ../../c-api/init_config.rst:2326 +msgid "etc." +msgstr "等等." + +#: ../../c-api/init_config.rst:2328 +msgid "Private provisional API:" +msgstr "私有临时API:" + +#: ../../c-api/init_config.rst:2332 +msgid "" +"If set to ``0``, :c:func:`Py_InitializeFromConfig` stops at the \"Core\" " +"initialization phase." +msgstr "" + +#: ../../c-api/init_config.rst:2337 +msgid "" +"Move to the \"Main\" initialization phase, finish the Python initialization." +msgstr "进入“主要”初始化阶段,完成 Python 初始化。" + +#: ../../c-api/init_config.rst:2339 +msgid "" +"No module is imported during the \"Core\" phase and the ``importlib`` module" +" is not configured: the :ref:`Path Configuration ` is only" +" applied during the \"Main\" phase. It may allow to customize Python in " +"Python to override or tune the :ref:`Path Configuration `," +" maybe install a custom :data:`sys.meta_path` importer or an import hook, " +"etc." +msgstr "" +"在“核心”阶段不会导入任何模块,也不会配置 ``importlib`` 模块: :ref:`路径配置 ` " +"只会在“主要”阶段期间应用。 这可能允许在 Python 中定制 Python 以覆盖或微调 :ref:`路径配置 `,也可能会安装自定义的 :data:`sys.meta_path` 导入器或导入钩子等等。" + +#: ../../c-api/init_config.rst:2345 +msgid "" +"It may become possible to calculate the :ref:`Path Configuration ` in Python, after the Core phase and before the Main phase, which is" +" one of the :pep:`432` motivation." +msgstr "" +"在核心阶段之后主要阶段之前,将有可能在 Python 中计算 :ref:`路径配置 `,这是 :pep:`432` " +"的动机之一。" + +#: ../../c-api/init_config.rst:2349 +msgid "" +"The \"Core\" phase is not properly defined: what should be and what should " +"not be available at this phase is not specified yet. The API is marked as " +"private and provisional: the API can be modified or even be removed anytime " +"until a proper public API is designed." +msgstr "" +"“核心”阶段并没有完整的定义:在这一阶段什么应该可用什么不应该可用都尚未被指明。 该 API 被标记为私有和暂定的:也就是说该 API " +"可以随时被修改甚至被移除直到设计出适用的公共 API。" + +#: ../../c-api/init_config.rst:2354 +msgid "" +"Example running Python code between \"Core\" and \"Main\" initialization " +"phases::" +msgstr "在“核心”和“主要”初始化阶段之间运行 Python 代码的示例::" + +#: ../../c-api/init_config.rst:2357 +msgid "" +"void init_python(void)\n" +"{\n" +" PyStatus status;\n" +"\n" +" PyConfig config;\n" +" PyConfig_InitPythonConfig(&config);\n" +" config._init_main = 0;\n" +"\n" +" /* ... customize 'config' configuration ... */\n" +"\n" +" status = Py_InitializeFromConfig(&config);\n" +" PyConfig_Clear(&config);\n" +" if (PyStatus_Exception(status)) {\n" +" Py_ExitStatusException(status);\n" +" }\n" +"\n" +" /* Use sys.stderr because sys.stdout is only created\n" +" by _Py_InitializeMain() */\n" +" int res = PyRun_SimpleString(\n" +" \"import sys; \"\n" +" \"print('Run Python code before _Py_InitializeMain', \"\n" +" \"file=sys.stderr)\");\n" +" if (res < 0) {\n" +" exit(1);\n" +" }\n" +"\n" +" /* ... put more configuration code here ... */\n" +"\n" +" status = _Py_InitializeMain();\n" +" if (PyStatus_Exception(status)) {\n" +" Py_ExitStatusException(status);\n" +" }\n" +"}" +msgstr "" +"void init_python(void)\n" +"{\n" +" PyStatus status;\n" +"\n" +" PyConfig config;\n" +" PyConfig_InitPythonConfig(&config);\n" +" config._init_main = 0;\n" +"\n" +" /* ... 自定义 'config' 配置 ... */\n" +"\n" +" status = Py_InitializeFromConfig(&config);\n" +" PyConfig_Clear(&config);\n" +" if (PyStatus_Exception(status)) {\n" +" Py_ExitStatusException(status);\n" +" }\n" +"\n" +" /* 使用 sys.stderr 因为 sys.stdout 只能由 _Py_InitializeMain() 创建 */\n" +" int res = PyRun_SimpleString(\n" +" \"import sys; \"\n" +" \"print('Run Python code before _Py_InitializeMain', \"\n" +" \"file=sys.stderr)\");\n" +" if (res < 0) {\n" +" exit(1);\n" +" }\n" +"\n" +" /* ... 这里添加更多配置代码 ... */\n" +"\n" +" status = _Py_InitializeMain();\n" +" if (PyStatus_Exception(status)) {\n" +" Py_ExitStatusException(status);\n" +" }\n" +"}" + +#: ../../c-api/init_config.rst:1179 +msgid "main()" +msgstr "main()" + +#: ../../c-api/init_config.rst:1179 +msgid "argv (in module sys)" +msgstr "argv (在 sys 模块中)" diff --git a/c-api/interp-lifecycle.po b/c-api/interp-lifecycle.po new file mode 100644 index 0000000000..c2aa7b3881 --- /dev/null +++ b/c-api/interp-lifecycle.po @@ -0,0 +1,1481 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/interp-lifecycle.rst:6 +msgid "Interpreter initialization and finalization" +msgstr "解释器初始化和最终化" + +#: ../../c-api/interp-lifecycle.rst:8 +msgid "" +"See :ref:`Python Initialization Configuration ` for details on " +"how to configure the interpreter prior to initialization." +msgstr "请参阅 :ref:`Python 初始化配置 ` 了解如何在初始化之前配置解释器的详情。" + +#: ../../c-api/interp-lifecycle.rst:14 +msgid "Before Python initialization" +msgstr "" + +#: ../../c-api/interp-lifecycle.rst:16 +msgid "" +"In an application embedding Python, the :c:func:`Py_Initialize` function " +"must be called before using any other Python/C API functions; with the " +"exception of a few functions and the :ref:`global configuration variables " +"`." +msgstr "" + +#: ../../c-api/interp-lifecycle.rst:21 +msgid "" +"The following functions can be safely called before Python is initialized:" +msgstr "在初始化 Python 之前,可以安全地调用以下函数:" + +#: ../../c-api/interp-lifecycle.rst:23 +msgid "Functions that initialize the interpreter:" +msgstr "初始化解释器的函数:" + +#: ../../c-api/interp-lifecycle.rst:25 +msgid ":c:func:`Py_Initialize`" +msgstr ":c:func:`Py_Initialize`" + +#: ../../c-api/interp-lifecycle.rst:26 +msgid ":c:func:`Py_InitializeEx`" +msgstr ":c:func:`Py_InitializeEx`" + +#: ../../c-api/interp-lifecycle.rst:27 +msgid ":c:func:`Py_InitializeFromConfig`" +msgstr ":c:func:`Py_InitializeFromConfig`" + +#: ../../c-api/interp-lifecycle.rst:28 +msgid ":c:func:`Py_BytesMain`" +msgstr ":c:func:`Py_BytesMain`" + +#: ../../c-api/interp-lifecycle.rst:29 +msgid ":c:func:`Py_Main`" +msgstr ":c:func:`Py_Main`" + +#: ../../c-api/interp-lifecycle.rst:30 +msgid "the runtime pre-initialization functions covered in :ref:`init-config`" +msgstr "运行时预初始化相关函数在 :ref:`init-config` 中介绍" + +#: ../../c-api/interp-lifecycle.rst:32 +msgid "Configuration functions:" +msgstr "配置函数:" + +#: ../../c-api/interp-lifecycle.rst:34 +msgid ":c:func:`PyImport_AppendInittab`" +msgstr ":c:func:`PyImport_AppendInittab`" + +#: ../../c-api/interp-lifecycle.rst:35 +msgid ":c:func:`PyImport_ExtendInittab`" +msgstr ":c:func:`PyImport_ExtendInittab`" + +#: ../../c-api/interp-lifecycle.rst:36 +msgid ":c:func:`!PyInitFrozenExtensions`" +msgstr ":c:func:`!PyInitFrozenExtensions`" + +#: ../../c-api/interp-lifecycle.rst:37 +msgid ":c:func:`PyMem_SetAllocator`" +msgstr ":c:func:`PyMem_SetAllocator`" + +#: ../../c-api/interp-lifecycle.rst:38 +msgid ":c:func:`PyMem_SetupDebugHooks`" +msgstr ":c:func:`PyMem_SetupDebugHooks`" + +#: ../../c-api/interp-lifecycle.rst:39 +msgid ":c:func:`PyObject_SetArenaAllocator`" +msgstr ":c:func:`PyObject_SetArenaAllocator`" + +#: ../../c-api/interp-lifecycle.rst:40 +msgid ":c:func:`Py_SetProgramName`" +msgstr ":c:func:`Py_SetProgramName`" + +#: ../../c-api/interp-lifecycle.rst:41 +msgid ":c:func:`Py_SetPythonHome`" +msgstr ":c:func:`Py_SetPythonHome`" + +#: ../../c-api/interp-lifecycle.rst:42 +msgid "the configuration functions covered in :ref:`init-config`" +msgstr "配置相关函数在 :ref:`init-config` 中介绍" + +#: ../../c-api/interp-lifecycle.rst:44 +msgid "Informative functions:" +msgstr "信息函数:" + +#: ../../c-api/interp-lifecycle.rst:46 ../../c-api/interp-lifecycle.rst:54 +msgid ":c:func:`Py_IsInitialized`" +msgstr ":c:func:`Py_IsInitialized`" + +#: ../../c-api/interp-lifecycle.rst:47 +msgid ":c:func:`PyMem_GetAllocator`" +msgstr ":c:func:`PyMem_GetAllocator`" + +#: ../../c-api/interp-lifecycle.rst:48 +msgid ":c:func:`PyObject_GetArenaAllocator`" +msgstr ":c:func:`PyObject_GetArenaAllocator`" + +#: ../../c-api/interp-lifecycle.rst:49 +msgid ":c:func:`Py_GetBuildInfo`" +msgstr ":c:func:`Py_GetBuildInfo`" + +#: ../../c-api/interp-lifecycle.rst:50 +msgid ":c:func:`Py_GetCompiler`" +msgstr ":c:func:`Py_GetCompiler`" + +#: ../../c-api/interp-lifecycle.rst:51 +msgid ":c:func:`Py_GetCopyright`" +msgstr ":c:func:`Py_GetCopyright`" + +#: ../../c-api/interp-lifecycle.rst:52 +msgid ":c:func:`Py_GetPlatform`" +msgstr ":c:func:`Py_GetPlatform`" + +#: ../../c-api/interp-lifecycle.rst:53 +msgid ":c:func:`Py_GetVersion`" +msgstr ":c:func:`Py_GetVersion`" + +#: ../../c-api/interp-lifecycle.rst:56 +msgid "Utilities:" +msgstr "工具:" + +#: ../../c-api/interp-lifecycle.rst:58 +msgid ":c:func:`Py_DecodeLocale`" +msgstr ":c:func:`Py_DecodeLocale`" + +#: ../../c-api/interp-lifecycle.rst:59 +msgid "" +"the status reporting and utility functions covered in :ref:`init-config`" +msgstr "状态报告和工具相关函数在 :ref:`init-config` 中介绍" + +#: ../../c-api/interp-lifecycle.rst:61 +msgid "Memory allocators:" +msgstr "内存分配器:" + +#: ../../c-api/interp-lifecycle.rst:63 +msgid ":c:func:`PyMem_RawMalloc`" +msgstr ":c:func:`PyMem_RawMalloc`" + +#: ../../c-api/interp-lifecycle.rst:64 +msgid ":c:func:`PyMem_RawRealloc`" +msgstr ":c:func:`PyMem_RawRealloc`" + +#: ../../c-api/interp-lifecycle.rst:65 +msgid ":c:func:`PyMem_RawCalloc`" +msgstr ":c:func:`PyMem_RawCalloc`" + +#: ../../c-api/interp-lifecycle.rst:66 +msgid ":c:func:`PyMem_RawFree`" +msgstr ":c:func:`PyMem_RawFree`" + +#: ../../c-api/interp-lifecycle.rst:68 +msgid "Synchronization:" +msgstr "同步:" + +#: ../../c-api/interp-lifecycle.rst:70 +msgid ":c:func:`PyMutex_Lock`" +msgstr ":c:func:`PyMutex_Lock`" + +#: ../../c-api/interp-lifecycle.rst:71 +msgid ":c:func:`PyMutex_Unlock`" +msgstr ":c:func:`PyMutex_Unlock`" + +#: ../../c-api/interp-lifecycle.rst:75 +msgid "" +"Despite their apparent similarity to some of the functions listed above, the" +" following functions **should not be called** before the interpreter has " +"been initialized: :c:func:`Py_EncodeLocale`, :c:func:`PyEval_InitThreads`, " +"and :c:func:`Py_RunMain`." +msgstr "" + +#: ../../c-api/interp-lifecycle.rst:84 +msgid "Global configuration variables" +msgstr "全局配置变量" + +#: ../../c-api/interp-lifecycle.rst:86 +msgid "" +"Python has variables for the global configuration to control different " +"features and options. By default, these flags are controlled by " +":ref:`command line options `." +msgstr "" +"Python 有负责控制全局配置中不同特性和选项的变量。这些标志默认被 :ref:`命令行选项 ` 控制。" + +#: ../../c-api/interp-lifecycle.rst:90 +msgid "" +"When a flag is set by an option, the value of the flag is the number of " +"times that the option was set. For example, ``-b`` sets " +":c:data:`Py_BytesWarningFlag` to 1 and ``-bb`` sets " +":c:data:`Py_BytesWarningFlag` to 2." +msgstr "" +"当一个选项设置一个旗标时,该旗标的值将是设置选项的次数。例如,``-b`` 会将 :c:data:`Py_BytesWarningFlag` 设为 1 " +"而 ``-bb`` 会将 :c:data:`Py_BytesWarningFlag` 设为 2。" + +#: ../../c-api/interp-lifecycle.rst:97 +msgid "" +"This API is kept for backward compatibility: setting " +":c:member:`PyConfig.bytes_warning` should be used instead, see :ref:`Python " +"Initialization Configuration `." +msgstr "" +"此 API 仅为向下兼容而保留:应当改为设置 :c:member:`PyConfig.bytes_warning`,参见 :ref:`Python " +"初始化配置 `。" + +#: ../../c-api/interp-lifecycle.rst:101 +msgid "" +"Issue a warning when comparing :class:`bytes` or :class:`bytearray` with " +":class:`str` or :class:`bytes` with :class:`int`. Issue an error if greater" +" or equal to ``2``." +msgstr "" +"当将 :class:`bytes` 或 :class:`bytearray` 与 :class:`str` 比较或者将 :class:`bytes` 与" +" :class:`int` 比较时发出警告。如果大于等于 ``2`` 则报错。" + +#: ../../c-api/interp-lifecycle.rst:105 +msgid "Set by the :option:`-b` option." +msgstr "由 :option:`-b` 选项设置。" + +#: ../../c-api/interp-lifecycle.rst:112 +msgid "" +"This API is kept for backward compatibility: setting " +":c:member:`PyConfig.parser_debug` should be used instead, see :ref:`Python " +"Initialization Configuration `." +msgstr "" +"此 API 仅为向下兼容而保留:应当改为设置 :c:member:`PyConfig.parser_debug`,参见 :ref:`Python " +"初始化配置 `。" + +#: ../../c-api/interp-lifecycle.rst:116 +msgid "" +"Turn on parser debugging output (for expert only, depending on compilation " +"options)." +msgstr "开启解析器调试输出(限专家使用,依赖于编译选项)。" + +#: ../../c-api/interp-lifecycle.rst:119 +msgid "" +"Set by the :option:`-d` option and the :envvar:`PYTHONDEBUG` environment " +"variable." +msgstr "由 :option:`-d` 选项和 :envvar:`PYTHONDEBUG` 环境变量设置。" + +#: ../../c-api/interp-lifecycle.rst:127 +msgid "" +"This API is kept for backward compatibility: setting " +":c:member:`PyConfig.write_bytecode` should be used instead, see :ref:`Python" +" Initialization Configuration `." +msgstr "" +"此 API 仅为向下兼容而保留:应当改为设置 :c:member:`PyConfig.write_bytecode`,参见 :ref:`Python " +"初始化配置 `。" + +#: ../../c-api/interp-lifecycle.rst:131 +msgid "" +"If set to non-zero, Python won't try to write ``.pyc`` files on the import " +"of source modules." +msgstr "如果设置为非零,Python 不会在导入源代码时尝试写入 ``.pyc`` 文件。" + +#: ../../c-api/interp-lifecycle.rst:134 +msgid "" +"Set by the :option:`-B` option and the :envvar:`PYTHONDONTWRITEBYTECODE` " +"environment variable." +msgstr "由 :option:`-B` 选项和 :envvar:`PYTHONDONTWRITEBYTECODE` 环境变量设置。" + +#: ../../c-api/interp-lifecycle.rst:142 +msgid "" +"This API is kept for backward compatibility: setting " +":c:member:`PyConfig.pathconfig_warnings` should be used instead, see " +":ref:`Python Initialization Configuration `." +msgstr "" +"此 API 仅为向下兼容而保留:应当改为设置 :c:member:`PyConfig.pathconfig_warnings`,参见 " +":ref:`Python 初始化配置 `。" + +#: ../../c-api/interp-lifecycle.rst:146 +msgid "Private flag used by ``_freeze_module`` and ``frozenmain`` programs." +msgstr "由 ``_freeze_module`` 和 ``frozenmain`` 程序使用的私有旗标。" + +#: ../../c-api/interp-lifecycle.rst:153 +msgid "" +"This API is kept for backward compatibility: setting " +":c:member:`PyConfig.hash_seed` and :c:member:`PyConfig.use_hash_seed` should" +" be used instead, see :ref:`Python Initialization Configuration `." +msgstr "" +"此 API 仅为向下兼容而保留:应当改为设置 :c:member:`PyConfig.hash_seed` 和 " +":c:member:`PyConfig.use_hash_seed`,参见 :ref:`Python 初始化配置 `。" + +#: ../../c-api/interp-lifecycle.rst:158 +msgid "" +"Set to ``1`` if the :envvar:`PYTHONHASHSEED` environment variable is set to " +"a non-empty string." +msgstr "如果 :envvar:`PYTHONHASHSEED` 环境变量被设为非空字符串则设为 ``1``。" + +#: ../../c-api/interp-lifecycle.rst:161 +msgid "" +"If the flag is non-zero, read the :envvar:`PYTHONHASHSEED` environment " +"variable to initialize the secret hash seed." +msgstr "如果该旗标为非零值,则读取 :envvar:`PYTHONHASHSEED` 环境变量来初始化加密哈希种子。" + +#: ../../c-api/interp-lifecycle.rst:169 +msgid "" +"This API is kept for backward compatibility: setting " +":c:member:`PyConfig.use_environment` should be used instead, see " +":ref:`Python Initialization Configuration `." +msgstr "" +"此 API 仅为向下兼容而保留:应当改为设置 :c:member:`PyConfig.use_environment`,参见 :ref:`Python " +"初始化配置 `。" + +#: ../../c-api/interp-lifecycle.rst:173 +msgid "" +"Ignore all :envvar:`!PYTHON*` environment variables, e.g. " +":envvar:`PYTHONPATH` and :envvar:`PYTHONHOME`, that might be set." +msgstr "" +"忽略所有 :envvar:`!PYTHON*` 环境变量,例如可能设置的 :envvar:`PYTHONPATH` 和 " +":envvar:`PYTHONHOME` 环境变量。" + +#: ../../c-api/interp-lifecycle.rst:176 +msgid "Set by the :option:`-E` and :option:`-I` options." +msgstr "由 :option:`-E` 和 :option:`-I` 选项设置。" + +#: ../../c-api/interp-lifecycle.rst:183 +msgid "" +"This API is kept for backward compatibility: setting " +":c:member:`PyConfig.inspect` should be used instead, see :ref:`Python " +"Initialization Configuration `." +msgstr "" +"此 API 被保留用于向下兼容:应当改为采用设置 :c:member:`PyConfig.inspect`,参见 :ref:`Python 初始化配置 " +"` 文档。" + +#: ../../c-api/interp-lifecycle.rst:187 +msgid "" +"When a script is passed as first argument or the :option:`-c` option is " +"used, enter interactive mode after executing the script or the command, even" +" when :data:`sys.stdin` does not appear to be a terminal." +msgstr "" +"当将脚本作为第一个参数传入或是使用了 :option:`-c` 选项时,则会在执行该脚本或命令后进入交互模式,即使在 :data:`sys.stdin`" +" 并非一个终端时也是如此。" + +#: ../../c-api/interp-lifecycle.rst:191 +msgid "" +"Set by the :option:`-i` option and the :envvar:`PYTHONINSPECT` environment " +"variable." +msgstr "由 :option:`-i` 选项和 :envvar:`PYTHONINSPECT` 环境变量设置。" + +#: ../../c-api/interp-lifecycle.rst:199 +msgid "" +"This API is kept for backward compatibility: setting " +":c:member:`PyConfig.interactive` should be used instead, see :ref:`Python " +"Initialization Configuration `." +msgstr "" +"此 API 被保留用于向下兼容:应当改为采用设置 :c:member:`PyConfig.interactive`,参见 :ref:`Python " +"初始化配置 `。" + +#: ../../c-api/interp-lifecycle.rst:203 +msgid "Set by the :option:`-i` option." +msgstr "由 :option:`-i` 选项设置。" + +#: ../../c-api/interp-lifecycle.rst:210 +msgid "" +"This API is kept for backward compatibility: setting " +":c:member:`PyConfig.isolated` should be used instead, see :ref:`Python " +"Initialization Configuration `." +msgstr "" +"此 API 被保留用于向下兼容:应当改为设置 :c:member:`PyConfig.isolated`,参见 :ref:`Python 初始化配置 " +"` 文档。" + +#: ../../c-api/interp-lifecycle.rst:214 +msgid "" +"Run Python in isolated mode. In isolated mode :data:`sys.path` contains " +"neither the script's directory nor the user's site-packages directory." +msgstr "" +"以隔离模式运行 Python。在隔离模式下 :data:`sys.path` 将不包含脚本的目录或用户的 site-packages 目录。" + +#: ../../c-api/interp-lifecycle.rst:217 +msgid "Set by the :option:`-I` option." +msgstr "由 :option:`-I` 选项设置。" + +#: ../../c-api/interp-lifecycle.rst:226 +msgid "" +"This API is kept for backward compatibility: setting " +":c:member:`PyPreConfig.legacy_windows_fs_encoding` should be used instead, " +"see :ref:`Python Initialization Configuration `." +msgstr "" +"此 API 被保留用于向下兼容:应当改为设置 :c:member:`PyPreConfig.legacy_windows_fs_encoding`,参见" +" :ref:`Python 初始化配置 `。" + +#: ../../c-api/interp-lifecycle.rst:230 +msgid "" +"If the flag is non-zero, use the ``mbcs`` encoding with ``replace`` error " +"handler, instead of the UTF-8 encoding with ``surrogatepass`` error handler," +" for the :term:`filesystem encoding and error handler`." +msgstr "" +"如果该旗标为非零值,则使用 ``mbcs`` 编码和 ``replace`` 错误处理器,而不是 UTF-8 编码和 ``surrogatepass``" +" 错误处理器作为 :term:`filesystem encoding and error handler`。" + +#: ../../c-api/interp-lifecycle.rst:234 +msgid "" +"Set to ``1`` if the :envvar:`PYTHONLEGACYWINDOWSFSENCODING` environment " +"variable is set to a non-empty string." +msgstr "如果 :envvar:`PYTHONLEGACYWINDOWSFSENCODING` 环境变量被设为非空字符串则设为 ``1``。" + +#: ../../c-api/interp-lifecycle.rst:237 +msgid "See :pep:`529` for more details." +msgstr "更多详情请参阅 :pep:`529`。" + +#: ../../c-api/interp-lifecycle.rst:239 ../../c-api/interp-lifecycle.rst:258 +msgid "Availability" +msgstr "适用范围" + +#: ../../c-api/interp-lifecycle.rst:246 +msgid "" +"This API is kept for backward compatibility: setting " +":c:member:`PyConfig.legacy_windows_stdio` should be used instead, see " +":ref:`Python Initialization Configuration `." +msgstr "" +"此 API 被保留用于向下兼容:应当改为设置 :c:member:`PyConfig.legacy_windows_stdio`,参见 " +":ref:`Python 初始化配置 `。" + +#: ../../c-api/interp-lifecycle.rst:250 +msgid "" +"If the flag is non-zero, use :class:`io.FileIO` instead of " +":class:`!io._WindowsConsoleIO` for :mod:`sys` standard streams." +msgstr "" +"如果该旗标为非零值,则会使用 :class:`io.FileIO` 而不是 :class:`!io._WindowsConsoleIO` 作为 " +":mod:`sys` 标准流。" + +#: ../../c-api/interp-lifecycle.rst:253 +msgid "" +"Set to ``1`` if the :envvar:`PYTHONLEGACYWINDOWSSTDIO` environment variable " +"is set to a non-empty string." +msgstr "如果 :envvar:`PYTHONLEGACYWINDOWSSTDIO` 环境变量被设为非空字符串则设为 ``1``。" + +#: ../../c-api/interp-lifecycle.rst:256 +msgid "See :pep:`528` for more details." +msgstr "有关更多详细信息,请参阅 :pep:`528`。" + +#: ../../c-api/interp-lifecycle.rst:265 +msgid "" +"This API is kept for backward compatibility: setting " +":c:member:`PyConfig.site_import` should be used instead, see :ref:`Python " +"Initialization Configuration `." +msgstr "" +"此 API 被保留用于向下兼容:应当改为设置 :c:member:`PyConfig.site_import`,参见 :ref:`Python " +"初始化配置 `。" + +#: ../../c-api/interp-lifecycle.rst:269 +msgid "" +"Disable the import of the module :mod:`site` and the site-dependent " +"manipulations of :data:`sys.path` that it entails. Also disable these " +"manipulations if :mod:`site` is explicitly imported later (call " +":func:`site.main` if you want them to be triggered)." +msgstr "" +"禁用 :mod:`site` 的导入及其所附带的基于站点对 :data:`sys.path` 的操作。如果 :mod:`site` " +"会在稍后被显式地导入也会禁用这些操作 (如果你希望触发它们则应调用 :func:`site.main`)。" + +#: ../../c-api/interp-lifecycle.rst:274 +msgid "Set by the :option:`-S` option." +msgstr "由 :option:`-S` 选项设置。" + +#: ../../c-api/interp-lifecycle.rst:281 +msgid "" +"This API is kept for backward compatibility: setting " +":c:member:`PyConfig.user_site_directory` should be used instead, see " +":ref:`Python Initialization Configuration `." +msgstr "" +"此 API 被保留用于向下兼容:应当改为设置 :c:member:`PyConfig.user_site_directory`,参见 " +":ref:`Python 初始化配置 `。" + +#: ../../c-api/interp-lifecycle.rst:285 +msgid "" +"Don't add the :data:`user site-packages directory ` to " +":data:`sys.path`." +msgstr "" +"不要将 :data:`用户 site-packages 目录 ` 添加到 :data:`sys.path`。" + +#: ../../c-api/interp-lifecycle.rst:288 +msgid "" +"Set by the :option:`-s` and :option:`-I` options, and the " +":envvar:`PYTHONNOUSERSITE` environment variable." +msgstr "由 :option:`-s` 和 :option:`-I` 选项以及 :envvar:`PYTHONNOUSERSITE` 环境变量设置。" + +#: ../../c-api/interp-lifecycle.rst:296 +msgid "" +"This API is kept for backward compatibility: setting " +":c:member:`PyConfig.optimization_level` should be used instead, see " +":ref:`Python Initialization Configuration `." +msgstr "" +"此 API 被保留用于向下兼容:应当改为 :c:member:`PyConfig.optimization_level`,参见 :ref:`Python" +" 初始化配置 `。" + +#: ../../c-api/interp-lifecycle.rst:300 +msgid "" +"Set by the :option:`-O` option and the :envvar:`PYTHONOPTIMIZE` environment " +"variable." +msgstr "由 :option:`-O` 选项和 :envvar:`PYTHONOPTIMIZE` 环境变量设置。" + +#: ../../c-api/interp-lifecycle.rst:308 +msgid "" +"This API is kept for backward compatibility: setting " +":c:member:`PyConfig.quiet` should be used instead, see :ref:`Python " +"Initialization Configuration `." +msgstr "" +"此 API 被保留用于向下兼容:应当改为设置 :c:member:`PyConfig.quiet`,参见 :ref:`Python 初始化配置 " +"` 文档。" + +#: ../../c-api/interp-lifecycle.rst:312 +msgid "" +"Don't display the copyright and version messages even in interactive mode." +msgstr "即使在交互模式下也不显示版权和版本信息。" + +#: ../../c-api/interp-lifecycle.rst:314 +msgid "Set by the :option:`-q` option." +msgstr "由 :option:`-q` 选项设置。" + +#: ../../c-api/interp-lifecycle.rst:323 +msgid "" +"This API is kept for backward compatibility: setting " +":c:member:`PyConfig.buffered_stdio` should be used instead, see :ref:`Python" +" Initialization Configuration `." +msgstr "" +"此 API 被保留用于向下兼容:应当改为设置 :c:member:`PyConfig.buffered_stdio`,参见 :ref:`Python " +"初始化配置 `。" + +#: ../../c-api/interp-lifecycle.rst:327 +msgid "Force the stdout and stderr streams to be unbuffered." +msgstr "强制 stdout 和 stderr 流不带缓冲。" + +#: ../../c-api/interp-lifecycle.rst:329 +msgid "" +"Set by the :option:`-u` option and the :envvar:`PYTHONUNBUFFERED` " +"environment variable." +msgstr "由 :option:`-u` 选项和 :envvar:`PYTHONUNBUFFERED` 环境变量设置。" + +#: ../../c-api/interp-lifecycle.rst:337 +msgid "" +"This API is kept for backward compatibility: setting " +":c:member:`PyConfig.verbose` should be used instead, see :ref:`Python " +"Initialization Configuration `." +msgstr "" +"此 API 被保留用于向下兼容:应当改为设置 :c:member:`PyConfig.verbose`,参见 :ref:`Python 初始化配置 " +"` 文档。" + +#: ../../c-api/interp-lifecycle.rst:341 +msgid "" +"Print a message each time a module is initialized, showing the place " +"(filename or built-in module) from which it is loaded. If greater or equal " +"to ``2``, print a message for each file that is checked for when searching " +"for a module. Also provides information on module cleanup at exit." +msgstr "" +"每次初始化模块时打印一条消息,显示加载模块的位置(文件名或内置模块)。如果大于或等于 ``2``,则为搜索模块时检查的每个文件打印一条消息。 " +"此外还会在退出时提供模块清理信息。" + +#: ../../c-api/interp-lifecycle.rst:346 +msgid "" +"Set by the :option:`-v` option and the :envvar:`PYTHONVERBOSE` environment " +"variable." +msgstr "由 :option:`-v` 选项和 :envvar:`PYTHONVERBOSE` 环境变量设置。" + +#: ../../c-api/interp-lifecycle.rst:353 +msgid "Initializing and finalizing the interpreter" +msgstr "初始化和最终化解释器" + +#: ../../c-api/interp-lifecycle.rst:367 +msgid "" +"Initialize the Python interpreter. In an application embedding Python, this" +" should be called before using any other Python/C API functions; see " +":ref:`Before Python Initialization ` for the few exceptions." +msgstr "" + +#: ../../c-api/interp-lifecycle.rst:371 +msgid "" +"This initializes the table of loaded modules (``sys.modules``), and creates " +"the fundamental modules :mod:`builtins`, :mod:`__main__` and :mod:`sys`. It " +"also initializes the module search path (``sys.path``). It does not set " +"``sys.argv``; use the :ref:`Python Initialization Configuration ` API for that. This is a no-op when called for a second time " +"(without calling :c:func:`Py_FinalizeEx` first). There is no return value; " +"it is a fatal error if the initialization fails." +msgstr "" +"这将初始化已加载的模块表 (``sys.modules``),并创建基础模块 :mod:`builtins`, :mod:`__main__` 和 " +":mod:`sys`。它还会初始化模块搜索路径 (``sys.path``)。它不会设置 ``sys.argv``;对于此设置请使用 " +":ref:`Python 初始化配置 ` API。当第二次被调用时(在未先调用 :c:func:`Py_FinalizeEx`" +" 的情况下)将不会执行任何操作。它没有返回值;如果初始化失败则会发生致命错误。" + +#: ../../c-api/interp-lifecycle.rst:379 ../../c-api/interp-lifecycle.rst:393 +msgid "" +"Use :c:func:`Py_InitializeFromConfig` to customize the :ref:`Python " +"Initialization Configuration `." +msgstr "" +"使用 :c:func:`Py_InitializeFromConfig` 来自定义 :ref:`Python 初始化配置 `。" + +#: ../../c-api/interp-lifecycle.rst:383 +msgid "" +"On Windows, changes the console mode from ``O_TEXT`` to ``O_BINARY``, which " +"will also affect non-Python uses of the console using the C Runtime." +msgstr "" +"在 Windows 上,将控制台模式从 ``O_TEXT`` 改为 ``O_BINARY``,这还将影响使用 C 运行时的非 Python " +"的控制台使用。" + +#: ../../c-api/interp-lifecycle.rst:389 +msgid "" +"This function works like :c:func:`Py_Initialize` if *initsigs* is ``1``. If " +"*initsigs* is ``0``, it skips initialization registration of signal " +"handlers, which may be useful when CPython is embedded as part of a larger " +"application." +msgstr "" +"如果 *initsigs* 为 ``1`` 则此函数的工作方式与 :c:func:`Py_Initialize` 类似。如果 *initsigs* 为 " +"``0``,它将跳过信号处理器的初始化注册,这在将 CPython 作为更大应用程序的一部分嵌入时会很有用处。" + +#: ../../c-api/interp-lifecycle.rst:399 +msgid "" +"Initialize Python from *config* configuration, as described in :ref:`init-" +"from-config`." +msgstr "根据 *config* 配置来初始化 Python,如 :ref:`init-from-config` 中所描述的。" + +#: ../../c-api/interp-lifecycle.rst:402 +msgid "" +"See the :ref:`init-config` section for details on pre-initializing the " +"interpreter, populating the runtime configuration structure, and querying " +"the returned status structure." +msgstr "请参阅 :ref:`init-config` 一节了解有关预初始化解释器,填充运行时配置结构体,以及查询所返回的状态结构体的详情。" + +#: ../../c-api/interp-lifecycle.rst:409 +msgid "" +"Return true (nonzero) when the Python interpreter has been initialized, " +"false (zero) if not. After :c:func:`Py_FinalizeEx` is called, this returns " +"false until :c:func:`Py_Initialize` is called again." +msgstr "" +"如果 Python 解释器已初始化,则返回真值(非零);否则返回假值(零)。在调用 :c:func:`Py_FinalizeEx` " +"之后,此函数将返回假值直到 :c:func:`Py_Initialize` 再次被调用。" + +#: ../../c-api/interp-lifecycle.rst:416 +msgid "" +"Return true (non-zero) if the main Python interpreter is :term:`shutting " +"down `. Return false (zero) otherwise." +msgstr "" +"如果主 Python 解释器 :term:`正在关闭 ` 则返回真(非零)值。在其他情况下返回假(零)值。" + +#: ../../c-api/interp-lifecycle.rst:424 +msgid "" +"Undo all initializations made by :c:func:`Py_Initialize` and subsequent use " +"of Python/C API functions, and destroy all sub-interpreters (see " +":c:func:`Py_NewInterpreter` below) that were created and not yet destroyed " +"since the last call to :c:func:`Py_Initialize`. This is a no-op when called" +" for a second time (without calling :c:func:`Py_Initialize` again first)." +msgstr "" +"撤销由 :c:func:`Py_Initialize` 所执行的所有初始化操作及后续对 Python/C API 函数的使用,并销毁自上次调用 " +":c:func:`Py_Initialize` 以来创建但尚未销毁的所有子解释器(参见下面 :c:func:`Py_NewInterpreter` " +"一节)。 当第二次调用(事先没有再次对 :c:func:`Py_Initialize` 进行调用)时将无任何操作。" + +#: ../../c-api/interp-lifecycle.rst:430 +msgid "" +"Since this is the reverse of :c:func:`Py_Initialize`, it should be called in" +" the same thread with the same interpreter active. That means the main " +"thread and the main interpreter. This should never be called while " +":c:func:`Py_RunMain` is running." +msgstr "" +"由于这是 :c:func:`Py_Initialize` 的逆向操作,因而它应当在激活同一解释器的同一线程中被调用。这意味着主线程和主解释器。当 " +":c:func:`Py_RunMain` 仍然运行时则绝不应调用此函数。" + +#: ../../c-api/interp-lifecycle.rst:435 +msgid "" +"Normally the return value is ``0``. If there were errors during finalization" +" (flushing buffered data), ``-1`` is returned." +msgstr "通常返回值为 ``0``。如果在最终化(刷新缓冲的数据)期间发生错误,则返回 ``-1``。" + +#: ../../c-api/interp-lifecycle.rst:439 +msgid "" +"Note that Python will do a best effort at freeing all memory allocated by " +"the Python interpreter. Therefore, any C-Extension should make sure to " +"correctly clean up all of the previously allocated PyObjects before using " +"them in subsequent calls to :c:func:`Py_Initialize`. Otherwise it could " +"introduce vulnerabilities and incorrect behavior." +msgstr "" +"请注意 Python 会尽最大努力释放 Python 解释器所分配的所有内存。 因此,任何 C 扩展都应当确保在对 " +":c:func:`Py_Initialize` 的后续调用中使用此前分配的所有 PyObjects 之前正确地清理它们。 " +"否则可能导致安全漏洞和不正确的行为。" + +#: ../../c-api/interp-lifecycle.rst:445 +msgid "" +"This function is provided for a number of reasons. An embedding application" +" might want to restart Python without having to restart the application " +"itself. An application that has loaded the Python interpreter from a " +"dynamically loadable library (or DLL) might want to free all memory " +"allocated by Python before unloading the DLL. During a hunt for memory leaks" +" in an application a developer might want to free all memory allocated by " +"Python before exiting from the application." +msgstr "" +"提供此函数的原因有很多。嵌入应用程序可能希望重新启动 Python,而不必重新启动应用程序本身。从动态可加载库(或 DLL)加载 Python " +"解释器的应用程序可能希望在卸载 DLL 之前释放 Python 分配的所有内存。在搜索应用程序内存泄漏的过程中,开发人员可能希望在退出应用程序之前释放 " +"Python 分配的所有内存。" + +#: ../../c-api/interp-lifecycle.rst:453 +msgid "" +"**Bugs and caveats:** The destruction of modules and objects in modules is " +"done in random order; this may cause destructors (:meth:`~object.__del__` " +"methods) to fail when they depend on other objects (even functions) or " +"modules. Dynamically loaded extension modules loaded by Python are not " +"unloaded. Small amounts of memory allocated by the Python interpreter may " +"not be freed (if you find a leak, please report it). Memory tied up in " +"circular references between objects is not freed. Interned strings will all" +" be deallocated regardless of their reference count. Some memory allocated " +"by extension modules may not be freed. Some extensions may not work " +"properly if their initialization routine is called more than once; this can " +"happen if an application calls :c:func:`Py_Initialize` and " +":c:func:`Py_FinalizeEx` more than once. :c:func:`Py_FinalizeEx` must not be" +" called recursively from within itself. Therefore, it must not be called by" +" any code that may be run as part of the interpreter shutdown process, such " +"as :py:mod:`atexit` handlers, object finalizers, or any code that may be run" +" while flushing the stdout and stderr files." +msgstr "" +"**已知问题与注意事项:** \n" +"模块及模块内对象的销毁顺序是随机的,这可能导致析构函数(:meth:`~object.__del__` 方法)在依赖其他对象(甚至函数)或模块时执行失败; \n" +"由 Python 动态加载的扩展模块不会被卸载;\n" +"Python 解释器分配的少量内存可能无法释放(如发现内存泄漏请提交报告);\n" +"对象间循环引用占用的内存不会被释放;\n" +"无论引用计数如何,所有驻留字符串(interned strings)都将被释放;\n" +"扩展模块分配的部分内存可能无法释放; \n" +"某些扩展在初始化例程被多次调用时可能出现异常行为(当应用程序多次调用 :c:func:`Py_Initialize` 和 :c:func:`Py_FinalizeEx` 时会发生这种情况); \n" +":c:func:`Py_FinalizeEx` 不可被自身递归调用,因此任何可能作为解释器关闭流程一部分的代码(如 :py:mod:`atexit` 处理器、对象终结器、或在刷新 stdout/stderr 文件时运行的代码)都不得调用该函数。" + +#: ../../c-api/interp-lifecycle.rst:469 +msgid "" +"Raises an :ref:`auditing event ` " +"``cpython._PySys_ClearAuditHooks`` with no arguments." +msgstr "引发一个不带参数的 :ref:`审计事件 ` ``cpython._PySys_ClearAuditHooks``。" + +#: ../../c-api/interp-lifecycle.rst:476 +msgid "" +"This is a backwards-compatible version of :c:func:`Py_FinalizeEx` that " +"disregards the return value." +msgstr "这是一个不考虑返回值的 :c:func:`Py_FinalizeEx` 的向下兼容版本。" + +#: ../../c-api/interp-lifecycle.rst:482 +msgid "" +"Similar to :c:func:`Py_Main` but *argv* is an array of bytes strings, " +"allowing the calling application to delegate the text decoding step to the " +"CPython runtime." +msgstr "" +"类似于 :c:func:`Py_Main` 但 *argv* 是一个字节串数组,允许调用方应用程序将文本解码步骤委托给 CPython 运行时。" + +#: ../../c-api/interp-lifecycle.rst:491 +msgid "" +"The main program for the standard interpreter, encapsulating a full " +"initialization/finalization cycle, as well as additional behaviour to " +"implement reading configurations settings from the environment and command " +"line, and then executing ``__main__`` in accordance with :ref:`using-on-" +"cmdline`." +msgstr "" +"标准解释器的主程序,封装了完整的初始化/最终化循环,以及一些附加行为以实现从环境和命令行读取配置设置,然后按照 :ref:`using-on-" +"cmdline` 的规则执行 ``__main__``。" + +#: ../../c-api/interp-lifecycle.rst:497 +msgid "" +"This is made available for programs which wish to support the full CPython " +"command line interface, rather than just embedding a Python runtime in a " +"larger application." +msgstr "这适用于希望支持完整 CPython 命令行界面的程序,而不仅是在更大应用程序中嵌入 Python 运行时。" + +#: ../../c-api/interp-lifecycle.rst:501 +msgid "" +"The *argc* and *argv* parameters are similar to those which are passed to a " +"C program's :c:func:`main` function, except that the *argv* entries are " +"first converted to ``wchar_t`` using :c:func:`Py_DecodeLocale`. It is also " +"important to note that the argument list entries may be modified to point to" +" strings other than those passed in (however, the contents of the strings " +"pointed to by the argument list are not modified)." +msgstr "" +"*argc* 和 *argv* 形参与传给 C 程序的 :c:func:`main` 函数的形参类似,不同之处在于 *argv* 的条目会先使用 " +":c:func:`Py_DecodeLocale` 转换为 ``wchar_t``。 " +"还有一个重要的注意事项是参数列表条目可能会被修改为指向并非被传入的字符串(不过,参数列表所指向的字符串内容不会被修改)。" + +#: ../../c-api/interp-lifecycle.rst:508 +msgid "" +"The return value is ``2`` if the argument list does not represent a valid " +"Python command line, and otherwise the same as :c:func:`Py_RunMain`." +msgstr "如果参数列表不是表示一个有效的 Python 命令行则返回值为 ``2``,否则将与 :c:func:`Py_RunMain` 相同。" + +#: ../../c-api/interp-lifecycle.rst:511 +msgid "" +"In terms of the CPython runtime configuration APIs documented in the " +":ref:`runtime configuration ` section (and without accounting " +"for error handling), ``Py_Main`` is approximately equivalent to::" +msgstr "" +"在记录于 :ref:`运行时配置 ` 一节的 CPython 运行时配置 API " +"文档中(不考虑错误处理),``Py_Main`` 大致相当于::" + +#: ../../c-api/interp-lifecycle.rst:515 +msgid "" +"PyConfig config;\n" +"PyConfig_InitPythonConfig(&config);\n" +"PyConfig_SetArgv(&config, argc, argv);\n" +"Py_InitializeFromConfig(&config);\n" +"PyConfig_Clear(&config);\n" +"\n" +"Py_RunMain();" +msgstr "" +"PyConfig config;\n" +"PyConfig_InitPythonConfig(&config);\n" +"PyConfig_SetArgv(&config, argc, argv);\n" +"Py_InitializeFromConfig(&config);\n" +"PyConfig_Clear(&config);\n" +"\n" +"Py_RunMain();" + +#: ../../c-api/interp-lifecycle.rst:523 +msgid "" +"In normal usage, an embedding application will call this function *instead* " +"of calling :c:func:`Py_Initialize`, :c:func:`Py_InitializeEx` or " +":c:func:`Py_InitializeFromConfig` directly, and all settings will be applied" +" as described elsewhere in this documentation. If this function is instead " +"called *after* a preceding runtime initialization API call, then exactly " +"which environmental and command line configuration settings will be updated " +"is version dependent (as it depends on which settings correctly support " +"being modified after they have already been set once when the runtime was " +"first initialized)." +msgstr "" +"在正常使用中,嵌入式应用程序将调用此函数 *而不是* 直接调用 :c:func:`Py_Initialize`, " +":c:func:`Py_InitializeEx` 或 " +":c:func:`Py_InitializeFromConfig`,并且所有设置都将如本文档的其他部分所描述的那样被应用。 " +"如果此函数改在某个先前的运行时初始化 API 调用 *之后* " +"被调用,那么到底那个环境和命令行配置会被更新将取决于具体的版本(因为它要依赖当运行时被初始化时究竟有哪些设置在它们已被设置一次之后是正确地支持被修改的)。" + +#: ../../c-api/interp-lifecycle.rst:536 +msgid "Executes the main module in a fully configured CPython runtime." +msgstr "在完整配置的 CPython 运行时中执行主模块。" + +#: ../../c-api/interp-lifecycle.rst:538 +msgid "" +"Executes the command (:c:member:`PyConfig.run_command`), the script " +"(:c:member:`PyConfig.run_filename`) or the module " +"(:c:member:`PyConfig.run_module`) specified on the command line or in the " +"configuration. If none of these values are set, runs the interactive Python " +"prompt (REPL) using the ``__main__`` module's global namespace." +msgstr "" +"执行在命令行或配置中指定的命令 (:c:member:`PyConfig.run_command`)、脚本 " +"(:c:member:`PyConfig.run_filename`) 或模块 (:c:member:`PyConfig.run_module`)。 " +"如果这些值均未设置,则使用 ``__main__`` 模块的全局命名空间来运行交互式 Python 提示符 (REPL)。" + +#: ../../c-api/interp-lifecycle.rst:544 +msgid "" +"If :c:member:`PyConfig.inspect` is not set (the default), the return value " +"will be ``0`` if the interpreter exits normally (that is, without raising an" +" exception), the exit status of an unhandled :exc:`SystemExit`, or ``1`` for" +" any other unhandled exception." +msgstr "" +"如果 :c:member:`PyConfig.inspect` 未设置(默认),则当解释器正常退出(也就是说未引发异常)时返回值将为 " +"``0``,未处理的 :exc:`SystemExit` 的退出状态,或者对于任何其他未处理异常则为 ``1``。" + +#: ../../c-api/interp-lifecycle.rst:549 +msgid "" +"If :c:member:`PyConfig.inspect` is set (such as when the :option:`-i` option" +" is used), rather than returning when the interpreter exits, execution will " +"instead resume in an interactive Python prompt (REPL) using the ``__main__``" +" module's global namespace. If the interpreter exited with an exception, it " +"is immediately raised in the REPL session. The function return value is then" +" determined by the way the *REPL session* terminates: ``0``, ``1``, or the " +"status of a :exc:`SystemExit`, as specified above." +msgstr "" +"如果 :c:member:`PyConfig.inspect` 已设置(例如当使用了 :option:`-i` " +"选项时),则当解释器退出时执行将不会返回,而是会使用 ``__main__`` 模块的全局命名空间在交互式 Python 提示符 (REPL) 中恢复。" +" 如果解释器附带异常退出,该异常将在 REPL 会话中被立即引发。随后函数的返回值将由 *REPL 会话* 的终结方式来决定:``0``, ``1`` " +"或者 :exc:`SystemExit` 的状态,如上文所指明的。" + +#: ../../c-api/interp-lifecycle.rst:557 +msgid "" +"This function always finalizes the Python interpreter before it returns." +msgstr "此函数总是会在它返回之前最终化 Python 解释器。" + +#: ../../c-api/interp-lifecycle.rst:559 +msgid "" +"See :ref:`Python Configuration ` for an example of a " +"customized Python that always runs in isolated mode using " +":c:func:`Py_RunMain`." +msgstr "" +"请参阅 :ref:`Python 配置 ` 查看一个使用 :c:func:`Py_RunMain` " +"在隔离模式下始终运行定制的 Python 的示例。" + +#: ../../c-api/interp-lifecycle.rst:565 +msgid "" +"Register an :mod:`atexit` callback for the target interpreter *interp*. This" +" is similar to :c:func:`Py_AtExit`, but takes an explicit interpreter and " +"data pointer for the callback." +msgstr "" +"为目标解释器 *interp* 注册一个 :mod:`atexit` 回调。这与 :c:func:`Py_AtExit` " +"类似,但它接受一个显式的解释器和用于回调的数据指针。" + +#: ../../c-api/interp-lifecycle.rst:569 +msgid "There must be an :term:`attached thread state` for *interp*." +msgstr "必须有一个对应 *interp* 的 :term:`attached thread state`。" + +#: ../../c-api/interp-lifecycle.rst:577 +msgid "Cautions regarding runtime finalization" +msgstr "有关运行时最终化的注意事项" + +#: ../../c-api/interp-lifecycle.rst:579 +msgid "" +"In the late stage of :term:`interpreter shutdown`, after attempting to wait " +"for non-daemon threads to exit (though this can be interrupted by " +":class:`KeyboardInterrupt`) and running the :mod:`atexit` functions, the " +"runtime is marked as *finalizing*: :c:func:`Py_IsFinalizing` and " +":func:`sys.is_finalizing` return true. At this point, only the " +"*finalization thread* that initiated finalization (typically the main " +"thread) is allowed to acquire the :term:`GIL`." +msgstr "" +"在 :term:`interpreter shutdown` 的后期阶段,系统会先尝试等待非守护线程退出(此过程可能被 " +":class:`KeyboardInterrupt` 中断),并执行 :mod:`atexit` 注册的函数。此时运行时状态会被标记为 *正在终结*: " +":c:func:`Py_IsFinalizing` 和 :func:`sys.is_finalizing` 均返回真值。 " +"在此状态下,仅允许发起终结流程的 *终结线程* (通常为主线程)获取 :term:`GIL`。" + +#: ../../c-api/interp-lifecycle.rst:587 +msgid "" +"If any thread, other than the finalization thread, attempts to attach a " +":term:`thread state` during finalization, either explicitly or implicitly, " +"the thread enters **a permanently blocked state** where it remains until the" +" program exits. In most cases this is harmless, but this can result in " +"deadlock if a later stage of finalization attempts to acquire a lock owned " +"by the blocked thread, or otherwise waits on the blocked thread." +msgstr "" +"如果非终结线程的其他线程在终结阶段尝试显式或隐式附加 :term:`thread state`,该线程将进入 **永久阻塞状态** " +"——直至程序退出前都无法恢复。 " +"多数情况下这不会造成危害,但如果终结过程的后续阶段试图获取被阻塞线程持有的锁,或以其他方式等待该线程响应,则可能引发死锁。" + +#: ../../c-api/interp-lifecycle.rst:594 +msgid "" +"Gross? Yes. This prevents random crashes and/or unexpectedly skipped C++ " +"finalizations further up the call stack when such threads were forcibly " +"exited here in CPython 3.13 and earlier. The CPython runtime :term:`thread " +"state` C APIs have never had any error reporting or handling expectations at" +" :term:`thread state` attachment time that would've allowed for graceful " +"exit from this situation. Changing that would require new stable C APIs and " +"rewriting the majority of C code in the CPython ecosystem to use those with " +"error handling." +msgstr "" +"粗暴?确实如此。但这样做能避免随机崩溃,以及当这些线程在 CPython 3.13 及更早版本中被强制退出时,调用栈上游可能出现的 C++ " +"资源未释放问题。CPython 运行时的 :term:`thread state` C API 在设计之初就未考虑在 :term:`thread " +"state` 附加阶段提供错误报告或处理机制,因此无法优雅处理这种情况。若要改变现状,就需要新增稳定的 C API,并重写 CPython " +"生态中绝大多数 C 代码来适配这些带错误处理的新 API。" + +#: ../../c-api/interp-lifecycle.rst:604 +msgid "Process-wide parameters" +msgstr "进程级参数" + +#: ../../c-api/interp-lifecycle.rst:613 +msgid "" +"This API is kept for backward compatibility: setting " +":c:member:`PyConfig.program_name` should be used instead, see :ref:`Python " +"Initialization Configuration `." +msgstr "" +"此 API 被保留用于向下兼容:应当改为设置 :c:member:`PyConfig.program_name`,参见 :ref:`Python " +"初始化配置 `。" + +#: ../../c-api/interp-lifecycle.rst:617 +msgid "" +"This function should be called before :c:func:`Py_Initialize` is called for " +"the first time, if it is called at all. It tells the interpreter the value " +"of the ``argv[0]`` argument to the :c:func:`main` function of the program " +"(converted to wide characters). This is used by :c:func:`Py_GetPath` and " +"some other functions below to find the Python run-time libraries relative to" +" the interpreter executable. The default value is ``'python'``. The " +"argument should point to a zero-terminated wide character string in static " +"storage whose contents will not change for the duration of the program's " +"execution. No code in the Python interpreter will change the contents of " +"this storage." +msgstr "" +"如果要调用该函数,应当在首次调用 :c:func:`Py_Initialize` 之前调用它。它将告诉解释器程序的 :c:func:`main` 函数的" +" ``argv[0]`` 参数的值(转换为宽字符)。 :c:func:`Py_GetPath` " +"和下面的某些其他函数会使用它在相对于解释器的位置上查找可执行文件的 Python 运行时库。默认值是 " +"``'python'``。参数应当指向静态存储中的一个以零值结束的宽字符串,其内容在程序执行期间不会发生改变。Python " +"解释器中的任何代码都不会改变该存储的内容。" + +#: ../../c-api/interp-lifecycle.rst:628 ../../c-api/interp-lifecycle.rst:877 +#: ../../c-api/interp-lifecycle.rst:910 ../../c-api/interp-lifecycle.rst:936 +msgid "" +"Use :c:func:`Py_DecodeLocale` to decode a bytes string to get a " +":c:expr:`wchar_t*` string." +msgstr "使用 :c:func:`Py_DecodeLocale` 解码字节串以得到一个 :c:expr:`wchar_t*` 字符串。" + +#: ../../c-api/interp-lifecycle.rst:636 +msgid "" +"Return the program name set with :c:member:`PyConfig.program_name`, or the " +"default. The returned string points into static storage; the caller should " +"not modify its value." +msgstr "" +"返回用 :c:member:`PyConfig.program_name` 设置的程序名称,或默认名称。返回的字符串指向静态存储;调用方不应修改其值。" + +#: ../../c-api/interp-lifecycle.rst:640 ../../c-api/interp-lifecycle.rst:663 +#: ../../c-api/interp-lifecycle.rst:711 ../../c-api/interp-lifecycle.rst:736 +#: ../../c-api/interp-lifecycle.rst:763 ../../c-api/interp-lifecycle.rst:948 +msgid "" +"This function should not be called before :c:func:`Py_Initialize`, otherwise" +" it returns ``NULL``." +msgstr "此函数不应在 :c:func:`Py_Initialize` 之前被调用,否则将返回 ``NULL``。" + +#: ../../c-api/interp-lifecycle.rst:643 ../../c-api/interp-lifecycle.rst:666 +#: ../../c-api/interp-lifecycle.rst:714 ../../c-api/interp-lifecycle.rst:739 +#: ../../c-api/interp-lifecycle.rst:768 ../../c-api/interp-lifecycle.rst:951 +msgid "It now returns ``NULL`` if called before :c:func:`Py_Initialize`." +msgstr "现在如果它在 :c:func:`Py_Initialize` 之前被调用将返回 ``NULL``。" + +#: ../../c-api/interp-lifecycle.rst:646 ../../c-api/interp-lifecycle.rst:742 +msgid "" +"Use :c:func:`PyConfig_Get(\"executable\") ` " +"(:data:`sys.executable`) instead." +msgstr "" +"改用 :c:func:`PyConfig_Get(\"executable\") ` " +"(:data:`sys.executable`) 对应的值。" + +#: ../../c-api/interp-lifecycle.rst:653 +msgid "" +"Return the *prefix* for installed platform-independent files. This is " +"derived through a number of complicated rules from the program name set with" +" :c:member:`PyConfig.program_name` and some environment variables; for " +"example, if the program name is ``'/usr/local/bin/python'``, the prefix is " +"``'/usr/local'``. The returned string points into static storage; the caller" +" should not modify its value. This corresponds to the :makevar:`prefix` " +"variable in the top-level :file:`Makefile` and the :option:`--prefix` " +"argument to the :program:`configure` script at build time. The value is " +"available to Python code as ``sys.base_prefix``. It is only useful on Unix." +" See also the next function." +msgstr "" +"返回针对已安装的独立于平台文件的 *prefix*。这是通过基于使用 :c:member:`PyConfig.program_name` " +"设置的程序名称和某些环境变量所派生的一系列复杂规则来获取的;举例来说,如果程序名称为 ``'/usr/local/bin/python'``,则 " +"prefix 为 ``'/usr/local'``。返回的字符串将指向静态存储;调用方不应修改其值。这对应于最高层级 :file:`Makefile` " +"中的 :makevar:`prefix` 变量以及在编译时传给 :program:`configure` 脚本的 :option:`--prefix` " +"参数。该值将作为 ``sys.base_prefix`` 供 Python 代码使用。它仅适用于 Unix。 另请参见下一个函数。" + +#: ../../c-api/interp-lifecycle.rst:669 +msgid "" +"Use :c:func:`PyConfig_Get(\"base_prefix\") ` " +"(:data:`sys.base_prefix`) instead. Use :c:func:`PyConfig_Get(\"prefix\") " +"` (:data:`sys.prefix`) if :ref:`virtual environments ` need to be handled." +msgstr "" +"改用 :c:func:`PyConfig_Get(\"base_prefix\") ` " +"(:data:`sys.base_prefix`)。如果需要处理 :ref:`虚拟环境 ` 则使用 " +":c:func:`PyConfig_Get(\"prefix\") ` (:data:`sys.prefix`) 对应的值。" + +#: ../../c-api/interp-lifecycle.rst:678 +msgid "" +"Return the *exec-prefix* for installed platform-*dependent* files. This is " +"derived through a number of complicated rules from the program name set with" +" :c:member:`PyConfig.program_name` and some environment variables; for " +"example, if the program name is ``'/usr/local/bin/python'``, the exec-prefix" +" is ``'/usr/local'``. The returned string points into static storage; the " +"caller should not modify its value. This corresponds to the " +":makevar:`exec_prefix` variable in the top-level :file:`Makefile` and the " +"``--exec-prefix`` argument to the :program:`configure` script at build " +"time. The value is available to Python code as ``sys.base_exec_prefix``. " +"It is only useful on Unix." +msgstr "" +"返回针对已安装的 *依赖于* 平台文件的 *exec-prefix*。这是通过基于使用 " +":c:member:`PyConfig.program_name` 设置的程序名称和某些环境变量所派生的一系列复杂规则来获取的;举例来说,如果程序名称为" +" ``'/usr/local/bin/python'``,则 exec-prefix 为 ``'/usr/local'``。 " +"返回的字符串将指向静态存储;调用方不应修改其值。这对应于最高层级 :file:`Makefile` 中的 :makevar:`exec_prefix` " +"变量以及在编译时传给 :program:`configure` 脚本的 ``--exec-prefix`` 参数。该值将作为 " +"``sys.base_exec_prefix`` 供 Python 代码使用。它仅适用于 Unix。" + +#: ../../c-api/interp-lifecycle.rst:689 +msgid "" +"Background: The exec-prefix differs from the prefix when platform dependent " +"files (such as executables and shared libraries) are installed in a " +"different directory tree. In a typical installation, platform dependent " +"files may be installed in the :file:`/usr/local/plat` subtree while platform" +" independent may be installed in :file:`/usr/local`." +msgstr "" +"背景:当依赖于平台的文件(如可执行文件和共享库)是安装于不同的目录树中的时候 exec-prefix 将会不同于 prefix。 " +"在典型的安装中,依赖于平台的文件可能安装于 :file:`/usr/local/plat` 子目录树而独立于平台的文件可能安装于 " +":file:`/usr/local` 目录。" + +#: ../../c-api/interp-lifecycle.rst:695 +msgid "" +"Generally speaking, a platform is a combination of hardware and software " +"families, e.g. Sparc machines running the Solaris 2.x operating system are " +"considered the same platform, but Intel machines running Solaris 2.x are " +"another platform, and Intel machines running Linux are yet another platform." +" Different major revisions of the same operating system generally also form" +" different platforms. Non-Unix operating systems are a different story; the" +" installation strategies on those systems are so different that the prefix " +"and exec-prefix are meaningless, and set to the empty string. Note that " +"compiled Python bytecode files are platform independent (but not independent" +" from the Python version by which they were compiled!)." +msgstr "" +"总而言之,平台是一组硬件和软件资源的组合,例如所有运行 Solaris 2.x 操作系统的 Sparc 机器会被视为相同平台,但运行 Solaris " +"2.x 的 Intel 机器是另一种平台,而运行 Linux 的 Intel 机器又是另一种平台。相同操作系统的不同主要发布版通常也会构成不同的平台。 " +"非 Unix 操作系统的情况又有所不同;这类系统上的安装策略差别巨大因此 prefix 和 exec-prefix 是没有意义的,并将被设为空字符串。 " +"请注意已编译的 Python 字节码是独立于平台的(但并不独立于它们编译时所使用的 Python 版本!)" + +#: ../../c-api/interp-lifecycle.rst:706 +msgid "" +"System administrators will know how to configure the :program:`mount` or " +":program:`automount` programs to share :file:`/usr/local` between platforms " +"while having :file:`/usr/local/plat` be a different filesystem for each " +"platform." +msgstr "" +"系统管理员知道如何配置 :program:`mount` 或 :program:`automount` 程序以在平台间共享 " +":file:`/usr/local` 而让 :file:`/usr/local/plat` 成为针对不同平台的不同文件系统。" + +#: ../../c-api/interp-lifecycle.rst:717 +msgid "" +"Use :c:func:`PyConfig_Get(\"base_exec_prefix\") ` " +"(:data:`sys.base_exec_prefix`) instead. Use " +":c:func:`PyConfig_Get(\"exec_prefix\") ` " +"(:data:`sys.exec_prefix`) if :ref:`virtual environments ` need to " +"be handled." +msgstr "" +"改用 :c:func:`PyConfig_Get(\"base_exec_prefix\") ` " +"(:data:`sys.base_exec_prefix`)。如果需要处理 :ref:`虚拟环境 ` 则使用 " +":c:func:`PyConfig_Get(\"exec_prefix\") ` " +"(:data:`sys.exec_prefix`) 对应的值。" + +#: ../../c-api/interp-lifecycle.rst:730 +msgid "" +"Return the full program name of the Python executable; this is computed as " +"a side-effect of deriving the default module search path from the program " +"name (set by :c:member:`PyConfig.program_name`). The returned string points " +"into static storage; the caller should not modify its value. The value is " +"available to Python code as ``sys.executable``." +msgstr "" +"返回 Python 可执行文件的完整程序名称;这是作为基于程序名称(由 :c:member:`PyConfig.program_name` " +"设置)派生默认模块搜索路径的附带影响计算得出的。返回的字符串将指向静态存储;调用方不应修改其值。该值将以 ``sys.executable`` 的名称供" +" Python 代码访问。" + +#: ../../c-api/interp-lifecycle.rst:753 +msgid "" +"Return the default module search path; this is computed from the program " +"name (set by :c:member:`PyConfig.program_name`) and some environment " +"variables. The returned string consists of a series of directory names " +"separated by a platform dependent delimiter character. The delimiter " +"character is ``':'`` on Unix and macOS, ``';'`` on Windows. The returned " +"string points into static storage; the caller should not modify its value. " +"The list :data:`sys.path` is initialized with this value on interpreter " +"startup; it can be (and usually is) modified later to change the search path" +" for loading modules." +msgstr "" +"返回默认模块搜索路径;这是基于程序名称(由 :c:member:`PyConfig.program_name` 设置)和某些环境变量计算得出的。 " +"返回的字符串由一系列以依赖于平台的分隔符分开的目录名称组成。此分隔符在 Unix 和 macOS 上为 ``':'``,在 Windows 上为 " +"``';'``。返回的字符串将指向静态存储;调用方不应修改其值。列表 :data:`sys.path` " +"将在解释器启动时使用该值来初始化;它可以在随后被修改(并且通常都会被修改)以变更用于加载模块的搜索路径。" + +#: ../../c-api/interp-lifecycle.rst:771 +msgid "" +"Use :c:func:`PyConfig_Get(\"module_search_paths\") ` " +"(:data:`sys.path`) instead." +msgstr "" +"改用 :c:func:`PyConfig_Get(\"module_search_paths\") ` " +"(:data:`sys.path`) 对应的值。" + +#: ../../c-api/interp-lifecycle.rst:777 +msgid "" +"Return the version of this Python interpreter. This is a string that looks " +"something like ::" +msgstr "返回 Python 解释器的版本。这将为如下形式的字符串 ::" + +#: ../../c-api/interp-lifecycle.rst:780 +msgid "\"3.0a5+ (py3k:63103M, May 12 2008, 00:53:55) \\n[GCC 4.2.3]\"" +msgstr "\"3.0a5+ (py3k:63103M, May 12 2008, 00:53:55) \\n[GCC 4.2.3]\"" + +#: ../../c-api/interp-lifecycle.rst:784 +msgid "" +"The first word (up to the first space character) is the current Python " +"version; the first characters are the major and minor version separated by a" +" period. The returned string points into static storage; the caller should " +"not modify its value. The value is available to Python code as " +":data:`sys.version`." +msgstr "" +"第一个单词(到第一个空格符为止)是当前的 Python 版本;前面的字符是以点号分隔的主要和次要版本号。 " +"返回的字符串将指向静态存储;调用方不应修改其值。该值将以 :data:`sys.version` 的名称供 Python 代码使用。" + +#: ../../c-api/interp-lifecycle.rst:789 +msgid "See also the :c:var:`Py_Version` constant." +msgstr "另请参阅 :c:var:`Py_Version` 常量。" + +#: ../../c-api/interp-lifecycle.rst:796 +msgid "" +"Return the platform identifier for the current platform. On Unix, this is " +"formed from the \"official\" name of the operating system, converted to " +"lower case, followed by the major revision number; e.g., for Solaris 2.x, " +"which is also known as SunOS 5.x, the value is ``'sunos5'``. On macOS, it " +"is ``'darwin'``. On Windows, it is ``'win'``. The returned string points " +"into static storage; the caller should not modify its value. The value is " +"available to Python code as ``sys.platform``." +msgstr "" +"返回当前平台的平台标识符。在 Unix 上,这将以操作系统的“官方”名称为基础,转换为小写形式,再加上主版本号;例如,对于 Solaris 2.x,或称" +" SunOS 5.x,该值将为 ``'sunos5'``。在 macOS 上,它将为 ``'darwin'``。在 Windows 上它将为 " +"``'win'``。返回的字符串指向静态存储;调用方不应修改其值。Python 代码可通过 ``sys.platform`` 获取该值。" + +#: ../../c-api/interp-lifecycle.rst:807 +msgid "" +"Return the official copyright string for the current Python version, for " +"example" +msgstr "返回当前 Python 版本的官方版权字符串,例如" + +#: ../../c-api/interp-lifecycle.rst:809 +msgid "``'Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam'``" +msgstr "``'Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam'``" + +#: ../../c-api/interp-lifecycle.rst:813 +msgid "" +"The returned string points into static storage; the caller should not modify" +" its value. The value is available to Python code as ``sys.copyright``." +msgstr "返回的字符串指向静态存储;调用者不应修改其值。Python 代码可通过 ``sys.copyright`` 获取该值。" + +#: ../../c-api/interp-lifecycle.rst:819 +msgid "" +"Return an indication of the compiler used to build the current Python " +"version, in square brackets, for example::" +msgstr "返回用于编译当前 Python 版本的编译器标识信息,为带方括号的形式,例如::" + +#: ../../c-api/interp-lifecycle.rst:822 +msgid "\"[GCC 2.7.2.2]\"" +msgstr "\"[GCC 2.7.2.2]\"" + +#: ../../c-api/interp-lifecycle.rst:826 ../../c-api/interp-lifecycle.rst:840 +msgid "" +"The returned string points into static storage; the caller should not modify" +" its value. The value is available to Python code as part of the variable " +"``sys.version``." +msgstr "返回的字符串指向静态存储;调用者不应修改其值。Python 代码可以从变量 ``sys.version`` 中获取该值。" + +#: ../../c-api/interp-lifecycle.rst:833 +msgid "" +"Return information about the sequence number and build date and time of the " +"current Python interpreter instance, for example ::" +msgstr "" + +#: ../../c-api/interp-lifecycle.rst:836 +msgid "\"#67, Aug 1 1997, 22:34:28\"" +msgstr "\"#67, Aug 1 1997, 22:34:28\"" + +#: ../../c-api/interp-lifecycle.rst:852 +msgid "" +"This API is kept for backward compatibility: setting " +":c:member:`PyConfig.argv`, :c:member:`PyConfig.parse_argv` and " +":c:member:`PyConfig.safe_path` should be used instead, see :ref:`Python " +"Initialization Configuration `." +msgstr "" +"此 API 被保留用于向下兼容:应当改为设置 :c:member:`PyConfig.argv`, " +":c:member:`PyConfig.parse_argv` 和 :c:member:`PyConfig.safe_path`,参见 " +":ref:`Python 初始化配置 `。" + +#: ../../c-api/interp-lifecycle.rst:857 +msgid "" +"Set :data:`sys.argv` based on *argc* and *argv*. These parameters are " +"similar to those passed to the program's :c:func:`main` function with the " +"difference that the first entry should refer to the script file to be " +"executed rather than the executable hosting the Python interpreter. If " +"there isn't a script that will be run, the first entry in *argv* can be an " +"empty string. If this function fails to initialize :data:`sys.argv`, a " +"fatal condition is signalled using :c:func:`Py_FatalError`." +msgstr "" +"根据 *argc* 和 *argv* 设置 :data:`sys.argv`。这些形参与传给程序的 :c:func:`main` " +"函数的类似,区别在于第一项应当指向要执行的脚本文件而不是 Python 解释器对应的可执行文件。如果没有要运行的脚本,则 *argv* " +"中的第一项可以为空字符串。如果此函数无法初始化 :data:`sys.argv`,则将使用 :c:func:`Py_FatalError` " +"发出严重情况信号。" + +#: ../../c-api/interp-lifecycle.rst:865 +msgid "" +"If *updatepath* is zero, this is all the function does. If *updatepath* is " +"non-zero, the function also modifies :data:`sys.path` according to the " +"following algorithm:" +msgstr "" +"如果 *updatepath* 为零,此函数将完成操作。如果 *updatepath* 为非零值,则此函数还将根据以下算法修改 " +":data:`sys.path`:" + +#: ../../c-api/interp-lifecycle.rst:869 +msgid "" +"If the name of an existing script is passed in ``argv[0]``, the absolute " +"path of the directory where the script is located is prepended to " +":data:`sys.path`." +msgstr "如果在 ``argv[0]`` 中传入一个现有脚本,则脚本所在目录的绝对路径将被添加到 :data:`sys.path` 的开头。" + +#: ../../c-api/interp-lifecycle.rst:872 +msgid "" +"Otherwise (that is, if *argc* is ``0`` or ``argv[0]`` doesn't point to an " +"existing file name), an empty string is prepended to :data:`sys.path`, which" +" is the same as prepending the current working directory (``\".\"``)." +msgstr "" +"在其他情况下 (也就是说,如果 *argc* 为 ``0`` 或 ``argv[0]`` 未指向现有文件名),则将在 :data:`sys.path` " +"的开头添加一个空字符串,这等价于添加当前工作目录 (``\".\"``)。" + +#: ../../c-api/interp-lifecycle.rst:880 ../../c-api/interp-lifecycle.rst:913 +msgid "" +"See also :c:member:`PyConfig.orig_argv` and :c:member:`PyConfig.argv` " +"members of the :ref:`Python Initialization Configuration `." +msgstr "" +"另请参阅 :ref:`Python 初始化配置 ` 的 :c:member:`PyConfig.orig_argv` 和 " +":c:member:`PyConfig.argv` 成员。" + +#: ../../c-api/interp-lifecycle.rst:884 +msgid "" +"It is recommended that applications embedding the Python interpreter for " +"purposes other than executing a single script pass ``0`` as *updatepath*, " +"and update :data:`sys.path` themselves if desired. See :cve:`2008-5983`." +msgstr "" +"建议在出于执行单个脚本以外的目的嵌入 Python 解释器的应用传入 ``0`` 作为 *updatepath*,并在需要时更新 " +":data:`sys.path` 本身。参见 :cve:`2008-5983`。" + +#: ../../c-api/interp-lifecycle.rst:889 +msgid "" +"On versions before 3.1.3, you can achieve the same effect by manually " +"popping the first :data:`sys.path` element after having called " +":c:func:`PySys_SetArgv`, for example using::" +msgstr "" +"在 3.1.3 之前的版本中,你可以通过在调用 :c:func:`PySys_SetArgv` 之后手动弹出第一个 :data:`sys.path` " +"元素,例如使用::" + +#: ../../c-api/interp-lifecycle.rst:893 +msgid "PyRun_SimpleString(\"import sys; sys.path.pop(0)\\n\");" +msgstr "PyRun_SimpleString(\"import sys; sys.path.pop(0)\\n\");" + +#: ../../c-api/interp-lifecycle.rst:902 +msgid "" +"This API is kept for backward compatibility: setting " +":c:member:`PyConfig.argv` and :c:member:`PyConfig.parse_argv` should be used" +" instead, see :ref:`Python Initialization Configuration `." +msgstr "" +"此 API 仅为向下兼容而保留:应当改为设置 :c:member:`PyConfig.argv` 并改用 " +":c:member:`PyConfig.parse_argv`,参见 :ref:`Python 初始化配置 `。" + +#: ../../c-api/interp-lifecycle.rst:906 +msgid "" +"This function works like :c:func:`PySys_SetArgvEx` with *updatepath* set to " +"``1`` unless the :program:`python` interpreter was started with the " +":option:`-I`." +msgstr "" +"此函数相当于 :c:func:`PySys_SetArgvEx` 设置了 *updatepath* 为 ``1`` 除非 " +":program:`python` 解释器启动时附带了 :option:`-I`。" + +#: ../../c-api/interp-lifecycle.rst:916 +msgid "The *updatepath* value depends on :option:`-I`." +msgstr "*updatepath* 值依赖于 :option:`-I`。" + +#: ../../c-api/interp-lifecycle.rst:923 +msgid "" +"This API is kept for backward compatibility: setting " +":c:member:`PyConfig.home` should be used instead, see :ref:`Python " +"Initialization Configuration `." +msgstr "" +"此 API 被保留用于向下兼容:应当改为设置 :c:member:`PyConfig.home`,参见 :ref:`Python 初始化配置 " +"` 文档。" + +#: ../../c-api/interp-lifecycle.rst:927 +msgid "" +"Set the default \"home\" directory, that is, the location of the standard " +"Python libraries. See :envvar:`PYTHONHOME` for the meaning of the argument " +"string." +msgstr "" +"设置默认的 \"home\" 目录,也就是标准 Python 库所在的位置。请参阅 :envvar:`PYTHONHOME` 了解该参数字符串的含义。" + +#: ../../c-api/interp-lifecycle.rst:931 +msgid "" +"The argument should point to a zero-terminated character string in static " +"storage whose contents will not change for the duration of the program's " +"execution. No code in the Python interpreter will change the contents of " +"this storage." +msgstr "此参数应当指向静态存储中一个以零值结束的字符串,其内容在程序执行期间将保持不变。Python 解释器中的代码绝不会修改此存储中的内容。" + +#: ../../c-api/interp-lifecycle.rst:944 +msgid "" +"Return the default \"home\", that is, the value set by " +":c:member:`PyConfig.home`, or the value of the :envvar:`PYTHONHOME` " +"environment variable if it is set." +msgstr "" +"返回默认的 \"home\",就是由 :c:member:`PyConfig.home` 所设置的值,或者在设置了 " +":envvar:`PYTHONHOME` 环境变量的情况下则为该变量的值。" + +#: ../../c-api/interp-lifecycle.rst:954 +msgid "" +"Use :c:func:`PyConfig_Get(\"home\") ` or the " +":envvar:`PYTHONHOME` environment variable instead." +msgstr "" +"改用 :c:func:`PyConfig_Get(\"home\") ` 或 :envvar:`PYTHONHOME` " +"环境变量。" + +#: ../../c-api/interp-lifecycle.rst:357 +msgid "PyEval_InitThreads()" +msgstr "PyEval_InitThreads()" + +#: ../../c-api/interp-lifecycle.rst:357 +msgid "modules (in module sys)" +msgstr "modules (在 sys 模块中)" + +#: ../../c-api/interp-lifecycle.rst:357 ../../c-api/interp-lifecycle.rst:749 +msgid "path (in module sys)" +msgstr "path (在 sys 模块中)" + +#: ../../c-api/interp-lifecycle.rst:357 ../../c-api/interp-lifecycle.rst:749 +msgid "module" +msgstr "module" + +#: ../../c-api/interp-lifecycle.rst:357 +msgid "builtins" +msgstr "builtins" + +#: ../../c-api/interp-lifecycle.rst:357 +msgid "__main__" +msgstr "__main__" + +#: ../../c-api/interp-lifecycle.rst:357 +msgid "sys" +msgstr "sys" + +#: ../../c-api/interp-lifecycle.rst:357 ../../c-api/interp-lifecycle.rst:749 +msgid "search" +msgstr "搜索" + +#: ../../c-api/interp-lifecycle.rst:357 ../../c-api/interp-lifecycle.rst:749 +msgid "path" +msgstr "path" + +#: ../../c-api/interp-lifecycle.rst:357 +msgid "Py_FinalizeEx (C function)" +msgstr "Py_FinalizeEx (C 函数)" + +#: ../../c-api/interp-lifecycle.rst:608 +msgid "Py_Initialize()" +msgstr "Py_Initialize()" + +#: ../../c-api/interp-lifecycle.rst:608 ../../c-api/interp-lifecycle.rst:847 +msgid "main()" +msgstr "main()" + +#: ../../c-api/interp-lifecycle.rst:608 +msgid "Py_GetPath()" +msgstr "Py_GetPath()" + +#: ../../c-api/interp-lifecycle.rst:727 +msgid "executable (in module sys)" +msgstr "executable (在 sys 模块中)" + +#: ../../c-api/interp-lifecycle.rst:782 ../../c-api/interp-lifecycle.rst:824 +#: ../../c-api/interp-lifecycle.rst:838 +msgid "version (in module sys)" +msgstr "version (在 sys 模块中)" + +#: ../../c-api/interp-lifecycle.rst:794 +msgid "platform (in module sys)" +msgstr "platform (在 sys 模块中)" + +#: ../../c-api/interp-lifecycle.rst:811 +msgid "copyright (in module sys)" +msgstr "copyright (在 sys 模块中)" + +#: ../../c-api/interp-lifecycle.rst:847 +msgid "Py_FatalError()" +msgstr "Py_FatalError()" + +#: ../../c-api/interp-lifecycle.rst:847 +msgid "argv (in module sys)" +msgstr "argv (在 sys 模块中)" diff --git a/c-api/intro.po b/c-api/intro.po new file mode 100644 index 0000000000..2a2a20fbbd --- /dev/null +++ b/c-api/intro.po @@ -0,0 +1,1900 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-07 17:18+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/intro.rst:8 +msgid "Introduction" +msgstr "概述" + +#: ../../c-api/intro.rst:10 +msgid "" +"The Application Programmer's Interface to Python gives C and C++ programmers" +" access to the Python interpreter at a variety of levels. The API is " +"equally usable from C++, but for brevity it is generally referred to as the " +"Python/C API. There are two fundamentally different reasons for using the " +"Python/C API. The first reason is to write *extension modules* for specific " +"purposes; these are C modules that extend the Python interpreter. This is " +"probably the most common use. The second reason is to use Python as a " +"component in a larger application; this technique is generally referred to " +"as :dfn:`embedding` Python in an application." +msgstr "" +"Python 的应用编程接口(API)使得 C 和 C++ 程序员可以在多个层级上访问 Python 解释器。该 API 在 C++ " +"中同样可用,但为简化描述,通常将其称为 Python/C API。使用 Python/C API 有两个基本的理由。第一个理由是为了特定目的而编写 " +"*扩展模块*;它们是扩展 Python 解释器功能的 C 模块。这可能是最常见的使用场景。第二个理由是将 Python " +"用作更大规模应用的组件;这种技巧通常被称为在一个应用中 :dfn:`embedding` Python。" + +#: ../../c-api/intro.rst:20 +msgid "" +"Writing an extension module is a relatively well-understood process, where a" +" \"cookbook\" approach works well. There are several tools that automate " +"the process to some extent. While people have embedded Python in other " +"applications since its early existence, the process of embedding Python is " +"less straightforward than writing an extension." +msgstr "" +"编写扩展模块的过程相对来说更易于理解,可以通过“菜谱”的形式分步骤介绍。使用某些工具可在一定程度上自动化这一过程。虽然人们在其他应用中嵌入 Python" +" 的做法早已有之,但嵌入 Python 的过程没有编写扩展模块那样方便直观。" + +#: ../../c-api/intro.rst:26 +msgid "" +"Many API functions are useful independent of whether you're embedding or " +"extending Python; moreover, most applications that embed Python will need " +"to provide a custom extension as well, so it's probably a good idea to " +"become familiar with writing an extension before attempting to embed Python" +" in a real application." +msgstr "" +"许多 API 函数在你嵌入或是扩展 Python 这两种场景下都能发挥作用;此外,大多数嵌入 Python " +"的应用程序也需要提供自定义扩展,因此在尝试在实际应用中嵌入 Python 之前先熟悉编写扩展应该会是个好主意。" + +#: ../../c-api/intro.rst:34 +msgid "Language version compatibility" +msgstr "语言版本兼容性" + +#: ../../c-api/intro.rst:36 +msgid "Python's C API is compatible with C11 and C++11 versions of C and C++." +msgstr "Python 的 C API 与 C11 和 C++11 版本的 C 和 C++ 兼容。" + +#: ../../c-api/intro.rst:38 +msgid "" +"This is a lower limit: the C API does not require features from later C/C++ " +"versions. You do *not* need to enable your compiler's \"c11 mode\"." +msgstr "这是一个下限:C API 不需要更新的 C/C++ 版本的特性。您 *不* 需要启用编译器的 \"c11 模式\"。" + +#: ../../c-api/intro.rst:44 +msgid "Coding standards" +msgstr "代码标准" + +#: ../../c-api/intro.rst:46 +msgid "" +"If you're writing C code for inclusion in CPython, you **must** follow the " +"guidelines and standards defined in :PEP:`7`. These guidelines apply " +"regardless of the version of Python you are contributing to. Following " +"these conventions is not necessary for your own third party extension " +"modules, unless you eventually expect to contribute them to Python." +msgstr "" +"如果你想要编写可包含于 CPython 的 C 代码,你 **必须** 遵循在 :PEP:`7` " +"中定义的指导原则和标准。这些指导原则适用于任何你所要扩展的 Python 版本。在编写你自己的第三方扩展模块时可以不必遵循这些规范,除非你准备在日后向 " +"Python 贡献这些模块。" + +#: ../../c-api/intro.rst:56 +msgid "Include Files" +msgstr "包含文件" + +#: ../../c-api/intro.rst:58 +msgid "" +"All function, type and macro definitions needed to use the Python/C API are " +"included in your code by the following line::" +msgstr "使用 Python/C API 所需要的全部函数、类型和宏定义可通过下面这行语句包含到你的代码之中:" + +#: ../../c-api/intro.rst:61 +msgid "" +"#define PY_SSIZE_T_CLEAN\n" +"#include " +msgstr "" +"#define PY_SSIZE_T_CLEAN\n" +"#include " + +#: ../../c-api/intro.rst:64 +msgid "" +"This implies inclusion of the following standard headers: ````, " +"````, ````, ````, ```` and " +"```` (if available)." +msgstr "" +"这意味着包含以下标准头文件:\\ ````\\ ,\\ ````\\ ,\\ ````\\ " +",\\ ````\\ ,\\ ```` 和 ````\\ (如果可用)。" + +#: ../../c-api/intro.rst:70 +msgid "" +"Since Python may define some pre-processor definitions which affect the " +"standard headers on some systems, you *must* include :file:`Python.h` before" +" any standard headers are included." +msgstr "" +"由于 Python 可能会定义一些能在某些系统上影响标准头文件的预处理器定义,因此在包含任何标准头文件之前,你 *必须* 先包含 " +":file:`Python.h` 头文件。" + +#: ../../c-api/intro.rst:74 +msgid "" +"It is recommended to always define ``PY_SSIZE_T_CLEAN`` before including " +"``Python.h``. See :ref:`arg-parsing` for a description of this macro." +msgstr "" +"推荐总是在 ``Python.h`` 前定义 ``PY_SSIZE_T_CLEAN``。查看 :ref:`arg-parsing` " +"来了解这个宏的更多内容。" + +#: ../../c-api/intro.rst:77 +msgid "" +"All user visible names defined by Python.h (except those defined by the " +"included standard headers) have one of the prefixes ``Py`` or ``_Py``. " +"Names beginning with ``_Py`` are for internal use by the Python " +"implementation and should not be used by extension writers. Structure member" +" names do not have a reserved prefix." +msgstr "" +"Python.h 所定义的全部用户可见名称(由包含的标准头文件所定义的除外)都带有前缀 ``Py`` 或者 ``_Py``。以 ``_Py`` " +"打头的名称是供 Python 实现内部使用的,不应被扩展编写者使用。结构成员名称没有保留前缀。" + +#: ../../c-api/intro.rst:84 +msgid "" +"User code should never define names that begin with ``Py`` or ``_Py``. This " +"confuses the reader, and jeopardizes the portability of the user code to " +"future Python versions, which may define additional names beginning with one" +" of these prefixes." +msgstr "" +"用户代码永远不应该定义以 ``Py`` 或 ``_Py`` 开头的名称。这会使读者感到困惑,并危及用户代码对未来 Python " +"版本的可移植性,这些版本可能会定义以这些前缀之一开头的其他名称。" + +#: ../../c-api/intro.rst:89 +msgid "" +"The header files are typically installed with Python. On Unix, these are " +"located in the directories :file:`{prefix}/include/pythonversion/` and " +":file:`{exec_prefix}/include/pythonversion/`, where :option:`prefix " +"<--prefix>` and :option:`exec_prefix <--exec-prefix>` are defined by the " +"corresponding parameters to Python's :program:`configure` script and " +"*version* is ``'%d.%d' % sys.version_info[:2]``. On Windows, the headers " +"are installed in :file:`{prefix}/include`, where ``prefix`` is the " +"installation directory specified to the installer." +msgstr "" +"头文件通常会与 Python 一起安装。在 Unix 上,它们位于 :file:`{prefix}/include/pythonversion/` 和 " +":file:`{exec_prefix}/include/pythonversion/` 目录,其中 :option:`prefix " +"<--prefix>` 和 :option:`exec_prefix <--exec-prefix>` 是由向 Python 的 " +":program:`configure` 脚本传入的对应形参定义,而 *version* 则为 ``'%d.%d' % " +"sys.version_info[:2]``。在 Windows 上,头文件安装于 :file:`{prefix}/include`,其中 " +"``prefix`` 是为安装程序指定的安装目录。" + +#: ../../c-api/intro.rst:98 +msgid "" +"To include the headers, place both directories (if different) on your " +"compiler's search path for includes. Do *not* place the parent directories " +"on the search path and then use ``#include ``; this will" +" break on multi-platform builds since the platform independent headers under" +" :option:`prefix <--prefix>` include the platform specific headers from " +":option:`exec_prefix <--exec-prefix>`." +msgstr "" +"要包括这些头文件,请将两个目录(如果不同)都放到你所用编译器用于包括头文件的搜索目录中。请 *不要* 将父目录放入搜索路径然后使用 ``#include" +" ``;这将使得多平台编译不可用,因为 :option:`prefix <--prefix>` " +"下与平台无关的头文件包括了来自 :option:`exec_prefix <--exec-prefix>` 的平台专属头文件。" + +#: ../../c-api/intro.rst:105 +msgid "" +"C++ users should note that although the API is defined entirely using C, the" +" header files properly declare the entry points to be ``extern \"C\"``. As a" +" result, there is no need to do anything special to use the API from C++." +msgstr "" +"C++ 用户应该注意,尽管 API 是完全使用 C 来定义的,但头文件正确地将入口点声明为 ``extern \"C\"``,因此在 C++ 中使用此 " +"API 不必再做任何特殊处理。" + +#: ../../c-api/intro.rst:111 +msgid "Useful macros" +msgstr "有用的宏" + +#: ../../c-api/intro.rst:113 +msgid "" +"Several useful macros are defined in the Python header files. Many are " +"defined closer to where they are useful (for example, " +":c:macro:`Py_RETURN_NONE`, :c:macro:`PyMODINIT_FUNC`). Others of a more " +"general utility are defined here. This is not necessarily a complete " +"listing." +msgstr "" +"Python 头文件中定义了一些有用的宏。许多是在靠近它们被使用的地方定义的 (例如: " +":c:macro:`Py_RETURN_NONE`、:c:macro:`PyMODINIT_FUNC`)。 " +"其他更为通用的则定义在这里。这里所显示的并不是一个完整的列表。" + +#: ../../c-api/intro.rst:121 +msgid "" +"If this macro is defined, then the current system is able to start threads." +msgstr "如果定义了该宏,则当前系统将能够启动线程。" + +#: ../../c-api/intro.rst:123 +msgid "" +"Currently, all systems supported by CPython (per :pep:`11`), with the " +"exception of some WebAssembly platforms, support starting threads." +msgstr "目前,CPython 支持的所有系统 (见 :pep:`11`),除某些 WebAssembly 平台外,均支持启动线程。" + +#: ../../c-api/intro.rst:130 +msgid "" +"Like :samp:`getenv({s})`, but returns ``NULL`` if :option:`-E` was passed on" +" the command line (see :c:member:`PyConfig.use_environment`)." +msgstr "" +"与 :samp:`getenv({s})` 类似,但是如果从命令行传入了 :option:`-E` 则返回 ``NULL`` (参见 " +":c:member:`PyConfig.use_environment`)。" + +#: ../../c-api/intro.rst:135 +msgid "Docstring macros" +msgstr "文档字符串宏" + +#: ../../c-api/intro.rst:139 +msgid "" +"Creates a variable with name *name* that can be used in docstrings. If " +"Python is built without docstrings (:option:`--without-doc-strings`), the " +"value will be an empty string." +msgstr "" +"创建一个名字为 *name* 的可在文档字符串中使用的变量。 如果 Python 构建时不带文档字符串 (:option:`--without-doc-" +"strings`),该值将为空字符串。" + +#: ../../c-api/intro.rst:143 ../../c-api/intro.rst:160 +#: ../../c-api/intro.rst:428 +msgid "Example::" +msgstr "示例::" + +#: ../../c-api/intro.rst:145 +msgid "" +"PyDoc_STRVAR(pop_doc, \"Remove and return the rightmost element.\");\n" +"\n" +"static PyMethodDef deque_methods[] = {\n" +" // ...\n" +" {\"pop\", (PyCFunction)deque_pop, METH_NOARGS, pop_doc},\n" +" // ...\n" +"}" +msgstr "" +"PyDoc_STRVAR(pop_doc, \"Remove and return the rightmost element.\");\n" +"\n" +"static PyMethodDef deque_methods[] = {\n" +" // ...\n" +" {\"pop\", (PyCFunction)deque_pop, METH_NOARGS, pop_doc},\n" +" // ...\n" +"}" + +#: ../../c-api/intro.rst:153 +msgid "Expands to :samp:`PyDoc_VAR({name}) = PyDoc_STR({str})`." +msgstr "扩展为 :samp:`PyDoc_VAR({name}) = PyDoc_STR({str})`。" + +#: ../../c-api/intro.rst:157 +msgid "" +"Expands to the given input string, or an empty string if docstrings are " +"disabled (:option:`--without-doc-strings`)." +msgstr "扩展为给定的输入字符串,或者如果文档字符串被禁用 (:option:`--without-doc-strings`) 则为空字符串。" + +#: ../../c-api/intro.rst:162 +msgid "" +"static PyMethodDef pysqlite_row_methods[] = {\n" +" {\"keys\", (PyCFunction)pysqlite_row_keys, METH_NOARGS,\n" +" PyDoc_STR(\"Returns the keys of the row.\")},\n" +" {NULL, NULL}\n" +"};" +msgstr "" +"static PyMethodDef pysqlite_row_methods[] = {\n" +" {\"keys\", (PyCFunction)pysqlite_row_keys, METH_NOARGS,\n" +" PyDoc_STR(\"Returns the keys of the row.\")},\n" +" {NULL, NULL}\n" +"};" + +#: ../../c-api/intro.rst:170 +msgid "" +"Declares a static character array variable with the given *name*. Expands to" +" :samp:`static const char {name}[]`" +msgstr "声明一个给定名称 *name* 的静态字符数组变量。 扩展为 :samp:`static const char {name}[]`" + +#: ../../c-api/intro.rst:173 ../../c-api/intro.rst:314 +#: ../../c-api/intro.rst:325 +msgid "For example::" +msgstr "例如:" + +#: ../../c-api/intro.rst:175 +msgid "" +"PyDoc_VAR(python_doc) = PyDoc_STR(\n" +" \"A genus of constricting snakes in the Pythonidae family native \"\n" +" \"to the tropics and subtropics of the Eastern Hemisphere.\");" +msgstr "" +"PyDoc_VAR(python_doc) = PyDoc_STR(\n" +" \"A genus of constricting snakes in the Pythonidae family native \"\n" +" \"to the tropics and subtropics of the Eastern Hemisphere.\");" + +#: ../../c-api/intro.rst:181 +msgid "General utility macros" +msgstr "通用工具宏" + +#: ../../c-api/intro.rst:183 +msgid "The following macros are for common tasks not specific to Python." +msgstr "下列宏针对非 Python 专属的通用任务。" + +#: ../../c-api/intro.rst:187 +msgid "" +"Use this for unused arguments in a function definition to silence compiler " +"warnings. Example: ``int func(int a, int Py_UNUSED(b)) { return a; }``." +msgstr "" +"用于函数定义中未使用的参数,从而消除编译器警告。 例如: ``int func(int a, int Py_UNUSED(b)) { return a;" +" }``。" + +#: ../../c-api/intro.rst:194 +msgid "" +"Use a GCC attribute *name*, hiding it from compilers that don't support GCC " +"attributes (such as MSVC)." +msgstr "使用 GCC 属性 *name*,对于不支持 GCC 属性的编译器(如 MSVC)则隐藏它。" + +#: ../../c-api/intro.rst:197 +msgid "" +"This expands to :samp:`__attribute__(({name)})` on a GCC compiler, and " +"expands to nothing on compilers that don't support GCC attributes." +msgstr "" +"在 GCC 编译器上这将扩展为 :samp:`__attribute__(({name)})`,而在不支持 GCC 属性的编译器上则不会扩展。" + +#: ../../c-api/intro.rst:202 +msgid "Numeric utilities" +msgstr "数值工具" + +#: ../../c-api/intro.rst:206 +msgid "Return the absolute value of ``x``." +msgstr "返回 ``x`` 的绝对值。" + +#: ../../c-api/intro.rst:208 +msgid "" +"The argument may be evaluated more than once. Consequently, do not pass an " +"expression with side-effects directly to this macro." +msgstr "此参数可能被多次求值。 因此,请不要传入会直接对该宏产生附带影响的表达式。" + +#: ../../c-api/intro.rst:212 +msgid "" +"If the result cannot be represented (for example, if ``x`` has " +":c:macro:`!INT_MIN` value for :c:expr:`int` type), the behavior is " +"undefined." +msgstr "" +"如果结果无法表示(例如,当 ``x`` 对于 :c:expr:`int` 类型具有 :c:macro:`!INT_MIN` 值时),则行为是未定义的。" + +#: ../../c-api/intro.rst:216 +msgid "Corresponds roughly to :samp:`(({x}) < 0 ? -({x}) : ({x}))`" +msgstr "大致对应于 :samp:`(({x}) < 0 ? -({x}) : ({x}))`" + +#: ../../c-api/intro.rst:223 +msgid "Return the larger or smaller of the arguments, respectively." +msgstr "分别返回参数中较大或较小的那个。" + +#: ../../c-api/intro.rst:225 +msgid "" +"Any arguments may be evaluated more than once. Consequently, do not pass an " +"expression with side-effects directly to this macro." +msgstr "任何参数都可能被多次求值。 因此,请不要传入会直接对该宏产生附带影响的表达式。" + +#: ../../c-api/intro.rst:229 +msgid "" +":c:macro:`!Py_MAX` corresponds roughly to :samp:`((({x}) > ({y})) ? ({x}) : " +"({y}))`." +msgstr ":c:macro:`!Py_MAX` 大致对应于 :samp:`((({x}) > ({y})) ? ({x}) : ({y}))`。" + +#: ../../c-api/intro.rst:236 +msgid "" +"Similar to :samp:`{integer} >> {positions}`, but forces sign extension, as " +"the C standard does not define whether a right-shift of a signed integer " +"will perform sign extension or a zero-fill." +msgstr "" +"类似于 :samp:`{integer} >> {positions}`,但会强制执行符号位扩展,因为 C " +"标准没有定义有符号整数的右侧是否要执行符号位扩展或零值填充。" + +#: ../../c-api/intro.rst:240 +msgid "" +"*integer* should be any signed integer type. *positions* is the number of " +"positions to shift to the right." +msgstr "*integer* 应为任意有符号整数类型。 *positions* 为右移的位数。" + +#: ../../c-api/intro.rst:243 +msgid "" +"Both *integer* and *positions* can be evaluated more than once; " +"consequently, avoid directly passing a function call or some other operation" +" with side-effects to this macro. Instead, store the result as a variable " +"and then pass it." +msgstr "" +"*integer* 和 *positions* 均可被多次求值;因此,应避免直接向该宏传入函数调用或其他具有附带影响的操作。 " +"作为替代,请将结果保存为变量再传递它。" + +#: ../../c-api/intro.rst:248 +msgid "" +"*type* is unused and only kept for backwards compatibility. Historically, " +"*type* was used to cast *integer*." +msgstr "*type* 未被使用并且仅出于向下兼容目的而保留。 在历史上,*type* 曾被用于转换 *integer*。" + +#: ../../c-api/intro.rst:253 +msgid "" +"This macro is now valid for all signed integer types, not just those for " +"which ``unsigned type`` is legal. As a result, *type* is no longer used." +msgstr "该宏现在适用于全部的有符号整数类型,而不仅针对于可使用 ``unsigned type`` 的类型。 因此,*type* 已不再被使用。" + +#: ../../c-api/intro.rst:259 +msgid "" +"Argument must be a character or an integer in the range [-128, 127] or [0, " +"255]. This macro returns ``c`` cast to an ``unsigned char``." +msgstr "" +"参数必须为 [-128, 127] 或 [0, 255] 范围内的字符或整数类型。这个宏将 ``c`` 强制转换为 ``unsigned char`` " +"返回。" + +#: ../../c-api/intro.rst:264 +msgid "Assertion utilities" +msgstr "断言工具" + +#: ../../c-api/intro.rst:268 +msgid "" +"Use this when you have a code path that cannot be reached by design. For " +"example, in the ``default:`` clause in a ``switch`` statement for which all " +"possible values are covered in ``case`` statements. Use this in places " +"where you might be tempted to put an ``assert(0)`` or ``abort()`` call." +msgstr "" +"这个可以在你有一个设计上无法到达的代码路径时使用。例如,当一个 ``switch`` 语句中所有可能的值都已被 ``case`` " +"子句覆盖了,就可将其用在 ``default:`` 子句中。当你非常想在某个位置放一个 ``assert(0)`` 或 ``abort()`` " +"调用时也可以用这个。" + +#: ../../c-api/intro.rst:273 +msgid "" +"In release mode, the macro helps the compiler to optimize the code, and " +"avoids a warning about unreachable code. For example, the macro is " +"implemented with ``__builtin_unreachable()`` on GCC in release mode." +msgstr "" +"在 release 模式下,该宏帮助编译器优化代码,并避免发出不可到达代码的警告。例如,在 GCC 的 release 模式下,该宏使用 " +"``__builtin_unreachable()`` 实现。" + +#: ../../c-api/intro.rst:277 +msgid "" +"In debug mode, and on unsupported compilers, the macro expands to a call to " +":c:func:`Py_FatalError`." +msgstr "在调试模式下,以及在不受支持的编译器上,该宏将扩展为对 :c:func:`Py_FatalError` 的调用。" + +#: ../../c-api/intro.rst:280 +msgid "" +"A use for ``Py_UNREACHABLE()`` is following a call to a function that never " +"returns but that is not declared ``_Noreturn``." +msgstr "``Py_UNREACHABLE()`` 的一个用法是跟随一个从不返回但又不声明为 ``_Noreturn`` 的函数调用。" + +#: ../../c-api/intro.rst:283 +msgid "" +"If a code path is very unlikely code but can be reached under exceptional " +"case, this macro must not be used. For example, under low memory condition " +"or if a system call returns a value out of the expected range. In this " +"case, it's better to report the error to the caller. If the error cannot be" +" reported to caller, :c:func:`Py_FatalError` can be used." +msgstr "" +"如果一个代码路径不太可能是正常代码,但在特殊情况下可以到达,就不能使用该宏。例如,在低内存条件下,或者一个系统调用返回超出预期范围值,诸如此类,最好将错误报告给调用者。如果无法将错误报告给调用者,可以使用" +" :c:func:`Py_FatalError` 函数。" + +#: ../../c-api/intro.rst:293 +msgid "" +"Cast *value* to type *smaller* from type *larger*, validating that no " +"information was lost." +msgstr "将 *value* 从类型 *larger* 转换为类型 *smaller*,并验证不存在信息丢失。" + +#: ../../c-api/intro.rst:296 +msgid "" +"On release builds of Python, this is roughly equivalent to " +":samp:`(({smaller}) {value})` (in C++, " +":samp:`static_cast<{smaller}>({value})` will be used instead)." +msgstr "" +"在 Python 发布构建版中,这大致等价于 :samp:`(({smaller}) {value})` (在 C++ 中,将会改用 " +":samp:`static_cast<{smaller}>({value})`)。" + +#: ../../c-api/intro.rst:300 +msgid "" +"On debug builds (implying that :c:macro:`Py_DEBUG` is defined), this asserts" +" that no information was lost with the cast from *larger* to *smaller*." +msgstr "" +"在调试构建版中 (即定义了 :c:macro:`Py_DEBUG`),这将断言从 *larger* 到 *smaller* 的转换不存在信息丢失。" + +#: ../../c-api/intro.rst:303 +msgid "" +"*value*, *larger*, and *smaller* may all be evaluated more than once in the " +"expression; consequently, do not pass an expression with side-effects " +"directly to this macro." +msgstr "" +"在表达式中 *value*, *larger* 和 *smaller* 都可能被多次求值;因此,请不要传入会直接对该宏产生附带影响的表达式。" + +#: ../../c-api/intro.rst:309 +msgid "" +"Asserts a compile-time condition *cond*, as a statement. The build will fail" +" if the condition is false or cannot be evaluated at compile time." +msgstr "断言一个编译时条件 *cond*,作为一条语句。如果该条件为假值或无法在编译时被求值则构建将失败。" + +#: ../../c-api/intro.rst:312 +msgid "Corresponds roughly to :samp:`static_assert({cond})` on C23 and above." +msgstr "大致对应于 C23 及以上的 :samp:`static_assert({cond})`。" + +#: ../../c-api/intro.rst:316 +msgid "Py_BUILD_ASSERT(sizeof(PyTime_t) == sizeof(int64_t));" +msgstr "Py_BUILD_ASSERT(sizeof(PyTime_t) == sizeof(int64_t));" + +#: ../../c-api/intro.rst:322 +msgid "" +"Asserts a compile-time condition *cond*, as an expression that evaluates to " +"``0``. The build will fail if the condition is false or cannot be evaluated " +"at compile time." +msgstr "断言一个编译时条件 *cond*,作为一个将求值为 ``0`` 的表达式。如果条件为假值或无法在编译时被求值则构建将失败。" + +#: ../../c-api/intro.rst:327 +msgid "" +"#define foo_to_char(foo) \\\n" +" ((char *)(foo) + Py_BUILD_ASSERT_EXPR(offsetof(struct foo, string) == 0))" +msgstr "" +"#define foo_to_char(foo) \\\n" +" ((char *)(foo) + Py_BUILD_ASSERT_EXPR(offsetof(struct foo, string) == 0))" + +#: ../../c-api/intro.rst:334 +msgid "Type size utilities" +msgstr "类型大小工具" + +#: ../../c-api/intro.rst:338 +msgid "Compute the length of a statically allocated C array at compile time." +msgstr "在编译时计算静态分配的 C 数组的长度。" + +#: ../../c-api/intro.rst:340 +msgid "" +"The *array* argument must be a C array with a size known at compile time. " +"Passing an array with an unknown size, such as a heap-allocated array, will " +"result in a compilation error on some compilers, or otherwise produce " +"incorrect results." +msgstr "" +"*array* 参数必须是一个大小在编译时确定的 C " +"数组。传入一个未知大小的数组,如堆分配数组,在某些编译器上将导致编译错误,或者在其他情况下产生不正确的结果。" + +#: ../../c-api/intro.rst:345 +msgid "This is roughly equivalent to::" +msgstr "这大致等价于::" + +#: ../../c-api/intro.rst:347 +msgid "sizeof(array) / sizeof((array)[0])" +msgstr "sizeof(array) / sizeof((array)[0])" + +#: ../../c-api/intro.rst:351 +msgid "Return the size of a structure (*type*) *member* in bytes." +msgstr "返回结构 (*type*) *member* 以字节表示的大小。" + +#: ../../c-api/intro.rst:353 +msgid "Corresponds roughly to :samp:`sizeof((({type} *)NULL)->{member})`." +msgstr "大致对应于 :samp:`sizeof((({type} *)NULL)->{member})`。" + +#: ../../c-api/intro.rst:359 +msgid "Macro definition utilities" +msgstr "宏定义工具" + +#: ../../c-api/intro.rst:363 +msgid "" +"This is equivalent to :samp:`{X}`, which is useful for token-pasting in " +"macros, as macro expansions in *X* are forcefully evaluated by the " +"preprocessor." +msgstr "这等价于 :samp:`{X}`,它对于在宏中粘贴凭据很有用处,因为 *X* 中的宏扩展会被预处理器强制求值。" + +#: ../../c-api/intro.rst:369 +msgid "" +"Convert ``x`` to a C string. For example, ``Py_STRINGIFY(123)`` returns " +"``\"123\"``." +msgstr "将 ``x`` 转换为 C 字符串。 例如,``Py_STRINGIFY(123)`` 将返回 ``\"123\"``。" + +#: ../../c-api/intro.rst:376 +msgid "Declaration utilities" +msgstr "声明工具" + +#: ../../c-api/intro.rst:378 +msgid "" +"The following macros can be used in declarations. They are most useful for " +"defining the C API itself, and have limited use for extension authors. Most " +"of them expand to compiler-specific spellings of common extensions to the C " +"language." +msgstr "" +"以下的宏可在声明中使用。 它们特别适用于定义 C API 本身,对扩展开发者也有一定用处。 它们大多被扩展为 C 语言通用扩展的编译器专属拼写形式。" + +#: ../../c-api/intro.rst:386 +msgid "" +"Ask the compiler to always inline a static inline function. The compiler can" +" ignore it and decide to not inline the function." +msgstr "让编译器始终内联静态的内联函数。编译器可以忽略它并决定不内联该函数。" + +#: ../../c-api/intro.rst:389 +msgid "" +"Corresponds to ``always_inline`` attribute in GCC and ``__forceinline`` in " +"MSVC." +msgstr "在 GCC 中对应 ``always_inline`` 属性而在 MSVC 中对应 ``__forceinline``。" + +#: ../../c-api/intro.rst:392 +msgid "" +"It can be used to inline performance critical static inline functions when " +"building Python in debug mode with function inlining disabled. For example, " +"MSC disables function inlining when building in debug mode." +msgstr "它可被用来在禁用函数内联的调试模式下构建 Python 时内联性能关键的静态内联函数。例如,MSC 在调试模式下构建时就禁用了函数内联。" + +#: ../../c-api/intro.rst:396 +msgid "" +"Marking blindly a static inline function with Py_ALWAYS_INLINE can result in" +" worse performances (due to increased code size for example). The compiler " +"is usually smarter than the developer for the cost/benefit analysis." +msgstr "" +"随意使用 Py_ALWAYS_INLINE " +"标记静态内联函数可能导致更差的性能(例如由于增加了代码量)。对于成本/收益分析来说编译器通常都比开发者更聪明。" + +#: ../../c-api/intro.rst:400 +msgid "" +"If Python is :ref:`built in debug mode ` (if the " +":c:macro:`Py_DEBUG` macro is defined), the :c:macro:`Py_ALWAYS_INLINE` macro" +" does nothing." +msgstr "" +"如果 Python 是 :ref:`在调试模式下构建的 ` (即定义了 :c:macro:`Py_DEBUG` 宏),则 " +":c:macro:`Py_ALWAYS_INLINE` 宏将不做任何事情。" + +#: ../../c-api/intro.rst:403 +msgid "It must be specified before the function return type. Usage::" +msgstr "它必须在函数返回类型之前指明。用法::" + +#: ../../c-api/intro.rst:405 +msgid "static inline Py_ALWAYS_INLINE int random(void) { return 4; }" +msgstr "static inline Py_ALWAYS_INLINE int random(void) { return 4; }" + +#: ../../c-api/intro.rst:411 +msgid "" +"Disable inlining on a function. For example, it reduces the C stack " +"consumption: useful on LTO+PGO builds which heavily inline code (see " +":issue:`33720`)." +msgstr "禁用某个函数的内联。例如,它会减少 C 栈消耗:适用于大量内联代码的 LTO+PGO 编译版 (参见 :issue:`33720`)。" + +#: ../../c-api/intro.rst:415 +msgid "" +"Corresponds to the ``noinline`` attribute/specification on GCC and MSVC." +msgstr "在 GCC 和 MSVC 中对应 ``noinline`` 属性/规格。" + +#: ../../c-api/intro.rst:417 +msgid "Usage::" +msgstr "用法::" + +#: ../../c-api/intro.rst:419 +msgid "Py_NO_INLINE static int random(void) { return 4; }" +msgstr "Py_NO_INLINE static int random(void) { return 4; }" + +#: ../../c-api/intro.rst:425 +msgid "" +"Use this to declare APIs that were deprecated in a specific CPython version." +" The macro must be placed before the symbol name." +msgstr "" + +#: ../../c-api/intro.rst:430 +msgid "Py_DEPRECATED(3.8) PyAPI_FUNC(int) Py_OldFunction(void);" +msgstr "Py_DEPRECATED(3.8) PyAPI_FUNC(int) Py_OldFunction(void);" + +#: ../../c-api/intro.rst:432 +msgid "MSVC support was added." +msgstr "添加了 MSVC 支持。" + +#: ../../c-api/intro.rst:437 +msgid "" +"Declare a function returning the specified *type* using a fast-calling " +"qualifier for functions that are local to the current file. Semantically, " +"this is equivalent to :samp:`static {type}`." +msgstr "" + +#: ../../c-api/intro.rst:443 +msgid "" +"Equivalent to :c:macro:`Py_LOCAL` but additionally requests the function be " +"inlined." +msgstr "等价于 :c:macro:`Py_LOCAL` 但会额外请求函数是内联的。" + +#: ../../c-api/intro.rst:448 +msgid "" +"Macro used to declare a symbol as local to the shared library (hidden). On " +"supported platforms, it ensures the symbol is not exported." +msgstr "宏用于将符号声明为共享库的本地符号(隐藏的)。在支持的平台上,它确保符号不会导出。" + +#: ../../c-api/intro.rst:451 +msgid "" +"On compatible versions of GCC/Clang, it expands to " +"``__attribute__((visibility(\"hidden\")))``." +msgstr "在兼容的 GCC/Clang 版本中,它将扩展为 ``__attribute__((visibility(\"hidden\")))``。" + +#: ../../c-api/intro.rst:456 +msgid "" +"Macro used to declare a symbol (function or data) as exported. On Windows, " +"this expands to ``__declspec(dllexport)``. On compatible versions of " +"GCC/Clang, it expands to ``__attribute__((visibility(\"default\")))``. This " +"macro is for defining the C API itself; extension modules should not use it." +msgstr "" +"用于将符号(函数或数据)声明为导出的宏。在 Windows 上,这将扩展为 ``__declspec(dllexport)``。在兼容版本的 " +"GCC/Clang 上,它将扩展为 ``__attribute__((visibility(\"default\")))``。这个宏用于定义 C API" +" 本身;扩展模块不应使用它。" + +#: ../../c-api/intro.rst:465 +msgid "" +"Macro used to declare a symbol as imported. On Windows, this expands to " +"``__declspec(dllimport)``. This macro is for defining the C API itself; " +"extension modules should not use it." +msgstr "" +"用于将符号声明为已导入的宏。在 Windows 上,这扩展为 ``__declspec(dllimport)``。这个宏用于定义 C API " +"本身;扩展模块不应使用它。" + +#: ../../c-api/intro.rst:472 +msgid "" +"Macro used by CPython to declare a function as part of the C API. Its " +"expansion depends on the platform and build configuration. This macro is " +"intended for defining CPython's C API itself; extension modules should not " +"use it for their own symbols." +msgstr "" +"CPython 用来将函数声明为 C API 的一部分的宏。它的扩展取决于平台和构建配置。此宏用于定义 CPython 的 C API " +"本身;扩展模块不应将其用于自己的符号。" + +#: ../../c-api/intro.rst:480 +msgid "" +"Macro used by CPython to declare a public global variable as part of the C " +"API. Its expansion depends on the platform and build configuration. This " +"macro is intended for defining CPython's C API itself; extension modules " +"should not use it for their own symbols." +msgstr "" +"CPython 用于将公共全局变量声明为 C API 的一部分的宏。它的扩展取决于平台和构建配置。此宏用于定义 CPython 的 C API " +"本身;扩展模块不应将其用于自己的符号。" + +#: ../../c-api/intro.rst:487 +msgid "Outdated macros" +msgstr "过时的宏" + +#: ../../c-api/intro.rst:489 +msgid "" +"The following macros have been used to features that have been standardized " +"in C11." +msgstr "" + +#: ../../c-api/intro.rst:494 +msgid "Specify alignment to *num* bytes on compilers that support it." +msgstr "" + +#: ../../c-api/intro.rst:496 +msgid "" +"Consider using the C11 standard ``_Alignas`` specifier over this macro." +msgstr "" + +#: ../../c-api/intro.rst:501 +msgid "" +"Use *number* as a ``long long`` or ``unsigned long long`` integer literal, " +"respectively." +msgstr "" + +#: ../../c-api/intro.rst:504 +msgid "" +"Expands to *number* followed by ``LL`` or ``LLU``, respectively, but will " +"expand to some compiler-specific suffixes on some older compilers." +msgstr "" + +#: ../../c-api/intro.rst:507 +msgid "Consider using the C99 standard suffixes ``LL`` and ``LLU`` directly." +msgstr "" + +#: ../../c-api/intro.rst:511 +msgid "This is an alias to :c:func:`!memcpy`." +msgstr "" + +#: ../../c-api/intro.rst:513 +msgid "Use :c:func:`!memcpy` directly instead." +msgstr "" + +#: ../../c-api/intro.rst:518 +msgid "This is an alias to the C99-standard ``va_copy`` function." +msgstr "" + +#: ../../c-api/intro.rst:520 +msgid "" +"Historically, this would use a compiler-specific method to copy a " +"``va_list``." +msgstr "在历史上,它会使用一个编译器专属的方法来拷贝 ``va_list``。" + +#: ../../c-api/intro.rst:522 +msgid "This is now an alias to ``va_copy``." +msgstr "此名称现在是 ``va_copy`` 的别名。" + +#: ../../c-api/intro.rst:531 +msgid "Objects, Types and Reference Counts" +msgstr "对象、类型和引用计数" + +#: ../../c-api/intro.rst:535 +msgid "" +"Most Python/C API functions have one or more arguments as well as a return " +"value of type :c:expr:`PyObject*`. This type is a pointer to an opaque data" +" type representing an arbitrary Python object. Since all Python object " +"types are treated the same way by the Python language in most situations " +"(e.g., assignments, scope rules, and argument passing), it is only fitting " +"that they should be represented by a single C type. Almost all Python " +"objects live on the heap: you never declare an automatic or static variable " +"of type :c:type:`PyObject`, only pointer variables of type " +":c:expr:`PyObject*` can be declared. The sole exception are the type " +"objects; since these must never be deallocated, they are typically static " +":c:type:`PyTypeObject` objects." +msgstr "" +"多数 Python/C API 函数都有一个或多个参数以及一个 :c:expr:`PyObject*` 类型的返回值。这种类型是指向任意 Python " +"对象的不透明数据类型的指针。由于所有 Python 对象类型在大多数情况下都被 Python " +"语言用相同的方式处理(例如,赋值、作用域规则和参数传递等),因此用单个 C 类型来表示它们是很适宜的。几乎所有 Python " +"对象都存在于堆中:你不可声明一个类型为 :c:type:`PyObject` 的自动或静态的变量,只能声明类型为 :c:expr:`PyObject*`" +" 的指针变量。唯一的例外是 type 对象;因为这种对象永远不能被释放,所以它们通常都是静态的 :c:type:`PyTypeObject` 对象。" + +#: ../../c-api/intro.rst:546 +msgid "" +"All Python objects (even Python integers) have a :dfn:`type` and a " +":dfn:`reference count`. An object's type determines what kind of object it " +"is (e.g., an integer, a list, or a user-defined function; there are many " +"more as explained in :ref:`types`). For each of the well-known types there " +"is a macro to check whether an object is of that type; for instance, " +"``PyList_Check(a)`` is true if (and only if) the object pointed to by *a* is" +" a Python list." +msgstr "" +"所有 Python 对象(甚至 Python 整数)都有一个 :dfn:`type` 和一个 :dfn:`reference " +"count`。对象的类型确定它是什么类型的对象(例如整数、列表或用户定义函数;还有更多,如 :ref:`types` " +"中所述)。对于每个众所周知的类型,都有一个宏来检查对象是否属于该类型;例如,当(且仅当) *a* 所指的对象是 Python 列表时 " +"``PyList_Check(a)`` 为真。" + +#: ../../c-api/intro.rst:557 +msgid "Reference Counts" +msgstr "引用计数" + +#: ../../c-api/intro.rst:559 +msgid "" +"The reference count is important because today's computers have a finite " +"(and often severely limited) memory size; it counts how many different " +"places there are that have a :term:`strong reference` to an object. Such a " +"place could be another object, or a global (or static) C variable, or a " +"local variable in some C function. When the last :term:`strong reference` to" +" an object is released (i.e. its reference count becomes zero), the object " +"is deallocated. If it contains references to other objects, those references" +" are released. Those other objects may be deallocated in turn, if there are " +"no more references to them, and so on. (There's an obvious problem with " +"objects that reference each other here; for now, the solution is \"don't do " +"that.\")" +msgstr "" +"引用计数之所以重要是因为现有计算机的内存大小是有限的(并且往往限制得很严格);它会计算有多少不同的地方对一个对象进行了 :term:`strong " +"reference`。这些地方可以是另一个对象,也可以是全局(或静态)C 变量,或是某个 C 函数中的局部变量。当某个对象的最后一个 " +":term:`strong reference` " +"被释放时(即其引用计数变为零),该对象就会被取消分配。如果该对象包含对其他对象的引用,则会释放这些引用。如果不再有对其他对象的引用,这些对象也会同样地被取消分配,依此类推。(在这里对象之间的相互引用显然是个问题;目前的解决办法,就是“不要这样做”。)" + +#: ../../c-api/intro.rst:576 +msgid "" +"Reference counts are always manipulated explicitly. The normal way is to " +"use the macro :c:func:`Py_INCREF` to take a new reference to an object (i.e." +" increment its reference count by one), and :c:func:`Py_DECREF` to release " +"that reference (i.e. decrement the reference count by one). The " +":c:func:`Py_DECREF` macro is considerably more complex than the incref one, " +"since it must check whether the reference count becomes zero and then cause " +"the object's deallocator to be called. The deallocator is a function " +"pointer contained in the object's type structure. The type-specific " +"deallocator takes care of releasing references for other objects contained " +"in the object if this is a compound object type, such as a list, as well as " +"performing any additional finalization that's needed. There's no chance " +"that the reference count can overflow; at least as many bits are used to " +"hold the reference count as there are distinct memory locations in virtual " +"memory (assuming ``sizeof(Py_ssize_t) >= sizeof(void*)``). Thus, the " +"reference count increment is a simple operation." +msgstr "" +"对于引用计数总是会显式地执行操作。通常的做法是使用 :c:func:`Py_INCREF` 宏来获取对象的新引用(即让引用计数加一),并使用 " +":c:func:`Py_DECREF` 宏来释放引用(即让引用计数减一)。:c:func:`Py_DECREF` 宏比 incref " +"宏复杂得多,因为它必须检查引用计数是否为零然后再调用对象的释放器。释放器是一个函数指针,它包含在对象的类型结构体中。如果对象是复合对象类型,如列表,则特定于类型的释放器会负责释放对象中包含的其他对象的引用,并执行所需的其他终结化操作。引用计数不会发生溢出;用于保存引用计数的位数至少会与虚拟内存中不同内存位置的位数相同" +" (假设 ``sizeof(Py_ssize_t) >= sizeof(void*)``)。因此,引用计数的递增是一个简单的操作。" + +#: ../../c-api/intro.rst:592 +msgid "" +"It is not necessary to hold a :term:`strong reference` (i.e. increment the " +"reference count) for every local variable that contains a pointer to an " +"object. In theory, the object's reference count goes up by one when the " +"variable is made to point to it and it goes down by one when the variable " +"goes out of scope. However, these two cancel each other out, so at the end" +" the reference count hasn't changed. The only real reason to use the " +"reference count is to prevent the object from being deallocated as long as " +"our variable is pointing to it. If we know that there is at least one " +"other reference to the object that lives at least as long as our variable, " +"there is no need to take a new :term:`strong reference` (i.e. increment the " +"reference count) temporarily. An important situation where this arises is in" +" objects that are passed as arguments to C functions in an extension module" +" that are called from Python; the call mechanism guarantees to hold a " +"reference to every argument for the duration of the call." +msgstr "" +"没有必要为每个包含指向对象指针的局部变量持有 :term:`strong reference` " +"(即增加引用计数)。理论上说,当变量指向对象时对象的引用计数就会加一,而当变量离开其作用域时引用计数就会减一。不过,这两种情况会相互抵消,所以最后引用计数并没有改变。使用引用计数的唯一真正原因在于只要我们的变量指向对象就可以防止对象被释放。只要我们知道至少还有一个指向某对象的引用与我们的变量同时存在,就没有必要临时获取一个新的" +" :term:`strong reference` (即增加引用计数)。出现引用计数增加的一种重要情况是对象作为参数被传递给扩展模块中的 C " +"函数而这些函数又在 Python 中被调用;调用机制会保证在调用期间对每个参数持有一个引用。" + +#: ../../c-api/intro.rst:608 +msgid "" +"However, a common pitfall is to extract an object from a list and hold on to" +" it for a while without taking a new reference. Some other operation might " +"conceivably remove the object from the list, releasing that reference, and " +"possibly deallocating it. The real danger is that innocent-looking " +"operations may invoke arbitrary Python code which could do this; there is a " +"code path which allows control to flow back to the user from a " +":c:func:`Py_DECREF`, so almost any operation is potentially dangerous." +msgstr "" +"然而,一个常见的陷阱是从列表中提取对象并在不获取新引用的情况下将其保留一段时间。某个其他操作可能在无意中从列表中移除该对象,释放这个引用,并可能撤销分配其资源。真正的危险在于看似无害的操作可能会调用任意的" +" Python 代码来做这件事;有一条代码路径允许控制权从 :c:func:`Py_DECREF` 流回到用户,因此几乎任何操作都有潜在的危险。" + +#: ../../c-api/intro.rst:616 +msgid "" +"A safe approach is to always use the generic operations (functions whose " +"name begins with ``PyObject_``, ``PyNumber_``, ``PySequence_`` or " +"``PyMapping_``). These operations always create a new :term:`strong " +"reference` (i.e. increment the reference count) of the object they return. " +"This leaves the caller with the responsibility to call :c:func:`Py_DECREF` " +"when they are done with the result; this soon becomes second nature." +msgstr "" +"安全的做法是始终使用泛型操作(名称以 ``PyObject_``, ``PyNumber_``, ``PySequence_`` 或 " +"``PyMapping_`` 开头的函数)。这些操作总是为其返回的对象创建一个新的 :term:`strong reference` " +"(即增加引用计数)。这使得调用者有责任在获得结果之后调用 :c:func:`Py_DECREF`;这种做法很快就能习惯成自然。" + +#: ../../c-api/intro.rst:627 +msgid "Reference Count Details" +msgstr "引用计数细节" + +#: ../../c-api/intro.rst:629 +msgid "" +"The reference count behavior of functions in the Python/C API is best " +"explained in terms of *ownership of references*. Ownership pertains to " +"references, never to objects (objects are not owned: they are always " +"shared). \"Owning a reference\" means being responsible for calling " +"Py_DECREF on it when the reference is no longer needed. Ownership can also " +"be transferred, meaning that the code that receives ownership of the " +"reference then becomes responsible for eventually releasing it by calling " +":c:func:`Py_DECREF` or :c:func:`Py_XDECREF` when it's no longer needed---or " +"passing on this responsibility (usually to its caller). When a function " +"passes ownership of a reference on to its caller, the caller is said to " +"receive a *new* reference. When no ownership is transferred, the caller is " +"said to *borrow* the reference. Nothing needs to be done for a " +":term:`borrowed reference`." +msgstr "" +"Python/C API 中函数的引用计数最好是使用 *引用所有权* " +"来解释。所有权是关联到引用,而不是对象(对象不能被拥有:它们总是会被共享)。“拥有一个引用”意味着当不再需要该引用时必须在其上调用 " +"Py_DECREF。所有权也可以被转移,这意味着接受该引用所有权的代码在不再需要它时必须通过调用 :c:func:`Py_DECREF` 或 " +":c:func:`Py_XDECREF` 来最终释放它 --- " +"或是继续转移这个责任(通常是转给其调用方)。当一个函数将引用所有权转给其调用方时,则称调用方收到一个 *新的* 引用。当未转移所有权时,则称调用方是 " +"*借入* 这个引用。对于 :term:`borrowed reference` 来说不需要任何额外操作。" + +#: ../../c-api/intro.rst:642 +msgid "" +"Conversely, when a calling function passes in a reference to an object, " +"there are two possibilities: the function *steals* a reference to the " +"object, or it does not." +msgstr "" + +#: ../../c-api/intro.rst:646 +msgid "" +"*Stealing a reference* means that when you pass a reference to a function, " +"that function assumes that it now owns that reference. Since the new owner " +"can use :c:func:`!Py_DECREF` at its discretion, you (the caller) must not " +"use that reference after the call." +msgstr "" + +#: ../../c-api/intro.rst:655 +msgid "" +"Few functions steal references; the two notable exceptions are " +":c:func:`PyList_SetItem` and :c:func:`PyTuple_SetItem`, which steal a " +"reference to the item (but not to the tuple or list into which the item is " +"put!). These functions were designed to steal a reference because of a " +"common idiom for populating a tuple or list with newly created objects; for " +"example, the code to create the tuple ``(1, 2, \"three\")`` could look like " +"this (forgetting about error handling for the moment; a better way to code " +"this is shown below)::" +msgstr "" +"很少有函数会窃取引用;两个重要的例外是 :c:func:`PyList_SetItem` 和 " +":c:func:`PyTuple_SetItem`,它们会窃取对条目的引用(但不是条目所在的元组或列表!)。这些函数被设计为会窃取引用是因为在使用新创建的对象来填充元组或列表时有一个通常的惯例;例如,创建元组" +" ``(1, 2, \"three\")`` 的代码看起来可以是这样的(暂时不要管错误处理;下面会显示更好的代码编写方式)::" + +#: ../../c-api/intro.rst:663 +msgid "" +"PyObject *t;\n" +"\n" +"t = PyTuple_New(3);\n" +"PyTuple_SetItem(t, 0, PyLong_FromLong(1L));\n" +"PyTuple_SetItem(t, 1, PyLong_FromLong(2L));\n" +"PyTuple_SetItem(t, 2, PyUnicode_FromString(\"three\"));" +msgstr "" +"PyObject *t;\n" +"\n" +"t = PyTuple_New(3);\n" +"PyTuple_SetItem(t, 0, PyLong_FromLong(1L));\n" +"PyTuple_SetItem(t, 1, PyLong_FromLong(2L));\n" +"PyTuple_SetItem(t, 2, PyUnicode_FromString(\"three\"));" + +#: ../../c-api/intro.rst:670 +msgid "" +"Here, :c:func:`PyLong_FromLong` returns a new reference which is immediately" +" stolen by :c:func:`PyTuple_SetItem`. When you want to keep using an object" +" although the reference to it will be stolen, use :c:func:`Py_INCREF` to " +"grab another reference before calling the reference-stealing function." +msgstr "" +"在这里,:c:func:`PyLong_FromLong` 返回了一个新的引用并且它立即被 :c:func:`PyTuple_SetItem` 所窃取。" +" 当你想要继续使用一个对象而对它的引用将被窃取时,请在调用窃取引用的函数之前使用 :c:func:`Py_INCREF` 来抓取另一个引用。" + +#: ../../c-api/intro.rst:675 +msgid "" +"Incidentally, :c:func:`PyTuple_SetItem` is the *only* way to set tuple " +"items; :c:func:`PySequence_SetItem` and :c:func:`PyObject_SetItem` refuse to" +" do this since tuples are an immutable data type. You should only use " +":c:func:`PyTuple_SetItem` for tuples that you are creating yourself." +msgstr "" +"顺便提一下,:c:func:`PyTuple_SetItem` 是设置元组条目的 *唯一* " +"方式;:c:func:`PySequence_SetItem` 和 :c:func:`PyObject_SetItem` " +"会拒绝这样做因为元组是不可变数据类型。你应当只对你自己创建的元组使用 :c:func:`PyTuple_SetItem`。" + +#: ../../c-api/intro.rst:680 +msgid "" +"Equivalent code for populating a list can be written using " +":c:func:`PyList_New` and :c:func:`PyList_SetItem`." +msgstr "等价于填充一个列表的代码可以使用 :c:func:`PyList_New` 和 :c:func:`PyList_SetItem` 来编写。" + +#: ../../c-api/intro.rst:683 +msgid "" +"However, in practice, you will rarely use these ways of creating and " +"populating a tuple or list. There's a generic function, " +":c:func:`Py_BuildValue`, that can create most common objects from C values, " +"directed by a :dfn:`format string`. For example, the above two blocks of " +"code could be replaced by the following (which also takes care of the error " +"checking)::" +msgstr "" +"然而,在实践中,你很少会使用这些创建和填充元组或列表的方式。有一个通用的函数 :c:func:`Py_BuildValue` 可以根据 C " +"值来创建大多数常用对象,由一个 :dfn:`格式字符串` 来指明。例如,上面的两个代码块可以用下面的代码来代替(还会负责错误检测)::" + +#: ../../c-api/intro.rst:689 +msgid "" +"PyObject *tuple, *list;\n" +"\n" +"tuple = Py_BuildValue(\"(iis)\", 1, 2, \"three\");\n" +"list = Py_BuildValue(\"[iis]\", 1, 2, \"three\");" +msgstr "" +"PyObject *tuple, *list;\n" +"\n" +"tuple = Py_BuildValue(\"(iis)\", 1, 2, \"three\");\n" +"list = Py_BuildValue(\"[iis]\", 1, 2, \"three\");" + +#: ../../c-api/intro.rst:694 +msgid "" +"It is much more common to use :c:func:`PyObject_SetItem` and friends with " +"items whose references you are only borrowing, like arguments that were " +"passed in to the function you are writing. In that case, their behaviour " +"regarding references is much saner, since you don't have to take a new " +"reference just so you can give that reference away (\"have it be stolen\")." +" For example, this function sets all items of a list (actually, any mutable" +" sequence) to a given item::" +msgstr "" +"在对条目使用 :c:func:`PyObject_SetItem` " +"等操作时更常见的做法是只借入引用,比如将参数传递给你正在编写的函数。在这种情况下,它们在引用方面的行为更为清晰,因为你不必为了把引用转走而获取一个新的引用(“让它被偷取”)。例如,这个函数将列表(实际上是任何可变序列)中的所有条目都设为给定的条目::" + +#: ../../c-api/intro.rst:701 +msgid "" +"int\n" +"set_all(PyObject *target, PyObject *item)\n" +"{\n" +" Py_ssize_t i, n;\n" +"\n" +" n = PyObject_Length(target);\n" +" if (n < 0)\n" +" return -1;\n" +" for (i = 0; i < n; i++) {\n" +" PyObject *index = PyLong_FromSsize_t(i);\n" +" if (!index)\n" +" return -1;\n" +" if (PyObject_SetItem(target, index, item) < 0) {\n" +" Py_DECREF(index);\n" +" return -1;\n" +" }\n" +" Py_DECREF(index);\n" +" }\n" +" return 0;\n" +"}" +msgstr "" +"int\n" +"set_all(PyObject *target, PyObject *item)\n" +"{\n" +" Py_ssize_t i, n;\n" +"\n" +" n = PyObject_Length(target);\n" +" if (n < 0)\n" +" return -1;\n" +" for (i = 0; i < n; i++) {\n" +" PyObject *index = PyLong_FromSsize_t(i);\n" +" if (!index)\n" +" return -1;\n" +" if (PyObject_SetItem(target, index, item) < 0) {\n" +" Py_DECREF(index);\n" +" return -1;\n" +" }\n" +" Py_DECREF(index);\n" +" }\n" +" return 0;\n" +"}" + +#: ../../c-api/intro.rst:724 +msgid "" +"The situation is slightly different for function return values. While " +"passing a reference to most functions does not change your ownership " +"responsibilities for that reference, many functions that return a reference" +" to an object give you ownership of the reference. The reason is simple: in " +"many cases, the returned object is created on the fly, and the reference " +"you get is the only reference to the object. Therefore, the generic " +"functions that return object references, like :c:func:`PyObject_GetItem` and" +" :c:func:`PySequence_GetItem`, always return a new reference (the caller " +"becomes the owner of the reference)." +msgstr "" +"对于函数返回值的情况略有不同。虽然向大多数函数传递一个引用不会改变你对该引用的所有权责任,但许多返回一个引用的函数会给你该引用的所有权。原因很简单:在许多情况下,返回的对象是临时创建的,而你得到的引用是对该对象的唯一引用。因此,返回对象引用的通用函数,如" +" :c:func:`PyObject_GetItem` 和 " +":c:func:`PySequence_GetItem`,将总是返回一个新的引用(调用方将成为该引用的所有者)。" + +#: ../../c-api/intro.rst:733 +msgid "" +"It is important to realize that whether you own a reference returned by a " +"function depends on which function you call only --- *the plumage* (the type" +" of the object passed as an argument to the function) *doesn't enter into " +"it!* Thus, if you extract an item from a list using " +":c:func:`PyList_GetItem`, you don't own the reference --- but if you obtain " +"the same item from the same list using :c:func:`PySequence_GetItem` (which " +"happens to take exactly the same arguments), you do own a reference to the " +"returned object." +msgstr "" +"一个需要了解的重点在于你是否拥有一个由函数返回的引用只取决于你所调用的函数 --- *附带物* (作为参数传给函数的对象的类型) *不会带来额外影响!*" +" 因此,如果你使用 :c:func:`PyList_GetItem` 从一个列表提取条目,你并不会拥有其引用 --- 但是如果你使用 " +":c:func:`PySequence_GetItem` (它恰好接受完全相同的参数) 从同一个列表获取同样的条目,你就会拥有一个对所返回对象的引用。" + +#: ../../c-api/intro.rst:745 +msgid "" +"Here is an example of how you could write a function that computes the sum " +"of the items in a list of integers; once using :c:func:`PyList_GetItem`, " +"and once using :c:func:`PySequence_GetItem`. ::" +msgstr "" +"下面是说明你要如何编写一个函数来计算一个整数列表中条目的示例;一个是使用 :c:func:`PyList_GetItem`,而另一个是使用 " +":c:func:`PySequence_GetItem` 函数::" + +#: ../../c-api/intro.rst:749 +msgid "" +"long\n" +"sum_list(PyObject *list)\n" +"{\n" +" Py_ssize_t i, n;\n" +" long total = 0, value;\n" +" PyObject *item;\n" +"\n" +" n = PyList_Size(list);\n" +" if (n < 0)\n" +" return -1; /* Not a list */\n" +" for (i = 0; i < n; i++) {\n" +" item = PyList_GetItem(list, i); /* Can't fail */\n" +" if (!PyLong_Check(item)) continue; /* Skip non-integers */\n" +" value = PyLong_AsLong(item);\n" +" if (value == -1 && PyErr_Occurred())\n" +" /* Integer too big to fit in a C long, bail out */\n" +" return -1;\n" +" total += value;\n" +" }\n" +" return total;\n" +"}" +msgstr "" +"long\n" +"sum_list(PyObject *list)\n" +"{\n" +" Py_ssize_t i, n;\n" +" long total = 0, value;\n" +" PyObject *item;\n" +"\n" +" n = PyList_Size(list);\n" +" if (n < 0)\n" +" return -1; /* Not a list */\n" +" for (i = 0; i < n; i++) {\n" +" item = PyList_GetItem(list, i); /* 不能失败 */\n" +" if (!PyLong_Check(item)) continue; /* 跳过非整数 */\n" +" value = PyLong_AsLong(item);\n" +" if (value == -1 && PyErr_Occurred())\n" +" /* 太大的整数无法适应 C long 类型,放弃 */\n" +" return -1;\n" +" total += value;\n" +" }\n" +" return total;\n" +"}" + +#: ../../c-api/intro.rst:775 +msgid "" +"long\n" +"sum_sequence(PyObject *sequence)\n" +"{\n" +" Py_ssize_t i, n;\n" +" long total = 0, value;\n" +" PyObject *item;\n" +" n = PySequence_Length(sequence);\n" +" if (n < 0)\n" +" return -1; /* Has no length */\n" +" for (i = 0; i < n; i++) {\n" +" item = PySequence_GetItem(sequence, i);\n" +" if (item == NULL)\n" +" return -1; /* Not a sequence, or other failure */\n" +" if (PyLong_Check(item)) {\n" +" value = PyLong_AsLong(item);\n" +" Py_DECREF(item);\n" +" if (value == -1 && PyErr_Occurred())\n" +" /* Integer too big to fit in a C long, bail out */\n" +" return -1;\n" +" total += value;\n" +" }\n" +" else {\n" +" Py_DECREF(item); /* Discard reference ownership */\n" +" }\n" +" }\n" +" return total;\n" +"}" +msgstr "" +"long\n" +"sum_sequence(PyObject *sequence)\n" +"{\n" +" Py_ssize_t i, n;\n" +" long total = 0, value;\n" +" PyObject *item;\n" +" n = PySequence_Length(sequence);\n" +" if (n < 0)\n" +" return -1; /* 没有长度 */\n" +" for (i = 0; i < n; i++) {\n" +" item = PySequence_GetItem(sequence, i);\n" +" if (item == NULL)\n" +" return -1; /* 不是序列,或其他错误 */\n" +" if (PyLong_Check(item)) {\n" +" value = PyLong_AsLong(item);\n" +" Py_DECREF(item);\n" +" if (value == -1 && PyErr_Occurred())\n" +" /* 太大的整数无法适应 C long 类型,放弃 */\n" +" return -1;\n" +" total += value;\n" +" }\n" +" else {\n" +" Py_DECREF(item); /* 丢弃引用所有权 */\n" +" }\n" +" }\n" +" return total;\n" +"}" + +#: ../../c-api/intro.rst:809 +msgid "Types" +msgstr "类型" + +#: ../../c-api/intro.rst:811 +msgid "" +"There are few other data types that play a significant role in the Python/C" +" API; most are simple C types such as :c:expr:`int`, :c:expr:`long`, " +":c:expr:`double` and :c:expr:`char*`. A few structure types are used to " +"describe static tables used to list the functions exported by a module or " +"the data attributes of a new object type, and another is used to describe " +"the value of a complex number. These will be discussed together with the " +"functions that use them." +msgstr "" +"在 Python/C API 中扮演重要角色的其他数据类型很少;大多为简单 C 类型如 :c:expr:`int`, :c:expr:`long`, " +":c:expr:`double` 和 :c:expr:`char*` " +"等。有一些结构类型被用来描述静态表格以列出模块所导出的函数或新对象类型的数据属性,还有一个结构类型被用来描述复数的值。这些结构类型将与使用它们的函数放到一起讨论。" + +#: ../../c-api/intro.rst:821 +msgid "" +"A signed integral type such that ``sizeof(Py_ssize_t) == sizeof(size_t)``. " +"C99 doesn't define such a thing directly (size_t is an unsigned integral " +"type). See :pep:`353` for details. ``PY_SSIZE_T_MAX`` is the largest " +"positive value of type :c:type:`Py_ssize_t`." +msgstr "" +"一个使得 ``sizeof(Py_ssize_t) == sizeof(size_t)`` 的有符号整数类型。C99 " +"没有直接定义这样的东西(size_t 是一个无符号整数类型)。请参阅 :pep:`353` 了解详情。``PY_SSIZE_T_MAX`` 是 " +":c:type:`Py_ssize_t` 类型的最大正数值。" + +#: ../../c-api/intro.rst:830 +msgid "Exceptions" +msgstr "异常" + +#: ../../c-api/intro.rst:832 +msgid "" +"The Python programmer only needs to deal with exceptions if specific error " +"handling is required; unhandled exceptions are automatically propagated to " +"the caller, then to the caller's caller, and so on, until they reach the " +"top-level interpreter, where they are reported to the user accompanied by a" +" stack traceback." +msgstr "" +"Python " +"程序员只需要处理特定需要处理的错误异常;未处理的异常会自动传递给调用者,然后传递给调用者的调用者,依此类推,直到它们到达顶级解释器,在那里将它们报告给用户并伴随堆栈回溯。" + +#: ../../c-api/intro.rst:840 +msgid "" +"For C programmers, however, error checking always has to be explicit. All " +"functions in the Python/C API can raise exceptions, unless an explicit claim" +" is made otherwise in a function's documentation. In general, when a " +"function encounters an error, it sets an exception, discards any object " +"references that it owns, and returns an error indicator. If not documented " +"otherwise, this indicator is either ``NULL`` or ``-1``, depending on the " +"function's return type. A few functions return a Boolean true/false result, " +"with false indicating an error. Very few functions return no explicit error" +" indicator or have an ambiguous return value, and require explicit testing " +"for errors with :c:func:`PyErr_Occurred`. These exceptions are always " +"explicitly documented." +msgstr "" +"然而,对于 C 程序员来说,错误检查必须总是显式进行的。Python/C API " +"中的所有函数都可以引发异常,除非在函数的文档中另外显式声明。一般来说,当一个函数遇到错误时,它会设置一个异常,丢弃它所拥有的任何对象引用,并返回一个错误标示。如果没有说明例外的文档,这个标示将为" +" ``NULL`` 或 " +"``-1``,具体取决于函数的返回类型。有少量函数会返回一个布尔真/假结果值,其中假值表示错误。有极少的函数没有显式的错误标示或是具有不明确的返回值,并需要用" +" :c:func:`PyErr_Occurred` 来进行显式的检测。这些例外总是会被明确地记入文档中。" + +#: ../../c-api/intro.rst:855 +msgid "" +"Exception state is maintained in per-thread storage (this is equivalent to " +"using global storage in an unthreaded application). A thread can be in one" +" of two states: an exception has occurred, or not. The function " +":c:func:`PyErr_Occurred` can be used to check for this: it returns a " +"borrowed reference to the exception type object when an exception has " +"occurred, and ``NULL`` otherwise. There are a number of functions to set " +"the exception state: :c:func:`PyErr_SetString` is the most common (though " +"not the most general) function to set the exception state, and " +":c:func:`PyErr_Clear` clears the exception state." +msgstr "" +"异常状态是在各个线程的存储中维护的(这相当于在一个无线程的应用中使用全局存储)。一个线程可以处在两种状态之一:异常已经发生,或者没有发生。函数 " +":c:func:`PyErr_Occurred` 可以被用来检查此状态:当异常发生时它将返回一个借入的异常类型对象的引用,在其他情况下则返回 " +"``NULL``。有多个函数可以设置异常状态::c:func:`PyErr_SetString` 是最常见的(尽管不是最通用的)设置异常状态的函数,而 " +":c:func:`PyErr_Clear` 可以清除异常状态。" + +#: ../../c-api/intro.rst:865 +msgid "" +"The full exception state consists of three objects (all of which can be " +"``NULL``): the exception type, the corresponding exception value, and the " +"traceback. These have the same meanings as the Python result of " +"``sys.exc_info()``; however, they are not the same: the Python objects " +"represent the last exception being handled by a Python :keyword:`try` ... " +":keyword:`except` statement, while the C level exception state only exists " +"while an exception is being passed on between C functions until it reaches " +"the Python bytecode interpreter's main loop, which takes care of " +"transferring it to ``sys.exc_info()`` and friends." +msgstr "" +"完整的异常状态由三个对象组成 (它们都可以为 ``NULL``): 异常类型、相应的异常值,以及回溯信息。这些对象的含义与 Python 中 " +"``sys.exc_info()`` 的结果相同;然而,它们并不是一样的:Python 对象代表由 Python :keyword:`try` ... " +":keyword:`except` 语句所处理的最后一个异常,而 C 层级的异常状态只在异常被传入到 C 函数或在它们之间传递时存在直至其到达 " +"Python 字节码解释器的主循环,该循环会负责将其转移至 ``sys.exc_info()`` 等处。" + +#: ../../c-api/intro.rst:877 +msgid "" +"Note that starting with Python 1.5, the preferred, thread-safe way to access" +" the exception state from Python code is to call the function " +":func:`sys.exc_info`, which returns the per-thread exception state for " +"Python code. Also, the semantics of both ways to access the exception state" +" have changed so that a function which catches an exception will save and " +"restore its thread's exception state so as to preserve the exception state " +"of its caller. This prevents common bugs in exception handling code caused " +"by an innocent-looking function overwriting the exception being handled; it " +"also reduces the often unwanted lifetime extension for objects that are " +"referenced by the stack frames in the traceback." +msgstr "" +"请注意自 Python 1.5 开始,从 Python 代码访问异常状态的首选的、线程安全的方式是调用函数 " +":func:`sys.exc_info`,它将返回 Python " +"代码的分线程异常状态。此外,这两种访问异常状态的方式的语义都发生了变化因而捕获到异常的函数将保存并恢复其线程的异常状态以保留其调用方的异常状态。这将防止异常处理代码中由一个看起来很无辜的函数覆盖了正在处理的异常所造成的常见错误;它还减少了回溯中由栈帧所引用的对象的往往不被需要的生命期延长。" + +#: ../../c-api/intro.rst:888 +msgid "" +"As a general principle, a function that calls another function to perform " +"some task should check whether the called function raised an exception, and" +" if so, pass the exception state on to its caller. It should discard any " +"object references that it owns, and return an error indicator, but it " +"should *not* set another exception --- that would overwrite the exception " +"that was just raised, and lose important information about the exact cause " +"of the error." +msgstr "" +"作为一般的原则,一个调用另一个函数来执行某些任务的函数应当检查被调用的函数是否引发了异常,并在引发异常时将异常状态传递给其调用方。它应当丢弃它所拥有的任何对象引用,并返回一个错误标示,但它" +" *不应* 设置另一个异常 --- 那会覆盖刚引发的异常,并丢失有关错误确切原因的重要信息。" + +#: ../../c-api/intro.rst:897 +msgid "" +"A simple example of detecting exceptions and passing them on is shown in the" +" :c:func:`!sum_sequence` example above. It so happens that this example " +"doesn't need to clean up any owned references when it detects an error. The" +" following example function shows some error cleanup. First, to remind you " +"why you like Python, we show the equivalent Python code::" +msgstr "" +"上面的 :c:func:`!sum_sequence` " +"示例是一个检测异常并将其传递出去的简单例子。碰巧的是这个示例在检测到错误时不需要清理所拥有的任何引用。下面的示例函数展示了一些错误清理操作。首先,为了提醒你为什么喜欢" +" Python,我们展示了等价的 Python 代码::" + +#: ../../c-api/intro.rst:903 +msgid "" +"def incr_item(dict, key):\n" +" try:\n" +" item = dict[key]\n" +" except KeyError:\n" +" item = 0\n" +" dict[key] = item + 1" +msgstr "" +"def incr_item(dict, key):\n" +" try:\n" +" item = dict[key]\n" +" except KeyError:\n" +" item = 0\n" +" dict[key] = item + 1" + +#: ../../c-api/intro.rst:912 +msgid "Here is the corresponding C code, in all its glory::" +msgstr "对应的 C 代码如下:" + +#: ../../c-api/intro.rst:914 +msgid "" +"int\n" +"incr_item(PyObject *dict, PyObject *key)\n" +"{\n" +" /* Objects all initialized to NULL for Py_XDECREF */\n" +" PyObject *item = NULL, *const_one = NULL, *incremented_item = NULL;\n" +" int rv = -1; /* Return value initialized to -1 (failure) */\n" +"\n" +" item = PyObject_GetItem(dict, key);\n" +" if (item == NULL) {\n" +" /* Handle KeyError only: */\n" +" if (!PyErr_ExceptionMatches(PyExc_KeyError))\n" +" goto error;\n" +"\n" +" /* Clear the error and use zero: */\n" +" PyErr_Clear();\n" +" item = PyLong_FromLong(0L);\n" +" if (item == NULL)\n" +" goto error;\n" +" }\n" +" const_one = PyLong_FromLong(1L);\n" +" if (const_one == NULL)\n" +" goto error;\n" +"\n" +" incremented_item = PyNumber_Add(item, const_one);\n" +" if (incremented_item == NULL)\n" +" goto error;\n" +"\n" +" if (PyObject_SetItem(dict, key, incremented_item) < 0)\n" +" goto error;\n" +" rv = 0; /* Success */\n" +" /* Continue with cleanup code */\n" +"\n" +" error:\n" +" /* Cleanup code, shared by success and failure path */\n" +"\n" +" /* Use Py_XDECREF() to ignore NULL references */\n" +" Py_XDECREF(item);\n" +" Py_XDECREF(const_one);\n" +" Py_XDECREF(incremented_item);\n" +"\n" +" return rv; /* -1 for error, 0 for success */\n" +"}" +msgstr "" +"int\n" +"incr_item(PyObject *dict, PyObject *key)\n" +"{\n" +" /* 对象全部初始化为 NULL 用于 Py_XDECREF */\n" +" PyObject *item = NULL, *const_one = NULL, *incremented_item = NULL;\n" +" int rv = -1; /* 返回值初始化为 -1 (失败) */\n" +"\n" +" item = PyObject_GetItem(dict, key);\n" +" if (item == NULL) {\n" +" /* 只处理 KeyError: */\n" +" if (!PyErr_ExceptionMatches(PyExc_KeyError))\n" +" goto error;\n" +"\n" +" /* 清除错误并使用零:*/\n" +" PyErr_Clear();\n" +" item = PyLong_FromLong(0L);\n" +" if (item == NULL)\n" +" goto error;\n" +" }\n" +" const_one = PyLong_FromLong(1L);\n" +" if (const_one == NULL)\n" +" goto error;\n" +"\n" +" incremented_item = PyNumber_Add(item, const_one);\n" +" if (incremented_item == NULL)\n" +" goto error;\n" +"\n" +" if (PyObject_SetItem(dict, key, incremented_item) < 0)\n" +" goto error;\n" +" rv = 0; /* 成功 */\n" +" /* 继续执行清理代码 */\n" +"\n" +" error:\n" +" /* 清理代码,由成功和失败路径所共享 */\n" +"\n" +" /* 使用 Py_XDECREF() 以忽略 NULL 引用 */\n" +" Py_XDECREF(item);\n" +" Py_XDECREF(const_one);\n" +" Py_XDECREF(incremented_item);\n" +"\n" +" return rv; /* -1 表示错误,0 表示成功 */\n" +"}" + +#: ../../c-api/intro.rst:964 +msgid "" +"This example represents an endorsed use of the ``goto`` statement in C! It " +"illustrates the use of :c:func:`PyErr_ExceptionMatches` and " +":c:func:`PyErr_Clear` to handle specific exceptions, and the use of " +":c:func:`Py_XDECREF` to dispose of owned references that may be ``NULL`` " +"(note the ``'X'`` in the name; :c:func:`Py_DECREF` would crash when " +"confronted with a ``NULL`` reference). It is important that the variables " +"used to hold owned references are initialized to ``NULL`` for this to work; " +"likewise, the proposed return value is initialized to ``-1`` (failure) and " +"only set to success after the final call made is successful." +msgstr "" +"这个例子代表了 C 语言中 ``goto`` 语句一种受到认可的用法!它说明了如何使用 :c:func:`PyErr_ExceptionMatches`" +" 和 :c:func:`PyErr_Clear` 来处理特定的异常,以及如何使用 :c:func:`Py_XDECREF` 来处理可能为 " +"``NULL`` 的自有引用(注意名称中的 ``'X'``;:c:func:`Py_DECREF` 在遇到 ``NULL`` " +"引用时将会崩溃)。重要的一点在于用来保存自有引用的变量要被初始化为 ``NULL`` 才能发挥作用;类似地,建议的返回值也要被初始化为 ``-1`` " +"(失败) 并且只有在最终执行的调用成功后才会被设置为成功。" + +#: ../../c-api/intro.rst:978 +msgid "Embedding Python" +msgstr "嵌入 Python" + +#: ../../c-api/intro.rst:980 +msgid "" +"The one important task that only embedders (as opposed to extension writers)" +" of the Python interpreter have to worry about is the initialization, and " +"possibly the finalization, of the Python interpreter. Most functionality of" +" the interpreter can only be used after the interpreter has been " +"initialized." +msgstr "" +"只有 Python " +"解释器的嵌入方(相对于扩展编写者而言)才需要担心的一项重要任务是它的初始化,可能还有它的最终化。解释器的大多数功能只有在解释器被初始化之后才能被使用。" + +#: ../../c-api/intro.rst:993 +msgid "" +"The basic initialization function is :c:func:`Py_Initialize`. This " +"initializes the table of loaded modules, and creates the fundamental modules" +" :mod:`builtins`, :mod:`__main__`, and :mod:`sys`. It also initializes the " +"module search path (``sys.path``)." +msgstr "" +"基本的初始化函数是 :c:func:`Py_Initialize`。此函数将初始化已加载模块表,并创建基本模块 :mod:`builtins`, " +":mod:`__main__` 和 :mod:`sys`。它还将初始化模块搜索路径 (``sys.path``)。" + +#: ../../c-api/intro.rst:998 +msgid "" +":c:func:`Py_Initialize` does not set the \"script argument list\" " +"(``sys.argv``). If this variable is needed by Python code that will be " +"executed later, setting :c:member:`PyConfig.argv` and " +":c:member:`PyConfig.parse_argv` must be set: see :ref:`Python Initialization" +" Configuration `." +msgstr "" +":c:func:`Py_Initialize` 不会设置 \"脚本参数列表\" (``sys.argv``)。如果稍后将要执行的 Python " +"代码需要此变量,则要设置 :c:member:`PyConfig.argv` 并且还要设置 " +":c:member:`PyConfig.parse_argv`: 参见 :ref:`Python 初始化配置 `。" + +#: ../../c-api/intro.rst:1003 +msgid "" +"On most systems (in particular, on Unix and Windows, although the details " +"are slightly different), :c:func:`Py_Initialize` calculates the module " +"search path based upon its best guess for the location of the standard " +"Python interpreter executable, assuming that the Python library is found in " +"a fixed location relative to the Python interpreter executable. In " +"particular, it looks for a directory named :file:`lib/python{X.Y}` relative " +"to the parent directory where the executable named :file:`python` is found " +"on the shell command search path (the environment variable :envvar:`PATH`)." +msgstr "" +"在大多数系统上(特别是 Unix 和 Windows,虽然在细节上有所不同),:c:func:`Py_Initialize` 将根据对标准 Python" +" 解释器可执行文件的位置的最佳猜测来计算模块搜索路径,并设定 Python 库可在相对于 Python " +"解释器可执行文件的固定位置上找到。特别地,它将相对于在 shell 命令搜索路径 (环境变量 :envvar:`PATH`) 上找到的名为 " +":file:`python` 的可执行文件所在父目录中查找名为 :file:`lib/python{X.Y}` 的目录。" + +#: ../../c-api/intro.rst:1012 +msgid "" +"For instance, if the Python executable is found in " +":file:`/usr/local/bin/python`, it will assume that the libraries are in " +":file:`/usr/local/lib/python{X.Y}`. (In fact, this particular path is also " +"the \"fallback\" location, used when no executable file named :file:`python`" +" is found along :envvar:`PATH`.) The user can override this behavior by " +"setting the environment variable :envvar:`PYTHONHOME`, or insert additional " +"directories in front of the standard path by setting :envvar:`PYTHONPATH`." +msgstr "" +"举例来说,如果 Python 可执行文件位于 :file:`/usr/local/bin/python`,它将假定库位于 " +":file:`/usr/local/lib/python{X.Y}`。(实际上,这个特定路径还将成为“回退”位置,会在当无法在 " +":envvar:`PATH` 中找到名为 :file:`python` 的可执行文件时被使用。)用户可以通过设置环境变量 " +":envvar:`PYTHONHOME`,或通过设置 :envvar:`PYTHONPATH` 在标准路径之前插入额外的目录来覆盖此行为。" + +#: ../../c-api/intro.rst:1026 +msgid "" +"The embedding application can steer the search by setting " +":c:member:`PyConfig.program_name` *before* calling " +":c:func:`Py_InitializeFromConfig`. Note that :envvar:`PYTHONHOME` still " +"overrides this and :envvar:`PYTHONPATH` is still inserted in front of the " +"standard path. An application that requires total control has to provide " +"its own implementation of :c:func:`Py_GetPath`, :c:func:`Py_GetPrefix`, " +":c:func:`Py_GetExecPrefix`, and :c:func:`Py_GetProgramFullPath` (all defined" +" in :file:`Modules/getpath.c`)." +msgstr "" +"嵌入的应用程序可以通过在调用 :c:func:`Py_InitializeFromConfig` *之前* 设置 " +":c:member:`PyConfig.program_name` 来调整搜索。请注意 :envvar:`PYTHONHOME` 仍然会覆盖此设置并且 " +":envvar:`PYTHONPATH` 仍然会被插入到标准路径之前。需要完整控制权的应用程序必须提供它自己的 " +":c:func:`Py_GetPath`, :c:func:`Py_GetPrefix`, :c:func:`Py_GetExecPrefix` 和 " +":c:func:`Py_GetProgramFullPath` 实现(这些函数均在 :file:`Modules/getpath.c` 中定义)。" + +#: ../../c-api/intro.rst:1037 +msgid "" +"Sometimes, it is desirable to \"uninitialize\" Python. For instance, the " +"application may want to start over (make another call to " +":c:func:`Py_Initialize`) or the application is simply done with its use of " +"Python and wants to free memory allocated by Python. This can be " +"accomplished by calling :c:func:`Py_FinalizeEx`. The function " +":c:func:`Py_IsInitialized` returns true if Python is currently in the " +"initialized state. More information about these functions is given in a " +"later chapter. Notice that :c:func:`Py_FinalizeEx` does *not* free all " +"memory allocated by the Python interpreter, e.g. memory allocated by " +"extension modules currently cannot be released." +msgstr "" +"有时,还需要对 Python 进行“反初始化”。例如,应用程序可能想要重新启动 (再次调用 :c:func:`Py_Initialize`) " +"或者应用程序对 Python 的使用已经完成并想要释放 Python 所分配的内存。这可以通过调用 :c:func:`Py_FinalizeEx` " +"来实现。如果当前 Python 处于已初始化状态则 :c:func:`Py_IsInitialized` " +"函数将返回真值。有关这些函数的更多信息将在之后的章节中给出。请注意 :c:func:`Py_FinalizeEx` *不会* 释放所有由 Python " +"解释器所分配的内存,例如由扩展模块所分配的内存目前是不会被释放的。" + +#: ../../c-api/intro.rst:1051 +msgid "Debugging Builds" +msgstr "调试构建" + +#: ../../c-api/intro.rst:1053 +msgid "" +"Python can be built with several macros to enable extra checks of the " +"interpreter and extension modules. These checks tend to add a large amount " +"of overhead to the runtime so they are not enabled by default." +msgstr "Python 可以附带某些宏来编译以启用对解释器和扩展模块的额外检查。这些检查会给运行时增加大量额外开销因此它们默认未被启用。" + +#: ../../c-api/intro.rst:1057 +msgid "" +"A full list of the various types of debugging builds is in the file " +":file:`Misc/SpecialBuilds.txt` in the Python source distribution. Builds are" +" available that support tracing of reference counts, debugging the memory " +"allocator, or low-level profiling of the main interpreter loop. Only the " +"most frequently used builds will be described in the remainder of this " +"section." +msgstr "" +"各种调试构建版的完整列表见 Python 源代码发行版中的 " +":file:`Misc/SpecialBuilds.txt`。可用的构建版有支持追踪引用计数,调试内存分配器,或是对主解释器循环的低层级性能分析等等。本节的剩余部分将只介绍最常用的几种构建版。" + +#: ../../c-api/intro.rst:1065 +msgid "" +"Compiling the interpreter with the :c:macro:`!Py_DEBUG` macro defined " +"produces what is generally meant by :ref:`a debug build of Python `. :c:macro:`!Py_DEBUG` is enabled in the Unix build by adding " +":option:`--with-pydebug` to the :file:`./configure` command. It is also " +"implied by the presence of the not-Python-specific :c:macro:`!_DEBUG` macro." +" When :c:macro:`!Py_DEBUG` is enabled in the Unix build, compiler " +"optimization is disabled." +msgstr "" +"在定义了 :c:macro:`!Py_DEBUG` 宏的情况下编译解释器将产生通常所称的 :ref:`Python 调试构建版 `。:c:macro:`!Py_DEBUG` 在 Unix 编译版中是通过添加 :option:`--with-pydebug` 到 " +":file:`./configure` 命令来启用的。它也可以通过提供非 Python 专属的 :c:macro:`!_DEBUG` 宏来启用。当 " +":c:macro:`!Py_DEBUG` 在 Unix 编译版中启用时,编译器优化将被禁用。" + +#: ../../c-api/intro.rst:1073 +msgid "" +"In addition to the reference count debugging described below, extra checks " +"are performed, see :ref:`Python Debug Build `." +msgstr "除了下文描述的引用计数调试,还会执行额外检查,请参阅 :ref:`Python Debug Build `。" + +#: ../../c-api/intro.rst:1076 +msgid "" +"Defining :c:macro:`Py_TRACE_REFS` enables reference tracing (see the " +":option:`configure --with-trace-refs option <--with-trace-refs>`). When " +"defined, a circular doubly linked list of active objects is maintained by " +"adding two extra fields to every :c:type:`PyObject`. Total allocations are " +"tracked as well. Upon exit, all existing references are printed. (In " +"interactive mode this happens after every statement run by the interpreter.)" +msgstr "" +"定义 :c:macro:`Py_TRACE_REFS` 将启用引用追踪 (参见 :option:`configure --with-trace-refs" +" 选项 <--with-trace-refs>`)。当定义了此宏时,将通过在每个 :c:type:`PyObject` " +"上添加两个额外字段来维护一个活动对象的循环双链列表。总的分配量也会被追踪。在退出时,所有现存的引用将被打印出来。(在交互模式下这将在解释器运行每条语句之后发生)。" + +#: ../../c-api/intro.rst:1083 +msgid "" +"Please refer to :file:`Misc/SpecialBuilds.txt` in the Python source " +"distribution for more detailed information." +msgstr "有关更多详细信息,请参阅 Python 源代码中的 :file:`Misc/SpecialBuilds.txt`。" + +#: ../../c-api/intro.rst:1090 +msgid "Recommended third party tools" +msgstr "推荐的第三方工具" + +#: ../../c-api/intro.rst:1092 +msgid "" +"The following third party tools offer both simpler and more sophisticated " +"approaches to creating C, C++ and Rust extensions for Python:" +msgstr "下列第三方工具提供了为 Python 创建 C, C++ 和 Rust 扩展的更简单或更高级的方式:" + +#: ../../c-api/intro.rst:1095 +msgid "`Cython `_" +msgstr "`Cython `_" + +#: ../../c-api/intro.rst:1096 +msgid "`cffi `_" +msgstr "`cffi `_" + +#: ../../c-api/intro.rst:1097 +msgid "`HPy `_" +msgstr "`HPy `_" + +#: ../../c-api/intro.rst:1098 +msgid "`nanobind `_ (C++)" +msgstr "`nanobind `_ (C++)" + +#: ../../c-api/intro.rst:1099 +msgid "`Numba `_" +msgstr "`Numba `_" + +#: ../../c-api/intro.rst:1100 +msgid "`pybind11 `_ (C++)" +msgstr "`pybind11 `_ (C++)" + +#: ../../c-api/intro.rst:1101 +msgid "`PyO3 `_ (Rust)" +msgstr "`PyO3 `_ (Rust)" + +#: ../../c-api/intro.rst:1102 +msgid "`SWIG `_" +msgstr "`SWIG `_" + +#: ../../c-api/intro.rst:1104 +msgid "" +"Using tools such as these can help avoid writing code that is tightly bound " +"to a particular version of CPython, avoid reference counting errors, and " +"focus more on your own code than on using the CPython API. In general, new " +"versions of Python can be supported by updating the tool, and your code will" +" often use newer and more efficient APIs automatically. Some tools also " +"support compiling for other implementations of Python from a single set of " +"sources." +msgstr "" +"使用这些工具可以避免编写与特定版本的 CPython 紧密绑定的代码,避免引用计数错误,并能更多地关注你自己的代码而不是关注如何使用 CPython " +"API。总的来说,Python 的新版本可通过更新此类工具来获得支持,并且你的代码通常都将自动使用更新且更高效的 " +"API。有些工具还支持基于单个源代码集针对其他 Python 实现进行编译。" + +#: ../../c-api/intro.rst:1111 +msgid "" +"These projects are not supported by the same people who maintain Python, and" +" issues need to be raised with the projects directly. Remember to check that" +" the project is still maintained and supported, as the list above may become" +" outdated." +msgstr "" +"这些项目并不是由维护 Python " +"的同一批人提供支持的,程序相关的问题需要直接向项目提出。请记得检查项目是否仍然获得维护与支持,因为上面的列表可能会变得过时。" + +#: ../../c-api/intro.rst:1118 +msgid "" +"`Python Packaging User Guide: Binary Extensions " +"`_" +msgstr "" +"`Python Packaging User Guide: Binary Extensions " +"`_" + +#: ../../c-api/intro.rst:1119 +msgid "" +"The Python Packaging User Guide not only covers several available tools that" +" simplify the creation of binary extensions, but also discusses the various " +"reasons why creating an extension module may be desirable in the first " +"place." +msgstr "Python Packaging User Guide 不仅涵盖了几个简化二进制扩展创建的可用工具,还讨论了创建扩展模块的各种理由。" + +#: ../../c-api/intro.rst:533 +msgid "object" +msgstr "object -- 对象" + +#: ../../c-api/intro.rst:533 +msgid "type" +msgstr "type" + +#: ../../c-api/intro.rst:572 +msgid "Py_INCREF (C function)" +msgstr "Py_INCREF (C 函数)" + +#: ../../c-api/intro.rst:572 +msgid "Py_DECREF (C function)" +msgstr "Py_DECREF (C 函数)" + +#: ../../c-api/intro.rst:651 +msgid "PyList_SetItem (C function)" +msgstr "PyList_SetItem (C 函数)" + +#: ../../c-api/intro.rst:651 +msgid "PyTuple_SetItem (C function)" +msgstr "PyTuple_SetItem (C 函数)" + +#: ../../c-api/intro.rst:722 +msgid "set_all()" +msgstr "set_all()" + +#: ../../c-api/intro.rst:741 +msgid "PyList_GetItem (C function)" +msgstr "PyList_GetItem (C 函数)" + +#: ../../c-api/intro.rst:741 +msgid "PySequence_GetItem (C function)" +msgstr "PySequence_GetItem (C 函数)" + +#: ../../c-api/intro.rst:771 +msgid "sum_list()" +msgstr "sum_list()" + +#: ../../c-api/intro.rst:803 ../../c-api/intro.rst:895 +msgid "sum_sequence()" +msgstr "sum_sequence()" + +#: ../../c-api/intro.rst:838 +msgid "PyErr_Occurred (C function)" +msgstr "PyErr_Occurred (C 函数)" + +#: ../../c-api/intro.rst:851 +msgid "PyErr_SetString (C function)" +msgstr "PyErr_SetString (C 函数)" + +#: ../../c-api/intro.rst:851 ../../c-api/intro.rst:959 +msgid "PyErr_Clear (C function)" +msgstr "PyErr_Clear (C 函数)" + +#: ../../c-api/intro.rst:875 +msgid "exc_info (in module sys)" +msgstr "exc_info (在 sys 模块中)" + +#: ../../c-api/intro.rst:910 ../../c-api/intro.rst:957 +msgid "incr_item()" +msgstr "incr_item()" + +#: ../../c-api/intro.rst:959 +msgid "PyErr_ExceptionMatches (C function)" +msgstr "PyErr_ExceptionMatches (C 函数)" + +#: ../../c-api/intro.rst:959 +msgid "Py_XDECREF (C function)" +msgstr "Py_XDECREF (C 函数)" + +#: ../../c-api/intro.rst:985 +msgid "Py_Initialize (C function)" +msgstr "Py_Initialize (C 函数)" + +#: ../../c-api/intro.rst:985 +msgid "module" +msgstr "module" + +#: ../../c-api/intro.rst:985 +msgid "builtins" +msgstr "builtins" + +#: ../../c-api/intro.rst:985 +msgid "__main__" +msgstr "__main__" + +#: ../../c-api/intro.rst:985 +msgid "sys" +msgstr "sys" + +#: ../../c-api/intro.rst:985 +msgid "search" +msgstr "搜索" + +#: ../../c-api/intro.rst:985 +msgid "path" +msgstr "path" + +#: ../../c-api/intro.rst:985 +msgid "path (in module sys)" +msgstr "path (在 sys 模块中)" + +#: ../../c-api/intro.rst:1020 +msgid "Py_GetPath (C function)" +msgstr "Py_GetPath (C 函数)" + +#: ../../c-api/intro.rst:1020 +msgid "Py_GetPrefix (C function)" +msgstr "Py_GetPrefix (C 函数)" + +#: ../../c-api/intro.rst:1020 +msgid "Py_GetExecPrefix (C function)" +msgstr "Py_GetExecPrefix (C 函数)" + +#: ../../c-api/intro.rst:1020 +msgid "Py_GetProgramFullPath (C function)" +msgstr "Py_GetProgramFullPath (C 函数)" + +#: ../../c-api/intro.rst:1035 +msgid "Py_IsInitialized (C function)" +msgstr "Py_IsInitialized (C 函数)" diff --git a/c-api/iter.po b/c-api/iter.po new file mode 100644 index 0000000000..4802af5ca4 --- /dev/null +++ b/c-api/iter.po @@ -0,0 +1,102 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:00+0000\n" +"Last-Translator: 99 , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/iter.rst:6 +msgid "Iterator Protocol" +msgstr "迭代器协议" + +#: ../../c-api/iter.rst:8 +msgid "There are two functions specifically for working with iterators." +msgstr "有两个专门用于处理迭代器的函数。" + +#: ../../c-api/iter.rst:12 +msgid "" +"Return non-zero if the object *o* can be safely passed to " +":c:func:`PyIter_NextItem` and ``0`` otherwise. This function always " +"succeeds." +msgstr "" +"如果对象 *o* 可以被安全地传给 :c:func:`PyIter_NextItem` 则返回非零值,否则返回 ``0``。此函数总是会成功执行。" + +#: ../../c-api/iter.rst:18 +msgid "" +"Return non-zero if the object *o* provides the :class:`AsyncIterator` " +"protocol, and ``0`` otherwise. This function always succeeds." +msgstr "如果对象 *o* 提供了 :class:`AsyncIterator` 协议则返回非零值,否则返回 ``0``。此函数总是会成功执行。" + +#: ../../c-api/iter.rst:25 +msgid "" +"Return ``1`` and set *item* to a :term:`strong reference` of the next value " +"of the iterator *iter* on success. Return ``0`` and set *item* to ``NULL`` " +"if there are no remaining values. Return ``-1``, set *item* to ``NULL`` and " +"set an exception on error." +msgstr "" +"成功时返回 ``1`` 并将 *item* 设为指向迭代器 *iter* 的下一个值的 :term:`strong reference`。 " +"如果已没有下一个值则返回 ``0`` 并将 *item* 设为 ``NULL``。出错时返回 ``-1``,将 *item* 设为 ``NULL`` " +"并设置一个异常。" + +#: ../../c-api/iter.rst:34 +msgid "" +"This is an older version of :c:func:`!PyIter_NextItem`, which is retained " +"for backwards compatibility. Prefer :c:func:`PyIter_NextItem`." +msgstr "" +"这是 :c:func:`!PyIter_NextItem` 的一个较旧版本,它被保留用于向下兼容。推荐使用 " +":c:func:`PyIter_NextItem` 函数。" + +#: ../../c-api/iter.rst:38 +msgid "" +"Return the next value from the iterator *o*. The object must be an iterator" +" according to :c:func:`PyIter_Check` (it is up to the caller to check this)." +" If there are no remaining values, returns ``NULL`` with no exception set. " +"If an error occurs while retrieving the item, returns ``NULL`` and passes " +"along the exception." +msgstr "" +"从迭代器 *o* 返回下一个值。对象必须可被 :c:func:`PyIter_Check` " +"确认为迭代器(需要调用方来负责检查)。如果没有剩余的值,则返回 ``NULL`` 并且不设置异常。如果在获取条目时发生了错误,则返回 ``NULL`` " +"并且传递异常。" + +#: ../../c-api/iter.rst:46 +msgid "" +"The enum value used to represent different results of :c:func:`PyIter_Send`." +msgstr "用于代表 :c:func:`PyIter_Send` 的不同结果的枚举值。" + +#: ../../c-api/iter.rst:53 +msgid "Sends the *arg* value into the iterator *iter*. Returns:" +msgstr "将 *arg* 值发送到迭代器 *iter*。返回:" + +#: ../../c-api/iter.rst:55 +msgid "" +"``PYGEN_RETURN`` if iterator returns. Return value is returned via " +"*presult*." +msgstr "``PYGEN_RETURN``,如果迭代器返回的话。返回值会通过 *presult* 来返回。" + +#: ../../c-api/iter.rst:56 +msgid "" +"``PYGEN_NEXT`` if iterator yields. Yielded value is returned via *presult*." +msgstr "``PYGEN_NEXT``,如果迭代器生成值的话。生成的值会通过 *presult* 来返回。" + +#: ../../c-api/iter.rst:57 +msgid "" +"``PYGEN_ERROR`` if iterator has raised an exception. *presult* is set to " +"``NULL``." +msgstr "" diff --git a/c-api/iterator.po b/c-api/iterator.po new file mode 100644 index 0000000000..8c56921e1a --- /dev/null +++ b/c-api/iterator.po @@ -0,0 +1,156 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/iterator.rst:6 +msgid "Iterator Objects" +msgstr "迭代器对象" + +#: ../../c-api/iterator.rst:8 +msgid "" +"Python provides two general-purpose iterator objects. The first, a sequence" +" iterator, works with an arbitrary sequence supporting the " +":meth:`~object.__getitem__` method. The second works with a callable object" +" and a sentinel value, calling the callable for each item in the sequence, " +"and ending the iteration when the sentinel value is returned." +msgstr "" +"Python 提供了两个通用迭代器对象。第一个是序列迭代器,它可与支持 :meth:`~object.__getitem__` " +"方法的任意序列一起使用。第二个迭代器使用一个可调用对象和一个哨兵值,为序列中的每个项目调用可调用对象,并在返回哨兵值时结束迭代。" + +#: ../../c-api/iterator.rst:17 +msgid "" +"Type object for iterator objects returned by :c:func:`PySeqIter_New` and the" +" one-argument form of the :func:`iter` built-in function for built-in " +"sequence types." +msgstr "" +"由 :c:func:`PySeqIter_New` 和内置序列类型的内置函数 :func:`iter` 的单参数形式所返回的迭代器对象的类型对象。" + +#: ../../c-api/iterator.rst:24 +msgid "" +"Return true if the type of *op* is :c:data:`PySeqIter_Type`. This function " +"always succeeds." +msgstr "如果 *op* 的类型为 :c:data:`PySeqIter_Type` 则返回真值。此函数总是会成功执行。" + +#: ../../c-api/iterator.rst:30 +msgid "" +"Return an iterator that works with a general sequence object, *seq*. The " +"iteration ends when the sequence raises :exc:`IndexError` for the " +"subscripting operation." +msgstr "返回一个与常规序列对象 *seq* 一起使用的迭代器。当序列下标操作引发 :exc:`IndexError` 时,迭代结束。" + +#: ../../c-api/iterator.rst:37 +msgid "" +"Type object for iterator objects returned by :c:func:`PyCallIter_New` and " +"the two-argument form of the :func:`iter` built-in function." +msgstr "由函数 :c:func:`PyCallIter_New` 和 :func:`iter` 内置函数的双参数形式返回的迭代器对象类型对象。" + +#: ../../c-api/iterator.rst:43 +msgid "" +"Return true if the type of *op* is :c:data:`PyCallIter_Type`. This function" +" always succeeds." +msgstr "如果 *op* 的类型为 :c:data:`PyCallIter_Type` 则返回真值。此函数总是会成功执行。" + +#: ../../c-api/iterator.rst:49 +msgid "" +"Return a new iterator. The first parameter, *callable*, can be any Python " +"callable object that can be called with no parameters; each call to it " +"should return the next item in the iteration. When *callable* returns a " +"value equal to *sentinel*, the iteration will be terminated." +msgstr "" +"返回一个新的迭代器。第一个参数 *callable* 可以是任何可以在没有参数的情况下调用的 Python " +"可调用对象;每次调用都应该返回迭代中的下一个项目。当 *callable* 返回等于 *sentinel* 的值时,迭代将终止。" + +#: ../../c-api/iterator.rst:56 +msgid "Range Objects" +msgstr "Range 对象" + +#: ../../c-api/iterator.rst:60 +msgid "The type object for :class:`range` objects." +msgstr ":class:`range` 对象的类型对象。" + +#: ../../c-api/iterator.rst:65 +msgid "" +"Return true if the object *o* is an instance of a :class:`range` object. " +"This function always succeeds." +msgstr "如果对象 *o* 是 :class:`range` 对象的实例则返回真值。此函数总是会成功执行。" + +#: ../../c-api/iterator.rst:70 +msgid "Builtin Iterator Types" +msgstr "内置迭代器类型" + +#: ../../c-api/iterator.rst:72 +msgid "" +"These are built-in iteration types that are included in Python's C API, but " +"provide no additional functions. They are here for completeness." +msgstr "这些是包括在 Python 的 C API 中的内置迭代类型,但未提供附加功能。将它们放在这里是为保持内容完整。" + +#: ../../c-api/iterator.rst:80 +msgid "C type" +msgstr "C 类型" + +#: ../../c-api/iterator.rst:81 +msgid "Python type" +msgstr "Python 类型" + +#: ../../c-api/iterator.rst:83 +msgid ":py:class:`enumerate`" +msgstr ":py:class:`enumerate`" + +#: ../../c-api/iterator.rst:85 +msgid ":py:class:`filter`" +msgstr ":py:class:`filter`" + +#: ../../c-api/iterator.rst:87 +msgid ":py:class:`map`" +msgstr ":py:class:`map`" + +#: ../../c-api/iterator.rst:89 +msgid ":py:class:`reversed`" +msgstr ":py:class:`reversed`" + +#: ../../c-api/iterator.rst:91 +msgid ":py:class:`zip`" +msgstr ":py:class:`zip`" + +#: ../../c-api/iterator.rst:95 +msgid "Other Iterator Objects" +msgstr "其他迭代器对象" + +#: ../../c-api/iterator.rst:113 +msgid "Type objects for iterators of various built-in objects." +msgstr "用于多种内置对象的迭代器的类型对象。" + +#: ../../c-api/iterator.rst:115 +msgid "" +"Do not create instances of these directly; prefer calling " +":c:func:`PyObject_GetIter` instead." +msgstr "请不要直接创建这些类型的实例;应改为调用 :c:func:`PyObject_GetIter`。" + +#: ../../c-api/iterator.rst:118 +msgid "" +"Note that there is no guarantee that a given built-in type uses a given " +"iterator type. For example, iterating over :class:`range` will use one of " +"two iterator types depending on the size of the range. Other types may start" +" using a similar scheme in the future, without warning." +msgstr "" +"请注意一个给定的内置类型并不保证会使用一个给定的迭代器类型。例如,对 :class:`range` 的迭代将根据 range " +"对象的大小使用两种迭代器类型之一。其他类型可能会在未来使用类似的方案,事先不会发出警告。" diff --git a/c-api/lifecycle.po b/c-api/lifecycle.po new file mode 100644 index 0000000000..042c4931d6 --- /dev/null +++ b/c-api/lifecycle.po @@ -0,0 +1,451 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/lifecycle.rst:6 +msgid "Object Life Cycle" +msgstr "对象生命周期" + +#: ../../c-api/lifecycle.rst:8 +msgid "" +"This section explains how a type's slots relate to each other throughout the" +" life of an object. It is not intended to be a complete canonical reference" +" for the slots; instead, refer to the slot-specific documentation in " +":ref:`type-structs` for details about a particular slot." +msgstr "" +"本章节介绍了在一个对象的整个生命周期内类型的槽位是如何彼此相互关联的。在此并不打算做成针对这些槽位的完整规范参考文档;对于此种需求,请参阅 " +":ref:`type-structs` 中槽位专属文档了解特定槽位的详情。" + +#: ../../c-api/lifecycle.rst:15 +msgid "Life Events" +msgstr "生命周期事件" + +#: ../../c-api/lifecycle.rst:17 +msgid "" +"The figure below illustrates the order of events that can occur throughout " +"an object's life. An arrow from *A* to *B* indicates that event *B* can " +"occur after event *A* has occurred, with the arrow's label indicating the " +"condition that must be true for *B* to occur after *A*." +msgstr "" +"下图说明了在对象的整个生命周期中可能发生的事件的顺序。从 *A* 到 *B* 的箭头表示事件 *B* 可以在事件 *A* " +"发生之后发生,箭头的标签表示在事件 *A* 之后发生 *B* 的条件必须为真。" + +#: ../../c-api/lifecycle.rst:55 ../../c-api/lifecycle.rst:62 +msgid "" +"Diagram showing events in an object's life. Explained in detail below." +msgstr "显示对象生命周期中的事件的图表。详细解释如下。" + +#: ../../c-api/lifecycle.rst:70 +msgid "Explanation:" +msgstr "解释:" + +#: ../../c-api/lifecycle.rst:72 +msgid "When a new object is constructed by calling its type:" +msgstr "当通过调用其类型构造一个新对象时:" + +#: ../../c-api/lifecycle.rst:74 +msgid ":c:member:`~PyTypeObject.tp_new` is called to create a new object." +msgstr "调用 :c:member:`~PyTypeObject.tp_new` 来创建一个新对象。" + +#: ../../c-api/lifecycle.rst:75 +msgid "" +":c:member:`~PyTypeObject.tp_alloc` is directly called by " +":c:member:`~PyTypeObject.tp_new` to allocate the memory for the new object." +msgstr "" +":c:member:`~PyTypeObject.tp_alloc` 由 :c:member:`~PyTypeObject.tp_new` " +"直接调用,为新对象分配内存。" + +#: ../../c-api/lifecycle.rst:78 +msgid "" +":c:member:`~PyTypeObject.tp_init` initializes the newly created object. " +":c:member:`!tp_init` can be called again to re-initialize an object, if " +"desired. The :c:member:`!tp_init` call can also be skipped entirely, for " +"example by Python code calling :py:meth:`~object.__new__`." +msgstr "" +":c:member:`~PyTypeObject.tp_init` 初始化新创建的对象。如果需要,可以再次调用 :c:member:`!tp_init`" +" 来重新初始化对象。也可以完全跳过 :c:member:`!tp_init` 调用,例如 Python 代码调用 " +":py:meth:`~object.__new__`。" + +#: ../../c-api/lifecycle.rst:83 +msgid "After :c:member:`!tp_init` completes, the object is ready to use." +msgstr "在 :c:member:`!tp_init` 完成之后,对象就可以使用了。" + +#: ../../c-api/lifecycle.rst:84 +msgid "Some time after the last reference to an object is removed:" +msgstr "在对象的最后一个引用被删除后的一段时间:" + +#: ../../c-api/lifecycle.rst:86 +msgid "" +"If an object is not marked as *finalized*, it might be finalized by marking " +"it as *finalized* and calling its :c:member:`~PyTypeObject.tp_finalize` " +"function. Python does *not* finalize an object when the last reference to " +"it is deleted; use :c:func:`PyObject_CallFinalizerFromDealloc` to ensure " +"that :c:member:`~PyTypeObject.tp_finalize` is always called." +msgstr "" +"如果一个对象没有被标记为 *finalized*,它可以通过将其标记为 *finalized* 并调用它的 " +":c:member:`~PyTypeObject.tp_finalize` 函数来终结。当一个对象的最后一个引用被删除时,Python 并 *不* " +"终结它;使用 :c:func:`PyObject_CallFinalizerFromDealloc` 来确保总是调用了 " +":c:member:`~PyTypeObject.tp_finalize` 函数。" + +#: ../../c-api/lifecycle.rst:92 +msgid "" +"If the object is marked as finalized, :c:member:`~PyTypeObject.tp_clear` " +"might be called by the garbage collector to clear references held by the " +"object. It is *not* called when the object's reference count reaches zero." +msgstr "" +"如果该对象被标记为已终结,垃圾收集器可能会调用 :c:member:`~PyTypeObject.tp_clear` " +"来清除该对象持有的引用。当该对象的引用计数达到零时,*不* 调用它。" + +#: ../../c-api/lifecycle.rst:96 +msgid "" +":c:member:`~PyTypeObject.tp_dealloc` is called to destroy the object. To " +"avoid code duplication, :c:member:`~PyTypeObject.tp_dealloc` typically calls" +" into :c:member:`~PyTypeObject.tp_clear` to free up the object's references." +msgstr "" +"调用 :c:member:`~PyTypeObject.tp_dealloc` 来销毁该对象。 " +"为了避免代码重复,:c:member:`~PyTypeObject.tp_dealloc` 通常调用 " +":c:member:`~PyTypeObject.tp_clear` 来释放该对象的引用。" + +#: ../../c-api/lifecycle.rst:100 +msgid "" +"When :c:member:`~PyTypeObject.tp_dealloc` finishes object destruction, it " +"directly calls :c:member:`~PyTypeObject.tp_free` (usually set to " +":c:func:`PyObject_Free` or :c:func:`PyObject_GC_Del` automatically as " +"appropriate for the type) to deallocate the memory." +msgstr "" +"当 :c:member:`~PyTypeObject.tp_dealloc` 完成对象销毁时,它直接调用 " +":c:member:`~PyTypeObject.tp_free` (通常根据类型自动设置为 :c:func:`PyObject_Free` 或 " +":c:func:`PyObject_GC_Del`) 来释放内存。" + +#: ../../c-api/lifecycle.rst:105 +msgid "" +"The :c:member:`~PyTypeObject.tp_finalize` function is permitted to add a " +"reference to the object if desired. If it does, the object is " +"*resurrected*, preventing its pending destruction. (Only " +":c:member:`!tp_finalize` is allowed to resurrect an object; " +":c:member:`~PyTypeObject.tp_clear` and :c:member:`~PyTypeObject.tp_dealloc` " +"cannot without calling into :c:member:`!tp_finalize`.) Resurrecting an " +"object may or may not cause the object's *finalized* mark to be removed. " +"Currently, Python does not remove the *finalized* mark from a resurrected " +"object if it supports garbage collection (i.e., the " +":c:macro:`Py_TPFLAGS_HAVE_GC` flag is set) but does remove the mark if the " +"object does not support garbage collection; either or both of these " +"behaviors may change in the future." +msgstr "" +":c:member:`~PyTypeObject.tp_finalize` 函数被允许在需要时增加对象的引用计数。如果该函数执行此操作,那么对象将被 " +"*复活*,从而阻止其即将发生的销毁。只有 :c:member:`!tp_finalize` " +"能够复活对象;:c:member:`~PyTypeObject.tp_clear` 和 " +":c:member:`~PyTypeObject.tp_dealloc` 在不调用 :c:member:`!tp_finalize` " +"的情况下不能实现此操作。对象复活后,其 *已终结* 标记可能被移除也可能保留。当前 Python 的实现逻辑是:如果对象支持垃圾回收(即设置了 " +":c:macro:`Py_TPFLAGS_HAVE_GC` 标志位),那么保留复活对象的 *已终结* 标记;如果不支持垃圾回收,那么移除该标记。 " +"此行为在未来版本中可能发生变更。" + +#: ../../c-api/lifecycle.rst:118 +msgid "" +":c:member:`~PyTypeObject.tp_dealloc` can optionally call " +":c:member:`~PyTypeObject.tp_finalize` via " +":c:func:`PyObject_CallFinalizerFromDealloc` if it wishes to reuse that code " +"to help with object destruction. This is recommended because it guarantees " +"that :c:member:`!tp_finalize` is always called before destruction. See the " +":c:member:`~PyTypeObject.tp_dealloc` documentation for example code." +msgstr "" +":c:member:`~PyTypeObject.tp_dealloc` 可以通过 " +":c:func:`PyObject_CallFinalizerFromDealloc` 选择性地调用 " +":c:member:`~PyTypeObject.tp_finalize`,如果它希望重用该代码来帮助对象销毁。 " +"建议这样做,因为它保证总是在销毁之前调用 :c:member:`!tp_finalize`。请参阅 " +":c:member:`~PyTypeObject.tp_dealloc` 文档获取示例代码。" + +#: ../../c-api/lifecycle.rst:125 +msgid "" +"If the object is a member of a :term:`cyclic isolate` and either " +":c:member:`~PyTypeObject.tp_clear` fails to break the reference cycle or the" +" cyclic isolate is not detected (perhaps :func:`gc.disable` was called, or " +"the :c:macro:`Py_TPFLAGS_HAVE_GC` flag was erroneously omitted in one of the" +" involved types), the objects remain indefinitely uncollectable (they " +"\"leak\"). See :data:`gc.garbage`." +msgstr "" +"如果对象是 :term:`cyclic isolate` 的成员,并且 :c:member:`~PyTypeObject.tp_clear` " +"未能打破循环引用或未检测到循环隔离(可能调用了 :func:`gc.disable`,或者在所涉及的类型之一中错误地省略了 " +":c:macro:`Py_TPFLAGS_HAVE_GC` 标志),则对象将无限期地保持不可收集(它们“泄漏”)。参见 " +":data:`gc.garbage` 列表。" + +#: ../../c-api/lifecycle.rst:132 +msgid "" +"If the object is marked as supporting garbage collection (the " +":c:macro:`Py_TPFLAGS_HAVE_GC` flag is set in " +":c:member:`~PyTypeObject.tp_flags`), the following events are also possible:" +msgstr "" +"如果对象被标记为支持垃圾收集(在 :c:member:`~PyTypeObject.tp_flags` 中设置了 " +":c:macro:`Py_TPFLAGS_HAVE_GC` 标志),则也可能发生以下事件:" + +#: ../../c-api/lifecycle.rst:136 +msgid "" +"The garbage collector occasionally calls " +":c:member:`~PyTypeObject.tp_traverse` to identify :term:`cyclic isolates " +"`." +msgstr "" +"垃圾回收器偶尔会调用 :c:member:`~PyTypeObject.tp_traverse` 来识别 :term:`循环隔离 ` 实例。" + +#: ../../c-api/lifecycle.rst:139 +msgid "" +"When the garbage collector discovers a :term:`cyclic isolate`, it finalizes " +"one of the objects in the group by marking it as *finalized* and calling its" +" :c:member:`~PyTypeObject.tp_finalize` function, if it has one. This repeats" +" until the cyclic isolate doesn't exist or all of the objects have been " +"finalized." +msgstr "" +"当垃圾回收器发现一个 :term:`cyclic isolate` 时,它通过将组中的一个对象标记为 *finalized* 并调用其 " +":c:member:`~PyTypeObject.tp_finalize` 函数(如果有的话)来终结该对象。 " +"这样重复,直到循环隔离不存在或所有对象都已终结。" + +#: ../../c-api/lifecycle.rst:144 +msgid "" +":c:member:`~PyTypeObject.tp_finalize` is permitted to resurrect the object " +"by adding a reference from outside the :term:`cyclic isolate`. The new " +"reference causes the group of objects to no longer form a cyclic isolate " +"(the reference cycle may still exist, but if it does the objects are no " +"longer isolated)." +msgstr "" +"允许 :c:member:`~PyTypeObject.tp_finalize` 通过添加来自 :term:`cyclic isolate` " +"外部的引用来复活对象。新的引用导致对象组不再形成循环隔离(循环引用可能仍然存在,但如果存在,则对象不再被隔离)。" + +#: ../../c-api/lifecycle.rst:149 +msgid "" +"When the garbage collector discovers a :term:`cyclic isolate` and all of the" +" objects in the group have already been marked as *finalized*, the garbage " +"collector clears one or more of the uncleared objects in the group (possibly" +" concurrently) by calling each's :c:member:`~PyTypeObject.tp_clear` " +"function. This repeats as long as the cyclic isolate still exists and not " +"all of the objects have been cleared." +msgstr "" +"当垃圾回收器发现 :term:`cyclic isolate` 并且组中的所有对象已经被标记为 *finalized* 时,垃圾回收器通过调用每个对象的" +" :c:member:`~PyTypeObject.tp_clear` 函数来清除组中一个或多个未清除的对象(可能并发)。 " +"只要循环隔离仍然存在并且未清除所有对象,就会重复此操作。" + +#: ../../c-api/lifecycle.rst:158 +msgid "Cyclic Isolate Destruction" +msgstr "循环隔离销毁" + +#: ../../c-api/lifecycle.rst:160 +msgid "" +"Listed below are the stages of life of a hypothetical :term:`cyclic isolate`" +" that continues to exist after each member object is finalized or cleared. " +"It is a memory leak if a cyclic isolate progresses through all of these " +"stages; it should vanish once all objects are cleared, if not sooner. A " +"cyclic isolate can vanish either because the reference cycle is broken or " +"because the objects are no longer isolated due to finalizer resurrection " +"(see :c:member:`~PyTypeObject.tp_finalize`)." +msgstr "" +"以下描述了一个假设性的 :term:`cyclic isolate` " +"在其每个成员对象都被终结或清除后仍能持续存在。如果一个循环隔离体完整经历了所有这些阶段而未消失则构成内存泄漏。正常情况下当所有对象被清除或是更早时循环隔离体就应当消失。循环隔离体的消失可能是由于引用循环被打破或是因为对象因终结器复活而不再处于隔离状态" +" (参见 :c:member:`~PyTypeObject.tp_finalize` 的说明)。" + +#: ../../c-api/lifecycle.rst:168 +msgid "" +"**Reachable** (not yet a cyclic isolate): All objects are in their normal, " +"reachable state. A reference cycle could exist, but an external reference " +"means the objects are not yet isolated." +msgstr "**可达** (尚未循环隔离):所有对象均处于正常的可达状态。可能存在引用循环,但有外部引用意味着对象还未被隔离。" + +#: ../../c-api/lifecycle.rst:171 +msgid "" +"**Unreachable but consistent:** The final reference from outside the cyclic " +"group of objects has been removed, causing the objects to become isolated " +"(thus a cyclic isolate is born). None of the group's objects have been " +"finalized or cleared yet. The cyclic isolate remains at this stage until " +"some future run of the garbage collector (not necessarily the next run " +"because the next run might not scan every object)." +msgstr "" +"**不可达但一致:** " +"来自循环对象组外部的最后引用已被删除,导致对象被隔离(因此产生了循环隔离)。该组的所有对象还没有终结或清除。循环隔离一直保持在这个阶段,直到垃圾回收器的某个未来运行(不一定是下一次运行,因为下一次运行可能不会扫描每个对象)。" + +#: ../../c-api/lifecycle.rst:177 +msgid "" +"**Mix of finalized and not finalized:** Objects in a cyclic isolate are " +"finalized one at a time, which means that there is a period of time when the" +" cyclic isolate is composed of a mix of finalized and non-finalized objects." +" Finalization order is unspecified, so it can appear random. A finalized " +"object must behave in a sane manner when non-finalized objects interact with" +" it, and a non-finalized object must be able to tolerate the finalization of" +" an arbitrary subset of its referents." +msgstr "" +"**已终结和未终结对象的混合情况:** 在循环隔离组(cyclic " +"isolate)中,对象的终结是逐个进行的。这意味着会存在一个阶段,循环隔离组中同时包含已终结(finalized)和未终结(non-" +"finalized)的对象。由于终结顺序是不确定的,其表现可能看似随机。已终结对象在被未终结对象交互时应当保持合理行为,未终结对象应当能够容忍其任意部分引用对象被终结。" + +#: ../../c-api/lifecycle.rst:184 +msgid "" +"**All finalized:** All objects in a cyclic isolate are finalized before any " +"of them are cleared." +msgstr "**已全部终结:** 循环隔离中的所有对象在清除它们之前都已终结。" + +#: ../../c-api/lifecycle.rst:186 +msgid "" +"**Mix of finalized and cleared:** The objects can be cleared serially or " +"concurrently (but with the :term:`GIL` held); either way, some will finish " +"before others. A finalized object must be able to tolerate the clearing of " +"a subset of its referents. :pep:`442` calls this stage \"cyclic trash\"." +msgstr "" +"**已终结和已清除的混合:** 对象可以被串行或并发地清除 (但持有 :term:`GIL`);不管怎样,有些对象会比其他对象先完成。 " +"一个已终结对象必须能够容忍其部分引用对象被清除。 :pep:`442` 称这个阶段为“循环垃圾”。" + +#: ../../c-api/lifecycle.rst:190 +msgid "" +"**Leaked:** If a cyclic isolate still exists after all objects in the group " +"have been finalized and cleared, then the objects remain indefinitely " +"uncollectable (see :data:`gc.garbage`). It is a bug if a cyclic isolate " +"reaches this stage---it means the :c:member:`~PyTypeObject.tp_clear` methods" +" of the participating objects have failed to break the reference cycle as " +"required." +msgstr "" +"**泄漏:** 如果在组中的所有对象都已终结并清除后循环隔离仍然存在,则对象仍然无限期不可收集 (参见 :data:`gc.garbage`)。 " +"如果循环隔离达到这个阶段,这是一个 bug —— 这意味着参与对象的 :c:member:`~PyTypeObject.tp_clear` " +"方法未能按要求打破循环引用。" + +#: ../../c-api/lifecycle.rst:197 +msgid "" +"If :c:member:`~PyTypeObject.tp_clear` did not exist, then Python would have " +"no way to safely break a reference cycle. Simply destroying an object in a " +"cyclic isolate would result in a dangling pointer, triggering undefined " +"behavior when an object referencing the destroyed object is itself " +"destroyed. The clearing step makes object destruction a two-phase process: " +"first :c:member:`~PyTypeObject.tp_clear` is called to partially destroy the " +"objects enough to detangle them from each other, then " +":c:member:`~PyTypeObject.tp_dealloc` is called to complete the destruction." +msgstr "" +"如果类型对象中的 :c:member:`~PyTypeObject.tp_clear` 成员不存在,那么 Python " +"将无法安全地打破引用循环(reference cycle)。如果直接销毁循环孤立组中的对象,那么会导致悬垂指针(dangling " +"pointer),当其他对象引用该已销毁对象时,会引发未定义行为(undefined " +"behavior)。清除(clearing)操作将对象销毁分为两个阶段:首先调用 :c:member:`~PyTypeObject.tp_clear` " +"部分销毁对象,解除循环引用;随后调用 :c:member:`~PyTypeObject.tp_dealloc` 完成最终销毁。" + +#: ../../c-api/lifecycle.rst:206 +msgid "" +"Unlike clearing, finalization is not a phase of destruction. A finalized " +"object must still behave properly by continuing to fulfill its design " +"contracts. An object's finalizer is allowed to execute arbitrary Python " +"code, and is even allowed to prevent the impending destruction by adding a " +"reference. The finalizer is only related to destruction by call order---if " +"it runs, it runs before destruction, which starts with " +":c:member:`~PyTypeObject.tp_clear` (if called) and concludes with " +":c:member:`~PyTypeObject.tp_dealloc`." +msgstr "" +"与清除不同的是,终结不是销毁的一个阶段。一个已终结的对象必须通过继续履行其设计契约而保持正确的行为。一个对象的终结器允许执行任意 Python " +"代码,甚至允许通过添加引用来防止即将发生的销毁。终结器只通过调用顺序与销毁相关 —— 如果它运行,它在销毁之前运行,销毁以 " +":c:member:`~PyTypeObject.tp_clear` (如果被调用) 开始,并以 " +":c:member:`~PyTypeObject.tp_dealloc` 结束。" + +#: ../../c-api/lifecycle.rst:214 +msgid "" +"The finalization step is not necessary to safely reclaim the objects in a " +"cyclic isolate, but its existence makes it easier to design types that " +"behave in a sane manner when objects are cleared. Clearing an object might " +"necessarily leave it in a broken, partially destroyed state---it might be " +"unsafe to call any of the cleared object's methods or access any of its " +"attributes. With finalization, only finalized objects can possibly interact" +" with cleared objects; non-finalized objects are guaranteed to interact with" +" only non-cleared (but potentially finalized) objects." +msgstr "" +"对于安全回收循环隔离体中的对象而言,终结步骤并非必要,但是,该机制的存在能让类型设计更易于实现合理的清理行为。清除对象时或许不可避免地会使其处于损坏的、部分销毁的状态——此时调用被清除对象的任何方法或访问其属性都可能是不安全的。通过终结机制,只有已完成终结的对象才有可能与被清除对象交互;未终结的对象则保证只会与未被清除(但可能已完成终结)的对象进行交互。" + +#: ../../c-api/lifecycle.rst:223 +msgid "To summarize the possible interactions:" +msgstr "总结一下可能的交互:" + +#: ../../c-api/lifecycle.rst:225 +msgid "" +"A non-finalized object might have references to or from non-finalized and " +"finalized objects, but not to or from cleared objects." +msgstr "一个未终结的对象可能有对(或来自)未终结和已终结对象的引用,但不能有对(或来自)已清除对象的引用。" + +#: ../../c-api/lifecycle.rst:227 +msgid "" +"A finalized object might have references to or from non-finalized, " +"finalized, and cleared objects." +msgstr "一个已终结的对象可能有对(或来自)未终结、已终结和已清除对象的引用。" + +#: ../../c-api/lifecycle.rst:229 +msgid "" +"A cleared object might have references to or from finalized and cleared " +"objects, but not to or from non-finalized objects." +msgstr "一个已清除的对象可能有对(或来自)已终结和已清除对象的引用,但不能有对(或来自)未终结对象的引用。" + +#: ../../c-api/lifecycle.rst:232 +msgid "" +"Without any reference cycles, an object can be simply destroyed once its " +"last reference is deleted; the finalization and clearing steps are not " +"necessary to safely reclaim unused objects. However, it can be useful to " +"automatically call :c:member:`~PyTypeObject.tp_finalize` and " +":c:member:`~PyTypeObject.tp_clear` before destruction anyway because type " +"design is simplified when all objects always experience the same series of " +"events regardless of whether they participated in a cyclic isolate. Python " +"currently only calls :c:member:`~PyTypeObject.tp_finalize` and " +":c:member:`~PyTypeObject.tp_clear` as needed to destroy a cyclic isolate; " +"this may change in a future version." +msgstr "" +"在没有引用循环的情况下,对象只需在最后一个引用被删除时即可直接销毁,此时无需执行最终化(finalize)和清理(clear)步骤也能安全回收对象。即便如此,在销毁前自动调用" +" :c:member:`~PyTypeObject.tp_finalize` 和 :c:member:`~PyTypeObject.tp_clear` " +"仍具有实际意义:这能统一所有对象的销毁流程,无论它们是否参与过循环引用隔离区(cyclic isolate),类型设计会更简洁。当前 Python " +"仅在需要销毁循环引用隔离区时才调用 :c:member:`~PyTypeObject.tp_finalize` 和 " +":c:member:`~PyTypeObject.tp_clear`。未来版本可能调整这一行为。" + +#: ../../c-api/lifecycle.rst:244 +msgid "Functions" +msgstr "函数" + +#: ../../c-api/lifecycle.rst:246 +msgid "To allocate and free memory, see :ref:`allocating-objects`." +msgstr "要分配和释放内存,请参阅 :ref:`allocating-objects`。" + +#: ../../c-api/lifecycle.rst:251 +msgid "" +"Finalizes the object as described in :c:member:`~PyTypeObject.tp_finalize`. " +"Call this function (or :c:func:`PyObject_CallFinalizerFromDealloc`) instead " +"of calling :c:member:`~PyTypeObject.tp_finalize` directly because this " +"function may deduplicate multiple calls to :c:member:`!tp_finalize`. " +"Currently, calls are only deduplicated if the type supports garbage " +"collection (i.e., the :c:macro:`Py_TPFLAGS_HAVE_GC` flag is set); this may " +"change in the future." +msgstr "" +"按照 :c:member:`~PyTypeObject.tp_finalize` 中描述的方式终结对象。调用这个函数 (或 " +":c:func:`PyObject_CallFinalizerFromDealloc`),而不是直接调用 " +":c:member:`~PyTypeObject.tp_finalize`,因为这个函数可以对多次调用 :c:member:`!tp_finalize`" +" 进行去重。目前,只有当类型支持垃圾回收(即设置了 :c:macro:`Py_TPFLAGS_HAVE_GC` " +"标志)时,才会对调用进行去重;这在未来可能会改变。" + +#: ../../c-api/lifecycle.rst:264 +msgid "" +"Same as :c:func:`PyObject_CallFinalizer` but meant to be called at the " +"beginning of the object's destructor (:c:member:`~PyTypeObject.tp_dealloc`)." +" There must not be any references to the object. If the object's finalizer " +"resurrects the object, this function returns -1; no further destruction " +"should happen. Otherwise, this function returns 0 and destruction can " +"continue normally." +msgstr "" +"与 :c:func:`PyObject_CallFinalizer` 相同,但应当在对象析构器的开始位置被调用 " +"(:c:member:`~PyTypeObject.tp_dealloc`)。必须没有任何指向对象的引用。如果对象的终结器复活了该对象,此函数将返回 " +"-1;不会再发生销毁操作。在其他情况下,此函数将返回 0 并且销毁操作可正常继续。" + +#: ../../c-api/lifecycle.rst:275 +msgid ":c:member:`~PyTypeObject.tp_dealloc` for example code." +msgstr "参见 :c:member:`~PyTypeObject.tp_dealloc` 了解示例代码。" diff --git a/c-api/list.po b/c-api/list.po new file mode 100644 index 0000000000..d1547c0c1f --- /dev/null +++ b/c-api/list.po @@ -0,0 +1,289 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-01 17:14+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/list.rst:6 +msgid "List Objects" +msgstr "列表对象" + +#: ../../c-api/list.rst:13 +msgid "This subtype of :c:type:`PyObject` represents a Python list object." +msgstr "这个 C 类型 :c:type:`PyObject` 的子类型代表一个 Python 列表对象。" + +#: ../../c-api/list.rst:18 +msgid "" +"This instance of :c:type:`PyTypeObject` represents the Python list type. " +"This is the same object as :class:`list` in the Python layer." +msgstr "" +"这是个属于 :c:type:`PyTypeObject` 的代表 Python 列表类型的实例。在 Python 层面和类型 :class:`list`" +" 是同一个对象。" + +#: ../../c-api/list.rst:24 +msgid "" +"Return true if *p* is a list object or an instance of a subtype of the list " +"type. This function always succeeds." +msgstr "如果 *p* 是一个 list 对象或者 list 类型的子类型的实例则返回真值。此函数总是会成功执行。" + +#: ../../c-api/list.rst:30 +msgid "" +"Return true if *p* is a list object, but not an instance of a subtype of the" +" list type. This function always succeeds." +msgstr "如果 *p* 是一个 list 对象但不是 list 类型的子类型的实例则返回真值。此函数总是会成功执行。" + +#: ../../c-api/list.rst:36 +msgid "Return a new list of length *len* on success, or ``NULL`` on failure." +msgstr "成功时返回一个长度为 *len* 的新列表,失败时返回 ``NULL``。" + +#: ../../c-api/list.rst:40 +msgid "" +"If *len* is greater than zero, the returned list object's items are set to " +"``NULL``. Thus you cannot use abstract API functions such as " +":c:func:`PySequence_SetItem` or expose the object to Python code before " +"setting all items to a real object with :c:func:`PyList_SetItem` or " +":c:func:`PyList_SET_ITEM()`. The following APIs are safe APIs before the " +"list is fully initialized: :c:func:`PyList_SetItem()` and " +":c:func:`PyList_SET_ITEM()`." +msgstr "" +"当 *len* 大于零时,被返回的列表对象的条目将被设为 ``NULL``。因此你不能使用抽象 API 函数如 " +":c:func:`PySequence_SetItem` 或者在使用 :c:func:`PyList_SetItem` 或 " +":c:func:`PyList_SET_ITEM()` 将所有条目设为真实对象之前将对象暴露给 Python 代码。以下 API " +"在该列表完全初始化之前将是安全的 API: :c:func:`PyList_SetItem()` 和 " +":c:func:`PyList_SET_ITEM()` 宏。" + +#: ../../c-api/list.rst:53 +msgid "" +"Return the length of the list object in *list*; this is equivalent to " +"``len(list)`` on a list object." +msgstr "返回 *list* 中列表对象的长度;这等于在列表对象调用 ``len(list)``。" + +#: ../../c-api/list.rst:59 +msgid "Similar to :c:func:`PyList_Size`, but without error checking." +msgstr "类似于 :c:func:`PyList_Size`,但是不带错误检测。" + +#: ../../c-api/list.rst:64 +msgid "" +"Return the object at position *index* in the list pointed to by *list*. The" +" position must be non-negative; indexing from the end of the list is not " +"supported. If *index* is out of bounds (:code:`<0 or >=len(list)`), return " +"``NULL`` and set an :exc:`IndexError` exception." +msgstr "" +"返回 *list* 所指向的列表中 *index* 位置上的对象。位置值必须为非负数;不支持从列表末尾反向索引。如果 *index* 超出范围 " +"(:code:`<0 or >=len(list)`),则返回 ``NULL`` 并设置 :exc:`IndexError` 异常。" + +#: ../../c-api/list.rst:74 +msgid "" +"Like :c:func:`PyList_GetItemRef`, but returns a :term:`borrowed reference` " +"instead of a :term:`strong reference`." +msgstr "" +"类似于 :c:func:`PyList_GetItemRef`,但返回一个 :term:`borrowed reference` 而不是 " +":term:`strong reference` 引用。" + +#: ../../c-api/list.rst:79 ../../c-api/list.rst:91 +msgid "" +"In the :term:`free-threaded build`, the returned :term:`borrowed reference` " +"may become invalid if another thread modifies the list concurrently. Prefer " +":c:func:`PyList_GetItemRef`, which returns a :term:`strong reference`." +msgstr "" + +#: ../../c-api/list.rst:87 +msgid "Similar to :c:func:`PyList_GetItem`, but without error checking." +msgstr "类似于 :c:func:`PyList_GetItem`,但是不带错误检测。" + +#: ../../c-api/list.rst:99 +msgid "" +"Set the item at index *index* in list to *item*. Return ``0`` on success. " +"If *index* is out of bounds, return ``-1`` and set an :exc:`IndexError` " +"exception." +msgstr "" +"将列表中索引为 *index* 的项设为 *item*。成功时返回 ``0``。如果 *index* 超出范围则返回 ``-1`` 并设定 " +":exc:`IndexError` 异常。" + +#: ../../c-api/list.rst:105 +msgid "" +"This function \":term:`steals `\" a reference to *item*, even on " +"error. On success, it discards a reference to an item already in the list at" +" the affected position (unless it was ``NULL``)." +msgstr "" + +#: ../../c-api/list.rst:113 +msgid "" +"Macro form of :c:func:`PyList_SetItem` without error checking. This is " +"normally only used to fill in new lists where there is no previous content." +msgstr ":c:func:`PyList_SetItem` 的不带错误检测的宏版本。这通常只被用于填充之前没有内容的新列表。" + +#: ../../c-api/list.rst:116 +msgid "" +"Bounds checking is performed as an assertion if Python is built in " +":ref:`debug mode ` or :option:`with assertions <--with-" +"assertions>`." +msgstr "" +"当 Python 以 :ref:`调试模式 ` 或 :option:`启用断言 <--with-assertions>` " +"构建时将把边界检测作为断言来执行。" + +#: ../../c-api/list.rst:122 +msgid "" +"This macro \":term:`steals `\" a reference to *item*, and, unlike " +":c:func:`PyList_SetItem`, does *not* discard a reference to any item that is" +" being replaced; any reference in *list* at position *i* will be leaked." +msgstr "" + +#: ../../c-api/list.rst:129 +msgid "" +"In the :term:`free-threaded build`, this macro has no internal " +"synchronization. It is normally only used to fill in new lists where no " +"other thread has a reference to the list. If the list may be shared, use " +":c:func:`PyList_SetItem` instead, which uses a :term:`per-object lock`." +msgstr "" + +#: ../../c-api/list.rst:138 +msgid "" +"Insert the item *item* into list *list* in front of index *index*. Return " +"``0`` if successful; return ``-1`` and set an exception if unsuccessful. " +"Analogous to ``list.insert(index, item)``." +msgstr "" +"将条目 *item* 插入到列表 *list* 索引号 *index* 之前的位置。如果成功将返回 ``0``;如果不成功则返回 ``-1`` " +"并设置一个异常。相当于 ``list.insert(index, item)``。" + +#: ../../c-api/list.rst:145 +msgid "" +"Append the object *item* at the end of list *list*. Return ``0`` if " +"successful; return ``-1`` and set an exception if unsuccessful. Analogous " +"to ``list.append(item)``." +msgstr "" +"将对象 *item* 添加到列表 *list* 的末尾。如果成功将返回 ``0``;如果不成功则返回 ``-1`` 并设置一个异常。相当于 " +"``list.append(item)``。" + +#: ../../c-api/list.rst:152 +msgid "" +"Return a list of the objects in *list* containing the objects *between* " +"*low* and *high*. Return ``NULL`` and set an exception if unsuccessful. " +"Analogous to ``list[low:high]``. Indexing from the end of the list is not " +"supported." +msgstr "" +"返回一个对象列表,包含 *list* 当中位于 *low* 和 *high* *之间* 的对象。如果不成功则返回 ``NULL`` 并设置异常。相当于 " +"``list[low:high]``。不支持从列表末尾进行索引。" + +#: ../../c-api/list.rst:159 +msgid "" +"Set the slice of *list* between *low* and *high* to the contents of " +"*itemlist*. Analogous to ``list[low:high] = itemlist``. The *itemlist* may " +"be ``NULL``, indicating the assignment of an empty list (slice deletion). " +"Return ``0`` on success, ``-1`` on failure. Indexing from the end of the " +"list is not supported." +msgstr "" +"将 *list* 当中 *low* 与 *high* 之间的切片设为 *itemlist* 的内容。相当于 ``list[low:high] = " +"itemlist``。*itemlist* 可以为 ``NULL``,表示赋值为一个空列表(删除切片)。成功时返回 ``0``,失败时返回 " +"``-1``。这里不支持从列表末尾进行索引。" + +#: ../../c-api/list.rst:167 +msgid "" +"In the :term:`free-threaded build`, when *itemlist* is a :class:`list`, both" +" *list* and *itemlist* are locked for the duration of the operation. For " +"other iterables (or ``NULL``), only *list* is locked." +msgstr "" + +#: ../../c-api/list.rst:174 +msgid "" +"Extend *list* with the contents of *iterable*. This is the same as " +"``PyList_SetSlice(list, PY_SSIZE_T_MAX, PY_SSIZE_T_MAX, iterable)`` and " +"analogous to ``list.extend(iterable)`` or ``list += iterable``." +msgstr "" +"使用 *iterable* 的内容扩展 *list*。这与 ``PyList_SetSlice(list, PY_SSIZE_T_MAX, " +"PY_SSIZE_T_MAX, iterable)`` 相同并与 ``list.extend(iterable)`` 或 ``list += " +"iterable`` 类似。" + +#: ../../c-api/list.rst:178 +msgid "" +"Raise an exception and return ``-1`` if *list* is not a :class:`list` " +"object. Return 0 on success." +msgstr "如果 *list* 不是 :class:`list` 对象则会引发异常并返回 ``-1``。成功时返回 0。" + +#: ../../c-api/list.rst:185 +msgid "" +"In the :term:`free-threaded build`, when *iterable* is a :class:`list`, " +":class:`set`, :class:`dict`, or dict view, both *list* and *iterable* (or " +"its underlying dict) are locked for the duration of the operation. For other" +" iterables, only *list* is locked; *iterable* may be concurrently modified " +"by another thread." +msgstr "" + +#: ../../c-api/list.rst:194 +msgid "" +"Remove all items from *list*. This is the same as ``PyList_SetSlice(list, " +"0, PY_SSIZE_T_MAX, NULL)`` and analogous to ``list.clear()`` or ``del " +"list[:]``." +msgstr "" +"从 *list* 移除所有条目。这与 ``PyList_SetSlice(list, 0, PY_SSIZE_T_MAX, NULL)`` 相同并与 " +"``list.clear()`` 或 ``del list[:]`` 类似。" + +#: ../../c-api/list.rst:198 +msgid "" +"Raise an exception and return ``-1`` if *list* is not a :class:`list` " +"object. Return 0 on success." +msgstr "如果 *list* 不是 :class:`list` 对象则会引发异常并返回 ``-1``。成功时返回 0。" + +#: ../../c-api/list.rst:206 +msgid "" +"Sort the items of *list* in place. Return ``0`` on success, ``-1`` on " +"failure. This is equivalent to ``list.sort()``." +msgstr "对 *list* 中的条目进行原地排序。成功时返回 ``0``,失败时返回 ``-1``。这等价于 ``list.sort()``。" + +#: ../../c-api/list.rst:211 +msgid "" +"In the :term:`free-threaded build`, element comparison via " +":meth:`~object.__lt__` can execute arbitrary Python code, during which the " +":term:`per-object lock` may be temporarily released. For built-in types " +"(:class:`str`, :class:`int`, :class:`float`), the lock is not released " +"during comparison." +msgstr "" + +#: ../../c-api/list.rst:220 +msgid "" +"Reverse the items of *list* in place. Return ``0`` on success, ``-1`` on " +"failure. This is the equivalent of ``list.reverse()``." +msgstr "对 *list* 中的条目进行原地反转。成功时返回 ``0``,失败时返回 ``-1``。这等价于 ``list.reverse()``。" + +#: ../../c-api/list.rst:228 +msgid "" +"Return a new tuple object containing the contents of *list*; equivalent to " +"``tuple(list)``." +msgstr "返回一个新的元组对象,其中包含 *list* 的内容;等价于 ``tuple(list)``。" + +#: ../../c-api/list.rst:8 +msgid "object" +msgstr "object -- 对象" + +#: ../../c-api/list.rst:8 +msgid "list" +msgstr "list" + +#: ../../c-api/list.rst:51 ../../c-api/list.rst:226 +msgid "built-in function" +msgstr "内置函数" + +#: ../../c-api/list.rst:51 +msgid "len" +msgstr "len" + +#: ../../c-api/list.rst:226 +msgid "tuple" +msgstr "元组" diff --git a/c-api/long.po b/c-api/long.po new file mode 100644 index 0000000000..fdb31198ba --- /dev/null +++ b/c-api/long.po @@ -0,0 +1,1243 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2026 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:00+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/long.rst:6 +msgid "Integer Objects" +msgstr "整数型对象" + +#: ../../c-api/long.rst:11 +msgid "" +"All integers are implemented as \"long\" integer objects of arbitrary size." +msgstr "所有整数都实现为长度任意的长整数对象。" + +#: ../../c-api/long.rst:13 +msgid "" +"On error, most ``PyLong_As*`` APIs return ``(return type)-1`` which cannot " +"be distinguished from a number. Use :c:func:`PyErr_Occurred` to " +"disambiguate." +msgstr "" +"在出错时,大多数 ``PyLong_As*`` API 都会返回 ``(return type)-1``,这与数字无法区分开。请采用 " +":c:func:`PyErr_Occurred` 来加以区分。" + +#: ../../c-api/long.rst:18 +msgid "This subtype of :c:type:`PyObject` represents a Python integer object." +msgstr "表示 Python 整数对象的 :c:type:`PyObject` 子类型。" + +#: ../../c-api/long.rst:23 +msgid "" +"This instance of :c:type:`PyTypeObject` represents the Python integer type. " +"This is the same object as :class:`int` in the Python layer." +msgstr "" +"这个 :c:type:`PyTypeObject` 的实例表示 Python 的整数类型。与 Python 语言中的 :class:`int` 相同。" + +#: ../../c-api/long.rst:29 +msgid "" +"Return true if its argument is a :c:type:`PyLongObject` or a subtype of " +":c:type:`PyLongObject`. This function always succeeds." +msgstr "" +"如果参数是 :c:type:`PyLongObject` 或 :c:type:`PyLongObject` 的子类型,则返回 " +"True。该函数一定能够执行成功。" + +#: ../../c-api/long.rst:35 +msgid "" +"Return true if its argument is a :c:type:`PyLongObject`, but not a subtype " +"of :c:type:`PyLongObject`. This function always succeeds." +msgstr "" +"如果其参数属于 :c:type:`PyLongObject`,但不是 :c:type:`PyLongObject` " +"的子类型则返回真值。此函数总是会成功执行。" + +#: ../../c-api/long.rst:41 +msgid "" +"Return a new :c:type:`PyLongObject` object from *v*, or ``NULL`` on failure." +msgstr "由 *v* 返回一个新的 :c:type:`PyLongObject` 对象,失败时返回 ``NULL``。" + +#: ../../c-api/long.rst:45 +msgid "" +"CPython keeps an array of integer objects for all integers between ``-5`` " +"and ``1024``. When you create an int in that range you actually just get " +"back a reference to the existing object." +msgstr "" + +#: ../../c-api/long.rst:52 +msgid "" +"Return a new :c:type:`PyLongObject` object from a C :c:expr:`unsigned long`," +" or ``NULL`` on failure." +msgstr "" +"基于 C :c:expr:`unsigned long` 返回一个新的 :c:type:`PyLongObject` 对象,失败时返回 ``NULL``" +" 值。" + +#: ../../c-api/long.rst:58 +msgid "" +"Return a new :c:type:`PyLongObject` object from a C :c:type:`Py_ssize_t`, or" +" ``NULL`` on failure." +msgstr "" +"由 C :c:type:`Py_ssize_t` 返回一个新的 :c:type:`PyLongObject` 对象,失败时返回 ``NULL``。" + +#: ../../c-api/long.rst:64 +msgid "" +"Return a new :c:type:`PyLongObject` object from a C :c:type:`size_t`, or " +"``NULL`` on failure." +msgstr "由 C :c:type:`size_t` 返回一个新的 :c:type:`PyLongObject` 对象,失败则返回 ``NULL``。" + +#: ../../c-api/long.rst:70 +msgid "" +"Return a new :c:type:`PyLongObject` object from a C :c:expr:`long long`, or " +"``NULL`` on failure." +msgstr "" +"基于 C :c:expr:`long long` 返回一个新的 :c:type:`PyLongObject`,失败时返回 ``NULL``。" + +#: ../../c-api/long.rst:77 +msgid "" +"Return a new :c:type:`PyLongObject` object from a signed C :c:expr:`int32_t`" +" or :c:expr:`int64_t`, or ``NULL`` with an exception set on failure." +msgstr "" +"基于一个有符号 C :c:expr:`int32_t` 或 :c:expr:`int64_t` 返回一个新的 " +":c:type:`PyLongObject` 对象,或在失败时返回 ``NULL`` 并设置一个异常。" + +#: ../../c-api/long.rst:86 +msgid "" +"Return a new :c:type:`PyLongObject` object from a C :c:expr:`unsigned long " +"long`, or ``NULL`` on failure." +msgstr "" +"基于 C :c:expr:`unsigned long long` 返回一个新的 :c:type:`PyLongObject` 对象,失败时返回 " +"``NULL`` 值。" + +#: ../../c-api/long.rst:93 +msgid "" +"Return a new :c:type:`PyLongObject` object from an unsigned C " +":c:expr:`uint32_t` or :c:expr:`uint64_t`, or ``NULL`` with an exception set " +"on failure." +msgstr "" +"基于一个无符号 C :c:expr:`uint32_t` 或 :c:expr:`uint64_t` 返回一个新的 " +":c:type:`PyLongObject` 对象,或在失败时返回 ``NULL`` 并设置一个异常。" + +#: ../../c-api/long.rst:102 +msgid "" +"Return a new :c:type:`PyLongObject` object from the integer part of *v*, or " +"``NULL`` on failure." +msgstr "由 *v* 的整数部分返回一个新的 :c:type:`PyLongObject` 对象,失败则返回 ``NULL``。" + +#: ../../c-api/long.rst:108 +msgid "" +"Return a new :c:type:`PyLongObject` based on the string value in *str*, " +"which is interpreted according to the radix in *base*, or ``NULL`` on " +"failure. If *pend* is non-``NULL``, *\\*pend* will point to the end of " +"*str* on success or to the first character that could not be processed on " +"error. If *base* is ``0``, *str* is interpreted using the :ref:`integers` " +"definition; in this case, leading zeros in a non-zero decimal number raises " +"a :exc:`ValueError`. If *base* is not ``0``, it must be between ``2`` and " +"``36``, inclusive. Leading and trailing whitespace and single underscores " +"after a base specifier and between digits are ignored. If there are no " +"digits or *str* is not NULL-terminated following the digits and trailing " +"whitespace, :exc:`ValueError` will be raised." +msgstr "" +"根据 *str* 字符串值返回一个新的 :c:type:`PyLongObject`,它将根据 *base* 指定的基数来解读,或是在失败时返回 " +"``NULL``。如果 *pend* 不为 ``NULL``,则在成功时 *\\*pend* 将指向 *str* " +"中末尾而在出错时将指向第一个无法处理的字符。如果 *base* 为 ``0``,则 *str* 将使用 :ref:`integers` " +"定义来解读;在此情况下,非零十进制数以零开头将会引发 :exc:`ValueError`。如果 *base* 不为 ``0``,则必须在 ``2`` 和" +" ``36`` 之间,包括这两个值。开头和末尾的空格以及基数标示符之后和数码之间的单下划线将被忽略。如果没有数码或 *str* 中数码和末尾空格之后不以" +" NULL 结束,则将引发 :exc:`ValueError`。" + +#: ../../c-api/long.rst:119 +msgid "" +":c:func:`PyLong_AsNativeBytes()` and :c:func:`PyLong_FromNativeBytes()` " +"functions can be used to convert a :c:type:`PyLongObject` to/from an array " +"of bytes in base ``256``." +msgstr "" +":c:func:`PyLong_AsNativeBytes()` 和 :c:func:`PyLong_FromNativeBytes()` " +"函数可被用于以 ``256`` 为基数在 :c:type:`PyLongObject` 和字节数组之间进行正/逆向转换。" + +#: ../../c-api/long.rst:126 +msgid "" +"Convert a sequence of Unicode digits in the string *u* to a Python integer " +"value." +msgstr "将字符串 *u* 中的 Unicode 数字序列转换为 Python 整数值。" + +#: ../../c-api/long.rst:134 +msgid "" +"Create a Python integer from the pointer *p*. The pointer value can be " +"retrieved from the resulting value using :c:func:`PyLong_AsVoidPtr`." +msgstr "从指针 *p* 创建一个 Python 整数。可以使用 :c:func:`PyLong_AsVoidPtr` 从结果值中取回该指针值。" + +#: ../../c-api/long.rst:140 +msgid "" +"Create a Python integer from the value contained in the first *n_bytes* of " +"*buffer*, interpreted as a two's-complement signed number." +msgstr "将包含在 *buffer* 开头 *n_bytes* 中的值解读为一个二的补码有符号数,基于它创建一个 Python 整数。" + +#: ../../c-api/long.rst:143 +msgid "" +"*flags* are as for :c:func:`PyLong_AsNativeBytes`. Passing ``-1`` will " +"select the native endian that CPython was compiled with and assume that the " +"most-significant bit is a sign bit. Passing " +"``Py_ASNATIVEBYTES_UNSIGNED_BUFFER`` will produce the same result as calling" +" :c:func:`PyLong_FromUnsignedNativeBytes`. Other flags are ignored." +msgstr "" +"*flags* 与针对 :c:func:`PyLong_AsNativeBytes` 的相同。传入 ``-1`` 将选择 CPython " +"编译时所用的原生端序并将假定最高有效位是符号位。传入 ``Py_ASNATIVEBYTES_UNSIGNED_BUFFER`` 将产生与调用 " +":c:func:`PyLong_FromUnsignedNativeBytes` 相同的结果。其他旗标将被忽略。" + +#: ../../c-api/long.rst:154 +msgid "" +"Create a Python integer from the value contained in the first *n_bytes* of " +"*buffer*, interpreted as an unsigned number." +msgstr "将包含在 *buffer* 开头 *n_bytes* 中的值解读为一个无符号数,基于它创建一个 Python 整数。" + +#: ../../c-api/long.rst:157 +msgid "" +"*flags* are as for :c:func:`PyLong_AsNativeBytes`. Passing ``-1`` will " +"select the native endian that CPython was compiled with and assume that the " +"most-significant bit is not a sign bit. Flags other than endian are ignored." +msgstr "" +"*flags* 与针对 :c:func:`PyLong_AsNativeBytes` 的相同。传入 ``-1`` 将选择 CPython " +"编译时所用的原生端序并将假定最高有效位不是符号位。其他旗标将被忽略。" + +#: ../../c-api/long.rst:166 +msgid "Macro for creating a Python integer from a process identifier." +msgstr "用于根据进程标识符创建一个 Python 整数的宏。" + +#: ../../c-api/long.rst:168 +msgid "" +"This can be defined as an alias to :c:func:`PyLong_FromLong` or " +":c:func:`PyLong_FromLongLong`, depending on the size of the system's PID " +"type." +msgstr "" +"这可被定义为 :c:func:`PyLong_FromLong` 或 :c:func:`PyLong_FromLongLong` " +"的别名,具体取决于系统的 PID 类型的大小。" + +#: ../../c-api/long.rst:181 ../../c-api/long.rst:215 +msgid "" +"Return a C :c:expr:`long` representation of *obj*. If *obj* is not an " +"instance of :c:type:`PyLongObject`, first call its :meth:`~object.__index__`" +" method (if present) to convert it to a :c:type:`PyLongObject`." +msgstr "" +"返回 *obj* 的 C :c:expr:`long` 表示形式。如果 *obj* 不是 :c:type:`PyLongObject` " +"的实例,则会先调用其 :meth:`~object.__index__` 方法(如果存在)将其转换为 :c:type:`PyLongObject`。" + +#: ../../c-api/long.rst:185 +msgid "" +"Raise :exc:`OverflowError` if the value of *obj* is out of range for a " +":c:expr:`long`." +msgstr "如果 *obj* 的值超出了 :c:expr:`long` 的取值范围则会引发 :exc:`OverflowError`。" + +#: ../../c-api/long.rst:188 ../../c-api/long.rst:224 ../../c-api/long.rst:245 +#: ../../c-api/long.rst:265 ../../c-api/long.rst:288 +msgid "" +"Returns ``-1`` on error. Use :c:func:`PyErr_Occurred` to disambiguate." +msgstr "出错则返回 ``-1``。请用 :c:func:`PyErr_Occurred` 找出具体问题。" + +#: ../../c-api/long.rst:190 ../../c-api/long.rst:226 ../../c-api/long.rst:247 +#: ../../c-api/long.rst:269 ../../c-api/long.rst:353 ../../c-api/long.rst:373 +msgid "Use :meth:`~object.__index__` if available." +msgstr "如果可能将使用 :meth:`~object.__index__`。" + +#: ../../c-api/long.rst:193 ../../c-api/long.rst:229 ../../c-api/long.rst:250 +#: ../../c-api/long.rst:272 ../../c-api/long.rst:356 ../../c-api/long.rst:376 +msgid "This function will no longer use :meth:`~object.__int__`." +msgstr "此函数将不再使用 :meth:`~object.__int__`。" + +#: ../../c-api/long.rst:200 +msgid "" +"Exactly equivalent to the preferred ``PyLong_AsLong``. In particular, it can" +" fail with :exc:`OverflowError` or another exception." +msgstr "" +"完全等价于首选的 ``PyLong_AsLong``。 具体而言,它可能因 :exc:`OverflowError` 或其他异常而执行失败。" + +#: ../../c-api/long.rst:207 +msgid "" +"Similar to :c:func:`PyLong_AsLong`, but store the result in a C " +":c:expr:`int` instead of a C :c:expr:`long`." +msgstr "" +"类似于 :c:func:`PyLong_AsLong`,将会将结果存放到一个 C :c:expr:`int` 而不是 C :c:expr:`long`。" + +#: ../../c-api/long.rst:219 +msgid "" +"If the value of *obj* is greater than :c:macro:`LONG_MAX` or less than " +":c:macro:`LONG_MIN`, set *\\*overflow* to ``1`` or ``-1``, respectively, and" +" return ``-1``; otherwise, set *\\*overflow* to ``0``. If any other " +"exception occurs set *\\*overflow* to ``0`` and return ``-1`` as usual." +msgstr "" +"如果 *obj* 的值大于 :c:macro:`LONG_MAX` 或小于 :c:macro:`LONG_MIN`,则会把 *\\*overflow* " +"分别置为 ``1`` 或 ``-1``,并返回 ``-1``;否则,将 *\\*overflow* 置为 ``0``。如果发生其他异常则按常规把 " +"*\\*overflow* 置为 ``0`` 并返回 ``-1``。" + +#: ../../c-api/long.rst:238 ../../c-api/long.rst:256 +msgid "" +"Return a C :c:expr:`long long` representation of *obj*. If *obj* is not an " +"instance of :c:type:`PyLongObject`, first call its :meth:`~object.__index__`" +" method (if present) to convert it to a :c:type:`PyLongObject`." +msgstr "" +"返回 *obj* 的 C :c:expr:`long long` 表示形式。如果 *obj* 不是 :c:type:`PyLongObject` " +"的实例,则会先调用其 :meth:`~object.__index__` 方法(如果存在)将其转换为 :c:type:`PyLongObject`。" + +#: ../../c-api/long.rst:242 +msgid "" +"Raise :exc:`OverflowError` if the value of *obj* is out of range for a " +":c:expr:`long long`." +msgstr "如果 *obj* 值超出 :c:expr:`long long` 的取值范围则会引发 :exc:`OverflowError`。" + +#: ../../c-api/long.rst:260 +msgid "" +"If the value of *obj* is greater than :c:macro:`LLONG_MAX` or less than " +":c:macro:`LLONG_MIN`, set *\\*overflow* to ``1`` or ``-1``, respectively, " +"and return ``-1``; otherwise, set *\\*overflow* to ``0``. If any other " +"exception occurs set *\\*overflow* to ``0`` and return ``-1`` as usual." +msgstr "" +"如果 *obj* 的值大于 :c:macro:`LLONG_MAX` 或小于 :c:macro:`LLONG_MIN`,则会把 " +"*\\*overflow* 分别置为 ``1`` 或 ``-1``,并返回 ``-1``;否则,将 *\\*overflow* 置为 " +"``0``。如果发生其他异常则按常规把 *\\*overflow* 置为 ``0`` 并返回 ``-1``。" + +#: ../../c-api/long.rst:282 +msgid "" +"Return a C :c:type:`Py_ssize_t` representation of *pylong*. *pylong* must " +"be an instance of :c:type:`PyLongObject`." +msgstr "" +"返回 *pylong* 的 C 语言 :c:type:`Py_ssize_t` 形式。*pylong* 必须是 " +":c:type:`PyLongObject` 的实例。" + +#: ../../c-api/long.rst:285 +msgid "" +"Raise :exc:`OverflowError` if the value of *pylong* is out of range for a " +":c:type:`Py_ssize_t`." +msgstr "" +"如果 *pylong* 的值超出了 :c:type:`Py_ssize_t` 的取值范围则会引发 :exc:`OverflowError`。" + +#: ../../c-api/long.rst:297 +msgid "" +"Return a C :c:expr:`unsigned long` representation of *pylong*. *pylong* " +"must be an instance of :c:type:`PyLongObject`." +msgstr "" +"返回 *pylong* 的 C :c:expr:`unsigned long` 表示形式。*pylong* 必须是 " +":c:type:`PyLongObject` 的实例。" + +#: ../../c-api/long.rst:300 +msgid "" +"Raise :exc:`OverflowError` if the value of *pylong* is out of range for a " +":c:expr:`unsigned long`." +msgstr "" +"如果 *pylong* 的值超出了 :c:expr:`unsigned long` 的取值范围则会引发 :exc:`OverflowError`。" + +#: ../../c-api/long.rst:303 +msgid "" +"Returns ``(unsigned long)-1`` on error. Use :c:func:`PyErr_Occurred` to " +"disambiguate." +msgstr "出错时返回 ``(unsigned long)-1``,请利用 :c:func:`PyErr_Occurred` 辨别具体问题。" + +#: ../../c-api/long.rst:313 +msgid "" +"Return a C :c:type:`size_t` representation of *pylong*. *pylong* must be an" +" instance of :c:type:`PyLongObject`." +msgstr "" +"返回 *pylong* 的 C 语言 :c:type:`size_t` 形式。*pylong* 必须是 :c:type:`PyLongObject` " +"的实例。" + +#: ../../c-api/long.rst:316 +msgid "" +"Raise :exc:`OverflowError` if the value of *pylong* is out of range for a " +":c:type:`size_t`." +msgstr "如果 *pylong* 的值超出了 :c:type:`size_t` 的取值范围则会引发 :exc:`OverflowError`。" + +#: ../../c-api/long.rst:319 +msgid "" +"Returns ``(size_t)-1`` on error. Use :c:func:`PyErr_Occurred` to " +"disambiguate." +msgstr "出错时返回 ``(size_t)-1``,请利用 :c:func:`PyErr_Occurred` 辨别具体问题。" + +#: ../../c-api/long.rst:328 +msgid "" +"Return a C :c:expr:`unsigned long long` representation of *pylong*. " +"*pylong* must be an instance of :c:type:`PyLongObject`." +msgstr "" +"返回 *pylong* 的 C :c:expr:`unsigned long long` 表示形式。*pylong* 必须是 " +":c:type:`PyLongObject` 的实例。" + +#: ../../c-api/long.rst:331 +msgid "" +"Raise :exc:`OverflowError` if the value of *pylong* is out of range for an " +":c:expr:`unsigned long long`." +msgstr "" +"如果 *pylong* 的值超出 :c:expr:`unsigned long long` 的取值范围则会引发 :exc:`OverflowError`" +" 异常。" + +#: ../../c-api/long.rst:334 +msgid "" +"Returns ``(unsigned long long)-1`` on error. Use :c:func:`PyErr_Occurred` to" +" disambiguate." +msgstr "出错时返回 ``(unsigned long long)-1``,请利用 :c:func:`PyErr_Occurred` 辨别具体问题。" + +#: ../../c-api/long.rst:337 +msgid "" +"A negative *pylong* now raises :exc:`OverflowError`, not :exc:`TypeError`." +msgstr "现在 *pylong* 为负值会触发 :exc:`OverflowError`,而不是 :exc:`TypeError`。" + +#: ../../c-api/long.rst:343 +msgid "" +"Return a C :c:expr:`unsigned long` representation of *obj*. If *obj* is not" +" an instance of :c:type:`PyLongObject`, first call its " +":meth:`~object.__index__` method (if present) to convert it to a " +":c:type:`PyLongObject`." +msgstr "" +"返回 *obj* 的 C :c:expr:`unsigned long` 表示形式。如果 *obj* 不是 :c:type:`PyLongObject`" +" 的实例,则会先调用其 :meth:`~object.__index__` 方法(如果存在)将其转换为 :c:type:`PyLongObject`。" + +#: ../../c-api/long.rst:347 +msgid "" +"If the value of *obj* is out of range for an :c:expr:`unsigned long`, return" +" the reduction of that value modulo ``ULONG_MAX + 1``." +msgstr "" +"如果 *obj* 的值超出了 :c:expr:`unsigned long` 的取值范围,则返回该值对 ``ULONG_MAX + 1`` 求模的余数。" + +#: ../../c-api/long.rst:350 +msgid "" +"Returns ``(unsigned long)-1`` on error. Use :c:func:`PyErr_Occurred` to " +"disambiguate." +msgstr "出错时返回 ``(unsigned long)-1``,请利用 :c:func:`PyErr_Occurred` 辨别具体问题。" + +#: ../../c-api/long.rst:362 +msgid "" +"Return a C :c:expr:`unsigned long long` representation of *obj*. If *obj* " +"is not an instance of :c:type:`PyLongObject`, first call its " +":meth:`~object.__index__` method (if present) to convert it to a " +":c:type:`PyLongObject`." +msgstr "" +"返回 *obj* 的 C :c:expr:`unsigned long long` 表示形式。如果 *obj* 不是 " +":c:type:`PyLongObject` 的实例,则会先调用其 :meth:`~object.__index__` 方法(如果存在)将其转换为 " +":c:type:`PyLongObject` 类型。" + +#: ../../c-api/long.rst:367 +msgid "" +"If the value of *obj* is out of range for an :c:expr:`unsigned long long`, " +"return the reduction of that value modulo ``ULLONG_MAX + 1``." +msgstr "" +"如果 *obj* 的值超出了 :c:expr:`unsigned long long` 的取值范围,则返回该值对 ``ULLONG_MAX + 1`` " +"求模的余数。" + +#: ../../c-api/long.rst:370 +msgid "" +"Returns ``(unsigned long long)-1`` on error. Use :c:func:`PyErr_Occurred` " +"to disambiguate." +msgstr "出错时返回 ``(unsigned long long)-1``,请利用 :c:func:`PyErr_Occurred` 辨别具体问题。" + +#: ../../c-api/long.rst:383 +msgid "" +"Set *\\*value* to a signed C :c:expr:`int32_t` or :c:expr:`int64_t` " +"representation of *obj*." +msgstr "" +"将 *\\*value* 设为对应于 *obj* 的有符号 C :c:expr:`int32_t` 或 :c:expr:`int64_t` 表示形式。" + +#: ../../c-api/long.rst:386 ../../c-api/long.rst:406 +msgid "" +"If *obj* is not an instance of :c:type:`PyLongObject`, first call its " +":meth:`~object.__index__` method (if present) to convert it to a " +":c:type:`PyLongObject`." +msgstr "" +"如果 *obj* 不是 :c:type:`PyLongObject` 的实例,则首先调用其 :meth:`~object.__index__` " +"方法(如果存在)将其转换为 :c:type:`PyLongObject`。" + +#: ../../c-api/long.rst:390 ../../c-api/long.rst:411 +msgid "If the *obj* value is out of range, raise an :exc:`OverflowError`." +msgstr "如果 *obj* 值超出范围,则会引发 :exc:`OverflowError`。" + +#: ../../c-api/long.rst:392 ../../c-api/long.rst:413 +msgid "" +"Set *\\*value* and return ``0`` on success. Set an exception and return " +"``-1`` on error." +msgstr "设置 *\\*value* 并在成功时返回 ``0``。在失败时将设置一个异常并返回 ``-1``。" + +#: ../../c-api/long.rst:395 ../../c-api/long.rst:416 +msgid "*value* must not be ``NULL``." +msgstr "*value* 必须不为 ``NULL``。" + +#: ../../c-api/long.rst:403 +msgid "" +"Set *\\*value* to an unsigned C :c:expr:`uint32_t` or :c:expr:`uint64_t` " +"representation of *obj*." +msgstr "" +"将 *\\*value* 设置为 *obj* 的无符号 C 语言 :c:expr:`uint32_t` 或 :c:expr:`uint64_t` " +"表示形式。" + +#: ../../c-api/long.rst:410 +msgid "If *obj* is negative, raise a :exc:`ValueError`." +msgstr "如果 *obj* 为负数,则引发 :exc:`ValueError` 异常。" + +#: ../../c-api/long.rst:423 +msgid "" +"Return a C :c:expr:`double` representation of *pylong*. *pylong* must be an" +" instance of :c:type:`PyLongObject`." +msgstr "" +"返回 *pylong* 的 C :c:expr:`double` 表示形式。*pylong* 必须是 :c:type:`PyLongObject` " +"的实例。" + +#: ../../c-api/long.rst:426 +msgid "" +"Raise :exc:`OverflowError` if the value of *pylong* is out of range for a " +":c:expr:`double`." +msgstr "如果 *pylong* 的值超出了 :c:expr:`double` 的取值范围则会引发 :exc:`OverflowError`。" + +#: ../../c-api/long.rst:429 +msgid "" +"Returns ``-1.0`` on error. Use :c:func:`PyErr_Occurred` to disambiguate." +msgstr "出错时返回 ``-1.0``,请利用 :c:func:`PyErr_Occurred` 辨别具体问题。" + +#: ../../c-api/long.rst:434 +msgid "" +"Convert a Python integer *pylong* to a C :c:expr:`void` pointer. If *pylong*" +" cannot be converted, an :exc:`OverflowError` will be raised. This is only " +"assured to produce a usable :c:expr:`void` pointer for values created with " +":c:func:`PyLong_FromVoidPtr`." +msgstr "" +"将一个 Python 整数 *pylong* 转换为 C :c:expr:`void` 指针。如果 *pylong* 无法被转换,则将引发 " +":exc:`OverflowError`。这只是为了保证将通过 :c:func:`PyLong_FromVoidPtr` 创建的值产生一个可用的 " +":c:expr:`void` 指针。" + +#: ../../c-api/long.rst:439 +msgid "" +"Returns ``NULL`` on error. Use :c:func:`PyErr_Occurred` to disambiguate." +msgstr "出错时返回 ``NULL``,请利用 :c:func:`PyErr_Occurred` 辨别具体问题。" + +#: ../../c-api/long.rst:444 +msgid "" +"Copy the Python integer value *pylong* to a native *buffer* of size " +"*n_bytes*. The *flags* can be set to ``-1`` to behave similarly to a C cast," +" or to values documented below to control the behavior." +msgstr "" +"将 Python 整数值 *pylong* 拷贝到一个大小为 *n_bytes* 的原生 *buffer* 中。*flags* 可设为 ``-1`` " +"以使其行为类似于 C 强制转换,或是用下文中的值来控制其行为。" + +#: ../../c-api/long.rst:448 +msgid "" +"Returns ``-1`` with an exception raised on error. This may happen if " +"*pylong* cannot be interpreted as an integer, or if *pylong* was negative " +"and the ``Py_ASNATIVEBYTES_REJECT_NEGATIVE`` flag was set." +msgstr "" +"当发生错误时将返回 ``-1`` 并设置一个异常。如果 *pylong* 无法被解读为一个整数,或者如果 *pylong* 为负值并且设置了 " +"``Py_ASNATIVEBYTES_REJECT_NEGATIVE`` 旗标就可能出现这种情况。" + +#: ../../c-api/long.rst:452 +msgid "" +"Otherwise, returns the number of bytes required to store the value. If this " +"is equal to or less than *n_bytes*, the entire value was copied. All " +"*n_bytes* of the buffer are written: remaining bytes filled by copies of the" +" sign bit." +msgstr "" +"在其他情况下,将返回存储该值所需要的字节数。如果该值小于等于 *n_bytes*,则将拷贝整个值。缓冲区的全部 *n_bytes* " +"将被写入:其余的字节将以符号位的拷贝来填充。" + +#: ../../c-api/long.rst:457 +msgid "" +"If the returned value is greater than *n_bytes*, the value was truncated: as" +" many of the lowest bits of the value as could fit are written, and the " +"higher bits are ignored. This matches the typical behavior of a C-style " +"downcast." +msgstr "" +"如果返回的值大于 *n_bytes*,该值将被截断:从该值的低位开始写入尽可能多的数位,而高位部分将被忽略。这与典型的 C 风格向下强制转换行为相匹配。" + +#: ../../c-api/long.rst:464 +msgid "" +"Overflow is not considered an error. If the returned value is larger than " +"*n_bytes*, most significant bits were discarded." +msgstr "溢出不会被视为错误。如果返回值大于 *n_bytes*,高位部分将被丢弃。" + +#: ../../c-api/long.rst:467 +msgid "``0`` will never be returned." +msgstr "绝对不会返回 ``0``。" + +#: ../../c-api/long.rst:469 +msgid "Values are always copied as two's-complement." +msgstr "值将总是作为二的补码被拷贝。" + +#: ../../c-api/long.rst:471 +msgid "Usage example::" +msgstr "用法示例::" + +#: ../../c-api/long.rst:473 +msgid "" +"int32_t value;\n" +"Py_ssize_t bytes = PyLong_AsNativeBytes(pylong, &value, sizeof(value), -1);\n" +"if (bytes < 0) {\n" +" // Failed. A Python exception was set with the reason.\n" +" return NULL;\n" +"}\n" +"else if (bytes <= (Py_ssize_t)sizeof(value)) {\n" +" // Success!\n" +"}\n" +"else {\n" +" // Overflow occurred, but 'value' contains the truncated\n" +" // lowest bits of pylong.\n" +"}" +msgstr "" +"int32_t value;\n" +"Py_ssize_t bytes = PyLong_AsNativeBytes(pylong, &value, sizeof(value), -1);\n" +"if (bytes < 0) {\n" +" // 失败。设置一个提示失败原因的 Python 异常。\n" +" return NULL;\n" +"}\n" +"else if (bytes <= (Py_ssize_t)sizeof(value)) {\n" +" // 成功!\n" +"}\n" +"else {\n" +" // 发生溢出,但 'value' 包含了截断后的\n" +" // pylong 的低比特位部分。\n" +"}" + +#: ../../c-api/long.rst:487 +msgid "" +"Passing zero to *n_bytes* will return the size of a buffer that would be " +"large enough to hold the value. This may be larger than technically " +"necessary, but not unreasonably so. If *n_bytes=0*, *buffer* may be " +"``NULL``." +msgstr "" +"将零值传给 *n_bytes* 将返回一个足够容纳该值的缓冲区大小。这可能会大于基于技术考虑所需要的值,但也不会过于离谱。如果 " +"*n_bytes=0*,则 *buffer* 可能为 ``NULL``。" + +#: ../../c-api/long.rst:494 +msgid "" +"Passing *n_bytes=0* to this function is not an accurate way to determine the" +" bit length of the value." +msgstr "将 *n_bytes=0* 传给此函数不是确定值所需比特位长度的准确方式。" + +#: ../../c-api/long.rst:497 +msgid "" +"To get at the entire Python value of an unknown size, the function can be " +"called twice: first to determine the buffer size, then to fill it::" +msgstr "要获取一个大小未知的完整 Python 值,可以调用此函数两次:首先确定缓冲区大小,然后填充它::" + +#: ../../c-api/long.rst:500 +msgid "" +"// Ask how much space we need.\n" +"Py_ssize_t expected = PyLong_AsNativeBytes(pylong, NULL, 0, -1);\n" +"if (expected < 0) {\n" +" // Failed. A Python exception was set with the reason.\n" +" return NULL;\n" +"}\n" +"assert(expected != 0); // Impossible per the API definition.\n" +"uint8_t *bignum = malloc(expected);\n" +"if (!bignum) {\n" +" PyErr_SetString(PyExc_MemoryError, \"bignum malloc failed.\");\n" +" return NULL;\n" +"}\n" +"// Safely get the entire value.\n" +"Py_ssize_t bytes = PyLong_AsNativeBytes(pylong, bignum, expected, -1);\n" +"if (bytes < 0) { // Exception has been set.\n" +" free(bignum);\n" +" return NULL;\n" +"}\n" +"else if (bytes > expected) { // This should not be possible.\n" +" PyErr_SetString(PyExc_RuntimeError,\n" +" \"Unexpected bignum truncation after a size check.\");\n" +" free(bignum);\n" +" return NULL;\n" +"}\n" +"// The expected success given the above pre-check.\n" +"// ... use bignum ...\n" +"free(bignum);" +msgstr "" +"// 询问我们需要多少空间。\n" +"Py_ssize_t expected = PyLong_AsNativeBytes(pylong, NULL, 0, -1);\n" +"if (expected < 0) {\n" +" // 失败。Python 已设置异常,并提供了原因\n" +" return NULL;\n" +"}\n" +"assert(expected != 0); // 根据 API 定义,不可能为 0\n" +"uint8_t *bignum = malloc(expected);\n" +"if (!bignum) {\n" +" PyErr_SetString(PyExc_MemoryError, \"bignum malloc failed.\");\n" +" return NULL;\n" +"}\n" +"// 安全地获取整个值\n" +"Py_ssize_t bytes = PyLong_AsNativeBytes(pylong, bignum, expected, -1);\n" +"if (bytes < 0) { // 已设置异常\n" +" free(bignum);\n" +" return NULL;\n" +"}\n" +"else if (bytes > expected) { // 这种情况不应该发生\n" +" PyErr_SetString(PyExc_RuntimeError,\n" +" \"Unexpected bignum truncation after a size check.\");\n" +" free(bignum);\n" +" return NULL;\n" +"}\n" +"// 上述预检查成功的预期情况\n" +"// ... 使用 bignum ...\n" +"free(bignum);" + +#: ../../c-api/long.rst:528 +msgid "" +"*flags* is either ``-1`` (``Py_ASNATIVEBYTES_DEFAULTS``) to select defaults " +"that behave most like a C cast, or a combination of the other flags in the " +"table below. Note that ``-1`` cannot be combined with other flags." +msgstr "" +"*flags* 可以是 ``-1`` (``Py_ASNATIVEBYTES_DEFAULTS``) 表示选择最接近 C " +"强制转换的默认行为,或是下表中其他旗标的组合。请注意 ``-1`` 不能与其他旗标组合使用。" + +#: ../../c-api/long.rst:533 +msgid "" +"Currently, ``-1`` corresponds to ``Py_ASNATIVEBYTES_NATIVE_ENDIAN | " +"Py_ASNATIVEBYTES_UNSIGNED_BUFFER``." +msgstr "" +"目前,``-1`` 对应于 ``Py_ASNATIVEBYTES_NATIVE_ENDIAN | " +"Py_ASNATIVEBYTES_UNSIGNED_BUFFER`` 组合。" + +#: ../../c-api/long.rst:539 +msgid "Flag" +msgstr "标志位" + +#: ../../c-api/long.rst:539 +msgid "Value" +msgstr "值" + +#: ../../c-api/long.rst:541 +msgid "``-1``" +msgstr "``-1``" + +#: ../../c-api/long.rst:542 +msgid "``0``" +msgstr "``0``" + +#: ../../c-api/long.rst:543 +msgid "``1``" +msgstr "``1``" + +#: ../../c-api/long.rst:544 +msgid "``3``" +msgstr "``3``" + +#: ../../c-api/long.rst:545 +msgid "``4``" +msgstr "``4``" + +#: ../../c-api/long.rst:546 +msgid "``8``" +msgstr "``8``" + +#: ../../c-api/long.rst:547 +msgid "``16``" +msgstr "``16``" + +#: ../../c-api/long.rst:550 +msgid "" +"Specifying ``Py_ASNATIVEBYTES_NATIVE_ENDIAN`` will override any other endian" +" flags. Passing ``2`` is reserved." +msgstr "指定 ``Py_ASNATIVEBYTES_NATIVE_ENDIAN`` 将覆盖任何其他端序旗标。传入 ``2`` 被保留用于后续版本。" + +#: ../../c-api/long.rst:553 +msgid "" +"By default, sufficient buffer will be requested to include a sign bit. For " +"example, when converting 128 with *n_bytes=1*, the function will return 2 " +"(or more) in order to store a zero sign bit." +msgstr "" +"在默认情况下,将会请求足够的缓冲区以包括符号位。例如在设置 *n_bytes=1* 转换 128 时,该函数将返回 2 (或更大的值) " +"以存储一个零值符号位。" + +#: ../../c-api/long.rst:557 +msgid "" +"If ``Py_ASNATIVEBYTES_UNSIGNED_BUFFER`` is specified, a zero sign bit will " +"be omitted from size calculations. This allows, for example, 128 to fit in a" +" single-byte buffer. If the destination buffer is later treated as signed, a" +" positive input value may become negative. Note that the flag does not " +"affect handling of negative values: for those, space for a sign bit is " +"always requested." +msgstr "" +"如果指定了 ``Py_ASNATIVEBYTES_UNSIGNED_BUFFER``,将在计算大小时忽略零值符号位。例如,这将允许将 128 " +"放入一个单字节缓冲区。如果目标缓冲区随后又被当作是带符号位的,则一个正数输入值可能会变成负值。请注意此旗标不会影响对负值的处理:对于这种情况,总是会请求用作符号位的空间。" + +#: ../../c-api/long.rst:564 +msgid "" +"Specifying ``Py_ASNATIVEBYTES_REJECT_NEGATIVE`` causes an exception to be " +"set if *pylong* is negative. Without this flag, negative values will be " +"copied provided there is enough space for at least one sign bit, regardless " +"of whether ``Py_ASNATIVEBYTES_UNSIGNED_BUFFER`` was specified." +msgstr "" +"指定 ``Py_ASNATIVEBYTES_REJECT_NEGATIVE`` 将导致当 *pylong* " +"为负值时设置一个异常。如果没有此旗标,只要至少有足够容纳一个符号位的空间就将拷贝负值,无论是否指定了 " +"``Py_ASNATIVEBYTES_UNSIGNED_BUFFER`` 标志。" + +#: ../../c-api/long.rst:569 +msgid "" +"If ``Py_ASNATIVEBYTES_ALLOW_INDEX`` is specified and a non-integer value is " +"passed, its :meth:`~object.__index__` method will be called first. This may " +"result in Python code executing and other threads being allowed to run, " +"which could cause changes to other objects or values in use. When *flags* is" +" ``-1``, this option is not set, and non-integer values will raise " +":exc:`TypeError`." +msgstr "" +"如果指定了 ``Py_ASNATIVEBYTES_ALLOW_INDEX`` 并且传入一个非整数值,则会先调用其 " +":meth:`~object.__index__` 方法。这可能导致 Python " +"代码执行并允许运行其他线程,这可能会导致其他正在使用的对象或值发生改变。当 *flags* 为 ``-1`` 时,则不设置此选项,而非整数值将会引发 " +":exc:`TypeError` 异常。" + +#: ../../c-api/long.rst:578 +msgid "" +"With the default *flags* (``-1``, or *UNSIGNED_BUFFER* without " +"*REJECT_NEGATIVE*), multiple Python integers can map to a single value " +"without overflow. For example, both ``255`` and ``-1`` fit a single-byte " +"buffer and set all its bits. This matches typical C cast behavior." +msgstr "" +"如果使用默认 *flags* (``-1`` 或不带 *REJECT_NEGATIVE* 的 *UNSIGNED_BUFFER*),则多个 Python" +" 整数可映射为单个值而不会溢出。例如,``255`` 和 ``-1`` 都可放入一个单字节缓冲区并设置其全部比特位。这与典型的 C 强制转换行为相匹配。" + +#: ../../c-api/long.rst:589 +msgid "Macro for converting a Python integer into a process identifier." +msgstr "用于将一个 Python 整数转换为进程标识符的宏。" + +#: ../../c-api/long.rst:591 +msgid "" +"This can be defined as an alias to :c:func:`PyLong_AsLong`, " +":c:func:`PyLong_FromLongLong`, or :c:func:`PyLong_AsInt`, depending on the " +"size of the system's PID type." +msgstr "" +"这可被定义为 :c:func:`PyLong_AsLong`, :c:func:`PyLong_FromLongLong` 或 " +":c:func:`PyLong_AsInt` 的别名,具体取决于系统的 PID 类型大小。" + +#: ../../c-api/long.rst:600 +msgid "Get the sign of the integer object *obj*." +msgstr "获取整数对象 *obj* 的符号。" + +#: ../../c-api/long.rst:602 +msgid "" +"On success, set *\\*sign* to the integer sign (0, -1 or +1 for zero, " +"negative or positive integer, respectively) and return 0." +msgstr "成功时,将 *\\*sign* 设置为整数符号(0 表示零,-1 表示负整数,+1 表示正整数)并返回 0。" + +#: ../../c-api/long.rst:605 +msgid "" +"On failure, return -1 with an exception set. This function always succeeds " +"if *obj* is a :c:type:`PyLongObject` or its subtype." +msgstr "失败时,设置异常并返回 -1。如果 *obj* 是 :c:type:`PyLongObject` 或其子类型,则此函数始终成功。" + +#: ../../c-api/long.rst:613 +msgid "Check if the integer object *obj* is positive (``obj > 0``)." +msgstr "检查整数对象 *obj* 是否为正数 (``obj > 0``)。" + +#: ../../c-api/long.rst:615 +msgid "" +"If *obj* is an instance of :c:type:`PyLongObject` or its subtype, return " +"``1`` when it's positive and ``0`` otherwise. Else set an exception and " +"return ``-1``." +msgstr "" +"如果 *obj* 是 :c:type:`PyLongObject` 或其子类型的实例,当其为正数时返回 ``1``,否则返回 " +"``0``。否则设置异常并返回 ``-1``。" + +#: ../../c-api/long.rst:624 +msgid "Check if the integer object *obj* is negative (``obj < 0``)." +msgstr "检查整数对象 *obj* 是否为负数 (``obj < 0``)。" + +#: ../../c-api/long.rst:626 +msgid "" +"If *obj* is an instance of :c:type:`PyLongObject` or its subtype, return " +"``1`` when it's negative and ``0`` otherwise. Else set an exception and " +"return ``-1``." +msgstr "" +"如果 *obj* 是 :c:type:`PyLongObject` 或其子类型的实例,当其为负数时返回 ``1``,否则返回 " +"``0``。否则设置异常并返回 ``-1``。" + +#: ../../c-api/long.rst:635 +msgid "Check if the integer object *obj* is zero." +msgstr "检查整数对象 *obj* 是否为零。" + +#: ../../c-api/long.rst:637 +msgid "" +"If *obj* is an instance of :c:type:`PyLongObject` or its subtype, return " +"``1`` when it's zero and ``0`` otherwise. Else set an exception and return " +"``-1``." +msgstr "" +"如果 *obj* 是 :c:type:`PyLongObject` 或其子类型的实例,当其为零时返回 ``1``,否则返回 " +"``0``。否则设置异常并返回 ``-1``。" + +#: ../../c-api/long.rst:646 +msgid "" +"On success, return a read only :term:`named tuple`, that holds information " +"about Python's internal representation of integers. See :data:`sys.int_info`" +" for description of individual fields." +msgstr "" +"成功时,返回一个只读的 :term:`named tuple`,它保存着有关 Python 内部整数表示形式的信息。请参阅 " +":data:`sys.int_info` 了解关于单独字段的描述。" + +#: ../../c-api/long.rst:650 +msgid "On failure, return ``NULL`` with an exception set." +msgstr "当失败时,将返回 ``NULL`` 并设置一个异常。" + +#: ../../c-api/long.rst:657 +msgid "Return 1 if *op* is compact, 0 otherwise." +msgstr "如果 *op* 为紧凑形式则返回 1,否则返回 0。" + +#: ../../c-api/long.rst:659 +msgid "" +"This function makes it possible for performance-critical code to implement a" +" “fast path” for small integers. For compact values use " +":c:func:`PyUnstable_Long_CompactValue`; for others fall back to a " +":c:func:`PyLong_As* ` function or " +":c:func:`PyLong_AsNativeBytes`." +msgstr "" +"此函数使得注重性能的代码可以实现小整数的“快速路径”。对于紧凑值将使用 " +":c:func:`PyUnstable_Long_CompactValue`;对于其他值则回退为 :c:func:`PyLong_As* " +"` 函数或者 :c:func:`PyLong_AsNativeBytes`。" + +#: ../../c-api/long.rst:665 +msgid "The speedup is expected to be negligible for most users." +msgstr "此项加速对于大多数用户来说是可以忽略的。" + +#: ../../c-api/long.rst:667 +msgid "" +"Exactly what values are considered compact is an implementation detail and " +"is subject to change." +msgstr "具体有哪些值会被视为紧凑形式属于实现细节并可能发生改变。" + +#: ../../c-api/long.rst:675 +msgid "" +"If *op* is compact, as determined by :c:func:`PyUnstable_Long_IsCompact`, " +"return its value." +msgstr "如果 *op* 为紧凑形式,如 :c:func:`PyUnstable_Long_IsCompact` 所确定的,则返回它的值。" + +#: ../../c-api/long.rst:678 +msgid "Otherwise, the return value is undefined." +msgstr "在其他情况下,返回值是未定义的。" + +#: ../../c-api/long.rst:684 +msgid "Export API" +msgstr "导出 API" + +#: ../../c-api/long.rst:690 +msgid "" +"Layout of an array of \"digits\" (\"limbs\" in the GMP terminology), used to" +" represent absolute value for arbitrary precision integers." +msgstr "用于表示任意精度整数绝对值的\"数字\"数组(在 GMP 术语中称为\"limbs\")的布局。" + +#: ../../c-api/long.rst:693 +msgid "" +"Use :c:func:`PyLong_GetNativeLayout` to get the native layout of Python " +":class:`int` objects, used internally for integers with \"big enough\" " +"absolute value." +msgstr "" +"使用 :c:func:`PyLong_GetNativeLayout` 来获取 Python :class:`int` " +"对象的原生布局,该布局在内部用于绝对值\"足够大\"的整数。" + +#: ../../c-api/long.rst:697 +msgid "" +"See also :data:`sys.int_info` which exposes similar information in Python." +msgstr "另请参阅 :data:`sys.int_info`,它在 Python 中提供了类似的信息。" + +#: ../../c-api/long.rst:701 +msgid "" +"Bits per digit. For example, a 15 bit digit means that bits 0-14 contain " +"meaningful information." +msgstr "每个数字的位数。例如,15 位数字意味着位 0-14 包含有意义的信息。" + +#: ../../c-api/long.rst:706 +msgid "" +"Digit size in bytes. For example, a 15 bit digit will require at least 2 " +"bytes." +msgstr "每个数字占用的字节数。例如,15 位的数字至少需要 2 个字节。" + +#: ../../c-api/long.rst:711 +msgid "Digits order:" +msgstr "数字顺序:" + +#: ../../c-api/long.rst:713 +msgid "``1`` for most significant digit first" +msgstr "高位优先时为 ``1``" + +#: ../../c-api/long.rst:714 +msgid "``-1`` for least significant digit first" +msgstr "低位优先时为 ``-1``" + +#: ../../c-api/long.rst:718 +msgid "Digit endianness:" +msgstr "数字的字节序:" + +#: ../../c-api/long.rst:720 +msgid "``1`` for most significant byte first (big endian)" +msgstr "最高有效字节在前(大端序)时为 ``1``" + +#: ../../c-api/long.rst:721 +msgid "``-1`` for least significant byte first (little endian)" +msgstr "最低有效字节在前(小端序)时为 ``-1``" + +#: ../../c-api/long.rst:726 +msgid "Get the native layout of Python :class:`int` objects." +msgstr "获取 Python :class:`int` 对象的原生布局。" + +#: ../../c-api/long.rst:728 +msgid "See the :c:type:`PyLongLayout` structure." +msgstr "" + +#: ../../c-api/long.rst:730 +msgid "" +"The function must not be called before Python initialization nor after " +"Python finalization. The returned layout is valid until Python is finalized." +" The layout is the same for all Python sub-interpreters in a process, and so" +" it can be cached." +msgstr "" +"该函数不得在 Python 初始化之前或终止之后调用。返回的布局在 Python 终止前一直有效。一个进程中所有 Python " +"子解释器的布局都是相同的,因此可以对其进行缓存。" + +#: ../../c-api/long.rst:738 +msgid "Export of a Python :class:`int` object." +msgstr "导出 Python :class:`int` 对象。" + +#: ../../c-api/long.rst:740 +msgid "There are two cases:" +msgstr "有两种情况:" + +#: ../../c-api/long.rst:742 +msgid "" +"If :c:member:`digits` is ``NULL``, only use the :c:member:`value` member." +msgstr "如果 :c:member:`digits` 为 ``NULL``,则仅使用 :c:member:`value` 成员。" + +#: ../../c-api/long.rst:743 +msgid "" +"If :c:member:`digits` is not ``NULL``, use :c:member:`negative`, " +":c:member:`ndigits` and :c:member:`digits` members." +msgstr "" +"如果 :c:member:`digits` 不为 ``NULL``,则使用 " +":c:member:`negative`、:c:member:`ndigits` 和 :c:member:`digits` 成员。" + +#: ../../c-api/long.rst:748 +msgid "" +"The native integer value of the exported :class:`int` object. Only valid if " +":c:member:`digits` is ``NULL``." +msgstr "导出的 :class:`int` 对象的原生整数值。仅当 :c:member:`digits` 为 ``NULL`` 时有效。" + +#: ../../c-api/long.rst:753 +msgid "" +"``1`` if the number is negative, ``0`` otherwise. Only valid if " +":c:member:`digits` is not ``NULL``." +msgstr "如果数字为负则为 ``1``,否则为 ``0``。仅当 :c:member:`digits` 不为 ``NULL`` 时有效。" + +#: ../../c-api/long.rst:758 +msgid "" +"Number of digits in :c:member:`digits` array. Only valid if " +":c:member:`digits` is not ``NULL``." +msgstr ":c:member:`digits` 数组中的数字位数。仅当 :c:member:`digits` 不为 ``NULL`` 时有效。" + +#: ../../c-api/long.rst:763 +msgid "Read-only array of unsigned digits. Can be ``NULL``." +msgstr "只读的无符号数字数组。可以为 ``NULL``。" + +#: ../../c-api/long.rst:768 +msgid "Export a Python :class:`int` object." +msgstr "导出一个 Python :class:`int` 对象。" + +#: ../../c-api/long.rst:770 +msgid "" +"*export_long* must point to a :c:type:`PyLongExport` structure allocated by " +"the caller. It must not be ``NULL``." +msgstr "" + +#: ../../c-api/long.rst:773 +msgid "" +"On success, fill in *\\*export_long* and return ``0``. On error, set an " +"exception and return ``-1``." +msgstr "成功时,填充 *\\*export_long* 并返回 ``0``。出错时,设置异常并返回 ``-1``。" + +#: ../../c-api/long.rst:776 +msgid "" +":c:func:`PyLong_FreeExport` must be called when the export is no longer " +"needed." +msgstr "当不再需要导出的数据时,必须调用 :c:func:`PyLong_FreeExport`。" + +#: ../../c-api/long.rst:780 +msgid "" +"This function always succeeds if *obj* is a Python :class:`int` object or a " +"subclass." +msgstr "如果 *obj* 是 Python :class:`int` 对象或其子类,则此函数总是会成功。" + +#: ../../c-api/long.rst:786 +msgid "Release the export *export_long* created by :c:func:`PyLong_Export`." +msgstr "释放由 :c:func:`PyLong_Export` 创建的导出 *export_long*。" + +#: ../../c-api/long.rst:789 +msgid "" +"Calling :c:func:`PyLong_FreeExport` is optional if *export_long->digits* is " +"``NULL``." +msgstr "" +"如果 *export_long->digits* 为 ``NULL``,则调用 :c:func:`PyLong_FreeExport` 是可选的。" + +#: ../../c-api/long.rst:794 +msgid "PyLongWriter API" +msgstr "PyLongWriter API" + +#: ../../c-api/long.rst:796 +msgid "The :c:type:`PyLongWriter` API can be used to import an integer." +msgstr ":c:type:`PyLongWriter` API 可用于导入整数。" + +#: ../../c-api/long.rst:802 +msgid "A Python :class:`int` writer instance." +msgstr "一个 Python :class:`int` 写入器实例。" + +#: ../../c-api/long.rst:804 +msgid "" +"The instance must be destroyed by :c:func:`PyLongWriter_Finish` or " +":c:func:`PyLongWriter_Discard`." +msgstr "" +"该实例必须通过 :c:func:`PyLongWriter_Finish` 或 :c:func:`PyLongWriter_Discard` 销毁。" + +#: ../../c-api/long.rst:810 +msgid "Create a :c:type:`PyLongWriter`." +msgstr "创建一个 :c:type:`PyLongWriter`。" + +#: ../../c-api/long.rst:812 +msgid "" +"On success, allocate *\\*digits* and return a writer. On error, set an " +"exception and return ``NULL``." +msgstr "成功时,分配 *\\*digits* 并返回一个写入器。出错时,设置异常并返回 ``NULL``。" + +#: ../../c-api/long.rst:815 +msgid "*negative* is ``1`` if the number is negative, or ``0`` otherwise." +msgstr "如果数字为负,*negative* 为 ``1``,否则为 ``0``。" + +#: ../../c-api/long.rst:817 +msgid "" +"*ndigits* is the number of digits in the *digits* array. It must be greater " +"than 0." +msgstr "*ndigits* 是 *digits* 数组中的数字位数。它必须大于 0。" + +#: ../../c-api/long.rst:820 +msgid "*digits* must not be NULL." +msgstr "*digits* 不得为 NULL。" + +#: ../../c-api/long.rst:822 +msgid "" +"After a successful call to this function, the caller should fill in the " +"array of digits *digits* and then call :c:func:`PyLongWriter_Finish` to get " +"a Python :class:`int`. The layout of *digits* is described by " +":c:func:`PyLong_GetNativeLayout`." +msgstr "" +"成功调用此函数后,调用者应填充数字数组 *digits*,然后调用 :c:func:`PyLongWriter_Finish` 以获取 Python " +":class:`int`。*digits* 的布局由 :c:func:`PyLong_GetNativeLayout` 描述。" + +#: ../../c-api/long.rst:827 +msgid "" +"Digits must be in the range [``0``; ``(1 << bits_per_digit) - 1``] (where " +"the :c:type:`~PyLongLayout.bits_per_digit` is the number of bits per digit)." +" Any unused most significant digits must be set to ``0``." +msgstr "" + +#: ../../c-api/long.rst:832 +msgid "" +"Alternately, call :c:func:`PyLongWriter_Discard` to destroy the writer " +"instance without creating an :class:`~int` object." +msgstr "或者,调用 :c:func:`PyLongWriter_Discard` 来销毁写入器实例,而不创建 :class:`~int` 对象。" + +#: ../../c-api/long.rst:838 +msgid "" +"Finish a :c:type:`PyLongWriter` created by :c:func:`PyLongWriter_Create`." +msgstr "完成由 :c:func:`PyLongWriter_Create` 创建的 :c:type:`PyLongWriter`。" + +#: ../../c-api/long.rst:840 +msgid "" +"On success, return a Python :class:`int` object. On error, set an exception " +"and return ``NULL``." +msgstr "成功时返回 Python :class:`int` 对象。出错时设置异常并返回 ``NULL``。" + +#: ../../c-api/long.rst:843 +msgid "" +"The function takes care of normalizing the digits and converts the object to" +" a compact integer if needed." +msgstr "该函数负责规范化数字,并在需要时将对象转换为紧凑整数。" + +#: ../../c-api/long.rst:846 ../../c-api/long.rst:855 +msgid "The writer instance and the *digits* array are invalid after the call." +msgstr "调用后,写入器实例和 *digits* 数组将失效。" + +#: ../../c-api/long.rst:851 +msgid "" +"Discard a :c:type:`PyLongWriter` created by :c:func:`PyLongWriter_Create`." +msgstr "丢弃由 :c:func:`PyLongWriter_Create` 创建的 :c:type:`PyLongWriter`。" + +#: ../../c-api/long.rst:853 +msgid "If *writer* is ``NULL``, no operation is performed." +msgstr "若 *writer* 为 ``NULL``,则不执行任何操作。" + +#: ../../c-api/long.rst:859 +msgid "Deprecated API" +msgstr "已弃用的 API" + +#: ../../c-api/long.rst:861 +msgid "" +"These macros are :term:`soft deprecated`. They describe parameters of the " +"internal representation of :c:type:`PyLongObject` instances." +msgstr "" +"这些宏已被设为 :term:`soft deprecated` 状态。它们描述了 :c:type:`PyLongObject` " +"实例的内部表示形式的参数。" + +#: ../../c-api/long.rst:864 +msgid "" +"Use :c:func:`PyLong_GetNativeLayout` instead, along with " +":c:func:`PyLong_Export` to read integer data or :c:type:`PyLongWriter` to " +"write it. These currently use the same layout, but are designed to continue " +"working correctly even if CPython's internal integer representation changes." +msgstr "" +"请改用 :c:func:`PyLong_GetNativeLayout`,并以 :c:func:`PyLong_Export` 来读取整数型数据或以 " +":c:type:`PyLongWriter` 来写入。它们目前使用相同的布局,但被设计为即使 CPython " +"内部的整数表示形式发生变化仍能继续正确工作。" + +#: ../../c-api/long.rst:872 +msgid "" +"This is equivalent to :c:member:`~PyLongLayout.bits_per_digit` in the output" +" of :c:func:`PyLong_GetNativeLayout`." +msgstr "" +"这等价于 :c:func:`PyLong_GetNativeLayout` 的输出中的 " +":c:member:`~PyLongLayout.bits_per_digit` 字段。" + +#: ../../c-api/long.rst:878 +msgid "This is currently equivalent to :c:expr:`1 << PyLong_SHIFT`." +msgstr "这目前等价于 :c:expr:`1 << PyLong_SHIFT`。" + +#: ../../c-api/long.rst:883 +msgid "This is currently equivalent to :c:expr:`(1 << PyLong_SHIFT) - 1`" +msgstr "该值目前等于 :c:expr:`(1 << PyLong_SHIFT) - 1`" + +#: ../../c-api/long.rst:8 +msgid "object" +msgstr "object -- 对象" + +#: ../../c-api/long.rst:8 +msgid "long integer" +msgstr "长整型" + +#: ../../c-api/long.rst:8 +msgid "integer" +msgstr "integer" + +#: ../../c-api/long.rst:177 +msgid "LONG_MAX (C macro)" +msgstr "LONG_MAX (C 宏)" + +#: ../../c-api/long.rst:177 ../../c-api/long.rst:235 ../../c-api/long.rst:278 +#: ../../c-api/long.rst:293 ../../c-api/long.rst:309 ../../c-api/long.rst:325 +msgid "OverflowError (built-in exception)" +msgstr "OverflowError (内置异常)" + +#: ../../c-api/long.rst:278 +msgid "PY_SSIZE_T_MAX (C macro)" +msgstr "PY_SSIZE_T_MAX (C 宏)" + +#: ../../c-api/long.rst:293 +msgid "ULONG_MAX (C macro)" +msgstr "ULONG_MAX (C 宏)" + +#: ../../c-api/long.rst:309 +msgid "SIZE_MAX (C macro)" +msgstr "SIZE_MAX (C 宏)" diff --git a/c-api/mapping.po b/c-api/mapping.po new file mode 100644 index 0000000000..58e1630369 --- /dev/null +++ b/c-api/mapping.po @@ -0,0 +1,200 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/mapping.rst:6 +msgid "Mapping Protocol" +msgstr "映射协议" + +#: ../../c-api/mapping.rst:8 +msgid "" +"See also :c:func:`PyObject_GetItem`, :c:func:`PyObject_SetItem` and " +":c:func:`PyObject_DelItem`." +msgstr "" +"参见 :c:func:`PyObject_GetItem`、:c:func:`PyObject_SetItem` 与 " +":c:func:`PyObject_DelItem` 函数。" + +#: ../../c-api/mapping.rst:14 +msgid "" +"Return ``1`` if the object provides the mapping protocol or supports " +"slicing, and ``0`` otherwise. Note that it returns ``1`` for Python classes" +" with a :meth:`~object.__getitem__` method, since in general it is " +"impossible to determine what type of keys the class supports. This function " +"always succeeds." +msgstr "" +"如果对象提供了映射协议或是支持切片则返回 ``1``,否则返回 ``0``。请注意它将为具有 :meth:`~object.__getitem__` " +"方法的 Python 类返回 ``1``,因为在通常情况下无法确定该类支持哪种键类型。此函数总是会成功执行。" + +#: ../../c-api/mapping.rst:25 +msgid "" +"Returns the number of keys in object *o* on success, and ``-1`` on failure. " +"This is equivalent to the Python expression ``len(o)``." +msgstr "成功时返回对象 *o* 中键的数量,失败时返回 ``-1``。这相当于 Python 表达式 ``len(o)``。" + +#: ../../c-api/mapping.rst:31 +msgid "" +"This is the same as :c:func:`PyObject_GetItem`, but *key* is specified as a " +":c:expr:`const char*` UTF-8 encoded bytes string, rather than a " +":c:expr:`PyObject*`." +msgstr "" +"这与 :c:func:`PyObject_GetItem` 相同,但 *key* 被指定为 :c:expr:`const char*` UTF-8 " +"编码的字节串,而不是 :c:expr:`PyObject*`。" + +#: ../../c-api/mapping.rst:38 +msgid "" +"Variant of :c:func:`PyObject_GetItem` which doesn't raise :exc:`KeyError` if" +" the key is not found." +msgstr ":c:func:`PyObject_GetItem` 的变化形式,它在未找到键时不会引发 :exc:`KeyError`。" + +#: ../../c-api/mapping.rst:41 +msgid "" +"If the key is found, return ``1`` and set *\\*result* to a new :term:`strong" +" reference` to the corresponding value. If the key is not found, return " +"``0`` and set *\\*result* to ``NULL``; the :exc:`KeyError` is silenced. If " +"an error other than :exc:`KeyError` is raised, return ``-1`` and set " +"*\\*result* to ``NULL``." +msgstr "" +"如果找到了键,则返回 ``1`` 并将 *\\*result* 设为指向相应值的新 :term:`强引用 `。 " +"如果未找到键,则返回 ``0`` 并将 *\\*result* 设为 ``NULL``;:exc:`KeyError` 会被静默。如果引发了 " +":exc:`KeyError` 以外的错误,则返回 ``-1`` 并将 *\\*result* 设为 ``NULL``。" + +#: ../../c-api/mapping.rst:53 +msgid "" +"This is the same as :c:func:`PyMapping_GetOptionalItem`, but *key* is " +"specified as a :c:expr:`const char*` UTF-8 encoded bytes string, rather than" +" a :c:expr:`PyObject*`." +msgstr "" +"这与 :c:func:`PyMapping_GetOptionalItem` 相同,但 *key* 被指定为 :c:expr:`const char*`" +" UTF-8 编码的字节串,而不是 :c:expr:`PyObject*`。" + +#: ../../c-api/mapping.rst:62 +msgid "" +"This is the same as :c:func:`PyObject_SetItem`, but *key* is specified as a " +":c:expr:`const char*` UTF-8 encoded bytes string, rather than a " +":c:expr:`PyObject*`." +msgstr "" +"这与 :c:func:`PyObject_SetItem` 相同,但 *key* 被指定为 :c:expr:`const char*` UTF-8 " +"编码的字节串,而不是 :c:expr:`PyObject*`。" + +#: ../../c-api/mapping.rst:69 +msgid "This is an alias of :c:func:`PyObject_DelItem`." +msgstr "这是 :c:func:`PyObject_DelItem` 的一个别名。" + +#: ../../c-api/mapping.rst:74 +msgid "" +"This is the same as :c:func:`PyObject_DelItem`, but *key* is specified as a " +":c:expr:`const char*` UTF-8 encoded bytes string, rather than a " +":c:expr:`PyObject*`." +msgstr "" +"这与 :c:func:`PyObject_DelItem` 相同,但 *key* 被指定为 :c:expr:`const char*` UTF-8 " +"编码的字节串,而不是 :c:expr:`PyObject*`。" + +#: ../../c-api/mapping.rst:81 +msgid "" +"Return ``1`` if the mapping object has the key *key* and ``0`` otherwise. " +"This is equivalent to the Python expression ``key in o``. On failure, return" +" ``-1``." +msgstr "" +"如果映射对象具有键 *key* 则返回 ``1``,否则返回 ``0``。这相当于 Python 表达式 ``key in o``。当失败时,将返回 " +"``-1``。" + +#: ../../c-api/mapping.rst:90 +msgid "" +"This is the same as :c:func:`PyMapping_HasKeyWithError`, but *key* is " +"specified as a :c:expr:`const char*` UTF-8 encoded bytes string, rather than" +" a :c:expr:`PyObject*`." +msgstr "" +"这与 :c:func:`PyMapping_HasKeyWithError` 相同,但 *key* 被指定为 :c:expr:`const char*`" +" UTF-8 编码的字节串,而不是 :c:expr:`PyObject*`。" + +#: ../../c-api/mapping.rst:99 +msgid "" +"Return ``1`` if the mapping object has the key *key* and ``0`` otherwise. " +"This is equivalent to the Python expression ``key in o``. This function " +"always succeeds." +msgstr "" +"如果映射对象具有键 *key* 则返回 ``1``,否则返回 ``0``。这相当于 Python 表达式 ``key in " +"o``。此函数总是会成功执行。" + +#: ../../c-api/mapping.rst:105 +msgid "" +"Exceptions which occur when this calls the :meth:`~object.__getitem__` " +"method are silently ignored. For proper error handling, use " +":c:func:`PyMapping_HasKeyWithError`, :c:func:`PyMapping_GetOptionalItem` or " +":c:func:`PyObject_GetItem()` instead." +msgstr "" +"在其调用 :meth:`~object.__getitem__` 方法时发生的异常将被静默地忽略。要进行适当的错误处理,请改用 " +":c:func:`PyMapping_HasKeyWithError`, :c:func:`PyMapping_GetOptionalItem` 或 " +":c:func:`PyObject_GetItem()` 函数。" + +#: ../../c-api/mapping.rst:113 +msgid "" +"This is the same as :c:func:`PyMapping_HasKey`, but *key* is specified as a " +":c:expr:`const char*` UTF-8 encoded bytes string, rather than a " +":c:expr:`PyObject*`." +msgstr "" +"这与 :c:func:`PyMapping_HasKey` 相同,但 *key* 被指定为 :c:expr:`const char*` UTF-8 " +"编码的字节串,而不是 :c:expr:`PyObject*`。" + +#: ../../c-api/mapping.rst:119 +msgid "" +"Exceptions that occur when this calls the :meth:`~object.__getitem__` method" +" or while creating the temporary :class:`str` object are silently ignored. " +"For proper error handling, use :c:func:`PyMapping_HasKeyStringWithError`, " +":c:func:`PyMapping_GetOptionalItemString` or " +":c:func:`PyMapping_GetItemString` instead." +msgstr "" +"在其调用 :meth:`~object.__getitem__` 方法或创建临时 :class:`str` " +"对象时发生的异常将被静默地忽略。要进行适当的错误处理,请改用 :c:func:`PyMapping_HasKeyStringWithError`, " +":c:func:`PyMapping_GetOptionalItemString` 或 " +":c:func:`PyMapping_GetItemString` 函数。" + +#: ../../c-api/mapping.rst:129 +msgid "" +"On success, return a list of the keys in object *o*. On failure, return " +"``NULL``." +msgstr "成功时,返回对象 *o* 中的键的列表。失败时,返回 ``NULL``。" + +#: ../../c-api/mapping.rst:132 ../../c-api/mapping.rst:141 +#: ../../c-api/mapping.rst:150 +msgid "Previously, the function returned a list or a tuple." +msgstr "在之前版本中,此函数返回一个列表或元组。" + +#: ../../c-api/mapping.rst:138 +msgid "" +"On success, return a list of the values in object *o*. On failure, return " +"``NULL``." +msgstr "成功时,返回对象 *o* 中的值的列表。失败时,返回 ``NULL``。" + +#: ../../c-api/mapping.rst:147 +msgid "" +"On success, return a list of the items in object *o*, where each item is a " +"tuple containing a key-value pair. On failure, return ``NULL``." +msgstr "成功时,返回对象 *o* 中条目的列表,其中每个条目是一个包含键值对的元组。失败时,返回 ``NULL``。" + +#: ../../c-api/mapping.rst:23 +msgid "built-in function" +msgstr "内置函数" + +#: ../../c-api/mapping.rst:23 +msgid "len" +msgstr "len" diff --git a/c-api/marshal.po b/c-api/marshal.po new file mode 100644 index 0000000000..c1a425764f --- /dev/null +++ b/c-api/marshal.po @@ -0,0 +1,141 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/marshal.rst:6 +msgid "Data marshalling support" +msgstr "数据 marshal 操作支持" + +#: ../../c-api/marshal.rst:8 +msgid "" +"These routines allow C code to work with serialized objects using the same " +"data format as the :mod:`marshal` module. There are functions to write data" +" into the serialization format, and additional functions that can be used to" +" read the data back. Files used to store marshalled data must be opened in " +"binary mode." +msgstr "" +"这些例程允许 C 代码处理与 :mod:`marshal` 模块所用相同数据格式的序列化对象。 " +"其中有些函数可用来将数据写入这种序列化格式,另一些函数则可用来读取并恢复数据。用于存储 marshal 数据的文件必须以二进制模式打开。" + +#: ../../c-api/marshal.rst:14 +msgid "Numeric values are stored with the least significant byte first." +msgstr "数字值在存储时会将最低位字节放在开头。" + +#: ../../c-api/marshal.rst:16 +msgid "" +"The module supports several versions of the data format; see the " +":py:mod:`Python module documentation ` for details." +msgstr "该模块支持多种版本的数据格式;请参阅 :py:mod:`Python 模块文档 ` 了解详情。" + +#: ../../c-api/marshal.rst:21 +msgid "The current format version. See :py:data:`marshal.version`." +msgstr "当前格式版本。参见 :py:data:`marshal.version`。" + +#: ../../c-api/marshal.rst:25 +msgid "" +"Marshal a :c:expr:`long` integer, *value*, to *file*. This will only write " +"the least-significant 32 bits of *value*; regardless of the size of the " +"native :c:expr:`long` type. *version* indicates the file format." +msgstr "" +"将一个 :c:expr:`long` 整数 *value* 以 marshal 格式写入 *file*。这将只写入 *value* 中最低的 32 " +"个比特位;无论本机的 :c:expr:`long` 类型的大小如何。*version* 指明文件格式的版本。" + +#: ../../c-api/marshal.rst:29 ../../c-api/marshal.rst:37 +msgid "" +"This function can fail, in which case it sets the error indicator. Use " +":c:func:`PyErr_Occurred` to check for that." +msgstr "此函数可能失败,在这种情况下它会设置错误指示器。请使用 :c:func:`PyErr_Occurred` 进行检测。" + +#: ../../c-api/marshal.rst:34 +msgid "" +"Marshal a Python object, *value*, to *file*. *version* indicates the file " +"format." +msgstr "将一个 Python 对象 *value* 以 marshal 格式写入 *file*。 *version* 指明文件格式的版本。" + +#: ../../c-api/marshal.rst:42 +msgid "" +"Return a bytes object containing the marshalled representation of *value*. " +"*version* indicates the file format." +msgstr "返回一个包含 *value* 的 marshal 表示形式的字节串对象。 *version* 指明文件格式的版本。" + +#: ../../c-api/marshal.rst:46 +msgid "The following functions allow marshalled values to be read back in." +msgstr "以下函数允许读取并恢复存储为 marshal 格式的值。" + +#: ../../c-api/marshal.rst:51 +msgid "" +"Return a C :c:expr:`long` from the data stream in a :c:expr:`FILE*` opened " +"for reading. Only a 32-bit value can be read in using this function, " +"regardless of the native size of :c:expr:`long`." +msgstr "" +"从打开用于读取的 :c:expr:`FILE*` 对应的数据流返回一个 C :c:expr:`long`。使用此函数只能读取 32 位的值,无论本机 " +":c:expr:`long` 类型的大小如何。" + +#: ../../c-api/marshal.rst:55 ../../c-api/marshal.rst:65 +msgid "" +"On error, sets the appropriate exception (:exc:`EOFError`) and returns " +"``-1``." +msgstr "发生错误时,将设置适当的异常 (:exc:`EOFError`) 并返回 ``-1``。" + +#: ../../c-api/marshal.rst:61 +msgid "" +"Return a C :c:expr:`short` from the data stream in a :c:expr:`FILE*` opened " +"for reading. Only a 16-bit value can be read in using this function, " +"regardless of the native size of :c:expr:`short`." +msgstr "" +"从打开用于读取的 :c:expr:`FILE*` 对应的数据流返回一个 C :c:expr:`short`。使用此函数只能读取 16 位的值,无论本机 " +":c:expr:`short` 类型的大小如何。" + +#: ../../c-api/marshal.rst:71 +msgid "" +"Return a Python object from the data stream in a :c:expr:`FILE*` opened for " +"reading." +msgstr "从打开用于读取的 :c:expr:`FILE*` 对应的数据流返回一个 Python 对象。" + +#: ../../c-api/marshal.rst:74 ../../c-api/marshal.rst:88 +#: ../../c-api/marshal.rst:97 +msgid "" +"On error, sets the appropriate exception (:exc:`EOFError`, :exc:`ValueError`" +" or :exc:`TypeError`) and returns ``NULL``." +msgstr "" +"发生错误时,将设置适当的异常 (:exc:`EOFError`, :exc:`ValueError` 或 :exc:`TypeError`) 并返回 " +"``NULL`` 值。" + +#: ../../c-api/marshal.rst:80 +msgid "" +"Return a Python object from the data stream in a :c:expr:`FILE*` opened for " +"reading. Unlike :c:func:`PyMarshal_ReadObjectFromFile`, this function " +"assumes that no further objects will be read from the file, allowing it to " +"aggressively load file data into memory so that the de-serialization can " +"operate from data in memory rather than reading a byte at a time from the " +"file. Only use this variant if you are certain that you won't be reading " +"anything else from the file." +msgstr "" +"根据被打开用于读取的 :c:expr:`FILE*` 中的数据流返回一个 Python 对象。不同于 " +":c:func:`PyMarshal_ReadObjectFromFile`,此函数假定不会再从该文件读取更多的对象,允许其将文件数据积极地载入内存以便反序列化过程可以在内存中的数据上操作而不是每次从文件读取一个字节。" +" 只有当你确定不会再从该文件读取任何内容时方可使用此变体形式。" + +#: ../../c-api/marshal.rst:94 +msgid "" +"Return a Python object from the data stream in a byte buffer containing " +"*len* bytes pointed to by *data*." +msgstr "从 *data* 所指向的包含 *len* 个字节的字节缓冲区对应的数据流返回一个 Python 对象。" diff --git a/c-api/memory.po b/c-api/memory.po new file mode 100644 index 0000000000..40f7b45e1b --- /dev/null +++ b/c-api/memory.po @@ -0,0 +1,1457 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-06-11 18:32+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/memory.rst:8 +msgid "Memory Management" +msgstr "内存管理" + +#: ../../c-api/memory.rst:17 +msgid "Overview" +msgstr "概述" + +#: ../../c-api/memory.rst:19 +msgid "" +"Memory management in Python involves a private heap containing all Python " +"objects and data structures. The management of this private heap is ensured " +"internally by the *Python memory manager*. The Python memory manager has " +"different components which deal with various dynamic storage management " +"aspects, like sharing, segmentation, preallocation or caching." +msgstr "" +"在 Python 中,内存管理涉及到一个包含所有 Python 对象和数据结构的私有堆(heap)。这个私有堆的管理由内部的 *Python " +"内存管理器(Python memory manager)* 保证。Python " +"内存管理器有不同的组件来处理各种动态存储管理方面的问题,如共享、分割、预分配或缓存。" + +#: ../../c-api/memory.rst:25 +msgid "" +"At the lowest level, a raw memory allocator ensures that there is enough " +"room in the private heap for storing all Python-related data by interacting " +"with the memory manager of the operating system. On top of the raw memory " +"allocator, several object-specific allocators operate on the same heap and " +"implement distinct memory management policies adapted to the peculiarities " +"of every object type. For example, integer objects are managed differently " +"within the heap than strings, tuples or dictionaries because integers imply " +"different storage requirements and speed/space tradeoffs. The Python memory " +"manager thus delegates some of the work to the object-specific allocators, " +"but ensures that the latter operate within the bounds of the private heap." +msgstr "" +"在最底层,一个原始内存分配器通过与操作系统的内存管理器交互,确保私有堆中有足够的空间来存储所有与 Python " +"相关的数据。在原始内存分配器的基础上,几个对象特定的分配器在同一堆上运行,并根据每种对象类型的特点实现不同的内存管理策略。例如,整数对象在堆内的管理方式不同于字符串、元组或字典,因为整数需要不同的存储需求和速度与空间的权衡。因此,Python" +" 内存管理器将一些工作分配给对象特定分配器,但确保后者在私有堆的范围内运行。" + +#: ../../c-api/memory.rst:36 +msgid "" +"It is important to understand that the management of the Python heap is " +"performed by the interpreter itself and that the user has no control over " +"it, even if they regularly manipulate object pointers to memory blocks " +"inside that heap. The allocation of heap space for Python objects and other" +" internal buffers is performed on demand by the Python memory manager " +"through the Python/C API functions listed in this document." +msgstr "" +"Python 堆内存的管理是由解释器来执行,用户对它没有控制权,即使他们经常操作指向堆内内存块的对象指针,理解这一点十分重要。Python " +"对象和其他内部缓冲区的堆空间分配是由 Python 内存管理器按需通过本文档中列出的 Python/C API 函数进行的。" + +#: ../../c-api/memory.rst:49 +msgid "" +"To avoid memory corruption, extension writers should never try to operate on" +" Python objects with the functions exported by the C library: " +":c:func:`malloc`, :c:func:`calloc`, :c:func:`realloc` and :c:func:`free`. " +"This will result in mixed calls between the C allocator and the Python " +"memory manager with fatal consequences, because they implement different " +"algorithms and operate on different heaps. However, one may safely allocate" +" and release memory blocks with the C library allocator for individual " +"purposes, as shown in the following example::" +msgstr "" +"为了避免内存破坏,扩展的作者永远不应该试图用 C 库函数导出的函数来对 Python 对象进行操作,这些函数包括: :c:func:`malloc`, " +":c:func:`calloc`, :c:func:`realloc` 和 :c:func:`free`。这将导致 C 分配器和 Python " +"内存管理器之间的混用,引发严重后果,这是由于它们实现了不同的算法,并在不同的堆上操作。但是,我们可以安全地使用 C " +"库分配器为单独的目的分配和释放内存块,如下例所示:" + +#: ../../c-api/memory.rst:58 +msgid "" +"PyObject *res;\n" +"char *buf = (char *) malloc(BUFSIZ); /* for I/O */\n" +"\n" +"if (buf == NULL)\n" +" return PyErr_NoMemory();\n" +"...Do some I/O operation involving buf...\n" +"res = PyBytes_FromString(buf);\n" +"free(buf); /* malloc'ed */\n" +"return res;" +msgstr "" +"PyObject *res;\n" +"char *buf = (char *) malloc(BUFSIZ); /* for I/O */\n" +"\n" +"if (buf == NULL)\n" +" return PyErr_NoMemory();\n" +"...执行一些涉及 buf 的 I/O 操作...\n" +"res = PyBytes_FromString(buf);\n" +"free(buf); /* 已分配的 */\n" +"return res;" + +#: ../../c-api/memory.rst:68 +msgid "" +"In this example, the memory request for the I/O buffer is handled by the C " +"library allocator. The Python memory manager is involved only in the " +"allocation of the bytes object returned as a result." +msgstr "在这个例子中,I/O 缓冲区的内存请求是由 C 库分配器处理的。Python 内存管理器只参与了分配作为结果返回的字节对象。" + +#: ../../c-api/memory.rst:72 +msgid "" +"In most situations, however, it is recommended to allocate memory from the " +"Python heap specifically because the latter is under control of the Python " +"memory manager. For example, this is required when the interpreter is " +"extended with new object types written in C. Another reason for using the " +"Python heap is the desire to *inform* the Python memory manager about the " +"memory needs of the extension module. Even when the requested memory is used" +" exclusively for internal, highly specific purposes, delegating all memory " +"requests to the Python memory manager causes the interpreter to have a more " +"accurate image of its memory footprint as a whole. Consequently, under " +"certain circumstances, the Python memory manager may or may not trigger " +"appropriate actions, like garbage collection, memory compaction or other " +"preventive procedures. Note that by using the C library allocator as shown " +"in the previous example, the allocated memory for the I/O buffer completely " +"escapes the Python memory manager." +msgstr "" + +#: ../../c-api/memory.rst:88 +msgid "" +"The :envvar:`PYTHONMALLOC` environment variable can be used to configure the" +" memory allocators used by Python." +msgstr "环境变量 :envvar:`PYTHONMALLOC` 可被用来配置 Python 所使用的内存分配器。" + +#: ../../c-api/memory.rst:91 +msgid "" +"The :envvar:`PYTHONMALLOCSTATS` environment variable can be used to print " +"statistics of the :ref:`pymalloc memory allocator ` every time a " +"new pymalloc object arena is created, and on shutdown." +msgstr "" +"环境变量 :envvar:`PYTHONMALLOCSTATS` 可以用来在每次创建新的 pymalloc 对象区域时以及在关闭时打印 " +":ref:`pymalloc 内存分配器 ` 的统计数据。" + +#: ../../c-api/memory.rst:96 +msgid "Allocator Domains" +msgstr "分配器域" + +#: ../../c-api/memory.rst:100 +msgid "" +"All allocating functions belong to one of three different \"domains\" (see " +"also :c:type:`PyMemAllocatorDomain`). These domains represent different " +"allocation strategies and are optimized for different purposes. The specific" +" details on how every domain allocates memory or what internal functions " +"each domain calls is considered an implementation detail, but for debugging " +"purposes a simplified table can be found at :ref:`default-memory-" +"allocators`. The APIs used to allocate and free a block of memory must be " +"from the same domain. For example, :c:func:`PyMem_Free` must be used to free" +" memory allocated using :c:func:`PyMem_Malloc`." +msgstr "" +"所有分配函数都归属于三个不同的“域”之一 (另请参阅 :c:type:`PyMemAllocatorDomain`)。 " +"这些域代表不同的分配策略并针对不同的目的进行了优化。每个域如何分配内存以及每个域会调用哪些内部函数的详情被认为是实现细节,但是出于调试目的可以在 " +":ref:`default-memory-allocators` 找到一张简化的表格。用于分配和释放内存的 API " +"必须来自同一个域。例如,:c:func:`PyMem_Free` 必须被用来释放使用 :c:func:`PyMem_Malloc` 分配的内存。" + +#: ../../c-api/memory.rst:109 +msgid "The three allocation domains are:" +msgstr "三个分配域分别是:" + +#: ../../c-api/memory.rst:111 +msgid "" +"Raw domain: intended for allocating memory for general-purpose memory " +"buffers where the allocation *must* go to the system allocator or where the " +"allocator can operate without an :term:`attached thread state`. The memory " +"is requested directly from the system. See :ref:`Raw Memory Interface `." +msgstr "" +"原始域:用于为通用内存缓冲区分配内存,其分配 *必须* 转到系统分配器或者可在没有 :term:`attached thread state` " +"的情况下使用的分配器。内存将直接自系统请求。参见 :ref:`原始内存接口 `。" + +#: ../../c-api/memory.rst:116 +msgid "" +"\"Mem\" domain: intended for allocating memory for Python buffers and " +"general-purpose memory buffers where the allocation must be performed with " +"an :term:`attached thread state`. The memory is taken from the Python " +"private heap. See :ref:`Memory Interface `." +msgstr "" +"“内存”域:用于为 Python 缓冲区和通用内存缓冲区分配内存,其分配必须在具有 :term:`attached thread state` " +"的情况下进行。内存将从 Python 私有堆获取。参见 :ref:`内存接口 `。" + +#: ../../c-api/memory.rst:121 +msgid "" +"Object domain: intended for allocating memory for Python objects. The memory" +" is taken from the Python private heap. See :ref:`Object allocators " +"`." +msgstr "" +"对象域:用于为 Python 对象分配内存。内存将从 Python 私有堆获取。参见 :ref:`对象分配器 `。" + +#: ../../c-api/memory.rst:126 +msgid "" +"The :term:`free-threaded ` build requires that only Python " +"objects are allocated using the \"object\" domain and that all Python " +"objects are allocated using that domain. This differs from the prior Python " +"versions, where this was only a best practice and not a hard requirement." +msgstr "" +":term:`自由线程 ` 构建版要求仅 Python 对象使用\"对象\"域来分配并且所有 Python " +"对象都使用该域来分配。这不同于之前的 Python 版本,在之前版本中这只是最佳实践而非硬性要求。" + +#: ../../c-api/memory.rst:130 +msgid "" +"For example, buffers (non-Python objects) should be allocated using " +":c:func:`PyMem_Malloc`, :c:func:`PyMem_RawMalloc`, or :c:func:`malloc`, but " +"not :c:func:`PyObject_Malloc`." +msgstr "" +"例如,缓冲区(非 Python 对象)的分配应当使用 :c:func:`PyMem_Malloc`, :c:func:`PyMem_RawMalloc`" +" 或 :c:func:`malloc`,而不能用 :c:func:`PyObject_Malloc`。" + +#: ../../c-api/memory.rst:133 +msgid "See :ref:`Memory Allocation APIs `." +msgstr "参见 :ref:`内存分配 API `。" + +#: ../../c-api/memory.rst:139 +msgid "Raw Memory Interface" +msgstr "原始内存接口" + +#: ../../c-api/memory.rst:141 +msgid "" +"The following function sets are wrappers to the system allocator. These " +"functions are thread-safe, so a :term:`thread state` does not need to be " +":term:`attached `." +msgstr "" +"以下函数集是系统分配器的包装器。这些函数是线程安全的,因此不需要 :term:`附加 ` " +":term:`thread state` 对象。" + +#: ../../c-api/memory.rst:145 +msgid "" +"The :ref:`default raw memory allocator ` uses the" +" following functions: :c:func:`malloc`, :c:func:`calloc`, :c:func:`realloc` " +"and :c:func:`!free`; call ``malloc(1)`` (or ``calloc(1, 1)``) when " +"requesting zero bytes." +msgstr "" +":ref:`默认原始内存分配器 ` 使用以下函数::c:func:`malloc`, " +":c:func:`calloc`, :c:func:`realloc` 和 :c:func:`!free`;当请求零个字节时则调用 " +"``malloc(1)`` (或 ``calloc(1, 1)``)。" + +#: ../../c-api/memory.rst:154 ../../c-api/memory.rst:232 +#: ../../c-api/memory.rst:365 +msgid "" +"Allocates *n* bytes and returns a pointer of type :c:expr:`void*` to the " +"allocated memory, or ``NULL`` if the request fails." +msgstr "分配 *n* 个字节并返回一个指向所分配内存的 :c:expr:`void*` 类型指针,如果请求失败则返回 ``NULL``。" + +#: ../../c-api/memory.rst:157 +msgid "" +"Requesting zero bytes returns a distinct non-``NULL`` pointer if possible, " +"as if ``PyMem_RawMalloc(1)`` had been called instead. The memory will not " +"have been initialized in any way." +msgstr "" +"请求零字节可能返回一个独特的非 ``NULL`` 指针,就像调用了 ``PyMem_RawMalloc(1)`` 一样。但是内存不会以任何方式被初始化。" + +#: ../../c-api/memory.rst:164 ../../c-api/memory.rst:242 +#: ../../c-api/memory.rst:375 +msgid "" +"Allocates *nelem* elements each of size *elsize* bytes and returns a pointer" +" of type :c:expr:`void*` to the allocated memory, or ``NULL`` if the request" +" fails. The memory is initialized to zeros." +msgstr "" + +#: ../../c-api/memory.rst:168 +msgid "" +"Requesting zero elements or elements of size zero bytes returns a distinct " +"non-``NULL`` pointer if possible, as if ``PyMem_RawCalloc(1, 1)`` had been " +"called instead." +msgstr "请求零字节可能返回一个独特的非 ``NULL`` 指针,就像调用了 ``PyMem_RawCalloc(1, 1)`` 一样。" + +#: ../../c-api/memory.rst:177 ../../c-api/memory.rst:255 +#: ../../c-api/memory.rst:388 +msgid "" +"Resizes the memory block pointed to by *p* to *n* bytes. The contents will " +"be unchanged to the minimum of the old and the new sizes." +msgstr "将 *p* 指向的内存块大小调整为 *n* 字节。以新旧内存块大小中的最小值为准,其中内容保持不变," + +#: ../../c-api/memory.rst:180 +msgid "" +"If *p* is ``NULL``, the call is equivalent to ``PyMem_RawMalloc(n)``; else " +"if *n* is equal to zero, the memory block is resized but is not freed, and " +"the returned pointer is non-``NULL``." +msgstr "" +"如果 *p* 是 ``NULL``,则相当于调用 ``PyMem_RawMalloc(n)``;如果 *n* 等于 " +"0,则内存块大小会被调整,但不会被释放,返回非 ``NULL`` 指针。" + +#: ../../c-api/memory.rst:184 +msgid "" +"Unless *p* is ``NULL``, it must have been returned by a previous call to " +":c:func:`PyMem_RawMalloc`, :c:func:`PyMem_RawRealloc` or " +":c:func:`PyMem_RawCalloc`." +msgstr "" +"除非 *p* 是 ``NULL``,否则它必须是之前调用 " +":c:func:`PyMem_RawMalloc`、:c:func:`PyMem_RawRealloc` 或 " +":c:func:`PyMem_RawCalloc` 所返回的。" + +#: ../../c-api/memory.rst:188 +msgid "" +"If the request fails, :c:func:`PyMem_RawRealloc` returns ``NULL`` and *p* " +"remains a valid pointer to the previous memory area." +msgstr "如果请求失败,:c:func:`PyMem_RawRealloc` 返回 ``NULL``,*p* 仍然是指向先前内存区域的有效指针。" + +#: ../../c-api/memory.rst:194 +msgid "" +"Frees the memory block pointed to by *p*, which must have been returned by a" +" previous call to :c:func:`PyMem_RawMalloc`, :c:func:`PyMem_RawRealloc` or " +":c:func:`PyMem_RawCalloc`. Otherwise, or if ``PyMem_RawFree(p)`` has been " +"called before, undefined behavior occurs." +msgstr "" +"释放 *p* 指向的内存块。*p* 必须是之前调用 " +":c:func:`PyMem_RawMalloc`、:c:func:`PyMem_RawRealloc` 或 " +":c:func:`PyMem_RawCalloc` 所返回的指针。否则,或在 ``PyMem_RawFree(p)`` " +"之前已经调用过的情况下,未定义的行为会发生。" + +#: ../../c-api/memory.rst:199 ../../c-api/memory.rst:276 +#: ../../c-api/memory.rst:409 +msgid "If *p* is ``NULL``, no operation is performed." +msgstr "如果 *p* 是 ``NULL``, 那么什么操作也不会进行。" + +#: ../../c-api/memory.rst:205 +msgid "Memory Interface" +msgstr "内存接口" + +#: ../../c-api/memory.rst:207 ../../c-api/memory.rst:344 +msgid "" +"The following function sets, modeled after the ANSI C standard, but " +"specifying behavior when requesting zero bytes, are available for allocating" +" and releasing memory from the Python heap." +msgstr "以下函数集,仿照 ANSI C 标准,并指定了请求零字节时的行为,可用于从 Python 堆分配和释放内存。" + +#: ../../c-api/memory.rst:211 +msgid "" +"In the GIL-enabled build (default build) the :ref:`default memory allocator " +"` uses the :ref:`pymalloc memory allocator " +"`, whereas in the :term:`free-threaded build`, the default is the " +":ref:`mimalloc memory allocator ` instead." +msgstr "" +"在启用 GIL 的构建(默认构建)上 :ref:`默认内存分配器 ` 使用 " +":ref:`pymalloc 内存分配器 `,而在 :term:`free-threaded build` 上,默认改用 " +":ref:`mimalloc 内存分配器 `。" + +#: ../../c-api/memory.rst:219 ../../c-api/memory.rst:361 +msgid "" +"There must be an :term:`attached thread state` when using these functions." +msgstr "在使用这些函数时必须有一个 :term:`attached thread state`。" + +#: ../../c-api/memory.rst:223 +msgid "" +"The default allocator is now pymalloc instead of system :c:func:`malloc`." +msgstr "现在默认的分配器是 pymalloc 而非系统的 :c:func:`malloc` 函数。" + +#: ../../c-api/memory.rst:227 +msgid "" +"In the :term:`free-threaded ` build, the default allocator " +"is now :ref:`mimalloc `." +msgstr "" +"在 :term:`free-threaded ` 构建上,现在默认的分配器是 :ref:`mimalloc " +"`。" + +#: ../../c-api/memory.rst:235 +msgid "" +"Requesting zero bytes returns a distinct non-``NULL`` pointer if possible, " +"as if ``PyMem_Malloc(1)`` had been called instead. The memory will not have " +"been initialized in any way." +msgstr "" +"请求零字节可能返回一个独特的非 ``NULL`` 指针,就像调用了 ``PyMem_Malloc(1)`` 一样。但是内存不会以任何方式被初始化。" + +#: ../../c-api/memory.rst:246 +msgid "" +"Requesting zero elements or elements of size zero bytes returns a distinct " +"non-``NULL`` pointer if possible, as if ``PyMem_Calloc(1, 1)`` had been " +"called instead." +msgstr "请求零字节可能返回一个独特的非 ``NULL`` 指针,就像调用了 ``PyMem_Calloc(1, 1)`` 一样。" + +#: ../../c-api/memory.rst:258 +msgid "" +"If *p* is ``NULL``, the call is equivalent to ``PyMem_Malloc(n)``; else if " +"*n* is equal to zero, the memory block is resized but is not freed, and the " +"returned pointer is non-``NULL``." +msgstr "" +"如果 *p* 是 ``NULL``,则相当于调用 ``PyMem_Malloc(n)``;如果 *n* 等于 " +"0,则内存块大小会被调整,但不会被释放,返回非 ``NULL`` 指针。" + +#: ../../c-api/memory.rst:262 +msgid "" +"Unless *p* is ``NULL``, it must have been returned by a previous call to " +":c:func:`PyMem_Malloc`, :c:func:`PyMem_Realloc` or :c:func:`PyMem_Calloc`." +msgstr "" +"除非 *p* 是 ``NULL``,否则它必须是之前调用 :c:func:`PyMem_Malloc`、:c:func:`PyMem_Realloc` " +"或 :c:func:`PyMem_Calloc` 所返回的。" + +#: ../../c-api/memory.rst:265 +msgid "" +"If the request fails, :c:func:`PyMem_Realloc` returns ``NULL`` and *p* " +"remains a valid pointer to the previous memory area." +msgstr "如果请求失败,:c:func:`PyMem_Realloc` 返回 ``NULL``,*p* 仍然是指向先前内存区域的有效指针。" + +#: ../../c-api/memory.rst:271 +msgid "" +"Frees the memory block pointed to by *p*, which must have been returned by a" +" previous call to :c:func:`PyMem_Malloc`, :c:func:`PyMem_Realloc` or " +":c:func:`PyMem_Calloc`. Otherwise, or if ``PyMem_Free(p)`` has been called " +"before, undefined behavior occurs." +msgstr "" +"释放 *p* 指向的内存块。*p* 必须是之前调用 :c:func:`PyMem_Malloc`、:c:func:`PyMem_Realloc` 或 " +":c:func:`PyMem_Calloc` 所返回的指针。否则,或在 ``PyMem_Free(p)`` 之前已经调用过的情况下,未定义的行为会发生。" + +#: ../../c-api/memory.rst:278 +msgid "" +"The following type-oriented macros are provided for convenience. Note that" +" *TYPE* refers to any C type." +msgstr "以下面向类型的宏为方便而提供。注意 *TYPE* 可以指任何 C 类型。" + +#: ../../c-api/memory.rst:284 +msgid "" +"Same as :c:func:`PyMem_Malloc`, but allocates ``(n * sizeof(TYPE))`` bytes " +"of memory. Returns a pointer cast to ``TYPE*``. The memory will not have " +"been initialized in any way." +msgstr "" +"与 :c:func:`PyMem_Malloc` 相同,但会分配 ``(n * sizeof(TYPE))`` 字节的内存。返回一个转换为 " +"``TYPE*`` 的指针。内存不会以任何方式被初始化。" + +#: ../../c-api/memory.rst:291 +msgid "" +"Same as :c:func:`PyMem_Realloc`, but the memory block is resized to ``(n * " +"sizeof(TYPE))`` bytes. Returns a pointer cast to ``TYPE*``. On return, *p* " +"will be a pointer to the new memory area, or ``NULL`` in the event of " +"failure." +msgstr "" +"与 :c:func:`PyMem_Realloc` 类似,但内存块的大小被调整为 ``(n * sizeof(TYPE))`` 个字节。返回一个转换为 " +"``TYPE*`` 的指针。在返回时,*p* 将是一个指向新内存区域的指针,或者如果执行失败则为 ``NULL``。" + +#: ../../c-api/memory.rst:296 +msgid "" +"This is a C preprocessor macro; *p* is always reassigned. Save the original" +" value of *p* to avoid losing memory when handling errors." +msgstr "这是一个 C 预处理宏, *p* 总是被重新赋值。请保存 *p* 的原始值,以避免在处理错误时丢失内存。" + +#: ../../c-api/memory.rst:302 +msgid "Same as :c:func:`PyMem_Free`." +msgstr "与 :c:func:`PyMem_Free` 相同" + +#: ../../c-api/memory.rst:306 +msgid "Deprecated aliases" +msgstr "一些已被弃用的别名" + +#: ../../c-api/memory.rst:308 +msgid "" +"These are :term:`soft deprecated` aliases to existing functions and macros. " +"They exist solely for backwards compatibility." +msgstr "这些是现有函数和宏的已处于 :term:`soft deprecated` 状态的别名。它们的存在只是为了向下兼容。" + +#: ../../c-api/memory.rst:315 +msgid "Deprecated alias" +msgstr "已弃用的别名" + +#: ../../c-api/memory.rst:316 +msgid "Corresponding function or macro" +msgstr "对应的函数或宏" + +#: ../../c-api/memory.rst:318 +msgid ":c:func:`PyMem_Malloc`" +msgstr ":c:func:`PyMem_Malloc`" + +#: ../../c-api/memory.rst:320 +msgid ":c:macro:`PyMem_New`" +msgstr ":c:macro:`PyMem_New`" + +#: ../../c-api/memory.rst:322 ../../c-api/memory.rst:511 +msgid ":c:func:`PyMem_Realloc`" +msgstr ":c:func:`PyMem_Realloc`" + +#: ../../c-api/memory.rst:324 +msgid ":c:macro:`PyMem_Resize`" +msgstr ":c:macro:`PyMem_Resize`" + +#: ../../c-api/memory.rst:326 ../../c-api/memory.rst:328 +#: ../../c-api/memory.rst:513 +msgid ":c:func:`PyMem_Free`" +msgstr ":c:func:`PyMem_Free`" + +#: ../../c-api/memory.rst:332 +msgid "" +"The macros are now aliases of the corresponding functions and macros. " +"Previously, their behavior was the same, but their use did not necessarily " +"preserve binary compatibility across Python versions." +msgstr "这些宏现在是对应的函数和宏的别名。在之前版本中,它们的行为是相同的,但它们的使用不一定能跨 Python 版本保持二进制兼容。" + +#: ../../c-api/memory.rst:342 +msgid "Object allocators" +msgstr "对象分配器" + +#: ../../c-api/memory.rst:349 +msgid "" +"There is no guarantee that the memory returned by these allocators can be " +"successfully cast to a Python object when intercepting the allocating " +"functions in this domain by the methods described in the :ref:`Customize " +"Memory Allocators ` section." +msgstr "" +"当通过 :ref:`自定义内存分配器 ` " +"部分描述的方法拦截该域中的分配函数时,无法保证这些分配器返回的内存可以被成功地转换成 Python 对象。" + +#: ../../c-api/memory.rst:354 +msgid "" +"The :ref:`default object allocator ` uses the " +":ref:`pymalloc memory allocator `. In the :term:`free-threaded " +"` build, the default is the :ref:`mimalloc memory allocator " +"` instead." +msgstr "" +":ref:`默认对象分配器 ` 使用 :ref:`pymalloc 内存分配器 " +"`。 在 :term:`自由线程 ` 构建上,默认改用 :ref:`mimalloc 内存分配器 " +"`。" + +#: ../../c-api/memory.rst:368 +msgid "" +"Requesting zero bytes returns a distinct non-``NULL`` pointer if possible, " +"as if ``PyObject_Malloc(1)`` had been called instead. The memory will not " +"have been initialized in any way." +msgstr "" +"请求零字节可能返回一个独特的非 ``NULL`` 指针,就像调用了 ``PyObject_Malloc(1)`` 一样。但是内存不会以任何方式被初始化。" + +#: ../../c-api/memory.rst:379 +msgid "" +"Requesting zero elements or elements of size zero bytes returns a distinct " +"non-``NULL`` pointer if possible, as if ``PyObject_Calloc(1, 1)`` had been " +"called instead." +msgstr "请求零字节可能返回一个独特的非 ``NULL`` 指针,就像调用了 ``PyObject_Calloc(1, 1)`` 一样。" + +#: ../../c-api/memory.rst:391 +msgid "" +"If *p* is ``NULL``, the call is equivalent to ``PyObject_Malloc(n)``; else " +"if *n* is equal to zero, the memory block is resized but is not freed, and " +"the returned pointer is non-``NULL``." +msgstr "" +"如果 *p* 是 ``NULL``,则相当于调用 ``PyObject_Malloc(n)``;如果 *n* 等于 " +"0,则内存块大小会被调整,但不会被释放,返回非 ``NULL`` 指针。" + +#: ../../c-api/memory.rst:395 +msgid "" +"Unless *p* is ``NULL``, it must have been returned by a previous call to " +":c:func:`PyObject_Malloc`, :c:func:`PyObject_Realloc` or " +":c:func:`PyObject_Calloc`." +msgstr "" +"除非 *p* 是 ``NULL``,否则它必须是之前调用 " +":c:func:`PyObject_Malloc`、:c:func:`PyObject_Realloc` 或 " +":c:func:`PyObject_Calloc` 所返回的。" + +#: ../../c-api/memory.rst:398 +msgid "" +"If the request fails, :c:func:`PyObject_Realloc` returns ``NULL`` and *p* " +"remains a valid pointer to the previous memory area." +msgstr "如果请求失败,:c:func:`PyObject_Realloc` 返回 ``NULL``,*p* 仍然是指向先前内存区域的有效指针。" + +#: ../../c-api/memory.rst:404 +msgid "" +"Frees the memory block pointed to by *p*, which must have been returned by a" +" previous call to :c:func:`PyObject_Malloc`, :c:func:`PyObject_Realloc` or " +":c:func:`PyObject_Calloc`. Otherwise, or if ``PyObject_Free(p)`` has been " +"called before, undefined behavior occurs." +msgstr "" +"释放 *p* 指向的内存块。*p* 必须是之前调用 " +":c:func:`PyObject_Malloc`、:c:func:`PyObject_Realloc` 或 " +":c:func:`PyObject_Calloc` 所返回的指针。否则,或在 ``PyObject_Free(p)`` " +"之前已经调用过的情况下,未定义行为会发生。" + +#: ../../c-api/memory.rst:411 +msgid "" +"Do not call this directly to free an object's memory; call the type's " +":c:member:`~PyTypeObject.tp_free` slot instead." +msgstr "请不要直接调用此函数来释放对象的内存;而应调用类型的 :c:member:`~PyTypeObject.tp_free` 槽位。" + +#: ../../c-api/memory.rst:414 +msgid "" +"Do not use this for memory allocated by :c:macro:`PyObject_GC_New` or " +":c:macro:`PyObject_GC_NewVar`; use :c:func:`PyObject_GC_Del` instead." +msgstr "" +"请不要为 :c:macro:`PyObject_GC_New` 或 :c:macro:`PyObject_GC_NewVar` " +"所分配的内存使用此宏;而应改用 :c:func:`PyObject_GC_Del`。" + +#: ../../c-api/memory.rst:419 +msgid "" +":c:func:`PyObject_GC_Del` is the equivalent of this function for memory " +"allocated by types that support garbage collection." +msgstr ":c:func:`PyObject_GC_Del` 是该函数针对由支持垃圾回收的类型分配的内存的等价物。" + +#: ../../c-api/memory.rst:421 ../../c-api/memory.rst:519 +msgid ":c:func:`PyObject_Malloc`" +msgstr ":c:func:`PyObject_Malloc`" + +#: ../../c-api/memory.rst:422 ../../c-api/memory.rst:520 +msgid ":c:func:`PyObject_Realloc`" +msgstr ":c:func:`PyObject_Realloc`" + +#: ../../c-api/memory.rst:423 ../../c-api/memory.rst:521 +msgid ":c:func:`PyObject_Calloc`" +msgstr ":c:func:`PyObject_Calloc`" + +#: ../../c-api/memory.rst:424 +msgid ":c:macro:`PyObject_New`" +msgstr ":c:macro:`PyObject_New`" + +#: ../../c-api/memory.rst:425 +msgid ":c:macro:`PyObject_NewVar`" +msgstr ":c:macro:`PyObject_NewVar`" + +#: ../../c-api/memory.rst:426 +msgid ":c:func:`PyType_GenericAlloc`" +msgstr ":c:func:`PyType_GenericAlloc`" + +#: ../../c-api/memory.rst:427 +msgid ":c:member:`~PyTypeObject.tp_free`" +msgstr ":c:member:`~PyTypeObject.tp_free`" + +#: ../../c-api/memory.rst:433 +msgid "Default Memory Allocators" +msgstr "默认内存分配器" + +#: ../../c-api/memory.rst:435 +msgid "Default memory allocators:" +msgstr "默认内存分配器:" + +#: ../../c-api/memory.rst:438 +msgid "Configuration" +msgstr "配置" + +#: ../../c-api/memory.rst:438 +msgid "Name" +msgstr "名称" + +#: ../../c-api/memory.rst:438 +msgid "PyMem_RawMalloc" +msgstr "PyMem_RawMalloc" + +#: ../../c-api/memory.rst:438 +msgid "PyMem_Malloc" +msgstr "PyMem_Malloc" + +#: ../../c-api/memory.rst:438 +msgid "PyObject_Malloc" +msgstr "PyObject_Malloc" + +#: ../../c-api/memory.rst:440 +msgid "Release build" +msgstr "发布版本" + +#: ../../c-api/memory.rst:440 +msgid "``\"pymalloc\"``" +msgstr "``\"pymalloc\"``" + +#: ../../c-api/memory.rst:440 ../../c-api/memory.rst:442 +msgid "``malloc``" +msgstr "``malloc``" + +#: ../../c-api/memory.rst:440 +msgid "``pymalloc``" +msgstr "``pymalloc``" + +#: ../../c-api/memory.rst:441 +msgid "Debug build" +msgstr "调试构建" + +#: ../../c-api/memory.rst:441 +msgid "``\"pymalloc_debug\"``" +msgstr "``\"pymalloc_debug\"``" + +#: ../../c-api/memory.rst:441 ../../c-api/memory.rst:443 +msgid "``malloc`` + debug" +msgstr "``malloc`` + debug" + +#: ../../c-api/memory.rst:441 +msgid "``pymalloc`` + debug" +msgstr "``pymalloc`` + debug" + +#: ../../c-api/memory.rst:442 +msgid "Release build, without pymalloc" +msgstr "没有 pymalloc 的发布版本" + +#: ../../c-api/memory.rst:442 +msgid "``\"malloc\"``" +msgstr "``\"malloc\"``" + +#: ../../c-api/memory.rst:443 +msgid "Debug build, without pymalloc" +msgstr "没有 pymalloc 的调试构建" + +#: ../../c-api/memory.rst:443 +msgid "``\"malloc_debug\"``" +msgstr "``\"malloc_debug\"``" + +#: ../../c-api/memory.rst:444 +msgid "Free-threaded build" +msgstr "自由线程构建版" + +#: ../../c-api/memory.rst:444 +msgid "``\"mimalloc\"``" +msgstr "``\"mimalloc\"``" + +#: ../../c-api/memory.rst:444 +msgid "``mimalloc``" +msgstr "``mimalloc``" + +#: ../../c-api/memory.rst:445 +msgid "Free-threaded debug build" +msgstr "自由线程调试构建版" + +#: ../../c-api/memory.rst:445 +msgid "``\"mimalloc_debug\"``" +msgstr "``\"mimalloc_debug\"``" + +#: ../../c-api/memory.rst:445 +msgid "``mimalloc`` + debug" +msgstr "``mimalloc`` + debug" + +#: ../../c-api/memory.rst:448 +msgid "Legend:" +msgstr "说明:" + +#: ../../c-api/memory.rst:450 +msgid "Name: value for :envvar:`PYTHONMALLOC` environment variable." +msgstr "名称::envvar:`PYTHONMALLOC` 环境变量的值。" + +#: ../../c-api/memory.rst:451 +msgid "" +"``malloc``: system allocators from the standard C library, C functions: " +":c:func:`malloc`, :c:func:`calloc`, :c:func:`realloc` and :c:func:`free`." +msgstr "" +"``malloc``: 来自 C 标准库的系统分配器,C " +"函数::c:func:`malloc`、:c:func:`calloc`、:c:func:`realloc` 和 :c:func:`free`。" + +#: ../../c-api/memory.rst:453 +msgid "``pymalloc``: :ref:`pymalloc memory allocator `." +msgstr "``pymalloc``: :ref:`pymalloc 内存分配器 `。" + +#: ../../c-api/memory.rst:454 +msgid "``mimalloc``: :ref:`mimalloc memory allocator `." +msgstr "``mimalloc``: :ref:`mimalloc 内存分配器 `。" + +#: ../../c-api/memory.rst:455 +msgid "" +"\"+ debug\": with :ref:`debug hooks on the Python memory allocators `." +msgstr "\"+ debug\": 附带 :ref:`Python 内存分配器的调试钩子 `." + +#: ../../c-api/memory.rst:457 +msgid "\"Debug build\": :ref:`Python build in debug mode `." +msgstr "“调试构建”::ref:`调试模式下的 Python 构建 `。" + +#: ../../c-api/memory.rst:462 +msgid "Customize Memory Allocators" +msgstr "自定义内存分配器" + +#: ../../c-api/memory.rst:468 +msgid "" +"Structure used to describe a memory block allocator. The structure has the " +"following fields:" +msgstr "用于描述内存块分配器的结构体。该结构体具有下列字段:" + +#: ../../c-api/memory.rst:472 ../../c-api/memory.rst:723 +msgid "Field" +msgstr "域" + +#: ../../c-api/memory.rst:472 ../../c-api/memory.rst:723 +msgid "Meaning" +msgstr "含义" + +#: ../../c-api/memory.rst:474 ../../c-api/memory.rst:725 +msgid "``void *ctx``" +msgstr "``void *ctx``" + +#: ../../c-api/memory.rst:474 ../../c-api/memory.rst:725 +msgid "user context passed as first argument" +msgstr "作为第一个参数传入的用户上下文" + +#: ../../c-api/memory.rst:476 +msgid "``void* malloc(void *ctx, size_t size)``" +msgstr "``void* malloc(void *ctx, size_t size)``" + +#: ../../c-api/memory.rst:476 +msgid "allocate a memory block" +msgstr "分配一个内存块" + +#: ../../c-api/memory.rst:478 +msgid "``void* calloc(void *ctx, size_t nelem, size_t elsize)``" +msgstr "``void* calloc(void *ctx, size_t nelem, size_t elsize)``" + +#: ../../c-api/memory.rst:478 +msgid "allocate a memory block initialized with zeros" +msgstr "分配一个初始化为 0 的内存块" + +#: ../../c-api/memory.rst:481 +msgid "``void* realloc(void *ctx, void *ptr, size_t new_size)``" +msgstr "``void* realloc(void *ctx, void *ptr, size_t new_size)``" + +#: ../../c-api/memory.rst:481 +msgid "allocate or resize a memory block" +msgstr "分配一个内存块或调整其大小" + +#: ../../c-api/memory.rst:483 +msgid "``void free(void *ctx, void *ptr)``" +msgstr "``void free(void *ctx, void *ptr)``" + +#: ../../c-api/memory.rst:483 +msgid "free a memory block" +msgstr "释放一个内存块" + +#: ../../c-api/memory.rst:486 +msgid "" +"The :c:type:`!PyMemAllocator` structure was renamed to " +":c:type:`PyMemAllocatorEx` and a new ``calloc`` field was added." +msgstr "" +":c:type:`!PyMemAllocator` 结构被重命名为 :c:type:`PyMemAllocatorEx` 并新增了一个 " +"``calloc`` 字段。" + +#: ../../c-api/memory.rst:493 +msgid "Enum used to identify an allocator domain. Domains:" +msgstr "用来识别分配器域的枚举类。域有:" + +#: ../../c-api/memory.rst:499 ../../c-api/memory.rst:508 +#: ../../c-api/memory.rst:517 +msgid "Functions:" +msgstr "函数" + +#: ../../c-api/memory.rst:501 +msgid ":c:func:`PyMem_RawMalloc`" +msgstr ":c:func:`PyMem_RawMalloc`" + +#: ../../c-api/memory.rst:502 +msgid ":c:func:`PyMem_RawRealloc`" +msgstr ":c:func:`PyMem_RawRealloc`" + +#: ../../c-api/memory.rst:503 +msgid ":c:func:`PyMem_RawCalloc`" +msgstr ":c:func:`PyMem_RawCalloc`" + +#: ../../c-api/memory.rst:504 +msgid ":c:func:`PyMem_RawFree`" +msgstr ":c:func:`PyMem_RawFree`" + +#: ../../c-api/memory.rst:510 +msgid ":c:func:`PyMem_Malloc`," +msgstr ":c:func:`PyMem_Malloc`," + +#: ../../c-api/memory.rst:512 +msgid ":c:func:`PyMem_Calloc`" +msgstr ":c:func:`PyMem_Calloc`" + +#: ../../c-api/memory.rst:522 +msgid ":c:func:`PyObject_Free`" +msgstr ":c:func:`PyObject_Free`" + +#: ../../c-api/memory.rst:526 +msgid "Get the memory block allocator of the specified domain." +msgstr "获取指定域的内存块分配器。" + +#: ../../c-api/memory.rst:531 +msgid "Set the memory block allocator of the specified domain." +msgstr "设置指定域的内存块分配器。" + +#: ../../c-api/memory.rst:533 +msgid "" +"The new allocator must return a distinct non-``NULL`` pointer when " +"requesting zero bytes." +msgstr "当请求零字节时,新的分配器必须返回一个独特的非 ``NULL`` 指针。" + +#: ../../c-api/memory.rst:536 +msgid "" +"For the :c:macro:`PYMEM_DOMAIN_RAW` domain, the allocator must be thread-" +"safe: a :term:`thread state` is not :term:`attached `" +" when the allocator is called." +msgstr "" +"对于 :c:macro:`PYMEM_DOMAIN_RAW` 域,分配器必须是线程安全的:当分配器被调用时 :term:`thread state` " +"是没有 :term:`附加的 `。" + +#: ../../c-api/memory.rst:540 +msgid "" +"For the remaining domains, the allocator must also be thread-safe: the " +"allocator may be called in different interpreters that do not share a " +":term:`GIL`." +msgstr "对于其余的域,分配器也必须是线程安全的:分配器可以在不共享 :term:`GIL` 的不同解释器中被调用。" + +#: ../../c-api/memory.rst:544 +msgid "" +"If the new allocator is not a hook (does not call the previous allocator), " +"the :c:func:`PyMem_SetupDebugHooks` function must be called to reinstall the" +" debug hooks on top on the new allocator." +msgstr "" +"如果新的分配器不是钩子(不调用之前的分配器),必须调用 :c:func:`PyMem_SetupDebugHooks` " +"函数在新分配器上重新安装调试钩子。" + +#: ../../c-api/memory.rst:548 +msgid "" +"See also :c:member:`PyPreConfig.allocator` and :ref:`Preinitialize Python " +"with PyPreConfig `." +msgstr "" +"另请参阅 :c:member:`PyPreConfig.allocator` 和 :ref:`Preinitialize Python with " +"PyPreConfig ` 一节。" + +#: ../../c-api/memory.rst:553 +msgid ":c:func:`PyMem_SetAllocator` does have the following contract:" +msgstr ":c:func:`PyMem_SetAllocator` 确实具有以下合约:" + +#: ../../c-api/memory.rst:555 +msgid "" +"It can be called after :c:func:`Py_PreInitialize` and before " +":c:func:`Py_InitializeFromConfig` to install a custom memory allocator. " +"There are no restrictions over the installed allocator other than the ones " +"imposed by the domain (for instance, the Raw Domain allows the allocator to " +"be called without an :term:`attached thread state`). See :ref:`the section " +"on allocator domains ` for more information." +msgstr "" +"可以在 :c:func:`Py_PreInitialize` 之后和 :c:func:`Py_InitializeFromConfig` " +"之前调用它来安装自定义的内存分配器。对于所安装的分配器除了域的规定以外没有任何其他限制(例如 Raw Domain 允许分配器在没有 " +":term:`attached thread state` 的情况下被调用)。请参阅 :ref:`有关分配器域的章节 ` 来了解详情。" + +#: ../../c-api/memory.rst:563 +msgid "" +"If called after Python has finish initializing (after " +":c:func:`Py_InitializeFromConfig` has been called) the allocator **must** " +"wrap the existing allocator. Substituting the current allocator for some " +"other arbitrary one is **not supported**." +msgstr "" +"如果在 Python 已完成初始化之后(即 :c:func:`Py_InitializeFromConfig` " +"被调用之后)被调用则自定义分配器**必须**包装现有的分配器。将现有分配器替换为任意的其他分配器是 **不受支持的**。" + +#: ../../c-api/memory.rst:568 +msgid "All allocators must be thread-safe." +msgstr "所有分配器都必须是线程安全的。" + +#: ../../c-api/memory.rst:574 +msgid "" +"Setup :ref:`debug hooks in the Python memory allocators `" +" to detect memory errors." +msgstr "设置 :ref:`Python 内存分配器的调试钩子 ` 以检测内存错误。" + +#: ../../c-api/memory.rst:581 +msgid "Debug hooks on the Python memory allocators" +msgstr "Python 内存分配器的调试钩子" + +#: ../../c-api/memory.rst:583 +msgid "" +"When :ref:`Python is built in debug mode `, the " +":c:func:`PyMem_SetupDebugHooks` function is called at the :ref:`Python " +"preinitialization ` to setup debug hooks on Python memory " +"allocators to detect memory errors." +msgstr "" +"当 :ref:`Python 在调试模式下构建 `,:c:func:`PyMem_SetupDebugHooks` 函数在 " +":ref:`Python 预初始化 ` 时被调用,以在 Python 内存分配器上设置调试钩子以检测内存错误。" + +#: ../../c-api/memory.rst:588 +msgid "" +"The :envvar:`PYTHONMALLOC` environment variable can be used to install debug" +" hooks on a Python compiled in release mode (ex: ``PYTHONMALLOC=debug``)." +msgstr "" +":envvar:`PYTHONMALLOC` 环境变量可被用于在以发行模式下编译的 Python 上安装调试钩子 (例如: " +"``PYTHONMALLOC=debug``)。" + +#: ../../c-api/memory.rst:591 +msgid "" +"The :c:func:`PyMem_SetupDebugHooks` function can be used to set debug hooks " +"after calling :c:func:`PyMem_SetAllocator`." +msgstr "" +":c:func:`PyMem_SetupDebugHooks` 函数可被用于在调用了 :c:func:`PyMem_SetAllocator` " +"之后设置调试钩子。" + +#: ../../c-api/memory.rst:594 +msgid "" +"These debug hooks fill dynamically allocated memory blocks with special, " +"recognizable bit patterns. Newly allocated memory is filled with the byte " +"``0xCD`` (``PYMEM_CLEANBYTE``), freed memory is filled with the byte " +"``0xDD`` (``PYMEM_DEADBYTE``). Memory blocks are surrounded by \"forbidden " +"bytes\" filled with the byte ``0xFD`` (``PYMEM_FORBIDDENBYTE``). Strings of " +"these bytes are unlikely to be valid addresses, floats, or ASCII strings." +msgstr "" +"这些调试钩子用特殊的、可辨认的位模式填充动态分配的内存块。新分配的内存用字节 ``0xCD`` (``PYMEM_CLEANBYTE``) " +"填充,释放的内存用字节 ``0xDD`` (``PYMEM_DEADBYTE``) 填充。内存块被填充了字节 ``0xFD`` " +"(``PYMEM_FORBIDDENBYTE``) 的“禁止字节”包围。这些字节串不太可能是合法的地址、浮点数或 ASCII 字符串。" + +#: ../../c-api/memory.rst:601 +msgid "Runtime checks:" +msgstr "运行时检查:" + +#: ../../c-api/memory.rst:603 +msgid "" +"Detect API violations. For example, detect if :c:func:`PyObject_Free` is " +"called on a memory block allocated by :c:func:`PyMem_Malloc`." +msgstr "" +"检测对 API 的违反。例如:检测对 :c:func:`PyMem_Malloc` 分配的内存块调用 :c:func:`PyObject_Free`。" + +#: ../../c-api/memory.rst:605 +msgid "Detect write before the start of the buffer (buffer underflow)." +msgstr "检测缓冲区起始位置前的写入(缓冲区下溢)。" + +#: ../../c-api/memory.rst:606 +msgid "Detect write after the end of the buffer (buffer overflow)." +msgstr "检测缓冲区终止位置后的写入(缓冲区溢出)。" + +#: ../../c-api/memory.rst:607 +msgid "" +"Check that there is an :term:`attached thread state` when allocator " +"functions of :c:macro:`PYMEM_DOMAIN_OBJ` (ex: :c:func:`PyObject_Malloc`) and" +" :c:macro:`PYMEM_DOMAIN_MEM` (ex: :c:func:`PyMem_Malloc`) domains are " +"called." +msgstr "" +"检测当调用 :c:macro:`PYMEM_DOMAIN_OBJ` (如::c:func:`PyObject_Malloc`) 和 " +":c:macro:`PYMEM_DOMAIN_MEM` (如::c:func:`PyMem_Malloc`) 域的分配器函数时是否持有 " +":term:`attached thread state` 状态。" + +#: ../../c-api/memory.rst:612 +msgid "" +"On error, the debug hooks use the :mod:`tracemalloc` module to get the " +"traceback where a memory block was allocated. The traceback is only " +"displayed if :mod:`tracemalloc` is tracing Python memory allocations and the" +" memory block was traced." +msgstr "" +"在出错时,调试钩子使用 :mod:`tracemalloc` 模块来回溯内存块被分配的位置。只有当 :mod:`tracemalloc` 正在追踪 " +"Python 内存分配,并且内存块被追踪时,才会显示回溯。" + +#: ../../c-api/memory.rst:617 +msgid "" +"Let *S* = ``sizeof(size_t)``. ``2*S`` bytes are added at each end of each " +"block of *N* bytes requested. The memory layout is like so, where p " +"represents the address returned by a malloc-like or realloc-like function " +"(``p[i:j]`` means the slice of bytes from ``*(p+i)`` inclusive up to " +"``*(p+j)`` exclusive; note that the treatment of negative indices differs " +"from a Python slice):" +msgstr "" +"让 *S* = ``sizeof(size_t)``。将 ``2*S`` 个字节添加到每个被请求的 *N* 字节数据块的两端。内存的布局像是这样,其中 " +"p 代表由类似 malloc 或类似 realloc 的函数所返回的地址 (``p[i:j]`` 表示从 ``*(p+i)`` 左侧开始到 " +"``*(p+j)`` 左侧止的字节数据切片;请注意对负索引号的处理与 Python 切片是不同的):" + +#: ../../c-api/memory.rst:623 +msgid "``p[-2*S:-S]``" +msgstr "``p[-2*S:-S]``" + +#: ../../c-api/memory.rst:624 +msgid "" +"Number of bytes originally asked for. This is a size_t, big-endian (easier " +"to read in a memory dump)." +msgstr "最初所要求的字节数。这是一个 size_t,为大端序(易于在内存转储中读取)。" + +#: ../../c-api/memory.rst:626 +msgid "``p[-S]``" +msgstr "``p[-S]``" + +#: ../../c-api/memory.rst:627 +msgid "API identifier (ASCII character):" +msgstr "API 标识符(ASCII 字符):" + +#: ../../c-api/memory.rst:629 +msgid "``'r'`` for :c:macro:`PYMEM_DOMAIN_RAW`." +msgstr "``'r'`` 表示 :c:macro:`PYMEM_DOMAIN_RAW`。" + +#: ../../c-api/memory.rst:630 +msgid "``'m'`` for :c:macro:`PYMEM_DOMAIN_MEM`." +msgstr "``'m'`` 表示 :c:macro:`PYMEM_DOMAIN_MEM`。" + +#: ../../c-api/memory.rst:631 +msgid "``'o'`` for :c:macro:`PYMEM_DOMAIN_OBJ`." +msgstr "``'o'`` 表示 :c:macro:`PYMEM_DOMAIN_OBJ`。" + +#: ../../c-api/memory.rst:633 +msgid "``p[-S+1:0]``" +msgstr "``p[-S+1:0]``" + +#: ../../c-api/memory.rst:634 +msgid "Copies of PYMEM_FORBIDDENBYTE. Used to catch under- writes and reads." +msgstr "PYMEM_FORBIDDENBYTE 的副本。用于捕获下层的写入和读取。" + +#: ../../c-api/memory.rst:636 +msgid "``p[0:N]``" +msgstr "``p[0:N]``" + +#: ../../c-api/memory.rst:637 +msgid "" +"The requested memory, filled with copies of PYMEM_CLEANBYTE, used to catch " +"reference to uninitialized memory. When a realloc-like function is called " +"requesting a larger memory block, the new excess bytes are also filled with " +"PYMEM_CLEANBYTE. When a free-like function is called, these are overwritten" +" with PYMEM_DEADBYTE, to catch reference to freed memory. When a realloc- " +"like function is called requesting a smaller memory block, the excess old " +"bytes are also filled with PYMEM_DEADBYTE." +msgstr "" +"所请求的内存,用 PYMEM_CLEANBYTE 的副本填充,用于捕获对未初始化内存的引用。当调用 realloc " +"之类的函数来请求更大的内存块时,额外新增的字节也会用 PYMEM_CLEANBYTE 来填充。当调用 free 之类的函数时,这些字节会用 " +"PYMEM_DEADBYTE 来重写,以捕获对已释放内存的引用。当调用 realloc 之类的函数来请求更小的内存块时,多余的旧字节也会用 " +"PYMEM_DEADBYTE 来填充。" + +#: ../../c-api/memory.rst:645 +msgid "``p[N:N+S]``" +msgstr "``p[N:N+S]``" + +#: ../../c-api/memory.rst:646 +msgid "Copies of PYMEM_FORBIDDENBYTE. Used to catch over- writes and reads." +msgstr "PYMEM_FORBIDDENBYTE 的副本。用于捕获超限的写入和读取。" + +#: ../../c-api/memory.rst:648 +msgid "``p[N+S:N+2*S]``" +msgstr "``p[N+S:N+2*S]``" + +#: ../../c-api/memory.rst:649 +msgid "" +"Only used if the ``PYMEM_DEBUG_SERIALNO`` macro is defined (not defined by " +"default)." +msgstr "仅当定义了 ``PYMEM_DEBUG_SERIALNO`` 宏时会被使用(默认未定义)。" + +#: ../../c-api/memory.rst:652 +msgid "" +"A serial number, incremented by 1 on each call to a malloc-like or realloc-" +"like function. Big-endian :c:type:`size_t`. If \"bad memory\" is detected " +"later, the serial number gives an excellent way to set a breakpoint on the " +"next run, to capture the instant at which this block was passed out. The " +"static function bumpserialno() in obmalloc.c is the only place the serial " +"number is incremented, and exists so you can set such a breakpoint easily." +msgstr "" +"一个序列号,每次调用 malloc 或 realloc 之类的函数时都会递增 1。大端序的 " +":c:type:`size_t`。如果之后检测到了“被破坏的内存”,此序列号提供了一个很好的手段用来在下次运行时设置中断点,以捕获该内存块被破坏的瞬间。obmalloc.c" +" 中的静态函数 bumpserialno() 是唯一会递增序列号的函数,它的存在让你可以轻松地设置这样的中断点。" + +#: ../../c-api/memory.rst:659 +msgid "" +"A realloc-like or free-like function first checks that the " +"PYMEM_FORBIDDENBYTE bytes at each end are intact. If they've been altered, " +"diagnostic output is written to stderr, and the program is aborted via " +"Py_FatalError(). The other main failure mode is provoking a memory error " +"when a program reads up one of the special bit patterns and tries to use it " +"as an address. If you get in a debugger then and look at the object, you're" +" likely to see that it's entirely filled with PYMEM_DEADBYTE (meaning freed " +"memory is getting used) or PYMEM_CLEANBYTE (meaning uninitialized memory is " +"getting used)." +msgstr "" +"一个 realloc 之类或 free 之类的函数会先检查两端的 PYMEM_FORBIDDENBYTE 字节是否完好。 " +"如果它们被改变了,则会将诊断输出写入到 stderr,并且程序将通过 Py_FatalError() 中止。 " +"另一种主要的失败模式是当程序读到某种特殊的比特模式并试图将其用作地址时触发内存错误。如果你随即进入调试器并查看该对象,你很可能会看到它已完全被填充为 " +"PYMEM_DEADBYTE (意味着已释放的内存被使用) 或 PYMEM_CLEANBYTE (意味着未初始化的内存被使用)。" + +#: ../../c-api/memory.rst:668 +msgid "" +"The :c:func:`PyMem_SetupDebugHooks` function now also works on Python " +"compiled in release mode. On error, the debug hooks now use " +":mod:`tracemalloc` to get the traceback where a memory block was allocated. " +"The debug hooks now also check if there is an :term:`attached thread state` " +"when functions of :c:macro:`PYMEM_DOMAIN_OBJ` and " +":c:macro:`PYMEM_DOMAIN_MEM` domains are called." +msgstr "" +":c:func:`PyMem_SetupDebugHooks` 函数现在也能在使用发布模式编译的 Python 上工作。 " +"当发生错误时,调试钩子现在会使用 :mod:`tracemalloc` 来获取已分配内存块的回溯信息。调试钩子现在还会在 " +":c:macro:`PYMEM_DOMAIN_OBJ` 和 :c:macro:`PYMEM_DOMAIN_MEM` 作用域的函数被调用时检查是否有 " +":term:`attached thread state` 状态。" + +#: ../../c-api/memory.rst:676 +msgid "" +"Byte patterns ``0xCB`` (``PYMEM_CLEANBYTE``), ``0xDB`` (``PYMEM_DEADBYTE``) " +"and ``0xFB`` (``PYMEM_FORBIDDENBYTE``) have been replaced with ``0xCD``, " +"``0xDD`` and ``0xFD`` to use the same values than Windows CRT debug " +"``malloc()`` and ``free()``." +msgstr "" +"字节模式 ``0xCB`` (``PYMEM_CLEANBYTE``)、``0xDB`` (``PYMEM_DEADBYTE``) 和 ``0xFB``" +" (``PYMEM_FORBIDDENBYTE``) 已被 ``0xCD``、``0xDD`` 和 ``0xFD`` 替代以使用与 Windows " +"CRT 调试 ``malloc()`` 和 ``free()`` 相同的值。" + +#: ../../c-api/memory.rst:686 +msgid "The pymalloc allocator" +msgstr "pymalloc 分配器" + +#: ../../c-api/memory.rst:688 +msgid "" +"Python has a *pymalloc* allocator optimized for small objects (smaller or " +"equal to 512 bytes) with a short lifetime. It uses memory mappings called " +"\"arenas\" with a fixed size of either 256 KiB on 32-bit platforms or 1 MiB " +"on 64-bit platforms. It falls back to :c:func:`PyMem_RawMalloc` and " +":c:func:`PyMem_RawRealloc` for allocations larger than 512 bytes." +msgstr "" +"Python 有一个针对短生命周期的小对象(小于或等于 512 字节)进行了优化的 *pymalloc* 分配器。 " +"它使用名为“arena”的内存映射,在 32 位平台上的固定大小为 256 KiB,在 64 位平台上的固定大小为 1 MiB。对于大于 512 " +"字节的分配,它会回退为 :c:func:`PyMem_RawMalloc` 和 :c:func:`PyMem_RawRealloc`。" + +#: ../../c-api/memory.rst:694 +msgid "" +"*pymalloc* is the :ref:`default allocator ` of " +"the :c:macro:`PYMEM_DOMAIN_MEM` (ex: :c:func:`PyMem_Malloc`) and " +":c:macro:`PYMEM_DOMAIN_OBJ` (ex: :c:func:`PyObject_Malloc`) domains." +msgstr "" +"*pymalloc* 是 :c:macro:`PYMEM_DOMAIN_MEM` (例如::c:func:`PyMem_Malloc`) 和 " +":c:macro:`PYMEM_DOMAIN_OBJ` (例如::c:func:`PyObject_Malloc`) 域的 :ref:`默认分配器 " +"` 实现。" + +#: ../../c-api/memory.rst:698 +msgid "The arena allocator uses the following functions:" +msgstr "arena 分配器使用以下函数:" + +#: ../../c-api/memory.rst:700 +msgid ":c:func:`!VirtualAlloc` and :c:func:`!VirtualFree` on Windows," +msgstr "Windows 上的 :c:func:`!VirtualAlloc` 和 :c:func:`!VirtualFree`," + +#: ../../c-api/memory.rst:701 +msgid ":c:func:`!mmap` and :c:func:`!munmap` if available," +msgstr ":c:func:`!mmap` 和 :c:func:`!munmap`,如果可用的话," + +#: ../../c-api/memory.rst:702 +msgid ":c:func:`malloc` and :c:func:`free` otherwise." +msgstr "否则,:c:func:`malloc` 和 :c:func:`free`。" + +#: ../../c-api/memory.rst:704 +msgid "" +"This allocator is disabled if Python is configured with the " +":option:`--without-pymalloc` option. It can also be disabled at runtime " +"using the :envvar:`PYTHONMALLOC` environment variable (ex: " +"``PYTHONMALLOC=malloc``)." +msgstr "" +"如果 Python 配置了 :option:`--without-pymalloc` 选项,那么此分配器将被禁用。 也可以在运行时使用 " +":envvar:`PYTHONMALLOC` (例如: ``PYTHONMALLOC=malloc``) 环境变量来禁用它。" + +#: ../../c-api/memory.rst:708 +msgid "" +"Typically, it makes sense to disable the pymalloc allocator when building " +"Python with AddressSanitizer (:option:`--with-address-sanitizer`) which " +"helps uncover low level bugs within the C code." +msgstr "" +"通常,在使用 AddressSanitizer(通过 :option:`--with-address-sanitizer` 选项)构建 Python " +"时,建议禁用 pymalloc 内存分配器,这有助于发现 C 代码中的底层错误。" + +#: ../../c-api/memory.rst:713 +msgid "Customize pymalloc Arena Allocator" +msgstr "自定义 pymalloc Arena 分配器" + +#: ../../c-api/memory.rst:719 +msgid "" +"Structure used to describe an arena allocator. The structure has three " +"fields:" +msgstr "用来描述一个 arena 分配器的结构体。这个结构体有三个字段:" + +#: ../../c-api/memory.rst:727 +msgid "``void* alloc(void *ctx, size_t size)``" +msgstr "``void* alloc(void *ctx, size_t size)``" + +#: ../../c-api/memory.rst:727 +msgid "allocate an arena of size bytes" +msgstr "分配一块 size 字节的区域" + +#: ../../c-api/memory.rst:729 +msgid "``void free(void *ctx, void *ptr, size_t size)``" +msgstr "``void free(void *ctx, void *ptr, size_t size)``" + +#: ../../c-api/memory.rst:729 +msgid "free an arena" +msgstr "释放一块区域" + +#: ../../c-api/memory.rst:734 +msgid "Get the arena allocator." +msgstr "获取 arena 分配器" + +#: ../../c-api/memory.rst:738 +msgid "Set the arena allocator." +msgstr "设置 arena 分配器" + +#: ../../c-api/memory.rst:743 +msgid "The mimalloc allocator" +msgstr "mimalloc 分配器" + +#: ../../c-api/memory.rst:747 +msgid "" +"Python supports the `mimalloc `__ " +"allocator when the underlying platform support is available. mimalloc is a " +"general purpose allocator with excellent performance characteristics, " +"initially developed by Daan Leijen for the runtime systems of the Koka and " +"Lean languages." +msgstr "" +"Python 会在下层平台支持可用时支持 `mimalloc `__ " +"分配器。 mimalloc 是一款具有优良运行效率特性的通用分配器,它最初由 Daan Leijen 针对 Koka 和 Lean 语言运行时系统开发。" + +#: ../../c-api/memory.rst:753 +msgid "" +"Unlike :ref:`pymalloc `, which is optimized for small objects (512" +" bytes or fewer), mimalloc handles allocations of any size." +msgstr "" + +#: ../../c-api/memory.rst:756 +msgid "" +"In the :term:`free-threaded ` build, mimalloc is the default" +" and **required** allocator for the :c:macro:`PYMEM_DOMAIN_MEM` and " +":c:macro:`PYMEM_DOMAIN_OBJ` domains. It cannot be disabled in free-threaded" +" builds. The free-threaded build uses per-thread mimalloc heaps, which " +"allows allocation and deallocation to proceed without locking in most cases." +msgstr "" + +#: ../../c-api/memory.rst:762 +msgid "" +"In the default (non-free-threaded) build, mimalloc is available but not the " +"default allocator. It can be selected at runtime using " +":envvar:`PYTHONMALLOC`\\ ``=mimalloc`` (or ``mimalloc_debug`` to include " +":ref:`debug hooks `). It can be disabled at build time " +"using the :option:`--without-mimalloc` configure option, but this option " +"cannot be combined with :option:`--disable-gil`." +msgstr "" + +#: ../../c-api/memory.rst:770 +msgid "tracemalloc C API" +msgstr "tracemalloc C API" + +#: ../../c-api/memory.rst:776 +msgid "Track an allocated memory block in the :mod:`tracemalloc` module." +msgstr "在 :mod:`tracemalloc` 模块中跟踪一个已分配的内存块。" + +#: ../../c-api/memory.rst:778 +msgid "" +"Return ``0`` on success, return ``-1`` on error (failed to allocate memory " +"to store the trace). Return ``-2`` if tracemalloc is disabled." +msgstr "" +"成功时返回 ``0``,出错时返回 ``-1`` (无法分配内存来保存跟踪信息)。如果禁用了 tracemalloc 则返回 ``-2``。" + +#: ../../c-api/memory.rst:781 +msgid "If memory block is already tracked, update the existing trace." +msgstr "如果内存块已被跟踪,则更新现有跟踪信息。" + +#: ../../c-api/memory.rst:785 +msgid "" +"Untrack an allocated memory block in the :mod:`tracemalloc` module. Do " +"nothing if the block was not tracked." +msgstr "在 :mod:`tracemalloc` 模块中取消跟踪一个已分配的内存块。如果内存块未被跟踪则不执行任何操作。" + +#: ../../c-api/memory.rst:788 +msgid "Return ``-2`` if tracemalloc is disabled, otherwise return ``0``." +msgstr "如果 tracemalloc 被禁用则返回 ``-2``,否则返回 ``0``。" + +#: ../../c-api/memory.rst:794 +msgid "Examples" +msgstr "例子" + +#: ../../c-api/memory.rst:796 +msgid "" +"Here is the example from section :ref:`memoryoverview`, rewritten so that " +"the I/O buffer is allocated from the Python heap by using the first function" +" set::" +msgstr "" +"以下是来自 :ref:`memoryoverview` 小节的示例,经过重写以使 I/O 缓冲区是通过使用第一个函数集从 Python 堆中分配的::" + +#: ../../c-api/memory.rst:799 +msgid "" +"PyObject *res;\n" +"char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */\n" +"\n" +"if (buf == NULL)\n" +" return PyErr_NoMemory();\n" +"/* ...Do some I/O operation involving buf... */\n" +"res = PyBytes_FromString(buf);\n" +"PyMem_Free(buf); /* allocated with PyMem_Malloc */\n" +"return res;" +msgstr "" +"PyObject *res;\n" +"char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */\n" +"\n" +"if (buf == NULL)\n" +" return PyErr_NoMemory();\n" +"/* ...执行一些涉及 buf 的 I/O 操作... */\n" +"res = PyBytes_FromString(buf);\n" +"PyMem_Free(buf); /* 使用 PyMem_Malloc 分配的 */\n" +"return res;" + +#: ../../c-api/memory.rst:809 +msgid "The same code using the type-oriented function set::" +msgstr "使用面向类型函数集的相同代码::" + +#: ../../c-api/memory.rst:811 +msgid "" +"PyObject *res;\n" +"char *buf = PyMem_New(char, BUFSIZ); /* for I/O */\n" +"\n" +"if (buf == NULL)\n" +" return PyErr_NoMemory();\n" +"/* ...Do some I/O operation involving buf... */\n" +"res = PyBytes_FromString(buf);\n" +"PyMem_Free(buf); /* allocated with PyMem_New */\n" +"return res;" +msgstr "" +"PyObject *res;\n" +"char *buf = PyMem_New(char, BUFSIZ); /* 用于 I/O */\n" +"\n" +"if (buf == NULL)\n" +" return PyErr_NoMemory();\n" +"/* ...执行一些涉及 buf 的 I/O 操作... */\n" +"res = PyBytes_FromString(buf);\n" +"PyMem_Free(buf); /* 使用 PyMem_New 分配的 */\n" +"return res;" + +#: ../../c-api/memory.rst:821 +msgid "" +"Note that in the two examples above, the buffer is always manipulated via " +"functions belonging to the same set. Indeed, it is required to use the same " +"memory API family for a given memory block, so that the risk of mixing " +"different allocators is reduced to a minimum. The following code sequence " +"contains two errors, one of which is labeled as *fatal* because it mixes two" +" different allocators operating on different heaps. ::" +msgstr "" +"请注意在以上两个示例中,缓冲区总是通过归属于相同集的函数来操纵的。事实上,对于一个给定的内存块必须使用相同的内存 API " +"族,以便使得混合不同分配器的风险减至最低。以下代码序列包含两处错误,其中一个被标记为 *fatal* 因为它混合了两种在不同堆上操作的不同分配器。::" + +#: ../../c-api/memory.rst:828 +msgid "" +"char *buf1 = PyMem_New(char, BUFSIZ);\n" +"char *buf2 = (char *) malloc(BUFSIZ);\n" +"char *buf3 = (char *) PyMem_Malloc(BUFSIZ);\n" +"...\n" +"PyMem_Del(buf3); /* Wrong -- should be PyMem_Free() */\n" +"free(buf2); /* Right -- allocated via malloc() */\n" +"free(buf1); /* Fatal -- should be PyMem_Free() */" +msgstr "" +"char *buf1 = PyMem_New(char, BUFSIZ);\n" +"char *buf2 = (char *) malloc(BUFSIZ);\n" +"char *buf3 = (char *) PyMem_Malloc(BUFSIZ);\n" +"...\n" +"PyMem_Del(buf3); /* 错误 -- 应为 PyMem_Free() */\n" +"free(buf2); /* 正确 -- 通过 malloc() 分配的 */\n" +"free(buf1); /* 致命错误 -- 应为 PyMem_Free() */" + +#: ../../c-api/memory.rst:836 +msgid "" +"In addition to the functions aimed at handling raw memory blocks from the " +"Python heap, objects in Python are allocated and released with " +":c:macro:`PyObject_New`, :c:macro:`PyObject_NewVar` and " +":c:func:`PyObject_Free`." +msgstr "" +"除了用于处理来自 Python 堆的原始内存块的函数,Python 中的对象还通过 :c:macro:`PyObject_New`, " +":c:macro:`PyObject_NewVar` 和 :c:func:`PyObject_Free` 进行分配和释放。" + +#: ../../c-api/memory.rst:840 +msgid "" +"These will be explained in the next chapter on defining and implementing new" +" object types in C." +msgstr "这些将在有关如何在 C 中定义和实现新对象类型的下一章中讲解。" + +#: ../../c-api/memory.rst:43 +msgid "malloc (C function)" +msgstr "malloc (C 函数)" + +#: ../../c-api/memory.rst:43 +msgid "calloc (C function)" +msgstr "calloc (C 函数)" + +#: ../../c-api/memory.rst:43 +msgid "realloc (C function)" +msgstr "realloc (C 函数)" + +#: ../../c-api/memory.rst:43 +msgid "free (C function)" +msgstr "free (C 函数)" diff --git a/c-api/memoryview.po b/c-api/memoryview.po new file mode 100644 index 0000000000..2e88a5e271 --- /dev/null +++ b/c-api/memoryview.po @@ -0,0 +1,131 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/memoryview.rst:9 +msgid "MemoryView objects" +msgstr "MemoryView 对象" + +#: ../../c-api/memoryview.rst:11 +msgid "" +"A :class:`memoryview` object exposes the C level :ref:`buffer interface " +"` as a Python object which can then be passed around like any" +" other object." +msgstr "" +"一个 :class:`memoryview` 对象将 C 级别的 :ref:`缓冲区接口 ` " +"暴露为一个可以像任何其他对象一样传递的 Python 对象。" + +#: ../../c-api/memoryview.rst:18 +msgid "" +"This instance of :c:type:`PyTypeObject` represents the Python memoryview " +"type. This is the same object as :class:`memoryview` in the Python layer." +msgstr "" +"这个 :c:type:`PyTypeObject` 的实例代表 Python memoryview 类型。这与 Python 层级的 " +":class:`memoryview` 是同一对象。" + +#: ../../c-api/memoryview.rst:24 +msgid "" +"Create a memoryview object from an object that provides the buffer " +"interface. If *obj* supports writable buffer exports, the memoryview object " +"will be read/write, otherwise it may be either read-only or read/write at " +"the discretion of the exporter." +msgstr "" +"从提供缓冲区接口的对象创建 memoryview 对象。如果 *obj* 支持可写缓冲区导出,则 memoryview " +"对象将可以被读/写,否则它可能是只读的,也可以是导出器自行决定的读/写。" + +#: ../../c-api/memoryview.rst:32 +msgid "Flag to request a readonly buffer." +msgstr "用于请求只读缓冲区的旗标。" + +#: ../../c-api/memoryview.rst:37 +msgid "Flag to request a writable buffer." +msgstr "用于请求可写缓冲区的旗标。" + +#: ../../c-api/memoryview.rst:42 +msgid "" +"Create a memoryview object using *mem* as the underlying buffer. *flags* can" +" be one of :c:macro:`PyBUF_READ` or :c:macro:`PyBUF_WRITE`." +msgstr "" +"使用 *mem* 作为底层缓冲区创建一个 memoryview 对象。 *flags* 可以是 :c:macro:`PyBUF_READ` 或者 " +":c:macro:`PyBUF_WRITE` 之一。" + +#: ../../c-api/memoryview.rst:49 +msgid "" +"Create a memoryview object wrapping the given buffer structure *view*. For " +"simple byte buffers, :c:func:`PyMemoryView_FromMemory` is the preferred " +"function." +msgstr "" +"创建一个包含给定缓冲区结构 *view* 的 memoryview 对象。 " +"对于简单的字节缓冲区,:c:func:`PyMemoryView_FromMemory` 是首选函数。" + +#: ../../c-api/memoryview.rst:55 +msgid "" +"Create a memoryview object to a :term:`contiguous` chunk of memory (in " +"either 'C' or 'F'ortran *order*) from an object that defines the buffer " +"interface. If memory is contiguous, the memoryview object points to the " +"original memory. Otherwise, a copy is made and the memoryview points to a " +"new bytes object." +msgstr "" +"从定义了缓冲区接口的对象创建一个指向 :term:`contiguous` 内存块(以 'C' 或 'F'ortran *order* 排列)的 " +"memoryview 对象。如果内存是连续的,则 memoryview 对象指向原始内存。否则,将创建一份副本并且 memoryview 指向新的 " +"bytes 对象。" + +#: ../../c-api/memoryview.rst:61 +msgid "" +"*buffertype* can be one of :c:macro:`PyBUF_READ` or :c:macro:`PyBUF_WRITE`." +msgstr "*buffertype* 可以为 :c:macro:`PyBUF_READ` 或 :c:macro:`PyBUF_WRITE` 中的一个。" + +#: ../../c-api/memoryview.rst:66 +msgid "" +"Return true if the object *obj* is a memoryview object. It is not currently" +" allowed to create subclasses of :class:`memoryview`. This function always " +"succeeds." +msgstr "" +"如果 *obj* 是一个 memoryview 对象则返回真值。目前不允许创建 :class:`memoryview` 的子类。 此函数总是会成功执行。" + +#: ../../c-api/memoryview.rst:73 +msgid "" +"Return a pointer to the memoryview's private copy of the exporter's buffer. " +"*mview* **must** be a memoryview instance; this macro doesn't check its " +"type, you must do it yourself or you will risk crashes." +msgstr "" +"返回指向 memoryview 的导出缓冲区私有副本的指针。 *mview* **必须** 是一个 memoryview " +"实例;这个宏不检查它的类型,你必须自己检查,否则你将面临崩溃风险。" + +#: ../../c-api/memoryview.rst:79 +msgid "" +"Return either a pointer to the exporting object that the memoryview is based" +" on or ``NULL`` if the memoryview has been created by one of the functions " +":c:func:`PyMemoryView_FromMemory` or :c:func:`PyMemoryView_FromBuffer`. " +"*mview* **must** be a memoryview instance." +msgstr "" +"返回 memoryview 所基于的导出对象的指针,或者如果 memoryview 已由函数 " +":c:func:`PyMemoryView_FromMemory` 或 :c:func:`PyMemoryView_FromBuffer` 创建则返回 " +"``NULL``。 *mview* **必须** 是一个 memoryview 实例。" + +#: ../../c-api/memoryview.rst:5 +msgid "object" +msgstr "object -- 对象" + +#: ../../c-api/memoryview.rst:5 +msgid "memoryview" +msgstr "memoryview" diff --git a/c-api/method.po b/c-api/method.po new file mode 100644 index 0000000000..89566b1039 --- /dev/null +++ b/c-api/method.po @@ -0,0 +1,136 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/method.rst:6 +msgid "Instance Method Objects" +msgstr "实例方法对象" + +#: ../../c-api/method.rst:10 +msgid "" +"An instance method is a wrapper for a :c:type:`PyCFunction` and the new way " +"to bind a :c:type:`PyCFunction` to a class object. It replaces the former " +"call ``PyMethod_New(func, NULL, class)``." +msgstr "" +"实例方法是 :c:type:`PyCFunction` 的包装器,也是将 :c:type:`PyCFunction` 与类对象绑定的新方法。 " +"它取代了以前的调用 ``PyMethod_New(func, NULL, class)``。" + +#: ../../c-api/method.rst:17 +msgid "" +"This instance of :c:type:`PyTypeObject` represents the Python instance " +"method type. It is not exposed to Python programs." +msgstr "这个 :c:type:`PyTypeObject` 实例代表 Python 实例方法类型。它并不对 Python 程序公开。" + +#: ../../c-api/method.rst:23 +msgid "" +"Return true if *o* is an instance method object (has type " +":c:data:`PyInstanceMethod_Type`). The parameter must not be ``NULL``. This " +"function always succeeds." +msgstr "" +"如果 *o* 是一个实例方法对象 (类型为 :c:data:`PyInstanceMethod_Type`) 则返回真值。形参必须不为 " +"``NULL``。此函数总是会成功执行。" + +#: ../../c-api/method.rst:30 +msgid "" +"Return a new instance method object, with *func* being any callable object. " +"*func* is the function that will be called when the instance method is " +"called." +msgstr "返回一个新的实例方法对象,*func* 应为任意可调用对象。 *func* 将在实例方法被调用时作为函数被调用。" + +#: ../../c-api/method.rst:37 +msgid "Return the function object associated with the instance method *im*." +msgstr "返回关联到实例方法 *im* 的函数对象。" + +#: ../../c-api/method.rst:42 +msgid "" +"Macro version of :c:func:`PyInstanceMethod_Function` which avoids error " +"checking." +msgstr "宏版本的 :c:func:`PyInstanceMethod_Function`,略去了错误检查。" + +#: ../../c-api/method.rst:48 +msgid "Method Objects" +msgstr "方法对象" + +#: ../../c-api/method.rst:52 +msgid "" +"Methods are bound function objects. Methods are always bound to an instance " +"of a user-defined class. Unbound methods (methods bound to a class object) " +"are no longer available." +msgstr "方法是绑定的函数对象。方法总是会被绑定到一个用户自定义类的实例。未绑定方法(绑定到一个类的方法)已不再可用。" + +#: ../../c-api/method.rst:61 +msgid "" +"This instance of :c:type:`PyTypeObject` represents the Python method type. " +"This is exposed to Python programs as ``types.MethodType``." +msgstr "" +"这个 :c:type:`PyTypeObject` 实例代表 Python 方法类型。它作为 ``types.MethodType`` 向 Python" +" 程序公开。" + +#: ../../c-api/method.rst:67 +msgid "" +"Return true if *o* is a method object (has type :c:data:`PyMethod_Type`). " +"The parameter must not be ``NULL``. This function always succeeds." +msgstr "" +"如果 *o* 是一个方法对象 (类型为 :c:data:`PyMethod_Type`) 则返回真值。形参必须不为 " +"``NULL``。此函数总是会成功执行。" + +#: ../../c-api/method.rst:73 +msgid "" +"Return a new method object, with *func* being any callable object and *self*" +" the instance the method should be bound. *func* is the function that will " +"be called when the method is called. *self* must not be ``NULL``." +msgstr "" +"返回一个新的方法对象,*func* 应为任意可调用对象,*self* 为该方法应绑定的实例。在方法被调用时 *func* 将作为函数被调用。*self*" +" 必须不为 ``NULL``。" + +#: ../../c-api/method.rst:80 +msgid "Return the function object associated with the method *meth*." +msgstr "返回关联到方法 *meth* 的函数对象。" + +#: ../../c-api/method.rst:85 +msgid "" +"Macro version of :c:func:`PyMethod_Function` which avoids error checking." +msgstr "宏版本的 :c:func:`PyMethod_Function`,略去了错误检查。" + +#: ../../c-api/method.rst:90 +msgid "Return the instance associated with the method *meth*." +msgstr "返回关联到方法 *meth* 的实例。" + +#: ../../c-api/method.rst:95 +msgid "Macro version of :c:func:`PyMethod_Self` which avoids error checking." +msgstr "宏版本的 :c:func:`PyMethod_Self`,略去了错误检查。" + +#: ../../c-api/method.rst:8 ../../c-api/method.rst:50 +msgid "object" +msgstr "object -- 对象" + +#: ../../c-api/method.rst:8 +msgid "instancemethod" +msgstr "instancemethod" + +#: ../../c-api/method.rst:50 +msgid "method" +msgstr "method -- 方法" + +#: ../../c-api/method.rst:59 +msgid "MethodType (in module types)" +msgstr "MethodType (types 模块)" diff --git a/c-api/module.po b/c-api/module.po new file mode 100644 index 0000000000..847f1f63e3 --- /dev/null +++ b/c-api/module.po @@ -0,0 +1,1034 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-01 17:14+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/module.rst:6 +msgid "Module Objects" +msgstr "模块对象" + +#: ../../c-api/module.rst:15 +msgid "" +"This instance of :c:type:`PyTypeObject` represents the Python module type. " +"This is exposed to Python programs as :py:class:`types.ModuleType`." +msgstr "" +"这个 :c:type:`PyTypeObject` 的实例代表 Python 模块类型。它作为 :py:class:`types.ModuleType`" +" 被暴露给 Python 程序。" + +#: ../../c-api/module.rst:21 +msgid "" +"Return true if *p* is a module object, or a subtype of a module object. This" +" function always succeeds." +msgstr "当 *p* 为模块类型的对象,或是模块子类型的对象时返回真值。该函数永远有返回值。" + +#: ../../c-api/module.rst:27 +msgid "" +"Return true if *p* is a module object, but not a subtype of " +":c:data:`PyModule_Type`. This function always succeeds." +msgstr "当 *p* 为模块类型的对象且不是 :c:data:`PyModule_Type` 的子类型的对象时返回真值。该函数永远有返回值。" + +#: ../../c-api/module.rst:40 +msgid "" +"Return a new module object with :attr:`module.__name__` set to *name*. The " +"module's :attr:`!__name__`, :attr:`~module.__doc__`, " +":attr:`~module.__package__` and :attr:`~module.__loader__` attributes are " +"filled in (all but :attr:`!__name__` are set to ``None``). The caller is " +"responsible for setting a :attr:`~module.__file__` attribute." +msgstr "" +"返回一个新的模块对象,该对象的 :attr:`module.__name__` 将设为 *name*。模块的 :attr:`!__name__`, " +":attr:`~module.__doc__`, :attr:`~module.__package__` 和 " +":attr:`~module.__loader__` 属性将被填充 (除 :attr:`!__name__` 外全都设为 ``None``)。 " +"调用方要负责设置 :attr:`~module.__file__` 属性。" + +#: ../../c-api/module.rst:46 ../../c-api/module.rst:439 +#: ../../c-api/module.rst:466 +msgid "Return ``NULL`` with an exception set on error." +msgstr "当发生错误时将返回 ``NULL`` 并设置一个异常。" + +#: ../../c-api/module.rst:50 +msgid "" +":attr:`~module.__package__` and :attr:`~module.__loader__` are now set to " +"``None``." +msgstr "" +"现在 :attr:`~module.__package__` 和 :attr:`~module.__loader__` 将被设为 ``None``。" + +#: ../../c-api/module.rst:57 +msgid "" +"Similar to :c:func:`PyModule_NewObject`, but the name is a UTF-8 encoded " +"string instead of a Unicode object." +msgstr "这类似于 :c:func:`PyModule_NewObject`,但其名称为 UTF-8 编码的字符串而不是 Unicode 对象。" + +#: ../../c-api/module.rst:65 +msgid "" +"Return the dictionary object that implements *module*'s namespace; this " +"object is the same as the :attr:`~object.__dict__` attribute of the module " +"object. If *module* is not a module object (or a subtype of a module " +"object), :exc:`SystemError` is raised and ``NULL`` is returned." +msgstr "" +"返回实现 *module* 的命名空间的字典对象;此对象与模块对象的 :attr:`~object.__dict__` 属性相同。如果 *module*" +" 不是一个模块对象(或模块对象的子类型),则会引发 :exc:`SystemError` 并返回 ``NULL``。" + +#: ../../c-api/module.rst:70 +msgid "" +"It is recommended extensions use other ``PyModule_*`` and ``PyObject_*`` " +"functions rather than directly manipulate a module's " +":attr:`~object.__dict__`." +msgstr "" +"建议扩展使用其他 ``PyModule_*`` 和 ``PyObject_*`` 函数而不是直接操纵模块的 " +":attr:`~object.__dict__` 属性。" + +#: ../../c-api/module.rst:74 +msgid "" +"The returned reference is borrowed from the module; it is valid until the " +"module is destroyed." +msgstr "返回的引用是从模块借入的;它将保持可用直到模块被销毁。" + +#: ../../c-api/module.rst:84 +msgid "" +"Return *module*'s :attr:`~module.__name__` value. If the module does not " +"provide one, or if it is not a string, :exc:`SystemError` is raised and " +"``NULL`` is returned." +msgstr "" +"返回 *module* 的 :attr:`~module.__name__` 值。如果模块未提供该值,或者如果它不是一个字符串,则会引发 " +":exc:`SystemError` 并返回 ``NULL``。" + +#: ../../c-api/module.rst:93 +msgid "" +"Similar to :c:func:`PyModule_GetNameObject` but return the name encoded to " +"``'utf-8'``." +msgstr "类似于 :c:func:`PyModule_GetNameObject` 但返回 ``'utf-8'`` 编码的名称。" + +#: ../../c-api/module.rst:96 +msgid "" +"The returned buffer is only valid until the module is renamed or destroyed. " +"Note that Python code may rename a module by setting its " +":py:attr:`~module.__name__` attribute." +msgstr "" +"返回的缓冲区将保持可用直到模块被重命名或销毁。请注意 Python 代码可能会通过设置其 :py:attr:`~module.__name__` " +"属性来重命名一个模块。" + +#: ../../c-api/module.rst:102 +msgid "" +"Return the \"state\" of the module, that is, a pointer to the block of " +"memory allocated at module creation time, or ``NULL``. See " +":c:member:`PyModuleDef.m_size`." +msgstr "" +"返回模块的“状态”,也就是说,返回指向在模块创建时分配的内存块的指针,或者 ``NULL``。参见 " +":c:member:`PyModuleDef.m_size` 字段。" + +#: ../../c-api/module.rst:109 +msgid "" +"Return a pointer to the :c:type:`PyModuleDef` struct from which the module " +"was created, or ``NULL`` if the module wasn't created from a definition." +msgstr "" +"返回指向模块创建所使用的 :c:type:`PyModuleDef` 结构体的指针,或者如果模块不是使用结构体定义创建的则返回 ``NULL``。" + +#: ../../c-api/module.rst:112 +msgid "" +"On error, return ``NULL`` with an exception set. Use " +":c:func:`PyErr_Occurred` to tell this case apart from a missing " +":c:type:`!PyModuleDef`." +msgstr "" +"出错时,返回 ``NULL`` 并设置一个异常。使用 :c:func:`PyErr_Occurred` 将这种情况与缺少 " +":c:type:`!PyModuleDef` 区分开来。" + +#: ../../c-api/module.rst:123 +msgid "" +"Return the name of the file from which *module* was loaded using *module*'s " +":attr:`~module.__file__` attribute. If this is not defined, or if it is not" +" a string, raise :exc:`SystemError` and return ``NULL``; otherwise return a " +"reference to a Unicode object." +msgstr "" +"返回使用 *module* 的 :attr:`~module.__file__` 属性所加载的 *module* 所对应的文件名。 " +"如果未定义该属性,或者如果它不是一个字符串,则会引发 :exc:`SystemError` 并返回 ``NULL``;在其他情况下将返回一个指向 " +"Unicode 对象的引用。" + +#: ../../c-api/module.rst:133 +msgid "" +"Similar to :c:func:`PyModule_GetFilenameObject` but return the filename " +"encoded to 'utf-8'." +msgstr "类似于 :c:func:`PyModule_GetFilenameObject` 但会返回编码为 'utf-8' 的文件名。" + +#: ../../c-api/module.rst:136 +msgid "" +"The returned buffer is only valid until the module's " +":py:attr:`~module.__file__` attribute is reassigned or the module is " +"destroyed." +msgstr "返回的缓冲区将保持可用直到模块的 :py:attr:`~module.__file__` 属性被重新赋值或模块被销毁。" + +#: ../../c-api/module.rst:139 +msgid "" +":c:func:`PyModule_GetFilename` raises :exc:`UnicodeEncodeError` on " +"unencodable filenames, use :c:func:`PyModule_GetFilenameObject` instead." +msgstr "" +":c:func:`PyModule_GetFilename` 对于不可编码的文件名会引发 :exc:`UnicodeEncodeError`,请改用 " +":c:func:`PyModule_GetFilenameObject` 函数。" + +#: ../../c-api/module.rst:147 +msgid "Module definitions" +msgstr "模块定义" + +#: ../../c-api/module.rst:149 +msgid "" +"The functions in the previous section work on any module object, including " +"modules imported from Python code." +msgstr "上一节中的函数适用于任何模块对象,包括从 Python 代码导入的模块。" + +#: ../../c-api/module.rst:152 +msgid "" +"Modules defined using the C API typically use a *module definition*, " +":c:type:`PyModuleDef` -- a statically allocated, constant “description\" of " +"how a module should be created." +msgstr "" +"使用 C API 定义的模块通常使用一个 *模块定义*,即 :c:type:`PyModuleDef` -- " +"有关模块应当如何被创建的静态分配的、常量形式的“描述”。" + +#: ../../c-api/module.rst:156 +msgid "" +"The definition is usually used to define an extension's “main” module object" +" (see :ref:`extension-modules` for details). It is also used to :ref:`create" +" extension modules dynamically `." +msgstr "" +"该定义通常被用来定义扩展的“main”模块对象(参阅 :ref:`extension-modules` 了解详情)。它还会被用来 " +":ref:`动态创建扩展模块 `。" + +#: ../../c-api/module.rst:161 +msgid "" +"Unlike :c:func:`PyModule_New`, the definition allows management of *module " +"state* -- a piece of memory that is allocated and cleared together with the " +"module object. Unlike the module's Python attributes, Python code cannot " +"replace or delete data stored in module state." +msgstr "" +"不同于 :c:func:`PyModule_New`,该定义管理 *模块状态* -- 一块随同模块对象被分配和清空的内存。不同于模块的 Python " +"属性,Python 代码无法替换或删除存储在模块状态中的数据。" + +#: ../../c-api/module.rst:169 +msgid "" +"The module definition struct, which holds all information needed to create a" +" module object. This structure must be statically allocated (or be otherwise" +" guaranteed to be valid while any modules created from it exist). Usually, " +"there is only one variable of this type for each extension module." +msgstr "" +"模块定义结构体,它保存着创建模块对象所有的全部信息。该结构体必须被静态地分配(或者要确保在由它创建的任何模块存在期间保持有效)。通常,每个扩展模块仅有一个该类型的变量。" + +#: ../../c-api/module.rst:177 +msgid "Always initialize this member to :c:macro:`PyModuleDef_HEAD_INIT`." +msgstr "始终将此成员初始化为 :c:macro:`PyModuleDef_HEAD_INIT`。" + +#: ../../c-api/module.rst:181 +msgid "Name for the new module." +msgstr "新模块的名称。" + +#: ../../c-api/module.rst:185 +msgid "" +"Docstring for the module; usually a docstring variable created with " +":c:macro:`PyDoc_STRVAR` is used." +msgstr "模块的文档字符串;一般会使用通过 :c:macro:`PyDoc_STRVAR` 创建的文档字符串变量。" + +#: ../../c-api/module.rst:190 +msgid "" +"Module state may be kept in a per-module memory area that can be retrieved " +"with :c:func:`PyModule_GetState`, rather than in static globals. This makes " +"modules safe for use in multiple sub-interpreters." +msgstr "" +"可以把模块的状态保存在为单个模块分配的内存区域中,使用 :c:func:`PyModule_GetState` " +"检索,而不是保存在静态全局区。这使得模块可以在多个子解释器中安全地使用。" + +#: ../../c-api/module.rst:194 +msgid "" +"This memory area is allocated based on *m_size* on module creation, and " +"freed when the module object is deallocated, after the " +":c:member:`~PyModuleDef.m_free` function has been called, if present." +msgstr "" +"这个内存区域将在创建模块时根据 *m_size* 分配,并在模块对象被释放时,在调用 :c:member:`~PyModuleDef.m_free` " +"函数(如果存在)之后释放。" + +#: ../../c-api/module.rst:198 +msgid "" +"Setting it to a non-negative value means that the module can be re-" +"initialized and specifies the additional amount of memory it requires for " +"its state." +msgstr "将其设置为非负值意味着可以重新初始化模块,并指定其状态所需的额外内存量。" + +#: ../../c-api/module.rst:202 +msgid "" +"Setting ``m_size`` to ``-1`` means that the module does not support sub-" +"interpreters, because it has global state. Negative ``m_size`` is only " +"allowed when using :ref:`legacy single-phase initialization ` or when :ref:`creating modules dynamically `." +msgstr "" +"将 ``m_size`` 设置为 ``-1`` 意味着模块不支持子解释器,因为它具有全局状态。负的 ``m_size`` 只允许在使用 " +":ref:`遗留单阶段初始化` 或 :ref:`动态创建模块 ` 时使用。" + +#: ../../c-api/module.rst:208 +msgid "See :PEP:`3121` for more details." +msgstr "请参阅 :PEP:`3121` 了解详情。" + +#: ../../c-api/module.rst:212 +msgid "" +"A pointer to a table of module-level functions, described by " +":c:type:`PyMethodDef` values. Can be ``NULL`` if no functions are present." +msgstr "一个指向模块函数表的指针,由 :c:type:`PyMethodDef` 描述。如果模块没有函数,可以为 ``NULL``。" + +#: ../../c-api/module.rst:217 +msgid "" +"An array of slot definitions for multi-phase initialization, terminated by a" +" ``{0, NULL}`` entry. When using legacy single-phase initialization, " +"*m_slots* must be ``NULL``." +msgstr "" +"由针对多阶段初始化的槽位定义组成的数组,以一个 ``{0, NULL}`` 条目结束。当使用遗留单阶段初始化时,*m_slots* 必须为 " +"``NULL`` 值。" + +#: ../../c-api/module.rst:223 +msgid "" +"Prior to version 3.5, this member was always set to ``NULL``, and was " +"defined as:" +msgstr "在 3.5 版之前,此成员总是被设为 ``NULL``,并被定义为:" + +#: ../../c-api/module.rst:230 +msgid "" +"A traversal function to call during GC traversal of the module object, or " +"``NULL`` if not needed." +msgstr "在模块对象的垃圾回收遍历期间所调用的遍历函数,如果不需要则为 ``NULL``。" + +#: ../../c-api/module.rst:233 ../../c-api/module.rst:248 +#: ../../c-api/module.rst:269 +msgid "" +"This function is not called if the module state was requested but is not " +"allocated yet. This is the case immediately after the module is created and " +"before the module is executed (:c:data:`Py_mod_exec` function). More " +"precisely, this function is not called if :c:member:`~PyModuleDef.m_size` is" +" greater than 0 and the module state (as returned by " +":c:func:`PyModule_GetState`) is ``NULL``." +msgstr "" +"如果模块状态已被请求但尚未分配则不会调用此函数。在模块创建之后至模块执行之前(调用 :c:data:`Py_mod_exec` 函数)就属于这种情况。 " +"更确切地说,如果 :c:member:`~PyModuleDef.m_size` 大于 0 且模块状态(由 " +":c:func:`PyModule_GetState` 返回)为 ``NULL`` 则不会调用此函数。" + +#: ../../c-api/module.rst:240 ../../c-api/module.rst:261 +#: ../../c-api/module.rst:276 +msgid "No longer called before the module state is allocated." +msgstr "在模块状态被分配之前不再调用。" + +#: ../../c-api/module.rst:245 +msgid "" +"A clear function to call during GC clearing of the module object, or " +"``NULL`` if not needed." +msgstr "在模块对象的垃圾回收清理期间所调用的清理函数,如果不需要则为 ``NULL``。" + +#: ../../c-api/module.rst:255 +msgid "" +"Like :c:member:`PyTypeObject.tp_clear`, this function is not *always* called" +" before a module is deallocated. For example, when reference counting is " +"enough to determine that an object is no longer used, the cyclic garbage " +"collector is not involved and :c:member:`~PyModuleDef.m_free` is called " +"directly." +msgstr "" +"就像 :c:member:`PyTypeObject.tp_clear` " +"那样,这个函数并不总是在模块被释放前被调用。例如,当引用计数足以确定一个对象不再被使用时,就会直接调用 " +":c:member:`~PyModuleDef.m_free`,而不使用循环垃圾回收器。" + +#: ../../c-api/module.rst:266 +msgid "" +"A function to call during deallocation of the module object, or ``NULL`` if " +"not needed." +msgstr "在模块对象的释放期间所调用的函数,如果不需要则为 ``NULL``。" + +#: ../../c-api/module.rst:282 +msgid "The type of ``PyModuleDef`` objects." +msgstr "``PyModuleDef`` 对象的类型。" + +#: ../../c-api/module.rst:286 +msgid "Module slots" +msgstr "模块槽位" + +#: ../../c-api/module.rst:292 +msgid "A slot ID, chosen from the available values explained below." +msgstr "槽位 ID,从下面介绍的可用值中选择。" + +#: ../../c-api/module.rst:296 +msgid "Value of the slot, whose meaning depends on the slot ID." +msgstr "槽位值,其含义取决于槽位 ID。" + +#: ../../c-api/module.rst:300 +msgid "The available slot types are:" +msgstr "可用的槽位类型是:" + +#: ../../c-api/module.rst:304 +msgid "" +"Specifies a function that is called to create the module object itself. The " +"*value* pointer of this slot must point to a function of the signature:" +msgstr "指定一个函数供调用以创建模块对象本身。该槽位的 *value* 指针必须指向一个具有如下签名的函数:" + +#: ../../c-api/module.rst:311 +msgid "" +"The function receives a :py:class:`~importlib.machinery.ModuleSpec` " +"instance, as defined in :PEP:`451`, and the module definition. It should " +"return a new module object, or set an error and return ``NULL``." +msgstr "" +"该函数接受一个 :py:class:`~importlib.machinery.ModuleSpec` 实例,如 :PEP:`451` " +"所定义的,以及模块定义。它应当返回一个新的模块对象,或者设置一个错误并返回 ``NULL``。" + +#: ../../c-api/module.rst:316 +msgid "" +"This function should be kept minimal. In particular, it should not call " +"arbitrary Python code, as trying to import the same module again may result " +"in an infinite loop." +msgstr "此函数应当保持最小化。特别地,它不应当调用任意 Python 代码,因为尝试再次导入同一个模块可能会导致无限循环。" + +#: ../../c-api/module.rst:320 +msgid "" +"Multiple ``Py_mod_create`` slots may not be specified in one module " +"definition." +msgstr "多个 ``Py_mod_create`` 槽位不能在一个模块定义中指定。" + +#: ../../c-api/module.rst:323 +msgid "" +"If ``Py_mod_create`` is not specified, the import machinery will create a " +"normal module object using :c:func:`PyModule_New`. The name is taken from " +"*spec*, not the definition, to allow extension modules to dynamically adjust" +" to their place in the module hierarchy and be imported under different " +"names through symlinks, all while sharing a single module definition." +msgstr "" +"如果未指定 ``Py_mod_create``,导入机制将使用 :c:func:`PyModule_New` 创建一个普通的模块对象。名称是获取自 " +"*spec* 而非定义,以允许扩展模块动态地调整它们在模块层级结构中的位置并通过符号链接以不同的名称被导入,同时共享同一个模块定义。" + +#: ../../c-api/module.rst:329 +msgid "" +"There is no requirement for the returned object to be an instance of " +":c:type:`PyModule_Type`. Any type can be used, as long as it supports " +"setting and getting import-related attributes. However, only " +"``PyModule_Type`` instances may be returned if the ``PyModuleDef`` has " +"non-``NULL`` ``m_traverse``, ``m_clear``, ``m_free``; non-zero ``m_size``; " +"or slots other than ``Py_mod_create``." +msgstr "" +"不要求返回的对象必须为 :c:type:`PyModule_Type` 的实例。任何类型均可使用,只要它支持设置和获取导入相关的属性。但是,如果 " +"``PyModuleDef`` 具有非 ``NULL`` 的 ``m_traverse``, ``m_clear``, ``m_free``;非零的 " +"``m_size``;或者 ``Py_mod_create`` 以外的槽位则只能返回 ``PyModule_Type`` 的实例。" + +#: ../../c-api/module.rst:340 +msgid "" +"Specifies a function that is called to *execute* the module. This is " +"equivalent to executing the code of a Python module: typically, this " +"function adds classes and constants to the module. The signature of the " +"function is:" +msgstr "指定一个供调用以 *执行* 模块的函数。这等价于执行一个 Python 模块的代码:通常,此函数会向模块添加类和常量。此函数的签名为:" + +#: ../../c-api/module.rst:349 +msgid "" +"If multiple ``Py_mod_exec`` slots are specified, they are processed in the " +"order they appear in the *m_slots* array." +msgstr "如果指定了多个 ``Py_mod_exec`` 槽位,将按照它们在*m_slots*数组中出现的顺序进行处理。" + +#: ../../c-api/module.rst:356 ../../c-api/module.rst:389 +msgid "Specifies one of the following values:" +msgstr "指定以下的值之一:" + +#: ../../c-api/module.rst:362 +msgid "The module does not support being imported in subinterpreters." +msgstr "该模块不支持在子解释器中导入。" + +#: ../../c-api/module.rst:366 +msgid "" +"The module supports being imported in subinterpreters, but only when they " +"share the main interpreter's GIL. (See :ref:`isolating-extensions-howto`.)" +msgstr "" +"该模块支持在子解释器中导入,但是它们必须要共享主解释器的 GIL。 (参见 :ref:`isolating-extensions-howto`。)" + +#: ../../c-api/module.rst:372 +msgid "" +"The module supports being imported in subinterpreters, even when they have " +"their own GIL. (See :ref:`isolating-extensions-howto`.)" +msgstr "该模块支持在子解释器中导入,即使它们有自己的 GIL。 (参见 :ref:`isolating-extensions-howto`。)" + +#: ../../c-api/module.rst:376 +msgid "" +"This slot determines whether or not importing this module in a " +"subinterpreter will fail." +msgstr "此槽位决定在子解释器中导入此模块是否会失败。" + +#: ../../c-api/module.rst:379 +msgid "" +"Multiple ``Py_mod_multiple_interpreters`` slots may not be specified in one " +"module definition." +msgstr "在一个模块定义中不能指定多个 ``Py_mod_multiple_interpreters`` 槽位。" + +#: ../../c-api/module.rst:382 +msgid "" +"If ``Py_mod_multiple_interpreters`` is not specified, the import machinery " +"defaults to ``Py_MOD_MULTIPLE_INTERPRETERS_SUPPORTED``." +msgstr "" +"如果未指定 ``Py_mod_multiple_interpreters``,则导入机制默认为 " +"``Py_MOD_MULTIPLE_INTERPRETERS_SUPPORTED`` 值。" + +#: ../../c-api/module.rst:395 +msgid "" +"The module depends on the presence of the global interpreter lock (GIL), and" +" may access global state without synchronization." +msgstr "这个模块依赖于全局解释器锁 (GIL) 的存在,并可在无需同步的情况下访问全局状态。" + +#: ../../c-api/module.rst:400 +msgid "The module is safe to run without an active GIL." +msgstr "这个模块可以在不激活 GIL 的情况下安全运行。" + +#: ../../c-api/module.rst:402 +msgid "" +"This slot is ignored by Python builds not configured with " +":option:`--disable-gil`. Otherwise, it determines whether or not importing " +"this module will cause the GIL to be automatically enabled. See " +":ref:`whatsnew313-free-threaded-cpython` for more detail." +msgstr "" +"这个槽位会被未配置 :option:`--disable-gil` 的 Python 构建版所忽略。在其他情况下,它将决定导入此模块是否会导致 GIL " +"被自动启用。请参阅 :ref:`whatsnew313-free-threaded-cpython` 了解详情。" + +#: ../../c-api/module.rst:407 +msgid "" +"Multiple ``Py_mod_gil`` slots may not be specified in one module definition." +msgstr "多个 ``Py_mod_gil`` 槽位不能在一个模块定义中指定。" + +#: ../../c-api/module.rst:409 +msgid "" +"If ``Py_mod_gil`` is not specified, the import machinery defaults to " +"``Py_MOD_GIL_USED``." +msgstr "如果未指定 ``Py_mod_gil``,则导入机制默认为 ``Py_MOD_GIL_USED``。" + +#: ../../c-api/module.rst:418 +msgid "Creating extension modules dynamically" +msgstr "动态创建扩展模块" + +#: ../../c-api/module.rst:420 +msgid "" +"The following functions may be used to create a module outside of an " +"extension's :ref:`initialization function `. They are" +" also used in :ref:`single-phase initialization `." +msgstr "" +"以下函数可用于在扩展的 :ref:`初始化函数 ` 之外创建模块。它们也用于 :ref:`单阶段初始化 " +"` 流程。" + +#: ../../c-api/module.rst:427 +msgid "" +"Create a new module object, given the definition in *def*. This is a macro " +"that calls :c:func:`PyModule_Create2` with *module_api_version* set to " +":c:macro:`PYTHON_API_VERSION`, or to :c:macro:`PYTHON_ABI_VERSION` if using " +"the :ref:`limited API `." +msgstr "" +"根据 *def* 中的定义创建一个新的模块对象。这是一个调用 :c:func:`PyModule_Create2` 的宏,其中 " +"*module_api_version* 设置为 :c:macro:`PYTHON_API_VERSION`,或者如果使用 :ref:`受限 API " +"`,则设置为 :c:macro:`PYTHON_ABI_VERSION`。" + +#: ../../c-api/module.rst:435 +msgid "" +"Create a new module object, given the definition in *def*, assuming the API " +"version *module_api_version*. If that version does not match the version of" +" the running interpreter, a :exc:`RuntimeWarning` is emitted." +msgstr "" +"创建一个新的模块对象,在参数 *def* 中给出定义,设定 API 版本为参数 " +"*module_api_version*。如果该版本与正在运行的解释器版本不匹配,则会触发 :exc:`RuntimeWarning`。" + +#: ../../c-api/module.rst:441 +msgid "" +"This function does not support slots. The :c:member:`~PyModuleDef.m_slots` " +"member of *def* must be ``NULL``." +msgstr "此函数不支持槽位。 *def* 的 :c:member:`~PyModuleDef.m_slots` 成员必须为 ``NULL``。" + +#: ../../c-api/module.rst:447 +msgid "" +"Most uses of this function should be using :c:func:`PyModule_Create` " +"instead; only use this if you are sure you need it." +msgstr "大多数时候应该使用 :c:func:`PyModule_Create` 代替使用此函数,除非你确定需要使用它。" + +#: ../../c-api/module.rst:452 +msgid "" +"This macro calls :c:func:`PyModule_FromDefAndSpec2` with " +"*module_api_version* set to :c:macro:`PYTHON_API_VERSION`, or to " +":c:macro:`PYTHON_ABI_VERSION` if using the :ref:`limited API `." +msgstr "" +"这个宏调用 :c:func:`PyModule_FromDefAndSpec2`, *module_api_version* 设置为 " +":c:macro:`PYTHON_API_VERSION`,或者如果使用 :ref:`受限 API `,则设置为 " +":c:macro:`PYTHON_ABI_VERSION` 常量。" + +#: ../../c-api/module.rst:461 +msgid "" +"Create a new module object, given the definition in *def* and the ModuleSpec" +" *spec*, assuming the API version *module_api_version*. If that version does" +" not match the version of the running interpreter, a :exc:`RuntimeWarning` " +"is emitted." +msgstr "" +"创建一个新的模块对象,在参数 *def* 和 *spec* 中给出定义,设置 API 版本为参数 " +"*module_api_version*。如果该版本与正在运行的解释器版本不匹配,则会触发 :exc:`RuntimeWarning`。" + +#: ../../c-api/module.rst:468 +msgid "" +"Note that this does not process execution slots (:c:data:`Py_mod_exec`). " +"Both ``PyModule_FromDefAndSpec`` and ``PyModule_ExecDef`` must be called to " +"fully initialize a module." +msgstr "" +"注意,这不会处理执行槽位 (:c:data:`Py_mod_exec`)。 必须调用 ``PyModule_FromDefAndSpec`` 和 " +"``PyModule_ExecDef`` 来完全初始化模块。" + +#: ../../c-api/module.rst:474 +msgid "" +"Most uses of this function should be using :c:func:`PyModule_FromDefAndSpec`" +" instead; only use this if you are sure you need it." +msgstr "大多数时候应该使用 :c:func:`PyModule_FromDefAndSpec` 代替使用此函数,除非你确定需要使用它。" + +#: ../../c-api/module.rst:481 +msgid "Process any execution slots (:c:data:`Py_mod_exec`) given in *def*." +msgstr "处理在 *def* 中给出的任何执行槽位 (:c:data:`Py_mod_exec`)。" + +#: ../../c-api/module.rst:487 +msgid "The C API version. Defined for backwards compatibility." +msgstr "C API 版本,为向后兼容性而定义。" + +#: ../../c-api/module.rst:489 ../../c-api/module.rst:496 +msgid "" +"Currently, this constant is not updated in new Python versions, and is not " +"useful for versioning. This may change in the future." +msgstr "目前,该常量在新的 Python 版本中没有更新,并且对于版本控制没有用处。这在未来可能会改变。" + +#: ../../c-api/module.rst:494 +msgid "Defined as ``3`` for backwards compatibility." +msgstr "为向后兼容性定义为 ``3``。" + +#: ../../c-api/module.rst:501 +msgid "Support functions" +msgstr "支持函数" + +#: ../../c-api/module.rst:503 +msgid "" +"The following functions are provided to help initialize a module state. They" +" are intended for a module's execution slots (:c:data:`Py_mod_exec`), the " +"initialization function for legacy :ref:`single-phase initialization " +"`, or code that creates modules dynamically." +msgstr "" +"提供以下函数来帮助初始化模块状态。它们用于模块的执行槽 (:c:data:`Py_mod_exec`)、遗留的 :ref:`单阶段初始化 " +"` 的初始化函数,或动态创建模块的代码。" + +#: ../../c-api/module.rst:511 +msgid "" +"Add an object to *module* as *name*. This is a convenience function which " +"can be used from the module's initialization function." +msgstr "将一个对象以 *name* 为名称添加到 *module* 中。这是一个便捷函数,可在模块的初始化函数中使用。" + +#: ../../c-api/module.rst:514 +msgid "" +"On success, return ``0``. On error, raise an exception and return ``-1``." +msgstr "如果成功,返回 ``0``。如果发生错误,引发异常并返回 ``-1``。" + +#: ../../c-api/module.rst:516 ../../c-api/module.rst:567 +#: ../../c-api/module.rst:594 +msgid "Example usage::" +msgstr "用法示例:" + +#: ../../c-api/module.rst:518 +msgid "" +"static int\n" +"add_spam(PyObject *module, int value)\n" +"{\n" +" PyObject *obj = PyLong_FromLong(value);\n" +" if (obj == NULL) {\n" +" return -1;\n" +" }\n" +" int res = PyModule_AddObjectRef(module, \"spam\", obj);\n" +" Py_DECREF(obj);\n" +" return res;\n" +" }" +msgstr "" +"static int\n" +"add_spam(PyObject *module, int value)\n" +"{\n" +" PyObject *obj = PyLong_FromLong(value);\n" +" if (obj == NULL) {\n" +" return -1;\n" +" }\n" +" int res = PyModule_AddObjectRef(module, \"spam\", obj);\n" +" Py_DECREF(obj);\n" +" return res;\n" +" }" + +#: ../../c-api/module.rst:530 +msgid "" +"To be convenient, the function accepts ``NULL`` *value* with an exception " +"set. In this case, return ``-1`` and just leave the raised exception " +"unchanged." +msgstr "为了方便,该函数接受 ``NULL`` *value* 并设置一个异常。在此情况下,将返回 ``-1`` 并让所引发的异常保持不变。" + +#: ../../c-api/module.rst:534 +msgid "" +"The example can also be written without checking explicitly if *obj* is " +"``NULL``::" +msgstr "这个例子也可以写成不显式地检查 *obj* 是否为 ``NULL``::" + +#: ../../c-api/module.rst:537 +msgid "" +"static int\n" +"add_spam(PyObject *module, int value)\n" +"{\n" +" PyObject *obj = PyLong_FromLong(value);\n" +" int res = PyModule_AddObjectRef(module, \"spam\", obj);\n" +" Py_XDECREF(obj);\n" +" return res;\n" +" }" +msgstr "" +"static int\n" +"add_spam(PyObject *module, int value)\n" +"{\n" +" PyObject *obj = PyLong_FromLong(value);\n" +" int res = PyModule_AddObjectRef(module, \"spam\", obj);\n" +" Py_XDECREF(obj);\n" +" return res;\n" +" }" + +#: ../../c-api/module.rst:546 +msgid "" +"Note that ``Py_XDECREF()`` should be used instead of ``Py_DECREF()`` in this" +" case, since *obj* can be ``NULL``." +msgstr "" +"注意在此情况下应当使用 ``Py_XDECREF()`` 而不是 ``Py_DECREF()``,因为 *obj* 可能为 ``NULL``。" + +#: ../../c-api/module.rst:549 +msgid "" +"The number of different *name* strings passed to this function should be " +"kept small, usually by only using statically allocated strings as *name*. " +"For names that aren't known at compile time, prefer calling " +":c:func:`PyUnicode_FromString` and :c:func:`PyObject_SetAttr` directly. For " +"more details, see :c:func:`PyUnicode_InternFromString`, which may be used " +"internally to create a key object." +msgstr "" +"传给该函数的不同 *name* 字符串应当保持在较少的数量,通常是通过仅使用静态分配的字符串作为 *name* 来做到这一点。 " +"对于编译时未知的名称,建议直接调用 :c:func:`PyUnicode_FromString` 和 " +":c:func:`PyObject_SetAttr`。更多相关细节,请参阅 " +":c:func:`PyUnicode_InternFromString`,它可在内部用于创建键对象。" + +#: ../../c-api/module.rst:562 +msgid "" +"Similar to :c:func:`PyModule_AddObjectRef`, but \":term:`steals `\" a" +" reference to *value* (even on error). It can be called with a result of " +"function that returns a new reference without bothering to check its result " +"or even saving it to a variable." +msgstr "" + +#: ../../c-api/module.rst:569 +msgid "" +"if (PyModule_Add(module, \"spam\", PyBytes_FromString(value)) < 0) {\n" +" goto error;\n" +"}" +msgstr "" +"if (PyModule_Add(module, \"spam\", PyBytes_FromString(value)) < 0) {\n" +" goto error;\n" +"}" + +#: ../../c-api/module.rst:578 +msgid "" +"Similar to :c:func:`PyModule_AddObjectRef`, but :term:`steals ` a " +"reference to *value* on success (if it returns ``0``)." +msgstr "" + +#: ../../c-api/module.rst:581 +msgid "" +"The new :c:func:`PyModule_Add` or :c:func:`PyModule_AddObjectRef` functions " +"are recommended, since it is easy to introduce reference leaks by misusing " +"the :c:func:`PyModule_AddObject` function." +msgstr "" +"推荐使用新的 :c:func:`PyModule_Add` 或 :c:func:`PyModule_AddObjectRef` 函数,因为误用 " +":c:func:`PyModule_AddObject` 函数很容易导致引用泄漏。" + +#: ../../c-api/module.rst:588 +msgid "" +"Unlike other functions that steal references, ``PyModule_AddObject()`` only " +"releases the reference to *value* **on success**." +msgstr "与其他窃取引用的函数不同,``PyModule_AddObject()`` 只在 **成功** 时释放对 *value* 的引用。" + +#: ../../c-api/module.rst:591 +msgid "" +"This means that its return value must be checked, and calling code must " +":c:func:`Py_XDECREF` *value* manually on error." +msgstr "这意味着必须检查它的返回值,调用方代码必须在发生错误时手动为 *value* 执行 :c:func:`Py_XDECREF`。" + +#: ../../c-api/module.rst:596 +msgid "" +"PyObject *obj = PyBytes_FromString(value);\n" +"if (PyModule_AddObject(module, \"spam\", obj) < 0) {\n" +" // If 'obj' is not NULL and PyModule_AddObject() failed,\n" +" // 'obj' strong reference must be deleted with Py_XDECREF().\n" +" // If 'obj' is NULL, Py_XDECREF() does nothing.\n" +" Py_XDECREF(obj);\n" +" goto error;\n" +"}\n" +"// PyModule_AddObject() stole a reference to obj:\n" +"// Py_XDECREF(obj) is not needed here." +msgstr "" +"PyObject *obj = PyBytes_FromString(value);\n" +"if (PyModule_AddObject(module, \"spam\", obj) < 0) {\n" +" // 如果 'obj' 不为 NULL 且 PyModule_AddObject() 执行失败,\n" +" // 则 'obj' 强引用必须使用 Py_XDECREF() 来删除。\n" +" // 如果 'obj' 为 NULL,则 Py_XDECREF() 不做任何操作。\n" +" Py_XDECREF(obj);\n" +" goto error;\n" +"}\n" +"// PyModule_AddObject() 会偷取一个对 obj 的引用:\n" +"// 这里不需要 Py_XDECREF(obj)。" + +#: ../../c-api/module.rst:612 +msgid "" +"Add an integer constant to *module* as *name*. This convenience function " +"can be used from the module's initialization function. Return ``-1`` with an" +" exception set on error, ``0`` on success." +msgstr "" +"将一个整数常量作为 *name* 添加到 *module* 中。这个便捷函数可在模块的初始化函数中使用。当发生错误时将返回 ``-1`` " +"并设置一个异常,成功时则返回 ``0``。" + +#: ../../c-api/module.rst:616 +msgid "" +"This is a convenience function that calls :c:func:`PyLong_FromLong` and " +":c:func:`PyModule_AddObjectRef`; see their documentation for details." +msgstr "" +"这是一个调用 :c:func:`PyLong_FromLong` 和 :c:func:`PyModule_AddObjectRef` " +"的便捷函数;请参阅其文档了解详情。" + +#: ../../c-api/module.rst:622 +msgid "" +"Add a string constant to *module* as *name*. This convenience function can " +"be used from the module's initialization function. The string *value* must " +"be ``NULL``-terminated. Return ``-1`` with an exception set on error, ``0`` " +"on success." +msgstr "" +"将一个字符串常量作为 *name* 添加到 *module* 中。这个便捷函数可在模块初始化函数中使用。字符串 *value* 必须以 ``NULL``" +" 结尾。当发生错误时将返回 ``-1``,成功时则返回 ``0``。" + +#: ../../c-api/module.rst:627 +msgid "" +"This is a convenience function that calls " +":c:func:`PyUnicode_InternFromString` and :c:func:`PyModule_AddObjectRef`; " +"see their documentation for details." +msgstr "" +"这是一个调用 :c:func:`PyUnicode_InternFromString` 和 " +":c:func:`PyModule_AddObjectRef` 的便捷函数;请参阅其文档了解详情。" + +#: ../../c-api/module.rst:634 +msgid "" +"Add an int constant to *module*. The name and the value are taken from " +"*macro*. For example ``PyModule_AddIntMacro(module, AF_INET)`` adds the int " +"constant *AF_INET* with the value of *AF_INET* to *module*. Return ``-1`` " +"with an exception set on error, ``0`` on success." +msgstr "" +"将一个整数常量添加到 *module* 中。名称和值取自 *macro*。例如 ``PyModule_AddIntMacro(module, " +"AF_INET)`` 将值为 *AF_INET* 的整数常量 *AF_INET* 添加到 *module* 中。当发生错误时将返回 ``-1`` " +"并设置一个异常,成功时将返回 ``0``。" + +#: ../../c-api/module.rst:642 +msgid "Add a string constant to *module*." +msgstr "将一个字符串常量添加到*module*模块中。" + +#: ../../c-api/module.rst:646 +msgid "" +"Add a type object to *module*. The type object is finalized by calling " +"internally :c:func:`PyType_Ready`. The name of the type object is taken from" +" the last component of :c:member:`~PyTypeObject.tp_name` after dot. Return " +"``-1`` with an exception set on error, ``0`` on success." +msgstr "" +"将一个类型对象添加到 *module* 中。类型对象是通过在内部调用 :c:func:`PyType_Ready` 来最终化的。类型对象的名称取自 " +":c:member:`~PyTypeObject.tp_name` 在点号之后的部分。当发生错误时将返回 ``-1`` 并设置一个异常,成功时将返回 " +"``0``。" + +#: ../../c-api/module.rst:656 +msgid "" +"Add the functions from the ``NULL`` terminated *functions* array to " +"*module*. Refer to the :c:type:`PyMethodDef` documentation for details on " +"individual entries (due to the lack of a shared module namespace, module " +"level \"functions\" implemented in C typically receive the module as their " +"first parameter, making them similar to instance methods on Python classes)." +msgstr "" +"将以 ``NULL`` 结尾的 *functions* 数组中的函数添加到 *module* 中。有关单个条目的更多细节,请参阅 " +":c:type:`PyMethodDef` 文档(由于缺少共享的模块命名空间,在 C 中实现的模块级\"函数\"通常将模块作为其第一个形参,与 " +"Python 类的实例方法类似)。" + +#: ../../c-api/module.rst:662 +msgid "" +"This function is called automatically when creating a module from " +"``PyModuleDef`` (such as when using :ref:`multi-phase-initialization`, " +"``PyModule_Create``, or ``PyModule_FromDefAndSpec``). Some module authors " +"may prefer defining functions in multiple :c:type:`PyMethodDef` arrays; in " +"that case they should call this function directly." +msgstr "" +"此函数在从 ``PyModuleDef`` 创建模块时自动调用(例如使用 :ref:`multi-phase-initialization`、 " +"``PyModule_Create`` 或 ``PyModule_FromDefAndSpec`` 等)。一些模块作者可能更喜欢在多个 " +":c:type:`PyMethodDef` 数组中定义函数;在这种情况下,他们应该直接调用这个函数。" + +#: ../../c-api/module.rst:669 +msgid "" +"The *functions* array must be statically allocated (or otherwise guaranteed " +"to outlive the module object)." +msgstr "*functions* 数组必须被静态地分配(或者要保证比模块对象生存得更久)。" + +#: ../../c-api/module.rst:676 +msgid "" +"Set the docstring for *module* to *docstring*. This function is called " +"automatically when creating a module from ``PyModuleDef`` (such as when " +"using :ref:`multi-phase-initialization`, ``PyModule_Create``, or " +"``PyModule_FromDefAndSpec``)." +msgstr "" +"将 *module* 的文档字符串设置为 *docstring*。此函数在使用 ``PyModuleDef`` 创建模块时自动调用(例如使用 " +":ref:`multi-phase-initialization`、``PyModule_Create`` 或 " +"``PyModule_FromDefAndSpec`` 时)。" + +#: ../../c-api/module.rst:681 +msgid "Return ``0`` on success. Return ``-1`` with an exception set on error." +msgstr "成功时返回 ``0``。出错时返回 ``-1`` 并设置异常。" + +#: ../../c-api/module.rst:688 +msgid "" +"Indicate that *module* does or does not support running without the global " +"interpreter lock (GIL), using one of the values from :c:macro:`Py_mod_gil`. " +"It must be called during *module*'s initialization function when using " +":ref:`single-phase-initialization`. If this function is not called during " +"module initialization, the import machinery assumes the module does not " +"support running without the GIL. This function is only available in Python " +"builds configured with :option:`--disable-gil`. Return ``-1`` with an " +"exception set on error, ``0`` on success." +msgstr "" +"指明 *module* 是否支持不带全局解释器锁 (GIL) 运行,使用一个来自 :c:macro:`Py_mod_gil` 的值。当使用 " +":ref:`single-phase-initialization` 时它必须在 *module* 的初始化函数执行期间被调用。 " +"如果此函数在模块初始化期间未被调用,导入机制将假定该模块不支持不带 GIL 运行。此函数仅在配置了 :option:`--disable-gil` 的 " +"Python 构建版中可用。当发生错误时将返回 ``-1`` 并设置一个异常,成功时将返回 ``0``。" + +#: ../../c-api/module.rst:702 +msgid "Module lookup (single-phase initialization)" +msgstr "模块查找(单阶段初始化)" + +#: ../../c-api/module.rst:704 +msgid "" +"The legacy :ref:`single-phase initialization ` " +"initialization scheme creates singleton modules that can be looked up in the" +" context of the current interpreter. This allows the module object to be " +"retrieved later with only a reference to the module definition." +msgstr "" +"遗留的 :ref:`单阶段初始化 ` " +"初始化方案创建可以在当前解释器上下文中被查找的单例模块。这使得仅通过模块定义的引用,就可以检索模块对象。" + +#: ../../c-api/module.rst:709 +msgid "" +"These functions will not work on modules created using multi-phase " +"initialization, since multiple such modules can be created from a single " +"definition." +msgstr "这些函数不适用于通过多阶段初始化创建的模块,因为可以从一个模块定义创建多个模块对象。" + +#: ../../c-api/module.rst:714 +msgid "" +"Returns the module object that was created from *def* for the current " +"interpreter. This method requires that the module object has been attached " +"to the interpreter state with :c:func:`PyState_AddModule` beforehand. In " +"case the corresponding module object is not found or has not been attached " +"to the interpreter state yet, it returns ``NULL``." +msgstr "" +"返回当前解释器中由 *def* 创建的模块对象。此方法要求模块对象此前已通过 :c:func:`PyState_AddModule` " +"函数附加到解释器状态中。如果找不到相应的模块对象,或模块对象还未附加到解释器状态,返回 ``NULL``。" + +#: ../../c-api/module.rst:721 +msgid "" +"Attaches the module object passed to the function to the interpreter state. " +"This allows the module object to be accessible via " +":c:func:`PyState_FindModule`." +msgstr "将传给函数的模块对象附加到解释器状态。这将允许通过 :c:func:`PyState_FindModule` 来访问该模块对象。" + +#: ../../c-api/module.rst:724 +msgid "Only effective on modules created using single-phase initialization." +msgstr "仅在使用单阶段初始化创建的模块上有效。" + +#: ../../c-api/module.rst:726 +msgid "" +"Python calls ``PyState_AddModule`` automatically after importing a module " +"that uses :ref:`single-phase initialization `, " +"so it is unnecessary (but harmless) to call it from module initialization " +"code. An explicit call is needed only if the module's own init code " +"subsequently calls ``PyState_FindModule``. The function is mainly intended " +"for implementing alternative import mechanisms (either by calling it " +"directly, or by referring to its implementation for details of the required " +"state updates)." +msgstr "" +"Python 会在使用 :ref:`单阶段初始化 ` 导入一个模块后自动调用 " +"``PyState_AddModule``,因此从模块初始化代码中调用它是没有必要的(但也没有害处)。显式的调用仅在模块自己的初始化代码后继调用了 " +"``PyState_FindModule`` 的情况下才是必要的。 " +"此函数主要是为了实现替代导入机制(或是通过直接调用它,或是通过引用它的实现来获取所需的状态更新详情)。" + +#: ../../c-api/module.rst:735 +msgid "" +"If a module was attached previously using the same *def*, it is replaced by " +"the new *module*." +msgstr "如果先前使用相同的 *def* 附加了一个模块,则将其替换为新的 *module*。" + +#: ../../c-api/module.rst:738 ../../c-api/module.rst:749 +msgid "The caller must have an :term:`attached thread state`." +msgstr "调用方必须有已附加的线程状态 :term:`attached thread state`。" + +#: ../../c-api/module.rst:740 +msgid "Return ``-1`` with an exception set on error, ``0`` on success." +msgstr "出错时返回 ``-1`` 并设置一个异常,成功时返回 ``0``。" + +#: ../../c-api/module.rst:746 +msgid "" +"Removes the module object created from *def* from the interpreter state. " +"Return ``-1`` with an exception set on error, ``0`` on success." +msgstr "从解释器状态中移除由 *def* 创建的模块对象。当发生错误时将返回 ``-1`` 并设置一个异常,成功时将返回 ``0``。" + +#: ../../c-api/module.rst:8 +msgid "object" +msgstr "object -- 对象" + +#: ../../c-api/module.rst:8 +msgid "module" +msgstr "module" + +#: ../../c-api/module.rst:13 +msgid "ModuleType (in module types)" +msgstr "ModuleType (在 types 模块中)" + +#: ../../c-api/module.rst:33 ../../c-api/module.rst:80 +msgid "__name__ (module attribute)" +msgstr "__name__ (模块属性)" + +#: ../../c-api/module.rst:33 +msgid "__doc__ (module attribute)" +msgstr "__doc__ (模块属性)" + +#: ../../c-api/module.rst:33 ../../c-api/module.rst:119 +msgid "__file__ (module attribute)" +msgstr "__file__ (模块属性)" + +#: ../../c-api/module.rst:33 +msgid "__package__ (module attribute)" +msgstr "__package__ (模块属性)" + +#: ../../c-api/module.rst:33 +msgid "__loader__ (module attribute)" +msgstr "__loader__ (模块属性)" + +#: ../../c-api/module.rst:63 +msgid "__dict__ (module attribute)" +msgstr "__dict__ (模块属性)" + +#: ../../c-api/module.rst:80 ../../c-api/module.rst:119 +msgid "SystemError (built-in exception)" +msgstr "SystemError (内置异常)" diff --git a/c-api/monitoring.po b/c-api/monitoring.po new file mode 100644 index 0000000000..66b01f49a4 --- /dev/null +++ b/c-api/monitoring.po @@ -0,0 +1,325 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/monitoring.rst:6 +msgid "Monitoring C API" +msgstr "监控 C API" + +#: ../../c-api/monitoring.rst:8 +msgid "Added in version 3.13." +msgstr "在 3.13 版中添加。" + +#: ../../c-api/monitoring.rst:10 +msgid "" +"An extension may need to interact with the event monitoring system. " +"Subscribing to events and registering callbacks can be done via the Python " +"API exposed in :mod:`sys.monitoring`." +msgstr "" +"一个扩展可能需要与事件监视系统进行交互。订阅事件和注册回调都可通过在 :mod:`sys.monitoring` 中暴露的 Python API " +"来完成。" + +#: ../../c-api/monitoring.rst:15 +msgid "Generating Execution Events" +msgstr "生成执行事件" + +#: ../../c-api/monitoring.rst:17 +msgid "" +"The functions below make it possible for an extension to fire monitoring " +"events as it emulates the execution of Python code. Each of these functions " +"accepts a ``PyMonitoringState`` struct which contains concise information " +"about the activation state of events, as well as the event arguments, which " +"include a ``PyObject*`` representing the code object, the instruction offset" +" and sometimes additional, event-specific arguments (see " +":mod:`sys.monitoring` for details about the signatures of the different " +"event callbacks). The ``codelike`` argument should be an instance of " +":class:`types.CodeType` or of a type that emulates it." +msgstr "" +"下面的函数使得扩展可以在模拟执行 Python 代码时触发监控事件。这样的函数都接受一个 ``PyMonitoringState`` " +"结构体,其中包含有关事件激活状态的简明信息以及事件参数,此类参数包括代表代码对象的 " +"``PyObject*``、指令偏移量,有时还包括额外的、事件专属的参数(请参阅 :mod:`sys.monitoring` " +"了解有关不同事件回调签名的详情)。``codelike`` 参数应为 :class:`types.CodeType` 的实例或是某个模拟它的类型。" + +#: ../../c-api/monitoring.rst:27 +msgid "" +"The VM disables tracing when firing an event, so there is no need for user " +"code to do that." +msgstr "VM 会在触发事件时禁用跟踪,因此用户不需要额外的操作。" + +#: ../../c-api/monitoring.rst:30 +msgid "" +"Monitoring functions should not be called with an exception set, except " +"those listed below as working with the current exception." +msgstr "监控函数被调用时不应设置异常,除非是下面列出的用于处理当前异常的函数。" + +#: ../../c-api/monitoring.rst:35 +msgid "" +"Representation of the state of an event type. It is allocated by the user " +"while its contents are maintained by the monitoring API functions described " +"below." +msgstr "事件类型状态的表示形式。它由用户分配,但其内容则由下文描述的监控 API 函数来维护。" + +#: ../../c-api/monitoring.rst:39 +msgid "" +"All of the functions below return 0 on success and -1 (with an exception " +"set) on error." +msgstr "下面的所有函数均在成功时返回 0 并在失败时返回 -1 (同时设置一个异常)。" + +#: ../../c-api/monitoring.rst:41 +msgid "See :mod:`sys.monitoring` for descriptions of the events." +msgstr "请参阅 :mod:`sys.monitoring` 获取事件的描述。" + +#: ../../c-api/monitoring.rst:45 +msgid "Fire a ``PY_START`` event." +msgstr "发出 ``PY_START`` 事件。" + +#: ../../c-api/monitoring.rst:50 +msgid "Fire a ``PY_RESUME`` event." +msgstr "发出 ``PY_RESUME`` 事件。" + +#: ../../c-api/monitoring.rst:55 +msgid "Fire a ``PY_RETURN`` event." +msgstr "发出 ``PY_RETURN`` 事件。" + +#: ../../c-api/monitoring.rst:60 +msgid "Fire a ``PY_YIELD`` event." +msgstr "发出 ``PY_YIELD`` 事件。" + +#: ../../c-api/monitoring.rst:65 +msgid "Fire a ``CALL`` event." +msgstr "发出 ``CALL`` 事件。" + +#: ../../c-api/monitoring.rst:70 +msgid "Fire a ``LINE`` event." +msgstr "发出 ``LINE`` 事件。" + +#: ../../c-api/monitoring.rst:75 +msgid "Fire a ``JUMP`` event." +msgstr "发出 ``JUMP`` 事件。" + +#: ../../c-api/monitoring.rst:80 +msgid "Fire a ``BRANCH_LEFT`` event." +msgstr "发出 ``BRANCH_LEFT`` 事件。" + +#: ../../c-api/monitoring.rst:85 +msgid "Fire a ``BRANCH_RIGHT`` event." +msgstr "发出 ``BRANCH_RIGHT`` 事件。" + +#: ../../c-api/monitoring.rst:90 +msgid "Fire a ``C_RETURN`` event." +msgstr "发出 ``C_RETURN`` 事件。" + +#: ../../c-api/monitoring.rst:95 +msgid "" +"Fire a ``PY_THROW`` event with the current exception (as returned by " +":c:func:`PyErr_GetRaisedException`)." +msgstr "使用当前(即 :c:func:`PyErr_GetRaisedException` 返回的)异常发出 ``PY_THROW`` 事件。" + +#: ../../c-api/monitoring.rst:101 +msgid "" +"Fire a ``RAISE`` event with the current exception (as returned by " +":c:func:`PyErr_GetRaisedException`)." +msgstr "使用当前(即 :c:func:`PyErr_GetRaisedException` 所返回的)异常发出 ``RAISE`` 事件。" + +#: ../../c-api/monitoring.rst:107 +msgid "" +"Fire a ``C_RAISE`` event with the current exception (as returned by " +":c:func:`PyErr_GetRaisedException`)." +msgstr "使用当前(即 :c:func:`PyErr_GetRaisedException` 所返回的)异常发出 ``C_RAISE`` 事件。" + +#: ../../c-api/monitoring.rst:113 +msgid "" +"Fire a ``RERAISE`` event with the current exception (as returned by " +":c:func:`PyErr_GetRaisedException`)." +msgstr "使用当前(即 :c:func:`PyErr_GetRaisedException` 所返回的)异常发出 ``RERAISE`` 事件。" + +#: ../../c-api/monitoring.rst:119 +msgid "" +"Fire an ``EXCEPTION_HANDLED`` event with the current exception (as returned " +"by :c:func:`PyErr_GetRaisedException`)." +msgstr "" +"使用当前(即 :c:func:`PyErr_GetRaisedException` 所返回的)异常发出 ``EXCEPTION_HANDLED`` " +"事件。" + +#: ../../c-api/monitoring.rst:125 +msgid "" +"Fire a ``PY_UNWIND`` event with the current exception (as returned by " +":c:func:`PyErr_GetRaisedException`)." +msgstr "使用当前(即 :c:func:`PyErr_GetRaisedException` 所返回的)异常发出 ``PY_UNWIND`` 事件。" + +#: ../../c-api/monitoring.rst:131 +msgid "" +"Fire a ``STOP_ITERATION`` event. If ``value`` is an instance of " +":exc:`StopIteration`, it is used. Otherwise, a new :exc:`StopIteration` " +"instance is created with ``value`` as its argument." +msgstr "" +"发出 ``STOP_ITERATION`` 事件。如果 ``value`` 是一个 :exc:`StopIteration` " +"实例,它将被使用。在其他情况下,将新建一个 :exc:`StopIteration` 实例并以 ``value`` 作为其参数。" + +#: ../../c-api/monitoring.rst:136 +msgid "Managing the Monitoring State" +msgstr "管理监控状态" + +#: ../../c-api/monitoring.rst:138 +msgid "" +"Monitoring states can be managed with the help of monitoring scopes. A scope" +" would typically correspond to a Python function." +msgstr "监控状态可在监控作用域的协助下进行管理。一个作用域通常对应一个 Python 函数。" + +#: ../../c-api/monitoring.rst:143 +msgid "" +"Enter a monitored scope. ``event_types`` is an array of the event IDs for " +"events that may be fired from the scope. For example, the ID of a " +"``PY_START`` event is the value ``PY_MONITORING_EVENT_PY_START``, which is " +"numerically equal to the base-2 logarithm of " +"``sys.monitoring.events.PY_START``. ``state_array`` is an array with a " +"monitoring state entry for each event in ``event_types``, it is allocated by" +" the user but populated by :c:func:`!PyMonitoring_EnterScope` with " +"information about the activation state of the event. The size of " +"``event_types`` (and hence also of ``state_array``) is given in ``length``." +msgstr "" +"进入一个监控作用域。``event_types`` 是由可从该作用域发生事件的事件 ID 组成的数组。例如,``PY_START`` 事件的 ID 值为" +" ``PY_MONITORING_EVENT_PY_START``,其对应数字等于 ``sys.monitoring.events.PY_START``" +" 的以 2 为底的对数。``state_array`` 是由对应 ``event_types`` 中每个事件的监控状态组成的数组,它由用户进行分配但是由" +" :c:func:`!PyMonitoring_EnterScope` 使用事件激活状态相关信息填充。``event_types`` 的大小 (因而也是" +" ``state_array`` 的大小) 由 ``length`` 给出。" + +#: ../../c-api/monitoring.rst:153 +msgid "" +"The ``version`` argument is a pointer to a value which should be allocated " +"by the user together with ``state_array`` and initialized to 0, and then set" +" only by :c:func:`!PyMonitoring_EnterScope` itself. It allows this function " +"to determine whether event states have changed since the previous call, and " +"to return quickly if they have not." +msgstr "" +"``version`` 参数是一个指针,指向应与 ``state_array`` 一起由用户分配并初始化为 0 的值,然后仅由 " +":c:func:`!PyMonitoring_EnterScope` 本身来设置。 " +"它允许此函数确定事件状态自上次调用以来是否发生改变,并在它们未改变时立即返回。" + +#: ../../c-api/monitoring.rst:159 +msgid "" +"The scopes referred to here are lexical scopes: a function, class or method." +" :c:func:`!PyMonitoring_EnterScope` should be called whenever the lexical " +"scope is entered. Scopes can be reentered, reusing the same *state_array* " +"and *version*, in situations like when emulating a recursive Python " +"function. When a code-like's execution is paused, such as when emulating a " +"generator, the scope needs to be exited and re-entered." +msgstr "" +"这里所称的作用域是词法意义下的作用域:一个函数、类或方法。 :c:func:`!PyMonitoring_EnterScope` " +"应当在进入词法作用域时被调用。在模拟一个递归 Python 函数之类的情况下,作用域可被重进入,并重用相同的 *state_array* 和 " +"*version*。当某个代码执行暂停时,例如在模拟一个生成器时,此作用域需要被退出并重进入。" + +#: ../../c-api/monitoring.rst:166 +msgid "The macros for *event_types* are:" +msgstr "对应 *event_types* 的宏如下:" + +#: ../../c-api/monitoring.rst:174 +msgid "Macro" +msgstr "宏" + +#: ../../c-api/monitoring.rst:174 +msgid "Event" +msgstr "事件" + +#: ../../c-api/monitoring.rst:176 +msgid ":monitoring-event:`BRANCH_LEFT`" +msgstr ":monitoring-event:`BRANCH_LEFT`" + +#: ../../c-api/monitoring.rst:177 +msgid ":monitoring-event:`BRANCH_RIGHT`" +msgstr ":monitoring-event:`BRANCH_RIGHT`" + +#: ../../c-api/monitoring.rst:178 +msgid ":monitoring-event:`CALL`" +msgstr ":monitoring-event:`CALL`" + +#: ../../c-api/monitoring.rst:179 +msgid ":monitoring-event:`C_RAISE`" +msgstr ":monitoring-event:`C_RAISE`" + +#: ../../c-api/monitoring.rst:180 +msgid ":monitoring-event:`C_RETURN`" +msgstr ":monitoring-event:`C_RETURN`" + +#: ../../c-api/monitoring.rst:181 +msgid ":monitoring-event:`EXCEPTION_HANDLED`" +msgstr ":monitoring-event:`EXCEPTION_HANDLED`" + +#: ../../c-api/monitoring.rst:182 +msgid ":monitoring-event:`INSTRUCTION`" +msgstr ":monitoring-event:`INSTRUCTION`" + +#: ../../c-api/monitoring.rst:183 +msgid ":monitoring-event:`JUMP`" +msgstr ":monitoring-event:`JUMP`" + +#: ../../c-api/monitoring.rst:184 +msgid ":monitoring-event:`LINE`" +msgstr ":monitoring-event:`LINE`" + +#: ../../c-api/monitoring.rst:185 +msgid ":monitoring-event:`PY_RESUME`" +msgstr ":monitoring-event:`PY_RESUME`" + +#: ../../c-api/monitoring.rst:186 +msgid ":monitoring-event:`PY_RETURN`" +msgstr ":monitoring-event:`PY_RETURN`" + +#: ../../c-api/monitoring.rst:187 +msgid ":monitoring-event:`PY_START`" +msgstr ":monitoring-event:`PY_START`" + +#: ../../c-api/monitoring.rst:188 +msgid ":monitoring-event:`PY_THROW`" +msgstr ":monitoring-event:`PY_THROW`" + +#: ../../c-api/monitoring.rst:189 +msgid ":monitoring-event:`PY_UNWIND`" +msgstr ":monitoring-event:`PY_UNWIND`" + +#: ../../c-api/monitoring.rst:190 +msgid ":monitoring-event:`PY_YIELD`" +msgstr ":monitoring-event:`PY_YIELD`" + +#: ../../c-api/monitoring.rst:191 +msgid ":monitoring-event:`RAISE`" +msgstr ":monitoring-event:`RAISE`" + +#: ../../c-api/monitoring.rst:192 +msgid ":monitoring-event:`RERAISE`" +msgstr ":monitoring-event:`RERAISE`" + +#: ../../c-api/monitoring.rst:193 +msgid ":monitoring-event:`STOP_ITERATION`" +msgstr ":monitoring-event:`STOP_ITERATION`" + +#: ../../c-api/monitoring.rst:198 +msgid "" +"Exit the last scope that was entered with " +":c:func:`!PyMonitoring_EnterScope`." +msgstr "退出使用 :c:func:`!PyMonitoring_EnterScope` 进入的上一个作用域。" + +#: ../../c-api/monitoring.rst:203 +msgid "" +"Return true if the event corresponding to the event ID *ev* is a :ref:`local" +" event `." +msgstr "如果对应事件 ID *ev* 的事件属于 :ref:`局部事件 ` 则返回真值。" diff --git a/c-api/none.po b/c-api/none.po new file mode 100644 index 0000000000..2e9abc9b9c --- /dev/null +++ b/c-api/none.po @@ -0,0 +1,59 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/none.rst:6 +msgid "The ``None`` Object" +msgstr "``None`` 对象" + +#: ../../c-api/none.rst:10 +msgid "" +"Note that the :c:type:`PyTypeObject` for ``None`` is not directly exposed in" +" the Python/C API. Since ``None`` is a singleton, testing for object " +"identity (using ``==`` in C) is sufficient. There is no " +":c:func:`!PyNone_Check` function for the same reason." +msgstr "" +"请注意,Python/C API 中并没有直接公开 ``None`` 的 :c:type:`PyTypeObject`。由于 ``None`` " +"是一个单例,测试对象标识(在 C 语言中使用 ``==`` 运算符)就足够了。出于同样的原因也没有 :c:func:`!PyNone_Check` " +"函数。" + +#: ../../c-api/none.rst:18 +msgid "" +"The Python ``None`` object, denoting lack of value. This object has no " +"methods and is :term:`immortal`." +msgstr "Python ``None`` 对象,表示缺少实际值。该对象没有任何方法并且属于 :term:`immortal` 对象。" + +#: ../../c-api/none.rst:21 +msgid ":c:data:`Py_None` is :term:`immortal`." +msgstr ":c:data:`Py_None` 属于 :term:`immortal` 对象。" + +#: ../../c-api/none.rst:26 +msgid "Return :c:data:`Py_None` from a function." +msgstr "从一个函数返回 :c:data:`Py_None`。" + +#: ../../c-api/none.rst:8 +msgid "object" +msgstr "object -- 对象" + +#: ../../c-api/none.rst:8 +msgid "None" +msgstr "None" diff --git a/c-api/number.po b/c-api/number.po new file mode 100644 index 0000000000..0610813dbd --- /dev/null +++ b/c-api/number.po @@ -0,0 +1,378 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/number.rst:6 +msgid "Number Protocol" +msgstr "数字协议" + +#: ../../c-api/number.rst:11 +msgid "" +"Returns ``1`` if the object *o* provides numeric protocols, and false " +"otherwise. This function always succeeds." +msgstr "如果对象 *o* 提供数字的协议,返回真 ``1``,否则返回假。这个函数不会调用失败。" + +#: ../../c-api/number.rst:14 +msgid "Returns ``1`` if *o* is an index integer." +msgstr "如果 *o* 是一个索引整数则返回 ``1``。" + +#: ../../c-api/number.rst:20 +msgid "" +"Returns the result of adding *o1* and *o2*, or ``NULL`` on failure. This is" +" the equivalent of the Python expression ``o1 + o2``." +msgstr "返回 *o1* 、*o2* 相加的结果,如果失败,返回 ``NULL``。等价于 Python 表达式 ``o1 + o2``。" + +#: ../../c-api/number.rst:26 +msgid "" +"Returns the result of subtracting *o2* from *o1*, or ``NULL`` on failure. " +"This is the equivalent of the Python expression ``o1 - o2``." +msgstr "返回 *o1* 减去 *o2* 的结果,如果失败,返回 ``NULL``。等价于 Python 表达式 ``o1 - o2``。" + +#: ../../c-api/number.rst:32 +msgid "" +"Returns the result of multiplying *o1* and *o2*, or ``NULL`` on failure. " +"This is the equivalent of the Python expression ``o1 * o2``." +msgstr "返回 *o1* 、 *o2* 相乘的结果,如果失败,返回 ``NULL``。等价于 Python 表达式 ``o1 * o2``。" + +#: ../../c-api/number.rst:38 +msgid "" +"Returns the result of matrix multiplication on *o1* and *o2*, or ``NULL`` on" +" failure. This is the equivalent of the Python expression ``o1 @ o2``." +msgstr "返回 *o1* 、*o2* 做矩阵乘法的结果,如果失败,返回 ``NULL``。等价于 Python 表达式 ``o1 @ o2``。" + +#: ../../c-api/number.rst:46 +msgid "" +"Return the floor of *o1* divided by *o2*, or ``NULL`` on failure. This is " +"the equivalent of the Python expression ``o1 // o2``." +msgstr "返回 *o1* 除以 *o2* 向下取整的值,失败时返回 ``NULL``。这等价于 Python 表达式 ``o1 // o2``。" + +#: ../../c-api/number.rst:52 +msgid "" +"Return a reasonable approximation for the mathematical value of *o1* divided" +" by *o2*, or ``NULL`` on failure. The return value is \"approximate\" " +"because binary floating-point numbers are approximate; it is not possible to" +" represent all real numbers in base two. This function can return a " +"floating-point value when passed two integers. This is the equivalent of " +"the Python expression ``o1 / o2``." +msgstr "" +"返回 *o1* 除以 *o2* 的数学值的合理近似值,或失败时返回 ``NULL``。返回的是 \"近似值\" " +"因为二进制浮点数本身就是近似值;不可能以二进制精确表示所有实数。此函数可以在传入两个整数时返回一个浮点值。此函数等价于 Python 表达式 ``o1 " +"/ o2``。" + +#: ../../c-api/number.rst:61 +msgid "" +"Returns the remainder of dividing *o1* by *o2*, or ``NULL`` on failure. " +"This is the equivalent of the Python expression ``o1 % o2``." +msgstr "返回 *o1* 除以 *o2* 得到的余数,如果失败,返回 ``NULL``。等价于 Python 表达式 ``o1 % o2``。" + +#: ../../c-api/number.rst:69 +msgid "" +"See the built-in function :func:`divmod`. Returns ``NULL`` on failure. This" +" is the equivalent of the Python expression ``divmod(o1, o2)``." +msgstr "" +"参考内置函数 :func:`divmod`。如果失败,返回 ``NULL``。等价于 Python 表达式 ``divmod(o1, o2)``。" + +#: ../../c-api/number.rst:77 +msgid "" +"See the built-in function :func:`pow`. Returns ``NULL`` on failure. This is" +" the equivalent of the Python expression ``pow(o1, o2, o3)``, where *o3* is " +"optional. If *o3* is to be ignored, pass :c:data:`Py_None` in its place " +"(passing ``NULL`` for *o3* would cause an illegal memory access)." +msgstr "" +"请参阅内置函数 :func:`pow`。如果失败,返回 ``NULL``。等价于 Python 中的表达式 ``pow(o1, o2, o3)``,其中" +" *o3* 是可选的。如果要忽略 *o3*,则需传入 :c:data:`Py_None` 作为代替(如果传入 ``NULL`` 会导致非法内存访问)。" + +#: ../../c-api/number.rst:85 +msgid "" +"Returns the negation of *o* on success, or ``NULL`` on failure. This is the " +"equivalent of the Python expression ``-o``." +msgstr "返回 *o* 的负值,如果失败,返回 ``NULL``。等价于 Python 表达式 ``-o``。" + +#: ../../c-api/number.rst:91 +msgid "" +"Returns *o* on success, or ``NULL`` on failure. This is the equivalent of " +"the Python expression ``+o``." +msgstr "返回 *o*,如果失败,返回 ``NULL``。等价于 Python 表达式 ``+o``。" + +#: ../../c-api/number.rst:99 +msgid "" +"Returns the absolute value of *o*, or ``NULL`` on failure. This is the " +"equivalent of the Python expression ``abs(o)``." +msgstr "返回 *o* 的绝对值,如果失败,返回 ``NULL``。等价于 Python 表达式 ``abs(o)``。" + +#: ../../c-api/number.rst:105 +msgid "" +"Returns the bitwise negation of *o* on success, or ``NULL`` on failure. " +"This is the equivalent of the Python expression ``~o``." +msgstr "返回 *o* 的按位取反后的结果,如果失败,返回 ``NULL``。等价于 Python 表达式 ``~o``。" + +#: ../../c-api/number.rst:111 +msgid "" +"Returns the result of left shifting *o1* by *o2* on success, or ``NULL`` on " +"failure. This is the equivalent of the Python expression ``o1 << o2``." +msgstr "返回 *o1* 左移 *o2* 个比特后的结果,如果失败,返回 ``NULL``。等价于 Python 表达式 ``o1 << o2``。" + +#: ../../c-api/number.rst:117 +msgid "" +"Returns the result of right shifting *o1* by *o2* on success, or ``NULL`` on" +" failure. This is the equivalent of the Python expression ``o1 >> o2``." +msgstr "返回 *o1* 右移 *o2* 个比特后的结果,如果失败,返回 ``NULL``。等价于 Python 表达式 ``o1 >> o2``。" + +#: ../../c-api/number.rst:123 +msgid "" +"Returns the \"bitwise and\" of *o1* and *o2* on success and ``NULL`` on " +"failure. This is the equivalent of the Python expression ``o1 & o2``." +msgstr "返回 *o1* 和 *o2* “按位与”的结果,如果失败,返回 ``NULL``。等价于 Python 表达式 ``o1 & o2``。" + +#: ../../c-api/number.rst:129 +msgid "" +"Returns the \"bitwise exclusive or\" of *o1* by *o2* on success, or ``NULL``" +" on failure. This is the equivalent of the Python expression ``o1 ^ o2``." +msgstr "返回 *o1* 和 *o2* “按位异或”的结果,如果失败,返回 ``NULL``。等价于 Python 表达式 ``o1 ^ o2``。" + +#: ../../c-api/number.rst:135 +msgid "" +"Returns the \"bitwise or\" of *o1* and *o2* on success, or ``NULL`` on " +"failure. This is the equivalent of the Python expression ``o1 | o2``." +msgstr "返回 *o1* 和 *o2* “按位或”的结果,如果失败,返回 ``NULL``。等价于 Python 表达式 ``o1 | o2``。" + +#: ../../c-api/number.rst:141 +msgid "" +"Returns the result of adding *o1* and *o2*, or ``NULL`` on failure. The " +"operation is done *in-place* when *o1* supports it. This is the equivalent " +"of the Python statement ``o1 += o2``." +msgstr "" +"返回 *o1* 、*o2* 相加的结果,如果失败,返回 ``NULL``。当 *o1* 支持时,这个运算直接使用它储存结果。等价于 Python 语句 " +"``o1 += o2``。" + +#: ../../c-api/number.rst:148 +msgid "" +"Returns the result of subtracting *o2* from *o1*, or ``NULL`` on failure. " +"The operation is done *in-place* when *o1* supports it. This is the " +"equivalent of the Python statement ``o1 -= o2``." +msgstr "" +"返回 *o1* 、*o2* 相减的结果,如果失败,返回 ``NULL``。当 *o1* 支持时,这个运算直接使用它储存结果。等价于 Python 语句 " +"``o1 -= o2``。" + +#: ../../c-api/number.rst:155 +msgid "" +"Returns the result of multiplying *o1* and *o2*, or ``NULL`` on failure. " +"The operation is done *in-place* when *o1* supports it. This is the " +"equivalent of the Python statement ``o1 *= o2``." +msgstr "" +"返回 *o1* 、*o2*相乘的结果,如果失败,返回 ``NULL``。当 *o1* 支持时,这个运算直接使用它储存结果。等价于 Python 语句 " +"``o1 *= o2``。" + +#: ../../c-api/number.rst:162 +msgid "" +"Returns the result of matrix multiplication on *o1* and *o2*, or ``NULL`` on" +" failure. The operation is done *in-place* when *o1* supports it. This is " +"the equivalent of the Python statement ``o1 @= o2``." +msgstr "" +"返回 *o1* 、*o2* 做矩阵乘法后的结果,如果失败,返回 ``NULL``。当 *o1* 支持时,这个运算直接使用它储存结果。等价于 Python" +" 语句 ``o1 @= o2``。" + +#: ../../c-api/number.rst:171 +msgid "" +"Returns the mathematical floor of dividing *o1* by *o2*, or ``NULL`` on " +"failure. The operation is done *in-place* when *o1* supports it. This is " +"the equivalent of the Python statement ``o1 //= o2``." +msgstr "" +"返回 *o1* 除以 *o2* 后向下取整的结果,如果失败,返回 ``NULL``。当 *o1* 支持时,这个运算直接使用它储存结果。等价于 " +"Python 语句 ``o1 //= o2``。" + +#: ../../c-api/number.rst:178 +msgid "" +"Return a reasonable approximation for the mathematical value of *o1* divided" +" by *o2*, or ``NULL`` on failure. The return value is \"approximate\" " +"because binary floating-point numbers are approximate; it is not possible to" +" represent all real numbers in base two. This function can return a " +"floating-point value when passed two integers. The operation is done *in-" +"place* when *o1* supports it. This is the equivalent of the Python statement" +" ``o1 /= o2``." +msgstr "" +"返回 *o1* 除以 *o2* 的数学值的合理近似值,或失败时返回 ``NULL``。返回的是 \"近似值\" " +"因为二进制浮点数本身就是近似值;不可能以二进制精确表示所有实数。此函数可以在传入两个整数时返回一个浮点数。此运算在 *o1* 支持的时候会 *原地* " +"执行。此函数等价于 Python 语句 ``o1 /= o2``。" + +#: ../../c-api/number.rst:188 +msgid "" +"Returns the remainder of dividing *o1* by *o2*, or ``NULL`` on failure. The" +" operation is done *in-place* when *o1* supports it. This is the equivalent" +" of the Python statement ``o1 %= o2``." +msgstr "" +"返回 *o1* 除以 *o2* 得到的余数,如果失败,返回 ``NULL``。当 *o1* 支持时,这个运算直接使用它储存结果。等价于 Python " +"语句 ``o1 %= o2``。" + +#: ../../c-api/number.rst:197 +msgid "" +"See the built-in function :func:`pow`. Returns ``NULL`` on failure. The " +"operation is done *in-place* when *o1* supports it. This is the equivalent " +"of the Python statement ``o1 **= o2`` when o3 is :c:data:`Py_None`, or an " +"in-place variant of ``pow(o1, o2, o3)`` otherwise. If *o3* is to be ignored," +" pass :c:data:`Py_None` in its place (passing ``NULL`` for *o3* would cause " +"an illegal memory access)." +msgstr "" +"参见内置函数 :func:`pow`。 失败时返回 ``NULL``。 当 *o1* 支持时此操作将 *原地* 执行。 当 o3 为 " +":c:data:`Py_None` 时 这等价于 Python 语句 ``o1 **= o2``,否则为 ``pow(o1, o2, o3)`` " +"的原地执行形式。 如果要忽略 *o3*,则传入 :c:data:`Py_None` 代替它(传入 ``NULL`` 作为 *o3* " +"会导致非法内存访问)。" + +#: ../../c-api/number.rst:206 +msgid "" +"Returns the result of left shifting *o1* by *o2* on success, or ``NULL`` on " +"failure. The operation is done *in-place* when *o1* supports it. This is " +"the equivalent of the Python statement ``o1 <<= o2``." +msgstr "" +"返回 *o1* 左移 *o2* 个比特后的结果,如果失败,返回 ``NULL``。当 *o1* 支持时,这个运算直接使用它储存结果。等价于 Python" +" 语句 ``o1 <<= o2``。" + +#: ../../c-api/number.rst:213 +msgid "" +"Returns the result of right shifting *o1* by *o2* on success, or ``NULL`` on" +" failure. The operation is done *in-place* when *o1* supports it. This is " +"the equivalent of the Python statement ``o1 >>= o2``." +msgstr "" +"返回 *o1* 右移 *o2* 个比特后的结果,如果失败,返回 ``NULL``。当 *o1* 支持时,这个运算直接使用它储存结果。等价于 Python" +" 语句 ``o1 >>= o2``。" + +#: ../../c-api/number.rst:220 +msgid "" +"Returns the \"bitwise and\" of *o1* and *o2* on success and ``NULL`` on " +"failure. The operation is done *in-place* when *o1* supports it. This is " +"the equivalent of the Python statement ``o1 &= o2``." +msgstr "" +"成功时返回 *o1* 和 *o2* \"按位与\" 的结果,失败时返回 ``NULL``。在 *o1* 支持的前提下该操作将 *原地* 执行。等价于 " +"Python 语句 ``o1 &= o2``。" + +#: ../../c-api/number.rst:227 +msgid "" +"Returns the \"bitwise exclusive or\" of *o1* by *o2* on success, or ``NULL``" +" on failure. The operation is done *in-place* when *o1* supports it. This " +"is the equivalent of the Python statement ``o1 ^= o2``." +msgstr "" +"成功时返回 *o1* 和 *o2* \"按位异或\" 的结果,失败时返回 ``NULL``。在 *o1* 支持的前提下该操作将 *原地* 执行。等价于 " +"Python 语句 ``o1 ^= o2``。" + +#: ../../c-api/number.rst:234 +msgid "" +"Returns the \"bitwise or\" of *o1* and *o2* on success, or ``NULL`` on " +"failure. The operation is done *in-place* when *o1* supports it. This is " +"the equivalent of the Python statement ``o1 |= o2``." +msgstr "" +"成功时返回 *o1* 和 *o2* \"按位或\" 的结果,失败时返回 ``NULL``。在 *o1* 支持的前提下该操作将 *原地* 执行。等价于 " +"Python 语句 ``o1 |= o2``。" + +#: ../../c-api/number.rst:243 +msgid "" +"Returns the *o* converted to an integer object on success, or ``NULL`` on " +"failure. This is the equivalent of the Python expression ``int(o)``." +msgstr "成功时返回 *o* 转换为整数对象后的结果,失败时返回 ``NULL``。等价于 Python 表达式 ``int(o)``。" + +#: ../../c-api/number.rst:251 +msgid "" +"Returns the *o* converted to a float object on success, or ``NULL`` on " +"failure. This is the equivalent of the Python expression ``float(o)``." +msgstr "成功时返回 *o* 转换为浮点对象后的结果,失败时返回 ``NULL``。等价于 Python 表达式 ``float(o)``。" + +#: ../../c-api/number.rst:257 +msgid "" +"Returns the *o* converted to a Python int on success or ``NULL`` with a " +":exc:`TypeError` exception raised on failure." +msgstr "" +"成功时返回 *o* 转换为 Python int 类型后的结果,失败时返回 ``NULL`` 并引发 :exc:`TypeError` 异常。" + +#: ../../c-api/number.rst:260 +msgid "" +"The result always has exact type :class:`int`. Previously, the result could" +" have been an instance of a subclass of ``int``." +msgstr "结果总是为 :class:`int` 类型。在之前版本中,结果可能为 ``int`` 的子类的实例。" + +#: ../../c-api/number.rst:267 +msgid "" +"Returns the integer *n* converted to base *base* as a string. The *base* " +"argument must be one of 2, 8, 10, or 16. For base 2, 8, or 16, the returned" +" string is prefixed with a base marker of ``'0b'``, ``'0o'``, or ``'0x'``, " +"respectively. If *n* is not a Python int, it is converted with " +":c:func:`PyNumber_Index` first." +msgstr "" +"返回整数 *n* 转换成以 *base* 为基数的字符串后的结果。这个 *base* 参数必须是 2,8,10 或者 16。对于基数 2,8,或 " +"16,返回的字符串将分别加上基数标识 ``'0b'``, ``'0o'``, 或 ``'0x'``。如果 *n* 不是 Python 中的整数 " +"*int* 类型,就先通过 :c:func:`PyNumber_Index` 将它转换成整数类型。" + +#: ../../c-api/number.rst:276 +msgid "" +"Returns *o* converted to a :c:type:`Py_ssize_t` value if *o* can be " +"interpreted as an integer. If the call fails, an exception is raised and " +"``-1`` is returned." +msgstr "" +"如果 *o* 可以被解读为一个整数则返回 *o* 转换成的 :c:type:`Py_ssize_t` 值。如果调用失败,则会引发一个异常并返回 " +"``-1``。" + +#: ../../c-api/number.rst:279 +msgid "" +"If *o* can be converted to a Python int but the attempt to convert to a " +":c:type:`Py_ssize_t` value would raise an :exc:`OverflowError`, then the " +"*exc* argument is the type of exception that will be raised (usually " +":exc:`IndexError` or :exc:`OverflowError`). If *exc* is ``NULL``, then the " +"exception is cleared and the value is clipped to ``PY_SSIZE_T_MIN`` for a " +"negative integer or ``PY_SSIZE_T_MAX`` for a positive integer." +msgstr "" +"如果 *o* 可以被转换为 Python 的 int 值但尝试转换为 :c:type:`Py_ssize_t` 值则会引发 " +":exc:`OverflowError`,则 *exc* 参数将为所引发的异常类型 (通常为 :exc:`IndexError` 或 " +":exc:`OverflowError`)。如果 *exc* 为 ``NULL``,则异常会被清除并且值会在为负整数时被裁剪为 " +"``PY_SSIZE_T_MIN`` 而在为正整数时被裁剪为 ``PY_SSIZE_T_MAX``。" + +#: ../../c-api/number.rst:289 +msgid "" +"Returns ``1`` if *o* is an index integer (has the ``nb_index`` slot of the " +"``tp_as_number`` structure filled in), and ``0`` otherwise. This function " +"always succeeds." +msgstr "" +"如果 *o* 是一个索引整数(即 ``tp_as_number`` 结构体中填充了 ``nb_index`` 槽位),则返回 ``1``,否则返回 " +"``0``。此函数总是会成功执行。" + +#: ../../c-api/number.rst:67 ../../c-api/number.rst:75 +#: ../../c-api/number.rst:97 ../../c-api/number.rst:195 +#: ../../c-api/number.rst:241 ../../c-api/number.rst:249 +msgid "built-in function" +msgstr "内置函数" + +#: ../../c-api/number.rst:67 +msgid "divmod" +msgstr "divmod" + +#: ../../c-api/number.rst:75 ../../c-api/number.rst:195 +msgid "pow" +msgstr "pow" + +#: ../../c-api/number.rst:97 +msgid "abs" +msgstr "abs" + +#: ../../c-api/number.rst:241 +msgid "int" +msgstr "int" + +#: ../../c-api/number.rst:249 +msgid "float" +msgstr "float" diff --git a/c-api/object.po b/c-api/object.po new file mode 100644 index 0000000000..9f6845aefe --- /dev/null +++ b/c-api/object.po @@ -0,0 +1,1186 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/object.rst:6 +msgid "Object Protocol" +msgstr "对象协议" + +#: ../../c-api/object.rst:11 +msgid "Get a :term:`strong reference` to a constant." +msgstr "获取一个指向常量的 :term:`strong reference`。" + +#: ../../c-api/object.rst:13 +msgid "Set an exception and return ``NULL`` if *constant_id* is invalid." +msgstr "如果 *constant_id* 无效则设置一个异常并返回 ``NULL``。" + +#: ../../c-api/object.rst:15 +msgid "*constant_id* must be one of these constant identifiers:" +msgstr "*constant_id* 必须是下列常量标识符之一:" + +#: ../../c-api/object.rst:20 +msgid "Constant Identifier" +msgstr "常量标识符" + +#: ../../c-api/object.rst:20 +msgid "Value" +msgstr "值" + +#: ../../c-api/object.rst:20 +msgid "Returned object" +msgstr "返回的对象" + +#: ../../c-api/object.rst:22 ../../c-api/object.rst:27 +msgid "``0``" +msgstr "``0``" + +#: ../../c-api/object.rst:22 +msgid ":py:data:`None`" +msgstr ":py:data:`None`" + +#: ../../c-api/object.rst:23 ../../c-api/object.rst:28 +msgid "``1``" +msgstr "``1``" + +#: ../../c-api/object.rst:23 +msgid ":py:data:`False`" +msgstr ":py:data:`False`" + +#: ../../c-api/object.rst:24 +msgid "``2``" +msgstr "``2``" + +#: ../../c-api/object.rst:24 +msgid ":py:data:`True`" +msgstr ":py:data:`True`" + +#: ../../c-api/object.rst:25 +msgid "``3``" +msgstr "``3``" + +#: ../../c-api/object.rst:25 +msgid ":py:data:`Ellipsis`" +msgstr ":py:data:`Ellipsis`" + +#: ../../c-api/object.rst:26 +msgid "``4``" +msgstr "``4``" + +#: ../../c-api/object.rst:26 +msgid ":py:data:`NotImplemented`" +msgstr ":py:data:`NotImplemented`" + +#: ../../c-api/object.rst:27 +msgid "``5``" +msgstr "``5``" + +#: ../../c-api/object.rst:28 +msgid "``6``" +msgstr "``6``" + +#: ../../c-api/object.rst:29 +msgid "``7``" +msgstr "``7``" + +#: ../../c-api/object.rst:29 +msgid "``''``" +msgstr "``''``" + +#: ../../c-api/object.rst:30 +msgid "``8``" +msgstr "``8``" + +#: ../../c-api/object.rst:30 +msgid "``b''``" +msgstr "``b''``" + +#: ../../c-api/object.rst:31 +msgid "``9``" +msgstr "``9``" + +#: ../../c-api/object.rst:31 +msgid "``()``" +msgstr "``()``" + +#: ../../c-api/object.rst:34 +msgid "" +"Numeric values are only given for projects which cannot use the constant " +"identifiers." +msgstr "仅对无法使用常量标识符的项目才会给出数字值。" + +#: ../../c-api/object.rst:42 +msgid "In CPython, all of these constants are :term:`immortal`." +msgstr "在 CPython 中,所有这些常量都属于 :term:`immortal` 对象。" + +#: ../../c-api/object.rst:47 +msgid "" +"Similar to :c:func:`Py_GetConstant`, but return a :term:`borrowed " +"reference`." +msgstr "类似于 :c:func:`Py_GetConstant`,但会返回一个 :term:`borrowed reference`。" + +#: ../../c-api/object.rst:50 +msgid "" +"This function is primarily intended for backwards compatibility: using " +":c:func:`Py_GetConstant` is recommended for new code." +msgstr "此函数的主要目的是用于向下兼容:对于新代码推荐使用 :c:func:`Py_GetConstant`。" + +#: ../../c-api/object.rst:53 +msgid "" +"The reference is borrowed from the interpreter, and is valid until the " +"interpreter finalization." +msgstr "该引用是从解释器借入的,并将保持可用直到解释器最终化。" + +#: ../../c-api/object.rst:61 +msgid "" +"The ``NotImplemented`` singleton, used to signal that an operation is not " +"implemented for the given type combination." +msgstr "``NotImplemented`` 单例,用于标记某个操作没有针对给定类型组合的实现。" + +#: ../../c-api/object.rst:67 +msgid "" +"Properly handle returning :c:data:`Py_NotImplemented` from within a C " +"function (that is, create a new :term:`strong reference` to " +":const:`NotImplemented` and return it)." +msgstr "" +"正确处理从 C 函数内部返回 :c:data:`Py_NotImplemented` 的问题(即新建一个指向 " +":const:`NotImplemented` 的 :term:`strong reference` 并返回它)。" + +#: ../../c-api/object.rst:74 +msgid "" +"Flag to be used with multiple functions that print the object (like " +":c:func:`PyObject_Print` and :c:func:`PyFile_WriteObject`). If passed, these" +" functions use the :func:`str` of the object instead of the :func:`repr`." +msgstr "" +"要与多个打印对象的函数 (如 :c:func:`PyObject_Print` 和 :c:func:`PyFile_WriteObject`) " +"一起使用的旗标。如果传入,这些函数应当使用对象的 :func:`str` 而不是 :func:`repr`。" + +#: ../../c-api/object.rst:82 +msgid "" +"Print an object *o*, on file *fp*. Returns ``-1`` on error. The flags " +"argument is used to enable certain printing options. The only option " +"currently supported is :c:macro:`Py_PRINT_RAW`; if given, the :func:`str` of" +" the object is written instead of the :func:`repr`." +msgstr "" +"打印对象 *o* 到文件 *fp*。出错时返回 ``-1``。flags 参数被用于启用特定的打印选项。目前唯一支持的选项是 " +":c:macro:`Py_PRINT_RAW`;如果给出该选项,则将写入对象的 :func:`str` 而不是 :func:`repr`。" + +#: ../../c-api/object.rst:90 +msgid "" +"Returns ``1`` if *o* has the attribute *attr_name*, and ``0`` otherwise. " +"This is equivalent to the Python expression ``hasattr(o, attr_name)``. On " +"failure, return ``-1``." +msgstr "" +"如果 *o* 具有属性 *attr_name* 则返回 ``1``,否则返回 ``0``。这相当于 Python 表达式 ``hasattr(o, " +"attr_name)``。当失败时,将返回 ``-1``。" + +#: ../../c-api/object.rst:99 +msgid "" +"This is the same as :c:func:`PyObject_HasAttrWithError`, but *attr_name* is " +"specified as a :c:expr:`const char*` UTF-8 encoded bytes string, rather than" +" a :c:expr:`PyObject*`." +msgstr "" +"这与 :c:func:`PyObject_HasAttrWithError` 相同,但 *attr_name* 被指定为 :c:expr:`const " +"char*` UTF-8 编码的字节串,而不是 :c:expr:`PyObject*`。" + +#: ../../c-api/object.rst:108 +msgid "" +"Returns ``1`` if *o* has the attribute *attr_name*, and ``0`` otherwise. " +"This function always succeeds." +msgstr "如果 *o* 具有属性 *attr_name* 则返回 ``1``,否则返回 ``0``。此函数总是会成功执行。" + +#: ../../c-api/object.rst:113 +msgid "" +"Exceptions that occur when this calls :meth:`~object.__getattr__` and " +":meth:`~object.__getattribute__` methods aren't propagated, but instead " +"given to :func:`sys.unraisablehook`. For proper error handling, use " +":c:func:`PyObject_HasAttrWithError`, :c:func:`PyObject_GetOptionalAttr` or " +":c:func:`PyObject_GetAttr` instead." +msgstr "" +"当其调用 :meth:`~object.__getattr__` 和 :meth:`~object.__getattribute__` " +"方法时发生的异常将不会被传播,而是交给 :func:`sys.unraisablehook`。想要进行适当的错误处理,请改用 " +":c:func:`PyObject_HasAttrWithError`, :c:func:`PyObject_GetOptionalAttr` 或 " +":c:func:`PyObject_GetAttr`." + +#: ../../c-api/object.rst:122 +msgid "" +"This is the same as :c:func:`PyObject_HasAttr`, but *attr_name* is specified" +" as a :c:expr:`const char*` UTF-8 encoded bytes string, rather than a " +":c:expr:`PyObject*`." +msgstr "" +"这与 :c:func:`PyObject_HasAttr` 相同,但 *attr_name* 被指定为 :c:expr:`const char*` " +"UTF-8 编码的字节串,而不是 :c:expr:`PyObject*`。" + +#: ../../c-api/object.rst:128 +msgid "" +"Exceptions that occur when this calls :meth:`~object.__getattr__` and " +":meth:`~object.__getattribute__` methods or while creating the temporary " +":class:`str` object are silently ignored. For proper error handling, use " +":c:func:`PyObject_HasAttrStringWithError`, " +":c:func:`PyObject_GetOptionalAttrString` or :c:func:`PyObject_GetAttrString`" +" instead." +msgstr "" +"在其调用 :meth:`~object.__getattr__` 和 :meth:`~object.__getattribute__` 方法或创建临时 " +":class:`str` 对象期间发生的异常将被静默地忽略。想要进行适当的错误处理,请改用 " +":c:func:`PyObject_HasAttrStringWithError`, " +":c:func:`PyObject_GetOptionalAttrString` 或 :c:func:`PyObject_GetAttrString`。" + +#: ../../c-api/object.rst:138 +msgid "" +"Retrieve an attribute named *attr_name* from object *o*. Returns the " +"attribute value on success, or ``NULL`` on failure. This is the equivalent " +"of the Python expression ``o.attr_name``." +msgstr "" +"从对象 *o* 中读取名为 *attr_name* 的属性。成功返回属性值,失败则返回 ``NULL``。这相当于 Python 表达式 " +"``o.attr_name``." + +#: ../../c-api/object.rst:142 +msgid "" +"If the missing attribute should not be treated as a failure, you can use " +":c:func:`PyObject_GetOptionalAttr` instead." +msgstr "如果缺少属性不应被视为执行失败,你可以改用 :c:func:`PyObject_GetOptionalAttr`。" + +#: ../../c-api/object.rst:148 +msgid "" +"This is the same as :c:func:`PyObject_GetAttr`, but *attr_name* is specified" +" as a :c:expr:`const char*` UTF-8 encoded bytes string, rather than a " +":c:expr:`PyObject*`." +msgstr "" +"这与 :c:func:`PyObject_GetAttr` 相同,但 *attr_name* 被指定为 :c:expr:`const char*` " +"UTF-8 编码的字节串,而不是 :c:expr:`PyObject*`。" + +#: ../../c-api/object.rst:152 +msgid "" +"If the missing attribute should not be treated as a failure, you can use " +":c:func:`PyObject_GetOptionalAttrString` instead." +msgstr "如果缺少属性不应被视为执行失败,你可以改用 :c:func:`PyObject_GetOptionalAttrString`。" + +#: ../../c-api/object.rst:158 +msgid "" +"Variant of :c:func:`PyObject_GetAttr` which doesn't raise " +":exc:`AttributeError` if the attribute is not found." +msgstr ":c:func:`PyObject_GetAttr` 的变化形式,它在未找到属性时不会引发 :exc:`AttributeError`。" + +#: ../../c-api/object.rst:161 +msgid "" +"If the attribute is found, return ``1`` and set *\\*result* to a new " +":term:`strong reference` to the attribute. If the attribute is not found, " +"return ``0`` and set *\\*result* to ``NULL``; the :exc:`AttributeError` is " +"silenced. If an error other than :exc:`AttributeError` is raised, return " +"``-1`` and set *\\*result* to ``NULL``." +msgstr "" +"如果找到该属性,则返回 ``1`` 并将 *\\*result* 设为指向该属性的新 :term:`strong " +"reference`。如果未找到该属性,则返回 ``0`` 并将 *\\*result* 设为 " +"``NULL``;:exc:`AttributeError` 会被静默。如果引发了 :exc:`AttributeError` 以外的错误,则返回 " +"``-1`` 并将 *\\*result* 设为 ``NULL``。" + +#: ../../c-api/object.rst:173 +msgid "" +"This is the same as :c:func:`PyObject_GetOptionalAttr`, but *attr_name* is " +"specified as a :c:expr:`const char*` UTF-8 encoded bytes string, rather than" +" a :c:expr:`PyObject*`." +msgstr "" +"这与 :c:func:`PyObject_GetOptionalAttr` 相同,但 *attr_name* 被指定为 :c:expr:`const " +"char*` UTF-8 编码的字节串,而不是 :c:expr:`PyObject*`。" + +#: ../../c-api/object.rst:181 +msgid "" +"Generic attribute getter function that is meant to be put into a type " +"object's ``tp_getattro`` slot. It looks for a descriptor in the dictionary " +"of classes in the object's MRO as well as an attribute in the object's " +":attr:`~object.__dict__` (if present). As outlined in :ref:`descriptors`, " +"data descriptors take preference over instance attributes, while non-data " +"descriptors don't. Otherwise, an :exc:`AttributeError` is raised." +msgstr "" +"通用的属性获取函数,用于放入类型对象的 ``tp_getattro`` 槽中。它在类的字典中(位于对象的 MRO 中)查找某个描述符,并在对象的 " +":attr:`~object.__dict__` 中查找某个属性。正如 :ref:`descriptors` " +"所述,数据描述符优先于实例属性,而非数据描述符则不优先。失败则会触发 :exc:`AttributeError`。" + +#: ../../c-api/object.rst:191 +msgid "" +"Set the value of the attribute named *attr_name*, for object *o*, to the " +"value *v*. Raise an exception and return ``-1`` on failure; return ``0`` on " +"success. This is the equivalent of the Python statement ``o.attr_name = " +"v``." +msgstr "" +"将对象 *o* 中名为 *attr_name* 的属性值设为 *v* 。失败时引发异常并返回 ``-1``;成功时返回 ``0``。这相当于 " +"Python 语句 ``o.attr_name = v``。" + +#: ../../c-api/object.rst:196 +msgid "" +"If *v* is ``NULL``, the attribute is deleted. This behaviour is deprecated " +"in favour of using :c:func:`PyObject_DelAttr`, but there are currently no " +"plans to remove it." +msgstr "" +"如果 *v* 为 ``NULL``,该属性将被删除。此行为已被弃用而应改用 " +":c:func:`PyObject_DelAttr`,但目前还没有移除它的计划。" + +#: ../../c-api/object.rst:203 +msgid "" +"This is the same as :c:func:`PyObject_SetAttr`, but *attr_name* is specified" +" as a :c:expr:`const char*` UTF-8 encoded bytes string, rather than a " +":c:expr:`PyObject*`." +msgstr "" +"这与 :c:func:`PyObject_SetAttr` 相同,但 *attr_name* 被指定为 :c:expr:`const char*` " +"UTF-8 编码的字节串,而不是 :c:expr:`PyObject*`。" + +#: ../../c-api/object.rst:207 +msgid "" +"If *v* is ``NULL``, the attribute is deleted, but this feature is deprecated" +" in favour of using :c:func:`PyObject_DelAttrString`." +msgstr "" +"如果 *v* 为 ``NULL``,该属性将被删除,但是此功能已被弃用而应改用 :c:func:`PyObject_DelAttrString`。" + +#: ../../c-api/object.rst:210 +msgid "" +"The number of different attribute names passed to this function should be " +"kept small, usually by using a statically allocated string as *attr_name*. " +"For attribute names that aren't known at compile time, prefer calling " +":c:func:`PyUnicode_FromString` and :c:func:`PyObject_SetAttr` directly. For " +"more details, see :c:func:`PyUnicode_InternFromString`, which may be used " +"internally to create a key object." +msgstr "" +"传给该函数的不同属性名称应当保持在较少的数量,通常是通过使用静态分配的字符串作为 *attr_name* " +"来做到这一点。对于编译时未知的属性名称,建议直接调用 :c:func:`PyUnicode_FromString` 和 " +":c:func:`PyObject_SetAttr`。更多相关细节,请参阅 " +":c:func:`PyUnicode_InternFromString`,它可在内部用于创建键对象。" + +#: ../../c-api/object.rst:220 +msgid "" +"Generic attribute setter and deleter function that is meant to be put into a" +" type object's :c:member:`~PyTypeObject.tp_setattro` slot. It looks for a " +"data descriptor in the dictionary of classes in the object's MRO, and if " +"found it takes preference over setting or deleting the attribute in the " +"instance dictionary. Otherwise, the attribute is set or deleted in the " +"object's :attr:`~object.__dict__` (if present). On success, ``0`` is " +"returned, otherwise an :exc:`AttributeError` is raised and ``-1`` is " +"returned." +msgstr "" +"通用的属性设置和删除函数,用于放入类型对象的 :c:member:`~PyTypeObject.tp_setattro` 槽。它在类的字典中(位于对象的" +" MRO 中)查找数据描述器,如果找到,则将比在实例字典中设置或删除属性优先执行。否则,该属性将在对象的 " +":attr:`~object.__dict__` 中设置或删除。如果成功将返回 ``0``,否则将引发 :exc:`AttributeError` " +"并返回 ``-1``。" + +#: ../../c-api/object.rst:232 +msgid "" +"Delete attribute named *attr_name*, for object *o*. Returns ``-1`` on " +"failure. This is the equivalent of the Python statement ``del o.attr_name``." +msgstr "" +"删除对象 *o* 中名为 *attr_name* 的属性。失败时返回 ``-1``。这相当于 Python 语句 ``del " +"o.attr_name``." + +#: ../../c-api/object.rst:238 +msgid "" +"This is the same as :c:func:`PyObject_DelAttr`, but *attr_name* is specified" +" as a :c:expr:`const char*` UTF-8 encoded bytes string, rather than a " +":c:expr:`PyObject*`." +msgstr "" +"这与 :c:func:`PyObject_DelAttr` 相同,但 *attr_name* 被指定为 :c:expr:`const char*` " +"UTF-8 编码的字节串,而不是 :c:expr:`PyObject*`。" + +#: ../../c-api/object.rst:242 +msgid "" +"The number of different attribute names passed to this function should be " +"kept small, usually by using a statically allocated string as *attr_name*. " +"For attribute names that aren't known at compile time, prefer calling " +":c:func:`PyUnicode_FromString` and :c:func:`PyObject_DelAttr` directly. For " +"more details, see :c:func:`PyUnicode_InternFromString`, which may be used " +"internally to create a key object for lookup." +msgstr "" +"传给该函数的不同属性名称应当保持在较少的数量,通常是通过使用静态分配的字符串作为 *attr_name* " +"来做到这一点。对于编译时未知的属性名称,建议直接调用 :c:func:`PyUnicode_FromString` 和 " +":c:func:`PyObject_DelAttr`。更多相关细节,请参阅 " +":c:func:`PyUnicode_InternFromString`,它可在内部用于创建供查找的键对象。" + +#: ../../c-api/object.rst:253 +msgid "" +"A generic implementation for the getter of a ``__dict__`` descriptor. It " +"creates the dictionary if necessary." +msgstr "``__dict__`` 描述符的获取函数的一种通用实现。必要时会创建该字典。" + +#: ../../c-api/object.rst:256 +msgid "" +"This function may also be called to get the :py:attr:`~object.__dict__` of " +"the object *o*. Pass ``NULL`` for *context* when calling it. Since this " +"function may need to allocate memory for the dictionary, it may be more " +"efficient to call :c:func:`PyObject_GetAttr` when accessing an attribute on " +"the object." +msgstr "" +"此函数还可能会被调用以获取对象 *o* 的 :py:attr:`~object.__dict__`。当调用它时可传入 ``NULL`` 作为 " +"*context*。由于此函数可能需要为字典分配内存,所以在访问对象上的属性时调用 :c:func:`PyObject_GetAttr` " +"可能会更为高效。" + +#: ../../c-api/object.rst:262 +msgid "On failure, returns ``NULL`` with an exception set." +msgstr "当失败时,将返回 ``NULL`` 并设置一个异常。" + +#: ../../c-api/object.rst:269 +msgid "" +"A generic implementation for the setter of a ``__dict__`` descriptor. This " +"implementation does not allow the dictionary to be deleted." +msgstr "``__dict__`` 描述符设置函数的一种通用实现。这里不允许删除该字典。" + +#: ../../c-api/object.rst:277 +msgid "" +"Return a pointer to :py:attr:`~object.__dict__` of the object *obj*. If " +"there is no ``__dict__``, return ``NULL`` without setting an exception." +msgstr "" +"返回一个指向对象 *obj* 的 :py:attr:`~object.__dict__` 的指针。如果不存在 ``__dict__``,则返回 " +"``NULL`` 并且不设置异常。" + +#: ../../c-api/object.rst:280 +msgid "" +"This function may need to allocate memory for the dictionary, so it may be " +"more efficient to call :c:func:`PyObject_GetAttr` when accessing an " +"attribute on the object." +msgstr "此函数可能需要为字典分配内存,所以在访问对象上的属性时调用 :c:func:`PyObject_GetAttr` 可能会更为高效。" + +#: ../../c-api/object.rst:287 +msgid "" +"Compare the values of *o1* and *o2* using the operation specified by *opid*," +" which must be one of :c:macro:`Py_LT`, :c:macro:`Py_LE`, :c:macro:`Py_EQ`, " +":c:macro:`Py_NE`, :c:macro:`Py_GT`, or :c:macro:`Py_GE`, corresponding to " +"``<``, ``<=``, ``==``, ``!=``, ``>``, or ``>=`` respectively. This is the " +"equivalent of the Python expression ``o1 op o2``, where ``op`` is the " +"operator corresponding to *opid*. Returns the value of the comparison on " +"success, or ``NULL`` on failure." +msgstr "" +"使用由 *opid* 指定的操作来比较 *o1* 和 *o2* 的值,操作必须为 :c:macro:`Py_LT`, :c:macro:`Py_LE`," +" :c:macro:`Py_EQ`, :c:macro:`Py_NE`, :c:macro:`Py_GT` 或 :c:macro:`Py_GE` " +"中的一个,分别对应于 ``<``, ``<=``, ``==``, ``!=``, ``>`` 或 ``>=``。这等价于 Python 表达式 " +"``o1 op o2``,其中 ``op`` 是与 *opid* 对应的运算符。成功时返回比较结果值,失败时返回 ``NULL``。" + +#: ../../c-api/object.rst:297 +msgid "" +"Compare the values of *o1* and *o2* using the operation specified by *opid*," +" like :c:func:`PyObject_RichCompare`, but returns ``-1`` on error, ``0`` if " +"the result is false, ``1`` otherwise." +msgstr "" +"与 :c:func:`PyObject_RichCompare` 类似,使用 *opid* 所指定的操作来比较 *o1* 和 *o2* " +"的值,但在出错时返回 ``-1``,在结果为假值时返回 ``0``,在其他情况下返回 ``1``。" + +#: ../../c-api/object.rst:302 +msgid "" +"If *o1* and *o2* are the same object, :c:func:`PyObject_RichCompareBool` " +"will always return ``1`` for :c:macro:`Py_EQ` and ``0`` for " +":c:macro:`Py_NE`." +msgstr "" +"如果 *o1* 和 *o2* 是同一个对象,:c:func:`PyObject_RichCompareBool` 将总是为 " +":c:macro:`Py_EQ` 返回 ``1`` 并为 :c:macro:`Py_NE` 返回 ``0``。" + +#: ../../c-api/object.rst:307 +msgid "" +"Format *obj* using *format_spec*. This is equivalent to the Python " +"expression ``format(obj, format_spec)``." +msgstr "" +"使用 *format_spec* 格式化 *obj*。这等价于 Python 表达式 ``format(obj, format_spec)``。" + +#: ../../c-api/object.rst:310 +msgid "" +"*format_spec* may be ``NULL``. In this case the call is equivalent to " +"``format(obj)``. Returns the formatted string on success, ``NULL`` on " +"failure." +msgstr "" +"*format_spec* 可以为 ``NULL``。在此情况下调用将等价于 ``format(obj)``。成功时返回已格式化的字符串,失败时返回 " +"``NULL``." + +#: ../../c-api/object.rst:318 +msgid "" +"Compute a string representation of object *o*. Returns the string " +"representation on success, ``NULL`` on failure. This is the equivalent of " +"the Python expression ``repr(o)``. Called by the :func:`repr` built-in " +"function." +msgstr "" +"计算对象 *o* 的字符串形式。成功时返回字符串,失败时返回 ``NULL``。这相当于 Python 表达式 ``repr(o)``。由内置函数 " +":func:`repr` 调用。" + +#: ../../c-api/object.rst:322 ../../c-api/object.rst:338 +#: ../../c-api/object.rst:350 +msgid "If argument is ``NULL``, return the string ``''``." +msgstr "如果参数为 ``NULL``,则返回字符串 ``''``。" + +#: ../../c-api/object.rst:324 ../../c-api/object.rst:352 +msgid "" +"This function now includes a debug assertion to help ensure that it does not" +" silently discard an active exception." +msgstr "该函数现在包含一个调试断言,用以确保不会静默地丢弃活动的异常。" + +#: ../../c-api/object.rst:332 +msgid "" +"As :c:func:`PyObject_Repr`, compute a string representation of object *o*, " +"but escape the non-ASCII characters in the string returned by " +":c:func:`PyObject_Repr` with ``\\x``, ``\\u`` or ``\\U`` escapes. This " +"generates a string similar to that returned by :c:func:`PyObject_Repr` in " +"Python 2. Called by the :func:`ascii` built-in function." +msgstr "" +"与 :c:func:`PyObject_Repr` 一样,计算对象 *o* 的字符串形式,但在 :c:func:`PyObject_Repr` " +"返回的字符串中用 ``\\x``、``\\u`` 或 ``\\U`` 转义非 ASCII 字符。这将生成一个类似于 Python 2 中由 " +":c:func:`PyObject_Repr` 返回的字符串。由内置函数 :func:`ascii` 调用。" + +#: ../../c-api/object.rst:345 +msgid "" +"Compute a string representation of object *o*. Returns the string " +"representation on success, ``NULL`` on failure. This is the equivalent of " +"the Python expression ``str(o)``. Called by the :func:`str` built-in " +"function and, therefore, by the :func:`print` function." +msgstr "" +"计算对象 *o* 的字符串形式。成功时返回字符串,失败时返回 ``NULL``。这相当于 Python 表达式 ``str(o)``。由内置函数 " +":func:`str` 调用,因此也由 :func:`print` 函数调用。" + +#: ../../c-api/object.rst:361 +msgid "" +"Compute a bytes representation of object *o*. ``NULL`` is returned on " +"failure and a bytes object on success. This is equivalent to the Python " +"expression ``bytes(o)``, when *o* is not an integer. Unlike ``bytes(o)``, a" +" TypeError is raised when *o* is an integer instead of a zero-initialized " +"bytes object." +msgstr "" +"计算对象 *o* 的字节形式。失败时返回 ``NULL``,成功时返回一个字节串对象。当 *o* 不是整数时,这相当于 Python 表达式 " +"``bytes(o)``。与 ``bytes(o)`` 不同的是,当 *o* 为整数时会引发 TypeError,而不是返回一个初始为零的字节串对象。" + +#: ../../c-api/object.rst:367 +msgid "" +"If argument is ``NULL``, return the :class:`bytes` object ``b''``." +msgstr "如果参数为 ``NULL``,则返回 :class:`bytes` 对象 ``b''``。" + +#: ../../c-api/object.rst:372 +msgid "" +"Return ``1`` if the class *derived* is identical to or derived from the " +"class *cls*, otherwise return ``0``. In case of an error, return ``-1``." +msgstr "如果 *derived* 类与 *cls* 类相同或为其派生类,则返回 ``1``,否则返回 ``0``。如果出错则返回 ``-1``。" + +#: ../../c-api/object.rst:375 ../../c-api/object.rst:394 +msgid "" +"If *cls* is a tuple, the check will be done against every entry in *cls*. " +"The result will be ``1`` when at least one of the checks returns ``1``, " +"otherwise it will be ``0``." +msgstr "" +"如果 *cls* 是元组,则会对 *cls* 进行逐项检测。如果至少有一次检测返回 ``1``,结果将为 ``1``,否则将是 ``0``。" + +#: ../../c-api/object.rst:379 +msgid "" +"If *cls* has a :meth:`~type.__subclasscheck__` method, it will be called to " +"determine the subclass status as described in :pep:`3119`. Otherwise, " +"*derived* is a subclass of *cls* if it is a direct or indirect subclass, " +"i.e. contained in :attr:`cls.__mro__ `." +msgstr "" +"如果 *cls* 具有 :meth:`~type.__subclasscheck__` 方法,它将被调用以确定 :pep:`3119` " +"所描述的子类状态。在其他情况下,如果 *derived* 是一个直接或间接子类即包含在 :attr:`cls.__mro__ " +"` 中则它就是 *cls* 的子类。" + +#: ../../c-api/object.rst:384 +msgid "" +"Normally only class objects, i.e. instances of :class:`type` or a derived " +"class, are considered classes. However, objects can override this by having" +" a :attr:`~type.__bases__` attribute (which must be a tuple of base " +"classes)." +msgstr "" +"通常只有类对象,即 :class:`type` 或其派生类的实例才会被视为类。但是,对象可以通过设置 :attr:`~type.__bases__` " +"属性(它必须是由基类组成的元组)来覆盖此定义。" + +#: ../../c-api/object.rst:391 +msgid "" +"Return ``1`` if *inst* is an instance of the class *cls* or a subclass of " +"*cls*, or ``0`` if not. On error, returns ``-1`` and sets an exception." +msgstr "" +"如果 *inst* 是 *cls* 类或其子类的实例,则返回 ``1``,如果不是则返回 ``0``。如果出错则返回 ``-1`` 并设置一个异常。" + +#: ../../c-api/object.rst:398 +msgid "" +"If *cls* has a :meth:`~type.__instancecheck__` method, it will be called to " +"determine the subclass status as described in :pep:`3119`. Otherwise, " +"*inst* is an instance of *cls* if its class is a subclass of *cls*." +msgstr "" +"如果 *cls* 具有 :meth:`~type.__instancecheck__` 方法,它将被调用以确定 :pep:`3119` " +"所描述的子类状态。在其他情况下,如果 *inst* 的类是 *cls* 的子类则它就是 *cls* 的实例。" + +#: ../../c-api/object.rst:402 +msgid "" +"An instance *inst* can override what is considered its class by having a " +":attr:`~object.__class__` attribute." +msgstr "实例 *inst* 可以通过设置 :attr:`~object.__class__` 属性来覆盖它是否会被视为类。" + +#: ../../c-api/object.rst:405 +msgid "" +"An object *cls* can override if it is considered a class, and what its base " +"classes are, by having a :attr:`~type.__bases__` attribute (which must be a " +"tuple of base classes)." +msgstr "" +"对象 *cls* 可以通过设置 :attr:`~type.__bases__` 属性(它必须是由基类组成的元组)来覆盖它是否会被视为类,及其有哪些基类。" + +#: ../../c-api/object.rst:414 +msgid "" +"Compute and return the hash value of an object *o*. On failure, return " +"``-1``. This is the equivalent of the Python expression ``hash(o)``." +msgstr "计算并返回对象 *o* 的哈希值。失败时返回 ``-1``。这相当于 Python 表达式 ``hash(o)``。" + +#: ../../c-api/object.rst:417 +msgid "" +"The return type is now Py_hash_t. This is a signed integer the same size as" +" :c:type:`Py_ssize_t`." +msgstr "现在的返回类型是 Py_hash_t。这是一个大小与 :c:type:`Py_ssize_t` 相同的有符号整数。" + +#: ../../c-api/object.rst:424 +msgid "" +"Set a :exc:`TypeError` indicating that ``type(o)`` is not :term:`hashable` " +"and return ``-1``. This function receives special treatment when stored in a" +" ``tp_hash`` slot, allowing a type to explicitly indicate to the interpreter" +" that it is not hashable." +msgstr "" +"设置一个 :exc:`TypeError` 来指明 ``type(o)`` 不是 :term:`hashable` 并返回 ``-1``。此函数在存储于" +" ``tp_hash`` 槽位内时会获得特别对待,允许某个类型显式地向解释器指明它是不可哈希对象。" + +#: ../../c-api/object.rst:432 +msgid "" +"Returns ``1`` if the object *o* is considered to be true, and ``0`` " +"otherwise. This is equivalent to the Python expression ``not not o``. On " +"failure, return ``-1``." +msgstr "" +"如果对象 *o* 被认为是 true,则返回 ``1``,否则返回 ``0``。这相当于 Python 表达式 ``not not o``。失败则返回 " +"``-1``。" + +#: ../../c-api/object.rst:439 +msgid "" +"Returns ``0`` if the object *o* is considered to be true, and ``1`` " +"otherwise. This is equivalent to the Python expression ``not o``. On " +"failure, return ``-1``." +msgstr "" +"如果对象 *o* 被认为是 true,则返回 ``0``,否则返回 ``1``。这相当于 Python 表达式 ``not o``。失败则返回 " +"``-1``。" + +#: ../../c-api/object.rst:448 +msgid "" +"When *o* is non-``NULL``, returns a type object corresponding to the object " +"type of object *o*. On failure, raises :exc:`SystemError` and returns " +"``NULL``. This is equivalent to the Python expression ``type(o)``. This " +"function creates a new :term:`strong reference` to the return value. There's" +" really no reason to use this function instead of the :c:func:`Py_TYPE()` " +"function, which returns a pointer of type :c:expr:`PyTypeObject*`, except " +"when a new :term:`strong reference` is needed." +msgstr "" +"当 *o* 不为 ``NULL`` 时,返回一个与对象 *o* 的类型相对应的类型对象。当失败时,将引发 :exc:`SystemError` 并返回 " +"``NULL``。这等同于 Python 表达式 ``type(o)``。该函数会新建一个指向返回值的 :term:`strong " +"reference`。实际上没有多少理由使用此函数来替代 :c:func:`Py_TYPE()` 函数,后者将返回一个 " +":c:expr:`PyTypeObject*` 类型的指针,除非是需要一个新的 :term:`strong reference`。" + +#: ../../c-api/object.rst:460 +msgid "" +"Return non-zero if the object *o* is of type *type* or a subtype of *type*, " +"and ``0`` otherwise. Both parameters must be non-``NULL``." +msgstr "如果对象 *o* 是 *type* 类型或其子类型,则返回非零,否则返回 ``0``。两个参数都必须非 ``NULL``。" + +#: ../../c-api/object.rst:469 +msgid "" +"Return the length of object *o*. If the object *o* provides either the " +"sequence and mapping protocols, the sequence length is returned. On error, " +"``-1`` is returned. This is the equivalent to the Python expression " +"``len(o)``." +msgstr "" +"返回对象 *o* 的长度。如果对象 *o* 支持序列和映射协议,则返回序列长度。出错时返回 ``-1``。这等同于 Python 表达式 " +"``len(o)``." + +#: ../../c-api/object.rst:476 +msgid "" +"Return an estimated length for the object *o*. First try to return its " +"actual length, then an estimate using :meth:`~object.__length_hint__`, and " +"finally return the default value. On error return ``-1``. This is the " +"equivalent to the Python expression ``operator.length_hint(o, " +"defaultvalue)``." +msgstr "" +"返回对象 *o* 的估计长度。首先尝试返回实际长度,然后用 :meth:`~object.__length_hint__` " +"进行估计,最后返回默认值。出错时返回 ``-1``。这等同于 Python 表达式 ``operator.length_hint(o, " +"defaultvalue)``." + +#: ../../c-api/object.rst:486 +msgid "" +"Return element of *o* corresponding to the object *key* or ``NULL`` on " +"failure. This is the equivalent of the Python expression ``o[key]``." +msgstr "返回对象 *key* 对应的 *o* 元素,或在失败时返回 ``NULL``。这等同于 Python 表达式 ``o[key]``。" + +#: ../../c-api/object.rst:492 +msgid "" +"Map the object *key* to the value *v*. Raise an exception and return ``-1``" +" on failure; return ``0`` on success. This is the equivalent of the Python " +"statement ``o[key] = v``. This function *does not* steal a reference to " +"*v*." +msgstr "" +"将对象 *key* 映射到值 *v*。失败时引发异常并返回 ``-1``;成功时返回 ``0``。这相当于 Python 语句 ``o[key] = " +"v``。该函数 *不会* 偷取 *v* 的引用计数。" + +#: ../../c-api/object.rst:500 +msgid "" +"Remove the mapping for the object *key* from the object *o*. Return ``-1`` " +"on failure. This is equivalent to the Python statement ``del o[key]``." +msgstr "从对象 *o* 中移除对象 *key* 的映射。失败时返回 ``-1``。这相当于 Python 语句 ``del o[key]``。" + +#: ../../c-api/object.rst:506 +msgid "" +"This is the same as :c:func:`PyObject_DelItem`, but *key* is specified as a " +":c:expr:`const char*` UTF-8 encoded bytes string, rather than a " +":c:expr:`PyObject*`." +msgstr "" +"这与 :c:func:`PyObject_DelItem` 相同,但 *key* 被指定为 :c:expr:`const char*` UTF-8 " +"编码的字节串,而不是 :c:expr:`PyObject*`。" + +#: ../../c-api/object.rst:513 +msgid "" +"This is equivalent to the Python expression ``dir(o)``, returning a " +"(possibly empty) list of strings appropriate for the object argument, or " +"``NULL`` if there was an error. If the argument is ``NULL``, this is like " +"the Python ``dir()``, returning the names of the current locals; in this " +"case, if no execution frame is active then ``NULL`` is returned but " +":c:func:`PyErr_Occurred` will return false." +msgstr "" +"相当于 Python 表达式 ``dir(o)``,返回一个(可能为空)适合对象参数的字符串列表,如果出错则返回 ``NULL``。如果参数为 " +"``NULL``,类似 Python 的 ``dir()``,则返回当前 locals 的名字;这时如果没有活动的执行框架,则返回 ``NULL``,但" +" :c:func:`PyErr_Occurred` 将返回 false。" + +#: ../../c-api/object.rst:522 +msgid "" +"This is equivalent to the Python expression ``iter(o)``. It returns a new " +"iterator for the object argument, or the object itself if the object is " +"already an iterator. Raises :exc:`TypeError` and returns ``NULL`` if the " +"object cannot be iterated." +msgstr "" +"等同于 Python 表达式 " +"``iter(o)``。为对象参数返回一个新的迭代器,如果该对象已经是一个迭代器,则返回对象本身。如果对象不能被迭代,会引发 " +":exc:`TypeError`,并返回 ``NULL``。" + +#: ../../c-api/object.rst:530 +msgid "" +"This is equivalent to the Python ``__iter__(self): return self`` method. It " +"is intended for :term:`iterator` types, to be used in the " +":c:member:`PyTypeObject.tp_iter` slot." +msgstr "" +"这等价于 Python ``__iter__(self): return self`` 方法。它是针对 :term:`iterator` " +"类型设计的,将在 :c:member:`PyTypeObject.tp_iter` 槽位中使用。" + +#: ../../c-api/object.rst:536 +msgid "" +"This is the equivalent to the Python expression ``aiter(o)``. Takes an " +":class:`AsyncIterable` object and returns an :class:`AsyncIterator` for it. " +"This is typically a new iterator but if the argument is an " +":class:`AsyncIterator`, this returns itself. Raises :exc:`TypeError` and " +"returns ``NULL`` if the object cannot be iterated." +msgstr "" +"等同于 Python 表达式 ``aiter(o)``。接受一个 :class:`AsyncIterable` 对象,并为其返回一个 " +":class:`AsyncIterator`。通常返回的是一个新迭代器,但如果参数是一个 " +":class:`AsyncIterator`,将返回其自身。如果该对象不能被迭代,会引发 :exc:`TypeError`,并返回 ``NULL``。" + +#: ../../c-api/object.rst:546 +msgid "Get a pointer to subclass-specific data reserved for *cls*." +msgstr "获取一个指向为 *cls* 保留的子类专属数据的指针。" + +#: ../../c-api/object.rst:548 +msgid "" +"The object *o* must be an instance of *cls*, and *cls* must have been " +"created using negative :c:member:`PyType_Spec.basicsize`. Python does not " +"check this." +msgstr "" +"对象 *o* 必须为 *cls* 的实例,而 *cls* 必须使用负的 :c:member:`PyType_Spec.basicsize` " +"来创建。Python 不会检查这一点。" + +#: ../../c-api/object.rst:552 +msgid "On error, set an exception and return ``NULL``." +msgstr "发生错误时,将设置异常并返回 ``NULL``。" + +#: ../../c-api/object.rst:558 +msgid "" +"Return the size of the instance memory space reserved for *cls*, i.e. the " +"size of the memory :c:func:`PyObject_GetTypeData` returns." +msgstr "返回为 *cls* 保留的实例内存空间大小,即 :c:func:`PyObject_GetTypeData` 所返回的内存大小。" + +#: ../../c-api/object.rst:561 +msgid "" +"This may be larger than requested using :c:member:`-PyType_Spec.basicsize " +"`; it is safe to use this larger size (e.g. with " +":c:func:`!memset`)." +msgstr "" +"这可能会大于使用 :c:member:`-PyType_Spec.basicsize ` " +"请求到的大小;可以安全地使用这个更大的值 (例如通过 :c:func:`!memset`)。" + +#: ../../c-api/object.rst:564 +msgid "" +"The type *cls* **must** have been created using negative " +":c:member:`PyType_Spec.basicsize`. Python does not check this." +msgstr "" +"类型 *cls* **必须** 使用负的 :c:member:`PyType_Spec.basicsize` 来创建。Python 不会检查这一点。" + +#: ../../c-api/object.rst:568 +msgid "On error, set an exception and return a negative value." +msgstr "当失败时,将设置异常并返回一个负值。" + +#: ../../c-api/object.rst:574 +msgid "" +"Get a pointer to per-item data for a class with " +":c:macro:`Py_TPFLAGS_ITEMS_AT_END`." +msgstr "使用 :c:macro:`Py_TPFLAGS_ITEMS_AT_END` 获取一个指向类的单独条目数据的指针。" + +#: ../../c-api/object.rst:577 +msgid "" +"On error, set an exception and return ``NULL``. :py:exc:`TypeError` is " +"raised if *o* does not have :c:macro:`Py_TPFLAGS_ITEMS_AT_END` set." +msgstr "" +"出错时,将设置异常并返回 ``NULL``。如果 *o* 没有设置 :c:macro:`Py_TPFLAGS_ITEMS_AT_END` 则会引发 " +":py:exc:`TypeError`." + +#: ../../c-api/object.rst:585 +msgid "Visit the managed dictionary of *obj*." +msgstr "访问被管理的 *obj* 的字典。" + +#: ../../c-api/object.rst:587 +msgid "" +"This function must only be called in a traverse function of the type which " +"has the :c:macro:`Py_TPFLAGS_MANAGED_DICT` flag set." +msgstr "此函数必须只在设置了 :c:macro:`Py_TPFLAGS_MANAGED_DICT` 旗标的类型的遍历函数中被调用。" + +#: ../../c-api/object.rst:594 +msgid "Clear the managed dictionary of *obj*." +msgstr "清空被管理的 *obj* 的字典。" + +#: ../../c-api/object.rst:596 +msgid "" +"This function must only be called in a clear function of the type which has " +"the :c:macro:`Py_TPFLAGS_MANAGED_DICT` flag set." +msgstr "此函数必须只在设置了 :c:macro:`Py_TPFLAGS_MANAGED_DICT` 旗标的类型的清理函数中被调用。" + +#: ../../c-api/object.rst:603 +msgid "" +"Enable `deferred reference counting " +"`_ on *obj*, " +"if supported by the runtime. In the :term:`free-threaded ` " +"build, this allows the interpreter to avoid reference count adjustments to " +"*obj*, which may improve multi-threaded performance. The tradeoff is that " +"*obj* will only be deallocated by the tracing garbage collector, and not " +"when the interpreter no longer has any references to it." +msgstr "" +"在 *obj* 上启用 `推迟引用计数 `_,如果运行时支持的话。在 :term:`自由线程 ` 构建版中,这将允许解释器避免对 *obj* " +"的引用计数调整,这可以提升多线程性能。其权衡之处在于,*obj* " +"对象仅会在追踪式垃圾回收器运行时被释放,而不会在解释器不再持有该对象的任何引用时立即释放。" + +#: ../../c-api/object.rst:610 +msgid "" +"This function returns ``1`` if deferred reference counting is enabled on " +"*obj*, and ``0`` if deferred reference counting is not supported or if the " +"hint was ignored by the interpreter, such as when deferred reference " +"counting is already enabled on *obj*. This function is thread-safe, and " +"cannot fail." +msgstr "" +"如果 *obj* 上启用了延迟引用计数,此函数返回 ``1``;若延迟引用计数不被支持,或解释器忽略了该提示(例如 *obj* " +"上已启用延迟引用计数),则返回 ``0``。该函数是线程安全的,且不会执行失败。" + +#: ../../c-api/object.rst:615 +msgid "" +"This function does nothing on builds with the :term:`GIL` enabled, which do " +"not support deferred reference counting. This also does nothing if *obj* is " +"not an object tracked by the garbage collector (see :func:`gc.is_tracked` " +"and :c:func:`PyObject_GC_IsTracked`)." +msgstr "" +"此函数在启用了 :term:`GIL` 的构建版上将不做任何事,因为该版本不支持推迟引用计数。如果 *obj* 未被垃圾回收器追踪则此函数也不会做任何事" +" (参见 :func:`gc.is_tracked` 和 :c:func:`PyObject_GC_IsTracked`)。" + +#: ../../c-api/object.rst:620 +msgid "" +"This function is intended to be used soon after *obj* is created, by the " +"code that creates it, such as in the object's " +":c:member:`~PyTypeObject.tp_new` slot." +msgstr "" +"此函数应当在 *obj* 被创建之后立即供创建它的代码使用,就如在对象 :c:member:`~PyTypeObject.tp_new` 的槽位中那样。" + +#: ../../c-api/object.rst:628 +msgid "" +"Check if *obj* is a unique temporary object. Returns ``1`` if *obj* is known" +" to be a unique temporary object, and ``0`` otherwise. This function cannot" +" fail, but the check is conservative, and may return ``0`` in some cases " +"even if *obj* is a unique temporary object." +msgstr "" +"检测 *obj* 是否是一个单独临时对象。如果确定 *obj* 是一个单独临时对象则返回 ``1``,否则返回 " +"``0``。此函数一定不会执行失败,但该检测是偏保守的,在某些情况下即使 *obj* 是一个单独临时对象也可能返回 ``0``。" + +#: ../../c-api/object.rst:634 +msgid "" +"If an object is a unique temporary, it is guaranteed that the current code " +"has the only reference to the object. For arguments to C functions, this " +"should be used instead of checking if the reference count is ``1``. Starting" +" with Python 3.14, the interpreter internally avoids some reference count " +"modifications when loading objects onto the operands stack by " +":term:`borrowing ` references when possible, which means" +" that a reference count of ``1`` by itself does not guarantee that a " +"function argument uniquely referenced." +msgstr "" +"如果一个对象是唯一的临时对象,则可以保证当前代码对该对象有唯一的引用。对于 C 函数的参数,应该这样做,而不是检查引用计数是否为 ``1``。从 " +"Python 3.14 开始,解释器在将对象加载到操作数堆栈时,通过在可能的情况下 :term:`借用 ` " +"引用,在内部避免了一些引用计数修改,这意味着引用计数 ``1`` 本身并不能保证函数参数被唯一引用。" + +#: ../../c-api/object.rst:643 +msgid "" +"In the example below, ``my_func`` is called with a unique temporary object " +"as its argument::" +msgstr "在下面的例子中,调用 ``my_func`` 时使用一个唯一的临时对象作为参数::" + +#: ../../c-api/object.rst:646 +msgid "my_func([1, 2, 3])" +msgstr "my_func([1, 2, 3])" + +#: ../../c-api/object.rst:648 +msgid "" +"In the example below, ``my_func`` is **not** called with a unique temporary " +"object as its argument, even if its refcount is ``1``::" +msgstr "在下面的例子中,调用 ``my_func`` 时 *不是* 使用一个唯一的临时对象作为参数,即使它的引用计数为 ``1``::" + +#: ../../c-api/object.rst:651 +msgid "" +"my_list = [1, 2, 3]\n" +"my_func(my_list)" +msgstr "" +"my_list = [1, 2, 3]\n" +"my_func(my_list)" + +#: ../../c-api/object.rst:654 +msgid "See also the function :c:func:`Py_REFCNT`." +msgstr "另请参阅 :c:func:`Py_REFCNT` 函数。" + +#: ../../c-api/object.rst:660 +msgid "" +"This function returns non-zero if *obj* is :term:`immortal`, and zero " +"otherwise. This function cannot fail." +msgstr "如果 *obj* 是 :term:`immortal`,这个函数返回非零,否则返回零。这个函数不会失败。" + +#: ../../c-api/object.rst:665 +msgid "" +"Objects that are immortal in one CPython version are not guaranteed to be " +"immortal in another." +msgstr "在一个 CPython 版本中是不朽的对象不能保证在另一个 CPython 版本中还是不朽的。" + +#: ../../c-api/object.rst:672 +msgid "" +"Increments the reference count of *obj* if it is not zero. Returns ``1`` if" +" the object's reference count was successfully incremented. Otherwise, this " +"function returns ``0``." +msgstr "如果 *obj* 的引用计数不为零,则增加引用计数。如果对象的引用计数已成功递增,则返回 ``1``。否则,此函数返回 ``0``。" + +#: ../../c-api/object.rst:676 +msgid "" +":c:func:`PyUnstable_EnableTryIncRef` must have been called earlier on *obj* " +"or this function may spuriously return ``0`` in the :term:`free-threaded " +"build`." +msgstr "" +":c:func:`PyUnstable_EnableTryIncRef` 必须先前在 *obj* 上被调用否则此函数可能在 :term:`free-" +"threaded build` 中错误地返回 ``0``。" + +#: ../../c-api/object.rst:680 +msgid "" +"This function is logically equivalent to the following C code, except that " +"it behaves atomically in the :term:`free-threaded build`::" +msgstr "此函数在逻辑上相当于以下 C 代码,区别在于它在 :term:`free-threaded build` 中的行为是原子化的::" + +#: ../../c-api/object.rst:683 +msgid "" +"if (Py_REFCNT(op) > 0) {\n" +" Py_INCREF(op);\n" +" return 1;\n" +"}\n" +"return 0;" +msgstr "" +"if (Py_REFCNT(op) > 0) {\n" +" Py_INCREF(op);\n" +" return 1;\n" +"}\n" +"return 0;" + +#: ../../c-api/object.rst:689 +msgid "" +"This is intended as a building block for managing weak references without " +"the overhead of a Python :ref:`weak reference object `." +msgstr "这旨在作为一个构建块,用于管理弱引用,而不会产生 Python :ref:`弱引用对象 ` 的开销。" + +#: ../../c-api/object.rst:692 +msgid "" +"Typically, correct use of this function requires support from *obj*'s " +"deallocator (:c:member:`~PyTypeObject.tp_dealloc`). For example, the " +"following sketch could be adapted to implement a \"weakmap\" that works like" +" a :py:class:`~weakref.WeakValueDictionary` for a specific type:" +msgstr "" +"通常,正确使用此函数需要 *obj* 的释放器 (:c:member:`~PyTypeObject.tp_dealloc`) " +"的支持。例如,下面的草图可以用来实现一个“weakmap”,就像一个特定类型的 " +":py:class:`~weakref.WeakValueDictionary` 一样:" + +#: ../../c-api/object.rst:698 +msgid "" +"PyMutex mutex;\n" +"\n" +"PyObject *\n" +"add_entry(weakmap_key_type *key, PyObject *value)\n" +"{\n" +" PyUnstable_EnableTryIncRef(value);\n" +" weakmap_type weakmap = ...;\n" +" PyMutex_Lock(&mutex);\n" +" weakmap_add_entry(weakmap, key, value);\n" +" PyMutex_Unlock(&mutex);\n" +" Py_RETURN_NONE;\n" +"}\n" +"\n" +"PyObject *\n" +"get_value(weakmap_key_type *key)\n" +"{\n" +" weakmap_type weakmap = ...;\n" +" PyMutex_Lock(&mutex);\n" +" PyObject *result = weakmap_find(weakmap, key);\n" +" if (PyUnstable_TryIncRef(result)) {\n" +" // `result` is safe to use\n" +" PyMutex_Unlock(&mutex);\n" +" return result;\n" +" }\n" +" // if we get here, `result` is starting to be garbage-collected,\n" +" // but has not been removed from the weakmap yet\n" +" PyMutex_Unlock(&mutex);\n" +" return NULL;\n" +"}\n" +"\n" +"// tp_dealloc function for weakmap values\n" +"void\n" +"value_dealloc(PyObject *value)\n" +"{\n" +" weakmap_type weakmap = ...;\n" +" PyMutex_Lock(&mutex);\n" +" weakmap_remove_value(weakmap, value);\n" +"\n" +" ...\n" +" PyMutex_Unlock(&mutex);\n" +"}" +msgstr "" +"PyMutex mutex;\n" +"\n" +"PyObject *\n" +"add_entry(weakmap_key_type *key, PyObject *value)\n" +"{\n" +" PyUnstable_EnableTryIncRef(value);\n" +" weakmap_type weakmap = ...;\n" +" PyMutex_Lock(&mutex);\n" +" weakmap_add_entry(weakmap, key, value);\n" +" PyMutex_Unlock(&mutex);\n" +" Py_RETURN_NONE;\n" +"}\n" +"\n" +"PyObject *\n" +"get_value(weakmap_key_type *key)\n" +"{\n" +" weakmap_type weakmap = ...;\n" +" PyMutex_Lock(&mutex);\n" +" PyObject *result = weakmap_find(weakmap, key);\n" +" if (PyUnstable_TryIncRef(result)) {\n" +" // `result` 可以安全使用\n" +" PyMutex_Unlock(&mutex);\n" +" return result;\n" +" }\n" +" // 如果我们到这里,`result` 开始被垃圾回收,\n" +" // 但还没有从弱映射中移除\n" +" PyMutex_Unlock(&mutex);\n" +" return NULL;\n" +"}\n" +"\n" +"// weakmap 值的 tp_dealloc 函数\n" +"void\n" +"value_dealloc(PyObject *value)\n" +"{\n" +" weakmap_type weakmap = ...;\n" +" PyMutex_Lock(&mutex);\n" +" weakmap_remove_value(weakmap, value);\n" +"\n" +" ...\n" +" PyMutex_Unlock(&mutex);\n" +"}" + +#: ../../c-api/object.rst:746 +msgid "" +"Enables subsequent uses of :c:func:`PyUnstable_TryIncRef` on *obj*. The " +"caller must hold a :term:`strong reference` to *obj* when calling this." +msgstr "" +"允许在 *obj* 上后续使用 :c:func:`PyUnstable_TryIncRef`。调用者在调用时必须持有 *obj* 的 " +":term:`strong reference`." + +#: ../../c-api/object.rst:753 +msgid "Determine if *op* only has one reference." +msgstr "确定 *op* 是否只有一个引用。" + +#: ../../c-api/object.rst:755 +msgid "" +"On GIL-enabled builds, this function is equivalent to :c:expr:`Py_REFCNT(op)" +" == 1`." +msgstr "在启用 GIL 的构建中,此函数等价于 :c:expr:`Py_REFCNT(op) == 1`。" + +#: ../../c-api/object.rst:758 +msgid "" +"On a :term:`free-threaded build`, this checks if *op*'s :term:`reference " +"count` is equal to one and additionally checks if *op* is only used by this " +"thread. :c:expr:`Py_REFCNT(op) == 1` is **not** thread-safe on free-threaded" +" builds; prefer this function." +msgstr "" +"在 :term:`free-threaded build` 中,这将检查 *op* 的 :term:`reference count` " +"是否等于一同时额外检查 *op* 是否仅由该线程使用。 :c:expr:`Py_REFCNT(op) == 1` 在自由线程构建版中 **不是** " +"线程安全的;应当优先使用此函数。" + +#: ../../c-api/object.rst:763 +msgid "" +"The caller must hold an :term:`attached thread state`, despite the fact that" +" this function doesn't call into the Python interpreter. This function " +"cannot fail." +msgstr "" +"调用者必须持有一个 :term:`attached thread state`,尽管这个函数不调用 Python 解释器。这个函数不会失败。" + +#: ../../c-api/object.rst:316 ../../c-api/object.rst:330 +#: ../../c-api/object.rst:359 ../../c-api/object.rst:412 +#: ../../c-api/object.rst:446 ../../c-api/object.rst:467 +msgid "built-in function" +msgstr "内置函数" + +#: ../../c-api/object.rst:316 +msgid "repr" +msgstr "repr" + +#: ../../c-api/object.rst:330 +msgid "ascii" +msgstr "ascii" + +#: ../../c-api/object.rst:340 +msgid "string" +msgstr "string" + +#: ../../c-api/object.rst:340 +msgid "PyObject_Str (C function)" +msgstr "PyObject_Str (C 函数)" + +#: ../../c-api/object.rst:359 +msgid "bytes" +msgstr "字节串" + +#: ../../c-api/object.rst:412 +msgid "hash" +msgstr "hash" + +#: ../../c-api/object.rst:446 +msgid "type" +msgstr "type" + +#: ../../c-api/object.rst:467 +msgid "len" +msgstr "len" diff --git a/c-api/objimpl.po b/c-api/objimpl.po new file mode 100644 index 0000000000..7c7a5f1cb8 --- /dev/null +++ b/c-api/objimpl.po @@ -0,0 +1,32 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/objimpl.rst:7 +msgid "Object Implementation Support" +msgstr "对象实现支持" + +#: ../../c-api/objimpl.rst:9 +msgid "" +"This chapter describes the functions, types, and macros used when defining " +"new object types." +msgstr "本章描述了定义新对象类型时所使用的函数、类型和宏。" diff --git a/c-api/perfmaps.po b/c-api/perfmaps.po new file mode 100644 index 0000000000..98d82e2368 --- /dev/null +++ b/c-api/perfmaps.po @@ -0,0 +1,107 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:00+0000\n" +"Last-Translator: 99 , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/perfmaps.rst:6 +msgid "Support for Perf Maps" +msgstr "对 Perf Maps 的支持" + +#: ../../c-api/perfmaps.rst:8 +msgid "" +"On supported platforms (Linux and macOS), the runtime can take advantage of " +"*perf map files* to make Python functions visible to an external profiling " +"tool (such as `perf `_ or " +"`samply `_). A running process may " +"create a file in the ``/tmp`` directory, which contains entries that can map" +" a section of executable code to a name. This interface is described in the " +"`documentation of the Linux Perf tool `_." +msgstr "" + +#: ../../c-api/perfmaps.rst:17 +msgid "" +"In Python, these helper APIs can be used by libraries and features that rely" +" on generating machine code on the fly." +msgstr "在 Python 中,这些辅助 API 可供依赖于动态生成机器码的库和特性使用。" + +#: ../../c-api/perfmaps.rst:20 +msgid "" +"Note that holding an :term:`attached thread state` is not required for these" +" APIs." +msgstr "请注意这些 API 并不要求持有已附加的线程状态 :term:`attached thread state`。" + +#: ../../c-api/perfmaps.rst:24 +msgid "" +"Open the ``/tmp/perf-$pid.map`` file, unless it's already opened, and create" +" a lock to ensure thread-safe writes to the file (provided the writes are " +"done through :c:func:`PyUnstable_WritePerfMapEntry`). Normally, there's no " +"need to call this explicitly; just use " +":c:func:`PyUnstable_WritePerfMapEntry` and it will initialize the state on " +"first call." +msgstr "" +"打开 ``/tmp/perf-$pid.map`` 文件,除非它已经被打开,并创建一个锁来确保线程安全地写入该文件(如果写入是通过 " +":c:func:`PyUnstable_WritePerfMapEntry` 执行的)。通常,没有必要显式地调用此函数;只需使用 " +":c:func:`PyUnstable_WritePerfMapEntry`,它将在第一次调用时初始化状态。" + +#: ../../c-api/perfmaps.rst:30 +msgid "" +"Returns ``0`` on success, ``-1`` on failure to create/open the perf map " +"file, or ``-2`` on failure to create a lock. Check ``errno`` for more " +"information about the cause of a failure." +msgstr "" +"成功时返回 ``0``,创建/打开 perf map 文件失败时返回 ``-1``,或者创建锁失败时返回 ``-2``。可检查 ``errno`` " +"获取有关失败原因的更多信息。" + +#: ../../c-api/perfmaps.rst:36 +msgid "" +"Write one single entry to the ``/tmp/perf-$pid.map`` file. This function is " +"thread safe. Here is what an example entry looks like::" +msgstr "向 ``/tmp/perf-$pid.map`` 文件写入一个单独条目。此函数是线程安全的。下面显示了一个示例条目::" + +#: ../../c-api/perfmaps.rst:39 +msgid "" +"# address size name\n" +"7f3529fcf759 b py::bar:/run/t.py" +msgstr "" +"# 地址 大小 名称\n" +"7f3529fcf759 b py::bar:/run/t.py" + +#: ../../c-api/perfmaps.rst:42 +msgid "" +"Will call :c:func:`PyUnstable_PerfMapState_Init` before writing the entry, " +"if the perf map file is not already opened. Returns ``0`` on success, or the" +" same error codes as :c:func:`PyUnstable_PerfMapState_Init` on failure." +msgstr "" +"将在写入条目之前调用 :c:func:`PyUnstable_PerfMapState_Init`,如果 perf map 文件尚未打开。成功时返回 " +"``0``,或者在失败时返回与 :c:func:`PyUnstable_PerfMapState_Init` 相同的错误代码。" + +#: ../../c-api/perfmaps.rst:48 +msgid "" +"Close the perf map file opened by :c:func:`PyUnstable_PerfMapState_Init`. " +"This is called by the runtime itself during interpreter shut-down. In " +"general, there shouldn't be a reason to explicitly call this, except to " +"handle specific scenarios such as forking." +msgstr "" +"关闭 :c:func:`PyUnstable_PerfMapState_Init` 所打开的 perf map 文件。 " +"此函数会在解释器关闭期间由运行时本身调用。通常,应该没有理由显式地调用此函数,除了处理特殊场景例如分叉操作。" diff --git a/c-api/picklebuffer.po b/c-api/picklebuffer.po new file mode 100644 index 0000000000..968d5c9f9d --- /dev/null +++ b/c-api/picklebuffer.po @@ -0,0 +1,114 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/picklebuffer.rst:9 +msgid "Pickle buffer objects" +msgstr "PickleBuffer 对象" + +#: ../../c-api/picklebuffer.rst:13 +msgid "" +"A :class:`pickle.PickleBuffer` object wraps a :ref:`buffer-providing object " +"` for out-of-band data transfer with the :mod:`pickle` " +"module." +msgstr "" +":class:`pickle.PickleBuffer` 对象包装了一个 :ref:`提供缓冲区的对象 ` 用于配合 " +":mod:`pickle` 模块进行带外数据传输。" + +#: ../../c-api/picklebuffer.rst:19 +msgid "" +"This instance of :c:type:`PyTypeObject` represents the Python pickle buffer " +"type. This is the same object as :class:`pickle.PickleBuffer` in the Python " +"layer." +msgstr "" +"这个 :c:type:`PyTypeObject` 的实例表示 Python pickle 缓冲区类型。这与 Python 层级的 " +":class:`pickle.PickleBuffer` 是同一对象。" + +#: ../../c-api/picklebuffer.rst:25 +msgid "" +"Return true if *op* is a pickle buffer instance. This function always " +"succeeds." +msgstr "如果 *op* 是一个 pickle 缓冲区实例则返回真值。此函数总是会成功执行。" + +#: ../../c-api/picklebuffer.rst:31 +msgid "Create a pickle buffer from the object *obj*." +msgstr "基于 *obj* 创建一个 pickle 缓冲区。" + +#: ../../c-api/picklebuffer.rst:33 +msgid "" +"This function will fail if *obj* doesn't support the :ref:`buffer protocol " +"`." +msgstr "如果 *obj* 不支持 :ref:`缓冲区协议 ` 则此函数执行将失败。" + +#: ../../c-api/picklebuffer.rst:35 +msgid "" +"On success, return a new pickle buffer instance. On failure, set an " +"exception and return ``NULL``." +msgstr "成功时,返回一个新的 pickle 缓冲区实例。失败时,设置一个异常并返回 ``NULL``。" + +#: ../../c-api/picklebuffer.rst:38 +msgid "" +"Analogous to calling :class:`pickle.PickleBuffer` with *obj* in Python." +msgstr "等同于在 Python 中调用 :class:`pickle.PickleBuffer` 并传入 *obj*。" + +#: ../../c-api/picklebuffer.rst:43 +msgid "" +"Get a pointer to the underlying :c:type:`Py_buffer` that the pickle buffer " +"wraps." +msgstr "获取一个指向 pickle 缓冲区所包装的底层 :c:type:`Py_buffer` 的指针。" + +#: ../../c-api/picklebuffer.rst:45 +msgid "" +"The returned pointer is valid as long as *picklebuf* is alive and has not " +"been released. The caller must not modify or free the returned " +":c:type:`Py_buffer`. If the pickle buffer has been released, raise " +":exc:`ValueError`." +msgstr "" +"只要 *picklebuf* 保持存活而未被释放则返回的指针就将有效。调用方不可修改或释放返回的 :c:type:`Py_buffer`。如果 " +"pickle 缓冲区被释放,则会引发 :exc:`ValueError`。" + +#: ../../c-api/picklebuffer.rst:49 +msgid "" +"On success, return a pointer to the buffer view. On failure, set an " +"exception and return ``NULL``." +msgstr "成功时,返回一个指向缓冲区视图的指针。失败时,设置一个异常并返回 ``NULL``。" + +#: ../../c-api/picklebuffer.rst:55 +msgid "Release the underlying buffer held by the pickle buffer." +msgstr "释放由 PickleBuffer 占用的底层缓冲区。" + +#: ../../c-api/picklebuffer.rst:57 +msgid "" +"Return ``0`` on success. On failure, set an exception and return ``-1``." +msgstr "成功时返回 ``0``。失败时,设置一个异常并返回 ``-1``。" + +#: ../../c-api/picklebuffer.rst:59 +msgid "Analogous to calling :meth:`pickle.PickleBuffer.release` in Python." +msgstr "等同于在 Python 中调用 :meth:`pickle.PickleBuffer.release`。" + +#: ../../c-api/picklebuffer.rst:5 +msgid "object" +msgstr "object -- 对象" + +#: ../../c-api/picklebuffer.rst:5 +msgid "PickleBuffer" +msgstr "PickleBuffer" diff --git a/c-api/profiling.po b/c-api/profiling.po new file mode 100644 index 0000000000..7fb91e72c3 --- /dev/null +++ b/c-api/profiling.po @@ -0,0 +1,343 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/profiling.rst:6 +msgid "Profiling and tracing" +msgstr "" + +#: ../../c-api/profiling.rst:8 +msgid "" +"The Python interpreter provides some low-level support for attaching " +"profiling and execution tracing facilities. These are used for profiling, " +"debugging, and coverage analysis tools." +msgstr "Python 解释器为附加的性能分析和执行跟踪工具提供了一些低层级的支持。它们可被用于性能分析、调试和覆盖分析工具。" + +#: ../../c-api/profiling.rst:12 +msgid "" +"This C interface allows the profiling or tracing code to avoid the overhead " +"of calling through Python-level callable objects, making a direct C function" +" call instead. The essential attributes of the facility have not changed; " +"the interface allows trace functions to be installed per-thread, and the " +"basic events reported to the trace function are the same as had been " +"reported to the Python-level trace functions in previous versions." +msgstr "" +"这个 C 接口允许性能分析或跟踪代码避免调用 Python 层级的可调用对象带来的开销,它能直接执行 C 函数调用。 " +"此工具的基本属性没有变化;这个接口允许针对每个线程安装跟踪函数,并且向跟踪函数报告的基本事件与之前版本中向 Python 层级跟踪函数报告的事件相同。" + +#: ../../c-api/profiling.rst:22 +msgid "" +"The type of the trace function registered using :c:func:`PyEval_SetProfile` " +"and :c:func:`PyEval_SetTrace`. The first parameter is the object passed to " +"the registration function as *obj*, *frame* is the frame object to which the" +" event pertains, *what* is one of the constants :c:data:`PyTrace_CALL`, " +":c:data:`PyTrace_EXCEPTION`, :c:data:`PyTrace_LINE`, " +":c:data:`PyTrace_RETURN`, :c:data:`PyTrace_C_CALL`, " +":c:data:`PyTrace_C_EXCEPTION`, :c:data:`PyTrace_C_RETURN`, or " +":c:data:`PyTrace_OPCODE`, and *arg* depends on the value of *what*:" +msgstr "" +"使用 :c:func:`PyEval_SetProfile` 和 :c:func:`PyEval_SetTrace` 注册的跟踪函数的类型。 " +"第一个形参是作为 *obj* 传递给注册函数的对象,*frame* 是与事件相关的帧对象,*what* 是常量 " +":c:data:`PyTrace_CALL`, :c:data:`PyTrace_EXCEPTION`, :c:data:`PyTrace_LINE`," +" :c:data:`PyTrace_RETURN`, :c:data:`PyTrace_C_CALL`, " +":c:data:`PyTrace_C_EXCEPTION`, :c:data:`PyTrace_C_RETURN` 或 " +":c:data:`PyTrace_OPCODE` 中的一个,而 *arg* 将依赖于 *what* 的值:" + +#: ../../c-api/profiling.rst:31 +msgid "Value of *what*" +msgstr "*what* 的值" + +#: ../../c-api/profiling.rst:31 +msgid "Meaning of *arg*" +msgstr "*arg* 的含义" + +#: ../../c-api/profiling.rst:33 +msgid ":c:data:`PyTrace_CALL`" +msgstr ":c:data:`PyTrace_CALL`" + +#: ../../c-api/profiling.rst:33 ../../c-api/profiling.rst:38 +#: ../../c-api/profiling.rst:49 +msgid "Always :c:data:`Py_None`." +msgstr "总是 :c:data:`Py_None`." + +#: ../../c-api/profiling.rst:35 +msgid ":c:data:`PyTrace_EXCEPTION`" +msgstr ":c:data:`PyTrace_EXCEPTION`" + +#: ../../c-api/profiling.rst:35 +msgid "Exception information as returned by :func:`sys.exc_info`." +msgstr ":func:`sys.exc_info` 返回的异常信息。" + +#: ../../c-api/profiling.rst:38 +msgid ":c:data:`PyTrace_LINE`" +msgstr ":c:data:`PyTrace_LINE`" + +#: ../../c-api/profiling.rst:40 +msgid ":c:data:`PyTrace_RETURN`" +msgstr ":c:data:`PyTrace_RETURN`" + +#: ../../c-api/profiling.rst:40 +msgid "" +"Value being returned to the caller, or ``NULL`` if caused by an exception." +msgstr "返回给调用方的值,或者如果是由异常导致的则返回 ``NULL``。" + +#: ../../c-api/profiling.rst:43 +msgid ":c:data:`PyTrace_C_CALL`" +msgstr ":c:data:`PyTrace_C_CALL`" + +#: ../../c-api/profiling.rst:43 ../../c-api/profiling.rst:45 +#: ../../c-api/profiling.rst:47 +msgid "Function object being called." +msgstr "正在调用函数对象。" + +#: ../../c-api/profiling.rst:45 +msgid ":c:data:`PyTrace_C_EXCEPTION`" +msgstr ":c:data:`PyTrace_C_EXCEPTION`" + +#: ../../c-api/profiling.rst:47 +msgid ":c:data:`PyTrace_C_RETURN`" +msgstr ":c:data:`PyTrace_C_RETURN`" + +#: ../../c-api/profiling.rst:49 +msgid ":c:data:`PyTrace_OPCODE`" +msgstr ":c:data:`PyTrace_OPCODE`" + +#: ../../c-api/profiling.rst:54 +msgid "" +"The value of the *what* parameter to a :c:type:`Py_tracefunc` function when " +"a new call to a function or method is being reported, or a new entry into a " +"generator. Note that the creation of the iterator for a generator function " +"is not reported as there is no control transfer to the Python bytecode in " +"the corresponding frame." +msgstr "" +"当对一个函数或方法的新调用被报告,或是向一个生成器增加新条目时传给 :c:type:`Py_tracefunc` 函数的 *what* 形参的值。 " +"请注意针对生成器函数的迭代器的创建情况不会被报告因为在相应的帧中没有向 Python 字节码转移控制权。" + +#: ../../c-api/profiling.rst:63 +msgid "" +"The value of the *what* parameter to a :c:type:`Py_tracefunc` function when " +"an exception has been raised. The callback function is called with this " +"value for *what* when after any bytecode is processed after which the " +"exception becomes set within the frame being executed. The effect of this " +"is that as exception propagation causes the Python stack to unwind, the " +"callback is called upon return to each frame as the exception propagates. " +"Only trace functions receive these events; they are not needed by the " +"profiler." +msgstr "" + +#: ../../c-api/profiling.rst:74 +msgid "" +"The value passed as the *what* parameter to a :c:type:`Py_tracefunc` " +"function (but not a profiling function) when a line-number event is being " +"reported. It may be disabled for a frame by setting " +":attr:`~frame.f_trace_lines` to *0* on that frame." +msgstr "" +"当一个行编号事件被报告时传给 :c:type:`Py_tracefunc` 函数 (但不会传给性能分析函数) 的 *what* 形参的值。它可以通过将 " +":attr:`~frame.f_trace_lines` 设为 *0* 在某个帧中被禁用。" + +#: ../../c-api/profiling.rst:82 +msgid "" +"The value for the *what* parameter to :c:type:`Py_tracefunc` functions when " +"a call is about to return." +msgstr "当一个调用即将返回时传给 :c:type:`Py_tracefunc` 函数的 *what* 形参的值。" + +#: ../../c-api/profiling.rst:88 +msgid "" +"The value for the *what* parameter to :c:type:`Py_tracefunc` functions when " +"a C function is about to be called." +msgstr "当一个 C 函数即将被调用时传给 :c:type:`Py_tracefunc` 函数的 *what* 形参的值。" + +#: ../../c-api/profiling.rst:94 +msgid "" +"The value for the *what* parameter to :c:type:`Py_tracefunc` functions when " +"a C function has raised an exception." +msgstr "当一个 C 函数引发异常时传给 :c:type:`Py_tracefunc` 函数的 *what* 形参的值。" + +#: ../../c-api/profiling.rst:100 +msgid "" +"The value for the *what* parameter to :c:type:`Py_tracefunc` functions when " +"a C function has returned." +msgstr "当一个 C 函数返回时传给 :c:type:`Py_tracefunc` 函数的 *what* 形参的值。" + +#: ../../c-api/profiling.rst:106 +msgid "" +"The value for the *what* parameter to :c:type:`Py_tracefunc` functions (but " +"not profiling functions) when a new opcode is about to be executed. This " +"event is not emitted by default: it must be explicitly requested by setting " +":attr:`~frame.f_trace_opcodes` to *1* on the frame." +msgstr "" +"当一个新操作码即将被执行时传给 :c:type:`Py_tracefunc` 函数 (但不会传给性能分析函数) 的 *what* 形参的值。 " +"在默认情况下此事件不会被发送:它必须通过在某个帧上将 :attr:`~frame.f_trace_opcodes` 设为 *1* 来显式地请求。" + +#: ../../c-api/profiling.rst:114 +msgid "" +"Set the profiler function to *func*. The *obj* parameter is passed to the " +"function as its first parameter, and may be any Python object, or ``NULL``." +" If the profile function needs to maintain state, using a different value " +"for *obj* for each thread provides a convenient and thread-safe place to " +"store it. The profile function is called for all monitored events except " +":c:data:`PyTrace_LINE` :c:data:`PyTrace_OPCODE` and " +":c:data:`PyTrace_EXCEPTION`." +msgstr "" +"将性能分析器函数设为 *func*。 *obj* 形参将作为第一个形参传给该函数,它可以是任意 Python 对象或为 ``NULL``。 " +"如果性能分析函数需要维护状态,则为每个线程的 *obj* 使用不同的值将提供一个方便而线程安全的存储位置。这个性能分析函数将针对除 " +":c:data:`PyTrace_LINE` :c:data:`PyTrace_OPCODE` 和 " +":c:data:`PyTrace_EXCEPTION` 以外的所有被监控事件进行调用。" + +#: ../../c-api/profiling.rst:121 +msgid "See also the :func:`sys.setprofile` function." +msgstr "另请参阅 :func:`sys.setprofile` 函数。" + +#: ../../c-api/profiling.rst:123 ../../c-api/profiling.rst:131 +#: ../../c-api/profiling.rst:150 ../../c-api/profiling.rst:158 +msgid "The caller must have an :term:`attached thread state`." +msgstr "调用方必须有已附加的线程状态 :term:`attached thread state`。" + +#: ../../c-api/profiling.rst:128 +msgid "" +"Like :c:func:`PyEval_SetProfile` but sets the profile function in all " +"running threads belonging to the current interpreter instead of the setting " +"it only on the current thread." +msgstr "" +"类似于 :c:func:`PyEval_SetProfile` 但会在属于当前解释器的所有在运行线程中设置性能分析函数而不是仅在当前线程上设置。" + +#: ../../c-api/profiling.rst:133 +msgid "" +"As :c:func:`PyEval_SetProfile`, this function ignores any exceptions raised " +"while setting the profile functions in all threads." +msgstr "与 :c:func:`PyEval_SetProfile` 一样,该函数会忽略任何被引发的异常同时在所有线程中设置性能分析函数。" + +#: ../../c-api/profiling.rst:141 +msgid "" +"Set the tracing function to *func*. This is similar to " +":c:func:`PyEval_SetProfile`, except the tracing function does receive line-" +"number events and per-opcode events, but does not receive any event related " +"to C function objects being called. Any trace function registered using " +":c:func:`PyEval_SetTrace` will not receive :c:data:`PyTrace_C_CALL`, " +":c:data:`PyTrace_C_EXCEPTION` or :c:data:`PyTrace_C_RETURN` as a value for " +"the *what* parameter." +msgstr "" +"将跟踪函数设为 *func*。这类似于 " +":c:func:`PyEval_SetProfile`,区别在于跟踪函数会接收行编号事件和操作码级事件,但不会接收与被调用的 C " +"函数对象相关的任何事件。使用 :c:func:`PyEval_SetTrace` 注册的任何跟踪函数将不会接收 " +":c:data:`PyTrace_C_CALL`、:c:data:`PyTrace_C_EXCEPTION` 或 " +":c:data:`PyTrace_C_RETURN` 作为 *what* 形参的值。" + +#: ../../c-api/profiling.rst:148 +msgid "See also the :func:`sys.settrace` function." +msgstr "另请参阅 :func:`sys.settrace` 函数。" + +#: ../../c-api/profiling.rst:155 +msgid "" +"Like :c:func:`PyEval_SetTrace` but sets the tracing function in all running " +"threads belonging to the current interpreter instead of the setting it only " +"on the current thread." +msgstr "类似于 :c:func:`PyEval_SetTrace` 但会在属于当前解释器的所有在运行线程中设置跟踪函数而不是仅在当前线程上设置。" + +#: ../../c-api/profiling.rst:160 +msgid "" +"As :c:func:`PyEval_SetTrace`, this function ignores any exceptions raised " +"while setting the trace functions in all threads." +msgstr "与 :c:func:`PyEval_SetTrace` 一样,该函数会忽略任何被引发的异常同时在所有线程中设置跟踪函数。" + +#: ../../c-api/profiling.rst:167 +msgid "Reference tracing" +msgstr "引用追踪" + +#: ../../c-api/profiling.rst:174 +msgid "" +"The type of the trace function registered using " +":c:func:`PyRefTracer_SetTracer`. The first parameter is a Python object that" +" has been just created (when **event** is set to " +":c:data:`PyRefTracer_CREATE`) or about to be destroyed (when **event** is " +"set to :c:data:`PyRefTracer_DESTROY`). The **data** argument is the opaque " +"pointer that was provided when :c:func:`PyRefTracer_SetTracer` was called." +msgstr "" +"使用 :c:func:`PyRefTracer_SetTracer` 注册的追踪函数的类型。第一个形参是刚创建(当 **event** 被设为 " +":c:data:`PyRefTracer_CREATE` 时)或将销毁(当 **event** 被设为 " +":c:data:`PyRefTracer_DESTROY` 时)的 Python 对象。 **data** 参数是当 " +":c:func:`PyRefTracer_SetTracer` 被调用时所提供的不透明指针。" + +#: ../../c-api/profiling.rst:180 +msgid "" +"If a new tracing function is registered replacing the current one, a call to" +" the trace function will be made with the object set to **NULL** and " +"**event** set to :c:data:`PyRefTracer_TRACKER_REMOVED`. This will happen " +"just before the new function is registered." +msgstr "" + +#: ../../c-api/profiling.rst:190 +msgid "" +"The value for the *event* parameter to :c:type:`PyRefTracer` functions when " +"a Python object has been created." +msgstr "当一个 Python 对象被创建时传给 :c:type:`PyRefTracer` 函数的 *event* 形参。" + +#: ../../c-api/profiling.rst:196 +msgid "" +"The value for the *event* parameter to :c:type:`PyRefTracer` functions when " +"a Python object has been destroyed." +msgstr "当一个 Python 对象被销毁时传给 :c:type:`PyRefTracer` 函数的 *event* 形参。" + +#: ../../c-api/profiling.rst:202 +msgid "" +"The value for the *event* parameter to :c:type:`PyRefTracer` functions when " +"the current tracer is about to be replaced by a new one." +msgstr "" + +#: ../../c-api/profiling.rst:210 +msgid "" +"Register a reference tracer function. The function will be called when a new" +" Python object has been created or when an object is going to be destroyed. " +"If **data** is provided it must be an opaque pointer that will be provided " +"when the tracer function is called. Return ``0`` on success. Set an " +"exception and return ``-1`` on error." +msgstr "" + +#: ../../c-api/profiling.rst:216 +msgid "" +"Note that tracer functions **must not** create Python objects inside or " +"otherwise the call will be re-entrant. The tracer also **must not** clear " +"any existing exception or set an exception. A :term:`thread state` will be " +"active every time the tracer function is called." +msgstr "" + +#: ../../c-api/profiling.rst:221 ../../c-api/profiling.rst:237 +msgid "" +"There must be an :term:`attached thread state` when calling this function." +msgstr "当调用此函数时必须有一个 :term:`attached thread state`。" + +#: ../../c-api/profiling.rst:223 +msgid "" +"If another tracer function was already registered, the old function will be " +"called with **event** set to :c:data:`PyRefTracer_TRACKER_REMOVED` just " +"before the new function is registered." +msgstr "" + +#: ../../c-api/profiling.rst:232 +msgid "" +"Get the registered reference tracer function and the value of the opaque " +"data pointer that was registered when :c:func:`PyRefTracer_SetTracer` was " +"called. If no tracer was registered this function will return NULL and will " +"set the **data** pointer to NULL." +msgstr "" +"获取已注册的引用追踪函数以及当 :c:func:`PyRefTracer_SetTracer` 被调用时所注册的不透明数据指针的值。 " +"如果未注册任何追踪器则此函数将返回 NULL 并将 **data** 指针设为 NULL。" diff --git a/c-api/refcounting.po b/c-api/refcounting.po new file mode 100644 index 0000000000..37d6e3ce65 --- /dev/null +++ b/c-api/refcounting.po @@ -0,0 +1,342 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/refcounting.rst:8 +msgid "Reference Counting" +msgstr "引用计数" + +#: ../../c-api/refcounting.rst:10 +msgid "" +"The functions and macros in this section are used for managing reference " +"counts of Python objects." +msgstr "本节介绍的函数和宏被用于管理 Python 对象的引用计数。" + +#: ../../c-api/refcounting.rst:16 +msgid "Get the reference count of the Python object *o*." +msgstr "获取 Python 对象 *o* 的引用计数。" + +#: ../../c-api/refcounting.rst:18 +msgid "" +"Note that the returned value may not actually reflect how many references to" +" the object are actually held. For example, some objects are " +":term:`immortal` and have a very high refcount that does not reflect the " +"actual number of references. Consequently, do not rely on the returned " +"value to be accurate, other than a value of 0 or 1." +msgstr "" +"请注意返回的值可能并不真正反映实际持有的对象引用数。例如,有些对象属于 :term:`immortal` 对象并具有并不反映实际引用数的非常高的 " +"refcount 值。因此,除了 0 或 1 这两个值,不要依赖返回值的准确性。" + +#: ../../c-api/refcounting.rst:24 +msgid "" +"Use the :c:func:`Py_SET_REFCNT()` function to set an object reference count." +msgstr "使用 :c:func:`Py_SET_REFCNT()` 函数来设置一个对象引用计数。" + +#: ../../c-api/refcounting.rst:28 +msgid "" +"On :term:`free-threaded builds ` of Python, returning 1" +" isn't sufficient to determine if it's safe to treat *o* as having no access" +" by other threads. Use :c:func:`PyUnstable_Object_IsUniquelyReferenced` for " +"that instead." +msgstr "" +"在 Python 的 :term:`自由线程构建版 `,返回 1 并不足以确定是否能安全地将 *o* " +"视为不可被其他线程访问。对于此类场景请改用 :c:func:`PyUnstable_Object_IsUniquelyReferenced`。" + +#: ../../c-api/refcounting.rst:33 +msgid "" +"See also the function " +":c:func:`PyUnstable_Object_IsUniqueReferencedTemporary()`." +msgstr "另请参阅 :c:func:`PyUnstable_Object_IsUniqueReferencedTemporary()` 函数。" + +#: ../../c-api/refcounting.rst:35 +msgid ":c:func:`Py_REFCNT()` is changed to the inline static function." +msgstr ":c:func:`Py_REFCNT()` 被改为内联的静态函数。" + +#: ../../c-api/refcounting.rst:38 +msgid "The parameter type is no longer :c:expr:`const PyObject*`." +msgstr "形参类型不再是 :c:expr:`const PyObject*`。" + +#: ../../c-api/refcounting.rst:44 +msgid "Set the object *o* reference counter to *refcnt*." +msgstr "将对象 *o* 的引用计数器设为 *refcnt*。" + +#: ../../c-api/refcounting.rst:46 +msgid "" +"On :ref:`Python build with Free Threading `, if " +"*refcnt* is larger than ``UINT32_MAX``, the object is made :term:`immortal`." +msgstr "" +"在 :ref:`启用自由线程的 Python 编译版 ` 中,如果 *refcnt* 大于 " +"``UINT32_MAX``,该对象将被设为 :term:`immortal` 对象。" + +#: ../../c-api/refcounting.rst:49 ../../c-api/refcounting.rst:62 +#: ../../c-api/refcounting.rst:128 +msgid "This function has no effect on :term:`immortal` objects." +msgstr "此函数对 :term:`immortal` 对象没有效果。" + +#: ../../c-api/refcounting.rst:53 ../../c-api/refcounting.rst:77 +#: ../../c-api/refcounting.rst:156 +msgid "Immortal objects are not modified." +msgstr "永生对象不会被修改。" + +#: ../../c-api/refcounting.rst:59 +msgid "" +"Indicate taking a new :term:`strong reference` to object *o*, indicating it " +"is in use and should not be destroyed." +msgstr "表示为对象 *o* 获取一个新的 :term:`strong reference`,指明该对象正在被使用且不应被销毁。" + +#: ../../c-api/refcounting.rst:64 +msgid "" +"This function is usually used to convert a :term:`borrowed reference` to a " +":term:`strong reference` in-place. The :c:func:`Py_NewRef` function can be " +"used to create a new :term:`strong reference`." +msgstr "" +"此函数通常被用来将 :term:`borrowed reference` 原地转换为 :term:`strong reference`。 " +":c:func:`Py_NewRef` 函数可被用来创建新的 :term:`strong reference`。" + +#: ../../c-api/refcounting.rst:68 +msgid "When done using the object, release is by calling :c:func:`Py_DECREF`." +msgstr "当对象使用完毕后,可调用 :c:func:`Py_DECREF` 来释放它。" + +#: ../../c-api/refcounting.rst:70 +msgid "" +"The object must not be ``NULL``; if you aren't sure that it isn't ``NULL``, " +"use :c:func:`Py_XINCREF`." +msgstr "此对象必须不为 ``NULL``;如果你不能确定它不为 ``NULL``,请使用 :c:func:`Py_XINCREF`。" + +#: ../../c-api/refcounting.rst:73 +msgid "" +"Do not expect this function to actually modify *o* in any way. For at least " +":pep:`some objects <0683>`, this function has no effect." +msgstr "不要预期此函数会以任何方式实际地改变 *o*。至少对 :pep:`某些对象 <0683>` 来说,此函数将没有任何效果。" + +#: ../../c-api/refcounting.rst:83 +msgid "" +"Similar to :c:func:`Py_INCREF`, but the object *o* can be ``NULL``, in which" +" case this has no effect." +msgstr "与 :c:func:`Py_INCREF` 类似,但对象 *o* 可以为 ``NULL``,在这种情况下此函数将没有任何效果。" + +#: ../../c-api/refcounting.rst:86 +msgid "See also :c:func:`Py_XNewRef`." +msgstr "另请参阅 :c:func:`Py_XNewRef`。" + +#: ../../c-api/refcounting.rst:91 +msgid "" +"Create a new :term:`strong reference` to an object: call :c:func:`Py_INCREF`" +" on *o* and return the object *o*." +msgstr "" +"为对象创建一个新的 :term:`strong reference`: 在 *o* 上调用 :c:func:`Py_INCREF` 并返回对象 *o*。" + +#: ../../c-api/refcounting.rst:94 +msgid "" +"When the :term:`strong reference` is no longer needed, :c:func:`Py_DECREF` " +"should be called on it to release the reference." +msgstr "当不再需要这个 :term:`strong reference` 时,应当在其上调用 :c:func:`Py_DECREF` 来释放引用。" + +#: ../../c-api/refcounting.rst:97 +msgid "" +"The object *o* must not be ``NULL``; use :c:func:`Py_XNewRef` if *o* can be " +"``NULL``." +msgstr "对象 *o* 必须不为 ``NULL``;如果 *o* 可以为 ``NULL`` 则应改用 :c:func:`Py_XNewRef`。" + +#: ../../c-api/refcounting.rst:100 +msgid "For example::" +msgstr "例如:" + +#: ../../c-api/refcounting.rst:102 +msgid "" +"Py_INCREF(obj);\n" +"self->attr = obj;" +msgstr "" +"Py_INCREF(obj);\n" +"self->attr = obj;" + +#: ../../c-api/refcounting.rst:105 +msgid "can be written as::" +msgstr "可以写成::" + +#: ../../c-api/refcounting.rst:107 +msgid "self->attr = Py_NewRef(obj);" +msgstr "self->attr = Py_NewRef(obj);" + +#: ../../c-api/refcounting.rst:109 +msgid "See also :c:func:`Py_INCREF`." +msgstr "另请参阅 :c:func:`Py_INCREF`。" + +#: ../../c-api/refcounting.rst:116 +msgid "Similar to :c:func:`Py_NewRef`, but the object *o* can be NULL." +msgstr "类似于 :c:func:`Py_NewRef`,但对象 *o* 可以为 NULL。" + +#: ../../c-api/refcounting.rst:118 +msgid "If the object *o* is ``NULL``, the function just returns ``NULL``." +msgstr "如果对象 *o* 为 ``NULL``,该函数也将返回 ``NULL``。" + +#: ../../c-api/refcounting.rst:125 +msgid "" +"Release a :term:`strong reference` to object *o*, indicating the reference " +"is no longer used." +msgstr "释放一个指向对象 *o* 的 :term:`strong reference`,表明该引用不再被使用。" + +#: ../../c-api/refcounting.rst:130 +msgid "" +"Once the last :term:`strong reference` is released (i.e. the object's " +"reference count reaches 0), the object's type's deallocation function (which" +" must not be ``NULL``) is invoked." +msgstr "" +"当最后一个 :term:`strong reference` 被释放时 (即对象的引用计数变为 0),将会调用该对象所属类型的 deallocation" +" 函数 (它必须不为 ``NULL``)。" + +#: ../../c-api/refcounting.rst:135 +msgid "" +"This function is usually used to delete a :term:`strong reference` before " +"exiting its scope." +msgstr "此函数通常被用于在退出作用域之前删除一个 :term:`strong reference`。" + +#: ../../c-api/refcounting.rst:138 +msgid "" +"The object must not be ``NULL``; if you aren't sure that it isn't ``NULL``, " +"use :c:func:`Py_XDECREF`." +msgstr "此对象必须不为 ``NULL``;如果你不能确定它不为 ``NULL``,请使用 :c:func:`Py_XDECREF`。" + +#: ../../c-api/refcounting.rst:141 +msgid "" +"Do not expect this function to actually modify *o* in any way. For at least " +":pep:`some objects <683>`, this function has no effect." +msgstr "不要预期此函数会以任何方式实际地改变 *o*。至少对 :pep:`某些对象 <683>` 来说,此函数将没有任何效果。" + +#: ../../c-api/refcounting.rst:147 +msgid "" +"The deallocation function can cause arbitrary Python code to be invoked " +"(e.g. when a class instance with a :meth:`~object.__del__` method is " +"deallocated). While exceptions in such code are not propagated, the " +"executed code has free access to all Python global variables. This means " +"that any object that is reachable from a global variable should be in a " +"consistent state before :c:func:`Py_DECREF` is invoked. For example, code " +"to delete an object from a list should copy a reference to the deleted " +"object in a temporary variable, update the list data structure, and then " +"call :c:func:`Py_DECREF` for the temporary variable." +msgstr "" +"释放函数会导致任意 Python 代码被调用(例如当一个带有 :meth:`~object.__del__` 方法的类实例被释放时就是如此)。 " +"虽然这些代码中的异常不会被传播,但被执行的代码能够自由访问所有 Python 全局变量。这意味着在调用 :c:func:`Py_DECREF` " +"之前任何可通过全局变量获取的对象都应该处于完好的状态。 " +"例如,从一个列表中删除对象的代码应该将被删除对象的引用拷贝到一个临时变量中,更新列表数据结构,然后再为临时变量调用 " +":c:func:`Py_DECREF`." + +#: ../../c-api/refcounting.rst:162 +msgid "" +"Similar to :c:func:`Py_DECREF`, but the object *o* can be ``NULL``, in which" +" case this has no effect. The same warning from :c:func:`Py_DECREF` applies " +"here as well." +msgstr "" +"与 :c:func:`Py_DECREF` 类似,但对象 *o* 可以为 ``NULL``,在这种情况下此函数将没有任何效果。来自 " +":c:func:`Py_DECREF` 的警告同样适用于此处。" + +#: ../../c-api/refcounting.rst:169 +msgid "" +"Release a :term:`strong reference` for object *o*. The object may be " +"``NULL``, in which case the macro has no effect; otherwise the effect is the" +" same as for :c:func:`Py_DECREF`, except that the argument is also set to " +"``NULL``. The warning for :c:func:`Py_DECREF` does not apply with respect " +"to the object passed because the macro carefully uses a temporary variable " +"and sets the argument to ``NULL`` before releasing the reference." +msgstr "" +"释放一个指向对象 *o* 的 :term:`strong reference`。对象可以为 " +"``NULL``,在此情况下该宏将没有任何效果;在其他情况下其效果与 :c:func:`Py_DECREF` 相同,区别在于其参数也会被设为 " +"``NULL``。针对 :c:func:`Py_DECREF` 的警告不适用于所传递的对象,因为该宏会细心地使用一个临时变量并在释放引用之前将参数设为 " +"``NULL``." + +#: ../../c-api/refcounting.rst:177 +msgid "" +"It is a good idea to use this macro whenever releasing a reference to an " +"object that might be traversed during garbage collection." +msgstr "当需要释放指向一个在垃圾回收期间可能会被遍历的对象的引用时使用该宏是一个好主意。" + +#: ../../c-api/refcounting.rst:180 +msgid "" +"The macro argument is now only evaluated once. If the argument has side " +"effects, these are no longer duplicated." +msgstr "该宏参数现在只会被求值一次。如果该参数具有附带影响,它们将不会再被复制。" + +#: ../../c-api/refcounting.rst:187 +msgid "" +"Indicate taking a new :term:`strong reference` to object *o*. A function " +"version of :c:func:`Py_XINCREF`. It can be used for runtime dynamic " +"embedding of Python." +msgstr "" +"表示获取一个指向对象 *o* 的新 :term:`strong reference`。 :c:func:`Py_XINCREF` 的函数版本。 " +"它可被用于 Python 的运行时动态嵌入。" + +#: ../../c-api/refcounting.rst:194 +msgid "" +"Release a :term:`strong reference` to object *o*. A function version of " +":c:func:`Py_XDECREF`. It can be used for runtime dynamic embedding of " +"Python." +msgstr "" +"释放一个指向对象 *o* 的 :term:`strong reference`。 :c:func:`Py_XDECREF` 的函数版本。它可被用于 " +"Python 的运行时动态嵌入。" + +#: ../../c-api/refcounting.rst:201 +msgid "" +"Macro safely releasing a :term:`strong reference` to object *dst* and " +"setting *dst* to *src*." +msgstr "该宏可安全地释放一个指向对象 *dst* 的 :term:`strong reference`,并将 *dst* 设为 *src*。" + +#: ../../c-api/refcounting.rst:204 +msgid "As in case of :c:func:`Py_CLEAR`, \"the obvious\" code can be deadly::" +msgstr "在 :c:func:`Py_CLEAR` 的情况中,这样“直观”的代码可能会是致命的::" + +#: ../../c-api/refcounting.rst:206 +msgid "" +"Py_DECREF(dst);\n" +"dst = src;" +msgstr "" +"Py_DECREF(dst);\n" +"dst = src;" + +#: ../../c-api/refcounting.rst:209 +msgid "The safe way is::" +msgstr "安全的方式是这样::" + +#: ../../c-api/refcounting.rst:211 +msgid "Py_SETREF(dst, src);" +msgstr "Py_SETREF(dst, src);" + +#: ../../c-api/refcounting.rst:213 +msgid "" +"That arranges to set *dst* to *src* *before* releasing the reference to the " +"old value of *dst*, so that any code triggered as a side-effect of *dst* " +"getting torn down no longer believes *dst* points to a valid object." +msgstr "" +"这样使得在释放对旧 *dst* 值的引用 *之前* 将 *dst* 设为 *src*,从而让任何因 *dst* 被去除而触发的代码不再相信 *dst* " +"指向一个有效的对象。" + +#: ../../c-api/refcounting.rst:220 ../../c-api/refcounting.rst:232 +msgid "" +"The macro arguments are now only evaluated once. If an argument has side " +"effects, these are no longer duplicated." +msgstr "该宏参数现在只会被求值一次。如果某个参数具有附带影响,它们将不会再被复制。" + +#: ../../c-api/refcounting.rst:227 +msgid "" +"Variant of :c:macro:`Py_SETREF` macro that uses :c:func:`Py_XDECREF` instead" +" of :c:func:`Py_DECREF`." +msgstr "" +"使用 :c:func:`Py_XDECREF` 代替 :c:func:`Py_DECREF` 的 :c:macro:`Py_SETREF` 宏的变种。" diff --git a/c-api/reflection.po b/c-api/reflection.po new file mode 100644 index 0000000000..f530612270 --- /dev/null +++ b/c-api/reflection.po @@ -0,0 +1,147 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/reflection.rst:6 +msgid "Reflection" +msgstr "反射" + +#: ../../c-api/reflection.rst:12 +msgid "Use :c:func:`PyEval_GetFrameBuiltins` instead." +msgstr "使用 :c:func:`PyEval_GetFrameBuiltins` 代替。" + +#: ../../c-api/reflection.rst:14 ../../c-api/reflection.rst:66 +msgid "" +"Return a dictionary of the builtins in the current execution frame, or the " +"interpreter of the thread state if no frame is currently executing." +msgstr "返回当前执行帧中内置对象的字典,如果当前没有帧正在执行,则返回线程状态的解释器中的内置对象字典。" + +#: ../../c-api/reflection.rst:22 +msgid "" +"Use either :c:func:`PyEval_GetFrameLocals` to obtain the same behaviour as " +"calling :func:`locals` in Python code, or else call " +":c:func:`PyFrame_GetLocals` on the result of :c:func:`PyEval_GetFrame` to " +"access the :attr:`~frame.f_locals` attribute of the currently executing " +"frame." +msgstr "" +"使用 :c:func:`PyEval_GetFrameLocals` 来获取与在 Python 代码中调用 :func:`locals` " +"相同的行为,或者是在 :c:func:`PyEval_GetFrame` 的结果上调用 :c:func:`PyFrame_GetLocals` " +"来访问当前执行帧的 :attr:`~frame.f_locals` 属性。" + +#: ../../c-api/reflection.rst:27 +msgid "" +"Return a mapping providing access to the local variables in the current " +"execution frame, or ``NULL`` if no frame is currently executing." +msgstr "返回一个提供对当前执行帧中局部变量访问的映射,或者如果没有当前执行帧则返回 ``NULL``。" + +#: ../../c-api/reflection.rst:30 +msgid "" +"Refer to :func:`locals` for details of the mapping returned at different " +"scopes." +msgstr "请参考 :func:`locals` 了解在不同作用域下返回的映射的详情。" + +#: ../../c-api/reflection.rst:32 +msgid "" +"As this function returns a :term:`borrowed reference`, the dictionary " +"returned for :term:`optimized scopes ` is cached on the " +"frame object and will remain alive as long as the frame object does. Unlike " +":c:func:`PyEval_GetFrameLocals` and :func:`locals`, subsequent calls to this" +" function in the same frame will update the contents of the cached " +"dictionary to reflect changes in the state of the local variables rather " +"than returning a new snapshot." +msgstr "" +"由于此函数会返回一个 :term:`borrowed reference`,为 :term:`已优化作用域 ` " +"返回的字典将缓存在帧对象上因此会在帧对象存活期间保持存活。不同于 :c:func:`PyEval_GetFrameLocals` 和 " +":func:`locals`,在相同帧中对该函数的后续调用将会更新已缓存字典的内容以反映局部变量状态的变化而不是返回一个新的快照。" + +#: ../../c-api/reflection.rst:39 +msgid "" +"As part of :pep:`667`, :c:func:`PyFrame_GetLocals`, :func:`locals`, and " +":attr:`FrameType.f_locals ` no longer make use of the shared" +" cache dictionary. Refer to the :ref:`What's New entry ` for additional details." +msgstr "" +"作为 :pep:`667` 的一部分,:c:func:`PyFrame_GetLocals`, :func:`locals` 和 " +":attr:`FrameType.f_locals ` 将不再使用共享的缓存字典。请参阅 :ref:`有什么新变化条目 " +"` 了解详情。" + +#: ../../c-api/reflection.rst:50 +msgid "Use :c:func:`PyEval_GetFrameGlobals` instead." +msgstr "使用 :c:func:`PyEval_GetFrameGlobals` 代替。" + +#: ../../c-api/reflection.rst:52 +msgid "" +"Return a dictionary of the global variables in the current execution frame, " +"or ``NULL`` if no frame is currently executing." +msgstr "返回当前执行帧中全局变量的字典,如果没有当前执行的帧则返回 ``NULL``。" + +#: ../../c-api/reflection.rst:58 +msgid "" +"Return the :term:`attached thread state`'s frame, which is ``NULL`` if no " +"frame is currently executing." +msgstr "" +"返回 :term:`已附加的线程状态 ` 的帧,如果当前没有帧正在执行则为 ``NULL``。" + +#: ../../c-api/reflection.rst:61 +msgid "See also :c:func:`PyThreadState_GetFrame`." +msgstr "另请参阅 :c:func:`PyThreadState_GetFrame`。" + +#: ../../c-api/reflection.rst:74 +msgid "" +"Return a dictionary of the local variables in the current execution frame, " +"or ``NULL`` if no frame is currently executing. Equivalent to calling " +":func:`locals` in Python code." +msgstr "" +"返回当前执行帧中局部变量的字典,或者如果没有当前执行帧则返回 ``NULL``。等价于在 Python 代码中调用 :func:`locals`。" + +#: ../../c-api/reflection.rst:78 +msgid "" +"To access :attr:`~frame.f_locals` on the current frame without making an " +"independent snapshot in :term:`optimized scopes `, call " +":c:func:`PyFrame_GetLocals` on the result of :c:func:`PyEval_GetFrame`." +msgstr "" +"要访问当前帧上的 :attr:`~frame.f_locals` 而不会在 :term:`已优化作用域 ` " +"中生成独立的快照,可以在 :c:func:`PyEval_GetFrame` 的结果上调用 :c:func:`PyFrame_GetLocals`。" + +#: ../../c-api/reflection.rst:87 +msgid "" +"Return a dictionary of the global variables in the current execution frame, " +"or ``NULL`` if no frame is currently executing. Equivalent to calling " +":func:`globals` in Python code." +msgstr "" +"返回当前执行帧中全局变量的字典,或者如果没有当前执行帧则返回 ``NULL``。等价于在 Python 代码中调用 :func:`globals`。" + +#: ../../c-api/reflection.rst:96 +msgid "" +"Return the name of *func* if it is a function, class or instance object, " +"else the name of *func*\\s type." +msgstr "如果 *func* 是函数、类或实例对象,则返回它的名称,否则返回 *func* 的类型的名称。" + +#: ../../c-api/reflection.rst:102 +msgid "" +"Return a description string, depending on the type of *func*. Return values " +"include \"()\" for functions and methods, \" constructor\", \" instance\", " +"and \" object\". Concatenated with the result of " +":c:func:`PyEval_GetFuncName`, the result will be a description of *func*." +msgstr "" +"根据 *func* 的类型返回描述字符串。返回值包括函数和方法的 \"()\", \" constructor\", \" instance\" 和 " +"\" object\"。与 :c:func:`PyEval_GetFuncName` 的结果连接,结果将是 *func* 的描述。" diff --git a/c-api/sequence.po b/c-api/sequence.po new file mode 100644 index 0000000000..6d099fb085 --- /dev/null +++ b/c-api/sequence.po @@ -0,0 +1,258 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-01 17:14+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/sequence.rst:6 +msgid "Sequence Protocol" +msgstr "序列协议" + +#: ../../c-api/sequence.rst:11 +msgid "" +"Return ``1`` if the object provides the sequence protocol, and ``0`` " +"otherwise. Note that it returns ``1`` for Python classes with a " +":meth:`~object.__getitem__` method, unless they are :class:`dict` " +"subclasses, since in general it is impossible to determine what type of keys" +" the class supports. This function always succeeds." +msgstr "" +"如果对象提供了序列协议则返回 ``1``,否则返回 ``0``。请注意对于具有 :meth:`~object.__getitem__` 方法的 " +"Python 类返回 ``1``,除非它们是 :class:`dict` 的子类,因为在通常情况下无法确定这种类支持哪种键类型。该函数总是会成功执行。" + +#: ../../c-api/sequence.rst:23 +msgid "" +"Returns the number of objects in sequence *o* on success, and ``-1`` on " +"failure. This is equivalent to the Python expression ``len(o)``." +msgstr "成功时返回序列对象 *o* 的长度,失败时返回 ``-1``。这相当于 Python 表达式 ``len(o)``。" + +#: ../../c-api/sequence.rst:29 +msgid "" +"Return the concatenation of *o1* and *o2* on success, and ``NULL`` on " +"failure. This is the equivalent of the Python expression ``o1 + o2``." +msgstr "成功时返回 *o1* 和 *o2* 的拼接,失败时返回 ``NULL``。这等价于 Python 表达式 ``o1 + o2``。" + +#: ../../c-api/sequence.rst:35 +msgid "" +"Return the result of repeating sequence object *o* *count* times, or " +"``NULL`` on failure. This is the equivalent of the Python expression ``o * " +"count``." +msgstr "" +"返回序列对象 *o* 重复 *count* 次的结果,失败时返回 ``NULL``。这等价于 Python 表达式 ``o * count``。" + +#: ../../c-api/sequence.rst:41 +msgid "" +"Return the concatenation of *o1* and *o2* on success, and ``NULL`` on " +"failure. The operation is done *in-place* when *o1* supports it. This is " +"the equivalent of the Python expression ``o1 += o2``." +msgstr "" +"成功时返回 *o1* 和 *o2* 的拼接,失败时返回 ``NULL``。在 *o1* 支持的情况下操作将 *原地* 完成。这等价于 Python " +"表达式 ``o1 += o2``。" + +#: ../../c-api/sequence.rst:48 +msgid "" +"Return the result of repeating sequence object *o* *count* times, or " +"``NULL`` on failure. The operation is done *in-place* when *o* supports it." +" This is the equivalent of the Python expression ``o *= count``." +msgstr "" +"返回序列对象 *o* 重复 *count* 次的结果,失败时返回 ``NULL``。在 *o* 支持的情况下该操作会 *原地* 完成。这等价于 " +"Python 表达式 ``o *= count``。" + +#: ../../c-api/sequence.rst:55 +msgid "" +"Return the *i*\\ th element of *o*, or ``NULL`` on failure. This is the " +"equivalent of the Python expression ``o[i]``." +msgstr "返回 *o* 中的第 *i* 号元素,失败时返回 ``NULL``。这等价于 Python 表达式 ``o[i]``。" + +#: ../../c-api/sequence.rst:61 +msgid "" +"Return the slice of sequence object *o* between *i1* and *i2*, or ``NULL`` " +"on failure. This is the equivalent of the Python expression ``o[i1:i2]``." +msgstr "" +"返回序列对象 *o* 的 *i1* 到 *i2* 的切片,失败时返回 ``NULL``。这等价于 Python 表达式 ``o[i1:i2]``。" + +#: ../../c-api/sequence.rst:67 +msgid "" +"Assign object *v* to the *i*\\ th element of *o*. Raise an exception and " +"return ``-1`` on failure; return ``0`` on success. This is the equivalent " +"of the Python statement ``o[i] = v``. This function *does not* " +"\":term:`steal`\" a reference to *v*." +msgstr "" + +#: ../../c-api/sequence.rst:72 +msgid "" +"If *v* is ``NULL``, the element is deleted, but this feature is deprecated " +"in favour of using :c:func:`PySequence_DelItem`." +msgstr "如果 *v* 为 ``NULL``,元素将被删除,但是此特性已被弃用而应改用 :c:func:`PySequence_DelItem`。" + +#: ../../c-api/sequence.rst:78 +msgid "" +"Delete the *i*\\ th element of object *o*. Returns ``-1`` on failure. This" +" is the equivalent of the Python statement ``del o[i]``." +msgstr "删除对象 *o* 的第 *i* 号元素。失败时返回 ``-1``。这相当于 Python 语句 ``del o[i]``。" + +#: ../../c-api/sequence.rst:84 +msgid "" +"Assign the sequence object *v* to the slice in sequence object *o* from *i1*" +" to *i2*. This is the equivalent of the Python statement ``o[i1:i2] = v``." +msgstr "" +"将序列对象 *v* 赋值给序列对象 *o* 的从 *i1* 到 *i2* 切片。这相当于 Python 语句 ``o[i1:i2] = v``。" + +#: ../../c-api/sequence.rst:90 +msgid "" +"Delete the slice in sequence object *o* from *i1* to *i2*. Returns ``-1`` " +"on failure. This is the equivalent of the Python statement ``del " +"o[i1:i2]``." +msgstr "" +"删除序列对象 *o* 的从 *i1* 到 *i2* 的切片。失败时返回 ``-1``。这相当于 Python 语句 ``del o[i1:i2]``。" + +#: ../../c-api/sequence.rst:96 +msgid "" +"Return the number of occurrences of *value* in *o*, that is, return the " +"number of keys for which ``o[key] == value``. On failure, return ``-1``. " +"This is equivalent to the Python expression ``o.count(value)``." +msgstr "" +"返回 *value* 在 *o* 中出现的次数,即返回使得 ``o[key] == value`` 的键的数量。失败时返回 ``-1``。这相当于 " +"Python 表达式 ``o.count(value)``。" + +#: ../../c-api/sequence.rst:103 +msgid "" +"Determine if *o* contains *value*. If an item in *o* is equal to *value*, " +"return ``1``, otherwise return ``0``. On error, return ``-1``. This is " +"equivalent to the Python expression ``value in o``." +msgstr "" +"确定 *o* 是否包含 *value*。如果 *o* 中的某一项等于 *value*,则返回 ``1``,否则返回 ``0``。出错时,返回 " +"``-1``。这相当于 Python 表达式 ``value in o``。" + +#: ../../c-api/sequence.rst:110 +msgid "Alias for :c:func:`PySequence_Contains`." +msgstr ":c:func:`PySequence_Contains` 的别名。" + +#: ../../c-api/sequence.rst:112 +msgid "The function should no longer be used to write new code." +msgstr "此函数不应再被用于编写新代码。" + +#: ../../c-api/sequence.rst:118 +msgid "" +"Return the first index *i* for which ``o[i] == value``. On error, return " +"``-1``. This is equivalent to the Python expression ``o.index(value)``." +msgstr "" +"返回第一个使得 ``o[i] == value`` 的索引 *i*。出错时返回 ``-1``。这相当于 Python 表达式 " +"``o.index(value)``。" + +#: ../../c-api/sequence.rst:124 +msgid "" +"Return a list object with the same contents as the sequence or iterable *o*," +" or ``NULL`` on failure. The returned list is guaranteed to be new. This " +"is equivalent to the Python expression ``list(o)``." +msgstr "" +"返回一个列表对象,其内容与序列或可迭代对象 *o* 相同,失败时返回 ``NULL``。返回的列表保证是一个新对象。这等价于 Python 表达式 " +"``list(o)``." + +#: ../../c-api/sequence.rst:133 +msgid "" +"Return a tuple object with the same contents as the sequence or iterable " +"*o*, or ``NULL`` on failure. If *o* is a tuple, a new reference will be " +"returned, otherwise a tuple will be constructed with the appropriate " +"contents. This is equivalent to the Python expression ``tuple(o)``." +msgstr "" +"返回一个元组对象,其内容与序列或可迭代对象 *o* 相同,失败时返回 ``NULL``。如果 *o* " +"为元组,则将返回一个新的引用,在其他情况下将使用适当的内容构造一个元组。这等价于 Python 表达式 ``tuple(o)``。" + +#: ../../c-api/sequence.rst:141 +msgid "" +"Return the sequence or iterable *o* as an object usable by the other " +"``PySequence_Fast*`` family of functions. If the object is not a sequence or" +" iterable, raises :exc:`TypeError` with *m* as the message text. Returns " +"``NULL`` on failure." +msgstr "" +"将序列或可迭代对象 *o* 作为其他 ``PySequence_Fast*`` 函数族可用的对象返回。如果该对象不是序列或可迭代对象,则会引发 " +":exc:`TypeError` 并将 *m* 作为消息文本。失败时返回 ``NULL``。" + +#: ../../c-api/sequence.rst:146 +msgid "" +"The ``PySequence_Fast*`` functions are thus named because they assume *o* is" +" a :c:type:`PyTupleObject` or a :c:type:`PyListObject` and access the data " +"fields of *o* directly." +msgstr "" +"``PySequence_Fast*`` 函数之所以这样命名,是因为它们会假定 *o* 是一个 :c:type:`PyTupleObject` 或 " +":c:type:`PyListObject` 并直接访问 *o* 的数据字段。" + +#: ../../c-api/sequence.rst:150 +msgid "" +"As a CPython implementation detail, if *o* is already a sequence or list, it" +" will be returned." +msgstr "作为 CPython 的实现细节,如果 *o* 已经是一个序列或列表,它将被直接返回。" + +#: ../../c-api/sequence.rst:156 +msgid "" +"Returns the length of *o*, assuming that *o* was returned by " +":c:func:`PySequence_Fast` and that *o* is not ``NULL``. The size can also " +"be retrieved by calling :c:func:`PySequence_Size` on *o*, but " +":c:func:`PySequence_Fast_GET_SIZE` is faster because it can assume *o* is a " +"list or tuple." +msgstr "" +"在 *o* 由 :c:func:`PySequence_Fast` 返回且 *o* 不为 ``NULL`` 的情况下返回 *o* 长度。也可以通过在 " +"*o* 上调用 :c:func:`PySequence_Size` 来获取大小,但是 " +":c:func:`PySequence_Fast_GET_SIZE` 的速度更快因为它可以假定 *o* 为列表或元组。" + +#: ../../c-api/sequence.rst:165 +msgid "" +"Return the *i*\\ th element of *o*, assuming that *o* was returned by " +":c:func:`PySequence_Fast`, *o* is not ``NULL``, and that *i* is within " +"bounds." +msgstr "" +"在 *o* 由 :c:func:`PySequence_Fast` 返回且 *o* 不为 ``NULL``,并且 *i* 在索引范围内的情况下返回 " +"*o* 的第 *i* 号元素。" + +#: ../../c-api/sequence.rst:171 +msgid "" +"Return the underlying array of PyObject pointers. Assumes that *o* was " +"returned by :c:func:`PySequence_Fast` and *o* is not ``NULL``." +msgstr "" +"返回 PyObject 指针的底层数组。假设 *o* 由 :c:func:`PySequence_Fast` 返回且 *o* 不为 ``NULL``。" + +#: ../../c-api/sequence.rst:174 +msgid "" +"Note, if a list gets resized, the reallocation may relocate the items array." +" So, only use the underlying array pointer in contexts where the sequence " +"cannot change." +msgstr "请注意,如果列表调整大小,重新分配可能会重新定位 items 数组。因此,仅在序列不会更改的上下文中使用底层数组指针。" + +#: ../../c-api/sequence.rst:181 +msgid "" +"Return the *i*\\ th element of *o* or ``NULL`` on failure. Faster form of " +":c:func:`PySequence_GetItem` but without checking that " +":c:func:`PySequence_Check` on *o* is true and without adjustment for " +"negative indices." +msgstr "" +"返回 *o* 的第 *i* 个元素或在失败时返回 ``NULL``。此形式比 :c:func:`PySequence_GetItem` 更快,但不会检查" +" *o* 上的 :c:func:`PySequence_Check` 是否为真值,也不会对负序号进行调整。" + +#: ../../c-api/sequence.rst:21 ../../c-api/sequence.rst:131 +msgid "built-in function" +msgstr "内置函数" + +#: ../../c-api/sequence.rst:21 +msgid "len" +msgstr "len" + +#: ../../c-api/sequence.rst:131 +msgid "tuple" +msgstr "元组" diff --git a/c-api/set.po b/c-api/set.po new file mode 100644 index 0000000000..2dbea0969e --- /dev/null +++ b/c-api/set.po @@ -0,0 +1,294 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-07 17:18+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/set.rst:6 +msgid "Set Objects" +msgstr "集合对象" + +#: ../../c-api/set.rst:15 +msgid "" +"This section details the public API for :class:`set` and :class:`frozenset` " +"objects. Any functionality not listed below is best accessed using either " +"the abstract object protocol (including :c:func:`PyObject_CallMethod`, " +":c:func:`PyObject_RichCompareBool`, :c:func:`PyObject_Hash`, " +":c:func:`PyObject_Repr`, :c:func:`PyObject_IsTrue`, " +":c:func:`PyObject_Print`, and :c:func:`PyObject_GetIter`) or the abstract " +"number protocol (including :c:func:`PyNumber_And`, " +":c:func:`PyNumber_Subtract`, :c:func:`PyNumber_Or`, :c:func:`PyNumber_Xor`, " +":c:func:`PyNumber_InPlaceAnd`, :c:func:`PyNumber_InPlaceSubtract`, " +":c:func:`PyNumber_InPlaceOr`, and :c:func:`PyNumber_InPlaceXor`)." +msgstr "" +"这一节详细介绍了针对 :class:`set` 和 :class:`frozenset` 对象的公共 " +"API。任何未在下面列出的功能最好是使用抽象对象协议 (包括 :c:func:`PyObject_CallMethod`, " +":c:func:`PyObject_RichCompareBool`, :c:func:`PyObject_Hash`, " +":c:func:`PyObject_Repr`, :c:func:`PyObject_IsTrue`, :c:func:`PyObject_Print`" +" 以及 :c:func:`PyObject_GetIter`) 或者抽象数字协议 (包括 :c:func:`PyNumber_And`, " +":c:func:`PyNumber_Subtract`, :c:func:`PyNumber_Or`, :c:func:`PyNumber_Xor`, " +":c:func:`PyNumber_InPlaceAnd`, :c:func:`PyNumber_InPlaceSubtract`, " +":c:func:`PyNumber_InPlaceOr` 以及 :c:func:`PyNumber_InPlaceXor`)。" + +#: ../../c-api/set.rst:29 +msgid "" +"This subtype of :c:type:`PyObject` is used to hold the internal data for " +"both :class:`set` and :class:`frozenset` objects. It is like a " +":c:type:`PyDictObject` in that it is a fixed size for small sets (much like " +"tuple storage) and will point to a separate, variable sized block of memory " +"for medium and large sized sets (much like list storage). None of the fields" +" of this structure should be considered public and all are subject to " +"change. All access should be done through the documented API rather than by" +" manipulating the values in the structure." +msgstr "" +"这个 :c:type:`PyObject` 的子类型被用来保存 :class:`set` 和 :class:`frozenset` " +"对象的内部数据。它类似于 :c:type:`PyDictObject` " +"的地方在于对小尺寸集合来说它是固定大小的(很像元组的存储方式),而对于中等和大尺寸集合来说它将指向单独的可变大小的内存块(很像列表的存储方式)。此结构体的字段不应被视为公有并且可能发生改变。所有访问都应当通过已写入文档的" +" API 来进行而不可通过直接操纵结构体中的值。" + +#: ../../c-api/set.rst:40 +msgid "" +"This is an instance of :c:type:`PyTypeObject` representing the Python " +":class:`set` type." +msgstr "这是一个 :c:type:`PyTypeObject` 实例,表示 Python :class:`set` 类型。" + +#: ../../c-api/set.rst:46 +msgid "" +"This is an instance of :c:type:`PyTypeObject` representing the Python " +":class:`frozenset` type." +msgstr "这是一个 :c:type:`PyTypeObject` 实例,表示 Python :class:`frozenset` 类型。" + +#: ../../c-api/set.rst:49 +msgid "" +"The following type check macros work on pointers to any Python object. " +"Likewise, the constructor functions work with any iterable Python object." +msgstr "下列类型检查宏适用于指向任意 Python 对象的指针。类似地,这些构造函数也适用于任意可迭代的 Python 对象。" + +#: ../../c-api/set.rst:55 +msgid "" +"Return true if *p* is a :class:`set` object or an instance of a subtype. " +"This function always succeeds." +msgstr "如果 *p* 是一个 :class:`set` 对象或者是其子类型的实例则返回真值。此函数总是会成功执行。" + +#: ../../c-api/set.rst:60 +msgid "" +"Return true if *p* is a :class:`frozenset` object or an instance of a " +"subtype. This function always succeeds." +msgstr "如果 *p* 是一个 :class:`frozenset` 对象或者是其子类型的实例则返回真值。此函数总是会成功执行。" + +#: ../../c-api/set.rst:65 +msgid "" +"Return true if *p* is a :class:`set` object, a :class:`frozenset` object, or" +" an instance of a subtype. This function always succeeds." +msgstr "" +"如果 *p* 是一个 :class:`set` 对象、:class:`frozenset` 对象或者是其子类型的实例则返回真值。此函数总是会成功执行。" + +#: ../../c-api/set.rst:70 +msgid "" +"Return true if *p* is a :class:`set` object but not an instance of a " +"subtype. This function always succeeds." +msgstr "如果 *p* 是一个 :class:`set` 对象但不是其子类型的实例则返回真值。此函数总是会成功执行。" + +#: ../../c-api/set.rst:77 +msgid "" +"Return true if *p* is a :class:`set` object or a :class:`frozenset` object " +"but not an instance of a subtype. This function always succeeds." +msgstr "" +"如果 *p* 是一个 :class:`set` 或 :class:`frozenset` 对象但不是其子类型的实例则返回真值。此函数总是会成功执行。" + +#: ../../c-api/set.rst:83 +msgid "" +"Return true if *p* is a :class:`frozenset` object but not an instance of a " +"subtype. This function always succeeds." +msgstr "如果 *p* 是一个 :class:`frozenset` 对象但不是其子类型的实例则返回真值。此函数总是会成功执行。" + +#: ../../c-api/set.rst:89 +msgid "" +"Return a new :class:`set` containing objects returned by the *iterable*. " +"The *iterable* may be ``NULL`` to create a new empty set. Return the new " +"set on success or ``NULL`` on failure. Raise :exc:`TypeError` if *iterable*" +" is not actually iterable. The constructor is also useful for copying a set" +" (``c=set(s)``)." +msgstr "" +"返回一个新的 :class:`set`,其中包含 *iterable* 所返回的对象。*iterable* 可以为 ``NULL`` " +"表示创建一个新的空集合。成功时返回新的集合,失败时返回 ``NULL``。如果 *iterable* 实际上不是可迭代对象则引发 " +":exc:`TypeError`。该构造器也适用于拷贝集合 (``c=set(s)``)。" + +#: ../../c-api/set.rst:97 ../../c-api/set.rst:110 +msgid "" +"The operation is atomic on :term:`free threading ` when" +" *iterable* is a :class:`set`, :class:`frozenset` or :class:`dict`." +msgstr "" + +#: ../../c-api/set.rst:103 +msgid "" +"Return a new :class:`frozenset` containing objects returned by the " +"*iterable*. The *iterable* may be ``NULL`` to create a new empty frozenset." +" Return the new set on success or ``NULL`` on failure. Raise " +":exc:`TypeError` if *iterable* is not actually iterable." +msgstr "" +"返回一个新的 :class:`frozenset`,其中包含 *iterable* 所返回的对象。*iterable* 可以为 ``NULL`` " +"表示创建一个新的空冻结集合。成功时返回新的冻结集合,失败时返回 ``NULL``。如果 *iterable* 实际上不是可迭代对象则引发 " +":exc:`TypeError`." + +#: ../../c-api/set.rst:114 +msgid "" +"The following functions and macros are available for instances of " +":class:`set` or :class:`frozenset` or instances of their subtypes." +msgstr "下列函数和宏适用于 :class:`set` 或 :class:`frozenset` 的实例或是其子类型的实例。" + +#: ../../c-api/set.rst:122 +msgid "" +"Return the length of a :class:`set` or :class:`frozenset` object. Equivalent" +" to ``len(anyset)``. Raises a :exc:`SystemError` if *anyset* is not a " +":class:`set`, :class:`frozenset`, or an instance of a subtype." +msgstr "" +"返回 :class:`set` 或 :class:`frozenset` 对象的长度。等同于 ``len(anyset)``。如果 *anyset* " +"不是 :class:`set`, :class:`frozenset` 或其子类型的实例,则会引发 :exc:`SystemError`。" + +#: ../../c-api/set.rst:129 +msgid "Macro form of :c:func:`PySet_Size` without error checking." +msgstr "宏版本的 :c:func:`PySet_Size`,不带错误检测。" + +#: ../../c-api/set.rst:134 +msgid "" +"Return ``1`` if found, ``0`` if not found, and ``-1`` if an error is " +"encountered. Unlike the Python :meth:`~object.__contains__` method, this " +"function does not automatically convert unhashable sets into temporary " +"frozensets. Raise a :exc:`TypeError` if the *key* is unhashable. Raise " +":exc:`SystemError` if *anyset* is not a :class:`set`, :class:`frozenset`, or" +" an instance of a subtype." +msgstr "" +"如果找到则返回 ``1``,如果未找到则返回 ``0``,如果遇到错误则返回 ``-1``。与 Python " +":meth:`~object.__contains__` 方法不同,该函数不会自动将不可哈希的集合转换为临时冻结集合。如果 *key* " +"是不可哈希对象则会引发 :exc:`TypeError`。如果 *anyset* 不是 :class:`set`, :class:`frozenset`" +" 或其子类型的实例则会引发 :exc:`SystemError`。" + +#: ../../c-api/set.rst:142 ../../c-api/set.rst:157 ../../c-api/set.rst:177 +msgid "" +"The operation is atomic on :term:`free threading ` when" +" *key* is :class:`str`, :class:`int`, :class:`float`, :class:`bool` or " +":class:`bytes`." +msgstr "" + +#: ../../c-api/set.rst:147 +msgid "" +"Add *key* to a :class:`set` instance. Also works with :class:`frozenset` " +"instances (like :c:func:`PyTuple_SetItem` it can be used to fill in the " +"values of brand new frozensets before they are exposed to other code). " +"Return ``0`` on success or ``-1`` on failure. Raise a :exc:`TypeError` if " +"the *key* is unhashable. Raise a :exc:`MemoryError` if there is no room to " +"grow. Raise a :exc:`SystemError` if *set* is not an instance of " +":class:`set` or its subtype." +msgstr "" +"添加 *key* 到一个 :class:`set` 实例。也可用于 :class:`frozenset` 实例(与 " +":c:func:`PyTuple_SetItem` 的类似之处是它也可被用来为全新的冻结集合在公开给其他代码之前填充全新的值)。成功时返回 ``0`` " +"而失败时返回 ``-1``。如果 *key* 为不可哈希对象则会引发 :exc:`TypeError`。如果没有增长空间则会引发 " +":exc:`MemoryError`。如果 *set* 不是 :class:`set` 或其子类型的实例则会引发 :exc:`SystemError`." + +#: ../../c-api/set.rst:162 +msgid "" +"The following functions are available for instances of :class:`set` or its " +"subtypes but not for instances of :class:`frozenset` or its subtypes." +msgstr "下列函数适用于 :class:`set` 或其子类型的实例,但不可用于 :class:`frozenset` 或其子类型的实例。" + +#: ../../c-api/set.rst:168 +msgid "" +"Return ``1`` if found and removed, ``0`` if not found (no action taken), and" +" ``-1`` if an error is encountered. Does not raise :exc:`KeyError` for " +"missing keys. Raise a :exc:`TypeError` if the *key* is unhashable. Unlike " +"the Python :meth:`~set.discard` method, this function does not automatically" +" convert unhashable sets into temporary frozensets. Raise :exc:`SystemError`" +" if *set* is not an instance of :class:`set` or its subtype." +msgstr "" +"如果已找到并移除则返回 ``1``,如果未找到则返回 ``0`` (不执行任何操作),如果遇到错误则返回 ``-1``。不会针对不存在的键引发 " +":exc:`KeyError`。如果 *key* 不可哈希则会引发 :exc:`TypeError`。不同于 Python " +":meth:`~set.discard` 方法,此函数不会自动将不可哈希的集合转换为临时的冻结集合。如果 *set* 不是 :class:`set` " +"或其子类型的实例则会引发 :exc:`SystemError`。" + +#: ../../c-api/set.rst:183 +msgid "" +"Return a new reference to an arbitrary object in the *set*, and removes the " +"object from the *set*. Return ``NULL`` on failure. Raise :exc:`KeyError` " +"if the set is empty. Raise a :exc:`SystemError` if *set* is not an instance " +"of :class:`set` or its subtype." +msgstr "" +"返回 *set* 中任意对象的新引用,并从 *set* 中移除该对象。失败时返回 ``NULL``。如果集合为空则会引发 " +":exc:`KeyError`。如果 *set* 不是 :class:`set` 或其子类型的实例则会引发 :exc:`SystemError` 异常。" + +#: ../../c-api/set.rst:191 +msgid "" +"Empty an existing set of all elements. Return ``0`` on success. Return " +"``-1`` and raise :exc:`SystemError` if *set* is not an instance of " +":class:`set` or its subtype." +msgstr "" +"清空一个现有集合的所有元素。成功时返回 ``0``。如果 *set* 不是 :class:`set` 或其子类型的实例则返回 ``-1`` 并引发 " +":exc:`SystemError`." + +#: ../../c-api/set.rst:197 +msgid "" +"In the :term:`free-threaded build`, the set is emptied before its entries " +"are cleared, so other threads will observe an empty set rather than " +"intermediate states." +msgstr "" + +#: ../../c-api/set.rst:203 +msgid "Deprecated API" +msgstr "已弃用的 API" + +#: ../../c-api/set.rst:207 +msgid "" +"A constant representing the size of an internal preallocated table inside " +":c:type:`PySetObject` instances." +msgstr "" + +#: ../../c-api/set.rst:210 +msgid "" +"This is documented solely for completeness, as there are no guarantees that " +"a given version of CPython uses preallocated tables with a fixed size. In " +"code that does not deal with unstable set internals, " +":c:macro:`!PySet_MINSIZE` can be replaced with a small constant like ``8``." +msgstr "" +"该常量只是出于完整性考虑才被写入文档的,因为给定的 CPython 版本并不保证使用具有固定大小的预分配表。在不涉及不稳定的集合内部结构的代码中,可以将" +" :c:macro:`!PySet_MINSIZE` 替换为较小的常量如 ``8``。" + +#: ../../c-api/set.rst:216 +msgid "If looking for the size of a set, use :c:func:`PySet_Size` instead." +msgstr "要查找集合的大小,请改用 :c:func:`PySet_Size`。" + +#: ../../c-api/set.rst:11 +msgid "object" +msgstr "object -- 对象" + +#: ../../c-api/set.rst:11 +msgid "set" +msgstr "set" + +#: ../../c-api/set.rst:11 +msgid "frozenset" +msgstr "frozenset" + +#: ../../c-api/set.rst:120 +msgid "built-in function" +msgstr "内置函数" + +#: ../../c-api/set.rst:120 +msgid "len" +msgstr "len" diff --git a/c-api/slice.po b/c-api/slice.po new file mode 100644 index 0000000000..66dcf38842 --- /dev/null +++ b/c-api/slice.po @@ -0,0 +1,207 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/slice.rst:6 +msgid "Slice Objects" +msgstr "切片对象" + +#: ../../c-api/slice.rst:11 +msgid "" +"The type object for slice objects. This is the same as :class:`slice` in " +"the Python layer." +msgstr "切片对象的类型对象。它与 Python 层面的 :class:`slice` 是相同的对象。" + +#: ../../c-api/slice.rst:17 +msgid "" +"Return true if *ob* is a slice object; *ob* must not be ``NULL``. This " +"function always succeeds." +msgstr "如果 *ob* 是一个 slice 对象则返回真值;*ob* 必须不为 ``NULL``。此函数总是会成功执行。" + +#: ../../c-api/slice.rst:23 +msgid "" +"Return a new slice object with the given values. The *start*, *stop*, and " +"*step* parameters are used as the values of the slice object attributes of " +"the same names. Any of the values may be ``NULL``, in which case the " +"``None`` will be used for the corresponding attribute." +msgstr "" +"返回一个具有给定值的新切片对象。 *start*, *stop* 和 *step* 形参会被用作该切片对象相同名称的属性值。这些值中的任何一个都可以为 " +"``NULL``,在此情况下将使用 ``None`` 作为相应的属性值。" + +#: ../../c-api/slice.rst:28 +msgid "" +"Return ``NULL`` with an exception set if the new object could not be " +"allocated." +msgstr "当无法分配新对象时将返回 ``NULL`` 并设置一个异常。" + +#: ../../c-api/slice.rst:34 +msgid "" +"Retrieve the start, stop and step indices from the slice object *slice*, " +"assuming a sequence of length *length*. Treats indices greater than *length*" +" as errors." +msgstr "" +"从切片对象 *slice* 提取 start, stop 和 step 索引号,将序列长度视为 *length*。大于 *length* " +"的索引号将被当作错误。" + +#: ../../c-api/slice.rst:38 +msgid "" +"Returns ``0`` on success and ``-1`` on error with no exception set (unless " +"one of the indices was not ``None`` and failed to be converted to an " +"integer, in which case ``-1`` is returned with an exception set)." +msgstr "" +"成功时返回 ``0``,出错时返回 ``-1`` 并且不设置异常(除非某个索引号不为 ``None`` 且无法被转换为整数,在这种情况下将返回 " +"``-1`` 并且设置一个异常)。" + +#: ../../c-api/slice.rst:42 +msgid "You probably do not want to use this function." +msgstr "你可能不会打算使用此函数。" + +#: ../../c-api/slice.rst:44 ../../c-api/slice.rst:75 +msgid "" +"The parameter type for the *slice* parameter was ``PySliceObject*`` before." +msgstr "之前 *slice* 形参的形参类型是 ``PySliceObject*``。" + +#: ../../c-api/slice.rst:51 +msgid "" +"Usable replacement for :c:func:`PySlice_GetIndices`. Retrieve the start, " +"stop, and step indices from the slice object *slice* assuming a sequence of " +"length *length*, and store the length of the slice in *slicelength*. Out of" +" bounds indices are clipped in a manner consistent with the handling of " +"normal slices." +msgstr "" +":c:func:`PySlice_GetIndices` 的可用替代。从切片对象 *slice* 提取 start, stop 和 step " +"索引号,将序列长度视为 *length*,并将切片的长度保存在 *slicelength* 中,超出范围的索引号会以与普通切片一致的方式进行剪切。" + +#: ../../c-api/slice.rst:57 +msgid "Return ``0`` on success and ``-1`` on error with an exception set." +msgstr "成功时返回 ``0`` 而在出错时返回 ``-1`` 并设置一个异常。" + +#: ../../c-api/slice.rst:60 +msgid "" +"This function is considered not safe for resizable sequences. Its invocation" +" should be replaced by a combination of :c:func:`PySlice_Unpack` and " +":c:func:`PySlice_AdjustIndices` where ::" +msgstr "" +"此函数对于可变大小序列来说是不安全的。对它的调用应被替换为 :c:func:`PySlice_Unpack` 和 " +":c:func:`PySlice_AdjustIndices` 的组合,其中 ::" + +#: ../../c-api/slice.rst:64 +msgid "" +"if (PySlice_GetIndicesEx(slice, length, &start, &stop, &step, &slicelength) < 0) {\n" +" // return error\n" +"}" +msgstr "" +"if (PySlice_GetIndicesEx(slice, length, &start, &stop, &step, &slicelength) < 0) {\n" +" // 返回错误\n" +"}" + +#: ../../c-api/slice.rst:68 +msgid "is replaced by ::" +msgstr "会被替换为 ::" + +#: ../../c-api/slice.rst:70 +msgid "" +"if (PySlice_Unpack(slice, &start, &stop, &step) < 0) {\n" +" // return error\n" +"}\n" +"slicelength = PySlice_AdjustIndices(length, &start, &stop, step);" +msgstr "" +"if (PySlice_Unpack(slice, &start, &stop, &step) < 0) {\n" +" // 返回错误\n" +"}\n" +"slicelength = PySlice_AdjustIndices(length, &start, &stop, step);" + +#: ../../c-api/slice.rst:79 +msgid "" +"If ``Py_LIMITED_API`` is not set or set to the value between ``0x03050400`` " +"and ``0x03060000`` (not including) or ``0x03060100`` or higher " +":c:func:`!PySlice_GetIndicesEx` is implemented as a macro using " +":c:func:`!PySlice_Unpack` and :c:func:`!PySlice_AdjustIndices`. Arguments " +"*start*, *stop* and *step* are evaluated more than once." +msgstr "" +"如果 ``Py_LIMITED_API`` 未设置或设置为 ``0x03050400`` 与 ``0x03060000`` 之间的值(不包括边界)或 " +"``0x03060100`` 或更大则 :c:func:`!PySlice_GetIndicesEx` 会被实现为一个使用 " +":c:func:`!PySlice_Unpack` 和 :c:func:`!PySlice_AdjustIndices` 的宏。参数 *start*, " +"*stop* 和 *step* 会被多次求值。" + +#: ../../c-api/slice.rst:86 +msgid "" +"If ``Py_LIMITED_API`` is set to the value less than ``0x03050400`` or " +"between ``0x03060000`` and ``0x03060100`` (not including) " +":c:func:`!PySlice_GetIndicesEx` is a deprecated function." +msgstr "" +"如果 ``Py_LIMITED_API`` 设置为小于 ``0x03050400`` 或 ``0x03060000`` 与 ``0x03060100``" +" 之间的值(不包括边界)则 :c:func:`!PySlice_GetIndicesEx` 为已弃用的函数。" + +#: ../../c-api/slice.rst:94 +msgid "" +"Extract the start, stop and step data members from a slice object as C " +"integers. Silently reduce values larger than ``PY_SSIZE_T_MAX`` to " +"``PY_SSIZE_T_MAX``, silently boost the start and stop values less than " +"``PY_SSIZE_T_MIN`` to ``PY_SSIZE_T_MIN``, and silently boost the step values" +" less than ``-PY_SSIZE_T_MAX`` to ``-PY_SSIZE_T_MAX``." +msgstr "" +"从切片对象中将 start, stop 和 step 数据成员提取为 C 整数。会静默地将大于 ``PY_SSIZE_T_MAX`` 的值减小为 " +"``PY_SSIZE_T_MAX``,静默地将小于 ``PY_SSIZE_T_MIN`` 的 start 和 stop 值增大为 " +"``PY_SSIZE_T_MIN``,并静默地将小于 ``-PY_SSIZE_T_MAX`` 的 step 值增大为 " +"``-PY_SSIZE_T_MAX``." + +#: ../../c-api/slice.rst:100 +msgid "Return ``-1`` with an exception set on error, ``0`` on success." +msgstr "出错时返回 ``-1`` 并设置一个异常,成功时返回 ``0``。" + +#: ../../c-api/slice.rst:107 +msgid "" +"Adjust start/end slice indices assuming a sequence of the specified length. " +"Out of bounds indices are clipped in a manner consistent with the handling " +"of normal slices." +msgstr "将 start/end 切片索引号根据指定的序列长度进行调整。超出范围的索引号会以与普通切片一致的方式进行剪切。" + +#: ../../c-api/slice.rst:111 +msgid "" +"Return the length of the slice. Always successful. Doesn't call Python " +"code." +msgstr "返回切片的长度。此操作总是会成功。不会调用 Python 代码。" + +#: ../../c-api/slice.rst:118 +msgid "Ellipsis Object" +msgstr "Ellipsis 对象" + +#: ../../c-api/slice.rst:123 +msgid "" +"The type of Python :const:`Ellipsis` object. Same " +"as :class:`types.EllipsisType` in the Python layer." +msgstr "" +"Python :const:`Ellipsis` 对象的类型。与 Python 层的 :class:`types.EllipsisType` " +"为同一对象。" + +#: ../../c-api/slice.rst:129 +msgid "" +"The Python ``Ellipsis`` object. This object has no methods. Like " +":c:data:`Py_None`, it is an :term:`immortal` singleton object." +msgstr "" +"Python ``Ellipsis`` 对象。此对象没有任何方法。像 :c:data:`Py_None` 一样,它是一个 " +":term:`immortal` 单例对象。" + +#: ../../c-api/slice.rst:132 +msgid ":c:data:`Py_Ellipsis` is immortal." +msgstr ":c:data:`Py_Ellipsis` 是永久性对象。" diff --git a/c-api/stable.po b/c-api/stable.po new file mode 100644 index 0000000000..44e5bfe5e4 --- /dev/null +++ b/c-api/stable.po @@ -0,0 +1,647 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:00+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/stable.rst:7 +msgid "C API and ABI Stability" +msgstr "C API ABI 的稳定性" + +#: ../../c-api/stable.rst:9 +msgid "" +"Unless documented otherwise, Python's C API is covered by the Backwards " +"Compatibility Policy, :pep:`387`. Most changes to it are source-compatible " +"(typically by only adding new API). Changing existing API or removing API is" +" only done after a deprecation period or to fix serious issues." +msgstr "" +"除非另有文档说明,Python 的 C API 将遵循 :pep:`387` 所描述的向下兼容策略。 " +"对它的大部分改变都是源代码级兼容的(通常只会增加新的 API)。改变现有 API 或移除 API 只会在弃用期结束之后或需修复严重问题时才会发生。" + +#: ../../c-api/stable.rst:15 +msgid "" +"CPython's Application Binary Interface (ABI) is forward- and backwards-" +"compatible across a minor release (if these are compiled the same way; see " +":ref:`stable-abi-platform` below). So, code compiled for Python 3.10.0 will " +"work on 3.10.8 and vice versa, but will need to be compiled separately for " +"3.9.x and 3.11.x." +msgstr "" +"CPython 的应用程序二进制接口(ABI)可以跨微版本向上和向下兼容(在以相同方式编译的情况下,参见下文 :ref:`stable-abi-" +"platform` 一节)。因此,针对 Python 3.10.0 编译的代码将适用于 3.10.8,反之亦然,但对于 3.9.x 和 3.11.x " +"则需要单独编译。" + +#: ../../c-api/stable.rst:21 +msgid "There are two tiers of C API with different stability expectations:" +msgstr "存在具有不同稳定性预期的两个 C API 层次:" + +#: ../../c-api/stable.rst:23 +msgid "" +":ref:`Unstable API `, may change in minor versions without a" +" deprecation period. It is marked by the ``PyUnstable`` prefix in names." +msgstr "" +":ref:`不稳定 API `,可能在次要版本中发生改变而没有弃用期。它的名称会以 ``PyUnstable`` " +"前缀来标记。" + +#: ../../c-api/stable.rst:25 +msgid "" +":ref:`Limited API `, is compatible across several minor " +"releases. When :c:macro:`Py_LIMITED_API` is defined, only this subset is " +"exposed from ``Python.h``." +msgstr "" +":ref:`受限 API `,将会在多个次要版本间保持兼容。当定义了 :c:macro:`Py_LIMITED_API` " +"时,将只有这个子集会从 ``Python.h`` 对外公开。" + +#: ../../c-api/stable.rst:29 +msgid "These are discussed in more detail below." +msgstr "这些将在下文中更详细地讨论。" + +#: ../../c-api/stable.rst:31 +msgid "" +"Names prefixed by an underscore, such as ``_Py_InternalState``, are private " +"API that can change without notice even in patch releases. If you need to " +"use this API, consider reaching out to `CPython developers " +"`_ to discuss adding public " +"API for your use case." +msgstr "" +"带有一个下划线前缀的名称,如 ``_Py_InternalState``,是可能不经通知就改变甚至是在补丁发布版中改变的私有 API。 " +"如果你需要使用这样的 API,请考虑联系 `CPython 开发团队 `_ 来讨论为你的应用场景添加公有 API。" + +#: ../../c-api/stable.rst:40 +msgid "Unstable C API" +msgstr "不稳定 C API" + +#: ../../c-api/stable.rst:44 +msgid "" +"Any API named with the ``PyUnstable`` prefix exposes CPython implementation " +"details, and may change in every minor release (e.g. from 3.9 to 3.10) " +"without any deprecation warnings. However, it will not change in a bugfix " +"release (e.g. from 3.10.0 to 3.10.1)." +msgstr "" +"任何名称带有 ``PyUnstable`` 前缀的 API 都将对外公开 CPython 的实现细节,并可能不加弃用警告即在次要版本中发生改变(例如从 " +"3.9 到 3.10)。但是,它不会在问题修正发布版中改变(例如从 3.10.0 到 3.10.1)。" + +#: ../../c-api/stable.rst:49 +msgid "" +"It is generally intended for specialized, low-level tools like debuggers." +msgstr "它通常是针对专门的,低层级的工具如调试器等。" + +#: ../../c-api/stable.rst:51 +msgid "" +"Projects that use this API are expected to follow CPython development and " +"spend extra effort adjusting to changes." +msgstr "使用此 API 的项目需要跟随 CPython 开发进程并花费额外的努力来适应改变。" + +#: ../../c-api/stable.rst:58 +msgid "Stable Application Binary Interfaces" +msgstr "稳定应用程序二进制接口" + +#: ../../c-api/stable.rst:60 +msgid "" +"Python's :dfn:`Stable ABI` allows extensions to be compatible with multiple " +"versions of Python, without recompilation." +msgstr "" + +#: ../../c-api/stable.rst:65 +msgid "" +"For simplicity, this document talks about *extensions*, but Stable ABI works" +" the same way for all uses of the API – for example, embedding Python." +msgstr "" + +#: ../../c-api/stable.rst:68 +msgid "There are two Stable ABIs:" +msgstr "" + +#: ../../c-api/stable.rst:70 +msgid "" +"``abi3``, introduced in Python 3.2, is compatible with **non**-:term:`free-" +"threaded ` builds of CPython." +msgstr "" + +#: ../../c-api/stable.rst:73 +msgid "" +"``abi3t``, introduced in Python 3.15, is compatible with :term:`free-" +"threaded ` builds of CPython. It has stricter API " +"limitations than ``abi3``." +msgstr "" + +#: ../../c-api/stable.rst:79 +msgid "``abi3t`` was added in :pep:`803`" +msgstr "" + +#: ../../c-api/stable.rst:81 +msgid "" +"It is possible for an extension to be compiled for *both* ``abi3`` and " +"``abi3t`` at the same time; the result will be compatible with both free-" +"threaded and non-free-threaded builds of Python. Currently, this has no " +"downsides compared to compiling for ``abi3t`` only." +msgstr "" + +#: ../../c-api/stable.rst:86 +msgid "" +"Each Stable ABI is versioned using the first two numbers of the Python " +"version. For example, Stable ABI 3.14 corresponds to Python 3.14. An " +"extension compiled for Stable ABI 3.x is ABI-compatible with Python 3.x and " +"above." +msgstr "" + +#: ../../c-api/stable.rst:91 +msgid "" +"Extensions that target a stable ABI must only use a limited subset of the C " +"API. This subset is known as the :dfn:`Limited API`; its contents are " +":ref:`listed below `." +msgstr "" + +#: ../../c-api/stable.rst:95 +msgid "" +"On Windows, extensions that use a Stable ABI should be linked against " +"``python3.dll`` rather than a version-specific library such as " +"``python39.dll``. This library only exposes the relevant symbols." +msgstr "" + +#: ../../c-api/stable.rst:100 +msgid "" +"On some platforms, Python will look for and load shared library files named " +"with the ``abi3`` or ``abi3t`` tag (for example, ``mymodule.abi3.so``). " +":term:`Free-threaded ` interpreters only recognize the " +"``abi3t`` tag, while non-free-threaded ones will prefer ``abi3`` but fall " +"back to ``abi3t``. Thus, extensions compatible with both ABIs should use the" +" ``abi3t`` tag." +msgstr "" + +#: ../../c-api/stable.rst:107 +msgid "" +"Python does not necessarily check that extensions it loads have compatible " +"ABI. Extension authors are encouraged to add a check using the " +":c:macro:`Py_mod_abi` slot or the :c:func:`PyABIInfo_Check` function, but " +"the user (or their packaging tool) is ultimately responsible for ensuring " +"that, for example, extensions built for Stable ABI 3.10 are not installed " +"for lower versions of Python." +msgstr "" + +#: ../../c-api/stable.rst:115 +msgid "" +"All functions in Stable ABI are present as functions in Python's shared " +"library, not solely as macros. This makes them usable are usable from " +"languages that don't use the C preprocessor, including Python's " +":py:mod:`ctypes`." +msgstr "" + +#: ../../c-api/stable.rst:124 +msgid "Compiling for Stable ABI" +msgstr "" + +#: ../../c-api/stable.rst:128 +msgid "" +"Build tools (such as, for example, meson-python, scikit-build-core, or " +"Setuptools) often have a mechanism for setting macros and synchronizing them" +" with extension filenames and other metadata. Prefer using such a mechanism," +" if it exists, over defining the macros manually." +msgstr "" + +#: ../../c-api/stable.rst:134 +msgid "" +"The rest of this section is mainly relevant for tool authors, and for people" +" who compile extensions manually." +msgstr "" + +#: ../../c-api/stable.rst:137 +msgid "`list of recommended tools`_ in the Python Packaging User Guide" +msgstr "" + +#: ../../c-api/stable.rst:141 +msgid "" +"To compile for a Stable ABI, define one or both of the following macros to " +"the lowest Python version your extension should support, in " +":c:macro:`Py_PACK_VERSION` format. Typically, you should choose a specific " +"value rather than the version of the Python headers you are compiling " +"against." +msgstr "" + +#: ../../c-api/stable.rst:147 +msgid "" +"The macros must be defined before including ``Python.h``. Since " +":c:macro:`Py_PACK_VERSION` is not available at this point, you will need to " +"use the numeric value directly. For reference, the values for a few recent " +"Python versions are:" +msgstr "" + +#: ../../c-api/stable.rst:1 +msgid "" +"0x30a0000 /* Py_PACK_VERSION(3.10) */\n" +"0x30b0000 /* Py_PACK_VERSION(3.11) */\n" +"0x30c0000 /* Py_PACK_VERSION(3.12) */\n" +"0x30d0000 /* Py_PACK_VERSION(3.13) */\n" +"0x30e0000 /* Py_PACK_VERSION(3.14) */\n" +"0x30f0000 /* Py_PACK_VERSION(3.15) */" +msgstr "" + +#: ../../c-api/stable.rst:154 +msgid "" +"When one of the macros is defined, ``Python.h`` will only expose API that is" +" compatible with the given Stable ABI -- that is, the :ref:`Limited API " +"` plus some definitions that need to be visible to the " +"compiler but should not be used directly. When both are defined, " +"``Python.h`` will only expose API compatible with both Stable ABIs." +msgstr "" + +#: ../../c-api/stable.rst:163 +msgid "" +"Target ``abi3``, that is, non-:term:`free-threaded builds ` of CPython. See :ref:`above ` for common " +"information." +msgstr "" + +#: ../../c-api/stable.rst:169 +msgid "" +"Target ``abi3t``, that is, :term:`free-threaded builds ` of CPython. See :ref:`above ` for common " +"information." +msgstr "" + +#: ../../c-api/stable.rst:175 +msgid "" +"Both macros specify a target ABI; the different naming style is due to " +"backwards compatibility." +msgstr "" + +#: ../../c-api/stable.rst:178 +msgid "Historical note" +msgstr "" + +#: ../../c-api/stable.rst:180 +msgid "" +"You can also define ``Py_LIMITED_API`` as ``3``. This works the same as " +"``0x03020000`` (Python 3.2, the version that introduced Stable ABI)." +msgstr "" + +#: ../../c-api/stable.rst:183 +msgid "" +"When both are defined, ``Python.h`` may, or may not, redefine " +":c:macro:`!Py_LIMITED_API` to match :c:macro:`!Py_TARGET_ABI3T`." +msgstr "" + +#: ../../c-api/stable.rst:186 +msgid "" +"On a :term:`free-threaded build` -- that is, when :c:macro:`Py_GIL_DISABLED`" +" is defined -- :c:macro:`!Py_TARGET_ABI3T` defaults to the value of " +":c:macro:`!Py_LIMITED_API`. This means that there are two ways to build for " +"both ``abi3`` and ``abi3t``:" +msgstr "" + +#: ../../c-api/stable.rst:191 +msgid "" +"define both :c:macro:`!Py_LIMITED_API` and :c:macro:`!Py_TARGET_ABI3T`, or" +msgstr "" + +#: ../../c-api/stable.rst:192 +msgid "define only :c:macro:`!Py_LIMITED_API` and:" +msgstr "" + +#: ../../c-api/stable.rst:194 +msgid "on Windows, define :c:macro:`!Py_GIL_DISABLED`;" +msgstr "" + +#: ../../c-api/stable.rst:195 +msgid "on other systems, use the headers of free-threaded build of Python." +msgstr "" + +#: ../../c-api/stable.rst:201 +msgid "Stable ABI Scope and Performance" +msgstr "" + +#: ../../c-api/stable.rst:203 +msgid "" +"The goal for Stable ABI is to allow everything that is possible with the " +"full C API, but possibly with a performance penalty. Generally, " +"compatibility with Stable ABI will require some changes to an extension's " +"source code." +msgstr "" + +#: ../../c-api/stable.rst:208 +msgid "" +"For example, while :c:func:`PyList_GetItem` is available, its \"unsafe\" " +"macro variant :c:func:`PyList_GET_ITEM` is not. The macro can be faster " +"because it can rely on version-specific implementation details of the list " +"object." +msgstr "" + +#: ../../c-api/stable.rst:213 +msgid "" +"For another example, when *not* compiling for Stable ABI, some C API " +"functions are inlined or replaced by macros. Compiling for Stable ABI " +"disables this inlining, allowing stability as Python's data structures are " +"improved, but possibly reducing performance." +msgstr "" + +#: ../../c-api/stable.rst:218 +msgid "" +"By leaving out the :c:macro:`!Py_LIMITED_API` or :c:macro:`!Py_TARGET_ABI3T`" +" definition, it is possible to compile Stable-ABI-compatible source for a " +"version-specific ABI. A potentially faster version-specific extension can " +"then be distributed alongside a version compiled for Stable ABI -- a slower " +"but more compatible fallback." +msgstr "" + +#: ../../c-api/stable.rst:229 +msgid "Stable ABI Caveats" +msgstr "" + +#: ../../c-api/stable.rst:231 +msgid "" +"Note that compiling for Stable ABI is *not* a complete guarantee that code " +"will be compatible with the expected Python versions. Stable ABI prevents " +"*ABI* issues, like linker errors due to missing symbols or data corruption " +"due to changes in structure layouts or function signatures. However, other " +"changes in Python can change the *behavior* of extensions." +msgstr "" + +#: ../../c-api/stable.rst:238 +msgid "" +"One issue that the :c:macro:`Py_TARGET_ABI3T` and :c:macro:`Py_LIMITED_API` " +"macros do not guard against is calling a function with arguments that are " +"invalid in a lower Python version. For example, consider a function that " +"starts accepting ``NULL`` for an argument. In Python 3.9, ``NULL`` now " +"selects a default behavior, but in Python 3.8, the argument will be used " +"directly, causing a ``NULL`` dereference and crash. A similar argument works" +" for fields of structs." +msgstr "" + +#: ../../c-api/stable.rst:246 +msgid "" +"For these reasons, we recommend testing an extension with *all* minor Python" +" versions it supports." +msgstr "" + +#: ../../c-api/stable.rst:249 +msgid "" +"We also recommend reviewing documentation of all used API to check if it is " +"explicitly part of the Limited API. Even with ``Py_LIMITED_API`` defined, a " +"few private declarations are exposed for technical reasons (or even " +"unintentionally, as bugs)." +msgstr "" +"我们还建议查看所使用 API 的全部文档以检查其是否显式指明为受限 API 的一部分。即使定义了 " +"``Py_LIMITED_API``,少数私有声明还是会出于技术原因(或者甚至是作为程序缺陷在无意中)被暴露出来。" + +#: ../../c-api/stable.rst:254 +msgid "" +"Also note that while compiling with ``Py_LIMITED_API`` 3.8 means that the " +"extension should *load* on Python 3.12, and *compile* with Python 3.12, the " +"same source will not necessarily compile with ``Py_LIMITED_API`` set to " +"3.12. In general, parts of the Limited API may be deprecated and removed, " +"provided that Stable ABI stays stable." +msgstr "" + +#: ../../c-api/stable.rst:265 +msgid "Platform Considerations" +msgstr "平台的考虑" + +#: ../../c-api/stable.rst:267 +msgid "" +"ABI stability depends not only on Python, but also on the compiler used, " +"lower-level libraries and compiler options. For the purposes of the " +":ref:`Stable ABIs `, these details define a “platform”. They " +"usually depend on the OS type and processor architecture" +msgstr "" + +#: ../../c-api/stable.rst:272 +msgid "" +"It is the responsibility of each particular distributor of Python to ensure " +"that all Python versions on a particular platform are built in a way that " +"does not break the Stable ABIs, or the version-specific ABIs. This is the " +"case with Windows and macOS releases from ``python.org`` and many third-" +"party distributors." +msgstr "" + +#: ../../c-api/stable.rst:280 +msgid "ABI Checking" +msgstr "" + +#: ../../c-api/stable.rst:284 +msgid "Python includes a rudimentary check for ABI compatibility." +msgstr "" + +#: ../../c-api/stable.rst:286 +msgid "" +"This check is not comprehensive. It only guards against common cases of " +"incompatible modules being installed for the wrong interpreter. It also does" +" not take :ref:`platform incompatibilities ` into " +"account. It can only be done after an extension is successfully loaded." +msgstr "" + +#: ../../c-api/stable.rst:293 +msgid "" +"Despite these limitations, it is recommended that extension modules use this" +" mechanism, so that detectable incompatibilities raise exceptions rather " +"than crash." +msgstr "" + +#: ../../c-api/stable.rst:297 +msgid "" +"Most modules can use this check via the :c:data:`Py_mod_abi` slot and the " +":c:macro:`PyABIInfo_VAR` macro, for example like this:" +msgstr "" + +#: ../../c-api/stable.rst:300 +msgid "" +"PyABIInfo_VAR(abi_info);\n" +"\n" +"static PyModuleDef_Slot mymodule_slots[] = {\n" +" {Py_mod_abi, &abi_info},\n" +" ...\n" +"};" +msgstr "" + +#: ../../c-api/stable.rst:310 +msgid "The full API is described below for advanced use cases." +msgstr "" + +#: ../../c-api/stable.rst:314 +msgid "" +"Verify that the given *info* is compatible with the currently running " +"interpreter." +msgstr "" + +#: ../../c-api/stable.rst:317 +msgid "Return 0 on success. On failure, raise an exception and return -1." +msgstr "" + +#: ../../c-api/stable.rst:319 +msgid "" +"If the ABI is incompatible, the raised exception will be " +":py:exc:`ImportError`." +msgstr "" + +#: ../../c-api/stable.rst:321 +msgid "" +"The *module_name* argument can be ``NULL``, or point to a NUL-terminated " +"UTF-8-encoded string used for error messages." +msgstr "" + +#: ../../c-api/stable.rst:324 +msgid "" +"Note that if *info* describes the ABI that the current code uses (as defined" +" by :c:macro:`PyABIInfo_VAR`, for example), using any other Python C API may" +" lead to crashes. In particular, it is not safe to examine the raised " +"exception." +msgstr "" + +#: ../../c-api/stable.rst:333 +msgid "" +"Define a static :c:struct:`PyABIInfo` variable with the given *NAME* that " +"describes the ABI that the current code will use. This macro expands to:" +msgstr "" + +#: ../../c-api/stable.rst:337 +msgid "" +"static PyABIInfo NAME = {\n" +" 1, 0,\n" +" PyABIInfo_DEFAULT_FLAGS,\n" +" PY_VERSION_HEX,\n" +" PyABIInfo_DEFAULT_ABI_VERSION\n" +"}" +msgstr "" + +#: ../../c-api/stable.rst:352 +msgid "The major version of :c:struct:`PyABIInfo`. Can be set to:" +msgstr "" + +#: ../../c-api/stable.rst:354 +msgid "``0`` to skip all checking, or" +msgstr "" + +#: ../../c-api/stable.rst:355 +msgid "``1`` to specify this version of :c:struct:`!PyABIInfo`." +msgstr "" + +#: ../../c-api/stable.rst:359 +msgid "" +"The minor version of :c:struct:`PyABIInfo`. Must be set to ``0``; larger " +"values are reserved for backwards-compatible future versions of " +":c:struct:`!PyABIInfo`." +msgstr "" + +#: ../../c-api/stable.rst:367 +msgid "This field is usually set to the following macro:" +msgstr "" + +#: ../../c-api/stable.rst:371 +msgid "" +"Default flags, based on current values of macros such as " +":c:macro:`Py_LIMITED_API` and :c:macro:`Py_GIL_DISABLED`." +msgstr "" + +#: ../../c-api/stable.rst:374 +msgid "" +"Alternately, the field can be set to the following flags, combined by " +"bitwise OR. Unused bits must be set to zero." +msgstr "" + +#: ../../c-api/stable.rst:378 +msgid "ABI variant -- one of:" +msgstr "" + +#: ../../c-api/stable.rst:382 +msgid "Specifies that Stable ABI is used." +msgstr "" + +#: ../../c-api/stable.rst:386 +msgid "" +"Specifies ABI specific to a particular build of CPython. Internal use only." +msgstr "" + +#: ../../c-api/stable.rst:389 +msgid "Free-threading compatibility -- one of:" +msgstr "" + +#: ../../c-api/stable.rst:393 +msgid "" +"Specifies ABI compatible with :term:`free-threaded builds ` of CPython. (That is, ones compiled with :option:`--disable-gil`; " +"with ``t`` in :py:data:`sys.abiflags`)" +msgstr "" + +#: ../../c-api/stable.rst:400 +msgid "" +"Specifies ABI compatible with non-free-threaded builds of CPython (ones " +"compiled *without* :option:`--disable-gil`)." +msgstr "" + +#: ../../c-api/stable.rst:405 +msgid "" +"Specifies ABI compatible with both free-threaded and non-free-threaded " +"builds of CPython, that is, both ``abi3`` and ``abi3t``." +msgstr "" + +#: ../../c-api/stable.rst:411 +msgid "" +"The version of the Python headers used to build the code, in the format used" +" by :c:macro:`PY_VERSION_HEX`." +msgstr "" + +#: ../../c-api/stable.rst:414 +msgid "" +"This can be set to ``0`` to skip any checks related to this field. This " +"option is meant mainly for projects that do not use the CPython headers " +"directly, and do not emulate a specific version of them." +msgstr "" + +#: ../../c-api/stable.rst:420 +msgid "The ABI version." +msgstr "" + +#: ../../c-api/stable.rst:422 +msgid "" +"For Stable ABI, this field should be the value of :c:macro:`Py_LIMITED_API` " +"or :c:macro:`Py_TARGET_ABI3T`. If both are defined, use the smaller value. " +"(If :c:macro:`Py_LIMITED_API` is ``3``; use :c:expr:`Py_PACK_VERSION(3, 2)` " +"instead of ``3``.)" +msgstr "" + +#: ../../c-api/stable.rst:428 +msgid "Otherwise, it should be set to :c:macro:`PY_VERSION_HEX`." +msgstr "" + +#: ../../c-api/stable.rst:430 +msgid "It can also be set to ``0`` to skip any checks related to this field." +msgstr "" + +#: ../../c-api/stable.rst:436 +msgid "" +"The value that should be used for this field, based on current values of " +"macros such as :c:macro:`Py_LIMITED_API`, :c:macro:`PY_VERSION_HEX` and " +":c:macro:`Py_GIL_DISABLED`." +msgstr "" + +#: ../../c-api/stable.rst:447 +msgid "Contents of Limited API" +msgstr "受限 API 的内容" + +#: ../../c-api/stable.rst:449 +msgid "" +"This is the definitive list of :ref:`Limited API ` for Python" +" |version|:" +msgstr "" + +#: ../../c-api/stable.rst:42 +msgid "PyUnstable" +msgstr "PyUnstable" diff --git a/c-api/structures.po b/c-api/structures.po new file mode 100644 index 0000000000..3f3ecd43af --- /dev/null +++ b/c-api/structures.po @@ -0,0 +1,1350 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/structures.rst:6 +msgid "Common Object Structures" +msgstr "公用对象结构体" + +#: ../../c-api/structures.rst:8 +msgid "" +"There are a large number of structures which are used in the definition of " +"object types for Python. This section describes these structures and how " +"they are used." +msgstr "大量的结构体被用于定义 Python 的对象类型。这一节描述了这些的结构体和它们的使用方法。" + +#: ../../c-api/structures.rst:14 +msgid "Base object types and macros" +msgstr "基本的对象类型和宏" + +#: ../../c-api/structures.rst:16 +msgid "" +"All Python objects ultimately share a small number of fields at the " +"beginning of the object's representation in memory. These are represented " +"by the :c:type:`PyObject` and :c:type:`PyVarObject` types, which are " +"defined, in turn, by the expansions of some macros also used, whether " +"directly or indirectly, in the definition of all other Python objects. " +"Additional macros can be found under :ref:`reference counting " +"`." +msgstr "" +"所有的 Python 对象最终都会在对象的内存表示的开始部分共享少量的字段。这些字段由 :c:type:`PyObject` 和 " +":c:type:`PyVarObject` 类型来表示,相应地,这些类型又是由一些宏扩展来定义的,它们也直接或间接地被用于所有其他 Python " +"对象的定义。附加的宏可以在 :ref:`引用计数 ` 下找到。" + +#: ../../c-api/structures.rst:26 +msgid "" +"All object types are extensions of this type. This is a type which contains" +" the information Python needs to treat a pointer to an object as an object." +" In a normal \"release\" build, it contains only the object's reference " +"count and a pointer to the corresponding type object. Nothing is actually " +"declared to be a :c:type:`PyObject`, but every pointer to a Python object " +"can be cast to a :c:expr:`PyObject*`." +msgstr "" +"所有对象类型都是此类型的扩展。这是一个包含 Python " +"需要将对象指针视为对象所需信息的类型。在正常的“发布”构建版本中,它仅包含对象的引用计数和指向相应类型对象的指针。虽然没有任何内容被显式声明为 " +":c:type:`PyObject` 类型,但所有指向 Python 对象的指针都可以被强制转换为 :c:expr:`PyObject*` 类型。" + +#: ../../c-api/structures.rst:33 +msgid "" +"The members must not be accessed directly; instead use macros such as " +":c:macro:`Py_REFCNT` and :c:macro:`Py_TYPE`." +msgstr "成员不得直接访问;而应使用诸如 :c:macro:`Py_REFCNT` 和 :c:macro:`Py_TYPE` 之类的宏。" + +#: ../../c-api/structures.rst:38 +msgid "" +"The object's reference count, as returned by :c:macro:`Py_REFCNT`. Do not " +"use this field directly; instead use functions and macros such as " +":c:macro:`!Py_REFCNT`, :c:func:`Py_INCREF` and :c:func:`Py_DecRef`." +msgstr "" +"对象的引用计数,由 :c:macro:`Py_REFCNT` 返回。不要直接使用此字段;而应使用函数和宏,如 " +":c:macro:`!Py_REFCNT`,:c:func:`Py_INCREF` 和 :c:func:`Py_DecRef`。" + +#: ../../c-api/structures.rst:42 +msgid "" +"The field type may be different from ``Py_ssize_t``, depending on build " +"configuration and platform." +msgstr "字段类型可能不同于 ``Py_ssize_t``,具体取决于构建配置和平台。" + +#: ../../c-api/structures.rst:47 +msgid "" +"The object's type. Do not use this field directly; use :c:macro:`Py_TYPE` " +"and :c:func:`Py_SET_TYPE` instead." +msgstr "对象的类型。不要直接使用此字段;而应使用 :c:macro:`Py_TYPE` 和 :c:func:`Py_SET_TYPE`。" + +#: ../../c-api/structures.rst:54 +msgid "" +"An extension of :c:type:`PyObject` that adds the " +":c:member:`~PyVarObject.ob_size` field. This is intended for objects that " +"have some notion of *length*." +msgstr "" +":c:type:`PyObject` 的扩展,添加了 :c:member:`~PyVarObject.ob_size` 字段。这适用于具有某种 *长度*" +" 概念的对象。" + +#: ../../c-api/structures.rst:58 +msgid "" +"As with :c:type:`!PyObject`, the members must not be accessed directly; " +"instead use macros such as :c:macro:`Py_SIZE`, :c:macro:`Py_REFCNT` and " +":c:macro:`Py_TYPE`." +msgstr "" +"与 :c:type:`!PyObject` 一样,成员不得直接访问;而应使用诸如 " +":c:macro:`Py_SIZE`,:c:macro:`Py_REFCNT` 和 :c:macro:`Py_TYPE` 之类的宏。" + +#: ../../c-api/structures.rst:64 +msgid "" +"A size field, whose contents should be considered an object's internal " +"implementation detail." +msgstr "一个大小字段,其内容应被视为对象的内部实现细节。" + +#: ../../c-api/structures.rst:67 +msgid "Do not use this field directly; use :c:macro:`Py_SIZE` instead." +msgstr "不要直接使用此字段;而应使用 :c:macro:`Py_SIZE`。" + +#: ../../c-api/structures.rst:69 +msgid "" +"Object creation functions such as :c:func:`PyObject_NewVar` will generally " +"set this field to the requested size (number of items). After creation, " +"arbitrary values can be stored in :c:member:`!ob_size` using " +":c:macro:`Py_SET_SIZE`." +msgstr "" +"对象创建函数,如 :c:func:`PyObject_NewVar`,通常会将此字段设置为请求的大小(条目数)。创建后,可以使用 " +":c:macro:`Py_SET_SIZE` 在 :c:member:`!ob_size` 中存储任意值。" + +#: ../../c-api/structures.rst:74 +msgid "" +"To get an object's publicly exposed length, as returned by the Python " +"function :py:func:`len`, use :c:func:`PyObject_Length` instead." +msgstr "" +"若需获取对象公开暴露的长度(即 Python 内置函数 :py:func:`len` 所返回的值),应使用 " +":c:func:`PyObject_Length` 接口。" + +#: ../../c-api/structures.rst:81 +msgid "" +"This is a macro used when declaring new types which represent objects " +"without a varying length. The PyObject_HEAD macro expands to::" +msgstr "这是一个在声明新类型时使用的宏,用于表示不包含可变长度成员的对象。PyObject_HEAD 宏展开后为:" + +#: ../../c-api/structures.rst:84 +msgid "PyObject ob_base;" +msgstr "PyObject ob_base;" + +#: ../../c-api/structures.rst:86 +msgid "See documentation of :c:type:`PyObject` above." +msgstr "参见上面 :c:type:`PyObject` 的文档。" + +#: ../../c-api/structures.rst:91 +msgid "" +"This is a macro used when declaring new types which represent objects with a" +" length that varies from instance to instance. The PyObject_VAR_HEAD macro " +"expands to::" +msgstr "这是一个在声明代表每个实例具有可变长度的对象时所使用的宏。PyObject_VAR_HEAD 宏被扩展为::" + +#: ../../c-api/structures.rst:95 +msgid "PyVarObject ob_base;" +msgstr "PyVarObject ob_base;" + +#: ../../c-api/structures.rst:97 +msgid "See documentation of :c:type:`PyVarObject` above." +msgstr "参见上面 :c:type:`PyVarObject` 的文档。" + +#: ../../c-api/structures.rst:102 +msgid "" +"The base class of all other objects, the same as :class:`object` in Python." +msgstr "所有其他对象的基类,与 Python 中的 :class:`object` 相同。" + +#: ../../c-api/structures.rst:107 +msgid "" +"Test if the *x* object is the *y* object, the same as ``x is y`` in Python." +msgstr "测试 *x* 是否为 *y* 对象,与 Python 中的 ``x is y`` 相同。" + +#: ../../c-api/structures.rst:114 +msgid "" +"Test if an object is the ``None`` singleton, the same as ``x is None`` in " +"Python." +msgstr "测试一个对象是否为 ``None`` 单例,与 Python 中的 ``x is None`` 相同。" + +#: ../../c-api/structures.rst:122 +msgid "" +"Test if an object is the ``True`` singleton, the same as ``x is True`` in " +"Python." +msgstr "测试一个对象是否为 ``True`` 单例,与 Python 中的 ``x is True`` 相同。" + +#: ../../c-api/structures.rst:130 +msgid "" +"Test if an object is the ``False`` singleton, the same as ``x is False`` in " +"Python." +msgstr "测试一个对象是否为 ``False`` 单例,与 Python 中的 ``x is False`` 相同。" + +#: ../../c-api/structures.rst:138 +msgid "Get the type of the Python object *o*." +msgstr "获取 Python 对象 *o* 的类型。" + +#: ../../c-api/structures.rst:140 +msgid "" +"The returned reference is :term:`borrowed ` from *o*. Do" +" not release it with :c:func:`Py_DECREF` or similar." +msgstr "" +"返回的引用是从 *o* :term:`借用的 `。不要使用 :c:func:`Py_DECREF` " +"或类似方法释放它。" + +#: ../../c-api/structures.rst:143 +msgid "" +":c:func:`Py_TYPE()` is changed to an inline static function. The parameter " +"type is no longer :c:expr:`const PyObject*`." +msgstr ":c:func:`Py_TYPE()` 被改为一个内联的静态函数。形参类型不再是 :c:expr:`const PyObject*`。" + +#: ../../c-api/structures.rst:150 +msgid "" +"Return non-zero if the object *o* type is *type*. Return zero otherwise. " +"Equivalent to: ``Py_TYPE(o) == type``." +msgstr "如果对象 *o* 的类型为 *type* 则返回非零值。 否则返回零。 等价于: ``Py_TYPE(o) == type``。" + +#: ../../c-api/structures.rst:158 +msgid "" +"Set the type of object *o* to *type*, without any checking or reference " +"counting." +msgstr "将对象 *o* 的类型设置为 *type*,不进行任何检查或引用计数。" + +#: ../../c-api/structures.rst:161 +msgid "" +"This is a very low-level operation. Consider instead setting the Python " +"attribute :attr:`~object.__class__` using :c:func:`PyObject_SetAttrString` " +"or similar." +msgstr "" +"这是一个非常低级的操作。建议改为使用 :c:func:`PyObject_SetAttrString` 或类似方法设置 Python 属性 " +":attr:`~object.__class__`." + +#: ../../c-api/structures.rst:165 +msgid "" +"Note that assigning an incompatible type can lead to undefined behavior." +msgstr "请注意,分配不兼容的类型可能会导致未定义行为。" + +#: ../../c-api/structures.rst:167 +msgid "" +"If *type* is a :ref:`heap type `, the caller must create a new " +"reference to it. Similarly, if the old type of *o* is a heap type, the " +"caller must release a reference to that type." +msgstr "" +"如果 *type* 是一个 :ref:`堆类型 `,调用者必须为其创建一个新的引用。同样地,如果 *o* " +"的旧类型是堆类型,调用者必须释放对该类型的引用。" + +#: ../../c-api/structures.rst:177 +msgid "Get the :c:member:`~PyVarObject.ob_size` field of *o*." +msgstr "获取 *o* 的 :c:member:`~PyVarObject.ob_size` 字段。" + +#: ../../c-api/structures.rst:179 +msgid "" +":c:func:`Py_SIZE()` is changed to an inline static function. The parameter " +"type is no longer :c:expr:`const PyVarObject*`." +msgstr ":c:func:`Py_SIZE()` 被改为一个内联静态函数。形参类型不再是 :c:expr:`const PyVarObject*`。" + +#: ../../c-api/structures.rst:186 +msgid "Set the :c:member:`~PyVarObject.ob_size` field of *o* to *size*." +msgstr "将 *o* 的 :c:member:`~PyVarObject.ob_size` 字段设置为 *size*。" + +#: ../../c-api/structures.rst:193 +msgid "" +"This is a macro which expands to initialization values for a new " +":c:type:`PyObject` type. This macro expands to::" +msgstr "这是一个为新的 :c:type:`PyObject` 类型扩展初始化值的宏。该宏扩展为::" + +#: ../../c-api/structures.rst:196 +msgid "" +"_PyObject_EXTRA_INIT\n" +"1, type," +msgstr "" +"_PyObject_EXTRA_INIT\n" +"1, type," + +#: ../../c-api/structures.rst:202 +msgid "" +"This is a macro which expands to initialization values for a new " +":c:type:`PyVarObject` type, including the :c:member:`~PyVarObject.ob_size` " +"field. This macro expands to::" +msgstr "" +"这是一个为新的 :c:type:`PyVarObject` 类型扩展初始化值的宏,包括 :c:member:`~PyVarObject.ob_size`" +" 字段。该宏会扩展为::" + +#: ../../c-api/structures.rst:206 +msgid "" +"_PyObject_EXTRA_INIT\n" +"1, type, size," +msgstr "" +"_PyObject_EXTRA_INIT\n" +"1, type, size," + +#: ../../c-api/structures.rst:211 +msgid "Implementing functions and methods" +msgstr "实现函数和方法" + +#: ../../c-api/structures.rst:215 +msgid "" +"Type of the functions used to implement most Python callables in C. " +"Functions of this type take two :c:expr:`PyObject*` parameters and return " +"one such value. If the return value is ``NULL``, an exception shall have " +"been set. If not ``NULL``, the return value is interpreted as the return " +"value of the function as exposed in Python. The function must return a new " +"reference." +msgstr "" +"用于在 C 中实现大多数 Python 可调用对象的函数类型。该类型的函数接受两个 :c:expr:`PyObject*` 形参并返回一个这样的值。 " +"如果返回值为 ``NULL``,则将设置一个异常。如果不为 ``NULL``,则返回值将被解读为 Python 中暴露的函数的返回值。 " +"此函数必须返回一个新的引用。" + +#: ../../c-api/structures.rst:222 +msgid "The function signature is::" +msgstr "函数的签名为::" + +#: ../../c-api/structures.rst:224 +msgid "" +"PyObject *PyCFunction(PyObject *self,\n" +" PyObject *args);" +msgstr "" +"PyObject *PyCFunction(PyObject *self,\n" +" PyObject *args);" + +#: ../../c-api/structures.rst:229 +msgid "" +"Type of the functions used to implement Python callables in C with signature" +" :ref:`METH_VARARGS | METH_KEYWORDS `. The " +"function signature is::" +msgstr "" +"用于在 C 中实现具有 :ref:`METH_VARARGS | METH_KEYWORDS `" +" 签名的 Python 可调用对象的函数类型。函数的签名为::" + +#: ../../c-api/structures.rst:233 +msgid "" +"PyObject *PyCFunctionWithKeywords(PyObject *self,\n" +" PyObject *args,\n" +" PyObject *kwargs);" +msgstr "" +"PyObject *PyCFunctionWithKeywords(PyObject *self,\n" +" PyObject *args,\n" +" PyObject *kwargs);" + +#: ../../c-api/structures.rst:240 +msgid "" +"Type of the functions used to implement Python callables in C with signature" +" :c:macro:`METH_FASTCALL`. The function signature is::" +msgstr "用于在 C 中实现具有 :c:macro:`METH_FASTCALL` 签名的 Python 可调用对象的函数类型。函数的签名为::" + +#: ../../c-api/structures.rst:244 +msgid "" +"PyObject *PyCFunctionFast(PyObject *self,\n" +" PyObject *const *args,\n" +" Py_ssize_t nargs);" +msgstr "" +"PyObject *PyCFunctionFast(PyObject *self,\n" +" PyObject *const *args,\n" +" Py_ssize_t nargs);" + +#: ../../c-api/structures.rst:250 +msgid "" +"Type of the functions used to implement Python callables in C with signature" +" :ref:`METH_FASTCALL | METH_KEYWORDS `. The " +"function signature is::" +msgstr "" +"用于在 C 中实现具有 :ref:`METH_FASTCALL | METH_KEYWORDS ` 签名的 Python 可调用对象的函数类型。函数的签名为::" + +#: ../../c-api/structures.rst:254 +msgid "" +"PyObject *PyCFunctionFastWithKeywords(PyObject *self,\n" +" PyObject *const *args,\n" +" Py_ssize_t nargs,\n" +" PyObject *kwnames);" +msgstr "" +"PyObject *PyCFunctionFastWithKeywords(PyObject *self,\n" +" PyObject *const *args,\n" +" Py_ssize_t nargs,\n" +" PyObject *kwnames);" + +#: ../../c-api/structures.rst:261 +msgid "" +"Type of the functions used to implement Python callables in C with signature" +" :ref:`METH_METHOD | METH_FASTCALL | METH_KEYWORDS `. The function signature is::" +msgstr "" +"用于在 C 中实现具有 :ref:`METH_METHOD | METH_FASTCALL | METH_KEYWORDS ` 签名的 Python 可调用对象的函数类型。函数的签名为::" + +#: ../../c-api/structures.rst:265 +msgid "" +"PyObject *PyCMethod(PyObject *self,\n" +" PyTypeObject *defining_class,\n" +" PyObject *const *args,\n" +" Py_ssize_t nargs,\n" +" PyObject *kwnames)" +msgstr "" +"PyObject *PyCMethod(PyObject *self,\n" +" PyTypeObject *defining_class,\n" +" PyObject *const *args,\n" +" Py_ssize_t nargs,\n" +" PyObject *kwnames)" + +#: ../../c-api/structures.rst:276 +msgid "" +"Structure used to describe a method of an extension type. This structure " +"has four fields:" +msgstr "用于描述一个扩展类型的方法的结构体。该结构体有四个字段:" + +#: ../../c-api/structures.rst:281 +msgid "Name of the method." +msgstr "方法的名称。" + +#: ../../c-api/structures.rst:285 +msgid "Pointer to the C implementation." +msgstr "指向 C 语言实现的指针。" + +#: ../../c-api/structures.rst:289 +msgid "Flags bits indicating how the call should be constructed." +msgstr "指明调用应当如何构建的旗标位。" + +#: ../../c-api/structures.rst:293 +msgid "Points to the contents of the docstring." +msgstr "指向文档字符串的内容。" + +#: ../../c-api/structures.rst:295 +msgid "" +"The :c:member:`~PyMethodDef.ml_meth` is a C function pointer. The functions " +"may be of different types, but they always return :c:expr:`PyObject*`. If " +"the function is not of the :c:type:`PyCFunction`, the compiler will require " +"a cast in the method table. Even though :c:type:`PyCFunction` defines the " +"first parameter as :c:expr:`PyObject*`, it is common that the method " +"implementation uses the specific C type of the *self* object." +msgstr "" +":c:member:`~PyMethodDef.ml_meth` 是一个 C 函数指针。该函数可以为不同类型,但它们将总是返回 " +":c:expr:`PyObject*`。如果该函数不属于 :c:type:`PyCFunction`,则编译器将要求在方法表中进行转换。尽管 " +":c:type:`PyCFunction` 将第一个参数定义为 :c:expr:`PyObject*`,但该方法的实现使用 *self* 对象的特定 C" +" 类型也很常见。" + +#: ../../c-api/structures.rst:303 +msgid "" +"The :c:member:`~PyMethodDef.ml_flags` field is a bitfield which can include " +"the following flags. The individual flags indicate either a calling " +"convention or a binding convention." +msgstr ":c:member:`~PyMethodDef.ml_flags` 字段是可以包含以下旗标的位字段。每个旗标表示一个调用惯例或绑定惯例。" + +#: ../../c-api/structures.rst:308 +msgid "There are these calling conventions:" +msgstr "调用惯例有如下这些:" + +#: ../../c-api/structures.rst:312 +msgid "" +"This is the typical calling convention, where the methods have the type " +":c:type:`PyCFunction`. The function expects two :c:expr:`PyObject*` values. " +"The first one is the *self* object for methods; for module functions, it is " +"the module object. The second parameter (often called *args*) is a tuple " +"object representing all arguments. This parameter is typically processed " +"using :c:func:`PyArg_ParseTuple` or :c:func:`PyArg_UnpackTuple`." +msgstr "" +"这是典型的调用惯例,其中方法的类型为 :c:type:`PyCFunction`。该函数接受两个 :c:expr:`PyObject*` 值。 " +"第一个是用于方法的 *self* 对象;对于模块函数,它将为模块对象。第二个形参 (常被命名为 *args*) 是一个代表所有参数的元组对象。 " +"该形参通常是使用 :c:func:`PyArg_ParseTuple` 或 :c:func:`PyArg_UnpackTuple` 来处理的。" + +#: ../../c-api/structures.rst:322 +msgid "" +"Can only be used in certain combinations with other flags: " +":ref:`METH_VARARGS | METH_KEYWORDS `, " +":ref:`METH_FASTCALL | METH_KEYWORDS ` and " +":ref:`METH_METHOD | METH_FASTCALL | METH_KEYWORDS `." +msgstr "" +"只能用于同其他旗标形成特定的组合: :ref:`METH_VARARGS | METH_KEYWORDS `, :ref:`METH_FASTCALL | METH_KEYWORDS ` 和 :ref:`METH_METHOD | METH_FASTCALL | METH_KEYWORDS " +"`." + +#: ../../c-api/structures.rst:330 +msgid ":c:expr:`METH_VARARGS | METH_KEYWORDS`" +msgstr ":c:expr:`METH_VARARGS | METH_KEYWORDS`" + +#: ../../c-api/structures.rst:331 +msgid "" +"Methods with these flags must be of type :c:type:`PyCFunctionWithKeywords`. " +"The function expects three parameters: *self*, *args*, *kwargs* where " +"*kwargs* is a dictionary of all the keyword arguments or possibly ``NULL`` " +"if there are no keyword arguments. The parameters are typically processed " +"using :c:func:`PyArg_ParseTupleAndKeywords`." +msgstr "" +"带有这些旗标的方法必须为 :c:type:`PyCFunctionWithKeywords` 类型。该函数接受三个形参:*self*, *args*, " +"*kwargs* 其中 *kwargs* 是一个包含所有关键字参数的字典或者如果没有关键字参数则可以为 ``NULL``。 这些形参通常是使用 " +":c:func:`PyArg_ParseTupleAndKeywords` 来处理的。" + +#: ../../c-api/structures.rst:340 +msgid "" +"Fast calling convention supporting only positional arguments. The methods " +"have the type :c:type:`PyCFunctionFast`. The first parameter is *self*, the " +"second parameter is a C array of :c:expr:`PyObject*` values indicating the " +"arguments and the third parameter is the number of arguments (the length of " +"the array)." +msgstr "" +"快速调用惯例仅支持位置参数。这些方法的类型为 :c:type:`PyCFunctionFast`。第一个形参为 " +"*self*,第二个形参是由表示位置参数的由 :c:expr:`PyObject*` 值组成的 C 数组而第三个形参是位置参数的数量(数组的长度)。" + +#: ../../c-api/structures.rst:350 +msgid "``METH_FASTCALL`` is now part of the :ref:`stable ABI `." +msgstr "``METH_FASTCALL`` 现在是 :ref:`稳定 ABI ` 的一部分。" + +#: ../../c-api/structures.rst:355 +msgid ":c:expr:`METH_FASTCALL | METH_KEYWORDS`" +msgstr ":c:expr:`METH_FASTCALL | METH_KEYWORDS`" + +#: ../../c-api/structures.rst:356 +msgid "" +"Extension of :c:macro:`METH_FASTCALL` supporting also keyword arguments, " +"with methods of type :c:type:`PyCFunctionFastWithKeywords`. Keyword " +"arguments are passed the same way as in the :ref:`vectorcall protocol " +"`: there is an additional fourth :c:expr:`PyObject*` parameter " +"which is a tuple representing the names of the keyword arguments (which are " +"guaranteed to be strings) or possibly ``NULL`` if there are no keywords. " +"The values of the keyword arguments are stored in the *args* array, after " +"the positional arguments." +msgstr "" +":c:macro:`METH_FASTCALL` 的扩展也支持关键字参数,它使用类型为 " +":c:type:`PyCFunctionFastWithKeywords` 的方法。关键字参数的传递方式与 :ref:`vectorcall 协议 " +"` 中的相同:还存在额外的第四个 :c:expr:`PyObject*` " +"形参,它是一个代表关键字参数名称(它会保证是字符串)的元组,或者如果没有关键字则可以是 ``NULL``。关键字参数的值存放在 *args* " +"数组中,在位置参数之后。" + +#: ../../c-api/structures.rst:371 +msgid "" +"Can only be used in the combination with other flags: :ref:`METH_METHOD | " +"METH_FASTCALL | METH_KEYWORDS `." +msgstr "" +"只能与其他旗标组合使用: :ref:`METH_METHOD | METH_FASTCALL | METH_KEYWORDS `." + +#: ../../c-api/structures.rst:377 +msgid ":c:expr:`METH_METHOD | METH_FASTCALL | METH_KEYWORDS`" +msgstr ":c:expr:`METH_METHOD | METH_FASTCALL | METH_KEYWORDS`" + +#: ../../c-api/structures.rst:378 +msgid "" +"Extension of :ref:`METH_FASTCALL | METH_KEYWORDS ` supporting the *defining class*, that is, the class that " +"contains the method in question. The defining class might be a superclass of" +" ``Py_TYPE(self)``." +msgstr "" +":ref:`METH_FASTCALL | METH_KEYWORDS ` 的扩展支持 " +"*定义式类*,也就是包含相应方法的类。定义式类可以是 ``Py_TYPE(self)`` 的超类。" + +#: ../../c-api/structures.rst:383 +msgid "" +"The method needs to be of type :c:type:`PyCMethod`, the same as for " +"``METH_FASTCALL | METH_KEYWORDS`` with ``defining_class`` argument added " +"after ``self``." +msgstr "" +"该方法必须为 :c:type:`PyCMethod` 类型,与在 ``self`` 之后添加了 ``defining_class`` 参数的 " +"``METH_FASTCALL | METH_KEYWORDS`` 一样。" + +#: ../../c-api/structures.rst:392 +msgid "" +"Methods without parameters don't need to check whether arguments are given " +"if they are listed with the :c:macro:`METH_NOARGS` flag. They need to be of" +" type :c:type:`PyCFunction`. The first parameter is typically named *self* " +"and will hold a reference to the module or object instance. In all cases " +"the second parameter will be ``NULL``." +msgstr "" +"没有形参的方法如果使用 :c:macro:`METH_NOARGS` 旗标列出,则无需检查是否给出了参数。它们必须为 " +":c:type:`PyCFunction` 类型。第一个形参通常被命名为 *self* 并将持有对模块或对象实例的引用。在所有情况下第二个形参都将为 " +"``NULL``." + +#: ../../c-api/structures.rst:398 +msgid "" +"The function must have 2 parameters. Since the second parameter is unused, " +":c:macro:`Py_UNUSED` can be used to prevent a compiler warning." +msgstr "该函数必须有 2 个形参。由于第二个形参不会被使用,:c:macro:`Py_UNUSED` 可以被用来防止编译器警告。" + +#: ../../c-api/structures.rst:404 +msgid "" +"Methods with a single object argument can be listed with the " +":c:macro:`METH_O` flag, instead of invoking :c:func:`PyArg_ParseTuple` with " +"a ``\"O\"`` argument. They have the type :c:type:`PyCFunction`, with the " +"*self* parameter, and a :c:expr:`PyObject*` parameter representing the " +"single argument." +msgstr "" +"具有一个单独对象参数的方法可使用 :c:macro:`METH_O` 旗标列出,而不必调用 :c:func:`PyArg_ParseTuple` 并附带" +" ``\"O\"`` 参数。它们的类型为 :c:type:`PyCFunction`,带有 *self* 形参,以及代表该单独参数的 " +":c:expr:`PyObject*` 形参。" + +#: ../../c-api/structures.rst:410 +msgid "" +"These two constants are not used to indicate the calling convention but the " +"binding when used with methods of classes. These may not be used for " +"functions defined for modules. At most one of these flags may be set for " +"any given method." +msgstr "" +"这两个常量不是被用来指明调用惯例而是在配合类方法使用时指明绑定。 它们不会被用于在模块上定义的函数。 对于任何给定方法这些旗标最多只会设置其中一个。" + +#: ../../c-api/structures.rst:420 +msgid "" +"The method will be passed the type object as the first parameter rather than" +" an instance of the type. This is used to create *class methods*, similar " +"to what is created when using the :func:`classmethod` built-in function." +msgstr "" +"该方法将接受类型对象而不是类型的实例作为第一个形参。它会被用于创建 *类方法*,类似于使用 :func:`classmethod` " +"内置函数所创建的结果。" + +#: ../../c-api/structures.rst:430 +msgid "" +"The method will be passed ``NULL`` as the first parameter rather than an " +"instance of the type. This is used to create *static methods*, similar to " +"what is created when using the :func:`staticmethod` built-in function." +msgstr "" +"该方法将接受 ``NULL`` 而不是类型的实例作为第一个形参。它会被用于创建 *静态方法*,类似于使用 :func:`staticmethod` " +"内置函数所创建的结果。" + +#: ../../c-api/structures.rst:434 +msgid "" +"One other constant controls whether a method is loaded in place of another " +"definition with the same method name." +msgstr "另一个常量控制方法是否将被载入来替代具有相同方法名的另一个定义。" + +#: ../../c-api/structures.rst:440 +msgid "" +"The method will be loaded in place of existing definitions. Without " +"*METH_COEXIST*, the default is to skip repeated definitions. Since slot " +"wrappers are loaded before the method table, the existence of a " +"*sq_contains* slot, for example, would generate a wrapped method named " +":meth:`~object.__contains__` and preclude the loading of a corresponding " +"PyCFunction with the same name. With the flag defined, the PyCFunction will" +" be loaded in place of the wrapper object and will co-exist with the slot. " +"This is helpful because calls to PyCFunctions are optimized more than " +"wrapper object calls." +msgstr "" +"该方法将被加载以替代现有的定义。如果没有 *METH_COEXIST*,默认将跳过重复的定义。由于槽位包装器会在方法表之前被加载,例如 当存在 " +"*sq_contains* 槽位时,将会生成一个名为 :meth:`~object.__contains__` 的已包装方法并阻止加载同名的相应 " +"PyCFunction。如果定义了此旗标,PyCFunction 将被加载以替代此包装器对象并与槽位共存。因为对 PyCFunction " +"的调用相比对包装器对象调用更为优化所以这是很有帮助的。" + +#: ../../c-api/structures.rst:453 +msgid "" +"The type object corresponding to Python C method objects. This is available " +"as :class:`types.BuiltinMethodType` in the Python layer." +msgstr "" +"对应 Python C 方法对象的类型对象。它在 Python 层面上为 :class:`types.BuiltinMethodType`。" + +#: ../../c-api/structures.rst:459 +msgid "" +"Return true if *op* is an instance of the :c:type:`PyCMethod_Type` type or a" +" subtype of it. This function always succeeds." +msgstr "如果 *op* 是 :c:type:`PyCMethod_Type` 类型或其子类型的实例则返回真值。此函数总是会成功执行。" + +#: ../../c-api/structures.rst:465 +msgid "" +"This is the same as :c:func:`PyCMethod_Check`, but does not account for " +"subtypes." +msgstr "此函数与 :c:func:`PyCMethod_Check` 类似,但不会考虑子类型。" + +#: ../../c-api/structures.rst:471 +msgid "" +"Turn *ml* into a Python :term:`callable` object. The caller must ensure that" +" *ml* outlives the :term:`callable`. Typically, *ml* is defined as a static " +"variable." +msgstr "" +"将 *ml* 转为一个 Python :term:`callable` 对象。调用方必须确保 *ml* 的生命期长于 " +":term:`callable`。通常,*ml* 会被定义为一个静态变量。" + +#: ../../c-api/structures.rst:475 +msgid "" +"The *self* parameter will be passed as the *self* argument to the C function" +" in ``ml->ml_meth`` when invoked. *self* can be ``NULL``." +msgstr "" +"*self* 形参将在调用时作为 ``ml->ml_meth`` 中 C 函数的 *self* 参数传入。 *self* 可以为 ``NULL``。" + +#: ../../c-api/structures.rst:479 +msgid "" +"The :term:`callable` object's ``__module__`` attribute can be set from the " +"given *module* argument. *module* should be a Python string, which will be " +"used as name of the module the function is defined in. If unavailable, it " +"can be set to :const:`None` or ``NULL``." +msgstr "" +":term:`callable` 对象的 ``__module__`` 属性可以根据给定的 *module* 参数来设置。 *module* 应为一个 " +"Python 字符串,它将被用作函数定义所在的模块名称。如果不可用,它将被设为 :const:`None` 或 ``NULL``。" + +#: ../../c-api/structures.rst:485 +msgid ":attr:`function.__module__`" +msgstr ":attr:`function.__module__`" + +#: ../../c-api/structures.rst:487 +msgid "" +"The *cls* parameter will be passed as the *defining_class* argument to the C" +" function. Must be set if :c:macro:`METH_METHOD` is set on ``ml->ml_flags``." +msgstr "" +"*cls* 形参将被作为 C 函数的 *defining_class* 参数传入。如果在 ``ml->ml_flags`` 上设置了 " +":c:macro:`METH_METHOD` 则必须设置该形参。" + +#: ../../c-api/structures.rst:496 +msgid "" +"The type object corresponding to Python C function objects. This is " +"available as :class:`types.BuiltinFunctionType` in the Python layer." +msgstr "" +"对应 Python C 函数对象的类型对象。它在 Python 层面上为 :class:`types.BuiltinFunctionType`。" + +#: ../../c-api/structures.rst:502 +msgid "" +"Return true if *op* is an instance of the :c:type:`PyCFunction_Type` type or" +" a subtype of it. This function always succeeds." +msgstr "如果 *op* 是 :c:type:`PyCFunction_Type` 类型或其子类型的实例则返回真值。此函数总是会成功执行。" + +#: ../../c-api/structures.rst:508 +msgid "" +"This is the same as :c:func:`PyCFunction_Check`, but does not account for " +"subtypes." +msgstr "此函数与 :c:func:`PyCFunction_Check` 类似,但不会考虑子类型。" + +#: ../../c-api/structures.rst:514 +msgid "Equivalent to ``PyCMethod_New(ml, self, module, NULL)``." +msgstr "等价于 ``PyCMethod_New(ml, self, module, NULL)``。" + +#: ../../c-api/structures.rst:519 +msgid "Equivalent to ``PyCMethod_New(ml, self, NULL, NULL)``." +msgstr "等价于 ``PyCMethod_New(ml, self, NULL, NULL)``。" + +#: ../../c-api/structures.rst:524 +msgid "" +"Get the function's flags on *func* as they were passed to " +":c:member:`~PyMethodDef.ml_flags`." +msgstr "获取 *func* 上的函数旗标,即传给 :c:member:`~PyMethodDef.ml_flags` 的值。" + +#: ../../c-api/structures.rst:527 ../../c-api/structures.rst:545 +#: ../../c-api/structures.rst:565 +msgid "" +"If *func* is not a C function object, this fails with an exception. *func* " +"must not be ``NULL``." +msgstr "如果 *func* 不是一个 C 函数对象,此函数执行将失败并引发异常。 *func* 不可为 ``NULL``。" + +#: ../../c-api/structures.rst:530 +msgid "" +"This function returns the function's flags on success, and ``-1`` with an " +"exception set on failure." +msgstr "此函数成功时返回函数的旗标,失败时返回 ``-1`` 并设置一个异常。" + +#: ../../c-api/structures.rst:536 +msgid "" +"This is the same as :c:func:`PyCFunction_GetFlags`, but without error or " +"type checking." +msgstr "此函数与 :c:func:`PyCFunction_GetFlags` 类似,但不带错误检测和类型检测。" + +#: ../../c-api/structures.rst:542 +msgid "" +"Get the function pointer on *func* as it was passed to " +":c:member:`~PyMethodDef.ml_meth`." +msgstr "获取 *func* 上的函数指针,即传给 :c:member:`~PyMethodDef.ml_meth` 的值。" + +#: ../../c-api/structures.rst:548 +msgid "" +"This function returns the function pointer on success, and ``NULL`` with an " +"exception set on failure." +msgstr "此函数成功时返回函数指针,失败时返回 ``NULL`` 并设置一个异常。" + +#: ../../c-api/structures.rst:554 +msgid "" +"This is the same as :c:func:`PyCFunction_GetFunction`, but without error or " +"type checking." +msgstr "此函数与 :c:func:`PyCFunction_GetFunction` 类似,但不带错误检测和类型检测。" + +#: ../../c-api/structures.rst:560 +msgid "" +"Get the \"self\" object on *func*. This is the object that would be passed " +"to the first argument of a :c:type:`PyCFunction`. For C function objects " +"created through a :c:type:`PyMethodDef` on a :c:type:`PyModuleDef`, this is " +"the resulting module object." +msgstr "" +"获取 *func* 上的 \"self\" 对象。即将被传给 :c:type:`PyCFunction` 的第一个参数的对象。对于通过 " +":c:type:`PyModuleDef` 上的 :c:type:`PyMethodDef` 创建的 C 函数对象,这将是结果模块对象。" + +#: ../../c-api/structures.rst:568 +msgid "" +"This function returns a :term:`borrowed reference` to the \"self\" object on" +" success, and ``NULL`` with an exception set on failure." +msgstr "" +"此函数成功时返回一个指向 \"self\" 对象的 :term:`borrowed reference`,失败时返回 ``NULL`` 并设置一个异常。" + +#: ../../c-api/structures.rst:574 +msgid "" +"This is the same as :c:func:`PyCFunction_GetSelf`, but without error or type" +" checking." +msgstr "此函数与 :c:func:`PyCFunction_GetSelf` 类似,但不带错误检测和类型检测。" + +#: ../../c-api/structures.rst:579 +msgid "Accessing attributes of extension types" +msgstr "访问扩展类型的属性" + +#: ../../c-api/structures.rst:583 +msgid "" +"Structure which describes an attribute of a type which corresponds to a C " +"struct member. When defining a class, put a NULL-terminated array of these " +"structures in the :c:member:`~PyTypeObject.tp_members` slot." +msgstr "" +"描述某个 C 结构成员对应类型的属性的结构体。在定义类时,要把由这些结构组成的以 NULL 结尾的数组 放在 " +":c:member:`~PyTypeObject.tp_members` 槽位中。" + +#: ../../c-api/structures.rst:588 +msgid "Its fields are, in order:" +msgstr "其中的字段及顺序如下:" + +#: ../../c-api/structures.rst:592 +msgid "" +"Name of the member. A NULL value marks the end of a ``PyMemberDef[]`` array." +msgstr "成员名称。NULL 值表示 ``PyMemberDef[]`` 数组的结束。" + +#: ../../c-api/structures.rst:595 +msgid "The string should be static, no copy is made of it." +msgstr "字符串应当是静态的,它不会被复制。" + +#: ../../c-api/structures.rst:599 +msgid "" +"The type of the member in the C struct. See :ref:`PyMemberDef-types` for the" +" possible values." +msgstr "C 结构体中成员的类型。请参阅 :ref:`PyMemberDef-types` 了解可能的取值。" + +#: ../../c-api/structures.rst:604 +msgid "" +"The offset in bytes that the member is located on the type’s object struct." +msgstr "成员在类型的对象结构体中所在位置的以字节为单位的偏移量。" + +#: ../../c-api/structures.rst:608 +msgid "" +"Zero or more of the :ref:`PyMemberDef-flags`, combined using bitwise OR." +msgstr "零个或多个 :ref:`PyMemberDef-flags`,使用按位或运算进行组合。" + +#: ../../c-api/structures.rst:612 +msgid "" +"The docstring, or NULL. The string should be static, no copy is made of it. " +"Typically, it is defined using :c:macro:`PyDoc_STR`." +msgstr "文档字符串,或者为空。该字符串应当是静态的,它不会被拷贝。通常,它是使用 :c:macro:`PyDoc_STR` 来定义的。" + +#: ../../c-api/structures.rst:616 +msgid "" +"By default (when :c:member:`~PyMemberDef.flags` is ``0``), members allow " +"both read and write access. Use the :c:macro:`Py_READONLY` flag for read-" +"only access. Certain types, like :c:macro:`Py_T_STRING`, imply " +":c:macro:`Py_READONLY`. Only :c:macro:`Py_T_OBJECT_EX` (and legacy " +":c:macro:`T_OBJECT`) members can be deleted." +msgstr "" +"默认情况下 (当 :c:member:`~PyMemberDef.flags` 为 ``0`` 时),成员同时允许读取和写入访问。使用 " +":c:macro:`Py_READONLY` 旗标表示只读访问。某些类型,如 :c:macro:`Py_T_STRING`,隐含要求 " +":c:macro:`Py_READONLY`。只有 :c:macro:`Py_T_OBJECT_EX` (以及旧式的 " +":c:macro:`T_OBJECT`) 成员可以删除。" + +#: ../../c-api/structures.rst:625 +msgid "" +"For heap-allocated types (created using :c:func:`PyType_FromSpec` or " +"similar), ``PyMemberDef`` may contain a definition for the special member " +"``\"__vectorcalloffset__\"``, corresponding to " +":c:member:`~PyTypeObject.tp_vectorcall_offset` in type objects. This member " +"must be defined with ``Py_T_PYSSIZET``, and either ``Py_READONLY`` or " +"``Py_READONLY | Py_RELATIVE_OFFSET``. For example::" +msgstr "" +"对于堆分配类型(使用 :c:func:`PyType_FromSpec` 或类似函数创建),``PyMemberDef`` 可能包含特殊成员 " +"``\"__vectorcalloffset__\"`` 的定义,与类型对象中的 " +":c:member:`~PyTypeObject.tp_vectorcall_offset` 相对应。此成员必须用 ``Py_T_PYSSIZET`` " +"和 ``Py_READONLY`` 或 ``Py_READONLY | Py_RELATIVE_OFFSET`` 来定义,例如::" + +#: ../../c-api/structures.rst:632 +msgid "" +"static PyMemberDef spam_type_members[] = {\n" +" {\"__vectorcalloffset__\", Py_T_PYSSIZET,\n" +" offsetof(Spam_object, vectorcall), Py_READONLY},\n" +" {NULL} /* Sentinel */\n" +"};" +msgstr "" +"static PyMemberDef spam_type_members[] = {\n" +" {\"__vectorcalloffset__\", Py_T_PYSSIZET,\n" +" offsetof(Spam_object, vectorcall), Py_READONLY},\n" +" {NULL} /* 哨兵 */\n" +"};" + +#: ../../c-api/structures.rst:638 +msgid "(You may need to ``#include `` for :c:func:`!offsetof`.)" +msgstr "(您可能需要为 :c:func:`!offsetof` 添加 ``#include ``。)" + +#: ../../c-api/structures.rst:640 +msgid "" +"The legacy offsets :c:member:`~PyTypeObject.tp_dictoffset` and " +":c:member:`~PyTypeObject.tp_weaklistoffset` can be defined similarly using " +"``\"__dictoffset__\"`` and ``\"__weaklistoffset__\"`` members, but " +"extensions are strongly encouraged to use :c:macro:`Py_TPFLAGS_MANAGED_DICT`" +" and :c:macro:`Py_TPFLAGS_MANAGED_WEAKREF` instead." +msgstr "" +"旧式的偏移量 :c:member:`~PyTypeObject.tp_dictoffset` 和 " +":c:member:`~PyTypeObject.tp_weaklistoffset` 可使用 ``\"__dictoffset__\"`` 和 " +"``\"__weaklistoffset__\"`` 成员进行类似的定义,但强烈建议扩展程序改用 " +":c:macro:`Py_TPFLAGS_MANAGED_DICT` 和 :c:macro:`Py_TPFLAGS_MANAGED_WEAKREF`。" + +#: ../../c-api/structures.rst:648 +msgid "" +"``PyMemberDef`` is always available. Previously, it required including " +"``\"structmember.h\"``." +msgstr "``PyMemberDef`` 将始终可用。在之前版本中,它需要包括 ``\"structmember.h\"``。" + +#: ../../c-api/structures.rst:653 +msgid "" +":c:macro:`Py_RELATIVE_OFFSET` is now allowed for " +"``\"__vectorcalloffset__\"``, ``\"__dictoffset__\"`` and " +"``\"__weaklistoffset__\"``." +msgstr "" +"宏 :c:macro:`Py_RELATIVE_OFFSET` 现在允许用于 " +"``\"__vectorcalloffset__\"``、``\"__dictoffset__\"`` 和 " +"``\"__weaklistoffset__\"``。" + +#: ../../c-api/structures.rst:659 +msgid "" +"Get an attribute belonging to the object at address *obj_addr*. The " +"attribute is described by ``PyMemberDef`` *m*. Returns ``NULL`` on error." +msgstr "" +"获取属于位于地址 *obj_addr* 上的对象的某个属性。该属性是以 ``PyMemberDef`` *m* 来描述的。出错时返回 ``NULL``." + +#: ../../c-api/structures.rst:665 +msgid "" +"``PyMember_GetOne`` is always available. Previously, it required including " +"``\"structmember.h\"``." +msgstr "``PyMember_GetOne`` 将总是可用。在之前版本中,它需要包括 ``\"structmember.h\"``。" + +#: ../../c-api/structures.rst:670 +msgid "" +"Set an attribute belonging to the object at address *obj_addr* to object " +"*o*. The attribute to set is described by ``PyMemberDef`` *m*. Returns " +"``0`` if successful and a negative value on failure." +msgstr "" +"将属于位于地址 *obj_addr* 的对象的属性设置到对象 *o*。要设置的属性由 ``PyMemberDef`` *m* 描述。成功时返回 " +"``0`` 而失败时返回负值。" + +#: ../../c-api/structures.rst:676 +msgid "" +"``PyMember_SetOne`` is always available. Previously, it required including " +"``\"structmember.h\"``." +msgstr "``PyMember_SetOne`` 将总是可用。在之前版本中,它需要包括 ``\"structmember.h\"``。" + +#: ../../c-api/structures.rst:682 +msgid "Member flags" +msgstr "成员旗标" + +#: ../../c-api/structures.rst:684 +msgid "The following flags can be used with :c:member:`PyMemberDef.flags`:" +msgstr "以下旗标可被用于 :c:member:`PyMemberDef.flags`:" + +#: ../../c-api/structures.rst:688 +msgid "Not writable." +msgstr "不可写入。" + +#: ../../c-api/structures.rst:692 +msgid "" +"Emit an ``object.__getattr__`` :ref:`audit event ` before " +"reading." +msgstr "在读取之前发出一个 ``object.__getattr__`` :ref:`审计事件 `。" + +#: ../../c-api/structures.rst:697 +msgid "" +"Indicates that the :c:member:`~PyMemberDef.offset` of this ``PyMemberDef`` " +"entry indicates an offset from the subclass-specific data, rather than from " +"``PyObject``." +msgstr "" +"表示该 ``PyMemberDef`` 条目的 :c:member:`~PyMemberDef.offset` " +"是指明来自子类专属数据的偏移量,而不是来自 ``PyObject`` 的偏移量。" + +#: ../../c-api/structures.rst:701 +msgid "" +"Can only be used as part of the :c:data:`Py_tp_members` :c:type:`slot " +"` when creating a class using negative " +":c:member:`~PyType_Spec.basicsize`. It is mandatory in that case. When " +"setting :c:member:`~PyTypeObject.tp_members` from the slot during class " +"creation, Python clears the flag and sets :c:member:`PyMemberDef.offset` to " +"the offset from the ``PyObject`` struct." +msgstr "" +"只能在创建使用负的 :c:member:`~PyType_Spec.basicsize` 的类时被用作 :c:data:`Py_tp_members` " +":c:type:`槽位 ` 的一部分。这在此场景下是必须的。当在类创建期间根据该槽位设置 " +":c:member:`~PyTypeObject.tp_members` 时,Python 将清除旗标并将 " +":c:member:`PyMemberDef.offset` 设为来自 ``PyObject`` 结构的偏移量。" + +#: ../../c-api/structures.rst:716 +msgid "" +"The :c:macro:`!RESTRICTED`, :c:macro:`!READ_RESTRICTED` and " +":c:macro:`!WRITE_RESTRICTED` macros available with ``#include " +"\"structmember.h\"`` are deprecated. :c:macro:`!READ_RESTRICTED` and " +":c:macro:`!RESTRICTED` are equivalent to :c:macro:`Py_AUDIT_READ`; " +":c:macro:`!WRITE_RESTRICTED` does nothing." +msgstr "" +"通过 ``#include \"structmember.h\"`` 提供的 " +":c:macro:`!RESTRICTED`、:c:macro:`!READ_RESTRICTED` 和 " +":c:macro:`!WRITE_RESTRICTED` 宏已被弃用。 :c:macro:`!READ_RESTRICTED` 和 " +":c:macro:`!RESTRICTED` 等同于 " +":c:macro:`Py_AUDIT_READ`;:c:macro:`!WRITE_RESTRICTED` 则没有任何作用。" + +#: ../../c-api/structures.rst:727 +msgid "" +"The :c:macro:`!READONLY` macro was renamed to :c:macro:`Py_READONLY`. The " +":c:macro:`!PY_AUDIT_READ` macro was renamed with the ``Py_`` prefix. The new" +" names are now always available. Previously, these required ``#include " +"\"structmember.h\"``. The header is still available and it provides the old " +"names." +msgstr "" +":c:macro:`!READONLY` 宏被更名为 :c:macro:`Py_READONLY`。:c:macro:`!PY_AUDIT_READ` " +"宏被更名为 ``Py_`` 前缀。新名称现在将始终可用。在之前的版本中,这些名称需要 ``#include " +"\"structmember.h\"``。该头文件仍然可用并提供了原有的名称。" + +#: ../../c-api/structures.rst:736 +msgid "Member types" +msgstr "成员类型" + +#: ../../c-api/structures.rst:738 +msgid "" +":c:member:`PyMemberDef.type` can be one of the following macros " +"corresponding to various C types. When the member is accessed in Python, it " +"will be converted to the equivalent Python type. When it is set from Python," +" it will be converted back to the C type. If that is not possible, an " +"exception such as :exc:`TypeError` or :exc:`ValueError` is raised." +msgstr "" +":c:member:`PyMemberDef.type` 可以是下列与各种 C 类型相对应的宏之一。在 Python 中访问该成员时,它将被转换为对应的" +" Python 类型。当从 Python 设置成员时,它将被转换回 C 类型。如果无法转换,则会引发一个异常如 :exc:`TypeError` 或 " +":exc:`ValueError`。" + +#: ../../c-api/structures.rst:746 +msgid "" +"Unless marked (D), attributes defined this way cannot be deleted using e.g. " +":keyword:`del` or :py:func:`delattr`." +msgstr "除非标记为 (D),否则不能使用 :keyword:`del` 或 :py:func:`delattr` 删除以这种方式定义的属性。" + +#: ../../c-api/structures.rst:750 +msgid "Macro name" +msgstr "宏名称" + +#: ../../c-api/structures.rst:750 +msgid "C type" +msgstr "C 类型" + +#: ../../c-api/structures.rst:750 +msgid "Python type" +msgstr "Python 类型" + +#: ../../c-api/structures.rst:752 +msgid ":c:expr:`char`" +msgstr ":c:expr:`char`" + +#: ../../c-api/structures.rst:752 ../../c-api/structures.rst:753 +#: ../../c-api/structures.rst:754 ../../c-api/structures.rst:755 +#: ../../c-api/structures.rst:756 ../../c-api/structures.rst:757 +#: ../../c-api/structures.rst:758 ../../c-api/structures.rst:759 +#: ../../c-api/structures.rst:760 ../../c-api/structures.rst:761 +#: ../../c-api/structures.rst:762 +msgid ":py:class:`int`" +msgstr ":py:class:`int`" + +#: ../../c-api/structures.rst:753 +msgid ":c:expr:`short`" +msgstr ":c:expr:`short`" + +#: ../../c-api/structures.rst:754 +msgid ":c:expr:`int`" +msgstr ":c:expr:`int`" + +#: ../../c-api/structures.rst:755 +msgid ":c:expr:`long`" +msgstr ":c:expr:`long`" + +#: ../../c-api/structures.rst:756 +msgid ":c:expr:`long long`" +msgstr ":c:expr:`long long`" + +#: ../../c-api/structures.rst:757 +msgid ":c:expr:`unsigned char`" +msgstr ":c:expr:`unsigned char`" + +#: ../../c-api/structures.rst:758 +msgid ":c:expr:`unsigned int`" +msgstr ":c:expr:`unsigned int`" + +#: ../../c-api/structures.rst:759 +msgid ":c:expr:`unsigned short`" +msgstr ":c:expr:`unsigned short`" + +#: ../../c-api/structures.rst:760 +msgid ":c:expr:`unsigned long`" +msgstr ":c:expr:`unsigned long`" + +#: ../../c-api/structures.rst:761 +msgid ":c:expr:`unsigned long long`" +msgstr ":c:expr:`unsigned long long`" + +#: ../../c-api/structures.rst:762 +msgid ":c:expr:`Py_ssize_t`" +msgstr ":c:expr:`Py_ssize_t`" + +#: ../../c-api/structures.rst:763 +msgid ":c:expr:`float`" +msgstr ":c:expr:`float`" + +#: ../../c-api/structures.rst:763 ../../c-api/structures.rst:764 +msgid ":py:class:`float`" +msgstr ":py:class:`float`" + +#: ../../c-api/structures.rst:764 +msgid ":c:expr:`double`" +msgstr ":c:expr:`double`" + +#: ../../c-api/structures.rst:765 +msgid ":c:expr:`char` (written as 0 or 1)" +msgstr ":c:expr:`char` (写为 0 或 1)" + +#: ../../c-api/structures.rst:765 +msgid ":py:class:`bool`" +msgstr ":py:class:`bool`" + +#: ../../c-api/structures.rst:767 +msgid ":c:expr:`const char *` (*)" +msgstr ":c:expr:`const char *` (*)" + +#: ../../c-api/structures.rst:767 ../../c-api/structures.rst:768 +msgid ":py:class:`str` (RO)" +msgstr ":py:class:`str` (RO)" + +#: ../../c-api/structures.rst:768 +msgid ":c:expr:`const char[]` (*)" +msgstr ":c:expr:`const char[]` (*)" + +#: ../../c-api/structures.rst:769 +msgid ":c:expr:`char` (0-127)" +msgstr ":c:expr:`char` (0-127)" + +#: ../../c-api/structures.rst:769 +msgid ":py:class:`str` (**)" +msgstr ":py:class:`str` (**)" + +#: ../../c-api/structures.rst:770 +msgid ":c:expr:`PyObject *`" +msgstr ":c:expr:`PyObject *`" + +#: ../../c-api/structures.rst:770 +msgid ":py:class:`object` (D)" +msgstr ":py:class:`object` (D)" + +#: ../../c-api/structures.rst:773 +msgid "" +"(*): Zero-terminated, UTF8-encoded C string. With :c:macro:`!Py_T_STRING` " +"the C representation is a pointer; with :c:macro:`!Py_T_STRING_INPLACE` the " +"string is stored directly in the structure." +msgstr "" +"(*): 以零结束的 UTF8 编码的 C 字符串。使用 :c:macro:`!Py_T_STRING` 时的 C 表示形式是一个指针;使用 " +":c:macro:`!Py_T_STRING_INPLACE` 时字符串将直接存储在结构体中。" + +#: ../../c-api/structures.rst:778 +msgid "(**): String of length 1. Only ASCII is accepted." +msgstr "(**): 长度为 1 的字符串。只接受 ASCII 字符。" + +#: ../../c-api/structures.rst:780 +msgid "(RO): Implies :c:macro:`Py_READONLY`." +msgstr "(RO):表示 :c:macro:`Py_READONLY`。" + +#: ../../c-api/structures.rst:782 +msgid "" +"(D): Can be deleted, in which case the pointer is set to ``NULL``. Reading a" +" ``NULL`` pointer raises :py:exc:`AttributeError`." +msgstr "" +"(D):可以删除,在这种情况下指针会被设为 ``NULL``。读取 ``NULL`` 指针会引发 :py:exc:`AttributeError`。" + +#: ../../c-api/structures.rst:808 +msgid "" +"In previous versions, the macros were only available with ``#include " +"\"structmember.h\"`` and were named without the ``Py_`` prefix (e.g. as " +"``T_INT``). The header is still available and contains the old names, along " +"with the following deprecated types:" +msgstr "" +"在之前的版本中,这些宏仅通过 ``#include \"structmember.h\"`` 提供并且其名称不带 ``Py_`` 前缀 (例如 " +"``T_INT``)。头文件仍然可用并包含这些旧名称,以及下列已被弃用的类型:" + +#: ../../c-api/structures.rst:816 +msgid "" +"Like ``Py_T_OBJECT_EX``, but ``NULL`` is converted to ``None``. This results" +" in surprising behavior in Python: deleting the attribute effectively sets " +"it to ``None``." +msgstr "" +"与 ``Py_T_OBJECT_EX`` 类似,但 ``NULL`` 会被转换为 ``None``。这将在 Python " +"中产生令人吃惊的行为:删除该属性实际上会将其设置为 ``None``。" + +#: ../../c-api/structures.rst:822 +msgid "Always ``None``. Must be used with :c:macro:`Py_READONLY`." +msgstr "总是为 ``None``。必须与 :c:macro:`Py_READONLY` 一起使用。" + +#: ../../c-api/structures.rst:825 +msgid "Defining Getters and Setters" +msgstr "定义读取器和设置器" + +#: ../../c-api/structures.rst:829 +msgid "" +"Structure to define property-like access for a type. See also description of" +" the :c:member:`PyTypeObject.tp_getset` slot." +msgstr "" +"用于定义针对某个类型的特征属性式的访问的结构体。另请参阅 :c:member:`PyTypeObject.tp_getset` 槽位的描述。" + +#: ../../c-api/structures.rst:834 +msgid "attribute name" +msgstr "属性名称" + +#: ../../c-api/structures.rst:838 +msgid "C function to get the attribute." +msgstr "用于获取属性的 C 函数。" + +#: ../../c-api/structures.rst:842 +msgid "" +"Optional C function to set or delete the attribute. If ``NULL``, the " +"attribute is read-only." +msgstr "可选的用于设置或删除属性的 C 函数。如为 ``NULL``,则属性将是只读的。" + +#: ../../c-api/structures.rst:847 +msgid "optional docstring" +msgstr "可选的文档字符串" + +#: ../../c-api/structures.rst:851 +msgid "" +"Optional user data pointer, providing additional data for getter and setter." +msgstr "可选的用户数据指针,为 getter 和 setter 提供附加数据。" + +#: ../../c-api/structures.rst:855 +msgid "" +"The ``get`` function takes one :c:expr:`PyObject*` parameter (the instance) " +"and a user data pointer (the associated ``closure``):" +msgstr "" +"``get`` 函数接受一个 :c:expr:`PyObject*` 形参 (相应的实例) 和一个用户数据指针 (关联的 ``closure``):" + +#: ../../c-api/structures.rst:858 +msgid "" +"It should return a new reference on success or ``NULL`` with a set exception" +" on failure." +msgstr "它应当在成功时返回一个新的引用或在失败时返回 ``NULL`` 并设置异常。" + +#: ../../c-api/structures.rst:863 +msgid "" +"``set`` functions take two :c:expr:`PyObject*` parameters (the instance and " +"the value to be set) and a user data pointer (the associated ``closure``):" +msgstr "" +"``set`` 函数接受两个 :c:expr:`PyObject*` 形参 (相应的实例和要设置的值) 和一个用户数据指针 (关联的 " +"``closure``):" + +#: ../../c-api/structures.rst:866 +msgid "" +"In case the attribute should be deleted the second parameter is ``NULL``. " +"Should return ``0`` on success or ``-1`` with a set exception on failure." +msgstr "对于属性要被删除的情况第二个形参应为 ``NULL``。成功时应返回 ``0`` 或在失败时返回 ``-1`` 并设置异常。" + +#: ../../c-api/structures.rst:418 ../../c-api/structures.rst:428 +msgid "built-in function" +msgstr "内置函数" + +#: ../../c-api/structures.rst:418 +msgid "classmethod" +msgstr "类方法" + +#: ../../c-api/structures.rst:428 +msgid "staticmethod" +msgstr "静态方法" + +#: ../../c-api/structures.rst:709 +msgid "READ_RESTRICTED (C macro)" +msgstr "READ_RESTRICTED (C 宏)" + +#: ../../c-api/structures.rst:709 +msgid "WRITE_RESTRICTED (C macro)" +msgstr "WRITE_RESTRICTED (C 宏)" + +#: ../../c-api/structures.rst:709 +msgid "RESTRICTED (C macro)" +msgstr "RESTRICTED (C 宏)" + +#: ../../c-api/structures.rst:722 +msgid "READONLY (C macro)" +msgstr "READONLY (C 宏)" + +#: ../../c-api/structures.rst:785 +msgid "T_BYTE (C macro)" +msgstr "T_BYTE (C 宏)" + +#: ../../c-api/structures.rst:785 +msgid "T_SHORT (C macro)" +msgstr "T_SHORT (C 宏)" + +#: ../../c-api/structures.rst:785 +msgid "T_INT (C macro)" +msgstr "T_INT (C 宏)" + +#: ../../c-api/structures.rst:785 +msgid "T_LONG (C macro)" +msgstr "T_LONG (C 宏)" + +#: ../../c-api/structures.rst:785 +msgid "T_LONGLONG (C macro)" +msgstr "T_LONGLONG (C 宏)" + +#: ../../c-api/structures.rst:785 +msgid "T_UBYTE (C macro)" +msgstr "T_UBYTE (C 宏)" + +#: ../../c-api/structures.rst:785 +msgid "T_USHORT (C macro)" +msgstr "T_USHORT (C 宏)" + +#: ../../c-api/structures.rst:785 +msgid "T_UINT (C macro)" +msgstr "T_UINT (C 宏)" + +#: ../../c-api/structures.rst:785 +msgid "T_ULONG (C macro)" +msgstr "T_ULONG (C 宏)" + +#: ../../c-api/structures.rst:785 +msgid "T_ULONGULONG (C macro)" +msgstr "T_ULONGULONG (C 宏)" + +#: ../../c-api/structures.rst:785 +msgid "T_PYSSIZET (C macro)" +msgstr "T_PYSSIZET (C 宏)" + +#: ../../c-api/structures.rst:785 +msgid "T_FLOAT (C macro)" +msgstr "T_FLOAT (C 宏)" + +#: ../../c-api/structures.rst:785 +msgid "T_DOUBLE (C macro)" +msgstr "T_DOUBLE (C 宏)" + +#: ../../c-api/structures.rst:785 +msgid "T_BOOL (C macro)" +msgstr "T_BOOL (C 宏)" + +#: ../../c-api/structures.rst:785 +msgid "T_CHAR (C macro)" +msgstr "T_CHAR (C 宏)" + +#: ../../c-api/structures.rst:785 +msgid "T_STRING (C macro)" +msgstr "T_STRING (C 宏)" + +#: ../../c-api/structures.rst:785 +msgid "T_STRING_INPLACE (C macro)" +msgstr "T_STRING_INPLACE (C 宏)" + +#: ../../c-api/structures.rst:785 +msgid "T_OBJECT_EX (C macro)" +msgstr "T_OBJECT_EX (C 宏)" + +#: ../../c-api/structures.rst:785 +msgid "structmember.h" +msgstr "structmember.h" diff --git a/c-api/subinterpreters.po b/c-api/subinterpreters.po new file mode 100644 index 0000000000..b7ec7b1626 --- /dev/null +++ b/c-api/subinterpreters.po @@ -0,0 +1,682 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/subinterpreters.rst:6 +msgid "Multiple interpreters in a Python process" +msgstr "" + +#: ../../c-api/subinterpreters.rst:8 +msgid "" +"While in most uses, you will only embed a single Python interpreter, there " +"are cases where you need to create several independent interpreters in the " +"same process and perhaps even in the same thread. Sub-interpreters allow you" +" to do that." +msgstr "" +"虽然在大多数用例中,你都只会嵌入一个单独的 Python 解释器,但某些场景需要你在同一个进程甚至同一个线程中创建多个独立的解释器。 " +"子解释器让你能够做到这一点。" + +#: ../../c-api/subinterpreters.rst:13 +msgid "" +"The \"main\" interpreter is the first one created when the runtime " +"initializes. It is usually the only Python interpreter in a process. Unlike" +" sub-interpreters, the main interpreter has unique process-global " +"responsibilities like signal handling. It is also responsible for execution" +" during runtime initialization and is usually the active interpreter during " +"runtime finalization. The :c:func:`PyInterpreterState_Main` function " +"returns a pointer to its state." +msgstr "" +"“主”解释器是在运行时初始化时创建的第一个解释器。它通常是一个进程中唯一的 Python " +"解释器。与子解释器不同,主解释器具有唯一的进程全局责任比如信号处理等。它还负责在运行时初始化期间的执行并且通常还是运行时最终化期间的活动解释器。:c:func:`PyInterpreterState_Main`" +" 函数将返回一个指向其状态的指针。" + +#: ../../c-api/subinterpreters.rst:20 +msgid "" +"You can switch between sub-interpreters using the " +":c:func:`PyThreadState_Swap` function. You can create and destroy them using" +" the following functions:" +msgstr "你可以使用 :c:func:`PyThreadState_Swap` 函数在子解释器之间进行切换。你可以使用下列函数来创建和销毁它们:" + +#: ../../c-api/subinterpreters.rst:26 +msgid "" +"Structure containing most parameters to configure a sub-interpreter. Its " +"values are used only in :c:func:`Py_NewInterpreterFromConfig` and never " +"modified by the runtime." +msgstr "" +"包含用于配置子解释器的大部分形参的结构体。其值仅在 :c:func:`Py_NewInterpreterFromConfig` " +"中被使用而绝不会被运行时所修改。" + +#: ../../c-api/subinterpreters.rst:32 +msgid "Structure fields:" +msgstr "结构体字段:" + +#: ../../c-api/subinterpreters.rst:36 +msgid "" +"If this is ``0`` then the sub-interpreter will use its own \"object\" " +"allocator state. Otherwise it will use (share) the main interpreter's." +msgstr "如果该值为 ``0`` 则子解释器将使用自己的“对象”分配器状态。否则它将使用(共享)主解释器的状态。" + +#: ../../c-api/subinterpreters.rst:40 +msgid "" +"If this is ``0`` then " +":c:member:`~PyInterpreterConfig.check_multi_interp_extensions` must be ``1``" +" (non-zero). If this is ``1`` then :c:member:`~PyInterpreterConfig.gil` must" +" not be :c:macro:`PyInterpreterConfig_OWN_GIL`." +msgstr "" +"如果该值为 ``0`` 则 :c:member:`~PyInterpreterConfig.check_multi_interp_extensions`" +" 必须为 ``1`` (非零值)。如果该值为 ``1`` 则 :c:member:`~PyInterpreterConfig.gil` 不可为 " +":c:macro:`PyInterpreterConfig_OWN_GIL` 选项。" + +#: ../../c-api/subinterpreters.rst:48 +msgid "" +"If this is ``0`` then the runtime will not support forking the process in " +"any thread where the sub-interpreter is currently active. Otherwise fork is " +"unrestricted." +msgstr "如果该值为 ``0`` 则运行时将不支持在当前激活了子解释器的任何线程中 fork 进程。否则 fork 将不受限制。" + +#: ../../c-api/subinterpreters.rst:52 +msgid "" +"Note that the :mod:`subprocess` module still works when fork is disallowed." +msgstr "请注意当 fork 被禁止时 :mod:`subprocess` 模块将仍然可用。" + +#: ../../c-api/subinterpreters.rst:57 +msgid "" +"If this is ``0`` then the runtime will not support replacing the current " +"process via exec (e.g. :func:`os.execv`) in any thread where the sub-" +"interpreter is currently active. Otherwise exec is unrestricted." +msgstr "" +"如果该值为 ``0`` 则运行时将不支持在当前激活了子解释器的任何线程中通过 exec (例如 :func:`os.execv`) 替换当前进程。否则 " +"exec 将不受限制。" + +#: ../../c-api/subinterpreters.rst:62 +msgid "" +"Note that the :mod:`subprocess` module still works when exec is disallowed." +msgstr "请注意当 exec 被禁止时 :mod:`subprocess` 模块将仍然可用。" + +#: ../../c-api/subinterpreters.rst:67 +msgid "" +"If this is ``0`` then the sub-interpreter's :mod:`threading` module won't " +"create threads. Otherwise threads are allowed." +msgstr "如果该值为 ``0`` 则子解释器的 :mod:`threading` 模块将不会创建线程。否则线程将被允许。" + +#: ../../c-api/subinterpreters.rst:73 +msgid "" +"If this is ``0`` then the sub-interpreter's :mod:`threading` module won't " +"create daemon threads. Otherwise daemon threads are allowed (as long as " +":c:member:`~PyInterpreterConfig.allow_threads` is non-zero)." +msgstr "" +"如果该值为 ``0`` 则子解释器的 :mod:`threading` 模块将不会创建守护线程。否则将允许守护线程(只要 " +":c:member:`~PyInterpreterConfig.allow_threads` 是非零值)。" + +#: ../../c-api/subinterpreters.rst:80 +msgid "" +"If this is ``0`` then all extension modules may be imported, including " +"legacy (single-phase init) modules, in any thread where the sub-interpreter " +"is currently active. Otherwise only multi-phase init extension modules (see " +":pep:`489`) may be imported. (Also see " +":c:macro:`Py_mod_multiple_interpreters`.)" +msgstr "" +"如果该值为 ``0`` 则所有扩展模块均可在当前子解释器被激活的任何线程中被导入,包括旧式的 (单阶段初始化) 模块。否则将只有多阶段初始化扩展模块 " +"(参见 :pep:`489`) 可以被导入。 (另请参阅 :c:macro:`Py_mod_multiple_interpreters`。)" + +#: ../../c-api/subinterpreters.rst:87 +msgid "" +"This must be ``1`` (non-zero) if " +":c:member:`~PyInterpreterConfig.use_main_obmalloc` is ``0``." +msgstr "" +"如果 :c:member:`~PyInterpreterConfig.use_main_obmalloc` 为 ``0`` 则该值必须为 ``1`` " +"(非零值)。" + +#: ../../c-api/subinterpreters.rst:92 +msgid "" +"This determines the operation of the GIL for the sub-interpreter. It may be " +"one of the following:" +msgstr "这将确定针对子解释器的 GIL 操作方式。它可以是以下的几种之一:" + +#: ../../c-api/subinterpreters.rst:99 +msgid "Use the default selection (:c:macro:`PyInterpreterConfig_SHARED_GIL`)." +msgstr "使用默认选择 (:c:macro:`PyInterpreterConfig_SHARED_GIL`)。" + +#: ../../c-api/subinterpreters.rst:103 +msgid "Use (share) the main interpreter's GIL." +msgstr "使用(共享)主解释器的 GIL。" + +#: ../../c-api/subinterpreters.rst:107 +msgid "Use the sub-interpreter's own GIL." +msgstr "使用子解释器自己的 GIL。" + +#: ../../c-api/subinterpreters.rst:109 +msgid "" +"If this is :c:macro:`PyInterpreterConfig_OWN_GIL` then " +":c:member:`PyInterpreterConfig.use_main_obmalloc` must be ``0``." +msgstr "" +"如果该值为 :c:macro:`PyInterpreterConfig_OWN_GIL` 则 " +":c:member:`PyInterpreterConfig.use_main_obmalloc` 必须为 ``0``。" + +#: ../../c-api/subinterpreters.rst:123 +msgid "" +"Create a new sub-interpreter. This is an (almost) totally separate " +"environment for the execution of Python code. In particular, the new " +"interpreter has separate, independent versions of all imported modules, " +"including the fundamental modules :mod:`builtins`, :mod:`__main__` and " +":mod:`sys`. The table of loaded modules (``sys.modules``) and the module " +"search path (``sys.path``) are also separate. The new environment has no " +"``sys.argv`` variable. It has new standard I/O stream file objects " +"``sys.stdin``, ``sys.stdout`` and ``sys.stderr`` (however these refer to the" +" same underlying file descriptors)." +msgstr "" +"新建一个子解释器。这是一个 (几乎) 完全隔离的 Python 代码执行环境。 " +"特别需要注意,新的子解释器具有全部已导入模块的隔离的、独立的版本,包括基本模块 :mod:`builtins`, :mod:`__main__` 和 " +":mod:`sys` 等。已加载模块表 (``sys.modules``) 和模块搜索路径 (``sys.path``) 也是隔离的。新环境没有 " +"``sys.argv`` 变量。它具有新的标准 I/O 流文件对象 ``sys.stdin``, ``sys.stdout`` 和 " +"``sys.stderr`` (不过这些对象都指向相同的底层文件描述符)。" + +#: ../../c-api/subinterpreters.rst:133 +msgid "" +"The given *config* controls the options with which the interpreter is " +"initialized." +msgstr "给定的 *config* 控制着初始化解释器所使用的选项。" + +#: ../../c-api/subinterpreters.rst:136 +msgid "" +"Upon success, *tstate_p* will be set to the first :term:`thread state` " +"created in the new sub-interpreter. This thread state is :term:`attached " +"`. Note that no actual thread is created; see the " +"discussion of thread states below. If creation of the new interpreter is " +"unsuccessful, *tstate_p* is set to ``NULL``; no exception is set since the " +"exception state is stored in the :term:`attached thread state`, which might " +"not exist." +msgstr "" +"成功后,*tstate_p* 将被设为新的子解释器中创建的第一个 :term:`thread state`。该线程状态是 :term:`已附加的 " +"`。请注意并没有真实的线程被创建;请参阅下文有关线程状态的讨论。如果新解释器的创建没有成功,则 " +"*tstate_p* 将被设为 ``NULL``;不会设置任何异常因为异常状态是存储在 :term:`attached thread state` " +"中的,而它并不一定存在。" + +#: ../../c-api/subinterpreters.rst:145 +msgid "" +"Like all other Python/C API functions, an :term:`attached thread state` must" +" be present before calling this function, but it might be detached upon " +"returning. On success, the returned thread state will be :term:`attached " +"`. If the sub-interpreter is created with its own " +":term:`GIL` then the :term:`attached thread state` of the calling " +"interpreter will be detached. When the function returns, the new " +"interpreter's :term:`thread state` will be :term:`attached ` to the current thread and the previous interpreter's :term:`attached" +" thread state` will remain detached." +msgstr "" +"与所有其他 Python/C API 函数一样,调用此函数前必须存在 :term:`attached thread " +"state`,但返回时该状态可能会被分离。成功时,返回的线程状态将处于 :term:`已附加 ` 状态。 " +"如果子解释器使用自己的 :term:`GIL` 创建,则调用解释器的 :term:`attached thread state` 将被分离。 " +"当函数返回时,新解释器的 :term:`thread state` 将 :term:`已附加 ` " +"到当前线程,而先前解释器的 :term:`attached thread state` 将保持分离状态。" + +#: ../../c-api/subinterpreters.rst:156 +msgid "" +"Sub-interpreters are most effective when isolated from each other, with " +"certain functionality restricted::" +msgstr "子解释器在彼此相互隔离,并让特定功能受限的情况下是最有效率的::" + +#: ../../c-api/subinterpreters.rst:159 +msgid "" +"PyInterpreterConfig config = {\n" +" .use_main_obmalloc = 0,\n" +" .allow_fork = 0,\n" +" .allow_exec = 0,\n" +" .allow_threads = 1,\n" +" .allow_daemon_threads = 0,\n" +" .check_multi_interp_extensions = 1,\n" +" .gil = PyInterpreterConfig_OWN_GIL,\n" +"};\n" +"PyThreadState *tstate = NULL;\n" +"PyStatus status = Py_NewInterpreterFromConfig(&tstate, &config);\n" +"if (PyStatus_Exception(status)) {\n" +" Py_ExitStatusException(status);\n" +"}" +msgstr "" +"PyInterpreterConfig config = {\n" +" .use_main_obmalloc = 0,\n" +" .allow_fork = 0,\n" +" .allow_exec = 0,\n" +" .allow_threads = 1,\n" +" .allow_daemon_threads = 0,\n" +" .check_multi_interp_extensions = 1,\n" +" .gil = PyInterpreterConfig_OWN_GIL,\n" +"};\n" +"PyThreadState *tstate = NULL;\n" +"PyStatus status = Py_NewInterpreterFromConfig(&tstate, &config);\n" +"if (PyStatus_Exception(status)) {\n" +" Py_ExitStatusException(status);\n" +"}" + +#: ../../c-api/subinterpreters.rst:174 +msgid "" +"Note that the config is used only briefly and does not get modified. During " +"initialization the config's values are converted into various " +":c:type:`PyInterpreterState` values. A read-only copy of the config may be " +"stored internally on the :c:type:`PyInterpreterState`." +msgstr "" +"请注意该配置只会被短暂使用而不会被修改。在初始化期间配置的值会被转换成各种 :c:type:`PyInterpreterState` 值。 " +"配置的只读副本可以被内部存储于 :c:type:`PyInterpreterState` 中。" + +#: ../../c-api/subinterpreters.rst:183 +msgid "Extension modules are shared between (sub-)interpreters as follows:" +msgstr "扩展模块将以如下方式在(子)解释器之间共享:" + +#: ../../c-api/subinterpreters.rst:185 +msgid "" +"For modules using multi-phase initialization, e.g. " +":c:func:`PyModule_FromDefAndSpec`, a separate module object is created and " +"initialized for each interpreter. Only C-level static and global variables " +"are shared between these module objects." +msgstr "" +"对于使用多阶段初始化的模块,例如 :c:func:`PyModule_FromDefAndSpec`,将为每个解释器创建并初始化一个单独的模块对象。 " +"只有 C 层级的静态和全局变量能在这些模块 对象之间共享。" + +#: ../../c-api/subinterpreters.rst:191 +msgid "" +"For modules using legacy :ref:`single-phase initialization `, e.g. :c:func:`PyModule_Create`, the first time a " +"particular extension is imported, it is initialized normally, and a " +"(shallow) copy of its module's dictionary is squirreled away. When the same " +"extension is imported by another (sub-)interpreter, a new module is " +"initialized and filled with the contents of this copy; the extension's " +"``init`` function is not called. Objects in the module's dictionary thus end" +" up shared across (sub-)interpreters, which might cause unwanted behavior " +"(see `Bugs and caveats`_ below)." +msgstr "" + +#: ../../c-api/subinterpreters.rst:203 +msgid "" +"Note that this is different from what happens when an extension is imported " +"after the interpreter has been completely re-initialized by calling " +":c:func:`Py_FinalizeEx` and :c:func:`Py_Initialize`; in that case, the " +"extension's ``initmodule`` function *is* called again. As with multi-phase " +"initialization, this means that only C-level static and global variables are" +" shared between these modules." +msgstr "" +"请注意这不同于在调用 :c:func:`Py_FinalizeEx` 和 :c:func:`Py_Initialize` " +"完全重新初始化解释器之后导入扩展时所发生的情况;对于那种情况,扩展的 ``initmodule`` 函数 *会被* 再次调用。 " +"与多阶段初始化一样,这意味着只有 C 层级的静态和全局变量能在这些模块之间共享。" + +#: ../../c-api/subinterpreters.rst:223 +msgid "" +"Create a new sub-interpreter. This is essentially just a wrapper around " +":c:func:`Py_NewInterpreterFromConfig` with a config that preserves the " +"existing behavior. The result is an unisolated sub-interpreter that shares " +"the main interpreter's GIL, allows fork/exec, allows daemon threads, and " +"allows single-phase init modules." +msgstr "" +"新建一个子解释器。这在本质上只是针对 :c:func:`Py_NewInterpreterFromConfig` 的包装器,其配置保留了现有的行为。 " +"结果是一个未隔离的子解释器,它会共享主解释器的 GIL,允许 fork/exec,允许守护线程,也允许单阶段初始化模块。" + +#: ../../c-api/subinterpreters.rst:235 +msgid "" +"Destroy the (sub-)interpreter represented by the given :term:`thread state`." +" The given thread state must be :term:`attached `. " +"When the call returns, there will be no :term:`attached thread state`. All " +"thread states associated with this interpreter are destroyed." +msgstr "" +"销毁由给定 :term:`thread state` 表示的(子)解释器。给定的线程状态必须处于 :term:`已附加 ` 状态。调用返回时,将不存在任何 :term:`attached thread state`。与此解释器关联的所有线程状态都会被销毁。" + +#: ../../c-api/subinterpreters.rst:240 +msgid "" +":c:func:`Py_FinalizeEx` will destroy all sub-interpreters that haven't been " +"explicitly destroyed at that point." +msgstr ":c:func:`Py_FinalizeEx` 将销毁所有在当前时间点上尚未被明确销毁的子解释器。" + +#: ../../c-api/subinterpreters.rst:247 +msgid "A per-interpreter GIL" +msgstr "" + +#: ../../c-api/subinterpreters.rst:251 +msgid "" +"Using :c:func:`Py_NewInterpreterFromConfig` you can create a sub-interpreter" +" that is completely isolated from other interpreters, including having its " +"own GIL. The most important benefit of this isolation is that such an " +"interpreter can execute Python code without being blocked by other " +"interpreters or blocking any others. Thus a single Python process can truly" +" take advantage of multiple CPU cores when running Python code. The " +"isolation also encourages a different approach to concurrency than that of " +"just using threads. (See :pep:`554` and :pep:`684`.)" +msgstr "" +"使用 :c:func:`Py_NewInterpreterFromConfig` 你将可以创建一个与其他解释器完全隔离的子解释器,包括具有自己的 " +"GIL。这种隔离带来的最大好处在于这样的解释器执行 Python 代码时不会被其他解释器所阻塞或者阻塞任何其他解释器。因此在运行 Python " +"代码时单个 Python 进程可以真正地利用多个 CPU 核心。这种隔离还能鼓励开发者采取不同于仅使用线程的并发方式。 (参见 :pep:`554` 和" +" :pep:`684` )。" + +#: ../../c-api/subinterpreters.rst:261 +msgid "" +"Using an isolated interpreter requires vigilance in preserving that " +"isolation. That especially means not sharing any objects or mutable state " +"without guarantees about thread-safety. Even objects that are otherwise " +"immutable (e.g. ``None``, ``(1, 5)``) can't normally be shared because of " +"the refcount. One simple but less-efficient approach around this is to use " +"a global lock around all use of some state (or object). Alternately, " +"effectively immutable objects (like integers or strings) can be made safe in" +" spite of their refcounts by making them :term:`immortal`. In fact, this has" +" been done for the builtin singletons, small integers, and a number of other" +" builtin objects." +msgstr "" +"使用隔离的解释器要求谨慎地保持隔离状态。尤其是意味着不要在未确保线程安全的情况下共享任何对象或可变的状态。由于引用计数的存在即使是在其他情况下不可变的对象" +" (例如 ``None``, ``(1, 5)``) 通常也不可被共享。 针对此问题的一种简单但效率较低的解决方式是在使用某些状态 (或对象) " +"时总是使用一个全局锁。或者,实际上不可变的对象 (如整数或字符串) 可以通过将其设为 :term:`immortal` " +"对象而无视其引用计数来确保其安全性。事实上,对于内置单例、小整数和其他一些内置对象都是这样做的。" + +#: ../../c-api/subinterpreters.rst:272 +msgid "" +"If you preserve isolation then you will have access to proper multi-core " +"computing without the complications that come with free-threading. Failure " +"to preserve isolation will expose you to the full consequences of free-" +"threading, including races and hard-to-debug crashes." +msgstr "" +"如果你能保持隔离状态那么你将能获得真正的多核计算能力而不会遇到自由线程所带来的复杂性。 " +"如果未能保持隔离状态那么你将面对自由线程所带来的全部后果,包括线程竞争和难以调试的崩溃。" + +#: ../../c-api/subinterpreters.rst:277 +msgid "" +"Aside from that, one of the main challenges of using multiple isolated " +"interpreters is how to communicate between them safely (not break isolation)" +" and efficiently. The runtime and stdlib do not provide any standard " +"approach to this yet. A future stdlib module would help mitigate the effort" +" of preserving isolation and expose effective tools for communicating (and " +"sharing) data between interpreters." +msgstr "" +"除此之外,使用多个相互隔离的解释器的一个主要挑战是如何在它们之间安全 (不破坏隔离状态)、高效地进行通信。运行时和标准库还没有为此提供任何标准方式。 " +"未来的标准库模块将会帮助减少保持隔离状态所需的工作量并为解释器之间的数据通信(和共享)公开有效的工具。" + +#: ../../c-api/subinterpreters.rst:286 +msgid "Bugs and caveats" +msgstr "错误和注意事项" + +#: ../../c-api/subinterpreters.rst:288 +msgid "" +"Because sub-interpreters (and the main interpreter) are part of the same " +"process, the insulation between them isn't perfect --- for example, using " +"low-level file operations like :func:`os.close` they can (accidentally or " +"maliciously) affect each other's open files. Because of the way extensions " +"are shared between (sub-)interpreters, some extensions may not work " +"properly; this is especially likely when using single-phase initialization " +"or (static) global variables. It is possible to insert objects created in " +"one sub-interpreter into a namespace of another (sub-)interpreter; this " +"should be avoided if possible." +msgstr "" + +#: ../../c-api/subinterpreters.rst:298 +msgid "" +"Special care should be taken to avoid sharing user-defined functions, " +"methods, instances or classes between sub-interpreters, since import " +"operations executed by such objects may affect the wrong (sub-)interpreter's" +" dictionary of loaded modules. It is equally important to avoid sharing " +"objects from which the above are reachable." +msgstr "" +"应当特别注意避免在子解释器之间共享用户自定义的函数、方法、实例或类,因为由这些对象执行的导入 操作可能会影响错误的已加载模块的 (子) 解释器的字典。 " +"同样重要的一点是应当避免共享可被上述对象访问的对象。" + +#: ../../c-api/subinterpreters.rst:304 +msgid "" +"Also note that combining this functionality with ``PyGILState_*`` APIs is " +"delicate, because these APIs assume a bijection between Python thread states" +" and OS-level threads, an assumption broken by the presence of sub-" +"interpreters. It is highly recommended that you don't switch sub-" +"interpreters between a pair of matching :c:func:`PyGILState_Ensure` and " +":c:func:`PyGILState_Release` calls. Furthermore, extensions (such as " +":mod:`ctypes`) using these APIs to allow calling of Python code from non-" +"Python created threads will probably be broken when using sub-interpreters." +msgstr "" +"还要注意的一点是将此功能与 ``PyGILState_*`` API 结合使用是很微妙的,因为这些 API 会假定 Python " +"线程状态与操作系统级线程之间存在双向投影关系,而子解释器的存在打破了这一假定。强烈建议你不要在一对互相匹配的 " +":c:func:`PyGILState_Ensure` 和 :c:func:`PyGILState_Release` 调用之间切换子解释器。 " +"此外,使用这些 API 以允许从非 Python 创建的线程调用 Python 代码的扩展 (如 :mod:`ctypes`) " +"在使用子解释器时很可能会出现问题。" + +#: ../../c-api/subinterpreters.rst:315 +msgid "High-level APIs" +msgstr "高层级 API" + +#: ../../c-api/subinterpreters.rst:319 +msgid "" +"This data structure represents the state shared by a number of cooperating " +"threads. Threads belonging to the same interpreter share their module " +"administration and a few other internal items. There are no public members " +"in this structure." +msgstr "该数据结构代表多个合作线程所共享的状态。属于同一解释器的线程将共享其模块管理以及其他一些内部条目。该结构体中不包含公有成员。" + +#: ../../c-api/subinterpreters.rst:324 +msgid "" +"Threads belonging to different interpreters initially share nothing, except " +"process state like available memory, open file descriptors and such. The " +"global interpreter lock is also shared by all threads, regardless of to " +"which interpreter they belong." +msgstr "" +"最初归属于不同解释器的线程不会共享任何东西,但进程状态如可用内存、打开的文件描述符等等除外。全局解释器锁也会被所有线程共享,无论它们归属于哪个解释器。" + +#: ../../c-api/subinterpreters.rst:331 +msgid "" +":pep:`684` introduced the possibility of a :ref:`per-interpreter GIL `. See :c:func:`Py_NewInterpreterFromConfig`." +msgstr "" +":pep:`684` 引入了 :ref:`单解释器 GIL ` 的可能性。请参阅 " +":c:func:`Py_NewInterpreterFromConfig` 函数。" + +#: ../../c-api/subinterpreters.rst:338 +msgid "Get the current interpreter." +msgstr "获取当前解释器。" + +#: ../../c-api/subinterpreters.rst:340 +msgid "" +"Issue a fatal error if there is no :term:`attached thread state`. It cannot " +"return NULL." +msgstr "如果没有 :term:`attached thread state` 则会发生致命错误。 此函数不会返回 NULL。" + +#: ../../c-api/subinterpreters.rst:348 +msgid "" +"Return the interpreter's unique ID. If there was any error in doing so then" +" ``-1`` is returned and an error is set." +msgstr "返回解释器的唯一 ID。如果执行过程中发生任何错误则将返回 ``-1`` 并设置错误。" + +#: ../../c-api/subinterpreters.rst:351 +msgid "The caller must have an :term:`attached thread state`." +msgstr "调用方必须有已附加的线程状态 :term:`attached thread state`。" + +#: ../../c-api/subinterpreters.rst:358 +msgid "" +"Return a dictionary in which interpreter-specific data may be stored. If " +"this function returns ``NULL`` then no exception has been raised and the " +"caller should assume no interpreter-specific dict is available." +msgstr "返回一个存储解释器专属数据的字典。如果此函数返回 ``NULL`` 则没有任何异常被引发并且调用方应当将解释器专属字典视为不可用。" + +#: ../../c-api/subinterpreters.rst:362 +msgid "" +"This is not a replacement for :c:func:`PyModule_GetState()`, which " +"extensions should use to store interpreter-specific state information." +msgstr "这不是 :c:func:`PyModule_GetState()` 的替代,扩展仍应使用它来存储解释器专属的状态信息。" + +#: ../../c-api/subinterpreters.rst:365 +msgid "" +"The returned dictionary is borrowed from the interpreter and is valid until " +"interpreter shutdown." +msgstr "返回的字典是从解释器借入的并将保持可用直到解释器关闭。" + +#: ../../c-api/subinterpreters.rst:373 +msgid "Type of a frame evaluation function." +msgstr "帧评估函数的类型" + +#: ../../c-api/subinterpreters.rst:375 +msgid "" +"The *throwflag* parameter is used by the ``throw()`` method of generators: " +"if non-zero, handle the current exception." +msgstr "*throwflag* 形参将由生成器的 ``throw()`` 方法来使用:如为非零值,则处理当前异常。" + +#: ../../c-api/subinterpreters.rst:378 +msgid "The function now takes a *tstate* parameter." +msgstr "此函数现在可接受一个 *tstate* 形参。" + +#: ../../c-api/subinterpreters.rst:381 +msgid "" +"The *frame* parameter changed from ``PyFrameObject*`` to " +"``_PyInterpreterFrame*``." +msgstr "*frame* 形参由 ``PyFrameObject*`` 改为 ``_PyInterpreterFrame*``。" + +#: ../../c-api/subinterpreters.rst:387 +msgid "Get the frame evaluation function." +msgstr "获取帧评估函数。" + +#: ../../c-api/subinterpreters.rst:389 ../../c-api/subinterpreters.rst:398 +msgid "See the :pep:`523` \"Adding a frame evaluation API to CPython\"." +msgstr "请参阅 :pep:`523` \"Adding a frame evaluation API to CPython\"。" + +#: ../../c-api/subinterpreters.rst:396 +msgid "Set the frame evaluation function." +msgstr "设置帧评估函数。" + +#: ../../c-api/subinterpreters.rst:404 +msgid "Low-level APIs" +msgstr "低层级 API" + +#: ../../c-api/subinterpreters.rst:406 +msgid "" +"All of the following functions must be called after :c:func:`Py_Initialize`." +msgstr "下列所有函数都必须在 :c:func:`Py_Initialize` 之后被调用。" + +#: ../../c-api/subinterpreters.rst:408 +msgid "" +":c:func:`Py_Initialize()` now initializes the :term:`GIL` and sets an " +":term:`attached thread state`." +msgstr "" +"现在 :c:func:`Py_Initialize()` 会初始化 :term:`GIL` 并设置一个 :term:`attached thread " +"state` 线程状态。" + +#: ../../c-api/subinterpreters.rst:415 +msgid "" +"Create a new interpreter state object. An :term:`attached thread state` is " +"not needed, but may optionally exist if it is necessary to serialize calls " +"to this function." +msgstr "" +"新建一个解释器状态对象。不需要有 :term:`attached thread state`,但如果有必要序列化对此函数的调用则可能选择有。" + +#: ../../c-api/subinterpreters.rst:419 +msgid "" +"Raises an :ref:`auditing event ` " +"``cpython.PyInterpreterState_New`` with no arguments." +msgstr "引发一个不带参数的 :ref:`审计事件 ` ``cpython.PyInterpreterState_New``。" + +#: ../../c-api/subinterpreters.rst:424 +msgid "" +"Reset all information in an interpreter state object. There must be an " +":term:`attached thread state` for the interpreter." +msgstr "重置解释器状态对象中的所有信息。解释器必须存在一个 :term:`attached thread state`。" + +#: ../../c-api/subinterpreters.rst:427 +msgid "" +"Raises an :ref:`auditing event ` " +"``cpython.PyInterpreterState_Clear`` with no arguments." +msgstr "" +"引发一个不带参数的 :ref:`审计事件 ` ``cpython.PyInterpreterState_Clear``。" + +#: ../../c-api/subinterpreters.rst:432 +msgid "" +"Destroy an interpreter state object. There **should not** be an " +":term:`attached thread state` for the target interpreter. The interpreter " +"state must have been reset with a previous call to " +":c:func:`PyInterpreterState_Clear`." +msgstr "" +"销毁一个解释器状态对象。目标解释器 **不应** 存在 :term:`attached thread state`。在调用此函数之前,必须先调用 " +":c:func:`PyInterpreterState_Clear` 重置解释器状态。" + +#: ../../c-api/subinterpreters.rst:440 +msgid "Advanced debugger support" +msgstr "" + +#: ../../c-api/subinterpreters.rst:442 +msgid "" +"These functions are only intended to be used by advanced debugging tools." +msgstr "这些函数仅供高级调试工具使用。" + +#: ../../c-api/subinterpreters.rst:447 +msgid "" +"Return the interpreter state object at the head of the list of all such " +"objects." +msgstr "返回由所有此类对象组成的列表中位于开头的解释器状态对象。" + +#: ../../c-api/subinterpreters.rst:452 +msgid "Return the main interpreter state object." +msgstr "返回主解释器状态对象。" + +#: ../../c-api/subinterpreters.rst:457 +msgid "" +"Return the next interpreter state object after *interp* from the list of all" +" such objects." +msgstr "从由解释器状态对象组成的列表中返回 *interp* 之后的下一项。" + +#: ../../c-api/subinterpreters.rst:463 +msgid "" +"Return the pointer to the first :c:type:`PyThreadState` object in the list " +"of threads associated with the interpreter *interp*." +msgstr "在由与解释器 *interp* 相关联的线程组成的列表中返回指向第一个 :c:type:`PyThreadState` 对象的指针。" + +#: ../../c-api/subinterpreters.rst:469 +msgid "" +"Return the next thread state object after *tstate* from the list of all such" +" objects belonging to the same :c:type:`PyInterpreterState` object." +msgstr "" +"从由属于同一个 :c:type:`PyInterpreterState` 对象的线程状态对象组成的列表中返回 *tstate* 之后的下一项。" + +#: ../../c-api/subinterpreters.rst:115 ../../c-api/subinterpreters.rst:215 +msgid "module" +msgstr "module" + +#: ../../c-api/subinterpreters.rst:115 ../../c-api/subinterpreters.rst:215 +msgid "builtins" +msgstr "builtins" + +#: ../../c-api/subinterpreters.rst:115 ../../c-api/subinterpreters.rst:215 +msgid "__main__" +msgstr "__main__" + +#: ../../c-api/subinterpreters.rst:115 ../../c-api/subinterpreters.rst:215 +msgid "sys" +msgstr "sys" + +#: ../../c-api/subinterpreters.rst:115 ../../c-api/subinterpreters.rst:215 +msgid "stdout (in module sys)" +msgstr "stdout (在 sys 模块中)" + +#: ../../c-api/subinterpreters.rst:115 ../../c-api/subinterpreters.rst:215 +msgid "stderr (in module sys)" +msgstr "stderr (在 sys 模块中)" + +#: ../../c-api/subinterpreters.rst:115 ../../c-api/subinterpreters.rst:215 +msgid "stdin (in module sys)" +msgstr "stdin (在 sys 模块中)" + +#: ../../c-api/subinterpreters.rst:179 ../../c-api/subinterpreters.rst:233 +msgid "Py_FinalizeEx (C function)" +msgstr "Py_FinalizeEx (C 函数)" + +#: ../../c-api/subinterpreters.rst:179 +msgid "Py_Initialize (C function)" +msgstr "Py_Initialize (C 函数)" + +#: ../../c-api/subinterpreters.rst:210 +msgid "close (in module os)" +msgstr "close (在 os 模块中)" diff --git a/c-api/synchronization.po b/c-api/synchronization.po new file mode 100644 index 0000000000..ba4001398d --- /dev/null +++ b/c-api/synchronization.po @@ -0,0 +1,428 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/synchronization.rst:6 +msgid "Synchronization primitives" +msgstr "同步原语" + +#: ../../c-api/synchronization.rst:8 +msgid "The C-API provides a basic mutual exclusion lock." +msgstr "C-API 提供了一个基本的互斥锁。" + +#: ../../c-api/synchronization.rst:12 +msgid "" +"A mutual exclusion lock. The :c:type:`!PyMutex` should be initialized to " +"zero to represent the unlocked state. For example::" +msgstr "一个互斥锁。 :c:type:`!PyMutex` 应当被初始化为零以代表未加锁状态。例如::" + +#: ../../c-api/synchronization.rst:15 +msgid "PyMutex mutex = {0};" +msgstr "PyMutex mutex = {0};" + +#: ../../c-api/synchronization.rst:17 +msgid "" +"Instances of :c:type:`!PyMutex` should not be copied or moved. Both the " +"contents and address of a :c:type:`!PyMutex` are meaningful, and it must " +"remain at a fixed, writable location in memory." +msgstr "" +":c:type:`!PyMutex` 的实例不应被拷贝或移动。 :c:type:`!PyMutex` " +"的内容和地址都是有意义的,它必须在内存中保持一个固定的、可写的位置。" + +#: ../../c-api/synchronization.rst:23 +msgid "" +"A :c:type:`!PyMutex` currently occupies one byte, but the size should be " +"considered unstable. The size may change in future Python releases without " +"a deprecation period." +msgstr "" +":c:type:`!PyMutex` 目前占用一个字节,但这个大小应当被视为是不稳定的。这个大小可能在未来的 Python " +"发布版中发生改变而不会设置弃用期。" + +#: ../../c-api/synchronization.rst:31 +msgid "" +"Lock mutex *m*. If another thread has already locked it, the calling thread" +" will block until the mutex is unlocked. While blocked, the thread will " +"temporarily detach the :term:`thread state ` if one " +"exists." +msgstr "" +"锁定互斥锁 *m*。如果另一个线程已经锁定了它,调用方线程将会阻塞直到互斥锁被解锁。在阻塞期间,如果线程存在 :term:`线程状态 ` 则会临时释放它。" + +#: ../../c-api/synchronization.rst:39 +msgid "" +"Unlock mutex *m*. The mutex must be locked --- otherwise, the function will " +"issue a fatal error." +msgstr "解锁互斥锁 *m*。该互斥锁必须已被锁定 --- 否则,此函数将发生致命错误。" + +#: ../../c-api/synchronization.rst:46 +msgid "Returns non-zero if the mutex *m* is currently locked, zero otherwise." +msgstr "若互斥锁 *m* 当前处于锁定状态,则返回非零值;否则返回零。" + +#: ../../c-api/synchronization.rst:50 +msgid "" +"This function is intended for use in assertions and debugging only and " +"should not be used to make concurrency control decisions, as the lock state " +"may change immediately after the check." +msgstr "此函数仅适用于断言和调试场景,请勿将其用于并发控制决策,因为锁状态可能在检查后立即发生变化。" + +#: ../../c-api/synchronization.rst:59 +msgid "Python critical section API" +msgstr "Python 关键节 API" + +#: ../../c-api/synchronization.rst:61 +msgid "" +"The critical section API provides a deadlock avoidance layer on top of per-" +"object locks for :term:`free-threaded ` CPython. They are " +"intended to replace reliance on the :term:`global interpreter lock`, and are" +" no-ops in versions of Python with the global interpreter lock." +msgstr "" +"此关键节 API 为 :term:`自由线程 ` CPython 的每对象锁之上提供了一个死锁避免层。它们旨在替代对 " +":term:`global interpreter lock` 的依赖,而在具有全局解释器锁的 Python 版本上将不做任何操作。" + +#: ../../c-api/synchronization.rst:66 +msgid "" +"Critical sections are intended to be used for custom types implemented in " +"C-API extensions. They should generally not be used with built-in types like" +" :class:`list` and :class:`dict` because their public C-APIs already use " +"critical sections internally, with the notable exception of " +":c:func:`PyDict_Next`, which requires critical section to be acquired " +"externally." +msgstr "" +"关键节被设计用于在 C-API 扩展中实现的自定义类型。它们通常不应当被用于内置类型如 :class:`list` 和 :class:`dict` " +"因为它们的公有 C-API 已经在内部使用了关键节,一个显著的例外是 :c:func:`PyDict_Next`,它需要在外部获取关键节。" + +#: ../../c-api/synchronization.rst:73 +msgid "" +"Critical sections avoid deadlocks by implicitly suspending active critical " +"sections, hence, they do not provide exclusive access such as provided by " +"traditional locks like :c:type:`PyMutex`. When a critical section is " +"started, the per-object lock for the object is acquired. If the code " +"executed inside the critical section calls C-API functions then it can " +"suspend the critical section thereby releasing the per-object lock, so other" +" threads can acquire the per-object lock for the same object." +msgstr "" +"关键节是通过隐式地挂起活动关键节来避免死锁的,因此,它们并不提供传统锁如 :c:type:`PyMutex` 所提供的那种独占访问。 " +"当一个关键节启动时,将会获取对象的每对象锁。如果关键节内部执行的代码调用了 C-API " +"函数那么它可以挂起关键节从而释放这个每对象锁,这样其他线程就可以获取同一个对象的每对象锁。" + +#: ../../c-api/synchronization.rst:81 +msgid "" +"Variants that accept :c:type:`PyMutex` pointers rather than Python objects " +"are also available. Use these variants to start a critical section in a " +"situation where there is no :c:type:`PyObject` -- for example, when working " +"with a C type that does not extend or wrap :c:type:`PyObject` but still " +"needs to call into the C API in a manner that might lead to deadlocks." +msgstr "" +"此外,还提供了接受 :c:type:`PyMutex` 指针(而非 Python 对象)的函数变体。当你处于没有 :c:type:`PyObject` " +"的场景中时(例如,处理一个既未继承也未封装 :c:type:`PyObject` 的 C 类型,但仍需以可能导致死锁的方式调用 C " +"API),请使用这些变体来启动临界区。" + +#: ../../c-api/synchronization.rst:87 +msgid "" +"The functions and structs used by the macros are exposed for cases where C " +"macros are not available. They should only be used as in the given macro " +"expansions. Note that the sizes and contents of the structures may change in" +" future Python versions." +msgstr "" +"宏所使用的函数和结构体是针对 C 宏不可用的场景而公开的。它们应当仅被用于给定的宏扩展中。请注意这些结构体的大小和内容在未来的 Python " +"版本中可能发生改变。" + +#: ../../c-api/synchronization.rst:94 +msgid "" +"Operations that need to lock two objects at once must use " +":c:macro:`Py_BEGIN_CRITICAL_SECTION2`. You *cannot* use nested critical " +"sections to lock more than one object at once, because the inner critical " +"section may suspend the outer critical sections. This API does not provide " +"a way to lock more than two objects at once." +msgstr "" +"需要同时锁定两个对象的操作必须使用 :c:macro:`Py_BEGIN_CRITICAL_SECTION2`。你 *不可* " +"使用嵌套的关键节来同时锁定一个以上的对象,因为内层的关键节可能会挂起外层的关键节。这个 API 没有提供同时锁定两个以上对象的办法。" + +#: ../../c-api/synchronization.rst:100 +msgid "Example usage::" +msgstr "用法示例::" + +#: ../../c-api/synchronization.rst:102 +msgid "" +"static PyObject *\n" +"set_field(MyObject *self, PyObject *value)\n" +"{\n" +" Py_BEGIN_CRITICAL_SECTION(self);\n" +" Py_SETREF(self->field, Py_XNewRef(value));\n" +" Py_END_CRITICAL_SECTION();\n" +" Py_RETURN_NONE;\n" +"}" +msgstr "" +"static PyObject *\n" +"set_field(MyObject *self, PyObject *value)\n" +"{\n" +" Py_BEGIN_CRITICAL_SECTION(self);\n" +" Py_SETREF(self->field, Py_XNewRef(value));\n" +" Py_END_CRITICAL_SECTION();\n" +" Py_RETURN_NONE;\n" +"}" + +#: ../../c-api/synchronization.rst:111 +msgid "" +"In the above example, :c:macro:`Py_SETREF` calls :c:macro:`Py_DECREF`, which" +" can call arbitrary code through an object's deallocation function. The " +"critical section API avoids potential deadlocks due to reentrancy and lock " +"ordering by allowing the runtime to temporarily suspend the critical section" +" if the code triggered by the finalizer blocks and calls " +":c:func:`PyEval_SaveThread`." +msgstr "" +"在上面的例子中,:c:macro:`Py_SETREF` 调用了 " +":c:macro:`Py_DECREF`,它可以通过一个对象的取消分配函数来调用任意代码。当由最终化器触发的代码发生阻塞并调用 " +":c:func:`PyEval_SaveThread` 时关键节 API 将通过允许运行临时挂起关键节来避免由于重入和锁顺序导致的潜在死锁。" + +#: ../../c-api/synchronization.rst:119 +msgid "" +"Acquires the per-object lock for the object *op* and begins a critical " +"section." +msgstr "为对象 *op* 获取每对象锁并开始一个关键节。" + +#: ../../c-api/synchronization.rst:122 ../../c-api/synchronization.rst:136 +#: ../../c-api/synchronization.rst:153 ../../c-api/synchronization.rst:168 +#: ../../c-api/synchronization.rst:182 ../../c-api/synchronization.rst:199 +msgid "In the free-threaded build, this macro expands to::" +msgstr "在自由线程构建版中,该宏将扩展为::" + +#: ../../c-api/synchronization.rst:124 +msgid "" +"{\n" +" PyCriticalSection _py_cs;\n" +" PyCriticalSection_Begin(&_py_cs, (PyObject*)(op))" +msgstr "" +"{\n" +" PyCriticalSection _py_cs;\n" +" PyCriticalSection_Begin(&_py_cs, (PyObject*)(op))" + +#: ../../c-api/synchronization.rst:128 ../../c-api/synchronization.rst:174 +msgid "In the default build, this macro expands to ``{``." +msgstr "在默认构建版中,该宏将扩展为 ``{``。" + +#: ../../c-api/synchronization.rst:134 +msgid "Locks the mutex *m* and begins a critical section." +msgstr "锁定互斥锁 *m* 并开始一个临界区。" + +#: ../../c-api/synchronization.rst:138 +msgid "" +"{\n" +" PyCriticalSection _py_cs;\n" +" PyCriticalSection_BeginMutex(&_py_cs, m)" +msgstr "" +"{\n" +" PyCriticalSection _py_cs;\n" +" PyCriticalSection_BeginMutex(&_py_cs, m)" + +#: ../../c-api/synchronization.rst:142 +msgid "" +"Note that unlike :c:macro:`Py_BEGIN_CRITICAL_SECTION`, there is no cast for " +"the argument of the macro - it must be a :c:type:`PyMutex` pointer." +msgstr "" +"需要注意的是,与 :c:macro:`Py_BEGIN_CRITICAL_SECTION` 不同,此宏的参数无需类型转换——它必须是一个 " +":c:type:`PyMutex` 指针。" + +#: ../../c-api/synchronization.rst:145 ../../c-api/synchronization.rst:191 +msgid "On the default build, this macro expands to ``{``." +msgstr "在默认构建版中,该宏将扩展为 ``{``。" + +#: ../../c-api/synchronization.rst:151 +msgid "Ends the critical section and releases the per-object lock." +msgstr "结束关键节并释放每对象锁。" + +#: ../../c-api/synchronization.rst:155 +msgid "" +" PyCriticalSection_End(&_py_cs);\n" +"}" +msgstr "" +" PyCriticalSection_End(&_py_cs);\n" +"}" + +#: ../../c-api/synchronization.rst:158 ../../c-api/synchronization.rst:204 +msgid "In the default build, this macro expands to ``}``." +msgstr "在默认构建版中,该宏将扩展为 ``}``。" + +#: ../../c-api/synchronization.rst:164 +msgid "" +"Acquires the per-object locks for the objects *a* and *b* and begins a " +"critical section. The locks are acquired in a consistent order (lowest " +"address first) to avoid lock ordering deadlocks." +msgstr "为对象 *a* 和 *b* 获取每对象锁并开始一个关键节。 这些锁将按一致的顺序获取(最低的地址在最前)以避免锁排序死锁。" + +#: ../../c-api/synchronization.rst:170 +msgid "" +"{\n" +" PyCriticalSection2 _py_cs2;\n" +" PyCriticalSection2_Begin(&_py_cs2, (PyObject*)(a), (PyObject*)(b))" +msgstr "" +"{\n" +" PyCriticalSection2 _py_cs2;\n" +" PyCriticalSection2_Begin(&_py_cs2, (PyObject*)(a), (PyObject*)(b))" + +#: ../../c-api/synchronization.rst:180 +msgid "Locks the mutexes *m1* and *m2* and begins a critical section." +msgstr "锁定互斥锁 *m1* 和 *m2* 并开始一个临界区。" + +#: ../../c-api/synchronization.rst:184 +msgid "" +"{\n" +" PyCriticalSection2 _py_cs2;\n" +" PyCriticalSection2_BeginMutex(&_py_cs2, m1, m2)" +msgstr "" +"{\n" +" PyCriticalSection2 _py_cs2;\n" +" PyCriticalSection2_BeginMutex(&_py_cs2, m1, m2)" + +#: ../../c-api/synchronization.rst:188 +msgid "" +"Note that unlike :c:macro:`Py_BEGIN_CRITICAL_SECTION2`, there is no cast for" +" the arguments of the macro - they must be :c:type:`PyMutex` pointers." +msgstr "" +"需要注意的是,与 :c:macro:`Py_BEGIN_CRITICAL_SECTION2` 不同,此宏的参数无需类型转换——它们必须是 " +":c:type:`PyMutex` 指针。" + +#: ../../c-api/synchronization.rst:197 +msgid "Ends the critical section and releases the per-object locks." +msgstr "结束关键节并释放每对象锁。" + +#: ../../c-api/synchronization.rst:201 +msgid "" +" PyCriticalSection2_End(&_py_cs2);\n" +"}" +msgstr "" +" PyCriticalSection2_End(&_py_cs2);\n" +"}" + +#: ../../c-api/synchronization.rst:210 +msgid "Legacy locking APIs" +msgstr "旧式加锁 API" + +#: ../../c-api/synchronization.rst:212 +msgid "" +"These APIs are obsolete since Python 3.13 with the introduction of " +":c:type:`PyMutex`." +msgstr "这些 API 自 Python 3.13 起已随 :c:type:`PyMutex` 的引入而过时。" + +#: ../../c-api/synchronization.rst:218 +msgid "A pointer to a mutual exclusion lock." +msgstr "一个指向互斥锁的指针。" + +#: ../../c-api/synchronization.rst:223 +msgid "The result of acquiring a lock with a timeout." +msgstr "附带超时获取锁操作的结果。" + +#: ../../c-api/synchronization.rst:229 +msgid "Failed to acquire the lock." +msgstr "获取锁失败。" + +#: ../../c-api/synchronization.rst:233 +msgid "The lock was successfully acquired." +msgstr "锁已被成功获取。" + +#: ../../c-api/synchronization.rst:237 +msgid "The lock was interrupted by a signal." +msgstr "锁被一个信号中断。" + +#: ../../c-api/synchronization.rst:242 +msgid "Allocate a new lock." +msgstr "分配一个新锁。" + +#: ../../c-api/synchronization.rst:244 +msgid "" +"On success, this function returns a lock; on failure, this function returns " +"``0`` without an exception set." +msgstr "成功时,此函数将返回一个锁;失败时,此函数将返回 ``0`` 且不设置异常。" + +#: ../../c-api/synchronization.rst:247 ../../c-api/synchronization.rst:255 +#: ../../c-api/synchronization.rst:275 ../../c-api/synchronization.rst:293 +#: ../../c-api/synchronization.rst:301 +msgid "The caller does not need to hold an :term:`attached thread state`." +msgstr "调用方不需要持有 :term:`attached thread state`。" + +#: ../../c-api/synchronization.rst:252 +msgid "" +"Destroy *lock*. The lock should not be held by any thread when calling this." +msgstr "销毁 *lock*。在调用此函数时该锁不应被任何线程持有。" + +#: ../../c-api/synchronization.rst:260 +msgid "Acquire *lock* with a timeout." +msgstr "获取 *lock* 并附带超时控制。" + +#: ../../c-api/synchronization.rst:262 +msgid "" +"This will wait for *microseconds* microseconds to acquire the lock. If the " +"timeout expires, this function returns :c:enumerator:`PY_LOCK_FAILURE`. If " +"*microseconds* is ``-1``, this will wait indefinitely until the lock has " +"been released." +msgstr "" +"此函数将等待 *microseconds* 微秒以获取锁。如果达到超时限制,此函数将返回 " +":c:enumerator:`PY_LOCK_FAILURE`。如果 *microseconds* 为 ``-1``,它将无限等待直到锁被释放。" + +#: ../../c-api/synchronization.rst:267 +msgid "" +"If *intr_flag* is ``1``, acquiring the lock may be interrupted by a signal, " +"in which case this function returns :c:enumerator:`PY_LOCK_INTR`. Upon " +"interruption, it's generally expected that the caller makes a call to " +":c:func:`Py_MakePendingCalls` to propagate an exception to Python code." +msgstr "" +"如果 *intr_flag* 为 ``1``,获取锁可能会被信号中断,在这种情况下此函数将返回 " +":c:enumerator:`PY_LOCK_INTR`。当被中断时,通常会预期调用方将执行对 " +":c:func:`Py_MakePendingCalls` 的调用以将一个异常传播给 Python 代码。" + +#: ../../c-api/synchronization.rst:272 +msgid "" +"If the lock is successfully acquired, this function returns " +":c:enumerator:`PY_LOCK_ACQUIRED`." +msgstr "如果锁被成功获取,此函数将返回 :c:enumerator:`PY_LOCK_ACQUIRED`。" + +#: ../../c-api/synchronization.rst:280 +msgid "Acquire *lock*." +msgstr "获取 *lock*。" + +#: ../../c-api/synchronization.rst:282 +msgid "" +"If *waitflag* is ``1`` and another thread currently holds the lock, this " +"function will wait until the lock can be acquired and will always return " +"``1``." +msgstr "如果 *waitflag* 为 ``1`` 且另一个线程目前持有锁,此函数将等待直到锁可被获取并将始终返回 ``1``。" + +#: ../../c-api/synchronization.rst:286 +msgid "" +"If *waitflag* is ``0`` and another thread holds the lock, this function will" +" not wait and instead return ``0``. If the lock is not held by any other " +"thread, then this function will acquire it and return ``1``." +msgstr "" +"如果 *waitflag* 为 ``0`` 且另一个线程持有锁,此函数将不会等待而是返回 ``0``。如果锁未被另一个线程持有,则此函数将获取它并返回 " +"``1``。" + +#: ../../c-api/synchronization.rst:290 +msgid "" +"Unlike :c:func:`PyThread_acquire_lock_timed`, acquiring the lock cannot be " +"interrupted by a signal." +msgstr "不同于 :c:func:`PyThread_acquire_lock_timed`,获取锁不会被信号中断。" + +#: ../../c-api/synchronization.rst:298 +msgid "" +"Release *lock*. If *lock* is not held, then this function issues a fatal " +"error." +msgstr "释放 *lock*。如果 *lock* 未被持有,则此函数将引发致命错误。" diff --git a/c-api/sys.po b/c-api/sys.po new file mode 100644 index 0000000000..cb83636595 --- /dev/null +++ b/c-api/sys.po @@ -0,0 +1,740 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:00+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/sys.rst:6 +msgid "Operating System Utilities" +msgstr "操作系统实用工具" + +#: ../../c-api/sys.rst:11 +msgid "" +"Return the file system representation for *path*. If the object is a " +":class:`str` or :class:`bytes` object, then a new :term:`strong reference` " +"is returned. If the object implements the :class:`os.PathLike` interface, " +"then :meth:`~os.PathLike.__fspath__` is returned as long as it is a " +":class:`str` or :class:`bytes` object. Otherwise :exc:`TypeError` is raised " +"and ``NULL`` is returned." +msgstr "" +"返回 *path* 在文件系统中的表示形式。如果该对象是一个 :class:`str` 或 :class:`bytes` 对象,则返回一个新的 " +":term:`strong reference`。如果对象实现了 :class:`os.PathLike` 接口,则只要它是一个 " +":class:`str` 或 :class:`bytes` 对象就将返回 " +":meth:`~os.PathLike.__fspath__`。在其他情况下将引发 :exc:`TypeError` 并返回 ``NULL``。" + +#: ../../c-api/sys.rst:24 +msgid "" +"Return true (nonzero) if the standard I/O file *fp* with name *filename* is " +"deemed interactive. This is the case for files for which " +"``isatty(fileno(fp))`` is true. If the :c:member:`PyConfig.interactive` is " +"non-zero, this function also returns true if the *filename* pointer is " +"``NULL`` or if the name is equal to one of the strings ``''`` or " +"``'???'``." +msgstr "" +"如果名称为 *filename* 的标准 I/O 文件 *fp* 被确认为可交互的则返回真(非零)值。所有 ``isatty(fileno(fp))``" +" 为真值的文件都属于这种情况。如果 :c:member:`PyConfig.interactive` 为非零值,此函数在 *filename* 指针为 " +"``NULL`` 或者其名称等于字符串 ``''`` 或 ``'???'`` 之一时也将返回真值。" + +#: ../../c-api/sys.rst:30 +msgid "This function must not be called before Python is initialized." +msgstr "此函数不可在 Python 被初始化之前调用。" + +#: ../../c-api/sys.rst:35 +msgid "" +"Function to prepare some internal state before a process fork. This should " +"be called before calling :c:func:`fork` or any similar function that clones " +"the current process. Only available on systems where :c:func:`fork` is " +"defined." +msgstr "" +"在进程分叉之前准备某些内部状态的函数。此函数应当在调用 :c:func:`fork` 或者任何类似的克隆当前进程的函数之前被调用。只适用于定义了 " +":c:func:`fork` 的系统。" + +#: ../../c-api/sys.rst:41 +msgid "" +"The C :c:func:`fork` call should only be made from the :ref:`\"main\" thread" +" ` (of the :ref:`\"main\" interpreter `). The same is true for ``PyOS_BeforeFork()``." +msgstr "" +"C :c:func:`fork` 调用应当只在 :ref:`\"main\" 线程 ` (位于 " +":ref:`\"main\" 解释器 `) 中进行。对于 ``PyOS_BeforeFork()`` " +"来说也是如此。" + +#: ../../c-api/sys.rst:51 +msgid "" +"Function to update some internal state after a process fork. This should be" +" called from the parent process after calling :c:func:`fork` or any similar " +"function that clones the current process, regardless of whether process " +"cloning was successful. Only available on systems where :c:func:`fork` is " +"defined." +msgstr "" +"在进程分叉之后更新某些内部状态的函数。此函数应当在调用 :c:func:`fork` " +"或任何类似的克隆当前进程的函数之后从父进程中被调用,无论进程克隆是否成功。只适用于定义了 :c:func:`fork` 的系统。" + +#: ../../c-api/sys.rst:58 +msgid "" +"The C :c:func:`fork` call should only be made from the :ref:`\"main\" thread" +" ` (of the :ref:`\"main\" interpreter `). The same is true for ``PyOS_AfterFork_Parent()``." +msgstr "" +"C :c:func:`fork` 调用应当只在 :ref:`\"main\" 线程 ` (位于 " +":ref:`\"main\" 解释器 `) 中进行。对于 " +"``PyOS_AfterFork_Parent()`` 来说也是如此。" + +#: ../../c-api/sys.rst:68 +msgid "" +"Function to update internal interpreter state after a process fork. This " +"must be called from the child process after calling :c:func:`fork`, or any " +"similar function that clones the current process, if there is any chance the" +" process will call back into the Python interpreter. Only available on " +"systems where :c:func:`fork` is defined." +msgstr "" +"在进程分叉之后更新内部解释器状态的函数。此函数必须在调用 :c:func:`fork` " +"或任何类似的克隆当前进程的函数之后在子进程中被调用,如果该进程有机会回调到 Python 解释器的话。只适用于定义了 :c:func:`fork` " +"的系统。" + +#: ../../c-api/sys.rst:75 +msgid "" +"The C :c:func:`fork` call should only be made from the :ref:`\"main\" thread" +" ` (of the :ref:`\"main\" interpreter `). The same is true for ``PyOS_AfterFork_Child()``." +msgstr "" +"C :c:func:`fork` 调用应当只在 :ref:`\"main\" 线程 ` (位于 " +":ref:`\"main\" 解释器 `) 中进行。对于 " +"``PyOS_AfterFork_Child()`` 来说也是如此。" + +#: ../../c-api/sys.rst:83 +msgid "" +":func:`os.register_at_fork` allows registering custom Python functions to be" +" called by :c:func:`PyOS_BeforeFork()`, :c:func:`PyOS_AfterFork_Parent` and" +" :c:func:`PyOS_AfterFork_Child`." +msgstr "" +":func:`os.register_at_fork` 允许注册可被 :c:func:`PyOS_BeforeFork()`, " +":c:func:`PyOS_AfterFork_Parent` 和 :c:func:`PyOS_AfterFork_Child` 调用的自定义 " +"Python 函数。" + +#: ../../c-api/sys.rst:90 +msgid "" +"Function to update some internal state after a process fork; this should be " +"called in the new process if the Python interpreter will continue to be " +"used. If a new executable is loaded into the new process, this function does" +" not need to be called." +msgstr "" +"在进程分叉之后更新某些内部状态的函数;如果要继续使用 Python " +"解释器则此函数应当在新进程中被调用。如果已将一个新的可执行文件载入到新进程中,则不需要调用此函数。" + +#: ../../c-api/sys.rst:95 +msgid "This function is superseded by :c:func:`PyOS_AfterFork_Child()`." +msgstr "此函数已被 :c:func:`PyOS_AfterFork_Child()` 取代。" + +#: ../../c-api/sys.rst:103 +msgid "" +"Return true when the interpreter runs out of stack space. This is a " +"reliable check, but is only available when :c:macro:`!USE_STACKCHECK` is " +"defined (currently on certain versions of Windows using the Microsoft Visual" +" C++ compiler). :c:macro:`!USE_STACKCHECK` will be defined automatically; " +"you should never change the definition in your own code." +msgstr "" +"当解释器耗尽栈空间时返回真值。这是一个可靠的检测,但仅在定义了 :c:macro:`!USE_STACKCHECK` 时可用(目前是在使用 " +"Microsoft Visual C++ 编译器的特定 Windows 版本上)。:c:macro:`!USE_STACKCHECK` " +"将被自动定义;你绝不应该在你自己的代码中改变此定义。" + +#: ../../c-api/sys.rst:115 +msgid "" +"Return the current signal handler for signal *i*. This is a thin wrapper " +"around either :c:func:`!sigaction` or :c:func:`!signal`. Do not call those " +"functions directly!" +msgstr "" +"返回信号 *i* 当前的信号处理器。这是一个对 :c:func:`!sigaction` 或 :c:func:`!signal` " +"的简单包装器。请不要直接调用这两个函数!" + +#: ../../c-api/sys.rst:122 +msgid "" +"Set the signal handler for signal *i* to be *h*; return the old signal " +"handler. This is a thin wrapper around either :c:func:`!sigaction` or " +":c:func:`!signal`. Do not call those functions directly!" +msgstr "" +"将信号 *i* 的信号处理器设为 *h*;返回原来的信号处理器。这是一个对 :c:func:`!sigaction` 或 " +":c:func:`!signal` 的简单包装器。请不要直接调用这两个函数!" + +#: ../../c-api/sys.rst:129 +msgid "Check if a :c:macro:`!SIGINT` signal has been received." +msgstr "检测是否已收到 :c:macro:`!SIGINT` 信号。" + +#: ../../c-api/sys.rst:131 +msgid "" +"Returns ``1`` if a :c:macro:`!SIGINT` has occurred and clears the signal " +"flag, or ``0`` otherwise." +msgstr "如果 :c:macro:`!SIGINT` 已发生则返回 ``1`` 并清空信号旗标,否则返回 ``0``。" + +#: ../../c-api/sys.rst:134 +msgid "" +"In most cases, you should prefer :c:func:`PyErr_CheckSignals` over this " +"function. :c:func:`!PyErr_CheckSignals` invokes the appropriate signal " +"handlers for all pending signals, allowing Python code to handle the signal " +"properly. This function only detects :c:macro:`!SIGINT` and does not invoke " +"any Python signal handlers." +msgstr "" +"在大多数情况下,你都应当选择 :c:func:`PyErr_CheckSignals` " +"而不是此函数。:c:func:`!PyErr_CheckSignals` 会为所有待处理信号调用合适的信号处理器,以允许 Python " +"代码正确地处理信号。此函数只能检测 :c:macro:`!SIGINT` 并且不能调用任何 Python 信号处理器。" + +#: ../../c-api/sys.rst:140 +msgid "" +"This function is async-signal-safe and this function cannot fail. The caller" +" must hold an :term:`attached thread state`." +msgstr "此函数是异步信号安全的并且此函数执行不会失败。调用方必须持有 :term:`attached thread state`。" + +#: ../../c-api/sys.rst:147 +msgid "" +"This function should not be called directly: use the :c:type:`PyConfig` API " +"with the :c:func:`PyConfig_SetBytesString` function which ensures that " +":ref:`Python is preinitialized `." +msgstr "" +"此函数不应当被直接调用:请使用 :c:type:`PyConfig` API 以及可确保 :ref:`对 Python 进行预初始化 " +"` 的 :c:func:`PyConfig_SetBytesString` 函数。" + +#: ../../c-api/sys.rst:151 ../../c-api/sys.rst:218 +msgid "" +"This function must not be called before :ref:`Python is preinitialized " +"` and so that the LC_CTYPE locale is properly configured: see the" +" :c:func:`Py_PreInitialize` function." +msgstr "" +"此函数不可在 :ref:`对 Python 进行预初始化 ` 之前被调用以便正确地配置 LC_CTYPE 语言区域:请参阅 " +":c:func:`Py_PreInitialize` 函数。" + +#: ../../c-api/sys.rst:155 +msgid "" +"Decode a byte string from the :term:`filesystem encoding and error handler`." +" If the error handler is :ref:`surrogateescape error handler " +"`, undecodable bytes are decoded as characters in range " +"U+DC80..U+DCFF; and if a byte sequence can be decoded as a surrogate " +"character, the bytes are escaped using the surrogateescape error handler " +"instead of decoding them." +msgstr "" +"使用 :term:`filesystem encoding and error handler` 来解码一个字节串。如果错误处理器为 " +":ref:`surrogateescape 错误处理器 `,则不可解码的字节将被解码为 U+DC80..U+DCFF " +"范围内的字符;而如果一个字节序列可被解码为代理字符,则其中的字节会使用 surrogateescape 错误处理器来转义而不是解码它们。" + +#: ../../c-api/sys.rst:162 +msgid "" +"Return a pointer to a newly allocated wide character string, use " +":c:func:`PyMem_RawFree` to free the memory. If size is not ``NULL``, write " +"the number of wide characters excluding the null character into ``*size``" +msgstr "" +"返回一个指向新分配的由宽字符组成的字符串的指针,使用 :c:func:`PyMem_RawFree` 来释放内存。如果 size 不为 " +"``NULL``,则将排除了 null 字符的宽字符数量写入到 ``*size``" + +#: ../../c-api/sys.rst:166 +msgid "" +"Return ``NULL`` on decoding error or memory allocation error. If *size* is " +"not ``NULL``, ``*size`` is set to ``(size_t)-1`` on memory error or set to " +"``(size_t)-2`` on decoding error." +msgstr "" +"在解码错误或内存分配错误时返回 ``NULL``。如果 *size* 不为 ``NULL``,则 ``*size`` 将在内存错误时设为 " +"``(size_t)-1`` 或在解码错误时设为 ``(size_t)-2``。" + +#: ../../c-api/sys.rst:170 ../../c-api/sys.rst:210 +msgid "" +"The :term:`filesystem encoding and error handler` are selected by " +":c:func:`PyConfig_Read`: see :c:member:`~PyConfig.filesystem_encoding` and " +":c:member:`~PyConfig.filesystem_errors` members of :c:type:`PyConfig`." +msgstr "" +":term:`filesystem encoding and error handler` 是由 :c:func:`PyConfig_Read` " +"来选择的:参见 :c:type:`PyConfig` 的 :c:member:`~PyConfig.filesystem_encoding` 和 " +":c:member:`~PyConfig.filesystem_errors` 等成员。" + +#: ../../c-api/sys.rst:174 +msgid "" +"Decoding errors should never happen, unless there is a bug in the C library." +msgstr "解码错误绝对不应当发生,除非 C 库有程序缺陷。" + +#: ../../c-api/sys.rst:177 +msgid "" +"Use the :c:func:`Py_EncodeLocale` function to encode the character string " +"back to a byte string." +msgstr "请使用 :c:func:`Py_EncodeLocale` 函数来将字符串编码回字节串。" + +#: ../../c-api/sys.rst:182 +msgid "" +"The :c:func:`PyUnicode_DecodeFSDefaultAndSize` and " +":c:func:`PyUnicode_DecodeLocaleAndSize` functions." +msgstr "" +":c:func:`PyUnicode_DecodeFSDefaultAndSize` 和 " +":c:func:`PyUnicode_DecodeLocaleAndSize` 函数。" + +#: ../../c-api/sys.rst:187 ../../c-api/sys.rst:229 +msgid "" +"The function now uses the UTF-8 encoding in the :ref:`Python UTF-8 Mode " +"`." +msgstr "现在此函数在 :ref:`Python UTF-8 模式 ` 下将使用 UTF-8 编码格式。" + +#: ../../c-api/sys.rst:191 +msgid "" +"The function now uses the UTF-8 encoding on Windows if " +":c:member:`PyPreConfig.legacy_windows_fs_encoding` is zero;" +msgstr "" +"现在如果在 Windows 上 :c:member:`PyPreConfig.legacy_windows_fs_encoding` 为零则此函数将使用" +" UTF-8 编码格式;" + +#: ../../c-api/sys.rst:198 +msgid "" +"Encode a wide character string to the :term:`filesystem encoding and error " +"handler`. If the error handler is :ref:`surrogateescape error handler " +"`, surrogate characters in the range U+DC80..U+DCFF are " +"converted to bytes 0x80..0xFF." +msgstr "" +"使用 :term:`filesystem encoding and error handler` " +"将一个由宽字符组成的字符串编码为字节串。如果错误处理器为 :ref:`surrogateescape 错误处理器 " +"`,则在 U+DC80..U+DCFF 范围内的代理字符会被转换为字节值 0x80..0xFF。" + +#: ../../c-api/sys.rst:203 +msgid "" +"Return a pointer to a newly allocated byte string, use :c:func:`PyMem_Free` " +"to free the memory. Return ``NULL`` on encoding error or memory allocation " +"error." +msgstr "" +"返回一个指向新分配的字节串的指针,使用 :c:func:`PyMem_Free` 来释放内存。当发生编码错误或内存分配错误时返回 ``NULL``。" + +#: ../../c-api/sys.rst:207 +msgid "" +"If error_pos is not ``NULL``, ``*error_pos`` is set to ``(size_t)-1`` on " +"success, or set to the index of the invalid character on encoding error." +msgstr "" +"如果 error_pos 不为 ``NULL``,则成功时会将 ``*error_pos`` 设为 " +"``(size_t)-1``,或是在发生编码错误时设为无效字符的索引号。" + +#: ../../c-api/sys.rst:214 +msgid "" +"Use the :c:func:`Py_DecodeLocale` function to decode the bytes string back " +"to a wide character string." +msgstr "请使用 :c:func:`Py_DecodeLocale` 函数来将字节串解码回由宽字符组成的字符串。" + +#: ../../c-api/sys.rst:224 +msgid "" +"The :c:func:`PyUnicode_EncodeFSDefault` and :c:func:`PyUnicode_EncodeLocale`" +" functions." +msgstr "" +":c:func:`PyUnicode_EncodeFSDefault` 和 :c:func:`PyUnicode_EncodeLocale` 函数。" + +#: ../../c-api/sys.rst:233 +msgid "" +"The function now uses the UTF-8 encoding on Windows if " +":c:member:`PyPreConfig.legacy_windows_fs_encoding` is zero." +msgstr "" +"现在如果在 Windows 上 :c:member:`PyPreConfig.legacy_windows_fs_encoding` 为零则此函数将使用" +" UTF-8 编码格式。" + +#: ../../c-api/sys.rst:239 +msgid "" +"Similar to :c:func:`!fopen`, but *path* is a Python object and an exception " +"is set on error." +msgstr "类似于 :c:func:`!fopen`,但 *path* 是一个 Python 对象并且会在出错时设置一个异常。" + +#: ../../c-api/sys.rst:242 +msgid "" +"*path* must be a :class:`str` object, a :class:`bytes` object, or a " +":term:`path-like object`." +msgstr "" +"*path* 必须是一个 :class:`str` 对象,:class:`bytes` 对象或 :term:`path-like object`。" + +#: ../../c-api/sys.rst:245 +msgid "" +"On success, return the new file pointer. On error, set an exception and " +"return ``NULL``." +msgstr "成功时,返回新的文件指针。失败时,设置一个异常并返回 ``NULL``。" + +#: ../../c-api/sys.rst:248 +msgid "" +"The file must be closed by :c:func:`Py_fclose` rather than calling directly " +":c:func:`!fclose`." +msgstr "文件必须通过 :c:func:`Py_fclose` 关闭,而不是直接调用 :c:func:`!fclose`。" + +#: ../../c-api/sys.rst:251 +msgid "The file descriptor is created non-inheritable (:pep:`446`)." +msgstr "创建的文件描述符是不可继承的 (:pep:`446`)。" + +#: ../../c-api/sys.rst:253 +msgid "The caller must have an :term:`attached thread state`." +msgstr "调用方必须有已附加的线程状态 :term:`attached thread state`。" + +#: ../../c-api/sys.rst:260 +msgid "Close a file that was opened by :c:func:`Py_fopen`." +msgstr "关闭由 :c:func:`Py_fopen` 打开的文件。" + +#: ../../c-api/sys.rst:262 +msgid "" +"On success, return ``0``. On error, return ``EOF`` and ``errno`` is set to " +"indicate the error. In either case, any further access (including another " +"call to :c:func:`Py_fclose`) to the stream results in undefined behavior." +msgstr "" +"如果成功,返回 ``0``。出现错误时,返回 ``EOF``,并设置 ``errno`` 来指示错误。在任何一种情况下,对流的任何进一步访问(包括对 " +":c:func:`Py_fclose` 的另一次调用)都会导致未定义的行为。" + +#: ../../c-api/sys.rst:273 +msgid "System Functions" +msgstr "系统功能" + +#: ../../c-api/sys.rst:275 +msgid "" +"These are utility functions that make functionality from the :mod:`sys` " +"module accessible to C code. They all work with the current interpreter " +"thread's :mod:`sys` module's dict, which is contained in the internal thread" +" state structure." +msgstr "" +"这些是使来自 :mod:`sys` 模块的功能可以让 C 代码访问的工具函数。它们都可用于当前解释器线程的 :mod:`sys` " +"模块的字典,该字典包含在内部线程状态结构体中。" + +#: ../../c-api/sys.rst:281 +msgid "" +"Get the attribute *name* of the :mod:`sys` module. Return a :term:`strong " +"reference`. Raise :exc:`RuntimeError` and return ``NULL`` if it does not " +"exist or if the :mod:`sys` module cannot be found." +msgstr "" + +#: ../../c-api/sys.rst:286 +msgid "" +"If the non-existing object should not be treated as a failure, you can use " +":c:func:`PySys_GetOptionalAttr` instead." +msgstr "" + +#: ../../c-api/sys.rst:293 +msgid "" +"This is the same as :c:func:`PySys_GetAttr`, but *name* is specified as a " +":c:expr:`const char*` UTF-8 encoded bytes string, rather than a " +":c:expr:`PyObject*`." +msgstr "" + +#: ../../c-api/sys.rst:297 +msgid "" +"If the non-existing object should not be treated as a failure, you can use " +":c:func:`PySys_GetOptionalAttrString` instead." +msgstr "" + +#: ../../c-api/sys.rst:304 +msgid "" +"Variant of :c:func:`PySys_GetAttr` which doesn't raise exception if the " +"object does not exist." +msgstr "" + +#: ../../c-api/sys.rst:307 +msgid "" +"Set *\\*result* to a new :term:`strong reference` to the object and return " +"``1`` if the object exists." +msgstr "" + +#: ../../c-api/sys.rst:309 +msgid "" +"Set *\\*result* to ``NULL`` and return ``0`` without setting an exception if" +" the object does not exist." +msgstr "" + +#: ../../c-api/sys.rst:311 +msgid "" +"Set an exception, set *\\*result* to ``NULL``, and return ``-1``, if an " +"error occurred." +msgstr "" + +#: ../../c-api/sys.rst:318 +msgid "" +"This is the same as :c:func:`PySys_GetOptionalAttr`, but *name* is specified" +" as a :c:expr:`const char*` UTF-8 encoded bytes string, rather than a " +":c:expr:`PyObject*`." +msgstr "" + +#: ../../c-api/sys.rst:326 +msgid "" +"Similar to :c:func:`PySys_GetAttrString`, but return a :term:`borrowed " +"reference` and return ``NULL`` *without* setting exception on failure." +msgstr "" + +#: ../../c-api/sys.rst:329 +msgid "Preserves exception that was set before the call." +msgstr "" + +#: ../../c-api/sys.rst:333 +msgid "" +"Set *name* in the :mod:`sys` module to *v* unless *v* is ``NULL``, in which " +"case *name* is deleted from the sys module. Returns ``0`` on success, ``-1``" +" on error." +msgstr "" +"将 :mod:`sys` 模块中的 *name* 设为 *v* 除非 *v* 为 ``NULL``,在此情况下 *name* 将从 sys " +"模块中被删除。成功时返回 ``0``,发生错误时返回 ``-1``。" + +#: ../../c-api/sys.rst:339 +msgid "" +"Write the output string described by *format* to :data:`sys.stdout`. No " +"exceptions are raised, even if truncation occurs (see below)." +msgstr "将以 *format* 描述的输出字符串写入到 :data:`sys.stdout`。不会引发任何异常,即使发生了截断(见下文)。" + +#: ../../c-api/sys.rst:342 +msgid "" +"*format* should limit the total size of the formatted output string to 1000 " +"bytes or less -- after 1000 bytes, the output string is truncated. In " +"particular, this means that no unrestricted \"%s\" formats should occur; " +"these should be limited using \"%.s\" where is a decimal number " +"calculated so that plus the maximum size of other formatted text does " +"not exceed 1000 bytes. Also watch out for \"%f\", which can print hundreds " +"of digits for very large numbers." +msgstr "" +"*format* 应当将已格式化的输出字符串的总大小限制在 1000 字节以下 -- 超过 1000 " +"字节后,输出字符串会被截断。特别地,这意味着不应出现不受限制的 \"%s\" 格式;它们应当使用 \"%.s\" 来限制,其中 " +"是一个经计算使得 与其他已格式化文本的最大尺寸之和不会超过 1000 字节的十进制数字。还要注意 " +"\"%f\",它可能为非常大的数字打印出数以百计的数位。" + +#: ../../c-api/sys.rst:350 +msgid "" +"If a problem occurs, or :data:`sys.stdout` is unset, the formatted message " +"is written to the real (C level) *stdout*." +msgstr "如果发生了问题,或者 :data:`sys.stdout` 未设置,则已格式化的消息将被写入到真正的 (C 层级) *stdout*。" + +#: ../../c-api/sys.rst:355 +msgid "" +"As :c:func:`PySys_WriteStdout`, but write to :data:`sys.stderr` or *stderr* " +"instead." +msgstr "类似 :c:func:`PySys_WriteStdout`,但改为写入到 :data:`sys.stderr` 或 *stderr*。" + +#: ../../c-api/sys.rst:360 +msgid "" +"Function similar to PySys_WriteStdout() but format the message using " +":c:func:`PyUnicode_FromFormatV` and don't truncate the message to an " +"arbitrary length." +msgstr "" +"类似 PySys_WriteStdout() 的函数,但会使用 :c:func:`PyUnicode_FromFormatV` " +"来格式化消息并且不会将消息截短至任意长度。" + +#: ../../c-api/sys.rst:368 +msgid "" +"As :c:func:`PySys_FormatStdout`, but write to :data:`sys.stderr` or *stderr*" +" instead." +msgstr "类似 :c:func:`PySys_FormatStdout`,但改为写入到 :data:`sys.stderr` 或 *stderr*。" + +#: ../../c-api/sys.rst:375 +msgid "" +"Return the current dictionary of :option:`-X` options, similarly to " +":data:`sys._xoptions`. On error, ``NULL`` is returned and an exception is " +"set." +msgstr "" +"返回当前 :option:`-X` 选项的字典,类似于 :data:`sys._xoptions`。发生错误时,将返回 ``NULL`` " +"并设置一个异常。" + +#: ../../c-api/sys.rst:384 +msgid "" +"Raise an auditing event with any active hooks. Return zero for success and " +"non-zero with an exception set on failure." +msgstr "使用任何激活的钩子引发一个审计事件。成功时返回零值,失败时返回非零值并设置一个异常。" + +#: ../../c-api/sys.rst:387 +msgid "The *event* string argument must not be *NULL*." +msgstr "*event* 字符串参数必须不为 *NULL*。" + +#: ../../c-api/sys.rst:389 +msgid "" +"If any hooks have been added, *format* and other arguments will be used to " +"construct a tuple to pass. Apart from ``N``, the same format characters as " +"used in :c:func:`Py_BuildValue` are available. If the built value is not a " +"tuple, it will be added into a single-element tuple." +msgstr "" +"如果已添加了任何钩子,则将使用 *format* 和其他参数来构造一个要传入的元组。除 ``N`` 以外,还可使用在 " +":c:func:`Py_BuildValue` 中使用的相同格式字符。如果构建的值不是一个元组,它将被添加到一个单元素的元组中。" + +#: ../../c-api/sys.rst:394 +msgid "" +"The ``N`` format option must not be used. It consumes a reference, but since" +" there is no way to know whether arguments to this function will be " +"consumed, using it may cause reference leaks." +msgstr "不可使用 ``N`` 格式选项。它会消耗一个引用,但是由于无法获知传给此函数的参数是否会被消耗,使用它可能导致引用泄漏。" + +#: ../../c-api/sys.rst:398 +msgid "" +"Note that ``#`` format characters should always be treated as " +":c:type:`Py_ssize_t`, regardless of whether ``PY_SSIZE_T_CLEAN`` was " +"defined." +msgstr "" +"请注意 ``#`` 格式字符应当总是被当作 :c:type:`Py_ssize_t` 来处理,无论是否定义了 ``PY_SSIZE_T_CLEAN``。" + +#: ../../c-api/sys.rst:401 +msgid ":func:`sys.audit` performs the same function from Python code." +msgstr ":func:`sys.audit` 从 Python 代码执行相同的功能。" + +#: ../../c-api/sys.rst:403 +msgid "See also :c:func:`PySys_AuditTuple`." +msgstr "另请参阅 :c:func:`PySys_AuditTuple`。" + +#: ../../c-api/sys.rst:409 +msgid "" +"Require :c:type:`Py_ssize_t` for ``#`` format characters. Previously, an " +"unavoidable deprecation warning was raised." +msgstr "要求 :c:type:`Py_ssize_t` 用于 ``#`` 格式字符。在此之前,会引发一个不可避免的弃用警告。" + +#: ../../c-api/sys.rst:415 +msgid "" +"Similar to :c:func:`PySys_Audit`, but pass arguments as a Python object. " +"*args* must be a :class:`tuple`. To pass no arguments, *args* can be *NULL*." +msgstr "" +"与 :c:func:`PySys_Audit` 类似,但会将参数作为 Python 对象传入。*args* 必须是一个 :class:`tuple`。 " +"如果不传入参数,则 *args* 可以为 *NULL*。" + +#: ../../c-api/sys.rst:423 +msgid "" +"Append the callable *hook* to the list of active auditing hooks. Return zero" +" on success and non-zero on failure. If the runtime has been initialized, " +"also set an error on failure. Hooks added through this API are called for " +"all interpreters created by the runtime." +msgstr "" +"将可调用对象 *hook* 添加到激活的审计钩子列表。在成功时返回零而在失败时返回非零值。如果运行时已经被初始化,还会在失败时设置一个错误。通过此 " +"API 添加的钩子会针对在运行时创建的所有解释器被调用。" + +#: ../../c-api/sys.rst:429 +msgid "" +"The *userData* pointer is passed into the hook function. Since hook " +"functions may be called from different runtimes, this pointer should not " +"refer directly to Python state." +msgstr "*userData* 指针会被传入钩子函数。由于钩子函数可能由不同的运行时调用,该指针不应直接指向 Python 状态。" + +#: ../../c-api/sys.rst:433 +msgid "" +"This function is safe to call before :c:func:`Py_Initialize`. When called " +"after runtime initialization, existing audit hooks are notified and may " +"silently abort the operation by raising an error subclassed from " +":class:`Exception` (other errors will not be silenced)." +msgstr "" +"此函数可在 :c:func:`Py_Initialize` 之前被安全地调用。如果在运行时初始化之后被调用,现有的审计钩子将得到通知并可能通过引发一个从" +" :class:`Exception` 子类化的错误静默地放弃操作(其他错误将不会被静默)。" + +#: ../../c-api/sys.rst:438 +msgid "" +"The hook function is always called with an :term:`attached thread state` by " +"the Python interpreter that raised the event." +msgstr "钩子函数总是由引发事件的 Python 解释器带 :term:`attached thread state` 调用。" + +#: ../../c-api/sys.rst:441 +msgid "" +"See :pep:`578` for a detailed description of auditing. Functions in the " +"runtime and standard library that raise events are listed in the :ref:`audit" +" events table `. Details are in each function's documentation." +msgstr "" +"请参阅 :pep:`578` 了解有关审计的详细描述。在运行时和标准库中会引发审计事件的函数清单见 :ref:`审计事件表 `。更多细节见每个函数的文档。" + +#: ../../c-api/sys.rst:446 ../../c-api/sys.rst:448 +msgid "" +"If the interpreter is initialized, this function raises an auditing event " +"``sys.addaudithook`` with no arguments. If any existing hooks raise an " +"exception derived from :class:`Exception`, the new hook will not be added " +"and the exception is cleared. As a result, callers cannot assume that their " +"hook has been added unless they control all existing hooks." +msgstr "" +"如果解释器已被初始化,此函数将引发一个审计事件 ``sys.addaudithook`` 且不附带任何参数。如果有任何现存的钩子引发了一个派生自 " +":class:`Exception` 的异常,新的钩子将不会被添加且该异常会被清除。因此,调用方不可假定他们的钩子已被添加除非他们能控制所有现存的钩子。" + +#: ../../c-api/sys.rst:457 +msgid "" +"The type of the hook function. *event* is the C string event argument passed" +" to :c:func:`PySys_Audit` or :c:func:`PySys_AuditTuple`. *args* is " +"guaranteed to be a :c:type:`PyTupleObject`. *userData* is the argument " +"passed to PySys_AddAuditHook()." +msgstr "" +"钩子函数的类型。*event* 是传给 :c:func:`PySys_Audit` 或 :c:func:`PySys_AuditTuple` 的 C " +"字符串形式的事件参数。*args* 会确保为一个 :c:type:`PyTupleObject`。*userData* 是传给 " +"PySys_AddAuditHook() 的参数。" + +#: ../../c-api/sys.rst:469 +msgid "Process Control" +msgstr "进程控制" + +#: ../../c-api/sys.rst:476 +msgid "" +"Print a fatal error message and kill the process. No cleanup is performed. " +"This function should only be invoked when a condition is detected that would" +" make it dangerous to continue using the Python interpreter; e.g., when the " +"object administration appears to be corrupted. On Unix, the standard C " +"library function :c:func:`!abort` is called which will attempt to produce a " +":file:`core` file." +msgstr "" +"打印一个致命错误消息并杀死进程。不会执行任何清理。此函数应当仅在检测到可能令继续使用 Python " +"解释器会有危险的情况时被调用;例如对象管理已被破坏的时候。在 Unix 上,会调用标准 C 库函数 :c:func:`!abort` " +"并将由它来尝试生成一个 :file:`core` 文件。" + +#: ../../c-api/sys.rst:483 +msgid "" +"The ``Py_FatalError()`` function is replaced with a macro which logs " +"automatically the name of the current function, unless the " +"``Py_LIMITED_API`` macro is defined." +msgstr "" +"``Py_FatalError()`` 函数会被替换为一个将自动记录当前函数名称的宏,除非定义了 ``Py_LIMITED_API`` 宏。" + +#: ../../c-api/sys.rst:487 +msgid "Log the function name automatically." +msgstr "自动记录函数名称。" + +#: ../../c-api/sys.rst:497 +msgid "" +"Exit the current process. This calls :c:func:`Py_FinalizeEx` and then calls" +" the standard C library function ``exit(status)``. If " +":c:func:`Py_FinalizeEx` indicates an error, the exit status is set to 120." +msgstr "" +"退出当前进程。这将调用 :c:func:`Py_FinalizeEx` 然后再调用标准 C 库函数 ``exit(status)``。如果 " +":c:func:`Py_FinalizeEx` 提示错误,退出状态将被设为 120。" + +#: ../../c-api/sys.rst:501 +msgid "Errors from finalization no longer ignored." +msgstr "来自最终化的错误不会再被忽略。" + +#: ../../c-api/sys.rst:511 +msgid "" +"Register a cleanup function to be called by :c:func:`Py_FinalizeEx`. The " +"cleanup function will be called with no arguments and should return no " +"value. At most 32 cleanup functions can be registered. When the " +"registration is successful, :c:func:`Py_AtExit` returns ``0``; on failure, " +"it returns ``-1``. The cleanup function registered last is called first. " +"Each cleanup function will be called at most once. Since Python's internal " +"finalization will have completed before the cleanup function, no Python APIs" +" should be called by *func*." +msgstr "" +"注册一个由 :c:func:`Py_FinalizeEx` 调用的清理函数。调用清理函数将不传入任何参数且不应返回任何值。最多可以注册 32 " +"个清理函数。当注册成功时,:c:func:`Py_AtExit` 将返回 ``0``;失败时,它将返回 " +"``-1``。最后注册的清理函数会最先被调用。每个清理函数将至多被调用一次。由于 Python 的内部最终化将在清理函数之前完成,因此 Python " +"API 不应被 *func* 调用。" + +#: ../../c-api/sys.rst:521 +msgid ":c:func:`PyUnstable_AtExit` for passing a ``void *data`` argument." +msgstr ":c:func:`PyUnstable_AtExit` 用于传递 ``void *data`` 参数。" + +#: ../../c-api/sys.rst:101 +msgid "USE_STACKCHECK (C macro)" +msgstr "USE_STACKCHECK (C 宏)" + +#: ../../c-api/sys.rst:474 +msgid "abort (C function)" +msgstr "abort (C 函数)" + +#: ../../c-api/sys.rst:493 ../../c-api/sys.rst:507 +msgid "Py_FinalizeEx (C function)" +msgstr "Py_FinalizeEx (C 函数)" + +#: ../../c-api/sys.rst:493 +msgid "exit (C function)" +msgstr "exit (C 函数)" + +#: ../../c-api/sys.rst:507 +msgid "cleanup functions" +msgstr "清理函数" diff --git a/c-api/threads.po b/c-api/threads.po new file mode 100644 index 0000000000..450cebdf28 --- /dev/null +++ b/c-api/threads.po @@ -0,0 +1,1303 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-01 17:14+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/threads.rst:6 +msgid "Thread states and the global interpreter lock" +msgstr "线程状态和全局解释器锁" + +#: ../../c-api/threads.rst:13 +msgid "" +"Unless on a :term:`free-threaded build` of :term:`CPython`, the Python " +"interpreter is generally not thread-safe. In order to support multi-" +"threaded Python programs, there's a global lock, called the :term:`global " +"interpreter lock` or :term:`GIL`, that must be held by a thread before " +"accessing Python objects. Without the lock, even the simplest operations " +"could cause problems in a multi-threaded program: for example, when two " +"threads simultaneously increment the reference count of the same object, the" +" reference count could end up being incremented only once instead of twice." +msgstr "" +"除非使用 :term:`CPython` 的 :term:`free-threaded build` 版本,否则Python " +"解释器通常都不是线程安全的。 为了支持多线程的 Python 程序,解释器有一个全局锁,称为 :term:`global interpreter " +"lock` 或 :term:`GIL`,线程必须在访问 Python 对象之前先持有它。 " +"如果没有这个锁,即使最简单的操作在多线程的程序中也可能造成问题:例如,当两个线程同时递增同一个对象的引用计数时,引用计数可能只增加一次而不是两次。" + +#: ../../c-api/threads.rst:22 +msgid "" +"As such, only a thread that holds the GIL may operate on Python objects or " +"invoke Python's C API." +msgstr "因此,线程必须持有 GIL 才能操作 Python 对象或唤起 Python 的 C API。" + +#: ../../c-api/threads.rst:27 +msgid "" +"In order to emulate concurrency, the interpreter regularly tries to switch " +"threads between bytecode instructions (see :func:`sys.setswitchinterval`). " +"This is why locks are also necessary for thread-safety in pure-Python code." +msgstr "" +"为了模拟并发,解释器会定期在字节指令间尝试切换线程 (参见 :func:`sys.setswitchinterval`)。 因此在纯 Python " +"代码中也必须要有这个锁。" + +#: ../../c-api/threads.rst:31 +msgid "" +"Additionally, the global interpreter lock is released around blocking I/O " +"operations, such as reading or writing to a file. From the C API, this is " +"done by :ref:`detaching the thread state `." +msgstr "" +"此外,全局解释器锁会在阻塞型 I/O 操作时被释放,如读取或写入文件等。 在 C API 中,这是通过 :ref:`分离线程状态 ` 完成的。" + +#: ../../c-api/threads.rst:39 +msgid "" +"The Python interpreter keeps some thread-local information inside a data " +"structure called :c:type:`PyThreadState`, known as a :term:`thread state`. " +"Each thread has a thread-local pointer to a :c:type:`PyThreadState`; a " +"thread state referenced by this pointer is considered to be :term:`attached " +"`." +msgstr "" +"Python 解释器会将线程的局部信息保存在名为 :c:type:`PyThreadState` 的数据结构中,或称 :term:`thread " +"state`。 每个线程都有一个指向 :c:type:`PyThreadState` 的线程局部指针;这个指针所引用的线程状态会被视为 " +":term:`已附加线程状态 `。" + +#: ../../c-api/threads.rst:44 +msgid "" +"A thread can only have one :term:`attached thread state` at a time. An " +"attached thread state is typically analogous with holding the GIL, except on" +" free-threaded builds. On builds with the GIL enabled, attaching a thread " +"state will block until the GIL can be acquired. However, even on builds with" +" the GIL disabled, it is still required to have an attached thread state, as" +" the interpreter needs to keep track of which threads may access Python " +"objects." +msgstr "" +"一个线程在同一时刻只能拥有一个 :term:`attached thread state`。 已附加线程状态通常等同于持有 " +"GIL,但在自由线程构建中例外。 在启用 GIL 的构建中,附加线程状态会阻塞执行直到 GIL 可以被获取。 不过,即使在禁用 GIL " +"的构建中,仍然需要拥有已附加线程状态,因为解释器需要记住有哪些线程可以访问 Python 对象。" + +#: ../../c-api/threads.rst:53 +msgid "" +"Even on the free-threaded build, attaching a thread state may block, as the " +"GIL can be re-enabled or threads might be temporarily suspended (such as " +"during a garbage collection)." +msgstr "即使在自由线程构建中,附加线程状态也可能发生阻塞,因为 GIL 可以被重新启用或者线程可能被临时挂起(例如在垃圾回收期间)。" + +#: ../../c-api/threads.rst:57 +msgid "" +"Generally, there will always be an attached thread state when using Python's" +" C API, including during embedding and when implementing methods, so it's " +"uncommon to need to set up a thread state on your own. Only in some specific" +" cases, such as in a :c:macro:`Py_BEGIN_ALLOW_THREADS` block or in a fresh " +"thread, will the thread not have an attached thread state. If uncertain, " +"check if :c:func:`PyThreadState_GetUnchecked` returns ``NULL``." +msgstr "" +"通常,在使用 Python 的 C API 时总是会存在一个已附加线程状态,包括执行嵌入期间和实现方法时,因此你很少会需要自行设置线程状态。 " +"仅在某些特定情况下,例如处于某个 :c:macro:`Py_BEGIN_ALLOW_THREADS` 代码块或全新线程中,线程才没有已附加线程状态。 " +"如果不确定,可检查 :c:func:`PyThreadState_GetUnchecked` 是否返回 ``NULL``。" + +#: ../../c-api/threads.rst:64 +msgid "" +"If it turns out that you do need to create a thread state, call " +":c:func:`PyThreadState_New` followed by :c:func:`PyThreadState_Swap`, or use" +" the dangerous :c:func:`PyGILState_Ensure` function." +msgstr "" +"如果你确实需要创建线程状态,可以调用 :c:func:`PyThreadState_New` 然后再调用 " +":c:func:`PyThreadState_Swap`,或者使用危险的 :c:func:`PyGILState_Ensure` 函数。" + +#: ../../c-api/threads.rst:72 +msgid "Detaching the thread state from extension code" +msgstr "从扩展代码分离线程状态" + +#: ../../c-api/threads.rst:74 +msgid "" +"Most extension code manipulating the :term:`thread state` has the following " +"simple structure::" +msgstr "大多数操作 :term:`thread state` 的扩展代码具有以下简单结构::" + +#: ../../c-api/threads.rst:77 +msgid "" +"Save the thread state in a local variable.\n" +"... Do some blocking I/O operation ...\n" +"Restore the thread state from the local variable." +msgstr "" +"Save the thread state in a local variable.\n" +"... Do some blocking I/O operation ...\n" +"Restore the thread state from the local variable." + +#: ../../c-api/threads.rst:81 +msgid "This is so common that a pair of macros exists to simplify it::" +msgstr "这是如此常用因此增加了一对宏来简化它::" + +#: ../../c-api/threads.rst:83 +msgid "" +"Py_BEGIN_ALLOW_THREADS\n" +"... Do some blocking I/O operation ...\n" +"Py_END_ALLOW_THREADS" +msgstr "" +"Py_BEGIN_ALLOW_THREADS\n" +"... 执行某些阻塞式的 I/O 操作 ...\n" +"Py_END_ALLOW_THREADS" + +#: ../../c-api/threads.rst:91 +msgid "" +"The :c:macro:`Py_BEGIN_ALLOW_THREADS` macro opens a new block and declares a" +" hidden local variable; the :c:macro:`Py_END_ALLOW_THREADS` macro closes the" +" block." +msgstr "" +":c:macro:`Py_BEGIN_ALLOW_THREADS` " +"宏将打开一个新块并声明一个隐藏的局部变量;:c:macro:`Py_END_ALLOW_THREADS` 宏将关闭这个块。" + +#: ../../c-api/threads.rst:95 +msgid "The block above expands to the following code::" +msgstr "上面的代码块可扩展为下面的代码::" + +#: ../../c-api/threads.rst:97 +msgid "" +"PyThreadState *_save;\n" +"\n" +"_save = PyEval_SaveThread();\n" +"... Do some blocking I/O operation ...\n" +"PyEval_RestoreThread(_save);" +msgstr "" +"PyThreadState *_save;\n" +"\n" +"_save = PyEval_SaveThread();\n" +"... 执行某些阻塞式的 I/O 操作 ...\n" +"PyEval_RestoreThread(_save);" + +#: ../../c-api/threads.rst:107 +msgid "Here is how these functions work:" +msgstr "下面介绍这些函数是如何运作的:" + +#: ../../c-api/threads.rst:109 +msgid "" +"The attached thread state implies that the GIL is held for the interpreter. " +"To detach it, :c:func:`PyEval_SaveThread` is called and the result is stored" +" in a local variable." +msgstr "" +"附加线程状态意味着为解释器持有 GIL。 要将其分离,则调用 :c:func:`PyEval_SaveThread` 并将结果保存在局部变量中。" + +#: ../../c-api/threads.rst:113 +msgid "" +"By detaching the thread state, the GIL is released, which allows other " +"threads to attach to the interpreter and execute while the current thread " +"performs blocking I/O. When the I/O operation is complete, the old thread " +"state is reattached by calling :c:func:`PyEval_RestoreThread`, which will " +"wait until the GIL can be acquired." +msgstr "" +"通过分离线程状态,GIL 将被释放,以允许其他线程附加到该解释器并执行而让当前线程执行阻塞式 I/O。 当 I/O 操作完成时,可通过调用 " +":c:func:`PyEval_RestoreThread` 重新附加旧线程状态,该函数将等待至 GIL 可被获取。" + +#: ../../c-api/threads.rst:120 +msgid "" +"Performing blocking I/O is the most common use case for detaching the thread" +" state, but it is also useful to call it over long-running native code that " +"doesn't need access to Python objects or Python's C API. For example, the " +"standard :mod:`zlib` and :mod:`hashlib` modules detach the :term:`thread " +"state ` when compressing or hashing data." +msgstr "" +"执行阻塞型 I/O 操作是分离线程状态最常见的使用场景,但它也适用于不需要访问 Python 对象或 Python 的 C API " +"的长时间运行的原生代码。 例如,标准库 :mod:`zlib` 和 :mod:`hashlib` 模块会在对数据执行压缩或哈希运算时分离 " +":term:`线程状态 `。" + +#: ../../c-api/threads.rst:127 +msgid "" +"On a :term:`free-threaded build`, the :term:`GIL` is usually out of the " +"question, but **detaching the thread state is still required**, because the " +"interpreter periodically needs to block all threads to get a consistent view" +" of Python objects without the risk of race conditions. For example, CPython" +" currently suspends all threads for a short period of time while running the" +" garbage collector." +msgstr "" +"在 :term:`free-threaded build` 中,通常不需要考虑 :term:`GIL`,但是 " +"**分离线程状态仍然是需要的**,因为解释器需要定期地阻塞所有线程以获取稳定的 Python 对象视图而不会产生竞争条件风险。 例如,CPython " +"目前会在运行垃圾回收器的时候暂时挂起所有线程。" + +#: ../../c-api/threads.rst:136 +msgid "" +"Detaching the thread state can lead to unexpected behavior during " +"interpreter finalization. See :ref:`cautions-regarding-runtime-finalization`" +" for more details." +msgstr "" +"在解释器最终化期间分离线程状态可能导致非预期的行为。 请参阅 :ref:`cautions-regarding-runtime-" +"finalization` 了解详情。" + +#: ../../c-api/threads.rst:142 +msgid "APIs" +msgstr "API" + +#: ../../c-api/threads.rst:144 +msgid "" +"The following macros are normally used without a trailing semicolon; look " +"for example usage in the Python source distribution." +msgstr "以下的宏被使用时通常不带末尾分号;请在 Python 源代码发布包中查看示例用法。" + +#: ../../c-api/threads.rst:149 +msgid "" +"These macros are still necessary on the :term:`free-threaded build` to " +"prevent deadlocks." +msgstr "这些宏对于在 :term:`free-threaded build` 上防止死锁仍然是必要的。" + +#: ../../c-api/threads.rst:154 +msgid "" +"This macro expands to ``{ PyThreadState *_save; _save = " +"PyEval_SaveThread();``. Note that it contains an opening brace; it must be " +"matched with a following :c:macro:`Py_END_ALLOW_THREADS` macro. See above " +"for further discussion of this macro." +msgstr "" +"此宏会扩展为 ``{ PyThreadState *_save; _save = PyEval_SaveThread();``。 " +"请注意它包含一个开头花括号;它必须与后面的 :c:macro:`Py_END_ALLOW_THREADS` 宏匹配。有关此宏的进一步讨论请参阅上文。" + +#: ../../c-api/threads.rst:162 +msgid "" +"This macro expands to ``PyEval_RestoreThread(_save); }``. Note that it " +"contains a closing brace; it must be matched with an earlier " +":c:macro:`Py_BEGIN_ALLOW_THREADS` macro. See above for further discussion " +"of this macro." +msgstr "" +"此宏扩展为 ``PyEval_RestoreThread(_save); }``。注意它包含一个右花括号;它必须与之前的 " +":c:macro:`Py_BEGIN_ALLOW_THREADS` 宏匹配。请参阅上文以进一步讨论此宏。" + +#: ../../c-api/threads.rst:170 +msgid "" +"This macro expands to ``PyEval_RestoreThread(_save);``: it is equivalent to " +":c:macro:`Py_END_ALLOW_THREADS` without the closing brace." +msgstr "" +"这个宏扩展为 ``PyEval_RestoreThread(_save);``: 它等价于没有关闭花括号的 " +":c:macro:`Py_END_ALLOW_THREADS` 宏。" + +#: ../../c-api/threads.rst:176 +msgid "" +"This macro expands to ``_save = PyEval_SaveThread();``: it is equivalent to " +":c:macro:`Py_BEGIN_ALLOW_THREADS` without the opening brace and variable " +"declaration." +msgstr "" +"这个宏扩展为 ``_save = PyEval_SaveThread();``: 它等价于没有开始花括号和变量声明的 " +":c:macro:`Py_BEGIN_ALLOW_THREADS` 宏。" + +#: ../../c-api/threads.rst:182 +msgid "Non-Python created threads" +msgstr "非 Python 创建的线程" + +#: ../../c-api/threads.rst:184 +msgid "" +"When threads are created using the dedicated Python APIs (such as the " +":mod:`threading` module), a thread state is automatically associated with " +"them, However, when a thread is created from native code (for example, by a " +"third-party library with its own thread management), it doesn't hold an " +"attached thread state." +msgstr "" +"当使用专门的 Python API(如 :mod:`threading` " +"模块)创建线程时,会自动为其关联一个附加线程状态,不过,当线程是从原生代码创建时(例如,由具有自己的线程管理的第三方库创建),它就不会持有附加线程状态。" + +#: ../../c-api/threads.rst:190 +msgid "" +"If you need to call Python code from these threads (often this will be part " +"of a callback API provided by the aforementioned third-party library), you " +"must first register these threads with the interpreter by creating a new " +"thread state and attaching it." +msgstr "" +"如果你需要从这些线程调用 Python 代码(这常常会是前述第三方库提供的回调 API " +"的一部分),你必须先通过新建一个线程状态并附加它来向解释器注册这些线程。" + +#: ../../c-api/threads.rst:195 +msgid "" +"The most robust way to do this is through :c:func:`PyThreadState_New` " +"followed by :c:func:`PyThreadState_Swap`." +msgstr "" +"完成这项任务的最可靠方式是通过 :c:func:`PyThreadState_New` 加上 :c:func:`PyThreadState_Swap`。" + +#: ../../c-api/threads.rst:199 +msgid "" +"``PyThreadState_New`` requires an argument pointing to the desired " +"interpreter; such a pointer can be acquired via a call to " +":c:func:`PyInterpreterState_Get` from the code where the thread was created." +msgstr "" + +#: ../../c-api/threads.rst:204 +msgid "For example::" +msgstr "例如::" + +#: ../../c-api/threads.rst:206 +msgid "" +"/* The return value of PyInterpreterState_Get() from the\n" +" function that created this thread. */\n" +"PyInterpreterState *interp = thread_data->interp;\n" +"\n" +"/* Create a new thread state for the interpreter. It does not start out\n" +" attached. */\n" +"PyThreadState *tstate = PyThreadState_New(interp);\n" +"\n" +"/* Attach the thread state, which will acquire the GIL. */\n" +"PyThreadState_Swap(tstate);\n" +"\n" +"/* Perform Python actions here. */\n" +"result = CallSomeFunction();\n" +"/* evaluate result or handle exception */\n" +"\n" +"/* Destroy the thread state. No Python API allowed beyond this point. */\n" +"PyThreadState_Clear(tstate);\n" +"PyThreadState_DeleteCurrent();" +msgstr "" + +#: ../../c-api/threads.rst:227 +msgid "" +"If the interpreter finalized before ``PyThreadState_Swap`` was called, then " +"``interp`` will be a dangling pointer!" +msgstr "" + +#: ../../c-api/threads.rst:233 +msgid "Legacy API" +msgstr "" + +#: ../../c-api/threads.rst:235 +msgid "" +"Another common pattern to call Python code from a non-Python thread is to " +"use :c:func:`PyGILState_Ensure` followed by a call to " +":c:func:`PyGILState_Release`." +msgstr "" + +#: ../../c-api/threads.rst:238 +msgid "" +"These functions do not work well when multiple interpreters exist in the " +"Python process. If no Python interpreter has ever been used in the current " +"thread (which is common for threads created outside Python), " +"``PyGILState_Ensure`` will create and attach a thread state for the \"main\"" +" interpreter (the first interpreter in the Python process)." +msgstr "" + +#: ../../c-api/threads.rst:244 +msgid "" +"Additionally, these functions have thread-safety issues during interpreter " +"finalization. Using ``PyGILState_Ensure`` during finalization will likely " +"crash the process." +msgstr "" + +#: ../../c-api/threads.rst:248 +msgid "Usage of these functions look like such::" +msgstr "这些函数的用法是这样的::" + +#: ../../c-api/threads.rst:250 +msgid "" +"PyGILState_STATE gstate;\n" +"gstate = PyGILState_Ensure();\n" +"\n" +"/* Perform Python actions here. */\n" +"result = CallSomeFunction();\n" +"/* evaluate result or handle exception */\n" +"\n" +"/* Release the thread. No Python API allowed beyond this point. */\n" +"PyGILState_Release(gstate);" +msgstr "" +"PyGILState_STATE gstate;\n" +"gstate = PyGILState_Ensure();\n" +"\n" +"/* 在此执行 Python 动作。 */\n" +"result = CallSomeFunction();\n" +"/* 评估结果或处理异常 */\n" +"\n" +"/* 释放线程。在此之后不再允许 Python API。 */\n" +"PyGILState_Release(gstate);" + +#: ../../c-api/threads.rst:264 +msgid "Cautions about fork()" +msgstr "有关 fork() 的注意事项" + +#: ../../c-api/threads.rst:266 +msgid "" +"Another important thing to note about threads is their behaviour in the face" +" of the C :c:func:`fork` call. On most systems with :c:func:`fork`, after a " +"process forks only the thread that issued the fork will exist. This has a " +"concrete impact both on how locks must be handled and on all stored state in" +" CPython's runtime." +msgstr "" +"有关线程的另一个需要注意的重要问题是它们在面对 C :c:func:`fork` 调用时的行为。在大多数支持 :c:func:`fork` " +"的系统中,当一个进程执行 fork 之后将只有发出 fork 的线程存在。这对需要如何处理锁以及 CPython " +"的运行时内所有的存储状态都会有实质性的影响。" + +#: ../../c-api/threads.rst:272 +msgid "" +"The fact that only the \"current\" thread remains means any locks held by " +"other threads will never be released. Python solves this for :func:`os.fork`" +" by acquiring the locks it uses internally before the fork, and releasing " +"them afterwards. In addition, it resets any :ref:`lock-objects` in the " +"child. When extending or embedding Python, there is no way to inform Python " +"of additional (non-Python) locks that need to be acquired before or reset " +"after a fork. OS facilities such as :c:func:`!pthread_atfork` would need to " +"be used to accomplish the same thing. Additionally, when extending or " +"embedding Python, calling :c:func:`fork` directly rather than through " +":func:`os.fork` (and returning to or calling into Python) may result in a " +"deadlock by one of Python's internal locks being held by a thread that is " +"defunct after the fork. :c:func:`PyOS_AfterFork_Child` tries to reset the " +"necessary locks, but is not always able to." +msgstr "" +"只保留“当前”线程这一事实意味着任何由其他线程所持有的锁永远不会被释放。Python 通过在 fork 之前获取内部使用的锁,并随后释放它们的方式为 " +":func:`os.fork` 解决了这个问题。此外,它还会重置子进程中的任何 :ref:`lock-objects`。在扩展或嵌入 Python " +"时,没有办法通知 Python 在 fork 之前或之后需要获取或重置的附加(非 Python)锁。需要使用 OS 工具例如 " +":c:func:`!pthread_atfork` 来完成同样的事情。此外,在扩展或嵌入 Python 时,直接调用 :c:func:`fork` " +"而不是通过 :func:`os.fork` (并返回到或调用至 Python 中) 调用可能会导致某个被 fork 之后失效的线程所持有的 " +"Python 内部锁发生死锁。 :c:func:`PyOS_AfterFork_Child` 会尝试重置必要的锁,但并不总是能够做到。" + +#: ../../c-api/threads.rst:287 +msgid "" +"The fact that all other threads go away also means that CPython's runtime " +"state there must be cleaned up properly, which :func:`os.fork` does. This " +"means finalizing all other :c:type:`PyThreadState` objects belonging to the " +"current interpreter and all other :c:type:`PyInterpreterState` objects. Due" +" to this and the special nature of the :ref:`\"main\" interpreter `, :c:func:`fork` should only be called in that " +"interpreter's \"main\" thread, where the CPython global runtime was " +"originally initialized. The only exception is if :c:func:`exec` will be " +"called immediately after." +msgstr "" +"所有其他线程都将结束这一事实也意味着 CPython 的运行时状态必须妥善清理,:func:`os.fork` 就是这样做的。 " +"这意味着最终化归属于当前解释器的所有其他 :c:type:`PyThreadState` 对象以及所有其他 " +":c:type:`PyInterpreterState` 对象。由于这一点以及 :ref:`\"main\" 解释器 ` 的特殊性质,:c:func:`fork` 应当只在该解释器 的 \"main\" 线程中被调用,而 CPython " +"全局运行时最初就是在该线程中初始化的。只有当 :c:func:`exec` 将随后立即被调用的情况是唯一的例外。" + +#: ../../c-api/threads.rst:300 +msgid "High-level APIs" +msgstr "高层级 API" + +#: ../../c-api/threads.rst:302 +msgid "" +"These are the most commonly used types and functions when writing multi-" +"threaded C extensions." +msgstr "这些是在编写多线程 C 扩展时最常用的类型和函数。" + +#: ../../c-api/threads.rst:308 +msgid "" +"This data structure represents the state of a single thread. The only " +"public data member is:" +msgstr "该数据结构代表单个线程的状态。唯一的公有数据成员为:" + +#: ../../c-api/threads.rst:313 +msgid "This thread's interpreter state." +msgstr "该线程的解释器状态。" + +#: ../../c-api/threads.rst:324 +msgid "Deprecated function which does nothing." +msgstr "不执行任何操作的已弃用函数。" + +#: ../../c-api/threads.rst:326 +msgid "" +"In Python 3.6 and older, this function created the GIL if it didn't exist." +msgstr "在 Python 3.6 及更老的版本中,此函数会在 GIL 不存在时创建它。" + +#: ../../c-api/threads.rst:328 +msgid "The function now does nothing." +msgstr "此函数现在不执行任何操作。" + +#: ../../c-api/threads.rst:331 +msgid "" +"This function is now called by :c:func:`Py_Initialize()`, so you don't have " +"to call it yourself anymore." +msgstr "该函数现在由 :c:func:`Py_Initialize()` 调用,因此你无需再自行调用它。" + +#: ../../c-api/threads.rst:335 +msgid "" +"This function cannot be called before :c:func:`Py_Initialize()` anymore." +msgstr "此函数已不再被允许在 :c:func:`Py_Initialize()` 之前调用。" + +#: ../../c-api/threads.rst:345 +msgid "" +"Detach the :term:`attached thread state` and return it. The thread will have" +" no :term:`thread state` upon returning." +msgstr "" +"分离当前线程的 :term:`attached thread state` 并返回该状态对象。调用此函数返回后,当前线程将不再关联任何 " +":term:`thread state` 线程状态。" + +#: ../../c-api/threads.rst:351 +msgid "" +"Set the :term:`attached thread state` to *tstate*. The passed :term:`thread " +"state` **should not** be :term:`attached `, otherwise" +" deadlock ensues. *tstate* will be attached upon returning." +msgstr "" +"将 :term:`attached thread state` 设置为 *tstate*。传入的 :term:`thread state` **不应**" +" 处于 :term:`已附加 ` 状态,否则会导致死锁。调用此函数返回后,*tstate* " +"将被附加到当前线程。" + +#: ../../c-api/threads.rst:356 ../../c-api/threads.rst:640 +msgid "" +"Calling this function from a thread when the runtime is finalizing will hang" +" the thread until the program exits, even if the thread was not created by " +"Python. Refer to :ref:`cautions-regarding-runtime-finalization` for more " +"details." +msgstr "" +"当运行时处于终结阶段时,若从某个线程调用此函数,该线程将被挂起直至程序退出,即便是由非 Python 创建的线程也不例外。更多详情请参考 " +":ref:`cautions-regarding-runtime-finalization` 小节。" + +#: ../../c-api/threads.rst:361 ../../c-api/threads.rst:448 +#: ../../c-api/threads.rst:650 +msgid "" +"Hangs the current thread, rather than terminating it, if called while the " +"interpreter is finalizing." +msgstr "如果在解释器处于终结阶段时调用此函数,当前线程将被挂起而非终止。" + +#: ../../c-api/threads.rst:367 +msgid "" +"Return the :term:`attached thread state`. If the thread has no attached " +"thread state, (such as when inside of :c:macro:`Py_BEGIN_ALLOW_THREADS` " +"block), then this issues a fatal error (so that the caller needn't check for" +" ``NULL``)." +msgstr "" +"返回当前线程的 :term:`attached thread state`。如果线程没有已附加的线程状态(例如,当处于 " +":c:macro:`Py_BEGIN_ALLOW_THREADS` 代码块内部时),则会触发致命错误 (因此调用者无需检查返回值是否为 ``NULL``" +" 值)。" + +#: ../../c-api/threads.rst:372 +msgid "See also :c:func:`PyThreadState_GetUnchecked`." +msgstr "另请参阅 :c:func:`PyThreadState_GetUnchecked`。" + +#: ../../c-api/threads.rst:376 +msgid "" +"Similar to :c:func:`PyThreadState_Get`, but don't kill the process with a " +"fatal error if it is NULL. The caller is responsible to check if the result " +"is NULL." +msgstr "" +"与 :c:func:`PyThreadState_Get` 类似,但如果其为 NULL 则不会杀死进程并设置致命错误。调用方要负责检查结果是否为 " +"NULL 值。" + +#: ../../c-api/threads.rst:380 +msgid "" +"In Python 3.5 to 3.12, the function was private and known as " +"``_PyThreadState_UncheckedGet()``." +msgstr "在 Python 3.5 到 3.12 中,此函数是私有的并且命名为 ``_PyThreadState_UncheckedGet()``。" + +#: ../../c-api/threads.rst:387 +msgid "" +"Set the :term:`attached thread state` to *tstate*, and return the " +":term:`thread state` that was attached prior to calling." +msgstr "" +"将 :term:`attached thread state` 设置为 *tstate*,并返回调用此函数前已附加的 :term:`thread " +"state` 线程状态。" + +#: ../../c-api/threads.rst:390 +msgid "" +"This function is safe to call without an :term:`attached thread state`; it " +"will simply return ``NULL`` indicating that there was no prior thread state." +msgstr "" +"此函数在没有 :term:`attached thread state` 的情况下调用也是安全的;此时它会直接返回 " +"``NULL``,表示之前不存在线程状态。" + +#: ../../c-api/threads.rst:394 +msgid ":c:func:`PyEval_ReleaseThread`" +msgstr ":c:func:`PyEval_ReleaseThread`" + +#: ../../c-api/threads.rst:397 +msgid "" +"Similar to :c:func:`PyGILState_Ensure`, this function will hang the thread " +"if the runtime is finalizing." +msgstr "与 :c:func:`PyGILState_Ensure` 类似,当运行时处于终结阶段时,调用此函数会导致线程挂起。" + +#: ../../c-api/threads.rst:402 +msgid "GIL-state APIs" +msgstr "GIL 状态 API" + +#: ../../c-api/threads.rst:404 +msgid "" +"The following functions use thread-local storage, and are not compatible " +"with sub-interpreters:" +msgstr "下列函数使用线程级本地存储,并且不能兼容子解释器:" + +#: ../../c-api/threads.rst:409 +msgid "" +"The type of the value returned by :c:func:`PyGILState_Ensure` and passed to " +":c:func:`PyGILState_Release`." +msgstr "" +"由 :c:func:`PyGILState_Ensure` 返回并传递给 :c:func:`PyGILState_Release` 的值的类型。" + +#: ../../c-api/threads.rst:414 +msgid "The GIL was already held when :c:func:`PyGILState_Ensure` was called." +msgstr "当调用 :c:func:`PyGILState_Ensure` 时 GIL 已经被持有。" + +#: ../../c-api/threads.rst:418 +msgid "The GIL was not held when :c:func:`PyGILState_Ensure` was called." +msgstr "当调用 :c:func:`PyGILState_Ensure` 时 GIL 尚未被持有。" + +#: ../../c-api/threads.rst:422 +msgid "" +"Ensure that the current thread is ready to call the Python C API regardless " +"of the current state of Python, or of the :term:`attached thread state`. " +"This may be called as many times as desired by a thread as long as each call" +" is matched with a call to :c:func:`PyGILState_Release`. In general, other " +"thread-related APIs may be used between :c:func:`PyGILState_Ensure` and " +":c:func:`PyGILState_Release` calls as long as the thread state is restored " +"to its previous state before the Release(). For example, normal usage of " +"the :c:macro:`Py_BEGIN_ALLOW_THREADS` and :c:macro:`Py_END_ALLOW_THREADS` " +"macros is acceptable." +msgstr "" +"确保当前线程可以调用 Python C API,无论 Python 的当前状态或 :term:`attached thread state` " +"如何。只要每个调用都与对 :c:func:`PyGILState_Release` " +"的调用相匹配,线程就可以根据需要多次调用此函数。通常,只要线程状态在调用 Release() 之前恢复到其先前状态,就可以在 " +":c:func:`PyGILState_Ensure` 和 :c:func:`PyGILState_Release` 调用之间使用其他与线程相关的 " +"API。例如,可以正常使用 :c:macro:`Py_BEGIN_ALLOW_THREADS` 和 " +":c:macro:`Py_END_ALLOW_THREADS` 宏。" + +#: ../../c-api/threads.rst:432 +msgid "" +"The return value is an opaque \"handle\" to the :term:`attached thread " +"state` when :c:func:`PyGILState_Ensure` was called, and must be passed to " +":c:func:`PyGILState_Release` to ensure Python is left in the same state. " +"Even though recursive calls are allowed, these handles *cannot* be shared - " +"each unique call to :c:func:`PyGILState_Ensure` must save the handle for its" +" call to :c:func:`PyGILState_Release`." +msgstr "" +"返回值是一个不透明的\"句柄\",指向调用 :c:func:`PyGILState_Ensure` 时的 :term:`attached thread " +"state`,必须将其传递给 :c:func:`PyGILState_Release` 以确保 Python " +"恢复到相同状态。尽管允许递归调用,但这些句柄 *不能* 共享 — 每次对 :c:func:`PyGILState_Ensure` " +"的独立调用都必须保存其对应的句柄,用于后续调用 :c:func:`PyGILState_Release`。" + +#: ../../c-api/threads.rst:439 +msgid "" +"When the function returns, there will be an :term:`attached thread state` " +"and the thread will be able to call arbitrary Python code. Failure is a " +"fatal error." +msgstr "" +"当此函数返回时,将存在一个 :term:`attached thread state`,并且线程将能够调用任意 Python " +"代码。若操作失败则会引发致命错误。" + +#: ../../c-api/threads.rst:443 +msgid "" +"Calling this function when the runtime is finalizing is unsafe. Doing so " +"will either hang the thread until the program ends, or fully crash the " +"interpreter in rare cases. Refer to :ref:`cautions-regarding-runtime-" +"finalization` for more details." +msgstr "" +"当运行时处于终结阶段时调用此函数是不安全的。这样做要么会使线程挂起直至程序结束,在极少数情况下还可能导致解释器完全崩溃。更多详情请参考 " +":ref:`cautions-regarding-runtime-finalization` 小节。" + +#: ../../c-api/threads.rst:454 +msgid "" +"Release any resources previously acquired. After this call, Python's state " +"will be the same as it was prior to the corresponding " +":c:func:`PyGILState_Ensure` call (but generally this state will be unknown " +"to the caller, hence the use of the GILState API)." +msgstr "" +"释放之前获取的任何资源。在此调用之后,Python 的状态将与其在对相应 :c:func:`PyGILState_Ensure` " +"调用之前的一样(但是通常此状态对调用方来说将是未知的,对 GILState API 的使用也是如此)。" + +#: ../../c-api/threads.rst:459 +msgid "" +"Every call to :c:func:`PyGILState_Ensure` must be matched by a call to " +":c:func:`PyGILState_Release` on the same thread." +msgstr "" +"对 :c:func:`PyGILState_Ensure` 的每次调用都必须与在同一线程上对 :c:func:`PyGILState_Release` " +"的调用相匹配。" + +#: ../../c-api/threads.rst:464 +msgid "" +"Get the :term:`attached thread state` for this thread. May return ``NULL`` " +"if no GILState API has been used on the current thread. Note that the main " +"thread always has such a thread-state, even if no auto-thread-state call has" +" been made on the main thread. This is mainly a helper/diagnostic function." +msgstr "" +"获取当前线程的 :term:`attached thread state`。如果当前线程尚未使用任何 GILState API,则可能返回 " +"``NULL``。请注意,主线程始终拥有这样的线程状态,即使尚未在主线程上进行任何自动线程状态调用。此函数主要用作辅助/诊断工具。" + +#: ../../c-api/threads.rst:470 +msgid "" +"This function may return non-``NULL`` even when the :term:`thread state` is " +"detached. Prefer :c:func:`PyThreadState_Get` or " +":c:func:`PyThreadState_GetUnchecked` for most cases." +msgstr "" +"即使在 :term:`thread state` 已被分离时此函数也可能返回非 ``NULL``。大多数情况下建议使用 " +":c:func:`PyThreadState_Get` 或 :c:func:`PyThreadState_GetUnchecked`。" + +#: ../../c-api/threads.rst:475 +msgid ":c:func:`PyThreadState_Get`" +msgstr ":c:func:`PyThreadState_Get`" + +#: ../../c-api/threads.rst:479 +msgid "" +"Return ``1`` if the current thread is holding the :term:`GIL` and ``0`` " +"otherwise. This function can be called from any thread at any time. Only if " +"it has had its :term:`thread state ` initialized via " +":c:func:`PyGILState_Ensure` will it return ``1``. This is mainly a " +"helper/diagnostic function. It can be useful for example in callback " +"contexts or memory allocation functions when knowing that the :term:`GIL` is" +" locked can allow the caller to perform sensitive actions or otherwise " +"behave differently." +msgstr "" +"如果当前线程持有 :term:`GIL` 则返回 ``1``,否则返回 ``0``。此函数可随时从任何线程调用。只有当线程的 :term:`线程状态 " +"` 通过 :c:func:`PyGILState_Ensure` 初始化后,它才会返回 " +"``1``。此函数主要用作辅助/诊断工具。例如,在回调函数上下文或内存分配函数中,了解 :term:`GIL` " +"是否被锁定可以让调用者执行敏感操作或以不同方式运行时,这个函数就会很有用。" + +#: ../../c-api/threads.rst:489 +msgid "" +"If the current Python process has ever created a subinterpreter, this " +"function will *always* return ``1``. Prefer " +":c:func:`PyThreadState_GetUnchecked` for most cases." +msgstr "" +"如果当前 Python 进程曾经创建过子解释器,则此函数 *始终* 返回 ``1``。在大多数情况下,建议使用 " +":c:func:`PyThreadState_GetUnchecked` 函数。" + +#: ../../c-api/threads.rst:497 +msgid "Low-level APIs" +msgstr "低层级 API" + +#: ../../c-api/threads.rst:501 +msgid "" +"Create a new thread state object belonging to the given interpreter object. " +"An :term:`attached thread state` is not needed." +msgstr "创建一个属于指定解释器对象的新线程状态对象。此操作不需要存在 :term:`attached thread state`。" + +#: ../../c-api/threads.rst:506 +msgid "" +"Reset all information in a :term:`thread state` object. *tstate* must be " +":term:`attached `" +msgstr "" +"重置 :term:`thread state` 对象中的所有信息。 *tstate* 必须处于 :term:`已附加 ` 状态。" + +#: ../../c-api/threads.rst:509 +msgid "" +"This function now calls the :c:member:`!PyThreadState.on_delete` callback. " +"Previously, that happened in :c:func:`PyThreadState_Delete`." +msgstr "" +"此函数现在会调用 :c:member:`!PyThreadState.on_delete` 回调。在之前版本中,此操作是发生在 " +":c:func:`PyThreadState_Delete` 中的。" + +#: ../../c-api/threads.rst:513 +msgid "The :c:member:`!PyThreadState.on_delete` callback was removed." +msgstr ":c:member:`!PyThreadState.on_delete` 回调已被移除。" + +#: ../../c-api/threads.rst:519 +msgid "" +"Destroy a :term:`thread state` object. *tstate* should not be " +":term:`attached ` to any thread. *tstate* must have " +"been reset with a previous call to :c:func:`PyThreadState_Clear`." +msgstr "" +"销毁一个 :term:`thread state` 对象。*tstate* 不应被 :term:`已附加 ` 到任何线程。*tstate* 必须在之前通过调用 :c:func:`PyThreadState_Clear` 进行过重置。" + +#: ../../c-api/threads.rst:527 +msgid "" +"Detach the :term:`attached thread state` (which must have been reset with a " +"previous call to :c:func:`PyThreadState_Clear`) and then destroy it." +msgstr "" +"分离 :term:`attached thread state` (该状态必须已通过先前调用 :c:func:`PyThreadState_Clear`" +" 进行重置),然后销毁它。" + +#: ../../c-api/threads.rst:530 +msgid "" +"No :term:`thread state` will be :term:`attached ` " +"upon returning." +msgstr "" +"返回时将不会有任何 :term:`thread state` 处于 :term:`已附加 ` 状态。" + +#: ../../c-api/threads.rst:535 +msgid "Get the current frame of the Python thread state *tstate*." +msgstr "获取 Python 线程状态 *tstate* 的当前帧。" + +#: ../../c-api/threads.rst:537 +msgid "" +"Return a :term:`strong reference`. Return ``NULL`` if no frame is currently " +"executing." +msgstr "返回一个 :term:`strong reference`。如果没有当前执行的帧则返回 ``NULL``。" + +#: ../../c-api/threads.rst:540 +msgid "See also :c:func:`PyEval_GetFrame`." +msgstr "另请参阅 :c:func:`PyEval_GetFrame`。" + +#: ../../c-api/threads.rst:542 ../../c-api/threads.rst:551 +#: ../../c-api/threads.rst:560 +msgid "" +"*tstate* must not be ``NULL``, and must be :term:`attached `." +msgstr "*tstate* 不得为 ``NULL``,并且必须处于 :term:`已附加 ` 状态。" + +#: ../../c-api/threads.rst:549 +msgid "" +"Get the unique :term:`thread state` identifier of the Python thread state " +"*tstate*." +msgstr "获取 Python 线程状态 *tstate* 的唯一 :term:`thread state` 标识符。" + +#: ../../c-api/threads.rst:558 +msgid "Get the interpreter of the Python thread state *tstate*." +msgstr "获取 Python 线程状态 *tstate* 对应的解释器。" + +#: ../../c-api/threads.rst:567 +msgid "Suspend tracing and profiling in the Python thread state *tstate*." +msgstr "暂停 Python 线程状态 *tstate* 中的追踪和性能分析。" + +#: ../../c-api/threads.rst:569 +msgid "Resume them using the :c:func:`PyThreadState_LeaveTracing` function." +msgstr "使用 :c:func:`PyThreadState_LeaveTracing` 函数来恢复它们。" + +#: ../../c-api/threads.rst:576 +msgid "" +"Resume tracing and profiling in the Python thread state *tstate* suspended " +"by the :c:func:`PyThreadState_EnterTracing` function." +msgstr "" +"恢复 Python 线程状态 *tstate* 中被 :c:func:`PyThreadState_EnterTracing` " +"函数暂停的追踪和性能分析。" + +#: ../../c-api/threads.rst:579 +msgid "" +"See also :c:func:`PyEval_SetTrace` and :c:func:`PyEval_SetProfile` " +"functions." +msgstr "另请参阅 :c:func:`PyEval_SetTrace` 和 :c:func:`PyEval_SetProfile` 函数。" + +#: ../../c-api/threads.rst:587 +msgid "" +"Set the stack protection start address and stack protection size of a Python" +" thread state." +msgstr "设置一个 Python 线程状态的栈保护起始地址和栈保护大小。" + +#: ../../c-api/threads.rst:590 +msgid "" +"On success, return ``0``. On failure, set an exception and return ``-1``." +msgstr "成功时,返回 ``0``。失败时,设置一个异常并返回 ``-1``。" + +#: ../../c-api/threads.rst:593 +msgid "" +"CPython implements :ref:`recursion control ` for C code by " +"raising :py:exc:`RecursionError` when it notices that the machine execution " +"stack is close to overflow. See for example the " +":c:func:`Py_EnterRecursiveCall` function. For this, it needs to know the " +"location of the current thread's stack, which it normally gets from the " +"operating system. When the stack is changed, for example using context " +"switching techniques like the Boost library's ``boost::context``, you must " +"call :c:func:`~PyUnstable_ThreadState_SetStackProtection` to inform CPython " +"of the change." +msgstr "" +"CPython 通过在注意到机器的执行栈即将溢出时引发 :py:exc:`RecursionError` 实现针对 C 代码的 :ref:`递归控制 " +"`。请查看 :c:func:`Py_EnterRecursiveCall` " +"函数的示例。为此,需要知道当前线程栈的位置,这通常是从操作系统获取的。例如当使用 Boost 库的 ``boost::context`` " +"之类的上下文切换技术使栈发生改变时,你必须调用 :c:func:`~PyUnstable_ThreadState_SetStackProtection`" +" 将变化通知给 CPython。" + +#: ../../c-api/threads.rst:602 +msgid "" +"Call :c:func:`~PyUnstable_ThreadState_SetStackProtection` either before or " +"after changing the stack. Do not call any other Python C API between the " +"call and the stack change." +msgstr "" +"在修改栈之前或之后调用 :c:func:`~PyUnstable_ThreadState_SetStackProtection`。 " +"不要在调用和栈修改之间调用任何其他 Python C API。" + +#: ../../c-api/threads.rst:607 +msgid "" +"See :c:func:`PyUnstable_ThreadState_ResetStackProtection` for undoing this " +"operation." +msgstr "请参阅 :c:func:`PyUnstable_ThreadState_ResetStackProtection` 了解如何撤销此操作。" + +#: ../../c-api/threads.rst:614 +msgid "" +"Reset the stack protection start address and stack protection size of a " +"Python thread state to the operating system defaults." +msgstr "将一个 Python 线程状态的栈保护起始地址和栈保护大小重置为操作系统的默认值。" + +#: ../../c-api/threads.rst:617 +msgid "" +"See :c:func:`PyUnstable_ThreadState_SetStackProtection` for an explanation." +msgstr "请参阅 :c:func:`PyUnstable_ThreadState_SetStackProtection` 查看相关说明。" + +#: ../../c-api/threads.rst:624 +msgid "" +"Return a dictionary in which extensions can store thread-specific state " +"information. Each extension should use a unique key to use to store state " +"in the dictionary. It is okay to call this function when no :term:`thread " +"state` is :term:`attached `. If this function returns" +" ``NULL``, no exception has been raised and the caller should assume no " +"thread state is attached." +msgstr "" +"返回一个字典,扩展模块可在其中存储线程特定的状态信息。每个扩展模块应使用唯一的键来在此字典中存储状态。当没有 :term:`thread state` " +"处于 :term:`已附加 ` 状态时,调用此函数是安全的。如果此函数返回 " +"``NULL``,则表示没有引发异常,调用者应假定没有线程状态被附加。" + +#: ../../c-api/threads.rst:634 +msgid "" +":term:`Attach ` *tstate* to the current thread, which" +" must not be ``NULL`` or already :term:`attached `." +msgstr "" +"将 *tstate* :term:`附加 ` 到当前线程,当前线程不能为 ``NULL`` 或者已经 " +":term:`附加线程状态 `。" + +#: ../../c-api/threads.rst:637 +msgid "" +"The calling thread must not already have an :term:`attached thread state`." +msgstr "调用方线程不能已经具有 :term:`attached thread state`。" + +#: ../../c-api/threads.rst:645 +msgid "" +"Updated to be consistent with :c:func:`PyEval_RestoreThread`, " +":c:func:`Py_END_ALLOW_THREADS`, and :c:func:`PyGILState_Ensure`, and " +"terminate the current thread if called while the interpreter is finalizing." +msgstr "" +"已被更新为与 :c:func:`PyEval_RestoreThread`, :c:func:`Py_END_ALLOW_THREADS` 和 " +":c:func:`PyGILState_Ensure` 保持一致,如果在解释器正在最终化时被调用则会终结当前线程。" + +#: ../../c-api/threads.rst:654 +msgid "" +":c:func:`PyEval_RestoreThread` is a higher-level function which is always " +"available (even when threads have not been initialized)." +msgstr ":c:func:`PyEval_RestoreThread` 是一个始终可用的(即使线程尚未初始化)更高层级函数。" + +#: ../../c-api/threads.rst:660 +msgid "" +"Detach the :term:`attached thread state`. The *tstate* argument, which must " +"not be ``NULL``, is only used to check that it represents the " +":term:`attached thread state` --- if it isn't, a fatal error is reported." +msgstr "" +"分离 :term:`attached thread state`。 *tstate* 参数必须不为 ``NULL``,该参数仅被用于检查它是否代表 " +":term:`attached thread state` --- 如果不是,则会报告一个致命级错误。" + +#: ../../c-api/threads.rst:665 +msgid "" +":c:func:`PyEval_SaveThread` is a higher-level function which is always " +"available (even when threads have not been initialized)." +msgstr ":c:func:`PyEval_SaveThread` 是一个始终可用的(即使线程尚未初始化)更高层级函数。" + +#: ../../c-api/threads.rst:670 +msgid "Asynchronous notifications" +msgstr "异步通知" + +#: ../../c-api/threads.rst:672 +msgid "" +"A mechanism is provided to make asynchronous notifications to the main " +"interpreter thread. These notifications take the form of a function pointer" +" and a void pointer argument." +msgstr "提供了一种向主解释器线程发送异步通知的机制。这些通知将采用函数指针和空指针参数的形式。" + +#: ../../c-api/threads.rst:679 +msgid "" +"Schedule a function to be called from the main interpreter thread. On " +"success, ``0`` is returned and *func* is queued for being called in the main" +" thread. On failure, ``-1`` is returned without setting any exception." +msgstr "" +"将一个函数加入从主解释器线程调用的计划任务。成功时,将返回 ``0`` 并将 *func* 加入要被主线程调用的等待队列。失败时,将返回 ``-1`` " +"但不会设置任何异常。" + +#: ../../c-api/threads.rst:683 +msgid "" +"When successfully queued, *func* will be *eventually* called from the main " +"interpreter thread with the argument *arg*. It will be called " +"asynchronously with respect to normally running Python code, but with both " +"these conditions met:" +msgstr "" +"当成功加入队列后,*func* 将 *最终* 附带参数 *arg* 被主解释器线程调用。对于正常运行的 Python " +"代码来说它将被异步地调用,但要同时满足以下两个条件:" + +#: ../../c-api/threads.rst:688 +msgid "on a :term:`bytecode` boundary;" +msgstr "位于 :term:`bytecode` 的边界上;" + +#: ../../c-api/threads.rst:689 +msgid "" +"with the main thread holding an :term:`attached thread state` (*func* can " +"therefore use the full C API)." +msgstr "主线程持有一个 :term:`attached thread state` (因此 *func* 可以使用完整的 C API)。" + +#: ../../c-api/threads.rst:692 +msgid "" +"*func* must return ``0`` on success, or ``-1`` on failure with an exception " +"set. *func* won't be interrupted to perform another asynchronous " +"notification recursively, but it can still be interrupted to switch threads " +"if the :term:`thread state ` is detached." +msgstr "" +"*func* 必须在成功时返回 ``0``,或在失败时返回 ``-1`` 并设置一个异常。 *func* 不会被中断来递归地执行另一个异步通知,但如果 " +":term:`thread state ` 已被分离则它仍可被中断以切换线程。" + +#: ../../c-api/threads.rst:697 +msgid "" +"This function doesn't need an :term:`attached thread state`. However, to " +"call this function in a subinterpreter, the caller must have an " +":term:`attached thread state`. Otherwise, the function *func* can be " +"scheduled to be called from the wrong interpreter." +msgstr "" +"此函数不需要 :term:`attached thread state`。不过,要在子解释器中调用此函数,调用方必须具有 :term:`attached" +" thread state`。否则,函数 *func* 可能会被安排给错误的解释器来调用。" + +#: ../../c-api/threads.rst:702 +msgid "" +"This is a low-level function, only useful for very special cases. There is " +"no guarantee that *func* will be called as quick as possible. If the main " +"thread is busy executing a system call, *func* won't be called before the " +"system call returns. This function is generally **not** suitable for " +"calling Python code from arbitrary C threads. Instead, use the " +":ref:`PyGILState API`." +msgstr "" +"这是一个低层级函数,只在非常特殊的情况下有用。不能保证 *func* 会尽快被调用。如果主线程忙于执行某个系统调用,*func* " +"将不会在系统调用返回之前被调用。此函数 通常 **不适合** 从任意 C 线程调用 Python 代码。作为替代,请使用 " +":ref:`PyGILState API ` 文档。" + +#: ../../c-api/threads.rst:711 +msgid "" +"If this function is called in a subinterpreter, the function *func* is now " +"scheduled to be called from the subinterpreter, rather than being called " +"from the main interpreter. Each subinterpreter now has its own list of " +"scheduled calls." +msgstr "" +"如果此函数在子解释器中被调用,则函数 *func* 将被安排在子解释器中调用,而不是在主解释器中调用。现在每个子解释器都有自己的计划调用列表。" + +#: ../../c-api/threads.rst:717 +msgid "" +"This function now always schedules *func* to be run in the main interpreter." +msgstr "此函数现在总是会安排 *func* 在主解释器中运行。" + +#: ../../c-api/threads.rst:724 +msgid "" +"Execute all pending calls. This is usually executed automatically by the " +"interpreter." +msgstr "执行所有待命的调用。这通常会由解释器自动执行。" + +#: ../../c-api/threads.rst:727 +msgid "" +"This function returns ``0`` on success, and returns ``-1`` with an exception" +" set on failure." +msgstr "此函数成功时返回 ``0``,失败时返回 ``-1`` 并设置一个异常。" + +#: ../../c-api/threads.rst:730 +msgid "" +"If this is not called in the main thread of the main interpreter, this " +"function does nothing and returns ``0``. The caller must hold an " +":term:`attached thread state`." +msgstr "" +"如果此函数不是在主解释器的主线程中被调用,它将不做任何事并返回 ``0``。调用方必须持有 :term:`attached thread state` " +"线程状态。" + +#: ../../c-api/threads.rst:736 +msgid "This function only runs pending calls in the main interpreter." +msgstr "此函数将只在主解释器中运行待命的调用。" + +#: ../../c-api/threads.rst:742 +msgid "" +"Asynchronously raise an exception in a thread. The *id* argument is the " +"thread id of the target thread; *exc* is the exception object to be raised. " +"This function does not :term:`steal` any references to *exc*. To prevent " +"naive misuse, you must write your own C extension to call this. Must be " +"called with an :term:`attached thread state`. Returns the number of thread " +"states modified; this is normally one, but will be zero if the thread id " +"isn't found. If *exc* is ``NULL``, the pending exception (if any) for the " +"thread is cleared. This raises no exceptions." +msgstr "" + +#: ../../c-api/threads.rst:750 +msgid "" +"The type of the *id* parameter changed from :c:expr:`long` to " +":c:expr:`unsigned long`." +msgstr "*id* 形参的类型已从 :c:expr:`long` 变为 :c:expr:`unsigned long`。" + +#: ../../c-api/threads.rst:756 +msgid "Operating system thread APIs" +msgstr "操作系统线程 API" + +#: ../../c-api/threads.rst:760 +msgid "Sentinel value for an invalid thread ID." +msgstr "代表无效线程 ID 的哨兵值。" + +#: ../../c-api/threads.rst:762 +msgid "This is currently equivalent to ``(unsigned long)-1``." +msgstr "该值目前等于 ``(unsigned long)-1``。" + +#: ../../c-api/threads.rst:767 +msgid "" +"Start function *func* in a new thread with argument *arg*. The resulting " +"thread is not intended to be joined." +msgstr "在新线程中启动函数 *func* 并传入参数 *arg*。结果线程将不被合并。" + +#: ../../c-api/threads.rst:770 +msgid "*func* must not be ``NULL``, but *arg* may be ``NULL``." +msgstr "*func* 不可为 ``NULL``,但 *arg* 可以为 ``NULL``。" + +#: ../../c-api/threads.rst:772 +msgid "" +"On success, this function returns the identifier of the new thread; on " +"failure, this returns :c:macro:`PYTHREAD_INVALID_THREAD_ID`." +msgstr "成功时,此函数将返回新线程的标识号;失败时,将返回 :c:macro:`PYTHREAD_INVALID_THREAD_ID`。" + +#: ../../c-api/threads.rst:775 ../../c-api/threads.rst:859 +#: ../../c-api/threads.rst:867 +msgid "The caller does not need to hold an :term:`attached thread state`." +msgstr "调用方不需要持有 :term:`attached thread state`。" + +#: ../../c-api/threads.rst:780 +msgid "Return the identifier of the current thread, which will never be zero." +msgstr "返回当前线程的标识号,它一定不为零。" + +#: ../../c-api/threads.rst:782 ../../c-api/threads.rst:814 +msgid "" +"This function cannot fail, and the caller does not need to hold an " +":term:`attached thread state`." +msgstr "此函数不会执行失败,并且调用方不需要持有 :term:`attached thread state`。" + +#: ../../c-api/threads.rst:786 +msgid ":py:func:`threading.get_ident`" +msgstr ":py:func:`threading.get_ident`" + +#: ../../c-api/threads.rst:791 +msgid "" +"Get general information about the current thread in the form of a " +":ref:`struct sequence ` object. This information is" +" accessible as :py:attr:`sys.thread_info` in Python." +msgstr "" +"获取有关当前线程的 :ref:`结构体序列 ` 对象形式的基本信息。此信息可在 Python 中作为 " +":py:attr:`sys.thread_info` 访问。" + +#: ../../c-api/threads.rst:795 +msgid "" +"On success, this returns a new :term:`strong reference` to the thread " +"information; on failure, this returns ``NULL`` with an exception set." +msgstr "" +"成功时,此函数将返回一个指向线程信息的新的 :term:`strong reference`;失败时,将返回 ``NULL`` 并设置一个异常。" + +#: ../../c-api/threads.rst:798 +msgid "The caller must hold an :term:`attached thread state`." +msgstr "调用方必须持有一个 :term:`attached thread state`。" + +#: ../../c-api/threads.rst:803 +msgid "This macro is defined when the system supports native thread IDs." +msgstr "该宏将在系统支持原生线程 ID 时被定义。" + +#: ../../c-api/threads.rst:808 +msgid "" +"Get the native identifier of the current thread as it was assigned by the " +"operating system's kernel, which will never be less than zero." +msgstr "获取当前线程由操作系统的内核所分配的原生标识号,它绝对不会小于零。" + +#: ../../c-api/threads.rst:811 +msgid "" +"This function is only available when :c:macro:`PY_HAVE_THREAD_NATIVE_ID` is " +"defined." +msgstr "此函数仅在定义了 :c:macro:`PY_HAVE_THREAD_NATIVE_ID` 时可用。" + +#: ../../c-api/threads.rst:818 +msgid ":py:func:`threading.get_native_id`" +msgstr ":py:func:`threading.get_native_id`" + +#: ../../c-api/threads.rst:823 +msgid "" +"Terminate the current thread. This function is generally considered unsafe " +"and should be avoided. It is kept solely for backwards compatibility." +msgstr "终结当前线程。此函数通常被视为是不安全的并应避免使用。它只是为了向下兼容而被保留。" + +#: ../../c-api/threads.rst:826 +msgid "" +"This function is only safe to call if all functions in the full call stack " +"are written to safely allow it." +msgstr "此函数仅在整个调用栈中的所有函数都被编写为能够安全地支持它时才能被安全地调用。" + +#: ../../c-api/threads.rst:831 +msgid "" +"If the current system uses POSIX threads (also known as \"pthreads\"), this " +"calls :manpage:`pthread_exit(3)`, which attempts to unwind the stack and " +"call C++ destructors on some libc implementations. However, if a " +"``noexcept`` function is reached, it may terminate the process. Other " +"systems, such as macOS, do unwinding." +msgstr "" +"如果当前系统使用 POSIX 线程(或称“p 线程”),此函数将调用 :manpage:`pthread_exit(3)`,它会尝试展开栈并在某些 " +"libc 实现上调用 C++ 析构器,如果抵达一个 ``noexcept`` 函数,它可能会终结进程。在其他系统,如 macOS 上,只执行展开。" + +#: ../../c-api/threads.rst:837 +msgid "" +"On Windows, this function calls ``_endthreadex()``, which kills the thread " +"without calling C++ destructors." +msgstr "在 Windows 上,此函数将调用 ``_endthreadex()``,它将杀掉线程而不调用 C++ 析构器。" + +#: ../../c-api/threads.rst:840 +msgid "In any case, there is a risk of corruption on the thread's stack." +msgstr "在任何情况下,都存在线程栈损坏的风险。" + +#: ../../c-api/threads.rst:847 +msgid "" +"Initialize ``PyThread*`` APIs. Python executes this function automatically, " +"so there's little need to call it from an extension module." +msgstr "初始化 ``PyThread*`` API。Python 会自动执行此函数,因此很少需要从扩展模块调用它。" + +#: ../../c-api/threads.rst:853 +msgid "Set the stack size of the current thread to *size* bytes." +msgstr "将当前线程的栈大小设为 *size* 个字节。" + +#: ../../c-api/threads.rst:855 +msgid "" +"This function returns ``0`` on success, ``-1`` if *size* is invalid, or " +"``-2`` if the system does not support changing the stack size. This function" +" does not set exceptions." +msgstr "" +"此函数成功时返回 ``0``,如果 *size* 无效则返回 ``-1``,或者如果系统不支持修改栈大小则返回 ``-2``。此函数不会设置异常。" + +#: ../../c-api/threads.rst:864 +msgid "" +"Return the stack size of the current thread in bytes, or ``0`` if the " +"system's default stack size is in use." +msgstr "返回以字节为单位的当前线程栈大小,或者如果是使用系统的默认栈大小则返回 ``0``。" + +#: ../../c-api/threads.rst:8 +msgid "global interpreter lock" +msgstr "global interpreter lock -- 全局解释器锁" + +#: ../../c-api/threads.rst:8 +msgid "interpreter lock" +msgstr "解释器锁" + +#: ../../c-api/threads.rst:8 +msgid "lock, interpreter" +msgstr "锁,解释器" + +#: ../../c-api/threads.rst:25 +msgid "setswitchinterval (in module sys)" +msgstr "setswitchinterval (在 sys 模块中)" + +#: ../../c-api/threads.rst:36 +msgid "PyThreadState (C type)" +msgstr "PyThreadState (C 类型)" + +#: ../../c-api/threads.rst:87 +msgid "Py_BEGIN_ALLOW_THREADS (C macro)" +msgstr "Py_BEGIN_ALLOW_THREADS (C 宏)" + +#: ../../c-api/threads.rst:87 +msgid "Py_END_ALLOW_THREADS (C macro)" +msgstr "Py_END_ALLOW_THREADS (C 宏)" + +#: ../../c-api/threads.rst:103 +msgid "PyEval_RestoreThread (C function)" +msgstr "PyEval_RestoreThread (C 函数)" + +#: ../../c-api/threads.rst:103 +msgid "PyEval_SaveThread (C function)" +msgstr "PyEval_SaveThread (C 函数)" + +#: ../../c-api/threads.rst:318 +msgid "PyEval_AcquireThread()" +msgstr "PyEval_AcquireThread()" + +#: ../../c-api/threads.rst:318 +msgid "PyEval_ReleaseThread()" +msgstr "PyEval_ReleaseThread()" + +#: ../../c-api/threads.rst:318 +msgid "PyEval_SaveThread()" +msgstr "PyEval_SaveThread()" + +#: ../../c-api/threads.rst:318 +msgid "PyEval_RestoreThread()" +msgstr "PyEval_RestoreThread()" + +#: ../../c-api/threads.rst:340 +msgid "module" +msgstr "module" + +#: ../../c-api/threads.rst:340 +msgid "_thread" +msgstr "_thread" diff --git a/c-api/time.po b/c-api/time.po new file mode 100644 index 0000000000..66a7d7e0ea --- /dev/null +++ b/c-api/time.po @@ -0,0 +1,185 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/time.rst:6 +msgid "PyTime C API" +msgstr "PyTime C API" + +#: ../../c-api/time.rst:10 +msgid "" +"The clock C API provides access to system clocks. It is similar to the " +"Python :mod:`time` module." +msgstr "时钟 C API 提供对系统时钟的访问。它类似于 Python :mod:`time` 模块。" + +#: ../../c-api/time.rst:13 +msgid "" +"For C API related to the :mod:`datetime` module, see :ref:`datetimeobjects`." +msgstr "有关与 :mod:`datetime` 模块相关的 C API,请参阅 :ref:`datetimeobjects`。" + +#: ../../c-api/time.rst:17 +msgid "Types" +msgstr "类型" + +#: ../../c-api/time.rst:21 +msgid "" +"A timestamp or duration in nanoseconds, represented as a signed 64-bit " +"integer." +msgstr "以纳秒为单位的时间戳或持续时间,表示为带符号的 64 位整数。" + +#: ../../c-api/time.rst:24 +msgid "" +"The reference point for timestamps depends on the clock used. For example, " +":c:func:`PyTime_Time` returns timestamps relative to the UNIX epoch." +msgstr "时间戳的参考点取决于所使用的时钟。例如,:c:func:`PyTime_Time` 返回相对于 UNIX 纪元的时间戳。" + +#: ../../c-api/time.rst:27 +msgid "" +"The supported range is around [-292.3 years; +292.3 years]. Using the Unix " +"epoch (January 1st, 1970) as reference, the supported date range is around " +"[1677-09-21; 2262-04-11]. The exact limits are exposed as constants:" +msgstr "" +"支持的范围约为 [-292.3 年; +292.3 年]。以 Unix 纪元(1970 年 1 月 1 日)为参考,支持的日期范围约为 " +"[1677-09-21; 2262-04-11]。确切的限制以常量形式公开:" + +#: ../../c-api/time.rst:34 +msgid "Minimum value of :c:type:`PyTime_t`." +msgstr ":c:type:`PyTime_t` 的最小值。" + +#: ../../c-api/time.rst:38 +msgid "Maximum value of :c:type:`PyTime_t`." +msgstr ":c:type:`PyTime_t` 的最大值。" + +#: ../../c-api/time.rst:42 +msgid "Clock Functions" +msgstr "时钟函数" + +#: ../../c-api/time.rst:44 +msgid "" +"The following functions take a pointer to a :c:expr:`PyTime_t` that they set" +" to the value of a particular clock. Details of each clock are given in the " +"documentation of the corresponding Python function." +msgstr "" +"以下函数采用指向 :c:expr:`PyTime_t` 的指针,并将其设置为特定时钟的值。每个时钟的详细信息在相应的 Python 函数的文档中给出。" + +#: ../../c-api/time.rst:49 +msgid "" +"The functions return ``0`` on success, or ``-1`` (with an exception set) on " +"failure." +msgstr "成功时函数返回 ``0``,失败时返回 ``-1`` (设置一个异常)。" + +#: ../../c-api/time.rst:52 +msgid "" +"On integer overflow, they set the :c:data:`PyExc_OverflowError` exception " +"and set ``*result`` to the value clamped to the ``[PyTime_MIN; PyTime_MAX]``" +" range. (On current systems, integer overflows are likely caused by " +"misconfigured system time.)" +msgstr "" +"在整数溢出时,它们会设置 :c:data:`PyExc_OverflowError` 异常,并将 ``*result`` 设置为钳位到 " +"``[PyTime_MIN; PyTime_MAX]`` 范围的值。 (在当前系统上,整数溢出可能是由于系统时间配置错误引起的。)" + +#: ../../c-api/time.rst:58 +msgid "" +"As any other C API (unless otherwise specified), the functions must be " +"called with an :term:`attached thread state`." +msgstr "与任何其他 C API 一样(除非另有说明),必须使用持有的 :term:`attached thread state` 来调用函数。" + +#: ../../c-api/time.rst:63 +msgid "" +"Read the monotonic clock. See :func:`time.monotonic` for important details " +"on this clock." +msgstr "读取单调时钟。有关该时钟的重要详细信息,请参阅 :func:`time.monotonic`。" + +#: ../../c-api/time.rst:68 +msgid "" +"Read the performance counter. See :func:`time.perf_counter` for important " +"details on this clock." +msgstr "读取性能计数器。有关该时钟的重要详细信息,请参阅 :func:`time.perf_counter`。" + +#: ../../c-api/time.rst:73 +msgid "" +"Read the “wall clock” time. See :func:`time.time` for details important on " +"this clock." +msgstr "读取\"wall clock\"时间。有关该时钟的重要详细信息,请参阅 :func:`time.time`。" + +#: ../../c-api/time.rst:78 +msgid "Raw Clock Functions" +msgstr "原始时钟函数" + +#: ../../c-api/time.rst:80 +msgid "" +"Similar to clock functions, but don't set an exception on error and don't " +"require the caller to have an :term:`attached thread state`." +msgstr "与时钟函数类似,但不设置错误异常,也不要求调用者具有 :term:`attached thread state`。" + +#: ../../c-api/time.rst:83 +msgid "On success, the functions return ``0``." +msgstr "成功时,函数返回 ``0``。" + +#: ../../c-api/time.rst:85 +msgid "" +"On failure, they set ``*result`` to ``0`` and return ``-1``, *without* " +"setting an exception. To get the cause of the error, :term:`attach ` a :term:`thread state`, and call the regular (non-``Raw``) " +"function. Note that the regular function may succeed after the ``Raw`` one " +"failed." +msgstr "" +"失败时,它们将 ``*result`` 设置为 ``0`` 并返回 ``-1``,*不* 设置异常。要了解错误原因,请 :term:`附加 " +"` :term:`thread state`,并调用常规 (非 ``Raw``) 函数。 " +"请注意,常规函数可能会在 ``Raw`` 函数失败后成功。" + +#: ../../c-api/time.rst:92 +msgid "" +"Similar to :c:func:`PyTime_Monotonic`, but don't set an exception on error " +"and don't require an :term:`attached thread state`." +msgstr "" +"与 :c:func:`PyTime_Monotonic` 类似,但在错误时不设置异常,并且不需要 :term:`attached thread " +"state`." + +#: ../../c-api/time.rst:97 +msgid "" +"Similar to :c:func:`PyTime_PerfCounter`, but don't set an exception on error" +" and don't require an :term:`attached thread state`." +msgstr "" +"与 :c:func:`PyTime_PerfCounter` 类似,但在错误时不设置异常,并且不需要 :term:`attached thread " +"state`." + +#: ../../c-api/time.rst:102 +msgid "" +"Similar to :c:func:`PyTime_Time`, but don't set an exception on error and " +"don't require an :term:`attached thread state`." +msgstr "" +"与 :c:func:`PyTime_Time` 类似,但在错误时不设置异常,并且不需要 :term:`attached thread state`。" + +#: ../../c-api/time.rst:107 +msgid "Conversion functions" +msgstr "转换函数" + +#: ../../c-api/time.rst:111 +msgid "Convert a timestamp to a number of seconds as a C :c:expr:`double`." +msgstr "将时间戳转换为 C :c:expr:`double` 形式的秒数。" + +#: ../../c-api/time.rst:113 +msgid "" +"The function cannot fail, but note that :c:expr:`double` has limited " +"accuracy for large values." +msgstr "该函数不会失败,但请注意 :c:expr:`double` 对于大值的精度有限。" diff --git a/c-api/tls.po b/c-api/tls.po new file mode 100644 index 0000000000..6cfb557281 --- /dev/null +++ b/c-api/tls.po @@ -0,0 +1,221 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/tls.rst:6 +msgid "Thread-local storage support" +msgstr "线程本地存储支持" + +#: ../../c-api/tls.rst:8 +msgid "" +"The Python interpreter provides low-level support for thread-local storage " +"(TLS) which wraps the underlying native TLS implementation to support the " +"Python-level thread-local storage API (:class:`threading.local`). The " +"CPython C level APIs are similar to those offered by pthreads and Windows: " +"use a thread key and functions to associate a :c:expr:`void*` value per " +"thread." +msgstr "" + +#: ../../c-api/tls.rst:15 +msgid "" +"A :term:`thread state` does *not* need to be :term:`attached ` when calling these functions; they supply their own locking." +msgstr "" + +#: ../../c-api/tls.rst:18 +msgid "" +"Note that :file:`Python.h` does not include the declaration of the TLS APIs," +" you need to include :file:`pythread.h` to use thread-local storage." +msgstr "" +"请注意 :file:`Python.h` 并不包括 TLS API 的声明,你需要包括 :file:`pythread.h` 来使用线程本地存储。" + +#: ../../c-api/tls.rst:22 +msgid "" +"None of these API functions handle memory management on behalf of the " +":c:expr:`void*` values. You need to allocate and deallocate them yourself. " +"If the :c:expr:`void*` values happen to be :c:expr:`PyObject*`, these " +"functions don't do refcount operations on them either." +msgstr "" +"这些 API 函数都不会为 :c:expr:`void*` 的值处理内存管理问题。你需要自己分配和释放它们。如果 :c:expr:`void*` " +"值碰巧为 :c:expr:`PyObject*`,这些函数也不会对它们执行引用计数操作。" + +#: ../../c-api/tls.rst:30 +msgid "Thread-specific storage API" +msgstr "" + +#: ../../c-api/tls.rst:32 +msgid "" +"The thread-specific storage (TSS) API was introduced to supersede the use of" +" the existing TLS API within the CPython interpreter. This API uses a new " +"type :c:type:`Py_tss_t` instead of :c:expr:`int` to represent thread keys." +msgstr "" + +#: ../../c-api/tls.rst:38 +msgid "\"A New C-API for Thread-Local Storage in CPython\" (:pep:`539`)" +msgstr "\"A New C-API for Thread-Local Storage in CPython\" (:pep:`539`)" + +#: ../../c-api/tls.rst:43 +msgid "" +"This data structure represents the state of a thread key, the definition of " +"which may depend on the underlying TLS implementation, and it has an " +"internal field representing the key's initialization state. There are no " +"public members in this structure." +msgstr "该数据结构表示线程键的状态,其定义可能依赖于下层的 TLS 实现,并且它有一个表示键初始化状态的内部字段。该结构体中不存在公有成员。" + +#: ../../c-api/tls.rst:48 +msgid "" +"When :ref:`Py_LIMITED_API ` is not defined, static allocation of " +"this type by :c:macro:`Py_tss_NEEDS_INIT` is allowed." +msgstr "" +"当未定义 :ref:`Py_LIMITED_API ` 时,允许由 :c:macro:`Py_tss_NEEDS_INIT` " +"执行此类型的静态分配。" + +#: ../../c-api/tls.rst:54 +msgid "" +"This macro expands to the initializer for :c:type:`Py_tss_t` variables. Note" +" that this macro won't be defined with :ref:`Py_LIMITED_API `." +msgstr "" +"这个宏将扩展为 :c:type:`Py_tss_t` 变量的初始化器。请注意这个宏不会用 :ref:`Py_LIMITED_API ` " +"来定义。" + +#: ../../c-api/tls.rst:59 +msgid "Dynamic allocation" +msgstr "动态分配" + +#: ../../c-api/tls.rst:61 +msgid "" +"Dynamic allocation of the :c:type:`Py_tss_t`, required in extension modules " +"built with :ref:`Py_LIMITED_API `, where static allocation of this " +"type is not possible due to its implementation being opaque at build time." +msgstr "" +":c:type:`Py_tss_t` 的动态分配,在使用 :ref:`Py_LIMITED_API ` " +"编译的扩展模块中是必须的,在这些模块由于此类型的实现在编译时是不透明的因此它不可能静态分配。" + +#: ../../c-api/tls.rst:68 +msgid "" +"Return a value which is the same state as a value initialized with " +":c:macro:`Py_tss_NEEDS_INIT`, or ``NULL`` in the case of dynamic allocation " +"failure." +msgstr "" +"返回一个与使用 :c:macro:`Py_tss_NEEDS_INIT` 初始化的值的状态相同的值,或者当动态分配失败时则返回 ``NULL``。" + +#: ../../c-api/tls.rst:75 +msgid "" +"Free the given *key* allocated by :c:func:`PyThread_tss_alloc`, after first " +"calling :c:func:`PyThread_tss_delete` to ensure any associated thread locals" +" have been unassigned. This is a no-op if the *key* argument is ``NULL``." +msgstr "" +"在首次调用 :c:func:`PyThread_tss_delete` 以确保任何相关联的线程局部变量已被撤销赋值之后释放由 " +":c:func:`PyThread_tss_alloc` 所分配的给定的 *key*。如果 *key* 参数为 ``NULL`` 则这将无任何操作。" + +#: ../../c-api/tls.rst:81 +msgid "" +"A freed key becomes a dangling pointer. You should reset the key to " +"``NULL``." +msgstr "被释放的 key 将变成一个悬空指针。你应当将 key 重置为 ``NULL``。" + +#: ../../c-api/tls.rst:86 +msgid "Methods" +msgstr "方法" + +#: ../../c-api/tls.rst:88 +msgid "" +"The parameter *key* of these functions must not be ``NULL``. Moreover, the " +"behaviors of :c:func:`PyThread_tss_set` and :c:func:`PyThread_tss_get` are " +"undefined if the given :c:type:`Py_tss_t` has not been initialized by " +":c:func:`PyThread_tss_create`." +msgstr "" +"这些函数的形参 *key* 不可为 ``NULL``。并且,如果给定的 :c:type:`Py_tss_t` 还未被 " +":c:func:`PyThread_tss_create` 初始化则 :c:func:`PyThread_tss_set` 和 " +":c:func:`PyThread_tss_get` 的行为将是未定义的。" + +#: ../../c-api/tls.rst:96 +msgid "" +"Return a non-zero value if the given :c:type:`Py_tss_t` has been initialized" +" by :c:func:`PyThread_tss_create`." +msgstr "" +"如果给定的 :c:type:`Py_tss_t` 已通过 :c:func:`PyThread_tss_create` 被初始化则返回一个非零值。" + +#: ../../c-api/tls.rst:102 +msgid "" +"Return a zero value on successful initialization of a TSS key. The behavior" +" is undefined if the value pointed to by the *key* argument is not " +"initialized by :c:macro:`Py_tss_NEEDS_INIT`. This function can be called " +"repeatedly on the same key -- calling it on an already initialized key is a " +"no-op and immediately returns success." +msgstr "" +"当成功初始化一个 TSS 键时将返回零值。如果 *key* 参数所指向的值未被 :c:macro:`Py_tss_NEEDS_INIT` " +"初始化则其行为是未定义的。此函数可在相同的键上重复调用 -- 在已初始化的键上调用它将不执行任何操作并立即成功返回。" + +#: ../../c-api/tls.rst:111 +msgid "" +"Destroy a TSS key to forget the values associated with the key across all " +"threads, and change the key's initialization state to uninitialized. A " +"destroyed key is able to be initialized again by " +":c:func:`PyThread_tss_create`. This function can be called repeatedly on the" +" same key -- calling it on an already destroyed key is a no-op." +msgstr "" +"销毁一个 TSS 键以便在所有线程中遗忘与该键相关联的值,并将该键的初始化状态改为未初始化的。已销毁的键可以通过 " +":c:func:`PyThread_tss_create` 再次被初始化。此函数可以在同一个键上重复调用 -- 但在一个已被销毁的键上调用将是无效的。" + +#: ../../c-api/tls.rst:120 +msgid "" +"Return a zero value to indicate successfully associating a :c:expr:`void*` " +"value with a TSS key in the current thread. Each thread has a distinct " +"mapping of the key to a :c:expr:`void*` value." +msgstr "" +"返回零值来表示成功将一个 :c:expr:`void*` 值与当前线程中的 TSS 键相关联。每个线程都有一个从键到 :c:expr:`void*` " +"值的独立映射。" + +#: ../../c-api/tls.rst:127 +msgid "" +"Return the :c:expr:`void*` value associated with a TSS key in the current " +"thread. This returns ``NULL`` if no value is associated with the key in the" +" current thread." +msgstr "返回当前线程中与一个 TSS 键相关联的 :c:expr:`void*` 值。如果当前线程中没有与该键相关联的值则返回 ``NULL``。" + +#: ../../c-api/tls.rst:135 +msgid "Legacy APIs" +msgstr "旧式 API" + +#: ../../c-api/tls.rst:137 +msgid "" +"This API is superseded by the :ref:`thread-specific storage (TSS) API " +"`." +msgstr "" + +#: ../../c-api/tls.rst:142 +msgid "" +"This version of the API does not support platforms where the native TLS key " +"is defined in a way that cannot be safely cast to ``int``. On such " +"platforms, :c:func:`PyThread_create_key` will return immediately with a " +"failure status, and the other TLS functions will all be no-ops on such " +"platforms." +msgstr "" +"这个 API 版本不支持原生 TLS 键采用无法被安全转换为 ``int`` 的定义方式的平台。 " +"在这样的平台上,:c:func:`PyThread_create_key` 将立即返回一个失败状态,并且其他 TLS 函数在这样的平台上也都无效。" + +#: ../../c-api/tls.rst:147 +msgid "" +"Due to the compatibility problem noted above, this version of the API should" +" not be used in new code." +msgstr "由于上面提到的兼容性问题,不应在新代码中使用此版本的 API。" diff --git a/c-api/tuple.po b/c-api/tuple.po new file mode 100644 index 0000000000..81c53c0b7b --- /dev/null +++ b/c-api/tuple.po @@ -0,0 +1,320 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-01 17:14+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/tuple.rst:6 +msgid "Tuple Objects" +msgstr "元组对象" + +#: ../../c-api/tuple.rst:13 +msgid "This subtype of :c:type:`PyObject` represents a Python tuple object." +msgstr "这个 :c:type:`PyObject` 的子类型代表一个 Python 的元组对象。" + +#: ../../c-api/tuple.rst:18 +msgid "" +"This instance of :c:type:`PyTypeObject` represents the Python tuple type; it" +" is the same object as :class:`tuple` in the Python layer." +msgstr "" +":c:type:`PyTypeObject` 的实例代表一个 Python 元组类型,这与 Python 层面的 :class:`tuple` " +"是相同的对象。" + +#: ../../c-api/tuple.rst:24 +msgid "" +"Return true if *p* is a tuple object or an instance of a subtype of the " +"tuple type. This function always succeeds." +msgstr "如果 *p* 是一个 tuple 对象或者 tuple 类型的子类型的实例则返回真值。此函数总是会成功执行。" + +#: ../../c-api/tuple.rst:30 +msgid "" +"Return true if *p* is a tuple object, but not an instance of a subtype of " +"the tuple type. This function always succeeds." +msgstr "如果 *p* 是一个 tuple 对象但不是 tuple 类型的子类型的实例则返回真值。此函数总是会成功执行。" + +#: ../../c-api/tuple.rst:36 +msgid "" +"Return a new tuple object of size *len*, or ``NULL`` with an exception set " +"on failure." +msgstr "返回一个长度为 *len* 的新元组对象,或者失败时返回 ``NULL`` 并设置一个异常。" + +#: ../../c-api/tuple.rst:42 +msgid "" +"Return a new tuple object of size *n*, or ``NULL`` with an exception set on " +"failure. The tuple values are initialized to the subsequent *n* C arguments " +"pointing to Python objects. ``PyTuple_Pack(2, a, b)`` is equivalent to " +"``Py_BuildValue(\"(OO)\", a, b)``." +msgstr "" +"返回一个长度为 *n* 的新元组对象,或者失败时返回 ``NULL`` 并设置一个异常。元组值初始化为指向 Python 对象的后续 *n* 个 C " +"参数。``PyTuple_Pack(2, a, b)`` 等价于 ``Py_BuildValue(\"(OO)\", a, b)``。" + +#: ../../c-api/tuple.rst:50 +msgid "" +"Take a pointer to a tuple object, and return the size of that tuple. On " +"error, return ``-1`` with an exception set." +msgstr "接受一个指向元组对象的指针,并返回该元组的大小。出错时,返回 ``-1`` 并设置一个异常。" + +#: ../../c-api/tuple.rst:56 +msgid "Like :c:func:`PyTuple_Size`, but without error checking." +msgstr "类似于 :c:func:`PyTuple_Size`,但是不带错误检测。" + +#: ../../c-api/tuple.rst:61 +msgid "" +"Return the object at position *pos* in the tuple pointed to by *p*. If " +"*pos* is negative or out of bounds, return ``NULL`` and set an " +":exc:`IndexError` exception." +msgstr "" +"返回 *p* 所指向的元组中位于 *pos* 处的对象。如果 *pos* 为负值或超出范围,则返回 ``NULL`` 并设置一个 " +":exc:`IndexError` 异常。" + +#: ../../c-api/tuple.rst:64 +msgid "" +"The returned reference is borrowed from the tuple *p* (that is: it is only " +"valid as long as you hold a reference to *p*). To get a :term:`strong " +"reference`, use :c:func:`Py_NewRef(PyTuple_GetItem(...)) ` or " +":c:func:`PySequence_GetItem`." +msgstr "" +"返回的引用是从元组 *p* 借入的(也就是说:它只在你持有对 *p* 的引用时才是可用的)。要获取 :term:`strong " +"reference`,请使用 :c:func:`Py_NewRef(PyTuple_GetItem(...)) ` 或 " +":c:func:`PySequence_GetItem`." + +#: ../../c-api/tuple.rst:73 +msgid "Like :c:func:`PyTuple_GetItem`, but does no checking of its arguments." +msgstr "类似于 :c:func:`PyTuple_GetItem`,但不检查其参数。" + +#: ../../c-api/tuple.rst:78 +msgid "" +"Return the slice of the tuple pointed to by *p* between *low* and *high*, or" +" ``NULL`` with an exception set on failure." +msgstr "返回一个 *p* 指向的元组的 *low* 和 *high* 之间的切片,或者失败时返回 ``NULL`` 并设置一个异常。" + +#: ../../c-api/tuple.rst:81 +msgid "" +"This is the equivalent of the Python expression ``p[low:high]``. Indexing " +"from the end of the tuple is not supported." +msgstr "这等价于 Python 表达式 ``p[low:high]``。不支持从元组末尾进行索引。" + +#: ../../c-api/tuple.rst:87 +msgid "" +"Insert a reference to object *o* at position *pos* of the tuple pointed to " +"by *p*. Return ``0`` on success. If *pos* is out of bounds, return ``-1`` " +"and set an :exc:`IndexError` exception." +msgstr "" +"在 *p* 指向的元组的 *pos* 位置插入对对象 *o* 的引用。成功时返回 ``0``;如果 *pos* 越界,则返回 ``-1``,并抛出一个 " +":exc:`IndexError` 异常。" + +#: ../../c-api/tuple.rst:93 +msgid "" +"This function \":term:`steals `\" a reference to *o* and discards a " +"reference to an item already in the tuple at the affected position (unless " +"it was NULL)." +msgstr "" + +#: ../../c-api/tuple.rst:100 +msgid "" +"Like :c:func:`PyTuple_SetItem`, but does no error checking, and should " +"*only* be used to fill in brand new tuples." +msgstr "类似于 :c:func:`PyTuple_SetItem`,但不进行错误检查,并且应该 *只是* 被用来填充全新的元组。" + +#: ../../c-api/tuple.rst:103 ../../c-api/tuple.rst:225 +#: ../../c-api/tuple.rst:243 +msgid "" +"Bounds checking is performed as an assertion if Python is built in " +":ref:`debug mode ` or :option:`with assertions <--with-" +"assertions>`." +msgstr "" +"当 Python 以 :ref:`调试模式 ` 或 :option:`启用断言 <--with-assertions>` " +"构建时将把边界检测作为断言来执行。" + +#: ../../c-api/tuple.rst:108 +msgid "" +"This function \":term:`steals `\" a reference to *o*, and, unlike " +":c:func:`PyTuple_SetItem`, does *not* discard a reference to any item that " +"is being replaced; any reference in the tuple at position *pos* will be " +"leaked." +msgstr "" + +#: ../../c-api/tuple.rst:115 +msgid "" +"This macro should *only* be used on tuples that are newly created. Using " +"this macro on a tuple that is already in use (or in other words, has a " +"refcount > 1) could lead to undefined behavior." +msgstr "这个宏应该 *只* 用于新创建的元组。在一个已经在使用的元组上使用这个宏(换句话说,引用计数 > 1)可能会导致未定义的行为。" + +#: ../../c-api/tuple.rst:122 +msgid "" +"Can be used to resize a tuple. *newsize* will be the new length of the " +"tuple. Because tuples are *supposed* to be immutable, this should only be " +"used if there is only one reference to the object. Do *not* use this if the" +" tuple may already be known to some other part of the code. The tuple will " +"always grow or shrink at the end. Think of this as destroying the old tuple" +" and creating a new one, only more efficiently. Returns ``0`` on success. " +"Client code should never assume that the resulting value of ``*p`` will be " +"the same as before calling this function. If the object referenced by ``*p``" +" is replaced, the original ``*p`` is destroyed. On failure, returns ``-1`` " +"and sets ``*p`` to ``NULL``, and raises :exc:`MemoryError` or " +":exc:`SystemError`." +msgstr "" +"可以用于调整元组的大小。*newsize* 将是元组的新长度。因为元组 *被认为* 是不可变的,所以只有在对象仅有一个引用时,才应该使用它。 " +"如果元组已经被代码的其他部分所引用,请不要使用此项。元组在最后总是会增长或缩小。把它看作是销毁旧元组并创建一个新元组,只会更有效。成功时返回 " +"``0``。客户端代码不应假定 ``*p`` 的结果值将与调用此函数之前的值相同。如果替换了 ``*p`` 引用的对象,则原始的 ``*p`` " +"将被销毁。失败时,返回 ``-1``,将 ``*p`` 设置为 ``NULL``,并引发 :exc:`MemoryError` 或者 " +":exc:`SystemError`." + +#: ../../c-api/tuple.rst:137 +msgid "Struct Sequence Objects" +msgstr "结构序列对象" + +#: ../../c-api/tuple.rst:139 +msgid "" +"Struct sequence objects are the C equivalent of " +":func:`~collections.namedtuple` objects, i.e. a sequence whose items can " +"also be accessed through attributes. To create a struct sequence, you first " +"have to create a specific struct sequence type." +msgstr "" +"结构序列对象是等价于 :func:`~collections.namedtuple` 的 C 对象,即一个序列,其中的条目也可以通过属性访问。 " +"要创建结构序列,你首先必须创建特定的结构序列类型。" + +#: ../../c-api/tuple.rst:146 +msgid "" +"Create a new struct sequence type from the data in *desc*, described below. " +"Instances of the resulting type can be created with " +":c:func:`PyStructSequence_New`." +msgstr "" +"根据 *desc* 中的数据创建一个新的结构序列类型,如下所述。可以使用 :c:func:`PyStructSequence_New` " +"创建结果类型的实例。" + +#: ../../c-api/tuple.rst:149 ../../c-api/tuple.rst:218 +msgid "Return ``NULL`` with an exception set on failure." +msgstr "失败时返回 ``NULL`` 并设置一个异常。" + +#: ../../c-api/tuple.rst:154 +msgid "Initializes a struct sequence type *type* from *desc* in place." +msgstr "从 *desc* 就地初始化结构序列类型 *type*。" + +#: ../../c-api/tuple.rst:159 +msgid "" +"Like :c:func:`PyStructSequence_InitType`, but returns ``0`` on success and " +"``-1`` with an exception set on failure." +msgstr "" +"类似于 :c:func:`PyStructSequence_InitType`,但成功时返回 ``0`` 而失败时返回 ``-1`` 并设置一个异常。" + +#: ../../c-api/tuple.rst:167 +msgid "Contains the meta information of a struct sequence type to create." +msgstr "包含要创建的结构序列类型的元信息。" + +#: ../../c-api/tuple.rst:171 +msgid "" +"Fully qualified name of the type; null-terminated UTF-8 encoded. The name " +"must contain the module name." +msgstr "类型的完整限定名称;使用以空值结束的 UTF-8 编码。该名称必须包含模块名。" + +#: ../../c-api/tuple.rst:176 +msgid "Pointer to docstring for the type or ``NULL`` to omit." +msgstr "指向类型的文档字符串的指针或以 ``NULL`` 表示忽略。" + +#: ../../c-api/tuple.rst:180 +msgid "Pointer to ``NULL``-terminated array with field names of the new type." +msgstr "指向以 ``NULL`` 结尾的数组的指针,该数组包含新类型的字段名。" + +#: ../../c-api/tuple.rst:184 +msgid "Number of fields visible to the Python side (if used as tuple)." +msgstr "Python 端可见的字段数(如果用作元组)。" + +#: ../../c-api/tuple.rst:189 +msgid "" +"Describes a field of a struct sequence. As a struct sequence is modeled as a" +" tuple, all fields are typed as :c:expr:`PyObject*`. The index in the " +":c:member:`~PyStructSequence_Desc.fields` array of the " +":c:type:`PyStructSequence_Desc` determines which field of the struct " +"sequence is described." +msgstr "" +"描述结构序列的一个字段。由于结构序列是以元组为模型的,因此所有字段的类型都是 :c:expr:`PyObject*`。 " +":c:type:`PyStructSequence_Desc` 的 :c:member:`~PyStructSequence_Desc.fields` " +"数组中的索引决定了描述结构序列的是哪个字段。" + +#: ../../c-api/tuple.rst:197 +msgid "" +"Name for the field or ``NULL`` to end the list of named fields, set to " +":c:data:`PyStructSequence_UnnamedField` to leave unnamed." +msgstr "" +"字段的名称或 ``NULL`` 表示结束已命名字段列表,设为 :c:data:`PyStructSequence_UnnamedField` " +"则保持未命名状态。" + +#: ../../c-api/tuple.rst:202 +msgid "Field docstring or ``NULL`` to omit." +msgstr "字段文档字符串或 ``NULL`` 表示省略。" + +#: ../../c-api/tuple.rst:207 +msgid "Special value for a field name to leave it unnamed." +msgstr "字段名的特殊值将保持未命名状态。" + +#: ../../c-api/tuple.rst:209 +msgid "The type was changed from ``char *``." +msgstr "这个类型已从 ``char *`` 更改。" + +#: ../../c-api/tuple.rst:215 +msgid "" +"Creates an instance of *type*, which must have been created with " +":c:func:`PyStructSequence_NewType`." +msgstr "创建 *type* 的实例,该实例必须使用 :c:func:`PyStructSequence_NewType` 创建。" + +#: ../../c-api/tuple.rst:223 +msgid "" +"Return the object at position *pos* in the struct sequence pointed to by " +"*p*." +msgstr "返回 *p* 所指向的结构序列中位于 *pos* 处的对象。" + +#: ../../c-api/tuple.rst:231 +msgid "Alias to :c:func:`PyStructSequence_GetItem`." +msgstr ":c:func:`PyStructSequence_GetItem` 的别名。" + +#: ../../c-api/tuple.rst:233 +msgid "Now implemented as an alias to :c:func:`PyStructSequence_GetItem`." +msgstr "现在被实现为 :c:func:`PyStructSequence_GetItem` 的别名。" + +#: ../../c-api/tuple.rst:239 +msgid "" +"Sets the field at index *pos* of the struct sequence *p* to value *o*. Like" +" :c:func:`PyTuple_SET_ITEM`, this should only be used to fill in brand new " +"instances." +msgstr "" +"将结构序列 *p* 的索引 *pos* 处的字段设置为值 *o*。与 :c:func:`PyTuple_SET_ITEM` " +"一样,它应该只用于填充全新的实例。" + +#: ../../c-api/tuple.rst:248 +msgid "This function \":term:`steals `\" a reference to *o*." +msgstr "" + +#: ../../c-api/tuple.rst:253 +msgid "Alias to :c:func:`PyStructSequence_SetItem`." +msgstr ":c:func:`PyStructSequence_SetItem` 的别名。" + +#: ../../c-api/tuple.rst:255 +msgid "Now implemented as an alias to :c:func:`PyStructSequence_SetItem`." +msgstr "现在被实现为 :c:func:`PyStructSequence_SetItem` 的别名。" + +#: ../../c-api/tuple.rst:8 +msgid "object" +msgstr "object -- 对象" + +#: ../../c-api/tuple.rst:8 +msgid "tuple" +msgstr "元组" diff --git a/c-api/type.po b/c-api/type.po new file mode 100644 index 0000000000..ab3365caf8 --- /dev/null +++ b/c-api/type.po @@ -0,0 +1,963 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-01 17:14+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/type.rst:6 +msgid "Type Objects" +msgstr "类型对象" + +#: ../../c-api/type.rst:13 +msgid "The C structure of the objects used to describe built-in types." +msgstr "用于描述内置类型的对象的 C 结构。" + +#: ../../c-api/type.rst:18 +msgid "" +"This is the type object for type objects; it is the same object as " +":class:`type` in the Python layer." +msgstr "这是类型对象的类型对象;它与 Python 层面的 :class:`type` 是相同的对象。" + +#: ../../c-api/type.rst:24 +msgid "" +"Return non-zero if the object *o* is a type object, including instances of " +"types derived from the standard type object. Return 0 in all other cases. " +"This function always succeeds." +msgstr "如果对象 *o* 是一个类型对象,包括派生自标准类型对象的类型实例则返回非零值。在所有其它情况下都返回 0。此函数将总是成功执行。" + +#: ../../c-api/type.rst:31 +msgid "" +"Return non-zero if the object *o* is a type object, but not a subtype of the" +" standard type object. Return 0 in all other cases. This function always " +"succeeds." +msgstr "如果对象 *o* 是一个类型对象,但不是标准类型对象的子类型则返回非零值。在所有其它情况下都返回 0。此函数将总是成功执行。" + +#: ../../c-api/type.rst:38 +msgid "Clear the internal lookup cache. Return the current version tag." +msgstr "清空内部查找缓存。返回当前版本标签。" + +#: ../../c-api/type.rst:42 +msgid "" +"Return the :c:member:`~PyTypeObject.tp_flags` member of *type*. This " +"function is primarily meant for use with ``Py_LIMITED_API``; the individual " +"flag bits are guaranteed to be stable across Python releases, but access to " +":c:member:`~PyTypeObject.tp_flags` itself is not part of the :ref:`limited " +"API `." +msgstr "" +"返回 *type* 的 :c:member:`~PyTypeObject.tp_flags` 成员。此函数主要是配合 " +"``Py_LIMITED_API`` 使用;单独的旗标位会确保在各个 Python 发布版之间保持稳定,但对 " +":c:member:`~PyTypeObject.tp_flags` 本身的访问并不是 :ref:`受限 API ` " +"的一部分。" + +#: ../../c-api/type.rst:49 +msgid "The return type is now ``unsigned long`` rather than ``long``." +msgstr "返回类型现在是 ``unsigned long`` 而不是 ``long``。" + +#: ../../c-api/type.rst:55 +msgid "" +"Return the type object's internal namespace, which is otherwise only exposed" +" via a read-only proxy (:attr:`cls.__dict__ `). This is a " +"replacement for accessing :c:member:`~PyTypeObject.tp_dict` directly. The " +"returned dictionary must be treated as read-only." +msgstr "" +"返回类型对象的内部命名空间,它在其他情况下只能通过只读代理 (:attr:`cls.__dict__ `) 对外公开。 " +"这可以代替直接访问 :c:member:`~PyTypeObject.tp_dict`。返回的字典必须视为是只读的。" + +#: ../../c-api/type.rst:61 +msgid "" +"This function is meant for specific embedding and language-binding cases, " +"where direct access to the dict is necessary and indirect access (e.g. via " +"the proxy or :c:func:`PyObject_GetAttr`) isn't adequate." +msgstr "" +"该函数用于特定的嵌入和语言绑定场景,在这些场景下需要直接访问该字典而间接访问(例如通过代理或 :c:func:`PyObject_GetAttr` " +"访问)并不足够。" + +#: ../../c-api/type.rst:65 +msgid "" +"Extension modules should continue to use ``tp_dict``, directly or " +"indirectly, when setting up their own types." +msgstr "扩展模块在设置它们自己的类型时应当继续直接或间接地使用 ``tp_dict``。" + +#: ../../c-api/type.rst:73 +msgid "" +"Invalidate the internal lookup cache for the type and all of its subtypes. " +"This function must be called after any manual modification of the attributes" +" or base classes of the type." +msgstr "使该类型及其所有子类型的内部查找缓存失效。此函数必须在对该类型的属性或基类进行任何手动修改之后调用。" + +#: ../../c-api/type.rst:80 +msgid "" +"Register *callback* as a type watcher. Return a non-negative integer ID " +"which must be passed to future calls to :c:func:`PyType_Watch`. In case of " +"error (e.g. no more watcher IDs available), return ``-1`` and set an " +"exception." +msgstr "" +"注册 *callback* 作为类型监视器。返回一个非负的整数 ID,它必须传给将来对 :c:func:`PyType_Watch` " +"的调用。如果出错(例如没有足够的可用监视器 ID),则返回 ``-1`` 并设置一个异常。" + +#: ../../c-api/type.rst:85 +msgid "" +"In free-threaded builds, :c:func:`PyType_AddWatcher` is not thread-safe, so " +"it must be called at start up (before spawning the first thread)." +msgstr "" +"在自由线程构建版中,:c:func:`PyType_AddWatcher` 不是线程安全的,因此它必须在启动时调用(在产生第一个线程之前)。" + +#: ../../c-api/type.rst:93 +msgid "" +"Clear watcher identified by *watcher_id* (previously returned from " +":c:func:`PyType_AddWatcher`). Return ``0`` on success, ``-1`` on error (e.g." +" if *watcher_id* was never registered.)" +msgstr "" +"清除由 *watcher_id* (之前从 :c:func:`PyType_AddWatcher` 返回) 所标识的 watcher。成功时返回 " +"``0``,出错时(例如 *watcher_id* 未被注册)返回 ``-1``。" + +#: ../../c-api/type.rst:97 +msgid "" +"An extension should never call ``PyType_ClearWatcher`` with a *watcher_id* " +"that was not returned to it by a previous call to " +":c:func:`PyType_AddWatcher`." +msgstr "" +"扩展在调用 ``PyType_ClearWatcher`` 时绝不能使用不是之前调用 :c:func:`PyType_AddWatcher` 所返回的 " +"*watcher_id*." + +#: ../../c-api/type.rst:106 +msgid "" +"Mark *type* as watched. The callback granted *watcher_id* by " +":c:func:`PyType_AddWatcher` will be called whenever " +":c:func:`PyType_Modified` reports a change to *type*. (The callback may be " +"called only once for a series of consecutive modifications to *type*, if " +":c:func:`!_PyType_Lookup` is not called on *type* between the modifications;" +" this is an implementation detail and subject to change.)" +msgstr "" +"将 *type* 标记为已监视。每当 :c:func:`PyType_Modified` 报告 *type* 发生变化时,由 " +":c:func:`PyType_AddWatcher` 授予 *watcher_id* 的回调将被调用。 (如果在 *type* " +"的一系列连续修改之间没有调用 :c:func:`!_PyType_Lookup`,则回调可能只被调用一次;这是一个实现细节并可能发生变化)。" + +#: ../../c-api/type.rst:113 +msgid "" +"An extension should never call ``PyType_Watch`` with a *watcher_id* that was" +" not returned to it by a previous call to :c:func:`PyType_AddWatcher`." +msgstr "" +"扩展在调用 ``PyType_Watch`` 时绝不能使用不是之前调用 :c:func:`PyType_AddWatcher` 所返回的 " +"*watcher_id*." + +#: ../../c-api/type.rst:121 +msgid "" +"Mark *type* as not watched. This undoes a previous call to " +":c:func:`PyType_Watch`. *type* must not be ``NULL``." +msgstr "" +"将 *type* 标记为未被监视。这将撤销之前对 :c:func:`PyType_Watch` 调用的效果。*type* 必须不为 ``NULL``." + +#: ../../c-api/type.rst:124 +msgid "" +"An extension should never call this function with a *watcher_id* that was " +"not returned to it by a previous call to :c:func:`PyType_AddWatcher`." +msgstr "" +"扩展在调用此函数时传入的 *watcher_id* 绝不能不是之前调用 :c:func:`PyType_AddWatcher` 所返回的值。" + +#: ../../c-api/type.rst:127 +msgid "" +"On success, this function returns ``0``. On failure, this function returns " +"``-1`` with an exception set." +msgstr "成功时,此函数将返回 ``0``。失败时,此函数将返回 ``-1`` 并设置一个异常。" + +#: ../../c-api/type.rst:135 +msgid "Type of a type-watcher callback function." +msgstr "类型监视器回调函数的类型。" + +#: ../../c-api/type.rst:137 +msgid "" +"The callback must not modify *type* or cause :c:func:`PyType_Modified` to be" +" called on *type* or any type in its MRO; violating this rule could cause " +"infinite recursion." +msgstr "" +"回调不可以修改 *type* 或是导致 :c:func:`PyType_Modified` 在 *type* 或其 MRO " +"中的任何类型上被调用;违反此规则可能导致无限递归。" + +#: ../../c-api/type.rst:146 +msgid "" +"Return non-zero if the type object *o* sets the feature *feature*. Type " +"features are denoted by single bit flags." +msgstr "如果类型对象 *o* 设置了特性 *feature* 则返回非零值。类型特性是用单个比特位旗标来表示的。" + +#: ../../c-api/type.rst:152 +msgid "" +"Return non-zero if the type object *type* sets the subclass flag *flag*. " +"Subclass flags are denoted by :c:macro:`Py_TPFLAGS_*_SUBCLASS " +"`. This function is used by many ``_Check`` " +"functions for common types." +msgstr "" +"如果类型对象 *type* 设置了子类旗标 *flag* 则返回非零值。子类旗标是由 :c:macro:`Py_TPFLAGS_*_SUBCLASS " +"` 表示的。此函数将被许多针对常见类型的 ``_Check`` 函数所使用。" + +#: ../../c-api/type.rst:158 +msgid "" +":c:func:`PyObject_TypeCheck`, which is used as a slower alternative in " +"``_Check`` functions for types that don't come with subclass flags." +msgstr "" +":c:func:`PyObject_TypeCheck`,该函数被用作针对不带子类旗标的类型的 ``_Check`` 函数的较慢速的替代物。" + +#: ../../c-api/type.rst:164 +msgid "" +"Return true if the type object includes support for the cycle detector; this" +" tests the type flag :c:macro:`Py_TPFLAGS_HAVE_GC`." +msgstr "如果类型对象包括了对循环检测器的支持则返回真值;这将测试类型旗标 :c:macro:`Py_TPFLAGS_HAVE_GC`。" + +#: ../../c-api/type.rst:170 +msgid "Return true if *a* is a subtype of *b*." +msgstr "如果 *a* 是 *b* 的子类型则返回真值。" + +#: ../../c-api/type.rst:172 +msgid "" +"This function only checks for actual subtypes, which means that " +":meth:`~type.__subclasscheck__` is not called on *b*. Call " +":c:func:`PyObject_IsSubclass` to do the same check that :func:`issubclass` " +"would do." +msgstr "" +"此函数只检查实际的子类型,这意味着 :meth:`~type.__subclasscheck__` 不会在 *b* 上被调用。请调用 " +":c:func:`PyObject_IsSubclass` 来执行与 :func:`issubclass` 所做的相同检查。" + +#: ../../c-api/type.rst:180 +msgid "" +"Generic handler for the :c:member:`~PyTypeObject.tp_alloc` slot of a type " +"object. Uses Python's default memory allocation mechanism to allocate " +"memory for a new instance, zeros the memory, then initializes the memory as " +"if by calling :c:func:`PyObject_Init` or :c:func:`PyObject_InitVar`." +msgstr "" +"类型对象的 :c:member:`~PyTypeObject.tp_alloc` 槽位的通用处理器。使用 Python " +"的默认内存分配机制为新建的实例分配内存,向内存写入零值,然后初始化内存就如同调用了 :c:func:`PyObject_Init` 或 " +":c:func:`PyObject_InitVar` 一样。" + +#: ../../c-api/type.rst:185 +msgid "" +"Do not call this directly to allocate memory for an object; call the type's " +":c:member:`~PyTypeObject.tp_alloc` slot instead." +msgstr "请不要直接调用此函数为对象分配内存;而应调用类型的 :c:member:`~PyTypeObject.tp_alloc` 槽位。" + +#: ../../c-api/type.rst:188 +msgid "" +"For types that support garbage collection (i.e., the " +":c:macro:`Py_TPFLAGS_HAVE_GC` flag is set), this function behaves like " +":c:macro:`PyObject_GC_New` or :c:macro:`PyObject_GC_NewVar` (except the " +"memory is guaranteed to be zeroed before initialization), and should be " +"paired with :c:func:`PyObject_GC_Del` in :c:member:`~PyTypeObject.tp_free`. " +"Otherwise, it behaves like :c:macro:`PyObject_New` or " +":c:macro:`PyObject_NewVar` (except the memory is guaranteed to be zeroed " +"before initialization) and should be paired with :c:func:`PyObject_Free` in " +":c:member:`~PyTypeObject.tp_free`." +msgstr "" +"对于支持垃圾回收的类型(即设置了 :c:macro:`Py_TPFLAGS_HAVE_GC` 旗标),此函数的行为类似于 " +":c:macro:`PyObject_GC_New` 或 :c:macro:`PyObject_GC_NewVar` " +"(不同之处在于内存在初始化之前会确保被写入零值),并且应当与 :c:member:`~PyTypeObject.tp_free` 中的 " +":c:func:`PyObject_GC_Del` 相对应。在其他情况下,其行为像是 :c:macro:`PyObject_New` 或 " +":c:macro:`PyObject_NewVar` (不同之处在于内存在初始化之前会确保被写入零值) 并且应当与 " +":c:member:`~PyTypeObject.tp_free` 中的 :c:func:`PyObject_Free` 相对应。" + +#: ../../c-api/type.rst:201 +msgid "" +"Generic handler for the :c:member:`~PyTypeObject.tp_new` slot of a type " +"object. Creates a new instance using the type's " +":c:member:`~PyTypeObject.tp_alloc` slot and returns the resulting object." +msgstr "" +"类型对象的 :c:member:`~PyTypeObject.tp_new` 槽位的通用处理器。使用类型的 " +":c:member:`~PyTypeObject.tp_alloc` 槽位创建一个新的实例并返回结果对象。" + +#: ../../c-api/type.rst:208 +msgid "" +"Finalize a type object. This should be called on all type objects to finish" +" their initialization. This function is responsible for adding inherited " +"slots from a type's base class. Return ``0`` on success, or return ``-1`` " +"and sets an exception on error." +msgstr "" +"最终化一个类型对象。这应当在所有类型对象上调用以完成它们的初始化。此函数会负责从一个类型的基类添加被继承的槽位。成功时返回 ``0``,或是在出错时返回" +" ``-1`` 并设置一个异常。" + +#: ../../c-api/type.rst:214 +msgid "" +"If some of the base classes implements the GC protocol and the provided type" +" does not include the :c:macro:`Py_TPFLAGS_HAVE_GC` in its flags, then the " +"GC protocol will be automatically implemented from its parents. On the " +"contrary, if the type being created does include " +":c:macro:`Py_TPFLAGS_HAVE_GC` in its flags then it **must** implement the GC" +" protocol itself by at least implementing the " +":c:member:`~PyTypeObject.tp_traverse` handle." +msgstr "" +"如果某些基类实现了 GC 协议并且所提供的类型的旗标中未包括 :c:macro:`Py_TPFLAGS_HAVE_GC`,则将自动从其父类实现 GC " +"协议。相反地,如果被创建的类型的旗标中确实包含 :c:macro:`Py_TPFLAGS_HAVE_GC` 则它 **必须** 自己实现 GC " +"协议,至少要实现 :c:member:`~PyTypeObject.tp_traverse` 句柄。" + +#: ../../c-api/type.rst:225 +msgid "" +"Return the type's name. Equivalent to getting the type's " +":attr:`~type.__name__` attribute." +msgstr "返回类型名称。等同于获取类型的 :attr:`~type.__name__` 属性。" + +#: ../../c-api/type.rst:233 +msgid "" +"Return the type's qualified name. Equivalent to getting the type's " +":attr:`~type.__qualname__` attribute." +msgstr "返回类型的限定名称。等同于获取类型的 :attr:`~type.__qualname__` 属性。" + +#: ../../c-api/type.rst:240 +msgid "" +"Return the type's fully qualified name. Equivalent to " +"``f\"{type.__module__}.{type.__qualname__}\"``, or :attr:`type.__qualname__`" +" if :attr:`type.__module__` is not a string or is equal to ``\"builtins\"``." +msgstr "" +"返回类型的完整限定名称。等同于 ``f\"{type.__module__}.{type.__qualname__}\"``,或者如果 " +":attr:`type.__module__` 不是字符串或是等于 ``\"builtins\"`` 则等同于 " +":attr:`type.__qualname__`." + +#: ../../c-api/type.rst:249 +msgid "" +"Return the type's module name. Equivalent to getting the " +":attr:`type.__module__` attribute." +msgstr "返回类型的模块名称。等价于获取 :attr:`type.__module__` 属性。" + +#: ../../c-api/type.rst:257 +msgid "" +"Return the function pointer stored in the given slot. If the result is " +"``NULL``, this indicates that either the slot is ``NULL``, or that the " +"function was called with invalid parameters. Callers will typically cast the" +" result pointer into the appropriate function type." +msgstr "" +"返回存储在给定槽位中的函数指针。如果结果为 ``NULL``,则表示或者该槽位为 ``NULL``,或者该函数调用传入了无效的形参。 " +"调用方通常要将结果指针转换到适当的函数类型。" + +#: ../../c-api/type.rst:263 +msgid "" +"See :c:member:`PyType_Slot.slot` for possible values of the *slot* argument." +msgstr "请参阅 :c:member:`PyType_Slot.slot` 查看可用的 *slot* 参数值。" + +#: ../../c-api/type.rst:267 +msgid "" +":c:func:`PyType_GetSlot` can now accept all types. Previously, it was " +"limited to :ref:`heap types `." +msgstr "" +":c:func:`PyType_GetSlot` 现在可以接受所有类型。在此之前,它被限制为 :ref:`堆类型 `。" + +#: ../../c-api/type.rst:274 +msgid "" +"Return the module object associated with the given type when the type was " +"created using :c:func:`PyType_FromModuleAndSpec`." +msgstr "返回当使用 :c:func:`PyType_FromModuleAndSpec` 创建类型时关联到给定类型的模块对象。" + +#: ../../c-api/type.rst:277 ../../c-api/type.rst:324 +msgid "" +"The returned reference is :term:`borrowed ` from *type*," +" and will be valid as long as you hold a reference to *type*. Do not release" +" it with :c:func:`Py_DECREF` or similar." +msgstr "" +"返回的引用是从 *type* :term:`借入的 `,并且只要你还持有对 *type* 的引用就会保持有效。 " +"请不要通过 :c:func:`Py_DECREF` 或类似函数来释放它。" + +#: ../../c-api/type.rst:281 ../../c-api/type.rst:302 +msgid "" +"If no module is associated with the given type, sets :py:class:`TypeError` " +"and returns ``NULL``." +msgstr "如果没有关联到给定类型的模块,则设置 :py:class:`TypeError` 并返回 ``NULL``。" + +#: ../../c-api/type.rst:284 +msgid "" +"This function is usually used to get the module in which a method is " +"defined. Note that in such a method, ``PyType_GetModule(Py_TYPE(self))`` may" +" not return the intended result. ``Py_TYPE(self)`` may be a *subclass* of " +"the intended class, and subclasses are not necessarily defined in the same " +"module as their superclass. See :c:type:`PyCMethod` to get the class that " +"defines the method. See :c:func:`PyType_GetModuleByDef` for cases when " +":c:type:`!PyCMethod` cannot be used." +msgstr "" +"此函数通常被用于获取方法定义所在的模块。请注意在这样的方法中,``PyType_GetModule(Py_TYPE(self))`` " +"可能不会返回预期的结果。``Py_TYPE(self)`` 可以是目标类的一个 *子类*,而子类并不一定是在与其超类相同的模块中定义的。请参阅 " +":c:type:`PyCMethod` 了解如何获取方法定义所在的类。请参阅 :c:func:`PyType_GetModuleByDef` " +"了解有关无法使用 :c:type:`!PyCMethod` 的情况。" + +#: ../../c-api/type.rst:298 +msgid "" +"Return the state of the module object associated with the given type. This " +"is a shortcut for calling :c:func:`PyModule_GetState()` on the result of " +":c:func:`PyType_GetModule`." +msgstr "" +"返回关联到给定类型的模块对象的状态。这是一个在 :c:func:`PyType_GetModule` 的结果上调用 " +":c:func:`PyModule_GetState()` 的快捷方式。" + +#: ../../c-api/type.rst:305 +msgid "" +"If the *type* has an associated module but its state is ``NULL``, returns " +"``NULL`` without setting an exception." +msgstr "如果 *type* 有关联的模块但其状态为 ``NULL``,则返回 ``NULL`` 且不设置异常。" + +#: ../../c-api/type.rst:313 +msgid "" +"Find the first superclass whose module was created from the given " +":c:type:`PyModuleDef` *def*, and return that module." +msgstr "找到所属模块基于给定的 :c:type:`PyModuleDef` *def* 创建的第一个上级类,并返回该模块。" + +#: ../../c-api/type.rst:316 +msgid "" +"If no module is found, raises a :py:class:`TypeError` and returns ``NULL``." +msgstr "如果未找到模块,则会引发 :py:class:`TypeError` 并返回 ``NULL``。" + +#: ../../c-api/type.rst:318 +msgid "" +"This function is intended to be used together with " +":c:func:`PyModule_GetState()` to get module state from slot methods (such as" +" :c:member:`~PyTypeObject.tp_init` or :c:member:`~PyNumberMethods.nb_add`) " +"and other places where a method's defining class cannot be passed using the " +":c:type:`PyCMethod` calling convention." +msgstr "" +"此函数预期会与 :c:func:`PyModule_GetState()` 一起使用以便从槽位方法 (如 " +":c:member:`~PyTypeObject.tp_init` 或 :c:member:`~PyNumberMethods.nb_add`) " +"及其他定义方法的类无法使用 :c:type:`PyCMethod` 调用惯例来传递的场合获取模块状态。" + +#: ../../c-api/type.rst:333 +msgid "" +"Find the first superclass in *type*'s :term:`method resolution order` whose " +":c:macro:`Py_tp_token` token is equal to the given one." +msgstr "" +"在 *type* 的 :term:`method resolution order` 中找到 :c:macro:`Py_tp_token` " +"凭据等于给定凭据的第一个超类。" + +#: ../../c-api/type.rst:336 +msgid "" +"If found, set *\\*result* to a new :term:`strong reference` to it and return" +" ``1``." +msgstr "如果找到,则将 *\\*result* 设为一个新的指向该值的 :term:`strong reference` 并返回 ``1``。" + +#: ../../c-api/type.rst:338 +msgid "If not found, set *\\*result* to ``NULL`` and return ``0``." +msgstr "如果未找到,则将 *\\*result* 设为 ``NULL`` 并返回 ``0``。" + +#: ../../c-api/type.rst:339 +msgid "" +"On error, set *\\*result* to ``NULL`` and return ``-1`` with an exception " +"set." +msgstr "当失败时,则将 *\\*result* 设为 ``NULL`` 并返回 ``-1`` 同时设置一个异常。" + +#: ../../c-api/type.rst:342 +msgid "" +"The *result* argument may be ``NULL``, in which case *\\*result* is not set." +" Use this if you need only the return value." +msgstr "*result* 参数可能为 ``NULL``,在此情况下将不设置 *\\*result*。如果你只需要返回值则可以这样做。" + +#: ../../c-api/type.rst:345 +msgid "The *token* argument may not be ``NULL``." +msgstr "*token* 参数不可为 ``NULL``。" + +#: ../../c-api/type.rst:352 +msgid "Attempt to assign a version tag to the given type." +msgstr "尝试为给定的类型设置一个版本标签。" + +#: ../../c-api/type.rst:354 +msgid "" +"Returns 1 if the type already had a valid version tag or a new one was " +"assigned, or 0 if a new tag could not be assigned." +msgstr "如果类型已有合法的版本标签或已设置了新的版本标签则返回 1,或者如果无法设置新的标签则返回 0。" + +#: ../../c-api/type.rst:362 +msgid "" +"Return true if instances of *type* support creating weak references, false " +"otherwise. This function always succeeds. *type* must not be ``NULL``." +msgstr "如果 *type* 的实例支持创建弱引用则返回真值,否则返回假值。此函数总是会成功执行。*type* 必须不为 ``NULL``。" + +#: ../../c-api/type.rst:366 +msgid ":ref:`weakrefobjects`" +msgstr ":ref:`weakrefobjects`" + +#: ../../c-api/type.rst:367 +msgid ":py:mod:`weakref`" +msgstr ":py:mod:`weakref`" + +#: ../../c-api/type.rst:371 +msgid "Creating Heap-Allocated Types" +msgstr "创建堆分配类型" + +#: ../../c-api/type.rst:373 +msgid "" +"The following functions and structs are used to create :ref:`heap types " +"`." +msgstr "下列函数和结构体可被用来创建 :ref:`堆类型 `。" + +#: ../../c-api/type.rst:378 +msgid "" +"Create and return a :ref:`heap type ` from the *spec* (see " +":c:macro:`Py_TPFLAGS_HEAPTYPE`)." +msgstr "" +"根据 *spec* (参见 :c:macro:`Py_TPFLAGS_HEAPTYPE`) 创建并返回一个 :ref:`堆类型 `." + +#: ../../c-api/type.rst:381 +msgid "" +"The metaclass *metaclass* is used to construct the resulting type object. " +"When *metaclass* is ``NULL``, the metaclass is derived from *bases* (or " +"*Py_tp_base[s]* slots if *bases* is ``NULL``, see below)." +msgstr "" +"元类 *metaclass* 用于构建结果类型对象。当 *metaclass* 为 ``NULL`` 时,元类将派生自 *bases* (或者如果 " +"*bases* 为 ``NULL`` 则派生自 *Py_tp_base[s]* 槽位,见下文)。" + +#: ../../c-api/type.rst:385 +msgid "" +"Metaclasses that override :c:member:`~PyTypeObject.tp_new` are not " +"supported, except if ``tp_new`` is ``NULL``." +msgstr "不支持重写 :c:member:`~PyTypeObject.tp_new` 的元类,除非 ``tp_new`` 为 ``NULL``。" + +#: ../../c-api/type.rst:388 +msgid "" +"The *bases* argument can be used to specify base classes; it can either be " +"only one class or a tuple of classes. If *bases* is ``NULL``, the " +":c:data:`Py_tp_bases` slot is used instead. If that also is ``NULL``, the " +":c:data:`Py_tp_base` slot is used instead. If that also is ``NULL``, the new" +" type derives from :class:`object`." +msgstr "" +"*bases* 参数可被用来指定基类;它可以是只有单个类或是由多个类组成的元组。如果 *bases* 为 ``NULL``,则会改用 " +":c:data:`Py_tp_bases` 槽位。如果该槽位也为 ``NULL``,则会改用 :c:data:`Py_tp_base` 槽位。 " +"如果该槽位同样为 ``NULL``,则新类型将派生自 :class:`object`。" + +#: ../../c-api/type.rst:394 +msgid "" +"The *module* argument can be used to record the module in which the new " +"class is defined. It must be a module object or ``NULL``. If not ``NULL``, " +"the module is associated with the new type and can later be retrieved with " +":c:func:`PyType_GetModule`. The associated module is not inherited by " +"subclasses; it must be specified for each class individually." +msgstr "" +"*module* 参数可被用来记录新类定义所在的模块。它必须是一个模块对象或为 ``NULL``。如果不为 " +"``NULL``,则该模块会被关联到新类型并且可在之后通过 :c:func:`PyType_GetModule` 来获取。 " +"这个关联模块不可被子类继承;它必须为每个类单独指定。" + +#: ../../c-api/type.rst:401 +msgid "This function calls :c:func:`PyType_Ready` on the new type." +msgstr "此函数会在新类型上调用 :c:func:`PyType_Ready`。" + +#: ../../c-api/type.rst:403 +msgid "" +"Note that this function does *not* fully match the behavior of calling " +":py:class:`type() ` or using the :keyword:`class` statement. With " +"user-provided base types or metaclasses, prefer :ref:`calling ` " +":py:class:`type` (or the metaclass) over ``PyType_From*`` functions. " +"Specifically:" +msgstr "" +"请注意此函数并 *不* 完全匹配调用 :py:class:`type() ` 或使用 :keyword:`class` 语句的行为。 " +"对于用户提供的类型或元类,推荐 :ref:`调用 ` :py:class:`type` (或元类) 而不是 " +"``PyType_From*`` 函数。特别地:" + +#: ../../c-api/type.rst:410 +msgid "" +":py:meth:`~object.__new__` is not called on the new class (and it must be " +"set to ``type.__new__``)." +msgstr ":py:meth:`~object.__new__` 不会在新类上被调用 (它必须被设为 ``type.__new__``)。" + +#: ../../c-api/type.rst:412 +msgid ":py:meth:`~object.__init__` is not called on the new class." +msgstr ":py:meth:`~object.__init__` 不会在新类上被调用。" + +#: ../../c-api/type.rst:413 +msgid ":py:meth:`~object.__init_subclass__` is not called on any bases." +msgstr ":py:meth:`~object.__init_subclass__` 不会在任何基类上调用。" + +#: ../../c-api/type.rst:414 +msgid ":py:meth:`~object.__set_name__` is not called on new descriptors." +msgstr ":py:meth:`~object.__set_name__` 不会在新的描述器上调用。" + +#: ../../c-api/type.rst:421 +msgid "Equivalent to ``PyType_FromMetaclass(NULL, module, spec, bases)``." +msgstr "等价于 ``PyType_FromMetaclass(NULL, module, spec, bases)``。" + +#: ../../c-api/type.rst:427 +msgid "" +"The function now accepts a single class as the *bases* argument and ``NULL``" +" as the ``tp_doc`` slot." +msgstr "此函数现在接受一个单独类作为 *bases* 参数并接受 ``NULL`` 作为 ``tp_doc`` 槽位。" + +#: ../../c-api/type.rst:432 ../../c-api/type.rst:454 +msgid "" +"The function now finds and uses a metaclass corresponding to the provided " +"base classes. Previously, only :class:`type` instances were returned." +msgstr "该函数现在可以找到并使用与所提供的基类相对应的元类。在此之前,只会返回 :class:`type` 实例。" + +#: ../../c-api/type.rst:435 ../../c-api/type.rst:457 ../../c-api/type.rst:478 +msgid "" +"The :c:member:`~PyTypeObject.tp_new` of the metaclass is *ignored*. which " +"may result in incomplete initialization. Creating classes whose metaclass " +"overrides :c:member:`~PyTypeObject.tp_new` is deprecated." +msgstr "" +"元类的 :c:member:`~PyTypeObject.tp_new` 将被 *忽略*,这可能导致不完整的初始化。创建其元类重写 " +":c:member:`~PyTypeObject.tp_new` 的类的做法已被弃用。" + +#: ../../c-api/type.rst:442 ../../c-api/type.rst:464 ../../c-api/type.rst:485 +msgid "" +"Creating classes whose metaclass overrides :c:member:`~PyTypeObject.tp_new` " +"is no longer allowed." +msgstr "不再允许创建元类重写 :c:member:`~PyTypeObject.tp_new` 的类。" + +#: ../../c-api/type.rst:448 +msgid "Equivalent to ``PyType_FromMetaclass(NULL, NULL, spec, bases)``." +msgstr "等价于 ``PyType_FromMetaclass(NULL, NULL, spec, bases)``。" + +#: ../../c-api/type.rst:470 +msgid "Equivalent to ``PyType_FromMetaclass(NULL, NULL, spec, NULL)``." +msgstr "等价于 ``PyType_FromMetaclass(NULL, NULL, spec, NULL)``。" + +#: ../../c-api/type.rst:474 +msgid "" +"The function now finds and uses a metaclass corresponding to the base " +"classes provided in *Py_tp_base[s]* slots. Previously, only :class:`type` " +"instances were returned." +msgstr "" +"该函数现在可以找到并使用与 *Py_tp_base[s]* 槽位中提供的基类相对应的元类。在此之前,只会返回 :class:`type` 实例。" + +#: ../../c-api/type.rst:491 +msgid "" +"Make a type immutable: set the :c:macro:`Py_TPFLAGS_IMMUTABLETYPE` flag." +msgstr "使类型不可变:设置 :c:macro:`Py_TPFLAGS_IMMUTABLETYPE` 标志。" + +#: ../../c-api/type.rst:493 +msgid "All base classes of *type* must be immutable." +msgstr "*type* 的所有基类必须是不可变的。" + +#: ../../c-api/type.rst:495 +msgid "" +"On success, return ``0``. On error, set an exception and return ``-1``." +msgstr "如果成功,返回 ``0``。如果发生错误,设置异常并返回 ``-1``。" + +#: ../../c-api/type.rst:498 +msgid "" +"The type must not be used before it's made immutable. For example, type " +"instances must not be created before the type is made immutable." +msgstr "在使类型不可变之前,不能使用它。例如,在类型变为不可变之前,不能创建类型实例。" + +#: ../../c-api/type.rst:514 +msgid "Structure defining a type's behavior." +msgstr "定义一个类型的行为的结构体。" + +#: ../../c-api/type.rst:518 +msgid "Name of the type, used to set :c:member:`PyTypeObject.tp_name`." +msgstr "类型的名称,用来设置 :c:member:`PyTypeObject.tp_name`。" + +#: ../../c-api/type.rst:522 +msgid "" +"If positive, specifies the size of the instance in bytes. It is used to set " +":c:member:`PyTypeObject.tp_basicsize`." +msgstr "如果为正数,则以字节为单位指定实例的大小。它用于设置 :c:member:`PyTypeObject.tp_basicsize`。" + +#: ../../c-api/type.rst:525 +msgid "" +"If zero, specifies that :c:member:`~PyTypeObject.tp_basicsize` should be " +"inherited." +msgstr "如果为零,则指定应当继承 :c:member:`~PyTypeObject.tp_basicsize`。" + +#: ../../c-api/type.rst:528 +msgid "" +"If negative, the absolute value specifies how much space instances of the " +"class need *in addition* to the superclass. Use " +":c:func:`PyObject_GetTypeData` to get a pointer to subclass-specific memory " +"reserved this way. For negative :c:member:`!basicsize`, Python will insert " +"padding when needed to meet :c:member:`~PyTypeObject.tp_basicsize`'s " +"alignment requirements." +msgstr "" +"如为负数,则以其绝对值指定该类的实例在超类的 *基础之上* 还需要多少空间。使用 :c:func:`PyObject_GetTypeData` " +"来获取指向通过此方式保留的子类专属内存的指针。对于负的 :c:member:`!basicsize`,Python 将在需要满足 " +":c:member:`~PyTypeObject.tp_basicsize` 的对齐要求时插入填充字节。" + +#: ../../c-api/type.rst:538 +msgid "Previously, this field could not be negative." +msgstr "在之前版本中,此字段不能为负数。" + +#: ../../c-api/type.rst:542 +msgid "" +"Size of one element of a variable-size type, in bytes. Used to set " +":c:member:`PyTypeObject.tp_itemsize`. See ``tp_itemsize`` documentation for " +"caveats." +msgstr "" +"可变大小类型中一个元素的大小,以字节为单位。用于设置 :c:member:`PyTypeObject.tp_itemsize`。注意事项请参阅 " +"``tp_itemsize`` 文档。" + +#: ../../c-api/type.rst:546 +msgid "" +"If zero, :c:member:`~PyTypeObject.tp_itemsize` is inherited. Extending " +"arbitrary variable-sized classes is dangerous, since some types use a fixed " +"offset for variable-sized memory, which can then overlap fixed-sized memory " +"used by a subclass. To help prevent mistakes, inheriting ``itemsize`` is " +"only possible in the following situations:" +msgstr "" +"如果为零,则会继承 :c:member:`~PyTypeObject.tp_itemsize`。 " +"扩展任意可变大小的类是很危险的,因为某些类型使用固定偏移量来标识可变大小的内存,这样就会与子类使用的固定大小的内存相重叠。 " +"为了防止出错,只有在以下情况下才可以继承 ``itemsize``:" + +#: ../../c-api/type.rst:553 +msgid "" +"The base is not variable-sized (its :c:member:`~PyTypeObject.tp_itemsize` is" +" zero)." +msgstr "" + +#: ../../c-api/type.rst:555 +msgid "" +"The requested :c:member:`PyType_Spec.basicsize` is positive, suggesting that" +" the memory layout of the base class is known." +msgstr "所请求的 :c:member:`PyType_Spec.basicsize` 为正值,表明基类的内存布局是已知的。" + +#: ../../c-api/type.rst:557 +msgid "" +"The requested :c:member:`PyType_Spec.basicsize` is zero, suggesting that the" +" subclass does not access the instance's memory directly." +msgstr "所请求的 :c:member:`PyType_Spec.basicsize` 为零,表明子类不会直接访问实例的内存。" + +#: ../../c-api/type.rst:560 +msgid "With the :c:macro:`Py_TPFLAGS_ITEMS_AT_END` flag." +msgstr "具有 :c:macro:`Py_TPFLAGS_ITEMS_AT_END` 旗标。" + +#: ../../c-api/type.rst:564 +msgid "Type flags, used to set :c:member:`PyTypeObject.tp_flags`." +msgstr "类型旗标,用来设置 :c:member:`PyTypeObject.tp_flags`。" + +#: ../../c-api/type.rst:566 +msgid "" +"If the ``Py_TPFLAGS_HEAPTYPE`` flag is not set, " +":c:func:`PyType_FromSpecWithBases` sets it automatically." +msgstr "" +"如果未设置 ``Py_TPFLAGS_HEAPTYPE`` 旗标,则 :c:func:`PyType_FromSpecWithBases` " +"会自动设置它。" + +#: ../../c-api/type.rst:571 +msgid "" +"Array of :c:type:`PyType_Slot` structures. Terminated by the special slot " +"value ``{0, NULL}``." +msgstr ":c:type:`PyType_Slot` 结构体的数组。以特殊槽位值 ``{0, NULL}`` 来结束。" + +#: ../../c-api/type.rst:574 +msgid "Each slot ID should be specified at most once." +msgstr "每个槽位 ID 应当只被指定一次。" + +#: ../../c-api/type.rst:584 +msgid "" +"Structure defining optional functionality of a type, containing a slot ID " +"and a value pointer." +msgstr "定义一个类型的可选功能的结构体,包含一个槽位 ID 和一个值指针。" + +#: ../../c-api/type.rst:589 +msgid "A slot ID." +msgstr "槽位 ID。" + +#: ../../c-api/type.rst:591 +msgid "" +"Slot IDs are named like the field names of the structures " +":c:type:`PyTypeObject`, :c:type:`PyNumberMethods`, " +":c:type:`PySequenceMethods`, :c:type:`PyMappingMethods` and " +":c:type:`PyAsyncMethods` with an added ``Py_`` prefix. For example, use:" +msgstr "" +"槽位 ID 的命名类似于结构体 :c:type:`PyTypeObject`, :c:type:`PyNumberMethods`, " +":c:type:`PySequenceMethods`, :c:type:`PyMappingMethods` 和 " +":c:type:`PyAsyncMethods` 的字段名附加一个 ``Py_`` 前缀。举例来说,使用:" + +#: ../../c-api/type.rst:597 +msgid ":c:data:`Py_tp_dealloc` to set :c:member:`PyTypeObject.tp_dealloc`" +msgstr ":c:data:`Py_tp_dealloc` 用于设置 :c:member:`PyTypeObject.tp_dealloc`" + +#: ../../c-api/type.rst:598 +msgid ":c:data:`Py_nb_add` to set :c:member:`PyNumberMethods.nb_add`" +msgstr ":c:data:`Py_nb_add` 用于设置 :c:member:`PyNumberMethods.nb_add`" + +#: ../../c-api/type.rst:599 +msgid ":c:data:`Py_sq_length` to set :c:member:`PySequenceMethods.sq_length`" +msgstr ":c:data:`Py_sq_length` 用于设置 :c:member:`PySequenceMethods.sq_length`" + +#: ../../c-api/type.rst:601 +msgid "" +"An additional slot is supported that does not correspond to a " +":c:type:`!PyTypeObject` struct field:" +msgstr "支持一个不对应于 :c:type:`!PyTypeObject` 结构字段的额外槽位:" + +#: ../../c-api/type.rst:604 +msgid ":c:data:`Py_tp_token`" +msgstr ":c:data:`Py_tp_token`" + +#: ../../c-api/type.rst:606 +msgid "" +"The following “offset” fields cannot be set using :c:type:`PyType_Slot`:" +msgstr "下列“offset”字段不可使用 :c:type:`PyType_Slot` 来设置:" + +#: ../../c-api/type.rst:608 +msgid "" +":c:member:`~PyTypeObject.tp_weaklistoffset` (use " +":c:macro:`Py_TPFLAGS_MANAGED_WEAKREF` instead if possible)" +msgstr "" +":c:member:`~PyTypeObject.tp_weaklistoffset` (如果可能请改用 " +":c:macro:`Py_TPFLAGS_MANAGED_WEAKREF`)" + +#: ../../c-api/type.rst:610 +msgid "" +":c:member:`~PyTypeObject.tp_dictoffset` (use " +":c:macro:`Py_TPFLAGS_MANAGED_DICT` instead if possible)" +msgstr "" +":c:member:`~PyTypeObject.tp_dictoffset` (如果可能请改用 " +":c:macro:`Py_TPFLAGS_MANAGED_DICT`)" + +#: ../../c-api/type.rst:612 +msgid "" +":c:member:`~PyTypeObject.tp_vectorcall_offset` (use " +"``\"__vectorcalloffset__\"`` in :ref:`PyMemberDef `)" +msgstr "" +":c:member:`~PyTypeObject.tp_vectorcall_offset` (请使用 :ref:`PyMemberDef " +"` 中的 ``\"__vectorcalloffset__\"``)" + +#: ../../c-api/type.rst:616 +msgid "" +"If it is not possible to switch to a ``MANAGED`` flag (for example, for " +"vectorcall or to support Python older than 3.12), specify the offset in " +":c:data:`Py_tp_members`. See :ref:`PyMemberDef documentation ` for details." +msgstr "" +"如果无法切换为 ``MANAGED`` 旗标(例如,对于 vectorcall 或是为了支持早于 3.12 版的 Python),请在 " +":c:data:`Py_tp_members` 中指定 offset。详情参见 :ref:`PyMemberDef 文档 `." + +#: ../../c-api/type.rst:622 +msgid "" +"The following internal fields cannot be set at all when creating a heap " +"type:" +msgstr "以下内部字段在创建堆类型时完全不可设置:" + +#: ../../c-api/type.rst:625 +msgid "" +":c:member:`~PyTypeObject.tp_dict`, :c:member:`~PyTypeObject.tp_mro`, " +":c:member:`~PyTypeObject.tp_cache`, :c:member:`~PyTypeObject.tp_subclasses`," +" and :c:member:`~PyTypeObject.tp_weaklist`." +msgstr "" +":c:member:`~PyTypeObject.tp_dict`, :c:member:`~PyTypeObject.tp_mro`, " +":c:member:`~PyTypeObject.tp_cache`, :c:member:`~PyTypeObject.tp_subclasses` " +"和 :c:member:`~PyTypeObject.tp_weaklist`。" + +#: ../../c-api/type.rst:631 +msgid "" +"Setting :c:data:`Py_tp_bases` or :c:data:`Py_tp_base` may be problematic on " +"some platforms. To avoid issues, use the *bases* argument of " +":c:func:`PyType_FromSpecWithBases` instead." +msgstr "" +"在某些平台上设置 :c:data:`Py_tp_bases` 或 :c:data:`Py_tp_base` 可能会有问题。为了避免问题,请改用 " +":c:func:`PyType_FromSpecWithBases` 的 *bases* 参数。" + +#: ../../c-api/type.rst:636 +msgid "Slots in :c:type:`PyBufferProcs` may be set in the unlimited API." +msgstr ":c:type:`PyBufferProcs` 中的槽位可能会在不受限 API 中被设置。" + +#: ../../c-api/type.rst:639 +msgid "" +":c:member:`~PyBufferProcs.bf_getbuffer` and " +":c:member:`~PyBufferProcs.bf_releasebuffer` are now available under the " +":ref:`limited API `." +msgstr "" +"现在 :c:member:`~PyBufferProcs.bf_getbuffer` 和 " +":c:member:`~PyBufferProcs.bf_releasebuffer` 将在 :ref:`受限 API `" +" 中可用。" + +#: ../../c-api/type.rst:644 +msgid "" +"The field :c:member:`~PyTypeObject.tp_vectorcall` can now be set using " +":c:data:`Py_tp_vectorcall`. See the field's documentation for details." +msgstr "" +"字段 :c:member:`~PyTypeObject.tp_vectorcall` 现在可以使用 :c:data:`Py_tp_vectorcall`" +" 来设置。详情参见该字段的文档。" + +#: ../../c-api/type.rst:651 +msgid "" +"The desired value of the slot. In most cases, this is a pointer to a " +"function." +msgstr "该槽位的预期值。在大多数情况下,这将是一个指向函数的指针。" + +#: ../../c-api/type.rst:654 +msgid "*pfunc* values may not be ``NULL``, except for the following slots:" +msgstr "*pfunc* 的值不能为 ``NULL``,除了以下槽位:" + +#: ../../c-api/type.rst:656 +msgid ":c:data:`Py_tp_doc`" +msgstr ":c:data:`Py_tp_doc`" + +#: ../../c-api/type.rst:657 +msgid "" +":c:data:`Py_tp_token` (for clarity, prefer :c:data:`Py_TP_USE_SPEC` rather " +"than ``NULL``)" +msgstr "" +":c:data:`Py_tp_token` (为了清晰起见,建议使用 :c:data:`Py_TP_USE_SPEC` 而不是 ``NULL``)" + +#: ../../c-api/type.rst:663 +msgid "" +"A :c:member:`~PyType_Slot.slot` that records a static memory layout ID for a" +" class." +msgstr "记录类的静态内存布局 ID 的 :c:member:`~PyType_Slot.slot`。" + +#: ../../c-api/type.rst:666 +msgid "" +"If the :c:type:`PyType_Spec` of the class is statically allocated, the token" +" can be set to the spec using the special value :c:data:`Py_TP_USE_SPEC`:" +msgstr "" +"如果类的 :c:type:`PyType_Spec` 是静态分配的,该记号可以使用特殊值 :c:data:`Py_TP_USE_SPEC` 设置 " +"spec:" + +#: ../../c-api/type.rst:670 +msgid "" +"static PyType_Slot foo_slots[] = {\n" +" {Py_tp_token, Py_TP_USE_SPEC}," +msgstr "" +"static PyType_Slot foo_slots[] = {\n" +" {Py_tp_token, Py_TP_USE_SPEC}," + +#: ../../c-api/type.rst:675 +msgid "It can also be set to an arbitrary pointer, but you must ensure that:" +msgstr "它也可以设置为任意指针,但必须确保:" + +#: ../../c-api/type.rst:677 +msgid "" +"The pointer outlives the class, so it's not reused for something else while " +"the class exists." +msgstr "指针的寿命比类长,所以当类存在时,指针不能用于其他用途。" + +#: ../../c-api/type.rst:679 +msgid "" +"It \"belongs\" to the extension module where the class lives, so it will not" +" clash with other extensions." +msgstr "它“属于”类所在的扩展模块,因此它不会与其他扩展冲突。" + +#: ../../c-api/type.rst:682 +msgid "" +"Use :c:func:`PyType_GetBaseByToken` to check if a class's superclass has a " +"given token -- that is, check whether the memory layout is compatible." +msgstr "" +"使用 :c:func:`PyType_GetBaseByToken` 来检查类的超类是否有给定的记号 —— 也就是说,检查内存布局是否兼容。" + +#: ../../c-api/type.rst:685 +msgid "" +"To get the token for a given class (without considering superclasses), use " +":c:func:`PyType_GetSlot` with ``Py_tp_token``." +msgstr "要获取给定类的记号(不考虑超类),使用 :c:func:`PyType_GetSlot` 和 ``Py_tp_token``。" + +#: ../../c-api/type.rst:694 +msgid "" +"Used as a value with :c:data:`Py_tp_token` to set the token to the class's " +":c:type:`PyType_Spec`. Expands to ``NULL``." +msgstr "" +"作为 :c:data:`Py_tp_token` 的值使用,将记号设置为类的 :c:type:`PyType_Spec`。展开为 ``NULL``。" + +#: ../../c-api/type.rst:8 +msgid "object" +msgstr "object -- 对象" + +#: ../../c-api/type.rst:8 +msgid "type" +msgstr "type" diff --git a/c-api/typehints.po b/c-api/typehints.po new file mode 100644 index 0000000000..5bc09819df --- /dev/null +++ b/c-api/typehints.po @@ -0,0 +1,84 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-06-03 19:20+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/typehints.rst:6 +msgid "Objects for Type Hinting" +msgstr "类型注解对象" + +#: ../../c-api/typehints.rst:8 +msgid "" +"Various built-in types for type hinting are provided. Currently, two types " +"exist -- :ref:`GenericAlias ` and :ref:`Union `. Only ``GenericAlias`` is exposed to C." +msgstr "" +"提供几种用于类型提示的内置类型。目前存在两种类型 -- :ref:`GenericAlias ` 和 " +":ref:`Union `。只有 ``GenericAlias`` 会向 C 开放。" + +#: ../../c-api/typehints.rst:14 +msgid "" +"Create a :ref:`GenericAlias ` object. Equivalent to " +"calling the Python class :class:`types.GenericAlias`. The *origin* and " +"*args* arguments set the ``GenericAlias``\\ 's ``__origin__`` and " +"``__args__`` attributes respectively. *origin* should be a " +":c:expr:`PyTypeObject*`, and *args* can be a :c:expr:`PyTupleObject*` or any" +" ``PyObject*``. If *args* passed is not a tuple, a 1-tuple is automatically" +" constructed and ``__args__`` is set to ``(args,)``. Minimal checking is " +"done for the arguments, so the function will succeed even if *origin* is not" +" a type. The ``GenericAlias``\\ 's ``__parameters__`` attribute is " +"constructed lazily from ``__args__``. On failure, an exception is raised " +"and ``NULL`` is returned." +msgstr "" +"创建一个 :ref:`GenericAlias ` 对象。相当于调用 Python 类 " +":class:`types.GenericAlias`。参数 *origin* 和 *args* 分别设置 ``GenericAlias`` 的 " +"``__origin__`` 和 ``__args__`` 属性。 *origin* 应该是一个 :c:expr:`PyTypeObject*`,而 " +"*args* 可以是一个 :c:expr:`PyTupleObject*` 或者任意 ``PyObject*``。如果传递的 *args* " +"不是一个元组,则会自动构造一个单元组并将 ``__args__`` 设置为 ``(args,)``。对参数进行了最小限度的检查,因此即使 " +"*origin* 不是类型,函数也会成功。``GenericAlias`` 的 ``__parameters__`` 属性是从 ``__args__``" +" 懒加载的。如果失败,则会引发一个异常并返回 ``NULL``。" + +#: ../../c-api/typehints.rst:28 +msgid "Here's an example of how to make an extension type generic::" +msgstr "下面是一个如何使扩展类型支持泛型的例子::" + +#: ../../c-api/typehints.rst:30 +msgid "" +"...\n" +"static PyMethodDef my_obj_methods[] = {\n" +" // Other methods.\n" +" ...\n" +" {\"__class_getitem__\", Py_GenericAlias, METH_O|METH_CLASS, \"my_obj is generic over its contained type\"}\n" +" ...\n" +"}" +msgstr "" + +#: ../../c-api/typehints.rst:38 +msgid "The data model method :meth:`~object.__class_getitem__`." +msgstr "数据模型方法 :meth:`~object.__class_getitem__`。" + +#: ../../c-api/typehints.rst:44 +msgid "" +"The C type of the object returned by :c:func:`Py_GenericAlias`. Equivalent " +"to :class:`types.GenericAlias` in Python." +msgstr "" +"由 :c:func:`Py_GenericAlias` 所返回的对象的 C 类型。等价于 Python 中的 " +":class:`types.GenericAlias`." diff --git a/c-api/typeobj.po b/c-api/typeobj.po new file mode 100644 index 0000000000..2b8e9ca4ab --- /dev/null +++ b/c-api/typeobj.po @@ -0,0 +1,5653 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-07 17:18+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/typeobj.rst:6 +msgid "Type Object Structures" +msgstr "类型对象结构体" + +#: ../../c-api/typeobj.rst:8 +msgid "" +"Perhaps one of the most important structures of the Python object system is " +"the structure that defines a new type: the :c:type:`PyTypeObject` structure." +" Type objects can be handled using any of the ``PyObject_*`` or " +"``PyType_*`` functions, but do not offer much that's interesting to most " +"Python applications. These objects are fundamental to how objects behave, so" +" they are very important to the interpreter itself and to any extension " +"module that implements new types." +msgstr "" +"Python 对象系统中最重要的一个结构体也许是定义新类型的结构体::c:type:`PyTypeObject` 结构体。类型对象可以使用任何 " +"``PyObject_*`` 或 ``PyType_*`` 函数来处理,但并未提供大多数 Python 应用程序会感兴趣的东西。 " +"这些对象是对象行为的基础,所以它们对解释器本身及任何实现新类型的扩展模块都非常重要。" + +#: ../../c-api/typeobj.rst:16 +msgid "" +"Type objects are fairly large compared to most of the standard types. The " +"reason for the size is that each type object stores a large number of " +"values, mostly C function pointers, each of which implements a small part of" +" the type's functionality. The fields of the type object are examined in " +"detail in this section. The fields will be described in the order in which " +"they occur in the structure." +msgstr "" +"与大多数标准类型相比,类型对象相当大。这么大的原因是每个类型对象存储了大量的值,大部分是 C " +"函数指针,每个指针实现了类型功能的一小部分。本节将详细描述类型对象的字段。这些字段将按照它们在结构中出现的顺序进行描述。" + +#: ../../c-api/typeobj.rst:23 +msgid "" +"In addition to the following quick reference, the :ref:`typedef-examples` " +"section provides at-a-glance insight into the meaning and use of " +":c:type:`PyTypeObject`." +msgstr "" +"除了下面的快速参考, :ref:`typedef-examples` 小节提供了快速了解 :c:type:`PyTypeObject` " +"的含义和用法的例子。" + +#: ../../c-api/typeobj.rst:29 +msgid "Quick Reference" +msgstr "快速参考" + +#: ../../c-api/typeobj.rst:34 +msgid "\"tp slots\"" +msgstr "\"tp 槽位\"" + +#: ../../c-api/typeobj.rst:40 +msgid "PyTypeObject Slot [#slots]_" +msgstr "PyTypeObject 槽位 [#slots]_" + +#: ../../c-api/typeobj.rst:40 ../../c-api/typeobj.rst:201 +msgid ":ref:`Type `" +msgstr ":ref:`类型 `" + +#: ../../c-api/typeobj.rst:40 +msgid "special methods/attrs" +msgstr "特殊方法/属性" + +#: ../../c-api/typeobj.rst:40 +msgid "Info [#cols]_" +msgstr "信息 [#cols]_" + +#: ../../c-api/typeobj.rst:42 +msgid "O" +msgstr "O" + +#: ../../c-api/typeobj.rst:42 +msgid "T" +msgstr "T" + +#: ../../c-api/typeobj.rst:42 +msgid "D" +msgstr "D" + +#: ../../c-api/typeobj.rst:42 +msgid "I" +msgstr "I" + +#: ../../c-api/typeobj.rst:44 +msgid " :c:member:`~PyTypeObject.tp_name`" +msgstr " :c:member:`~PyTypeObject.tp_name`" + +#: ../../c-api/typeobj.rst:0 ../../c-api/typeobj.rst:44 +#: ../../c-api/typeobj.rst:86 +msgid "const char *" +msgstr "const char *" + +#: ../../c-api/typeobj.rst:44 +msgid "__name__" +msgstr "__name__" + +#: ../../c-api/typeobj.rst:44 ../../c-api/typeobj.rst:46 +#: ../../c-api/typeobj.rst:48 ../../c-api/typeobj.rst:50 +#: ../../c-api/typeobj.rst:52 ../../c-api/typeobj.rst:62 +#: ../../c-api/typeobj.rst:70 ../../c-api/typeobj.rst:72 +#: ../../c-api/typeobj.rst:74 ../../c-api/typeobj.rst:76 +#: ../../c-api/typeobj.rst:79 ../../c-api/typeobj.rst:84 +#: ../../c-api/typeobj.rst:86 ../../c-api/typeobj.rst:88 +#: ../../c-api/typeobj.rst:90 ../../c-api/typeobj.rst:92 +#: ../../c-api/typeobj.rst:99 ../../c-api/typeobj.rst:101 +#: ../../c-api/typeobj.rst:103 ../../c-api/typeobj.rst:105 +#: ../../c-api/typeobj.rst:107 ../../c-api/typeobj.rst:109 +#: ../../c-api/typeobj.rst:111 ../../c-api/typeobj.rst:115 +#: ../../c-api/typeobj.rst:117 ../../c-api/typeobj.rst:120 +#: ../../c-api/typeobj.rst:122 ../../c-api/typeobj.rst:124 +#: ../../c-api/typeobj.rst:126 ../../c-api/typeobj.rst:128 +#: ../../c-api/typeobj.rst:130 ../../c-api/typeobj.rst:146 +msgid "X" +msgstr "X" + +#: ../../c-api/typeobj.rst:46 +msgid ":c:member:`~PyTypeObject.tp_basicsize`" +msgstr ":c:member:`~PyTypeObject.tp_basicsize`" + +#: ../../c-api/typeobj.rst:0 ../../c-api/typeobj.rst:46 +#: ../../c-api/typeobj.rst:48 ../../c-api/typeobj.rst:52 +#: ../../c-api/typeobj.rst:99 ../../c-api/typeobj.rst:120 +#: ../../c-api/typeobj.rst:417 +msgid ":c:type:`Py_ssize_t`" +msgstr ":c:type:`Py_ssize_t`" + +#: ../../c-api/typeobj.rst:48 +msgid ":c:member:`~PyTypeObject.tp_itemsize`" +msgstr ":c:member:`~PyTypeObject.tp_itemsize`" + +#: ../../c-api/typeobj.rst:50 +msgid ":c:member:`~PyTypeObject.tp_dealloc`" +msgstr ":c:member:`~PyTypeObject.tp_dealloc`" + +#: ../../c-api/typeobj.rst:50 ../../c-api/typeobj.rst:142 +#: ../../c-api/typeobj.rst:146 ../../c-api/typeobj.rst:347 +msgid ":c:type:`destructor`" +msgstr ":c:type:`destructor`" + +#: ../../c-api/typeobj.rst:52 +msgid ":c:member:`~PyTypeObject.tp_vectorcall_offset`" +msgstr ":c:member:`~PyTypeObject.tp_vectorcall_offset`" + +#: ../../c-api/typeobj.rst:54 +msgid "(:c:member:`~PyTypeObject.tp_getattr`)" +msgstr "(:c:member:`~PyTypeObject.tp_getattr`)" + +#: ../../c-api/typeobj.rst:54 ../../c-api/typeobj.rst:371 +msgid ":c:type:`getattrfunc`" +msgstr ":c:type:`getattrfunc`" + +#: ../../c-api/typeobj.rst:54 ../../c-api/typeobj.rst:76 +msgid "__getattribute__, __getattr__" +msgstr "__getattribute__, __getattr__" + +#: ../../c-api/typeobj.rst:54 ../../c-api/typeobj.rst:57 +#: ../../c-api/typeobj.rst:70 ../../c-api/typeobj.rst:76 +#: ../../c-api/typeobj.rst:79 ../../c-api/typeobj.rst:88 +#: ../../c-api/typeobj.rst:90 ../../c-api/typeobj.rst:92 +msgid "G" +msgstr "G" + +#: ../../c-api/typeobj.rst:57 +msgid "(:c:member:`~PyTypeObject.tp_setattr`)" +msgstr "(:c:member:`~PyTypeObject.tp_setattr`)" + +#: ../../c-api/typeobj.rst:57 ../../c-api/typeobj.rst:376 +msgid ":c:type:`setattrfunc`" +msgstr ":c:type:`setattrfunc`" + +#: ../../c-api/typeobj.rst:57 ../../c-api/typeobj.rst:79 +msgid "__setattr__, __delattr__" +msgstr "__setattr__, __delattr__" + +#: ../../c-api/typeobj.rst:60 +msgid ":c:member:`~PyTypeObject.tp_as_async`" +msgstr ":c:member:`~PyTypeObject.tp_as_async`" + +#: ../../c-api/typeobj.rst:60 +msgid ":c:type:`PyAsyncMethods` *" +msgstr ":c:type:`PyAsyncMethods` *" + +#: ../../c-api/typeobj.rst:60 ../../c-api/typeobj.rst:64 +#: ../../c-api/typeobj.rst:66 ../../c-api/typeobj.rst:68 +#: ../../c-api/typeobj.rst:82 +msgid ":ref:`sub-slots`" +msgstr ":ref:`sub-slots`" + +#: ../../c-api/typeobj.rst:60 ../../c-api/typeobj.rst:64 +#: ../../c-api/typeobj.rst:66 ../../c-api/typeobj.rst:68 +#: ../../c-api/typeobj.rst:82 +msgid "%" +msgstr "%" + +#: ../../c-api/typeobj.rst:62 +msgid ":c:member:`~PyTypeObject.tp_repr`" +msgstr ":c:member:`~PyTypeObject.tp_repr`" + +#: ../../c-api/typeobj.rst:62 ../../c-api/typeobj.rst:74 +#: ../../c-api/typeobj.rst:369 +msgid ":c:type:`reprfunc`" +msgstr ":c:type:`reprfunc`" + +#: ../../c-api/typeobj.rst:62 +msgid "__repr__" +msgstr "__repr__" + +#: ../../c-api/typeobj.rst:64 +msgid ":c:member:`~PyTypeObject.tp_as_number`" +msgstr ":c:member:`~PyTypeObject.tp_as_number`" + +#: ../../c-api/typeobj.rst:64 +msgid ":c:type:`PyNumberMethods` *" +msgstr ":c:type:`PyNumberMethods` *" + +#: ../../c-api/typeobj.rst:66 +msgid ":c:member:`~PyTypeObject.tp_as_sequence`" +msgstr ":c:member:`~PyTypeObject.tp_as_sequence`" + +#: ../../c-api/typeobj.rst:66 +msgid ":c:type:`PySequenceMethods` *" +msgstr ":c:type:`PySequenceMethods` *" + +#: ../../c-api/typeobj.rst:68 +msgid ":c:member:`~PyTypeObject.tp_as_mapping`" +msgstr ":c:member:`~PyTypeObject.tp_as_mapping`" + +#: ../../c-api/typeobj.rst:68 +msgid ":c:type:`PyMappingMethods` *" +msgstr ":c:type:`PyMappingMethods` *" + +#: ../../c-api/typeobj.rst:70 +msgid ":c:member:`~PyTypeObject.tp_hash`" +msgstr ":c:member:`~PyTypeObject.tp_hash`" + +#: ../../c-api/typeobj.rst:70 ../../c-api/typeobj.rst:405 +msgid ":c:type:`hashfunc`" +msgstr ":c:type:`hashfunc`" + +#: ../../c-api/typeobj.rst:70 +msgid "__hash__" +msgstr "__hash__" + +#: ../../c-api/typeobj.rst:72 +msgid ":c:member:`~PyTypeObject.tp_call`" +msgstr ":c:member:`~PyTypeObject.tp_call`" + +#: ../../c-api/typeobj.rst:72 ../../c-api/typeobj.rst:237 +#: ../../c-api/typeobj.rst:240 ../../c-api/typeobj.rst:441 +msgid ":c:type:`ternaryfunc`" +msgstr ":c:type:`ternaryfunc`" + +#: ../../c-api/typeobj.rst:72 +msgid "__call__" +msgstr "__call__" + +#: ../../c-api/typeobj.rst:74 +msgid ":c:member:`~PyTypeObject.tp_str`" +msgstr ":c:member:`~PyTypeObject.tp_str`" + +#: ../../c-api/typeobj.rst:74 +msgid "__str__" +msgstr "__str__" + +#: ../../c-api/typeobj.rst:76 +msgid ":c:member:`~PyTypeObject.tp_getattro`" +msgstr ":c:member:`~PyTypeObject.tp_getattro`" + +#: ../../c-api/typeobj.rst:76 ../../c-api/typeobj.rst:382 +msgid ":c:type:`getattrofunc`" +msgstr ":c:type:`getattrofunc`" + +#: ../../c-api/typeobj.rst:79 +msgid ":c:member:`~PyTypeObject.tp_setattro`" +msgstr ":c:member:`~PyTypeObject.tp_setattro`" + +#: ../../c-api/typeobj.rst:79 ../../c-api/typeobj.rst:387 +msgid ":c:type:`setattrofunc`" +msgstr ":c:type:`setattrofunc`" + +#: ../../c-api/typeobj.rst:82 +msgid ":c:member:`~PyTypeObject.tp_as_buffer`" +msgstr ":c:member:`~PyTypeObject.tp_as_buffer`" + +#: ../../c-api/typeobj.rst:82 +msgid ":c:type:`PyBufferProcs` *" +msgstr ":c:type:`PyBufferProcs` *" + +#: ../../c-api/typeobj.rst:84 +msgid ":c:member:`~PyTypeObject.tp_flags`" +msgstr ":c:member:`~PyTypeObject.tp_flags`" + +#: ../../c-api/typeobj.rst:84 +msgid "unsigned long" +msgstr "unsigned long" + +#: ../../c-api/typeobj.rst:84 ../../c-api/typeobj.rst:99 +#: ../../c-api/typeobj.rst:113 ../../c-api/typeobj.rst:120 +#: ../../c-api/typeobj.rst:124 ../../c-api/typeobj.rst:126 +#: ../../c-api/typeobj.rst:128 +msgid "?" +msgstr "?" + +#: ../../c-api/typeobj.rst:86 +msgid ":c:member:`~PyTypeObject.tp_doc`" +msgstr ":c:member:`~PyTypeObject.tp_doc`" + +#: ../../c-api/typeobj.rst:86 +msgid "__doc__" +msgstr "__doc__" + +#: ../../c-api/typeobj.rst:88 +msgid ":c:member:`~PyTypeObject.tp_traverse`" +msgstr ":c:member:`~PyTypeObject.tp_traverse`" + +#: ../../c-api/typeobj.rst:88 ../../c-api/typeobj.rst:351 +msgid ":c:type:`traverseproc`" +msgstr ":c:type:`traverseproc`" + +#: ../../c-api/typeobj.rst:90 +msgid ":c:member:`~PyTypeObject.tp_clear`" +msgstr ":c:member:`~PyTypeObject.tp_clear`" + +#: ../../c-api/typeobj.rst:90 ../../c-api/typeobj.rst:130 +#: ../../c-api/typeobj.rst:248 ../../c-api/typeobj.rst:430 +msgid ":c:type:`inquiry`" +msgstr ":c:type:`inquiry`" + +#: ../../c-api/typeobj.rst:92 +msgid ":c:member:`~PyTypeObject.tp_richcompare`" +msgstr ":c:member:`~PyTypeObject.tp_richcompare`" + +#: ../../c-api/typeobj.rst:92 ../../c-api/typeobj.rst:407 +msgid ":c:type:`richcmpfunc`" +msgstr ":c:type:`richcmpfunc`" + +#: ../../c-api/typeobj.rst:92 +msgid "__lt__, __le__, __eq__, __ne__, __gt__, __ge__" +msgstr "__lt__, __le__, __eq__, __ne__, __gt__, __ge__" + +#: ../../c-api/typeobj.rst:99 +msgid "(:c:member:`~PyTypeObject.tp_weaklistoffset`)" +msgstr "(:c:member:`~PyTypeObject.tp_weaklistoffset`)" + +#: ../../c-api/typeobj.rst:101 +msgid ":c:member:`~PyTypeObject.tp_iter`" +msgstr ":c:member:`~PyTypeObject.tp_iter`" + +#: ../../c-api/typeobj.rst:101 ../../c-api/typeobj.rst:413 +msgid ":c:type:`getiterfunc`" +msgstr ":c:type:`getiterfunc`" + +#: ../../c-api/typeobj.rst:101 +msgid "__iter__" +msgstr "__iter__" + +#: ../../c-api/typeobj.rst:103 +msgid ":c:member:`~PyTypeObject.tp_iternext`" +msgstr ":c:member:`~PyTypeObject.tp_iternext`" + +#: ../../c-api/typeobj.rst:103 ../../c-api/typeobj.rst:415 +msgid ":c:type:`iternextfunc`" +msgstr ":c:type:`iternextfunc`" + +#: ../../c-api/typeobj.rst:103 +msgid "__next__" +msgstr "__next__" + +#: ../../c-api/typeobj.rst:105 +msgid ":c:member:`~PyTypeObject.tp_methods`" +msgstr ":c:member:`~PyTypeObject.tp_methods`" + +#: ../../c-api/typeobj.rst:105 +msgid ":c:type:`PyMethodDef` []" +msgstr ":c:type:`PyMethodDef` []" + +#: ../../c-api/typeobj.rst:107 +msgid ":c:member:`~PyTypeObject.tp_members`" +msgstr ":c:member:`~PyTypeObject.tp_members`" + +#: ../../c-api/typeobj.rst:107 +msgid ":c:type:`PyMemberDef` []" +msgstr ":c:type:`PyMemberDef` []" + +#: ../../c-api/typeobj.rst:109 +msgid ":c:member:`~PyTypeObject.tp_getset`" +msgstr ":c:member:`~PyTypeObject.tp_getset`" + +#: ../../c-api/typeobj.rst:109 +msgid ":c:type:`PyGetSetDef` []" +msgstr ":c:type:`PyGetSetDef` []" + +#: ../../c-api/typeobj.rst:111 +msgid ":c:member:`~PyTypeObject.tp_base`" +msgstr ":c:member:`~PyTypeObject.tp_base`" + +#: ../../c-api/typeobj.rst:0 ../../c-api/typeobj.rst:111 +msgid ":c:type:`PyTypeObject` *" +msgstr ":c:type:`PyTypeObject` *" + +#: ../../c-api/typeobj.rst:111 +msgid "__base__" +msgstr "__base__" + +#: ../../c-api/typeobj.rst:113 +msgid ":c:member:`~PyTypeObject.tp_dict`" +msgstr ":c:member:`~PyTypeObject.tp_dict`" + +#: ../../c-api/typeobj.rst:0 ../../c-api/typeobj.rst:113 +#: ../../c-api/typeobj.rst:132 ../../c-api/typeobj.rst:134 +#: ../../c-api/typeobj.rst:136 ../../c-api/typeobj.rst:140 +#: ../../c-api/typeobj.rst:342 ../../c-api/typeobj.rst:347 +#: ../../c-api/typeobj.rst:357 ../../c-api/typeobj.rst:369 +#: ../../c-api/typeobj.rst:371 ../../c-api/typeobj.rst:382 +#: ../../c-api/typeobj.rst:393 ../../c-api/typeobj.rst:405 +#: ../../c-api/typeobj.rst:407 ../../c-api/typeobj.rst:413 +#: ../../c-api/typeobj.rst:415 ../../c-api/typeobj.rst:417 +#: ../../c-api/typeobj.rst:430 ../../c-api/typeobj.rst:432 +#: ../../c-api/typeobj.rst:436 ../../c-api/typeobj.rst:441 +#: ../../c-api/typeobj.rst:447 +msgid ":c:type:`PyObject` *" +msgstr ":c:type:`PyObject` *" + +#: ../../c-api/typeobj.rst:113 +msgid "__dict__" +msgstr "__dict__" + +#: ../../c-api/typeobj.rst:115 +msgid ":c:member:`~PyTypeObject.tp_descr_get`" +msgstr ":c:member:`~PyTypeObject.tp_descr_get`" + +#: ../../c-api/typeobj.rst:115 ../../c-api/typeobj.rst:393 +msgid ":c:type:`descrgetfunc`" +msgstr ":c:type:`descrgetfunc`" + +#: ../../c-api/typeobj.rst:115 +msgid "__get__" +msgstr "__get__" + +#: ../../c-api/typeobj.rst:117 +msgid ":c:member:`~PyTypeObject.tp_descr_set`" +msgstr ":c:member:`~PyTypeObject.tp_descr_set`" + +#: ../../c-api/typeobj.rst:117 ../../c-api/typeobj.rst:399 +msgid ":c:type:`descrsetfunc`" +msgstr ":c:type:`descrsetfunc`" + +#: ../../c-api/typeobj.rst:117 +msgid "__set__, __delete__" +msgstr "__set__, __delete__" + +#: ../../c-api/typeobj.rst:120 +msgid "(:c:member:`~PyTypeObject.tp_dictoffset`)" +msgstr "(:c:member:`~PyTypeObject.tp_dictoffset`)" + +#: ../../c-api/typeobj.rst:122 +msgid ":c:member:`~PyTypeObject.tp_init`" +msgstr ":c:member:`~PyTypeObject.tp_init`" + +#: ../../c-api/typeobj.rst:122 ../../c-api/typeobj.rst:363 +msgid ":c:type:`initproc`" +msgstr ":c:type:`initproc`" + +#: ../../c-api/typeobj.rst:122 +msgid "__init__" +msgstr "__init__" + +#: ../../c-api/typeobj.rst:124 +msgid ":c:member:`~PyTypeObject.tp_alloc`" +msgstr ":c:member:`~PyTypeObject.tp_alloc`" + +#: ../../c-api/typeobj.rst:124 ../../c-api/typeobj.rst:342 +msgid ":c:type:`allocfunc`" +msgstr ":c:type:`allocfunc`" + +#: ../../c-api/typeobj.rst:126 +msgid ":c:member:`~PyTypeObject.tp_new`" +msgstr ":c:member:`~PyTypeObject.tp_new`" + +#: ../../c-api/typeobj.rst:126 ../../c-api/typeobj.rst:357 +msgid ":c:type:`newfunc`" +msgstr ":c:type:`newfunc`" + +#: ../../c-api/typeobj.rst:126 +msgid "__new__" +msgstr "__new__" + +#: ../../c-api/typeobj.rst:128 +msgid ":c:member:`~PyTypeObject.tp_free`" +msgstr ":c:member:`~PyTypeObject.tp_free`" + +#: ../../c-api/typeobj.rst:128 ../../c-api/typeobj.rst:349 +msgid ":c:type:`freefunc`" +msgstr ":c:type:`freefunc`" + +#: ../../c-api/typeobj.rst:130 +msgid ":c:member:`~PyTypeObject.tp_is_gc`" +msgstr ":c:member:`~PyTypeObject.tp_is_gc`" + +#: ../../c-api/typeobj.rst:132 +msgid "<:c:member:`~PyTypeObject.tp_bases`>" +msgstr "<:c:member:`~PyTypeObject.tp_bases`>" + +#: ../../c-api/typeobj.rst:132 +msgid "__bases__" +msgstr "__bases__" + +#: ../../c-api/typeobj.rst:132 ../../c-api/typeobj.rst:134 +msgid "~" +msgstr "~" + +#: ../../c-api/typeobj.rst:134 +msgid "<:c:member:`~PyTypeObject.tp_mro`>" +msgstr "<:c:member:`~PyTypeObject.tp_mro`>" + +#: ../../c-api/typeobj.rst:134 +msgid "__mro__" +msgstr "__mro__" + +#: ../../c-api/typeobj.rst:136 +msgid "[:c:member:`~PyTypeObject.tp_cache`]" +msgstr "[:c:member:`~PyTypeObject.tp_cache`]" + +#: ../../c-api/typeobj.rst:138 +msgid "[:c:member:`~PyTypeObject.tp_subclasses`]" +msgstr "[:c:member:`~PyTypeObject.tp_subclasses`]" + +#: ../../c-api/typeobj.rst:0 ../../c-api/typeobj.rst:138 +#: ../../c-api/typeobj.rst:279 ../../c-api/typeobj.rst:349 +msgid "void *" +msgstr "void *" + +#: ../../c-api/typeobj.rst:138 +msgid "__subclasses__" +msgstr "__subclasses__" + +#: ../../c-api/typeobj.rst:140 +msgid "[:c:member:`~PyTypeObject.tp_weaklist`]" +msgstr "[:c:member:`~PyTypeObject.tp_weaklist`]" + +#: ../../c-api/typeobj.rst:142 +msgid "(:c:member:`~PyTypeObject.tp_del`)" +msgstr "(:c:member:`~PyTypeObject.tp_del`)" + +#: ../../c-api/typeobj.rst:144 +msgid "[:c:member:`~PyTypeObject.tp_version_tag`]" +msgstr "[:c:member:`~PyTypeObject.tp_version_tag`]" + +#: ../../c-api/typeobj.rst:144 +msgid "unsigned int" +msgstr "unsigned int" + +#: ../../c-api/typeobj.rst:146 +msgid ":c:member:`~PyTypeObject.tp_finalize`" +msgstr ":c:member:`~PyTypeObject.tp_finalize`" + +#: ../../c-api/typeobj.rst:146 +msgid "__del__" +msgstr "__del__" + +#: ../../c-api/typeobj.rst:148 +msgid ":c:member:`~PyTypeObject.tp_vectorcall`" +msgstr ":c:member:`~PyTypeObject.tp_vectorcall`" + +#: ../../c-api/typeobj.rst:148 +msgid ":c:type:`vectorcallfunc`" +msgstr ":c:type:`vectorcallfunc`" + +#: ../../c-api/typeobj.rst:150 +msgid "[:c:member:`~PyTypeObject.tp_watched`]" +msgstr "[:c:member:`~PyTypeObject.tp_watched`]" + +#: ../../c-api/typeobj.rst:150 +msgid "unsigned char" +msgstr "unsigned char" + +#: ../../c-api/typeobj.rst:155 +msgid "" +"**()**: A slot name in parentheses indicates it is (effectively) deprecated." +msgstr "**()**:括号中的槽位名称表示(实际上)已弃用。" + +#: ../../c-api/typeobj.rst:157 +msgid "" +"**<>**: Names in angle brackets should be initially set to ``NULL`` and " +"treated as read-only." +msgstr "**<>**: 尖括号内的名称在初始时应设为 ``NULL`` 并被视为是只读的。" + +#: ../../c-api/typeobj.rst:160 +msgid "**[]**: Names in square brackets are for internal use only." +msgstr "**[]**: 方括号内的名称仅供内部使用。" + +#: ../../c-api/typeobj.rst:162 +msgid "" +"**** (as a prefix) means the field is required (must be non-``NULL``)." +msgstr "**** (作为前缀) 表示字段是必需的 (不能是 ``NULL``)。" + +#: ../../c-api/typeobj.rst:164 +msgid "Columns:" +msgstr "列:" + +#: ../../c-api/typeobj.rst:166 +msgid "**\"O\"**: set on :c:data:`PyBaseObject_Type`" +msgstr "**\"O\"**: 在 :c:data:`PyBaseObject_Type` 上设置" + +#: ../../c-api/typeobj.rst:168 +msgid "**\"T\"**: set on :c:data:`PyType_Type`" +msgstr "**\"T\"**: 在 :c:data:`PyType_Type` 上设置" + +#: ../../c-api/typeobj.rst:170 +msgid "**\"D\"**: default (if slot is set to ``NULL``)" +msgstr "**\"D\"**: 默认设置 (如果方法槽被设置为 NULL)" + +#: ../../c-api/typeobj.rst:172 +msgid "" +"X - PyType_Ready sets this value if it is NULL\n" +"~ - PyType_Ready always sets this value (it should be NULL)\n" +"? - PyType_Ready may set this value depending on other slots\n" +"\n" +"Also see the inheritance column (\"I\")." +msgstr "" +"X - PyType_Ready 如其为 NULL 则设置该值\n" +"~ - PyType_Ready 始终设置该值 (它应当为 NULL)\n" +"? - PyType_Ready 根据其他槽位可能设置该值\n" +"\n" +"另请参阅继承列 (\"I\")。" + +#: ../../c-api/typeobj.rst:180 +msgid "**\"I\"**: inheritance" +msgstr "**\"I\"**: 继承" + +#: ../../c-api/typeobj.rst:182 +msgid "" +"X - type slot is inherited via *PyType_Ready* if defined with a *NULL* value\n" +"% - the slots of the sub-struct are inherited individually\n" +"G - inherited, but only in combination with other slots; see the slot's description\n" +"? - it's complicated; see the slot's description" +msgstr "" +"X - 如果使用 *NULL* 值定义则类型槽位将通过 *PyType_Ready* 继承\n" +"% - 子结构体的槽位是单独继承的\n" +"G - 已继承,但仅会与其他槽位相结合;参见槽位的说明\n" +"? - 较复杂;参见槽位的说明" + +#: ../../c-api/typeobj.rst:189 +msgid "" +"Note that some slots are effectively inherited through the normal attribute " +"lookup chain." +msgstr "注意,有些方法槽是通过普通属性查找链有效继承的。" + +#: ../../c-api/typeobj.rst:195 +msgid "sub-slots" +msgstr "子槽位" + +#: ../../c-api/typeobj.rst:201 +msgid "Slot" +msgstr "槽位" + +#: ../../c-api/typeobj.rst:201 +msgid "special methods" +msgstr "特殊方法" + +#: ../../c-api/typeobj.rst:204 +msgid ":c:member:`~PyAsyncMethods.am_await`" +msgstr ":c:member:`~PyAsyncMethods.am_await`" + +#: ../../c-api/typeobj.rst:204 ../../c-api/typeobj.rst:206 +#: ../../c-api/typeobj.rst:208 ../../c-api/typeobj.rst:242 +#: ../../c-api/typeobj.rst:244 ../../c-api/typeobj.rst:246 +#: ../../c-api/typeobj.rst:250 ../../c-api/typeobj.rst:277 +#: ../../c-api/typeobj.rst:281 ../../c-api/typeobj.rst:291 +#: ../../c-api/typeobj.rst:432 +msgid ":c:type:`unaryfunc`" +msgstr ":c:type:`unaryfunc`" + +#: ../../c-api/typeobj.rst:204 +msgid "__await__" +msgstr "__await__" + +#: ../../c-api/typeobj.rst:206 +msgid ":c:member:`~PyAsyncMethods.am_aiter`" +msgstr ":c:member:`~PyAsyncMethods.am_aiter`" + +#: ../../c-api/typeobj.rst:206 +msgid "__aiter__" +msgstr "__aiter__" + +#: ../../c-api/typeobj.rst:208 +msgid ":c:member:`~PyAsyncMethods.am_anext`" +msgstr ":c:member:`~PyAsyncMethods.am_anext`" + +#: ../../c-api/typeobj.rst:208 +msgid "__anext__" +msgstr "__anext__" + +#: ../../c-api/typeobj.rst:210 +msgid ":c:member:`~PyAsyncMethods.am_send`" +msgstr ":c:member:`~PyAsyncMethods.am_send`" + +#: ../../c-api/typeobj.rst:210 +msgid ":c:type:`sendfunc`" +msgstr ":c:type:`sendfunc`" + +#: ../../c-api/typeobj.rst:214 +msgid ":c:member:`~PyNumberMethods.nb_add`" +msgstr ":c:member:`~PyNumberMethods.nb_add`" + +#: ../../c-api/typeobj.rst:214 ../../c-api/typeobj.rst:217 +#: ../../c-api/typeobj.rst:219 ../../c-api/typeobj.rst:222 +#: ../../c-api/typeobj.rst:224 ../../c-api/typeobj.rst:227 +#: ../../c-api/typeobj.rst:229 ../../c-api/typeobj.rst:232 +#: ../../c-api/typeobj.rst:234 ../../c-api/typeobj.rst:252 +#: ../../c-api/typeobj.rst:255 ../../c-api/typeobj.rst:257 +#: ../../c-api/typeobj.rst:260 ../../c-api/typeobj.rst:262 +#: ../../c-api/typeobj.rst:265 ../../c-api/typeobj.rst:267 +#: ../../c-api/typeobj.rst:270 ../../c-api/typeobj.rst:272 +#: ../../c-api/typeobj.rst:275 ../../c-api/typeobj.rst:283 +#: ../../c-api/typeobj.rst:285 ../../c-api/typeobj.rst:287 +#: ../../c-api/typeobj.rst:289 ../../c-api/typeobj.rst:293 +#: ../../c-api/typeobj.rst:296 ../../c-api/typeobj.rst:302 +#: ../../c-api/typeobj.rst:311 ../../c-api/typeobj.rst:322 +#: ../../c-api/typeobj.rst:436 +msgid ":c:type:`binaryfunc`" +msgstr ":c:type:`binaryfunc`" + +#: ../../c-api/typeobj.rst:214 +msgid "__add__ __radd__" +msgstr "__add__ __radd__" + +#: ../../c-api/typeobj.rst:217 +msgid ":c:member:`~PyNumberMethods.nb_inplace_add`" +msgstr ":c:member:`~PyNumberMethods.nb_inplace_add`" + +#: ../../c-api/typeobj.rst:217 ../../c-api/typeobj.rst:322 +msgid "__iadd__" +msgstr "__iadd__" + +#: ../../c-api/typeobj.rst:219 +msgid ":c:member:`~PyNumberMethods.nb_subtract`" +msgstr ":c:member:`~PyNumberMethods.nb_subtract`" + +#: ../../c-api/typeobj.rst:219 +msgid "__sub__ __rsub__" +msgstr "__sub__ __rsub__" + +#: ../../c-api/typeobj.rst:222 +msgid ":c:member:`~PyNumberMethods.nb_inplace_subtract`" +msgstr ":c:member:`~PyNumberMethods.nb_inplace_subtract`" + +#: ../../c-api/typeobj.rst:222 +msgid "__isub__" +msgstr "__isub__" + +#: ../../c-api/typeobj.rst:224 +msgid ":c:member:`~PyNumberMethods.nb_multiply`" +msgstr ":c:member:`~PyNumberMethods.nb_multiply`" + +#: ../../c-api/typeobj.rst:224 +msgid "__mul__ __rmul__" +msgstr "__mul__ __rmul__" + +#: ../../c-api/typeobj.rst:227 +msgid ":c:member:`~PyNumberMethods.nb_inplace_multiply`" +msgstr ":c:member:`~PyNumberMethods.nb_inplace_multiply`" + +#: ../../c-api/typeobj.rst:227 ../../c-api/typeobj.rst:324 +msgid "__imul__" +msgstr "__imul__" + +#: ../../c-api/typeobj.rst:229 +msgid ":c:member:`~PyNumberMethods.nb_remainder`" +msgstr ":c:member:`~PyNumberMethods.nb_remainder`" + +#: ../../c-api/typeobj.rst:229 +msgid "__mod__ __rmod__" +msgstr "__mod__ __rmod__" + +#: ../../c-api/typeobj.rst:232 +msgid ":c:member:`~PyNumberMethods.nb_inplace_remainder`" +msgstr ":c:member:`~PyNumberMethods.nb_inplace_remainder`" + +#: ../../c-api/typeobj.rst:232 +msgid "__imod__" +msgstr "__imod__" + +#: ../../c-api/typeobj.rst:234 +msgid ":c:member:`~PyNumberMethods.nb_divmod`" +msgstr ":c:member:`~PyNumberMethods.nb_divmod`" + +#: ../../c-api/typeobj.rst:234 +msgid "__divmod__ __rdivmod__" +msgstr "__divmod__ __rdivmod__" + +#: ../../c-api/typeobj.rst:237 +msgid ":c:member:`~PyNumberMethods.nb_power`" +msgstr ":c:member:`~PyNumberMethods.nb_power`" + +#: ../../c-api/typeobj.rst:237 +msgid "__pow__ __rpow__" +msgstr "__pow__ __rpow__" + +#: ../../c-api/typeobj.rst:240 +msgid ":c:member:`~PyNumberMethods.nb_inplace_power`" +msgstr ":c:member:`~PyNumberMethods.nb_inplace_power`" + +#: ../../c-api/typeobj.rst:240 +msgid "__ipow__" +msgstr "__ipow__" + +#: ../../c-api/typeobj.rst:242 +msgid ":c:member:`~PyNumberMethods.nb_negative`" +msgstr ":c:member:`~PyNumberMethods.nb_negative`" + +#: ../../c-api/typeobj.rst:242 +msgid "__neg__" +msgstr "__neg__" + +#: ../../c-api/typeobj.rst:244 +msgid ":c:member:`~PyNumberMethods.nb_positive`" +msgstr ":c:member:`~PyNumberMethods.nb_positive`" + +#: ../../c-api/typeobj.rst:244 +msgid "__pos__" +msgstr "__pos__" + +#: ../../c-api/typeobj.rst:246 +msgid ":c:member:`~PyNumberMethods.nb_absolute`" +msgstr ":c:member:`~PyNumberMethods.nb_absolute`" + +#: ../../c-api/typeobj.rst:246 +msgid "__abs__" +msgstr "__abs__" + +#: ../../c-api/typeobj.rst:248 +msgid ":c:member:`~PyNumberMethods.nb_bool`" +msgstr ":c:member:`~PyNumberMethods.nb_bool`" + +#: ../../c-api/typeobj.rst:248 +msgid "__bool__" +msgstr "__bool__" + +#: ../../c-api/typeobj.rst:250 +msgid ":c:member:`~PyNumberMethods.nb_invert`" +msgstr ":c:member:`~PyNumberMethods.nb_invert`" + +#: ../../c-api/typeobj.rst:250 +msgid "__invert__" +msgstr "__invert__" + +#: ../../c-api/typeobj.rst:252 +msgid ":c:member:`~PyNumberMethods.nb_lshift`" +msgstr ":c:member:`~PyNumberMethods.nb_lshift`" + +#: ../../c-api/typeobj.rst:252 +msgid "__lshift__ __rlshift__" +msgstr "__lshift__ __rlshift__" + +#: ../../c-api/typeobj.rst:255 +msgid ":c:member:`~PyNumberMethods.nb_inplace_lshift`" +msgstr ":c:member:`~PyNumberMethods.nb_inplace_lshift`" + +#: ../../c-api/typeobj.rst:255 +msgid "__ilshift__" +msgstr "__ilshift__" + +#: ../../c-api/typeobj.rst:257 +msgid ":c:member:`~PyNumberMethods.nb_rshift`" +msgstr ":c:member:`~PyNumberMethods.nb_rshift`" + +#: ../../c-api/typeobj.rst:257 +msgid "__rshift__ __rrshift__" +msgstr "__rshift__ __rrshift__" + +#: ../../c-api/typeobj.rst:260 +msgid ":c:member:`~PyNumberMethods.nb_inplace_rshift`" +msgstr ":c:member:`~PyNumberMethods.nb_inplace_rshift`" + +#: ../../c-api/typeobj.rst:260 +msgid "__irshift__" +msgstr "__irshift__" + +#: ../../c-api/typeobj.rst:262 +msgid ":c:member:`~PyNumberMethods.nb_and`" +msgstr ":c:member:`~PyNumberMethods.nb_and`" + +#: ../../c-api/typeobj.rst:262 +msgid "__and__ __rand__" +msgstr "__and__ __rand__" + +#: ../../c-api/typeobj.rst:265 +msgid ":c:member:`~PyNumberMethods.nb_inplace_and`" +msgstr ":c:member:`~PyNumberMethods.nb_inplace_and`" + +#: ../../c-api/typeobj.rst:265 +msgid "__iand__" +msgstr "__iand__" + +#: ../../c-api/typeobj.rst:267 +msgid ":c:member:`~PyNumberMethods.nb_xor`" +msgstr ":c:member:`~PyNumberMethods.nb_xor`" + +#: ../../c-api/typeobj.rst:267 +msgid "__xor__ __rxor__" +msgstr "__xor__ __rxor__" + +#: ../../c-api/typeobj.rst:270 +msgid ":c:member:`~PyNumberMethods.nb_inplace_xor`" +msgstr ":c:member:`~PyNumberMethods.nb_inplace_xor`" + +#: ../../c-api/typeobj.rst:270 +msgid "__ixor__" +msgstr "__ixor__" + +#: ../../c-api/typeobj.rst:272 +msgid ":c:member:`~PyNumberMethods.nb_or`" +msgstr ":c:member:`~PyNumberMethods.nb_or`" + +#: ../../c-api/typeobj.rst:272 +msgid "__or__ __ror__" +msgstr "__or__ __ror__" + +#: ../../c-api/typeobj.rst:275 +msgid ":c:member:`~PyNumberMethods.nb_inplace_or`" +msgstr ":c:member:`~PyNumberMethods.nb_inplace_or`" + +#: ../../c-api/typeobj.rst:275 +msgid "__ior__" +msgstr "__ior__" + +#: ../../c-api/typeobj.rst:277 +msgid ":c:member:`~PyNumberMethods.nb_int`" +msgstr ":c:member:`~PyNumberMethods.nb_int`" + +#: ../../c-api/typeobj.rst:277 +msgid "__int__" +msgstr "__int__" + +#: ../../c-api/typeobj.rst:279 +msgid ":c:member:`~PyNumberMethods.nb_reserved`" +msgstr ":c:member:`~PyNumberMethods.nb_reserved`" + +#: ../../c-api/typeobj.rst:281 +msgid ":c:member:`~PyNumberMethods.nb_float`" +msgstr ":c:member:`~PyNumberMethods.nb_float`" + +#: ../../c-api/typeobj.rst:281 +msgid "__float__" +msgstr "__float__" + +#: ../../c-api/typeobj.rst:283 +msgid ":c:member:`~PyNumberMethods.nb_floor_divide`" +msgstr ":c:member:`~PyNumberMethods.nb_floor_divide`" + +#: ../../c-api/typeobj.rst:283 +msgid "__floordiv__" +msgstr "__floordiv__" + +#: ../../c-api/typeobj.rst:285 +msgid ":c:member:`~PyNumberMethods.nb_inplace_floor_divide`" +msgstr ":c:member:`~PyNumberMethods.nb_inplace_floor_divide`" + +#: ../../c-api/typeobj.rst:285 +msgid "__ifloordiv__" +msgstr "__ifloordiv__" + +#: ../../c-api/typeobj.rst:287 +msgid ":c:member:`~PyNumberMethods.nb_true_divide`" +msgstr ":c:member:`~PyNumberMethods.nb_true_divide`" + +#: ../../c-api/typeobj.rst:287 +msgid "__truediv__" +msgstr "__truediv__" + +#: ../../c-api/typeobj.rst:289 +msgid ":c:member:`~PyNumberMethods.nb_inplace_true_divide`" +msgstr ":c:member:`~PyNumberMethods.nb_inplace_true_divide`" + +#: ../../c-api/typeobj.rst:289 +msgid "__itruediv__" +msgstr "__itruediv__" + +#: ../../c-api/typeobj.rst:291 +msgid ":c:member:`~PyNumberMethods.nb_index`" +msgstr ":c:member:`~PyNumberMethods.nb_index`" + +#: ../../c-api/typeobj.rst:291 +msgid "__index__" +msgstr "__index__" + +#: ../../c-api/typeobj.rst:293 +msgid ":c:member:`~PyNumberMethods.nb_matrix_multiply`" +msgstr ":c:member:`~PyNumberMethods.nb_matrix_multiply`" + +#: ../../c-api/typeobj.rst:293 +msgid "__matmul__ __rmatmul__" +msgstr "__matmul__ __rmatmul__" + +#: ../../c-api/typeobj.rst:296 +msgid ":c:member:`~PyNumberMethods.nb_inplace_matrix_multiply`" +msgstr ":c:member:`~PyNumberMethods.nb_inplace_matrix_multiply`" + +#: ../../c-api/typeobj.rst:296 +msgid "__imatmul__" +msgstr "__imatmul__" + +#: ../../c-api/typeobj.rst:300 +msgid ":c:member:`~PyMappingMethods.mp_length`" +msgstr ":c:member:`~PyMappingMethods.mp_length`" + +#: ../../c-api/typeobj.rst:300 ../../c-api/typeobj.rst:309 +#: ../../c-api/typeobj.rst:417 +msgid ":c:type:`lenfunc`" +msgstr ":c:type:`lenfunc`" + +#: ../../c-api/typeobj.rst:300 ../../c-api/typeobj.rst:309 +msgid "__len__" +msgstr "__len__" + +#: ../../c-api/typeobj.rst:302 +msgid ":c:member:`~PyMappingMethods.mp_subscript`" +msgstr ":c:member:`~PyMappingMethods.mp_subscript`" + +#: ../../c-api/typeobj.rst:302 ../../c-api/typeobj.rst:315 +msgid "__getitem__" +msgstr "__getitem__" + +#: ../../c-api/typeobj.rst:304 +msgid ":c:member:`~PyMappingMethods.mp_ass_subscript`" +msgstr ":c:member:`~PyMappingMethods.mp_ass_subscript`" + +#: ../../c-api/typeobj.rst:304 ../../c-api/typeobj.rst:463 +msgid ":c:type:`objobjargproc`" +msgstr ":c:type:`objobjargproc`" + +#: ../../c-api/typeobj.rst:304 +msgid "__setitem__, __delitem__" +msgstr "__setitem__, __delitem__" + +#: ../../c-api/typeobj.rst:309 +msgid ":c:member:`~PySequenceMethods.sq_length`" +msgstr ":c:member:`~PySequenceMethods.sq_length`" + +#: ../../c-api/typeobj.rst:311 +msgid ":c:member:`~PySequenceMethods.sq_concat`" +msgstr ":c:member:`~PySequenceMethods.sq_concat`" + +#: ../../c-api/typeobj.rst:311 +msgid "__add__" +msgstr "__add__" + +#: ../../c-api/typeobj.rst:313 +msgid ":c:member:`~PySequenceMethods.sq_repeat`" +msgstr ":c:member:`~PySequenceMethods.sq_repeat`" + +#: ../../c-api/typeobj.rst:313 ../../c-api/typeobj.rst:315 +#: ../../c-api/typeobj.rst:324 ../../c-api/typeobj.rst:447 +msgid ":c:type:`ssizeargfunc`" +msgstr ":c:type:`ssizeargfunc`" + +#: ../../c-api/typeobj.rst:313 +msgid "__mul__" +msgstr "__mul__" + +#: ../../c-api/typeobj.rst:315 +msgid ":c:member:`~PySequenceMethods.sq_item`" +msgstr ":c:member:`~PySequenceMethods.sq_item`" + +#: ../../c-api/typeobj.rst:317 +msgid ":c:member:`~PySequenceMethods.sq_ass_item`" +msgstr ":c:member:`~PySequenceMethods.sq_ass_item`" + +#: ../../c-api/typeobj.rst:317 ../../c-api/typeobj.rst:452 +msgid ":c:type:`ssizeobjargproc`" +msgstr ":c:type:`ssizeobjargproc`" + +#: ../../c-api/typeobj.rst:317 +msgid "__setitem__ __delitem__" +msgstr "__setitem__ __delitem__" + +#: ../../c-api/typeobj.rst:320 +msgid ":c:member:`~PySequenceMethods.sq_contains`" +msgstr ":c:member:`~PySequenceMethods.sq_contains`" + +#: ../../c-api/typeobj.rst:320 ../../c-api/typeobj.rst:458 +msgid ":c:type:`objobjproc`" +msgstr ":c:type:`objobjproc`" + +#: ../../c-api/typeobj.rst:320 +msgid "__contains__" +msgstr "__contains__" + +#: ../../c-api/typeobj.rst:322 +msgid ":c:member:`~PySequenceMethods.sq_inplace_concat`" +msgstr ":c:member:`~PySequenceMethods.sq_inplace_concat`" + +#: ../../c-api/typeobj.rst:324 +msgid ":c:member:`~PySequenceMethods.sq_inplace_repeat`" +msgstr ":c:member:`~PySequenceMethods.sq_inplace_repeat`" + +#: ../../c-api/typeobj.rst:328 +msgid ":c:member:`~PyBufferProcs.bf_getbuffer`" +msgstr ":c:member:`~PyBufferProcs.bf_getbuffer`" + +#: ../../c-api/typeobj.rst:328 +msgid ":c:func:`getbufferproc`" +msgstr ":c:func:`getbufferproc`" + +#: ../../c-api/typeobj.rst:328 +msgid "__buffer__" +msgstr "__buffer__" + +#: ../../c-api/typeobj.rst:330 +msgid ":c:member:`~PyBufferProcs.bf_releasebuffer`" +msgstr ":c:member:`~PyBufferProcs.bf_releasebuffer`" + +#: ../../c-api/typeobj.rst:330 +msgid ":c:func:`releasebufferproc`" +msgstr ":c:func:`releasebufferproc`" + +#: ../../c-api/typeobj.rst:330 +msgid "__release_\\ buffer\\__" +msgstr "__release_\\ buffer\\__" + +#: ../../c-api/typeobj.rst:337 +msgid "slot typedefs" +msgstr "槽位 typedef" + +#: ../../c-api/typeobj.rst:340 +msgid "typedef" +msgstr "typedef" + +#: ../../c-api/typeobj.rst:340 +msgid "Parameter Types" +msgstr "参数类型" + +#: ../../c-api/typeobj.rst:340 +msgid "Return Type" +msgstr "返回类型" + +#: ../../c-api/typeobj.rst:347 ../../c-api/typeobj.rst:349 +#: ../../c-api/typeobj.rst:425 +msgid "void" +msgstr "void" + +#: ../../c-api/typeobj.rst:0 +msgid ":c:type:`visitproc`" +msgstr ":c:type:`visitproc`" + +#: ../../c-api/typeobj.rst:0 ../../c-api/typeobj.rst:351 +#: ../../c-api/typeobj.rst:363 ../../c-api/typeobj.rst:376 +#: ../../c-api/typeobj.rst:387 ../../c-api/typeobj.rst:399 +#: ../../c-api/typeobj.rst:419 ../../c-api/typeobj.rst:430 +#: ../../c-api/typeobj.rst:452 ../../c-api/typeobj.rst:458 +#: ../../c-api/typeobj.rst:463 +msgid "int" +msgstr "int" + +#: ../../c-api/typeobj.rst:405 +msgid "Py_hash_t" +msgstr "Py_hash_t" + +#: ../../c-api/typeobj.rst:419 +msgid ":c:type:`getbufferproc`" +msgstr ":c:type:`getbufferproc`" + +#: ../../c-api/typeobj.rst:0 +msgid ":c:type:`Py_buffer` *" +msgstr ":c:type:`Py_buffer` *" + +#: ../../c-api/typeobj.rst:425 +msgid ":c:type:`releasebufferproc`" +msgstr ":c:type:`releasebufferproc`" + +#: ../../c-api/typeobj.rst:470 +msgid "See :ref:`slot-typedefs` below for more detail." +msgstr "请参阅 :ref:`slot-typedefs` 里有更多详细信息。" + +#: ../../c-api/typeobj.rst:474 +msgid "PyTypeObject Definition" +msgstr "PyTypeObject 定义" + +#: ../../c-api/typeobj.rst:476 +msgid "" +"The structure definition for :c:type:`PyTypeObject` can be found in " +":file:`Include/cpython/object.h`. For convenience of reference, this " +"repeats the definition found there:" +msgstr "" +"针对 :c:type:`PyTypeObject` 的结构定义可以在 :file:`Include/cpython/object.h` 中找到。 " +"为了方便参考,这里复述了其中的定义:" + +#: ../../c-api/typeobj.rst:482 +msgid "" +"typedef struct _typeobject {\n" +" PyObject_VAR_HEAD\n" +" const char *tp_name; /* For printing, in format \".\" */\n" +" Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */\n" +"\n" +" /* Methods to implement standard operations */\n" +"\n" +" destructor tp_dealloc;\n" +" Py_ssize_t tp_vectorcall_offset;\n" +" getattrfunc tp_getattr;\n" +" setattrfunc tp_setattr;\n" +" PyAsyncMethods *tp_as_async; /* formerly known as tp_compare (Python 2)\n" +" or tp_reserved (Python 3) */\n" +" reprfunc tp_repr;\n" +"\n" +" /* Method suites for standard classes */\n" +"\n" +" PyNumberMethods *tp_as_number;\n" +" PySequenceMethods *tp_as_sequence;\n" +" PyMappingMethods *tp_as_mapping;\n" +"\n" +" /* More standard operations (here for binary compatibility) */\n" +"\n" +" hashfunc tp_hash;\n" +" ternaryfunc tp_call;\n" +" reprfunc tp_str;\n" +" getattrofunc tp_getattro;\n" +" setattrofunc tp_setattro;\n" +"\n" +" /* Functions to access object as input/output buffer */\n" +" PyBufferProcs *tp_as_buffer;\n" +"\n" +" /* Flags to define presence of optional/expanded features */\n" +" unsigned long tp_flags;\n" +"\n" +" const char *tp_doc; /* Documentation string */\n" +"\n" +" /* Assigned meaning in release 2.0 */\n" +" /* call function for all accessible objects */\n" +" traverseproc tp_traverse;\n" +"\n" +" /* delete references to contained objects */\n" +" inquiry tp_clear;\n" +"\n" +" /* Assigned meaning in release 2.1 */\n" +" /* rich comparisons */\n" +" richcmpfunc tp_richcompare;\n" +"\n" +" /* weak reference enabler */\n" +" Py_ssize_t tp_weaklistoffset;\n" +"\n" +" /* Iterators */\n" +" getiterfunc tp_iter;\n" +" iternextfunc tp_iternext;\n" +"\n" +" /* Attribute descriptor and subclassing stuff */\n" +" PyMethodDef *tp_methods;\n" +" PyMemberDef *tp_members;\n" +" PyGetSetDef *tp_getset;\n" +" // Strong reference on a heap type, borrowed reference on a static type\n" +" PyTypeObject *tp_base;\n" +" PyObject *tp_dict;\n" +" descrgetfunc tp_descr_get;\n" +" descrsetfunc tp_descr_set;\n" +" Py_ssize_t tp_dictoffset;\n" +" initproc tp_init;\n" +" allocfunc tp_alloc;\n" +" newfunc tp_new;\n" +" freefunc tp_free; /* Low-level free-memory routine */\n" +" inquiry tp_is_gc; /* For PyObject_IS_GC */\n" +" PyObject *tp_bases;\n" +" PyObject *tp_mro; /* method resolution order */\n" +" PyObject *tp_cache; /* no longer used */\n" +" void *tp_subclasses; /* for static builtin types this is an index */\n" +" PyObject *tp_weaklist; /* not used for static builtin types */\n" +" destructor tp_del;\n" +"\n" +" /* Type attribute cache version tag. Added in version 2.6.\n" +" * If zero, the cache is invalid and must be initialized.\n" +" */\n" +" unsigned int tp_version_tag;\n" +"\n" +" destructor tp_finalize;\n" +" vectorcallfunc tp_vectorcall;\n" +"\n" +" /* bitset of which type-watchers care about this type */\n" +" unsigned char tp_watched;\n" +"\n" +" /* Number of tp_version_tag values used.\n" +" * Set to _Py_ATTR_CACHE_UNUSED if the attribute cache is\n" +" * disabled for this type (e.g. due to custom MRO entries).\n" +" * Otherwise, limited to MAX_VERSIONS_PER_CLASS (defined elsewhere).\n" +" */\n" +" uint16_t tp_versions_used;\n" +"} PyTypeObject;\n" +msgstr "" +"typedef struct _typeobject {\n" +" PyObject_VAR_HEAD\n" +" const char *tp_name; /* 用于打印,格式为 \".\" */\n" +" Py_ssize_t tp_basicsize, tp_itemsize; /* 用于分配 */\n" +"\n" +" /* 用于实现标准操作的方法 */\n" +"\n" +" destructor tp_dealloc;\n" +" Py_ssize_t tp_vectorcall_offset;\n" +" getattrfunc tp_getattr;\n" +" setattrfunc tp_setattr;\n" +" PyAsyncMethods *tp_as_async; /* 原名为 tp_compare (Python 2)\n" +" 或 tp_reserved (Python 3) */\n" +" reprfunc tp_repr;\n" +"\n" +" /* 用于标准类的方法集 */\n" +"\n" +" PyNumberMethods *tp_as_number;\n" +" PySequenceMethods *tp_as_sequence;\n" +" PyMappingMethods *tp_as_mapping;\n" +"\n" +" /* 更多标准操作 (这些用于二进制兼容) */\n" +"\n" +" hashfunc tp_hash;\n" +" ternaryfunc tp_call;\n" +" reprfunc tp_str;\n" +" getattrofunc tp_getattro;\n" +" setattrofunc tp_setattro;\n" +"\n" +" /* 用于以输入/输出缓冲区方式访问对象的函数 */\n" +" PyBufferProcs *tp_as_buffer;\n" +"\n" +" /* 用于定义可选/扩展特性是否存在的旗标 */\n" +" unsigned long tp_flags;\n" +"\n" +" const char *tp_doc; /* 文档字符串 */\n" +"\n" +" /* 在 2.0 发布版中分配的含义 */\n" +" /* 为所有可访问的对象调用函数 */\n" +" traverseproc tp_traverse;\n" +"\n" +" /* 删除对所包含对象的引用 */\n" +" inquiry tp_clear;\n" +"\n" +" /* 在 2.1 发布版中分配的含义 */\n" +" /* 富比较操作 */\n" +" richcmpfunc tp_richcompare;\n" +"\n" +" /* 启用弱引用 */\n" +" Py_ssize_t tp_weaklistoffset;\n" +"\n" +" /* 迭代器 */\n" +" getiterfunc tp_iter;\n" +" iternextfunc tp_iternext;\n" +"\n" +" /* 属性描述器和子类化内容 */\n" +" PyMethodDef *tp_methods;\n" +" PyMemberDef *tp_members;\n" +" PyGetSetDef *tp_getset;\n" +" // 堆类型的强引用,静态类型的借入引用\n" +" PyTypeObject *tp_base;\n" +" PyObject *tp_dict;\n" +" descrgetfunc tp_descr_get;\n" +" descrsetfunc tp_descr_set;\n" +" Py_ssize_t tp_dictoffset;\n" +" initproc tp_init;\n" +" allocfunc tp_alloc;\n" +" newfunc tp_new;\n" +" freefunc tp_free; /* 低层级的释放内存例程 */\n" +" inquiry tp_is_gc; /* 用于 PyObject_IS_GC */\n" +" PyObject *tp_bases;\n" +" PyObject *tp_mro; /* 方法解析顺序 */\n" +" PyObject *tp_cache; /* 不再被使用 */\n" +" void *tp_subclasses; /* 对于静态内置类型这将是一个索引 */\n" +" PyObject *tp_weaklist; /* 不被用于静态内置类型 */\n" +" destructor tp_del;\n" +"\n" +" /* 类型属性缓存版本标签。在 2.6 版中添加。\n" +" * 如果为零,则缓存无效并且必须被初始化。\n" +" */\n" +" unsigned int tp_version_tag;\n" +"\n" +" destructor tp_finalize;\n" +" vectorcallfunc tp_vectorcall;\n" +"\n" +" /* 类型监视器针对此类型的位设置 */\n" +" unsigned char tp_watched;\n" +"\n" +" /* 使用的 tp_version_tag 值数量。\n" +" * 如果针对此类型的属性缓存被禁用则设为 _Py_ATTR_CACHE_UNUSED\n" +" * (例如由于自定义的 MRO 条目而被禁用)。\n" +" * 在其他情况下,将被限制为 MAX_VERSIONS_PER_CLASS (在其他地方定义)。\n" +" */\n" +" uint16_t tp_versions_used;\n" +"} PyTypeObject;\n" + +#: ../../c-api/typeobj.rst:486 +msgid "PyObject Slots" +msgstr "PyObject 槽位" + +#: ../../c-api/typeobj.rst:488 +msgid "" +"The type object structure extends the :c:type:`PyVarObject` structure. The " +":c:member:`~PyVarObject.ob_size` field is used for dynamic types (created by" +" :c:func:`!type_new`, usually called from a class statement). Note that " +":c:data:`PyType_Type` (the metatype) initializes " +":c:member:`~PyTypeObject.tp_itemsize`, which means that its instances (i.e. " +"type objects) *must* have the :c:member:`~PyVarObject.ob_size` field." +msgstr "" +"类型对象结构体扩展了 :c:type:`PyVarObject` 结构体。 :c:member:`~PyVarObject.ob_size` " +"字段用于动态类型(由 :c:func:`!type_new` 创建,通常由 class 语句调用)。请注意 :c:data:`PyType_Type` " +"(元类型)会初始化 :c:member:`~PyTypeObject.tp_itemsize`,这意味着它的实例(即类型对象) *必须* 具有 " +":c:member:`~PyVarObject.ob_size` 字段。" + +#: ../../c-api/typeobj.rst:495 +msgid ":c:member:`PyObject.ob_refcnt`" +msgstr ":c:member:`PyObject.ob_refcnt`" + +#: ../../c-api/typeobj.rst:497 +msgid "" +"The type object's reference count is initialized to ``1`` by the " +"``PyObject_HEAD_INIT`` macro. Note that for :ref:`statically allocated type" +" objects `, the type's instances (objects whose " +":c:member:`~PyObject.ob_type` points back to the type) do *not* count as " +"references. But for :ref:`dynamically allocated type objects `," +" the instances *do* count as references." +msgstr "" +"类型对象的引用计数由 ``PyObject_HEAD_INIT`` 宏初始化为 ``1``。请注意,对于 :ref:`静态分配的类型对象 " +"`,该类型的实例(其 :c:member:`~PyObject.ob_type` 指回类型的对象)*不* 计为引用。但对于 " +":ref:`动态分配的类型对象 `,实例 *确实* 计为引用。" + +#: ../../c-api/typeobj.rst:504 ../../c-api/typeobj.rst:527 +#: ../../c-api/typeobj.rst:543 ../../c-api/typeobj.rst:587 +#: ../../c-api/typeobj.rst:665 ../../c-api/typeobj.rst:809 +#: ../../c-api/typeobj.rst:854 ../../c-api/typeobj.rst:873 +#: ../../c-api/typeobj.rst:892 ../../c-api/typeobj.rst:910 +#: ../../c-api/typeobj.rst:936 ../../c-api/typeobj.rst:953 +#: ../../c-api/typeobj.rst:965 ../../c-api/typeobj.rst:977 +#: ../../c-api/typeobj.rst:1012 ../../c-api/typeobj.rst:1036 +#: ../../c-api/typeobj.rst:1058 ../../c-api/typeobj.rst:1081 +#: ../../c-api/typeobj.rst:1109 ../../c-api/typeobj.rst:1128 +#: ../../c-api/typeobj.rst:1144 ../../c-api/typeobj.rst:1184 +#: ../../c-api/typeobj.rst:1195 ../../c-api/typeobj.rst:1205 +#: ../../c-api/typeobj.rst:1215 ../../c-api/typeobj.rst:1229 +#: ../../c-api/typeobj.rst:1247 ../../c-api/typeobj.rst:1270 +#: ../../c-api/typeobj.rst:1288 ../../c-api/typeobj.rst:1301 +#: ../../c-api/typeobj.rst:1323 ../../c-api/typeobj.rst:1370 +#: ../../c-api/typeobj.rst:1396 ../../c-api/typeobj.rst:1415 +#: ../../c-api/typeobj.rst:1445 ../../c-api/typeobj.rst:1467 +#: ../../c-api/typeobj.rst:1505 ../../c-api/typeobj.rst:1517 +#: ../../c-api/typeobj.rst:1543 ../../c-api/typeobj.rst:1641 +#: ../../c-api/typeobj.rst:1787 ../../c-api/typeobj.rst:1854 +#: ../../c-api/typeobj.rst:1890 ../../c-api/typeobj.rst:1917 +#: ../../c-api/typeobj.rst:1942 ../../c-api/typeobj.rst:1957 +#: ../../c-api/typeobj.rst:1974 ../../c-api/typeobj.rst:1990 +#: ../../c-api/typeobj.rst:2022 ../../c-api/typeobj.rst:2054 +#: ../../c-api/typeobj.rst:2082 ../../c-api/typeobj.rst:2102 +#: ../../c-api/typeobj.rst:2131 ../../c-api/typeobj.rst:2177 +#: ../../c-api/typeobj.rst:2196 ../../c-api/typeobj.rst:2238 +#: ../../c-api/typeobj.rst:2263 ../../c-api/typeobj.rst:2303 +#: ../../c-api/typeobj.rst:2333 ../../c-api/typeobj.rst:2346 +#: ../../c-api/typeobj.rst:2356 ../../c-api/typeobj.rst:2373 +#: ../../c-api/typeobj.rst:2390 ../../c-api/typeobj.rst:2406 +#: ../../c-api/typeobj.rst:2550 ../../c-api/typeobj.rst:2610 +msgid "**Inheritance:**" +msgstr "**继承:**" + +#: ../../c-api/typeobj.rst:506 ../../c-api/typeobj.rst:545 +#: ../../c-api/typeobj.rst:589 +msgid "This field is not inherited by subtypes." +msgstr "子类型不继承此字段。" + +#: ../../c-api/typeobj.rst:509 +msgid ":c:member:`PyObject.ob_type`" +msgstr ":c:member:`PyObject.ob_type`" + +#: ../../c-api/typeobj.rst:511 +msgid "" +"This is the type's type, in other words its metatype. It is initialized by " +"the argument to the ``PyObject_HEAD_INIT`` macro, and its value should " +"normally be ``&PyType_Type``. However, for dynamically loadable extension " +"modules that must be usable on Windows (at least), the compiler complains " +"that this is not a valid initializer. Therefore, the convention is to pass " +"``NULL`` to the ``PyObject_HEAD_INIT`` macro and to initialize this field " +"explicitly at the start of the module's initialization function, before " +"doing anything else. This is typically done like this::" +msgstr "" +"这是类型的类型,换句话说就是元类型,它由宏 ``PyObject_HEAD_INIT`` 的参数来做初始化,它的值一般情况下是 " +"``&PyType_Type``。可是为了使动态可载入扩展模块至少在 Windows 上可用,编译器会报错这是一个不可用的初始化。因此按照惯例传递 " +"``NULL`` 给宏 ``PyObject_HEAD_INIT`` 并且在模块的初始化函数开始时候其他任何操作之前初始化这个字段。典型做法是这样的:" + +#: ../../c-api/typeobj.rst:520 +msgid "Foo_Type.ob_type = &PyType_Type;" +msgstr "Foo_Type.ob_type = &PyType_Type;" + +#: ../../c-api/typeobj.rst:522 +msgid "" +"This should be done before any instances of the type are created. " +":c:func:`PyType_Ready` checks if :c:member:`~PyObject.ob_type` is ``NULL``, " +"and if so, initializes it to the :c:member:`~PyObject.ob_type` field of the " +"base class. :c:func:`PyType_Ready` will not change this field if it is non-" +"zero." +msgstr "" +"这应当在创建类型的任何实例之前完成。 :c:func:`PyType_Ready` 会检查 :c:member:`~PyObject.ob_type` " +"是否为 ``NULL``,如果是,则将其初始化为基类的 :c:member:`~PyObject.ob_type` 字段。如果该字段为非零值则 " +":c:func:`PyType_Ready` 将不会更改它。" + +#: ../../c-api/typeobj.rst:529 ../../c-api/typeobj.rst:811 +#: ../../c-api/typeobj.rst:938 ../../c-api/typeobj.rst:1038 +#: ../../c-api/typeobj.rst:1060 ../../c-api/typeobj.rst:1919 +#: ../../c-api/typeobj.rst:1944 ../../c-api/typeobj.rst:2084 +#: ../../c-api/typeobj.rst:2104 ../../c-api/typeobj.rst:2179 +#: ../../c-api/typeobj.rst:2305 ../../c-api/typeobj.rst:2552 +msgid "This field is inherited by subtypes." +msgstr "此字段会被子类型继承。" + +#: ../../c-api/typeobj.rst:533 +msgid "PyVarObject Slots" +msgstr "PyVarObject 槽位" + +#: ../../c-api/typeobj.rst:535 +msgid ":c:member:`PyVarObject.ob_size`" +msgstr ":c:member:`PyVarObject.ob_size`" + +#: ../../c-api/typeobj.rst:537 +msgid "" +"For :ref:`statically allocated type objects `, this should be " +"initialized to zero. For :ref:`dynamically allocated type objects `, this field has a special internal meaning." +msgstr "" +"对于 :ref:`静态分配的类型对象`,它应该初始化为 0。对于 :ref:`动态分配的类型对象`,该字段具有特殊的内部含义。" + +#: ../../c-api/typeobj.rst:541 +msgid "This field should be accessed using the :c:func:`Py_SIZE()` macro." +msgstr "应使用 :c:func:`Py_SIZE()` 宏来访问此字段。" + +#: ../../c-api/typeobj.rst:549 +msgid "PyTypeObject Slots" +msgstr "PyTypeObject 槽" + +#: ../../c-api/typeobj.rst:551 +msgid "" +"Each slot has a section describing inheritance. If :c:func:`PyType_Ready` " +"may set a value when the field is set to ``NULL`` then there will also be a " +"\"Default\" section. (Note that many fields set on " +":c:data:`PyBaseObject_Type` and :c:data:`PyType_Type` effectively act as " +"defaults.)" +msgstr "" +"每个槽位都有一个小节来描述继承关系。如果 :c:func:`PyType_Ready` 可以在字段被设为 ``NULL`` " +"时设置一个值那么还会有一个“默认”小节。 (请注意在 :c:data:`PyBaseObject_Type` 和 " +":c:data:`PyType_Type` 上设置的许多字段实际上就是默认值。)" + +#: ../../c-api/typeobj.rst:558 +msgid "" +"Pointer to a NUL-terminated string containing the name of the type. For " +"types that are accessible as module globals, the string should be the full " +"module name, followed by a dot, followed by the type name; for built-in " +"types, it should be just the type name. If the module is a submodule of a " +"package, the full package name is part of the full module name. For " +"example, a type named :class:`!T` defined in module :mod:`!M` in subpackage " +":mod:`!Q` in package :mod:`!P` should have the " +":c:member:`~PyTypeObject.tp_name` initializer ``\"P.Q.M.T\"``." +msgstr "" +"指向包含类型名称的以 NUL 结尾的字符串的指针。 " +"对于可作为模块全局访问的类型,该字符串应为模块全名,后面跟一个点号,然后再加类型名称;对于内置类型,它应当只是类型名称。 " +"如果模块是包的子模块,则包的全名将是模块的全名的一部分。例如,在包 :mod:`!P` 的子包 :mod:`!Q` 中的模块 :mod:`!M` " +"中定义的名为 :class:`!T` 的类型应当具有 :c:member:`~PyTypeObject.tp_name` 初始化器 " +"``\"P.Q.M.T\"``。" + +#: ../../c-api/typeobj.rst:566 +msgid "" +"For :ref:`dynamically allocated type objects `, this should just" +" be the type name, and the module name explicitly stored in the type dict as" +" the value for key ``'__module__'``." +msgstr "" +"对于 :ref:`动态分配的类型对象 `,这应为类型名称,而模块名称将作为 ``'__module__'`` " +"键的值显式地保存在类型字典中。" + +#: ../../c-api/typeobj.rst:571 +msgid "" +"For :ref:`statically allocated type objects `, the *tp_name* " +"field should contain a dot. Everything before the last dot is made " +"accessible as the :attr:`~type.__module__` attribute, and everything after " +"the last dot is made accessible as the :attr:`~type.__name__` attribute." +msgstr "" +"对于 :ref:`静态分配的类型对象 `,*tp_name* 字段应当包含一个点号。最后一个点号之前的所有内容都可作为 " +":attr:`~type.__module__` 属性访问,而最后一个点号之后的所有内容都可作为 :attr:`~type.__name__` " +"属性访问。" + +#: ../../c-api/typeobj.rst:577 +msgid "" +"If no dot is present, the entire :c:member:`~PyTypeObject.tp_name` field is " +"made accessible as the :attr:`~type.__name__` attribute, and the " +":attr:`~type.__module__` attribute is undefined (unless explicitly set in " +"the dictionary, as explained above). This means your type will be " +"impossible to pickle. Additionally, it will not be listed in module " +"documentations created with pydoc." +msgstr "" +"如果不存在点号,则整个 :c:member:`~PyTypeObject.tp_name` 字段将作为 :attr:`~type.__name__` " +"属性访问,而 :attr:`~type.__module__` 属性则将是未定义的(除非在字典中显式地设置,如上文所述)。这意味着无法对你的类型执行 " +"pickle。此外,它也不会在用 pydoc 创建的模块文档中列出。" + +#: ../../c-api/typeobj.rst:583 +msgid "" +"This field must not be ``NULL``. It is the only required field in " +":c:func:`PyTypeObject` (other than potentially " +":c:member:`~PyTypeObject.tp_itemsize`)." +msgstr "" +"该字段不可为 ``NULL``。它是 :c:func:`PyTypeObject` 中唯一的必填字段(除了潜在的 " +":c:member:`~PyTypeObject.tp_itemsize` 以外)。" + +#: ../../c-api/typeobj.rst:595 +msgid "" +"These fields allow calculating the size in bytes of instances of the type." +msgstr "通过这些字段可以计算出该类型实例以字节为单位的大小。" + +#: ../../c-api/typeobj.rst:597 +msgid "" +"There are two kinds of types: types with fixed-length instances have a zero " +":c:member:`!tp_itemsize` field, types with variable-length instances have a " +"non-zero :c:member:`!tp_itemsize` field. For a type with fixed-length " +"instances, all instances have the same size, given in " +":c:member:`!tp_basicsize`. (Exceptions to this rule can be made using " +":c:func:`PyUnstable_Object_GC_NewWithExtraData`.)" +msgstr "" +"类型可分为两种:实例为固定长度且 :c:member:`!tp_itemsize` 字段值为零的类型;实例为可变长度且 " +":c:member:`!tp_itemsize` 字段值不为零的类型。对于实例为固定长度的类型,所有实例都具有相同的由 " +":c:member:`!tp_basicsize` 给出的大小。 (这条规则的例外情况可通过使用 " +":c:func:`PyUnstable_Object_GC_NewWithExtraData` 来实现。)" + +#: ../../c-api/typeobj.rst:604 +msgid "" +"For a type with variable-length instances, the instances must have an " +":c:member:`~PyVarObject.ob_size` field, and the instance size is " +":c:member:`!tp_basicsize` plus N times :c:member:`!tp_itemsize`, where N is " +"the \"length\" of the object." +msgstr "" +"对于实例为可变长度的类型,其实例必须具有 :c:member:`~PyVarObject.ob_size` 字段,且实例大小为 " +":c:member:`!tp_basicsize` 加 N 乘以 :c:member:`!tp_itemsize`,其中 N 为对象的“长度”。" + +#: ../../c-api/typeobj.rst:609 +msgid "" +"Functions like :c:func:`PyObject_NewVar` will take the value of N as an " +"argument, and store in the instance's :c:member:`~PyVarObject.ob_size` " +"field. Note that the :c:member:`~PyVarObject.ob_size` field may later be " +"used for other purposes. For example, :py:type:`int` instances use the bits " +"of :c:member:`~PyVarObject.ob_size` in an implementation-defined way; the " +"underlying storage and its size should be accessed using " +":c:func:`PyLong_Export`." +msgstr "" +"像 :c:func:`PyObject_NewVar` 这样的函数接受 N 值作为参数,并会将其保存在实例的 " +":c:member:`~PyVarObject.ob_size` 字段中。请注意 :c:member:`~PyVarObject.ob_size` " +"字段在此之后可能还有其他用处。例如,:py:type:`int` 实例会以具体实现所定义的方式来使用 " +":c:member:`~PyVarObject.ob_size` 的比特位;下层的存储及其大小应当使用 :c:func:`PyLong_Export` " +"来访问。" + +#: ../../c-api/typeobj.rst:619 +msgid "" +"The :c:member:`~PyVarObject.ob_size` field should be accessed using the " +":c:func:`Py_SIZE()` and :c:func:`Py_SET_SIZE()` macros." +msgstr "" +":c:member:`~PyVarObject.ob_size` 字段应当使用 :c:func:`Py_SIZE()` 和 " +":c:func:`Py_SET_SIZE()` 宏来访问。" + +#: ../../c-api/typeobj.rst:622 +msgid "" +"Also, the presence of an :c:member:`~PyVarObject.ob_size` field in the " +"instance layout doesn't mean that the instance structure is variable-length." +" For example, the :py:type:`list` type has fixed-length instances, yet those" +" instances have a :c:member:`~PyVarObject.ob_size` field. (As with " +":py:type:`int`, avoid reading lists' :c:member:`!ob_size` directly. Call " +":c:func:`PyList_Size` instead.)" +msgstr "" +"此外,实例布局中存在 :c:member:`~PyVarObject.ob_size` 字段并不意味着该实例结构体是可变长度的。 " +"例如,:py:type:`list` 类型实例即为固定长度,虽然其实例具有 :c:member:`~PyVarObject.ob_size` 字段。 " +"(和 :py:type:`int` 一样,请避免直接读取 list 的 :c:member:`!ob_size`。要改为调用 " +":c:func:`PyList_Size` 函数。)" + +#: ../../c-api/typeobj.rst:629 +msgid "" +"The :c:member:`!tp_basicsize` includes size needed for data of the type's " +":c:member:`~PyTypeObject.tp_base`, plus any extra data needed by each " +"instance." +msgstr "" +":c:member:`!tp_basicsize` 包括类型的 :c:member:`~PyTypeObject.tp_base` " +"所需数据大小,加上每个实例所需额外数据的大小。" + +#: ../../c-api/typeobj.rst:633 +msgid "" +"The correct way to set :c:member:`!tp_basicsize` is to use the ``sizeof`` " +"operator on the struct used to declare the instance layout. This struct must" +" include the struct used to declare the base type. In other words, " +":c:member:`!tp_basicsize` must be greater than or equal to the base's " +":c:member:`!tp_basicsize`." +msgstr "" +"设置 :c:member:`!tp_basicsize` 的正确方式是在被用于声明实例布局的结构体上使用 ``sizeof`` 运算符。 " +"这个结构体必须包括被用于声明基类型的结构体。换句话说,:c:member:`!tp_basicsize` 必须大于等于基类型的 " +":c:member:`!tp_basicsize`." + +#: ../../c-api/typeobj.rst:639 +msgid "" +"Since every type is a subtype of :py:type:`object`, this struct must include" +" :c:type:`PyObject` or :c:type:`PyVarObject` (depending on whether " +":c:member:`~PyVarObject.ob_size` should be included). These are usually " +"defined by the macro :c:macro:`PyObject_HEAD` or " +":c:macro:`PyObject_VAR_HEAD`, respectively." +msgstr "" +"由于任何类型都是 :py:type:`object` 的子类型,这个结构体必须包括 :c:type:`PyObject` 或 " +":c:type:`PyVarObject` (具体取决于 :c:member:`~PyVarObject.ob_size` 是否应当被包括)。 " +"它们通常是分别由 :c:macro:`PyObject_HEAD` 或 :c:macro:`PyObject_VAR_HEAD` 宏来定义的。" + +#: ../../c-api/typeobj.rst:645 +msgid "" +"The basic size does not include the GC header size, as that header is not " +"part of :c:macro:`PyObject_HEAD`." +msgstr "基础大小不包括 GC 标头大小,因为该标头不是 :c:macro:`PyObject_HEAD` 的一部分。" + +#: ../../c-api/typeobj.rst:648 +msgid "" +"For cases where struct used to declare the base type is unknown, see " +":c:member:`PyType_Spec.basicsize` and :c:func:`PyType_FromMetaclass`." +msgstr "" +"对于用于声明基类型的结构体位置未知的情况,请参见 :c:member:`PyType_Spec.basicsize` 和 " +":c:func:`PyType_FromMetaclass`." + +#: ../../c-api/typeobj.rst:651 +msgid "Notes about alignment:" +msgstr "有关对齐的说明:" + +#: ../../c-api/typeobj.rst:653 +msgid "" +":c:member:`!tp_basicsize` must be a multiple of ``_Alignof(PyObject)``. When" +" using ``sizeof`` on a ``struct`` that includes :c:macro:`PyObject_HEAD`, as" +" recommended, the compiler ensures this. When not using a C ``struct``, or " +"when using compiler extensions like ``__attribute__((packed))``, it is up to" +" you." +msgstr "" +":c:member:`!tp_basicsize` 必须是 ``_Alignof(PyObject)`` 的倍数。当如建议的那样在包括了 " +":c:macro:`PyObject_HEAD` 的 ``struct`` 上使用 ``sizeof`` 时,编译器会确保这一点。当没有使用 C " +"``struct``,或者当使用像 ``__attribute__((packed))`` 这样的编译器扩展时,这将是你的责任。" + +#: ../../c-api/typeobj.rst:658 +msgid "" +"If the variable items require a particular alignment, " +":c:member:`!tp_basicsize` and :c:member:`!tp_itemsize` must each be a " +"multiple of that alignment. For example, if a type's variable part stores a " +"``double``, it is your responsibility that both fields are a multiple of " +"``_Alignof(double)``." +msgstr "" +"如果可变条目需要特定的对齐,则 :c:member:`!tp_basicsize` 和 :c:member:`!tp_itemsize` " +"必须均为该对齐值的倍数。举例来说,如果一个类型的可变部分存储了一个 ``double``,你就要负责让这两个字段都是 " +"``_Alignof(double)`` 的倍数。" + +#: ../../c-api/typeobj.rst:667 +msgid "" +"These fields are inherited separately by subtypes. (That is, if the field is" +" set to zero, :c:func:`PyType_Ready` will copy the value from the base type," +" indicating that the instances do not need additional storage.)" +msgstr "" +"这些字段是由子类型分别来继承的。 (也就是说,如果字段被设为零,则 :c:func:`PyType_Ready` " +"将拷贝来自基类型的值,这表示实例不需要额外的存储。)" + +#: ../../c-api/typeobj.rst:672 +msgid "" +"If the base type has a non-zero :c:member:`~PyTypeObject.tp_itemsize`, it is" +" generally not safe to set :c:member:`~PyTypeObject.tp_itemsize` to a " +"different non-zero value in a subtype (though this depends on the " +"implementation of the base type)." +msgstr "" +"如果基类型有一个非零的 :c:member:`~PyTypeObject.tp_itemsize`,那么在子类型中将 " +":c:member:`~PyTypeObject.tp_itemsize` 设置为不同的非零值通常是不安全的(不过这取决于该基类型的具体实现)。" + +#: ../../c-api/typeobj.rst:681 +msgid "" +"A pointer to the instance destructor function. The function signature is::" +msgstr "一个指向实例析构函数的指针。函数的签名为::" + +#: ../../c-api/typeobj.rst:683 +msgid "void tp_dealloc(PyObject *self);" +msgstr "void tp_dealloc(PyObject *self);" + +#: ../../c-api/typeobj.rst:685 +msgid "" +"The destructor function should remove all references which the instance owns" +" (e.g., call :c:func:`Py_CLEAR`), free all memory buffers owned by the " +"instance, and call the type's :c:member:`~PyTypeObject.tp_free` function to " +"free the object itself." +msgstr "" +"析构函数应移除该实例所拥有的所有引用 (例如,调用 :c:func:`Py_CLEAR`),释放该实例所拥有的所有内存缓冲区,并调用该类型的 " +":c:member:`~PyTypeObject.tp_free` 函数来释放对象本身。" + +#: ../../c-api/typeobj.rst:690 +msgid "" +"If you may call functions that may set the error indicator, you must use " +":c:func:`PyErr_GetRaisedException` and :c:func:`PyErr_SetRaisedException` to" +" ensure you don't clobber a preexisting error indicator (the deallocation " +"could have occurred while processing a different error):" +msgstr "" +"如果您可能会调用那些可能设置错误指示器的函数,则必须使用 :c:func:`PyErr_GetRaisedException` 和 " +":c:func:`PyErr_SetRaisedException`,以确保不会破坏已存在的错误指示器(在处理另一个错误的过程中,可能已发生了内存释放):" + +#: ../../c-api/typeobj.rst:695 +msgid "" +"static void\n" +"foo_dealloc(foo_object *self)\n" +"{\n" +" PyObject *et, *ev, *etb;\n" +" PyObject *exc = PyErr_GetRaisedException();\n" +" ...\n" +" PyErr_SetRaisedException(exc);\n" +"}" +msgstr "" +"static void\n" +"foo_dealloc(foo_object *self)\n" +"{\n" +" PyObject *et, *ev, *etb;\n" +" PyObject *exc = PyErr_GetRaisedException();\n" +" ...\n" +" PyErr_SetRaisedException(exc);\n" +"}" + +#: ../../c-api/typeobj.rst:706 +msgid "" +"The dealloc handler itself must not raise an exception; if it hits an error " +"case it should call :c:func:`PyErr_FormatUnraisable` to log (and clear) an " +"unraisable exception." +msgstr "" +"释放处理程序本身不应引发异常;若遇到错误情况,应调用 :c:func:`PyErr_FormatUnraisable` 记录(并清除)不可抛出的异常。" + +#: ../../c-api/typeobj.rst:710 +msgid "No guarantees are made about when an object is destroyed, except:" +msgstr "关于对象何时被销毁,不做任何保证,除非:" + +#: ../../c-api/typeobj.rst:712 +msgid "" +"Python will destroy an object immediately or some time after the final " +"reference to the object is deleted, unless its finalizer " +"(:c:member:`~PyTypeObject.tp_finalize`) subsequently resurrects the object." +msgstr "" +"Python 会在对象的最后一个引用被删除后立即销毁该对象,或者在一段时间后再销毁,除非其终结器 " +"(:c:member:`~PyTypeObject.tp_finalize`) 在此期间重新激活了该对象。" + +#: ../../c-api/typeobj.rst:716 +msgid "" +"An object will not be destroyed while it is being automatically finalized " +"(:c:member:`~PyTypeObject.tp_finalize`) or automatically cleared " +"(:c:member:`~PyTypeObject.tp_clear`)." +msgstr "" +"在对象被自动终结 (:c:member:`~PyTypeObject.tp_finalize`) 或自动清理 " +"(:c:member:`~PyTypeObject.tp_clear`) 过程中,不会销毁该对象。" + +#: ../../c-api/typeobj.rst:720 +msgid "" +"CPython currently destroys an object immediately from :c:func:`Py_DECREF` " +"when the new reference count is zero, but this may change in a future " +"version." +msgstr "当前 CPython 在引用计数归零时,会立即通过 :c:func:`Py_DECREF` 销毁对象,但这一行为在未来版本中可能会改变。" + +#: ../../c-api/typeobj.rst:724 +msgid "" +"It is recommended to call :c:func:`PyObject_CallFinalizerFromDealloc` at the" +" beginning of :c:member:`!tp_dealloc` to guarantee that the object is always" +" finalized before destruction." +msgstr "" +"建议在 :c:member:`!tp_dealloc` 的开头调用 " +":c:func:`PyObject_CallFinalizerFromDealloc` 以确保对象在销毁前始终被终结。" + +#: ../../c-api/typeobj.rst:728 +msgid "" +"If the type supports garbage collection (the :c:macro:`Py_TPFLAGS_HAVE_GC` " +"flag is set), the destructor should call :c:func:`PyObject_GC_UnTrack` " +"before clearing any member fields." +msgstr "" +"若该类型支持垃圾回收(即设置了 :c:macro:`Py_TPFLAGS_HAVE_GC` 标志),则析构函数应在清理任何成员字段之前调用 " +":c:func:`PyObject_GC_UnTrack`." + +#: ../../c-api/typeobj.rst:732 +msgid "" +"It is permissible to call :c:member:`~PyTypeObject.tp_clear` from " +":c:member:`!tp_dealloc` to reduce code duplication and to guarantee that the" +" object is always cleared before destruction. Beware that " +":c:member:`!tp_clear` might have already been called." +msgstr "" +"允许从 :c:member:`!tp_dealloc` 方法中调用 " +":c:member:`~PyTypeObject.tp_clear`,以减少代码重复并确保对象在销毁前始终被清理。但需注意,:c:member:`!tp_clear`" +" 可能已被提前调用。" + +#: ../../c-api/typeobj.rst:737 +msgid "" +"If the type is heap allocated (:c:macro:`Py_TPFLAGS_HEAPTYPE`), the " +"deallocator should release the owned reference to its type object (via " +":c:func:`Py_DECREF`) after calling the type deallocator. See the example " +"code below.::" +msgstr "" +"如果该类型是堆分配的 (:c:macro:`Py_TPFLAGS_HEAPTYPE`),则释放器应在调用类型释放器之后,释放对其类型对象的自有引用 " +"(通过 :c:func:`Py_DECREF`)。 参见下面的示例代码。::" + +#: ../../c-api/typeobj.rst:742 +msgid "" +"static void\n" +"foo_dealloc(PyObject *op)\n" +"{\n" +" foo_object *self = (foo_object *) op;\n" +" PyObject_GC_UnTrack(self);\n" +" Py_CLEAR(self->ref);\n" +" Py_TYPE(self)->tp_free(self);\n" +"}" +msgstr "" +"static void\n" +"foo_dealloc(PyObject *op)\n" +"{\n" +" foo_object *self = (foo_object *) op;\n" +" PyObject_GC_UnTrack(self);\n" +" Py_CLEAR(self->ref);\n" +" Py_TYPE(self)->tp_free(self);\n" +"}" + +#: ../../c-api/typeobj.rst:751 +msgid "" +":c:member:`!tp_dealloc` must leave the exception status unchanged. If it " +"needs to call something that might raise an exception, the exception state " +"must be backed up first and restored later (after logging any exceptions " +"with :c:func:`PyErr_WriteUnraisable`)." +msgstr "" +":c:member:`!tp_dealloc` 必须保持异常状态不变。如果它需要调用可能引发异常的函数,必须先备份异常状态,之后(在用 " +":c:func:`PyErr_WriteUnraisable` 记录任何异常后)再恢复该状态。" + +#: ../../c-api/typeobj.rst:756 +msgid "Example::" +msgstr "示例:" + +#: ../../c-api/typeobj.rst:758 +msgid "" +"static void\n" +"foo_dealloc(PyObject *self)\n" +"{\n" +" PyObject *exc = PyErr_GetRaisedException();\n" +"\n" +" if (PyObject_CallFinalizerFromDealloc(self) < 0) {\n" +" // self was resurrected.\n" +" goto done;\n" +" }\n" +"\n" +" PyTypeObject *tp = Py_TYPE(self);\n" +"\n" +" if (tp->tp_flags & Py_TPFLAGS_HAVE_GC) {\n" +" PyObject_GC_UnTrack(self);\n" +" }\n" +"\n" +" // Optional, but convenient to avoid code duplication.\n" +" if (tp->tp_clear && tp->tp_clear(self) < 0) {\n" +" PyErr_WriteUnraisable(self);\n" +" }\n" +"\n" +" // Any additional destruction goes here.\n" +"\n" +" tp->tp_free(self);\n" +" self = NULL; // In case PyErr_WriteUnraisable() is called below.\n" +"\n" +" if (tp->tp_flags & Py_TPFLAGS_HEAPTYPE) {\n" +" Py_CLEAR(tp);\n" +" }\n" +"\n" +"done:\n" +" // Optional, if something was called that might have raised an\n" +" // exception.\n" +" if (PyErr_Occurred()) {\n" +" PyErr_WriteUnraisable(self);\n" +" }\n" +" PyErr_SetRaisedException(exc);\n" +"}" +msgstr "" +"static void\n" +"foo_dealloc(PyObject *self)\n" +"{\n" +" PyObject *exc = PyErr_GetRaisedException();\n" +"\n" +" if (PyObject_CallFinalizerFromDealloc(self) < 0) {\n" +" // self 被复活了。\n" +" goto done;\n" +" }\n" +"\n" +" PyTypeObject *tp = Py_TYPE(self);\n" +"\n" +" if (tp->tp_flags & Py_TPFLAGS_HAVE_GC) {\n" +" PyObject_GC_UnTrack(self);\n" +" }\n" +"\n" +" // 可选,但可以避免代码重复,较为方便。\n" +" if (tp->tp_clear && tp->tp_clear(self) < 0) {\n" +" PyErr_WriteUnraisable(self);\n" +" }\n" +"\n" +" // 此处可执行任何额外的销毁操作。\n" +"\n" +" tp->tp_free(self);\n" +" self = NULL; // 若后续调用了 PyErr_WriteUnraisable() 函数。\n" +"\n" +" if (tp->tp_flags & Py_TPFLAGS_HEAPTYPE) {\n" +" Py_CLEAR(tp);\n" +" }\n" +"\n" +"done:\n" +" // 可选操作:若之前调用的操作可能引发了\n" +" // 异常。\n" +" if (PyErr_Occurred()) {\n" +" PyErr_WriteUnraisable(self);\n" +" }\n" +" PyErr_SetRaisedException(exc);\n" +"}" + +#: ../../c-api/typeobj.rst:797 +msgid "" +":c:member:`!tp_dealloc` may be called from any Python thread, not just the " +"thread which created the object (if the object becomes part of a refcount " +"cycle, that cycle might be collected by a garbage collection on any thread)." +" This is not a problem for Python API calls, since the thread on which " +":c:member:`!tp_dealloc` is called with an :term:`attached thread state`. " +"However, if the object being destroyed in turn destroys objects from some " +"other C library, care should be taken to ensure that destroying those " +"objects on the thread which called :c:member:`!tp_dealloc` will not violate " +"any assumptions of the library." +msgstr "" +":c:member:`!tp_dealloc` 可能从任意 Python " +"线程调用,而不仅限于创建该对象的线程(如果对象成为引用循环的一部分,该循环可能由任意线程的垃圾回收操作回收)。这对 Python API " +"调用不是问题,因为调用 :c:member:`!tp_dealloc` 的线程会带有 :term:`attached thread " +"state`。然而,如果被销毁的对象反过来会销毁其他 C 库中的对象,则需要确保在调用 :c:member:`!tp_dealloc` " +"的线程上销毁这些对象不会违反该库的任何假设条件。" + +#: ../../c-api/typeobj.rst:815 ../../c-api/typeobj.rst:1798 +#: ../../c-api/typeobj.rst:2565 +msgid "" +":ref:`life-cycle` for details about how this slot relates to other slots." +msgstr "有关此槽位如何与其他槽位关联的详细信息,请参阅 :ref:`life-cycle`。" + +#: ../../c-api/typeobj.rst:820 +msgid "" +"An optional offset to a per-instance function that implements calling the " +"object using the :ref:`vectorcall protocol `, a more efficient " +"alternative of the simpler :c:member:`~PyTypeObject.tp_call`." +msgstr "" +"一个相对使用 :ref:`vectorcall 协议 ` 实现调用对象的实例级函数的可选的偏移量,这是一种比简单的 " +":c:member:`~PyTypeObject.tp_call` 更有效的替代选择。" + +#: ../../c-api/typeobj.rst:825 +msgid "" +"This field is only used if the flag :c:macro:`Py_TPFLAGS_HAVE_VECTORCALL` is" +" set. If so, this must be a positive integer containing the offset in the " +"instance of a :c:type:`vectorcallfunc` pointer." +msgstr "" +"该字段仅在设置了 :c:macro:`Py_TPFLAGS_HAVE_VECTORCALL` 旗标时使用。在此情况下,它必须为一个包含 " +":c:type:`vectorcallfunc` 指针实例中的偏移量的正整数。" + +#: ../../c-api/typeobj.rst:829 +msgid "" +"The *vectorcallfunc* pointer may be ``NULL``, in which case the instance " +"behaves as if :c:macro:`Py_TPFLAGS_HAVE_VECTORCALL` was not set: calling the" +" instance falls back to :c:member:`~PyTypeObject.tp_call`." +msgstr "" +"*vectorcallfunc* 指针可能为 ``NULL``,在这种情况下实例的行为就像 " +":c:macro:`Py_TPFLAGS_HAVE_VECTORCALL` 没有被设置一样:调用实例操作会回退至 " +":c:member:`~PyTypeObject.tp_call`." + +#: ../../c-api/typeobj.rst:833 +msgid "" +"Any class that sets ``Py_TPFLAGS_HAVE_VECTORCALL`` must also set " +":c:member:`~PyTypeObject.tp_call` and make sure its behaviour is consistent " +"with the *vectorcallfunc* function. This can be done by setting *tp_call* to" +" :c:func:`PyVectorcall_Call`." +msgstr "" +"任何设置了 ``Py_TPFLAGS_HAVE_VECTORCALL`` 的类也必须设置 " +":c:member:`~PyTypeObject.tp_call` 并确保其行为与 *vectorcallfunc* 函数一致。这可以通过将 " +"*tp_call* 设为 :c:func:`PyVectorcall_Call` 来实现。" + +#: ../../c-api/typeobj.rst:840 +msgid "" +"Before version 3.8, this slot was named ``tp_print``. In Python 2.x, it was " +"used for printing to a file. In Python 3.0 to 3.7, it was unused." +msgstr "" +"在 3.8 版之前,这个槽位被命名为 ``tp_print``。在 Python 2.x 中,它被用于打印到文件。在 Python 3.0 至 3.7 " +"中,它没有被使用。" + +#: ../../c-api/typeobj.rst:846 +msgid "" +"Before version 3.12, it was not recommended for :ref:`mutable heap types " +"` to implement the vectorcall protocol. When a user sets " +":attr:`~object.__call__` in Python code, only *tp_call* is updated, likely " +"making it inconsistent with the vectorcall function. Since 3.12, setting " +"``__call__`` will disable vectorcall optimization by clearing the " +":c:macro:`Py_TPFLAGS_HAVE_VECTORCALL` flag." +msgstr "" +"在 3.12 版之前,不推荐 :ref:`可变堆类型 ` 实现 vectorcall 协议。当用户在 Python 代码中设置 " +":attr:`~object.__call__` 时,只有 *tp_call* 会被更新,很可能使它与 vectorcall 函数不一致。自 3.12 " +"起,设置 ``__call__`` 将通过清除 :c:macro:`Py_TPFLAGS_HAVE_VECTORCALL` 旗标来禁用 " +"vectorcall 优化。" + +#: ../../c-api/typeobj.rst:856 +msgid "" +"This field is always inherited. However, the " +":c:macro:`Py_TPFLAGS_HAVE_VECTORCALL` flag is not always inherited. If it's " +"not set, then the subclass won't use :ref:`vectorcall `, except " +"when :c:func:`PyVectorcall_Call` is explicitly called." +msgstr "" +"该字段总是会被继承。但是,:c:macro:`Py_TPFLAGS_HAVE_VECTORCALL` 旗标并不总是会被继承。 " +"如果它未被设置,则子类不会使用 :ref:`vectorcall `,除非显式地调用了 " +":c:func:`PyVectorcall_Call`." + +#: ../../c-api/typeobj.rst:867 +msgid "An optional pointer to the get-attribute-string function." +msgstr "一个指向获取属性字符串函数的可选指针。" + +#: ../../c-api/typeobj.rst:869 +msgid "" +"This field is deprecated. When it is defined, it should point to a function" +" that acts the same as the :c:member:`~PyTypeObject.tp_getattro` function, " +"but taking a C string instead of a Python string object to give the " +"attribute name." +msgstr "" +"该字段已弃用。当它被定义时,应该和 :c:member:`~PyTypeObject.tp_getattro` 指向同一个函数,但接受一个 C " +"字符串参数表示属性名,而不是 Python 字符串对象。" + +#: ../../c-api/typeobj.rst:875 ../../c-api/typeobj.rst:1083 +msgid "" +"Group: :c:member:`~PyTypeObject.tp_getattr`, " +":c:member:`~PyTypeObject.tp_getattro`" +msgstr "" +"分组::c:member:`~PyTypeObject.tp_getattr`, " +":c:member:`~PyTypeObject.tp_getattro`" + +#: ../../c-api/typeobj.rst:877 +msgid "" +"This field is inherited by subtypes together with " +":c:member:`~PyTypeObject.tp_getattro`: a subtype inherits both " +":c:member:`~PyTypeObject.tp_getattr` and " +":c:member:`~PyTypeObject.tp_getattro` from its base type when the subtype's " +":c:member:`~PyTypeObject.tp_getattr` and " +":c:member:`~PyTypeObject.tp_getattro` are both ``NULL``." +msgstr "" +"该字段会被子类型和 :c:member:`~PyTypeObject.tp_getattro` 所继承:当子类型的 " +":c:member:`~PyTypeObject.tp_getattr` 和 :c:member:`~PyTypeObject.tp_getattro`" +" 均为 ``NULL`` 时该子类型将从它的基类型同时继承 :c:member:`~PyTypeObject.tp_getattr` 和 " +":c:member:`~PyTypeObject.tp_getattro`." + +#: ../../c-api/typeobj.rst:886 ../../c-api/typeobj.rst:1098 +msgid "" +"An optional pointer to the function for setting and deleting attributes." +msgstr "一个指向函数以便设置和删除属性的可选指针。" + +#: ../../c-api/typeobj.rst:888 +msgid "" +"This field is deprecated. When it is defined, it should point to a function" +" that acts the same as the :c:member:`~PyTypeObject.tp_setattro` function, " +"but taking a C string instead of a Python string object to give the " +"attribute name." +msgstr "" +"该字段已弃用。当它被定义时,应该和 :c:member:`~PyTypeObject.tp_setattro` 指向同一个函数,但接受一个 C " +"字符串参数表示属性名,而不是 Python 字符串对象。" + +#: ../../c-api/typeobj.rst:894 ../../c-api/typeobj.rst:1111 +msgid "" +"Group: :c:member:`~PyTypeObject.tp_setattr`, " +":c:member:`~PyTypeObject.tp_setattro`" +msgstr "" +"分组::c:member:`~PyTypeObject.tp_setattr`, " +":c:member:`~PyTypeObject.tp_setattro`" + +#: ../../c-api/typeobj.rst:896 +msgid "" +"This field is inherited by subtypes together with " +":c:member:`~PyTypeObject.tp_setattro`: a subtype inherits both " +":c:member:`~PyTypeObject.tp_setattr` and " +":c:member:`~PyTypeObject.tp_setattro` from its base type when the subtype's " +":c:member:`~PyTypeObject.tp_setattr` and " +":c:member:`~PyTypeObject.tp_setattro` are both ``NULL``." +msgstr "" +"该字段会被子类型和 :c:member:`~PyTypeObject.tp_setattro` 所继承:当子类型的 " +":c:member:`~PyTypeObject.tp_setattr` 和 :c:member:`~PyTypeObject.tp_setattro`" +" 均为 ``NULL`` 时该子类型将同时从它的基类型继承 :c:member:`~PyTypeObject.tp_setattr` 和 " +":c:member:`~PyTypeObject.tp_setattro`." + +#: ../../c-api/typeobj.rst:903 +msgid "" +"Pointer to an additional structure that contains fields relevant only to " +"objects which implement :term:`awaitable` and :term:`asynchronous iterator` " +"protocols at the C-level. See :ref:`async-structs` for details." +msgstr "" +"指向一个包含仅与在 C 层级上实现 :term:`awaitable` 和 :term:`asynchronous iterator` " +"协议的对象相关联的字段的附加结构体。请参阅 :ref:`async-structs` 了解详情。" + +#: ../../c-api/typeobj.rst:907 +msgid "Formerly known as ``tp_compare`` and ``tp_reserved``." +msgstr "在之前被称为 ``tp_compare`` 和 ``tp_reserved``。" + +#: ../../c-api/typeobj.rst:912 +msgid "" +"The :c:member:`~PyTypeObject.tp_as_async` field is not inherited, but the " +"contained fields are inherited individually." +msgstr ":c:member:`~PyTypeObject.tp_as_async` 字段不会被继承,但所包含的字段会被单独继承。" + +#: ../../c-api/typeobj.rst:922 +msgid "" +"An optional pointer to a function that implements the built-in function " +":func:`repr`." +msgstr "一个实现了内置函数 :func:`repr` 的函数的可选指针。" + +#: ../../c-api/typeobj.rst:925 +msgid "The signature is the same as for :c:func:`PyObject_Repr`::" +msgstr "该签名与 :c:func:`PyObject_Repr` 的相同::" + +#: ../../c-api/typeobj.rst:927 +msgid "PyObject *tp_repr(PyObject *self);" +msgstr "PyObject *tp_repr(PyObject *self);" + +#: ../../c-api/typeobj.rst:929 +msgid "" +"The function must return a string or a Unicode object. Ideally, this " +"function should return a string that, when passed to :func:`eval`, given a " +"suitable environment, returns an object with the same value. If this is not" +" feasible, it should return a string starting with ``'<'`` and ending with " +"``'>'`` from which both the type and the value of the object can be deduced." +msgstr "" +"该函数必须返回一个字符串或 Unicode 对象。在理想情况下,该函数应当返回一个字符串,当将其传给 :func:`eval` " +"时,只要有合适的环境,就会返回一个具有相同值的对象。如果这不可行,则它应当返回一个以 ``'<'`` 开头并以 ``'>'`` " +"结尾的可被用来推断出对象的类型和值的字符串。" + +#: ../../c-api/typeobj.rst:940 ../../c-api/typeobj.rst:1021 +#: ../../c-api/typeobj.rst:1062 ../../c-api/typeobj.rst:1089 +#: ../../c-api/typeobj.rst:1117 ../../c-api/typeobj.rst:1159 +#: ../../c-api/typeobj.rst:1863 ../../c-api/typeobj.rst:1897 +#: ../../c-api/typeobj.rst:2026 ../../c-api/typeobj.rst:2059 +#: ../../c-api/typeobj.rst:2138 ../../c-api/typeobj.rst:2181 +#: ../../c-api/typeobj.rst:2203 ../../c-api/typeobj.rst:2244 +#: ../../c-api/typeobj.rst:2274 ../../c-api/typeobj.rst:2307 +msgid "**Default:**" +msgstr "**默认:**" + +#: ../../c-api/typeobj.rst:942 +msgid "" +"When this field is not set, a string of the form ``<%s object at %p>`` is " +"returned, where ``%s`` is replaced by the type name, and ``%p`` by the " +"object's memory address." +msgstr "" +"如果未设置该字段,则返回 ``<%s object at %p>`` 形式的字符串,其中 ``%s`` 将替换为类型名称,``%p`` " +"将替换为对象的内存地址。" + +#: ../../c-api/typeobj.rst:949 +msgid "" +"Pointer to an additional structure that contains fields relevant only to " +"objects which implement the number protocol. These fields are documented in" +" :ref:`number-structs`." +msgstr "指向一个附加结构体的指针,其中包含只与执行数字协议的对象相关的字段。这些字段的文档参见 :ref:`number-structs`。" + +#: ../../c-api/typeobj.rst:955 +msgid "" +"The :c:member:`~PyTypeObject.tp_as_number` field is not inherited, but the " +"contained fields are inherited individually." +msgstr ":c:member:`~PyTypeObject.tp_as_number` 字段不会被继承,但所包含的字段会被单独继承。" + +#: ../../c-api/typeobj.rst:961 +msgid "" +"Pointer to an additional structure that contains fields relevant only to " +"objects which implement the sequence protocol. These fields are documented " +"in :ref:`sequence-structs`." +msgstr "指向一个附加结构体的指针,其中包含只与执行序列协议的对象相关的字段。这些字段的文档见 :ref:`sequence-structs`。" + +#: ../../c-api/typeobj.rst:967 +msgid "" +"The :c:member:`~PyTypeObject.tp_as_sequence` field is not inherited, but the" +" contained fields are inherited individually." +msgstr ":c:member:`~PyTypeObject.tp_as_sequence` 字段不会被继承,但所包含的字段会被单独继承。" + +#: ../../c-api/typeobj.rst:973 +msgid "" +"Pointer to an additional structure that contains fields relevant only to " +"objects which implement the mapping protocol. These fields are documented " +"in :ref:`mapping-structs`." +msgstr "指向一个附加结构体的指针,其中包含只与执行映射协议的对象相关的字段。这些字段的文档见 :ref:`mapping-structs`。" + +#: ../../c-api/typeobj.rst:979 +msgid "" +"The :c:member:`~PyTypeObject.tp_as_mapping` field is not inherited, but the " +"contained fields are inherited individually." +msgstr ":c:member:`~PyTypeObject.tp_as_mapping` 字段不会被继承,但所包含的字段会被单独继承。" + +#: ../../c-api/typeobj.rst:989 +msgid "" +"An optional pointer to a function that implements the built-in function " +":func:`hash`." +msgstr "一个指向实现了内置函数 :func:`hash` 的函数的可选指针。" + +#: ../../c-api/typeobj.rst:992 +msgid "The signature is the same as for :c:func:`PyObject_Hash`::" +msgstr "其签名与 :c:func:`PyObject_Hash` 的相同::" + +#: ../../c-api/typeobj.rst:994 +msgid "Py_hash_t tp_hash(PyObject *);" +msgstr "Py_hash_t tp_hash(PyObject *);" + +#: ../../c-api/typeobj.rst:996 +msgid "" +"The value ``-1`` should not be returned as a normal return value; when an " +"error occurs during the computation of the hash value, the function should " +"set an exception and return ``-1``." +msgstr "``-1`` 不应作为正常返回值被返回;当计算哈希值过程中发生错误时,函数应设置一个异常并返回 ``-1``。" + +#: ../../c-api/typeobj.rst:1000 +msgid "" +"When this field is not set (*and* :c:member:`~PyTypeObject.tp_richcompare` " +"is not set), an attempt to take the hash of the object raises " +":exc:`TypeError`. This is the same as setting it to " +":c:func:`PyObject_HashNotImplemented`." +msgstr "" +"当该字段 (*和* :c:member:`~PyTypeObject.tp_richcompare`) 都未设置,尝试对该对象取哈希会引发 " +":exc:`TypeError`。 这与将其设为 :c:func:`PyObject_HashNotImplemented` 相同。" + +#: ../../c-api/typeobj.rst:1004 +msgid "" +"This field can be set explicitly to :c:func:`PyObject_HashNotImplemented` to" +" block inheritance of the hash method from a parent type. This is " +"interpreted as the equivalent of ``__hash__ = None`` at the Python level, " +"causing ``isinstance(o, collections.Hashable)`` to correctly return " +"``False``. Note that the converse is also true - setting ``__hash__ = None``" +" on a class at the Python level will result in the ``tp_hash`` slot being " +"set to :c:func:`PyObject_HashNotImplemented`." +msgstr "" +"此字段可被显式设为 :c:func:`PyObject_HashNotImplemented` 以阻止从父类型继承哈希方法。在 Python " +"层面这被解释为 ``__hash__ = None`` 的等价物,使得 ``isinstance(o, collections.Hashable)`` " +"正确返回 ``False``。请注意反过来也是如此:在 Python 层面设置一个类的 ``__hash__ = None`` 会使得 " +"``tp_hash`` 槽位被设置为 :c:func:`PyObject_HashNotImplemented`。" + +#: ../../c-api/typeobj.rst:1014 ../../c-api/typeobj.rst:1856 +msgid "" +"Group: :c:member:`~PyTypeObject.tp_hash`, " +":c:member:`~PyTypeObject.tp_richcompare`" +msgstr "" +"分组::c:member:`~PyTypeObject.tp_hash`, " +":c:member:`~PyTypeObject.tp_richcompare`" + +#: ../../c-api/typeobj.rst:1016 +msgid "" +"This field is inherited by subtypes together with " +":c:member:`~PyTypeObject.tp_richcompare`: a subtype inherits both of " +":c:member:`~PyTypeObject.tp_richcompare` and " +":c:member:`~PyTypeObject.tp_hash`, when the subtype's " +":c:member:`~PyTypeObject.tp_richcompare` and " +":c:member:`~PyTypeObject.tp_hash` are both ``NULL``." +msgstr "" +"该字段会被子类型同 :c:member:`~PyTypeObject.tp_richcompare` 一起继承:当子类型的 " +":c:member:`~PyTypeObject.tp_richcompare` 和 :c:member:`~PyTypeObject.tp_hash`" +" 均为 ``NULL`` 时子类型将同时继承 :c:member:`~PyTypeObject.tp_richcompare` 和 " +":c:member:`~PyTypeObject.tp_hash`." + +#: ../../c-api/typeobj.rst:1023 +msgid ":c:data:`PyBaseObject_Type` uses :c:func:`PyObject_GenericHash`." +msgstr ":c:data:`PyBaseObject_Type` 使用 :c:func:`PyObject_GenericHash`。" + +#: ../../c-api/typeobj.rst:1030 +msgid "" +"An optional pointer to a function that implements calling the object. This " +"should be ``NULL`` if the object is not callable. The signature is the same" +" as for :c:func:`PyObject_Call`::" +msgstr "" +"一个可选的实现对象调用的指向函数的指针。如果对象不是可调用对象则该值应为 ``NULL``。其签名与 :c:func:`PyObject_Call` " +"的相同::" + +#: ../../c-api/typeobj.rst:1034 +msgid "PyObject *tp_call(PyObject *self, PyObject *args, PyObject *kwargs);" +msgstr "PyObject *tp_call(PyObject *self, PyObject *args, PyObject *kwargs);" + +#: ../../c-api/typeobj.rst:1045 +msgid "" +"An optional pointer to a function that implements the built-in operation " +":func:`str`. (Note that :class:`str` is a type now, and :func:`str` calls " +"the constructor for that type. This constructor calls " +":c:func:`PyObject_Str` to do the actual work, and :c:func:`PyObject_Str` " +"will call this handler.)" +msgstr "" +"一个可选的实现内置 :func:`str` 操作的函数的指针。 (请注意 :class:`str` 现在是一个类型,:func:`str` " +"是调用该类型的构造器。该构造器将调用 :c:func:`PyObject_Str` 执行实际操作,而 :c:func:`PyObject_Str` " +"将调用该处理器。)" + +#: ../../c-api/typeobj.rst:1050 +msgid "The signature is the same as for :c:func:`PyObject_Str`::" +msgstr "其签名与 :c:func:`PyObject_Str` 的相同::" + +#: ../../c-api/typeobj.rst:1052 +msgid "PyObject *tp_str(PyObject *self);" +msgstr "PyObject *tp_str(PyObject *self);" + +#: ../../c-api/typeobj.rst:1054 +msgid "" +"The function must return a string or a Unicode object. It should be a " +"\"friendly\" string representation of the object, as this is the " +"representation that will be used, among other things, by the :func:`print` " +"function." +msgstr "" +"该函数必须返回一个字符串或 Unicode 对象。它应当是一个“友好”的对象字符串表示形式,因为这就是要在 :func:`print` " +"函数中与其他内容一起使用的表示形式。" + +#: ../../c-api/typeobj.rst:1064 +msgid "" +"When this field is not set, :c:func:`PyObject_Repr` is called to return a " +"string representation." +msgstr "当未设置该字段时,将调用 :c:func:`PyObject_Repr` 来返回一个字符串表示形式。" + +#: ../../c-api/typeobj.rst:1072 +msgid "An optional pointer to the get-attribute function." +msgstr "一个指向获取属性字符串函数的可选指针。" + +#: ../../c-api/typeobj.rst:1074 +msgid "The signature is the same as for :c:func:`PyObject_GetAttr`::" +msgstr "其签名与 :c:func:`PyObject_GetAttr` 的相同::" + +#: ../../c-api/typeobj.rst:1076 +msgid "PyObject *tp_getattro(PyObject *self, PyObject *attr);" +msgstr "PyObject *tp_getattro(PyObject *self, PyObject *attr);" + +#: ../../c-api/typeobj.rst:1078 +msgid "" +"It is usually convenient to set this field to " +":c:func:`PyObject_GenericGetAttr`, which implements the normal way of " +"looking for object attributes." +msgstr "可以方便地将该字段设为 :c:func:`PyObject_GenericGetAttr`,它实现了查找对象属性的通常方式。" + +#: ../../c-api/typeobj.rst:1085 +msgid "" +"This field is inherited by subtypes together with " +":c:member:`~PyTypeObject.tp_getattr`: a subtype inherits both " +":c:member:`~PyTypeObject.tp_getattr` and " +":c:member:`~PyTypeObject.tp_getattro` from its base type when the subtype's " +":c:member:`~PyTypeObject.tp_getattr` and " +":c:member:`~PyTypeObject.tp_getattro` are both ``NULL``." +msgstr "" +"该字段会被子类同 :c:member:`~PyTypeObject.tp_getattr` 一起继承:当子类型的 " +":c:member:`~PyTypeObject.tp_getattr` 和 :c:member:`~PyTypeObject.tp_getattro`" +" 均为 ``NULL`` 时子类型将同时继承 :c:member:`~PyTypeObject.tp_getattr` 和 " +":c:member:`~PyTypeObject.tp_getattro`." + +#: ../../c-api/typeobj.rst:1091 +msgid ":c:data:`PyBaseObject_Type` uses :c:func:`PyObject_GenericGetAttr`." +msgstr ":c:data:`PyBaseObject_Type` 使用 :c:func:`PyObject_GenericGetAttr`。" + +#: ../../c-api/typeobj.rst:1100 +msgid "The signature is the same as for :c:func:`PyObject_SetAttr`::" +msgstr "其签名与 :c:func:`PyObject_SetAttr` 的相同::" + +#: ../../c-api/typeobj.rst:1102 +msgid "int tp_setattro(PyObject *self, PyObject *attr, PyObject *value);" +msgstr "int tp_setattro(PyObject *self, PyObject *attr, PyObject *value);" + +#: ../../c-api/typeobj.rst:1104 +msgid "" +"In addition, setting *value* to ``NULL`` to delete an attribute must be " +"supported. It is usually convenient to set this field to " +":c:func:`PyObject_GenericSetAttr`, which implements the normal way of " +"setting object attributes." +msgstr "" +"此外,还必须支持将 *value* 设为 ``NULL`` 来删除属性。通常可以方便地将该字段设为 " +":c:func:`PyObject_GenericSetAttr`,它实现了设置对象属性的通常方式。" + +#: ../../c-api/typeobj.rst:1113 +msgid "" +"This field is inherited by subtypes together with " +":c:member:`~PyTypeObject.tp_setattr`: a subtype inherits both " +":c:member:`~PyTypeObject.tp_setattr` and " +":c:member:`~PyTypeObject.tp_setattro` from its base type when the subtype's " +":c:member:`~PyTypeObject.tp_setattr` and " +":c:member:`~PyTypeObject.tp_setattro` are both ``NULL``." +msgstr "" +"该字段会被子类型同 :c:member:`~PyTypeObject.tp_setattr` 一起继承:当子类型的 " +":c:member:`~PyTypeObject.tp_setattr` 和 :c:member:`~PyTypeObject.tp_setattro`" +" 均为 ``NULL`` 时子类型将同时继承 :c:member:`~PyTypeObject.tp_setattr` 和 " +":c:member:`~PyTypeObject.tp_setattro`." + +#: ../../c-api/typeobj.rst:1119 +msgid ":c:data:`PyBaseObject_Type` uses :c:func:`PyObject_GenericSetAttr`." +msgstr ":c:data:`PyBaseObject_Type` 使用 :c:func:`PyObject_GenericSetAttr`。" + +#: ../../c-api/typeobj.rst:1124 +msgid "" +"Pointer to an additional structure that contains fields relevant only to " +"objects which implement the buffer interface. These fields are documented " +"in :ref:`buffer-structs`." +msgstr "指向一个包含只与实现缓冲区接口的对象相关的字段的附加结构体的指针。这些字段的文档参见 :ref:`buffer-structs`。" + +#: ../../c-api/typeobj.rst:1130 +msgid "" +"The :c:member:`~PyTypeObject.tp_as_buffer` field is not inherited, but the " +"contained fields are inherited individually." +msgstr ":c:member:`~PyTypeObject.tp_as_buffer` 字段不会被继承,但所包含的字段会被单独继承。" + +#: ../../c-api/typeobj.rst:1136 +msgid "" +"This field is a bit mask of various flags. Some flags indicate variant " +"semantics for certain situations; others are used to indicate that certain " +"fields in the type object (or in the extension structures referenced via " +":c:member:`~PyTypeObject.tp_as_number`, " +":c:member:`~PyTypeObject.tp_as_sequence`, " +":c:member:`~PyTypeObject.tp_as_mapping`, and " +":c:member:`~PyTypeObject.tp_as_buffer`) that were historically not always " +"present are valid; if such a flag bit is clear, the type fields it guards " +"must not be accessed and must be considered to have a zero or ``NULL`` value" +" instead." +msgstr "" +"该字段是针对多个旗标的位掩码。某些旗标指明用于特定场景的变化语义;另一些旗标则用于指明类型对象(或通过 " +":c:member:`~PyTypeObject.tp_as_number`, " +":c:member:`~PyTypeObject.tp_as_sequence`, " +":c:member:`~PyTypeObject.tp_as_mapping` 和 " +":c:member:`~PyTypeObject.tp_as_buffer` " +"引用的扩展结构体)中的特定字段,它们在历史上并不总是有效;如果这样的旗标位被清除,则它所保护的类型字段必须不可被访问并且必须被视为具有零或 " +"``NULL`` 值。" + +#: ../../c-api/typeobj.rst:1146 +msgid "" +"Inheritance of this field is complicated. Most flag bits are inherited " +"individually, i.e. if the base type has a flag bit set, the subtype inherits" +" this flag bit. The flag bits that pertain to extension structures are " +"strictly inherited if the extension structure is inherited, i.e. the base " +"type's value of the flag bit is copied into the subtype together with a " +"pointer to the extension structure. The :c:macro:`Py_TPFLAGS_HAVE_GC` flag " +"bit is inherited together with the :c:member:`~PyTypeObject.tp_traverse` and" +" :c:member:`~PyTypeObject.tp_clear` fields, i.e. if the " +":c:macro:`Py_TPFLAGS_HAVE_GC` flag bit is clear in the subtype and the " +":c:member:`~PyTypeObject.tp_traverse` and :c:member:`~PyTypeObject.tp_clear`" +" fields in the subtype exist and have ``NULL`` values." +msgstr "" +"此字段的继承较为复杂。大多数标志位是单独继承的,即如果基类型设置了某个标志位,子类型继承该标志位。与扩展结构体相关的标志位在扩展结构体被继承时严格继承,即基类型的标志位值与指向扩展结构体的指针一起复制到子类型中。:c:macro:`Py_TPFLAGS_HAVE_GC`" +" 标志位与 :c:member:`~PyTypeObject.tp_traverse` 和 " +":c:member:`~PyTypeObject.tp_clear` 字段一起继承,即如果子类型中的 " +":c:macro:`Py_TPFLAGS_HAVE_GC` 标志位未设置,且子类型中的 " +":c:member:`~PyTypeObject.tp_traverse` 和 :c:member:`~PyTypeObject.tp_clear` " +"字段存在且值为 ``NULL``。" + +#: ../../c-api/typeobj.rst:1161 +msgid "" +":c:data:`PyBaseObject_Type` uses ``Py_TPFLAGS_DEFAULT | " +"Py_TPFLAGS_BASETYPE``." +msgstr "" +":c:data:`PyBaseObject_Type` 使用 ``Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE``。" + +#: ../../c-api/typeobj.rst:1164 +msgid "**Bit Masks:**" +msgstr "**位掩码:**" + +#: ../../c-api/typeobj.rst:1168 +msgid "" +"The following bit masks are currently defined; these can be ORed together " +"using the ``|`` operator to form the value of the " +":c:member:`~PyTypeObject.tp_flags` field. The macro " +":c:func:`PyType_HasFeature` takes a type and a flags value, *tp* and *f*, " +"and checks whether ``tp->tp_flags & f`` is non-zero." +msgstr "" +"目前定义了以下位掩码;可以使用 ``|`` 运算符对它们进行 OR 运算以形成 :c:member:`~PyTypeObject.tp_flags` " +"字段的值。宏 :c:func:`PyType_HasFeature` 接受一个类型和一个旗标值 *tp* 和 *f*,并检查 " +"``tp->tp_flags & f`` 是否为非零值。" + +#: ../../c-api/typeobj.rst:1175 +msgid "" +"This bit is set when the type object itself is allocated on the heap, for " +"example, types created dynamically using :c:func:`PyType_FromSpec`. In this" +" case, the :c:member:`~PyObject.ob_type` field of its instances is " +"considered a reference to the type, and the type object is INCREF'ed when a " +"new instance is created, and DECREF'ed when an instance is destroyed (this " +"does not apply to instances of subtypes; only the type referenced by the " +"instance's ob_type gets INCREF'ed or DECREF'ed). Heap types should also " +":ref:`support garbage collection ` as they can " +"form a reference cycle with their own module object." +msgstr "" +"当类型对象本身在堆上被分配时会设置这个比特位,例如,使用 :c:func:`PyType_FromSpec` 动态创建的类型。在此情况下,其实例的 " +":c:member:`~PyObject.ob_type` 字段会被视为指向该类型的引用,而类型对象将在一个新实例被创建时执行 " +"INCREF,并在实例被销毁时执行 DECREF(这不会应用于子类型的实例;只有实例的 ob_type 所引用的类型会执行 INCREF 和 " +"DECREF)。堆类型应当也 :ref:`支持垃圾回收 ` " +"因为它们会形成对它们自己的模块对象的循环引用。" + +#: ../../c-api/typeobj.rst:1186 ../../c-api/typeobj.rst:1197 +#: ../../c-api/typeobj.rst:1207 ../../c-api/typeobj.rst:1217 +#: ../../c-api/typeobj.rst:1249 +msgid "???" +msgstr "???" + +#: ../../c-api/typeobj.rst:1191 +msgid "" +"This bit is set when the type can be used as the base type of another type." +" If this bit is clear, the type cannot be subtyped (similar to a \"final\" " +"class in Java)." +msgstr "" +"当此类型可被用作另一个类型的基类型时该比特位将被设置。如果该比特位被清除,则此类型将无法被子类型化(类似于 Java 中的 \"final\" 类)。" + +#: ../../c-api/typeobj.rst:1202 +msgid "" +"This bit is set when the type object has been fully initialized by " +":c:func:`PyType_Ready`." +msgstr "当此类型对象通过 :c:func:`PyType_Ready` 被完全初始化时该比特位将被设置。" + +#: ../../c-api/typeobj.rst:1212 +msgid "" +"This bit is set while :c:func:`PyType_Ready` is in the process of " +"initializing the type object." +msgstr "当 :c:func:`PyType_Ready` 处在初始化此类型对象过程中时该比特位将被设置。" + +#: ../../c-api/typeobj.rst:1222 +msgid "" +"This bit is set when the object supports garbage collection. If this bit is" +" set, memory for new instances (see :c:member:`~PyTypeObject.tp_alloc`) must" +" be allocated using :c:macro:`PyObject_GC_New` or " +":c:func:`PyType_GenericAlloc` and deallocated (see " +":c:member:`~PyTypeObject.tp_free`) using :c:func:`PyObject_GC_Del`. More " +"information in section :ref:`supporting-cycle-detection`." +msgstr "" +"当对象支持垃圾回收时,此比特位被设置。如果设置了此位,新实例 (参见 :c:member:`~PyTypeObject.tp_alloc`) " +"的内存必须使用 :c:macro:`PyObject_GC_New` 或 :c:func:`PyType_GenericAlloc` 分配,并使用 " +":c:func:`PyObject_GC_Del` 释放 (参见 :c:member:`~PyTypeObject.tp_free`)。 更多信息见 " +":ref:`supporting-cycle-detection` 部分。" + +#: ../../c-api/typeobj.rst:1231 ../../c-api/typeobj.rst:1643 +#: ../../c-api/typeobj.rst:1789 +msgid "" +"Group: :c:macro:`Py_TPFLAGS_HAVE_GC`, :c:member:`~PyTypeObject.tp_traverse`," +" :c:member:`~PyTypeObject.tp_clear`" +msgstr "" +"分组::c:macro:`Py_TPFLAGS_HAVE_GC`, :c:member:`~PyTypeObject.tp_traverse`, " +":c:member:`~PyTypeObject.tp_clear`" + +#: ../../c-api/typeobj.rst:1233 +msgid "" +"The :c:macro:`Py_TPFLAGS_HAVE_GC` flag bit is inherited together with the " +":c:member:`~PyTypeObject.tp_traverse` and :c:member:`~PyTypeObject.tp_clear`" +" fields, i.e. if the :c:macro:`Py_TPFLAGS_HAVE_GC` flag bit is clear in the" +" subtype and the :c:member:`~PyTypeObject.tp_traverse` and " +":c:member:`~PyTypeObject.tp_clear` fields in the subtype exist and have " +"``NULL`` values." +msgstr "" +":c:macro:`Py_TPFLAGS_HAVE_GC` 旗标位会与 :c:member:`~PyTypeObject.tp_traverse` 和 " +":c:member:`~PyTypeObject.tp_clear` 字段一起被继承,也就是说,如果 " +":c:macro:`Py_TPFLAGS_HAVE_GC` 旗标位在子类型中被清空并且子类型中的 " +":c:member:`~PyTypeObject.tp_traverse` 和 :c:member:`~PyTypeObject.tp_clear` " +"字段存在并具有 ``NULL`` 值的话。" + +#: ../../c-api/typeobj.rst:1243 +msgid "" +"This is a bitmask of all the bits that pertain to the existence of certain " +"fields in the type object and its extension structures. Currently, it " +"includes the following bits: :c:macro:`Py_TPFLAGS_HAVE_STACKLESS_EXTENSION`." +msgstr "" +"这是一个从属于类型对象及其扩展结构体的存在的所有位的位掩码。目前,它包括以下的位::c:macro:`Py_TPFLAGS_HAVE_STACKLESS_EXTENSION`." + +#: ../../c-api/typeobj.rst:1254 +msgid "This bit indicates that objects behave like unbound methods." +msgstr "这个位指明对象的行为类似于未绑定方法。" + +#: ../../c-api/typeobj.rst:1256 +msgid "If this flag is set for ``type(meth)``, then:" +msgstr "如果为 ``type(meth)`` 设置了该旗标,那么:" + +#: ../../c-api/typeobj.rst:1258 +msgid "" +"``meth.__get__(obj, cls)(*args, **kwds)`` (with ``obj`` not None) must be " +"equivalent to ``meth(obj, *args, **kwds)``." +msgstr "" +"``meth.__get__(obj, cls)(*args, **kwds)`` (其中 ``obj`` 不为 None) 必须等价于 " +"``meth(obj, *args, **kwds)``." + +#: ../../c-api/typeobj.rst:1261 +msgid "" +"``meth.__get__(None, cls)(*args, **kwds)`` must be equivalent to " +"``meth(*args, **kwds)``." +msgstr "" +"``meth.__get__(None, cls)(*args, **kwds)`` 必须等价于 ``meth(*args, **kwds)``。" + +#: ../../c-api/typeobj.rst:1264 +msgid "" +"This flag enables an optimization for typical method calls like " +"``obj.meth()``: it avoids creating a temporary \"bound method\" object for " +"``obj.meth``." +msgstr "此旗标为 ``obj.meth()`` 这样的典型方法调用启用优化:它将避免为 ``obj.meth`` 创建临时的“绑定方法”对象。" + +#: ../../c-api/typeobj.rst:1272 +msgid "" +"This flag is never inherited by types without the " +":c:macro:`Py_TPFLAGS_IMMUTABLETYPE` flag set. For extension types, it is " +"inherited whenever :c:member:`~PyTypeObject.tp_descr_get` is inherited." +msgstr "" +"此旗标绝不会被没有设置 :c:macro:`Py_TPFLAGS_IMMUTABLETYPE` 旗标的类型所继承。对于扩展类型,当 " +":c:member:`~PyTypeObject.tp_descr_get` 被继承时它也会被继承。" + +#: ../../c-api/typeobj.rst:1278 +msgid "" +"This bit indicates that instances of the class have a " +":attr:`~object.__dict__` attribute, and that the space for the dictionary is" +" managed by the VM." +msgstr "该比特位指明类的实例具有 :attr:`~object.__dict__` 属性,并且该字典的空间是由 VM 管理的。" + +#: ../../c-api/typeobj.rst:1281 +msgid "If this flag is set, :c:macro:`Py_TPFLAGS_HAVE_GC` should also be set." +msgstr "如果设置了该旗标,则 :c:macro:`Py_TPFLAGS_HAVE_GC` 也应当被设置。" + +#: ../../c-api/typeobj.rst:1283 +msgid "" +"The type traverse function must call :c:func:`PyObject_VisitManagedDict` and" +" its clear function must call :c:func:`PyObject_ClearManagedDict`." +msgstr "" +"类型遍历函数必须调用 :c:func:`PyObject_VisitManagedDict` 而它的清空函数必须调用 " +":c:func:`PyObject_ClearManagedDict`." + +#: ../../c-api/typeobj.rst:1290 +msgid "" +"This flag is inherited unless the :c:member:`~PyTypeObject.tp_dictoffset` " +"field is set in a superclass." +msgstr "此旗标将被继承,除非某个超类设置了 :c:member:`~PyTypeObject.tp_dictoffset` 字段。" + +#: ../../c-api/typeobj.rst:1296 +msgid "" +"This bit indicates that instances of the class should be weakly " +"referenceable." +msgstr "该比特位表示类的实例应当是可被弱引用的。" + +#: ../../c-api/typeobj.rst:1303 +msgid "" +"This flag is inherited unless the " +":c:member:`~PyTypeObject.tp_weaklistoffset` field is set in a superclass." +msgstr "此旗标将被继承,除非某个超类设置了 :c:member:`~PyTypeObject.tp_weaklistoffset` 字段。" + +#: ../../c-api/typeobj.rst:1309 +msgid "" +"Only usable with variable-size types, i.e. ones with non-zero " +":c:member:`~PyTypeObject.tp_itemsize`." +msgstr "仅适用于可变大小的类型,也就是说,具有非零 :c:member:`~PyTypeObject.tp_itemsize` 值的类型。" + +#: ../../c-api/typeobj.rst:1312 +msgid "" +"Indicates that the variable-sized portion of an instance of this type is at " +"the end of the instance's memory area, at an offset of " +"``Py_TYPE(obj)->tp_basicsize`` (which may be different in each subclass)." +msgstr "" +"表示此类型的实例的可变大小部分位于该实例内存区的末尾,其偏移量为 ``Py_TYPE(obj)->tp_basicsize`` (每个子类可能不一样)。" + +#: ../../c-api/typeobj.rst:1317 +msgid "" +"When setting this flag, be sure that all superclasses either use this memory" +" layout, or are not variable-sized. Python does not check this." +msgstr "当设置此旗标时,请确保所有超类要么使用此内存布局,要么不是可变大小。Python 不会检查这一点。" + +#: ../../c-api/typeobj.rst:1325 +msgid "This flag is inherited." +msgstr "这个旗标会被继承。" + +#: ../../c-api/typeobj.rst:1339 +msgid "" +"Functions such as :c:func:`PyLong_Check` will call " +":c:func:`PyType_FastSubclass` with one of these flags to quickly determine " +"if a type is a subclass of a built-in type; such specific checks are faster " +"than a generic check, like :c:func:`PyObject_IsInstance`. Custom types that " +"inherit from built-ins should have their :c:member:`~PyTypeObject.tp_flags` " +"set appropriately, or the code that interacts with such types will behave " +"differently depending on what kind of check is used." +msgstr "" +"诸如 :c:func:`PyLong_Check` 之类的函数将使用这些标志之一调用 " +":c:func:`PyType_FastSubclass`,以快速判断类型是否为内置类型的子类;此类特定检查比通用检查 (如 " +":c:func:`PyObject_IsInstance`) 更快。继承自内置类型的自定义类型应正确设置其 " +":c:member:`~PyTypeObject.tp_flags`,否则与这些类型交互的代码将根据所使用的检查类型表现出不同的行为。" + +#: ../../c-api/typeobj.rst:1350 +msgid "" +"This bit is set when the :c:member:`~PyTypeObject.tp_finalize` slot is " +"present in the type structure." +msgstr "当类型结构体中存在 :c:member:`~PyTypeObject.tp_finalize` 槽位时会设置这个比特位。" + +#: ../../c-api/typeobj.rst:1355 +msgid "" +"This flag isn't necessary anymore, as the interpreter assumes the " +":c:member:`~PyTypeObject.tp_finalize` slot is always present in the type " +"structure." +msgstr "" +"此旗标已不再是必要的,因为解释器会假定类型结构体中总是存在 :c:member:`~PyTypeObject.tp_finalize` 槽位。" + +#: ../../c-api/typeobj.rst:1366 +msgid "" +"This bit is set when the class implements the :ref:`vectorcall protocol " +"`. See :c:member:`~PyTypeObject.tp_vectorcall_offset` for " +"details." +msgstr "" +"当类实现了 :ref:`vectorcall 协议 ` 时会设置这个比特位。请参阅 " +":c:member:`~PyTypeObject.tp_vectorcall_offset` 了解详情。" + +#: ../../c-api/typeobj.rst:1372 +msgid "" +"This bit is inherited if :c:member:`~PyTypeObject.tp_call` is also " +"inherited." +msgstr "如果继承了 :c:member:`~PyTypeObject.tp_call` 则也会继承这个比特位。" + +#: ../../c-api/typeobj.rst:1375 +msgid "as ``_Py_TPFLAGS_HAVE_VECTORCALL``" +msgstr "同 ``_Py_TPFLAGS_HAVE_VECTORCALL``" + +#: ../../c-api/typeobj.rst:1379 +msgid "" +"Renamed to the current name, without the leading underscore. The old " +"provisional name is :term:`soft deprecated`." +msgstr "重命名为当前名称,不带开头的下划线。旧的暂定名称已设为 :term:`soft deprecated`。" + +#: ../../c-api/typeobj.rst:1384 +msgid "" +"This flag is now removed from a class when the class's " +":py:meth:`~object.__call__` method is reassigned." +msgstr "现在当类的 :py:meth:`~object.__call__` 方法被重新赋值时该旗标将从类中移除。" + +#: ../../c-api/typeobj.rst:1387 +msgid "This flag can now be inherited by mutable classes." +msgstr "现在该旗标能被可变类所继承。" + +#: ../../c-api/typeobj.rst:1391 +msgid "" +"This bit is set for type objects that are immutable: type attributes cannot " +"be set nor deleted." +msgstr "不可变的类型对象会设置这个比特位:类型属性无法被设置或删除。" + +#: ../../c-api/typeobj.rst:1393 +msgid "" +":c:func:`PyType_Ready` automatically applies this flag to :ref:`static types" +" `." +msgstr ":c:func:`PyType_Ready` 会自动对 :ref:`静态类型 ` 应用这个旗标。" + +#: ../../c-api/typeobj.rst:1398 ../../c-api/typeobj.rst:1507 +#: ../../c-api/typeobj.rst:1519 +msgid "This flag is not inherited." +msgstr "这个旗标不会被继承。" + +#: ../../c-api/typeobj.rst:1404 +msgid "" +"Disallow creating instances of the type: set " +":c:member:`~PyTypeObject.tp_new` to NULL and don't create the ``__new__`` " +"key in the type dictionary." +msgstr "" +"不允许创建此类型的实例:将 :c:member:`~PyTypeObject.tp_new` 设为 NULL 并且不会在类型字典中创建 " +"``__new__`` 键。" + +#: ../../c-api/typeobj.rst:1408 +msgid "" +"The flag must be set before creating the type, not after. For example, it " +"must be set before :c:func:`PyType_Ready` is called on the type." +msgstr "这个旗标必须在创建该类型之前设置,而不是在之后。例如,它必须在该类型调用 :c:func:`PyType_Ready` 之前被设置。" + +#: ../../c-api/typeobj.rst:1411 +msgid "" +"The flag is set automatically on :ref:`static types ` if " +":c:member:`~PyTypeObject.tp_base` is NULL or ``&PyBaseObject_Type`` and " +":c:member:`~PyTypeObject.tp_new` is NULL." +msgstr "" +"如果 :c:member:`~PyTypeObject.tp_base` 为 NULL 或者 ``&PyBaseObject_Type`` 和 " +":c:member:`~PyTypeObject.tp_new` 为 NULL 则该旗标会在 :ref:`静态类型 ` " +"上自动设置。" + +#: ../../c-api/typeobj.rst:1417 +msgid "" +"This flag is not inherited. However, subclasses will not be instantiable " +"unless they provide a non-NULL :c:member:`~PyTypeObject.tp_new` (which is " +"only possible via the C API)." +msgstr "" +"这个旗标不会被继承。但是,子类将不能被实例化,除非它们提供了不为 NULL 的 :c:member:`~PyTypeObject.tp_new` " +"(这只能通过 C API 实现)。" + +#: ../../c-api/typeobj.rst:1424 +msgid "" +"To disallow instantiating a class directly but allow instantiating its " +"subclasses (e.g. for an :term:`abstract base class`), do not use this flag. " +"Instead, make :c:member:`~PyTypeObject.tp_new` only succeed for subclasses." +msgstr "" +"要禁止直接实例化一个类但允许实例化其子类 (例如对于 :term:`abstract base class`),请勿使用此旗标。替代的做法是,让 " +":c:member:`~PyTypeObject.tp_new` 只对子类可用。" + +#: ../../c-api/typeobj.rst:1435 +msgid "" +"This bit indicates that instances of the class may match mapping patterns " +"when used as the subject of a :keyword:`match` block. It is automatically " +"set when registering or subclassing :class:`collections.abc.Mapping`, and " +"unset when registering :class:`collections.abc.Sequence`." +msgstr "" +"这个比特位指明该类的实例可以在被用作 :keyword:`match` 代码块的目标时匹配映射模式。它会在注册或子类化 " +":class:`collections.abc.Mapping` 时自动设置,并在注册 " +":class:`collections.abc.Sequence` 时取消设置。" + +#: ../../c-api/typeobj.rst:1442 ../../c-api/typeobj.rst:1464 +msgid "" +":c:macro:`Py_TPFLAGS_MAPPING` and :c:macro:`Py_TPFLAGS_SEQUENCE` are " +"mutually exclusive; it is an error to enable both flags simultaneously." +msgstr "" +":c:macro:`Py_TPFLAGS_MAPPING` 和 :c:macro:`Py_TPFLAGS_SEQUENCE` " +"是互斥的;同时启用两个旗标将导致报错。" + +#: ../../c-api/typeobj.rst:1447 +msgid "" +"This flag is inherited by types that do not already set " +":c:macro:`Py_TPFLAGS_SEQUENCE`." +msgstr "这个旗标将被尚未设置 :c:macro:`Py_TPFLAGS_SEQUENCE` 的类型所继承。" + +#: ../../c-api/typeobj.rst:1450 ../../c-api/typeobj.rst:1472 +msgid ":pep:`634` -- Structural Pattern Matching: Specification" +msgstr ":pep:`634` —— 结构化模式匹配:规范" + +#: ../../c-api/typeobj.rst:1457 +msgid "" +"This bit indicates that instances of the class may match sequence patterns " +"when used as the subject of a :keyword:`match` block. It is automatically " +"set when registering or subclassing :class:`collections.abc.Sequence`, and " +"unset when registering :class:`collections.abc.Mapping`." +msgstr "" +"这个比特位指明该类的实例可以在被用作 :keyword:`match` 代码块的目标时匹配序列模式。它会在注册或子类化 " +":class:`collections.abc.Sequence` 时自动设置,并在注册 " +":class:`collections.abc.Mapping` 时取消设置。" + +#: ../../c-api/typeobj.rst:1469 +msgid "" +"This flag is inherited by types that do not already set " +":c:macro:`Py_TPFLAGS_MAPPING`." +msgstr "这个旗标将被尚未设置 :c:macro:`Py_TPFLAGS_MAPPING` 的类型所继承。" + +#: ../../c-api/typeobj.rst:1479 +msgid "" +"Internal. Do not set or unset this flag. To indicate that a class has " +"changed call :c:func:`PyType_Modified`" +msgstr "内部使用。请不要设置或取消设置此旗标。用于指明一个类具有被修改的调用 :c:func:`PyType_Modified`" + +#: ../../c-api/typeobj.rst:1483 +msgid "" +"This flag is present in header files, but is not be used. It will be removed" +" in a future version of CPython" +msgstr "此旗标存在于头文件中,但未被使用。它将在未来某个 CPython 版本中被移除。" + +#: ../../c-api/typeobj.rst:1489 +msgid "" +"This macro does nothing. Historically, this would indicate that the " +":c:member:`~PyTypeObject.tp_version_tag` field was available and " +"initialized." +msgstr "" + +#: ../../c-api/typeobj.rst:1499 +msgid "" +"This bit indicates that instances of this type will have an \"inline " +"values\" array (containing the object's attributes) placed directly after " +"the end of the object." +msgstr "该比特位表明此类型的实例将有一个“内联值”数组(包含对象的属性)直接放到对象末尾位置之后。" + +#: ../../c-api/typeobj.rst:1503 +msgid "This requires that :c:macro:`Py_TPFLAGS_HAVE_GC` is set." +msgstr "这需要设置 :c:macro:`Py_TPFLAGS_HAVE_GC`。" + +#: ../../c-api/typeobj.rst:1514 +msgid "" +"This bit indicates that this is an abstract type and therefore cannot be " +"instantiated." +msgstr "该比特位表明这是一个抽象类型因此无法被实例化。" + +#: ../../c-api/typeobj.rst:1522 +msgid ":mod:`abc`" +msgstr ":mod:`abc`" + +#: ../../c-api/typeobj.rst:1527 +msgid "" +"Internal. Do not set or unset this flag. Historically, this was a reserved " +"flag for use in Stackless Python." +msgstr "内部使用。 请不要设置或取消设置此旗标。 在历史上,这是供无栈式 Stackless Python 使用的保留旗标。" + +#: ../../c-api/typeobj.rst:1531 +msgid "" +"This flag is present in header files, but is not be used. This may be " +"removed in a future version of CPython." +msgstr "此旗标存在于头文件中,但未被使用。 它可能会在未来某个 CPython 版本中被移除。" + +#: ../../c-api/typeobj.rst:1539 +msgid "" +"An optional pointer to a NUL-terminated C string giving the docstring for " +"this type object. This is exposed as the :attr:`~type.__doc__` attribute on" +" the type and instances of the type." +msgstr "" +"一个可选的指向给出该类型对象的文档字符串的以 NUL 结束的 C 字符串的指针。该指针被暴露为类型和类型实例上的 " +":attr:`~type.__doc__` 属性。" + +#: ../../c-api/typeobj.rst:1545 +msgid "This field is *not* inherited by subtypes." +msgstr "这个字段 *不会* 被子类型继承。" + +#: ../../c-api/typeobj.rst:1552 +msgid "" +"An optional pointer to a traversal function for the garbage collector. This" +" is only used if the :c:macro:`Py_TPFLAGS_HAVE_GC` flag bit is set. The " +"signature is::" +msgstr "" +"一个可选的指向针对垃圾回收器的遍历函数的指针。该指针仅会在设置了 :c:macro:`Py_TPFLAGS_HAVE_GC` 旗标位时被使用。 " +"函数签名为::" + +#: ../../c-api/typeobj.rst:1555 +msgid "int tp_traverse(PyObject *self, visitproc visit, void *arg);" +msgstr "int tp_traverse(PyObject *self, visitproc visit, void *arg);" + +#: ../../c-api/typeobj.rst:1557 ../../c-api/typeobj.rst:1784 +msgid "" +"More information about Python's garbage collection scheme can be found in " +"section :ref:`supporting-cycle-detection`." +msgstr "有关 Python 垃圾回收方案的更多信息可在 :ref:`supporting-cycle-detection` 一节中查看。" + +#: ../../c-api/typeobj.rst:1560 +msgid "" +"The :c:member:`~PyTypeObject.tp_traverse` pointer is used by the garbage " +"collector to detect reference cycles. A typical implementation of a " +":c:member:`~PyTypeObject.tp_traverse` function simply calls " +":c:func:`Py_VISIT` on each of the instance's members that are Python objects" +" that the instance owns. For example, this is function " +":c:func:`!local_traverse` from the :mod:`!_thread` extension module::" +msgstr "" +":c:member:`~PyTypeObject.tp_traverse` 指针被垃圾回收器用来检测循环引用。 " +":c:member:`~PyTypeObject.tp_traverse` 函数的典型实现会在实例的每个属于该实例所拥有的 Python " +"对象的成员上简单地调用 :c:func:`Py_VISIT`。例如,以下是来自 :mod:`!_thread` 扩展模块的函数 " +":c:func:`!local_traverse`::" + +#: ../../c-api/typeobj.rst:1566 +msgid "" +"static int\n" +"local_traverse(PyObject *op, visitproc visit, void *arg)\n" +"{\n" +" localobject *self = (localobject *) op;\n" +" Py_VISIT(self->args);\n" +" Py_VISIT(self->kw);\n" +" Py_VISIT(self->dict);\n" +" return 0;\n" +"}" +msgstr "" +"static int\n" +"local_traverse(PyObject *op, visitproc visit, void *arg)\n" +"{\n" +" localobject *self = (localobject *) op;\n" +" Py_VISIT(self->args);\n" +" Py_VISIT(self->kw);\n" +" Py_VISIT(self->dict);\n" +" return 0;\n" +"}" + +#: ../../c-api/typeobj.rst:1576 +msgid "" +"Note that :c:func:`Py_VISIT` is called only on those members that can " +"participate in reference cycles. Although there is also a ``self->key`` " +"member, it can only be ``NULL`` or a Python string and therefore cannot be " +"part of a reference cycle." +msgstr "" +"请注意 :c:func:`Py_VISIT` 仅能在可以参加循环引用的成员上被调用。虽然还存在一个 ``self->key`` 成员,但它只能为 " +"``NULL`` 或 Python 字符串因而不能成为循环引用的一部分。" + +#: ../../c-api/typeobj.rst:1580 +msgid "" +"On the other hand, even if you know a member can never be part of a cycle, " +"as a debugging aid you may want to visit it anyway just so the :mod:`gc` " +"module's :func:`~gc.get_referents` function will include it." +msgstr "" +"在另一方面,即使你知道某个成员永远不会成为循环引用的一部分,作为调试的辅助你仍然可能想要访问它因此 :mod:`gc` 模块的 " +":func:`~gc.get_referents` 函数将会包括它。" + +#: ../../c-api/typeobj.rst:1584 +msgid "" +"Heap types (:c:macro:`Py_TPFLAGS_HEAPTYPE`) must visit their type with::" +msgstr "堆类型 (:c:macro:`Py_TPFLAGS_HEAPTYPE`) 必须这样访问其类型::" + +#: ../../c-api/typeobj.rst:1586 +msgid "Py_VISIT(Py_TYPE(self));" +msgstr "Py_VISIT(Py_TYPE(self));" + +#: ../../c-api/typeobj.rst:1588 +msgid "" +"It is only needed since Python 3.9. To support Python 3.8 and older, this " +"line must be conditional::" +msgstr "它只是从 Python 3.9 开始才需要。为支持 Python 3.8 和更旧的版本,这一行必须是有条件的::" + +#: ../../c-api/typeobj.rst:1591 +msgid "" +"#if PY_VERSION_HEX >= 0x03090000\n" +" Py_VISIT(Py_TYPE(self));\n" +"#endif" +msgstr "" +"#if PY_VERSION_HEX >= 0x03090000\n" +" Py_VISIT(Py_TYPE(self));\n" +"#endif" + +#: ../../c-api/typeobj.rst:1595 +msgid "" +"If the :c:macro:`Py_TPFLAGS_MANAGED_DICT` bit is set in the " +":c:member:`~PyTypeObject.tp_flags` field, the traverse function must call " +":c:func:`PyObject_VisitManagedDict` like this::" +msgstr "" +"如果在 :c:member:`~PyTypeObject.tp_flags` 字段中设置了 " +":c:macro:`Py_TPFLAGS_MANAGED_DICT` 比特位,则遍历函数必须这样调用 " +":c:func:`PyObject_VisitManagedDict`::" + +#: ../../c-api/typeobj.rst:1599 +msgid "PyObject_VisitManagedDict((PyObject*)self, visit, arg);" +msgstr "PyObject_VisitManagedDict((PyObject*)self, visit, arg);" + +#: ../../c-api/typeobj.rst:1602 +msgid "" +"When implementing :c:member:`~PyTypeObject.tp_traverse`, only the members " +"that the instance *owns* (by having :term:`strong references ` to them) must be visited. For instance, if an object supports " +"weak references via the :c:member:`~PyTypeObject.tp_weaklist` slot, the " +"pointer supporting the linked list (what *tp_weaklist* points to) must " +"**not** be visited as the instance does not directly own the weak references" +" to itself (the weakreference list is there to support the weak reference " +"machinery, but the instance has no strong reference to the elements inside " +"it, as they are allowed to be removed even if the instance is still alive)." +msgstr "" +"当实现 :c:member:`~PyTypeObject.tp_traverse` 时,只有实例所 *拥有* 的成员 (就是有指向它们的 " +":term:`强引用 `) 才必须被访问。举例来说,如果一个对象通过 " +":c:member:`~PyTypeObject.tp_weaklist` 槽位支持弱引用,那么支持链表 (*tp_weaklist* 所指向的对象) " +"的指针就 **不能** 被访问因为实例并不直接拥有指向自身的弱引用 " +"(弱引用列表被用来支持弱引用机制,但实例没有指向其中的元素的强引用,因为即使实例还存在它们也允许被删除)。" + +#: ../../c-api/typeobj.rst:1614 +msgid "" +"The traversal function must not have any side effects. It must not modify " +"the reference counts of any Python objects nor create or destroy any Python " +"objects." +msgstr "遍历函数不能有任何附带影响。它不能修改任何 Python 对象的引用计数也不能创建或销毁任何 Python 对象。" + +#: ../../c-api/typeobj.rst:1618 +msgid "" +"Note that :c:func:`Py_VISIT` requires the *visit* and *arg* parameters to " +":c:func:`!local_traverse` to have these specific names; don't name them just" +" anything." +msgstr "" +"请注意 :c:func:`Py_VISIT` 要求传给 :c:func:`!local_traverse` 的 *visit* 和 *arg* " +"形参具有指定的名称;不要随意命名它们。" + +#: ../../c-api/typeobj.rst:1622 +msgid "" +"Instances of :ref:`heap-allocated types ` hold a reference to " +"their type. Their traversal function must therefore either visit " +":c:func:`Py_TYPE(self) `, or delegate this responsibility by " +"calling ``tp_traverse`` of another heap-allocated type (such as a heap-" +"allocated superclass). If they do not, the type object may not be garbage-" +"collected." +msgstr "" +":ref:`堆分配类型 ` 的实例会持有一个指向其类型的引用。因此它们的遍历函数必须要么访问 " +":c:func:`Py_TYPE(self) `,要么通过调用其他堆分配类型(例如一个堆分配超类)的 ``tp_traverse`` " +"将此任务委托出去。如果没有这样做,类型对象可能不会被垃圾回收。" + +#: ../../c-api/typeobj.rst:1631 +msgid "" +"The :c:member:`~PyTypeObject.tp_traverse` function can be called from any " +"thread." +msgstr ":c:member:`~PyTypeObject.tp_traverse` 函数可以从任何线程调用。" + +#: ../../c-api/typeobj.rst:1636 +msgid "" +"Heap-allocated types are expected to visit ``Py_TYPE(self)`` in " +"``tp_traverse``. In earlier versions of Python, due to `bug 40217 " +"`_, doing this may lead to crashes in " +"subclasses." +msgstr "" +"堆分配类型应当访问 ``tp_traverse`` 中的 ``Py_TYPE(self)``。在较早的 Python 版本中,由于 `bug 40217" +" `_,这样做可能会导致在子类中发生崩溃。" + +#: ../../c-api/typeobj.rst:1645 +msgid "" +"This field is inherited by subtypes together with " +":c:member:`~PyTypeObject.tp_clear` and the :c:macro:`Py_TPFLAGS_HAVE_GC` " +"flag bit: the flag bit, :c:member:`~PyTypeObject.tp_traverse`, and " +":c:member:`~PyTypeObject.tp_clear` are all inherited from the base type if " +"they are all zero in the subtype." +msgstr "" +"该字段会与 :c:member:`~PyTypeObject.tp_clear` 和 :c:macro:`Py_TPFLAGS_HAVE_GC` " +"旗标位一起被子类型所继承:如果旗标位,:c:member:`~PyTypeObject.tp_traverse` 和 " +":c:member:`~PyTypeObject.tp_clear` 在子类型中均为零则它们都将从基类型继承。" + +#: ../../c-api/typeobj.rst:1655 +msgid "An optional pointer to a clear function. The signature is::" +msgstr "一个可选的指向清除函数的指针。其签名如下::" + +#: ../../c-api/typeobj.rst:1657 +msgid "int tp_clear(PyObject *);" +msgstr "int tp_clear(PyObject *);" + +#: ../../c-api/typeobj.rst:1659 +msgid "" +"The purpose of this function is to break reference cycles that are causing a" +" :term:`cyclic isolate` so that the objects can be safely destroyed. A " +"cleared object is a partially destroyed object; the object is not obligated " +"to satisfy design invariants held during normal use." +msgstr "" +"此函数的目的是打破导致 :term:`cyclic isolate` 的引用循环,以便可以安全地销毁对象。 " +"已清除的对象是部分销毁的对象;该对象不一定要满足正常使用期间保持的设计不变量。" + +#: ../../c-api/typeobj.rst:1664 +msgid "" +":c:member:`!tp_clear` does not need to delete references to objects that " +"can't participate in reference cycles, such as Python strings or Python " +"integers. However, it may be convenient to clear all references, and write " +"the type's :c:member:`~PyTypeObject.tp_dealloc` function to invoke " +":c:member:`!tp_clear` to avoid code duplication. (Beware that " +":c:member:`!tp_clear` might have already been called. Prefer calling " +"idempotent functions like :c:func:`Py_CLEAR`.)" +msgstr "" +":c:member:`!tp_clear` 不需要删除不能参与引用循环的对象的引用,例如 Python 字符串或 Python 整数。 " +"然而,清除所有引用可能更方便,并编写类型的 :c:member:`~PyTypeObject.tp_dealloc` 函数来调用 " +":c:member:`!tp_clear` 以避免代码重复。(注意 :c:member:`!tp_clear` 可能已经被调用。建议调用幂等函数如 " +":c:func:`Py_CLEAR`.)" + +#: ../../c-api/typeobj.rst:1672 +msgid "" +"Any non-trivial cleanup should be performed in " +":c:member:`~PyTypeObject.tp_finalize` instead of :c:member:`!tp_clear`." +msgstr "" +"任何非平凡的清理应在 :c:member:`~PyTypeObject.tp_finalize` 中执行,而不是在 " +":c:member:`!tp_clear` 中。" + +#: ../../c-api/typeobj.rst:1677 +msgid "" +"If :c:member:`!tp_clear` fails to break a reference cycle then the objects " +"in the :term:`cyclic isolate` may remain indefinitely uncollectable " +"(\"leak\"). See :data:`gc.garbage`." +msgstr "" +"如果 :c:member:`!tp_clear` 未能打破引用循环,则 :term:`cyclic isolate` " +"中的对象可能永远无法回收(“泄漏”)。参见 :data:`gc.garbage`。" + +#: ../../c-api/typeobj.rst:1683 +msgid "" +"Referents (direct and indirect) might have already been cleared; they are " +"not guaranteed to be in a consistent state." +msgstr "引用对象(直接和间接)可能已经被清除;它们不一定处于一致状态。" + +#: ../../c-api/typeobj.rst:1688 +msgid "" +"The :c:member:`~PyTypeObject.tp_clear` function can be called from any " +"thread." +msgstr ":c:member:`~PyTypeObject.tp_clear` 函数可以从任何线程调用。" + +#: ../../c-api/typeobj.rst:1693 +msgid "" +"An object is not guaranteed to be automatically cleared before its " +"destructor (:c:member:`~PyTypeObject.tp_dealloc`) is called." +msgstr "在调用对象的析构器 (:c:member:`~PyTypeObject.tp_dealloc`) 之前,不能保证对象会自动清除。" + +#: ../../c-api/typeobj.rst:1696 +msgid "" +"This function differs from the destructor " +"(:c:member:`~PyTypeObject.tp_dealloc`) in the following ways:" +msgstr "此函数与析构函数 (:c:member:`~PyTypeObject.tp_dealloc`) 在以下方面有所不同:" + +#: ../../c-api/typeobj.rst:1699 +msgid "" +"The purpose of clearing an object is to remove references to other objects " +"that might participate in a reference cycle. The purpose of the destructor," +" on the other hand, is a superset: it must release *all* resources it owns, " +"including references to objects that cannot participate in a reference cycle" +" (e.g., integers) as well as the object's own memory (by calling " +":c:member:`~PyTypeObject.tp_free`)." +msgstr "" +"清除对象的目的在于移除可能参与引用循环的其他对象的引用。另一方面,析构函数的目的是一个超集:它必须释放其拥有的 *所有* " +"资源,包括不能参与引用循环的对象的引用(例如,整数)以及对象自身的内存 (通过调用 " +":c:member:`~PyTypeObject.tp_free`)。" + +#: ../../c-api/typeobj.rst:1705 +msgid "" +"When :c:member:`!tp_clear` is called, other objects might still hold " +"references to the object being cleared. Because of this, " +":c:member:`!tp_clear` must not deallocate the object's own memory " +"(:c:member:`~PyTypeObject.tp_free`). The destructor, on the other hand, is " +"only called when no (strong) references exist, and as such, must safely " +"destroy the object itself by deallocating it." +msgstr "" +"当调用 :c:member:`!tp_clear` 时,其他对象可能仍然持有对正在清除的对象的引用。因此,:c:member:`!tp_clear` " +"不能释放对象自身的内存 " +"(:c:member:`~PyTypeObject.tp_free`)。另一方面,析构函数只有在不存在(强)引用时才会被调用,因此必须通过释放内存来安全地销毁对象本身。" + +#: ../../c-api/typeobj.rst:1711 +msgid "" +":c:member:`!tp_clear` might never be automatically called. An object's " +"destructor, on the other hand, will be automatically called some time after " +"the object becomes unreachable (i.e., either there are no references to the " +"object or the object is a member of a :term:`cyclic isolate`)." +msgstr "" +":c:member:`!tp_clear` " +"可能永远不会自动调用。另一方面,对象的析构函数会在对象变得不可达后的一段时间内自动调用(即,没有对对象的引用,或者对象是 :term:`cyclic " +"isolate` 的成员)。" + +#: ../../c-api/typeobj.rst:1716 +msgid "" +"No guarantees are made about when, if, or how often Python automatically " +"clears an object, except:" +msgstr "Python 自动清除对象的时间、是否清除以及清除频率没有任何保证,除了以下情况:" + +#: ../../c-api/typeobj.rst:1719 +msgid "" +"Python will not automatically clear an object if it is reachable, i.e., " +"there is a reference to it and it is not a member of a :term:`cyclic " +"isolate`." +msgstr "如果对象是可达的,即存在对它的引用,并且它不是 :term:`cyclic isolate` 的成员,Python 不会自动清除该对象。" + +#: ../../c-api/typeobj.rst:1722 +msgid "" +"Python will not automatically clear an object if it has not been " +"automatically finalized (see :c:member:`~PyTypeObject.tp_finalize`). (If " +"the finalizer resurrected the object, the object may or may not be " +"automatically finalized again before it is cleared.)" +msgstr "" +"如果对象尚未自动完成终结 (参见 :c:member:`~PyTypeObject.tp_finalize`),Python 不会自动清除该对象。 " +"(如果终结器使对象复活,则在清除之前,对象可能会再次自动完成终结,也可能不会。)" + +#: ../../c-api/typeobj.rst:1726 +msgid "" +"If an object is a member of a :term:`cyclic isolate`, Python will not " +"automatically clear it if any member of the cyclic isolate has not yet been " +"automatically finalized (:c:member:`~PyTypeObject.tp_finalize`)." +msgstr "" +"如果对象是 :term:`cyclic isolate` 的成员,并且循环隔离中的任何成员尚未自动完成终结 " +"(:c:member:`~PyTypeObject.tp_finalize`),Python 不会自动清除该对象。" + +#: ../../c-api/typeobj.rst:1729 +msgid "" +"Python will not destroy an object until after any automatic calls to its " +":c:member:`!tp_clear` function have returned. This ensures that the act of " +"breaking a reference cycle does not invalidate the ``self`` pointer while " +":c:member:`!tp_clear` is still executing." +msgstr "" +"Python 会在任何对 :c:member:`!tp_clear` 函数的自动调用返回之后才销毁对象。这确保了在 " +":c:member:`!tp_clear` 仍在执行时,打破引用循环的行为不会使 ``self`` 指针失效。" + +#: ../../c-api/typeobj.rst:1733 +msgid "" +"Python will not automatically call :c:member:`!tp_clear` multiple times " +"concurrently." +msgstr "Python 不会并发地多次自动调用 :c:member:`!tp_clear`。" + +#: ../../c-api/typeobj.rst:1736 +msgid "" +"CPython currently only automatically clears objects as needed to break " +"reference cycles in a :term:`cyclic isolate`, but future versions might " +"clear objects regularly before their destruction." +msgstr "" +"目前 CPython 只在需要打破 :term:`cyclic isolate` " +"中的引用循环时自动清除对象,但未来版本可能会在对象销毁之前定期清除对象。" + +#: ../../c-api/typeobj.rst:1740 +msgid "" +"Taken together, all :c:member:`~PyTypeObject.tp_clear` functions in the " +"system must combine to break all reference cycles. This is subtle, and if " +"in any doubt supply a :c:member:`~PyTypeObject.tp_clear` function. For " +"example, the tuple type does not implement a " +":c:member:`~PyTypeObject.tp_clear` function, because it's possible to prove " +"that no reference cycle can be composed entirely of tuples. Therefore the " +":c:member:`~PyTypeObject.tp_clear` functions of other types are responsible " +"for breaking any cycle containing a tuple. This isn't immediately obvious, " +"and there's rarely a good reason to avoid implementing " +":c:member:`~PyTypeObject.tp_clear`." +msgstr "" +"综合考虑,系统中所有 :c:member:`~PyTypeObject.tp_clear` " +"函数必须共同作用以打破所有引用循环。这一点非常微妙,如果有任何疑问,请提供一个 :c:member:`~PyTypeObject.tp_clear` " +"函数。例如,元组类型没有实现 :c:member:`~PyTypeObject.tp_clear` " +"函数,因为可以证明不可能完全由元组组成引用循环。因此,其他类型的 :c:member:`~PyTypeObject.tp_clear` " +"函数负责打破包含元组的任何循环。这并非显而易见,而且通常没有充分的理由不实现 :c:member:`~PyTypeObject.tp_clear`。" + +#: ../../c-api/typeobj.rst:1751 +msgid "" +"Implementations of :c:member:`~PyTypeObject.tp_clear` should drop the " +"instance's references to those of its members that may be Python objects, " +"and set its pointers to those members to ``NULL``, as in the following " +"example::" +msgstr "" +":c:member:`~PyTypeObject.tp_clear` 的实现应当丢弃实例指向其成员的可能为 Python " +"对象的引用,并将指向这些成员的指针设为 ``NULL``,如下面的例子所示::" + +#: ../../c-api/typeobj.rst:1755 +msgid "" +"static int\n" +"local_clear(PyObject *op)\n" +"{\n" +" localobject *self = (localobject *) op;\n" +" Py_CLEAR(self->key);\n" +" Py_CLEAR(self->args);\n" +" Py_CLEAR(self->kw);\n" +" Py_CLEAR(self->dict);\n" +" return 0;\n" +"}" +msgstr "" +"static int\n" +"local_clear(PyObject *op)\n" +"{\n" +" localobject *self = (localobject *) op;\n" +" Py_CLEAR(self->key);\n" +" Py_CLEAR(self->args);\n" +" Py_CLEAR(self->kw);\n" +" Py_CLEAR(self->dict);\n" +" return 0;\n" +"}" + +#: ../../c-api/typeobj.rst:1766 +msgid "" +"The :c:func:`Py_CLEAR` macro should be used, because clearing references is " +"delicate: the reference to the contained object must not be released (via " +":c:func:`Py_DECREF`) until after the pointer to the contained object is set " +"to ``NULL``. This is because releasing the reference may cause the " +"contained object to become trash, triggering a chain of reclamation activity" +" that may include invoking arbitrary Python code (due to finalizers, or " +"weakref callbacks, associated with the contained object). If it's possible " +"for such code to reference *self* again, it's important that the pointer to " +"the contained object be ``NULL`` at that time, so that *self* knows the " +"contained object can no longer be used. The :c:func:`Py_CLEAR` macro " +"performs the operations in a safe order." +msgstr "" +"应当使用 :c:func:`Py_CLEAR` 宏,因为清除引用是很微妙的:指向被包含对象的引用必须在指向被包含对象的指针被设为 ``NULL`` " +"之后才能被释放 (通过 :c:func:`Py_DECREF`)。 " +"这是因为释放引用可能会导致被包含的对象变成垃圾,触发一连串的回收活动,其中可能包括唤起任意 Python 代码 " +"(由于关联到被包含对象的终结器或弱引用回调)。如果这样的代码有可能再次引用 *self*,那么这时指向被包含对象的指针为 ``NULL`` " +"就是非常重要的,这样 *self* 就知道被包含对象不可再被使用。 :c:func:`Py_CLEAR` 宏将以安全的顺序执行此操作。" + +#: ../../c-api/typeobj.rst:1778 +msgid "" +"If the :c:macro:`Py_TPFLAGS_MANAGED_DICT` bit is set in the " +":c:member:`~PyTypeObject.tp_flags` field, the clear function must call " +":c:func:`PyObject_ClearManagedDict` like this::" +msgstr "" +"如果在 :c:member:`~PyTypeObject.tp_flags` 字段中设置了 " +":c:macro:`Py_TPFLAGS_MANAGED_DICT` 比特位,则 clear 函数必须这样调用 " +":c:func:`PyObject_ClearManagedDict`::" + +#: ../../c-api/typeobj.rst:1782 +msgid "PyObject_ClearManagedDict((PyObject*)self);" +msgstr "PyObject_ClearManagedDict((PyObject*)self);" + +#: ../../c-api/typeobj.rst:1791 +msgid "" +"This field is inherited by subtypes together with " +":c:member:`~PyTypeObject.tp_traverse` and the :c:macro:`Py_TPFLAGS_HAVE_GC` " +"flag bit: the flag bit, :c:member:`~PyTypeObject.tp_traverse`, and " +":c:member:`~PyTypeObject.tp_clear` are all inherited from the base type if " +"they are all zero in the subtype." +msgstr "" +"该字段会与 :c:member:`~PyTypeObject.tp_traverse` 和 :c:macro:`Py_TPFLAGS_HAVE_GC` " +"旗标位一起被子类型所继承:如果旗标位,:c:member:`~PyTypeObject.tp_traverse` 和 " +":c:member:`~PyTypeObject.tp_clear` 在子类型中均为零则它们都将从基类型继承。" + +#: ../../c-api/typeobj.rst:1805 +msgid "" +"An optional pointer to the rich comparison function, whose signature is::" +msgstr "一个可选的指向富比较函数的指针,函数的签名为::" + +#: ../../c-api/typeobj.rst:1807 +msgid "PyObject *tp_richcompare(PyObject *self, PyObject *other, int op);" +msgstr "PyObject *tp_richcompare(PyObject *self, PyObject *other, int op);" + +#: ../../c-api/typeobj.rst:1809 +msgid "" +"The first parameter is guaranteed to be an instance of the type that is " +"defined by :c:type:`PyTypeObject`." +msgstr "第一个形参将保证为 :c:type:`PyTypeObject` 所定义的类型的实例。" + +#: ../../c-api/typeobj.rst:1812 +msgid "" +"The function should return the result of the comparison (usually ``Py_True``" +" or ``Py_False``). If the comparison is undefined, it must return " +"``Py_NotImplemented``, if another error occurred it must return ``NULL`` and" +" set an exception condition." +msgstr "" +"该函数应当返回比较的结果 (通常为 ``Py_True`` 或 ``Py_False``)。如果未定义比较运算,它必须返回 " +"``Py_NotImplemented``,如果发生了其他错误则它必须返回 ``NULL`` 并设置一个异常条件。" + +#: ../../c-api/typeobj.rst:1817 +msgid "" +"The following constants are defined to be used as the third argument for " +":c:member:`~PyTypeObject.tp_richcompare` and for " +":c:func:`PyObject_RichCompare`:" +msgstr "" +"以下常量被定义用作 :c:member:`~PyTypeObject.tp_richcompare` 和 " +":c:func:`PyObject_RichCompare` 的第三个参数:" + +#: ../../c-api/typeobj.rst:1823 +msgid "Constant" +msgstr "常量" + +#: ../../c-api/typeobj.rst:1823 +msgid "Comparison" +msgstr "比较" + +#: ../../c-api/typeobj.rst:1825 +msgid "``<``" +msgstr "``<``" + +#: ../../c-api/typeobj.rst:1827 +msgid "``<=``" +msgstr "``<=``" + +#: ../../c-api/typeobj.rst:1829 +msgid "``==``" +msgstr "``==``" + +#: ../../c-api/typeobj.rst:1831 +msgid "``!=``" +msgstr "``!=``" + +#: ../../c-api/typeobj.rst:1833 +msgid "``>``" +msgstr "``>``" + +#: ../../c-api/typeobj.rst:1835 +msgid "``>=``" +msgstr "``>=``" + +#: ../../c-api/typeobj.rst:1838 +msgid "" +"The following macro is defined to ease writing rich comparison functions:" +msgstr "定义以下宏是为了简化编写丰富的比较函数:" + +#: ../../c-api/typeobj.rst:1842 +msgid "" +"Return ``Py_True`` or ``Py_False`` from the function, depending on the " +"result of a comparison. VAL_A and VAL_B must be orderable by C comparison " +"operators (for example, they may be C ints or floats). The third argument " +"specifies the requested operation, as for :c:func:`PyObject_RichCompare`." +msgstr "" +"从该函数返回 ``Py_True`` 或 ``Py_False``,这取决于比较的结果。VAL_A 和 VAL_B 必须是可通过 C " +"比较运算符进行排序的(例如,它们可以为 C 整数或浮点数)。第三个参数指明所请求的运算,与 :c:func:`PyObject_RichCompare`" +" 的参数一样。" + +#: ../../c-api/typeobj.rst:1848 +msgid "The returned value is a new :term:`strong reference`." +msgstr "返回值是一个新的 :term:`strong reference`。" + +#: ../../c-api/typeobj.rst:1850 +msgid "On error, sets an exception and returns ``NULL`` from the function." +msgstr "发生错误时,将设置异常并从该函数返回 ``NULL``。" + +#: ../../c-api/typeobj.rst:1858 +msgid "" +"This field is inherited by subtypes together with " +":c:member:`~PyTypeObject.tp_hash`: a subtype inherits " +":c:member:`~PyTypeObject.tp_richcompare` and " +":c:member:`~PyTypeObject.tp_hash` when the subtype's " +":c:member:`~PyTypeObject.tp_richcompare` and " +":c:member:`~PyTypeObject.tp_hash` are both ``NULL``." +msgstr "" +"该字段会被子类型同 :c:member:`~PyTypeObject.tp_hash` 一起继承:当子类型的 " +":c:member:`~PyTypeObject.tp_richcompare` 和 :c:member:`~PyTypeObject.tp_hash`" +" 均为 ``NULL`` 时子类型将同时继承 :c:member:`~PyTypeObject.tp_richcompare` 和 " +":c:member:`~PyTypeObject.tp_hash`." + +#: ../../c-api/typeobj.rst:1865 +msgid "" +":c:data:`PyBaseObject_Type` provides a " +":c:member:`~PyTypeObject.tp_richcompare` implementation, which may be " +"inherited. However, if only :c:member:`~PyTypeObject.tp_hash` is defined, " +"not even the inherited function is used and instances of the type will not " +"be able to participate in any comparisons." +msgstr "" +":c:data:`PyBaseObject_Type` 提供了一个 :c:member:`~PyTypeObject.tp_richcompare` " +"的实现,它可以被继承。但是,如果只定义了 " +":c:member:`~PyTypeObject.tp_hash`,则不会使用被继承的函数并且该类型的实例将无法参加任何比较。" + +#: ../../c-api/typeobj.rst:1874 +msgid "" +"While this field is still supported, :c:macro:`Py_TPFLAGS_MANAGED_WEAKREF` " +"should be used instead, if at all possible." +msgstr "虽然此字段仍然受到支持,但是如果可能就应当改用 :c:macro:`Py_TPFLAGS_MANAGED_WEAKREF`。" + +#: ../../c-api/typeobj.rst:1877 +msgid "" +"If the instances of this type are weakly referenceable, this field is " +"greater than zero and contains the offset in the instance structure of the " +"weak reference list head (ignoring the GC header, if present); this offset " +"is used by :c:func:`PyObject_ClearWeakRefs` and the ``PyWeakref_*`` " +"functions. The instance structure needs to include a field of type " +":c:expr:`PyObject*` which is initialized to ``NULL``." +msgstr "" +"如果此类型的实例是可被弱引用的,则该字段将大于零并包含在弱引用列表头的实例结构体中的偏移量(忽略 GC 头,如果存在的话);该偏移量将被 " +":c:func:`PyObject_ClearWeakRefs` 和 ``PyWeakref_*`` 函数使用。实例结构体需要包括一个 " +":c:expr:`PyObject*` 类型的字段并初始化为 ``NULL``。" + +#: ../../c-api/typeobj.rst:1884 +msgid "" +"Do not confuse this field with :c:member:`~PyTypeObject.tp_weaklist`; that " +"is the list head for weak references to the type object itself." +msgstr "不要将该字段与 :c:member:`~PyTypeObject.tp_weaklist` 混淆;后者是指向类型对象本身的弱引用的列表头。" + +#: ../../c-api/typeobj.rst:1887 +msgid "" +"It is an error to set both the :c:macro:`Py_TPFLAGS_MANAGED_WEAKREF` bit and" +" :c:member:`~PyTypeObject.tp_weaklistoffset`." +msgstr "" +"同时设置 :c:macro:`Py_TPFLAGS_MANAGED_WEAKREF` 位和 " +":c:member:`~PyTypeObject.tp_weaklistoffset` 将导致错误。" + +#: ../../c-api/typeobj.rst:1892 +msgid "" +"This field is inherited by subtypes, but see the rules listed below. A " +"subtype may override this offset; this means that the subtype uses a " +"different weak reference list head than the base type. Since the list head " +"is always found via :c:member:`~PyTypeObject.tp_weaklistoffset`, this should" +" not be a problem." +msgstr "" +"该字段会被子类型继承,但注意参阅下面列出的规则。子类型可以覆盖此偏移量;这意味着子类型将使用不同于基类型的弱引用列表。由于列表头总是通过 " +":c:member:`~PyTypeObject.tp_weaklistoffset` 找到的,所以这应该不成问题。" + +#: ../../c-api/typeobj.rst:1899 +msgid "" +"If the :c:macro:`Py_TPFLAGS_MANAGED_WEAKREF` bit is set in the " +":c:member:`~PyTypeObject.tp_flags` field, then " +":c:member:`~PyTypeObject.tp_weaklistoffset` will be set to a negative value," +" to indicate that it is unsafe to use this field." +msgstr "" +"如果在 :c:member:`~PyTypeObject.tp_flags` 字段中设置了 " +":c:macro:`Py_TPFLAGS_MANAGED_WEAKREF` 位,则 " +":c:member:`~PyTypeObject.tp_weaklistoffset` 将被设为负值,用以表明使用此字段是不安全的。" + +#: ../../c-api/typeobj.rst:1909 +msgid "" +"An optional pointer to a function that returns an :term:`iterator` for the " +"object. Its presence normally signals that the instances of this type are " +":term:`iterable` (although sequences may be iterable without this function)." +msgstr "" +"一个可选的指向函数的指针,该函数返回对象的 :term:`iterator`。它的存在通常表明该类型的实例为 :term:`iterable` " +"(尽管序列在没有此函数的情况下也可能为可迭代对象)。" + +#: ../../c-api/typeobj.rst:1913 +msgid "This function has the same signature as :c:func:`PyObject_GetIter`::" +msgstr "此函数的签名与 :c:func:`PyObject_GetIter` 的相同::" + +#: ../../c-api/typeobj.rst:1915 +msgid "PyObject *tp_iter(PyObject *self);" +msgstr "PyObject *tp_iter(PyObject *self);" + +#: ../../c-api/typeobj.rst:1926 +msgid "" +"An optional pointer to a function that returns the next item in an " +":term:`iterator`. The signature is::" +msgstr "一个可选的指向函数的指针,该函数返回 :term:`iterator` 中的下一项。其签名为::" + +#: ../../c-api/typeobj.rst:1929 +msgid "PyObject *tp_iternext(PyObject *self);" +msgstr "PyObject *tp_iternext(PyObject *self);" + +#: ../../c-api/typeobj.rst:1931 +msgid "" +"When the iterator is exhausted, it must return ``NULL``; a " +":exc:`StopIteration` exception may or may not be set. When another error " +"occurs, it must return ``NULL`` too. Its presence signals that the " +"instances of this type are iterators." +msgstr "" +"当该迭代器被耗尽时,它必须返回 ``NULL``;:exc:`StopIteration` 异常可能会设置也可能不设置。 " +"当发生另一个错误时,它也必须返回 ``NULL``。它的存在表明该类型的实例是迭代器。" + +#: ../../c-api/typeobj.rst:1936 +msgid "" +"Iterator types should also define the :c:member:`~PyTypeObject.tp_iter` " +"function, and that function should return the iterator instance itself (not " +"a new iterator instance)." +msgstr "" +"迭代器类型也应当定义 :c:member:`~PyTypeObject.tp_iter` " +"函数,并且该函数应当返回迭代器实例本身(而不是新的迭代器实例)。" + +#: ../../c-api/typeobj.rst:1940 +msgid "This function has the same signature as :c:func:`PyIter_Next`." +msgstr "此函数的签名与 :c:func:`PyIter_Next` 的相同。" + +#: ../../c-api/typeobj.rst:1951 +msgid "" +"An optional pointer to a static ``NULL``-terminated array of " +":c:type:`PyMethodDef` structures, declaring regular methods of this type." +msgstr "一个可选的指向 :c:type:`PyMethodDef` 结构体的以 ``NULL`` 结束的静态数组的指针,它声明了此类型的常规方法。" + +#: ../../c-api/typeobj.rst:1954 +msgid "" +"For each entry in the array, an entry is added to the type's dictionary (see" +" :c:member:`~PyTypeObject.tp_dict` below) containing a method descriptor." +msgstr "" +"对于该数组中的每一项,都会向类型的字典 (参见下面的 :c:member:`~PyTypeObject.tp_dict`) " +"添加一个包含方法描述器的条目。" + +#: ../../c-api/typeobj.rst:1959 +msgid "" +"This field is not inherited by subtypes (methods are inherited through a " +"different mechanism)." +msgstr "该字段不会被子类型所继承(方法是通过不同的机制来继承的)。" + +#: ../../c-api/typeobj.rst:1967 +msgid "" +"An optional pointer to a static ``NULL``-terminated array of " +":c:type:`PyMemberDef` structures, declaring regular data members (fields or " +"slots) of instances of this type." +msgstr "" +"一个可选的指向 :c:type:`PyMemberDef` 结构体的以 ``NULL`` " +"结束的静态数组的指针,它声明了此类型的常规数据成员(字段或槽位)。" + +#: ../../c-api/typeobj.rst:1971 +msgid "" +"For each entry in the array, an entry is added to the type's dictionary (see" +" :c:member:`~PyTypeObject.tp_dict` below) containing a member descriptor." +msgstr "" +"对于该数组中的每一项,都会向类型的字典 (参见下面的 :c:member:`~PyTypeObject.tp_dict`) " +"添加一个包含成员描述器的条目。" + +#: ../../c-api/typeobj.rst:1976 +msgid "" +"This field is not inherited by subtypes (members are inherited through a " +"different mechanism)." +msgstr "该字段不会被子类型所继承(成员是通过不同的机制来继承的)。" + +#: ../../c-api/typeobj.rst:1984 +msgid "" +"An optional pointer to a static ``NULL``-terminated array of " +":c:type:`PyGetSetDef` structures, declaring computed attributes of instances" +" of this type." +msgstr "" +"一个可选的指向 :c:type:`PyGetSetDef` 结构体的以 ``NULL`` 结束的静态数组的指针,它声明了此类型的实例中的被计算属性。" + +#: ../../c-api/typeobj.rst:1987 +msgid "" +"For each entry in the array, an entry is added to the type's dictionary (see" +" :c:member:`~PyTypeObject.tp_dict` below) containing a getset descriptor." +msgstr "" +"对于该数组中的每一项,都会向类型的字典 (参见下面的 :c:member:`~PyTypeObject.tp_dict`) " +"添加一个包含读写描述器的条目。" + +#: ../../c-api/typeobj.rst:1992 +msgid "" +"This field is not inherited by subtypes (computed attributes are inherited " +"through a different mechanism)." +msgstr "该字段不会被子类型所继承(被计算属性是通过不同的机制来继承的)。" + +#: ../../c-api/typeobj.rst:2000 +msgid "" +"An optional pointer to a base type from which type properties are inherited." +" At this level, only single inheritance is supported; multiple inheritance " +"require dynamically creating a type object by calling the metatype." +msgstr "一个可选的指向类型特征属性所继承的基类型的指针。在这个层级上,只支持单继承;多重继承需要通过调用元类型动态地创建类型对象。" + +#: ../../c-api/typeobj.rst:2008 +msgid "" +"Slot initialization is subject to the rules of initializing globals. C99 " +"requires the initializers to be \"address constants\". Function designators" +" like :c:func:`PyType_GenericNew`, with implicit conversion to a pointer, " +"are valid C99 address constants." +msgstr "" +"槽位初始化需要遵循初始化全局变量的规则。C99 要求初始化器为“地址常量”。隐式转换为指针的函数指示器如 " +":c:func:`PyType_GenericNew` 都是有效的 C99 地址常量。" + +#: ../../c-api/typeobj.rst:2013 +msgid "" +"However, the unary '&' operator applied to a non-static variable like " +":c:data:`PyBaseObject_Type` is not required to produce an address constant." +" Compilers may support this (gcc does), MSVC does not. Both compilers are " +"strictly standard conforming in this particular behavior." +msgstr "" +"但是,生成地址常量并不需要应用于非静态变量如 :c:data:`PyBaseObject_Type` 的单目运算符 '&'。编译器可能支持该运算符(如 " +"gcc),但 MSVC 则不支持。这两种编译器在这一特定行为上都是严格符合标准的。" + +#: ../../c-api/typeobj.rst:2019 +msgid "" +"Consequently, :c:member:`~PyTypeObject.tp_base` should be set in the " +"extension module's init function." +msgstr "因此,应当在扩展模块的初始化函数中设置 :c:member:`~PyTypeObject.tp_base`。" + +#: ../../c-api/typeobj.rst:2024 +msgid "This field is not inherited by subtypes (obviously)." +msgstr "该字段不会被子类型继承(显然)。" + +#: ../../c-api/typeobj.rst:2028 +msgid "" +"This field defaults to ``&PyBaseObject_Type`` (which to Python programmers " +"is known as the type :class:`object`)." +msgstr "该字段默认为 ``&PyBaseObject_Type`` (对 Python 程序员来说即 :class:`object` 类型)。" + +#: ../../c-api/typeobj.rst:2034 +msgid "The type's dictionary is stored here by :c:func:`PyType_Ready`." +msgstr "类型的字典将由 :c:func:`PyType_Ready` 存储到这里。" + +#: ../../c-api/typeobj.rst:2036 +msgid "" +"This field should normally be initialized to ``NULL`` before PyType_Ready is" +" called; it may also be initialized to a dictionary containing initial " +"attributes for the type. Once :c:func:`PyType_Ready` has initialized the " +"type, extra attributes for the type may be added to this dictionary only if " +"they don't correspond to overloaded operations (like " +":meth:`~object.__add__`). Once initialization for the type has finished, " +"this field should be treated as read-only." +msgstr "" +"该字段通常应当在 PyType_Ready 被调用之前初始化为 ``NULL``;它也可以初始化为一个包含类型初始属性的字典。一旦 " +":c:func:`PyType_Ready` 完成类型的初始化,该类型的额外属性只有在它们不与被重载的操作 (如 " +":meth:`~object.__add__`) 相对应的情况下才会被添加到该字典中。一旦类型的初始化结束,该字段就应被视为是只读的。" + +#: ../../c-api/typeobj.rst:2044 +msgid "" +"Some types may not store their dictionary in this slot. Use " +":c:func:`PyType_GetDict` to retrieve the dictionary for an arbitrary type." +msgstr "某些类型不会将它们的字典存储在该槽位中。请使用 :c:func:`PyType_GetDict` 来获取任意类型对应的字典。" + +#: ../../c-api/typeobj.rst:2050 +msgid "" +"Internals detail: For static builtin types, this is always ``NULL``. " +"Instead, the dict for such types is stored on ``PyInterpreterState``. Use " +":c:func:`PyType_GetDict` to get the dict for an arbitrary type." +msgstr "" +"内部细节:对于静态内置类型,该值总是为 ``NULL``。这种类型的字典是存储在 ``PyInterpreterState`` 中。请使用 " +":c:func:`PyType_GetDict` 来获取任意类型的字典。" + +#: ../../c-api/typeobj.rst:2056 +msgid "" +"This field is not inherited by subtypes (though the attributes defined in " +"here are inherited through a different mechanism)." +msgstr "该字段不会被子类型所继承(但在这里定义的属性是通过不同的机制来继承的)。" + +#: ../../c-api/typeobj.rst:2061 +msgid "" +"If this field is ``NULL``, :c:func:`PyType_Ready` will assign a new " +"dictionary to it." +msgstr "如果该字段为 ``NULL``,:c:func:`PyType_Ready` 将为它分配一个新字典。" + +#: ../../c-api/typeobj.rst:2066 +msgid "" +"It is not safe to use :c:func:`PyDict_SetItem` on or otherwise modify " +":c:member:`~PyTypeObject.tp_dict` with the dictionary C-API." +msgstr "" +"通过字典 C-API 使用 :c:func:`PyDict_SetItem` 或修改 :c:member:`~PyTypeObject.tp_dict`" +" 是不安全的。" + +#: ../../c-api/typeobj.rst:2074 +msgid "An optional pointer to a \"descriptor get\" function." +msgstr "一个可选的指向“描述器获取”函数的指针。" + +#: ../../c-api/typeobj.rst:2076 ../../c-api/typeobj.rst:2094 +#: ../../c-api/typeobj.rst:2160 ../../c-api/typeobj.rst:2192 +#: ../../c-api/typeobj.rst:2217 +msgid "The function signature is::" +msgstr "函数的签名为::" + +#: ../../c-api/typeobj.rst:2078 +msgid "" +"PyObject * tp_descr_get(PyObject *self, PyObject *obj, PyObject *type);" +msgstr "" +"PyObject * tp_descr_get(PyObject *self, PyObject *obj, PyObject *type);" + +#: ../../c-api/typeobj.rst:2091 +msgid "" +"An optional pointer to a function for setting and deleting a descriptor's " +"value." +msgstr "一个指向用于设置和删除描述器值的函数的可选指针。" + +#: ../../c-api/typeobj.rst:2096 +msgid "int tp_descr_set(PyObject *self, PyObject *obj, PyObject *value);" +msgstr "int tp_descr_set(PyObject *self, PyObject *obj, PyObject *value);" + +#: ../../c-api/typeobj.rst:2098 +msgid "The *value* argument is set to ``NULL`` to delete the value." +msgstr "将 *value* 参数设为 ``NULL`` 以删除该值。" + +#: ../../c-api/typeobj.rst:2109 +msgid "" +"While this field is still supported, :c:macro:`Py_TPFLAGS_MANAGED_DICT` " +"should be used instead, if at all possible." +msgstr "虽然此字段仍然受到支持,但是如果可能就应当改用 :c:macro:`Py_TPFLAGS_MANAGED_DICT`。" + +#: ../../c-api/typeobj.rst:2112 +msgid "" +"If the instances of this type have a dictionary containing instance " +"variables, this field is non-zero and contains the offset in the instances " +"of the type of the instance variable dictionary; this offset is used by " +":c:func:`PyObject_GenericGetAttr`." +msgstr "" +"如果该类型的实例具有一个包含实例变量的字典,则此字段将为非零值并包含该实例变量字典的类型的实例的偏移量;该偏移量将由 " +":c:func:`PyObject_GenericGetAttr` 使用。" + +#: ../../c-api/typeobj.rst:2117 +msgid "" +"Do not confuse this field with :c:member:`~PyTypeObject.tp_dict`; that is " +"the dictionary for attributes of the type object itself." +msgstr "不要将该字段与 :c:member:`~PyTypeObject.tp_dict` 混淆;后者是由类型对象本身的属性组成的字典。" + +#: ../../c-api/typeobj.rst:2120 +msgid "" +"The value specifies the offset of the dictionary from the start of the " +"instance structure." +msgstr "该值指定字典相对实例结构体开始位置的偏移量。" + +#: ../../c-api/typeobj.rst:2122 +msgid "" +"The :c:member:`~PyTypeObject.tp_dictoffset` should be regarded as write-" +"only. To get the pointer to the dictionary call " +":c:func:`PyObject_GenericGetDict`. Calling :c:func:`PyObject_GenericGetDict`" +" may need to allocate memory for the dictionary, so it is may be more " +"efficient to call :c:func:`PyObject_GetAttr` when accessing an attribute on " +"the object." +msgstr "" +":c:member:`~PyTypeObject.tp_dictoffset` 应当被视为是只写的。用于获取指向字典调用 " +":c:func:`PyObject_GenericGetDict` 的指针。调用 :c:func:`PyObject_GenericGetDict` " +"可能需要为字典分配内存,因此在访问对象上的属性时调用 :c:func:`PyObject_GetAttr` 可能会更有效率。" + +#: ../../c-api/typeobj.rst:2128 +msgid "" +"It is an error to set both the :c:macro:`Py_TPFLAGS_MANAGED_DICT` bit and " +":c:member:`~PyTypeObject.tp_dictoffset`." +msgstr "" +"同时设置 :c:macro:`Py_TPFLAGS_MANAGED_DICT` 位和 " +":c:member:`~PyTypeObject.tp_dictoffset` 将导致报错。" + +#: ../../c-api/typeobj.rst:2133 +msgid "" +"This field is inherited by subtypes. A subtype should not override this " +"offset; doing so could be unsafe, if C code tries to access the dictionary " +"at the previous offset. To properly support inheritance, use " +":c:macro:`Py_TPFLAGS_MANAGED_DICT`." +msgstr "" +"该字段会被子类型所继承。子类型不应重写这个偏移量;这样做是不安全的,如果 C 代码试图在之前的偏移量上访问字典的话。要正确地支持继承,请使用 " +":c:macro:`Py_TPFLAGS_MANAGED_DICT`." + +#: ../../c-api/typeobj.rst:2140 +msgid "" +"This slot has no default. For :ref:`static types `, if the " +"field is ``NULL`` then no :attr:`~object.__dict__` gets created for " +"instances." +msgstr "" +"这个槽位没有默认值。对于 :ref:`静态类型 `,如果该字段为 ``NULL`` 则不会为实例创建 " +":attr:`~object.__dict__`." + +#: ../../c-api/typeobj.rst:2143 +msgid "" +"If the :c:macro:`Py_TPFLAGS_MANAGED_DICT` bit is set in the " +":c:member:`~PyTypeObject.tp_flags` field, then " +":c:member:`~PyTypeObject.tp_dictoffset` will be set to ``-1``, to indicate " +"that it is unsafe to use this field." +msgstr "" +"如果在 :c:member:`~PyTypeObject.tp_flags` 字段中设置了 " +":c:macro:`Py_TPFLAGS_MANAGED_DICT` 比特位,则 " +":c:member:`~PyTypeObject.tp_dictoffset` 将被设为 ``-1``,以表明使用该字段是不安全的。" + +#: ../../c-api/typeobj.rst:2153 +msgid "An optional pointer to an instance initialization function." +msgstr "一个可选的指向实例初始化函数的指针。" + +#: ../../c-api/typeobj.rst:2155 +msgid "" +"This function corresponds to the :meth:`~object.__init__` method of classes." +" Like :meth:`!__init__`, it is possible to create an instance without " +"calling :meth:`!__init__`, and it is possible to reinitialize an instance by" +" calling its :meth:`!__init__` method again." +msgstr "" +"此函数对应于类的 :meth:`~object.__init__` 方法。和 :meth:`!__init__` 一样,创建实例时不调用 " +":meth:`!__init__` 是有可能的,并且通过再次调用实例的 :meth:`!__init__` 方法将其重新初始化也是有可能的。" + +#: ../../c-api/typeobj.rst:2162 +msgid "int tp_init(PyObject *self, PyObject *args, PyObject *kwds);" +msgstr "int tp_init(PyObject *self, PyObject *args, PyObject *kwds);" + +#: ../../c-api/typeobj.rst:2164 +msgid "" +"The self argument is the instance to be initialized; the *args* and *kwds* " +"arguments represent positional and keyword arguments of the call to " +":meth:`~object.__init__`." +msgstr "" +"self 参数是将要初始化的实例;*args* 和 *kwds* 参数代表调用 :meth:`~object.__init__` " +"时传入的位置和关键字参数。" + +#: ../../c-api/typeobj.rst:2168 +msgid "" +"The :c:member:`~PyTypeObject.tp_init` function, if not ``NULL``, is called " +"when an instance is created normally by calling its type, after the type's " +":c:member:`~PyTypeObject.tp_new` function has returned an instance of the " +"type. If the :c:member:`~PyTypeObject.tp_new` function returns an instance " +"of some other type that is not a subtype of the original type, no " +":c:member:`~PyTypeObject.tp_init` function is called; if " +":c:member:`~PyTypeObject.tp_new` returns an instance of a subtype of the " +"original type, the subtype's :c:member:`~PyTypeObject.tp_init` is called." +msgstr "" +":c:member:`~PyTypeObject.tp_init` 函数如果不为 ``NULL``,将在通过调用类型正常创建其实例时被调用,即在类型的 " +":c:member:`~PyTypeObject.tp_new` 函数返回一个该类型的实例时。如果 " +":c:member:`~PyTypeObject.tp_new` 函数返回了一个不是原始类型的子类型的其他类型的实例,则 " +":c:member:`~PyTypeObject.tp_init` 函数不会被调用;如果 " +":c:member:`~PyTypeObject.tp_new` 返回了一个原始类型的子类型的实例,则该子类型的 " +":c:member:`~PyTypeObject.tp_init` 将被调用。" + +#: ../../c-api/typeobj.rst:2175 +msgid "Returns ``0`` on success, ``-1`` and sets an exception on error." +msgstr "成功时返回 ``0``,发生错误时则返回 ``-1`` 并设置一个异常。" + +#: ../../c-api/typeobj.rst:2183 +msgid "" +"For :ref:`static types ` this field does not have a default." +msgstr "对于 :ref:`静态类型 ` 来说该字段没有默认值。" + +#: ../../c-api/typeobj.rst:2190 +msgid "An optional pointer to an instance allocation function." +msgstr "指向一个实例分配函数的可选指针。" + +#: ../../c-api/typeobj.rst:2194 +msgid "PyObject *tp_alloc(PyTypeObject *self, Py_ssize_t nitems);" +msgstr "PyObject *tp_alloc(PyTypeObject *self, Py_ssize_t nitems);" + +#: ../../c-api/typeobj.rst:2198 +msgid "" +"Static subtypes inherit this slot, which will be " +":c:func:`PyType_GenericAlloc` if inherited from :class:`object`." +msgstr "" +"静态子类型继承此槽位,如果从 :class:`object` 继承,则此槽位为 :c:func:`PyType_GenericAlloc`。" + +#: ../../c-api/typeobj.rst:2201 ../../c-api/typeobj.rst:2272 +msgid ":ref:`Heap subtypes ` do not inherit this slot." +msgstr ":ref:`堆子类型 ` 不继承此槽位。" + +#: ../../c-api/typeobj.rst:2205 +msgid "" +"For heap subtypes, this field is always set to " +":c:func:`PyType_GenericAlloc`." +msgstr "对于堆子类型,此字段始终设置为 :c:func:`PyType_GenericAlloc`。" + +#: ../../c-api/typeobj.rst:2208 ../../c-api/typeobj.rst:2280 +msgid "For static subtypes, this slot is inherited (see above)." +msgstr "对于静态子类型,此槽位是继承的(见上文)。" + +#: ../../c-api/typeobj.rst:2215 +msgid "An optional pointer to an instance creation function." +msgstr "一个可选的指向实例创建函数的指针。" + +#: ../../c-api/typeobj.rst:2219 +msgid "" +"PyObject *tp_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds);" +msgstr "" +"PyObject *tp_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds);" + +#: ../../c-api/typeobj.rst:2221 +msgid "" +"The *subtype* argument is the type of the object being created; the *args* " +"and *kwds* arguments represent positional and keyword arguments of the call " +"to the type. Note that *subtype* doesn't have to equal the type whose " +":c:member:`~PyTypeObject.tp_new` function is called; it may be a subtype of " +"that type (but not an unrelated type)." +msgstr "" +"*subtype* 参数是被创建的对象的类型;*args* 和 *kwds* 参数表示调用类型时传入的位置和关键字参数。请注意 *subtype* " +"不是必须与被调用的 :c:member:`~PyTypeObject.tp_new` " +"函数所属的类型相同;它可以是该类型的子类型(但不能是完全无关的类型)。" + +#: ../../c-api/typeobj.rst:2227 +msgid "" +"The :c:member:`~PyTypeObject.tp_new` function should call " +"``subtype->tp_alloc(subtype, nitems)`` to allocate space for the object, and" +" then do only as much further initialization as is absolutely necessary. " +"Initialization that can safely be ignored or repeated should be placed in " +"the :c:member:`~PyTypeObject.tp_init` handler. A good rule of thumb is that" +" for immutable types, all initialization should take place in " +":c:member:`~PyTypeObject.tp_new`, while for mutable types, most " +"initialization should be deferred to :c:member:`~PyTypeObject.tp_init`." +msgstr "" +":c:member:`~PyTypeObject.tp_new` 函数应当调用 ``subtype->tp_alloc(subtype, " +"nitems)`` 来为对象分配空间,然后只执行绝对有必要的进一步初始化操作。可以安全地忽略或重复的初始化操作应当放在 " +":c:member:`~PyTypeObject.tp_init` 处理器中。一个关键的规则是对于不可变类型来说,所有初始化操作都应当在 " +":c:member:`~PyTypeObject.tp_new` 中发生,而对于可变类型,大部分初始化操作都应当推迟到 " +":c:member:`~PyTypeObject.tp_init` 再执行。" + +#: ../../c-api/typeobj.rst:2235 +msgid "" +"Set the :c:macro:`Py_TPFLAGS_DISALLOW_INSTANTIATION` flag to disallow " +"creating instances of the type in Python." +msgstr "" +"设置 :c:macro:`Py_TPFLAGS_DISALLOW_INSTANTIATION` 旗标以禁止在 Python 中创建该类型的实例。" + +#: ../../c-api/typeobj.rst:2240 +msgid "" +"This field is inherited by subtypes, except it is not inherited by " +":ref:`static types ` whose :c:member:`~PyTypeObject.tp_base` " +"is ``NULL`` or ``&PyBaseObject_Type``." +msgstr "" +"该字段会被子类型所继承,例外情况是它不会被 :c:member:`~PyTypeObject.tp_base` 为 ``NULL`` 或 " +"``&PyBaseObject_Type`` 的 :ref:`静态类型 ` 所继承。" + +#: ../../c-api/typeobj.rst:2246 +msgid "" +"For :ref:`static types ` this field has no default. This means" +" if the slot is defined as ``NULL``, the type cannot be called to create new" +" instances; presumably there is some other way to create instances, like a " +"factory function." +msgstr "" +"对于 :ref:`静态类型 ` 该字段没有默认值。这意味着如果槽位被定义为 " +"``NULL``,则无法调用此类型来创建新的实例;应当存在 其他办法来创建实例,例如工厂函数等。" + +#: ../../c-api/typeobj.rst:2256 +msgid "" +"An optional pointer to an instance deallocation function. Its signature " +"is::" +msgstr "一个可选的指向实例释放函数的指针。函数的签名为::" + +#: ../../c-api/typeobj.rst:2258 +msgid "void tp_free(void *self);" +msgstr "void tp_free(void *self);" + +#: ../../c-api/typeobj.rst:2260 +msgid "" +"This function must free the memory allocated by " +":c:member:`~PyTypeObject.tp_alloc`." +msgstr "此函数必须释放由 :c:member:`~PyTypeObject.tp_alloc` 分配的内存。" + +#: ../../c-api/typeobj.rst:2265 +msgid "" +"Static subtypes inherit this slot, which will be :c:func:`PyObject_Free` if " +"inherited from :class:`object`. Exception: If the type supports garbage " +"collection (i.e., the :c:macro:`Py_TPFLAGS_HAVE_GC` flag is set in " +":c:member:`~PyTypeObject.tp_flags`) and it would inherit " +":c:func:`PyObject_Free`, then this slot is not inherited but instead " +"defaults to :c:func:`PyObject_GC_Del`." +msgstr "" +"静态子类型继承此槽位,如果从 :class:`object` 继承,则此槽位为 " +":c:func:`PyObject_Free`。例外情况:如果类型支持垃圾回收(即 :c:member:`~PyTypeObject.tp_flags`" +" 中设置了 :c:macro:`Py_TPFLAGS_HAVE_GC` 标志),并且它将继承 " +":c:func:`PyObject_Free`,则此槽位不继承,而是默认为 :c:func:`PyObject_GC_Del`。" + +#: ../../c-api/typeobj.rst:2276 +msgid "" +"For :ref:`heap subtypes `, this slot defaults to a deallocator " +"suitable to match :c:func:`PyType_GenericAlloc` and the value of the " +":c:macro:`Py_TPFLAGS_HAVE_GC` flag." +msgstr "" +"对于 :ref:`堆子类型 `,此槽位默认为一个适合匹配 :c:func:`PyType_GenericAlloc` 和 " +":c:macro:`Py_TPFLAGS_HAVE_GC` 标志值的释放器。" + +#: ../../c-api/typeobj.rst:2287 +msgid "An optional pointer to a function called by the garbage collector." +msgstr "可选的指向垃圾回收器所调用的函数的指针。" + +#: ../../c-api/typeobj.rst:2289 +msgid "" +"The garbage collector needs to know whether a particular object is " +"collectible or not. Normally, it is sufficient to look at the object's " +"type's :c:member:`~PyTypeObject.tp_flags` field, and check the " +":c:macro:`Py_TPFLAGS_HAVE_GC` flag bit. But some types have a mixture of " +"statically and dynamically allocated instances, and the statically allocated" +" instances are not collectible. Such types should define this function; it " +"should return ``1`` for a collectible instance, and ``0`` for a non-" +"collectible instance. The signature is::" +msgstr "" +"垃圾回收器需要知道某个特定的对象是否可以被回收。在一般情况下,垃圾回收器只需要检查这个对象类型的 " +":c:member:`~PyTypeObject.tp_flags` 字段、以及 :c:macro:`Py_TPFLAGS_HAVE_GC` " +"标识位即可做出判断;但是有一些类型同时混合包含了静态和动态分配的实例,其中静态分配的实例不应该也无法被回收。本函数为后者情况而设计:对于可被垃圾回收的实例,本函数应当返回" +" ``1``;对于不可被垃圾回收的实例,本函数应当返回 ``0``。函数的签名为::" + +#: ../../c-api/typeobj.rst:2297 +msgid "int tp_is_gc(PyObject *self);" +msgstr "int tp_is_gc(PyObject *self);" + +#: ../../c-api/typeobj.rst:2299 +msgid "" +"(The only example of this are types themselves. The metatype, " +":c:data:`PyType_Type`, defines this function to distinguish between " +"statically and :ref:`dynamically allocated types `.)" +msgstr "" +"(此对象的唯一样例是类型本身。元类型 :c:data:`PyType_Type` 定义了该函数来区分静态和 :ref:`动态分配的类型 `.)" + +#: ../../c-api/typeobj.rst:2309 +msgid "" +"This slot has no default. If this field is ``NULL``, " +":c:macro:`Py_TPFLAGS_HAVE_GC` is used as the functional equivalent." +msgstr "" +"此槽位没有默认值。如果该字段为 ``NULL``,则将使用 :c:macro:`Py_TPFLAGS_HAVE_GC` 作为相同功能的替代。" + +#: ../../c-api/typeobj.rst:2317 +msgid "Tuple of base types." +msgstr "基类型的元组。" + +#: ../../c-api/typeobj.rst:2319 ../../c-api/typeobj.rst:2343 +msgid "" +"This field should be set to ``NULL`` and treated as read-only. Python will " +"fill it in when the type is :c:func:`initialized `." +msgstr "" +"此字段应当被设为 ``NULL`` 并被视为只读。Python 将在类型 :c:func:`初始化时 ` 填充它。" + +#: ../../c-api/typeobj.rst:2322 +msgid "" +"For dynamically created classes, the :c:data:`Py_tp_bases` :c:type:`slot " +"` can be used instead of the *bases* argument of " +":c:func:`PyType_FromSpecWithBases`. The argument form is preferred." +msgstr "" +"对于动态创建的类,可以使用 :c:data:`Py_tp_bases` :c:type:`槽位 ` 来代替 " +":c:func:`PyType_FromSpecWithBases` 的 *bases* 参数。推荐使用参数形式。" + +#: ../../c-api/typeobj.rst:2329 +msgid "" +"Multiple inheritance does not work well for statically defined types. If you" +" set ``tp_bases`` to a tuple, Python will not raise an error, but some slots" +" will only be inherited from the first base." +msgstr "" +"多重继承不适合静态定义的类型。如果你将 ``tp_bases`` 设为一个元组,Python 将不会引发错误,但某些槽位将只从第一个基类型继承。" + +#: ../../c-api/typeobj.rst:2335 ../../c-api/typeobj.rst:2358 +#: ../../c-api/typeobj.rst:2375 ../../c-api/typeobj.rst:2392 +#: ../../c-api/typeobj.rst:2408 +msgid "This field is not inherited." +msgstr "这个字段不会被继承。" + +#: ../../c-api/typeobj.rst:2340 +msgid "" +"Tuple containing the expanded set of base types, starting with the type " +"itself and ending with :class:`object`, in Method Resolution Order." +msgstr "包含基类型的扩展集的元组,以类型本身开始并以 :class:`object` 作为结束,使用方法解析顺序。" + +#: ../../c-api/typeobj.rst:2348 +msgid "" +"This field is not inherited; it is calculated fresh by " +":c:func:`PyType_Ready`." +msgstr "这个字段不会被继承;它是通过 :c:func:`PyType_Ready` 计算得到的。" + +#: ../../c-api/typeobj.rst:2354 +msgid "Unused. Internal use only." +msgstr "尚未使用。仅供内部使用。" + +#: ../../c-api/typeobj.rst:2363 +msgid "" +"A collection of subclasses. Internal use only. May be an invalid pointer." +msgstr "一组子类。仅限内部使用。可能为无效的指针。" + +#: ../../c-api/typeobj.rst:2365 +msgid "" +"To get a list of subclasses, call the Python method " +":py:meth:`~type.__subclasses__`." +msgstr "要获取子类的列表,则调用 Python 方法 :py:meth:`~type.__subclasses__`。" + +#: ../../c-api/typeobj.rst:2370 +msgid "" +"For some types, this field does not hold a valid :c:expr:`PyObject*`. The " +"type was changed to :c:expr:`void*` to indicate this." +msgstr "对于某些类型,该字段将不带有效的 :c:expr:`PyObject*`。类型已被改为 :c:expr:`void*` 以指明这一点。" + +#: ../../c-api/typeobj.rst:2380 +msgid "" +"Weak reference list head, for weak references to this type object. Not " +"inherited. Internal use only." +msgstr "弱引用列表头,用于指向该类型对象的弱引用。不会被继承。仅限内部使用。" + +#: ../../c-api/typeobj.rst:2385 +msgid "" +"Internals detail: For the static builtin types this is always ``NULL``, even" +" if weakrefs are added. Instead, the weakrefs for each are stored on " +"``PyInterpreterState``. Use the public C-API or the internal " +"``_PyObject_GET_WEAKREFS_LISTPTR()`` macro to avoid the distinction." +msgstr "" +"内部细节:对于静态内置类型这将总是为 ``NULL``,即使添加了弱引用也是如此。每个弱引用都转而保存在 ``PyInterpreterState`` " +"上。请使用公共 C-API 或内部 ``_PyObject_GET_WEAKREFS_LISTPTR()`` 宏来避免此差异。" + +#: ../../c-api/typeobj.rst:2399 +msgid "" +"This field is deprecated. Use :c:member:`~PyTypeObject.tp_finalize` " +"instead." +msgstr "该字段已被弃用。请改用 :c:member:`~PyTypeObject.tp_finalize`。" + +#: ../../c-api/typeobj.rst:2404 +msgid "Used to index into the method cache. Internal use only." +msgstr "用于索引至方法缓存。仅限内部使用。" + +#: ../../c-api/typeobj.rst:2415 +msgid "" +"An optional pointer to an instance finalization function. This is the C " +"implementation of the :meth:`~object.__del__` special method. Its signature" +" is::" +msgstr "一个可选的指向实例终结函数的指针。这是 :meth:`~object.__del__` 特殊方法的 C 实现。其签名如下::" + +#: ../../c-api/typeobj.rst:2419 +msgid "void tp_finalize(PyObject *self);" +msgstr "void tp_finalize(PyObject *self);" + +#: ../../c-api/typeobj.rst:2421 +msgid "" +"The primary purpose of finalization is to perform any non-trivial cleanup " +"that must be performed before the object is destroyed, while the object and " +"any other objects it directly or indirectly references are still in a " +"consistent state. The finalizer is allowed to execute arbitrary Python " +"code." +msgstr "" +"终结器的主要目的是在对象被销毁之前执行任何必须进行的非平凡的清理工作——此时对象及其直接或间接引用的任何其他对象仍处于一致状态。终结器允许执行任意的 " +"Python 代码。" + +#: ../../c-api/typeobj.rst:2427 +msgid "" +"Before Python automatically finalizes an object, some of the object's direct" +" or indirect referents might have themselves been automatically finalized. " +"However, none of the referents will have been automatically cleared " +"(:c:member:`~PyTypeObject.tp_clear`) yet." +msgstr "" +"在 Python 自动终结一个对象之前,该对象的一些直接或间接引用对象可能已经自动终结。 然而,这些引用对象尚未被自动清除 " +"(:c:member:`~PyTypeObject.tp_clear`)。" + +#: ../../c-api/typeobj.rst:2432 +msgid "" +"Other non-finalized objects might still be using a finalized object, so the " +"finalizer must leave the object in a sane state (e.g., invariants are still " +"met)." +msgstr "其他未终结的对象可能仍在使用已终结的对象,因此终结器必须确保该对象保持合理状态(例如,仍满足所有不变式条件)。" + +#: ../../c-api/typeobj.rst:2438 +msgid "" +"After Python automatically finalizes an object, Python might start " +"automatically clearing (:c:member:`~PyTypeObject.tp_clear`) the object and " +"its referents (direct and indirect). Cleared objects are not guaranteed to " +"be in a consistent state; a finalized object must be able to tolerate " +"cleared referents." +msgstr "" +"在 Python 自动终结一个对象之后,Python 可能会开始自动清除 (:c:member:`~PyTypeObject.tp_clear`) " +"该对象及其(直接和间接)引用对象。 被清除的对象不保证处于一致状态;已终结的对象必须能够容忍被清除的引用对象。" + +#: ../../c-api/typeobj.rst:2446 +msgid "" +"An object is not guaranteed to be automatically finalized before its " +"destructor (:c:member:`~PyTypeObject.tp_dealloc`) is called. It is " +"recommended to call :c:func:`PyObject_CallFinalizerFromDealloc` at the " +"beginning of :c:member:`!tp_dealloc` to guarantee that the object is always " +"finalized before destruction." +msgstr "" +"不保证在对象的析构函数 (:c:member:`~PyTypeObject.tp_dealloc`) 被调用之前自动终结对象。建议在 " +":c:member:`!tp_dealloc` 的开始处调用 " +":c:func:`PyObject_CallFinalizerFromDealloc`,以确保在销毁之前总是终结对象。" + +#: ../../c-api/typeobj.rst:2454 +msgid "" +"The :c:member:`~PyTypeObject.tp_finalize` function can be called from any " +"thread, although the :term:`GIL` will be held." +msgstr "" +":c:member:`~PyTypeObject.tp_finalize` 函数可以从任何线程调用,尽管 :term:`GIL` 会被持有。" + +#: ../../c-api/typeobj.rst:2459 +msgid "" +"The :c:member:`!tp_finalize` function can be called during shutdown, after " +"some global variables have been deleted. See the documentation of the " +":meth:`~object.__del__` method for details." +msgstr "" +":c:member:`!tp_finalize` 函数可以在关闭过程中调用,此时一些全局变量可能已被删除。详见 " +":meth:`~object.__del__` 方法的文档。" + +#: ../../c-api/typeobj.rst:2463 +msgid "" +"When Python finalizes an object, it behaves like the following algorithm:" +msgstr "当 Python 终结一个对象时,其行为类似于以下算法:" + +#: ../../c-api/typeobj.rst:2465 +msgid "" +"Python might mark the object as *finalized*. Currently, Python always marks" +" objects whose type supports garbage collection (i.e., the " +":c:macro:`Py_TPFLAGS_HAVE_GC` flag is set in " +":c:member:`~PyTypeObject.tp_flags`) and never marks other types of objects; " +"this might change in a future version." +msgstr "" +"Python 可能会将对象标记为 *已终结*。目前,Python " +"总是标记那些其类型支持垃圾收集的对象(即,:c:macro:`Py_TPFLAGS_HAVE_GC` 标志在 " +":c:member:`~PyTypeObject.tp_flags` 中设置)并且从不标记其他类型的对象;这一点在未来版本中可能会改变。" + +#: ../../c-api/typeobj.rst:2470 +msgid "" +"If the object is not marked as *finalized* and its :c:member:`!tp_finalize` " +"finalizer function is non-``NULL``, the finalizer function is called." +msgstr "" +"如果对象未被标记为 *已终结* 且其 :c:member:`!tp_finalize` 终结器函数不为 ``NULL``,则会调用该终结器函数。" + +#: ../../c-api/typeobj.rst:2473 +msgid "" +"If the finalizer function was called and the finalizer made the object " +"reachable (i.e., there is a reference to the object and it is not a member " +"of a :term:`cyclic isolate`), then the finalizer is said to have " +"*resurrected* the object. It is unspecified whether the finalizer can also " +"resurrect the object by adding a new reference to the object that does not " +"make it reachable, i.e., the object is (still) a member of a cyclic isolate." +msgstr "" +"如果终结器函数被调用并且终结器使对象变得可达(即,存在对该对象的引用且它不是 :term:`cyclic isolate` 的成员),则称终结器 " +"*复活* 了该对象。若终结器通过添加新引用使对象变为可达(但该对象仍属于某个循环隔离),则是否算作复活行为是未定义的。" + +#: ../../c-api/typeobj.rst:2480 +msgid "" +"If the finalizer resurrected the object, the object's pending destruction is" +" canceled and the object's *finalized* mark might be removed if present. " +"Currently, Python never removes the *finalized* mark; this might change in a" +" future version." +msgstr "" +"如果终结器复活了对象,对象的待销毁状态将被取消,并且如果存在,对象的 *已终结* 标记可能会被移除。目前,Python 从不移除 *已终结* " +"标记;这一点在未来版本中可能会改变。" + +#: ../../c-api/typeobj.rst:2485 +msgid "" +"*Automatic finalization* refers to any finalization performed by Python " +"except via calls to :c:func:`PyObject_CallFinalizer` or " +":c:func:`PyObject_CallFinalizerFromDealloc`. No guarantees are made about " +"when, if, or how often an object is automatically finalized, except:" +msgstr "" +"*自动终结* 指的是由 Python 执行的任何终结操作,但不包括通过调用 :c:func:`PyObject_CallFinalizer` 或 " +":c:func:`PyObject_CallFinalizerFromDealloc` " +"进行的终结。关于对象何时、是否或多久被自动终结一次,没有任何保证,除了:" + +#: ../../c-api/typeobj.rst:2490 +msgid "" +"Python will not automatically finalize an object if it is reachable, i.e., " +"there is a reference to it and it is not a member of a :term:`cyclic " +"isolate`." +msgstr "如果对象是可达的,即存在对它的引用且它不是 :term:`cyclic isolate` 的成员,Python 不会自动终结该对象。" + +#: ../../c-api/typeobj.rst:2493 +msgid "" +"Python will not automatically finalize an object if finalizing it would not " +"mark the object as *finalized*. Currently, this applies to objects whose " +"type does not support garbage collection, i.e., the " +":c:macro:`Py_TPFLAGS_HAVE_GC` flag is not set. Such objects can still be " +"manually finalized by calling :c:func:`PyObject_CallFinalizer` or " +":c:func:`PyObject_CallFinalizerFromDealloc`." +msgstr "" +"如果终结对象不会将其标记为 *已终结*,Python 也不会自动终结该对象。目前,这适用于那些其类型不支持垃圾收集的对象,即 " +":c:macro:`Py_TPFLAGS_HAVE_GC` 标志未设置。此类对象仍然可以通过调用 " +":c:func:`PyObject_CallFinalizer` 或 " +":c:func:`PyObject_CallFinalizerFromDealloc` 进行手动终结。" + +#: ../../c-api/typeobj.rst:2499 +msgid "" +"Python will not automatically finalize any two members of a :term:`cyclic " +"isolate` concurrently." +msgstr "Python 不会自动并发地终结 :term:`cyclic isolate` 的任意两个成员。" + +#: ../../c-api/typeobj.rst:2501 +msgid "" +"Python will not automatically finalize an object after it has automatically " +"cleared (:c:member:`~PyTypeObject.tp_clear`) the object." +msgstr "Python 不会在自动清除 (:c:member:`~PyTypeObject.tp_clear`) 对象后自动终结该对象。" + +#: ../../c-api/typeobj.rst:2503 +msgid "" +"If an object is a member of a :term:`cyclic isolate`, Python will not " +"automatically finalize it after automatically clearing (see " +":c:member:`~PyTypeObject.tp_clear`) any other member." +msgstr "" +"如果一个对象是 :term:`cyclic isolate` 的成员,Python 不会在自动清除 (参见 " +":c:member:`~PyTypeObject.tp_clear`) 其他成员后自动终结它。" + +#: ../../c-api/typeobj.rst:2506 +msgid "" +"Python will automatically finalize every member of a :term:`cyclic isolate` " +"before it automatically clears (see :c:member:`~PyTypeObject.tp_clear`) any " +"of them." +msgstr "" +"Python 会在自动清除 (参见 :c:member:`~PyTypeObject.tp_clear`) 任何成员之前,自动终结 " +":term:`cyclic isolate` 的所有成员。" + +#: ../../c-api/typeobj.rst:2509 +msgid "" +"If Python is going to automatically clear an object " +"(:c:member:`~PyTypeObject.tp_clear`), it will automatically finalize the " +"object first." +msgstr "" +"如果 Python 将要自动清除一个对象 (:c:member:`~PyTypeObject.tp_clear`),它将首先自动终结该对象。" + +#: ../../c-api/typeobj.rst:2513 +msgid "" +"Python currently only automatically finalizes objects that are members of a " +":term:`cyclic isolate`, but future versions might finalize objects regularly" +" before their destruction." +msgstr "" +"目前 Python 只会自动终结属于 :term:`cyclic isolate` 的成员对象,但未来版本可能会在对象销毁前常规性地终结对象。" + +#: ../../c-api/typeobj.rst:2517 +msgid "" +"To manually finalize an object, do not call this function directly; call " +":c:func:`PyObject_CallFinalizer` or " +":c:func:`PyObject_CallFinalizerFromDealloc` instead." +msgstr "" +"要手动终结一个对象,请勿直接调用此函数;而应调用 :c:func:`PyObject_CallFinalizer` 或 " +":c:func:`PyObject_CallFinalizerFromDealloc`." + +#: ../../c-api/typeobj.rst:2521 +msgid "" +":c:member:`~PyTypeObject.tp_finalize` should leave the current exception " +"status unchanged. The recommended way to write a non-trivial finalizer is " +"to back up the exception at the beginning by calling " +":c:func:`PyErr_GetRaisedException` and restore the exception at the end by " +"calling :c:func:`PyErr_SetRaisedException`. If an exception is encountered " +"in the middle of the finalizer, log and clear it with " +":c:func:`PyErr_WriteUnraisable` or :c:func:`PyErr_FormatUnraisable`. For " +"example::" +msgstr "" +":c:member:`~PyTypeObject.tp_finalize` 应保持当前异常状态不变。编写非平凡终结器的推荐方法是,在开始时通过调用 " +":c:func:`PyErr_GetRaisedException` 备份异常,并在结束时通过调用 " +":c:func:`PyErr_SetRaisedException` 恢复异常。如果在终结器中间遇到异常,请使用 " +":c:func:`PyErr_WriteUnraisable` 或 :c:func:`PyErr_FormatUnraisable` " +"记录并清除它。例如:" + +#: ../../c-api/typeobj.rst:2530 +msgid "" +"static void\n" +"foo_finalize(PyObject *self)\n" +"{\n" +" // Save the current exception, if any.\n" +" PyObject *exc = PyErr_GetRaisedException();\n" +"\n" +" // ...\n" +"\n" +" if (do_something_that_might_raise() != success_indicator) {\n" +" PyErr_WriteUnraisable(self);\n" +" goto done;\n" +" }\n" +"\n" +"done:\n" +" // Restore the saved exception. This silently discards any exception\n" +" // raised above, so be sure to call PyErr_WriteUnraisable first if\n" +" // necessary.\n" +" PyErr_SetRaisedException(exc);\n" +"}" +msgstr "" +"static void\n" +"foo_finalize(PyObject *self)\n" +"{\n" +" // 保存当前异常(如果有)。\n" +" PyObject *exc = PyErr_GetRaisedException();\n" +"\n" +" // ...\n" +"\n" +" if (do_something_that_might_raise() != success_indicator) {\n" +" PyErr_WriteUnraisable(self);\n" +" goto done;\n" +" }\n" +"\n" +"done:\n" +" // 恢复保存的异常。这将静默丢弃上述任何异常,\n" +" // 因此在必要时请先调用 PyErr_WriteUnraisable。\n" +" PyErr_SetRaisedException(exc);\n" +"}" + +#: ../../c-api/typeobj.rst:2558 +msgid "" +"Before version 3.8 it was necessary to set the " +":c:macro:`Py_TPFLAGS_HAVE_FINALIZE` flags bit in order for this field to be " +"used. This is no longer required." +msgstr "" +"在 3.8 版之前必须设置 :c:macro:`Py_TPFLAGS_HAVE_FINALIZE` 标志位才能让该字段被使用。现在已不再需要这样做。" + +#: ../../c-api/typeobj.rst:2564 +msgid ":pep:`442`: \"Safe object finalization\"" +msgstr ":pep:`442`: \"安全对象终结\"" + +#: ../../c-api/typeobj.rst:2567 +msgid ":c:func:`PyObject_CallFinalizer`" +msgstr ":c:func:`PyObject_CallFinalizer`" + +#: ../../c-api/typeobj.rst:2568 +msgid ":c:func:`PyObject_CallFinalizerFromDealloc`" +msgstr ":c:func:`PyObject_CallFinalizerFromDealloc`" + +#: ../../c-api/typeobj.rst:2575 +msgid "" +"A :ref:`vectorcall function ` to use for calls of this type " +"object (rather than instances). In other words, ``tp_vectorcall`` can be " +"used to optimize ``type.__call__``, which typically returns a new instance " +"of *type*." +msgstr "" +"用于此类型对象(而不是实例)调用的 :ref:`vectorcall 函数 `。换句话说,``tp_vectorcall`` " +"可以用来优化 ``type.__call__``,这通常会返回 *type* 的新实例。" + +#: ../../c-api/typeobj.rst:2580 +msgid "" +"As with any vectorcall function, if ``tp_vectorcall`` is ``NULL``, the " +"*tp_call* protocol (``Py_TYPE(type)->tp_call``) is used instead." +msgstr "" +"与任何 vectorcall 函数一样,如果 ``tp_vectorcall`` 为 ``NULL``,则使用 *tp_call* 协议 " +"(``Py_TYPE(type)->tp_call``)。" + +#: ../../c-api/typeobj.rst:2585 +msgid "" +"The :ref:`vectorcall protocol ` requires that the vectorcall " +"function has the same behavior as the corresponding ``tp_call``. This means " +"that ``type->tp_vectorcall`` must match the behavior of " +"``Py_TYPE(type)->tp_call``." +msgstr "" +":ref:`vectorcall 协议 ` 要求 vectorcall 函数具有与相应的 ``tp_call`` " +"相同的行为。这意味着 ``type->tp_vectorcall`` 必须与 ``Py_TYPE(type)->tp_call`` 的行为相匹配。" + +#: ../../c-api/typeobj.rst:2590 +msgid "" +"Specifically, if *type* uses the default metaclass, ``type->tp_vectorcall`` " +"must behave the same as :c:expr:`PyType_Type->tp_call`, which:" +msgstr "" +"具体来说,如果 *type* 使用默认的元类,``type->tp_vectorcall`` 的行为必须与 " +":c:expr:`PyType_Type->tp_call` 相同:" + +#: ../../c-api/typeobj.rst:2594 +msgid "calls ``type->tp_new``," +msgstr "调用 ``type->tp_new``," + +#: ../../c-api/typeobj.rst:2596 +msgid "" +"if the result is a subclass of *type*, calls ``type->tp_init`` on the result" +" of ``tp_new``, and" +msgstr "当结果是 *type* 的子类时,将在 ``tp_new`` 的结果上调用 ``type->tp_init``,并且" + +#: ../../c-api/typeobj.rst:2599 +msgid "returns the result of ``tp_new``." +msgstr "返回 ``tp_new`` 的结果。" + +#: ../../c-api/typeobj.rst:2601 +msgid "" +"Typically, ``tp_vectorcall`` is overridden to optimize this process for " +"specific :c:member:`~PyTypeObject.tp_new` and " +":c:member:`~PyTypeObject.tp_init`. When doing this for user-subclassable " +"types, note that both can be overridden (using :py:func:`~object.__new__` " +"and :py:func:`~object.__init__`, respectively)." +msgstr "" +"通常,``tp_vectorcall`` 会被重写以针对特定的 :c:member:`~PyTypeObject.tp_new` 和 " +":c:member:`~PyTypeObject.tp_init` 优化此进程。当为可被用户子类化的类型上这样做时,请注意两者都可被重写 (分别使用 " +":py:func:`~object.__new__` 和 :py:func:`~object.__init__`)。" + +#: ../../c-api/typeobj.rst:2612 +msgid "This field is never inherited." +msgstr "这个字段不会被继承。" + +#: ../../c-api/typeobj.rst:2614 +msgid "(the field exists since 3.8 but it's only used since 3.9)" +msgstr "(这个字段从 3.8 起即存在,但是从 3.9 开始投入使用)" + +#: ../../c-api/typeobj.rst:2619 +msgid "Internal. Do not use." +msgstr "内部使用。请勿使用。" + +#: ../../c-api/typeobj.rst:2627 +msgid "Static Types" +msgstr "静态类型" + +#: ../../c-api/typeobj.rst:2629 +msgid "" +"Traditionally, types defined in C code are *static*, that is, a static " +":c:type:`PyTypeObject` structure is defined directly in code and initialized" +" using :c:func:`PyType_Ready`." +msgstr "" +"在传统上,在 C 代码中定义的类型都是 *静态的*,也就是说,:c:type:`PyTypeObject` 结构体在代码中直接定义并使用 " +":c:func:`PyType_Ready` 来初始化。" + +#: ../../c-api/typeobj.rst:2633 +msgid "" +"This results in types that are limited relative to types defined in Python:" +msgstr "这就导致了与在 Python 中定义的类型相关联的类型限制:" + +#: ../../c-api/typeobj.rst:2635 +msgid "" +"Static types are limited to one base, i.e. they cannot use multiple " +"inheritance." +msgstr "静态类型只能拥有一个基类;换句话说,他们不能使用多重继承。" + +#: ../../c-api/typeobj.rst:2637 +msgid "" +"Static type objects (but not necessarily their instances) are immutable. It " +"is not possible to add or modify the type object's attributes from Python." +msgstr "静态类型对象(但并非它们的实例)是不可变对象。不可能在 Python 中添加或修改类型对象的属性。" + +#: ../../c-api/typeobj.rst:2639 +msgid "" +"Static type objects are shared across :ref:`sub-interpreters `, so they should not include any subinterpreter-" +"specific state." +msgstr "" +"静态类型对象是跨 :ref:`子解释器 ` 共享的,因此它们不应包括任何子解释器专属的状态。" + +#: ../../c-api/typeobj.rst:2643 +msgid "" +"Also, since :c:type:`PyTypeObject` is only part of the :ref:`Limited API " +"` as an opaque struct, any extension modules using static " +"types must be compiled for a specific Python minor version." +msgstr "" +"此外,由于 :c:type:`PyTypeObject` 只是作为不透明结构的 :ref:`受限 API ` " +"的一部分,因此任何使用静态类型的扩展模块都必须针对特定的 Python 次版本进行编译。" + +#: ../../c-api/typeobj.rst:2651 +msgid "Heap Types" +msgstr "堆类型" + +#: ../../c-api/typeobj.rst:2653 +msgid "" +"An alternative to :ref:`static types ` is *heap-allocated " +"types*, or *heap types* for short, which correspond closely to classes " +"created by Python's ``class`` statement. Heap types have the " +":c:macro:`Py_TPFLAGS_HEAPTYPE` flag set." +msgstr "" +"一种 :ref:`静态类型的 ` 替代物是 *堆分配类型*,或者简称 *堆类型*,它与使用 Python 的 " +"``class`` 语句创建的类紧密对应。堆类型设置了 :c:macro:`Py_TPFLAGS_HEAPTYPE` 旗标。" + +#: ../../c-api/typeobj.rst:2658 +msgid "" +"This is done by filling a :c:type:`PyType_Spec` structure and calling " +":c:func:`PyType_FromSpec`, :c:func:`PyType_FromSpecWithBases`, " +":c:func:`PyType_FromModuleAndSpec`, or :c:func:`PyType_FromMetaclass`." +msgstr "" +"这是通过填充 :c:type:`PyType_Spec` 结构体并调用 :c:func:`PyType_FromSpec`, " +":c:func:`PyType_FromSpecWithBases`, :c:func:`PyType_FromModuleAndSpec` 或 " +":c:func:`PyType_FromMetaclass` 来实现的。" + +#: ../../c-api/typeobj.rst:2666 +msgid "Number Object Structures" +msgstr "数字对象结构体" + +#: ../../c-api/typeobj.rst:2673 +msgid "" +"This structure holds pointers to the functions which an object uses to " +"implement the number protocol. Each function is used by the function of " +"similar name documented in the :ref:`number` section." +msgstr "该结构体持有指向被对象用来实现数字协议的函数的指针。每个函数都被 :ref:`number` 一节中记录的对应名称的函数所使用。" + +#: ../../c-api/typeobj.rst:2679 ../../c-api/typeobj.rst:3163 +msgid "Here is the structure definition::" +msgstr "结构体定义如下::" + +#: ../../c-api/typeobj.rst:2681 +msgid "" +"typedef struct {\n" +" binaryfunc nb_add;\n" +" binaryfunc nb_subtract;\n" +" binaryfunc nb_multiply;\n" +" binaryfunc nb_remainder;\n" +" binaryfunc nb_divmod;\n" +" ternaryfunc nb_power;\n" +" unaryfunc nb_negative;\n" +" unaryfunc nb_positive;\n" +" unaryfunc nb_absolute;\n" +" inquiry nb_bool;\n" +" unaryfunc nb_invert;\n" +" binaryfunc nb_lshift;\n" +" binaryfunc nb_rshift;\n" +" binaryfunc nb_and;\n" +" binaryfunc nb_xor;\n" +" binaryfunc nb_or;\n" +" unaryfunc nb_int;\n" +" void *nb_reserved;\n" +" unaryfunc nb_float;\n" +"\n" +" binaryfunc nb_inplace_add;\n" +" binaryfunc nb_inplace_subtract;\n" +" binaryfunc nb_inplace_multiply;\n" +" binaryfunc nb_inplace_remainder;\n" +" ternaryfunc nb_inplace_power;\n" +" binaryfunc nb_inplace_lshift;\n" +" binaryfunc nb_inplace_rshift;\n" +" binaryfunc nb_inplace_and;\n" +" binaryfunc nb_inplace_xor;\n" +" binaryfunc nb_inplace_or;\n" +"\n" +" binaryfunc nb_floor_divide;\n" +" binaryfunc nb_true_divide;\n" +" binaryfunc nb_inplace_floor_divide;\n" +" binaryfunc nb_inplace_true_divide;\n" +"\n" +" unaryfunc nb_index;\n" +"\n" +" binaryfunc nb_matrix_multiply;\n" +" binaryfunc nb_inplace_matrix_multiply;\n" +"} PyNumberMethods;" +msgstr "" +"typedef struct {\n" +" binaryfunc nb_add;\n" +" binaryfunc nb_subtract;\n" +" binaryfunc nb_multiply;\n" +" binaryfunc nb_remainder;\n" +" binaryfunc nb_divmod;\n" +" ternaryfunc nb_power;\n" +" unaryfunc nb_negative;\n" +" unaryfunc nb_positive;\n" +" unaryfunc nb_absolute;\n" +" inquiry nb_bool;\n" +" unaryfunc nb_invert;\n" +" binaryfunc nb_lshift;\n" +" binaryfunc nb_rshift;\n" +" binaryfunc nb_and;\n" +" binaryfunc nb_xor;\n" +" binaryfunc nb_or;\n" +" unaryfunc nb_int;\n" +" void *nb_reserved;\n" +" unaryfunc nb_float;\n" +"\n" +" binaryfunc nb_inplace_add;\n" +" binaryfunc nb_inplace_subtract;\n" +" binaryfunc nb_inplace_multiply;\n" +" binaryfunc nb_inplace_remainder;\n" +" ternaryfunc nb_inplace_power;\n" +" binaryfunc nb_inplace_lshift;\n" +" binaryfunc nb_inplace_rshift;\n" +" binaryfunc nb_inplace_and;\n" +" binaryfunc nb_inplace_xor;\n" +" binaryfunc nb_inplace_or;\n" +"\n" +" binaryfunc nb_floor_divide;\n" +" binaryfunc nb_true_divide;\n" +" binaryfunc nb_inplace_floor_divide;\n" +" binaryfunc nb_inplace_true_divide;\n" +"\n" +" unaryfunc nb_index;\n" +"\n" +" binaryfunc nb_matrix_multiply;\n" +" binaryfunc nb_inplace_matrix_multiply;\n" +"} PyNumberMethods;" + +#: ../../c-api/typeobj.rst:2726 +msgid "" +"Binary and ternary functions must check the type of all their operands, and " +"implement the necessary conversions (at least one of the operands is an " +"instance of the defined type). If the operation is not defined for the " +"given operands, binary and ternary functions must return " +"``Py_NotImplemented``, if another error occurred they must return ``NULL`` " +"and set an exception." +msgstr "" +"双目和三目函数必须检查其所有操作数的类型,并实现必要的转换(至少有一个操作数是所定义类型的实例)。 " +"如果没有为所给出的操作数定义操作,则双目和三目函数必须返回 ``Py_NotImplemented``,如果发生了其他错误则它们必须返回 " +"``NULL`` 并设置一个异常。" + +#: ../../c-api/typeobj.rst:2735 +msgid "" +"The :c:member:`~PyNumberMethods.nb_reserved` field should always be " +"``NULL``. It was previously called :c:member:`!nb_long`, and was renamed in" +" Python 3.0.1." +msgstr "" +":c:member:`~PyNumberMethods.nb_reserved` 字段应当始终为 ``NULL``。在之前版本中其名称为 " +":c:member:`!nb_long`,并在 Python 3.0.1 中改名。" + +#: ../../c-api/typeobj.rst:2886 +msgid "Mapping Object Structures" +msgstr "映射对象结构体" + +#: ../../c-api/typeobj.rst:2893 +msgid "" +"This structure holds pointers to the functions which an object uses to " +"implement the mapping protocol. It has three members:" +msgstr "该结构体持有指向对象用于实现映射协议的函数的指针。它有三个成员:" + +#: ../../c-api/typeobj.rst:2900 +msgid "" +"This function is used by :c:func:`PyMapping_Size` and " +":c:func:`PyObject_Size`, and has the same signature. This slot may be set " +"to ``NULL`` if the object has no defined length." +msgstr "" +"该函数将被 :c:func:`PyMapping_Size` 和 :c:func:`PyObject_Size` 使用,并具有相同的签名。 " +"如果对象没有定义长度则此槽位可被设为 ``NULL``。" + +#: ../../c-api/typeobj.rst:2908 +msgid "" +"This function is used by :c:func:`PyObject_GetItem` and " +":c:func:`PySequence_GetSlice`, and has the same signature as " +":c:func:`!PyObject_GetItem`. This slot must be filled for the " +":c:func:`PyMapping_Check` function to return ``1``, it can be ``NULL`` " +"otherwise." +msgstr "" +"该函数将被 :c:func:`PyObject_GetItem` 和 :c:func:`PySequence_GetSlice` 使用,并具有与 " +":c:func:`!PyObject_GetItem` 相同的签名。此槽位必须被填充以便 :c:func:`PyMapping_Check` 函数返回 " +"``1``,否则它可以为 ``NULL``。" + +#: ../../c-api/typeobj.rst:2918 +msgid "" +"This function is used by :c:func:`PyObject_SetItem`, " +":c:func:`PyObject_DelItem`, :c:func:`PySequence_SetSlice` and " +":c:func:`PySequence_DelSlice`. It has the same signature as " +":c:func:`!PyObject_SetItem`, but *v* can also be set to ``NULL`` to delete " +"an item. If this slot is ``NULL``, the object does not support item " +"assignment and deletion." +msgstr "" +"该函数将被 :c:func:`PyObject_SetItem`, :c:func:`PyObject_DelItem`, " +":c:func:`PySequence_SetSlice` 和 :c:func:`PySequence_DelSlice` 使用。它具有与 " +":c:func:`!PyObject_SetItem` 相同的签名,但 *v* 也可以被设为 ``NULL`` 以删除一个条目。如果此槽位为 " +"``NULL``,则对象将不支持条目赋值和删除。" + +#: ../../c-api/typeobj.rst:2929 +msgid "Sequence Object Structures" +msgstr "序列对象结构体" + +#: ../../c-api/typeobj.rst:2936 +msgid "" +"This structure holds pointers to the functions which an object uses to " +"implement the sequence protocol." +msgstr "该结构体持有指向对象用于实现序列协议的函数的指针。" + +#: ../../c-api/typeobj.rst:2943 +msgid "" +"This function is used by :c:func:`PySequence_Size` and " +":c:func:`PyObject_Size`, and has the same signature. It is also used for " +"handling negative indices via the :c:member:`~PySequenceMethods.sq_item` and" +" the :c:member:`~PySequenceMethods.sq_ass_item` slots." +msgstr "" +"此函数被 :c:func:`PySequence_Size` 和 :c:func:`PyObject_Size` 所使用,并具有与它们相同的签名。 " +"它还被用于通过 :c:member:`~PySequenceMethods.sq_item` 和 " +":c:member:`~PySequenceMethods.sq_ass_item` 槽位来处理负索引号。" + +#: ../../c-api/typeobj.rst:2952 +msgid "" +"This function is used by :c:func:`PySequence_Concat` and has the same " +"signature. It is also used by the ``+`` operator, after trying the numeric " +"addition via the :c:member:`~PyNumberMethods.nb_add` slot." +msgstr "" +"此函数被 :c:func:`PySequence_Concat` 所使用并具有相同的签名。在尝试通过 " +":c:member:`~PyNumberMethods.nb_add` 槽位执行数值相加之后它还会被用于 ``+`` 运算符。" + +#: ../../c-api/typeobj.rst:2960 +msgid "" +"This function is used by :c:func:`PySequence_Repeat` and has the same " +"signature. It is also used by the ``*`` operator, after trying numeric " +"multiplication via the :c:member:`~PyNumberMethods.nb_multiply` slot." +msgstr "" +"此函数被 :c:func:`PySequence_Repeat` 所使用并具有相同的签名。在尝试通过 " +":c:member:`~PyNumberMethods.nb_multiply` 槽位执行数值相乘之后它还会被用于 ``*`` 运算符。" + +#: ../../c-api/typeobj.rst:2968 +msgid "" +"This function is used by :c:func:`PySequence_GetItem` and has the same " +"signature. It is also used by :c:func:`PyObject_GetItem`, after trying the " +"subscription via the :c:member:`~PyMappingMethods.mp_subscript` slot. This " +"slot must be filled for the :c:func:`PySequence_Check` function to return " +"``1``, it can be ``NULL`` otherwise." +msgstr "" +"此函数被 :c:func:`PySequence_GetItem` 所使用并具有相同的签名。在尝试通过 " +":c:member:`~PyMappingMethods.mp_subscript` 槽位执行下标操作之后它还会被用于 " +":c:func:`PyObject_GetItem`。该槽位必须被填充以便 :c:func:`PySequence_Check` 函数返回 " +"``1``,否则它可以为 ``NULL``。" + +#: ../../c-api/typeobj.rst:2974 +msgid "" +"Negative indexes are handled as follows: if the " +":c:member:`~PySequenceMethods.sq_length` slot is filled, it is called and " +"the sequence length is used to compute a positive index which is passed to " +":c:member:`~PySequenceMethods.sq_item`. If :c:member:`!sq_length` is " +"``NULL``, the index is passed as is to the function." +msgstr "" +"负索引号是按如下方式处理的:如果 :c:member:`~PySequenceMethods.sq_length` " +"槽位已被填充,它将被调用并使用序列长度来计算出正索引号并传给 :c:member:`~PySequenceMethods.sq_item`。如果 " +":c:member:`!sq_length` 为 ``NULL``,索引号将原样传给此函数。" + +#: ../../c-api/typeobj.rst:2983 +msgid "" +"This function is used by :c:func:`PySequence_SetItem` and has the same " +"signature. It is also used by :c:func:`PyObject_SetItem` and " +":c:func:`PyObject_DelItem`, after trying the item assignment and deletion " +"via the :c:member:`~PyMappingMethods.mp_ass_subscript` slot. This slot may " +"be left to ``NULL`` if the object does not support item assignment and " +"deletion." +msgstr "" +"此函数被 :c:func:`PySequence_SetItem` 所使用并具有相同的签名。在尝试通过 " +":c:member:`~PyMappingMethods.mp_ass_subscript` 槽位执行条目赋值和删除操作之后它还会被用于 " +":c:func:`PyObject_SetItem` 和 :c:func:`PyObject_DelItem`。 " +"如果对象不支持条目和删除则该槽位可以保持为 ``NULL``。" + +#: ../../c-api/typeobj.rst:2994 +msgid "" +"This function may be used by :c:func:`PySequence_Contains` and has the same " +"signature. This slot may be left to ``NULL``, in this case " +":c:func:`!PySequence_Contains` simply traverses the sequence until it finds " +"a match." +msgstr "" +"该函数可供 :c:func:`PySequence_Contains` 使用并具有相同的签名。此槽位可以保持为 ``NULL``,在此情况下 " +":c:func:`!PySequence_Contains` 只需遍历该序列直到找到一个匹配。" + +#: ../../c-api/typeobj.rst:3003 +msgid "" +"This function is used by :c:func:`PySequence_InPlaceConcat` and has the same" +" signature. It should modify its first operand, and return it. This slot " +"may be left to ``NULL``, in this case :c:func:`!PySequence_InPlaceConcat` " +"will fall back to :c:func:`PySequence_Concat`. It is also used by the " +"augmented assignment ``+=``, after trying numeric in-place addition via the " +":c:member:`~PyNumberMethods.nb_inplace_add` slot." +msgstr "" +"此函数被 :c:func:`PySequence_InPlaceConcat` 所使用并具有相同的签名。它应当修改它的第一个操作数,并将其返回。 " +"该槽位可以保持为 ``NULL``,在此情况下 :c:func:`!PySequence_InPlaceConcat` 将回退到 " +":c:func:`PySequence_Concat`。在尝试通过 " +":c:member:`~PyNumberMethods.nb_inplace_add` 槽位执行数字原地相加之后它还会被用于增强赋值运算符 " +"``+=``。" + +#: ../../c-api/typeobj.rst:3014 +msgid "" +"This function is used by :c:func:`PySequence_InPlaceRepeat` and has the same" +" signature. It should modify its first operand, and return it. This slot " +"may be left to ``NULL``, in this case :c:func:`!PySequence_InPlaceRepeat` " +"will fall back to :c:func:`PySequence_Repeat`. It is also used by the " +"augmented assignment ``*=``, after trying numeric in-place multiplication " +"via the :c:member:`~PyNumberMethods.nb_inplace_multiply` slot." +msgstr "" +"此函数被 :c:func:`PySequence_InPlaceRepeat` 所使用并具有相同的签名。它应当修改它的第一个操作数,并将其返回。 " +"该槽位可以保持为 ``NULL``,在此情况下 :c:func:`!PySequence_InPlaceRepeat` 将回退到 " +":c:func:`PySequence_Repeat`。在尝试通过 " +":c:member:`~PyNumberMethods.nb_inplace_multiply` 槽位执行数字原地相乘之后它还会被用于增强赋值运算符 " +"``*=``。" + +#: ../../c-api/typeobj.rst:3025 +msgid "Buffer Object Structures" +msgstr "缓冲区对象结构体" + +#: ../../c-api/typeobj.rst:3033 +msgid "" +"This structure holds pointers to the functions required by the :ref:`Buffer " +"protocol `. The protocol defines how an exporter object can " +"expose its internal data to consumer objects." +msgstr "" +"此结构体持有指向 :ref:`缓冲区协议 ` 所需要的函数的指针。 " +"该协议定义了导出方对象要如何向消费方对象暴露其内部数据。" + +#: ../../c-api/typeobj.rst:3041 ../../c-api/typeobj.rst:3110 +#: ../../c-api/typeobj.rst:3176 ../../c-api/typeobj.rst:3189 +#: ../../c-api/typeobj.rst:3203 ../../c-api/typeobj.rst:3215 +msgid "The signature of this function is::" +msgstr "此函数的签名为::" + +#: ../../c-api/typeobj.rst:3043 +msgid "int (PyObject *exporter, Py_buffer *view, int flags);" +msgstr "int (PyObject *exporter, Py_buffer *view, int flags);" + +#: ../../c-api/typeobj.rst:3045 +msgid "" +"Handle a request to *exporter* to fill in *view* as specified by *flags*. " +"Except for point (3), an implementation of this function MUST take these " +"steps:" +msgstr "处理发给 *exporter* 的请求来填充 *flags* 所指定的 *view*。除第 (3) 点外,此函数的实现必须执行以下步骤:" + +#: ../../c-api/typeobj.rst:3049 +msgid "" +"Check if the request can be met. If not, raise :exc:`BufferError`, set " +"``view->obj`` to ``NULL`` and return ``-1``." +msgstr "" + +#: ../../c-api/typeobj.rst:3052 +msgid "Fill in the requested fields." +msgstr "填充请求的字段。" + +#: ../../c-api/typeobj.rst:3054 +msgid "Increment an internal counter for the number of exports." +msgstr "递增用于保存导出次数的内部计数器。" + +#: ../../c-api/typeobj.rst:3056 +msgid "Set ``view->obj`` to *exporter* and increment ``view->obj``." +msgstr "" + +#: ../../c-api/typeobj.rst:3058 +msgid "Return ``0``." +msgstr "返回 ``0``。" + +#: ../../c-api/typeobj.rst:3060 ../../c-api/typeobj.rst:3123 +msgid "**Thread safety:**" +msgstr "**线程安全:**" + +#: ../../c-api/typeobj.rst:3062 +msgid "In the :term:`free-threaded build`, implementations must ensure:" +msgstr "在 :term:`free-threaded build` 中,实现必须确保:" + +#: ../../c-api/typeobj.rst:3064 +msgid "The export counter increment in step (3) is atomic." +msgstr "步骤 (3) 中的导出计数器递增是原子化的。" + +#: ../../c-api/typeobj.rst:3066 +msgid "" +"The underlying buffer data remains valid and at a stable memory location for" +" the lifetime of all exports." +msgstr "下层的缓冲区数据在所有导出的生命期内保持有效并处在稳定的内存位置。" + +#: ../../c-api/typeobj.rst:3069 +msgid "" +"For objects that support resizing or reallocation (such as " +":class:`bytearray`), the export counter is checked atomically before such " +"operations, and :exc:`BufferError` is raised if exports exist." +msgstr "" + +#: ../../c-api/typeobj.rst:3073 +msgid "The function is safe to call concurrently from multiple threads." +msgstr "" + +#: ../../c-api/typeobj.rst:3075 +msgid "" +"See also :ref:`thread-safety-memoryview` for the Python-level thread safety " +"guarantees of :class:`memoryview` objects." +msgstr "" + +#: ../../c-api/typeobj.rst:3078 +msgid "" +"If *exporter* is part of a chain or tree of buffer providers, two main " +"schemes can be used:" +msgstr "如果 *exporter* 是缓冲区提供方的链式或树型结构的一部分,则可以使用两种主要方案:" + +#: ../../c-api/typeobj.rst:3081 +msgid "" +"Re-export: Each member of the tree acts as the exporting object and sets " +"``view->obj`` to a new reference to itself." +msgstr "" + +#: ../../c-api/typeobj.rst:3084 +msgid "" +"Redirect: The buffer request is redirected to the root object of the tree. " +"Here, ``view->obj`` will be a new reference to the root object." +msgstr "" + +#: ../../c-api/typeobj.rst:3088 +msgid "" +"The individual fields of *view* are described in section :ref:`Buffer " +"structure `, the rules how an exporter must react to " +"specific requests are in section :ref:`Buffer request types `." +msgstr "" +"*view* 中每个字段的描述参见 :ref:`缓冲区结构体 ` 一节,导出方对于特定请求应当如何反应参见 " +":ref:`缓冲区请求类型 ` 一节。" + +#: ../../c-api/typeobj.rst:3093 +msgid "" +"All memory pointed to in the :c:type:`Py_buffer` structure belongs to the " +"exporter and must remain valid until there are no consumers left. " +":c:member:`~Py_buffer.format`, :c:member:`~Py_buffer.shape`, " +":c:member:`~Py_buffer.strides`, :c:member:`~Py_buffer.suboffsets` and " +":c:member:`~Py_buffer.internal` are read-only for the consumer." +msgstr "" +"所有在 :c:type:`Py_buffer` 结构体中被指向的内存都属于导出方并必须保持有效直到不再有任何消费方。 " +":c:member:`~Py_buffer.format`, :c:member:`~Py_buffer.shape`, " +":c:member:`~Py_buffer.strides`, :c:member:`~Py_buffer.suboffsets` 和 " +":c:member:`~Py_buffer.internal` 对于消费方来说是只读的。" + +#: ../../c-api/typeobj.rst:3100 +msgid "" +":c:func:`PyBuffer_FillInfo` provides an easy way of exposing a simple bytes " +"buffer while dealing correctly with all request types." +msgstr ":c:func:`PyBuffer_FillInfo` 提供了一种暴露简单字节缓冲区同时正确处理地所有请求类型的简便方式。" + +#: ../../c-api/typeobj.rst:3103 +msgid "" +":c:func:`PyObject_GetBuffer` is the interface for the consumer that wraps " +"this function." +msgstr ":c:func:`PyObject_GetBuffer` 是针对包装此函数的消费方的接口。" + +#: ../../c-api/typeobj.rst:3112 +msgid "void (PyObject *exporter, Py_buffer *view);" +msgstr "void (PyObject *exporter, Py_buffer *view);" + +#: ../../c-api/typeobj.rst:3114 +msgid "" +"Handle a request to release the resources of the buffer. If no resources " +"need to be released, :c:member:`PyBufferProcs.bf_releasebuffer` may be " +"``NULL``. Otherwise, a standard implementation of this function will take " +"these optional steps:" +msgstr "" +"处理释放缓冲区资源的请求。如果不需要释放任何资源,则 :c:member:`PyBufferProcs.bf_releasebuffer` 可以为 " +"``NULL``。在其他情况下,此函数的标准实现将执行以下的可选步骤:" + +#: ../../c-api/typeobj.rst:3119 +msgid "Decrement an internal counter for the number of exports." +msgstr "递减用于保存导出次数的内部计数器。" + +#: ../../c-api/typeobj.rst:3121 +msgid "If the counter is ``0``, free all memory associated with *view*." +msgstr "如果计数器为 ``0``,则释放所有关联到 *view* 的内存。" + +#: ../../c-api/typeobj.rst:3125 +msgid "In the :term:`free-threaded build`:" +msgstr "" + +#: ../../c-api/typeobj.rst:3127 +msgid "The export counter decrement in step (1) must be atomic." +msgstr "" + +#: ../../c-api/typeobj.rst:3129 +msgid "" +"Resource cleanup when the counter reaches zero must be done atomically, as " +"the final release may race with concurrent releases from other threads and " +"dellocation must only happen once." +msgstr "" + +#: ../../c-api/typeobj.rst:3133 +msgid "" +"The exporter MUST use the :c:member:`~Py_buffer.internal` field to keep " +"track of buffer-specific resources. This field is guaranteed to remain " +"constant, while a consumer MAY pass a copy of the original buffer as the " +"*view* argument." +msgstr "" +"导出方必须使用 :c:member:`~Py_buffer.internal` 字段来记录缓冲区专属的资源。 " +"该字段将确保恒定,而消费方则可能将原始缓冲区作为 *view* 参数传入。" + +#: ../../c-api/typeobj.rst:3139 +msgid "" +"This function MUST NOT decrement ``view->obj``, since that is done " +"automatically in :c:func:`PyBuffer_Release` (this scheme is useful for " +"breaking reference cycles)." +msgstr "" + +#: ../../c-api/typeobj.rst:3144 +msgid "" +":c:func:`PyBuffer_Release` is the interface for the consumer that wraps this" +" function." +msgstr ":c:func:`PyBuffer_Release` 是针对包装此函数的消费方的接口。" + +#: ../../c-api/typeobj.rst:3152 +msgid "Async Object Structures" +msgstr "异步对象结构体" + +#: ../../c-api/typeobj.rst:3160 +msgid "" +"This structure holds pointers to the functions required to implement " +":term:`awaitable` and :term:`asynchronous iterator` objects." +msgstr "" +"此结构体将持有指向需要用来实现 :term:`awaitable` 和 :term:`asynchronous iterator` 对象的函数的指针。" + +#: ../../c-api/typeobj.rst:3165 +msgid "" +"typedef struct {\n" +" unaryfunc am_await;\n" +" unaryfunc am_aiter;\n" +" unaryfunc am_anext;\n" +" sendfunc am_send;\n" +"} PyAsyncMethods;" +msgstr "" +"typedef struct {\n" +" unaryfunc am_await;\n" +" unaryfunc am_aiter;\n" +" unaryfunc am_anext;\n" +" sendfunc am_send;\n" +"} PyAsyncMethods;" + +#: ../../c-api/typeobj.rst:3178 +msgid "PyObject *am_await(PyObject *self);" +msgstr "PyObject *am_await(PyObject *self);" + +#: ../../c-api/typeobj.rst:3180 +msgid "" +"The returned object must be an :term:`iterator`, i.e. :c:func:`PyIter_Check`" +" must return ``1`` for it." +msgstr "返回的对象必须为 :term:`iterator`,即对其执行 :c:func:`PyIter_Check` 必须返回 ``1``。" + +#: ../../c-api/typeobj.rst:3183 +msgid "" +"This slot may be set to ``NULL`` if an object is not an :term:`awaitable`." +msgstr "如果一个对象不是 :term:`awaitable` 则此槽位可被设为 ``NULL``。" + +#: ../../c-api/typeobj.rst:3191 +msgid "PyObject *am_aiter(PyObject *self);" +msgstr "PyObject *am_aiter(PyObject *self);" + +#: ../../c-api/typeobj.rst:3193 +msgid "" +"Must return an :term:`asynchronous iterator` object. See " +":meth:`~object.__anext__` for details." +msgstr "" +"必须返回一个 :term:`asynchronous iterator` 对象。请参阅 :meth:`~object.__anext__` 了解详情。" + +#: ../../c-api/typeobj.rst:3196 +msgid "" +"This slot may be set to ``NULL`` if an object does not implement " +"asynchronous iteration protocol." +msgstr "如果一个对象没有实现异步迭代协议则此槽位可被设为 ``NULL``。" + +#: ../../c-api/typeobj.rst:3205 +msgid "PyObject *am_anext(PyObject *self);" +msgstr "PyObject *am_anext(PyObject *self);" + +#: ../../c-api/typeobj.rst:3207 +msgid "" +"Must return an :term:`awaitable` object. See :meth:`~object.__anext__` for " +"details. This slot may be set to ``NULL``." +msgstr "" +"必须返回一个 :term:`awaitable` 对象。请参阅 :meth:`~object.__anext__` 了解详情。此槽位可被设为 " +"``NULL``." + +#: ../../c-api/typeobj.rst:3217 +msgid "" +"PySendResult am_send(PyObject *self, PyObject *arg, PyObject **result);" +msgstr "" +"PySendResult am_send(PyObject *self, PyObject *arg, PyObject **result);" + +#: ../../c-api/typeobj.rst:3219 +msgid "" +"See :c:func:`PyIter_Send` for details. This slot may be set to ``NULL``." +msgstr "请参阅 :c:func:`PyIter_Send` 了解详情。此槽位可被设为 ``NULL``。" + +#: ../../c-api/typeobj.rst:3228 +msgid "Slot Type typedefs" +msgstr "槽位类型 typedef" + +#: ../../c-api/typeobj.rst:3232 +msgid "" +"The purpose of this function is to separate memory allocation from memory " +"initialization. It should return a pointer to a block of memory of adequate" +" length for the instance, suitably aligned, and initialized to zeros, but " +"with :c:member:`~PyObject.ob_refcnt` set to ``1`` and " +":c:member:`~PyObject.ob_type` set to the type argument. If the type's " +":c:member:`~PyTypeObject.tp_itemsize` is non-zero, the object's " +":c:member:`~PyVarObject.ob_size` field should be initialized to *nitems* and" +" the length of the allocated memory block should be ``tp_basicsize + " +"nitems*tp_itemsize``, rounded up to a multiple of ``sizeof(void*)``; " +"otherwise, *nitems* is not used and the length of the block should be " +":c:member:`~PyTypeObject.tp_basicsize`." +msgstr "" +"此函数的设计目标是将内存分配与内存初始化进行分离。它应当返回一个指向足够容纳实例长度,适当对齐,并初始化为零的内存块的指针,但将 " +":c:member:`~PyObject.ob_refcnt` 设为 ``1`` 并将 :c:member:`~PyObject.ob_type` 设为" +" type 参数。如果类型的 :c:member:`~PyTypeObject.tp_itemsize` 为非零值,则对象的 " +":c:member:`~PyVarObject.ob_size` 字段应当被初始化为 *nitems* 而分配内存块的长度应为 " +"``tp_basicsize + nitems*tp_itemsize``,并舍入到 ``sizeof(void*)`` " +"的倍数;在其他情况下,*nitems* 将不会被使用而内存块的长度应为 :c:member:`~PyTypeObject.tp_basicsize`。" + +#: ../../c-api/typeobj.rst:3242 +msgid "" +"This function should not do any other instance initialization, not even to " +"allocate additional memory; that should be done by " +":c:member:`~PyTypeObject.tp_new`." +msgstr "" +"此函数不应执行任何其他实例初始化操作,即使是分配额外内存也不应执行;那应当由 :c:member:`~PyTypeObject.tp_new` 来完成。" + +#: ../../c-api/typeobj.rst:3249 +msgid "See :c:member:`~PyTypeObject.tp_free`." +msgstr "参见 :c:member:`~PyTypeObject.tp_free`。" + +#: ../../c-api/typeobj.rst:3253 +msgid "See :c:member:`~PyTypeObject.tp_new`." +msgstr "参见 :c:member:`~PyTypeObject.tp_new`。" + +#: ../../c-api/typeobj.rst:3257 +msgid "See :c:member:`~PyTypeObject.tp_init`." +msgstr "参见 :c:member:`~PyTypeObject.tp_init`。" + +#: ../../c-api/typeobj.rst:3261 +msgid "See :c:member:`~PyTypeObject.tp_repr`." +msgstr "参见 :c:member:`~PyTypeObject.tp_repr`。" + +#: ../../c-api/typeobj.rst:3265 ../../c-api/typeobj.rst:3274 +msgid "Return the value of the named attribute for the object." +msgstr "返回对象的指定属性的值。" + +#: ../../c-api/typeobj.rst:3269 ../../c-api/typeobj.rst:3280 +msgid "" +"Set the value of the named attribute for the object. The value argument is " +"set to ``NULL`` to delete the attribute." +msgstr "为对象设置指定属性的值。将 value 参数设为 ``NULL`` 将删除该属性。" + +#: ../../c-api/typeobj.rst:3276 +msgid "See :c:member:`~PyTypeObject.tp_getattro`." +msgstr "参见 :c:member:`~PyTypeObject.tp_getattro`。" + +#: ../../c-api/typeobj.rst:3283 +msgid "See :c:member:`~PyTypeObject.tp_setattro`." +msgstr "参见 :c:member:`~PyTypeObject.tp_setattro`。" + +#: ../../c-api/typeobj.rst:3287 +msgid "See :c:member:`~PyTypeObject.tp_descr_get`." +msgstr "参见 :c:member:`~PyTypeObject.tp_descr_get`。" + +#: ../../c-api/typeobj.rst:3291 +msgid "See :c:member:`~PyTypeObject.tp_descr_set`." +msgstr "参见 :c:member:`~PyTypeObject.tp_descr_set`。" + +#: ../../c-api/typeobj.rst:3295 +msgid "See :c:member:`~PyTypeObject.tp_hash`." +msgstr "参见 :c:member:`~PyTypeObject.tp_hash`。" + +#: ../../c-api/typeobj.rst:3299 +msgid "See :c:member:`~PyTypeObject.tp_richcompare`." +msgstr "参见 :c:member:`~PyTypeObject.tp_richcompare`。" + +#: ../../c-api/typeobj.rst:3303 +msgid "See :c:member:`~PyTypeObject.tp_iter`." +msgstr "参见 :c:member:`~PyTypeObject.tp_iter`。" + +#: ../../c-api/typeobj.rst:3307 +msgid "See :c:member:`~PyTypeObject.tp_iternext`." +msgstr "参见 :c:member:`~PyTypeObject.tp_iternext`。" + +#: ../../c-api/typeobj.rst:3321 +msgid "See :c:member:`~PyAsyncMethods.am_send`." +msgstr "参见 :c:member:`~PyAsyncMethods.am_send`。" + +#: ../../c-api/typeobj.rst:3337 +msgid "Examples" +msgstr "例子" + +#: ../../c-api/typeobj.rst:3339 +msgid "" +"The following are simple examples of Python type definitions. They include " +"common usage you may encounter. Some demonstrate tricky corner cases. For " +"more examples, practical info, and a tutorial, see :ref:`defining-new-types`" +" and :ref:`new-types-topics`." +msgstr "" +"下面是一些 Python 类型定义的简单示例。其中包括你可能会遇到的通常用法。有些演示了令人困惑的边际情况。 要获取更多示例、实践信息以及教程,请参阅 " +":ref:`defining-new-types` 和 :ref:`new-types-topics`。" + +#: ../../c-api/typeobj.rst:3344 +msgid "A basic :ref:`static type `::" +msgstr "一个基本的 :ref:`静态类型 `::" + +#: ../../c-api/typeobj.rst:3346 +msgid "" +"typedef struct {\n" +" PyObject_HEAD\n" +" const char *data;\n" +"} MyObject;\n" +"\n" +"static PyTypeObject MyObject_Type = {\n" +" PyVarObject_HEAD_INIT(NULL, 0)\n" +" .tp_name = \"mymod.MyObject\",\n" +" .tp_basicsize = sizeof(MyObject),\n" +" .tp_doc = PyDoc_STR(\"My objects\"),\n" +" .tp_new = myobj_new,\n" +" .tp_dealloc = (destructor)myobj_dealloc,\n" +" .tp_repr = (reprfunc)myobj_repr,\n" +"};" +msgstr "" +"typedef struct {\n" +" PyObject_HEAD\n" +" const char *data;\n" +"} MyObject;\n" +"\n" +"static PyTypeObject MyObject_Type = {\n" +" PyVarObject_HEAD_INIT(NULL, 0)\n" +" .tp_name = \"mymod.MyObject\",\n" +" .tp_basicsize = sizeof(MyObject),\n" +" .tp_doc = PyDoc_STR(\"My objects\"),\n" +" .tp_new = myobj_new,\n" +" .tp_dealloc = (destructor)myobj_dealloc,\n" +" .tp_repr = (reprfunc)myobj_repr,\n" +"};" + +#: ../../c-api/typeobj.rst:3361 +msgid "" +"You may also find older code (especially in the CPython code base) with a " +"more verbose initializer::" +msgstr "你可能还会看到带有更繁琐的初始化器的较旧代码(特别是在 CPython 代码库中)::" + +#: ../../c-api/typeobj.rst:3364 +msgid "" +"static PyTypeObject MyObject_Type = {\n" +" PyVarObject_HEAD_INIT(NULL, 0)\n" +" \"mymod.MyObject\", /* tp_name */\n" +" sizeof(MyObject), /* tp_basicsize */\n" +" 0, /* tp_itemsize */\n" +" (destructor)myobj_dealloc, /* tp_dealloc */\n" +" 0, /* tp_vectorcall_offset */\n" +" 0, /* tp_getattr */\n" +" 0, /* tp_setattr */\n" +" 0, /* tp_as_async */\n" +" (reprfunc)myobj_repr, /* tp_repr */\n" +" 0, /* tp_as_number */\n" +" 0, /* tp_as_sequence */\n" +" 0, /* tp_as_mapping */\n" +" 0, /* tp_hash */\n" +" 0, /* tp_call */\n" +" 0, /* tp_str */\n" +" 0, /* tp_getattro */\n" +" 0, /* tp_setattro */\n" +" 0, /* tp_as_buffer */\n" +" 0, /* tp_flags */\n" +" PyDoc_STR(\"My objects\"), /* tp_doc */\n" +" 0, /* tp_traverse */\n" +" 0, /* tp_clear */\n" +" 0, /* tp_richcompare */\n" +" 0, /* tp_weaklistoffset */\n" +" 0, /* tp_iter */\n" +" 0, /* tp_iternext */\n" +" 0, /* tp_methods */\n" +" 0, /* tp_members */\n" +" 0, /* tp_getset */\n" +" 0, /* tp_base */\n" +" 0, /* tp_dict */\n" +" 0, /* tp_descr_get */\n" +" 0, /* tp_descr_set */\n" +" 0, /* tp_dictoffset */\n" +" 0, /* tp_init */\n" +" 0, /* tp_alloc */\n" +" myobj_new, /* tp_new */\n" +"};" +msgstr "" +"static PyTypeObject MyObject_Type = {\n" +" PyVarObject_HEAD_INIT(NULL, 0)\n" +" \"mymod.MyObject\", /* tp_name */\n" +" sizeof(MyObject), /* tp_basicsize */\n" +" 0, /* tp_itemsize */\n" +" (destructor)myobj_dealloc, /* tp_dealloc */\n" +" 0, /* tp_vectorcall_offset */\n" +" 0, /* tp_getattr */\n" +" 0, /* tp_setattr */\n" +" 0, /* tp_as_async */\n" +" (reprfunc)myobj_repr, /* tp_repr */\n" +" 0, /* tp_as_number */\n" +" 0, /* tp_as_sequence */\n" +" 0, /* tp_as_mapping */\n" +" 0, /* tp_hash */\n" +" 0, /* tp_call */\n" +" 0, /* tp_str */\n" +" 0, /* tp_getattro */\n" +" 0, /* tp_setattro */\n" +" 0, /* tp_as_buffer */\n" +" 0, /* tp_flags */\n" +" PyDoc_STR(\"My objects\"), /* tp_doc */\n" +" 0, /* tp_traverse */\n" +" 0, /* tp_clear */\n" +" 0, /* tp_richcompare */\n" +" 0, /* tp_weaklistoffset */\n" +" 0, /* tp_iter */\n" +" 0, /* tp_iternext */\n" +" 0, /* tp_methods */\n" +" 0, /* tp_members */\n" +" 0, /* tp_getset */\n" +" 0, /* tp_base */\n" +" 0, /* tp_dict */\n" +" 0, /* tp_descr_get */\n" +" 0, /* tp_descr_set */\n" +" 0, /* tp_dictoffset */\n" +" 0, /* tp_init */\n" +" 0, /* tp_alloc */\n" +" myobj_new, /* tp_new */\n" +"};" + +#: ../../c-api/typeobj.rst:3405 +msgid "A type that supports weakrefs, instance dicts, and hashing::" +msgstr "一个支持弱引用、实例字典和哈希运算的类型::" + +#: ../../c-api/typeobj.rst:3407 +msgid "" +"typedef struct {\n" +" PyObject_HEAD\n" +" const char *data;\n" +"} MyObject;\n" +"\n" +"static PyTypeObject MyObject_Type = {\n" +" PyVarObject_HEAD_INIT(NULL, 0)\n" +" .tp_name = \"mymod.MyObject\",\n" +" .tp_basicsize = sizeof(MyObject),\n" +" .tp_doc = PyDoc_STR(\"My objects\"),\n" +" .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |\n" +" Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_MANAGED_DICT |\n" +" Py_TPFLAGS_MANAGED_WEAKREF,\n" +" .tp_new = myobj_new,\n" +" .tp_traverse = (traverseproc)myobj_traverse,\n" +" .tp_clear = (inquiry)myobj_clear,\n" +" .tp_alloc = PyType_GenericNew,\n" +" .tp_dealloc = (destructor)myobj_dealloc,\n" +" .tp_repr = (reprfunc)myobj_repr,\n" +" .tp_hash = (hashfunc)myobj_hash,\n" +" .tp_richcompare = PyBaseObject_Type.tp_richcompare,\n" +"};" +msgstr "" +"typedef struct {\n" +" PyObject_HEAD\n" +" const char *data;\n" +"} MyObject;\n" +"\n" +"static PyTypeObject MyObject_Type = {\n" +" PyVarObject_HEAD_INIT(NULL, 0)\n" +" .tp_name = \"mymod.MyObject\",\n" +" .tp_basicsize = sizeof(MyObject),\n" +" .tp_doc = PyDoc_STR(\"My objects\"),\n" +" .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |\n" +" Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_MANAGED_DICT |\n" +" Py_TPFLAGS_MANAGED_WEAKREF,\n" +" .tp_new = myobj_new,\n" +" .tp_traverse = (traverseproc)myobj_traverse,\n" +" .tp_clear = (inquiry)myobj_clear,\n" +" .tp_alloc = PyType_GenericNew,\n" +" .tp_dealloc = (destructor)myobj_dealloc,\n" +" .tp_repr = (reprfunc)myobj_repr,\n" +" .tp_hash = (hashfunc)myobj_hash,\n" +" .tp_richcompare = PyBaseObject_Type.tp_richcompare,\n" +"};" + +#: ../../c-api/typeobj.rst:3430 +msgid "" +"A str subclass that cannot be subclassed and cannot be called to create " +"instances (e.g. uses a separate factory func) using " +":c:macro:`Py_TPFLAGS_DISALLOW_INSTANTIATION` flag::" +msgstr "" +"一个不能被子类化且不能被调用以使用 :c:macro:`Py_TPFLAGS_DISALLOW_INSTANTIATION` " +"旗标创建实例(例如使用单独的工厂函数)的 str 子类::" + +#: ../../c-api/typeobj.rst:3434 +msgid "" +"typedef struct {\n" +" PyUnicodeObject raw;\n" +" char *extra;\n" +"} MyStr;\n" +"\n" +"static PyTypeObject MyStr_Type = {\n" +" PyVarObject_HEAD_INIT(NULL, 0)\n" +" .tp_name = \"mymod.MyStr\",\n" +" .tp_basicsize = sizeof(MyStr),\n" +" .tp_base = NULL, // set to &PyUnicode_Type in module init\n" +" .tp_doc = PyDoc_STR(\"my custom str\"),\n" +" .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,\n" +" .tp_repr = (reprfunc)myobj_repr,\n" +"};" +msgstr "" +"typedef struct {\n" +" PyUnicodeObject raw;\n" +" char *extra;\n" +"} MyStr;\n" +"\n" +"static PyTypeObject MyStr_Type = {\n" +" PyVarObject_HEAD_INIT(NULL, 0)\n" +" .tp_name = \"mymod.MyStr\",\n" +" .tp_basicsize = sizeof(MyStr),\n" +" .tp_base = NULL, // set to &PyUnicode_Type in module init\n" +" .tp_doc = PyDoc_STR(\"my custom str\"),\n" +" .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,\n" +" .tp_repr = (reprfunc)myobj_repr,\n" +"};" + +#: ../../c-api/typeobj.rst:3449 +msgid "" +"The simplest :ref:`static type ` with fixed-length instances::" +msgstr "最简单的固定长度实例 :ref:`静态类型 `::" + +#: ../../c-api/typeobj.rst:3451 +msgid "" +"typedef struct {\n" +" PyObject_HEAD\n" +"} MyObject;\n" +"\n" +"static PyTypeObject MyObject_Type = {\n" +" PyVarObject_HEAD_INIT(NULL, 0)\n" +" .tp_name = \"mymod.MyObject\",\n" +"};" +msgstr "" +"typedef struct {\n" +" PyObject_HEAD\n" +"} MyObject;\n" +"\n" +"static PyTypeObject MyObject_Type = {\n" +" PyVarObject_HEAD_INIT(NULL, 0)\n" +" .tp_name = \"mymod.MyObject\",\n" +"};" + +#: ../../c-api/typeobj.rst:3460 +msgid "" +"The simplest :ref:`static type ` with variable-length " +"instances::" +msgstr "最简单的具有可变长度实例的 :ref:`静态类型 `::" + +#: ../../c-api/typeobj.rst:3462 +msgid "" +"typedef struct {\n" +" PyObject_VAR_HEAD\n" +" const char *data[1];\n" +"} MyObject;\n" +"\n" +"static PyTypeObject MyObject_Type = {\n" +" PyVarObject_HEAD_INIT(NULL, 0)\n" +" .tp_name = \"mymod.MyObject\",\n" +" .tp_basicsize = sizeof(MyObject) - sizeof(char *),\n" +" .tp_itemsize = sizeof(char *),\n" +"};" +msgstr "" +"typedef struct {\n" +" PyObject_VAR_HEAD\n" +" const char *data[1];\n" +"} MyObject;\n" +"\n" +"static PyTypeObject MyObject_Type = {\n" +" PyVarObject_HEAD_INIT(NULL, 0)\n" +" .tp_name = \"mymod.MyObject\",\n" +" .tp_basicsize = sizeof(MyObject) - sizeof(char *),\n" +" .tp_itemsize = sizeof(char *),\n" +"};" + +#: ../../c-api/typeobj.rst:920 ../../c-api/typeobj.rst:987 +msgid "built-in function" +msgstr "内置函数" + +#: ../../c-api/typeobj.rst:920 +msgid "repr" +msgstr "repr" + +#: ../../c-api/typeobj.rst:987 +msgid "hash" +msgstr "hash" diff --git a/c-api/unicode.po b/c-api/unicode.po new file mode 100644 index 0000000000..6f4e9881ac --- /dev/null +++ b/c-api/unicode.po @@ -0,0 +1,2672 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-01 17:14+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/unicode.rst:6 +msgid "Unicode Objects and Codecs" +msgstr "Unicode 对象和编解码器" + +#: ../../c-api/unicode.rst:12 +msgid "Unicode Objects" +msgstr "Unicode 对象" + +#: ../../c-api/unicode.rst:14 +msgid "" +"Since the implementation of :pep:`393` in Python 3.3, Unicode objects " +"internally use a variety of representations, in order to allow handling the " +"complete range of Unicode characters while staying memory efficient. There " +"are special cases for strings where all code points are below 128, 256, or " +"65536; otherwise, code points must be below 1114112 (which is the full " +"Unicode range)." +msgstr "" +"自从 Python 3.3 中实现了 :pep:`393` 以来,Unicode 对象在内部使用各种表示形式,以便在保持内存效率的同时处理完整范围的 " +"Unicode 字符。对于所有代码点都低于 128、256 或 65536 的字符串,有一些特殊情况;否则,代码点必须低于 1114112(这是完整的 " +"Unicode 范围)。" + +#: ../../c-api/unicode.rst:20 +msgid "" +"UTF-8 representation is created on demand and cached in the Unicode object." +msgstr "UTF-8 表示将按需创建并缓存在 Unicode 对象中。" + +#: ../../c-api/unicode.rst:23 +msgid "" +"The :c:type:`Py_UNICODE` representation has been removed since Python 3.12 " +"with deprecated APIs. See :pep:`623` for more information." +msgstr "" +":c:type:`Py_UNICODE` 表示形式在 Python 3.12 中同被弃用的 API 一起被移除了,查阅 :pep:`623` " +"以获得更多信息。" + +#: ../../c-api/unicode.rst:29 +msgid "Unicode Type" +msgstr "Unicode 类型" + +#: ../../c-api/unicode.rst:31 +msgid "" +"These are the basic Unicode object types used for the Unicode implementation" +" in Python:" +msgstr "以下是用于 Python 中 Unicode 实现的基本 Unicode 对象类型:" + +#: ../../c-api/unicode.rst:36 +msgid "" +"This instance of :c:type:`PyTypeObject` represents the Python Unicode type. " +"It is exposed to Python code as :py:class:`str`." +msgstr "" +"这是 :c:type:`PyTypeObject` 实例代表 Python Unicode 类型。它以 :py:class:`str` 的形式暴露给 " +"Python 代码。" + +#: ../../c-api/unicode.rst:42 +msgid "" +"This instance of :c:type:`PyTypeObject` represents the Python Unicode " +"iterator type. It is used to iterate over Unicode string objects." +msgstr "" +"这是 :c:type:`PyTypeObject` 实例代表 Python Unicode 迭代器类型。它被用来迭代 Unicode 字符串对象。" + +#: ../../c-api/unicode.rst:50 +msgid "" +"These types are typedefs for unsigned integer types wide enough to contain " +"characters of 32 bits, 16 bits and 8 bits, respectively. When dealing with " +"single Unicode characters, use :c:type:`Py_UCS4`." +msgstr "" +"这些类型是无符号整数类型的类型定义,其宽度足以分别包含 32 位、16 位和 8 位字符。当需要处理单个 Unicode 字符时,请使用 " +":c:type:`Py_UCS4`." + +#: ../../c-api/unicode.rst:61 +msgid "" +"These subtypes of :c:type:`PyObject` represent a Python Unicode object. In " +"almost all cases, they shouldn't be used directly, since all API functions " +"that deal with Unicode objects take and return :c:type:`PyObject` pointers." +msgstr "" +"这些关于 :c:type:`PyObject` 的子类型表示了一个 Python Unicode 对象。 " +"在几乎所有情形下,它们不应该被直接使用,因为所有处理 Unicode 对象的 API 函数都接受并返回 :c:type:`PyObject` " +"类型的指针。" + +#: ../../c-api/unicode.rst:68 +msgid "" +"The structure of a particular object can be determined using the following " +"macros. The macros cannot fail; their behavior is undefined if their " +"argument is not a Python Unicode object." +msgstr "特定对象的结构可使用下列宏来确定。这些宏不会执行失败;如果它们的参数不是 Python Unicode 对象则其行为将是未定义的。" + +#: ../../c-api/unicode.rst:77 +msgid "True if *o* uses the :c:struct:`PyCompactUnicodeObject` structure." +msgstr "如果 *o* 使用了 :c:struct:`PyCompactUnicodeObject` 结构则返回真值。" + +#: ../../c-api/unicode.rst:84 +msgid "True if *o* uses the :c:struct:`PyASCIIObject` structure." +msgstr "如果 *o* 使用了 :c:struct:`PyASCIIObject` 结构则返回真值。" + +#: ../../c-api/unicode.rst:89 +msgid "" +"The following APIs are C macros and static inlined functions for fast checks" +" and access to internal read-only data of Unicode objects:" +msgstr "以下 API 是 C 宏和静态内联函数,用于快速检查和访问 Unicode 对象的内部只读数据:" + +#: ../../c-api/unicode.rst:94 +msgid "" +"Return true if the object *obj* is a Unicode object or an instance of a " +"Unicode subtype. This function always succeeds." +msgstr "如果对象 *obj* 是 Unicode 对象或 Unicode 子类型的实例则返回真值。此函数总是会成功执行。" + +#: ../../c-api/unicode.rst:100 +msgid "" +"Return true if the object *obj* is a Unicode object, but not an instance of " +"a subtype. This function always succeeds." +msgstr "如果对象 *obj* 是一个 Unicode 对象,但不是某个子类型的实例则返回真值。此函数总是会成功执行。" + +#: ../../c-api/unicode.rst:106 +msgid "" +"Return the length of the Unicode string, in code points. *unicode* has to " +"be a Unicode object in the \"canonical\" representation (not checked)." +msgstr "返回以码位点数量表示的 Unicode 字符串长度。 *unicode* 必须为“规范”表示的 Unicode 对象(不会检查这一点)。" + +#: ../../c-api/unicode.rst:116 +msgid "" +"Return a pointer to the canonical representation cast to UCS1, UCS2 or UCS4 " +"integer types for direct character access. No checks are performed if the " +"canonical representation has the correct character size; use " +":c:func:`PyUnicode_KIND` to select the right function." +msgstr "" +"返回一个用于直接字符访问的指向转换为 UCS1、UCS2 或 UCS4 整数类型的规范表示的指针。如果规范表示具有正确的字符大小,则不执行检查;使用 " +":c:func:`PyUnicode_KIND` 选择正确的函数。" + +#: ../../c-api/unicode.rst:128 +msgid "Return values of the :c:func:`PyUnicode_KIND` macro." +msgstr "返回 :c:func:`PyUnicode_KIND` 宏的值。" + +#: ../../c-api/unicode.rst:132 +msgid "``PyUnicode_WCHAR_KIND`` has been removed." +msgstr "``PyUnicode_WCHAR_KIND`` 已被移除。" + +#: ../../c-api/unicode.rst:138 +msgid "" +"Return one of the PyUnicode kind constants (see above) that indicate how " +"many bytes per character this Unicode object uses to store its data. " +"*unicode* has to be a Unicode object in the \"canonical\" representation " +"(not checked)." +msgstr "" +"返回一个 PyUnicode 类型常量(参见上文),该常量指示此 Unicode 对象用于存储数据时每个字符占用的字节数。*unicode* " +"必须是一个采用“规范”表示的 Unicode 对象(不进行检查)。" + +#: ../../c-api/unicode.rst:147 +msgid "" +"Return a void pointer to the raw Unicode buffer. *unicode* has to be a " +"Unicode object in the \"canonical\" representation (not checked)." +msgstr "返回一个指向原始 Unicode 缓冲区的空指针。 *unicode* 必须为“规范”表示的 Unicode 对象(不会检查这一点)。" + +#: ../../c-api/unicode.rst:156 +msgid "" +"Write the code point *value* to the given zero-based *index* in a string." +msgstr "将码位值 *value* 写入到给定的字符串中从零开始计数的 *index* 位置。" + +#: ../../c-api/unicode.rst:158 +msgid "" +"The *kind* value and *data* pointer must have been obtained from a string " +"using :c:func:`PyUnicode_KIND` and :c:func:`PyUnicode_DATA` respectively. " +"You must hold a reference to that string while calling " +":c:func:`!PyUnicode_WRITE`. All requirements of " +":c:func:`PyUnicode_WriteChar` also apply." +msgstr "" +"*kind* 值和 *data* 指针必须已分别使用 :c:func:`PyUnicode_KIND` 和 " +":c:func:`PyUnicode_DATA` 从一个字符串获取。在调用 :c:func:`!PyUnicode_WRITE` " +"时你必须持有一个指向该字符串的引用。 :c:func:`PyUnicode_WriteChar` 的所有要求也同样有效。" + +#: ../../c-api/unicode.rst:164 +msgid "" +"The function performs no checks for any of its requirements, and is intended" +" for usage in loops." +msgstr "该函数不会对其要求执行任何检查,并且被设计为在循环中使用。" + +#: ../../c-api/unicode.rst:173 +msgid "" +"Read a code point from a canonical representation *data* (as obtained with " +":c:func:`PyUnicode_DATA`). No checks or ready calls are performed." +msgstr "从规范表示的 *data* (如同用 :c:func:`PyUnicode_DATA` 获取) 中读取一个码位。不会执行检查或就绪调用。" + +#: ../../c-api/unicode.rst:181 +msgid "" +"Read a character from a Unicode object *unicode*, which must be in the " +"\"canonical\" representation. This is less efficient than " +":c:func:`PyUnicode_READ` if you do multiple consecutive reads." +msgstr "" +"从 Unicode 对象 *unicode* 读取一个字符,必须为“规范”表示形式。如果你执行多次连续读取则此函数的效率将低于 " +":c:func:`PyUnicode_READ`." + +#: ../../c-api/unicode.rst:190 +msgid "" +"Return the maximum code point that is suitable for creating another string " +"based on *unicode*, which must be in the \"canonical\" representation. This" +" is always an approximation but more efficient than iterating over the " +"string." +msgstr "" +"返回适合基于 *unicode* 创建另一个字符串的最大码位点,该参数必须为“规范”表示形式。这始终是一种近似但比在字符串上执行迭代更高效。" + +#: ../../c-api/unicode.rst:199 +msgid "" +"Return ``1`` if the string is a valid identifier according to the language " +"definition, section :ref:`identifiers`. Return ``0`` otherwise." +msgstr "如果字符串按照语言定义是合法的标识符则返回 ``1``,参见 :ref:`identifiers` 小节。否则返回 ``0``。" + +#: ../../c-api/unicode.rst:202 +msgid "" +"The function does not call :c:func:`Py_FatalError` anymore if the string is " +"not ready." +msgstr "如果字符串尚未就绪则此函数不会再调用 :c:func:`Py_FatalError`。" + +#: ../../c-api/unicode.rst:209 +msgid "" +"Return true if the string only contains ASCII characters. Equivalent to " +":py:meth:`str.isascii`." +msgstr "如果字符串只包含 ASCII 字符则返回真值。等价于 :py:meth:`str.isascii`。" + +#: ../../c-api/unicode.rst:216 +msgid "Unicode Character Properties" +msgstr "Unicode 字符属性" + +#: ../../c-api/unicode.rst:218 +msgid "" +"Unicode provides many different character properties. The most often needed " +"ones are available through these macros which are mapped to C functions " +"depending on the Python configuration." +msgstr "Unicode 提供了许多不同的字符属性。最常用的属性可通过这些宏获得,这些宏根据 Python 配置映射到 C 函数。" + +#: ../../c-api/unicode.rst:225 +msgid "" +"Return ``1`` or ``0`` depending on whether *ch* is a whitespace character." +msgstr "根据 *ch* 是否为空白字符返回 ``1`` 或 ``0``。" + +#: ../../c-api/unicode.rst:230 +msgid "" +"Return ``1`` or ``0`` depending on whether *ch* is a lowercase character." +msgstr "根据 *ch* 是否为小写字符返回 ``1`` 或 ``0``。" + +#: ../../c-api/unicode.rst:235 +msgid "" +"Return ``1`` or ``0`` depending on whether *ch* is an uppercase character." +msgstr "根据 *ch* 是否为大写字符返回 ``1`` 或 ``0``。" + +#: ../../c-api/unicode.rst:240 +msgid "" +"Return ``1`` or ``0`` depending on whether *ch* is a titlecase character." +msgstr "根据 *ch* 是否为标题化的大小写返回 ``1`` 或 ``0``。" + +#: ../../c-api/unicode.rst:245 +msgid "" +"Return ``1`` or ``0`` depending on whether *ch* is a linebreak character." +msgstr "根据 *ch* 是否为换行类字符返回 ``1`` 或 ``0``。" + +#: ../../c-api/unicode.rst:250 +msgid "" +"Return ``1`` or ``0`` depending on whether *ch* is a decimal character." +msgstr "根据 *ch* 是否为十进制数字符返回 ``1`` 或 ``0``。" + +#: ../../c-api/unicode.rst:255 +msgid "Return ``1`` or ``0`` depending on whether *ch* is a digit character." +msgstr "根据 *ch* 是否为数码类字符返回 ``1`` 或 ``0``。" + +#: ../../c-api/unicode.rst:260 +msgid "" +"Return ``1`` or ``0`` depending on whether *ch* is a numeric character." +msgstr "根据 *ch* 是否为数值类字符返回 ``1`` 或 ``0``。" + +#: ../../c-api/unicode.rst:265 +msgid "" +"Return ``1`` or ``0`` depending on whether *ch* is an alphabetic character." +msgstr "根据 *ch* 是否为字母类字符返回 ``1`` 或 ``0``。" + +#: ../../c-api/unicode.rst:270 +msgid "" +"Return ``1`` or ``0`` depending on whether *ch* is an alphanumeric " +"character." +msgstr "根据 *ch* 是否为字母数字类字符返回 ``1`` 或 ``0``。" + +#: ../../c-api/unicode.rst:275 +msgid "" +"Return ``1`` or ``0`` depending on whether *ch* is a printable character, in" +" the sense of :meth:`str.isprintable`." +msgstr "根据 *ch* 是否为可打印字符返回 ``1`` 或 ``0``,基于 :meth:`str.isprintable` 来判断。" + +#: ../../c-api/unicode.rst:279 +msgid "These APIs can be used for fast direct character conversions:" +msgstr "这些 API 可用于快速直接的字符转换:" + +#: ../../c-api/unicode.rst:284 +msgid "Return the character *ch* converted to lower case." +msgstr "返回转换为小写形式的字符 *ch*。" + +#: ../../c-api/unicode.rst:289 +msgid "Return the character *ch* converted to upper case." +msgstr "返回转换为大写形式的字符 *ch*。" + +#: ../../c-api/unicode.rst:294 +msgid "Return the character *ch* converted to title case." +msgstr "返回转换为标题大小写形式的字符 *ch*。" + +#: ../../c-api/unicode.rst:299 +msgid "" +"Return the character *ch* converted to a decimal positive integer. Return " +"``-1`` if this is not possible. This function does not raise exceptions." +msgstr "将字符 *ch* 转换为十进制正整数返回。如果无法转换则返回 ``-1``。此函数不会引发异常。" + +#: ../../c-api/unicode.rst:305 +msgid "" +"Return the character *ch* converted to a single digit integer. Return ``-1``" +" if this is not possible. This function does not raise exceptions." +msgstr "将字符 *ch* 转换为单个数码位的整数返回。如果无法转换则返回 ``-1``。此函数不会引发异常。" + +#: ../../c-api/unicode.rst:311 +msgid "" +"Return the character *ch* converted to a double. Return ``-1.0`` if this is " +"not possible. This function does not raise exceptions." +msgstr "将字符 *ch* 转换为双精度浮点数返回。如果无法转换则返回 ``-1.0``。此函数不会引发异常。" + +#: ../../c-api/unicode.rst:315 +msgid "These APIs can be used to work with surrogates:" +msgstr "这些 API 可被用来操作代理项:" + +#: ../../c-api/unicode.rst:319 +msgid "Check if *ch* is a surrogate (``0xD800 <= ch <= 0xDFFF``)." +msgstr "检测 *ch* 是否为代理项 (``0xD800 <= ch <= 0xDFFF``)。" + +#: ../../c-api/unicode.rst:323 +msgid "Check if *ch* is a high surrogate (``0xD800 <= ch <= 0xDBFF``)." +msgstr "检测 *ch* 是否为高代理项 (``0xD800 <= ch <= 0xDBFF``)。" + +#: ../../c-api/unicode.rst:327 +msgid "Check if *ch* is a low surrogate (``0xDC00 <= ch <= 0xDFFF``)." +msgstr "检测 *ch* 是否为低代理项 (``0xDC00 <= ch <= 0xDFFF``)。" + +#: ../../c-api/unicode.rst:331 +msgid "" +"Return the high UTF-16 surrogate (``0xD800`` to ``0xDBFF``) for a Unicode " +"code point in the range ``[0x10000; 0x10FFFF]``." +msgstr "" +"返回一个 ``[0x10000; 0x10FFFF]`` 范围内 Unicode 码点的高端 UTF-16 代理项 (``0xD800`` 至 " +"``0xDBFF``)." + +#: ../../c-api/unicode.rst:336 +msgid "" +"Return the low UTF-16 surrogate (``0xDC00`` to ``0xDFFF``) for a Unicode " +"code point in the range ``[0x10000; 0x10FFFF]``." +msgstr "" +"返回一个 ``[0x10000; 0x10FFFF]`` 范围内 Unicode 码点的低端 UTF-16 代理项 (``0xDC00`` 至 " +"``0xDFFF``)." + +#: ../../c-api/unicode.rst:341 +msgid "" +"Join two surrogate code points and return a single :c:type:`Py_UCS4` value. " +"*high* and *low* are respectively the leading and trailing surrogates in a " +"surrogate pair. *high* must be in the range ``[0xD800; 0xDBFF]`` and *low* " +"must be in the range ``[0xDC00; 0xDFFF]``." +msgstr "" +"合并两个代理码位并返回单个 :c:type:`Py_UCS4` 值。 *high* 和 *low* 分别为一个代理对的开头和末尾代理项。 *high* " +"必须在 ``[0xD800; 0xDBFF]`` 范围内而 *low* 必须在 ``[0xDC00; 0xDFFF]`` 范围内。" + +#: ../../c-api/unicode.rst:348 +msgid "Creating and accessing Unicode strings" +msgstr "创建和访问 Unicode 字符串" + +#: ../../c-api/unicode.rst:350 +msgid "" +"To create Unicode objects and access their basic sequence properties, use " +"these APIs:" +msgstr "要创建 Unicode 对象和访问其基本序列属性,请使用这些 API:" + +#: ../../c-api/unicode.rst:355 +msgid "" +"Create a new Unicode object. *maxchar* should be the true maximum code " +"point to be placed in the string. As an approximation, it can be rounded up" +" to the nearest value in the sequence 127, 255, 65535, 1114111." +msgstr "" +"创建一个新的 Unicode 对象。 *maxchar* 应为可放入字符串的实际最大码位。作为一个近似值,它可被向上舍入到序列 127, 255, " +"65535, 1114111 中最接近的值。" + +#: ../../c-api/unicode.rst:359 +msgid "On error, set an exception and return ``NULL``." +msgstr "发生错误时,将设置异常并返回 ``NULL``。" + +#: ../../c-api/unicode.rst:361 +msgid "" +"After creation, the string can be filled by :c:func:`PyUnicode_WriteChar`, " +":c:func:`PyUnicode_CopyCharacters`, :c:func:`PyUnicode_Fill`, " +":c:func:`PyUnicode_WRITE` or similar. Since strings are supposed to be " +"immutable, take care to not “use” the result while it is being modified. In " +"particular, before it's filled with its final contents, a string:" +msgstr "" +"在创建之后,该字符串可由 :c:func:`PyUnicode_WriteChar`, " +":c:func:`PyUnicode_CopyCharacters`, :c:func:`PyUnicode_Fill`, " +":c:func:`PyUnicode_WRITE` 或其他类似的函数来填充。由于字符串应当是不可变对象,请注意不要在其被修改时“使用”其结果。 " +"具体而言,在以其最终内容进行填充之前,一个字符串:" + +#: ../../c-api/unicode.rst:368 +msgid "must not be hashed," +msgstr "不可被哈希," + +#: ../../c-api/unicode.rst:369 +msgid "" +"must not be :c:func:`converted to UTF-8 `, or " +"another non-\"canonical\" representation," +msgstr "不可被 :c:func:`转换为 UTF-8 `,或其他非“正规”的表示形式," + +#: ../../c-api/unicode.rst:371 +msgid "must not have its reference count changed," +msgstr "不可改变其引用计数," + +#: ../../c-api/unicode.rst:372 +msgid "must not be shared with code that might do one of the above." +msgstr "不可共享给可能执行上述操作的代码。" + +#: ../../c-api/unicode.rst:374 +msgid "" +"This list is not exhaustive. Avoiding these uses is your responsibility; " +"Python does not always check these requirements." +msgstr "这个列表并不全面。避免这些用法是你的责任;Python 并不总是会检查这些要求。" + +#: ../../c-api/unicode.rst:377 +msgid "" +"To avoid accidentally exposing a partially-written string object, prefer " +"using the :c:type:`PyUnicodeWriter` API, or one of the ``PyUnicode_From*`` " +"functions below." +msgstr "" +"为避免意外暴露仅部分写入的字符串对象,应当使用 :c:type:`PyUnicodeWriter` API,或是下列 " +"``PyUnicode_From*`` 函数之一。" + +#: ../../c-api/unicode.rst:388 +msgid "" +"Create a new Unicode object with the given *kind* (possible values are " +":c:macro:`PyUnicode_1BYTE_KIND` etc., as returned by " +":c:func:`PyUnicode_KIND`). The *buffer* must point to an array of *size* " +"units of 1, 2 or 4 bytes per character, as given by the kind." +msgstr "" +"以给定的 *kind* 创建一个新的 Unicode 对象(可能的值为 :c:macro:`PyUnicode_1BYTE_KIND` 等,即 " +":c:func:`PyUnicode_KIND` 所返回的值)。 *buffer* 必须指向由此分类所给出的,以每字符 1, 2 或 4 字节单位的 " +"*size* 大小的数组。" + +#: ../../c-api/unicode.rst:393 +msgid "" +"If necessary, the input *buffer* is copied and transformed into the " +"canonical representation. For example, if the *buffer* is a UCS4 string " +"(:c:macro:`PyUnicode_4BYTE_KIND`) and it consists only of codepoints in the " +"UCS1 range, it will be transformed into UCS1 " +"(:c:macro:`PyUnicode_1BYTE_KIND`)." +msgstr "" +"如有必要,输入 *buffer* 将被拷贝并转换为规范表示形式。例如,如果 *buffer* 是一个 UCS4 字符串 " +"(:c:macro:`PyUnicode_4BYTE_KIND`) 且仅由 UCS1 范围内的码位组成,它将被转换为 UCS1 " +"(:c:macro:`PyUnicode_1BYTE_KIND`)." + +#: ../../c-api/unicode.rst:404 +msgid "" +"Create a Unicode object from the char buffer *str*. The bytes will be " +"interpreted as being UTF-8 encoded. The buffer is copied into the new " +"object. The return value might be a shared object, i.e. modification of the " +"data is not allowed." +msgstr "" +"根据字符缓冲区 *str* 创建一个 Unicode 对象。字节数据将按 UTF-8 编码格式来解读。缓冲区会被拷贝到新的对象中。 " +"返回值可以是一个共享对象,即其数据不允许修改。" + +#: ../../c-api/unicode.rst:410 +msgid "This function raises :exc:`SystemError` when:" +msgstr "此函数会因以下情况而引发 :exc:`SystemError`:" + +#: ../../c-api/unicode.rst:412 +msgid "*size* < 0," +msgstr "*size* < 0," + +#: ../../c-api/unicode.rst:413 +msgid "*str* is ``NULL`` and *size* > 0" +msgstr "*str* 为 ``NULL`` 且 *size* > 0" + +#: ../../c-api/unicode.rst:415 +msgid "*str* == ``NULL`` with *size* > 0 is not allowed anymore." +msgstr "*str* == ``NULL`` 且 *size* > 0 不再被允许。" + +#: ../../c-api/unicode.rst:421 +msgid "" +"Create a Unicode object from a UTF-8 encoded null-terminated char buffer " +"*str*." +msgstr "根据 UTF-8 编码的以空值结束的字符缓冲区 *str* 创建一个 Unicode 对象。" + +#: ../../c-api/unicode.rst:427 +msgid "" +"Take a C :c:func:`printf`\\ -style *format* string and a variable number of " +"arguments, calculate the size of the resulting Python Unicode string and " +"return a string with the values formatted into it. The variable arguments " +"must be C types and must correspond exactly to the format characters in the " +"*format* ASCII-encoded string." +msgstr "" +"接受一个 C :c:func:`printf` 风格的 *format* 字符串和可变数量的参数,计算结果 Python Unicode " +"字符串的大小并返回包含已格式化值的字符串。可变数量的参数必须均为 C 类型并且必须恰好与 *format* ASCII 编码字符串中的格式字符相对应。" + +#: ../../c-api/unicode.rst:433 +msgid "" +"A conversion specifier contains two or more characters and has the following" +" components, which must occur in this order:" +msgstr "转换标记符包含两个或更多字符并具有以下组成,且必须遵循此处规定的顺序:" + +#: ../../c-api/unicode.rst:436 +msgid "The ``'%'`` character, which marks the start of the specifier." +msgstr "``'%'`` 字符,用于标记转换符的起始。" + +#: ../../c-api/unicode.rst:438 +msgid "" +"Conversion flags (optional), which affect the result of some conversion " +"types." +msgstr "转换旗标(可选),用于影响某些转换类型的结果。" + +#: ../../c-api/unicode.rst:441 +msgid "" +"Minimum field width (optional). If specified as an ``'*'`` (asterisk), the " +"actual width is given in the next argument, which must be of type " +":c:expr:`int`, and the object to convert comes after the minimum field width" +" and optional precision." +msgstr "" +"最小字段宽度(可选)。 如果指定为 ``'*'`` (星号),则实际宽度会在下一参数中给出,该参数必须为 :c:expr:`int` " +"类型,要转换的对象则放在最小字段宽度和可选精度之后。" + +#: ../../c-api/unicode.rst:446 +msgid "" +"Precision (optional), given as a ``'.'`` (dot) followed by the precision. If" +" specified as ``'*'`` (an asterisk), the actual precision is given in the " +"next argument, which must be of type :c:expr:`int`, and the value to convert" +" comes after the precision." +msgstr "" +"精度(可选),以在 ``'.'`` (点号) 之后加精度值的形式给出。 如果指定为 ``'*'`` (星号),则实际精度会在下一参数中给出,该参数必须为" +" :c:expr:`int` 类型,要转换的对象则放在精度之后。" + +#: ../../c-api/unicode.rst:451 +msgid "Length modifier (optional)." +msgstr "长度修饰符(可选)。" + +#: ../../c-api/unicode.rst:453 +msgid "Conversion type." +msgstr "转换类型。" + +#: ../../c-api/unicode.rst:455 +msgid "The conversion flag characters are:" +msgstr "转换旗标为:" + +#: ../../c-api/unicode.rst:460 +msgid "Flag" +msgstr "标志" + +#: ../../c-api/unicode.rst:460 +msgid "Meaning" +msgstr "含意" + +#: ../../c-api/unicode.rst:462 +msgid "``0``" +msgstr "``0``" + +#: ../../c-api/unicode.rst:462 +msgid "The conversion will be zero padded for numeric values." +msgstr "转换将为数字值填充零字符。" + +#: ../../c-api/unicode.rst:464 +msgid "``-``" +msgstr "``-``" + +#: ../../c-api/unicode.rst:464 +msgid "" +"The converted value is left adjusted (overrides the ``0`` flag if both are " +"given)." +msgstr "转换值将靠左对齐(如果同时给出则会覆盖 ``0`` 旗标)。" + +#: ../../c-api/unicode.rst:468 +msgid "" +"The length modifiers for following integer conversions (``d``, ``i``, ``o``," +" ``u``, ``x``, or ``X``) specify the type of the argument (:c:expr:`int` by " +"default):" +msgstr "" +"以下整数转换的长度修饰符 (``d``, ``i``, ``o``, ``u``, ``x``, or ``X``) 指明参数的类型 (默认为 " +":c:expr:`int`):" + +#: ../../c-api/unicode.rst:475 +msgid "Modifier" +msgstr "修饰符" + +#: ../../c-api/unicode.rst:475 +msgid "Types" +msgstr "类型" + +#: ../../c-api/unicode.rst:477 +msgid "``l``" +msgstr "``l``" + +#: ../../c-api/unicode.rst:477 +msgid ":c:expr:`long` or :c:expr:`unsigned long`" +msgstr ":c:expr:`long` 或 :c:expr:`unsigned long`" + +#: ../../c-api/unicode.rst:479 +msgid "``ll``" +msgstr "``ll``" + +#: ../../c-api/unicode.rst:479 +msgid ":c:expr:`long long` or :c:expr:`unsigned long long`" +msgstr ":c:expr:`long long` 或 :c:expr:`unsigned long long`" + +#: ../../c-api/unicode.rst:481 +msgid "``j``" +msgstr "``j``" + +#: ../../c-api/unicode.rst:481 +msgid ":c:type:`intmax_t` or :c:type:`uintmax_t`" +msgstr ":c:type:`intmax_t` 或 :c:type:`uintmax_t`" + +#: ../../c-api/unicode.rst:483 +msgid "``z``" +msgstr "``z``" + +#: ../../c-api/unicode.rst:483 +msgid ":c:type:`size_t` or :c:type:`ssize_t`" +msgstr ":c:type:`size_t` 或 :c:type:`ssize_t`" + +#: ../../c-api/unicode.rst:485 +msgid "``t``" +msgstr "``t``" + +#: ../../c-api/unicode.rst:485 +msgid ":c:type:`ptrdiff_t`" +msgstr ":c:type:`ptrdiff_t`" + +#: ../../c-api/unicode.rst:488 +msgid "" +"The length modifier ``l`` for following conversions ``s`` or ``V`` specify " +"that the type of the argument is :c:expr:`const wchar_t*`." +msgstr "针对以下转换 ``s`` 或 ``V`` 的长度修饰符 ``l`` 指明参数的类型为 :c:expr:`const wchar_t*`。" + +#: ../../c-api/unicode.rst:491 +msgid "The conversion specifiers are:" +msgstr "转换指示符如下:" + +#: ../../c-api/unicode.rst:497 +msgid "Conversion Specifier" +msgstr "转换指示符" + +#: ../../c-api/unicode.rst:498 +msgid "Type" +msgstr "类型" + +#: ../../c-api/unicode.rst:499 +msgid "Comment" +msgstr "注释" + +#: ../../c-api/unicode.rst:501 +msgid "``%``" +msgstr "``%``" + +#: ../../c-api/unicode.rst:502 +msgid "*n/a*" +msgstr "*不适用*" + +#: ../../c-api/unicode.rst:503 +msgid "The literal ``%`` character." +msgstr "字面的 ``%`` 字符。" + +#: ../../c-api/unicode.rst:505 +msgid "``d``, ``i``" +msgstr "``d``, ``i``" + +#: ../../c-api/unicode.rst:506 ../../c-api/unicode.rst:510 +#: ../../c-api/unicode.rst:514 ../../c-api/unicode.rst:518 +#: ../../c-api/unicode.rst:522 +msgid "Specified by the length modifier" +msgstr "由长度修饰符指明" + +#: ../../c-api/unicode.rst:507 +msgid "The decimal representation of a signed C integer." +msgstr "有符号 C 整数的十进制表示。" + +#: ../../c-api/unicode.rst:509 +msgid "``u``" +msgstr "``u``" + +#: ../../c-api/unicode.rst:511 +msgid "The decimal representation of an unsigned C integer." +msgstr "无符号 C 整数的十进制表示。" + +#: ../../c-api/unicode.rst:513 +msgid "``o``" +msgstr "``o``" + +#: ../../c-api/unicode.rst:515 +msgid "The octal representation of an unsigned C integer." +msgstr "无符号 C 整数的八进制表示。" + +#: ../../c-api/unicode.rst:517 +msgid "``x``" +msgstr "``x``" + +#: ../../c-api/unicode.rst:519 +msgid "The hexadecimal representation of an unsigned C integer (lowercase)." +msgstr "无符号 C 整数的十六进制表示(小写)。" + +#: ../../c-api/unicode.rst:521 +msgid "``X``" +msgstr "``X``" + +#: ../../c-api/unicode.rst:523 +msgid "The hexadecimal representation of an unsigned C integer (uppercase)." +msgstr "无符号 C 整数的十六进制表示(大写)。" + +#: ../../c-api/unicode.rst:525 +msgid "``c``" +msgstr "``c``" + +#: ../../c-api/unicode.rst:526 +msgid ":c:expr:`int`" +msgstr ":c:expr:`int`" + +#: ../../c-api/unicode.rst:527 +msgid "A single character." +msgstr "单个字符。" + +#: ../../c-api/unicode.rst:529 +msgid "``s``" +msgstr "``s``" + +#: ../../c-api/unicode.rst:530 +msgid ":c:expr:`const char*` or :c:expr:`const wchar_t*`" +msgstr ":c:expr:`const char*` 或 :c:expr:`const wchar_t*`" + +#: ../../c-api/unicode.rst:531 +msgid "A null-terminated C character array." +msgstr "以 null 为终止符的 C 字符数组。" + +#: ../../c-api/unicode.rst:533 +msgid "``p``" +msgstr "``p``" + +#: ../../c-api/unicode.rst:534 +msgid ":c:expr:`const void*`" +msgstr ":c:expr:`const void*`" + +#: ../../c-api/unicode.rst:535 +msgid "" +"The hex representation of a C pointer. Mostly equivalent to " +"``printf(\"%p\")`` except that it is guaranteed to start with the literal " +"``0x`` regardless of what the platform's ``printf`` yields." +msgstr "" +"一个 C 指针的十六进制表示形式。基本等价于 ``printf(\"%p\")`` 但它会确保以字面值 ``0x`` 开头而不管系统平台上的 " +"``printf`` 输出是什么。" + +#: ../../c-api/unicode.rst:540 +msgid "``A``" +msgstr "``A``" + +#: ../../c-api/unicode.rst:541 ../../c-api/unicode.rst:545 +#: ../../c-api/unicode.rst:555 ../../c-api/unicode.rst:559 +#: ../../c-api/unicode.rst:563 ../../c-api/unicode.rst:568 +msgid ":c:expr:`PyObject*`" +msgstr ":c:expr:`PyObject*`" + +#: ../../c-api/unicode.rst:542 +msgid "The result of calling :func:`ascii`." +msgstr ":func:`ascii` 调用的结果。" + +#: ../../c-api/unicode.rst:544 +msgid "``U``" +msgstr "``U``" + +#: ../../c-api/unicode.rst:546 +msgid "A Unicode object." +msgstr "一个 Unicode 对象。" + +#: ../../c-api/unicode.rst:548 +msgid "``V``" +msgstr "``V``" + +#: ../../c-api/unicode.rst:549 +msgid ":c:expr:`PyObject*`, :c:expr:`const char*` or :c:expr:`const wchar_t*`" +msgstr ":c:expr:`PyObject*`, :c:expr:`const char*` 或 :c:expr:`const wchar_t*`" + +#: ../../c-api/unicode.rst:550 +msgid "" +"A Unicode object (which may be ``NULL``) and a null-terminated C character " +"array as a second parameter (which will be used, if the first parameter is " +"``NULL``)." +msgstr "" +"一个 Unicode 对象 (可以为 ``NULL``) 和一个以空值结束的 C 字符数组作为第二个形参(如果第一个形参为 " +"``NULL``,第二个形参将被使用)。" + +#: ../../c-api/unicode.rst:554 +msgid "``S``" +msgstr "``S``" + +#: ../../c-api/unicode.rst:556 +msgid "The result of calling :c:func:`PyObject_Str`." +msgstr "调用 :c:func:`PyObject_Str` 的结果。" + +#: ../../c-api/unicode.rst:558 +msgid "``R``" +msgstr "``R``" + +#: ../../c-api/unicode.rst:560 +msgid "The result of calling :c:func:`PyObject_Repr`." +msgstr "调用 :c:func:`PyObject_Repr` 的结果。" + +#: ../../c-api/unicode.rst:562 +msgid "``T``" +msgstr "``T``" + +#: ../../c-api/unicode.rst:564 +msgid "" +"Get the fully qualified name of an object type; call " +":c:func:`PyType_GetFullyQualifiedName`." +msgstr "获取对象类型的完整限定名称;调用 :c:func:`PyType_GetFullyQualifiedName`。" + +#: ../../c-api/unicode.rst:567 +msgid "``#T``" +msgstr "``#T``" + +#: ../../c-api/unicode.rst:569 +msgid "" +"Similar to ``T`` format, but use a colon (``:``) as separator between the " +"module name and the qualified name." +msgstr "类似于 ``T`` 格式,但会使用冒号 (``:``) 作为模块名称和限定名称之间的分隔符。" + +#: ../../c-api/unicode.rst:572 +msgid "``N``" +msgstr "``N``" + +#: ../../c-api/unicode.rst:573 ../../c-api/unicode.rst:578 +msgid ":c:expr:`PyTypeObject*`" +msgstr ":c:expr:`PyTypeObject*`" + +#: ../../c-api/unicode.rst:574 +msgid "" +"Get the fully qualified name of a type; call " +":c:func:`PyType_GetFullyQualifiedName`." +msgstr "获取类型的完整限定名称;调用 :c:func:`PyType_GetFullyQualifiedName`。" + +#: ../../c-api/unicode.rst:577 +msgid "``#N``" +msgstr "``#N``" + +#: ../../c-api/unicode.rst:579 +msgid "" +"Similar to ``N`` format, but use a colon (``:``) as separator between the " +"module name and the qualified name." +msgstr "类似于 ``N`` 格式,但会使用冒号 (``:``) 作为模块名称和限定名称之间的分隔符。" + +#: ../../c-api/unicode.rst:583 +msgid "" +"The width formatter unit is number of characters rather than bytes. The " +"precision formatter unit is number of bytes or :c:type:`wchar_t` items (if " +"the length modifier ``l`` is used) for ``\"%s\"`` and ``\"%V\"`` (if the " +"``PyObject*`` argument is ``NULL``), and a number of characters for " +"``\"%A\"``, ``\"%U\"``, ``\"%S\"``, ``\"%R\"`` and ``\"%V\"`` (if the " +"``PyObject*`` argument is not ``NULL``)." +msgstr "" +"格式符的宽度单位是字符数而不是字节数。格式符的精度单位对于 ``\"%s\"`` 和 ``\"%V\"`` (如果 ``PyObject*`` 参数为 " +"``NULL``) 是字节数或 :c:type:`wchar_t` 项数 (如果使用了长度修饰符 ``l``),而对于 ``\"%A\"``, " +"``\"%U\"``, ``\"%S\"``, ``\"%R\"`` 和 ``\"%V\"`` (如果 ``PyObject*`` 参数不为 " +"``NULL``) 则为字符数。" + +#: ../../c-api/unicode.rst:591 +msgid "" +"Unlike to C :c:func:`printf` the ``0`` flag has effect even when a precision" +" is given for integer conversions (``d``, ``i``, ``u``, ``o``, ``x``, or " +"``X``)." +msgstr "" +"与 C :c:func:`printf` 不同的是 ``0`` 旗标即使在为整数转换 (``d``, ``i``, ``u``, ``o``, " +"``x``, or ``X``) 指定精度时也是有效的。" + +#: ../../c-api/unicode.rst:595 +msgid "Support for ``\"%lld\"`` and ``\"%llu\"`` added." +msgstr "增加了对 ``\"%lld\"`` 和 ``\"%llu\"`` 的支持。" + +#: ../../c-api/unicode.rst:598 +msgid "Support for ``\"%li\"``, ``\"%lli\"`` and ``\"%zi\"`` added." +msgstr "增加了对 ``\"%li\"``, ``\"%lli\"`` 和 ``\"%zi\"`` 的支持。" + +#: ../../c-api/unicode.rst:601 +msgid "" +"Support width and precision formatter for ``\"%s\"``, ``\"%A\"``, " +"``\"%U\"``, ``\"%V\"``, ``\"%S\"``, ``\"%R\"`` added." +msgstr "增加了对 ``\"%s\"``, ``\"%A\"``, ``\"%U\"``, ``\"%V\"``, ``\"%S\"``, ``\"%R\"`` 的宽度和精度格式符支持。" + +#: ../../c-api/unicode.rst:605 +msgid "" +"Support for conversion specifiers ``o`` and ``X``. Support for length " +"modifiers ``j`` and ``t``. Length modifiers are now applied to all integer " +"conversions. Length modifier ``l`` is now applied to conversion specifiers " +"``s`` and ``V``. Support for variable width and precision ``*``. Support for" +" flag ``-``." +msgstr "" +"支持转换说明符 ``o`` 和 ``X``。支持长度修饰符 ``j`` 和 ``t``。长度修饰符现在将应用于所有整数转换。长度修饰符 ``l`` " +"现在将应用于转换说明符 ``s`` 和 ``V``。支持可变宽度和精度 ``*``。支持旗标 ``-``。" + +#: ../../c-api/unicode.rst:613 +msgid "" +"An unrecognized format character now sets a :exc:`SystemError`. In previous " +"versions it caused all the rest of the format string to be copied as-is to " +"the result string, and any extra arguments discarded." +msgstr "" +"不可识别的格式字符现在会设置一个 :exc:`SystemError`。 " +"在之前版本中它会导致所有剩余格式字符串被原样拷贝到结果字符串,并丢弃任何额外的参数。" + +#: ../../c-api/unicode.rst:617 +msgid "Support for ``%T``, ``%#T``, ``%N`` and ``%#N`` formats added." +msgstr "增加了对 ``%T``, ``%#T``, ``%N`` 和 ``%#N`` 等格式的支持。" + +#: ../../c-api/unicode.rst:623 +msgid "" +"Identical to :c:func:`PyUnicode_FromFormat` except that it takes exactly two" +" arguments." +msgstr "等同于 :c:func:`PyUnicode_FromFormat` 但它将接受恰好两个参数。" + +#: ../../c-api/unicode.rst:629 +msgid "" +"Copy an instance of a Unicode subtype to a new true Unicode object if " +"necessary. If *obj* is already a true Unicode object (not a subtype), return" +" a new :term:`strong reference` to the object." +msgstr "" +"如有必要将把一个 Unicode 子类型的实例拷贝为新的真实 Unicode 对象。如果 *obj* 已经是一个真实 Unicode " +"对象(而非子类型),则返回一个新的指向该对象的 :term:`strong reference`。" + +#: ../../c-api/unicode.rst:633 +msgid "" +"Objects other than Unicode or its subtypes will cause a :exc:`TypeError`." +msgstr "非 Unicode 或其子类型的对象将导致 :exc:`TypeError`。" + +#: ../../c-api/unicode.rst:638 +msgid "Create a Unicode Object from the given Unicode code point *ordinal*." +msgstr "根据给定的 Unicode 码点 *ordinal* 创建一个 Unicode 对象。" + +#: ../../c-api/unicode.rst:640 +msgid "" +"The ordinal must be in ``range(0x110000)``. A :exc:`ValueError` is raised in" +" the case it is not." +msgstr "码点必须在 ``range(0x110000)`` 范围内。如果超出范围则会引发 :exc:`ValueError`。" + +#: ../../c-api/unicode.rst:647 +msgid "Decode an encoded object *obj* to a Unicode object." +msgstr "将一个已编码的对象 *obj* 解码为 Unicode 对象。" + +#: ../../c-api/unicode.rst:649 +msgid "" +":class:`bytes`, :class:`bytearray` and other :term:`bytes-like objects " +"` are decoded according to the given *encoding* and using" +" the error handling defined by *errors*. Both can be ``NULL`` to have the " +"interface use the default values (see :ref:`builtincodecs` for details)." +msgstr "" +":class:`bytes`, :class:`bytearray` 和其他 :term:`字节类对象 ` " +"将按照给定的 *encoding* 来解码并使用由 *errors* 定义的错误处理方式。两者均可为 ``NULL`` 即让接口使用默认值(请参阅 " +":ref:`builtincodecs` 了解详情)。" + +#: ../../c-api/unicode.rst:655 +msgid "" +"All other objects, including Unicode objects, cause a :exc:`TypeError` to be" +" set." +msgstr "所有其他对象,包括 Unicode 对象,都将导致设置 :exc:`TypeError`。" + +#: ../../c-api/unicode.rst:658 +msgid "" +"The API returns ``NULL`` if there was an error. The caller is responsible " +"for decref'ing the returned objects." +msgstr "如有错误该 API 将返回 ``NULL``。调用方要负责递减指向所返回对象的引用。" + +#: ../../c-api/unicode.rst:664 +msgid "" +"Append the string *right* to the end of *p_left*. *p_left* must point to a " +":term:`strong reference` to a Unicode object; :c:func:`!PyUnicode_Append` " +"releases (\":term:`steals `\") this reference." +msgstr "" + +#: ../../c-api/unicode.rst:669 +msgid "On error, set *\\*p_left* to ``NULL`` and set an exception." +msgstr "出错时,将 *\\*p_left* 设为 ``NULL`` 并设置一个异常。" + +#: ../../c-api/unicode.rst:671 +msgid "On success, set *\\*p_left* to a new strong reference to the result." +msgstr "成功时,将 *\\*p_left* 设为一个新的指向该结果的强引用。" + +#: ../../c-api/unicode.rst:676 +msgid "" +"The function is similar to :c:func:`PyUnicode_Append`, with the only " +"difference being that it decrements the reference count of *right* by one." +msgstr "该函数类似于 :c:func:`PyUnicode_Append`,仅有的不同在于它会将 *right* 的引用计数减一。" + +#: ../../c-api/unicode.rst:682 +msgid "" +"Return a mapping suitable for decoding a custom single-byte encoding. Given " +"a Unicode string *string* of up to 256 characters representing an encoding " +"table, returns either a compact internal mapping object or a dictionary " +"mapping character ordinals to byte values. Raises a :exc:`TypeError` and " +"return ``NULL`` on invalid input." +msgstr "" +"返回一个适用于对自定义单字节编码格式进行解码的映射。给定一个表示编码表的至多 256 个字符的 Unicode 字符串 " +"*string*,返回一个将字符编号映射到字节值的紧凑内部映射对象或字典。对于不合法的输入将引发 :exc:`TypeError` 并返回 " +"``NULL``." + +#: ../../c-api/unicode.rst:693 +msgid "" +"Return the name of the default string encoding, ``\"utf-8\"``. See " +":func:`sys.getdefaultencoding`." +msgstr "返回默认字符编码格式名称,即 ``\"utf-8\"``。参见 :func:`sys.getdefaultencoding`。" + +#: ../../c-api/unicode.rst:696 +msgid "" +"The returned string does not need to be freed, and is valid until " +"interpreter shutdown." +msgstr "返回的字符串不需要被释放,并将保持可用直到解释器关闭。" + +#: ../../c-api/unicode.rst:702 +msgid "Return the length of the Unicode object, in code points." +msgstr "返回 Unicode 对象码位的长度。" + +#: ../../c-api/unicode.rst:704 +msgid "On error, set an exception and return ``-1``." +msgstr "发生错误时,将设置异常并返回 ``-1``。" + +#: ../../c-api/unicode.rst:715 +msgid "" +"Copy characters from one Unicode object into another. This function " +"performs character conversion when necessary and falls back to " +":c:func:`!memcpy` if possible. Returns ``-1`` and sets an exception on " +"error, otherwise returns the number of copied characters." +msgstr "" +"将一个 Unicode 对象中的字符拷贝到另一个对象中。此函数会在必要时执行字符转换并会在可能的情况下回退到 :c:func:`!memcpy`。 " +"在出错时将返回 ``-1`` 并设置一个异常,在其他情况下将返回拷贝的字符数量。" + +#: ../../c-api/unicode.rst:720 ../../c-api/unicode.rst:750 +#: ../../c-api/unicode.rst:770 +msgid "" +"The string must not have been “used” yet. See :c:func:`PyUnicode_New` for " +"details." +msgstr "该字符串必须尚未被“使用”。请参阅 :c:func:`PyUnicode_New` 了解详情。" + +#: ../../c-api/unicode.rst:728 +msgid "Resize a Unicode object *\\*unicode* to the new *length* in code points." +msgstr "将一个 Unicode 对象 *\\*unicode* 的代码点长度改为新的 *length*。" + +#: ../../c-api/unicode.rst:730 +msgid "" +"Try to resize the string in place (which is usually faster than allocating a" +" new string and copying characters), or create a new string." +msgstr "尝试原地改变字符串长度(这通常比分配一个新字符串并拷贝字符要快),或新建一个字符串。" + +#: ../../c-api/unicode.rst:733 +msgid "" +"*\\*unicode* is modified to point to the new (resized) object and ``0`` is " +"returned on success. Otherwise, ``-1`` is returned and an exception is set, " +"and *\\*unicode* is left untouched." +msgstr "" +"*\\*unicode* 将被修改为指向新(调整大小后的)对象,成功时返回 ``0``。失败时返回 ``-1`` 并设置异常,且 " +"*\\*unicode* 保持原状。" + +#: ../../c-api/unicode.rst:737 +msgid "" +"The function doesn't check string content, the result may not be a string in" +" canonical representation." +msgstr "该函数不会检查字符串内容,返回结果可能不是规范表示的字符串。" + +#: ../../c-api/unicode.rst:744 +msgid "" +"Fill a string with a character: write *fill_char* into " +"``unicode[start:start+length]``." +msgstr "使用一个字符填充字符串:将 *fill_char* 写入 ``unicode[start:start+length]``。" + +#: ../../c-api/unicode.rst:747 +msgid "" +"Fail if *fill_char* is bigger than the string maximum character, or if the " +"string has more than 1 reference." +msgstr "如果 *fill_char* 值大于字符串最大字符值,或者如果字符串有 1 以上的引用将执行失败。" + +#: ../../c-api/unicode.rst:753 +msgid "" +"Return the number of written characters, or return ``-1`` and raise an " +"exception on error." +msgstr "" + +#: ../../c-api/unicode.rst:762 +msgid "" +"Write a *character* to the string *unicode* at the zero-based *index*. " +"Return ``0`` on success, ``-1`` on error with an exception set." +msgstr "" +"向字符串 *unicode* 的从零开始计数的 *index* 位置写入一个 *character*。成功时返回 ``0``,出错时返回 ``-1`` " +"并设置异常。" + +#: ../../c-api/unicode.rst:765 +msgid "" +"This function checks that *unicode* is a Unicode object, that the index is " +"not out of bounds, and that the object's reference count is one. See " +":c:func:`PyUnicode_WRITE` for a version that skips these checks, making them" +" your responsibility." +msgstr "" +"此函数会检查 *unicode* 是否为 Unicode 对象,其索引未越界,并且该对象的引用计数为一。另请参阅会跳过这些检查的版本 " +":c:func:`PyUnicode_WRITE`,而由你自行负责。" + +#: ../../c-api/unicode.rst:778 +msgid "" +"Read a character from a string. This function checks that *unicode* is a " +"Unicode object and the index is not out of bounds, in contrast to " +":c:func:`PyUnicode_READ_CHAR`, which performs no error checking." +msgstr "" +"从字符串读取一个字符。该函数将检查 *unicode* 是否为 Unicode 对象且索引是否未越界,这不同于 " +":c:func:`PyUnicode_READ_CHAR`,后者不会执行任何错误检查。" + +#: ../../c-api/unicode.rst:782 +msgid "Return character on success, ``-1`` on error with an exception set." +msgstr "成功时返回字符,出错时返回 ``-1`` 并设置一个异常。" + +#: ../../c-api/unicode.rst:790 +msgid "" +"Return a substring of *unicode*, from character index *start* (included) to " +"character index *end* (excluded). Negative indices are not supported. On " +"error, set an exception and return ``NULL``." +msgstr "" +"返回 *unicode* 的一个子串,从字符索引 *start* (含) 到字符索引 *end* (不含)。不支持负索引号。 " +"出错时,将设置一个异常并返回 ``NULL``。" + +#: ../../c-api/unicode.rst:800 +msgid "" +"Copy the string *unicode* into a UCS4 buffer, including a null character, if" +" *copy_null* is set. Returns ``NULL`` and sets an exception on error (in " +"particular, a :exc:`SystemError` if *buflen* is smaller than the length of " +"*unicode*). *buffer* is returned on success." +msgstr "" +"将字符串 *unicode* 拷贝到一个 UCS4 缓冲区,包括一个空字符,如果设置了 *copy_null* 的话。出错时返回 ``NULL`` " +"并设置一个异常(特别是当 *buflen* 小于 *unicode* 的长度时,将设置 :exc:`SystemError` 异常)。成功时返回 " +"*buffer*." + +#: ../../c-api/unicode.rst:810 +msgid "" +"Copy the string *unicode* into a new UCS4 buffer that is allocated using " +":c:func:`PyMem_Malloc`. If this fails, ``NULL`` is returned with a " +":exc:`MemoryError` set. The returned buffer always has an extra null code " +"point appended." +msgstr "" +"将字符串 *unicode* 拷贝到使用 :c:func:`PyMem_Malloc` 分配的新 UCS4 缓冲区。如果执行失败,将返回 " +"``NULL`` 并设置 :exc:`MemoryError`。返回的缓冲区将总是会添加一个额外的空码位。" + +#: ../../c-api/unicode.rst:819 +msgid "Locale Encoding" +msgstr "语言区域编码格式" + +#: ../../c-api/unicode.rst:821 +msgid "" +"The current locale encoding can be used to decode text from the operating " +"system." +msgstr "当前语言区域编码格式可被用来解码来自操作系统的文本。" + +#: ../../c-api/unicode.rst:828 +msgid "" +"Decode a string from UTF-8 on Android and VxWorks, or from the current " +"locale encoding on other platforms. The supported error handlers are " +"``\"strict\"`` and ``\"surrogateescape\"`` (:pep:`383`). The decoder uses " +"``\"strict\"`` error handler if *errors* is ``NULL``. *str* must end with a" +" null character but cannot contain embedded null characters." +msgstr "" +"解码字符串在 Android 和 VxWorks 上使用 UTF-8,在其他平台上则使用当前语言区域编码格式。支持的错误处理器有 " +"``\"strict\"`` 和 ``\"surrogateescape\"`` (:pep:`383`)。如果 *errors* 为 ``NULL``" +" 则解码器将使用 ``\"strict\"`` 错误处理器。 *str* 必须以一个空字符结束但不可包含嵌入的空字符。" + +#: ../../c-api/unicode.rst:835 +msgid "" +"Use :c:func:`PyUnicode_DecodeFSDefaultAndSize` to decode a string from the " +":term:`filesystem encoding and error handler`." +msgstr "" +"使用 :c:func:`PyUnicode_DecodeFSDefaultAndSize` 以 :term:`filesystem encoding " +"and error handler` 来解码字符串。" + +#: ../../c-api/unicode.rst:838 ../../c-api/unicode.rst:873 +msgid "This function ignores the :ref:`Python UTF-8 Mode `." +msgstr "此函数将忽略 :ref:`Python UTF-8 模式 `。" + +#: ../../c-api/unicode.rst:842 ../../c-api/unicode.rst:958 +msgid "The :c:func:`Py_DecodeLocale` function." +msgstr ":c:func:`Py_DecodeLocale` 函数。" + +#: ../../c-api/unicode.rst:846 +msgid "" +"The function now also uses the current locale encoding for the " +"``surrogateescape`` error handler, except on Android. Previously, " +":c:func:`Py_DecodeLocale` was used for the ``surrogateescape``, and the " +"current locale encoding was used for ``strict``." +msgstr "" +"此函数现在也会为 ``surrogateescape`` 错误处理器使用当前语言区域编码格式,但在 Android 上例外。 " +"在之前版本中,:c:func:`Py_DecodeLocale` 将被用于 ``surrogateescape``,而当前语言区域编码格式将被用于 " +"``strict``." + +#: ../../c-api/unicode.rst:855 +msgid "" +"Similar to :c:func:`PyUnicode_DecodeLocaleAndSize`, but compute the string " +"length using :c:func:`!strlen`." +msgstr "" +"类似于 :c:func:`PyUnicode_DecodeLocaleAndSize`,但会使用 :c:func:`!strlen` 来计算字符串长度。" + +#: ../../c-api/unicode.rst:863 +msgid "" +"Encode a Unicode object to UTF-8 on Android and VxWorks, or to the current " +"locale encoding on other platforms. The supported error handlers are " +"``\"strict\"`` and ``\"surrogateescape\"`` (:pep:`383`). The encoder uses " +"``\"strict\"`` error handler if *errors* is ``NULL``. Return a " +":class:`bytes` object. *unicode* cannot contain embedded null characters." +msgstr "" +"编码 Unicode 对象在 Android 和 VxWorks 上使用 UTF-8,在其他平台上使用当前语言区域编码格式。支持的错误处理器有 " +"``\"strict\"`` 和 ``\"surrogateescape\"`` (:pep:`383`)。如果 *errors* 为 ``NULL``" +" 则编码器将使用 ``\"strict\"`` 错误处理器。返回一个 :class:`bytes` 对象。 *unicode* 不可包含嵌入的空字符。" + +#: ../../c-api/unicode.rst:870 +msgid "" +"Use :c:func:`PyUnicode_EncodeFSDefault` to encode a string to the " +":term:`filesystem encoding and error handler`." +msgstr "" +"使用 :c:func:`PyUnicode_EncodeFSDefault` 将字符串编码为 :term:`filesystem encoding " +"and error handler`." + +#: ../../c-api/unicode.rst:877 ../../c-api/unicode.rst:989 +msgid "The :c:func:`Py_EncodeLocale` function." +msgstr ":c:func:`Py_EncodeLocale` 函数。" + +#: ../../c-api/unicode.rst:881 +msgid "" +"The function now also uses the current locale encoding for the " +"``surrogateescape`` error handler, except on Android. Previously, " +":c:func:`Py_EncodeLocale` was used for the ``surrogateescape``, and the " +"current locale encoding was used for ``strict``." +msgstr "" +"此函数现在也会为 ``surrogateescape`` 错误处理器使用当前语言区域编码格式,但在 Android 上例外。 " +"在之前版本中,:c:func:`Py_EncodeLocale` 将被用于 ``surrogateescape``,而当前语言区域编码格式将被用于 " +"``strict``." + +#: ../../c-api/unicode.rst:890 +msgid "File System Encoding" +msgstr "文件系统编码格式" + +#: ../../c-api/unicode.rst:892 +msgid "" +"Functions encoding to and decoding from the :term:`filesystem encoding and " +"error handler` (:pep:`383` and :pep:`529`)." +msgstr "" +"使用 :term:`filesystem encoding and error handler` 的编码和解码函数 (:pep:`383` 和 " +":pep:`529`)." + +#: ../../c-api/unicode.rst:895 +msgid "" +"To encode file names to :class:`bytes` during argument parsing, the " +"``\"O&\"`` converter should be used, passing " +":c:func:`!PyUnicode_FSConverter` as the conversion function:" +msgstr "" +"要在参数解析期间将文件名编码为 :class:`bytes`,应当使用 ``\"O&\"`` 转换器,传入 " +":c:func:`!PyUnicode_FSConverter` 作为转换函数:" + +#: ../../c-api/unicode.rst:901 +msgid "" +":ref:`PyArg_Parse\\* converter `: encode :class:`str` objects " +"-- obtained directly or through the :class:`os.PathLike` interface -- to " +":class:`bytes` using :c:func:`PyUnicode_EncodeFSDefault`; :class:`bytes` " +"objects are output as-is. *result* must be an address of a C variable of " +"type :c:expr:`PyObject*` (or :c:expr:`PyBytesObject*`). On success, set the " +"variable to a new :term:`strong reference` to a :ref:`bytes object " +"` which must be released when it is no longer used and return " +"a non-zero value (:c:macro:`Py_CLEANUP_SUPPORTED`). Embedded null bytes are " +"not allowed in the result. On failure, return ``0`` with an exception set." +msgstr "" +":ref:`PyArg_Parse\\* 转换器 `: 使用 " +":c:func:`PyUnicode_EncodeFSDefault` 编码 :class:`str` 对象 -- 直接获取或通过 " +":class:`os.PathLike` 接口 -- 为 :class:`bytes`; :class:`bytes` 对象将被原样输出。 " +"*result* 必须是一个类型为 :c:expr:`PyObject*` (或 :c:expr:`PyBytesObject*`) 的 C " +"变量的地址。执行成功时,将把该变量设为指向一个 :ref:`字节串对象 ` 的新的 :term:`strong " +"reference`,它必须在其不再使用时被释放并返回一个非零值 (:c:macro:`Py_CLEANUP_SUPPORTED`)。 " +"结果中不允许嵌入空字节。执行失败时,将返回 ``0`` 并设置一个异常。" + +#: ../../c-api/unicode.rst:913 +msgid "" +"If *obj* is ``NULL``, the function releases a strong reference stored in the" +" variable referred by *result* and returns ``1``." +msgstr "如果 *obj* 为 ``NULL``,该函数将释放存放在 *result* 所引用的变量中的强引用并返回 ``1``。" + +#: ../../c-api/unicode.rst:918 ../../c-api/unicode.rst:945 +msgid "Accepts a :term:`path-like object`." +msgstr "接受一个 :term:`path-like object`。" + +#: ../../c-api/unicode.rst:921 +msgid "" +"To decode file names to :class:`str` during argument parsing, the ``\"O&\"``" +" converter should be used, passing :c:func:`!PyUnicode_FSDecoder` as the " +"conversion function:" +msgstr "" +"要在参数解析期间将文件名解码为 :class:`str`,应当使用 ``\"O&\"`` 转换器,传入 " +":c:func:`!PyUnicode_FSDecoder` 作为转换函数:" + +#: ../../c-api/unicode.rst:927 +msgid "" +":ref:`PyArg_Parse\\* converter `: decode :class:`bytes` objects" +" -- obtained either directly or indirectly through the :class:`os.PathLike` " +"interface -- to :class:`str` using " +":c:func:`PyUnicode_DecodeFSDefaultAndSize`; :class:`str` objects are output " +"as-is. *result* must be an address of a C variable of type " +":c:expr:`PyObject*` (or :c:expr:`PyUnicodeObject*`). On success, set the " +"variable to a new :term:`strong reference` to a :ref:`Unicode object " +"` which must be released when it is no longer used and " +"return a non-zero value (:c:macro:`Py_CLEANUP_SUPPORTED`). Embedded null " +"characters are not allowed in the result. On failure, return ``0`` with an " +"exception set." +msgstr "" +":ref:`PyArg_Parse\\* 转换器 `: 使用 " +":c:func:`PyUnicode_DecodeFSDefaultAndSize` 解码 :class:`bytes` 对象 -- 直接获取或通过 " +":class:`os.PathLike` 接口 -- 为 :class:`str`; :class:`str` 对象将被原样输出。 *result* " +"必须是一个类型为 :c:expr:`PyObject*` (或 :c:expr:`PyUnicodeObject*`) 的 C 变量的地址。 " +"执行成功时,将把该变量设为指向一个 :ref:`Unicode 对象 ` 的新的 :term:`strong " +"reference`,它必须在其不再使用时被释放并返回一个非零值 (:c:macro:`Py_CLEANUP_SUPPORTED`)。 " +"结果中不允许嵌入空字节。执行失败时,将返回 ``0`` 并设置一个异常。" + +#: ../../c-api/unicode.rst:940 +msgid "" +"If *obj* is ``NULL``, release the strong reference to the object referred to" +" by *result* and return ``1``." +msgstr "如果 *obj* 为 ``NULL``,则释放指向 *result* 所引用的对象的强引用并返回 ``1``。" + +#: ../../c-api/unicode.rst:951 +msgid "" +"Decode a string from the :term:`filesystem encoding and error handler`." +msgstr "使用 :term:`filesystem encoding and error handler` 解码字符串。" + +#: ../../c-api/unicode.rst:953 +msgid "" +"If you need to decode a string from the current locale encoding, use " +":c:func:`PyUnicode_DecodeLocaleAndSize`." +msgstr "如果你需要以当前语言区域编码格式解码字符串,请使用 :c:func:`PyUnicode_DecodeLocaleAndSize`。" + +#: ../../c-api/unicode.rst:960 ../../c-api/unicode.rst:973 +#: ../../c-api/unicode.rst:993 +msgid "" +"The :term:`filesystem error handler `" +" is now used." +msgstr "现在将使用 :term:`文件系统编码格式和错误处理器 `。" + +#: ../../c-api/unicode.rst:967 +msgid "" +"Decode a null-terminated string from the :term:`filesystem encoding and " +"error handler`." +msgstr "使用 :term:`filesystem encoding and error handler` 解码以空值结尾的字符串。" + +#: ../../c-api/unicode.rst:970 +msgid "" +"If the string length is known, use " +":c:func:`PyUnicode_DecodeFSDefaultAndSize`." +msgstr "如果字符串长度已知,则使用 :c:func:`PyUnicode_DecodeFSDefaultAndSize`。" + +#: ../../c-api/unicode.rst:980 +msgid "" +"Encode a Unicode object to the :term:`filesystem encoding and error " +"handler`, and return :class:`bytes`. Note that the resulting :class:`bytes` " +"object can contain null bytes." +msgstr "" +"使用 :term:`filesystem encoding and error handler` 编码一个 Unicode 对象,并返回 " +":class:`bytes`。请注意结果 :class:`bytes` 对象可以包含空字节。" + +#: ../../c-api/unicode.rst:984 +msgid "" +"If you need to encode a string to the current locale encoding, use " +":c:func:`PyUnicode_EncodeLocale`." +msgstr "如果你需要以当前语言区域编码格式编码字符串,请使用 :c:func:`PyUnicode_EncodeLocale`。" + +#: ../../c-api/unicode.rst:998 +msgid "wchar_t Support" +msgstr "wchar_t 支持" + +#: ../../c-api/unicode.rst:1000 +msgid ":c:type:`wchar_t` support for platforms which support it:" +msgstr "在受支持的平台上支持 :c:type:`wchar_t`:" + +#: ../../c-api/unicode.rst:1004 +msgid "" +"Create a Unicode object from the :c:type:`wchar_t` buffer *wstr* of the " +"given *size*. Passing ``-1`` as the *size* indicates that the function must " +"itself compute the length, using :c:func:`!wcslen`. Return ``NULL`` on " +"failure." +msgstr "" +"根据给定的 *size* 的 :c:type:`wchar_t` 缓冲区 *wstr* 创建一个 Unicode 对象。传入 ``-1`` 作为 " +"*size* 表示该函数必须使用 :c:func:`!wcslen` 自动计算缓冲区长度。失败时将返回 ``NULL``。" + +#: ../../c-api/unicode.rst:1012 +msgid "" +"Copy the Unicode object contents into the :c:type:`wchar_t` buffer *wstr*. " +"At most *size* :c:type:`wchar_t` characters are copied (excluding a possibly" +" trailing null termination character). Return the number of " +":c:type:`wchar_t` characters copied or ``-1`` in case of an error." +msgstr "" +"将 Unicode 对象的内容拷贝到 :c:type:`wchar_t` 缓冲区 *wstr* 中。至多拷贝 *size* 个 " +":c:type:`wchar_t` 字符(不包括可能存在的末尾空结束字符)。返回拷贝的 :c:type:`wchar_t` 字符数或在出错时返回 " +"``-1``。" + +#: ../../c-api/unicode.rst:1017 +msgid "" +"When *wstr* is ``NULL``, instead return the *size* that would be required to" +" store all of *unicode* including a terminating null." +msgstr "当 *wstr* 为 ``NULL`` 时,则改为返回存储包括结束空值在内的所有 *unicode* 内容所需的 *size*。" + +#: ../../c-api/unicode.rst:1020 +msgid "" +"Note that the resulting :c:expr:`wchar_t*` string may or may not be null-" +"terminated. It is the responsibility of the caller to make sure that the " +":c:expr:`wchar_t*` string is null-terminated in case this is required by the" +" application. Also, note that the :c:expr:`wchar_t*` string might contain " +"null characters, which would cause the string to be truncated when used with" +" most C functions." +msgstr "" +"请注意结果 :c:expr:`wchar_t*` 字符串可能是以空值结束也可能不是。调用方要负责确保 :c:expr:`wchar_t*` " +"字符串以空值结束以防应用有此要求。此外,请注意 :c:expr:`wchar_t*` 字符串有可能包含空字符,这将导致字符串在与大多数 C " +"函数一起使用时被截断。" + +#: ../../c-api/unicode.rst:1030 +msgid "" +"Convert the Unicode object to a wide character string. The output string " +"always ends with a null character. If *size* is not ``NULL``, write the " +"number of wide characters (excluding the trailing null termination " +"character) into *\\*size*. Note that the resulting :c:type:`wchar_t` string " +"might contain null characters, which would cause the string to be truncated " +"when used with most C functions. If *size* is ``NULL`` and the " +":c:expr:`wchar_t*` string contains null characters a :exc:`ValueError` is " +"raised." +msgstr "" +"将 Unicode 对象转换为宽字符串。输出字符串将总是以空字符结尾。如果 *size* 不为 " +"``NULL``,则会将宽字符的数量(不包括结尾空字符)写入到 *\\*size* 中。请注意结果 :c:type:`wchar_t` " +"字符串可能包含空字符,这将导致在大多数 C 函数中使用时字符串被截断。如果 *size* 为 ``NULL`` 并且 " +":c:expr:`wchar_t*` 字符串包含空字符则将引发 :exc:`ValueError`。" + +#: ../../c-api/unicode.rst:1038 +msgid "" +"Returns a buffer allocated by :c:macro:`PyMem_New` (use :c:func:`PyMem_Free`" +" to free it) on success. On error, returns ``NULL`` and *\\*size* is " +"undefined. Raises a :exc:`MemoryError` if memory allocation is failed." +msgstr "" +"成功时返回由 :c:macro:`PyMem_New` 分配的缓冲区(使用 :c:func:`PyMem_Free` 来释放它)。发生错误时,则返回 " +"``NULL`` 并且 *\\*size* 将是未定义的。如果内存分配失败则会引发 :exc:`MemoryError`。" + +#: ../../c-api/unicode.rst:1045 +msgid "" +"Raises a :exc:`ValueError` if *size* is ``NULL`` and the :c:expr:`wchar_t*` " +"string contains null characters." +msgstr "" +"如果 *size* 为 ``NULL`` 且 :c:expr:`wchar_t*` 字符串包含空字符则会引发 :exc:`ValueError`。" + +#: ../../c-api/unicode.rst:1053 +msgid "Built-in Codecs" +msgstr "内置编解码器" + +#: ../../c-api/unicode.rst:1055 +msgid "" +"Python provides a set of built-in codecs which are written in C for speed. " +"All of these codecs are directly usable via the following functions." +msgstr "Python 提供了一组以 C 编写以保证运行速度的内置编解码器。所有这些编解码器均可通过下列函数直接使用。" + +#: ../../c-api/unicode.rst:1058 +msgid "" +"Many of the following APIs take two arguments encoding and errors, and they " +"have the same semantics as the ones of the built-in :func:`str` string " +"object constructor." +msgstr "" +"下列 API 大都接受 encoding 和 errors 两个参数,它们具有与在内置 :func:`str` 字符串对象构造器中同名参数相同的语义。" + +#: ../../c-api/unicode.rst:1062 +msgid "" +"Setting encoding to ``NULL`` causes the default encoding to be used which is" +" UTF-8. The file system calls should use :c:func:`PyUnicode_FSConverter` " +"for encoding file names. This uses the :term:`filesystem encoding and error " +"handler` internally." +msgstr "" +"将 encoding 设为 ``NULL`` 将使用默认编码格式即 UTF-8。文件系统调用应当使用 " +":c:func:`PyUnicode_FSConverter` 来编码文件名。这将在内部使用 :term:`filesystem encoding " +"and error handler`." + +#: ../../c-api/unicode.rst:1067 +msgid "" +"Error handling is set by errors which may also be set to ``NULL`` meaning to" +" use the default handling defined for the codec. Default error handling for" +" all built-in codecs is \"strict\" (:exc:`ValueError` is raised)." +msgstr "" +"错误处理方式由 errors 设置并且也可以设为 ``NULL`` 表示使用为编解码器定义的默认处理方式。所有内置编解码器的默认错误处理方式是 " +"\"strict\" (会引发 :exc:`ValueError`)。" + +#: ../../c-api/unicode.rst:1071 +msgid "" +"The codecs all use a similar interface. Only deviations from the following " +"generic ones are documented for simplicity." +msgstr "编解码器都使用类似的接口。为了保持简单只有与下列泛型编解码器的差异才会记录在文档中。" + +#: ../../c-api/unicode.rst:1076 +msgid "Generic Codecs" +msgstr "泛型编解码器" + +#: ../../c-api/unicode.rst:1078 +msgid "The following macro is provided:" +msgstr "提供了下列的宏:" + +#: ../../c-api/unicode.rst:1083 +msgid "The Unicode code point ``U+FFFD`` (replacement character)." +msgstr "Unicode 码位 ``U+FFFD`` (替换字符)。" + +#: ../../c-api/unicode.rst:1085 +msgid "" +"This Unicode character is used as the replacement character during decoding " +"if the *errors* argument is set to \"replace\"." +msgstr "该 Unicode 字符将在 *errors* 参数设为 \"replace\" 时被用作解码期间的替换字符。" + +#: ../../c-api/unicode.rst:1089 +msgid "These are the generic codec APIs:" +msgstr "以下是泛型编解码器的 API:" + +#: ../../c-api/unicode.rst:1095 +msgid "" +"Create a Unicode object by decoding *size* bytes of the encoded string " +"*str*. *encoding* and *errors* have the same meaning as the parameters of " +"the same name in the :func:`str` built-in function. The codec to be used is" +" looked up using the Python codec registry. Return ``NULL`` if an exception" +" was raised by the codec." +msgstr "" +"通过解码已编码字节串 *str* 的 *size* 个字节创建一个 Unicode 对象。 *encoding* 和 *errors* 具有与 " +":func:`str` 内置函数中同名形参相同的含义。要使用的编解码器将使用 Python 编解码器注册表来查找。如果编解码器引发了异常则返回 " +"``NULL``." + +#: ../../c-api/unicode.rst:1105 +msgid "" +"Encode a Unicode object and return the result as Python bytes object. " +"*encoding* and *errors* have the same meaning as the parameters of the same " +"name in the Unicode :meth:`~str.encode` method. The codec to be used is " +"looked up using the Python codec registry. Return ``NULL`` if an exception " +"was raised by the codec." +msgstr "" +"编码一个 Unicode 对象并将结果作为 Python 字节串对象返回。 *encoding* 和 *errors* 具有与 Unicode " +":meth:`~str.encode` 方法中同名形参相同的含义。要使用的编解码器将使用 Python 编解码器注册表来查找。 " +"如果编解码器引发了异常则返回 ``NULL``。" + +#: ../../c-api/unicode.rst:1113 +msgid "UTF-8 Codecs" +msgstr "UTF-8 编解码器" + +#: ../../c-api/unicode.rst:1115 +msgid "These are the UTF-8 codec APIs:" +msgstr "以下是 UTF-8 编解码器 API:" + +#: ../../c-api/unicode.rst:1120 +msgid "" +"Create a Unicode object by decoding *size* bytes of the UTF-8 encoded string" +" *str*. Return ``NULL`` if an exception was raised by the codec." +msgstr "" +"通过解码 UTF-8 编码的字节串 *str* 的 *size* 个字节创建一个 Unicode 对象。如果编解码器引发了异常则返回 ``NULL``." + +#: ../../c-api/unicode.rst:1127 +msgid "" +"If *consumed* is ``NULL``, behave like :c:func:`PyUnicode_DecodeUTF8`. If " +"*consumed* is not ``NULL``, trailing incomplete UTF-8 byte sequences will " +"not be treated as an error. Those bytes will not be decoded and the number " +"of bytes that have been decoded will be stored in *consumed*." +msgstr "" +"如果 *consumed* 为 ``NULL``,则行为类似于 :c:func:`PyUnicode_DecodeUTF8`。如果 *consumed*" +" 不为 ``NULL``,则末尾的不完整 UTF-8 字节序列将不被视为错误。这些字节将不会被解码并且已被解码的字节数将存储在 *consumed* " +"中。" + +#: ../../c-api/unicode.rst:1135 +msgid "" +"Encode a Unicode object using UTF-8 and return the result as Python bytes " +"object. Error handling is \"strict\". Return ``NULL`` if an exception was " +"raised by the codec." +msgstr "" +"使用 UTF-8 编码 Unicode 对象并将结果作为 Python 字节串对象返回。错误处理方式为 \"strict\"。 " +"如果编解码器引发了异常则将返回 ``NULL``。" + +#: ../../c-api/unicode.rst:1139 ../../c-api/unicode.rst:1154 +msgid "" +"The function fails if the string contains surrogate code points (``U+D800`` " +"- ``U+DFFF``)." +msgstr "如果字符串包含代理码位 (``U+D800`` - ``U+DFFF``) 则该函数的执行将失败。" + +#: ../../c-api/unicode.rst:1145 +msgid "" +"Return a pointer to the UTF-8 encoding of the Unicode object, and store the " +"size of the encoded representation (in bytes) in *size*. The *size* " +"argument can be ``NULL``; in this case no size will be stored. The returned" +" buffer always has an extra null byte appended (not included in *size*), " +"regardless of whether there are any other null code points." +msgstr "" +"返回一个指向 Unicode 对象的 UTF-8 编码格式数据的指针,并将已编码数据的大小(以字节为单位)存储在 *size* 中。 *size* " +"参数可以为 ``NULL``;在此情况下数据的大小将不会被存储。返回的缓冲区总是会添加一个额外的空字节(不包括在 *size* " +"中),无论是否存在任何其他的空码位。" + +#: ../../c-api/unicode.rst:1151 +msgid "" +"On error, set an exception, set *size* to ``-1`` (if it's not NULL) and " +"return ``NULL``." +msgstr "发生错误时,设置一个异常,将 *size* 设为 ``-1`` (如果不为 NULL) 并返回 ``NULL``。" + +#: ../../c-api/unicode.rst:1157 +msgid "" +"This caches the UTF-8 representation of the string in the Unicode object, " +"and subsequent calls will return a pointer to the same buffer. The caller " +"is not responsible for deallocating the buffer. The buffer is deallocated " +"and pointers to it become invalid when the Unicode object is garbage " +"collected." +msgstr "" +"这将缓存 Unicode 对象中字符串的 UTF-8 表示形式,并且后续调用将返回指向同一缓存区的指针。调用方不必负责释放该缓冲区。缓冲区会在 " +"Unicode 对象被作为垃圾回收时被释放并使指向它的指针失效。" + +#: ../../c-api/unicode.rst:1164 ../../c-api/unicode.rst:1186 +msgid "The return type is now ``const char *`` rather than ``char *``." +msgstr "" + +#: ../../c-api/unicode.rst:1167 +msgid "This function is a part of the :ref:`limited API `." +msgstr "此函数是 :ref:`受限 API ` 的组成部分。" + +#: ../../c-api/unicode.rst:1173 +msgid "As :c:func:`PyUnicode_AsUTF8AndSize`, but does not store the size." +msgstr "类似于 :c:func:`PyUnicode_AsUTF8AndSize`,但不会存储大小值。" + +#: ../../c-api/unicode.rst:1177 +msgid "" +"This function does not have any special behavior for `null characters " +"`_ embedded within *unicode*. " +"As a result, strings containing null characters will remain in the returned " +"string, which some C functions might interpret as the end of the string, " +"leading to truncation. If truncation is an issue, it is recommended to use " +":c:func:`PyUnicode_AsUTF8AndSize` instead." +msgstr "" +"此函数没有任何针对嵌入 *unicode* 内部的 `空字符 " +"`_ 的特殊行为。 " +"因此,字符串中包含的空字符将保留在返回的字符串中,这在某些 C 函数中可能会被解读为字符串的结束,导致其被截断。如果截断会带来问题,建议改用 " +":c:func:`PyUnicode_AsUTF8AndSize`." + +#: ../../c-api/unicode.rst:1191 +msgid "UTF-32 Codecs" +msgstr "UTF-32 编解码器" + +#: ../../c-api/unicode.rst:1193 +msgid "These are the UTF-32 codec APIs:" +msgstr "以下是 UTF-32 编解码器 API:" + +#: ../../c-api/unicode.rst:1199 +msgid "" +"Decode *size* bytes from a UTF-32 encoded buffer string and return the " +"corresponding Unicode object. *errors* (if non-``NULL``) defines the error " +"handling. It defaults to \"strict\"." +msgstr "" +"从 UTF-32 编码的缓冲区数据解码 *size* 个字节并返回相应的 Unicode 对象。 *errors* (如果不为 ``NULL``) " +"定义了错误处理方式。默认为 \"strict\"。" + +#: ../../c-api/unicode.rst:1203 ../../c-api/unicode.rst:1253 +msgid "" +"If *byteorder* is non-``NULL``, the decoder starts decoding using the given " +"byte order::" +msgstr "如果 *byteorder* 不为 ``NULL``,解码器将使用给定的字节序进行解码::" + +#: ../../c-api/unicode.rst:1206 ../../c-api/unicode.rst:1256 +msgid "" +"*byteorder == -1: little endian\n" +"*byteorder == 0: native order\n" +"*byteorder == 1: big endian" +msgstr "" +"*byteorder == -1: little endian\n" +"*byteorder == 0: native order\n" +"*byteorder == 1: big endian" + +#: ../../c-api/unicode.rst:1210 +msgid "" +"If ``*byteorder`` is zero, and the first four bytes of the input data are a " +"byte order mark (BOM), the decoder switches to this byte order and the BOM " +"is not copied into the resulting Unicode string. If ``*byteorder`` is " +"``-1`` or ``1``, any byte order mark is copied to the output." +msgstr "" +"如果 ``*byteorder`` 为零,且输入数据的前四个字节为字节序标记 (BOM),则解码器将切换为该字节序并且 BOM 将不会被拷贝到结果 " +"Unicode 字符串中。如果 ``*byteorder`` 为 ``-1`` 或 ``1``,则字节序标记会被拷贝到输出中。" + +#: ../../c-api/unicode.rst:1215 +msgid "" +"After completion, *\\*byteorder* is set to the current byte order at the end" +" of input data." +msgstr "在完成后,*\\*byteorder* 将在输入数据的末尾被设为当前字节序。" + +#: ../../c-api/unicode.rst:1218 ../../c-api/unicode.rst:1269 +msgid "If *byteorder* is ``NULL``, the codec starts in native order mode." +msgstr "如果 *byteorder* 为 ``NULL``,编解码器将使用本机字节序。" + +#: ../../c-api/unicode.rst:1220 ../../c-api/unicode.rst:1271 +msgid "Return ``NULL`` if an exception was raised by the codec." +msgstr "如果编解码器引发了异常则返回 ``NULL``。" + +#: ../../c-api/unicode.rst:1226 +msgid "" +"If *consumed* is ``NULL``, behave like :c:func:`PyUnicode_DecodeUTF32`. If " +"*consumed* is not ``NULL``, :c:func:`PyUnicode_DecodeUTF32Stateful` will not" +" treat trailing incomplete UTF-32 byte sequences (such as a number of bytes " +"not divisible by four) as an error. Those bytes will not be decoded and the " +"number of bytes that have been decoded will be stored in *consumed*." +msgstr "" +"如果 *consumed* 为 ``NULL``,则行为类似于 :c:func:`PyUnicode_DecodeUTF32`。如果 " +"*consumed* 不为 ``NULL``,则 :c:func:`PyUnicode_DecodeUTF32Stateful` 将不把末尾的不完整 " +"UTF-32 字节序列(如字节数不可被四整除)视为错误。这些字节将不会被解码并且已被解码的字节数将存储在 *consumed* 中。" + +#: ../../c-api/unicode.rst:1235 +msgid "" +"Return a Python byte string using the UTF-32 encoding in native byte order. " +"The string always starts with a BOM mark. Error handling is \"strict\". " +"Return ``NULL`` if an exception was raised by the codec." +msgstr "" +"返回使用 UTF-32 编码格式本机字节序的 Python 字节串。字节串将总是以 BOM 标记打头。错误处理方式为 \"strict\"。 " +"如果编解码器引发了异常则返回 ``NULL``。" + +#: ../../c-api/unicode.rst:1241 +msgid "UTF-16 Codecs" +msgstr "UTF-16 编解码器" + +#: ../../c-api/unicode.rst:1243 +msgid "These are the UTF-16 codec APIs:" +msgstr "以下是 UTF-16 编解码器的 API:" + +#: ../../c-api/unicode.rst:1249 +msgid "" +"Decode *size* bytes from a UTF-16 encoded buffer string and return the " +"corresponding Unicode object. *errors* (if non-``NULL``) defines the error " +"handling. It defaults to \"strict\"." +msgstr "" +"从 UTF-16 编码的缓冲区数据解码 *size* 个字节并返回相应的 Unicode 对象。 *errors* (如果不为 ``NULL``) " +"定义了错误处理方式。默认为 \"strict\"。" + +#: ../../c-api/unicode.rst:1260 +msgid "" +"If ``*byteorder`` is zero, and the first two bytes of the input data are a " +"byte order mark (BOM), the decoder switches to this byte order and the BOM " +"is not copied into the resulting Unicode string. If ``*byteorder`` is " +"``-1`` or ``1``, any byte order mark is copied to the output (where it will " +"result in either a ``\\ufeff`` or a ``\\ufffe`` character)." +msgstr "" +"如果 ``*byteorder`` 为零,且输入数据的前两个字节为字节序标记 (BOM),则解码器将切换为该字节序并且 BOM 将不会被拷贝到结果 " +"Unicode 字符串中。如果 ``*byteorder`` 为 ``-1`` 或 ``1``,则字节序标记会被拷贝到输出中 (它将是一个 " +"``\\ufeff`` 或 ``\\ufffe`` 字符)。" + +#: ../../c-api/unicode.rst:1266 +msgid "" +"After completion, ``*byteorder`` is set to the current byte order at the end" +" of input data." +msgstr "在完成后,``*byteorder`` 将在输入数据的末尾被设为当前字节序。" + +#: ../../c-api/unicode.rst:1277 +msgid "" +"If *consumed* is ``NULL``, behave like :c:func:`PyUnicode_DecodeUTF16`. If " +"*consumed* is not ``NULL``, :c:func:`PyUnicode_DecodeUTF16Stateful` will not" +" treat trailing incomplete UTF-16 byte sequences (such as an odd number of " +"bytes or a split surrogate pair) as an error. Those bytes will not be " +"decoded and the number of bytes that have been decoded will be stored in " +"*consumed*." +msgstr "" +"如果 *consumed* 为 ``NULL``,则行为类似于 :c:func:`PyUnicode_DecodeUTF16`。如果 " +"*consumed* 不为 ``NULL``,则 :c:func:`PyUnicode_DecodeUTF16Stateful` 将不把末尾的不完整 " +"UTF-16 字节序列(如为奇数个字节或为拆分的代理对)视为错误。这些字节将不会被解码并且已被解码的字节数将存储在 *consumed* 中。" + +#: ../../c-api/unicode.rst:1286 +msgid "" +"Return a Python byte string using the UTF-16 encoding in native byte order. " +"The string always starts with a BOM mark. Error handling is \"strict\". " +"Return ``NULL`` if an exception was raised by the codec." +msgstr "" +"返回使用 UTF-16 编码格式本机字节序的 Python 字节串。字节串将总是以 BOM 标记打头。错误处理方式为 \"strict\"。 " +"如果编解码器引发了异常则返回 ``NULL``。" + +#: ../../c-api/unicode.rst:1292 +msgid "UTF-7 Codecs" +msgstr "UTF-7 编解码器" + +#: ../../c-api/unicode.rst:1294 +msgid "These are the UTF-7 codec APIs:" +msgstr "以下是 UTF-7 编解码器 API:" + +#: ../../c-api/unicode.rst:1299 +msgid "" +"Create a Unicode object by decoding *size* bytes of the UTF-7 encoded string" +" *str*. Return ``NULL`` if an exception was raised by the codec." +msgstr "" +"通过解码 UTF-7 编码的字节串 *str* 的 *size* 个字节创建一个 Unicode 对象。如果编解码器引发了异常则返回 ``NULL``." + +#: ../../c-api/unicode.rst:1306 +msgid "" +"If *consumed* is ``NULL``, behave like :c:func:`PyUnicode_DecodeUTF7`. If " +"*consumed* is not ``NULL``, trailing incomplete UTF-7 base-64 sections will " +"not be treated as an error. Those bytes will not be decoded and the number " +"of bytes that have been decoded will be stored in *consumed*." +msgstr "" +"如果 *consumed* 为 ``NULL``,则行为类似于 :c:func:`PyUnicode_DecodeUTF7`。如果 *consumed*" +" 不为 ``NULL``,则末尾的不完整 UTF-7 base-64 部分将不被视为错误。 这些字节将不会被解码并且已被解码的字节数将存储在 " +"*consumed* 中。" + +#: ../../c-api/unicode.rst:1313 +msgid "Unicode-Escape Codecs" +msgstr "Unicode-Escape 编解码器" + +#: ../../c-api/unicode.rst:1315 +msgid "These are the \"Unicode Escape\" codec APIs:" +msgstr "以下是 \"Unicode Escape\" 编解码器的 API:" + +#: ../../c-api/unicode.rst:1321 +msgid "" +"Create a Unicode object by decoding *size* bytes of the Unicode-Escape " +"encoded string *str*. Return ``NULL`` if an exception was raised by the " +"codec." +msgstr "" +"通过解码 Unicode-Escape 编码的字节串 *str* 的 *size* 个字节创建一个 Unicode 对象。如果编解码器引发了异常则返回 " +"``NULL``." + +#: ../../c-api/unicode.rst:1327 +msgid "" +"Encode a Unicode object using Unicode-Escape and return the result as a " +"bytes object. Error handling is \"strict\". Return ``NULL`` if an " +"exception was raised by the codec." +msgstr "" +"使用 Unicode-Escape 编码 Unicode 对象并将结果作为字节串对象返回。错误处理方式为 \"strict\"。 " +"如果编解码器引发了异常则将返回 ``NULL``。" + +#: ../../c-api/unicode.rst:1333 +msgid "Raw-Unicode-Escape Codecs" +msgstr "Raw-Unicode-Escape 编解码器" + +#: ../../c-api/unicode.rst:1335 +msgid "These are the \"Raw Unicode Escape\" codec APIs:" +msgstr "以下是 \"Raw Unicode Escape\" 编解码器的 API:" + +#: ../../c-api/unicode.rst:1341 +msgid "" +"Create a Unicode object by decoding *size* bytes of the Raw-Unicode-Escape " +"encoded string *str*. Return ``NULL`` if an exception was raised by the " +"codec." +msgstr "" +"通过解码 Raw-Unicode-Escape 编码的字节串 *str* 的 *size* 个字节创建一个 Unicode 对象。 " +"如果编解码器引发了异常则返回 ``NULL``。" + +#: ../../c-api/unicode.rst:1347 +msgid "" +"Encode a Unicode object using Raw-Unicode-Escape and return the result as a " +"bytes object. Error handling is \"strict\". Return ``NULL`` if an " +"exception was raised by the codec." +msgstr "" +"使用 Raw-Unicode-Escape 编码 Unicode 对象并将结果作为字节串对象返回。错误处理方式为 \"strict\"。 " +"如果编解码器引发了异常则将返回 ``NULL``。" + +#: ../../c-api/unicode.rst:1353 +msgid "Latin-1 Codecs" +msgstr "Latin-1 编解码器" + +#: ../../c-api/unicode.rst:1355 +msgid "" +"These are the Latin-1 codec APIs: Latin-1 corresponds to the first 256 " +"Unicode ordinals and only these are accepted by the codecs during encoding." +msgstr "以下是 Latin-1 编解码器的 API: Latin-1 对应于前 256 个 Unicode 码位且编码器在编码期间只接受这些码位。" + +#: ../../c-api/unicode.rst:1361 +msgid "" +"Create a Unicode object by decoding *size* bytes of the Latin-1 encoded " +"string *str*. Return ``NULL`` if an exception was raised by the codec." +msgstr "" +"通过解码 Latin-1 编码的字节串 *str* 的 *size* 个字节创建一个 Unicode 对象。如果编解码器引发了异常则返回 " +"``NULL``." + +#: ../../c-api/unicode.rst:1367 +msgid "" +"Encode a Unicode object using Latin-1 and return the result as Python bytes " +"object. Error handling is \"strict\". Return ``NULL`` if an exception was " +"raised by the codec." +msgstr "" +"使用 Latin-1 编码 Unicode 对象并将结果作为 Python 字节串对象返回。错误处理方式为 \"strict\"。 " +"如果编解码器引发了异常则将返回 ``NULL``。" + +#: ../../c-api/unicode.rst:1373 +msgid "ASCII Codecs" +msgstr "ASCII 编解码器" + +#: ../../c-api/unicode.rst:1375 +msgid "" +"These are the ASCII codec APIs. Only 7-bit ASCII data is accepted. All " +"other codes generate errors." +msgstr "以下是 ASCII 编解码器的 API。只接受 7 位 ASCII 数据。任何其他编码的数据都将导致错误。" + +#: ../../c-api/unicode.rst:1381 +msgid "" +"Create a Unicode object by decoding *size* bytes of the ASCII encoded string" +" *str*. Return ``NULL`` if an exception was raised by the codec." +msgstr "" +"通过解码 ASCII 编码的字节串 *str* 的 *size* 个字节创建一个 Unicode 对象。如果编解码器引发了异常则返回 ``NULL``." + +#: ../../c-api/unicode.rst:1387 +msgid "" +"Encode a Unicode object using ASCII and return the result as Python bytes " +"object. Error handling is \"strict\". Return ``NULL`` if an exception was " +"raised by the codec." +msgstr "" +"使用 ASCII 编码 Unicode 对象并将结果作为 Python 字节串对象返回。错误处理方式为 \"strict\"。 " +"如果编解码器引发了异常则将返回 ``NULL``。" + +#: ../../c-api/unicode.rst:1393 +msgid "Character Map Codecs" +msgstr "字符映射编解码器" + +#: ../../c-api/unicode.rst:1395 +msgid "" +"This codec is special in that it can be used to implement many different " +"codecs (and this is in fact what was done to obtain most of the standard " +"codecs included in the :mod:`!encodings` package). The codec uses mappings " +"to encode and decode characters. The mapping objects provided must support " +"the :meth:`~object.__getitem__` mapping interface; dictionaries and " +"sequences work well." +msgstr "" +"此编解码器的特殊之处在于它可被用来实现许多不同的编解码器(而且这实际上就是包括在 :mod:`!encodings` " +"包中的大部分标准编解码器的实现方式)。此编解码器使用映射来编码和解码字符。所提供的映射对象必须支持 " +":meth:`~object.__getitem__` 映射接口;字典和序列均可胜任。" + +#: ../../c-api/unicode.rst:1401 +msgid "These are the mapping codec APIs:" +msgstr "以下是映射编解码器的 API:" + +#: ../../c-api/unicode.rst:1406 +msgid "" +"Create a Unicode object by decoding *size* bytes of the encoded string *str*" +" using the given *mapping* object. Return ``NULL`` if an exception was " +"raised by the codec." +msgstr "" +"通过使用给定的 *mapping* 对象解码已编码字节串 *str* 的 *size* 个字节创建一个 Unicode 对象。 " +"如果编解码器引发了异常则返回 ``NULL``。" + +#: ../../c-api/unicode.rst:1410 +msgid "" +"If *mapping* is ``NULL``, Latin-1 decoding will be applied. Else *mapping* " +"must map bytes ordinals (integers in the range from 0 to 255) to Unicode " +"strings, integers (which are then interpreted as Unicode ordinals) or " +"``None``. Unmapped data bytes -- ones which cause a :exc:`LookupError`, as " +"well as ones which get mapped to ``None``, ``0xFFFE`` or ``'\\ufffe'``, are " +"treated as undefined mappings and cause an error." +msgstr "" +"如果 *mapping* 为 ``NULL``,则将应用 Latin-1 编码格式。否则 *mapping* 必须为字节码位值(0 至 255 " +"范围内的整数)到 Unicode 字符串的映射、整数(将被解读为 Unicode 码位)或 ``None``。未映射的数据字节 -- 这样的数据将导致 " +":exc:`LookupError`,以及被映射到 ``None`` 的数据,``0xFFFE`` 或 " +"``'\\ufffe'``,将被视为未定义的映射并导致报错。" + +#: ../../c-api/unicode.rst:1421 +msgid "" +"Encode a Unicode object using the given *mapping* object and return the " +"result as a bytes object. Error handling is \"strict\". Return ``NULL`` if" +" an exception was raised by the codec." +msgstr "" +"使用给定的 *mapping* 对象编码 Unicode 对象并将结果作为字节串对象返回。错误处理方式为 \"strict\"。 " +"如果编解码器引发了异常则将返回 ``NULL``。" + +#: ../../c-api/unicode.rst:1425 +msgid "" +"The *mapping* object must map Unicode ordinal integers to bytes objects, " +"integers in the range from 0 to 255 or ``None``. Unmapped character " +"ordinals (ones which cause a :exc:`LookupError`) as well as mapped to " +"``None`` are treated as \"undefined mapping\" and cause an error." +msgstr "" +"*mapping* 对象必须将整数 Unicode 码位映射到字节串对象、0 至 255 范围内的整数或 ``None``。未映射的字符码位(将导致 " +":exc:`LookupError` 的数据)以及映射到 ``None`` 的数据将被视为“未定义的映射”并导致报错。" + +#: ../../c-api/unicode.rst:1431 +msgid "The following codec API is special in that maps Unicode to Unicode." +msgstr "以下特殊的编解码器 API 会将 Unicode 映射至 Unicode。" + +#: ../../c-api/unicode.rst:1435 +msgid "" +"Translate a string by applying a character mapping table to it and return " +"the resulting Unicode object. Return ``NULL`` if an exception was raised by " +"the codec." +msgstr "通过应用字符映射表来转写字符串并返回结果 Unicode 对象。如果编解码器引发了异常则返回 ``NULL``。" + +#: ../../c-api/unicode.rst:1439 +msgid "" +"The mapping table must map Unicode ordinal integers to Unicode ordinal " +"integers or ``None`` (causing deletion of the character)." +msgstr "字符映射表必须将整数 Unicode 码位映射到整数 Unicode 码位或 ``None`` (这将删除相应的字符)。" + +#: ../../c-api/unicode.rst:1442 +msgid "" +"Mapping tables need only provide the :meth:`~object.__getitem__` interface; " +"dictionaries and sequences work well. Unmapped character ordinals (ones " +"which cause a :exc:`LookupError`) are left untouched and are copied as-is." +msgstr "" +"映射表只需提供 :meth:`~object.__getitem__` 接口;字典和序列均可胜任。未映射的字符码位(将导致 " +":exc:`LookupError` 的数据)将保持不变并被原样拷贝。" + +#: ../../c-api/unicode.rst:1446 +msgid "" +"*errors* has the usual meaning for codecs. It may be ``NULL`` which " +"indicates to use the default error handling." +msgstr "*errors* 具有用于编解码器的通常含义。它可以为 ``NULL`` 表示使用默认的错误处理方式。" + +#: ../../c-api/unicode.rst:1451 +msgid "MBCS codecs for Windows" +msgstr "Windows 中的 MBCS 编解码器" + +#: ../../c-api/unicode.rst:1453 +msgid "" +"These are the MBCS codec APIs. They are currently only available on Windows " +"and use the Win32 MBCS converters to implement the conversions. Note that " +"MBCS (or DBCS) is a class of encodings, not just one. The target encoding " +"is defined by the user settings on the machine running the codec." +msgstr "" +"以下是 MBCS 编解码器的 API。目前它们仅在 Windows 中可用并使用 Win32 MBCS 转换器来实现转换。请注意 MBCS(或 " +"DBCS)是一类编码格式,而非只有一个。目标编码格式是由运行编解码器的机器上的用户设置定义的。" + +#: ../../c-api/unicode.rst:1460 +msgid "" +"Create a Unicode object by decoding *size* bytes of the MBCS encoded string " +"*str*. Return ``NULL`` if an exception was raised by the codec." +msgstr "" +"通过解码 MBCS 编码的字节串 *str* 的 *size* 个字节创建一个 Unicode 对象。如果编解码器引发了异常则返回 ``NULL``。" + +#: ../../c-api/unicode.rst:1467 +msgid "" +"If *consumed* is ``NULL``, behave like :c:func:`PyUnicode_DecodeMBCS`. If " +"*consumed* is not ``NULL``, :c:func:`PyUnicode_DecodeMBCSStateful` will not " +"decode trailing lead byte and the number of bytes that have been decoded " +"will be stored in *consumed*." +msgstr "" +"如果 *consumed* 为 ``NULL``,则行为类似于 :c:func:`PyUnicode_DecodeMBCS`。如果 *consumed*" +" 不为 ``NULL``,则 :c:func:`PyUnicode_DecodeMBCSStateful` " +"将不会解码末尾的不完整字节并且已被解码的字节数将存储在 *consumed* 中。" + +#: ../../c-api/unicode.rst:1476 +msgid "" +"Similar to :c:func:`PyUnicode_DecodeMBCSStateful`, except uses the code page" +" specified by *code_page*." +msgstr "" +"类似于 :c:func:`PyUnicode_DecodeMBCSStateful`,区别在于使用由 *code_page* 所指定的代码页。" + +#: ../../c-api/unicode.rst:1482 +msgid "" +"Encode a Unicode object using MBCS and return the result as Python bytes " +"object. Error handling is \"strict\". Return ``NULL`` if an exception was " +"raised by the codec." +msgstr "" +"使用 MBCS 编码 Unicode 对象并将结果作为 Python 字节串对象返回。错误处理方式为 \"strict\"。 " +"如果编解码器引发了异常则将返回 ``NULL``。" + +#: ../../c-api/unicode.rst:1489 +msgid "" +"Encode the Unicode object using the specified code page and return a Python " +"bytes object. Return ``NULL`` if an exception was raised by the codec. Use " +":c:macro:`!CP_ACP` code page to get the MBCS encoder." +msgstr "" +"使用指定的代码页编码 Unicode 对象并返回一个 Python 字节串对象。如果编解码器引发了异常则返回 ``NULL``。使用 " +":c:macro:`!CP_ACP` 代码页来获取 MBCS 编码器。" + +#: ../../c-api/unicode.rst:1499 +msgid "Methods and Slot Functions" +msgstr "方法与槽位函数" + +#: ../../c-api/unicode.rst:1501 +msgid "" +"The following APIs are capable of handling Unicode objects and strings on " +"input (we refer to them as strings in the descriptions) and return Unicode " +"objects or integers as appropriate." +msgstr "以下 API 可以处理输入的 Unicode 对象和字符串(在描述中我们称其为字符串)并返回适当的 Unicode 对象或整数值。" + +#: ../../c-api/unicode.rst:1505 +msgid "They all return ``NULL`` or ``-1`` if an exception occurs." +msgstr "如果发生异常它们都将返回 ``NULL`` 或 ``-1``。" + +#: ../../c-api/unicode.rst:1510 +msgid "Concat two strings giving a new Unicode string." +msgstr "拼接两个字符串得到一个新的 Unicode 字符串。" + +#: ../../c-api/unicode.rst:1515 +msgid "" +"Split a string giving a list of Unicode strings. If *sep* is ``NULL``, " +"splitting will be done at all whitespace substrings. Otherwise, splits " +"occur at the given separator. At most *maxsplit* splits will be done. If " +"negative, no limit is set. Separators are not included in the resulting " +"list." +msgstr "" +"拆分一个字符串得到一个 Unicode 字符串的列表。如果 *sep* 为 ``NULL``,则将根据空格来拆分所有子字符串。 " +"否则,将根据指定的分隔符来拆分。最多拆分数为 *maxsplit*。如为负值,则没有限制。分隔符不包括在结果列表中。" + +#: ../../c-api/unicode.rst:1520 ../../c-api/unicode.rst:1530 +#: ../../c-api/unicode.rst:1551 ../../c-api/unicode.rst:1564 +msgid "On error, return ``NULL`` with an exception set." +msgstr "当失败时,将返回 ``NULL`` 并设置一个异常。" + +#: ../../c-api/unicode.rst:1522 +msgid "Equivalent to :py:meth:`str.split`." +msgstr "等价于 :py:meth:`str.split`。" + +#: ../../c-api/unicode.rst:1527 +msgid "" +"Similar to :c:func:`PyUnicode_Split`, but splitting will be done beginning " +"at the end of the string." +msgstr "类似于 :c:func:`PyUnicode_Split`,但拆分将从字符串末尾开始进行。" + +#: ../../c-api/unicode.rst:1532 +msgid "Equivalent to :py:meth:`str.rsplit`." +msgstr "等价于 :py:meth:`str.rsplit`。" + +#: ../../c-api/unicode.rst:1537 +msgid "" +"Split a Unicode string at line breaks, returning a list of Unicode strings. " +"CRLF is considered to be one line break. If *keepends* is ``0``, the Line " +"break characters are not included in the resulting strings." +msgstr "" +"根据分行符来拆分 Unicode 字符串,返回一个 Unicode 字符串的列表。CRLF 将被视为一个分行符。如果 *keepends* 为 " +"``0``,则行分隔符将不包括在结果字符串中。" + +#: ../../c-api/unicode.rst:1544 +msgid "" +"Split a Unicode string at the first occurrence of *sep*, and return a " +"3-tuple containing the part before the separator, the separator itself, and " +"the part after the separator. If the separator is not found, return a " +"3-tuple containing the string itself, followed by two empty strings." +msgstr "" +"在 *sep* 首次出现的位置拆分 Unicode 字符串,并返回一个包含分隔符之前部分、分隔符本身,以及分隔符之后部分的 3 元组。 " +"如果分隔符未找到,则返回一个包含字符串本身,后面附带两个空字符串的 3 元组。" + +#: ../../c-api/unicode.rst:1549 ../../c-api/unicode.rst:1562 +msgid "*sep* must not be empty." +msgstr "*sep* 必须不为空。" + +#: ../../c-api/unicode.rst:1553 +msgid "Equivalent to :py:meth:`str.partition`." +msgstr "等价于 :py:meth:`str.partition`。" + +#: ../../c-api/unicode.rst:1558 +msgid "" +"Similar to :c:func:`PyUnicode_Partition`, but split a Unicode string at the " +"last occurrence of *sep*. If the separator is not found, return a 3-tuple " +"containing two empty strings, followed by the string itself." +msgstr "" +"类似于 :c:func:`PyUnicode_Partition`,但会在 *sep* 最后一次出现的位置拆分 Unicode 字符串。 " +"如果分隔符未找到,则返回一个包含两个空字符串,后面附带字符串本身的 3 元组。" + +#: ../../c-api/unicode.rst:1566 +msgid "Equivalent to :py:meth:`str.rpartition`." +msgstr "等价于 :py:meth:`str.rpartition`。" + +#: ../../c-api/unicode.rst:1571 +msgid "" +"Join a sequence of strings using the given *separator* and return the " +"resulting Unicode string." +msgstr "使用给定的 *separator* 合并一个字符串列表并返回结果 Unicode 字符串。" + +#: ../../c-api/unicode.rst:1578 +msgid "" +"Return ``1`` if *substr* matches ``unicode[start:end]`` at the given tail " +"end (*direction* == ``-1`` means to do a prefix match, *direction* == ``1`` " +"a suffix match), ``0`` otherwise. Return ``-1`` if an error occurred." +msgstr "" +"如果 *substr* 在给定的端点 (*direction* == ``-1`` 表示前缀匹配,*direction* == ``1`` " +"表示后缀匹配) 与 ``unicode[start:end]`` 相匹配则返回 ``1``,否则返回 ``0``。如果发生错误则返回 ``-1``。" + +#: ../../c-api/unicode.rst:1586 +msgid "" +"Return the first position of *substr* in ``unicode[start:end]`` using the " +"given *direction* (*direction* == ``1`` means to do a forward search, " +"*direction* == ``-1`` a backward search). The return value is the index of " +"the first match; a value of ``-1`` indicates that no match was found, and " +"``-2`` indicates that an error occurred and an exception has been set." +msgstr "" +"返回使用给定的 *direction* (*direction* == ``1`` 表示前向搜索,*direction* == ``-1`` " +"表示后向搜索) 时 *substr* 在 ``unicode[start:end]`` 中首次出现的位置。返回值为首个匹配的索引号;值为 ``-1`` " +"表示未找到匹配,``-2`` 则表示发生了错误并设置了异常。" + +#: ../../c-api/unicode.rst:1596 +msgid "" +"Return the first position of the character *ch* in ``unicode[start:end]`` " +"using the given *direction* (*direction* == ``1`` means to do a forward " +"search, *direction* == ``-1`` a backward search). The return value is the " +"index of the first match; a value of ``-1`` indicates that no match was " +"found, and ``-2`` indicates that an error occurred and an exception has been" +" set." +msgstr "" +"返回使用给定的 *direction* (*direction* == ``1`` 表示前向搜索,*direction* == ``-1`` " +"表示后向搜索) 时字符 *ch* 在 ``unicode[start:end]`` 中首次出现的位置。返回值为首个匹配的索引号;值为 ``-1`` " +"表示未找到匹配,``-2`` 则表示发生错误并设置了异常。" + +#: ../../c-api/unicode.rst:1604 +msgid "" +"*start* and *end* are now adjusted to behave like ``unicode[start:end]``." +msgstr "现在 *start* 和 *end* 被调整为与 ``unicode[start:end]`` 类似的行为。" + +#: ../../c-api/unicode.rst:1611 +msgid "" +"Return the number of non-overlapping occurrences of *substr* in " +"``unicode[start:end]``. Return ``-1`` if an error occurred." +msgstr "返回 *substr* 在 ``unicode[start:end]`` 中不重叠出现的次数。如果发生错误则返回 ``-1``。" + +#: ../../c-api/unicode.rst:1618 +msgid "" +"Replace at most *maxcount* occurrences of *substr* in *unicode* with " +"*replstr* and return the resulting Unicode object. *maxcount* == ``-1`` " +"means replace all occurrences." +msgstr "" +"将 *unicode* 中 *substr* 替换为 *replstr* 至多 *maxcount* 次并返回结果 Unicode 对象。 " +"*maxcount* == ``-1`` 表示全部替换。" + +#: ../../c-api/unicode.rst:1625 +msgid "" +"Compare two strings and return ``-1``, ``0``, ``1`` for less than, equal, " +"and greater than, respectively." +msgstr "比较两个字符串并返回 ``-1``, ``0``, ``1`` 分别表示小于、等于和大于。" + +#: ../../c-api/unicode.rst:1628 +msgid "" +"This function returns ``-1`` upon failure, so one should call " +":c:func:`PyErr_Occurred` to check for errors." +msgstr "此函数执行失败时返回 ``-1``,因此应当调用 :c:func:`PyErr_Occurred` 来检查错误。" + +#: ../../c-api/unicode.rst:1633 +msgid "The :c:func:`PyUnicode_Equal` function." +msgstr ":c:func:`PyUnicode_Equal` 函数。" + +#: ../../c-api/unicode.rst:1638 +msgid "Test if two strings are equal:" +msgstr "测试两个字符串是否相等:" + +#: ../../c-api/unicode.rst:1640 +msgid "Return ``1`` if *a* is equal to *b*." +msgstr "如果 *a* 等于 *b* 则返回 ``1``。" + +#: ../../c-api/unicode.rst:1641 +msgid "Return ``0`` if *a* is not equal to *b*." +msgstr "如果 *a* 不等于 *b* 则返回 ``0``。" + +#: ../../c-api/unicode.rst:1642 +msgid "" +"Set a :exc:`TypeError` exception and return ``-1`` if *a* or *b* is not a " +":class:`str` object." +msgstr "如果 *a* 或 *b* 不是 :class:`str` 对象则设置一个 :exc:`TypeError` 异常并返回 ``-1``。" + +#: ../../c-api/unicode.rst:1645 +msgid "The function always succeeds if *a* and *b* are :class:`str` objects." +msgstr "如果 *a* 和 *b* 均为 :class:`str` 对象则该函数必定成功执行。" + +#: ../../c-api/unicode.rst:1647 +msgid "" +"The function works for :class:`str` subclasses, but does not honor custom " +"``__eq__()`` method." +msgstr "该函数适用于 :class:`str` 的子类,但不会使用自定义的 ``__eq__()`` 方法。" + +#: ../../c-api/unicode.rst:1652 +msgid "The :c:func:`PyUnicode_Compare` function." +msgstr ":c:func:`PyUnicode_Compare` 函数。" + +#: ../../c-api/unicode.rst:1659 +msgid "" +"Compare a Unicode object with a char buffer which is interpreted as being " +"UTF-8 or ASCII encoded and return true (``1``) if they are equal, or false " +"(``0``) otherwise. If the Unicode object contains surrogate code points " +"(``U+D800`` - ``U+DFFF``) or the C string is not valid UTF-8, false (``0``) " +"is returned." +msgstr "" +"将一个 Unicode 对象与一个按 UTF-8 或 ASCII 编码来解读的字符缓冲区进行比较并在两者相等时返回真值 (``1``),否则返回假值 " +"(``0``)。如果 Unicode 对象包含代理码位 (``U+D800`` - ``U+DFFF``) 或者如果 C 字符串不是有效的 UTF-8 " +"编码,则返回假值 (``0``)。" + +#: ../../c-api/unicode.rst:1666 ../../c-api/unicode.rst:1687 +msgid "This function does not raise exceptions." +msgstr "此函数不会引发异常。" + +#: ../../c-api/unicode.rst:1673 +msgid "" +"Similar to :c:func:`PyUnicode_EqualToUTF8AndSize`, but compute *string* " +"length using :c:func:`!strlen`. If the Unicode object contains null " +"characters, false (``0``) is returned." +msgstr "" +"类似于 :c:func:`PyUnicode_EqualToUTF8AndSize`,但会使用 :c:func:`!strlen` 来计算 " +"*string* 的长度。如果 Unicode 对象包含空字符,则返回假值 (``0``)。" + +#: ../../c-api/unicode.rst:1682 +msgid "" +"Compare a Unicode object, *unicode*, with *string* and return ``-1``, ``0``," +" ``1`` for less than, equal, and greater than, respectively. It is best to " +"pass only ASCII-encoded strings, but the function interprets the input " +"string as ISO-8859-1 if it contains non-ASCII characters." +msgstr "" +"将 Unicode 对象 *unicode* 与 *string* 进行比较并返回 ``-1``, ``0``, ``1`` 分别表示小于、等于和大于。" +" 最好只传入 ASCII 编码的字符串,但如果输入字符串包含非 ASCII 字符则此函数会将其按 ISO-8859-1 编码格式来解读。" + +#: ../../c-api/unicode.rst:1692 +msgid "Rich compare two Unicode strings and return one of the following:" +msgstr "对两个 Unicode 字符串执行富比较并返回以下值之一:" + +#: ../../c-api/unicode.rst:1694 +msgid "``NULL`` in case an exception was raised" +msgstr "``NULL`` 用于引发了异常的情况" + +#: ../../c-api/unicode.rst:1695 +msgid ":c:data:`Py_True` or :c:data:`Py_False` for successful comparisons" +msgstr ":c:data:`Py_True` 或 :c:data:`Py_False` 用于成功完成比较的情况" + +#: ../../c-api/unicode.rst:1696 +msgid ":c:data:`Py_NotImplemented` in case the type combination is unknown" +msgstr ":c:data:`Py_NotImplemented` 用于类型组合未知的情况" + +#: ../../c-api/unicode.rst:1698 +msgid "" +"Possible values for *op* are :c:macro:`Py_GT`, :c:macro:`Py_GE`, " +":c:macro:`Py_EQ`, :c:macro:`Py_NE`, :c:macro:`Py_LT`, and :c:macro:`Py_LE`." +msgstr "" +"可能的 *op* 值有 :c:macro:`Py_GT`, :c:macro:`Py_GE`, :c:macro:`Py_EQ`, " +":c:macro:`Py_NE`, :c:macro:`Py_LT`, 和 :c:macro:`Py_LE`。" + +#: ../../c-api/unicode.rst:1704 +msgid "" +"Return a new string object from *format* and *args*; this is analogous to " +"``format % args``." +msgstr "根据 *format* 和 *args* 返回一个新的字符串对象;这等同于 ``format % args``。" + +#: ../../c-api/unicode.rst:1710 +msgid "" +"Check whether *substr* is contained in *unicode* and return true or false " +"accordingly." +msgstr "检查 *substr* 是否包含在 *unicode* 中并相应返回真值或假值。" + +#: ../../c-api/unicode.rst:1713 +msgid "" +"*substr* has to coerce to a one element Unicode string. ``-1`` is returned " +"if there was an error." +msgstr "*substr* 必须强制转为一个单元素 Unicode 字符串。如果发生错误则返回 ``-1``。" + +#: ../../c-api/unicode.rst:1719 +msgid "" +"Intern the argument :c:expr:`*p_unicode` in place. The argument must be the" +" address of a pointer variable pointing to a Python Unicode string object. " +"If there is an existing interned string that is the same as " +":c:expr:`*p_unicode`, it sets :c:expr:`*p_unicode` to it (releasing the " +"reference to the old string object and creating a new :term:`strong " +"reference` to the interned string object), otherwise it leaves " +":c:expr:`*p_unicode` alone and interns it." +msgstr "" +"原地内部化参数 :c:expr:`*p_unicode`。该参数必须是一个指向 Python Unicode 字符串对象的指针变量的地址。 如果已存在与" +" :c:expr:`*p_unicode` 相同的内部化字符串,则将其设为 :c:expr:`*p_unicode` " +"(释放对旧字符串的引用并新建一个指向该内部化字符串对象的 :term:`strong reference`),否则将保持 " +":c:expr:`*p_unicode` 不变并将其内部化。" + +#: ../../c-api/unicode.rst:1726 +msgid "" +"(Clarification: even though there is a lot of talk about references, think " +"of this function as reference-neutral. You must own the object you pass in; " +"after the call you no longer own the passed-in reference, but you newly own " +"the result.)" +msgstr "" +"(澄清说明:虽然这里大量提及了引用,但请将此函数视为引用无关的。你必须拥有你传入的对象;在调用之后你将不再拥有传入的引用,但你将新拥有结果对象。)" + +#: ../../c-api/unicode.rst:1731 +msgid "" +"This function never raises an exception. On error, it leaves its argument " +"unchanged without interning it." +msgstr "此函数绝不会引发异常。在发生错误时,它将保持其参数不变而不会将其内部化。" + +#: ../../c-api/unicode.rst:1734 +msgid "" +"Instances of subclasses of :py:class:`str` may not be interned, that is, " +":c:expr:`PyUnicode_CheckExact(*p_unicode)` must be true. If it is not, then " +"-- as with any other error -- the argument is left unchanged." +msgstr "" +":py:class:`str` 的子类的实例不可被内部化,也就是说,:c:expr:`PyUnicode_CheckExact(*p_unicode)`" +" 必须为真值。如果其不为真值,那么 -- 就像发生其他错误时一样 -- 该参数将保持不变。" + +#: ../../c-api/unicode.rst:1738 +msgid "" +"Note that interned strings are not “immortal”. You must keep a reference to " +"the result to benefit from interning." +msgstr "请注意被内部化的字符串不是“永生的”。你必须保留对结果的引用才能从内部化获益。" + +#: ../../c-api/unicode.rst:1744 +msgid "" +"A combination of :c:func:`PyUnicode_FromString` and " +":c:func:`PyUnicode_InternInPlace`, meant for statically allocated strings." +msgstr "" +":c:func:`PyUnicode_FromString` 和 :c:func:`PyUnicode_InternInPlace` " +"的结合,用于静态分配的字符串。" + +#: ../../c-api/unicode.rst:1747 +msgid "" +"Return a new (\"owned\") reference to either a new Unicode string object " +"that has been interned, or an earlier interned string object with the same " +"value." +msgstr "返回一个新的(“拥有的”)引用,它指向一个已被内部化的新 Unicode 字符串,或一个具有相同值的先前已被内部化的字符串对象。" + +#: ../../c-api/unicode.rst:1751 +msgid "" +"Python may keep a reference to the result, or make it :term:`immortal`, " +"preventing it from being garbage-collected promptly. For interning an " +"unbounded number of different strings, such as ones coming from user input, " +"prefer calling :c:func:`PyUnicode_FromString` and " +":c:func:`PyUnicode_InternInPlace` directly." +msgstr "" +"Python 可以保留一个指向结果的引用,或是使其成为 :term:`immortal` 对象,以防止其被立即被作为垃圾回收。 " +"对于内部化未限定数量的不同字符串,例如来自用户输入的字符串,建议直接调用 :c:func:`PyUnicode_FromString` 和 " +":c:func:`PyUnicode_InternInPlace`." + +#: ../../c-api/unicode.rst:1760 +msgid "" +"Return a non-zero value if *str* is interned, zero if not. The *str* " +"argument must be a string; this is not checked. This function always " +"succeeds." +msgstr "" +"若 *str* 为驻留字符串则返回非零值,否则返回零。注意:*str* 参数必须是字符串对象(本函数不会进行该检查),且该函数始终执行成功。" + +#: ../../c-api/unicode.rst:1766 +msgid "" +"A non-zero return value may carry additional information about *how* the " +"string is interned. The meaning of such non-zero values, as well as each " +"specific string's intern-related details, may change between CPython " +"versions." +msgstr "" +"非零返回值可能包含关于字符串 *如何* 被驻留的附加信息。需注意:此类非零值的具体含义,以及每个特定字符串的驻留相关细节,可能随 CPython " +"版本更迭而变化。" + +#: ../../c-api/unicode.rst:1773 +msgid "PyUnicodeWriter" +msgstr "PyUnicodeWriter" + +#: ../../c-api/unicode.rst:1775 +msgid "" +"The :c:type:`PyUnicodeWriter` API can be used to create a Python " +":class:`str` object." +msgstr ":c:type:`PyUnicodeWriter` API 可用于创建 Python :class:`str` 对象。" + +#: ../../c-api/unicode.rst:1782 +msgid "A Unicode writer instance." +msgstr "Unicode 写入器实例。" + +#: ../../c-api/unicode.rst:1784 +msgid "" +"The instance must be destroyed by :c:func:`PyUnicodeWriter_Finish` on " +"success, or :c:func:`PyUnicodeWriter_Discard` on error." +msgstr "" +"该实例在操作成功时必须通过 :c:func:`PyUnicodeWriter_Finish` 销毁,若出现错误则需使用 " +":c:func:`PyUnicodeWriter_Discard` 处理。" + +#: ../../c-api/unicode.rst:1789 +msgid "Create a Unicode writer instance." +msgstr "创建一个 Unicode 写入器实例。" + +#: ../../c-api/unicode.rst:1791 +msgid "*length* must be greater than or equal to ``0``." +msgstr "*length* 必须大于或等于 ``0``。" + +#: ../../c-api/unicode.rst:1793 +msgid "" +"If *length* is greater than ``0``, preallocate an internal buffer of " +"*length* characters." +msgstr "若 *length* 大于 ``0``,则预分配一个可容纳 *length* 个字符的内部缓冲区。" + +#: ../../c-api/unicode.rst:1796 ../../c-api/unicode.rst:1802 +msgid "Set an exception and return ``NULL`` on error." +msgstr "出错时设置一个异常并返回 ``NULL``。" + +#: ../../c-api/unicode.rst:1800 +msgid "" +"Return the final Python :class:`str` object and destroy the writer instance." +msgstr "返回最终的 Python :class:`str` 对象并销毁写入器实例。" + +#: ../../c-api/unicode.rst:1804 ../../c-api/unicode.rst:1812 +msgid "The writer instance is invalid after this call." +msgstr "调用完成后该写入器实例即失效。" + +#: ../../c-api/unicode.rst:1808 +msgid "Discard the internal Unicode buffer and destroy the writer instance." +msgstr "丢弃内部 Unicode 缓冲区并销毁写入器实例。" + +#: ../../c-api/unicode.rst:1810 +msgid "If *writer* is ``NULL``, no operation is performed." +msgstr "如果 *writer* 为 ``NULL``,则不执行任何操作。" + +#: ../../c-api/unicode.rst:1816 +msgid "Write the single Unicode character *ch* into *writer*." +msgstr "将单个 Unicode 字符 *ch* 写入 *writer*。" + +#: ../../c-api/unicode.rst:1818 ../../c-api/unicode.rst:1828 +#: ../../c-api/unicode.rst:1843 ../../c-api/unicode.rst:1853 +#: ../../c-api/unicode.rst:1862 ../../c-api/unicode.rst:1869 +#: ../../c-api/unicode.rst:1882 ../../c-api/unicode.rst:1897 +#: ../../c-api/unicode.rst:1904 ../../c-api/unicode.rst:1923 +msgid "" +"On success, return ``0``. On error, set an exception, leave the writer " +"unchanged, and return ``-1``." +msgstr "成功时返回 ``0``;出错时设置异常、保持写入器状态不变并返回 ``-1``。" + +#: ../../c-api/unicode.rst:1823 +msgid "" +"Decode the string *str* from UTF-8 in strict mode and write the output into " +"*writer*." +msgstr "以严格模式将字符串 *str* 从 UTF-8 解码,并将输出写入 *writer*。" + +#: ../../c-api/unicode.rst:1825 ../../c-api/unicode.rst:1837 +#: ../../c-api/unicode.rst:1912 +msgid "" +"*size* is the string length in bytes. If *size* is equal to ``-1``, call " +"``strlen(str)`` to get the string length." +msgstr "*size* 表示字符串的字节长度。若 *size* 等于 ``-1``,则调用 ``strlen(str)`` 获取字符串长度。" + +#: ../../c-api/unicode.rst:1831 +msgid "See also :c:func:`PyUnicodeWriter_DecodeUTF8Stateful`." +msgstr "另请参阅 :c:func:`PyUnicodeWriter_DecodeUTF8Stateful`。" + +#: ../../c-api/unicode.rst:1835 +msgid "Write the ASCII string *str* into *writer*." +msgstr "将 ASCII 字符串 *str* 写入 *writer*。" + +#: ../../c-api/unicode.rst:1840 +msgid "" +"*str* must only contain ASCII characters. The behavior is undefined if *str*" +" contains non-ASCII characters." +msgstr "*str* 必须仅包含 ASCII 字符,若存在非 ASCII 字符则行为未定义。" + +#: ../../c-api/unicode.rst:1848 +msgid "Write the wide string *str* into *writer*." +msgstr "将宽字符串 *str* 写入 *writer*。" + +#: ../../c-api/unicode.rst:1850 +msgid "" +"*size* is a number of wide characters. If *size* is equal to ``-1``, call " +"``wcslen(str)`` to get the string length." +msgstr "*size* 表示宽字符的数量。若 *size* 等于 ``-1``,则调用 ``wcslen(str)`` 获取字符串长度。" + +#: ../../c-api/unicode.rst:1858 +msgid "Writer the UCS4 string *str* into *writer*." +msgstr "将 UCS4 字符串 *str* 写入 *writer*。" + +#: ../../c-api/unicode.rst:1860 +msgid "*size* is a number of UCS4 characters." +msgstr "*size* 表示 UCS4 字符的数量。" + +#: ../../c-api/unicode.rst:1867 +msgid "" +"Call :c:func:`PyObject_Str` on *obj* and write the output into *writer*." +msgstr "对 *obj* 调用 :c:func:`PyObject_Str` 并将输出写入 *writer*。" + +#: ../../c-api/unicode.rst:1872 +msgid "" +"To write a :class:`str` subclass which overrides the :meth:`~object.__str__`" +" method, :c:func:`PyUnicode_FromObject` can be used to get the original " +"string." +msgstr "" +"要编写一个重写 :meth:`~object.__str__` 方法的 :class:`str` 子类,可以使用 " +":c:func:`PyUnicode_FromObject` 来获取原字符串。" + +#: ../../c-api/unicode.rst:1878 +msgid "" +"Call :c:func:`PyObject_Repr` on *obj* and write the output into *writer*." +msgstr "对 *obj* 调用 :c:func:`PyObject_Repr` 并将输出写入 *writer*。" + +#: ../../c-api/unicode.rst:1880 +msgid "If *obj* is ``NULL``, write the string ``\"\"`` into *writer*." +msgstr "如果 *obj* 为 ``NULL``,则将字符串 ``\"\"`` 写入 *writer*。" + +#: ../../c-api/unicode.rst:1887 +msgid "Added support for ``NULL``." +msgstr "增加了对 ``NULL`` 的支持。" + +#: ../../c-api/unicode.rst:1891 +msgid "Write the substring ``str[start:end]`` into *writer*." +msgstr "将子字符串 ``str[start:end]`` 写入 *writer*。" + +#: ../../c-api/unicode.rst:1893 +msgid "" +"*str* must be Python :class:`str` object. *start* must be greater than or " +"equal to 0, and less than or equal to *end*. *end* must be less than or " +"equal to *str* length." +msgstr "" +"*str* 必须是 Python :class:`str` 对象。*start* 需大于等于 0 且小于等于 *end*,而 *end* 不得超过 " +"*str* 的长度。" + +#: ../../c-api/unicode.rst:1902 +msgid "" +"Similar to :c:func:`PyUnicode_FromFormat`, but write the output directly " +"into *writer*." +msgstr "功能类似 :c:func:`PyUnicode_FromFormat`,但直接将输出写入 *writer*。" + +#: ../../c-api/unicode.rst:1909 +msgid "" +"Decode the string *str* from UTF-8 with *errors* error handler and write the" +" output into *writer*." +msgstr "使用 *errors* 错误处理程序将字符串 *str* 从 UTF-8 解码,并将输出写入 *writer*。" + +#: ../../c-api/unicode.rst:1915 +msgid "" +"*errors* is an :ref:`error handler ` name, such as " +"``\"replace\"``. If *errors* is ``NULL``, use the strict error handler." +msgstr "" +"*errors* 为 :ref:`错误处理程序 ` 名称 (例如 ``\"replace\"``)。 若 " +"*errors* 为 ``NULL``,则使用严格错误处理程序。" + +#: ../../c-api/unicode.rst:1918 +msgid "" +"If *consumed* is not ``NULL``, set *\\*consumed* to the number of decoded " +"bytes on success. If *consumed* is ``NULL``, treat trailing incomplete UTF-8" +" byte sequences as an error." +msgstr "" +"若 *consumed* 不为 ``NULL``,则在成功时将 *\\*consumed* 设为已解码的字节数;若为 ``NULL``,则将末尾不完整的" +" UTF-8 字节序列视为错误。" + +#: ../../c-api/unicode.rst:1926 +msgid "See also :c:func:`PyUnicodeWriter_WriteUTF8`." +msgstr "另请参阅 :c:func:`PyUnicodeWriter_WriteUTF8`。" + +#: ../../c-api/unicode.rst:1929 +msgid "Deprecated API" +msgstr "已弃用的 API" + +#: ../../c-api/unicode.rst:1931 +msgid "The following API is deprecated." +msgstr "以下 API 已被弃用。" + +#: ../../c-api/unicode.rst:1935 +msgid "" +"This is a typedef of :c:type:`wchar_t`, which is a 16-bit type or 32-bit " +"type depending on the platform. Please use :c:type:`wchar_t` directly " +"instead." +msgstr "" +"此类型为 :c:type:`wchar_t` 的别名,其实际为 16 位或 32 位类型(取决于平台)。请直接使用 :c:type:`wchar_t` " +"类型。" + +#: ../../c-api/unicode.rst:1939 +msgid "" +"In previous versions, this was a 16-bit type or a 32-bit type depending on " +"whether you selected a \"narrow\" or \"wide\" Unicode version of Python at " +"build time." +msgstr "在以前的版本中,这是 16 位类型还是 32 位类型,这取决于您在构建时选择的是“窄”还是“宽”Unicode 版本的 Python。" + +#: ../../c-api/unicode.rst:1949 +msgid "" +"Do nothing and return ``0``. This API is kept only for backward " +"compatibility, but there are no plans to remove it." +msgstr "不做任何事并返回 ``0``。此 API 仅为向下兼容而保留,但还没有移除它的计划。" + +#: ../../c-api/unicode.rst:1955 +msgid "" +"This API does nothing since Python 3.12. Previously, this needed to be " +"called for each string created using the old API " +"(:c:func:`!PyUnicode_FromUnicode` or similar)." +msgstr "" +"该 API 自 Python 3.12 起已成为空操作。此前版本中,使用旧 API(如 :c:func:`!PyUnicode_FromUnicode`" +" 等)创建字符串时需调用此接口。" + +#: ../../c-api/unicode.rst:1963 +msgid "" +"Do nothing and return ``1``. This API is kept only for backward " +"compatibility, but there are no plans to remove it." +msgstr "不做任何事并返回 ``1``。此 API 仅为向下兼容而保留,但还没有移除它的计划。" + +#: ../../c-api/unicode.rst:1969 +msgid "" +"This API does nothing since Python 3.12. Previously, this could be called to" +" check if :c:func:`PyUnicode_READY` is necessary." +msgstr "" +"此 API 自 Python 3.12 起不再做任何事。在之前版本中,它可被调用以检查 :c:func:`PyUnicode_READY` 是否必要。" diff --git a/c-api/utilities.po b/c-api/utilities.po new file mode 100644 index 0000000000..98dd50a129 --- /dev/null +++ b/c-api/utilities.po @@ -0,0 +1,36 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/utilities.rst:7 +msgid "Utilities" +msgstr "工具" + +#: ../../c-api/utilities.rst:9 +msgid "" +"The functions in this chapter perform various utility tasks, ranging from " +"helping C code be more portable across platforms, using Python modules from " +"C, and parsing function arguments and constructing Python values from C " +"values." +msgstr "" +"本章中的函数执行各种实用工具任务,包括帮助 C 代码提升跨平台可移植性,在 C 中使用 Python 模块,以及解析函数参数并根据 C 中的值构建 " +"Python 中的值等等。" diff --git a/c-api/veryhigh.po b/c-api/veryhigh.po new file mode 100644 index 0000000000..e4fa4f5996 --- /dev/null +++ b/c-api/veryhigh.po @@ -0,0 +1,578 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:16+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/veryhigh.rst:8 +msgid "The Very High Level Layer" +msgstr "极高层级 API" + +#: ../../c-api/veryhigh.rst:10 +msgid "" +"The functions in this chapter will let you execute Python source code given " +"in a file or a buffer, but they will not let you interact in a more detailed" +" way with the interpreter." +msgstr "本章节的函数将允许你执行在文件或缓冲区中提供的 Python 源代码,但它们将不允许你以更细节化的方式与解释器进行交互。" + +#: ../../c-api/veryhigh.rst:14 +msgid "" +"Several of these functions accept a start symbol from the grammar as a " +"parameter. The available start symbols are :c:data:`Py_eval_input`, " +":c:data:`Py_file_input`, :c:data:`Py_single_input`, and " +":c:data:`Py_func_type_input`. These are described following the functions " +"which accept them as parameters." +msgstr "" +"这些函数中有几个可以接受特定的语法起始符号作为形参。可用的起始符号有 :c:data:`Py_eval_input`, " +":c:data:`Py_file_input`, :c:data:`Py_single_input` 和 " +":c:data:`Py_func_type_input`。这些符号会在接受它们作为形参的函数中加以说明。" + +#: ../../c-api/veryhigh.rst:20 +msgid "" +"Note also that several of these functions take :c:expr:`FILE*` parameters. " +"One particular issue which needs to be handled carefully is that the " +":c:type:`FILE` structure for different C libraries can be different and " +"incompatible. Under Windows (at least), it is possible for dynamically " +"linked extensions to actually use different libraries, so care should be " +"taken that :c:expr:`FILE*` parameters are only passed to these functions if " +"it is certain that they were created by the same library that the Python " +"runtime is using." +msgstr "" +"还要注意这些函数中有几个可以接受 :c:expr:`FILE*` 形参。有一个需要小心处理的特别问题是针对不同 C 库的 :c:type:`FILE` " +"结构体可能是不相同且不兼容的。 (至少是)在 Windows 中,动态链接的扩展实际上有可能会使用不同的库,所以应当特别注意只有在确定这些函数是由 " +"Python 运行时所使用的相同的库创建的情况下才将 :c:expr:`FILE*` 形参传给它们。" + +#: ../../c-api/veryhigh.rst:31 +msgid "" +"This is a simplified interface to :c:func:`PyRun_AnyFileExFlags` below, " +"leaving *closeit* set to ``0`` and *flags* set to ``NULL``." +msgstr "" +"这是针对下面 :c:func:`PyRun_AnyFileExFlags` 的简化版接口,将 *closeit* 设为 ``0`` 而将 *flags*" +" 设为 ``NULL``。" + +#: ../../c-api/veryhigh.rst:37 +msgid "" +"This is a simplified interface to :c:func:`PyRun_AnyFileExFlags` below, " +"leaving the *closeit* argument set to ``0``." +msgstr "这是针对下面 :c:func:`PyRun_AnyFileExFlags` 的简化版接口,将 *closeit* 参数设为 ``0``。" + +#: ../../c-api/veryhigh.rst:43 +msgid "" +"This is a simplified interface to :c:func:`PyRun_AnyFileExFlags` below, " +"leaving the *flags* argument set to ``NULL``." +msgstr "这是针对下面 :c:func:`PyRun_AnyFileExFlags` 的简化版接口,将 *flags* 参数设为 ``NULL``。" + +#: ../../c-api/veryhigh.rst:49 +msgid "" +"If *fp* refers to a file associated with an interactive device (console or " +"terminal input or Unix pseudo-terminal), return the value of " +":c:func:`PyRun_InteractiveLoop`, otherwise return the result of " +":c:func:`PyRun_SimpleFile`. *filename* is decoded from the filesystem " +"encoding (:func:`sys.getfilesystemencoding`). If *filename* is ``NULL``, " +"this function uses ``\"???\"`` as the filename. If *closeit* is true, the " +"file is closed before ``PyRun_SimpleFileExFlags()`` returns." +msgstr "" +"如果 *fp* 指向一个关联到交互设备(控制台或终端输入或 Unix 伪终端)的文件,则返回 " +":c:func:`PyRun_InteractiveLoop` 的值,否则返回 :c:func:`PyRun_SimpleFile` 的结果。 " +"*filename* 会使用文件系统的编码格式 (:func:`sys.getfilesystemencoding`) 来解码。如果 " +"*filename* 为 ``NULL``,此函数会使用 ``\"???\"`` 作为文件名。如果 *closeit* 为真值,文件会在 " +"``PyRun_SimpleFileExFlags()`` 返回之前被关闭。" + +#: ../../c-api/veryhigh.rst:61 +msgid "" +"This is a simplified interface to :c:func:`PyRun_SimpleStringFlags` below, " +"leaving the :c:struct:`PyCompilerFlags`\\* argument set to ``NULL``." +msgstr "" +"这是针对下面 :c:func:`PyRun_SimpleStringFlags` 的简化版接口,将 " +":c:struct:`PyCompilerFlags`\\* 参数设为 ``NULL``。" + +#: ../../c-api/veryhigh.rst:67 +msgid "" +"Executes the Python source code from *command* in the :mod:`__main__` module" +" according to the *flags* argument. If :mod:`__main__` does not already " +"exist, it is created. Returns ``0`` on success or ``-1`` if an exception " +"was raised. If there was an error, there is no way to get the exception " +"information. For the meaning of *flags*, see below." +msgstr "" +"根据 *flags* 参数,在 :mod:`__main__` 模块中执行 Python 源代码。如果 :mod:`__main__` " +"尚不存在,它将被创建。成功时返回 ``0``,如果引发异常则返回 ``-1``。如果发生错误,则将无法获得异常信息。对于 *flags* " +"的含义,请参阅下文。" + +#: ../../c-api/veryhigh.rst:73 +msgid "" +"Note that if an otherwise unhandled :exc:`SystemExit` is raised, this " +"function will not return ``-1``, but exit the process, as long as " +":c:member:`PyConfig.inspect` is zero." +msgstr "" +"请注意如果引发了一个在其他场合下未处理的 :exc:`SystemExit`,此函数将不会返回 ``-1``,而是退出进程,只要 " +":c:member:`PyConfig.inspect` 为零就会这样。" + +#: ../../c-api/veryhigh.rst:80 +msgid "" +"This is a simplified interface to :c:func:`PyRun_SimpleFileExFlags` below, " +"leaving *closeit* set to ``0`` and *flags* set to ``NULL``." +msgstr "" +"这是针对下面 :c:func:`PyRun_SimpleFileExFlags` 的简化版接口,将 *closeit* 设为 ``0`` 而将 " +"*flags* 设为 ``NULL``。" + +#: ../../c-api/veryhigh.rst:86 +msgid "" +"This is a simplified interface to :c:func:`PyRun_SimpleFileExFlags` below, " +"leaving *flags* set to ``NULL``." +msgstr "" +"这是针对下面 :c:func:`PyRun_SimpleFileExFlags` 的简化版接口,将 *flags* 设为 ``NULL``。" + +#: ../../c-api/veryhigh.rst:92 +msgid "" +"Similar to :c:func:`PyRun_SimpleStringFlags`, but the Python source code is " +"read from *fp* instead of an in-memory string. *filename* should be the name" +" of the file, it is decoded from :term:`filesystem encoding and error " +"handler`. If *closeit* is true, the file is closed before " +"``PyRun_SimpleFileExFlags()`` returns." +msgstr "" +"类似于 :c:func:`PyRun_SimpleStringFlags`,但 Python 源代码是从 *fp* 读取而不是一个内存中的字符串。 " +"*filename* 应为文件名,它将使用 :term:`filesystem encoding and error handler` 来解码。如果 " +"*closeit* 为真值,则文件将在 ``PyRun_SimpleFileExFlags()`` 返回之前被关闭。" + +#: ../../c-api/veryhigh.rst:99 +msgid "" +"On Windows, *fp* should be opened as binary mode (e.g. ``fopen(filename, " +"\"rb\")``). Otherwise, Python may not handle script file with LF line ending" +" correctly." +msgstr "" +"在 Windows 上,*fp* 应当以二进制模式打开 (即 ``fopen(filename, \"rb\")``)。否则,Python " +"可能无法正确地处理使用 LF 行结束符的脚本文件。" + +#: ../../c-api/veryhigh.rst:105 +msgid "" +"Read and execute a single statement from a file associated with an " +"interactive device according to the *flags* argument. The user will be " +"prompted using ``sys.ps1`` and ``sys.ps2``. *filename* must be a Python " +":class:`str` object." +msgstr "" +"根据 *flags* 参数读取并执行来自与交互设备相关联的文件的一条语句。用户将得到使用 ``sys.ps1`` 和 ``sys.ps2`` 的提示。 " +"*filename* 必须是一个 Python :class:`str` 对象。" + +#: ../../c-api/veryhigh.rst:110 +msgid "" +"Returns ``0`` when the input was executed successfully, ``-1`` if there was " +"an exception, or an error code from the :file:`errcode.h` include file " +"distributed as part of Python if there was a parse error. (Note that " +":file:`errcode.h` is not included by :file:`Python.h`, so must be included " +"specifically if needed.)" +msgstr "" +"当输入被成功执行时返回 ``0``,如果引发异常则返回 ``-1``,或者如果存在解析错误则返回来自作为 Python 的组成部分发布的 " +":file:`errcode.h` 包含文件的错误代码。 (请注意 :file:`errcode.h` 并未被 :file:`Python.h` " +"所包含,因此如果需要则必须专门地包含。)" + +#: ../../c-api/veryhigh.rst:119 +msgid "" +"This is a simplified interface to :c:func:`PyRun_InteractiveOneFlags` below," +" leaving *flags* set to ``NULL``." +msgstr "" +"这是针对下面 :c:func:`PyRun_InteractiveOneFlags` 的简化版接口,将 *flags* 设为 ``NULL``。" + +#: ../../c-api/veryhigh.rst:125 +msgid "" +"Similar to :c:func:`PyRun_InteractiveOneObject`, but *filename* is a " +":c:expr:`const char*`, which is decoded from the :term:`filesystem encoding " +"and error handler`." +msgstr "" +"类似于 :c:func:`PyRun_InteractiveOneObject`,但 *filename* 是一个 :c:expr:`const " +"char*`,它使用 :term:`filesystem encoding and error handler` 来解码。" + +#: ../../c-api/veryhigh.rst:132 +msgid "" +"This is a simplified interface to :c:func:`PyRun_InteractiveLoopFlags` " +"below, leaving *flags* set to ``NULL``." +msgstr "" +"这是针对下面 :c:func:`PyRun_InteractiveLoopFlags` 的简化版接口,将 *flags* 设为 ``NULL``。" + +#: ../../c-api/veryhigh.rst:138 +msgid "" +"Read and execute statements from a file associated with an interactive " +"device until EOF is reached. The user will be prompted using ``sys.ps1`` " +"and ``sys.ps2``. *filename* is decoded from the :term:`filesystem encoding " +"and error handler`. Returns ``0`` at EOF or a negative number upon failure." +msgstr "" +"读取并执行来自与交互设备相关联的语句直至到达 EOF。用户将得到使用 ``sys.ps1`` 和 ``sys.ps2`` 的提示。 *filename*" +" 将使用 :term:`filesystem encoding and error handler` 来解码。当位于 EOF 时将返回 " +"``0``,或者当失败时将返回一个负数。" + +#: ../../c-api/veryhigh.rst:146 +msgid "" +"Can be set to point to a function with the prototype ``int func(void)``. " +"The function will be called when Python's interpreter prompt is about to " +"become idle and wait for user input from the terminal. The return value is " +"ignored. Overriding this hook can be used to integrate the interpreter's " +"prompt with other event loops, as done in :file:`Modules/_tkinter.c` in the " +"Python source code." +msgstr "" +"可以设为指向一个原型为 ``int func(void)`` 的函数。该函数将在 Python 的解释器提示符即将空闲并等待用户从终端输入时被调用。 " +"返回值会被忽略。重写这个钩子可被用来将解释器的提示符集成到其他事件循环中,就像 Python 源代码中 " +":file:`Modules/_tkinter.c` 所做的那样。" + +#: ../../c-api/veryhigh.rst:154 ../../c-api/veryhigh.rst:178 +msgid "" +"This function is only called from the :ref:`main interpreter `." +msgstr "此函数只能被 :ref:`主解释器 ` 调用。" + +#: ../../c-api/veryhigh.rst:161 +msgid "" +"Can be set to point to a function with the prototype ``char *func(FILE " +"*stdin, FILE *stdout, char *prompt)``, overriding the default function used " +"to read a single line of input at the interpreter's prompt. The function is" +" expected to output the string *prompt* if it's not ``NULL``, and then read " +"a line of input from the provided standard input file, returning the " +"resulting string. For example, The :mod:`readline` module sets this hook to" +" provide line-editing and tab-completion features." +msgstr "" +"可以被设为指向一个原型为 ``char *func(FILE *stdin, FILE *stdout, char *prompt)`` " +"的函数,重写被用来读取解释器提示符的一行输入的默认函数。该函数被预期为如果字符串 *prompt* 不为 ``NULL`` " +"就输出它,然后从所提供的标准输入文件读取一行输入,并返回结果字符串。例如,:mod:`readline` 模块将这个钩子设置为提供行编辑和 tab " +"键补全等功能。" + +#: ../../c-api/veryhigh.rst:170 +msgid "" +"The result must be a string allocated by :c:func:`PyMem_RawMalloc` or " +":c:func:`PyMem_RawRealloc`, or ``NULL`` if an error occurred." +msgstr "" +"结果必须是一个由 :c:func:`PyMem_RawMalloc` 或 :c:func:`PyMem_RawRealloc` " +"分配的字符串,或者如果发生错误则为 ``NULL``。" + +#: ../../c-api/veryhigh.rst:173 +msgid "" +"The result must be allocated by :c:func:`PyMem_RawMalloc` or " +":c:func:`PyMem_RawRealloc`, instead of being allocated by " +":c:func:`PyMem_Malloc` or :c:func:`PyMem_Realloc`." +msgstr "" +"结果必须由 :c:func:`PyMem_RawMalloc` 或 :c:func:`PyMem_RawRealloc` 分配,而不是由 " +":c:func:`PyMem_Malloc` 或 :c:func:`PyMem_Realloc` 分配。" + +#: ../../c-api/veryhigh.rst:184 +msgid "" +"This is a simplified interface to :c:func:`PyRun_StringFlags` below, leaving" +" *flags* set to ``NULL``." +msgstr "这是针对下面 :c:func:`PyRun_StringFlags` 的简化版接口,将 *flags* 设为 ``NULL``。" + +#: ../../c-api/veryhigh.rst:190 +msgid "" +"Execute Python source code from *str* in the context specified by the " +"objects *globals* and *locals* with the compiler flags specified by *flags*." +" *globals* must be a dictionary; *locals* can be any object that implements" +" the mapping protocol. The parameter *start* specifies the start symbol and" +" must be one of the :ref:`available start symbols `." +msgstr "" +"在由 *globals* 和 *locals* 对象指定的上下文中执行 *str* 中的 Python 源代码并使用由 *flags* " +"指定的编译器旗标。 *globals* 必须是一个字典;*locals* 可以是任何实现了映射协议的对象。 形参 *start* 指定起始符号并且必须是" +" :ref:`可用的起始符号 ` 之一。" + +#: ../../c-api/veryhigh.rst:196 +msgid "" +"Returns the result of executing the code as a Python object, or ``NULL`` if " +"an exception was raised." +msgstr "返回将代码作为 Python 对象执行的结果,或者如果引发了异常则返回 ``NULL``。" + +#: ../../c-api/veryhigh.rst:202 +msgid "" +"This is a simplified interface to :c:func:`PyRun_FileExFlags` below, leaving" +" *closeit* set to ``0`` and *flags* set to ``NULL``." +msgstr "" +"这是针对下面 :c:func:`PyRun_FileExFlags` 的简化版接口,将 *closeit* 设为 ``0`` 并将 *flags* 设为" +" ``NULL``." + +#: ../../c-api/veryhigh.rst:208 +msgid "" +"This is a simplified interface to :c:func:`PyRun_FileExFlags` below, leaving" +" *flags* set to ``NULL``." +msgstr "这是针对下面 :c:func:`PyRun_FileExFlags` 的简化版接口,将 *flags* 设为 ``NULL``。" + +#: ../../c-api/veryhigh.rst:214 +msgid "" +"This is a simplified interface to :c:func:`PyRun_FileExFlags` below, leaving" +" *closeit* set to ``0``." +msgstr "这是针对下面 :c:func:`PyRun_FileExFlags` 的简化版接口,将 *closeit* 设为 ``0``。" + +#: ../../c-api/veryhigh.rst:220 +msgid "" +"Similar to :c:func:`PyRun_StringFlags`, but the Python source code is read " +"from *fp* instead of an in-memory string. *filename* should be the name of " +"the file, it is decoded from the :term:`filesystem encoding and error " +"handler`. If *closeit* is true, the file is closed before " +":c:func:`PyRun_FileExFlags` returns." +msgstr "" +"类似于 :c:func:`PyRun_StringFlags`,但 Python 源代码是从 *fp* 读取而不是一个内存中的字符串。 " +"*filename* 应为文件名,它将使用 :term:`filesystem encoding and error handler` 来解码。如果 " +"*closeit* 为真值,则文件将在 :c:func:`PyRun_FileExFlags` 返回之前被关闭。" + +#: ../../c-api/veryhigh.rst:229 +msgid "" +"This is a simplified interface to :c:func:`Py_CompileStringFlags` below, " +"leaving *flags* set to ``NULL``." +msgstr "这是针对下面 :c:func:`Py_CompileStringFlags` 的简化版接口,将 *flags* 设为 ``NULL``。" + +#: ../../c-api/veryhigh.rst:235 +msgid "" +"This is a simplified interface to :c:func:`Py_CompileStringExFlags` below, " +"with *optimize* set to ``-1``." +msgstr "" +"这是针对下面 :c:func:`Py_CompileStringExFlags` 的简化版接口,将 *optimize* 设为 ``-1``。" + +#: ../../c-api/veryhigh.rst:241 +msgid "" +"Parse and compile the Python source code in *str*, returning the resulting " +"code object. The start symbol is given by *start*; this can be used to " +"constrain the code which can be compiled and should be :ref:`available start" +" symbols `. The filename specified by *filename* is used to " +"construct the code object and may appear in tracebacks or :exc:`SyntaxError`" +" exception messages. This returns ``NULL`` if the code cannot be parsed or " +"compiled." +msgstr "" +"解析并编译 *str* 中的 Python 源代码,返回结果代码对象。起始符号由 *start* 给出;这可用于约束可编译的代码并且应当是 " +":ref:`可用的起始符号 `。由 *filename* 指定的文件名将被用来构建代码对象并可能出现在回溯或 " +":exc:`SyntaxError` 异常消息中。如果代码无法被解析或编译则返回 ``NULL``。" + +#: ../../c-api/veryhigh.rst:249 +msgid "" +"The integer *optimize* specifies the optimization level of the compiler; a " +"value of ``-1`` selects the optimization level of the interpreter as given " +"by :option:`-O` options. Explicit levels are ``0`` (no optimization; " +"``__debug__`` is true), ``1`` (asserts are removed, ``__debug__`` is false) " +"or ``2`` (docstrings are removed too)." +msgstr "" +"整数 *optimize* 指定编译器的优化级别;值 ``-1`` 将选择与 :option:`-O` 选项相同的解释器优化级别。显式级别为 ``0``" +" (无优化;``__debug__`` 为真值)、``1`` (断言被移除,``__debug__`` 为假值) 或 ``2`` " +"(文档字符串也被移除)。" + +#: ../../c-api/veryhigh.rst:260 +msgid "" +"Like :c:func:`Py_CompileStringObject`, but *filename* is a byte string " +"decoded from the :term:`filesystem encoding and error handler`." +msgstr "" +"与 :c:func:`Py_CompileStringObject` 类似,但 *filename* 是一个字节串,使用 " +":term:`filesystem encoding and error handler` 来解码。" + +#: ../../c-api/veryhigh.rst:267 +msgid "" +"This is a simplified interface to :c:func:`PyEval_EvalCodeEx`, with just the" +" code object, and global and local variables. The other arguments are set " +"to ``NULL``." +msgstr "" +"这是针对 :c:func:`PyEval_EvalCodeEx` 的简化版接口,只附带代码对象,以及全局和局部变量。其他参数均设为 ``NULL``。" + +#: ../../c-api/veryhigh.rst:274 +msgid "" +"Evaluate a precompiled code object, given a particular environment for its " +"evaluation. This environment consists of a dictionary of global variables, " +"a mapping object of local variables, arrays of arguments, keywords and " +"defaults, a dictionary of default values for :ref:`keyword-only ` arguments and a closure tuple of cells." +msgstr "" +"对一个预编译的代码对象求值,为其求值给出特定的环境。此环境由全局变量的字典,局部变量映射对象,参数、关键字和默认值的数组,:ref:`仅限关键字 " +"` 参数的默认值的字典和单元的封闭元组构成。" + +#: ../../c-api/veryhigh.rst:283 +msgid "" +"Evaluate an execution frame. This is a simplified interface to " +":c:func:`PyEval_EvalFrameEx`, for backward compatibility." +msgstr "对一个执行帧求值。这是针对 :c:func:`PyEval_EvalFrameEx` 的简化版接口,用于保持向下兼容性。" + +#: ../../c-api/veryhigh.rst:289 +msgid "" +"This is the main, unvarnished function of Python interpretation. The code " +"object associated with the execution frame *f* is executed, interpreting " +"bytecode and executing calls as needed. The additional *throwflag* " +"parameter can mostly be ignored - if true, then it causes an exception to " +"immediately be thrown; this is used for the :meth:`~generator.throw` methods" +" of generator objects." +msgstr "" +"这是 Python 解释运行不带修饰的主函数。与执行帧 *f* 相关联的代码对象将被执行,解释字节码并根据需要执行调用。额外的 *throwflag* " +"形参基本可以被忽略 —— 如果为真值,则会导致立即抛出一个异常;这会被用于生成器对象的 :meth:`~generator.throw` 方法。" + +#: ../../c-api/veryhigh.rst:296 +msgid "" +"This function now includes a debug assertion to help ensure that it does not" +" silently discard an active exception." +msgstr "该函数现在包含一个调试断言,用以确保不会静默地丢弃活动的异常。" + +#: ../../c-api/veryhigh.rst:303 +msgid "" +"This function changes the flags of the current evaluation frame, and returns" +" true on success, false on failure." +msgstr "此函数会修改当前求值帧的旗标,并在成功时返回真值,失败时返回假值。" + +#: ../../c-api/veryhigh.rst:309 +msgid "" +"This is the structure used to hold compiler flags. In cases where code is " +"only being compiled, it is passed as ``int flags``, and in cases where code " +"is being executed, it is passed as ``PyCompilerFlags *flags``. In this " +"case, ``from __future__ import`` can modify *flags*." +msgstr "" +"这是用来存放编译器旗标的结构体。对于代码仅被编译的情况,它将作为 ``int flags`` 传入,而对于代码要被执行的情况,它将作为 " +"``PyCompilerFlags *flags`` 传入。在这种情况下,``from __future__ import`` 可以修改 " +"*flags*." + +#: ../../c-api/veryhigh.rst:314 +msgid "" +"Whenever ``PyCompilerFlags *flags`` is ``NULL``, " +":c:member:`~PyCompilerFlags.cf_flags` is treated as equal to ``0``, and any " +"modification due to ``from __future__ import`` is discarded." +msgstr "" +"只要 ``PyCompilerFlags *flags`` 是 " +"``NULL``,:c:member:`~PyCompilerFlags.cf_flags` 就会被视为等同于 ``0``,而由于 ``from " +"__future__ import`` 而产生的任何修改都会被丢弃。" + +#: ../../c-api/veryhigh.rst:320 +msgid "Compiler flags." +msgstr "编译器旗标。" + +#: ../../c-api/veryhigh.rst:324 +msgid "" +"*cf_feature_version* is the minor Python version. It should be initialized " +"to ``PY_MINOR_VERSION``." +msgstr "*cf_feature_version* 是 Python 的小版本号。它应当被初始化为 ``PY_MINOR_VERSION``。" + +#: ../../c-api/veryhigh.rst:327 +msgid "" +"The field is ignored by default, it is used if and only if ``PyCF_ONLY_AST``" +" flag is set in :c:member:`~PyCompilerFlags.cf_flags`." +msgstr "" +"该字段默认会被忽略,当且仅当在 :c:member:`~PyCompilerFlags.cf_flags` 中设置了 ``PyCF_ONLY_AST``" +" 旗标时它才会被使用。" + +#: ../../c-api/veryhigh.rst:330 +msgid "Added *cf_feature_version* field." +msgstr "增加了 *cf_feature_version* 字段。" + +#: ../../c-api/veryhigh.rst:333 +msgid "The available compiler flags are accessible as macros:" +msgstr "现有的编译器旗标可作为宏来使用:" + +#: ../../c-api/veryhigh.rst:342 +msgid "" +"See :ref:`compiler flags ` in documentation of the " +":py:mod:`!ast` Python module, which exports these constants under the same " +"names." +msgstr "" +"请参阅 :py:mod:`!ast` Python 模块文档中的 :ref:`编译器旗标 `,它们会将这些常量以相同的名称导出。" + +#: ../../c-api/veryhigh.rst:346 +msgid "" +"The \"``PyCF``\" flags above can be combined with \"``CO_FUTURE``\" flags " +"such as :c:macro:`CO_FUTURE_ANNOTATIONS` to enable features normally " +"selectable using :ref:`future statements `. See " +":ref:`c_codeobject_flags` for a complete list." +msgstr "" +"上述 \"``PyCF``\" 旗标可与 \"``CO_FUTURE``\" 类旗标如 :c:macro:`CO_FUTURE_ANNOTATIONS`" +" 组合使用,以启用通常通过 :ref:`future 语句 ` 选择的功能特性。完整旗标列表请参见 " +":ref:`c_codeobject_flags`." + +#: ../../c-api/veryhigh.rst:355 +msgid "Available start symbols" +msgstr "可用的起始符号" + +#: ../../c-api/veryhigh.rst:362 +msgid "" +"The start symbol from the Python grammar for isolated expressions; for use " +"with :c:func:`Py_CompileString`." +msgstr "Python 语法中用于孤立表达式的起始符号;配合 :c:func:`Py_CompileString` 使用。" + +#: ../../c-api/veryhigh.rst:370 +msgid "" +"The start symbol from the Python grammar for sequences of statements as read" +" from a file or other source; for use with :c:func:`Py_CompileString`. This" +" is the symbol to use when compiling arbitrarily long Python source code." +msgstr "" +"Python 语法中用于从文件或其他源读取语句序列的起始符号;配合 :c:func:`Py_CompileString` 使用。这是在编译任意长的 " +"Python 源代码时要使用的符号。" + +#: ../../c-api/veryhigh.rst:379 +msgid "" +"The start symbol from the Python grammar for a single statement; for use " +"with :c:func:`Py_CompileString`. This is the symbol used for the interactive" +" interpreter loop." +msgstr "" +"Python 语法中用于单独语句的起始符号;配合 :c:func:`Py_CompileString` 使用。这是用于交互式解释器循环的符号。" + +#: ../../c-api/veryhigh.rst:388 +msgid "" +"The start symbol from the Python grammar for a function type; for use with " +":c:func:`Py_CompileString`. This is used to parse \"signature type " +"comments\" from :pep:`484`." +msgstr "" +"Python 语法中用于函数类型的起始符号;配合 :c:func:`Py_CompileString` 使用。这是用于解析来自 :pep:`484` 的" +" \"签名类型注释\"。" + +#: ../../c-api/veryhigh.rst:392 +msgid "This requires the :c:macro:`PyCF_ONLY_AST` flag to be set." +msgstr "这需要设置 :c:macro:`PyCF_ONLY_AST` 旗标。" + +#: ../../c-api/veryhigh.rst:395 +msgid ":py:class:`ast.FunctionType`" +msgstr ":py:class:`ast.FunctionType`" + +#: ../../c-api/veryhigh.rst:396 +msgid ":pep:`484`" +msgstr ":pep:`484`" + +#: ../../c-api/veryhigh.rst:402 +msgid "Stack Effects" +msgstr "栈影响" + +#: ../../c-api/veryhigh.rst:405 +msgid ":py:func:`dis.stack_effect`" +msgstr ":py:func:`dis.stack_effect`" + +#: ../../c-api/veryhigh.rst:410 +msgid "Sentinel value representing an invalid stack effect." +msgstr "代表无效栈影响的哨兵值。" + +#: ../../c-api/veryhigh.rst:412 +msgid "This is currently equivalent to ``INT_MAX``." +msgstr "目前这等价于 ``INT_MAX``。" + +#: ../../c-api/veryhigh.rst:419 +msgid "Compute the stack effect of *opcode* with argument *oparg*." +msgstr "使用参数 *oparg* 计算 *opcode* 的栈影响。" + +#: ../../c-api/veryhigh.rst:421 ../../c-api/veryhigh.rst:435 +msgid "" +"On success, this function returns the stack effect; on failure, this returns" +" :c:macro:`PY_INVALID_STACK_EFFECT`." +msgstr "成功时,此函数返回栈影响;失败时,则返回 :c:macro:`PY_INVALID_STACK_EFFECT`。" + +#: ../../c-api/veryhigh.rst:429 +msgid "" +"Similar to :c:func:`PyCompile_OpcodeStackEffect`, but don't include the " +"stack effect of jumping if *jump* is zero." +msgstr "类似于 :c:func:`PyCompile_OpcodeStackEffect`,但不包括当 *jump* 为零时的跳转的栈影响。" + +#: ../../c-api/veryhigh.rst:432 +msgid "" +"If *jump* is ``0``, this will not include the stack effect of jumping, but " +"if *jump* is ``1`` or ``-1``, this will include it." +msgstr "如果 *jump* 为 ``0``,这将不包括跳转的栈影响,但如果 *jump* 为 ``1`` 或 ``-1``,这将会包括它。" + +#: ../../c-api/veryhigh.rst:360 ../../c-api/veryhigh.rst:368 +#: ../../c-api/veryhigh.rst:377 ../../c-api/veryhigh.rst:386 +msgid "Py_CompileString (C function)" +msgstr "Py_CompileString (C 函数)" diff --git a/c-api/weakref.po b/c-api/weakref.po new file mode 100644 index 0000000000..2953ffb574 --- /dev/null +++ b/c-api/weakref.po @@ -0,0 +1,178 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-06-11 18:32+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../c-api/weakref.rst:6 +msgid "Weak Reference Objects" +msgstr "弱引用对象" + +#: ../../c-api/weakref.rst:8 +msgid "" +"Python supports *weak references* as first-class objects. There are two " +"specific object types which directly implement weak references. The first " +"is a simple reference object, and the second acts as a proxy for the " +"original object as much as it can." +msgstr "" +"Python 支持“弱引用”作为一类对象。具体来说,有两种直接实现弱引用的对象。第一种就是简单的引用对象,第二种尽可能地作用为一个原对象的代理。" + +#: ../../c-api/weakref.rst:16 +msgid "" +"Return non-zero if *ob* is either a reference or proxy object. This " +"function always succeeds." +msgstr "如果 *ob* 是一个引用或代理对象则返回非零值。此函数总是会成功执行。" + +#: ../../c-api/weakref.rst:22 +msgid "" +"Return non-zero if *ob* is a reference object or a subclass of the reference" +" type. This function always succeeds." +msgstr "如果 *ob* 是一个引用对象或引用类型的子类则返回非零值。此函数总是会成功执行。" + +#: ../../c-api/weakref.rst:28 +msgid "" +"Return non-zero if *ob* is a reference object, but not a subclass of the " +"reference type. This function always succeeds." +msgstr "如果 *ob* 是一个引用对象,但不是引用类型的子类则返回非零值。此函数总是会成功执行。" + +#: ../../c-api/weakref.rst:34 +msgid "" +"Return non-zero if *ob* is a proxy object. This function always succeeds." +msgstr "如果 *ob* 是一个代理对象则返回非零值。此函数总是会成功执行。" + +#: ../../c-api/weakref.rst:39 +msgid "" +"Return a weak reference object for the object *ob*. This will always return" +" a new reference, but is not guaranteed to create a new object; an existing " +"reference object may be returned. The second parameter, *callback*, can be " +"a callable object that receives notification when *ob* is garbage collected;" +" it should accept a single parameter, which will be the weak reference " +"object itself. *callback* may also be ``None`` or ``NULL``. If *ob* is not " +"a weakly referenceable object, this will raise :exc:`TypeError` and return " +"``NULL``." +msgstr "" + +#: ../../c-api/weakref.rst:49 ../../c-api/weakref.rst:65 +msgid "" +":c:func:`PyType_SUPPORTS_WEAKREFS` for checking if *ob* is weakly " +"referenceable." +msgstr ":c:func:`PyType_SUPPORTS_WEAKREFS` 用于检测 *ob* 是否可被弱引用。" + +#: ../../c-api/weakref.rst:55 +msgid "" +"Return a weak reference proxy object for the object *ob*. This will always " +"return a new reference, but is not guaranteed to create a new object; an " +"existing proxy object may be returned. The second parameter, *callback*, " +"can be a callable object that receives notification when *ob* is garbage " +"collected; it should accept a single parameter, which will be the weak " +"reference object itself. *callback* may also be ``None`` or ``NULL``. If " +"*ob* weakly referenceable object, this will raise :exc:`TypeError` and " +"return ``NULL``." +msgstr "" + +#: ../../c-api/weakref.rst:71 +msgid "" +"Get a :term:`strong reference` to the referenced object from a weak " +"reference, *ref*, into *\\*pobj*." +msgstr "基于一个弱引用 *ref* 获取一个指向被引用对象的 :term:`strong reference` 存入到 *\\*pobj*。" + +#: ../../c-api/weakref.rst:74 +msgid "" +"On success, set *\\*pobj* to a new :term:`strong reference` to the " +"referenced object and return 1." +msgstr "成功时,将 *\\*pobj* 设为一个新的指向被引用对象的 :term:`strong reference` 并返回 1。" + +#: ../../c-api/weakref.rst:76 +msgid "If the reference is dead, set *\\*pobj* to ``NULL`` and return 0." +msgstr "如果引用不可用,则将 *\\*pobj* 设为 ``NULL`` 并返回 0。" + +#: ../../c-api/weakref.rst:77 +msgid "On error, raise an exception and return -1." +msgstr "发生错误时,将引发异常并返回 -1。" + +#: ../../c-api/weakref.rst:84 +msgid "" +"Return a :term:`borrowed reference` to the referenced object from a weak " +"reference, *ref*. If the referent is no longer live, returns ``Py_None``." +msgstr "" +"基于一个弱引用 *ref* 返回一个指向被引用对象的 :term:`borrowed reference`。如果引用已不可用,则返回 " +"``Py_None``." + +#: ../../c-api/weakref.rst:89 +msgid "" +"This function returns a :term:`borrowed reference` to the referenced object." +" This means that you should always call :c:func:`Py_INCREF` on the object " +"except when it cannot be destroyed before the last usage of the borrowed " +"reference." +msgstr "" +"该函数返回被引用对象的一个 :term:`borrowed reference`。这意味着应该总是在该对象上调用 " +":c:func:`Py_INCREF`,除非是当它在借入引用的最后一次被使用之前无法被销毁的时候。" + +#: ../../c-api/weakref.rst:94 ../../c-api/weakref.rst:102 +msgid "Use :c:func:`PyWeakref_GetRef` instead." +msgstr "请改用 :c:func:`PyWeakref_GetRef`。" + +#: ../../c-api/weakref.rst:100 +msgid "Similar to :c:func:`PyWeakref_GetObject`, but does no error checking." +msgstr "类似于 :c:func:`PyWeakref_GetObject`,但是不带错误检测。" + +#: ../../c-api/weakref.rst:108 +msgid "" +"Test if the weak reference *ref* is dead. Returns 1 if the reference is " +"dead, 0 if it is alive, and -1 with an error set if *ref* is not a weak " +"reference object." +msgstr "" +"测试弱引用 *ref* 是否已死亡。如果该引用已死亡则返回 1,如果仍存活则返回 0,如果 *ref* 不是弱引用对象则返回 -1 并设置一个错误。" + +#: ../../c-api/weakref.rst:117 +msgid "" +"This function is called by the :c:member:`~PyTypeObject.tp_dealloc` handler " +"to clear weak references." +msgstr "此函数将被 :c:member:`~PyTypeObject.tp_dealloc` 处理器调用以清空弱引用。" + +#: ../../c-api/weakref.rst:120 +msgid "" +"This iterates through the weak references for *object* and calls callbacks " +"for those references which have one. It returns when all callbacks have been" +" attempted." +msgstr "此函数将迭代 *object* 的弱引用并调用这些引用中可能存在的回调。它将在尝试了所有回调之后返回。" + +#: ../../c-api/weakref.rst:127 +msgid "Clears the weakrefs for *object* without calling the callbacks." +msgstr "清空 *object* 的弱引用而不调用回调。" + +#: ../../c-api/weakref.rst:129 +msgid "" +"This function is called by the :c:member:`~PyTypeObject.tp_dealloc` handler " +"for types with finalizers (i.e., :meth:`~object.__del__`). The handler for " +"those objects first calls :c:func:`PyObject_ClearWeakRefs` to clear weakrefs" +" and call their callbacks, then the finalizer, and finally this function to " +"clear any weakrefs that may have been created by the finalizer." +msgstr "" +"此函数将由 :c:member:`~PyTypeObject.tp_dealloc` 处理器针对带有终结器 (即 " +":meth:`~object.__del__`) 的类型进行调用。针对这些对象的处理器会先调用 " +":c:func:`PyObject_ClearWeakRefs` " +"来清空弱引用并调用其回调,然后调用终结器,最后调用此函数来清空终结器可能创建的任何弱引用。" + +#: ../../c-api/weakref.rst:135 +msgid "" +"In most circumstances, it's more appropriate to use " +":c:func:`PyObject_ClearWeakRefs` to clear weakrefs instead of this function." +msgstr "在大多数情况下,更适当的做法是使用 :c:func:`PyObject_ClearWeakRefs` 而不是此函数来清空弱引用。" diff --git a/contents.po b/contents.po new file mode 100644 index 0000000000..5713411363 --- /dev/null +++ b/contents.po @@ -0,0 +1,26 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../contents.rst:3 +msgid "Python Documentation contents" +msgstr "Python 文档目录" diff --git a/copyright.po b/copyright.po new file mode 100644 index 0000000000..77c7b77203 --- /dev/null +++ b/copyright.po @@ -0,0 +1,56 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../copyright.rst:3 +msgid "Copyright" +msgstr "版权所有" + +#: ../../copyright.rst:5 +msgid "Python and this documentation is:" +msgstr "Python 与这份文档:" + +#: ../../copyright.rst:7 +msgid "Copyright © 2001 Python Software Foundation. All rights reserved." +msgstr "版权所有 © 2001 Python 软件基金会。保留所有权利。" + +#: ../../copyright.rst:9 +msgid "Copyright © 2000 BeOpen.com. All rights reserved." +msgstr "版权所有 © 2000 BeOpen.com。保留所有权利。" + +#: ../../copyright.rst:11 +msgid "" +"Copyright © 1995-2000 Corporation for National Research Initiatives. All " +"rights reserved." +msgstr "" +"版权所有 © 1995-2000 Corporation for National Research Initiatives。保留所有权利。" + +#: ../../copyright.rst:14 +msgid "" +"Copyright © 1991-1995 Stichting Mathematisch Centrum. All rights reserved." +msgstr "版权所有 © 1991-1995 Stichting Mathematisch Centrum。保留所有权利。" + +#: ../../copyright.rst:18 +msgid "" +"See :ref:`history-and-license` for complete license and permissions " +"information." +msgstr "有关完整的许可证和许可信息,请参见 :ref:`history-and-license`。" diff --git a/deprecations/c-api-pending-removal-in-3.14.po b/deprecations/c-api-pending-removal-in-3.14.po new file mode 100644 index 0000000000..fa70b95e72 --- /dev/null +++ b/deprecations/c-api-pending-removal-in-3.14.po @@ -0,0 +1,40 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../deprecations/c-api-pending-removal-in-3.14.rst:2 +msgid "Pending removal in Python 3.14" +msgstr "计划在 Python 3.14 中移除" + +#: ../../deprecations/c-api-pending-removal-in-3.14.rst:4 +msgid "" +"The ``ma_version_tag`` field in :c:type:`PyDictObject` for extension modules" +" (:pep:`699`; :gh:`101193`)." +msgstr "" +":c:type:`PyDictObject` 中的 ``ma_version_tag`` 字段用于扩展模块 ( :pep:`699` ; " +":gh:`101193` )." + +#: ../../deprecations/c-api-pending-removal-in-3.14.rst:7 +msgid "" +"Creating :c:data:`immutable types ` with mutable " +"bases (:gh:`95388`)." +msgstr "创建带有可变基类的 :c:data:`不可变类型 ` (:gh:`95388`)。" diff --git a/deprecations/c-api-pending-removal-in-3.15.po b/deprecations/c-api-pending-removal-in-3.15.po new file mode 100644 index 0000000000..cfe534edd1 --- /dev/null +++ b/deprecations/c-api-pending-removal-in-3.15.po @@ -0,0 +1,372 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-09 14:43+0000\n" +"PO-Revision-Date: 2025-09-16 00:00+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:2 +msgid "Pending removal in Python 3.15" +msgstr "计划在 Python 3.15 中移除" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:4 +msgid "" +"The :c:func:`!PyImport_ImportModuleNoBlock`: Use " +":c:func:`PyImport_ImportModule` instead." +msgstr "" +":c:func:`!PyImport_ImportModuleNoBlock`: 改用 :c:func:`PyImport_ImportModule`。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:6 +msgid "" +":c:func:`!PyWeakref_GetObject` and :c:func:`!PyWeakref_GET_OBJECT`: Use " +":c:func:`PyWeakref_GetRef` instead. The `pythoncapi-compat project " +"`__ can be used to get " +":c:func:`PyWeakref_GetRef` on Python 3.12 and older." +msgstr "" +":c:func:`!PyWeakref_GetObject` 和 :c:func:`!PyWeakref_GET_OBJECT`: 改用 " +":c:func:`PyWeakref_GetRef`。 在 Python 3.12 及更旧的版本中可以使用 `pythoncapi-compat 项目 " +"`__ 来获取 " +":c:func:`PyWeakref_GetRef`。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:10 +msgid "" +":c:func:`!PyUnicode_AsDecodedObject`: Use :c:func:`PyCodec_Decode` instead." +msgstr ":c:func:`!PyUnicode_AsDecodedObject`: 改用 :c:func:`PyCodec_Decode`。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:12 +msgid "" +":c:func:`!PyUnicode_AsDecodedUnicode`: Use :c:func:`PyCodec_Decode` instead;" +" Note that some codecs (for example, \"base64\") may return a type other " +"than :class:`str`, such as :class:`bytes`." +msgstr "" +":c:func:`!PyUnicode_AsDecodedUnicode`: 改用 :c:func:`PyCodec_Decode`;请注意某些编解码器" +" (例如 \"base64\") 可能返回 :class:`str` 以外的类型,比如 :class:`bytes`。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:15 +msgid "" +":c:func:`!PyUnicode_AsEncodedObject`: Use :c:func:`PyCodec_Encode` instead." +msgstr ":c:func:`!PyUnicode_AsEncodedObject`: 改用 :c:func:`PyCodec_Encode`。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:17 +msgid "" +":c:func:`!PyUnicode_AsEncodedUnicode`: Use :c:func:`PyCodec_Encode` instead;" +" Note that some codecs (for example, \"base64\") may return a type other " +"than :class:`bytes`, such as :class:`str`." +msgstr "" +":c:func:`!PyUnicode_AsEncodedUnicode`: 使用 :c:func:`PyCodec_Encode` " +"代替;请注意,某些编解码器(如 \"base64\")可能返回 :class:`bytes` 之外的类型,如 :class:`str`。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:20 +msgid "Python initialization functions, deprecated in Python 3.13:" +msgstr "Python 初始化函数,在 Python 3.13 中弃用:" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:22 +msgid "" +":c:func:`!Py_GetPath`: Use :c:func:`PyConfig_Get(\"module_search_paths\") " +"` (:data:`sys.path`) instead." +msgstr "" +":c:func:`!Py_GetPath`: 改用 :c:func:`PyConfig_Get(\"module_search_paths\") " +"` (:data:`sys.path`)。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:25 +msgid "" +":c:func:`!Py_GetPrefix`: Use :c:func:`PyConfig_Get(\"base_prefix\") " +"` (:data:`sys.base_prefix`) instead. Use " +":c:func:`PyConfig_Get(\"prefix\") ` (:data:`sys.prefix`) if " +":ref:`virtual environments ` need to be handled." +msgstr "" +":c:func:`!Py_GetPrefix`: 改用 :c:func:`PyConfig_Get(\"base_prefix\") " +"` (:data:`sys.base_prefix`)。 如果需要处理 :ref:`虚拟环境 ` 则使用" +" :c:func:`PyConfig_Get(\"prefix\") ` (:data:`sys.prefix`)。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:30 +msgid "" +":c:func:`!Py_GetExecPrefix`: Use :c:func:`PyConfig_Get(\"base_exec_prefix\")" +" ` (:data:`sys.base_exec_prefix`) instead. Use " +":c:func:`PyConfig_Get(\"exec_prefix\") ` " +"(:data:`sys.exec_prefix`) if :ref:`virtual environments ` need to " +"be handled." +msgstr "" +":c:func:`!Py_GetExecPrefix`: 改用 :c:func:`PyConfig_Get(\"base_exec_prefix\") " +"` (:data:`sys.base_exec_prefix`)。 如果需要处理 :ref:`虚拟环境 ` 则使用 :c:func:`PyConfig_Get(\"exec_prefix\") ` " +"(:data:`sys.exec_prefix`)。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:36 +msgid "" +":c:func:`!Py_GetProgramFullPath`: Use :c:func:`PyConfig_Get(\"executable\") " +"` (:data:`sys.executable`) instead." +msgstr "" +":c:func:`!Py_GetProgramFullPath`: 改用 :c:func:`PyConfig_Get(\"executable\") " +"` (:data:`sys.executable`)。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:39 +msgid "" +":c:func:`!Py_GetProgramName`: Use :c:func:`PyConfig_Get(\"executable\") " +"` (:data:`sys.executable`) instead." +msgstr "" +":c:func:`!Py_GetProgramName`: 改用 :c:func:`PyConfig_Get(\"executable\") " +"` (:data:`sys.executable`)。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:42 +msgid "" +":c:func:`!Py_GetPythonHome`: Use :c:func:`PyConfig_Get(\"home\") " +"` or the :envvar:`PYTHONHOME` environment variable instead." +msgstr "" +":c:func:`!Py_GetPythonHome`: 改用 :c:func:`PyConfig_Get(\"home\") " +"` 或 :envvar:`PYTHONHOME` 环境变量。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:46 +msgid "" +"The `pythoncapi-compat project `__ can be used to get :c:func:`PyConfig_Get` on Python 3.13 and " +"older." +msgstr "" +"在 Python 3.13 和更旧的版本中可以使用 `pythoncapi-compat 项目 " +"`__ 来获取 " +":c:func:`PyConfig_Get`." + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:50 +msgid "" +"Functions to configure Python's initialization, deprecated in Python 3.11:" +msgstr "用于配置 Python 的初始化的函数,在 Python 3.11 中已弃用:" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:52 +msgid ":c:func:`!PySys_SetArgvEx()`: Set :c:member:`PyConfig.argv` instead." +msgstr ":c:func:`!PySys_SetArgvEx()`: 改为设置 :c:member:`PyConfig.argv`。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:54 +msgid ":c:func:`!PySys_SetArgv()`: Set :c:member:`PyConfig.argv` instead." +msgstr ":c:func:`!PySys_SetArgv()`: 改为设置 :c:member:`PyConfig.argv`。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:56 +msgid "" +":c:func:`!Py_SetProgramName()`: Set :c:member:`PyConfig.program_name` " +"instead." +msgstr "" +":c:func:`!Py_SetProgramName()`: 改为设置 :c:member:`PyConfig.program_name`。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:58 +msgid ":c:func:`!Py_SetPythonHome()`: Set :c:member:`PyConfig.home` instead." +msgstr ":c:func:`!Py_SetPythonHome()`: 改为设置 :c:member:`PyConfig.home`。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:60 +msgid "" +":c:func:`!PySys_ResetWarnOptions`: Clear :data:`sys.warnoptions` and " +":data:`!warnings.filters` instead." +msgstr "" +":c:func:`!PySys_ResetWarnOptions`: 改为清除 :data:`sys.warnoptions` 和 " +":data:`!warnings.filters`。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:63 +msgid "" +"The :c:func:`Py_InitializeFromConfig` API should be used with " +":c:type:`PyConfig` instead." +msgstr ":c:func:`Py_InitializeFromConfig` API 应与 :c:type:`PyConfig` 一起使用。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:66 +msgid "Global configuration variables:" +msgstr "全局配置变量:" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:68 +msgid "" +":c:var:`Py_DebugFlag`: Use :c:member:`PyConfig.parser_debug` or " +":c:func:`PyConfig_Get(\"parser_debug\") ` instead." +msgstr "" +":c:var:`Py_DebugFlag`: 改用 :c:member:`PyConfig.parser_debug` 或 " +":c:func:`PyConfig_Get(\"parser_debug\") `." + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:71 +msgid "" +":c:var:`Py_VerboseFlag`: Use :c:member:`PyConfig.verbose` or " +":c:func:`PyConfig_Get(\"verbose\") ` instead." +msgstr "" +":c:var:`Py_VerboseFlag`: 改用 :c:member:`PyConfig.verbose` 或 " +":c:func:`PyConfig_Get(\"verbose\") `." + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:74 +msgid "" +":c:var:`Py_QuietFlag`: Use :c:member:`PyConfig.quiet` or " +":c:func:`PyConfig_Get(\"quiet\") ` instead." +msgstr "" +":c:var:`Py_QuietFlag`: 改用 :c:member:`PyConfig.quiet` 或 " +":c:func:`PyConfig_Get(\"quiet\") `." + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:77 +msgid "" +":c:var:`Py_InteractiveFlag`: Use :c:member:`PyConfig.interactive` or " +":c:func:`PyConfig_Get(\"interactive\") ` instead." +msgstr "" +":c:var:`Py_InteractiveFlag`: 改用 :c:member:`PyConfig.interactive` 或 " +":c:func:`PyConfig_Get(\"interactive\") `." + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:80 +msgid "" +":c:var:`Py_InspectFlag`: Use :c:member:`PyConfig.inspect` or " +":c:func:`PyConfig_Get(\"inspect\") ` instead." +msgstr "" +":c:var:`Py_InspectFlag`: 改用 :c:member:`PyConfig.inspect` 或 " +":c:func:`PyConfig_Get(\"inspect\") `." + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:83 +msgid "" +":c:var:`Py_OptimizeFlag`: Use :c:member:`PyConfig.optimization_level` or " +":c:func:`PyConfig_Get(\"optimization_level\") ` instead." +msgstr "" +":c:var:`Py_OptimizeFlag`: 改用 :c:member:`PyConfig.optimization_level` 或 " +":c:func:`PyConfig_Get(\"optimization_level\") `." + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:86 +msgid "" +":c:var:`Py_NoSiteFlag`: Use :c:member:`PyConfig.site_import` or " +":c:func:`PyConfig_Get(\"site_import\") ` instead." +msgstr "" +":c:var:`Py_NoSiteFlag`: 改用 :c:member:`PyConfig.site_import` 或 " +":c:func:`PyConfig_Get(\"site_import\") `." + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:89 +msgid "" +":c:var:`Py_BytesWarningFlag`: Use :c:member:`PyConfig.bytes_warning` or " +":c:func:`PyConfig_Get(\"bytes_warning\") ` instead." +msgstr "" +":c:var:`Py_BytesWarningFlag`: 改用 :c:member:`PyConfig.bytes_warning` 或 " +":c:func:`PyConfig_Get(\"bytes_warning\") `." + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:92 +msgid "" +":c:var:`Py_FrozenFlag`: Use :c:member:`PyConfig.pathconfig_warnings` or " +":c:func:`PyConfig_Get(\"pathconfig_warnings\") ` instead." +msgstr "" +":c:var:`Py_FrozenFlag`: 改用 :c:member:`PyConfig.pathconfig_warnings` 或 " +":c:func:`PyConfig_Get(\"pathconfig_warnings\") `." + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:95 +msgid "" +":c:var:`Py_IgnoreEnvironmentFlag`: Use :c:member:`PyConfig.use_environment` " +"or :c:func:`PyConfig_Get(\"use_environment\") ` instead." +msgstr "" +":c:var:`Py_IgnoreEnvironmentFlag`: 改用 :c:member:`PyConfig.use_environment` 或" +" :c:func:`PyConfig_Get(\"use_environment\") `." + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:98 +msgid "" +":c:var:`Py_DontWriteBytecodeFlag`: Use :c:member:`PyConfig.write_bytecode` " +"or :c:func:`PyConfig_Get(\"write_bytecode\") ` instead." +msgstr "" +":c:var:`Py_DontWriteBytecodeFlag`: 改用 :c:member:`PyConfig.write_bytecode` 或 " +":c:func:`PyConfig_Get(\"write_bytecode\") `." + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:101 +msgid "" +":c:var:`Py_NoUserSiteDirectory`: Use " +":c:member:`PyConfig.user_site_directory` or " +":c:func:`PyConfig_Get(\"user_site_directory\") ` instead." +msgstr "" +":c:var:`Py_NoUserSiteDirectory`: 使用 :c:member:`PyConfig.user_site_directory`" +" 或 :c:func:`PyConfig_Get(\"user_site_directory\") ` 代替。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:104 +msgid "" +":c:var:`Py_UnbufferedStdioFlag`: Use :c:member:`PyConfig.buffered_stdio` or " +":c:func:`PyConfig_Get(\"buffered_stdio\") ` instead." +msgstr "" +":c:var:`Py_UnbufferedStdioFlag`: 改用 :c:member:`PyConfig.buffered_stdio` 或 " +":c:func:`PyConfig_Get(\"buffered_stdio\") `." + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:107 +msgid "" +":c:var:`Py_HashRandomizationFlag`: Use :c:member:`PyConfig.use_hash_seed` " +"and :c:member:`PyConfig.hash_seed` or :c:func:`PyConfig_Get(\"hash_seed\") " +"` instead." +msgstr "" +":c:var:`Py_HashRandomizationFlag`: 改用 :c:member:`PyConfig.use_hash_seed` 和 " +":c:member:`PyConfig.hash_seed` 或 :c:func:`PyConfig_Get(\"hash_seed\") " +"`." + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:111 +msgid "" +":c:var:`Py_IsolatedFlag`: Use :c:member:`PyConfig.isolated` or " +":c:func:`PyConfig_Get(\"isolated\") ` instead." +msgstr "" +":c:var:`Py_IsolatedFlag`: 改用 :c:member:`PyConfig.isolated` 或 " +":c:func:`PyConfig_Get(\"isolated\") `." + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:114 +msgid "" +":c:var:`Py_LegacyWindowsFSEncodingFlag`: Use " +":c:member:`PyPreConfig.legacy_windows_fs_encoding` or " +":c:func:`PyConfig_Get(\"legacy_windows_fs_encoding\") ` " +"instead." +msgstr "" +":c:var:`Py_LegacyWindowsFSEncodingFlag`: 改用 " +":c:member:`PyPreConfig.legacy_windows_fs_encoding` 或 " +":c:func:`PyConfig_Get(\"legacy_windows_fs_encoding\") `." + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:117 +msgid "" +":c:var:`Py_LegacyWindowsStdioFlag`: Use " +":c:member:`PyConfig.legacy_windows_stdio` or " +":c:func:`PyConfig_Get(\"legacy_windows_stdio\") ` instead." +msgstr "" +":c:var:`Py_LegacyWindowsStdioFlag`: 改用 " +":c:member:`PyConfig.legacy_windows_stdio` 或 " +":c:func:`PyConfig_Get(\"legacy_windows_stdio\") `." + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:120 +msgid "" +":c:var:`!Py_FileSystemDefaultEncoding`, " +":c:var:`!Py_HasFileSystemDefaultEncoding`: Use " +":c:member:`PyConfig.filesystem_encoding` or " +":c:func:`PyConfig_Get(\"filesystem_encoding\") ` instead." +msgstr "" +":c:var:`!Py_FileSystemDefaultEncoding`, " +":c:var:`!Py_HasFileSystemDefaultEncoding`: 改用 " +":c:member:`PyConfig.filesystem_encoding` 或 " +":c:func:`PyConfig_Get(\"filesystem_encoding\") `." + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:123 +msgid "" +":c:var:`!Py_FileSystemDefaultEncodeErrors`: Use " +":c:member:`PyConfig.filesystem_errors` or " +":c:func:`PyConfig_Get(\"filesystem_errors\") ` instead." +msgstr "" +":c:var:`!Py_FileSystemDefaultEncodeErrors`: 改用 " +":c:member:`PyConfig.filesystem_errors` 或 " +":c:func:`PyConfig_Get(\"filesystem_errors\") `." + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:126 +msgid "" +":c:var:`!Py_UTF8Mode`: Use :c:member:`PyPreConfig.utf8_mode` or " +":c:func:`PyConfig_Get(\"utf8_mode\") ` instead. (see " +":c:func:`Py_PreInitialize`)" +msgstr "" +":c:var:`!Py_UTF8Mode`: 改用 :c:member:`PyPreConfig.utf8_mode` 或 " +":c:func:`PyConfig_Get(\"utf8_mode\") `。 (参见 " +":c:func:`Py_PreInitialize`)" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:131 +msgid "" +"The :c:func:`Py_InitializeFromConfig` API should be used with " +":c:type:`PyConfig` to set these options. Or :c:func:`PyConfig_Get` can be " +"used to get these options at runtime." +msgstr "" +":c:func:`Py_InitializeFromConfig` API 应与 :c:type:`PyConfig` 一起使用,以设置这些选项。 " +"或者使用 :c:func:`PyConfig_Get` 在运行时获取这些选项。" diff --git a/deprecations/c-api-pending-removal-in-3.16.po b/deprecations/c-api-pending-removal-in-3.16.po new file mode 100644 index 0000000000..21e9443a70 --- /dev/null +++ b/deprecations/c-api-pending-removal-in-3.16.po @@ -0,0 +1,30 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../deprecations/c-api-pending-removal-in-3.16.rst:2 +msgid "Pending removal in Python 3.16" +msgstr "计划在 Python 3.16 中移除" + +#: ../../deprecations/c-api-pending-removal-in-3.16.rst:4 +msgid "The bundled copy of ``libmpdec``." +msgstr "捆绑的 ``libmpdec`` 副本。" diff --git a/deprecations/c-api-pending-removal-in-3.18.po b/deprecations/c-api-pending-removal-in-3.18.po new file mode 100644 index 0000000000..874ab98788 --- /dev/null +++ b/deprecations/c-api-pending-removal-in-3.18.po @@ -0,0 +1,179 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:2 +msgid "Pending removal in Python 3.18" +msgstr "计划在 Python 3.18 中移除" + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:4 +msgid "" +"The following private functions are deprecated and planned for removal in " +"Python 3.18:" +msgstr "以下私有函数已被弃用,并计划在 Python 3.18 中移除:" + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:7 +msgid ":c:func:`!_PyBytes_Join`: use :c:func:`PyBytes_Join`." +msgstr ":c:func:`!_PyBytes_Join`: 使用 :c:func:`PyBytes_Join`。" + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:8 +msgid "" +":c:func:`!_PyDict_GetItemStringWithError`: use " +":c:func:`PyDict_GetItemStringRef`." +msgstr "" +":c:func:`!_PyDict_GetItemStringWithError`: 使用 " +":c:func:`PyDict_GetItemStringRef`." + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:9 +msgid ":c:func:`!_PyDict_Pop()`: use :c:func:`PyDict_Pop`." +msgstr ":c:func:`!_PyDict_Pop()`: 使用 :c:func:`PyDict_Pop`。" + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:10 +msgid ":c:func:`!_PyLong_Sign()`: use :c:func:`PyLong_GetSign`." +msgstr ":c:func:`!_PyLong_Sign()`: 使用 :c:func:`PyLong_GetSign`。" + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:11 +msgid "" +":c:func:`!_PyLong_FromDigits` and :c:func:`!_PyLong_New`: use " +":c:func:`PyLongWriter_Create`." +msgstr "" +":c:func:`!_PyLong_FromDigits` 和 :c:func:`!_PyLong_New`: 使用 " +":c:func:`PyLongWriter_Create`." + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:13 +msgid "" +":c:func:`!_PyThreadState_UncheckedGet`: use " +":c:func:`PyThreadState_GetUnchecked`." +msgstr "" +":c:func:`!_PyThreadState_UncheckedGet`: 使用 " +":c:func:`PyThreadState_GetUnchecked`." + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:14 +msgid ":c:func:`!_PyUnicode_AsString`: use :c:func:`PyUnicode_AsUTF8`." +msgstr ":c:func:`!_PyUnicode_AsString`: 使用 :c:func:`PyUnicode_AsUTF8`。" + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:15 +msgid "" +":c:func:`!_PyUnicodeWriter_Init`: replace ``_PyUnicodeWriter_Init(&writer)``" +" with :c:func:`writer = PyUnicodeWriter_Create(0) `." +msgstr "" +":c:func:`!_PyUnicodeWriter_Init`: 将 ``_PyUnicodeWriter_Init(&writer)`` 替换为 " +":c:func:`writer = PyUnicodeWriter_Create(0) `." + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:18 +msgid "" +":c:func:`!_PyUnicodeWriter_Finish`: replace " +"``_PyUnicodeWriter_Finish(&writer)`` with " +":c:func:`PyUnicodeWriter_Finish(writer) `." +msgstr "" +":c:func:`!_PyUnicodeWriter_Finish`: 将 ``_PyUnicodeWriter_Finish(&writer)`` " +"替换为 :c:func:`PyUnicodeWriter_Finish(writer) `。" + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:21 +msgid "" +":c:func:`!_PyUnicodeWriter_Dealloc`: replace " +"``_PyUnicodeWriter_Dealloc(&writer)`` with " +":c:func:`PyUnicodeWriter_Discard(writer) `." +msgstr "" +":c:func:`!_PyUnicodeWriter_Dealloc`: 将 ``_PyUnicodeWriter_Dealloc(&writer)``" +" 替换为 :c:func:`PyUnicodeWriter_Discard(writer) `。" + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:24 +msgid "" +":c:func:`!_PyUnicodeWriter_WriteChar`: replace " +"``_PyUnicodeWriter_WriteChar(&writer, ch)`` with " +":c:func:`PyUnicodeWriter_WriteChar(writer, ch) `." +msgstr "" +":c:func:`!_PyUnicodeWriter_WriteChar`: 将 " +"``_PyUnicodeWriter_WriteChar(&writer, ch)`` 替换为 " +":c:func:`PyUnicodeWriter_WriteChar(writer, ch) `." + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:27 +msgid "" +":c:func:`!_PyUnicodeWriter_WriteStr`: replace " +"``_PyUnicodeWriter_WriteStr(&writer, str)`` with " +":c:func:`PyUnicodeWriter_WriteStr(writer, str) `." +msgstr "" +":c:func:`!_PyUnicodeWriter_WriteStr`: 将 ``_PyUnicodeWriter_WriteStr(&writer," +" str)`` 替换为 :c:func:`PyUnicodeWriter_WriteStr(writer, str) " +"`." + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:30 +msgid "" +":c:func:`!_PyUnicodeWriter_WriteSubstring`: replace " +"``_PyUnicodeWriter_WriteSubstring(&writer, str, start, end)`` with " +":c:func:`PyUnicodeWriter_WriteSubstring(writer, str, start, end) " +"`." +msgstr "" +":c:func:`!_PyUnicodeWriter_WriteSubstring`: 将 " +"``_PyUnicodeWriter_WriteSubstring(&writer, str, start, end)`` 替换为 " +":c:func:`PyUnicodeWriter_WriteSubstring(writer, str, start, end) " +"`." + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:33 +msgid "" +":c:func:`!_PyUnicodeWriter_WriteASCIIString`: replace " +"``_PyUnicodeWriter_WriteASCIIString(&writer, str)`` with " +":c:func:`PyUnicodeWriter_WriteASCII(writer, str) " +"`." +msgstr "" +":c:func:`!_PyUnicodeWriter_WriteASCIIString`: 将 " +"``_PyUnicodeWriter_WriteASCIIString(&writer, str)`` 替换为 " +":c:func:`PyUnicodeWriter_WriteASCII(writer, str) " +"`." + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:36 +msgid "" +":c:func:`!_PyUnicodeWriter_WriteLatin1String`: replace " +"``_PyUnicodeWriter_WriteLatin1String(&writer, str)`` with " +":c:func:`PyUnicodeWriter_WriteUTF8(writer, str) " +"`." +msgstr "" +":c:func:`!_PyUnicodeWriter_WriteLatin1String`: 将 " +"``_PyUnicodeWriter_WriteLatin1String(&writer, str)`` 替换为 " +":c:func:`PyUnicodeWriter_WriteUTF8(writer, str) " +"`." + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:39 +msgid ":c:func:`!_PyUnicodeWriter_Prepare`: (no replacement)." +msgstr ":c:func:`!_PyUnicodeWriter_Prepare`: (无替代)。" + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:40 +msgid ":c:func:`!_PyUnicodeWriter_PrepareKind`: (no replacement)." +msgstr ":c:func:`!_PyUnicodeWriter_PrepareKind`: (无替代)。" + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:41 +msgid ":c:func:`!_Py_HashPointer`: use :c:func:`Py_HashPointer`." +msgstr ":c:func:`!_Py_HashPointer`: 使用 :c:func:`Py_HashPointer`。" + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:42 +msgid ":c:func:`!_Py_fopen_obj`: use :c:func:`Py_fopen`." +msgstr ":c:func:`!_Py_fopen_obj`: 使用 :c:func:`Py_fopen`。" + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:44 +msgid "" +"The `pythoncapi-compat project `__ can be used to get these new public functions on Python 3.13 and" +" older. (Contributed by Victor Stinner in :gh:`128863`.)" +msgstr "" +"`pythoncapi-compat 项目 `__ " +"可被用于在 Python 3.13 及更早版本中获取这些新的公有函数。 (由 Victor Stinner 在 :gh:`128863` 中贡献。)" diff --git a/deprecations/c-api-pending-removal-in-future.po b/deprecations/c-api-pending-removal-in-future.po new file mode 100644 index 0000000000..3addbf147f --- /dev/null +++ b/deprecations/c-api-pending-removal-in-future.po @@ -0,0 +1,128 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:2 +msgid "Pending removal in future versions" +msgstr "计划在未来版本中移除" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:4 +msgid "" +"The following APIs are deprecated and will be removed, although there is " +"currently no date scheduled for their removal." +msgstr "以下 API 已被弃用,将被移除,但目前尚未确定移除日期。" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:7 +msgid ":c:macro:`Py_TPFLAGS_HAVE_FINALIZE`: Unneeded since Python 3.8." +msgstr ":c:macro:`Py_TPFLAGS_HAVE_FINALIZE`: 自 Python 3.8 起不再需要。" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:9 +msgid ":c:func:`PyErr_Fetch`: Use :c:func:`PyErr_GetRaisedException` instead." +msgstr ":c:func:`PyErr_Fetch`: 改用 :c:func:`PyErr_GetRaisedException`。" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:11 +msgid "" +":c:func:`PyErr_NormalizeException`: Use :c:func:`PyErr_GetRaisedException` " +"instead." +msgstr "" +":c:func:`PyErr_NormalizeException`: 改用 :c:func:`PyErr_GetRaisedException`。" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:13 +msgid "" +":c:func:`PyErr_Restore`: Use :c:func:`PyErr_SetRaisedException` instead." +msgstr ":c:func:`PyErr_Restore`: 改用 :c:func:`PyErr_SetRaisedException`。" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:15 +msgid "" +":c:func:`PyModule_GetFilename`: Use :c:func:`PyModule_GetFilenameObject` " +"instead." +msgstr "" +":c:func:`PyModule_GetFilename`: 改用 :c:func:`PyModule_GetFilenameObject`。" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:17 +msgid ":c:func:`PyOS_AfterFork`: Use :c:func:`PyOS_AfterFork_Child` instead." +msgstr ":c:func:`PyOS_AfterFork`: 改用 :c:func:`PyOS_AfterFork_Child`。" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:19 +msgid "" +":c:func:`PySlice_GetIndicesEx`: Use :c:func:`PySlice_Unpack` and " +":c:func:`PySlice_AdjustIndices` instead." +msgstr "" +":c:func:`PySlice_GetIndicesEx`: 改用 :c:func:`PySlice_Unpack` 和 " +":c:func:`PySlice_AdjustIndices`." + +#: ../../deprecations/c-api-pending-removal-in-future.rst:21 +msgid ":c:func:`PyUnicode_READY`: Unneeded since Python 3.12" +msgstr ":c:func:`PyUnicode_READY`: 自 Python 3.12 起不再需要" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:23 +msgid "" +":c:func:`!PyErr_Display`: Use :c:func:`PyErr_DisplayException` instead." +msgstr ":c:func:`!PyErr_Display`: 改用 :c:func:`PyErr_DisplayException`。" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:25 +msgid "" +":c:func:`!_PyErr_ChainExceptions`: Use :c:func:`!_PyErr_ChainExceptions1` " +"instead." +msgstr "" +":c:func:`!_PyErr_ChainExceptions`: 改用 :c:func:`!_PyErr_ChainExceptions1`。" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:27 +msgid "" +":c:member:`!PyBytesObject.ob_shash` member: call :c:func:`PyObject_Hash` " +"instead." +msgstr ":c:member:`!PyBytesObject.ob_shash` 成员:改为调用 :c:func:`PyObject_Hash`。" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:29 +msgid "Thread Local Storage (TLS) API:" +msgstr "线程本地存储 (TLS) API:" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:31 +msgid "" +":c:func:`PyThread_create_key`: Use :c:func:`PyThread_tss_alloc` instead." +msgstr ":c:func:`PyThread_create_key`: 改用 :c:func:`PyThread_tss_alloc`。" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:33 +msgid "" +":c:func:`PyThread_delete_key`: Use :c:func:`PyThread_tss_free` instead." +msgstr ":c:func:`PyThread_delete_key`: 改用 :c:func:`PyThread_tss_free`。" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:35 +msgid "" +":c:func:`PyThread_set_key_value`: Use :c:func:`PyThread_tss_set` instead." +msgstr ":c:func:`PyThread_set_key_value`: 改用 :c:func:`PyThread_tss_set`。" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:37 +msgid "" +":c:func:`PyThread_get_key_value`: Use :c:func:`PyThread_tss_get` instead." +msgstr ":c:func:`PyThread_get_key_value`: 改用 :c:func:`PyThread_tss_get`。" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:39 +msgid "" +":c:func:`PyThread_delete_key_value`: Use :c:func:`PyThread_tss_delete` " +"instead." +msgstr "" +":c:func:`PyThread_delete_key_value`: 改用 :c:func:`PyThread_tss_delete`。" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:41 +msgid ":c:func:`PyThread_ReInitTLS`: Unneeded since Python 3.7." +msgstr ":c:func:`PyThread_ReInitTLS`: 自 Python 3.7 起不再需要。" diff --git a/deprecations/index.po b/deprecations/index.po new file mode 100644 index 0000000000..9aabf0c2cd --- /dev/null +++ b/deprecations/index.po @@ -0,0 +1,1565 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-06-11 18:32+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../deprecations/index.rst:2 +msgid "Deprecations" +msgstr "弃用" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:2 +#: ../../deprecations/pending-removal-in-3.15.rst:2 +msgid "Pending removal in Python 3.15" +msgstr "计划在 Python 3.15 中移除" + +#: ../../deprecations/pending-removal-in-3.15.rst:4 +#: ../../deprecations/pending-removal-in-3.16.rst:4 +msgid "The import system:" +msgstr "导入系统:" + +#: ../../deprecations/pending-removal-in-3.15.rst:6 +msgid "" +"Setting :attr:`~module.__cached__` on a module while failing to set " +":attr:`__spec__.cached ` is " +"deprecated. In Python 3.15, :attr:`!__cached__` will cease to be set or take" +" into consideration by the import system or standard library. (:gh:`97879`)" +msgstr "" +"当设置 :attr:`__spec__.cached ` " +"失败时在模块上设置 :attr:`~module.__cached__` 的做法已被弃用。在 Python 3.15 " +"中,:attr:`!__cached__` 将不会再被导入系统或标准库纳入考虑。 (:gh:`97879`)" + +#: ../../deprecations/pending-removal-in-3.15.rst:11 +msgid "" +"Setting :attr:`~module.__package__` on a module while failing to set " +":attr:`__spec__.parent ` is " +"deprecated. In Python 3.15, :attr:`!__package__` will cease to be set or " +"take into consideration by the import system or standard library. " +"(:gh:`97879`)" +msgstr "" +"当设置 :attr:`__spec__.parent ` " +"失败时在模块上设置 :attr:`~module.__package__` 的做法已被弃用。在 Python 3.15 " +"中,:attr:`!__package__` 将不会再被导入系统或标准库纳入考虑。 (:gh:`97879`)" + +#: ../../deprecations/pending-removal-in-3.15.rst:16 +#: ../../deprecations/pending-removal-in-3.19.rst:4 +msgid ":mod:`ctypes`:" +msgstr ":mod:`ctypes`:" + +#: ../../deprecations/pending-removal-in-3.15.rst:18 +msgid "" +"The undocumented :func:`!ctypes.SetPointerType` function has been deprecated" +" since Python 3.13." +msgstr "未写入文档的 :func:`!ctypes.SetPointerType` 函数自 Python 3.13 起已被弃用。" + +#: ../../deprecations/pending-removal-in-3.15.rst:21 +msgid ":mod:`http.server`:" +msgstr ":mod:`http.server`:" + +#: ../../deprecations/pending-removal-in-3.15.rst:23 +msgid "" +"The obsolete and rarely used :class:`~http.server.CGIHTTPRequestHandler` has" +" been deprecated since Python 3.13. No direct replacement exists. *Anything*" +" is better than CGI to interface a web server with a request handler." +msgstr "" +"过时且很少被使用的 :class:`~http.server.CGIHTTPRequestHandler` 自 Python 3.13 " +"起已被弃用。不存在直接的替代品。对于建立带有请求处理器的 Web 服务程序来说 *任何东西* 都比 CGI 要好。" + +#: ../../deprecations/pending-removal-in-3.15.rst:29 +msgid "" +"The :option:`!--cgi` flag to the :program:`python -m http.server` command-" +"line interface has been deprecated since Python 3.13." +msgstr "" +"用于 :program:`python -m http.server` 命令行界面的 :option:`!--cgi` 旗标自 Python 3.13 " +"起已被弃用。" + +#: ../../deprecations/pending-removal-in-3.15.rst:32 +#: ../../deprecations/pending-removal-in-future.rst:62 +msgid ":mod:`importlib`:" +msgstr ":mod:`importlib`:" + +#: ../../deprecations/pending-removal-in-3.15.rst:34 +msgid "``load_module()`` method: use ``exec_module()`` instead." +msgstr "``load_module()`` 方法:改用 ``exec_module()``。" + +#: ../../deprecations/pending-removal-in-3.15.rst:36 +msgid ":mod:`pathlib`:" +msgstr ":mod:`pathlib`:" + +#: ../../deprecations/pending-removal-in-3.15.rst:38 +msgid "" +":meth:`.PurePath.is_reserved` has been deprecated since Python 3.13. Use " +":func:`os.path.isreserved` to detect reserved paths on Windows." +msgstr "" +":meth:`.PurePath.is_reserved` 自 Python 3.13 起已被弃用。请使用 " +":func:`os.path.isreserved` 来检测 Windows 上的保留路径。" + +#: ../../deprecations/pending-removal-in-3.15.rst:42 +msgid ":mod:`platform`:" +msgstr ":mod:`platform`:" + +#: ../../deprecations/pending-removal-in-3.15.rst:44 +msgid "" +":func:`~platform.java_ver` has been deprecated since Python 3.13. This " +"function is only useful for Jython support, has a confusing API, and is " +"largely untested." +msgstr "" +":func:`~platform.java_ver` 自 Python 3.13 起已被弃用。此函数仅对 Jython 支持有用,具有令人困惑的 " +"API,并且大部分未经测试。" + +#: ../../deprecations/pending-removal-in-3.15.rst:48 +#: ../../deprecations/pending-removal-in-3.16.rst:96 +msgid ":mod:`sysconfig`:" +msgstr ":mod:`sysconfig`:" + +#: ../../deprecations/pending-removal-in-3.15.rst:50 +msgid "" +"The *check_home* argument of :func:`sysconfig.is_python_build` has been " +"deprecated since Python 3.12." +msgstr "" +":func:`sysconfig.is_python_build` 的 *check_home* 参数自 Python 3.12 起已被弃用。" + +#: ../../deprecations/pending-removal-in-3.15.rst:53 +msgid ":mod:`threading`:" +msgstr ":mod:`threading`:" + +#: ../../deprecations/pending-removal-in-3.15.rst:55 +msgid "" +":func:`~threading.RLock` will take no arguments in Python 3.15. Passing any " +"arguments has been deprecated since Python 3.14, as the Python version does " +"not permit any arguments, but the C version allows any number of positional " +"or keyword arguments, ignoring every argument." +msgstr "" +" Python 3.15 中 :func:`~threading.RLock` 将不再接受参数。 传入参数的做法自 Python 3.14 " +"起已被弃用,因为 Python 版本不允许任何参数,但 C 版本允许任意数量的位置或关键字参数,但会忽略所有参数。" + +#: ../../deprecations/pending-removal-in-3.15.rst:61 +msgid ":mod:`types`:" +msgstr ":mod:`types`:" + +#: ../../deprecations/pending-removal-in-3.15.rst:63 +msgid "" +":class:`types.CodeType`: Accessing :attr:`~codeobject.co_lnotab` was " +"deprecated in :pep:`626` since 3.10 and was planned to be removed in 3.12, " +"but it only got a proper :exc:`DeprecationWarning` in 3.12. May be removed " +"in 3.15. (Contributed by Nikita Sobolev in :gh:`101866`.)" +msgstr "" +":class:`types.CodeType`: 访问 :attr:`~codeobject.co_lnotab` 的做法自 3.10 起已根据 " +":pep:`626` 被弃用并曾计划在 3.12 中移除,但在 3.12 中实际仅设置了 :exc:`DeprecationWarning`。可能会在 " +"3.15 中移除。 (由 Nikita Sobolev 在 :gh:`101866` 中贡献。)" + +#: ../../deprecations/pending-removal-in-3.15.rst:70 +#: ../../deprecations/pending-removal-in-3.17.rst:26 +msgid ":mod:`typing`:" +msgstr ":mod:`typing`:" + +#: ../../deprecations/pending-removal-in-3.15.rst:72 +msgid "" +"The undocumented keyword argument syntax for creating " +":class:`~typing.NamedTuple` classes (for example, ``Point = " +"NamedTuple(\"Point\", x=int, y=int)``) has been deprecated since Python " +"3.13. Use the class-based syntax or the functional syntax instead." +msgstr "" +"未写入文档的用于创建 :class:`~typing.NamedTuple` 类的关键字参数语法 (例如 ``Point = " +"NamedTuple(\"Point\", x=int, y=int)``) 自 Python 3.13 起已被弃用。 请改用基于类的语法或函数语法。" + +#: ../../deprecations/pending-removal-in-3.15.rst:78 +msgid "" +"When using the functional syntax of :class:`~typing.TypedDict`\\s, failing " +"to pass a value to the *fields* parameter (``TD = TypedDict(\"TD\")``) or " +"passing ``None`` (``TD = TypedDict(\"TD\", None)``) has been deprecated " +"since Python 3.13. Use ``class TD(TypedDict): pass`` or ``TD = " +"TypedDict(\"TD\", {})`` to create a TypedDict with zero field." +msgstr "" +"当使用 :class:`~typing.TypedDict` 的函数式语法时,不向 *fields* 形参传递值 (``TD = " +"TypedDict(\"TD\")``) 或传递 ``None`` (``TD = TypedDict(\"TD\", None)``) 的做法自 " +"Python 3.13 起已被弃用。请改用 ``class TD(TypedDict): pass`` 或 ``TD = " +"TypedDict(\"TD\", {})`` 来创建一个零字段的 TypedDict。" + +#: ../../deprecations/pending-removal-in-3.15.rst:85 +msgid "" +"The :func:`typing.no_type_check_decorator` decorator function has been " +"deprecated since Python 3.13. After eight years in the :mod:`typing` module," +" it has yet to be supported by any major type checker." +msgstr "" +":func:`typing.no_type_check_decorator` 装饰器自 Python 3.13 起已被弃用。存在于 " +":mod:`typing` 模块八年之后,它仍未被任何主要类型检查器所支持。" + +#: ../../deprecations/pending-removal-in-3.15.rst:90 +msgid ":mod:`wave`:" +msgstr ":mod:`wave`:" + +#: ../../deprecations/pending-removal-in-3.15.rst:92 +msgid "" +"The :meth:`~wave.Wave_read.getmark`, :meth:`!setmark`, and " +":meth:`~wave.Wave_read.getmarkers` methods of the :class:`~wave.Wave_read` " +"and :class:`~wave.Wave_write` classes have been deprecated since Python " +"3.13." +msgstr "" +":class:`~wave.Wave_read` 和 :class:`~wave.Wave_write` 类的 " +":meth:`~wave.Wave_read.getmark`, :meth:`!setmark` 和 " +":meth:`~wave.Wave_read.getmarkers` 方法自 Python 3.13 起已被弃用。" + +#: ../../deprecations/pending-removal-in-3.15.rst:97 +msgid ":mod:`zipimport`:" +msgstr ":mod:`zipimport`:" + +#: ../../deprecations/pending-removal-in-3.15.rst:99 +msgid "" +":meth:`~zipimport.zipimporter.load_module` has been deprecated since Python " +"3.10. Use :meth:`~zipimport.zipimporter.exec_module` instead. (Contributed " +"by Jiahao Li in :gh:`125746`.)" +msgstr "" +":meth:`~zipimport.zipimporter.load_module` 自 Python 3.10 起已被弃用。请改用 :meth:`~zipimport.zipimporter.exec_module`。\n" +"(由李佳昊在 :gh:`125746` 中贡献。)" + +#: ../../deprecations/pending-removal-in-3.16.rst:2 +msgid "Pending removal in Python 3.16" +msgstr "计划在 Python 3.16 中移除" + +#: ../../deprecations/pending-removal-in-3.16.rst:6 +msgid "" +"Setting :attr:`~module.__loader__` on a module while failing to set " +":attr:`__spec__.loader ` is " +"deprecated. In Python 3.16, :attr:`!__loader__` will cease to be set or " +"taken into consideration by the import system or the standard library." +msgstr "" +"当设置 :attr:`__spec__.loader ` " +"失败时在模块上设置 :attr:`~module.__loader__` 的做法已被弃用。在 Python 3.16 " +"中,:attr:`!__loader__` 将不会再被设置或是被导入系统或标准库纳入考虑。" + +#: ../../deprecations/pending-removal-in-3.16.rst:11 +msgid ":mod:`array`:" +msgstr ":mod:`array`:" + +#: ../../deprecations/pending-removal-in-3.16.rst:13 +msgid "" +"The ``'u'`` format code (:c:type:`wchar_t`) has been deprecated in " +"documentation since Python 3.3 and at runtime since Python 3.13. Use the " +"``'w'`` format code (:c:type:`Py_UCS4`) for Unicode characters instead." +msgstr "" +"``'u'`` 格式代码 (:c:type:`wchar_t`) 自 Python 3.3 起已在文档中弃用并自 Python 3.13 " +"起在运行时弃用。对于 Unicode 字符请改用 ``'w'`` 格式代码 (:c:type:`Py_UCS4`)。" + +#: ../../deprecations/pending-removal-in-3.16.rst:19 +msgid ":mod:`asyncio`:" +msgstr ":mod:`asyncio`:" + +#: ../../deprecations/pending-removal-in-3.16.rst:21 +msgid "" +":func:`!asyncio.iscoroutinefunction` is deprecated and will be removed in " +"Python 3.16; use :func:`inspect.iscoroutinefunction` instead. (Contributed " +"by Jiahao Li and Kumar Aditya in :gh:`122875`.)" +msgstr "" +":func:`!asyncio.iscoroutinefunction` 已被弃用并将在 Python 3.16 中移除,请改用 :func:`inspect.iscoroutinefunction`。\n" +"(由李佳昊和 Kumar Aditya 在 :gh:`122875` 中贡献。)" + +#: ../../deprecations/pending-removal-in-3.16.rst:26 +msgid "" +":mod:`asyncio` policy system is deprecated and will be removed in Python " +"3.16. In particular, the following classes and functions are deprecated:" +msgstr ":mod:`asyncio` 策略系统已被弃用并将在 Python 3.16 中移除。具体而言,是弃用了下列类和函数:" + +#: ../../deprecations/pending-removal-in-3.16.rst:29 +msgid ":class:`asyncio.AbstractEventLoopPolicy`" +msgstr ":class:`asyncio.AbstractEventLoopPolicy`" + +#: ../../deprecations/pending-removal-in-3.16.rst:30 +msgid ":class:`asyncio.DefaultEventLoopPolicy`" +msgstr ":class:`asyncio.DefaultEventLoopPolicy`" + +#: ../../deprecations/pending-removal-in-3.16.rst:31 +msgid ":class:`asyncio.WindowsSelectorEventLoopPolicy`" +msgstr ":class:`asyncio.WindowsSelectorEventLoopPolicy`" + +#: ../../deprecations/pending-removal-in-3.16.rst:32 +msgid ":class:`asyncio.WindowsProactorEventLoopPolicy`" +msgstr ":class:`asyncio.WindowsProactorEventLoopPolicy`" + +#: ../../deprecations/pending-removal-in-3.16.rst:33 +msgid ":func:`asyncio.get_event_loop_policy`" +msgstr ":func:`asyncio.get_event_loop_policy`" + +#: ../../deprecations/pending-removal-in-3.16.rst:34 +msgid ":func:`asyncio.set_event_loop_policy`" +msgstr ":func:`asyncio.set_event_loop_policy`" + +#: ../../deprecations/pending-removal-in-3.16.rst:36 +msgid "" +"Users should use :func:`asyncio.run` or :class:`asyncio.Runner` with " +"*loop_factory* to use the desired event loop implementation." +msgstr "" +"用户应当使用 :func:`asyncio.run` 或 :class:`asyncio.Runner` 并附带 *loop_factory* " +"以使用想要的事件循环实现。" + +#: ../../deprecations/pending-removal-in-3.16.rst:39 +msgid "For example, to use :class:`asyncio.SelectorEventLoop` on Windows::" +msgstr "例如,在 Windows 上使用 :class:`asyncio.SelectorEventLoop`::" + +#: ../../deprecations/pending-removal-in-3.16.rst:41 +msgid "" +"import asyncio\n" +"\n" +"async def main():\n" +" ...\n" +"\n" +"asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop)" +msgstr "" +"import asyncio\n" +"\n" +"async def main():\n" +" ...\n" +"\n" +"asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop)" + +#: ../../deprecations/pending-removal-in-3.16.rst:48 +msgid "(Contributed by Kumar Aditya in :gh:`127949`.)" +msgstr "(由 Kumar Aditya 在 :gh:`127949` 中贡献。)" + +#: ../../deprecations/pending-removal-in-3.16.rst:50 +#: ../../deprecations/pending-removal-in-future.rst:16 +msgid ":mod:`builtins`:" +msgstr ":mod:`builtins`:" + +#: ../../deprecations/pending-removal-in-3.16.rst:52 +msgid "" +"Bitwise inversion on boolean types, ``~True`` or ``~False`` has been " +"deprecated since Python 3.12, as it produces surprising and unintuitive " +"results (``-2`` and ``-1``). Use ``not x`` instead for the logical negation " +"of a Boolean. In the rare case that you need the bitwise inversion of the " +"underlying integer, convert to ``int`` explicitly (``~int(x)``)." +msgstr "" +"对布尔类型 ``~True`` 或 ``~False`` 执行按位取反的操作自 Python 3.12 起已被弃用,因为它会产生奇怪和不直观的结果 " +"(``-2`` 和 ``-1``)。请改用 ``not x`` " +"来对布尔值执行逻辑否操作。对于需要对下层整数执行按位取反操作的少数场合,请显式地将其转换为 ``int`` (``~int(x)``)。" + +#: ../../deprecations/pending-removal-in-3.16.rst:59 +msgid ":mod:`functools`:" +msgstr ":mod:`functools`:" + +#: ../../deprecations/pending-removal-in-3.16.rst:61 +msgid "" +"Calling the Python implementation of :func:`functools.reduce` with " +"*function* or *sequence* as keyword arguments has been deprecated since " +"Python 3.14." +msgstr "" +"调用 :func:`functools.reduce` 的 Python 实现并传入 *function* 或 *sequence* " +"作为关键字参数的做法自 Python 3.14 起已被弃用。" + +#: ../../deprecations/pending-removal-in-3.16.rst:64 +msgid ":mod:`logging`:" +msgstr ":mod:`logging`:" + +#: ../../deprecations/pending-removal-in-3.16.rst:66 +msgid "" +"Support for custom logging handlers with the *strm* argument is deprecated " +"and scheduled for removal in Python 3.16. Define handlers with the *stream* " +"argument instead. (Contributed by Mariusz Felisiak in :gh:`115032`.)" +msgstr "" +"使用 *strm* 参数对自定义日志记录处理器提供支持的做法已被弃用并计划在 Python 3.16 中移除。改为使用 *stream* " +"参数定义处理器。 (由 Mariusz Felisiak 在 :gh:`115032` 中贡献。)" + +#: ../../deprecations/pending-removal-in-3.16.rst:70 +msgid ":mod:`mimetypes`:" +msgstr ":mod:`mimetypes`:" + +#: ../../deprecations/pending-removal-in-3.16.rst:72 +msgid "" +"Valid extensions start with a '.' or are empty for " +":meth:`mimetypes.MimeTypes.add_type`. Undotted extensions are deprecated and" +" will raise a :exc:`ValueError` in Python 3.16. (Contributed by Hugo van " +"Kemenade in :gh:`75223`.)" +msgstr "" +"有效扩展以 \".\" 开头或在 :meth:`mimetypes.MimeTypes.add_type` 中为空。未加点的扩展已弃用,在 Python" +" 3.16 中将引发 :exc:`ValueError`。 (由 Hugo van Kemenade 在 :gh:`75223` 中贡献。)" + +#: ../../deprecations/pending-removal-in-3.16.rst:78 +msgid ":mod:`shutil`:" +msgstr ":mod:`shutil`:" + +#: ../../deprecations/pending-removal-in-3.16.rst:80 +msgid "" +"The :class:`!ExecError` exception has been deprecated since Python 3.14. It " +"has not been used by any function in :mod:`!shutil` since Python 3.4, and is" +" now an alias of :exc:`RuntimeError`." +msgstr "" +":class:`!ExecError` 异常自 Python 3.14 起已被弃用。它自 Python 3.4 起就未被 :mod:`!shutil` " +"中的任何函数所使用,现在是 :exc:`RuntimeError` 的一个别名。" + +#: ../../deprecations/pending-removal-in-3.16.rst:85 +msgid ":mod:`symtable`:" +msgstr ":mod:`symtable`:" + +#: ../../deprecations/pending-removal-in-3.16.rst:87 +msgid "" +"The :meth:`Class.get_methods ` method has been " +"deprecated since Python 3.14." +msgstr "" +":meth:`Class.get_methods ` 方法自 Python 3.14 起被弃用。" + +#: ../../deprecations/pending-removal-in-3.16.rst:90 +msgid ":mod:`sys`:" +msgstr ":mod:`sys`:" + +#: ../../deprecations/pending-removal-in-3.16.rst:92 +msgid "" +"The :func:`~sys._enablelegacywindowsfsencoding` function has been deprecated" +" since Python 3.13. Use the :envvar:`PYTHONLEGACYWINDOWSFSENCODING` " +"environment variable instead." +msgstr "" +":func:`~sys._enablelegacywindowsfsencoding` 函数自 Python 3.13 起被弃用。请改用 " +":envvar:`PYTHONLEGACYWINDOWSFSENCODING` 环境变量。" + +#: ../../deprecations/pending-removal-in-3.16.rst:98 +msgid "" +"The :func:`!sysconfig.expand_makefile_vars` function has been deprecated " +"since Python 3.14. Use the ``vars`` argument of :func:`sysconfig.get_paths` " +"instead." +msgstr "" +"自 Python 3.14 起,:func:`!sysconfig.expand_makefile_vars` 函数已被弃用。请使用 " +":func:`sysconfig.get_paths` 的 ``vars`` 参数代替。" + +#: ../../deprecations/pending-removal-in-3.16.rst:102 +msgid ":mod:`tarfile`:" +msgstr ":mod:`tarfile`:" + +#: ../../deprecations/pending-removal-in-3.16.rst:104 +msgid "" +"The undocumented and unused :attr:`!TarFile.tarfile` attribute has been " +"deprecated since Python 3.13." +msgstr "未写入文档也未被使用的 :attr:`!TarFile.tarfile` 属性自 Python 3.13 起被弃用。" + +#: ../../deprecations/pending-removal-in-3.17.rst:2 +msgid "Pending removal in Python 3.17" +msgstr "计划在 Python 3.17 中移除" + +#: ../../deprecations/pending-removal-in-3.17.rst:4 +msgid ":mod:`collections.abc`:" +msgstr ":mod:`collections.abc`:" + +#: ../../deprecations/pending-removal-in-3.17.rst:6 +msgid "" +":class:`collections.abc.ByteString` is scheduled for removal in Python 3.17." +msgstr ":class:`collections.abc.ByteString` 计划在 Python 3.17 中移除。" + +#: ../../deprecations/pending-removal-in-3.17.rst:8 +#: ../../deprecations/pending-removal-in-3.17.rst:36 +msgid "" +"Use ``isinstance(obj, collections.abc.Buffer)`` to test if ``obj`` " +"implements the :ref:`buffer protocol ` at runtime. For use in" +" type annotations, either use :class:`~collections.abc.Buffer` or a union " +"that explicitly specifies the types your code supports (e.g., ``bytes | " +"bytearray | memoryview``)." +msgstr "" +"使用 ``isinstance(obj, collections.abc.Buffer)`` 来测试 ``obj`` 是否在运行时实现了 " +":ref:`缓冲区协议 `。要用于类型标注,则使用 :class:`~collections.abc.Buffer` " +"或是显式指明你的代码所支持类型的并集 (例如 ``bytes | bytearray | memoryview``)。" + +#: ../../deprecations/pending-removal-in-3.17.rst:14 +#: ../../deprecations/pending-removal-in-3.17.rst:42 +msgid "" +":class:`!ByteString` was originally intended to be an abstract class that " +"would serve as a supertype of both :class:`bytes` and :class:`bytearray`. " +"However, since the ABC never had any methods, knowing that an object was an " +"instance of :class:`!ByteString` never actually told you anything useful " +"about the object. Other common buffer types such as :class:`memoryview` were" +" also never understood as subtypes of :class:`!ByteString` (either at " +"runtime or by static type checkers)." +msgstr "" +":class:`!ByteString` 原本是想作为 :class:`bytes` 和 :class:`bytearray` 的超类型的抽象基类提供。" +" 不过,由于该 ABC 从未有任何方法,知道一个对象是 :class:`!ByteString` " +"的实例并不能真正告诉你有关该对象的任何有用信息。其他常见缓冲区类型如 :class:`memoryview` 同样不能被当作是 " +":class:`!ByteString` 的子类型(无论是在运行时还是对于静态类型检查器)。" + +#: ../../deprecations/pending-removal-in-3.17.rst:22 +#: ../../deprecations/pending-removal-in-3.17.rst:50 +msgid "" +"See :pep:`PEP 688 <688#current-options>` for more details. (Contributed by " +"Shantanu Jain in :gh:`91896`.)" +msgstr "" +"请参阅 :pep:`PEP 688 <688#current-options>` 了解详情。 (由 Shantanu Jain 在 " +":gh:`91896` 中贡献。)" + +#: ../../deprecations/pending-removal-in-3.17.rst:28 +msgid "" +"Before Python 3.14, old-style unions were implemented using the private " +"class ``typing._UnionGenericAlias``. This class is no longer needed for the " +"implementation, but it has been retained for backward compatibility, with " +"removal scheduled for Python 3.17. Users should use documented introspection" +" helpers like :func:`typing.get_origin` and :func:`typing.get_args` instead " +"of relying on private implementation details." +msgstr "" +"在 Python 3.14 之前,旧式的联合是通过私有类 ``typing._UnionGenericAlias`` " +"实现的。实现已不再需要该类,但为向后兼容性保留了该类,并计划在 Python 3.17 中删除。用户应使用记录在案的内省助手函数,如 " +":func:`typing.get_origin` 和 :func:`typing.get_args`,而不是依赖于私有的实现细节。" + +#: ../../deprecations/pending-removal-in-3.17.rst:33 +msgid "" +":class:`typing.ByteString`, deprecated since Python 3.9, is scheduled for " +"removal in Python 3.17." +msgstr ":class:`typing.ByteString` 自 Python 3.9 起已被弃用,计划在 Python 3.17 中移除。" + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:2 +#: ../../deprecations/pending-removal-in-3.18.rst:2 +msgid "Pending removal in Python 3.18" +msgstr "计划在 Python 3.18 中移除" + +#: ../../deprecations/pending-removal-in-3.18.rst:4 +msgid ":mod:`decimal`:" +msgstr ":mod:`decimal`:" + +#: ../../deprecations/pending-removal-in-3.18.rst:6 +msgid "" +"The non-standard and undocumented :class:`~decimal.Decimal` format specifier" +" ``'N'``, which is only supported in the :mod:`!decimal` module's C " +"implementation, has been deprecated since Python 3.13. (Contributed by " +"Serhiy Storchaka in :gh:`89902`.)" +msgstr "" +"非标准且未写入文档的 :class:`~decimal.Decimal` 格式说明符 ``'N'``,它仅在 :mod:`!decimal` 模块的 C" +" 实现中受到支持,自 Python 3.13 起已被弃用。 (由 Serhiy Storchaka 在 :gh:`89902` 中贡献。)" + +#: ../../deprecations/pending-removal-in-3.19.rst:2 +msgid "Pending removal in Python 3.19" +msgstr "计划在 Python 3.19 中移除" + +#: ../../deprecations/pending-removal-in-3.19.rst:6 +msgid "" +"Implicitly switching to the MSVC-compatible struct layout by setting " +":attr:`~ctypes.Structure._pack_` but not :attr:`~ctypes.Structure._layout_` " +"on non-Windows platforms." +msgstr "" +"在非 Windows 平台上,通过设置 :attr:`~ctypes.Structure._pack_` 而非 " +":attr:`~ctypes.Structure._layout_`,隐式切换到与 MSVC 兼容的结构布局。" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:2 +#: ../../deprecations/pending-removal-in-future.rst:2 +msgid "Pending removal in future versions" +msgstr "计划在未来版本中移除" + +#: ../../deprecations/pending-removal-in-future.rst:4 +msgid "" +"The following APIs will be removed in the future, although there is " +"currently no date scheduled for their removal." +msgstr "以下 API 将会被移除,尽管具体时间还未确定。" + +#: ../../deprecations/pending-removal-in-future.rst:7 +msgid ":mod:`argparse`:" +msgstr ":mod:`argparse`:" + +#: ../../deprecations/pending-removal-in-future.rst:9 +msgid "" +"Nesting argument groups and nesting mutually exclusive groups are " +"deprecated." +msgstr "嵌套参数组和嵌套互斥组已被弃用。" + +#: ../../deprecations/pending-removal-in-future.rst:11 +msgid "" +"Passing the undocumented keyword argument *prefix_chars* to " +":meth:`~argparse.ArgumentParser.add_argument_group` is now deprecated." +msgstr "" +"将未写入文档的关键字参数 *prefix_chars* 传递给 " +":meth:`~argparse.ArgumentParser.add_argument_group` 的做法现在已被弃用。" + +#: ../../deprecations/pending-removal-in-future.rst:14 +msgid "The :class:`argparse.FileType` type converter is deprecated." +msgstr ":class:`argparse.FileType` 类型转换器已弃用。" + +#: ../../deprecations/pending-removal-in-future.rst:18 +msgid "" +"Generators: ``throw(type, exc, tb)`` and ``athrow(type, exc, tb)`` signature" +" is deprecated: use ``throw(exc)`` and ``athrow(exc)`` instead, the single " +"argument signature." +msgstr "" +"生成器: ``throw(type, exc, tb)`` 和 ``athrow(type, exc, tb)`` 签名已被弃用:请改用 " +"``throw(exc)`` 和 ``athrow(exc)``,即单参数签名。" + +#: ../../deprecations/pending-removal-in-future.rst:21 +msgid "" +"Currently Python accepts numeric literals immediately followed by keywords, " +"for example ``0in x``, ``1or x``, ``0if 1else 2``. It allows confusing and " +"ambiguous expressions like ``[0x1for x in y]`` (which can be interpreted as " +"``[0x1 for x in y]`` or ``[0x1f or x in y]``). A syntax warning is raised " +"if the numeric literal is immediately followed by one of keywords " +":keyword:`and`, :keyword:`else`, :keyword:`for`, :keyword:`if`, " +":keyword:`in`, :keyword:`is` and :keyword:`or`. In a future release it will" +" be changed to a syntax error. (:gh:`87999`)" +msgstr "" +"目前 Python 接受数字类字面值后面紧跟关键字的写法,例如 ``0in x``, ``1or x``, ``0if 1else 2``。它允许像 " +"``[0x1for x in y]`` 这样令人困惑且有歧义的表达式 (它可以被解读为 ``[0x1 for x in y]`` 或者 ``[0x1f " +"or x in y]``)。如果数字类字面值后面紧跟关键字 :keyword:`and`, :keyword:`else`, " +":keyword:`for`, :keyword:`if`, :keyword:`in`, :keyword:`is` 和 :keyword:`or` " +"中的一个将会引发语法警告。在未来的版本中它将改为语法错误。 (:gh:`87999`)" + +#: ../../deprecations/pending-removal-in-future.rst:29 +msgid "" +"Support for ``__index__()`` and ``__int__()`` method returning non-int type:" +" these methods will be required to return an instance of a strict subclass " +"of :class:`int`." +msgstr "" +"对 ``__index__()`` 和 ``__int__()`` 方法返回非 int 类型的支持:将要求这些方法必须返回 :class:`int` " +"的子类的实例。" + +#: ../../deprecations/pending-removal-in-future.rst:32 +msgid "" +"Support for ``__float__()`` method returning a strict subclass of " +":class:`float`: these methods will be required to return an instance of " +":class:`float`." +msgstr "" +"对 ``__float__()`` 方法返回 :class:`float` 的子类的支持:将要求这些方法必须返回 :class:`float` 的实例。" + +#: ../../deprecations/pending-removal-in-future.rst:35 +msgid "" +"Support for ``__complex__()`` method returning a strict subclass of " +":class:`complex`: these methods will be required to return an instance of " +":class:`complex`." +msgstr "" +"对 ``__complex__()`` 方法返回 :class:`complex` 的子类的支持:将要求这些方法必须返回 " +":class:`complex` 的实例。" + +#: ../../deprecations/pending-removal-in-future.rst:38 +msgid "" +"Passing a complex number as the *real* or *imag* argument in the " +":func:`complex` constructor is now deprecated; it should only be passed as a" +" single positional argument. (Contributed by Serhiy Storchaka in " +":gh:`109218`.)" +msgstr "" +"传入一个复数作为 :func:`complex` 构造器中的 *real* 或 *imag* " +"参数的做法现在已被弃用;它应当仅作为单个位置参数被传入。(由 Serhiy Storchaka 在 :gh:`109218` 中贡献。)" + +#: ../../deprecations/pending-removal-in-future.rst:43 +msgid "" +":mod:`calendar`: ``calendar.January`` and ``calendar.February`` constants " +"are deprecated and replaced by :data:`calendar.JANUARY` and " +":data:`calendar.FEBRUARY`. (Contributed by Prince Roshan in :gh:`103636`.)" +msgstr "" +":mod:`calendar`: ``calendar.January`` 和 ``calendar.February`` 常量已被弃用并由 " +":data:`calendar.JANUARY` 和 :data:`calendar.FEBRUARY` 替代。 (由 Prince Roshan 在 " +":gh:`103636` 中贡献。)" + +#: ../../deprecations/pending-removal-in-future.rst:48 +msgid "" +":mod:`codecs`: use :func:`open` instead of :func:`codecs.open`. " +"(:gh:`133038`)" +msgstr "" +":mod:`codecs`: 请使用 :func:`open` 代替 :func:`codecs.open`。 (:gh:`133038`)" + +#: ../../deprecations/pending-removal-in-future.rst:50 +msgid "" +":attr:`codeobject.co_lnotab`: use the :meth:`codeobject.co_lines` method " +"instead." +msgstr ":attr:`codeobject.co_lnotab`: 改用 :meth:`codeobject.co_lines` 方法。" + +#: ../../deprecations/pending-removal-in-future.rst:53 +msgid ":mod:`datetime`:" +msgstr ":mod:`datetime`:" + +#: ../../deprecations/pending-removal-in-future.rst:55 +msgid "" +":meth:`~datetime.datetime.utcnow`: use " +"``datetime.datetime.now(tz=datetime.UTC)``." +msgstr "" +":meth:`~datetime.datetime.utcnow`: 使用 " +"``datetime.datetime.now(tz=datetime.UTC)``。" + +#: ../../deprecations/pending-removal-in-future.rst:57 +msgid "" +":meth:`~datetime.datetime.utcfromtimestamp`: use " +"``datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC)``." +msgstr "" +":meth:`~datetime.datetime.utcfromtimestamp`: 使用 " +"``datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC)``。" + +#: ../../deprecations/pending-removal-in-future.rst:60 +msgid ":mod:`gettext`: Plural value must be an integer." +msgstr ":mod:`gettext`: 复数值必须是一个整数。" + +#: ../../deprecations/pending-removal-in-future.rst:64 +msgid "" +":func:`~importlib.util.cache_from_source` *debug_override* parameter is " +"deprecated: use the *optimization* parameter instead." +msgstr "" +":func:`~importlib.util.cache_from_source` *debug_override* 形参已被弃用:改用 " +"*optimization* 形参。" + +#: ../../deprecations/pending-removal-in-future.rst:67 +msgid ":mod:`importlib.metadata`:" +msgstr ":mod:`importlib.metadata`:" + +#: ../../deprecations/pending-removal-in-future.rst:69 +msgid "``EntryPoints`` tuple interface." +msgstr "``EntryPoints`` 元组接口。" + +#: ../../deprecations/pending-removal-in-future.rst:70 +msgid "Implicit ``None`` on return values." +msgstr "返回值中隐式的 ``None``。" + +#: ../../deprecations/pending-removal-in-future.rst:72 +msgid "" +":mod:`logging`: the ``warn()`` method has been deprecated since Python 3.3, " +"use :meth:`~logging.warning` instead." +msgstr "" +":mod:`logging`: ``warn()`` 方法自 Python 3.3 起已被弃用,请改用 " +":meth:`~logging.warning`." + +#: ../../deprecations/pending-removal-in-future.rst:75 +msgid "" +":mod:`mailbox`: Use of StringIO input and text mode is deprecated, use " +"BytesIO and binary mode instead." +msgstr ":mod:`mailbox`: 对 StringIO 输入和文本模式的使用已被弃用,改用 BytesIO 和二进制模式。" + +#: ../../deprecations/pending-removal-in-future.rst:78 +msgid "" +":mod:`os`: Calling :func:`os.register_at_fork` in multi-threaded process." +msgstr ":mod:`os`: 在多线程的进程中调用 :func:`os.register_at_fork`。" + +#: ../../deprecations/pending-removal-in-future.rst:80 +msgid "" +":class:`!pydoc.ErrorDuringImport`: A tuple value for *exc_info* parameter is" +" deprecated, use an exception instance." +msgstr "" +":class:`!pydoc.ErrorDuringImport`: 使用元组值作为 *exc_info* 形参的做法已被弃用,应使用异常实例。" + +#: ../../deprecations/pending-removal-in-future.rst:83 +msgid "" +":mod:`re`: More strict rules are now applied for numerical group references " +"and group names in regular expressions. Only sequence of ASCII digits is " +"now accepted as a numerical reference. The group name in bytes patterns and" +" replacement strings can now only contain ASCII letters and digits and " +"underscore. (Contributed by Serhiy Storchaka in :gh:`91760`.)" +msgstr "" +":mod:`re`: 现在对于正则表达式中的数字分组引用和分组名称将应用更严格的规则。现在只接受 ASCII " +"数字序列作为数字引用。字节串模式和替换字符串中的分组名称现在只能包含 ASCII 字母和数字以及下划线。 (由 Serhiy Storchaka 在 " +":gh:`91760` 中贡献。)" + +#: ../../deprecations/pending-removal-in-future.rst:90 +msgid "" +":mod:`!sre_compile`, :mod:`!sre_constants` and :mod:`!sre_parse` modules." +msgstr ":mod:`!sre_compile`, :mod:`!sre_constants` 和 :mod:`!sre_parse` 模块。" + +#: ../../deprecations/pending-removal-in-future.rst:92 +msgid "" +":mod:`shutil`: :func:`~shutil.rmtree`'s *onerror* parameter is deprecated in" +" Python 3.12; use the *onexc* parameter instead." +msgstr "" +":mod:`shutil`: :func:`~shutil.rmtree` 的 *onerror* 形参在 Python 3.12 中已被弃用;请改用 " +"*onexc* 形参。" + +#: ../../deprecations/pending-removal-in-future.rst:95 +msgid ":mod:`ssl` options and protocols:" +msgstr ":mod:`ssl` 选项和协议:" + +#: ../../deprecations/pending-removal-in-future.rst:97 +msgid ":class:`ssl.SSLContext` without protocol argument is deprecated." +msgstr ":class:`ssl.SSLContext` 不带 protocol 参数的做法已被弃用。" + +#: ../../deprecations/pending-removal-in-future.rst:98 +msgid "" +":class:`ssl.SSLContext`: :meth:`~ssl.SSLContext.set_npn_protocols` and " +":meth:`!selected_npn_protocol` are deprecated: use ALPN instead." +msgstr "" +":class:`ssl.SSLContext`: :meth:`~ssl.SSLContext.set_npn_protocols` 和 " +":meth:`!selected_npn_protocol` 已被弃用:请改用 ALPN。" + +#: ../../deprecations/pending-removal-in-future.rst:101 +msgid "``ssl.OP_NO_SSL*`` options" +msgstr "``ssl.OP_NO_SSL*`` 选项" + +#: ../../deprecations/pending-removal-in-future.rst:102 +msgid "``ssl.OP_NO_TLS*`` options" +msgstr "``ssl.OP_NO_TLS*`` 选项" + +#: ../../deprecations/pending-removal-in-future.rst:103 +msgid "``ssl.PROTOCOL_SSLv3``" +msgstr "``ssl.PROTOCOL_SSLv3``" + +#: ../../deprecations/pending-removal-in-future.rst:104 +msgid "``ssl.PROTOCOL_TLS``" +msgstr "``ssl.PROTOCOL_TLS``" + +#: ../../deprecations/pending-removal-in-future.rst:105 +msgid "``ssl.PROTOCOL_TLSv1``" +msgstr "``ssl.PROTOCOL_TLSv1``" + +#: ../../deprecations/pending-removal-in-future.rst:106 +msgid "``ssl.PROTOCOL_TLSv1_1``" +msgstr "``ssl.PROTOCOL_TLSv1_1``" + +#: ../../deprecations/pending-removal-in-future.rst:107 +msgid "``ssl.PROTOCOL_TLSv1_2``" +msgstr "``ssl.PROTOCOL_TLSv1_2``" + +#: ../../deprecations/pending-removal-in-future.rst:108 +msgid "``ssl.TLSVersion.SSLv3``" +msgstr "``ssl.TLSVersion.SSLv3``" + +#: ../../deprecations/pending-removal-in-future.rst:109 +msgid "``ssl.TLSVersion.TLSv1``" +msgstr "``ssl.TLSVersion.TLSv1``" + +#: ../../deprecations/pending-removal-in-future.rst:110 +msgid "``ssl.TLSVersion.TLSv1_1``" +msgstr "``ssl.TLSVersion.TLSv1_1``" + +#: ../../deprecations/pending-removal-in-future.rst:112 +msgid ":mod:`threading` methods:" +msgstr ":mod:`threading` 的方法:" + +#: ../../deprecations/pending-removal-in-future.rst:114 +msgid "" +":meth:`!threading.Condition.notifyAll`: use " +":meth:`~threading.Condition.notify_all`." +msgstr "" +":meth:`!threading.Condition.notifyAll`: 使用 " +":meth:`~threading.Condition.notify_all`." + +#: ../../deprecations/pending-removal-in-future.rst:115 +msgid ":meth:`!threading.Event.isSet`: use :meth:`~threading.Event.is_set`." +msgstr ":meth:`!threading.Event.isSet`: 使用 :meth:`~threading.Event.is_set`。" + +#: ../../deprecations/pending-removal-in-future.rst:116 +msgid "" +":meth:`!threading.Thread.isDaemon`, :meth:`threading.Thread.setDaemon`: use " +":attr:`threading.Thread.daemon` attribute." +msgstr "" +":meth:`!threading.Thread.isDaemon`, :meth:`threading.Thread.setDaemon`: 使用 " +":attr:`threading.Thread.daemon` 属性。" + +#: ../../deprecations/pending-removal-in-future.rst:118 +msgid "" +":meth:`!threading.Thread.getName`, :meth:`threading.Thread.setName`: use " +":attr:`threading.Thread.name` attribute." +msgstr "" +":meth:`!threading.Thread.getName`, :meth:`threading.Thread.setName`: 使用 " +":attr:`threading.Thread.name` 属性。" + +#: ../../deprecations/pending-removal-in-future.rst:120 +msgid "" +":meth:`!threading.currentThread`: use :meth:`threading.current_thread`." +msgstr "" +":meth:`!threading.currentThread`: 使用 :meth:`threading.current_thread`。" + +#: ../../deprecations/pending-removal-in-future.rst:121 +msgid ":meth:`!threading.activeCount`: use :meth:`threading.active_count`." +msgstr ":meth:`!threading.activeCount`: 使用 :meth:`threading.active_count`。" + +#: ../../deprecations/pending-removal-in-future.rst:123 +msgid ":class:`typing.Text` (:gh:`92332`)." +msgstr ":class:`typing.Text` (:gh:`92332`)." + +#: ../../deprecations/pending-removal-in-future.rst:125 +msgid "" +"The internal class ``typing._UnionGenericAlias`` is no longer used to " +"implement :class:`typing.Union`. To preserve compatibility with users using " +"this private class, a compatibility shim will be provided until at least " +"Python 3.17. (Contributed by Jelle Zijlstra in :gh:`105499`.)" +msgstr "" +"内部类 ``typing._UnionGenericAlias`` 不再用于实现 " +":class:`typing.Union`。为了保持使用该私有类的用户的兼容性,将至少在 Python 3.17 之前提供兼容性垫片。 (由 Jelle" +" Zijlstra 在 :gh:`105499` 中贡献。)" + +#: ../../deprecations/pending-removal-in-future.rst:130 +msgid "" +":class:`unittest.IsolatedAsyncioTestCase`: it is deprecated to return a " +"value that is not ``None`` from a test case." +msgstr "" +":class:`unittest.IsolatedAsyncioTestCase`: 从测试用例返回不为 ``None`` 的值的做法已被弃用。" + +#: ../../deprecations/pending-removal-in-future.rst:133 +msgid "" +":mod:`urllib.parse` deprecated functions: :func:`~urllib.parse.urlparse` " +"instead" +msgstr ":mod:`urllib.parse` 函数已被弃用:改用 :func:`~urllib.parse.urlparse`" + +#: ../../deprecations/pending-removal-in-future.rst:135 +msgid "``splitattr()``" +msgstr "``splitattr()``" + +#: ../../deprecations/pending-removal-in-future.rst:136 +msgid "``splithost()``" +msgstr "``splithost()``" + +#: ../../deprecations/pending-removal-in-future.rst:137 +msgid "``splitnport()``" +msgstr "``splitnport()``" + +#: ../../deprecations/pending-removal-in-future.rst:138 +msgid "``splitpasswd()``" +msgstr "``splitpasswd()``" + +#: ../../deprecations/pending-removal-in-future.rst:139 +msgid "``splitport()``" +msgstr "``splitport()``" + +#: ../../deprecations/pending-removal-in-future.rst:140 +msgid "``splitquery()``" +msgstr "``splitquery()``" + +#: ../../deprecations/pending-removal-in-future.rst:141 +msgid "``splittag()``" +msgstr "``splittag()``" + +#: ../../deprecations/pending-removal-in-future.rst:142 +msgid "``splittype()``" +msgstr "``splittype()``" + +#: ../../deprecations/pending-removal-in-future.rst:143 +msgid "``splituser()``" +msgstr "``splituser()``" + +#: ../../deprecations/pending-removal-in-future.rst:144 +msgid "``splitvalue()``" +msgstr "``splitvalue()``" + +#: ../../deprecations/pending-removal-in-future.rst:145 +msgid "``to_bytes()``" +msgstr "``to_bytes()``" + +#: ../../deprecations/pending-removal-in-future.rst:147 +msgid "" +":mod:`wsgiref`: ``SimpleHandler.stdout.write()`` should not do partial " +"writes." +msgstr ":mod:`wsgiref`: ``SimpleHandler.stdout.write()`` 不应执行部分写入。" + +#: ../../deprecations/pending-removal-in-future.rst:150 +msgid "" +":mod:`xml.etree.ElementTree`: Testing the truth value of an " +":class:`~xml.etree.ElementTree.Element` is deprecated. In a future release " +"it will always return ``True``. Prefer explicit ``len(elem)`` or ``elem is " +"not None`` tests instead." +msgstr "" +":mod:`xml.etree.ElementTree`: 对 :class:`~xml.etree.ElementTree.Element` " +"的真值测试已被弃用。在未来的发布版中它将始终返回 ``True``。建议改用显式的 ``len(elem)`` 或 ``elem is not " +"None`` 测试。" + +#: ../../deprecations/pending-removal-in-future.rst:155 +msgid "" +":func:`sys._clear_type_cache` is deprecated: use " +":func:`sys._clear_internal_caches` instead." +msgstr "" +":func:`sys._clear_type_cache` 已弃用,请改用 :func:`sys._clear_internal_caches`。" + +#: ../../deprecations/index.rst:17 +msgid "C API deprecations" +msgstr "C API 的弃用项" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:4 +msgid "" +"The :c:func:`PyImport_ImportModuleNoBlock`: Use " +":c:func:`PyImport_ImportModule` instead." +msgstr "" +":c:func:`PyImport_ImportModuleNoBlock`: 改用 :c:func:`PyImport_ImportModule`。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:6 +msgid "" +":c:func:`PyWeakref_GetObject` and :c:func:`PyWeakref_GET_OBJECT`: Use " +":c:func:`PyWeakref_GetRef` instead. The `pythoncapi-compat project " +"`__ can be used to get " +":c:func:`PyWeakref_GetRef` on Python 3.12 and older." +msgstr "" +":c:func:`PyWeakref_GetObject` 和 :c:func:`PyWeakref_GET_OBJECT`: 改用 " +":c:func:`PyWeakref_GetRef`。在 Python 3.12 及更旧的版本中可以使用 `pythoncapi-compat 项目 " +"`__ 来获取 " +":c:func:`PyWeakref_GetRef`." + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:10 +msgid "" +":c:type:`Py_UNICODE` type and the :c:macro:`!Py_UNICODE_WIDE` macro: Use " +":c:type:`wchar_t` instead." +msgstr "" +":c:type:`Py_UNICODE` 类型和 :c:macro:`!Py_UNICODE_WIDE` 宏:改用 :c:type:`wchar_t`。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:12 +msgid "" +":c:func:`!PyUnicode_AsDecodedObject`: Use :c:func:`PyCodec_Decode` instead." +msgstr ":c:func:`!PyUnicode_AsDecodedObject`: 改用 :c:func:`PyCodec_Decode`。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:14 +msgid "" +":c:func:`!PyUnicode_AsDecodedUnicode`: Use :c:func:`PyCodec_Decode` instead;" +" Note that some codecs (for example, \"base64\") may return a type other " +"than :class:`str`, such as :class:`bytes`." +msgstr "" +":c:func:`!PyUnicode_AsDecodedUnicode`: 改用 :c:func:`PyCodec_Decode`;请注意某些编解码器" +" (例如 \"base64\") 可能返回 :class:`str` 以外的类型,比如 :class:`bytes`。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:17 +msgid "" +":c:func:`!PyUnicode_AsEncodedObject`: Use :c:func:`PyCodec_Encode` instead." +msgstr ":c:func:`!PyUnicode_AsEncodedObject`: 改用 :c:func:`PyCodec_Encode`。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:19 +msgid "" +":c:func:`!PyUnicode_AsEncodedUnicode`: Use :c:func:`PyCodec_Encode` instead;" +" Note that some codecs (for example, \"base64\") may return a type other " +"than :class:`bytes`, such as :class:`str`." +msgstr "" +":c:func:`!PyUnicode_AsEncodedUnicode`: 使用 :c:func:`PyCodec_Encode` " +"代替;请注意,某些编解码器(如 \"base64\")可能返回 :class:`bytes` 之外的类型,如 :class:`str`。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:22 +msgid "Python initialization functions, deprecated in Python 3.13:" +msgstr "Python 初始化函数,Python 3.13 中弃用:" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:24 +msgid "" +":c:func:`Py_GetPath`: Use :c:func:`PyConfig_Get(\"module_search_paths\") " +"` (:data:`sys.path`) instead." +msgstr "" +":c:func:`Py_GetPath`: 使用 :c:func:`PyConfig_Get(\"module_search_paths\") " +"` (:data:`sys.path`) 代替。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:27 +msgid "" +":c:func:`Py_GetPrefix`: Use :c:func:`PyConfig_Get(\"base_prefix\") " +"` (:data:`sys.base_prefix`) instead. Use " +":c:func:`PyConfig_Get(\"prefix\") ` (:data:`sys.prefix`) if " +":ref:`virtual environments ` need to be handled." +msgstr "" +":c:func:`Py_GetPrefix`: 使用 :c:func:`PyConfig_Get(\"base_prefix\") " +"` (:data:`sys.base_prefix`) 代替。如果需要处理 :ref:`虚拟环境 ` " +"则使用 :c:func:`PyConfig_Get(\"prefix\") ` (:data:`sys.prefix`)." + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:32 +msgid "" +":c:func:`Py_GetExecPrefix`: Use :c:func:`PyConfig_Get(\"base_exec_prefix\") " +"` (:data:`sys.base_exec_prefix`) instead. Use " +":c:func:`PyConfig_Get(\"exec_prefix\") ` " +"(:data:`sys.exec_prefix`) if :ref:`virtual environments ` need to " +"be handled." +msgstr "" +":c:func:`Py_GetExecPrefix`: 使用 :c:func:`PyConfig_Get(\"base_exec_prefix\") " +"` (:data:`sys.base_exec_prefix`) 代替。如果需要处理 :ref:`虚拟环境 ` 则使用 :c:func:`PyConfig_Get(\"exec_prefix\") ` " +"(:data:`sys.exec_prefix`)." + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:38 +msgid "" +":c:func:`Py_GetProgramFullPath`: Use :c:func:`PyConfig_Get(\"executable\") " +"` (:data:`sys.executable`) instead." +msgstr "" +":c:func:`Py_GetProgramFullPath`: 使用 :c:func:`PyConfig_Get(\"executable\") " +"` (:data:`sys.executable`) 代替。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:41 +msgid "" +":c:func:`Py_GetProgramName`: Use :c:func:`PyConfig_Get(\"executable\") " +"` (:data:`sys.executable`) instead." +msgstr "" +":c:func:`Py_GetProgramName`: 使用 :c:func:`PyConfig_Get(\"executable\") " +"` (:data:`sys.executable`) 代替。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:44 +msgid "" +":c:func:`Py_GetPythonHome`: Use :c:func:`PyConfig_Get(\"home\") " +"` or the :envvar:`PYTHONHOME` environment variable instead." +msgstr "" +":c:func:`Py_GetPythonHome`: 使用 :c:func:`PyConfig_Get(\"home\") " +"` 或 :envvar:`PYTHONHOME` 环境变量代替。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:48 +msgid "" +"The `pythoncapi-compat project `__ can be used to get :c:func:`PyConfig_Get` on Python 3.13 and " +"older." +msgstr "" +"在 Python 3.13 和更旧的版本中可以使用 `pythoncapi-compat 项目 " +"`__ 来获取 :c:func:`PyConfig_Get`" +" 。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:52 +msgid "" +"Functions to configure Python's initialization, deprecated in Python 3.11:" +msgstr "用于配置 Python 的初始化的函数,在 Python 3.11 中已弃用:" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:54 +msgid ":c:func:`!PySys_SetArgvEx()`: Set :c:member:`PyConfig.argv` instead." +msgstr ":c:func:`!PySys_SetArgvEx()`: 改为设置 :c:member:`PyConfig.argv`。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:56 +msgid ":c:func:`!PySys_SetArgv()`: Set :c:member:`PyConfig.argv` instead." +msgstr ":c:func:`!PySys_SetArgv()`: 改为设置 :c:member:`PyConfig.argv`。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:58 +msgid "" +":c:func:`!Py_SetProgramName()`: Set :c:member:`PyConfig.program_name` " +"instead." +msgstr "" +":c:func:`!Py_SetProgramName()`: 改为设置 :c:member:`PyConfig.program_name`。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:60 +msgid ":c:func:`!Py_SetPythonHome()`: Set :c:member:`PyConfig.home` instead." +msgstr ":c:func:`!Py_SetPythonHome()`: 改为设置 :c:member:`PyConfig.home`。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:62 +msgid "" +":c:func:`PySys_ResetWarnOptions`: Clear :data:`sys.warnoptions` and " +":data:`!warnings.filters` instead." +msgstr "" +":c:func:`PySys_ResetWarnOptions`: 改为清除 :data:`sys.warnoptions` 和 " +":data:`!warnings.filters`." + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:65 +msgid "" +"The :c:func:`Py_InitializeFromConfig` API should be used with " +":c:type:`PyConfig` instead." +msgstr ":c:func:`Py_InitializeFromConfig` API 应与 :c:type:`PyConfig` 一起使用。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:68 +msgid "Global configuration variables:" +msgstr "全局配置变量:" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:70 +msgid "" +":c:var:`Py_DebugFlag`: Use :c:member:`PyConfig.parser_debug` or " +":c:func:`PyConfig_Get(\"parser_debug\") ` instead." +msgstr "" +":c:var:`Py_DebugFlag`: 改用 :c:member:`PyConfig.parser_debug` 或 " +":c:func:`PyConfig_Get(\"parser_debug\") `." + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:73 +msgid "" +":c:var:`Py_VerboseFlag`: Use :c:member:`PyConfig.verbose` or " +":c:func:`PyConfig_Get(\"verbose\") ` instead." +msgstr "" +":c:var:`Py_VerboseFlag`: 改用 :c:member:`PyConfig.verbose` 或 " +":c:func:`PyConfig_Get(\"verbose\") `." + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:76 +msgid "" +":c:var:`Py_QuietFlag`: Use :c:member:`PyConfig.quiet` or " +":c:func:`PyConfig_Get(\"quiet\") ` instead." +msgstr "" +":c:var:`Py_QuietFlag`: 改用 :c:member:`PyConfig.quiet` 或 " +":c:func:`PyConfig_Get(\"quiet\") `." + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:79 +msgid "" +":c:var:`Py_InteractiveFlag`: Use :c:member:`PyConfig.interactive` or " +":c:func:`PyConfig_Get(\"interactive\") ` instead." +msgstr "" +":c:var:`Py_InteractiveFlag`: 改用 :c:member:`PyConfig.interactive` 或 " +":c:func:`PyConfig_Get(\"interactive\") `." + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:82 +msgid "" +":c:var:`Py_InspectFlag`: Use :c:member:`PyConfig.inspect` or " +":c:func:`PyConfig_Get(\"inspect\") ` instead." +msgstr "" +":c:var:`Py_InspectFlag`: 改用 :c:member:`PyConfig.inspect` 或 " +":c:func:`PyConfig_Get(\"inspect\") `." + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:85 +msgid "" +":c:var:`Py_OptimizeFlag`: Use :c:member:`PyConfig.optimization_level` or " +":c:func:`PyConfig_Get(\"optimization_level\") ` instead." +msgstr "" +":c:var:`Py_OptimizeFlag`: 改用 :c:member:`PyConfig.optimization_level` 或 " +":c:func:`PyConfig_Get(\"optimization_level\") `." + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:88 +msgid "" +":c:var:`Py_NoSiteFlag`: Use :c:member:`PyConfig.site_import` or " +":c:func:`PyConfig_Get(\"site_import\") ` instead." +msgstr "" +":c:var:`Py_NoSiteFlag`: 改用 :c:member:`PyConfig.site_import` 或 " +":c:func:`PyConfig_Get(\"site_import\") `." + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:91 +msgid "" +":c:var:`Py_BytesWarningFlag`: Use :c:member:`PyConfig.bytes_warning` or " +":c:func:`PyConfig_Get(\"bytes_warning\") ` instead." +msgstr "" +":c:var:`Py_BytesWarningFlag`: 改用 :c:member:`PyConfig.bytes_warning` 或 " +":c:func:`PyConfig_Get(\"bytes_warning\") `." + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:94 +msgid "" +":c:var:`Py_FrozenFlag`: Use :c:member:`PyConfig.pathconfig_warnings` or " +":c:func:`PyConfig_Get(\"pathconfig_warnings\") ` instead." +msgstr "" +":c:var:`Py_FrozenFlag`: 使用 :c:member:`PyConfig.pathconfig_warnings` 或 " +":c:func:`PyConfig_Get(\"pathconfig_warnings\") ` 代替。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:97 +msgid "" +":c:var:`Py_IgnoreEnvironmentFlag`: Use :c:member:`PyConfig.use_environment` " +"or :c:func:`PyConfig_Get(\"use_environment\") ` instead." +msgstr "" +":c:var:`Py_IgnoreEnvironmentFlag`: 使用 :c:member:`PyConfig.use_environment` 或" +" :c:func:`PyConfig_Get(\"use_environment\") ` 代替。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:100 +msgid "" +":c:var:`Py_DontWriteBytecodeFlag`: Use :c:member:`PyConfig.write_bytecode` " +"or :c:func:`PyConfig_Get(\"write_bytecode\") ` instead." +msgstr "" +":c:var:`Py_DontWriteBytecodeFlag`: 使用 :c:member:`PyConfig.write_bytecode` 或 " +":c:func:`PyConfig_Get(\"write_bytecode\") ` 代替。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:103 +msgid "" +":c:var:`Py_NoUserSiteDirectory`: Use " +":c:member:`PyConfig.user_site_directory` or " +":c:func:`PyConfig_Get(\"user_site_directory\") ` instead." +msgstr "" +":c:var:`Py_NoUserSiteDirectory`: 使用 :c:member:`PyConfig.user_site_directory`" +" 或 :c:func:`PyConfig_Get(\"user_site_directory\") ` 代替。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:106 +msgid "" +":c:var:`Py_UnbufferedStdioFlag`: Use :c:member:`PyConfig.buffered_stdio` or " +":c:func:`PyConfig_Get(\"buffered_stdio\") ` instead." +msgstr "" +":c:var:`Py_UnbufferedStdioFlag`: 使用 :c:member:`PyConfig.buffered_stdio` 或 " +":c:func:`PyConfig_Get(\"buffered_stdio\") ` 代替。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:109 +msgid "" +":c:var:`Py_HashRandomizationFlag`: Use :c:member:`PyConfig.use_hash_seed` " +"and :c:member:`PyConfig.hash_seed` or :c:func:`PyConfig_Get(\"hash_seed\") " +"` instead." +msgstr "" +":c:var:`Py_HashRandomizationFlag`: 使用 :c:member:`PyConfig.use_hash_seed` 和 " +":c:member:`PyConfig.hash_seed` 或 :c:func:`PyConfig_Get(\"hash_seed\") " +"` 代替。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:113 +msgid "" +":c:var:`Py_IsolatedFlag`: Use :c:member:`PyConfig.isolated` or " +":c:func:`PyConfig_Get(\"isolated\") ` instead." +msgstr "" +":c:var:`Py_IsolatedFlag`: 使用 :c:member:`PyConfig.isolated` 或 " +":c:func:`PyConfig_Get(\"isolated\") ` 代替。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:116 +msgid "" +":c:var:`Py_LegacyWindowsFSEncodingFlag`: Use " +":c:member:`PyPreConfig.legacy_windows_fs_encoding` or " +":c:func:`PyConfig_Get(\"legacy_windows_fs_encoding\") ` " +"instead." +msgstr "" +":c:var:`Py_LegacyWindowsFSEncodingFlag`: 使用 " +":c:member:`PyPreConfig.legacy_windows_fs_encoding` 或 " +":c:func:`PyConfig_Get(\"legacy_windows_fs_encoding\") ` 代替。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:119 +msgid "" +":c:var:`Py_LegacyWindowsStdioFlag`: Use " +":c:member:`PyConfig.legacy_windows_stdio` or " +":c:func:`PyConfig_Get(\"legacy_windows_stdio\") ` instead." +msgstr "" +":c:var:`Py_LegacyWindowsStdioFlag`: 使用 " +":c:member:`PyConfig.legacy_windows_stdio` 或 " +":c:func:`PyConfig_Get(\"legacy_windows_stdio\") ` 代替。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:122 +msgid "" +":c:var:`!Py_FileSystemDefaultEncoding`, " +":c:var:`!Py_HasFileSystemDefaultEncoding`: Use " +":c:member:`PyConfig.filesystem_encoding` or " +":c:func:`PyConfig_Get(\"filesystem_encoding\") ` instead." +msgstr "" +":c:var:`!Py_FileSystemDefaultEncoding`,:c:var:`!Py_HasFileSystemDefaultEncoding`:" +" 使用 :c:member:`PyConfig.filesystem_encoding` 或 " +":c:func:`PyConfig_Get(\"filesystem_encoding\") ` 代替。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:125 +msgid "" +":c:var:`!Py_FileSystemDefaultEncodeErrors`: Use " +":c:member:`PyConfig.filesystem_errors` or " +":c:func:`PyConfig_Get(\"filesystem_errors\") ` instead." +msgstr "" +":c:var:`!Py_FileSystemDefaultEncodeErrors`: 使用 " +":c:member:`PyConfig.filesystem_errors` 或 " +":c:func:`PyConfig_Get(\"filesystem_errors\") ` 代替。" + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:128 +msgid "" +":c:var:`!Py_UTF8Mode`: Use :c:member:`PyPreConfig.utf8_mode` or " +":c:func:`PyConfig_Get(\"utf8_mode\") ` instead. (see " +":c:func:`Py_PreInitialize`)" +msgstr "" +":c:var:`!Py_UTF8Mode`: 使用 :c:member:`PyPreConfig.utf8_mode` 或 " +":c:func:`PyConfig_Get(\"utf8_mode\") ` 代替。 (参见 " +":c:func:`Py_PreInitialize`)." + +#: ../../deprecations/c-api-pending-removal-in-3.15.rst:133 +msgid "" +"The :c:func:`Py_InitializeFromConfig` API should be used with " +":c:type:`PyConfig` to set these options. Or :c:func:`PyConfig_Get` can be " +"used to get these options at runtime." +msgstr "" +":c:func:`Py_InitializeFromConfig` API 应与 :c:type:`PyConfig` " +"一起使用,以设置这些选项。或者使用 :c:func:`PyConfig_Get` 在运行时获取这些选项。" + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:4 +msgid "" +"The following private functions are deprecated and planned for removal in " +"Python 3.18:" +msgstr "以下私有函数已被弃用,并计划在 Python 3.18 中移除:" + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:7 +msgid ":c:func:`!_PyBytes_Join`: use :c:func:`PyBytes_Join`." +msgstr ":c:func:`!_PyBytes_Join`: 使用 :c:func:`PyBytes_Join`。" + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:8 +msgid "" +":c:func:`!_PyDict_GetItemStringWithError`: use " +":c:func:`PyDict_GetItemStringRef`." +msgstr "" +":c:func:`!_PyDict_GetItemStringWithError`: 使用 " +":c:func:`PyDict_GetItemStringRef`." + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:9 +msgid ":c:func:`!_PyDict_Pop()`: use :c:func:`PyDict_Pop`." +msgstr ":c:func:`!_PyDict_Pop()`: 使用 :c:func:`PyDict_Pop`。" + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:10 +msgid ":c:func:`!_PyLong_Sign()`: use :c:func:`PyLong_GetSign`." +msgstr ":c:func:`!_PyLong_Sign()`: 使用 :c:func:`PyLong_GetSign`。" + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:11 +msgid "" +":c:func:`!_PyLong_FromDigits` and :c:func:`!_PyLong_New`: use " +":c:func:`PyLongWriter_Create`." +msgstr "" +":c:func:`!_PyLong_FromDigits` 和 :c:func:`!_PyLong_New`: 使用 " +":c:func:`PyLongWriter_Create`." + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:13 +msgid "" +":c:func:`!_PyThreadState_UncheckedGet`: use " +":c:func:`PyThreadState_GetUnchecked`." +msgstr "" +":c:func:`!_PyThreadState_UncheckedGet`: 使用 " +":c:func:`PyThreadState_GetUnchecked`." + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:14 +msgid ":c:func:`!_PyUnicode_AsString`: use :c:func:`PyUnicode_AsUTF8`." +msgstr ":c:func:`!_PyUnicode_AsString`: 使用 :c:func:`PyUnicode_AsUTF8`。" + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:15 +msgid "" +":c:func:`!_PyUnicodeWriter_Init`: replace ``_PyUnicodeWriter_Init(&writer)``" +" with :c:func:`writer = PyUnicodeWriter_Create(0) `." +msgstr "" +":c:func:`!_PyUnicodeWriter_Init`: 将 ``_PyUnicodeWriter_Init(&writer)`` 替换为 " +":c:func:`writer = PyUnicodeWriter_Create(0) `." + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:18 +msgid "" +":c:func:`!_PyUnicodeWriter_Finish`: replace " +"``_PyUnicodeWriter_Finish(&writer)`` with " +":c:func:`PyUnicodeWriter_Finish(writer) `." +msgstr "" +":c:func:`!_PyUnicodeWriter_Finish`: 将 ``_PyUnicodeWriter_Finish(&writer)`` " +"替换为 :c:func:`PyUnicodeWriter_Finish(writer) `。" + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:21 +msgid "" +":c:func:`!_PyUnicodeWriter_Dealloc`: replace " +"``_PyUnicodeWriter_Dealloc(&writer)`` with " +":c:func:`PyUnicodeWriter_Discard(writer) `." +msgstr "" +":c:func:`!_PyUnicodeWriter_Dealloc`: 将 ``_PyUnicodeWriter_Dealloc(&writer)``" +" 替换为 :c:func:`PyUnicodeWriter_Discard(writer) `。" + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:24 +msgid "" +":c:func:`!_PyUnicodeWriter_WriteChar`: replace " +"``_PyUnicodeWriter_WriteChar(&writer, ch)`` with " +":c:func:`PyUnicodeWriter_WriteChar(writer, ch) `." +msgstr "" +":c:func:`!_PyUnicodeWriter_WriteChar`: 将 " +"``_PyUnicodeWriter_WriteChar(&writer, ch)`` 替换为 " +":c:func:`PyUnicodeWriter_WriteChar(writer, ch) `." + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:27 +msgid "" +":c:func:`!_PyUnicodeWriter_WriteStr`: replace " +"``_PyUnicodeWriter_WriteStr(&writer, str)`` with " +":c:func:`PyUnicodeWriter_WriteStr(writer, str) `." +msgstr "" +":c:func:`!_PyUnicodeWriter_WriteStr`: 将 ``_PyUnicodeWriter_WriteStr(&writer," +" str)`` 替换为 :c:func:`PyUnicodeWriter_WriteStr(writer, str) " +"`." + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:30 +msgid "" +":c:func:`!_PyUnicodeWriter_WriteSubstring`: replace " +"``_PyUnicodeWriter_WriteSubstring(&writer, str, start, end)`` with " +":c:func:`PyUnicodeWriter_WriteSubstring(writer, str, start, end) " +"`." +msgstr "" +":c:func:`!_PyUnicodeWriter_WriteSubstring`: 将 " +"``_PyUnicodeWriter_WriteSubstring(&writer, str, start, end)`` 替换为 " +":c:func:`PyUnicodeWriter_WriteSubstring(writer, str, start, end) " +"`." + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:33 +msgid "" +":c:func:`!_PyUnicodeWriter_WriteASCIIString`: replace " +"``_PyUnicodeWriter_WriteASCIIString(&writer, str)`` with " +":c:func:`PyUnicodeWriter_WriteASCII(writer, str) " +"`." +msgstr "" +":c:func:`!_PyUnicodeWriter_WriteASCIIString`: 请将 " +"``_PyUnicodeWriter_WriteASCIIString(&writer, str)`` 替换为 " +":c:func:`PyUnicodeWriter_WriteASCII(writer, str) " +"`." + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:36 +msgid "" +":c:func:`!_PyUnicodeWriter_WriteLatin1String`: replace " +"``_PyUnicodeWriter_WriteLatin1String(&writer, str)`` with " +":c:func:`PyUnicodeWriter_WriteUTF8(writer, str) " +"`." +msgstr "" +":c:func:`!_PyUnicodeWriter_WriteLatin1String`: 将 " +"``_PyUnicodeWriter_WriteLatin1String(&writer, str)`` 替换为 " +":c:func:`PyUnicodeWriter_WriteUTF8(writer, str) " +"`." + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:39 +msgid ":c:func:`!_PyUnicodeWriter_Prepare`: (no replacement)." +msgstr ":c:func:`!_PyUnicodeWriter_Prepare`: (无替代)。" + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:40 +msgid ":c:func:`!_PyUnicodeWriter_PrepareKind`: (no replacement)." +msgstr ":c:func:`!_PyUnicodeWriter_PrepareKind`: (无替代)。" + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:41 +msgid ":c:func:`!_Py_HashPointer`: use :c:func:`Py_HashPointer`." +msgstr ":c:func:`!_Py_HashPointer`: 使用 :c:func:`Py_HashPointer`。" + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:42 +msgid ":c:func:`!_Py_fopen_obj`: use :c:func:`Py_fopen`." +msgstr ":c:func:`!_Py_fopen_obj`: 使用 :c:func:`Py_fopen`。" + +#: ../../deprecations/c-api-pending-removal-in-3.18.rst:44 +msgid "" +"The `pythoncapi-compat project `__ can be used to get these new public functions on Python 3.13 and" +" older. (Contributed by Victor Stinner in :gh:`128863`.)" +msgstr "" +"`pythoncapi-compat 项目 `__ " +"可被用于在 Python 3.13 及更早版本中获取这些新的公有函数。 (由 Victor Stinner 在 :gh:`128863` 中贡献。)" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:4 +msgid "" +"The following APIs are deprecated and will be removed, although there is " +"currently no date scheduled for their removal." +msgstr "以下 API 已被弃用,将被移除,但目前尚未确定移除日期。" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:7 +msgid ":c:macro:`Py_TPFLAGS_HAVE_FINALIZE`: Unneeded since Python 3.8." +msgstr ":c:macro:`Py_TPFLAGS_HAVE_FINALIZE`: 自 Python 3.8 起不再需要。" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:9 +msgid ":c:func:`PyErr_Fetch`: Use :c:func:`PyErr_GetRaisedException` instead." +msgstr ":c:func:`PyErr_Fetch`: 改用 :c:func:`PyErr_GetRaisedException`。" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:11 +msgid "" +":c:func:`PyErr_NormalizeException`: Use :c:func:`PyErr_GetRaisedException` " +"instead." +msgstr "" +":c:func:`PyErr_NormalizeException`: 改用 :c:func:`PyErr_GetRaisedException`。" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:13 +msgid "" +":c:func:`PyErr_Restore`: Use :c:func:`PyErr_SetRaisedException` instead." +msgstr ":c:func:`PyErr_Restore`: 改用 :c:func:`PyErr_SetRaisedException`。" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:15 +msgid "" +":c:func:`PyModule_GetFilename`: Use :c:func:`PyModule_GetFilenameObject` " +"instead." +msgstr "" +":c:func:`PyModule_GetFilename`: 改用 :c:func:`PyModule_GetFilenameObject`。" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:17 +msgid ":c:func:`PyOS_AfterFork`: Use :c:func:`PyOS_AfterFork_Child` instead." +msgstr ":c:func:`PyOS_AfterFork`: 改用 :c:func:`PyOS_AfterFork_Child`。" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:19 +msgid "" +":c:func:`PySlice_GetIndicesEx`: Use :c:func:`PySlice_Unpack` and " +":c:func:`PySlice_AdjustIndices` instead." +msgstr "" +":c:func:`PySlice_GetIndicesEx`: 改用 :c:func:`PySlice_Unpack` 和 " +":c:func:`PySlice_AdjustIndices`." + +#: ../../deprecations/c-api-pending-removal-in-future.rst:21 +msgid ":c:func:`PyUnicode_READY`: Unneeded since Python 3.12" +msgstr ":c:func:`PyUnicode_READY`: 自 Python 3.12 起不再需要" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:23 +msgid "" +":c:func:`!PyErr_Display`: Use :c:func:`PyErr_DisplayException` instead." +msgstr ":c:func:`!PyErr_Display`: 改用 :c:func:`PyErr_DisplayException`。" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:25 +msgid "" +":c:func:`!_PyErr_ChainExceptions`: Use :c:func:`!_PyErr_ChainExceptions1` " +"instead." +msgstr "" +":c:func:`!_PyErr_ChainExceptions`: 改用 :c:func:`!_PyErr_ChainExceptions1`。" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:27 +msgid "" +":c:member:`!PyBytesObject.ob_shash` member: call :c:func:`PyObject_Hash` " +"instead." +msgstr ":c:member:`!PyBytesObject.ob_shash` 成员:改为调用 :c:func:`PyObject_Hash`。" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:29 +msgid "Thread Local Storage (TLS) API:" +msgstr "线程本地存储 (TLS) API:" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:31 +msgid "" +":c:func:`PyThread_create_key`: Use :c:func:`PyThread_tss_alloc` instead." +msgstr ":c:func:`PyThread_create_key`: 改用 :c:func:`PyThread_tss_alloc`。" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:33 +msgid "" +":c:func:`PyThread_delete_key`: Use :c:func:`PyThread_tss_free` instead." +msgstr ":c:func:`PyThread_delete_key`: 改用 :c:func:`PyThread_tss_free`。" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:35 +msgid "" +":c:func:`PyThread_set_key_value`: Use :c:func:`PyThread_tss_set` instead." +msgstr ":c:func:`PyThread_set_key_value`: 改用 :c:func:`PyThread_tss_set`。" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:37 +msgid "" +":c:func:`PyThread_get_key_value`: Use :c:func:`PyThread_tss_get` instead." +msgstr ":c:func:`PyThread_get_key_value`: 改用 :c:func:`PyThread_tss_get`。" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:39 +msgid "" +":c:func:`PyThread_delete_key_value`: Use :c:func:`PyThread_tss_delete` " +"instead." +msgstr "" +":c:func:`PyThread_delete_key_value`: 改用 :c:func:`PyThread_tss_delete`。" + +#: ../../deprecations/c-api-pending-removal-in-future.rst:41 +msgid ":c:func:`PyThread_ReInitTLS`: Unneeded since Python 3.7." +msgstr ":c:func:`PyThread_ReInitTLS`: 自 Python 3.7 起不再需要。" diff --git a/deprecations/pending-removal-in-3.13.po b/deprecations/pending-removal-in-3.13.po new file mode 100644 index 0000000000..7998267eba --- /dev/null +++ b/deprecations/pending-removal-in-3.13.po @@ -0,0 +1,154 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../deprecations/pending-removal-in-3.13.rst:2 +msgid "Pending removal in Python 3.13" +msgstr "计划在 Python 3.13 中移除" + +#: ../../deprecations/pending-removal-in-3.13.rst:4 +msgid "Modules (see :pep:`594`):" +msgstr "模块 (参见 :pep:`594`):" + +#: ../../deprecations/pending-removal-in-3.13.rst:6 +msgid ":mod:`!aifc`" +msgstr ":mod:`!aifc`" + +#: ../../deprecations/pending-removal-in-3.13.rst:7 +msgid ":mod:`!audioop`" +msgstr ":mod:`!audioop`" + +#: ../../deprecations/pending-removal-in-3.13.rst:8 +msgid ":mod:`!cgi`" +msgstr ":mod:`!cgi`" + +#: ../../deprecations/pending-removal-in-3.13.rst:9 +msgid ":mod:`!cgitb`" +msgstr ":mod:`!cgitb`" + +#: ../../deprecations/pending-removal-in-3.13.rst:10 +msgid ":mod:`!chunk`" +msgstr ":mod:`!chunk`" + +#: ../../deprecations/pending-removal-in-3.13.rst:11 +msgid ":mod:`!crypt`" +msgstr ":mod:`!crypt`" + +#: ../../deprecations/pending-removal-in-3.13.rst:12 +msgid ":mod:`!imghdr`" +msgstr ":mod:`!imghdr`" + +#: ../../deprecations/pending-removal-in-3.13.rst:13 +msgid ":mod:`!mailcap`" +msgstr ":mod:`!mailcap`" + +#: ../../deprecations/pending-removal-in-3.13.rst:14 +msgid ":mod:`!msilib`" +msgstr ":mod:`!msilib`" + +#: ../../deprecations/pending-removal-in-3.13.rst:15 +msgid ":mod:`!nis`" +msgstr ":mod:`!nis`" + +#: ../../deprecations/pending-removal-in-3.13.rst:16 +msgid ":mod:`!nntplib`" +msgstr ":mod:`!nntplib`" + +#: ../../deprecations/pending-removal-in-3.13.rst:17 +msgid ":mod:`!ossaudiodev`" +msgstr ":mod:`!ossaudiodev`" + +#: ../../deprecations/pending-removal-in-3.13.rst:18 +msgid ":mod:`!pipes`" +msgstr ":mod:`!pipes`" + +#: ../../deprecations/pending-removal-in-3.13.rst:19 +msgid ":mod:`!sndhdr`" +msgstr ":mod:`!sndhdr`" + +#: ../../deprecations/pending-removal-in-3.13.rst:20 +msgid ":mod:`!spwd`" +msgstr ":mod:`!spwd`" + +#: ../../deprecations/pending-removal-in-3.13.rst:21 +msgid ":mod:`!sunau`" +msgstr ":mod:`!sunau`" + +#: ../../deprecations/pending-removal-in-3.13.rst:22 +msgid ":mod:`!telnetlib`" +msgstr ":mod:`!telnetlib`" + +#: ../../deprecations/pending-removal-in-3.13.rst:23 +msgid ":mod:`!uu`" +msgstr ":mod:`!uu`" + +#: ../../deprecations/pending-removal-in-3.13.rst:24 +msgid ":mod:`!xdrlib`" +msgstr ":mod:`!xdrlib`" + +#: ../../deprecations/pending-removal-in-3.13.rst:26 +msgid "Other modules:" +msgstr "其他模块:" + +#: ../../deprecations/pending-removal-in-3.13.rst:28 +msgid ":mod:`!lib2to3`, and the :program:`2to3` program (:gh:`84540`)" +msgstr ":mod:`!lib2to3`,以及 :program:`2to3` 程序 (:gh:`84540`)" + +#: ../../deprecations/pending-removal-in-3.13.rst:30 +msgid "APIs:" +msgstr "API:" + +#: ../../deprecations/pending-removal-in-3.13.rst:32 +msgid ":class:`!configparser.LegacyInterpolation` (:gh:`90765`)" +msgstr ":class:`!configparser.LegacyInterpolation` (:gh:`90765`)" + +#: ../../deprecations/pending-removal-in-3.13.rst:33 +msgid "``locale.resetlocale()`` (:gh:`90817`)" +msgstr "``locale.resetlocale()`` (:gh:`90817`)" + +#: ../../deprecations/pending-removal-in-3.13.rst:34 +msgid ":meth:`!turtle.RawTurtle.settiltangle` (:gh:`50096`)" +msgstr ":meth:`!turtle.RawTurtle.settiltangle` (:gh:`50096`)" + +#: ../../deprecations/pending-removal-in-3.13.rst:35 +msgid ":func:`!unittest.findTestCases` (:gh:`50096`)" +msgstr ":func:`!unittest.findTestCases` (:gh:`50096`)" + +#: ../../deprecations/pending-removal-in-3.13.rst:36 +msgid ":func:`!unittest.getTestCaseNames` (:gh:`50096`)" +msgstr ":func:`!unittest.getTestCaseNames` (:gh:`50096`)" + +#: ../../deprecations/pending-removal-in-3.13.rst:37 +msgid ":func:`!unittest.makeSuite` (:gh:`50096`)" +msgstr ":func:`!unittest.makeSuite` (:gh:`50096`)" + +#: ../../deprecations/pending-removal-in-3.13.rst:38 +msgid ":meth:`!unittest.TestProgram.usageExit` (:gh:`67048`)" +msgstr ":meth:`!unittest.TestProgram.usageExit` (:gh:`67048`)" + +#: ../../deprecations/pending-removal-in-3.13.rst:39 +msgid ":class:`!webbrowser.MacOSX` (:gh:`86421`)" +msgstr ":class:`!webbrowser.MacOSX` (:gh:`86421`)" + +#: ../../deprecations/pending-removal-in-3.13.rst:40 +msgid ":class:`classmethod` descriptor chaining (:gh:`89519`)" +msgstr ":class:`classmethod` 描述器串联 (:gh:`89519`)" diff --git a/deprecations/pending-removal-in-3.14.po b/deprecations/pending-removal-in-3.14.po new file mode 100644 index 0000000000..d22de27c89 --- /dev/null +++ b/deprecations/pending-removal-in-3.14.po @@ -0,0 +1,234 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../deprecations/pending-removal-in-3.14.rst:2 +msgid "Pending removal in Python 3.14" +msgstr "计划在 Python 3.14 中移除" + +#: ../../deprecations/pending-removal-in-3.14.rst:4 +msgid "" +":mod:`argparse`: The *type*, *choices*, and *metavar* parameters of " +":class:`!argparse.BooleanOptionalAction` are deprecated and will be removed " +"in 3.14. (Contributed by Nikita Sobolev in :gh:`92248`.)" +msgstr "" +":mod:`argparse`: :class:`!argparse.BooleanOptionalAction` 的 *type*, " +"*choices* 和 *metavar* 形参已被弃用并将在 3.14 中移除。 (由 Nikita Sobolev 在 :gh:`92248` " +"中贡献。)" + +#: ../../deprecations/pending-removal-in-3.14.rst:9 +msgid "" +":mod:`ast`: The following features have been deprecated in documentation " +"since Python 3.8, now cause a :exc:`DeprecationWarning` to be emitted at " +"runtime when they are accessed or used, and will be removed in Python 3.14:" +msgstr "" +":mod:`ast`: 以下特性自 Python 3.8 起已在文档中声明弃用,现在当运行时如果它们被访问或使用时将发出 " +":exc:`DeprecationWarning`,并将在 Python 3.14 中移除:" + +#: ../../deprecations/pending-removal-in-3.14.rst:13 +msgid ":class:`!ast.Num`" +msgstr ":class:`!ast.Num`" + +#: ../../deprecations/pending-removal-in-3.14.rst:14 +msgid ":class:`!ast.Str`" +msgstr ":class:`!ast.Str`" + +#: ../../deprecations/pending-removal-in-3.14.rst:15 +msgid ":class:`!ast.Bytes`" +msgstr ":class:`!ast.Bytes`" + +#: ../../deprecations/pending-removal-in-3.14.rst:16 +msgid ":class:`!ast.NameConstant`" +msgstr ":class:`!ast.NameConstant`" + +#: ../../deprecations/pending-removal-in-3.14.rst:17 +msgid ":class:`!ast.Ellipsis`" +msgstr ":class:`!ast.Ellipsis`" + +#: ../../deprecations/pending-removal-in-3.14.rst:19 +msgid "" +"Use :class:`ast.Constant` instead. (Contributed by Serhiy Storchaka in " +":gh:`90953`.)" +msgstr "请改用 :class:`ast.Constant`。 (由 Serhiy Storchaka 在 :gh:`90953` 中贡献。)" + +#: ../../deprecations/pending-removal-in-3.14.rst:22 +msgid ":mod:`asyncio`:" +msgstr ":mod:`asyncio`:" + +#: ../../deprecations/pending-removal-in-3.14.rst:24 +msgid "" +"The child watcher classes :class:`!asyncio.MultiLoopChildWatcher`, " +":class:`!asyncio.FastChildWatcher`, :class:`!asyncio.AbstractChildWatcher` " +"and :class:`!asyncio.SafeChildWatcher` are deprecated and will be removed in" +" Python 3.14. (Contributed by Kumar Aditya in :gh:`94597`.)" +msgstr "" +"子监视器类 " +":class:`!asyncio.MultiLoopChildWatcher`,:class:`!asyncio.FastChildWatcher`,:class:`!asyncio.AbstractChildWatcher`" +" 和 :class:`!asyncio.SafeChildWatcher` 已被弃用并将在 Python 3.14 中移除。 (由 Kumar " +"Aditya 在 :gh:`94597` 中贡献。)" + +#: ../../deprecations/pending-removal-in-3.14.rst:30 +msgid "" +":func:`!asyncio.set_child_watcher`, :func:`!asyncio.get_child_watcher`, " +":meth:`!asyncio.AbstractEventLoopPolicy.set_child_watcher` and " +":meth:`!asyncio.AbstractEventLoopPolicy.get_child_watcher` are deprecated " +"and will be removed in Python 3.14. (Contributed by Kumar Aditya in " +":gh:`94597`.)" +msgstr "" +":func:`!asyncio.set_child_watcher`,:func:`!asyncio.get_child_watcher`,:meth:`!asyncio.AbstractEventLoopPolicy.set_child_watcher`" +" 和 :meth:`!asyncio.AbstractEventLoopPolicy.get_child_watcher` 已弃用,并将在 Python" +" 3.14 中移除。(由 Kumar Aditya 在 :gh:`94597` 中贡献。)" + +#: ../../deprecations/pending-removal-in-3.14.rst:36 +msgid "" +"The :meth:`~asyncio.get_event_loop` method of the default event loop policy " +"now emits a :exc:`DeprecationWarning` if there is no current event loop set " +"and it decides to create one. (Contributed by Serhiy Storchaka and Guido van" +" Rossum in :gh:`100160`.)" +msgstr "" +"现在默认事件循环策略的 :meth:`~asyncio.get_event_loop` 方法在当前事件循环未设置并决定创建一个时将发出 " +":exc:`DeprecationWarning`。 (由 Serhiy Storchaka 和 Guido van Rossum 在 " +":gh:`100160` 中贡献。)" + +#: ../../deprecations/pending-removal-in-3.14.rst:41 +msgid "" +":mod:`email`: Deprecated the *isdst* parameter in " +":func:`email.utils.localtime`. (Contributed by Alan Williams in " +":gh:`72346`.)" +msgstr "" +":mod:`email`: 已弃用 :func:`email.utils.localtime` 中的 *isdst* 形参。 (由 Alan " +"Williams 在 :gh:`72346` 中贡献。)" + +#: ../../deprecations/pending-removal-in-3.14.rst:44 +msgid ":mod:`importlib.abc` deprecated classes:" +msgstr ":mod:`importlib.abc` 中已弃用的类:" + +#: ../../deprecations/pending-removal-in-3.14.rst:46 +msgid ":class:`!importlib.abc.ResourceReader`" +msgstr ":class:`!importlib.abc.ResourceReader`" + +#: ../../deprecations/pending-removal-in-3.14.rst:47 +msgid ":class:`!importlib.abc.Traversable`" +msgstr ":class:`!importlib.abc.Traversable`" + +#: ../../deprecations/pending-removal-in-3.14.rst:48 +msgid ":class:`!importlib.abc.TraversableResources`" +msgstr ":class:`!importlib.abc.TraversableResources`" + +#: ../../deprecations/pending-removal-in-3.14.rst:50 +msgid "Use :mod:`importlib.resources.abc` classes instead:" +msgstr "使用 :mod:`importlib.resources.abc` 类代替:" + +#: ../../deprecations/pending-removal-in-3.14.rst:52 +msgid ":class:`importlib.resources.abc.Traversable`" +msgstr ":class:`importlib.resources.abc.Traversable`" + +#: ../../deprecations/pending-removal-in-3.14.rst:53 +msgid ":class:`importlib.resources.abc.TraversableResources`" +msgstr ":class:`importlib.resources.abc.TraversableResources`" + +#: ../../deprecations/pending-removal-in-3.14.rst:55 +msgid "(Contributed by Jason R. Coombs and Hugo van Kemenade in :gh:`93963`.)" +msgstr "(由 Jason R. Coombs 和 Hugo van Kemenade 在 :gh:`93963` 中贡献。)" + +#: ../../deprecations/pending-removal-in-3.14.rst:57 +msgid "" +":mod:`itertools` had undocumented, inefficient, historically buggy, and " +"inconsistent support for copy, deepcopy, and pickle operations. This will be" +" removed in 3.14 for a significant reduction in code volume and maintenance " +"burden. (Contributed by Raymond Hettinger in :gh:`101588`.)" +msgstr "" +":mod:`itertools` 具有对 copy, deepcopy 和 pickle 等操作的未写入文档的、低效的、历史上充满问题的且不稳定的支持。" +" 这将在 3.14 中移除以显著减少代码量和维护负担。 (由 Raymond Hettinger 在 :gh:`101588` 中贡献。)" + +#: ../../deprecations/pending-removal-in-3.14.rst:63 +msgid "" +":mod:`multiprocessing`: The default start method will change to a safer one " +"on Linux, BSDs, and other non-macOS POSIX platforms where ``'fork'`` is " +"currently the default (:gh:`84559`). Adding a runtime warning about this was" +" deemed too disruptive as the majority of code is not expected to care. Use " +"the :func:`~multiprocessing.get_context` or " +":func:`~multiprocessing.set_start_method` APIs to explicitly specify when " +"your code *requires* ``'fork'``. See :ref:`multiprocessing-start-methods`." +msgstr "" +":mod:`multiprocessing`: 默认的启动方法在目前默认使用 ``'fork'`` 的 Linux, BSD 和其他非 macOS " +"POSIX 平台上将改为更安全的方法 (:gh:`84559`)。为此添加运行时警告将带来糟糕的体验因为大部分代码并不会关心这个问题。当你的代码 " +"*需要* ``'fork'`` 时请使用 :func:`~multiprocessing.get_context` 或 " +":func:`~multiprocessing.set_start_method` API 来显式地指明。参见 " +":ref:`multiprocessing-start-methods`." + +#: ../../deprecations/pending-removal-in-3.14.rst:71 +msgid "" +":mod:`pathlib`: :meth:`~pathlib.PurePath.is_relative_to` and " +":meth:`~pathlib.PurePath.relative_to`: passing additional arguments is " +"deprecated." +msgstr "" +":mod:`pathlib`: :meth:`~pathlib.PurePath.is_relative_to` 和 " +":meth:`~pathlib.PurePath.relative_to`: 传入额外参数的做法已被弃用。" + +#: ../../deprecations/pending-removal-in-3.14.rst:75 +msgid "" +":mod:`pkgutil`: :func:`!pkgutil.find_loader` and :func:`!pkgutil.get_loader`" +" now raise :exc:`DeprecationWarning`; use :func:`importlib.util.find_spec` " +"instead. (Contributed by Nikita Sobolev in :gh:`97850`.)" +msgstr "" +":mod:`pkgutil`: 现在 :func:`!pkgutil.find_loader` 和 " +":func:`!pkgutil.get_loader` 将引发 :exc:`DeprecationWarning`;请改用 " +":func:`importlib.util.find_spec`。 (由 Nikita Sobolev 在 :gh:`97850` 中贡献。)" + +#: ../../deprecations/pending-removal-in-3.14.rst:80 +msgid ":mod:`pty`:" +msgstr ":mod:`pty`:" + +#: ../../deprecations/pending-removal-in-3.14.rst:82 +msgid "``master_open()``: use :func:`pty.openpty`." +msgstr "``master_open()``: 使用 :func:`pty.openpty`。" + +#: ../../deprecations/pending-removal-in-3.14.rst:83 +msgid "``slave_open()``: use :func:`pty.openpty`." +msgstr "``slave_open()``: 使用 :func:`pty.openpty`。" + +#: ../../deprecations/pending-removal-in-3.14.rst:85 +msgid ":mod:`sqlite3`:" +msgstr ":mod:`sqlite3`:" + +#: ../../deprecations/pending-removal-in-3.14.rst:87 +msgid ":data:`!version` and :data:`!version_info`." +msgstr ":data:`!version` 和 :data:`!version_info`。" + +#: ../../deprecations/pending-removal-in-3.14.rst:89 +msgid "" +":meth:`~sqlite3.Cursor.execute` and :meth:`~sqlite3.Cursor.executemany` if " +":ref:`named placeholders ` are used and *parameters* " +"is a sequence instead of a :class:`dict`." +msgstr "" +":meth:`~sqlite3.Cursor.execute` 和 :meth:`~sqlite3.Cursor.executemany` 在使用了 " +":ref:`命名占位符 ` 且 *parameters* 是序列而不是 :class:`dict` 时。" + +#: ../../deprecations/pending-removal-in-3.14.rst:93 +msgid "" +":mod:`urllib`: :class:`!urllib.parse.Quoter` is deprecated: it was not " +"intended to be a public API. (Contributed by Gregory P. Smith in " +":gh:`88168`.)" +msgstr "" +":mod:`urllib`: :class:`!urllib.parse.Quoter` 已被弃用:它不应被作为公有 API。 (由 Gregory " +"P. Smith 在 :gh:`88168` 中贡献。)" diff --git a/deprecations/pending-removal-in-3.15.po b/deprecations/pending-removal-in-3.15.po new file mode 100644 index 0000000000..0c460c7f91 --- /dev/null +++ b/deprecations/pending-removal-in-3.15.po @@ -0,0 +1,221 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-06-11 18:32+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../deprecations/pending-removal-in-3.15.rst:2 +msgid "Pending removal in Python 3.15" +msgstr "计划在 Python 3.15 中移除" + +#: ../../deprecations/pending-removal-in-3.15.rst:4 +msgid "The import system:" +msgstr "导入系统:" + +#: ../../deprecations/pending-removal-in-3.15.rst:6 +msgid "" +"Setting :attr:`~module.__cached__` on a module while failing to set " +":attr:`__spec__.cached ` is " +"deprecated. In Python 3.15, :attr:`!__cached__` will cease to be set or take" +" into consideration by the import system or standard library. (:gh:`97879`)" +msgstr "" +"当设置 :attr:`__spec__.cached ` " +"失败时在模块上设置 :attr:`~module.__cached__` 的做法已被弃用。在 Python 3.15 " +"中,:attr:`!__cached__` 将不会再被导入系统或标准库纳入考虑。 (:gh:`97879`)" + +#: ../../deprecations/pending-removal-in-3.15.rst:11 +msgid "" +"Setting :attr:`~module.__package__` on a module while failing to set " +":attr:`__spec__.parent ` is " +"deprecated. In Python 3.15, :attr:`!__package__` will cease to be set or " +"take into consideration by the import system or standard library. " +"(:gh:`97879`)" +msgstr "" +"当设置 :attr:`__spec__.parent ` " +"失败时在模块上设置 :attr:`~module.__package__` 的做法已被弃用。在 Python 3.15 " +"中,:attr:`!__package__` 将不会再被导入系统或标准库纳入考虑。 (:gh:`97879`)" + +#: ../../deprecations/pending-removal-in-3.15.rst:16 +msgid ":mod:`ctypes`:" +msgstr ":mod:`ctypes`:" + +#: ../../deprecations/pending-removal-in-3.15.rst:18 +msgid "" +"The undocumented :func:`!ctypes.SetPointerType` function has been deprecated" +" since Python 3.13." +msgstr "未写入文档的 :func:`!ctypes.SetPointerType` 函数自 Python 3.13 起已被弃用。" + +#: ../../deprecations/pending-removal-in-3.15.rst:21 +msgid ":mod:`http.server`:" +msgstr ":mod:`http.server`:" + +#: ../../deprecations/pending-removal-in-3.15.rst:23 +msgid "" +"The obsolete and rarely used :class:`~http.server.CGIHTTPRequestHandler` has" +" been deprecated since Python 3.13. No direct replacement exists. *Anything*" +" is better than CGI to interface a web server with a request handler." +msgstr "" +"过时且很少被使用的 :class:`~http.server.CGIHTTPRequestHandler` 自 Python 3.13 起已被弃用。 " +"不存在直接的替代品。对于建立带有请求处理器的 Web 服务器接口的任务来说 *任何东西* 都比 CGI 要好。" + +#: ../../deprecations/pending-removal-in-3.15.rst:29 +msgid "" +"The :option:`!--cgi` flag to the :program:`python -m http.server` command-" +"line interface has been deprecated since Python 3.13." +msgstr "" +"用于 :program:`python -m http.server` 命令行界面的 :option:`!--cgi` 旗标自 Python 3.13 " +"起已被弃用。" + +#: ../../deprecations/pending-removal-in-3.15.rst:32 +msgid ":mod:`importlib`:" +msgstr ":mod:`importlib`:" + +#: ../../deprecations/pending-removal-in-3.15.rst:34 +msgid "``load_module()`` method: use ``exec_module()`` instead." +msgstr "``load_module()`` 方法:改用 ``exec_module()``。" + +#: ../../deprecations/pending-removal-in-3.15.rst:36 +msgid ":mod:`pathlib`:" +msgstr ":mod:`pathlib`:" + +#: ../../deprecations/pending-removal-in-3.15.rst:38 +msgid "" +":meth:`.PurePath.is_reserved` has been deprecated since Python 3.13. Use " +":func:`os.path.isreserved` to detect reserved paths on Windows." +msgstr "" +":meth:`.PurePath.is_reserved` 自 Python 3.13 起已被弃用。请使用 " +":func:`os.path.isreserved` 来检测 Windows 上的保留路径。" + +#: ../../deprecations/pending-removal-in-3.15.rst:42 +msgid ":mod:`platform`:" +msgstr ":mod:`platform`:" + +#: ../../deprecations/pending-removal-in-3.15.rst:44 +msgid "" +":func:`~platform.java_ver` has been deprecated since Python 3.13. This " +"function is only useful for Jython support, has a confusing API, and is " +"largely untested." +msgstr "" +":func:`~platform.java_ver` 自 Python 3.13 起已被弃用。此函数仅对 Jython 支持有用,具有令人困惑的 " +"API,并且大部分未经测试。" + +#: ../../deprecations/pending-removal-in-3.15.rst:48 +msgid ":mod:`sysconfig`:" +msgstr ":mod:`sysconfig`:" + +#: ../../deprecations/pending-removal-in-3.15.rst:50 +msgid "" +"The *check_home* argument of :func:`sysconfig.is_python_build` has been " +"deprecated since Python 3.12." +msgstr "" +":func:`sysconfig.is_python_build` 的 *check_home* 参数自 Python 3.12 起已被弃用。" + +#: ../../deprecations/pending-removal-in-3.15.rst:53 +msgid ":mod:`threading`:" +msgstr ":mod:`threading`:" + +#: ../../deprecations/pending-removal-in-3.15.rst:55 +msgid "" +":func:`~threading.RLock` will take no arguments in Python 3.15. Passing any " +"arguments has been deprecated since Python 3.14, as the Python version does " +"not permit any arguments, but the C version allows any number of positional " +"or keyword arguments, ignoring every argument." +msgstr "" +" Python 3.15 中 :func:`~threading.RLock` 将不再接受参数。 传入参数的做法自 Python 3.14 " +"起已被弃用,因为 Python 版本不允许任何参数,但 C 版本允许任意数量的位置或关键字参数,但会忽略所有参数。" + +#: ../../deprecations/pending-removal-in-3.15.rst:61 +msgid ":mod:`types`:" +msgstr ":mod:`types`:" + +#: ../../deprecations/pending-removal-in-3.15.rst:63 +msgid "" +":class:`types.CodeType`: Accessing :attr:`~codeobject.co_lnotab` was " +"deprecated in :pep:`626` since 3.10 and was planned to be removed in 3.12, " +"but it only got a proper :exc:`DeprecationWarning` in 3.12. May be removed " +"in 3.15. (Contributed by Nikita Sobolev in :gh:`101866`.)" +msgstr "" +":class:`types.CodeType`: 访问 :attr:`~codeobject.co_lnotab` 的做法自 3.10 起已根据 " +":pep:`626` 被弃用并曾计划在 3.12 中移除,但在 3.12 中实际仅设置了 :exc:`DeprecationWarning`。可能会在 " +"3.15 中移除。 (由 Nikita Sobolev 在 :gh:`101866` 中贡献。)" + +#: ../../deprecations/pending-removal-in-3.15.rst:70 +msgid ":mod:`typing`:" +msgstr ":mod:`typing`:" + +#: ../../deprecations/pending-removal-in-3.15.rst:72 +msgid "" +"The undocumented keyword argument syntax for creating " +":class:`~typing.NamedTuple` classes (for example, ``Point = " +"NamedTuple(\"Point\", x=int, y=int)``) has been deprecated since Python " +"3.13. Use the class-based syntax or the functional syntax instead." +msgstr "" +"未写入文档的用于创建 :class:`~typing.NamedTuple` 类的关键字参数语法 (例如 ``Point = " +"NamedTuple(\"Point\", x=int, y=int)``) 自 Python 3.13 起已被弃用。请改用基于类的语法或函数式语法。" + +#: ../../deprecations/pending-removal-in-3.15.rst:78 +msgid "" +"When using the functional syntax of :class:`~typing.TypedDict`\\s, failing " +"to pass a value to the *fields* parameter (``TD = TypedDict(\"TD\")``) or " +"passing ``None`` (``TD = TypedDict(\"TD\", None)``) has been deprecated " +"since Python 3.13. Use ``class TD(TypedDict): pass`` or ``TD = " +"TypedDict(\"TD\", {})`` to create a TypedDict with zero field." +msgstr "" +"当使用 :class:`~typing.TypedDict` 的函数式语法时,不向 *fields* 形参传递值 (``TD = " +"TypedDict(\"TD\")``) 或传递 ``None`` (``TD = TypedDict(\"TD\", None)``) 的做法自 " +"Python 3.13 起已被弃用。请改用 ``class TD(TypedDict): pass`` 或 ``TD = " +"TypedDict(\"TD\", {})`` 来创建一个零字段的 TypedDict。" + +#: ../../deprecations/pending-removal-in-3.15.rst:85 +msgid "" +"The :func:`typing.no_type_check_decorator` decorator function has been " +"deprecated since Python 3.13. After eight years in the :mod:`typing` module," +" it has yet to be supported by any major type checker." +msgstr "" +":func:`typing.no_type_check_decorator` 装饰器自 Python 3.13 起已被弃用。存在于 " +":mod:`typing` 模块八年之后,它仍未被任何主要类型检查器所支持。" + +#: ../../deprecations/pending-removal-in-3.15.rst:90 +msgid ":mod:`wave`:" +msgstr ":mod:`wave`:" + +#: ../../deprecations/pending-removal-in-3.15.rst:92 +msgid "" +"The :meth:`~wave.Wave_read.getmark`, :meth:`!setmark`, and " +":meth:`~wave.Wave_read.getmarkers` methods of the :class:`~wave.Wave_read` " +"and :class:`~wave.Wave_write` classes have been deprecated since Python " +"3.13." +msgstr "" +":class:`~wave.Wave_read` 和 :class:`~wave.Wave_write` 类的 " +":meth:`~wave.Wave_read.getmark`, :meth:`!setmark` 和 " +":meth:`~wave.Wave_read.getmarkers` 方法自 Python 3.13 起已被弃用。" + +#: ../../deprecations/pending-removal-in-3.15.rst:97 +msgid ":mod:`zipimport`:" +msgstr ":mod:`zipimport`:" + +#: ../../deprecations/pending-removal-in-3.15.rst:99 +msgid "" +":meth:`~zipimport.zipimporter.load_module` has been deprecated since Python " +"3.10. Use :meth:`~zipimport.zipimporter.exec_module` instead. (Contributed " +"by Jiahao Li in :gh:`125746`.)" +msgstr "" +":meth:`~zipimport.zipimporter.load_module` 自 Python 3.10 起已被弃用。请改用 " +":meth:`~zipimport.zipimporter.exec_module`。 (由李佳昊在 :gh:`125746` 中贡献。)" diff --git a/deprecations/pending-removal-in-3.16.po b/deprecations/pending-removal-in-3.16.po new file mode 100644 index 0000000000..38c4a3a61f --- /dev/null +++ b/deprecations/pending-removal-in-3.16.po @@ -0,0 +1,245 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../deprecations/pending-removal-in-3.16.rst:2 +msgid "Pending removal in Python 3.16" +msgstr "计划在 Python 3.16 中移除" + +#: ../../deprecations/pending-removal-in-3.16.rst:4 +msgid "The import system:" +msgstr "导入系统:" + +#: ../../deprecations/pending-removal-in-3.16.rst:6 +msgid "" +"Setting :attr:`~module.__loader__` on a module while failing to set " +":attr:`__spec__.loader ` is " +"deprecated. In Python 3.16, :attr:`!__loader__` will cease to be set or " +"taken into consideration by the import system or the standard library." +msgstr "" +"当设置 :attr:`__spec__.loader ` " +"失败时在模块上设置 :attr:`~module.__loader__` 的做法已被弃用。在 Python 3.16 " +"中,:attr:`!__loader__` 将不会再被设置或是被导入系统或标准库纳入考虑。" + +#: ../../deprecations/pending-removal-in-3.16.rst:11 +msgid ":mod:`array`:" +msgstr ":mod:`array`:" + +#: ../../deprecations/pending-removal-in-3.16.rst:13 +msgid "" +"The ``'u'`` format code (:c:type:`wchar_t`) has been deprecated in " +"documentation since Python 3.3 and at runtime since Python 3.13. Use the " +"``'w'`` format code (:c:type:`Py_UCS4`) for Unicode characters instead." +msgstr "" +"``'u'`` 格式代码 (:c:type:`wchar_t`) 自 Python 3.3 起已在文档中弃用并自 Python 3.13 " +"起在运行时弃用。对于 Unicode 字符请改用 ``'w'`` 格式代码 (:c:type:`Py_UCS4`)。" + +#: ../../deprecations/pending-removal-in-3.16.rst:19 +msgid ":mod:`asyncio`:" +msgstr ":mod:`asyncio`:" + +#: ../../deprecations/pending-removal-in-3.16.rst:21 +msgid "" +":func:`!asyncio.iscoroutinefunction` is deprecated and will be removed in " +"Python 3.16; use :func:`inspect.iscoroutinefunction` instead. (Contributed " +"by Jiahao Li and Kumar Aditya in :gh:`122875`.)" +msgstr "" +":func:`!asyncio.iscoroutinefunction` 已被弃用并将在 Python 3.16 中移除,请改用 :func:`inspect.iscoroutinefunction`。\n" +"(由李佳昊和 Kumar Aditya 在 :gh:`122875` 中贡献。)" + +#: ../../deprecations/pending-removal-in-3.16.rst:26 +msgid "" +":mod:`asyncio` policy system is deprecated and will be removed in Python " +"3.16. In particular, the following classes and functions are deprecated:" +msgstr ":mod:`asyncio` 策略系统已被弃用并将在 Python 3.16 中移除。具体而言,是弃用了下列类和函数:" + +#: ../../deprecations/pending-removal-in-3.16.rst:29 +msgid ":class:`asyncio.AbstractEventLoopPolicy`" +msgstr ":class:`asyncio.AbstractEventLoopPolicy`" + +#: ../../deprecations/pending-removal-in-3.16.rst:30 +msgid ":class:`asyncio.DefaultEventLoopPolicy`" +msgstr ":class:`asyncio.DefaultEventLoopPolicy`" + +#: ../../deprecations/pending-removal-in-3.16.rst:31 +msgid ":class:`asyncio.WindowsSelectorEventLoopPolicy`" +msgstr ":class:`asyncio.WindowsSelectorEventLoopPolicy`" + +#: ../../deprecations/pending-removal-in-3.16.rst:32 +msgid ":class:`asyncio.WindowsProactorEventLoopPolicy`" +msgstr ":class:`asyncio.WindowsProactorEventLoopPolicy`" + +#: ../../deprecations/pending-removal-in-3.16.rst:33 +msgid ":func:`asyncio.get_event_loop_policy`" +msgstr ":func:`asyncio.get_event_loop_policy`" + +#: ../../deprecations/pending-removal-in-3.16.rst:34 +msgid ":func:`asyncio.set_event_loop_policy`" +msgstr ":func:`asyncio.set_event_loop_policy`" + +#: ../../deprecations/pending-removal-in-3.16.rst:36 +msgid "" +"Users should use :func:`asyncio.run` or :class:`asyncio.Runner` with " +"*loop_factory* to use the desired event loop implementation." +msgstr "" +"用户应当使用 :func:`asyncio.run` 或 :class:`asyncio.Runner` 并附带 *loop_factory* " +"以使用想要的事件循环实现。" + +#: ../../deprecations/pending-removal-in-3.16.rst:39 +msgid "For example, to use :class:`asyncio.SelectorEventLoop` on Windows::" +msgstr "例如,在 Windows 上使用 :class:`asyncio.SelectorEventLoop`::" + +#: ../../deprecations/pending-removal-in-3.16.rst:41 +msgid "" +"import asyncio\n" +"\n" +"async def main():\n" +" ...\n" +"\n" +"asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop)" +msgstr "" +"import asyncio\n" +"\n" +"async def main():\n" +" ...\n" +"\n" +"asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop)" + +#: ../../deprecations/pending-removal-in-3.16.rst:48 +msgid "(Contributed by Kumar Aditya in :gh:`127949`.)" +msgstr "(由 Kumar Aditya 在 :gh:`127949` 中贡献。)" + +#: ../../deprecations/pending-removal-in-3.16.rst:50 +msgid ":mod:`builtins`:" +msgstr ":mod:`builtins`:" + +#: ../../deprecations/pending-removal-in-3.16.rst:52 +msgid "" +"Bitwise inversion on boolean types, ``~True`` or ``~False`` has been " +"deprecated since Python 3.12, as it produces surprising and unintuitive " +"results (``-2`` and ``-1``). Use ``not x`` instead for the logical negation " +"of a Boolean. In the rare case that you need the bitwise inversion of the " +"underlying integer, convert to ``int`` explicitly (``~int(x)``)." +msgstr "" +"对布尔类型 ``~True`` 或 ``~False`` 执行按位取反的操作自 Python 3.12 起已被弃用,因为它会产生奇怪和不直观的结果 " +"(``-2`` 和 ``-1``)。请改用 ``not x`` 来对布尔值执行逻辑否操作。 " +"对于需要对下层整数执行按位取反操作的少数场合,请显式地将其转换为 ``int`` (``~int(x)``)。" + +#: ../../deprecations/pending-removal-in-3.16.rst:59 +msgid ":mod:`functools`:" +msgstr ":mod:`functools`:" + +#: ../../deprecations/pending-removal-in-3.16.rst:61 +msgid "" +"Calling the Python implementation of :func:`functools.reduce` with " +"*function* or *sequence* as keyword arguments has been deprecated since " +"Python 3.14." +msgstr "" +"调用 :func:`functools.reduce` 的 Python 实现并传入 *function* 或 *sequence* " +"作为关键字参数的做法自 Python 3.14 起已被弃用。" + +#: ../../deprecations/pending-removal-in-3.16.rst:64 +msgid ":mod:`logging`:" +msgstr ":mod:`logging`:" + +#: ../../deprecations/pending-removal-in-3.16.rst:66 +msgid "" +"Support for custom logging handlers with the *strm* argument is deprecated " +"and scheduled for removal in Python 3.16. Define handlers with the *stream* " +"argument instead. (Contributed by Mariusz Felisiak in :gh:`115032`.)" +msgstr "" +"使用 *strm* 参数对自定义日志记录处理器提供支持的做法已被弃用并计划在 Python 3.16 中移除。改为使用 *stream* " +"参数定义处理器。 (由 Mariusz Felisiak 在 :gh:`115032` 中贡献。)" + +#: ../../deprecations/pending-removal-in-3.16.rst:70 +msgid ":mod:`mimetypes`:" +msgstr ":mod:`mimetypes`:" + +#: ../../deprecations/pending-removal-in-3.16.rst:72 +msgid "" +"Valid extensions start with a '.' or are empty for " +":meth:`mimetypes.MimeTypes.add_type`. Undotted extensions are deprecated and" +" will raise a :exc:`ValueError` in Python 3.16. (Contributed by Hugo van " +"Kemenade in :gh:`75223`.)" +msgstr "" +"有效扩展以 '.' 开头或对于 :meth:`mimetypes.MimeTypes.add_type` 为空。未加点的扩展已弃用,在 Python " +"3.16 中将引发 :exc:`ValueError`。 (由 Hugo van Kemenade 在 :gh:`75223` 中贡献。)" + +#: ../../deprecations/pending-removal-in-3.16.rst:78 +msgid ":mod:`shutil`:" +msgstr ":mod:`shutil`:" + +#: ../../deprecations/pending-removal-in-3.16.rst:80 +msgid "" +"The :class:`!ExecError` exception has been deprecated since Python 3.14. It " +"has not been used by any function in :mod:`!shutil` since Python 3.4, and is" +" now an alias of :exc:`RuntimeError`." +msgstr "" +":class:`!ExecError` 异常自 Python 3.14 起已被弃用。它自 Python 3.4 起就未被 :mod:`!shutil` " +"中的任何函数所使用,现在是 :exc:`RuntimeError` 的一个别名。" + +#: ../../deprecations/pending-removal-in-3.16.rst:85 +msgid ":mod:`symtable`:" +msgstr ":mod:`symtable`:" + +#: ../../deprecations/pending-removal-in-3.16.rst:87 +msgid "" +"The :meth:`Class.get_methods ` method has been " +"deprecated since Python 3.14." +msgstr "" +":meth:`Class.get_methods ` 方法自 Python 3.14 起被弃用。" + +#: ../../deprecations/pending-removal-in-3.16.rst:90 +msgid ":mod:`sys`:" +msgstr ":mod:`sys`:" + +#: ../../deprecations/pending-removal-in-3.16.rst:92 +msgid "" +"The :func:`~sys._enablelegacywindowsfsencoding` function has been deprecated" +" since Python 3.13. Use the :envvar:`PYTHONLEGACYWINDOWSFSENCODING` " +"environment variable instead." +msgstr "" +":func:`~sys._enablelegacywindowsfsencoding` 函数自 Python 3.13 起被弃用。请改用 " +":envvar:`PYTHONLEGACYWINDOWSFSENCODING` 环境变量。" + +#: ../../deprecations/pending-removal-in-3.16.rst:96 +msgid ":mod:`sysconfig`:" +msgstr ":mod:`sysconfig`:" + +#: ../../deprecations/pending-removal-in-3.16.rst:98 +msgid "" +"The :func:`!sysconfig.expand_makefile_vars` function has been deprecated " +"since Python 3.14. Use the ``vars`` argument of :func:`sysconfig.get_paths` " +"instead." +msgstr "" +"自 Python 3.14 起 :func:`!sysconfig.expand_makefile_vars` 函数已被弃用。请使用 " +":func:`sysconfig.get_paths` 的 ``vars`` 参数代替。" + +#: ../../deprecations/pending-removal-in-3.16.rst:102 +msgid ":mod:`tarfile`:" +msgstr ":mod:`tarfile`:" + +#: ../../deprecations/pending-removal-in-3.16.rst:104 +msgid "" +"The undocumented and unused :attr:`!TarFile.tarfile` attribute has been " +"deprecated since Python 3.13." +msgstr "未写入文档也未被使用的 :attr:`!TarFile.tarfile` 属性自 Python 3.13 起被弃用。" diff --git a/deprecations/pending-removal-in-3.17.po b/deprecations/pending-removal-in-3.17.po new file mode 100644 index 0000000000..6039b50031 --- /dev/null +++ b/deprecations/pending-removal-in-3.17.po @@ -0,0 +1,131 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# 汇民 王 , 2025 +# 99 , 2026 +# python-doc bot, 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:00+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../deprecations/pending-removal-in-3.17.rst:2 +msgid "Pending removal in Python 3.17" +msgstr "计划在 Python 3.17 中移除" + +#: ../../deprecations/pending-removal-in-3.17.rst:4 +msgid ":mod:`datetime`:" +msgstr ":mod:`datetime`:" + +#: ../../deprecations/pending-removal-in-3.17.rst:6 +msgid "" +":meth:`~datetime.datetime.strptime` calls using a format string containing " +"``%e`` (day of month) without a year. This has been deprecated since Python " +"3.15. (Contributed by Stan Ulbrych in :gh:`70647`.)" +msgstr "" + +#: ../../deprecations/pending-removal-in-3.17.rst:12 +msgid ":mod:`collections.abc`:" +msgstr ":mod:`collections.abc`:" + +#: ../../deprecations/pending-removal-in-3.17.rst:14 +msgid "" +":class:`collections.abc.ByteString` is scheduled for removal in Python 3.17." +msgstr ":class:`collections.abc.ByteString` 计划在 Python 3.17 中移除。" + +#: ../../deprecations/pending-removal-in-3.17.rst:16 +#: ../../deprecations/pending-removal-in-3.17.rst:55 +msgid "" +"Use ``isinstance(obj, collections.abc.Buffer)`` to test if ``obj`` " +"implements the :ref:`buffer protocol ` at runtime. For use in" +" type annotations, either use :class:`~collections.abc.Buffer` or a union " +"that explicitly specifies the types your code supports (e.g., ``bytes | " +"bytearray | memoryview``)." +msgstr "" +"使用 ``isinstance(obj, collections.abc.Buffer)`` 来在运行时测试 ``obj`` 是否实现了 " +":ref:`缓冲区协议 `。要用于类型标注,则使用 :class:`~collections.abc.Buffer` " +"或者显式指明你的代码所支持的类型的并集 (例如 ``bytes | bytearray | memoryview``)。" + +#: ../../deprecations/pending-removal-in-3.17.rst:22 +#: ../../deprecations/pending-removal-in-3.17.rst:61 +msgid "" +":class:`!ByteString` was originally intended to be an abstract class that " +"would serve as a supertype of both :class:`bytes` and :class:`bytearray`. " +"However, since the ABC never had any methods, knowing that an object was an " +"instance of :class:`!ByteString` never actually told you anything useful " +"about the object. Other common buffer types such as :class:`memoryview` were" +" also never understood as subtypes of :class:`!ByteString` (either at " +"runtime or by static type checkers)." +msgstr "" +":class:`!ByteString` 原本是想作为 :class:`bytes` 和 :class:`bytearray` 的超类型的抽象基类提供。" +" 不过,由于该 ABC 从未有过任何方法,知道一个对象是 :class:`!ByteString` 的实例并不能真正告诉你有关该对象的任何有用信息。 " +"其他常见缓冲区类型如 :class:`memoryview` 同样不能被当作是 :class:`!ByteString` " +"的子类型(无论是在运行时还是对于静态类型检查器)。" + +#: ../../deprecations/pending-removal-in-3.17.rst:30 +#: ../../deprecations/pending-removal-in-3.17.rst:69 +msgid "" +"See :pep:`PEP 688 <688#current-options>` for more details. (Contributed by " +"Shantanu Jain in :gh:`91896`.)" +msgstr "" +"请参阅 :pep:`PEP 688 <688#current-options>` 了解详情。 (由 Shantanu Jain 在 " +":gh:`91896` 中贡献。)" + +#: ../../deprecations/pending-removal-in-3.17.rst:34 +msgid ":mod:`encodings`:" +msgstr ":mod:`encodings`:" + +#: ../../deprecations/pending-removal-in-3.17.rst:36 +msgid "" +"Passing non-ascii *encoding* names to :func:`encodings.normalize_encoding` " +"is deprecated and scheduled for removal in Python 3.17. (Contributed by Stan" +" Ulbrych in :gh:`136702`.)" +msgstr "" + +#: ../../deprecations/pending-removal-in-3.17.rst:40 +msgid ":mod:`webbrowser`:" +msgstr ":mod:`webbrowser`:" + +#: ../../deprecations/pending-removal-in-3.17.rst:42 +msgid "" +":class:`!webbrowser.MacOSXOSAScript` is deprecated in favour of " +":class:`!webbrowser.MacOS`. (:gh:`137586`)" +msgstr "" + +#: ../../deprecations/pending-removal-in-3.17.rst:45 +msgid ":mod:`typing`:" +msgstr ":mod:`typing`:" + +#: ../../deprecations/pending-removal-in-3.17.rst:47 +msgid "" +"Before Python 3.14, old-style unions were implemented using the private " +"class ``typing._UnionGenericAlias``. This class is no longer needed for the " +"implementation, but it has been retained for backward compatibility, with " +"removal scheduled for Python 3.17. Users should use documented introspection" +" helpers like :func:`typing.get_origin` and :func:`typing.get_args` instead " +"of relying on private implementation details." +msgstr "" +"在 Python 3.14 之前,旧式的联合是通过私有类 ``typing._UnionGenericAlias`` 实现的。 " +"实现已不再需要该类,但为向后兼容性保留了该类,并计划在 Python 3.17 中删除。用户应使用已写入文档的内省助手函数,如 " +":func:`typing.get_origin` 和 :func:`typing.get_args`,而不是依赖于私有的实现细节。" + +#: ../../deprecations/pending-removal-in-3.17.rst:52 +msgid "" +":class:`typing.ByteString`, deprecated since Python 3.9, is scheduled for " +"removal in Python 3.17." +msgstr ":class:`typing.ByteString` 自 Python 3.9 起已被弃用,计划在 Python 3.17 中移除。" diff --git a/deprecations/pending-removal-in-3.18.po b/deprecations/pending-removal-in-3.18.po new file mode 100644 index 0000000000..e6b05e380d --- /dev/null +++ b/deprecations/pending-removal-in-3.18.po @@ -0,0 +1,40 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../deprecations/pending-removal-in-3.18.rst:2 +msgid "Pending removal in Python 3.18" +msgstr "计划在 Python 3.18 中移除" + +#: ../../deprecations/pending-removal-in-3.18.rst:4 +msgid ":mod:`decimal`:" +msgstr ":mod:`decimal`:" + +#: ../../deprecations/pending-removal-in-3.18.rst:6 +msgid "" +"The non-standard and undocumented :class:`~decimal.Decimal` format specifier" +" ``'N'``, which is only supported in the :mod:`!decimal` module's C " +"implementation, has been deprecated since Python 3.13. (Contributed by " +"Serhiy Storchaka in :gh:`89902`.)" +msgstr "" +"非标准且未写入文档的 :class:`~decimal.Decimal` 格式说明符 ``'N'``,它仅在 :mod:`!decimal` 模块的 C" +" 实现中受到支持,自 Python 3.13 起已被弃用。 (由 Serhiy Storchaka 在 :gh:`89902` 中贡献。)" diff --git a/deprecations/pending-removal-in-3.19.po b/deprecations/pending-removal-in-3.19.po new file mode 100644 index 0000000000..eb41dd63ed --- /dev/null +++ b/deprecations/pending-removal-in-3.19.po @@ -0,0 +1,102 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:00+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../deprecations/pending-removal-in-3.19.rst:2 +msgid "Pending removal in Python 3.19" +msgstr "计划在 Python 3.19 中移除" + +#: ../../deprecations/pending-removal-in-3.19.rst:4 +msgid ":mod:`ctypes`:" +msgstr ":mod:`ctypes`:" + +#: ../../deprecations/pending-removal-in-3.19.rst:6 +msgid "" +"Implicitly switching to the MSVC-compatible struct layout by setting " +":attr:`~ctypes.Structure._pack_` but not :attr:`~ctypes.Structure._layout_` " +"on non-Windows platforms." +msgstr "" +"在非 Windows 平台上,通过设置 :attr:`~ctypes.Structure._pack_` 而非 " +":attr:`~ctypes.Structure._layout_`,隐式切换到与 MSVC 兼容的结构布局。" + +#: ../../deprecations/pending-removal-in-3.19.rst:10 +msgid ":mod:`hashlib`:" +msgstr ":mod:`hashlib`:" + +#: ../../deprecations/pending-removal-in-3.19.rst:12 +msgid "" +"In hash function constructors such as :func:`~hashlib.new` or the direct " +"hash-named constructors such as :func:`~hashlib.md5` and " +":func:`~hashlib.sha256`, their optional initial data parameter could also be" +" passed a keyword argument named ``data=`` or ``string=`` in various " +":mod:`!hashlib` implementations." +msgstr "" + +#: ../../deprecations/pending-removal-in-3.19.rst:18 +msgid "" +"Support for the ``string`` keyword argument name is now deprecated and " +"slated for removal in Python 3.19." +msgstr "" + +#: ../../deprecations/pending-removal-in-3.19.rst:21 +msgid "" +"Before Python 3.13, the ``string`` keyword parameter was not correctly " +"supported depending on the backend implementation of hash functions. Prefer " +"passing the initial data as a positional argument for maximum backwards " +"compatibility." +msgstr "" + +#: ../../deprecations/pending-removal-in-3.19.rst:26 +msgid ":mod:`http.cookies`:" +msgstr "" + +#: ../../deprecations/pending-removal-in-3.19.rst:28 +msgid "" +":meth:`http.cookies.Morsel.js_output` is deprecated and will be removed in " +"Python 3.19." +msgstr "" + +#: ../../deprecations/pending-removal-in-3.19.rst:31 +msgid "" +":meth:`http.cookies.BaseCookie.js_output` is deprecated and will be removed " +"in Python 3.19." +msgstr "" + +#: ../../deprecations/pending-removal-in-3.19.rst:34 +msgid ":mod:`imaplib`:" +msgstr "" + +#: ../../deprecations/pending-removal-in-3.19.rst:36 +msgid "" +"Altering :attr:`IMAP4.file ` is now deprecated and " +"slated for removal in Python 3.19. This property is now unused and changing " +"its value does not automatically close the current file." +msgstr "" + +#: ../../deprecations/pending-removal-in-3.19.rst:40 +msgid "" +"Before Python 3.14, this property was used to implement the corresponding " +"``read()`` and ``readline()`` methods for :class:`~imaplib.IMAP4` but this " +"is no longer the case since then." +msgstr "" diff --git a/deprecations/pending-removal-in-future.po b/deprecations/pending-removal-in-future.po new file mode 100644 index 0000000000..7e1a69880a --- /dev/null +++ b/deprecations/pending-removal-in-future.po @@ -0,0 +1,444 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:00+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../deprecations/pending-removal-in-future.rst:2 +msgid "Pending removal in future versions" +msgstr "计划在未来版本中移除" + +#: ../../deprecations/pending-removal-in-future.rst:4 +msgid "" +"The following APIs will be removed in the future, although there is " +"currently no date scheduled for their removal." +msgstr "以下 API 将会被移除,尽管具体时间还未确定。" + +#: ../../deprecations/pending-removal-in-future.rst:7 +msgid ":mod:`argparse`:" +msgstr ":mod:`argparse`:" + +#: ../../deprecations/pending-removal-in-future.rst:9 +msgid "" +"Nesting argument groups and nesting mutually exclusive groups are " +"deprecated." +msgstr "嵌套参数组和嵌套互斥组已被弃用。" + +#: ../../deprecations/pending-removal-in-future.rst:11 +msgid "" +"Passing the undocumented keyword argument *prefix_chars* to " +":meth:`~argparse.ArgumentParser.add_argument_group` is now deprecated." +msgstr "" +"将未写入文档的关键字参数 *prefix_chars* 传递给 " +":meth:`~argparse.ArgumentParser.add_argument_group` 的做法现在已被弃用。" + +#: ../../deprecations/pending-removal-in-future.rst:14 +msgid "The :class:`argparse.FileType` type converter is deprecated." +msgstr ":class:`argparse.FileType` 类型转换器已弃用。" + +#: ../../deprecations/pending-removal-in-future.rst:16 +msgid ":mod:`builtins`:" +msgstr ":mod:`builtins`:" + +#: ../../deprecations/pending-removal-in-future.rst:18 +msgid "" +"Generators: ``throw(type, exc, tb)`` and ``athrow(type, exc, tb)`` signature" +" is deprecated: use ``throw(exc)`` and ``athrow(exc)`` instead, the single " +"argument signature." +msgstr "" +"生成器: ``throw(type, exc, tb)`` 和 ``athrow(type, exc, tb)`` 签名已被弃用:请改用 " +"``throw(exc)`` 和 ``athrow(exc)``,即单参数签名。" + +#: ../../deprecations/pending-removal-in-future.rst:21 +msgid "" +"Currently Python accepts numeric literals immediately followed by keywords, " +"for example ``0in x``, ``1or x``, ``0if 1else 2``. It allows confusing and " +"ambiguous expressions like ``[0x1for x in y]`` (which can be interpreted as " +"``[0x1 for x in y]`` or ``[0x1f or x in y]``). A syntax warning is raised " +"if the numeric literal is immediately followed by one of keywords " +":keyword:`and`, :keyword:`else`, :keyword:`for`, :keyword:`if`, " +":keyword:`in`, :keyword:`is` and :keyword:`or`. In a future release it will" +" be changed to a syntax error. (:gh:`87999`)" +msgstr "" +"目前 Python 接受数字类字面值后面紧跟关键字的写法,例如 ``0in x``, ``1or x``, ``0if 1else 2``。它允许像 " +"``[0x1for x in y]`` 这样令人困惑且有歧义的表达式 (它可以被解读为 ``[0x1 for x in y]`` 或者 ``[0x1f " +"or x in y]``)。如果数字类字面值后面紧跟关键字 :keyword:`and`, :keyword:`else`, " +":keyword:`for`, :keyword:`if`, :keyword:`in`, :keyword:`is` 和 :keyword:`or` " +"中的一个将会引发语法警告。在未来的版本中它将改为语法错误。 (:gh:`87999`)" + +#: ../../deprecations/pending-removal-in-future.rst:29 +msgid "" +"Support for ``__index__()`` and ``__int__()`` method returning non-int type:" +" these methods will be required to return an instance of a strict subclass " +"of :class:`int`." +msgstr "" +"对 ``__index__()`` 和 ``__int__()`` 方法返回非 int 类型的支持:将要求这些方法必须返回 :class:`int` " +"的严格子类的实例。" + +#: ../../deprecations/pending-removal-in-future.rst:32 +msgid "" +"Support for ``__float__()`` method returning a strict subclass of " +":class:`float`: these methods will be required to return an instance of " +":class:`float`." +msgstr "" +"对 ``__float__()`` 方法返回 :class:`float` 的子类的支持:将要求这些方法必须返回 :class:`float` 的实例。" + +#: ../../deprecations/pending-removal-in-future.rst:35 +msgid "" +"Support for ``__complex__()`` method returning a strict subclass of " +":class:`complex`: these methods will be required to return an instance of " +":class:`complex`." +msgstr "" +"对 ``__complex__()`` 方法返回 :class:`complex` 的子类的支持:将要求这些方法必须返回 " +":class:`complex` 的实例。" + +#: ../../deprecations/pending-removal-in-future.rst:38 +msgid "" +"Passing a complex number as the *real* or *imag* argument in the " +":func:`complex` constructor is now deprecated; it should only be passed as a" +" single positional argument. (Contributed by Serhiy Storchaka in " +":gh:`109218`.)" +msgstr "" +"传入一个复数作为 :func:`complex` 构造器中的 *real* 或 *imag* 参数的做法现在已被弃用;它应当仅作为单个位置参数被传入。 " +"(由 Serhiy Storchaka 在 :gh:`109218` 中贡献。)" + +#: ../../deprecations/pending-removal-in-future.rst:43 +msgid "" +":mod:`calendar`: ``calendar.January`` and ``calendar.February`` constants " +"are deprecated and replaced by :data:`calendar.JANUARY` and " +":data:`calendar.FEBRUARY`. (Contributed by Prince Roshan in :gh:`103636`.)" +msgstr "" +":mod:`calendar`: ``calendar.January`` 和 ``calendar.February`` 常量已被弃用并由 " +":data:`calendar.JANUARY` 和 :data:`calendar.FEBRUARY` 替代。 (由 Prince Roshan 在 " +":gh:`103636` 中贡献。)" + +#: ../../deprecations/pending-removal-in-future.rst:48 +msgid "" +":mod:`codecs`: use :func:`open` instead of :func:`codecs.open`. " +"(:gh:`133038`)" +msgstr "" +":mod:`codecs`: 请改用 :func:`open` 代替 :func:`codecs.open`。 (:gh:`133038`)" + +#: ../../deprecations/pending-removal-in-future.rst:50 +msgid "" +":attr:`!codeobject.co_lnotab`: use the :meth:`codeobject.co_lines` method " +"instead." +msgstr "" + +#: ../../deprecations/pending-removal-in-future.rst:53 +msgid ":mod:`datetime`:" +msgstr ":mod:`datetime`:" + +#: ../../deprecations/pending-removal-in-future.rst:55 +msgid "" +":meth:`~datetime.datetime.utcnow`: use " +"``datetime.datetime.now(tz=datetime.UTC)``." +msgstr "" +":meth:`~datetime.datetime.utcnow`: 使用 " +"``datetime.datetime.now(tz=datetime.UTC)``。" + +#: ../../deprecations/pending-removal-in-future.rst:57 +msgid "" +":meth:`~datetime.datetime.utcfromtimestamp`: use " +"``datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC)``." +msgstr "" +":meth:`~datetime.datetime.utcfromtimestamp`: 使用 " +"``datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC)``。" + +#: ../../deprecations/pending-removal-in-future.rst:60 +msgid ":mod:`gettext`: Plural value must be an integer." +msgstr ":mod:`gettext`: 复数值必须是一个整数。" + +#: ../../deprecations/pending-removal-in-future.rst:62 +msgid ":mod:`importlib`:" +msgstr ":mod:`importlib`:" + +#: ../../deprecations/pending-removal-in-future.rst:64 +msgid "" +":func:`~importlib.util.cache_from_source` *debug_override* parameter is " +"deprecated: use the *optimization* parameter instead." +msgstr "" +":func:`~importlib.util.cache_from_source` *debug_override* 形参已被弃用:改用 " +"*optimization* 形参。" + +#: ../../deprecations/pending-removal-in-future.rst:67 +msgid ":mod:`importlib.metadata`:" +msgstr ":mod:`importlib.metadata`:" + +#: ../../deprecations/pending-removal-in-future.rst:69 +msgid "``EntryPoints`` tuple interface." +msgstr "``EntryPoints`` 元组接口。" + +#: ../../deprecations/pending-removal-in-future.rst:70 +msgid "Implicit ``None`` on return values." +msgstr "返回值中隐式的 ``None``。" + +#: ../../deprecations/pending-removal-in-future.rst:72 +msgid "" +":mod:`logging`: the ``warn()`` method has been deprecated since Python 3.3, " +"use :meth:`~logging.warning` instead." +msgstr "" +":mod:`logging`: ``warn()`` 方法自 Python 3.3 起已被弃用,请改用 " +":meth:`~logging.warning`。" + +#: ../../deprecations/pending-removal-in-future.rst:75 +msgid "" +":mod:`mailbox`: Use of StringIO input and text mode is deprecated, use " +"BytesIO and binary mode instead." +msgstr ":mod:`mailbox`: 对 StringIO 输入和文本模式的使用已被弃用,改用 BytesIO 和二进制模式。" + +#: ../../deprecations/pending-removal-in-future.rst:78 +msgid "" +":mod:`os`: Calling :func:`os.register_at_fork` in a multi-threaded process." +msgstr "" + +#: ../../deprecations/pending-removal-in-future.rst:80 +msgid "" +":mod:`os.path`: :func:`os.path.commonprefix` is deprecated, use " +":func:`os.path.commonpath` for path prefixes. The " +":func:`os.path.commonprefix` function is being deprecated due to having a " +"misleading name and module. The function is not safe to use for path " +"prefixes despite being included in a module about path manipulation, meaning" +" it is easy to accidentally introduce path traversal vulnerabilities into " +"Python programs by using this function." +msgstr "" + +#: ../../deprecations/pending-removal-in-future.rst:88 +msgid "" +":class:`!pydoc.ErrorDuringImport`: A tuple value for *exc_info* parameter is" +" deprecated, use an exception instance." +msgstr "" +":class:`!pydoc.ErrorDuringImport`: 使用元组值作为 *exc_info* 形参的做法已被弃用,应使用异常实例。" + +#: ../../deprecations/pending-removal-in-future.rst:91 +msgid "" +":mod:`re`: More strict rules are now applied for numerical group references " +"and group names in regular expressions. Only sequence of ASCII digits is " +"now accepted as a numerical reference. The group name in bytes patterns and" +" replacement strings can now only contain ASCII letters and digits and " +"underscore. (Contributed by Serhiy Storchaka in :gh:`91760`.)" +msgstr "" +":mod:`re`: 现在对于正则表达式中的数字分组引用和分组名称将应用更严格的规则。现在只接受 ASCII 数字序列作为数字引用。 " +"字节串模式和替换字符串中的分组名称现在只能包含 ASCII 字母和数字以及下划线。 (由 Serhiy Storchaka 在 :gh:`91760` " +"中贡献。)" + +#: ../../deprecations/pending-removal-in-future.rst:98 +msgid "" +":mod:`shutil`: :func:`~shutil.rmtree`'s *onerror* parameter is deprecated in" +" Python 3.12; use the *onexc* parameter instead." +msgstr "" +":mod:`shutil`: :func:`~shutil.rmtree` 的 *onerror* 形参在 Python 3.12 中已被弃用;请改用 " +"*onexc* 形参。" + +#: ../../deprecations/pending-removal-in-future.rst:101 +msgid ":mod:`ssl` options and protocols:" +msgstr ":mod:`ssl` 选项和协议:" + +#: ../../deprecations/pending-removal-in-future.rst:103 +msgid ":class:`ssl.SSLContext` without protocol argument is deprecated." +msgstr ":class:`ssl.SSLContext` 不带 protocol 参数的做法已被弃用。" + +#: ../../deprecations/pending-removal-in-future.rst:104 +msgid "" +":class:`ssl.SSLContext`: :meth:`~ssl.SSLContext.set_npn_protocols` and " +":meth:`!selected_npn_protocol` are deprecated: use ALPN instead." +msgstr "" +":class:`ssl.SSLContext`: :meth:`~ssl.SSLContext.set_npn_protocols` 和 " +":meth:`!selected_npn_protocol` 已被弃用:请改用 ALPN。" + +#: ../../deprecations/pending-removal-in-future.rst:107 +msgid "``ssl.OP_NO_SSL*`` options" +msgstr "``ssl.OP_NO_SSL*`` 选项" + +#: ../../deprecations/pending-removal-in-future.rst:108 +msgid "``ssl.OP_NO_TLS*`` options" +msgstr "``ssl.OP_NO_TLS*`` 选项" + +#: ../../deprecations/pending-removal-in-future.rst:109 +msgid "``ssl.PROTOCOL_SSLv3``" +msgstr "``ssl.PROTOCOL_SSLv3``" + +#: ../../deprecations/pending-removal-in-future.rst:110 +msgid "``ssl.PROTOCOL_TLS``" +msgstr "``ssl.PROTOCOL_TLS``" + +#: ../../deprecations/pending-removal-in-future.rst:111 +msgid "``ssl.PROTOCOL_TLSv1``" +msgstr "``ssl.PROTOCOL_TLSv1``" + +#: ../../deprecations/pending-removal-in-future.rst:112 +msgid "``ssl.PROTOCOL_TLSv1_1``" +msgstr "``ssl.PROTOCOL_TLSv1_1``" + +#: ../../deprecations/pending-removal-in-future.rst:113 +msgid "``ssl.PROTOCOL_TLSv1_2``" +msgstr "``ssl.PROTOCOL_TLSv1_2``" + +#: ../../deprecations/pending-removal-in-future.rst:114 +msgid "``ssl.TLSVersion.SSLv3``" +msgstr "``ssl.TLSVersion.SSLv3``" + +#: ../../deprecations/pending-removal-in-future.rst:115 +msgid "``ssl.TLSVersion.TLSv1``" +msgstr "``ssl.TLSVersion.TLSv1``" + +#: ../../deprecations/pending-removal-in-future.rst:116 +msgid "``ssl.TLSVersion.TLSv1_1``" +msgstr "``ssl.TLSVersion.TLSv1_1``" + +#: ../../deprecations/pending-removal-in-future.rst:118 +msgid ":mod:`threading` methods:" +msgstr ":mod:`threading` 的方法:" + +#: ../../deprecations/pending-removal-in-future.rst:120 +msgid "" +":meth:`!threading.Condition.notifyAll`: use " +":meth:`~threading.Condition.notify_all`." +msgstr "" +":meth:`!threading.Condition.notifyAll`: 使用 " +":meth:`~threading.Condition.notify_all`。" + +#: ../../deprecations/pending-removal-in-future.rst:121 +msgid ":meth:`!threading.Event.isSet`: use :meth:`~threading.Event.is_set`." +msgstr ":meth:`!threading.Event.isSet`: 使用 :meth:`~threading.Event.is_set`。" + +#: ../../deprecations/pending-removal-in-future.rst:122 +msgid "" +":meth:`!threading.Thread.isDaemon`, :meth:`threading.Thread.setDaemon`: use " +":attr:`threading.Thread.daemon` attribute." +msgstr "" +":meth:`!threading.Thread.isDaemon`, :meth:`threading.Thread.setDaemon`: 使用 " +":attr:`threading.Thread.daemon` 属性。" + +#: ../../deprecations/pending-removal-in-future.rst:124 +msgid "" +":meth:`!threading.Thread.getName`, :meth:`threading.Thread.setName`: use " +":attr:`threading.Thread.name` attribute." +msgstr "" +":meth:`!threading.Thread.getName`, :meth:`threading.Thread.setName`: 使用 " +":attr:`threading.Thread.name` 属性。" + +#: ../../deprecations/pending-removal-in-future.rst:126 +msgid "" +":meth:`!threading.currentThread`: use :meth:`threading.current_thread`." +msgstr "" +":meth:`!threading.currentThread`: 使用 :meth:`threading.current_thread`。" + +#: ../../deprecations/pending-removal-in-future.rst:127 +msgid ":meth:`!threading.activeCount`: use :meth:`threading.active_count`." +msgstr ":meth:`!threading.activeCount`: 使用 :meth:`threading.active_count`。" + +#: ../../deprecations/pending-removal-in-future.rst:129 +msgid ":class:`typing.Text` (:gh:`92332`)." +msgstr ":class:`typing.Text` (:gh:`92332`)。" + +#: ../../deprecations/pending-removal-in-future.rst:131 +msgid "" +"The internal class ``typing._UnionGenericAlias`` is no longer used to " +"implement :class:`typing.Union`. To preserve compatibility with users using " +"this private class, a compatibility shim will be provided until at least " +"Python 3.17. (Contributed by Jelle Zijlstra in :gh:`105499`.)" +msgstr "" +"内部类 ``typing._UnionGenericAlias`` 不再用于实现 :class:`typing.Union`。 " +"为了保持与使用该私有类的用户的兼容性,将至少在 Python 3.17 之前提供兼容性垫片。 (由 Jelle Zijlstra 在 " +":gh:`105499` 中贡献。)" + +#: ../../deprecations/pending-removal-in-future.rst:136 +msgid "" +":class:`unittest.IsolatedAsyncioTestCase`: it is deprecated to return a " +"value that is not ``None`` from a test case." +msgstr "" +":class:`unittest.IsolatedAsyncioTestCase`: 从测试用例返回不为 ``None`` 的值的做法已被弃用。" + +#: ../../deprecations/pending-removal-in-future.rst:139 +msgid "" +":mod:`urllib.parse` deprecated functions: :func:`~urllib.parse.urlparse` " +"instead" +msgstr ":mod:`urllib.parse` 已弃用的函数:改用 :func:`~urllib.parse.urlparse`" + +#: ../../deprecations/pending-removal-in-future.rst:141 +msgid "``splitattr()``" +msgstr "``splitattr()``" + +#: ../../deprecations/pending-removal-in-future.rst:142 +msgid "``splithost()``" +msgstr "``splithost()``" + +#: ../../deprecations/pending-removal-in-future.rst:143 +msgid "``splitnport()``" +msgstr "``splitnport()``" + +#: ../../deprecations/pending-removal-in-future.rst:144 +msgid "``splitpasswd()``" +msgstr "``splitpasswd()``" + +#: ../../deprecations/pending-removal-in-future.rst:145 +msgid "``splitport()``" +msgstr "``splitport()``" + +#: ../../deprecations/pending-removal-in-future.rst:146 +msgid "``splitquery()``" +msgstr "``splitquery()``" + +#: ../../deprecations/pending-removal-in-future.rst:147 +msgid "``splittag()``" +msgstr "``splittag()``" + +#: ../../deprecations/pending-removal-in-future.rst:148 +msgid "``splittype()``" +msgstr "``splittype()``" + +#: ../../deprecations/pending-removal-in-future.rst:149 +msgid "``splituser()``" +msgstr "``splituser()``" + +#: ../../deprecations/pending-removal-in-future.rst:150 +msgid "``splitvalue()``" +msgstr "``splitvalue()``" + +#: ../../deprecations/pending-removal-in-future.rst:151 +msgid "``to_bytes()``" +msgstr "``to_bytes()``" + +#: ../../deprecations/pending-removal-in-future.rst:153 +msgid "" +":mod:`wsgiref`: ``SimpleHandler.stdout.write()`` should not do partial " +"writes." +msgstr ":mod:`wsgiref`: ``SimpleHandler.stdout.write()`` 不应执行部分写入。" + +#: ../../deprecations/pending-removal-in-future.rst:156 +msgid "" +":mod:`xml.etree.ElementTree`: Testing the truth value of an " +":class:`~xml.etree.ElementTree.Element` is deprecated. In a future release " +"it will always return ``True``. Prefer explicit ``len(elem)`` or ``elem is " +"not None`` tests instead." +msgstr "" +":mod:`xml.etree.ElementTree`: 对 :class:`~xml.etree.ElementTree.Element` " +"进行真值检测已被弃用。在未来的发布版中它将始终返回 ``True``。建议改用显式的 ``len(elem)`` 或 ``elem is not " +"None`` 检测。" + +#: ../../deprecations/pending-removal-in-future.rst:161 +msgid "" +":func:`sys._clear_type_cache` is deprecated: use " +":func:`sys._clear_internal_caches` instead." +msgstr "" +":func:`sys._clear_type_cache` 已被弃用,请改用 :func:`sys._clear_internal_caches`。" diff --git a/distributing/index.po b/distributing/index.po new file mode 100644 index 0000000000..14af377e1a --- /dev/null +++ b/distributing/index.po @@ -0,0 +1,35 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../distributing/index.rst:10 +msgid "Distributing Python Modules" +msgstr "分发 Python 模块" + +#: ../../distributing/index.rst:14 +msgid "" +"Information and guidance on distributing Python modules and packages has " +"been moved to the `Python Packaging User Guide`_, and the tutorial on " +"`packaging Python projects`_." +msgstr "" +"有关分发 Python 模块和包的信息和指南已被移至 `Python Packaging User Guide`_,以及 `packaging " +"Python projects`_ 中的教程。" diff --git a/extending/building.po b/extending/building.po new file mode 100644 index 0000000000..d63d5722a9 --- /dev/null +++ b/extending/building.po @@ -0,0 +1,59 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../extending/building.rst:7 +msgid "Building C and C++ Extensions" +msgstr "构建 C/C++ 扩展" + +#: ../../extending/building.rst:9 +msgid "" +"A C extension for CPython is a shared library (for example, a ``.so`` file " +"on Linux, ``.pyd`` on Windows), which exports an *initialization function*." +msgstr "" +"一个 CPython 的 C 扩展是一个共享库 (例如 Linux 上的 ``.so``,或者 Windows 上的 " +"``.pyd``),它会导出一个*初始化函数*。" + +#: ../../extending/building.rst:12 +msgid "See :ref:`extension-modules` for details." +msgstr "请参阅 :ref:`extension-modules` 来了解详情。" + +#: ../../extending/building.rst:21 +msgid "Building C and C++ Extensions with setuptools" +msgstr "使用 setuptools 构建 C 和 C++ 扩展" + +#: ../../extending/building.rst:24 +msgid "" +"Building, packaging and distributing extension modules is best done with " +"third-party tools, and is out of scope of this document. One suitable tool " +"is Setuptools, whose documentation can be found at " +"https://setuptools.pypa.io/en/latest/setuptools.html." +msgstr "" +"构建、打包和分发扩展模块最好使用第三方工具完成,并且超出了本文的范围。一个合适的工具是 Setuptools,其文档可以在 " +"https://setuptools.pypa.io/en/latest/setuptools.html 上找到。" + +#: ../../extending/building.rst:29 +msgid "" +"The :mod:`distutils` module, which was included in the standard library " +"until Python 3.12, is now maintained as part of Setuptools." +msgstr "" +":mod:`distutils` 模块在 Python 3.12 之前一直包含在标准库中,现在作为 Setuptools 的一部分进行维护。" diff --git a/extending/embedding.po b/extending/embedding.po new file mode 100644 index 0000000000..cecc241c9e --- /dev/null +++ b/extending/embedding.po @@ -0,0 +1,780 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../extending/embedding.rst:8 +msgid "Embedding Python in Another Application" +msgstr "在其它应用程序中嵌入 Python" + +#: ../../extending/embedding.rst:10 +msgid "" +"The previous chapters discussed how to extend Python, that is, how to extend" +" the functionality of Python by attaching a library of C functions to it. " +"It is also possible to do it the other way around: enrich your C/C++ " +"application by embedding Python in it. Embedding provides your application " +"with the ability to implement some of the functionality of your application " +"in Python rather than C or C++. This can be used for many purposes; one " +"example would be to allow users to tailor the application to their needs by " +"writing some scripts in Python. You can also use it yourself if some of the" +" functionality can be written in Python more easily." +msgstr "" +"前几章讨论了如何对 Python 进行扩展,也就是如何用 C 函数库 扩展 Python 的功能。反过来也是可以的:将 Python 嵌入到 C/C++" +" 应用程序中丰富其功能。这种嵌入可以让应用程序用 Python 来实现某些功能,而不是用 C 或 C++ 。用途会有很多;比如允许用户用 Python " +"编写一些脚本,以便定制应用程序满足需求。如果某些功能用 Python 编写起来更为容易,那么开发人员自己也能这么干。" + +#: ../../extending/embedding.rst:20 +msgid "" +"Embedding Python is similar to extending it, but not quite. The difference " +"is that when you extend Python, the main program of the application is still" +" the Python interpreter, while if you embed Python, the main program may " +"have nothing to do with Python --- instead, some parts of the application " +"occasionally call the Python interpreter to run some Python code." +msgstr "" +"Python 的嵌入类似于扩展,但不完全相同。不同之处在于,扩展 Python 时应用程序的主程序仍然是 Python 解释器,而嵌入 Python " +"时的主程序可能与 Python 完全无关——而是应用程序的某些部分偶尔会调用 Python 解释器来运行一些 Python 代码。" + +#: ../../extending/embedding.rst:26 +msgid "" +"So if you are embedding Python, you are providing your own main program. " +"One of the things this main program has to do is initialize the Python " +"interpreter. At the very least, you have to call the function " +":c:func:`Py_Initialize`. There are optional calls to pass command line " +"arguments to Python. Then later you can call the interpreter from any part " +"of the application." +msgstr "" +"因此,若要嵌入 Python,就要提供自己的主程序。此主程序要做的事情之一就是初始化 Python 解释器。至少得调用函数 " +":c:func:`Py_Initialize`。还有些可选的调用可向 Python 传递命令行参数。之后即可从应用程序的任何地方调用解释器了。" + +#: ../../extending/embedding.rst:32 +msgid "" +"There are several different ways to call the interpreter: you can pass a " +"string containing Python statements to :c:func:`PyRun_SimpleString`, or you " +"can pass a stdio file pointer and a file name (for identification in error " +"messages only) to :c:func:`PyRun_SimpleFile`. You can also call the lower-" +"level operations described in the previous chapters to construct and use " +"Python objects." +msgstr "" +"调用解释器的方式有好几种:可向 :c:func:`PyRun_SimpleString` 传入一个包含 Python 语句的字符串,也可向 " +":c:func:`PyRun_SimpleFile` 传入一个 stdio " +"文件指针和一个文件名(仅在错误信息中起到识别作用)。还可以调用前面介绍过的底层操作来构造并使用 Python 对象。" + +#: ../../extending/embedding.rst:41 +msgid ":ref:`c-api-index`" +msgstr ":ref:`c-api-index`" + +#: ../../extending/embedding.rst:42 +msgid "" +"The details of Python's C interface are given in this manual. A great deal " +"of necessary information can be found here." +msgstr "本文详细介绍了 Python 的 C 接口。这里有大量必要的信息。" + +#: ../../extending/embedding.rst:49 +msgid "Very High Level Embedding" +msgstr "高层次的嵌入" + +#: ../../extending/embedding.rst:51 +msgid "" +"The simplest form of embedding Python is the use of the very high level " +"interface. This interface is intended to execute a Python script without " +"needing to interact with the application directly. This can for example be " +"used to perform some operation on a file. ::" +msgstr "" +"最简单的 Python 嵌入形式就是采用非常高层的接口。该接口的目标是只执行一段 Python " +"脚本,而无需与应用程序直接交互。比如以下代码可以用来对某个文件进行一些操作。" + +#: ../../extending/embedding.rst:56 +msgid "" +"#define PY_SSIZE_T_CLEAN\n" +"#include \n" +"\n" +"int\n" +"main(int argc, char *argv[])\n" +"{\n" +" PyStatus status;\n" +" PyConfig config;\n" +" PyConfig_InitPythonConfig(&config);\n" +"\n" +" /* optional but recommended */\n" +" status = PyConfig_SetBytesString(&config, &config.program_name, argv[0]);\n" +" if (PyStatus_Exception(status)) {\n" +" goto exception;\n" +" }\n" +"\n" +" status = Py_InitializeFromConfig(&config);\n" +" if (PyStatus_Exception(status)) {\n" +" goto exception;\n" +" }\n" +" PyConfig_Clear(&config);\n" +"\n" +" PyRun_SimpleString(\"from time import time,ctime\\n\"\n" +" \"print('Today is', ctime(time()))\\n\");\n" +" if (Py_FinalizeEx() < 0) {\n" +" exit(120);\n" +" }\n" +" return 0;\n" +"\n" +" exception:\n" +" PyConfig_Clear(&config);\n" +" Py_ExitStatusException(status);\n" +"}" +msgstr "" +"#define PY_SSIZE_T_CLEAN\n" +"#include \n" +"\n" +"int\n" +"main(int argc, char *argv[])\n" +"{\n" +" PyStatus status;\n" +" PyConfig config;\n" +" PyConfig_InitPythonConfig(&config);\n" +"\n" +" /* 以下是可选的但推荐使用 */\n" +" status = PyConfig_SetBytesString(&config, &config.program_name, argv[0]);\n" +" if (PyStatus_Exception(status)) {\n" +" goto exception;\n" +" }\n" +"\n" +" status = Py_InitializeFromConfig(&config);\n" +" if (PyStatus_Exception(status)) {\n" +" goto exception;\n" +" }\n" +" PyConfig_Clear(&config);\n" +"\n" +" PyRun_SimpleString(\"from time import time,ctime\\n\"\n" +" \"print('Today is', ctime(time()))\\n\");\n" +" if (Py_FinalizeEx() < 0) {\n" +" exit(120);\n" +" }\n" +" return 0;\n" +"\n" +" exception:\n" +" PyConfig_Clear(&config);\n" +" Py_ExitStatusException(status);\n" +"}" + +#: ../../extending/embedding.rst:92 +msgid "" +"``#define PY_SSIZE_T_CLEAN`` was used to indicate that ``Py_ssize_t`` should" +" be used in some APIs instead of ``int``. It is not necessary since Python " +"3.13, but we keep it here for backward compatibility. See :ref:`arg-parsing-" +"string-and-buffers` for a description of this macro." +msgstr "" +"``#define PY_SSIZE_T_CLEAN`` 被用来指明 ``Py_ssize_t`` 应当在某些 API 中代替 ``int`` 使用。 " +"它从 Python 3.13 起已不再需要,但我们保留它用于向下兼容。请参阅 :ref:`arg-parsing-string-and-buffers`" +" 获取该宏的描述。" + +#: ../../extending/embedding.rst:97 +msgid "" +"Setting :c:member:`PyConfig.program_name` should be called before " +":c:func:`Py_InitializeFromConfig` to inform the interpreter about paths to " +"Python run-time libraries. Next, the Python interpreter is initialized with" +" :c:func:`Py_Initialize`, followed by the execution of a hard-coded Python " +"script that prints the date and time. Afterwards, the " +":c:func:`Py_FinalizeEx` call shuts the interpreter down, followed by the end" +" of the program. In a real program, you may want to get the Python script " +"from another source, perhaps a text-editor routine, a file, or a database. " +"Getting the Python code from a file can better be done by using the " +":c:func:`PyRun_SimpleFile` function, which saves you the trouble of " +"allocating memory space and loading the file contents." +msgstr "" +"设置 :c:member:`PyConfig.program_name` 应当在 :c:func:`Py_InitializeFromConfig` " +"之前被调用以便告知解释器 Python 运行时库的路径。接下来,Python 解释器将使用 :c:func:`Py_Initialize` " +"来初始化,然后执行硬编码的 Python 脚本打印出日期和时间。在此之后,:c:func:`Py_FinalizeEx` " +"调用将关闭解释器,随即结束程序。在真实的程序中,你可能需要从其他源获取 Python 脚本,或许是从文本编辑器例程、文件或者数据库等等。使用 " +":c:func:`PyRun_SimpleFile` 函数可以更好地从文件获取 Python 代码,这将为你省去分配内存空间和加载文件内容的麻烦。" + +#: ../../extending/embedding.rst:112 +msgid "Beyond Very High Level Embedding: An overview" +msgstr "突破高层次嵌入的限制:概述" + +#: ../../extending/embedding.rst:114 +msgid "" +"The high level interface gives you the ability to execute arbitrary pieces " +"of Python code from your application, but exchanging data values is quite " +"cumbersome to say the least. If you want that, you should use lower level " +"calls. At the cost of having to write more C code, you can achieve almost " +"anything." +msgstr "" +"高级接口能从应用程序中执行任何 Python " +"代码,但至少交换数据可说是相当麻烦的。如若需要交换数据,应使用较低级别的调用。几乎可以实现任何功能,代价是得写更多的 C 代码。" + +#: ../../extending/embedding.rst:119 +msgid "" +"It should be noted that extending Python and embedding Python is quite the " +"same activity, despite the different intent. Most topics discussed in the " +"previous chapters are still valid. To show this, consider what the extension" +" code from Python to C really does:" +msgstr "" +"应该注意,尽管意图不同,但扩展 Python 和嵌入 Python 的过程相当类似。前几章中讨论的大多数主题依然有效。为了说明这一点,不妨来看一下从 " +"Python 到 C 的扩展代码到底做了什么:" + +#: ../../extending/embedding.rst:124 +msgid "Convert data values from Python to C," +msgstr "将 Python 的数据转换为 C 格式," + +#: ../../extending/embedding.rst:126 +msgid "Perform a function call to a C routine using the converted values, and" +msgstr "用转换后的数据执行 C 程序的函数调用," + +#: ../../extending/embedding.rst:128 +msgid "Convert the data values from the call from C to Python." +msgstr "将调用返回的数据从 C 转换为 Python 格式。" + +#: ../../extending/embedding.rst:130 +msgid "When embedding Python, the interface code does:" +msgstr "嵌入 Python 时,接口代码会这样做:" + +#: ../../extending/embedding.rst:132 +msgid "Convert data values from C to Python," +msgstr "将 C 数据转换为 Python 格式," + +#: ../../extending/embedding.rst:134 +msgid "" +"Perform a function call to a Python interface routine using the converted " +"values, and" +msgstr "用转换后的数据执行对 Python 接口的函数调用," + +#: ../../extending/embedding.rst:137 +msgid "Convert the data values from the call from Python to C." +msgstr "将调用返回的数据从 Python 转换为 C 格式。" + +#: ../../extending/embedding.rst:139 +msgid "" +"As you can see, the data conversion steps are simply swapped to accommodate " +"the different direction of the cross-language transfer. The only difference " +"is the routine that you call between both data conversions. When extending, " +"you call a C routine, when embedding, you call a Python routine." +msgstr "" +"可见只是数据转换的步骤交换了一下顺序,以顺应跨语言的传输方向。唯一的区别是在两次数据转换之间调用的函数不同。在执行扩展时,调用一个 C " +"函数,而执行嵌入时调用的是个 Python 函数。" + +#: ../../extending/embedding.rst:144 +msgid "" +"This chapter will not discuss how to convert data from Python to C and vice " +"versa. Also, proper use of references and dealing with errors is assumed to" +" be understood. Since these aspects do not differ from extending the " +"interpreter, you can refer to earlier chapters for the required information." +msgstr "" +"本文不会讨论如何将数据从 Python 转换到 C " +"去,反之亦然。另外还假定读者能够正确使用引用并处理错误。由于这些地方与解释器的扩展没有区别,请参考前面的章节以获得所需的信息。" + +#: ../../extending/embedding.rst:153 +msgid "Pure Embedding" +msgstr "只做嵌入" + +#: ../../extending/embedding.rst:155 +msgid "" +"The first program aims to execute a function in a Python script. Like in the" +" section about the very high level interface, the Python interpreter does " +"not directly interact with the application (but that will change in the next" +" section)." +msgstr "" +"第一个程序的目标是执行 Python 脚本中的某个函数。就像高层次接口那样,Python 解释器并不会直接与应用程序进行交互(但下一节将改变这一点)。" + +#: ../../extending/embedding.rst:160 +msgid "The code to run a function defined in a Python script is:" +msgstr "要运行 Python 脚本中定义的函数,代码如下:" + +#: ../../extending/embedding.rst:162 +msgid "" +"#define PY_SSIZE_T_CLEAN\n" +"#include \n" +"\n" +"int\n" +"main(int argc, char *argv[])\n" +"{\n" +" PyObject *pName, *pModule, *pFunc;\n" +" PyObject *pArgs, *pValue;\n" +" int i;\n" +"\n" +" if (argc < 3) {\n" +" fprintf(stderr,\"Usage: call pythonfile funcname [args]\\n\");\n" +" return 1;\n" +" }\n" +"\n" +" Py_Initialize();\n" +" pName = PyUnicode_DecodeFSDefault(argv[1]);\n" +" /* Error checking of pName left out */\n" +"\n" +" pModule = PyImport_Import(pName);\n" +" Py_DECREF(pName);\n" +"\n" +" if (pModule != NULL) {\n" +" pFunc = PyObject_GetAttrString(pModule, argv[2]);\n" +" /* pFunc is a new reference */\n" +"\n" +" if (pFunc && PyCallable_Check(pFunc)) {\n" +" pArgs = PyTuple_New(argc - 3);\n" +" for (i = 0; i < argc - 3; ++i) {\n" +" pValue = PyLong_FromLong(atoi(argv[i + 3]));\n" +" if (!pValue) {\n" +" Py_DECREF(pArgs);\n" +" Py_DECREF(pModule);\n" +" fprintf(stderr, \"Cannot convert argument\\n\");\n" +" return 1;\n" +" }\n" +" /* pValue reference stolen here: */\n" +" PyTuple_SetItem(pArgs, i, pValue);\n" +" }\n" +" pValue = PyObject_CallObject(pFunc, pArgs);\n" +" Py_DECREF(pArgs);\n" +" if (pValue != NULL) {\n" +" printf(\"Result of call: %ld\\n\", PyLong_AsLong(pValue));\n" +" Py_DECREF(pValue);\n" +" }\n" +" else {\n" +" Py_DECREF(pFunc);\n" +" Py_DECREF(pModule);\n" +" PyErr_Print();\n" +" fprintf(stderr,\"Call failed\\n\");\n" +" return 1;\n" +" }\n" +" }\n" +" else {\n" +" if (PyErr_Occurred())\n" +" PyErr_Print();\n" +" fprintf(stderr, \"Cannot find function \\\"%s\\\"\\n\", argv[2]);\n" +" }\n" +" Py_XDECREF(pFunc);\n" +" Py_DECREF(pModule);\n" +" }\n" +" else {\n" +" PyErr_Print();\n" +" fprintf(stderr, \"Failed to load \\\"%s\\\"\\n\", argv[1]);\n" +" return 1;\n" +" }\n" +" if (Py_FinalizeEx() < 0) {\n" +" return 120;\n" +" }\n" +" return 0;\n" +"}\n" +msgstr "" +"#define PY_SSIZE_T_CLEAN\n" +"#include \n" +"\n" +"int\n" +"main(int argc, char *argv[])\n" +"{\n" +" PyObject *pName, *pModule, *pFunc;\n" +" PyObject *pArgs, *pValue;\n" +" int i;\n" +"\n" +" if (argc < 3) {\n" +" fprintf(stderr,\"Usage: call pythonfile funcname [args]\\n\");\n" +" return 1;\n" +" }\n" +"\n" +" Py_Initialize();\n" +" pName = PyUnicode_DecodeFSDefault(argv[1]);\n" +" /* 略去 pName 的错误检测 */\n" +"\n" +" pModule = PyImport_Import(pName);\n" +" Py_DECREF(pName);\n" +"\n" +" if (pModule != NULL) {\n" +" pFunc = PyObject_GetAttrString(pModule, argv[2]);\n" +" /* pFunc 是一个新引用 */\n" +"\n" +" if (pFunc && PyCallable_Check(pFunc)) {\n" +" pArgs = PyTuple_New(argc - 3);\n" +" for (i = 0; i < argc - 3; ++i) {\n" +" pValue = PyLong_FromLong(atoi(argv[i + 3]));\n" +" if (!pValue) {\n" +" Py_DECREF(pArgs);\n" +" Py_DECREF(pModule);\n" +" fprintf(stderr, \"Cannot convert argument\\n\");\n" +" return 1;\n" +" }\n" +" /* 这里偷取了 pValue 引用:*/\n" +" PyTuple_SetItem(pArgs, i, pValue);\n" +" }\n" +" pValue = PyObject_CallObject(pFunc, pArgs);\n" +" Py_DECREF(pArgs);\n" +" if (pValue != NULL) {\n" +" printf(\"Result of call: %ld\\n\", PyLong_AsLong(pValue));\n" +" Py_DECREF(pValue);\n" +" }\n" +" else {\n" +" Py_DECREF(pFunc);\n" +" Py_DECREF(pModule);\n" +" PyErr_Print();\n" +" fprintf(stderr,\"Call failed\\n\");\n" +" return 1;\n" +" }\n" +" }\n" +" else {\n" +" if (PyErr_Occurred())\n" +" PyErr_Print();\n" +" fprintf(stderr, \"Cannot find function \\\"%s\\\"\\n\", argv[2]);\n" +" }\n" +" Py_XDECREF(pFunc);\n" +" Py_DECREF(pModule);\n" +" }\n" +" else {\n" +" PyErr_Print();\n" +" fprintf(stderr, \"Failed to load \\\"%s\\\"\\n\", argv[1]);\n" +" return 1;\n" +" }\n" +" if (Py_FinalizeEx() < 0) {\n" +" return 120;\n" +" }\n" +" return 0;\n" +"}\n" + +#: ../../extending/embedding.rst:165 +msgid "" +"This code loads a Python script using ``argv[1]``, and calls the function " +"named in ``argv[2]``. Its integer arguments are the other values of the " +"``argv`` array. If you :ref:`compile and link ` this program " +"(let's call the finished executable :program:`call`), and use it to execute " +"a Python script, such as:" +msgstr "" +"上述代码先利用 ``argv[1]`` 加载 Python 脚本,再调用 ``argv[2]`` 指定的函数。函数的整数参数是 ``argv`` " +"数组中的其余值。如果 :ref:`编译并链接` 该程序 (此处将最终的可执行程序称作 :program:`call`), " +"并用它执行一个 Python 脚本,例如:" + +#: ../../extending/embedding.rst:171 +msgid "" +"def multiply(a,b):\n" +" print(\"Will compute\", a, \"times\", b)\n" +" c = 0\n" +" for i in range(0, a):\n" +" c = c + b\n" +" return c" +msgstr "" +"def multiply(a,b):\n" +" print(\"Will compute\", a, \"times\", b)\n" +" c = 0\n" +" for i in range(0, a):\n" +" c = c + b\n" +" return c" + +#: ../../extending/embedding.rst:180 +msgid "then the result should be:" +msgstr "然后结果应该是:" + +#: ../../extending/embedding.rst:182 +msgid "" +"$ call multiply multiply 3 2\n" +"Will compute 3 times 2\n" +"Result of call: 6" +msgstr "" +"$ call multiply multiply 3 2\n" +"Will compute 3 times 2\n" +"Result of call: 6" + +#: ../../extending/embedding.rst:188 +msgid "" +"Although the program is quite large for its functionality, most of the code " +"is for data conversion between Python and C, and for error reporting. The " +"interesting part with respect to embedding Python starts with ::" +msgstr "" +"尽管相对其功能而言,该程序体积相当庞大,但大部分代码是用于 Python 和 C 之间的数据转换,以及报告错误。嵌入 Python 的有趣部分从此开始:" + +#: ../../extending/embedding.rst:192 +msgid "" +"Py_Initialize();\n" +"pName = PyUnicode_DecodeFSDefault(argv[1]);\n" +"/* Error checking of pName left out */\n" +"pModule = PyImport_Import(pName);" +msgstr "" +"Py_Initialize();\n" +"pName = PyUnicode_DecodeFSDefault(argv[1]);\n" +"/* 略去 pName 的错误检测 */\n" +"pModule = PyImport_Import(pName);" + +#: ../../extending/embedding.rst:197 +msgid "" +"After initializing the interpreter, the script is loaded using " +":c:func:`PyImport_Import`. This routine needs a Python string as its " +"argument, which is constructed using the :c:func:`PyUnicode_DecodeFSDefault`" +" data conversion routine. ::" +msgstr "" +"在初始化解释器之后,再使用 :c:func:`PyImport_Import` 加载脚本。此例程需要一个 Python 字符串作为其参数,它是使用 " +":c:func:`PyUnicode_DecodeFSDefault` 数据转换例程来构造的。 ::" + +#: ../../extending/embedding.rst:202 +msgid "" +"pFunc = PyObject_GetAttrString(pModule, argv[2]);\n" +"/* pFunc is a new reference */\n" +"\n" +"if (pFunc && PyCallable_Check(pFunc)) {\n" +" ...\n" +"}\n" +"Py_XDECREF(pFunc);" +msgstr "" +"pFunc = PyObject_GetAttrString(pModule, argv[2]);\n" +"/* pFunc 是一个新引用 */\n" +"\n" +"if (pFunc && PyCallable_Check(pFunc)) {\n" +" ...\n" +"}\n" +"Py_XDECREF(pFunc);" + +#: ../../extending/embedding.rst:210 +msgid "" +"Once the script is loaded, the name we're looking for is retrieved using " +":c:func:`PyObject_GetAttrString`. If the name exists, and the object " +"returned is callable, you can safely assume that it is a function. The " +"program then proceeds by constructing a tuple of arguments as normal. The " +"call to the Python function is then made with::" +msgstr "" +"脚本一旦加载完毕,就会用 :c:func:`PyObject_GetAttrString` " +"查找属性名称。如果名称存在,并且返回的是可调用对象,即可安全地视其为函数。然后程序继续执行,照常构建由参数组成的元组。然后用以下方式调用 Python " +"函数:" + +#: ../../extending/embedding.rst:216 +msgid "pValue = PyObject_CallObject(pFunc, pArgs);" +msgstr "pValue = PyObject_CallObject(pFunc, pArgs);" + +#: ../../extending/embedding.rst:218 +msgid "" +"Upon return of the function, ``pValue`` is either ``NULL`` or it contains a " +"reference to the return value of the function. Be sure to release the " +"reference after examining the value." +msgstr "当函数返回时,``pValue`` 要么为 ``NULL``,要么包含对函数返回值的引用。请确保用完后释放该引用。" + +#: ../../extending/embedding.rst:226 +msgid "Extending Embedded Python" +msgstr "对嵌入 Python 功能进行扩展" + +#: ../../extending/embedding.rst:228 +msgid "" +"Until now, the embedded Python interpreter had no access to functionality " +"from the application itself. The Python API allows this by extending the " +"embedded interpreter. That is, the embedded interpreter gets extended with " +"routines provided by the application. While it sounds complex, it is not so " +"bad. Simply forget for a while that the application starts the Python " +"interpreter. Instead, consider the application to be a set of subroutines, " +"and write some glue code that gives Python access to those routines, just " +"like you would write a normal Python extension. For example::" +msgstr "" +"到目前为止,嵌入的 Python 解释器还不能访问应用程序本身的功能。Python API 通过扩展嵌入解释器实现了这一点。 " +"也就是说,用应用程序提供的函数对嵌入的解释器进行扩展。虽然听起来有些复杂,但也没那么糟糕。只要暂时忘记是应用程序启动了 Python " +"解释器。而把应用程序看作是一堆子程序,然后写一些胶水代码让 Python 访问这些子程序,就像编写普通的 Python 扩展程序一样。例如:" + +#: ../../extending/embedding.rst:237 +msgid "" +"static int numargs=0;\n" +"\n" +"/* Return the number of arguments of the application command line */\n" +"static PyObject*\n" +"emb_numargs(PyObject *self, PyObject *args)\n" +"{\n" +" if(!PyArg_ParseTuple(args, \":numargs\"))\n" +" return NULL;\n" +" return PyLong_FromLong(numargs);\n" +"}\n" +"\n" +"static PyMethodDef emb_module_methods[] = {\n" +" {\"numargs\", emb_numargs, METH_VARARGS,\n" +" \"Return the number of arguments received by the process.\"},\n" +" {NULL, NULL, 0, NULL}\n" +"};\n" +"\n" +"static struct PyModuleDef emb_module = {\n" +" .m_base = PyModuleDef_HEAD_INIT,\n" +" .m_name = \"emb\",\n" +" .m_size = 0,\n" +" .m_methods = emb_module_methods,\n" +"};\n" +"\n" +"static PyObject*\n" +"PyInit_emb(void)\n" +"{\n" +" return PyModuleDef_Init(&emb_module);\n" +"}" +msgstr "" +"static int numargs=0;\n" +"\n" +"/* 返回应用程序命令行的参数数量 */\n" +"static PyObject*\n" +"emb_numargs(PyObject *self, PyObject *args)\n" +"{\n" +" if(!PyArg_ParseTuple(args, \":numargs\"))\n" +" return NULL;\n" +" return PyLong_FromLong(numargs);\n" +"}\n" +"\n" +"static PyMethodDef emb_module_methods[] = {\n" +" {\"numargs\", emb_numargs, METH_VARARGS,\n" +" \"Return the number of arguments received by the process.\"},\n" +" {NULL, NULL, 0, NULL}\n" +"};\n" +"\n" +"static struct PyModuleDef emb_module = {\n" +" .m_base = PyModuleDef_HEAD_INIT,\n" +" .m_name = \"emb\",\n" +" .m_size = 0,\n" +" .m_methods = emb_module_methods,\n" +"};\n" +"\n" +"static PyObject*\n" +"PyInit_emb(void)\n" +"{\n" +" return PyModuleDef_Init(&emb_module);\n" +"}" + +#: ../../extending/embedding.rst:267 +msgid "" +"Insert the above code just above the :c:func:`main` function. Also, insert " +"the following two statements before the call to :c:func:`Py_Initialize`::" +msgstr "在 :c:func:`main` 函数之前插入上述代码。并在调用 :c:func:`Py_Initialize` 之前插入以下两条语句:" + +#: ../../extending/embedding.rst:270 +msgid "" +"numargs = argc;\n" +"PyImport_AppendInittab(\"emb\", &PyInit_emb);" +msgstr "" +"numargs = argc;\n" +"PyImport_AppendInittab(\"emb\", &PyInit_emb);" + +#: ../../extending/embedding.rst:273 +msgid "" +"These two lines initialize the ``numargs`` variable, and make the " +":func:`!emb.numargs` function accessible to the embedded Python interpreter." +" With these extensions, the Python script can do things like" +msgstr "" +"这两行代码初始化了 ``numargs`` 变量,并使嵌入式 Python 解释器可以访问 :func:`!emb.numargs` " +"函数。通过这些扩展,Python 脚本可以执行以下操作" + +#: ../../extending/embedding.rst:277 +msgid "" +"import emb\n" +"print(\"Number of arguments\", emb.numargs())" +msgstr "" +"import emb\n" +"print(\"Number of arguments\", emb.numargs())" + +#: ../../extending/embedding.rst:282 +msgid "" +"In a real application, the methods will expose an API of the application to " +"Python." +msgstr "在真实的应用程序中,这种方法将把应用的 API 暴露给 Python 使用。" + +#: ../../extending/embedding.rst:292 +msgid "Embedding Python in C++" +msgstr "在 C++ 中嵌入 Python" + +#: ../../extending/embedding.rst:294 +msgid "" +"It is also possible to embed Python in a C++ program; precisely how this is " +"done will depend on the details of the C++ system used; in general you will " +"need to write the main program in C++, and use the C++ compiler to compile " +"and link your program. There is no need to recompile Python itself using " +"C++." +msgstr "" +"还可以将 Python 嵌入到 C++ 程序中去;确切地说,实现方式将取决于 C++ 系统的实现细节;一般需用 C++ 编写主程序,并用 C++ " +"编译器来编译和链接程序。不需要用 C++ 重新编译 Python 本身。" + +#: ../../extending/embedding.rst:303 +msgid "Compiling and Linking under Unix-like systems" +msgstr "在类 Unix 系统中编译和链接" + +#: ../../extending/embedding.rst:305 +msgid "" +"It is not necessarily trivial to find the right flags to pass to your " +"compiler (and linker) in order to embed the Python interpreter into your " +"application, particularly because Python needs to load library modules " +"implemented as C dynamic extensions (:file:`.so` files) linked against it." +msgstr "" +"为了将 Python 解释器嵌入应用程序,找到正确的编译参数传给编译器 (和链接器) 并非易事,特别是因为 Python 加载的库模块是以 C " +"动态扩展(:file:`.so` 文件)的形式实现的。" + +#: ../../extending/embedding.rst:311 +msgid "" +"To find out the required compiler and linker flags, you can execute the " +":file:`python{X.Y}-config` script which is generated as part of the " +"installation process (a :file:`python3-config` script may also be " +"available). This script has several options, of which the following will be" +" directly useful to you:" +msgstr "" +"为了得到所需的编译器和链接器参数,可执行 :file:`python{X.Y}-config` 脚本,它是在安装 Python 时生成的(也可能存在 " +":file:`python3-config` 脚本)。该脚本有几个参数,其中以下几个参数会直接有用:" + +#: ../../extending/embedding.rst:317 +msgid "" +"``pythonX.Y-config --cflags`` will give you the recommended flags when " +"compiling:" +msgstr "``pythonX.Y-config --cflags`` 将给出建议的编译参数。" + +#: ../../extending/embedding.rst:320 +msgid "" +"$ /opt/bin/python3.11-config --cflags\n" +"-I/opt/include/python3.11 -I/opt/include/python3.11 -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall" +msgstr "" +"$ /opt/bin/python3.11-config --cflags\n" +"-I/opt/include/python3.11 -I/opt/include/python3.11 -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall" + +#: ../../extending/embedding.rst:325 +msgid "" +"``pythonX.Y-config --ldflags --embed`` will give you the recommended flags " +"when linking:" +msgstr "``pythonX.Y-config --ldflags --embed`` 将给出在链接时建议的参数:" + +#: ../../extending/embedding.rst:328 +msgid "" +"$ /opt/bin/python3.11-config --ldflags --embed\n" +"-L/opt/lib/python3.11/config-3.11-x86_64-linux-gnu -L/opt/lib -lpython3.11 -lpthread -ldl -lutil -lm" +msgstr "" +"$ /opt/bin/python3.11-config --ldflags --embed\n" +"-L/opt/lib/python3.11/config-3.11-x86_64-linux-gnu -L/opt/lib -lpython3.11 -lpthread -ldl -lutil -lm" + +#: ../../extending/embedding.rst:334 +msgid "" +"To avoid confusion between several Python installations (and especially " +"between the system Python and your own compiled Python), it is recommended " +"that you use the absolute path to :file:`python{X.Y}-config`, as in the " +"above example." +msgstr "" +"为了避免多个 Python 安装版本引发混乱(特别是在系统安装版本和自己编译版本之间),建议用 :file:`python{X.Y}-config` " +"的绝对路径,如上例所述。" + +#: ../../extending/embedding.rst:339 +msgid "" +"If this procedure doesn't work for you (it is not guaranteed to work for all" +" Unix-like platforms; however, we welcome :ref:`bug reports `) you will have to read your system's documentation about dynamic " +"linking and/or examine Python's :file:`Makefile` (use " +":func:`sysconfig.get_makefile_filename` to find its location) and " +"compilation options. In this case, the :mod:`sysconfig` module is a useful " +"tool to programmatically extract the configuration values that you will want" +" to combine together. For example:" +msgstr "" +"如果上述方案不起作用 (不能保证对所有 Unix 类平台都生效;欢迎提出 :ref:`bug 报告 `),就得阅读系统关于动态链接的文档,并检查 Python 的 :file:`Makefile` (用 " +":func:`sysconfig.get_makefile_filename` 找到所在位置) 和编译参数。这时 :mod:`sysconfig` " +"模块会是个有用的工具,可用编程方式提取需组合在一起的配置值。 比如:" + +#: ../../extending/embedding.rst:348 +msgid "" +">>> import sysconfig\n" +">>> sysconfig.get_config_var('LIBS')\n" +"'-lpthread -ldl -lutil'\n" +">>> sysconfig.get_config_var('LINKFORSHARED')\n" +"'-Xlinker -export-dynamic'" +msgstr "" +">>> import sysconfig\n" +">>> sysconfig.get_config_var('LIBS')\n" +"'-lpthread -ldl -lutil'\n" +">>> sysconfig.get_config_var('LINKFORSHARED')\n" +"'-Xlinker -export-dynamic'" diff --git a/extending/extending.po b/extending/extending.po new file mode 100644 index 0000000000..7ba1c1fbbf --- /dev/null +++ b/extending/extending.po @@ -0,0 +1,2699 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-06-23 17:23+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../extending/extending.rst:8 +msgid "Extending Python with C or C++" +msgstr "使用 C 或 C++ 扩展 Python" + +#: ../../extending/extending.rst:10 +msgid "" +"It is quite easy to add new built-in modules to Python, if you know how to " +"program in C. Such :dfn:`extension modules` can do two things that can't be" +" done directly in Python: they can implement new built-in object types, and " +"they can call C library functions and system calls." +msgstr "" +"如果你会用 C,添加新的 Python 内置模块会很简单。以下两件不能用 Python 直接做的事,可以通过 :dfn:`extension " +"modules` 来实现:实现新的内置对象类型;调用 C 的库函数和系统调用。" + +#: ../../extending/extending.rst:15 +msgid "" +"To support extensions, the Python API (Application Programmers Interface) " +"defines a set of functions, macros and variables that provide access to most" +" aspects of the Python run-time system. The Python API is incorporated in a" +" C source file by including the header ``\"Python.h\"``." +msgstr "" +"为了支持扩展,Python API(应用程序编程接口)定义了一系列函数、宏和变量,可以访问 Python 运行时系统的大部分内容。Python 的 " +"API 可以通过在一个 C 源文件中引用 ``\"Python.h\"`` 头文件来使用。" + +#: ../../extending/extending.rst:20 +msgid "" +"The compilation of an extension module depends on its intended use as well " +"as on your system setup; details are given in later chapters." +msgstr "扩展模块的编译方式取决于你的目的以及系统设置;下面章节会详细介绍。" + +#: ../../extending/extending.rst:25 +msgid "" +"The C extension interface is specific to CPython, and extension modules do " +"not work on other Python implementations. In many cases, it is possible to " +"avoid writing C extensions and preserve portability to other " +"implementations. For example, if your use case is calling C library " +"functions or system calls, you should consider using the :mod:`ctypes` " +"module or the `cffi `_ library rather than " +"writing custom C code. These modules let you write Python code to interface " +"with C code and are more portable between implementations of Python than " +"writing and compiling a C extension module." +msgstr "" +"C 扩展接口特指 CPython,扩展模块无法在其他 Python 实现上工作。在大多数情况下,应该避免写 C " +"扩展,来保持可移植性。举个例子,如果你的用例调用了 C 库或系统调用,你应该考虑使用 :mod:`ctypes` 模块或 `cffi " +"`_ 库,而不是自己写 C 代码。这些模块允许你写 Python 代码来接口 C " +"代码,并且相较于编写和编译 C 扩展模块,该方法在不同 Python 实现之间具有更高的可移植性。" + +#: ../../extending/extending.rst:40 +msgid "A Simple Example" +msgstr "一个简单的例子" + +#: ../../extending/extending.rst:42 +msgid "" +"Let's create an extension module called ``spam`` (the favorite food of Monty" +" Python fans...) and let's say we want to create a Python interface to the C" +" library function :c:func:`system` [#]_. This function takes a null-" +"terminated character string as argument and returns an integer. We want " +"this function to be callable from Python as follows:" +msgstr "" +"让我们创建一个扩展模块 ``spam`` (Monty Python 粉丝最喜欢的食物...) 并且想要创建对应 C 库函数 " +":c:func:`system` [#]_ 的 Python 接口。这个函数接受一个以 null 结尾的字符串参数并返回一个整数。我们希望可以在 " +"Python 中以如下方式调用此函数:" + +#: ../../extending/extending.rst:48 +msgid "" +">>> import spam\n" +">>> status = spam.system(\"ls -l\")" +msgstr "" +">>> import spam\n" +">>> status = spam.system(\"ls -l\")" + +#: ../../extending/extending.rst:53 +msgid "" +"Begin by creating a file :file:`spammodule.c`. (Historically, if a module " +"is called ``spam``, the C file containing its implementation is called " +":file:`spammodule.c`; if the module name is very long, like ``spammify``, " +"the module name can be just :file:`spammify.c`.)" +msgstr "" +"首先创建一个 :file:`spammodule.c` 文件。(传统上,如果一个模块叫 ``spam``,则对应实现它的 C 文件叫 " +":file:`spammodule.c`;如果这个模块名字非常长,比如 ``spammify``,则这个模块的文件可以直接叫 " +":file:`spammify.c`。)" + +#: ../../extending/extending.rst:58 +msgid "The first two lines of our file can be::" +msgstr "文件中开始的两行是:" + +#: ../../extending/extending.rst:60 ../../extending/extending.rst:704 +msgid "" +"#define PY_SSIZE_T_CLEAN\n" +"#include " +msgstr "" +"#define PY_SSIZE_T_CLEAN\n" +"#include " + +#: ../../extending/extending.rst:63 +msgid "" +"which pulls in the Python API (you can add a comment describing the purpose " +"of the module and a copyright notice if you like)." +msgstr "这会导入 Python API(如果你喜欢,你可以在这里添加描述模块目标和版权信息的注释)。" + +#: ../../extending/extending.rst:68 +msgid "" +"Since Python may define some pre-processor definitions which affect the " +"standard headers on some systems, you *must* include :file:`Python.h` before" +" any standard headers are included." +msgstr "" +"由于 Python 可能会定义一些能在某些系统上影响标准头文件的预处理器定义,因此在包含任何标准头文件之前,你 *必须* 先包含 " +":file:`Python.h`。" + +#: ../../extending/extending.rst:72 +msgid "" +"``#define PY_SSIZE_T_CLEAN`` was used to indicate that ``Py_ssize_t`` should" +" be used in some APIs instead of ``int``. It is not necessary since Python " +"3.13, but we keep it here for backward compatibility. See :ref:`arg-parsing-" +"string-and-buffers` for a description of this macro." +msgstr "" +"``#define PY_SSIZE_T_CLEAN`` 被用来指明 ``Py_ssize_t`` 应当在某些 API 中代替 ``int`` 使用。 " +"它从 Python 3.13 起已不再需要,但我们保留它用于向下兼容。请参阅 :ref:`arg-parsing-string-and-buffers`" +" 获取该宏的描述。" + +#: ../../extending/extending.rst:77 +msgid "" +"All user-visible symbols defined by :file:`Python.h` have a prefix of ``Py``" +" or ``PY``, except those defined in standard header files." +msgstr "由 :file:`Python.h` 定义的用户可见的符号都带有 ``Py`` 或 ``PY`` 前缀,只有在标准头文件中定义的符号除外。" + +#: ../../extending/extending.rst:82 +msgid "" +"For backward compatibility, :file:`Python.h` includes several standard " +"header files. C extensions should include the standard headers that they " +"use, and should not rely on these implicit includes. If using the limited C " +"API version 3.13 or newer, the implicit includes are:" +msgstr "" +"为保持向下兼容,:file:`Python.h` 包括了一些标准头文件。C 扩展应当包括它们要使用的标准头文件,而不应依赖这些隐式的包括。 如果使用受限" +" C API 3.13 版或更新的版本,隐式的包括如下:" + +#: ../../extending/extending.rst:87 +msgid "````" +msgstr "````" + +#: ../../extending/extending.rst:88 +msgid "```` (on Windows)" +msgstr "```` (在 Windows 上)" + +#: ../../extending/extending.rst:89 +msgid "````" +msgstr "````" + +#: ../../extending/extending.rst:90 +msgid "````" +msgstr "````" + +#: ../../extending/extending.rst:91 +msgid "````" +msgstr "````" + +#: ../../extending/extending.rst:92 +msgid "````" +msgstr "````" + +#: ../../extending/extending.rst:93 +msgid "````" +msgstr "````" + +#: ../../extending/extending.rst:94 +msgid "```` (if present)" +msgstr "```` (如果提供)" + +#: ../../extending/extending.rst:96 +msgid "" +"If :c:macro:`Py_LIMITED_API` is not defined, or is set to version 3.12 or " +"older, the headers below are also included:" +msgstr "如果未定义 :c:macro:`Py_LIMITED_API`,或是设为 3.12 版或更旧的版本,则还将包括如下头文件:" + +#: ../../extending/extending.rst:99 +msgid "````" +msgstr "````" + +#: ../../extending/extending.rst:100 +msgid "```` (on POSIX)" +msgstr "```` (在 POSIX 上)" + +#: ../../extending/extending.rst:102 +msgid "" +"If :c:macro:`Py_LIMITED_API` is not defined, or is set to version 3.10 or " +"older, the headers below are also included:" +msgstr "如果未定义 :c:macro:`Py_LIMITED_API`,或是设为 3.10 版或更旧的版本,则还将包括如下头文件:" + +#: ../../extending/extending.rst:105 +msgid "````" +msgstr "````" + +#: ../../extending/extending.rst:106 +msgid "````" +msgstr "````" + +#: ../../extending/extending.rst:107 +msgid "````" +msgstr "````" + +#: ../../extending/extending.rst:108 +msgid "````" +msgstr "````" + +#: ../../extending/extending.rst:110 +msgid "" +"The next thing we add to our module file is the C function that will be " +"called when the Python expression ``spam.system(string)`` is evaluated " +"(we'll see shortly how it ends up being called)::" +msgstr "下面添加 C 函数到扩展模块,当调用 ``spam.system(string)`` 时会做出响应,(我们稍后会看到调用):" + +#: ../../extending/extending.rst:114 +msgid "" +"static PyObject *\n" +"spam_system(PyObject *self, PyObject *args)\n" +"{\n" +" const char *command;\n" +" int sts;\n" +"\n" +" if (!PyArg_ParseTuple(args, \"s\", &command))\n" +" return NULL;\n" +" sts = system(command);\n" +" return PyLong_FromLong(sts);\n" +"}" +msgstr "" +"static PyObject *\n" +"spam_system(PyObject *self, PyObject *args)\n" +"{\n" +" const char *command;\n" +" int sts;\n" +"\n" +" if (!PyArg_ParseTuple(args, \"s\", &command))\n" +" return NULL;\n" +" sts = system(command);\n" +" return PyLong_FromLong(sts);\n" +"}" + +#: ../../extending/extending.rst:126 +msgid "" +"There is a straightforward translation from the argument list in Python (for" +" example, the single expression ``\"ls -l\"``) to the arguments passed to " +"the C function. The C function always has two arguments, conventionally " +"named *self* and *args*." +msgstr "" +"有个直接翻译参数列表的方法 (举个例子,单独的 ``\"ls -l\"`` ) 到要传递给 C 函数的参数。C 函数总是有两个参数,通常名字是 " +"*self* 和 *args* ." + +#: ../../extending/extending.rst:131 +msgid "" +"The *self* argument points to the module object for module-level functions; " +"for a method it would point to the object instance." +msgstr "对模块级函数, *self* 参数指向模块对象;对于方法则指向对象实例。" + +#: ../../extending/extending.rst:134 +msgid "" +"The *args* argument will be a pointer to a Python tuple object containing " +"the arguments. Each item of the tuple corresponds to an argument in the " +"call's argument list. The arguments are Python objects --- in order to do " +"anything with them in our C function we have to convert them to C values. " +"The function :c:func:`PyArg_ParseTuple` in the Python API checks the " +"argument types and converts them to C values. It uses a template string to " +"determine the required types of the arguments as well as the types of the C " +"variables into which to store the converted values. More about this later." +msgstr "" +"*args* 参数是指向一个 Python 的 tuple 对象的指针,其中包含参数。每个 tuple 项对应一个调用参数。这些参数也全都是 " +"Python 对象 --- 要在我们的 C 函数中使用它们就需要先将其转换为 C 值。Python API 中的函数 " +":c:func:`PyArg_ParseTuple` 会检查参数类型并将其转换为 C 值。它使用模板字符串确定需要的参数类型以及存储被转换的值的 C " +"变量类型。细节将稍后说明。" + +#: ../../extending/extending.rst:143 +msgid "" +":c:func:`PyArg_ParseTuple` returns true (nonzero) if all arguments have the " +"right type and its components have been stored in the variables whose " +"addresses are passed. It returns false (zero) if an invalid argument list " +"was passed. In the latter case it also raises an appropriate exception so " +"the calling function can return ``NULL`` immediately (as we saw in the " +"example)." +msgstr "" +":c:func:`PyArg_ParseTuple` 在所有参数都有正确类型且组成部分按顺序放在传递进来的地址里时,返回真 " +"(非零)。其在传入无效参数时返回假 (零)。在后续例子里,还会抛出特定异常,使得调用的函数可以理解返回 ``NULL`` (也就是例子里所见)。" + +#: ../../extending/extending.rst:153 +msgid "Intermezzo: Errors and Exceptions" +msgstr "关于错误和异常" + +#: ../../extending/extending.rst:155 +msgid "" +"An important convention throughout the Python interpreter is the following: " +"when a function fails, it should set an exception condition and return an " +"error value (usually ``-1`` or a ``NULL`` pointer). Exception information " +"is stored in three members of the interpreter's thread state. These are " +"``NULL`` if there is no exception. Otherwise they are the C equivalents of " +"the members of the Python tuple returned by :meth:`sys.exc_info`. These are" +" the exception type, exception instance, and a traceback object. It is " +"important to know about them to understand how errors are passed around." +msgstr "" +"整个 Python 解释器系统有一个如下所述的重要惯例:当一个函数运行失败时,它应当设置一个异常条件并返回一个错误值(通常为 ``-1`` 或 " +"``NULL`` 指针)。异常信息保存在解释器线程状态的三个成员中。如果没有异常则它们的值为 ``NULL``。在其他情况下它们是 " +":meth:`sys.exc_info` 所返回的 Python 元组的成员的 C 对应物。它们分别是异常类型、异常实例和回溯对象。 " +"理解它们对于理解错误是如何被传递的非常重要。" + +#: ../../extending/extending.rst:164 +msgid "" +"The Python API defines a number of functions to set various types of " +"exceptions." +msgstr "Python API 中定义了一些函数来设置这些变量。" + +#: ../../extending/extending.rst:166 +msgid "" +"The most common one is :c:func:`PyErr_SetString`. Its arguments are an " +"exception object and a C string. The exception object is usually a " +"predefined object like :c:data:`PyExc_ZeroDivisionError`. The C string " +"indicates the cause of the error and is converted to a Python string object " +"and stored as the \"associated value\" of the exception." +msgstr "" +"最常用的就是 :c:func:`PyErr_SetString`。其参数是异常对象和 C 字符串。异常对象一般是像 " +":c:data:`PyExc_ZeroDivisionError` 这样的预定义对象。C 字符串指明异常原因,并被转换为一个 Python " +"字符串对象存储为异常的“关联值”。" + +#: ../../extending/extending.rst:172 +msgid "" +"Another useful function is :c:func:`PyErr_SetFromErrno`, which only takes an" +" exception argument and constructs the associated value by inspection of the" +" global variable :c:data:`errno`. The most general function is " +":c:func:`PyErr_SetObject`, which takes two object arguments, the exception " +"and its associated value. You don't need to :c:func:`Py_INCREF` the objects" +" passed to any of these functions." +msgstr "" +"另一个有用的函数是 :c:func:`PyErr_SetFromErrno`,仅接受一个异常对象,异常描述包含在全局变量 :c:data:`errno`" +" 中。最通用的函数还是 :c:func:`PyErr_SetObject` ,包含两个参数,分别为异常对象和异常描述。你不需要使用 " +":c:func:`Py_INCREF` 来增加传递到其他函数的参数对象的引用计数。" + +#: ../../extending/extending.rst:179 +msgid "" +"You can test non-destructively whether an exception has been set with " +":c:func:`PyErr_Occurred`. This returns the current exception object, or " +"``NULL`` if no exception has occurred. You normally don't need to call " +":c:func:`PyErr_Occurred` to see whether an error occurred in a function " +"call, since you should be able to tell from the return value." +msgstr "" +"你可以通过 :c:func:`PyErr_Occurred` 在不造成破坏的情况下检测是否设置了异常。这将返回当前异常对象,或者如果未发生异常则返回 " +"``NULL``。你通常不需要调用 :c:func:`PyErr_Occurred` 来查看函数调用中是否发生了错误,因为你应该能从返回值中看出来。" + +#: ../../extending/extending.rst:185 +msgid "" +"When a function *f* that calls another function *g* detects that the latter " +"fails, *f* should itself return an error value (usually ``NULL`` or ``-1``)." +" It should *not* call one of the ``PyErr_*`` functions --- one has already " +"been called by *g*. *f*'s caller is then supposed to also return an error " +"indication to *its* caller, again *without* calling ``PyErr_*``, and so on " +"--- the most detailed cause of the error was already reported by the " +"function that first detected it. Once the error reaches the Python " +"interpreter's main loop, this aborts the currently executing Python code and" +" tries to find an exception handler specified by the Python programmer." +msgstr "" +"当一个函数 *f* 调用另一个函数 *g* 时检测到后者出错了,*f* 应当自己返回一个错误值 (通常为 ``NULL`` 或 ``-1``)。它 " +"*不应* 调用某个 ``PyErr_*`` 函数 --- 这类函数已经被 *g* 调用过了。 *f* 的调用者随后也应当返回一个错误来提示 *它的* " +"调用者,同样 *不应* 调用 ``PyErr_*``,依此类推 --- 错误的最详细原因已经由首先检测到它的函数报告了。一旦这个错误到达 Python " +"解释器的主循环,它会中止当前执行的 Python 代码并尝试找出由 Python 程序员所指定的异常处理器。" + +#: ../../extending/extending.rst:195 +msgid "" +"(There are situations where a module can actually give a more detailed error" +" message by calling another ``PyErr_*`` function, and in such cases it is " +"fine to do so. As a general rule, however, this is not necessary, and can " +"cause information about the cause of the error to be lost: most operations " +"can fail for a variety of reasons.)" +msgstr "" +"(在某些情况下模块确实能够通过调用其它 ``PyErr_*`` 函数来给出更为详细的错误消息,并且在这些情况下是可以这样做的。 " +"但是按照一般规则,这是不必要的,并可能导致有关错误的信息丢失:大多数操作会由于种种原因而失败。)" + +#: ../../extending/extending.rst:201 +msgid "" +"To ignore an exception set by a function call that failed, the exception " +"condition must be cleared explicitly by calling :c:func:`PyErr_Clear`. The " +"only time C code should call :c:func:`PyErr_Clear` is if it doesn't want to " +"pass the error on to the interpreter but wants to handle it completely by " +"itself (possibly by trying something else, or pretending nothing went " +"wrong)." +msgstr "" +"想要忽略由一个失败的函数调用所设置的异常,异常条件必须通过调用 :c:func:`PyErr_Clear` 显式地被清除。C 代码应当调用 " +":c:func:`PyErr_Clear` 的唯一情况是如果它不想将错误传给解释器而是想完全由自己来处理它(可能是尝试其他方法,或是假装没有出错)。" + +#: ../../extending/extending.rst:207 +msgid "" +"Every failing :c:func:`malloc` call must be turned into an exception --- the" +" direct caller of :c:func:`malloc` (or :c:func:`realloc`) must call " +":c:func:`PyErr_NoMemory` and return a failure indicator itself. All the " +"object-creating functions (for example, :c:func:`PyLong_FromLong`) already " +"do this, so this note is only relevant to those who call :c:func:`malloc` " +"directly." +msgstr "" +"每次失败的 :c:func:`malloc` 调用必须转换为一个异常。 :c:func:`malloc` (或 :c:func:`realloc` ) " +"的直接调用者必须调用 :c:func:`PyErr_NoMemory` 来返回错误来提示。所有对象创建函数 (例如 " +":c:func:`PyLong_FromLong` ) 已经这么做了,所以这个提示仅用于直接调用 :c:func:`malloc` 的情况。" + +#: ../../extending/extending.rst:213 +msgid "" +"Also note that, with the important exception of :c:func:`PyArg_ParseTuple` " +"and friends, functions that return an integer status usually return a " +"positive value or zero for success and ``-1`` for failure, like Unix system " +"calls." +msgstr "" +"还要注意的是,除了 :c:func:`PyArg_ParseTuple` 等重要的例外,返回整数状态码的函数通常都是返回正值或零来表示成功,而以 " +"``-1`` 表示失败,如同 Unix 系统调用一样。" + +#: ../../extending/extending.rst:217 +msgid "" +"Finally, be careful to clean up garbage (by making :c:func:`Py_XDECREF` or " +":c:func:`Py_DECREF` calls for objects you have already created) when you " +"return an error indicator!" +msgstr "" +"最后,当你返回一个错误指示器时要注意清理垃圾(通过为你已经创建的对象执行 :c:func:`Py_XDECREF` 或 " +":c:func:`Py_DECREF` 调用)!" + +#: ../../extending/extending.rst:221 +msgid "" +"The choice of which exception to raise is entirely yours. There are " +"predeclared C objects corresponding to all built-in Python exceptions, such " +"as :c:data:`PyExc_ZeroDivisionError`, which you can use directly. Of course," +" you should choose exceptions wisely --- don't use :c:data:`PyExc_TypeError`" +" to mean that a file couldn't be opened (that should probably be " +":c:data:`PyExc_OSError`). If something's wrong with the argument list, the " +":c:func:`PyArg_ParseTuple` function usually raises " +":c:data:`PyExc_TypeError`. If you have an argument whose value must be in a" +" particular range or must satisfy other conditions, " +":c:data:`PyExc_ValueError` is appropriate." +msgstr "" +"选择引发哪个异常完全取决于你的喜好。所有 Python 内置异常都有对应的预声明 C 对象,例如 " +":c:data:`PyExc_ZeroDivisionError`,你可以直接使用它们。当然,你应当明智地选择异常 --- 不要使用 " +":c:data:`PyExc_TypeError` 来表示文件无法打开(可能应该用 :c:data:`PyExc_OSError` 比较好)。 " +"如果参数列表有问题,:c:func:`PyArg_ParseTuple` 函数通常会引发 :c:data:`PyExc_TypeError`。 " +"如果你希望一个参数的值必须在特定范围内或必须满足其他条件,则适宜使用 :c:data:`PyExc_ValueError`。" + +#: ../../extending/extending.rst:231 +msgid "" +"You can also define a new exception that is unique to your module. The " +"simplest way to do this is to declare a static global object variable at the" +" beginning of the file::" +msgstr "你也可以定义你的模块独有的新异常。做到这点的最简单方式是在文件的开头声明一个静态全局对象变量::" + +#: ../../extending/extending.rst:235 +msgid "static PyObject *SpamError = NULL;" +msgstr "static PyObject *SpamError = NULL;" + +#: ../../extending/extending.rst:237 +msgid "" +"and initialize it by calling :c:func:`PyErr_NewException` in the module's " +":c:data:`Py_mod_exec` function (:c:func:`!spam_module_exec`)::" +msgstr "" +"并通过在模块的 :c:data:`Py_mod_exec` 函数 (:c:func:`!spam_module_exec`) 中调用 " +":c:func:`PyErr_NewException` 来初始化它::" + +#: ../../extending/extending.rst:240 +msgid "SpamError = PyErr_NewException(\"spam.error\", NULL, NULL);" +msgstr "SpamError = PyErr_NewException(\"spam.error\", NULL, NULL);" + +#: ../../extending/extending.rst:242 +msgid "" +"Since :c:data:`!SpamError` is a global variable, it will be overwritten " +"every time the module is reinitialized, when the :c:data:`Py_mod_exec` " +"function is called." +msgstr "" +"由于 :c:data:`!SpamError` 是一个全局变量,它将在模块每次重新初始化时被覆盖,即当 :c:data:`Py_mod_exec` " +"函数被调用时。" + +#: ../../extending/extending.rst:245 +msgid "" +"For now, let's avoid the issue: we will block repeated initialization by " +"raising an :py:exc:`ImportError`::" +msgstr "在目前,让我们避免这个问题:我们将通过引发 :py:exc:`ImportError` 来阻止重复的初始化::" + +#: ../../extending/extending.rst:248 +msgid "" +"static PyObject *SpamError = NULL;\n" +"\n" +"static int\n" +"spam_module_exec(PyObject *m)\n" +"{\n" +" if (SpamError != NULL) {\n" +" PyErr_SetString(PyExc_ImportError,\n" +" \"cannot initialize spam module more than once\");\n" +" return -1;\n" +" }\n" +" SpamError = PyErr_NewException(\"spam.error\", NULL, NULL);\n" +" if (PyModule_AddObjectRef(m, \"SpamError\", SpamError) < 0) {\n" +" return -1;\n" +" }\n" +"\n" +" return 0;\n" +"}\n" +"\n" +"static PyModuleDef_Slot spam_module_slots[] = {\n" +" {Py_mod_exec, spam_module_exec},\n" +" {0, NULL}\n" +"};\n" +"\n" +"static struct PyModuleDef spam_module = {\n" +" .m_base = PyModuleDef_HEAD_INIT,\n" +" .m_name = \"spam\",\n" +" .m_size = 0, // non-negative\n" +" .m_slots = spam_module_slots,\n" +"};\n" +"\n" +"PyMODINIT_FUNC\n" +"PyInit_spam(void)\n" +"{\n" +" return PyModuleDef_Init(&spam_module);\n" +"}" +msgstr "" +"static PyObject *SpamError = NULL;\n" +"\n" +"static int\n" +"spam_module_exec(PyObject *m)\n" +"{\n" +" if (SpamError != NULL) {\n" +" PyErr_SetString(PyExc_ImportError,\n" +" \"cannot initialize spam module more than once\");\n" +" return -1;\n" +" }\n" +" SpamError = PyErr_NewException(\"spam.error\", NULL, NULL);\n" +" if (PyModule_AddObjectRef(m, \"SpamError\", SpamError) < 0) {\n" +" return -1;\n" +" }\n" +"\n" +" return 0;\n" +"}\n" +"\n" +"static PyModuleDef_Slot spam_module_slots[] = {\n" +" {Py_mod_exec, spam_module_exec},\n" +" {0, NULL}\n" +"};\n" +"\n" +"static struct PyModuleDef spam_module = {\n" +" .m_base = PyModuleDef_HEAD_INIT,\n" +" .m_name = \"spam\",\n" +" .m_size = 0, // non-negative\n" +" .m_slots = spam_module_slots,\n" +"};\n" +"\n" +"PyMODINIT_FUNC\n" +"PyInit_spam(void)\n" +"{\n" +" return PyModuleDef_Init(&spam_module);\n" +"}" + +#: ../../extending/extending.rst:284 +msgid "" +"Note that the Python name for the exception object is :exc:`!spam.error`. " +"The :c:func:`PyErr_NewException` function may create a class with the base " +"class being :exc:`Exception` (unless another class is passed in instead of " +"``NULL``), described in :ref:`bltin-exceptions`." +msgstr "" +"请注意该异常对象的 Python 名称为 :exc:`!spam.error`。 :c:func:`PyErr_NewException` " +"函数可以创建基类为 :exc:`Exception` 的类 (除非传入了另一个类而不是 ``NULL``),如 :ref:`bltin-" +"exceptions` 中所描述的。" + +#: ../../extending/extending.rst:289 +msgid "" +"Note also that the :c:data:`!SpamError` variable retains a reference to the " +"newly created exception class; this is intentional! Since the exception " +"could be removed from the module by external code, an owned reference to the" +" class is needed to ensure that it will not be discarded, causing " +":c:data:`!SpamError` to become a dangling pointer. Should it become a " +"dangling pointer, C code which raises the exception could cause a core dump " +"or other unintended side effects." +msgstr "" +"请注意 :c:data:`!SpamError` 变量保留了一个对新创建的异常类的引用;这是有意为之的! " +"由于异常可能会被外部代码从模块中删除,因此需要拥有一个对该类的引用以确保它不会被丢弃,从而导致 :c:data:`!SpamError` " +"成为一个悬空指针。如果异常类成为悬空指针,则引发该异常的 C 代码可能会导致核心转储或其他预期之外的附带影响。" + +#: ../../extending/extending.rst:296 +msgid "" +"For now, the :c:func:`Py_DECREF` call to remove this reference is missing. " +"Even when the Python interpreter shuts down, the global :c:data:`!SpamError`" +" variable will not be garbage-collected. It will \"leak\". We did, however, " +"ensure that this will happen at most once per process." +msgstr "" +"在目前,用于移除该引用的 :c:func:`Py_DECREF` 调用是缺失的。即使是在 Python 解释器关闭时,全局变量 " +":c:data:`!SpamError` 也不会被当作垃圾回收。它将会“泄漏”。不过,我们确实能保证这在每个进程中最多发生一次。" + +#: ../../extending/extending.rst:301 +msgid "" +"We discuss the use of :c:macro:`PyMODINIT_FUNC` as a function return type " +"later in this sample." +msgstr "本样例稍后将讨论 :c:macro:`PyMODINIT_FUNC` 作为函数返回类型的用法。" + +#: ../../extending/extending.rst:304 +msgid "" +"The :exc:`!spam.error` exception can be raised in your extension module " +"using a call to :c:func:`PyErr_SetString` as shown below::" +msgstr "可在扩展模块中调用 :c:func:`PyErr_SetString` 来引发 :exc:`!spam.error` 异常,如下所示::" + +#: ../../extending/extending.rst:307 +msgid "" +"static PyObject *\n" +"spam_system(PyObject *self, PyObject *args)\n" +"{\n" +" const char *command;\n" +" int sts;\n" +"\n" +" if (!PyArg_ParseTuple(args, \"s\", &command))\n" +" return NULL;\n" +" sts = system(command);\n" +" if (sts < 0) {\n" +" PyErr_SetString(SpamError, \"System command failed\");\n" +" return NULL;\n" +" }\n" +" return PyLong_FromLong(sts);\n" +"}" +msgstr "" +"static PyObject *\n" +"spam_system(PyObject *self, PyObject *args)\n" +"{\n" +" const char *command;\n" +" int sts;\n" +"\n" +" if (!PyArg_ParseTuple(args, \"s\", &command))\n" +" return NULL;\n" +" sts = system(command);\n" +" if (sts < 0) {\n" +" PyErr_SetString(SpamError, \"System command failed\");\n" +" return NULL;\n" +" }\n" +" return PyLong_FromLong(sts);\n" +"}" + +#: ../../extending/extending.rst:327 +msgid "Back to the Example" +msgstr "回到例子" + +#: ../../extending/extending.rst:329 +msgid "" +"Going back to our example function, you should now be able to understand " +"this statement::" +msgstr "回到前面的例子,你应该明白下面的代码:" + +#: ../../extending/extending.rst:332 +msgid "" +"if (!PyArg_ParseTuple(args, \"s\", &command))\n" +" return NULL;" +msgstr "" +"if (!PyArg_ParseTuple(args, \"s\", &command))\n" +" return NULL;" + +#: ../../extending/extending.rst:335 +msgid "" +"It returns ``NULL`` (the error indicator for functions returning object " +"pointers) if an error is detected in the argument list, relying on the " +"exception set by :c:func:`PyArg_ParseTuple`. Otherwise the string value of " +"the argument has been copied to the local variable :c:data:`!command`. This" +" is a pointer assignment and you are not supposed to modify the string to " +"which it points (so in Standard C, the variable :c:data:`!command` should " +"properly be declared as ``const char *command``)." +msgstr "" +"如果在参数列表中检测到错误,它将返回 ``NULL`` (该值是返回对象指针的函数的错误提示),这取决于 " +":c:func:`PyArg_ParseTuple` 设置的异常。在其他情况下参数的字符串值会被拷贝到局部变量 :c:data:`!command`。 " +"这是一个指针赋值并且你不应该修改它所指向的字符串 (因此在标准 C 中,变量 :c:data:`!command` 应当被正确地声明为 ``const " +"char *command``)。" + +#: ../../extending/extending.rst:343 +msgid "" +"The next statement is a call to the Unix function :c:func:`system`, passing " +"it the string we just got from :c:func:`PyArg_ParseTuple`::" +msgstr "" +"下一个语句使用 UNIX 系统函数 :c:func:`system`,传递给他的参数是刚才从 :c:func:`PyArg_ParseTuple` " +"取出的:" + +#: ../../extending/extending.rst:346 +msgid "sts = system(command);" +msgstr "sts = system(command);" + +#: ../../extending/extending.rst:348 +msgid "" +"Our :func:`!spam.system` function must return the value of :c:data:`!sts` as" +" a Python object. This is done using the function " +":c:func:`PyLong_FromLong`. ::" +msgstr "" +"我们的 :func:`!spam.system` 函数必须以 Python 对象的形式返回 :c:data:`!sts` 的值。这是通过使用函数 " +":c:func:`PyLong_FromLong` 完成的。 ::" + +#: ../../extending/extending.rst:351 +msgid "return PyLong_FromLong(sts);" +msgstr "return PyLong_FromLong(sts);" + +#: ../../extending/extending.rst:353 +msgid "" +"In this case, it will return an integer object. (Yes, even integers are " +"objects on the heap in Python!)" +msgstr "在这种情况下,会返回一个整数对象,(这个对象会在 Python 堆里面管理)。" + +#: ../../extending/extending.rst:356 +msgid "" +"If you have a C function that returns no useful argument (a function " +"returning :c:expr:`void`), the corresponding Python function must return " +"``None``. You need this idiom to do so (which is implemented by the " +":c:macro:`Py_RETURN_NONE` macro)::" +msgstr "" +"如果你有一个不返回有用参数的 C 函数(即返回 :c:expr:`void` 的函数),则对应的 Python 函数必须返回 ``None``。 " +"你必须使用这种写法(它是通过 :c:macro:`Py_RETURN_NONE` 宏来实现的) ::" + +#: ../../extending/extending.rst:361 +msgid "" +"Py_INCREF(Py_None);\n" +"return Py_None;" +msgstr "" +"Py_INCREF(Py_None);\n" +"return Py_None;" + +#: ../../extending/extending.rst:364 +msgid "" +":c:data:`Py_None` is the C name for the special Python object ``None``. It " +"is a genuine Python object rather than a ``NULL`` pointer, which means " +"\"error\" in most contexts, as we have seen." +msgstr "" +":c:data:`Py_None` 是特殊 Python 对象 ``None`` 所对应的 C 名称。它是一个真正的 Python 对象而不是 " +"``NULL`` 指针,如我们所见,后者在大多数上下文中都意味着“错误”。" + +#: ../../extending/extending.rst:372 +msgid "The Module's Method Table and Initialization Function" +msgstr "模块方法表和初始化函数" + +#: ../../extending/extending.rst:374 +msgid "" +"I promised to show how :c:func:`!spam_system` is called from Python " +"programs. First, we need to list its name and address in a \"method " +"table\"::" +msgstr "" +"我承诺过要向大家展示如何从 Python 程序中调用 :c:func:`!spam_system`。首先,我们需要在“方法表”中列出它的名称和地址::" + +#: ../../extending/extending.rst:377 +msgid "" +"static PyMethodDef spam_methods[] = {\n" +" ...\n" +" {\"system\", spam_system, METH_VARARGS,\n" +" \"Execute a shell command.\"},\n" +" ...\n" +" {NULL, NULL, 0, NULL} /* Sentinel */\n" +"};" +msgstr "" +"static PyMethodDef spam_methods[] = {\n" +" ...\n" +" {\"system\", spam_system, METH_VARARGS,\n" +" \"Execute a shell command.\"},\n" +" ...\n" +" {NULL, NULL, 0, NULL} /* Sentinel */\n" +"};" + +#: ../../extending/extending.rst:385 +msgid "" +"Note the third entry (``METH_VARARGS``). This is a flag telling the " +"interpreter the calling convention to be used for the C function. It should" +" normally always be ``METH_VARARGS`` or ``METH_VARARGS | METH_KEYWORDS``; a " +"value of ``0`` means that an obsolete variant of :c:func:`PyArg_ParseTuple` " +"is used." +msgstr "" +"注意第三个参数 ( ``METH_VARARGS`` ) ,这个标志指定会使用 C 的调用惯例。可选值有 ``METH_VARARGS``、 " +"``METH_VARARGS | METH_KEYWORDS``。值 ``0`` 代表使用 :c:func:`PyArg_ParseTuple` " +"的陈旧变体。" + +#: ../../extending/extending.rst:390 +msgid "" +"When using only ``METH_VARARGS``, the function should expect the Python-" +"level parameters to be passed in as a tuple acceptable for parsing via " +":c:func:`PyArg_ParseTuple`; more information on this function is provided " +"below." +msgstr "" +"如果单独使用 ``METH_VARARGS``,函数会等待 Python 传来 tuple 格式的参数,并最终使用 " +":c:func:`PyArg_ParseTuple` 进行解析。" + +#: ../../extending/extending.rst:394 +msgid "" +"The :c:macro:`METH_KEYWORDS` bit may be set in the third field if keyword " +"arguments should be passed to the function. In this case, the C function " +"should accept a third ``PyObject *`` parameter which will be a dictionary of" +" keywords. Use :c:func:`PyArg_ParseTupleAndKeywords` to parse the arguments " +"to such a function." +msgstr "" +"如果应当将关键字参数传给该函数则可以在第三个字段中设置 :c:macro:`METH_KEYWORDS` 比特位。在此情况下,C 函数应当接受第三个 " +"``PyObject *`` 形参,它将为一个由关键字组成的字典。使用 :c:func:`PyArg_ParseTupleAndKeywords` " +"来将参数解析为函数。" + +#: ../../extending/extending.rst:400 +msgid "" +"The method table must be referenced in the module definition structure::" +msgstr "这个方法表必须被模块定义结构所引用。" + +#: ../../extending/extending.rst:402 +msgid "" +"static struct PyModuleDef spam_module = {\n" +" ...\n" +" .m_methods = spam_methods,\n" +" ...\n" +"};" +msgstr "" +"static struct PyModuleDef spam_module = {\n" +" ...\n" +" .m_methods = spam_methods,\n" +" ...\n" +"};" + +#: ../../extending/extending.rst:408 +msgid "" +"This structure, in turn, must be passed to the interpreter in the module's " +"initialization function. The initialization function must be named " +":c:func:`!PyInit_name`, where *name* is the name of the module, and should " +"be the only non-\\ ``static`` item defined in the module file::" +msgstr "" +"这个结构体必须在模块的初始化函数中传递给解释器。初始化函数必须命名为 :c:func:`!PyInit_name`,其中 *name* " +"是模块的名称,并且应该是模块文件中定义的唯一非 ``static`` 条目::" + +#: ../../extending/extending.rst:413 +msgid "" +"PyMODINIT_FUNC\n" +"PyInit_spam(void)\n" +"{\n" +" return PyModuleDef_Init(&spam_module);\n" +"}" +msgstr "" +"PyMODINIT_FUNC\n" +"PyInit_spam(void)\n" +"{\n" +" return PyModuleDef_Init(&spam_module);\n" +"}" + +#: ../../extending/extending.rst:419 +msgid "" +"Note that :c:macro:`PyMODINIT_FUNC` declares the function as ``PyObject *`` " +"return type, declares any special linkage declarations required by the " +"platform, and for C++ declares the function as ``extern \"C\"``." +msgstr "" +"请注意 :c:macro:`PyMODINIT_FUNC` 将函数声明为 ``PyObject *`` " +"返回类型,声明了平台所要求的任何特殊链接声明,并针对 C++ 将函数声明为 ``extern \"C\"``。" + +#: ../../extending/extending.rst:423 +msgid "" +":c:func:`!PyInit_spam` is called when each interpreter imports its module " +":mod:`!spam` for the first time. (See below for comments about embedding " +"Python.) A pointer to the module definition must be returned via " +":c:func:`PyModuleDef_Init`, so that the import machinery can create the " +"module and store it in ``sys.modules``." +msgstr "" +":c:func:`!PyInit_spam` 会在每个解释器首次导入其 :mod:`!spam` 模块时被调用。 (请参看下文中有关嵌入式 Python" +" 的说明。)必须通过 :c:func:`PyModuleDef_Init` 返回一个指向模块定义的指针,以便导入机制能够创建该模块并将其保存到 " +"``sys.modules`` 中。" + +#: ../../extending/extending.rst:428 +msgid "" +"When embedding Python, the :c:func:`!PyInit_spam` function is not called " +"automatically unless there's an entry in the :c:data:`PyImport_Inittab` " +"table. To add the module to the initialization table, use " +":c:func:`PyImport_AppendInittab`, optionally followed by an import of the " +"module::" +msgstr "" +"当嵌入 Python 时,除非 :c:data:`PyImport_Inittab` 表中有条目,否则不会自动调用 " +":c:func:`!PyInit_spam` 函数。要将模块添加到初始化表中,请使用 " +":c:func:`PyImport_AppendInittab`,可选择随后导入该模块::" + +#: ../../extending/extending.rst:433 +msgid "" +"#define PY_SSIZE_T_CLEAN\n" +"#include \n" +"\n" +"int\n" +"main(int argc, char *argv[])\n" +"{\n" +" PyStatus status;\n" +" PyConfig config;\n" +" PyConfig_InitPythonConfig(&config);\n" +"\n" +" /* Add a built-in module, before Py_Initialize */\n" +" if (PyImport_AppendInittab(\"spam\", PyInit_spam) == -1) {\n" +" fprintf(stderr, \"Error: could not extend in-built modules table\\n\");\n" +" exit(1);\n" +" }\n" +"\n" +" /* Pass argv[0] to the Python interpreter */\n" +" status = PyConfig_SetBytesString(&config, &config.program_name, argv[0]);\n" +" if (PyStatus_Exception(status)) {\n" +" goto exception;\n" +" }\n" +"\n" +" /* Initialize the Python interpreter. Required.\n" +" If this step fails, it will be a fatal error. */\n" +" status = Py_InitializeFromConfig(&config);\n" +" if (PyStatus_Exception(status)) {\n" +" goto exception;\n" +" }\n" +" PyConfig_Clear(&config);\n" +"\n" +" /* Optionally import the module; alternatively,\n" +" import can be deferred until the embedded script\n" +" imports it. */\n" +" PyObject *pmodule = PyImport_ImportModule(\"spam\");\n" +" if (!pmodule) {\n" +" PyErr_Print();\n" +" fprintf(stderr, \"Error: could not import module 'spam'\\n\");\n" +" }\n" +"\n" +" // ... use Python C API here ...\n" +"\n" +" return 0;\n" +"\n" +" exception:\n" +" PyConfig_Clear(&config);\n" +" Py_ExitStatusException(status);\n" +"}" +msgstr "" +"#define PY_SSIZE_T_CLEAN\n" +"#include \n" +"\n" +"int\n" +"main(int argc, char *argv[])\n" +"{\n" +" PyStatus status;\n" +" PyConfig config;\n" +" PyConfig_InitPythonConfig(&config);\n" +"\n" +" /* 添加一个内置模块,在 Py_Initialize 之前 */\n" +" if (PyImport_AppendInittab(\"spam\", PyInit_spam) == -1) {\n" +" fprintf(stderr, \"Error: could not extend in-built modules table\\n\");\n" +" exit(1);\n" +" }\n" +"\n" +" /* 将 argv[0] 传给 Python 解释器 */\n" +" status = PyConfig_SetBytesString(&config, &config.program_name, argv[0]);\n" +" if (PyStatus_Exception(status)) {\n" +" goto exception;\n" +" }\n" +"\n" +" /* 初始化 Python 解释器。必需的操作。\n" +" 如果此步骤失败,将导致致命错误。 */\n" +" status = Py_InitializeFromConfig(&config);\n" +" if (PyStatus_Exception(status)) {\n" +" goto exception;\n" +" }\n" +" PyConfig_Clear(&config);\n" +"\n" +" /* 可以选择导入模块;或是作为替代,\n" +" 导入可以被延迟直到由嵌入的脚本\n" +" 来导入它。 */\n" +" PyObject *pmodule = PyImport_ImportModule(\"spam\");\n" +" if (!pmodule) {\n" +" PyErr_Print();\n" +" fprintf(stderr, \"Error: could not import module 'spam'\\n\");\n" +" }\n" +"\n" +" // ... 在此使用 Python C API ...\n" +"\n" +" return 0;\n" +"\n" +" exception:\n" +" PyConfig_Clear(&config);\n" +" Py_ExitStatusException(status);\n" +"}" + +#: ../../extending/extending.rst:483 +msgid "" +"If you declare a global variable or a local static one, the module may " +"experience unintended side-effects on re-initialisation, for example when " +"removing entries from ``sys.modules`` or importing compiled modules into " +"multiple interpreters within a process (or following a :c:func:`fork` " +"without an intervening :c:func:`exec`). If module state is not yet fully " +":ref:`isolated `, authors should consider " +"marking the module as having no support for subinterpreters (via " +":c:macro:`Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED`)." +msgstr "" +"如果你声明一个全局变量或局部静态变量,模块可能在重新初始化时出现预料之外的附带影响,例如在从 ``sys.modules`` " +"中移除条目或将已编译的模块导入到一个进程中的多个解释器(或者在未干预 :c:func:`exec` 的情况下执行 :c:func:`fork` " +"之后)的时候。 如果模块状态没有被完全 :ref:`隔离 `,开发者应当考虑将模块标记为不支持子解释器 (通过 " +":c:macro:`Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED`)。" + +#: ../../extending/extending.rst:492 +msgid "" +"A more substantial example module is included in the Python source " +"distribution as :file:`Modules/xxlimited.c`. This file may be used as a " +"template or simply read as an example." +msgstr "" +"在 Python 源代码发布包的 :file:`Modules/xxlimited.c` 中包括了一个更详细的示例。 " +"此文件可被用作代码模板或是学习样例。" + +#: ../../extending/extending.rst:500 +msgid "Compilation and Linkage" +msgstr "编译和链接" + +#: ../../extending/extending.rst:502 +msgid "" +"There are two more things to do before you can use your new extension: " +"compiling and linking it with the Python system. If you use dynamic " +"loading, the details may depend on the style of dynamic loading your system " +"uses; see the chapters about building extension modules (chapter " +":ref:`building`) and additional information that pertains only to building " +"on Windows (chapter :ref:`building-on-windows`) for more information about " +"this." +msgstr "" +"在你能使用你的新写的扩展之前,你还需要做两件事情:使用 Python " +"系统来编译和链接。如果你使用动态加载,这取决于你使用的操作系统的动态加载机制;更多信息请参考编译扩展模块的章节( :ref:`building` " +"章节),以及在 Windows 上编译需要的额外信息( :ref:`building-on-windows` 章节)。" + +#: ../../extending/extending.rst:509 +msgid "" +"If you can't use dynamic loading, or if you want to make your module a " +"permanent part of the Python interpreter, you will have to change the " +"configuration setup and rebuild the interpreter. Luckily, this is very " +"simple on Unix: just place your file (:file:`spammodule.c` for example) in " +"the :file:`Modules/` directory of an unpacked source distribution, add a " +"line to the file :file:`Modules/Setup.local` describing your file:" +msgstr "" +"如果你不使用动态加载,或者想要让模块永久性的作为 Python 解释器的一部分,就必须修改配置设置,并重新构建解释器。幸运的是在 Unix " +"上很简单,只需要把你的文件 ( :file:`spammodule.c` 为例) 放在解压缩源码发行包的 :file:`Modules/` " +"目录下,添加一行到 :file:`Modules/Setup.local` 来描述你的文件:" + +#: ../../extending/extending.rst:516 +msgid "spam spammodule.o" +msgstr "spam spammodule.o" + +#: ../../extending/extending.rst:520 +msgid "" +"and rebuild the interpreter by running :program:`make` in the toplevel " +"directory. You can also run :program:`make` in the :file:`Modules/` " +"subdirectory, but then you must first rebuild :file:`Makefile` there by " +"running ':program:`make` Makefile'. (This is necessary each time you change" +" the :file:`Setup` file.)" +msgstr "" +"然后在顶层目录运行 :program:`make` 来重新构建解释器。你也可以在 :file:`Modules/` 子目录使用 " +":program:`make`,但是你必须先重建 :file:`Makefile` 文件,然后运行 ':program:`make` Makefile'" +" 命令。(你每次修改 :file:`Setup` 文件都需要这样操作。)" + +#: ../../extending/extending.rst:526 +msgid "" +"If your module requires additional libraries to link with, these can be " +"listed on the line in the configuration file as well, for instance:" +msgstr "如果你的模块需要额外的链接,这些内容可以列出在配置文件里,举个实例:" + +#: ../../extending/extending.rst:529 +msgid "spam spammodule.o -lX11" +msgstr "spam spammodule.o -lX11" + +#: ../../extending/extending.rst:537 +msgid "Calling Python Functions from C" +msgstr "在 C 中调用 Python 函数" + +#: ../../extending/extending.rst:539 +msgid "" +"So far we have concentrated on making C functions callable from Python. The" +" reverse is also useful: calling Python functions from C. This is especially" +" the case for libraries that support so-called \"callback\" functions. If a" +" C interface makes use of callbacks, the equivalent Python often needs to " +"provide a callback mechanism to the Python programmer; the implementation " +"will require calling the Python callback functions from a C callback. Other" +" uses are also imaginable." +msgstr "" +"迄今为止,我们一直把注意力集中于让 Python 调用 C 函数,其实反过来也很有用,就是用 C 调用 Python " +"函数。这在回调函数中尤其有用。如果一个 C 接口使用回调,那么就要实现这个回调机制。" + +#: ../../extending/extending.rst:547 +msgid "" +"Fortunately, the Python interpreter is easily called recursively, and there " +"is a standard interface to call a Python function. (If you're interested in" +" how to call the Python parser with a particular string as input, see " +":ref:`veryhigh`.)" +msgstr "" + +#: ../../extending/extending.rst:551 +msgid "" +"Calling a Python function is easy. First, the Python program must somehow " +"pass you the Python function object. You should provide a function (or some" +" other interface) to do this. When this function is called, save a pointer " +"to the Python function object (be careful to :c:func:`Py_INCREF` it!) in a " +"global variable --- or wherever you see fit. For example, the following " +"function might be part of a module definition::" +msgstr "" +"调用 Python 函数很简单,首先 Python 程序要传递 Python 函数对象。应该提供个函数 (或其他接口) " +"来实现。当调用这个函数时,用全局变量保存 Python 函数对象的指针,还要调用 (:c:func:`Py_INCREF`) " +"来增加引用计数,当然不用全局变量也没什么关系。举个例子,如下函数可能是模块定义的一部分:" + +#: ../../extending/extending.rst:558 +msgid "" +"static PyObject *my_callback = NULL;\n" +"\n" +"static PyObject *\n" +"my_set_callback(PyObject *dummy, PyObject *args)\n" +"{\n" +" PyObject *result = NULL;\n" +" PyObject *temp;\n" +"\n" +" if (PyArg_ParseTuple(args, \"O:set_callback\", &temp)) {\n" +" if (!PyCallable_Check(temp)) {\n" +" PyErr_SetString(PyExc_TypeError, \"parameter must be callable\");\n" +" return NULL;\n" +" }\n" +" Py_XINCREF(temp); /* Add a reference to new callback */\n" +" Py_XDECREF(my_callback); /* Dispose of previous callback */\n" +" my_callback = temp; /* Remember new callback */\n" +" /* Boilerplate to return \"None\" */\n" +" Py_INCREF(Py_None);\n" +" result = Py_None;\n" +" }\n" +" return result;\n" +"}" +msgstr "" +"static PyObject *my_callback = NULL;\n" +"\n" +"static PyObject *\n" +"my_set_callback(PyObject *dummy, PyObject *args)\n" +"{\n" +" PyObject *result = NULL;\n" +" PyObject *temp;\n" +"\n" +" if (PyArg_ParseTuple(args, \"O:set_callback\", &temp)) {\n" +" if (!PyCallable_Check(temp)) {\n" +" PyErr_SetString(PyExc_TypeError, \"parameter must be callable\");\n" +" return NULL;\n" +" }\n" +" Py_XINCREF(temp); /* 添加一个指向新回调的引用 */\n" +" Py_XDECREF(my_callback); /* 丢弃之前的回调 */\n" +" my_callback = temp; /* 记住新的回调 */\n" +" /* 返回 \"None\" 的样例 */\n" +" Py_INCREF(Py_None);\n" +" result = Py_None;\n" +" }\n" +" return result;\n" +"}" + +#: ../../extending/extending.rst:581 +msgid "" +"This function must be registered with the interpreter using the " +":c:macro:`METH_VARARGS` flag; this is described in section " +":ref:`methodtable`. The :c:func:`PyArg_ParseTuple` function and its " +"arguments are documented in section :ref:`parsetuple`." +msgstr "" +"此函数必须使用 :c:macro:`METH_VARARGS` 旗标注册到解释器;这将在 :ref:`methodtable` 一节中详细描述。 " +":c:func:`PyArg_ParseTuple` 函数及其参数的文档见 :ref:`parsetuple` 一节。" + +#: ../../extending/extending.rst:586 +msgid "" +"The macros :c:func:`Py_XINCREF` and :c:func:`Py_XDECREF` increment/decrement" +" the reference count of an object and are safe in the presence of ``NULL`` " +"pointers (but note that *temp* will not be ``NULL`` in this context). More" +" info on them in section :ref:`refcounts`." +msgstr "" +":c:func:`Py_XINCREF` 和 :c:func:`Py_XDECREF` 这两个宏可增加/减少一个对象的引用计数,并且当存在 " +"``NULL`` 指针时仍可保证安全 (但请注意在这个上下文中 *temp* 将不为 ``NULL``)。更多相关信息请参考 " +":ref:`refcounts` 章节。" + +#: ../../extending/extending.rst:593 +msgid "" +"Later, when it is time to call the function, you call the C function " +":c:func:`PyObject_CallObject`. This function has two arguments, both " +"pointers to arbitrary Python objects: the Python function, and the argument " +"list. The argument list must always be a tuple object, whose length is the " +"number of arguments. To call the Python function with no arguments, pass in" +" ``NULL``, or an empty tuple; to call it with one argument, pass a singleton" +" tuple. :c:func:`Py_BuildValue` returns a tuple when its format string " +"consists of zero or more format codes between parentheses. For example::" +msgstr "" +"随后,当要调用此函数时,你将调用 C 函数 :c:func:`PyObject_CallObject`。该函数有两个参数,它们都属于指针,指向任意 " +"Python 对象:即 Python 函数,及其参数列表。参数列表必须总是一个元组对象,其长度即参数的个数。要不带参数地调用 Python 函数,则传入" +" ``NULL`` 或一个空元组;要带一个参数调用它,则传入一个单元组。 :c:func:`Py_BuildValue` " +"会在其格式字符串包含一对圆括号内的零个或多个格式代码时返回一个元组。例如::" + +#: ../../extending/extending.rst:602 +msgid "" +"int arg;\n" +"PyObject *arglist;\n" +"PyObject *result;\n" +"...\n" +"arg = 123;\n" +"...\n" +"/* Time to call the callback */\n" +"arglist = Py_BuildValue(\"(i)\", arg);\n" +"result = PyObject_CallObject(my_callback, arglist);\n" +"Py_DECREF(arglist);" +msgstr "" +"int arg;\n" +"PyObject *arglist;\n" +"PyObject *result;\n" +"...\n" +"arg = 123;\n" +"...\n" +"/* 此时将调用回调 */\n" +"arglist = Py_BuildValue(\"(i)\", arg);\n" +"result = PyObject_CallObject(my_callback, arglist);\n" +"Py_DECREF(arglist);" + +#: ../../extending/extending.rst:613 +msgid "" +":c:func:`PyObject_CallObject` returns a Python object pointer: this is the " +"return value of the Python function. :c:func:`PyObject_CallObject` is " +"\"reference-count-neutral\" with respect to its arguments. In the example a" +" new tuple was created to serve as the argument list, which is " +":c:func:`Py_DECREF`\\ -ed immediately after the " +":c:func:`PyObject_CallObject` call." +msgstr "" +":c:func:`PyObject_CallObject` 返回 Python 对象指针,这也是 Python 函数的返回值。 " +":c:func:`PyObject_CallObject` 是一个对其参数 \"引用计数无关\" 的函数。例子中新的元组创建用于参数列表,并且在 " +":c:func:`PyObject_CallObject` 之后立即使用了 :c:func:`Py_DECREF`。" + +#: ../../extending/extending.rst:620 +msgid "" +"The return value of :c:func:`PyObject_CallObject` is \"new\": either it is a" +" brand new object, or it is an existing object whose reference count has " +"been incremented. So, unless you want to save it in a global variable, you " +"should somehow :c:func:`Py_DECREF` the result, even (especially!) if you are" +" not interested in its value." +msgstr "" +":c:func:`PyObject_CallObject` " +"的返回值总是“新”的:要么是一个新建的对象;要么是已有对象,但增加了引用计数。所以除非你想把结果保存在全局变量中,你需要对这个值使用 " +":c:func:`Py_DECREF`,即使你对里面的内容(特别!)不感兴趣。" + +#: ../../extending/extending.rst:626 +msgid "" +"Before you do this, however, it is important to check that the return value " +"isn't ``NULL``. If it is, the Python function terminated by raising an " +"exception. If the C code that called :c:func:`PyObject_CallObject` is called" +" from Python, it should now return an error indication to its Python caller," +" so the interpreter can print a stack trace, or the calling Python code can " +"handle the exception. If this is not possible or desirable, the exception " +"should be cleared by calling :c:func:`PyErr_Clear`. For example::" +msgstr "" +"但是在你这么做之前,很重要的一点是检查返回值不是 ``NULL``。如果是的话,Python 函数会终止并引发异常。如果调用 " +":c:func:`PyObject_CallObject` 的 C 代码是在 Python 中唤起的,它应当立即返回一个错误来告知其 Python " +"调用者,以便解释器能打印栈回溯信息,或者让调用方 Python 代码能处理该异常。如果这无法做到或不合本意,则应当通过调用 " +":c:func:`PyErr_Clear` 来清除异常。例如::" + +#: ../../extending/extending.rst:634 +msgid "" +"if (result == NULL)\n" +" return NULL; /* Pass error back */\n" +"...use result...\n" +"Py_DECREF(result);" +msgstr "" +"if (result == NULL)\n" +" return NULL; /* 回传错误 */\n" +"...使用 result...\n" +"Py_DECREF(result);" + +#: ../../extending/extending.rst:639 +msgid "" +"Depending on the desired interface to the Python callback function, you may " +"also have to provide an argument list to :c:func:`PyObject_CallObject`. In " +"some cases the argument list is also provided by the Python program, through" +" the same interface that specified the callback function. It can then be " +"saved and used in the same manner as the function object. In other cases, " +"you may have to construct a new tuple to pass as the argument list. The " +"simplest way to do this is to call :c:func:`Py_BuildValue`. For example, if" +" you want to pass an integral event code, you might use the following code::" +msgstr "" +"依赖于具体的回调函数,你还要提供一个参数列表到 :c:func:`PyObject_CallObject` 。在某些情况下参数列表是由 Python " +"程序提供的,通过接口再传到回调函数对象。这样就可以不改变形式直接传递。另外一些时候你要构造一个新的元组来传递参数。最简单的方法就是 " +":c:func:`Py_BuildValue` 函数构造 tuple。举个例子,你要传递一个事件代码时可以用如下代码:" + +#: ../../extending/extending.rst:648 +msgid "" +"PyObject *arglist;\n" +"...\n" +"arglist = Py_BuildValue(\"(l)\", eventcode);\n" +"result = PyObject_CallObject(my_callback, arglist);\n" +"Py_DECREF(arglist);\n" +"if (result == NULL)\n" +" return NULL; /* Pass error back */\n" +"/* Here maybe use the result */\n" +"Py_DECREF(result);" +msgstr "" +"PyObject *arglist;\n" +"...\n" +"arglist = Py_BuildValue(\"(l)\", eventcode);\n" +"result = PyObject_CallObject(my_callback, arglist);\n" +"Py_DECREF(arglist);\n" +"if (result == NULL)\n" +" return NULL; /* Pass error back */\n" +"/* 可以在此使用 result */\n" +"Py_DECREF(result);" + +#: ../../extending/extending.rst:658 +msgid "" +"Note the placement of ``Py_DECREF(arglist)`` immediately after the call, " +"before the error check! Also note that strictly speaking this code is not " +"complete: :c:func:`Py_BuildValue` may run out of memory, and this should be " +"checked." +msgstr "" +"注意 ``Py_DECREF(arglist)`` 所在处会立即调用,在错误检查之前。当然还要注意一些常规的错误,比如 " +":c:func:`Py_BuildValue` 可能会遭遇内存不足等等。" + +#: ../../extending/extending.rst:662 +msgid "" +"You may also call a function with keyword arguments by using " +":c:func:`PyObject_Call`, which supports arguments and keyword arguments. As" +" in the above example, we use :c:func:`Py_BuildValue` to construct the " +"dictionary. ::" +msgstr "" +"当你调用函数时还需要注意,用关键字参数调用 :c:func:`PyObject_Call`,需要支持普通参数和关键字参数。有如如上例子中,我们使用 " +":c:func:`Py_BuildValue` 来构造字典。" + +#: ../../extending/extending.rst:666 +msgid "" +"PyObject *dict;\n" +"...\n" +"dict = Py_BuildValue(\"{s:i}\", \"name\", val);\n" +"result = PyObject_Call(my_callback, NULL, dict);\n" +"Py_DECREF(dict);\n" +"if (result == NULL)\n" +" return NULL; /* Pass error back */\n" +"/* Here maybe use the result */\n" +"Py_DECREF(result);" +msgstr "" +"PyObject *dict;\n" +"...\n" +"dict = Py_BuildValue(\"{s:i}\", \"name\", val);\n" +"result = PyObject_Call(my_callback, NULL, dict);\n" +"Py_DECREF(dict);\n" +"if (result == NULL)\n" +" return NULL; /* 回传错误 */\n" +"/* 可以在此使用 result */\n" +"Py_DECREF(result);" + +#: ../../extending/extending.rst:680 +msgid "Extracting Parameters in Extension Functions" +msgstr "提取扩展函数的参数" + +#: ../../extending/extending.rst:684 +msgid "The :c:func:`PyArg_ParseTuple` function is declared as follows::" +msgstr "函数 :c:func:`PyArg_ParseTuple` 的声明如下:" + +#: ../../extending/extending.rst:686 +msgid "int PyArg_ParseTuple(PyObject *arg, const char *format, ...);" +msgstr "int PyArg_ParseTuple(PyObject *arg, const char *format, ...);" + +#: ../../extending/extending.rst:688 +msgid "" +"The *arg* argument must be a tuple object containing an argument list passed" +" from Python to a C function. The *format* argument must be a format " +"string, whose syntax is explained in :ref:`arg-parsing` in the Python/C API " +"Reference Manual. The remaining arguments must be addresses of variables " +"whose type is determined by the format string." +msgstr "" +"参数 *arg* 必须是一个元组对象,包含从 Python 传递给 C 函数的参数列表。*format* 参数必须是一个格式字符串,语法请参考 " +"Python C/API 手册中的 :ref:`arg-parsing`。剩余参数是各个变量的地址,类型要与格式字符串对应。" + +#: ../../extending/extending.rst:694 +msgid "" +"Note that while :c:func:`PyArg_ParseTuple` checks that the Python arguments " +"have the required types, it cannot check the validity of the addresses of C " +"variables passed to the call: if you make mistakes there, your code will " +"probably crash or at least overwrite random bits in memory. So be careful!" +msgstr "" +"注意 :c:func:`PyArg_ParseTuple` 会检测他需要的 Python 参数类型,却无法检测传递给他的 C " +"变量地址,如果这里出错了,可能会在内存中随机写入东西,小心。" + +#: ../../extending/extending.rst:699 +msgid "" +"Note that any Python object references which are provided to the caller are " +"*borrowed* references; do not decrement their reference count!" +msgstr "注意任何由调用者提供的 Python 对象引用是 *借来的* 引用;不要递减它们的引用计数!" + +#: ../../extending/extending.rst:702 +msgid "Some example calls::" +msgstr "一些调用的例子:" + +#: ../../extending/extending.rst:709 +msgid "" +"int ok;\n" +"int i, j;\n" +"long k, l;\n" +"const char *s;\n" +"Py_ssize_t size;\n" +"\n" +"ok = PyArg_ParseTuple(args, \"\"); /* No arguments */\n" +" /* Python call: f() */" +msgstr "" +"int ok;\n" +"int i, j;\n" +"long k, l;\n" +"const char *s;\n" +"Py_ssize_t size;\n" +"\n" +"ok = PyArg_ParseTuple(args, \"\"); /* 无参数 */\n" +" /* Python 调用:f() */" + +#: ../../extending/extending.rst:720 +msgid "" +"ok = PyArg_ParseTuple(args, \"s\", &s); /* A string */\n" +" /* Possible Python call: f('whoops!') */" +msgstr "" +"ok = PyArg_ParseTuple(args, \"s\", &s); /* 一个字符串 */\n" +" /* 可能的 Python 调用:f('whoops!') */" + +#: ../../extending/extending.rst:725 +msgid "" +"ok = PyArg_ParseTuple(args, \"lls\", &k, &l, &s); /* Two longs and a string */\n" +" /* Possible Python call: f(1, 2, 'three') */" +msgstr "" +"ok = PyArg_ParseTuple(args, \"lls\", &k, &l, &s); /* 两个长整型和一个字符串 */\n" +" /* 可能的 Python 调用:f(1, 2, 'three') */" + +#: ../../extending/extending.rst:730 +msgid "" +"ok = PyArg_ParseTuple(args, \"(ii)s#\", &i, &j, &s, &size);\n" +" /* A pair of ints and a string, whose size is also returned */\n" +" /* Possible Python call: f((1, 2), 'three') */" +msgstr "" +"ok = PyArg_ParseTuple(args, \"(ii)s#\", &i, &j, &s, &size);\n" +" /* 一对整数和一个字符串,其大小也将被返回 */\n" +" /* 可能的 Python 调用:f((1, 2), 'three') */" + +#: ../../extending/extending.rst:736 +msgid "" +"{\n" +" const char *file;\n" +" const char *mode = \"r\";\n" +" int bufsize = 0;\n" +" ok = PyArg_ParseTuple(args, \"s|si\", &file, &mode, &bufsize);\n" +" /* A string, and optionally another string and an integer */\n" +" /* Possible Python calls:\n" +" f('spam')\n" +" f('spam', 'w')\n" +" f('spam', 'wb', 100000) */\n" +"}" +msgstr "" +"{\n" +" const char *file;\n" +" const char *mode = \"r\";\n" +" int bufsize = 0;\n" +" ok = PyArg_ParseTuple(args, \"s|si\", &file, &mode, &bufsize);\n" +" /* 一个字符串,并可选择传入另一个字符串和一个整数 */\n" +" /* 可能的 Python 调用:\n" +" f('spam')\n" +" f('spam', 'w')\n" +" f('spam', 'wb', 100000) */\n" +"}" + +#: ../../extending/extending.rst:750 +msgid "" +"{\n" +" int left, top, right, bottom, h, v;\n" +" ok = PyArg_ParseTuple(args, \"((ii)(ii))(ii)\",\n" +" &left, &top, &right, &bottom, &h, &v);\n" +" /* A rectangle and a point */\n" +" /* Possible Python call:\n" +" f(((0, 0), (400, 300)), (10, 10)) */\n" +"}" +msgstr "" +"{\n" +" int left, top, right, bottom, h, v;\n" +" ok = PyArg_ParseTuple(args, \"((ii)(ii))(ii)\",\n" +" &left, &top, &right, &bottom, &h, &v);\n" +" /* 一个矩形和一个点 */\n" +" /* 可能的 Python 调用:\n" +" f(((0, 0), (400, 300)), (10, 10)) */\n" +"}" + +#: ../../extending/extending.rst:761 +msgid "" +"{\n" +" Py_complex c;\n" +" ok = PyArg_ParseTuple(args, \"D:myfunction\", &c);\n" +" /* a complex, also providing a function name for errors */\n" +" /* Possible Python call: myfunction(1+2j) */\n" +"}" +msgstr "" +"{\n" +" Py_complex c;\n" +" ok = PyArg_ParseTuple(args, \"D:myfunction\", &c);\n" +" /* 一个复数,并提供一个函数名用于错误处理 */\n" +" /* 可能的 Python 调用:myfunction(1+2j) */\n" +"}" + +#: ../../extending/extending.rst:772 +msgid "Keyword Parameters for Extension Functions" +msgstr "给扩展函数的关键字参数" + +#: ../../extending/extending.rst:776 +msgid "" +"The :c:func:`PyArg_ParseTupleAndKeywords` function is declared as follows::" +msgstr "函数 :c:func:`PyArg_ParseTupleAndKeywords` 声明如下:" + +#: ../../extending/extending.rst:778 +msgid "" +"int PyArg_ParseTupleAndKeywords(PyObject *arg, PyObject *kwdict,\n" +" const char *format, char * const *kwlist, ...);" +msgstr "" +"int PyArg_ParseTupleAndKeywords(PyObject *arg, PyObject *kwdict,\n" +" const char *format, char * const *kwlist, ...);" + +#: ../../extending/extending.rst:781 +msgid "" +"The *arg* and *format* parameters are identical to those of the " +":c:func:`PyArg_ParseTuple` function. The *kwdict* parameter is the " +"dictionary of keywords received as the third parameter from the Python " +"runtime. The *kwlist* parameter is a ``NULL``-terminated list of strings " +"which identify the parameters; the names are matched with the type " +"information from *format* from left to right. On success, " +":c:func:`PyArg_ParseTupleAndKeywords` returns true, otherwise it returns " +"false and raises an appropriate exception." +msgstr "" +"*arg* 与 *format* 形参与 :c:func:`PyArg_ParseTuple` 函数所定义的一致。 *kwdict* " +"形参是作为第三个参数从 Python 运行时接收的关键字字典。 *kwlist* 形参是以 ``NULL`` " +"结尾的字符串列表,它被用来标识形参;名称从左至右与来自 *format* 的类型信息相匹配。 " +"如果执行成功,:c:func:`PyArg_ParseTupleAndKeywords` 会返回真值,否则返回假值并引发一个适当的异常。" + +#: ../../extending/extending.rst:791 +msgid "" +"Nested tuples cannot be parsed when using keyword arguments! Keyword " +"parameters passed in which are not present in the *kwlist* will cause " +":exc:`TypeError` to be raised." +msgstr "嵌套的元组在使用关键字参数时无法生效,不在 *kwlist* 中的关键字参数会导致 :exc:`TypeError` 异常。" + +#: ../../extending/extending.rst:797 +msgid "" +"Here is an example module which uses keywords, based on an example by Geoff " +"Philbrick (philbrick@hks.com)::" +msgstr "如下例子是使用关键字参数的例子模块,作者是 Geoff Philbrick (philbrick@hks.com):" + +#: ../../extending/extending.rst:800 +msgid "" +"#define PY_SSIZE_T_CLEAN\n" +"#include \n" +"\n" +"static PyObject *\n" +"keywdarg_parrot(PyObject *self, PyObject *args, PyObject *keywds)\n" +"{\n" +" int voltage;\n" +" const char *state = \"a stiff\";\n" +" const char *action = \"voom\";\n" +" const char *type = \"Norwegian Blue\";\n" +"\n" +" static char *kwlist[] = {\"voltage\", \"state\", \"action\", \"type\", NULL};\n" +"\n" +" if (!PyArg_ParseTupleAndKeywords(args, keywds, \"i|sss\", kwlist,\n" +" &voltage, &state, &action, &type))\n" +" return NULL;\n" +"\n" +" printf(\"-- This parrot wouldn't %s if you put %i Volts through it.\\n\",\n" +" action, voltage);\n" +" printf(\"-- Lovely plumage, the %s -- It's %s!\\n\", type, state);\n" +"\n" +" Py_RETURN_NONE;\n" +"}\n" +"\n" +"static PyMethodDef keywdarg_methods[] = {\n" +" /* The cast of the function is necessary since PyCFunction values\n" +" * only take two PyObject* parameters, and keywdarg_parrot() takes\n" +" * three.\n" +" */\n" +" {\"parrot\", (PyCFunction)(void(*)(void))keywdarg_parrot, METH_VARARGS | METH_KEYWORDS,\n" +" \"Print a lovely skit to standard output.\"},\n" +" {NULL, NULL, 0, NULL} /* sentinel */\n" +"};\n" +"\n" +"static struct PyModuleDef keywdarg_module = {\n" +" .m_base = PyModuleDef_HEAD_INIT,\n" +" .m_name = \"keywdarg\",\n" +" .m_size = 0,\n" +" .m_methods = keywdarg_methods,\n" +"};\n" +"\n" +"PyMODINIT_FUNC\n" +"PyInit_keywdarg(void)\n" +"{\n" +" return PyModuleDef_Init(&keywdarg_module);\n" +"}" +msgstr "" +"#define PY_SSIZE_T_CLEAN\n" +"#include \n" +"\n" +"static PyObject *\n" +"keywdarg_parrot(PyObject *self, PyObject *args, PyObject *keywds)\n" +"{\n" +" int voltage;\n" +" const char *state = \"a stiff\";\n" +" const char *action = \"voom\";\n" +" const char *type = \"Norwegian Blue\";\n" +"\n" +" static char *kwlist[] = {\"voltage\", \"state\", \"action\", \"type\", NULL};\n" +"\n" +" if (!PyArg_ParseTupleAndKeywords(args, keywds, \"i|sss\", kwlist,\n" +" &voltage, &state, &action, &type))\n" +" return NULL;\n" +"\n" +" printf(\"-- This parrot wouldn't %s if you put %i Volts through it.\\n\",\n" +" action, voltage);\n" +" printf(\"-- Lovely plumage, the %s -- It's %s!\\n\", type, state);\n" +"\n" +" Py_RETURN_NONE;\n" +"}\n" +"\n" +"static PyMethodDef keywdarg_methods[] = {\n" +" /* 函数的转换是必要的因为 PyCFunction 值\n" +" * 仅接受两个 PyObject* 形参,而 keywdarg_parrot()\n" +" * 接受三个。\n" +" */\n" +" {\"parrot\", (PyCFunction)(void(*)(void))keywdarg_parrot, METH_VARARGS | METH_KEYWORDS,\n" +" \"Print a lovely skit to standard output.\"},\n" +" {NULL, NULL, 0, NULL} /* sentinel */\n" +"};\n" +"\n" +"static struct PyModuleDef keywdarg_module = {\n" +" .m_base = PyModuleDef_HEAD_INIT,\n" +" .m_name = \"keywdarg\",\n" +" .m_size = 0,\n" +" .m_methods = keywdarg_methods,\n" +"};\n" +"\n" +"PyMODINIT_FUNC\n" +"PyInit_keywdarg(void)\n" +"{\n" +" return PyModuleDef_Init(&keywdarg_module);\n" +"}" + +#: ../../extending/extending.rst:851 +msgid "Building Arbitrary Values" +msgstr "构造任意值" + +#: ../../extending/extending.rst:853 +msgid "" +"This function is the counterpart to :c:func:`PyArg_ParseTuple`. It is " +"declared as follows::" +msgstr "这个函数与 :c:func:`PyArg_ParseTuple` 很相似,声明如下:" + +#: ../../extending/extending.rst:856 +msgid "PyObject *Py_BuildValue(const char *format, ...);" +msgstr "PyObject *Py_BuildValue(const char *format, ...);" + +#: ../../extending/extending.rst:858 +msgid "" +"It recognizes a set of format units similar to the ones recognized by " +":c:func:`PyArg_ParseTuple`, but the arguments (which are input to the " +"function, not output) must not be pointers, just values. It returns a new " +"Python object, suitable for returning from a C function called from Python." +msgstr "" +"它接受一系列与 :c:func:`PyArg_ParseTuple` " +"所识别的格式单元类似的格式单元,但其参数(作为函数的输入而非输出)不能是指针,而必须是值。它返回一个新的 Python 对象,适合于从被 Python " +"调用的 C 函数返回。" + +#: ../../extending/extending.rst:863 +msgid "" +"One difference with :c:func:`PyArg_ParseTuple`: while the latter requires " +"its first argument to be a tuple (since Python argument lists are always " +"represented as tuples internally), :c:func:`Py_BuildValue` does not always " +"build a tuple. It builds a tuple only if its format string contains two or " +"more format units. If the format string is empty, it returns ``None``; if it" +" contains exactly one format unit, it returns whatever object is described " +"by that format unit. To force it to return a tuple of size 0 or one, " +"parenthesize the format string." +msgstr "" +"一个与 :c:func:`PyArg_ParseTuple` 的不同是,后者要求其第一个参数为元组(因为 Python " +"参数列表在内部总是表示为元组),:c:func:`Py_BuildValue` " +"并不总是生成元组。它只在格式字符串包含两个或更多格式单元时才生成元组。如果格式字符串为空则返回 ``None`` " +";如果仅包含一个格式单元则返回该格式单元所描述的对象。如果要强制生成一个长度为 0 或 1 的元组,需要在格式字符串中加上括号。" + +#: ../../extending/extending.rst:871 +msgid "" +"Examples (to the left the call, to the right the resulting Python value):" +msgstr "例子 (左侧是调用,右侧是 Python 值结果):" + +#: ../../extending/extending.rst:873 +msgid "" +"Py_BuildValue(\"\") None\n" +"Py_BuildValue(\"i\", 123) 123\n" +"Py_BuildValue(\"iii\", 123, 456, 789) (123, 456, 789)\n" +"Py_BuildValue(\"s\", \"hello\") 'hello'\n" +"Py_BuildValue(\"y\", \"hello\") b'hello'\n" +"Py_BuildValue(\"ss\", \"hello\", \"world\") ('hello', 'world')\n" +"Py_BuildValue(\"s#\", \"hello\", 4) 'hell'\n" +"Py_BuildValue(\"y#\", \"hello\", 4) b'hell'\n" +"Py_BuildValue(\"()\") ()\n" +"Py_BuildValue(\"(i)\", 123) (123,)\n" +"Py_BuildValue(\"(ii)\", 123, 456) (123, 456)\n" +"Py_BuildValue(\"(i,i)\", 123, 456) (123, 456)\n" +"Py_BuildValue(\"[i,i]\", 123, 456) [123, 456]\n" +"Py_BuildValue(\"{s:i,s:i}\",\n" +" \"abc\", 123, \"def\", 456) {'abc': 123, 'def': 456}\n" +"Py_BuildValue(\"((ii)(ii)) (ii)\",\n" +" 1, 2, 3, 4, 5, 6) (((1, 2), (3, 4)), (5, 6))" +msgstr "" +"Py_BuildValue(\"\") None\n" +"Py_BuildValue(\"i\", 123) 123\n" +"Py_BuildValue(\"iii\", 123, 456, 789) (123, 456, 789)\n" +"Py_BuildValue(\"s\", \"hello\") 'hello'\n" +"Py_BuildValue(\"y\", \"hello\") b'hello'\n" +"Py_BuildValue(\"ss\", \"hello\", \"world\") ('hello', 'world')\n" +"Py_BuildValue(\"s#\", \"hello\", 4) 'hell'\n" +"Py_BuildValue(\"y#\", \"hello\", 4) b'hell'\n" +"Py_BuildValue(\"()\") ()\n" +"Py_BuildValue(\"(i)\", 123) (123,)\n" +"Py_BuildValue(\"(ii)\", 123, 456) (123, 456)\n" +"Py_BuildValue(\"(i,i)\", 123, 456) (123, 456)\n" +"Py_BuildValue(\"[i,i]\", 123, 456) [123, 456]\n" +"Py_BuildValue(\"{s:i,s:i}\",\n" +" \"abc\", 123, \"def\", 456) {'abc': 123, 'def': 456}\n" +"Py_BuildValue(\"((ii)(ii)) (ii)\",\n" +" 1, 2, 3, 4, 5, 6) (((1, 2), (3, 4)), (5, 6))" + +#: ../../extending/extending.rst:897 +msgid "Reference Counts" +msgstr "引用计数" + +#: ../../extending/extending.rst:899 +msgid "" +"In languages like C or C++, the programmer is responsible for dynamic " +"allocation and deallocation of memory on the heap. In C, this is done using" +" the functions :c:func:`malloc` and :c:func:`free`. In C++, the operators " +"``new`` and ``delete`` are used with essentially the same meaning and we'll " +"restrict the following discussion to the C case." +msgstr "" +"在 C/C++ 语言中,程序员负责动态分配和回收堆 heap 当中的内存。在 C 里,通过函数 :c:func:`malloc` 和 " +":c:func:`free` 来完成。在 C++ 里是操作 ``new`` 和 ``delete`` 来实现相同的功能。" + +#: ../../extending/extending.rst:905 +msgid "" +"Every block of memory allocated with :c:func:`malloc` should eventually be " +"returned to the pool of available memory by exactly one call to " +":c:func:`free`. It is important to call :c:func:`free` at the right time. " +"If a block's address is forgotten but :c:func:`free` is not called for it, " +"the memory it occupies cannot be reused until the program terminates. This " +"is called a :dfn:`memory leak`. On the other hand, if a program calls " +":c:func:`free` for a block and then continues to use the block, it creates a" +" conflict with reuse of the block through another :c:func:`malloc` call. " +"This is called :dfn:`using freed memory`. It has the same bad consequences " +"as referencing uninitialized data --- core dumps, wrong results, mysterious " +"crashes." +msgstr "" +"每个使用 :c:func:`malloc` 分配的内存块最终都应当通过恰好一次对 :c:func:`free` 的调用返回到可用内存池中。调用 " +":c:func:`free` 的时机非常重要。如果一个块地址被遗忘而没有为它执行 :c:func:`free` " +"调用,它所占用的内存在程序终结之前将无法被重新使用。这就称为 :dfn:`内存泄漏`。另一方面,如果程序为一个块地址调用了 :c:func:`free`" +" 然后却继续使用该内存块,它将与通过另一个 :c:func:`malloc` 调用对该内存块的重新使用产生冲突。这就称为 " +":dfn:`使用已释放的内存`。它所造成的后果与引用未初始化数据一样糟糕 --- 核心转储、错误结果、意外崩溃等等。" + +#: ../../extending/extending.rst:916 +msgid "" +"Common causes of memory leaks are unusual paths through the code. For " +"instance, a function may allocate a block of memory, do some calculation, " +"and then free the block again. Now a change in the requirements for the " +"function may add a test to the calculation that detects an error condition " +"and can return prematurely from the function. It's easy to forget to free " +"the allocated memory block when taking this premature exit, especially when " +"it is added later to the code. Such leaks, once introduced, often go " +"undetected for a long time: the error exit is taken only in a small fraction" +" of all calls, and most modern machines have plenty of virtual memory, so " +"the leak only becomes apparent in a long-running process that uses the " +"leaking function frequently. Therefore, it's important to prevent leaks " +"from happening by having a coding convention or strategy that minimizes this" +" kind of errors." +msgstr "" +"内存泄露往往发生在一些并不常见的代码流程上面。比如一个函数申请了内存以后,做了些计算,然后释放内存块。现在一些对函数的修改可能增加对计算的测试并检测错误条件,然后过早的从函数返回了。这很容易忘记在退出前释放内存,特别是后期修改的代码。这种内存泄漏,一旦引入,通常很长时间都难以检测到,错误退出被调用的频度较低,而现代电脑又有非常巨大的虚拟内存,所以泄漏仅在长期运行或频繁调用泄漏函数时才会变得明显。因此,有必要避免内存泄漏,通过代码规范会策略来最小化此类错误。" + +#: ../../extending/extending.rst:929 +msgid "" +"Since Python makes heavy use of :c:func:`malloc` and :c:func:`free`, it " +"needs a strategy to avoid memory leaks as well as the use of freed memory. " +"The chosen method is called :dfn:`reference counting`. The principle is " +"simple: every object contains a counter, which is incremented when a " +"reference to the object is stored somewhere, and which is decremented when a" +" reference to it is deleted. When the counter reaches zero, the last " +"reference to the object has been deleted and the object is freed." +msgstr "" +"Python 通过 :c:func:`malloc` 和 :c:func:`free` " +"包含大量的内存分配和释放,同样需要避免内存泄漏和野指针。他选择的方法就是 :dfn:`引用计数` " +"。其原理比较简单:每个对象都包含一个计数器,计数器的增减与对象引用的增减直接相关,当引用计数为 0 时,表示对象已经没有存在的意义了,对象就可以删除了。" + +#: ../../extending/extending.rst:937 +msgid "" +"An alternative strategy is called :dfn:`automatic garbage collection`. " +"(Sometimes, reference counting is also referred to as a garbage collection " +"strategy, hence the use of \"automatic\" to distinguish the two.) The big " +"advantage of automatic garbage collection is that the user doesn't need to " +"call :c:func:`free` explicitly. (Another claimed advantage is an " +"improvement in speed or memory usage --- this is no hard fact however.) The" +" disadvantage is that for C, there is no truly portable automatic garbage " +"collector, while reference counting can be implemented portably (as long as " +"the functions :c:func:`malloc` and :c:func:`free` are available --- which " +"the C Standard guarantees). Maybe some day a sufficiently portable automatic" +" garbage collector will be available for C. Until then, we'll have to live " +"with reference counts." +msgstr "" + +#: ../../extending/extending.rst:949 +msgid "" +"While Python uses the traditional reference counting implementation, it also" +" offers a cycle detector that works to detect reference cycles. This allows" +" applications to not worry about creating direct or indirect circular " +"references; these are the weakness of garbage collection implemented using " +"only reference counting. Reference cycles consist of objects which contain " +"(possibly indirect) references to themselves, so that each object in the " +"cycle has a reference count which is non-zero. Typical reference counting " +"implementations are not able to reclaim the memory belonging to any objects " +"in a reference cycle, or referenced from the objects in the cycle, even " +"though there are no further references to the cycle itself." +msgstr "" +"Python " +"使用传统的引用计数实现,也提供了循环监测器,用以检测引用循环。这使得应用无需担心直接或间接的创建了循环引用,这是引用计数垃圾收集的一个弱点。引用循环是对象" +" (可能直接) 的引用了本身,所以循环中的每个对象的引用计数都不是 " +"0。典型的引用计数实现无法回收处于引用循环中的对象,或者被循环所引用的对象,哪怕没有循环以外的引用了。" + +#: ../../extending/extending.rst:960 +msgid "" +"The cycle detector is able to detect garbage cycles and can reclaim them. " +"The :mod:`gc` module exposes a way to run the detector (the " +":func:`~gc.collect` function), as well as configuration interfaces and the " +"ability to disable the detector at runtime." +msgstr "" +"循环检测器能够检测垃圾回收循环并能回收它们。 :mod:`gc` 模块提供了一种运行该检测器的方式 (:func:`~gc.collect` " +"函数),以及多个配置接口和在运行时禁用该检测器的功能。" + +#: ../../extending/extending.rst:969 +msgid "Reference Counting in Python" +msgstr "Python 中的引用计数" + +#: ../../extending/extending.rst:971 +msgid "" +"There are two macros, ``Py_INCREF(x)`` and ``Py_DECREF(x)``, which handle " +"the incrementing and decrementing of the reference count. " +":c:func:`Py_DECREF` also frees the object when the count reaches zero. For " +"flexibility, it doesn't call :c:func:`free` directly --- rather, it makes a " +"call through a function pointer in the object's :dfn:`type object`. For " +"this purpose (and others), every object also contains a pointer to its type " +"object." +msgstr "" +"有两个宏 ``Py_INCREF(x)`` 和 ``Py_DECREF(x)``,会处理引用计数的增减。 :c:func:`Py_DECREF` " +"也会在引用计数到达 0 时释放对象。为了灵活,并不会直接调用 :c:func:`free`,而是通过对象的 :dfn:`类型对象` " +"的函数指针来调用。为了这个目的 (或其他的),每个对象同时包含一个指向自身类型对象的指针。" + +#: ../../extending/extending.rst:978 +msgid "" +"The big question now remains: when to use ``Py_INCREF(x)`` and " +"``Py_DECREF(x)``? Let's first introduce some terms. Nobody \"owns\" an " +"object; however, you can :dfn:`own a reference` to an object. An object's " +"reference count is now defined as the number of owned references to it. The" +" owner of a reference is responsible for calling :c:func:`Py_DECREF` when " +"the reference is no longer needed. Ownership of a reference can be " +"transferred. There are three ways to dispose of an owned reference: pass it" +" on, store it, or call :c:func:`Py_DECREF`. Forgetting to dispose of an " +"owned reference creates a memory leak." +msgstr "" +"最大的问题依旧:何时使用 ``Py_INCREF(x)`` 和 ``Py_DECREF(x)`` " +"?我们首先引入一些概念。没有人\"拥有\"一个对象,你可以 :dfn:`拥有一个引用` " +"到一个对象。一个对象的引用计数定义为拥有引用的数量。引用的拥有者有责任调用 :c:func:`Py_DECREF` " +",在引用不再需要时。引用的拥有关系可以被传递。有三种办法来处置拥有的引用:传递、存储、调用 :c:func:`Py_DECREF` " +"。忘记处置一个拥有的引用会导致内存泄漏。" + +#: ../../extending/extending.rst:987 +msgid "" +"It is also possible to :dfn:`borrow` [#]_ a reference to an object. The " +"borrower of a reference should not call :c:func:`Py_DECREF`. The borrower " +"must not hold on to the object longer than the owner from which it was " +"borrowed. Using a borrowed reference after the owner has disposed of it " +"risks using freed memory and should be avoided completely [#]_." +msgstr "" +"还可以 :dfn:`借用` [#]_ 一个对象的引用。借用的引用不应该调用 :c:func:`Py_DECREF` " +"。借用者必须确保不能持有对象超过拥有者借出的时间。在拥有者处置对象后使用借用的引用是有风险的,应该完全避免 [#]_。" + +#: ../../extending/extending.rst:993 +msgid "" +"The advantage of borrowing over owning a reference is that you don't need to" +" take care of disposing of the reference on all possible paths through the " +"code --- in other words, with a borrowed reference you don't run the risk of" +" leaking when a premature exit is taken. The disadvantage of borrowing over" +" owning is that there are some subtle situations where in seemingly correct " +"code a borrowed reference can be used after the owner from which it was " +"borrowed has in fact disposed of it." +msgstr "" +"借用相对于引用的优点是你无需担心整条路径上代码的引用,或者说,通过借用你无需担心内存泄漏的风险。借用的缺点是一些看起来正确代码上的借用可能会在拥有者处置后使用对象。" + +#: ../../extending/extending.rst:1001 +msgid "" +"A borrowed reference can be changed into an owned reference by calling " +":c:func:`Py_INCREF`. This does not affect the status of the owner from " +"which the reference was borrowed --- it creates a new owned reference, and " +"gives full owner responsibilities (the new owner must dispose of the " +"reference properly, as well as the previous owner)." +msgstr "" +"借用可以变为拥有引用,通过调用 :c:func:`Py_INCREF`。这不会影响已经借出的拥有者的状态。 " +"这会创建一个新的拥有引用,并给予完全的拥有者责任(新的拥有者必须恰当的处置引用,就像之前的拥有者那样)。" + +#: ../../extending/extending.rst:1011 +msgid "Ownership Rules" +msgstr "拥有规则" + +#: ../../extending/extending.rst:1013 +msgid "" +"Whenever an object reference is passed into or out of a function, it is part" +" of the function's interface specification whether ownership is transferred " +"with the reference or not." +msgstr "当一个对象引用传递进出一个函数时,函数的接口应该指定拥有关系的传递是否包含引用。" + +#: ../../extending/extending.rst:1017 +msgid "" +"Most functions that return a reference to an object pass on ownership with " +"the reference. In particular, all functions whose function it is to create " +"a new object, such as :c:func:`PyLong_FromLong` and :c:func:`Py_BuildValue`," +" pass ownership to the receiver. Even if the object is not actually new, " +"you still receive ownership of a new reference to that object. For " +"instance, :c:func:`PyLong_FromLong` maintains a cache of popular values and " +"can return a reference to a cached item." +msgstr "" +"大多数函数返回一个对象的引用,并传递引用拥有关系。通常,所有创建对象的函数,例如 :c:func:`PyLong_FromLong` 和 " +":c:func:`Py_BuildValue`,会传递拥有关系给接收者。即便是对象不是真正新的,你仍然可以获得对象的新引用。一个实例是 " +":c:func:`PyLong_FromLong` 维护了一个流行值的缓存,并可以返回已缓存项目的新引用。" + +#: ../../extending/extending.rst:1025 +msgid "" +"Many functions that extract objects from other objects also transfer " +"ownership with the reference, for instance :c:func:`PyObject_GetAttrString`." +" The picture is less clear, here, however, since a few common routines are " +"exceptions: :c:func:`PyTuple_GetItem`, :c:func:`PyList_GetItem`, " +":c:func:`PyDict_GetItem`, and :c:func:`PyDict_GetItemString` all return " +"references that you borrow from the tuple, list or dictionary." +msgstr "" +"很多另一个对象提取对象的函数,也会传递引用关系,例如 :c:func:`PyObject_GetAttrString` " +"。这里的情况不够清晰,一些不太常用的例程是例外的 :c:func:`PyTuple_GetItem`, :c:func:`PyList_GetItem`" +" , :c:func:`PyDict_GetItem` , :c:func:`PyDict_GetItemString` " +"都是返回从元组、列表、字典里借用的引用。" + +#: ../../extending/extending.rst:1032 +msgid "" +"The function :c:func:`PyImport_AddModule` also returns a borrowed reference," +" even though it may actually create the object it returns: this is possible " +"because an owned reference to the object is stored in ``sys.modules``." +msgstr "" +"函数 :c:func:`PyImport_AddModule` 也会返回借用的引用,哪怕可能会返回创建的对象:这个可能因为一个拥有的引用对象是存储在 " +"``sys.modules`` 里。" + +#: ../../extending/extending.rst:1036 +msgid "" +"When you pass an object reference into another function, in general, the " +"function borrows the reference from you --- if it needs to store it, it will" +" use :c:func:`Py_INCREF` to become an independent owner. There are exactly " +"two important exceptions to this rule: :c:func:`PyTuple_SetItem` and " +":c:func:`PyList_SetItem`. These functions take over ownership of the item " +"passed to them --- even if they fail! (Note that :c:func:`PyDict_SetItem` " +"and friends don't take over ownership --- they are \"normal.\")" +msgstr "" +"当你传递一个对象引用到另一个函数时,通常函数是借用出去的。如果需要存储,就使用 :c:func:`Py_INCREF` " +"来变成独立的拥有者。这个规则有两个重要的例外: :c:func:`PyTuple_SetItem` 和 :c:func:`PyList_SetItem`" +" 。这些函数接受传递来的引用关系,哪怕会失败!(注意 :c:func:`PyDict_SetItem` " +"及其同类不会接受引用关系,他们是\"正常的\")。" + +#: ../../extending/extending.rst:1044 +msgid "" +"When a C function is called from Python, it borrows references to its " +"arguments from the caller. The caller owns a reference to the object, so " +"the borrowed reference's lifetime is guaranteed until the function returns." +" Only when such a borrowed reference must be stored or passed on, it must " +"be turned into an owned reference by calling :c:func:`Py_INCREF`." +msgstr "" +"当一个 C 函数被 Python " +"调用时,会从调用方传来的参数借用引用。调用者拥有对象的引用,所以借用的引用生命周期可以保证到函数返回。只要当借用的引用需要存储或传递时,就必须转换为拥有的引用,通过调用" +" :c:func:`Py_INCREF` ." + +#: ../../extending/extending.rst:1050 +msgid "" +"The object reference returned from a C function that is called from Python " +"must be an owned reference --- ownership is transferred from the function to" +" its caller." +msgstr "Python 调用从 C 函数返回的对象引用时必须是拥有的引用---拥有关系被从函数传递给调用者。" + +#: ../../extending/extending.rst:1058 +msgid "Thin Ice" +msgstr "危险的薄冰" + +#: ../../extending/extending.rst:1060 +msgid "" +"There are a few situations where seemingly harmless use of a borrowed " +"reference can lead to problems. These all have to do with implicit " +"invocations of the interpreter, which can cause the owner of a reference to " +"dispose of it." +msgstr "有少数情况下,借用的引用看起来无害,但却可能导致问题。这通常是因为解释器的隐式调用,并可能导致引用拥有者处置这个引用。" + +#: ../../extending/extending.rst:1064 +msgid "" +"The first and most important case to know about is using :c:func:`Py_DECREF`" +" on an unrelated object while borrowing a reference to a list item. For " +"instance::" +msgstr "首先需要特别注意的情况是使用 :c:func:`Py_DECREF` 到一个无关对象,而这个对象的引用是借用自一个列表的元素。举个实例:" + +#: ../../extending/extending.rst:1067 +msgid "" +"void\n" +"bug(PyObject *list)\n" +"{\n" +" PyObject *item = PyList_GetItem(list, 0);\n" +"\n" +" PyList_SetItem(list, 1, PyLong_FromLong(0L));\n" +" PyObject_Print(item, stdout, 0); /* BUG! */\n" +"}" +msgstr "" +"void\n" +"bug(PyObject *list)\n" +"{\n" +" PyObject *item = PyList_GetItem(list, 0);\n" +"\n" +" PyList_SetItem(list, 1, PyLong_FromLong(0L));\n" +" PyObject_Print(item, stdout, 0); /* BUG! */\n" +"}" + +#: ../../extending/extending.rst:1076 +msgid "" +"This function first borrows a reference to ``list[0]``, then replaces " +"``list[1]`` with the value ``0``, and finally prints the borrowed reference." +" Looks harmless, right? But it's not!" +msgstr "" +"这个函数首先借用一个引用 ``list[0]``,然后替换 ``list[1]`` 为值 ``0``,最后打印借用的引用。看起来无害是吧,但却不是。" + +#: ../../extending/extending.rst:1080 +msgid "" +"Let's follow the control flow into :c:func:`PyList_SetItem`. The list owns " +"references to all its items, so when item 1 is replaced, it has to dispose " +"of the original item 1. Now let's suppose the original item 1 was an " +"instance of a user-defined class, and let's further suppose that the class " +"defined a :meth:`!__del__` method. If this class instance has a reference " +"count of 1, disposing of it will call its :meth:`!__del__` method. " +"Internally, :c:func:`PyList_SetItem` calls :c:func:`Py_DECREF` on the " +"replaced item, which invokes replaced item's corresponding " +":c:member:`~PyTypeObject.tp_dealloc` function. During deallocation, " +":c:member:`~PyTypeObject.tp_dealloc` calls " +":c:member:`~PyTypeObject.tp_finalize`, which is mapped to the " +":meth:`!__del__` method for class instances (see :pep:`442`). This entire " +"sequence happens synchronously within the :c:func:`PyList_SetItem` call." +msgstr "" +"让我们跟随控制流进入 :c:func:`PyList_SetItem`。该列表拥有对其全部条目的引用,因此当条目 1 被替换时,它必须丢弃原来的条目 " +"1。现在让我们假定原来的条目 1 是某个用户自定义类的实例,并让我们假定该类定义了 :meth:`!__del__` 方法。如果该类实例的引用计数为 " +"1,丢弃它将会调用其 :meth:`!__del__` 方法。在内部,:c:func:`PyList_SetItem` 会调用被替换条目的 " +":c:func:`Py_DECREF`,这将唤起被替换条目的对应的 :c:member:`~PyTypeObject.tp_dealloc` 函数。 " +"在撤销分配期间,:c:member:`~PyTypeObject.tp_dealloc` 会调用 " +":c:member:`~PyTypeObject.tp_finalize`,它被映射到用于类实例的 :meth:`!__del__` 方法 (参见 " +":pep:`442`)。以上整个过程是在 :c:func:`PyList_SetItem` 调用内部同步发生的。" + +#: ../../extending/extending.rst:1094 +msgid "" +"Since it is written in Python, the :meth:`!__del__` method can execute " +"arbitrary Python code. Could it perhaps do something to invalidate the " +"reference to ``item`` in :c:func:`!bug`? You bet! Assuming that the list " +"passed into :c:func:`!bug` is accessible to the :meth:`!__del__` method, it " +"could execute a statement to the effect of ``del list[0]``, and assuming " +"this was the last reference to that object, it would free the memory " +"associated with it, thereby invalidating ``item``." +msgstr "" +"由于它是用 Python 编写的,因此 :meth:`!__del__` 方法可以执行任意 Python 代码。它是否可以使 " +":c:func:`!bug` 中对 ``item`` 的引用失效呢?当然可以!假定传入 :c:func:`!bug` 的列表可以被 " +":meth:`!__del__` 方法访问,它就可以执行一条语句实现 ``del list[0]`` " +"的效果,假定这是对该对象的最后一次引用,它就会释放与之相关联的内存,从而使 ``item`` 失效。" + +#: ../../extending/extending.rst:1102 +msgid "" +"The solution, once you know the source of the problem, is easy: temporarily " +"increment the reference count. The correct version of the function reads::" +msgstr "解决方法是,当你知道了问题的根源,就容易了:临时增加引用计数。正确版本的函数代码如下:" + +#: ../../extending/extending.rst:1105 +msgid "" +"void\n" +"no_bug(PyObject *list)\n" +"{\n" +" PyObject *item = PyList_GetItem(list, 0);\n" +"\n" +" Py_INCREF(item);\n" +" PyList_SetItem(list, 1, PyLong_FromLong(0L));\n" +" PyObject_Print(item, stdout, 0);\n" +" Py_DECREF(item);\n" +"}" +msgstr "" +"void\n" +"no_bug(PyObject *list)\n" +"{\n" +" PyObject *item = PyList_GetItem(list, 0);\n" +"\n" +" Py_INCREF(item);\n" +" PyList_SetItem(list, 1, PyLong_FromLong(0L));\n" +" PyObject_Print(item, stdout, 0);\n" +" Py_DECREF(item);\n" +"}" + +#: ../../extending/extending.rst:1116 +msgid "" +"This is a true story. An older version of Python contained variants of this" +" bug and someone spent a considerable amount of time in a C debugger to " +"figure out why his :meth:`!__del__` methods would fail..." +msgstr "" +"这是一个真实的故事。一个较旧版本的 Python 曾经包含此问题的变化形式,有人在 C 语言调试器中花费了大量时间,才弄明白为什么他的 " +":meth:`!__del__` 方法会失败……" + +#: ../../extending/extending.rst:1120 +msgid "" +"The second case of problems with a borrowed reference is a variant involving" +" threads. Normally, multiple threads in the Python interpreter can't get in" +" each other's way, because there is a :term:`global lock ` protecting Python's entire object space. However, it is possible to " +"temporarily release this lock using the macro " +":c:macro:`Py_BEGIN_ALLOW_THREADS`, and to re-acquire it using " +":c:macro:`Py_END_ALLOW_THREADS`. This is common around blocking I/O calls, " +"to let other threads use the processor while waiting for the I/O to " +"complete. Obviously, the following function has the same problem as the " +"previous one::" +msgstr "" +"有关借入引用的问题的第二种情况是涉及线程的变种。通常,Python 解释器中的多个线程不会相互影响,因为有一个 :term:`全局锁 ` 在保护 Python 的整个对象空间。不过,有可能使用宏 " +":c:macro:`Py_BEGIN_ALLOW_THREADS` 来临时释放这个锁,并使用 " +":c:macro:`Py_END_ALLOW_THREADS` 来重新获取它。这在阻塞型 I/O 调用操作中很常见,可以让其他线程在等待 I/O " +"结束期间使用处理器。显然,下面的函数与之前那个存在相同的问题::" + +#: ../../extending/extending.rst:1130 +msgid "" +"void\n" +"bug(PyObject *list)\n" +"{\n" +" PyObject *item = PyList_GetItem(list, 0);\n" +" Py_BEGIN_ALLOW_THREADS\n" +" ...some blocking I/O call...\n" +" Py_END_ALLOW_THREADS\n" +" PyObject_Print(item, stdout, 0); /* BUG! */\n" +"}" +msgstr "" +"void\n" +"bug(PyObject *list)\n" +"{\n" +" PyObject *item = PyList_GetItem(list, 0);\n" +" Py_BEGIN_ALLOW_THREADS\n" +" ...some blocking I/O call...\n" +" Py_END_ALLOW_THREADS\n" +" PyObject_Print(item, stdout, 0); /* BUG! */\n" +"}" + +#: ../../extending/extending.rst:1144 +msgid "NULL Pointers" +msgstr "NULL 指针" + +#: ../../extending/extending.rst:1146 +msgid "" +"In general, functions that take object references as arguments do not expect" +" you to pass them ``NULL`` pointers, and will dump core (or cause later core" +" dumps) if you do so. Functions that return object references generally " +"return ``NULL`` only to indicate that an exception occurred. The reason for" +" not testing for ``NULL`` arguments is that functions often pass the objects" +" they receive on to other function --- if each function were to test for " +"``NULL``, there would be a lot of redundant tests and the code would run " +"more slowly." +msgstr "" +"通常,接受对象引用作为参数的函数不希望你传给它们 ``NULL`` 指针,并且当你这样做时将会转储核心(或在以后导致核心转储)。 " +"返回对象引用的函数通常只在要指明发生了异常时才返回 ``NULL``。不检测 ``NULL`` " +"参数的原因在于这些函数经常要将它们所接收的对象传给其他函数 --- 如果每个函数都检测 ``NULL``,将会导致大量的冗余检测而使代码运行得更缓慢。" + +#: ../../extending/extending.rst:1154 +msgid "" +"It is better to test for ``NULL`` only at the \"source:\" when a pointer " +"that may be ``NULL`` is received, for example, from :c:func:`malloc` or from" +" a function that may raise an exception." +msgstr "" +"更好的做法是仅在“源头”上检测 ``NULL``,即在接收到一个可能为 ``NULL`` 的指针,例如来自 :c:func:`malloc` " +"或是一个可能引发异常的函数的时候。" + +#: ../../extending/extending.rst:1158 +msgid "" +"The macros :c:func:`Py_INCREF` and :c:func:`Py_DECREF` do not check for " +"``NULL`` pointers --- however, their variants :c:func:`Py_XINCREF` and " +":c:func:`Py_XDECREF` do." +msgstr "" +":c:func:`Py_INCREF` 和 :c:func:`Py_DECREF` 等宏不会检测 ``NULL`` 指针 --- 但是,它们的变种 " +":c:func:`Py_XINCREF` 和 :c:func:`Py_XDECREF` 则会检测。" + +#: ../../extending/extending.rst:1162 +msgid "" +"The macros for checking for a particular object type (``Pytype_Check()``) " +"don't check for ``NULL`` pointers --- again, there is much code that calls " +"several of these in a row to test an object against various different " +"expected types, and this would generate redundant tests. There are no " +"variants with ``NULL`` checking." +msgstr "" +"用于检测特定对象类型的宏 (``Pytype_Check()``) 不会检测 ``NULL`` 指针 --- " +"同样地,有大量代码会连续调用这些宏来测试一个对象是否为几种不同预期类型之一,这将会生成冗余的测试。不存在带有 ``NULL`` 检测的变体。" + +#: ../../extending/extending.rst:1168 +msgid "" +"The C function calling mechanism guarantees that the argument list passed to" +" C functions (``args`` in the examples) is never ``NULL`` --- in fact it " +"guarantees that it is always a tuple [#]_." +msgstr "" +"C 函数调用机制会保证传给 C 函数的参数列表 (本示例中为 ``args``) 绝不会为 ``NULL`` --- 实际上它会保证其总是为一个元组 " +"[#]_。" + +#: ../../extending/extending.rst:1172 +msgid "" +"It is a severe error to ever let a ``NULL`` pointer \"escape\" to the Python" +" user." +msgstr "任何时候将 ``NULL`` 指针“泄露”给 Python 用户都会是个严重的错误。" + +#: ../../extending/extending.rst:1183 +msgid "Writing Extensions in C++" +msgstr "在 C++ 中编写扩展" + +#: ../../extending/extending.rst:1185 +msgid "" +"It is possible to write extension modules in C++. Some restrictions apply." +" If the main program (the Python interpreter) is compiled and linked by the" +" C compiler, global or static objects with constructors cannot be used. " +"This is not a problem if the main program is linked by the C++ compiler. " +"Functions that will be called by the Python interpreter (in particular, " +"module initialization functions) have to be declared using ``extern \"C\"``." +" It is unnecessary to enclose the Python header files in ``extern \"C\" " +"{...}`` --- they use this form already if the symbol ``__cplusplus`` is " +"defined (all recent C++ compilers define this symbol)." +msgstr "" +"还可以在 C++ 中编写扩展模块,只是有些限制。如果主程序(Python 解释器)是使用 C " +"编译器来编译和链接的,全局或静态对象的构造器就不能使用。而如果是 C++ 编译器来链接的就没有这个问题。函数会被 Python " +"解释器调用(通常就是模块初始化函数)必须声明为 ``extern \"C\"``。而是否在 ``extern \"C\" {...}`` 里包含 " +"Python 头文件则不是那么重要,因为如果定义了符号 ``__cplusplus`` 则已经是这么声明的了(所有现代 C++ " +"编译器都会定义这个符号)。" + +#: ../../extending/extending.rst:1199 +msgid "Providing a C API for an Extension Module" +msgstr "给扩展模块提供 C API" + +#: ../../extending/extending.rst:1204 +msgid "" +"Many extension modules just provide new functions and types to be used from " +"Python, but sometimes the code in an extension module can be useful for " +"other extension modules. For example, an extension module could implement a " +"type \"collection\" which works like lists without order. Just like the " +"standard Python list type has a C API which permits extension modules to " +"create and manipulate lists, this new collection type should have a set of C" +" functions for direct manipulation from other extension modules." +msgstr "" +"很多扩展模块提供了新的函数和类型供 Python 使用,但有时扩展模块里的代码也可以被其他扩展模块使用。例如,一个扩展模块可以实现一个类型 " +"\"collection\" 看起来是没有顺序的。就像是 Python 列表类型,拥有 C API " +"允许扩展模块来创建和维护列表,这个新的集合类型可以有一堆 C 函数用于给其他扩展模块直接使用。" + +#: ../../extending/extending.rst:1212 +msgid "" +"At first sight this seems easy: just write the functions (without declaring " +"them ``static``, of course), provide an appropriate header file, and " +"document the C API. And in fact this would work if all extension modules " +"were always linked statically with the Python interpreter. When modules are " +"used as shared libraries, however, the symbols defined in one module may not" +" be visible to another module. The details of visibility depend on the " +"operating system; some systems use one global namespace for the Python " +"interpreter and all extension modules (Windows, for example), whereas others" +" require an explicit list of imported symbols at module link time (AIX is " +"one example), or offer a choice of different strategies (most Unices). And " +"even if symbols are globally visible, the module whose functions one wishes " +"to call might not have been loaded yet!" +msgstr "" +"开始看起来很简单:只需要编写函数 (无需声明为 ``static``),提供恰当的头文件,以及 C API 的文档。实际上在所有扩展模块都是静态链接到 " +"Python 解释器时也是可以正常工作的。当模块以共享库链接时,一个模块中的符号定义对另一个模块不可见。可见的细节依赖于操作系统,一些系统的 " +"Python 解释器使用全局命名空间(例如 Windows),有些则在链接时需要一个严格的已导入符号列表(一个例子是 " +"AIX),或者提供可选的不同策略(如 Unix 系列)。即便是符号是全局可见的,你要调用的模块也可能尚未加载。" + +#: ../../extending/extending.rst:1224 +msgid "" +"Portability therefore requires not to make any assumptions about symbol " +"visibility. This means that all symbols in extension modules should be " +"declared ``static``, except for the module's initialization function, in " +"order to avoid name clashes with other extension modules (as discussed in " +"section :ref:`methodtable`). And it means that symbols that *should* be " +"accessible from other extension modules must be exported in a different way." +msgstr "" +"可移植性需要不能对符号可见性做任何假设。这意味着扩展模块里的所有符号都应该声明为 ``static`` " +",除了模块的初始化函数,来避免与其他扩展模块的命名冲突 (在段落 :ref:`methodtable` 中讨论) 。这意味着符号应该 *必须* " +"通过其他导出方式来供其他扩展模块访问。" + +#: ../../extending/extending.rst:1231 +msgid "" +"Python provides a special mechanism to pass C-level information (pointers) " +"from one extension module to another one: Capsules. A Capsule is a Python " +"data type which stores a pointer (:c:expr:`void \\*`). Capsules can only be" +" created and accessed via their C API, but they can be passed around like " +"any other Python object. In particular, they can be assigned to a name in " +"an extension module's namespace. Other extension modules can then import " +"this module, retrieve the value of this name, and then retrieve the pointer " +"from the Capsule." +msgstr "" +"Python 提供了一个特别的机制用来从一个扩展模块向另一个扩展模块传递 C 层级的信息 (指针): Capsule。一个 Capsule " +"就是一个存储了指针 (:c:expr:`void \\*`) 的 Python 数据类型。Capsule 只能通过其 C API " +"来创建和访问,但它们可以像任何其他 Python 对象一样被传递。特别地,它们可以被赋值给扩展模块命名空间中的一个名称。 " +"其他扩展模块将可以导入这个模块,获取该名称对应的值,然后从 Capsule 中获取指针。" + +#: ../../extending/extending.rst:1239 +msgid "" +"There are many ways in which Capsules can be used to export the C API of an " +"extension module. Each function could get its own Capsule, or all C API " +"pointers could be stored in an array whose address is published in a " +"Capsule. And the various tasks of storing and retrieving the pointers can be" +" distributed in different ways between the module providing the code and the" +" client modules." +msgstr "" +"Capsule 可以用多种方式导出 C API 给扩展模块。每个函数可以用自己的 Capsule,或者所有 C API " +"指针可以存储在一个数组里,数组地址再发布给 Capsule。存储和获取指针也可以用多种方式,供客户端模块使用。" + +#: ../../extending/extending.rst:1245 +msgid "" +"Whichever method you choose, it's important to name your Capsules properly. " +"The function :c:func:`PyCapsule_New` takes a name parameter (:c:expr:`const " +"char \\*`); you're permitted to pass in a ``NULL`` name, but we strongly " +"encourage you to specify a name. Properly named Capsules provide a degree " +"of runtime type-safety; there is no feasible way to tell one unnamed Capsule" +" from another." +msgstr "" +"无论你选择哪个方法,为你的 Capsule 指定适当的名称都很重要。函数 :c:func:`PyCapsule_New` 接受一个 name 形参 " +"(:c:expr:`const char \\*`);允许你传入一个 ``NULL`` 作为名称,但我们强烈推荐你指定名称。正确地命名的 Capsule" +" 提供了一定的运行时类型安全性;没有可行的方式能区别两个未命名的 Capsule。" + +#: ../../extending/extending.rst:1252 +msgid "" +"In particular, Capsules used to expose C APIs should be given a name " +"following this convention::" +msgstr "通常来说,Capsule 用于暴露 C API,其名字应该遵循如下规范:" + +#: ../../extending/extending.rst:1255 +msgid "modulename.attributename" +msgstr "modulename.attributename" + +#: ../../extending/extending.rst:1257 +msgid "" +"The convenience function :c:func:`PyCapsule_Import` makes it easy to load a " +"C API provided via a Capsule, but only if the Capsule's name matches this " +"convention. This behavior gives C API users a high degree of certainty that" +" the Capsule they load contains the correct C API." +msgstr "" +"便利函数 :c:func:`PyCapsule_Import` 可以方便的载入通过 Capsule 提供的 C API,仅在 Capsule " +"的名字匹配时。这个行为为 C API 用户提供了高度的确定性来载入正确的 C API。" + +#: ../../extending/extending.rst:1262 +msgid "" +"The following example demonstrates an approach that puts most of the burden " +"on the writer of the exporting module, which is appropriate for commonly " +"used library modules. It stores all C API pointers (just one in the " +"example!) in an array of :c:expr:`void` pointers which becomes the value of " +"a Capsule. The header file corresponding to the module provides a macro that" +" takes care of importing the module and retrieving its C API pointers; " +"client modules only have to call this macro before accessing the C API." +msgstr "" +"下面的例子演示了一种将大部分负担交给导出模块编写者的处理方式,这对于常用的库模块来说是合适的。它会将所有 C API " +"指针(在这个例子里只有一个!)储存到一个 :c:expr:`void` 指针数组,它将成为一个 Capsule 的值。 " +"与模块对应的头文件提供了一个宏用来管理导入模块和获取其 C API 指针;客户端模块只需要在访问 C API 之前调用这个宏即可。" + +#: ../../extending/extending.rst:1270 +msgid "" +"The exporting module is a modification of the :mod:`!spam` module from " +"section :ref:`extending-simpleexample`. The function :func:`!spam.system` " +"does not call the C library function :c:func:`system` directly, but a " +"function :c:func:`!PySpam_System`, which would of course do something more " +"complicated in reality (such as adding \"spam\" to every command). This " +"function :c:func:`!PySpam_System` is also exported to other extension " +"modules." +msgstr "" +"导出模块是对 :ref:`extending-simpleexample` 部分的 :mod:`!spam` 模块的修改。函数 " +":func:`!spam.system` 并不直接调用 C 库函数 :c:func:`system`,而是调用一个函数 " +":c:func:`!PySpam_System`,这个函数在现实中当然会做一些更复杂的事情(比如在每条命令中添加\"spam\")。该函数 " +":c:func:`!PySpam_System` 也会导出给其他扩展模块。" + +#: ../../extending/extending.rst:1277 +msgid "" +"The function :c:func:`!PySpam_System` is a plain C function, declared " +"``static`` like everything else::" +msgstr "函数 :c:func:`!PySpam_System` 是一个纯 C 函数,像其他函数一样声明为 ``static``::" + +#: ../../extending/extending.rst:1280 +msgid "" +"static int\n" +"PySpam_System(const char *command)\n" +"{\n" +" return system(command);\n" +"}" +msgstr "" +"static int\n" +"PySpam_System(const char *command)\n" +"{\n" +" return system(command);\n" +"}" + +#: ../../extending/extending.rst:1286 +msgid "The function :c:func:`!spam_system` is modified in a trivial way::" +msgstr "函数 :c:func:`!spam_system` 已按如下方式修改::" + +#: ../../extending/extending.rst:1288 +msgid "" +"static PyObject *\n" +"spam_system(PyObject *self, PyObject *args)\n" +"{\n" +" const char *command;\n" +" int sts;\n" +"\n" +" if (!PyArg_ParseTuple(args, \"s\", &command))\n" +" return NULL;\n" +" sts = PySpam_System(command);\n" +" return PyLong_FromLong(sts);\n" +"}" +msgstr "" +"static PyObject *\n" +"spam_system(PyObject *self, PyObject *args)\n" +"{\n" +" const char *command;\n" +" int sts;\n" +"\n" +" if (!PyArg_ParseTuple(args, \"s\", &command))\n" +" return NULL;\n" +" sts = PySpam_System(command);\n" +" return PyLong_FromLong(sts);\n" +"}" + +#: ../../extending/extending.rst:1300 +msgid "In the beginning of the module, right after the line ::" +msgstr "在模块开头,在此行后::" + +#: ../../extending/extending.rst:1302 +msgid "#include " +msgstr "#include " + +#: ../../extending/extending.rst:1304 +msgid "two more lines must be added::" +msgstr "添加另外两行::" + +#: ../../extending/extending.rst:1306 +msgid "" +"#define SPAM_MODULE\n" +"#include \"spammodule.h\"" +msgstr "" +"#define SPAM_MODULE\n" +"#include \"spammodule.h\"" + +#: ../../extending/extending.rst:1309 +msgid "" +"The ``#define`` is used to tell the header file that it is being included in" +" the exporting module, not a client module. Finally, the module's " +":c:data:`mod_exec ` function must take care of initializing the" +" C API pointer array::" +msgstr "" +"``#define`` 被用来告知头文件它被包括在导出的模块中,而不是客户端模块。最终,模块的 :c:data:`mod_exec " +"` 函数必须负责初始化 C API 指针数组::" + +#: ../../extending/extending.rst:1313 +msgid "" +"static int\n" +"spam_module_exec(PyObject *m)\n" +"{\n" +" static void *PySpam_API[PySpam_API_pointers];\n" +" PyObject *c_api_object;\n" +"\n" +" /* Initialize the C API pointer array */\n" +" PySpam_API[PySpam_System_NUM] = (void *)PySpam_System;\n" +"\n" +" /* Create a Capsule containing the API pointer array's address */\n" +" c_api_object = PyCapsule_New((void *)PySpam_API, \"spam._C_API\", NULL);\n" +"\n" +" if (PyModule_Add(m, \"_C_API\", c_api_object) < 0) {\n" +" return -1;\n" +" }\n" +"\n" +" return 0;\n" +"}" +msgstr "" +"static int\n" +"spam_module_exec(PyObject *m)\n" +"{\n" +" static void *PySpam_API[PySpam_API_pointers];\n" +" PyObject *c_api_object;\n" +"\n" +" /* 初始化 C API 指针数组 */\n" +" PySpam_API[PySpam_System_NUM] = (void *)PySpam_System;\n" +"\n" +" /* 创建包含 API 指针数组地址的 Capsule */\n" +" c_api_object = PyCapsule_New((void *)PySpam_API, \"spam._C_API\", NULL);\n" +"\n" +" if (PyModule_Add(m, \"_C_API\", c_api_object) < 0) {\n" +" return -1;\n" +" }\n" +"\n" +" return 0;\n" +"}" + +#: ../../extending/extending.rst:1332 +msgid "" +"Note that ``PySpam_API`` is declared ``static``; otherwise the pointer array" +" would disappear when :c:func:`!PyInit_spam` terminates!" +msgstr "" +"请注意 ``PySpam_API`` 被声明为 ``static``;否则指针数组会在 :c:func:`!PyInit_spam` 终结时消失!" + +#: ../../extending/extending.rst:1335 +msgid "" +"The bulk of the work is in the header file :file:`spammodule.h`, which looks" +" like this::" +msgstr "头文件 :file:`spammodule.h` 里的一堆工作,看起来如下所示::" + +#: ../../extending/extending.rst:1338 +msgid "" +"#ifndef Py_SPAMMODULE_H\n" +"#define Py_SPAMMODULE_H\n" +"#ifdef __cplusplus\n" +"extern \"C\" {\n" +"#endif\n" +"\n" +"/* Header file for spammodule */\n" +"\n" +"/* C API functions */\n" +"#define PySpam_System_NUM 0\n" +"#define PySpam_System_RETURN int\n" +"#define PySpam_System_PROTO (const char *command)\n" +"\n" +"/* Total number of C API pointers */\n" +"#define PySpam_API_pointers 1\n" +"\n" +"\n" +"#ifdef SPAM_MODULE\n" +"/* This section is used when compiling spammodule.c */\n" +"\n" +"static PySpam_System_RETURN PySpam_System PySpam_System_PROTO;\n" +"\n" +"#else\n" +"/* This section is used in modules that use spammodule's API */\n" +"\n" +"static void **PySpam_API;\n" +"\n" +"#define PySpam_System \\\n" +" (*(PySpam_System_RETURN (*)PySpam_System_PROTO) PySpam_API[PySpam_System_NUM])\n" +"\n" +"/* Return -1 on error, 0 on success.\n" +" * PyCapsule_Import will set an exception if there's an error.\n" +" */\n" +"static int\n" +"import_spam(void)\n" +"{\n" +" PySpam_API = (void **)PyCapsule_Import(\"spam._C_API\", 0);\n" +" return (PySpam_API != NULL) ? 0 : -1;\n" +"}\n" +"\n" +"#endif\n" +"\n" +"#ifdef __cplusplus\n" +"}\n" +"#endif\n" +"\n" +"#endif /* !defined(Py_SPAMMODULE_H) */" +msgstr "" +"#ifndef Py_SPAMMODULE_H\n" +"#define Py_SPAMMODULE_H\n" +"#ifdef __cplusplus\n" +"extern \"C\" {\n" +"#endif\n" +"\n" +"/* 用于 spammodule 的头文件 */\n" +"\n" +"/* C API 函数 */\n" +"#define PySpam_System_NUM 0\n" +"#define PySpam_System_RETURN int\n" +"#define PySpam_System_PROTO (const char *command)\n" +"\n" +"/* C API 指针的总数 */\n" +"#define PySpam_API_pointers 1\n" +"\n" +"\n" +"#ifdef SPAM_MODULE\n" +"/* 该节将在编译 spammodule.c 时使用 */\n" +"\n" +"static PySpam_System_RETURN PySpam_System PySpam_System_PROTO;\n" +"\n" +"#else\n" +"/* 该节将在使用 spammodule 的 API 的模块中使用 */\n" +"\n" +"static void **PySpam_API;\n" +"\n" +"#define PySpam_System \\\n" +" (*(PySpam_System_RETURN (*)PySpam_System_PROTO) PySpam_API[PySpam_System_NUM])\n" +"\n" +"/* 出错时返回 -1,成功时返回 0。\n" +" * 如果有异常 PyCapsule_Import 将设置一个异常。\n" +" */\n" +"static int\n" +"import_spam(void)\n" +"{\n" +" PySpam_API = (void **)PyCapsule_Import(\"spam._C_API\", 0);\n" +" return (PySpam_API != NULL) ? 0 : -1;\n" +"}\n" +"\n" +"#endif\n" +"\n" +"#ifdef __cplusplus\n" +"}\n" +"#endif\n" +"\n" +"#endif /* !defined(Py_SPAMMODULE_H) */" + +#: ../../extending/extending.rst:1386 +msgid "" +"All that a client module must do in order to have access to the function " +":c:func:`!PySpam_System` is to call the function (or rather macro) " +":c:func:`!import_spam` in its :c:data:`mod_exec ` function::" +msgstr "" +"客户端模块要访问函数 :c:func:`!PySpam_System` 所必须做的全部事情就是在其 :c:data:`mod_exec " +"` 函数中调用函数 :c:func:`!import_spam` (更准确地说是宏)::" + +#: ../../extending/extending.rst:1390 +msgid "" +"static int\n" +"client_module_exec(PyObject *m)\n" +"{\n" +" if (import_spam() < 0) {\n" +" return -1;\n" +" }\n" +" /* additional initialization can happen here */\n" +" return 0;\n" +"}" +msgstr "" +"static int\n" +"client_module_exec(PyObject *m)\n" +"{\n" +" if (import_spam() < 0) {\n" +" return -1;\n" +" }\n" +" /* 额外的初始化可在此进行 */\n" +" return 0;\n" +"}" + +#: ../../extending/extending.rst:1400 +msgid "" +"The main disadvantage of this approach is that the file :file:`spammodule.h`" +" is rather complicated. However, the basic structure is the same for each " +"function that is exported, so it has to be learned only once." +msgstr "" +"这种方法的主要缺点是,文件 :file:`spammodule.h` 过于复杂。当然,对每个要导出的函数,基本结构是相似的,所以只需要学习一次。" + +#: ../../extending/extending.rst:1404 +msgid "" +"Finally it should be mentioned that Capsules offer additional functionality," +" which is especially useful for memory allocation and deallocation of the " +"pointer stored in a Capsule. The details are described in the Python/C API " +"Reference Manual in the section :ref:`capsules` and in the implementation of" +" Capsules (files :file:`Include/pycapsule.h` and :file:`Objects/pycapsule.c`" +" in the Python source code distribution)." +msgstr "" +"最后需要提醒的是 Capsule 提供了额外的功能,用于存储在 Capsule 里的指针的内存分配和释放。细节参考 Python/C API " +"参考手册的章节 :ref:`capsules` 和 Capsule 的实现 (在 Python 源码发行包的 " +":file:`Include/pycapsule.h` 和 :file:`Objects/pycapsule.c` )." + +#: ../../extending/extending.rst:1412 +msgid "Footnotes" +msgstr "备注" + +#: ../../extending/extending.rst:1413 +msgid "" +"An interface for this function already exists in the standard module " +":mod:`os` --- it was chosen as a simple and straightforward example." +msgstr "这个函数的接口已经在标准模块 :mod:`os` 里了,这里作为一个简单而直接的例子。" + +#: ../../extending/extending.rst:1416 +msgid "" +"The metaphor of \"borrowing\" a reference is not completely correct: the " +"owner still has a copy of the reference." +msgstr "术语\"借用\"一个引用是不完全正确的:拥有者仍然有引用的拷贝。" + +#: ../../extending/extending.rst:1419 +msgid "" +"Checking that the reference count is at least 1 **does not work** --- the " +"reference count itself could be in freed memory and may thus be reused for " +"another object!" +msgstr "检查引用计数至少为 1 **没有用** ,引用计数本身可以在已经释放的内存里,并有可能被其他对象所用。" + +#: ../../extending/extending.rst:1423 +msgid "" +"These guarantees don't hold when you use the \"old\" style calling " +"convention --- this is still found in much existing code." +msgstr "当你使用 \"旧式\" 风格调用约定时,这些保证不成立,尽管这依旧存在于很多旧代码中。" + +#: ../../extending/extending.rst:591 +msgid "PyObject_CallObject (C function)" +msgstr "PyObject_CallObject (C 函数)" + +#: ../../extending/extending.rst:682 +msgid "PyArg_ParseTuple (C function)" +msgstr "PyArg_ParseTuple (C 函数)" + +#: ../../extending/extending.rst:774 +msgid "PyArg_ParseTupleAndKeywords (C function)" +msgstr "PyArg_ParseTupleAndKeywords (C 函数)" + +#: ../../extending/extending.rst:795 +msgid "Philbrick, Geoff" +msgstr "Philbrick, Geoff" diff --git a/extending/index.po b/extending/index.po new file mode 100644 index 0000000000..11ae92427b --- /dev/null +++ b/extending/index.po @@ -0,0 +1,166 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:00+0000\n" +"Last-Translator: 99 , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../extending/index.rst:5 +msgid "Extending and Embedding the Python Interpreter" +msgstr "扩展和嵌入 Python 解释器" + +#: ../../extending/index.rst:7 +msgid "" +"This document describes how to write modules in C or C++ to extend the " +"Python interpreter with new modules. Those modules can do what Python code " +"does -- define functions, object types and methods -- but also interact with" +" native libraries or achieve better performance by avoiding the overhead of " +"an interpreter. The document also describes how to embed the Python " +"interpreter in another application, for use as an extension language. " +"Finally, it shows how to compile and link extension modules so that they can" +" be loaded dynamically (at run time) into the interpreter, if the underlying" +" operating system supports this feature." +msgstr "" + +#: ../../extending/index.rst:17 +msgid "" +"This document assumes basic knowledge about C and Python. For an informal " +"introduction to Python, see :ref:`tutorial-index`. :ref:`reference-index` " +"gives a more formal definition of the language. :ref:`library-index` " +"documents the existing object types, functions and modules (both built-in " +"and written in Python) that give the language its wide application range." +msgstr "" + +#: ../../extending/index.rst:23 +msgid "" +"For a detailed description of the whole Python/C API, see the separate " +":ref:`c-api-index`." +msgstr "关于整个 Python/C API 的详细介绍,请参阅独立的 :ref:`c-api-index`。" + +#: ../../extending/index.rst:26 +msgid "" +"To support extensions, Python's C API (Application Programmers Interface) " +"defines a set of functions, macros and variables that provide access to most" +" aspects of the Python run-time system. The Python API is incorporated in a" +" C source file by including the header ``\"Python.h\"``." +msgstr "" + +#: ../../extending/index.rst:33 +msgid "" +"The C extension interface is specific to CPython, and extension modules do " +"not work on other Python implementations. In many cases, it is possible to " +"avoid writing C extensions and preserve portability to other " +"implementations. For example, if your use case is calling C library " +"functions or system calls, you should consider using the :mod:`ctypes` " +"module or the `cffi `_ library rather than " +"writing custom C code. These modules let you write Python code to interface " +"with C code and are more portable between implementations of Python than " +"writing and compiling a C extension module." +msgstr "" +"C 扩展接口特指 CPython,扩展模块无法在其他 Python 实现上工作。在大多数情况下,应该避免写 C " +"扩展,来保持可移植性。举个例子,如果你的用例调用了 C 库或系统调用,你应该考虑使用 :mod:`ctypes` 模块或 `cffi " +"`_ 库,而不是自己写 C 代码。这些模块允许你写 Python 代码来接口 C " +"代码,并且相较于编写和编译 C 扩展模块,该方法在不同 Python 实现之间具有更高的可移植性。" + +#: ../../extending/index.rst:58 +msgid "Recommended third party tools" +msgstr "推荐的第三方工具" + +#: ../../extending/index.rst:60 +msgid "" +"This document only covers the basic tools for creating extensions provided " +"as part of this version of CPython. Some :ref:`third party tools ` offer both simpler and more sophisticated approaches to creating C " +"and C++ extensions for Python." +msgstr "" + +#: ../../extending/index.rst:65 +msgid "" +"While this document is aimed at extension authors, it should also be helpful" +" to the authors of such tools. For example, the tutorial module can serve as" +" a simple test case for a build tool or sample expected output of a code " +"generator." +msgstr "" + +#: ../../extending/index.rst:72 +msgid "C API Tutorial" +msgstr "" + +#: ../../extending/index.rst:74 +msgid "" +"This tutorial describes how to write a simple module in C or C++, using the " +"Python C API -- that is, using the basic tools provided as part of this " +"version of CPython." +msgstr "" + +#: ../../extending/index.rst:79 +msgid ":ref:`first-extension-module`" +msgstr "" + +#: ../../extending/index.rst:83 +msgid "Guides for intermediate topics" +msgstr "" + +#: ../../extending/index.rst:85 +msgid "" +"This section of the guide covers creating C and C++ extensions without " +"assistance from third party tools. It is intended primarily for creators of " +"those tools, rather than being a recommended way to create your own C " +"extensions." +msgstr "" +"本指南的这一部分包括在没有第三方工具帮助的情况下创建 C 和 C++ 扩展。它主要用于这些工具的创建者,而不是建议你创建自己的 C 扩展的方法。" + +#: ../../extending/index.rst:90 +msgid ":ref:`extending-intro`" +msgstr "" + +#: ../../extending/index.rst:91 +msgid ":ref:`defining-new-types`" +msgstr "" + +#: ../../extending/index.rst:92 +msgid ":ref:`new-types-topics`" +msgstr "" + +#: ../../extending/index.rst:93 +msgid ":ref:`building`" +msgstr "" + +#: ../../extending/index.rst:94 +msgid ":ref:`building-on-windows`" +msgstr "" + +#: ../../extending/index.rst:97 +msgid "Embedding the CPython runtime in a larger application" +msgstr "在更大的应用程序中嵌入 CPython 运行时" + +#: ../../extending/index.rst:99 +msgid "" +"Sometimes, rather than creating an extension that runs inside the Python " +"interpreter as the main application, it is desirable to instead embed the " +"CPython runtime inside a larger application. This section covers some of the" +" details involved in doing that successfully." +msgstr "" +"有时,不是要创建在 Python 解释器中作为主应用程序运行的扩展,而是希望将 CPython 运行时嵌入到更大的应用程序中。 " +"本节介绍了成功完成此操作所涉及的一些细节。" + +#: ../../extending/index.rst:104 +msgid ":ref:`embedding`" +msgstr "" diff --git a/extending/newtypes.po b/extending/newtypes.po new file mode 100644 index 0000000000..d05eed9cc9 --- /dev/null +++ b/extending/newtypes.po @@ -0,0 +1,1398 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../extending/newtypes.rst:7 +msgid "Defining Extension Types: Assorted Topics" +msgstr "定义扩展类型:杂项主题" + +#: ../../extending/newtypes.rst:11 +msgid "" +"This section aims to give a quick fly-by on the various type methods you can" +" implement and what they do." +msgstr "本章节目标是提供一个各种你可以实现的类型方法及其功能的简短介绍。" + +#: ../../extending/newtypes.rst:14 +msgid "" +"Here is the definition of :c:type:`PyTypeObject`, with some fields only used" +" in :ref:`debug builds ` omitted:" +msgstr "" +"这是 C 类型 :c:type:`PyTypeObject` 的定义,省略了只用于 :ref:`调试构建 ` 的字段:" + +#: ../../extending/newtypes.rst:17 +msgid "" +"typedef struct _typeobject {\n" +" PyObject_VAR_HEAD\n" +" const char *tp_name; /* For printing, in format \".\" */\n" +" Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */\n" +"\n" +" /* Methods to implement standard operations */\n" +"\n" +" destructor tp_dealloc;\n" +" Py_ssize_t tp_vectorcall_offset;\n" +" getattrfunc tp_getattr;\n" +" setattrfunc tp_setattr;\n" +" PyAsyncMethods *tp_as_async; /* formerly known as tp_compare (Python 2)\n" +" or tp_reserved (Python 3) */\n" +" reprfunc tp_repr;\n" +"\n" +" /* Method suites for standard classes */\n" +"\n" +" PyNumberMethods *tp_as_number;\n" +" PySequenceMethods *tp_as_sequence;\n" +" PyMappingMethods *tp_as_mapping;\n" +"\n" +" /* More standard operations (here for binary compatibility) */\n" +"\n" +" hashfunc tp_hash;\n" +" ternaryfunc tp_call;\n" +" reprfunc tp_str;\n" +" getattrofunc tp_getattro;\n" +" setattrofunc tp_setattro;\n" +"\n" +" /* Functions to access object as input/output buffer */\n" +" PyBufferProcs *tp_as_buffer;\n" +"\n" +" /* Flags to define presence of optional/expanded features */\n" +" unsigned long tp_flags;\n" +"\n" +" const char *tp_doc; /* Documentation string */\n" +"\n" +" /* Assigned meaning in release 2.0 */\n" +" /* call function for all accessible objects */\n" +" traverseproc tp_traverse;\n" +"\n" +" /* delete references to contained objects */\n" +" inquiry tp_clear;\n" +"\n" +" /* Assigned meaning in release 2.1 */\n" +" /* rich comparisons */\n" +" richcmpfunc tp_richcompare;\n" +"\n" +" /* weak reference enabler */\n" +" Py_ssize_t tp_weaklistoffset;\n" +"\n" +" /* Iterators */\n" +" getiterfunc tp_iter;\n" +" iternextfunc tp_iternext;\n" +"\n" +" /* Attribute descriptor and subclassing stuff */\n" +" PyMethodDef *tp_methods;\n" +" PyMemberDef *tp_members;\n" +" PyGetSetDef *tp_getset;\n" +" // Strong reference on a heap type, borrowed reference on a static type\n" +" PyTypeObject *tp_base;\n" +" PyObject *tp_dict;\n" +" descrgetfunc tp_descr_get;\n" +" descrsetfunc tp_descr_set;\n" +" Py_ssize_t tp_dictoffset;\n" +" initproc tp_init;\n" +" allocfunc tp_alloc;\n" +" newfunc tp_new;\n" +" freefunc tp_free; /* Low-level free-memory routine */\n" +" inquiry tp_is_gc; /* For PyObject_IS_GC */\n" +" PyObject *tp_bases;\n" +" PyObject *tp_mro; /* method resolution order */\n" +" PyObject *tp_cache; /* no longer used */\n" +" void *tp_subclasses; /* for static builtin types this is an index */\n" +" PyObject *tp_weaklist; /* not used for static builtin types */\n" +" destructor tp_del;\n" +"\n" +" /* Type attribute cache version tag. Added in version 2.6.\n" +" * If zero, the cache is invalid and must be initialized.\n" +" */\n" +" unsigned int tp_version_tag;\n" +"\n" +" destructor tp_finalize;\n" +" vectorcallfunc tp_vectorcall;\n" +"\n" +" /* bitset of which type-watchers care about this type */\n" +" unsigned char tp_watched;\n" +"\n" +" /* Number of tp_version_tag values used.\n" +" * Set to _Py_ATTR_CACHE_UNUSED if the attribute cache is\n" +" * disabled for this type (e.g. due to custom MRO entries).\n" +" * Otherwise, limited to MAX_VERSIONS_PER_CLASS (defined elsewhere).\n" +" */\n" +" uint16_t tp_versions_used;\n" +"} PyTypeObject;\n" +msgstr "" +"typedef struct _typeobject {\n" +" PyObject_VAR_HEAD\n" +" const char *tp_name; /* 用于打印,格式为 \".\" */\n" +" Py_ssize_t tp_basicsize, tp_itemsize; /* 用于分配 */\n" +"\n" +" /* 用于实现标准操作的方法 */\n" +"\n" +" destructor tp_dealloc;\n" +" Py_ssize_t tp_vectorcall_offset;\n" +" getattrfunc tp_getattr;\n" +" setattrfunc tp_setattr;\n" +" PyAsyncMethods *tp_as_async; /* 原名为 tp_compare (Python 2)\n" +" 或 tp_reserved (Python 3) */\n" +" reprfunc tp_repr;\n" +"\n" +" /* 用于标准类的方法集 */\n" +"\n" +" PyNumberMethods *tp_as_number;\n" +" PySequenceMethods *tp_as_sequence;\n" +" PyMappingMethods *tp_as_mapping;\n" +"\n" +" /* 更多标准操作 (这些用于二进制兼容) */\n" +"\n" +" hashfunc tp_hash;\n" +" ternaryfunc tp_call;\n" +" reprfunc tp_str;\n" +" getattrofunc tp_getattro;\n" +" setattrofunc tp_setattro;\n" +"\n" +" /* 用于以输入/输出缓冲区方式访问对象的函数 */\n" +" PyBufferProcs *tp_as_buffer;\n" +"\n" +" /* 用于定义可选/扩展特性是否存在的旗标 */\n" +" unsigned long tp_flags;\n" +"\n" +" const char *tp_doc; /* 文档字符串 */\n" +"\n" +" /* 在 2.0 发布版中分配的含义 */\n" +" /* 为所有可访问的对象调用函数 */\n" +" traverseproc tp_traverse;\n" +"\n" +" /* 删除对所包含对象的引用 */\n" +" inquiry tp_clear;\n" +"\n" +" /* 在 2.1 发布版中分配的含义 */\n" +" /* 富比较操作 */\n" +" richcmpfunc tp_richcompare;\n" +"\n" +" /* 启用弱引用 */\n" +" Py_ssize_t tp_weaklistoffset;\n" +"\n" +" /* 迭代器 */\n" +" getiterfunc tp_iter;\n" +" iternextfunc tp_iternext;\n" +"\n" +" /* 属性描述器和子类化内容 */\n" +" PyMethodDef *tp_methods;\n" +" PyMemberDef *tp_members;\n" +" PyGetSetDef *tp_getset;\n" +" // 堆类型的强引用,静态类型的借入引用\n" +" PyTypeObject *tp_base;\n" +" PyObject *tp_dict;\n" +" descrgetfunc tp_descr_get;\n" +" descrsetfunc tp_descr_set;\n" +" Py_ssize_t tp_dictoffset;\n" +" initproc tp_init;\n" +" allocfunc tp_alloc;\n" +" newfunc tp_new;\n" +" freefunc tp_free; /* 低层级的释放内存例程 */\n" +" inquiry tp_is_gc; /* 用于 PyObject_IS_GC */\n" +" PyObject *tp_bases;\n" +" PyObject *tp_mro; /* 方法解析顺序 */\n" +" PyObject *tp_cache; /* 不再被使用 */\n" +" void *tp_subclasses; /* 对于静态内置类型这将是一个索引 */\n" +" PyObject *tp_weaklist; /* 不被用于静态内置类型 */\n" +" destructor tp_del;\n" +"\n" +" /* 类型属性缓存版本标签。在 2.6 版中添加。\n" +" * 如果为零,则缓存无效并且必须被初始化。\n" +" */\n" +" unsigned int tp_version_tag;\n" +"\n" +" destructor tp_finalize;\n" +" vectorcallfunc tp_vectorcall;\n" +"\n" +" /* 类型监视器针对此类型的位设置 */\n" +" unsigned char tp_watched;\n" +"\n" +" /* 使用的 tp_version_tag 值数量。\n" +" * 如果针对此类型的属性缓存被禁用则设为 _Py_ATTR_CACHE_UNUSED\n" +" * (例如由于自定义的 MRO 条目而被禁用)。\n" +" * 在其他情况下,将被限制为 MAX_VERSIONS_PER_CLASS (在其他地方定义)。\n" +" */\n" +" uint16_t tp_versions_used;\n" +"} PyTypeObject;\n" + +#: ../../extending/newtypes.rst:20 +msgid "" +"Now that's a *lot* of methods. Don't worry too much though -- if you have a" +" type you want to define, the chances are very good that you will only " +"implement a handful of these." +msgstr "这里有 *很多* 方法。但是不要太担心,如果你要定义一个类型,通常只需要实现少量的方法。" + +#: ../../extending/newtypes.rst:24 +msgid "" +"As you probably expect by now, we're going to go over this and give more " +"information about the various handlers. We won't go in the order they are " +"defined in the structure, because there is a lot of historical baggage that " +"impacts the ordering of the fields. It's often easiest to find an example " +"that includes the fields you need and then change the values to suit your " +"new type. ::" +msgstr "" +"正如你猜到的一样,我们正要一步一步详细介绍各种处理程序。因为有大量的历史包袱影响字段的排序,所以我们不会根据它们在结构体里定义的顺序讲解。通常非常容易找到一个包含你需要的字段的例子,然后改变值去适应你新的类型。" + +#: ../../extending/newtypes.rst:31 +msgid "const char *tp_name; /* For printing */" +msgstr "const char *tp_name; /* 用于打印 */" + +#: ../../extending/newtypes.rst:33 +msgid "" +"The name of the type -- as mentioned in the previous chapter, this will " +"appear in various places, almost entirely for diagnostic purposes. Try to " +"choose something that will be helpful in such a situation! ::" +msgstr "类型的名字 - 上一章提到过的,会出现在很多地方,几乎全部都是为了诊断目的。尝试选择一个好名字,对于诊断很有帮助。" + +#: ../../extending/newtypes.rst:37 +msgid "Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */" +msgstr "Py_ssize_t tp_basicsize, tp_itemsize; /* 用于分配 */" + +#: ../../extending/newtypes.rst:39 +msgid "" +"These fields tell the runtime how much memory to allocate when new objects " +"of this type are created. Python has some built-in support for variable " +"length structures (think: strings, tuples) which is where the " +":c:member:`~PyTypeObject.tp_itemsize` field comes in. This will be dealt " +"with later. ::" +msgstr "" +"这些字段告诉运行时在创造这个类型的新对象时需要分配多少内存。Python 为了可变长度的结构(想下:字符串,元组)有些内置支持,这是 " +":c:member:`~PyTypeObject.tp_itemsize` 字段存在的原由。这部分稍后解释。" + +#: ../../extending/newtypes.rst:44 +msgid "const char *tp_doc;" +msgstr "const char *tp_doc;" + +#: ../../extending/newtypes.rst:46 +msgid "" +"Here you can put a string (or its address) that you want returned when the " +"Python script references ``obj.__doc__`` to retrieve the doc string." +msgstr "这里你可以放置一段字符串(或者它的地址),当你想在 Python 脚本引用 ``obj.__doc__`` 时返回这段文档字符串。" + +#: ../../extending/newtypes.rst:49 +msgid "" +"Now we come to the basic type methods -- the ones most extension types will " +"implement." +msgstr "现在我们来看一下基本类型方法 - 大多数扩展类型将实现的方法。" + +#: ../../extending/newtypes.rst:54 +msgid "Finalization and De-allocation" +msgstr "终结和内存释放" + +#: ../../extending/newtypes.rst:64 +msgid "destructor tp_dealloc;" +msgstr "destructor tp_dealloc;" + +#: ../../extending/newtypes.rst:66 +msgid "" +"This function is called when the reference count of the instance of your " +"type is reduced to zero and the Python interpreter wants to reclaim it. If " +"your type has memory to free or other clean-up to perform, you can put it " +"here. The object itself needs to be freed here as well. Here is an example" +" of this function::" +msgstr "" +"当您的类型实例的引用计数减少为零并且 Python 解释器想要回收它时,将调用此函数。如果你的类型有内存可供释放或执行其他清理,你可以把它放在这里。 " +"对象本身也需要在这里释放。以下是此函数的示例:" + +#: ../../extending/newtypes.rst:72 +msgid "" +"static void\n" +"newdatatype_dealloc(PyObject *op)\n" +"{\n" +" newdatatypeobject *self = (newdatatypeobject *) op;\n" +" free(self->obj_UnderlyingDatatypePtr);\n" +" Py_TYPE(self)->tp_free(self);\n" +"}" +msgstr "" +"static void\n" +"newdatatype_dealloc(PyObject *op)\n" +"{\n" +" newdatatypeobject *self = (newdatatypeobject *) op;\n" +" free(self->obj_UnderlyingDatatypePtr);\n" +" Py_TYPE(self)->tp_free(self);\n" +"}" + +#: ../../extending/newtypes.rst:80 +msgid "" +"If your type supports garbage collection, the destructor should call " +":c:func:`PyObject_GC_UnTrack` before clearing any member fields::" +msgstr "如果你的类型支持垃圾回收,则析构器应当在清理任何成员字段之前调用 :c:func:`PyObject_GC_UnTrack`::" + +#: ../../extending/newtypes.rst:83 +msgid "" +"static void\n" +"newdatatype_dealloc(PyObject *op)\n" +"{\n" +" newdatatypeobject *self = (newdatatypeobject *) op;\n" +" PyObject_GC_UnTrack(op);\n" +" Py_CLEAR(self->other_obj);\n" +" ...\n" +" Py_TYPE(self)->tp_free(self);\n" +"}" +msgstr "" +"static void\n" +"newdatatype_dealloc(PyObject *op)\n" +"{\n" +" newdatatypeobject *self = (newdatatypeobject *) op;\n" +" PyObject_GC_UnTrack(op);\n" +" Py_CLEAR(self->other_obj);\n" +" ...\n" +" Py_TYPE(self)->tp_free(self);\n" +"}" + +#: ../../extending/newtypes.rst:97 +msgid "" +"One important requirement of the deallocator function is that it leaves any " +"pending exceptions alone. This is important since deallocators are " +"frequently called as the interpreter unwinds the Python stack; when the " +"stack is unwound due to an exception (rather than normal returns), nothing " +"is done to protect the deallocators from seeing that an exception has " +"already been set. Any actions which a deallocator performs which may cause " +"additional Python code to be executed may detect that an exception has been " +"set. This can lead to misleading errors from the interpreter. The proper " +"way to protect against this is to save a pending exception before performing" +" the unsafe action, and restoring it when done. This can be done using the " +":c:func:`PyErr_Fetch` and :c:func:`PyErr_Restore` functions::" +msgstr "" +"释放器函数的一个重要要求是不要干扰任何未决异常。这很重要,因为释放器经常在解释器展开 Python " +"栈时被调用;当栈因为异常(而非正常返回)而展开时,不会采取任何措施来保护释放器免于看到已经被设置的异常。释放器中可能导致额外的 Python " +"代码被执行的任何操作都可能会检测到异常已被设置。这可能导致解释器的误导性错误。正确的保护方法是,在执行任何不安全的操作前保存未决异常,然后在完成后恢复。这可以通过" +" :c:func:`PyErr_Fetch` 和 :c:func:`PyErr_Restore` 函数来实现::" + +#: ../../extending/newtypes.rst:109 +msgid "" +"static void\n" +"my_dealloc(PyObject *obj)\n" +"{\n" +" MyObject *self = (MyObject *) obj;\n" +" PyObject *cbresult;\n" +"\n" +" if (self->my_callback != NULL) {\n" +" PyObject *err_type, *err_value, *err_traceback;\n" +"\n" +" /* This saves the current exception state */\n" +" PyErr_Fetch(&err_type, &err_value, &err_traceback);\n" +"\n" +" cbresult = PyObject_CallNoArgs(self->my_callback);\n" +" if (cbresult == NULL) {\n" +" PyErr_WriteUnraisable(self->my_callback);\n" +" }\n" +" else {\n" +" Py_DECREF(cbresult);\n" +" }\n" +"\n" +" /* This restores the saved exception state */\n" +" PyErr_Restore(err_type, err_value, err_traceback);\n" +"\n" +" Py_DECREF(self->my_callback);\n" +" }\n" +" Py_TYPE(self)->tp_free(self);\n" +"}" +msgstr "" +"static void\n" +"my_dealloc(PyObject *obj)\n" +"{\n" +" MyObject *self = (MyObject *) obj;\n" +" PyObject *cbresult;\n" +"\n" +" if (self->my_callback != NULL) {\n" +" PyObject *err_type, *err_value, *err_traceback;\n" +"\n" +" /* 这里保存当前异常状态 */\n" +" PyErr_Fetch(&err_type, &err_value, &err_traceback);\n" +"\n" +" cbresult = PyObject_CallNoArgs(self->my_callback);\n" +" if (cbresult == NULL) {\n" +" PyErr_WriteUnraisable(self->my_callback);\n" +" }\n" +" else {\n" +" Py_DECREF(cbresult);\n" +" }\n" +"\n" +" /* 这里恢复被保存的异常状态 */\n" +" PyErr_Restore(err_type, err_value, err_traceback);\n" +"\n" +" Py_DECREF(self->my_callback);\n" +" }\n" +" Py_TYPE(self)->tp_free(self);\n" +"}" + +#: ../../extending/newtypes.rst:138 +msgid "" +"There are limitations to what you can safely do in a deallocator function. " +"First, if your type supports garbage collection (using " +":c:member:`~PyTypeObject.tp_traverse` and/or " +":c:member:`~PyTypeObject.tp_clear`), some of the object's members can have " +"been cleared or finalized by the time :c:member:`~PyTypeObject.tp_dealloc` " +"is called. Second, in :c:member:`~PyTypeObject.tp_dealloc`, your object is " +"in an unstable state: its reference count is equal to zero. Any call to a " +"non-trivial object or API (as in the example above) might end up calling " +":c:member:`~PyTypeObject.tp_dealloc` again, causing a double free and a " +"crash." +msgstr "" +"你能在释放器函数中安全执行的操作是有限的。首先,如果你的类型支持垃圾回收 (使用 " +":c:member:`~PyTypeObject.tp_traverse` 和/或 " +":c:member:`~PyTypeObject.tp_clear`),对象的部分成员可以在调用 " +":c:member:`~PyTypeObject.tp_dealloc` 时被清空或终结。其次,在 " +":c:member:`~PyTypeObject.tp_dealloc` 中,你的对象将处于不稳定状态:它的引用计数等于零。任何对非琐碎对象或 API " +"的调用 (如上面的示例所做的) 最终都可能会再次调用 :c:member:`~PyTypeObject.tp_dealloc`,导致双重释放并发生崩溃。" + +#: ../../extending/newtypes.rst:147 +msgid "" +"Starting with Python 3.4, it is recommended not to put any complex " +"finalization code in :c:member:`~PyTypeObject.tp_dealloc`, and instead use " +"the new :c:member:`~PyTypeObject.tp_finalize` type method." +msgstr "" +"从 Python 3.4 开始,推荐不要在 :c:member:`~PyTypeObject.tp_dealloc` 放复杂的终结代码,而是使用新的 " +":c:member:`~PyTypeObject.tp_finalize` 类型方法。" + +#: ../../extending/newtypes.rst:152 +msgid ":pep:`442` explains the new finalization scheme." +msgstr ":pep:`442` 解释了新的终结方案。" + +#: ../../extending/newtypes.rst:159 +msgid "Object Presentation" +msgstr "对象展示" + +#: ../../extending/newtypes.rst:161 +msgid "" +"In Python, there are two ways to generate a textual representation of an " +"object: the :func:`repr` function, and the :func:`str` function. (The " +":func:`print` function just calls :func:`str`.) These handlers are both " +"optional." +msgstr "" +"在 Python 中,有两种方式可以生成对象的文本表示::func:`repr` 函数和 :func:`str` 函数。 (:func:`print` " +"函数会直接调用 :func:`str`。) 这些处理程序都是可选的。" + +#: ../../extending/newtypes.rst:167 +msgid "" +"reprfunc tp_repr;\n" +"reprfunc tp_str;" +msgstr "" +"reprfunc tp_repr;\n" +"reprfunc tp_str;" + +#: ../../extending/newtypes.rst:170 +msgid "" +"The :c:member:`~PyTypeObject.tp_repr` handler should return a string object " +"containing a representation of the instance for which it is called. Here is" +" a simple example::" +msgstr "" +":c:member:`~PyTypeObject.tp_repr` 处理程序应该返回一个字符串对象,其中包含调用它的实例的表示形式。 " +"下面是一个简单的例子::" + +#: ../../extending/newtypes.rst:174 +msgid "" +"static PyObject *\n" +"newdatatype_repr(PyObject *op)\n" +"{\n" +" newdatatypeobject *self = (newdatatypeobject *) op;\n" +" return PyUnicode_FromFormat(\"Repr-ified_newdatatype{{size:%d}}\",\n" +" self->obj_UnderlyingDatatypePtr->size);\n" +"}" +msgstr "" +"static PyObject *\n" +"newdatatype_repr(PyObject *op)\n" +"{\n" +" newdatatypeobject *self = (newdatatypeobject *) op;\n" +" return PyUnicode_FromFormat(\"Repr-ified_newdatatype{{size:%d}}\",\n" +" self->obj_UnderlyingDatatypePtr->size);\n" +"}" + +#: ../../extending/newtypes.rst:182 +msgid "" +"If no :c:member:`~PyTypeObject.tp_repr` handler is specified, the " +"interpreter will supply a representation that uses the type's " +":c:member:`~PyTypeObject.tp_name` and a uniquely identifying value for the " +"object." +msgstr "" +"如果没有指定 :c:member:`~PyTypeObject.tp_repr` 处理器,解释器将提供一个使用类型的 " +":c:member:`~PyTypeObject.tp_name` 的表示形式以及对象的唯一标识值。" + +#: ../../extending/newtypes.rst:186 +msgid "" +"The :c:member:`~PyTypeObject.tp_str` handler is to :func:`str` what the " +":c:member:`~PyTypeObject.tp_repr` handler described above is to " +":func:`repr`; that is, it is called when Python code calls :func:`str` on an" +" instance of your object. Its implementation is very similar to the " +":c:member:`~PyTypeObject.tp_repr` function, but the resulting string is " +"intended for human consumption. If :c:member:`~PyTypeObject.tp_str` is not " +"specified, the :c:member:`~PyTypeObject.tp_repr` handler is used instead." +msgstr "" +":c:member:`~PyTypeObject.tp_str` 处理器对于 :func:`str` 就如上述的 " +":c:member:`~PyTypeObject.tp_repr` 处理器对于 :func:`repr` 一样;也就是说,它会在当 Python " +"代码在你的对象的某个实例上调用 :func:`str` 时被调用。它的实现与 :c:member:`~PyTypeObject.tp_repr` " +"函数非常相似,但其结果字符串是供人类查看的。如果未指定 :c:member:`~PyTypeObject.tp_str`,则会使用 " +":c:member:`~PyTypeObject.tp_repr` 处理器来代替。" + +#: ../../extending/newtypes.rst:193 +msgid "Here is a simple example::" +msgstr "下面是一个简单的例子::" + +#: ../../extending/newtypes.rst:195 +msgid "" +"static PyObject *\n" +"newdatatype_str(PyObject *op)\n" +"{\n" +" newdatatypeobject *self = (newdatatypeobject *) op;\n" +" return PyUnicode_FromFormat(\"Stringified_newdatatype{{size:%d}}\",\n" +" self->obj_UnderlyingDatatypePtr->size);\n" +"}" +msgstr "" +"static PyObject *\n" +"newdatatype_str(PyObject *op)\n" +"{\n" +" newdatatypeobject *self = (newdatatypeobject *) op;\n" +" return PyUnicode_FromFormat(\"Stringified_newdatatype{{size:%d}}\",\n" +" self->obj_UnderlyingDatatypePtr->size);\n" +"}" + +#: ../../extending/newtypes.rst:206 +msgid "Attribute Management" +msgstr "属性管理" + +#: ../../extending/newtypes.rst:208 +msgid "" +"For every object which can support attributes, the corresponding type must " +"provide the functions that control how the attributes are resolved. There " +"needs to be a function which can retrieve attributes (if any are defined), " +"and another to set attributes (if setting attributes is allowed). Removing " +"an attribute is a special case, for which the new value passed to the " +"handler is ``NULL``." +msgstr "" +"对于每个可支持属性操作的对象,相应的类型必须提供用于控制属性获取方式的函数。 " +"需要有一个能够检索属性的函数(如果定义了任何属性)还要有另一个函数负责设置属性(如果允许设置属性)。 " +"移除属性是一种特殊情况,在此情况下要传给处理器的新值为 ``NULL``。" + +#: ../../extending/newtypes.rst:214 +msgid "" +"Python supports two pairs of attribute handlers; a type that supports " +"attributes only needs to implement the functions for one pair. The " +"difference is that one pair takes the name of the attribute as a " +":c:expr:`char\\*`, while the other accepts a :c:expr:`PyObject*`. Each type" +" can use whichever pair makes more sense for the implementation's " +"convenience. ::" +msgstr "" +"Python 支持两对属性处理器;一个支持属性操作的类型只需要实现其中一对的函数。两者的差别在于一对接受 :c:expr:`char\\*` " +"作为属性名称,而另一对则接受 :c:expr:`PyObject*`。每种类型都可以选择使用对于实现的便利性来说更有意义的那一对。 ::" + +#: ../../extending/newtypes.rst:220 +msgid "" +"getattrfunc tp_getattr; /* char * version */\n" +"setattrfunc tp_setattr;\n" +"/* ... */\n" +"getattrofunc tp_getattro; /* PyObject * version */\n" +"setattrofunc tp_setattro;" +msgstr "" +"getattrfunc tp_getattr; /* char * 版本 */\n" +"setattrfunc tp_setattr;\n" +"/* ... */\n" +"getattrofunc tp_getattro; /* PyObject * 版本 */\n" +"setattrofunc tp_setattro;" + +#: ../../extending/newtypes.rst:226 +msgid "" +"If accessing attributes of an object is always a simple operation (this will" +" be explained shortly), there are generic implementations which can be used " +"to provide the :c:expr:`PyObject*` version of the attribute management " +"functions. The actual need for type-specific attribute handlers almost " +"completely disappeared starting with Python 2.2, though there are many " +"examples which have not been updated to use some of the new generic " +"mechanism that is available." +msgstr "" +"如果访问一个对象的属性总是为简单操作(这将在下文进行解释),则有一些泛用实现可被用来提供 :c:expr:`PyObject*` 版本的属性管理函数。 " +"从 Python 2.2 开始对于类型专属的属性处理器的实际需要几乎已完全消失,尽管还存在着许多尚未更新为使用某种新的可选泛用机制的例子。" + +#: ../../extending/newtypes.rst:237 +msgid "Generic Attribute Management" +msgstr "泛型属性管理" + +#: ../../extending/newtypes.rst:239 +msgid "" +"Most extension types only use *simple* attributes. So, what makes the " +"attributes simple? There are only a couple of conditions that must be met:" +msgstr "大多数扩展类型只使用 **简单** 属性,那么,是什么让属性变得“简单”呢?只需要满足下面几个条件:" + +#: ../../extending/newtypes.rst:242 +msgid "" +"The name of the attributes must be known when :c:func:`PyType_Ready` is " +"called." +msgstr "当调用 :c:func:`PyType_Ready` 时,必须知道属性的名称。" + +#: ../../extending/newtypes.rst:245 +msgid "" +"No special processing is needed to record that an attribute was looked up or" +" set, nor do actions need to be taken based on the value." +msgstr "不需要特殊的处理来记录属性是否被查找或设置,也不需要根据值采取操作。" + +#: ../../extending/newtypes.rst:248 +msgid "" +"Note that this list does not place any restrictions on the values of the " +"attributes, when the values are computed, or how relevant data is stored." +msgstr "请注意,此列表不对属性的值、值的计算时间或相关数据的存储方式施加任何限制。" + +#: ../../extending/newtypes.rst:251 +msgid "" +"When :c:func:`PyType_Ready` is called, it uses three tables referenced by " +"the type object to create :term:`descriptor`\\s which are placed in the " +"dictionary of the type object. Each descriptor controls access to one " +"attribute of the instance object. Each of the tables is optional; if all " +"three are ``NULL``, instances of the type will only have attributes that are" +" inherited from their base type, and should leave the " +":c:member:`~PyTypeObject.tp_getattro` and " +":c:member:`~PyTypeObject.tp_setattro` fields ``NULL`` as well, allowing the " +"base type to handle attributes." +msgstr "" +"当 :c:func:`PyType_Ready` 被调用时,它会使用由类型对象所引用的三个表来创建要放置到类型对象的字典中的 " +":term:`descriptor`。每个描述器控制对实例对象的一个属性的访问。每个表都是可选的;如果三个表全都为 " +"``NULL``,则该类型的实例将只有从它们的基础类型继承来的属性,并且还应当让 " +":c:member:`~PyTypeObject.tp_getattro` 和 " +":c:member:`~PyTypeObject.tp_setattro` 字段保持为 ``NULL``,以允许由基础类型处理这些属性。" + +#: ../../extending/newtypes.rst:259 +msgid "The tables are declared as three fields of the type object::" +msgstr "这些表被声明为类型对象的三个字段::" + +#: ../../extending/newtypes.rst:261 +msgid "" +"struct PyMethodDef *tp_methods;\n" +"struct PyMemberDef *tp_members;\n" +"struct PyGetSetDef *tp_getset;" +msgstr "" +"struct PyMethodDef *tp_methods;\n" +"struct PyMemberDef *tp_members;\n" +"struct PyGetSetDef *tp_getset;" + +#: ../../extending/newtypes.rst:265 +msgid "" +"If :c:member:`~PyTypeObject.tp_methods` is not ``NULL``, it must refer to an" +" array of :c:type:`PyMethodDef` structures. Each entry in the table is an " +"instance of this structure::" +msgstr "" +"如果 :c:member:`~PyTypeObject.tp_methods` 不为 ``NULL``,则它必须指向一个由 " +":c:type:`PyMethodDef` 结构体组成的数组。表中的每个条目都是该结构体的一个实例::" + +#: ../../extending/newtypes.rst:269 +msgid "" +"typedef struct PyMethodDef {\n" +" const char *ml_name; /* method name */\n" +" PyCFunction ml_meth; /* implementation function */\n" +" int ml_flags; /* flags */\n" +" const char *ml_doc; /* docstring */\n" +"} PyMethodDef;" +msgstr "" +"typedef struct PyMethodDef {\n" +" const char *ml_name; /* 方法名称 */\n" +" PyCFunction ml_meth; /* 实现函数 */\n" +" int ml_flags; /* 旗标 */\n" +" const char *ml_doc; /* 文档字符串 */\n" +"} PyMethodDef;" + +#: ../../extending/newtypes.rst:276 +msgid "" +"One entry should be defined for each method provided by the type; no entries" +" are needed for methods inherited from a base type. One additional entry is" +" needed at the end; it is a sentinel that marks the end of the array. The " +":c:member:`~PyMethodDef.ml_name` field of the sentinel must be ``NULL``." +msgstr "" +"应当为该类型所提供的每个方法都应定义一个条目;从基类型继承来的方法无需定义条目。还需要在末尾加一个额外的条目;它是一个标记数组结束的哨兵条目。 " +"该哨兵条目的 :c:member:`~PyMethodDef.ml_name` 字段必须为 ``NULL``。" + +#: ../../extending/newtypes.rst:281 +msgid "" +"The second table is used to define attributes which map directly to data " +"stored in the instance. A variety of primitive C types are supported, and " +"access may be read-only or read-write. The structures in the table are " +"defined as::" +msgstr "第二个表被用来定义要直接映射到实例中的数据的属性。各种原始 C 类型均受到支持,并且访问方式可以为只读或读写。表中的结构体被定义为::" + +#: ../../extending/newtypes.rst:285 +msgid "" +"typedef struct PyMemberDef {\n" +" const char *name;\n" +" int type;\n" +" int offset;\n" +" int flags;\n" +" const char *doc;\n" +"} PyMemberDef;" +msgstr "" +"typedef struct PyMemberDef {\n" +" const char *name;\n" +" int type;\n" +" int offset;\n" +" int flags;\n" +" const char *doc;\n" +"} PyMemberDef;" + +#: ../../extending/newtypes.rst:293 +msgid "" +"For each entry in the table, a :term:`descriptor` will be constructed and " +"added to the type which will be able to extract a value from the instance " +"structure. The :c:member:`~PyMemberDef.type` field should contain a type " +"code like :c:macro:`Py_T_INT` or :c:macro:`Py_T_DOUBLE`; the value will be " +"used to determine how to convert Python values to and from C values. The " +":c:member:`~PyMemberDef.flags` field is used to store flags which control " +"how the attribute can be accessed: you can set it to :c:macro:`Py_READONLY` " +"to prevent Python code from setting it." +msgstr "" +"对于表中的每个条目,都将构建一个 :term:`descriptor` 并添加到类型中使其能够从实例结构体中提取值。 " +":c:member:`~PyMemberDef.type` 字段应包含一个类型代码如 :c:macro:`Py_T_INT` 或 " +":c:macro:`Py_T_DOUBLE`;该值将用于确定如何将 Python 值转换为 C 值或反之。 " +":c:member:`~PyMemberDef.flags` 字段用于保存控制属性要如何被访问的旗标:你可以将其设为 " +":c:macro:`Py_READONLY` 以防止 Python 代码设置它。" + +#: ../../extending/newtypes.rst:301 +msgid "" +"An interesting advantage of using the :c:member:`~PyTypeObject.tp_members` " +"table to build descriptors that are used at runtime is that any attribute " +"defined this way can have an associated doc string simply by providing the " +"text in the table. An application can use the introspection API to retrieve" +" the descriptor from the class object, and get the doc string using its " +":attr:`~type.__doc__` attribute." +msgstr "" +"使用 :c:member:`~PyTypeObject.tp_members` " +"表来构建用于运行时的描述器还有一个有趣的优点是任何以这种方式定义的属性都可以简单地通过在表中提供文本来设置一个相关联的文档字符串。 " +"一个应用程序可以使用自省 API 从类对象获取描述器,并使用其 :attr:`~type.__doc__` 属性来获取文档字符串。" + +#: ../../extending/newtypes.rst:307 +msgid "" +"As with the :c:member:`~PyTypeObject.tp_methods` table, a sentinel entry " +"with a :c:member:`~PyMethodDef.ml_name` value of ``NULL`` is required." +msgstr "" +"与 :c:member:`~PyTypeObject.tp_methods` 表一样,需要有一个值为 ``NULL`` 的 " +":c:member:`~PyMethodDef.ml_name` 哨兵条目。" + +#: ../../extending/newtypes.rst:321 +msgid "Type-specific Attribute Management" +msgstr "类型专属的属性管理" + +#: ../../extending/newtypes.rst:323 +msgid "" +"For simplicity, only the :c:expr:`char\\*` version will be demonstrated " +"here; the type of the name parameter is the only difference between the " +":c:expr:`char\\*` and :c:expr:`PyObject*` flavors of the interface. This " +"example effectively does the same thing as the generic example above, but " +"does not use the generic support added in Python 2.2. It explains how the " +"handler functions are called, so that if you do need to extend their " +"functionality, you'll understand what needs to be done." +msgstr "" +"为了简单起见,这里只演示 :c:expr:`char\\*` 版本;name 形参的类型是 :c:expr:`char\\*` 和 " +":c:expr:`PyObject*` 风格接口之间的唯一区别。这个示例实际上做了与上面的泛用示例相同的事情,但没有使用在 Python 2.2 " +"中增加的泛用支持。它解释了处理器函数是如何被调用的,因此如果你确实需要扩展它们的功能,你就会明白有什么是需要做的。" + +#: ../../extending/newtypes.rst:331 +msgid "" +"The :c:member:`~PyTypeObject.tp_getattr` handler is called when the object " +"requires an attribute look-up. It is called in the same situations where " +"the :meth:`~object.__getattr__` method of a class would be called." +msgstr "" +":c:member:`~PyTypeObject.tp_getattr` 处理器会在对象需要进行属性查找时被调用。它被调用的场合与一个类的 " +":meth:`~object.__getattr__` 方法要被调用的场合相同。" + +#: ../../extending/newtypes.rst:335 +msgid "Here is an example::" +msgstr "例如:" + +#: ../../extending/newtypes.rst:337 +msgid "" +"static PyObject *\n" +"newdatatype_getattr(PyObject *op, char *name)\n" +"{\n" +" newdatatypeobject *self = (newdatatypeobject *) op;\n" +" if (strcmp(name, \"data\") == 0) {\n" +" return PyLong_FromLong(self->data);\n" +" }\n" +"\n" +" PyErr_Format(PyExc_AttributeError,\n" +" \"'%.100s' object has no attribute '%.400s'\",\n" +" Py_TYPE(self)->tp_name, name);\n" +" return NULL;\n" +"}" +msgstr "" +"static PyObject *\n" +"newdatatype_getattr(PyObject *op, char *name)\n" +"{\n" +" newdatatypeobject *self = (newdatatypeobject *) op;\n" +" if (strcmp(name, \"data\") == 0) {\n" +" return PyLong_FromLong(self->data);\n" +" }\n" +"\n" +" PyErr_Format(PyExc_AttributeError,\n" +" \"'%.100s' object has no attribute '%.400s'\",\n" +" Py_TYPE(self)->tp_name, name);\n" +" return NULL;\n" +"}" + +#: ../../extending/newtypes.rst:351 +msgid "" +"The :c:member:`~PyTypeObject.tp_setattr` handler is called when the " +":meth:`~object.__setattr__` or :meth:`~object.__delattr__` method of a class" +" instance would be called. When an attribute should be deleted, the third " +"parameter will be ``NULL``. Here is an example that simply raises an " +"exception; if this were really all you wanted, the " +":c:member:`~PyTypeObject.tp_setattr` handler should be set to ``NULL``. ::" +msgstr "" +"当调用类实例的 :meth:`~object.__setattr__` 或 :meth:`~object.__delattr__` 方法时会调用 " +":c:member:`~PyTypeObject.tp_setattr` 处理器。当需要删除一个属性时,第三个形参将为 ``NULL``。 " +"下面是一个简单地引发异常的例子;如果这确实是你想要的,则 :c:member:`~PyTypeObject.tp_setattr` 处理器应当被设为 " +"``NULL``. ::" + +#: ../../extending/newtypes.rst:357 +msgid "" +"static int\n" +"newdatatype_setattr(PyObject *op, char *name, PyObject *v)\n" +"{\n" +" PyErr_Format(PyExc_RuntimeError, \"Read-only attribute: %s\", name);\n" +" return -1;\n" +"}" +msgstr "" +"static int\n" +"newdatatype_setattr(PyObject *op, char *name, PyObject *v)\n" +"{\n" +" PyErr_Format(PyExc_RuntimeError, \"Read-only attribute: %s\", name);\n" +" return -1;\n" +"}" + +#: ../../extending/newtypes.rst:365 +msgid "Object Comparison" +msgstr "对象比较" + +#: ../../extending/newtypes.rst:369 +msgid "richcmpfunc tp_richcompare;" +msgstr "richcmpfunc tp_richcompare;" + +#: ../../extending/newtypes.rst:371 +msgid "" +"The :c:member:`~PyTypeObject.tp_richcompare` handler is called when " +"comparisons are needed. It is analogous to the :ref:`rich comparison " +"methods `, like :meth:`!__lt__`, and also called by " +":c:func:`PyObject_RichCompare` and :c:func:`PyObject_RichCompareBool`." +msgstr "" +":c:member:`~PyTypeObject.tp_richcompare` 处理器会在需要进行比较时被调用。它类似于 :ref:`富比较方法 " +"`,例如 :meth:`!__lt__`,并会被 :c:func:`PyObject_RichCompare` 和 " +":c:func:`PyObject_RichCompareBool` 调用。" + +#: ../../extending/newtypes.rst:376 +msgid "" +"This function is called with two Python objects and the operator as " +"arguments, where the operator is one of ``Py_EQ``, ``Py_NE``, ``Py_LE``, " +"``Py_GE``, ``Py_LT`` or ``Py_GT``. It should compare the two objects with " +"respect to the specified operator and return ``Py_True`` or ``Py_False`` if " +"the comparison is successful, ``Py_NotImplemented`` to indicate that " +"comparison is not implemented and the other object's comparison method " +"should be tried, or ``NULL`` if an exception was set." +msgstr "" +"此函数被调用时将传入两个 Python 对象和运算符作为参数,其中运算符为 ``Py_EQ``, ``Py_NE``, ``Py_LE``, " +"``Py_GE``, ``Py_LT`` 或 ``Py_GT`` 之一。它应当使用指定的运算符来比较两个对象并在比较操作成功时返回 " +"``Py_True`` 或 ``Py_False``,如果比较操作未被实现并应尝试其他对象比较方法时则返回 " +"``Py_NotImplemented``,或者如果设置了异常则返回 ``NULL``。" + +#: ../../extending/newtypes.rst:384 +msgid "" +"Here is a sample implementation, for a datatype that is considered equal if " +"the size of an internal pointer is equal::" +msgstr "下面是一个示例实现,该数据类型如果内部指针的大小相等就认为是相等的::" + +#: ../../extending/newtypes.rst:387 +msgid "" +"static PyObject *\n" +"newdatatype_richcmp(PyObject *lhs, PyObject *rhs, int op)\n" +"{\n" +" newdatatypeobject *obj1 = (newdatatypeobject *) lhs;\n" +" newdatatypeobject *obj2 = (newdatatypeobject *) rhs;\n" +" PyObject *result;\n" +" int c, size1, size2;\n" +"\n" +" /* code to make sure that both arguments are of type\n" +" newdatatype omitted */\n" +"\n" +" size1 = obj1->obj_UnderlyingDatatypePtr->size;\n" +" size2 = obj2->obj_UnderlyingDatatypePtr->size;\n" +"\n" +" switch (op) {\n" +" case Py_LT: c = size1 < size2; break;\n" +" case Py_LE: c = size1 <= size2; break;\n" +" case Py_EQ: c = size1 == size2; break;\n" +" case Py_NE: c = size1 != size2; break;\n" +" case Py_GT: c = size1 > size2; break;\n" +" case Py_GE: c = size1 >= size2; break;\n" +" }\n" +" result = c ? Py_True : Py_False;\n" +" return Py_NewRef(result);\n" +" }" +msgstr "" +"static PyObject *\n" +"newdatatype_richcmp(PyObject *lhs, PyObject *rhs, int op)\n" +"{\n" +" newdatatypeobject *obj1 = (newdatatypeobject *) lhs;\n" +" newdatatypeobject *obj2 = (newdatatypeobject *) rhs;\n" +" PyObject *result;\n" +" int c, size1, size2;\n" +"\n" +" /* 省略了确保两个参数均为\n" +" newdatatype 类型的代码 */\n" +"\n" +" size1 = obj1->obj_UnderlyingDatatypePtr->size;\n" +" size2 = obj2->obj_UnderlyingDatatypePtr->size;\n" +"\n" +" switch (op) {\n" +" case Py_LT: c = size1 < size2; break;\n" +" case Py_LE: c = size1 <= size2; break;\n" +" case Py_EQ: c = size1 == size2; break;\n" +" case Py_NE: c = size1 != size2; break;\n" +" case Py_GT: c = size1 > size2; break;\n" +" case Py_GE: c = size1 >= size2; break;\n" +" }\n" +" result = c ? Py_True : Py_False;\n" +" return Py_NewRef(result);\n" +" }" + +#: ../../extending/newtypes.rst:415 +msgid "Abstract Protocol Support" +msgstr "抽象协议支持" + +#: ../../extending/newtypes.rst:417 +msgid "" +"Python supports a variety of *abstract* 'protocols;' the specific interfaces" +" provided to use these interfaces are documented in :ref:`abstract`." +msgstr "Python 支持多种 *抽象* '协议';被提供来使用这些接口的专门接口说明请在 :ref:`abstract` 中查看。" + +#: ../../extending/newtypes.rst:421 +msgid "" +"A number of these abstract interfaces were defined early in the development " +"of the Python implementation. In particular, the number, mapping, and " +"sequence protocols have been part of Python since the beginning. Other " +"protocols have been added over time. For protocols which depend on several " +"handler routines from the type implementation, the older protocols have been" +" defined as optional blocks of handlers referenced by the type object. For " +"newer protocols there are additional slots in the main type object, with a " +"flag bit being set to indicate that the slots are present and should be " +"checked by the interpreter. (The flag bit does not indicate that the slot " +"values are non-``NULL``. The flag may be set to indicate the presence of a " +"slot, but a slot may still be unfilled.) ::" +msgstr "" +"这些抽象接口很多都是在 Python 实现开发的早期被定义的。特别地,数字、映射和序列协议从一开始就已经是 Python 的组成部分。 " +"其他协议则是后来添加的。对于依赖某些来自类型实现的处理器例程的协议来说,较旧的协议被定义为类型对象所引用的处理器的可选块。 " +"对于较新的协议来说在主类型对象中还有额外的槽位,并带有一个预设旗标位来指明存在该槽位并应当由解释器来检查。 (此旗标位并不会指明槽位值非 " +"``NULL`` 的情况,可以设置该旗标来指明一个槽位的存在,但此槽位仍可能保持未填充的状态。) ::" + +#: ../../extending/newtypes.rst:432 +msgid "" +"PyNumberMethods *tp_as_number;\n" +"PySequenceMethods *tp_as_sequence;\n" +"PyMappingMethods *tp_as_mapping;" +msgstr "" +"PyNumberMethods *tp_as_number;\n" +"PySequenceMethods *tp_as_sequence;\n" +"PyMappingMethods *tp_as_mapping;" + +#: ../../extending/newtypes.rst:436 +msgid "" +"If you wish your object to be able to act like a number, a sequence, or a " +"mapping object, then you place the address of a structure that implements " +"the C type :c:type:`PyNumberMethods`, :c:type:`PySequenceMethods`, or " +":c:type:`PyMappingMethods`, respectively. It is up to you to fill in this " +"structure with appropriate values. You can find examples of the use of each " +"of these in the :file:`Objects` directory of the Python source distribution." +" ::" +msgstr "" +"如果你希望你的对象的行为类似一个数字、序列或映射对象,那么你就要分别放置一个实现了 C 类型 :c:type:`PyNumberMethods`, " +":c:type:`PySequenceMethods` 或 :c:type:`PyMappingMethods`, 的结构体的地址。 " +"你要负责将适当的值填入这些结构体。你可以在 Python 源代码发布版的 :file:`Objects` 目录中找到这些对象各自的用法示例。 ::" + +#: ../../extending/newtypes.rst:443 +msgid "hashfunc tp_hash;" +msgstr "hashfunc tp_hash;" + +#: ../../extending/newtypes.rst:445 +msgid "" +"This function, if you choose to provide it, should return a hash number for " +"an instance of your data type. Here is a simple example::" +msgstr "如果你选择提供此函数,则它应当为你的数据类型的实例返回一个哈希数值。下面是一个简单的示例::" + +#: ../../extending/newtypes.rst:448 +msgid "" +"static Py_hash_t\n" +"newdatatype_hash(PyObject *op)\n" +"{\n" +" newdatatypeobject *self = (newdatatypeobject *) op;\n" +" Py_hash_t result;\n" +" result = self->some_size + 32767 * self->some_number;\n" +" if (result == -1) {\n" +" result = -2;\n" +" }\n" +" return result;\n" +"}" +msgstr "" +"static Py_hash_t\n" +"newdatatype_hash(PyObject *op)\n" +"{\n" +" newdatatypeobject *self = (newdatatypeobject *) op;\n" +" Py_hash_t result;\n" +" result = self->some_size + 32767 * self->some_number;\n" +" if (result == -1) {\n" +" result = -2;\n" +" }\n" +" return result;\n" +"}" + +#: ../../extending/newtypes.rst:460 +msgid "" +":c:type:`Py_hash_t` is a signed integer type with a platform-varying width. " +"Returning ``-1`` from :c:member:`~PyTypeObject.tp_hash` indicates an error, " +"which is why you should be careful to avoid returning it when hash " +"computation is successful, as seen above." +msgstr "" +":c:type:`Py_hash_t` 是一个在宽度取决于具体平台的有符号整数类型。从 " +":c:member:`~PyTypeObject.tp_hash` 返回 ``-1`` " +"表示发生了错误,这就是为什么你应当注意避免在哈希运算成功时返回它,如上面所演示的。" + +#: ../../extending/newtypes.rst:467 +msgid "ternaryfunc tp_call;" +msgstr "ternaryfunc tp_call;" + +#: ../../extending/newtypes.rst:469 +msgid "" +"This function is called when an instance of your data type is \"called\", " +"for example, if ``obj1`` is an instance of your data type and the Python " +"script contains ``obj1('hello')``, the :c:member:`~PyTypeObject.tp_call` " +"handler is invoked." +msgstr "" +"此函数会在“调用”你的数据类型实例时被调用,举例来说,如果 ``obj1`` 是你的数据类型的实例而 Python 脚本包含了 " +"``obj1('hello')``,则将唤起 :c:member:`~PyTypeObject.tp_call` 处理器。" + +#: ../../extending/newtypes.rst:473 +msgid "This function takes three arguments:" +msgstr "此函数接受三个参数:" + +#: ../../extending/newtypes.rst:475 +msgid "" +"*self* is the instance of the data type which is the subject of the call. If" +" the call is ``obj1('hello')``, then *self* is ``obj1``." +msgstr "*self* 是作为调用目标的数据类型实例。如果调用是 ``obj1('hello')``,则 *self* 为 ``obj1``。" + +#: ../../extending/newtypes.rst:478 +msgid "" +"*args* is a tuple containing the arguments to the call. You can use " +":c:func:`PyArg_ParseTuple` to extract the arguments." +msgstr "*args* 是包含调用参数的元组。你可以使用 :c:func:`PyArg_ParseTuple` 来提取参数。" + +#: ../../extending/newtypes.rst:481 +msgid "" +"*kwds* is a dictionary of keyword arguments that were passed. If this is " +"non-``NULL`` and you support keyword arguments, use " +":c:func:`PyArg_ParseTupleAndKeywords` to extract the arguments. If you do " +"not want to support keyword arguments and this is non-``NULL``, raise a " +":exc:`TypeError` with a message saying that keyword arguments are not " +"supported." +msgstr "" +"*kwds* 是由传入的关键字参数组成的字典。如果它不为 ``NULL`` 且你支持关键字参数,则可使用 " +":c:func:`PyArg_ParseTupleAndKeywords` 来提取参数。如果你不想支持关键字参数而它为非 ``NULL`` 值,则会引发" +" :exc:`TypeError` 并附带一个提示不支持关键字参数的消息。" + +#: ../../extending/newtypes.rst:487 +msgid "Here is a toy ``tp_call`` implementation::" +msgstr "下面是一个演示性的 ``tp_call`` 实现::" + +#: ../../extending/newtypes.rst:489 +msgid "" +"static PyObject *\n" +"newdatatype_call(PyObject *op, PyObject *args, PyObject *kwds)\n" +"{\n" +" newdatatypeobject *self = (newdatatypeobject *) op;\n" +" PyObject *result;\n" +" const char *arg1;\n" +" const char *arg2;\n" +" const char *arg3;\n" +"\n" +" if (!PyArg_ParseTuple(args, \"sss:call\", &arg1, &arg2, &arg3)) {\n" +" return NULL;\n" +" }\n" +" result = PyUnicode_FromFormat(\n" +" \"Returning -- value: [%d] arg1: [%s] arg2: [%s] arg3: [%s]\\n\",\n" +" self->obj_UnderlyingDatatypePtr->size,\n" +" arg1, arg2, arg3);\n" +" return result;\n" +"}" +msgstr "" +"static PyObject *\n" +"newdatatype_call(PyObject *op, PyObject *args, PyObject *kwds)\n" +"{\n" +" newdatatypeobject *self = (newdatatypeobject *) op;\n" +" PyObject *result;\n" +" const char *arg1;\n" +" const char *arg2;\n" +" const char *arg3;\n" +"\n" +" if (!PyArg_ParseTuple(args, \"sss:call\", &arg1, &arg2, &arg3)) {\n" +" return NULL;\n" +" }\n" +" result = PyUnicode_FromFormat(\n" +" \"Returning -- value: [%d] arg1: [%s] arg2: [%s] arg3: [%s]\\n\",\n" +" self->obj_UnderlyingDatatypePtr->size,\n" +" arg1, arg2, arg3);\n" +" return result;\n" +"}" + +#: ../../extending/newtypes.rst:510 +msgid "" +"/* Iterators */\n" +"getiterfunc tp_iter;\n" +"iternextfunc tp_iternext;" +msgstr "" +"/* Iterators */\n" +"getiterfunc tp_iter;\n" +"iternextfunc tp_iternext;" + +#: ../../extending/newtypes.rst:514 +msgid "" +"These functions provide support for the iterator protocol. Both handlers " +"take exactly one parameter, the instance for which they are being called, " +"and return a new reference. In the case of an error, they should set an " +"exception and return ``NULL``. :c:member:`~PyTypeObject.tp_iter` " +"corresponds to the Python :meth:`~object.__iter__` method, while " +":c:member:`~PyTypeObject.tp_iternext` corresponds to the Python " +":meth:`~iterator.__next__` method." +msgstr "" +"这些函数提供了对迭代器协议的支持。这两个处理器都只接受一个形参,即它们被调用时所使用的实例,并返回一个新的引用。 当发生错误时,它们应设置一个异常并返回" +" ``NULL``。 :c:member:`~PyTypeObject.tp_iter` 对应于 Python " +":meth:`~object.__iter__` 方法,而 :c:member:`~PyTypeObject.tp_iternext` 对应于 " +"Python :meth:`~iterator.__next__` 方法。" + +#: ../../extending/newtypes.rst:521 +msgid "" +"Any :term:`iterable` object must implement the " +":c:member:`~PyTypeObject.tp_iter` handler, which must return an " +":term:`iterator` object. Here the same guidelines apply as for Python " +"classes:" +msgstr "" +"任何 :term:`iterable` 对象都必须实现 :c:member:`~PyTypeObject.tp_iter` 处理器,该处理器必须返回一个" +" :term:`iterator` 对象。下面是与 Python 类所应用的同一个指导原则:" + +#: ../../extending/newtypes.rst:525 +msgid "" +"For collections (such as lists and tuples) which can support multiple " +"independent iterators, a new iterator should be created and returned by each" +" call to :c:member:`~PyTypeObject.tp_iter`." +msgstr "" +"对于可以支持多个独立迭代器的多项集(如列表和元组),则应当在每次调用 :c:member:`~PyTypeObject.tp_iter` " +"时创建并返回一个新的迭代器。" + +#: ../../extending/newtypes.rst:528 +msgid "" +"Objects which can only be iterated over once (usually due to side effects of" +" iteration, such as file objects) can implement " +":c:member:`~PyTypeObject.tp_iter` by returning a new reference to themselves" +" -- and should also therefore implement the " +":c:member:`~PyTypeObject.tp_iternext` handler." +msgstr "" +"只能被迭代一次的对象(通常是由于迭代操作的附带影响,例如文件对象)可以通过返回一个指向自身的新引用来实现 " +":c:member:`~PyTypeObject.tp_iter` -- 并且为此还应当实现 " +":c:member:`~PyTypeObject.tp_iternext` 处理器。" + +#: ../../extending/newtypes.rst:533 +msgid "" +"Any :term:`iterator` object should implement both " +":c:member:`~PyTypeObject.tp_iter` and :c:member:`~PyTypeObject.tp_iternext`." +" An iterator's :c:member:`~PyTypeObject.tp_iter` handler should return a " +"new reference to the iterator. Its :c:member:`~PyTypeObject.tp_iternext` " +"handler should return a new reference to the next object in the iteration, " +"if there is one. If the iteration has reached the end, " +":c:member:`~PyTypeObject.tp_iternext` may return ``NULL`` without setting an" +" exception, or it may set :exc:`StopIteration` *in addition* to returning " +"``NULL``; avoiding the exception can yield slightly better performance. If " +"an actual error occurs, :c:member:`~PyTypeObject.tp_iternext` should always " +"set an exception and return ``NULL``." +msgstr "" +"任何 :term:`iterator` 对象都应当同时实现 :c:member:`~PyTypeObject.tp_iter` 和 " +":c:member:`~PyTypeObject.tp_iternext`。一个迭代器的 " +":c:member:`~PyTypeObject.tp_iter` 处理器应当返回一个指向该迭代器的新引用。它的 " +":c:member:`~PyTypeObject.tp_iternext` 处理器应当返回一个指向迭代操作的下一个对象的新引用,如果还有下一个对象的话。" +" 如果迭代已到达末尾,则 :c:member:`~PyTypeObject.tp_iternext` 可以返回 ``NULL`` " +"而不设置异常,或者也可以在返回 ``NULL`` 的基础上 *额外* 设置 :exc:`StopIteration`;避免异常可以产生更好的性能。 " +"如果发生了实际的错误,则 :c:member:`~PyTypeObject.tp_iternext` 应当总是设置一个异常并返回 ``NULL``。" + +#: ../../extending/newtypes.rst:549 +msgid "Weak Reference Support" +msgstr "弱引用支持" + +#: ../../extending/newtypes.rst:551 +msgid "" +"One of the goals of Python's weak reference implementation is to allow any " +"type to participate in the weak reference mechanism without incurring the " +"overhead on performance-critical objects (such as numbers)." +msgstr "Python 弱引用实现的目标之一是允许任意类型参与弱引用机制而不会在重视性能的对象(例如数字)上产生额外开销。" + +#: ../../extending/newtypes.rst:556 +msgid "Documentation for the :mod:`weakref` module." +msgstr ":mod:`weakref` 模块的文档。" + +#: ../../extending/newtypes.rst:558 +msgid "" +"For an object to be weakly referenceable, the extension type must set the " +"``Py_TPFLAGS_MANAGED_WEAKREF`` bit of the :c:member:`~PyTypeObject.tp_flags`" +" field. The legacy :c:member:`~PyTypeObject.tp_weaklistoffset` field should " +"be left as zero." +msgstr "" +"对于可被弱引用的对象,扩展类型必须设置 :c:member:`~PyTypeObject.tp_flags` 字段的 " +"``Py_TPFLAGS_MANAGED_WEAKREF`` 比特位。旧式的 " +":c:member:`~PyTypeObject.tp_weaklistoffset` 字段应当保持为零。" + +#: ../../extending/newtypes.rst:563 +msgid "" +"Concretely, here is how the statically declared type object would look::" +msgstr "具体地说,以下就是静态声明的类型对象的样子::" + +#: ../../extending/newtypes.rst:565 +msgid "" +"static PyTypeObject TrivialType = {\n" +" PyVarObject_HEAD_INIT(NULL, 0)\n" +" /* ... other members omitted for brevity ... */\n" +" .tp_flags = Py_TPFLAGS_MANAGED_WEAKREF | ...,\n" +"};" +msgstr "" +"static PyTypeObject TrivialType = {\n" +" PyVarObject_HEAD_INIT(NULL, 0)\n" +" /* ... 省略了其他成员以使代码简短 ... */\n" +" .tp_flags = Py_TPFLAGS_MANAGED_WEAKREF | ...,\n" +"};" + +#: ../../extending/newtypes.rst:572 +msgid "" +"The only further addition is that ``tp_dealloc`` needs to clear any weak " +"references (by calling :c:func:`PyObject_ClearWeakRefs`)::" +msgstr "" +"唯一的额外补充是 ``tp_dealloc`` 需要清除任何弱引用 (通过调用 :c:func:`PyObject_ClearWeakRefs`)::" + +#: ../../extending/newtypes.rst:575 +msgid "" +"static void\n" +"Trivial_dealloc(PyObject *op)\n" +"{\n" +" /* Clear weakrefs first before calling any destructors */\n" +" PyObject_ClearWeakRefs(op);\n" +" /* ... remainder of destruction code omitted for brevity ... */\n" +" Py_TYPE(op)->tp_free(op);\n" +"}" +msgstr "" +"static void\n" +"Trivial_dealloc(PyObject *op)\n" +"{\n" +" /* 在调用任何析构器之前先清除弱引用 */\n" +" PyObject_ClearWeakRefs(op);\n" +" /* ... 省略了析构代码的其余部分以保持简短 ... */\n" +" Py_TYPE(op)->tp_free(op);\n" +"}" + +#: ../../extending/newtypes.rst:586 +msgid "More Suggestions" +msgstr "更多建议" + +#: ../../extending/newtypes.rst:588 +msgid "" +"In order to learn how to implement any specific method for your new data " +"type, get the :term:`CPython` source code. Go to the :file:`Objects` " +"directory, then search the C source files for ``tp_`` plus the function you " +"want (for example, ``tp_richcompare``). You will find examples of the " +"function you want to implement." +msgstr "" +"为了学习如何为你的新数据类型实现任何特定方法,请获取 :term:`CPython` 源代码。进入 :file:`Objects` 目录,然后在 C " +"源文件中搜索 ``tp_`` 加上你想要的函数 (例如,``tp_richcompare``)。你将找到你想要实现的函数的例子。" + +#: ../../extending/newtypes.rst:594 +msgid "" +"When you need to verify that an object is a concrete instance of the type " +"you are implementing, use the :c:func:`PyObject_TypeCheck` function. A " +"sample of its use might be something like the following::" +msgstr "" +"当你需要验证一个对象是否为你实现的类型的具体实例时,请使用 :c:func:`PyObject_TypeCheck` 函数。它的一个用法示例如下::" + +#: ../../extending/newtypes.rst:598 +msgid "" +"if (!PyObject_TypeCheck(some_object, &MyType)) {\n" +" PyErr_SetString(PyExc_TypeError, \"arg #1 not a mything\");\n" +" return NULL;\n" +"}" +msgstr "" +"if (!PyObject_TypeCheck(some_object, &MyType)) {\n" +" PyErr_SetString(PyExc_TypeError, \"arg #1 not a mything\");\n" +" return NULL;\n" +"}" + +#: ../../extending/newtypes.rst:604 +msgid "Download CPython source releases." +msgstr "下载 CPython 源代码版本。" + +#: ../../extending/newtypes.rst:605 +msgid "https://www.python.org/downloads/source/" +msgstr "https://www.python.org/downloads/source/" + +#: ../../extending/newtypes.rst:607 +msgid "" +"The CPython project on GitHub, where the CPython source code is developed." +msgstr "GitHub 上开发 CPython 源代码的 CPython 项目。" + +#: ../../extending/newtypes.rst:608 +msgid "https://github.com/python/cpython" +msgstr "https://github.com/python/cpython" + +#: ../../extending/newtypes.rst:56 +msgid "object" +msgstr "object -- 对象" + +#: ../../extending/newtypes.rst:56 +msgid "deallocation" +msgstr "撤销分配" + +#: ../../extending/newtypes.rst:56 +msgid "deallocation, object" +msgstr "撤销分配,对象" + +#: ../../extending/newtypes.rst:56 +msgid "finalization" +msgstr "最终化" + +#: ../../extending/newtypes.rst:56 +msgid "finalization, of objects" +msgstr "最终化,对象" + +#: ../../extending/newtypes.rst:93 +msgid "PyErr_Fetch (C function)" +msgstr "PyErr_Fetch (C 函数)" + +#: ../../extending/newtypes.rst:93 +msgid "PyErr_Restore (C function)" +msgstr "PyErr_Restore (C 函数)" + +#: ../../extending/newtypes.rst:154 +msgid "string" +msgstr "string" + +#: ../../extending/newtypes.rst:154 +msgid "object representation" +msgstr "对象的表示" + +#: ../../extending/newtypes.rst:154 +msgid "built-in function" +msgstr "内置函数" + +#: ../../extending/newtypes.rst:154 +msgid "repr" +msgstr "repr" diff --git a/extending/newtypes_tutorial.po b/extending/newtypes_tutorial.po new file mode 100644 index 0000000000..eb5783a6cb --- /dev/null +++ b/extending/newtypes_tutorial.po @@ -0,0 +1,3190 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../extending/newtypes_tutorial.rst:7 +msgid "Defining Extension Types: Tutorial" +msgstr "自定义扩展类型:教程" + +#: ../../extending/newtypes_tutorial.rst:14 +msgid "" +"Python allows the writer of a C extension module to define new types that " +"can be manipulated from Python code, much like the built-in :class:`str` and" +" :class:`list` types. The code for all extension types follows a pattern, " +"but there are some details that you need to understand before you can get " +"started. This document is a gentle introduction to the topic." +msgstr "" +"Python 允许编写 C 扩展模块定义可以从 Python 代码中操纵的新类型,这很像内置的 :class:`str` 和 :class:`list`" +" 类型。所有扩展类型的代码都遵循一个模式,但是在您开始之前,您需要了解一些细节。这份文件是对这个主题介绍。" + +#: ../../extending/newtypes_tutorial.rst:24 +msgid "The Basics" +msgstr "基础" + +#: ../../extending/newtypes_tutorial.rst:26 +msgid "" +"The :term:`CPython` runtime sees all Python objects as variables of type " +":c:expr:`PyObject*`, which serves as a \"base type\" for all Python objects." +" The :c:type:`PyObject` structure itself only contains the object's " +":term:`reference count` and a pointer to the object's \"type object\". This " +"is where the action is; the type object determines which (C) functions get " +"called by the interpreter when, for instance, an attribute gets looked up on" +" an object, a method called, or it is multiplied by another object. These C" +" functions are called \"type methods\"." +msgstr "" +":term:`CPython` 运行时会将所有 Python 对象都视为 :c:expr:`PyObject*` 类型的变量,这是所有 Python " +"对象的“基础类型”。 :c:type:`PyObject` 结构体本身只包含对象的 :term:`reference count` " +"和指向对象的“类型对象”的指针。这是动作所针对的目标。类型对象决定解释器要调用哪些 (C) " +"函数,例如,在对象上查找一个属性,调用一个方法,或者与另一个对象相乘等。这些 C 函数被称为“类型方法”。" + +#: ../../extending/newtypes_tutorial.rst:35 +msgid "" +"So, if you want to define a new extension type, you need to create a new " +"type object." +msgstr "所以,如果你想要定义新的扩展类型,需要创建新的类型对象。" + +#: ../../extending/newtypes_tutorial.rst:38 +msgid "" +"This sort of thing can only be explained by example, so here's a minimal, " +"but complete, module that defines a new type named :class:`!Custom` inside a" +" C extension module :mod:`!custom`:" +msgstr "" +"这种事情只能通过例子来解释,下面是一个最小但完整的模块,它在 C 扩展模块 :mod:`!custom` 中定义了一个名为 " +":class:`!Custom` 的新类型:" + +#: ../../extending/newtypes_tutorial.rst:43 +msgid "" +"What we're showing here is the traditional way of defining *static* " +"extension types. It should be adequate for most uses. The C API also " +"allows defining heap-allocated extension types using the " +":c:func:`PyType_FromSpec` function, which isn't covered in this tutorial." +msgstr "" +"这里展示的方法是定义 *static* 扩展类型的传统方法。可以适合大部分用途。C API 也可以定义在堆上分配的扩展类型,使用 " +":c:func:`PyType_FromSpec` 函数,但不在本入门里讨论。" + +#: ../../extending/newtypes_tutorial.rst:48 +msgid "" +"#define PY_SSIZE_T_CLEAN\n" +"#include \n" +"\n" +"typedef struct {\n" +" PyObject_HEAD\n" +" /* Type-specific fields go here. */\n" +"} CustomObject;\n" +"\n" +"static PyTypeObject CustomType = {\n" +" .ob_base = PyVarObject_HEAD_INIT(NULL, 0)\n" +" .tp_name = \"custom.Custom\",\n" +" .tp_doc = PyDoc_STR(\"Custom objects\"),\n" +" .tp_basicsize = sizeof(CustomObject),\n" +" .tp_itemsize = 0,\n" +" .tp_flags = Py_TPFLAGS_DEFAULT,\n" +" .tp_new = PyType_GenericNew,\n" +"};\n" +"\n" +"static int\n" +"custom_module_exec(PyObject *m)\n" +"{\n" +" if (PyType_Ready(&CustomType) < 0) {\n" +" return -1;\n" +" }\n" +"\n" +" if (PyModule_AddObjectRef(m, \"Custom\", (PyObject *) &CustomType) < 0) {\n" +" return -1;\n" +" }\n" +"\n" +" return 0;\n" +"}\n" +"\n" +"static PyModuleDef_Slot custom_module_slots[] = {\n" +" {Py_mod_exec, custom_module_exec},\n" +" // Just use this while using static types\n" +" {Py_mod_multiple_interpreters, Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED},\n" +" {0, NULL}\n" +"};\n" +"\n" +"static PyModuleDef custom_module = {\n" +" .m_base = PyModuleDef_HEAD_INIT,\n" +" .m_name = \"custom\",\n" +" .m_doc = \"Example module that creates an extension type.\",\n" +" .m_size = 0,\n" +" .m_slots = custom_module_slots,\n" +"};\n" +"\n" +"PyMODINIT_FUNC\n" +"PyInit_custom(void)\n" +"{\n" +" return PyModuleDef_Init(&custom_module);\n" +"}\n" +msgstr "" +"#define PY_SSIZE_T_CLEAN\n" +"#include \n" +"\n" +"typedef struct {\n" +" PyObject_HEAD\n" +" /* 这里添加类型专属的字段。 */\n" +"} CustomObject;\n" +"\n" +"static PyTypeObject CustomType = {\n" +" .ob_base = PyVarObject_HEAD_INIT(NULL, 0)\n" +" .tp_name = \"custom.Custom\",\n" +" .tp_doc = PyDoc_STR(\"Custom objects\"),\n" +" .tp_basicsize = sizeof(CustomObject),\n" +" .tp_itemsize = 0,\n" +" .tp_flags = Py_TPFLAGS_DEFAULT,\n" +" .tp_new = PyType_GenericNew,\n" +"};\n" +"\n" +"static int\n" +"custom_module_exec(PyObject *m)\n" +"{\n" +" if (PyType_Ready(&CustomType) < 0) {\n" +" return -1;\n" +" }\n" +"\n" +" if (PyModule_AddObjectRef(m, \"Custom\", (PyObject *) &CustomType) < 0) {\n" +" return -1;\n" +" }\n" +"\n" +" return 0;\n" +"}\n" +"\n" +"static PyModuleDef_Slot custom_module_slots[] = {\n" +" {Py_mod_exec, custom_module_exec},\n" +" // 使用静态类型时就使用这个\n" +" {Py_mod_multiple_interpreters, Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED},\n" +" {0, NULL}\n" +"};\n" +"\n" +"static PyModuleDef custom_module = {\n" +" .m_base = PyModuleDef_HEAD_INIT,\n" +" .m_name = \"custom\",\n" +" .m_doc = \"Example module that creates an extension type.\",\n" +" .m_size = 0,\n" +" .m_slots = custom_module_slots,\n" +"};\n" +"\n" +"PyMODINIT_FUNC\n" +"PyInit_custom(void)\n" +"{\n" +" return PyModuleDef_Init(&custom_module);\n" +"}\n" + +#: ../../extending/newtypes_tutorial.rst:50 +msgid "" +"Now that's quite a bit to take in at once, but hopefully bits will seem " +"familiar from the previous chapter. This file defines three things:" +msgstr "这一下子要看的东西不少,不过其中某些内容应该会让你觉得似曾相识。这个文件定义了三件事:" + +#: ../../extending/newtypes_tutorial.rst:53 +msgid "" +"What a :class:`!Custom` **object** contains: this is the ``CustomObject`` " +"struct, which is allocated once for each :class:`!Custom` instance." +msgstr "" +"一个 :class:`!Custom` **对象** 包含的东西:这是 ``CustomObject`` 结构体,它会为每个 " +":class:`!Custom` 实例分配一次。" + +#: ../../extending/newtypes_tutorial.rst:55 +msgid "" +"How the :class:`!Custom` **type** behaves: this is the ``CustomType`` " +"struct, which defines a set of flags and function pointers that the " +"interpreter inspects when specific operations are requested." +msgstr "" +":class:`!Custom` **类型** 的行为:这是 ``CustomType`` " +"结构体,它定义了一组旗标和函数指针供解释器在收到特定操作请求时进行检查。" + +#: ../../extending/newtypes_tutorial.rst:58 +msgid "" +"How to define and execute the :mod:`!custom` module: this is the " +"``PyInit_custom`` function and the associated ``custom_module`` struct for " +"defining the module, and the ``custom_module_exec`` function to set up a " +"fresh module object." +msgstr "" +"如何定义和执行 :mod:`!custom` 模块:这是 ``PyInit_custom`` 函数及所关联的用于定义该模块的 " +"``custom_module`` 结构体,以及用于设置新模块对象的 ``custom_module_exec`` 函数。" + +#: ../../extending/newtypes_tutorial.rst:63 +msgid "The first bit is::" +msgstr "结构的第一块是 ::" + +#: ../../extending/newtypes_tutorial.rst:65 +msgid "" +"typedef struct {\n" +" PyObject_HEAD\n" +"} CustomObject;" +msgstr "" +"typedef struct {\n" +" PyObject_HEAD\n" +"} CustomObject;" + +#: ../../extending/newtypes_tutorial.rst:69 +msgid "" +"This is what a Custom object will contain. ``PyObject_HEAD`` is mandatory " +"at the start of each object struct and defines a field called ``ob_base`` of" +" type :c:type:`PyObject`, containing a pointer to a type object and a " +"reference count (these can be accessed using the macros :c:macro:`Py_TYPE` " +"and :c:macro:`Py_REFCNT` respectively). The reason for the macro is to " +"abstract away the layout and to enable additional fields in :ref:`debug " +"builds `." +msgstr "" +"这就是一个自定义对象将会包含的内容。``PyObject_HEAD`` 是强制要求放在每个对象结构体之前并定义一个名为 ``ob_base`` 的 " +":c:type:`PyObject` 类型的字段,其中包含一个指向类型对象和引用计数的指针(这两者可以分别使用宏 :c:macro:`Py_TYPE` " +"和 :c:macro:`Py_REFCNT` 来访问)。使用宏的理由是将布局抽象出来并在 :ref:`调试编译版 ` " +"中启用附加字段。" + +#: ../../extending/newtypes_tutorial.rst:78 +msgid "" +"There is no semicolon above after the :c:macro:`PyObject_HEAD` macro. Be " +"wary of adding one by accident: some compilers will complain." +msgstr "注意在宏 :c:macro:`PyObject_HEAD` 后没有分号。意外添加分号会导致编译器提示出错。" + +#: ../../extending/newtypes_tutorial.rst:81 +msgid "" +"Of course, objects generally store additional data besides the standard " +"``PyObject_HEAD`` boilerplate; for example, here is the definition for " +"standard Python floats::" +msgstr "当然,对象除了在 ``PyObject_HEAD`` 存储数据外,还有额外数据;例如,如下定义了标准的 Python 浮点数::" + +#: ../../extending/newtypes_tutorial.rst:85 +msgid "" +"typedef struct {\n" +" PyObject_HEAD\n" +" double ob_fval;\n" +"} PyFloatObject;" +msgstr "" +"typedef struct {\n" +" PyObject_HEAD\n" +" double ob_fval;\n" +"} PyFloatObject;" + +#: ../../extending/newtypes_tutorial.rst:90 +msgid "The second bit is the definition of the type object. ::" +msgstr "第二部分是类型对象的定义::" + +#: ../../extending/newtypes_tutorial.rst:92 +msgid "" +"static PyTypeObject CustomType = {\n" +" .ob_base = PyVarObject_HEAD_INIT(NULL, 0)\n" +" .tp_name = \"custom.Custom\",\n" +" .tp_doc = PyDoc_STR(\"Custom objects\"),\n" +" .tp_basicsize = sizeof(CustomObject),\n" +" .tp_itemsize = 0,\n" +" .tp_flags = Py_TPFLAGS_DEFAULT,\n" +" .tp_new = PyType_GenericNew,\n" +"};" +msgstr "" +"static PyTypeObject CustomType = {\n" +" .ob_base = PyVarObject_HEAD_INIT(NULL, 0)\n" +" .tp_name = \"custom.Custom\",\n" +" .tp_doc = PyDoc_STR(\"Custom objects\"),\n" +" .tp_basicsize = sizeof(CustomObject),\n" +" .tp_itemsize = 0,\n" +" .tp_flags = Py_TPFLAGS_DEFAULT,\n" +" .tp_new = PyType_GenericNew,\n" +"};" + +#: ../../extending/newtypes_tutorial.rst:103 +msgid "" +"We recommend using C99-style designated initializers as above, to avoid " +"listing all the :c:type:`PyTypeObject` fields that you don't care about and " +"also to avoid caring about the fields' declaration order." +msgstr "" +"推荐使用如上 C99 风格的初始化,以避免列出所有的 :c:type:`PyTypeObject` " +"字段,其中很多是你不需要关心的,这样也可以避免关注字段的定义顺序。" + +#: ../../extending/newtypes_tutorial.rst:107 +msgid "" +"The actual definition of :c:type:`PyTypeObject` in :file:`object.h` has many" +" more :ref:`fields ` than the definition above. The remaining" +" fields will be filled with zeros by the C compiler, and it's common " +"practice to not specify them explicitly unless you need them." +msgstr "" +"在 :file:`object.h` 中实际定义的 :c:type:`PyTypeObject` 具有比如上定义更多的 :ref:`字段 `。剩余的字段会由 C 编译器用零来填充,通常的做法是不显式地指定它们,除非你确实需要它们。" + +#: ../../extending/newtypes_tutorial.rst:112 +msgid "We're going to pick it apart, one field at a time::" +msgstr "我们先挑选一部分,每次一个字段::" + +#: ../../extending/newtypes_tutorial.rst:114 +msgid ".ob_base = PyVarObject_HEAD_INIT(NULL, 0)" +msgstr ".ob_base = PyVarObject_HEAD_INIT(NULL, 0)" + +#: ../../extending/newtypes_tutorial.rst:116 +msgid "" +"This line is mandatory boilerplate to initialize the ``ob_base`` field " +"mentioned above. ::" +msgstr "这一行是强制的样板,用以初始化如上提到的 ``ob_base`` 字段::" + +#: ../../extending/newtypes_tutorial.rst:119 +msgid ".tp_name = \"custom.Custom\"," +msgstr ".tp_name = \"custom.Custom\"," + +#: ../../extending/newtypes_tutorial.rst:121 +msgid "" +"The name of our type. This will appear in the default textual " +"representation of our objects and in some error messages, for example:" +msgstr "我们的类型的名称。这将出现在我们的对象的默认文本表示形式和某些错误消息中,例如:" + +#: ../../extending/newtypes_tutorial.rst:124 +msgid "" +">>> \"\" + custom.Custom()\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"TypeError: can only concatenate str (not \"custom.Custom\") to str" +msgstr "" +">>> \"\" + custom.Custom()\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"TypeError: can only concatenate str (not \"custom.Custom\") to str" + +#: ../../extending/newtypes_tutorial.rst:131 +msgid "" +"Note that the name is a dotted name that includes both the module name and " +"the name of the type within the module. The module in this case is " +":mod:`!custom` and the type is :class:`!Custom`, so we set the type name to " +":class:`!custom.Custom`. Using the real dotted import path is important to " +"make your type compatible with the :mod:`pydoc` and :mod:`pickle` modules. " +"::" +msgstr "" +"请注意此名称是一个带点号名称,它同时包括模块名称和模块中的类型名称。本例中的模块是 :mod:`!custom` 而类型是 " +":class:`!Custom`,因此我们将类型名称设为 :class:`!custom.Custom`。使用真正的带点号的导入路径对于使你的类型与 " +":mod:`pydoc` 和 :mod:`pickle` 模块保持兼容是很重要的。 ::" + +#: ../../extending/newtypes_tutorial.rst:137 +msgid "" +".tp_basicsize = sizeof(CustomObject),\n" +".tp_itemsize = 0," +msgstr "" +".tp_basicsize = sizeof(CustomObject),\n" +".tp_itemsize = 0," + +#: ../../extending/newtypes_tutorial.rst:140 +msgid "" +"This is so that Python knows how much memory to allocate when creating new " +":class:`!Custom` instances. :c:member:`~PyTypeObject.tp_itemsize` is only " +"used for variable-sized objects and should otherwise be zero." +msgstr "" +"这样能让 Python 知道当创建新的 :class:`!Custom` 实例时需要分配多少内存。 " +":c:member:`~PyTypeObject.tp_itemsize` 仅用于可变大小的对象而在其他情况下都应为零。" + +#: ../../extending/newtypes_tutorial.rst:146 +msgid "" +"If you want your type to be subclassable from Python, and your type has the " +"same :c:member:`~PyTypeObject.tp_basicsize` as its base type, you may have " +"problems with multiple inheritance. A Python subclass of your type will " +"have to list your type first in its :attr:`~type.__bases__`, or else it will" +" not be able to call your type's :meth:`~object.__new__` method without " +"getting an error. You can avoid this problem by ensuring that your type has" +" a larger value for :c:member:`~PyTypeObject.tp_basicsize` than its base " +"type does. Most of the time, this will be true anyway, because either your " +"base type will be :class:`object`, or else you will be adding data members " +"to your base type, and therefore increasing its size." +msgstr "" +"如果你希望你的类型可在 Python 中被子类化,并且你的类型和它的基类型具有相同的 " +":c:member:`~PyTypeObject.tp_basicsize`,那么你可能会遇到多重继承问题。你的类型的 Python 子类必须在其 " +":attr:`~type.__bases__` 中将你的类型列在最前面,否则在调用你的类型的 :meth:`~object.__new__` " +"方法时将会出错。你可以通过确保你的类型具有比它的基类型更大的 :c:member:`~PyTypeObject.tp_basicsize` " +"值来避免这个问题。在大多数时候,这都是可以的,因为要么你的类型是 :class:`object`,要么你将为你的基类型添加数据成员,从而增加其大小。" + +#: ../../extending/newtypes_tutorial.rst:156 +msgid "We set the class flags to :c:macro:`Py_TPFLAGS_DEFAULT`. ::" +msgstr "我们将类旗标设为 :c:macro:`Py_TPFLAGS_DEFAULT`。 ::" + +#: ../../extending/newtypes_tutorial.rst:158 +msgid ".tp_flags = Py_TPFLAGS_DEFAULT," +msgstr ".tp_flags = Py_TPFLAGS_DEFAULT," + +#: ../../extending/newtypes_tutorial.rst:160 +msgid "" +"All types should include this constant in their flags. It enables all of " +"the members defined until at least Python 3.3. If you need further members," +" you will need to OR the corresponding flags." +msgstr "" +"所有类型都应当在它们的旗标中包括此常量。该常量将启用至少在 Python 3.3 之前定义的全部成员。如果你需要更多的成员,你将需要对相应的旗标进行 " +"OR 运算。" + +#: ../../extending/newtypes_tutorial.rst:164 +msgid "" +"We provide a doc string for the type in :c:member:`~PyTypeObject.tp_doc`. ::" +msgstr "我们在 :c:member:`~PyTypeObject.tp_doc` 中为类型提供一个文档字符串。 ::" + +#: ../../extending/newtypes_tutorial.rst:166 +msgid ".tp_doc = PyDoc_STR(\"Custom objects\")," +msgstr ".tp_doc = PyDoc_STR(\"Custom objects\")," + +#: ../../extending/newtypes_tutorial.rst:168 +msgid "" +"To enable object creation, we have to provide a " +":c:member:`~PyTypeObject.tp_new` handler. This is the equivalent of the " +"Python method :meth:`~object.__new__`, but has to be specified explicitly. " +"In this case, we can just use the default implementation provided by the API" +" function :c:func:`PyType_GenericNew`. ::" +msgstr "" +"要启用对象创建,我们必须提供一个 :c:member:`~PyTypeObject.tp_new` 处理器。这等价于 Python 方法 " +":meth:`~object.__new__`,但必须显式地指定。在这种情况下,我们可以使用 API 函数 " +":c:func:`PyType_GenericNew` 所提供的默认实现。 ::" + +#: ../../extending/newtypes_tutorial.rst:173 +msgid ".tp_new = PyType_GenericNew," +msgstr ".tp_new = PyType_GenericNew," + +#: ../../extending/newtypes_tutorial.rst:175 +msgid "" +"Everything else in the file should be familiar, except for some code in " +":c:func:`!custom_module_exec`::" +msgstr "除了 :c:func:`!custom_module_exec` 中的某些代码以外,文件中的其他内容应该都很常见::" + +#: ../../extending/newtypes_tutorial.rst:178 +msgid "" +"if (PyType_Ready(&CustomType) < 0) {\n" +" return -1;\n" +"}" +msgstr "" +"if (PyType_Ready(&CustomType) < 0) {\n" +" return -1;\n" +"}" + +#: ../../extending/newtypes_tutorial.rst:182 +msgid "" +"This initializes the :class:`!Custom` type, filling in a number of members " +"to the appropriate default values, including :c:member:`~PyObject.ob_type` " +"that we initially set to ``NULL``. ::" +msgstr "" +"这将初始化 :class:`!Custom` 类型,为一些成员填充适当的默认值,包括我们在初始时设为 ``NULL`` 的 " +":c:member:`~PyObject.ob_type`. ::" + +#: ../../extending/newtypes_tutorial.rst:186 +msgid "" +"if (PyModule_AddObjectRef(m, \"Custom\", (PyObject *) &CustomType) < 0) {\n" +" return -1;\n" +"}" +msgstr "" +"if (PyModule_AddObjectRef(m, \"Custom\", (PyObject *) &CustomType) < 0) {\n" +" return -1;\n" +"}" + +#: ../../extending/newtypes_tutorial.rst:190 +msgid "" +"This adds the type to the module dictionary. This allows us to create " +":class:`!Custom` instances by calling the :class:`!Custom` class:" +msgstr "这将把类型添加到模块字典中。这样我们就能通过调用 :class:`!Custom` 类来创建 :class:`!Custom` 实例:" + +#: ../../extending/newtypes_tutorial.rst:193 +msgid "" +">>> import custom\n" +">>> mycustom = custom.Custom()" +msgstr "" +">>> import custom\n" +">>> mycustom = custom.Custom()" + +#: ../../extending/newtypes_tutorial.rst:198 +msgid "" +"That's it! All that remains is to build it; put the above code in a file " +"called :file:`custom.c`," +msgstr "就是这样!剩下的工作就是编译它;将上述代码放入名为 :file:`custom.c` 的文件中," + +#: ../../extending/newtypes_tutorial.rst:201 +msgid "" +"[build-system]\n" +"requires = [\"setuptools\"]\n" +"build-backend = \"setuptools.build_meta\"\n" +"\n" +"[project]\n" +"name = \"custom\"\n" +"version = \"1\"\n" +msgstr "" +"[build-system]\n" +"requires = [\"setuptools\"]\n" +"build-backend = \"setuptools.build_meta\"\n" +"\n" +"[project]\n" +"name = \"custom\"\n" +"version = \"1\"\n" + +#: ../../extending/newtypes_tutorial.rst:203 +msgid "in a file called :file:`pyproject.toml`, and" +msgstr "名为 :file:`pyproject.toml` 的文件中,并且" + +#: ../../extending/newtypes_tutorial.rst:205 +msgid "" +"from setuptools import Extension, setup\n" +"setup(ext_modules=[Extension(\"custom\", [\"custom.c\"])])" +msgstr "" +"from setuptools import Extension, setup\n" +"setup(ext_modules=[Extension(\"custom\", [\"custom.c\"])])" + +#: ../../extending/newtypes_tutorial.rst:210 +msgid "in a file called :file:`setup.py`; then typing" +msgstr "在名为 :file:`setup.py` 的文件中;然后输入" + +#: ../../extending/newtypes_tutorial.rst:212 +#: ../../extending/newtypes_tutorial.rst:550 +msgid "$ python -m pip install ." +msgstr "$ python -m pip install ." + +#: ../../extending/newtypes_tutorial.rst:216 +msgid "" +"in a shell should produce a file :file:`custom.so` in a subdirectory and " +"install it; now fire up Python --- you should be able to ``import custom`` " +"and play around with ``Custom`` objects." +msgstr "" +"在 shell 中应该会在子目录下产生一个文件 :file:`custom.so` 并安装它;现在启动 Python --- 你应当能够执行 " +"``import custom`` 并尝试使用 ``Custom`` 对象。" + +#: ../../extending/newtypes_tutorial.rst:220 +msgid "That wasn't so hard, was it?" +msgstr "这并不难,对吗?" + +#: ../../extending/newtypes_tutorial.rst:222 +msgid "" +"Of course, the current Custom type is pretty uninteresting. It has no data " +"and doesn't do anything. It can't even be subclassed." +msgstr "当然,当前的自定义类型非常无趣。它没有数据,也不做任何事情。它甚至不能被子类化。" + +#: ../../extending/newtypes_tutorial.rst:227 +msgid "Adding data and methods to the Basic example" +msgstr "向基本示例添加数据和方法" + +#: ../../extending/newtypes_tutorial.rst:229 +msgid "" +"Let's extend the basic example to add some data and methods. Let's also " +"make the type usable as a base class. We'll create a new module, " +":mod:`!custom2` that adds these capabilities:" +msgstr "" +"让我们通过添加一些数据和方法来扩展这个基本示例。让我们再使该类型可以作为基类使用。我们将创建一个新模块 :mod:`!custom2` 来添加这些功能:" + +#: ../../extending/newtypes_tutorial.rst:233 +msgid "" +"#define PY_SSIZE_T_CLEAN\n" +"#include \n" +"#include /* for offsetof() */\n" +"\n" +"typedef struct {\n" +" PyObject_HEAD\n" +" PyObject *first; /* first name */\n" +" PyObject *last; /* last name */\n" +" int number;\n" +"} CustomObject;\n" +"\n" +"static void\n" +"Custom_dealloc(PyObject *op)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" Py_XDECREF(self->first);\n" +" Py_XDECREF(self->last);\n" +" Py_TYPE(self)->tp_free(self);\n" +"}\n" +"\n" +"static PyObject *\n" +"Custom_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\n" +"{\n" +" CustomObject *self;\n" +" self = (CustomObject *) type->tp_alloc(type, 0);\n" +" if (self != NULL) {\n" +" self->first = Py_GetConstant(Py_CONSTANT_EMPTY_STR);\n" +" if (self->first == NULL) {\n" +" Py_DECREF(self);\n" +" return NULL;\n" +" }\n" +" self->last = Py_GetConstant(Py_CONSTANT_EMPTY_STR);\n" +" if (self->last == NULL) {\n" +" Py_DECREF(self);\n" +" return NULL;\n" +" }\n" +" self->number = 0;\n" +" }\n" +" return (PyObject *) self;\n" +"}\n" +"\n" +"static int\n" +"Custom_init(PyObject *op, PyObject *args, PyObject *kwds)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" static char *kwlist[] = {\"first\", \"last\", \"number\", NULL};\n" +" PyObject *first = NULL, *last = NULL;\n" +"\n" +" if (!PyArg_ParseTupleAndKeywords(args, kwds, \"|OOi\", kwlist,\n" +" &first, &last,\n" +" &self->number))\n" +" return -1;\n" +"\n" +" if (first) {\n" +" Py_XSETREF(self->first, Py_NewRef(first));\n" +" }\n" +" if (last) {\n" +" Py_XSETREF(self->last, Py_NewRef(last));\n" +" }\n" +" return 0;\n" +"}\n" +"\n" +"static PyMemberDef Custom_members[] = {\n" +" {\"first\", Py_T_OBJECT_EX, offsetof(CustomObject, first), 0,\n" +" \"first name\"},\n" +" {\"last\", Py_T_OBJECT_EX, offsetof(CustomObject, last), 0,\n" +" \"last name\"},\n" +" {\"number\", Py_T_INT, offsetof(CustomObject, number), 0,\n" +" \"custom number\"},\n" +" {NULL} /* Sentinel */\n" +"};\n" +"\n" +"static PyObject *\n" +"Custom_name(PyObject *op, PyObject *Py_UNUSED(dummy))\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" if (self->first == NULL) {\n" +" PyErr_SetString(PyExc_AttributeError, \"first\");\n" +" return NULL;\n" +" }\n" +" if (self->last == NULL) {\n" +" PyErr_SetString(PyExc_AttributeError, \"last\");\n" +" return NULL;\n" +" }\n" +" return PyUnicode_FromFormat(\"%S %S\", self->first, self->last);\n" +"}\n" +"\n" +"static PyMethodDef Custom_methods[] = {\n" +" {\"name\", Custom_name, METH_NOARGS,\n" +" \"Return the name, combining the first and last name\"\n" +" },\n" +" {NULL} /* Sentinel */\n" +"};\n" +"\n" +"static PyTypeObject CustomType = {\n" +" .ob_base = PyVarObject_HEAD_INIT(NULL, 0)\n" +" .tp_name = \"custom2.Custom\",\n" +" .tp_doc = PyDoc_STR(\"Custom objects\"),\n" +" .tp_basicsize = sizeof(CustomObject),\n" +" .tp_itemsize = 0,\n" +" .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,\n" +" .tp_new = Custom_new,\n" +" .tp_init = Custom_init,\n" +" .tp_dealloc = Custom_dealloc,\n" +" .tp_members = Custom_members,\n" +" .tp_methods = Custom_methods,\n" +"};\n" +"\n" +"static int\n" +"custom_module_exec(PyObject *m)\n" +"{\n" +" if (PyType_Ready(&CustomType) < 0) {\n" +" return -1;\n" +" }\n" +"\n" +" if (PyModule_AddObjectRef(m, \"Custom\", (PyObject *) &CustomType) < 0) {\n" +" return -1;\n" +" }\n" +"\n" +" return 0;\n" +"}\n" +"\n" +"static PyModuleDef_Slot custom_module_slots[] = {\n" +" {Py_mod_exec, custom_module_exec},\n" +" {Py_mod_multiple_interpreters, Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED},\n" +" {0, NULL}\n" +"};\n" +"\n" +"static PyModuleDef custom_module = {\n" +" .m_base = PyModuleDef_HEAD_INIT,\n" +" .m_name = \"custom2\",\n" +" .m_doc = \"Example module that creates an extension type.\",\n" +" .m_size = 0,\n" +" .m_slots = custom_module_slots,\n" +"};\n" +"\n" +"PyMODINIT_FUNC\n" +"PyInit_custom2(void)\n" +"{\n" +" return PyModuleDef_Init(&custom_module);\n" +"}\n" +msgstr "" +"#define PY_SSIZE_T_CLEAN\n" +"#include \n" +"#include /* for offsetof() */\n" +"\n" +"typedef struct {\n" +" PyObject_HEAD\n" +" PyObject *first; /* first name */\n" +" PyObject *last; /* last name */\n" +" int number;\n" +"} CustomObject;\n" +"\n" +"static void\n" +"Custom_dealloc(PyObject *op)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" Py_XDECREF(self->first);\n" +" Py_XDECREF(self->last);\n" +" Py_TYPE(self)->tp_free(self);\n" +"}\n" +"\n" +"static PyObject *\n" +"Custom_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\n" +"{\n" +" CustomObject *self;\n" +" self = (CustomObject *) type->tp_alloc(type, 0);\n" +" if (self != NULL) {\n" +" self->first = Py_GetConstant(Py_CONSTANT_EMPTY_STR);\n" +" if (self->first == NULL) {\n" +" Py_DECREF(self);\n" +" return NULL;\n" +" }\n" +" self->last = Py_GetConstant(Py_CONSTANT_EMPTY_STR);\n" +" if (self->last == NULL) {\n" +" Py_DECREF(self);\n" +" return NULL;\n" +" }\n" +" self->number = 0;\n" +" }\n" +" return (PyObject *) self;\n" +"}\n" +"\n" +"static int\n" +"Custom_init(PyObject *op, PyObject *args, PyObject *kwds)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" static char *kwlist[] = {\"first\", \"last\", \"number\", NULL};\n" +" PyObject *first = NULL, *last = NULL;\n" +"\n" +" if (!PyArg_ParseTupleAndKeywords(args, kwds, \"|OOi\", kwlist,\n" +" &first, &last,\n" +" &self->number))\n" +" return -1;\n" +"\n" +" if (first) {\n" +" Py_XSETREF(self->first, Py_NewRef(first));\n" +" }\n" +" if (last) {\n" +" Py_XSETREF(self->last, Py_NewRef(last));\n" +" }\n" +" return 0;\n" +"}\n" +"\n" +"static PyMemberDef Custom_members[] = {\n" +" {\"first\", Py_T_OBJECT_EX, offsetof(CustomObject, first), 0,\n" +" \"first name\"},\n" +" {\"last\", Py_T_OBJECT_EX, offsetof(CustomObject, last), 0,\n" +" \"last name\"},\n" +" {\"number\", Py_T_INT, offsetof(CustomObject, number), 0,\n" +" \"custom number\"},\n" +" {NULL} /* Sentinel */\n" +"};\n" +"\n" +"static PyObject *\n" +"Custom_name(PyObject *op, PyObject *Py_UNUSED(dummy))\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" if (self->first == NULL) {\n" +" PyErr_SetString(PyExc_AttributeError, \"first\");\n" +" return NULL;\n" +" }\n" +" if (self->last == NULL) {\n" +" PyErr_SetString(PyExc_AttributeError, \"last\");\n" +" return NULL;\n" +" }\n" +" return PyUnicode_FromFormat(\"%S %S\", self->first, self->last);\n" +"}\n" +"\n" +"static PyMethodDef Custom_methods[] = {\n" +" {\"name\", Custom_name, METH_NOARGS,\n" +" \"Return the name, combining the first and last name\"\n" +" },\n" +" {NULL} /* Sentinel */\n" +"};\n" +"\n" +"static PyTypeObject CustomType = {\n" +" .ob_base = PyVarObject_HEAD_INIT(NULL, 0)\n" +" .tp_name = \"custom2.Custom\",\n" +" .tp_doc = PyDoc_STR(\"Custom objects\"),\n" +" .tp_basicsize = sizeof(CustomObject),\n" +" .tp_itemsize = 0,\n" +" .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,\n" +" .tp_new = Custom_new,\n" +" .tp_init = Custom_init,\n" +" .tp_dealloc = Custom_dealloc,\n" +" .tp_members = Custom_members,\n" +" .tp_methods = Custom_methods,\n" +"};\n" +"\n" +"static int\n" +"custom_module_exec(PyObject *m)\n" +"{\n" +" if (PyType_Ready(&CustomType) < 0) {\n" +" return -1;\n" +" }\n" +"\n" +" if (PyModule_AddObjectRef(m, \"Custom\", (PyObject *) &CustomType) < 0) {\n" +" return -1;\n" +" }\n" +"\n" +" return 0;\n" +"}\n" +"\n" +"static PyModuleDef_Slot custom_module_slots[] = {\n" +" {Py_mod_exec, custom_module_exec},\n" +" {Py_mod_multiple_interpreters, Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED},\n" +" {0, NULL}\n" +"};\n" +"\n" +"static PyModuleDef custom_module = {\n" +" .m_base = PyModuleDef_HEAD_INIT,\n" +" .m_name = \"custom2\",\n" +" .m_doc = \"Example module that creates an extension type.\",\n" +" .m_size = 0,\n" +" .m_slots = custom_module_slots,\n" +"};\n" +"\n" +"PyMODINIT_FUNC\n" +"PyInit_custom2(void)\n" +"{\n" +" return PyModuleDef_Init(&custom_module);\n" +"}\n" + +#: ../../extending/newtypes_tutorial.rst:236 +msgid "This version of the module has a number of changes." +msgstr "该模块的新版本包含多处修改。" + +#: ../../extending/newtypes_tutorial.rst:238 +msgid "" +"The :class:`!Custom` type now has three data attributes in its C struct, " +"*first*, *last*, and *number*. The *first* and *last* variables are Python " +"strings containing first and last names. The *number* attribute is a C " +"integer." +msgstr "" +"现在 :class:`!Custom` 类型的 C 结构体中有三个数据属性,*first*、*last* 和 *number*。其中 *first* 和" +" *last* 变量是包含名字和姓氏的 Python 字符串。 *number* 属性是一个 C 整数。" + +#: ../../extending/newtypes_tutorial.rst:242 +msgid "The object structure is updated accordingly::" +msgstr "对象的结构将被相应地更新::" + +#: ../../extending/newtypes_tutorial.rst:244 +msgid "" +"typedef struct {\n" +" PyObject_HEAD\n" +" PyObject *first; /* first name */\n" +" PyObject *last; /* last name */\n" +" int number;\n" +"} CustomObject;" +msgstr "" +"typedef struct {\n" +" PyObject_HEAD\n" +" PyObject *first; /* first name */\n" +" PyObject *last; /* last name */\n" +" int number;\n" +"} CustomObject;" + +#: ../../extending/newtypes_tutorial.rst:251 +msgid "" +"Because we now have data to manage, we have to be more careful about object " +"allocation and deallocation. At a minimum, we need a deallocation method::" +msgstr "因为现在我们有数据需要管理,我们必须更加小心地处理对象的分配和释放。至少,我们需要有一个释放方法::" + +#: ../../extending/newtypes_tutorial.rst:254 +msgid "" +"static void\n" +"Custom_dealloc(PyObject *op)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" Py_XDECREF(self->first);\n" +" Py_XDECREF(self->last);\n" +" Py_TYPE(self)->tp_free(self);\n" +"}" +msgstr "" +"static void\n" +"Custom_dealloc(PyObject *op)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" Py_XDECREF(self->first);\n" +" Py_XDECREF(self->last);\n" +" Py_TYPE(self)->tp_free(self);\n" +"}" + +#: ../../extending/newtypes_tutorial.rst:263 +msgid "which is assigned to the :c:member:`~PyTypeObject.tp_dealloc` member::" +msgstr "它会被赋值给 :c:member:`~PyTypeObject.tp_dealloc` 成员::" + +#: ../../extending/newtypes_tutorial.rst:265 +msgid ".tp_dealloc = Custom_dealloc," +msgstr ".tp_dealloc = Custom_dealloc," + +#: ../../extending/newtypes_tutorial.rst:267 +msgid "" +"This method first clears the reference counts of the two Python attributes. " +":c:func:`Py_XDECREF` correctly handles the case where its argument is " +"``NULL`` (which might happen here if ``tp_new`` failed midway). It then " +"calls the :c:member:`~PyTypeObject.tp_free` member of the object's type " +"(computed by ``Py_TYPE(self)``) to free the object's memory. Note that the " +"object's type might not be :class:`!CustomType`, because the object may be " +"an instance of a subclass." +msgstr "" +"此方法会先清空两个 Python 属性的引用计数。 :c:func:`Py_XDECREF` 可以正确处理参数为 ``NULL`` 的情况(这可能在 " +"``tp_new`` 中途失败时发生)。随后它将调用对象类型的 :c:member:`~PyTypeObject.tp_free` 成员(通过 " +"``Py_TYPE(self)`` 计算得到)来释放对象的内存。请注意对象类型可以不是 " +":class:`!CustomType`,因为对象可能是一个子类的实例。" + +#: ../../extending/newtypes_tutorial.rst:277 +msgid "" +"The explicit cast to ``CustomObject *`` above is needed because we defined " +"``Custom_dealloc`` to take a ``PyObject *`` argument, as the ``tp_dealloc`` " +"function pointer expects to receive a ``PyObject *`` argument. By assigning " +"to the ``tp_dealloc`` slot of a type, we declare that it can only be called " +"with instances of our ``CustomObject`` class, so the cast to ``(CustomObject" +" *)`` is safe. This is object-oriented polymorphism, in C!" +msgstr "" +"上面需要显式强制转换至 ``CustomObject *`` 是因为我们定义了 ``Custom_dealloc`` 接受一个 ``PyObject " +"*`` 参数,由于 ``tp_dealloc`` 函数指针预期接受一个 ``PyObject *`` 参数。通过向 ``tp_dealloc`` " +"槽位分配一个类型,我们声明它被调用时只能附带我们的 ``CustomObject`` 类的实例,因此强制转换至 ``(CustomObject *)``" +" 是安全的。这就是 C 语言中面向对象的多态性!" + +#: ../../extending/newtypes_tutorial.rst:285 +msgid "" +"In existing code, or in previous versions of this tutorial, you might see " +"similar functions take a pointer to the subtype object structure " +"(``CustomObject*``) directly, like this::" +msgstr "" +"在现有代码中,或是在本教程的之前版本中,你可能会看到类似的函数接受一个直接指向子类型对象结构体 (``CustomObject*``) " +"的指针,就像这样::" + +#: ../../extending/newtypes_tutorial.rst:289 +msgid "" +"Custom_dealloc(CustomObject *self)\n" +"{\n" +" Py_XDECREF(self->first);\n" +" Py_XDECREF(self->last);\n" +" Py_TYPE(self)->tp_free((PyObject *) self);\n" +"}\n" +"...\n" +".tp_dealloc = (destructor) Custom_dealloc," +msgstr "" +"Custom_dealloc(CustomObject *self)\n" +"{\n" +" Py_XDECREF(self->first);\n" +" Py_XDECREF(self->last);\n" +" Py_TYPE(self)->tp_free((PyObject *) self);\n" +"}\n" +"...\n" +".tp_dealloc = (destructor) Custom_dealloc," + +#: ../../extending/newtypes_tutorial.rst:298 +msgid "" +"This does the same thing on all architectures that CPython supports, but " +"according to the C standard, it invokes undefined behavior." +msgstr "这将在所有 CPython 支持的架构上做同样的事,但是根据 C 标准,它会唤起未定义的行为。" + +#: ../../extending/newtypes_tutorial.rst:302 +msgid "" +"We want to make sure that the first and last names are initialized to empty " +"strings, so we provide a ``tp_new`` implementation::" +msgstr "我们希望确保 first 和 last 被初始化为空字符串,因此我们提供了一个 ``tp_new`` 实现::" + +#: ../../extending/newtypes_tutorial.rst:305 +msgid "" +"static PyObject *\n" +"Custom_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\n" +"{\n" +" CustomObject *self;\n" +" self = (CustomObject *) type->tp_alloc(type, 0);\n" +" if (self != NULL) {\n" +" self->first = PyUnicode_FromString(\"\");\n" +" if (self->first == NULL) {\n" +" Py_DECREF(self);\n" +" return NULL;\n" +" }\n" +" self->last = PyUnicode_FromString(\"\");\n" +" if (self->last == NULL) {\n" +" Py_DECREF(self);\n" +" return NULL;\n" +" }\n" +" self->number = 0;\n" +" }\n" +" return (PyObject *) self;\n" +"}" +msgstr "" +"static PyObject *\n" +"Custom_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\n" +"{\n" +" CustomObject *self;\n" +" self = (CustomObject *) type->tp_alloc(type, 0);\n" +" if (self != NULL) {\n" +" self->first = PyUnicode_FromString(\"\");\n" +" if (self->first == NULL) {\n" +" Py_DECREF(self);\n" +" return NULL;\n" +" }\n" +" self->last = PyUnicode_FromString(\"\");\n" +" if (self->last == NULL) {\n" +" Py_DECREF(self);\n" +" return NULL;\n" +" }\n" +" self->number = 0;\n" +" }\n" +" return (PyObject *) self;\n" +"}" + +#: ../../extending/newtypes_tutorial.rst:326 +msgid "and install it in the :c:member:`~PyTypeObject.tp_new` member::" +msgstr "并在 :c:member:`~PyTypeObject.tp_new` 成员中安装它::" + +#: ../../extending/newtypes_tutorial.rst:328 +msgid ".tp_new = Custom_new," +msgstr ".tp_new = Custom_new," + +#: ../../extending/newtypes_tutorial.rst:330 +msgid "" +"The ``tp_new`` handler is responsible for creating (as opposed to " +"initializing) objects of the type. It is exposed in Python as the " +":meth:`~object.__new__` method. It is not required to define a ``tp_new`` " +"member, and indeed many extension types will simply reuse " +":c:func:`PyType_GenericNew` as done in the first version of the " +":class:`!Custom` type above. In this case, we use the ``tp_new`` handler to" +" initialize the ``first`` and ``last`` attributes to non-``NULL`` default " +"values." +msgstr "" +"``tp_new`` 处理器负责创建(而不是初始化)该类型的对象。它在 Python 中被暴露为 :meth:`~object.__new__` " +"方法。它不需要定义 ``tp_new`` 成员,实际上许多扩展类型会简单地重用 :c:func:`PyType_GenericNew`,就像上面 " +":class:`!Custom` 类型的第一个版本所做的那样。在此情况下,我们使用 ``tp_new`` 处理器来将 ``first`` 和 " +"``last`` 属性初始化为非 ``NULL`` 的默认值。" + +#: ../../extending/newtypes_tutorial.rst:338 +msgid "" +"``tp_new`` is passed the type being instantiated (not necessarily " +"``CustomType``, if a subclass is instantiated) and any arguments passed when" +" the type was called, and is expected to return the instance created. " +"``tp_new`` handlers always accept positional and keyword arguments, but they" +" often ignore the arguments, leaving the argument handling to initializer " +"(a.k.a. ``tp_init`` in C or ``__init__`` in Python) methods." +msgstr "" +"``tp_new`` 将接受被实例化的类型(不要求为 " +"``CustomType``,如果被实例化的是一个子类)以及在该类型被调用时传入的任何参数,并预期返回所创建的实例。``tp_new`` " +"处理器总是接受位置和关键字参数,但它们往往会忽略这些参数,而将参数处理留给初始化(即 C 中的 ``tp_init`` 或 Python 中的 " +"``__init__`` 函数)方法来执行。" + +#: ../../extending/newtypes_tutorial.rst:346 +msgid "" +"``tp_new`` shouldn't call ``tp_init`` explicitly, as the interpreter will do" +" it itself." +msgstr "``tp_new`` 不应显式地调用 ``tp_init``,因为解释器会自行调用它。" + +#: ../../extending/newtypes_tutorial.rst:349 +msgid "" +"The ``tp_new`` implementation calls the :c:member:`~PyTypeObject.tp_alloc` " +"slot to allocate memory::" +msgstr "``tp_new`` 实现会调用 :c:member:`~PyTypeObject.tp_alloc` 槽位来分配内存::" + +#: ../../extending/newtypes_tutorial.rst:352 +msgid "self = (CustomObject *) type->tp_alloc(type, 0);" +msgstr "self = (CustomObject *) type->tp_alloc(type, 0);" + +#: ../../extending/newtypes_tutorial.rst:354 +msgid "" +"Since memory allocation may fail, we must check the " +":c:member:`~PyTypeObject.tp_alloc` result against ``NULL`` before " +"proceeding." +msgstr "" +"由于内存分配可能会失败,我们必须在继续执行之前检查 :c:member:`~PyTypeObject.tp_alloc` 结果确认其不为 " +"``NULL``。" + +#: ../../extending/newtypes_tutorial.rst:358 +msgid "" +"We didn't fill the :c:member:`~PyTypeObject.tp_alloc` slot ourselves. Rather" +" :c:func:`PyType_Ready` fills it for us by inheriting it from our base " +"class, which is :class:`object` by default. Most types use the default " +"allocation strategy." +msgstr "" +"我们没有自行填充 :c:member:`~PyTypeObject.tp_alloc` 槽位。而是由 :c:func:`PyType_Ready` " +"通过从我们的基类继承来替我们填充它,其中默认为 :class:`object`。大部分类型都是使用默认的分配策略。" + +#: ../../extending/newtypes_tutorial.rst:364 +msgid "" +"If you are creating a co-operative :c:member:`~PyTypeObject.tp_new` (one " +"that calls a base type's :c:member:`~PyTypeObject.tp_new` or " +":meth:`~object.__new__`), you must *not* try to determine what method to " +"call using method resolution order at runtime. Always statically determine " +"what type you are going to call, and call its " +":c:member:`~PyTypeObject.tp_new` directly, or via ``type->tp_base->tp_new``." +" If you do not do this, Python subclasses of your type that also inherit " +"from other Python-defined classes may not work correctly. (Specifically, you" +" may not be able to create instances of such subclasses without getting a " +":exc:`TypeError`.)" +msgstr "" +"如果您要创建一个协作式 :c:member:`~PyTypeObject.tp_new` (它会调用基类型的 " +":c:member:`~PyTypeObject.tp_new` 或 :meth:`~object.__new__`),那么你 *不能* " +"在运行时尝试使用方法解析顺序来确定要调用的方法。必须总是静态地确定你要调用的类型,并直接调用它的 " +":c:member:`~PyTypeObject.tp_new`,或是通过 ``type->tp_base->tp_new``。 " +"如果你不这样做,你的类型的同样继承自其它由 Python 定义的类的 Python 子类可能无法正常工作。 " +"(具体地说,你可能无法创建这样的子类的实例而是会引发 :exc:`TypeError`。)" + +#: ../../extending/newtypes_tutorial.rst:374 +msgid "" +"We also define an initialization function which accepts arguments to provide" +" initial values for our instance::" +msgstr "我们还定义了一个接受参数来为我们的实例提供初始值的初始化函数::" + +#: ../../extending/newtypes_tutorial.rst:377 +msgid "" +"static int\n" +"Custom_init(PyObject *op, PyObject *args, PyObject *kwds)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" static char *kwlist[] = {\"first\", \"last\", \"number\", NULL};\n" +" PyObject *first = NULL, *last = NULL, *tmp;\n" +"\n" +" if (!PyArg_ParseTupleAndKeywords(args, kwds, \"|OOi\", kwlist,\n" +" &first, &last,\n" +" &self->number))\n" +" return -1;\n" +"\n" +" if (first) {\n" +" tmp = self->first;\n" +" Py_INCREF(first);\n" +" self->first = first;\n" +" Py_XDECREF(tmp);\n" +" }\n" +" if (last) {\n" +" tmp = self->last;\n" +" Py_INCREF(last);\n" +" self->last = last;\n" +" Py_XDECREF(tmp);\n" +" }\n" +" return 0;\n" +"}" +msgstr "" +"static int\n" +"Custom_init(PyObject *op, PyObject *args, PyObject *kwds)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" static char *kwlist[] = {\"first\", \"last\", \"number\", NULL};\n" +" PyObject *first = NULL, *last = NULL, *tmp;\n" +"\n" +" if (!PyArg_ParseTupleAndKeywords(args, kwds, \"|OOi\", kwlist,\n" +" &first, &last,\n" +" &self->number))\n" +" return -1;\n" +"\n" +" if (first) {\n" +" tmp = self->first;\n" +" Py_INCREF(first);\n" +" self->first = first;\n" +" Py_XDECREF(tmp);\n" +" }\n" +" if (last) {\n" +" tmp = self->last;\n" +" Py_INCREF(last);\n" +" self->last = last;\n" +" Py_XDECREF(tmp);\n" +" }\n" +" return 0;\n" +"}" + +#: ../../extending/newtypes_tutorial.rst:404 +msgid "by filling the :c:member:`~PyTypeObject.tp_init` slot. ::" +msgstr "通过填充 :c:member:`~PyTypeObject.tp_init` 槽位。 ::" + +#: ../../extending/newtypes_tutorial.rst:406 +msgid ".tp_init = Custom_init," +msgstr ".tp_init = Custom_init," + +#: ../../extending/newtypes_tutorial.rst:408 +msgid "" +"The :c:member:`~PyTypeObject.tp_init` slot is exposed in Python as the " +":meth:`~object.__init__` method. It is used to initialize an object after " +"it's created. Initializers always accept positional and keyword arguments, " +"and they should return either ``0`` on success or ``-1`` on error." +msgstr "" +":c:member:`~PyTypeObject.tp_init` 槽位在 Python 中暴露为 :meth:`~object.__init__` " +"方法。它被用来在创建对象后对其进行初始化。初始化器总是接受位置和关键字参数,它们应当在成功时返回 ``0`` 而在出错时返回 ``-1``。" + +#: ../../extending/newtypes_tutorial.rst:413 +msgid "" +"Unlike the ``tp_new`` handler, there is no guarantee that ``tp_init`` is " +"called at all (for example, the :mod:`pickle` module by default doesn't call" +" :meth:`~object.__init__` on unpickled instances). It can also be called " +"multiple times. Anyone can call the :meth:`!__init__` method on our " +"objects. For this reason, we have to be extra careful when assigning the " +"new attribute values. We might be tempted, for example to assign the " +"``first`` member like this::" +msgstr "" +"不同于 ``tp_new`` 处理器,``tp_init`` 不保证一定会被调用 (例如,在默认情况下 :mod:`pickle` " +"模块不会在未解封的实例上调用 :meth:`~object.__init__`)。它还可能被多次调用。任何人都可以在我们的对象上调用 " +":meth:`!__init__` 方法。因此,我们在为属性赋新值时必须格外小心。例如像这样给 ``first`` 成员赋值::" + +#: ../../extending/newtypes_tutorial.rst:421 +msgid "" +"if (first) {\n" +" Py_XDECREF(self->first);\n" +" Py_INCREF(first);\n" +" self->first = first;\n" +"}" +msgstr "" +"if (first) {\n" +" Py_XDECREF(self->first);\n" +" Py_INCREF(first);\n" +" self->first = first;\n" +"}" + +#: ../../extending/newtypes_tutorial.rst:427 +msgid "" +"But this would be risky. Our type doesn't restrict the type of the " +"``first`` member, so it could be any kind of object. It could have a " +"destructor that causes code to be executed that tries to access the " +"``first`` member; or that destructor could detach the :term:`thread state " +"` and let arbitrary code run in other threads that " +"accesses and modifies our object." +msgstr "" +"但是这可能会有风险。我们的类型没有限制 ``first`` 成员的类型,因此它可以是任何种类的对象。它可以带有一个会执行尝试访问 ``first`` " +"成员的代码的析构器;或者该析构器可能会释放 :term:`线程状态 ` " +"并让任意代码在其他线程中运行来访问和修改我们的对象。" + +#: ../../extending/newtypes_tutorial.rst:434 +msgid "" +"To be paranoid and protect ourselves against this possibility, we almost " +"always reassign members before decrementing their reference counts. When " +"don't we have to do this?" +msgstr "为了保持谨慎并使我们避免这种可能性,我们几乎总是要在减少成员的引用计数之前给它们重新赋值。什么时候我们可以不必再这样做?" + +#: ../../extending/newtypes_tutorial.rst:438 +msgid "when we absolutely know that the reference count is greater than 1;" +msgstr "当我们明确知道引用计数大于 1 的时候;" + +#: ../../extending/newtypes_tutorial.rst:440 +msgid "" +"when we know that deallocation of the object [#]_ will neither detach the " +":term:`thread state ` nor cause any calls back into " +"our type's code;" +msgstr "" +"当我们知道对象的销毁 [#]_ 既不会释放 :term:`线程状态 ` " +"也不会导致任何对我们的类型的代码的回调的时候;" + +#: ../../extending/newtypes_tutorial.rst:443 +msgid "" +"when decrementing a reference count in a " +":c:member:`~PyTypeObject.tp_dealloc` handler on a type which doesn't support" +" cyclic garbage collection [#]_." +msgstr "" +"当减少一个 :c:member:`~PyTypeObject.tp_dealloc` 处理器内不支持循环垃圾回收的类型的引用计数的时候 [#]_." + +#: ../../extending/newtypes_tutorial.rst:446 +msgid "" +"We want to expose our instance variables as attributes. There are a number " +"of ways to do that. The simplest way is to define member definitions::" +msgstr "我们可能会想将我们的实例变量暴露为属性。有几种方式可以做到这一点。最简单的方式是定义成员的定义::" + +#: ../../extending/newtypes_tutorial.rst:449 +msgid "" +"static PyMemberDef Custom_members[] = {\n" +" {\"first\", Py_T_OBJECT_EX, offsetof(CustomObject, first), 0,\n" +" \"first name\"},\n" +" {\"last\", Py_T_OBJECT_EX, offsetof(CustomObject, last), 0,\n" +" \"last name\"},\n" +" {\"number\", Py_T_INT, offsetof(CustomObject, number), 0,\n" +" \"custom number\"},\n" +" {NULL} /* Sentinel */\n" +"};" +msgstr "" +"static PyMemberDef Custom_members[] = {\n" +" {\"first\", Py_T_OBJECT_EX, offsetof(CustomObject, first), 0,\n" +" \"first name\"},\n" +" {\"last\", Py_T_OBJECT_EX, offsetof(CustomObject, last), 0,\n" +" \"last name\"},\n" +" {\"number\", Py_T_INT, offsetof(CustomObject, number), 0,\n" +" \"custom number\"},\n" +" {NULL} /* Sentinel */\n" +"};" + +#: ../../extending/newtypes_tutorial.rst:459 +msgid "" +"and put the definitions in the :c:member:`~PyTypeObject.tp_members` slot::" +msgstr "并将定义放置到 :c:member:`~PyTypeObject.tp_members` 槽位中::" + +#: ../../extending/newtypes_tutorial.rst:461 +msgid ".tp_members = Custom_members," +msgstr ".tp_members = Custom_members," + +#: ../../extending/newtypes_tutorial.rst:463 +msgid "" +"Each member definition has a member name, type, offset, access flags and " +"documentation string. See the :ref:`Generic-Attribute-Management` section " +"below for details." +msgstr "" +"每个成员的定义都有成员名称、类型、偏移量、访问旗标和文档字符串。请参阅下面的 :ref:`Generic-Attribute-Management` " +"小节来了解详情。" + +#: ../../extending/newtypes_tutorial.rst:467 +msgid "" +"A disadvantage of this approach is that it doesn't provide a way to restrict" +" the types of objects that can be assigned to the Python attributes. We " +"expect the first and last names to be strings, but any Python objects can be" +" assigned. Further, the attributes can be deleted, setting the C pointers to" +" ``NULL``. Even though we can make sure the members are initialized to " +"non-``NULL`` values, the members can be set to ``NULL`` if the attributes " +"are deleted." +msgstr "" +"此方式的缺点之一是它没有提供限制可被赋值给 Python 属性的对象类型的办法。我们预期 first 和 last " +"的名称为字符串,但它们可以被赋值为任意 Python 对象。此外,这些属性还可以被删除,并将 C 指针设为 ``NULL``。 " +"即使我们可以保证这些成员被初始化为非 ``NULL`` 值,如果这些属性被删除这些成员仍可被设为 ``NULL``。" + +#: ../../extending/newtypes_tutorial.rst:474 +msgid "" +"We define a single method, :meth:`!Custom.name`, that outputs the objects " +"name as the concatenation of the first and last names. ::" +msgstr "我们定义一个单独的方法,:meth:`!Custom.name`,它将对象名称输出为 first 和 last 名称的拼接。 ::" + +#: ../../extending/newtypes_tutorial.rst:477 +msgid "" +"static PyObject *\n" +"Custom_name(PyObject *op, PyObject *Py_UNUSED(dummy))\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" if (self->first == NULL) {\n" +" PyErr_SetString(PyExc_AttributeError, \"first\");\n" +" return NULL;\n" +" }\n" +" if (self->last == NULL) {\n" +" PyErr_SetString(PyExc_AttributeError, \"last\");\n" +" return NULL;\n" +" }\n" +" return PyUnicode_FromFormat(\"%S %S\", self->first, self->last);\n" +"}" +msgstr "" +"static PyObject *\n" +"Custom_name(PyObject *op, PyObject *Py_UNUSED(dummy))\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" if (self->first == NULL) {\n" +" PyErr_SetString(PyExc_AttributeError, \"first\");\n" +" return NULL;\n" +" }\n" +" if (self->last == NULL) {\n" +" PyErr_SetString(PyExc_AttributeError, \"last\");\n" +" return NULL;\n" +" }\n" +" return PyUnicode_FromFormat(\"%S %S\", self->first, self->last);\n" +"}" + +#: ../../extending/newtypes_tutorial.rst:492 +msgid "" +"The method is implemented as a C function that takes a :class:`!Custom` (or " +":class:`!Custom` subclass) instance as the first argument. Methods always " +"take an instance as the first argument. Methods often take positional and " +"keyword arguments as well, but in this case we don't take any and don't need" +" to accept a positional argument tuple or keyword argument dictionary. This " +"method is equivalent to the Python method:" +msgstr "" +"该方法的实现形式是一个接受 :class:`!Custom` (或 :class:`!Custom` 的子类) 实例作为第一个参数的 C 函数。 " +"方法总是接受一个实例作为第一个参数。方法往往也接受位置和关键字参数,但在本例中我们未接受任何参数也不需要接受位置参数元组或关键字参数字典。 " +"该方法等价于以下 Python 方法:" + +#: ../../extending/newtypes_tutorial.rst:499 +msgid "" +"def name(self):\n" +" return \"%s %s\" % (self.first, self.last)" +msgstr "" +"def name(self):\n" +" return \"%s %s\" % (self.first, self.last)" + +#: ../../extending/newtypes_tutorial.rst:504 +msgid "" +"Note that we have to check for the possibility that our :attr:`!first` and " +":attr:`!last` members are ``NULL``. This is because they can be deleted, in" +" which case they are set to ``NULL``. It would be better to prevent " +"deletion of these attributes and to restrict the attribute values to be " +"strings. We'll see how to do that in the next section." +msgstr "" +"请注意我们必须检查 :attr:`!first` 和 :attr:`!last` 成员是否可能为 ``NULL``。 " +"这是因为它们可以被删除,在此情况下它们会被设为 ``NULL``。更好的做法是防止删除这些属性并将属性的值限制为字符串。 " +"我们将在下一节了解如何做到这一点。" + +#: ../../extending/newtypes_tutorial.rst:510 +msgid "" +"Now that we've defined the method, we need to create an array of method " +"definitions::" +msgstr "现在我们已经定义好了方法,我们需要创建一个方法定义数组::" + +#: ../../extending/newtypes_tutorial.rst:513 +msgid "" +"static PyMethodDef Custom_methods[] = {\n" +" {\"name\", Custom_name, METH_NOARGS,\n" +" \"Return the name, combining the first and last name\"\n" +" },\n" +" {NULL} /* Sentinel */\n" +"};" +msgstr "" +"static PyMethodDef Custom_methods[] = {\n" +" {\"name\", Custom_name, METH_NOARGS,\n" +" \"Return the name, combining the first and last name\"\n" +" },\n" +" {NULL} /* Sentinel */\n" +"};" + +#: ../../extending/newtypes_tutorial.rst:520 +msgid "" +"(note that we used the :c:macro:`METH_NOARGS` flag to indicate that the " +"method is expecting no arguments other than *self*)" +msgstr "(请注意我们使用了 :c:macro:`METH_NOARGS` 旗标来指明该方法不准备接受除 *self* 以外的任何参数)" + +#: ../../extending/newtypes_tutorial.rst:523 +msgid "and assign it to the :c:member:`~PyTypeObject.tp_methods` slot::" +msgstr "并将其赋给 :c:member:`~PyTypeObject.tp_methods` 槽位::" + +#: ../../extending/newtypes_tutorial.rst:525 +msgid ".tp_methods = Custom_methods," +msgstr ".tp_methods = Custom_methods," + +#: ../../extending/newtypes_tutorial.rst:527 +msgid "" +"Finally, we'll make our type usable as a base class for subclassing. We've " +"written our methods carefully so far so that they don't make any assumptions" +" about the type of the object being created or used, so all we need to do is" +" to add the :c:macro:`Py_TPFLAGS_BASETYPE` to our class flag definition::" +msgstr "" +"最后,我们将使我们的类型可被用作派生子类的基类。我们精心地编写我们的方法以便它们不会随意假定被创建或使用的对象类型,所以我们需要做的就是将 " +":c:macro:`Py_TPFLAGS_BASETYPE` 添加到我们的类旗标定义中::" + +#: ../../extending/newtypes_tutorial.rst:532 +msgid ".tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE," +msgstr ".tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE," + +#: ../../extending/newtypes_tutorial.rst:534 +msgid "" +"We rename :c:func:`!PyInit_custom` to :c:func:`!PyInit_custom2`, update the " +"module name in the :c:type:`PyModuleDef` struct, and update the full class " +"name in the :c:type:`PyTypeObject` struct." +msgstr "" +"我们将 :c:func:`!PyInit_custom` 重命名为 :c:func:`!PyInit_custom2`,更新 " +":c:type:`PyModuleDef` 结构体中的模块名称,并更新 :c:type:`PyTypeObject` 结构体中的完整类名。" + +#: ../../extending/newtypes_tutorial.rst:538 +msgid "" +"Finally, we update our :file:`setup.py` file to include the new module," +msgstr "最后,我们更新 :file:`setup.py` 文件来包括新的模块," + +#: ../../extending/newtypes_tutorial.rst:540 +msgid "" +"from setuptools import Extension, setup\n" +"setup(ext_modules=[\n" +" Extension(\"custom\", [\"custom.c\"]),\n" +" Extension(\"custom2\", [\"custom2.c\"]),\n" +"])" +msgstr "" +"from setuptools import Extension, setup\n" +"setup(ext_modules=[\n" +" Extension(\"custom\", [\"custom.c\"]),\n" +" Extension(\"custom2\", [\"custom2.c\"]),\n" +"])" + +#: ../../extending/newtypes_tutorial.rst:548 +msgid "and then we re-install so that we can ``import custom2``:" +msgstr "然后我们重新安装以便能够 ``import custom2``:" + +#: ../../extending/newtypes_tutorial.rst:555 +msgid "Providing finer control over data attributes" +msgstr "提供对于数据属性的更精细控制" + +#: ../../extending/newtypes_tutorial.rst:557 +msgid "" +"In this section, we'll provide finer control over how the :attr:`!first` and" +" :attr:`!last` attributes are set in the :class:`!Custom` example. In the " +"previous version of our module, the instance variables :attr:`!first` and " +":attr:`!last` could be set to non-string values or even deleted. We want to " +"make sure that these attributes always contain strings." +msgstr "" +"在本节中,我们将对 :class:`!Custom` 示例中 :attr:`!first` 和 :attr:`!last` 属性的设置进行更精细的控制。" +" 在我们上一版本的模块中,实例变量 :attr:`!first` 和 :attr:`!last` 可以被设为非字符串值甚至被删除。 " +"我们希望确保这些属性始终包含字符串。" + +#: ../../extending/newtypes_tutorial.rst:563 +msgid "" +"#define PY_SSIZE_T_CLEAN\n" +"#include \n" +"#include /* for offsetof() */\n" +"\n" +"typedef struct {\n" +" PyObject_HEAD\n" +" PyObject *first; /* first name */\n" +" PyObject *last; /* last name */\n" +" int number;\n" +"} CustomObject;\n" +"\n" +"static void\n" +"Custom_dealloc(PyObject *op)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" Py_XDECREF(self->first);\n" +" Py_XDECREF(self->last);\n" +" Py_TYPE(self)->tp_free(self);\n" +"}\n" +"\n" +"static PyObject *\n" +"Custom_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\n" +"{\n" +" CustomObject *self;\n" +" self = (CustomObject *) type->tp_alloc(type, 0);\n" +" if (self != NULL) {\n" +" self->first = Py_GetConstant(Py_CONSTANT_EMPTY_STR);\n" +" if (self->first == NULL) {\n" +" Py_DECREF(self);\n" +" return NULL;\n" +" }\n" +" self->last = Py_GetConstant(Py_CONSTANT_EMPTY_STR);\n" +" if (self->last == NULL) {\n" +" Py_DECREF(self);\n" +" return NULL;\n" +" }\n" +" self->number = 0;\n" +" }\n" +" return (PyObject *) self;\n" +"}\n" +"\n" +"static int\n" +"Custom_init(PyObject *op, PyObject *args, PyObject *kwds)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" static char *kwlist[] = {\"first\", \"last\", \"number\", NULL};\n" +" PyObject *first = NULL, *last = NULL;\n" +"\n" +" if (!PyArg_ParseTupleAndKeywords(args, kwds, \"|UUi\", kwlist,\n" +" &first, &last,\n" +" &self->number))\n" +" return -1;\n" +"\n" +" if (first) {\n" +" Py_SETREF(self->first, Py_NewRef(first));\n" +" }\n" +" if (last) {\n" +" Py_SETREF(self->last, Py_NewRef(last));\n" +" }\n" +" return 0;\n" +"}\n" +"\n" +"static PyMemberDef Custom_members[] = {\n" +" {\"number\", Py_T_INT, offsetof(CustomObject, number), 0,\n" +" \"custom number\"},\n" +" {NULL} /* Sentinel */\n" +"};\n" +"\n" +"static PyObject *\n" +"Custom_getfirst(PyObject *op, void *closure)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" return Py_NewRef(self->first);\n" +"}\n" +"\n" +"static int\n" +"Custom_setfirst(PyObject *op, PyObject *value, void *closure)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" if (value == NULL) {\n" +" PyErr_SetString(PyExc_TypeError, \"Cannot delete the first attribute\");\n" +" return -1;\n" +" }\n" +" if (!PyUnicode_Check(value)) {\n" +" PyErr_SetString(PyExc_TypeError,\n" +" \"The first attribute value must be a string\");\n" +" return -1;\n" +" }\n" +" Py_SETREF(self->first, Py_NewRef(value));\n" +" return 0;\n" +"}\n" +"\n" +"static PyObject *\n" +"Custom_getlast(PyObject *op, void *closure)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" return Py_NewRef(self->last);\n" +"}\n" +"\n" +"static int\n" +"Custom_setlast(PyObject *op, PyObject *value, void *closure)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" if (value == NULL) {\n" +" PyErr_SetString(PyExc_TypeError, \"Cannot delete the last attribute\");\n" +" return -1;\n" +" }\n" +" if (!PyUnicode_Check(value)) {\n" +" PyErr_SetString(PyExc_TypeError,\n" +" \"The last attribute value must be a string\");\n" +" return -1;\n" +" }\n" +" Py_SETREF(self->last, Py_NewRef(value));\n" +" return 0;\n" +"}\n" +"\n" +"static PyGetSetDef Custom_getsetters[] = {\n" +" {\"first\", Custom_getfirst, Custom_setfirst,\n" +" \"first name\", NULL},\n" +" {\"last\", Custom_getlast, Custom_setlast,\n" +" \"last name\", NULL},\n" +" {NULL} /* Sentinel */\n" +"};\n" +"\n" +"static PyObject *\n" +"Custom_name(PyObject *op, PyObject *Py_UNUSED(dummy))\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" return PyUnicode_FromFormat(\"%S %S\", self->first, self->last);\n" +"}\n" +"\n" +"static PyMethodDef Custom_methods[] = {\n" +" {\"name\", Custom_name, METH_NOARGS,\n" +" \"Return the name, combining the first and last name\"\n" +" },\n" +" {NULL} /* Sentinel */\n" +"};\n" +"\n" +"static PyTypeObject CustomType = {\n" +" .ob_base = PyVarObject_HEAD_INIT(NULL, 0)\n" +" .tp_name = \"custom3.Custom\",\n" +" .tp_doc = PyDoc_STR(\"Custom objects\"),\n" +" .tp_basicsize = sizeof(CustomObject),\n" +" .tp_itemsize = 0,\n" +" .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,\n" +" .tp_new = Custom_new,\n" +" .tp_init = Custom_init,\n" +" .tp_dealloc = Custom_dealloc,\n" +" .tp_members = Custom_members,\n" +" .tp_methods = Custom_methods,\n" +" .tp_getset = Custom_getsetters,\n" +"};\n" +"\n" +"static int\n" +"custom_module_exec(PyObject *m)\n" +"{\n" +" if (PyType_Ready(&CustomType) < 0) {\n" +" return -1;\n" +" }\n" +"\n" +" if (PyModule_AddObjectRef(m, \"Custom\", (PyObject *) &CustomType) < 0) {\n" +" return -1;\n" +" }\n" +"\n" +" return 0;\n" +"}\n" +"\n" +"static PyModuleDef_Slot custom_module_slots[] = {\n" +" {Py_mod_exec, custom_module_exec},\n" +" {Py_mod_multiple_interpreters, Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED},\n" +" {0, NULL}\n" +"};\n" +"\n" +"static PyModuleDef custom_module = {\n" +" .m_base = PyModuleDef_HEAD_INIT,\n" +" .m_name = \"custom3\",\n" +" .m_doc = \"Example module that creates an extension type.\",\n" +" .m_size = 0,\n" +" .m_slots = custom_module_slots,\n" +"};\n" +"\n" +"PyMODINIT_FUNC\n" +"PyInit_custom3(void)\n" +"{\n" +" return PyModuleDef_Init(&custom_module);\n" +"}\n" +msgstr "" +"#define PY_SSIZE_T_CLEAN\n" +"#include \n" +"#include /* for offsetof() */\n" +"\n" +"typedef struct {\n" +" PyObject_HEAD\n" +" PyObject *first; /* first name */\n" +" PyObject *last; /* last name */\n" +" int number;\n" +"} CustomObject;\n" +"\n" +"static void\n" +"Custom_dealloc(PyObject *op)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" Py_XDECREF(self->first);\n" +" Py_XDECREF(self->last);\n" +" Py_TYPE(self)->tp_free(self);\n" +"}\n" +"\n" +"static PyObject *\n" +"Custom_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\n" +"{\n" +" CustomObject *self;\n" +" self = (CustomObject *) type->tp_alloc(type, 0);\n" +" if (self != NULL) {\n" +" self->first = Py_GetConstant(Py_CONSTANT_EMPTY_STR);\n" +" if (self->first == NULL) {\n" +" Py_DECREF(self);\n" +" return NULL;\n" +" }\n" +" self->last = Py_GetConstant(Py_CONSTANT_EMPTY_STR);\n" +" if (self->last == NULL) {\n" +" Py_DECREF(self);\n" +" return NULL;\n" +" }\n" +" self->number = 0;\n" +" }\n" +" return (PyObject *) self;\n" +"}\n" +"\n" +"static int\n" +"Custom_init(PyObject *op, PyObject *args, PyObject *kwds)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" static char *kwlist[] = {\"first\", \"last\", \"number\", NULL};\n" +" PyObject *first = NULL, *last = NULL;\n" +"\n" +" if (!PyArg_ParseTupleAndKeywords(args, kwds, \"|UUi\", kwlist,\n" +" &first, &last,\n" +" &self->number))\n" +" return -1;\n" +"\n" +" if (first) {\n" +" Py_SETREF(self->first, Py_NewRef(first));\n" +" }\n" +" if (last) {\n" +" Py_SETREF(self->last, Py_NewRef(last));\n" +" }\n" +" return 0;\n" +"}\n" +"\n" +"static PyMemberDef Custom_members[] = {\n" +" {\"number\", Py_T_INT, offsetof(CustomObject, number), 0,\n" +" \"custom number\"},\n" +" {NULL} /* Sentinel */\n" +"};\n" +"\n" +"static PyObject *\n" +"Custom_getfirst(PyObject *op, void *closure)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" return Py_NewRef(self->first);\n" +"}\n" +"\n" +"static int\n" +"Custom_setfirst(PyObject *op, PyObject *value, void *closure)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" if (value == NULL) {\n" +" PyErr_SetString(PyExc_TypeError, \"Cannot delete the first attribute\");\n" +" return -1;\n" +" }\n" +" if (!PyUnicode_Check(value)) {\n" +" PyErr_SetString(PyExc_TypeError,\n" +" \"The first attribute value must be a string\");\n" +" return -1;\n" +" }\n" +" Py_SETREF(self->first, Py_NewRef(value));\n" +" return 0;\n" +"}\n" +"\n" +"static PyObject *\n" +"Custom_getlast(PyObject *op, void *closure)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" return Py_NewRef(self->last);\n" +"}\n" +"\n" +"static int\n" +"Custom_setlast(PyObject *op, PyObject *value, void *closure)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" if (value == NULL) {\n" +" PyErr_SetString(PyExc_TypeError, \"Cannot delete the last attribute\");\n" +" return -1;\n" +" }\n" +" if (!PyUnicode_Check(value)) {\n" +" PyErr_SetString(PyExc_TypeError,\n" +" \"The last attribute value must be a string\");\n" +" return -1;\n" +" }\n" +" Py_SETREF(self->last, Py_NewRef(value));\n" +" return 0;\n" +"}\n" +"\n" +"static PyGetSetDef Custom_getsetters[] = {\n" +" {\"first\", Custom_getfirst, Custom_setfirst,\n" +" \"first name\", NULL},\n" +" {\"last\", Custom_getlast, Custom_setlast,\n" +" \"last name\", NULL},\n" +" {NULL} /* Sentinel */\n" +"};\n" +"\n" +"static PyObject *\n" +"Custom_name(PyObject *op, PyObject *Py_UNUSED(dummy))\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" return PyUnicode_FromFormat(\"%S %S\", self->first, self->last);\n" +"}\n" +"\n" +"static PyMethodDef Custom_methods[] = {\n" +" {\"name\", Custom_name, METH_NOARGS,\n" +" \"Return the name, combining the first and last name\"\n" +" },\n" +" {NULL} /* Sentinel */\n" +"};\n" +"\n" +"static PyTypeObject CustomType = {\n" +" .ob_base = PyVarObject_HEAD_INIT(NULL, 0)\n" +" .tp_name = \"custom3.Custom\",\n" +" .tp_doc = PyDoc_STR(\"Custom objects\"),\n" +" .tp_basicsize = sizeof(CustomObject),\n" +" .tp_itemsize = 0,\n" +" .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,\n" +" .tp_new = Custom_new,\n" +" .tp_init = Custom_init,\n" +" .tp_dealloc = Custom_dealloc,\n" +" .tp_members = Custom_members,\n" +" .tp_methods = Custom_methods,\n" +" .tp_getset = Custom_getsetters,\n" +"};\n" +"\n" +"static int\n" +"custom_module_exec(PyObject *m)\n" +"{\n" +" if (PyType_Ready(&CustomType) < 0) {\n" +" return -1;\n" +" }\n" +"\n" +" if (PyModule_AddObjectRef(m, \"Custom\", (PyObject *) &CustomType) < 0) {\n" +" return -1;\n" +" }\n" +"\n" +" return 0;\n" +"}\n" +"\n" +"static PyModuleDef_Slot custom_module_slots[] = {\n" +" {Py_mod_exec, custom_module_exec},\n" +" {Py_mod_multiple_interpreters, Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED},\n" +" {0, NULL}\n" +"};\n" +"\n" +"static PyModuleDef custom_module = {\n" +" .m_base = PyModuleDef_HEAD_INIT,\n" +" .m_name = \"custom3\",\n" +" .m_doc = \"Example module that creates an extension type.\",\n" +" .m_size = 0,\n" +" .m_slots = custom_module_slots,\n" +"};\n" +"\n" +"PyMODINIT_FUNC\n" +"PyInit_custom3(void)\n" +"{\n" +" return PyModuleDef_Init(&custom_module);\n" +"}\n" + +#: ../../extending/newtypes_tutorial.rst:566 +msgid "" +"To provide greater control, over the :attr:`!first` and :attr:`!last` " +"attributes, we'll use custom getter and setter functions. Here are the " +"functions for getting and setting the :attr:`!first` attribute::" +msgstr "" +"为了更好地控制 :attr:`!first` 和 :attr:`!last` 属性,我们将使用自定义的读取器和设置器函数。以下就是用于读取和设置 " +":attr:`!first` 属性的函数::" + +#: ../../extending/newtypes_tutorial.rst:570 +msgid "" +"static PyObject *\n" +"Custom_getfirst(PyObject *op, void *closure)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" Py_INCREF(self->first);\n" +" return self->first;\n" +"}\n" +"\n" +"static int\n" +"Custom_setfirst(PyObject *op, PyObject *value, void *closure)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" PyObject *tmp;\n" +" if (value == NULL) {\n" +" PyErr_SetString(PyExc_TypeError, \"Cannot delete the first attribute\");\n" +" return -1;\n" +" }\n" +" if (!PyUnicode_Check(value)) {\n" +" PyErr_SetString(PyExc_TypeError,\n" +" \"The first attribute value must be a string\");\n" +" return -1;\n" +" }\n" +" tmp = self->first;\n" +" Py_INCREF(value);\n" +" self->first = value;\n" +" Py_DECREF(tmp);\n" +" return 0;\n" +"}" +msgstr "" +"static PyObject *\n" +"Custom_getfirst(PyObject *op, void *closure)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" Py_INCREF(self->first);\n" +" return self->first;\n" +"}\n" +"\n" +"static int\n" +"Custom_setfirst(PyObject *op, PyObject *value, void *closure)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" PyObject *tmp;\n" +" if (value == NULL) {\n" +" PyErr_SetString(PyExc_TypeError, \"Cannot delete the first attribute\");\n" +" return -1;\n" +" }\n" +" if (!PyUnicode_Check(value)) {\n" +" PyErr_SetString(PyExc_TypeError,\n" +" \"The first attribute value must be a string\");\n" +" return -1;\n" +" }\n" +" tmp = self->first;\n" +" Py_INCREF(value);\n" +" self->first = value;\n" +" Py_DECREF(tmp);\n" +" return 0;\n" +"}" + +#: ../../extending/newtypes_tutorial.rst:599 +msgid "" +"The getter function is passed a :class:`!Custom` object and a \"closure\", " +"which is a void pointer. In this case, the closure is ignored. (The " +"closure supports an advanced usage in which definition data is passed to the" +" getter and setter. This could, for example, be used to allow a single set " +"of getter and setter functions that decide the attribute to get or set based" +" on data in the closure.)" +msgstr "" +"读取器函数接受一个 :class:`!Custom` 对象和一个“闭包”,后者是一个空指针。在本例中,该闭包将被忽略。 (闭包支持将定义数据传递给 " +"读取器和设置器的高级用法。例如,这可以被用来允许一组获取器和设置器函数根据闭包中的数据来决定要读取或设置的属性)。" + +#: ../../extending/newtypes_tutorial.rst:605 +msgid "" +"The setter function is passed the :class:`!Custom` object, the new value, " +"and the closure. The new value may be ``NULL``, in which case the attribute" +" is being deleted. In our setter, we raise an error if the attribute is " +"deleted or if its new value is not a string." +msgstr "" +"设置器函数接受传入 :class:`!Custom` 对象、新值和闭包。新值可能为 ``NULL``,在这种情况下属性将被删除。 " +"在我们的设置器中,如果属性被删除或者如果其新值不是字符串则会引发一个错误。" + +#: ../../extending/newtypes_tutorial.rst:610 +msgid "We create an array of :c:type:`PyGetSetDef` structures::" +msgstr "我们创建一个 :c:type:`PyGetSetDef` 结构体的数组::" + +#: ../../extending/newtypes_tutorial.rst:612 +msgid "" +"static PyGetSetDef Custom_getsetters[] = {\n" +" {\"first\", Custom_getfirst, Custom_setfirst,\n" +" \"first name\", NULL},\n" +" {\"last\", Custom_getlast, Custom_setlast,\n" +" \"last name\", NULL},\n" +" {NULL} /* Sentinel */\n" +"};" +msgstr "" +"static PyGetSetDef Custom_getsetters[] = {\n" +" {\"first\", Custom_getfirst, Custom_setfirst,\n" +" \"first name\", NULL},\n" +" {\"last\", Custom_getlast, Custom_setlast,\n" +" \"last name\", NULL},\n" +" {NULL} /* Sentinel */\n" +"};" + +#: ../../extending/newtypes_tutorial.rst:620 +msgid "and register it in the :c:member:`~PyTypeObject.tp_getset` slot::" +msgstr "并在 :c:member:`~PyTypeObject.tp_getset` 槽位中注册它::" + +#: ../../extending/newtypes_tutorial.rst:622 +msgid ".tp_getset = Custom_getsetters," +msgstr ".tp_getset = Custom_getsetters," + +#: ../../extending/newtypes_tutorial.rst:624 +msgid "" +"The last item in a :c:type:`PyGetSetDef` structure is the \"closure\" " +"mentioned above. In this case, we aren't using a closure, so we just pass " +"``NULL``." +msgstr "" +"在 :c:type:`PyGetSetDef` 结构体中的最后一项是上面提到的“闭包”。 在本例中,我们没有使用闭包,因此我们只传入 ``NULL``。" + +#: ../../extending/newtypes_tutorial.rst:627 +msgid "We also remove the member definitions for these attributes::" +msgstr "我们还移除了这些属性的成员定义::" + +#: ../../extending/newtypes_tutorial.rst:629 +msgid "" +"static PyMemberDef Custom_members[] = {\n" +" {\"number\", Py_T_INT, offsetof(CustomObject, number), 0,\n" +" \"custom number\"},\n" +" {NULL} /* Sentinel */\n" +"};" +msgstr "" +"static PyMemberDef Custom_members[] = {\n" +" {\"number\", Py_T_INT, offsetof(CustomObject, number), 0,\n" +" \"custom number\"},\n" +" {NULL} /* Sentinel */\n" +"};" + +#: ../../extending/newtypes_tutorial.rst:635 +msgid "" +"We also need to update the :c:member:`~PyTypeObject.tp_init` handler to only" +" allow strings [#]_ to be passed::" +msgstr "我们还需要将 :c:member:`~PyTypeObject.tp_init` 处理器更新为只允许传入字符串 [#]_::" + +#: ../../extending/newtypes_tutorial.rst:638 +msgid "" +"static int\n" +"Custom_init(PyObject *op, PyObject *args, PyObject *kwds)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" static char *kwlist[] = {\"first\", \"last\", \"number\", NULL};\n" +" PyObject *first = NULL, *last = NULL, *tmp;\n" +"\n" +" if (!PyArg_ParseTupleAndKeywords(args, kwds, \"|UUi\", kwlist,\n" +" &first, &last,\n" +" &self->number))\n" +" return -1;\n" +"\n" +" if (first) {\n" +" tmp = self->first;\n" +" Py_INCREF(first);\n" +" self->first = first;\n" +" Py_DECREF(tmp);\n" +" }\n" +" if (last) {\n" +" tmp = self->last;\n" +" Py_INCREF(last);\n" +" self->last = last;\n" +" Py_DECREF(tmp);\n" +" }\n" +" return 0;\n" +"}" +msgstr "" +"static int\n" +"Custom_init(PyObject *op, PyObject *args, PyObject *kwds)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" static char *kwlist[] = {\"first\", \"last\", \"number\", NULL};\n" +" PyObject *first = NULL, *last = NULL, *tmp;\n" +"\n" +" if (!PyArg_ParseTupleAndKeywords(args, kwds, \"|UUi\", kwlist,\n" +" &first, &last,\n" +" &self->number))\n" +" return -1;\n" +"\n" +" if (first) {\n" +" tmp = self->first;\n" +" Py_INCREF(first);\n" +" self->first = first;\n" +" Py_DECREF(tmp);\n" +" }\n" +" if (last) {\n" +" tmp = self->last;\n" +" Py_INCREF(last);\n" +" self->last = last;\n" +" Py_DECREF(tmp);\n" +" }\n" +" return 0;\n" +"}" + +#: ../../extending/newtypes_tutorial.rst:665 +msgid "" +"With these changes, we can assure that the ``first`` and ``last`` members " +"are never ``NULL`` so we can remove checks for ``NULL`` values in almost all" +" cases. This means that most of the :c:func:`Py_XDECREF` calls can be " +"converted to :c:func:`Py_DECREF` calls. The only place we can't change " +"these calls is in the ``tp_dealloc`` implementation, where there is the " +"possibility that the initialization of these members failed in ``tp_new``." +msgstr "" +"通过这些更改,我们能够确保 ``first`` 和 ``last`` 成员一定不为 ``NULL`` 以便我们能在几乎所有情况下移除 ``NULL`` " +"值检查。这意味着大部分 :c:func:`Py_XDECREF` 调用都可以被转换为 :c:func:`Py_DECREF` 调用。 " +"我们不能更改这些调用的唯一场合是在 ``tp_dealloc`` 实现中,那里这些成员的初始化有可能在 ``tp_new`` 中失败。" + +#: ../../extending/newtypes_tutorial.rst:672 +msgid "" +"We also rename the module initialization function and module name in the " +"initialization function, as we did before, and we add an extra definition to" +" the :file:`setup.py` file." +msgstr "" +"我们还重命名了模块初始化函数和初始化函数中的模块名称,就像我们之前所做的一样,我们还向 :file:`setup.py` 文件添加了一个额外的定义。" + +#: ../../extending/newtypes_tutorial.rst:678 +msgid "Supporting cyclic garbage collection" +msgstr "支持循环垃圾回收" + +#: ../../extending/newtypes_tutorial.rst:680 +msgid "" +"Python has a :term:`cyclic garbage collector (GC) ` that" +" can identify unneeded objects even when their reference counts are not " +"zero. This can happen when objects are involved in cycles. For example, " +"consider:" +msgstr "" +"Python 具有一个可以标识不再需要的对象的 :term:`循环垃圾回收器 (GC) ` " +"即使它们的引用计数并不为零。这种情况会在对象被循环引用时发生。例如,设想:" + +#: ../../extending/newtypes_tutorial.rst:684 +msgid "" +">>> l = []\n" +">>> l.append(l)\n" +">>> del l" +msgstr "" +">>> l = []\n" +">>> l.append(l)\n" +">>> del l" + +#: ../../extending/newtypes_tutorial.rst:690 +msgid "" +"In this example, we create a list that contains itself. When we delete it, " +"it still has a reference from itself. Its reference count doesn't drop to " +"zero. Fortunately, Python's cyclic garbage collector will eventually figure " +"out that the list is garbage and free it." +msgstr "" +"在这个例子中,我们创建了一个包含其自身的列表。当我们删除它的时候,它将仍然具有一个来自其本身的引用。它的引用计数并未降为零。幸运的是,Python " +"的循环垃圾回收器将最终发现该列表是无用的垃圾并释放它。" + +#: ../../extending/newtypes_tutorial.rst:695 +msgid "" +"In the second version of the :class:`!Custom` example, we allowed any kind " +"of object to be stored in the :attr:`!first` or :attr:`!last` attributes " +"[#]_. Besides, in the second and third versions, we allowed subclassing " +":class:`!Custom`, and subclasses may add arbitrary attributes. For any of " +"those two reasons, :class:`!Custom` objects can participate in cycles:" +msgstr "" +"在 :class:`!Custom` 示例的第二个版本中,我们允许任意类型的对象存储到 :attr:`!first` 或 :attr:`!last` " +"属性中 [#]_。此外,在第二和第三个版本中,我们还允许子类化 :class:`!Custom`,并且子类可以添加任意属性。 " +"出于这两个原因中的任何一个,:class:`!Custom` 对象都可以加入循环:" + +#: ../../extending/newtypes_tutorial.rst:701 +msgid "" +">>> import custom3\n" +">>> class Derived(custom3.Custom): pass\n" +"...\n" +">>> n = Derived()\n" +">>> n.some_attribute = n" +msgstr "" +">>> import custom3\n" +">>> class Derived(custom3.Custom): pass\n" +"...\n" +">>> n = Derived()\n" +">>> n.some_attribute = n" + +#: ../../extending/newtypes_tutorial.rst:709 +msgid "" +"To allow a :class:`!Custom` instance participating in a reference cycle to " +"be properly detected and collected by the cyclic GC, our :class:`!Custom` " +"type needs to fill two additional slots and to enable a flag that enables " +"these slots:" +msgstr "" +"要允许一个加入引用循环的 :class:`!Custom` 实例能被循环 GC 正确检测和收集,我们的 :class:`!Custom` " +"类型需要填充两个额外的槽位并增加一个旗标来启用这些槽位:" + +#: ../../extending/newtypes_tutorial.rst:713 +msgid "" +"#define PY_SSIZE_T_CLEAN\n" +"#include \n" +"#include /* for offsetof() */\n" +"\n" +"typedef struct {\n" +" PyObject_HEAD\n" +" PyObject *first; /* first name */\n" +" PyObject *last; /* last name */\n" +" int number;\n" +"} CustomObject;\n" +"\n" +"static int\n" +"Custom_traverse(PyObject *op, visitproc visit, void *arg)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" Py_VISIT(self->first);\n" +" Py_VISIT(self->last);\n" +" return 0;\n" +"}\n" +"\n" +"static int\n" +"Custom_clear(PyObject *op)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" Py_CLEAR(self->first);\n" +" Py_CLEAR(self->last);\n" +" return 0;\n" +"}\n" +"\n" +"static void\n" +"Custom_dealloc(PyObject *op)\n" +"{\n" +" PyObject_GC_UnTrack(op);\n" +" (void)Custom_clear(op);\n" +" Py_TYPE(op)->tp_free(op);\n" +"}\n" +"\n" +"static PyObject *\n" +"Custom_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\n" +"{\n" +" CustomObject *self;\n" +" self = (CustomObject *) type->tp_alloc(type, 0);\n" +" if (self != NULL) {\n" +" self->first = Py_GetConstant(Py_CONSTANT_EMPTY_STR);\n" +" if (self->first == NULL) {\n" +" Py_DECREF(self);\n" +" return NULL;\n" +" }\n" +" self->last = Py_GetConstant(Py_CONSTANT_EMPTY_STR);\n" +" if (self->last == NULL) {\n" +" Py_DECREF(self);\n" +" return NULL;\n" +" }\n" +" self->number = 0;\n" +" }\n" +" return (PyObject *) self;\n" +"}\n" +"\n" +"static int\n" +"Custom_init(PyObject *op, PyObject *args, PyObject *kwds)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" static char *kwlist[] = {\"first\", \"last\", \"number\", NULL};\n" +" PyObject *first = NULL, *last = NULL;\n" +"\n" +" if (!PyArg_ParseTupleAndKeywords(args, kwds, \"|UUi\", kwlist,\n" +" &first, &last,\n" +" &self->number))\n" +" return -1;\n" +"\n" +" if (first) {\n" +" Py_SETREF(self->first, Py_NewRef(first));\n" +" }\n" +" if (last) {\n" +" Py_SETREF(self->last, Py_NewRef(last));\n" +" }\n" +" return 0;\n" +"}\n" +"\n" +"static PyMemberDef Custom_members[] = {\n" +" {\"number\", Py_T_INT, offsetof(CustomObject, number), 0,\n" +" \"custom number\"},\n" +" {NULL} /* Sentinel */\n" +"};\n" +"\n" +"static PyObject *\n" +"Custom_getfirst(PyObject *op, void *closure)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" return Py_NewRef(self->first);\n" +"}\n" +"\n" +"static int\n" +"Custom_setfirst(PyObject *op, PyObject *value, void *closure)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" if (value == NULL) {\n" +" PyErr_SetString(PyExc_TypeError, \"Cannot delete the first attribute\");\n" +" return -1;\n" +" }\n" +" if (!PyUnicode_Check(value)) {\n" +" PyErr_SetString(PyExc_TypeError,\n" +" \"The first attribute value must be a string\");\n" +" return -1;\n" +" }\n" +" Py_XSETREF(self->first, Py_NewRef(value));\n" +" return 0;\n" +"}\n" +"\n" +"static PyObject *\n" +"Custom_getlast(PyObject *op, void *closure)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" return Py_NewRef(self->last);\n" +"}\n" +"\n" +"static int\n" +"Custom_setlast(PyObject *op, PyObject *value, void *closure)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" if (value == NULL) {\n" +" PyErr_SetString(PyExc_TypeError, \"Cannot delete the last attribute\");\n" +" return -1;\n" +" }\n" +" if (!PyUnicode_Check(value)) {\n" +" PyErr_SetString(PyExc_TypeError,\n" +" \"The last attribute value must be a string\");\n" +" return -1;\n" +" }\n" +" Py_XSETREF(self->last, Py_NewRef(value));\n" +" return 0;\n" +"}\n" +"\n" +"static PyGetSetDef Custom_getsetters[] = {\n" +" {\"first\", Custom_getfirst, Custom_setfirst,\n" +" \"first name\", NULL},\n" +" {\"last\", Custom_getlast, Custom_setlast,\n" +" \"last name\", NULL},\n" +" {NULL} /* Sentinel */\n" +"};\n" +"\n" +"static PyObject *\n" +"Custom_name(PyObject *op, PyObject *Py_UNUSED(dummy))\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" return PyUnicode_FromFormat(\"%S %S\", self->first, self->last);\n" +"}\n" +"\n" +"static PyMethodDef Custom_methods[] = {\n" +" {\"name\", Custom_name, METH_NOARGS,\n" +" \"Return the name, combining the first and last name\"\n" +" },\n" +" {NULL} /* Sentinel */\n" +"};\n" +"\n" +"static PyTypeObject CustomType = {\n" +" .ob_base = PyVarObject_HEAD_INIT(NULL, 0)\n" +" .tp_name = \"custom4.Custom\",\n" +" .tp_doc = PyDoc_STR(\"Custom objects\"),\n" +" .tp_basicsize = sizeof(CustomObject),\n" +" .tp_itemsize = 0,\n" +" .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,\n" +" .tp_new = Custom_new,\n" +" .tp_init = Custom_init,\n" +" .tp_dealloc = Custom_dealloc,\n" +" .tp_traverse = Custom_traverse,\n" +" .tp_clear = Custom_clear,\n" +" .tp_members = Custom_members,\n" +" .tp_methods = Custom_methods,\n" +" .tp_getset = Custom_getsetters,\n" +"};\n" +"\n" +"static int\n" +"custom_module_exec(PyObject *m)\n" +"{\n" +" if (PyType_Ready(&CustomType) < 0) {\n" +" return -1;\n" +" }\n" +"\n" +" if (PyModule_AddObjectRef(m, \"Custom\", (PyObject *) &CustomType) < 0) {\n" +" return -1;\n" +" }\n" +"\n" +" return 0;\n" +"}\n" +"\n" +"static PyModuleDef_Slot custom_module_slots[] = {\n" +" {Py_mod_exec, custom_module_exec},\n" +" {Py_mod_multiple_interpreters, Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED},\n" +" {0, NULL}\n" +"};\n" +"\n" +"static PyModuleDef custom_module = {\n" +" .m_base = PyModuleDef_HEAD_INIT,\n" +" .m_name = \"custom4\",\n" +" .m_doc = \"Example module that creates an extension type.\",\n" +" .m_size = 0,\n" +" .m_slots = custom_module_slots,\n" +"};\n" +"\n" +"PyMODINIT_FUNC\n" +"PyInit_custom4(void)\n" +"{\n" +" return PyModuleDef_Init(&custom_module);\n" +"}\n" +msgstr "" +"#define PY_SSIZE_T_CLEAN\n" +"#include \n" +"#include /* for offsetof() */\n" +"\n" +"typedef struct {\n" +" PyObject_HEAD\n" +" PyObject *first; /* first name */\n" +" PyObject *last; /* last name */\n" +" int number;\n" +"} CustomObject;\n" +"\n" +"static int\n" +"Custom_traverse(PyObject *op, visitproc visit, void *arg)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" Py_VISIT(self->first);\n" +" Py_VISIT(self->last);\n" +" return 0;\n" +"}\n" +"\n" +"static int\n" +"Custom_clear(PyObject *op)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" Py_CLEAR(self->first);\n" +" Py_CLEAR(self->last);\n" +" return 0;\n" +"}\n" +"\n" +"static void\n" +"Custom_dealloc(PyObject *op)\n" +"{\n" +" PyObject_GC_UnTrack(op);\n" +" (void)Custom_clear(op);\n" +" Py_TYPE(op)->tp_free(op);\n" +"}\n" +"\n" +"static PyObject *\n" +"Custom_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\n" +"{\n" +" CustomObject *self;\n" +" self = (CustomObject *) type->tp_alloc(type, 0);\n" +" if (self != NULL) {\n" +" self->first = Py_GetConstant(Py_CONSTANT_EMPTY_STR);\n" +" if (self->first == NULL) {\n" +" Py_DECREF(self);\n" +" return NULL;\n" +" }\n" +" self->last = Py_GetConstant(Py_CONSTANT_EMPTY_STR);\n" +" if (self->last == NULL) {\n" +" Py_DECREF(self);\n" +" return NULL;\n" +" }\n" +" self->number = 0;\n" +" }\n" +" return (PyObject *) self;\n" +"}\n" +"\n" +"static int\n" +"Custom_init(PyObject *op, PyObject *args, PyObject *kwds)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" static char *kwlist[] = {\"first\", \"last\", \"number\", NULL};\n" +" PyObject *first = NULL, *last = NULL;\n" +"\n" +" if (!PyArg_ParseTupleAndKeywords(args, kwds, \"|UUi\", kwlist,\n" +" &first, &last,\n" +" &self->number))\n" +" return -1;\n" +"\n" +" if (first) {\n" +" Py_SETREF(self->first, Py_NewRef(first));\n" +" }\n" +" if (last) {\n" +" Py_SETREF(self->last, Py_NewRef(last));\n" +" }\n" +" return 0;\n" +"}\n" +"\n" +"static PyMemberDef Custom_members[] = {\n" +" {\"number\", Py_T_INT, offsetof(CustomObject, number), 0,\n" +" \"custom number\"},\n" +" {NULL} /* Sentinel */\n" +"};\n" +"\n" +"static PyObject *\n" +"Custom_getfirst(PyObject *op, void *closure)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" return Py_NewRef(self->first);\n" +"}\n" +"\n" +"static int\n" +"Custom_setfirst(PyObject *op, PyObject *value, void *closure)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" if (value == NULL) {\n" +" PyErr_SetString(PyExc_TypeError, \"Cannot delete the first attribute\");\n" +" return -1;\n" +" }\n" +" if (!PyUnicode_Check(value)) {\n" +" PyErr_SetString(PyExc_TypeError,\n" +" \"The first attribute value must be a string\");\n" +" return -1;\n" +" }\n" +" Py_XSETREF(self->first, Py_NewRef(value));\n" +" return 0;\n" +"}\n" +"\n" +"static PyObject *\n" +"Custom_getlast(PyObject *op, void *closure)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" return Py_NewRef(self->last);\n" +"}\n" +"\n" +"static int\n" +"Custom_setlast(PyObject *op, PyObject *value, void *closure)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" if (value == NULL) {\n" +" PyErr_SetString(PyExc_TypeError, \"Cannot delete the last attribute\");\n" +" return -1;\n" +" }\n" +" if (!PyUnicode_Check(value)) {\n" +" PyErr_SetString(PyExc_TypeError,\n" +" \"The last attribute value must be a string\");\n" +" return -1;\n" +" }\n" +" Py_XSETREF(self->last, Py_NewRef(value));\n" +" return 0;\n" +"}\n" +"\n" +"static PyGetSetDef Custom_getsetters[] = {\n" +" {\"first\", Custom_getfirst, Custom_setfirst,\n" +" \"first name\", NULL},\n" +" {\"last\", Custom_getlast, Custom_setlast,\n" +" \"last name\", NULL},\n" +" {NULL} /* Sentinel */\n" +"};\n" +"\n" +"static PyObject *\n" +"Custom_name(PyObject *op, PyObject *Py_UNUSED(dummy))\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" return PyUnicode_FromFormat(\"%S %S\", self->first, self->last);\n" +"}\n" +"\n" +"static PyMethodDef Custom_methods[] = {\n" +" {\"name\", Custom_name, METH_NOARGS,\n" +" \"Return the name, combining the first and last name\"\n" +" },\n" +" {NULL} /* Sentinel */\n" +"};\n" +"\n" +"static PyTypeObject CustomType = {\n" +" .ob_base = PyVarObject_HEAD_INIT(NULL, 0)\n" +" .tp_name = \"custom4.Custom\",\n" +" .tp_doc = PyDoc_STR(\"Custom objects\"),\n" +" .tp_basicsize = sizeof(CustomObject),\n" +" .tp_itemsize = 0,\n" +" .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,\n" +" .tp_new = Custom_new,\n" +" .tp_init = Custom_init,\n" +" .tp_dealloc = Custom_dealloc,\n" +" .tp_traverse = Custom_traverse,\n" +" .tp_clear = Custom_clear,\n" +" .tp_members = Custom_members,\n" +" .tp_methods = Custom_methods,\n" +" .tp_getset = Custom_getsetters,\n" +"};\n" +"\n" +"static int\n" +"custom_module_exec(PyObject *m)\n" +"{\n" +" if (PyType_Ready(&CustomType) < 0) {\n" +" return -1;\n" +" }\n" +"\n" +" if (PyModule_AddObjectRef(m, \"Custom\", (PyObject *) &CustomType) < 0) {\n" +" return -1;\n" +" }\n" +"\n" +" return 0;\n" +"}\n" +"\n" +"static PyModuleDef_Slot custom_module_slots[] = {\n" +" {Py_mod_exec, custom_module_exec},\n" +" {Py_mod_multiple_interpreters, Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED},\n" +" {0, NULL}\n" +"};\n" +"\n" +"static PyModuleDef custom_module = {\n" +" .m_base = PyModuleDef_HEAD_INIT,\n" +" .m_name = \"custom4\",\n" +" .m_doc = \"Example module that creates an extension type.\",\n" +" .m_size = 0,\n" +" .m_slots = custom_module_slots,\n" +"};\n" +"\n" +"PyMODINIT_FUNC\n" +"PyInit_custom4(void)\n" +"{\n" +" return PyModuleDef_Init(&custom_module);\n" +"}\n" + +#: ../../extending/newtypes_tutorial.rst:716 +msgid "" +"First, the traversal method lets the cyclic GC know about subobjects that " +"could participate in cycles::" +msgstr "首先,遍历方法让循环 GC 知道能够参与循环的子对象::" + +#: ../../extending/newtypes_tutorial.rst:719 +msgid "" +"static int\n" +"Custom_traverse(PyObject *op, visitproc visit, void *arg)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" int vret;\n" +" if (self->first) {\n" +" vret = visit(self->first, arg);\n" +" if (vret != 0)\n" +" return vret;\n" +" }\n" +" if (self->last) {\n" +" vret = visit(self->last, arg);\n" +" if (vret != 0)\n" +" return vret;\n" +" }\n" +" return 0;\n" +"}" +msgstr "" +"static int\n" +"Custom_traverse(PyObject *op, visitproc visit, void *arg)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" int vret;\n" +" if (self->first) {\n" +" vret = visit(self->first, arg);\n" +" if (vret != 0)\n" +" return vret;\n" +" }\n" +" if (self->last) {\n" +" vret = visit(self->last, arg);\n" +" if (vret != 0)\n" +" return vret;\n" +" }\n" +" return 0;\n" +"}" + +#: ../../extending/newtypes_tutorial.rst:737 +msgid "" +"For each subobject that can participate in cycles, we need to call the " +":c:func:`!visit` function, which is passed to the traversal method. The " +":c:func:`!visit` function takes as arguments the subobject and the extra " +"argument *arg* passed to the traversal method. It returns an integer value " +"that must be returned if it is non-zero." +msgstr "" +"对于每个可以参与循环的子对象,我们都需要调用 :c:func:`!visit` 函数,它会被传递给遍历方法。 :c:func:`!visit` " +"函数接受该子对象和传递给遍历方法的额外参数 *arg* 作为其参数。它返回一个在其为非零值时必须被返回的整数值。" + +#: ../../extending/newtypes_tutorial.rst:743 +msgid "" +"Python provides a :c:func:`Py_VISIT` macro that automates calling visit " +"functions. With :c:func:`Py_VISIT`, we can minimize the amount of " +"boilerplate in ``Custom_traverse``::" +msgstr "" +"Python 提供了一个可自动调用 visit 函数的 :c:func:`Py_VISIT` 宏。使用 " +":c:func:`Py_VISIT`,我们可以最小化 ``Custom_traverse`` 中的准备工作量::" + +#: ../../extending/newtypes_tutorial.rst:747 +msgid "" +"static int\n" +"Custom_traverse(PyObject *op, visitproc visit, void *arg)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" Py_VISIT(self->first);\n" +" Py_VISIT(self->last);\n" +" return 0;\n" +"}" +msgstr "" +"static int\n" +"Custom_traverse(PyObject *op, visitproc visit, void *arg)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" Py_VISIT(self->first);\n" +" Py_VISIT(self->last);\n" +" return 0;\n" +"}" + +#: ../../extending/newtypes_tutorial.rst:757 +msgid "" +"The :c:member:`~PyTypeObject.tp_traverse` implementation must name its " +"arguments exactly *visit* and *arg* in order to use :c:func:`Py_VISIT`." +msgstr "" +":c:member:`~PyTypeObject.tp_traverse` 实现必须将其参数准确命名为 *visit* 和 *arg* 以便使用 " +":c:func:`Py_VISIT`。" + +#: ../../extending/newtypes_tutorial.rst:760 +msgid "" +"Second, we need to provide a method for clearing any subobjects that can " +"participate in cycles::" +msgstr "第二,我们需要提供一个方法用来清除任何可以参与循环的子对象::" + +#: ../../extending/newtypes_tutorial.rst:763 +msgid "" +"static int\n" +"Custom_clear(PyObject *op)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" Py_CLEAR(self->first);\n" +" Py_CLEAR(self->last);\n" +" return 0;\n" +"}" +msgstr "" +"static int\n" +"Custom_clear(PyObject *op)\n" +"{\n" +" CustomObject *self = (CustomObject *) op;\n" +" Py_CLEAR(self->first);\n" +" Py_CLEAR(self->last);\n" +" return 0;\n" +"}" + +#: ../../extending/newtypes_tutorial.rst:772 +msgid "" +"Notice the use of the :c:func:`Py_CLEAR` macro. It is the recommended and " +"safe way to clear data attributes of arbitrary types while decrementing " +"their reference counts. If you were to call :c:func:`Py_XDECREF` instead on" +" the attribute before setting it to ``NULL``, there is a possibility that " +"the attribute's destructor would call back into code that reads the " +"attribute again (*especially* if there is a reference cycle)." +msgstr "" +"请注意 :c:func:`Py_CLEAR` 宏的使用。它是清除任意类型的数据属性并减少其引用计数的推荐的且安全的方式。如果你要选择在将属性设为 " +"``NULL`` 之前在属性上调用 :c:func:`Py_XDECREF`,则属性的析构器有可能会回调再次读取该属性的代码 (*特别是* " +"如果存在引用循环的话)。" + +#: ../../extending/newtypes_tutorial.rst:780 +msgid "You could emulate :c:func:`Py_CLEAR` by writing::" +msgstr "你可以通过以下写法来模拟 :c:func:`Py_CLEAR`::" + +#: ../../extending/newtypes_tutorial.rst:782 +msgid "" +"PyObject *tmp;\n" +"tmp = self->first;\n" +"self->first = NULL;\n" +"Py_XDECREF(tmp);" +msgstr "" +"PyObject *tmp;\n" +"tmp = self->first;\n" +"self->first = NULL;\n" +"Py_XDECREF(tmp);" + +#: ../../extending/newtypes_tutorial.rst:787 +msgid "" +"Nevertheless, it is much easier and less error-prone to always use " +":c:func:`Py_CLEAR` when deleting an attribute. Don't try to micro-optimize " +"at the expense of robustness!" +msgstr "无论如何,在删除属性时始终使用 :c:func:`Py_CLEAR` 都是更简单且更不易出错的。请不要尝试以健壮性为代价的微小优化!" + +#: ../../extending/newtypes_tutorial.rst:791 +msgid "" +"The deallocator ``Custom_dealloc`` may call arbitrary code when clearing " +"attributes. It means the circular GC can be triggered inside the function. " +"Since the GC assumes reference count is not zero, we need to untrack the " +"object from the GC by calling :c:func:`PyObject_GC_UnTrack` before clearing " +"members. Here is our reimplemented deallocator using " +":c:func:`PyObject_GC_UnTrack` and ``Custom_clear``::" +msgstr "" +"释放器 ``Custom_dealloc`` 可能会在清除属性时调用任意代码。这意味着循环 GC 可以在函数内部被触发。由于 GC " +"预期引用计数不为零,我们需要通过调用 :c:func:`PyObject_GC_UnTrack` 来让 GC 停止追踪相关的对象。下面是我们使用 " +":c:func:`PyObject_GC_UnTrack` 和 ``Custom_clear`` 重新实现的释放器::" + +#: ../../extending/newtypes_tutorial.rst:798 +msgid "" +"static void\n" +"Custom_dealloc(PyObject *op)\n" +"{\n" +" PyObject_GC_UnTrack(op);\n" +" (void)Custom_clear(op);\n" +" Py_TYPE(op)->tp_free(op);\n" +"}" +msgstr "" +"static void\n" +"Custom_dealloc(PyObject *op)\n" +"{\n" +" PyObject_GC_UnTrack(op);\n" +" (void)Custom_clear(op);\n" +" Py_TYPE(op)->tp_free(op);\n" +"}" + +#: ../../extending/newtypes_tutorial.rst:806 +msgid "" +"Finally, we add the :c:macro:`Py_TPFLAGS_HAVE_GC` flag to the class flags::" +msgstr "最后,我们将 :c:macro:`Py_TPFLAGS_HAVE_GC` 旗标添加到类旗标中::" + +#: ../../extending/newtypes_tutorial.rst:808 +msgid "" +".tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC," +msgstr "" +".tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC," + +#: ../../extending/newtypes_tutorial.rst:810 +msgid "" +"That's pretty much it. If we had written custom " +":c:member:`~PyTypeObject.tp_alloc` or :c:member:`~PyTypeObject.tp_free` " +"handlers, we'd need to modify them for cyclic garbage collection. Most " +"extensions will use the versions automatically provided." +msgstr "" +"这样就差不多了。如果我们编写了自定义的 :c:member:`~PyTypeObject.tp_alloc` 或 " +":c:member:`~PyTypeObject.tp_free` 处理器,则我们需要针对循环垃圾回收来修改它。大多数扩展都将使用自动提供的版本。" + +#: ../../extending/newtypes_tutorial.rst:816 +msgid "Subclassing other types" +msgstr "子类化其他类型" + +#: ../../extending/newtypes_tutorial.rst:818 +msgid "" +"It is possible to create new extension types that are derived from existing " +"types. It is easiest to inherit from the built in types, since an extension " +"can easily use the :c:type:`PyTypeObject` it needs. It can be difficult to " +"share these :c:type:`PyTypeObject` structures between extension modules." +msgstr "" +"创建派生自现有类型的新类型是有可能的。最容易的做法是从内置类型继承,因为扩展可以方便地使用它所需要的 :c:type:`PyTypeObject`。 " +"在不同扩展模块之间共享这些 :c:type:`PyTypeObject` 结构体则是困难的。" + +#: ../../extending/newtypes_tutorial.rst:823 +msgid "" +"In this example we will create a :class:`!SubList` type that inherits from " +"the built-in :class:`list` type. The new type will be completely compatible " +"with regular lists, but will have an additional :meth:`!increment` method " +"that increases an internal counter:" +msgstr "" +"在本例中我们将创建一个继承自内置 :class:`list` 类型的 :class:`!SubList` 类型。 " +"这个新类型将完全兼容常规列表,但将拥有一个额外的 :meth:`!increment` 方法用于递增内部计数器的值:" + +#: ../../extending/newtypes_tutorial.rst:828 +msgid "" +">>> import sublist\n" +">>> s = sublist.SubList(range(3))\n" +">>> s.extend(s)\n" +">>> print(len(s))\n" +"6\n" +">>> print(s.increment())\n" +"1\n" +">>> print(s.increment())\n" +"2" +msgstr "" +">>> import sublist\n" +">>> s = sublist.SubList(range(3))\n" +">>> s.extend(s)\n" +">>> print(len(s))\n" +"6\n" +">>> print(s.increment())\n" +"1\n" +">>> print(s.increment())\n" +"2" + +#: ../../extending/newtypes_tutorial.rst:840 +msgid "" +"#define PY_SSIZE_T_CLEAN\n" +"#include \n" +"\n" +"typedef struct {\n" +" PyListObject list;\n" +" int state;\n" +"} SubListObject;\n" +"\n" +"static PyObject *\n" +"SubList_increment(PyObject *op, PyObject *Py_UNUSED(dummy))\n" +"{\n" +" SubListObject *self = (SubListObject *) op;\n" +" self->state++;\n" +" return PyLong_FromLong(self->state);\n" +"}\n" +"\n" +"static PyMethodDef SubList_methods[] = {\n" +" {\"increment\", SubList_increment, METH_NOARGS,\n" +" PyDoc_STR(\"increment state counter\")},\n" +" {NULL},\n" +"};\n" +"\n" +"static int\n" +"SubList_init(PyObject *op, PyObject *args, PyObject *kwds)\n" +"{\n" +" SubListObject *self = (SubListObject *) op;\n" +" if (PyList_Type.tp_init(op, args, kwds) < 0)\n" +" return -1;\n" +" self->state = 0;\n" +" return 0;\n" +"}\n" +"\n" +"static PyTypeObject SubListType = {\n" +" .ob_base = PyVarObject_HEAD_INIT(NULL, 0)\n" +" .tp_name = \"sublist.SubList\",\n" +" .tp_doc = PyDoc_STR(\"SubList objects\"),\n" +" .tp_basicsize = sizeof(SubListObject),\n" +" .tp_itemsize = 0,\n" +" .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,\n" +" .tp_init = SubList_init,\n" +" .tp_methods = SubList_methods,\n" +"};\n" +"\n" +"static int\n" +"sublist_module_exec(PyObject *m)\n" +"{\n" +" SubListType.tp_base = &PyList_Type;\n" +" if (PyType_Ready(&SubListType) < 0) {\n" +" return -1;\n" +" }\n" +"\n" +" if (PyModule_AddObjectRef(m, \"SubList\", (PyObject *) &SubListType) < 0) {\n" +" return -1;\n" +" }\n" +"\n" +" return 0;\n" +"}\n" +"\n" +"static PyModuleDef_Slot sublist_module_slots[] = {\n" +" {Py_mod_exec, sublist_module_exec},\n" +" {Py_mod_multiple_interpreters, Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED},\n" +" {0, NULL}\n" +"};\n" +"\n" +"static PyModuleDef sublist_module = {\n" +" .m_base = PyModuleDef_HEAD_INIT,\n" +" .m_name = \"sublist\",\n" +" .m_doc = \"Example module that creates an extension type.\",\n" +" .m_size = 0,\n" +" .m_slots = sublist_module_slots,\n" +"};\n" +"\n" +"PyMODINIT_FUNC\n" +"PyInit_sublist(void)\n" +"{\n" +" return PyModuleDef_Init(&sublist_module);\n" +"}\n" +msgstr "" +"#define PY_SSIZE_T_CLEAN\n" +"#include \n" +"\n" +"typedef struct {\n" +" PyListObject list;\n" +" int state;\n" +"} SubListObject;\n" +"\n" +"static PyObject *\n" +"SubList_increment(PyObject *op, PyObject *Py_UNUSED(dummy))\n" +"{\n" +" SubListObject *self = (SubListObject *) op;\n" +" self->state++;\n" +" return PyLong_FromLong(self->state);\n" +"}\n" +"\n" +"static PyMethodDef SubList_methods[] = {\n" +" {\"increment\", SubList_increment, METH_NOARGS,\n" +" PyDoc_STR(\"increment state counter\")},\n" +" {NULL},\n" +"};\n" +"\n" +"static int\n" +"SubList_init(PyObject *op, PyObject *args, PyObject *kwds)\n" +"{\n" +" SubListObject *self = (SubListObject *) op;\n" +" if (PyList_Type.tp_init(op, args, kwds) < 0)\n" +" return -1;\n" +" self->state = 0;\n" +" return 0;\n" +"}\n" +"\n" +"static PyTypeObject SubListType = {\n" +" .ob_base = PyVarObject_HEAD_INIT(NULL, 0)\n" +" .tp_name = \"sublist.SubList\",\n" +" .tp_doc = PyDoc_STR(\"SubList objects\"),\n" +" .tp_basicsize = sizeof(SubListObject),\n" +" .tp_itemsize = 0,\n" +" .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,\n" +" .tp_init = SubList_init,\n" +" .tp_methods = SubList_methods,\n" +"};\n" +"\n" +"static int\n" +"sublist_module_exec(PyObject *m)\n" +"{\n" +" SubListType.tp_base = &PyList_Type;\n" +" if (PyType_Ready(&SubListType) < 0) {\n" +" return -1;\n" +" }\n" +"\n" +" if (PyModule_AddObjectRef(m, \"SubList\", (PyObject *) &SubListType) < 0) {\n" +" return -1;\n" +" }\n" +"\n" +" return 0;\n" +"}\n" +"\n" +"static PyModuleDef_Slot sublist_module_slots[] = {\n" +" {Py_mod_exec, sublist_module_exec},\n" +" {Py_mod_multiple_interpreters, Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED},\n" +" {0, NULL}\n" +"};\n" +"\n" +"static PyModuleDef sublist_module = {\n" +" .m_base = PyModuleDef_HEAD_INIT,\n" +" .m_name = \"sublist\",\n" +" .m_doc = \"Example module that creates an extension type.\",\n" +" .m_size = 0,\n" +" .m_slots = sublist_module_slots,\n" +"};\n" +"\n" +"PyMODINIT_FUNC\n" +"PyInit_sublist(void)\n" +"{\n" +" return PyModuleDef_Init(&sublist_module);\n" +"}\n" + +#: ../../extending/newtypes_tutorial.rst:843 +msgid "" +"As you can see, the source code closely resembles the :class:`!Custom` " +"examples in previous sections. We will break down the main differences " +"between them. ::" +msgstr "如你所见,此源代码与之前几节中的 :class:`!Custom` 示例非常相似。我们将逐一分析它们之间的主要区别。 ::" + +#: ../../extending/newtypes_tutorial.rst:846 +msgid "" +"typedef struct {\n" +" PyListObject list;\n" +" int state;\n" +"} SubListObject;" +msgstr "" +"typedef struct {\n" +" PyListObject list;\n" +" int state;\n" +"} SubListObject;" + +#: ../../extending/newtypes_tutorial.rst:851 +msgid "" +"The primary difference for derived type objects is that the base type's " +"object structure must be the first value. The base type will already " +"include the :c:func:`PyObject_HEAD` at the beginning of its structure." +msgstr "" +"派生类型对象的主要差异在于基类型的对象结构体必须是第一个值。基类型将已经在其结构体的开头包括了 :c:func:`PyObject_HEAD`。" + +#: ../../extending/newtypes_tutorial.rst:855 +msgid "" +"When a Python object is a :class:`!SubList` instance, its ``PyObject *`` " +"pointer can be safely cast to both ``PyListObject *`` and ``SubListObject " +"*``::" +msgstr "" +"当一个 Python 对象是 :class:`!SubList` 的实例时,它的 ``PyObject *`` 指针可以被安全地强制转换为 " +"``PyListObject *`` 和 ``SubListObject *``::" + +#: ../../extending/newtypes_tutorial.rst:858 +msgid "" +"static int\n" +"SubList_init(PyObject *op, PyObject *args, PyObject *kwds)\n" +"{\n" +" SubListObject *self = (SubListObject *) op;\n" +" if (PyList_Type.tp_init(op, args, kwds) < 0)\n" +" return -1;\n" +" self->state = 0;\n" +" return 0;\n" +"}" +msgstr "" +"static int\n" +"SubList_init(PyObject *op, PyObject *args, PyObject *kwds)\n" +"{\n" +" SubListObject *self = (SubListObject *) op;\n" +" if (PyList_Type.tp_init(op, args, kwds) < 0)\n" +" return -1;\n" +" self->state = 0;\n" +" return 0;\n" +"}" + +#: ../../extending/newtypes_tutorial.rst:868 +msgid "" +"We see above how to call through to the :meth:`~object.__init__` method of " +"the base type." +msgstr "我们可以在上面看到如何将调用传递到基类型的 :meth:`~object.__init__` 方法。" + +#: ../../extending/newtypes_tutorial.rst:871 +msgid "" +"This pattern is important when writing a type with custom " +":c:member:`~PyTypeObject.tp_new` and :c:member:`~PyTypeObject.tp_dealloc` " +"members. The :c:member:`~PyTypeObject.tp_new` handler should not actually " +"create the memory for the object with its " +":c:member:`~PyTypeObject.tp_alloc`, but let the base class handle it by " +"calling its own :c:member:`~PyTypeObject.tp_new`." +msgstr "" +"这个模式在编写具有自定义 :c:member:`~PyTypeObject.tp_new` 和 " +":c:member:`~PyTypeObject.tp_dealloc` 成员的类型时很重要。 " +":c:member:`~PyTypeObject.tp_new` 处理器不应为具有 :c:member:`~PyTypeObject.tp_alloc`" +" 的对象实际分配内存,而是让基类通过调用自己的 :c:member:`~PyTypeObject.tp_new` 来处理它。" + +#: ../../extending/newtypes_tutorial.rst:877 +msgid "" +"The :c:type:`PyTypeObject` struct supports a " +":c:member:`~PyTypeObject.tp_base` specifying the type's concrete base class." +" Due to cross-platform compiler issues, you can't fill that field directly " +"with a reference to :c:type:`PyList_Type`; it should be done in the " +":c:data:`Py_mod_exec` function::" +msgstr "" +":c:type:`PyTypeObject` 结构体支持用 :c:member:`~PyTypeObject.tp_base` 指定类型的实体基类。 " +"由于跨平台编译器的问题,你无法以对 :c:type:`PyList_Type` 的引用来直接填充该字段;它应当在 " +":c:data:`Py_mod_exec` 函数中完成::" + +#: ../../extending/newtypes_tutorial.rst:883 +msgid "" +"static int\n" +"sublist_module_exec(PyObject *m)\n" +"{\n" +" SubListType.tp_base = &PyList_Type;\n" +" if (PyType_Ready(&SubListType) < 0) {\n" +" return -1;\n" +" }\n" +"\n" +" if (PyModule_AddObjectRef(m, \"SubList\", (PyObject *) &SubListType) < 0) {\n" +" return -1;\n" +" }\n" +"\n" +" return 0;\n" +"}" +msgstr "" +"static int\n" +"sublist_module_exec(PyObject *m)\n" +"{\n" +" SubListType.tp_base = &PyList_Type;\n" +" if (PyType_Ready(&SubListType) < 0) {\n" +" return -1;\n" +" }\n" +"\n" +" if (PyModule_AddObjectRef(m, \"SubList\", (PyObject *) &SubListType) < 0) {\n" +" return -1;\n" +" }\n" +"\n" +" return 0;\n" +"}" + +#: ../../extending/newtypes_tutorial.rst:898 +msgid "" +"Before calling :c:func:`PyType_Ready`, the type structure must have the " +":c:member:`~PyTypeObject.tp_base` slot filled in. When we are deriving an " +"existing type, it is not necessary to fill out the " +":c:member:`~PyTypeObject.tp_alloc` slot with :c:func:`PyType_GenericNew` -- " +"the allocation function from the base type will be inherited." +msgstr "" +"在调用 :c:func:`PyType_Ready` 之前,类型结构体必须已经填充 :c:member:`~PyTypeObject.tp_base` " +"槽位。当我们从现有类型派生时,它不需要将 :c:member:`~PyTypeObject.tp_alloc` 槽位填充为 " +":c:func:`PyType_GenericNew` -- 来自基类型的分配函数将会被继承。" + +#: ../../extending/newtypes_tutorial.rst:904 +msgid "" +"After that, calling :c:func:`PyType_Ready` and adding the type object to the" +" module is the same as with the basic :class:`!Custom` examples." +msgstr "" +"在那之后,调用 :c:func:`PyType_Ready` 并将类型对象添加到模块中的过程与基本的 :class:`!Custom` 示例是一样的。" + +#: ../../extending/newtypes_tutorial.rst:909 +msgid "Footnotes" +msgstr "脚注" + +#: ../../extending/newtypes_tutorial.rst:910 +msgid "" +"This is true when we know that the object is a basic type, like a string or " +"a float." +msgstr "当我们知道该对象属于基本类型,如字符串或浮点数时情况就是如此。" + +#: ../../extending/newtypes_tutorial.rst:913 +msgid "" +"We relied on this in the :c:member:`~PyTypeObject.tp_dealloc` handler in " +"this example, because our type doesn't support garbage collection." +msgstr "" +"在本示例中我们需要 :c:member:`~PyTypeObject.tp_dealloc` 处理器中的这一机制,因为我们的类型不支持垃圾回收。" + +#: ../../extending/newtypes_tutorial.rst:916 +msgid "" +"We now know that the first and last members are strings, so perhaps we could" +" be less careful about decrementing their reference counts, however, we " +"accept instances of string subclasses. Even though deallocating normal " +"strings won't call back into our objects, we can't guarantee that " +"deallocating an instance of a string subclass won't call back into our " +"objects." +msgstr "" +"现在我们知道 first 和 last 成员都是字符串,因此也许我们可以对减少它们的引用计数不必太过小心,但是,我们还接受字符串子类的实例。 " +"即使释放普通字符串不会对我们的对象执行回调,我们也不能保证释放一个字符串子类的实例不会对我们的对象执行回调。" + +#: ../../extending/newtypes_tutorial.rst:922 +msgid "" +"Also, even with our attributes restricted to strings instances, the user " +"could pass arbitrary :class:`str` subclasses and therefore still create " +"reference cycles." +msgstr "而且,即使是将我们的属性限制为字符串实例,用户还是可以传入任意 :class:`str` 子类因而仍能造成引用循环。" diff --git a/extending/windows.po b/extending/windows.po new file mode 100644 index 0000000000..872e351468 --- /dev/null +++ b/extending/windows.po @@ -0,0 +1,292 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../extending/windows.rst:8 +msgid "Building C and C++ Extensions on Windows" +msgstr "在 Windows 上构建 C 和 C++ 扩展" + +#: ../../extending/windows.rst:10 +msgid "" +"This chapter briefly explains how to create a Windows extension module for " +"Python using Microsoft Visual C++, and follows with more detailed background" +" information on how it works. The explanatory material is useful for both " +"the Windows programmer learning to build Python extensions and the Unix " +"programmer interested in producing software which can be successfully built " +"on both Unix and Windows." +msgstr "" +"这一章简要介绍了如何使用 Microsoft Visual C++ 创建 Python 的 Windows " +"扩展模块,然后再提供有关其工作机理的详细背景信息。这些说明材料同时适用于 Windows 程序员学习构建 Python 扩展以及 Unix " +"程序员学习如何生成在 Unix 和 Windows 上均能成功构建的软件。" + +#: ../../extending/windows.rst:17 +msgid "" +"Module authors are encouraged to use the distutils approach for building " +"extension modules, instead of the one described in this section. You will " +"still need the C compiler that was used to build Python; typically Microsoft" +" Visual C++." +msgstr "" +"鼓励模块作者使用 distutils 方式来构建扩展模块,而不使用本节所描述的方式。你仍将需要用来构建 Python 的那个 C 编译器;通常为 " +"Microsoft Visual C++." + +#: ../../extending/windows.rst:24 +msgid "" +"This chapter mentions a number of filenames that include an encoded Python " +"version number. These filenames are represented with the version number " +"shown as ``XY``; in practice, ``'X'`` will be the major version number and " +"``'Y'`` will be the minor version number of the Python release you're " +"working with. For example, if you are using Python 2.2.1, ``XY`` will " +"actually be ``22``." +msgstr "" +"这一章提及了多个包括已编码 Python 版本号的文件名。这些文件名以显示为 ``XY`` 的版本号来代表;在实践中,``'X'`` 将为你所使用的 " +"Python 发布版的主版本号而 ``'Y'`` 将为次版本号。例如,如果你所使用的是 Python 2.2.1,``XY`` 将为 ``22``。" + +#: ../../extending/windows.rst:34 +msgid "A Cookbook Approach" +msgstr "菜谱式说明" + +#: ../../extending/windows.rst:36 +msgid "" +"There are two approaches to building extension modules on Windows, just as " +"there are on Unix: use the ``setuptools`` package to control the build " +"process, or do things manually. The setuptools approach works well for most" +" extensions; documentation on using ``setuptools`` to build and package " +"extension modules is available in :ref:`setuptools-index`. If you find you " +"really need to do things manually, it may be instructive to study the " +"project file for the :source:`winsound ` standard " +"library module." +msgstr "" +"与在 Unix 上一样,在 Windows 上构造扩展模块也有两种方式:使用 ``setuptools`` 包来控制构建过程,或者全手动操作。 " +"setuptools 方式适用于大多数扩展;使用 ``setuptools`` 构建和打包扩展模块的文档见 :ref:`setuptools-" +"index`。如果你发现你真的需要手动操作,那么研究一下 :source:`winsound ` " +"标准库模块的项目文件可能会很有帮助。" + +#: ../../extending/windows.rst:48 +msgid "Differences Between Unix and Windows" +msgstr "Unix 和 Windows 之间的差异" + +#: ../../extending/windows.rst:53 +msgid "" +"Unix and Windows use completely different paradigms for run-time loading of " +"code. Before you try to build a module that can be dynamically loaded, be " +"aware of how your system works." +msgstr "Unix 和 Windows 对于代码的运行时加载使用了完全不同的范式。在你尝试构建可动态加载的模块之前,要先了解你所用系统是如何工作的。" + +#: ../../extending/windows.rst:57 +msgid "" +"In Unix, a shared object (:file:`.so`) file contains code to be used by the " +"program, and also the names of functions and data that it expects to find in" +" the program. When the file is joined to the program, all references to " +"those functions and data in the file's code are changed to point to the " +"actual locations in the program where the functions and data are placed in " +"memory. This is basically a link operation." +msgstr "" +"在 Unix 中,一个共享对象 (:file:`.so`) 文件中包含将由程序来使用的代码,也包含在程序中可被找到的函数名称和数据。 " +"当文件被合并到程序中时,对在文件代码中这些函数和数据的全部引用都会被改为指向程序中函数和数据在内存中所放置的实际位置。这基本上是一个链接操作。" + +#: ../../extending/windows.rst:64 +msgid "" +"In Windows, a dynamic-link library (:file:`.dll`) file has no dangling " +"references. Instead, an access to functions or data goes through a lookup " +"table. So the DLL code does not have to be fixed up at runtime to refer to " +"the program's memory; instead, the code already uses the DLL's lookup table," +" and the lookup table is modified at runtime to point to the functions and " +"data." +msgstr "" +"在 Windows 中,一个动态链接库 (:file:`.dll`) 文件中没有悬挂的引用。而是通过一个查找表执行对函数或数据的访问。因此在运行时 " +"DLL 代码不必在运行时进行修改;相反地,代码已经使用了 DLL 的查找表,并且在运行时查找表会被修改以指向特定的函数和数据。" + +#: ../../extending/windows.rst:70 +msgid "" +"In Unix, there is only one type of library file (:file:`.a`) which contains " +"code from several object files (:file:`.o`). During the link step to create" +" a shared object file (:file:`.so`), the linker may find that it doesn't " +"know where an identifier is defined. The linker will look for it in the " +"object files in the libraries; if it finds it, it will include all the code " +"from that object file." +msgstr "" +"在 Unix 中,只存在一种库文件 (:file:`.a`),它包含来自多个对象文件 (:file:`.o`) 的代码。在创建共享对象文件 " +"(:file:`.so`) 的链接阶段,链接器可能会发现它不知道某个标识符是在哪里定义的。 " +"链接器将在各个库的对象文件中查找它;如果找到了它,链接器将会包括来自该对象文件的所有代码。" + +#: ../../extending/windows.rst:76 +msgid "" +"In Windows, there are two types of library, a static library and an import " +"library (both called :file:`.lib`). A static library is like a Unix " +":file:`.a` file; it contains code to be included as necessary. An import " +"library is basically used only to reassure the linker that a certain " +"identifier is legal, and will be present in the program when the DLL is " +"loaded. So the linker uses the information from the import library to build" +" the lookup table for using identifiers that are not included in the DLL. " +"When an application or a DLL is linked, an import library may be generated, " +"which will need to be used for all future DLLs that depend on the symbols in" +" the application or DLL." +msgstr "" +"在 Windows 中,存在两种库类型,静态库和导入库 (扩展名都是 :file:`.lib`)。静态库类似于 Unix 的 :file:`.a` " +"文件;它包含在必要时可被包括的代码。导入库基本上仅用于让链接器能确保特定标识符是合法的,并且将在 DLL 被加载时出现于程序中。 " +"这样链接器可使用来自导入库的信息构建查找表以便使用未包括在 DLL 中的标识符。当一个应用程序或 DLL " +"被链接时,可能会生成一个导入库,它将需要被用于应用程序或 DLL 中未来所有依赖于这些符号的 DLL。" + +#: ../../extending/windows.rst:86 +msgid "" +"Suppose you are building two dynamic-load modules, B and C, which should " +"share another block of code A. On Unix, you would *not* pass :file:`A.a` to" +" the linker for :file:`B.so` and :file:`C.so`; that would cause it to be " +"included twice, so that B and C would each have their own copy. In Windows," +" building :file:`A.dll` will also build :file:`A.lib`. You *do* pass " +":file:`A.lib` to the linker for B and C. :file:`A.lib` does not contain " +"code; it just contains information which will be used at runtime to access " +"A's code." +msgstr "" +"假设你正在编译两个动态加载模块 B 和 C,它们应当共享另一个代码块 A。在 Unix 上,你 *不应* 将 :file:`A.a` 传给链接器作为 " +":file:`B.so` 和 :file:`C.so`;那会导致它被包括两次,这样 B 和 C 将分别拥有它们自己的副本。在 Windows 上,编译 " +":file:`A.dll` 将同时编译 :file:`A.lib`。你 *应当* 将 :file:`A.lib` 传给链接器用于 B 和 C。 " +":file:`A.lib` 并不包含代码;它只包含将在运行时被用于访问 A 的代码的信息。" + +#: ../../extending/windows.rst:94 +msgid "" +"In Windows, using an import library is sort of like using ``import spam``; " +"it gives you access to spam's names, but does not create a separate copy. " +"On Unix, linking with a library is more like ``from spam import *``; it does" +" create a separate copy." +msgstr "" +"在 Windows 上,使用导入库有点像是使用 ``import spam``;它让你可以访问 spam 中的名称,但并不会创建一个单独副本。在 " +"Unix 上,链接到一个库更像是 ``from spam import *``;它会创建一个单独副本。" + +#: ../../extending/windows.rst:101 +msgid "" +"Turn off the implicit, ``#pragma``-based linkage with the Python library, " +"performed inside CPython header files." +msgstr "关闭在 CPython 头文件中执行的基于 ``#pragma`` 的与 Python 库的隐式链接。" + +#: ../../extending/windows.rst:110 +msgid "Using DLLs in Practice" +msgstr "DLL 的实际使用" + +#: ../../extending/windows.rst:115 +msgid "" +"Windows Python is built in Microsoft Visual C++; using other compilers may " +"or may not work. The rest of this section is MSVC++ specific." +msgstr "" +"Windows Python 是在 Microsoft Visual C++ 中构建的;使用其他编译器可能会也可能不会工作。本节的其余部分是针对 " +"MSVC++ 的。" + +#: ../../extending/windows.rst:118 +msgid "" +"When creating DLLs in Windows, you can use the CPython library in two ways:" +msgstr "在 Windows 中创建 DLL 时,你可以通过两种方式使用 CPython 库:" + +#: ../../extending/windows.rst:120 +msgid "" +"By default, inclusion of :file:`PC/pyconfig.h` directly or via " +":file:`Python.h` triggers an implicit, configure-aware link with the " +"library. The header file chooses :file:`pythonXY_d.lib` for Debug, " +":file:`pythonXY.lib` for Release, and :file:`pythonX.lib` for Release with " +"the :ref:`Limited API ` enabled." +msgstr "" +"默认情况下,直接包含 :file:`PC/pyconfig.h` 或通过 :file:`Python.h` 会触发与库的隐式、配置感知型的链接。 " +"头文件选择 :file:`pythonXY_d.lib` 用于调试,:file:`pythonXY.lib` 用于发布,以及 " +":file:`pythonX.lib` 用于启用了 :ref:`受限 API ` 的发布。" + +#: ../../extending/windows.rst:126 ../../extending/windows.rst:144 +msgid "" +"To build two DLLs, spam and ni (which uses C functions found in spam), you " +"could use these commands::" +msgstr "要构建两个 DLL,spam 和 ni (使用 spam 中找到的 C 函数),你应当使用以下命令::" + +#: ../../extending/windows.rst:129 +msgid "" +"cl /LD /I/python/include spam.c\n" +"cl /LD /I/python/include ni.c spam.lib" +msgstr "" +"cl /LD /I/python/include spam.c\n" +"cl /LD /I/python/include ni.c spam.lib" + +#: ../../extending/windows.rst:132 +msgid "" +"The first command created three files: :file:`spam.obj`, :file:`spam.dll` " +"and :file:`spam.lib`. :file:`Spam.dll` does not contain any Python " +"functions (such as :c:func:`PyArg_ParseTuple`), but it does know how to find" +" the Python code thanks to the implicitly linked :file:`pythonXY.lib`." +msgstr "" +"第一条命令创建了三个文件::file:`spam.obj`, :file:`spam.dll` 和 :file:`spam.lib`。 " +":file:`Spam.dll` 不包含任何 Python 函数 (如 :c:func:`PyArg_ParseTuple`),但因为有隐式链接的 " +":file:`pythonXY.lib` 所以它知道如何找到 Python 代码。" + +#: ../../extending/windows.rst:137 ../../extending/windows.rst:155 +msgid "" +"The second command created :file:`ni.dll` (and :file:`.obj` and " +":file:`.lib`), which knows how to find the necessary functions from spam, " +"and also from the Python executable." +msgstr "" +"第二条命令创建了 :file:`ni.dll` (以及 :file:`.obj` 和 :file:`.lib`),它知道如何从 spam 以及 " +"Python 可执行文件中找到所需的函数。" + +#: ../../extending/windows.rst:141 +msgid "" +"Manually by defining :c:macro:`Py_NO_LINK_LIB` macro before including " +":file:`Python.h`. You must pass :file:`pythonXY.lib` to the linker." +msgstr "" +"在包含 :file:`Python.h` 之前,手动定义 :c:macro:`Py_NO_LINK_LIB` 宏。必须将 " +":file:`pythonXY.lib` 传递给链接器。" + +#: ../../extending/windows.rst:147 +msgid "" +"cl /LD /DPy_NO_LINK_LIB /I/python/include spam.c ../libs/pythonXY.lib\n" +"cl /LD /DPy_NO_LINK_LIB /I/python/include ni.c spam.lib ../libs/pythonXY.lib" +msgstr "" +"cl /LD /DPy_NO_LINK_LIB /I/python/include spam.c ../libs/pythonXY.lib\n" +"cl /LD /DPy_NO_LINK_LIB /I/python/include ni.c spam.lib ../libs/pythonXY.lib" + +#: ../../extending/windows.rst:150 +msgid "" +"The first command created three files: :file:`spam.obj`, :file:`spam.dll` " +"and :file:`spam.lib`. :file:`Spam.dll` does not contain any Python " +"functions (such as :c:func:`PyArg_ParseTuple`), but it does know how to find" +" the Python code thanks to :file:`pythonXY.lib`." +msgstr "" +"第一条命令创建了三个文件::file:`spam.obj`, :file:`spam.dll` 和 :file:`spam.lib`。 " +":file:`Spam.dll` 不包含任何 Python 函数 (例如 :c:func:`PyArg_ParseTuple`),但它通过 " +":file:`pythonXY.lib` 可以知道如何找到所需的 Python 代码。" + +#: ../../extending/windows.rst:159 +msgid "" +"Not every identifier is exported to the lookup table. If you want any other" +" modules (including Python) to be able to see your identifiers, you have to " +"say ``_declspec(dllexport)``, as in ``void _declspec(dllexport) " +"initspam(void)`` or ``PyObject _declspec(dllexport) *NiGetSpamData(void)``." +msgstr "" +"不是每个标识符都会被导出到查找表。如果你想要任何其他模块(包括 Python)都能看到你的标识符,你必须写上 " +"``_declspec(dllexport)``,就如在 ``void _declspec(dllexport) initspam(void)`` 或 " +"``PyObject _declspec(dllexport) *NiGetSpamData(void)`` 中一样。" + +#: ../../extending/windows.rst:164 +msgid "" +"Developer Studio will throw in a lot of import libraries that you do not " +"really need, adding about 100K to your executable. To get rid of them, use " +"the Project Settings dialog, Link tab, to specify *ignore default " +"libraries*. Add the correct :file:`msvcrt{xx}.lib` to the list of " +"libraries." +msgstr "" +"Developer Studio 会添加很多你并不真正需要的导入库,使得你的可执行文件大小增加约 100K。 " +"要摆脱它们,请使用项目设置对话框中的链接选项卡指定 *忽略默认库*。将正确的 :file:`msvcrt{xx}.lib` 添加到库列表中。" diff --git a/faq/design.po b/faq/design.po new file mode 100644 index 0000000000..d0e2b21754 --- /dev/null +++ b/faq/design.po @@ -0,0 +1,1474 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-01 17:14+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../faq/design.rst:3 +msgid "Design and History FAQ" +msgstr "设计和历史常见问题" + +#: ../../faq/design.rst:6 +msgid "Contents" +msgstr "目录" + +#: ../../faq/design.rst:11 +msgid "Why does Python use indentation for grouping of statements?" +msgstr "为什么 Python 使用缩进来分组语句?" + +#: ../../faq/design.rst:13 +msgid "" +"Guido van Rossum believes that using indentation for grouping is extremely " +"elegant and contributes a lot to the clarity of the average Python program. " +"Most people learn to love this feature after a while." +msgstr "" +"Guido van Rossum 认为使用缩进进行分组非常优雅,并且大大提高了普通 Python 程序的清晰度。 " +"大多数人在一段时间后就会喜欢上这个特性。" + +#: ../../faq/design.rst:17 +msgid "" +"Since there are no begin/end brackets there cannot be a disagreement between" +" grouping perceived by the parser and the human reader. Occasionally C " +"programmers will encounter a fragment of code like this::" +msgstr "由于没有开始/结束括号,因此解析器感知的分组与人类读者之间不会存在分歧。偶尔 C 程序员会遇到像这样的代码片段::" + +#: ../../faq/design.rst:21 +msgid "" +"if (x <= y)\n" +" x++;\n" +" y--;\n" +"z++;" +msgstr "" +"if (x <= y)\n" +" x++;\n" +" y--;\n" +"z++;" + +#: ../../faq/design.rst:26 +msgid "" +"Only the ``x++`` statement is executed if the condition is true, but the " +"indentation leads many to believe otherwise. Even experienced C programmers" +" will sometimes stare at it a long time wondering as to why ``y`` is being " +"decremented even for ``x > y``." +msgstr "" +"如果条件为真,则只执行 ``x++`` 语句,但缩进会使你认为情况并非如此。即使是经验丰富的 C 程序员有时也会长久地盯着它发呆,不明白为什么在 ``x" +" > y`` 时 ``y`` 也会减少。" + +#: ../../faq/design.rst:31 +msgid "" +"Because there are no begin/end brackets, Python is much less prone to " +"coding-style conflicts. In C there are many different ways to place the " +"braces. After becoming used to reading and writing code using a particular " +"style, it is normal to feel somewhat uneasy when reading (or being required " +"to write) in a different one." +msgstr "" +"因为没有开始/结束花括号,所以 Python 更不容易发生代码风格冲突。在 C 中有许多不同的放置花括号的方式。 " +"在习惯了阅读和编写某种特定风格的代码之后,当阅读(或被要求编写)另一种风格的代码时通常都会令人感觉有点不舒服。" + +#: ../../faq/design.rst:38 +msgid "" +"Many coding styles place begin/end brackets on a line by themselves. This " +"makes programs considerably longer and wastes valuable screen space, making " +"it harder to get a good overview of a program. Ideally, a function should " +"fit on one screen (say, 20--30 lines). 20 lines of Python can do a lot more" +" work than 20 lines of C. This is not solely due to the lack of begin/end " +"brackets -- the lack of declarations and the high-level data types are also " +"responsible -- but the indentation-based syntax certainly helps." +msgstr "" +"许多编码风格将开始/结束括号单独放在一行上。这使得程序相当长,浪费了宝贵的屏幕空间,使得更难以对程序进行全面的了解。 " +"理想情况下,函数应该适合一个屏幕(例如,20--30 行)。20 行 Python 可以完成比 20 行 C 更多的工作。 " +"这不仅仅是由于没有开始/结束括号 -- 无需声明以及高层级的数据类型也是其中的原因 -- 但基于缩进的语法肯定有帮助。" + +#: ../../faq/design.rst:48 +msgid "Why am I getting strange results with simple arithmetic operations?" +msgstr "为什么简单的算术运算得到奇怪的结果?" + +#: ../../faq/design.rst:50 +msgid "See the next question." +msgstr "请看下一个问题。" + +#: ../../faq/design.rst:54 +msgid "Why are floating-point calculations so inaccurate?" +msgstr "为什么浮点计算不准确?" + +#: ../../faq/design.rst:56 +msgid "Users are often surprised by results like this::" +msgstr "用户经常对这样的结果感到惊讶::" + +#: ../../faq/design.rst:58 +msgid "" +">>> 1.2 - 1.0\n" +"0.19999999999999996" +msgstr "" +">>> 1.2 - 1.0\n" +"0.19999999999999996" + +#: ../../faq/design.rst:61 +msgid "" +"and think it is a bug in Python. It's not. This has little to do with " +"Python, and much more to do with how the underlying platform handles " +"floating-point numbers." +msgstr "并且认为这是 Python 中的一个 bug。其实不是这样。这与 Python 关系不大,而与底层平台如何处理浮点数字关系更大。" + +#: ../../faq/design.rst:65 +msgid "" +"The :class:`float` type in CPython uses a C ``double`` for storage. A " +":class:`float` object's value is stored in binary floating-point with a " +"fixed precision (typically 53 bits) and Python uses C operations, which in " +"turn rely on the hardware implementation in the processor, to perform " +"floating-point operations. This means that as far as floating-point " +"operations are concerned, Python behaves like many popular languages " +"including C and Java." +msgstr "" +"CPython 中的 :class:`float` 类型使用 C 语言的 ``double`` 类型进行存储。 :class:`float` " +"对象的值是以固定的精度(通常为 53 位)存储的二进制浮点数,由于 Python 使用 C 操作,而后者依赖于处理器中的硬件实现来执行浮点运算。 " +"这意味着就浮点运算而言,Python 的行为类似于许多流行的语言,包括 C 和 Java。" + +#: ../../faq/design.rst:72 +msgid "" +"Many numbers that can be written easily in decimal notation cannot be " +"expressed exactly in binary floating point. For example, after::" +msgstr "许多可以轻松地用十进制表示的数字不能用二进制浮点表示。例如,在输入以下语句后::" + +#: ../../faq/design.rst:75 +msgid ">>> x = 1.2" +msgstr ">>> x = 1.2" + +#: ../../faq/design.rst:77 +msgid "" +"the value stored for ``x`` is a (very good) approximation to the decimal " +"value ``1.2``, but is not exactly equal to it. On a typical machine, the " +"actual stored value is::" +msgstr "为 ``x`` 存储的值是与十进制的值 ``1.2`` (非常接近) 的近似值,但不完全等于它。在典型的机器上,实际存储的值是:" + +#: ../../faq/design.rst:81 +msgid "1.0011001100110011001100110011001100110011001100110011 (binary)" +msgstr "1.0011001100110011001100110011001100110011001100110011 (二进制)" + +#: ../../faq/design.rst:83 +msgid "which is exactly::" +msgstr "它对应于十进制数值::" + +#: ../../faq/design.rst:85 +msgid "1.1999999999999999555910790149937383830547332763671875 (decimal)" +msgstr "1.1999999999999999555910790149937383830547332763671875 (十进制)" + +#: ../../faq/design.rst:87 +msgid "" +"The typical precision of 53 bits provides Python floats with 15--16 decimal " +"digits of accuracy." +msgstr "典型的 53 位精度为 Python 浮点数提供了 15-16 位小数的精度。" + +#: ../../faq/design.rst:90 +msgid "" +"For a fuller explanation, please see the :ref:`floating-point arithmetic " +"` chapter in the Python tutorial." +msgstr "要获得更完整的解释,请参阅 Python 教程中的 :ref:`浮点算术 ` 一章。" + +#: ../../faq/design.rst:95 +msgid "Why are Python strings immutable?" +msgstr "为什么 Python 字符串是不可变的?" + +#: ../../faq/design.rst:97 +msgid "There are several advantages." +msgstr "有几个优点。" + +#: ../../faq/design.rst:99 +msgid "" +"One is performance: knowing that a string is immutable means we can allocate" +" space for it at creation time, and the storage requirements are fixed and " +"unchanging. This is also one of the reasons for the distinction between " +"tuples and lists." +msgstr "一个是性能:知道字符串是不可变的,意味着我们可以在创建时为它分配空间,并且存储需求是固定不变的。这也是元组和列表之间区别的原因之一。" + +#: ../../faq/design.rst:104 +msgid "" +"Another advantage is that strings in Python are considered as \"elemental\" " +"as numbers. No amount of activity will change the value 8 to anything else," +" and in Python, no amount of activity will change the string \"eight\" to " +"anything else." +msgstr "" +"另一个优点是,Python 中的字符串被视为与数字一样\"基本\"。任何动作都不会将值 8 更改为其他值,在 Python 中,任何动作都不会将字符串 " +"\"eight\" 更改为其他值。" + +#: ../../faq/design.rst:112 +msgid "Why must 'self' be used explicitly in method definitions and calls?" +msgstr "为什么必须在方法定义和调用中显式使用“self”?" + +#: ../../faq/design.rst:114 +msgid "" +"The idea was borrowed from Modula-3. It turns out to be very useful, for a " +"variety of reasons." +msgstr "这个想法借鉴了 Modula-3 语言。出于多种原因它被证明是非常有用的。" + +#: ../../faq/design.rst:117 +msgid "" +"First, it's more obvious that you are using a method or instance attribute " +"instead of a local variable. Reading ``self.x`` or ``self.meth()`` makes it" +" absolutely clear that an instance variable or method is used even if you " +"don't know the class definition by heart. In C++, you can sort of tell by " +"the lack of a local variable declaration (assuming globals are rare or " +"easily recognizable) -- but in Python, there are no local variable " +"declarations, so you'd have to look up the class definition to be sure. " +"Some C++ and Java coding standards call for instance attributes to have an " +"``m_`` prefix, so this explicitness is still useful in those languages, too." +msgstr "" +"首先,更明显的显示出,使用的是方法或实例属性而不是局部变量。阅读 ``self.x`` 或 ``self.meth()`` " +"可以清楚地表明,即使您不知道类的定义,也会使用实例变量或方法。在 C++ 中,可以通过缺少局部变量声明来判断(假设全局变量很少见或容易识别) —— " +"但是在 Python 中没有局部变量声明,所以必须查找类定义才能确定。一些 C++ 和 Java 编码标准要求实例属性具有 ``m_`` " +"前缀,因此这种显式性在这些语言中仍然有用。" + +#: ../../faq/design.rst:127 +msgid "" +"Second, it means that no special syntax is necessary if you want to " +"explicitly reference or call the method from a particular class. In C++, if" +" you want to use a method from a base class which is overridden in a derived" +" class, you have to use the ``::`` operator -- in Python you can write " +"``baseclass.methodname(self, )``. This is particularly " +"useful for :meth:`~object.__init__` methods, and in general in cases where a" +" derived class method wants to extend the base class method of the same name" +" and thus has to call the base class method somehow." +msgstr "" +"其次,这意味着当要显式引用或从特定类调用该方法时无须特殊语法。在 C++ 中,如果你想要使用在派生类中被重写的基类方法,你必须使用 ``::`` 运算符" +" -- 在 Python 中你可以写成 ``baseclass.methodname(self, )``。 这特别适用于 " +":meth:`~object.__init__` 方法,并且也适用于派生类方法想要扩展同名的基类方法因而必须以某种方式调用基类方法的情况。" + +#: ../../faq/design.rst:136 +msgid "" +"Finally, for instance variables it solves a syntactic problem with " +"assignment: since local variables in Python are (by definition!) those " +"variables to which a value is assigned in a function body (and that aren't " +"explicitly declared global), there has to be some way to tell the " +"interpreter that an assignment was meant to assign to an instance variable " +"instead of to a local variable, and it should preferably be syntactic (for " +"efficiency reasons). C++ does this through declarations, but Python doesn't" +" have declarations and it would be a pity having to introduce them just for " +"this purpose. Using the explicit ``self.var`` solves this nicely. " +"Similarly, for using instance variables, having to write ``self.var`` means " +"that references to unqualified names inside a method don't have to search " +"the instance's directories. To put it another way, local variables and " +"instance variables live in two different namespaces, and you need to tell " +"Python which namespace to use." +msgstr "" +"最后,它解决了实例变量赋值的语法问题:由于 Python " +"中的局部变量(根据定义!)是指在函数体内被赋值的变量(并且它没有被明确声明为全局变量),因此必须存在某种方式告诉解释器,某次赋值是为了分配一个实例变量而不是一个局部变量,它最好是通过语法实现的(出于效率原因)。" +" C++ 通过声明来做到这一点,但是 Python 没有声明,仅仅为了这个目的而引入它们会很可惜。使用显式的 ``self.var`` " +"很好地解决了这个问题。类似地,对于使用实例变量,必须编写 ``self.var`` 意味着对方法内部的非限定名称的引用不必搜索实例的目录。 " +"换句话说,局部变量和实例变量存在于两个不同的命名空间中,您需要告诉 Python 使用哪个命名空间。" + +#: ../../faq/design.rst:154 +msgid "Why can't I use an assignment in an expression?" +msgstr "为什么不能在表达式中赋值?" + +#: ../../faq/design.rst:156 +msgid "Starting in Python 3.8, you can!" +msgstr "自 Python 3.8 开始,你能做到的!" + +#: ../../faq/design.rst:158 +msgid "" +"Assignment expressions using the walrus operator ``:=`` assign a variable in" +" an expression::" +msgstr "赋值表达式使用海象运算符 ``:=`` 在表达式中为变量赋值::" + +#: ../../faq/design.rst:161 +msgid "" +"while chunk := fp.read(200):\n" +" print(chunk)" +msgstr "" +"while chunk := fp.read(200):\n" +" print(chunk)" + +#: ../../faq/design.rst:164 +msgid "See :pep:`572` for more information." +msgstr "请参阅 :pep:`572` 了解详情。" + +#: ../../faq/design.rst:169 +msgid "" +"Why does Python use methods for some functionality (e.g. list.index()) but " +"functions for other (e.g. len(list))?" +msgstr "为什么 Python 对某些功能(例如 list.index())使用方法来实现,而其他功能(例如 len(List))使用函数实现?" + +#: ../../faq/design.rst:171 +msgid "As Guido said:" +msgstr "正如 Guido 所说:" + +#: ../../faq/design.rst:173 +msgid "" +"(a) For some operations, prefix notation just reads better than postfix -- " +"prefix (and infix!) operations have a long tradition in mathematics which " +"likes notations where the visuals help the mathematician thinking about a " +"problem. Compare the easy with which we rewrite a formula like x*(a+b) into " +"x*a + x*b to the clumsiness of doing the same thing using a raw OO notation." +msgstr "" +"(a) 对于某些操作,前缀表示法比后缀更容易阅读 -- 前缀(和中缀!)运算在数学中有着悠久的传统,就像在视觉上帮助数学家思考问题的记法。比较一下我们将" +" x*(a+b) 这样的公式改写为 x*a+x*b 的容易程度,以及使用原始 OO 符号做相同事情的笨拙程度。" + +#: ../../faq/design.rst:180 +msgid "" +"(b) When I read code that says len(x) I *know* that it is asking for the " +"length of something. This tells me two things: the result is an integer, and" +" the argument is some kind of container. To the contrary, when I read " +"x.len(), I have to already know that x is some kind of container " +"implementing an interface or inheriting from a class that has a standard " +"len(). Witness the confusion we occasionally have when a class that is not " +"implementing a mapping has a get() or keys() method, or something that isn't" +" a file has a write() method." +msgstr "" +"(b) 当读到写有 len(x) 的代码时,就知道它要求的是某件东西的长度。这告诉我们两件事:结果是一个整数,参数是某种容器。相反,当阅读 " +"x.len() 时,必须已经知道 x 是某种实现接口的容器,或者是从具有标准 len() 的类继承的容器。当没有实现映射的类有 get() 或 " +"keys() 方法,或者不是文件的类有 write() 方法时,我们偶尔会感到困惑。" + +#: ../../faq/design.rst:189 +msgid "" +"https://mail.python.org/pipermail/python-3000/2006-November/004643.html" +msgstr "" +"https://mail.python.org/pipermail/python-3000/2006-November/004643.html" + +#: ../../faq/design.rst:193 +msgid "Why is join() a string method instead of a list or tuple method?" +msgstr "为什么 join() 是一个字符串方法而不是列表或元组方法?" + +#: ../../faq/design.rst:195 +msgid "" +"Strings became much more like other standard types starting in Python 1.6, " +"when methods were added which give the same functionality that has always " +"been available using the functions of the string module. Most of these new " +"methods have been widely accepted, but the one which appears to make some " +"programmers feel uncomfortable is::" +msgstr "" +"从 Python 1.6 开始,字符串变得更像其他标准类型,当添加方法时,这些方法提供的功能与始终使用 String " +"模块的函数时提供的功能相同。这些新方法中的大多数已被广泛接受,但似乎让一些程序员感到不舒服的一种方法是:" + +#: ../../faq/design.rst:201 +msgid "\", \".join(['1', '2', '4', '8', '16'])" +msgstr "\", \".join(['1', '2', '4', '8', '16'])" + +#: ../../faq/design.rst:203 +msgid "which gives the result::" +msgstr "结果如下::" + +#: ../../faq/design.rst:205 +msgid "\"1, 2, 4, 8, 16\"" +msgstr "\"1, 2, 4, 8, 16\"" + +#: ../../faq/design.rst:207 +msgid "There are two common arguments against this usage." +msgstr "反对这种用法有两个常见的论点。" + +#: ../../faq/design.rst:209 +msgid "" +"The first runs along the lines of: \"It looks really ugly using a method of " +"a string literal (string constant)\", to which the answer is that it might, " +"but a string literal is just a fixed value. If the methods are to be allowed" +" on names bound to strings there is no logical reason to make them " +"unavailable on literals." +msgstr "" +"第一条是这样的:“使用字符串文本 (String Constant) " +"的方法看起来真的很难看”,答案是也许吧,但是字符串文本只是一个固定值。如果在绑定到字符串的名称上允许使用这些方法,则没有逻辑上的理由使其在文字上不可用。" + +#: ../../faq/design.rst:215 +msgid "" +"The second objection is typically cast as: \"I am really telling a sequence " +"to join its members together with a string constant\". Sadly, you aren't. " +"For some reason there seems to be much less difficulty with having " +":meth:`~str.split` as a string method, since in that case it is easy to see " +"that ::" +msgstr "" +"第二个异议通常是这样的:“我实际上是在告诉序列使用字符串常量将其成员连接在一起”。遗憾的是并非如此。出于某种原因,把 " +":meth:`~str.split` 作为一个字符串方法似乎要容易得多,因为在这种情况下,很容易看到::" + +#: ../../faq/design.rst:220 +msgid "\"1, 2, 4, 8, 16\".split(\", \")" +msgstr "\"1, 2, 4, 8, 16\".split(\", \")" + +#: ../../faq/design.rst:222 +msgid "" +"is an instruction to a string literal to return the substrings delimited by " +"the given separator (or, by default, arbitrary runs of white space)." +msgstr "是对字符串文本的指令,用于返回由给定分隔符分隔的子字符串(或在默认情况下,返回任意空格)。" + +#: ../../faq/design.rst:225 +msgid "" +":meth:`~str.join` is a string method because in using it you are telling the" +" separator string to iterate over a sequence of strings and insert itself " +"between adjacent elements. This method can be used with any argument which " +"obeys the rules for sequence objects, including any new classes you might " +"define yourself. Similar methods exist for bytes and bytearray objects." +msgstr "" +":meth:`~str.join` " +"是字符串方法,因为在使用该方法时,您告诉分隔符字符串去迭代一个字符串序列,并在相邻元素之间插入自身。此方法的参数可以是任何遵循序列规则的对象,包括您自己定义的任何新的类。对于字节和字节数组对象也有类似的方法。" + +#: ../../faq/design.rst:233 +msgid "How fast are exceptions?" +msgstr "异常有多快?" + +#: ../../faq/design.rst:235 +msgid "" +"A :keyword:`try`/:keyword:`except` block is extremely efficient if no " +"exceptions are raised. Actually catching an exception is expensive. In " +"versions of Python prior to 2.0 it was common to use this idiom::" +msgstr "" +"如果没有引发异常则 :keyword:`try`/:keyword:`except` 代码块是非常高效的。实际上捕获异常是很消耗性能的。在 2.0 " +"之前的 Python 版本中通常使用这例程::" + +#: ../../faq/design.rst:240 +msgid "" +"try:\n" +" value = mydict[key]\n" +"except KeyError:\n" +" mydict[key] = getvalue(key)\n" +" value = mydict[key]" +msgstr "" +"try:\n" +" value = mydict[key]\n" +"except KeyError:\n" +" mydict[key] = getvalue(key)\n" +" value = mydict[key]" + +#: ../../faq/design.rst:246 +msgid "" +"This only made sense when you expected the dict to have the key almost all " +"the time. If that wasn't the case, you coded it like this::" +msgstr "只有当你期望 dict 几乎总是有该 key 时,这才有意义。如果不是这样的话,你就应该这样编码:" + +#: ../../faq/design.rst:249 +msgid "" +"if key in mydict:\n" +" value = mydict[key]\n" +"else:\n" +" value = mydict[key] = getvalue(key)" +msgstr "" +"if key in mydict:\n" +" value = mydict[key]\n" +"else:\n" +" value = mydict[key] = getvalue(key)" + +#: ../../faq/design.rst:254 +msgid "" +"For this specific case, you could also use ``value = dict.setdefault(key, " +"getvalue(key))``, but only if the ``getvalue()`` call is cheap enough " +"because it is evaluated in all cases." +msgstr "" +"对于这种特定的情况,您还可以使用 ``value = dict.setdefault(key, getvalue(key))``,但前提是调用 " +"``getvalue()`` 足够便宜,因为在所有情况下都会对其进行求值。" + +#: ../../faq/design.rst:260 +msgid "Why isn't there a switch or case statement in Python?" +msgstr "为什么 Python 中没有 switch 或 case 语句?" + +#: ../../faq/design.rst:262 +msgid "" +"In general, structured switch statements execute one block of code when an " +"expression has a particular value or set of values. Since Python 3.10 one " +"can easily match literal values, or constants within a namespace, with a " +"``match ... case`` statement. See :ref:`the specification ` and " +":ref:`the tutorial ` for more information about :keyword:`match` " +"statements. An older alternative is a sequence of ``if... elif... elif... " +"else``." +msgstr "" + +#: ../../faq/design.rst:270 +msgid "" +"For cases where you need to choose from a very large number of " +"possibilities, you can create a dictionary mapping case values to functions " +"to call. For example::" +msgstr "对于需要从大量可能性中进行选择的情况,可以创建一个字典,将 case 值映射到要调用的函数。例如:" + +#: ../../faq/design.rst:274 +msgid "" +"functions = {'a': function_1,\n" +" 'b': function_2,\n" +" 'c': self.method_1}\n" +"\n" +"func = functions[value]\n" +"func()" +msgstr "" +"functions = {'a': function_1,\n" +" 'b': function_2,\n" +" 'c': self.method_1}\n" +"\n" +"func = functions[value]\n" +"func()" + +#: ../../faq/design.rst:281 +msgid "" +"For calling methods on objects, you can simplify yet further by using the " +":func:`getattr` built-in to retrieve methods with a particular name::" +msgstr "对于对象调用方法,可以通过使用 :func:`getattr` 内置检索具有特定名称的方法来进一步简化:" + +#: ../../faq/design.rst:284 +msgid "" +"class MyVisitor:\n" +" def visit_a(self):\n" +" ...\n" +"\n" +" def dispatch(self, value):\n" +" method_name = 'visit_' + str(value)\n" +" method = getattr(self, method_name)\n" +" method()" +msgstr "" +"class MyVisitor:\n" +" def visit_a(self):\n" +" ...\n" +"\n" +" def dispatch(self, value):\n" +" method_name = 'visit_' + str(value)\n" +" method = getattr(self, method_name)\n" +" method()" + +#: ../../faq/design.rst:293 +msgid "" +"It's suggested that you use a prefix for the method names, such as " +"``visit_`` in this example. Without such a prefix, if values are coming " +"from an untrusted source, an attacker would be able to call any method on " +"your object." +msgstr "建议对方法名使用前缀,例如本例中的 ``visit_``。如果没有这样的前缀,如果值来自不受信任的源,攻击者将能够调用对象上的任何方法。" + +#: ../../faq/design.rst:297 +msgid "" +"Imitating switch with fallthrough, as with C's switch-case-default, is " +"possible, much harder, and less needed." +msgstr "模仿带有穿透方式的分支,就像 C 的 switch-case-default 那样是有可能的,但更为困难,也无甚必要。" + +#: ../../faq/design.rst:302 +msgid "" +"Can't you emulate threads in the interpreter instead of relying on an OS-" +"specific thread implementation?" +msgstr "难道不能在解释器中模拟线程,而非得依赖特定于操作系统的线程实现吗?" + +#: ../../faq/design.rst:304 +msgid "" +"Answer 1: Unfortunately, the interpreter pushes at least one C stack frame " +"for each Python stack frame. Also, extensions can call back into Python at " +"almost random moments. Therefore, a complete threads implementation " +"requires thread support for C." +msgstr "" +"答案 1:不幸的是,解释器为每个 Python 堆栈帧推送至少一个 C 堆栈帧。此外,扩展可以随时回调 Python。因此,一个完整的线程实现需要对 C" +" 的线程支持。" + +#: ../../faq/design.rst:309 +msgid "" +"Answer 2: Fortunately, there is `Stackless Python " +"`_, which has a completely " +"redesigned interpreter loop that avoids the C stack." +msgstr "" +"答案 2:幸运的是,`Stackless Python `_ 有一个完全重新设计的解释器循环,可以避免 C 堆栈。" + +#: ../../faq/design.rst:314 +msgid "Why can't lambda expressions contain statements?" +msgstr "为什么 lambda 表达式不能包含语句?" + +#: ../../faq/design.rst:316 +msgid "" +"Python lambda expressions cannot contain statements because Python's " +"syntactic framework can't handle statements nested inside expressions. " +"However, in Python, this is not a serious problem. Unlike lambda forms in " +"other languages, where they add functionality, Python lambdas are only a " +"shorthand notation if you're too lazy to define a function." +msgstr "" +"Python 的 lambda 表达式不能包含语句,因为 Python 的语法框架不能处理嵌套在表达式内部的语句。然而,在 Python " +"中,这并不是一个严重的问题。与其他语言中添加功能的 lambda 形式不同,Python 的 lambda 只是一种速记符号,如果您懒得定义函数的话。" + +#: ../../faq/design.rst:322 +msgid "" +"Functions are already first class objects in Python, and can be declared in " +"a local scope. Therefore the only advantage of using a lambda instead of a " +"locally defined function is that you don't need to invent a name for the " +"function -- but that's just a local variable to which the function object " +"(which is exactly the same type of object that a lambda expression yields) " +"is assigned!" +msgstr "" +"函数已经是 Python 中的第一等对象,并且可以在局部作用域中声明。因此使用 lambda 而非局部定义函数的唯一优点是你不需要为函数指定名称 -- " +"但那只是一个被赋值为函数对象(它的类型与 lambda 表达式所产生的对象完全相同)的局部变量!" + +#: ../../faq/design.rst:330 +msgid "Can Python be compiled to machine code, C or some other language?" +msgstr "可以将 Python 编译为机器代码,C 或其他语言吗?" + +#: ../../faq/design.rst:332 +msgid "" +"`Cython `_ compiles a modified version of Python with " +"optional annotations into C extensions. `Nuitka `_ is " +"an up-and-coming compiler of Python into C++ code, aiming to support the " +"full Python language." +msgstr "" +"`Cython `_ 会将带有可选标注的修改版 Python 编译为 C 扩展。`Nuitka " +"`_ 是一个 Python 转 C++ 代码的新兴编译器,其目标是支持完整的 Python 语言。" + +#: ../../faq/design.rst:339 +msgid "How does Python manage memory?" +msgstr "Python 如何管理内存?" + +#: ../../faq/design.rst:341 +msgid "" +"The details of Python memory management depend on the implementation. The " +"standard implementation of Python, :term:`CPython`, uses reference counting " +"to detect inaccessible objects, and another mechanism to collect reference " +"cycles, periodically executing a cycle detection algorithm which looks for " +"inaccessible cycles and deletes the objects involved. The :mod:`gc` module " +"provides functions to perform a garbage collection, obtain debugging " +"statistics, and tune the collector's parameters." +msgstr "" +"Python 内存管理的细节取决于实现。Python 的标准实现 :term:`CPython` " +"使用引用计数来检测不可访问的对象,并使用另一种机制来收集引用循环,定期执行循环检测算法来查找不可访问的循环并删除所涉及的对象。 :mod:`gc` " +"模块提供了执行垃圾回收、获取调试统计信息和优化收集器参数的函数。" + +#: ../../faq/design.rst:349 +msgid "" +"Other implementations (such as `Jython `_ or `PyPy " +"`_), however, can rely on a different mechanism such as a " +"full-blown garbage collector. This difference can cause some subtle porting" +" problems if your Python code depends on the behavior of the reference " +"counting implementation." +msgstr "" +"不过,其他实现 (如 `Jython `_ 或 `PyPy " +"`_),可能会依赖不同的机制,如完全的垃圾回收器。如果你的 Python " +"代码依赖于引用计数实现的行为则这种差异可能会导致某些微妙的移植问题。" + +#: ../../faq/design.rst:355 +msgid "" +"In some Python implementations, the following code (which is fine in " +"CPython) will probably run out of file descriptors::" +msgstr "在一些 Python 实现中,以下代码(在 CPython 中工作的很好)可能会耗尽文件描述符::" + +#: ../../faq/design.rst:358 +msgid "" +"for file in very_long_list_of_files:\n" +" f = open(file)\n" +" c = f.read(1)" +msgstr "" +"for file in very_long_list_of_files:\n" +" f = open(file)\n" +" c = f.read(1)" + +#: ../../faq/design.rst:362 +msgid "" +"Indeed, using CPython's reference counting and destructor scheme, each new " +"assignment to ``f`` closes the previous file. With a traditional GC, " +"however, those file objects will only get collected (and closed) at varying " +"and possibly long intervals." +msgstr "" +"实际上,使用 CPython 的引用计数和析构器方案,每次对 ``f`` 的新赋值都会关闭之前的文件。然而,对于传统的 " +"GC,这些文件对象将只能以不同的并且可能很长的间隔被收集(和关闭)。" + +#: ../../faq/design.rst:367 +msgid "" +"If you want to write code that will work with any Python implementation, you" +" should explicitly close the file or use the :keyword:`with` statement; this" +" will work regardless of memory management scheme::" +msgstr "" +"如果要编写可用于任何 Python 实现的代码,则应显式关闭该文件或使用 :keyword:`with` 语句;无论内存管理方案如何,这都有效:" + +#: ../../faq/design.rst:371 +msgid "" +"for file in very_long_list_of_files:\n" +" with open(file) as f:\n" +" c = f.read(1)" +msgstr "" +"for file in very_long_list_of_files:\n" +" with open(file) as f:\n" +" c = f.read(1)" + +#: ../../faq/design.rst:377 +msgid "Why doesn't CPython use a more traditional garbage collection scheme?" +msgstr "为什么 CPython 不使用更传统的垃圾回收方案?" + +#: ../../faq/design.rst:379 +msgid "" +"For one thing, this is not a C standard feature and hence it's not portable." +" (Yes, we know about the Boehm GC library. It has bits of assembler code " +"for *most* common platforms, not for all of them, and although it is mostly " +"transparent, it isn't completely transparent; patches are required to get " +"Python to work with it.)" +msgstr "" +"首先,这不是 C 标准特性,因此不能移植。(是的,我们知道 Boehm GC 库。它包含了 *大多数* " +"常见平台(但不是所有平台)的汇编代码,尽管它基本上是透明的,但也不是完全透明的; 要让 Python 使用它,需要使用补丁。)" + +#: ../../faq/design.rst:385 +msgid "" +"Traditional GC also becomes a problem when Python is embedded into other " +"applications. While in a standalone Python it's fine to replace the " +"standard ``malloc()`` and ``free()`` with versions provided by the GC " +"library, an application embedding Python may want to have its *own* " +"substitute for ``malloc()`` and ``free()``, and may not want Python's. " +"Right now, CPython works with anything that implements ``malloc()`` and " +"``free()`` properly." +msgstr "" +"当 Python 嵌入到其他应用程序中时传统的 GC 也会成为一个问题。在独立的 Python 中可以用 GC 库提供的版本来替换标准的 " +"``malloc()`` 和 ``free()``,而嵌入 Python 的应用程序可能想要 *自行* 替代 ``malloc()`` 和 " +"``free()``,并不想要 Python 的版本。现在,CPython 可以适用于任何正确实现了 ``malloc()`` 和 ``free()``" +" 的版本。" + +#: ../../faq/design.rst:394 +msgid "Why isn't all memory freed when CPython exits?" +msgstr "CPython 退出时为什么不释放所有内存?" + +#: ../../faq/design.rst:396 +msgid "" +"Objects referenced from the global namespaces of Python modules are not " +"always deallocated when Python exits. This may happen if there are circular" +" references. There are also certain bits of memory that are allocated by " +"the C library that are impossible to free (e.g. a tool like Purify will " +"complain about these). Python is, however, aggressive about cleaning up " +"memory on exit and does try to destroy every single object." +msgstr "" +"当 Python 退出时,从全局命名空间或 Python 模块引用的对象并不总是被释放。如果存在循环引用,则可能发生这种情况 C " +"库分配的某些内存也是不可能释放的(例如像 Purify 这样的工具会抱怨这些内容)。但是,Python 在退出时清理内存并尝试销毁每个对象。" + +#: ../../faq/design.rst:403 +msgid "" +"If you want to force Python to delete certain things on deallocation use the" +" :mod:`atexit` module to run a function that will force those deletions." +msgstr "如果要强制 Python 在释放时删除某些内容,请使用 :mod:`atexit` 模块运行一个函数,强制删除这些内容。" + +#: ../../faq/design.rst:408 +msgid "Why are there separate tuple and list data types?" +msgstr "为什么有单独的元组和列表数据类型?" + +#: ../../faq/design.rst:410 +msgid "" +"Lists and tuples, while similar in many respects, are generally used in " +"fundamentally different ways. Tuples can be thought of as being similar to " +"Pascal ``records`` or C ``structs``; they're small collections of related " +"data which may be of different types which are operated on as a group. For " +"example, a Cartesian coordinate is appropriately represented as a tuple of " +"two or three numbers." +msgstr "" +"列表和元组虽然在许多方式都很相似,但它们的使用方式有本质上的不同。元组可被当作是类似于 Pascal ``records`` 或 C " +"``structs``;它们是由可能具有不同类型但可作为一个分组进行操作的相关数据组成的小多项集。 " +"例如,一个笛卡尔坐标可适当地用由两个或三个数字组成的元组来表示。" + +#: ../../faq/design.rst:417 +msgid "" +"Lists, on the other hand, are more like arrays in other languages. They " +"tend to hold a varying number of objects all of which have the same type and" +" which are operated on one-by-one. For example, :func:`os.listdir('.') " +"` returns a list of strings representing the files in the " +"current directory. Functions which operate on this output would generally " +"not break if you added another file or two to the directory." +msgstr "" +"另一方面,列表更像其他语言中的数组。它们倾向于保存可变数量的全都具有相同类型并将被逐个操作的对象。例如,:func:`os.listdir('.') " +"` 返回一个代表当前目录中文件的字符串列表。当你向该目录添加一两个文件时在此输出上执行操作的函数通常不会中断。" + +#: ../../faq/design.rst:425 +msgid "" +"Tuples are immutable, meaning that once a tuple has been created, you can't " +"replace any of its elements with a new value. Lists are mutable, meaning " +"that you can always change a list's elements. Only immutable elements can " +"be used as dictionary keys, and hence only tuples and not lists can be used " +"as keys." +msgstr "" +"元组是不可变的,这意味着一旦创建了元组,就不能用新值替换它的任何元素。列表是可变的,这意味着您始终可以更改列表的元素。只有不可变元素可以用作字典键,因此只能将元组而非列表用作键。" + +#: ../../faq/design.rst:432 +msgid "How are lists implemented in CPython?" +msgstr "列表是如何在 CPython 中实现的?" + +#: ../../faq/design.rst:434 +msgid "" +"CPython's lists are really variable-length arrays, not Lisp-style linked " +"lists. The implementation uses a contiguous array of references to other " +"objects, and keeps a pointer to this array and the array's length in a list " +"head structure." +msgstr "" +"CPython 的列表实际上是可变长度的数组,而不是 lisp " +"风格的链表。该实现使用对其他对象的引用的连续数组,并在列表头结构中保留指向该数组和数组长度的指针。" + +#: ../../faq/design.rst:438 +msgid "" +"This makes indexing a list ``a[i]`` an operation whose cost is independent " +"of the size of the list or the value of the index." +msgstr "这使得索引列表 ``a[i]`` 的操作成本与列表的大小或索引的值无关。" + +#: ../../faq/design.rst:441 +msgid "" +"When items are appended or inserted, the array of references is resized. " +"Some cleverness is applied to improve the performance of appending items " +"repeatedly; when the array must be grown, some extra space is allocated so " +"the next few times don't require an actual resize." +msgstr "" +"当添加或插入项时,将调整引用数组的大小。并采用了一些巧妙的方法来提高重复添加项的性能; " +"当数组必须增长时,会分配一些额外的空间,以便在接下来的几次中不需要实际调整大小。" + +#: ../../faq/design.rst:448 +msgid "How are dictionaries implemented in CPython?" +msgstr "字典是如何在 CPython 中实现的?" + +#: ../../faq/design.rst:450 +msgid "" +"CPython's dictionaries are implemented as resizable hash tables. Compared " +"to B-trees, this gives better performance for lookup (the most common " +"operation by far) under most circumstances, and the implementation is " +"simpler." +msgstr "" +"CPython 的字典实现为可调整大小的哈希表。与 B-树相比,这在大多数情况下为查找(目前最常见的操作)提供了更好的性能,并且实现更简单。" + +#: ../../faq/design.rst:454 +msgid "" +"Dictionaries work by computing a hash code for each key stored in the " +"dictionary using the :func:`hash` built-in function. The hash code varies " +"widely depending on the key and a per-process seed; for example, " +"``'Python'`` could hash to ``-539294296`` while ``'python'``, a string that " +"differs by a single bit, could hash to ``1142331976``. The hash code is " +"then used to calculate a location in an internal array where the value will " +"be stored. Assuming that you're storing keys that all have different hash " +"values, this means that dictionaries take constant time -- *O*\\ (1), in " +"Big-O notation -- to retrieve a key." +msgstr "" +"字典的工作方式是使用 :func:`hash` 内置函数计算字典中存储的每个键的哈希码。 " +"哈希码会根据键和基于进程的种子值而大幅改变;例如,``'Python'`` 的哈希码可能为 ``-539294296`` 而 ``'python'`` " +"这个只相差一丁点的字符串的哈希码却可能为 ``1142331976``。随后哈希码将被用来计算在一个内部数组中相应值的存储位置。 " +"假设你存储的键都具有不同的哈希值,这意味着字典会耗费恒定的时间 -- 即大 O 表示法的 *O*\\ (1) -- 要检索一个键。" + +#: ../../faq/design.rst:465 +msgid "Why must dictionary keys be immutable?" +msgstr "为什么字典 key 必须是不可变的?" + +#: ../../faq/design.rst:467 +msgid "" +"The hash table implementation of dictionaries uses a hash value calculated " +"from the key value to find the key. If the key were a mutable object, its " +"value could change, and thus its hash could also change. But since whoever " +"changes the key object can't tell that it was being used as a dictionary " +"key, it can't move the entry around in the dictionary. Then, when you try " +"to look up the same object in the dictionary it won't be found because its " +"hash value is different. If you tried to look up the old value it wouldn't " +"be found either, because the value of the object found in that hash bin " +"would be different." +msgstr "" +"字典的哈希表实现使用从键值计算的哈希值来查找键。如果键是可变对象,则其值可能会发生变化,因此其哈希值也会发生变化。但是,由于无论谁更改键对象都无法判断它是否被用作字典键值,因此无法在字典中修改条目。然后,当你尝试在字典中查找相同的对象时,将无法找到它,因为其哈希值不同。如果你尝试查找旧值,也不会找到它,因为在该哈希表中找到的对象的值会有所不同。" + +#: ../../faq/design.rst:476 +msgid "" +"If you want a dictionary indexed with a list, simply convert the list to a " +"tuple first; the function ``tuple(L)`` creates a tuple with the same entries" +" as the list ``L``. Tuples are immutable and can therefore be used as " +"dictionary keys." +msgstr "" +"如果你想要一个用列表索引的字典,只需先将列表转换为元组;用函数 ``tuple(L)`` 创建一个元组,其条目与列表 ``L`` 相同。 " +"元组是不可变的,因此可以用作字典键。" + +#: ../../faq/design.rst:480 +msgid "Some unacceptable solutions that have been proposed:" +msgstr "已经提出的一些不可接受的解决方案:" + +#: ../../faq/design.rst:482 +msgid "" +"Hash lists by their address (object ID). This doesn't work because if you " +"construct a new list with the same value it won't be found; e.g.::" +msgstr "哈希按其地址(对象 ID)列出。这不起作用,因为如果你构造一个具有相同值的新列表,它将无法找到;例如::" + +#: ../../faq/design.rst:485 +msgid "" +"mydict = {[1, 2]: '12'}\n" +"print(mydict[[1, 2]])" +msgstr "" +"mydict = {[1, 2]: '12'}\n" +"print(mydict[[1, 2]])" + +#: ../../faq/design.rst:488 +msgid "" +"would raise a :exc:`KeyError` exception because the id of the ``[1, 2]`` " +"used in the second line differs from that in the first line. In other " +"words, dictionary keys should be compared using ``==``, not using " +":keyword:`is`." +msgstr "" +"会引发一个 :exc:`KeyError` 异常,因为第二行中使用的 ``[1, 2]`` 的 id 与第一行中的 id 不同。换句话说,应该使用 " +"``==`` 来比较字典键,而不是使用 :keyword:`is`。" + +#: ../../faq/design.rst:492 +msgid "" +"Make a copy when using a list as a key. This doesn't work because the list," +" being a mutable object, could contain a reference to itself, and then the " +"copying code would run into an infinite loop." +msgstr "使用列表作为键时进行复制。这没有用的,因为作为可变对象的列表可以包含对自身的引用,然后复制代码将进入无限循环。" + +#: ../../faq/design.rst:496 +msgid "" +"Allow lists as keys but tell the user not to modify them. This would allow " +"a class of hard-to-track bugs in programs when you forgot or modified a list" +" by accident. It also invalidates an important invariant of dictionaries: " +"every value in ``d.keys()`` is usable as a key of the dictionary." +msgstr "" +"允许列表作为键,但告诉用户不要修改它们。当你意外忘记或修改列表时,这将产生程序中的一类难以跟踪的错误。它还使一个重要的字典不变量无效: " +"``d.keys()`` 中的每个值都可用作字典的键。" + +#: ../../faq/design.rst:501 +msgid "" +"Mark lists as read-only once they are used as a dictionary key. The problem" +" is that it's not just the top-level object that could change its value; you" +" could use a tuple containing a list as a key. Entering anything as a key " +"into a dictionary would require marking all objects reachable from there as " +"read-only -- and again, self-referential objects could cause an infinite " +"loop." +msgstr "" +"将列表用作字典键后,应标记为其只读。问题是,它不仅仅是可以改变其值的顶级对象;你可以使用包含列表作为键的元组。将任何内容作为键关联到字典中都需要将从那里可到达的所有对象标记为只读" +" —— 并且自引用对象可能会导致无限循环。" + +#: ../../faq/design.rst:507 +msgid "" +"There is a trick to get around this if you need to, but use it at your own " +"risk: You can wrap a mutable structure inside a class instance which has " +"both a :meth:`~object.__eq__` and a :meth:`~object.__hash__` method. You " +"must then make sure that the hash value for all such wrapper objects that " +"reside in a dictionary (or other hash based structure), remain fixed while " +"the object is in the dictionary (or other structure). ::" +msgstr "" +"如果你有需要,以下技巧可以绕过这个问题,但使用它必须自担风险:你可以将一个可变结构体包装在一个同时具有 :meth:`~object.__eq__` 和" +" :meth:`~object.__hash__` 方法的类实例中。 " +"然后你必须确保存放在字典(或其他基于哈希值的结构体)中的所有此类包装器对象的哈希值在该字典(或其他结构体)中保持固定。 ::" + +#: ../../faq/design.rst:515 +msgid "" +"class ListWrapper:\n" +" def __init__(self, the_list):\n" +" self.the_list = the_list\n" +"\n" +" def __eq__(self, other):\n" +" return self.the_list == other.the_list\n" +"\n" +" def __hash__(self):\n" +" l = self.the_list\n" +" result = 98767 - len(l)*555\n" +" for i, el in enumerate(l):\n" +" try:\n" +" result = result + (hash(el) % 9999999) * 1001 + i\n" +" except Exception:\n" +" result = (result % 7777777) + i * 333\n" +" return result" +msgstr "" +"class ListWrapper:\n" +" def __init__(self, the_list):\n" +" self.the_list = the_list\n" +"\n" +" def __eq__(self, other):\n" +" return self.the_list == other.the_list\n" +"\n" +" def __hash__(self):\n" +" l = self.the_list\n" +" result = 98767 - len(l)*555\n" +" for i, el in enumerate(l):\n" +" try:\n" +" result = result + (hash(el) % 9999999) * 1001 + i\n" +" except Exception:\n" +" result = (result % 7777777) + i * 333\n" +" return result" + +#: ../../faq/design.rst:532 +msgid "" +"Note that the hash computation is complicated by the possibility that some " +"members of the list may be unhashable and also by the possibility of " +"arithmetic overflow." +msgstr "注意,哈希计算由于列表的某些成员可能不可哈希以及算术溢出的可能性而变得复杂。" + +#: ../../faq/design.rst:536 +msgid "" +"Furthermore it must always be the case that if ``o1 == o2`` (ie " +"``o1.__eq__(o2) is True``) then ``hash(o1) == hash(o2)`` (ie, " +"``o1.__hash__() == o2.__hash__()``), regardless of whether the object is in " +"a dictionary or not. If you fail to meet these restrictions dictionaries " +"and other hash based structures will misbehave." +msgstr "" +"此外,必须始终如此,如果 ``o1 == o2`` (即 ``o1.__eq__(o2) is True``) 则 ``hash(o1) == " +"hash(o2)`` (即 ``o1.__hash__() == o2.__hash__()``),无论对象是否在字典中。 " +"如果你不能满足这些限制,字典和其他基于 hash 的结构将会出错。" + +#: ../../faq/design.rst:541 +msgid "" +"In the case of :class:`!ListWrapper`, whenever the wrapper object is in a " +"dictionary the wrapped list must not change to avoid anomalies. Don't do " +"this unless you are prepared to think hard about the requirements and the " +"consequences of not meeting them correctly. Consider yourself warned." +msgstr "" +"对于 :class:`!ListWrapper` 的情况,只要包装器位于字典中那么被包装的列表就不能更改以避免发生意外。 " +"除非你准备好认真考虑相关要求以及未能正确满足这些要求的后果否则请不要这样做。你已经收到警告了。" + +#: ../../faq/design.rst:548 +msgid "Why doesn't list.sort() return the sorted list?" +msgstr "为什么 list.sort() 没有返回排序列表?" + +#: ../../faq/design.rst:550 +msgid "" +"In situations where performance matters, making a copy of the list just to " +"sort it would be wasteful. Therefore, :meth:`list.sort` sorts the list in " +"place. In order to remind you of that fact, it does not return the sorted " +"list. This way, you won't be fooled into accidentally overwriting a list " +"when you need a sorted copy but also need to keep the unsorted version " +"around." +msgstr "" +"在性能很重要的情况下,仅仅为了排序而复制一份列表将是一种浪费。因此, :meth:`list.sort` " +"对列表进行了适当的排序。为了提醒您这一事实,它不会返回已排序的列表。这样,当您需要排序的副本,但也需要保留未排序的版本时,就不会意外地覆盖列表。" + +#: ../../faq/design.rst:556 +msgid "" +"If you want to return a new list, use the built-in :func:`sorted` function " +"instead. This function creates a new list from a provided iterable, sorts " +"it and returns it. For example, here's how to iterate over the keys of a " +"dictionary in sorted order::" +msgstr "" +"如果要返回新列表,请使用内置 :func:`sorted` " +"函数。此函数从提供的可迭代列表中创建新列表,对其进行排序并返回。例如,下面是如何迭代遍历字典并按 keys 排序::" + +#: ../../faq/design.rst:561 +msgid "" +"for key in sorted(mydict):\n" +" ... # do whatever with mydict[key]..." +msgstr "" +"for key in sorted(mydict):\n" +" ... # 对 mydict[key] 做点什么" + +#: ../../faq/design.rst:566 +msgid "How do you specify and enforce an interface spec in Python?" +msgstr "如何在 Python 中指定和实施接口规范?" + +#: ../../faq/design.rst:568 +msgid "" +"An interface specification for a module as provided by languages such as C++" +" and Java describes the prototypes for the methods and functions of the " +"module. Many feel that compile-time enforcement of interface specifications" +" helps in the construction of large programs." +msgstr "由 C++ 和 Java 等语言提供的模块接口规范描述了模块的方法和函数的原型。许多人认为接口规范的编译时强制执行有助于构建大型程序。" + +#: ../../faq/design.rst:573 +msgid "" +"Python 2.6 adds an :mod:`abc` module that lets you define Abstract Base " +"Classes (ABCs). You can then use :func:`isinstance` and :func:`issubclass` " +"to check whether an instance or a class implements a particular ABC. The " +":mod:`collections.abc` module defines a set of useful ABCs such as " +":class:`~collections.abc.Iterable`, :class:`~collections.abc.Container`, and" +" :class:`~collections.abc.MutableMapping`." +msgstr "" +"Python 2.6 添加了一个 :mod:`abc` 模块,允许定义抽象基类 (ABCs)。然后可以使用 :func:`isinstance` 和 " +":func:`issubclass` 来检查实例或类是否实现了特定的 ABC。 :mod:`collections.abc` 模块定义了一组有用的 " +"ABCs 例如 :class:`~collections.abc.Iterable`, " +":class:`~collections.abc.Container` , 和 " +":class:`~collections.abc.MutableMapping`" + +#: ../../faq/design.rst:580 +msgid "" +"For Python, many of the advantages of interface specifications can be " +"obtained by an appropriate test discipline for components." +msgstr "对于 Python,接口规范的许多好处可以通过组件的适当测试规程来获得。" + +#: ../../faq/design.rst:583 +msgid "" +"A good test suite for a module can both provide a regression test and serve " +"as a module interface specification and a set of examples. Many Python " +"modules can be run as a script to provide a simple \"self test.\" Even " +"modules which use complex external interfaces can often be tested in " +"isolation using trivial \"stub\" emulations of the external interface. The " +":mod:`doctest` and :mod:`unittest` modules or third-party test frameworks " +"can be used to construct exhaustive test suites that exercise every line of " +"code in a module." +msgstr "" +"一个好的模块测试套件既可以提供回归测试,也可以作为模块接口规范和一组示例。许多 Python " +"模块可以作为脚本运行,以提供简单的“自我测试”。即使是使用复杂外部接口的模块,也常常可以使用外部接口的简单“桩代码(stub)”模拟进行隔离测试。可以使用" +" :mod:`doctest` 和 :mod:`unittest` 模块或第三方测试框架来构造详尽的测试套件,以运行模块中的每一行代码。" + +#: ../../faq/design.rst:591 +msgid "" +"An appropriate testing discipline can help build large complex applications " +"in Python as well as having interface specifications would. In fact, it can" +" be better because an interface specification cannot test certain properties" +" of a program. For example, the :meth:`list.append` method is expected to " +"add new elements to the end of some internal list; an interface " +"specification cannot test that your :meth:`list.append` implementation will " +"actually do this correctly, but it's trivial to check this property in a " +"test suite." +msgstr "" +"适当的测试规程能像完善的接口规范一样帮助在 Python 构建大型的复杂应用程序。事实上,它能做得更好因为接口规范无法测试程序的某些属性。 " +"例如,:meth:`list.append` 方法被期望向某个内部列表的末尾添加新元素;接口规范无法测试你的 :meth:`list.append` " +"实现是否真的能正确执行该操作,但在测试套件中检查该属性却是很容易的。" + +#: ../../faq/design.rst:599 +msgid "" +"Writing test suites is very helpful, and you might want to design your code " +"to make it easily tested. One increasingly popular technique, test-driven " +"development, calls for writing parts of the test suite first, before you " +"write any of the actual code. Of course Python allows you to be sloppy and " +"not write test cases at all." +msgstr "" +"编写测试套件非常有用,并且你可能希望将你的代码设计为易于测试。 " +"一种日益流行的技术是面向测试的开发,它要求在编写任何实际代码之前首先编写测试套件的各个部分。当然 Python " +"也允许你采用更粗率的方式,不必编写任何测试用例。" + +#: ../../faq/design.rst:607 +msgid "Why is there no goto?" +msgstr "为什么没有 goto?" + +#: ../../faq/design.rst:609 +msgid "" +"In the 1970s people realized that unrestricted goto could lead to messy " +"\"spaghetti\" code that was hard to understand and revise. In a high-level " +"language, it is also unneeded as long as there are ways to branch (in " +"Python, with :keyword:`if` statements and :keyword:`or`, :keyword:`and`, and" +" :keyword:`if`/:keyword:`else` expressions) and loop (with :keyword:`while` " +"and :keyword:`for` statements, possibly containing :keyword:`continue` and " +":keyword:`break`)." +msgstr "" +"在 1970 年代人们了解到不受限制的 goto 可能导致混乱得像“意大利面”那样难以理解和修改的代码。 " +"在高级语言中,它也是不必要的,只需能够执行分支(在 Python 中是使用 :keyword:`if` 语句和 :keyword:`or`, " +":keyword:`and` 以及 :keyword:`if`/:keyword:`else` 表达式)和循环(使用 :keyword:`while` " +"和 :keyword:`for` 语句,还可能包含 :keyword:`continue` 和 :keyword:`break` 语句)就足够了。" + +#: ../../faq/design.rst:616 +msgid "" +"One can also use exceptions to provide a \"structured goto\" that works even" +" across function calls. Many feel that exceptions can conveniently emulate " +"all reasonable uses of the ``go`` or ``goto`` constructs of C, Fortran, and " +"other languages. For example::" +msgstr "" +"人们还可以使用异常来提供甚至能跨函数调用的“结构化 goto”。许多人觉得异常可以方便地模拟 C, Fortran 和其他语言中所有合理使用的 " +"``go`` 或 ``goto`` 结构::" + +#: ../../faq/design.rst:622 +msgid "" +"class label(Exception): pass # declare a label\n" +"\n" +"try:\n" +" ...\n" +" if condition: raise label() # goto label\n" +" ...\n" +"except label: # where to goto\n" +" pass\n" +"..." +msgstr "" +"class label(Exception): pass # 声明 label\n" +"\n" +"try:\n" +" ...\n" +" if condition: raise label() # 跳转到 label\n" +" ...\n" +"except label: # 跳转到哪里\n" +" pass\n" +"..." + +#: ../../faq/design.rst:632 +msgid "" +"This doesn't allow you to jump into the middle of a loop, but that's usually" +" considered an abuse of ``goto`` anyway. Use sparingly." +msgstr "这并不允许跳到一个循环的中间,但这通常被视为是对 ``goto`` 的滥用。应当谨慎使用。" + +#: ../../faq/design.rst:637 +msgid "Why can't raw strings (r-strings) end with a backslash?" +msgstr "为什么原始字符串(r-strings)不能以反斜杠结尾?" + +#: ../../faq/design.rst:639 +msgid "" +"More precisely, they can't end with an odd number of backslashes: the " +"unpaired backslash at the end escapes the closing quote character, leaving " +"an unterminated string." +msgstr "更准确地说,它们不能以奇数个反斜杠结束:结尾处的不成对反斜杠会转义结束引号字符,留下未结束的字符串。" + +#: ../../faq/design.rst:643 +msgid "" +"Raw strings were designed to ease creating input for processors (chiefly " +"regular expression engines) that want to do their own backslash escape " +"processing. Such processors consider an unmatched trailing backslash to be " +"an error anyway, so raw strings disallow that. In return, they allow you to" +" pass on the string quote character by escaping it with a backslash. These " +"rules work well when r-strings are used for their intended purpose." +msgstr "" +"原始字符串的设计是为了方便想要执行自己的反斜杠转义处理的处理器 (主要是正则表达式引擎) " +"创建输入。此类处理器将不匹配的尾随反斜杠视为错误,因此原始字符串不允许这样做。作为回报,它们允许你通过使用反斜杠转义来传递字符串引号字符。当 " +"r-string 用于它们的预期目的时,这些规则工作得很好。" + +#: ../../faq/design.rst:650 +msgid "" +"If you're trying to build Windows pathnames, note that all Windows system " +"calls accept forward slashes too::" +msgstr "如果您正在尝试构建 Windows 路径名,请注意所有 Windows 系统调用也接受正斜杠::" + +#: ../../faq/design.rst:653 +msgid "f = open(\"/mydir/file.txt\") # works fine!" +msgstr "f = open(\"/mydir/file.txt\") # 效果很好!" + +#: ../../faq/design.rst:655 +msgid "" +"If you're trying to build a pathname for a DOS command, try e.g. one of ::" +msgstr "如果您正在尝试为 DOS 命令构建路径名,请尝试以下示例 ::" + +#: ../../faq/design.rst:657 +msgid "" +"dir = r\"\\this\\is\\my\\dos\\dir\" \"\\\\\"\n" +"dir = r\"\\this\\is\\my\\dos\\dir\\ \"[:-1]\n" +"dir = \"\\\\this\\\\is\\\\my\\\\dos\\\\dir\\\\\"" +msgstr "" +"dir = r\"\\this\\is\\my\\dos\\dir\" \"\\\\\"\n" +"dir = r\"\\this\\is\\my\\dos\\dir\\ \"[:-1]\n" +"dir = \"\\\\this\\\\is\\\\my\\\\dos\\\\dir\\\\\"" + +#: ../../faq/design.rst:663 +msgid "Why doesn't Python have a \"with\" statement for attribute assignments?" +msgstr "为什么 Python 没有属性赋值的“with”语句?" + +#: ../../faq/design.rst:665 +msgid "" +"Python has a :keyword:`with` statement that wraps the execution of a block, " +"calling code on the entrance and exit from the block. Some languages have a" +" construct that looks like this::" +msgstr "" +"Python 有一种 :keyword:`with` 语句能将一个代码块的执行包装起来,在进入和退出该代码块时调用特定的代码。 " +"某些语言具有类似这样的结构::" + +#: ../../faq/design.rst:669 +msgid "" +"with obj:\n" +" a = 1 # equivalent to obj.a = 1\n" +" total = total + 1 # obj.total = obj.total + 1" +msgstr "" +"with obj:\n" +" a = 1 # 相当于 obj.a = 1\n" +" total = total + 1 # obj.total = obj.total + 1" + +#: ../../faq/design.rst:673 +msgid "In Python, such a construct would be ambiguous." +msgstr "在 Python 中,这样的结构是不明确的。" + +#: ../../faq/design.rst:675 +msgid "" +"Other languages, such as Object Pascal, Delphi, and C++, use static types, " +"so it's possible to know, in an unambiguous way, what member is being " +"assigned to. This is the main point of static typing -- the compiler " +"*always* knows the scope of every variable at compile time." +msgstr "" +"其他语言,如 ObjectPascal、Delphi 和 C++ 使用静态类型,因此可以毫不含糊地知道分配给什么成员。这是静态类型的要点 -- 编译器 " +"*总是* 在编译时知道每个变量的作用域。" + +#: ../../faq/design.rst:680 +msgid "" +"Python uses dynamic types. It is impossible to know in advance which " +"attribute will be referenced at runtime. Member attributes may be added or " +"removed from objects on the fly. This makes it impossible to know, from a " +"simple reading, what attribute is being referenced: a local one, a global " +"one, or a member attribute?" +msgstr "" +"Python " +"使用动态类型。事先不可能知道在运行时引用哪个属性。可以动态地在对象中添加或删除成员属性。这使得无法通过简单的阅读就知道引用的是什么属性:局部属性、全局属性还是成员属性?" + +#: ../../faq/design.rst:686 +msgid "For instance, take the following incomplete snippet::" +msgstr "例如,采用以下不完整的代码段::" + +#: ../../faq/design.rst:688 +msgid "" +"def foo(a):\n" +" with a:\n" +" print(x)" +msgstr "" +"def foo(a):\n" +" with a:\n" +" print(x)" + +#: ../../faq/design.rst:692 +msgid "" +"The snippet assumes that ``a`` must have a member attribute called ``x``. " +"However, there is nothing in Python that tells the interpreter this. What " +"should happen if ``a`` is, let us say, an integer? If there is a global " +"variable named ``x``, will it be used inside the :keyword:`with` block? As " +"you see, the dynamic nature of Python makes such choices much harder." +msgstr "" +"该代码段假设 ``a`` 必须有一个名为 ``x`` 的成员属性。然而,Python 中没有什么能告诉解释器这一点。举例来说,如果 ``a`` " +"是一个整数那么会发生什么?如果有一个名为 ``x`` 的全局变量,它是否会在 :keyword:`with` 代码块内被使用?如你所见,Python " +"的动态特性使得这样的选择更为困难。" + +#: ../../faq/design.rst:698 +msgid "" +"The primary benefit of :keyword:`with` and similar language features " +"(reduction of code volume) can, however, easily be achieved in Python by " +"assignment. Instead of::" +msgstr "然而,:keyword:`with` 及类似语言特性的主要好处(减少代码量)在 Python 中可以通过赋值轻松地实现。而不是使用::" + +#: ../../faq/design.rst:701 +msgid "" +"function(args).mydict[index][index].a = 21\n" +"function(args).mydict[index][index].b = 42\n" +"function(args).mydict[index][index].c = 63" +msgstr "" +"function(args).mydict[index][index].a = 21\n" +"function(args).mydict[index][index].b = 42\n" +"function(args).mydict[index][index].c = 63" + +#: ../../faq/design.rst:705 +msgid "write this::" +msgstr "写成这样::" + +#: ../../faq/design.rst:707 +msgid "" +"ref = function(args).mydict[index][index]\n" +"ref.a = 21\n" +"ref.b = 42\n" +"ref.c = 63" +msgstr "" +"ref = function(args).mydict[index][index]\n" +"ref.a = 21\n" +"ref.b = 42\n" +"ref.c = 63" + +#: ../../faq/design.rst:712 +msgid "" +"This also has the side-effect of increasing execution speed because name " +"bindings are resolved at run-time in Python, and the second version only " +"needs to perform the resolution once." +msgstr "这也具有提高执行速度的附带效果,因为 Python 在运行时解析名称绑定,而第二个版本只需要执行一次解析。" + +#: ../../faq/design.rst:716 +msgid "" +"Similar proposals that would introduce syntax to further reduce code volume," +" such as using a 'leading dot', have been rejected in favour of explicitness" +" (see https://mail.python.org/pipermail/python-ideas/2016-May/040070.html)." +msgstr "" +"引入可以进一步减小代码量的类似提议,例如使用“前导点号”,出于明白胜于隐晦的理由而被拒绝了 (参见 " +"https://mail.python.org/pipermail/python-ideas/2016-May/040070.html)。" + +#: ../../faq/design.rst:722 +msgid "Why don't generators support the with statement?" +msgstr "生成器为什么不支持 with 语句?" + +#: ../../faq/design.rst:724 +msgid "" +"For technical reasons, a generator used directly as a context manager would " +"not work correctly. When, as is most common, a generator is used as an " +"iterator run to completion, no closing is needed. When it is, wrap it as " +":func:`contextlib.closing(generator) ` in the " +":keyword:`with` statement." +msgstr "" +"由于技术原因,直接作为上下文管理器使用的生成器将无法正常工作。最常见的情况下,当一个生成器被用作迭代器运行到完成时,不需要手动关闭。如果需要,请在 " +":keyword:`with` 语句中将它包装为 :func:`contextlib.closing(generator) " +"`。" + +#: ../../faq/design.rst:732 +msgid "Why are colons required for the if/while/def/class statements?" +msgstr "为什么 if/while/def/class语句需要冒号?" + +#: ../../faq/design.rst:734 +msgid "" +"The colon is required primarily to enhance readability (one of the results " +"of the experimental ABC language). Consider this::" +msgstr "冒号主要用于增强可读性 (ABC 语言实验的结果之一)。考虑一下这个::" + +#: ../../faq/design.rst:737 +msgid "" +"if a == b\n" +" print(a)" +msgstr "" +"if a == b\n" +" print(a)" + +#: ../../faq/design.rst:740 +msgid "versus ::" +msgstr "与 ::" + +#: ../../faq/design.rst:742 +msgid "" +"if a == b:\n" +" print(a)" +msgstr "" +"if a == b:\n" +" print(a)" + +#: ../../faq/design.rst:745 +msgid "" +"Notice how the second one is slightly easier to read. Notice further how a " +"colon sets off the example in this FAQ answer; it's a standard usage in " +"English." +msgstr "注意第二种写法稍微容易阅读一些。请进一步注意,在这个 FAQ 解答中冒号是如何引出示例的;这是英语中的标准用法。" + +#: ../../faq/design.rst:748 +msgid "" +"Another minor reason is that the colon makes it easier for editors with " +"syntax highlighting; they can look for colons to decide when indentation " +"needs to be increased instead of having to do a more elaborate parsing of " +"the program text." +msgstr "另一个次要原因是冒号使带有语法突出显示的编辑器更容易工作;他们可以寻找冒号来决定何时需要增加缩进,而不必对程序文本进行更精细的解析。" + +#: ../../faq/design.rst:754 +msgid "Why does Python allow commas at the end of lists and tuples?" +msgstr "为什么 Python 在列表和元组的末尾允许使用逗号?" + +#: ../../faq/design.rst:756 +msgid "" +"Python lets you add a trailing comma at the end of lists, tuples, and " +"dictionaries::" +msgstr "Python 允许您在列表,元组和字典的末尾添加一个尾随逗号::" + +#: ../../faq/design.rst:759 +msgid "" +"[1, 2, 3,]\n" +"('a', 'b', 'c',)\n" +"d = {\n" +" \"A\": [1, 5],\n" +" \"B\": [6, 7], # last trailing comma is optional but good style\n" +"}" +msgstr "" +"[1, 2, 3,]\n" +"('a', 'b', 'c',)\n" +"d = {\n" +" \"A\":[1, 5],\n" +" \"B\":[6, 7], # 最后的逗号是可选的,但风格很好\n" +"}" + +#: ../../faq/design.rst:767 +msgid "There are several reasons to allow this." +msgstr "有几个理由允许这样做。" + +#: ../../faq/design.rst:769 +msgid "" +"When you have a literal value for a list, tuple, or dictionary spread across" +" multiple lines, it's easier to add more elements because you don't have to " +"remember to add a comma to the previous line. The lines can also be " +"reordered without creating a syntax error." +msgstr "如果列表,元组或字典的字面值分布在多行中,则更容易添加更多元素,因为不必记住在上一行中添加逗号。这些行也可以重新排序,而不会产生语法错误。" + +#: ../../faq/design.rst:774 +msgid "" +"Accidentally omitting the comma can lead to errors that are hard to " +"diagnose. For example::" +msgstr "不小心省略逗号会导致难以诊断的错误。例如::" + +#: ../../faq/design.rst:777 +msgid "" +"x = [\n" +" \"fee\",\n" +" \"fie\"\n" +" \"foo\",\n" +" \"fum\"\n" +"]" +msgstr "" +"x = [\n" +" \"fee\",\n" +" \"fie\"\n" +" \"foo\",\n" +" \"fum\"\n" +"]" + +#: ../../faq/design.rst:784 +msgid "" +"This list looks like it has four elements, but it actually contains three: " +"\"fee\", \"fiefoo\" and \"fum\". Always adding the comma avoids this source" +" of error." +msgstr "这个列表看起来有四个元素,但实际上包含三个 : \"fee\", \"fiefoo\" 和 \"fum\" 。总是加上逗号可以避免这个错误的来源。" + +#: ../../faq/design.rst:787 +msgid "" +"Allowing the trailing comma may also make programmatic code generation " +"easier." +msgstr "允许尾随逗号也可以使编程代码更容易生成。" diff --git a/faq/extending.po b/faq/extending.po new file mode 100644 index 0000000000..e944958f05 --- /dev/null +++ b/faq/extending.po @@ -0,0 +1,501 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../faq/extending.rst:3 +msgid "Extending/Embedding FAQ" +msgstr "扩展/嵌入常见问题" + +#: ../../faq/extending.rst:6 +msgid "Contents" +msgstr "目录" + +#: ../../faq/extending.rst:16 +msgid "Can I create my own functions in C?" +msgstr "可以使用 C 语言创建自己的函数吗?" + +#: ../../faq/extending.rst:18 +msgid "" +"Yes, you can create built-in modules containing functions, variables, " +"exceptions and even new types in C. This is explained in the document " +":ref:`extending-index`." +msgstr "是的,您可以在 C 中创建包含函数、变量、异常甚至新类型的内置模块。在文档 :ref:`extending-index` 中有说明。" + +#: ../../faq/extending.rst:22 +msgid "Most intermediate or advanced Python books will also cover this topic." +msgstr "大多数中级或高级的 Python 书籍也涵盖这个主题。" + +#: ../../faq/extending.rst:26 +msgid "Can I create my own functions in C++?" +msgstr "可以使用 C++ 语言创建自己的函数吗?" + +#: ../../faq/extending.rst:28 +msgid "" +"Yes, using the C compatibility features found in C++. Place ``extern \"C\" " +"{ ... }`` around the Python include files and put ``extern \"C\"`` before " +"each function that is going to be called by the Python interpreter. Global " +"or static C++ objects with constructors are probably not a good idea." +msgstr "" +"是的,可以使用 C++ 中兼容 C 的功能。在 Python include 文件周围放置 ``extern \"C\" { ... }``,并在 " +"Python 解释器调用的每个函数之前放置 ``extern \"C\"``。具有构造函数的全局或静态 C++ 对象可能不是一个好主意。" + +#: ../../faq/extending.rst:37 +msgid "Writing C is hard; are there any alternatives?" +msgstr "C 很难写,有没有其他选择?" + +#: ../../faq/extending.rst:39 +msgid "" +"There are a number of alternatives to writing your own C extensions, " +"depending on what you're trying to do. :ref:`Recommended third party tools " +"` offer both simpler and more sophisticated approaches to " +"creating C and C++ extensions for Python." +msgstr "" +"有多个替代选择可用来编写你自己的 C 扩展,具体取决于你想要做什么。 :ref:`推荐的第三方工具 ` " +"提供了更简单或更复杂的方式来为 Python 创建 C 和 C++ 扩展。" + +#: ../../faq/extending.rst:46 +msgid "How can I execute arbitrary Python statements from C?" +msgstr "如何在 C 中执行任意 Python 语句?" + +#: ../../faq/extending.rst:48 +msgid "" +"The highest-level function to do this is :c:func:`PyRun_SimpleString` which " +"takes a single string argument to be executed in the context of the module " +"``__main__`` and returns ``0`` for success and ``-1`` when an exception " +"occurred (including :exc:`SyntaxError`). If you want more control, use " +":c:func:`PyRun_String`; see the source for :c:func:`PyRun_SimpleString` in " +"``Python/pythonrun.c``." +msgstr "" +"执行此操作的最高层级函数为 :c:func:`PyRun_SimpleString`,它接受单个字符串参数用于在模块 ``__main__`` " +"的上下文中执行并在成功时返回 ``0`` 而在发生异常 (包括 :exc:`SyntaxError`) 时返回 ``-1``。 " +"如果你想要更多可控性,可以使用 :c:func:`PyRun_String`;请在 ``Python/pythonrun.c`` 中查看 " +":c:func:`PyRun_SimpleString` 的源码。" + +#: ../../faq/extending.rst:57 +msgid "How can I evaluate an arbitrary Python expression from C?" +msgstr "如何在 C 中对任意 Python 表达式求值?" + +#: ../../faq/extending.rst:59 +msgid "" +"Call the function :c:func:`PyRun_String` from the previous question with the" +" start symbol :c:data:`Py_eval_input`; it parses an expression, evaluates it" +" and returns its value." +msgstr "" +"可以调用前一问题中介绍的函数 :c:func:`PyRun_String` 并附带起始标记符 " +":c:data:`Py_eval_input`;它会解析表达式,对其求值并返回结果值。" + +#: ../../faq/extending.rst:65 +msgid "How do I extract C values from a Python object?" +msgstr "如何从 Python 对象中提取 C 的值?" + +#: ../../faq/extending.rst:67 +msgid "" +"That depends on the object's type. If it's a tuple, :c:func:`PyTuple_Size` " +"returns its length and :c:func:`PyTuple_GetItem` returns the item at a " +"specified index. Lists have similar functions, :c:func:`PyList_Size` and " +":c:func:`PyList_GetItem`." +msgstr "" +"这取决于对象的类型。如果是元组,:c:func:`PyTuple_Size` 将返回其长度而 :c:func:`PyTuple_GetItem` " +"将返回指定索引号上的项。对于列表也有类似的函数 :c:func:`PyList_Size` 和 :c:func:`PyList_GetItem`。" + +#: ../../faq/extending.rst:72 +msgid "" +"For bytes, :c:func:`PyBytes_Size` returns its length and " +":c:func:`PyBytes_AsStringAndSize` provides a pointer to its value and its " +"length. Note that Python bytes objects may contain null bytes so C's " +":c:func:`!strlen` should not be used." +msgstr "" +"对于字节串,:c:func:`PyBytes_Size` 将返回其长度而 :c:func:`PyBytes_AsStringAndSize` " +"将提供一个指向其值和长度的指针。请注意 Python 字节串对象可能包含空字节因此不应使用 C 的 :c:func:`!strlen`。" + +#: ../../faq/extending.rst:77 +msgid "" +"To test the type of an object, first make sure it isn't ``NULL``, and then " +"use :c:func:`PyBytes_Check`, :c:func:`PyTuple_Check`, " +":c:func:`PyList_Check`, etc." +msgstr "" +"要检测一个对象的类型,首先要确保它不为 ``NULL``,然后使用 :c:func:`PyBytes_Check`, " +":c:func:`PyTuple_Check`, :c:func:`PyList_Check` 等等。" + +#: ../../faq/extending.rst:80 +msgid "" +"There is also a high-level API to Python objects which is provided by the " +"so-called 'abstract' interface -- read ``Include/abstract.h`` for further " +"details. It allows interfacing with any kind of Python sequence using calls" +" like :c:func:`PySequence_Length`, :c:func:`PySequence_GetItem`, etc. as " +"well as many other useful protocols such as numbers " +"(:c:func:`PyNumber_Index` et al.) and mappings in the PyMapping APIs." +msgstr "" +"还有一个针对 Python 对象的高层级 API,通过所谓的‘抽象’接口提供 —— 请参阅 ``Include/abstract.h`` 了解详情。 " +"它允许使用 :c:func:`PySequence_Length`, :c:func:`PySequence_GetItem` 这样的调用来与任意种类的" +" Python 序列进行对接,此外还可使用许多其他有用的协议例如数字 (:c:func:`PyNumber_Index` 等) 以及 PyMapping" +" API 中的各种映射等等。" + +#: ../../faq/extending.rst:89 +msgid "How do I use Py_BuildValue() to create a tuple of arbitrary length?" +msgstr "如何使用 Py_BuildValue() 创建任意长度的元组?" + +#: ../../faq/extending.rst:91 +msgid "You can't. Use :c:func:`PyTuple_Pack` instead." +msgstr "不可以。应该使用 :c:func:`PyTuple_Pack`。" + +#: ../../faq/extending.rst:95 +msgid "How do I call an object's method from C?" +msgstr "如何从 C 调用对象的方法?" + +#: ../../faq/extending.rst:97 +msgid "" +"The :c:func:`PyObject_CallMethod` function can be used to call an arbitrary " +"method of an object. The parameters are the object, the name of the method " +"to call, a format string like that used with :c:func:`Py_BuildValue`, and " +"the argument values::" +msgstr "" +"可以使用 :c:func:`PyObject_CallMethod` 函数来调用某个对象的任意方法。形参为该对象、要调用的方法名、类似 " +":c:func:`Py_BuildValue` 所用的格式字符串以及要传给方法的参数值::" + +#: ../../faq/extending.rst:102 +msgid "" +"PyObject *\n" +"PyObject_CallMethod(PyObject *object, const char *method_name,\n" +" const char *arg_format, ...);" +msgstr "" +"PyObject *\n" +"PyObject_CallMethod(PyObject *object, const char *method_name,\n" +" const char *arg_format, ...);" + +#: ../../faq/extending.rst:106 +msgid "" +"This works for any object that has methods -- whether built-in or user-" +"defined. You are responsible for eventually :c:func:`Py_DECREF`\\ 'ing the " +"return value." +msgstr "" +"这适用于任何具有方法的对象 —— 不论是内置方法还是用户自定义方法。你需要负责对返回值进行最终的 :c:func:`Py_DECREF` 处理。" + +#: ../../faq/extending.rst:109 +msgid "" +"To call, e.g., a file object's \"seek\" method with arguments 10, 0 " +"(assuming the file object pointer is \"f\")::" +msgstr "例如调用某个文件对象的 \"seek\" 方法并传入参数 10, 0 (假定文件对象的指针为 \"f\")::" + +#: ../../faq/extending.rst:112 +msgid "" +"res = PyObject_CallMethod(f, \"seek\", \"(ii)\", 10, 0);\n" +"if (res == NULL) {\n" +" ... an exception occurred ...\n" +"}\n" +"else {\n" +" Py_DECREF(res);\n" +"}" +msgstr "" +"res = PyObject_CallMethod(f, \"seek\", \"(ii)\", 10, 0);\n" +"if (res == NULL) {\n" +" ... an exception occurred ...\n" +"}\n" +"else {\n" +" Py_DECREF(res);\n" +"}" + +#: ../../faq/extending.rst:120 +msgid "" +"Note that since :c:func:`PyObject_CallObject` *always* wants a tuple for the" +" argument list, to call a function without arguments, pass \"()\" for the " +"format, and to call a function with one argument, surround the argument in " +"parentheses, e.g. \"(i)\"." +msgstr "" +"请注意由于 :c:func:`PyObject_CallObject` *总是* 接受一个元组作为参数列表,要调用不带参数的函数,则传入格式为 " +"\"()\",要调用只带一个参数的函数,则应将参数包含于圆括号中,例如 \"(i)\"。" + +#: ../../faq/extending.rst:127 +msgid "" +"How do I catch the output from PyErr_Print() (or anything that prints to " +"stdout/stderr)?" +msgstr "如何捕获 PyErr_Print()(或打印到 stdout / stderr 的任何内容)的输出?" + +#: ../../faq/extending.rst:129 +msgid "" +"In Python code, define an object that supports the ``write()`` method. " +"Assign this object to :data:`sys.stdout` and :data:`sys.stderr`. Call " +"print_error, or just allow the standard traceback mechanism to work. Then, " +"the output will go wherever your ``write()`` method sends it." +msgstr "" +"在 Python 代码中,定义一个支持 ``write()`` 方法的对象。将此对象赋值给 :data:`sys.stdout` 和 " +":data:`sys.stderr`。调用 print_error 或者只是允许标准回溯机制生效。在此之后,输出将转往你的 ``write()`` " +"方法所指向的任何地方。" + +#: ../../faq/extending.rst:134 +msgid "The easiest way to do this is to use the :class:`io.StringIO` class:" +msgstr "做到这一点的最简单方式是使用 :class:`io.StringIO` 类:" + +#: ../../faq/extending.rst:136 +msgid "" +">>> import io, sys\n" +">>> sys.stdout = io.StringIO()\n" +">>> print('foo')\n" +">>> print('hello world!')\n" +">>> sys.stderr.write(sys.stdout.getvalue())\n" +"foo\n" +"hello world!" +msgstr "" +">>> import io, sys\n" +">>> sys.stdout = io.StringIO()\n" +">>> print('foo')\n" +">>> print('hello world!')\n" +">>> sys.stderr.write(sys.stdout.getvalue())\n" +"foo\n" +"hello world!" + +#: ../../faq/extending.rst:146 +msgid "A custom object to do the same would look like this:" +msgstr "实现同样效果的自定义对象看起来是这样的:" + +#: ../../faq/extending.rst:148 +msgid "" +">>> import io, sys\n" +">>> class StdoutCatcher(io.TextIOBase):\n" +"... def __init__(self):\n" +"... self.data = []\n" +"... def write(self, stuff):\n" +"... self.data.append(stuff)\n" +"...\n" +">>> import sys\n" +">>> sys.stdout = StdoutCatcher()\n" +">>> print('foo')\n" +">>> print('hello world!')\n" +">>> sys.stderr.write(''.join(sys.stdout.data))\n" +"foo\n" +"hello world!" +msgstr "" +">>> import io, sys\n" +">>> class StdoutCatcher(io.TextIOBase):\n" +"... def __init__(self):\n" +"... self.data = []\n" +"... def write(self, stuff):\n" +"... self.data.append(stuff)\n" +"...\n" +">>> import sys\n" +">>> sys.stdout = StdoutCatcher()\n" +">>> print('foo')\n" +">>> print('hello world!')\n" +">>> sys.stderr.write(''.join(sys.stdout.data))\n" +"foo\n" +"hello world!" + +#: ../../faq/extending.rst:167 +msgid "How do I access a module written in Python from C?" +msgstr "如何从 C 访问用 Python 编写的模块?" + +#: ../../faq/extending.rst:169 +msgid "You can get a pointer to the module object as follows::" +msgstr "你可以通过如下方式获得一个指向模块对象的指针::" + +#: ../../faq/extending.rst:171 +msgid "module = PyImport_ImportModule(\"\");" +msgstr "module = PyImport_ImportModule(\"\");" + +#: ../../faq/extending.rst:173 +msgid "" +"If the module hasn't been imported yet (i.e. it is not yet present in " +":data:`sys.modules`), this initializes the module; otherwise it simply " +"returns the value of ``sys.modules[\"\"]``. Note that it " +"doesn't enter the module into any namespace -- it only ensures it has been " +"initialized and is stored in :data:`sys.modules`." +msgstr "" +"如果模块尚未被导入(即它还不存在于 :data:`sys.modules` 中),这会初始化该模块;否则它只是简单地返回 " +"``sys.modules[\"\"]`` 的值。请注意它并不会将模块加入任何命名空间 —— 它只是确保模块被初始化并存在于 " +":data:`sys.modules` 中。" + +#: ../../faq/extending.rst:179 +msgid "" +"You can then access the module's attributes (i.e. any name defined in the " +"module) as follows::" +msgstr "之后你就可以通过如下方式来访问模块的属性(即模块中定义的任何名称)::" + +#: ../../faq/extending.rst:182 +msgid "attr = PyObject_GetAttrString(module, \"\");" +msgstr "attr = PyObject_GetAttrString(module, \"\");" + +#: ../../faq/extending.rst:184 +msgid "" +"Calling :c:func:`PyObject_SetAttrString` to assign to variables in the " +"module also works." +msgstr "调用 :c:func:`PyObject_SetAttrString` 为模块中的变量赋值也是可以的。" + +#: ../../faq/extending.rst:189 +msgid "How do I interface to C++ objects from Python?" +msgstr "如何在 Python 中对接 C ++ 对象?" + +#: ../../faq/extending.rst:191 +msgid "" +"Depending on your requirements, there are many approaches. To do this " +"manually, begin by reading :ref:`the \"Extending and Embedding\" document " +"`. Realize that for the Python run-time system, there " +"isn't a whole lot of difference between C and C++ -- so the strategy of " +"building a new Python type around a C structure (pointer) type will also " +"work for C++ objects." +msgstr "" +"根据你的需求,可以选择许多方式。手动的实现方式请查阅 :ref:`\"扩展与嵌入\" 文档 ` 来入门。 " +"需要知道的是对于 Python 运行时系统来说,C 和 C++ 并没有太大的区别 —— 因此围绕一个 C 结构(指针)类型构建新 Python " +"对象的策略同样适用于 C++ 对象。" + +#: ../../faq/extending.rst:197 +msgid "For C++ libraries, see :ref:`c-wrapper-software`." +msgstr "有关 C++ 库,请参阅 :ref:`c-wrapper-software`。" + +#: ../../faq/extending.rst:201 +msgid "I added a module using the Setup file and the make fails; why?" +msgstr "我使用 Setup 文件添加了一个模块,为什么 make 失败了?" + +#: ../../faq/extending.rst:203 +msgid "" +"Setup must end in a newline, if there is no newline there, the build process" +" fails. (Fixing this requires some ugly shell script hackery, and this bug " +"is so minor that it doesn't seem worth the effort.)" +msgstr "" +"Setup 文件必须以换行符结束,如果没有换行符,则构建过程将失败。 (修复这个需要一些丑陋的 shell " +"脚本操作,而且这个缺陷很小,看起来不值得花这么大力气。)" + +#: ../../faq/extending.rst:209 +msgid "How do I debug an extension?" +msgstr "如何调试扩展?" + +#: ../../faq/extending.rst:211 +msgid "" +"When using GDB with dynamically loaded extensions, you can't set a " +"breakpoint in your extension until your extension is loaded." +msgstr "将 GDB 与动态加载的扩展一起使用时,在加载扩展之前,不能在扩展中设置断点。" + +#: ../../faq/extending.rst:214 +msgid "In your ``.gdbinit`` file (or interactively), add the command:" +msgstr "在您的 ``.gdbinit`` 文件中(或交互式)添加命令:" + +#: ../../faq/extending.rst:216 +msgid "br _PyImport_LoadDynamicModule" +msgstr "br _PyImport_LoadDynamicModule" + +#: ../../faq/extending.rst:220 +msgid "Then, when you run GDB:" +msgstr "然后运行 GDB:" + +#: ../../faq/extending.rst:222 +msgid "" +"$ gdb /local/bin/python\n" +"gdb) run myscript.py\n" +"gdb) continue # repeat until your extension is loaded\n" +"gdb) finish # so that your extension is loaded\n" +"gdb) br myfunction.c:50\n" +"gdb) continue" +msgstr "" +"$ gdb /local/bin/python\n" +"gdb) run myscript.py\n" +"gdb) continue # 重复直到你的扩展被载入\n" +"gdb) finish # 你的扩展已被载入\n" +"gdb) br myfunction.c:50\n" +"gdb) continue" + +#: ../../faq/extending.rst:232 +msgid "" +"I want to compile a Python module on my Linux system, but some files are " +"missing. Why?" +msgstr "我想在 Linux 系统上编译一个 Python 模块,但是缺少一些文件。为什么?" + +#: ../../faq/extending.rst:234 +msgid "" +"Most packaged versions of Python omit some files required for compiling " +"Python extensions." +msgstr "大多数打包的 Python 版本都会省略一些编译 Python 扩展所必需的文件。" + +#: ../../faq/extending.rst:237 +msgid "For Red Hat, install the python3-devel RPM to get the necessary files." +msgstr "对于 Red Hat,请安装 python3-devel RPM 来获取必需的文件。" + +#: ../../faq/extending.rst:239 +msgid "For Debian, run ``apt-get install python3-dev``." +msgstr "对于 Debian,请运行 ``apt-get install python3-dev``。" + +#: ../../faq/extending.rst:242 +msgid "How do I tell \"incomplete input\" from \"invalid input\"?" +msgstr "如何区分“输入不完整”和“输入无效”?" + +#: ../../faq/extending.rst:244 +msgid "" +"Sometimes you want to emulate the Python interactive interpreter's behavior," +" where it gives you a continuation prompt when the input is incomplete (e.g." +" you typed the start of an \"if\" statement or you didn't close your " +"parentheses or triple string quotes), but it gives you a syntax error " +"message immediately when the input is invalid." +msgstr "" +"有时,希望模仿 Python " +"交互式解释器的行为,在输入不完整时(例如,您键入了\"if\"语句的开头,或者没有关闭括号或三引号字符串),给出一个续行提示,但当输入无效时,立即给出一条语法错误消息。" + +#: ../../faq/extending.rst:250 +msgid "" +"In Python you can use the :mod:`codeop` module, which approximates the " +"parser's behavior sufficiently. IDLE uses this, for example." +msgstr "在 Python 中,您可以使用 :mod:`codeop` 模块,该模块非常接近解析器的行为。例如,IDLE 就使用了这个。" + +#: ../../faq/extending.rst:253 +msgid "" +"The easiest way to do it in C is to call :c:func:`PyRun_InteractiveLoop` " +"(perhaps in a separate thread) and let the Python interpreter handle the " +"input for you. You can also set the :c:func:`PyOS_ReadlineFunctionPointer` " +"to point at your custom input function. See ``Modules/readline.c`` and " +"``Parser/myreadline.c`` for more hints." +msgstr "" +"在 C 中执行此操作的最简单方法是调用 :c:func:`PyRun_InteractiveLoop` (可能在单独的线程中) 并让 Python " +"解释器为您处理输入。 您还可以设置 :c:func:`PyOS_ReadlineFunctionPointer` 指向您的自定义输入函数。 " +"有关更多提示,请参阅 ``Modules/readline.c`` 和 ``Parser/myreadline.c``。" + +#: ../../faq/extending.rst:260 +msgid "How do I find undefined g++ symbols __builtin_new or __pure_virtual?" +msgstr "如何找到未定义的 g++ 符号 __builtin_new 或 __pure_virtual?" + +#: ../../faq/extending.rst:262 +msgid "" +"To dynamically load g++ extension modules, you must recompile Python, relink" +" it using g++ (change LINKCC in the Python Modules Makefile), and link your " +"extension module using g++ (e.g., ``g++ -shared -o mymodule.so " +"mymodule.o``)." +msgstr "" +"要动态加载 g++ 扩展模块,必须重新编译 Python,要使用 g++ 重新链接(在 Python Modules Makefile 中更改 " +"LINKCC),及链接扩展模块 (例如 ``g++ -shared -o mymodule.so mymodule.o``)。" + +#: ../../faq/extending.rst:268 +msgid "" +"Can I create an object class with some methods implemented in C and others " +"in Python (e.g. through inheritance)?" +msgstr "能否创建一个对象类,其中部分方法在 C 中实现,而其他方法在 Python 中实现(例如通过继承)?" + +#: ../../faq/extending.rst:270 +msgid "" +"Yes, you can inherit from built-in classes such as :class:`int`, " +":class:`list`, :class:`dict`, etc." +msgstr "是的,您可以继承内置类,例如 :class:`int`, :class:`list`, :class:`dict` 等。" + +#: ../../faq/extending.rst:273 +msgid "" +"The Boost Python Library (BPL, " +"https://www.boost.org/libs/python/doc/index.html) provides a way of doing " +"this from C++ (i.e. you can inherit from an extension class written in C++ " +"using the BPL)." +msgstr "" +"Boost Python Library (BPL, https://www.boost.org/libs/python/doc/index.html)" +" 提供了一种从 C++ 执行此操作的方式(即你可以使用 BPL 来继承用 C++ 编写的扩展类)。" diff --git a/faq/general.po b/faq/general.po new file mode 100644 index 0000000000..736e1ebe19 --- /dev/null +++ b/faq/general.po @@ -0,0 +1,837 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../faq/general.rst:5 +msgid "General Python FAQ" +msgstr "Python 常见问题" + +#: ../../faq/general.rst:8 +msgid "Contents" +msgstr "目录" + +#: ../../faq/general.rst:13 +msgid "General Information" +msgstr "一般信息" + +#: ../../faq/general.rst:16 +msgid "What is Python?" +msgstr "什么是 Python?" + +#: ../../faq/general.rst:18 +msgid "" +"Python is an interpreted, interactive, object-oriented programming language." +" It incorporates modules, exceptions, dynamic typing, very high level " +"dynamic data types, and classes. It supports multiple programming paradigms" +" beyond object-oriented programming, such as procedural and functional " +"programming. Python combines remarkable power with very clear syntax. It has" +" interfaces to many system calls and libraries, as well as to various window" +" systems, and is extensible in C or C++. It is also usable as an extension " +"language for applications that need a programmable interface. Finally, " +"Python is portable: it runs on many Unix variants including Linux and macOS," +" and on Windows." +msgstr "" +"Python 是一种解释型、交互式、面向对象的编程语言。它包含了模块、异常、动态类型、高层级动态数据类型以及类等特性。 " +"在面向对象编程以外它还支持多种编程范式,例如过程式和函数式编程等。Python 结合了超强的功能和极清晰的语法。 " +"它带有许多系统调用和库以及多种窗口系统的接口,并且能用 C 或 C++ 来进行扩展。它还可用作需要可编程接口的应用程序的扩展语言。最后,Python " +"非常易于移植:它可以在包括 Linux 和 macOS 在内的许多 Unix 变种以及 Windows 上运行。" + +#: ../../faq/general.rst:28 +msgid "" +"To find out more, start with :ref:`tutorial-index`. The `Beginner's Guide " +"to Python `_ links to other " +"introductory tutorials and resources for learning Python." +msgstr "" +"要了解更多详情,请先查看 :ref:`tutorial-index`。`Python 新手指南 " +"`_ 提供了学习 Python 的其他入门教程及资源的链接。" + +#: ../../faq/general.rst:34 +msgid "What is the Python Software Foundation?" +msgstr "什么是 Python 软件基金会?" + +#: ../../faq/general.rst:36 +msgid "" +"The Python Software Foundation is an independent non-profit organization " +"that holds the copyright on Python versions 2.1 and newer. The PSF's " +"mission is to advance open source technology related to the Python " +"programming language and to publicize the use of Python. The PSF's home " +"page is at https://www.python.org/psf/." +msgstr "" +"Python 软件基金会(Python Software Foundation,简称 PSF)是一个独立的非盈利组织,它拥有 Python 2.1 " +"及以上各版本的版权。PSF 的使命是推进与 Python 编程语言相关的开源技术,并推广 Python 的使用。PSF 的主页是 " +"https://www.python.org/psf/." + +#: ../../faq/general.rst:42 +msgid "" +"Donations to the PSF are tax-exempt in the US. If you use Python and find " +"it helpful, please contribute via `the PSF donation page " +"`_." +msgstr "" +"向 PSF 提供捐助在美国是免税的。如果你在使用 Python 并且感觉它对你很有帮助,可以通过 `PSF 捐助页 " +"`_ 进行捐助。" + +#: ../../faq/general.rst:48 +msgid "Are there copyright restrictions on the use of Python?" +msgstr "使用 Python 是否存在版权限制?" + +#: ../../faq/general.rst:50 +msgid "" +"You can do anything you want with the source, as long as you leave the " +"copyrights in and display those copyrights in any documentation about Python" +" that you produce. If you honor the copyright rules, it's OK to use Python " +"for commercial use, to sell copies of Python in source or binary form " +"(modified or unmodified), or to sell products that incorporate Python in " +"some form. We would still like to know about all commercial use of Python, " +"of course." +msgstr "" +"你可以任意使用源码,只要你保留版权信息并在你基于 Python 的产品文档中显示该版权信息。如果你遵守此版权规则,就可以将 Python " +"用于商业领域,以源码或二进制码的形式(不论是否经过修改)销售 Python 的副本,或是以某种形式包含了 Python 的产品。 " +"当然,我们仍然希望获知所有对 Python 的商业使用。" + +#: ../../faq/general.rst:57 +msgid "" +"See `the license page `_ to find " +"further explanations and the full text of the PSF License." +msgstr "" +"请参阅 `许可页 `_ 以查看进一步的说明以及 PSF 许可的完整文本。" + +#: ../../faq/general.rst:60 +msgid "" +"The Python logo is trademarked, and in certain cases permission is required " +"to use it. Consult `the Trademark Usage Policy " +"`__ for more information." +msgstr "" +"Python 的徽标是注册商标,在某些情况下需要获得允许方可使用。请参阅 `商标使用政策 " +"`__ 了解详情。" + +#: ../../faq/general.rst:66 +msgid "Why was Python created in the first place?" +msgstr "创造 Python 的最初理由是什么?" + +#: ../../faq/general.rst:68 +msgid "" +"Here's a *very* brief summary of what started it all, written by Guido van " +"Rossum:" +msgstr "以下是有关最初缘起的一份 *非常* 简短的摘要,由 Guido van Rossum 本人撰写:" + +#: ../../faq/general.rst:71 +msgid "" +"I had extensive experience with implementing an interpreted language in the " +"ABC group at CWI, and from working with this group I had learned a lot about" +" language design. This is the origin of many Python features, including the" +" use of indentation for statement grouping and the inclusion of very-high-" +"level data types (although the details are all different in Python)." +msgstr "" +"我在 CWI 的 ABC 部门时在实现解释型语言方面积累了丰富经验,通过与这个部门成员的协同工作,我学到了大量有关语言设计的知识。这是许多 Python" +" 特性的最初来源,包括使用缩进来组织语句以及包含非常高层级的数据结构(虽然在 Python 中具体的实现细节完全不同)。" + +#: ../../faq/general.rst:78 +msgid "" +"I had a number of gripes about the ABC language, but also liked many of its " +"features. It was impossible to extend the ABC language (or its " +"implementation) to remedy my complaints -- in fact its lack of extensibility" +" was one of its biggest problems. I had some experience with using " +"Modula-2+ and talked with the designers of Modula-3 and read the Modula-3 " +"report. Modula-3 is the origin of the syntax and semantics used for " +"exceptions, and some other Python features." +msgstr "" +"我对 ABC 语言有过许多抱怨,但同时也很喜欢它的许多特性。没有可能通过扩展 ABC 语言(或它的实现)来弥补我的不满 —— " +"实际上缺乏可扩展性就是它最大的问题之一。我也有一些使用 Modula-2+ 的经验,并曾与 Modula-3 的设计者进行交流,还阅读了 " +"Modula-3 的报告。Modula-3 是 Python 中异常机制所用语法和语义,以及其他一些语言特性的最初来源。" + +#: ../../faq/general.rst:86 +msgid "" +"I was working in the Amoeba distributed operating system group at CWI. We " +"needed a better way to do system administration than by writing either C " +"programs or Bourne shell scripts, since Amoeba had its own system call " +"interface which wasn't easily accessible from the Bourne shell. My " +"experience with error handling in Amoeba made me acutely aware of the " +"importance of exceptions as a programming language feature." +msgstr "" +"我还曾在 CWI 的 Amoeba 分布式操作系统部门工作。当时我们需要有一种比编写 C 程序或 Bourne shell " +"脚本更好的方式来进行系统管理,因为 Amoeba 有它自己的系统调用接口,并且无法方便地通过 Bourne shell 来访问。我在 Amoeba " +"中处理错误的经验令我深刻地意识到异常处理在编程语言特性当中的重要地位。" + +#: ../../faq/general.rst:93 +msgid "" +"It occurred to me that a scripting language with a syntax like ABC but with " +"access to the Amoeba system calls would fill the need. I realized that it " +"would be foolish to write an Amoeba-specific language, so I decided that I " +"needed a language that was generally extensible." +msgstr "" +"我发现,某种具有 ABC 式的语法而又能访问 Amoeba 系统调用的脚本语言将可满足需求。我意识到编写一种 Amoeba " +"专属的语言是愚蠢的,所以我决定编写一种具有全面可扩展性的语言。" + +#: ../../faq/general.rst:98 +msgid "" +"During the 1989 Christmas holidays, I had a lot of time on my hand, so I " +"decided to give it a try. During the next year, while still mostly working " +"on it in my own time, Python was used in the Amoeba project with increasing " +"success, and the feedback from colleagues made me add many early " +"improvements." +msgstr "" +"在 1989 年的圣诞假期中,我手头的时间非常充裕,因此我决定开始尝试一下。在接下来的一年里,虽然我仍然主要用我的业余时间来做这件事,但 Python " +"在 Amoeba 项目中的使用获得了很大的成功,来自同事的反馈让我得以增加了许多早期的改进。" + +#: ../../faq/general.rst:104 +msgid "" +"In February 1991, after just over a year of development, I decided to post " +"to USENET. The rest is in the ``Misc/HISTORY`` file." +msgstr "" +"到 1991 年 2 月,经过一年多的开发,我决定将其发布到 USENET。之后的事情就都可以在 ``Misc/HISTORY`` 文件里面看了。" + +#: ../../faq/general.rst:109 +msgid "What is Python good for?" +msgstr "Python 适合做什么?" + +#: ../../faq/general.rst:111 +msgid "" +"Python is a high-level general-purpose programming language that can be " +"applied to many different classes of problems." +msgstr "Python 是一种高层级的多用途编程语言,可用于解决许多不同门类的问题。" + +#: ../../faq/general.rst:114 +msgid "" +"The language comes with a large standard library that covers areas such as " +"string processing (regular expressions, Unicode, calculating differences " +"between files), internet protocols (HTTP, FTP, SMTP, XML-RPC, POP, IMAP), " +"software engineering (unit testing, logging, profiling, parsing Python " +"code), and operating system interfaces (system calls, filesystems, TCP/IP " +"sockets). Look at the table of contents for :ref:`library-index` to get an " +"idea of what's available. A wide variety of third-party extensions are also" +" available. Consult `the Python Package Index `_ to find " +"packages of interest to you." +msgstr "" +"本语言自带一个庞大标准库,所涵盖的编程领域包括字符串处理(正则表达式、Unicode、文件间的差异比较等),互联网协议(HTTP, FTP, SMTP," +" XML-RPC, POP, IMAP),软件工程(单元测试、日志记录、性能分析、Python " +"代码解析),以及操作系统接口(系统调用、文件系统、TCP/IP 套接字)。请查看 :ref:`library-index` " +"目录页以获取所有可用内容的概览。此外还有大量第三方扩展包可供使用。请访问 `Python 软件包索引 `_ " +"来查找你感兴趣的软件包。" + +#: ../../faq/general.rst:128 +msgid "How does the Python version numbering scheme work?" +msgstr "Python 版本的编号形式是怎样的?" + +#: ../../faq/general.rst:130 +msgid "Python versions are numbered \"A.B.C\" or \"A.B\":" +msgstr "Python 版本的编号形式为 \"A.B.C\" 或 \"A.B\":" + +#: ../../faq/general.rst:132 +msgid "" +"*A* is the major version number -- it is only incremented for really major " +"changes in the language." +msgstr "*A* 是主版本号 -- 它仅会针对语言中非常重大的改变而递增。" + +#: ../../faq/general.rst:134 +msgid "" +"*B* is the minor version number -- it is incremented for less earth-" +"shattering changes." +msgstr "*B* 是次版本号 -- 它会针对不太重大的改变而递增。" + +#: ../../faq/general.rst:136 +msgid "" +"*C* is the micro version number -- it is incremented for each bugfix " +"release." +msgstr "*C* 是微版本号 -- 它针对每次问题修正发布而递增。" + +#: ../../faq/general.rst:138 +msgid "" +"Not all releases are bugfix releases. In the run-up to a new feature " +"release, a series of development releases are made, denoted as alpha, beta, " +"or release candidate. Alphas are early releases in which interfaces aren't " +"yet finalized; it's not unexpected to see an interface change between two " +"alpha releases. Betas are more stable, preserving existing interfaces but " +"possibly adding new modules, and release candidates are frozen, making no " +"changes except as needed to fix critical bugs." +msgstr "" +"并非所有发布版本都是问题修正版本。在新特征发布版本的开发过程中,会制作一系列的开发版本,它们以 alpha, beta 或 release " +"candidate 来标示。其中 alpha 版本是早期发布版,它的接口尚未最终确定;在两个 alpha 发布版本间出现接口的改变并不意外。而 beta" +" 版本更为稳定,它会保留现有的接口,但也可能增加新的模块,而 release candidate " +"版则会保持冻结状态,不做任何改变,除非有需要修复的严重问题。" + +#: ../../faq/general.rst:146 +msgid "Alpha, beta and release candidate versions have an additional suffix:" +msgstr "Alpha, beta 和候选发布版带有额外的后缀:" + +#: ../../faq/general.rst:148 +msgid "The suffix for an alpha version is \"aN\" for some small number *N*." +msgstr "带有某个小数字 *N* 的 alpha 版后缀是 \"aN\"。" + +#: ../../faq/general.rst:149 +msgid "The suffix for a beta version is \"bN\" for some small number *N*." +msgstr "带有某个小数字 *N* 的 beta 版后缀是 \"bN\"。" + +#: ../../faq/general.rst:150 +msgid "" +"The suffix for a release candidate version is \"rcN\" for some small number " +"*N*." +msgstr "带有某个小数字 *N* 的候选发布版后缀是 \"rcN\"。" + +#: ../../faq/general.rst:152 +msgid "" +"In other words, all versions labeled *2.0aN* precede the versions labeled " +"*2.0bN*, which precede versions labeled *2.0rcN*, and *those* precede 2.0." +msgstr "" +"换句话说,所有标记为 *2.0aN* 的版本都早于标记为 *2.0bN* 的版本,后者又都早于标记为 *2.0rcN* 的版本,而 *后者* " +"又都早于标记为 2.0 的版本。" + +#: ../../faq/general.rst:155 +msgid "" +"You may also find version numbers with a \"+\" suffix, e.g. \"2.2+\". These" +" are unreleased versions, built directly from the CPython development " +"repository. In practice, after a final minor release is made, the version " +"is incremented to the next minor version, which becomes the \"a0\" version, " +"e.g. \"2.4a0\"." +msgstr "" +"你还可能看到带有“+”后缀的版本号,例如“2.2+”。这表示未发布版本,直接基于 CPython 开发代码仓库构建。 " +"在实际操作中,当一个小版本最终发布后,未发布版本号会递增到下一个小版本号,成为“a0”版本,例如“2.4a0”。" + +#: ../../faq/general.rst:160 +msgid "" +"See the `Developer's Guide `__ for more information about the development " +"cycle, and :pep:`387` to learn more about Python's backward compatibility " +"policy. See also the documentation for :data:`sys.version`, " +":data:`sys.hexversion`, and :data:`sys.version_info`." +msgstr "" +"请参阅 `Developer's Guide `__ 获取更多有关开发流程的信息,并参阅 :pep:`387` 了解更多有关 Python " +"的向下兼容策略的信息。另请参阅有关 :data:`sys.version`, :data:`sys.hexversion` 和 " +":data:`sys.version_info` 的文档。" + +#: ../../faq/general.rst:169 +msgid "How do I obtain a copy of the Python source?" +msgstr "我应如何获取一份 Python 源代码的副本?" + +#: ../../faq/general.rst:171 +msgid "" +"The latest Python source distribution is always available from python.org, " +"at https://www.python.org/downloads/. The latest development sources can be" +" obtained at https://github.com/python/cpython/." +msgstr "" +"最新的 Python 发布版源代码总能从 python.org 获取,下载页链接为 https://www.python.org/downloads/。" +" 最新的开发版源代码可以在 https://github.com/python/cpython/ 获取。" + +#: ../../faq/general.rst:175 +msgid "" +"The source distribution is a gzipped tar file containing the complete C " +"source, Sphinx-formatted documentation, Python library modules, example " +"programs, and several useful pieces of freely distributable software. The " +"source will compile and run out of the box on most UNIX platforms." +msgstr "" +"发布版源代码是一个以 gzip 压缩的 tar 文件,其中包含完整的 C 源代码、Sphinx 格式的文档、Python " +"库模块、示例程序以及一些有用的自由分发软件。该源代码将可在大多数 UNIX 类平台上直接编译并运行。" + +#: ../../faq/general.rst:180 +msgid "" +"Consult the `Getting Started section of the Python Developer's Guide " +"`__ for more information on getting the " +"source code and compiling it." +msgstr "" +"请参阅 `Python 开发者指南的初步上手部分 `__ " +"了解有关获取源代码并进行编译的更多信息。" + +#: ../../faq/general.rst:186 +msgid "How do I get documentation on Python?" +msgstr "我应如何获取 Python 的文档?" + +#: ../../faq/general.rst:188 +msgid "" +"The standard documentation for the current stable version of Python is " +"available at https://docs.python.org/3/. EPUB, plain text, and downloadable" +" HTML versions are also available at " +"https://docs.python.org/3/download.html." +msgstr "" +"当前的 Python 稳定版本的标准文档可在 https://docs.python.org/3/ 查看。也可在 " +"https://docs.python.org/3/download.html 获取 EPUB、纯文本以及可下载的 HTML 版本。" + +#: ../../faq/general.rst:192 +msgid "" +"The documentation is written in reStructuredText and processed by `the " +"Sphinx documentation tool `__. The " +"reStructuredText source for the documentation is part of the Python source " +"distribution." +msgstr "" +"文档以 reStructuredText 格式撰写并使用 `Sphinx 文档工具 `__ " +"生成。文档的 reStructuredText 源文件是 Python 源代码发布版的一部分。" + +#: ../../faq/general.rst:198 +msgid "I've never programmed before. Is there a Python tutorial?" +msgstr "我之前从未接触过编程。哪里有 Python 的教程?" + +#: ../../faq/general.rst:200 +msgid "" +"There are numerous tutorials and books available. The standard " +"documentation includes :ref:`tutorial-index`." +msgstr "有许多可选择的教程和书籍。标准文档中也包含有 :ref:`tutorial-index`。" + +#: ../../faq/general.rst:203 +msgid "" +"Consult `the Beginner's Guide " +"`_ to find information for " +"beginning Python programmers, including lists of tutorials." +msgstr "" +"请参阅 `新手指南 `_ 以获取针对 Python " +"编程初学者的信息,包括教程的清单。" + +#: ../../faq/general.rst:208 +msgid "Is there a newsgroup or mailing list devoted to Python?" +msgstr "是否有专门针对 Python 的新闻组或邮件列表?" + +#: ../../faq/general.rst:210 +msgid "" +"There is a newsgroup, :newsgroup:`comp.lang.python`, and a mailing list, " +"`python-list `_. The " +"newsgroup and mailing list are gatewayed into each other -- if you can read " +"news it's unnecessary to subscribe to the mailing list. " +":newsgroup:`comp.lang.python` is high-traffic, receiving hundreds of " +"postings every day, and Usenet readers are often more able to cope with this" +" volume." +msgstr "" +"有一个新闻组 :newsgroup:`comp.lang.python` 和一个邮件列表 `python-list " +"`_。新闻组和邮件列表是彼此互通的 —— " +"如果你可以阅读新闻就不必再订阅邮件列表。 :newsgroup:`comp.lang.python` 的流量很大,每天会收到数以百计的发帖,Usenet" +" 使用者通常更擅长处理这样大的流量。" + +#: ../../faq/general.rst:217 +msgid "" +"Announcements of new software releases and events can be found in " +"comp.lang.python.announce, a low-traffic moderated list that receives about " +"five postings per day. It's available as `the python-announce mailing list " +"`_." +msgstr "" +"有关新软件发布和活动的公告可以在 comp.lang.python.announce 中找到,这是个严格管理的低流量列表,每天发帖五个左右。可在 " +"`python-announce 邮件列表 `_ 订阅。" + +#: ../../faq/general.rst:222 +msgid "" +"More info about other mailing lists and newsgroups can be found at " +"https://www.python.org/community/lists/." +msgstr "有关其他邮件列表和新闻组的更多信息可以在 https://www.python.org/community/lists/ 找到。" + +#: ../../faq/general.rst:227 +msgid "How do I get a beta test version of Python?" +msgstr "我应如何获取 Python 的公开测试版本?" + +#: ../../faq/general.rst:229 +msgid "" +"Alpha and beta releases are available from " +"https://www.python.org/downloads/. All releases are announced on the " +"comp.lang.python and comp.lang.python.announce newsgroups and on the Python " +"home page at https://www.python.org/; an RSS feed of news is available." +msgstr "" +"可以从 https://www.python.org/downloads/ 下载 alpha 和 beta 发布版。所有发布版都会在 " +"comp.lang.python 和 comp.lang.python.announce 新闻组以及 Python 主页 " +"https://www.python.org/ 上进行公告;并会推送到 RSS 新闻源。" + +#: ../../faq/general.rst:234 +msgid "" +"You can also access the development version of Python through Git. See `The" +" Python Developer's Guide `_ for details." +msgstr "" +"你还可以通过 Git 访问 Python 的开发版。请参阅 `Python 开发者指南 `_" +" 了解详情。" + +#: ../../faq/general.rst:239 +msgid "How do I submit bug reports and patches for Python?" +msgstr "我应如何为 Python 提交错误报告和补丁?" + +#: ../../faq/general.rst:241 +msgid "" +"To report a bug or submit a patch, use the issue tracker at " +"https://github.com/python/cpython/issues." +msgstr "要报告问题或提交补丁,请使用位于 https://github.com/python/cpython/issues 的问题追踪器。" + +#: ../../faq/general.rst:244 +msgid "" +"For more information on how Python is developed, consult `the Python " +"Developer's Guide `_." +msgstr "" +"有关 Python 开发流程的更多信息,请参阅 `Python 开发者指南 `_。" + +#: ../../faq/general.rst:249 +msgid "Are there any published articles about Python that I can reference?" +msgstr "是否有任何公开发表的 Python 相关文章可以供我参考引用?" + +#: ../../faq/general.rst:251 +msgid "It's probably best to cite your favorite book about Python." +msgstr "可能作为参考文献的最好方式还是引用你喜欢的 Python 相关书籍。" + +#: ../../faq/general.rst:253 +msgid "" +"The `very first article `_ about Python was " +"written in 1991 and is now quite outdated." +msgstr "" +"有关 Python 的 `最早的文章 `_ 撰写于 1991 年因而现在已相当过时。" + +#: ../../faq/general.rst:256 +msgid "" +"Guido van Rossum and Jelke de Boer, \"Interactively Testing Remote Servers " +"Using the Python Programming Language\", CWI Quarterly, Volume 4, Issue 4 " +"(December 1991), Amsterdam, pp 283--303." +msgstr "" +"Guido van Rossum 与 Jelke de Boer, \"使用 Python 编程语言交互式地测试远程服务器\", CWI 季刊,第 4 " +"卷,第 4 期 (1991 年 12 月), 阿姆斯特丹,第 283--303 页。" + +#: ../../faq/general.rst:262 +msgid "Are there any books on Python?" +msgstr "是否有任何 Python 相关的书籍?" + +#: ../../faq/general.rst:264 +msgid "" +"Yes, there are many, and more are being published. See the python.org wiki " +"at https://wiki.python.org/moin/PythonBooks for a list." +msgstr "" +"是的,相关的书籍很多,还有更多即将发行。请访问 python.org 的 wiki 页面 " +"https://wiki.python.org/moin/PythonBooks 获取一份清单。" + +#: ../../faq/general.rst:267 +msgid "" +"You can also search online bookstores for \"Python\" and filter out the " +"Monty Python references; or perhaps search for \"Python\" and \"language\"." +msgstr "" +"你也可以到各大在线书店搜索 \"Python\" 并过滤掉对 Monty Python 的引用;或者也可以搜索 \"Python\" 加 " +"\"language\"。" + +#: ../../faq/general.rst:272 +msgid "Where in the world is www.python.org located?" +msgstr "www.python.org 具体位于世界上的哪个地点?" + +#: ../../faq/general.rst:274 +msgid "" +"The Python project's infrastructure is located all over the world and is " +"managed by the Python Infrastructure Team. Details `here " +"`__." +msgstr "" +"Python 项目的基础设施分布于世界各地并由 Python 基础设施团队负责管理。相关细节请访问 `这里 " +"`__." + +#: ../../faq/general.rst:279 +msgid "Why is it called Python?" +msgstr "为何命名为 Python?" + +#: ../../faq/general.rst:281 +msgid "" +"When he began implementing Python, Guido van Rossum was also reading the " +"published scripts from `\"Monty Python's Flying Circus\" " +"`__, a BBC comedy series from " +"the 1970s. Van Rossum thought he needed a name that was short, unique, and " +"slightly mysterious, so he decided to call the language Python." +msgstr "" +"在着手编写 Python 实现的时候,Guido van Rossum 同时还阅读了刚出版的 `\"Monty Python 的飞行马戏团\" " +"`__ 剧本,这是一部自 1970 年代开始播出的 BBC " +"系列喜剧。Van Rossum 觉得他需要选择一个简短、独特而又略显神秘的名字,于是他决定将这个新语言命名为 Python。" + +#: ../../faq/general.rst:289 +msgid "Do I have to like \"Monty Python's Flying Circus\"?" +msgstr "我必须喜欢 \"Monty Python 的飞行马戏团\" 吗?" + +#: ../../faq/general.rst:291 +msgid "No, but it helps. :)" +msgstr "不必,但这对学习会有帮助。 :)" + +#: ../../faq/general.rst:295 +msgid "Python in the real world" +msgstr "现实世界中的 Python" + +#: ../../faq/general.rst:298 +msgid "How stable is Python?" +msgstr "Python 有多稳定?" + +#: ../../faq/general.rst:300 +msgid "" +"Very stable. New, stable releases have been coming out roughly every 6 to " +"18 months since 1991, and this seems likely to continue. As of version 3.9," +" Python will have a new feature release every 12 months (:pep:`602`)." +msgstr "" +"非常稳定。自 1991 年起大约每隔 6 至 18 个月就会推出新的稳定发布版,这种状态看来还会持续下去。从 3.9 版开始,Python 将会每隔 " +"12 个月推出一个新增特征版本 (:pep:`602`)。" + +#: ../../faq/general.rst:304 +msgid "" +"The developers issue bugfix releases of older versions, so the stability of " +"existing releases gradually improves. Bugfix releases, indicated by a third" +" component of the version number (e.g. 3.5.3, 3.6.2), are managed for " +"stability; only fixes for known problems are included in a bugfix release, " +"and it's guaranteed that interfaces will remain the same throughout a series" +" of bugfix releases." +msgstr "" +"开发者也会推出较旧版本的问题修正发布版,因此现有发布版的稳定性还会逐步提升。问题修正发布版会以版本号第三部分的数字来标示(例如 3.5.3, " +"3.6.2),用于稳定性管理;只有对已知问题的修正会包含在问题修正发布版中,而同一系列的问题修正发布版中的接口将会始终保持一致。" + +#: ../../faq/general.rst:311 +msgid "" +"The latest stable releases can always be found on the `Python download page " +"`_. Python 3.x is the recommended version" +" and supported by most widely used libraries. Python 2.x :pep:`is not " +"maintained anymore <373>`." +msgstr "" +"最新的稳定发布版总是可以在 `Python 下载页 `_ 中找到。Python " +"3.x 是推荐的版本并被大多数广泛使用的库所支持。Python 2.x :pep:`已不再维护 <373>`。" + +#: ../../faq/general.rst:317 +msgid "How many people are using Python?" +msgstr "有多少人在使用 Python?" + +#: ../../faq/general.rst:319 +msgid "" +"There are probably millions of users, though it's difficult to obtain an " +"exact count." +msgstr "使用者应该数以百万计,但很难获得一个精确的数字。" + +#: ../../faq/general.rst:322 +msgid "" +"Python is available for free download, so there are no sales figures, and " +"it's available from many different sites and packaged with many Linux " +"distributions, so download statistics don't tell the whole story either." +msgstr "" +"Python 可以免费下载,因此并不存在销量数据,此外它也可以从许多不同网站获取,并且包含于许多 Linux " +"发行版之中,因此下载量统计同样无法完全说明问题。" + +#: ../../faq/general.rst:326 +msgid "" +"The comp.lang.python newsgroup is very active, but not all Python users post" +" to the group or even read it." +msgstr "comp.lang.python 新闻组非常活跃,但不是所有 Python 用户都会在新闻组发帖,许多人甚至不会阅读新闻组。" + +#: ../../faq/general.rst:331 +msgid "Have any significant projects been done in Python?" +msgstr "有哪些重要的项目是用 Python 开发的?" + +#: ../../faq/general.rst:333 +msgid "" +"See https://www.python.org/about/success for a list of projects that use " +"Python. Consulting the proceedings for `past Python conferences " +"`_ will reveal contributions " +"from many different companies and organizations." +msgstr "" +"请访问 https://www.python.org/about/success 查看使用了 Python 的项目列表。阅览 `历次 Python 会议" +" `_ 的日程纪要可以看到许多不同公司和组织所做的贡献。" + +#: ../../faq/general.rst:338 +msgid "" +"High-profile Python projects include `the Mailman mailing list manager " +"`_ and `the Zope application server " +"`_. Several Linux distributions, most notably `Red " +"Hat `_, have written part or all of their installer " +"and system administration software in Python. Companies that use Python " +"internally include Google, Yahoo, and Lucasfilm Ltd." +msgstr "" +"高水准的 Python 项目包括 `Mailman 邮件列表管理器 `_ 和 `Zope 应用服务器 " +"`_。多个 Linux 发行版,其中最著名的是 `Red Hat " +"`_,都使用 Python 来编写其部分或全部的安装器和系统管理软件。在内部使用 Python " +"的公司包括了 Google, Yahoo 和 Lucasfilm 等等。" + +#: ../../faq/general.rst:347 +msgid "What new developments are expected for Python in the future?" +msgstr "在未来可以期待 Python 将有什么新进展?" + +#: ../../faq/general.rst:349 +msgid "" +"See https://peps.python.org/ for the Python Enhancement Proposals (PEPs). " +"PEPs are design documents describing a suggested new feature for Python, " +"providing a concise technical specification and a rationale. Look for a PEP" +" titled \"Python X.Y Release Schedule\", where X.Y is a version that hasn't " +"been publicly released yet." +msgstr "" +"请访问 https://peps.python.org/ 查看 Python 增强提议(PEP)。PEP 是为 Python " +"加入某种新特性的提议进行描述的设计文档,其中会提供简明的技术规格说明与基本原理。可查找标题为 \"Python X.Y Release " +"Schedule\" 的 PEP,其中 X.Y 是某个尚未公开发布的版本。" + +#: ../../faq/general.rst:355 +msgid "" +"New development is discussed on `the python-dev mailing list " +"`_." +msgstr "" +"新版本的开发会在 `python-dev 邮件列表 `_ 中进行讨论。" + +#: ../../faq/general.rst:360 +msgid "Is it reasonable to propose incompatible changes to Python?" +msgstr "提议对 Python 加入不兼容的更改是否合理?" + +#: ../../faq/general.rst:362 +msgid "" +"In general, no. There are already millions of lines of Python code around " +"the world, so any change in the language that invalidates more than a very " +"small fraction of existing programs has to be frowned upon. Even if you can" +" provide a conversion program, there's still the problem of updating all " +"documentation; many books have been written about Python, and we don't want " +"to invalidate them all at a single stroke." +msgstr "" +"通常来说是不合理的。世界上已存在的 Python 代码数以亿计,因此,任何对该语言的更改即便仅会使得现有程序中极少的一部分失效也是难以令人接受的。 " +"就算你可以提供一个转换程序,也仍然存在需要更新全部文档的问题;另外还有大量已出版的 Python 书籍,我们不希望让它们在一瞬间全部变成废纸。" + +#: ../../faq/general.rst:369 +msgid "" +"Providing a gradual upgrade path is necessary if a feature has to be " +"changed. :pep:`5` describes the procedure followed for introducing backward-" +"incompatible changes while minimizing disruption for users." +msgstr "如果必须更改某个特性,则应该提供渐进式的升级路径。 :pep:`5` 描述了引入向后不兼容的更改所需遵循的流程,以尽可能减少对用户的干扰。" + +#: ../../faq/general.rst:375 +msgid "Is Python a good language for beginning programmers?" +msgstr "Python 是一种对编程初学者友好的语言吗?" + +#: ../../faq/general.rst:377 +msgid "Yes." +msgstr "是的。" + +#: ../../faq/general.rst:379 +msgid "" +"It is still common to start students with a procedural and statically typed " +"language such as Pascal, C, or a subset of C++ or Java. Students may be " +"better served by learning Python as their first language. Python has a very" +" simple and consistent syntax and a large standard library and, most " +"importantly, using Python in a beginning programming course lets students " +"concentrate on important programming skills such as problem decomposition " +"and data type design. With Python, students can be quickly introduced to " +"basic concepts such as loops and procedures. They can probably even work " +"with user-defined objects in their very first course." +msgstr "" +"从过程式、静态类型的编程语言例如 Pascal, C 或者 C++ 以及 Java 的某一子集开始引导学生入门仍然是常见的做法。但以 Python " +"作为第一种编程语言进行学习对学生可能更有利。Python 具有非常简单和一致的语法和庞大的标准库,而且最重要的是,在编程入门教学中使用 Python " +"可以让学生专注于更重要的编程技能,例如问题分解与数据类型设计。使用 Python,可以快速向学生介绍基本概念例如循环与过程等。 " +"他们甚至有可能在第一次课里就开始接触用户自定义对象。" + +#: ../../faq/general.rst:389 +msgid "" +"For a student who has never programmed before, using a statically typed " +"language seems unnatural. It presents additional complexity that the " +"student must master and slows the pace of the course. The students are " +"trying to learn to think like a computer, decompose problems, design " +"consistent interfaces, and encapsulate data. While learning to use a " +"statically typed language is important in the long term, it is not " +"necessarily the best topic to address in the students' first programming " +"course." +msgstr "" +"对于之前从未接触过编程的学生来说,使用静态类型语言会感觉不够自然。这会给学生带来必须掌握的额外复杂性,并减慢教学的进度。 " +"学生需要尝试像计算机一样思考,分解问题,设计一致的接口并封装数据。 " +"虽然从长远来看,学习和使用一种静态类型语言是很重要的,但这并不是最适宜在学生的第一次编程课上就进行探讨的主题。" + +#: ../../faq/general.rst:397 +msgid "" +"Many other aspects of Python make it a good first language. Like Java, " +"Python has a large standard library so that students can be assigned " +"programming projects very early in the course that *do* something. " +"Assignments aren't restricted to the standard four-function calculator and " +"check balancing programs. By using the standard library, students can gain " +"the satisfaction of working on realistic applications as they learn the " +"fundamentals of programming. Using the standard library also teaches " +"students about code reuse. Third-party modules such as PyGame are also " +"helpful in extending the students' reach." +msgstr "" +"还有许多其他方面的特点使得 Python 成为很好的入门语言。像 Java 一样,Python " +"拥有一个庞大的标准库,因此可以在课程非常早期的阶段就给学生布置一些 *实用* 的编程项目。编程作业不必仅限于标准四则运算和账目检查程序。 " +"通过使用标准库,学生可以在学习编程基础知识的同时开发真正的应用,从而获得更大的满足感。使用标准库还能使学生了解代码重用的概念。而像 PyGame " +"这样的第三方模块同样有助于扩大学生的接触领域。" + +#: ../../faq/general.rst:406 +msgid "" +"Python's interactive interpreter enables students to test language features " +"while they're programming. They can keep a window with the interpreter " +"running while they enter their program's source in another window. If they " +"can't remember the methods for a list, they can do something like this::" +msgstr "" +"Python 的交互式解释器使学生能够在编程时测试语言特性。他们可以在一个窗口中输入程序源代码的同时开启一个解释器运行窗口。 " +"如果他们不记得列表有哪些方法,他们可以这样做::" + +#: ../../faq/general.rst:411 +msgid "" +">>> L = []\n" +">>> dir(L)\n" +"['__add__', '__class__', '__contains__', '__delattr__', '__delitem__',\n" +"'__dir__', '__doc__', '__eq__', '__format__', '__ge__',\n" +"'__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__',\n" +"'__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__',\n" +"'__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',\n" +"'__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__',\n" +"'__sizeof__', '__str__', '__subclasshook__', 'append', 'clear',\n" +"'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove',\n" +"'reverse', 'sort']\n" +">>> [d for d in dir(L) if '__' not in d]\n" +"['append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']\n" +"\n" +">>> help(L.append)\n" +"Help on built-in function append:\n" +"\n" +"append(...)\n" +" L.append(object) -> None -- append object to end\n" +"\n" +">>> L.append(1)\n" +">>> L\n" +"[1]" +msgstr "" +">>> L = []\n" +">>> dir(L)\n" +"['__add__', '__class__', '__contains__', '__delattr__', '__delitem__',\n" +"'__dir__', '__doc__', '__eq__', '__format__', '__ge__',\n" +"'__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__',\n" +"'__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__',\n" +"'__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',\n" +"'__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__',\n" +"'__sizeof__', '__str__', '__subclasshook__', 'append', 'clear',\n" +"'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove',\n" +"'reverse', 'sort']\n" +">>> [d for d in dir(L) if '__' not in d]\n" +"['append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']\n" +"\n" +">>> help(L.append)\n" +"Help on built-in function append:\n" +"\n" +"append(...)\n" +" L.append(object) -> None -- append object to end\n" +"\n" +">>> L.append(1)\n" +">>> L\n" +"[1]" + +#: ../../faq/general.rst:435 +msgid "" +"With the interpreter, documentation is never far from the student as they " +"are programming." +msgstr "通过使用解释器,学生编写程序时参考文档总是能伴随在他们身边。" + +#: ../../faq/general.rst:438 +msgid "" +"There are also good IDEs for Python. IDLE is a cross-platform IDE for " +"Python that is written in Python using Tkinter. Emacs users will be happy to" +" know that there is a very good Python mode for Emacs. All of these " +"programming environments provide syntax highlighting, auto-indenting, and " +"access to the interactive interpreter while coding. Consult `the Python " +"wiki `_ for a full list of " +"Python editing environments." +msgstr "" +"Python 还拥有一些很好的 IDE。IDLE 是一个以 Python 基于 Tkinter 编写的跨平台 Python IDE。Emacs " +"用户将高兴地了解到 Emacs 具有非常好的 Python 模式。所有这些编程环境都提供语法高亮、自动缩进以及在编写代码时使用交互式解释器等功能。 " +"请访问 `Python wiki `_ 查看 Python " +"编程环境的完整列表。" + +#: ../../faq/general.rst:446 +msgid "" +"If you want to discuss Python's use in education, you may be interested in " +"joining `the edu-sig mailing list " +"`_." +msgstr "" +"如果你想要讨论 Python 在教育中的使用,你可能会有兴趣加入 `edu-sig 邮件列表 " +"`_。" diff --git a/faq/gui.po b/faq/gui.po new file mode 100644 index 0000000000..53a85d3bfc --- /dev/null +++ b/faq/gui.po @@ -0,0 +1,138 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../faq/gui.rst:5 +msgid "Graphic User Interface FAQ" +msgstr "图形用户界面(GUI)常见问题" + +#: ../../faq/gui.rst:8 +msgid "Contents" +msgstr "目录" + +#: ../../faq/gui.rst:15 +msgid "General GUI Questions" +msgstr "图形界面常见问题" + +#: ../../faq/gui.rst:18 +msgid "What GUI toolkits exist for Python?" +msgstr "Python 有哪些 GUI 工具包?" + +#: ../../faq/gui.rst:20 +msgid "" +"Standard builds of Python include an object-oriented interface to the Tcl/Tk" +" widget set, called :ref:`tkinter `. This is probably the easiest " +"to install (since it comes included with most `binary distributions " +"`_ of Python) and use. For more info " +"about Tk, including pointers to the source, see the `Tcl/Tk home page " +"`_. Tcl/Tk is fully portable to the macOS, Windows, and" +" Unix platforms." +msgstr "" +"Python 的标准构建包括一个指向 Tcl/Tk 部件集的面向对象的接口,称为 :ref:`tkinter `。 " +"这可能是最容易安装(因为它包含在大多数 Python 的 `二进制发行版 `_ " +"中)和使用的。关于 Tk 的更多信息,包括指向源代码的信息,见 `Tcl/Tk 主页 `_。Tcl/Tk " +"可以完全移植到 macOS、Windows 和 Unix 平台。" + +#: ../../faq/gui.rst:28 +msgid "" +"Depending on what platform(s) you are aiming at, there are also several " +"alternatives. A `list of cross-platform " +"`_ " +"and `platform-specific " +"`_" +" GUI frameworks can be found on the python wiki." +msgstr "" +"存在多种选项,具体取决于你的目标平台。Python Wiki 上提供了一个 `跨平台 " +"`_ 和 " +"`平台专属 `_ 的 GUI 框架列表。" + +#: ../../faq/gui.rst:36 +msgid "Tkinter questions" +msgstr "有关 Tkinter 的问题" + +#: ../../faq/gui.rst:39 +msgid "How do I freeze Tkinter applications?" +msgstr "我怎样\"冻结\" Tkinter 程序?" + +#: ../../faq/gui.rst:41 +msgid "" +"Freeze is a tool to create stand-alone applications. When freezing Tkinter " +"applications, the applications will not be truly stand-alone, as the " +"application will still need the Tcl and Tk libraries." +msgstr "" +"Freeze(意为“冻结”)是一个用来创建独立应用程序的工具。当“冻结”Tkinter 程序时,程序并不是真的能够独立运行,因为程序仍然需要 Tcl 和" +" Tk 库。" + +#: ../../faq/gui.rst:45 +msgid "" +"One solution is to ship the application with the Tcl and Tk libraries, and " +"point to them at run-time using the :envvar:`!TCL_LIBRARY` and " +":envvar:`!TK_LIBRARY` environment variables." +msgstr "" +"一种解决方案是将应用程序与 Tcl 和 Tk 库一起发布,并在运行时使用 :envvar:`!TCL_LIBRARY` 和 " +":envvar:`!TK_LIBRARY` 环境变量指向它们的位置。" + +#: ../../faq/gui.rst:49 +msgid "" +"Various third-party freeze libraries such as py2exe and cx_Freeze have " +"handling for Tkinter applications built-in." +msgstr "各种第三方冻结库例如 py2exe 和 cx_Freeze 都内置了对 Tkinter 应用程序的处理支持。" + +#: ../../faq/gui.rst:54 +msgid "Can I have Tk events handled while waiting for I/O?" +msgstr "在等待 I/O 操作时能够处理 Tk 事件吗?" + +#: ../../faq/gui.rst:56 +msgid "" +"On platforms other than Windows, yes, and you don't even need threads! But " +"you'll have to restructure your I/O code a bit. Tk has the equivalent of " +"Xt's :c:func:`!XtAddInput` call, which allows you to register a callback " +"function which will be called from the Tk mainloop when I/O is possible on a" +" file descriptor. See :ref:`tkinter-file-handlers`." +msgstr "" +"在 Windows 以外的平台上,可以,而且你甚至不需要使用线程!但你必须稍微调整一下你的 I/O 代码。Tk 有与 Xt 的 " +":c:func:`!XtAddInput` 对应的调用,它允许你注册一个回调函数,当可以对一个文件描述符进行 I/O 操作时,该函数将从 Tk " +"的主循环中被调用。参见 :ref:`tkinter-file-handlers`。" + +#: ../../faq/gui.rst:64 +msgid "I can't get key bindings to work in Tkinter: why?" +msgstr "在 Tkinter 中键绑定不工作:为什么?" + +#: ../../faq/gui.rst:66 +msgid "" +"An often-heard complaint is that event handlers :ref:`bound ` to events with the :meth:`!bind` method don't get handled even when" +" the appropriate key is pressed." +msgstr "" +"一个经常听到的抱怨是:已经通过 :meth:`!bind` 方法 :ref:`绑定 ` " +"到事件的事件处理器在对应的键被按下时并没有被处理。" + +#: ../../faq/gui.rst:70 +msgid "" +"The most common cause is that the widget to which the binding applies " +"doesn't have \"keyboard focus\". Check out the Tk documentation for the " +"focus command. Usually a widget is given the keyboard focus by clicking in " +"it (but not for labels; see the takefocus option)." +msgstr "" +"最常见的原因是,那个绑定的控件没有“键盘焦点”。请在 Tk 文档中查找 focus " +"指令。通常一个控件要获得“键盘焦点”,需要点击那个控件(而不是标签;请查看 takefocus 选项)。" diff --git a/faq/index.po b/faq/index.po new file mode 100644 index 0000000000..8c13868cf1 --- /dev/null +++ b/faq/index.po @@ -0,0 +1,26 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../faq/index.rst:5 +msgid "Python Frequently Asked Questions" +msgstr "Python 常见问题" diff --git a/faq/installed.po b/faq/installed.po new file mode 100644 index 0000000000..3f70c75ca3 --- /dev/null +++ b/faq/installed.po @@ -0,0 +1,125 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../faq/installed.rst:3 +msgid "\"Why is Python Installed on my Computer?\" FAQ" +msgstr "\"为什么我的电脑上安装了 Python ?\" FAQ" + +#: ../../faq/installed.rst:6 +msgid "What is Python?" +msgstr "什么是 Python?" + +#: ../../faq/installed.rst:8 +msgid "" +"Python is a programming language. It's used for many different " +"applications. It's used in some high schools and colleges as an introductory" +" programming language because Python is easy to learn, but it's also used by" +" professional software developers at places such as Google, NASA, and " +"Lucasfilm Ltd." +msgstr "" +"Python 是一种编程语言,被用于许多不同的应用领域。它不仅因易学而在许多高校用于编程入门,还被工作于 Google、NASA " +"和卢卡斯影业等公司的专业软件开发人员使用。" + +#: ../../faq/installed.rst:13 +msgid "" +"If you wish to learn more about Python, start with the `Beginner's Guide to " +"Python `_." +msgstr "" +"如果你想学习更多 Python,看看 `Beginner's Guide to Python " +"`_." + +#: ../../faq/installed.rst:18 +msgid "Why is Python installed on my machine?" +msgstr "为什么我的电脑上安装了 Python?" + +#: ../../faq/installed.rst:20 +msgid "" +"If you find Python installed on your system but don't remember installing " +"it, there are several possible ways it could have gotten there." +msgstr "如果你不记得你曾主动安装过 Python,但它却出现在了你的电脑上,这里有一些可能的原因。" + +#: ../../faq/installed.rst:23 +msgid "" +"Perhaps another user on the computer wanted to learn programming and " +"installed it; you'll have to figure out who's been using the machine and " +"might have installed it." +msgstr "可能是这台电脑的其他用户因想学习编程而安装了它,你得琢磨一下谁用过这台电脑并安装了 Python。" + +#: ../../faq/installed.rst:26 +msgid "" +"A third-party application installed on the machine might have been written " +"in Python and included a Python installation. There are many such " +"applications, from GUI programs to network servers and administrative " +"scripts." +msgstr "" +"电脑上安装的第三方应用程序可能由 Python 写成并附带了一份 Python。这样的应用程序有很多,例如 GUI 程序、网络服务器、管理脚本等。" + +#: ../../faq/installed.rst:29 +msgid "" +"Some Windows machines also have Python installed. At this writing we're " +"aware of computers from Hewlett-Packard and Compaq that include Python. " +"Apparently some of HP/Compaq's administrative tools are written in Python." +msgstr "" +"一些 Windows 可能预装了 Python。在撰写本文时,我们了解到 Hewlett-Packard 和 Compaq 的计算机包含 " +"Python。显然,HP/Compaq 的一些管理工具是用 Python 编写的。" + +#: ../../faq/installed.rst:32 +msgid "" +"Many Unix-compatible operating systems, such as macOS and some Linux " +"distributions, have Python installed by default; it's included in the base " +"installation." +msgstr "许多与 Unix 兼容的操作系统,如 macOS 和一些 Linux 发行版,都默认安装了 Python;它包含在基本安装中。" + +#: ../../faq/installed.rst:38 +msgid "Can I delete Python?" +msgstr "我能删除 Python 吗?" + +#: ../../faq/installed.rst:40 +msgid "That depends on where Python came from." +msgstr "这取决于所安装 Python 的来源。" + +#: ../../faq/installed.rst:42 +msgid "" +"If someone installed it deliberately, you can remove it without hurting " +"anything. On Windows, use the Add/Remove Programs icon in the Control " +"Panel." +msgstr "" +"如果有人主动安装了 Python,你可以在不影响其它程序的情况下安全移除它。在 Windows 中,可使用“控制面板”中的“添加/删除程序”卸载。" + +#: ../../faq/installed.rst:45 +msgid "" +"If Python was installed by a third-party application, you can also remove " +"it, but that application will no longer work. You should use that " +"application's uninstaller rather than removing Python directly." +msgstr "" +"如果 Python 来源于第三方应用程序,你也能删除它,但那些程序将不能正常工作。你应该使用那些应用程序的卸载器而不是直接删除 Python。" + +#: ../../faq/installed.rst:49 +msgid "" +"If Python came with your operating system, removing it is not recommended. " +"If you remove it, whatever tools were written in Python will no longer run, " +"and some of them might be important to you. Reinstalling the whole system " +"would then be required to fix things again." +msgstr "" +"如果 Python 来自于你的操作系统,不推荐删除。如果删除了它,任何用 Python " +"写成的工具将无法工作,其中某些工具对于你来说可能十分重要。届时你将需要重装整个系统才能恢复正常。" diff --git a/faq/library.po b/faq/library.po new file mode 100644 index 0000000000..b50e1292c7 --- /dev/null +++ b/faq/library.po @@ -0,0 +1,1284 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../faq/library.rst:5 +msgid "Library and Extension FAQ" +msgstr "标准库和扩展 FAQ" + +#: ../../faq/library.rst:8 +msgid "Contents" +msgstr "目录" + +#: ../../faq/library.rst:12 +msgid "General Library Questions" +msgstr "通用标准库问题" + +#: ../../faq/library.rst:15 +msgid "How do I find a module or application to perform task X?" +msgstr "如何找到可以用来做 X 任务的模块或应用?" + +#: ../../faq/library.rst:17 +msgid "" +"Check :ref:`the Library Reference ` to see if there's a " +"relevant standard library module. (Eventually you'll learn what's in the " +"standard library and will be able to skip this step.)" +msgstr "在 :ref:`标准库参考 ` 中查找是否有适合的标准库模块。(如果你已经了解标准库的内容,可以跳过这一步)" + +#: ../../faq/library.rst:21 +msgid "" +"For third-party packages, search the `Python Package Index " +"`_ or try `Google `_ or another " +"web search engine. Searching for \"Python\" plus a keyword or two for your " +"topic of interest will usually find something helpful." +msgstr "" +"对于第三方软件包,请搜索 `Python Package Index `_ 或者是尝试 `Google " +"`_ 或其他网络搜索引擎。搜索 \"Python\" " +"加上一两个你感兴趣的关键词通常就会找到一些有用的信息。" + +#: ../../faq/library.rst:28 +msgid "Where is the math.py (socket.py, regex.py, etc.) source file?" +msgstr "math.py(socket.py,regex.py 等)的源文件在哪?" + +#: ../../faq/library.rst:30 +msgid "" +"If you can't find a source file for a module it may be a built-in or " +"dynamically loaded module implemented in C, C++ or other compiled language. " +"In this case you may not have the source file or it may be something like " +":file:`mathmodule.c`, somewhere in a C source directory (not on the Python " +"Path)." +msgstr "" +"如果找不到模块的源文件,可能它是一个内建的模块,或是使用 C,C++ 或其他编译型语言实现的动态加载模块。这种情况下可能是没有源码文件的,类似 " +":file:`mathmodule.c` 这样的文件会存放在 C 代码目录中(但不在 Python 目录中)。" + +#: ../../faq/library.rst:35 +msgid "There are (at least) three kinds of modules in Python:" +msgstr "Python 中(至少)有三类模块:" + +#: ../../faq/library.rst:37 +msgid "modules written in Python (.py);" +msgstr "使用 Python 编写的模块(.py);" + +#: ../../faq/library.rst:38 +msgid "" +"modules written in C and dynamically loaded (.dll, .pyd, .so, .sl, etc);" +msgstr "使用 C 编写的动态加载模块(.dll,.pyd,.so,.sl 等);" + +#: ../../faq/library.rst:39 +msgid "" +"modules written in C and linked with the interpreter; to get a list of " +"these, type::" +msgstr "使用 C 编写并链接到解释器的模块,要获取此列表,输入:" + +#: ../../faq/library.rst:42 +msgid "" +"import sys\n" +"print(sys.builtin_module_names)" +msgstr "" +"import sys\n" +"print(sys.builtin_module_names)" + +#: ../../faq/library.rst:47 +msgid "How do I make a Python script executable on Unix?" +msgstr "在 Unix 中怎样让 Python 脚本可执行?" + +#: ../../faq/library.rst:49 +msgid "" +"You need to do two things: the script file's mode must be executable and the" +" first line must begin with ``#!`` followed by the path of the Python " +"interpreter." +msgstr "你需要做两件事:文件必须是可执行的,并且第一行需要以 ``#!`` 开头,后面跟上 Python 解释器的路径。" + +#: ../../faq/library.rst:53 +msgid "" +"The first is done by executing ``chmod +x scriptfile`` or perhaps ``chmod " +"755 scriptfile``." +msgstr "第一点可以用执行 ``chmod +x scriptfile`` 或是 ``chmod 755 scriptfile`` 做到。" + +#: ../../faq/library.rst:56 +msgid "" +"The second can be done in a number of ways. The most straightforward way is" +" to write ::" +msgstr "第二点有很多种做法,最直接的方式是:" + +#: ../../faq/library.rst:59 +msgid "#!/usr/local/bin/python" +msgstr "#!/usr/local/bin/python" + +#: ../../faq/library.rst:61 +msgid "" +"as the very first line of your file, using the pathname for where the Python" +" interpreter is installed on your platform." +msgstr "在文件第一行,使用你所在平台上的 Python 解释器的路径。" + +#: ../../faq/library.rst:64 +msgid "" +"If you would like the script to be independent of where the Python " +"interpreter lives, you can use the :program:`env` program. Almost all Unix " +"variants support the following, assuming the Python interpreter is in a " +"directory on the user's :envvar:`PATH`::" +msgstr "" +"如果你希望脚本不依赖 Python 解释器的具体路径,你也可以使用 :program:`env` 程序。假设你的 Python " +"解释器所在目录已经添加到了 :envvar:`PATH` 环境变量中,几乎所有的类 Unix 系统都支持下面的写法:" + +#: ../../faq/library.rst:69 +msgid "#!/usr/bin/env python" +msgstr "#!/usr/bin/env python" + +#: ../../faq/library.rst:71 +msgid "" +"*Don't* do this for CGI scripts. The :envvar:`PATH` variable for CGI " +"scripts is often very minimal, so you need to use the actual absolute " +"pathname of the interpreter." +msgstr "" +"*不要* 在 CGI 脚本中这样做。CGI 脚本的 :envvar:`PATH` 环境变量通常会非常精简,所以你必须使用解释器的完整绝对路径。" + +#: ../../faq/library.rst:75 +msgid "" +"Occasionally, a user's environment is so full that the " +":program:`/usr/bin/env` program fails; or there's no env program at all. In" +" that case, you can try the following hack (due to Alex Rezinsky):" +msgstr "" +"有时候,用户的环境变量如果太长,可能会导致 :program:`/usr/bin/env` 执行失败;又或者甚至根本就不存在 env " +"程序。在这种情况下,你可以尝试使用下面的 hack 方法(来自 Alex Rezinsky):" + +#: ../../faq/library.rst:79 +msgid "" +"#! /bin/sh\n" +"\"\"\":\"\n" +"exec python $0 ${1+\"$@\"}\n" +"\"\"\"" +msgstr "" +"#! /bin/sh\n" +"\"\"\":\"\n" +"exec python $0 ${1+\"$@\"}\n" +"\"\"\"" + +#: ../../faq/library.rst:86 +msgid "" +"The minor disadvantage is that this defines the script's __doc__ string. " +"However, you can fix that by adding ::" +msgstr "这样做有一个小小的缺点,它会定义脚本的 __doc__ 字符串。不过可以这样修复:" + +#: ../../faq/library.rst:89 +msgid "__doc__ = \"\"\"...Whatever...\"\"\"" +msgstr "__doc__ = \"\"\"...Whatever...\"\"\"" + +#: ../../faq/library.rst:94 +msgid "Is there a curses/termcap package for Python?" +msgstr "Python 中有 curses/termcap 包吗?" + +#: ../../faq/library.rst:98 +msgid "" +"For Unix variants: The standard Python source distribution comes with a " +"curses module in the :source:`Modules` subdirectory, though it's not " +"compiled by default. (Note that this is not available in the Windows " +"distribution -- there is no curses module for Windows.)" +msgstr "" +"对于类 Unix 系统:标准 Python 源码发行版会在 :source:`Modules` 子目录中附带 curses " +"模块,但默认并不会编译。(注意:在 Windows 平台下不可用 —— Windows 中没有 curses 模块。)" + +#: ../../faq/library.rst:103 +msgid "" +"The :mod:`curses` module supports basic curses features as well as many " +"additional functions from ncurses and SYSV curses such as colour, " +"alternative character set support, pads, and mouse support. This means the " +"module isn't compatible with operating systems that only have BSD curses, " +"but there don't seem to be any currently maintained OSes that fall into this" +" category." +msgstr "" +":mod:`curses` 模块支持基本的 curses 特性,同时也支持 ncurses 和 SYSV curses " +"中的很多额外功能,比如颜色、不同的字符集支持、填充和鼠标支持。这意味着这个模块不兼容只有 BSD curses " +"模块的操作系统,但是目前仍在维护的系统应该都不会存在这种情况。" + +#: ../../faq/library.rst:111 +msgid "Is there an equivalent to C's onexit() in Python?" +msgstr "Python 中存在类似 C 的 onexit() 函数的东西吗?" + +#: ../../faq/library.rst:113 +msgid "" +"The :mod:`atexit` module provides a register function that is similar to C's" +" :c:func:`!onexit`." +msgstr ":mod:`atexit` 模块提供了一个与 C 的 :c:func:`!onexit` 类似的注册函数。" + +#: ../../faq/library.rst:118 +msgid "Why don't my signal handlers work?" +msgstr "为什么我的信号处理函数不能工作?" + +#: ../../faq/library.rst:120 +msgid "" +"The most common problem is that the signal handler is declared with the " +"wrong argument list. It is called as ::" +msgstr "最常见的问题是信号处理函数没有正确定义参数列表。它会被这样调用:" + +#: ../../faq/library.rst:123 +msgid "handler(signum, frame)" +msgstr "handler(signum, frame)" + +#: ../../faq/library.rst:125 +msgid "so it should be declared with two parameters::" +msgstr "因此它应当声明为带有两个形参::" + +#: ../../faq/library.rst:127 +msgid "" +"def handler(signum, frame):\n" +" ..." +msgstr "" +"def handler(signum, frame):\n" +" ..." + +#: ../../faq/library.rst:132 +msgid "Common tasks" +msgstr "通用任务" + +#: ../../faq/library.rst:135 +msgid "How do I test a Python program or component?" +msgstr "怎样测试 Python 程序或组件?" + +#: ../../faq/library.rst:137 +msgid "" +"Python comes with two testing frameworks. The :mod:`doctest` module finds " +"examples in the docstrings for a module and runs them, comparing the output " +"with the expected output given in the docstring." +msgstr "" +"Python 带有两个测试框架。:mod:`doctest` 模块从模块的 docstring 中寻找示例并执行,对比输出与 docstring " +"中给出的是否一致。" + +#: ../../faq/library.rst:141 +msgid "" +"The :mod:`unittest` module is a fancier testing framework modelled on Java " +"and Smalltalk testing frameworks." +msgstr ":mod:`unittest` 模块是一个模仿 Java 和 Smalltalk 测试框架的更棒的测试框架。" + +#: ../../faq/library.rst:144 +msgid "" +"To make testing easier, you should use good modular design in your program. " +"Your program should have almost all functionality encapsulated in either " +"functions or class methods -- and this sometimes has the surprising and " +"delightful effect of making the program run faster (because local variable " +"accesses are faster than global accesses). Furthermore the program should " +"avoid depending on mutating global variables, since this makes testing much " +"more difficult to do." +msgstr "" +"为了使测试更容易,你应该在程序中使用良好的模块化设计。程序中的绝大多数功能都应该用函数或类方法封装 —— " +"有时这样做会有额外惊喜,程序会运行得更快(因为局部变量比全局变量访问要快)。除此之外,程序应该避免依赖可变的全局变量,这会使得测试困难许多。" + +#: ../../faq/library.rst:152 +msgid "The \"global main logic\" of your program may be as simple as ::" +msgstr "程序的“全局主逻辑”应该尽量简单:" + +#: ../../faq/library.rst:154 +msgid "" +"if __name__ == \"__main__\":\n" +" main_logic()" +msgstr "" +"if __name__ == \"__main__\":\n" +" main_logic()" + +#: ../../faq/library.rst:157 +msgid "at the bottom of the main module of your program." +msgstr "并放置在程序主模块的最后面。" + +#: ../../faq/library.rst:159 +msgid "" +"Once your program is organized as a tractable collection of function and " +"class behaviours, you should write test functions that exercise the " +"behaviours. A test suite that automates a sequence of tests can be " +"associated with each module. This sounds like a lot of work, but since " +"Python is so terse and flexible it's surprisingly easy. You can make coding" +" much more pleasant and fun by writing your test functions in parallel with " +"the \"production code\", since this makes it easy to find bugs and even " +"design flaws earlier." +msgstr "" +"一旦你的程序已经组织为一个函数和类行为的有完整集合,你就应该编写测试函数来检测这些行为。可以将自动执行一系列测试的测试集关联到每个模块。 " +"这听起来似乎需要大量的工作,但是由于 Python 是如此简洁灵活因此它会极其容易。 " +"你可以通过与“生产代码”同步编写测试函数使编程更为愉快和有趣,因为这将更容易并更早发现代码问题甚至设计缺陷。" + +#: ../../faq/library.rst:167 +msgid "" +"\"Support modules\" that are not intended to be the main module of a program" +" may include a self-test of the module. ::" +msgstr "程序主模块之外的其他“辅助模块”中可以增加自测试的入口。" + +#: ../../faq/library.rst:170 +msgid "" +"if __name__ == \"__main__\":\n" +" self_test()" +msgstr "" +"if __name__ == \"__main__\":\n" +" self_test()" + +#: ../../faq/library.rst:173 +msgid "" +"Even programs that interact with complex external interfaces may be tested " +"when the external interfaces are unavailable by using \"fake\" interfaces " +"implemented in Python." +msgstr "通过使用 Python 实现的“假”接口,即使是需要与复杂的外部接口交互的程序也可以在外部接口不可用时进行测试。" + +#: ../../faq/library.rst:179 +msgid "How do I create documentation from doc strings?" +msgstr "怎样用 docstring 创建文档?" + +#: ../../faq/library.rst:181 +msgid "" +"The :mod:`pydoc` module can create HTML from the doc strings in your Python " +"source code. An alternative for creating API documentation purely from " +"docstrings is `epydoc `_. `Sphinx " +"`_ can also include docstring content." +msgstr "" +":mod:`pydoc` 模块可以用你的 Python 源代码中的文档字符串来创建 HTML。纯粹通过文档字符串来创建 API 文档的一种替代方案是 " +"`epydoc `_. `Sphinx `_ 也可以包括文档字符串的内容。" + +#: ../../faq/library.rst:188 +msgid "How do I get a single keypress at a time?" +msgstr "怎样一次只获取一个按键?" + +#: ../../faq/library.rst:190 +msgid "" +"For Unix variants there are several solutions. It's straightforward to do " +"this using curses, but curses is a fairly large module to learn." +msgstr "在类 Unix 系统中有多种方案。最直接的方法是使用 curses,但是 curses 模块太大了,难以学习。" + +#: ../../faq/library.rst:234 +msgid "Threads" +msgstr "线程相关" + +#: ../../faq/library.rst:237 +msgid "How do I program using threads?" +msgstr "程序中怎样使用线程?" + +#: ../../faq/library.rst:239 +msgid "" +"Be sure to use the :mod:`threading` module and not the :mod:`_thread` " +"module. The :mod:`threading` module builds convenient abstractions on top of" +" the low-level primitives provided by the :mod:`_thread` module." +msgstr "" +"一定要使用 :mod:`threading` 模块,不要使用 :mod:`_thread` 模块。:mod:`threading` 模块对 " +":mod:`_thread` 模块提供的底层线程原语做了更易用的抽象。" + +#: ../../faq/library.rst:245 +msgid "None of my threads seem to run: why?" +msgstr "我的线程都没有运行,为什么?" + +#: ../../faq/library.rst:247 +msgid "" +"As soon as the main thread exits, all threads are killed. Your main thread " +"is running too quickly, giving the threads no time to do any work." +msgstr "一旦主线程退出,所有的子线程都会被杀掉。你的主线程运行得太快了,子线程还没来得及工作。" + +#: ../../faq/library.rst:250 +msgid "" +"A simple fix is to add a sleep to the end of the program that's long enough " +"for all the threads to finish::" +msgstr "简单的解决方法是在程序中加一个时间足够长的 sleep,让子线程能够完成运行。" + +#: ../../faq/library.rst:253 +msgid "" +"import threading, time\n" +"\n" +"def thread_task(name, n):\n" +" for i in range(n):\n" +" print(name, i)\n" +"\n" +"for i in range(10):\n" +" T = threading.Thread(target=thread_task, args=(str(i), i))\n" +" T.start()\n" +"\n" +"time.sleep(10) # <---------------------------!" +msgstr "" +"import threading, time\n" +"\n" +"def thread_task(name, n):\n" +" for i in range(n):\n" +" print(name, i)\n" +"\n" +"for i in range(10):\n" +" T = threading.Thread(target=thread_task, args=(str(i), i))\n" +" T.start()\n" +"\n" +"time.sleep(10) # <---------------------------!" + +#: ../../faq/library.rst:265 +msgid "" +"But now (on many platforms) the threads don't run in parallel, but appear to" +" run sequentially, one at a time! The reason is that the OS thread " +"scheduler doesn't start a new thread until the previous thread is blocked." +msgstr "但目前(在许多平台上)线程不是并行运行的,而是按顺序依次执行!原因是系统线程调度器在前一个线程阻塞之前不会启动新线程。" + +#: ../../faq/library.rst:269 +msgid "A simple fix is to add a tiny sleep to the start of the run function::" +msgstr "简单的解决方法是在运行函数的开始处加一个时间很短的 sleep。" + +#: ../../faq/library.rst:271 +msgid "" +"def thread_task(name, n):\n" +" time.sleep(0.001) # <--------------------!\n" +" for i in range(n):\n" +" print(name, i)\n" +"\n" +"for i in range(10):\n" +" T = threading.Thread(target=thread_task, args=(str(i), i))\n" +" T.start()\n" +"\n" +"time.sleep(10)" +msgstr "" +"def thread_task(name, n):\n" +" time.sleep(0.001) # <--------------------!\n" +" for i in range(n):\n" +" print(name, i)\n" +"\n" +"for i in range(10):\n" +" T = threading.Thread(target=thread_task, args=(str(i), i))\n" +" T.start()\n" +"\n" +"time.sleep(10)" + +#: ../../faq/library.rst:282 +msgid "" +"Instead of trying to guess a good delay value for :func:`time.sleep`, it's " +"better to use some kind of semaphore mechanism. One idea is to use the " +":mod:`queue` module to create a queue object, let each thread append a token" +" to the queue when it finishes, and let the main thread read as many tokens " +"from the queue as there are threads." +msgstr "" +"比起用 :func:`time.sleep` 猜一个合适的等待时间,使用信号量机制会更好些。有一个办法是使用 :mod:`queue` 模块创建一个 " +"queue 对象,让每一个线程在运行结束时 append 一个令牌到 queue 对象中,主线程中从 queue " +"对象中读取与线程数量一致的令牌数量即可。" + +#: ../../faq/library.rst:290 +msgid "How do I parcel out work among a bunch of worker threads?" +msgstr "如何将任务分配给多个工作线程?" + +#: ../../faq/library.rst:292 +msgid "" +"The easiest way is to use the :mod:`concurrent.futures` module, especially " +"the :mod:`~concurrent.futures.ThreadPoolExecutor` class." +msgstr "" +"最简单的方式是使用 :mod:`concurrent.futures` 模块,特别是其中的 " +":mod:`~concurrent.futures.ThreadPoolExecutor` 类。" + +#: ../../faq/library.rst:295 +msgid "" +"Or, if you want fine control over the dispatching algorithm, you can write " +"your own logic manually. Use the :mod:`queue` module to create a queue " +"containing a list of jobs. The :class:`~queue.Queue` class maintains a list" +" of objects and has a ``.put(obj)`` method that adds items to the queue and " +"a ``.get()`` method to return them. The class will take care of the locking" +" necessary to ensure that each job is handed out exactly once." +msgstr "" +"或者,如果你想更好地控制分发算法,你也可以自己写逻辑实现。使用 :mod:`queue` " +"模块来创建任务列表队列。:class:`~queue.Queue` 类维护一个存有对象的列表,提供了 ``.put(obj)`` " +"方法添加元素,并且可以用 ``.get()`` 方法获取元素。这个类会使用必要的加锁操作,以此确保每个任务只会执行一次。" + +#: ../../faq/library.rst:302 +msgid "Here's a trivial example::" +msgstr "这是一个简单的例子:" + +#: ../../faq/library.rst:304 +msgid "" +"import threading, queue, time\n" +"\n" +"# The worker thread gets jobs off the queue. When the queue is empty, it\n" +"# assumes there will be no more work and exits.\n" +"# (Realistically workers will run until terminated.)\n" +"def worker():\n" +" print('Running worker')\n" +" time.sleep(0.1)\n" +" while True:\n" +" try:\n" +" arg = q.get(block=False)\n" +" except queue.Empty:\n" +" print('Worker', threading.current_thread(), end=' ')\n" +" print('queue empty')\n" +" break\n" +" else:\n" +" print('Worker', threading.current_thread(), end=' ')\n" +" print('running with argument', arg)\n" +" time.sleep(0.5)\n" +"\n" +"# Create queue\n" +"q = queue.Queue()\n" +"\n" +"# Start a pool of 5 workers\n" +"for i in range(5):\n" +" t = threading.Thread(target=worker, name='worker %i' % (i+1))\n" +" t.start()\n" +"\n" +"# Begin adding work to the queue\n" +"for i in range(50):\n" +" q.put(i)\n" +"\n" +"# Give threads time to run\n" +"print('Main thread sleeping')\n" +"time.sleep(5)" +msgstr "" +"import threading, queue, time\n" +"\n" +"# 工作线程会将任务移出队列。当队列为空时,\n" +"# 它将认为工作已完成并退出。\n" +"# (在真实场景下工作线程将持续运行直到被终结。)\n" +"def worker():\n" +" print('Running worker')\n" +" time.sleep(0.1)\n" +" while True:\n" +" try:\n" +" arg = q.get(block=False)\n" +" except queue.Empty:\n" +" print('Worker', threading.current_thread(), end=' ')\n" +" print('queue empty')\n" +" break\n" +" else:\n" +" print('Worker', threading.current_thread(), end=' ')\n" +" print('running with argument', arg)\n" +" time.sleep(0.5)\n" +"\n" +"# 创建队列\n" +"q = queue.Queue()\n" +"\n" +"# 启动包含 5 个工作线程的线程池\n" +"for i in range(5):\n" +" t = threading.Thread(target=worker, name='worker %i' % (i+1))\n" +" t.start()\n" +"\n" +"# 开始向队列添加任务\n" +"for i in range(50):\n" +" q.put(i)\n" +"\n" +"# 为线程留出运行的时间\n" +"print('Main thread sleeping')\n" +"time.sleep(5)" + +#: ../../faq/library.rst:340 +msgid "When run, this will produce the following output:" +msgstr "运行时会产生如下输出:" + +#: ../../faq/library.rst:342 +msgid "" +"Running worker\n" +"Running worker\n" +"Running worker\n" +"Running worker\n" +"Running worker\n" +"Main thread sleeping\n" +"Worker running with argument 0\n" +"Worker running with argument 1\n" +"Worker running with argument 2\n" +"Worker running with argument 3\n" +"Worker running with argument 4\n" +"Worker running with argument 5\n" +"..." +msgstr "" +"Running worker\n" +"Running worker\n" +"Running worker\n" +"Running worker\n" +"Running worker\n" +"Main thread sleeping\n" +"Worker running with argument 0\n" +"Worker running with argument 1\n" +"Worker running with argument 2\n" +"Worker running with argument 3\n" +"Worker running with argument 4\n" +"Worker running with argument 5\n" +"..." + +#: ../../faq/library.rst:358 +msgid "" +"Consult the module's documentation for more details; the " +":class:`~queue.Queue` class provides a featureful interface." +msgstr "查看模块的文档以获取更多信息;:class:`~queue.Queue` 类提供了多种接口。" + +#: ../../faq/library.rst:363 +msgid "What kinds of global value mutation are thread-safe?" +msgstr "怎样修改全局变量是线程安全的?" + +#: ../../faq/library.rst:365 +msgid "" +"A :term:`global interpreter lock` (GIL) is used internally to ensure that " +"only one thread runs in the Python VM at a time. In general, Python offers " +"to switch among threads only between bytecode instructions; how frequently " +"it switches can be set via :func:`sys.setswitchinterval`. Each bytecode " +"instruction and therefore all the C implementation code reached from each " +"instruction is therefore atomic from the point of view of a Python program." +msgstr "" +"Python VM 内部会使用 :term:`global interpreter lock` (GIL) 来确保同一时间只有一个线程运行。通常 " +"Python 只会在字节码指令之间切换线程;切换的频率可以通过设置 :func:`sys.setswitchinterval` 指定。从 Python " +"程序的角度来看,每一条字节码指令以及每一条指令对应的 C 代码实现都是原子的。" + +#: ../../faq/library.rst:372 +msgid "" +"In theory, this means an exact accounting requires an exact understanding of" +" the PVM bytecode implementation. In practice, it means that operations on " +"shared variables of built-in data types (ints, lists, dicts, etc) that " +"\"look atomic\" really are." +msgstr "" +"理论上说,具体的结果要看具体的 PVM 字节码实现对指令的解释。而实际上,对内建类型(int,list,dict " +"等)的共享变量的“类原子”操作都是原子的。" + +#: ../../faq/library.rst:377 +msgid "" +"For example, the following operations are all atomic (L, L1, L2 are lists, " +"D, D1, D2 are dicts, x, y are objects, i, j are ints)::" +msgstr "举例来说,下面的操作是原子的(L、L1、L2 是列表,D、D1、D2 是字典,x、y 是对象,i,j 是 int 变量):" + +#: ../../faq/library.rst:380 +msgid "" +"L.append(x)\n" +"L1.extend(L2)\n" +"x = L[i]\n" +"x = L.pop()\n" +"L1[i:j] = L2\n" +"L.sort()\n" +"x = y\n" +"x.field = y\n" +"D[x] = y\n" +"D1.update(D2)\n" +"D.keys()" +msgstr "" +"L.append(x)\n" +"L1.extend(L2)\n" +"x = L[i]\n" +"x = L.pop()\n" +"L1[i:j] = L2\n" +"L.sort()\n" +"x = y\n" +"x.field = y\n" +"D[x] = y\n" +"D1.update(D2)\n" +"D.keys()" + +#: ../../faq/library.rst:392 +msgid "These aren't::" +msgstr "这些不是原子的:" + +#: ../../faq/library.rst:394 +msgid "" +"i = i+1\n" +"L.append(L[-1])\n" +"L[i] = L[j]\n" +"D[x] = D[x] + 1" +msgstr "" +"i = i+1\n" +"L.append(L[-1])\n" +"L[i] = L[j]\n" +"D[x] = D[x] + 1" + +#: ../../faq/library.rst:399 +msgid "" +"Operations that replace other objects may invoke those other objects' " +":meth:`~object.__del__` method when their reference count reaches zero, and " +"that can affect things. This is especially true for the mass updates to " +"dictionaries and lists. When in doubt, use a mutex!" +msgstr "" +"替换其他对象的操作可能会在其他对象的引用计数变为零时唤起这些对象的 :meth:`~object.__del__` 方法,这可能会产生一些影响。 " +"对字典和列表进行大量更新尤其如此。如有疑问,请使用互斥锁!" + +#: ../../faq/library.rst:406 +msgid "Can't we get rid of the Global Interpreter Lock?" +msgstr "不能删除全局解释器锁吗?" + +#: ../../faq/library.rst:408 +msgid "" +"The :term:`global interpreter lock` (GIL) is often seen as a hindrance to " +"Python's deployment on high-end multiprocessor server machines, because a " +"multi-threaded Python program effectively only uses one CPU, due to the " +"insistence that (almost) all Python code can only run while the GIL is held." +msgstr "" +":term:`global interpreter lock` (GIL) 通常被视为 Python 在高端多核服务器上开发时的阻力,因为(几乎)所有 " +"Python 代码只有在获取到 GIL 时才能运行,所以多线程的 Python 程序只能有效地使用一个 CPU。" + +#: ../../faq/library.rst:413 +msgid "" +"With the approval of :pep:`703` work is now underway to remove the GIL from " +"the CPython implementation of Python. Initially it will be implemented as " +"an optional compiler flag when building the interpreter, and so separate " +"builds will be available with and without the GIL. Long-term, the hope is " +"to settle on a single build, once the performance implications of removing " +"the GIL are fully understood. Python 3.13 is likely to be the first release" +" containing this work, although it may not be completely functional in this " +"release." +msgstr "" +"在 :pep:`703` 通过后目前已着手从 Python 的 CPython 实现中移除 GIL。 " +"最初它将作为构建解释器时的可选编译器旗标来实现,因此将会存在有 GIL 和没有 GIL 的构建版本。从长远来看,目标是在移除 GIL " +"对性能的影响被完全了解之后确定唯一的构建版本。Python 3.13 大概是第一个包含此项工作的发布版,尽管在这个发布版中该功能可能尚不完整。" + +#: ../../faq/library.rst:422 +msgid "" +"The current work to remove the GIL is based on a `fork of Python 3.9 with " +"the GIL removed `_ by Sam Gross. Prior " +"to that, in the days of Python 1.5, Greg Stein actually implemented a " +"comprehensive patch set (the \"free threading\" patches) that removed the " +"GIL and replaced it with fine-grained locking. Adam Olsen did a similar " +"experiment in his `python-safethread " +"`_ project. " +"Unfortunately, both of these earlier experiments exhibited a sharp drop in " +"single-thread performance (at least 30% slower), due to the amount of fine-" +"grained locking necessary to compensate for the removal of the GIL. The " +"Python 3.9 fork is the first attempt at removing the GIL with an acceptable " +"performance impact." +msgstr "" +"当前移除 GIL 的工作是基于 Sam Gross 的 `移除了 GIL 的 Python 3.9 分叉 " +"`_。更早的时候,在 Python 1.5 时期,Greg Stein " +"实际上实现了一个完整的补丁集(“自由线程”补丁),移除了 GIL 并用更细粒度的锁来代替。Adam Olsen 也在他的 `python-" +"safethread `_ " +"项目里做了类似的实验。不幸的是,由于为移除 GIL 而使用了大量细粒度的锁这两个早期实验在单线程中的性能都有明显的下降(至少慢 30%)。 Python" +" 3.9 分叉是在移除 GIL 的同时保持可接受的性能影响的首次尝试。" + +#: ../../faq/library.rst:437 +msgid "" +"The presence of the GIL in current Python releases doesn't mean that you " +"can't make good use of Python on multi-CPU machines! You just have to be " +"creative with dividing the work up between multiple *processes* rather than " +"multiple *threads*. The :class:`~concurrent.futures.ProcessPoolExecutor` " +"class in the new :mod:`concurrent.futures` module provides an easy way of " +"doing so; the :mod:`multiprocessing` module provides a lower-level API in " +"case you want more control over dispatching of tasks." +msgstr "" +"当前 Python 发布版存在 GIL 并不意味着你无法在多 CPU 机器上很好地使用 Python!你仅需发挥创造性将任务在多个 *进程* 而不是多个" +" *线程* 之间进行分配。新的 :mod:`concurrent.futures` 模块中的 " +":class:`~concurrent.futures.ProcessPoolExecutor` " +"类提供了完成此项工作的简单方式;如果你想要对任务分发有更强的控制那么 :mod:`multiprocessing` 模块提供了更低层级的 API。" + +#: ../../faq/library.rst:446 +msgid "" +"Judicious use of C extensions will also help; if you use a C extension to " +"perform a time-consuming task, the extension can release the GIL while the " +"thread of execution is in the C code and allow other threads to get some " +"work done. Some standard library modules such as :mod:`zlib` and " +":mod:`hashlib` already do this." +msgstr "" +"恰当地使用 C 扩展也很有用;使用 C 扩展处理耗时较久的任务时,扩展可以在线程执行 C 代码时释放 GIL,让其他线程执行。:mod:`zlib` 和" +" :mod:`hashlib` 等标准库模块已经这样做了。" + +#: ../../faq/library.rst:452 +msgid "" +"An alternative approach to reducing the impact of the GIL is to make the GIL" +" a per-interpreter-state lock rather than truly global. This was :ref:`first" +" implemented in Python 3.12 ` and is available in the C " +"API. A Python interface to it is expected in Python 3.13. The main " +"limitation to it at the moment is likely to be 3rd party extension modules, " +"since these must be written with multiple interpreters in mind in order to " +"be usable, so many older extension modules will not be usable." +msgstr "" +"减小 GIL 的影响的一种替代方式是让 GIL 成为每解释器状态锁而不是真正的全局状态锁。此特性 :ref:`在 Python 3.12 中首次实现 " +"` 并在 C API 中可用。预期会在 Python 3.13 中提供它的 Python 接口。 " +"目前它的主要限制在于第三方扩展模块,因为这些模块的编写必须考虑到多解释器的情况才能够被使用,这样大量较旧的扩展模块将不再可用。" + +#: ../../faq/library.rst:462 +msgid "Input and Output" +msgstr "输入与输出" + +#: ../../faq/library.rst:465 +msgid "How do I delete a file? (And other file questions...)" +msgstr "怎样删除文件?(以及其他文件相关的问题……)" + +#: ../../faq/library.rst:467 +msgid "" +"Use ``os.remove(filename)`` or ``os.unlink(filename)``; for documentation, " +"see the :mod:`os` module. The two functions are identical; " +":func:`~os.unlink` is simply the name of the Unix system call for this " +"function." +msgstr "" +"使用 ``os.remove(filename)`` 或 ``os.unlink(filename)``。查看 :mod:`os` " +"模块以获取更多文档。这两个函数是一样的,:func:`~os.unlink` 是这个函数在 Unix 系统调用中的名字。" + +#: ../../faq/library.rst:471 +msgid "" +"To remove a directory, use :func:`os.rmdir`; use :func:`os.mkdir` to create " +"one. ``os.makedirs(path)`` will create any intermediate directories in " +"``path`` that don't exist. ``os.removedirs(path)`` will remove intermediate " +"directories as long as they're empty; if you want to delete an entire " +"directory tree and its contents, use :func:`shutil.rmtree`." +msgstr "" +"如果要删除目录,应该使用 :func:`os.rmdir`;使用 :func:`os.mkdir` 创建目录。``os.makedirs(path)``" +" 会创建 ``path`` 中任何不存在的目录。``os.removedirs(path)`` " +"则会删除其中的目录,只要它们都是空的;如果你想删除整个目录以及其中的内容,可以使用 :func:`shutil.rmtree`。" + +#: ../../faq/library.rst:477 +msgid "To rename a file, use ``os.rename(old_path, new_path)``." +msgstr "重命名文件可以使用 ``os.rename(old_path, new_path)``。" + +#: ../../faq/library.rst:479 +msgid "" +"To truncate a file, open it using ``f = open(filename, \"rb+\")``, and use " +"``f.truncate(offset)``; offset defaults to the current seek position. " +"There's also ``os.ftruncate(fd, offset)`` for files opened with " +":func:`os.open`, where *fd* is the file descriptor (a small integer)." +msgstr "" +"如果需要截断文件,使用 ``f = open(filename, \"rb+\")`` 打开文件,然后使用 " +"``f.truncate(offset)``;offset 默认是当前的搜索位置。也可以对使用 :func:`os.open` 打开的文件使用 " +"``os.ftruncate(fd, offset)``,其中 *fd* 是文件描述符(一个小的整型数)。" + +#: ../../faq/library.rst:484 +msgid "" +"The :mod:`shutil` module also contains a number of functions to work on " +"files including :func:`~shutil.copyfile`, :func:`~shutil.copytree`, and " +":func:`~shutil.rmtree`." +msgstr "" +":mod:`shutil` 模块也包含了一些处理文件的函数,包括 " +":func:`~shutil.copyfile`,:func:`~shutil.copytree` 和 :func:`~shutil.rmtree`。" + +#: ../../faq/library.rst:490 +msgid "How do I copy a file?" +msgstr "怎样复制文件?" + +#: ../../faq/library.rst:492 +msgid "" +"The :mod:`shutil` module contains a :func:`~shutil.copyfile` function. Note " +"that on Windows NTFS volumes, it does not copy `alternate data streams " +"`_ nor " +"`resource forks `__ on macOS " +"HFS+ volumes, though both are now rarely used. It also doesn't copy file " +"permissions and metadata, though using :func:`shutil.copy2` instead will " +"preserve most (though not all) of it." +msgstr "" +":mod:`shutil` 模块包含一个 :func:`~shutil.copyfile` 函数。注意,在 Windows NTFS 卷上,它不复制 " +"`替代数据流 `_ " +",也不复制 macOS HFS+ 卷上的 `资源分叉 `__ " +",尽管这两者现在很少使用。它也不复制文件权限和元数据,尽管使用 :func:`shutil.copy2` 可以保留大部分(但不是全部)的内容。" + +#: ../../faq/library.rst:503 +msgid "How do I read (or write) binary data?" +msgstr "怎样读取(或写入)二进制数据?" + +#: ../../faq/library.rst:505 +msgid "" +"To read or write complex binary data formats, it's best to use the " +":mod:`struct` module. It allows you to take a string containing binary data" +" (usually numbers) and convert it to Python objects; and vice versa." +msgstr "" +"要读写复杂的二进制数据格式,最好使用 :mod:`struct` 模块。该模块可以读取包含二进制数据(通常是数字)的字符串并转换为 Python " +"对象,反之亦然。" + +#: ../../faq/library.rst:509 +msgid "" +"For example, the following code reads two 2-byte integers and one 4-byte " +"integer in big-endian format from a file::" +msgstr "举例来说,下面的代码会从文件中以大端序格式读取两个 2 字节的整型和一个 4 字节的整型:" + +#: ../../faq/library.rst:512 +msgid "" +"import struct\n" +"\n" +"with open(filename, \"rb\") as f:\n" +" s = f.read(8)\n" +" x, y, z = struct.unpack(\">hhl\", s)" +msgstr "" +"import struct\n" +"\n" +"with open(filename, \"rb\") as f:\n" +" s = f.read(8)\n" +" x, y, z = struct.unpack(\">hhl\", s)" + +#: ../../faq/library.rst:518 +msgid "" +"The '>' in the format string forces big-endian data; the letter 'h' reads " +"one \"short integer\" (2 bytes), and 'l' reads one \"long integer\" (4 " +"bytes) from the string." +msgstr "格式字符串中的‘>’强制以大端序读取数据;字母‘h’从字符串中读取一个“短整型”(2 字节),字母‘l’读取一个“长整型”(4 字节)。" + +#: ../../faq/library.rst:522 +msgid "" +"For data that is more regular (e.g. a homogeneous list of ints or floats), " +"you can also use the :mod:`array` module." +msgstr "对于更常规的数据(例如整型或浮点类型的列表),你也可以使用 :mod:`array` 模块。" + +#: ../../faq/library.rst:527 +msgid "" +"To read and write binary data, it is mandatory to open the file in binary " +"mode (here, passing ``\"rb\"`` to :func:`open`). If you use ``\"r\"`` " +"instead (the default), the file will be open in text mode and ``f.read()`` " +"will return :class:`str` objects rather than :class:`bytes` objects." +msgstr "" +"要读写二进制数据的话,需要强制以二进制模式打开文件 (这里为 :func:`open` 函数传入 ``\"rb\"``)。 如果(默认)传入 " +"``\"r\"`` 的话,文件会以文本模式打开,``f.read()`` 会返回 :class:`str` 对象,而不是 :class:`bytes` " +"对象。" + +#: ../../faq/library.rst:535 +msgid "I can't seem to use os.read() on a pipe created with os.popen(); why?" +msgstr "似乎 os.popen() 创建的管道不能使用 os.read(),这是为什么?" + +#: ../../faq/library.rst:537 +msgid "" +":func:`os.read` is a low-level function which takes a file descriptor, a " +"small integer representing the opened file. :func:`os.popen` creates a " +"high-level file object, the same type returned by the built-in :func:`open` " +"function. Thus, to read *n* bytes from a pipe *p* created with " +":func:`os.popen`, you need to use ``p.read(n)``." +msgstr "" +":func:`os.read` 是一个底层函数,它接收的是文件描述符 —— 用小整型数表示的打开的文件。:func:`os.popen` " +"创建的是一个高级文件对象,和内建的 :func:`open` 方法返回的类型一样。因此,如果要从 :func:`os.popen` 创建的管道 *p* " +"中读取 *n* 个字节的话,你应该使用 ``p.read(n)``。" + +#: ../../faq/library.rst:545 +msgid "How do I access the serial (RS232) port?" +msgstr "怎样访问(RS232)串口?" + +#: ../../faq/library.rst:547 +msgid "For Win32, OSX, Linux, BSD, Jython, IronPython:" +msgstr "对于 Win32, OSX, Linux, BSD, Jython, IronPython:" + +#: ../../faq/library.rst:549 +msgid ":pypi:`pyserial`" +msgstr ":pypi:`pyserial`" + +#: ../../faq/library.rst:551 +msgid "For Unix, see a Usenet post by Mitch Chapman:" +msgstr "对于 Unix,查看 Mitch Chapman 发布的帖子:" + +#: ../../faq/library.rst:553 +msgid "https://groups.google.com/groups?selm=34A04430.CF9@ohioee.com" +msgstr "https://groups.google.com/groups?selm=34A04430.CF9@ohioee.com" + +#: ../../faq/library.rst:557 +msgid "Why doesn't closing sys.stdout (stdin, stderr) really close it?" +msgstr "为什么关闭 sys.stdout(stdin,stderr)并不会真正关掉它?" + +#: ../../faq/library.rst:559 +msgid "" +"Python :term:`file objects ` are a high-level layer of " +"abstraction on low-level C file descriptors." +msgstr "Python :term:`文件对象 ` 是一个对底层 C 文件描述符的高层抽象。" + +#: ../../faq/library.rst:562 +msgid "" +"For most file objects you create in Python via the built-in :func:`open` " +"function, ``f.close()`` marks the Python file object as being closed from " +"Python's point of view, and also arranges to close the underlying C file " +"descriptor. This also happens automatically in ``f``'s destructor, when " +"``f`` becomes garbage." +msgstr "" +"对于在 Python 中通过内建的 :func:`open` 函数创建的多数文件对象来说,``f.close()`` 从 Python " +"的角度将其标记为已关闭,并且会关闭底层的 C 文件描述符。在 ``f`` 被垃圾回收的时候,析构函数中也会自动处理。" + +#: ../../faq/library.rst:568 +msgid "" +"But stdin, stdout and stderr are treated specially by Python, because of the" +" special status also given to them by C. Running ``sys.stdout.close()`` " +"marks the Python-level file object as being closed, but does *not* close the" +" associated C file descriptor." +msgstr "" +"但由于 stdin,stdout 和 stderr 在 C 中的特殊地位,在 Python 中也会对它们做特殊处理。运行 " +"``sys.stdout.close()`` 会将 Python 的文件对象标记为已关闭,但是 *不会* 关闭与之关联的文件描述符。" + +#: ../../faq/library.rst:573 +msgid "" +"To close the underlying C file descriptor for one of these three, you should" +" first be sure that's what you really want to do (e.g., you may confuse " +"extension modules trying to do I/O). If it is, use :func:`os.close`::" +msgstr "" +"要关闭这三者的 C 文件描述符的话,首先你应该确认确实需要关闭它(比如,这可能会影响到处理 I/O 的扩展)。如果确实需要这么做的话,使用 " +":func:`os.close`:" + +#: ../../faq/library.rst:577 +msgid "" +"os.close(stdin.fileno())\n" +"os.close(stdout.fileno())\n" +"os.close(stderr.fileno())" +msgstr "" +"os.close(stdin.fileno())\n" +"os.close(stdout.fileno())\n" +"os.close(stderr.fileno())" + +#: ../../faq/library.rst:581 +msgid "Or you can use the numeric constants 0, 1 and 2, respectively." +msgstr "或者也可以使用常量 0,1,2 代替。" + +#: ../../faq/library.rst:585 +msgid "Network/Internet Programming" +msgstr "网络 / Internet 编程" + +#: ../../faq/library.rst:588 +msgid "What WWW tools are there for Python?" +msgstr "Python 中的 WWW 工具是什么?" + +#: ../../faq/library.rst:590 +msgid "" +"See the chapters titled :ref:`internet` and :ref:`netdata` in the Library " +"Reference Manual. Python has many modules that will help you build server-" +"side and client-side web systems." +msgstr "" +"参阅标准库参考手册中 :ref:`internet` 和 :ref:`netdata` 这两章的内容。Python 有大量模块来帮助你构建服务端和客户端" +" web 系统。" + +#: ../../faq/library.rst:596 +msgid "" +"A summary of available frameworks is maintained by Paul Boddie at " +"https://wiki.python.org/moin/WebProgramming\\ ." +msgstr "" +"Paul Boddie 维护了一份可用框架的概览,见 https://wiki.python.org/moin/WebProgramming。" + +#: ../../faq/library.rst:601 +msgid "What module should I use to help with generating HTML?" +msgstr "生成 HTML 需要使用什么模块?" + +#: ../../faq/library.rst:605 +msgid "" +"You can find a collection of useful links on the `Web Programming wiki page " +"`_." +msgstr "" +"你可以在 `Web 编程 wiki 页面 `_ " +"找到许多有用的链接。" + +#: ../../faq/library.rst:610 +msgid "How do I send mail from a Python script?" +msgstr "怎样使用 Python 脚本发送邮件?" + +#: ../../faq/library.rst:612 +msgid "Use the standard library module :mod:`smtplib`." +msgstr "使用 :mod:`smtplib` 标准库模块。" + +#: ../../faq/library.rst:614 +msgid "" +"Here's a very simple interactive mail sender that uses it. This method will" +" work on any host that supports an SMTP listener. ::" +msgstr "下面是一个很简单的交互式发送邮件的代码。这个方法适用于任何支持 SMTP 协议的主机。" + +#: ../../faq/library.rst:617 +msgid "" +"import sys, smtplib\n" +"\n" +"fromaddr = input(\"From: \")\n" +"toaddrs = input(\"To: \").split(',')\n" +"print(\"Enter message, end with ^D:\")\n" +"msg = ''\n" +"while True:\n" +" line = sys.stdin.readline()\n" +" if not line:\n" +" break\n" +" msg += line\n" +"\n" +"# The actual mail send\n" +"server = smtplib.SMTP('localhost')\n" +"server.sendmail(fromaddr, toaddrs, msg)\n" +"server.quit()" +msgstr "" +"import sys, smtplib\n" +"\n" +"fromaddr = input(\"From: \")\n" +"toaddrs = input(\"To: \").split(',')\n" +"print(\"Enter message, end with ^D:\")\n" +"msg = ''\n" +"while True:\n" +" line = sys.stdin.readline()\n" +" if not line:\n" +" break\n" +" msg += line\n" +"\n" +"# 实际发送的邮件\n" +"server = smtplib.SMTP('localhost')\n" +"server.sendmail(fromaddr, toaddrs, msg)\n" +"server.quit()" + +#: ../../faq/library.rst:634 +msgid "" +"A Unix-only alternative uses sendmail. The location of the sendmail program" +" varies between systems; sometimes it is ``/usr/lib/sendmail``, sometimes " +"``/usr/sbin/sendmail``. The sendmail manual page will help you out. Here's" +" some sample code::" +msgstr "" +"在 Unix 系统中还可以使用 sendmail。sendmail 程序的位置在不同系统中不一样,有时是在 " +"``/usr/lib/sendmail``,有时是在 ``/usr/sbin/sendmail``。sendmail " +"手册页面会对你有所帮助。以下是示例代码:" + +#: ../../faq/library.rst:639 +msgid "" +"import os\n" +"\n" +"SENDMAIL = \"/usr/sbin/sendmail\" # sendmail location\n" +"p = os.popen(\"%s -t -i\" % SENDMAIL, \"w\")\n" +"p.write(\"To: receiver@example.com\\n\")\n" +"p.write(\"Subject: test\\n\")\n" +"p.write(\"\\n\") # blank line separating headers from body\n" +"p.write(\"Some text\\n\")\n" +"p.write(\"some more text\\n\")\n" +"sts = p.close()\n" +"if sts != 0:\n" +" print(\"Sendmail exit status\", sts)" +msgstr "" +"import os\n" +"\n" +"SENDMAIL = \"/usr/sbin/sendmail\" # sendmail 的位置\n" +"p = os.popen(\"%s -t -i\" % SENDMAIL, \"w\")\n" +"p.write(\"To: receiver@example.com\\n\")\n" +"p.write(\"Subject: test\\n\")\n" +"p.write(\"\\n\") # 分隔标头和消息体的空白行\n" +"p.write(\"Some text\\n\")\n" +"p.write(\"some more text\\n\")\n" +"sts = p.close()\n" +"if sts != 0:\n" +" print(\"Sendmail exit status\", sts)" + +#: ../../faq/library.rst:654 +msgid "How do I avoid blocking in the connect() method of a socket?" +msgstr "socket 的 connect() 方法怎样避免阻塞?" + +#: ../../faq/library.rst:656 +msgid "" +"The :mod:`select` module is commonly used to help with asynchronous I/O on " +"sockets." +msgstr "通常会用 :mod:`select` 模块处理 socket 异步 I/O。" + +#: ../../faq/library.rst:659 +msgid "" +"To prevent the TCP connect from blocking, you can set the socket to non-" +"blocking mode. Then when you do the :meth:`~socket.socket.connect`, you " +"will either connect immediately (unlikely) or get an exception that contains" +" the error number as ``.errno``. ``errno.EINPROGRESS`` indicates that the " +"connection is in progress, but hasn't finished yet. Different OSes will " +"return different values, so you're going to have to check what's returned on" +" your system." +msgstr "" +"要防止 TCP 连接发生阻塞,你可以将 socket 设为非阻塞模式。这样当你执行 :meth:`~socket.socket.connect` " +"时,你将要么立即完成连接(不大可能)要么得到一个包含错误编号如 ``.errno`` 的异常。``errno.EINPROGRESS`` " +"表示连接正在进行中,但尚未完成。不同的操作系统将返回不同的值,所以你需要检查一下你的系统会返回什么值。" + +#: ../../faq/library.rst:667 +msgid "" +"You can use the :meth:`~socket.socket.connect_ex` method to avoid creating " +"an exception. It will just return the errno value. To poll, you can call " +":meth:`~socket.socket.connect_ex` again later -- ``0`` or ``errno.EISCONN`` " +"indicate that you're connected -- or you can pass this socket to " +":meth:`select.select` to check if it's writable." +msgstr "" +"你可以使用 :meth:`~socket.socket.connect_ex` 方法来避免创建异常。它将只返回 errno 值。 " +"要进行轮询,你可以稍后再次调用 :meth:`~socket.socket.connect_ex` -- ``0`` 或 " +"``errno.EISCONN`` 表示已经连接 -- 或者你也可以将此 socket 传给 :meth:`select.select` " +"来检查它是否可写。" + +#: ../../faq/library.rst:675 +msgid "" +"The :mod:`asyncio` module provides a general purpose single-threaded and " +"concurrent asynchronous library, which can be used for writing non-blocking " +"network code. The third-party `Twisted `_ library is a" +" popular and feature-rich alternative." +msgstr "" +":mod:`asyncio` 模块提供了通用的单线程并发异步库,它可被用来编写非阻塞的网络代码。第三方的 `Twisted " +"`_ 库是一个热门且功能丰富的替代选择。" + +#: ../../faq/library.rst:683 +msgid "Databases" +msgstr "数据库" + +#: ../../faq/library.rst:686 +msgid "Are there any interfaces to database packages in Python?" +msgstr "Python 中有数据库包的接口吗?" + +#: ../../faq/library.rst:688 +msgid "Yes." +msgstr "有的。" + +#: ../../faq/library.rst:690 +msgid "" +"Interfaces to disk-based hashes such as :mod:`DBM ` and :mod:`GDBM" +" ` are also included with standard Python. There is also the " +":mod:`sqlite3` module, which provides a lightweight disk-based relational " +"database." +msgstr "" +"标准 Python 还包含了基于磁盘的哈希接口例如 :mod:`DBM ` 和 :mod:`GDBM ` " +"。除此之外还有 :mod:`sqlite3` 模块,该模块提供了一个轻量级的基于磁盘的关系型数据库。" + +#: ../../faq/library.rst:695 +msgid "" +"Support for most relational databases is available. See the " +"`DatabaseProgramming wiki page " +"`_ for details." +msgstr "" +"大多数关系型数据库都已经支持。查看 `数据库编程 wiki 页面 " +"`_ 获取更多信息。" + +#: ../../faq/library.rst:701 +msgid "How do you implement persistent objects in Python?" +msgstr "在 Python 中如何实现持久化对象?" + +#: ../../faq/library.rst:703 +msgid "" +"The :mod:`pickle` library module solves this in a very general way (though " +"you still can't store things like open files, sockets or windows), and the " +":mod:`shelve` library module uses pickle and (g)dbm to create persistent " +"mappings containing arbitrary Python objects." +msgstr "" +":mod:`pickle` 库模块以一种非常通用的方式解决了这个问题(虽然你依然不能用它保存打开的文件、套接字或窗口之类的东西),此外 " +":mod:`shelve` 库模块可使用 pickle 和 (g)dbm 来创建包含任意 Python 对象的持久化映射。" + +#: ../../faq/library.rst:710 +msgid "Mathematics and Numerics" +msgstr "数学和数字" + +#: ../../faq/library.rst:713 +msgid "How do I generate random numbers in Python?" +msgstr "Python 中怎样生成随机数?" + +#: ../../faq/library.rst:715 +msgid "" +"The standard module :mod:`random` implements a random number generator. " +"Usage is simple::" +msgstr ":mod:`random` 标准库模块实现了随机数生成器,使用起来非常简单:" + +#: ../../faq/library.rst:718 +msgid "" +"import random\n" +"random.random()" +msgstr "" +"import random\n" +"random.random()" + +#: ../../faq/library.rst:721 +msgid "This returns a random floating-point number in the range [0, 1)." +msgstr "这将返回一个 [0, 1) 区间的随机浮点数。" + +#: ../../faq/library.rst:723 +msgid "" +"There are also many other specialized generators in this module, such as:" +msgstr "该模块中还有许多其他的专门的生成器,例如:" + +#: ../../faq/library.rst:725 +msgid "``randrange(a, b)`` chooses an integer in the range [a, b)." +msgstr "``randrange(a, b)`` 返回 [a, b) 区间内的一个整型数。" + +#: ../../faq/library.rst:726 +msgid "``uniform(a, b)`` chooses a floating-point number in the range [a, b)." +msgstr "``uniform(a, b)`` 在 [a, b) 区间选择一个浮点数。" + +#: ../../faq/library.rst:727 +msgid "" +"``normalvariate(mean, sdev)`` samples the normal (Gaussian) distribution." +msgstr "``normalvariate(mean, sdev)`` 使用正态(高斯)分布采样。" + +#: ../../faq/library.rst:729 +msgid "Some higher-level functions operate on sequences directly, such as:" +msgstr "还有一些高级函数直接对序列进行操作,例如:" + +#: ../../faq/library.rst:731 +msgid "``choice(S)`` chooses a random element from a given sequence." +msgstr "``choice(S)`` 从给定的序列中随机选择一个元素。" + +#: ../../faq/library.rst:732 +msgid "``shuffle(L)`` shuffles a list in-place, i.e. permutes it randomly." +msgstr "``shuffle(L)`` 会对列表执行原地重排,即将其随机地打乱。" + +#: ../../faq/library.rst:734 +msgid "" +"There's also a ``Random`` class you can instantiate to create independent " +"multiple random number generators." +msgstr "还有 ``Random`` 类,你可以将其实例化,用来创建多个独立的随机数生成器。" diff --git a/faq/programming.po b/faq/programming.po new file mode 100644 index 0000000000..6ce662f474 --- /dev/null +++ b/faq/programming.po @@ -0,0 +1,4222 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:00+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../faq/programming.rst:5 +msgid "Programming FAQ" +msgstr "编程常见问题" + +#: ../../faq/programming.rst:8 +msgid "Contents" +msgstr "目录" + +#: ../../faq/programming.rst:12 +msgid "General questions" +msgstr "一般问题" + +#: ../../faq/programming.rst:15 +msgid "" +"Is there a source code-level debugger with breakpoints and single-stepping?" +msgstr "是否有带有断点和单步执行等功能的源码级调试器?" + +#: ../../faq/programming.rst:17 ../../faq/programming.rst:56 +msgid "Yes." +msgstr "有的。" + +#: ../../faq/programming.rst:19 +msgid "" +"Several debuggers for Python are described below, and the built-in function " +":func:`breakpoint` allows you to drop into any of them." +msgstr "以下介绍了一些 Python 的调试器,用内置函数 :func:`breakpoint` 即可切入这些调试器中。" + +#: ../../faq/programming.rst:22 +msgid "" +"The pdb module is a simple but adequate console-mode debugger for Python. It" +" is part of the standard Python library, and is :mod:`documented in the " +"Library Reference Manual `. You can also write your own debugger by " +"using the code for pdb as an example." +msgstr "" +"pdb 模块是一个简单但是够用的控制台模式 Python 调试器。它是标准 Python 库的一部分,并且 :mod:`已收录于库参考手册 " +"`。你也可以通过使用 pdb 代码作为样例来编写你自己的调试器。" + +#: ../../faq/programming.rst:27 +msgid "" +"The IDLE interactive development environment, which is part of the standard " +"Python distribution (normally available as :mod:`idlelib`), includes a " +"graphical debugger." +msgstr "IDLE 交互式开发环境(通常对应 :mod:`idlelib` 包)是标准 Python 发行版的组件,其中包括一个图形化的调试器。" + +#: ../../faq/programming.rst:31 +msgid "" +"PythonWin is a Python IDE that includes a GUI debugger based on pdb. The " +"PythonWin debugger colors breakpoints and has quite a few cool features such" +" as debugging non-PythonWin programs. PythonWin is available as part of " +"`pywin32 `_ project and as a part of " +"the `ActivePython `_ " +"distribution." +msgstr "" +"PythonWin 是一种 Python IDE,其中包含了一个基于 pdb 的 GUI 调试器。PythonWin " +"的调试器会为断点着色,并提供了相当多的超酷特性,例如调试非 PythonWin 程序等。PythonWin 是 `pywin32 " +"`_ 项目的组成部分,也是 `ActivePython " +"`_ 发行版的组成部分。" + +#: ../../faq/programming.rst:38 +msgid "" +"`Eric `_ is an IDE built on PyQt and " +"the Scintilla editing component." +msgstr "" +"`Eric `_ 是一个基于 PyQt 和 Scintilla 编辑组件的" +" IDE。" + +#: ../../faq/programming.rst:41 +msgid "" +"`trepan3k `_ is a gdb-like " +"debugger." +msgstr "" +"`trepan3k `_ 是一个类似 gdb 的调试器。" + +#: ../../faq/programming.rst:43 +msgid "" +"`Visual Studio Code `_ is an IDE with " +"debugging tools that integrates with version-control software." +msgstr "" +"`Visual Studio Code `_ 是包含了调试工具的 " +"IDE,并集成了版本控制软件。" + +#: ../../faq/programming.rst:46 +msgid "" +"There are a number of commercial Python IDEs that include graphical " +"debuggers. They include:" +msgstr "有许多商业 Python IDE 都包含了图形化调试器。包括:" + +#: ../../faq/programming.rst:49 +msgid "`Wing IDE `_" +msgstr "`Wing IDE `_" + +#: ../../faq/programming.rst:50 +msgid "`PyCharm `_" +msgstr "`PyCharm `_" + +#: ../../faq/programming.rst:54 +msgid "Are there tools to help find bugs or perform static analysis?" +msgstr "是否有能帮助寻找 bug 或执行静态分析的工具?" + +#: ../../faq/programming.rst:58 +msgid "" +"`Ruff `__, `Pylint " +"`__ and `Pyflakes " +"`__ do basic checking that will help you " +"catch bugs sooner." +msgstr "" +"`Ruff `__, `Pylint " +"`__ 和 `Pyflakes " +"`__ 可执行基本的检测以帮助你尽早捕获程序缺陷。" + +#: ../../faq/programming.rst:63 +msgid "" +"Static type checkers such as `mypy `__, `ty " +"`__, `Pyrefly `__, and " +"`pytype `__ can check type hints in Python" +" source code." +msgstr "" +"静态类型检查器像是 `mypy `__, `ty " +"`__, `Pyrefly `__ 和 " +"`pytype `__ 可以检查 Python 源代码中的类型提示。" + +#: ../../faq/programming.rst:73 +msgid "How can I create a stand-alone binary from a Python script?" +msgstr "如何由 Python 脚本创建能独立运行的二进制程序?" + +#: ../../faq/programming.rst:75 +msgid "" +"You don't need the ability to compile Python to C code if all you want is a " +"stand-alone program that users can download and run without having to " +"install the Python distribution first. There are a number of tools that " +"determine the set of modules required by a program and bind these modules " +"together with a Python binary to produce a single executable." +msgstr "" +"如果只是想要一个独立的程序,以便用户不必预先安装 Python 即可下载和运行它,则不需要将 Python 编译成 C " +"代码。有许多工具可以检测程序所需的模块,并将这些模块与 Python 二进制程序捆绑在一起生成单个可执行文件。" + +#: ../../faq/programming.rst:81 +msgid "" +"One is to use the freeze tool, which is included in the Python source tree " +"as :source:`Tools/freeze`. It converts Python byte code to C arrays; with a " +"C compiler you can embed all your modules into a new program, which is then " +"linked with the standard Python modules." +msgstr "" +"一种方案是使用 freeze 工具,它以 :source:`Tools/freeze` 的形式包括在 Python 源代码树中。 它将 Python " +"字节码转换为 C 数组;用 C 编译器可将你的所有模块嵌入到一个新程序中,然后它会链接到标准 Python 模块。" + +#: ../../faq/programming.rst:87 +msgid "" +"It works by scanning your source recursively for import statements (in both " +"forms) and looking for the modules in the standard Python path as well as in" +" the source directory (for built-in modules). It then turns the bytecode " +"for modules written in Python into C code (array initializers that can be " +"turned into code objects using the marshal module) and creates a custom-made" +" config file that only contains those built-in modules which are actually " +"used in the program. It then compiles the generated C code and links it " +"with the rest of the Python interpreter to form a self-contained binary " +"which acts exactly like your script." +msgstr "" +"它的工作原理是递归扫描源代码,获取两种格式的 import 语句,并在标准 Python 路径和源码目录(用于内置模块)检索这些模块。然后,把这些模块的" +" Python 字节码转换为 C 代码(可以利用 marshal " +"模块转换为代码对象的数组初始化器),并创建一个定制的配置文件,该文件仅包含程序实际用到的内置模块。然后,编译生成的 C 代码并将其与 Python " +"解释器的其余部分链接,形成一个自给自足的二进制文件,其功能与 Python 脚本代码完全相同。" + +#: ../../faq/programming.rst:96 +msgid "" +"The following packages can help with the creation of console and GUI " +"executables:" +msgstr "下列包可以用于帮助创建控制台和 GUI 的可执行文件:" + +#: ../../faq/programming.rst:99 +msgid "`Nuitka `_ (Cross-platform)" +msgstr "`Nuitka `_ (跨平台)" + +#: ../../faq/programming.rst:100 +msgid "`PyInstaller `_ (Cross-platform)" +msgstr "`PyInstaller `_ (跨平台)" + +#: ../../faq/programming.rst:101 +msgid "" +"`PyOxidizer `_ (Cross-" +"platform)" +msgstr "`PyOxidizer `_ (跨平台)" + +#: ../../faq/programming.rst:102 +msgid "" +"`cx_Freeze `_ (Cross-platform)" +msgstr "`cx_Freeze `_ (跨平台)" + +#: ../../faq/programming.rst:103 +msgid "`py2app `_ (macOS only)" +msgstr "`py2app `_ (仅限 macOS)" + +#: ../../faq/programming.rst:104 +msgid "`py2exe `_ (Windows only)" +msgstr "`py2exe `_ (仅限 Windows)" + +#: ../../faq/programming.rst:108 +msgid "Are there coding standards or a style guide for Python programs?" +msgstr "是否有 Python 编码标准或风格指南?" + +#: ../../faq/programming.rst:110 +msgid "" +"Yes. The coding style required for standard library modules is documented " +"as :pep:`8`." +msgstr "有的。标准库模块所要求的编码风格记录于 :pep:`8` 之中。" + +#: ../../faq/programming.rst:115 +msgid "Core language" +msgstr "语言核心内容" + +#: ../../faq/programming.rst:120 +msgid "Why am I getting an UnboundLocalError when the variable has a value?" +msgstr "变量明明有值,为什么还会出现 UnboundLocalError?" + +#: ../../faq/programming.rst:122 +msgid "" +"It can be a surprise to get the :exc:`UnboundLocalError` in previously " +"working code when it is modified by adding an assignment statement somewhere" +" in the body of a function." +msgstr "" +"当在函数内部某处添加了一条赋值语句,因而导致之前正常工作的代码报出 :exc:`UnboundLocalError` 错误,这确实有点令人惊讶。" + +#: ../../faq/programming.rst:126 +msgid "This code:" +msgstr "以下代码:" + +#: ../../faq/programming.rst:135 +msgid "works, but this code:" +msgstr "正常工作,但是以下代码" + +#: ../../faq/programming.rst:142 +msgid "results in an :exc:`!UnboundLocalError`:" +msgstr "会导致 :exc:`!UnboundLocalError`:" + +#: ../../faq/programming.rst:149 +msgid "" +"This is because when you make an assignment to a variable in a scope, that " +"variable becomes local to that scope and shadows any similarly named " +"variable in the outer scope. Since the last statement in foo assigns a new " +"value to ``x``, the compiler recognizes it as a local variable. " +"Consequently when the earlier ``print(x)`` attempts to print the " +"uninitialized local variable and an error results." +msgstr "" +"原因就是,当对某作用域内的变量进行赋值时,该变量将成为该作用域内的局部变量,并覆盖外部作用域中的同名变量。由于 foo 的最后一条语句为 ``x`` " +"分配了一个新值,编译器会将其识别为局部变量。因此,前面的 ``print(x)`` 试图输出未初始化的局部变量,就会引发错误。" + +#: ../../faq/programming.rst:156 +msgid "" +"In the example above you can access the outer scope variable by declaring it" +" global:" +msgstr "在上面的示例中,可以将外部作用域的变量声明为全局变量以便访问:" + +#: ../../faq/programming.rst:168 +msgid "" +"This explicit declaration is required in order to remind you that (unlike " +"the superficially analogous situation with class and instance variables) you" +" are actually modifying the value of the variable in the outer scope:" +msgstr "与类和实例变量貌似但不一样,其实以上是在修改外部作用域的变量值,为了提示这一点,这里需要显式声明一下。" + +#: ../../faq/programming.rst:175 +msgid "" +"You can do a similar thing in a nested scope using the :keyword:`nonlocal` " +"keyword:" +msgstr "你可以使用 :keyword:`nonlocal` 关键字在嵌套作用域中执行类似的操作:" + +#: ../../faq/programming.rst:193 +msgid "What are the rules for local and global variables in Python?" +msgstr "Python 的局部变量和全局变量有哪些规则?" + +#: ../../faq/programming.rst:195 +msgid "" +"In Python, variables that are only referenced inside a function are " +"implicitly global. If a variable is assigned a value anywhere within the " +"function's body, it's assumed to be a local unless explicitly declared as " +"global." +msgstr "" +"函数内部只作引用的 Python 变量隐式视为全局变量。如果在函数内部任何位置为变量赋值,则除非明确声明为全局变量,否则均将其视为局部变量。" + +#: ../../faq/programming.rst:199 +msgid "" +"Though a bit surprising at first, a moment's consideration explains this. " +"On one hand, requiring :keyword:`global` for assigned variables provides a " +"bar against unintended side-effects. On the other hand, if ``global`` was " +"required for all global references, you'd be using ``global`` all the time." +" You'd have to declare as global every reference to a built-in function or " +"to a component of an imported module. This clutter would defeat the " +"usefulness of the ``global`` declaration for identifying side-effects." +msgstr "" +"起初尽管有点令人惊讶,不过考虑片刻即可释然。一方面,已分配的变量要求加上 :keyword:`global` " +"可以防止意外的副作用发生。另一方面,如果所有全局引用都要加上 ``global``,那处处都得用上 ``global`` " +"了。那么每次对内置函数或导入模块中的组件进行引用时,都得声明为全局变量。这种杂乱会破坏 ``global`` 声明用于警示副作用的有效性。" + +#: ../../faq/programming.rst:209 +msgid "" +"Why do lambdas defined in a loop with different values all return the same " +"result?" +msgstr "为什么在循环中定义的参数各异的 lambda 都返回相同的结果?" + +#: ../../faq/programming.rst:211 +msgid "" +"Assume you use a for loop to define a few different lambdas (or even plain " +"functions), for example::" +msgstr "假定你使用一个 for 循环来定义几个不同的 lambda (甚至普通的函数),例如::" + +#: ../../faq/programming.rst:214 +msgid "" +">>> squares = []\n" +">>> for x in range(5):\n" +"... squares.append(lambda: x**2)" +msgstr "" +">>> squares = []\n" +">>> for x in range(5):\n" +"... squares.append(lambda: x**2)" + +#: ../../faq/programming.rst:218 +msgid "" +"This gives you a list that contains 5 lambdas that calculate ``x**2``. You " +"might expect that, when called, they would return, respectively, ``0``, " +"``1``, ``4``, ``9``, and ``16``. However, when you actually try you will " +"see that they all return ``16``::" +msgstr "" +"以上会得到一个包含 5 个 lambda 函数的列表,这些函数将计算 ``x**2``。 大家或许期望,调用这些函数会分别返回 ``0``、``1``、" +" ``4``、``9`` 和 ``16``。 然而,真的试过就会发现,他们都会返回 ``16``:" + +#: ../../faq/programming.rst:223 +msgid "" +">>> squares[2]()\n" +"16\n" +">>> squares[4]()\n" +"16" +msgstr "" +">>> squares[2]()\n" +"16\n" +">>> squares[4]()\n" +"16" + +#: ../../faq/programming.rst:228 +msgid "" +"This happens because ``x`` is not local to the lambdas, but is defined in " +"the outer scope, and it is accessed when the lambda is called --- not when " +"it is defined. At the end of the loop, the value of ``x`` is ``4``, so all " +"the functions now return ``4**2``, that is ``16``. You can also verify this" +" by changing the value of ``x`` and see how the results of the lambdas " +"change::" +msgstr "" +"这是因为 ``x`` 不是 lambda 表达式的局部变量,而是定义于外部作用域中,并且它会在调用 lambda 表达式时被访问 --- " +"而不是在定义时。 在循环结束时,``x`` 的值为 ``4``,所以此时所有函数都将返回 ``4**2``,即 ``16``。 你也可以通过改变 " +"``x`` 的值并查看 lambda 表达式结果的变化来验证这一点::" + +#: ../../faq/programming.rst:234 +msgid "" +">>> x = 8\n" +">>> squares[2]()\n" +"64" +msgstr "" +">>> x = 8\n" +">>> squares[2]()\n" +"64" + +#: ../../faq/programming.rst:238 +msgid "" +"In order to avoid this, you need to save the values in variables local to " +"the lambdas, so that they don't rely on the value of the global ``x``::" +msgstr "为了避免发生上述情况,需要将值保存在 lambda 局部变量,以使其不依赖于全局 ``x`` 的值:" + +#: ../../faq/programming.rst:241 +msgid "" +">>> squares = []\n" +">>> for x in range(5):\n" +"... squares.append(lambda n=x: n**2)" +msgstr "" +">>> squares = []\n" +">>> for x in range(5):\n" +"... squares.append(lambda n=x: n**2)" + +#: ../../faq/programming.rst:245 +msgid "" +"Here, ``n=x`` creates a new variable ``n`` local to the lambda and computed " +"when the lambda is defined so that it has the same value that ``x`` had at " +"that point in the loop. This means that the value of ``n`` will be ``0`` in" +" the first lambda, ``1`` in the second, ``2`` in the third, and so on. " +"Therefore each lambda will now return the correct result::" +msgstr "" +"以上 ``n=x`` 创建了一个新的 lambda 本地变量 ``n``,并在定义 lambda 时计算其值,使其与循环当前时点的 ``x`` " +"值相同。这意味着 ``n`` 的值在第 1 个 lambda 中为 ``0``,在第 2 个 lambda 中为 ``1``,在第 3 个中为 " +"``2``,依此类推。因此现在每个 lambda 都会返回正确结果:" + +#: ../../faq/programming.rst:251 +msgid "" +">>> squares[2]()\n" +"4\n" +">>> squares[4]()\n" +"16" +msgstr "" +">>> squares[2]()\n" +"4\n" +">>> squares[4]()\n" +"16" + +#: ../../faq/programming.rst:256 +msgid "" +"Note that this behaviour is not peculiar to lambdas, but applies to regular " +"functions too." +msgstr "请注意,上述表现并不是 lambda 所特有的,常规的函数也同样适用。" + +#: ../../faq/programming.rst:261 +msgid "How do I share global variables across modules?" +msgstr "如何跨模块共享全局变量?" + +#: ../../faq/programming.rst:263 +msgid "" +"The canonical way to share information across modules within a single " +"program is to create a special module (often called config or cfg). Just " +"import the config module in all modules of your application; the module then" +" becomes available as a global name. Because there is only one instance of " +"each module, any changes made to the module object get reflected everywhere." +" For example:" +msgstr "" +"在单个程序中跨模块共享信息的规范方法是创建一个特殊模块(通常称为 config 或 cfg)。只需在应用程序的所有模块中导入该 config " +"模块;然后该模块就可当作全局名称使用了。因为每个模块只有一个实例,所以对该模块对象所做的任何更改将会在所有地方得以体现。例如:" + +#: ../../faq/programming.rst:269 +msgid "config.py::" +msgstr "config.py:" + +#: ../../faq/programming.rst:271 +msgid "x = 0 # Default value of the 'x' configuration setting" +msgstr "x = 0 # 'x' 配置设置的默认值" + +#: ../../faq/programming.rst:273 +msgid "mod.py::" +msgstr "mod.py:" + +#: ../../faq/programming.rst:275 +msgid "" +"import config\n" +"config.x = 1" +msgstr "" +"import config\n" +"config.x = 1" + +#: ../../faq/programming.rst:278 +msgid "main.py::" +msgstr "main.py:" + +#: ../../faq/programming.rst:280 +msgid "" +"import config\n" +"import mod\n" +"print(config.x)" +msgstr "" +"import config\n" +"import mod\n" +"print(config.x)" + +#: ../../faq/programming.rst:284 +msgid "" +"Note that using a module is also the basis for implementing the singleton " +"design pattern, for the same reason." +msgstr "请注意,出于同样的原因,使用模块也是实现单例设计模式的基础。" + +#: ../../faq/programming.rst:289 +msgid "What are the \"best practices\" for using import in a module?" +msgstr "导入模块的“最佳实践”是什么?" + +#: ../../faq/programming.rst:291 +msgid "" +"In general, don't use ``from modulename import *``. Doing so clutters the " +"importer's namespace, and makes it much harder for linters to detect " +"undefined names." +msgstr "" +"通常请勿使用 ``from modulename import *``。因为这会扰乱 importer 的命名空间,且会造成未定义名称更难以被 " +"Linter 检查出来。" + +#: ../../faq/programming.rst:295 +msgid "" +"Import modules at the top of a file. Doing so makes it clear what other " +"modules your code requires and avoids questions of whether the module name " +"is in scope. Using one import per line makes it easy to add and delete " +"module imports, but using multiple imports per line uses less screen space." +msgstr "" +"请在代码文件的首部就导入模块。这样代码所需的模块就一目了然了,也不用考虑模块名是否在作用域内的问题。每行导入一个模块则增删起来会比较容易,每行导入多个模块则更节省屏幕空间。" + +#: ../../faq/programming.rst:300 +msgid "It's good practice if you import modules in the following order:" +msgstr "按如下顺序导入模块就是一种好做法:" + +#: ../../faq/programming.rst:302 +msgid "" +"standard library modules -- such as :mod:`sys`, :mod:`os`, :mod:`argparse`, " +":mod:`re`" +msgstr "标准库模块 -- 如 :mod:`sys`, :mod:`os`, :mod:`argparse`, :mod:`re`" + +#: ../../faq/programming.rst:303 +msgid "" +"third-party library modules (anything installed in Python's site-packages " +"directory) -- such as :pypi:`dateutil`, :pypi:`requests`, :pypi:`tzdata`" +msgstr "" +"第三方库模块(任何安装在 Python 的目录下的内容) -- 如 :pypi:`dateutil`, :pypi:`requests`, " +":pypi:`tzdata`" + +#: ../../faq/programming.rst:305 +msgid "locally developed modules" +msgstr "本地开发的模块" + +#: ../../faq/programming.rst:307 +msgid "" +"It is sometimes necessary to move imports to a function or class to avoid " +"problems with circular imports. Gordon McMillan says:" +msgstr "为了避免循环导入引发的问题,有时需要将模块导入语句移入函数或类的内部。Gordon McMillan 的说法如下:" + +#: ../../faq/programming.rst:310 +msgid "" +"Circular imports are fine where both modules use the \"import \" " +"form of import. They fail when the 2nd module wants to grab a name out of " +"the first (\"from module import name\") and the import is at the top level." +" That's because names in the 1st are not yet available, because the first " +"module is busy importing the 2nd." +msgstr "" +"当两个模块都采用 \"import \" 的导入形式时,循环导入是没有问题的。但如果第 2 个模块想从第 1 " +"个模块中取出一个名称(\"from module import name\")并且导入处于代码的最顶层,那导入就会失败。原因是第 1 " +"个模块中的名称还不可用,这时第 1 个模块正忙于导入第 2 个模块呢。" + +#: ../../faq/programming.rst:316 +msgid "" +"In this case, if the second module is only used in one function, then the " +"import can easily be moved into that function. By the time the import is " +"called, the first module will have finished initializing, and the second " +"module can do its import." +msgstr "" +"如果只是在一个函数中用到第 2 个模块,那这时将导入语句移入该函数内部即可。当调用到导入语句时,第 1 个模块将已经完成初始化,第 2 " +"个模块就可以进行导入了。" + +#: ../../faq/programming.rst:321 +msgid "" +"It may also be necessary to move imports out of the top level of code if " +"some of the modules are platform-specific. In that case, it may not even be" +" possible to import all of the modules at the top of the file. In this " +"case, importing the correct modules in the corresponding platform-specific " +"code is a good option." +msgstr "" +"如果某些模块是平台相关的,可能还需要把导入语句移出最顶级代码。这种情况下,甚至有可能无法导入文件首部的所有模块。于是在对应的平台相关代码中导入正确的模块,就是一种不错的选择。" + +#: ../../faq/programming.rst:326 +msgid "" +"Only move imports into a local scope, such as inside a function definition, " +"if it's necessary to solve a problem such as avoiding a circular import or " +"are trying to reduce the initialization time of a module. This technique is" +" especially helpful if many of the imports are unnecessary depending on how " +"the program executes. You may also want to move imports into a function if " +"the modules are only ever used in that function. Note that loading a module" +" the first time may be expensive because of the one time initialization of " +"the module, but loading a module multiple times is virtually free, costing " +"only a couple of dictionary lookups. Even if the module name has gone out " +"of scope, the module is probably available in :data:`sys.modules`." +msgstr "" +"只有为了避免循环导入问题,或有必要减少模块初始化时间时,才把导入语句移入类似函数定义内部的局部作用域。如果根据程序的执行方式,许多导入操作不是必需的,那么这种技术尤其有用。如果模块仅在某个函数中用到,可能还要将导入操作移入该函数内部。请注意,因为模块有一次初始化过程,所以第一次加载模块的代价可能会比较高,但多次加载几乎没有什么花费,代价只是进行几次字典检索而已。即使模块名超出了作用域,模块在" +" :data:`sys.modules` 中也是可用的。 " + +#: ../../faq/programming.rst:339 +msgid "Why are default values shared between objects?" +msgstr "为什么对象之间会共享默认值?" + +#: ../../faq/programming.rst:341 +msgid "" +"This type of bug commonly bites neophyte programmers. Consider this " +"function::" +msgstr "新手程序员常常中招这类 Bug。请看以下函数:" + +#: ../../faq/programming.rst:343 +msgid "" +"def foo(mydict={}): # Danger: shared reference to one dict for all calls\n" +" ... compute something ...\n" +" mydict[key] = value\n" +" return mydict" +msgstr "" +"def foo(mydict={}): # 危险:所有调用共享对一个字典的引用\n" +" ... 执行一些计算 ...\n" +" mydict[key] = value\n" +" return mydict" + +#: ../../faq/programming.rst:348 +msgid "" +"The first time you call this function, ``mydict`` contains a single item. " +"The second time, ``mydict`` contains two items because when ``foo()`` begins" +" executing, ``mydict`` starts out with an item already in it." +msgstr "" +"第一次调用此函数时,``mydict`` 中只有一个数据项。第二次调用 ``mydict`` 则会包含两个数据项,因为 ``foo()`` " +"开始执行时,``mydict`` 中已经带有一个数据项了。" + +#: ../../faq/programming.rst:352 +msgid "" +"It is often expected that a function call creates new objects for default " +"values. This is not what happens. Default values are created exactly once, " +"when the function is defined. If that object is changed, like the " +"dictionary in this example, subsequent calls to the function will refer to " +"this changed object." +msgstr "" +"大家往往希望,函数调用会为默认值创建新的对象。但事实并非如此。默认值只会在函数定义时创建一次。如果对象发生改变,就如上例中的字典那样,则后续调用该函数时将会引用这个改动的对象。" + +#: ../../faq/programming.rst:357 +msgid "" +"By definition, immutable objects such as numbers, strings, tuples, and " +"``None``, are safe from change. Changes to mutable objects such as " +"dictionaries, lists, and class instances can lead to confusion." +msgstr "" +"按照定义,不可变对象改动起来是安全的,诸如数字、字符串、元组和 ``None`` 之类。而可变对象的改动则可能引起困惑,例如字典、列表和类实例等。" + +#: ../../faq/programming.rst:361 +msgid "" +"Because of this feature, it is good programming practice to not use mutable " +"objects as default values. Instead, use ``None`` as the default value and " +"inside the function, check if the parameter is ``None`` and create a new " +"list/dictionary/whatever if it is. For example, don't write::" +msgstr "" +"因此,不把可变对象用作默认值是一种良好的编程做法。而应采用 ``None`` 作为默认值,然后在函数中检查参数是否为 ``None`` " +"并新建列表、字典或其他对象。例如,代码不应如下所示:" + +#: ../../faq/programming.rst:366 +msgid "" +"def foo(mydict={}):\n" +" ..." +msgstr "" +"def foo(mydict={}):\n" +" ..." + +#: ../../faq/programming.rst:369 +msgid "but::" +msgstr "而应这么写:" + +#: ../../faq/programming.rst:371 +msgid "" +"def foo(mydict=None):\n" +" if mydict is None:\n" +" mydict = {} # create a new dict for local namespace" +msgstr "" +"def foo(mydict=None):\n" +" if mydict is None:\n" +" mydict = {} # 为局部命名空间新建一个字典" + +#: ../../faq/programming.rst:375 +msgid "" +"This feature can be useful. When you have a function that's time-consuming " +"to compute, a common technique is to cache the parameters and the resulting " +"value of each call to the function, and return the cached value if the same " +"value is requested again. This is called \"memoizing\", and can be " +"implemented like this::" +msgstr "" +"参数默认值的特性有时会很有用处。如果有个函数的计算过程会比较耗时,有一种常见技巧是将每次函数调用的参数和结果缓存起来,并在同样的值被再次请求时返回缓存的值。这种技巧被称为“memoize”,实现代码可如下所示:" + +#: ../../faq/programming.rst:380 +msgid "" +"# Callers can only provide two parameters and optionally pass _cache by keyword\n" +"def expensive(arg1, arg2, *, _cache={}):\n" +" if (arg1, arg2) in _cache:\n" +" return _cache[(arg1, arg2)]\n" +"\n" +" # Calculate the value\n" +" result = ... expensive computation ...\n" +" _cache[(arg1, arg2)] = result # Store result in the cache\n" +" return result" +msgstr "" +"# 调用方只能提供两个形参并可选择以关键字形式传入 _cache\n" +"def expensive(arg1, arg2, *, _cache={}):\n" +" if (arg1, arg2) in _cache:\n" +" return _cache[(arg1, arg2)]\n" +"\n" +" # 计算结果值\n" +" result = ... 高耗费的计算 ...\n" +" _cache[(arg1, arg2)] = result # 将结果保存在缓存中\n" +" return result" + +#: ../../faq/programming.rst:390 +msgid "" +"You could use a global variable containing a dictionary instead of the " +"default value; it's a matter of taste." +msgstr "也可以不用参数默认值来实现,而是采用全局的字典变量;这取决于个人偏好。" + +#: ../../faq/programming.rst:395 +msgid "" +"How can I pass optional or keyword parameters from one function to another?" +msgstr "如何将可选参数或关键字参数从一个函数传递到另一个函数?" + +#: ../../faq/programming.rst:397 +msgid "" +"Collect the arguments using the ``*`` and ``**`` specifiers in the " +"function's parameter list; this gives you the positional arguments as a " +"tuple and the keyword arguments as a dictionary. You can then pass these " +"arguments when calling another function by using ``*`` and ``**``::" +msgstr "" +"请利用函数参数列表中的标识符 ``*`` 和 ``**`` 归集实参;结果会是元组形式的位置实参和字典形式的关键字实参。然后就可利用 ``*`` 和 " +"``**`` 在调用其他函数时传入这些实参:" + +#: ../../faq/programming.rst:402 +msgid "" +"def f(x, *args, **kwargs):\n" +" ...\n" +" kwargs['width'] = '14.3c'\n" +" ...\n" +" g(x, *args, **kwargs)" +msgstr "" +"def f(x, *args, **kwargs):\n" +" ...\n" +" kwargs['width'] = '14.3c'\n" +" ...\n" +" g(x, *args, **kwargs)" + +#: ../../faq/programming.rst:416 +msgid "What is the difference between arguments and parameters?" +msgstr "形参和实参之间有什么区别?" + +#: ../../faq/programming.rst:418 +msgid "" +":term:`Parameters ` are defined by the names that appear in a " +"function definition, whereas :term:`arguments ` are the values " +"actually passed to a function when calling it. Parameters define what " +":term:`kind of arguments ` a function can accept. For example, " +"given the function definition::" +msgstr "" +":term:`形参 ` 是由出现在函数定义中的名称来定义的,而 :term:`参数 ` " +"则是在调用函数时实际传入的值。形参定义了一个函数能接受什么 :term:`参数种类 `。例如,对于以下函数定义::" + +#: ../../faq/programming.rst:424 +msgid "" +"def func(foo, bar=None, **kwargs):\n" +" pass" +msgstr "" +"def func(foo, bar=None, **kwargs):\n" +" pass" + +#: ../../faq/programming.rst:427 +msgid "" +"*foo*, *bar* and *kwargs* are parameters of ``func``. However, when calling" +" ``func``, for example::" +msgstr "*foo* 、 *bar* 和 *kwargs* 是 ``func`` 的形参。不过在调用 ``func`` 时,例如:" + +#: ../../faq/programming.rst:430 +msgid "func(42, bar=314, extra=somevar)" +msgstr "func(42, bar=314, extra=somevar)" + +#: ../../faq/programming.rst:432 +msgid "the values ``42``, ``314``, and ``somevar`` are arguments." +msgstr "``42``、``314`` 和 ``somevar`` 则是实参。" + +#: ../../faq/programming.rst:436 +msgid "Why did changing list 'y' also change list 'x'?" +msgstr "为什么修改列表 'y' 也会更改列表 'x'?" + +#: ../../faq/programming.rst:438 +msgid "If you wrote code like::" +msgstr "如果代码编写如下:" + +#: ../../faq/programming.rst:440 +msgid "" +">>> x = []\n" +">>> y = x\n" +">>> y.append(10)\n" +">>> y\n" +"[10]\n" +">>> x\n" +"[10]" +msgstr "" +">>> x = []\n" +">>> y = x\n" +">>> y.append(10)\n" +">>> y\n" +"[10]\n" +">>> x\n" +"[10]" + +#: ../../faq/programming.rst:448 +msgid "" +"you might be wondering why appending an element to ``y`` changed ``x`` too." +msgstr "或许大家很想知道,为什么在 y 中添加一个元素时,x 也会改变。" + +#: ../../faq/programming.rst:450 +msgid "There are two factors that produce this result:" +msgstr "产生这种结果有两个因素:" + +#: ../../faq/programming.rst:452 +msgid "" +"Variables are simply names that refer to objects. Doing ``y = x`` doesn't " +"create a copy of the list -- it creates a new variable ``y`` that refers to " +"the same object ``x`` refers to. This means that there is only one object " +"(the list), and both ``x`` and ``y`` refer to it." +msgstr "" +"变量只是指向对象的一个名称。执行 ``y = x`` 并不会创建列表的副本——而只是创建了一个新变量 ``y``,并指向 ``x`` " +"所指的同一对象。这就意味着只存在一个列表对象,``x`` 和 ``y`` 都是对它的引用。" + +#: ../../faq/programming.rst:456 +msgid "" +"Lists are :term:`mutable`, which means that you can change their content." +msgstr "列表属于 :term:`mutable` 对象,这意味着它的内容是可以修改的。" + +#: ../../faq/programming.rst:458 +msgid "" +"After the call to :meth:`~sequence.append`, the content of the mutable " +"object has changed from ``[]`` to ``[10]``. Since both the variables refer " +"to the same object, using either name accesses the modified value ``[10]``." +msgstr "" +"在调用 :meth:`~sequence.append` 之后,该可变对象的内容从 ``[]`` 变为 " +"``[10]``。由于两个变量引用了同一对象,因此使用其中任意一个名称访问的都是修改后的值 ``[10]``。" + +#: ../../faq/programming.rst:462 +msgid "If we instead assign an immutable object to ``x``::" +msgstr "如果把赋给 ``x`` 的对象换成一个不可变对象:" + +#: ../../faq/programming.rst:464 +msgid "" +">>> x = 5 # ints are immutable\n" +">>> y = x\n" +">>> x = x + 1 # 5 can't be mutated, we are creating a new object here\n" +">>> x\n" +"6\n" +">>> y\n" +"5" +msgstr "" +">>> x = 5 # 整数是不可变对象\n" +">>> y = x\n" +">>> x = x + 1 # 5 不能被修改,在此我们会新建一个对象\n" +">>> x\n" +"6\n" +">>> y\n" +"5" + +#: ../../faq/programming.rst:472 +msgid "" +"we can see that in this case ``x`` and ``y`` are not equal anymore. This is" +" because integers are :term:`immutable`, and when we do ``x = x + 1`` we are" +" not mutating the int ``5`` by incrementing its value; instead, we are " +"creating a new object (the int ``6``) and assigning it to ``x`` (that is, " +"changing which object ``x`` refers to). After this assignment we have two " +"objects (the ints ``6`` and ``5``) and two variables that refer to them " +"(``x`` now refers to ``6`` but ``y`` still refers to ``5``)." +msgstr "" +"可见这时 ``x`` 和 ``y`` 就不再相等了。因为整数是 :term:`immutable` 对象,在执行 ``x = x + 1`` " +"时,并不会修改整数对象 ``5``,给它加上 1;而是创建了一个新的对象 (整数对象 ``6``) 并将其赋给 ``x`` (也就是改变了 ``x`` " +"所指向的对象)。 在赋值完成后,就有了两个对象 (整数对象 ``6`` 和 ``5``) 和分别指向他俩的两个变量 (现在 ``x`` 指向 ``6``" +" 而 ``y`` 仍然指向 ``5``)。" + +#: ../../faq/programming.rst:480 +msgid "" +"Some operations (for example ``y.append(10)`` and ``y.sort()``) mutate the " +"object, whereas superficially similar operations (for example ``y = y + " +"[10]`` and :func:`sorted(y) `) create a new object. In general in " +"Python (and in all cases in the standard library) a method that mutates an " +"object will return ``None`` to help avoid getting the two types of " +"operations confused. So if you mistakenly write ``y.sort()`` thinking it " +"will give you a sorted copy of ``y``, you'll instead end up with ``None``, " +"which will likely cause your program to generate an easily diagnosed error." +msgstr "" +"某些操作 (例如 ``y.append(10)`` 和 ``y.sort()``) 是改变原对象,而看上去相似的另一些操作 (例如 ``y = y + " +"[10]`` 和 :func:`sorted(y) `) 则是创建新对象。通常在 Python 中 (以及在标准库的所有代码中) " +"会改变原对象的方法将返回 ``None`` 以帮助避免混淆这两种不同类型的操作。因此如果你错误地使用了 ``y.sort()`` " +"并期望它将返回一个经过排序的 ``y`` 的副本,你得到的结果将会是 ``None``,这将导致你的程序产生一个容易诊断的错误。" + +#: ../../faq/programming.rst:489 +msgid "" +"However, there is one class of operations where the same operation sometimes" +" has different behaviors with different types: the augmented assignment " +"operators. For example, ``+=`` mutates lists but not tuples or ints " +"(``a_list += [1, 2, 3]`` is equivalent to ``a_list.extend([1, 2, 3])`` and " +"mutates ``a_list``, whereas ``some_tuple += (1, 2, 3)`` and ``some_int += " +"1`` create new objects)." +msgstr "" +"不过还存在一类操作,用不同的类型执行相同的操作有时会发生不同的行为:即增量赋值运算符。例如,``+=`` 会修改列表,但不会修改元组或整数 " +"(``a_list += [1, 2, 3]`` 与 ``a_list.extend([1, 2, 3])`` 同样都会改变 ``a_list``,而 " +"``some_tuple += (1, 2, 3)`` 和 ``some_int += 1`` 则会创建新的对象)。" + +#: ../../faq/programming.rst:496 +msgid "In other words:" +msgstr "换而言之:" + +#: ../../faq/programming.rst:498 +msgid "" +"If we have a mutable object (such as :class:`list`, :class:`dict`, " +":class:`set`), we can use some specific operations to mutate it and all the " +"variables that refer to it will see the change." +msgstr "" +"当我们有一个可变对象(如 :class:`list`, :class:`dict`, :class:`set` " +"等),我们可以使用一些特定操作来修改它而所有引用它的变量都能看到改变。" + +#: ../../faq/programming.rst:501 +msgid "" +"If we have an immutable object (such as :class:`str`, :class:`int`, " +":class:`tuple`), all the variables that refer to it will always see the same" +" value, but operations that transform that value into a new value always " +"return a new object." +msgstr "" +"当我们有一个不可变对象(如 :class:`str`, :class:`int`, :class:`tuple` " +"等),所有引用它的变量总是会给出相同的值,但所有改成新值的操作总是会返回一个新对象。" + +#: ../../faq/programming.rst:506 +msgid "" +"If you want to know if two variables refer to the same object or not, you " +"can use the :keyword:`is` operator, or the built-in function :func:`id`." +msgstr "如要知道两个变量是否指向同一个对象,可以利用 :keyword:`is` 运算符或内置函数 :func:`id`。" + +#: ../../faq/programming.rst:511 +msgid "How do I write a function with output parameters (call by reference)?" +msgstr "如何编写带有输出参数的函数(按照引用调用)?" + +#: ../../faq/programming.rst:513 +msgid "" +"Remember that arguments are passed by assignment in Python. Since " +"assignment just creates references to objects, there's no alias between an " +"argument name in the caller and callee, and consequently no call-by-" +"reference. You can achieve the desired effect in a number of ways." +msgstr "" +"请记住在 Python 中参数是通过赋值传递的。 由于赋值只是创建了对象的引用,调用方和被调用方的参数名之间不存在别名,因此也不存在按引用调用方式。 " +"你可以通过几种方式达成想要的效果。" + +#: ../../faq/programming.rst:518 +msgid "By returning a tuple of the results::" +msgstr "返回一个元组:" + +#: ../../faq/programming.rst:520 +msgid "" +">>> def func1(a, b):\n" +"... a = 'new-value' # a and b are local names\n" +"... b = b + 1 # assigned to new objects\n" +"... return a, b # return new values\n" +"...\n" +">>> x, y = 'old-value', 99\n" +">>> func1(x, y)\n" +"('new-value', 100)" +msgstr "" +">>> def func1(a, b):\n" +"... a = 'new-value' # a 和 b 是局部名称\n" +"... b = b + 1 # 赋值为新的对象\n" +"... return a, b # 返回新的值\n" +"...\n" +">>> x, y = 'old-value', 99\n" +">>> func1(x, y)\n" +"('new-value', 100)" + +#: ../../faq/programming.rst:529 +msgid "This is almost always the clearest solution." +msgstr "这差不多是最明晰的解决方案了。" + +#: ../../faq/programming.rst:531 +msgid "" +"By using global variables. This isn't thread-safe, and is not recommended." +msgstr "使用全局变量。这不是线程安全的方案,不推荐使用。" + +#: ../../faq/programming.rst:533 +msgid "By passing a mutable (changeable in-place) object::" +msgstr "传递一个可变(即可原地修改的)对象:" + +#: ../../faq/programming.rst:535 +msgid "" +">>> def func2(a):\n" +"... a[0] = 'new-value' # 'a' references a mutable list\n" +"... a[1] = a[1] + 1 # changes a shared object\n" +"...\n" +">>> args = ['old-value', 99]\n" +">>> func2(args)\n" +">>> args\n" +"['new-value', 100]" +msgstr "" +">>> def func2(a):\n" +"... a[0] = 'new-value' # 'a' 引用了一个可变的列表\n" +"... a[1] = a[1] + 1 # 修改一个共享对象\n" +"...\n" +">>> args = ['old-value', 99]\n" +">>> func2(args)\n" +">>> args\n" +"['new-value', 100]" + +#: ../../faq/programming.rst:544 +msgid "By passing in a dictionary that gets mutated::" +msgstr "传入一个会被修改的字典:" + +#: ../../faq/programming.rst:546 +msgid "" +">>> def func3(args):\n" +"... args['a'] = 'new-value' # args is a mutable dictionary\n" +"... args['b'] = args['b'] + 1 # change it in-place\n" +"...\n" +">>> args = {'a': 'old-value', 'b': 99}\n" +">>> func3(args)\n" +">>> args\n" +"{'a': 'new-value', 'b': 100}" +msgstr "" +">>> def func3(args):\n" +"... args['a'] = 'new-value' # args 是一个可变的字典\n" +"... args['b'] = args['b'] + 1 # 对其进行原地修改\n" +"...\n" +">>> args = {'a': 'old-value', 'b': 99}\n" +">>> func3(args)\n" +">>> args\n" +"{'a': 'new-value', 'b': 100}" + +#: ../../faq/programming.rst:555 +msgid "Or bundle up values in a class instance::" +msgstr "或者把值用类实例封装起来:" + +#: ../../faq/programming.rst:557 +msgid "" +">>> class Namespace:\n" +"... def __init__(self, /, **args):\n" +"... for key, value in args.items():\n" +"... setattr(self, key, value)\n" +"...\n" +">>> def func4(args):\n" +"... args.a = 'new-value' # args is a mutable Namespace\n" +"... args.b = args.b + 1 # change object in-place\n" +"...\n" +">>> args = Namespace(a='old-value', b=99)\n" +">>> func4(args)\n" +">>> vars(args)\n" +"{'a': 'new-value', 'b': 100}" +msgstr "" +">>> class Namespace:\n" +"... def __init__(self, /, **args):\n" +"... for key, value in args.items():\n" +"... setattr(self, key, value)\n" +"...\n" +">>> def func4(args):\n" +"... args.a = 'new-value' # args 是一个可变的 Namespace\n" +"... args.b = args.b + 1 # 原地修改对象\n" +"...\n" +">>> args = Namespace(a='old-value', b=99)\n" +">>> func4(args)\n" +">>> vars(args)\n" +"{'a': 'new-value', 'b': 100}" + +#: ../../faq/programming.rst:572 +msgid "There's almost never a good reason to get this complicated." +msgstr "没有什么理由要把问题搞得这么复杂。" + +#: ../../faq/programming.rst:574 +msgid "Your best choice is to return a tuple containing the multiple results." +msgstr "最佳选择就是返回一个包含多个结果值的元组。" + +#: ../../faq/programming.rst:578 +msgid "How do you make a higher order function in Python?" +msgstr "如何在 Python 中创建高阶函数?" + +#: ../../faq/programming.rst:580 +msgid "" +"You have two choices: you can use nested scopes or you can use callable " +"objects. For example, suppose you wanted to define ``linear(a,b)`` which " +"returns a function ``f(x)`` that computes the value ``a*x+b``. Using nested" +" scopes::" +msgstr "" +"有两种选择:嵌套作用域、可调用对象。假定需要定义 ``linear(a,b)``,其返回结果是一个计算出 ``a*x+b`` 的函数 " +"``f(x)``。采用嵌套作用域的方案如下:" + +#: ../../faq/programming.rst:584 +msgid "" +"def linear(a, b):\n" +" def result(x):\n" +" return a * x + b\n" +" return result" +msgstr "" +"def linear(a, b):\n" +" def result(x):\n" +" return a * x + b\n" +" return result" + +#: ../../faq/programming.rst:589 +msgid "Or using a callable object::" +msgstr "或者可采用可调用对象:" + +#: ../../faq/programming.rst:591 +msgid "" +"class linear:\n" +"\n" +" def __init__(self, a, b):\n" +" self.a, self.b = a, b\n" +"\n" +" def __call__(self, x):\n" +" return self.a * x + self.b" +msgstr "" +"class linear:\n" +"\n" +" def __init__(self, a, b):\n" +" self.a, self.b = a, b\n" +"\n" +" def __call__(self, x):\n" +" return self.a * x + self.b" + +#: ../../faq/programming.rst:599 +msgid "In both cases, ::" +msgstr "采用这两种方案时:" + +#: ../../faq/programming.rst:601 +msgid "taxes = linear(0.3, 2)" +msgstr "taxes = linear(0.3, 2)" + +#: ../../faq/programming.rst:603 +msgid "gives a callable object where ``taxes(10e6) == 0.3 * 10e6 + 2``." +msgstr "都会得到一个可调用对象,可实现 ``taxes(10e6) == 0.3 * 10e6 + 2``。" + +#: ../../faq/programming.rst:605 +msgid "" +"The callable object approach has the disadvantage that it is a bit slower " +"and results in slightly longer code. However, note that a collection of " +"callables can share their signature via inheritance::" +msgstr "可调用对象的方案有个缺点,就是速度稍慢且生成的代码略长。不过值得注意的是,同一组可调用对象能够通过继承来共享签名(类声明):" + +#: ../../faq/programming.rst:609 +msgid "" +"class exponential(linear):\n" +" # __init__ inherited\n" +" def __call__(self, x):\n" +" return self.a * (x ** self.b)" +msgstr "" +"class exponential(linear):\n" +" # 继承了 __init__\n" +" def __call__(self, x):\n" +" return self.a * (x ** self.b)" + +#: ../../faq/programming.rst:614 +msgid "Object can encapsulate state for several methods::" +msgstr "对象可以为多个方法的运行状态进行封装:" + +#: ../../faq/programming.rst:616 +msgid "" +"class counter:\n" +"\n" +" value = 0\n" +"\n" +" def set(self, x):\n" +" self.value = x\n" +"\n" +" def up(self):\n" +" self.value = self.value + 1\n" +"\n" +" def down(self):\n" +" self.value = self.value - 1\n" +"\n" +"count = counter()\n" +"inc, dec, reset = count.up, count.down, count.set" +msgstr "" +"class counter:\n" +"\n" +" value = 0\n" +"\n" +" def set(self, x):\n" +" self.value = x\n" +"\n" +" def up(self):\n" +" self.value = self.value + 1\n" +"\n" +" def down(self):\n" +" self.value = self.value - 1\n" +"\n" +"count = counter()\n" +"inc, dec, reset = count.up, count.down, count.set" + +#: ../../faq/programming.rst:632 +msgid "" +"Here ``inc()``, ``dec()`` and ``reset()`` act like functions which share the" +" same counting variable." +msgstr "以上 ``inc()``、``dec()`` 和 ``reset()`` 的表现,就如同共享了同一计数变量一样。" + +#: ../../faq/programming.rst:637 +msgid "How do I copy an object in Python?" +msgstr "如何复制 Python 对象?" + +#: ../../faq/programming.rst:639 +msgid "" +"In general, try :func:`copy.copy` or :func:`copy.deepcopy` for the general " +"case. Not all objects can be copied, but most can." +msgstr "" +"一般情况下,用 :func:`copy.copy` 或 :func:`copy.deepcopy` " +"基本就可以了。并不是所有对象都支持复制,但多数是可以的。" + +#: ../../faq/programming.rst:642 +msgid "" +"Some objects can be copied more easily. Dictionaries have a " +":meth:`~dict.copy` method::" +msgstr "某些对象可以用更简便的方法进行复制。比如字典对象就提供了 :meth:`~dict.copy` 方法:" + +#: ../../faq/programming.rst:645 +msgid "newdict = olddict.copy()" +msgstr "newdict = olddict.copy()" + +#: ../../faq/programming.rst:647 +msgid "Sequences can be copied by slicing::" +msgstr "序列可以用切片操作进行复制:" + +#: ../../faq/programming.rst:649 +msgid "new_l = l[:]" +msgstr "new_l = l[:]" + +#: ../../faq/programming.rst:653 +msgid "How can I find the methods or attributes of an object?" +msgstr "如何找到对象的方法或属性?" + +#: ../../faq/programming.rst:655 +msgid "" +"For an instance ``x`` of a user-defined class, :func:`dir(x) ` returns " +"an alphabetized list of the names containing the instance attributes and " +"methods and attributes defined by its class." +msgstr "" +"对于一个用户定义类的实例 ``x``,:func:`dir(x) ` " +"将返回一个按字母顺序排列的名称列表,其中包含实例属性及由类定义的方法和属性。" + +#: ../../faq/programming.rst:661 +msgid "How can my code discover the name of an object?" +msgstr "如何用代码获取对象的名称?" + +#: ../../faq/programming.rst:663 +msgid "" +"Generally speaking, it can't, because objects don't really have names. " +"Essentially, assignment always binds a name to a value; the same is true of " +"``def`` and ``class`` statements, but in that case the value is a callable. " +"Consider the following code::" +msgstr "" +"一般而言这是无法实现的,因为对象并不存在真正的名称。赋值本质上是把某个名称绑定到某个值上;``def`` 和 ``class`` " +"语句同样如此,只是值换成了某个可调用对象。比如以下代码:" + +#: ../../faq/programming.rst:668 +msgid "" +">>> class A:\n" +"... pass\n" +"...\n" +">>> B = A\n" +">>> a = B()\n" +">>> b = a\n" +">>> print(b)\n" +"<__main__.A object at 0x16D07CC>\n" +">>> print(a)\n" +"<__main__.A object at 0x16D07CC>" +msgstr "" +">>> class A:\n" +"... pass\n" +"...\n" +">>> B = A\n" +">>> a = B()\n" +">>> b = a\n" +">>> print(b)\n" +"<__main__.A object at 0x16D07CC>\n" +">>> print(a)\n" +"<__main__.A object at 0x16D07CC>" + +#: ../../faq/programming.rst:679 +msgid "" +"Arguably the class has a name: even though it is bound to two names and " +"invoked through the name ``B`` the created instance is still reported as an " +"instance of class ``A``. However, it is impossible to say whether the " +"instance's name is ``a`` or ``b``, since both names are bound to the same " +"value." +msgstr "" +"可以不太严谨地说上述类有一个名称:即使它绑定了两个名称并通过名称 ``B`` 唤起所创建的实例仍将被报告为类 ``A`` " +"的实例。但是,没有办法肯定地说实例的名称是 ``a`` 还是 ``b``,因为这两个名称都被绑定到同一个值上了。" + +#: ../../faq/programming.rst:684 +msgid "" +"Generally speaking it should not be necessary for your code to \"know the " +"names\" of particular values. Unless you are deliberately writing " +"introspective programs, this is usually an indication that a change of " +"approach might be beneficial." +msgstr "代码一般没有必要去“知晓”某个值的名称。通常这种需求预示着还是改变方案为好,除非真的是要编写内审程序。" + +#: ../../faq/programming.rst:689 +msgid "" +"In comp.lang.python, Fredrik Lundh once gave an excellent analogy in answer " +"to this question:" +msgstr "在 comp.lang.python 中,Fredrik Lundh 在回答这样的问题时曾经给出过一个绝佳的类比:" + +#: ../../faq/programming.rst:692 +msgid "" +"The same way as you get the name of that cat you found on your porch: the " +"cat (object) itself cannot tell you its name, and it doesn't really care -- " +"so the only way to find out what it's called is to ask all your neighbours " +"(namespaces) if it's their cat (object)..." +msgstr "" +"这就像要知道家门口的那只猫的名字一样:猫(对象)自己不会说出它的名字,它根本就不在乎自己叫什么——所以唯一方法就是问一遍你所有的邻居(命名空间),这是不是他们家的猫(对象)……" + +#: ../../faq/programming.rst:697 +msgid "" +"....and don't be surprised if you'll find that it's known by many names, or " +"no name at all!" +msgstr "……并且如果你发现它有很多名字或根本没有名字,那也不必惊讶!" + +#: ../../faq/programming.rst:702 +msgid "What's up with the comma operator's precedence?" +msgstr "逗号运算符的优先级是什么?" + +#: ../../faq/programming.rst:704 +msgid "Comma is not an operator in Python. Consider this session::" +msgstr "逗号不是 Python 的运算符。请看以下例子:" + +#: ../../faq/programming.rst:706 +msgid "" +">>> \"a\" in \"b\", \"a\"\n" +"(False, 'a')" +msgstr "" +">>> \"a\" in \"b\", \"a\"\n" +"(False, 'a')" + +#: ../../faq/programming.rst:709 +msgid "" +"Since the comma is not an operator, but a separator between expressions the " +"above is evaluated as if you had entered::" +msgstr "由于逗号不是运算符,而只是表达式之间的分隔符,因此上述代码就相当于:" + +#: ../../faq/programming.rst:712 +msgid "(\"a\" in \"b\"), \"a\"" +msgstr "(\"a\" in \"b\"), \"a\"" + +#: ../../faq/programming.rst:714 +msgid "not::" +msgstr "而不是:" + +#: ../../faq/programming.rst:716 +msgid "\"a\" in (\"b\", \"a\")" +msgstr "\"a\" in (\"b\", \"a\")" + +#: ../../faq/programming.rst:718 +msgid "" +"The same is true of the various assignment operators (``=``, ``+=``, and so " +"on). They are not truly operators but syntactic delimiters in assignment " +"statements." +msgstr "对于各种赋值运算符 (``=``, ``+=`` 等等) 来说同样如此。 它们并非真正的运算符而是赋值语句中的语法分隔符。" + +#: ../../faq/programming.rst:723 +msgid "Is there an equivalent of C's \"?:\" ternary operator?" +msgstr "是否提供等价于 C 语言 \"?:\" 三目运算符的东西?" + +#: ../../faq/programming.rst:725 +msgid "Yes, there is. The syntax is as follows::" +msgstr "有的。语法如下:" + +#: ../../faq/programming.rst:727 +msgid "" +"[on_true] if [expression] else [on_false]\n" +"\n" +"x, y = 50, 25\n" +"small = x if x < y else y" +msgstr "" +"[on_true] if [expression] else [on_false]\n" +"\n" +"x, y = 50, 25\n" +"small = x if x < y else y" + +#: ../../faq/programming.rst:732 +msgid "" +"Before this syntax was introduced in Python 2.5, a common idiom was to use " +"logical operators::" +msgstr "在 Python 2.5 引入上述语法之前,通常的做法是使用逻辑运算符:" + +#: ../../faq/programming.rst:735 +msgid "[expression] and [on_true] or [on_false]" +msgstr "[expression] and [on_true] or [on_false]" + +#: ../../faq/programming.rst:737 +msgid "" +"However, this idiom is unsafe, as it can give wrong results when *on_true* " +"has a false boolean value. Therefore, it is always better to use the ``... " +"if ... else ...`` form." +msgstr "" +"然而这种做法并不保险,因为当 *on_true* 为布尔值“假”时,结果将会出错。所以肯定还是采用 ``... if ... else ...`` " +"形式为妙。" + +#: ../../faq/programming.rst:743 +msgid "Is it possible to write obfuscated one-liners in Python?" +msgstr "是否可以用 Python 编写让人眼晕的单行程序?" + +#: ../../faq/programming.rst:745 +msgid "" +"Yes. Usually this is done by nesting :keyword:`lambda` within " +":keyword:`!lambda`. See the following three examples, slightly adapted from" +" Ulf Bartelt::" +msgstr "" +"可以。这一般是通过在 :keyword:`!lambda` 中嵌套 :keyword:`lambda` 来实现的。请参阅以下三个示例,它们是基于 Ulf" +" Bartelt 的代码改写的::" + +#: ../../faq/programming.rst:748 +msgid "" +"from functools import reduce\n" +"\n" +"# Primes < 1000\n" +"print(list(filter(None,map(lambda y:y*reduce(lambda x,y:x*y!=0,\n" +"map(lambda x,y=y:y%x,range(2,int(pow(y,0.5)+1))),1),range(2,1000)))))\n" +"\n" +"# First 10 Fibonacci numbers\n" +"print(list(map(lambda x,f=lambda x,f:(f(x-1,f)+f(x-2,f)) if x>1 else 1:\n" +"f(x,f), range(10))))\n" +"\n" +"# Mandelbrot set\n" +"print((lambda Ru,Ro,Iu,Io,IM,Sx,Sy:reduce(lambda x,y:x+'\\n'+y,map(lambda y,\n" +"Iu=Iu,Io=Io,Ru=Ru,Ro=Ro,Sy=Sy,L=lambda yc,Iu=Iu,Io=Io,Ru=Ru,Ro=Ro,i=IM,\n" +"Sx=Sx,Sy=Sy:reduce(lambda x,y:x+y,map(lambda x,xc=Ru,yc=yc,Ru=Ru,Ro=Ro,\n" +"i=i,Sx=Sx,F=lambda xc,yc,x,y,k,f=lambda xc,yc,x,y,k,f:(k<=0)or (x*x+y*y\n" +">=4.0) or 1+f(xc,yc,x*x-y*y+xc,2.0*x*y+yc,k-1,f):f(xc,yc,x,y,k,f):chr(\n" +"64+F(Ru+x*(Ro-Ru)/Sx,yc,0,0,i)),range(Sx))):L(Iu+y*(Io-Iu)/Sy),range(Sy\n" +"))))(-2.1, 0.7, -1.2, 1.2, 30, 80, 24))\n" +"# \\___ ___/ \\___ ___/ | | |__ lines on screen\n" +"# V V | |______ columns on screen\n" +"# | | |__________ maximum of \"iterations\"\n" +"# | |_________________ range on y axis\n" +"# |____________________________ range on x axis" +msgstr "" +"from functools import reduce\n" +"\n" +"# < 1000 的质数\n" +"print(list(filter(None,map(lambda y:y*reduce(lambda x,y:x*y!=0,\n" +"map(lambda x,y=y:y%x,range(2,int(pow(y,0.5)+1))),1),range(2,1000)))))\n" +"\n" +"# 前 10 个斐波那契数字\n" +"print(list(map(lambda x,f=lambda x,f:(f(x-1,f)+f(x-2,f)) if x>1 else 1:\n" +"f(x,f), range(10))))\n" +"\n" +"# 曼德布罗集\n" +"print((lambda Ru,Ro,Iu,Io,IM,Sx,Sy:reduce(lambda x,y:x+'\\n'+y,map(lambda y,\n" +"Iu=Iu,Io=Io,Ru=Ru,Ro=Ro,Sy=Sy,L=lambda yc,Iu=Iu,Io=Io,Ru=Ru,Ro=Ro,i=IM,\n" +"Sx=Sx,Sy=Sy:reduce(lambda x,y:x+y,map(lambda x,xc=Ru,yc=yc,Ru=Ru,Ro=Ro,\n" +"i=i,Sx=Sx,F=lambda xc,yc,x,y,k,f=lambda xc,yc,x,y,k,f:(k<=0)or (x*x+y*y\n" +">=4.0) or 1+f(xc,yc,x*x-y*y+xc,2.0*x*y+yc,k-1,f):f(xc,yc,x,y,k,f):chr(\n" +"64+F(Ru+x*(Ro-Ru)/Sx,yc,0,0,i)),range(Sx))):L(Iu+y*(Io-Iu)/Sy),range(Sy\n" +"))))(-2.1, 0.7, -1.2, 1.2, 30, 80, 24))\n" +"# \\___ ___/ \\___ ___/ | | |__ 屏幕上的行\n" +"# V V | |______ 屏幕上的列\n" +"# | | |__________“迭代”的最大次数\n" +"# | |_________________ y 轴上的取值范围\n" +"# |____________________________ x 轴上的取值范围" + +#: ../../faq/programming.rst:772 +msgid "Don't try this at home, kids!" +msgstr "请不要在家里尝试,骚年!" + +#: ../../faq/programming.rst:778 +msgid "What does the slash(/) in the parameter list of a function mean?" +msgstr "函数形参列表中的斜杠(/)是什么意思?" + +#: ../../faq/programming.rst:780 +msgid "" +"A slash in the argument list of a function denotes that the parameters prior" +" to it are positional-only. Positional-only parameters are the ones without" +" an externally usable name. Upon calling a function that accepts " +"positional-only parameters, arguments are mapped to parameters based solely " +"on their position. For example, :func:`divmod` is a function that accepts " +"positional-only parameters. Its documentation looks like this::" +msgstr "" +"函数参数列表中的斜杠表示在它之前的形参都是仅限位置形参。仅限位置形参没有可供外部使用的名称。在调用接受仅限位置形参的函数时,参数将只根据其位置被映射到形参上。例如,:func:`divmod`" +" 就是一个接受仅限位置形参的函数。它的文档说明是这样的::" + +#: ../../faq/programming.rst:787 +msgid "" +">>> help(divmod)\n" +"Help on built-in function divmod in module builtins:\n" +"\n" +"divmod(x, y, /)\n" +" Return the tuple (x//y, x%y). Invariant: div*y + mod == x." +msgstr "" +">>> help(divmod)\n" +"Help on built-in function divmod in module builtins:\n" +"\n" +"divmod(x, y, /)\n" +" Return the tuple (x//y, x%y). Invariant: div*y + mod == x." + +#: ../../faq/programming.rst:793 +msgid "" +"The slash at the end of the parameter list means that both parameters are " +"positional-only. Thus, calling :func:`divmod` with keyword arguments would " +"lead to an error::" +msgstr "形参列表尾部的斜杠说明,两个形参都是仅限位置形参。因此,用关键字参数调用 :func:`divmod` 将会引发错误:" + +#: ../../faq/programming.rst:797 +msgid "" +">>> divmod(x=3, y=4)\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"TypeError: divmod() takes no keyword arguments" +msgstr "" +">>> divmod(x=3, y=4)\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"TypeError: divmod() takes no keyword arguments" + +#: ../../faq/programming.rst:804 +msgid "Numbers and strings" +msgstr "数字和字符串" + +#: ../../faq/programming.rst:807 +msgid "How do I specify hexadecimal and octal integers?" +msgstr "如何给出十六进制和八进制整数?" + +#: ../../faq/programming.rst:809 +msgid "" +"To specify an octal digit, precede the octal value with a zero, and then a " +"lower or uppercase \"o\". For example, to set the variable \"a\" to the " +"octal value \"10\" (8 in decimal), type::" +msgstr "" +"要给出八进制数,需在八进制数值前面加上一个零和一个小写或大写字母 \"o\" 作为前缀。例如,要将变量 \"a\" 设为八进制的 \"10\" " +"(十进制的 8),写法如下:" + +#: ../../faq/programming.rst:813 +msgid "" +">>> a = 0o10\n" +">>> a\n" +"8" +msgstr "" +">>> a = 0o10\n" +">>> a\n" +"8" + +#: ../../faq/programming.rst:817 +msgid "" +"Hexadecimal is just as easy. Simply precede the hexadecimal number with a " +"zero, and then a lower or uppercase \"x\". Hexadecimal digits can be " +"specified in lower or uppercase. For example, in the Python interpreter::" +msgstr "" +"十六进制数也很简单。只要在十六进制数前面加上一个零和一个小写或大写的字母 \"x\"。十六进制数中的字母可以为大写或小写。比如在 Python " +"解释器中输入:" + +#: ../../faq/programming.rst:821 +msgid "" +">>> a = 0xa5\n" +">>> a\n" +"165\n" +">>> b = 0XB2\n" +">>> b\n" +"178" +msgstr "" +">>> a = 0xa5\n" +">>> a\n" +"165\n" +">>> b = 0XB2\n" +">>> b\n" +"178" + +#: ../../faq/programming.rst:830 +msgid "Why does -22 // 10 return -3?" +msgstr "为什么 -22 // 10 会返回 -3?" + +#: ../../faq/programming.rst:832 +msgid "" +"It's primarily driven by the desire that ``i % j`` have the same sign as " +"``j``. If you want that, and also want::" +msgstr "这主要是为了让 ``i % j`` 的正负与 ``j`` 一致,如果期望如此,且期望如下等式成立:" + +#: ../../faq/programming.rst:835 +msgid "i == (i // j) * j + (i % j)" +msgstr "i == (i // j) * j + (i % j)" + +#: ../../faq/programming.rst:837 +msgid "" +"then integer division has to return the floor. C also requires that " +"identity to hold, and then compilers that truncate ``i // j`` need to make " +"``i % j`` have the same sign as ``i``." +msgstr "" +"那么整除就必须返回向下取整的结果。C 语言同样要求保持这种一致性,于是编译器在截断 ``i // j`` 的结果时需要让 ``i % j`` 的正负与 " +"``i`` 一致。" + +#: ../../faq/programming.rst:841 +msgid "" +"There are few real use cases for ``i % j`` when ``j`` is negative. When " +"``j`` is positive, there are many, and in virtually all of them it's more " +"useful for ``i % j`` to be ``>= 0``. If the clock says 10 now, what did it " +"say 200 hours ago? ``-190 % 12 == 2`` is useful; ``-190 % 12 == -10`` is a " +"bug waiting to bite." +msgstr "" +"对于 ``i % j`` 来说 ``j`` 为负值的应用场景实际上是非常少的。而 ``j`` 为正值的情况则非常多,并且实际上在所有情况下让 ``i %" +" j`` 的结果为 ``>= 0`` 会更有用处。如果现在时间为 10 时,那么 200 小时前应是几时?``-190 % 12 == 2`` " +"是有用处的;``-190 % 12 == -10`` 则是一个潜伏的 bug。" + +#: ../../faq/programming.rst:849 +msgid "How do I get int literal attribute instead of SyntaxError?" +msgstr "我如何获得 int 字面属性而不是 SyntaxError?" + +#: ../../faq/programming.rst:851 +msgid "" +"Trying to lookup an ``int`` literal attribute in the normal manner gives a " +":exc:`SyntaxError` because the period is seen as a decimal point::" +msgstr "尝试以常规方式查找一个 ``int`` 字面值属性会发生 :exc:`SyntaxError`,因为句点会被当作是小数点::" + +#: ../../faq/programming.rst:854 +msgid "" +">>> 1.__class__\n" +" File \"\", line 1\n" +" 1.__class__\n" +" ^\n" +"SyntaxError: invalid decimal literal" +msgstr "" +">>> 1.__class__\n" +" File \"\", line 1\n" +" 1.__class__\n" +" ^\n" +"SyntaxError: invalid decimal literal" + +#: ../../faq/programming.rst:860 +msgid "" +"The solution is to separate the literal from the period with either a space " +"or parentheses." +msgstr "解决办法是用空格或括号将字面值与句点分开。" + +#: ../../faq/programming.rst:870 +msgid "How do I convert a string to a number?" +msgstr "如何将字符串转换为数字?" + +#: ../../faq/programming.rst:872 +msgid "" +"For integers, use the built-in :func:`int` type constructor, for example, " +"``int('144') == 144``. Similarly, :func:`float` converts to a floating-" +"point number, for example, ``float('144') == 144.0``." +msgstr "" +"对于整数,可使用内置的 :func:`int` 类型构造器,例如 ``int('144') == 144``。 类似地,可使用 " +":func:`float` 转换为浮点数,例如 ``float('144') == 144.0``。" + +#: ../../faq/programming.rst:876 +msgid "" +"By default, these interpret the number as decimal, so that ``int('0144') == " +"144`` holds true, and ``int('0x144')`` raises :exc:`ValueError`. " +"``int(string, base)`` takes the base to convert from as a second optional " +"argument, so ``int( '0x144', 16) == 324``. If the base is specified as 0, " +"the number is interpreted using Python's rules: a leading '0o' indicates " +"octal, and '0x' indicates a hex number." +msgstr "" +"默认情况下,这些操作会将数字按十进制来解读,因此 ``int('0144') == 144`` 为真值,而 ``int('0x144')`` 会引发 " +":exc:`ValueError`。``int(string, base)`` 接受第二个可选参数指定转换的基数,例如 ``int( '0x144', " +"16) == 324``。如果指定基数为 0,则按 Python 规则解读数字:前缀 '0o' 表示八进制,而 '0x' 表示十六进制。" + +#: ../../faq/programming.rst:883 +msgid "" +"Do not use the built-in function :func:`eval` if all you need is to convert " +"strings to numbers. :func:`eval` will be significantly slower and it " +"presents a security risk: someone could pass you a Python expression that " +"might have unwanted side effects. For example, someone could pass " +"``__import__('os').system(\"rm -rf $HOME\")`` which would erase your home " +"directory." +msgstr "" +"如果只是想把字符串转为数字,请不要使用内置函数 :func:`eval`。:func:`eval` " +"的速度慢很多且存在安全风险:别人可能会传入带有不良副作用的 Python 表达式。比如可能会传入 " +"``__import__('os').system(\"rm -rf $HOME\")``,这会把 home 目录给删了。" + +#: ../../faq/programming.rst:890 +msgid "" +":func:`eval` also has the effect of interpreting numbers as Python " +"expressions, so that, for example, ``eval('09')`` gives a syntax error " +"because Python does not allow leading '0' in a decimal number (except '0')." +msgstr "" +":func:`eval` 还有把数字解读为 Python 表达式的效果,因此,举例来说,``eval('09')`` 将导致语法错误因为 Python " +"不允许十进制数以 '0' 打头(除了 '0' 本身)。" + +#: ../../faq/programming.rst:896 +msgid "How do I convert a number to a string?" +msgstr "如何将数字转换为字符串?" + +#: ../../faq/programming.rst:898 +msgid "" +"For example, to convert the number ``144`` to the string ``'144'``, use the " +"built-in type constructor :func:`str`. If you want a hexadecimal or octal " +"representation, use the built-in functions :func:`hex` or :func:`oct`. For " +"fancy formatting, see the :ref:`f-strings` and :ref:`formatstrings` " +"sections. For example, ``\"{:04d}\".format(144)`` yields ``'0144'`` and " +"``\"{:.3f}\".format(1.0/3.0)`` yields ``'0.333'``." +msgstr "" +"例如,要把数字 ``144`` 转换为字符串 ``'144'``,可使用内置类型构造器 " +":func:`str`。如果你需要十六进制或八进制表示形式,可使用内置函数 :func:`hex` 或 " +":func:`oct`。更复杂的格式化方式,请参阅 :ref:`f-strings` 和 :ref:`formatstrings` 等章节。 " +"例如,``\"{:04d}\".format(144)`` 将产生 ``'0144'`` 而 " +"``\"{:.3f}\".format(1.0/3.0)`` 将产生 ``'0.333'``。" + +#: ../../faq/programming.rst:907 +msgid "How do I modify a string in place?" +msgstr "如何修改字符串?" + +#: ../../faq/programming.rst:909 +msgid "" +"You can't, because strings are immutable. In most situations, you should " +"simply construct a new string from the various parts you want to assemble it" +" from. However, if you need an object with the ability to modify in-place " +"Unicode data, try using an :class:`io.StringIO` object or the :mod:`array` " +"module::" +msgstr "" +"不可以,因为字符串是不可变对象。在大多数情况下,只要将各个部分组合起来构造出一个新字符串即可。如果需要一个能原地修改 Unicode " +"数据的对象,可以尝试使用 :class:`io.StringIO` 对象或 :mod:`array` 模块::" + +#: ../../faq/programming.rst:915 +msgid "" +">>> import io\n" +">>> s = \"Hello, world\"\n" +">>> sio = io.StringIO(s)\n" +">>> sio.getvalue()\n" +"'Hello, world'\n" +">>> sio.seek(7)\n" +"7\n" +">>> sio.write(\"there!\")\n" +"6\n" +">>> sio.getvalue()\n" +"'Hello, there!'\n" +"\n" +">>> import array\n" +">>> a = array.array('w', s)\n" +">>> print(a)\n" +"array('w', 'Hello, world')\n" +">>> a[0] = 'y'\n" +">>> print(a)\n" +"array('w', 'yello, world')\n" +">>> a.tounicode()\n" +"'yello, world'" +msgstr "" +">>> import io\n" +">>> s = \"Hello, world\"\n" +">>> sio = io.StringIO(s)\n" +">>> sio.getvalue()\n" +"'Hello, world'\n" +">>> sio.seek(7)\n" +"7\n" +">>> sio.write(\"there!\")\n" +"6\n" +">>> sio.getvalue()\n" +"'Hello, there!'\n" +"\n" +">>> import array\n" +">>> a = array.array('w', s)\n" +">>> print(a)\n" +"array('w', 'Hello, world')\n" +">>> a[0] = 'y'\n" +">>> print(a)\n" +"array('w', 'yello, world')\n" +">>> a.tounicode()\n" +"'yello, world'" + +#: ../../faq/programming.rst:939 +msgid "How do I use strings to call functions/methods?" +msgstr "如何使用字符串调用函数/方法?" + +#: ../../faq/programming.rst:941 +msgid "There are various techniques." +msgstr "有多种技巧可供选择。" + +#: ../../faq/programming.rst:943 +msgid "" +"The best is to use a dictionary that maps strings to functions. The primary" +" advantage of this technique is that the strings do not need to match the " +"names of the functions. This is also the primary technique used to emulate " +"a case construct::" +msgstr "最好的做法是采用一个字典,将字符串映射为函数。其主要优势就是字符串不必与函数名一样。这也是用来模拟 case 结构的主要技巧:" + +#: ../../faq/programming.rst:948 +msgid "" +"def a():\n" +" pass\n" +"\n" +"def b():\n" +" pass\n" +"\n" +"dispatch = {'go': a, 'stop': b} # Note lack of parens for funcs\n" +"\n" +"dispatch[get_input()]() # Note trailing parens to call function" +msgstr "" +"def a():\n" +" pass\n" +"\n" +"def b():\n" +" pass\n" +"\n" +"dispatch = {'go': a, 'stop': b} # 注意函数名后不带圆括号\n" +"\n" +"dispatch[get_input()]() # 注意末尾要带圆括号以调用函数" + +#: ../../faq/programming.rst:958 +msgid "Use the built-in function :func:`getattr`::" +msgstr "利用内置函数 :func:`getattr`:" + +#: ../../faq/programming.rst:960 +msgid "" +"import foo\n" +"getattr(foo, 'bar')()" +msgstr "" +"import foo\n" +"getattr(foo, 'bar')()" + +#: ../../faq/programming.rst:963 +msgid "" +"Note that :func:`getattr` works on any object, including classes, class " +"instances, modules, and so on." +msgstr "请注意 :func:`getattr` 可用于任何对象,包括类、类实例、模块等等。" + +#: ../../faq/programming.rst:966 +msgid "This is used in several places in the standard library, like this::" +msgstr "标准库就多次使用了这个技巧,例如:" + +#: ../../faq/programming.rst:968 +msgid "" +"class Foo:\n" +" def do_foo(self):\n" +" ...\n" +"\n" +" def do_bar(self):\n" +" ...\n" +"\n" +"f = getattr(foo_instance, 'do_' + opname)\n" +"f()" +msgstr "" +"class Foo:\n" +" def do_foo(self):\n" +" ...\n" +"\n" +" def do_bar(self):\n" +" ...\n" +"\n" +"f = getattr(foo_instance, 'do_' + opname)\n" +"f()" + +#: ../../faq/programming.rst:979 +msgid "Use :func:`locals` to resolve the function name::" +msgstr "用 :func:`locals` 解析出函数名:" + +#: ../../faq/programming.rst:981 +msgid "" +"def myFunc():\n" +" print(\"hello\")\n" +"\n" +"fname = \"myFunc\"\n" +"\n" +"f = locals()[fname]\n" +"f()" +msgstr "" +"def myFunc():\n" +" print(\"hello\")\n" +"\n" +"fname = \"myFunc\"\n" +"\n" +"f = locals()[fname]\n" +"f()" + +#: ../../faq/programming.rst:991 +msgid "" +"Is there an equivalent to Perl's ``chomp()`` for removing trailing newlines " +"from strings?" +msgstr "是否有 Perl 的 ``chomp()`` 等价物用于从字符串中移除末尾换行符?" + +#: ../../faq/programming.rst:993 +msgid "" +"You can use ``S.rstrip(\"\\r\\n\")`` to remove all occurrences of any line " +"terminator from the end of the string ``S`` without removing other trailing " +"whitespace. If the string ``S`` represents more than one line, with several" +" empty lines at the end, the line terminators for all the blank lines will " +"be removed::" +msgstr "" +"可以使用 ``S.rstrip(\"\\r\\n\")`` 从字符串 ``S`` 的末尾删除所有的换行符,而不删除其他尾随空格。如果字符串 ``S`` " +"表示多行,且末尾有几个空行,则将删除所有空行的换行符:" + +#: ../../faq/programming.rst:999 +msgid "" +">>> lines = (\"line 1 \\r\\n\"\n" +"... \"\\r\\n\"\n" +"... \"\\r\\n\")\n" +">>> lines.rstrip(\"\\n\\r\")\n" +"'line 1 '" +msgstr "" +">>> lines = (\"line 1 \\r\\n\"\n" +"... \"\\r\\n\"\n" +"... \"\\r\\n\")\n" +">>> lines.rstrip(\"\\n\\r\")\n" +"'line 1 '" + +#: ../../faq/programming.rst:1005 +msgid "" +"Since this is typically only desired when reading text one line at a time, " +"using ``S.rstrip()`` this way works well." +msgstr "由于通常只在一次读取一行文本时才需要这样做,所以使用 ``S.rstrip()`` 这种方式工作得很好。" + +#: ../../faq/programming.rst:1010 +msgid "Is there a ``scanf()`` or ``sscanf()`` equivalent?" +msgstr "是否有 ``scanf()`` 或 ``sscanf()`` 的等价物?" + +#: ../../faq/programming.rst:1012 +msgid "Not as such." +msgstr "没有。" + +#: ../../faq/programming.rst:1014 +msgid "" +"For simple input parsing, the easiest approach is usually to split the line " +"into whitespace-delimited words using the :meth:`~str.split` method of " +"string objects and then convert decimal strings to numeric values using " +":func:`int` or :func:`float`. :meth:`!split` supports an optional \"sep\" " +"parameter which is useful if the line uses something other than whitespace " +"as a separator." +msgstr "" +"对于简单的输入解析,最简单的方法通常是使用字符串对象的 :meth:`~str.split` 方法将行分割为空白符分隔的单词,然后使用 " +":func:`int` 或 :func:`float` 将十进制字符串转换为数字值。:meth:`!split` 支持可选的 \"sep\" 形参 " +",如果行中使用空白符以外的其他分隔符,可以使用该参数。" + +#: ../../faq/programming.rst:1020 +msgid "" +"For more complicated input parsing, regular expressions are more powerful " +"than C's ``sscanf`` and better suited for the task." +msgstr "对于更复杂的输入解析,正则表达式相比 C 的 ``sscanf`` 更为强大也更为适合。" + +#: ../../faq/programming.rst:1025 +msgid "What does ``UnicodeDecodeError`` or ``UnicodeEncodeError`` error mean?" +msgstr "``UnicodeDecodeError`` 或 ``UnicodeEncodeError`` 错误的含义是什么?" + +#: ../../faq/programming.rst:1027 +msgid "See the :ref:`unicode-howto`." +msgstr "见 :ref:`unicode-howto`" + +#: ../../faq/programming.rst:1033 +msgid "Can I end a raw string with an odd number of backslashes?" +msgstr "我能以奇数个反斜杠来结束一个原始字符串吗?" + +#: ../../faq/programming.rst:1035 +msgid "" +"A raw string ending with an odd number of backslashes will escape the " +"string's quote::" +msgstr "以奇数个反斜杠结尾的原始字符串将会转义用于标记字符串的引号::" + +#: ../../faq/programming.rst:1037 +msgid "" +">>> r'C:\\this\\will\\not\\work\\'\n" +" File \"\", line 1\n" +" r'C:\\this\\will\\not\\work\\'\n" +" ^\n" +"SyntaxError: unterminated string literal (detected at line 1)" +msgstr "" +">>> r'C:\\this\\will\\not\\work\\'\n" +" File \"\", line 1\n" +" r'C:\\this\\will\\not\\work\\'\n" +" ^\n" +"SyntaxError: unterminated string literal (detected at line 1)" + +#: ../../faq/programming.rst:1043 +msgid "" +"There are several workarounds for this. One is to use regular strings and " +"double the backslashes::" +msgstr "有几种绕过此问题的办法。其中之一是使用常规字符串以及双反斜杠::" + +#: ../../faq/programming.rst:1046 +msgid "" +">>> 'C:\\\\this\\\\will\\\\work\\\\'\n" +"'C:\\\\this\\\\will\\\\work\\\\'" +msgstr "" +">>> 'C:\\\\this\\\\will\\\\work\\\\'\n" +"'C:\\\\this\\\\will\\\\work\\\\'" + +#: ../../faq/programming.rst:1049 +msgid "" +"Another is to concatenate a regular string containing an escaped backslash " +"to the raw string::" +msgstr "另一种办法是将一个包含被转义反斜杠的常规字符串拼接到原始字符串上::" + +#: ../../faq/programming.rst:1052 +msgid "" +">>> r'C:\\this\\will\\work' '\\\\'\n" +"'C:\\\\this\\\\will\\\\work\\\\'" +msgstr "" +">>> r'C:\\this\\will\\work' '\\\\'\n" +"'C:\\\\this\\\\will\\\\work\\\\'" + +#: ../../faq/programming.rst:1055 +msgid "" +"It is also possible to use :func:`os.path.join` to append a backslash on " +"Windows::" +msgstr "在 Windows 上还可以使用 :func:`os.path.join` 来添加反斜杠::" + +#: ../../faq/programming.rst:1057 +msgid "" +">>> os.path.join(r'C:\\this\\will\\work', '')\n" +"'C:\\\\this\\\\will\\\\work\\\\'" +msgstr "" +">>> os.path.join(r'C:\\this\\will\\work', '')\n" +"'C:\\\\this\\\\will\\\\work\\\\'" + +#: ../../faq/programming.rst:1060 +msgid "" +"Note that while a backslash will \"escape\" a quote for the purposes of " +"determining where the raw string ends, no escaping occurs when interpreting " +"the value of the raw string. That is, the backslash remains present in the " +"value of the raw string::" +msgstr "" +"请注意虽然在确定原始字符串的结束位置时反斜杠会对引号进行“转义“,但在解析原始字符串的值时并不会发生转义。也就是说,反斜杠会被保留在原始字符串的值中::" + +#: ../../faq/programming.rst:1065 +msgid "" +">>> r'backslash\\'preserved'\n" +"\"backslash\\\\'preserved\"" +msgstr "" +">>> r'backslash\\'preserved'\n" +"\"backslash\\\\'preserved\"" + +#: ../../faq/programming.rst:1068 +msgid "Also see the specification in the :ref:`language reference `." +msgstr "另请参阅 :ref:`语言参考 ` 中的规范说明。" + +#: ../../faq/programming.rst:1072 +msgid "Performance" +msgstr "性能" + +#: ../../faq/programming.rst:1075 +msgid "My program is too slow. How do I speed it up?" +msgstr "我的程序太慢了。该如何加快速度?" + +#: ../../faq/programming.rst:1077 +msgid "" +"That's a tough one, in general. First, here is a list of things to remember" +" before diving further:" +msgstr "总的来说,这是个棘手的问题。 在继续深究之前,首先要记住下列事项:" + +#: ../../faq/programming.rst:1080 +msgid "" +"Performance characteristics vary across Python implementations. This FAQ " +"focuses on :term:`CPython`." +msgstr "不同的 Python 实现具有不同的性能特点。本 FAQ 着重解答的是 :term:`CPython`。" + +#: ../../faq/programming.rst:1082 +msgid "" +"Behaviour can vary across operating systems, especially when talking about " +"I/O or multi-threading." +msgstr "不同操作系统可能会有不同表现,尤其是涉及 I/O 和多线程时。" + +#: ../../faq/programming.rst:1084 +msgid "" +"You should always find the hot spots in your program *before* attempting to " +"optimize any code (see the :mod:`profile` module)." +msgstr "在尝试优化代码 *之前* ,务必要先找出程序中的热点(请参阅 :mod:`profile` 模块)。" + +#: ../../faq/programming.rst:1086 +msgid "" +"Writing benchmark scripts will allow you to iterate quickly when searching " +"for improvements (see the :mod:`timeit` module)." +msgstr "编写基准测试脚本,在寻求性能提升的过程中就能实现快速迭代(请参阅 :mod:`timeit` 模块)。" + +#: ../../faq/programming.rst:1088 +msgid "" +"It is highly recommended to have good code coverage (through unit testing or" +" any other technique) before potentially introducing regressions hidden in " +"sophisticated optimizations." +msgstr "强烈建议首先要保证足够高的代码测试覆盖率(通过单元测试或其他技术),因为复杂的优化有可能会导致代码回退。" + +#: ../../faq/programming.rst:1092 +msgid "" +"That being said, there are many tricks to speed up Python code. Here are " +"some general principles which go a long way towards reaching acceptable " +"performance levels:" +msgstr "话虽如此,Python 代码的提速还是有很多技巧的。以下列出了一些普适性的原则,对于让性能达到可接受的水平会有很大帮助:" + +#: ../../faq/programming.rst:1096 +msgid "" +"Making your algorithms faster (or changing to faster ones) can yield much " +"larger benefits than trying to sprinkle micro-optimization tricks all over " +"your code." +msgstr "相较于试图对全部代码铺开做微观优化,优化算法(或换用更快的算法)可以产出更大的收益。" + +#: ../../faq/programming.rst:1100 +msgid "" +"Use the right data structures. Study documentation for the :ref:`bltin-" +"types` and the :mod:`collections` module." +msgstr "使用正确的数据结构。参考 :ref:`bltin-types` 和 :mod:`collections` 模块的文档。" + +#: ../../faq/programming.rst:1103 +msgid "" +"When the standard library provides a primitive for doing something, it is " +"likely (although not guaranteed) to be faster than any alternative you may " +"come up with. This is doubly true for primitives written in C, such as " +"builtins and some extension types. For example, be sure to use either the " +":meth:`list.sort` built-in method or the related :func:`sorted` function to " +"do sorting (and see the :ref:`sortinghowto` for examples of moderately " +"advanced usage)." +msgstr "" +"如果标准库已为某些操作提供了基础函数,则可能(当然不能保证)比所有自编的函数都要快。对于用 C " +"语言编写的基础函数则更是如此,比如内置函数和一些扩展类型。例如,一定要用内置方法 :meth:`list.sort` 或 :func:`sorted` " +"函数进行排序 (某些高级用法的示例请参阅 :ref:`sortinghowto`)。" + +#: ../../faq/programming.rst:1111 +msgid "" +"Abstractions tend to create indirections and force the interpreter to work " +"more. If the levels of indirection outweigh the amount of useful work done," +" your program will be slower. You should avoid excessive abstraction, " +"especially under the form of tiny functions or methods (which are also often" +" detrimental to readability)." +msgstr "" +"抽象往往会造成中间层,并会迫使解释器执行更多的操作。如果抽象出来的中间层级太多,工作量超过了要完成的有效任务,那么程序就会被拖慢。应该避免过度的抽象,而且往往也会对可读性产生不利影响,特别是当函数或方法比较小的时候。" + +#: ../../faq/programming.rst:1117 +msgid "" +"If you have reached the limit of what pure Python can allow, there are tools" +" to take you further away. For example, `Cython `_ can " +"compile a slightly modified version of Python code into a C extension, and " +"can be used on many different platforms. Cython can take advantage of " +"compilation (and optional type annotations) to make your code significantly " +"faster than when interpreted. If you are confident in your C programming " +"skills, you can also :ref:`write a C extension module ` " +"yourself." +msgstr "" +"如果你已经达到纯 Python 允许的限制,那么有一些工具可以让你走得更远。例如,`Cython `_ " +"可以将稍加修改的 Python 代码版本编译为 C 扩展,并能在许多不同的平台上使用。Cython " +"可以利用编译(和可选的类型标注)来让你的代码显著快于解释运行时的速度。如果你对自己的 C 编程技能有信心,还可以自行 :ref:`编写 C 扩展模块 " +"`。" + +#: ../../faq/programming.rst:1127 +msgid "" +"The wiki page devoted to `performance tips " +"`_." +msgstr "" +"专门介绍 `性能提示 `_ 的 " +"wiki 页面。" + +#: ../../faq/programming.rst:1134 +msgid "What is the most efficient way to concatenate many strings together?" +msgstr "将多个字符串连接在一起的最有效方法是什么?" + +#: ../../faq/programming.rst:1136 +msgid "" +":class:`str` and :class:`bytes` objects are immutable, therefore " +"concatenating many strings together is inefficient as each concatenation " +"creates a new object. In the general case, the total runtime cost is " +"quadratic in the total string length." +msgstr "" +":class:`str` 和 :class:`bytes` " +"对象是不可变的,因此连接多个字符串的效率会很低,因为每次连接都会创建一个新的对象。一般情况下,总耗时与字符串总长是二次方的关系。" + +#: ../../faq/programming.rst:1141 +msgid "" +"To accumulate many :class:`str` objects, the recommended idiom is to place " +"them into a list and call :meth:`str.join` at the end::" +msgstr "如果要连接多个 :class:`str` 对象,通常推荐的方案是先全部放入列表,最后再调用 :meth:`str.join`:" + +#: ../../faq/programming.rst:1144 +msgid "" +"chunks = []\n" +"for s in my_strings:\n" +" chunks.append(s)\n" +"result = ''.join(chunks)" +msgstr "" +"chunks = []\n" +"for s in my_strings:\n" +" chunks.append(s)\n" +"result = ''.join(chunks)" + +#: ../../faq/programming.rst:1149 +msgid "(Another reasonably efficient idiom is to use :class:`io.StringIO`.)" +msgstr "(另一种合理且高效的做法是使用 :class:`io.StringIO`。)" + +#: ../../faq/programming.rst:1151 +msgid "" +"To accumulate many :class:`bytes` objects, the recommended idiom is to " +"extend a :class:`bytearray` object using in-place concatenation (the ``+=`` " +"operator)::" +msgstr "" +"如果要连接多个 :class:`bytes` 对象,推荐做法是用 :class:`bytearray` 对象的原地连接操作 (``+=`` 运算符) " +"追加数据:" + +#: ../../faq/programming.rst:1154 +msgid "" +"result = bytearray()\n" +"for b in my_bytes_objects:\n" +" result += b" +msgstr "" +"result = bytearray()\n" +"for b in my_bytes_objects:\n" +" result += b" + +#: ../../faq/programming.rst:1160 +msgid "Sequences (tuples/lists)" +msgstr "序列(元组/列表)" + +#: ../../faq/programming.rst:1163 +msgid "How do I convert between tuples and lists?" +msgstr "如何在元组和列表之间进行转换?" + +#: ../../faq/programming.rst:1165 +msgid "" +"The type constructor ``tuple(seq)`` converts any sequence (actually, any " +"iterable) into a tuple with the same items in the same order." +msgstr "类型构造器 ``tuple(seq)`` 可将任意序列(实际上是任意可迭代对象)转换为数据项和顺序均不变的元组。" + +#: ../../faq/programming.rst:1168 +msgid "" +"For example, ``tuple([1, 2, 3])`` yields ``(1, 2, 3)`` and ``tuple('abc')`` " +"yields ``('a', 'b', 'c')``. If the argument is a tuple, it does not make a " +"copy but returns the same object, so it is cheap to call :func:`tuple` when " +"you aren't sure that an object is already a tuple." +msgstr "" +"例如,``tuple([1, 2, 3])`` 会生成 ``(1, 2, 3)``,``tuple('abc')`` 则会生成 ``('a', 'b'," +" 'c')``。如果参数就是元组,则不会创建副本而是返回同一对象,因此如果无法确定某个对象是否为元组时,直接调用 :func:`tuple` " +"也没什么代价。" + +#: ../../faq/programming.rst:1173 +msgid "" +"The type constructor ``list(seq)`` converts any sequence or iterable into a " +"list with the same items in the same order. For example, ``list((1, 2, " +"3))`` yields ``[1, 2, 3]`` and ``list('abc')`` yields ``['a', 'b', 'c']``. " +"If the argument is a list, it makes a copy just like ``seq[:]`` would." +msgstr "" +"类型构造器 ``list(seq)`` 可将任意序列或可迭代对象转换为数据项和顺序均不变的列表。例如,``list((1, 2, 3))`` 会生成 " +"``[1, 2, 3]`` 而 ``list('abc')`` 则会生成 ``['a', 'b', 'c']``。如果参数即为列表,则会像 " +"``seq[:]`` 那样创建一个副本。" + +#: ../../faq/programming.rst:1180 +msgid "What's a negative index?" +msgstr "什么是负数索引?" + +#: ../../faq/programming.rst:1182 +msgid "" +"Python sequences are indexed with positive numbers and negative numbers. " +"For positive numbers 0 is the first index 1 is the second index and so " +"forth. For negative indices -1 is the last index and -2 is the penultimate " +"(next to last) index and so forth. Think of ``seq[-n]`` as the same as " +"``seq[len(seq)-n]``." +msgstr "" +"Python 序列的索引可以是正数或负数。索引为正数时,0 是第一个索引值,1 为第二个,依此类推。索引为负数时,-1 为倒数第一个索引值,-2 " +"为倒数第二个,依此类推。可以认为 ``seq[-n]`` 就相当于 ``seq[len(seq)-n]``。" + +#: ../../faq/programming.rst:1187 +msgid "" +"Using negative indices can be very convenient. For example ``S[:-1]`` is " +"all of the string except for its last character, which is useful for " +"removing the trailing newline from a string." +msgstr "使用负数序号有时会很方便。例如 ``S[:-1]`` 就是原字符串去掉最后一个字符,这可以用来移除某个字符串末尾的换行符。" + +#: ../../faq/programming.rst:1193 +msgid "How do I iterate over a sequence in reverse order?" +msgstr "序列如何以逆序遍历?" + +#: ../../faq/programming.rst:1195 +msgid "Use the :func:`reversed` built-in function::" +msgstr "使用内置函数 :func:`reversed`:" + +#: ../../faq/programming.rst:1197 +msgid "" +"for x in reversed(sequence):\n" +" ... # do something with x ..." +msgstr "" +"for x in reversed(sequence):\n" +" ... # 对 x 执行某些操作 ..." + +#: ../../faq/programming.rst:1200 +msgid "" +"This won't touch your original sequence, but build a new copy with reversed " +"order to iterate over." +msgstr "原序列不会变化,而是构建一个逆序的新副本以供遍历。" + +#: ../../faq/programming.rst:1205 +msgid "How do you remove duplicates from a list?" +msgstr "如何从列表中删除重复项?" + +#: ../../faq/programming.rst:1207 +msgid "See the Python Cookbook for a long discussion of many ways to do this:" +msgstr "许多完成此操作的的详细介绍,可参阅 Python Cookbook:" + +#: ../../faq/programming.rst:1209 +msgid "https://code.activestate.com/recipes/52560/" +msgstr "https://code.activestate.com/recipes/52560/" + +#: ../../faq/programming.rst:1211 +msgid "" +"If you don't mind reordering the list, sort it and then scan from the end of" +" the list, deleting duplicates as you go::" +msgstr "如果列表允许重新排序,不妨先对其排序,然后从列表末尾开始扫描,依次删除重复项:" + +#: ../../faq/programming.rst:1214 +msgid "" +"if mylist:\n" +" mylist.sort()\n" +" last = mylist[-1]\n" +" for i in range(len(mylist)-2, -1, -1):\n" +" if last == mylist[i]:\n" +" del mylist[i]\n" +" else:\n" +" last = mylist[i]" +msgstr "" +"if mylist:\n" +" mylist.sort()\n" +" last = mylist[-1]\n" +" for i in range(len(mylist)-2, -1, -1):\n" +" if last == mylist[i]:\n" +" del mylist[i]\n" +" else:\n" +" last = mylist[i]" + +#: ../../faq/programming.rst:1223 +msgid "" +"If all elements of the list may be used as set keys (that is, they are all " +":term:`hashable`) this is often faster::" +msgstr "如果列表的所有元素都能用作集合的键(也就是说,都是 :term:`hashable` 对象)那么这样做往往会更快::" + +#: ../../faq/programming.rst:1226 +msgid "mylist = list(set(mylist))" +msgstr "mylist = list(set(mylist))" + +#: ../../faq/programming.rst:1228 +msgid "" +"This converts the list into a set, thereby removing duplicates, and then " +"back into a list." +msgstr "以上操作会将列表转换为集合,从而删除重复项,然后返回成列表。" + +#: ../../faq/programming.rst:1233 +msgid "How do you remove multiple items from a list?" +msgstr "如何从列表移除多个条目?" + +#: ../../faq/programming.rst:1235 +msgid "" +"As with removing duplicates, explicitly iterating in reverse with a delete " +"condition is one possibility. However, it is easier and faster to use slice" +" replacement with an implicit or explicit forward iteration. Here are three " +"variations::" +msgstr "" +"对于移除重复条目,一种可能的做法是显式地设置删除条件执行反向迭代。不过,使用切片替换执行隐式或显式的前向迭代会更为方便快速。下面列出三种方式::" + +#: ../../faq/programming.rst:1240 +msgid "" +"mylist[:] = filter(keep_function, mylist)\n" +"mylist[:] = (x for x in mylist if keep_condition)\n" +"mylist[:] = [x for x in mylist if keep_condition]" +msgstr "" +"mylist[:] = filter(keep_function, mylist)\n" +"mylist[:] = (x for x in mylist if keep_condition)\n" +"mylist[:] = [x for x in mylist if keep_condition]" + +#: ../../faq/programming.rst:1244 +msgid "The list comprehension may be fastest." +msgstr "列表推导式可能是最快的。" + +#: ../../faq/programming.rst:1248 +msgid "How do you make an array in Python?" +msgstr "如何在 Python 中创建数组?" + +#: ../../faq/programming.rst:1250 +msgid "Use a list::" +msgstr "用列表:" + +#: ../../faq/programming.rst:1252 +msgid "[\"this\", 1, \"is\", \"an\", \"array\"]" +msgstr "[\"this\", 1, \"is\", \"an\", \"array\"]" + +#: ../../faq/programming.rst:1254 +msgid "" +"Lists are equivalent to C or Pascal arrays in their time complexity; the " +"primary difference is that a Python list can contain objects of many " +"different types." +msgstr "列表在时间复杂度方面相当于 C 或 Pascal 的数组;主要区别在于,Python 列表可以包含多种不同类型的对象。" + +#: ../../faq/programming.rst:1257 +msgid "" +"The ``array`` module also provides methods for creating arrays of fixed " +"types with compact representations, but they are slower to index than lists." +" Also note that `NumPy `_ and other third-party " +"packages define array-like structures with various characteristics as well." +msgstr "" +"``array`` 模块也提供了一些创建具有紧凑表示形式的固定类型数据的方法,但其索引速度要比列表慢。 另请注意 `NumPy " +"`_ 和其他一些第三方包也定义了一些各具特色的数组类结构体。" + +#: ../../faq/programming.rst:1263 +msgid "" +"To get Lisp-style linked lists, you can emulate *cons cells* using tuples::" +msgstr "要获得 Lisp 风格的列表,可以使用元组来模拟 *cons 单元*::" + +#: ../../faq/programming.rst:1265 +msgid "lisp_list = (\"like\", (\"this\", (\"example\", None) ) )" +msgstr "lisp_list = (\"like\", (\"this\", (\"example\", None) ) )" + +#: ../../faq/programming.rst:1267 +msgid "" +"If mutability is desired, you could use lists instead of tuples. Here the " +"analogue of a Lisp *car* is ``lisp_list[0]`` and the analogue of *cdr* is " +"``lisp_list[1]``. Only do this if you're sure you really need to, because " +"it's usually a lot slower than using Python lists." +msgstr "" +"如果需要可变特性,你可以用列表来代替元组。在这里模拟 Lisp *car* 的是 ``lisp_list[0]`` 而模拟 *cdr* 的是 " +"``lisp_list[1]``。只有在你确定真有需要时才这样做,因为这通常会比使用 Python 列表要慢上许多。" + +#: ../../faq/programming.rst:1276 +msgid "How do I create a multidimensional list?" +msgstr "如何创建多维列表?" + +#: ../../faq/programming.rst:1278 +msgid "You probably tried to make a multidimensional array like this::" +msgstr "多维数组或许会用以下方式建立:" + +#: ../../faq/programming.rst:1280 +msgid ">>> A = [[None] * 2] * 3" +msgstr ">>> A = [[None] * 2] * 3" + +#: ../../faq/programming.rst:1282 +msgid "This looks correct if you print it:" +msgstr "打印出来貌似没错:" + +#: ../../faq/programming.rst:1288 +msgid "" +">>> A\n" +"[[None, None], [None, None], [None, None]]" +msgstr "" +">>> A\n" +"[[None, None], [None, None], [None, None]]" + +#: ../../faq/programming.rst:1293 +msgid "But when you assign a value, it shows up in multiple places:" +msgstr "但如果给某一项赋值,结果会同时在多个位置体现出来:" + +#: ../../faq/programming.rst:1299 +msgid "" +">>> A[0][0] = 5\n" +">>> A\n" +"[[5, None], [5, None], [5, None]]" +msgstr "" +">>> A[0][0] = 5\n" +">>> A\n" +"[[5, None], [5, None], [5, None]]" + +#: ../../faq/programming.rst:1305 +msgid "" +"The reason is that replicating a list with ``*`` doesn't create copies, it " +"only creates references to the existing objects. The ``*3`` creates a list " +"containing 3 references to the same list of length two. Changes to one row " +"will show in all rows, which is almost certainly not what you want." +msgstr "" +"原因在于用 ``*`` 对列表执行重复操作并不会创建副本,而只是创建现有对象的引用。``*3`` 创建的是包含 3 " +"个引用的列表,每个引用指向的是同一个长度为 2 的列表。1 处改动会体现在所有地方,这一定不是应有的方案。" + +#: ../../faq/programming.rst:1310 +msgid "" +"The suggested approach is to create a list of the desired length first and " +"then fill in each element with a newly created list::" +msgstr "推荐做法是先创建一个所需长度的列表,然后将每个元素都填充为一个新建列表。" + +#: ../../faq/programming.rst:1313 +msgid "" +"A = [None] * 3\n" +"for i in range(3):\n" +" A[i] = [None] * 2" +msgstr "" +"A = [None] * 3\n" +"for i in range(3):\n" +" A[i] = [None] * 2" + +#: ../../faq/programming.rst:1317 +msgid "" +"This generates a list containing 3 different lists of length two. You can " +"also use a list comprehension::" +msgstr "以上生成了一个包含 3 个列表的列表,每个子列表的长度为 2。也可以采用列表推导式:" + +#: ../../faq/programming.rst:1320 +msgid "" +"w, h = 2, 3\n" +"A = [[None] * w for i in range(h)]" +msgstr "" +"w, h = 2, 3\n" +"A = [[None] * w for i in range(h)]" + +#: ../../faq/programming.rst:1323 +msgid "" +"Or, you can use an extension that provides a matrix datatype; `NumPy " +"`_ is the best known." +msgstr "或者,你也可以使用提供矩阵数据类型的扩展;其中最著名的是 `NumPy `_。" + +#: ../../faq/programming.rst:1328 +msgid "How do I apply a method or function to a sequence of objects?" +msgstr "我如何将一个方法或函数应用于由对象组成的序列?" + +#: ../../faq/programming.rst:1330 +msgid "" +"To call a method or function and accumulate the return values in a list, a " +":term:`list comprehension` is an elegant solution::" +msgstr "要调用一个方法或函数并将返回值累积到一个列表中,:term:`list comprehension` 是一种优雅的解决方案::" + +#: ../../faq/programming.rst:1333 +msgid "" +"result = [obj.method() for obj in mylist]\n" +"\n" +"result = [function(obj) for obj in mylist]" +msgstr "" +"result = [obj.method() for obj in mylist]\n" +"\n" +"result = [function(obj) for obj in mylist]" + +#: ../../faq/programming.rst:1337 +msgid "" +"To just run the method or function without saving the return values, a plain" +" :keyword:`for` loop will suffice::" +msgstr "如果只需运行方法或函数而不保存返回值,那么一个简单的 :keyword:`for` 循环就足够了::" + +#: ../../faq/programming.rst:1340 +msgid "" +"for obj in mylist:\n" +" obj.method()\n" +"\n" +"for obj in mylist:\n" +" function(obj)" +msgstr "" +"for obj in mylist:\n" +" obj.method()\n" +"\n" +"for obj in mylist:\n" +" function(obj)" + +#: ../../faq/programming.rst:1350 +msgid "" +"Why does a_tuple[i] += ['item'] raise an exception when the addition works?" +msgstr "为什么 a_tuple[i] += ['item'] 会引发异常?" + +#: ../../faq/programming.rst:1352 +msgid "" +"This is because of a combination of the fact that augmented assignment " +"operators are *assignment* operators, and the difference between mutable and" +" immutable objects in Python." +msgstr "这是由两个因素共同导致的,一是增强赋值运算符属于 *赋值* 运算符,二是 Python 可变和不可变对象之间的差别。" + +#: ../../faq/programming.rst:1356 +msgid "" +"This discussion applies in general when augmented assignment operators are " +"applied to elements of a tuple that point to mutable objects, but we'll use " +"a ``list`` and ``+=`` as our exemplar." +msgstr "只要元组的元素指向可变对象,这时对元素进行增强赋值,那么这里介绍的内容都是适用的。在此只以 ``list`` 和 ``+=`` 举例。" + +#: ../../faq/programming.rst:1360 +msgid "If you wrote::" +msgstr "如果你写成这样::" + +#: ../../faq/programming.rst:1362 +msgid "" +">>> a_tuple = (1, 2)\n" +">>> a_tuple[0] += 1\n" +"Traceback (most recent call last):\n" +" ...\n" +"TypeError: 'tuple' object does not support item assignment" +msgstr "" +">>> a_tuple = (1, 2)\n" +">>> a_tuple[0] += 1\n" +"Traceback (most recent call last):\n" +" ...\n" +"TypeError: 'tuple' object does not support item assignment" + +#: ../../faq/programming.rst:1368 +msgid "" +"The reason for the exception should be immediately clear: ``1`` is added to " +"the object ``a_tuple[0]`` points to (``1``), producing the result object, " +"``2``, but when we attempt to assign the result of the computation, ``2``, " +"to element ``0`` of the tuple, we get an error because we can't change what " +"an element of a tuple points to." +msgstr "" +"触发异常的原因显而易见: ``1`` 会与指向 (``1``) 的对象 ``a_tuple[0]`` 相加,生成结果对象 ``2``,但在试图将运算结果" +" ``2`` 赋值给元组的 ``0`` 号元素时就会报错,因为元组元素的指向无法更改。" + +#: ../../faq/programming.rst:1374 +msgid "" +"Under the covers, what this augmented assignment statement is doing is " +"approximately this::" +msgstr "其实在幕后,上述增强赋值语句的执行过程大致如下:" + +#: ../../faq/programming.rst:1377 +msgid "" +">>> result = a_tuple[0] + 1\n" +">>> a_tuple[0] = result\n" +"Traceback (most recent call last):\n" +" ...\n" +"TypeError: 'tuple' object does not support item assignment" +msgstr "" +">>> result = a_tuple[0] + 1\n" +">>> a_tuple[0] = result\n" +"Traceback (most recent call last):\n" +" ...\n" +"TypeError: 'tuple' object does not support item assignment" + +#: ../../faq/programming.rst:1383 +msgid "" +"It is the assignment part of the operation that produces the error, since a " +"tuple is immutable." +msgstr "由于元组是不可变的,因此赋值这步会引发错误。" + +#: ../../faq/programming.rst:1386 +msgid "When you write something like::" +msgstr "如果写成以下这样:" + +#: ../../faq/programming.rst:1388 +msgid "" +">>> a_tuple = (['foo'], 'bar')\n" +">>> a_tuple[0] += ['item']\n" +"Traceback (most recent call last):\n" +" ...\n" +"TypeError: 'tuple' object does not support item assignment" +msgstr "" +">>> a_tuple = (['foo'], 'bar')\n" +">>> a_tuple[0] += ['item']\n" +"Traceback (most recent call last):\n" +" ...\n" +"TypeError: 'tuple' object does not support item assignment" + +#: ../../faq/programming.rst:1394 +msgid "" +"The exception is a bit more surprising, and even more surprising is the fact" +" that even though there was an error, the append worked::" +msgstr "这时触发异常会令人略感惊讶,更让人吃惊的是虽有报错,但加法操作却生效了:" + +#: ../../faq/programming.rst:1397 +msgid "" +">>> a_tuple[0]\n" +"['foo', 'item']" +msgstr "" +">>> a_tuple[0]\n" +"['foo', 'item']" + +#: ../../faq/programming.rst:1400 +msgid "" +"To see why this happens, you need to know that (a) if an object implements " +"an :meth:`~object.__iadd__` magic method, it gets called when the ``+=`` " +"augmented assignment is executed, and its return value is what gets used in " +"the assignment statement; and (b) for lists, :meth:`!__iadd__` is equivalent" +" to calling :meth:`~sequence.extend` on the list and returning the list. " +"That's why we say that for lists, ``+=`` is a \"shorthand\" for " +":meth:`list.extend`::" +msgstr "" +"要明白为什么会这样,你需要知道 (a) 如果一个对象实现了 :meth:`~object.__iadd__` 魔术方法,那么它就会在执行 ``+=`` " +"增强赋值时被调用,并且其返回值将在赋值语句中被使用;(b) 对于列表而言,:meth:`!__iadd__` 等价于在列表上调用 " +":meth:`~sequence.extend` 并返回该列表。所以对于列表我们可以这样说,``+=`` 就是 :meth:`list.extend` " +"的“快捷方式”::" + +#: ../../faq/programming.rst:1408 +msgid "" +">>> a_list = []\n" +">>> a_list += [1]\n" +">>> a_list\n" +"[1]" +msgstr "" +">>> a_list = []\n" +">>> a_list += [1]\n" +">>> a_list\n" +"[1]" + +#: ../../faq/programming.rst:1413 +msgid "This is equivalent to::" +msgstr "这相当于:" + +#: ../../faq/programming.rst:1415 +msgid "" +">>> result = a_list.__iadd__([1])\n" +">>> a_list = result" +msgstr "" +">>> result = a_list.__iadd__([1])\n" +">>> a_list = result" + +#: ../../faq/programming.rst:1418 +msgid "" +"The object pointed to by a_list has been mutated, and the pointer to the " +"mutated object is assigned back to ``a_list``. The end result of the " +"assignment is a no-op, since it is a pointer to the same object that " +"``a_list`` was previously pointing to, but the assignment still happens." +msgstr "" +"a_list 所引用的对象已被修改,而引用被修改对象的指针又重新被赋值给 ``a_list``。赋值的最终结果没有变化,因为它是引用 " +"``a_list`` 之前所引用的同一对象的指针,但仍然发生了赋值操作。" + +#: ../../faq/programming.rst:1423 +msgid "Thus, in our tuple example what is happening is equivalent to::" +msgstr "因此,在此元组示例中,发生的事情等同于:" + +#: ../../faq/programming.rst:1425 +msgid "" +">>> result = a_tuple[0].__iadd__(['item'])\n" +">>> a_tuple[0] = result\n" +"Traceback (most recent call last):\n" +" ...\n" +"TypeError: 'tuple' object does not support item assignment" +msgstr "" +">>> result = a_tuple[0].__iadd__(['item'])\n" +">>> a_tuple[0] = result\n" +"Traceback (most recent call last):\n" +" ...\n" +"TypeError: 'tuple' object does not support item assignment" + +#: ../../faq/programming.rst:1431 +msgid "" +"The :meth:`!__iadd__` succeeds, and thus the list is extended, but even " +"though ``result`` points to the same object that ``a_tuple[0]`` already " +"points to, that final assignment still results in an error, because tuples " +"are immutable." +msgstr "" +":meth:`!__iadd__` 执行成功,因此列表得到了扩充,但是即使 ``result`` 是指向 ``a_tuple[0]`` " +"所指向的同一个对象,最后的赋值仍然会导致错误,因为元组是不可变的。" + +#: ../../faq/programming.rst:1437 +msgid "" +"I want to do a complicated sort: can you do a Schwartzian Transform in " +"Python?" +msgstr "我想做一个复杂的排序:能用 Python 进行施瓦茨变换吗?" + +#: ../../faq/programming.rst:1439 +msgid "" +"The technique, attributed to Randal Schwartz of the Perl community, sorts " +"the elements of a list by a metric which maps each element to its \"sort " +"value\". In Python, use the ``key`` argument for the :meth:`list.sort` " +"method::" +msgstr "" +"归功于 Perl 社区的 Randal Schwartz,该技术根据度量值对列表进行排序,该度量值将每个元素映射为“顺序值”。在 Python " +"中,请利用 :meth:`list.sort` 方法的 ``key`` 参数:" + +#: ../../faq/programming.rst:1443 +msgid "" +"Isorted = L[:]\n" +"Isorted.sort(key=lambda s: int(s[10:15]))" +msgstr "" +"Isorted = L[:]\n" +"Isorted.sort(key=lambda s: int(s[10:15]))" + +#: ../../faq/programming.rst:1448 +msgid "How can I sort one list by values from another list?" +msgstr "如何根据另一个列表的值对某列表进行排序?" + +#: ../../faq/programming.rst:1450 +msgid "" +"Merge them into an iterator of tuples, sort the resulting list, and then " +"pick out the element you want." +msgstr "将它们合并到元组的迭代器中,对结果列表进行排序,然后选出你想要的元素。" + +#: ../../faq/programming.rst:1465 +msgid "Objects" +msgstr "对象" + +#: ../../faq/programming.rst:1468 +msgid "What is a class?" +msgstr "什么是类?" + +#: ../../faq/programming.rst:1470 +msgid "" +"A class is the particular object type created by executing a class " +"statement. Class objects are used as templates to create instance objects, " +"which embody both the data (attributes) and code (methods) specific to a " +"datatype." +msgstr "" +"类是通过执行 class 语句创建的某种对象的类型。创建实例对象时,用 Class " +"对象作为模板,实例对象既包含了数据(属性),又包含了数据类型特有的代码(方法)。" + +#: ../../faq/programming.rst:1474 +msgid "" +"A class can be based on one or more other classes, called its base " +"class(es). It then inherits the attributes and methods of its base classes. " +"This allows an object model to be successively refined by inheritance. You " +"might have a generic ``Mailbox`` class that provides basic accessor methods " +"for a mailbox, and subclasses such as ``MboxMailbox``, ``MaildirMailbox``, " +"``OutlookMailbox`` that handle various specific mailbox formats." +msgstr "" +"类可以基于一个或多个其他类(称之为基类)进行创建。基类的属性和方法都得以继承。这样对象模型就可以通过继承不断地进行细化。比如通用的 " +"``Mailbox`` 类提供了邮箱的基本访问方法,它的子类 ``MboxMailbox``、``MaildirMailbox``、 " +"``OutlookMailbox`` 则能够处理各种特定的邮箱格式。" + +#: ../../faq/programming.rst:1483 +msgid "What is a method?" +msgstr "什么是方法?" + +#: ../../faq/programming.rst:1485 +msgid "" +"A method is a function on some object ``x`` that you normally call as " +"``x.name(arguments...)``. Methods are defined as functions inside the class" +" definition::" +msgstr "" +"方法是属于对象的函数,对于对象 ``x``,通常以 ``x.name(arguments...)`` " +"的形式调用。方法以函数的形式给出定义,位于类的定义内:" + +#: ../../faq/programming.rst:1489 +msgid "" +"class C:\n" +" def meth(self, arg):\n" +" return arg * 2 + self.attribute" +msgstr "" +"class C:\n" +" def meth(self, arg):\n" +" return arg * 2 + self.attribute" + +#: ../../faq/programming.rst:1495 +msgid "What is self?" +msgstr "什么是 self?" + +#: ../../faq/programming.rst:1497 +msgid "" +"Self is merely a conventional name for the first argument of a method. A " +"method defined as ``meth(self, a, b, c)`` should be called as ``x.meth(a, b," +" c)`` for some instance ``x`` of the class in which the definition occurs; " +"the called method will think it is called as ``meth(x, a, b, c)``." +msgstr "" +"Self 只是方法的第一个参数的习惯性名称。假定某个类中有个方法定义为 ``meth(self, a, b, c)``,则其实例 ``x`` 应以 " +"``x.meth(a, b, c)`` 的形式进行调用;而被调用的方法则应视其为做了 ``meth(x, a, b, c)`` 形式的调用。" + +#: ../../faq/programming.rst:1502 +msgid "See also :ref:`why-self`." +msgstr "另请参阅 :ref:`why-self`。" + +#: ../../faq/programming.rst:1506 +msgid "" +"How do I check if an object is an instance of a given class or of a subclass" +" of it?" +msgstr "如何检查对象是否为给定类或其子类的一个实例?" + +#: ../../faq/programming.rst:1508 +msgid "" +"Use the built-in function :func:`isinstance(obj, cls) `. You " +"can check if an object is an instance of any of a number of classes by " +"providing a tuple instead of a single class, for example, ``isinstance(obj, " +"(class1, class2, ...))``, and can also check whether an object is one of " +"Python's built-in types, for example, ``isinstance(obj, str)`` or " +"``isinstance(obj, (int, float, complex))``." +msgstr "" +"使用内置函数 :func:`isinstance(obj, cls) `。 " +"你可以检测对象是否属于多个类中的某一个的实例,只要提供一个元组而非单个类即可,如 ``isinstance(obj, (class1, class2, " +"...))``,还可以检测对象是否属于 Python 的某个内置类型,如 ``isinstance(obj, str)`` 或 " +"``isinstance(obj, (int, float, complex))``。" + +#: ../../faq/programming.rst:1515 +msgid "" +"Note that :func:`isinstance` also checks for virtual inheritance from an " +":term:`abstract base class`. So, the test will return ``True`` for a " +"registered class even if hasn't directly or indirectly inherited from it. " +"To test for \"true inheritance\", scan the :term:`method resolution order` " +"(MRO) of the class:" +msgstr "" +"请注意 :func:`isinstance` 还会检测派生自 :term:`abstract base class` 的虚继承。 " +"因此,对于已注册的类检测将返回 ``True`` 即使没有直接或间接从它继承。 要检测“真正的继承”,应扫描类的 :term:`method " +"resolution order` (MRO)。" + +#: ../../faq/programming.rst:1521 +msgid "" +"from collections.abc import Mapping\n" +"\n" +"class P:\n" +" pass\n" +"\n" +"class C(P):\n" +" pass\n" +"\n" +"Mapping.register(P)" +msgstr "" +"from collections.abc import Mapping\n" +"\n" +"class P:\n" +" pass\n" +"\n" +"class C(P):\n" +" pass\n" +"\n" +"Mapping.register(P)" + +#: ../../faq/programming.rst:1533 +msgid "" +">>> c = C()\n" +">>> isinstance(c, C) # direct\n" +"True\n" +">>> isinstance(c, P) # indirect\n" +"True\n" +">>> isinstance(c, Mapping) # virtual\n" +"True\n" +"\n" +"# Actual inheritance chain\n" +">>> type(c).__mro__\n" +"(, , )\n" +"\n" +"# Test for \"true inheritance\"\n" +">>> Mapping in type(c).__mro__\n" +"False" +msgstr "" +">>> c = C()\n" +">>> isinstance(c, C) # 直接\n" +"True\n" +">>> isinstance(c, P) # 间接\n" +"True\n" +">>> isinstance(c, Mapping) # 虚拟\n" +"True\n" +"\n" +"# 实际的继承链\n" +">>> type(c).__mro__\n" +"(, , )\n" +"\n" +"# 测试“真正的继承”\n" +">>> Mapping in type(c).__mro__\n" +"False" + +#: ../../faq/programming.rst:1551 +msgid "" +"Note that most programs do not use :func:`isinstance` on user-defined " +"classes very often. If you are developing the classes yourself, a more " +"proper object-oriented style is to define methods on the classes that " +"encapsulate a particular behaviour, instead of checking the object's class " +"and doing a different thing based on what class it is. For example, if you " +"have a function that does something::" +msgstr "" +"请注意,大多数程序不会经常用 :func:`isinstance` " +"对用户自定义类进行检测。如果是自已开发的类,更合适的面向对象编程风格应该是在类中定义多种方法,以封装特定的行为,而不是检查对象属于什么类再据此干不同的事。假定有如下执行某些操作的函数::" + +#: ../../faq/programming.rst:1558 +msgid "" +"def search(obj):\n" +" if isinstance(obj, Mailbox):\n" +" ... # code to search a mailbox\n" +" elif isinstance(obj, Document):\n" +" ... # code to search a document\n" +" elif ..." +msgstr "" +"def search(obj):\n" +" if isinstance(obj, Mailbox):\n" +" ... # 搜索邮箱的代码\n" +" elif isinstance(obj, Document):\n" +" ... # 搜索文档的代码\n" +" elif ..." + +#: ../../faq/programming.rst:1565 +msgid "" +"A better approach is to define a ``search()`` method on all the classes and " +"just call it::" +msgstr "更好的方法是在所有类上定义一个 ``search()`` 方法,然后调用它:" + +#: ../../faq/programming.rst:1568 +msgid "" +"class Mailbox:\n" +" def search(self):\n" +" ... # code to search a mailbox\n" +"\n" +"class Document:\n" +" def search(self):\n" +" ... # code to search a document\n" +"\n" +"obj.search()" +msgstr "" +"class Mailbox:\n" +" def search(self):\n" +" ... # 搜索邮箱的代码\n" +"\n" +"class Document:\n" +" def search(self):\n" +" ... # 搜索文档的代码\n" +"\n" +"obj.search()" + +#: ../../faq/programming.rst:1580 +msgid "What is delegation?" +msgstr "什么是委托?" + +#: ../../faq/programming.rst:1582 +msgid "" +"Delegation is an object-oriented technique (also called a design pattern). " +"Let's say you have an object ``x`` and want to change the behaviour of just " +"one of its methods. You can create a new class that provides a new " +"implementation of the method you're interested in changing and delegates all" +" other methods to the corresponding method of ``x``." +msgstr "" + +#: ../../faq/programming.rst:1588 +msgid "" +"Python programmers can easily implement delegation. For example, the " +"following class implements a class that behaves like a file but converts all" +" written data to uppercase::" +msgstr "Python 程序员可以轻松实现委托。比如以下实现了一个类似于文件的类,只是会把所有写入的数据转换为大写:" + +#: ../../faq/programming.rst:1592 +msgid "" +"class UpperOut:\n" +"\n" +" def __init__(self, outfile):\n" +" self._outfile = outfile\n" +"\n" +" def write(self, s):\n" +" self._outfile.write(s.upper())\n" +"\n" +" def __getattr__(self, name):\n" +" return getattr(self._outfile, name)" +msgstr "" +"class UpperOut:\n" +"\n" +" def __init__(self, outfile):\n" +" self._outfile = outfile\n" +"\n" +" def write(self, s):\n" +" self._outfile.write(s.upper())\n" +"\n" +" def __getattr__(self, name):\n" +" return getattr(self._outfile, name)" + +#: ../../faq/programming.rst:1603 +msgid "" +"Here the ``UpperOut`` class redefines the ``write()`` method to convert the " +"argument string to uppercase before calling the underlying " +"``self._outfile.write()`` method. All other methods are delegated to the " +"underlying ``self._outfile`` object. The delegation is accomplished via the" +" :meth:`~object.__getattr__` method; consult :ref:`the language reference " +"` for more information about controlling attribute access." +msgstr "" +"这里 ``UpperOut`` 类重新定义了 ``write()`` 方法,在调用下层的 ``self._outfile.write()`` " +"方法之前将参数字符串转换为大写形式。所有其他方法都被委托给下层的 ``self._outfile`` 对象。委托是通过 " +":meth:`~object.__getattr__` 方法完成的;请参阅 :ref:`语言参考 ` " +"了解有关控制属性访问的更多信息。" + +#: ../../faq/programming.rst:1610 +msgid "" +"Note that for more general cases delegation can get trickier. When " +"attributes must be set as well as retrieved, the class must define a " +":meth:`~object.__setattr__` method too, and it must do so carefully. The " +"basic implementation of :meth:`!__setattr__` is roughly equivalent to the " +"following::" +msgstr "" +"请注意在更一般的情况下委托可能会变得比较棘手。当属性即需要被设置又需要被提取时,类还必须定义 :meth:`~object.__setattr__` " +"方法,而这样做必须十分小心。:meth:`!__setattr__` 的基本实现大致如下所示::" + +#: ../../faq/programming.rst:1615 +msgid "" +"class X:\n" +" ...\n" +" def __setattr__(self, name, value):\n" +" self.__dict__[name] = value\n" +" ..." +msgstr "" +"class X:\n" +" ...\n" +" def __setattr__(self, name, value):\n" +" self.__dict__[name] = value\n" +" ..." + +#: ../../faq/programming.rst:1621 +msgid "" +"Many :meth:`~object.__setattr__` implementations call " +":meth:`!object.__setattr__` to set an attribute on self without causing " +"infinite recursion::" +msgstr "" +"许多 :meth:`~object.__setattr__` 实现都会调用 :meth:`!object.__setattr__` 在 self " +"上设置属性,而不会导致无限递归::" + +#: ../../faq/programming.rst:1624 +msgid "" +"class X:\n" +" def __setattr__(self, name, value):\n" +" # Custom logic here...\n" +" object.__setattr__(self, name, value)" +msgstr "" +"class X:\n" +" def __setattr__(self, name, value):\n" +" # 这里添加自定义的逻辑...\n" +" object.__setattr__(self, name, value)" + +#: ../../faq/programming.rst:1629 +msgid "" +"Alternatively, it is possible to set attributes by inserting entries into " +":attr:`self.__dict__ ` directly." +msgstr "另外,也可以通过直接在 :attr:`self.__dict__` 中插入条目来设置属性。" + +#: ../../faq/programming.rst:1634 +msgid "" +"How do I call a method defined in a base class from a derived class that " +"extends it?" +msgstr "如何在扩展基类的派生类中调用基类中定义的方法?" + +#: ../../faq/programming.rst:1636 +msgid "Use the built-in :func:`super` function::" +msgstr "使用内置的 :func:`super` 函数:" + +#: ../../faq/programming.rst:1638 +msgid "" +"class Derived(Base):\n" +" def meth(self):\n" +" super().meth() # calls Base.meth" +msgstr "" +"class Derived(Base):\n" +" def meth(self):\n" +" super().meth() # 调用 Base.meth" + +#: ../../faq/programming.rst:1642 +msgid "" +"In the example, :func:`super` will automatically determine the instance from" +" which it was called (the ``self`` value), look up the :term:`method " +"resolution order` (MRO) with ``type(self).__mro__``, and return the next in " +"line after ``Derived`` in the MRO: ``Base``." +msgstr "" +"在下面的例子中,:func:`super` 将自动根据它的调用方 (``self`` 值) 来确定实例对象,使用 " +"``type(self).__mro__`` 查找 :term:`method resolution order` (MRO),并返回 MRO 中位于 " +"``Derived`` 之后的项: ``Base``。" + +#: ../../faq/programming.rst:1649 +msgid "How can I organize my code to make it easier to change the base class?" +msgstr "如何让代码更容易对基类进行修改?" + +#: ../../faq/programming.rst:1651 +msgid "" +"You could assign the base class to an alias and derive from the alias. Then" +" all you have to change is the value assigned to the alias. Incidentally, " +"this trick is also handy if you want to decide dynamically (such as " +"depending on availability of resources) which base class to use. Example::" +msgstr "" + +#: ../../faq/programming.rst:1656 +msgid "" +"class Base:\n" +" ...\n" +"\n" +"BaseAlias = Base\n" +"\n" +"class Derived(BaseAlias):\n" +" ..." +msgstr "" +"class Base:\n" +" ...\n" +"\n" +"BaseAlias = Base\n" +"\n" +"class Derived(BaseAlias):\n" +" ..." + +#: ../../faq/programming.rst:1666 +msgid "How do I create static class data and static class methods?" +msgstr "如何创建静态类数据和静态类方法?" + +#: ../../faq/programming.rst:1668 +msgid "" +"Both static data and static methods (in the sense of C++ or Java) are " +"supported in Python." +msgstr "Python 支持静态数据和静态方法(以 C++ 或 Java 的定义而言)。" + +#: ../../faq/programming.rst:1671 +msgid "" +"For static data, simply define a class attribute. To assign a new value to " +"the attribute, you have to explicitly use the class name in the assignment::" +msgstr "静态数据只需定义一个类属性即可。若要为属性赋新值,则必须在赋值时显式使用类名:" + +#: ../../faq/programming.rst:1674 +msgid "" +"class C:\n" +" count = 0 # number of times C.__init__ called\n" +"\n" +" def __init__(self):\n" +" C.count = C.count + 1\n" +"\n" +" def getcount(self):\n" +" return C.count # or return self.count" +msgstr "" +"class C:\n" +" count = 0 # C.__init__ 被调用的次数\n" +"\n" +" def __init__(self):\n" +" C.count = C.count + 1\n" +"\n" +" def getcount(self):\n" +" return C.count # 或返回 self.count" + +#: ../../faq/programming.rst:1683 +msgid "" +"``c.count`` also refers to ``C.count`` for any ``c`` such that " +"``isinstance(c, C)`` holds, unless overridden by ``c`` itself or by some " +"class on the base-class search path from ``c.__class__`` back to ``C``." +msgstr "" +"对于所有符合 ``isinstance(c, C)`` 的 ``c``,``c.count`` 也同样指向 ``C.count``,除非被 ``c`` " +"自身或者被从 ``c.__class__`` 回溯到基类 ``C`` 的搜索路径上的某个类所覆盖。" + +#: ../../faq/programming.rst:1687 +msgid "" +"Caution: within a method of C, an assignment like ``self.count = 42`` " +"creates a new and unrelated instance named \"count\" in ``self``'s own dict." +" Rebinding of a class-static data name must always specify the class " +"whether inside a method or not::" +msgstr "" +"注意:在 C 的某个方法内部,像 ``self.count = 42`` 这样的赋值将在 ``self`` 自身的字典中新建一个名为 \"count\"" +" 的不相关实例。想要重新绑定类静态数据名称就必须总是指明类名,无论是在方法内部还是外部::" + +#: ../../faq/programming.rst:1692 +msgid "C.count = 314" +msgstr "C.count = 314" + +#: ../../faq/programming.rst:1694 +msgid "Static methods are possible::" +msgstr "Python 支持静态方法:" + +#: ../../faq/programming.rst:1696 +msgid "" +"class C:\n" +" @staticmethod\n" +" def static(arg1, arg2, arg3):\n" +" # No 'self' parameter!\n" +" ..." +msgstr "" +"class C:\n" +" @staticmethod\n" +" def static(arg1, arg2, arg3):\n" +" # 没有 'self' 形参!\n" +" ..." + +#: ../../faq/programming.rst:1702 +msgid "" +"However, a far more straightforward way to get the effect of a static method" +" is via a simple module-level function::" +msgstr "不过为了获得静态方法的效果,还有一种做法直接得多,也即使用模块级函数即可:" + +#: ../../faq/programming.rst:1705 +msgid "" +"def getcount():\n" +" return C.count" +msgstr "" +"def getcount():\n" +" return C.count" + +#: ../../faq/programming.rst:1708 +msgid "" +"If your code is structured so as to define one class (or tightly related " +"class hierarchy) per module, this supplies the desired encapsulation." +msgstr "如果代码的结构化比较充分,每个模块只定义了一个类(或者多个类的层次关系密切相关),那就具备了应有的封装。" + +#: ../../faq/programming.rst:1713 +msgid "How can I overload constructors (or methods) in Python?" +msgstr "在 Python 中如何重载构造函数(或方法)?" + +#: ../../faq/programming.rst:1715 +msgid "" +"This answer actually applies to all methods, but the question usually comes " +"up first in the context of constructors." +msgstr "这个答案实际上适用于所有方法,但问题通常首先出现于构造函数的应用场景中。" + +#: ../../faq/programming.rst:1718 +msgid "In C++ you'd write:" +msgstr "在 C++ 中你可以这样写:" + +#: ../../faq/programming.rst:1720 +msgid "" +"class C {\n" +" C() { cout << \"No arguments\\n\"; }\n" +" C(int i) { cout << \"Argument is \" << i << \"\\n\"; }\n" +"}" +msgstr "" +"class C {\n" +" C() { cout << \"No arguments\\n\"; }\n" +" C(int i) { cout << \"Argument is \" << i << \"\\n\"; }\n" +"}" + +#: ../../faq/programming.rst:1727 +msgid "" +"In Python you have to write a single constructor that catches all cases " +"using default arguments. For example::" +msgstr "在 Python 中,只能编写一个构造函数,并用默认参数捕获所有情况。例如:" + +#: ../../faq/programming.rst:1730 +msgid "" +"class C:\n" +" def __init__(self, i=None):\n" +" if i is None:\n" +" print(\"No arguments\")\n" +" else:\n" +" print(\"Argument is\", i)" +msgstr "" +"class C:\n" +" def __init__(self, i=None):\n" +" if i is None:\n" +" print(\"No arguments\")\n" +" else:\n" +" print(\"Argument is\", i)" + +#: ../../faq/programming.rst:1737 +msgid "This is not entirely equivalent, but close enough in practice." +msgstr "这不完全等同,但在实践中足够接近。" + +#: ../../faq/programming.rst:1739 +msgid "You could also try a variable-length argument list, for example::" +msgstr "你还可以尝试使用可变长度的参数列表,例如::" + +#: ../../faq/programming.rst:1741 +msgid "" +"def __init__(self, *args):\n" +" ..." +msgstr "" +"def __init__(self, *args):\n" +" ..." + +#: ../../faq/programming.rst:1744 +msgid "The same approach works for all method definitions." +msgstr "上述做法同样适用于所有方法定义。" + +#: ../../faq/programming.rst:1748 +msgid "I try to use __spam and I get an error about _SomeClassName__spam." +msgstr "在用 __spam 的时候得到一个类似 _SomeClassName__spam 的错误信息。" + +#: ../../faq/programming.rst:1750 +msgid "" +"Variable names with double leading underscores are \"mangled\" to provide a " +"simple but effective way to define class private variables. Any identifier " +"of the form ``__spam`` (at least two leading underscores, at most one " +"trailing underscore) is textually replaced with ``_classname__spam``, where " +"``classname`` is the current class name with any leading underscores " +"stripped." +msgstr "" +"以双下划线打头的变量名会被“破坏”,以便以一种简单高效的方式定义类私有变量。任何形式为 ``__spam`` " +"的标识符(至少前缀两个下划线,至多后缀一个下划线)文本均会被替换为 ``_classname__spam``,其中 ``classname`` " +"为去除了全部前缀下划线的当前类名称。" + +#: ../../faq/programming.rst:1756 +msgid "" +"The identifier can be used unchanged within the class, but to access it " +"outside the class, the mangled name must be used:" +msgstr "标识符可以在类的内部不加改变地使用,但要在类的外部访问它,就必须使用被混淆的名称:" + +#: ../../faq/programming.rst:1759 +msgid "" +"class A:\n" +" def __one(self):\n" +" return 1\n" +" def two(self):\n" +" return 2 * self.__one()\n" +"\n" +"class B(A):\n" +" def three(self):\n" +" return 3 * self._A__one()\n" +"\n" +"four = 4 * A()._A__one()" +msgstr "" +"class A:\n" +" def __one(self):\n" +" return 1\n" +" def two(self):\n" +" return 2 * self.__one()\n" +"\n" +"class B(A):\n" +" def three(self):\n" +" return 3 * self._A__one()\n" +"\n" +"four = 4 * A()._A__one()" + +#: ../../faq/programming.rst:1773 +msgid "" +"In particular, this does not guarantee privacy since an outside user can " +"still deliberately access the private attribute; many Python programmers " +"never bother to use private variable names at all." +msgstr "需要特别指出,这并不能保证私密性因为外部用户仍然可以有意地访问私有属性;许多 Python 程序员根本就不屑于使用私有变量名。" + +#: ../../faq/programming.rst:1779 +msgid "" +"The :ref:`private name mangling specifications ` for " +"details and special cases." +msgstr ":ref:`私有名称调整规范说明 ` 了解相关详情和特例。" + +#: ../../faq/programming.rst:1784 +msgid "" +"My class defines __del__ but it is not called when I delete the object." +msgstr "类定义了 __del__ 方法,但是删除对象时没有调用它。" + +#: ../../faq/programming.rst:1786 +msgid "There are several possible reasons for this." +msgstr "这有几个可能的原因。" + +#: ../../faq/programming.rst:1788 +msgid "" +"The :keyword:`del` statement does not necessarily call " +":meth:`~object.__del__` -- it simply decrements the object's reference " +"count, and if this reaches zero :meth:`!__del__` is called." +msgstr "" +":keyword:`del` 语句不一定要调用 :meth:`~object.__del__` -- 它只是减少对象的引用计数,如果计数达到零才会调用 " +":meth:`!__del__`。" + +#: ../../faq/programming.rst:1792 +msgid "" +"If your data structures contain circular links (for example, a tree where " +"each child has a parent reference and each parent has a list of children) " +"the reference counts will never go back to zero. Once in a while Python " +"runs an algorithm to detect such cycles, but the garbage collector might run" +" some time after the last reference to your data structure vanishes, so your" +" :meth:`!__del__` method may be called at an inconvenient and random time. " +"This is inconvenient if you're trying to reproduce a problem. Worse, the " +"order in which object's :meth:`!__del__` methods are executed is arbitrary." +" You can run :func:`gc.collect` to force a collection, but there *are* " +"pathological cases where objects will never be collected." +msgstr "" + +#: ../../faq/programming.rst:1803 +msgid "" +"Despite the cycle collector, it's still a good idea to define an explicit " +"``close()`` method on objects to be called whenever you're done with them. " +"The ``close()`` method can then remove attributes that refer to subobjects." +" Don't call :meth:`!__del__` directly -- :meth:`!__del__` should call " +"``close()`` and ``close()`` should make sure that it can be called more than" +" once for the same object." +msgstr "" +"尽管有垃圾回收器,但在对象上定义显式的 ``close()`` 方法以便在使用完毕时调用仍然是个好主意。``close()`` " +"方法可以随后移除引用子对象的属性。请不要直接调用 :meth:`!__del__` -- :meth:`!__del__` 应当调用 " +"``close()`` 并且 ``close()`` 应当确保可以被同一对象多次调用。" + +#: ../../faq/programming.rst:1810 +msgid "" +"Another way to avoid cyclical references is to use the :mod:`weakref` " +"module, which allows you to point to objects without incrementing their " +"reference count. Tree data structures, for instance, should use weak " +"references for their parent and sibling references (if they need them!)." +msgstr "" +"另一种避免循环引用的做法是利用 :mod:`weakref` " +"模块,该模块允许指向对象但不增加其引用计数。例如,树状数据结构应该对父节点和同级节点使用弱引用(如果真要用的话!)" + +#: ../../faq/programming.rst:1823 +msgid "" +"Finally, if your :meth:`!__del__` method raises an exception, a warning " +"message is printed to :data:`sys.stderr`." +msgstr "最后,如果你的 :meth:`!__del__` 方法引发了异常,会将警告消息打印到 :data:`sys.stderr`。" + +#: ../../faq/programming.rst:1828 +msgid "How do I get a list of all instances of a given class?" +msgstr "如何获取给定类的所有实例的列表?" + +#: ../../faq/programming.rst:1830 +msgid "" +"Python does not keep track of all instances of a class (or of a built-in " +"type). You can program the class's constructor to keep track of all " +"instances by keeping a list of weak references to each instance." +msgstr "Python 不会记录类(或内置类型)的实例。可以在类的构造函数中编写代码,通过保留每个实例的弱引用列表来跟踪所有实例。" + +#: ../../faq/programming.rst:1836 +msgid "Why does the result of ``id()`` appear to be not unique?" +msgstr "为什么 ``id()`` 的结果看起来不是唯一的?" + +#: ../../faq/programming.rst:1838 +msgid "" +"The :func:`id` builtin returns an integer that is guaranteed to be unique " +"during the lifetime of the object. Since in CPython, this is the object's " +"memory address, it happens frequently that after an object is deleted from " +"memory, the next freshly created object is allocated at the same position in" +" memory. This is illustrated by this example:" +msgstr "" +":func:`id` 返回一个整数,该整数在对象的生命周期内保证是唯一的。因为在 CPython " +"中,这是对象的内存地址,所以经常发生在从内存中删除对象之后,下一个新创建的对象被分配在内存中的相同位置。这个例子说明了这一点:" + +#: ../../faq/programming.rst:1849 +msgid "" +"The two ids belong to different integer objects that are created before, and" +" deleted immediately after execution of the ``id()`` call. To be sure that " +"objects whose id you want to examine are still alive, create another " +"reference to the object:" +msgstr "" +"这两个 id 属于不同的整数对象,之前先创建了对象,执行 ``id()`` 调用后又立即被删除了。若要确保检测 id " +"时的对象仍处于活动状态,请再创建一个对该对象的引用:" + +#: ../../faq/programming.rst:1864 +msgid "When can I rely on identity tests with the *is* operator?" +msgstr "什么情况下可以依靠 *is* 运算符进行对象的身份相等性测试?" + +#: ../../faq/programming.rst:1866 +msgid "" +"The ``is`` operator tests for object identity. The test ``a is b`` is " +"equivalent to ``id(a) == id(b)``." +msgstr "``is`` 运算符可用于测试对象的身份相等性。``a is b`` 等价于 ``id(a) == id(b)``。" + +#: ../../faq/programming.rst:1869 +msgid "" +"The most important property of an identity test is that an object is always " +"identical to itself, ``a is a`` always returns ``True``. Identity tests are" +" usually faster than equality tests. And unlike equality tests, identity " +"tests are guaranteed to return a boolean ``True`` or ``False``." +msgstr "" +"身份相等性最重要的特性就是对象总是等同于自身,``a is a`` 一定返回 " +"``True``。身份相等性测试的速度通常比相等性测试要快。而且与相等性测试不一样,身份相等性测试会确保返回布尔值 ``True`` 或 " +"``False``。" + +#: ../../faq/programming.rst:1874 +msgid "" +"However, identity tests can *only* be substituted for equality tests when " +"object identity is assured. Generally, there are three circumstances where " +"identity is guaranteed:" +msgstr "但是,身份相等性测试 *只能* 在对象身份确定的场景下才可替代相等性测试。一般来说,有以下 3 种情况对象身份是可以确定的:" + +#: ../../faq/programming.rst:1878 +msgid "" +"Assignments create new names but do not change object identity. After the " +"assignment ``new = old``, it is guaranteed that ``new is old``." +msgstr "赋值操作将创建新的名称但不会改变对象标识号。在赋值操作 ``new = old`` 之后,可以保证 ``new is old``。" + +#: ../../faq/programming.rst:1881 +msgid "" +"Putting an object in a container that stores object references does not " +"change object identity. After the list assignment ``s[0] = x``, it is " +"guaranteed that ``s[0] is x``." +msgstr "将对象放入存储对象引用的容器不会改变对象的标识号。在列表赋值操作 ``s[0] = x`` 之后,将可保证 ``s[0] is x``。" + +#: ../../faq/programming.rst:1885 +msgid "" +"If an object is a singleton, it means that only one instance of that object " +"can exist. After the assignments ``a = None`` and ``b = None``, it is " +"guaranteed that ``a is b`` because ``None`` is a singleton." +msgstr "" +"如果一个对象是单例,则意味着该对象只能存在一个实例。在赋值操作 ``a = None`` 和 ``b = None`` 之后,可以保证 ``a is " +"b`` 因为 ``None`` 是单例对象。" + +#: ../../faq/programming.rst:1889 +msgid "" +"In most other circumstances, identity tests are inadvisable and equality " +"tests are preferred. In particular, identity tests should not be used to " +"check constants such as :class:`int` and :class:`str` which aren't " +"guaranteed to be singletons::" +msgstr "" +"其他大多数情况下,都不建议使用身份相等性测试,而应采用相等性测试。尤其是不应将身份相等性测试用于检测常量值,例如 :class:`int` 和 " +":class:`str`,因为他们并不一定是单例对象:" + +#: ../../faq/programming.rst:1894 +msgid "" +">>> a = 10_000_000\n" +">>> b = 5_000_000\n" +">>> c = b + 5_000_000\n" +">>> a is c\n" +"False\n" +"\n" +">>> a = 'Python'\n" +">>> b = 'Py'\n" +">>> c = b + 'thon'\n" +">>> a is c\n" +"False" +msgstr "" +">>> a = 10_000_000\n" +">>> b = 5_000_000\n" +">>> c = b + 5_000_000\n" +">>> a is c\n" +"False\n" +"\n" +">>> a = 'Python'\n" +">>> b = 'Py'\n" +">>> c = b + 'thon'\n" +">>> a is c\n" +"False" + +#: ../../faq/programming.rst:1906 +msgid "Likewise, new instances of mutable containers are never identical::" +msgstr "同样地,可变容器的新实例,对象身份一定不同:" + +#: ../../faq/programming.rst:1908 +msgid "" +">>> a = []\n" +">>> b = []\n" +">>> a is b\n" +"False" +msgstr "" +">>> a = []\n" +">>> b = []\n" +">>> a is b\n" +"False" + +#: ../../faq/programming.rst:1913 +msgid "" +"In the standard library code, you will see several common patterns for " +"correctly using identity tests:" +msgstr "在标准库代码中,给出了一些正确使用对象身份测试的常见模式:" + +#: ../../faq/programming.rst:1916 +msgid "" +"As recommended by :pep:`8`, an identity test is the preferred way to check " +"for ``None``. This reads like plain English in code and avoids confusion " +"with other objects that may have boolean values that evaluate to false." +msgstr "" +"正如 :pep:`8` 所建议的,身份测试是检查 ``None`` 的推荐方式。这样的代码读起来就像直白的英语,并可避免与布尔值为假的其他对象相混淆。" + +#: ../../faq/programming.rst:1920 +msgid "" +"Detecting optional arguments can be tricky when ``None`` is a valid input " +"value. In those situations, you can create a singleton sentinel object " +"guaranteed to be distinct from other objects. For example, here is how to " +"implement a method that behaves like :meth:`dict.pop`:" +msgstr "" +"当 ``None`` " +"是一个有效的输入值时检查可选参数会有点麻烦。在这些情况下,你可以创建一个保证与其他对象不同的单例哨兵对象。例如,以下代码演示了如何实现一个行为与 " +":meth:`dict.pop` 类似的方法:" + +#: ../../faq/programming.rst:1925 +msgid "" +"_sentinel = sentinel('_sentinel')\n" +"\n" +"def pop(self, key, default=_sentinel):\n" +" if key in self:\n" +" value = self[key]\n" +" del self[key]\n" +" return value\n" +" if default is _sentinel:\n" +" raise KeyError(key)\n" +" return default" +msgstr "" + +#: ../../faq/programming.rst:1938 +msgid "" +"Container implementations sometimes need to augment equality tests with " +"identity tests. This prevents the code from being confused by objects such " +"as ``float('NaN')`` that are not equal to themselves." +msgstr "容器的实现有时需要用身份测试来增强相等性测试。这样可以防止代码被 ``float('NaN')`` 这类不等于自身的对象所干扰。" + +#: ../../faq/programming.rst:1942 +msgid "" +"For example, here is the implementation of " +":meth:`!collections.abc.Sequence.__contains__`::" +msgstr "例如,以下是 :meth:`!collections.abc.Sequence.__contains__` 的实现代码::" + +#: ../../faq/programming.rst:1945 +msgid "" +"def __contains__(self, value):\n" +" for v in self:\n" +" if v is value or v == value:\n" +" return True\n" +" return False" +msgstr "" +"def __contains__(self, value):\n" +" for v in self:\n" +" if v is value or v == value:\n" +" return True\n" +" return False" + +#: ../../faq/programming.rst:1953 +msgid "" +"How can a subclass control what data is stored in an immutable instance?" +msgstr "一个子类如何控制哪些数据被存储在一个不可变的实例中?" + +#: ../../faq/programming.rst:1955 +msgid "" +"When subclassing an immutable type, override the :meth:`~object.__new__` " +"method instead of the :meth:`~object.__init__` method. The latter only runs" +" *after* an instance is created, which is too late to alter data in an " +"immutable instance." +msgstr "" +"当子类化一个不可变类型时,请重写 :meth:`~object.__new__` 方法而不是 :meth:`~object.__init__` " +"方法。后者只在一个实例被创建 *之后* 运行,这对于改变不可变实例中的数据来说太晚了。" + +#: ../../faq/programming.rst:1960 +msgid "" +"All of these immutable classes have a different signature than their parent " +"class:" +msgstr "所有这些不可变的类都有一个与它们的父类不同的签名:" + +#: ../../faq/programming.rst:1963 +msgid "" +"import datetime as dt\n" +"\n" +"class FirstOfMonthDate(dt.date):\n" +" \"Always choose the first day of the month\"\n" +" def __new__(cls, year, month, day):\n" +" return super().__new__(cls, year, month, 1)\n" +"\n" +"class NamedInt(int):\n" +" \"Allow text names for some numbers\"\n" +" xlat = {'zero': 0, 'one': 1, 'ten': 10}\n" +" def __new__(cls, value):\n" +" value = cls.xlat.get(value, value)\n" +" return super().__new__(cls, value)\n" +"\n" +"class TitleStr(str):\n" +" \"Convert str to name suitable for a URL path\"\n" +" def __new__(cls, s):\n" +" s = s.lower().replace(' ', '-')\n" +" s = ''.join([c for c in s if c.isalnum() or c == '-'])\n" +" return super().__new__(cls, s)" +msgstr "" +"import datetime as dt\n" +"\n" +"class FirstOfMonthDate(dt.date):\n" +" \"Always choose the first day of the month\"\n" +" def __new__(cls, year, month, day):\n" +" return super().__new__(cls, year, month, 1)\n" +"\n" +"class NamedInt(int):\n" +" \"Allow text names for some numbers\"\n" +" xlat = {'zero': 0, 'one': 1, 'ten': 10}\n" +" def __new__(cls, value):\n" +" value = cls.xlat.get(value, value)\n" +" return super().__new__(cls, value)\n" +"\n" +"class TitleStr(str):\n" +" \"Convert str to name suitable for a URL path\"\n" +" def __new__(cls, s):\n" +" s = s.lower().replace(' ', '-')\n" +" s = ''.join([c for c in s if c.isalnum() or c == '-'])\n" +" return super().__new__(cls, s)" + +#: ../../faq/programming.rst:1986 +msgid "The classes can be used like this:" +msgstr "这些类可以这样使用:" + +#: ../../faq/programming.rst:1988 +msgid "" +">>> FirstOfMonthDate(2012, 2, 14)\n" +"FirstOfMonthDate(2012, 2, 1)\n" +">>> NamedInt('ten')\n" +"10\n" +">>> NamedInt(20)\n" +"20\n" +">>> TitleStr('Blog: Why Python Rocks')\n" +"'blog-why-python-rocks'" +msgstr "" +">>> FirstOfMonthDate(2012, 2, 14)\n" +"FirstOfMonthDate(2012, 2, 1)\n" +">>> NamedInt('ten')\n" +"10\n" +">>> NamedInt(20)\n" +"20\n" +">>> TitleStr('Blog: Why Python Rocks')\n" +"'blog-why-python-rocks'" + +#: ../../faq/programming.rst:2003 +msgid "How do I cache method calls?" +msgstr "我该如何缓存方法调用?" + +#: ../../faq/programming.rst:2005 +msgid "" +"The two principal tools for caching methods are " +":func:`functools.cached_property` and :func:`functools.lru_cache`. The " +"former stores results at the instance level and the latter at the class " +"level." +msgstr "" +"缓存方法的两个主要工具是 :func:`functools.cached_property` 和 " +":func:`functools.lru_cache`。前者在实例层级上存储结果而后者在类层级上存储结果。" + +#: ../../faq/programming.rst:2010 +msgid "" +"The ``cached_property`` approach only works with methods that do not take " +"any arguments. It does not create a reference to the instance. The cached " +"method result will be kept only as long as the instance is alive." +msgstr "" +"``cached_property`` 方式仅适用于不接受任何参数的方法。 它不会创建对实例的引用。 被缓存的方法结果将仅在实例的生存期内被保留。" + +#: ../../faq/programming.rst:2014 +msgid "" +"The advantage is that when an instance is no longer used, the cached method " +"result will be released right away. The disadvantage is that if instances " +"accumulate, so too will the accumulated method results. They can grow " +"without bound." +msgstr "其优点是,当一个实例不再被使用时,缓存的方法结果将被立即释放。缺点是,如果实例累积起来,累积的方法结果也会增加。它们可以无限制地增长。" + +#: ../../faq/programming.rst:2019 +msgid "" +"The ``lru_cache`` approach works with methods that have :term:`hashable` " +"arguments. It creates a reference to the instance unless special efforts " +"are made to pass in weak references." +msgstr "" + +#: ../../faq/programming.rst:2023 +msgid "" +"The advantage of the least recently used algorithm is that the cache is " +"bounded by the specified *maxsize*. The disadvantage is that instances are " +"kept alive until they age out of the cache or until the cache is cleared." +msgstr "最少近期使用算法的优点是缓存会受指定的 *maxsize* 限制。它的缺点是实例会保持存活,直到其达到生存期或者缓存被清空。" + +#: ../../faq/programming.rst:2028 +msgid "This example shows the various techniques::" +msgstr "这个例子演示了几种不同的方式::" + +#: ../../faq/programming.rst:2030 +msgid "" +"class Weather:\n" +" \"Lookup weather information on a government website\"\n" +"\n" +" def __init__(self, station_id):\n" +" self._station_id = station_id\n" +" # The _station_id is private and immutable\n" +"\n" +" def current_temperature(self):\n" +" \"Latest hourly observation\"\n" +" # Do not cache this because old results\n" +" # can be out of date.\n" +"\n" +" @cached_property\n" +" def location(self):\n" +" \"Return the longitude/latitude coordinates of the station\"\n" +" # Result only depends on the station_id\n" +"\n" +" @lru_cache(maxsize=20)\n" +" def historic_rainfall(self, date, units='mm'):\n" +" \"Rainfall on a given date\"\n" +" # Depends on the station_id, date, and units." +msgstr "" +"class Weather:\n" +" \"Lookup weather information on a government website\"\n" +"\n" +" def __init__(self, station_id):\n" +" self._station_id = station_id\n" +" # The _station_id is private and immutable\n" +"\n" +" def current_temperature(self):\n" +" \"Latest hourly observation\"\n" +" # Do not cache this because old results\n" +" # can be out of date.\n" +"\n" +" @cached_property\n" +" def location(self):\n" +" \"Return the longitude/latitude coordinates of the station\"\n" +" # Result only depends on the station_id\n" +"\n" +" @lru_cache(maxsize=20)\n" +" def historic_rainfall(self, date, units='mm'):\n" +" \"Rainfall on a given date\"\n" +" # 取决于 station_id、date 和 unit" + +#: ../../faq/programming.rst:2052 +msgid "" +"The above example assumes that the *station_id* never changes. If the " +"relevant instance attributes are mutable, the ``cached_property`` approach " +"can't be made to work because it cannot detect changes to the attributes." +msgstr "" + +#: ../../faq/programming.rst:2057 +msgid "" +"To make the ``lru_cache`` approach work when the *station_id* is mutable, " +"the class needs to define the :meth:`~object.__eq__` and " +":meth:`~object.__hash__` methods so that the cache can detect relevant " +"attribute updates::" +msgstr "" + +#: ../../faq/programming.rst:2061 +msgid "" +"class Weather:\n" +" \"Example with a mutable station identifier\"\n" +"\n" +" def __init__(self, station_id):\n" +" self.station_id = station_id\n" +"\n" +" def change_station(self, station_id):\n" +" self.station_id = station_id\n" +"\n" +" def __eq__(self, other):\n" +" return self.station_id == other.station_id\n" +"\n" +" def __hash__(self):\n" +" return hash(self.station_id)\n" +"\n" +" @lru_cache(maxsize=20)\n" +" def historic_rainfall(self, date, units='cm'):\n" +" 'Rainfall on a given date'\n" +" # Depends on the station_id, date, and units." +msgstr "" +"class Weather:\n" +" \"Example with a mutable station identifier\"\n" +"\n" +" def __init__(self, station_id):\n" +" self.station_id = station_id\n" +"\n" +" def change_station(self, station_id):\n" +" self.station_id = station_id\n" +"\n" +" def __eq__(self, other):\n" +" return self.station_id == other.station_id\n" +"\n" +" def __hash__(self):\n" +" return hash(self.station_id)\n" +"\n" +" @lru_cache(maxsize=20)\n" +" def historic_rainfall(self, date, units='cm'):\n" +" 'Rainfall on a given date'\n" +" # 取决于 station_id、date 和 unit" + +#: ../../faq/programming.rst:2083 +msgid "Modules" +msgstr "模块" + +#: ../../faq/programming.rst:2086 +msgid "How do I create a .pyc file?" +msgstr "如何创建 .pyc 文件?" + +#: ../../faq/programming.rst:2088 +msgid "" +"When a module is imported for the first time (or when the source file has " +"changed since the current compiled file was created) a ``.pyc`` file " +"containing the compiled code should be created in a ``__pycache__`` " +"subdirectory of the directory containing the ``.py`` file. The ``.pyc`` " +"file will have a filename that starts with the same name as the ``.py`` " +"file, and ends with ``.pyc``, with a middle component that depends on the " +"particular ``python`` binary that created it. (See :pep:`3147` for " +"details.)" +msgstr "" +"当首次导入模块时(或当前已编译文件创建之后源文件发生了改动),在 ``.py`` 文件所在目录的 ``__pycache__`` " +"子目录下会创建一个包含已编译代码的 ``.pyc`` 文件。该 ``.pyc`` 文件的名称开头部分将与 ``.py`` 文件名相同,并以 " +"``.pyc`` 为后缀,中间部分则依据创建它的 ``python`` 版本而各不相同。(详见 :pep:`3147`。)" + +#: ../../faq/programming.rst:2096 +msgid "" +"One reason that a ``.pyc`` file may not be created is a permissions problem " +"with the directory containing the source file, meaning that the " +"``__pycache__`` subdirectory cannot be created. This can happen, for " +"example, if you develop as one user but run as another, such as if you are " +"testing with a web server." +msgstr "" +"``.pyc`` 文件有可能会无法创建,原因之一是源码文件所在的目录存在权限问题,这样就无法创建 ``__pycache__`` " +"子目录。假如以某个用户开发程序而以另一用户运行程序,就有可能发生权限问题,测试 Web 服务器就属于这种情况。" + +#: ../../faq/programming.rst:2101 +msgid "" +"Unless the :envvar:`PYTHONDONTWRITEBYTECODE` environment variable is set, " +"creation of a .pyc file is automatic if you're importing a module and Python" +" has the ability (permissions, free space, and so on) to create a " +"``__pycache__`` subdirectory and write the compiled module to that " +"subdirectory." +msgstr "" + +#: ../../faq/programming.rst:2106 +msgid "" +"Running Python on a top-level script is not considered an import and no " +"``.pyc`` will be created. For example, if you have a top-level module " +"``foo.py`` that imports another module ``xyz.py``, when you run ``foo`` (by " +"typing ``python foo.py`` as a shell command), a ``.pyc`` will be created for" +" ``xyz`` because ``xyz`` is imported, but no ``.pyc`` file will be created " +"for ``foo`` since ``foo.py`` isn't being imported." +msgstr "" + +#: ../../faq/programming.rst:2113 +msgid "" +"If you need to create a ``.pyc`` file for ``foo`` -- that is, to create a " +"``.pyc`` file for a module that is not imported -- you can, using the " +":mod:`py_compile` and :mod:`compileall` modules." +msgstr "" +"若要为 ``foo`` 创建 ``.pyc`` 文件 —— 即为未做导入的模块创建 ``.pyc`` 文件 —— 可以利用 " +":mod:`py_compile` 和 :mod:`compileall` 模块。" + +#: ../../faq/programming.rst:2117 +msgid "" +"The :mod:`py_compile` module can manually compile any module. One way is to" +" use the ``compile()`` function in that module interactively::" +msgstr ":mod:`py_compile` 模块能够手动编译任意模块。一种做法是交互式地使用该模块中的 ``compile()`` 函数::" + +#: ../../faq/programming.rst:2120 +msgid "" +">>> import py_compile\n" +">>> py_compile.compile('foo.py')" +msgstr "" +">>> import py_compile\n" +">>> py_compile.compile('foo.py')" + +#: ../../faq/programming.rst:2123 +msgid "" +"This will write the ``.pyc`` to a ``__pycache__`` subdirectory in the same " +"location as ``foo.py`` (or you can override that with the optional parameter" +" *cfile*)." +msgstr "" +"这会把 ``.pyc`` 写入与 ``foo.py`` 相同位置中的 ``__pycache__`` 子目录(或者你也可以通过可选形参 *cfile* " +"来重写该行为)。" + +#: ../../faq/programming.rst:2127 +msgid "" +"You can also automatically compile all files in a directory or directories " +"using the :mod:`compileall` module. You can do it from the shell prompt by " +"running ``compileall.py`` and providing the path of a directory containing " +"Python files to compile::" +msgstr "" +"还可以用 :mod:`compileall` 模块自动编译一个或多个目录下的所有文件。只要在命令行提示符中运行 ``compileall.py`` " +"并给出要编译的 Python 文件所在目录路径即可:" + +#: ../../faq/programming.rst:2132 +msgid "python -m compileall ." +msgstr "python -m compileall ." + +#: ../../faq/programming.rst:2136 +msgid "How do I find the current module name?" +msgstr "如何找到当前模块名称?" + +#: ../../faq/programming.rst:2138 +msgid "" +"A module can find out its own module name by looking at the predefined " +"global variable ``__name__``. If this has the value ``'__main__'``, the " +"program is running as a script. Many modules that are usually used by " +"importing them also provide a command-line interface or a self-test, and " +"only execute this code after checking ``__name__``::" +msgstr "" +"模块可以查看预定义的全局变量 ``__name__`` 获悉自己的名称。如其值为 ``'__main__'`` " +",程序将作为脚本运行。通常,许多通过导入使用的模块同时也提供命令行接口或自检代码,这些代码只在检查 ``__name__`` 之后才会执行:" + +#: ../../faq/programming.rst:2144 +msgid "" +"def main():\n" +" print('Running test...')\n" +" ...\n" +"\n" +"if __name__ == '__main__':\n" +" main()" +msgstr "" +"def main():\n" +" print('Running test...')\n" +" ...\n" +"\n" +"if __name__ == '__main__':\n" +" main()" + +#: ../../faq/programming.rst:2153 +msgid "How can I have modules that mutually import each other?" +msgstr "如何让模块相互导入?" + +#: ../../faq/programming.rst:2155 +msgid "Suppose you have the following modules:" +msgstr "假设有以下模块:" + +#: ../../faq/programming.rst:2157 +msgid ":file:`foo.py`::" +msgstr ":file:`foo.py`::" + +#: ../../faq/programming.rst:2159 +msgid "" +"from bar import bar_var\n" +"foo_var = 1" +msgstr "" +"from bar import bar_var\n" +"foo_var = 1" + +#: ../../faq/programming.rst:2162 +msgid ":file:`bar.py`::" +msgstr ":file:`bar.py`::" + +#: ../../faq/programming.rst:2164 +msgid "" +"from foo import foo_var\n" +"bar_var = 2" +msgstr "" +"from foo import foo_var\n" +"bar_var = 2" + +#: ../../faq/programming.rst:2167 +msgid "The problem is that the interpreter will perform the following steps:" +msgstr "问题是解释器将执行以下步骤:" + +#: ../../faq/programming.rst:2169 +msgid "main imports ``foo``" +msgstr "首先导入 ``foo``" + +#: ../../faq/programming.rst:2170 +msgid "Empty globals for ``foo`` are created" +msgstr "为 ``foo`` 创建空的全局变量" + +#: ../../faq/programming.rst:2171 +msgid "``foo`` is compiled and starts executing" +msgstr "编译 ``foo`` 并开始执行" + +#: ../../faq/programming.rst:2172 +msgid "``foo`` imports ``bar``" +msgstr "``foo`` 导入 ``bar``" + +#: ../../faq/programming.rst:2173 +msgid "Empty globals for ``bar`` are created" +msgstr "为 ``bar`` 创建空的全局变量" + +#: ../../faq/programming.rst:2174 +msgid "``bar`` is compiled and starts executing" +msgstr "编译 ``bar`` 并开始执行" + +#: ../../faq/programming.rst:2175 +msgid "" +"``bar`` imports ``foo`` (which is a no-op since there already is a module " +"named ``foo``)" +msgstr "``bar`` 导入 ``foo`` (该步骤无操作,因为已经有一个名为 ``foo`` 的模块)。" + +#: ../../faq/programming.rst:2176 +msgid "" +"The import mechanism tries to read ``foo_var`` from ``foo`` globals, to set " +"``bar.foo_var = foo.foo_var``" +msgstr "" +"导入机制尝试从 ``foo`` 的全局变量中读取 ``foo_var``,用来设置 ``bar.foo_var = foo.foo_var``" + +#: ../../faq/programming.rst:2178 +msgid "" +"The last step fails, because Python isn't done with interpreting ``foo`` yet" +" and the global symbol dictionary for ``foo`` is still empty." +msgstr "最后一步失败了,因为 Python 还没有完成对 foo 的解释,foo 的全局符号字典仍然是空的。" + +#: ../../faq/programming.rst:2181 +msgid "" +"The same thing happens when you use ``import foo``, and then try to access " +"``foo.foo_var`` in global code." +msgstr "当你使用 ``import foo``,然后尝试在全局代码中访问 ``foo.foo_var`` 时,会发生同样的事情。" + +#: ../../faq/programming.rst:2184 +msgid "There are (at least) three possible workarounds for this problem." +msgstr "这个问题有(至少)三种可能的解决方法。" + +#: ../../faq/programming.rst:2186 +msgid "" +"Guido van Rossum recommends avoiding all uses of ``from import " +"...``, and placing all code inside functions. Initializations of global " +"variables and class variables should use constants or built-in functions " +"only. This means everything from an imported module is referenced as " +"``.``." +msgstr "" +"Guido van Rossum 建议完全避免使用 ``from import ...`` " +",并将所有代码放在函数中。全局变量和类变量的初始化只应使用常量或内置函数。这意味着导入模块中的所有内容都以 ``.`` " +"的形式引用。" + +#: ../../faq/programming.rst:2191 +msgid "" +"Jim Roskind suggests performing steps in the following order in each module:" +msgstr "Jim Roskind 建议每个模块都应遵循以下顺序:" + +#: ../../faq/programming.rst:2193 +msgid "" +"exports (globals, functions, and classes that don't need imported base " +"classes)" +msgstr "导出(全局变量、函数和不需要导入基类的类)" + +#: ../../faq/programming.rst:2195 +msgid "``import`` statements" +msgstr "``import`` 语句" + +#: ../../faq/programming.rst:2196 +msgid "" +"active code (including globals that are initialized from imported values)." +msgstr "本模块的功能代码(包括根据导入值进行初始化的全局变量)。" + +#: ../../faq/programming.rst:2198 +msgid "" +"Van Rossum doesn't like this approach much because the imports appear in a " +"strange place, but it does work." +msgstr "Van Rossum 不太喜欢这种方法,因为 import 出现在一个奇怪的地方,但它确实有效。" + +#: ../../faq/programming.rst:2201 +msgid "" +"Matthias Urlichs recommends restructuring your code so that the recursive " +"import is not necessary in the first place." +msgstr "Matthias Urlichs 建议对代码进行重构,使得递归导入根本就没必要发生。" + +#: ../../faq/programming.rst:2204 +msgid "These solutions are not mutually exclusive." +msgstr "这些解决方案并不相互排斥。" + +#: ../../faq/programming.rst:2208 +msgid "__import__('x.y.z') returns ; how do I get z?" +msgstr "__import__('x.y.z') 返回的是 ;该如何得到 z 呢?" + +#: ../../faq/programming.rst:2210 +msgid "" +"Consider using the convenience function :func:`~importlib.import_module` " +"from :mod:`importlib` instead::" +msgstr "不妨考虑换用 :mod:`importlib` 中的函数 :func:`~importlib.import_module`:" + +#: ../../faq/programming.rst:2213 +msgid "z = importlib.import_module('x.y.z')" +msgstr "z = importlib.import_module('x.y.z')" + +#: ../../faq/programming.rst:2217 +msgid "" +"When I edit an imported module and reimport it, the changes don't show up. " +"Why does this happen?" +msgstr "对已导入的模块进行了编辑并重新导入,但变动没有得以体现。这是为什么?" + +#: ../../faq/programming.rst:2219 +msgid "" +"For reasons of efficiency as well as consistency, Python only reads the " +"module file on the first time a module is imported. If it didn't, in a " +"program consisting of many modules where each one imports the same basic " +"module, the basic module would be parsed and re-parsed many times. To force" +" re-reading of a changed module, do this::" +msgstr "" +"出于效率和一致性的原因,Python " +"仅在第一次导入模块时读取模块文件。否则,在一个多模块的程序中,每个模块都会导入相同的基础模块,那么基础模块将会被一而再、再而三地解析。如果要强行重新读取已更改的模块,请执行以下操作:" + +#: ../../faq/programming.rst:2225 +msgid "" +"import importlib\n" +"import modname\n" +"importlib.reload(modname)" +msgstr "" +"import importlib\n" +"import modname\n" +"importlib.reload(modname)" + +#: ../../faq/programming.rst:2229 +msgid "" +"Warning: this technique is not 100% fool-proof. In particular, modules " +"containing statements like::" +msgstr "警告:这个技巧不是 100% 可靠的。 具体而言,包含以下语句的模块::" + +#: ../../faq/programming.rst:2232 +msgid "from modname import some_objects" +msgstr "from modname import some_objects" + +#: ../../faq/programming.rst:2234 +msgid "" +"will continue to work with the old version of the imported objects. If the " +"module contains class definitions, existing class instances will *not* be " +"updated to use the new class definition. This can result in the following " +"paradoxical behaviour::" +msgstr "仍将继续使用前一版的导入对象。如果模块包含了类的定义,并 *不会* 用新的类定义更新现有的类实例。这样可能会导致以下矛盾的行为:" + +#: ../../faq/programming.rst:2239 +msgid "" +">>> import importlib\n" +">>> import cls\n" +">>> c = cls.C() # Create an instance of C\n" +">>> importlib.reload(cls)\n" +"\n" +">>> isinstance(c, cls.C) # isinstance is false?!?\n" +"False" +msgstr "" +">>> import importlib\n" +">>> import cls\n" +">>> c = cls.C() # Create an instance of C\n" +">>> importlib.reload(cls)\n" +"\n" +">>> isinstance(c, cls.C) # isinstance is false?!?\n" +"False" + +#: ../../faq/programming.rst:2247 +msgid "" +"The nature of the problem is made clear if you print out the \"identity\" of" +" the class objects::" +msgstr "只要把类对象的 id 打印出来,问题的性质就会一目了然:" + +#: ../../faq/programming.rst:2250 +msgid "" +">>> hex(id(c.__class__))\n" +"'0x7352a0'\n" +">>> hex(id(cls.C))\n" +"'0x4198d0'" +msgstr "" +">>> hex(id(c.__class__))\n" +"'0x7352a0'\n" +">>> hex(id(cls.C))\n" +"'0x4198d0'" + +#: ../../faq/programming.rst:409 +msgid "argument" +msgstr "argument -- 参数" + +#: ../../faq/programming.rst:409 +msgid "difference from parameter" +msgstr "与形参的区别" + +#: ../../faq/programming.rst:409 +msgid "parameter" +msgstr "parameter -- 形参" + +#: ../../faq/programming.rst:409 +msgid "difference from argument" +msgstr "与参数的区别" diff --git a/faq/windows.po b/faq/windows.po new file mode 100644 index 0000000000..7660f04717 --- /dev/null +++ b/faq/windows.po @@ -0,0 +1,508 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../faq/windows.rst:9 +msgid "Python on Windows FAQ" +msgstr "Python 在 Windows 上的常见问题" + +#: ../../faq/windows.rst:12 +msgid "Contents" +msgstr "目录" + +#: ../../faq/windows.rst:22 +msgid "How do I run a Python program under Windows?" +msgstr "我怎样在 Windows 下运行一个 Python 程序?" + +#: ../../faq/windows.rst:24 +msgid "" +"This is not necessarily a straightforward question. If you are already " +"familiar with running programs from the Windows command line then everything" +" will seem obvious; otherwise, you might need a little more guidance." +msgstr "" +"这不一定是一个简单的问题。如果你已经熟悉在 Windows 的命令行中运行程序的方法,一切都显而易见;不然的话,你也许需要额外获得些许指导。" + +#: ../../faq/windows.rst:28 +msgid "" +"Unless you use some sort of integrated development environment, you will end" +" up *typing* Windows commands into what is referred to as a \"Command prompt" +" window\". Usually you can create such a window from your search bar by " +"searching for ``cmd``. You should be able to recognize when you have " +"started such a window because you will see a Windows \"command prompt\", " +"which usually looks like this:" +msgstr "" +"除非你使用某种集成开发环境,否则你最终会在所谓的 \"命令提示窗口 \"中 *输入* Windows 命令。通常情况下,你可以在搜索栏中搜索 " +"``cmd`` 来创建这样一个窗口。你应该能够发现你已经启动了这样一个窗口,因为你会看到一个 Windows \"命令提示符\",它通常看起来像这样。" + +#: ../../faq/windows.rst:35 +msgid "C:\\>" +msgstr "C:\\>" + +#: ../../faq/windows.rst:39 +msgid "" +"The letter may be different, and there might be other things after it, so " +"you might just as easily see something like:" +msgstr "前面的字母可能会不同,而且后面有可能会有其他东西,所以你也许会看到类似这样的东西:" + +#: ../../faq/windows.rst:42 +msgid "D:\\YourName\\Projects\\Python>" +msgstr "D:\\YourName\\Projects\\Python>" + +#: ../../faq/windows.rst:46 +msgid "" +"depending on how your computer has been set up and what else you have " +"recently done with it. Once you have started such a window, you are well on" +" the way to running Python programs." +msgstr "出现的内容具体取决于你的电脑如何设置和最近用它做的事。当你启动了这样一个窗口后,就可以开始运行 Python 程序了。" + +#: ../../faq/windows.rst:50 +msgid "" +"You need to realize that your Python scripts have to be processed by another" +" program called the Python *interpreter*. The interpreter reads your " +"script, compiles it into bytecodes, and then executes the bytecodes to run " +"your program. So, how do you arrange for the interpreter to handle your " +"Python?" +msgstr "" +"Python 脚本需要被另外一个叫做 Python *解释器* 的程序来处理。解释器读取脚本,把它编译成字节码,然后执行字节码来运行你的程序。 " +"所以怎样安排解释器来处理你的 Python 脚本呢?" + +#: ../../faq/windows.rst:55 +msgid "" +"First, you need to make sure that your command window recognises the word " +"\"py\" as an instruction to start the interpreter. If you have opened a " +"command window, you should try entering the command ``py`` and hitting " +"return:" +msgstr "首先,确保命令窗口能够将“py”识别为指令来开启解释器。如果你打开过一个命令窗口,尝试输入命令 ``py`` 然后按回车:" + +#: ../../faq/windows.rst:60 +msgid "C:\\Users\\YourName> py" +msgstr "C:\\Users\\YourName> py" + +#: ../../faq/windows.rst:64 +msgid "You should then see something like:" +msgstr "然后你应当看见类似这样的东西:" + +#: ../../faq/windows.rst:66 +msgid "" +"Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)] on win32\n" +"Type \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n" +">>>" +msgstr "" +"Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)] on win32\n" +"Type \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n" +">>>" + +#: ../../faq/windows.rst:72 +msgid "" +"You have started the interpreter in \"interactive mode\". That means you can" +" enter Python statements or expressions interactively and have them executed" +" or evaluated while you wait. This is one of Python's strongest features. " +"Check it by entering a few expressions of your choice and seeing the " +"results:" +msgstr "" +"解释器已经以“交互模式”打开。这意味着你可以交互输入 Python 语句或表达式,并在等待时执行或评估它们。这是 Python " +"最强大的功能之一。输入几个表达式并看看结果:" + +#: ../../faq/windows.rst:77 +msgid "" +">>> print(\"Hello\")\n" +"Hello\n" +">>> \"Hello\" * 3\n" +"'HelloHelloHello'" +msgstr "" +">>> print(\"Hello\")\n" +"Hello\n" +">>> \"Hello\" * 3\n" +"'HelloHelloHello'" + +#: ../../faq/windows.rst:84 +msgid "" +"Many people use the interactive mode as a convenient yet highly programmable" +" calculator. When you want to end your interactive Python session, call the" +" :func:`exit` function or hold the :kbd:`Ctrl` key down while you enter a " +":kbd:`Z`, then hit the \":kbd:`Enter`\" key to get back to your Windows " +"command prompt." +msgstr "" +"许多人把交互模式当作方便和高度可编程的计算器。想结束交互式 Python 会话时,调用 :func:`exit` 函数,或者按住 :kbd:`Ctrl`" +" 键时输入 :kbd:`Z`,之后按 :kbd:`Enter` 键返回 Windows 命令提示符。" + +#: ../../faq/windows.rst:90 +msgid "" +"You may also find that you have a Start-menu entry such as " +":menuselection:`Start --> Programs --> Python 3.x --> Python (command line)`" +" that results in you seeing the ``>>>`` prompt in a new window. If so, the " +"window will disappear after you call the :func:`exit` function or enter the " +":kbd:`Ctrl-Z` character; Windows is running a single \"python\" command in " +"the window, and closes it when you terminate the interpreter." +msgstr "" +"你可能发现在开始菜单有这样一个条目 :menuselection:`开始 --> 所有程序 --> Python 3.x --> Python " +"(命令行)`,运行它后会出现一个有着 ``>>>`` 提示的新窗口。在此之后,如果调用 :func:`exit` 函数或按 :kbd:`Ctrl-Z` " +"组合键后窗口将会消失。Windows 会在这个窗口中运行一个“python”命令,并且在你终止解释器的时候关闭它。" + +#: ../../faq/windows.rst:97 +msgid "" +"Now that we know the ``py`` command is recognized, you can give your Python " +"script to it. You'll have to give either an absolute or a relative path to " +"the Python script. Let's say your Python script is located in your desktop " +"and is named ``hello.py``, and your command prompt is nicely opened in your " +"home directory so you're seeing something similar to::" +msgstr "" +"现在我们知道 ``py`` 命令已经被识别,可以输入 Python 脚本了。你需要提供 Python 脚本的绝对路径或相对路径。假设 Python " +"脚本位于桌面上并命名为 ``hello.py``,并且命令提示符在用户主目录打开,那么可以看到类似于这样的东西::" + +#: ../../faq/windows.rst:104 +msgid "C:\\Users\\YourName>" +msgstr "C:\\Users\\YourName>" + +#: ../../faq/windows.rst:106 +msgid "" +"So now you'll ask the ``py`` command to give your script to Python by typing" +" ``py`` followed by your script path::" +msgstr "那么现在可以让 ``py`` 命令执行你的脚本,只需要输入 ``py`` 和脚本路径::" + +#: ../../faq/windows.rst:110 +msgid "" +"C:\\Users\\YourName> py Desktop\\hello.py\n" +"hello" +msgstr "" +"C:\\Users\\YourName> py Desktop\\hello.py\n" +"hello" + +#: ../../faq/windows.rst:114 +msgid "How do I make Python scripts executable?" +msgstr "我怎么让 Python 脚本可执行?" + +#: ../../faq/windows.rst:116 +msgid "" +"On Windows, the standard Python installer already associates the .py " +"extension with a file type (Python.File) and gives that file type an open " +"command that runs the interpreter (``D:\\Program Files\\Python\\python.exe " +"\"%1\" %*``). This is enough to make scripts executable from the command " +"prompt as 'foo.py'. If you'd rather be able to execute the script by simple" +" typing 'foo' with no extension you need to add .py to the PATHEXT " +"environment variable." +msgstr "" +"在 Windows 上,标准 Python 安装程序已将 .py 扩展名与文件类型 (Python.File) " +"相关联,并为该文件类型提供运行解释器的打开命令 (``D:\\Program Files\\Python\\python.exe \"%1\" " +"%*``) 。这足以使脚本在命令提示符下作为“foo.py”命令被执行。如果希望通过简单地键入“foo”而无需输入文件扩展名来执行脚本,则需要将 .py" +" 添加到 PATHEXT 环境变量中。" + +#: ../../faq/windows.rst:124 +msgid "Why does Python sometimes take so long to start?" +msgstr "为什么有时候 Python 程序会启动缓慢?" + +#: ../../faq/windows.rst:126 +msgid "" +"Usually Python starts very quickly on Windows, but occasionally there are " +"bug reports that Python suddenly begins to take a long time to start up. " +"This is made even more puzzling because Python will work fine on other " +"Windows systems which appear to be configured identically." +msgstr "" +"通常,Python 在 Windows 上启动得很快,但偶尔会有错误报告说 Python 突然需要很长时间才能启动。更令人费解的是,在其他配置相同的 " +"Windows 系统上,Python 却可以工作得很好。" + +#: ../../faq/windows.rst:131 +msgid "" +"The problem may be caused by a misconfiguration of virus checking software " +"on the problem machine. Some virus scanners have been known to introduce " +"startup overhead of two orders of magnitude when the scanner is configured " +"to monitor all reads from the filesystem. Try checking the configuration of" +" virus scanning software on your systems to ensure that they are indeed " +"configured identically. McAfee, when configured to scan all file system read" +" activity, is a particular offender." +msgstr "" +"该问题可能是由于计算机上的杀毒软件配置错误造成的。当将病毒扫描配置为监视文件系统中所有读取行为时,一些杀毒扫描程序会导致两个数量级的启动开销。请检查你系统安装的杀毒扫描程序的配置,确保它们是同样的配置。已知的," +" McAfee 杀毒软件在将它设置为扫描所有文件系统访问时,会产生这个问题。" + +#: ../../faq/windows.rst:141 +msgid "How do I make an executable from a Python script?" +msgstr "我怎样使用 Python 脚本制作可执行文件?" + +#: ../../faq/windows.rst:143 +msgid "" +"See :ref:`faq-create-standalone-binary` for a list of tools that can be used" +" to make executables." +msgstr "请参阅 :ref:`faq-create-standalone-binary` 查看可用来生成可执行文件的工具清单。" + +#: ../../faq/windows.rst:148 +msgid "Is a ``*.pyd`` file the same as a DLL?" +msgstr "``*.pyd`` 文件和 DLL 文件相同吗?" + +#: ../../faq/windows.rst:150 +msgid "" +"Yes, .pyd files are dll's, but there are a few differences. If you have a " +"DLL named ``foo.pyd``, then it must have a function ``PyInit_foo()``. You " +"can then write Python \"import foo\", and Python will search for foo.pyd (as" +" well as foo.py, foo.pyc) and if it finds it, will attempt to call " +"``PyInit_foo()`` to initialize it. You do not link your .exe with foo.lib, " +"as that would cause Windows to require the DLL to be present." +msgstr "" +"是的, .pyd 文件也是 dll,但有一些差异。如果你有一个名为 ``foo.pyd`` 的 DLL,那么它必须有一个函数 " +"``PyInit_foo()``。然后你可以编写 Python 代码“import foo” ,Python 将搜索 foo.pyd(以及 " +"foo.py、foo.pyc)。如果找到它,将尝试调用 ``PyInit_foo()`` 来初始化它。你不应将 .exe 与 foo.lib " +"链接,因为这会导致 Windows 要求存在 DLL。" + +#: ../../faq/windows.rst:157 +msgid "" +"Note that the search path for foo.pyd is PYTHONPATH, not the same as the " +"path that Windows uses to search for foo.dll. Also, foo.pyd need not be " +"present to run your program, whereas if you linked your program with a dll, " +"the dll is required. Of course, foo.pyd is required if you want to say " +"``import foo``. In a DLL, linkage is declared in the source code with " +"``__declspec(dllexport)``. In a .pyd, linkage is defined in a list of " +"available functions." +msgstr "" +"请注意,foo.pyd 的搜索路径是 PYTHONPATH,与 Windows 用于搜索 foo.dll 的路径不同。此外,foo.pyd " +"不需要存在来运行你的程序,而如果你将程序与 dll 链接,则需要 dll。当然,如果你想 ``import foo``,则需要 foo.pyd 。在 " +"DLL 中,链接在源代码中用 ``__declspec(dllexport)`` 声明。在 .pyd 中,链接在可用函数列表中定义。" + +#: ../../faq/windows.rst:166 +msgid "How can I embed Python into a Windows application?" +msgstr "我怎样将 Python 嵌入一个 Windows 程序?" + +#: ../../faq/windows.rst:168 +msgid "" +"Embedding the Python interpreter in a Windows app can be summarized as " +"follows:" +msgstr "在 Windows 应用程序中嵌入 Python 解释器可以总结如下:" + +#: ../../faq/windows.rst:170 +msgid "" +"Do **not** build Python into your .exe file directly. On Windows, Python " +"must be a DLL to handle importing modules that are themselves DLL's. (This " +"is the first key undocumented fact.) Instead, link to " +":file:`python{NN}.dll`; it is typically installed in " +"``C:\\Windows\\System``. *NN* is the Python version, a number such as " +"\"33\" for Python 3.3." +msgstr "" +"请 **不要** 直接将 Python 编译到你的 .exe 文件中。在 Windows 上,Python 必须是一个 DLL 以便处理导入本身就是 " +"DLL 的模块。 (这是首先要知道的未写入文档的关键事实。)正确的做法,应该是链接到 :file:`python{NN}.dll`;它通常安装在 " +"``C:\\Windows\\System`` 中。 *NN* 是 Python 的版本号,例如数字 \"33\" 代表 Python 3.3。" + +#: ../../faq/windows.rst:176 +msgid "" +"You can link to Python in two different ways. Load-time linking means " +"linking against :file:`python{NN}.lib`, while run-time linking means linking" +" against :file:`python{NN}.dll`. (General note: :file:`python{NN}.lib` is " +"the so-called \"import lib\" corresponding to :file:`python{NN}.dll`. It " +"merely defines symbols for the linker.)" +msgstr "" +"你可以通过两种不同的方式链接到 Python。加载时链接意味着链接到 :file:`python{NN}.lib`,而运行时链接意味着链接 " +":file:`python{NN}.dll`。(一般说明: :file:`python {NN}.lib` 是所谓的“import lib”,对应于 " +":file:`python{NN}.dll`。它只定义了链接器的符号。)" + +#: ../../faq/windows.rst:182 +msgid "" +"Run-time linking greatly simplifies link options; everything happens at run " +"time. Your code must load :file:`python{NN}.dll` using the Windows " +"``LoadLibraryEx()`` routine. The code must also use access routines and " +"data in :file:`python{NN}.dll` (that is, Python's C API's) using pointers " +"obtained by the Windows ``GetProcAddress()`` routine. Macros can make using" +" these pointers transparent to any C code that calls routines in Python's C " +"API." +msgstr "" +"运行时链接极大地简化了链接选项,一切都在运行时发生。你的代码必须使用 Windows 的 ``LoadLibraryEx()`` 程序加载 " +":file:`python{NN}.dll`。代码还必须使用使用 Windows 的 ``GetProcAddress()`` 例程获得的指针访问 " +":file:`python{NN}.dll` 中程序和数据(即 Python 的 C API)。宏可以使这些指针对任何调用 Python C API " +"中的例程的 C 代码都是透明的。" + +#: ../../faq/windows.rst:191 +msgid "" +"If you use SWIG, it is easy to create a Python \"extension module\" that " +"will make the app's data and methods available to Python. SWIG will handle " +"just about all the grungy details for you. The result is C code that you " +"link *into* your .exe file (!) You do **not** have to create a DLL file, " +"and this also simplifies linking." +msgstr "" +"如果你是使用 SWIG,那么很容易创建一个将使得应用的数据和方法可供 Python 使用的 \"扩展模块\"。SWIG 将为你处理所有繁琐的细节。 " +"结果是让你链接 *置入* 你的 .exe 文件当中的 C 代码 (!) 你 **无需** 创建一个 DLL 文件,而这也简化了链接过程。" + +#: ../../faq/windows.rst:197 +msgid "" +"SWIG will create an init function (a C function) whose name depends on the " +"name of the extension module. For example, if the name of the module is " +"leo, the init function will be called initleo(). If you use SWIG shadow " +"classes, as you should, the init function will be called initleoc(). This " +"initializes a mostly hidden helper class used by the shadow class." +msgstr "" +"SWIG 将创建一个 init 函数(一个 C 函数),其名称取决于扩展模块的名称。例如,如果模块的名称是 leo,则 init 函数将被称为 " +"initleo() 。如果你使用 SWIG 影子类,则 init 函数将被称为 initleoc() 。这初始化了一个由影子类使用的隐藏辅助类。" + +#: ../../faq/windows.rst:203 +msgid "" +"The reason you can link the C code in step 2 into your .exe file is that " +"calling the initialization function is equivalent to importing the module " +"into Python! (This is the second key undocumented fact.)" +msgstr "" +"你可以将步骤 2 中的 C 代码链接到 .exe 文件的原因是调用初始化函数等同于将模块导入 Python! (这是第二个关键的未记载事实。)" + +#: ../../faq/windows.rst:207 +msgid "" +"In short, you can use the following code to initialize the Python " +"interpreter with your extension module." +msgstr "简而言之,你可以用以下代码使用扩展模块初始化 Python 解释器。" + +#: ../../faq/windows.rst:210 +msgid "" +"#include \n" +"...\n" +"Py_Initialize(); // Initialize Python.\n" +"initmyAppc(); // Initialize (import) the helper class.\n" +"PyRun_SimpleString(\"import myApp\"); // Import the shadow class." +msgstr "" +"#include \n" +"...\n" +"Py_Initialize(); // 初始化 Python。\n" +"initmyAppc(); // 初始化(导入)辅助类。\n" +"PyRun_SimpleString(\"import myApp\"); // 导入影子类。" + +#: ../../faq/windows.rst:218 +msgid "" +"There are two problems with Python's C API which will become apparent if you" +" use a compiler other than MSVC, the compiler used to build pythonNN.dll." +msgstr "Python C API 存在两个问题,如果你使用除 MSVC 之外的编译器用于构建 pythonNN.dll,这将会变得明显。" + +#: ../../faq/windows.rst:221 +msgid "" +"Problem 1: The so-called \"Very High Level\" functions that take ``FILE *`` " +"arguments will not work in a multi-compiler environment because each " +"compiler's notion of a ``struct FILE`` will be different. From an " +"implementation standpoint these are very low level functions." +msgstr "" +"问题 1: 接受 ``FILE *`` 参数的所谓的 \"极高层级\" 函数在多编译器环境中将不起作用,因为每个编译器中 ``struct FILE``" +" 的概念都会是不同的。从实现的角度看来这些都是极低层级的函数。" + +#: ../../faq/windows.rst:226 +msgid "" +"Problem 2: SWIG generates the following code when generating wrappers to " +"void functions:" +msgstr "问题 2:在为 void 函数生成包装器时,SWIG 会生成以下代码:" + +#: ../../faq/windows.rst:229 +msgid "" +"Py_INCREF(Py_None);\n" +"_resultobj = Py_None;\n" +"return _resultobj;" +msgstr "" +"Py_INCREF(Py_None);\n" +"_resultobj = Py_None;\n" +"return _resultobj;" + +#: ../../faq/windows.rst:235 +msgid "" +"Alas, Py_None is a macro that expands to a reference to a complex data " +"structure called _Py_NoneStruct inside pythonNN.dll. Again, this code will " +"fail in a mult-compiler environment. Replace such code by:" +msgstr "" +"Py_None 是一个宏,它扩展为对 pythonNN.dll 中名为 _Py_NoneStruct " +"的复杂数据结构的引用。同样,此代码将在多编译器环境中失败。将此类代码替换为:" + +#: ../../faq/windows.rst:239 +msgid "return Py_BuildValue(\"\");" +msgstr "return Py_BuildValue(\"\");" + +#: ../../faq/windows.rst:243 +msgid "" +"It may be possible to use SWIG's ``%typemap`` command to make the change " +"automatically, though I have not been able to get this to work (I'm a " +"complete SWIG newbie)." +msgstr "有可能使用 SWIG 的 ``%typemap`` 命令自动进行更改,但我无法使其工作(我是一个完全的 SWIG 新手)。" + +#: ../../faq/windows.rst:247 +msgid "" +"Using a Python shell script to put up a Python interpreter window from " +"inside your Windows app is not a good idea; the resulting window will be " +"independent of your app's windowing system. Rather, you (or the " +"wxPythonWindow class) should create a \"native\" interpreter window. It is " +"easy to connect that window to the Python interpreter. You can redirect " +"Python's i/o to _any_ object that supports read and write, so all you need " +"is a Python object (defined in your extension module) that contains read() " +"and write() methods." +msgstr "" +"使用 Python shell 脚本从 Windows 应用程序内部建立 Python " +"解释器窗口并不是一个好主意;生成的窗口将独立于应用程序的窗口系统。相反,你(或 wxPythonWindow " +"类)应该创建一个“本机”解释器窗口。将该窗口连接到 Python 解释器很容易。你可以将 Python 的 i/o 重定向到支持读写的 _任意_ " +"对象,因此你只需要一个包含 read() 和 write() 方法的 Python 对象(在扩展模块中定义)。" + +#: ../../faq/windows.rst:256 +msgid "How do I keep editors from inserting tabs into my Python source?" +msgstr "如何让编辑器不要在我的 Python 源代码中插入 tab?" + +#: ../../faq/windows.rst:258 +msgid "" +"The FAQ does not recommend using tabs, and the Python style guide, :pep:`8`," +" recommends 4 spaces for distributed Python code; this is also the Emacs " +"python-mode default." +msgstr "" +"本 FAQ 不建议使用制表符,Python 样式指南 :pep:`8`,为发行的 Python 代码推荐 4 个空格;这也是 Emacs python-" +"mode 默认值。" + +#: ../../faq/windows.rst:262 +msgid "" +"Under any editor, mixing tabs and spaces is a bad idea. MSVC is no " +"different in this respect, and is easily configured to use spaces: Take " +":menuselection:`Tools --> Options --> Tabs`, and for file type \"Default\" " +"set \"Tab size\" and \"Indent size\" to 4, and select the \"Insert spaces\" " +"radio button." +msgstr "" +"在任何编辑器下,混合制表符和空格都是一个坏主意。MSVC 在这方面没有什么不同,并且很容易配置为使用空格:点击 " +":menuselection:`Tools --> Options --> Tabs`,对于文件类型“Default”,设置“Tab " +"size”和“Indent size”为 4,并选择“插入空格”单选按钮。" + +#: ../../faq/windows.rst:267 +msgid "" +"Python raises :exc:`IndentationError` or :exc:`TabError` if mixed tabs and " +"spaces are causing problems in leading whitespace. You may also run the " +":mod:`tabnanny` module to check a directory tree in batch mode." +msgstr "" +"如果混合制表符和空格导致前导空格出现问题,Python 会引发 :exc:`IndentationError` 或 :exc:`TabError` " +"。你还可以运行 :mod:`tabnanny` 模块以批处理模式检查目录树。" + +#: ../../faq/windows.rst:274 +msgid "How do I check for a keypress without blocking?" +msgstr "如何在不阻塞的情况下检查按键?" + +#: ../../faq/windows.rst:276 +msgid "" +"Use the :mod:`msvcrt` module. This is a standard Windows-specific extension" +" module. It defines a function ``kbhit()`` which checks whether a keyboard " +"hit is present, and ``getch()`` which gets one character without echoing it." +msgstr "" +"使用 :mod:`msvcrt` 模块。这是一个标准的 Windows 专属扩展模块。它定义了一个函数 ``kbhit()`` " +"用于检查是否有键盘中的某个键被按下,以及 ``getch()`` 用于获取一个字符而不将其回显。" + +#: ../../faq/windows.rst:281 +msgid "How do I solve the missing api-ms-win-crt-runtime-l1-1-0.dll error?" +msgstr "我该如何解决缺失 api-ms-win-crt-runtime-l1-1-0.dll 错误?" + +#: ../../faq/windows.rst:283 +msgid "" +"This can occur on Python 3.5 and later when using Windows 8.1 or earlier " +"without all updates having been installed. First ensure your operating " +"system is supported and is up to date, and if that does not resolve the " +"issue, visit the `Microsoft support page `_ for guidance on manually installing the C Runtime " +"update." +msgstr "" +"这将在使用未安装全部更新的 Windows 8.1 或更旧的系统时发生于 Python 3.5 及之后的版本上。 " +"首先请确保你的操作系统受支持并且已经更新补丁,如果此问题仍未解决,请访问 `Microsoft support page " +"`_ 获取有关手动安装 C 运行时更新补丁的指导。" diff --git a/glossary.po b/glossary.po new file mode 100644 index 0000000000..28eb21804f --- /dev/null +++ b/glossary.po @@ -0,0 +1,3639 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-06-21 16:40+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../glossary.rst:5 +msgid "Glossary" +msgstr "术语对照表" + +#: ../../glossary.rst:10 +msgid "``>>>``" +msgstr "``>>>``" + +#: ../../glossary.rst:12 +msgid "" +"The default Python prompt of the :term:`interactive` shell. Often seen for " +"code examples which can be executed interactively in the interpreter." +msgstr ":term:`interactive` shell 中默认的 Python 提示符。往往会显示于能以交互方式在解释器里执行的样例代码之前。" + +#: ../../glossary.rst:15 +msgid "``...``" +msgstr "``...``" + +#: ../../glossary.rst:17 +msgid "Can refer to:" +msgstr "具有以下含义:" + +#: ../../glossary.rst:19 +msgid "" +"The default Python prompt of the :term:`interactive` shell when entering the" +" code for an indented code block, when within a pair of matching left and " +"right delimiters (parentheses, square brackets, curly braces or triple " +"quotes), or after specifying a decorator." +msgstr "" +":term:`interactive` shell 中输入特殊代码时默认的 Python " +"提示符,特殊代码包括缩进的代码块,左右成对分隔符(圆括号、方括号、花括号或三重引号等)之内,或是在指定一个装饰器之后。" + +#: ../../glossary.rst:26 +msgid "" +"The three dots form of the :ref:`Ellipsis ` object." +msgstr "三点形式的 :ref:`省略符 ` 对象。" + +#: ../../glossary.rst:27 +msgid "abstract base class" +msgstr "abstract base class -- 抽象基类" + +#: ../../glossary.rst:29 +msgid "" +"Abstract base classes complement :term:`duck-typing` by providing a way to " +"define interfaces when other techniques like :func:`hasattr` would be clumsy" +" or subtly wrong (for example with :ref:`magic methods `). " +"ABCs introduce virtual subclasses, which are classes that don't inherit from" +" a class but are still recognized by :func:`isinstance` and " +":func:`issubclass`; see the :mod:`abc` module documentation. Python comes " +"with many built-in ABCs for data structures (in the :mod:`collections.abc` " +"module), numbers (in the :mod:`numbers` module), streams (in the :mod:`io` " +"module), import finders and loaders (in the :mod:`importlib.abc` module). " +"You can create your own ABCs with the :mod:`abc` module." +msgstr "" +"抽象基类简称 ABC,是对 :term:`duck-typing` 的补充,它提供了一种定义接口的新方式,相比之下其他技巧例如 " +":func:`hasattr` 显得过于笨拙或有微妙错误 (例如使用 :ref:`魔术方法 `)。 ABC " +"引入了虚拟子类,这种类并非继承自其他类,但却仍能被 :func:`isinstance` 和 :func:`issubclass` 所认可;详见 " +":mod:`abc` 模块文档。Python 自带许多内置的 ABC 用于实现数据结构(在 :mod:`collections.abc` " +"模块中)、数字(在 :mod:`numbers` 模块中)、流(在 :mod:`io` 模块中)、导入查找器和加载器(在 " +":mod:`importlib.abc` 模块中)。你可以使用 :mod:`abc` 模块来创建自己的 ABC。" + +#: ../../glossary.rst:40 +msgid "annotate function" +msgstr "annotate function -- 标注函数" + +#: ../../glossary.rst:42 +msgid "" +"A callable that can be called to retrieve the :term:`annotations " +"` of an object. Annotate functions are usually :term:`functions " +"`, automatically generated as the :attr:`~object.__annotate__` " +"attribute of functions, classes, and modules. Annotate functions are a " +"subset of :term:`evaluate functions `." +msgstr "" + +#: ../../glossary.rst:47 +msgid "annotation" +msgstr "annotation -- 标注" + +#: ../../glossary.rst:49 +msgid "" +"A label associated with a variable, a class attribute or a function " +"parameter or return value, used by convention as a :term:`type hint`." +msgstr "关联到某个变量、类属性、函数形参或返回值的标签,被约定作为 :term:`类型注解 ` 来使用。" + +#: ../../glossary.rst:53 +msgid "" +"Annotations of local variables cannot be accessed at runtime, but " +"annotations of global variables, class attributes, and functions can be " +"retrieved by calling :func:`annotationlib.get_annotations` on modules, " +"classes, and functions, respectively." +msgstr "" +"局部变量的标注在运行时不可被访问,但全局变量、类属性和函数的标注可分别通过在模块、类和函数上调用 " +":func:`annotationlib.get_annotations` 来提取。" + +#: ../../glossary.rst:58 +msgid "" +"See :term:`variable annotation`, :term:`function annotation`, :pep:`484`, " +":pep:`526`, and :pep:`649`, which describe this functionality. Also see " +":ref:`annotations-howto` for best practices on working with annotations." +msgstr "" +"参见 :term:`variable annotation`, :term:`function annotation`, :pep:`484`, " +":pep:`526` 和 :pep:`649`,其中对此功能进行了描述。另请参见 :ref:`annotations-howto` " +"了解使用标注的最佳实践。" + +#: ../../glossary.rst:62 +msgid "argument" +msgstr "argument -- 参数" + +#: ../../glossary.rst:64 +msgid "" +"A value passed to a :term:`function` (or :term:`method`) when calling the " +"function. There are two kinds of argument:" +msgstr "在调用函数时传给 :term:`function` (或 :term:`method`) 的值。参数分为两种:" + +#: ../../glossary.rst:67 +msgid "" +":dfn:`keyword argument`: an argument preceded by an identifier (e.g. " +"``name=``) in a function call or passed as a value in a dictionary preceded " +"by ``**``. For example, ``3`` and ``5`` are both keyword arguments in the " +"following calls to :func:`complex`::" +msgstr "" +":dfn:`关键字参数`: 在函数调用中前面带有标识符 (例如 ``name=``) 或者作为包含在前面带有 ``**`` " +"的字典里的值传入。举例来说,``3`` 和 ``5`` 在以下对 :func:`complex` 的调用中均属于关键字参数::" + +#: ../../glossary.rst:72 +msgid "" +"complex(real=3, imag=5)\n" +"complex(**{'real': 3, 'imag': 5})" +msgstr "" +"complex(real=3, imag=5)\n" +"complex(**{'real': 3, 'imag': 5})" + +#: ../../glossary.rst:75 +msgid "" +":dfn:`positional argument`: an argument that is not a keyword argument. " +"Positional arguments can appear at the beginning of an argument list and/or " +"be passed as elements of an :term:`iterable` preceded by ``*``. For example," +" ``3`` and ``5`` are both positional arguments in the following calls::" +msgstr "" +":dfn:`位置参数`: 不属于关键字参数的参数。位置参数可出现于参数列表的开头以及/或者作为前面带有 ``*`` 的 :term:`iterable`" +" 里的元素被传入。举例来说,``3`` 和 ``5`` 在以下调用中均属于位置参数::" + +#: ../../glossary.rst:81 +msgid "" +"complex(3, 5)\n" +"complex(*(3, 5))" +msgstr "" +"complex(3, 5)\n" +"complex(*(3, 5))" + +#: ../../glossary.rst:84 +msgid "" +"Arguments are assigned to the named local variables in a function body. See " +"the :ref:`calls` section for the rules governing this assignment. " +"Syntactically, any expression can be used to represent an argument; the " +"evaluated value is assigned to the local variable." +msgstr "" +"参数会被赋值给函数体中对应的局部变量。有关赋值规则参见 :ref:`calls` " +"一节。根据语法,任何表达式都可用来表示一个参数;最终算出的值会被赋给对应的局部变量。" + +#: ../../glossary.rst:89 +msgid "" +"See also the :term:`parameter` glossary entry, the FAQ question on :ref:`the" +" difference between arguments and parameters `, " +"and :pep:`362`." +msgstr "" +"另参见 :term:`parameter` 术语表条目,常见问题中 :ref:`参数与形参的区别 ` 以及 :pep:`362`。" + +#: ../../glossary.rst:92 +msgid "asynchronous context manager" +msgstr "asynchronous context manager -- 异步上下文管理器" + +#: ../../glossary.rst:94 +msgid "" +"An object which controls the environment seen in an :keyword:`async with` " +"statement by defining :meth:`~object.__aenter__` and " +":meth:`~object.__aexit__` methods. Introduced by :pep:`492`." +msgstr "" +"此种对象通过定义 :meth:`~object.__aenter__` 和 :meth:`~object.__aexit__` 方法来对 " +":keyword:`async with` 语句中的环境进行控制。由 :pep:`492` 引入。" + +#: ../../glossary.rst:97 +msgid "asynchronous generator" +msgstr "asynchronous generator -- 异步生成器" + +#: ../../glossary.rst:99 +msgid "" +"Informally used to mean either an :term:`asynchronous generator function` or" +" an :term:`asynchronous generator iterator`, depending on context. The " +"formal terms :term:`asynchronous generator function` and :term:`asynchronous" +" generator iterator` are uncommon in practice; \"asynchronous generator\" " +"alone is almost always sufficient." +msgstr "" + +#: ../../glossary.rst:104 +msgid "asynchronous generator function" +msgstr "" + +#: ../../glossary.rst:106 +msgid "" +"A function which returns an :term:`asynchronous generator iterator`. It " +"looks like a coroutine function defined with :keyword:`async def` except " +"that it contains :keyword:`yield` expressions for producing a series of " +"values usable in an :keyword:`async for` loop. See :pep:`525`." +msgstr "" + +#: ../../glossary.rst:111 +msgid "" +"An asynchronous generator function may contain :keyword:`await` expressions " +"as well as :keyword:`async for`, and :keyword:`async with` statements." +msgstr "" +"一个异步生成器函数可能包含 :keyword:`await` 表达式或者 :keyword:`async for` 以及 :keyword:`async" +" with` 语句。" + +#: ../../glossary.rst:114 +msgid "asynchronous generator iterator" +msgstr "asynchronous generator iterator -- 异步生成器迭代器" + +#: ../../glossary.rst:116 +msgid "An object created by an :term:`asynchronous generator function`." +msgstr "" + +#: ../../glossary.rst:118 +msgid "" +"This is an :term:`asynchronous iterator` which when called using the " +":meth:`~object.__anext__` method returns an awaitable object which will " +"execute the body of the asynchronous generator function until the next " +":keyword:`yield` expression." +msgstr "" +"此对象属于 :term:`asynchronous iterator`,当使用 :meth:`~object.__anext__` " +"方法调用时会返回一个可等待对象来执行异步生成器函数的函数体直到下一个 :keyword:`yield` 表达式。" + +#: ../../glossary.rst:123 +msgid "" +"Each :keyword:`yield` temporarily suspends processing, remembering the " +"execution state (including local variables and pending try-statements). " +"When the *asynchronous generator iterator* effectively resumes with another " +"awaitable returned by :meth:`~object.__anext__`, it picks up where it left " +"off. See :pep:`492` and :pep:`525`." +msgstr "" +"每个 :keyword:`yield` 会临时暂停处理过程,记住执行状态(包括局部变量和挂起的 try 语句)。当 *异步生成器迭代器* 通过 " +":meth:`~object.__anext__` 所返回的另一个可等待对象有效地恢复时,它会从离开位置恢复处理过程。参见 :pep:`492` 和 " +":pep:`525`." + +#: ../../glossary.rst:128 +msgid "asynchronous iterable" +msgstr "asynchronous iterable -- 异步可迭代对象" + +#: ../../glossary.rst:130 +msgid "" +"An object, that can be used in an :keyword:`async for` statement. Must " +"return an :term:`asynchronous iterator` from its :meth:`~object.__aiter__` " +"method. Introduced by :pep:`492`." +msgstr "" +"一个可以在 :keyword:`async for` 语句中使用的对象。必须通过它的 :meth:`~object.__aiter__` 方法返回一个 " +":term:`asynchronous iterator`。由 :pep:`492` 引入。" + +#: ../../glossary.rst:133 +msgid "asynchronous iterator" +msgstr "asynchronous iterator -- 异步迭代器" + +#: ../../glossary.rst:135 +msgid "" +"An object that implements the :meth:`~object.__aiter__` and " +":meth:`~object.__anext__` methods. :meth:`~object.__anext__` must return an" +" :term:`awaitable` object. :keyword:`async for` resolves the awaitables " +"returned by an asynchronous iterator's :meth:`~object.__anext__` method " +"until it raises a :exc:`StopAsyncIteration` exception. Introduced by " +":pep:`492`." +msgstr "" +"一个实现了 :meth:`~object.__aiter__` 和 :meth:`~object.__anext__` 方法的对象。 " +":meth:`~object.__anext__` 必须返回一个 :term:`awaitable` 对象。 :keyword:`async for` " +"会处理异步迭代器的 :meth:`~object.__anext__` 方法所返回的可等待对象直到其引发一个 " +":exc:`StopAsyncIteration` 异常。由 :pep:`492` 引入。" + +#: ../../glossary.rst:140 +msgid "atomic operation" +msgstr "atomic operation -- 原子化操作" + +#: ../../glossary.rst:142 +msgid "" +"An operation that appears to execute as a single, indivisible step: no other" +" thread can observe it half-done, and its effects become visible all at " +"once. Python does not guarantee that high-level statements are atomic (for " +"example, ``x += 1`` performs multiple bytecode operations and is not " +"atomic). Atomicity is only guaranteed where explicitly documented. See " +"also :term:`race condition` and :term:`data race`." +msgstr "" +"作为一个单独的、不可再分的步骤执行的操作;没有其他线程能看到其完成一半的状态,其结果将在全部完成时可见。Python " +"不保证高层级语句是原子化的(例如,``x += 1`` 将执行多个字节码操作因而不是原子化的)。原子化性质仅在显式写入文档时被保证。另请参阅 " +":term:`race condition` 和 :term:`data race`。" + +#: ../../glossary.rst:148 +msgid "attached thread state" +msgstr "attached thread state -- 附加线程状态" + +#: ../../glossary.rst:151 +msgid "A :term:`thread state` that is active for the current OS thread." +msgstr "为当前 OS 线程激活的 :term:`thread state`。" + +#: ../../glossary.rst:153 +msgid "" +"When a :term:`thread state` is attached, the OS thread has access to the " +"full Python C API and can safely invoke the bytecode interpreter." +msgstr "当附加 :term:`thread state` 时,OS 线程将可访问完整 Python C API 并能安全地唤起字节码解释器。" + +#: ../../glossary.rst:157 +msgid "" +"Unless a function explicitly notes otherwise, attempting to call the C API " +"without an attached thread state will result in a fatal error or undefined " +"behavior. A thread state can be attached and detached explicitly by the " +"user through the C API, or implicitly by the runtime, including during " +"blocking C calls and by the bytecode interpreter in between calls." +msgstr "" +"除非函数明确指出,否则尝试在没有附加线程状态的情况下调用 C API 将导致致命错误或未定义行为。线程状态可以由用户通过 C API " +"显式地附加和分离,也可以由运行时隐式地附加和分离,包括在阻塞 C 调用期间和调用之间的字节码解释器。" + +#: ../../glossary.rst:164 +msgid "" +"On most builds of Python, having an attached thread state implies that the " +"caller holds the :term:`GIL` for the current interpreter, so only one OS " +"thread can have an attached thread state at a given moment. In :term:`free-" +"threaded builds ` of Python, threads can concurrently " +"hold an attached thread state, allowing for true parallelism of the bytecode" +" interpreter." +msgstr "" +"在大多数 Python 构建版中,具有附加线程状态意味着调用方持有当前解释器的 :term:`GIL`,因此在给定时刻只有一个 OS " +"线程可以具有附加线程状态。在 Python 的 :term:`自由线程构建版 ` " +"中,线程可以并发地持有附加线程状态,从而允许字节码解释器的真正并行性。" + +#: ../../glossary.rst:170 +msgid "attribute" +msgstr "attribute -- 属性" + +#: ../../glossary.rst:172 +msgid "" +"A value associated with an object which is usually referenced by name using " +"dotted expressions. For example, if an object *o* has an attribute *a* it " +"would be referenced as *o.a*." +msgstr "关联到一个对象的值,通常使用点号表达式按名称来引用。举例来说,如果对象 *o* 具有属性 *a* 则可以用 *o.a* 来引用它。" + +#: ../../glossary.rst:177 +msgid "" +"It is possible to give an object an attribute whose name is not an " +"identifier as defined by :ref:`identifiers`, for example using " +":func:`setattr`, if the object allows it. Such an attribute will not be " +"accessible using a dotted expression, and would instead need to be retrieved" +" with :func:`getattr`." +msgstr "" +"如果对象允许,将未被定义为 :ref:`identifiers` 的非标识名称用作一个对象的属性也是可以的,例如使用 :func:`setattr`。 " +"这样的属性将无法使用点号表达式来访问,而是必须通过 :func:`getattr` 来获取。" + +#: ../../glossary.rst:182 +msgid "awaitable" +msgstr "awaitable -- 可等待对象" + +#: ../../glossary.rst:184 +msgid "" +"An object that can be used in an :keyword:`await` expression. Can be a " +":term:`coroutine` or an object with an :meth:`~object.__await__` method. See" +" also :pep:`492`." +msgstr "" +"一个可在 :keyword:`await` 表达式中使用的对象。可以是 :term:`coroutine` 或是具有 " +":meth:`~object.__await__` 方法的对象。参见 :pep:`492`。" + +#: ../../glossary.rst:187 +msgid "BDFL" +msgstr "BDFL" + +#: ../../glossary.rst:189 +msgid "" +"Benevolent Dictator For Life, a.k.a. `Guido van Rossum " +"`_, Python's creator." +msgstr "" +"“终身仁慈独裁者”的英文缩写,即 `Guido van Rossum `_,Python " +"的创造者。" + +#: ../../glossary.rst:191 +msgid "binary file" +msgstr "binary file -- 二进制文件" + +#: ../../glossary.rst:193 +msgid "" +"A :term:`file object` able to read and write :term:`bytes-like objects " +"`. Examples of binary files are files opened in binary " +"mode (``'rb'``, ``'wb'`` or ``'rb+'``), :data:`sys.stdin.buffer " +"`, :data:`sys.stdout.buffer `, and instances of " +":class:`io.BytesIO` and :class:`gzip.GzipFile`." +msgstr "" +":term:`file object` 能够读写 :term:`字节型对象 `。二进制文件的例子包括以二进制模式 " +"(``'rb'``, ``'wb'`` 或 ``'rb+'``) 打开的文件、:data:`sys.stdin.buffer " +"`、:data:`sys.stdout.buffer ` 以及 :class:`io.BytesIO` 和" +" :class:`gzip.GzipFile` 的实例。" + +#: ../../glossary.rst:200 +msgid "" +"See also :term:`text file` for a file object able to read and write " +":class:`str` objects." +msgstr "另请参见 :term:`text file` 了解能够读写 :class:`str` 对象的文件对象。" + +#: ../../glossary.rst:202 +msgid "borrowed reference" +msgstr "borrowed reference -- 借入引用" + +#: ../../glossary.rst:204 +msgid "" +"In Python's C API, a borrowed reference is a reference to an object, where " +"the code using the object does not own the reference. It becomes a dangling " +"pointer if the object is destroyed. For example, a garbage collection can " +"remove the last :term:`strong reference` to the object and so destroy it." +msgstr "" +"在 Python 的 C API 中,借用引用是指一种对象引用,使用该对象的代码并不持有该引用。如果对象被销毁则它就会变成一个悬空指针。 " +"例如,垃圾回收器可以移除对象的最后一个 :term:`strong reference` 来销毁它。" + +#: ../../glossary.rst:210 +msgid "" +"Calling :c:func:`Py_INCREF` on the :term:`borrowed reference` is recommended" +" to convert it to a :term:`strong reference` in-place, except when the " +"object cannot be destroyed before the last usage of the borrowed reference. " +"The :c:func:`Py_NewRef` function can be used to create a new :term:`strong " +"reference`." +msgstr "" +"推荐在 :term:`borrowed reference` 上调用 :c:func:`Py_INCREF` 以将其原地转换为 " +":term:`strong reference`,除非是当该对象无法在借入引用的最后一次使用之前被销毁。 :c:func:`Py_NewRef` " +"函数可以被用来创建一个新的 :term:`strong reference`。" + +#: ../../glossary.rst:215 +msgid "bytes-like object" +msgstr "bytes-like object -- 字节型对象" + +#: ../../glossary.rst:217 +msgid "" +"An object that supports the :ref:`bufferobjects` and can export a " +"C-:term:`contiguous` buffer. This includes all :class:`bytes`, " +":class:`bytearray`, and :class:`array.array` objects, as well as many common" +" :class:`memoryview` objects. Bytes-like objects can be used for various " +"operations that work with binary data; these include compression, saving to " +"a binary file, and sending over a socket." +msgstr "" +"支持 :ref:`bufferobjects` 并且能导出 C-:term:`contiguous` 缓冲的对象。这包括所有 " +":class:`bytes`、:class:`bytearray` 和 :class:`array.array` 对象,以及许多普通 " +":class:`memoryview` 对象。字节型对象可在多种二进制数据操作中使用;这些操作包括压缩、保存为二进制文件以及通过套接字发送等。" + +#: ../../glossary.rst:224 +msgid "" +"Some operations need the binary data to be mutable. The documentation often" +" refers to these as \"read-write bytes-like objects\". Example mutable " +"buffer objects include :class:`bytearray` and a :class:`memoryview` of a " +":class:`bytearray`. Other operations require the binary data to be stored in" +" immutable objects (\"read-only bytes-like objects\"); examples of these " +"include :class:`bytes` and a :class:`memoryview` of a :class:`bytes` object." +msgstr "" +"某些操作需要可变的二进制数据。这种对象在文档中常被称为“可读写字节类对象”。可变缓冲对象的例子包括 :class:`bytearray` 以及 " +":class:`bytearray` 的 :class:`memoryview`。其他操作要求二进制数据存放于不可变对象 " +"(\"只读字节类对象\");这种对象的例子包括 :class:`bytes` 以及 :class:`bytes` 对象的 " +":class:`memoryview`。" + +#: ../../glossary.rst:232 +msgid "bytecode" +msgstr "bytecode -- 字节码" + +#: ../../glossary.rst:234 +msgid "" +"Python source code is compiled into bytecode, the internal representation of" +" a Python program in the CPython interpreter. The bytecode is also cached " +"in ``.pyc`` files so that executing the same file is faster the second time " +"(recompilation from source to bytecode can be avoided). This \"intermediate" +" language\" is said to run on a :term:`virtual machine` that executes the " +"machine code corresponding to each bytecode. Do note that bytecodes are not " +"expected to work between different Python virtual machines, nor to be stable" +" between Python releases." +msgstr "" +"Python 源代码会被编译为字节码,即 CPython 解释器中表示 Python 程序的内部代码。字节码还会缓存在 ``.pyc`` " +"文件中,这样第二次执行同一文件时速度更快(可以免去将源码重新编译为字节码)。这种 \"中间语言\" 运行在根据字节码执行相应机器码的 " +":term:`virtual machine` 之上。请注意不同 Python 虚拟机上的字节码不一定通用,也不一定能在不同 Python 版本上兼容。" + +#: ../../glossary.rst:244 +msgid "" +"A list of bytecode instructions can be found in the documentation for " +":ref:`the dis module `." +msgstr "字节码指令列表可以在 :ref:`dis 模块 ` 的文档中查看。" + +#: ../../glossary.rst:246 +msgid "callable" +msgstr "callable -- 可调用对象" + +#: ../../glossary.rst:248 +msgid "" +"A callable is an object that can be called, possibly with a set of arguments" +" (see :term:`argument`), with the following syntax::" +msgstr "可调用对象就是可以执行调用运算的对象,并可能附带一组参数 (参见 :term:`argument`),使用以下语法::" + +#: ../../glossary.rst:251 +msgid "callable(argument1, argument2, argumentN)" +msgstr "callable(argument1, argument2, argumentN)" + +#: ../../glossary.rst:253 +msgid "" +"A :term:`function`, and by extension a :term:`method`, is a callable. An " +"instance of a class that implements the :meth:`~object.__call__` method is " +"also a callable." +msgstr "" +":term:`function`,还可扩展到 :term:`method` 等,就属于可调用对象。实现了 " +":meth:`~object.__call__` 方法的类的实例也属于可调用对象。" + +#: ../../glossary.rst:256 +msgid "callback" +msgstr "callback -- 回调" + +#: ../../glossary.rst:258 +msgid "" +"A subroutine function which is passed as an argument to be executed at some " +"point in the future." +msgstr "一个作为参数被传入以用以在未来的某个时刻被调用的子例程函数。" + +#: ../../glossary.rst:260 +msgid "class" +msgstr "class -- 类" + +#: ../../glossary.rst:262 +msgid "" +"A template for creating user-defined objects. Class definitions normally " +"contain method definitions which operate on instances of the class." +msgstr "用来创建用户定义对象的模板。类定义通常包含对该类的实例进行操作的方法定义。" + +#: ../../glossary.rst:265 +msgid "class variable" +msgstr "class variable -- 类变量" + +#: ../../glossary.rst:267 +msgid "" +"A variable defined in a class and intended to be modified only at class " +"level (i.e., not in an instance of the class)." +msgstr "在类中定义的变量,并且仅限在类的层级上修改 (而不是在类的实例中修改)。" + +#: ../../glossary.rst:269 +msgid "closure variable" +msgstr "closure variable -- 闭包变量" + +#: ../../glossary.rst:271 +msgid "" +"A :term:`free variable` referenced from a :term:`nested scope` that is " +"defined in an outer scope rather than being resolved at runtime from the " +"globals or builtin namespaces. May be explicitly defined with the " +":keyword:`nonlocal` keyword to allow write access, or implicitly defined if " +"the variable is only being read." +msgstr "" +"引用自 :term:`nested scope` 的 :term:`free " +"variable`,它是在外层作用域中定义而不是在运行时自全局或内置命名空间中取得。可能使用 :keyword:`nonlocal` " +"关键字显式地定义以允许写入访问,或者如果变量仅供读取则只需隐式地定义。" + +#: ../../glossary.rst:276 +msgid "" +"For example, in the ``inner`` function in the following code, both ``x`` and" +" ``print`` are :term:`free variables `, but only ``x`` is a " +"*closure variable*::" +msgstr "" +"例如,在以下代码的 ``inner`` 函数中,``x`` 和 ``print`` 均为 :term:`自由变量 `,但只有 ``x`` 属于 *闭包变量*::" + +#: ../../glossary.rst:279 +msgid "" +"def outer():\n" +" x = 0\n" +" def inner():\n" +" nonlocal x\n" +" x += 1\n" +" print(x)\n" +" return inner" +msgstr "" +"def outer():\n" +" x = 0\n" +" def inner():\n" +" nonlocal x\n" +" x += 1\n" +" print(x)\n" +" return inner" + +#: ../../glossary.rst:287 +msgid "" +"Due to the :attr:`codeobject.co_freevars` attribute (which, despite its " +"name, only includes the names of closure variables rather than listing all " +"referenced free variables), the more general :term:`free variable` term is " +"sometimes used even when the intended meaning is to refer specifically to " +"closure variables." +msgstr "" +"由于 :attr:`codeobject.co_freevars` " +"属性的存在(虽然名称如此,但其仅包括闭包变量名称而非列出所有被引用的自由变量),更一般化的术语 :term:`free variable` " +"有时在即便本意是专指闭包变量时也会被使用。" + +#: ../../glossary.rst:291 +msgid "complex number" +msgstr "complex number -- 复数" + +#: ../../glossary.rst:293 +msgid "" +"An extension of the familiar real number system in which all numbers are " +"expressed as a sum of a real part and an imaginary part. Imaginary numbers " +"are real multiples of the imaginary unit (the square root of ``-1``), often " +"written ``i`` in mathematics or ``j`` in engineering. Python has built-in " +"support for complex numbers, which are written with this latter notation; " +"the imaginary part is written with a ``j`` suffix, e.g., ``3+1j``. To get " +"access to complex equivalents of the :mod:`math` module, use :mod:`cmath`. " +"Use of complex numbers is a fairly advanced mathematical feature. If you're" +" not aware of a need for them, it's almost certain you can safely ignore " +"them." +msgstr "" +"对普通实数系统的扩展,其中所有数字都被表示为一个实部和一个虚部的和。虚数是虚数单位 (``-1`` 的平方根) 的实倍数,通常在数学中写为 " +"``i``,在工程学中写为 ``j``。Python 内置了对复数的支持,采用工程学标记方式;虚部带有一个 ``j`` 后缀,例如 " +"``3+1j``。如果需要 :mod:`math` 模块内对象的对应复数版本,请使用 " +":mod:`cmath`,复数的使用是一个比较高级的数学特性。如果你感觉没有必要,忽略它们也几乎不会有任何问题。" + +#: ../../glossary.rst:303 +msgid "concurrency" +msgstr "concurrency -- 并发" + +#: ../../glossary.rst:305 +msgid "" +"The ability of a computer program to perform multiple tasks at the same " +"time. Python provides libraries for writing programs that make use of " +"different forms of concurrency. :mod:`asyncio` is a library for dealing " +"with asynchronous tasks and coroutines. :mod:`threading` provides access to" +" operating system threads and :mod:`multiprocessing` to operating system " +"processes. Multi-core processors can execute threads and processes on " +"different CPU cores at the same time (see :term:`parallelism`)." +msgstr "" +"一个计算机程序同时执行多个任务的能力。Python 提供了用于编写采用不同并发形式的程序的多个库。 :mod:`asyncio` " +"是用于处理异步任务和协程的库。 :mod:`threading` 提供对操作系统线程的访问而 :mod:`multiprocessing` " +"提供对操作系统进程的访问。多核心处理器可以同时在不同的 CPU 核心上执行线程和进程 (参见 :term:`parallelism`)。" + +#: ../../glossary.rst:313 +msgid "concurrent modification" +msgstr "concurrent modification -- 并发修改" + +#: ../../glossary.rst:315 +msgid "" +"When multiple threads modify shared data at the same time. Concurrent " +"modification without proper synchronization can cause :term:`race conditions" +" `, and might also trigger a :term:`data race `, " +"data corruption, or both." +msgstr "" +"当多个线程同时修改共享数据时。没有适当同步的并发修改可能导致 :term:`竞争条件 `,还可能触发 " +":term:`数据竞争 `,数据损坏,或是两者兼有。" + +#: ../../glossary.rst:319 +msgid "context" +msgstr "context -- 上下文" + +#: ../../glossary.rst:321 +msgid "" +"This term has different meanings depending on where and how it is used. Some" +" common meanings:" +msgstr "此术语根据其所在场合和使用方式的不同而具有不同的含义。一些常见的含义为:" + +#: ../../glossary.rst:324 +msgid "" +"The temporary state or environment established by a :term:`context manager` " +"via a :keyword:`with` statement." +msgstr "通过 :keyword:`with` 语句由一个 :term:`context manager` 所创建的临时环境或状态。" + +#: ../../glossary.rst:326 +msgid "" +"The collection of key­value bindings associated with a particular " +":class:`contextvars.Context` object and accessed via " +":class:`~contextvars.ContextVar` objects. Also see :term:`context " +"variable`." +msgstr "" +"一组关联到特定 :class:`contextvars.Context` 对象并通过 :class:`~contextvars.ContextVar` " +"对象来访问的键值绑定。另请参见 :term:`context variable`。" + +#: ../../glossary.rst:330 +msgid "" +"A :class:`contextvars.Context` object. Also see :term:`current context`." +msgstr "一个 :class:`contextvars.Context` 对象。另请参见 :term:`current context`。" + +#: ../../glossary.rst:332 +msgid "context management protocol" +msgstr "context management protocol -- 上下文管理协议" + +#: ../../glossary.rst:334 +msgid "" +"The :meth:`~object.__enter__` and :meth:`~object.__exit__` methods called by" +" the :keyword:`with` statement. See :pep:`343`." +msgstr "" +":meth:`~object.__enter__` 和 :meth:`~object.__exit__` 方法将由 :keyword:`with` " +"语句来调用。参见 :pep:`343`。" + +#: ../../glossary.rst:336 +msgid "context manager" +msgstr "context manager -- 上下文管理器" + +#: ../../glossary.rst:338 +msgid "" +"An object which implements the :term:`context management protocol` and " +"controls the environment seen in a :keyword:`with` statement. See " +":pep:`343`." +msgstr "" +"一个实现了 :term:`context management protocol` 并负责控制某个 :keyword:`with` 语句内的环境的对象。" +" 参见 :pep:`343`。" + +#: ../../glossary.rst:341 +msgid "context variable" +msgstr "context variable -- 上下文变量" + +#: ../../glossary.rst:343 +msgid "" +"A variable whose value depends on which context is the :term:`current " +"context`. Values are accessed via :class:`contextvars.ContextVar` objects." +" Context variables are primarily used to isolate state between concurrent " +"asynchronous tasks." +msgstr "" +"一个具体值取决于哪个上下文是 :term:`current context` 的变量。这些值是通过 " +":class:`contextvars.ContextVar` 对象来访问的。上下文变量主要被用来隔离并发的异步任务之间的状态。" + +#: ../../glossary.rst:347 +msgid "contiguous" +msgstr "contiguous -- 连续" + +#: ../../glossary.rst:351 +msgid "" +"A buffer is considered contiguous exactly if it is either *C-contiguous* or " +"*Fortran contiguous*. Zero-dimensional buffers are C and Fortran " +"contiguous. In one-dimensional arrays, the items must be laid out in memory" +" next to each other, in order of increasing indexes starting from zero. In " +"multidimensional C-contiguous arrays, the last index varies the fastest when" +" visiting items in order of memory address. However, in Fortran contiguous " +"arrays, the first index varies the fastest." +msgstr "" +"一个缓冲如果是 *C 连续* 或 *Fortran 连续* 就会被认为是连续的。零维缓冲是 C 和 Fortran " +"连续的。在一维数组中,所有条目必须在内存中彼此相邻地排列,采用从零开始的递增索引顺序。在多维 " +"C-连续数组中,当按内存地址排列时用最后一个索引访问条目时速度最快。但是在 Fortran 连续数组中则是用第一个索引最快。" + +#: ../../glossary.rst:359 +msgid "coroutine" +msgstr "coroutine -- 协程" + +#: ../../glossary.rst:361 +msgid "" +"Coroutines are a more generalized form of subroutines. Subroutines are " +"entered at one point and exited at another point. Coroutines can be " +"entered, exited, and resumed at many different points. They can be " +"implemented with the :keyword:`async def` statement. See also :pep:`492`." +msgstr "" +"协程是子例程的更一般形式。子例程可以在某一点进入并在另一点退出。协程则可以在许多不同的点上进入、退出和恢复。它们可通过 :keyword:`async " +"def` 语句来实现。参见 :pep:`492`。" + +#: ../../glossary.rst:366 +msgid "coroutine function" +msgstr "coroutine function -- 协程函数" + +#: ../../glossary.rst:368 +msgid "" +"A function which returns a :term:`coroutine` object. A coroutine function " +"may be defined with the :keyword:`async def` statement, and may contain " +":keyword:`await`, :keyword:`async for`, and :keyword:`async with` keywords." +" These were introduced by :pep:`492`." +msgstr "" +"返回一个 :term:`coroutine` 对象的函数。协程函数可通过 :keyword:`async def` 语句来定义,并可能包含 " +":keyword:`await`、:keyword:`async for` 和 :keyword:`async with` 关键字。这些特性是由 " +":pep:`492` 引入的。" + +#: ../../glossary.rst:373 +msgid "CPython" +msgstr "CPython" + +#: ../../glossary.rst:375 +msgid "" +"The canonical implementation of the Python programming language, as " +"distributed on `python.org `_. The term \"CPython\"" +" is used when necessary to distinguish this implementation from others such " +"as Jython or IronPython." +msgstr "" +"Python 编程语言的规范实现,在 `python.org `_ 上发布。\"CPython\" " +"一词用于在必要时将此实现与其他实现例如 Jython 或 IronPython 相区别。" + +#: ../../glossary.rst:379 +msgid "current context" +msgstr "current context -- 当前上下文" + +#: ../../glossary.rst:381 +msgid "" +"The :term:`context` (:class:`contextvars.Context` object) that is currently " +"used by :class:`~contextvars.ContextVar` objects to access (get or set) the " +"values of :term:`context variables `. Each thread has its" +" own current context. Frameworks for executing asynchronous tasks (see " +":mod:`asyncio`) associate each task with a context which becomes the current" +" context whenever the task starts or resumes execution." +msgstr "" +"在当前被 :class:`~contextvars.ContextVar` 对象用来访问 (获取或设置) :term:`上下文变量 ` 的值的 :term:`context` (:class:`contextvars.Context` 对象)。 " +"每个线程都具有它自己的当前上下文。用于执行异步任务 (参见 :mod:`asyncio`) " +"的框架会在每个任务开始或恢复执行时将任务关联到一个成为当前上下文的上下文。" + +#: ../../glossary.rst:387 +msgid "cyclic isolate" +msgstr "cyclic isolate -- 循环隔离" + +#: ../../glossary.rst:389 +msgid "" +"A subgroup of one or more objects that reference each other in a reference " +"cycle, but are not referenced by objects outside the group. The goal of the" +" :term:`cyclic garbage collector ` is to identify these " +"groups and break the reference cycles so that the memory can be reclaimed." +msgstr "" +"某个引用循环中的子分组,其中包含的一个或多个对象会相互引用但不会被分组以外的对象所引用。 :term:`循环垃圾回收器 ` 的目标是标识出这些分组并打断其引用循环以便回收相应的内存。" + +#: ../../glossary.rst:393 +msgid "data race" +msgstr "data race -- 数据竞争" + +#: ../../glossary.rst:395 +msgid "" +"A situation where multiple threads access the same memory location " +"concurrently, at least one of the accesses is a write, and the threads do " +"not use any synchronization to control their access. Data races lead to " +":term:`non-deterministic` behavior and can cause data corruption. Proper use" +" of :term:`locks ` and other :term:`synchronization primitives " +"` prevents data races. Note that data races can " +"only happen in native code, but that :term:`native code` might be exposed in" +" a Python API. See also :term:`race condition` and :term:`thread-safe`." +msgstr "" +"多个线程并发地访问相同内存位置的情况,至少有一个访问是写入,并且各线程没有使用任何同步机制来控制它们的访问。数据竞争会导致 :term:`non-" +"deterministic` 行为并可造成数据损坏。正确使用 :term:`锁 ` 和其他 :term:`同步原语 " +"` 可以防止数据竞争。请注意数据竞争只会发生在原生代码中,但是 :term:`native " +"code` 可能会在 Python API 中暴露出来。另请参阅 :term:`race condition` 和 :term:`thread-" +"safe`." + +#: ../../glossary.rst:404 +msgid "deadlock" +msgstr "deadlock -- 死锁" + +#: ../../glossary.rst:406 +msgid "" +"A situation in which two or more tasks (threads, processes, or coroutines) " +"wait indefinitely for each other to release resources or complete actions, " +"preventing any from making progress. For example, if thread A holds lock 1 " +"and waits for lock 2, while thread B holds lock 2 and waits for lock 1, both" +" threads will wait indefinitely. In Python this often arises from acquiring" +" multiple locks in conflicting orders or from circular join/await " +"dependencies. Deadlocks can be avoided by always acquiring multiple " +":term:`locks ` in a consistent order. See also :term:`lock` and " +":term:`reentrant`." +msgstr "" +"在某种情况下有两个以上任务(线程、进程或协程)无限地等待彼此释放资源或完成动作,导致任何一个都无法继续执行。举例来说,如果线程 A 持有锁 1 并等待锁" +" 2,而线程 B 持有锁 2 并等待锁 1,则两个线程将无限地等待。在 Python 中这往往发生于以相互冲突的顺序获取多个锁或是循环对依赖项执行 " +"join/await 操作。死锁可通过始终以固定顺序获取多个 :term:`锁 ` 来避免。另请参阅 :term:`lock` 和 " +":term:`reentrant`。" + +#: ../../glossary.rst:415 +msgid "decorator" +msgstr "decorator -- 装饰器" + +#: ../../glossary.rst:417 +msgid "" +"A function returning another function, usually applied as a function " +"transformation using the ``@wrapper`` syntax. Common examples for " +"decorators are :func:`classmethod` and :func:`staticmethod`." +msgstr "" +"返回值为另一个函数的函数,通常使用 ``@wrapper`` 语法形式来进行函数变换。装饰器的常见例子包括 :func:`classmethod` 和 " +":func:`staticmethod`." + +#: ../../glossary.rst:421 +msgid "" +"The decorator syntax is merely syntactic sugar, the following two function " +"definitions are semantically equivalent::" +msgstr "装饰器语法只是一种语法糖,以下两个函数定义在语义上完全等价::" + +#: ../../glossary.rst:424 +msgid "" +"def f(arg):\n" +" ...\n" +"f = staticmethod(f)\n" +"\n" +"@staticmethod\n" +"def f(arg):\n" +" ..." +msgstr "" +"def f(arg):\n" +" ...\n" +"f = staticmethod(f)\n" +"\n" +"@staticmethod\n" +"def f(arg):\n" +" ..." + +#: ../../glossary.rst:432 +msgid "" +"The same concept exists for classes, but is less commonly used there. See " +"the documentation for :ref:`function definitions ` and :ref:`class" +" definitions ` for more about decorators." +msgstr "" +"同样的概念也适用于类,但通常较少这样使用。有关装饰器的详情可参见 :ref:`函数定义 ` 和 :ref:`类定义 `" +" 的文档。" + +#: ../../glossary.rst:435 +msgid "descriptor" +msgstr "descriptor -- 描述器" + +#: ../../glossary.rst:437 +msgid "" +"Any object which defines the methods :meth:`~object.__get__`, " +":meth:`~object.__set__`, or :meth:`~object.__delete__`. When a class " +"attribute is a descriptor, its special binding behavior is triggered upon " +"attribute lookup. Normally, using *a.b* to get, set or delete an attribute " +"looks up the object named *b* in the class dictionary for *a*, but if *b* is" +" a descriptor, the respective descriptor method gets called. Understanding " +"descriptors is a key to a deep understanding of Python because they are the " +"basis for many features including functions, methods, properties, class " +"methods, static methods, and reference to super classes." +msgstr "" +"任何定义了 :meth:`~object.__get__`, :meth:`~object.__set__` 或 " +":meth:`~object.__delete__` 方法的对象。当一个类属性为描述器时,它的特殊绑定行为就会在属性查找时被触发。通常情况下,使用 " +"*a.b* 来获取、设置或删除一个属性时会在 *a* 类的字典中查找名称为 *b* 的对象,但如果 *b* 是一个描述器,则会调用对应的描述器方法。 " +"理解描述器的概念是更深层次理解 Python 的关键,因为这是许多重要特性的基础,包括函数、方法、特征属性、类方法、静态方法以及对超类的引用等等。" + +#: ../../glossary.rst:448 +msgid "" +"For more information about descriptors' methods, see :ref:`descriptors` or " +"the :ref:`Descriptor How To Guide `." +msgstr "" +"有关描述器的方法的更多信息,请参阅 :ref:`descriptors` 或 :ref:`描述器使用指南 `。" + +#: ../../glossary.rst:450 +msgid "dictionary" +msgstr "dictionary -- 字典" + +#: ../../glossary.rst:452 +msgid "" +"An associative array, where arbitrary keys are mapped to values. The keys " +"can be any object with :meth:`~object.__hash__` and :meth:`~object.__eq__` " +"methods. Called a hash in Perl." +msgstr "" +"一个关联数组,其中的任意键都映射到相应的值。键可以是任何具有 :meth:`~object.__hash__` 和 " +":meth:`~object.__eq__` 方法的对象。在 Perl 中称为 hash。" + +#: ../../glossary.rst:456 +msgid "dictionary comprehension" +msgstr "dictionary comprehension -- 字典推导式" + +#: ../../glossary.rst:458 +msgid "" +"A compact way to process all or part of the elements in an iterable and " +"return a dictionary with the results. ``results = {n: n ** 2 for n in " +"range(10)}`` generates a dictionary containing key ``n`` mapped to value ``n" +" ** 2``. See :ref:`comprehensions`." +msgstr "" +"处理一个可迭代对象中的所有或部分元素并返回结果字典的一种紧凑写法。``results = {n: n ** 2 for n in " +"range(10)}`` 将生成一个由键 ``n`` 到值 ``n ** 2`` 的映射构成的字典。参见 :ref:`comprehensions`。" + +#: ../../glossary.rst:462 +msgid "dictionary view" +msgstr "dictionary view -- 字典视图" + +#: ../../glossary.rst:464 +msgid "" +"The objects returned from :meth:`dict.keys`, :meth:`dict.values`, and " +":meth:`dict.items` are called dictionary views. They provide a dynamic view " +"on the dictionary’s entries, which means that when the dictionary changes, " +"the view reflects these changes. To force the dictionary view to become a " +"full list use ``list(dictview)``. See :ref:`dict-views`." +msgstr "" +"从 :meth:`dict.keys`, :meth:`dict.values` 和 :meth:`dict.items` " +"返回的对象被称为字典视图。它们提供了字典条目的一个动态视图,这意味着当字典改变时,视图也会相应改变。要将字典视图强制转换为真正的列表,可使用 " +"``list(dictview)``。参见 :ref:`dict-views`。" + +#: ../../glossary.rst:470 +msgid "docstring" +msgstr "docstring -- 文档字符串" + +#: ../../glossary.rst:472 +msgid "" +"A string literal which appears as the first expression in a class, function " +"or module. While ignored when the suite is executed, it is recognized by " +"the compiler and put into the :attr:`~definition.__doc__` attribute of the " +"enclosing class, function or module. Since it is available via " +"introspection, it is the canonical place for documentation of the object." +msgstr "" +"作为类、函数或模块之内的第一个表达式出现的字符串字面值。它在代码块被执行时将被忽略,但会被编译器识别并放入所在类、函数或模块的 " +":attr:`~definition.__doc__` 属性中。由于它可用于代码内省,因此是存放对象的文档的规范位置。" + +#: ../../glossary.rst:478 +msgid "duck-typing" +msgstr "duck-typing -- 鸭子类型" + +#: ../../glossary.rst:480 +msgid "" +"A programming style which does not look at an object's type to determine if " +"it has the right interface; instead, the method or attribute is simply " +"called or used (\"If it looks like a duck and quacks like a duck, it must be" +" a duck.\") By emphasizing interfaces rather than specific types, well-" +"designed code improves its flexibility by allowing polymorphic substitution." +" Duck-typing avoids tests using :func:`type` or :func:`isinstance`. (Note," +" however, that duck-typing can be complemented with :term:`abstract base " +"classes `.) Instead, it typically employs " +":func:`hasattr` tests or :term:`EAFP` programming." +msgstr "" +"指一种编程风格,它并不依靠查找对象类型来确定其是否具有正确的接口,而是直接调用或使用其方法或属性(“看起来像鸭子,叫起来也像鸭子,那么肯定就是鸭子。”)由于强调接口而非特定类型,设计良好的代码可通过允许多态替代来提升灵活性。鸭子类型避免使用" +" :func:`type` 或 :func:`isinstance` 检测。(但要注意鸭子类型可以使用 :term:`抽象基类 ` 作为补充。) 而往往会采用 :func:`hasattr` 检测或是 :term:`EAFP` 编程。" + +#: ../../glossary.rst:489 +msgid "dunder" +msgstr "dunder" + +#: ../../glossary.rst:491 +msgid "" +"An informal short-hand for \"double underscore\", used when talking about a " +":term:`special method`. For example, ``__init__`` is often pronounced " +"\"dunder init\"." +msgstr "" +"双下划线 \"double underscore\" 的非正式简称,在谈及 :term:`special method` 时使用。 " +"例如,``__init__`` 经常被读作 \"dunder init\"。" + +#: ../../glossary.rst:494 +msgid "EAFP" +msgstr "EAFP" + +#: ../../glossary.rst:496 +msgid "" +"Easier to ask for forgiveness than permission. This common Python coding " +"style assumes the existence of valid keys or attributes and catches " +"exceptions if the assumption proves false. This clean and fast style is " +"characterized by the presence of many :keyword:`try` and :keyword:`except` " +"statements. The technique contrasts with the :term:`LBYL` style common to " +"many other languages such as C." +msgstr "" +"“求原谅比求许可更容易”(Easier to Ask for Forgiveness than Permission)的英文缩写。这种 Python " +"常用代码编写风格会假定所需的键或属性存在,并在假定错误时捕获异常。这种简洁快速风格的特点就是大量运用 :keyword:`try` 和 " +":keyword:`except` 语句。与其相对的则是所谓 :term:`LBYL` 风格,常见于 C 等许多其他语言。" + +#: ../../glossary.rst:502 +msgid "evaluate function" +msgstr "evaluate function -- 求值函数" + +#: ../../glossary.rst:504 +msgid "" +"A function that can be called to evaluate a lazily evaluated attribute of an" +" object, such as the value of type aliases created with the :keyword:`type` " +"statement." +msgstr "一种可被调用来针对某个对象的惰性求值属性进行求值的函数,比如使用 :keyword:`type` 语句创建的类型别名的值。" + +#: ../../glossary.rst:507 +msgid "expression" +msgstr "expression -- 表达式" + +#: ../../glossary.rst:509 +msgid "" +"A piece of syntax which can be evaluated to some value. In other words, an " +"expression is an accumulation of expression elements like literals, names, " +"attribute access, operators or function calls which all return a value. In " +"contrast to many other languages, not all language constructs are " +"expressions. There are also :term:`statement`\\s which cannot be used as " +"expressions, such as :keyword:`while`. Assignments are also statements, not" +" expressions." +msgstr "" +"可以求出某个值的语法单元。换句话说,一个表达式就是表达元素例如字面值、名称、属性访问、运算符或函数调用的汇总,它们最终都会返回一个值。 " +"与许多其他语言不同,并非所有语言构件都是表达式。还存在不能被用作表达式的 :term:`statement`,例如 :keyword:`while`。 " +"赋值也是属于语句而非表达式。" + +#: ../../glossary.rst:516 +msgid "extension module" +msgstr "extension module -- 扩展模块" + +#: ../../glossary.rst:518 +msgid "" +"A module written in C or C++, using Python's C API to interact with the core" +" and with user code." +msgstr "以 C 或 C++ 编写的模块,使用 Python 的 C API 来与语言核心以及用户代码进行交互。" + +#: ../../glossary.rst:520 +msgid "f-string" +msgstr "f-string -- f-字符串" + +#: ../../glossary.rst:521 +msgid "f-strings" +msgstr "f-strings -- f-字符串" + +#: ../../glossary.rst:523 +msgid "" +"String literals prefixed with ``f`` or ``F`` are commonly called " +"\"f-strings\" which is short for :ref:`formatted string literals " +"`. See also :pep:`498`." +msgstr "" +"带有 ``f`` 或 ``F`` 前缀的字符串字面值通常被称为 \"f-字符串\" 即 :ref:`格式化字符串字面值 ` " +"的简写。另请参阅 :pep:`498`。" + +#: ../../glossary.rst:526 +msgid "file object" +msgstr "file object -- 文件对象" + +#: ../../glossary.rst:528 +msgid "" +"An object exposing a file-oriented API (with methods such as :meth:`!read` " +"or :meth:`!write`) to an underlying resource. Depending on the way it was " +"created, a file object can mediate access to a real on-disk file or to " +"another type of storage or communication device (for example standard " +"input/output, in-memory buffers, sockets, pipes, etc.). File objects are " +"also called :dfn:`file-like objects` or :dfn:`streams`." +msgstr "" +"对外公开面向文件的 API(带有 :meth:`!read` 或 :meth:`!write` 等方法)以使用下层资源的对象。 " +"根据其创建方式的不同,文件对象可以处理对真实磁盘文件、其他类型的存储或通信设备的访问(例如标准输入/输出、内存缓冲区、套接字、管道等)。 " +"文件对象也被称为 :dfn:`文件型对象` 或 :dfn:`流`。" + +#: ../../glossary.rst:536 +msgid "" +"There are actually three categories of file objects: raw :term:`binary files" +" `, buffered :term:`binary files ` and :term:`text" +" files `. Their interfaces are defined in the :mod:`io` module. " +"The canonical way to create a file object is by using the :func:`open` " +"function." +msgstr "" +"实际上共有三种类别的文件对象:原始 :term:`二进制文件 `, 缓冲 :term:`二进制文件 ` 以及 :term:`文本文件 `。它们的接口定义均在 :mod:`io` 模块中。创建文件对象的规范方式是使用 " +":func:`open` 函数。" + +#: ../../glossary.rst:541 +msgid "file-like object" +msgstr "file-like object -- 文件型对象" + +#: ../../glossary.rst:543 +msgid "A synonym for :term:`file object`." +msgstr ":term:`file object` 的同义词。" + +#: ../../glossary.rst:544 +msgid "filesystem encoding and error handler" +msgstr "filesystem encoding and error handler -- 文件系统编码格式与错误处理器" + +#: ../../glossary.rst:546 +msgid "" +"Encoding and error handler used by Python to decode bytes from the operating" +" system and encode Unicode to the operating system." +msgstr "Python 用来从操作系统解码字节串和向操作系统编码 Unicode 的编码格式与错误处理器。" + +#: ../../glossary.rst:549 +msgid "" +"The filesystem encoding must guarantee to successfully decode all bytes " +"below 128. If the file system encoding fails to provide this guarantee, API " +"functions can raise :exc:`UnicodeError`." +msgstr "" +"文件系统编码格式必须保证能成功解码长度在 128 以下的所有字节串。如果文件系统编码格式无法提供此保证,则 API 函数可能会引发 " +":exc:`UnicodeError`." + +#: ../../glossary.rst:553 +msgid "" +"The :func:`sys.getfilesystemencoding` and " +":func:`sys.getfilesystemencodeerrors` functions can be used to get the " +"filesystem encoding and error handler." +msgstr "" +":func:`sys.getfilesystemencoding` 和 :func:`sys.getfilesystemencodeerrors` " +"函数可被用来获取文件系统编码格式与错误处理器。" + +#: ../../glossary.rst:557 +msgid "" +"The :term:`filesystem encoding and error handler` are configured at Python " +"startup by the :c:func:`PyConfig_Read` function: see " +":c:member:`~PyConfig.filesystem_encoding` and " +":c:member:`~PyConfig.filesystem_errors` members of :c:type:`PyConfig`." +msgstr "" +":term:`filesystem encoding and error handler` 是在 Python 启动时通过 " +":c:func:`PyConfig_Read` 函数来配置的:请参阅 :c:type:`PyConfig` 的 " +":c:member:`~PyConfig.filesystem_encoding` 和 " +":c:member:`~PyConfig.filesystem_errors` 等成员。" + +#: ../../glossary.rst:562 +msgid "See also the :term:`locale encoding`." +msgstr "另请参见 :term:`locale encoding`。" + +#: ../../glossary.rst:563 +msgid "finder" +msgstr "finder -- 查找器" + +#: ../../glossary.rst:565 +msgid "" +"An object that tries to find the :term:`loader` for a module that is being " +"imported." +msgstr "一种会尝试查找被导入模块的 :term:`loader` 的对象。" + +#: ../../glossary.rst:568 +msgid "" +"There are two types of finder: :term:`meta path finders ` " +"for use with :data:`sys.meta_path`, and :term:`path entry finders ` for use with :data:`sys.path_hooks`." +msgstr "" +"存在两种类型的查找器::term:`元路径查找器 ` 配合 :data:`sys.meta_path` 使用,以及 " +":term:`路径条目查找器 ` 配合 :data:`sys.path_hooks` 使用。" + +#: ../../glossary.rst:572 +msgid "" +"See :ref:`finders-and-loaders` and :mod:`importlib` for much more detail." +msgstr "请参阅 :ref:`finders-and-loaders` 和 :mod:`importlib` 以了解更多细节。" + +#: ../../glossary.rst:573 +msgid "floor division" +msgstr "floor division -- 向下取整除法" + +#: ../../glossary.rst:575 +msgid "" +"Mathematical division that rounds down to nearest integer. The floor " +"division operator is ``//``. For example, the expression ``11 // 4`` " +"evaluates to ``2`` in contrast to the ``2.75`` returned by float true " +"division. Note that ``(-11) // 4`` is ``-3`` because that is ``-2.75`` " +"rounded *downward*. See :pep:`238`." +msgstr "" +"向下舍入到最接近的整数的数学除法。向下取整除法的运算符是 ``//``。例如,表达式 ``11 // 4`` 的计算结果是 ``2`` " +",而与之相反的是浮点数的真正除法返回 ``2.75``。注意 ``(-11) // 4`` 会返回 ``-3`` 因为这是 ``-2.75`` *向下*" +" 舍入得到的结果。见 :pep:`238`。" + +#: ../../glossary.rst:580 +msgid "free threading" +msgstr "free threading -- 自由线程" + +#: ../../glossary.rst:582 +msgid "" +"A threading model where multiple threads can run Python bytecode " +"simultaneously within the same interpreter. This is in contrast to the " +":term:`global interpreter lock` which allows only one thread to execute " +"Python bytecode at a time. See :pep:`703`." +msgstr "" +"一种线程模型,在同一个解释器内部的多个线程可以同时运行 Python 字节码。与此相对的是 :term:`global interpreter " +"lock`,在同一时刻只允许一个线程执行 Python 字节码。参见 :pep:`703`。" + +#: ../../glossary.rst:586 +msgid "free-threaded build" +msgstr "free-threaded build -- 自由线程构建版" + +#: ../../glossary.rst:589 +msgid "" +"A build of :term:`CPython` that supports :term:`free threading`, configured " +"using the :option:`--disable-gil` option before compilation." +msgstr "" +"支持 :term:`free threading` 的 :term:`CPython` 构建版,在编译之前使用了 :option:`--disable-" +"gil` 选项进行配置。" + +#: ../../glossary.rst:592 +msgid "See :ref:`freethreading-python-howto`." +msgstr "另请参阅 :ref:`freethreading-python-howto`。" + +#: ../../glossary.rst:593 +msgid "free variable" +msgstr "free variable -- 自由变量" + +#: ../../glossary.rst:595 +msgid "" +"Formally, as defined in the :ref:`language execution model `, a " +"free variable is any variable used in a namespace which is not a local " +"variable in that namespace. See :term:`closure variable` for an example. " +"Pragmatically, due to the name of the :attr:`codeobject.co_freevars` " +"attribute, the term is also sometimes used as a synonym for :term:`closure " +"variable`." +msgstr "" +"在正式场合下,如 :ref:`语言执行模型 ` " +"所定义的,自由变量是指在某个命名空间中被使用的不属于该命名空间中的局部变量的任何变量。参见 :term:`closure variable` " +"中的样例。在实际应用中,由于 :attr:`codeobject.co_freevars` 属性被如此命名,该术语有时也被用作 " +":term:`closure variable` 的同义词。" + +#: ../../glossary.rst:600 +msgid "function" +msgstr "function -- 函数" + +#: ../../glossary.rst:602 +msgid "" +"A series of statements which returns some value to a caller. It can also be " +"passed zero or more :term:`arguments ` which may be used in the " +"execution of the body. See also :term:`parameter`, :term:`method`, and the " +":ref:`function` section." +msgstr "" +"可以向调用者返回某个值的一组语句。还可以向其传入零个或多个 :term:`参数 ` 并在函数体执行中被使用。另见 " +":term:`parameter`, :term:`method` 和 :ref:`function` 等节。" + +#: ../../glossary.rst:606 +msgid "function annotation" +msgstr "function annotation -- 函数标注" + +#: ../../glossary.rst:608 +msgid "An :term:`annotation` of a function parameter or return value." +msgstr "即针对函数形参或返回值的 :term:`annotation`。" + +#: ../../glossary.rst:610 +msgid "" +"Function annotations are usually used for :term:`type hints `: " +"for example, this function is expected to take two :class:`int` arguments " +"and is also expected to have an :class:`int` return value::" +msgstr "" +"函数标注通常用于 :term:`类型提示 `: 例如以下函数预期接受两个 :class:`int` 参数并预期返回一个 " +":class:`int` 值::" + +#: ../../glossary.rst:615 +msgid "" +"def sum_two_numbers(a: int, b: int) -> int:\n" +" return a + b" +msgstr "" +"def sum_two_numbers(a: int, b: int) -> int:\n" +" return a + b" + +#: ../../glossary.rst:618 +msgid "Function annotation syntax is explained in section :ref:`function`." +msgstr "函数标注语法的详解见 :ref:`function` 一节。" + +#: ../../glossary.rst:620 +msgid "" +"See :term:`variable annotation` and :pep:`484`, which describe this " +"functionality. Also see :ref:`annotations-howto` for best practices on " +"working with annotations." +msgstr "" +"参见 :term:`variable annotation` 和 :pep:`484`,其中描述了此功能。另请参阅 :ref:`annotations-" +"howto` 以了解使用标注的最佳实践。" + +#: ../../glossary.rst:624 +msgid "__future__" +msgstr "__future__" + +#: ../../glossary.rst:626 +msgid "" +"A :ref:`future statement `, ``from __future__ import ``, " +"directs the compiler to compile the current module using syntax or semantics" +" that will become standard in a future release of Python. The " +":mod:`__future__` module documents the possible values of *feature*. By " +"importing this module and evaluating its variables, you can see when a new " +"feature was first added to the language and when it will (or did) become the" +" default::" +msgstr "" +":ref:`future 语句 `, ``from __future__ import `` 指示编译器使用将在未来的" +" Python 发布版中成为标准的语法和语义来编译当前模块。 :mod:`__future__` 模块文档记录了可能的 *feature* 取值。 " +"通过导入此模块并对其变量求值,你可以看到每项新特性在何时被首次加入到该语言中以及它将(或已)在何时成为默认::" + +#: ../../glossary.rst:634 +msgid "" +">>> import __future__\n" +">>> __future__.division\n" +"_Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192)" +msgstr "" +">>> import __future__\n" +">>> __future__.division\n" +"_Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192)" + +#: ../../glossary.rst:637 +msgid "garbage collection" +msgstr "garbage collection -- 垃圾收集" + +#: ../../glossary.rst:639 +msgid "" +"The process of freeing memory when it is not used anymore. Python performs " +"garbage collection via reference counting and a cyclic garbage collector " +"that is able to detect and break reference cycles. The garbage collector " +"can be controlled using the :mod:`gc` module." +msgstr "" +"释放不再被使用的内存空间的过程。 Python 是通过引用计数和一个能够检测和打破循环引用的循环垃圾收集器来执行垃圾收集的。 可以使用 " +":mod:`gc` 模块来控制垃圾收集器。" + +#: ../../glossary.rst:644 ../../glossary.rst:645 +msgid "generator" +msgstr "generator -- 生成器" + +#: ../../glossary.rst:647 +msgid "" +"Informally used to mean either a :term:`generator function` or a " +":term:`generator iterator`, depending on context. The formal terms " +":term:`generator function` and :term:`generator iterator` are uncommon in " +"practice; \"generator\" alone is almost always sufficient." +msgstr "" + +#: ../../glossary.rst:652 ../../glossary.rst:653 +msgid "generator function" +msgstr "" + +#: ../../glossary.rst:655 +msgid "" +"A function which returns a :term:`generator` object. It looks like a normal" +" function except that it contains :keyword:`yield` expressions for producing" +" a series of values usable in a :keyword:`for`\\-loop or that can be " +"retrieved one at a time with the :func:`next` function. See " +":ref:`yieldexpr`." +msgstr "" + +#: ../../glossary.rst:660 +msgid "generator iterator" +msgstr "generator iterator -- 生成器迭代器" + +#: ../../glossary.rst:662 +msgid "" +"An object created by a :term:`generator function` or a :term:`generator " +"expression`." +msgstr "" + +#: ../../glossary.rst:665 +msgid "" +"Each :keyword:`yield` temporarily suspends processing, remembering the " +"execution state (including local variables and pending try-statements). When" +" the *generator iterator* resumes, it picks up where it left off (in " +"contrast to functions which start fresh on every invocation)." +msgstr "" + +#: ../../glossary.rst:670 +msgid "" +"Generator iterators also implement the :meth:`~generator.send` method to " +"send a value into the suspended generator, and the :meth:`~generator.throw` " +"method to raise an exception at the point where the generator was paused. " +"See :ref:`generator-methods`." +msgstr "" + +#: ../../glossary.rst:675 ../../glossary.rst:676 +msgid "generator expression" +msgstr "generator expression -- 生成器表达式" + +#: ../../glossary.rst:678 +msgid "" +"An :term:`expression` that returns an :term:`iterator`. It looks like a " +"normal expression followed by a :keyword:`!for` clause defining a loop " +"variable, range, and an optional :keyword:`!if` clause. The combined " +"expression generates values for an enclosing function::" +msgstr "" +"返回一个 :term:`iterator` 的 :term:`expression`。它看起来很像普通表达式后带有定义了一个循环变量、范围的 " +":keyword:`!for` 子句,以及一个可选的 :keyword:`!if` 子句。以下复合表达式会为外层函数生成一系列值::" + +#: ../../glossary.rst:683 +msgid "" +">>> sum(i*i for i in range(10)) # sum of squares 0, 1, 4, ... 81\n" +"285" +msgstr "" +">>> sum(i*i for i in range(10)) # 平方值 0, 1, 4, ... 81 之和\n" +"285" + +#: ../../glossary.rst:685 +msgid "generic function" +msgstr "generic function -- 泛型函数" + +#: ../../glossary.rst:687 +msgid "" +"A function composed of multiple functions implementing the same operation " +"for different types. Which implementation should be used during a call is " +"determined by the dispatch algorithm." +msgstr "为不同的类型实现相同操作的多个函数所组成的函数。在调用时会由调度算法来确定应该使用哪个实现。" + +#: ../../glossary.rst:691 +msgid "" +"See also the :term:`single dispatch` glossary entry, the " +":func:`functools.singledispatch` decorator, and :pep:`443`." +msgstr "" +"另请参见 :term:`single dispatch` 术语表条目、:func:`functools.singledispatch` 装饰器以及 " +":pep:`443`。" + +#: ../../glossary.rst:693 +msgid "generic type" +msgstr "generic type -- 泛型" + +#: ../../glossary.rst:695 +msgid "" +"A :term:`type` that can be parameterized; typically a :ref:`container " +"class` such as :class:`list` or :class:`dict`. Used for " +":term:`type hints ` and :term:`annotations `." +msgstr "" +"可参数化的 :term:`type`;通常为 :class:`list` 或 :class:`dict` 这样的 :ref:`容器类 " +"`。用于 :term:`类型提示 ` 和 :term:`注解 `。" + +#: ../../glossary.rst:700 +msgid "" +"For more details, see :ref:`generic alias types`, " +":pep:`483`, :pep:`484`, :pep:`585`, and the :mod:`typing` module." +msgstr "" +"更多细节参见 :ref:`泛型别名类型 `、:pep:`483`、:pep:`484`、:pep:`585` 和" +" :mod:`typing` 模块。" + +#: ../../glossary.rst:702 +msgid "GIL" +msgstr "GIL" + +#: ../../glossary.rst:704 +msgid "See :term:`global interpreter lock`." +msgstr "参见 :term:`global interpreter lock`。" + +#: ../../glossary.rst:705 +msgid "global interpreter lock" +msgstr "global interpreter lock -- 全局解释器锁" + +#: ../../glossary.rst:707 +msgid "" +"The mechanism used by the :term:`CPython` interpreter to assure that only " +"one thread executes Python :term:`bytecode` at a time. This simplifies the " +"CPython implementation by making the object model (including critical built-" +"in types such as :class:`dict`) implicitly safe against concurrent access. " +"Locking the entire interpreter makes it easier for the interpreter to be " +"multi-threaded, at the expense of much of the parallelism afforded by multi-" +"processor machines." +msgstr "" +":term:`CPython` 解释器所采用的一种机制,它确保同一时刻只有一个线程在执行 Python " +":term:`bytecode`。此机制通过设置对象模型(包括 :class:`dict` 等重要内置类型)针对并发访问的隐式安全简化了 CPython" +" 实现。给整个解释器加锁使得解释器多线程运行更方便,其代价则是牺牲了在多处理器上的并行性。" + +#: ../../glossary.rst:716 +msgid "" +"However, some extension modules, either standard or third-party, are " +"designed so as to release the GIL when doing computationally intensive tasks" +" such as compression or hashing. Also, the GIL is always released when " +"doing I/O." +msgstr "" +"不过,某些标准库或第三方库的扩展模块被设计为在执行计算密集型任务如压缩或哈希时释放 GIL。此外,在执行 I/O 操作时也总是会释放 GIL。" + +#: ../../glossary.rst:721 +msgid "" +"As of Python 3.13, the GIL can be disabled using the :option:`--disable-gil`" +" build configuration. After building Python with this option, code must be " +"run with :option:`-X gil=0 <-X>` or after setting the :envvar:`PYTHON_GIL=0 " +"` environment variable. This feature enables improved " +"performance for multi-threaded applications and makes it easier to use " +"multi-core CPUs efficiently. For more details, see :pep:`703`." +msgstr "" +"在 Python 3.13 中,GIL 可以使用 :option:`--disable-gil` 构建配置选项来禁用。在使用此选项构建 Python " +"之后,代码必须附带 :option:`-X gil=0 <-X>` 或在设置 :envvar:`PYTHON_GIL=0 ` " +"环境变量后运行。此特性将为多线程应用程序启用性能提升并让高效率地使用多核 CPU 更加容易。要了解详情,请参阅 :pep:`703`。" + +#: ../../glossary.rst:728 +msgid "" +"In prior versions of Python's C API, a function might declare that it " +"requires the GIL to be held in order to use it. This refers to having an " +":term:`attached thread state`." +msgstr "" +"在之前版本的 Python's C API 中,一个函数可能会声明它需要持有 GIL 才能够使用。这被称为具有一个 :term:`attached " +"thread state`." + +#: ../../glossary.rst:731 +msgid "global state" +msgstr "global state -- 全局状态" + +#: ../../glossary.rst:733 +msgid "" +"Data that is accessible throughout a program, such as module-level " +"variables, class variables, or C static variables in :term:`extension " +"modules `. In multi-threaded programs, global state " +"shared between threads typically requires synchronization to avoid " +":term:`race conditions ` and :term:`data races `." +msgstr "" +"在整个程序中都可访问的数据,如模块级的变量、类变量或 :term:`扩展模块 ` 中的 C 静态变量。 " +"在多线程程序中,在线程之间共享全局状态通常需要进行同步以避免 :term:`竞争条件 ` 和 :term:`数据竞争 " +"`。" + +#: ../../glossary.rst:739 +msgid "hash-based pyc" +msgstr "hash-based pyc -- 基于哈希的 pyc" + +#: ../../glossary.rst:741 +msgid "" +"A bytecode cache file that uses the hash rather than the last-modified time " +"of the corresponding source file to determine its validity. See :ref:`pyc-" +"invalidation`." +msgstr "使用对应源文件的哈希值而非最后修改时间来确定其有效性的字节码缓存文件。参见 :ref:`pyc-invalidation`。" + +#: ../../glossary.rst:744 +msgid "hashable" +msgstr "hashable -- 可哈希" + +#: ../../glossary.rst:746 +msgid "" +"An object is *hashable* if it has a hash value which never changes during " +"its lifetime (it needs a :meth:`~object.__hash__` method), and can be " +"compared to other objects (it needs an :meth:`~object.__eq__` method). " +"Hashable objects which compare equal must have the same hash value." +msgstr "" +"一个对象如果具有在其生命期内绝不改变的哈希值(它需要有 :meth:`~object.__hash__` 方法),并可以同其他对象进行比较(它需要有 " +":meth:`~object.__eq__` 方法)就被称为 *可哈希* 对象。可哈希对象必须具有相同的哈希值比较结果才会相等。" + +#: ../../glossary.rst:752 +msgid "" +"Hashability makes an object usable as a dictionary key and a set member, " +"because these data structures use the hash value internally." +msgstr "可哈希性使得对象能够作为字典键或集合成员使用,因为这些数据结构要在内部使用哈希值。" + +#: ../../glossary.rst:755 +msgid "" +"Most of Python's immutable built-in objects are hashable; mutable containers" +" (such as lists or dictionaries) are not; immutable containers (such as " +"tuples and frozensets) are only hashable if their elements are hashable. " +"Objects which are instances of user-defined classes are hashable by default." +" They all compare unequal (except with themselves), and their hash value is" +" derived from their :func:`id`." +msgstr "" +"大多数 Python 中的不可变内置对象都是可哈希的;可变容器(例如列表或字典)都不可哈希;不可变容器(例如元组和 " +"frozenset)仅当它们的元素均为可哈希时才是可哈希的。用户定义类的实例对象默认是可哈希的。 " +"它们在比较时一定不相同(除非是与自己比较),它们的哈希值的生成是基于它们的 :func:`id`。" + +#: ../../glossary.rst:762 +msgid "IDLE" +msgstr "IDLE" + +#: ../../glossary.rst:764 +msgid "" +"An Integrated Development and Learning Environment for Python. :ref:`idle` " +"is a basic editor and interpreter environment which ships with the standard " +"distribution of Python." +msgstr "Python 的集成开发与学习环境。 :ref:`idle` 是 Python 标准发行版附带的基本编辑器和解释器环境。" + +#: ../../glossary.rst:767 +msgid "immortal" +msgstr "immortal -- 永生对象" + +#: ../../glossary.rst:769 +msgid "" +"*Immortal objects* are a CPython implementation detail introduced in " +":pep:`683`." +msgstr "*永生对象* 是在 :pep:`683` 中引入的 CPython 实现细节。" + +#: ../../glossary.rst:772 +msgid "" +"If an object is immortal, its :term:`reference count` is never modified, and" +" therefore it is never deallocated while the interpreter is running. For " +"example, :const:`True` and :const:`None` are immortal in CPython." +msgstr "" +"如果对象属于永生对象,则它的 :term:`reference count` 永远不会被修改,因而它在解释器运行期间永远不会被取消分配。 " +"例如,:const:`True` 和 :const:`None` 在 CPython 中都属于永生对象。" + +#: ../../glossary.rst:776 +msgid "" +"Immortal objects can be identified via :func:`sys._is_immortal`, or via " +":c:func:`PyUnstable_IsImmortal` in the C API." +msgstr "" +"永生对象可通过 :func:`sys._is_immortal`,或通过 C API 中的 " +":c:func:`PyUnstable_IsImmortal` 来标识。" + +#: ../../glossary.rst:778 +msgid "immutable" +msgstr "immutable -- 不可变对象" + +#: ../../glossary.rst:780 +msgid "" +"An object with a fixed value. Immutable objects include numbers, strings " +"and tuples. Such an object cannot be altered. A new object has to be " +"created if a different value has to be stored. They play an important role " +"in places where a constant hash value is needed, for example as a key in a " +"dictionary. Immutable objects are inherently :term:`thread-safe` because " +"their state cannot be modified after creation, eliminating concerns about " +"improperly synchronized :term:`concurrent modification`." +msgstr "" +"具有固定值的对象。不可变对象包括数字、字符串和元组。这样的对象无法被修改。如果需要存储不同的值就必须创建一个新对象。 " +"它们在需要常量哈希值的地方起着重要的作用,例如作为字典的键。不可变对象天然具有 :term:`thread-safe` " +"特性因为它们的状态在创建后就不能被修改,这消除了未经适当同步就执行 :term:`concurrent modification` 的风险。" + +#: ../../glossary.rst:787 +msgid "import path" +msgstr "import path -- 导入路径" + +#: ../../glossary.rst:789 +msgid "" +"A list of locations (or :term:`path entries `) that are searched" +" by the :term:`path based finder` for modules to import. During import, this" +" list of locations usually comes from :data:`sys.path`, but for subpackages " +"it may also come from the parent package's ``__path__`` attribute." +msgstr "" +"由多个位置 (或 :term:`路径条目 `) 组成的列表,会被模块的 :term:`path based finder` " +"用来查找导入目标。 在导入时,此位置列表通常来自 :data:`sys.path`,但对次级包来说也可能来自上级包的 ``__path__`` 属性。" + +#: ../../glossary.rst:794 +msgid "importing" +msgstr "importing -- 导入" + +#: ../../glossary.rst:796 +msgid "" +"The process by which Python code in one module is made available to Python " +"code in another module." +msgstr "令一个模块中的 Python 代码能为另一个模块中的 Python 代码所使用的过程。" + +#: ../../glossary.rst:798 +msgid "importer" +msgstr "importer -- 导入器" + +#: ../../glossary.rst:800 +msgid "" +"An object that both finds and loads a module; both a :term:`finder` and " +":term:`loader` object." +msgstr "查找并加载模块的对象;此对象既属于 :term:`finder` 又属于 :term:`loader`。" + +#: ../../glossary.rst:802 +msgid "index" +msgstr "index -- 索引" + +#: ../../glossary.rst:804 +msgid "" +"A numeric value that represents the position of an element in a " +":term:`sequence`." +msgstr "一个代表 :term:`sequence` 中元素位置的数字值。" + +#: ../../glossary.rst:807 +msgid "" +"In Python, indexing starts at zero. For example, ``things[0]`` names the " +"*first* element of ``things``; ``things[1]`` names the second one." +msgstr "" +"在 Python 中,索引是从零开始的。例如,``things[0]`` 指 ``things`` 中的 *第一个* 元素;``things[1]`` " +"指第二个元素。" + +#: ../../glossary.rst:811 +msgid "" +"In some contexts, Python allows negative indexes for counting from the end " +"of a sequence, and indexing using :term:`slices `." +msgstr "在某些上下文中,Python 允许用负索引号表示从序列的末尾开始计数,并可将索引用于 :term:`切片 `。" + +#: ../../glossary.rst:814 +msgid "See also :term:`subscript`." +msgstr "另见 :term:`subscript`。" + +#: ../../glossary.rst:815 +msgid "interactive" +msgstr "interactive -- 交互" + +#: ../../glossary.rst:817 +msgid "" +"Python has an interactive interpreter which means you can enter statements " +"and expressions at the interpreter prompt, immediately execute them and see " +"their results. Just launch ``python`` with no arguments (possibly by " +"selecting it from your computer's main menu). It is a very powerful way to " +"test out new ideas or inspect modules and packages (remember ``help(x)``). " +"For more on interactive mode, see :ref:`tut-interac`." +msgstr "" +"Python 带有一个交互式解释器,这意味着你可以在解释器提示符后输入语句和表达式,立即执行并查看其结果。只需不带参数地启动 ``python`` " +"命令(也可以在你的计算机主菜单中选择相应菜单项)。在测试新想法或检验模块和包的时候这会非常方便(记住 ``help(x)`` 函数)。 " +"有关交互模式的详情,参见 :ref:`tut-interac`。" + +#: ../../glossary.rst:824 +msgid "interpreted" +msgstr "interpreted -- 解释型" + +#: ../../glossary.rst:826 +msgid "" +"Python is an interpreted language, as opposed to a compiled one, though the " +"distinction can be blurry because of the presence of the bytecode compiler." +" This means that source files can be run directly without explicitly " +"creating an executable which is then run. Interpreted languages typically " +"have a shorter development/debug cycle than compiled ones, though their " +"programs generally also run more slowly. See also :term:`interactive`." +msgstr "" +"Python " +"是一种解释型语言,与之相对的是编译型语言,虽然两者的区别由于字节码编译器的存在而会有所模糊。这意味着源文件可以直接运行而不必显式地创建可执行文件再运行。解释型语言通常具有比编译型语言更短的开发/调试周期,但是其程序往往运行得更慢。参见" +" :term:`interactive`。" + +#: ../../glossary.rst:833 +msgid "interpreter shutdown" +msgstr "interpreter shutdown -- 解释器关闭" + +#: ../../glossary.rst:835 +msgid "" +"When asked to shut down, the Python interpreter enters a special phase where" +" it gradually releases all allocated resources, such as modules and various " +"critical internal structures. It also makes several calls to the " +":term:`garbage collector `. This can trigger the " +"execution of code in user-defined destructors or weakref callbacks. Code " +"executed during the shutdown phase can encounter various exceptions as the " +"resources it relies on may not function anymore (common examples are library" +" modules or the warnings machinery)." +msgstr "" +"当被要求关闭时,Python 解释器将进入一个特殊运行阶段并逐步释放所有已分配资源,例如模块和各种关键内部结构等。它还会多次调用 " +":term:`垃圾回收器 `。这会触发用户定义析构器或弱引用回调中的代码执行。在关闭阶段执行的代码可能会遇到各种异常,因为其所依赖的资源已不再有效(常见的例子有库模块或警告机制等)。" + +#: ../../glossary.rst:844 +msgid "" +"The main reason for interpreter shutdown is that the ``__main__`` module or " +"the script being run has finished executing." +msgstr "解释器需要关闭的主要原因有 ``__main__`` 模块或所运行的脚本已完成执行。" + +#: ../../glossary.rst:846 +msgid "iterable" +msgstr "iterable -- 可迭代对象" + +#: ../../glossary.rst:848 +msgid "" +"An object capable of returning its members one at a time. Examples of " +"iterables include all sequence types (such as :class:`list`, :class:`str`, " +"and :class:`tuple`) and some non-sequence types like :class:`dict`, " +":term:`file objects `, and objects of any classes you define " +"with an :meth:`~object.__iter__` method or with a " +":meth:`~object.__getitem__` method that implements :term:`sequence` " +"semantics." +msgstr "" +"一种能够逐个返回其成员项的对象。可迭代对象的例子包括所有序列类型(如 :class:`list`, :class:`str` 和 " +":class:`tuple` 等)以及某些非序列类型如 :class:`dict`, :term:`文件对象 ` " +"以及任何定义了 :meth:`~object.__iter__` 方法或实现了 :term:`sequence` 语义的 " +":meth:`~object.__getitem__` 方法的自定义类的对象。" + +#: ../../glossary.rst:856 +msgid "" +"Iterables can be used in a :keyword:`for` loop and in many other places " +"where a sequence is needed (:func:`zip`, :func:`map`, ...). When an " +"iterable object is passed as an argument to the built-in function " +":func:`iter`, it returns an iterator for the object. This iterator is good " +"for one pass over the set of values. When using iterables, it is usually " +"not necessary to call :func:`iter` or deal with iterator objects yourself. " +"The :keyword:`for` statement does that automatically for you, creating a " +"temporary unnamed variable to hold the iterator for the duration of the " +"loop. See also :term:`iterator`, :term:`sequence`, and :term:`generator`." +msgstr "" +"可迭代对象可被用于 :keyword:`for` 循环以及许多其他需要一个序列的地方 (:func:`zip`, :func:`map`, ...)。 " +"当一个可迭代对象作为参数被传给内置函数 :func:`iter` 时,它会返回该对象的迭代器。这种迭代器适用于对值集合的一次性遍历。 " +"在使用可迭代对象时,你通常不需要调用 :func:`iter` 或者自己处理迭代器对象。 :keyword:`for` " +"语句会自动为你处理那些操作,创建一个临时的未命名变量用来在循环期间保存迭代器。参见 :term:`iterator`, :term:`sequence`" +" 和 :term:`generator`。" + +#: ../../glossary.rst:866 +msgid "iterator" +msgstr "iterator -- 迭代器" + +#: ../../glossary.rst:868 +msgid "" +"An object representing a stream of data. Repeated calls to the iterator's " +":meth:`~iterator.__next__` method (or passing it to the built-in function " +":func:`next`) return successive items in the stream. When no more data are " +"available a :exc:`StopIteration` exception is raised instead. At this " +"point, the iterator object is exhausted and any further calls to its " +":meth:`!__next__` method just raise :exc:`StopIteration` again. Iterators " +"are required to have an :meth:`~iterator.__iter__` method that returns the " +"iterator object itself so every iterator is also iterable and may be used in" +" most places where other iterables are accepted. One notable exception is " +"code which attempts multiple iteration passes. A container object (such as " +"a :class:`list`) produces a fresh new iterator each time you pass it to the " +":func:`iter` function or use it in a :keyword:`for` loop. Attempting this " +"with an iterator will just return the same exhausted iterator object used in" +" the previous iteration pass, making it appear like an empty container." +msgstr "" +"用来表示一连串数据流的对象。重复调用迭代器的 :meth:`~iterator.__next__` 方法 (或将其传给内置函数 " +":func:`next`) 将逐个返回流中的项。当没有数据可用时则将引发 :exc:`StopIteration` 异常。 " +"到这时迭代器对象中的数据项已耗尽,继续调用其 :meth:`!__next__` 方法只会再次引发 :exc:`StopIteration`。 " +"迭代器必须具有 :meth:`~iterator.__iter__` " +"方法用来返回该迭代器对象自身,因此迭代器必定也是可迭代对象,可被用于其他可迭代对象适用的大部分场合。一个显著的例外是那些会多次重复访问迭代项的代码。 " +"容器对象 (例如 :class:`list`) 在你每次将其传入 :func:`iter` 函数或是在 :keyword:`for` " +"循环中使用时都会产生一个新的迭代器。如果在此情况下你尝试用迭代器则会返回在之前迭代过程中被耗尽的同一迭代器对象,使其看起来就像是一个空容器。" + +#: ../../glossary.rst:883 +msgid "More information can be found in :ref:`typeiter`." +msgstr "更多信息可查看 :ref:`typeiter`。" + +#: ../../glossary.rst:887 +msgid "" +"CPython does not consistently apply the requirement that an iterator define " +":meth:`~iterator.__iter__`. And also please note that :term:`free-threaded " +"` CPython does not guarantee :term:`thread-safe` behavior of" +" iterator operations." +msgstr "" +"CPython 没有一致应用针对迭代器定义 :meth:`~iterator.__iter__` 的要求。还要注意 :term:`自由线程版 ` CPython 并不保证迭代器操作的 :term:`thread-safe` 行为。" + +#: ../../glossary.rst:892 +msgid "key" +msgstr "key -- 键" + +#: ../../glossary.rst:894 +msgid "" +"A value that identifies an entry in a :term:`mapping`. See also " +":term:`subscript`." +msgstr "在 :term:`mapping` 中标识条目的值。另见 :term:`subscript`。" + +#: ../../glossary.rst:896 +msgid "key function" +msgstr "key function -- 键函数" + +#: ../../glossary.rst:898 +msgid "" +"A key function or collation function is a callable that returns a value used" +" for sorting or ordering. For example, :func:`locale.strxfrm` is used to " +"produce a sort key that is aware of locale specific sort conventions." +msgstr "" +"键函数或称整理函数,是能够返回用于排序或排位的值的可调用对象。例如,:func:`locale.strxfrm` " +"可用于生成一个符合特定区域排序约定的排序键。" + +#: ../../glossary.rst:903 +msgid "" +"A number of tools in Python accept key functions to control how elements are" +" ordered or grouped. They include :func:`min`, :func:`max`, :func:`sorted`," +" :meth:`list.sort`, :func:`heapq.merge`, :func:`heapq.nsmallest`, " +":func:`heapq.nlargest`, and :func:`itertools.groupby`." +msgstr "" +"Python 中有许多工具都允许用键函数来控制元素的排位或分组方式。其中包括 :func:`min`, :func:`max`, " +":func:`sorted`, :meth:`list.sort`, :func:`heapq.merge`, " +":func:`heapq.nsmallest`, :func:`heapq.nlargest` 以及 " +":func:`itertools.groupby`。" + +#: ../../glossary.rst:909 +msgid "" +"There are several ways to create a key function. For example. the " +":meth:`str.casefold` method can serve as a key function for case insensitive" +" sorts. Alternatively, a key function can be built from a :keyword:`lambda`" +" expression such as ``lambda r: (r[0], r[2])``. Also, " +":func:`operator.attrgetter`, :func:`operator.itemgetter`, and " +":func:`operator.methodcaller` are three key function constructors. See the " +":ref:`Sorting HOW TO ` for examples of how to create and use " +"key functions." +msgstr "" +"键函数有多个创建方式。例如,:meth:`str.casefold` 方法可以用作忽略大小写排序的键函数。或者,键函数也可通过 " +":keyword:`lambda` 表达式如 ``lambda r: (r[0], r[2])`` 来创建。 " +"此外,:func:`operator.attrgetter`, :func:`operator.itemgetter` 和 " +":func:`operator.methodcaller` 是三个键函数构造器。请参阅 :ref:`排序指引 ` " +"来获取创建和使用键函数的示例。" + +#: ../../glossary.rst:916 +msgid "keyword argument" +msgstr "keyword argument -- 关键字参数" + +#: ../../glossary.rst:918 ../../glossary.rst:1305 +msgid "See :term:`argument`." +msgstr "参见 :term:`argument`。" + +#: ../../glossary.rst:919 +msgid "lambda" +msgstr "lambda" + +#: ../../glossary.rst:921 +msgid "" +"An anonymous inline function consisting of a single :term:`expression` which" +" is evaluated when the function is called. The syntax to create a lambda " +"function is ``lambda [parameters]: expression``" +msgstr "" +"由一个单独 :term:`expression` 构成的匿名内联函数,表达式会在调用时被求值。创建 lambda 函数的句法为 ``lambda " +"[parameters]: expression``" + +#: ../../glossary.rst:924 +msgid "LBYL" +msgstr "LBYL" + +#: ../../glossary.rst:926 +msgid "" +"Look before you leap. This coding style explicitly tests for pre-conditions" +" before making calls or lookups. This style contrasts with the :term:`EAFP`" +" approach and is characterized by the presence of many :keyword:`if` " +"statements." +msgstr "" +"“先看后跳”(Look Before You Leap)的英文缩写。这种代码编写风格会在进行调用或查找之前显式地检查前提条件。此风格与 " +":term:`EAFP` 方式恰成对比,其特点是大量使用 :keyword:`if` 语句。" + +#: ../../glossary.rst:931 +msgid "" +"In a multi-threaded environment, the LBYL approach can risk introducing a " +":term:`race condition` between \"the looking\" and \"the leaping\". For " +"example, the code, ``if key in mapping: return mapping[key]`` can fail if " +"another thread removes *key* from *mapping* after the test, but before the " +"lookup. This issue can be solved with :term:`locks ` or by using the " +":term:`EAFP` approach. See also :term:`thread-safe`." +msgstr "" +"在多线程环境中,LBYL 方式会有在“查看”和“跳跃”之间引入 :term:`race condition` 的风险。例如,以下代码 ``if key " +"in mapping: return mapping[key]`` 可能由于在检测操作之后其他线程将 *key* 从 *mapping* " +"中移除而出错。这种问题可通过 :term:`锁 ` 或使用 :term:`EAFP` 方式来解决。另请参阅 :term:`thread-" +"safe`." + +#: ../../glossary.rst:937 +msgid "lexical analyzer" +msgstr "lexical analyzer -- 词法分析器" + +#: ../../glossary.rst:940 +msgid "Formal name for the *tokenizer*; see :term:`token`." +msgstr "*分词器* 的正式名称;参见 :term:`token`。" + +#: ../../glossary.rst:941 +msgid "list" +msgstr "list -- 列表" + +#: ../../glossary.rst:943 +msgid "" +"A built-in Python :term:`sequence`. Despite its name it is more akin to an " +"array in other languages than to a linked list since access to elements is " +"*O*\\ (1)." +msgstr "" +"一种 Python 内置 :term:`sequence`。虽然名为列表,但它更类似于其他语言中的数组而非链表,因为访问元素的时间复杂度为 *O*\\ " +"(1)。" + +#: ../../glossary.rst:946 +msgid "list comprehension" +msgstr "list comprehension -- 列表推导式" + +#: ../../glossary.rst:948 +msgid "" +"A compact way to process all or part of the elements in a sequence and " +"return a list with the results. ``result = ['{:#04x}'.format(x) for x in " +"range(256) if x % 2 == 0]`` generates a list of strings containing even hex " +"numbers (0x..) in the range from 0 to 255. The :keyword:`if` clause is " +"optional. If omitted, all elements in ``range(256)`` are processed." +msgstr "" +"处理一个序列中的所有或部分元素并返回结果列表的一种紧凑写法。``result = ['{:#04x}'.format(x) for x in " +"range(256) if x % 2 == 0]`` 将生成一个 0 到 255 范围内的十六进制偶数对应字符串(0x..)的列表。其中 " +":keyword:`if` 子句是可选的,如果省略则 ``range(256)`` 中的所有元素都会被处理。" + +#: ../../glossary.rst:954 +msgid "lock" +msgstr "lock -- 锁" + +#: ../../glossary.rst:956 +msgid "" +"A :term:`synchronization primitive` that allows only one thread at a time to" +" access a shared resource. A thread must acquire a lock before accessing " +"the protected resource and release it afterward. If a thread attempts to " +"acquire a lock that is already held by another thread, it will block until " +"the lock becomes available. Python's :mod:`threading` module provides " +":class:`~threading.Lock` (a basic lock) and :class:`~threading.RLock` (a " +":term:`reentrant` lock). Locks are used to prevent :term:`race conditions " +"` and ensure :term:`thread-safe` access to shared data. " +"Alternative design patterns to locks exist such as queues, producer/consumer" +" patterns, and thread-local state. See also :term:`deadlock`, and " +":term:`reentrant`." +msgstr "" +"表示在同一时刻只允许一个线程访问共享资源的 :term:`synchronization primitive`。 " +"一个线程在访问受保护的资源之前必须获取锁并在之后释放锁。如果一个线程试图获取已被另一个线程持有的锁,它将被阻塞直到锁可用。Python 的 " +":mod:`threading` 模块提供了 :class:`~threading.Lock` (基础锁) 和 " +":class:`~threading.RLock` (:term:`reentrant` 锁)。锁被用于防止 :term:`竞争条件 ` 并确保对共享数据的 :term:`thread-safe` 访问。 " +"对于加锁也存在其他设计模式如队列、生产者/消费者模式以及线程局部状态等。另请参阅 :term:`deadlock` 和 " +":term:`reentrant`." + +#: ../../glossary.rst:967 +msgid "lock-free" +msgstr "lock-free -- 免加锁" + +#: ../../glossary.rst:969 +msgid "" +"An operation that does not acquire any :term:`lock` and uses atomic CPU " +"instructions to ensure correctness. Lock-free operations can execute " +"concurrently without blocking each other and cannot be blocked by operations" +" that hold locks. In :term:`free-threaded ` Python, built-in" +" types like :class:`dict` and :class:`list` provide lock-free read " +"operations, which means other threads may observe intermediate states during" +" multi-step modifications even when those modifications hold the :term:`per-" +"object lock`." +msgstr "" +"不需要任何 :term:`lock` 而是使用原子化 CPU 指令来确保正确性的操作。 " +"免加锁操作可以并发地执行而不会相互阻塞也不能被持有所的操作所阻塞。 在 :term:`自由线程 ` Python " +"中,内置类型如 :class:`dict` 和 :class:`list` 均提供免加锁读取操作,这意味着在多步骤修改期间即使这些修改持有 " +":term:`per-object lock` 其他线程也可能观察到中间状态。" + +#: ../../glossary.rst:977 +msgid "loader" +msgstr "loader -- 加载器" + +#: ../../glossary.rst:979 +msgid "" +"An object that loads a module. It must define the :meth:`!exec_module` and " +":meth:`!create_module` methods to implement the " +":class:`~importlib.abc.Loader` interface. A loader is typically returned by " +"a :term:`finder`. See also:" +msgstr "" +"负责加载模块的对象。它必须定义 :meth:`!exec_module` 和 :meth:`!create_module` 方法以实现 " +":class:`~importlib.abc.Loader` 接口。加载器通常由一个 :term:`finder` 返回。另请参阅:" + +#: ../../glossary.rst:985 +msgid ":ref:`finders-and-loaders`" +msgstr ":ref:`finders-and-loaders`" + +#: ../../glossary.rst:986 +msgid ":class:`importlib.abc.Loader`" +msgstr ":class:`importlib.abc.Loader`" + +#: ../../glossary.rst:987 +msgid ":pep:`302`" +msgstr ":pep:`302`" + +#: ../../glossary.rst:988 +msgid "locale encoding" +msgstr "locale encoding -- 语言区域编码格式" + +#: ../../glossary.rst:990 +msgid "" +"On Unix, it is the encoding of the LC_CTYPE locale. It can be set with " +":func:`locale.setlocale(locale.LC_CTYPE, new_locale) `." +msgstr "" +"在 Unix 上,它是 LC_CTYPE 语言区域的编码格式。它可以通过 " +":func:`locale.setlocale(locale.LC_CTYPE, new_locale) ` " +"来设置。" + +#: ../../glossary.rst:993 +msgid "On Windows, it is the ANSI code page (ex: ``\"cp1252\"``)." +msgstr "在 Windows 上,它是 ANSI 代码页 (如: ``\"cp1252\"``)。" + +#: ../../glossary.rst:995 +msgid "On Android and VxWorks, Python uses ``\"utf-8\"`` as the locale encoding." +msgstr "在 Android 和 VxWorks 上,Python 使用 ``\"utf-8\"`` 作为语言区域编码格式。" + +#: ../../glossary.rst:997 +msgid ":func:`locale.getencoding` can be used to get the locale encoding." +msgstr ":func:`locale.getencoding` 可被用来获取语言区域编码格式。" + +#: ../../glossary.rst:999 +msgid "See also the :term:`filesystem encoding and error handler`." +msgstr "另请参阅 :term:`filesystem encoding and error handler`。" + +#: ../../glossary.rst:1000 +msgid "magic method" +msgstr "magic method -- 魔术方法" + +#: ../../glossary.rst:1004 +msgid "An informal synonym for :term:`special method`." +msgstr ":term:`special method` 的非正式同义词。" + +#: ../../glossary.rst:1005 +msgid "mapping" +msgstr "mapping -- 映射" + +#: ../../glossary.rst:1007 +msgid "" +"A container object that supports arbitrary key lookups and implements the " +"methods specified in the :class:`collections.abc.Mapping` or " +":class:`collections.abc.MutableMapping` :ref:`abstract base classes " +"`. Examples include :class:`dict`, " +":class:`collections.defaultdict`, :class:`collections.OrderedDict` and " +":class:`collections.Counter`." +msgstr "" +"一种支持任意键查找并实现了 :class:`collections.abc.Mapping` 或 " +":class:`collections.abc.MutableMapping` :ref:`抽象基类 ` 所规定方法的容器对象。 此类对象的例子包括 :class:`dict`, " +":class:`collections.defaultdict`, :class:`collections.OrderedDict` 以及 " +":class:`collections.Counter`。" + +#: ../../glossary.rst:1013 +msgid "meta path finder" +msgstr "meta path finder -- 元路径查找器" + +#: ../../glossary.rst:1015 +msgid "" +"A :term:`finder` returned by a search of :data:`sys.meta_path`. Meta path " +"finders are related to, but different from :term:`path entry finders `." +msgstr "" +":data:`sys.meta_path` 的搜索所返回的 :term:`finder`。元路径查找器与 :term:`path entry " +"finders ` 存在关联但并不相同。" + +#: ../../glossary.rst:1019 +msgid "" +"See :class:`importlib.abc.MetaPathFinder` for the methods that meta path " +"finders implement." +msgstr "请查看 :class:`importlib.abc.MetaPathFinder` 了解元路径查找器所实现的方法。" + +#: ../../glossary.rst:1021 +msgid "metaclass" +msgstr "metaclass -- 元类" + +#: ../../glossary.rst:1023 +msgid "" +"The class of a class. Class definitions create a class name, a class " +"dictionary, and a list of base classes. The metaclass is responsible for " +"taking those three arguments and creating the class. Most object oriented " +"programming languages provide a default implementation. What makes Python " +"special is that it is possible to create custom metaclasses. Most users " +"never need this tool, but when the need arises, metaclasses can provide " +"powerful, elegant solutions. They have been used for logging attribute " +"access, adding thread-safety, tracking object creation, implementing " +"singletons, and many other tasks." +msgstr "" +"一种用于创建类的类。类定义包含类名、类字典和基类列表。元类负责接受上述三个参数并创建相应的类。大部分面向对象的编程语言都会提供一个默认实现。Python" +" " +"的特别之处在于可以创建自定义元类。大部分用户永远不需要这个工具,但当需要出现时,元类可提供强大而优雅的解决方案。它们已被用于记录属性访问日志、添加线程安全性、跟踪对象创建、实现单例,以及其他许多任务。" + +#: ../../glossary.rst:1033 +msgid "More information can be found in :ref:`metaclasses`." +msgstr "更多详情参见 :ref:`metaclasses`。" + +#: ../../glossary.rst:1002 ../../glossary.rst:1034 ../../glossary.rst:1488 +msgid "method" +msgstr "method -- 方法" + +#: ../../glossary.rst:1036 +msgid "" +"A function which is defined inside a class body. If called as an attribute " +"of an instance of that class, the method will get the instance object as its" +" first :term:`argument` (which is usually called ``self``). See " +":term:`function` and :term:`nested scope`." +msgstr "" +"在类内部定义的函数。如果作为该类的实例的一个属性来调用,方法将会获取实例对象作为其第一个 :term:`argument` (通常命名为 " +"``self``)。参见 :term:`function` 和 :term:`nested scope`。" + +#: ../../glossary.rst:1040 +msgid "method resolution order" +msgstr "method resolution order -- 方法解析顺序" + +#: ../../glossary.rst:1042 +msgid "" +"Method Resolution Order is the order in which base classes are searched for " +"a member during lookup. See :ref:`python_2.3_mro` for details of the " +"algorithm used by the Python interpreter since the 2.3 release." +msgstr "" +"方法解析顺序就是在查找成员时搜索基类的顺序。请参阅 :ref:`python_2.3_mro` 了解自 2.3 发布版起 Python " +"解释器所使用算法的详情。" + +#: ../../glossary.rst:1045 +msgid "module" +msgstr "module -- 模块" + +#: ../../glossary.rst:1047 +msgid "" +"An object that serves as an organizational unit of Python code. Modules " +"have a namespace containing arbitrary Python objects. Modules are loaded " +"into Python by the process of :term:`importing`." +msgstr "" +"此对象是 Python 代码的一种组织单位。各模块具有独立的命名空间,可包含任意 Python 对象。模块可通过 :term:`importing` " +"操作被加载到 Python 中。" + +#: ../../glossary.rst:1051 +msgid "See also :term:`package`." +msgstr "另见 :term:`package`。" + +#: ../../glossary.rst:1052 +msgid "module spec" +msgstr "module spec -- 模块规格" + +#: ../../glossary.rst:1054 +msgid "" +"A namespace containing the import-related information used to load a module." +" An instance of :class:`importlib.machinery.ModuleSpec`." +msgstr "" +"一个命名空间,其中包含用于加载模块的相关导入信息。是 :class:`importlib.machinery.ModuleSpec` 的实例。" + +#: ../../glossary.rst:1057 +msgid "See also :ref:`module-specs`." +msgstr "另请参阅 :ref:`module-specs`。" + +#: ../../glossary.rst:1058 +msgid "MRO" +msgstr "MRO" + +#: ../../glossary.rst:1060 +msgid "See :term:`method resolution order`." +msgstr "参见 :term:`method resolution order`。" + +#: ../../glossary.rst:1061 +msgid "mutable" +msgstr "mutable -- 可变对象" + +#: ../../glossary.rst:1063 +msgid "" +"An :term:`object` with state that is allowed to change during the course of " +"the program. In multi-threaded programs, mutable objects that are shared " +"between threads require careful synchronization to avoid :term:`race " +"conditions `. See also :term:`immutable`, :term:`thread-" +"safe`, and :term:`concurrent modification`." +msgstr "" +"一种带有在程序运行期间允许修改的状态的 :term:`object`。在多线程的程序中,在线程之间共享的可变对象需要谨慎地同步操作以避免 " +":term:`竞争条件 `。另请参阅 :term:`immutable`, :term:`thread-safe` 和 " +":term:`concurrent modification`." + +#: ../../glossary.rst:1068 +msgid "named tuple" +msgstr "named tuple -- 具名元组" + +#: ../../glossary.rst:1070 +msgid "" +"The term \"named tuple\" applies to any type or class that inherits from " +"tuple and whose indexable elements are also accessible using named " +"attributes. The type or class may have other features as well." +msgstr "术语“具名元组”可用于任何继承自元组,并且其中的可索引元素还能使用名称属性来访问的类型或类。这样的类型或类还可能拥有其他特性。" + +#: ../../glossary.rst:1074 +msgid "" +"Several built-in types are named tuples, including the values returned by " +":func:`time.localtime` and :func:`os.stat`. Another example is " +":data:`sys.float_info`::" +msgstr "" +"有些内置类型属于具名元组,包括 :func:`time.localtime` 和 :func:`os.stat` 的返回值。另一个例子是 " +":data:`sys.float_info`::" + +#: ../../glossary.rst:1078 +msgid "" +">>> sys.float_info[1] # indexed access\n" +"1024\n" +">>> sys.float_info.max_exp # named field access\n" +"1024\n" +">>> isinstance(sys.float_info, tuple) # kind of tuple\n" +"True" +msgstr "" +">>> sys.float_info[1] # 索引访问\n" +"1024\n" +">>> sys.float_info.max_exp # 命名字段访问\n" +"1024\n" +">>> isinstance(sys.float_info, tuple) # 属于元组\n" +"True" + +#: ../../glossary.rst:1085 +msgid "" +"Some named tuples are built-in types (such as the above examples). " +"Alternatively, a named tuple can be created from a regular class definition " +"that inherits from :class:`tuple` and that defines named fields. Such a " +"class can be written by hand, or it can be created by inheriting " +":class:`typing.NamedTuple`, or with the factory function " +":func:`collections.namedtuple`. The latter techniques also add some extra " +"methods that may not be found in hand-written or built-in named tuples." +msgstr "" +"有些具名元组是内置类型(比如上面的例子)。此外,具名元组还可通过常规类定义从 :class:`tuple` 继承并定义指定名称的字段的方式来创建。 " +"这样的类可以手工编写,或者也可以通过继承 :class:`typing.NamedTuple`,或者使用工厂函数 " +":func:`collections.namedtuple` 来创建。后一种方式还会添加一些手工编写或内置的具名元组所没有的额外方法。" + +#: ../../glossary.rst:1093 +msgid "namespace" +msgstr "namespace -- 命名空间" + +#: ../../glossary.rst:1095 +msgid "" +"The place where a variable is stored. Namespaces are implemented as " +"dictionaries. There are the local, global and built-in namespaces as well " +"as nested namespaces in objects (in methods). Namespaces support modularity" +" by preventing naming conflicts. For instance, the functions " +":func:`builtins.open <.open>` and :func:`os.open` are distinguished by their" +" namespaces. Namespaces also aid readability and maintainability by making " +"it clear which module implements a function. For instance, writing " +":func:`random.seed` or :func:`itertools.islice` makes it clear that those " +"functions are implemented by the :mod:`random` and :mod:`itertools` modules," +" respectively." +msgstr "" +"命名空间是存放变量的场所。命名空间有局部、全局和内置的,还有对象中的嵌套命名空间(在方法之内)。命名空间通过防止命名冲突来支持模块化。例如,函数 " +":func:`builtins.open <.open>` 与 :func:`os.open` " +"可通过各自的命名空间来区分。命名空间还通过明确哪个模块实现那个函数来帮助提高可读性和可维护性。例如,:func:`random.seed` 或 " +":func:`itertools.islice` 这种写法明确了这些函数是由 :mod:`random` 与 :mod:`itertools` " +"模块分别实现的。" + +#: ../../glossary.rst:1105 +msgid "namespace package" +msgstr "namespace package -- 命名空间包" + +#: ../../glossary.rst:1107 +msgid "" +"A :term:`package` which serves only as a container for subpackages. " +"Namespace packages may have no physical representation, and specifically are" +" not like a :term:`regular package` because they have no ``__init__.py`` " +"file." +msgstr "" +"一种仅被用作子包的容器的 :term:`package`。命名空间包可以没有实体表示物,具体而言就是不同于 :term:`regular " +"package` 因为它们没有 ``__init__.py`` 文件。" + +#: ../../glossary.rst:1112 +msgid "" +"Namespace packages allow several individually installable packages to have a" +" common parent package. Otherwise, it is recommended to use a :term:`regular" +" package`." +msgstr "命名空间包允许几个可单独安装的包具有共同的父包。在其他情况下,则推荐使用 :term:`regular package`。" + +#: ../../glossary.rst:1115 +msgid "" +"For more information, see :pep:`420` and :ref:`reference-namespace-package`." +msgstr "要了解更多信息,请参阅 :pep:`420` 和 :ref:`reference-namespace-package`。" + +#: ../../glossary.rst:1117 +msgid "See also :term:`module`." +msgstr "另可参见 :term:`module`。" + +#: ../../glossary.rst:1118 +msgid "native code" +msgstr "native code -- 原生代码" + +#: ../../glossary.rst:1120 +msgid "" +"Code that is compiled to machine instructions and runs directly on the " +"processor, as opposed to code that is interpreted or runs in a virtual " +"machine. In the context of Python, native code typically refers to C, C++, " +"Rust or Fortran code in :term:`extension modules ` that " +"can be called from Python. See also :term:`extension module`." +msgstr "" +"编译为机器指令并直接在处理器上运行的代码,这与在虚拟机上解释或运行的代码相对。在 Python 的上下文中,原生代码通常是指 :term:`扩展模块中 " +"` 可以被 Python 调用的 C, C++, Rust 或 Fortran 代码。另请参阅 " +":term:`extension module`." + +#: ../../glossary.rst:1125 +msgid "nested scope" +msgstr "nested scope -- 嵌套作用域" + +#: ../../glossary.rst:1127 +msgid "" +"The ability to refer to a variable in an enclosing definition. For " +"instance, a function defined inside another function can refer to variables " +"in the outer function. Note that nested scopes by default work only for " +"reference and not for assignment. Local variables both read and write in " +"the innermost scope. Likewise, global variables read and write to the " +"global namespace. The :keyword:`nonlocal` allows writing to outer scopes." +msgstr "" +"在一个定义范围内引用变量的能力。例如,在另一函数之内定义的函数可以引用前者的变量。请注意嵌套作用域默认只对引用有效而对赋值无效。局部变量的读写都受限于最内层作用域。类似的,全局变量的读写则作用于全局命名空间。通过" +" :keyword:`nonlocal` 关键字可允许写入外层作用域。" + +#: ../../glossary.rst:1134 +msgid "new-style class" +msgstr "new-style class -- 新式类" + +#: ../../glossary.rst:1136 +msgid "" +"Old name for the flavor of classes now used for all class objects. In " +"earlier Python versions, only new-style classes could use Python's newer, " +"versatile features like :attr:`~object.__slots__`, descriptors, properties, " +":meth:`~object.__getattribute__`, class methods, and static methods." +msgstr "" +"对目前已被应用于所有类对象的类形式的旧称谓。在较早的 Python 版本中,只有新式类能够使用 Python 新增的更灵活的特性,如 " +":attr:`~object.__slots__`、描述器、特征属性、:meth:`~object.__getattribute__`、类方法和静态方法等。" + +#: ../../glossary.rst:1141 +msgid "non-deterministic" +msgstr "non-deterministic -- 非确定性的" + +#: ../../glossary.rst:1143 +msgid "" +"Behavior where the outcome of a program can vary between executions with the" +" same inputs. In multi-threaded programs, non-deterministic behavior often " +"results from :term:`race conditions ` where the relative " +"timing or interleaving of threads affects the result. Proper synchronization" +" using :term:`locks ` and other :term:`synchronization primitives " +"` helps ensure deterministic behavior." +msgstr "" +"程序以相同的输入多次执行时可能存在不同的行为。在多线程的程序中,非确定性的行为往往来自于线程的相对用时或交替影响结果的 :term:`竞争条件 " +"`。使用 :term:`锁 ` 或其他 :term:`同步原语 ` 进行正确的同步操作有助于保证确定性的行为。" + +#: ../../glossary.rst:1150 +msgid "object" +msgstr "object -- 对象" + +#: ../../glossary.rst:1152 +msgid "" +"Any data with state (attributes or value) and defined behavior (methods). " +"Also the ultimate base class of any :term:`new-style class`." +msgstr "" +"任何具有状态(属性或值)以及预定义行为(方法)的数据。object 也是任何 :term:`new-style class` 的最顶层基类名。" + +#: ../../glossary.rst:1155 +msgid "optimized scope" +msgstr "optimized scope -- 已优化的作用域" + +#: ../../glossary.rst:1157 +msgid "" +"A scope where target local variable names are reliably known to the compiler" +" when the code is compiled, allowing optimization of read and write access " +"to these names. The local namespaces for functions, generators, coroutines, " +"comprehensions, and generator expressions are optimized in this fashion. " +"Note: most interpreter optimizations are applied to all scopes, only those " +"relying on a known set of local and nonlocal variable names are restricted " +"to optimized scopes." +msgstr "" +"当代码被编译时编译器已充分知晓目标局部变量名称的作用域,这允许对这些名称的读写进行优化。 " +"针对函数、生成器、协程、推导式和生成器表达式的局部命名空间都是这样的已优化作用域。 " +"注意:大部分解释器优化将应用于所有作用域,只有那些依赖于已知的局部和非局部变量名称集合的优化会仅限于已优化的作用域。" + +#: ../../glossary.rst:1164 +msgid "optional module" +msgstr "optional module -- 可选模块" + +#: ../../glossary.rst:1166 +msgid "" +"An :term:`extension module` that is part of the :term:`standard library`, " +"but may be absent in some builds of :term:`CPython`, usually due to missing " +"third-party libraries or because the module is not available for a given " +"platform." +msgstr "" +"一个属于 :term:`standard library` 组成部分的 :term:`extension module`,但可能不存在于某些 " +":term:`CPython` 构建版中,通常是由于缺少某个第三方库或由于该模块在给定的平台上不可用。" + +#: ../../glossary.rst:1171 +msgid "" +"See :ref:`optional-module-requirements` for a list of optional modules that " +"require third-party libraries." +msgstr "请参阅 :ref:`optional-module-requirements` 查看需要第三方库的可选模块列表。" + +#: ../../glossary.rst:1173 +msgid "package" +msgstr "package -- 包" + +#: ../../glossary.rst:1175 +msgid "" +"A Python :term:`module` which can contain submodules or recursively, " +"subpackages. Technically, a package is a Python module with a ``__path__`` " +"attribute." +msgstr "" +"一种可包含子模块或递归地包含子包的 Python :term:`module`。从技术上说,包是具有 ``__path__`` 属性的 Python " +"模块。" + +#: ../../glossary.rst:1179 +msgid "See also :term:`regular package` and :term:`namespace package`." +msgstr "另参见 :term:`regular package` 和 :term:`namespace package`。" + +#: ../../glossary.rst:1180 +msgid "parallelism" +msgstr "parallelism -- 并行" + +#: ../../glossary.rst:1182 +msgid "" +"Executing multiple operations at the same time (e.g. on multiple CPU cores)." +" In Python builds with the :term:`global interpreter lock (GIL) `, only one thread runs Python bytecode at a time, so " +"taking advantage of multiple CPU cores typically involves multiple processes" +" (e.g. :mod:`multiprocessing`) or native extensions that release the GIL. In" +" :term:`free-threaded ` Python, multiple Python threads can " +"run Python code simultaneously on different cores." +msgstr "" +"同时执行多个操作(例如在多个 CPU 核心上)。在启用 :term:`全局解释器锁 (GIL) ` 的" +" Python 构建版中,在同一时刻只能有一个线程在运行 Python 字节码,因此想发挥多个 CPU 核心的能力通常要使用多个进程 (例如通过 " +":mod:`multiprocessing`) 或者使用释放 GIL 的原生扩展。在 :term:`自由线程 ` " +"Python 构建版中,多个 Python 线程可以在不同的核心上同时运行 Python 代码。" + +#: ../../glossary.rst:1190 +msgid "parameter" +msgstr "parameter -- 形参" + +#: ../../glossary.rst:1192 +msgid "" +"A named entity in a :term:`function` (or method) definition that specifies " +"an :term:`argument` (or in some cases, arguments) that the function can " +"accept. There are five kinds of parameter:" +msgstr "" +":term:`function` (或方法) 定义中的命名实体,它指定函数可以接受的一个 :term:`argument` " +"(或在某些情况下,是多个参数)。 共有有五种形参:" + +#: ../../glossary.rst:1196 +msgid "" +":dfn:`positional-or-keyword`: specifies an argument that can be passed " +"either :term:`positionally ` or as a :term:`keyword argument " +"`. This is the default kind of parameter, for example *foo* and " +"*bar* in the following::" +msgstr "" +":dfn:`positional-or-keyword`: 位置或关键字,指定一个可以作为 :term:`位置参数 ` " +"传入也可以作为 :term:`关键字参数 ` 传入的实参。这是默认的形参类型,例如下面的 *foo* 和 *bar*::" + +#: ../../glossary.rst:1201 +msgid "def func(foo, bar=None): ..." +msgstr "def func(foo, bar=None): ..." + +#: ../../glossary.rst:1205 +msgid "" +":dfn:`positional-only`: specifies an argument that can be supplied only by " +"position. Positional-only parameters can be defined by including a ``/`` " +"character in the parameter list of the function definition after them, for " +"example *posonly1* and *posonly2* in the following::" +msgstr "" +":dfn:`positional-only`: 仅限位置,指定一个只能通过位置传入的参数。仅限位置形参可通过在函数定义的形参列表中它们之后包含一个 " +"``/`` 字符来定义,例如下面的 *posonly1* 和 *posonly2*::" + +#: ../../glossary.rst:1210 +msgid "def func(posonly1, posonly2, /, positional_or_keyword): ..." +msgstr "def func(posonly1, posonly2, /, positional_or_keyword): ..." + +#: ../../glossary.rst:1214 +msgid "" +":dfn:`keyword-only`: specifies an argument that can be supplied only by " +"keyword. Keyword-only parameters can be defined by including a single var-" +"positional parameter or bare ``*`` in the parameter list of the function " +"definition before them, for example *kw_only1* and *kw_only2* in the " +"following::" +msgstr "" +":dfn:`keyword-only`: " +"仅限关键字,指定一个只能通过关键字传入的参数。仅限关键字形参可通过在函数定义的形参列表中包含单个可变位置形参或者在多个可变位置形参之前放一个 ``*``" +" 来定义,例如下面的 *kw_only1* 和 *kw_only2*::" + +#: ../../glossary.rst:1220 +msgid "def func(arg, *, kw_only1, kw_only2): ..." +msgstr "def func(arg, *, kw_only1, kw_only2): ..." + +#: ../../glossary.rst:1222 +msgid "" +":dfn:`var-positional`: specifies that an arbitrary sequence of positional " +"arguments can be provided (in addition to any positional arguments already " +"accepted by other parameters). Such a parameter can be defined by " +"prepending the parameter name with ``*``, for example *args* in the " +"following::" +msgstr "" +":dfn:`var-" +"positional`:可变位置,指定可以提供由一个任意数量的位置参数构成的序列(附加在其他形参已接受的位置参数之后)。这种形参可通过在形参名称前加缀 " +"``*`` 来定义,例如下面的 *args*::" + +#: ../../glossary.rst:1228 +msgid "def func(*args, **kwargs): ..." +msgstr "def func(*args, **kwargs): ..." + +#: ../../glossary.rst:1230 +msgid "" +":dfn:`var-keyword`: specifies that arbitrarily many keyword arguments can be" +" provided (in addition to any keyword arguments already accepted by other " +"parameters). Such a parameter can be defined by prepending the parameter " +"name with ``**``, for example *kwargs* in the example above." +msgstr "" +":dfn:`var-" +"keyword`:可变关键字,指定可以提供任意数量的关键字参数(附加在其他形参已接受的关键字参数之后)。这种形参可通过在形参名称前加缀 ``**`` " +"来定义,例如上面的 *kwargs*。" + +#: ../../glossary.rst:1236 +msgid "" +"Parameters can specify both optional and required arguments, as well as " +"default values for some optional arguments." +msgstr "形参可以同时指定可选和必选参数,也可以为某些可选参数指定默认值。" + +#: ../../glossary.rst:1239 +msgid "" +"See also the :term:`argument` glossary entry, the FAQ question on :ref:`the " +"difference between arguments and parameters `, " +"the :class:`inspect.Parameter` class, the :ref:`function` section, and " +":pep:`362`." +msgstr "" +"另参见 :term:`argument` 术语表条目、:ref:`参数与形参的区别 ` " +"中的常见问题、:class:`inspect.Parameter` 类、:ref:`function` 一节以及 :pep:`362`。" + +#: ../../glossary.rst:1243 +msgid "per-object lock" +msgstr "per-object lock -- 每对象锁" + +#: ../../glossary.rst:1245 +msgid "" +"A :term:`lock` associated with an individual object instance rather than a " +"global lock shared across all objects. In :term:`free-threaded ` Python, built-in types like :class:`dict` and :class:`list` use " +"per-object locks to allow concurrent operations on different objects while " +"serializing operations on the same object. Operations that hold the per-" +"object lock prevent other locking operations on the same object from " +"proceeding, but do not block :term:`lock-free` operations." +msgstr "" +"关联到单独对象实例的 :term:`lock` 而不是由所有对象共享的全局锁。 在 :term:`自由线程 ` " +"Python 中,内置类型如 :class:`dict` 和 :class:`list` " +"均使用每对象锁以允许在不同对象上并发操作同时在同一对象上序列化操作。 持有每对象锁的操作可防止在同一对象上其他加锁操作的执行,但不会阻塞 " +":term:`lock-free` 操作。" + +#: ../../glossary.rst:1253 +msgid "path entry" +msgstr "path entry -- 路径入口" + +#: ../../glossary.rst:1255 +msgid "" +"A single location on the :term:`import path` which the :term:`path based " +"finder` consults to find modules for importing." +msgstr ":term:`import path` 中的一个单独位置,会被 :term:`path based finder` 用来查找要导入的模块。" + +#: ../../glossary.rst:1257 +msgid "path entry finder" +msgstr "path entry finder -- 路径入口查找器" + +#: ../../glossary.rst:1259 +msgid "" +"A :term:`finder` returned by a callable on :data:`sys.path_hooks` (i.e. a " +":term:`path entry hook`) which knows how to locate modules given a " +":term:`path entry`." +msgstr "" +"任一可调用对象使用 :data:`sys.path_hooks` (即 :term:`path entry hook`) 返回的 " +":term:`finder`,此种对象能通过 :term:`path entry` 来定位模块。" + +#: ../../glossary.rst:1263 +msgid "" +"See :class:`importlib.abc.PathEntryFinder` for the methods that path entry " +"finders implement." +msgstr "请参看 :class:`importlib.abc.PathEntryFinder` 以了解路径入口查找器所实现的各个方法。" + +#: ../../glossary.rst:1265 +msgid "path entry hook" +msgstr "path entry hook -- 路径入口钩子" + +#: ../../glossary.rst:1267 +msgid "" +"A callable on the :data:`sys.path_hooks` list which returns a :term:`path " +"entry finder` if it knows how to find modules on a specific :term:`path " +"entry`." +msgstr "" +"一种可调用对象,它在知道如何查找特定 :term:`path entry` 中的模块的情况下能够使用 :data:`sys.path_hooks` " +"列表返回一个 :term:`path entry finder`。" + +#: ../../glossary.rst:1270 +msgid "path based finder" +msgstr "path based finder -- 基于路径的查找器" + +#: ../../glossary.rst:1272 +msgid "" +"One of the default :term:`meta path finders ` which " +"searches an :term:`import path` for modules." +msgstr "" +"默认的一种 :term:`元路径查找器 `,可在一个 :term:`import path` 中查找模块。" + +#: ../../glossary.rst:1274 +msgid "path-like object" +msgstr "path-like object -- 路径型对象" + +#: ../../glossary.rst:1276 +msgid "" +"An object representing a file system path. A path-like object is either a " +":class:`str` or :class:`bytes` object representing a path, or an object " +"implementing the :class:`os.PathLike` protocol. An object that supports the " +":class:`os.PathLike` protocol can be converted to a :class:`str` or " +":class:`bytes` file system path by calling the :func:`os.fspath` function; " +":func:`os.fsdecode` and :func:`os.fsencode` can be used to guarantee a " +":class:`str` or :class:`bytes` result instead, respectively. Introduced by " +":pep:`519`." +msgstr "" +"代表一个文件系统路径的对象。路径类对象可以是一个表示路径的 :class:`str` 或者 :class:`bytes` 对象,还可以是一个实现了 " +":class:`os.PathLike` 协议的对象。一个支持 :class:`os.PathLike` 协议的对象可通过调用 " +":func:`os.fspath` 函数转换为 :class:`str` 或者 :class:`bytes` " +"类型的文件系统路径;:func:`os.fsdecode` 和 :func:`os.fsencode` 可被分别用来确保获得 :class:`str` " +"或 :class:`bytes` 类型的结果。此对象是由 :pep:`519` 引入的。" + +#: ../../glossary.rst:1284 +msgid "PEP" +msgstr "PEP" + +#: ../../glossary.rst:1286 +msgid "" +"Python Enhancement Proposal. A PEP is a design document providing " +"information to the Python community, or describing a new feature for Python " +"or its processes or environment. PEPs should provide a concise technical " +"specification and a rationale for proposed features." +msgstr "" +"“Python 增强提议”的英文缩写。一个 PEP 就是一份设计文档,用来向 Python 社区提供信息,或描述一个 Python " +"的新增特性及其进度或环境。PEP 应当提供精确的技术规格和所提议特性的原理说明。" + +#: ../../glossary.rst:1292 +msgid "" +"PEPs are intended to be the primary mechanisms for proposing major new " +"features, for collecting community input on an issue, and for documenting " +"the design decisions that have gone into Python. The PEP author is " +"responsible for building consensus within the community and documenting " +"dissenting opinions." +msgstr "" +"PEP 应被作为提出主要新特性建议、收集社区对特定问题反馈以及为必须加入 Python 的设计决策编写文档的首选机制。PEP " +"的作者有责任在社区内部建立共识,并应将不同意见也记入文档。" + +#: ../../glossary.rst:1298 +msgid "See :pep:`1`." +msgstr "参见 :pep:`1`。" + +#: ../../glossary.rst:1299 +msgid "portion" +msgstr "portion -- 部分" + +#: ../../glossary.rst:1301 +msgid "" +"A set of files in a single directory (possibly stored in a zip file) that " +"contribute to a namespace package, as defined in :pep:`420`." +msgstr "构成一个命名空间包的单个目录内文件集合(也可能存放于一个 zip 文件内),具体定义见 :pep:`420`。" + +#: ../../glossary.rst:1303 +msgid "positional argument" +msgstr "positional argument -- 位置参数" + +#: ../../glossary.rst:1306 +msgid "provisional API" +msgstr "provisional API -- 暂定 API" + +#: ../../glossary.rst:1308 +msgid "" +"A provisional API is one which has been deliberately excluded from the " +"standard library's backwards compatibility guarantees. While major changes " +"to such interfaces are not expected, as long as they are marked provisional," +" backwards incompatible changes (up to and including removal of the " +"interface) may occur if deemed necessary by core developers. Such changes " +"will not be made gratuitously -- they will occur only if serious fundamental" +" flaws are uncovered that were missed prior to the inclusion of the API." +msgstr "" +"暂定 API " +"是指被有意排除在标准库的向后兼容性保证之外的应用编程接口。虽然此类接口通常不会再有重大改变,但只要其被标记为暂定,就可能在核心开发者确定有必要的情况下进行向后不兼容的更改(甚至包括移除该接口)。此种更改并不会随意进行" +" -- 仅在 API 被加入之前未考虑到的严重基础性缺陷被发现时才可能会这样做。" + +#: ../../glossary.rst:1317 +msgid "" +"Even for provisional APIs, backwards incompatible changes are seen as a " +"\"solution of last resort\" - every attempt will still be made to find a " +"backwards compatible resolution to any identified problems." +msgstr "" +"即便是对暂定 API 来说,向后不兼容的更改也会被视为“最后的解决方案” —— 任何问题被确认时都会尽可能先尝试找到一种向后兼容的解决方案。" + +#: ../../glossary.rst:1321 +msgid "" +"This process allows the standard library to continue to evolve over time, " +"without locking in problematic design errors for extended periods of time. " +"See :pep:`411` for more details." +msgstr "这种处理过程允许标准库持续不断地演进,不至于被有问题的长期性设计缺陷所困。详情见 :pep:`411`。" + +#: ../../glossary.rst:1324 +msgid "provisional package" +msgstr "provisional package -- 暂定包" + +#: ../../glossary.rst:1326 +msgid "See :term:`provisional API`." +msgstr "参见 :term:`provisional API`。" + +#: ../../glossary.rst:1327 +msgid "Python 3000" +msgstr "Python 3000" + +#: ../../glossary.rst:1329 +msgid "" +"Nickname for the Python 3.x release line (coined long ago when the release " +"of version 3 was something in the distant future.) This is also abbreviated" +" \"Py3k\"." +msgstr "Python 3.x 发布路线的昵称(这个名字在版本 3 的发布还遥遥无期的时候就已出现了)。有时也被缩写为“Py3k”。" + +#: ../../glossary.rst:1332 +msgid "Pythonic" +msgstr "Pythonic" + +#: ../../glossary.rst:1334 +msgid "" +"An idea or piece of code which closely follows the most common idioms of the" +" Python language, rather than implementing code using concepts common to " +"other languages. For example, a common idiom in Python is to loop over all " +"elements of an iterable using a :keyword:`for` statement. Many other " +"languages don't have this type of construct, so people unfamiliar with " +"Python sometimes use a numerical counter instead::" +msgstr "" +"指一个思路或一段代码紧密遵循了 Python 语言最常用的风格和理念,而不是使用其他语言中通用的概念来实现代码。例如,Python 的常用风格是使用 " +":keyword:`for` 语句循环来遍历一个可迭代对象中的所有元素。许多其他语言没有这样的结构,因此不熟悉 Python " +"的人有时会选择使用一个数字计数器::" + +#: ../../glossary.rst:1341 +msgid "" +"for i in range(len(food)):\n" +" print(food[i])" +msgstr "" +"for i in range(len(food)):\n" +" print(food[i])" + +#: ../../glossary.rst:1344 +msgid "As opposed to the cleaner, Pythonic method::" +msgstr "而相应的更简洁更 Pythonic 的方法是这样的::" + +#: ../../glossary.rst:1346 +msgid "" +"for piece in food:\n" +" print(piece)" +msgstr "" +"for piece in food:\n" +" print(piece)" + +#: ../../glossary.rst:1348 +msgid "qualified name" +msgstr "qualified name -- 限定名称" + +#: ../../glossary.rst:1350 +msgid "" +"A dotted name showing the \"path\" from a module's global scope to a class, " +"function or method defined in that module, as defined in :pep:`3155`. For " +"top-level functions and classes, the qualified name is the same as the " +"object's name::" +msgstr "" +"一个以点号分隔的名称,显示从模块的全局作用域到该模块中定义的某个类、函数或方法的“路径”,相关定义见 " +":pep:`3155`。对于最高层级的函数和类,限定名称与对象名称一致::" + +#: ../../glossary.rst:1355 +msgid "" +">>> class C:\n" +"... class D:\n" +"... def meth(self):\n" +"... pass\n" +"...\n" +">>> C.__qualname__\n" +"'C'\n" +">>> C.D.__qualname__\n" +"'C.D'\n" +">>> C.D.meth.__qualname__\n" +"'C.D.meth'" +msgstr "" +">>> class C:\n" +"... class D:\n" +"... def meth(self):\n" +"... pass\n" +"...\n" +">>> C.__qualname__\n" +"'C'\n" +">>> C.D.__qualname__\n" +"'C.D'\n" +">>> C.D.meth.__qualname__\n" +"'C.D.meth'" + +#: ../../glossary.rst:1367 +msgid "" +"When used to refer to modules, the *fully qualified name* means the entire " +"dotted path to the module, including any parent packages, e.g. " +"``email.mime.text``::" +msgstr "" +"当被用于引用模块时,*完整限定名称* 意为标示该模块的以点号分隔的整个路径,其中包含其所有的父包,例如 ``email.mime.text``::" + +#: ../../glossary.rst:1371 +msgid "" +">>> import email.mime.text\n" +">>> email.mime.text.__name__\n" +"'email.mime.text'" +msgstr "" +">>> import email.mime.text\n" +">>> email.mime.text.__name__\n" +"'email.mime.text'" + +#: ../../glossary.rst:1374 +msgid "race condition" +msgstr "race condition -- 竞争条件" + +#: ../../glossary.rst:1376 +msgid "" +"A condition of a program where the behavior depends on the relative timing " +"or ordering of events, particularly in multi-threaded programs. Race " +"conditions can lead to :term:`non-deterministic` behavior and bugs that are " +"difficult to reproduce. A :term:`data race` is a specific type of race " +"condition involving unsynchronized access to shared memory. The " +":term:`LBYL` coding style is particularly susceptible to race conditions in " +"multi-threaded code. Using :term:`locks ` and other " +":term:`synchronization primitives ` helps prevent" +" race conditions." +msgstr "" +"一个程序的行为取决于事件的相对时长和事件顺序的情况,特别是在多线程的程序当中。 竞争条件可能导致 :term:`non-deterministic` " +"的行为以及难以重现的程序缺陷。 :term:`data race` 是涉及对共享内存的未同步访问的一种特定类型的竞争条件。 :term:`LBYL` " +"代码风格特别容易在多线程代码中造成竞争条件。 使用 :term:`锁 ` 和其他 :term:`同步原语 ` 有助于防止竞争条件。helps prevent race conditions." + +#: ../../glossary.rst:1386 +msgid "reference count" +msgstr "reference count -- 引用计数" + +#: ../../glossary.rst:1388 +msgid "" +"The number of references to an object. When the reference count of an " +"object drops to zero, it is deallocated. Some objects are :term:`immortal` " +"and have reference counts that are never modified, and therefore the objects" +" are never deallocated. Reference counting is generally not visible to " +"Python code, but it is a key element of the :term:`CPython` implementation." +" Programmers can call the :func:`sys.getrefcount` function to return the " +"reference count for a particular object." +msgstr "" +"指向某个对象的引用的数量。当一个对象的引用计数降为零时,它就会被释放。特殊的 :term:`immortal` " +"对象具有永远不会被修改的引用计数,因此这种对象永远不会被释放。引用计数对 Python 代码来说通常是不可见的,但它是 :term:`CPython` " +"实现的一个关键元素。程序员可以调用 :func:`sys.getrefcount` 函数来返回特定对象的引用计数。" + +#: ../../glossary.rst:1397 +msgid "" +"In :term:`CPython`, reference counts are not considered to be stable or " +"well-defined values; the number of references to an object, and how that " +"number is affected by Python code, may be different between versions." +msgstr "" +"在 :term:`CPython` 中,引用计数并非稳定或明确定义的值;对象的引用数量以及该数量受 Python " +"代码影响的方式,可能会因版本不同而有所差异。" + +#: ../../glossary.rst:1401 +msgid "regular package" +msgstr "regular package -- 常规包" + +#: ../../glossary.rst:1403 +msgid "" +"A traditional :term:`package`, such as a directory containing an " +"``__init__.py`` file." +msgstr "传统型的 :term:`package`,例如包含有一个 ``__init__.py`` 文件的目录。" + +#: ../../glossary.rst:1406 +msgid "See also :term:`namespace package`." +msgstr "另参见 :term:`namespace package`。" + +#: ../../glossary.rst:1407 +msgid "reentrant" +msgstr "reentrant -- 重进入" + +#: ../../glossary.rst:1409 +msgid "" +"A property of a function or :term:`lock` that allows it to be called or " +"acquired multiple times by the same thread without causing errors or a " +":term:`deadlock`." +msgstr "一个函数的特征属性或 :term:`lock`,它允许被同一个线程多次调用或者获取而不会导致错误或 :term:`deadlock`。" + +#: ../../glossary.rst:1413 +msgid "" +"For functions, reentrancy means the function can be safely called again " +"before a previous invocation has completed, which is important when " +"functions may be called recursively or from signal handlers. Thread-unsafe " +"functions may be :term:`non-deterministic` if they're called reentrantly in " +"a multithreaded program." +msgstr "" +"对于函数来说,重进入意味着该函数可以在之前的唤起完成之前安全地被再次调用,这在函数可能被递归地调用或被信号处理器调用时是很重要的。 " +"线程不安全的函数如果在多线程的程序中以重进入方式被调用则可能导致 :term:`non-deterministic`。" + +#: ../../glossary.rst:1419 +msgid "" +"For locks, Python's :class:`threading.RLock` (reentrant lock) is reentrant, " +"meaning a thread that already holds the lock can acquire it again without " +"blocking. In contrast, :class:`threading.Lock` is not reentrant - " +"attempting to acquire it twice from the same thread will cause a deadlock." +msgstr "" +"对于锁来说,Python 的 :class:`threading.RLock` (重进入锁) " +"是支持重进入的,这意味着已经持有某个锁的线程可以再次获取它而不造成阻塞。与此相反,:class:`threading.Lock` 是不支持重进入的 ——" +" 试图从同一个线程再次获取它会导致死锁。" + +#: ../../glossary.rst:1425 +msgid "See also :term:`lock` and :term:`deadlock`." +msgstr "另请参阅 :term:`lock` 和 :term:`deadlock`。" + +#: ../../glossary.rst:1426 +msgid "REPL" +msgstr "REPL" + +#: ../../glossary.rst:1428 +msgid "" +"An acronym for the \"read–eval–print loop\", another name for the " +":term:`interactive` interpreter shell." +msgstr "" +"“读取 - 求值 - 打印循环”read-eval-print loop 的缩写,:term:`interactive` 解释器 shell " +"的另一个名字。" + +#: ../../glossary.rst:1430 +msgid "__slots__" +msgstr "__slots__" + +#: ../../glossary.rst:1432 +msgid "" +"A declaration inside a class that saves memory by pre-declaring space for " +"instance attributes and eliminating instance dictionaries. Though popular, " +"the technique is somewhat tricky to get right and is best reserved for rare " +"cases where there are large numbers of instances in a memory-critical " +"application." +msgstr "" +"一种写在类内部的声明,通过预先声明实例属性等对象并移除实例字典来节省内存。虽然这种技巧很流行,但想要用好却并不容易,最好是只保留在少数情况下采用,例如极耗内存的应用程序,并且其中包含大量实例。" + +#: ../../glossary.rst:1437 +msgid "sequence" +msgstr "sequence -- 序列" + +#: ../../glossary.rst:1439 +msgid "" +"An :term:`iterable` which supports efficient element access using integer " +"indices via the :meth:`~object.__getitem__` special method and defines a " +":meth:`~object.__len__` method that returns the length of the sequence. Some" +" built-in sequence types are :class:`list`, :class:`str`, :class:`tuple`, " +"and :class:`bytes`. Note that :class:`dict` also supports " +":meth:`~object.__getitem__` and :meth:`!__len__`, but is considered a " +"mapping rather than a sequence because the lookups use arbitrary " +":term:`hashable` keys rather than integers." +msgstr "" +"一种 :term:`iterable`,它支持通过 :meth:`~object.__getitem__` " +"特殊方法来使用整数索引进行高效的元素访问,并定义了一个返回序列长度的 :meth:`~object.__len__` 方法。内置序列类型有 " +":class:`list`, :class:`str`, :class:`tuple` 和 :class:`bytes` 等。请注意虽然 " +":class:`dict` 也支持 :meth:`~object.__getitem__` 和 " +":meth:`!__len__`,但它被归类为映射而非序列,因为它使用任意的 :term:`hashable` 键而不是整数来查找元素。" + +#: ../../glossary.rst:1448 +msgid "" +"The :class:`collections.abc.Sequence` abstract base class defines a much " +"richer interface that goes beyond just :meth:`~object.__getitem__` and " +":meth:`~object.__len__`, adding :meth:`~sequence.count`, " +":meth:`~sequence.index`, :meth:`~object.__contains__`, and " +":meth:`~object.__reversed__`. Types that implement this expanded interface " +"can be registered explicitly using :func:`~abc.ABCMeta.register`. For more " +"documentation on sequence methods generally, see :ref:`Common Sequence " +"Operations `." +msgstr "" +":class:`collections.abc.Sequence` 抽象基类定义了一个更丰富的接口,它在 " +":meth:`~object.__getitem__` 和 :meth:`~object.__len__` 之外,还添加了 " +":meth:`~sequence.count`, :meth:`~sequence.index`, " +":meth:`~object.__contains__` 和 :meth:`~object.__reversed__`。实现此扩展接口的类型可以使用 " +":func:`~abc.ABCMeta.register` 来显式地注册。要获取有关通用序列方法的更多文档,请参阅 :ref:`通用序列操作 " +"`." + +#: ../../glossary.rst:1458 +msgid "set comprehension" +msgstr "set comprehension -- 集合推导式" + +#: ../../glossary.rst:1460 +msgid "" +"A compact way to process all or part of the elements in an iterable and " +"return a set with the results. ``results = {c for c in 'abracadabra' if c " +"not in 'abc'}`` generates the set of strings ``{'r', 'd'}``. See " +":ref:`comprehensions`." +msgstr "" +"处理一个可迭代对象中的所有或部分元素并返回结果集合的一种紧凑写法。``results = {c for c in 'abracadabra' if c " +"not in 'abc'}`` 将生成字符串集合 ``{'r', 'd'}``。参见 :ref:`comprehensions`。" + +#: ../../glossary.rst:1464 +msgid "single dispatch" +msgstr "single dispatch -- 单分派" + +#: ../../glossary.rst:1466 +msgid "" +"A form of :term:`generic function` dispatch where the implementation is " +"chosen based on the type of a single argument." +msgstr "一种 :term:`generic function` 分派形式,其实现是基于单个参数的类型来选择的。" + +#: ../../glossary.rst:1468 +msgid "slice" +msgstr "slice -- 切片" + +#: ../../glossary.rst:1470 +msgid "" +"An object of type :class:`slice`, used to describe a portion of a " +":term:`sequence`. A slice object is created when using the :ref:`slicing " +"` form of :ref:`subscript notation `, with colons " +"inside square brackets, such as in ``variable_name[1:3:5]``." +msgstr "" +"类型为 :class:`slice` 的对象,用于表示 :term:`sequence` 的一部分。切片对象是在使用 :ref:`抽取标记法 " +"` 的 :ref:`切片 ` 形式时创建的,即在方括号内带冒号,比如 " +"``variable_name[1:3:5]``。" + +#: ../../glossary.rst:1475 +msgid "soft deprecated" +msgstr "soft deprecated -- 软弃用" + +#: ../../glossary.rst:1477 +msgid "" +"A soft deprecated API should not be used in new code, but it is safe for " +"already existing code to use it. The API remains documented and tested, but " +"will not be enhanced further." +msgstr "" +"被软弃用的 API 不应在新编写的代码中使用,但在已有代码中使用仍是安全的。这样的 API 将保留在文档中并被测试,但不会再获得进一步的功能增强。" + +#: ../../glossary.rst:1481 +msgid "" +"Soft deprecation, unlike normal deprecation, does not plan on removing the " +"API and will not emit warnings." +msgstr "与普通的弃用不同,软弃用没有 API 移除计划也不会发出弃用警告。" + +#: ../../glossary.rst:1484 +msgid "" +"See `PEP 387: Soft Deprecation `_." +msgstr "" +"参见 `PEP 387: Soft Deprecation `_。" + +#: ../../glossary.rst:1486 +msgid "special method" +msgstr "special method -- 特殊方法" + +#: ../../glossary.rst:1490 +msgid "" +"A method that is called implicitly by Python to execute a certain operation " +"on a type, such as addition. Such methods have names starting and ending " +"with double underscores. Special methods are documented in " +":ref:`specialnames`." +msgstr "" +"一种由 Python 隐式调用的方法,用来对某个类型执行特定操作例如相加等等。这种方法的名称的首尾都为双下划线。特殊方法的文档参见 " +":ref:`specialnames`。" + +#: ../../glossary.rst:1494 +msgid "standard library" +msgstr "standard library -- 标准库" + +#: ../../glossary.rst:1496 +msgid "" +"The collection of :term:`packages `, :term:`modules ` and " +":term:`extension modules ` distributed as a part of the " +"official Python interpreter package. The exact membership of the collection" +" may vary based on platform, available system libraries, or other criteria." +" Documentation can be found at :ref:`library-index`." +msgstr "" +"作为官方 Python 解释器软件包的组成部分一同发布的 :term:`包 `, :term:`模块 ` 和 " +":term:`扩展模块 ` 集合。该集合成员的实际内容可能因系统平台、可用系统库或其他条件的不同而发生变化。 " +"相关文档可在 :ref:`library-index` 查看。" + +#: ../../glossary.rst:1502 +msgid "" +"See also :data:`sys.stdlib_module_names` for a list of all possible standard" +" library module names." +msgstr "另请参阅 :data:`sys.stdlib_module_names` 获取所有可用标准库模块名称的列表。" + +#: ../../glossary.rst:1504 +msgid "statement" +msgstr "statement -- 语句" + +#: ../../glossary.rst:1506 +msgid "" +"A statement is part of a suite (a \"block\" of code). A statement is either" +" an :term:`expression` or one of several constructs with a keyword, such as " +":keyword:`if`, :keyword:`while` or :keyword:`for`." +msgstr "" +"语句是程序段(一个代码“块”)的组成单位。一条语句可以是一个 :term:`expression` 或某个带有关键字的结构,例如 " +":keyword:`if`、:keyword:`while` 或 :keyword:`for`。" + +#: ../../glossary.rst:1509 +msgid "static type checker" +msgstr "static type checker -- 静态类型检查器" + +#: ../../glossary.rst:1511 +msgid "" +"An external tool that reads Python code and analyzes it, looking for issues " +"such as incorrect types. See also :term:`type hints ` and the " +":mod:`typing` module." +msgstr "" +"读取 Python 代码并进行分析,以查找问题例如不正确的类型的外部工具。另请参阅 :term:`类型提示 ` 以及 " +":mod:`typing` 模块。" + +#: ../../glossary.rst:1514 +msgid "stdlib" +msgstr "stdlib -- 标准库" + +#: ../../glossary.rst:1516 +msgid "An abbreviation of :term:`standard library`." +msgstr ":term:`standard library` 的缩写。" + +#: ../../glossary.rst:1517 +msgid "strong reference" +msgstr "strong reference -- 强引用" + +#: ../../glossary.rst:1519 +msgid "" +"In Python's C API, a strong reference is a reference to an object which is " +"owned by the code holding the reference. The strong reference is taken by " +"calling :c:func:`Py_INCREF` when the reference is created and released with " +":c:func:`Py_DECREF` when the reference is deleted." +msgstr "" +"在 Python 的 C API 中,强引用是指为持有引用的代码所拥有的对象的引用。在创建引用时可通过调用 :c:func:`Py_INCREF` " +"来获取强引用而在删除引用时可通过 :c:func:`Py_DECREF` 来释放它。" + +#: ../../glossary.rst:1525 +msgid "" +"The :c:func:`Py_NewRef` function can be used to create a strong reference to" +" an object. Usually, the :c:func:`Py_DECREF` function must be called on the " +"strong reference before exiting the scope of the strong reference, to avoid " +"leaking one reference." +msgstr "" +":c:func:`Py_NewRef` 函数可被用于创建一个对象的强引用。通常,必须在退出某个强引用的作用域时在该强引用上调用 " +":c:func:`Py_DECREF` 函数,以避免引用的泄漏。" + +#: ../../glossary.rst:1530 +msgid "See also :term:`borrowed reference`." +msgstr "另请参阅 :term:`borrowed reference`。" + +#: ../../glossary.rst:1531 +msgid "subscript" +msgstr "subscript -- 下标" + +#: ../../glossary.rst:1533 +msgid "" +"The expression in square brackets of a :ref:`subscription expression " +"`, for example, the ``3`` in ``items[3]``. Usually used to " +"select an element of a container. Also called a :term:`key` when " +"subscripting a :term:`mapping`, or an :term:`index` when subscripting a " +":term:`sequence`." +msgstr "" +":ref:`下标表达式 ` 在方括号中的表达式,例如,在 ``items[3]`` 中的 ``3``。 " +"通常用于选择抽取容器中的一个元素。在抽取 :term:`mapping` 时也称 :term:`key`,在抽取 :term:`sequence` " +"时也称 :term:`index`。" + +#: ../../glossary.rst:1539 +msgid "synchronization primitive" +msgstr "synchronization primitive -- 同步化原语" + +#: ../../glossary.rst:1541 +msgid "" +"A basic building block for coordinating (synchronizing) the execution of " +"multiple threads to ensure :term:`thread-safe` access to shared resources. " +"Python's :mod:`threading` module provides several synchronization primitives" +" including :class:`~threading.Lock`, :class:`~threading.RLock`, " +":class:`~threading.Semaphore`, :class:`~threading.Condition`, " +":class:`~threading.Event`, and :class:`~threading.Barrier`. Additionally, " +"the :mod:`queue` module provides multi-producer, multi-consumer queues that " +"are especially useful in multithreaded programs. These primitives help " +"prevent :term:`race conditions ` and coordinate thread " +"execution. See also :term:`lock`." +msgstr "" +"用于协调(同步)多线程执行以确保对共享资源的 :term:`thread-safe` 访问的基础构造单元。Python 的 " +":mod:`threading` 模块提供了多种同步化原语包括 :class:`~threading.Lock`, " +":class:`~threading.RLock`, :class:`~threading.Semaphore`, " +":class:`~threading.Condition`, :class:`~threading.Event` 和 " +":class:`~threading.Barrier`。此外,:mod:`queue` 模块提供了特别适用于多线程的程序的多生产者、多消费者队列。 " +"这些原语有助于防止 :term:`竞争条件 ` 并协调线程执行。另请参阅 :term:`lock`。" + +#: ../../glossary.rst:1551 +msgid "t-string" +msgstr "t-string -- t-字符串" + +#: ../../glossary.rst:1552 +msgid "t-strings" +msgstr "t-strings -- t-字符串" + +#: ../../glossary.rst:1554 +msgid "" +"String literals prefixed with ``t`` or ``T`` are commonly called " +"\"t-strings\" which is short for :ref:`template string literals " +"`." +msgstr "" +"带有 ``t`` 或 ``T`` 前缀的字符串字面值通常被称为 \"t-字符串\" 即 :ref:`模板字符串字面值 ` 的简写。" + +#: ../../glossary.rst:1557 +msgid "text encoding" +msgstr "text encoding -- 文本编码格式" + +#: ../../glossary.rst:1559 +msgid "" +"A string in Python is a sequence of Unicode code points (in range " +"``U+0000``--``U+10FFFF``). To store or transfer a string, it needs to be " +"serialized as a sequence of bytes." +msgstr "" +"在 Python 中,一个字符串是一串 Unicode 代码点 (范围为 ``U+0000``--``U+10FFFF``)。 " +"为了存储或传输一个字符串,它需要被序列化为一串字节。" + +#: ../../glossary.rst:1563 +msgid "" +"Serializing a string into a sequence of bytes is known as \"encoding\", and " +"recreating the string from the sequence of bytes is known as \"decoding\"." +msgstr "将一个字符串序列化为一个字节序列被称为“编码”,而从字节序列中重新创建字符串被称为“解码”。" + +#: ../../glossary.rst:1566 +msgid "" +"There are a variety of different text serialization :ref:`codecs `, which are collectively referred to as \"text encodings\"." +msgstr "有各种不同的文本序列化 :ref:`编码器 `,它们被统称为 \"文本编码格式\"。" + +#: ../../glossary.rst:1569 +msgid "text file" +msgstr "text file -- 文本文件" + +#: ../../glossary.rst:1571 +msgid "" +"A :term:`file object` able to read and write :class:`str` objects. Often, a " +"text file actually accesses a byte-oriented datastream and handles the " +":term:`text encoding` automatically. Examples of text files are files opened" +" in text mode (``'r'`` or ``'w'``), :data:`sys.stdin`, :data:`sys.stdout`, " +"and instances of :class:`io.StringIO`." +msgstr "" +"一种能够读写 :class:`str` 对象的 :term:`file object`。通常一个文本文件实际是访问一个面向字节的数据流并自动处理 " +":term:`text encoding`。 文本文件的例子包括以文本模式 (``'r'`` 或 ``'w'``) " +"打开的文件、:data:`sys.stdin`、:data:`sys.stdout` 以及 :class:`io.StringIO` 的实例。" + +#: ../../glossary.rst:1578 +msgid "" +"See also :term:`binary file` for a file object able to read and write " +":term:`bytes-like objects `." +msgstr "" +"另请参看 :term:`binary file` 了解能够读写 :term:`字节型对象 ` 的文件对象。" + +#: ../../glossary.rst:1580 +msgid "thread state" +msgstr "thread state -- 线程状态" + +#: ../../glossary.rst:1583 +msgid "" +"The information used by the :term:`CPython` runtime to run in an OS thread. " +"For example, this includes the current exception, if any, and the state of " +"the bytecode interpreter." +msgstr ":term:`CPython` 运行时在一个 OS 线程中运行所使用的信息。例如,这包括可能存在的当前异常,以及字节码解释器的状态等。" + +#: ../../glossary.rst:1587 +msgid "" +"Each thread state is bound to a single OS thread, but threads may have many " +"thread states available. At most, one of them may be :term:`attached " +"` at once." +msgstr "" +"每个线程状态将绑定到一个单独的 OS 线程,但线程可能具有许多可用的线程状态。在最一般情况下,可能立即 :term:`附加 ` 它们中的一个。" + +#: ../../glossary.rst:1591 +msgid "" +"An :term:`attached thread state` is required to call most of Python's C API," +" unless a function explicitly documents otherwise. The bytecode interpreter " +"only runs under an attached thread state." +msgstr "" +"调用大多数 Python 的 C API 都需要有一个 :term:`attached thread " +"state`,除非一个函数文档显式地写明了不同情况。字节码解释器只能运行在一个已附加线程状态下。" + +#: ../../glossary.rst:1595 +msgid "" +"Each thread state belongs to a single interpreter, but each interpreter may " +"have many thread states, including multiple for the same OS thread. Thread " +"states from multiple interpreters may be bound to the same thread, but only " +"one can be :term:`attached ` in that thread at any " +"given moment." +msgstr "" +"每个线程状态都归属于一个单独的解释器,但每个解释器可能有多个线程状态,包括同一个 OS 线程的多个线程状态。 " +"来自多个解释器的线程状态可能会绑定到相同的线程,但在任一给定时刻在一个线程中只能有一个线程状态可以被 :term:`附加 `。" + +#: ../../glossary.rst:1601 +msgid "" +"See :ref:`Thread State and the Global Interpreter Lock ` for more " +"information." +msgstr "请参阅 :ref:`线程状态和全局解释器锁 ` 了解详情。" + +#: ../../glossary.rst:1603 +msgid "thread-safe" +msgstr "thread-safe -- 线程安全" + +#: ../../glossary.rst:1605 +msgid "" +"A module, function, or class that behaves correctly when used by multiple " +"threads concurrently. Thread-safe code uses appropriate " +":term:`synchronization primitives ` like " +":term:`locks ` to protect shared mutable state, or is designed to " +"avoid shared mutable state entirely. In the :term:`free-threaded ` build, built-in types like :class:`dict`, :class:`list`, and " +":class:`set` use internal locking to make many operations thread-safe, " +"although thread safety is not necessarily guaranteed. Code that is not " +"thread-safe may experience :term:`race conditions ` and " +":term:`data races ` when used in multi-threaded programs." +msgstr "" +"当被多个线程并发地使用时保持正确行为的模块、函数或类。线程安全的代码会使用适当的 :term:`同步化原语 ` 如 :term:`锁 ` 来保护共享的可变状态,或是被设计为能完全避免共享的可变状态。在 :term:`自由线程 " +"` 构建版中,内置类型如 :class:`dict`, :class:`list` 和 :class:`set` " +"会使用内部锁实现各种操作的线程安全,不过这并不绝对保证线程安全。在多线程程序中使用非线程安全的代码时可能会出现 :term:`竞争条件 ` 和 :term:`数据竞争 ` 等问题。" + +#: ../../glossary.rst:1616 +msgid "token" +msgstr "token -- 词元" + +#: ../../glossary.rst:1619 +msgid "" +"A small unit of source code, generated by the :ref:`lexical analyzer " +"` (also called the *tokenizer*). Names, numbers, strings, " +"operators, newlines and similar are represented by tokens." +msgstr "" +"一个源代码小单元,由 :ref:`词法分析器 ` (或称 *分词器*) 生成。名称、数字、字符串、运算符、换行符等均由词元来表示。" + +#: ../../glossary.rst:1624 +msgid "" +"The :mod:`tokenize` module exposes Python's lexical analyzer. The " +":mod:`token` module contains information on the various types of tokens." +msgstr ":mod:`tokenize` 模块对外暴露了 Python 的词法分析器。 :mod:`token` 模块包含了有关各种词元类型的信息。" + +#: ../../glossary.rst:1627 +msgid "triple-quoted string" +msgstr "triple-quoted string -- 三引号字符串" + +#: ../../glossary.rst:1629 +msgid "" +"A string which is bound by three instances of either a quotation mark (\") " +"or an apostrophe ('). While they don't provide any functionality not " +"available with single-quoted strings, they are useful for a number of " +"reasons. They allow you to include unescaped single and double quotes " +"within a string and they can span multiple lines without the use of the " +"continuation character, making them especially useful when writing " +"docstrings." +msgstr "" +"首尾各带三个连续双引号(\")或者单引号(')的字符串。它们在功能上与首尾各用一个引号标注的字符串没有什么不同,但是有多种用处。它们允许你在字符串内包含未经转义的单引号和双引号,并且可以跨越多行而无需使用连接符,在编写文档字符串时特别好用。" + +#: ../../glossary.rst:1636 +msgid "type" +msgstr "type -- 类型" + +#: ../../glossary.rst:1638 +msgid "" +"The type of a Python object determines what kind of object it is; every " +"object has a type. An object's type is accessible as its " +":attr:`~object.__class__` attribute or can be retrieved with ``type(obj)``." +msgstr "" +"Python 对象的类型决定它属于什么种类;每个对象都具有特定的类型。对象的类型可通过其 :attr:`~object.__class__` " +"属性来访问或是用 ``type(obj)`` 来获取。" + +#: ../../glossary.rst:1642 +msgid "type alias" +msgstr "type alias -- 类型别名" + +#: ../../glossary.rst:1644 +msgid "A synonym for a type, created by assigning the type to an identifier." +msgstr "一个类型的同义词,创建方式是把类型赋值给特定的标识符。" + +#: ../../glossary.rst:1646 +msgid "" +"Type aliases are useful for simplifying :term:`type hints `. For " +"example::" +msgstr "类型别名的作用是简化 :term:`类型注解 `。例如::" + +#: ../../glossary.rst:1649 +msgid "" +"def remove_gray_shades(\n" +" colors: list[tuple[int, int, int]]) -> list[tuple[int, int, int]]:\n" +" pass" +msgstr "" +"def remove_gray_shades(\n" +" colors: list[tuple[int, int, int]]) -> list[tuple[int, int, int]]:\n" +" pass" + +#: ../../glossary.rst:1653 +msgid "could be made more readable like this::" +msgstr "可以这样提高可读性::" + +#: ../../glossary.rst:1655 +msgid "" +"Color = tuple[int, int, int]\n" +"\n" +"def remove_gray_shades(colors: list[Color]) -> list[Color]:\n" +" pass" +msgstr "" +"Color = tuple[int, int, int]\n" +"\n" +"def remove_gray_shades(colors: list[Color]) -> list[Color]:\n" +" pass" + +#: ../../glossary.rst:1660 ../../glossary.rst:1674 +msgid "See :mod:`typing` and :pep:`484`, which describe this functionality." +msgstr "参见 :mod:`typing` 和 :pep:`484`,其中有对此功能的详细描述。" + +#: ../../glossary.rst:1661 +msgid "type hint" +msgstr "type hint -- 类型提示" + +#: ../../glossary.rst:1663 +msgid "" +"An :term:`annotation` that specifies the expected type for a variable, a " +"class attribute, or a function parameter or return value." +msgstr ":term:`annotation` 为变量、类属性、函数的形参或返回值指定预期的类型。" + +#: ../../glossary.rst:1666 +msgid "" +"Type hints are optional and are not enforced by Python but they are useful " +"to :term:`static type checkers `. They can also aid " +"IDEs with code completion and refactoring." +msgstr "" +"类型提示是可选的而不是 Python 的强制要求,但它们对 :term:`静态类型检查器 ` 很有用处。 " +"它们还能协助 IDE 实现代码补全与重构。" + +#: ../../glossary.rst:1670 +msgid "" +"Type hints of global variables, class attributes, and functions, but not " +"local variables, can be accessed using :func:`typing.get_type_hints`." +msgstr "全局变量、类属性和函数的类型注解可以使用 :func:`typing.get_type_hints` 来访问,但局部变量则不可以。" + +#: ../../glossary.rst:1675 +msgid "universal newlines" +msgstr "universal newlines -- 通用换行" + +#: ../../glossary.rst:1677 +msgid "" +"A manner of interpreting text streams in which all of the following are " +"recognized as ending a line: the Unix end-of-line convention ``'\\n'``, the " +"Windows convention ``'\\r\\n'``, and the old Macintosh convention ``'\\r'``." +" See :pep:`278` and :pep:`3116`, as well as :func:`bytes.splitlines` for an" +" additional use." +msgstr "" +"一种解读文本流的方式,将以下所有符号都识别为行结束标志:Unix 的行结束约定 ``'\\n'``、Windows 的约定 ``'\\r\\n'`` " +"以及旧版 Macintosh 的约定 ``'\\r'``。参见 :pep:`278` 和 :pep:`3116` 和 " +":func:`bytes.splitlines` 了解更多用法说明。" + +#: ../../glossary.rst:1682 +msgid "variable annotation" +msgstr "variable annotation -- 变量标注" + +#: ../../glossary.rst:1684 +msgid "An :term:`annotation` of a variable or a class attribute." +msgstr "对变量或类属性的 :term:`annotation`。" + +#: ../../glossary.rst:1686 +msgid "" +"When annotating a variable or a class attribute, assignment is optional::" +msgstr "在标注变量或类属性时,还可选择为其赋值::" + +#: ../../glossary.rst:1688 +msgid "" +"class C:\n" +" field: 'annotation'" +msgstr "" +"class C:\n" +" field: 'annotation'" + +#: ../../glossary.rst:1691 +msgid "" +"Variable annotations are usually used for :term:`type hints `: " +"for example this variable is expected to take :class:`int` values::" +msgstr "变量标注通常被用作 :term:`类型提示 `:例如以下变量预期接受 :class:`int` 类型的值::" + +#: ../../glossary.rst:1695 +msgid "count: int = 0" +msgstr "count: int = 0" + +#: ../../glossary.rst:1697 +msgid "Variable annotation syntax is explained in section :ref:`annassign`." +msgstr "变量标注语法的详细解释见 :ref:`annassign` 一节。" + +#: ../../glossary.rst:1699 +msgid "" +"See :term:`function annotation`, :pep:`484` and :pep:`526`, which describe " +"this functionality. Also see :ref:`annotations-howto` for best practices on " +"working with annotations." +msgstr "" +"参见 :term:`function annotation`, :pep:`484` 和 :pep:`526`,其中描述了此功能。另请参阅 " +":ref:`annotations-howto` 以了解使用标注的最佳实践。" + +#: ../../glossary.rst:1703 +msgid "virtual environment" +msgstr "virtual environment -- 虚拟环境" + +#: ../../glossary.rst:1705 +msgid "" +"A cooperatively isolated runtime environment that allows Python users and " +"applications to install and upgrade Python distribution packages without " +"interfering with the behaviour of other Python applications running on the " +"same system." +msgstr "" +"一种采用协作式隔离的运行时环境,允许 Python 用户和应用程序在安装和升级 Python 分发包时不会干扰到同一系统上运行的其他 Python " +"应用程序的行为。" + +#: ../../glossary.rst:1710 +msgid "See also :mod:`venv`." +msgstr "另参见 :mod:`venv`。" + +#: ../../glossary.rst:1711 +msgid "virtual machine" +msgstr "virtual machine -- 虚拟机" + +#: ../../glossary.rst:1713 +msgid "" +"A computer defined entirely in software. Python's virtual machine executes " +"the :term:`bytecode` emitted by the bytecode compiler." +msgstr "一台完全通过软件定义的计算机。Python 虚拟机可执行字节码编译器所生成的 :term:`bytecode`。" + +#: ../../glossary.rst:1715 +msgid "walrus operator" +msgstr "walrus operator -- 海象运算符" + +#: ../../glossary.rst:1717 +msgid "" +"A light-hearted way to refer to the :ref:`assignment expression ` operator ``:=`` because it looks a bit like a walrus if you " +"turn your head." +msgstr "" +"对于 :ref:`赋值表达式 ` 运算符 ``:=`` " +"的玩笑性称谓,因为如果你侧头看它会有点像一只海象。" + +#: ../../glossary.rst:1720 +msgid "Zen of Python" +msgstr "Zen of Python -- Python 之禅" + +#: ../../glossary.rst:1722 +msgid "" +"Listing of Python design principles and philosophies that are helpful in " +"understanding and using the language. The listing can be found by typing " +"\"``import this``\" at the interactive prompt." +msgstr "列出 Python 设计的原则与哲学,有助于理解与使用这种语言。查看其具体内容可在交互模式提示符中输入 \"``import this``\"。" + +#: ../../glossary.rst:24 +msgid "..." +msgstr "..." + +#: ../../glossary.rst:24 +msgid "ellipsis literal" +msgstr "ellipsis literal -- 省略符字面值" + +#: ../../glossary.rst:349 +msgid "C-contiguous" +msgstr "C 连续" + +#: ../../glossary.rst:349 +msgid "Fortran contiguous" +msgstr "Fortran 连续" + +#: ../../glossary.rst:1002 +msgid "magic" +msgstr "魔术" + +#: ../../glossary.rst:1488 +msgid "special" +msgstr "特殊" diff --git a/howto/a-conceptual-overview-of-asyncio.po b/howto/a-conceptual-overview-of-asyncio.po new file mode 100644 index 0000000000..22dcf4c88a --- /dev/null +++ b/howto/a-conceptual-overview-of-asyncio.po @@ -0,0 +1,1093 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-15 16:14+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:5 +msgid "A Conceptual Overview of :mod:`!asyncio`" +msgstr ":mod:`!asyncio` 的概念概述" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:7 +msgid "" +"This :ref:`HOWTO ` article seeks to help you build a sturdy mental " +"model of how :mod:`asyncio` fundamentally works, helping you understand the " +"how and why behind the recommended patterns." +msgstr "" +"这篇 :ref:`指南 ` 旨在帮助您充分理解 :mod:`asyncio` 的基本运作原理,并使您理解推荐模式背后的原理和原因。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:11 +msgid "" +"You might be curious about some key :mod:`!asyncio` concepts. By the end of " +"this article, you'll be able to comfortably answer these questions:" +msgstr "你可能会对某些关键的 :mod:`!asyncio` 概念感到好奇。读完本文后,你将能够轻松地回答这些问题:" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:14 +msgid "What's happening behind the scenes when an object is awaited?" +msgstr "当一个对象被等待时,幕后发生了什么?" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:15 +msgid "" +"How does :mod:`!asyncio` differentiate between a task which doesn't need CPU" +" time (such as a network request or file read) as opposed to a task that " +"does (such as computing n-factorial)?" +msgstr ":mod:`!asyncio` 如何区分不需要 CPU 时间的任务(如网络请求或文件读取)和与之相反的任务(如计算 n 的阶乘)?" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:18 +msgid "" +"How to write an asynchronous variant of an operation, such as an async sleep" +" or database request." +msgstr "如何编写一个操作的异步变体,例如异步的休眠或数据库请求。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:23 +msgid "" +"The `guide `_ that inspired this HOWTO article, by Alexander Nordin." +msgstr "" +"启发这篇指南文章的 `指南 `_,作者是 Alexander Nordin。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:25 +msgid "" +"This in-depth `YouTube tutorial series `_ on " +"``asyncio`` created by Python core team member, Łukasz Langa." +msgstr "" +"这套深入讲解 ``asyncio`` 的 `YouTube 教程系列 `_,由 Python " +"核心团队成员 Łukasz Langa 制作。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:28 +msgid "" +"`500 Lines or Less: A Web Crawler With asyncio Coroutines `_ by A. " +"Jesse Jiryu Davis and Guido van Rossum." +msgstr "" +"`500 Lines or Less: A Web Crawler With asyncio Coroutines `_,作者是 A. " +"Jesse Jiryu Davis 和 Guido van Rossum。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:34 +msgid "A conceptual overview part 1: the high-level" +msgstr "概念概述第 1 部分:高层次" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:36 +msgid "" +"In part 1, we'll cover the main, high-level building blocks of " +":mod:`!asyncio`: the event loop, coroutine functions, coroutine objects, " +"tasks, and ``await``." +msgstr "" +"在第 1 部分中,我们将介绍主要的、高层级的 :mod:`!asyncio` 构成部分:事件循环、协程函数、协程对象、任务和 ``await``。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:41 +msgid "Event Loop" +msgstr "事件循环" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:43 +msgid "" +"Everything in :mod:`!asyncio` happens relative to the event loop. It's the " +"star of the show. It's like an orchestra conductor. It's behind the scenes " +"managing resources. Some power is explicitly granted to it, but a lot of its" +" ability to get things done comes from the respect and cooperation of its " +"worker bees." +msgstr "" +":mod:`!asyncio` " +"中的一切都与事件循环相关。它是演出的主角。它就像一名乐队指挥一样在幕后管理资源。它掌握着一些权力,但它完成工作的能力很大程度上来自于它的工蜂们的尊重与合作。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:50 +msgid "" +"In more technical terms, the event loop contains a collection of jobs to be " +"run. Some jobs are added directly by you, and some indirectly by " +":mod:`!asyncio`. The event loop takes a job from its backlog of work and " +"invokes it (or \"gives it control\"), similar to calling a function, and " +"then that job runs. Once it pauses or completes, it returns control to the " +"event loop. The event loop will then select another job from its pool and " +"invoke it. You can *roughly* think of the collection of jobs as a queue: " +"jobs are added and then processed one at a time, generally (but not always) " +"in order. This process repeats indefinitely, with the event loop cycling " +"endlessly onwards. If there are no more jobs pending execution, the event " +"loop is smart enough to rest and avoid needlessly wasting CPU cycles, and " +"will come back when there's more work to be done." +msgstr "" +"用更专业的术语来说,事件循环包含一组待运行的作业。有些作业是由你直接添加的,有些则是由 :mod:`!asyncio` 间接添加的。 " +"事件循环会从其待处理事项中取出一个作业并唤起它(或称“给予其控制权”),类似于调用一个函数,然后该作业就会运行。 " +"一旦它暂停或完成,它会将控制权返回给事件循环。然后事件循环会从作业池中选择另一个作业并唤起它。你可以 *粗略地* " +"将这组作业视为一个队列:作业被添加然后被逐个处理,通常(但不总是)按顺序进行。此过程将无限地重复,事件循环也不停地循环下去。 " +"如果没有待执行的作业,事件循环会足够智能地转入休息状态以避免浪费 CPU 周期,并在有更多工作需完成时恢复运行。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:64 +msgid "" +"Effective execution relies on jobs sharing well and cooperating; a greedy " +"job could hog control and leave the other jobs to starve, rendering the " +"overall event loop approach rather useless." +msgstr "有效的执行依赖于作业的良好共享和合作;一个贪婪的作业可能会霸占控制权,让其他作业陷入饥饿,从而使整个事件循环机制变得毫无用处。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:70 +msgid "" +"import asyncio\n" +"\n" +"# This creates an event loop and indefinitely cycles through\n" +"# its collection of jobs.\n" +"event_loop = asyncio.new_event_loop()\n" +"event_loop.run_forever()" +msgstr "" +"import asyncio\n" +"\n" +"# 这会创建一个事件循环并无限循环地执行其作业集合。\n" +"event_loop = asyncio.new_event_loop()\n" +"event_loop.run_forever()" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:79 +msgid "Asynchronous functions and coroutines" +msgstr "异步函数和协程" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:81 +msgid "This is a basic, boring Python function::" +msgstr "这是一个基本的、无趣的 Python 函数::" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:83 +msgid "" +"def hello_printer():\n" +" print(\n" +" \"Hi, I am a lowly, simple printer, though I have all I \"\n" +" \"need in life -- \\nfresh paper and my dearly beloved octopus \"\n" +" \"partner in crime.\"\n" +" )" +msgstr "" +"def hello_printer():\n" +" print(\n" +" \"Hi, I am a lowly, simple printer, though I have all I \"\n" +" \"need in life -- \\nfresh paper and my dearly beloved octopus \"\n" +" \"partner in crime.\"\n" +" )" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:90 +msgid "Calling a regular function invokes its logic or body::" +msgstr "调用一个普通函数会执行它的逻辑或函数体::" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:92 +msgid "" +">>> hello_printer()\n" +"Hi, I am a lowly, simple printer, though I have all I need in life --\n" +"fresh paper and my dearly beloved octopus partner in crime." +msgstr "" +">>> hello_printer()\n" +"Hi, I am a lowly, simple printer, though I have all I need in life --\n" +"fresh paper and my dearly beloved octopus partner in crime." + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:96 +msgid "" +"The :ref:`async def `, as opposed to just a plain ``def``, makes " +"this an asynchronous function (or \"coroutine function\"). Calling it " +"creates and returns a :ref:`coroutine ` object." +msgstr "" +"与普通的 ``def`` 不同,:ref:`async def ` 使它成为一个异步函数(或“协程函数”)。调用它会创建并返回一个" +" :ref:`协程 ` 对象。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:102 +msgid "" +"async def loudmouth_penguin(magic_number: int):\n" +" print(\n" +" \"I am a super special talking penguin. Far cooler than that printer. \"\n" +" f\"By the way, my lucky number is: {magic_number}.\"\n" +" )" +msgstr "" +"async def loudmouth_penguin(magic_number: int):\n" +" print(\n" +" \"I am a super special talking penguin. Far cooler than that printer. \"\n" +" f\"By the way, my lucky number is: {magic_number}.\"\n" +" )" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:108 +msgid "" +"Calling the async function, ``loudmouth_penguin``, does not execute the " +"print statement; instead, it creates a coroutine object::" +msgstr "调用异步函数 ``loudmouth_penguin`` 不会执行打印语句;相反,它会创建一个协程对象::" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:111 +msgid "" +">>> loudmouth_penguin(magic_number=3)\n" +"" +msgstr "" +">>> loudmouth_penguin(magic_number=3)\n" +"" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:114 +msgid "" +"The terms \"coroutine function\" and \"coroutine object\" are often " +"conflated as coroutine. That can be confusing! In this article, coroutine " +"specifically refers to a coroutine object, or more precisely, an instance of" +" :class:`types.CoroutineType` (native coroutine). Note that coroutines can " +"also exist as instances of :class:`collections.abc.Coroutine` -- a " +"distinction that matters for type checking." +msgstr "" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:123 +msgid "" +"A coroutine represents the function's body or logic. A coroutine has to be " +"explicitly started; again, merely creating the coroutine does not start it. " +"Notably, the coroutine can be paused and resumed at various points within " +"the function's body. That pausing and resuming ability is what allows for " +"asynchronous behavior!" +msgstr "" +"协程代表函数体或逻辑。协程必须显式启动;再次强调,仅仅创建协程并不能启动它。值得注意的是,协程可以在函数体的不同位置暂停和恢复。这种暂停和恢复能力使得异步行为成为可能!" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:130 +msgid "" +"Coroutines and coroutine functions were built by leveraging the " +"functionality of :term:`generators ` and " +":term:`generator functions `. Recall, a generator function is a " +"function that :keyword:`yield`\\s, like this one::" +msgstr "" +"协程和协程函数是利用 :term:`生成器 ` 和 :term:`生成器函数 ` " +"构建的。回想一下,生成器函数是一个会 :keyword:`yield` 的函数,就像这样::" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:136 +msgid "" +"def get_random_number():\n" +" # This would be a bad random number generator!\n" +" print(\"Hi\")\n" +" yield 1\n" +" print(\"Hello\")\n" +" yield 7\n" +" print(\"Howdy\")\n" +" yield 4\n" +" ..." +msgstr "" +"def get_random_number():\n" +" # 这是一个糟糕的随机数生成器!\n" +" print(\"Hi\")\n" +" yield 1\n" +" print(\"Hello\")\n" +" yield 7\n" +" print(\"Howdy\")\n" +" yield 4\n" +" ..." + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:146 +msgid "" +"Similar to a coroutine function, calling a generator function does not run " +"it. Instead, it creates a generator object::" +msgstr "与协程函数类似,调用生成器函数并不会运行该函数,而是创建一个生成器对象::" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:149 +msgid "" +">>> get_random_number()\n" +"" +msgstr "" +">>> get_random_number()\n" +"" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:152 +msgid "" +"You can proceed to the next ``yield`` of a generator by using the built-in " +"function :func:`next`. In other words, the generator runs, then pauses. For " +"example::" +msgstr "你可以通过内置函数 :func:`next` 执行生成器到下一个 ``yield``。换句话说,生成器运行,然后暂停。例如::" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:157 +msgid "" +">>> generator = get_random_number()\n" +">>> next(generator)\n" +"Hi\n" +"1\n" +">>> next(generator)\n" +"Hello\n" +"7" +msgstr "" +">>> generator = get_random_number()\n" +">>> next(generator)\n" +"Hi\n" +"1\n" +">>> next(generator)\n" +"Hello\n" +"7" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:167 +msgid "Tasks" +msgstr "任务" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:169 +msgid "" +"Roughly speaking, :ref:`tasks ` are coroutines (not " +"coroutine functions) tied to an event loop. A task also maintains a list of " +"callback functions whose importance will become clear in a moment when we " +"discuss :keyword:`await`. The recommended way to create tasks is via " +":func:`asyncio.create_task`." +msgstr "" +"粗略地说,:ref:`任务 ` " +"是绑定到事件循环的协程(而非协程函数)。任务还维护一个回调函数列表,这些回调函数的重要性在稍后讨论 :keyword:`await` " +"时会更加清晰。推荐使用 :func:`asyncio.create_task` 创建任务。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:175 +msgid "" +"Creating a task automatically schedules it for execution (by adding a " +"callback to run it in the event loop's to-do list, that is, collection of " +"jobs)." +msgstr "创建任务会自动安排它的执行(通过在事件循环的待办事项列表(即作业集合)中添加回调函数来运行它)。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:178 +msgid "" +":mod:`!asyncio` automatically associates tasks with the event loop for you. " +"This automatic association was purposely designed into :mod:`!asyncio` for " +"the sake of simplicity. Without it, you'd have to keep track of the event " +"loop object and pass it to any coroutine function that wants to create " +"tasks, adding redundant clutter to your code." +msgstr "" +":mod:`!asyncio` 会为你自动将任务与事件循环进行关联。这种自动关联是出于简便的考虑有意设计在 :mod:`!asyncio` 中的。 " +"如果不是这样,你将需要手动将事件循环传给任何想要创建任务的协程函数,给你的代码增加大量冗余内容。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:187 +msgid "" +"coroutine = loudmouth_penguin(magic_number=5)\n" +"# This creates a Task object and schedules its execution via the event loop.\n" +"task = asyncio.create_task(coroutine)" +msgstr "" +"coroutine = loudmouth_penguin(magic_number=5)\n" +"# 这将创建一个 Task 对象并通过事件循环安排其执行。\n" +"task = asyncio.create_task(coroutine)" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:191 +msgid "" +"Earlier, we manually created the event loop and set it to run forever. In " +"practice, it's recommended to use (and common to see) :func:`asyncio.run`, " +"which takes care of managing the event loop and ensuring the provided " +"coroutine finishes before advancing. For example, many async programs follow" +" this setup::" +msgstr "" +"之前,我们手动创建了事件循环并将其设置为永久运行。实际上,推荐(且常见)的做法是使用 " +":func:`asyncio.run`,它负责管理事件循环并确保提供的协程在继续执行之前结束。例如,许多异步程序都遵循以下设置::" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:197 +msgid "" +"import asyncio\n" +"\n" +"async def main():\n" +" # Perform all sorts of wacky, wild asynchronous things...\n" +" ...\n" +"\n" +"if __name__ == \"__main__\":\n" +" asyncio.run(main())\n" +" # The program will not reach the following print statement until the\n" +" # coroutine main() finishes.\n" +" print(\"coroutine main() is done!\")" +msgstr "" +"import asyncio\n" +"\n" +"async def main():\n" +" # 执行各种稀奇古怪、天马行空的异步操作……\n" +" ...\n" +"\n" +"if __name__ == \"__main__\":\n" +" asyncio.run(main())\n" +" # 直到协程 main() 结束,程序才会到达下面的打印语句。\n" +" print(\"coroutine main() is done!\")" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:209 +msgid "" +"It's important to be aware that the task itself is not added to the event " +"loop, only a callback to the task is. This matters if the task object you " +"created is garbage collected before it's called by the event loop. For " +"example, consider this program:" +msgstr "" +"需要注意的是,任务本身不会被添加到事件循环中,只有任务的回调函数才会被添加到事件循环中。如果你创建的任务对象在被事件循环调用之前就被垃圾回收了,这就会产生问题。例如,考虑这个程序:" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:215 +msgid "" +"async def hello():\n" +" print(\"hello!\")\n" +"\n" +"async def main():\n" +" asyncio.create_task(hello())\n" +" # Other asynchronous instructions which run for a while\n" +" # and cede control to the event loop...\n" +" ...\n" +"\n" +"asyncio.run(main())" +msgstr "" +"async def hello():\n" +" print(\"hello!\")\n" +"\n" +"async def main():\n" +" asyncio.create_task(hello())\n" +" # 其他异步指令运行一段时间并将控制权交还给事件循环......\n" +" ...\n" +"\n" +"asyncio.run(main())" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:229 +msgid "" +"Because there's no reference to the task object created on line 5, it " +"*might* be garbage collected before the event loop invokes it. Later " +"instructions in the coroutine ``main()`` hand control back to the event loop" +" so it can invoke other jobs. When the event loop eventually tries to run " +"the task, it might fail and discover the task object does not exist! This " +"can also happen even if a coroutine keeps a reference to a task but " +"completes before that task finishes. When the coroutine exits, local " +"variables go out of scope and may be subject to garbage collection. In " +"practice, ``asyncio`` and Python's garbage collector work pretty hard to " +"ensure this sort of thing doesn't happen. But that's no reason to be " +"reckless!" +msgstr "" +"由于没有对第 5 行创建的任务对象的引用,它 *可能* 在事件循环调用它之前就被垃圾回收了。协程 ``main()`` " +"中的后续指令将控制权交还给事件循环,以便它可以调用其他作业。当事件循环最终尝试运行该任务时,它可能会失败并发现任务对象不存在!即使协程持有对某个任务的引用,但如果协程在该任务结束之前就完成了,也可能发生这种情况。当协程退出时,局部变量超出范围,可能被垃圾回收。实际上,``asyncio``" +" 和 Python 的垃圾回收器会非常努力地确保此类事情不会发生。但这并不是鲁莽行事的理由!" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:245 +msgid "await" +msgstr "await" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:247 +msgid "" +":keyword:`await` is a Python keyword that's commonly used in one of two " +"different ways::" +msgstr ":keyword:`await` 是一个 Python 关键字,通常以两种不同的方式使用::" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:250 +msgid "" +"await task\n" +"await coroutine" +msgstr "" +"await task\n" +"await coroutine" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:253 +msgid "" +"In a crucial way, the behavior of ``await`` depends on the type of object " +"being awaited." +msgstr "从关键方面来说,``await`` 的行为取决于所等待对象的类型。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:256 +msgid "" +"Awaiting a task will cede control from the current task or coroutine to the " +"event loop. In the process of relinquishing control, a few important things " +"happen. We'll use the following code example to illustrate::" +msgstr "等待任务会将控制权从当前任务或协程交还给事件循环。在交还控制权的过程中,会发生一些重要的事情。我们将使用以下代码示例来说明::" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:261 +msgid "" +"async def plant_a_tree():\n" +" dig_the_hole_task = asyncio.create_task(dig_the_hole())\n" +" await dig_the_hole_task\n" +"\n" +" # Other instructions associated with planting a tree.\n" +" ..." +msgstr "" +"async def plant_a_tree():\n" +" dig_the_hole_task = asyncio.create_task(dig_the_hole())\n" +" await dig_the_hole_task\n" +"\n" +" # 与植树相关的其他指令。\n" +" ..." + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:268 +msgid "" +"In this example, imagine the event loop has passed control to the start of " +"the coroutine ``plant_a_tree()``. As seen above, the coroutine creates a " +"task and then awaits it. The ``await dig_the_hole_task`` instruction adds a " +"callback (which will resume ``plant_a_tree()``) to the ``dig_the_hole_task``" +" object's list of callbacks. And then, the instruction cedes control to the " +"event loop. Some time later, the event loop will pass control to " +"``dig_the_hole_task`` and the task will finish whatever it needs to do. Once" +" the task finishes, it will add its various callbacks to the event loop, in " +"this case, a call to resume ``plant_a_tree()``." +msgstr "" +"在这个例子中,假设事件循环已经将控制权交给了协程 ``plant_a_tree()`` 的开始部分。如上所示,协程创建了一个任务,然后对其执行了 " +"await。``await dig_the_hole_task`` 这条指令会将一个回调函数(用于恢复 ``plant_a_tree()`` " +"的执行)添加到 ``dig_the_hole_task`` " +"对象的回调函数列表中。随后,这条指令将控制权交还给事件循环。过一段时间后,事件循环会将控制权传递给 " +"``dig_the_hole_task``,该任务会完成它需要做的工作。一旦任务结束,它会将它的各种回调函数添加到事件循环中,在这里是恢复 " +"``plant_a_tree()`` 的执行。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:279 +msgid "" +"Generally speaking, when the awaited task finishes (``dig_the_hole_task``), " +"the original task or coroutine (``plant_a_tree()``) is added back to the " +"event loop's to-do list to be resumed." +msgstr "" +"一般来说,当等待的任务完成时 (``dig_the_hole_task``),原先的任务或协程 (``plant_a_tree()``) " +"将被添加回事件循环的待办列表以便恢复运行。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:283 +msgid "" +"This is a basic, yet reliable mental model. In practice, the control " +"handoffs are slightly more complex, but not by much. In part 2, we'll walk " +"through the details that make this possible." +msgstr "这是一个基础但可靠的思维模型。实际操作中,控制权交接会稍微复杂一些,但不会复杂太多。在第 2 部分中,我们将逐步讲解实现这一目标的细节。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:287 +msgid "" +"**Unlike tasks, awaiting a coroutine does not hand control back to the event" +" loop!** Wrapping a coroutine in a task first, then awaiting that would cede" +" control. The behavior of ``await coroutine`` is effectively the same as " +"invoking a regular, synchronous Python function. Consider this program::" +msgstr "" +"**与任务不同,等待协程并不会将控制权交还给事件循环!** 先将协程包装到任务中,然后再等待,会导致控制权交还。``await coroutine`` " +"的行为实际上与调用常规的同步 Python 函数相同。考虑以下程序::" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:295 +msgid "" +"import asyncio\n" +"\n" +"async def coro_a():\n" +" print(\"I am coro_a(). Hi!\")\n" +"\n" +"async def coro_b():\n" +" print(\"I am coro_b(). I sure hope no one hogs the event loop...\")\n" +"\n" +"async def main():\n" +" task_b = asyncio.create_task(coro_b())\n" +" num_repeats = 3\n" +" for _ in range(num_repeats):\n" +" await coro_a()\n" +" await task_b\n" +"\n" +"asyncio.run(main())" +msgstr "" +"import asyncio\n" +"\n" +"async def coro_a():\n" +" print(\"I am coro_a(). Hi!\")\n" +"\n" +"async def coro_b():\n" +" print(\"I am coro_b(). I sure hope no one hogs the event loop...\")\n" +"\n" +"async def main():\n" +" task_b = asyncio.create_task(coro_b())\n" +" num_repeats = 3\n" +" for _ in range(num_repeats):\n" +" await coro_a()\n" +" await task_b\n" +"\n" +"asyncio.run(main())" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:312 +msgid "" +"The first statement in the coroutine ``main()`` creates ``task_b`` and " +"schedules it for execution via the event loop. Then, ``coro_a()`` is " +"repeatedly awaited. Control never cedes to the event loop, which is why we " +"see the output of all three ``coro_a()`` invocations before ``coro_b()``'s " +"output:" +msgstr "" +"协程 ``main()`` 中的第一条语句创建了 ``task_b`` 并调度它通过事件循环运行。然后,将重复地等待 ``coro_a()``。 " +"控制权从未被交还给事件循环,这就是为什么在 ``coro_b()`` 的输出之前我们会看到所有三次唤起 ``coro_a()`` 的输出:" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:318 +msgid "" +"I am coro_a(). Hi!\n" +"I am coro_a(). Hi!\n" +"I am coro_a(). Hi!\n" +"I am coro_b(). I sure hope no one hogs the event loop..." +msgstr "" +"I am coro_a(). Hi!\n" +"I am coro_a(). Hi!\n" +"I am coro_a(). Hi!\n" +"I am coro_b(). I sure hope no one hogs the event loop..." + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:325 +msgid "" +"If we change ``await coro_a()`` to ``await asyncio.create_task(coro_a())``, " +"the behavior changes. The coroutine ``main()`` cedes control to the event " +"loop with that statement. The event loop then proceeds through its backlog " +"of work, calling ``task_b`` and then the task which wraps ``coro_a()`` " +"before resuming the coroutine ``main()``." +msgstr "" +"如果我们将 ``await coro_a()`` 改为 ``await " +"asyncio.create_task(coro_a())``,行为就会发生变化。协程 ``main()`` " +"会通过该语句将控制权交还给事件循环。然后,事件循环会继续处理其积压的工作,先调用 ``task_b``,然后调用包装 ``coro_a()`` " +"的任务,最后恢复协程 ``main()``。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:332 +msgid "" +"I am coro_b(). I sure hope no one hogs the event loop...\n" +"I am coro_a(). Hi!\n" +"I am coro_a(). Hi!\n" +"I am coro_a(). Hi!" +msgstr "" +"I am coro_b(). I sure hope no one hogs the event loop...\n" +"I am coro_a(). Hi!\n" +"I am coro_a(). Hi!\n" +"I am coro_a(). Hi!" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:339 +msgid "" +"This behavior of ``await coroutine`` can trip a lot of people up! That " +"example highlights how using only ``await coroutine`` could unintentionally " +"hog control from other tasks and effectively stall the event loop. " +":func:`asyncio.run` can help you detect such occurrences via the " +"``debug=True`` flag, which enables :ref:`debug mode `. " +"Among other things, it will log any coroutines that monopolize execution for" +" 100ms or longer." +msgstr "" +"这种 ``await coroutine`` 的行为可能会困扰很多人!这个例子强调了仅使用 ``await coroutine`` " +"可能会无意中霸占其他任务的控制权并在实际上阻滞事件循环。 :func:`asyncio.run` 可以通过 ``debug=True`` " +"旗标来检测这种情况,它将会启用 :ref:`调试模式 `。此外,它还会记录任何独占执行时间 100 " +"毫秒以上的协程。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:349 +msgid "" +"The design intentionally trades off some conceptual clarity around usage of " +"``await`` for improved performance. Each time a task is awaited, control " +"needs to be passed all the way up the call stack to the event loop. That " +"might sound minor, but in a large program with many ``await`` statements and" +" a deep call stack, that overhead can add up to a meaningful performance " +"drag." +msgstr "" +"该设计有意牺牲了 ``await`` 用法的某些概念明晰度以提升性能。每当有任务被等待时,控制权都需要沿着调用栈一路向上传递到事件循环。 " +"这听起来可能微不足道,但在一个具有大量 ``await`` 语句和深度调用栈的大型程序中,这种开销可能会累积到明显拖累性能。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:358 +msgid "A conceptual overview part 2: the nuts and bolts" +msgstr "概念概述第 2 部分:核心细节与运作机制" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:360 +msgid "" +"Part 2 goes into detail on the mechanisms :mod:`!asyncio` uses to manage " +"control flow. This is where the magic happens. You'll come away from this " +"section knowing what ``await`` does behind the scenes and how to make your " +"own asynchronous operators." +msgstr "" +"第 2 部分将详细介绍 :mod:`!asyncio` 用于管理控制流的机制。这正是魔法发生的地方。读完本节后,您将了解 ``await`` " +"在幕后做了什么,以及如何创建您自己的异步运算符。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:368 +msgid "The inner workings of coroutines" +msgstr "协程的内部工作原理" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:370 +msgid ":mod:`!asyncio` leverages four components to pass around control." +msgstr ":mod:`!asyncio` 利用四个组件来传递控制权。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:372 +msgid "" +":meth:`coroutine.send(arg) ` is the method used to start or " +"resume a coroutine. If the coroutine was paused and is now being resumed, " +"the argument ``arg`` will be sent in as the return value of the ``yield`` " +"statement which originally paused it. If the coroutine is being used for the" +" first time (as opposed to being resumed), ``arg`` must be ``None``." +msgstr "" +":meth:`coroutine.send(arg) ` 是用于启动或恢复协程的方法。 " +"如果协程已暂停并正在被恢复,则参数 ``arg`` 将作为原先暂停它的 ``yield`` 语句的返回值被发送。 " +"如果协程是首次被使用(而不是被恢复),则 ``arg`` 必须为 ``None``。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:380 +msgid "" +"class Rock:\n" +" def __await__(self):\n" +" value_sent_in = yield 7\n" +" print(f\"Rock.__await__ resuming with value: {value_sent_in}.\")\n" +" return value_sent_in\n" +"\n" +"async def main():\n" +" print(\"Beginning coroutine main().\")\n" +" rock = Rock()\n" +" print(\"Awaiting rock...\")\n" +" value_from_rock = await rock\n" +" print(f\"Coroutine received value: {value_from_rock} from rock.\")\n" +" return 23\n" +"\n" +"coroutine = main()\n" +"intermediate_result = coroutine.send(None)\n" +"print(f\"Coroutine paused and returned intermediate value: {intermediate_result}.\")\n" +"\n" +"print(f\"Resuming coroutine and sending in value: 42.\")\n" +"try:\n" +" coroutine.send(42)\n" +"except StopIteration as e:\n" +" returned_value = e.value\n" +"print(f\"Coroutine main() finished and provided value: {returned_value}.\")" +msgstr "" +"class Rock:\n" +" def __await__(self):\n" +" value_sent_in = yield 7\n" +" print(f\"Rock.__await__ resuming with value: {value_sent_in}.\")\n" +" return value_sent_in\n" +"\n" +"async def main():\n" +" print(\"Beginning coroutine main().\")\n" +" rock = Rock()\n" +" print(\"Awaiting rock...\")\n" +" value_from_rock = await rock\n" +" print(f\"Coroutine received value: {value_from_rock} from rock.\")\n" +" return 23\n" +"\n" +"coroutine = main()\n" +"intermediate_result = coroutine.send(None)\n" +"print(f\"Coroutine paused and returned intermediate value: {intermediate_result}.\")\n" +"\n" +"print(f\"Resuming coroutine and sending in value: 42.\")\n" +"try:\n" +" coroutine.send(42)\n" +"except StopIteration as e:\n" +" returned_value = e.value\n" +"print(f\"Coroutine main() finished and provided value: {returned_value}.\")" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:408 +msgid "" +":ref:`yield `, as usual, pauses execution and returns control to " +"the caller. In the example above, the ``yield``, on line 3, is called by " +"``... = await rock`` on line 11. More broadly speaking, ``await`` calls the " +":meth:`~object.__await__` method of the given object. ``await`` also does " +"one more very special thing: it propagates (or \"passes along\") any " +"``yield``\\ s it receives up the call chain. In this case, that's back to " +"``... = coroutine.send(None)`` on line 16." +msgstr "" +":ref:`yield ` 像往常一样暂停执行并将控制权返回给调用者。在上面的例子中,第 3 行的 ``yield`` 被第 11" +" 行的 ``... = await rock`` 调用。更宽泛地说,``await`` 会调用给定对象的 " +":meth:`~object.__await__` 方法。``await`` 还会做一件非常特别的事情:它会将接收到的任何 ``yield`` " +"沿着调用链向上传播(或称“传递”)。在本例中,这将回到第 16 行的 ``... = coroutine.send(None)``。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:418 +msgid "" +"The coroutine is resumed via the ``coroutine.send(42)`` call on line 21. The" +" coroutine picks back up from where it ``yield``\\ ed (or paused) on line 3 " +"and executes the remaining statements in its body. When a coroutine " +"finishes, it raises a :exc:`StopIteration` exception with the return value " +"attached in the :attr:`~StopIteration.value` attribute." +msgstr "" +"协程通过第 21 行的 ``coroutine.send(42)`` 调用恢复。协程从第 3 行 ``yield`` (或暂停) " +"的位置继续执行,并执行其主体中的剩余语句。协程完成后,它会引发一个 :exc:`StopIteration` 异常,并将返回值附加在 " +":attr:`~StopIteration.value` 属性中。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:424 +msgid "That snippet produces this output:" +msgstr "该代码片段产生以下输出:" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:426 +msgid "" +"Beginning coroutine main().\n" +"Awaiting rock...\n" +"Coroutine paused and returned intermediate value: 7.\n" +"Resuming coroutine and sending in value: 42.\n" +"Rock.__await__ resuming with value: 42.\n" +"Coroutine received value: 42 from rock.\n" +"Coroutine main() finished and provided value: 23." +msgstr "" +"Beginning coroutine main().\n" +"Awaiting rock...\n" +"Coroutine paused and returned intermediate value: 7.\n" +"Resuming coroutine and sending in value: 42.\n" +"Rock.__await__ resuming with value: 42.\n" +"Coroutine received value: 42 from rock.\n" +"Coroutine main() finished and provided value: 23." + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:436 +msgid "" +"It's worth pausing for a moment here and making sure you followed the " +"various ways that control flow and values were passed. A lot of important " +"ideas were covered and it's worth ensuring your understanding is firm." +msgstr "这里值得暂停一下,确保您已经理解了控制流和值传递的各种方式。我们涵盖了很多重要的概念,确保您理解得足够牢固。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:440 +msgid "" +"The only way to yield (or effectively cede control) from a coroutine is to " +"``await`` an object that ``yield``\\ s in its ``__await__`` method. That " +"might sound odd to you. You might be thinking:" +msgstr "" +"从协程中“yield”(或有效地放弃控制权)的唯一方法是 ``await`` 一个在其 ``__await__`` 方法中 ``yield`` " +"的对象。这听起来可能有点奇怪。你可能会想:" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:444 +msgid "" +"1. What about a ``yield`` directly within the coroutine function? The " +"coroutine function becomes an :ref:`async generator function `, a different beast entirely." +msgstr "" +"1. 那么在协程函数中直接使用 ``yield`` 会怎么样呢?协程函数会变成一个 :ref:`异步生成器函数 `,一个完全不同的东西。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:449 +msgid "" +"2. What about a :ref:`yield from ` within the coroutine function " +"to a (plain) generator? That causes the error: ``SyntaxError: yield from not" +" allowed in a coroutine.`` This was intentionally designed for the sake of " +"simplicity -- mandating only one way of using coroutines. Initially " +"``yield`` was barred as well, but was re-accepted to allow for async " +"generators. Despite that, ``yield from`` and ``await`` effectively do the " +"same thing." +msgstr "" +"2. 如果在协程函数中对(普通)生成器使用 :ref:`yield from ` 会怎么样?这会导致错误: " +"``SyntaxError: yield from not allowed in a coroutine.``。 这是为简单起见故意设计的 —— " +"强制规定只能以一种方式使用协程。 最初连 ``yield`` 也无法使用,但后来为了支持异步生成器而被重新采纳。 尽管如此,``yield from``" +" 和 ``await`` 实际上做的事情是一样的。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:460 +msgid "Futures" +msgstr "Future" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:462 +msgid "" +"A :ref:`future ` is an object meant to represent a " +"computation's status and result. The term is a nod to the idea of something " +"still to come or not yet happened, and the object is a way to keep an eye on" +" that something." +msgstr "" +":ref:`Future ` 是一个用来表示计算状态和结果的对象。该术语指的是尚未发生的事情,而 Future " +"对象则是一种用来关注这些事情的方式。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:467 +msgid "" +"A future has a few important attributes. One is its state, which can be " +"either \"pending\", \"cancelled\", or \"done\". Another is its result, which" +" is set when the state transitions to done. Unlike a coroutine, a future " +"does not represent the actual computation to be done; instead, it represents" +" the status and result of that computation, kind of like a status light " +"(red, yellow, or green) or indicator." +msgstr "" +"Future 对象有几个重要的属性。其一是它的状态,可以是“待处理”、“已取消”或“已完成”。其二是它的结果,当状态转换为已完成时它就会被设定。 " +"与协程不同,Future 并不代表要执行的实际计算;相反,它代表该计算的状态和结果,有点像一个状态灯(红色、黄色或绿色)或指示器。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:474 +msgid "" +":class:`asyncio.Task` subclasses :class:`asyncio.Future` in order to gain " +"these various capabilities. The prior section said tasks store a list of " +"callbacks, which wasn't entirely accurate. It's actually the ``Future`` " +"class that implements this logic, which ``Task`` inherits." +msgstr "" +"为了获得这些功能,:class:`asyncio.Task` 继承了 :class:`asyncio.Future` " +"类。上一节提到任务存储了一个回调函数列表,这并不完全准确。实际上,实现这些逻辑的是 ``Future`` 类,而 ``Task`` 继承了它。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:481 +msgid "" +"Futures may also be used directly (not via tasks). Tasks mark themselves as " +"done when their coroutine is complete. Futures are much more versatile and " +"will be marked as done when you say so. In this way, they're the flexible " +"interface for you to make your own conditions for waiting and resuming." +msgstr "" +"Future 也可以被直接使用(无需通过任务)。任务会在协程完成后将自身标记为已完成。而 Future " +"的功能更加多样,由你来指定它何时标记为已完成。因此,Future 是一个灵活的接口,你可以自定义等待和恢复的条件。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:489 +msgid "A homemade asyncio.sleep" +msgstr "自制 asyncio.sleep" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:491 +msgid "" +"We'll go through an example of how you could leverage a future to create " +"your own variant of asynchronous sleep (``async_sleep``) which mimics " +":func:`asyncio.sleep`." +msgstr "" +"我们将通过一个例子来说明如何利用 Future 来创建自己的异步睡眠变体 (``async_sleep``),模仿了 " +":func:`asyncio.sleep`。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:495 +msgid "" +"This snippet registers a few tasks with the event loop and then awaits the " +"task created by ``asyncio.create_task``, which wraps the ``async_sleep(3)`` " +"coroutine. We want that task to finish only after three seconds have " +"elapsed, but without preventing other tasks from running." +msgstr "" +"这个代码段为事件循环注册了一些任务,然后等待由 ``asyncio.create_task`` 创建的任务,该任务包装了 " +"``async_sleep(3)`` 协程。我们希望该任务在三秒之后才结束,但不会阻止其他任务的运行。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:502 +msgid "" +"async def other_work():\n" +" print(\"I like work. Work work.\")\n" +"\n" +"async def main():\n" +" # Add a few other tasks to the event loop, so there's something\n" +" # to do while asynchronously sleeping.\n" +" work_tasks = [\n" +" asyncio.create_task(other_work()),\n" +" asyncio.create_task(other_work()),\n" +" asyncio.create_task(other_work())\n" +" ]\n" +" print(\n" +" \"Beginning asynchronous sleep at time: \"\n" +" f\"{datetime.datetime.now().strftime(\"%H:%M:%S\")}.\"\n" +" )\n" +" await asyncio.create_task(async_sleep(3))\n" +" print(\n" +" \"Done asynchronous sleep at time: \"\n" +" f\"{datetime.datetime.now().strftime(\"%H:%M:%S\")}.\"\n" +" )\n" +" # asyncio.gather effectively awaits each task in the collection.\n" +" await asyncio.gather(*work_tasks)" +msgstr "" +"async def other_work():\n" +" print(\"I like work. Work work.\")\n" +"\n" +"async def main():\n" +" # 向事件循环添加一些其他任务,这样在异步休眠时就可以做一些事情。\n" +" work_tasks = [\n" +" asyncio.create_task(other_work()),\n" +" asyncio.create_task(other_work()),\n" +" asyncio.create_task(other_work())\n" +" ]\n" +" print(\n" +" \"Beginning asynchronous sleep at time: \"\n" +" f\"{datetime.datetime.now().strftime(\"%H:%M:%S\")}.\"\n" +" )\n" +" await asyncio.create_task(async_sleep(3))\n" +" print(\n" +" \"Done asynchronous sleep at time: \"\n" +" f\"{datetime.datetime.now().strftime(\"%H:%M:%S\")}.\"\n" +" )\n" +" # asyncio.gather 有效地等待集合中的每个任务。\n" +" await asyncio.gather(*work_tasks)" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:526 +msgid "" +"Below, we use a future to enable custom control over when that task will be " +"marked as done. If :meth:`future.set_result() ` " +"(the method responsible for marking that future as done) is never called, " +"then this task will never finish. We've also enlisted the help of another " +"task, which we'll see in a moment, that will monitor how much time has " +"elapsed and, accordingly, call ``future.set_result()``." +msgstr "" +"下面,我们使用 Future 来自定义控制何时将任务标记为已完成。 如果 :meth:`future.set_result() " +"` (负责将该 Future 标记为已完成的方法) 从未被调用,那么该任务将永远不会结束。 " +"我们还借助了另一个任务,稍后将会介绍,它将监视已过去的时间,并相应地调用 ``future.set_result()``。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:537 +msgid "" +"async def async_sleep(seconds: float):\n" +" future = asyncio.Future()\n" +" time_to_wake = time.time() + seconds\n" +" # Add the watcher-task to the event loop.\n" +" watcher_task = asyncio.create_task(_sleep_watcher(future, time_to_wake))\n" +" # Block until the future is marked as done.\n" +" await future" +msgstr "" +"async def async_sleep(seconds: float):\n" +" future = asyncio.Future()\n" +" time_to_wake = time.time() + seconds\n" +" # 将监视任务添加到事件循环。\n" +" watcher_task = asyncio.create_task(_sleep_watcher(future, time_to_wake))\n" +" # 阻塞直到 future 被标记为已完成。\n" +" await future" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:545 +msgid "" +"Below, we use a rather bare ``YieldToEventLoop()`` object to ``yield`` from " +"its ``__await__`` method, ceding control to the event loop. This is " +"effectively the same as calling ``asyncio.sleep(0)``, but this approach " +"offers more clarity, not to mention it's somewhat cheating to use " +"``asyncio.sleep`` when showcasing how to implement it!" +msgstr "" +"下面,我们将使用一个相当简单的 ``YieldToEventLoop()`` 对象从其 ``__await__`` 方法中 " +"``yield``,将控制权交还给事件循环。这实际上与调用 ``asyncio.sleep(0)`` 相同,但这种方式更为明晰,更不用说在展示如何实现 " +"``asyncio.sleep`` 时直接使用它有点作弊!" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:551 +msgid "" +"As usual, the event loop cycles through its tasks, giving them control and " +"receiving control back when they pause or finish. The ``watcher_task``, " +"which runs the coroutine ``_sleep_watcher(...)``, will be invoked once per " +"full cycle of the event loop. On each resumption, it'll check the time and " +"if not enough has elapsed, then it'll pause once again and hand control back" +" to the event loop. Once enough time has elapsed, ``_sleep_watcher(...)`` " +"marks the future as done and completes by exiting its infinite ``while`` " +"loop. Given this helper task is only invoked once per cycle of the event " +"loop, you'd be correct to note that this asynchronous sleep will sleep *at " +"least* three seconds, rather than exactly three seconds. Note this is also " +"true of ``asyncio.sleep``." +msgstr "" +"与往常一样,事件循环会轮番处理其任务,给予它们控制权并在它们暂停或完成时收回控制权。运行 ``_sleep_watcher(...)`` 协程的 " +"``watcher_task`` 将在事件循环的每个完整周期中被唤起一次。 " +"在每次恢复时,它将检查时间,如果经过的时间不够,则会再次暂停并将控制权交还给事件循环。 " +"一旦经过了足够的时间,``_sleep_watcher(...)`` 会将该 Future 标记为已完成并通过退出无限的 ``while`` " +"循环来结束执行。鉴于这个辅助任务在事件循环的每个周期中只会被唤起一次,因此你应该注意到这个异步休眠将 *至少* 休眠三秒,而不是恰好三秒。请注意 " +"``asyncio.sleep`` 也同样如此。" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:567 +msgid "" +"class YieldToEventLoop:\n" +" def __await__(self):\n" +" yield\n" +"\n" +"async def _sleep_watcher(future, time_to_wake):\n" +" while True:\n" +" if time.time() >= time_to_wake:\n" +" # This marks the future as done.\n" +" future.set_result(None)\n" +" break\n" +" else:\n" +" await YieldToEventLoop()" +msgstr "" +"class YieldToEventLoop:\n" +" def __await__(self):\n" +" yield\n" +"\n" +"async def _sleep_watcher(future, time_to_wake):\n" +" while True:\n" +" if time.time() >= time_to_wake:\n" +" # 这标记 future 为已完成。\n" +" future.set_result(None)\n" +" break\n" +" else:\n" +" await YieldToEventLoop()" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:580 +msgid "Here is the full program's output:" +msgstr "以下是程序的完整输出:" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:582 +msgid "" +"$ python custom-async-sleep.py\n" +"Beginning asynchronous sleep at time: 14:52:22.\n" +"I like work. Work work.\n" +"I like work. Work work.\n" +"I like work. Work work.\n" +"Done asynchronous sleep at time: 14:52:25." +msgstr "" +"$ python custom-async-sleep.py\n" +"Beginning asynchronous sleep at time: 14:52:22.\n" +"I like work. Work work.\n" +"I like work. Work work.\n" +"I like work. Work work.\n" +"Done asynchronous sleep at time: 14:52:25." + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:591 +msgid "" +"You might feel this implementation of asynchronous sleep was unnecessarily " +"convoluted. And, well, it was. The example was meant to showcase the " +"versatility of futures with a simple example that could be mimicked for more" +" complex needs. For reference, you could implement it without futures, like " +"so::" +msgstr "" +"你可能会觉得这种异步睡眠的实现过于复杂。确实如此。这个例子旨在通过一个简单的示例来展示 Future " +"的多功能性,以便可以模仿更复杂的需求。作为参考,你可以不使用 Future 来实现它,如下所示::" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:598 +msgid "" +"async def simpler_async_sleep(seconds):\n" +" time_to_wake = time.time() + seconds\n" +" while True:\n" +" if time.time() >= time_to_wake:\n" +" return\n" +" else:\n" +" await YieldToEventLoop()" +msgstr "" +"async def simpler_async_sleep(seconds):\n" +" time_to_wake = time.time() + seconds\n" +" while True:\n" +" if time.time() >= time_to_wake:\n" +" return\n" +" else:\n" +" await YieldToEventLoop()" + +#: ../../howto/a-conceptual-overview-of-asyncio.rst:606 +msgid "" +"But that's all for now. Hopefully you're ready to more confidently dive into" +" some async programming or check out advanced topics in the :mod:`rest of " +"the documentation `." +msgstr "目前就说这些了。希望你已准备好更自信地深入探索异步编程或是查看 :mod:`文档其余部分 ` 中的进阶主题。" diff --git a/howto/annotations.po b/howto/annotations.po new file mode 100644 index 0000000000..b5f0b19488 --- /dev/null +++ b/howto/annotations.po @@ -0,0 +1,479 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../howto/annotations.rst:5 +msgid "Annotations Best Practices" +msgstr "注解最佳实践" + +#: ../../howto/annotations.rst:0 +msgid "author" +msgstr "作者" + +#: ../../howto/annotations.rst:7 +msgid "Larry Hastings" +msgstr "Larry Hastings" + +#: ../../howto/annotations.rst-1 +msgid "Abstract" +msgstr "摘要" + +#: ../../howto/annotations.rst:11 +msgid "" +"This document is designed to encapsulate the best practices for working with" +" annotations dicts. If you write Python code that examines " +"``__annotations__`` on Python objects, we encourage you to follow the " +"guidelines described below." +msgstr "本文档旨在概括与注解字典打交道的最佳实践。查看 Python 对象的 ``__annotations__`` 的代码应遵循下面的准则。" + +#: ../../howto/annotations.rst:16 +msgid "" +"The document is organized into four sections: best practices for accessing " +"the annotations of an object in Python versions 3.10 and newer, best " +"practices for accessing the annotations of an object in Python versions 3.9 " +"and older, other best practices for ``__annotations__`` that apply to any " +"Python version, and quirks of ``__annotations__``." +msgstr "" +"本文档按四部分组织:在 3.10 及更高版本的 Python 中查看对象注解的最佳实践、在 3.9 及更低版本的 Python " +"中查看对象注解的最佳实践、其它一些适于任何版本的 Python 的 ``__annotations__`` " +"的最佳实践、``__annotations__`` 的一些“坑”。" + +#: ../../howto/annotations.rst:26 +msgid "" +"Note that this document is specifically about working with " +"``__annotations__``, not uses *for* annotations. If you're looking for " +"information on how to use \"type hints\" in your code, please see the " +":mod:`typing` module." +msgstr "" +"本文是 ``__annotations__`` 的文档,不是注解的用法。如果在寻找如何使用“类型提示”,请参阅 :mod:`typing` 模块。" + +#: ../../howto/annotations.rst:33 +msgid "Accessing The Annotations Dict Of An Object In Python 3.10 And Newer" +msgstr "在 3.10 及更高版本的 Python 中访问对象的注解字典" + +#: ../../howto/annotations.rst:35 +msgid "" +"Python 3.10 adds a new function to the standard library: " +":func:`inspect.get_annotations`. In Python versions 3.10 through 3.13, " +"calling this function is the best practice for accessing the annotations " +"dict of any object that supports annotations. This function can also \"un-" +"stringize\" stringized annotations for you." +msgstr "" +"Python 3.10 在标准库中加入了一个新函数::func:`inspect.get_annotations`。在 Python 3.10 至 " +"3.13 版中,调用该函数是访问任何支持注解的对象的注解字典的最佳实践。该函数还能为你\"反字符串化\"已被字符串化的注解。" + +#: ../../howto/annotations.rst:42 +msgid "" +"In Python 3.14, there is a new :mod:`annotationlib` module with " +"functionality for working with annotations. This includes a " +":func:`annotationlib.get_annotations` function, which supersedes " +":func:`inspect.get_annotations`." +msgstr "" +"在 Python 3.14 中,有一个新的 :mod:`annotationlib` 模块,具有处理注解的功能。这包括 " +":func:`annotationlib.get_annotations` 函数,它取代了 " +":func:`inspect.get_annotations`。" + +#: ../../howto/annotations.rst:47 +msgid "" +"If for some reason :func:`inspect.get_annotations` isn't viable for your use" +" case, you may access the ``__annotations__`` data member manually. Best " +"practice for this changed in Python 3.10 as well: as of Python 3.10, " +"``o.__annotations__`` is guaranteed to *always* work on Python functions, " +"classes, and modules. If you're certain the object you're examining is one " +"of these three *specific* objects, you may simply use ``o.__annotations__`` " +"to get at the object's annotations dict." +msgstr "" +"不用 :func:`inspect.get_annotations` 也可以手动访问 ``__annotations__`` " +"这一数据成员。该方法的最佳实践在 Python 3.10 中也发生了变化:从 Python 3.10 开始,对于 Python " +"函数、类和模块,``o.__annotations__`` *保证* 会正常工作。只要你确信所检查的对象是这三种之一,你便可以用 " +"``o.__annotations__`` 获取该对象的注解字典。" + +#: ../../howto/annotations.rst:57 +msgid "" +"However, other types of callables--for example, callables created by " +":func:`functools.partial`--may not have an ``__annotations__`` attribute " +"defined. When accessing the ``__annotations__`` of a possibly unknown " +"object, best practice in Python versions 3.10 and newer is to call " +":func:`getattr` with three arguments, for example ``getattr(o, " +"'__annotations__', None)``." +msgstr "" +"不过,其它类型的可调用对象可不一定定义了 ``__annotations__`` 属性,就比如说,:func:`functools.partial` " +"创建的可调用对象。当访问某个未知对象的 ``__annotations__`` 时,3.10 及更高版本的 Python 中的最佳实践是用三个参数去调用" +" :func:`getattr`,像 ``getattr(o, '__annotations__', None)`` 这样。" + +#: ../../howto/annotations.rst:65 +msgid "" +"Before Python 3.10, accessing ``__annotations__`` on a class that defines no" +" annotations but that has a parent class with annotations would return the " +"parent's ``__annotations__``. In Python 3.10 and newer, the child class's " +"annotations will be an empty dict instead." +msgstr "" +"Python 3.10 之前,在一个没定义注解而其父类定义了注解的类上访问 ``__annotations__`` 将返回父类的 " +"``__annotations__``。在 3.10 及更高版本的 Python 中,这样的子类的注解是个空字典。" + +#: ../../howto/annotations.rst:73 +msgid "Accessing The Annotations Dict Of An Object In Python 3.9 And Older" +msgstr "在 3.9 及更低版本的 Python 中访问对象的注解字典" + +#: ../../howto/annotations.rst:75 +msgid "" +"In Python 3.9 and older, accessing the annotations dict of an object is much" +" more complicated than in newer versions. The problem is a design flaw in " +"these older versions of Python, specifically to do with class annotations." +msgstr "在 3.9 及更低版本的 Python 中访问对象的注解字典要比新版复杂。这是低版本 Python 的设计缺陷,特别是类的注解。" + +#: ../../howto/annotations.rst:80 +msgid "" +"Best practice for accessing the annotations dict of other objects--" +"functions, other callables, and modules--is the same as best practice for " +"3.10, assuming you aren't calling :func:`inspect.get_annotations`: you " +"should use three-argument :func:`getattr` to access the object's " +"``__annotations__`` attribute." +msgstr "" +"访问其它对象——函数、其它可调用对象和模块——的注解字典的最佳实践与 3.10 版本相同,如果不用 " +":func:`inspect.get_annotations`,就用三个参数去调用 :func:`getattr` 以访问对象的 " +"``__annotations__`` 属性。" + +#: ../../howto/annotations.rst:87 +msgid "" +"Unfortunately, this isn't best practice for classes. The problem is that, " +"since ``__annotations__`` is optional on classes, and because classes can " +"inherit attributes from their base classes, accessing the " +"``__annotations__`` attribute of a class may inadvertently return the " +"annotations dict of a *base class.* As an example::" +msgstr "" +"不幸的是,对类而言,这并不是最佳实践。问题在于,由于 ``__annotations__`` " +"在某个类上是可有可无的,而类又可以从基类继承属性,所以访问某个类的 ``__annotations__`` 属性可能会无意间返回 *基类* " +"的注解字典。如:" + +#: ../../howto/annotations.rst:94 +msgid "" +"class Base:\n" +" a: int = 3\n" +" b: str = 'abc'\n" +"\n" +"class Derived(Base):\n" +" pass\n" +"\n" +"print(Derived.__annotations__)" +msgstr "" +"class Base:\n" +" a: int = 3\n" +" b: str = 'abc'\n" +"\n" +"class Derived(Base):\n" +" pass\n" +"\n" +"print(Derived.__annotations__)" + +#: ../../howto/annotations.rst:103 +msgid "This will print the annotations dict from ``Base``, not ``Derived``." +msgstr "会打印出 ``Base`` 的注解字典,而非 ``Derived`` 的。" + +#: ../../howto/annotations.rst:106 +msgid "" +"Your code will have to have a separate code path if the object you're " +"examining is a class (``isinstance(o, type)``). In that case, best practice " +"relies on an implementation detail of Python 3.9 and before: if a class has " +"annotations defined, they are stored in the class's :attr:`~type.__dict__` " +"dictionary. Since the class may or may not have annotations defined, best " +"practice is to call the :meth:`~dict.get` method on the class dict." +msgstr "" +"如果你所检查的对象是一个类 (``isinstance(o, type)``) 则你的代码将不得不使用单独的代码路径。在此情况下,最佳实践依赖于 " +"Python 3.9 及之前版本的一个实现细节:如果一个类定义了注解,它们将存储在类的 :attr:`~type.__dict__` 字典中。 " +"由于类可能有也可能没有定义注解,因此最佳实践是在类的 dict 字典上调用 :meth:`~dict.get` 方法。" + +#: ../../howto/annotations.rst:114 +msgid "" +"To put it all together, here is some sample code that safely accesses the " +"``__annotations__`` attribute on an arbitrary object in Python 3.9 and " +"before::" +msgstr "" +"综上所述,下面给出一些示例代码,可以在 Python 3.9 及之前版本安全地访问任意对象的 ``__annotations__`` 属性:" + +#: ../../howto/annotations.rst:118 +msgid "" +"if isinstance(o, type):\n" +" ann = o.__dict__.get('__annotations__', None)\n" +"else:\n" +" ann = getattr(o, '__annotations__', None)" +msgstr "" +"if isinstance(o, type):\n" +" ann = o.__dict__.get('__annotations__', None)\n" +"else:\n" +" ann = getattr(o, '__annotations__', None)" + +#: ../../howto/annotations.rst:123 +msgid "" +"After running this code, ``ann`` should be either a dictionary or ``None``." +" You're encouraged to double-check the type of ``ann`` using " +":func:`isinstance` before further examination." +msgstr "" +"运行之后,``ann`` 应为一个字典对象或 ``None``。建议在继续之前,先用 :func:`isinstance` 再次检查 ``ann`` " +"的类型。" + +#: ../../howto/annotations.rst:128 +msgid "" +"Note that some exotic or malformed type objects may not have a " +":attr:`~type.__dict__` attribute, so for extra safety you may also wish to " +"use :func:`getattr` to access :attr:`!__dict__`." +msgstr "" +"请注意某些特别的或错误的类型对象可能没有 :attr:`~type.__dict__` 属性,因此为确保绝对安全你可能会需要使用 " +":func:`getattr` 来访问 :attr:`!__dict__`。" + +#: ../../howto/annotations.rst:134 +msgid "Manually Un-Stringizing Stringized Annotations" +msgstr "解析字符串形式的注解" + +#: ../../howto/annotations.rst:136 +msgid "" +"In situations where some annotations may be \"stringized\", and you wish to " +"evaluate those strings to produce the Python values they represent, it " +"really is best to call :func:`inspect.get_annotations` to do this work for " +"you." +msgstr "" +"有时注解可能会被\"字符串化\",解析这些字符串可以求得其所代表的 Python 值,最好是调用 " +":func:`inspect.get_annotations` 来完成这项工作。" + +#: ../../howto/annotations.rst:142 +msgid "" +"If you're using Python 3.9 or older, or if for some reason you can't use " +":func:`inspect.get_annotations`, you'll need to duplicate its logic. You're" +" encouraged to examine the implementation of :func:`inspect.get_annotations`" +" in the current Python version and follow a similar approach." +msgstr "" +"如果是 Python 3.9 及之前的版本,或者由于某种原因无法使用 " +":func:`inspect.get_annotations`,那就需要重现其代码逻辑。建议查看一下当前 Python 版本中 " +":func:`inspect.get_annotations` 的实现代码,并遵照实现。" + +#: ../../howto/annotations.rst:148 +msgid "" +"In a nutshell, if you wish to evaluate a stringized annotation on an " +"arbitrary object ``o``:" +msgstr "简而言之,假设要对任一对象 ``o`` 解析其字符串化的注解:" + +#: ../../howto/annotations.rst:151 +msgid "" +"If ``o`` is a module, use ``o.__dict__`` as the ``globals`` when calling " +":func:`eval`." +msgstr "如果 ``o`` 是个模块,在调用 :func:`eval` 时,``o.__dict__`` 可视为 ``globals``。" + +#: ../../howto/annotations.rst:153 +msgid "" +"If ``o`` is a class, use ``sys.modules[o.__module__].__dict__`` as the " +"``globals``, and ``dict(vars(o))`` as the ``locals``, when calling " +":func:`eval`." +msgstr "" +"如果 ``o`` 是一个类,在调用 :func:`eval` 时,``sys.modules[o.__module__].__dict__`` 视作 " +"``globals``,``dict(vars(o))`` 视作 ``locals``。" + +#: ../../howto/annotations.rst:156 +msgid "" +"If ``o`` is a wrapped callable using :func:`functools.update_wrapper`, " +":func:`functools.wraps`, or :func:`functools.partial`, iteratively unwrap it" +" by accessing either ``o.__wrapped__`` or ``o.func`` as appropriate, until " +"you have found the root unwrapped function." +msgstr "" +"如果 ``o`` 是一个用 :func:`functools.update_wrapper`、:func:`functools.wraps` 或 " +":func:`functools.partial` 封装的可调用对象,可酌情访问 ``o.__wrapped__`` 或 ``o.func`` " +"进行反复解包,直到你找到未经封装的根函数。" + +#: ../../howto/annotations.rst:160 +msgid "" +"If ``o`` is a callable (but not a class), use :attr:`o.__globals__ " +"` as the globals when calling :func:`eval`." +msgstr "" +"如果 ``o`` 为可调用对象(但不是类),则在调用 :func:`eval` 时可以使用 :attr:`o.__globals__ " +"` 作为 globals。" + +#: ../../howto/annotations.rst:164 +msgid "" +"However, not all string values used as annotations can be successfully " +"turned into Python values by :func:`eval`. String values could theoretically" +" contain any valid string, and in practice there are valid use cases for " +"type hints that require annotating with string values that specifically " +"*can't* be evaluated. For example:" +msgstr "" +"但并不是所有注解字符串都可以通过 :func:`eval` 成功地转化为 Python " +"值。理论上,注解字符串中可以包含任何合法字符串,确实有一些类型提示的场合,需要用到特殊的 *无法* 被解析的字符串来作注解。比如:" + +#: ../../howto/annotations.rst:171 +msgid "" +":pep:`604` union types using ``|``, before support for this was added to " +"Python 3.10." +msgstr "在 Python 支持 :pep:`604` 的联合类型 ``|`` (Python 3.10) 之前使用它。" + +#: ../../howto/annotations.rst:173 +msgid "" +"Definitions that aren't needed at runtime, only imported when " +":const:`typing.TYPE_CHECKING` is true." +msgstr "运行时用不到的定义,只在 :const:`typing.TYPE_CHECKING` 为 True 时才会导入。" + +#: ../../howto/annotations.rst:176 +msgid "" +"If :func:`eval` attempts to evaluate such values, it will fail and raise an " +"exception. So, when designing a library API that works with annotations, " +"it's recommended to only attempt to evaluate string values when explicitly " +"requested to by the caller." +msgstr "" +"如果 :func:`eval` 试图求值,将会失败并触发异常。因此,当要设计一个可采用注解的库 API,建议只在调用方显式请求的时候才对字符串求值。" + +#: ../../howto/annotations.rst:184 +msgid "Best Practices For ``__annotations__`` In Any Python Version" +msgstr "任何版本 Python 中使用 ``__annotations__`` 的最佳实践" + +#: ../../howto/annotations.rst:186 +msgid "" +"You should avoid assigning to the ``__annotations__`` member of objects " +"directly. Let Python manage setting ``__annotations__``." +msgstr "应避免直接给对象的 ``__annotations__`` 成员赋值。请让 Python 来管理 ``__annotations__``。" + +#: ../../howto/annotations.rst:189 +msgid "" +"If you do assign directly to the ``__annotations__`` member of an object, " +"you should always set it to a ``dict`` object." +msgstr "如果直接给某对象的 ``__annotations__`` 成员赋值,应该确保设成一个 ``dict`` 对象。" + +#: ../../howto/annotations.rst:192 +msgid "" +"You should avoid accessing ``__annotations__`` directly on any object. " +"Instead, use :func:`annotationlib.get_annotations` (Python 3.14+) or " +":func:`inspect.get_annotations` (Python 3.10+)." +msgstr "" +"你应该避免在任何对象上直接访问 ``__annotations__``。相反,使用 " +":func:`annotationlib.get_annotations` (Python 3.14+) 或 " +":func:`inspect.get_annotations` (Python 3.10+)。" + +#: ../../howto/annotations.rst:196 +msgid "" +"If you do directly access the ``__annotations__`` member of an object, you " +"should ensure that it's a dictionary before attempting to examine its " +"contents." +msgstr "如果你直接访问一个对象的 ``__annotations__`` 成员,在尝试检查其内容之前,你应该确保它是一个字典。" + +#: ../../howto/annotations.rst:200 +msgid "You should avoid modifying ``__annotations__`` dicts." +msgstr "应避免修改 ``__annotations__`` 字典。" + +#: ../../howto/annotations.rst:202 +msgid "" +"You should avoid deleting the ``__annotations__`` attribute of an object." +msgstr "应避免删除对象的 ``__annotations__`` 属性。" + +#: ../../howto/annotations.rst:207 +msgid "``__annotations__`` Quirks" +msgstr "``__annotations__`` 的一些“坑”" + +#: ../../howto/annotations.rst:209 +msgid "" +"In all versions of Python 3, function objects lazy-create an annotations " +"dict if no annotations are defined on that object. You can delete the " +"``__annotations__`` attribute using ``del fn.__annotations__``, but if you " +"then access ``fn.__annotations__`` the object will create a new empty dict " +"that it will store and return as its annotations. Deleting the annotations " +"on a function before it has lazily created its annotations dict will throw " +"an ``AttributeError``; using ``del fn.__annotations__`` twice in a row is " +"guaranteed to always throw an ``AttributeError``." +msgstr "" +"在 Python 3 的所有版本中,如果对象没有定义注解,函数对象就会延迟创建一个注解字典对象。用 ``del fn.__annotations__``" +" 可删除 ``__annotations__`` 属性,但如果后续再访问 " +"``fn.__annotations__``,该对象将新建一个空的字典对象,用于存放并返回注解。在函数延迟创建注解字典前,删除注解操作会抛出 " +"``AttributeError`` 异常;连续两次调用 ``del fn.__annotations__`` 一定会抛出一次 " +"``AttributeError`` 异常。" + +#: ../../howto/annotations.rst:219 +msgid "" +"Everything in the above paragraph also applies to class and module objects " +"in Python 3.10 and newer." +msgstr "以上同样适用于 Python 3.10 以上版本中的类和模块对象。" + +#: ../../howto/annotations.rst:222 +msgid "" +"In all versions of Python 3, you can set ``__annotations__`` on a function " +"object to ``None``. However, subsequently accessing the annotations on that" +" object using ``fn.__annotations__`` will lazy-create an empty dictionary as" +" per the first paragraph of this section. This is *not* true of modules and" +" classes, in any Python version; those objects permit setting " +"``__annotations__`` to any Python value, and will retain whatever value is " +"set." +msgstr "" +"所有版本的 Python 3 中,均可将函数对象的 ``__annotations__`` 设为 ``None``。但后续用 " +"``fn.__annotations__`` 访问该对象的注解时,会像本节第一段所述那样,延迟创建一个空字典。但在任何 Python " +"版本中,模块和类均非如此,它们允许将 ``__annotations__`` 设为任意 Python 值,并且会留存所设值。" + +#: ../../howto/annotations.rst:230 +msgid "" +"If Python stringizes your annotations for you (using ``from __future__ " +"import annotations``), and you specify a string as an annotation, the string" +" will itself be quoted. In effect the annotation is quoted *twice.* For " +"example::" +msgstr "" +"如果 Python 会对注解作字符串化处理(用 ``from __future__ import annotations`` " +"),并且注解本身就是一个字符串,那么将会为其加上引号。实际效果就是,注解加了 *两次* 引号。例如:" + +#: ../../howto/annotations.rst:236 +msgid "" +"from __future__ import annotations\n" +"def foo(a: \"str\"): pass\n" +"\n" +"print(foo.__annotations__)" +msgstr "" +"from __future__ import annotations\n" +"def foo(a: \"str\"): pass\n" +"\n" +"print(foo.__annotations__)" + +#: ../../howto/annotations.rst:241 +msgid "" +"This prints ``{'a': \"'str'\"}``. This shouldn't really be considered a " +"\"quirk\"; it's mentioned here simply because it might be surprising." +msgstr "这会打印出 ``{'a': \"'str'\"}``。这不应算是个“坑”;只是因为可能会让人吃惊,所以才提一下。" + +#: ../../howto/annotations.rst:244 +msgid "" +"If you use a class with a custom metaclass and access ``__annotations__`` on" +" the class, you may observe unexpected behavior; see :pep:`749 " +"<749#pep749-metaclasses>` for some examples. You can avoid these quirks by " +"using :func:`annotationlib.get_annotations` on Python 3.14+ or " +":func:`inspect.get_annotations` on Python 3.10+. On earlier versions of " +"Python, you can avoid these bugs by accessing the annotations from the " +"class's :attr:`~type.__dict__` (for example, " +"``cls.__dict__.get('__annotations__', None)``)." +msgstr "" +"如果你使用一个带有自定义元类的类,并在该类上访问 ``__annotations__``,你可能会观察到意外的行为;请参阅 :pep:`749 " +"<749#pep749-metaclasses>` 以获取一些示例。你可以通过在 Python 3.14+ 上使用 " +":func:`annotationlib.get_annotations` 或在 Python 3.10+ 上使用 " +":func:`inspect.get_annotations` 来避免这些问题。在 Python 的早期版本中,你可以通过访问类的 " +":attr:`~type.__dict__` 中的注解来避免这些 bug (例如 " +"``cls.__dict__.get('__annotations__', None)``)。" + +#: ../../howto/annotations.rst:253 +msgid "" +"In some versions of Python, instances of classes may have an " +"``__annotations__`` attribute. However, this is not supported functionality." +" If you need the annotations of an instance, you can use :func:`type` to " +"access its class (for example, " +"``annotationlib.get_annotations(type(myinstance))`` on Python 3.14+)." +msgstr "" +"在某些版本的 Python 中,类的实例可能具有 ``__annotations__`` 属性。但是,这不是受支持的功能。 " +"如果你需要一个实例的注解,你可以使用 :func:`type` 来访问它的类 (例如,Python 3.14+ 上的 " +"``annotationlib.get_annotations(type(myinstance))``)。" diff --git a/howto/argparse-optparse.po b/howto/argparse-optparse.po new file mode 100644 index 0000000000..8b828b8c9c --- /dev/null +++ b/howto/argparse-optparse.po @@ -0,0 +1,160 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../howto/argparse-optparse.rst:8 +msgid "Migrating ``optparse`` code to ``argparse``" +msgstr "将 ``optparse`` 代码迁移至 ``argparse``" + +#: ../../howto/argparse-optparse.rst:10 +msgid "" +"The :mod:`argparse` module offers several higher level features not natively" +" provided by the :mod:`optparse` module, including:" +msgstr ":mod:`argparse` 模块提供了一些未获 :mod:`optparse` 模块原生支持的更高层级特性,包括:" + +#: ../../howto/argparse-optparse.rst:13 +msgid "Handling positional arguments." +msgstr "处理位置参数。" + +#: ../../howto/argparse-optparse.rst:14 +msgid "Supporting subcommands." +msgstr "支持子命令。" + +#: ../../howto/argparse-optparse.rst:15 +msgid "Allowing alternative option prefixes like ``+`` and ``/``." +msgstr "允许替代选项前缀例如 ``+`` 和 ``/``。" + +#: ../../howto/argparse-optparse.rst:16 +msgid "Handling zero-or-more and one-or-more style arguments." +msgstr "处理零个或多个以及一个或多个风格的参数。" + +#: ../../howto/argparse-optparse.rst:17 +msgid "Producing more informative usage messages." +msgstr "生成更具信息量的用法消息。" + +#: ../../howto/argparse-optparse.rst:18 +msgid "Providing a much simpler interface for custom ``type`` and ``action``." +msgstr "提供用于定制 ``type`` 和 ``action`` 的更为简单的接口。" + +#: ../../howto/argparse-optparse.rst:20 +msgid "" +"Originally, the :mod:`argparse` module attempted to maintain compatibility " +"with :mod:`optparse`. However, the fundamental design differences between " +"supporting declarative command line option processing (while leaving " +"positional argument processing to application code), and supporting both " +"named options and positional arguments in the declarative interface mean " +"that the API has diverged from that of ``optparse`` over time." +msgstr "" +"最初的时候,:mod:`argparse` 模块试图维持与 :mod:`optparse` 的兼容性。 " +"不过,在支持声明式命令行选项处理(并将位置参数处理留给应用程序代码)以及在声明式界面中同时支持命名选项和位置参数之间底层设计方面的差异意味着其 API " +"逐渐与 ``optparse`` 的拉开了差距。" + +#: ../../howto/argparse-optparse.rst:27 +msgid "" +"As described in :ref:`choosing-an-argument-parser`, applications that are " +"currently using :mod:`optparse` and are happy with the way it works can just" +" continue to use ``optparse``." +msgstr "" +"正如 :ref:`choosing-an-argument-parser` 中所描述的,目前使用 :mod:`optparse` " +"并且对其效果感到满意的应用程序完全可以继续使用 ``optparse``。" + +#: ../../howto/argparse-optparse.rst:31 +msgid "" +"Application developers that are considering migrating should also review the" +" list of intrinsic behavioural differences described in that section before " +"deciding whether or not migration is desirable." +msgstr "考虑迁移的应用程序开发者也应当先仔细查看在该章节中描述的内在行为差异列表再决定是否需要迁移。" + +#: ../../howto/argparse-optparse.rst:35 +msgid "" +"For applications that do choose to migrate from :mod:`optparse` to " +":mod:`argparse`, the following suggestions should be helpful:" +msgstr "对于确定选择从 :mod:`optparse` 迁移到 :mod:`argparse` 的应用程序,下列建议应该会有帮助:" + +#: ../../howto/argparse-optparse.rst:38 +msgid "" +"Replace all :meth:`optparse.OptionParser.add_option` calls with " +":meth:`ArgumentParser.add_argument` calls." +msgstr "" +"将所有 :meth:`optparse.OptionParser.add_option` 调用替换为 " +":meth:`ArgumentParser.add_argument` 调用。" + +#: ../../howto/argparse-optparse.rst:41 +msgid "" +"Replace ``(options, args) = parser.parse_args()`` with ``args = " +"parser.parse_args()`` and add additional :meth:`ArgumentParser.add_argument`" +" calls for the positional arguments. Keep in mind that what was previously " +"called ``options``, now in the :mod:`argparse` context is called ``args``." +msgstr "" +"将 ``(options, args) = parser.parse_args()`` 替换为 ``args = " +"parser.parse_args()`` 并为位置参数添加额外的 :meth:`ArgumentParser.add_argument` 调用。 " +"请注意之前所谓的 ``options`` 在 :mod:`argparse` 上下文中被称为 ``args``。" + +#: ../../howto/argparse-optparse.rst:46 +msgid "" +"Replace :meth:`optparse.OptionParser.disable_interspersed_args` by using " +":meth:`~ArgumentParser.parse_intermixed_args` instead of " +":meth:`~ArgumentParser.parse_args`." +msgstr "" +"通过使用 :meth:`~ArgumentParser.parse_intermixed_args` 而非 " +":meth:`~ArgumentParser.parse_args` 来替换 " +":meth:`optparse.OptionParser.disable_interspersed_args`。" + +#: ../../howto/argparse-optparse.rst:50 +msgid "" +"Replace callback actions and the ``callback_*`` keyword arguments with " +"``type`` or ``action`` arguments." +msgstr "将回调动作和 ``callback_*`` 关键字参数替换为 ``type`` 或 ``action`` 参数。" + +#: ../../howto/argparse-optparse.rst:53 +msgid "" +"Replace string names for ``type`` keyword arguments with the corresponding " +"type objects (e.g. int, float, complex, etc)." +msgstr "将 ``type`` 关键字参数字符串名称替换为相应的类型对象(例如 int, float, complex 等)。" + +#: ../../howto/argparse-optparse.rst:56 +msgid "" +"Replace :class:`optparse.Values` with :class:`Namespace` and " +":exc:`optparse.OptionError` and :exc:`optparse.OptionValueError` with " +":exc:`ArgumentError`." +msgstr "" +"将 :class:`optparse.Values` 替换为 :class:`Namespace` 并将 " +":exc:`optparse.OptionError` 和 :exc:`optparse.OptionValueError` 替换为 " +":exc:`ArgumentError`。" + +#: ../../howto/argparse-optparse.rst:60 +msgid "" +"Replace strings with implicit arguments such as ``%default`` or ``%prog`` " +"with the standard Python syntax to use dictionaries to format strings, that " +"is, ``%(default)s`` and ``%(prog)s``." +msgstr "" +"将包含隐式参数的字符串如 ``%default`` 或 ``%prog`` 替换为使用标准 Python 字典格式化语法的字符串,即 " +"``%(default)s`` 和 ``%(prog)s``。" + +#: ../../howto/argparse-optparse.rst:64 +msgid "" +"Replace the OptionParser constructor ``version`` argument with a call to " +"``parser.add_argument('--version', action='version', version='')``." +msgstr "" +"将 OptionParser 构造器 ``version`` 参数替换为对 ``parser.add_argument('--version', " +"action='version', version='')`` 的调用。" diff --git a/howto/argparse.po b/howto/argparse.po new file mode 100644 index 0000000000..a4d8a52225 --- /dev/null +++ b/howto/argparse.po @@ -0,0 +1,1694 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../howto/argparse.rst:5 +msgid "Argparse Tutorial" +msgstr "argparse 教程" + +#: ../../howto/argparse.rst:0 +msgid "author" +msgstr "作者" + +#: ../../howto/argparse.rst:7 +msgid "Tshepang Mbambo" +msgstr "Tshepang Mbambo" + +#: ../../howto/argparse.rst:11 +msgid "" +"This tutorial is intended to be a gentle introduction to :mod:`argparse`, " +"the recommended command-line parsing module in the Python standard library." +msgstr "这篇教程旨在作为 :mod:`argparse` 的入门介绍,此模块是 Python 标准库中推荐的命令行解析模块。" + +#: ../../howto/argparse.rst:16 +msgid "" +"The standard library includes two other libraries directly related to " +"command-line parameter processing: the lower level :mod:`optparse` module " +"(which may require more code to configure for a given application, but also " +"allows an application to request behaviors that ``argparse`` doesn't " +"support), and the very low level :mod:`getopt` (which specifically serves as" +" an equivalent to the :c:func:`!getopt` family of functions available to C " +"programmers). While neither of those modules is covered directly in this " +"guide, many of the core concepts in ``argparse`` first originated in " +"``optparse``, so some aspects of this tutorial will also be relevant to " +"``optparse`` users." +msgstr "" +"标准库还包括另两个与命令行形参处理直接相关的库:低层级的 :mod:`optparse` 模块 " +"(对于特定应用程序它可能需要更多的代码来配置,但也允许应用程序请求 ``argparse`` 所不支持的行为),以及更低层级的 " +":mod:`getopt` (它被作为供 C 程序员使用的 :c:func:`!getopt` 函数族的等价物)。 " +"这些模块并未在本指南中直接介绍,``argparse`` 中的许多核心概念最初都是来自 ``optparse``,因此本教程的某些部分对 " +"``optparse`` 用户来说也是有用的。" + +#: ../../howto/argparse.rst:29 +msgid "Concepts" +msgstr "概念" + +#: ../../howto/argparse.rst:31 +msgid "" +"Let's show the sort of functionality that we are going to explore in this " +"introductory tutorial by making use of the :command:`ls` command:" +msgstr "让我们利用 :command:`ls` 命令来展示我们将要在这篇入门教程中探索的功能:" + +#: ../../howto/argparse.rst:34 +msgid "" +"$ ls\n" +"cpython devguide prog.py pypy rm-unused-function.patch\n" +"$ ls pypy\n" +"ctypes_configure demo dotviewer include lib_pypy lib-python ...\n" +"$ ls -l\n" +"total 20\n" +"drwxr-xr-x 19 wena wena 4096 Feb 18 18:51 cpython\n" +"drwxr-xr-x 4 wena wena 4096 Feb 8 12:04 devguide\n" +"-rwxr-xr-x 1 wena wena 535 Feb 19 00:05 prog.py\n" +"drwxr-xr-x 14 wena wena 4096 Feb 7 00:59 pypy\n" +"-rw-r--r-- 1 wena wena 741 Feb 18 01:01 rm-unused-function.patch\n" +"$ ls --help\n" +"Usage: ls [OPTION]... [FILE]...\n" +"List information about the FILEs (the current directory by default).\n" +"Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.\n" +"..." +msgstr "" +"$ ls\n" +"cpython devguide prog.py pypy rm-unused-function.patch\n" +"$ ls pypy\n" +"ctypes_configure demo dotviewer include lib_pypy lib-python ...\n" +"$ ls -l\n" +"total 20\n" +"drwxr-xr-x 19 wena wena 4096 Feb 18 18:51 cpython\n" +"drwxr-xr-x 4 wena wena 4096 Feb 8 12:04 devguide\n" +"-rwxr-xr-x 1 wena wena 535 Feb 19 00:05 prog.py\n" +"drwxr-xr-x 14 wena wena 4096 Feb 7 00:59 pypy\n" +"-rw-r--r-- 1 wena wena 741 Feb 18 01:01 rm-unused-function.patch\n" +"$ ls --help\n" +"Usage: ls [OPTION]... [FILE]...\n" +"List information about the FILEs (the current directory by default).\n" +"Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.\n" +"..." + +#: ../../howto/argparse.rst:53 +msgid "A few concepts we can learn from the four commands:" +msgstr "我们可以从这四个命令中学到几个概念:" + +#: ../../howto/argparse.rst:55 +msgid "" +"The :command:`ls` command is useful when run without any options at all. It " +"defaults to displaying the contents of the current directory." +msgstr ":command:`ls` 是一个即使在运行的时候没有提供任何选项,也非常有用的命令。在默认情况下它会输出当前文件夹包含的文件和文件夹。" + +#: ../../howto/argparse.rst:58 +msgid "" +"If we want beyond what it provides by default, we tell it a bit more. In " +"this case, we want it to display a different directory, ``pypy``. What we " +"did is specify what is known as a positional argument. It's named so because" +" the program should know what to do with the value, solely based on where it" +" appears on the command line. This concept is more relevant to a command " +"like :command:`cp`, whose most basic usage is ``cp SRC DEST``. The first " +"position is *what you want copied,* and the second position is *where you " +"want it copied to*." +msgstr "" +"如果我们想要使用比它默认提供的更多功能,我们需要告诉该命令更多信息。在这个例子里,我们想要查看一个不同的目录,``pypy``。我们所做的是指定所谓的位置参数。之所以这样命名,是因为程序应该如何处理该参数值,完全取决于它在命令行出现的位置。更能体现这个概念的命令如" +" :command:`cp`,它最基本的用法是 ``cp SRC " +"DEST``。第一个位置参数指的是*你想要复制的*,第二个位置参数指的是*你想要复制到的位置*。" + +#: ../../howto/argparse.rst:67 +msgid "" +"Now, say we want to change behaviour of the program. In our example, we " +"display more info for each file instead of just showing the file names. The " +"``-l`` in that case is known as an optional argument." +msgstr "" +"现在假设我们想要改变这个程序的行为。在我们的例子中,我们不仅仅只是输出每个文件的文件名,还输出了更多信息。在这个例子中,``-l`` 被称为可选参数。" + +#: ../../howto/argparse.rst:71 +msgid "" +"That's a snippet of the help text. It's very useful in that you can come " +"across a program you have never used before, and can figure out how it works" +" simply by reading its help text." +msgstr "这是一段帮助文档的文字。它是非常有用的,因为当你遇到一个你从未使用过的程序时,你可以通过阅读它的帮助文档来弄清楚它是如何运行的。" + +#: ../../howto/argparse.rst:77 +msgid "The basics" +msgstr "基础" + +#: ../../howto/argparse.rst:79 +msgid "Let us start with a very simple example which does (almost) nothing::" +msgstr "让我们从一个简单到(几乎)什么也做不了的例子开始::" + +#: ../../howto/argparse.rst:81 +msgid "" +"import argparse\n" +"parser = argparse.ArgumentParser()\n" +"parser.parse_args()" +msgstr "" +"import argparse\n" +"parser = argparse.ArgumentParser()\n" +"parser.parse_args()" + +#: ../../howto/argparse.rst:85 ../../howto/argparse.rst:193 +#: ../../howto/argparse.rst:214 +msgid "Following is a result of running the code:" +msgstr "以下是该代码的运行结果:" + +#: ../../howto/argparse.rst:87 +msgid "" +"$ python prog.py\n" +"$ python prog.py --help\n" +"usage: prog.py [-h]\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +"$ python prog.py --verbose\n" +"usage: prog.py [-h]\n" +"prog.py: error: unrecognized arguments: --verbose\n" +"$ python prog.py foo\n" +"usage: prog.py [-h]\n" +"prog.py: error: unrecognized arguments: foo" +msgstr "" +"$ python prog.py\n" +"$ python prog.py --help\n" +"usage: prog.py [-h]\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +"$ python prog.py --verbose\n" +"usage: prog.py [-h]\n" +"prog.py: error: unrecognized arguments: --verbose\n" +"$ python prog.py foo\n" +"usage: prog.py [-h]\n" +"prog.py: error: unrecognized arguments: foo" + +#: ../../howto/argparse.rst:102 ../../howto/argparse.rst:259 +#: ../../howto/argparse.rst:303 +msgid "Here is what is happening:" +msgstr "程序运行情况如下:" + +#: ../../howto/argparse.rst:104 +msgid "" +"Running the script without any options results in nothing displayed to " +"stdout. Not so useful." +msgstr "在没有任何选项的情况下运行脚本不会在标准输出显示任何内容。这没有什么用处。" + +#: ../../howto/argparse.rst:107 +msgid "" +"The second one starts to display the usefulness of the :mod:`argparse` " +"module. We have done almost nothing, but already we get a nice help message." +msgstr "第二行代码开始展现出 :mod:`argparse` 模块的作用。我们几乎什么也没有做,但已经得到一条很好的帮助信息。" + +#: ../../howto/argparse.rst:110 +msgid "" +"The ``--help`` option, which can also be shortened to ``-h``, is the only " +"option we get for free (i.e. no need to specify it). Specifying anything " +"else results in an error. But even then, we do get a useful usage message, " +"also for free." +msgstr "" +"``--help`` 选项,也可缩写为 " +"``-h``,是唯一一个可以直接使用的选项(即不需要指定该选项的内容)。指定任何内容都会导致错误。即便如此,我们也能直接得到一条有用的用法信息。" + +#: ../../howto/argparse.rst:117 +msgid "Introducing Positional arguments" +msgstr "位置参数介绍" + +#: ../../howto/argparse.rst:119 +msgid "An example::" +msgstr "举个例子::" + +#: ../../howto/argparse.rst:121 +msgid "" +"import argparse\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument(\"echo\")\n" +"args = parser.parse_args()\n" +"print(args.echo)" +msgstr "" +"import argparse\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument(\"echo\")\n" +"args = parser.parse_args()\n" +"print(args.echo)" + +#: ../../howto/argparse.rst:127 +msgid "And running the code:" +msgstr "运行此程序:" + +#: ../../howto/argparse.rst:129 +msgid "" +"$ python prog.py\n" +"usage: prog.py [-h] echo\n" +"prog.py: error: the following arguments are required: echo\n" +"$ python prog.py --help\n" +"usage: prog.py [-h] echo\n" +"\n" +"positional arguments:\n" +" echo\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +"$ python prog.py foo\n" +"foo" +msgstr "" +"$ python prog.py\n" +"usage: prog.py [-h] echo\n" +"prog.py: error: the following arguments are required: echo\n" +"$ python prog.py --help\n" +"usage: prog.py [-h] echo\n" +"\n" +"positional arguments:\n" +" echo\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +"$ python prog.py foo\n" +"foo" + +#: ../../howto/argparse.rst:145 +msgid "Here is what's happening:" +msgstr "程序运行情况如下:" + +#: ../../howto/argparse.rst:147 +msgid "" +"We've added the :meth:`~ArgumentParser.add_argument` method, which is what " +"we use to specify which command-line options the program is willing to " +"accept. In this case, I've named it ``echo`` so that it's in line with its " +"function." +msgstr "" +"我们增加了 :meth:`~ArgumentParser.add_argument` 方法,该方法用于指定程序将能接受哪些命令行选项。 " +"在这个例子中,我将它命名为 ``echo`` 以与其对应的函数保持一致。" + +#: ../../howto/argparse.rst:151 +msgid "Calling our program now requires us to specify an option." +msgstr "现在调用我们的程序必须要指定一个选项。" + +#: ../../howto/argparse.rst:153 +msgid "" +"The :meth:`~ArgumentParser.parse_args` method actually returns some data " +"from the options specified, in this case, ``echo``." +msgstr "" +":meth:`~ArgumentParser.parse_args` 方法实际将返回来自指定选项的某些数据,在这个例子中是 ``echo``。" + +#: ../../howto/argparse.rst:156 +msgid "" +"The variable is some form of 'magic' that :mod:`argparse` performs for free " +"(i.e. no need to specify which variable that value is stored in). You will " +"also notice that its name matches the string argument given to the method, " +"``echo``." +msgstr "" +"这一变量是 :mod:`argparse` 免费施放的某种 " +"“魔法”(即是说,不需要指定哪个变量是存储哪个值的)。你也可以注意到,这一名称与传递给方法的字符串参数一致,都是 ``echo``。" + +#: ../../howto/argparse.rst:161 +msgid "" +"Note however that, although the help display looks nice and all, it " +"currently is not as helpful as it can be. For example we see that we got " +"``echo`` as a positional argument, but we don't know what it does, other " +"than by guessing or by reading the source code. So, let's make it a bit more" +" useful::" +msgstr "" +"然而请注意,尽管显示的帮助看起来清楚完整,但它可以比现在更有帮助。比如我们可以知道 ``echo`` " +"是一个位置参数,但我们除了靠猜或者看源代码,没法知道它是用来干什么的。所以,我们可以把它改造得更有用::" + +#: ../../howto/argparse.rst:166 +msgid "" +"import argparse\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument(\"echo\", help=\"echo the string you use here\")\n" +"args = parser.parse_args()\n" +"print(args.echo)" +msgstr "" +"import argparse\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument(\"echo\", help=\"echo the string you use here\")\n" +"args = parser.parse_args()\n" +"print(args.echo)" + +#: ../../howto/argparse.rst:172 +msgid "And we get:" +msgstr "然后我们得到:" + +#: ../../howto/argparse.rst:174 +msgid "" +"$ python prog.py -h\n" +"usage: prog.py [-h] echo\n" +"\n" +"positional arguments:\n" +" echo echo the string you use here\n" +"\n" +"options:\n" +" -h, --help show this help message and exit" +msgstr "" +"$ python prog.py -h\n" +"usage: prog.py [-h] echo\n" +"\n" +"positional arguments:\n" +" echo echo the string you use here\n" +"\n" +"options:\n" +" -h, --help show this help message and exit" + +#: ../../howto/argparse.rst:185 +msgid "Now, how about doing something even more useful::" +msgstr "现在,来做一些更有用的事情::" + +#: ../../howto/argparse.rst:187 +msgid "" +"import argparse\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument(\"square\", help=\"display a square of a given number\")\n" +"args = parser.parse_args()\n" +"print(args.square**2)" +msgstr "" +"import argparse\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument(\"square\", help=\"display a square of a given number\")\n" +"args = parser.parse_args()\n" +"print(args.square**2)" + +#: ../../howto/argparse.rst:195 +msgid "" +"$ python prog.py 4\n" +"Traceback (most recent call last):\n" +" File \"prog.py\", line 5, in \n" +" print(args.square**2)\n" +"TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'" +msgstr "" +"$ python prog.py 4\n" +"Traceback (most recent call last):\n" +" File \"prog.py\", line 5, in \n" +" print(args.square**2)\n" +"TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'" + +#: ../../howto/argparse.rst:203 +msgid "" +"That didn't go so well. That's because :mod:`argparse` treats the options we" +" give it as strings, unless we tell it otherwise. So, let's tell " +":mod:`argparse` to treat that input as an integer::" +msgstr "" +"进展不太顺利。那是因为 :mod:`argparse` 会把我们传递给它的选项视作为字符串,除非我们告诉它别这样。所以,让我们来告诉 " +":mod:`argparse` 来把这一输入视为整数::" + +#: ../../howto/argparse.rst:207 +msgid "" +"import argparse\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument(\"square\", help=\"display a square of a given number\",\n" +" type=int)\n" +"args = parser.parse_args()\n" +"print(args.square**2)" +msgstr "" +"import argparse\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument(\"square\", help=\"display a square of a given number\",\n" +" type=int)\n" +"args = parser.parse_args()\n" +"print(args.square**2)" + +#: ../../howto/argparse.rst:216 +msgid "" +"$ python prog.py 4\n" +"16\n" +"$ python prog.py four\n" +"usage: prog.py [-h] square\n" +"prog.py: error: argument square: invalid int value: 'four'" +msgstr "" +"$ python prog.py 4\n" +"16\n" +"$ python prog.py four\n" +"usage: prog.py [-h] square\n" +"prog.py: error: argument square: invalid int value: 'four'" + +#: ../../howto/argparse.rst:224 +msgid "" +"That went well. The program now even helpfully quits on bad illegal input " +"before proceeding." +msgstr "做得不错。当这个程序在收到错误的无效的输入时,它甚至能在执行计算之前先退出,还能显示很有帮助的错误信息。" + +#: ../../howto/argparse.rst:229 +msgid "Introducing Optional arguments" +msgstr "可选参数介绍" + +#: ../../howto/argparse.rst:231 +msgid "" +"So far we have been playing with positional arguments. Let us have a look on" +" how to add optional ones::" +msgstr "到目前为止,我们一直在研究位置参数。让我们看看如何添加可选的::" + +#: ../../howto/argparse.rst:234 +msgid "" +"import argparse\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument(\"--verbosity\", help=\"increase output verbosity\")\n" +"args = parser.parse_args()\n" +"if args.verbosity:\n" +" print(\"verbosity turned on\")" +msgstr "" +"import argparse\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument(\"--verbosity\", help=\"increase output verbosity\")\n" +"args = parser.parse_args()\n" +"if args.verbosity:\n" +" print(\"verbosity turned on\")" + +#: ../../howto/argparse.rst:241 ../../howto/argparse.rst:287 +#: ../../howto/argparse.rst:403 ../../howto/argparse.rst:437 +msgid "And the output:" +msgstr "和输出:" + +#: ../../howto/argparse.rst:243 +msgid "" +"$ python prog.py --verbosity 1\n" +"verbosity turned on\n" +"$ python prog.py\n" +"$ python prog.py --help\n" +"usage: prog.py [-h] [--verbosity VERBOSITY]\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" --verbosity VERBOSITY\n" +" increase output verbosity\n" +"$ python prog.py --verbosity\n" +"usage: prog.py [-h] [--verbosity VERBOSITY]\n" +"prog.py: error: argument --verbosity: expected one argument" +msgstr "" +"$ python prog.py --verbosity 1\n" +"verbosity turned on\n" +"$ python prog.py\n" +"$ python prog.py --help\n" +"usage: prog.py [-h] [--verbosity VERBOSITY]\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" --verbosity VERBOSITY\n" +" increase output verbosity\n" +"$ python prog.py --verbosity\n" +"usage: prog.py [-h] [--verbosity VERBOSITY]\n" +"prog.py: error: argument --verbosity: expected one argument" + +#: ../../howto/argparse.rst:261 +msgid "" +"The program is written so as to display something when ``--verbosity`` is " +"specified and display nothing when not." +msgstr "这一程序被设计为当指定 ``--verbosity`` 选项时显示某些东西,否则不显示。" + +#: ../../howto/argparse.rst:264 +msgid "" +"To show that the option is actually optional, there is no error when running" +" the program without it. Note that by default, if an optional argument isn't" +" used, the relevant variable, in this case ``args.verbosity``, is given " +"``None`` as a value, which is the reason it fails the truth test of the " +":keyword:`if` statement." +msgstr "" +"为表明此选项确实是可选的,当不附带该选项运行程序时将不会提示任何错误。请注意在默认情况下,如果一个可选参数未被使用,则关联的变量,在这个例子中是 " +"``args.verbosity``,将被赋值为 ``None``,这也就是它在 :keyword:`if` 语句中无法通过真值检测的原因。" + +#: ../../howto/argparse.rst:270 +msgid "The help message is a bit different." +msgstr "帮助信息有点不同。" + +#: ../../howto/argparse.rst:272 +msgid "" +"When using the ``--verbosity`` option, one must also specify some value, any" +" value." +msgstr "使用 ``--verbosity`` 选项时,必须指定一个值,但可以是任何值。" + +#: ../../howto/argparse.rst:275 +msgid "" +"The above example accepts arbitrary integer values for ``--verbosity``, but " +"for our simple program, only two values are actually useful, ``True`` or " +"``False``. Let's modify the code accordingly::" +msgstr "" +"上述例子接受任何整数值作为 ``--verbosity`` 的参数,但对于我们的简单程序而言,只有两个值有实际意义: ``True`` 或者 " +"``False``。 让我们据此修改代码::" + +#: ../../howto/argparse.rst:279 +msgid "" +"import argparse\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument(\"--verbose\", help=\"increase output verbosity\",\n" +" action=\"store_true\")\n" +"args = parser.parse_args()\n" +"if args.verbose:\n" +" print(\"verbosity turned on\")" +msgstr "" +"import argparse\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument(\"--verbose\", help=\"increase output verbosity\",\n" +" action=\"store_true\")\n" +"args = parser.parse_args()\n" +"if args.verbose:\n" +" print(\"verbosity turned on\")" + +#: ../../howto/argparse.rst:289 +msgid "" +"$ python prog.py --verbose\n" +"verbosity turned on\n" +"$ python prog.py --verbose 1\n" +"usage: prog.py [-h] [--verbose]\n" +"prog.py: error: unrecognized arguments: 1\n" +"$ python prog.py --help\n" +"usage: prog.py [-h] [--verbose]\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" --verbose increase output verbosity" +msgstr "" +"$ python prog.py --verbose\n" +"verbosity turned on\n" +"$ python prog.py --verbose 1\n" +"usage: prog.py [-h] [--verbose]\n" +"prog.py: error: unrecognized arguments: 1\n" +"$ python prog.py --help\n" +"usage: prog.py [-h] [--verbose]\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" --verbose increase output verbosity" + +#: ../../howto/argparse.rst:305 +msgid "" +"The option is now more of a flag than something that requires a value. We " +"even changed the name of the option to match that idea. Note that we now " +"specify a new keyword, ``action``, and give it the value ``\"store_true\"``." +" This means that, if the option is specified, assign the value ``True`` to " +"``args.verbose``. Not specifying it implies ``False``." +msgstr "" +"现在此选项更像是一个旗标而不需要接受特定的值。我们甚至改变了此选项的名字来匹配这一点。请注意我们现在指定了一个新的关键词 " +"``action``,并将其赋值为 ``\"store_true\"``。这意味着,如果指定了该选项,则将值 ``True`` 赋给 " +"``args.verbose``。如未指定则表示其值为 ``False``。" + +#: ../../howto/argparse.rst:312 +msgid "" +"It complains when you specify a value, in true spirit of what flags actually" +" are." +msgstr "当你为其指定一个值时,它会报错,符合作为标志的真正的精神。" + +#: ../../howto/argparse.rst:315 +msgid "Notice the different help text." +msgstr "留意不同的帮助文字。" + +#: ../../howto/argparse.rst:319 +msgid "Short options" +msgstr "短选项" + +#: ../../howto/argparse.rst:321 +msgid "" +"If you are familiar with command line usage, you will notice that I haven't " +"yet touched on the topic of short versions of the options. It's quite " +"simple::" +msgstr "如果你熟悉命令行的用法,你会发现我还没讲到这一选项的短版本。这也很简单::" + +#: ../../howto/argparse.rst:325 +msgid "" +"import argparse\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument(\"-v\", \"--verbose\", help=\"increase output verbosity\",\n" +" action=\"store_true\")\n" +"args = parser.parse_args()\n" +"if args.verbose:\n" +" print(\"verbosity turned on\")" +msgstr "" +"import argparse\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument(\"-v\", \"--verbose\", help=\"increase output verbosity\",\n" +" action=\"store_true\")\n" +"args = parser.parse_args()\n" +"if args.verbose:\n" +" print(\"verbosity turned on\")" + +#: ../../howto/argparse.rst:333 +msgid "And here goes:" +msgstr "效果就像这样:" + +#: ../../howto/argparse.rst:335 +msgid "" +"$ python prog.py -v\n" +"verbosity turned on\n" +"$ python prog.py --help\n" +"usage: prog.py [-h] [-v]\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" -v, --verbose increase output verbosity" +msgstr "" +"$ python prog.py -v\n" +"verbosity turned on\n" +"$ python prog.py --help\n" +"usage: prog.py [-h] [-v]\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" -v, --verbose increase output verbosity" + +#: ../../howto/argparse.rst:346 +msgid "Note that the new ability is also reflected in the help text." +msgstr "可以注意到,这一新的能力也反映在帮助文本里。" + +#: ../../howto/argparse.rst:350 +msgid "Combining Positional and Optional arguments" +msgstr "结合位置参数和可选参数" + +#: ../../howto/argparse.rst:352 +msgid "Our program keeps growing in complexity::" +msgstr "我们的程序变得越来越复杂了::" + +#: ../../howto/argparse.rst:354 +msgid "" +"import argparse\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument(\"square\", type=int,\n" +" help=\"display a square of a given number\")\n" +"parser.add_argument(\"-v\", \"--verbose\", action=\"store_true\",\n" +" help=\"increase output verbosity\")\n" +"args = parser.parse_args()\n" +"answer = args.square**2\n" +"if args.verbose:\n" +" print(f\"the square of {args.square} equals {answer}\")\n" +"else:\n" +" print(answer)" +msgstr "" +"import argparse\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument(\"square\", type=int,\n" +" help=\"display a square of a given number\")\n" +"parser.add_argument(\"-v\", \"--verbose\", action=\"store_true\",\n" +" help=\"increase output verbosity\")\n" +"args = parser.parse_args()\n" +"answer = args.square**2\n" +"if args.verbose:\n" +" print(f\"the square of {args.square} equals {answer}\")\n" +"else:\n" +" print(answer)" + +#: ../../howto/argparse.rst:367 +msgid "And now the output:" +msgstr "接着是输出:" + +#: ../../howto/argparse.rst:369 +msgid "" +"$ python prog.py\n" +"usage: prog.py [-h] [-v] square\n" +"prog.py: error: the following arguments are required: square\n" +"$ python prog.py 4\n" +"16\n" +"$ python prog.py 4 --verbose\n" +"the square of 4 equals 16\n" +"$ python prog.py --verbose 4\n" +"the square of 4 equals 16" +msgstr "" +"$ python prog.py\n" +"usage: prog.py [-h] [-v] square\n" +"prog.py: error: the following arguments are required: square\n" +"$ python prog.py 4\n" +"16\n" +"$ python prog.py 4 --verbose\n" +"the square of 4 equals 16\n" +"$ python prog.py --verbose 4\n" +"the square of 4 equals 16" + +#: ../../howto/argparse.rst:381 +msgid "We've brought back a positional argument, hence the complaint." +msgstr "我们带回了一个位置参数,结果发生了报错。" + +#: ../../howto/argparse.rst:383 +msgid "Note that the order does not matter." +msgstr "注意顺序无关紧要。" + +#: ../../howto/argparse.rst:385 +msgid "" +"How about we give this program of ours back the ability to have multiple " +"verbosity values, and actually get to use them::" +msgstr "给我们的程序加上接受多个冗长度的值,然后实际来用用::" + +#: ../../howto/argparse.rst:388 +msgid "" +"import argparse\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument(\"square\", type=int,\n" +" help=\"display a square of a given number\")\n" +"parser.add_argument(\"-v\", \"--verbosity\", type=int,\n" +" help=\"increase output verbosity\")\n" +"args = parser.parse_args()\n" +"answer = args.square**2\n" +"if args.verbosity == 2:\n" +" print(f\"the square of {args.square} equals {answer}\")\n" +"elif args.verbosity == 1:\n" +" print(f\"{args.square}^2 == {answer}\")\n" +"else:\n" +" print(answer)" +msgstr "" +"import argparse\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument(\"square\", type=int,\n" +" help=\"display a square of a given number\")\n" +"parser.add_argument(\"-v\", \"--verbosity\", type=int,\n" +" help=\"increase output verbosity\")\n" +"args = parser.parse_args()\n" +"answer = args.square**2\n" +"if args.verbosity == 2:\n" +" print(f\"the square of {args.square} equals {answer}\")\n" +"elif args.verbosity == 1:\n" +" print(f\"{args.square}^2 == {answer}\")\n" +"else:\n" +" print(answer)" + +#: ../../howto/argparse.rst:405 +msgid "" +"$ python prog.py 4\n" +"16\n" +"$ python prog.py 4 -v\n" +"usage: prog.py [-h] [-v VERBOSITY] square\n" +"prog.py: error: argument -v/--verbosity: expected one argument\n" +"$ python prog.py 4 -v 1\n" +"4^2 == 16\n" +"$ python prog.py 4 -v 2\n" +"the square of 4 equals 16\n" +"$ python prog.py 4 -v 3\n" +"16" +msgstr "" +"$ python prog.py 4\n" +"16\n" +"$ python prog.py 4 -v\n" +"usage: prog.py [-h] [-v VERBOSITY] square\n" +"prog.py: error: argument -v/--verbosity: expected one argument\n" +"$ python prog.py 4 -v 1\n" +"4^2 == 16\n" +"$ python prog.py 4 -v 2\n" +"the square of 4 equals 16\n" +"$ python prog.py 4 -v 3\n" +"16" + +#: ../../howto/argparse.rst:419 +msgid "" +"These all look good except the last one, which exposes a bug in our program." +" Let's fix it by restricting the values the ``--verbosity`` option can " +"accept::" +msgstr "" +"除了最后一个,看上去都不错。最后一个暴露了我们的程序中有一个 bug。我们可以通过限制 ``--verbosity`` 选项可以接受的值来修复它::" + +#: ../../howto/argparse.rst:422 +msgid "" +"import argparse\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument(\"square\", type=int,\n" +" help=\"display a square of a given number\")\n" +"parser.add_argument(\"-v\", \"--verbosity\", type=int, choices=[0, 1, 2],\n" +" help=\"increase output verbosity\")\n" +"args = parser.parse_args()\n" +"answer = args.square**2\n" +"if args.verbosity == 2:\n" +" print(f\"the square of {args.square} equals {answer}\")\n" +"elif args.verbosity == 1:\n" +" print(f\"{args.square}^2 == {answer}\")\n" +"else:\n" +" print(answer)" +msgstr "" +"import argparse\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument(\"square\", type=int,\n" +" help=\"display a square of a given number\")\n" +"parser.add_argument(\"-v\", \"--verbosity\", type=int, choices=[0, 1, 2],\n" +" help=\"increase output verbosity\")\n" +"args = parser.parse_args()\n" +"answer = args.square**2\n" +"if args.verbosity == 2:\n" +" print(f\"the square of {args.square} equals {answer}\")\n" +"elif args.verbosity == 1:\n" +" print(f\"{args.square}^2 == {answer}\")\n" +"else:\n" +" print(answer)" + +#: ../../howto/argparse.rst:439 +msgid "" +"$ python prog.py 4 -v 3\n" +"usage: prog.py [-h] [-v {0,1,2}] square\n" +"prog.py: error: argument -v/--verbosity: invalid choice: 3 (choose from 0, 1, 2)\n" +"$ python prog.py 4 -h\n" +"usage: prog.py [-h] [-v {0,1,2}] square\n" +"\n" +"positional arguments:\n" +" square display a square of a given number\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" -v, --verbosity {0,1,2}\n" +" increase output verbosity" +msgstr "" +"$ python prog.py 4 -v 3\n" +"usage: prog.py [-h] [-v {0,1,2}] square\n" +"prog.py: error: argument -v/--verbosity: invalid choice: 3 (choose from 0, 1, 2)\n" +"$ python prog.py 4 -h\n" +"usage: prog.py [-h] [-v {0,1,2}] square\n" +"\n" +"positional arguments:\n" +" square display a square of a given number\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" -v, --verbosity {0,1,2}\n" +" increase output verbosity" + +#: ../../howto/argparse.rst:455 +msgid "" +"Note that the change also reflects both in the error message as well as the " +"help string." +msgstr "注意这一改变同时反映在错误信息和帮助信息里。" + +#: ../../howto/argparse.rst:458 +msgid "" +"Now, let's use a different approach of playing with verbosity, which is " +"pretty common. It also matches the way the CPython executable handles its " +"own verbosity argument (check the output of ``python --help``)::" +msgstr "" +"现在,让我们使用另一种的方式来改变冗长度。这种方式更常见,也和 CPython 的可执行文件处理它自己的冗长度参数的方式一致(参考 ``python " +"--help`` 的输出)::" + +#: ../../howto/argparse.rst:462 +msgid "" +"import argparse\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument(\"square\", type=int,\n" +" help=\"display the square of a given number\")\n" +"parser.add_argument(\"-v\", \"--verbosity\", action=\"count\",\n" +" help=\"increase output verbosity\")\n" +"args = parser.parse_args()\n" +"answer = args.square**2\n" +"if args.verbosity == 2:\n" +" print(f\"the square of {args.square} equals {answer}\")\n" +"elif args.verbosity == 1:\n" +" print(f\"{args.square}^2 == {answer}\")\n" +"else:\n" +" print(answer)" +msgstr "" +"import argparse\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument(\"square\", type=int,\n" +" help=\"display the square of a given number\")\n" +"parser.add_argument(\"-v\", \"--verbosity\", action=\"count\",\n" +" help=\"increase output verbosity\")\n" +"args = parser.parse_args()\n" +"answer = args.square**2\n" +"if args.verbosity == 2:\n" +" print(f\"the square of {args.square} equals {answer}\")\n" +"elif args.verbosity == 1:\n" +" print(f\"{args.square}^2 == {answer}\")\n" +"else:\n" +" print(answer)" + +#: ../../howto/argparse.rst:477 +msgid "" +"We have introduced another action, \"count\", to count the number of " +"occurrences of specific options." +msgstr "我们引入了另一种动作 \"count\",来统计特定选项出现的次数。" + +#: ../../howto/argparse.rst:481 +msgid "" +"$ python prog.py 4\n" +"16\n" +"$ python prog.py 4 -v\n" +"4^2 == 16\n" +"$ python prog.py 4 -vv\n" +"the square of 4 equals 16\n" +"$ python prog.py 4 --verbosity --verbosity\n" +"the square of 4 equals 16\n" +"$ python prog.py 4 -v 1\n" +"usage: prog.py [-h] [-v] square\n" +"prog.py: error: unrecognized arguments: 1\n" +"$ python prog.py 4 -h\n" +"usage: prog.py [-h] [-v] square\n" +"\n" +"positional arguments:\n" +" square display a square of a given number\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" -v, --verbosity increase output verbosity\n" +"$ python prog.py 4 -vvv\n" +"16" +msgstr "" +"$ python prog.py 4\n" +"16\n" +"$ python prog.py 4 -v\n" +"4^2 == 16\n" +"$ python prog.py 4 -vv\n" +"the square of 4 equals 16\n" +"$ python prog.py 4 --verbosity --verbosity\n" +"the square of 4 equals 16\n" +"$ python prog.py 4 -v 1\n" +"usage: prog.py [-h] [-v] square\n" +"prog.py: error: unrecognized arguments: 1\n" +"$ python prog.py 4 -h\n" +"usage: prog.py [-h] [-v] square\n" +"\n" +"positional arguments:\n" +" square display a square of a given number\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" -v, --verbosity increase output verbosity\n" +"$ python prog.py 4 -vvv\n" +"16" + +#: ../../howto/argparse.rst:506 +msgid "" +"Yes, it's now more of a flag (similar to ``action=\"store_true\"``) in the " +"previous version of our script. That should explain the complaint." +msgstr "是的,它现在比前一版本更像是一个标志(和 ``action=\"store_true\"`` 相似)。这能解释它为什么报错。" + +#: ../../howto/argparse.rst:509 +msgid "It also behaves similar to \"store_true\" action." +msgstr "它也表现得与 \"store_true\" 的行为相似。" + +#: ../../howto/argparse.rst:511 +msgid "" +"Now here's a demonstration of what the \"count\" action gives. You've " +"probably seen this sort of usage before." +msgstr "这给出了一个关于 ``count`` 动作的效果的演示。你之前很可能应该已经看过这种用法。" + +#: ../../howto/argparse.rst:514 +msgid "" +"And if you don't specify the ``-v`` flag, that flag is considered to have " +"``None`` value." +msgstr "如果你不添加 ``-v`` 标志,这一标志的值会是 ``None``。" + +#: ../../howto/argparse.rst:517 +msgid "" +"As should be expected, specifying the long form of the flag, we should get " +"the same output." +msgstr "如期望的那样,添加该标志的长形态能够获得相同的输出。" + +#: ../../howto/argparse.rst:520 +msgid "" +"Sadly, our help output isn't very informative on the new ability our script " +"has acquired, but that can always be fixed by improving the documentation " +"for our script (e.g. via the ``help`` keyword argument)." +msgstr "" +"可惜的是,对于我们的脚本获得的新能力,我们的帮助输出并没有提供很多信息,但我们总是可以通过改善文档来修复这一问题(比如通过 ``help`` " +"关键字参数)。" + +#: ../../howto/argparse.rst:524 +msgid "That last output exposes a bug in our program." +msgstr "最后一个输出暴露了我们程序中的一个 bug。" + +#: ../../howto/argparse.rst:527 +msgid "Let's fix::" +msgstr "让我们修复一下::" + +#: ../../howto/argparse.rst:529 +msgid "" +"import argparse\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument(\"square\", type=int,\n" +" help=\"display a square of a given number\")\n" +"parser.add_argument(\"-v\", \"--verbosity\", action=\"count\",\n" +" help=\"increase output verbosity\")\n" +"args = parser.parse_args()\n" +"answer = args.square**2\n" +"\n" +"# bugfix: replace == with >=\n" +"if args.verbosity >= 2:\n" +" print(f\"the square of {args.square} equals {answer}\")\n" +"elif args.verbosity >= 1:\n" +" print(f\"{args.square}^2 == {answer}\")\n" +"else:\n" +" print(answer)" +msgstr "" +"import argparse\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument(\"square\", type=int,\n" +" help=\"display a square of a given number\")\n" +"parser.add_argument(\"-v\", \"--verbosity\", action=\"count\",\n" +" help=\"increase output verbosity\")\n" +"args = parser.parse_args()\n" +"answer = args.square**2\n" +"\n" +"# bugfix: replace == with >=\n" +"if args.verbosity >= 2:\n" +" print(f\"the square of {args.square} equals {answer}\")\n" +"elif args.verbosity >= 1:\n" +" print(f\"{args.square}^2 == {answer}\")\n" +"else:\n" +" print(answer)" + +#: ../../howto/argparse.rst:546 +msgid "And this is what it gives:" +msgstr "这是它给我们的输出:" + +#: ../../howto/argparse.rst:548 +msgid "" +"$ python prog.py 4 -vvv\n" +"the square of 4 equals 16\n" +"$ python prog.py 4 -vvvv\n" +"the square of 4 equals 16\n" +"$ python prog.py 4\n" +"Traceback (most recent call last):\n" +" File \"prog.py\", line 11, in \n" +" if args.verbosity >= 2:\n" +"TypeError: '>=' not supported between instances of 'NoneType' and 'int'" +msgstr "" +"$ python prog.py 4 -vvv\n" +"the square of 4 equals 16\n" +"$ python prog.py 4 -vvvv\n" +"the square of 4 equals 16\n" +"$ python prog.py 4\n" +"Traceback (most recent call last):\n" +" File \"prog.py\", line 11, in \n" +" if args.verbosity >= 2:\n" +"TypeError: '>=' not supported between instances of 'NoneType' and 'int'" + +#: ../../howto/argparse.rst:561 +msgid "" +"First output went well, and fixes the bug we had before. That is, we want " +"any value >= 2 to be as verbose as possible." +msgstr "第一组输出很好,修复了之前的 bug。也就是说,我们希望任何 >= 2 的值尽可能详尽。" + +#: ../../howto/argparse.rst:564 +msgid "Third output not so good." +msgstr "第三组输出并不理想。" + +#: ../../howto/argparse.rst:566 +msgid "Let's fix that bug::" +msgstr "让我们修复那个 bug::" + +#: ../../howto/argparse.rst:568 +msgid "" +"import argparse\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument(\"square\", type=int,\n" +" help=\"display a square of a given number\")\n" +"parser.add_argument(\"-v\", \"--verbosity\", action=\"count\", default=0,\n" +" help=\"increase output verbosity\")\n" +"args = parser.parse_args()\n" +"answer = args.square**2\n" +"if args.verbosity >= 2:\n" +" print(f\"the square of {args.square} equals {answer}\")\n" +"elif args.verbosity >= 1:\n" +" print(f\"{args.square}^2 == {answer}\")\n" +"else:\n" +" print(answer)" +msgstr "" +"import argparse\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument(\"square\", type=int,\n" +" help=\"display a square of a given number\")\n" +"parser.add_argument(\"-v\", \"--verbosity\", action=\"count\", default=0,\n" +" help=\"increase output verbosity\")\n" +"args = parser.parse_args()\n" +"answer = args.square**2\n" +"if args.verbosity >= 2:\n" +" print(f\"the square of {args.square} equals {answer}\")\n" +"elif args.verbosity >= 1:\n" +" print(f\"{args.square}^2 == {answer}\")\n" +"else:\n" +" print(answer)" + +#: ../../howto/argparse.rst:583 +msgid "" +"We've just introduced yet another keyword, ``default``. We've set it to " +"``0`` in order to make it comparable to the other int values. Remember that " +"by default, if an optional argument isn't specified, it gets the ``None`` " +"value, and that cannot be compared to an int value (hence the " +":exc:`TypeError` exception)." +msgstr "" +"我们刚刚引入了又一个新的关键字 ``default``。我们把它设置为 ``0`` " +"来让它可以与其他整数值相互比较。记住,默认情况下如果一个可选参数没有被指定,它的值会是 ``None``,并且它不能和整数值相比较(所以产生了 " +":exc:`TypeError` 异常)。" + +#: ../../howto/argparse.rst:590 +msgid "And:" +msgstr "然后:" + +#: ../../howto/argparse.rst:592 +msgid "" +"$ python prog.py 4\n" +"16" +msgstr "" +"$ python prog.py 4\n" +"16" + +#: ../../howto/argparse.rst:597 +msgid "" +"You can go quite far just with what we've learned so far, and we have only " +"scratched the surface. The :mod:`argparse` module is very powerful, and " +"we'll explore a bit more of it before we end this tutorial." +msgstr "" +"凭借我们目前已学的东西你就可以做到许多事情,而我们还仅仅学了一些皮毛而已。 :mod:`argparse` " +"模块是非常强大的,在结束本篇教程之前我们将再探索更多一些内容。" + +#: ../../howto/argparse.rst:604 +msgid "Getting a little more advanced" +msgstr "进行一些小小的改进" + +#: ../../howto/argparse.rst:606 +msgid "" +"What if we wanted to expand our tiny program to perform other powers, not " +"just squares::" +msgstr "如果我们想扩展我们的简短程序来执行其他幂次的运算,而不仅是求平方::" + +#: ../../howto/argparse.rst:609 +msgid "" +"import argparse\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument(\"x\", type=int, help=\"the base\")\n" +"parser.add_argument(\"y\", type=int, help=\"the exponent\")\n" +"parser.add_argument(\"-v\", \"--verbosity\", action=\"count\", default=0)\n" +"args = parser.parse_args()\n" +"answer = args.x**args.y\n" +"if args.verbosity >= 2:\n" +" print(f\"{args.x} to the power {args.y} equals {answer}\")\n" +"elif args.verbosity >= 1:\n" +" print(f\"{args.x}^{args.y} == {answer}\")\n" +"else:\n" +" print(answer)" +msgstr "" +"import argparse\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument(\"x\", type=int, help=\"the base\")\n" +"parser.add_argument(\"y\", type=int, help=\"the exponent\")\n" +"parser.add_argument(\"-v\", \"--verbosity\", action=\"count\", default=0)\n" +"args = parser.parse_args()\n" +"answer = args.x**args.y\n" +"if args.verbosity >= 2:\n" +" print(f\"{args.x} to the power {args.y} equals {answer}\")\n" +"elif args.verbosity >= 1:\n" +" print(f\"{args.x}^{args.y} == {answer}\")\n" +"else:\n" +" print(answer)" + +#: ../../howto/argparse.rst:623 ../../howto/argparse.rst:661 +#: ../../howto/argparse.rst:877 +msgid "Output:" +msgstr "输出:" + +#: ../../howto/argparse.rst:625 +msgid "" +"$ python prog.py\n" +"usage: prog.py [-h] [-v] x y\n" +"prog.py: error: the following arguments are required: x, y\n" +"$ python prog.py -h\n" +"usage: prog.py [-h] [-v] x y\n" +"\n" +"positional arguments:\n" +" x the base\n" +" y the exponent\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" -v, --verbosity\n" +"$ python prog.py 4 2 -v\n" +"4^2 == 16" +msgstr "" +"$ python prog.py\n" +"usage: prog.py [-h] [-v] x y\n" +"prog.py: error: the following arguments are required: x, y\n" +"$ python prog.py -h\n" +"usage: prog.py [-h] [-v] x y\n" +"\n" +"positional arguments:\n" +" x the base\n" +" y the exponent\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" -v, --verbosity\n" +"$ python prog.py 4 2 -v\n" +"4^2 == 16" + +#: ../../howto/argparse.rst:644 +msgid "" +"Notice that so far we've been using verbosity level to *change* the text " +"that gets displayed. The following example instead uses verbosity level to " +"display *more* text instead::" +msgstr "请注意到目前为止我们一直在使用详细级别来 *更改* 所显示的文本。以下示例则使用详细级别来显示 *更多的* 文本::" + +#: ../../howto/argparse.rst:648 +msgid "" +"import argparse\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument(\"x\", type=int, help=\"the base\")\n" +"parser.add_argument(\"y\", type=int, help=\"the exponent\")\n" +"parser.add_argument(\"-v\", \"--verbosity\", action=\"count\", default=0)\n" +"args = parser.parse_args()\n" +"answer = args.x**args.y\n" +"if args.verbosity >= 2:\n" +" print(f\"Running '{__file__}'\")\n" +"if args.verbosity >= 1:\n" +" print(f\"{args.x}^{args.y} == \", end=\"\")\n" +"print(answer)" +msgstr "" +"import argparse\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument(\"x\", type=int, help=\"the base\")\n" +"parser.add_argument(\"y\", type=int, help=\"the exponent\")\n" +"parser.add_argument(\"-v\", \"--verbosity\", action=\"count\", default=0)\n" +"args = parser.parse_args()\n" +"answer = args.x**args.y\n" +"if args.verbosity >= 2:\n" +" print(f\"Running '{__file__}'\")\n" +"if args.verbosity >= 1:\n" +" print(f\"{args.x}^{args.y} == \", end=\"\")\n" +"print(answer)" + +#: ../../howto/argparse.rst:663 +msgid "" +"$ python prog.py 4 2\n" +"16\n" +"$ python prog.py 4 2 -v\n" +"4^2 == 16\n" +"$ python prog.py 4 2 -vv\n" +"Running 'prog.py'\n" +"4^2 == 16" +msgstr "" +"$ python prog.py 4 2\n" +"16\n" +"$ python prog.py 4 2 -v\n" +"4^2 == 16\n" +"$ python prog.py 4 2 -vv\n" +"Running 'prog.py'\n" +"4^2 == 16" + +#: ../../howto/argparse.rst:677 +msgid "Specifying ambiguous arguments" +msgstr "指定有歧义的参数" + +#: ../../howto/argparse.rst:679 +msgid "" +"When there is ambiguity in deciding whether an argument is positional or for" +" an argument, ``--`` can be used to tell :meth:`~ArgumentParser.parse_args` " +"that everything after that is a positional argument::" +msgstr "" +"当在确定一个参数是位置参数还是从属于另一个参数存在歧义时,可以使用 ``--`` 来告诉 " +":meth:`~ArgumentParser.parse_args` 在它之后的参数是位置参数::" + +#: ../../howto/argparse.rst:683 +msgid "" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> parser.add_argument('-n', nargs='+')\n" +">>> parser.add_argument('args', nargs='*')\n" +"\n" +">>> # ambiguous, so parse_args assumes it's an option\n" +">>> parser.parse_args(['-f'])\n" +"usage: PROG [-h] [-n N [N ...]] [args ...]\n" +"PROG: error: unrecognized arguments: -f\n" +"\n" +">>> parser.parse_args(['--', '-f'])\n" +"Namespace(args=['-f'], n=None)\n" +"\n" +">>> # ambiguous, so the -n option greedily accepts arguments\n" +">>> parser.parse_args(['-n', '1', '2', '3'])\n" +"Namespace(args=[], n=['1', '2', '3'])\n" +"\n" +">>> parser.parse_args(['-n', '1', '--', '2', '3'])\n" +"Namespace(args=['2', '3'], n=['1'])" +msgstr "" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> parser.add_argument('-n', nargs='+')\n" +">>> parser.add_argument('args', nargs='*')\n" +"\n" +">>> # ambiguous, so parse_args assumes it's an option\n" +">>> parser.parse_args(['-f'])\n" +"usage: PROG [-h] [-n N [N ...]] [args ...]\n" +"PROG: error: unrecognized arguments: -f\n" +"\n" +">>> parser.parse_args(['--', '-f'])\n" +"Namespace(args=['-f'], n=None)\n" +"\n" +">>> # ambiguous, so the -n option greedily accepts arguments\n" +">>> parser.parse_args(['-n', '1', '2', '3'])\n" +"Namespace(args=[], n=['1', '2', '3'])\n" +"\n" +">>> parser.parse_args(['-n', '1', '--', '2', '3'])\n" +"Namespace(args=['2', '3'], n=['1'])" + +#: ../../howto/argparse.rst:704 +msgid "Conflicting options" +msgstr "矛盾的选项" + +#: ../../howto/argparse.rst:706 +msgid "" +"So far, we have been working with two methods of an " +":class:`argparse.ArgumentParser` instance. Let's introduce a third one, " +":meth:`~ArgumentParser.add_mutually_exclusive_group`. It allows for us to " +"specify options that conflict with each other. Let's also change the rest of" +" the program so that the new functionality makes more sense: we'll introduce" +" the ``--quiet`` option, which will be the opposite of the ``--verbose`` " +"one::" +msgstr "" +"到目前为止,我们一直在使用 :class:`argparse.ArgumentParser` 实例的两个方法。让我们再介绍第三个方法 " +":meth:`~ArgumentParser.add_mutually_exclusive_group`。它允许我们指定彼此相冲突的选项。 " +"让我们再修改程序的其余部分以便使新功能更有意义:我们将引入 ``--quiet`` 选项,它将与 ``--verbose`` 的作用相反::" + +#: ../../howto/argparse.rst:714 +msgid "" +"import argparse\n" +"\n" +"parser = argparse.ArgumentParser()\n" +"group = parser.add_mutually_exclusive_group()\n" +"group.add_argument(\"-v\", \"--verbose\", action=\"store_true\")\n" +"group.add_argument(\"-q\", \"--quiet\", action=\"store_true\")\n" +"parser.add_argument(\"x\", type=int, help=\"the base\")\n" +"parser.add_argument(\"y\", type=int, help=\"the exponent\")\n" +"args = parser.parse_args()\n" +"answer = args.x**args.y\n" +"\n" +"if args.quiet:\n" +" print(answer)\n" +"elif args.verbose:\n" +" print(f\"{args.x} to the power {args.y} equals {answer}\")\n" +"else:\n" +" print(f\"{args.x}^{args.y} == {answer}\")" +msgstr "" +"import argparse\n" +"\n" +"parser = argparse.ArgumentParser()\n" +"group = parser.add_mutually_exclusive_group()\n" +"group.add_argument(\"-v\", \"--verbose\", action=\"store_true\")\n" +"group.add_argument(\"-q\", \"--quiet\", action=\"store_true\")\n" +"parser.add_argument(\"x\", type=int, help=\"the base\")\n" +"parser.add_argument(\"y\", type=int, help=\"the exponent\")\n" +"args = parser.parse_args()\n" +"answer = args.x**args.y\n" +"\n" +"if args.quiet:\n" +" print(answer)\n" +"elif args.verbose:\n" +" print(f\"{args.x} to the power {args.y} equals {answer}\")\n" +"else:\n" +" print(f\"{args.x}^{args.y} == {answer}\")" + +#: ../../howto/argparse.rst:732 +msgid "" +"Our program is now simpler, and we've lost some functionality for the sake " +"of demonstration. Anyways, here's the output:" +msgstr "我们的程序现在变得更简洁了,我们出于演示需要略去了一些功能。无论如何,输出是这样的:" + +#: ../../howto/argparse.rst:735 +msgid "" +"$ python prog.py 4 2\n" +"4^2 == 16\n" +"$ python prog.py 4 2 -q\n" +"16\n" +"$ python prog.py 4 2 -v\n" +"4 to the power 2 equals 16\n" +"$ python prog.py 4 2 -vq\n" +"usage: prog.py [-h] [-v | -q] x y\n" +"prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose\n" +"$ python prog.py 4 2 -v --quiet\n" +"usage: prog.py [-h] [-v | -q] x y\n" +"prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose" +msgstr "" +"$ python prog.py 4 2\n" +"4^2 == 16\n" +"$ python prog.py 4 2 -q\n" +"16\n" +"$ python prog.py 4 2 -v\n" +"4 to the power 2 equals 16\n" +"$ python prog.py 4 2 -vq\n" +"usage: prog.py [-h] [-v | -q] x y\n" +"prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose\n" +"$ python prog.py 4 2 -v --quiet\n" +"usage: prog.py [-h] [-v | -q] x y\n" +"prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose" + +#: ../../howto/argparse.rst:750 +msgid "" +"That should be easy to follow. I've added that last output so you can see " +"the sort of flexibility you get, i.e. mixing long form options with short " +"form ones." +msgstr "这应该很容易理解。我添加了末尾的输出这样你就可以看到其所达到的灵活性,即混合使用长和短两种形式的选项。" + +#: ../../howto/argparse.rst:754 +msgid "" +"Before we conclude, you probably want to tell your users the main purpose of" +" your program, just in case they don't know::" +msgstr "在我们收尾之前,你也许希望告诉你的用户这个程序的主要目标,以免他们还不清楚::" + +#: ../../howto/argparse.rst:757 +msgid "" +"import argparse\n" +"\n" +"parser = argparse.ArgumentParser(description=\"calculate X to the power of Y\")\n" +"group = parser.add_mutually_exclusive_group()\n" +"group.add_argument(\"-v\", \"--verbose\", action=\"store_true\")\n" +"group.add_argument(\"-q\", \"--quiet\", action=\"store_true\")\n" +"parser.add_argument(\"x\", type=int, help=\"the base\")\n" +"parser.add_argument(\"y\", type=int, help=\"the exponent\")\n" +"args = parser.parse_args()\n" +"answer = args.x**args.y\n" +"\n" +"if args.quiet:\n" +" print(answer)\n" +"elif args.verbose:\n" +" print(f\"{args.x} to the power {args.y} equals {answer}\")\n" +"else:\n" +" print(f\"{args.x}^{args.y} == {answer}\")" +msgstr "" +"import argparse\n" +"\n" +"parser = argparse.ArgumentParser(description=\"calculate X to the power of Y\")\n" +"group = parser.add_mutually_exclusive_group()\n" +"group.add_argument(\"-v\", \"--verbose\", action=\"store_true\")\n" +"group.add_argument(\"-q\", \"--quiet\", action=\"store_true\")\n" +"parser.add_argument(\"x\", type=int, help=\"the base\")\n" +"parser.add_argument(\"y\", type=int, help=\"the exponent\")\n" +"args = parser.parse_args()\n" +"answer = args.x**args.y\n" +"\n" +"if args.quiet:\n" +" print(answer)\n" +"elif args.verbose:\n" +" print(f\"{args.x} to the power {args.y} equals {answer}\")\n" +"else:\n" +" print(f\"{args.x}^{args.y} == {answer}\")" + +#: ../../howto/argparse.rst:775 +msgid "" +"Note that slight difference in the usage text. Note the ``[-v | -q]``, which" +" tells us that we can either use ``-v`` or ``-q``, but not both at the same " +"time:" +msgstr "" +"请注意用法文本中有细微的差异。注意 ``[-v | -q]``,它的意思是说我们可以使用 ``-v`` 或 ``-q``,但不能同时使用两者:" + +#: ../../howto/argparse.rst:779 ../../howto/argparse.rst:806 +msgid "" +"$ python prog.py --help\n" +"usage: prog.py [-h] [-v | -q] x y\n" +"\n" +"calculate X to the power of Y\n" +"\n" +"positional arguments:\n" +" x the base\n" +" y the exponent\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" -v, --verbose\n" +" -q, --quiet" +msgstr "" +"$ python prog.py --help\n" +"usage: prog.py [-h] [-v | -q] x y\n" +"\n" +"calculate X to the power of Y\n" +"\n" +"positional arguments:\n" +" x the base\n" +" y the exponent\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" -v, --verbose\n" +" -q, --quiet" + +#: ../../howto/argparse.rst:797 +msgid "How to translate the argparse output" +msgstr "如何翻译 argparse 的输出" + +#: ../../howto/argparse.rst:799 +msgid "" +"The output of the :mod:`argparse` module such as its help text and error " +"messages are all made translatable using the :mod:`gettext` module. This " +"allows applications to easily localize messages produced by :mod:`argparse`." +" See also :ref:`i18n-howto`." +msgstr "" +":mod:`argparse` 模块的输出例如它的帮助文本和错误消息都可以通过 :mod:`gettext` 模块实现翻译。这允许应用程序轻松本地化 " +":mod:`argparse` 所产生的消息。另请参见 :ref:`i18n-howto`。" + +#: ../../howto/argparse.rst:804 +msgid "For instance, in this :mod:`argparse` output:" +msgstr "例如,在这个 :mod:`argparse` 输出中:" + +#: ../../howto/argparse.rst:822 +msgid "" +"The strings ``usage:``, ``positional arguments:``, ``options:`` and ``show " +"this help message and exit`` are all translatable." +msgstr "" +"字符串 ``usage:``, ``positional arguments:``, ``options:`` 和 ``show this help " +"message and exit`` 都是可翻译的。" + +#: ../../howto/argparse.rst:825 +msgid "" +"In order to translate these strings, they must first be extracted into a " +"``.po`` file. For example, using `Babel `__, run " +"this command:" +msgstr "" +"要翻译这些字符串,必须先将它们提取到一个 ``.po`` 文件中。例如,使用 `Babel " +"`__,运行这条命令:" + +#: ../../howto/argparse.rst:829 +msgid "$ pybabel extract -o messages.po /usr/lib/python3.12/argparse.py" +msgstr "$ pybabel extract -o messages.po /usr/lib/python3.12/argparse.py" + +#: ../../howto/argparse.rst:833 +msgid "" +"This command will extract all translatable strings from the :mod:`argparse` " +"module and output them into a file named ``messages.po``. This command " +"assumes that your Python installation is in ``/usr/lib``." +msgstr "" +"此命令将从 :mod:`argparse` 模块提取所有可翻译的字符串,并将其输出到名为 ``messages.po`` 的文件中。此命令假定你的 " +"Python 安装位置为 ``/usr/lib``。" + +#: ../../howto/argparse.rst:837 +msgid "" +"You can find out the location of the :mod:`argparse` module on your system " +"using this script::" +msgstr "你可以使用以下脚本查找 :mod:`argparse` 模块在系统中的位置::" + +#: ../../howto/argparse.rst:840 +msgid "" +"import argparse\n" +"print(argparse.__file__)" +msgstr "" +"import argparse\n" +"print(argparse.__file__)" + +#: ../../howto/argparse.rst:843 +msgid "" +"Once the messages in the ``.po`` file are translated and the translations " +"are installed using :mod:`gettext`, :mod:`argparse` will be able to display " +"the translated messages." +msgstr "" +"一旦 ``.po`` 文件中的文本信息翻译完毕并使用 :mod:`gettext` 安装了译文,:mod:`argparse` 将能显示翻译后的信息。" + +#: ../../howto/argparse.rst:847 +msgid "" +"To translate your own strings in the :mod:`argparse` output, use " +":mod:`gettext`." +msgstr "要翻译在 :mod:`argparse` 输出中的字符串,请使用 :mod:`gettext`。" + +#: ../../howto/argparse.rst:850 +msgid "Custom type converters" +msgstr "自定义类型转换器" + +#: ../../howto/argparse.rst:852 +msgid "" +"The :mod:`argparse` module allows you to specify custom type converters for " +"your command-line arguments. This allows you to modify user input before " +"it's stored in the :class:`argparse.Namespace`. This can be useful when you " +"need to pre-process the input before it is used in your program." +msgstr "" +":mod:`argparse` 模块允许您为命令行参数指定自定义类型转换器。这使您能够在用户输入存储在 " +":class:`argparse.Namespace` 中之前对其进行修改。当您需要在程序中使用输入之前对其进行预处理时,这会很有用。" + +#: ../../howto/argparse.rst:857 +msgid "" +"When using a custom type converter, you can use any callable that takes a " +"single string argument (the argument value) and returns the converted value." +" However, if you need to handle more complex scenarios, you can use a custom" +" action class with the **action** parameter instead." +msgstr "" +"使用自定义类型转换器时,您可以使用任何可调用对象,该对象接受单个字符串参数(参数值)并返回转换后的值。但是,如果需要处理更复杂的情况,可以使用带有 " +"**action** 形参的自定义动作类。" + +#: ../../howto/argparse.rst:862 +msgid "" +"For example, let's say you want to handle arguments with different prefixes " +"and process them accordingly::" +msgstr "例如,假设您希望处理带有不同前缀的参数并相应地进行处理::" + +#: ../../howto/argparse.rst:865 +msgid "" +"import argparse\n" +"\n" +"parser = argparse.ArgumentParser(prefix_chars='-+')\n" +"\n" +"parser.add_argument('-a', metavar='', action='append',\n" +" type=lambda x: ('-', x))\n" +"parser.add_argument('+a', metavar='', action='append',\n" +" type=lambda x: ('+', x))\n" +"\n" +"args = parser.parse_args()\n" +"print(args)" +msgstr "" +"import argparse\n" +"\n" +"parser = argparse.ArgumentParser(prefix_chars='-+')\n" +"\n" +"parser.add_argument('-a', metavar='', action='append',\n" +" type=lambda x: ('-', x))\n" +"parser.add_argument('+a', metavar='', action='append',\n" +" type=lambda x: ('+', x))\n" +"\n" +"args = parser.parse_args()\n" +"print(args)" + +#: ../../howto/argparse.rst:879 +msgid "" +"$ python prog.py -a value1 +a value2\n" +"Namespace(a=[('-', 'value1'), ('+', 'value2')])" +msgstr "" +"$ python prog.py -a value1 +a value2\n" +"Namespace(a=[('-', 'value1'), ('+', 'value2')])" + +#: ../../howto/argparse.rst:884 +msgid "In this example, we:" +msgstr "在这个例子中,我们:" + +#: ../../howto/argparse.rst:886 +msgid "" +"Created a parser with custom prefix characters using the ``prefix_chars`` " +"parameter." +msgstr "使用 ``prefix_chars`` 形参创建了带有自定义前缀字符的解析器。" + +#: ../../howto/argparse.rst:889 +msgid "" +"Defined two arguments, ``-a`` and ``+a``, which used the ``type`` parameter " +"to create custom type converters to store the value in a tuple with the " +"prefix." +msgstr "定义了两个参数 ``-a`` 和 ``+a``, 它们使用 ``type`` 形参创建自定义类型转换器,以便将值存储在带有前缀的元组中。" + +#: ../../howto/argparse.rst:892 +msgid "" +"Without the custom type converters, the arguments would have treated the " +"``-a`` and ``+a`` as the same argument, which would have been undesirable. " +"By using custom type converters, we were able to differentiate between the " +"two arguments." +msgstr "" +"如果没有自定义类型转换器,参数会将 ``-a`` 和 ``+a`` 视为同一个参数,这是不可取的。通过使用自定义类型转换器,我们能够区分这两个参数。" + +#: ../../howto/argparse.rst:897 +msgid "Conclusion" +msgstr "后记" + +#: ../../howto/argparse.rst:899 +msgid "" +"The :mod:`argparse` module offers a lot more than shown here. Its docs are " +"quite detailed and thorough, and full of examples. Having gone through this " +"tutorial, you should easily digest them without feeling overwhelmed." +msgstr "" +"除了这里显示的内容,:mod:`argparse` 模块还提供了更多功能。它的文档相当详细和完整,包含大量示例。 " +"完成这个教程之后,你应该能毫不困难地阅读该文档。" diff --git a/howto/clinic.po b/howto/clinic.po new file mode 100644 index 0000000000..7085ecb211 --- /dev/null +++ b/howto/clinic.po @@ -0,0 +1,34 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../howto/clinic.rst:8 +msgid "Argument Clinic How-To" +msgstr "Argument Clinic 的用法" + +#: ../../howto/clinic.rst:13 +msgid "" +"The Argument Clinic How-TO has been moved to the `Python Developer's Guide " +"`__." +msgstr "" +"Argument Clinic 指南已被移至 `Python Developer's Guide " +"`__。" diff --git a/howto/cporting.po b/howto/cporting.po new file mode 100644 index 0000000000..23941837dd --- /dev/null +++ b/howto/cporting.po @@ -0,0 +1,57 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../howto/cporting.rst:7 +msgid "Porting Extension Modules to Python 3" +msgstr "将扩展模块移植到 Python 3" + +#: ../../howto/cporting.rst:9 +msgid "" +"We recommend the following resources for porting extension modules to Python" +" 3:" +msgstr "对于将扩展模块移植到 Python 3,我们推荐下列资源:" + +#: ../../howto/cporting.rst:11 +msgid "" +"The `Migrating C extensions`_ chapter from *Supporting Python 3: An in-depth" +" guide*, a book on moving from Python 2 to Python 3 in general, guides the " +"reader through porting an extension module." +msgstr "" +"*Supporting Python 3: An in-depth guide* 中的 `Migrating C extensions`_ " +"这一章,这本书介绍了如何从 Python 2 迁移到 Python 3,包括指导读者如何移植扩展模块。" + +#: ../../howto/cporting.rst:15 +msgid "" +"The `Porting guide`_ from the *py3c* project provides opinionated " +"suggestions with supporting code." +msgstr "*py3c* 项目中的 `Porting guide`_ 提供了带有配套代码的指导性建议。" + +#: ../../howto/cporting.rst:17 +msgid "" +":ref:`Recommended third party tools ` offer abstractions over " +"the Python's C API. Extensions generally need to be re-written to use one of" +" them, but the library then handles differences between various Python " +"versions and implementations." +msgstr "" +":ref:`推荐的第三方工具 ` 提供了对于 Python 的 C API 的进一步抽象。 " +"扩展通常需要被重写以使用它们中的某一个,而在此之后就可通过库来处理各种 Python 版本和实现之间的差异。" diff --git a/howto/curses.po b/howto/curses.po new file mode 100644 index 0000000000..4776555353 --- /dev/null +++ b/howto/curses.po @@ -0,0 +1,1080 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-06-29 17:42+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../howto/curses.rst:5 +msgid "Curses Programming with Python" +msgstr "用 Python 进行 Curses 编程" + +#: ../../howto/curses.rst:0 +msgid "Author" +msgstr "作者" + +#: ../../howto/curses.rst:9 +msgid "A.M. Kuchling, Eric S. Raymond" +msgstr "A.M. Kuchling, Eric S. Raymond" + +#: ../../howto/curses.rst:0 +msgid "Release" +msgstr "发布版本" + +#: ../../howto/curses.rst:10 +msgid "2.04" +msgstr "2.04" + +#: ../../howto/curses.rst-1 +msgid "Abstract" +msgstr "摘要" + +#: ../../howto/curses.rst:15 +msgid "" +"This document describes how to use the :mod:`curses` extension module to " +"control text-mode displays." +msgstr "本文档介绍了如何使用 :mod:`curses` 扩展模块控制文本模式的显示。" + +#: ../../howto/curses.rst:20 +msgid "What is curses?" +msgstr "curses 是什么?" + +#: ../../howto/curses.rst:22 +msgid "" +"The curses library supplies a terminal-independent screen-painting and " +"keyboard-handling facility for text-based terminals; such terminals include " +"VT100s, the Linux console, and the simulated terminal provided by various " +"programs. Display terminals support various control codes to perform common" +" operations such as moving the cursor, scrolling the screen, and erasing " +"areas. Different terminals use widely differing codes, and often have their" +" own minor quirks." +msgstr "" +"curses 库为基于文本的终端提供了独立于终端的屏幕绘制和键盘处理功能;这些终端包括 VT100,Linux " +"控制台以及各种程序提供的模拟终端。显示终端支持各种控制代码以执行常见的操作,例如移动光标,滚动屏幕和擦除区域。不同的终端使用相差很大的代码,并且往往有自己的小怪癖。" + +#: ../../howto/curses.rst:30 +msgid "" +"In a world of graphical displays, one might ask \"why bother\"? It's true " +"that character-cell display terminals are an obsolete technology, but there " +"are niches in which being able to do fancy things with them are still " +"valuable. One niche is on small-footprint or embedded Unixes that don't run" +" an X server. Another is tools such as OS installers and kernel " +"configurators that may have to run before any graphical support is " +"available." +msgstr "" +"在普遍使用图形显示的世界中,人们可能会问\"为什么要自找麻烦\"?毕竟字符单元显示终端确实是一种过时的技术,但是在某些领域中,能够用它们做花哨的事情仍然很有价值。一个领域是在不运行" +" X server 的小型或嵌入式 Unix 上。另一个是在提供图形支持之前,可能需要运行的工具,例如操作系统安装程序和内核配置程序。" + +#: ../../howto/curses.rst:38 +msgid "" +"The curses library provides fairly basic functionality, providing the " +"programmer with an abstraction of a display containing multiple non-" +"overlapping windows of text. The contents of a window can be changed in " +"various ways---adding text, erasing it, changing its appearance---and the " +"curses library will figure out what control codes need to be sent to the " +"terminal to produce the right output. curses doesn't provide many user-" +"interface concepts such as buttons, checkboxes, or dialogs; if you need such" +" features, consider a user interface library such as :pypi:`Urwid`." +msgstr "" +"curses 库提供了相当基础的功能,为程序员提供了包含多个非重叠文本窗口的显示的抽象。窗口的内容可以通过多种方式更改 --- " +"添加文本、擦除文本、更改其外观 --- 并且 curses 库将确定需要向终端发送哪些控制代码以产生正确的输出。curses " +"并没有提供很多用户界面概念如按钮、复选框或对话框等;如果你需要这些特性,请考虑某种用户界面库例如 :pypi:`Urwid`。" + +#: ../../howto/curses.rst:48 +msgid "" +"The curses library was originally written for BSD Unix; the later System V " +"versions of Unix from AT&T added many enhancements and new functions. BSD " +"curses is no longer maintained, having been replaced by ncurses, which is an" +" open-source implementation of the AT&T interface. If you're using an open-" +"source Unix such as Linux or FreeBSD, your system almost certainly uses " +"ncurses. Since most current commercial Unix versions are based on System V " +"code, all the functions described here will probably be available. The " +"older versions of curses carried by some proprietary Unixes may not support " +"everything, though." +msgstr "" +"curses 库最初是为 BSD Unix 编写的。后来 AT&T 的 Unix System V 版本加入了许多增强功能和新功能。如今 BSD " +"curses 已不再维护,被 ncurses 取代,ncurses 是 AT&T 接口的开源实现。如果使用的是 Linux 或 FreeBSD 等开源 " +"Unix 系统,则几乎肯定会使用 ncurses。由于大多数当前的商业 Unix 版本都基于 System V " +"代码,因此这里描述的所有功能可能都可用。但是,某些专有 Unix 所带来的较早版本的 curses 可能无法支持所有功能。" + +#: ../../howto/curses.rst:58 +msgid "" +"The Windows version of Python doesn't include the :mod:`curses` module. The " +"third-party :pypi:`windows-curses` package provides the same interface on " +"Windows." +msgstr "" + +#: ../../howto/curses.rst:63 +msgid "The Python curses module" +msgstr "Python 的 curses 模块" + +#: ../../howto/curses.rst:65 +msgid "" +"The Python module is a fairly simple wrapper over the C functions provided " +"by curses; if you're already familiar with curses programming in C, it's " +"really easy to transfer that knowledge to Python. The biggest difference is" +" that the Python interface makes things simpler by merging different C " +"functions such as :c:func:`!addstr`, :c:func:`!mvaddstr`, and " +":c:func:`!mvwaddstr` into a single :meth:`~curses.window.addstr` method. " +"You'll see this covered in more detail later." +msgstr "" +"此 Python 模块是对 curses 所提供的 C 函数的一个相当简单的包装器;如果你已经熟悉在 C 中进行 curses 编程,把这些知识转移到 " +"Python 是非常容易的。最大的差异在于 Python 接口通过将不同的 C 函数比如 :c:func:`!addstr`, " +":c:func:`!mvaddstr` 和 :c:func:`!mvwaddstr` 合并为一个 " +":meth:`~curses.window.addstr` 方法让事情变得更简单。你将在稍后看到更详细的介绍。" + +#: ../../howto/curses.rst:73 +msgid "" +"This HOWTO is an introduction to writing text-mode programs with curses and " +"Python. It doesn't attempt to be a complete guide to the curses API; for " +"that, see the Python library guide's section on ncurses, and the C manual " +"pages for ncurses. It will, however, give you the basic ideas." +msgstr "" +"本 HOWTO 是关于使用 curses 和 Python 编写文本模式程序的概述。它并不被设计为一个 curses API " +"的完整指南;如需完整指南,请参见 ncurses 的 Python 库指南章节和 ncurses 的 C 手册页。相对地,本 HOWTO " +"将会给你一些基本思路。" + +#: ../../howto/curses.rst:80 +msgid "Starting and ending a curses application" +msgstr "开始和结束 curses 应用程序" + +#: ../../howto/curses.rst:82 +msgid "" +"Before doing anything, curses must be initialized. This is done by calling " +"the :func:`~curses.initscr` function, which will determine the terminal " +"type, send any required setup codes to the terminal, and create various " +"internal data structures. If successful, :func:`!initscr` returns a window " +"object representing the entire screen; this is usually called ``stdscr`` " +"after the name of the corresponding C variable. ::" +msgstr "" +"在做任何事情之前,curses 必须被初始化。这是通过调用 :func:`~curses.initscr` " +"函数来完成的,它将确定终端的类型,向终端发送任何必须的设置代码,并创建多种内部数据结构。如果执行成功,:func:`!initscr` " +"将返回一个代表整个屏幕的窗口对象;它通常会按照对应的 C 变量被称为 ``stdscr``。::" + +#: ../../howto/curses.rst:90 +msgid "" +"import curses\n" +"stdscr = curses.initscr()" +msgstr "" +"import curses\n" +"stdscr = curses.initscr()" + +#: ../../howto/curses.rst:93 +msgid "" +"Usually curses applications turn off automatic echoing of keys to the " +"screen, in order to be able to read keys and only display them under certain" +" circumstances. This requires calling the :func:`~curses.noecho` function. " +"::" +msgstr "" +"使用 curses 的应用程序通常会关闭按键自动上屏,目的是读取按键并只在特定情况下展示它们。这需要调用函数 " +":func:`~curses.noecho`.::" + +#: ../../howto/curses.rst:98 +msgid "curses.noecho()" +msgstr "curses.noecho()" + +#: ../../howto/curses.rst:100 +msgid "" +"Applications will also commonly need to react to keys instantly, without " +"requiring the Enter key to be pressed; this is called cbreak mode, as " +"opposed to the usual buffered input mode. ::" +msgstr "应用程序也会广泛地需要立即响应按键,而不需要按下回车键;这被称为\"cbreak\"模式,与通常的缓冲输入模式相对。::" + +#: ../../howto/curses.rst:104 +msgid "curses.cbreak()" +msgstr "curses.cbreak()" + +#: ../../howto/curses.rst:106 +msgid "" +"Terminals usually return special keys, such as the cursor keys or navigation" +" keys such as Page Up and Home, as a multibyte escape sequence. While you " +"could write your application to expect such sequences and process them " +"accordingly, curses can do it for you, returning a special value such as " +":const:`curses.KEY_LEFT`. To get curses to do the job, you'll have to " +"enable keypad mode. ::" +msgstr "" +"终端通常会以多字节转义序列的形式返回特殊按键,比如光标键和导航键比如 Page Up 键和 Home " +"键。尽管你可以编写你的程序来应对这些序列,curses 能够代替你做到这件事,返回一个特殊值比如 " +":const:`curses.KEY_LEFT`。为了让 curses 做这项工作,你需要启用 keypad 模式。::" + +#: ../../howto/curses.rst:113 +msgid "stdscr.keypad(True)" +msgstr "stdscr.keypad(True)" + +#: ../../howto/curses.rst:115 +msgid "" +"Terminating a curses application is much easier than starting one. You'll " +"need to call::" +msgstr "终止一个 curses 应用程序比建立一个容易得多,你只需要调用::" + +#: ../../howto/curses.rst:118 +msgid "" +"curses.nocbreak()\n" +"stdscr.keypad(False)\n" +"curses.echo()" +msgstr "" +"curses.nocbreak()\n" +"stdscr.keypad(False)\n" +"curses.echo()" + +#: ../../howto/curses.rst:122 +msgid "" +"to reverse the curses-friendly terminal settings. Then call the " +":func:`~curses.endwin` function to restore the terminal to its original " +"operating mode. ::" +msgstr "" +"来还原对终端作出的 curses 友好设置。然后,调用函数 :func:`~curses.endwin` 来将终端还原到它的原始操作模式。::" + +#: ../../howto/curses.rst:126 +msgid "curses.endwin()" +msgstr "curses.endwin()" + +#: ../../howto/curses.rst:128 +msgid "" +"A common problem when debugging a curses application is to get your terminal" +" messed up when the application dies without restoring the terminal to its " +"previous state. In Python this commonly happens when your code is buggy and" +" raises an uncaught exception. Keys are no longer echoed to the screen when" +" you type them, for example, which makes using the shell difficult." +msgstr "" +"调试一个 curses 应用程序时常会发生,一个应用程序还未能还原终端到原本的状态就意外退出了,这会搅乱你的终端。在 Python " +"中这常常会发生在你的代码中有 bug 并引发了一个未捕获的异常。当你尝试输入时按键不会上屏,这使得使用终端变得困难。" + +#: ../../howto/curses.rst:134 +msgid "" +"In Python you can avoid these complications and make debugging much easier " +"by importing the :func:`curses.wrapper` function and using it like this::" +msgstr "" +"在 Python 中你可以避免这些复杂问题并让调试变得更简单,只需要导入 :func:`curses.wrapper` 函数并像这样使用它::" + +#: ../../howto/curses.rst:137 +msgid "" +"from curses import wrapper\n" +"\n" +"def main(stdscr):\n" +" # Clear screen\n" +" stdscr.clear()\n" +"\n" +" # This raises ZeroDivisionError when i == 10.\n" +" for i in range(0, 11):\n" +" v = i-10\n" +" stdscr.addstr(i, 0, '10 divided by {} is {}'.format(v, 10/v))\n" +"\n" +" stdscr.refresh()\n" +" stdscr.getkey()\n" +"\n" +"wrapper(main)" +msgstr "" +"from curses import wrapper\n" +"\n" +"def main(stdscr):\n" +" # 清空屏幕\n" +" stdscr.clear()\n" +"\n" +" # 当 i == 10 时这将引发 ZeroDivisionError。\n" +" for i in range(0, 11):\n" +" v = i-10\n" +" stdscr.addstr(i, 0, '10 divided by {} is {}'.format(v, 10/v))\n" +"\n" +" stdscr.refresh()\n" +" stdscr.getkey()\n" +"\n" +"wrapper(main)" + +#: ../../howto/curses.rst:153 +msgid "" +"The :func:`~curses.wrapper` function takes a callable object and does the " +"initializations described above, also initializing colors if color support " +"is present. :func:`!wrapper` then runs your provided callable. Once the " +"callable returns, :func:`!wrapper` will restore the original state of the " +"terminal. The callable is called inside a :keyword:`try`...\\ " +":keyword:`except` that catches exceptions, restores the state of the " +"terminal, and then re-raises the exception. Therefore your terminal won't " +"be left in a funny state on exception and you'll be able to read the " +"exception's message and traceback." +msgstr "" +":func:`~curses.wrapper` 函数接受一个可调用对象并进行上述的初始化过程,如果终端支持彩色还会初始化颜色。接下来 " +":func:`!wrapper` 会运行你提供的可调用对象。当该可调用对象返回时,:func:`!wrapper` 将恢复终端的初始状态。 " +"该可调用对象会在 :keyword:`try`...\\ :keyword:`except` 内被调用以捕获异常,恢复终端状态,然后重新引发该异常。 " +"这样你的终端将不会在发生异常时处于不正常状态,你将能够读取异常的消息和回溯。" + +#: ../../howto/curses.rst:165 +msgid "Windows and Pads" +msgstr "窗口和面板" + +#: ../../howto/curses.rst:167 +msgid "" +"Windows are the basic abstraction in curses. A window object represents a " +"rectangular area of the screen, and supports methods to display text, erase " +"it, allow the user to input strings, and so forth." +msgstr "窗口是 curses 中的基本抽象。一个窗口对象表示了屏幕上的一个矩形区域,并且提供方法来显示文本、擦除文本、允许用户输入字符串等等。" + +#: ../../howto/curses.rst:171 +msgid "" +"The ``stdscr`` object returned by the :func:`~curses.initscr` function is a " +"window object that covers the entire screen. Many programs may need only " +"this single window, but you might wish to divide the screen into smaller " +"windows, in order to redraw or clear them separately. The " +":func:`~curses.newwin` function creates a new window of a given size, " +"returning the new window object. ::" +msgstr "" +"函数 :func:`~curses.initscr` 返回的 ``stdscr`` " +"对象覆盖整个屏幕。许多程序可能只需要这一个窗口,但你可能希望把屏幕分割为多个更小的窗口,来分别重绘或者清除它们。函数 " +":func:`~curses.newwin` 根据给定的尺寸创建一个新窗口,并返回这个新的窗口对象。::" + +#: ../../howto/curses.rst:178 +msgid "" +"begin_x = 20; begin_y = 7\n" +"height = 5; width = 40\n" +"win = curses.newwin(height, width, begin_y, begin_x)" +msgstr "" +"begin_x = 20; begin_y = 7\n" +"height = 5; width = 40\n" +"win = curses.newwin(height, width, begin_y, begin_x)" + +#: ../../howto/curses.rst:182 +msgid "" +"Note that the coordinate system used in curses is unusual. Coordinates are " +"always passed in the order *y,x*, and the top-left corner of a window is " +"coordinate (0,0). This breaks the normal convention for handling " +"coordinates where the *x* coordinate comes first. This is an unfortunate " +"difference from most other computer applications, but it's been part of " +"curses since it was first written, and it's too late to change things now." +msgstr "" +"注意 curses 使用的坐标系统与寻常的不同。坐标始终是以 *y,x* 的顺序传递,并且左上角是坐标 (0,0)。这打破了正常的坐标处理约定,即 " +"*x* 坐标在前。这是一个与其他大多数计算机应用程序之间令人遗憾的差异,但这从 curses 最初被编写出来就已是它的一部分,现在想要修改它已为时已晚。" + +#: ../../howto/curses.rst:190 +msgid "" +"Your application can determine the size of the screen by using the " +":data:`curses.LINES` and :data:`curses.COLS` variables to obtain the *y* and" +" *x* sizes. Legal coordinates will then extend from ``(0,0)`` to " +"``(curses.LINES - 1, curses.COLS - 1)``." +msgstr "" +"你的应用程序能够查明屏幕的尺寸,:data:`curses.LINES` 和 :data:`curses.COLS` 分别代表了 *y* 和 *x* " +"方向上的尺寸。合理的坐标应位于 ``(0,0)`` 到 ``(curses.LINES - 1, curses.COLS - 1)`` 范围内。" + +#: ../../howto/curses.rst:195 +msgid "" +"When you call a method to display or erase text, the effect doesn't " +"immediately show up on the display. Instead you must call the " +":meth:`~curses.window.refresh` method of window objects to update the " +"screen." +msgstr "" +"当你调用一个方法来显示或擦除文本时,效果并不会立即显示。相反,你必须调用窗口对象的 :meth:`~curses.window.refresh` " +"方法来更新屏幕。" + +#: ../../howto/curses.rst:200 +msgid "" +"This is because curses was originally written with slow 300-baud terminal " +"connections in mind; with these terminals, minimizing the time required to " +"redraw the screen was very important. Instead curses accumulates changes to" +" the screen and displays them in the most efficient manner when you call " +":meth:`!refresh`. For example, if your program displays some text in a " +"window and then clears the window, there's no need to send the original text" +" because they're never visible." +msgstr "" +"这是因为 curses 最初是针对 300 波特的龟速终端连接编写的;在这些终端上,减少重绘屏幕的时间非常重要。相应地当你调用 " +":meth:`!refresh` 时 curses 会累积对屏幕的修改并以最高效的方式显示它们。 " +"打个比方,如果你的程序在某个窗口内显示一些文本然后清空了该窗口,那么就没有必要发送这些原始文本因为它们从来都不可见。" + +#: ../../howto/curses.rst:209 +msgid "" +"In practice, explicitly telling curses to redraw a window doesn't really " +"complicate programming with curses much. Most programs go into a flurry of " +"activity, and then pause waiting for a keypress or some other action on the " +"part of the user. All you have to do is to be sure that the screen has been" +" redrawn before pausing to wait for user input, by first calling " +":meth:`!stdscr.refresh` or the :meth:`!refresh` method of some other " +"relevant window." +msgstr "" +"在实践中,显式地告诉 curses 重绘一个窗口并不会真的让 curses 复杂多少。 " +"大部分程序会进行一系列活动,然后暂停并等待按键或者用户方的其他动作。你要做的事情就是保证屏幕在暂停并等待用户输入之前已被重绘,具体方式是首先调用 " +":meth:`!stdscr.refresh` 或其他相关窗口的 :meth:`!refresh` 方法。" + +#: ../../howto/curses.rst:217 +msgid "" +"A pad is a special case of a window; it can be larger than the actual " +"display screen, and only a portion of the pad displayed at a time. Creating " +"a pad requires the pad's height and width, while refreshing a pad requires " +"giving the coordinates of the on-screen area where a subsection of the pad " +"will be displayed. ::" +msgstr "" +"一个面板是一种特殊的窗口,它可以比实际的显示屏幕更大,并且能只显示它的一部分。创建面板需要指定面板的高度和宽度,但刷新一个面板需要给出屏幕坐标和面板需要显示的局部。::" + +#: ../../howto/curses.rst:223 +msgid "" +"pad = curses.newpad(100, 100)\n" +"# These loops fill the pad with letters; addch() is\n" +"# explained in the next section\n" +"for y in range(0, 99):\n" +" for x in range(0, 99):\n" +" pad.addch(y,x, ord('a') + (x*x+y*y) % 26)\n" +"\n" +"# Displays a section of the pad in the middle of the screen.\n" +"# (0,0) : coordinate of upper-left corner of pad area to display.\n" +"# (5,5) : coordinate of upper-left corner of window area to be filled\n" +"# with pad content.\n" +"# (20, 75) : coordinate of lower-right corner of window area to be\n" +"# : filled with pad content.\n" +"pad.refresh( 0,0, 5,5, 20,75)" +msgstr "" +"pad = curses.newpad(100, 100)\n" +"# 这个循环使用字母填充 pad;addch() 函数将在下一部分解释\n" +"for y in range(0, 99):\n" +" for x in range(0, 99):\n" +" pad.addch(y,x, ord('a') + (x*x+y*y) % 26)\n" +"\n" +"# 在屏幕中央显示 pad 的某个区域。\n" +"# (0,0) :要显示的 pad 区域的左上角坐标。\n" +"# (5,5) :要填充到窗口的左上角坐标。\n" +"# (20, 75) :填充到窗口的右下角坐标。\n" +"pad.refresh( 0,0, 5,5, 20,75)" + +#: ../../howto/curses.rst:238 +msgid "" +"The :meth:`!refresh` call displays a section of the pad in the rectangle " +"extending from coordinate (5,5) to coordinate (20,75) on the screen; the " +"upper left corner of the displayed section is coordinate (0,0) on the pad. " +"Beyond that difference, pads are exactly like ordinary windows and support " +"the same methods." +msgstr "" +"此 :meth:`!refresh` 调用会在屏幕坐标 (5,5) 到坐标 (20,75) 的矩形范围内显示面板的一个部分;被显示部分在面板上的坐标是 " +"(0,0)。除了上述差异,面板非常像是普通窗口并支持相同的方法。" + +#: ../../howto/curses.rst:244 +msgid "" +"If you have multiple windows and pads on screen there is a more efficient " +"way to update the screen and prevent annoying screen flicker as each part of" +" the screen gets updated. :meth:`!refresh` actually does two things:" +msgstr "" +"如果你在屏幕上有多个窗口和面板那么有个更高效的方式来更新屏幕并防止屏幕的每部分被更新时出现烦人的屏幕闪烁。:meth:`!refresh` " +"实际上做了两件事:" + +#: ../../howto/curses.rst:249 +msgid "" +"Calls the :meth:`~curses.window.noutrefresh` method of each window to update" +" an underlying data structure representing the desired state of the screen." +msgstr "调用每个窗口的 :meth:`~curses.window.noutrefresh` 方法来更新一个表达屏幕期望状态的底层的数据结构。" + +#: ../../howto/curses.rst:252 +msgid "" +"Calls the function :func:`~curses.doupdate` function to change the physical " +"screen to match the desired state recorded in the data structure." +msgstr "调用函数 :func:`~curses.doupdate` 来改变物理屏幕来符合这个数据结构中记录的期望状态。" + +#: ../../howto/curses.rst:255 +msgid "" +"Instead you can call :meth:`!noutrefresh` on a number of windows to update " +"the data structure, and then call :func:`!doupdate` to update the screen." +msgstr "" +"你可以改为在多个窗口上调用 :meth:`!noutrefresh` 来更新该数据结构,然后调用 :func:`!doupdate` 来更新屏幕。" + +#: ../../howto/curses.rst:261 +msgid "Displaying Text" +msgstr "显示文字" + +#: ../../howto/curses.rst:263 +msgid "" +"From a C programmer's point of view, curses may sometimes look like a twisty" +" maze of functions, all subtly different. For example, :c:func:`!addstr` " +"displays a string at the current cursor location in the ``stdscr`` window, " +"while :c:func:`!mvaddstr` moves to a given y,x coordinate first before " +"displaying the string. :c:func:`!waddstr` is just like :c:func:`!addstr`, " +"but allows specifying a window to use instead of using ``stdscr`` by " +"default. :c:func:`!mvwaddstr` allows specifying both a window and a " +"coordinate." +msgstr "" +"从一名 C 程序员的视角来看,curses 有时看起来就像是一堆函数组成的迷宫,每个都有细微的差异。举个例子,:c:func:`!addstr` 是在 " +"``stdscr`` 窗口的当前光标位置显示一个字符串,而 :c:func:`!mvaddstr` 则是在显示字符串之前先移动到给定的 y,x 坐标。 " +":c:func:`!waddstr` 与 :c:func:`!addstr` 很像,但允许指定一个要使用的窗口而不是默认使用 ``stdscr``。 " +":c:func:`!mvwaddstr` 允许同时指定一个窗口和一个坐标。" + +#: ../../howto/curses.rst:272 +msgid "" +"Fortunately the Python interface hides all these details. ``stdscr`` is a " +"window object like any other, and methods such as " +":meth:`~curses.window.addstr` accept multiple argument forms. Usually there" +" are four different forms." +msgstr "" +"幸运的是,Python 接口隐藏了所有这些细节。``stdscr`` 和其他任何窗口一样是一个窗口对象,并且诸如 " +":meth:`~curses.window.addstr` 之类的方法接受多种参数形式。通常有四种形式。" + +#: ../../howto/curses.rst:278 +msgid "Form" +msgstr "形式" + +#: ../../howto/curses.rst:278 ../../howto/curses.rst:346 +msgid "Description" +msgstr "描述" + +#: ../../howto/curses.rst:280 +msgid "*str* or *ch*" +msgstr "*str* 或 *ch*" + +#: ../../howto/curses.rst:280 +msgid "Display the string *str* or character *ch* at the current position" +msgstr "在当前位置显示字符串 *str* 或字符 *ch*" + +#: ../../howto/curses.rst:283 +msgid "*str* or *ch*, *attr*" +msgstr "*str* 或 *ch*, *attr*" + +#: ../../howto/curses.rst:283 +msgid "" +"Display the string *str* or character *ch*, using attribute *attr* at the " +"current position" +msgstr "在当前位置使用 *attr* 属性显示字符串 *str* 或字符 *ch*" + +#: ../../howto/curses.rst:287 +msgid "*y*, *x*, *str* or *ch*" +msgstr "*y*, *x*, *str* 或 *ch*" + +#: ../../howto/curses.rst:287 +msgid "Move to position *y,x* within the window, and display *str* or *ch*" +msgstr "移动到窗口内的 *y,x* 位置,并显示 *str* 或 *ch*" + +#: ../../howto/curses.rst:290 +msgid "*y*, *x*, *str* or *ch*, *attr*" +msgstr "*y*, *x*, *str* 或 *ch*, *attr*" + +#: ../../howto/curses.rst:290 +msgid "" +"Move to position *y,x* within the window, and display *str* or *ch*, using " +"attribute *attr*" +msgstr "移至窗口内的 *y,x* 位置,并使用 *attr* 属性显示 *str* 或 *ch*" + +#: ../../howto/curses.rst:294 +msgid "" +"Attributes allow displaying text in highlighted forms such as boldface, " +"underline, reverse code, or in color. They'll be explained in more detail " +"in the next subsection." +msgstr "属性允许以突出显示形态显示文本,比如加粗、下划线、反相或添加颜色。这些属性将在下一小节详细说明。" + +#: ../../howto/curses.rst:299 +msgid "" +"The :meth:`~curses.window.addstr` method takes a Python string or bytestring" +" as the value to be displayed. The contents of bytestrings are sent to the " +"terminal as-is. Strings are encoded to bytes using the value of the " +"window's :attr:`~window.encoding` attribute; this defaults to the default " +"system encoding as returned by :func:`locale.getencoding`." +msgstr "" +":meth:`~curses.window.addstr` 方法接受一个 Python 字符串或字节串作为要显示的值。字节串的内容会被原样发送到终端。 " +"字符串会使用窗口的 :attr:`~window.encoding` 属性值指定的编码格式编码为字节串;该值默认为 " +":func:`locale.getencoding` 所返回的系统编码格式。" + +#: ../../howto/curses.rst:305 +msgid "" +"The :meth:`~curses.window.addch` methods take a character, which can be " +"either a string of length 1, a bytestring of length 1, or an integer." +msgstr "" +"方法 :meth:`~curses.window.addch` 接受一个字符,可以是长度为 1 的字符串,长度为 1 的字节串或者一个整数。" + +#: ../../howto/curses.rst:308 +msgid "" +"Constants are provided for extension characters; these constants are " +"integers greater than 255. For example, :const:`ACS_PLMINUS` is a +/- " +"symbol, and :const:`ACS_ULCORNER` is the upper left corner of a box (handy " +"for drawing borders). You can also use the appropriate Unicode character." +msgstr "" +"对于特殊扩展字符有一些常量,这些常量是大于 255 的整数。比如,:const:`ACS_PLMINUS` 是一个“加减” " +"符号,:const:`ACS_ULCORNER` 是一个框的左上角(方便绘制边界)。你也可以使用正确的 Unicode 字符。" + +#: ../../howto/curses.rst:314 +msgid "" +"Windows remember where the cursor was left after the last operation, so if " +"you leave out the *y,x* coordinates, the string or character will be " +"displayed wherever the last operation left off. You can also move the " +"cursor with the ``move(y,x)`` method. Because some terminals always display" +" a flashing cursor, you may want to ensure that the cursor is positioned in " +"some location where it won't be distracting; it can be confusing to have the" +" cursor blinking at some apparently random location." +msgstr "" +"窗口会记住上次操作之后光标所在位置,所以如果你忽略 *y,x* 坐标,字符串和字符会出现在上次操作结束的位置。你也可以通过 ``move(y,x)`` " +"的方法来移动光标。因为一些终端始终会显示一个闪烁的光标,你可能会想要保证光标处于一些不会让人感到分心的位置。在看似随机的位置出现一个闪烁的光标会令人非常迷惑。" + +#: ../../howto/curses.rst:322 +msgid "" +"If your application doesn't need a blinking cursor at all, you can call " +"``curs_set(False)`` to make it invisible. For compatibility with older " +"curses versions, there's a ``leaveok(bool)`` function that's a synonym for " +":func:`~curses.curs_set`. When *bool* is true, the curses library will " +"attempt to suppress the flashing cursor, and you won't need to worry about " +"leaving it in odd locations." +msgstr "" +"如果你的应用程序完全不需要一个闪烁的光标,你可以调用 ``curs_set(False)`` 来使它隐形。为与旧版本 curses " +"的兼容性的关系,有函数 ``leaveok(bool)`` 作为 :func:`~curses.curs_set` 的等价替换。如果 *bool* " +"是真值,curses 库会尝试移除闪烁光标,并且你也不必担心它会留在一些奇怪的位置。" + +#: ../../howto/curses.rst:331 +msgid "Attributes and Color" +msgstr "属性和颜色" + +#: ../../howto/curses.rst:333 +msgid "" +"Characters can be displayed in different ways. Status lines in a text-based" +" application are commonly shown in reverse video, or a text viewer may need " +"to highlight certain words. curses supports this by allowing you to specify" +" an attribute for each cell on the screen." +msgstr "" +"字符可以以不同的方式显示。基于文本的应用程序常常以反相显示状态行,一个文本查看器可能需要突出显示某些单词。为了支持这种用法,curses " +"允许你为屏幕上的每个单元指定一个属性值。" + +#: ../../howto/curses.rst:338 +msgid "" +"An attribute is an integer, each bit representing a different attribute. " +"You can try to display text with multiple attribute bits set, but curses " +"doesn't guarantee that all the possible combinations are available, or that " +"they're all visually distinct. That depends on the ability of the terminal " +"being used, so it's safest to stick to the most commonly available " +"attributes, listed here." +msgstr "" +"属性值是一个整数,它的每一个二进制位代表一个不同的属性。你可以尝试以多种属性位组合来显示文本,但 curses " +"不保证所有的组合都是有效的,或者看上去有明显不同。这一点取决于用户终端的能力,所以最稳妥的方式是只采用最常见的有效属性,见下表。" + +#: ../../howto/curses.rst:346 +msgid "Attribute" +msgstr "属性" + +#: ../../howto/curses.rst:348 +msgid ":const:`A_BLINK`" +msgstr ":const:`A_BLINK`" + +#: ../../howto/curses.rst:348 +msgid "Blinking text" +msgstr "闪烁文本" + +#: ../../howto/curses.rst:350 +msgid ":const:`A_BOLD`" +msgstr ":const:`A_BOLD`" + +#: ../../howto/curses.rst:350 +msgid "Extra bright or bold text" +msgstr "超亮或粗体文本" + +#: ../../howto/curses.rst:352 +msgid ":const:`A_DIM`" +msgstr ":const:`A_DIM`" + +#: ../../howto/curses.rst:352 +msgid "Half bright text" +msgstr "半明亮文本" + +#: ../../howto/curses.rst:354 +msgid ":const:`A_REVERSE`" +msgstr ":const:`A_REVERSE`" + +#: ../../howto/curses.rst:354 +msgid "Reverse-video text" +msgstr "反相显示文本" + +#: ../../howto/curses.rst:356 +msgid ":const:`A_STANDOUT`" +msgstr ":const:`A_STANDOUT`" + +#: ../../howto/curses.rst:356 +msgid "The best highlighting mode available" +msgstr "可用的最佳突出显示模式" + +#: ../../howto/curses.rst:358 +msgid ":const:`A_UNDERLINE`" +msgstr ":const:`A_UNDERLINE`" + +#: ../../howto/curses.rst:358 +msgid "Underlined text" +msgstr "带下划线的文本" + +#: ../../howto/curses.rst:361 +msgid "" +"So, to display a reverse-video status line on the top line of the screen, " +"you could code::" +msgstr "所以,为了在屏幕顶部显示一个反相的状态行,你可以这么编写::" + +#: ../../howto/curses.rst:364 +msgid "" +"stdscr.addstr(0, 0, \"Current mode: Typing mode\",\n" +" curses.A_REVERSE)\n" +"stdscr.refresh()" +msgstr "" +"stdscr.addstr(0, 0, \"Current mode: Typing mode\",\n" +" curses.A_REVERSE)\n" +"stdscr.refresh()" + +#: ../../howto/curses.rst:368 +msgid "" +"The curses library also supports color on those terminals that provide it. " +"The most common such terminal is probably the Linux console, followed by " +"color xterms." +msgstr "curses 库还支持在提供了颜色功能的终端上显示颜色。最常见的此类终端很可能是 Linux 控制台,其次是支持彩色的 xterm。" + +#: ../../howto/curses.rst:372 +msgid "" +"To use color, you must call the :func:`~curses.start_color` function soon " +"after calling :func:`~curses.initscr`, to initialize the default color set " +"(the :func:`curses.wrapper` function does this automatically). Once that's " +"done, the :func:`~curses.has_colors` function returns TRUE if the terminal " +"in use can actually display color. (Note: curses uses the American spelling" +" 'color', instead of the Canadian/British spelling 'colour'. If you're used" +" to the British spelling, you'll have to resign yourself to misspelling it " +"for the sake of these functions.)" +msgstr "" +"为了使用颜色,你必须在调用完函数 :func:`~curses.initscr` 后尽快调用函数 " +":func:`~curses.start_color`,来初始化默认颜色集 (:func:`curses.wrapper` 函数自动完成了这一点)。 " +"当它完成后,如果使用中的终端支持显示颜色, :func:`~curses.has_colors` 会返回真值。 (注意:curses 使用美式拼写 " +"“color”,而不是英式/加拿大拼写“colour”。如果你习惯了英式拼写,你需要避免自己在这些函数上拼写错误。)" + +#: ../../howto/curses.rst:382 +msgid "" +"The curses library maintains a finite number of color pairs, containing a " +"foreground (or text) color and a background color. You can get the " +"attribute value corresponding to a color pair with the " +":func:`~curses.color_pair` function; this can be bitwise-OR'ed with other " +"attributes such as :const:`A_REVERSE`, but again, such combinations are not " +"guaranteed to work on all terminals." +msgstr "" +"curses 库维护一个有限数量的颜色对,包括一个前景(文本)色和一个背景色。你可以使用函数 :func:`~curses.color_pair` " +"获得一个颜色对对应的属性值。它可以通过按位或运算与其他属性,比如 :const:`A_REVERSE` " +"组合。但再说明一遍,这种组合并不保证在所有终端上都有效。" + +#: ../../howto/curses.rst:389 +msgid "An example, which displays a line of text using color pair 1::" +msgstr "一个样例,用 1 号颜色对显示一行文本::" + +#: ../../howto/curses.rst:391 +msgid "" +"stdscr.addstr(\"Pretty text\", curses.color_pair(1))\n" +"stdscr.refresh()" +msgstr "" +"stdscr.addstr(\"Pretty text\", curses.color_pair(1))\n" +"stdscr.refresh()" + +#: ../../howto/curses.rst:394 +msgid "" +"As I said before, a color pair consists of a foreground and background " +"color. The ``init_pair(n, f, b)`` function changes the definition of color " +"pair *n*, to foreground color f and background color b. Color pair 0 is " +"hard-wired to white on black, and cannot be changed." +msgstr "" +"如前所述,颜色对由前景色和背景色组成。``init_pair(n, f, b)`` 函数可改变颜色对 *n* 的定义为前景色 f 和背景色 b。颜色对 " +"0 硬编码为黑底白字,不能改变。" + +#: ../../howto/curses.rst:399 +msgid "" +"Colors are numbered, and :func:`start_color` initializes 8 basic colors when" +" it activates color mode. They are: 0:black, 1:red, 2:green, 3:yellow, " +"4:blue, 5:magenta, 6:cyan, and 7:white. The :mod:`curses` module defines " +"named constants for each of these colors: :const:`curses.COLOR_BLACK`, " +":const:`curses.COLOR_RED`, and so forth." +msgstr "" +"颜色是有编号的,当 :func:`start_color` 激活颜色模式时会初始化 8 种基本颜色。它们是:0:black, 1:red, " +"2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan 和 7:white。:mod:`curses` " +"模块为这些颜色定义了相应的名称常量::const:`curses.COLOR_BLACK`, :const:`curses.COLOR_RED` 等等。" + +#: ../../howto/curses.rst:405 +msgid "" +"Let's put all this together. To change color 1 to red text on a white " +"background, you would call::" +msgstr "让我们来做个综合练习。要将颜色 1 改为红色文本白色背景,你应当调用::" + +#: ../../howto/curses.rst:408 +msgid "curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE)" +msgstr "curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE)" + +#: ../../howto/curses.rst:410 +msgid "" +"When you change a color pair, any text already displayed using that color " +"pair will change to the new colors. You can also display new text in this " +"color with::" +msgstr "当你改变一个颜色对时,任何已经使用该颜色对来显示的文本将会更改为新的颜色。你还可以这样来显示新颜色的文本::" + +#: ../../howto/curses.rst:414 +msgid "stdscr.addstr(0,0, \"RED ALERT!\", curses.color_pair(1))" +msgstr "stdscr.addstr(0,0, \"RED ALERT!\", curses.color_pair(1))" + +#: ../../howto/curses.rst:416 +msgid "" +"Very fancy terminals can change the definitions of the actual colors to a " +"given RGB value. This lets you change color 1, which is usually red, to " +"purple or blue or any other color you like. Unfortunately, the Linux " +"console doesn't support this, so I'm unable to try it out, and can't provide" +" any examples. You can check if your terminal can do this by calling " +":func:`~curses.can_change_color`, which returns ``True`` if the capability " +"is there. If you're lucky enough to have such a talented terminal, consult " +"your system's man pages for more information." +msgstr "" +"某些非常花哨的终端可以将实际颜色定义修改为给定的 RGB 值。这允许你将通常为红色的 1 号颜色改成紫色或蓝色或者任何你喜欢的颜色。 " +"不幸的是,Linux 控制台不支持此特性,所以我无法尝试它,也无法提供任何示例。想要检查你的终端是否能做到你可以调用 " +":func:`~curses.can_change_color`,如果有此功能则它将返回 ``True``。 " +"如果你幸运地拥有一个如此优秀的终端,请查询你的系统的帮助页面来了解详情。" + +#: ../../howto/curses.rst:427 +msgid "User Input" +msgstr "用户输入" + +#: ../../howto/curses.rst:429 +msgid "" +"The C curses library offers only very simple input mechanisms. Python's " +":mod:`curses` module adds a basic text-input widget. (Other libraries such " +"as :pypi:`Urwid` have more extensive collections of widgets.)" +msgstr "" +"C curses 库只提供了非常简单的输入机制。Python 的 :mod:`curses` 模块增加了一个基本的文本输入控件。 (其他的库如 " +":pypi:`Urwid` 拥有更丰富的控件集。)" + +#: ../../howto/curses.rst:433 +msgid "There are two methods for getting input from a window:" +msgstr "有两个方法可以从窗口获取输入:" + +#: ../../howto/curses.rst:435 +msgid "" +":meth:`~curses.window.getch` refreshes the screen and then waits for the " +"user to hit a key, displaying the key if :func:`~curses.echo` has been " +"called earlier. You can optionally specify a coordinate to which the cursor" +" should be moved before pausing." +msgstr "" +":meth:`~curses.window.getch` 会刷新屏幕然后等待用户按键,如果之前调用过 :func:`~curses.echo` " +"还会显示所按的键。你还可以选择指定一个坐标以便在暂停之前让光标移动到那里。" + +#: ../../howto/curses.rst:440 +msgid "" +":meth:`~curses.window.getkey` does the same thing but converts the integer " +"to a string. Individual characters are returned as 1-character strings, and" +" special keys such as function keys return longer strings containing a key " +"name such as ``KEY_UP`` or ``^G``." +msgstr "" +":meth:`~curses.window.getkey` 将做同样的事但是会把整数转换为字符串。每个字符将返回为长度为 1 " +"个字符的字符串,特殊键例如函数键将返回包含键名的较长字符串例如 ``KEY_UP`` 或 ``^G``。" + +#: ../../howto/curses.rst:445 +msgid "" +"It's possible to not wait for the user using the " +":meth:`~curses.window.nodelay` window method. After ``nodelay(True)``, " +":meth:`!getch` and :meth:`!getkey` for the window become non-blocking. To " +"signal that no input is ready, :meth:`!getch` returns ``curses.ERR`` (a " +"value of -1) and :meth:`!getkey` raises an exception. There's also a " +":func:`~curses.halfdelay` function, which can be used to (in effect) set a " +"timer on each :meth:`!getch`; if no input becomes available within a " +"specified delay (measured in tenths of a second), curses raises an " +"exception." +msgstr "" +"使用 :meth:`~curses.window.nodelay` 窗口方法可以不等待用户操作。在 ``nodelay(True)`` 之后,窗口的 " +":meth:`!getch` 和 :meth:`!getkey` 将成为非阻塞的。为表明输入未就绪,:meth:`!getch` 会返回 " +"``curses.ERR`` (值为 -1) 并且 :meth:`!getkey` 会引发异常。此外还有 " +":func:`~curses.halfdelay` 函数,它可被用来 (实际地) 在每个 :meth:`!getch` " +"上设置一个计时器;如果在指定的延迟内 (以十分之一秒为单位) 输入还不可用,curses 将引发异常。" + +#: ../../howto/curses.rst:455 +msgid "" +"The :meth:`!getch` method returns an integer; if it's between 0 and 255, it " +"represents the ASCII code of the key pressed. Values greater than 255 are " +"special keys such as Page Up, Home, or the cursor keys. You can compare the " +"value returned to constants such as :const:`curses.KEY_PPAGE`, " +":const:`curses.KEY_HOME`, or :const:`curses.KEY_LEFT`. The main loop of " +"your program may look something like this::" +msgstr "" +":meth:`!getch` 方法返回一个整数;如果其值在 0 到 255 之间,它代表所按的键的 ASCII 码。大于 255 的值为特殊键例如 " +"Page Up, Home 或方向键等。你可以将返回的值与 :const:`curses.KEY_PPAGE`, " +":const:`curses.KEY_HOME` 或 :const:`curses.KEY_LEFT` 等常量做比较。 " +"你的程序的主循环看起来可能会像这样::" + +#: ../../howto/curses.rst:462 +msgid "" +"while True:\n" +" c = stdscr.getch()\n" +" if c == ord('p'):\n" +" PrintDocument()\n" +" elif c == ord('q'):\n" +" break # Exit the while loop\n" +" elif c == curses.KEY_HOME:\n" +" x = y = 0" +msgstr "" +"while True:\n" +" c = stdscr.getch()\n" +" if c == ord('p'):\n" +" PrintDocument()\n" +" elif c == ord('q'):\n" +" break # 退出 while 循环\n" +" elif c == curses.KEY_HOME:\n" +" x = y = 0" + +#: ../../howto/curses.rst:471 +msgid "" +"The :mod:`curses.ascii` module supplies ASCII class membership functions " +"that take either integer or 1-character string arguments; these may be " +"useful in writing more readable tests for such loops. It also supplies " +"conversion functions that take either integer or 1-character-string " +"arguments and return the same type. For example, :func:`curses.ascii.ctrl` " +"returns the control character corresponding to its argument." +msgstr "" +":mod:`curses.ascii` 模块提供了一些 ASCII 类成员函数,它们接受整数或长度为 1 " +"个字符的字符串参数;这些函数在为这样的循环编写更具可读性的测试时可能会很有用。它还提供了一些转换函数,它们接受整数或长度为 1 " +"个字符的字符串参数并返回同样的类型。例如,:func:`curses.ascii.ctrl` 返回与其参数相对应的控制字符。" + +#: ../../howto/curses.rst:478 +msgid "" +"There's also a method to retrieve an entire string, " +":meth:`~curses.window.getstr`. It isn't used very often, because its " +"functionality is quite limited; the only editing keys available are the " +"backspace key and the Enter key, which terminates the string. It can " +"optionally be limited to a fixed number of characters. ::" +msgstr "" +"还有一个可以提取整个字符串的方法 :meth:`~curses.window.getstr`。它并不经常被使用,因为它的功能相当受限;可用的编辑键只有 " +"Backspace 键和 Enter 键,后者会结束字符串。也可以选择限制为固定数量的字符。::" + +#: ../../howto/curses.rst:484 +msgid "" +"curses.echo() # Enable echoing of characters\n" +"\n" +"# Get a 15-character string, with the cursor on the top line\n" +"s = stdscr.getstr(0,0, 15)" +msgstr "" +"curses.echo() # 启用字符回显\n" +"\n" +"# 获取一个 15 个字符的字符串,光标位于顶端行\n" +"s = stdscr.getstr(0,0, 15)" + +#: ../../howto/curses.rst:489 +msgid "" +"The :mod:`curses.textpad` module supplies a text box that supports an Emacs-" +"like set of keybindings. Various methods of the " +":class:`~curses.textpad.Textbox` class support editing with input validation" +" and gathering the edit results either with or without trailing spaces. " +"Here's an example::" +msgstr "" +":mod:`curses.textpad` 模块提供了一个文本框,它支持类似 Emacs 的键绑定集。 " +":class:`~curses.textpad.Textbox` 类的各种方法支持带输入验证的编辑及包含或不包含末尾空格地收集编辑结果。 " +"下面是一个例子::" + +#: ../../howto/curses.rst:495 +msgid "" +"import curses\n" +"from curses.textpad import Textbox, rectangle\n" +"\n" +"def main(stdscr):\n" +" stdscr.addstr(0, 0, \"Enter IM message: (hit Ctrl-G to send)\")\n" +"\n" +" editwin = curses.newwin(5,30, 2,1)\n" +" rectangle(stdscr, 1,0, 1+5+1, 1+30+1)\n" +" stdscr.refresh()\n" +"\n" +" box = Textbox(editwin)\n" +"\n" +" # Let the user edit until Ctrl-G is struck.\n" +" box.edit()\n" +"\n" +" # Get resulting contents\n" +" message = box.gather()" +msgstr "" +"import curses\n" +"from curses.textpad import Textbox, rectangle\n" +"\n" +"def main(stdscr):\n" +" stdscr.addstr(0, 0, \"Enter IM message: (hit Ctrl-G to send)\")\n" +"\n" +" editwin = curses.newwin(5,30, 2,1)\n" +" rectangle(stdscr, 1,0, 1+5+1, 1+30+1)\n" +" stdscr.refresh()\n" +"\n" +" box = Textbox(editwin)\n" +"\n" +" # 让用户编辑直到按下 Ctrl-G。\n" +" box.edit()\n" +"\n" +" # 获取结果内容\n" +" message = box.gather()" + +#: ../../howto/curses.rst:513 +msgid "" +"See the library documentation on :mod:`curses.textpad` for more details." +msgstr "请查看 :mod:`curses.textpad` 的库文档了解更多细节。" + +#: ../../howto/curses.rst:517 +msgid "For More Information" +msgstr "更多的信息" + +#: ../../howto/curses.rst:519 +msgid "" +"This HOWTO doesn't cover some advanced topics, such as reading the contents " +"of the screen or capturing mouse events from an xterm instance, but the " +"Python library page for the :mod:`curses` module is now reasonably complete." +" You should browse it next." +msgstr "" +"本 HOWTO 没有涵盖一些进阶主题,例如读取屏幕的内容或从 xterm 实例捕获鼠标事件等,但是 :mod:`curses` 模块的 Python " +"库文档页面现在已相当完善。接下来你应当去浏览一下其中的内容。" + +#: ../../howto/curses.rst:524 +msgid "" +"If you're in doubt about the detailed behavior of the curses functions, " +"consult the manual pages for your curses implementation, whether it's " +"ncurses or a proprietary Unix vendor's. The manual pages will document any " +"quirks, and provide complete lists of all the functions, attributes, and " +":ref:`ACS_\\* ` characters available to you." +msgstr "" +"如果你对 curses 函数的细节行为有疑问,请查看你的 curses 具体实现的指南页面不论它是 ncurses 还是特定 Unix 厂商的版本。 " +"指南页面将写明各种怪异问题,并为你提供所有函数、属性及可用 :ref:`ACS_\\* ` 字符的完整列表。" + +#: ../../howto/curses.rst:531 +msgid "" +"Because the curses API is so large, some functions aren't supported in the " +"Python interface. Often this isn't because they're difficult to implement, " +"but because no one has needed them yet. Also, Python doesn't yet support " +"the menu library associated with ncurses. Patches adding support for these " +"would be welcome; see `the Python Developer's Guide " +"`_ to learn more about submitting patches to " +"Python." +msgstr "" +"由于 curses API 是如此的庞大,某些函数并不被 Python 接口所支持。这往往不是因为它们难以实现,而是因为还没有人需要它们。 " +"此外,Python 尚不支持与 ncurses 相关联的菜单库。欢迎提供添加这些功能的补丁;请参阅 `Python 开发者指南 " +"`_ 了解有关为 Python 提交补丁的详情。" + +#: ../../howto/curses.rst:539 +msgid "" +"`Writing Programs with NCURSES `_: a lengthy tutorial for C " +"programmers." +msgstr "" +"`Writing Programs with NCURSES `_: 一个面向 C 程序员的详细教程。" + +#: ../../howto/curses.rst:541 +msgid "`The ncurses man page `_" +msgstr "`ncurses 手册主页 `_" + +#: ../../howto/curses.rst:542 +msgid "" +"`The ncurses FAQ `_" +msgstr "" +"`ncurses 常见问题 `_" + +#: ../../howto/curses.rst:543 +msgid "" +"`\"Use curses... don't swear\" " +"`_: video of a PyCon 2013 talk " +"on controlling terminals using curses or Urwid." +msgstr "" +"`\"使用 curses... 请勿爆粗\" `_: " +"一场有关使用 curses 或 Urwid 来控制终端的 PyCon 2013 演讲的视频。" + +#: ../../howto/curses.rst:545 +msgid "" +"`\"Console Applications with Urwid\" " +"`_: video of" +" a PyCon CA 2012 talk demonstrating some applications written using Urwid." +msgstr "" +"`\"使用 Urwid 的控制台应用程序\" `_: 一场演示使用 Urwid 编写应用程序的 PyCon CA 2012 演讲的视频。" diff --git a/howto/descriptor.po b/howto/descriptor.po new file mode 100644 index 0000000000..4d2675e096 --- /dev/null +++ b/howto/descriptor.po @@ -0,0 +1,2572 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:00+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../howto/descriptor.rst:5 +msgid "Descriptor Guide" +msgstr "描述器指南" + +#: ../../howto/descriptor.rst:0 +msgid "Author" +msgstr "作者" + +#: ../../howto/descriptor.rst:7 +msgid "Raymond Hettinger" +msgstr "Raymond Hettinger(译者:wh2099 at outlook dot com)" + +#: ../../howto/descriptor.rst:0 +msgid "Contact" +msgstr "联系方式" + +#: ../../howto/descriptor.rst:8 +msgid "" +msgstr "" + +#: ../../howto/descriptor.rst:11 +msgid "Contents" +msgstr "目录" + +#: ../../howto/descriptor.rst:13 +msgid "" +":term:`Descriptors ` let objects customize attribute lookup, " +"storage, and deletion." +msgstr ":term:`描述器 ` 让对象能够自定义属性查找、存储和删除的操作。" + +#: ../../howto/descriptor.rst:16 +msgid "This guide has four major sections:" +msgstr "本指南主要分为四个部分:" + +#: ../../howto/descriptor.rst:18 +msgid "" +"The \"primer\" gives a basic overview, moving gently from simple examples, " +"adding one feature at a time. Start here if you're new to descriptors." +msgstr "“入门”部分从简单的示例着手,逐步添加特性,从而给出基本的概述。如果你是刚接触到描述器,请从这里开始。" + +#: ../../howto/descriptor.rst:21 +msgid "" +"The second section shows a complete, practical descriptor example. If you " +"already know the basics, start there." +msgstr "第二部分展示了完整的、实用的描述器示例。如果您已经掌握了基础知识,请从此处开始。" + +#: ../../howto/descriptor.rst:24 +msgid "" +"The third section provides a more technical tutorial that goes into the " +"detailed mechanics of how descriptors work. Most people don't need this " +"level of detail." +msgstr "第三部分提供了更多技术教程,详细介绍了描述器如何工作。大多数人并不需要深入到这种程度。" + +#: ../../howto/descriptor.rst:28 +msgid "" +"The last section has pure Python equivalents for built-in descriptors that " +"are written in C. Read this if you're curious about how functions turn into" +" bound methods or about the implementation of common tools like " +":func:`classmethod`, :func:`staticmethod`, :func:`property`, and " +":term:`__slots__`." +msgstr "" +"最后一部分有对内置描述器(用 C 编写)的纯 Python 等价实现。如果您想了解函数如何变成绑定方法或对 :func:`classmethod`, " +":func:`staticmethod`,:func:`property` 和 :term:`__slots__` " +"这类常见工具的实现感兴趣,请阅读此部分。" + +#: ../../howto/descriptor.rst:36 +msgid "Primer" +msgstr "入门" + +#: ../../howto/descriptor.rst:38 +msgid "" +"In this primer, we start with the most basic possible example and then we'll" +" add new capabilities one by one." +msgstr "现在,让我们从最基本的示例开始,然后逐步添加新功能。" + +#: ../../howto/descriptor.rst:43 +msgid "Simple example: A descriptor that returns a constant" +msgstr "简单示例:返回常量的描述器" + +#: ../../howto/descriptor.rst:45 +msgid "" +"The :class:`!Ten` class is a descriptor whose :meth:`~object.__get__` method" +" always returns the constant ``10``:" +msgstr ":class:`!Ten` 类是一个描述器,其 :meth:`~object.__get__` 方法始终返回常量 ``10``:" + +#: ../../howto/descriptor.rst:48 +msgid "" +"class Ten:\n" +" def __get__(self, obj, objtype=None):\n" +" return 10" +msgstr "" +"class Ten:\n" +" def __get__(self, obj, objtype=None):\n" +" return 10" + +#: ../../howto/descriptor.rst:54 +msgid "" +"To use the descriptor, it must be stored as a class variable in another " +"class:" +msgstr "要使用描述器,它必须作为一个类变量存储在另一个类中:" + +#: ../../howto/descriptor.rst:56 +msgid "" +"class A:\n" +" x = 5 # Regular class attribute\n" +" y = Ten() # Descriptor instance" +msgstr "" +"class A:\n" +" x = 5 # 常规类属性\n" +" y = Ten() # 描述器实例" + +#: ../../howto/descriptor.rst:62 +msgid "" +"An interactive session shows the difference between normal attribute lookup " +"and descriptor lookup:" +msgstr "用交互式会话查看普通属性查找和描述器查找之间的区别:" + +#: ../../howto/descriptor.rst:65 +msgid "" +">>> a = A() # Make an instance of class A\n" +">>> a.x # Normal attribute lookup\n" +"5\n" +">>> a.y # Descriptor lookup\n" +"10" +msgstr "" +">>> a = A() # 创建一个类 A 的实例\n" +">>> a.x # 正常属性查找\n" +"5\n" +">>> a.y # 描述器查找\n" +"10" + +#: ../../howto/descriptor.rst:73 +msgid "" +"In the ``a.x`` attribute lookup, the dot operator finds ``'x': 5`` in the " +"class dictionary. In the ``a.y`` lookup, the dot operator finds a " +"descriptor instance, recognized by its ``__get__`` method. Calling that " +"method returns ``10``." +msgstr "" +"在 ``a.x`` 属性查找中,点运算符会找到存储在类字典中的 ``'x': 5``。在 ``a.y`` 查找中,点运算符会根据描述器实例的 " +"``__get__`` 方法将其识别出来,调用该方法并返回 ``10``。" + +#: ../../howto/descriptor.rst:78 +msgid "" +"Note that the value ``10`` is not stored in either the class dictionary or " +"the instance dictionary. Instead, the value ``10`` is computed on demand." +msgstr "请注意,值 ``10`` 既不存储在类字典中也不存储在实例字典中。相反,值 ``10`` 是在调用时才取到的。" + +#: ../../howto/descriptor.rst:81 +msgid "" +"This example shows how a simple descriptor works, but it isn't very useful. " +"For retrieving constants, normal attribute lookup would be better." +msgstr "这个简单的例子展示了一个描述器是如何工作的,但它不是很有用。在查找常量时,用常规属性查找会更好。" + +#: ../../howto/descriptor.rst:84 +msgid "" +"In the next section, we'll create something more useful, a dynamic lookup." +msgstr "在下一节中,我们将创建更有用的东西,即动态查找。" + +#: ../../howto/descriptor.rst:88 +msgid "Dynamic lookups" +msgstr "动态查找" + +#: ../../howto/descriptor.rst:90 +msgid "" +"Interesting descriptors typically run computations instead of returning " +"constants:" +msgstr "有趣的描述器通常运行计算而不是返回常量:" + +#: ../../howto/descriptor.rst:93 +msgid "" +"import os\n" +"\n" +"class DirectorySize:\n" +"\n" +" def __get__(self, obj, objtype=None):\n" +" return len(os.listdir(obj.dirname))\n" +"\n" +"class Directory:\n" +"\n" +" size = DirectorySize() # Descriptor instance\n" +"\n" +" def __init__(self, dirname):\n" +" self.dirname = dirname # Regular instance attribute" +msgstr "" +"import os\n" +"\n" +"class DirectorySize:\n" +"\n" +" def __get__(self, obj, objtype=None):\n" +" return len(os.listdir(obj.dirname))\n" +"\n" +"class Directory:\n" +"\n" +" size = DirectorySize() # 描述器实例\n" +"\n" +" def __init__(self, dirname):\n" +" self.dirname = dirname # 常规实例属性" + +#: ../../howto/descriptor.rst:109 +msgid "" +"An interactive session shows that the lookup is dynamic — it computes " +"different, updated answers each time::" +msgstr "交互式会话显示查找是动态的,每次都会计算不同的,经过更新的返回值::" + +#: ../../howto/descriptor.rst:112 +msgid "" +">>> s = Directory('songs')\n" +">>> g = Directory('games')\n" +">>> s.size # The songs directory has twenty files\n" +"20\n" +">>> g.size # The games directory has three files\n" +"3\n" +">>> os.remove('games/chess') # Delete a game\n" +">>> g.size # File count is automatically updated\n" +"2" +msgstr "" +">>> s = Directory('songs')\n" +">>> g = Directory('games')\n" +">>> s.size # songs 目录有二十个文件\n" +"20\n" +">>> g.size # games 目录有三个文件\n" +"3\n" +">>> os.remove('games/chess') # 删除一个游戏\n" +">>> g.size # 文件计数将自动更新\n" +"2" + +#: ../../howto/descriptor.rst:122 +msgid "" +"Besides showing how descriptors can run computations, this example also " +"reveals the purpose of the parameters to :meth:`~object.__get__`. The " +"*self* parameter is *size*, an instance of *DirectorySize*. The *obj* " +"parameter is either *g* or *s*, an instance of *Directory*. It is the *obj*" +" parameter that lets the :meth:`~object.__get__` method learn the target " +"directory. The *objtype* parameter is the class *Directory*." +msgstr "" +"除了说明描述器如何运行计算,这个例子也揭示了传给 :meth:`~object.__get__` 的形参的目的。 *self* 形参为 " +"*size*,即一个 *DirectorySize* 的实例。 *obj* 形参为 *g* 或 *s*,即一个 *Directory* 的实例。 " +"*obj* 形参让 :meth:`~object.__get__` 方法获知目标目录。 *objtype* 形参为 *Directory* 类。" + +#: ../../howto/descriptor.rst:131 +msgid "Managed attributes" +msgstr "托管属性" + +#: ../../howto/descriptor.rst:133 +msgid "" +"A popular use for descriptors is managing access to instance data. The " +"descriptor is assigned to a public attribute in the class dictionary while " +"the actual data is stored as a private attribute in the instance dictionary." +" The descriptor's :meth:`~object.__get__` and :meth:`~object.__set__` " +"methods are triggered when the public attribute is accessed." +msgstr "" +"描述器的一种流行用法是管理对实例数据的访问。描述器被分配给类字典中的公有属性,而实际数据则作为私有属性存储在实例字典中。描述器的 " +":meth:`~object.__get__` 和 :meth:`~object.__set__` 方法会在公有属性被访问时被触发。" + +#: ../../howto/descriptor.rst:139 +msgid "" +"In the following example, *age* is the public attribute and *_age* is the " +"private attribute. When the public attribute is accessed, the descriptor " +"logs the lookup or update:" +msgstr "在下面的例子中,*age* 是公开属性,*_age* 是私有属性。当访问公开属性时,描述器会记录下查找或更新的日志:" + +#: ../../howto/descriptor.rst:143 +msgid "" +"import logging\n" +"\n" +"logging.basicConfig(level=logging.INFO)\n" +"\n" +"class LoggedAgeAccess:\n" +"\n" +" def __get__(self, obj, objtype=None):\n" +" value = obj._age\n" +" logging.info('Accessing %r giving %r', 'age', value)\n" +" return value\n" +"\n" +" def __set__(self, obj, value):\n" +" logging.info('Updating %r to %r', 'age', value)\n" +" obj._age = value\n" +"\n" +"class Person:\n" +"\n" +" age = LoggedAgeAccess() # Descriptor instance\n" +"\n" +" def __init__(self, name, age):\n" +" self.name = name # Regular instance attribute\n" +" self.age = age # Calls __set__()\n" +"\n" +" def birthday(self):\n" +" self.age += 1 # Calls both __get__() and __set__()" +msgstr "" +"import logging\n" +"\n" +"logging.basicConfig(level=logging.INFO)\n" +"\n" +"class LoggedAgeAccess:\n" +"\n" +" def __get__(self, obj, objtype=None):\n" +" value = obj._age\n" +" logging.info('Accessing %r giving %r', 'age', value)\n" +" return value\n" +"\n" +" def __set__(self, obj, value):\n" +" logging.info('Updating %r to %r', 'age', value)\n" +" obj._age = value\n" +"\n" +"class Person:\n" +"\n" +" age = LoggedAgeAccess() # 描述器实例\n" +"\n" +" def __init__(self, name, age):\n" +" self.name = name # 常规实例属性\n" +" self.age = age # 调用 __set__()\n" +"\n" +" def birthday(self):\n" +" self.age += 1 # 调用 __get__() 和 __set__()" + +#: ../../howto/descriptor.rst:172 +msgid "" +"An interactive session shows that all access to the managed attribute *age* " +"is logged, but that the regular attribute *name* is not logged:" +msgstr "交互式会话展示中,对托管属性 *age* 的所有访问都被记录了下来,但常规属性 *name* 则未被记录:" + +#: ../../howto/descriptor.rst:181 +msgid "" +">>> mary = Person('Mary M', 30) # The initial age update is logged\n" +"INFO:root:Updating 'age' to 30\n" +">>> dave = Person('David D', 40)\n" +"INFO:root:Updating 'age' to 40\n" +"\n" +">>> vars(mary) # The actual data is in a private attribute\n" +"{'name': 'Mary M', '_age': 30}\n" +">>> vars(dave)\n" +"{'name': 'David D', '_age': 40}\n" +"\n" +">>> mary.age # Access the data and log the lookup\n" +"INFO:root:Accessing 'age' giving 30\n" +"30\n" +">>> mary.birthday() # Updates are logged as well\n" +"INFO:root:Accessing 'age' giving 30\n" +"INFO:root:Updating 'age' to 31\n" +"\n" +">>> dave.name # Regular attribute lookup isn't logged\n" +"'David D'\n" +">>> dave.age # Only the managed attribute is logged\n" +"INFO:root:Accessing 'age' giving 40\n" +"40" +msgstr "" +">>> mary = Person('Mary M', 30) # 初始年龄更新会被记录\n" +"INFO:root:Updating 'age' to 30\n" +">>> dave = Person('David D', 40)\n" +"INFO:root:Updating 'age' to 40\n" +"\n" +">>> vars(mary) # 私有属性中的实际数据\n" +"{'name': 'Mary M', '_age': 30}\n" +">>> vars(dave)\n" +"{'name': 'David D', '_age': 40}\n" +"\n" +">>> mary.age # 访问数据并记录查找操作\n" +"INFO:root:Accessing 'age' giving 30\n" +"30\n" +">>> mary.birthday() # 更新也会被记录\n" +"INFO:root:Accessing 'age' giving 30\n" +"INFO:root:Updating 'age' to 31\n" +"\n" +">>> dave.name # 常规属性查找不会被记录\n" +"'David D'\n" +">>> dave.age # 只有被管理的属性会被记录\n" +"INFO:root:Accessing 'age' giving 40\n" +"40" + +#: ../../howto/descriptor.rst:206 +msgid "" +"One major issue with this example is that the private name *_age* is " +"hardwired in the *LoggedAgeAccess* class. That means that each instance can" +" only have one logged attribute and that its name is unchangeable. In the " +"next example, we'll fix that problem." +msgstr "" +"此示例的一个主要问题是私有名称 *_age* 在类 *LoggedAgeAccess* " +"中是硬耦合的。这意味着每个实例只能有一个用于记录的属性,并且其名称不可更改。在下一个示例中,我们将解决这个问题。" + +#: ../../howto/descriptor.rst:213 +msgid "Customized names" +msgstr "定制名称" + +#: ../../howto/descriptor.rst:215 +msgid "" +"When a class uses descriptors, it can inform each descriptor about which " +"variable name was used." +msgstr "当一个类使用描述器时,它可以告知每个描述器使用了什么变量名。" + +#: ../../howto/descriptor.rst:218 +msgid "" +"In this example, the :class:`!Person` class has two descriptor instances, " +"*name* and *age*. When the :class:`!Person` class is defined, it makes a " +"callback to :meth:`~object.__set_name__` in *LoggedAccess* so that the field" +" names can be recorded, giving each descriptor its own *public_name* and " +"*private_name*:" +msgstr "" +"在此示例中,:class:`!Person` 类具有两个描述器实例 *name* 和 *age*。当 :class:`!Person` " +"类被定义时,它将在 *LoggedAccess* 中执行对 :meth:`~object.__set_name__` " +"的回调以便记录字段名称,给予每个描述器自己的 *public_name* 和 *private_name*:" + +#: ../../howto/descriptor.rst:223 +msgid "" +"import logging\n" +"\n" +"logging.basicConfig(level=logging.INFO)\n" +"\n" +"class LoggedAccess:\n" +"\n" +" def __set_name__(self, owner, name):\n" +" self.public_name = name\n" +" self.private_name = '_' + name\n" +"\n" +" def __get__(self, obj, objtype=None):\n" +" value = getattr(obj, self.private_name)\n" +" logging.info('Accessing %r giving %r', self.public_name, value)\n" +" return value\n" +"\n" +" def __set__(self, obj, value):\n" +" logging.info('Updating %r to %r', self.public_name, value)\n" +" setattr(obj, self.private_name, value)\n" +"\n" +"class Person:\n" +"\n" +" name = LoggedAccess() # First descriptor instance\n" +" age = LoggedAccess() # Second descriptor instance\n" +"\n" +" def __init__(self, name, age):\n" +" self.name = name # Calls the first descriptor\n" +" self.age = age # Calls the second descriptor\n" +"\n" +" def birthday(self):\n" +" self.age += 1" +msgstr "" +"import logging\n" +"\n" +"logging.basicConfig(level=logging.INFO)\n" +"\n" +"class LoggedAccess:\n" +"\n" +" def __set_name__(self, owner, name):\n" +" self.public_name = name\n" +" self.private_name = '_' + name\n" +"\n" +" def __get__(self, obj, objtype=None):\n" +" value = getattr(obj, self.private_name)\n" +" logging.info('Accessing %r giving %r', self.public_name, value)\n" +" return value\n" +"\n" +" def __set__(self, obj, value):\n" +" logging.info('Updating %r to %r', self.public_name, value)\n" +" setattr(obj, self.private_name, value)\n" +"\n" +"class Person:\n" +"\n" +" name = LoggedAccess() # 第一个描述器实例\n" +" age = LoggedAccess() # 第二个描述器实例\n" +"\n" +" def __init__(self, name, age):\n" +" self.name = name # 调用第一个描述器\n" +" self.age = age # 调用第二个描述器\n" +"\n" +" def birthday(self):\n" +" self.age += 1" + +#: ../../howto/descriptor.rst:256 +msgid "" +"An interactive session shows that the :class:`!Person` class has called " +":meth:`~object.__set_name__` so that the field names would be recorded. " +"Here we call :func:`vars` to look up the descriptor without triggering it:" +msgstr "" +"交互式会话显示 :class:`!Person` 类调用了 :meth:`~object.__set_name__` 以使字段名称可被记录。 " +"在这里我们调用 :func:`vars` 来查找描述器而不触发它:" + +#: ../../howto/descriptor.rst:260 +msgid "" +">>> vars(vars(Person)['name'])\n" +"{'public_name': 'name', 'private_name': '_name'}\n" +">>> vars(vars(Person)['age'])\n" +"{'public_name': 'age', 'private_name': '_age'}" +msgstr "" +">>> vars(vars(Person)['name'])\n" +"{'public_name': 'name', 'private_name': '_name'}\n" +">>> vars(vars(Person)['age'])\n" +"{'public_name': 'age', 'private_name': '_age'}" + +#: ../../howto/descriptor.rst:267 +msgid "The new class now logs access to both *name* and *age*:" +msgstr "现在,新类会记录对 *name* 和 *age* 二者的访问:" + +#: ../../howto/descriptor.rst:275 +msgid "" +">>> pete = Person('Peter P', 10)\n" +"INFO:root:Updating 'name' to 'Peter P'\n" +"INFO:root:Updating 'age' to 10\n" +">>> kate = Person('Catherine C', 20)\n" +"INFO:root:Updating 'name' to 'Catherine C'\n" +"INFO:root:Updating 'age' to 20" +msgstr "" +">>> pete = Person('Peter P', 10)\n" +"INFO:root:Updating 'name' to 'Peter P'\n" +"INFO:root:Updating 'age' to 10\n" +">>> kate = Person('Catherine C', 20)\n" +"INFO:root:Updating 'name' to 'Catherine C'\n" +"INFO:root:Updating 'age' to 20" + +#: ../../howto/descriptor.rst:284 +msgid "The two *Person* instances contain only the private names:" +msgstr "这两个 *Person* 实例仅包含私有名称:" + +#: ../../howto/descriptor.rst:286 +msgid "" +">>> vars(pete)\n" +"{'_name': 'Peter P', '_age': 10}\n" +">>> vars(kate)\n" +"{'_name': 'Catherine C', '_age': 20}" +msgstr "" +">>> vars(pete)\n" +"{'_name': 'Peter P', '_age': 10}\n" +">>> vars(kate)\n" +"{'_name': 'Catherine C', '_age': 20}" + +#: ../../howto/descriptor.rst:295 +msgid "Closing thoughts" +msgstr "结束语" + +#: ../../howto/descriptor.rst:297 +msgid "" +"A :term:`descriptor` is what we call any object that defines " +":meth:`~object.__get__`, :meth:`~object.__set__`, or " +":meth:`~object.__delete__`." +msgstr "" +":term:`descriptor` 是指任何定义了 :meth:`~object.__get__`, :meth:`~object.__set__` " +"或 :meth:`~object.__delete__` 的对象。" + +#: ../../howto/descriptor.rst:300 +msgid "" +"Optionally, descriptors can have a :meth:`~object.__set_name__` method. " +"This is only used in cases where a descriptor needs to know either the class" +" where it was created or the name of class variable it was assigned to. " +"(This method, if present, is called even if the class is not a descriptor.)" +msgstr "" +"作为可选项,描述器可以有 :meth:`~object.__set_name__` 方法。 " +"这仅会被用于当描述器需要知道创建它的类或它被分配的类变量名称等场合。 (此方法如果存在,那么即使所在类并不是一个描述器仍会被调用。)" + +#: ../../howto/descriptor.rst:305 +msgid "" +"Descriptors get invoked by the dot operator during attribute lookup. If a " +"descriptor is accessed indirectly with " +"``vars(some_class)[descriptor_name]``, the descriptor instance is returned " +"without invoking it." +msgstr "" +"在属性查找期间,描述器由点运算符调用。如果使用 ``vars(some_class)[descriptor_name]`` " +"间接访问描述器,则返回描述器实例而不调用它。" + +#: ../../howto/descriptor.rst:309 +msgid "" +"Descriptors only work when used as class variables. When put in instances, " +"they have no effect." +msgstr "描述器仅在用作类变量时起作用。放入实例时,它们将失效。" + +#: ../../howto/descriptor.rst:312 +msgid "" +"The main motivation for descriptors is to provide a hook allowing objects " +"stored in class variables to control what happens during attribute lookup." +msgstr "描述器的主要目的是提供一个挂钩,允许存储在类变量中的对象控制在属性查找期间发生的情况。" + +#: ../../howto/descriptor.rst:315 +msgid "" +"Traditionally, the calling class controls what happens during lookup. " +"Descriptors invert that relationship and allow the data being looked-up to " +"have a say in the matter." +msgstr "传统上,调用类控制查找过程中发生的事情。描述器反转了这种关系,并允许正在被查询的数据对此进行干涉。" + +#: ../../howto/descriptor.rst:319 +msgid "" +"Descriptors are used throughout the language. It is how functions turn into" +" bound methods. Common tools like :func:`classmethod`, " +":func:`staticmethod`, :func:`property`, and " +":func:`functools.cached_property` are all implemented as descriptors." +msgstr "" +"描述器的使用贯穿了整个语言。就是它让函数变成绑定方法。常见工具诸如 :func:`classmethod`, " +":func:`staticmethod`,:func:`property` 和 :func:`functools.cached_property` " +"都作为描述器实现。" + +#: ../../howto/descriptor.rst:326 +msgid "Complete Practical Example" +msgstr "完整的实际例子" + +#: ../../howto/descriptor.rst:328 +msgid "" +"In this example, we create a practical and powerful tool for locating " +"notoriously hard to find data corruption bugs." +msgstr "在此示例中,我们创建了一个实用而强大的工具来查找难以发现的数据损坏错误。" + +#: ../../howto/descriptor.rst:333 +msgid "Validator class" +msgstr "验证器类" + +#: ../../howto/descriptor.rst:335 +msgid "" +"A validator is a descriptor for managed attribute access. Prior to storing " +"any data, it verifies that the new value meets various type and range " +"restrictions. If those restrictions aren't met, it raises an exception to " +"prevent data corruption at its source." +msgstr "" +"验证器是一个用于托管属性访问的描述器。在存储任何数据之前,它会验证新值是否满足各种类型和范围限制。如果不满足这些限制,它将引发异常,从源头上防止数据损坏。" + +#: ../../howto/descriptor.rst:340 +msgid "" +"This :class:`!Validator` class is both an :term:`abstract base class` and a " +"managed attribute descriptor:" +msgstr "" +"这个 :class:`!Validator` 类既是一个 :term:`abstract base class` 也是一个被管理的属性描述器:" + +#: ../../howto/descriptor.rst:343 +msgid "" +"from abc import ABC, abstractmethod\n" +"\n" +"class Validator(ABC):\n" +"\n" +" def __set_name__(self, owner, name):\n" +" self.private_name = '_' + name\n" +"\n" +" def __get__(self, obj, objtype=None):\n" +" return getattr(obj, self.private_name)\n" +"\n" +" def __set__(self, obj, value):\n" +" self.validate(value)\n" +" setattr(obj, self.private_name, value)\n" +"\n" +" @abstractmethod\n" +" def validate(self, value):\n" +" pass" +msgstr "" +"from abc import ABC, abstractmethod\n" +"\n" +"class Validator(ABC):\n" +"\n" +" def __set_name__(self, owner, name):\n" +" self.private_name = '_' + name\n" +"\n" +" def __get__(self, obj, objtype=None):\n" +" return getattr(obj, self.private_name)\n" +"\n" +" def __set__(self, obj, value):\n" +" self.validate(value)\n" +" setattr(obj, self.private_name, value)\n" +"\n" +" @abstractmethod\n" +" def validate(self, value):\n" +" pass" + +#: ../../howto/descriptor.rst:363 +msgid "" +"Custom validators need to inherit from :class:`!Validator` and must supply a" +" :meth:`!validate` method to test various restrictions as needed." +msgstr "" +"自定义验证器必须继承自 :class:`!Validator` 并且必须提供 :meth:`!validate` 方法以根据需要测试各种约束。" + +#: ../../howto/descriptor.rst:368 +msgid "Custom validators" +msgstr "自定义验证器" + +#: ../../howto/descriptor.rst:370 +msgid "Here are three practical data validation utilities:" +msgstr "这是三个实用的数据验证工具:" + +#: ../../howto/descriptor.rst:372 +msgid "" +":class:`!OneOf` verifies that a value is one of a restricted set of options." +msgstr ":class:`!OneOf` 验证值是指定的受约束选项集合中的一项。" + +#: ../../howto/descriptor.rst:374 +msgid "" +":class:`!Number` verifies that a value is either an :class:`int` or " +":class:`float`. Optionally, it verifies that a value is between a given " +"minimum or maximum." +msgstr "" +":class:`!Number` 验证值是否为 :class:`int` 或 :class:`float`。 " +"作为可选项,它还能验证值在给定的最小值和最大值之间。" + +#: ../../howto/descriptor.rst:378 +msgid "" +":class:`!String` verifies that a value is a :class:`str`. Optionally, it " +"validates a given minimum or maximum length. It can validate a user-defined" +" `predicate `_" +" as well." +msgstr "" +":class:`!String` 验证值是否为 :class:`str`。作为可选项,它还能验证给定的最小或最大长度。它还能验证用户定义的 " +"`predicate `_." + +#: ../../howto/descriptor.rst:383 +msgid "" +"class OneOf(Validator):\n" +"\n" +" def __init__(self, *options):\n" +" self.options = set(options)\n" +"\n" +" def validate(self, value):\n" +" if value not in self.options:\n" +" raise ValueError(\n" +" f'Expected {value!r} to be one of {self.options!r}'\n" +" )\n" +"\n" +"class Number(Validator):\n" +"\n" +" def __init__(self, minvalue=None, maxvalue=None):\n" +" self.minvalue = minvalue\n" +" self.maxvalue = maxvalue\n" +"\n" +" def validate(self, value):\n" +" if not isinstance(value, (int, float)):\n" +" raise TypeError(f'Expected {value!r} to be an int or float')\n" +" if self.minvalue is not None and value < self.minvalue:\n" +" raise ValueError(\n" +" f'Expected {value!r} to be at least {self.minvalue!r}'\n" +" )\n" +" if self.maxvalue is not None and value > self.maxvalue:\n" +" raise ValueError(\n" +" f'Expected {value!r} to be no more than {self.maxvalue!r}'\n" +" )\n" +"\n" +"class String(Validator):\n" +"\n" +" def __init__(self, minsize=None, maxsize=None, predicate=None):\n" +" self.minsize = minsize\n" +" self.maxsize = maxsize\n" +" self.predicate = predicate\n" +"\n" +" def validate(self, value):\n" +" if not isinstance(value, str):\n" +" raise TypeError(f'Expected {value!r} to be a str')\n" +" if self.minsize is not None and len(value) < self.minsize:\n" +" raise ValueError(\n" +" f'Expected {value!r} to be no smaller than {self.minsize!r}'\n" +" )\n" +" if self.maxsize is not None and len(value) > self.maxsize:\n" +" raise ValueError(\n" +" f'Expected {value!r} to be no bigger than {self.maxsize!r}'\n" +" )\n" +" if self.predicate is not None and not self.predicate(value):\n" +" raise ValueError(\n" +" f'Expected {self.predicate} to be true for {value!r}'\n" +" )" +msgstr "" +"class OneOf(Validator):\n" +"\n" +" def __init__(self, *options):\n" +" self.options = set(options)\n" +"\n" +" def validate(self, value):\n" +" if value not in self.options:\n" +" raise ValueError(\n" +" f'Expected {value!r} to be one of {self.options!r}'\n" +" )\n" +"\n" +"class Number(Validator):\n" +"\n" +" def __init__(self, minvalue=None, maxvalue=None):\n" +" self.minvalue = minvalue\n" +" self.maxvalue = maxvalue\n" +"\n" +" def validate(self, value):\n" +" if not isinstance(value, (int, float)):\n" +" raise TypeError(f'Expected {value!r} to be an int or float')\n" +" if self.minvalue is not None and value < self.minvalue:\n" +" raise ValueError(\n" +" f'Expected {value!r} to be at least {self.minvalue!r}'\n" +" )\n" +" if self.maxvalue is not None and value > self.maxvalue:\n" +" raise ValueError(\n" +" f'Expected {value!r} to be no more than {self.maxvalue!r}'\n" +" )\n" +"\n" +"class String(Validator):\n" +"\n" +" def __init__(self, minsize=None, maxsize=None, predicate=None):\n" +" self.minsize = minsize\n" +" self.maxsize = maxsize\n" +" self.predicate = predicate\n" +"\n" +" def validate(self, value):\n" +" if not isinstance(value, str):\n" +" raise TypeError(f'Expected {value!r} to be a str')\n" +" if self.minsize is not None and len(value) < self.minsize:\n" +" raise ValueError(\n" +" f'Expected {value!r} to be no smaller than {self.minsize!r}'\n" +" )\n" +" if self.maxsize is not None and len(value) > self.maxsize:\n" +" raise ValueError(\n" +" f'Expected {value!r} to be no bigger than {self.maxsize!r}'\n" +" )\n" +" if self.predicate is not None and not self.predicate(value):\n" +" raise ValueError(\n" +" f'Expected {self.predicate} to be true for {value!r}'\n" +" )" + +#: ../../howto/descriptor.rst:439 +msgid "Practical application" +msgstr "实际应用" + +#: ../../howto/descriptor.rst:441 +msgid "Here's how the data validators can be used in a real class:" +msgstr "这是在真实类中使用数据验证器的方法:" + +#: ../../howto/descriptor.rst:443 +msgid "" +"class Component:\n" +"\n" +" name = String(minsize=3, maxsize=10, predicate=str.isupper)\n" +" kind = OneOf('wood', 'metal', 'plastic')\n" +" quantity = Number(minvalue=0)\n" +"\n" +" def __init__(self, name, kind, quantity):\n" +" self.name = name\n" +" self.kind = kind\n" +" self.quantity = quantity" +msgstr "" +"class Component:\n" +"\n" +" name = String(minsize=3, maxsize=10, predicate=str.isupper)\n" +" kind = OneOf('wood', 'metal', 'plastic')\n" +" quantity = Number(minvalue=0)\n" +"\n" +" def __init__(self, name, kind, quantity):\n" +" self.name = name\n" +" self.kind = kind\n" +" self.quantity = quantity" + +#: ../../howto/descriptor.rst:456 +msgid "The descriptors prevent invalid instances from being created:" +msgstr "描述器阻止无效实例的创建:" + +#: ../../howto/descriptor.rst:458 +msgid "" +">>> Component('Widget', 'metal', 5) # Blocked: 'Widget' is not all uppercase\n" +"Traceback (most recent call last):\n" +" ...\n" +"ValueError: Expected to be true for 'Widget'\n" +"\n" +">>> Component('WIDGET', 'metle', 5) # Blocked: 'metle' is misspelled\n" +"Traceback (most recent call last):\n" +" ...\n" +"ValueError: Expected 'metle' to be one of {'metal', 'plastic', 'wood'}\n" +"\n" +">>> Component('WIDGET', 'metal', -5) # Blocked: -5 is negative\n" +"Traceback (most recent call last):\n" +" ...\n" +"ValueError: Expected -5 to be at least 0\n" +"\n" +">>> Component('WIDGET', 'metal', 'V') # Blocked: 'V' isn't a number\n" +"Traceback (most recent call last):\n" +" ...\n" +"TypeError: Expected 'V' to be an int or float\n" +"\n" +">>> c = Component('WIDGET', 'metal', 5) # Allowed: The inputs are valid" +msgstr "" +">>> Component('Widget', 'metal', 5) # 阻止:'Widget' 不是全大写\n" +"Traceback (most recent call last):\n" +" ...\n" +"ValueError: Expected to be true for 'Widget'\n" +"\n" +">>> Component('WIDGET', 'metle', 5) # 阻止:'metle' 拼写错误\n" +"Traceback (most recent call last):\n" +" ...\n" +"ValueError: Expected 'metle' to be one of {'metal', 'plastic', 'wood'}\n" +"\n" +">>> Component('WIDGET', 'metal', -5) # 阻止:-5 为负数\n" +"Traceback (most recent call last):\n" +" ...\n" +"ValueError: Expected -5 to be at least 0\n" +"\n" +">>> Component('WIDGET', 'metal', 'V') # 阻止:'V' 不是数字\n" +"Traceback (most recent call last):\n" +" ...\n" +"TypeError: Expected 'V' to be an int or float\n" +"\n" +">>> c = Component('WIDGET', 'metal', 5) # 允许:输入有效" + +#: ../../howto/descriptor.rst:484 +msgid "Technical Tutorial" +msgstr "技术教程" + +#: ../../howto/descriptor.rst:486 +msgid "" +"What follows is a more technical tutorial for the mechanics and details of " +"how descriptors work." +msgstr "接下来是专业性更强的技术教程,以及描述器工作原理的详细信息。" + +#: ../../howto/descriptor.rst:491 +msgid "Abstract" +msgstr "摘要" + +#: ../../howto/descriptor.rst:493 +msgid "" +"Defines descriptors, summarizes the protocol, and shows how descriptors are " +"called. Provides an example showing how object relational mappings work." +msgstr "定义描述器,总结协议,并说明如何调用描述器。提供一个展示对象关系映射如何工作的示例。" + +#: ../../howto/descriptor.rst:496 +msgid "" +"Learning about descriptors not only provides access to a larger toolset, it " +"creates a deeper understanding of how Python works." +msgstr "学习描述器不仅能提供接触到更多工具集的途径,还能更深地理解 Python 工作的原理。" + +#: ../../howto/descriptor.rst:501 +msgid "Definition and introduction" +msgstr "定义与介绍" + +#: ../../howto/descriptor.rst:503 +msgid "" +"In general, a descriptor is an attribute value that has one of the methods " +"in the descriptor protocol. Those methods are :meth:`~object.__get__`, " +":meth:`~object.__set__`, and :meth:`~object.__delete__`. If any of those " +"methods are defined for an attribute, it is said to be a :term:`descriptor`." +msgstr "" +"一般而言,描述器是具有描述器协议中的方法之一的属性值。这些方法是 :meth:`~object.__get__`, " +":meth:`~object.__set__` 和 :meth:`~object.__delete__`。 " +"如果为某个属性定义了这些方法中的任何一个,它就被称为 :term:`descriptor`。" + +#: ../../howto/descriptor.rst:508 +msgid "" +"The default behavior for attribute access is to get, set, or delete the " +"attribute from an object's dictionary. For instance, ``a.x`` has a lookup " +"chain starting with ``a.__dict__['x']``, then ``type(a).__dict__['x']``, and" +" continuing through the method resolution order of ``type(a)``. If the " +"looked-up value is an object defining one of the descriptor methods, then " +"Python may override the default behavior and invoke the descriptor method " +"instead. Where this occurs in the precedence chain depends on which " +"descriptor methods were defined." +msgstr "" +"属性访问的默认行为是从一个对象的字典中获取、设置或删除属性。对于实例来说,``a.x`` 的查找顺序会从 ``a.__dict__['x']`` " +"开始,然后是 ``type(a).__dict__['x']``,接下来依次查找 ``type(a)`` 的方法解析顺序(MRO)。 " +"如果找到的值是定义了某个描述器方法的对象,则 Python " +"可能会重写默认行为并转而唤起描述器方法。这具体发生在优先级链的哪个环节则要根据所定义的描述器方法及其被调用的方式来决定。" + +#: ../../howto/descriptor.rst:517 +msgid "" +"Descriptors are a powerful, general purpose protocol. They are the " +"mechanism behind properties, methods, static methods, class methods, and " +":func:`super`. They are used throughout Python itself. Descriptors " +"simplify the underlying C code and offer a flexible set of new tools for " +"everyday Python programs." +msgstr "" +"描述器是一种强大的,通用的协议。它们是属性、方法、静态方法、类方法和 :func:`super` 背后的机制。它们在整个 Python 中都有使用。 " +"描述器简化了底层的 C 代码并为日常的 Python 程序提供了一套灵活的新工具。" + +#: ../../howto/descriptor.rst:525 +msgid "Descriptor protocol" +msgstr "描述器协议" + +#: ../../howto/descriptor.rst:527 +msgid "``descr.__get__(self, obj, type=None)``" +msgstr "``descr.__get__(self, obj, type=None)``" + +#: ../../howto/descriptor.rst:529 +msgid "``descr.__set__(self, obj, value)``" +msgstr "``descr.__set__(self, obj, value)``" + +#: ../../howto/descriptor.rst:531 +msgid "``descr.__delete__(self, obj)``" +msgstr "``descr.__delete__(self, obj)``" + +#: ../../howto/descriptor.rst:533 +msgid "" +"That is all there is to it. Define any of these methods and an object is " +"considered a descriptor and can override default behavior upon being looked " +"up as an attribute." +msgstr "描述器的方法就这些。一个对象只要定义了以上方法中的任何一个,就被视为描述器,并在被作为属性时覆盖其默认行为。" + +#: ../../howto/descriptor.rst:537 +msgid "" +"If an object defines :meth:`~object.__set__` or :meth:`~object.__delete__`, " +"it is considered a data descriptor. Descriptors that only define " +":meth:`~object.__get__` are called non-data descriptors (they are often used" +" for methods but other uses are possible)." +msgstr "" +"如果一个对象定义了 :meth:`~object.__set__` 或 :meth:`~object.__delete__`,它将被视为数据描述器。 " +"仅定义了 :meth:`~object.__get__` 的描述器称为非数据描述器(它们经常被用于方法但也可以有其他用途)。" + +#: ../../howto/descriptor.rst:542 +msgid "" +"Data and non-data descriptors differ in how overrides are calculated with " +"respect to entries in an instance's dictionary. If an instance's dictionary" +" has an entry with the same name as a data descriptor, the data descriptor " +"takes precedence. If an instance's dictionary has an entry with the same " +"name as a non-data descriptor, the dictionary entry takes precedence." +msgstr "" +"数据和非数据描述器的不同之处在于,如何计算实例字典中条目的替代值。如果实例的字典具有与数据描述器同名的条目,则数据描述器优先。如果实例的字典具有与非数据描述器同名的条目,则该字典条目优先。" + +#: ../../howto/descriptor.rst:548 +msgid "" +"To make a read-only data descriptor, define both :meth:`~object.__get__` and" +" :meth:`~object.__set__` with the :meth:`~object.__set__` raising an " +":exc:`AttributeError` when called. Defining the :meth:`~object.__set__` " +"method with an exception raising placeholder is enough to make it a data " +"descriptor." +msgstr "" +"为了使一个数据描述器只读,应同时定义 :meth:`~object.__get__` 和 :meth:`~object.__set__` 并在调用 " +":meth:`~object.__set__` 时引发 :exc:`AttributeError`。用引发异常的占位符定义 " +":meth:`~object.__set__` 方法就足以使其成为一个数据描述器。" + +#: ../../howto/descriptor.rst:555 +msgid "Overview of descriptor invocation" +msgstr "描述器调用概述" + +#: ../../howto/descriptor.rst:557 +msgid "" +"A descriptor can be called directly with ``desc.__get__(obj)`` or " +"``desc.__get__(None, cls)``." +msgstr "描述器可以通过 ``desc.__get__(obj)`` 或 ``desc.__get__(None, cls)`` 直接调用。" + +#: ../../howto/descriptor.rst:560 +msgid "" +"But it is more common for a descriptor to be invoked automatically from " +"attribute access." +msgstr "但更常见的是通过属性访问自动调用描述器。" + +#: ../../howto/descriptor.rst:563 +msgid "" +"The expression ``obj.x`` looks up the attribute ``x`` in the chain of " +"namespaces for ``obj``. If the search finds a descriptor outside of the " +"instance :attr:`~object.__dict__`, its :meth:`~object.__get__` method is " +"invoked according to the precedence rules listed below." +msgstr "" +"表达式 ``obj.x`` 在 ``obj`` 的命名空间链中查找属性 ``x``。如果搜索发现了一个实例 " +":attr:`~object.__dict__` 以外的描述器,将根据下面列出的优先级规则调用其 :meth:`~object.__get__` 方法。" + +#: ../../howto/descriptor.rst:568 +msgid "" +"The details of invocation depend on whether ``obj`` is an object, class, or " +"instance of super." +msgstr "调用的细节取决于 ``obj`` 是对象、类还是超类的实例。" + +#: ../../howto/descriptor.rst:573 +msgid "Invocation from an instance" +msgstr "通过实例调用" + +#: ../../howto/descriptor.rst:575 +msgid "" +"Instance lookup scans through a chain of namespaces giving data descriptors " +"the highest priority, followed by instance variables, then non-data " +"descriptors, then class variables, and lastly :meth:`~object.__getattr__` if" +" it is provided." +msgstr "" +"实例查找会扫描命名空间链并给予数据描述器最高的优先级,然后是实例变量,然后是非数据描述器,最后是 " +":meth:`~object.__getattr__`,如果有提供的话。" + +#: ../../howto/descriptor.rst:580 +msgid "" +"If a descriptor is found for ``a.x``, then it is invoked with: " +"``desc.__get__(a, type(a))``." +msgstr "如果 ``a.x`` 找到了一个描述器,那么将通过 ``desc.__get__(a, type(a))`` 调用它。" + +#: ../../howto/descriptor.rst:583 +msgid "" +"The logic for a dotted lookup is in :meth:`object.__getattribute__`. Here " +"is a pure Python equivalent:" +msgstr "点运算符的查找逻辑在 :meth:`object.__getattribute__` 中。这里是一个等价的纯 Python 实现:" + +#: ../../howto/descriptor.rst:586 +msgid "" +"def find_name_in_mro(cls, name, default):\n" +" \"Emulate _PyType_Lookup() in Objects/typeobject.c\"\n" +" for base in cls.__mro__:\n" +" if name in vars(base):\n" +" return vars(base)[name]\n" +" return default\n" +"\n" +"def object_getattribute(obj, name):\n" +" \"Emulate PyObject_GenericGetAttr() in Objects/object.c\"\n" +" null = sentinel('null')\n" +" objtype = type(obj)\n" +" cls_var = find_name_in_mro(objtype, name, null)\n" +" descr_get = getattr(type(cls_var), '__get__', null)\n" +" if descr_get is not null:\n" +" if (hasattr(type(cls_var), '__set__')\n" +" or hasattr(type(cls_var), '__delete__')):\n" +" return descr_get(cls_var, obj, objtype) # data descriptor\n" +" if hasattr(obj, '__dict__') and name in vars(obj):\n" +" return vars(obj)[name] # instance variable\n" +" if descr_get is not null:\n" +" return descr_get(cls_var, obj, objtype) # non-data descriptor\n" +" if cls_var is not null:\n" +" return cls_var # class variable\n" +" raise AttributeError(name)" +msgstr "" + +#: ../../howto/descriptor.rst:722 +msgid "" +"Note, there is no :meth:`~object.__getattr__` hook in the " +":meth:`~object.__getattribute__` code. That is why calling " +":meth:`~object.__getattribute__` directly or with " +"``super().__getattribute__`` will bypass :meth:`~object.__getattr__` " +"entirely." +msgstr "" +"注意,在 :meth:`~object.__getattribute__` 代码中没有 :meth:`~object.__getattr__` 钩子。 " +"这就是为什么直接调用 :meth:`~object.__getattribute__` 或用 ``super().__getattribute__`` " +"会彻底绕过 :meth:`~object.__getattr__`。" + +#: ../../howto/descriptor.rst:726 +msgid "" +"Instead, it is the dot operator and the :func:`getattr` function that are " +"responsible for invoking :meth:`~object.__getattr__` whenever " +":meth:`~object.__getattribute__` raises an :exc:`AttributeError`. Their " +"logic is encapsulated in a helper function:" +msgstr "" +"相反,一旦 :meth:`~object.__getattribute__` 引发 :exc:`AttributeError` 则将由点运算符和 " +":func:`getattr` 函数来负责唤起 :meth:`~object.__getattr__`。它们的逻辑封装在一个辅助函数中:" + +#: ../../howto/descriptor.rst:731 +msgid "" +"def getattr_hook(obj, name):\n" +" \"Emulate slot_tp_getattr_hook() in Objects/typeobject.c\"\n" +" try:\n" +" return obj.__getattribute__(name)\n" +" except AttributeError:\n" +" if not hasattr(type(obj), '__getattr__'):\n" +" raise\n" +" return type(obj).__getattr__(obj, name) # __getattr__" +msgstr "" +"def getattr_hook(obj, name):\n" +" \"Emulate slot_tp_getattr_hook() in Objects/typeobject.c\"\n" +" try:\n" +" return obj.__getattribute__(name)\n" +" except AttributeError:\n" +" if not hasattr(type(obj), '__getattr__'):\n" +" raise\n" +" return type(obj).__getattr__(obj, name) # __getattr__" + +#: ../../howto/descriptor.rst:776 +msgid "Invocation from a class" +msgstr "通过类调用" + +#: ../../howto/descriptor.rst:778 +msgid "" +"The logic for a dotted lookup such as ``A.x`` is in " +":meth:`!type.__getattribute__`. The steps are similar to those for " +":meth:`!object.__getattribute__` but the instance dictionary lookup is " +"replaced by a search through the class's :term:`method resolution order`." +msgstr "" +"像 ``A.x`` 这样的点操作符查找的逻辑在 :meth:`!type.__getattribute__` 中。其步骤与 " +":meth:`!object.__getattribute__` 相似,但是实例字典查找被替换为搜索类的 :term:`method " +"resolution order`。" + +#: ../../howto/descriptor.rst:783 +msgid "" +"If a descriptor is found, it is invoked with ``desc.__get__(None, A)``." +msgstr "如果找到了一个描述器,那么将通过 ``desc.__get__(None, A)`` 调用它。" + +#: ../../howto/descriptor.rst:785 +msgid "" +"The full C implementation can be found in :c:func:`!type_getattro` and " +":c:func:`!_PyType_Lookup` in :source:`Objects/typeobject.c`." +msgstr "" +"完整的 C 实现可在 :source:`Objects/typeobject.c` 里的 :c:func:`!type_getattro` 和 " +":c:func:`!_PyType_Lookup` 中找到。" + +#: ../../howto/descriptor.rst:790 +msgid "Invocation from super" +msgstr "通过 super 调用" + +#: ../../howto/descriptor.rst:792 +msgid "" +"The logic for super's dotted lookup is in the " +":meth:`~object.__getattribute__` method for object returned by " +":func:`super`." +msgstr "" +"super 的点操作符查找的逻辑在 :func:`super` 所返回对象的 :meth:`~object.__getattribute__` 方法中。" + +#: ../../howto/descriptor.rst:795 +msgid "" +"A dotted lookup such as ``super(A, obj).m`` searches " +"``obj.__class__.__mro__`` for the base class ``B`` immediately following " +"``A`` and then returns ``B.__dict__['m'].__get__(obj, A)``. If not a " +"descriptor, ``m`` is returned unchanged." +msgstr "" +"类似 ``super(A, obj).m`` 形式的点分查找将在 ``obj.__class__.__mro__`` 中搜索紧接在 ``A`` " +"之后的基类 ``B``,然后返回 ``B.__dict__['m'].__get__(obj, A)``。如果 ``m`` 不是描述器,则直接返回其值。" + +#: ../../howto/descriptor.rst:800 +msgid "" +"The full C implementation can be found in :c:func:`!super_getattro` in " +":source:`Objects/typeobject.c`. A pure Python equivalent can be found in " +"`Guido's Tutorial " +"`_." +msgstr "" +"完整的 C 实现可在 :source:`Objects/typeobject.c` 里的 :c:func:`!super_getattro` 中找到。 " +"纯 Python 的等价实现可在 `Guido 的教程 " +"`_ " +"中找到。" + +#: ../../howto/descriptor.rst:807 +msgid "Summary of invocation logic" +msgstr "调用逻辑总结" + +#: ../../howto/descriptor.rst:809 +msgid "" +"The mechanism for descriptors is embedded in the " +":meth:`~object.__getattribute__` methods for :class:`object`, :class:`type`," +" and :func:`super`." +msgstr "" +"描述器的机制嵌入在 :class:`object`, :class:`type` 和 :func:`super` 的 " +":meth:`~object.__getattribute__` 方法中。" + +#: ../../howto/descriptor.rst:812 +msgid "The important points to remember are:" +msgstr "要记住的重要点是:" + +#: ../../howto/descriptor.rst:814 +msgid "" +"Descriptors are invoked by the :meth:`~object.__getattribute__` method." +msgstr "描述器将由 :meth:`~object.__getattribute__` 方法唤起。" + +#: ../../howto/descriptor.rst:816 +msgid "" +"Classes inherit this machinery from :class:`object`, :class:`type`, or " +":func:`super`." +msgstr "类从 :class:`object`,:class:`type` 或 :func:`super` 继承此机制。" + +#: ../../howto/descriptor.rst:819 +msgid "" +"Overriding :meth:`~object.__getattribute__` prevents automatic descriptor " +"calls because all the descriptor logic is in that method." +msgstr "重写 :meth:`~object.__getattribute__` 将阻止自动的描述器调用,因为所有描述器逻辑都在该方法中。" + +#: ../../howto/descriptor.rst:822 +msgid "" +":meth:`!object.__getattribute__` and :meth:`!type.__getattribute__` make " +"different calls to :meth:`~object.__get__`. The first includes the instance" +" and may include the class. The second puts in ``None`` for the instance " +"and always includes the class." +msgstr "" +":meth:`!object.__getattribute__` 和 :meth:`!type.__getattribute__` 会用不同方式调用 " +":meth:`~object.__get__`。第一个会包括实例并可能包括类。第二个会将 ``None`` 作为实例并且总是包括类。" + +#: ../../howto/descriptor.rst:827 +msgid "Data descriptors always override instance dictionaries." +msgstr "数据描述器始终会覆盖实例字典。" + +#: ../../howto/descriptor.rst:829 +msgid "Non-data descriptors may be overridden by instance dictionaries." +msgstr "非数据描述器会被实例字典覆盖。" + +#: ../../howto/descriptor.rst:833 +msgid "Automatic name notification" +msgstr "自动名称通知" + +#: ../../howto/descriptor.rst:835 +msgid "" +"Sometimes it is desirable for a descriptor to know what class variable name " +"it was assigned to. When a new class is created, the :class:`type` " +"metaclass scans the dictionary of the new class. If any of the entries are " +"descriptors and if they define :meth:`~object.__set_name__`, that method is " +"called with two arguments. The *owner* is the class where the descriptor is" +" used, and the *name* is the class variable the descriptor was assigned to." +msgstr "" +"有时描述器需要知道它被赋值到哪个变量名。当一个新类被创建时,:class:`type` 元类将扫描新类的字典。 如果其中有任何条目是描述器并且它们定义了" +" :meth:`~object.__set_name__`,则该方法被调用时将附带两个参数。 *owner* 是使用该描述器的类,而 *name* " +"是该描述器被赋值到的变量。" + +#: ../../howto/descriptor.rst:842 +msgid "" +"The implementation details are in :c:func:`!type_new` and " +":c:func:`!set_names` in :source:`Objects/typeobject.c`." +msgstr "" +"实现的细节在 :source:`Objects/typeobject.c` 里的 :c:func:`!type_new` 和 " +":c:func:`!set_names` 中。" + +#: ../../howto/descriptor.rst:845 +msgid "" +"Since the update logic is in :meth:`!type.__new__`, notifications only take " +"place at the time of class creation. If descriptors are added to the class " +"afterwards, :meth:`~object.__set_name__` will need to be called manually." +msgstr "" +"由于更新逻辑是在 :meth:`!type.__new__` 中,因此通知仅在类创建时发出。之后如果将描述器添加到类中,则需要手动调用 " +":meth:`~object.__set_name__`." + +#: ../../howto/descriptor.rst:851 +msgid "ORM example" +msgstr "ORM(对象关系映射)示例" + +#: ../../howto/descriptor.rst:853 +msgid "" +"The following code is a simplified skeleton showing how data descriptors " +"could be used to implement an `object relational mapping " +"`_." +msgstr "" +"以下代码展示了如何使用数据描述器来实现简单的 `对象关系映射 " +"`_ 框架。" + +#: ../../howto/descriptor.rst:857 +msgid "" +"The essential idea is that the data is stored in an external database. The " +"Python instances only hold keys to the database's tables. Descriptors take " +"care of lookups or updates:" +msgstr "其核心思路是将数据存储在外部数据库中,Python 实例仅持有数据库表中对应的键。描述器负责对值进行查找或更新:" + +#: ../../howto/descriptor.rst:861 +msgid "" +"class Field:\n" +"\n" +" def __set_name__(self, owner, name):\n" +" self.fetch = f'SELECT {name} FROM {owner.table} WHERE {owner.key}=?;'\n" +" self.store = f'UPDATE {owner.table} SET {name}=? WHERE {owner.key}=?;'\n" +"\n" +" def __get__(self, obj, objtype=None):\n" +" return conn.execute(self.fetch, [obj.key]).fetchone()[0]\n" +"\n" +" def __set__(self, obj, value):\n" +" conn.execute(self.store, [value, obj.key])\n" +" conn.commit()" +msgstr "" +"class Field:\n" +"\n" +" def __set_name__(self, owner, name):\n" +" self.fetch = f'SELECT {name} FROM {owner.table} WHERE {owner.key}=?;'\n" +" self.store = f'UPDATE {owner.table} SET {name}=? WHERE {owner.key}=?;'\n" +"\n" +" def __get__(self, obj, objtype=None):\n" +" return conn.execute(self.fetch, [obj.key]).fetchone()[0]\n" +"\n" +" def __set__(self, obj, value):\n" +" conn.execute(self.store, [value, obj.key])\n" +" conn.commit()" + +#: ../../howto/descriptor.rst:876 +msgid "" +"We can use the :class:`!Field` class to define `models " +"`_ that describe the schema " +"for each table in a database:" +msgstr "" +"我们可以使用 :class:`!Field` 类来定义描述了数据库中每张表的结构的 `模型 " +"`_:" + +#: ../../howto/descriptor.rst:880 +msgid "" +"class Movie:\n" +" table = 'Movies' # Table name\n" +" key = 'title' # Primary key\n" +" director = Field()\n" +" year = Field()\n" +"\n" +" def __init__(self, key):\n" +" self.key = key\n" +"\n" +"class Song:\n" +" table = 'Music'\n" +" key = 'title'\n" +" artist = Field()\n" +" year = Field()\n" +" genre = Field()\n" +"\n" +" def __init__(self, key):\n" +" self.key = key" +msgstr "" +"class Movie:\n" +" table = 'Movies' # 表名\n" +" key = 'title' # 主键\n" +" director = Field()\n" +" year = Field()\n" +"\n" +" def __init__(self, key):\n" +" self.key = key\n" +"\n" +"class Song:\n" +" table = 'Music'\n" +" key = 'title'\n" +" artist = Field()\n" +" year = Field()\n" +" genre = Field()\n" +"\n" +" def __init__(self, key):\n" +" self.key = key" + +#: ../../howto/descriptor.rst:901 +msgid "To use the models, first connect to the database::" +msgstr "要使用模型,首先要连接到数据库::" + +#: ../../howto/descriptor.rst:903 +msgid "" +">>> import sqlite3\n" +">>> conn = sqlite3.connect('entertainment.db')" +msgstr "" +">>> import sqlite3\n" +">>> conn = sqlite3.connect('entertainment.db')" + +#: ../../howto/descriptor.rst:906 +msgid "" +"An interactive session shows how data is retrieved from the database and how" +" it can be updated:" +msgstr "交互式会话显示了如何从数据库中检索数据及如何对其进行更新:" + +#: ../../howto/descriptor.rst:934 +msgid "" +">>> Movie('Star Wars').director\n" +"'George Lucas'\n" +">>> jaws = Movie('Jaws')\n" +">>> f'Released in {jaws.year} by {jaws.director}'\n" +"'Released in 1975 by Steven Spielberg'\n" +"\n" +">>> Song('Country Roads').artist\n" +"'John Denver'\n" +"\n" +">>> Movie('Star Wars').director = 'J.J. Abrams'\n" +">>> Movie('Star Wars').director\n" +"'J.J. Abrams'" +msgstr "" +">>> Movie('Star Wars').director\n" +"'George Lucas'\n" +">>> jaws = Movie('Jaws')\n" +">>> f'Released in {jaws.year} by {jaws.director}'\n" +"'Released in 1975 by Steven Spielberg'\n" +"\n" +">>> Song('Country Roads').artist\n" +"'John Denver'\n" +"\n" +">>> Movie('Star Wars').director = 'J.J. Abrams'\n" +">>> Movie('Star Wars').director\n" +"'J.J. Abrams'" + +#: ../../howto/descriptor.rst:955 +msgid "Pure Python Equivalents" +msgstr "纯 Python 等价实现" + +#: ../../howto/descriptor.rst:957 +msgid "" +"The descriptor protocol is simple and offers exciting possibilities. " +"Several use cases are so common that they have been prepackaged into built-" +"in tools. Properties, bound methods, static methods, class methods, and " +"\\_\\_slots\\_\\_ are all based on the descriptor protocol." +msgstr "" +"描述器协议很简单,但它提供了令人兴奋的可能性。有几个用例非常通用,以至于它们已预先打包到内置工具中。属性、绑定方法、静态方法、类方法和 " +"__slots__ 均基于描述器协议。" + +#: ../../howto/descriptor.rst:964 +msgid "Properties" +msgstr "属性" + +#: ../../howto/descriptor.rst:966 +msgid "" +"Calling :func:`property` is a succinct way of building a data descriptor " +"that triggers a function call upon access to an attribute. Its signature " +"is::" +msgstr "调用 :func:`property` 是构建数据描述器的简洁方式,该数据描述器在访问属性时触发函数调用。它的签名是::" + +#: ../../howto/descriptor.rst:969 +msgid "property(fget=None, fset=None, fdel=None, doc=None) -> property" +msgstr "property(fget=None, fset=None, fdel=None, doc=None) -> property" + +#: ../../howto/descriptor.rst:971 +msgid "" +"The documentation shows a typical use to define a managed attribute ``x``:" +msgstr "该文档显示了定义托管属性 ``x`` 的典型用法:" + +#: ../../howto/descriptor.rst:973 +msgid "" +"class C:\n" +" def getx(self): return self.__x\n" +" def setx(self, value): self.__x = value\n" +" def delx(self): del self.__x\n" +" x = property(getx, setx, delx, \"I'm the 'x' property.\")" +msgstr "" +"class C:\n" +" def getx(self): return self.__x\n" +" def setx(self, value): self.__x = value\n" +" def delx(self): del self.__x\n" +" x = property(getx, setx, delx, \"I'm the 'x' property.\")" + +#: ../../howto/descriptor.rst:995 +msgid "" +"To see how :func:`property` is implemented in terms of the descriptor " +"protocol, here is a pure Python equivalent that implements most of the core " +"functionality:" +msgstr "要了解 :func:`property` 是如何按描述器协议的方式来实现的,以下是一个实现了大部分核心功能的纯 Python 等价实现:" + +#: ../../howto/descriptor.rst:998 +msgid "" +"class Property:\n" +" \"Emulate PyProperty_Type() in Objects/descrobject.c\"\n" +"\n" +" def __init__(self, fget=None, fset=None, fdel=None, doc=None):\n" +" self.fget = fget\n" +" self.fset = fset\n" +" self.fdel = fdel\n" +" if doc is None and fget is not None:\n" +" doc = fget.__doc__\n" +" self.__doc__ = doc\n" +"\n" +" def __set_name__(self, owner, name):\n" +" self.__name__ = name\n" +"\n" +" def __get__(self, obj, objtype=None):\n" +" if obj is None:\n" +" return self\n" +" if self.fget is None:\n" +" raise AttributeError\n" +" return self.fget(obj)\n" +"\n" +" def __set__(self, obj, value):\n" +" if self.fset is None:\n" +" raise AttributeError\n" +" self.fset(obj, value)\n" +"\n" +" def __delete__(self, obj):\n" +" if self.fdel is None:\n" +" raise AttributeError\n" +" self.fdel(obj)\n" +"\n" +" def getter(self, fget):\n" +" return type(self)(fget, self.fset, self.fdel, self.__doc__)\n" +"\n" +" def setter(self, fset):\n" +" return type(self)(self.fget, fset, self.fdel, self.__doc__)\n" +"\n" +" def deleter(self, fdel):\n" +" return type(self)(self.fget, self.fset, fdel, self.__doc__)" +msgstr "" +"class Property:\n" +" \"Emulate PyProperty_Type() in Objects/descrobject.c\"\n" +"\n" +" def __init__(self, fget=None, fset=None, fdel=None, doc=None):\n" +" self.fget = fget\n" +" self.fset = fset\n" +" self.fdel = fdel\n" +" if doc is None and fget is not None:\n" +" doc = fget.__doc__\n" +" self.__doc__ = doc\n" +"\n" +" def __set_name__(self, owner, name):\n" +" self.__name__ = name\n" +"\n" +" def __get__(self, obj, objtype=None):\n" +" if obj is None:\n" +" return self\n" +" if self.fget is None:\n" +" raise AttributeError\n" +" return self.fget(obj)\n" +"\n" +" def __set__(self, obj, value):\n" +" if self.fset is None:\n" +" raise AttributeError\n" +" self.fset(obj, value)\n" +"\n" +" def __delete__(self, obj):\n" +" if self.fdel is None:\n" +" raise AttributeError\n" +" self.fdel(obj)\n" +"\n" +" def getter(self, fget):\n" +" return type(self)(fget, self.fset, self.fdel, self.__doc__)\n" +"\n" +" def setter(self, fset):\n" +" return type(self)(self.fget, fset, self.fdel, self.__doc__)\n" +"\n" +" def deleter(self, fdel):\n" +" return type(self)(self.fget, self.fset, fdel, self.__doc__)" + +#: ../../howto/descriptor.rst:1122 +msgid "" +"The :func:`property` builtin helps whenever a user interface has granted " +"attribute access and then subsequent changes require the intervention of a " +"method." +msgstr "当用户接口已授权直接访问属性,但后续的变化要求通过方法来干预时,内置的 :func:`property` 就能派上用场。" + +#: ../../howto/descriptor.rst:1126 +msgid "" +"For instance, a spreadsheet class may grant access to a cell value through " +"``Cell('b10').value``. Subsequent improvements to the program require the " +"cell to be recalculated on every access; however, the programmer does not " +"want to affect existing client code accessing the attribute directly. The " +"solution is to wrap access to the value attribute in a property data " +"descriptor:" +msgstr "" +"例如,一个电子表格类可以通过 ``Cell('b10').value`` " +"授予对单元格值的访问权限。对程序的后续改进要求每次访问都要重新计算单元格;但是,程序员不希望影响直接访问该属性的现有客户端代码。解决方案是将对 " +"value 属性的访问包装在属性数据描述器中:" + +#: ../../howto/descriptor.rst:1132 +msgid "" +"class Cell:\n" +" ...\n" +"\n" +" @property\n" +" def value(self):\n" +" \"Recalculate the cell before returning value\"\n" +" self.recalc()\n" +" return self._value" +msgstr "" +"class Cell:\n" +" ...\n" +"\n" +" @property\n" +" def value(self):\n" +" \"Recalculate the cell before returning value\"\n" +" self.recalc()\n" +" return self._value" + +#: ../../howto/descriptor.rst:1143 +msgid "" +"Either the built-in :func:`property` or our :func:`!Property` equivalent " +"would work in this example." +msgstr "在这个例子中内置的 :func:`property` 或我们的 :func:`!Property` 等价实现都是可以的。" + +#: ../../howto/descriptor.rst:1148 +msgid "Functions and methods" +msgstr "函数和方法" + +#: ../../howto/descriptor.rst:1150 +msgid "" +"Python's object oriented features are built upon a function based " +"environment. Using non-data descriptors, the two are merged seamlessly." +msgstr "Python 的面向对象功能是在基于函数的环境构建的。通过使用非数据描述器,这两方面完成了无缝融合。" + +#: ../../howto/descriptor.rst:1153 +msgid "" +"Functions stored in class dictionaries get turned into methods when invoked." +" Methods only differ from regular functions in that the object instance is " +"prepended to the other arguments. By convention, the instance is called " +"*self* but could be called *this* or any other variable name." +msgstr "" +"在调用时,存储在类字典中的函数将被转换为方法。方法与常规函数的不同之处仅在于对象实例被置于其他参数之前。按照惯例,实例引用称为 *self* " +",但也可以称为 *this* 或任何其他变量名称。" + +#: ../../howto/descriptor.rst:1158 +msgid "" +"Methods can be created manually with :class:`types.MethodType` which is " +"roughly equivalent to:" +msgstr "可以使用 :class:`types.MethodType` 手动创建方法,其行为基本等价于:" + +#: ../../howto/descriptor.rst:1161 +msgid "" +"class MethodType:\n" +" \"Emulate PyMethod_Type in Objects/classobject.c\"\n" +"\n" +" def __init__(self, func, obj):\n" +" self.__func__ = func\n" +" self.__self__ = obj\n" +"\n" +" def __call__(self, *args, **kwargs):\n" +" func = self.__func__\n" +" obj = self.__self__\n" +" return func(obj, *args, **kwargs)\n" +"\n" +" def __getattribute__(self, name):\n" +" \"Emulate method_getset() in Objects/classobject.c\"\n" +" if name == '__doc__':\n" +" return self.__func__.__doc__\n" +" return object.__getattribute__(self, name)\n" +"\n" +" def __getattr__(self, name):\n" +" \"Emulate method_getattro() in Objects/classobject.c\"\n" +" return getattr(self.__func__, name)\n" +"\n" +" def __get__(self, obj, objtype=None):\n" +" \"Emulate method_descr_get() in Objects/classobject.c\"\n" +" return self" +msgstr "" +"class MethodType:\n" +" \"Emulate PyMethod_Type in Objects/classobject.c\"\n" +"\n" +" def __init__(self, func, obj):\n" +" self.__func__ = func\n" +" self.__self__ = obj\n" +"\n" +" def __call__(self, *args, **kwargs):\n" +" func = self.__func__\n" +" obj = self.__self__\n" +" return func(obj, *args, **kwargs)\n" +"\n" +" def __getattribute__(self, name):\n" +" \"Emulate method_getset() in Objects/classobject.c\"\n" +" if name == '__doc__':\n" +" return self.__func__.__doc__\n" +" return object.__getattribute__(self, name)\n" +"\n" +" def __getattr__(self, name):\n" +" \"Emulate method_getattro() in Objects/classobject.c\"\n" +" return getattr(self.__func__, name)\n" +"\n" +" def __get__(self, obj, objtype=None):\n" +" \"Emulate method_descr_get() in Objects/classobject.c\"\n" +" return self" + +#: ../../howto/descriptor.rst:1189 +msgid "" +"To support automatic creation of methods, functions include the " +":meth:`~object.__get__` method for binding methods during attribute access." +" This means that functions are non-data descriptors that return bound " +"methods during dotted lookup from an instance. Here's how it works:" +msgstr "" +"为支持方法的自动创建,函数会包括 :meth:`~object.__get__` 方法以便在属性访问期间绑定方法。 " +"这意味着函数就是在通过实例进行点号查找期间返回所绑定方法的非数据描述器。其运作方式是这样的:" + +#: ../../howto/descriptor.rst:1194 +msgid "" +"class Function:\n" +" ...\n" +"\n" +" def __get__(self, obj, objtype=None):\n" +" \"Simulate func_descr_get() in Objects/funcobject.c\"\n" +" if obj is None:\n" +" return self\n" +" return MethodType(self, obj)" +msgstr "" +"class Function:\n" +" ...\n" +"\n" +" def __get__(self, obj, objtype=None):\n" +" \"Simulate func_descr_get() in Objects/funcobject.c\"\n" +" if obj is None:\n" +" return self\n" +" return MethodType(self, obj)" + +#: ../../howto/descriptor.rst:1205 +msgid "" +"Running the following class in the interpreter shows how the function " +"descriptor works in practice:" +msgstr "在解释器中运行以下类,这显示了函数描述器的实际工作方式:" + +#: ../../howto/descriptor.rst:1208 +msgid "" +"class D:\n" +" def f(self):\n" +" return self\n" +"\n" +"class D2:\n" +" pass" +msgstr "" +"class D:\n" +" def f(self):\n" +" return self\n" +"\n" +"class D2:\n" +" pass" + +#: ../../howto/descriptor.rst:1226 +msgid "" +"The function has a :term:`qualified name` attribute to support " +"introspection:" +msgstr "该函数具有 :term:`qualified name` 属性以支持自省:" + +#: ../../howto/descriptor.rst:1228 +msgid "" +">>> D.f.__qualname__\n" +"'D.f'" +msgstr "" +">>> D.f.__qualname__\n" +"'D.f'" + +#: ../../howto/descriptor.rst:1233 +msgid "" +"Accessing the function through the class dictionary does not invoke " +":meth:`~object.__get__`. Instead, it just returns the underlying function " +"object::" +msgstr "通过类字典访问函数不会唤起 :meth:`~object.__get__`。相反,它只是返回下层的函数对象::" + +#: ../../howto/descriptor.rst:1236 +msgid "" +">>> D.__dict__['f']\n" +"" +msgstr "" +">>> D.__dict__['f']\n" +"" + +#: ../../howto/descriptor.rst:1239 +msgid "" +"Dotted access from a class calls :meth:`~object.__get__` which just returns " +"the underlying function unchanged::" +msgstr "通过类进行点号访问调用 :meth:`~object.__get__`,它将只原样返回下层的函数::" + +#: ../../howto/descriptor.rst:1242 +msgid "" +">>> D.f\n" +"" +msgstr "" +">>> D.f\n" +"" + +#: ../../howto/descriptor.rst:1245 +msgid "" +"The interesting behavior occurs during dotted access from an instance. The " +"dotted lookup calls :meth:`~object.__get__` which returns a bound method " +"object::" +msgstr "有趣的行为发生在通过实例进行点号访问期间。点号查找调用 :meth:`~object.__get__`,它将返回绑定的方法对象::" + +#: ../../howto/descriptor.rst:1248 +msgid "" +">>> d = D()\n" +">>> d.f\n" +">" +msgstr "" +">>> d = D()\n" +">>> d.f\n" +">" + +#: ../../howto/descriptor.rst:1252 +msgid "" +"Internally, the bound method stores the underlying function and the bound " +"instance::" +msgstr "绑定方法在内部存储了底层函数和绑定的实例::" + +#: ../../howto/descriptor.rst:1255 +msgid "" +">>> d.f.__func__\n" +"\n" +"\n" +">>> d.f.__self__\n" +"<__main__.D object at 0x00B18C90>" +msgstr "" +">>> d.f.__func__\n" +"\n" +"\n" +">>> d.f.__self__\n" +"<__main__.D object at 0x00B18C90>" + +#: ../../howto/descriptor.rst:1261 +msgid "" +"If you have ever wondered where *self* comes from in regular methods or " +"where *cls* comes from in class methods, this is it!" +msgstr "如果你曾好奇常规方法中的 *self* 或类方法中的 *cls* 是从什么地方来的,就是这里了!" + +#: ../../howto/descriptor.rst:1266 +msgid "Kinds of methods" +msgstr "方法的种类" + +#: ../../howto/descriptor.rst:1268 +msgid "" +"Non-data descriptors provide a simple mechanism for variations on the usual " +"patterns of binding functions into methods." +msgstr "非数据描述器为把函数绑定为方法的通常模式提供了一种简单的机制。" + +#: ../../howto/descriptor.rst:1271 +msgid "" +"To recap, functions have a :meth:`~object.__get__` method so that they can " +"be converted to a method when accessed as attributes. The non-data " +"descriptor transforms an ``obj.f(*args)`` call into ``f(obj, *args)``. " +"Calling ``cls.f(*args)`` becomes ``f(*args)``." +msgstr "" +"总结一下,函数具有 :meth:`~object.__get__` 方法以便在其作为属性被访问时可被转换为方法。非数据描述器会将 " +"``obj.f(*args)`` 调用转化为 ``f(obj, *args)``。调用 ``cls.f(*args)`` 将变成 " +"``f(*args)``." + +#: ../../howto/descriptor.rst:1276 +msgid "This chart summarizes the binding and its two most useful variants:" +msgstr "下表总结了绑定及其两个最有用的变体:" + +#: ../../howto/descriptor.rst:1279 +msgid "Transformation" +msgstr "转换形式" + +#: ../../howto/descriptor.rst:1279 +msgid "Called from an object" +msgstr "通过对象调用" + +#: ../../howto/descriptor.rst:1279 +msgid "Called from a class" +msgstr "通过类调用" + +#: ../../howto/descriptor.rst:1282 +msgid "function" +msgstr "function -- 函数" + +#: ../../howto/descriptor.rst:1282 +msgid "f(obj, \\*args)" +msgstr "f(obj, \\*args)" + +#: ../../howto/descriptor.rst:1282 ../../howto/descriptor.rst:1284 +msgid "f(\\*args)" +msgstr "f(\\*args)" + +#: ../../howto/descriptor.rst:1284 +msgid "staticmethod" +msgstr "静态方法" + +#: ../../howto/descriptor.rst:1286 +msgid "classmethod" +msgstr "类方法" + +#: ../../howto/descriptor.rst:1286 +msgid "f(type(obj), \\*args)" +msgstr "f(type(obj), \\*args)" + +#: ../../howto/descriptor.rst:1286 +msgid "f(cls, \\*args)" +msgstr "f(cls, \\*args)" + +#: ../../howto/descriptor.rst:1291 +msgid "Static methods" +msgstr "静态方法" + +#: ../../howto/descriptor.rst:1293 +msgid "" +"Static methods return the underlying function without changes. Calling " +"either ``c.f`` or ``C.f`` is the equivalent of a direct lookup into " +"``object.__getattribute__(c, \"f\")`` or ``object.__getattribute__(C, " +"\"f\")``. As a result, the function becomes identically accessible from " +"either an object or a class." +msgstr "" +"静态方法返回底层函数,不做任何更改。调用 ``c.f`` 或 ``C.f`` 等效于通过 ``object.__getattribute__(c, " +"\"f\")`` 或 ``object.__getattribute__(C, \"f\")`` 查找。这样该函数就可以从对象或类中进行相同的访问。" + +#: ../../howto/descriptor.rst:1299 +msgid "" +"Good candidates for static methods are methods that do not reference the " +"``self`` variable." +msgstr "适合作为静态方法的是那些不引用 ``self`` 变量的方法。" + +#: ../../howto/descriptor.rst:1302 +msgid "" +"For instance, a statistics package may include a container class for " +"experimental data. The class provides normal methods for computing the " +"average, mean, median, and other descriptive statistics that depend on the " +"data. However, there may be useful functions which are conceptually related " +"but do not depend on the data. For instance, ``erf(x)`` is handy conversion" +" routine that comes up in statistical work but does not directly depend on a" +" particular dataset. It can be called either from an object or the class: " +"``s.erf(1.5) --> 0.9332`` or ``Sample.erf(1.5) --> 0.9332``." +msgstr "" +"举例来说,一个统计软件包可能包括存放实验性数据的容器类。 该类提供了用于计算平均数、均值、中位数以及其他描述性的统计数据的方法。 " +"不过,还可能存在在概念上相关但不依赖于这些数据的有用函数。 例如,``erf(x)`` 是在统计工作中的便捷转换例程但并不直接依赖于特定的数据集。 " +"它可以通过对象或者类来调用: ``s.erf(1.5) --> 0.9332`` 或者 ``Sample.erf(1.5) --> 0.9332``。" + +#: ../../howto/descriptor.rst:1311 +msgid "" +"Since static methods return the underlying function with no changes, the " +"example calls are unexciting:" +msgstr "由于静态方法返回的底层函数没有任何变化,因此示例调用也是意料之中:" + +#: ../../howto/descriptor.rst:1314 +msgid "" +"class E:\n" +" @staticmethod\n" +" def f(x):\n" +" return x * 10" +msgstr "" +"class E:\n" +" @staticmethod\n" +" def f(x):\n" +" return x * 10" + +#: ../../howto/descriptor.rst:1321 +msgid "" +">>> E.f(3)\n" +"30\n" +">>> E().f(3)\n" +"30" +msgstr "" +">>> E.f(3)\n" +"30\n" +">>> E().f(3)\n" +"30" + +#: ../../howto/descriptor.rst:1328 +msgid "" +"Using the non-data descriptor protocol, a pure Python version of " +":func:`staticmethod` would look like this:" +msgstr "使用非数据描述器,纯 Python 版本的 :func:`staticmethod` 如下所示:" + +#: ../../howto/descriptor.rst:1331 +msgid "" +"import functools\n" +"\n" +"class StaticMethod:\n" +" \"Emulate PyStaticMethod_Type() in Objects/funcobject.c\"\n" +"\n" +" def __init__(self, f):\n" +" self.f = f\n" +" functools.update_wrapper(self, f)\n" +"\n" +" def __get__(self, obj, objtype=None):\n" +" return self.f\n" +"\n" +" def __call__(self, *args, **kwds):\n" +" return self.f(*args, **kwds)\n" +"\n" +" @property\n" +" def __annotations__(self):\n" +" return self.f.__annotations__" +msgstr "" +"import functools\n" +"\n" +"class StaticMethod:\n" +" \"Emulate PyStaticMethod_Type() in Objects/funcobject.c\"\n" +"\n" +" def __init__(self, f):\n" +" self.f = f\n" +" functools.update_wrapper(self, f)\n" +"\n" +" def __get__(self, obj, objtype=None):\n" +" return self.f\n" +"\n" +" def __call__(self, *args, **kwds):\n" +" return self.f(*args, **kwds)\n" +"\n" +" @property\n" +" def __annotations__(self):\n" +" return self.f.__annotations__" + +#: ../../howto/descriptor.rst:1352 +msgid "" +"The :func:`functools.update_wrapper` call adds a ``__wrapped__`` attribute " +"that refers to the underlying function. Also it carries forward the " +"attributes necessary to make the wrapper look like the wrapped function, " +"including :attr:`~function.__name__`, :attr:`~function.__qualname__`, and " +":attr:`~function.__doc__`." +msgstr "" +":func:`functools.update_wrapper` 调用增加了一个指向下层函数的 ``__wrapped__`` 属性。 " +"它还会向前传递必要的属性以使此包装器看起来像是被包装的函数,包括 :attr:`~function.__name__`, " +":attr:`~function.__qualname__` 和 :attr:`~function.__doc__`。" + +#: ../../howto/descriptor.rst:1421 +msgid "Class methods" +msgstr "类方法" + +#: ../../howto/descriptor.rst:1423 +msgid "" +"Unlike static methods, class methods prepend the class reference to the " +"argument list before calling the function. This format is the same for " +"whether the caller is an object or a class:" +msgstr "与静态方法不同,类方法在调用函数之前将类引用放在参数列表的最前。无论调用方是对象还是类,此格式相同:" + +#: ../../howto/descriptor.rst:1427 +msgid "" +"class F:\n" +" @classmethod\n" +" def f(cls, x):\n" +" return cls.__name__, x" +msgstr "" +"class F:\n" +" @classmethod\n" +" def f(cls, x):\n" +" return cls.__name__, x" + +#: ../../howto/descriptor.rst:1434 +msgid "" +">>> F.f(3)\n" +"('F', 3)\n" +">>> F().f(3)\n" +"('F', 3)" +msgstr "" +">>> F.f(3)\n" +"('F', 3)\n" +">>> F().f(3)\n" +"('F', 3)" + +#: ../../howto/descriptor.rst:1441 +msgid "" +"This behavior is useful whenever the method only needs to have a class " +"reference and does not rely on data stored in a specific instance. One use " +"for class methods is to create alternate class constructors. For example, " +"the classmethod :func:`dict.fromkeys` creates a new dictionary from a list " +"of keys. The pure Python equivalent is:" +msgstr "" +"当方法仅需要具有类引用并且不依赖于存储在特定实例中的数据时,此行为就很有用。类方法的一种用途是创建备用类构造函数。例如,类方法 " +":func:`dict.fromkeys` 从键列表创建一个新字典。纯 Python 的等价实现是:" + +#: ../../howto/descriptor.rst:1447 +msgid "" +"class Dict(dict):\n" +" @classmethod\n" +" def fromkeys(cls, iterable, value=None):\n" +" \"Emulate dict_fromkeys() in Objects/dictobject.c\"\n" +" d = cls()\n" +" for key in iterable:\n" +" d[key] = value\n" +" return d" +msgstr "" +"class Dict(dict):\n" +" @classmethod\n" +" def fromkeys(cls, iterable, value=None):\n" +" \"Emulate dict_fromkeys() in Objects/dictobject.c\"\n" +" d = cls()\n" +" for key in iterable:\n" +" d[key] = value\n" +" return d" + +#: ../../howto/descriptor.rst:1458 +msgid "Now a new dictionary of unique keys can be constructed like this:" +msgstr "现在可以这样构造一个新的唯一键字典:" + +#: ../../howto/descriptor.rst:1460 +msgid "" +">>> d = Dict.fromkeys('abracadabra')\n" +">>> type(d) is Dict\n" +"True\n" +">>> d\n" +"{'a': None, 'b': None, 'r': None, 'c': None, 'd': None}" +msgstr "" +">>> d = Dict.fromkeys('abracadabra')\n" +">>> type(d) is Dict\n" +"True\n" +">>> d\n" +"{'a': None, 'b': None, 'r': None, 'c': None, 'd': None}" + +#: ../../howto/descriptor.rst:1468 +msgid "" +"Using the non-data descriptor protocol, a pure Python version of " +":func:`classmethod` would look like this:" +msgstr "使用非数据描述器协议,纯 Python 版本的 :func:`classmethod` 如下:" + +#: ../../howto/descriptor.rst:1471 +msgid "" +"import functools\n" +"\n" +"class ClassMethod:\n" +" \"Emulate PyClassMethod_Type() in Objects/funcobject.c\"\n" +"\n" +" def __init__(self, f):\n" +" self.f = f\n" +" functools.update_wrapper(self, f)\n" +"\n" +" def __get__(self, obj, cls=None):\n" +" if cls is None:\n" +" cls = type(obj)\n" +" return MethodType(self.f, cls)" +msgstr "" +"import functools\n" +"\n" +"class ClassMethod:\n" +" \"Emulate PyClassMethod_Type() in Objects/funcobject.c\"\n" +"\n" +" def __init__(self, f):\n" +" self.f = f\n" +" functools.update_wrapper(self, f)\n" +"\n" +" def __get__(self, obj, cls=None):\n" +" if cls is None:\n" +" cls = type(obj)\n" +" return MethodType(self.f, cls)" + +#: ../../howto/descriptor.rst:1533 +msgid "" +"The :func:`functools.update_wrapper` call in ``ClassMethod`` adds a " +"``__wrapped__`` attribute that refers to the underlying function. Also it " +"carries forward the attributes necessary to make the wrapper look like the " +"wrapped function: :attr:`~function.__name__`, " +":attr:`~function.__qualname__`, :attr:`~function.__doc__`, and " +":attr:`~function.__annotations__`." +msgstr "" +"``ClassMethod`` 中的 :func:`functools.update_wrapper` 调用增加了一个指向下层函数的 " +"``__wrapped__`` 属性。它还会向前传递必要的属性以使此包装器看起来像是被包装的函数::attr:`~function.__name__`," +" :attr:`~function.__qualname__`, :attr:`~function.__doc__` 以及 " +":attr:`~function.__annotations__`。" + +#: ../../howto/descriptor.rst:1542 +msgid "Member objects and __slots__" +msgstr "成员对象和 __slots__" + +#: ../../howto/descriptor.rst:1544 +msgid "" +"When a class defines ``__slots__``, it replaces instance dictionaries with a" +" fixed-length array of slot values. From a user point of view that has " +"several effects:" +msgstr "当一个类定义了 ``__slots__``,它会用一个固定长度的 slot 值数组来替换实例字典。从用户的视角看,效果是这样的:" + +#: ../../howto/descriptor.rst:1548 +msgid "" +"1. Provides immediate detection of bugs due to misspelled attribute " +"assignments. Only attribute names specified in ``__slots__`` are allowed:" +msgstr "1. 提供对由错误拼写的属性赋值导致的程序缺陷的即时检测。只允许在 ``__slots__`` 中指定的属性名称:" + +#: ../../howto/descriptor.rst:1551 +msgid "" +"class Vehicle:\n" +" __slots__ = ('id_number', 'make', 'model')" +msgstr "" +"class Vehicle:\n" +" __slots__ = ('id_number', 'make', 'model')" + +#: ../../howto/descriptor.rst:1556 +msgid "" +">>> auto = Vehicle()\n" +">>> auto.id_nubmer = 'VYE483814LQEX'\n" +"Traceback (most recent call last):\n" +" ...\n" +"AttributeError: 'Vehicle' object has no attribute 'id_nubmer'" +msgstr "" +">>> auto = Vehicle()\n" +">>> auto.id_nubmer = 'VYE483814LQEX'\n" +"Traceback (most recent call last):\n" +" ...\n" +"AttributeError: 'Vehicle' object has no attribute 'id_nubmer'" + +#: ../../howto/descriptor.rst:1564 +msgid "" +"2. Helps create immutable objects where descriptors manage access to private" +" attributes stored in ``__slots__``:" +msgstr "2. 帮助创建由描述器来管理对保存在 ``__slots__`` 中的私有属性的访问的不可变对象:" + +#: ../../howto/descriptor.rst:1567 +msgid "" +"class Immutable:\n" +"\n" +" __slots__ = ('_dept', '_name') # Replace the instance dictionary\n" +"\n" +" def __init__(self, dept, name):\n" +" self._dept = dept # Store to private attribute\n" +" self._name = name # Store to private attribute\n" +"\n" +" @property # Read-only descriptor\n" +" def dept(self):\n" +" return self._dept\n" +"\n" +" @property\n" +" def name(self): # Read-only descriptor\n" +" return self._name" +msgstr "" +"class Immutable:\n" +"\n" +" __slots__ = ('_dept', '_name') # 替代实例字典\n" +"\n" +" def __init__(self, dept, name):\n" +" self._dept = dept # 保存到私有属性\n" +" self._name = name # 保存到私有属性\n" +"\n" +" @property # 只读描述器\n" +" def dept(self):\n" +" return self._dept\n" +"\n" +" @property\n" +" def name(self): # 只读描述器\n" +" return self._name" + +#: ../../howto/descriptor.rst:1585 +msgid "" +">>> mark = Immutable('Botany', 'Mark Watney')\n" +">>> mark.dept\n" +"'Botany'\n" +">>> mark.dept = 'Space Pirate'\n" +"Traceback (most recent call last):\n" +" ...\n" +"AttributeError: property 'dept' of 'Immutable' object has no setter\n" +">>> mark.location = 'Mars'\n" +"Traceback (most recent call last):\n" +" ...\n" +"AttributeError: 'Immutable' object has no attribute 'location'" +msgstr "" +">>> mark = Immutable('Botany', 'Mark Watney')\n" +">>> mark.dept\n" +"'Botany'\n" +">>> mark.dept = 'Space Pirate'\n" +"Traceback (most recent call last):\n" +" ...\n" +"AttributeError: property 'dept' of 'Immutable' object has no setter\n" +">>> mark.location = 'Mars'\n" +"Traceback (most recent call last):\n" +" ...\n" +"AttributeError: 'Immutable' object has no attribute 'location'" + +#: ../../howto/descriptor.rst:1599 +msgid "" +"3. Saves memory. On a 64-bit Linux build, an instance with two attributes " +"takes 48 bytes with ``__slots__`` and 152 bytes without. This `flyweight " +"design pattern `_ likely " +"only matters when a large number of instances are going to be created." +msgstr "" +"3. 节省内存。在 64 位 Linux 版本上,带有两个属性的实例如果使用 ``__slots__`` 会占用 48 个字节,如果不使用则会占用 " +"152 个字节。这种 `享元设计模式 `_ " +"通常仅在要创建大量实例时才能显示效果。" + +#: ../../howto/descriptor.rst:1604 +msgid "" +"4. Improves speed. Reading instance variables is 35% faster with " +"``__slots__`` (as measured with Python 3.10 on an Apple M1 processor)." +msgstr "" +"4. 提高速度。使用 ``__slots__`` 读取实例变量的速度提高了 35%(在 Apple M1 处理器上使用 Python 3.10 测量)。" + +#: ../../howto/descriptor.rst:1607 +msgid "" +"5. Blocks tools like :func:`functools.cached_property` which require an " +"instance dictionary to function correctly:" +msgstr "5. 阻止 :func:`functools.cached_property` 之类需要实例字典才能正常运作的工具:" + +#: ../../howto/descriptor.rst:1610 +msgid "" +"from functools import cached_property\n" +"\n" +"class CP:\n" +" __slots__ = () # Eliminates the instance dict\n" +"\n" +" @cached_property # Requires an instance dict\n" +" def pi(self):\n" +" return 4 * sum((-1.0)**n / (2.0*n + 1.0)\n" +" for n in reversed(range(100_000)))" +msgstr "" +"from functools import cached_property\n" +"\n" +"class CP:\n" +" __slots__ = () # 去除实例字典\n" +"\n" +" @cached_property # 需要一个实例字典\n" +" def pi(self):\n" +" return 4 * sum((-1.0)**n / (2.0*n + 1.0)\n" +" for n in reversed(range(100_000)))" + +#: ../../howto/descriptor.rst:1622 +msgid "" +">>> CP().pi\n" +"Traceback (most recent call last):\n" +" ...\n" +"TypeError: No '__dict__' attribute on 'CP' instance to cache 'pi' property." +msgstr "" +">>> CP().pi\n" +"Traceback (most recent call last):\n" +" ...\n" +"TypeError: No '__dict__' attribute on 'CP' instance to cache 'pi' property." + +#: ../../howto/descriptor.rst:1629 +msgid "" +"It is not possible to create an exact drop-in pure Python version of " +"``__slots__`` because it requires direct access to C structures and control " +"over object memory allocation. However, we can build a mostly faithful " +"simulation where the actual C structure for slots is emulated by a private " +"``_slotvalues`` list. Reads and writes to that private structure are " +"managed by member descriptors:" +msgstr "" +"要创建一个一模一样的纯 Python 版的 ``__slots__`` 是不可能的,因为它需要直接访问 C 结构体并控制对象内存分配。 " +"但是,我们可以构建一个非常相似的模拟版,其中作为 slot 的实际 C 结构体由一个私有的 ``_slotvalues`` 列表来模拟。 " +"对该私有结构体的读写操作将由成员描述器来管理:" + +#: ../../howto/descriptor.rst:1636 +msgid "" +"null = sentinel('null')\n" +"\n" +"class Member:\n" +"\n" +" def __init__(self, name, clsname, offset):\n" +" 'Emulate PyMemberDef in Include/descrobject.h'\n" +" # Also see descr_new() in Objects/descrobject.c\n" +" self.name = name\n" +" self.clsname = clsname\n" +" self.offset = offset\n" +"\n" +" def __get__(self, obj, objtype=None):\n" +" 'Emulate member_get() in Objects/descrobject.c'\n" +" # Also see PyMember_GetOne() in Python/structmember.c\n" +" if obj is None:\n" +" return self\n" +" value = obj._slotvalues[self.offset]\n" +" if value is null:\n" +" raise AttributeError(self.name)\n" +" return value\n" +"\n" +" def __set__(self, obj, value):\n" +" 'Emulate member_set() in Objects/descrobject.c'\n" +" obj._slotvalues[self.offset] = value\n" +"\n" +" def __delete__(self, obj):\n" +" 'Emulate member_delete() in Objects/descrobject.c'\n" +" value = obj._slotvalues[self.offset]\n" +" if value is null:\n" +" raise AttributeError(self.name)\n" +" obj._slotvalues[self.offset] = null\n" +"\n" +" def __repr__(self):\n" +" 'Emulate member_repr() in Objects/descrobject.c'\n" +" return f''" +msgstr "" + +#: ../../howto/descriptor.rst:1674 +msgid "" +"The :meth:`!type.__new__` method takes care of adding member objects to " +"class variables:" +msgstr ":meth:`!type.__new__` 方法负责将成员对象添加到类变量:" + +#: ../../howto/descriptor.rst:1677 +msgid "" +"class Type(type):\n" +" 'Simulate how the type metaclass adds member objects for slots'\n" +"\n" +" def __new__(mcls, clsname, bases, mapping, **kwargs):\n" +" 'Emulate type_new() in Objects/typeobject.c'\n" +" # type_new() calls PyTypeReady() which calls add_methods()\n" +" slot_names = mapping.get('slot_names', [])\n" +" for offset, name in enumerate(slot_names):\n" +" mapping[name] = Member(name, clsname, offset)\n" +" return type.__new__(mcls, clsname, bases, mapping, **kwargs)" +msgstr "" +"class Type(type):\n" +" 'Simulate how the type metaclass adds member objects for slots'\n" +"\n" +" def __new__(mcls, clsname, bases, mapping, **kwargs):\n" +" 'Emulate type_new() in Objects/typeobject.c'\n" +" # type_new() 将调用 PyTypeReady(),后者将调用 add_methods()\n" +" slot_names = mapping.get('slot_names', [])\n" +" for offset, name in enumerate(slot_names):\n" +" mapping[name] = Member(name, clsname, offset)\n" +" return type.__new__(mcls, clsname, bases, mapping, **kwargs)" + +#: ../../howto/descriptor.rst:1690 +msgid "" +"The :meth:`object.__new__` method takes care of creating instances that have" +" slots instead of an instance dictionary. Here is a rough simulation in " +"pure Python:" +msgstr ":meth:`object.__new__` 方法负责创建具有 slot 而非实例字典的实例。以下是一个纯 Python 的粗略模拟版:" + +#: ../../howto/descriptor.rst:1694 +msgid "" +"class Object:\n" +" 'Simulate how object.__new__() allocates memory for __slots__'\n" +"\n" +" def __new__(cls, *args, **kwargs):\n" +" 'Emulate object_new() in Objects/typeobject.c'\n" +" inst = super().__new__(cls)\n" +" if hasattr(cls, 'slot_names'):\n" +" empty_slots = [null] * len(cls.slot_names)\n" +" object.__setattr__(inst, '_slotvalues', empty_slots)\n" +" return inst\n" +"\n" +" def __setattr__(self, name, value):\n" +" 'Emulate _PyObject_GenericSetAttrWithDict() Objects/object.c'\n" +" cls = type(self)\n" +" if hasattr(cls, 'slot_names') and name not in cls.slot_names:\n" +" raise AttributeError(\n" +" f'{cls.__name__!r} object has no attribute {name!r}'\n" +" )\n" +" super().__setattr__(name, value)\n" +"\n" +" def __delattr__(self, name):\n" +" 'Emulate _PyObject_GenericSetAttrWithDict() Objects/object.c'\n" +" cls = type(self)\n" +" if hasattr(cls, 'slot_names') and name not in cls.slot_names:\n" +" raise AttributeError(\n" +" f'{cls.__name__!r} object has no attribute {name!r}'\n" +" )\n" +" super().__delattr__(name)" +msgstr "" +"class Object:\n" +" 'Simulate how object.__new__() allocates memory for __slots__'\n" +"\n" +" def __new__(cls, *args, **kwargs):\n" +" 'Emulate object_new() in Objects/typeobject.c'\n" +" inst = super().__new__(cls)\n" +" if hasattr(cls, 'slot_names'):\n" +" empty_slots = [null] * len(cls.slot_names)\n" +" object.__setattr__(inst, '_slotvalues', empty_slots)\n" +" return inst\n" +"\n" +" def __setattr__(self, name, value):\n" +" 'Emulate _PyObject_GenericSetAttrWithDict() Objects/object.c'\n" +" cls = type(self)\n" +" if hasattr(cls, 'slot_names') and name not in cls.slot_names:\n" +" raise AttributeError(\n" +" f'{cls.__name__!r} object has no attribute {name!r}'\n" +" )\n" +" super().__setattr__(name, value)\n" +"\n" +" def __delattr__(self, name):\n" +" 'Emulate _PyObject_GenericSetAttrWithDict() Objects/object.c'\n" +" cls = type(self)\n" +" if hasattr(cls, 'slot_names') and name not in cls.slot_names:\n" +" raise AttributeError(\n" +" f'{cls.__name__!r} object has no attribute {name!r}'\n" +" )\n" +" super().__delattr__(name)" + +#: ../../howto/descriptor.rst:1725 +msgid "" +"To use the simulation in a real class, just inherit from :class:`!Object` " +"and set the :term:`metaclass` to :class:`Type`:" +msgstr "" +"要在真实的类中使用此模拟,只需从 :class:`!Object` 继承并将 :term:`metaclass` 设为 :class:`Type`:" + +#: ../../howto/descriptor.rst:1728 +msgid "" +"class H(Object, metaclass=Type):\n" +" 'Instance variables stored in slots'\n" +"\n" +" slot_names = ['x', 'y']\n" +"\n" +" def __init__(self, x, y):\n" +" self.x = x\n" +" self.y = y" +msgstr "" +"class H(Object, metaclass=Type):\n" +" 'Instance variables stored in slots'\n" +"\n" +" slot_names = ['x', 'y']\n" +"\n" +" def __init__(self, x, y):\n" +" self.x = x\n" +" self.y = y" + +#: ../../howto/descriptor.rst:1739 +msgid "" +"At this point, the metaclass has loaded member objects for *x* and *y*::" +msgstr "这时,元类已经为 *x* 和 *y* 加载了成员对象::" + +#: ../../howto/descriptor.rst:1741 +msgid "" +">>> from pprint import pp\n" +">>> pp(dict(vars(H)))\n" +"{'__module__': '__main__',\n" +" '__doc__': 'Instance variables stored in slots',\n" +" 'slot_names': ['x', 'y'],\n" +" '__init__': ,\n" +" 'x': ,\n" +" 'y': }" +msgstr "" +">>> from pprint import pp\n" +">>> pp(dict(vars(H)))\n" +"{'__module__': '__main__',\n" +" '__doc__': 'Instance variables stored in slots',\n" +" 'slot_names': ['x', 'y'],\n" +" '__init__': ,\n" +" 'x': ,\n" +" 'y': }" + +#: ../../howto/descriptor.rst:1760 +msgid "" +"When instances are created, they have a ``slot_values`` list where the " +"attributes are stored:" +msgstr "当实例被创建时,它们将拥有一个用于存放属性的 ``slot_values`` 列表:" + +#: ../../howto/descriptor.rst:1763 +msgid "" +">>> h = H(10, 20)\n" +">>> vars(h)\n" +"{'_slotvalues': [10, 20]}\n" +">>> h.x = 55\n" +">>> vars(h)\n" +"{'_slotvalues': [55, 20]}" +msgstr "" +">>> h = H(10, 20)\n" +">>> vars(h)\n" +"{'_slotvalues': [10, 20]}\n" +">>> h.x = 55\n" +">>> vars(h)\n" +"{'_slotvalues': [55, 20]}" + +#: ../../howto/descriptor.rst:1772 +msgid "Misspelled or unassigned attributes will raise an exception:" +msgstr "错误拼写或未赋值的属性将引发一个异常:" + +#: ../../howto/descriptor.rst:1774 +msgid "" +">>> h.xz\n" +"Traceback (most recent call last):\n" +" ...\n" +"AttributeError: 'H' object has no attribute 'xz'" +msgstr "" +">>> h.xz\n" +"Traceback (most recent call last):\n" +" ...\n" +"AttributeError: 'H' object has no attribute 'xz'" diff --git a/howto/enum.po b/howto/enum.po new file mode 100644 index 0000000000..e575952b91 --- /dev/null +++ b/howto/enum.po @@ -0,0 +1,2960 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:00+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../howto/enum.rst:5 +msgid "Enum HOWTO" +msgstr "Enum 指南" + +#: ../../howto/enum.rst:11 +msgid "" +"An :class:`Enum` is a set of symbolic names bound to unique values. They " +"are similar to global variables, but they offer a more useful :func:`repr`, " +"grouping, type-safety, and a few other features." +msgstr "" +":class:`Enum` 是一组绑定到唯一值的符号名称。它们类似于全局变量,但提供了更好用的 :func:`repr`、分组、类型安全和一些其他特性。" + +#: ../../howto/enum.rst:15 +msgid "" +"They are most useful when you have a variable that can take one of a limited" +" selection of values. For example, the days of the week::" +msgstr "它们最适用于当某个变量可选的值有限时。例如,从一周中选取一天::" + +#: ../../howto/enum.rst:18 +msgid "" +">>> from enum import Enum\n" +">>> class Weekday(Enum):\n" +"... MONDAY = 1\n" +"... TUESDAY = 2\n" +"... WEDNESDAY = 3\n" +"... THURSDAY = 4\n" +"... FRIDAY = 5\n" +"... SATURDAY = 6\n" +"... SUNDAY = 7" +msgstr "" +">>> from enum import Enum\n" +">>> class Weekday(Enum):\n" +"... MONDAY = 1\n" +"... TUESDAY = 2\n" +"... WEDNESDAY = 3\n" +"... THURSDAY = 4\n" +"... FRIDAY = 5\n" +"... SATURDAY = 6\n" +"... SUNDAY = 7" + +#: ../../howto/enum.rst:28 +msgid "Or perhaps the RGB primary colors::" +msgstr "或是 RGB 三原色::" + +#: ../../howto/enum.rst:30 +msgid "" +">>> from enum import Enum\n" +">>> class Color(Enum):\n" +"... RED = 1\n" +"... GREEN = 2\n" +"... BLUE = 3" +msgstr "" +">>> from enum import Enum\n" +">>> class Color(Enum):\n" +"... RED = 1\n" +"... GREEN = 2\n" +"... BLUE = 3" + +#: ../../howto/enum.rst:36 +msgid "" +"As you can see, creating an :class:`Enum` is as simple as writing a class " +"that inherits from :class:`Enum` itself." +msgstr "正如你所见,创建一个 :class:`Enum` 就是简单地写一个继承 :class:`Enum` 的类。" + +#: ../../howto/enum.rst:39 +msgid "Case of Enum Members" +msgstr "枚举成员名的大小写" + +#: ../../howto/enum.rst:41 +msgid "" +"Because Enums are used to represent constants, and to help avoid issues with" +" name clashes between mixin-class methods/attributes and enum names, we " +"strongly recommend using UPPER_CASE names for members, and will be using " +"that style in our examples." +msgstr "" +"由于枚举被用来代表常量,并有助于避免混入类方法/属性和枚举名之间发生名称冲突,我们强烈建议用大写形式的名称表示成员,我们将在我们的示例中使用此风格。" + +#: ../../howto/enum.rst:46 +msgid "" +"Depending on the nature of the enum a member's value may or may not be " +"important, but either way that value can be used to get the corresponding " +"member::" +msgstr "根据枚举的性质,某个成员的值可能不一定用得上,但无论如何都能用那个值构造对应的成员::" + +#: ../../howto/enum.rst:50 +msgid "" +">>> Weekday(3)\n" +"" +msgstr "" +">>> Weekday(3)\n" +"" + +#: ../../howto/enum.rst:53 +msgid "" +"As you can see, the ``repr()`` of a member shows the enum name, the member " +"name, and the value. The ``str()`` of a member shows only the enum name and" +" member name::" +msgstr "如你所见,成员的 ``repr()`` 会显示枚举名称、成员名称和值。成员的 ``str()`` 只会显示枚举名称和成员名称::" + +#: ../../howto/enum.rst:57 +msgid "" +">>> print(Weekday.THURSDAY)\n" +"Weekday.THURSDAY" +msgstr "" +">>> print(Weekday.THURSDAY)\n" +"Weekday.THURSDAY" + +#: ../../howto/enum.rst:60 +msgid "The *type* of an enumeration member is the enum it belongs to::" +msgstr "枚举成员的 *类型* 就是其所属的枚举::" + +#: ../../howto/enum.rst:62 +msgid "" +">>> type(Weekday.MONDAY)\n" +"\n" +">>> isinstance(Weekday.FRIDAY, Weekday)\n" +"True" +msgstr "" +">>> type(Weekday.MONDAY)\n" +"\n" +">>> isinstance(Weekday.FRIDAY, Weekday)\n" +"True" + +#: ../../howto/enum.rst:67 +msgid "" +"Enum members have an attribute that contains just their :attr:`!name`::" +msgstr "枚举成员带有一个只包含了它们的 :attr:`!name` 的属性::" + +#: ../../howto/enum.rst:69 +msgid "" +">>> print(Weekday.TUESDAY.name)\n" +"TUESDAY" +msgstr "" +">>> print(Weekday.TUESDAY.name)\n" +"TUESDAY" + +#: ../../howto/enum.rst:72 +msgid "Likewise, they have an attribute for their :attr:`!value`::" +msgstr "类似地,它们还有一个包含其 :attr:`!value` 的属性::" + +#: ../../howto/enum.rst:75 +msgid "" +">>> Weekday.WEDNESDAY.value\n" +"3" +msgstr "" +">>> Weekday.WEDNESDAY.value\n" +"3" + +#: ../../howto/enum.rst:78 +msgid "" +"Unlike many languages that treat enumerations solely as name/value pairs, " +"Python Enums can have behavior added. For example, :class:`datetime.date` " +"has two methods for returning the weekday: :meth:`~datetime.date.weekday` " +"and :meth:`~datetime.date.isoweekday`. The difference is that one of them " +"counts from 0-6 and the other from 1-7. Rather than keep track of that " +"ourselves we can add a method to the :class:`!Weekday` enum to extract the " +"day from the :class:`~datetime.date` instance and return the matching enum " +"member::" +msgstr "" +"不同于许多只把枚举当作名称/值对的语言,Python 枚举还可以添加行为。例如,:class:`datetime.date` " +"有两个方法用来返回星期序号::meth:`~datetime.date.weekday` 和 " +":meth:`~datetime.date.isoweekday`。两者的区别在于一个是以 0-6 计数而另一个是以 1-7。 " +"这一点无须我们自己来记住而是可以向 :class:`!Weekday` 枚举添加一个方法用来从 :class:`~datetime.date` " +"实例提取日期并返回匹配的枚举成员::" + +#: ../../howto/enum.rst:87 +msgid "" +"@classmethod\n" +"def from_date(cls, date):\n" +" return cls(date.isoweekday())" +msgstr "" +"@classmethod\n" +"def from_date(cls, date):\n" +" return cls(date.isoweekday())" + +#: ../../howto/enum.rst:91 +msgid "The complete :class:`!Weekday` enum now looks like this::" +msgstr "完整的 :class:`!Weekday` 枚举现在看起来是这样的::" + +#: ../../howto/enum.rst:93 +msgid "" +">>> class Weekday(Enum):\n" +"... MONDAY = 1\n" +"... TUESDAY = 2\n" +"... WEDNESDAY = 3\n" +"... THURSDAY = 4\n" +"... FRIDAY = 5\n" +"... SATURDAY = 6\n" +"... SUNDAY = 7\n" +"... #\n" +"... @classmethod\n" +"... def from_date(cls, date):\n" +"... return cls(date.isoweekday())" +msgstr "" +">>> class Weekday(Enum):\n" +"... MONDAY = 1\n" +"... TUESDAY = 2\n" +"... WEDNESDAY = 3\n" +"... THURSDAY = 4\n" +"... FRIDAY = 5\n" +"... SATURDAY = 6\n" +"... SUNDAY = 7\n" +"... #\n" +"... @classmethod\n" +"... def from_date(cls, date):\n" +"... return cls(date.isoweekday())" + +#: ../../howto/enum.rst:106 +msgid "Now we can find out what today is! Observe::" +msgstr "现在可以知道今天是星期几了::" + +#: ../../howto/enum.rst:108 +msgid "" +">>> import datetime as dt\n" +">>> Weekday.from_date(dt.date.today())\n" +"" +msgstr "" +">>> import datetime as dt\n" +">>> Weekday.from_date(dt.date.today())\n" +"" + +#: ../../howto/enum.rst:112 +msgid "" +"Of course, if you're reading this on some other day, you'll see that day " +"instead." +msgstr "当然,如果换个日子读到这篇文章,应该看到当天是周几。" + +#: ../../howto/enum.rst:114 +msgid "" +"This :class:`!Weekday` enum is great if our variable only needs one day, but" +" what if we need several? Maybe we're writing a function to plot chores " +"during a week, and don't want to use a :class:`list` -- we could use a " +"different type of :class:`Enum`::" +msgstr "" +"如果我们的变量只需记录一天那么这个 :class:`!Weekday` 枚举很好用,但是如果我们需要记录好几天呢? " +"可能我们要写一个函数来描述一星期内的家务,并且不想使用 :class:`list` —— 我们可以使用另一种类型的 :class:`Enum`::" + +#: ../../howto/enum.rst:119 +msgid "" +">>> from enum import Flag\n" +">>> class Weekday(Flag):\n" +"... MONDAY = 1\n" +"... TUESDAY = 2\n" +"... WEDNESDAY = 4\n" +"... THURSDAY = 8\n" +"... FRIDAY = 16\n" +"... SATURDAY = 32\n" +"... SUNDAY = 64" +msgstr "" +">>> from enum import Flag\n" +">>> class Weekday(Flag):\n" +"... MONDAY = 1\n" +"... TUESDAY = 2\n" +"... WEDNESDAY = 4\n" +"... THURSDAY = 8\n" +"... FRIDAY = 16\n" +"... SATURDAY = 32\n" +"... SUNDAY = 64" + +#: ../../howto/enum.rst:129 +msgid "" +"We've changed two things: we're inherited from :class:`Flag`, and the values" +" are all powers of 2." +msgstr "这里做了两处改动:继承了 :class:`Flag`,而且值都是 2 的幂。" + +#: ../../howto/enum.rst:132 +msgid "" +"Just like the original :class:`!Weekday` enum above, we can have a single " +"selection::" +msgstr "就像上面的原始 :class:`!Weekday` 枚举一样,我们可以有单个选择::" + +#: ../../howto/enum.rst:134 +msgid "" +">>> first_week_day = Weekday.MONDAY\n" +">>> first_week_day\n" +"" +msgstr "" +">>> first_week_day = Weekday.MONDAY\n" +">>> first_week_day\n" +"" + +#: ../../howto/enum.rst:138 +msgid "" +"But :class:`Flag` also allows us to combine several members into a single " +"variable::" +msgstr "但 :class:`Flag` 也允许将几个成员并入一个变量::" + +#: ../../howto/enum.rst:141 +msgid "" +">>> weekend = Weekday.SATURDAY | Weekday.SUNDAY\n" +">>> weekend\n" +"" +msgstr "" +">>> weekend = Weekday.SATURDAY | Weekday.SUNDAY\n" +">>> weekend\n" +"" + +#: ../../howto/enum.rst:145 +msgid "You can even iterate over a :class:`Flag` variable::" +msgstr "甚至可以在一个 :class:`Flag` 变量上进行迭代::" + +#: ../../howto/enum.rst:147 +msgid "" +">>> for day in weekend:\n" +"... print(day)\n" +"Weekday.SATURDAY\n" +"Weekday.SUNDAY" +msgstr "" +">>> for day in weekend:\n" +"... print(day)\n" +"Weekday.SATURDAY\n" +"Weekday.SUNDAY" + +#: ../../howto/enum.rst:152 +msgid "Okay, let's get some chores set up::" +msgstr "好吧,让我们来安排家务吧::" + +#: ../../howto/enum.rst:154 +msgid "" +">>> chores_for_ethan = {\n" +"... 'feed the cat': Weekday.MONDAY | Weekday.WEDNESDAY | Weekday.FRIDAY,\n" +"... 'do the dishes': Weekday.TUESDAY | Weekday.THURSDAY,\n" +"... 'answer SO questions': Weekday.SATURDAY,\n" +"... }" +msgstr "" +">>> chores_for_ethan = {\n" +"... 'feed the cat': Weekday.MONDAY | Weekday.WEDNESDAY | Weekday.FRIDAY,\n" +"... 'do the dishes': Weekday.TUESDAY | Weekday.THURSDAY,\n" +"... 'answer SO questions': Weekday.SATURDAY,\n" +"... }" + +#: ../../howto/enum.rst:160 +msgid "And a function to display the chores for a given day::" +msgstr "一个显示某天家务的函数::" + +#: ../../howto/enum.rst:162 +msgid "" +">>> def show_chores(chores, day):\n" +"... for chore, days in chores.items():\n" +"... if day in days:\n" +"... print(chore)\n" +"...\n" +">>> show_chores(chores_for_ethan, Weekday.SATURDAY)\n" +"answer SO questions" +msgstr "" +">>> def show_chores(chores, day):\n" +"... for chore, days in chores.items():\n" +"... if day in days:\n" +"... print(chore)\n" +"...\n" +">>> show_chores(chores_for_ethan, Weekday.SATURDAY)\n" +"answer SO questions" + +#: ../../howto/enum.rst:170 +msgid "" +"In cases where the actual values of the members do not matter, you can save " +"yourself some work and use :func:`auto` for the values::" +msgstr "对于成员的实际取值无关紧要的情况,你可以省事地使用 :func:`auto` 来设置值::" + +#: ../../howto/enum.rst:173 +msgid "" +">>> from enum import auto\n" +">>> class Weekday(Flag):\n" +"... MONDAY = auto()\n" +"... TUESDAY = auto()\n" +"... WEDNESDAY = auto()\n" +"... THURSDAY = auto()\n" +"... FRIDAY = auto()\n" +"... SATURDAY = auto()\n" +"... SUNDAY = auto()\n" +"... WEEKEND = SATURDAY | SUNDAY" +msgstr "" +">>> from enum import auto\n" +">>> class Weekday(Flag):\n" +"... MONDAY = auto()\n" +"... TUESDAY = auto()\n" +"... WEDNESDAY = auto()\n" +"... THURSDAY = auto()\n" +"... FRIDAY = auto()\n" +"... SATURDAY = auto()\n" +"... SUNDAY = auto()\n" +"... WEEKEND = SATURDAY | SUNDAY" + +#: ../../howto/enum.rst:189 +msgid "Programmatic access to enumeration members and their attributes" +msgstr "枚举成员及其属性的编程访问" + +#: ../../howto/enum.rst:191 +msgid "" +"Sometimes it's useful to access members in enumerations programmatically " +"(i.e. situations where ``Color.RED`` won't do because the exact color is not" +" known at program-writing time). ``Enum`` allows such access::" +msgstr "" +"有时,要在程序中访问枚举成员(如,开发时不知道颜色的确切值,``Color.RED`` 不适用的情况)。``Enum`` 支持如下访问方式::" + +#: ../../howto/enum.rst:195 +msgid "" +">>> Color(1)\n" +"\n" +">>> Color(3)\n" +"" +msgstr "" +">>> Color(1)\n" +"\n" +">>> Color(3)\n" +"" + +#: ../../howto/enum.rst:200 +msgid "If you want to access enum members by *name*, use item access::" +msgstr "若要用 *名称* 访问枚举成员时,可使用条目访问::" + +#: ../../howto/enum.rst:202 +msgid "" +">>> Color['RED']\n" +"\n" +">>> Color['GREEN']\n" +"" +msgstr "" +">>> Color['RED']\n" +"\n" +">>> Color['GREEN']\n" +"" + +#: ../../howto/enum.rst:207 +msgid "" +"If you have an enum member and need its :attr:`!name` or :attr:`!value`::" +msgstr "如果你有一个枚举成员并需要它的 :attr:`!name` 或 :attr:`!value`::" + +#: ../../howto/enum.rst:209 +msgid "" +">>> member = Color.RED\n" +">>> member.name\n" +"'RED'\n" +">>> member.value\n" +"1" +msgstr "" +">>> member = Color.RED\n" +">>> member.name\n" +"'RED'\n" +">>> member.value\n" +"1" + +#: ../../howto/enum.rst:217 +msgid "Duplicating enum members and values" +msgstr "重复的枚举成员和值" + +#: ../../howto/enum.rst:219 +msgid "Having two enum members with the same name is invalid::" +msgstr "两个枚举成员的名称不能相同::" + +#: ../../howto/enum.rst:221 +msgid "" +">>> class Shape(Enum):\n" +"... SQUARE = 2\n" +"... SQUARE = 3\n" +"...\n" +"Traceback (most recent call last):\n" +"...\n" +"TypeError: 'SQUARE' already defined as 2" +msgstr "" +">>> class Shape(Enum):\n" +"... SQUARE = 2\n" +"... SQUARE = 3\n" +"...\n" +"Traceback (most recent call last):\n" +"...\n" +"TypeError: 'SQUARE' already defined as 2" + +#: ../../howto/enum.rst:229 +msgid "" +"However, an enum member can have other names associated with it. Given two " +"entries ``A`` and ``B`` with the same value (and ``A`` defined first), ``B``" +" is an alias for the member ``A``. By-value lookup of the value of ``A`` " +"will return the member ``A``. By-name lookup of ``A`` will return the " +"member ``A``. By-name lookup of ``B`` will also return the member ``A``::" +msgstr "" +"然而,一个枚举成员可以关联多个其他名称。如果两个枚举项 ``A`` 和 ``B`` 具有相同值 (并且首先定义的是 ``A``),则 ``B`` 是成员" +" ``A`` 的别名。对 ``A`` 按值检索将会返回成员 ``A``。按名称检索 ``B`` 也会返回成员 ``A``::" + +#: ../../howto/enum.rst:235 +msgid "" +">>> class Shape(Enum):\n" +"... SQUARE = 2\n" +"... DIAMOND = 1\n" +"... CIRCLE = 3\n" +"... ALIAS_FOR_SQUARE = 2\n" +"...\n" +">>> Shape.SQUARE\n" +"\n" +">>> Shape.ALIAS_FOR_SQUARE\n" +"\n" +">>> Shape(2)\n" +"" +msgstr "" +">>> class Shape(Enum):\n" +"... SQUARE = 2\n" +"... DIAMOND = 1\n" +"... CIRCLE = 3\n" +"... ALIAS_FOR_SQUARE = 2\n" +"...\n" +">>> Shape.SQUARE\n" +"\n" +">>> Shape.ALIAS_FOR_SQUARE\n" +"\n" +">>> Shape(2)\n" +"" + +#: ../../howto/enum.rst:250 +msgid "" +"Attempting to create a member with the same name as an already defined " +"attribute (another member, a method, etc.) or attempting to create an " +"attribute with the same name as a member is not allowed." +msgstr "不允许创建与已定义属性(其他成员、方法等)同名的成员,也不支持创建与现有成员同名的属性。" + +#: ../../howto/enum.rst:256 +msgid "Ensuring unique enumeration values" +msgstr "确保枚举值唯一" + +#: ../../howto/enum.rst:258 +msgid "" +"By default, enumerations allow multiple names as aliases for the same value." +" When this behavior isn't desired, you can use the :func:`unique` " +"decorator::" +msgstr "默认情况下,枚举允许多个名称作为同一个值的别名。若不想如此,可以使用 :func:`unique` 装饰器::" + +#: ../../howto/enum.rst:261 +msgid "" +">>> from enum import Enum, unique\n" +">>> @unique\n" +"... class Mistake(Enum):\n" +"... ONE = 1\n" +"... TWO = 2\n" +"... THREE = 3\n" +"... FOUR = 3\n" +"...\n" +"Traceback (most recent call last):\n" +"...\n" +"ValueError: duplicate values found in : FOUR -> THREE" +msgstr "" +">>> from enum import Enum, unique\n" +">>> @unique\n" +"... class Mistake(Enum):\n" +"... ONE = 1\n" +"... TWO = 2\n" +"... THREE = 3\n" +"... FOUR = 3\n" +"...\n" +"Traceback (most recent call last):\n" +"...\n" +"ValueError: duplicate values found in : FOUR -> THREE" + +#: ../../howto/enum.rst:275 +msgid "Using automatic values" +msgstr "使用自动设定的值" + +#: ../../howto/enum.rst:277 +msgid "If the exact value is unimportant you can use :class:`auto`::" +msgstr "如果具体的枚举值无所谓是什么,可以使用 :class:`auto`::" + +#: ../../howto/enum.rst:279 +msgid "" +">>> from enum import Enum, auto\n" +">>> class Color(Enum):\n" +"... RED = auto()\n" +"... BLUE = auto()\n" +"... GREEN = auto()\n" +"...\n" +">>> [member.value for member in Color]\n" +"[1, 2, 3]" +msgstr "" +">>> from enum import Enum, auto\n" +">>> class Color(Enum):\n" +"... RED = auto()\n" +"... BLUE = auto()\n" +"... GREEN = auto()\n" +"...\n" +">>> [member.value for member in Color]\n" +"[1, 2, 3]" + +#: ../../howto/enum.rst:288 +msgid "" +"The values are chosen by :func:`~Enum._generate_next_value_`, which can be " +"overridden::" +msgstr "枚举值由 :func:`~Enum._generate_next_value_` 来选取,它可以被重写::" + +#: ../../howto/enum.rst:291 +msgid "" +">>> class AutoName(Enum):\n" +"... @staticmethod\n" +"... def _generate_next_value_(name, start, count, last_values):\n" +"... return name\n" +"...\n" +">>> class Ordinal(AutoName):\n" +"... NORTH = auto()\n" +"... SOUTH = auto()\n" +"... EAST = auto()\n" +"... WEST = auto()\n" +"...\n" +">>> [member.value for member in Ordinal]\n" +"['NORTH', 'SOUTH', 'EAST', 'WEST']" +msgstr "" +">>> class AutoName(Enum):\n" +"... @staticmethod\n" +"... def _generate_next_value_(name, start, count, last_values):\n" +"... return name\n" +"...\n" +">>> class Ordinal(AutoName):\n" +"... NORTH = auto()\n" +"... SOUTH = auto()\n" +"... EAST = auto()\n" +"... WEST = auto()\n" +"...\n" +">>> [member.value for member in Ordinal]\n" +"['NORTH', 'SOUTH', 'EAST', 'WEST']" + +#: ../../howto/enum.rst:307 +msgid "" +"The :meth:`~Enum._generate_next_value_` method must be defined before any " +"members." +msgstr ":meth:`~Enum._generate_next_value_` 方法必须在任何成员之前定义。" + +#: ../../howto/enum.rst:310 +msgid "Iteration" +msgstr "迭代遍历" + +#: ../../howto/enum.rst:312 +msgid "Iterating over the members of an enum does not provide the aliases::" +msgstr "对枚举成员的迭代遍历不会列出别名::" + +#: ../../howto/enum.rst:314 +msgid "" +">>> list(Shape)\n" +"[, , ]\n" +">>> list(Weekday)\n" +"[, , , , , , ]" +msgstr "" +">>> list(Shape)\n" +"[, , ]\n" +">>> list(Weekday)\n" +"[, , , , , , ]" + +#: ../../howto/enum.rst:319 +msgid "" +"Note that the aliases ``Shape.ALIAS_FOR_SQUARE`` and ``Weekday.WEEKEND`` " +"aren't shown." +msgstr "请注意 ``Shape.ALIAS_FOR_SQUARE`` 和 ``Weekday.WEEKEND`` 等别名不会被显示。" + +#: ../../howto/enum.rst:321 +msgid "" +"The special attribute ``__members__`` is a read-only ordered mapping of " +"names to members. It includes all names defined in the enumeration, " +"including the aliases::" +msgstr "特殊属性 ``__members__`` 是一个名称与成员间的只读有序映射。包含了枚举中定义的所有名称,包括别名::" + +#: ../../howto/enum.rst:325 +msgid "" +">>> for name, member in Shape.__members__.items():\n" +"... name, member\n" +"...\n" +"('SQUARE', )\n" +"('DIAMOND', )\n" +"('CIRCLE', )\n" +"('ALIAS_FOR_SQUARE', )" +msgstr "" +">>> for name, member in Shape.__members__.items():\n" +"... name, member\n" +"...\n" +"('SQUARE', )\n" +"('DIAMOND', )\n" +"('CIRCLE', )\n" +"('ALIAS_FOR_SQUARE', )" + +#: ../../howto/enum.rst:333 +msgid "" +"The ``__members__`` attribute can be used for detailed programmatic access " +"to the enumeration members. For example, finding all the aliases::" +msgstr "``__members__`` 属性可用于获取枚举成员的详细信息。比如查找所有别名::" + +#: ../../howto/enum.rst:336 +msgid "" +">>> [name for name, member in Shape.__members__.items() if member.name != name]\n" +"['ALIAS_FOR_SQUARE']" +msgstr "" +">>> [name for name, member in Shape.__members__.items() if member.name != name]\n" +"['ALIAS_FOR_SQUARE']" + +#: ../../howto/enum.rst:341 +msgid "" +"Aliases for flags include values with multiple flags set, such as ``3``, and" +" no flags set, i.e. ``0``." +msgstr "旗标的别名包括带有多个旗标设置的值,如 ``3``,以及不设置任何旗标,即 ``0``。" + +#: ../../howto/enum.rst:346 +msgid "Comparisons" +msgstr "比较运算" + +#: ../../howto/enum.rst:348 +msgid "Enumeration members are compared by identity::" +msgstr "枚举成员是按标识进行比较的::" + +#: ../../howto/enum.rst:350 +msgid "" +">>> Color.RED is Color.RED\n" +"True\n" +">>> Color.RED is Color.BLUE\n" +"False\n" +">>> Color.RED is not Color.BLUE\n" +"True" +msgstr "" +">>> Color.RED is Color.RED\n" +"True\n" +">>> Color.RED is Color.BLUE\n" +"False\n" +">>> Color.RED is not Color.BLUE\n" +"True" + +#: ../../howto/enum.rst:357 +msgid "" +"Ordered comparisons between enumeration values are *not* supported. Enum " +"members are not integers (but see `IntEnum`_ below)::" +msgstr "枚举值之间无法进行有序的比较。枚举的成员不是整数(另请参阅下文 `IntEnum`_)::" + +#: ../../howto/enum.rst:360 +msgid "" +">>> Color.RED < Color.BLUE\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"TypeError: '<' not supported between instances of 'Color' and 'Color'" +msgstr "" +">>> Color.RED < Color.BLUE\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"TypeError: '<' not supported between instances of 'Color' and 'Color'" + +#: ../../howto/enum.rst:365 +msgid "Equality comparisons are defined though::" +msgstr "相等性比较的定义如下::" + +#: ../../howto/enum.rst:367 +msgid "" +">>> Color.BLUE == Color.RED\n" +"False\n" +">>> Color.BLUE != Color.RED\n" +"True\n" +">>> Color.BLUE == Color.BLUE\n" +"True" +msgstr "" +">>> Color.BLUE == Color.RED\n" +"False\n" +">>> Color.BLUE != Color.RED\n" +"True\n" +">>> Color.BLUE == Color.BLUE\n" +"True" + +#: ../../howto/enum.rst:374 +msgid "" +"Equality comparisons against non-enumeration values will always return " +"``False`` (again, :class:`IntEnum` was explicitly designed to behave " +"differently, see below)::" +msgstr "" + +#: ../../howto/enum.rst:378 +msgid "" +">>> Color.BLUE == 2\n" +"False" +msgstr "" +">>> Color.BLUE == 2\n" +"False" + +#: ../../howto/enum.rst:383 +msgid "" +"It is possible to reload modules -- if a reloaded module contains enums, " +"they will be recreated, and the new members may not compare identical/equal " +"to the original members." +msgstr "重载模块是可能的 -- 如果重载的模块包含枚举,它们将被重新创建,而新成员与原始成员的标识/相等性比较不一定会通过。" + +#: ../../howto/enum.rst:388 +msgid "Allowed members and attributes of enumerations" +msgstr "合法的枚举成员和属性" + +#: ../../howto/enum.rst:390 +msgid "" +"Most of the examples above use integers for enumeration values. Using " +"integers is short and handy (and provided by default by the `Functional " +"API`_), but not strictly enforced. In the vast majority of use-cases, one " +"doesn't care what the actual value of an enumeration is. But if the value " +"*is* important, enumerations can have arbitrary values." +msgstr "" +"以上大多数示例都用了整数作为枚举值。使用整数确实简短方便(并且是 `Functional API`_ " +"默认提供的值),但并非强制要求。绝大多数情况下,人们并不关心枚举的实际值是什么。但如果值确实重要,可以使用任何值。" + +#: ../../howto/enum.rst:396 +msgid "" +"Enumerations are Python classes, and can have methods and special methods as" +" usual. If we have this enumeration::" +msgstr "枚举是 Python 的类,可带有普通方法和特殊方法。假设有如下枚举::" + +#: ../../howto/enum.rst:399 +msgid "" +">>> class Mood(Enum):\n" +"... FUNKY = 1\n" +"... HAPPY = 3\n" +"...\n" +"... def describe(self):\n" +"... # self is the member here\n" +"... return self.name, self.value\n" +"...\n" +"... def __str__(self):\n" +"... return 'my custom str! {0}'.format(self.value)\n" +"...\n" +"... @classmethod\n" +"... def favorite_mood(cls):\n" +"... # cls here is the enumeration\n" +"... return cls.HAPPY\n" +"..." +msgstr "" +">>> class Mood(Enum):\n" +"... FUNKY = 1\n" +"... HAPPY = 3\n" +"...\n" +"... def describe(self):\n" +"... # 在这里 self 是成员\n" +"... return self.name, self.value\n" +"...\n" +"... def __str__(self):\n" +"... return 'my custom str! {0}'.format(self.value)\n" +"...\n" +"... @classmethod\n" +"... def favorite_mood(cls):\n" +"... # 在这里 cls 是枚举\n" +"... return cls.HAPPY\n" +"..." + +#: ../../howto/enum.rst:416 +msgid "Then::" +msgstr "那么::" + +#: ../../howto/enum.rst:418 +msgid "" +">>> Mood.favorite_mood()\n" +"\n" +">>> Mood.HAPPY.describe()\n" +"('HAPPY', 3)\n" +">>> str(Mood.FUNKY)\n" +"'my custom str! 1'" +msgstr "" +">>> Mood.favorite_mood()\n" +"\n" +">>> Mood.HAPPY.describe()\n" +"('HAPPY', 3)\n" +">>> str(Mood.FUNKY)\n" +"'my custom str! 1'" + +#: ../../howto/enum.rst:425 +msgid "" +"The rules for what is allowed are as follows: names that start and end with " +"a single underscore are reserved by enum and cannot be used; all other " +"attributes defined within an enumeration will become members of this " +"enumeration, with the exception of special methods (:meth:`~object.__str__`," +" :meth:`~object.__add__`, etc.), descriptors (methods are also descriptors)," +" and variable names listed in :attr:`~Enum._ignore_`." +msgstr "" +"对于允许内容的规则如下:以单下划线开始和结尾的名称是由枚举保留而不可使用的;在枚举中定义的其他属性将成为该枚举的成员,例外项则包括特殊方法 " +"(:meth:`~object.__str__`, :meth:`~object.__add__`, etc.)、描述器 (方法也属于描述器) 以及在 " +":attr:`~Enum._ignore_` 中列出的变量名。" + +#: ../../howto/enum.rst:432 +msgid "" +"Note: if your enumeration defines :meth:`~object.__new__` and/or " +":meth:`~object.__init__`, any value(s) given to the enum member will be " +"passed into those methods. See `Planet`_ for an example." +msgstr "" +"注意:如果你的枚举定义了 :meth:`~object.__new__` 和/或 " +":meth:`~object.__init__`,则给予枚举成员的任何值都将被传递给这些方法。参见 `Planet`_ 中的示例。" + +#: ../../howto/enum.rst:438 +msgid "" +"The :meth:`~object.__new__` method, if defined, is used during creation of " +"the Enum members; it is then replaced by Enum's :meth:`~object.__new__` " +"which is used after class creation for lookup of existing members. See " +":ref:`new-vs-init` for more details." +msgstr "" +"如果定义了 :meth:`~object.__new__` 方法,它会在创建 Enum 成员期间被使用;随后它将被 Enum 的 " +":meth:`~object.__new__` 所替换,该方法会在类创建后被用于查找现有成员。详情参见 :ref:`new-vs-init`。" + +#: ../../howto/enum.rst:445 +msgid "Restricted Enum subclassing" +msgstr "受限的 Enum 子类化" + +#: ../../howto/enum.rst:447 +msgid "" +"A new :class:`Enum` class must have one base enum class, up to one concrete " +"data type, and as many :class:`object`-based mixin classes as needed. The " +"order of these base classes is::" +msgstr "" +"新建的 :class:`Enum` 类必须包含:一个枚举基类、至多一种数据类型和按需提供的基于 :class:`object` " +"的混合类。这些基类的顺序如下::" + +#: ../../howto/enum.rst:451 +msgid "" +"class EnumName([mix-in, ...,] [data-type,] base-enum):\n" +" pass" +msgstr "" +"class EnumName([mix-in, ...,] [data-type,] base-enum):\n" +" pass" + +#: ../../howto/enum.rst:454 +msgid "" +"Also, subclassing an enumeration is allowed only if the enumeration does not" +" define any members. So this is forbidden::" +msgstr "仅当未定义任何成员时,枚举类才允许被子类化。因此不得有以下写法::" + +#: ../../howto/enum.rst:457 +msgid "" +">>> class MoreColor(Color):\n" +"... PINK = 17\n" +"...\n" +"Traceback (most recent call last):\n" +"...\n" +"TypeError: cannot extend " +msgstr "" +">>> class MoreColor(Color):\n" +"... PINK = 17\n" +"...\n" +"Traceback (most recent call last):\n" +"...\n" +"TypeError: cannot extend " + +#: ../../howto/enum.rst:464 +msgid "But this is allowed::" +msgstr "但以下代码是可以的::" + +#: ../../howto/enum.rst:466 +msgid "" +">>> class Foo(Enum):\n" +"... def some_behavior(self):\n" +"... pass\n" +"...\n" +">>> class Bar(Foo):\n" +"... HAPPY = 1\n" +"... SAD = 2\n" +"..." +msgstr "" +">>> class Foo(Enum):\n" +"... def some_behavior(self):\n" +"... pass\n" +"...\n" +">>> class Bar(Foo):\n" +"... HAPPY = 1\n" +"... SAD = 2\n" +"..." + +#: ../../howto/enum.rst:475 +msgid "" +"Allowing subclassing of enums that define members would lead to a violation " +"of some important invariants of types and instances. On the other hand, it " +"makes sense to allow sharing some common behavior between a group of " +"enumerations. (See `OrderedEnum`_ for an example.)" +msgstr "" +"如果定义了成员的枚举也能被子类化,则类型与实例的某些重要不可变规则将会被破坏。另一方面,一组枚举类共享某些操作也是合理的。(请参阅例程 " +"`OrderedEnum`_ )" + +#: ../../howto/enum.rst:484 +msgid "Dataclass support" +msgstr "数据类支持" + +#: ../../howto/enum.rst:486 +msgid "" +"When inheriting from a :class:`~dataclasses.dataclass`, the " +":meth:`~Enum.__repr__` omits the inherited class' name. For example::" +msgstr "" +"当从 :class:`~dataclasses.dataclass` 继承时,:meth:`~Enum.__repr__` 将忽略被继承类的名称。 " +"例如::" + +#: ../../howto/enum.rst:489 +msgid "" +">>> from dataclasses import dataclass, field\n" +">>> @dataclass\n" +"... class CreatureDataMixin:\n" +"... size: str\n" +"... legs: int\n" +"... tail: bool = field(repr=False, default=True)\n" +"...\n" +">>> class Creature(CreatureDataMixin, Enum):\n" +"... BEETLE = 'small', 6\n" +"... DOG = 'medium', 4\n" +"...\n" +">>> Creature.DOG\n" +"" +msgstr "" +">>> from dataclasses import dataclass, field\n" +">>> @dataclass\n" +"... class CreatureDataMixin:\n" +"... size: str\n" +"... legs: int\n" +"... tail: bool = field(repr=False, default=True)\n" +"...\n" +">>> class Creature(CreatureDataMixin, Enum):\n" +"... BEETLE = 'small', 6\n" +"... DOG = 'medium', 4\n" +"...\n" +">>> Creature.DOG\n" +"" + +#: ../../howto/enum.rst:503 +msgid "" +"Use the :func:`~dataclasses.dataclass` argument ``repr=False`` to use the " +"standard :func:`repr`." +msgstr "" +"使用 :func:`~dataclasses.dataclass` 参数 ``repr=False`` 来使用标准的 :func:`repr`。" + +#: ../../howto/enum.rst:506 +msgid "" +"Only the dataclass fields are shown in the value area, not the dataclass' " +"name." +msgstr "只有数据类字段会被显示在值区域中,数据类名称不会被显示。" + +#: ../../howto/enum.rst:512 +msgid "" +"Adding :func:`~dataclasses.dataclass` decorator to :class:`Enum` and its " +"subclasses is not supported. It will not raise any errors, but it will " +"produce very strange results at runtime, such as members being equal to each" +" other::" +msgstr "" +"向 :class:`Enum` 及其子类添加 :func:`~dataclasses.dataclass` 装饰器是不受支持的。 " +"它不会引发任何错误,但会在运行时产生非常怪异的结果,例如不同的成员彼此相等::" + +#: ../../howto/enum.rst:517 +msgid "" +">>> @dataclass # don't do this: it does not make any sense\n" +"... class Color(Enum):\n" +"... RED = 1\n" +"... BLUE = 2\n" +"...\n" +">>> Color.RED is Color.BLUE\n" +"False\n" +">>> Color.RED == Color.BLUE # problem is here: they should not be equal\n" +"True" +msgstr "" +">>> @dataclass # 不要这样做:没有任何意义\n" +"... class Color(Enum):\n" +"... RED = 1\n" +"... BLUE = 2\n" +"...\n" +">>> Color.RED is Color.BLUE\n" +"False\n" +">>> Color.RED == Color.BLUE # 问题在这里:它们不应该相等\n" +"True" + +#: ../../howto/enum.rst:529 +msgid "Pickling" +msgstr "打包(pickle)" + +#: ../../howto/enum.rst:531 +msgid "Enumerations can be pickled and unpickled::" +msgstr "枚举类型可以被打包和解包::" + +#: ../../howto/enum.rst:533 +msgid "" +">>> from test.test_enum import Fruit\n" +">>> from pickle import dumps, loads\n" +">>> Fruit.TOMATO is loads(dumps(Fruit.TOMATO))\n" +"True" +msgstr "" +">>> from test.test_enum import Fruit\n" +">>> from pickle import dumps, loads\n" +">>> Fruit.TOMATO is loads(dumps(Fruit.TOMATO))\n" +"True" + +#: ../../howto/enum.rst:538 +msgid "" +"The usual restrictions for pickling apply: picklable enums must be defined " +"in the top level of a module, since unpickling requires them to be " +"importable from that module." +msgstr "打包的常规限制同样适用于枚举类型:必须在模块的最高层级定义,因为解包操作要求可从该模块导入。" + +#: ../../howto/enum.rst:544 +msgid "" +"With pickle protocol version 4 it is possible to easily pickle enums nested " +"in other classes." +msgstr "用 pickle 协议版本 4 可以轻松地将嵌入其他类中的枚举进行打包。" + +#: ../../howto/enum.rst:547 +msgid "" +"It is possible to modify how enum members are pickled/unpickled by defining " +":meth:`~object.__reduce_ex__` in the enumeration class. The default method " +"is by-value, but enums with complicated values may want to use by-name::" +msgstr "" +"通过在枚举类中定义 " +":meth:`~object.__reduce_ex__`,可以修改枚举成员的封存/解封方式。默认方法是根据值进行的,但具有复杂值的枚举可能需要根据名称进行::" + +#: ../../howto/enum.rst:551 +msgid "" +">>> import enum\n" +">>> class MyEnum(enum.Enum):\n" +"... __reduce_ex__ = enum.pickle_by_enum_name" +msgstr "" +">>> import enum\n" +">>> class MyEnum(enum.Enum):\n" +"... __reduce_ex__ = enum.pickle_by_enum_name" + +#: ../../howto/enum.rst:557 +msgid "" +"Using by-name for flags is not recommended, as unnamed aliases will not " +"unpickle." +msgstr "不建议为旗标使用基于名称的方式,因为未命名的别名将无法解封。" + +#: ../../howto/enum.rst:562 +msgid "Functional API" +msgstr "函数式 API" + +#: ../../howto/enum.rst:564 +msgid "" +"The :class:`Enum` class is callable, providing the following functional " +"API::" +msgstr ":class:`Enum` 类可调用并提供了以下函数式 API::" + +#: ../../howto/enum.rst:566 +msgid "" +">>> Animal = Enum('Animal', 'ANT BEE CAT DOG')\n" +">>> Animal\n" +"\n" +">>> Animal.ANT\n" +"\n" +">>> list(Animal)\n" +"[, , , ]" +msgstr "" +">>> Animal = Enum('Animal', 'ANT BEE CAT DOG')\n" +">>> Animal\n" +"\n" +">>> Animal.ANT\n" +"\n" +">>> list(Animal)\n" +"[, , , ]" + +#: ../../howto/enum.rst:574 +msgid "" +"The semantics of this API resemble :class:`~collections.namedtuple`. The " +"first argument of the call to :class:`Enum` is the name of the enumeration." +msgstr "" +"该 API 的语义类似于 :class:`~collections.namedtuple`。调用 :class:`Enum` 的第一个参数是枚举的名称。" + +#: ../../howto/enum.rst:577 +msgid "" +"The second argument is the *source* of enumeration member names. It can be " +"a whitespace-separated string of names, a sequence of names, a sequence of " +"2-tuples with key/value pairs, or a mapping (e.g. dictionary) of names to " +"values. The last two options enable assigning arbitrary values to " +"enumerations; the others auto-assign increasing integers starting with 1 " +"(use the ``start`` parameter to specify a different starting value). A new " +"class derived from :class:`Enum` is returned. In other words, the above " +"assignment to :class:`!Animal` is equivalent to::" +msgstr "" +"第二个参数是枚举成员名称的 *来源*。它可以是以空白分隔的名称字符串、名称序列、包含键/值对的 2 " +"元组序列或名称到值的映射(如字典)。后两个选项可为枚举指定任意值;其他选项则自动指定从 1 开始的递增整数(使用 ``start`` " +"参数可指定不同的起始值)。返回值是一个从 :class:`Enum` 派生的新类。也就是说,上述对 :class:`!Animal` 的赋值相当于::" + +#: ../../howto/enum.rst:586 +msgid "" +">>> class Animal(Enum):\n" +"... ANT = 1\n" +"... BEE = 2\n" +"... CAT = 3\n" +"... DOG = 4\n" +"..." +msgstr "" +">>> class Animal(Enum):\n" +"... ANT = 1\n" +"... BEE = 2\n" +"... CAT = 3\n" +"... DOG = 4\n" +"..." + +#: ../../howto/enum.rst:593 +msgid "" +"The reason for defaulting to ``1`` as the starting number and not ``0`` is " +"that ``0`` is ``False`` in a boolean sense, but by default enum members all " +"evaluate to ``True``." +msgstr "默认从 ``1`` 开始而非 ``0``,因为 ``0`` 是布尔值 ``False``,但默认的枚举成员都被视作 ``True``。" + +#: ../../howto/enum.rst:597 +msgid "" +"Pickling enums created with the functional API can be tricky as frame stack " +"implementation details are used to try and figure out which module the " +"enumeration is being created in (e.g. it will fail if you use a utility " +"function in a separate module, and also may not work on IronPython or " +"Jython). The solution is to specify the module name explicitly as follows::" +msgstr "" +"对使用函数式 API " +"创建的枚举进行封存,可能会很棘手,因为要使用栈帧的实现细节来尝试找出枚举是在哪个模块中创建的(例如当你使用了另一个模块中的实用函数时它就可能失败,在 " +"IronPython 或 Jython 上也可能无效)。解决办法是像下面这样显式地指定模块名称::" + +#: ../../howto/enum.rst:603 +msgid ">>> Animal = Enum('Animal', 'ANT BEE CAT DOG', module=__name__)" +msgstr ">>> Animal = Enum('Animal', 'ANT BEE CAT DOG', module=__name__)" + +#: ../../howto/enum.rst:607 +msgid "" +"If ``module`` is not supplied, and Enum cannot determine what it is, the new" +" Enum members will not be unpicklable; to keep errors closer to the source, " +"pickling will be disabled." +msgstr "" +"如果未提供 ``module``,且 Enum 无法确定是哪个模块,新的 Enum 成员将不可被解封;为了让错误尽量靠近源头,封存将被禁用。" + +#: ../../howto/enum.rst:611 +msgid "" +"The new pickle protocol 4 also, in some circumstances, relies on " +":attr:`~type.__qualname__` being set to the location where pickle will be " +"able to find the class. For example, if the class was made available in " +"class SomeData in the global scope::" +msgstr "" +"在某些情况下,新的 pickle 版本 4 协议还需要 :attr:`~type.__qualname__` 在 pickle 能够找到类的位置。 " +"例如,如果该类是在全局作用域内的 SomeData 类中可见::" + +#: ../../howto/enum.rst:616 +msgid "" +">>> Animal = Enum('Animal', 'ANT BEE CAT DOG', qualname='SomeData.Animal')" +msgstr "" +">>> Animal = Enum('Animal', 'ANT BEE CAT DOG', qualname='SomeData.Animal')" + +#: ../../howto/enum.rst:618 +msgid "The complete signature is::" +msgstr "完整的签名为::" + +#: ../../howto/enum.rst:620 +msgid "" +"Enum(\n" +" value='NewEnumName',\n" +" names=<...>,\n" +" *,\n" +" module='...',\n" +" qualname='...',\n" +" type=,\n" +" start=1,\n" +" )" +msgstr "" +"Enum(\n" +" value='NewEnumName',\n" +" names=<...>,\n" +" *,\n" +" module='...',\n" +" qualname='...',\n" +" type=,\n" +" start=1,\n" +" )" + +#: ../../howto/enum.rst:630 +msgid "*value*: What the new enum class will record as its name." +msgstr "*value*: 新枚举类将会作为其名称记录的值。" + +#: ../../howto/enum.rst:632 +msgid "" +"*names*: The enum members. This can be a whitespace- or comma-separated " +"string (values will start at 1 unless otherwise specified)::" +msgstr "*names*: 枚举的成员。这可以是一个用空格或逗号分隔的字符串(值将从 1 开始除非另外指定)::" + +#: ../../howto/enum.rst:635 +msgid "'RED GREEN BLUE' | 'RED,GREEN,BLUE' | 'RED, GREEN, BLUE'" +msgstr "'RED GREEN BLUE' | 'RED,GREEN,BLUE' | 'RED, GREEN, BLUE'" + +#: ../../howto/enum.rst:637 +msgid "or an iterator of names::" +msgstr "或是一个名称的迭代器对象::" + +#: ../../howto/enum.rst:639 +msgid "['RED', 'GREEN', 'BLUE']" +msgstr "['RED', 'GREEN', 'BLUE']" + +#: ../../howto/enum.rst:641 +msgid "or an iterator of (name, value) pairs::" +msgstr "或是一个 (名称,值) 对的迭代器对象::" + +#: ../../howto/enum.rst:643 +msgid "[('CYAN', 4), ('MAGENTA', 5), ('YELLOW', 6)]" +msgstr "[('CYAN', 4), ('MAGENTA', 5), ('YELLOW', 6)]" + +#: ../../howto/enum.rst:645 +msgid "or a mapping::" +msgstr "或是一个映射对象::" + +#: ../../howto/enum.rst:647 +msgid "{'CHARTREUSE': 7, 'SEA_GREEN': 11, 'ROSEMARY': 42}" +msgstr "{'CHARTREUSE': 7, 'SEA_GREEN': 11, 'ROSEMARY': 42}" + +#: ../../howto/enum.rst:649 +msgid "*module*: name of module where new enum class can be found." +msgstr "*module*: 新枚举类所在的模块名。" + +#: ../../howto/enum.rst:651 +msgid "*qualname*: where in module new enum class can be found." +msgstr "*qualname*: 新枚举类在模块内的位置。" + +#: ../../howto/enum.rst:653 +msgid "*type*: type to mix in to new enum class." +msgstr "*type*: 要混入到新枚举类的类型。" + +#: ../../howto/enum.rst:655 +msgid "*start*: number to start counting at if only names are passed in." +msgstr "*start*: 当只传入名称时要使用的起始计数编号。" + +#: ../../howto/enum.rst:657 +msgid "The *start* parameter was added." +msgstr "增加了 *start* 形参。" + +#: ../../howto/enum.rst:662 +msgid "Derived Enumerations" +msgstr "派生的枚举" + +#: ../../howto/enum.rst:665 +msgid "IntEnum" +msgstr "IntEnum" + +#: ../../howto/enum.rst:667 +msgid "" +"The first variation of :class:`Enum` that is provided is also a subclass of " +":class:`int`. Members of an :class:`IntEnum` can be compared to integers; " +"by extension, integer enumerations of different types can also be compared " +"to each other::" +msgstr "" +"所提供的第一个变种 :class:`Enum` 同时也是 :class:`int` 的一个子类。 :class:`IntEnum` " +"的成员可与整数进行比较;通过扩展,不同类型的整数枚举也可以相互进行比较::" + +#: ../../howto/enum.rst:672 +msgid "" +">>> from enum import IntEnum\n" +">>> class Shape(IntEnum):\n" +"... CIRCLE = 1\n" +"... SQUARE = 2\n" +"...\n" +">>> class Request(IntEnum):\n" +"... POST = 1\n" +"... GET = 2\n" +"...\n" +">>> Shape == 1\n" +"False\n" +">>> Shape.CIRCLE == 1\n" +"True\n" +">>> Shape.CIRCLE == Request.POST\n" +"True" +msgstr "" +">>> from enum import IntEnum\n" +">>> class Shape(IntEnum):\n" +"... CIRCLE = 1\n" +"... SQUARE = 2\n" +"...\n" +">>> class Request(IntEnum):\n" +"... POST = 1\n" +"... GET = 2\n" +"...\n" +">>> Shape == 1\n" +"False\n" +">>> Shape.CIRCLE == 1\n" +"True\n" +">>> Shape.CIRCLE == Request.POST\n" +"True" + +#: ../../howto/enum.rst:688 +msgid "" +"However, they still can't be compared to standard :class:`Enum` " +"enumerations::" +msgstr "不过,它们仍然不可与标准 :class:`Enum` 枚举进行比较::" + +#: ../../howto/enum.rst:690 +msgid "" +">>> class Shape(IntEnum):\n" +"... CIRCLE = 1\n" +"... SQUARE = 2\n" +"...\n" +">>> class Color(Enum):\n" +"... RED = 1\n" +"... GREEN = 2\n" +"...\n" +">>> Shape.CIRCLE == Color.RED\n" +"False" +msgstr "" +">>> class Shape(IntEnum):\n" +"... CIRCLE = 1\n" +"... SQUARE = 2\n" +"...\n" +">>> class Color(Enum):\n" +"... RED = 1\n" +"... GREEN = 2\n" +"...\n" +">>> Shape.CIRCLE == Color.RED\n" +"False" + +#: ../../howto/enum.rst:701 +msgid "" +":class:`IntEnum` values behave like integers in other ways you'd expect::" +msgstr ":class:`IntEnum` 值在其他方面的行为都如你预期的一样类似于整数::" + +#: ../../howto/enum.rst:703 +msgid "" +">>> int(Shape.CIRCLE)\n" +"1\n" +">>> ['a', 'b', 'c'][Shape.CIRCLE]\n" +"'b'\n" +">>> [i for i in range(Shape.SQUARE)]\n" +"[0, 1]" +msgstr "" +">>> int(Shape.CIRCLE)\n" +"1\n" +">>> ['a', 'b', 'c'][Shape.CIRCLE]\n" +"'b'\n" +">>> [i for i in range(Shape.SQUARE)]\n" +"[0, 1]" + +#: ../../howto/enum.rst:712 +msgid "StrEnum" +msgstr "StrEnum" + +#: ../../howto/enum.rst:714 +msgid "" +"The second variation of :class:`Enum` that is provided is also a subclass of" +" :class:`str`. Members of a :class:`StrEnum` can be compared to strings; by" +" extension, string enumerations of different types can also be compared to " +"each other." +msgstr "" +"所提供的第二种 :class:`Enum` 变体同时也是 :class:`str` 的一个子类。 :class:`StrEnum` " +"的成员可与字符串进行比较;通过扩展,不同类型的字符串枚举也可以相互进行比较。" + +#: ../../howto/enum.rst:723 +msgid "IntFlag" +msgstr "IntFlag" + +#: ../../howto/enum.rst:725 +msgid "" +"The next variation of :class:`Enum` provided, :class:`IntFlag`, is also " +"based on :class:`int`. The difference being :class:`IntFlag` members can be" +" combined using the bitwise operators (&, \\|, ^, ~) and the result is still" +" an :class:`IntFlag` member, if possible. Like :class:`IntEnum`, " +":class:`IntFlag` members are also integers and can be used wherever an " +":class:`int` is used." +msgstr "" +"所提供的下一种 :class:`Enum` 变体 :class:`IntFlag` 也是基于 :class:`int` 的。不同之处在于 " +":class:`IntFlag` 成员可以用位运算符 (&, \\|,^, ~) 进行组合并且如果可能的话其结果仍将是 :class:`IntFlag`" +" 成员。与 :class:`IntEnum` 类似,:class:`IntFlag` 成员也是整数并且可以用于任何使用 :class:`int` " +"的地方。" + +#: ../../howto/enum.rst:733 +msgid "" +"Any operation on an :class:`IntFlag` member besides the bit-wise operations " +"will lose the :class:`IntFlag` membership." +msgstr "除位操作外,其他所有对 :class:`IntFlag` 成员的操作,都会失去 :class:`IntFlag` 成员资格。" + +#: ../../howto/enum.rst:736 +msgid "" +"Bit-wise operations that result in invalid :class:`IntFlag` values will lose" +" the :class:`IntFlag` membership. See :class:`FlagBoundary` for details." +msgstr "" +"导致 :class:`IntFlag` 值无效的位操作将失去 :class:`IntFlag` 成员资格。详见 " +":class:`FlagBoundary`。" + +#: ../../howto/enum.rst:743 +msgid "Sample :class:`IntFlag` class::" +msgstr "示例 :class:`IntFlag` 类::" + +#: ../../howto/enum.rst:745 +msgid "" +">>> from enum import IntFlag\n" +">>> class Perm(IntFlag):\n" +"... R = 4\n" +"... W = 2\n" +"... X = 1\n" +"...\n" +">>> Perm.R | Perm.W\n" +"\n" +">>> Perm.R + Perm.W\n" +"6\n" +">>> RW = Perm.R | Perm.W\n" +">>> Perm.R in RW\n" +"True" +msgstr "" +">>> from enum import IntFlag\n" +">>> class Perm(IntFlag):\n" +"... R = 4\n" +"... W = 2\n" +"... X = 1\n" +"...\n" +">>> Perm.R | Perm.W\n" +"\n" +">>> Perm.R + Perm.W\n" +"6\n" +">>> RW = Perm.R | Perm.W\n" +">>> Perm.R in RW\n" +"True" + +#: ../../howto/enum.rst:759 +msgid "It is also possible to name the combinations::" +msgstr "对于组合同样可以进行命名::" + +#: ../../howto/enum.rst:761 +msgid "" +">>> class Perm(IntFlag):\n" +"... R = 4\n" +"... W = 2\n" +"... X = 1\n" +"... RWX = 7\n" +"...\n" +">>> Perm.RWX\n" +"\n" +">>> ~Perm.RWX\n" +"\n" +">>> Perm(7)\n" +"" +msgstr "" +">>> class Perm(IntFlag):\n" +"... R = 4\n" +"... W = 2\n" +"... X = 1\n" +"... RWX = 7\n" +"...\n" +">>> Perm.RWX\n" +"\n" +">>> ~Perm.RWX\n" +"\n" +">>> Perm(7)\n" +"" + +#: ../../howto/enum.rst:776 +msgid "" +"Named combinations are considered aliases. Aliases do not show up during " +"iteration, but can be returned from by-value lookups." +msgstr "命名的枚举组合被视作别名。别名在迭代过程中不会显示,但可以通过值查询返回。" + +#: ../../howto/enum.rst:781 +msgid "" +"Another important difference between :class:`IntFlag` and :class:`Enum` is " +"that if no flags are set (the value is 0), its boolean evaluation is " +":data:`False`::" +msgstr "" +":class:`IntFlag` 和 :class:`Enum` 的另一个重要区别在于如果没有设置任何旗标(值为 0),则其布尔值为 " +":data:`False`::" + +#: ../../howto/enum.rst:784 +msgid "" +">>> Perm.R & Perm.X\n" +"\n" +">>> bool(Perm.R & Perm.X)\n" +"False" +msgstr "" +">>> Perm.R & Perm.X\n" +"\n" +">>> bool(Perm.R & Perm.X)\n" +"False" + +#: ../../howto/enum.rst:789 +msgid "" +"Because :class:`IntFlag` members are also subclasses of :class:`int` they " +"can be combined with them (but may lose :class:`IntFlag` membership::" +msgstr "" +"因为 :class:`IntFlag` 成员也是 :class:`int` 的子类,它们可以相互组合(但可能会失去 :class:`IntFlag` " +"成员资格::" + +#: ../../howto/enum.rst:792 +msgid "" +">>> Perm.X | 4\n" +"\n" +"\n" +">>> Perm.X + 8\n" +"9" +msgstr "" +">>> Perm.X | 4\n" +"\n" +"\n" +">>> Perm.X + 8\n" +"9" + +#: ../../howto/enum.rst:800 +msgid "" +"The negation operator, ``~``, always returns an :class:`IntFlag` member with" +" a positive value::" +msgstr "否运算符 ``~``,始终会返回一个具有正值的 :class:`IntFlag` 成员::" + +#: ../../howto/enum.rst:803 +msgid "" +">>> (~Perm.X).value == (Perm.R|Perm.W).value == 6\n" +"True" +msgstr "" +">>> (~Perm.X).value == (Perm.R|Perm.W).value == 6\n" +"True" + +#: ../../howto/enum.rst:806 +msgid ":class:`IntFlag` members can also be iterated over::" +msgstr ":class:`IntFlag` 成员也可被迭代遍历::" + +#: ../../howto/enum.rst:808 +msgid "" +">>> list(RW)\n" +"[, ]" +msgstr "" +">>> list(RW)\n" +"[, ]" + +#: ../../howto/enum.rst:815 +msgid "Flag" +msgstr "Flag" + +#: ../../howto/enum.rst:817 +msgid "" +"The last variation is :class:`Flag`. Like :class:`IntFlag`, :class:`Flag` " +"members can be combined using the bitwise operators (&, \\|, ^, ~). Unlike " +":class:`IntFlag`, they cannot be combined with, nor compared against, any " +"other :class:`Flag` enumeration, nor :class:`int`. While it is possible to " +"specify the values directly it is recommended to use :class:`auto` as the " +"value and let :class:`Flag` select an appropriate value." +msgstr "" +"最后一个变体是 :class:`Flag`。与 :class:`IntFlag` 类似,:class:`Flag` 成员可用按位运算符 (&, \\|," +" ^, ~) 组合。与 :class:`IntFlag` 不同的是,它们不可与其它 :class:`Flag` 枚举或 :class:`int` " +"进行组合或比较。虽然可以直接指定值,但推荐使用 :class:`auto` 作为值来让 :class:`Flag` 选择适当的值。" + +#: ../../howto/enum.rst:826 +msgid "" +"Like :class:`IntFlag`, if a combination of :class:`Flag` members results in " +"no flags being set, the boolean evaluation is :data:`False`::" +msgstr "" +"与 :class:`IntFlag` 类似,如果 :class:`Flag` 成员的某种组合导致没有设置任何旗标,则其布尔值为 " +":data:`False`::" + +#: ../../howto/enum.rst:829 +msgid "" +">>> from enum import Flag, auto\n" +">>> class Color(Flag):\n" +"... RED = auto()\n" +"... BLUE = auto()\n" +"... GREEN = auto()\n" +"...\n" +">>> Color.RED & Color.GREEN\n" +"\n" +">>> bool(Color.RED & Color.GREEN)\n" +"False" +msgstr "" +">>> from enum import Flag, auto\n" +">>> class Color(Flag):\n" +"... RED = auto()\n" +"... BLUE = auto()\n" +"... GREEN = auto()\n" +"...\n" +">>> Color.RED & Color.GREEN\n" +"\n" +">>> bool(Color.RED & Color.GREEN)\n" +"False" + +#: ../../howto/enum.rst:840 +msgid "" +"Individual flags should have values that are powers of two (1, 2, 4, 8, " +"...), while combinations of flags will not::" +msgstr "单个旗标的值应当为二的幂 (1, 2, 4, 8, ...),而旗标的组合则无此限制::" + +#: ../../howto/enum.rst:843 +msgid "" +">>> class Color(Flag):\n" +"... RED = auto()\n" +"... BLUE = auto()\n" +"... GREEN = auto()\n" +"... WHITE = RED | BLUE | GREEN\n" +"...\n" +">>> Color.WHITE\n" +"" +msgstr "" +">>> class Color(Flag):\n" +"... RED = auto()\n" +"... BLUE = auto()\n" +"... GREEN = auto()\n" +"... WHITE = RED | BLUE | GREEN\n" +"...\n" +">>> Color.WHITE\n" +"" + +#: ../../howto/enum.rst:852 +msgid "" +"Giving a name to the \"no flags set\" condition does not change its boolean " +"value::" +msgstr "对 \"未设置任何旗标\" 条件指定一个名称并不会改变其布尔值::" + +#: ../../howto/enum.rst:855 +msgid "" +">>> class Color(Flag):\n" +"... BLACK = 0\n" +"... RED = auto()\n" +"... BLUE = auto()\n" +"... GREEN = auto()\n" +"...\n" +">>> Color.BLACK\n" +"\n" +">>> bool(Color.BLACK)\n" +"False" +msgstr "" +">>> class Color(Flag):\n" +"... BLACK = 0\n" +"... RED = auto()\n" +"... BLUE = auto()\n" +"... GREEN = auto()\n" +"...\n" +">>> Color.BLACK\n" +"\n" +">>> bool(Color.BLACK)\n" +"False" + +#: ../../howto/enum.rst:866 +msgid ":class:`Flag` members can also be iterated over::" +msgstr ":class:`Flag` 成员也可被迭代遍历::" + +#: ../../howto/enum.rst:868 +msgid "" +">>> purple = Color.RED | Color.BLUE\n" +">>> list(purple)\n" +"[, ]" +msgstr "" +">>> purple = Color.RED | Color.BLUE\n" +">>> list(purple)\n" +"[, ]" + +#: ../../howto/enum.rst:876 +msgid "" +"For the majority of new code, :class:`Enum` and :class:`Flag` are strongly " +"recommended, since :class:`IntEnum` and :class:`IntFlag` break some semantic" +" promises of an enumeration (by being comparable to integers, and thus by " +"transitivity to other unrelated enumerations). :class:`IntEnum` and " +":class:`IntFlag` should be used only in cases where :class:`Enum` and " +":class:`Flag` will not do; for example, when integer constants are replaced " +"with enumerations, or for interoperability with other systems." +msgstr "" +"对于大多数新代码,强烈推荐使用 :class:`Enum` 和 :class:`Flag`,因为 :class:`IntEnum` 和 " +":class:`IntFlag` 打破了枚举的某些语义约定(例如可以同整数进行比较,并因而导致此行为被传递给其他无关的枚举)。 " +":class:`IntEnum` 和 :class:`IntFlag` 的使用应当仅限于 :class:`Enum` 和 :class:`Flag` " +"无法使用的场合;例如,当使用枚举替代整数常量时,或是与其他系统进行交互操作时。" + +#: ../../howto/enum.rst:886 +msgid "Others" +msgstr "其他事项" + +#: ../../howto/enum.rst:888 +msgid "" +"While :class:`IntEnum` is part of the :mod:`enum` module, it would be very " +"simple to implement independently::" +msgstr "虽然 :class:`IntEnum` 是 :mod:`enum` 模块的一部分,但要独立实现也应该相当容易::" + +#: ../../howto/enum.rst:891 +msgid "" +"class IntEnum(int, ReprEnum): # or Enum instead of ReprEnum\n" +" pass" +msgstr "" +"class IntEnum(int, ReprEnum): # 或用 Enum 而不是 ReprEnum\n" +" pass" + +#: ../../howto/enum.rst:894 +msgid "" +"This demonstrates how similar derived enumerations can be defined; for " +"example a :class:`!FloatEnum` that mixes in :class:`float` instead of " +":class:`int`." +msgstr "" +"这里演示了类似的派生枚举可以如何被定义;例如,一个混入了 :class:`float` 而不是 :class:`int` 的 " +":class:`!FloatEnum`。" + +#: ../../howto/enum.rst:897 +msgid "Some rules:" +msgstr "几条规则:" + +#: ../../howto/enum.rst:899 +msgid "" +"When subclassing :class:`Enum`, mix-in types must appear before the " +":class:`Enum` class itself in the sequence of bases, as in the " +":class:`IntEnum` example above." +msgstr "" +"当子类化 :class:`Enum` 时,混入类型必须出现在基类序列中的 :class:`Enum` 类本身之前,如以上 " +":class:`IntEnum` 的例子所示。" + +#: ../../howto/enum.rst:902 +msgid "" +"Mix-in types must be subclassable. For example, :class:`bool` and " +":class:`range` are not subclassable and will throw an error during Enum " +"creation if used as the mix-in type." +msgstr "" +"混入类型必须是可子类化的。例如,:class:`bool` 和 :class:`range` " +"是不可子类化的因而如果被用作混入类型就将在枚举创建期间抛出错误。" + +#: ../../howto/enum.rst:905 +msgid "" +"While :class:`Enum` can have members of any type, once you mix in an " +"additional type, all the members must have values of that type, e.g. " +":class:`int` above. This restriction does not apply to mix-ins which only " +"add methods and don't specify another type." +msgstr "" +"虽然 :class:`Enum` 可以拥有任意类型的成员,不过一旦你混合了附加类型,则所有成员必须为相应类型的值,如在上面的例子中即为 " +":class:`int`。此限制不适用于仅添加方法而未指定另一数据类型的混合类。" + +#: ../../howto/enum.rst:909 +msgid "" +"When another data type is mixed in, the :attr:`~Enum.value` attribute is " +"*not the same* as the enum member itself, although it is equivalent and will" +" compare equal." +msgstr "当混合了另一数据类型时,:attr:`~Enum.value` 属性将 *不同于* 枚举成员本身,不过它们仍会保持等价且比较结果也相等。" + +#: ../../howto/enum.rst:912 +msgid "" +"A ``data type`` is a mixin that defines :meth:`~object.__new__`, or a " +":class:`~dataclasses.dataclass`" +msgstr "" +"``data type`` 是一个定义了 :meth:`~object.__new__` 的混入对象,或者是一个 " +":class:`~dataclasses.dataclass`" + +#: ../../howto/enum.rst:914 +msgid "" +"%-style formatting: ``%s`` and ``%r`` call the :class:`Enum` class's " +":meth:`~object.__str__` and :meth:`~object.__repr__` respectively; other " +"codes (such as ``%i`` or ``%h`` for IntEnum) treat the enum member as its " +"mixed-in type." +msgstr "" +"%-形式的格式化: ``%s`` 和 ``%r`` 会分别调用 :class:`Enum` 类的 :meth:`~object.__str__` 和 " +":meth:`~object.__repr__`;其他代码(如 ``%i`` 或 ``%h`` 用于 IntEnum)会将枚举成员当作对应的混入类型。" + +#: ../../howto/enum.rst:917 +msgid "" +":ref:`Formatted string literals `, :meth:`str.format`, and " +":func:`format` will use the enum's :meth:`~object.__str__` method." +msgstr "" +":ref:`格式化字符串字面值 `, :meth:`str.format` 和 :func:`format` 将使用枚举的 " +":meth:`~object.__str__` 方法。" + +#: ../../howto/enum.rst:922 +msgid "" +"Because :class:`IntEnum`, :class:`IntFlag`, and :class:`StrEnum` are " +"designed to be drop-in replacements for existing constants, their " +":meth:`~object.__str__` method has been reset to their data types' " +":meth:`~object.__str__` method." +msgstr "" +"由于 :class:`IntEnum`, :class:`IntFlag` 和 :class:`StrEnum` 被设计为现有常量的无缝替换,它们的 " +":meth:`~object.__str__` 方法已被重置为其数据类型的 :meth:`~object.__str__` 方法。" + +#: ../../howto/enum.rst:930 +msgid "When to use :meth:`~object.__new__` vs. :meth:`~object.__init__`" +msgstr "何时应使用 :meth:`~object.__new__` 或 :meth:`~object.__init__`" + +#: ../../howto/enum.rst:932 +msgid "" +":meth:`~object.__new__` must be used whenever you want to customize the " +"actual value of the :class:`Enum` member. Any other modifications may go in" +" either :meth:`~object.__new__` or :meth:`~object.__init__`, with " +":meth:`~object.__init__` being preferred." +msgstr "" +"当你想要定制 :class:`Enum` 成员的实际值时你必须使用 :meth:`~object.__new__`。任何其他修改则可使用 " +":meth:`~object.__new__` 或 :meth:`~object.__init__`,其中 " +":meth:`~object.__init__` 更为推荐。" + +#: ../../howto/enum.rst:936 +msgid "" +"For example, if you want to pass several items to the constructor, but only " +"want one of them to be the value::" +msgstr "举例来说,如果你要向构造器传入多个条目,但只希望将其中一个作为值::" + +#: ../../howto/enum.rst:939 +msgid "" +">>> class Coordinate(bytes, Enum):\n" +"... \"\"\"\n" +"... Coordinate with binary codes that can be indexed by the int code.\n" +"... \"\"\"\n" +"... def __new__(cls, value, label, unit):\n" +"... obj = bytes.__new__(cls, [value])\n" +"... obj._value_ = value\n" +"... obj.label = label\n" +"... obj.unit = unit\n" +"... return obj\n" +"... PX = (0, 'P.X', 'km')\n" +"... PY = (1, 'P.Y', 'km')\n" +"... VX = (2, 'V.X', 'km/s')\n" +"... VY = (3, 'V.Y', 'km/s')\n" +"...\n" +"\n" +">>> print(Coordinate['PY'])\n" +"Coordinate.PY\n" +"\n" +">>> print(Coordinate(3))\n" +"Coordinate.VY" +msgstr "" +">>> class Coordinate(bytes, Enum):\n" +"... \"\"\"\n" +"... Coordinate with binary codes that can be indexed by the int code.\n" +"... \"\"\"\n" +"... def __new__(cls, value, label, unit):\n" +"... obj = bytes.__new__(cls, [value])\n" +"... obj._value_ = value\n" +"... obj.label = label\n" +"... obj.unit = unit\n" +"... return obj\n" +"... PX = (0, 'P.X', 'km')\n" +"... PY = (1, 'P.Y', 'km')\n" +"... VX = (2, 'V.X', 'km/s')\n" +"... VY = (3, 'V.Y', 'km/s')\n" +"...\n" +"\n" +">>> print(Coordinate['PY'])\n" +"Coordinate.PY\n" +"\n" +">>> print(Coordinate(3))\n" +"Coordinate.VY" + +#: ../../howto/enum.rst:963 +msgid "" +"*Do not* call ``super().__new__()``, as the lookup-only ``__new__`` is the " +"one that is found; instead, use the data type directly." +msgstr "*不要* 调用 ``super().__new__()``,因为只能找到仅用于查找的 ``__new__``;请改为直接使用该数据类型。" + +#: ../../howto/enum.rst:968 +msgid "Finer Points" +msgstr "细节要点" + +#: ../../howto/enum.rst:971 +msgid "Supported ``__dunder__`` and ``_sunder_`` names" +msgstr "支持的 ``__dunder__`` 和 ``_sunder_`` 名称" + +#: ../../howto/enum.rst:973 +msgid "" +"The supported ``__dunder__`` and ``_sunder_`` names can be found in the " +":ref:`Enum API documentation `." +msgstr "" +"受支持的 ``__dunder__`` 和 ``_sunder_`` 名称可在 :ref:`Enum API 文档 ` 中找到。" + +#: ../../howto/enum.rst:977 +msgid "_Private__names" +msgstr "_Private__names" + +#: ../../howto/enum.rst:979 +msgid "" +":ref:`Private names ` are not converted to enum " +"members, but remain normal attributes." +msgstr ":ref:`私有名称 ` 不会被转换为枚举成员,而是保持为普通属性。" + +#: ../../howto/enum.rst:986 +msgid "``Enum`` member type" +msgstr "``Enum`` 成员类型" + +#: ../../howto/enum.rst:988 +msgid "" +"Enum members are instances of their enum class, and are normally accessed as" +" ``EnumClass.member``. In certain situations, such as writing custom enum " +"behavior, being able to access one member directly from another is useful, " +"and is supported; however, in order to avoid name clashes between member " +"names and attributes/methods from mixed-in classes, upper-case names are " +"strongly recommended." +msgstr "" +"枚举成员是其枚举类的实例,并且通常以 ``EnumClass.member`` 的形式来访问。 " +"在特定场景下,如编写自定义枚举行为,可直接从一个成员访问另一个成员的能力是很有用的,并且是受支持的;但是,为了避免成员名与混入类属性/方法之间发生名称冲突,强烈建议使用大写形式的名称。" + +#: ../../howto/enum.rst:999 +msgid "Creating members that are mixed with other data types" +msgstr "创建与其他数据类型混合的成员" + +#: ../../howto/enum.rst:1001 +msgid "" +"When subclassing other data types, such as :class:`int` or :class:`str`, " +"with an :class:`Enum`, all values after the ``=`` are passed to that data " +"type's constructor. For example::" +msgstr "" +"当使用 :class:`Enum` 来子类化其他数据类型,如 :class:`int` 或 :class:`str` 时,所有在 ``=`` " +"之后的值都会被传递给该数据类型的构造器。例如::" + +#: ../../howto/enum.rst:1005 +msgid "" +">>> class MyEnum(IntEnum): # help(int) -> int(x, base=10) -> integer\n" +"... example = '11', 16 # so x='11' and base=16\n" +"...\n" +">>> MyEnum.example.value # and hex(11) is...\n" +"17" +msgstr "" +">>> class MyEnum(IntEnum): # help(int) -> int(x, base=10) -> integer\n" +"... example = '11', 16 # 这样 x='11' 而 base=16\n" +"...\n" +">>> MyEnum.example.value # 而 hex(11) 为...\n" +"17" + +#: ../../howto/enum.rst:1013 +msgid "Boolean value of ``Enum`` classes and members" +msgstr "``Enum`` 类和成员的布尔值" + +#: ../../howto/enum.rst:1015 +msgid "" +"Enum classes that are mixed with non-:class:`Enum` types (such as " +":class:`int`, :class:`str`, etc.) are evaluated according to the mixed-in " +"type's rules; otherwise, all members evaluate as :data:`True`. To make your" +" own enum's boolean evaluation depend on the member's value add the " +"following to your class::" +msgstr "" +"与非 :class:`Enum` 类型(如 :class:`int`、:class:`str` " +"等)混合的枚举类会根据混合类型的规则进行计算;否则,所有成员都计算为 " +":data:`True`。为了使你自己的枚举的布尔值取决于成员的值,请在你的类中添加以下内容::" + +#: ../../howto/enum.rst:1021 +msgid "" +"def __bool__(self):\n" +" return bool(self.value)" +msgstr "" +"def __bool__(self):\n" +" return bool(self.value)" + +#: ../../howto/enum.rst:1024 +msgid "Plain :class:`Enum` classes always evaluate as :data:`True`." +msgstr "普通的 :class:`Enum` 类总是计算为 :data:`True`。" + +#: ../../howto/enum.rst:1028 +msgid "``Enum`` classes with methods" +msgstr "带有方法的 ``Enum`` 类" + +#: ../../howto/enum.rst:1030 +msgid "" +"If you give your enum subclass extra methods, like the `Planet`_ class " +"below, those methods will show up in a :func:`dir` of the member, but not of" +" the class::" +msgstr "" +"如果你给你的枚举子类提供了额外的方法,如下面的 `Planet`_ 类那样,这些方法将显示在成员的,而不是类的 :func:`dir` 中::" + +#: ../../howto/enum.rst:1034 +msgid "" +">>> dir(Planet)\n" +"['EARTH', 'JUPITER', 'MARS', 'MERCURY', 'NEPTUNE', 'SATURN', 'URANUS', 'VENUS', '__class__', '__doc__', '__members__', '__module__']\n" +">>> dir(Planet.EARTH)\n" +"['__class__', '__doc__', '__module__', 'mass', 'name', 'radius', 'surface_gravity', 'value']" +msgstr "" +">>> dir(Planet)\n" +"['EARTH', 'JUPITER', 'MARS', 'MERCURY', 'NEPTUNE', 'SATURN', 'URANUS', 'VENUS', '__class__', '__doc__', '__members__', '__module__']\n" +">>> dir(Planet.EARTH)\n" +"['__class__', '__doc__', '__module__', 'mass', 'name', 'radius', 'surface_gravity', 'value']" + +#: ../../howto/enum.rst:1041 +msgid "Combining members of ``Flag``" +msgstr "组合 ``Flag`` 的成员" + +#: ../../howto/enum.rst:1043 +msgid "" +"Iterating over a combination of :class:`Flag` members will only return the " +"members that are comprised of a single bit::" +msgstr "遍历 :class:`Flag` 成员的组合将只返回由一个比特组成的成员::" + +#: ../../howto/enum.rst:1046 +msgid "" +">>> class Color(Flag):\n" +"... RED = auto()\n" +"... GREEN = auto()\n" +"... BLUE = auto()\n" +"... MAGENTA = RED | BLUE\n" +"... YELLOW = RED | GREEN\n" +"... CYAN = GREEN | BLUE\n" +"...\n" +">>> Color(3) # named combination\n" +"\n" +">>> Color(7) # not named combination\n" +"" +msgstr "" +">>> class Color(Flag):\n" +"... RED = auto()\n" +"... GREEN = auto()\n" +"... BLUE = auto()\n" +"... MAGENTA = RED | BLUE\n" +"... YELLOW = RED | GREEN\n" +"... CYAN = GREEN | BLUE\n" +"...\n" +">>> Color(3) # named combination\n" +"\n" +">>> Color(7) # not named combination\n" +"" + +#: ../../howto/enum.rst:1061 +msgid "``Flag`` and ``IntFlag`` minutia" +msgstr "``Flag`` 和 ``IntFlag`` 的细节" + +#: ../../howto/enum.rst:1063 +msgid "Using the following snippet for our examples::" +msgstr "使用以下代码段作为我们的例子::" + +#: ../../howto/enum.rst:1065 +msgid "" +">>> class Color(IntFlag):\n" +"... BLACK = 0\n" +"... RED = 1\n" +"... GREEN = 2\n" +"... BLUE = 4\n" +"... PURPLE = RED | BLUE\n" +"... WHITE = RED | GREEN | BLUE\n" +"..." +msgstr "" +">>> class Color(IntFlag):\n" +"... BLACK = 0\n" +"... RED = 1\n" +"... GREEN = 2\n" +"... BLUE = 4\n" +"... PURPLE = RED | BLUE\n" +"... WHITE = RED | GREEN | BLUE\n" +"..." + +#: ../../howto/enum.rst:1074 +msgid "the following are true:" +msgstr "下列情况成立:" + +#: ../../howto/enum.rst:1076 +msgid "single-bit flags are canonical" +msgstr "单比特旗标是规范的" + +#: ../../howto/enum.rst:1077 +msgid "multi-bit and zero-bit flags are aliases" +msgstr "多比特和零比特旗标是别名" + +#: ../../howto/enum.rst:1078 +msgid "only canonical flags are returned during iteration::" +msgstr "迭代过程中只返回规范的旗标::" + +#: ../../howto/enum.rst:1080 +msgid "" +">>> list(Color.WHITE)\n" +"[, , ]" +msgstr "" +">>> list(Color.WHITE)\n" +"[, , ]" + +#: ../../howto/enum.rst:1083 +msgid "" +"negating a flag or flag set returns a new flag/flag set with the " +"corresponding positive integer value::" +msgstr "取反一个旗标或旗标集会返回一个具有对应正整数值的新旗标/旗标集::" + +#: ../../howto/enum.rst:1086 +msgid "" +">>> Color.BLUE\n" +"\n" +"\n" +">>> ~Color.BLUE\n" +"" +msgstr "" +">>> Color.BLUE\n" +"\n" +"\n" +">>> ~Color.BLUE\n" +"" + +#: ../../howto/enum.rst:1092 +msgid "names of pseudo-flags are constructed from their members' names::" +msgstr "伪旗标的名称是由其成员的名称构建的::" + +#: ../../howto/enum.rst:1094 +msgid "" +">>> (Color.RED | Color.GREEN).name\n" +"'RED|GREEN'\n" +"\n" +">>> class Perm(IntFlag):\n" +"... R = 4\n" +"... W = 2\n" +"... X = 1\n" +"...\n" +">>> (Perm.R & Perm.W).name is None # effectively Perm(0)\n" +"True" +msgstr "" +">>> (Color.RED | Color.GREEN).name\n" +"'RED|GREEN'\n" +"\n" +">>> class Perm(IntFlag):\n" +"... R = 4\n" +"... W = 2\n" +"... X = 1\n" +"...\n" +">>> (Perm.R & Perm.W).name is None # effectively Perm(0)\n" +"True" + +#: ../../howto/enum.rst:1105 +msgid "multi-bit flags, aka aliases, can be returned from operations::" +msgstr "多位旗标,又称别名,可以从操作中返回::" + +#: ../../howto/enum.rst:1107 +msgid "" +">>> Color.RED | Color.BLUE\n" +"\n" +"\n" +">>> Color(7) # or Color(-1)\n" +"\n" +"\n" +">>> Color(0)\n" +"" +msgstr "" +">>> Color.RED | Color.BLUE\n" +"\n" +"\n" +">>> Color(7) # or Color(-1)\n" +"\n" +"\n" +">>> Color(0)\n" +"" + +#: ../../howto/enum.rst:1116 +msgid "" +"membership / containment checking: zero-valued flags are always considered " +"to be contained::" +msgstr "成员 / 包含检测:零值旗标总是会被视为包含::" + +#: ../../howto/enum.rst:1119 +msgid "" +">>> Color.BLACK in Color.WHITE\n" +"True" +msgstr "" +">>> Color.BLACK in Color.WHITE\n" +"True" + +#: ../../howto/enum.rst:1122 +msgid "" +"otherwise, only if all bits of one flag are in the other flag will True be " +"returned::" +msgstr "在其他情况下,仅当一个旗标的所有比特位都包含于另一个旗标中才会返回 True::" + +#: ../../howto/enum.rst:1125 +msgid "" +">>> Color.PURPLE in Color.WHITE\n" +"True\n" +"\n" +">>> Color.GREEN in Color.PURPLE\n" +"False" +msgstr "" +">>> Color.PURPLE in Color.WHITE\n" +"True\n" +"\n" +">>> Color.GREEN in Color.PURPLE\n" +"False" + +#: ../../howto/enum.rst:1131 +msgid "" +"There is a new boundary mechanism that controls how out-of-range / invalid " +"bits are handled: ``STRICT``, ``CONFORM``, ``EJECT``, and ``KEEP``:" +msgstr "" +"有一个新的边界机制,控制如何处理超出范围的/无效的比特: ``STRICT``,``CONFORM``,``EJECT``,``KEEP``。" + +#: ../../howto/enum.rst:1134 +msgid "STRICT --> raises an exception when presented with invalid values" +msgstr "STRICT --> 当出现无效的值时,会触发一个异常。" + +#: ../../howto/enum.rst:1135 +msgid "CONFORM --> discards any invalid bits" +msgstr "CONFORM --> 丢弃任何无效的比特" + +#: ../../howto/enum.rst:1136 +msgid "" +"EJECT --> lose Flag status and become a normal int with the given value" +msgstr "EJECT --> 失去 Flag 的状态,成为一个具有给定值的普通 int。" + +#: ../../howto/enum.rst:1137 +msgid "KEEP --> keep the extra bits" +msgstr "KEEP --> 保留额外的比特" + +#: ../../howto/enum.rst:1139 +msgid "keeps Flag status and extra bits" +msgstr "保留 Flag 状态和额外的比特" + +#: ../../howto/enum.rst:1140 +msgid "extra bits do not show up in iteration" +msgstr "额外的比特不会在迭代中显示出来" + +#: ../../howto/enum.rst:1141 +msgid "extra bits do show up in repr() and str()" +msgstr "额外的比特会在 repr() 和 str() 中显示" + +#: ../../howto/enum.rst:1143 +msgid "" +"The default for Flag is ``STRICT``, the default for ``IntFlag`` is " +"``EJECT``, and the default for ``_convert_`` is ``KEEP`` (see " +"``ssl.Options`` for an example of when ``KEEP`` is needed)." +msgstr "" +"Flag 的默认值为 ``STRICT``,``IntFlag`` 默认为 ``EJECT``,``_convert_`` 默认为 ``KEEP`` " +"(需要 ``KEEP`` 的例子见 ``ssl.Options``)。" + +#: ../../howto/enum.rst:1151 +msgid "How are Enums and Flags different?" +msgstr "枚举和旗标有何差异?" + +#: ../../howto/enum.rst:1153 +msgid "" +"Enums have a custom metaclass that affects many aspects of both derived " +":class:`Enum` classes and their instances (members)." +msgstr "Enum 有一个自定义的元类,它影响到派生的 :class:`Enum` 类和它们的实例(成员)的许多方面。" + +#: ../../howto/enum.rst:1158 +msgid "Enum Classes" +msgstr "枚举类" + +#: ../../howto/enum.rst:1160 +msgid "" +"The :class:`EnumType` metaclass is responsible for providing the " +":meth:`~object.__contains__`, :meth:`~object.__dir__`, " +":meth:`~object.__iter__` and other methods that allow one to do things with " +"an :class:`Enum` class that fail on a typical class, such as ``list(Color)``" +" or ``some_enum_var in Color``. :class:`EnumType` is responsible for " +"ensuring that various other methods on the final :class:`Enum` class are " +"correct (such as :meth:`~object.__new__`, :meth:`~object.__getnewargs__`, " +":meth:`~object.__str__` and :meth:`~object.__repr__`)." +msgstr "" +":class:`EnumType` 元类负责提供 :meth:`~object.__contains__`, " +":meth:`~object.__dir__`, :meth:`~object.__iter__` 及其他方法来允许人们在 :class:`Enum` " +"类上做一些在常规类上会失败的事情,比如 ``list(Color)`` 或 ``some_enum_var in Color``。 " +":class:`EnumType` 负责确保最终的 :class:`Enum` 类上的各种其他方法是正确的(比如 " +":meth:`~object.__new__`, :meth:`~object.__getnewargs__`, " +":meth:`~object.__str__` 和 :meth:`~object.__repr__` 等)。" + +#: ../../howto/enum.rst:1169 +msgid "Flag Classes" +msgstr "旗标类" + +#: ../../howto/enum.rst:1171 +msgid "" +"Flags have an expanded view of aliasing: to be canonical, the value of a " +"flag needs to be a power-of-two value, and not a duplicate name. So, in " +"addition to the :class:`Enum` definition of alias, a flag with no value " +"(a.k.a. ``0``) or with more than one power-of-two value (e.g. ``3``) is " +"considered an alias." +msgstr "" +"旗标具有扩展的别名视图:为了符合规范,旗标的值必须为二的幂,且名称不可重复。因此,除了 :class:`Enum` 对别名的定义之外,没有值 (即 " +"``0``) 或是几个二的幂值之和 (如 ``3``) 的旗标也会被视为别名。" + +#: ../../howto/enum.rst:1177 +msgid "Enum Members (aka instances)" +msgstr "枚举成员(即实例)" + +#: ../../howto/enum.rst:1179 +msgid "" +"The most interesting thing about enum members is that they are singletons. " +":class:`EnumType` creates them all while it is creating the enum class " +"itself, and then puts a custom :meth:`~object.__new__` in place to ensure " +"that no new ones are ever instantiated by returning only the existing member" +" instances." +msgstr "" +"有关枚举成员的最有趣的一点在于它们都是单例。 :class:`EnumType` 会在创建枚举类本身时全部创建它们,然后放置一个自定义的 " +":meth:`~object.__new__` 以通过只返回现有的成员实例来确保没有新的成员被实例化。" + +#: ../../howto/enum.rst:1185 +msgid "Flag Members" +msgstr "旗标成员" + +#: ../../howto/enum.rst:1187 +msgid "" +"Flag members can be iterated over just like the :class:`Flag` class, and " +"only the canonical members will be returned. For example::" +msgstr "旗标成员可以如 :class:`Flag` 类一样被迭代,并且只有规范的成员会被返回。例如::" + +#: ../../howto/enum.rst:1190 +msgid "" +">>> list(Color)\n" +"[, , ]" +msgstr "" +">>> list(Color)\n" +"[, , ]" + +#: ../../howto/enum.rst:1193 +msgid "(Note that ``BLACK``, ``PURPLE``, and ``WHITE`` do not show up.)" +msgstr "(请注意 ``BLACK``, ``PURPLE`` 和 ``WHITE`` 将不显示。)" + +#: ../../howto/enum.rst:1195 +msgid "" +"Inverting a flag member returns the corresponding positive value, rather " +"than a negative value --- for example::" +msgstr "对一个旗标成员取反将返回对应的正值,而不是负值 --- 例如::" + +#: ../../howto/enum.rst:1198 +msgid "" +">>> ~Color.RED\n" +"" +msgstr "" +">>> ~Color.RED\n" +"" + +#: ../../howto/enum.rst:1201 +msgid "" +"Flag members have a length corresponding to the number of power-of-two " +"values they contain. For example::" +msgstr "旗标成员具有与它们所包含的二的幂值的数量相对应的长度。例如::" + +#: ../../howto/enum.rst:1204 +msgid "" +">>> len(Color.PURPLE)\n" +"2" +msgstr "" +">>> len(Color.PURPLE)\n" +"2" + +#: ../../howto/enum.rst:1211 +msgid "Enum Cookbook" +msgstr "枚举指导手册" + +#: ../../howto/enum.rst:1214 +msgid "" +"While :class:`Enum`, :class:`IntEnum`, :class:`StrEnum`, :class:`Flag`, and " +":class:`IntFlag` are expected to cover the majority of use-cases, they " +"cannot cover them all. Here are recipes for some different types of " +"enumerations that can be used directly, or as examples for creating one's " +"own." +msgstr "" +"虽然 :class:`Enum`, :class:`IntEnum`, :class:`StrEnum`, :class:`Flag` 和 " +":class:`IntFlag` 有望能涵盖大多数的使用情况,但它们不能涵盖所有情况。 " +"这里有一些不同类型的枚举的方法,可以直接使用,或者作为创建定制枚举的范例。" + +#: ../../howto/enum.rst:1221 +msgid "Omitting values" +msgstr "省略值" + +#: ../../howto/enum.rst:1223 +msgid "" +"In many use-cases, one doesn't care what the actual value of an enumeration " +"is. There are several ways to define this type of simple enumeration:" +msgstr "在许多应用场景中,人们并不关心枚举的实际值是什么。有几种方式可用来定义这种类型的简单枚举:" + +#: ../../howto/enum.rst:1226 +msgid "use instances of :class:`auto` for the value" +msgstr "使用 :class:`auto` 的实例作为值" + +#: ../../howto/enum.rst:1227 +msgid "use instances of :class:`object` as the value" +msgstr "使用 :class:`object` 的实例作为值" + +#: ../../howto/enum.rst:1228 +msgid "use a descriptive string as the value" +msgstr "使用描述性的字符串作为值" + +#: ../../howto/enum.rst:1229 +msgid "" +"use a tuple as the value and a custom :meth:`~object.__new__` to replace the" +" tuple with an :class:`int` value" +msgstr "使用一个元组作为值并用自定义的 :meth:`~object.__new__` 以一个 :class:`int` 值来替代该元组" + +#: ../../howto/enum.rst:1232 +msgid "" +"Using any of these methods signifies to the user that these values are not " +"important, and also enables one to add, remove, or reorder members without " +"having to renumber the remaining members." +msgstr "使用以上任何一种方法均可向用户指明值并不重要,并且使人能够添加、移除或重排序成员而不必改变其余成员的数值。" + +#: ../../howto/enum.rst:1238 +msgid "Using :class:`auto`" +msgstr "使用 :class:`auto`" + +#: ../../howto/enum.rst:1240 +msgid "Using :class:`auto` would look like::" +msgstr "使用 :class:`auto` 的形式如下::" + +#: ../../howto/enum.rst:1242 +msgid "" +">>> class Color(Enum):\n" +"... RED = auto()\n" +"... BLUE = auto()\n" +"... GREEN = auto()\n" +"...\n" +">>> Color.GREEN\n" +"" +msgstr "" +">>> class Color(Enum):\n" +"... RED = auto()\n" +"... BLUE = auto()\n" +"... GREEN = auto()\n" +"...\n" +">>> Color.GREEN\n" +"" + +#: ../../howto/enum.rst:1252 +msgid "Using :class:`object`" +msgstr "使用 :class:`object`" + +#: ../../howto/enum.rst:1254 +msgid "Using :class:`object` would look like::" +msgstr "使用 :class:`object` 的形式如下::" + +#: ../../howto/enum.rst:1256 +msgid "" +">>> class Color(Enum):\n" +"... RED = object()\n" +"... GREEN = object()\n" +"... BLUE = object()\n" +"...\n" +">>> Color.GREEN\n" +">" +msgstr "" +">>> class Color(Enum):\n" +"... RED = object()\n" +"... GREEN = object()\n" +"... BLUE = object()\n" +"...\n" +">>> Color.GREEN\n" +">" + +#: ../../howto/enum.rst:1264 +msgid "" +"This is also a good example of why you might want to write your own " +":meth:`~object.__repr__`::" +msgstr "这也是一个可以说明为什么你会需要编写自己的 :meth:`~object.__repr__` 的好例子::" + +#: ../../howto/enum.rst:1267 +msgid "" +">>> class Color(Enum):\n" +"... RED = object()\n" +"... GREEN = object()\n" +"... BLUE = object()\n" +"... def __repr__(self):\n" +"... return \"<%s.%s>\" % (self.__class__.__name__, self._name_)\n" +"...\n" +">>> Color.GREEN\n" +"" +msgstr "" +">>> class Color(Enum):\n" +"... RED = object()\n" +"... GREEN = object()\n" +"... BLUE = object()\n" +"... def __repr__(self):\n" +"... return \"<%s.%s>\" % (self.__class__.__name__, self._name_)\n" +"...\n" +">>> Color.GREEN\n" +"" + +#: ../../howto/enum.rst:1280 +msgid "Using a descriptive string" +msgstr "使用描述性字符串" + +#: ../../howto/enum.rst:1282 +msgid "Using a string as the value would look like::" +msgstr "使用字符串作为值的形式如下::" + +#: ../../howto/enum.rst:1284 +msgid "" +">>> class Color(Enum):\n" +"... RED = 'stop'\n" +"... GREEN = 'go'\n" +"... BLUE = 'too fast!'\n" +"...\n" +">>> Color.GREEN\n" +"" +msgstr "" +">>> class Color(Enum):\n" +"... RED = 'stop'\n" +"... GREEN = 'go'\n" +"... BLUE = 'too fast!'\n" +"...\n" +">>> Color.GREEN\n" +"" + +#: ../../howto/enum.rst:1294 +msgid "Using a custom :meth:`~object.__new__`" +msgstr "使用自定义的 :meth:`~object.__new__`" + +#: ../../howto/enum.rst:1296 +msgid "Using an auto-numbering :meth:`~object.__new__` would look like::" +msgstr "使用自动编号的 :meth:`~object.__new__` 看起来会是这样::" + +#: ../../howto/enum.rst:1298 +msgid "" +">>> class AutoNumber(Enum):\n" +"... def __new__(cls):\n" +"... value = len(cls.__members__) + 1\n" +"... obj = object.__new__(cls)\n" +"... obj._value_ = value\n" +"... return obj\n" +"...\n" +">>> class Color(AutoNumber):\n" +"... RED = ()\n" +"... GREEN = ()\n" +"... BLUE = ()\n" +"...\n" +">>> Color.GREEN\n" +"" +msgstr "" +">>> class AutoNumber(Enum):\n" +"... def __new__(cls):\n" +"... value = len(cls.__members__) + 1\n" +"... obj = object.__new__(cls)\n" +"... obj._value_ = value\n" +"... return obj\n" +"...\n" +">>> class Color(AutoNumber):\n" +"... RED = ()\n" +"... GREEN = ()\n" +"... BLUE = ()\n" +"...\n" +">>> Color.GREEN\n" +"" + +#: ../../howto/enum.rst:1313 +msgid "" +"To make a more general purpose ``AutoNumber``, add ``*args`` to the " +"signature::" +msgstr "要实现更通用的 ``AutoNumber``,请添加 ``*args`` 到签名中::" + +#: ../../howto/enum.rst:1315 +msgid "" +">>> class AutoNumber(Enum):\n" +"... def __new__(cls, *args): # this is the only change from above\n" +"... value = len(cls.__members__) + 1\n" +"... obj = object.__new__(cls)\n" +"... obj._value_ = value\n" +"... return obj\n" +"..." +msgstr "" +">>> class AutoNumber(Enum):\n" +"... def __new__(cls, *args): # 这是相比上面的唯一改变\n" +"... value = len(cls.__members__) + 1\n" +"... obj = object.__new__(cls)\n" +"... obj._value_ = value\n" +"... return obj\n" +"..." + +#: ../../howto/enum.rst:1323 +msgid "" +"Then when you inherit from ``AutoNumber`` you can write your own " +"``__init__`` to handle any extra arguments::" +msgstr "这样当你从 ``AutoNumber`` 继承时你将可以编写你自己的 ``__init__`` 来处理任何附加参数::" + +#: ../../howto/enum.rst:1326 +msgid "" +">>> class Swatch(AutoNumber):\n" +"... def __init__(self, pantone='unknown'):\n" +"... self.pantone = pantone\n" +"... AUBURN = '3497'\n" +"... SEA_GREEN = '1246'\n" +"... BLEACHED_CORAL = () # New color, no Pantone code yet!\n" +"...\n" +">>> Swatch.SEA_GREEN\n" +"\n" +">>> Swatch.SEA_GREEN.pantone\n" +"'1246'\n" +">>> Swatch.BLEACHED_CORAL.pantone\n" +"'unknown'" +msgstr "" +">>> class Swatch(AutoNumber):\n" +"... def __init__(self, pantone='unknown'):\n" +"... self.pantone = pantone\n" +"... AUBURN = '3497'\n" +"... SEA_GREEN = '1246'\n" +"... BLEACHED_CORAL = () # 新的颜色,还没有 Pantone 代码!\n" +"...\n" +">>> Swatch.SEA_GREEN\n" +"\n" +">>> Swatch.SEA_GREEN.pantone\n" +"'1246'\n" +">>> Swatch.BLEACHED_CORAL.pantone\n" +"'unknown'" + +#: ../../howto/enum.rst:1342 +msgid "" +"The :meth:`~object.__new__` method, if defined, is used during creation of " +"the Enum members; it is then replaced by Enum's :meth:`~object.__new__` " +"which is used after class creation for lookup of existing members." +msgstr "" +"如果定义了 :meth:`~object.__new__` 方法,它会在创建 Enum 成员期间被使用;随后它将被 Enum 的 " +":meth:`~object.__new__` 所替换,该方法会在类创建后被用来查找现有成员。" + +#: ../../howto/enum.rst:1348 +msgid "" +"*Do not* call ``super().__new__()``, as the lookup-only ``__new__`` is the " +"one that is found; instead, use the data type directly -- e.g.::" +msgstr "" +"*不要* 调用 ``super().__new__()``,因为只能找到仅用于查找的 ``__new__``;请改为直接使用该数据类型 -- 例如::" + +#: ../../howto/enum.rst:1351 +msgid "obj = int.__new__(cls, value)" +msgstr "obj = int.__new__(cls, value)" + +#: ../../howto/enum.rst:1355 +msgid "OrderedEnum" +msgstr "OrderedEnum" + +#: ../../howto/enum.rst:1357 +msgid "" +"An ordered enumeration that is not based on :class:`IntEnum` and so " +"maintains the normal :class:`Enum` invariants (such as not being comparable " +"to other enumerations)::" +msgstr "" +"一个有序枚举,它不是基于 :class:`IntEnum`,因此保持了正常的 :class:`Enum` 不变特性(例如不可与其他枚举进行比较)::" + +#: ../../howto/enum.rst:1361 +msgid "" +">>> class OrderedEnum(Enum):\n" +"... def __ge__(self, other):\n" +"... if self.__class__ is other.__class__:\n" +"... return self.value >= other.value\n" +"... return NotImplemented\n" +"... def __gt__(self, other):\n" +"... if self.__class__ is other.__class__:\n" +"... return self.value > other.value\n" +"... return NotImplemented\n" +"... def __le__(self, other):\n" +"... if self.__class__ is other.__class__:\n" +"... return self.value <= other.value\n" +"... return NotImplemented\n" +"... def __lt__(self, other):\n" +"... if self.__class__ is other.__class__:\n" +"... return self.value < other.value\n" +"... return NotImplemented\n" +"...\n" +">>> class Grade(OrderedEnum):\n" +"... A = 5\n" +"... B = 4\n" +"... C = 3\n" +"... D = 2\n" +"... F = 1\n" +"...\n" +">>> Grade.C < Grade.A\n" +"True" +msgstr "" +">>> class OrderedEnum(Enum):\n" +"... def __ge__(self, other):\n" +"... if self.__class__ is other.__class__:\n" +"... return self.value >= other.value\n" +"... return NotImplemented\n" +"... def __gt__(self, other):\n" +"... if self.__class__ is other.__class__:\n" +"... return self.value > other.value\n" +"... return NotImplemented\n" +"... def __le__(self, other):\n" +"... if self.__class__ is other.__class__:\n" +"... return self.value <= other.value\n" +"... return NotImplemented\n" +"... def __lt__(self, other):\n" +"... if self.__class__ is other.__class__:\n" +"... return self.value < other.value\n" +"... return NotImplemented\n" +"...\n" +">>> class Grade(OrderedEnum):\n" +"... A = 5\n" +"... B = 4\n" +"... C = 3\n" +"... D = 2\n" +"... F = 1\n" +"...\n" +">>> Grade.C < Grade.A\n" +"True" + +#: ../../howto/enum.rst:1391 +msgid "DuplicateFreeEnum" +msgstr "DuplicateFreeEnum" + +#: ../../howto/enum.rst:1393 +msgid "" +"Raises an error if a duplicate member value is found instead of creating an " +"alias::" +msgstr "如果发现重复的成员值则会引发一个错误而不是创建一个别名::" + +#: ../../howto/enum.rst:1396 +msgid "" +">>> class DuplicateFreeEnum(Enum):\n" +"... def __init__(self, *args):\n" +"... cls = self.__class__\n" +"... if any(self.value == e.value for e in cls):\n" +"... a = self.name\n" +"... e = cls(self.value).name\n" +"... raise ValueError(\n" +"... \"aliases not allowed in DuplicateFreeEnum: %r --> %r\"\n" +"... % (a, e))\n" +"...\n" +">>> class Color(DuplicateFreeEnum):\n" +"... RED = 1\n" +"... GREEN = 2\n" +"... BLUE = 3\n" +"... GRENE = 2\n" +"...\n" +"Traceback (most recent call last):\n" +" ...\n" +"ValueError: aliases not allowed in DuplicateFreeEnum: 'GRENE' --> 'GREEN'" +msgstr "" +">>> class DuplicateFreeEnum(Enum):\n" +"... def __init__(self, *args):\n" +"... cls = self.__class__\n" +"... if any(self.value == e.value for e in cls):\n" +"... a = self.name\n" +"... e = cls(self.value).name\n" +"... raise ValueError(\n" +"... \"aliases not allowed in DuplicateFreeEnum: %r --> %r\"\n" +"... % (a, e))\n" +"...\n" +">>> class Color(DuplicateFreeEnum):\n" +"... RED = 1\n" +"... GREEN = 2\n" +"... BLUE = 3\n" +"... GRENE = 2\n" +"...\n" +"Traceback (most recent call last):\n" +" ...\n" +"ValueError: aliases not allowed in DuplicateFreeEnum: 'GRENE' --> 'GREEN'" + +#: ../../howto/enum.rst:1418 +msgid "" +"This is a useful example for subclassing Enum to add or change other " +"behaviors as well as disallowing aliases. If the only desired change is " +"disallowing aliases, the :func:`unique` decorator can be used instead." +msgstr "" +"这个例子适用于子类化 Enum 来添加或改变禁用别名以及其他行为。如果需要的改变只是禁用别名,也可以选择使用 :func:`unique` 装饰器。" + +#: ../../howto/enum.rst:1425 +msgid "MultiValueEnum" +msgstr "MultiValueEnum" + +#: ../../howto/enum.rst:1427 +msgid "Supports having more than one value per member::" +msgstr "支持每个成员有多个值::" + +#: ../../howto/enum.rst:1429 +msgid "" +">>> class MultiValueEnum(Enum):\n" +"... def __new__(cls, value, *values):\n" +"... self = object.__new__(cls)\n" +"... self._value_ = value\n" +"... for v in values:\n" +"... self._add_value_alias_(v)\n" +"... return self\n" +"...\n" +">>> class DType(MultiValueEnum):\n" +"... float32 = 'f', 8\n" +"... double64 = 'd', 9\n" +"...\n" +">>> DType('f')\n" +"\n" +">>> DType(9)\n" +"" +msgstr "" +">>> class MultiValueEnum(Enum):\n" +"... def __new__(cls, value, *values):\n" +"... self = object.__new__(cls)\n" +"... self._value_ = value\n" +"... for v in values:\n" +"... self._add_value_alias_(v)\n" +"... return self\n" +"...\n" +">>> class DType(MultiValueEnum):\n" +"... float32 = 'f', 8\n" +"... double64 = 'd', 9\n" +"...\n" +">>> DType('f')\n" +"\n" +">>> DType(9)\n" +"" + +#: ../../howto/enum.rst:1448 +msgid "Planet" +msgstr "Planet" + +#: ../../howto/enum.rst:1450 +msgid "" +"If :meth:`~object.__new__` or :meth:`~object.__init__` is defined, the value" +" of the enum member will be passed to those methods::" +msgstr "" +"如果定义了 :meth:`~object.__new__` 或 :meth:`~object.__init__`,则枚举成员的值将被传给这些方法::" + +#: ../../howto/enum.rst:1453 +msgid "" +">>> class Planet(Enum):\n" +"... MERCURY = (3.303e+23, 2.4397e6)\n" +"... VENUS = (4.869e+24, 6.0518e6)\n" +"... EARTH = (5.976e+24, 6.37814e6)\n" +"... MARS = (6.421e+23, 3.3972e6)\n" +"... JUPITER = (1.9e+27, 7.1492e7)\n" +"... SATURN = (5.688e+26, 6.0268e7)\n" +"... URANUS = (8.686e+25, 2.5559e7)\n" +"... NEPTUNE = (1.024e+26, 2.4746e7)\n" +"... def __init__(self, mass, radius):\n" +"... self.mass = mass # in kilograms\n" +"... self.radius = radius # in meters\n" +"... @property\n" +"... def surface_gravity(self):\n" +"... # universal gravitational constant (m3 kg-1 s-2)\n" +"... G = 6.67300E-11\n" +"... return G * self.mass / (self.radius * self.radius)\n" +"...\n" +">>> Planet.EARTH.value\n" +"(5.976e+24, 6378140.0)\n" +">>> Planet.EARTH.surface_gravity\n" +"9.802652743337129" +msgstr "" +">>> class Planet(Enum):\n" +"... MERCURY = (3.303e+23, 2.4397e6)\n" +"... VENUS = (4.869e+24, 6.0518e6)\n" +"... EARTH = (5.976e+24, 6.37814e6)\n" +"... MARS = (6.421e+23, 3.3972e6)\n" +"... JUPITER = (1.9e+27, 7.1492e7)\n" +"... SATURN = (5.688e+26, 6.0268e7)\n" +"... URANUS = (8.686e+25, 2.5559e7)\n" +"... NEPTUNE = (1.024e+26, 2.4746e7)\n" +"... def __init__(self, mass, radius):\n" +"... self.mass = mass # in kilograms\n" +"... self.radius = radius # in meters\n" +"... @property\n" +"... def surface_gravity(self):\n" +"... # universal gravitational constant (m3 kg-1 s-2)\n" +"... G = 6.67300E-11\n" +"... return G * self.mass / (self.radius * self.radius)\n" +"...\n" +">>> Planet.EARTH.value\n" +"(5.976e+24, 6378140.0)\n" +">>> Planet.EARTH.surface_gravity\n" +"9.802652743337129" + +#: ../../howto/enum.rst:1479 +msgid "TimePeriod" +msgstr "TimePeriod" + +#: ../../howto/enum.rst:1481 +msgid "An example to show the :attr:`~Enum._ignore_` attribute in use::" +msgstr "一个演示如何使用 :attr:`~Enum._ignore_` 属性的例子::" + +#: ../../howto/enum.rst:1483 +msgid "" +">>> import datetime as dt\n" +">>> class Period(dt.timedelta, Enum):\n" +"... \"different lengths of time\"\n" +"... _ignore_ = 'Period i'\n" +"... Period = vars()\n" +"... for i in range(367):\n" +"... Period['day_%d' % i] = i\n" +"...\n" +">>> list(Period)[:2]\n" +"[, ]\n" +">>> list(Period)[-2:]\n" +"[, ]" +msgstr "" +">>> import datetime as dt\n" +">>> class Period(dt.timedelta, Enum):\n" +"... \"different lengths of time\"\n" +"... _ignore_ = 'Period i'\n" +"... Period = vars()\n" +"... for i in range(367):\n" +"... Period['day_%d' % i] = i\n" +"...\n" +">>> list(Period)[:2]\n" +"[, ]\n" +">>> list(Period)[-2:]\n" +"[, ]" + +#: ../../howto/enum.rst:1500 +msgid "Subclassing EnumType" +msgstr "子类化 EnumType" + +#: ../../howto/enum.rst:1502 +msgid "" +"While most enum needs can be met by customizing :class:`Enum` subclasses, " +"either with class decorators or custom functions, :class:`EnumType` can be " +"subclassed to provide a different Enum experience." +msgstr "" +"虽然大多数枚举需求可以通过自定义 :class:`Enum` 子类来满足,无论是用类装饰器还是自定义函数,:class:`EnumType` " +"可以被子类化以提供不同的枚举体验。" diff --git a/howto/free-threading-extensions.po b/howto/free-threading-extensions.po new file mode 100644 index 0000000000..7c8ab8b220 --- /dev/null +++ b/howto/free-threading-extensions.po @@ -0,0 +1,830 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:00+0000\n" +"Last-Translator: 99 , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../howto/free-threading-extensions.rst:7 +msgid "C API Extension Support for Free Threading" +msgstr "自由线程的 C API 扩展支持" + +#: ../../howto/free-threading-extensions.rst:9 +msgid "" +"Starting with the 3.13 release, CPython has support for running with the " +":term:`global interpreter lock` (GIL) disabled in a configuration called " +":term:`free threading`. This document describes how to adapt C API " +"extensions to support free threading." +msgstr "" +"从 3.13 发布版开始,CPython 通过名为 :term:`free threading` 的配置引入了对于运行时禁用 :term:`global" +" interpreter lock` (GIL) 的支持。这份文档描述了如何调整 C API 扩展以支持自由线程。" + +#: ../../howto/free-threading-extensions.rst:16 +msgid "Identifying the Free-Threaded Build in C" +msgstr "在 C 中识别自由线程构建" + +#: ../../howto/free-threading-extensions.rst:18 +msgid "" +"The CPython C API exposes the ``Py_GIL_DISABLED`` macro: in the free-" +"threaded build it's defined to ``1``, and in the regular build it's not " +"defined. You can use it to enable code that only runs under the free-" +"threaded build::" +msgstr "" +"CPython C API 提供了 ``Py_GIL_DISABLED`` 宏,它在自由线程构建中被定义为 " +"``1``,而在常规构建中未被定义。你可以使用它让代码仅在自由线程构建中运行::" + +#: ../../howto/free-threading-extensions.rst:22 +msgid "" +"#ifdef Py_GIL_DISABLED\n" +"/* code that only runs in the free-threaded build */\n" +"#endif" +msgstr "" +"#ifdef Py_GIL_DISABLED\n" +"/* 仅在自由线程构建版中运行的代码 */\n" +"#endif" + +#: ../../howto/free-threading-extensions.rst:28 +msgid "" +"On Windows, this macro is not defined automatically, but must be specified " +"to the compiler when building. The :func:`sysconfig.get_config_var` function" +" can be used to determine whether the current running interpreter had the " +"macro defined." +msgstr "" +"在 Windows 上,该宏不会被自动定义,而必须在构建时向编译器指明。 :func:`sysconfig.get_config_var` " +"函数可被用来确定当前运行的解释器是否定义了该宏。" + +#: ../../howto/free-threading-extensions.rst:35 +msgid "Module Initialization" +msgstr "模块初始化" + +#: ../../howto/free-threading-extensions.rst:37 +msgid "" +"Extension modules need to explicitly indicate that they support running with" +" the GIL disabled; otherwise importing the extension will raise a warning " +"and enable the GIL at runtime." +msgstr "扩展模块需要明确指明它们支持在禁用 GIL 的情况下运行;否则导入扩展模块时会引发警告,并在运行时启用 GIL。" + +#: ../../howto/free-threading-extensions.rst:41 +msgid "" +"There are two ways to indicate that an extension module supports running " +"with the GIL disabled depending on whether the extension uses multi-phase or" +" single-phase initialization." +msgstr "取决于扩展使用多阶段还是单阶段初始化,有两种方式指明扩展模块支持在 GIL 禁用的情况下运行。" + +#: ../../howto/free-threading-extensions.rst:46 +msgid "Multi-Phase Initialization" +msgstr "多阶段初始化" + +#: ../../howto/free-threading-extensions.rst:48 +msgid "" +"Extensions that use :ref:`multi-phase initialization ` (functions like :c:func:`PyModuleDef_Init`, " +":c:func:`PyModExport_* ` export hook, " +":c:func:`PyModule_FromSlotsAndSpec`) should add a :c:data:`Py_mod_gil` slot " +"in the module definition. If your extension supports older versions of " +"CPython, you should guard the slot with a :c:data:`PY_VERSION_HEX` check." +msgstr "" + +#: ../../howto/free-threading-extensions.rst:58 +msgid "" +"static struct PyModuleDef_Slot module_slots[] = {\n" +" ...\n" +"#if PY_VERSION_HEX >= 0x030D0000\n" +" {Py_mod_gil, Py_MOD_GIL_NOT_USED},\n" +"#endif\n" +" {0, NULL}\n" +"};" +msgstr "" + +#: ../../howto/free-threading-extensions.rst:68 +msgid "Single-Phase Initialization" +msgstr "单阶段初始化" + +#: ../../howto/free-threading-extensions.rst:70 +msgid "" +"Extensions that use legacy :ref:`single-phase initialization ` (that is, :c:func:`PyModule_Create`) should call " +":c:func:`PyUnstable_Module_SetGIL` to indicate that they support running " +"with the GIL disabled. The function is only defined in the free-threaded " +"build, so you should guard the call with ``#ifdef Py_GIL_DISABLED`` to avoid" +" compilation errors in the regular build." +msgstr "" + +#: ../../howto/free-threading-extensions.rst:78 +msgid "" +"static struct PyModuleDef moduledef = {\n" +" PyModuleDef_HEAD_INIT,\n" +" ...\n" +"};\n" +"\n" +"PyMODINIT_FUNC\n" +"PyInit_mymodule(void)\n" +"{\n" +" PyObject *m = PyModule_Create(&moduledef);\n" +" if (m == NULL) {\n" +" return NULL;\n" +" }\n" +"#ifdef Py_GIL_DISABLED\n" +" PyUnstable_Module_SetGIL(m, Py_MOD_GIL_NOT_USED);\n" +"#endif\n" +" return m;\n" +"}" +msgstr "" +"static struct PyModuleDef moduledef = {\n" +" PyModuleDef_HEAD_INIT,\n" +" ...\n" +"};\n" +"\n" +"PyMODINIT_FUNC\n" +"PyInit_mymodule(void)\n" +"{\n" +" PyObject *m = PyModule_Create(&moduledef);\n" +" if (m == NULL) {\n" +" return NULL;\n" +" }\n" +"#ifdef Py_GIL_DISABLED\n" +" PyUnstable_Module_SetGIL(m, Py_MOD_GIL_NOT_USED);\n" +"#endif\n" +" return m;\n" +"}" + +#: ../../howto/free-threading-extensions.rst:98 +msgid "General API Guidelines" +msgstr "通用 API 指南" + +#: ../../howto/free-threading-extensions.rst:100 +msgid "Most of the C API is thread-safe, but there are some exceptions." +msgstr "大多数 C API 是线程安全的,但是也存在例外。" + +#: ../../howto/free-threading-extensions.rst:102 +msgid "" +"**Struct Fields**: Accessing fields in Python C API objects or structs " +"directly is not thread-safe if the field may be concurrently modified." +msgstr "**结构字段**:如果 Python C API 对象或结构的字段可能被并行修改,那么直接访问这些字段不是线程安全的。" + +#: ../../howto/free-threading-extensions.rst:104 +msgid "" +"**Macros**: Accessor macros like :c:macro:`PyList_GET_ITEM`, " +":c:macro:`PyList_SET_ITEM`, and macros like " +":c:macro:`PySequence_Fast_GET_SIZE` that use the object returned by " +":c:func:`PySequence_Fast` do not perform any error checking or locking. " +"These macros are not thread-safe if the container object may be modified " +"concurrently." +msgstr "" +"**宏**: 访问器宏如 :c:macro:`PyList_GET_ITEM`, :c:macro:`PyList_SET_ITEM`,以及 " +":c:macro:`PySequence_Fast_GET_SIZE` 这样使用由 :c:func:`PySequence_Fast` " +"返回的对象的宏不会进行任何错误检查或加锁。当容器对象可能被并行修改时这些宏不是线程安全的。" + +#: ../../howto/free-threading-extensions.rst:110 +msgid "" +"**Borrowed References**: C API functions that return :term:`borrowed " +"references ` may not be thread-safe if the containing " +"object is modified concurrently. See the section on :ref:`borrowed " +"references ` for more information." +msgstr "" +"**借入引用**:返回 :term:`借入引用 ` 的 C API " +"函数如果引用内容可能被并行修改,那么它不是线程安全的。详见 :ref:`借入引用 `。" + +#: ../../howto/free-threading-extensions.rst:117 +msgid "Container Thread Safety" +msgstr "容器相关的线程安全" + +#: ../../howto/free-threading-extensions.rst:119 +msgid "" +"Containers like :c:struct:`PyListObject`, :c:struct:`PyDictObject`, and " +":c:struct:`PySetObject` perform internal locking in the free-threaded build." +" For example, the :c:func:`PyList_Append` will lock the list before " +"appending an item." +msgstr "" +":c:struct:`PyListObject`, :c:struct:`PyDictObject` 及 :c:struct:`PySetObject`" +" 等容器在自由线程构建中执行内部上锁机制,例如 :c:func:`PyList_Append` 在追加对象前会对列表上锁。" + +#: ../../howto/free-threading-extensions.rst:127 +msgid "``PyDict_Next``" +msgstr "``PyDict_Next``" + +#: ../../howto/free-threading-extensions.rst:129 +msgid "" +"A notable exception is :c:func:`PyDict_Next`, which does not lock the " +"dictionary. You should use :c:macro:`Py_BEGIN_CRITICAL_SECTION` to protect " +"the dictionary while iterating over it if the dictionary may be concurrently" +" modified::" +msgstr "" +"一个值得注意的例外是 :c:func:`PyDict_Next`,它不会锁定字典。在迭代字典时如果该字典可能被并发地修改那么你应当使用 " +":c:macro:`Py_BEGIN_CRITICAL_SECTION` 来保护它::" + +#: ../../howto/free-threading-extensions.rst:134 +msgid "" +"Py_BEGIN_CRITICAL_SECTION(dict);\n" +"PyObject *key, *value;\n" +"Py_ssize_t pos = 0;\n" +"while (PyDict_Next(dict, &pos, &key, &value)) {\n" +" ...\n" +"}\n" +"Py_END_CRITICAL_SECTION();" +msgstr "" +"Py_BEGIN_CRITICAL_SECTION(dict);\n" +"PyObject *key, *value;\n" +"Py_ssize_t pos = 0;\n" +"while (PyDict_Next(dict, &pos, &key, &value)) {\n" +" ...\n" +"}\n" +"Py_END_CRITICAL_SECTION();" + +#: ../../howto/free-threading-extensions.rst:144 +msgid "Borrowed References" +msgstr "借入引用" + +#: ../../howto/free-threading-extensions.rst:148 +msgid "" +"Some C API functions return :term:`borrowed references `. These APIs are not thread-safe if the containing object is " +"modified concurrently. For example, it's not safe to use " +":c:func:`PyList_GetItem` if the list may be modified concurrently." +msgstr "" +"有些 C API 函数返回 :term:`borrowed references `。如果引用内容可能被并行修改,那么这些 API 不是线程安全的。例如,如果列表可能被并行修改,那么使用 " +":c:func:`PyList_GetItem` 是不安全的。" + +#: ../../howto/free-threading-extensions.rst:153 +msgid "" +"The following table lists some borrowed reference APIs and their " +"replacements that return :term:`strong references `." +msgstr "下表列出了一些返回借入引用的 API 及它们返回 :term:`强引用 ` 的替代版本。" + +#: ../../howto/free-threading-extensions.rst:157 +msgid "Borrowed reference API" +msgstr "借入引用 API" + +#: ../../howto/free-threading-extensions.rst:157 +msgid "Strong reference API" +msgstr "强引用 API" + +#: ../../howto/free-threading-extensions.rst:159 +msgid ":c:func:`PyList_GetItem`" +msgstr ":c:func:`PyList_GetItem`" + +#: ../../howto/free-threading-extensions.rst:159 +#: ../../howto/free-threading-extensions.rst:161 +msgid ":c:func:`PyList_GetItemRef`" +msgstr ":c:func:`PyList_GetItemRef`" + +#: ../../howto/free-threading-extensions.rst:161 +msgid ":c:func:`PyList_GET_ITEM`" +msgstr ":c:func:`PyList_GET_ITEM`" + +#: ../../howto/free-threading-extensions.rst:163 +msgid ":c:func:`PyDict_GetItem`" +msgstr ":c:func:`PyDict_GetItem`" + +#: ../../howto/free-threading-extensions.rst:163 +#: ../../howto/free-threading-extensions.rst:165 +msgid ":c:func:`PyDict_GetItemRef`" +msgstr ":c:func:`PyDict_GetItemRef`" + +#: ../../howto/free-threading-extensions.rst:165 +msgid ":c:func:`PyDict_GetItemWithError`" +msgstr ":c:func:`PyDict_GetItemWithError`" + +#: ../../howto/free-threading-extensions.rst:167 +msgid ":c:func:`PyDict_GetItemString`" +msgstr ":c:func:`PyDict_GetItemString`" + +#: ../../howto/free-threading-extensions.rst:167 +msgid ":c:func:`PyDict_GetItemStringRef`" +msgstr ":c:func:`PyDict_GetItemStringRef`" + +#: ../../howto/free-threading-extensions.rst:169 +msgid ":c:func:`PyDict_SetDefault`" +msgstr ":c:func:`PyDict_SetDefault`" + +#: ../../howto/free-threading-extensions.rst:169 +msgid ":c:func:`PyDict_SetDefaultRef`" +msgstr ":c:func:`PyDict_SetDefaultRef`" + +#: ../../howto/free-threading-extensions.rst:171 +msgid ":c:func:`PyDict_Next`" +msgstr ":c:func:`PyDict_Next`" + +#: ../../howto/free-threading-extensions.rst:171 +msgid "none (see :ref:`PyDict_Next`)" +msgstr "无 (参见 :ref:`PyDict_Next`)" + +#: ../../howto/free-threading-extensions.rst:173 +msgid ":c:func:`!PyWeakref_GetObject`" +msgstr "" + +#: ../../howto/free-threading-extensions.rst:173 +#: ../../howto/free-threading-extensions.rst:175 +msgid ":c:func:`PyWeakref_GetRef`" +msgstr ":c:func:`PyWeakref_GetRef`" + +#: ../../howto/free-threading-extensions.rst:175 +msgid ":c:func:`!PyWeakref_GET_OBJECT`" +msgstr "" + +#: ../../howto/free-threading-extensions.rst:177 +msgid ":c:func:`PyImport_AddModule`" +msgstr ":c:func:`PyImport_AddModule`" + +#: ../../howto/free-threading-extensions.rst:177 +msgid ":c:func:`PyImport_AddModuleRef`" +msgstr ":c:func:`PyImport_AddModuleRef`" + +#: ../../howto/free-threading-extensions.rst:179 +msgid ":c:func:`PyCell_GET`" +msgstr ":c:func:`PyCell_GET`" + +#: ../../howto/free-threading-extensions.rst:179 +msgid ":c:func:`PyCell_Get`" +msgstr ":c:func:`PyCell_Get`" + +#: ../../howto/free-threading-extensions.rst:182 +msgid "" +"Not all APIs that return borrowed references are problematic. For example, " +":c:func:`PyTuple_GetItem` is safe because tuples are immutable. Similarly, " +"not all uses of the above APIs are problematic. For example, " +":c:func:`PyDict_GetItem` is often used for parsing keyword argument " +"dictionaries in function calls; those keyword argument dictionaries are " +"effectively private (not accessible by other threads), so using borrowed " +"references in that context is safe." +msgstr "" +"返回借用引用的 API 不一定都有问题。例如,:c:func:`PyTuple_GetItem` 是安全的,因为元组是不可变的。同样,上述 API " +"的使用不一定都有问题。例如,:c:func:`PyDict_GetItem` " +"通常用于解析函数调用中的关键字参数字典;这些关键字参数字典实际上是私有(其他线程无法访问)的,因此在这种情况下使用借入引用是安全的。" + +#: ../../howto/free-threading-extensions.rst:190 +msgid "" +"Some of these functions were added in Python 3.13. You can use the " +"`pythoncapi-compat `_ package " +"to provide implementations of these functions for older Python versions." +msgstr "" +"上述函数中有的是在 Python 3.13 中添加的。在旧 Python 版本上您可以使用提供这些函数实现的 `pythoncapi-compat " +"`_ 包。" + +#: ../../howto/free-threading-extensions.rst:198 +msgid "Memory Allocation APIs" +msgstr "内存分配 API" + +#: ../../howto/free-threading-extensions.rst:200 +msgid "" +"Python's memory management C API provides functions in three different " +":ref:`allocation domains `: \"raw\", \"mem\", and " +"\"object\". For thread-safety, the free-threaded build requires that only " +"Python objects are allocated using the object domain, and that all Python " +"objects are allocated using that domain. This differs from the prior Python" +" versions, where this was only a best practice and not a hard requirement." +msgstr "" +"Python 的内存管理 C API 提供了三个不同 :ref:`分配域 ` 的函数:\"raw\", " +"\"mem\" 和 \"object\"。为了保证线程安全,自由线程构建版要求只有 Python 对象使用 object 域来分配,并且所有 " +"Python 对象都使用该域来分配。这不同于之前的 Python 版本,当时这只是一个最佳实践而不是硬性要求。" + +#: ../../howto/free-threading-extensions.rst:209 +msgid "" +"Search for uses of :c:func:`PyObject_Malloc` in your extension and check " +"that the allocated memory is used for Python objects. Use " +":c:func:`PyMem_Malloc` to allocate buffers instead of " +":c:func:`PyObject_Malloc`." +msgstr "" +"搜索 :c:func:`PyObject_Malloc` 在您的扩展中的使用,并检查分配的内存是否用于 Python 对象。使用 " +":c:func:`PyMem_Malloc` 来分配缓冲区,而不是 :c:func:`PyObject_Malloc`。" + +#: ../../howto/free-threading-extensions.rst:216 +msgid "Thread State and GIL APIs" +msgstr "线程状态与 GIL API" + +#: ../../howto/free-threading-extensions.rst:218 +msgid "" +"Python provides a set of functions and macros to manage thread state and the" +" GIL, such as:" +msgstr "Python 提供了一系列函数和宏来管理线程状态和 GIL,例如:" + +#: ../../howto/free-threading-extensions.rst:221 +msgid "" +":c:func:`PyThreadState_Ensure`, :c:func:`PyThreadState_EnsureFromView`, and " +":c:func:`PyThreadState_Release`" +msgstr "" + +#: ../../howto/free-threading-extensions.rst:223 +msgid ":c:func:`PyGILState_Ensure` and :c:func:`PyGILState_Release`" +msgstr ":c:func:`PyGILState_Ensure` 与 :c:func:`PyGILState_Release`" + +#: ../../howto/free-threading-extensions.rst:224 +msgid ":c:func:`PyEval_SaveThread` and :c:func:`PyEval_RestoreThread`" +msgstr ":c:func:`PyEval_SaveThread` 与 :c:func:`PyEval_RestoreThread`" + +#: ../../howto/free-threading-extensions.rst:225 +msgid ":c:macro:`Py_BEGIN_ALLOW_THREADS` and :c:macro:`Py_END_ALLOW_THREADS`" +msgstr ":c:macro:`Py_BEGIN_ALLOW_THREADS` 与 :c:macro:`Py_END_ALLOW_THREADS`" + +#: ../../howto/free-threading-extensions.rst:227 +msgid "" +"These functions should still be used in the free-threaded build to manage " +"thread state even when the :term:`GIL` is disabled. For example, if you " +"create a thread outside of Python, you must call " +":c:func:`PyThreadState_Ensure` before calling into the Python API to ensure " +"that the thread has a valid Python thread state." +msgstr "" + +#: ../../howto/free-threading-extensions.rst:233 +msgid "" +"You should continue to call :c:func:`PyEval_SaveThread` or " +":c:macro:`Py_BEGIN_ALLOW_THREADS` around blocking operations, such as I/O or" +" lock acquisitions, to allow other threads to run the :term:`cyclic garbage " +"collector `." +msgstr "" +"你应该继续在阻塞操作(如输入/输出或获取锁)前调用 :c:func:`PyEval_SaveThread` 或 " +":c:macro:`Py_BEGIN_ALLOW_THREADS`,以允许其他线程运行 :term:`循环垃圾回收器 `。" + +#: ../../howto/free-threading-extensions.rst:240 +msgid "Protecting Internal Extension State" +msgstr "保护内部扩展状态" + +#: ../../howto/free-threading-extensions.rst:242 +msgid "" +"Your extension may have internal state that was previously protected by the " +"GIL. You may need to add locking to protect this state. The approach will " +"depend on your extension, but some common patterns include:" +msgstr "您的扩展可能有以前受 GIL 保护的内部状态。您可能需要上锁来保护内部状态。具体方法取决于您的扩展,但一些常见的模式包括:" + +#: ../../howto/free-threading-extensions.rst:246 +msgid "" +"**Caches**: global caches are a common source of shared state. Consider " +"using a lock to protect the cache or disabling it in the free-threaded build" +" if the cache is not critical for performance." +msgstr "**缓存**:全局缓存是共享状态的常见来源。如果缓存对性能并不重要,可考虑使用锁来保护缓存,或在自由线程构建中禁用缓存。" + +#: ../../howto/free-threading-extensions.rst:249 +msgid "" +"**Global State**: global state may need to be protected by a lock or moved " +"to thread local storage. C11 and C++11 provide the ``thread_local`` or " +"``_Thread_local`` for `thread-local storage " +"`_." +msgstr "" +"**全局状态**:全局状态可能需要用锁保护或移至线程本地存储。C11 和 C++11 提供了 ``thread_local`` 或 " +"``_Thread_local`` 用于 `线程本地存储 " +"`_。" + +#: ../../howto/free-threading-extensions.rst:256 +msgid "Critical Sections" +msgstr "临界区" + +#: ../../howto/free-threading-extensions.rst:260 +msgid "" +"In the free-threaded build, CPython provides a mechanism called \"critical " +"sections\" to protect data that would otherwise be protected by the GIL. " +"While extension authors may not interact with the internal critical section " +"implementation directly, understanding their behavior is crucial when using " +"certain C API functions or managing shared state in the free-threaded build." +msgstr "" +"在自由线程构建中,CPython 提供了一种称为“临界区”的机制来保护原本由 GIL " +"保护的数据。虽然扩展作者可能不会直接与内部临界区实现交互,但在使用某些 C API 函数或在自由线程构建中管理共享状态时,理解它们的行为是至关重要的。" + +#: ../../howto/free-threading-extensions.rst:267 +msgid "What Are Critical Sections?" +msgstr "什么是临界区?" + +#: ../../howto/free-threading-extensions.rst:269 +msgid "" +"Conceptually, critical sections act as a deadlock avoidance layer built on " +"top of simple mutexes. Each thread maintains a stack of active critical " +"sections. When a thread needs to acquire a lock associated with a critical " +"section (e.g., implicitly when calling a thread-safe C API function like " +":c:func:`PyDict_SetItem`, or explicitly using macros), it attempts to " +"acquire the underlying mutex." +msgstr "" +"从概念上讲,临界区充当建立在简单互斥锁之上的死锁避免层。每个线程维护一个活动临界区堆栈。当线程需要获取与临界区相关的锁时(例如,隐式调用线程安全的 C " +"API 函数时,如 :c:func:`PyDict_SetItem`,或显式使用宏),它会尝试获取底层互斥锁。" + +#: ../../howto/free-threading-extensions.rst:277 +msgid "Using Critical Sections" +msgstr "使用临界区" + +#: ../../howto/free-threading-extensions.rst:279 +msgid "The primary APIs for using critical sections are:" +msgstr "使用临界区的主要 API 有:" + +#: ../../howto/free-threading-extensions.rst:281 +msgid "" +":c:macro:`Py_BEGIN_CRITICAL_SECTION` and :c:macro:`Py_END_CRITICAL_SECTION` " +"- For locking a single object" +msgstr "" +":c:macro:`Py_BEGIN_CRITICAL_SECTION` 和 :c:macro:`Py_END_CRITICAL_SECTION` - " +"用于锁定单个对象" + +#: ../../howto/free-threading-extensions.rst:284 +msgid "" +":c:macro:`Py_BEGIN_CRITICAL_SECTION2` and " +":c:macro:`Py_END_CRITICAL_SECTION2` - For locking two objects simultaneously" +msgstr "" +":c:macro:`Py_BEGIN_CRITICAL_SECTION2` 和 :c:macro:`Py_END_CRITICAL_SECTION2` " +"- 用于同时锁定两个对象" + +#: ../../howto/free-threading-extensions.rst:287 +msgid "" +"These macros must be used in matching pairs and must appear in the same C " +"scope, since they establish a new local scope. These macros are no-ops in " +"non-free-threaded builds, so they can be safely added to code that needs to " +"support both build types." +msgstr "" +"这些宏必须成对使用,并且必须出现在同一个 C " +"作用域中,因为它们建立了一个新的局部作用域。这些宏在非自由线程构建中是无操作的,因此可以安全地将它们添加到需要支持两种构建类型的代码中。" + +#: ../../howto/free-threading-extensions.rst:292 +msgid "" +"A common use of a critical section would be to lock an object while " +"accessing an internal attribute of it. For example, if an extension type " +"has an internal count field, you could use a critical section while reading " +"or writing that field::" +msgstr "临界区的一个常见用途是在访问对象的内部属性时锁定对象。例如,如果扩展类型有一个内部计数字段,你可以在读取或写入该字段时使用临界区::" + +#: ../../howto/free-threading-extensions.rst:297 +msgid "" +"// read the count, returns new reference to internal count value\n" +"PyObject *result;\n" +"Py_BEGIN_CRITICAL_SECTION(obj);\n" +"result = Py_NewRef(obj->count);\n" +"Py_END_CRITICAL_SECTION();\n" +"return result;\n" +"\n" +"// write the count, consumes reference from new_count\n" +"Py_BEGIN_CRITICAL_SECTION(obj);\n" +"obj->count = new_count;\n" +"Py_END_CRITICAL_SECTION();" +msgstr "" +"// 读取计数,返回对内部计数值的新引用\n" +"PyObject *result;\n" +"Py_BEGIN_CRITICAL_SECTION(obj);\n" +"result = Py_NewRef(obj->count);\n" +"Py_END_CRITICAL_SECTION();\n" +"return result;\n" +"\n" +"// 写入计数,消耗来自 new_count 的引用\n" +"Py_BEGIN_CRITICAL_SECTION(obj);\n" +"obj->count = new_count;\n" +"Py_END_CRITICAL_SECTION();" + +#: ../../howto/free-threading-extensions.rst:311 +msgid "How Critical Sections Work" +msgstr "临界区如何运作" + +#: ../../howto/free-threading-extensions.rst:313 +msgid "" +"Unlike traditional locks, critical sections do not guarantee exclusive " +"access throughout their entire duration. If a thread would block while " +"holding a critical section (e.g., by acquiring another lock or performing " +"I/O), the critical section is temporarily suspended—all locks are " +"released—and then resumed when the blocking operation completes." +msgstr "" +"与传统锁不同,临界区不能保证在其整个持续时间内的独占访问。如果线程在持有临界区时阻塞(例如,通过获取另一个锁或执行 " +"I/O),则临界区被暂时挂起——所有锁被释放——然后在阻塞操作完成时恢复。" + +#: ../../howto/free-threading-extensions.rst:319 +msgid "" +"This behavior is similar to what happens with the GIL when a thread makes a " +"blocking call. The key differences are:" +msgstr "此行为类似于当线程执行阻塞型调用时 GIL 的行为。主要的区别在于:" + +#: ../../howto/free-threading-extensions.rst:322 +msgid "Critical sections operate on a per-object basis rather than globally" +msgstr "临界区的运作是基于每个对象的而不是全局的" + +#: ../../howto/free-threading-extensions.rst:324 +msgid "" +"Critical sections follow a stack discipline within each thread (the " +"\"begin\" and \"end\" macros enforce this since they must be paired and " +"within the same scope)" +msgstr "临界区在每个线程内遵循栈纪律(\"begin\" 和 \"end\" 宏强制执行此纪律,因为它们必须成对出现并位于相同作用域中)" + +#: ../../howto/free-threading-extensions.rst:327 +msgid "" +"Critical sections automatically release and reacquire locks around potential" +" blocking operations" +msgstr "临界区会针对潜在的阻塞型操作自动释放和重新获取锁" + +#: ../../howto/free-threading-extensions.rst:331 +msgid "Deadlock Avoidance" +msgstr "避免死锁" + +#: ../../howto/free-threading-extensions.rst:333 +msgid "Critical sections help avoid deadlocks in two ways:" +msgstr "临界区通过两种方式帮助避免死锁:" + +#: ../../howto/free-threading-extensions.rst:335 +msgid "" +"If a thread tries to acquire a lock that's already held by another thread, " +"it first suspends all of its active critical sections, temporarily releasing" +" their locks" +msgstr "如果一个线程试图获取某个已被其他线程持有的锁,它会先挂起该线程的所有临界区,暂时释放它们的锁。" + +#: ../../howto/free-threading-extensions.rst:339 +msgid "" +"When the blocking operation completes, only the top-most critical section is" +" reacquired first" +msgstr "当阻塞型操作完成时,只有最顶端的临界区会被首先重新获取" + +#: ../../howto/free-threading-extensions.rst:342 +msgid "" +"This means you cannot rely on nested critical sections to lock multiple " +"objects at once, as the inner critical section may suspend the outer ones. " +"Instead, use :c:macro:`Py_BEGIN_CRITICAL_SECTION2` to lock two objects " +"simultaneously." +msgstr "" +"这意味着你不能依赖嵌套的临界区来同时锁定多个对象,因为内层的临界区可能挂起外层的临界区。作为替代,请使用 " +":c:macro:`Py_BEGIN_CRITICAL_SECTION2` 来同时锁定两个对象。" + +#: ../../howto/free-threading-extensions.rst:346 +msgid "" +"Note that the locks described above are only :c:type:`PyMutex` based locks. " +"The critical section implementation does not know about or affect other " +"locking mechanisms that might be in use, like POSIX mutexes. Also note that" +" while blocking on any :c:type:`PyMutex` causes the critical sections to be " +"suspended, only the mutexes that are part of the critical sections are " +"released. If :c:type:`PyMutex` is used without a critical section, it will " +"not be released and therefore does not get the same deadlock avoidance." +msgstr "" +"请注意上面描述的锁只是基于 :c:type:`PyMutex` 的锁。临界区实现并不知道或影响其他正在使用的锁定机制,比如 POSIX 互斥锁。 " +"还要注意当任何 :c:type:`PyMutex` 发生阻塞并导致临界区被挂起时,只有属于临界区一部分的互斥锁才会被释放。如果 " +":c:type:`PyMutex` 在没有临界区的情况下使用,它将不会被释放,因此不会得到同样的死锁避免。" + +#: ../../howto/free-threading-extensions.rst:355 +msgid "Important Considerations" +msgstr "重要考量" + +#: ../../howto/free-threading-extensions.rst:357 +msgid "" +"Critical sections may temporarily release their locks, allowing other " +"threads to modify the protected data. Be careful about making assumptions " +"about the state of the data after operations that might block." +msgstr "临界区可以暂时释放它们的锁,允许其他线程修改受保护的数据。在进行可能阻塞的操作之后,要谨慎地假设数据的状态。" + +#: ../../howto/free-threading-extensions.rst:361 +msgid "" +"Because locks can be temporarily released (suspended), entering a critical " +"section does not guarantee exclusive access to the protected resource " +"throughout the section's duration. If code within a critical section calls " +"another function that blocks (e.g., acquires another lock, performs blocking" +" I/O), all locks held by the thread via critical sections will be released. " +"This is similar to how the GIL can be released during blocking calls." +msgstr "" +"因为锁可以暂时释放(挂起),所以进入临界区并不能保证在整个临界区期间对受保护资源的独占访问。如果临界区内的代码调用另一个阻塞函数(例如,获取另一个锁、执行阻塞" +" I/O),则该线程通过临界区持有的所有锁将被释放。这类似于在阻塞调用期间释放 GIL 的方式。" + +#: ../../howto/free-threading-extensions.rst:368 +msgid "" +"Only the lock(s) associated with the most recently entered (top-most) " +"critical section are guaranteed to be held at any given time. Locks for " +"outer, nested critical sections might have been suspended." +msgstr "在任何给定时间,只有与最近进入(最顶部)的临界区相关的锁才能保证被持有。外部嵌套临界区的锁可能已经挂起。" + +#: ../../howto/free-threading-extensions.rst:372 +msgid "" +"You can lock at most two objects simultaneously with these APIs. If you need" +" to lock more objects, you'll need to restructure your code." +msgstr "使用这些 API 最多可以同时锁定两个对象。如果你需要锁定更多的对象,你需要调整你的代码。" + +#: ../../howto/free-threading-extensions.rst:375 +msgid "" +"While critical sections will not deadlock if you attempt to lock the same " +"object twice, they are less efficient than purpose-built reentrant locks for" +" this use case." +msgstr "虽然如果你尝试锁定同一个对象两次,临界区不会死锁,但是对于这种用例,它们的效率不如专门构建的可重入锁。" + +#: ../../howto/free-threading-extensions.rst:379 +msgid "" +"When using :c:macro:`Py_BEGIN_CRITICAL_SECTION2`, the order of the objects " +"doesn't affect correctness (the implementation handles deadlock avoidance), " +"but it's good practice to always lock objects in a consistent order." +msgstr "" +"当使用 :c:macro:`Py_BEGIN_CRITICAL_SECTION2` " +"时,对象的顺序不影响正确性(实现处理死锁避免),但始终以一致的顺序锁定对象是良好的实践。" + +#: ../../howto/free-threading-extensions.rst:383 +msgid "" +"Remember that the critical section macros are primarily for protecting " +"access to *Python objects* that might be involved in internal CPython " +"operations susceptible to the deadlock scenarios described above. For " +"protecting purely internal extension state, standard mutexes or other " +"synchronization primitives might be more appropriate." +msgstr "" +"请记住,临界区宏主要用于保护对 *Python 对象* 的访问,这些对象可能涉及易受上述死锁场景影响的内部 CPython " +"操作。为了保护纯粹的内部扩展状态,标准互斥体或其他同步原语可能更合适。" + +#: ../../howto/free-threading-extensions.rst:392 +msgid "Per-Object Locks (``ob_mutex``)" +msgstr "" + +#: ../../howto/free-threading-extensions.rst:394 +msgid "" +"In the free-threaded build, each Python object contains a " +":c:member:`~PyObject.ob_mutex` field of type :c:type:`PyMutex`. This mutex " +"is **reserved for use by the critical section API** " +"(:c:macro:`Py_BEGIN_CRITICAL_SECTION` / :c:macro:`Py_END_CRITICAL_SECTION`)." +msgstr "" + +#: ../../howto/free-threading-extensions.rst:401 +msgid "" +"Do **not** lock ``ob_mutex`` directly with ``PyMutex_Lock(&obj->ob_mutex)``." +" Mixing direct ``PyMutex_Lock`` calls with the critical section API on the " +"same mutex can cause deadlocks." +msgstr "" + +#: ../../howto/free-threading-extensions.rst:405 +msgid "" +"Even if your own code never uses critical sections on a particular object " +"type, **CPython internals may use the critical section API on any Python " +"object**." +msgstr "" + +#: ../../howto/free-threading-extensions.rst:408 +msgid "" +"If your extension type needs its own lock, add a separate :c:type:`PyMutex` " +"field (or another synchronization primitive) to your object struct. " +":c:type:`PyMutex` is very lightweight, so there is negligible cost to having" +" an additional one." +msgstr "" + +#: ../../howto/free-threading-extensions.rst:415 +msgid "Building Extensions for the Free-Threaded Build" +msgstr "为自由线程构建进行扩展构建" + +#: ../../howto/free-threading-extensions.rst:417 +msgid "" +"C API extensions need to be built specifically for the free-threaded build. " +"The wheels, shared libraries, and binaries are indicated by a ``t`` suffix." +msgstr "C API 扩展需要专门为自由线程构建进行构建。构建的 wheel、共享库和二进制文件用后缀 ``t`` 指示。" + +#: ../../howto/free-threading-extensions.rst:420 +msgid "" +"`pypa/manylinux `_ supports the free-" +"threaded build, with the ``t`` suffix, such as ``python3.14t``." +msgstr "" + +#: ../../howto/free-threading-extensions.rst:422 +msgid "" +"`pypa/cibuildwheel `_ supports " +"building wheels for the free-threaded build of Python 3.14 and newer." +msgstr "" + +#: ../../howto/free-threading-extensions.rst:426 +msgid "Limited C API and Stable ABI" +msgstr "受限的 C API 与稳定 ABI" + +#: ../../howto/free-threading-extensions.rst:428 +msgid "" +"The free-threaded build does not currently support the :ref:`Limited C API " +"` or the stable ABI. If you use `setuptools " +"`_ to build your " +"extension and currently set ``py_limited_api=True`` you can use " +"``py_limited_api=not sysconfig.get_config_var(\"Py_GIL_DISABLED\")`` to opt " +"out of the limited API when building with the free-threaded build." +msgstr "" +"自由线程构建目前不支持 :ref:`受限 C API ` 或稳定 ABI。如果当前您使用 `setuptools " +"`_ 来构建您的扩展,并且设置了 " +"``py_limited_api=True``,您可以使用 ``py_limited_api=not " +"sysconfig.get_config_var(\"Py_GIL_DISABLED\")`` 在使用自由线程构建进行构建时不使用受限 API。" + +#: ../../howto/free-threading-extensions.rst:436 +msgid "" +"You will need to build separate wheels specifically for the free-threaded " +"build. If you currently use the stable ABI, you can continue to build a " +"single wheel for multiple non-free-threaded Python versions." +msgstr "" +"您需要为自由线程构建单独构建 wheel。如果您当前使用稳定 ABI,则可以继续构建适用于多个非自由线程 Python 版本的单个 wheel。" + +#: ../../howto/free-threading-extensions.rst:442 +msgid "Windows" +msgstr "Windows" + +#: ../../howto/free-threading-extensions.rst:444 +msgid "" +"Due to a limitation of the official Windows installer, you will need to " +"manually define ``Py_GIL_DISABLED=1`` when building extensions from source." +msgstr "由于 Windows 官方安装程序的限制,从源代码构建扩展时需要手动定义 ``Py_GIL_DISABLED=1``。" + +#: ../../howto/free-threading-extensions.rst:449 +msgid "" +"`Porting Extension Modules to Support Free-Threading `_: A community-maintained porting guide for " +"extension authors." +msgstr "" +"`Porting Extension Modules to Support Free-Threading `_: 一份由社区维护的针对扩展开发者的移植指南。" diff --git a/howto/free-threading-python.po b/howto/free-threading-python.po new file mode 100644 index 0000000000..7bcbb8f50f --- /dev/null +++ b/howto/free-threading-python.po @@ -0,0 +1,300 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../howto/free-threading-python.rst:5 +msgid "Python support for free threading" +msgstr "Python 对自由线程的支持" + +#: ../../howto/free-threading-python.rst:7 +msgid "" +"Starting with the 3.13 release, CPython has support for a build of Python " +"called :term:`free threading` where the :term:`global interpreter lock` " +"(GIL) is disabled. Free-threaded execution allows for full utilization of " +"the available processing power by running threads in parallel on available " +"CPU cores. While not all software will benefit from this automatically, " +"programs designed with threading in mind will run faster on multi-core " +"hardware." +msgstr "" +"从 3.13 发布版开始,CPython 支持 :term:`free threading` 的 Python 构建,其禁用 :term:`global" +" interpreter lock` (GIL)。自由线程化的执行允许在可用的 CPU 核心上并行运行线程,充分利用可用的处理能力。 " +"尽管并非所有软件都能自动地从中受益,但是考虑到线程设计的程序在多核硬件上运行速度会更快。" + +#: ../../howto/free-threading-python.rst:14 +msgid "" +"Some third-party packages, in particular ones with an :term:`extension " +"module`, may not be ready for use in a free-threaded build, and will re-" +"enable the :term:`GIL`." +msgstr "" +"某些第三方包,特别是带有 :term:`extension module` 的包,可能尚不适用于自由线程构建版,并将重新启用 :term:`GIL`。" + +#: ../../howto/free-threading-python.rst:18 +msgid "" +"This document describes the implications of free threading for Python code." +" See :ref:`freethreading-extensions-howto` for information on how to write " +"C extensions that support the free-threaded build." +msgstr "" +"本文档描述了自由线程对 Python 代码的影响。请参阅 :ref:`freethreading-extensions-howto` " +"了解如何编写支持自由线程构建的 C 扩展。" + +#: ../../howto/free-threading-python.rst:24 +msgid "" +":pep:`703` – Making the Global Interpreter Lock Optional in CPython for an " +"overall description of free-threaded Python." +msgstr ":pep:`703` —— 查阅《在 CPython 中使全局解释器锁成为可选项》以了解对自由线程 Python 的整体描述。" + +#: ../../howto/free-threading-python.rst:29 +msgid "Installation" +msgstr "安装" + +#: ../../howto/free-threading-python.rst:31 +msgid "" +"Starting with Python 3.13, the official macOS and Windows installers " +"optionally support installing free-threaded Python binaries. The installers" +" are available at https://www.python.org/downloads/." +msgstr "" +"从 Python 3.13 开始,官方 macOS 和 Windows 安装器提供了对可选安装自由线程 Python 二进制文件的支持。安装器可在 " +"https://www.python.org/downloads/ 获取。" + +#: ../../howto/free-threading-python.rst:35 +msgid "" +"For information on other platforms, see the `Installing a Free-Threaded " +"Python `_, a " +"community-maintained installation guide for installing free-threaded Python." +msgstr "" +"有关其他平台的信息,请参阅 `Installing a Free-Threaded Python `_,这是一份由社区维护的针对安装自由线程版 Python 的安装指南。" + +#: ../../howto/free-threading-python.rst:39 +msgid "" +"When building CPython from source, the :option:`--disable-gil` configure " +"option should be used to build a free-threaded Python interpreter." +msgstr "当从源码构建 CPython 时,应使用 :option:`--disable-gil` 配置选项以构建自由线程 Python 解释器。" + +#: ../../howto/free-threading-python.rst:44 +msgid "Identifying free-threaded Python" +msgstr "识别自由线程 Python" + +#: ../../howto/free-threading-python.rst:46 +msgid "" +"To check if the current interpreter supports free-threading, :option:`python" +" -VV <-V>` and :data:`sys.version` contain \"free-threading build\". The new" +" :func:`sys._is_gil_enabled` function can be used to check whether the GIL " +"is actually disabled in the running process." +msgstr "" +"要判断当前解释器是否支持自由线程,可检查 :option:`python -VV <-V>` 和 :data:`sys.version` 是否包含 " +"\"free-threading build\"。新的 :func:`sys._is_gil_enabled` 函数可用于检查在运行进程中 GIL " +"是否确实被关闭。" + +#: ../../howto/free-threading-python.rst:51 +msgid "" +"The ``sysconfig.get_config_var(\"Py_GIL_DISABLED\")`` configuration variable" +" can be used to determine whether the build supports free threading. If the" +" variable is set to ``1``, then the build supports free threading. This is " +"the recommended mechanism for decisions related to the build configuration." +msgstr "" +"``sysconfig.get_config_var(\"Py_GIL_DISABLED\")`` 配置变量可用于确定构建是否支持自由线程。 " +"如果该变量设置为 ``1``,则构建支持自由线程。这是与构建配置相关的决策的推荐机制。" + +#: ../../howto/free-threading-python.rst:58 +msgid "The global interpreter lock in free-threaded Python" +msgstr "自由线程版 Python 中的全局解释器锁" + +#: ../../howto/free-threading-python.rst:60 +msgid "" +"Free-threaded builds of CPython support optionally running with the GIL " +"enabled at runtime using the environment variable :envvar:`PYTHON_GIL` or " +"the command-line option :option:`-X gil`." +msgstr "" +"CPython 的自由线程构建版支持在运行时使用环境变量 :envvar:`PYTHON_GIL` 或命令行选项 :option:`-X gil` " +"选择性地启用 GIL。" + +#: ../../howto/free-threading-python.rst:64 +msgid "" +"The GIL may also automatically be enabled when importing a C-API extension " +"module that is not explicitly marked as supporting free threading. A " +"warning will be printed in this case." +msgstr "GIL 也可能在导入未显式标记为支持自由线程模式的 C-API 扩展模块时被自动启用。在这种情况下将会打印一条警告。" + +#: ../../howto/free-threading-python.rst:68 +msgid "" +"In addition to individual package documentation, the following websites " +"track the status of popular packages support for free threading:" +msgstr "在单独软件包的文档以外,还有下列网站在追踪热门软件包对自由线程模式的支持状态:" + +#: ../../howto/free-threading-python.rst:71 +msgid "https://py-free-threading.github.io/tracking/" +msgstr "https://py-free-threading.github.io/tracking/" + +#: ../../howto/free-threading-python.rst:72 +msgid "https://hugovk.github.io/free-threaded-wheels/" +msgstr "https://hugovk.github.io/free-threaded-wheels/" + +#: ../../howto/free-threading-python.rst:76 +msgid "Thread safety" +msgstr "线程安全" + +#: ../../howto/free-threading-python.rst:78 +msgid "" +"The free-threaded build of CPython aims to provide similar thread-safety " +"behavior at the Python level to the default GIL-enabled build. Built-in " +"types like :class:`dict`, :class:`list`, and :class:`set` use internal locks" +" to protect against concurrent modifications in ways that behave similarly " +"to the GIL. However, Python has not historically guaranteed specific " +"behavior for concurrent modifications to these built-in types, so this " +"should be treated as a description of the current implementation, not a " +"guarantee of current or future behavior." +msgstr "" +"自由线程构建的 CPython 旨在 Python 层级提供与默认全局解释器锁启用构建相似的线程安全行为。内置类型(如 :class:`dict`、 " +":class:`list` 和 :class:`set` 等)使用内部上锁来防止并发修改,其行为方式与全局解释器锁相似。但是,Python " +"历来不对这些内置类型的并发修改提供特定的行为保证,因此这应被视为对当前实现的描述,而不是对当前或未来行为的保证。" + +#: ../../howto/free-threading-python.rst:89 +msgid "" +"It's recommended to use the :class:`threading.Lock` or other synchronization" +" primitives instead of relying on the internal locks of built-in types, when" +" possible." +msgstr "建议尽可能使用 :class:`threading.Lock` 或其他同步原语,而不是依赖内置类型的内部锁。" + +#: ../../howto/free-threading-python.rst:95 +msgid "Known limitations" +msgstr "已知的限制" + +#: ../../howto/free-threading-python.rst:97 +msgid "" +"This section describes known limitations of the free-threaded CPython build." +msgstr "本节介绍自由线程 CPython 构建的已知限制。" + +#: ../../howto/free-threading-python.rst:100 +msgid "Immortalization" +msgstr "永生化" + +#: ../../howto/free-threading-python.rst:102 +msgid "" +"In the free-threaded build, some objects are :term:`immortal`. Immortal " +"objects are not deallocated and have reference counts that are never " +"modified. This is done to avoid reference count contention that would " +"prevent efficient multi-threaded scaling." +msgstr "" +"在自由线程构建中,某些对象属于 :term:`immortal` 对象。永生对象不会被释放且具有永远不会被修改的引用计数。 " +"这样做是为了避免发生可能妨碍高效的多线程伸缩调整的引用计数争夺问题。" + +#: ../../howto/free-threading-python.rst:107 +msgid "As of the 3.14 release, immortalization is limited to:" +msgstr "对于 3.14 发布版,永生对象只限于:" + +#: ../../howto/free-threading-python.rst:109 +msgid "" +"Code constants: numeric literals, string literals, and tuple literals " +"composed of other constants." +msgstr "代码常量:数字字面值,字符串字面值,以及由其他常量组成的元组字面值。" + +#: ../../howto/free-threading-python.rst:111 +msgid "Strings interned by :func:`sys.intern`." +msgstr "由 :func:`sys.intern` 所内化的字符串。" + +#: ../../howto/free-threading-python.rst:115 +msgid "Frame objects" +msgstr "帧对象" + +#: ../../howto/free-threading-python.rst:117 +msgid "" +"It is not safe to access :attr:`frame.f_locals` from a :ref:`frame ` object if that frame is currently executing in another thread, and" +" doing so may crash the interpreter." +msgstr "" +"从一个 :ref:`帧对象 ` 访问 :attr:`frame.f_locals` " +"是不安全的,如果该帧目前是在另一个线程中执行的话,这样做可能会导致解释器崩溃。" + +#: ../../howto/free-threading-python.rst:123 +msgid "Iterators" +msgstr "迭代器" + +#: ../../howto/free-threading-python.rst:125 +msgid "" +"It is generally not thread-safe to access the same iterator object from " +"multiple threads concurrently, and threads may see duplicate or missing " +"elements." +msgstr "从多个线程并发地访问同一个迭代器对象通常不是线程安全的,可能导致各个线程中出现重复或丢失的元素。" + +#: ../../howto/free-threading-python.rst:131 +msgid "Single-threaded performance" +msgstr "单线程性能" + +#: ../../howto/free-threading-python.rst:133 +msgid "" +"The free-threaded build has additional overhead when executing Python code " +"compared to the default GIL-enabled build. The amount of overhead depends " +"on the workload and hardware. On the pyperformance benchmark suite, the " +"average overhead ranges from about 1% on macOS aarch64 to 8% on x86-64 Linux" +" systems." +msgstr "" +"自由线程构建在执行 Python 代码时相比默认启用 GIL 的构建会有额外的开销。具体的开销取决于工作量和硬件环境。在 pyperformance " +"基准测试套件中,平均开销增幅在 macOS aarch64 上约为 1% 而在 x86-64 Linux 系统上约为 8%。" + +#: ../../howto/free-threading-python.rst:141 +msgid "Behavioral changes" +msgstr "行为的变化" + +#: ../../howto/free-threading-python.rst:143 +msgid "" +"This section describes CPython behavioural changes with the free-threaded " +"build." +msgstr "本节描述 CPython 在自由线程构建时的行为变化。" + +#: ../../howto/free-threading-python.rst:148 +msgid "Context variables" +msgstr "上下文变量" + +#: ../../howto/free-threading-python.rst:150 +msgid "" +"In the free-threaded build, the flag " +":data:`~sys.flags.thread_inherit_context` is set to true by default which " +"causes threads created with :class:`threading.Thread` to start with a copy " +"of the :class:`~contextvars.Context()` of the caller of " +":meth:`~threading.Thread.start`. In the default GIL-enabled build, the flag" +" defaults to false so threads start with an empty " +":class:`~contextvars.Context()`." +msgstr "" +"在自由线程构建中,:data:`~sys.flags.thread_inherit_context` 标志默认设置为 true,这会导致使用 " +":class:`threading.Thread` 创建的线程以 :meth:`~threading.Thread.start` 的调用程序的 " +":class:`~contextvars.Context()` 的副本启动。在默认启用 GIL 的构建中,该标志默认为 false,因此线程以空 " +":class:`~contextvars.Context()` 启动。" + +#: ../../howto/free-threading-python.rst:160 +msgid "Warning filters" +msgstr "警告过滤器" + +#: ../../howto/free-threading-python.rst:162 +msgid "" +"In the free-threaded build, the flag " +":data:`~sys.flags.context_aware_warnings` is set to true by default. In the" +" default GIL-enabled build, the flag defaults to false. If the flag is true" +" then the :class:`warnings.catch_warnings` context manager uses a context " +"variable for warning filters. If the flag is false then " +":class:`~warnings.catch_warnings` modifies the global filters list, which is" +" not thread-safe. See the :mod:`warnings` module for more details." +msgstr "" +"在自由线程构建中,:data:`~sys.flags.context_aware_warnings` 标志默认设置为 true。在默认启用 GIL " +"的构建中,该标志默认设置为 false。如果该标志为 true,则 :class:`warnings.catch_warnings` " +"上下文管理器使用上下文变量用于警告过滤器。如果该标志为 false,则 :class:`~warnings.catch_warnings` " +"修改全局过滤器列表,这不是线程安全的。详情请参阅 :mod:`warnings` 模块。" diff --git a/howto/functional.po b/howto/functional.po new file mode 100644 index 0000000000..5ce96aa7ff --- /dev/null +++ b/howto/functional.po @@ -0,0 +1,2312 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-06-09 17:19+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../howto/functional.rst:5 +msgid "Functional Programming HOWTO" +msgstr "函数式编程指引" + +#: ../../howto/functional.rst:0 +msgid "Author" +msgstr "作者" + +#: ../../howto/functional.rst:7 +msgid "\\A. M. Kuchling" +msgstr "\\A. M. Kuchling" + +#: ../../howto/functional.rst:0 +msgid "Release" +msgstr "发布版本" + +#: ../../howto/functional.rst:8 +msgid "0.32" +msgstr "0.32" + +#: ../../howto/functional.rst:10 +msgid "" +"In this document, we'll take a tour of Python's features suitable for " +"implementing programs in a functional style. After an introduction to the " +"concepts of functional programming, we'll look at language features such as " +":term:`iterator`\\s and :term:`generator`\\s and relevant library modules " +"such as :mod:`itertools` and :mod:`functools`." +msgstr "" +"本文档提供恰当的 Python 函数式编程范例,在函数式编程简单的介绍之后,将简单介绍 Python 中关于函数式编程的特性如 " +":term:`iterator` 和 :term:`generator` 以及相关库模块如 :mod:`itertools` 和 " +":mod:`functools` 等。" + +#: ../../howto/functional.rst:18 +msgid "Introduction" +msgstr "概述" + +#: ../../howto/functional.rst:20 +msgid "" +"This section explains the basic concept of functional programming; if you're" +" just interested in learning about Python language features, skip to the " +"next section on :ref:`functional-howto-iterators`." +msgstr "" +"本章介绍函数式编程的基本概念。如您仅想学习 Python 语言的特性,可跳过本章直接查看 :ref:`functional-howto-" +"iterators`." + +#: ../../howto/functional.rst:24 +msgid "" +"Programming languages support decomposing problems in several different " +"ways:" +msgstr "编程语言支持通过以下几种方式来解构具体问题:" + +#: ../../howto/functional.rst:26 +msgid "" +"Most programming languages are **procedural**: programs are lists of " +"instructions that tell the computer what to do with the program's input. C," +" Pascal, and even Unix shells are procedural languages." +msgstr "" +"大多数的编程语言都是 **过程式** 的,所谓程序就是一连串告诉计算机怎样处理程序输入的指令。C、Pascal 甚至 Unix shells " +"都是过程式语言。" + +#: ../../howto/functional.rst:30 +msgid "" +"In **declarative** languages, you write a specification that describes the " +"problem to be solved, and the language implementation figures out how to " +"perform the computation efficiently. SQL is the declarative language you're" +" most likely to be familiar with; a SQL query describes the data set you " +"want to retrieve, and the SQL engine decides whether to scan tables or use " +"indexes, which subclauses should be performed first, etc." +msgstr "" +"在 **声明式** 语言中,你编写一个用来描述待解决问题的说明,并且这个语言的具体实现会指明怎样高效的进行计算。SQL 可能是你最熟悉的声明式语言了。 " +"一个 SQL 查询语句描述了你想要检索的数据集,并且 SQL 引擎会决定是扫描整张表还是使用索引,应该先执行哪些子句等等。" + +#: ../../howto/functional.rst:37 +msgid "" +"**Object-oriented** programs manipulate collections of objects. Objects " +"have internal state and support methods that query or modify this internal " +"state in some way. Smalltalk and Java are object-oriented languages. C++ " +"and Python are languages that support object-oriented programming, but don't" +" force the use of object-oriented features." +msgstr "" +"**面向对象** 程序会操作一组对象。对象拥有内部状态,并能够以某种方式支持请求和修改这个内部状态的方法。Smalltalk 和 Java " +"都是面向对象的语言。C++ 和 Python 支持面向对象编程,但并不强制使用面向对象特性。" + +#: ../../howto/functional.rst:43 +msgid "" +"**Functional** programming decomposes a problem into a set of functions. " +"Ideally, functions only take inputs and produce outputs, and don't have any " +"internal state that affects the output produced for a given input. Well-" +"known functional languages include the ML family (Standard ML, OCaml, and " +"other variants) and Haskell." +msgstr "" +"**函数式** 编程则将一个问题分解成一系列函数。理想情况下,函数只接受输入并输出结果,对一个给定的输入也不会有影响输出的内部状态。 著名的函数式语言有" +" ML 家族(Standard ML,Ocaml 以及其他变种)和 Haskell。" + +#: ../../howto/functional.rst:49 +msgid "" +"The designers of some computer languages choose to emphasize one particular " +"approach to programming. This often makes it difficult to write programs " +"that use a different approach. Other languages are multi-paradigm languages" +" that support several different approaches. Lisp, C++, and Python are multi-" +"paradigm; you can write programs or libraries that are largely procedural, " +"object-oriented, or functional in all of these languages. In a large " +"program, different sections might be written using different approaches; the" +" GUI might be object-oriented while the processing logic is procedural or " +"functional, for example." +msgstr "" +"一些语言的设计者选择强调一种特定的编程方式。这通常会让以不同的方式来编写程序变得困难。其他多范式语言则支持几种不同的编程方式。Lisp,C++ 和 " +"Python " +"都是多范式语言;使用这些语言,你可以编写主要为过程式,面向对象或者函数式的程序和函数库。在大型程序中,不同的部分可能会采用不同的方式编写;比如 GUI " +"可能是面向对象的而处理逻辑则是过程式或者函数式。" + +#: ../../howto/functional.rst:60 +msgid "" +"In a functional program, input flows through a set of functions. Each " +"function operates on its input and produces some output. Functional style " +"discourages functions with side effects that modify internal state or make " +"other changes that aren't visible in the function's return value. Functions" +" that have no side effects at all are called **purely functional**. " +"Avoiding side effects means not using data structures that get updated as a " +"program runs; every function's output must only depend on its input." +msgstr "" +"在函数式程序里,输入会流经一系列函数。每个函数接受输入并输出结果。函数式风格反对使用带有副作用的函数,这些副作用会修改内部状态,或者引起一些无法体现在函数的返回值中的变化。完全不产生副作用的函数被称作“纯函数”。消除副作用意味着不能使用随程序运行而更新的数据结构;每个函数的输出必须只依赖于输入。" + +#: ../../howto/functional.rst:68 +msgid "" +"Some languages are very strict about purity and don't even have assignment " +"statements such as ``a=3`` or ``c = a + b``, but it's difficult to avoid all" +" side effects, such as printing to the screen or writing to a disk file. " +"Another example is a call to the :func:`print` or :func:`time.sleep` " +"function, neither of which returns a useful value. Both are called only for " +"their side effects of sending some text to the screen or pausing execution " +"for a second." +msgstr "" +"有些语言对纯洁性要求非常严格,甚至没有诸如 ``a=3`` 或 ``c = a + b`` " +"之类的赋值语句,但很难避免所有的副作用,如打印到屏幕上或写到磁盘文件之类的副作用。另一个例子是调用 :func:`print` 或 " +":func:`time.sleep` 函数,它们都没有返回一个有用的值。这两个函数被调用只是为了它们的副作用,即向屏幕发送一些文本或暂停执行一秒钟。" + +#: ../../howto/functional.rst:75 +msgid "" +"Python programs written in functional style usually won't go to the extreme " +"of avoiding all I/O or all assignments; instead, they'll provide a " +"functional-appearing interface but will use non-functional features " +"internally. For example, the implementation of a function will still use " +"assignments to local variables, but won't modify global variables or have " +"other side effects." +msgstr "" +"函数式风格的 Python 程序并不会极端到消除所有 I/O " +"或者赋值的程度;相反,他们会提供像函数式一样的接口,但会在内部使用非函数式的特性。比如,函数的实现仍然会使用局部变量,但不会修改全局变量或者有其他副作用。" + +#: ../../howto/functional.rst:81 +msgid "" +"Functional programming can be considered the opposite of object-oriented " +"programming. Objects are little capsules containing some internal state " +"along with a collection of method calls that let you modify this state, and " +"programs consist of making the right set of state changes. Functional " +"programming wants to avoid state changes as much as possible and works with " +"data flowing between functions. In Python you might combine the two " +"approaches by writing functions that take and return instances representing " +"objects in your application (e-mail messages, transactions, etc.)." +msgstr "" +"函数式编程可以被认为是面向对象编程的对立面。对象就像是颗小胶囊,包裹着内部状态和随之而来的能让你修改这个内部状态的一组调用方法,以及由正确的状态变化所构成的程序。函数式编程希望尽可能地消除状态变化,只和流经函数的数据打交道。在" +" Python 里你可以把两种编程方式结合起来,在你的应用(电子邮件信息,事务处理)中编写接受和返回对象实例的函数。" + +#: ../../howto/functional.rst:90 +msgid "" +"Functional design may seem like an odd constraint to work under. Why should" +" you avoid objects and side effects? There are theoretical and practical " +"advantages to the functional style:" +msgstr "函数式设计在工作中看起来是个奇怪的约束。为什么你要消除对象和副作用呢?不过函数式风格有其理论和实践上的优点:" + +#: ../../howto/functional.rst:94 +msgid "Formal provability." +msgstr "形式证明。" + +#: ../../howto/functional.rst:95 +msgid "Modularity." +msgstr "模块化。" + +#: ../../howto/functional.rst:96 +msgid "Composability." +msgstr "组合性。" + +#: ../../howto/functional.rst:97 +msgid "Ease of debugging and testing." +msgstr "易于调试和测试。" + +#: ../../howto/functional.rst:101 +msgid "Formal provability" +msgstr "形式证明" + +#: ../../howto/functional.rst:103 +msgid "" +"A theoretical benefit is that it's easier to construct a mathematical proof " +"that a functional program is correct." +msgstr "一个理论上的优点是,构造数学证明来说明函数式程序是正确的相对更容易些。" + +#: ../../howto/functional.rst:106 +msgid "" +"For a long time researchers have been interested in finding ways to " +"mathematically prove programs correct. This is different from testing a " +"program on numerous inputs and concluding that its output is usually " +"correct, or reading a program's source code and concluding that the code " +"looks right; the goal is instead a rigorous proof that a program produces " +"the right result for all possible inputs." +msgstr "" +"很长时间,研究者们对寻找证明程序正确的数学方法都很感兴趣。这和通过大量输入来测试,并得出程序的输出基本正确,或者阅读一个程序的源代码然后得出代码看起来没问题不同;相反,这里的目标是一个严格的证明,证明程序对所有可能的输入都能给出正确的结果。" + +#: ../../howto/functional.rst:113 +msgid "" +"The technique used to prove programs correct is to write down " +"**invariants**, properties of the input data and of the program's variables " +"that are always true. For each line of code, you then show that if " +"invariants X and Y are true **before** the line is executed, the slightly " +"different invariants X' and Y' are true **after** the line is executed. " +"This continues until you reach the end of the program, at which point the " +"invariants should match the desired conditions on the program's output." +msgstr "" +"证明程序正确性所用到的技术是写出 **不变量**,也就是对于输入数据和程序中的变量永远为真的特性。然后对每行代码,你说明这行代码执行前的不变量 X 和 " +"Y 以及执行后稍有不同的不变量 X' 和 Y' 为真。如此一直到程序结束,这时候在程序的输出上,不变量应该会与期望的状态一致。" + +#: ../../howto/functional.rst:121 +msgid "" +"Functional programming's avoidance of assignments arose because assignments " +"are difficult to handle with this technique; assignments can break " +"invariants that were true before the assignment without producing any new " +"invariants that can be propagated onward." +msgstr "函数式编程之所以要消除赋值,是因为赋值在这个技术中难以处理;赋值可能会破坏赋值前为真的不变量,却并不产生任何可以传递下去的新的不变量。" + +#: ../../howto/functional.rst:126 +msgid "" +"Unfortunately, proving programs correct is largely impractical and not " +"relevant to Python software. Even trivial programs require proofs that are " +"several pages long; the proof of correctness for a moderately complicated " +"program would be enormous, and few or none of the programs you use daily " +"(the Python interpreter, your XML parser, your web browser) could be proven " +"correct. Even if you wrote down or generated a proof, there would then be " +"the question of verifying the proof; maybe there's an error in it, and you " +"wrongly believe you've proved the program correct." +msgstr "" +"不幸的是,证明程序的正确性很大程度上是不切实际的,而且和 Python " +"软件无关。即使是微不足道的程序都需要几页长的证明;一个中等复杂的程序的正确性证明会非常庞大,而且,极少甚至没有你日常所使用的程序(Python " +"解释器,XML " +"解析器,浏览器)的正确性能够被证明。即使你写出或者生成一个证明,验证证明也会是一个问题;里面可能出了差错,而你错误地相信你证明了程序的正确性。" + +#: ../../howto/functional.rst:137 +msgid "Modularity" +msgstr "模块化" + +#: ../../howto/functional.rst:139 +msgid "" +"A more practical benefit of functional programming is that it forces you to " +"break apart your problem into small pieces. Programs are more modular as a " +"result. It's easier to specify and write a small function that does one " +"thing than a large function that performs a complicated transformation. " +"Small functions are also easier to read and to check for errors." +msgstr "" +"函数式编程的一个更实用的优点是,它强制你把问题分解成小的方面。因此程序会更加模块化。相对于一个进行了复杂变换的大型函数,一个小的函数更明确,更易于编写," +" 也更易于阅读和检查错误。" + +#: ../../howto/functional.rst:147 +msgid "Ease of debugging and testing" +msgstr "易于调试和测试" + +#: ../../howto/functional.rst:149 +msgid "Testing and debugging a functional-style program is easier." +msgstr "测试和调试函数式程序相对来说更容易。" + +#: ../../howto/functional.rst:151 +msgid "" +"Debugging is simplified because functions are generally small and clearly " +"specified. When a program doesn't work, each function is an interface point" +" where you can check that the data are correct. You can look at the " +"intermediate inputs and outputs to quickly isolate the function that's " +"responsible for a bug." +msgstr "" +"调试很简单是因为函数通常都很小而且清晰明确。当程序无法工作的时候,每个函数都是一个可以检查数据是否正确的接入点。你可以通过查看中间输入和输出迅速找到出错的函数。" + +#: ../../howto/functional.rst:156 +msgid "" +"Testing is easier because each function is a potential subject for a unit " +"test. Functions don't depend on system state that needs to be replicated " +"before running a test; instead you only have to synthesize the right input " +"and then check that the output matches expectations." +msgstr "" +"测试更容易是因为每个函数都是单元测试的潜在目标。在执行测试前,函数并不依赖于需要重现的系统状态;相反,你只需要给出正确的输入,然后检查输出是否和期望的结果一致。" + +#: ../../howto/functional.rst:163 +msgid "Composability" +msgstr "组合性" + +#: ../../howto/functional.rst:165 +msgid "" +"As you work on a functional-style program, you'll write a number of " +"functions with varying inputs and outputs. Some of these functions will be " +"unavoidably specialized to a particular application, but others will be " +"useful in a wide variety of programs. For example, a function that takes a " +"directory path and returns all the XML files in the directory, or a function" +" that takes a filename and returns its contents, can be applied to many " +"different situations." +msgstr "" +"当你编写函数式风格的程序时,你会写出很多带有不同输入和输出的函数。其中一些不可避免地会局限于特定的应用,但其他的却可以广泛的用在程序中。举例来说,一个接受文件夹目录返回所有文件夹中的" +" XML 文件的函数;或是一个接受文件名,然后返回文件内容的函数,都可以应用在很多不同的场合。" + +#: ../../howto/functional.rst:172 +msgid "" +"Over time you'll form a personal library of utilities. Often you'll " +"assemble new programs by arranging existing functions in a new configuration" +" and writing a few functions specialized for the current task." +msgstr "久而久之你会形成一个个人工具库。通常你可以重新组织已有的函数来组成新的程序,然后为当前的工作写一些特殊的函数。" + +#: ../../howto/functional.rst:180 +msgid "Iterators" +msgstr "迭代器" + +#: ../../howto/functional.rst:182 +msgid "" +"I'll start by looking at a Python language feature that's an important " +"foundation for writing functional-style programs: iterators." +msgstr "我会从 Python 的一个语言特性,编写函数式风格程序的重要基石开始说起:迭代器。" + +#: ../../howto/functional.rst:185 +msgid "" +"An iterator is an object representing a stream of data; this object returns " +"the data one element at a time. A Python iterator must support a method " +"called :meth:`~iterator.__next__` that takes no arguments and always returns" +" the next element of the stream. If there are no more elements in the " +"stream, :meth:`~iterator.__next__` must raise the :exc:`StopIteration` " +"exception. Iterators don't have to be finite, though; it's perfectly " +"reasonable to write an iterator that produces an infinite stream of data." +msgstr "" +"迭代器是一个表示数据流的对象;这个对象每次只返回一个元素。Python 迭代器必须支持 :meth:`~iterator.__next__` " +"方法;这个方法不接受参数,并总是返回数据流中的下一个元素。如果数据流中没有元素,:meth:`~iterator.__next__` 会抛出 " +":exc:`StopIteration` 异常。迭代器未必是有限的;完全有理由构造一个输出无限数据流的迭代器。" + +#: ../../howto/functional.rst:193 +msgid "" +"The built-in :func:`iter` function takes an arbitrary object and tries to " +"return an iterator that will return the object's contents or elements, " +"raising :exc:`TypeError` if the object doesn't support iteration. Several " +"of Python's built-in data types support iteration, the most common being " +"lists and dictionaries. An object is called :term:`iterable` if you can get" +" an iterator for it." +msgstr "" +"内置的 :func:`iter` 函数接受任意对象并试图返回一个迭代器来输出对象的内容或元素,并会在对象不支持迭代的时候抛出 " +":exc:`TypeError` 异常。Python 有几种内置数据类型支持迭代,最常见的就是列表和字典。如果一个对象能生成迭代器,那么它就会被称作 " +":term:`iterable`。" + +#: ../../howto/functional.rst:200 +msgid "You can experiment with the iteration interface manually:" +msgstr "你可以手动试验迭代器的接口。" + +#: ../../howto/functional.rst:218 +msgid "" +"Python expects iterable objects in several different contexts, the most " +"important being the :keyword:`for` statement. In the statement ``for X in " +"Y``, Y must be an iterator or some object for which :func:`iter` can create " +"an iterator. These two statements are equivalent::" +msgstr "" +"Python 有不少要求使用可迭代的对象的地方,其中最重要的就是 :keyword:`for` 语句。在语句 ``for X in Y`` 中,Y " +"要么自身是一个迭代器,要么能够由 :func:`iter` 创建一个迭代器。以下两种写法是等价的::" + +#: ../../howto/functional.rst:224 +msgid "" +"for i in iter(obj):\n" +" print(i)\n" +"\n" +"for i in obj:\n" +" print(i)" +msgstr "" +"for i in iter(obj):\n" +" print(i)\n" +"\n" +"for i in obj:\n" +" print(i)" + +#: ../../howto/functional.rst:230 +msgid "" +"Iterators can be materialized as lists or tuples by using the :func:`list` " +"or :func:`tuple` constructor functions:" +msgstr "可以用 :func:`list` 或 :func:`tuple` 这样的构造函数把迭代器具体化成列表或元组:" + +#: ../../howto/functional.rst:239 +msgid "" +"Sequence unpacking also supports iterators: if you know an iterator will " +"return N elements, you can unpack them into an N-tuple:" +msgstr "序列的解压操作也支持迭代器:如果你知道一个迭代器能够返回 N 个元素,你可以把他们解压到有 N 个元素的元组:" + +#: ../../howto/functional.rst:248 +msgid "" +"Built-in functions such as :func:`max` and :func:`min` can take a single " +"iterator argument and will return the largest or smallest element. The " +"``\"in\"`` and ``\"not in\"`` operators also support iterators: ``X in " +"iterator`` is true if X is found in the stream returned by the iterator. " +"You'll run into obvious problems if the iterator is infinite; :func:`max`, " +":func:`min` will never return, and if the element X never appears in the " +"stream, the ``\"in\"`` and ``\"not in\"`` operators won't return either." +msgstr "" +"像 :func:`max` 和 :func:`min` 这样的内置函数可以接受单个迭代器参数,然后返回其中最大或者最小的元素。``\"in\"`` 和 " +"``\"not in\"`` 操作也支持迭代器:如果能够在迭代器 iterator 返回的数据流中找到 X 的话,则 ``X in iterator``" +" 为真。很显然,如果迭代器是无限的,这么做你就会遇到问题;:func:`max` 和 :func:`min` 永远也不会返回;如果元素 X " +"也不出现在数据流中,``\"in\"`` 和 ``\"not in\"`` 操作同样也永远不会返回。" + +#: ../../howto/functional.rst:256 +msgid "" +"Note that you can only go forward in an iterator; there's no way to get the " +"previous element, reset the iterator, or make a copy of it. Iterator " +"objects can optionally provide these additional capabilities, but the " +"iterator protocol only specifies the :meth:`~iterator.__next__` method. " +"Functions may therefore consume all of the iterator's output, and if you " +"need to do something different with the same stream, you'll have to create a" +" new iterator." +msgstr "" +"注意你只能在迭代器中顺序前进;没有获取前一个元素的方法,除非重置迭代器,或者重新复制一份。迭代器对象可以提供这些额外的功能,但迭代器协议只明确了 " +":meth:`~iterator.__next__` " +"方法。函数可能因此而耗尽迭代器的输出,如果你要对同样的数据流做不同的操作,你必须重新创建一个迭代器。" + +#: ../../howto/functional.rst:266 +msgid "Data Types That Support Iterators" +msgstr "支持迭代器的数据类型" + +#: ../../howto/functional.rst:268 +msgid "" +"We've already seen how lists and tuples support iterators. In fact, any " +"Python sequence type, such as strings, will automatically support creation " +"of an iterator." +msgstr "我们已经知道列表和元组支持迭代器。实际上,Python 中的任何序列类型,比如字符串,都自动支持创建迭代器。" + +#: ../../howto/functional.rst:272 +msgid "" +"Calling :func:`iter` on a dictionary returns an iterator that will loop over" +" the dictionary's keys::" +msgstr "对字典调用 :func:`iter` 会返回一个遍历字典的键的迭代器::" + +#: ../../howto/functional.rst:275 +msgid "" +">>> m = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,\n" +"... 'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}\n" +">>> for key in m:\n" +"... print(key, m[key])\n" +"Jan 1\n" +"Feb 2\n" +"Mar 3\n" +"Apr 4\n" +"May 5\n" +"Jun 6\n" +"Jul 7\n" +"Aug 8\n" +"Sep 9\n" +"Oct 10\n" +"Nov 11\n" +"Dec 12" +msgstr "" +">>> m = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,\n" +"... 'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}\n" +">>> for key in m:\n" +"... print(key, m[key])\n" +"Jan 1\n" +"Feb 2\n" +"Mar 3\n" +"Apr 4\n" +"May 5\n" +"Jun 6\n" +"Jul 7\n" +"Aug 8\n" +"Sep 9\n" +"Oct 10\n" +"Nov 11\n" +"Dec 12" + +#: ../../howto/functional.rst:292 +msgid "" +"Note that starting with Python 3.7, dictionary iteration order is guaranteed" +" to be the same as the insertion order. In earlier versions, the behaviour " +"was unspecified and could vary between implementations." +msgstr "注意从 Python 3.7 开始,字典的遍历顺序一定和输入顺序一样。先前的版本并没有明确这一点,所以不同的实现可能不一致。" + +#: ../../howto/functional.rst:296 +msgid "" +"Applying :func:`iter` to a dictionary always loops over the keys, but " +"dictionaries have methods that return other iterators. If you want to " +"iterate over values or key/value pairs, you can explicitly call the " +":meth:`~dict.values` or :meth:`~dict.items` methods to get an appropriate " +"iterator." +msgstr "" +"对字典使用 :func:`iter` 总是会遍历键,但字典也有返回其他迭代器的方法。如果你只遍历值或者键/值对,你可以明确地调用 " +":meth:`~dict.values` 或 :meth:`~dict.items` 方法得到合适的迭代器。" + +#: ../../howto/functional.rst:302 +msgid "" +"The :func:`dict` constructor can accept an iterator that returns a finite " +"stream of ``(key, value)`` tuples:" +msgstr ":func:`dict` 构造函数可以接受一个返回有限的 ``(key, value)`` 元组流的迭代器:" + +#: ../../howto/functional.rst:309 +msgid "" +"Files also support iteration by calling the :meth:`~io.TextIOBase.readline` " +"method until there are no more lines in the file. This means you can read " +"each line of a file like this::" +msgstr "" +"文件也可以通过调用 :meth:`~io.TextIOBase.readline` " +"来遍历,直到穷尽文件中所有的行。这意味着你可以像这样读取文件中的每一行::" + +#: ../../howto/functional.rst:313 +msgid "" +"for line in file:\n" +" # do something for each line\n" +" ..." +msgstr "" +"for line in file:\n" +" # 对每一行执行某些操作\n" +" ..." + +#: ../../howto/functional.rst:317 +msgid "" +"Sets can take their contents from an iterable and let you iterate over the " +"set's elements::" +msgstr "集合可以从可遍历的对象获取内容,也可以让你遍历集合的元素::" + +#: ../../howto/functional.rst:320 +msgid "" +">>> S = {2, 3, 5, 7, 11, 13}\n" +">>> for i in S:\n" +"... print(i)\n" +"2\n" +"3\n" +"5\n" +"7\n" +"11\n" +"13" +msgstr "" +">>> S = {2, 3, 5, 7, 11, 13}\n" +">>> for i in S:\n" +"... print(i)\n" +"2\n" +"3\n" +"5\n" +"7\n" +"11\n" +"13" + +#: ../../howto/functional.rst:333 +msgid "Generator expressions and list comprehensions" +msgstr "生成器表达式和列表推导式" + +#: ../../howto/functional.rst:335 +msgid "" +"Two common operations on an iterator's output are 1) performing some " +"operation for every element, 2) selecting a subset of elements that meet " +"some condition. For example, given a list of strings, you might want to " +"strip off trailing whitespace from each line or extract all the strings " +"containing a given substring." +msgstr "" +"迭代器的输出有两个很常见的使用方式,1) 对每一个元素执行操作,2) " +"选择一个符合条件的元素子集。比如,给定一个字符串列表,你可能想去掉每个字符串尾部的空白字符,或是选出所有包含给定子串的字符串。" + +#: ../../howto/functional.rst:341 +msgid "" +"List comprehensions and generator expressions (short form: \"listcomps\" and" +" \"genexps\") are a concise notation for such operations, borrowed from the " +"functional programming language Haskell (https://www.haskell.org/). You can" +" strip all the whitespace from a stream of strings with the following code::" +msgstr "" +"列表推导式和生成器表达式 (简写:\"listcomp\" 和 \"genexp\") 让这些操作更加简明,这个形式借鉴自函数式编程语言 Haskell" +" (https://www.haskell.org/)。你可以用以下代码去掉一个字符串流中的所有空白符:" + +#: ../../howto/functional.rst:346 +msgid "" +">>> line_list = [' line 1\\n', 'line 2 \\n', ' \\n', '']\n" +"\n" +">>> # Generator expression -- returns iterator\n" +">>> stripped_iter = (line.strip() for line in line_list)\n" +"\n" +">>> # List comprehension -- returns list\n" +">>> stripped_list = [line.strip() for line in line_list]" +msgstr "" +">>> line_list = [' line 1\\n', 'line 2 \\n', ' \\n', '']\n" +"\n" +">>> # 生成器表达式 -- 返回迭代器\n" +">>> stripped_iter = (line.strip() for line in line_list)\n" +"\n" +">>> # 列表推导式 -- 返回列表\n" +">>> stripped_list = [line.strip() for line in line_list]" + +#: ../../howto/functional.rst:354 +msgid "You can select only certain elements by adding an ``\"if\"`` condition::" +msgstr "你可以加上条件语句 ``\"if\"`` 来选取特定的元素::" + +#: ../../howto/functional.rst:356 +msgid "" +">>> stripped_list = [line.strip() for line in line_list\n" +"... if line != \"\"]" +msgstr "" +">>> stripped_list = [line.strip() for line in line_list\n" +"... if line != \"\"]" + +#: ../../howto/functional.rst:359 +msgid "" +"With a list comprehension, you get back a Python list; ``stripped_list`` is " +"a list containing the resulting lines, not an iterator. Generator " +"expressions return an iterator that computes the values as necessary, not " +"needing to materialize all the values at once. This means that list " +"comprehensions aren't useful if you're working with iterators that return an" +" infinite stream or a very large amount of data. Generator expressions are " +"preferable in these situations." +msgstr "" +"通过列表推导式,你会获得一个 Python 列表;``stripped_list`` 就是一个包含所有结果行的列表,并不是迭代器。 " +"生成器表达式会返回一个迭代器,它在必要的时候计算结果,避免一次性生成所有的值。 " +"这意味着,如果迭代器返回一个无限数据流或者大量的数据,列表推导式就不太好用了。这种情况下生成器表达式会更受青睐。" + +#: ../../howto/functional.rst:366 +msgid "" +"Generator expressions are surrounded by parentheses (\"()\") and list " +"comprehensions are surrounded by square brackets (\"[]\"). Generator " +"expressions have the form::" +msgstr "生成器表达式两边使用圆括号 (\"()\") ,而列表推导式则使用方括号 (\"[]\")。生成器表达式的形式为::" + +#: ../../howto/functional.rst:370 +msgid "" +"( expression for expr in sequence1\n" +" if condition1\n" +" for expr2 in sequence2\n" +" if condition2\n" +" for expr3 in sequence3\n" +" ...\n" +" if condition3\n" +" for exprN in sequenceN\n" +" if conditionN )" +msgstr "" +"( expression for expr in sequence1\n" +" if condition1\n" +" for expr2 in sequence2\n" +" if condition2\n" +" for expr3 in sequence3\n" +" ...\n" +" if condition3\n" +" for exprN in sequenceN\n" +" if conditionN )" + +#: ../../howto/functional.rst:380 +msgid "" +"Again, for a list comprehension only the outside brackets are different " +"(square brackets instead of parentheses)." +msgstr "再次说明,列表推导式只有两边的括号不一样(方括号而不是圆括号)。" + +#: ../../howto/functional.rst:383 +msgid "" +"The elements of the generated output will be the successive values of " +"``expression``. The ``if`` clauses are all optional; if present, " +"``expression`` is only evaluated and added to the result when ``condition`` " +"is true." +msgstr "" +"生成的输出的各个元素将是 ``expression`` 的连续取值。其中 ``if`` 语句是可选的;如果给定的话 ``expression`` " +"只会在符合条件时计算并加入到结果中。" + +#: ../../howto/functional.rst:387 +msgid "" +"Generator expressions always have to be written inside parentheses, but the " +"parentheses signalling a function call also count. If you want to create an" +" iterator that will be immediately passed to a function you can write::" +msgstr "生成器表达式总是写在圆括号里面,不过也可以算上调用函数时用的括号。如果你想即时创建一个传递给函数的迭代器,可以这么写::" + +#: ../../howto/functional.rst:391 +msgid "obj_total = sum(obj.count for obj in list_all_objects())" +msgstr "obj_total = sum(obj.count for obj in list_all_objects())" + +#: ../../howto/functional.rst:393 +msgid "" +"The ``for...in`` clauses contain the sequences to be iterated over. The " +"sequences do not have to be the same length, because they are iterated over " +"from left to right, **not** in parallel. For each element in ``sequence1``," +" ``sequence2`` is looped over from the beginning. ``sequence3`` is then " +"looped over for each resulting pair of elements from ``sequence1`` and " +"``sequence2``." +msgstr "" +"其中 ``for...in`` 语句包含了将要遍历的序列。这些序列并不必须同样长,因为它们会从左往右开始遍历,而 **不是** 同时执行。对每个 " +"``sequence1`` 中的元素,``sequence2`` 会从头开始遍历。``sequence3`` 会对每个 ``sequence1`` 和 " +"``sequence2`` 的元素对开始遍历。" + +#: ../../howto/functional.rst:399 +msgid "" +"To put it another way, a list comprehension or generator expression is " +"equivalent to the following Python code::" +msgstr "换句话说,列表推导式或生成器表达式是和下面的 Python 代码等价::" + +#: ../../howto/functional.rst:402 +msgid "" +"for expr1 in sequence1:\n" +" if not (condition1):\n" +" continue # Skip this element\n" +" for expr2 in sequence2:\n" +" if not (condition2):\n" +" continue # Skip this element\n" +" ...\n" +" for exprN in sequenceN:\n" +" if not (conditionN):\n" +" continue # Skip this element\n" +"\n" +" # Output the value of\n" +" # the expression." +msgstr "" +"for expr1 in sequence1:\n" +" if not (condition1):\n" +" continue # 跳过此元素\n" +" for expr2 in sequence2:\n" +" if not (condition2):\n" +" continue # 跳过此元素\n" +" ...\n" +" for exprN in sequenceN:\n" +" if not (conditionN):\n" +" continue # 跳过此元素\n" +"\n" +" # 输出表达式的值。" + +#: ../../howto/functional.rst:416 +msgid "" +"This means that when there are multiple ``for...in`` clauses but no ``if`` " +"clauses, the length of the resulting output will be equal to the product of " +"the lengths of all the sequences. If you have two lists of length 3, the " +"output list is 9 elements long:" +msgstr "" +"这说明,如果有多个 ``for...in`` 语句而没有 ``if`` 语句,输出结果的长度就是所有序列长度的乘积。如果你的两个列表长度为 " +"3,那么输出的列表长度就是 9:" + +#: ../../howto/functional.rst:428 +msgid "" +"To avoid introducing an ambiguity into Python's grammar, if ``expression`` " +"is creating a tuple, it must be surrounded with parentheses. The first list" +" comprehension below is a syntax error, while the second one is correct::" +msgstr "" +"为了不让 Python 语法变得含糊,如果 ``expression`` " +"会生成元组,那这个元组必须要用括号括起来。下面第一个列表推导式语法错误,第二个则是正确的::" + +#: ../../howto/functional.rst:432 +msgid "" +"# Syntax error\n" +"[x, y for x in seq1 for y in seq2]\n" +"# Correct\n" +"[(x, y) for x in seq1 for y in seq2]" +msgstr "" +"# 语法错误\n" +"[x, y for x in seq1 for y in seq2]\n" +"# 正确\n" +"[(x, y) for x in seq1 for y in seq2]" + +#: ../../howto/functional.rst:439 +msgid "Generators" +msgstr "生成器" + +#: ../../howto/functional.rst:441 +msgid "" +"Generators are a special class of functions that simplify the task of " +"writing iterators. Regular functions compute a value and return it, but " +"generators return an iterator that returns a stream of values." +msgstr "生成器是一类用来简化编写迭代器工作的特殊函数。普通的函数计算并返回一个值,而生成器返回一个能返回数据流的迭代器。" + +#: ../../howto/functional.rst:445 +msgid "" +"You're doubtless familiar with how regular function calls work in Python or " +"C. When you call a function, it gets a private namespace where its local " +"variables are created. When the function reaches a ``return`` statement, " +"the local variables are destroyed and the value is returned to the caller. " +"A later call to the same function creates a new private namespace and a " +"fresh set of local variables. But, what if the local variables weren't " +"thrown away on exiting a function? What if you could later resume the " +"function where it left off? This is what generators provide; they can be " +"thought of as resumable functions." +msgstr "" +"毫无疑问,你已经对如何在 Python 和 C 中调用普通函数很熟悉了,这时候函数会获得一个创建局部变量的私有命名空间。当函数到达 ``return``" +" " +"表达式时,局部变量会被销毁然后把返回给调用者。之后调用同样的函数时会创建一个新的私有命名空间和一组全新的局部变量。但是,如果在退出一个函数时不扔掉局部变量会如何呢?如果稍后你能够从退出函数的地方重新恢复又如何呢?这就是生成器所提供的;他们可以被看成可恢复的函数。" + +#: ../../howto/functional.rst:454 +msgid "Here's the simplest example of a generator function:" +msgstr "这里有简单的生成器函数示例:" + +#: ../../howto/functional.rst:460 +msgid "" +"Any function containing a :keyword:`yield` keyword is a generator function; " +"this is detected by Python's :term:`bytecode` compiler which compiles the " +"function specially as a result." +msgstr "" +"任何包含了 :keyword:`yield` 关键字的函数都是生成器函数;Python 的 :term:`bytecode` " +"编译器会在编译的时候检测到并因此而特殊处理。" + +#: ../../howto/functional.rst:464 +msgid "" +"When you call a generator function, it doesn't return a single value; " +"instead it returns a generator object that supports the iterator protocol. " +"On executing the ``yield`` expression, the generator outputs the value of " +"``i``, similar to a ``return`` statement. The big difference between " +"``yield`` and a ``return`` statement is that on reaching a ``yield`` the " +"generator's state of execution is suspended and local variables are " +"preserved. On the next call to the generator's :meth:`~generator.__next__` " +"method, the function will resume executing." +msgstr "" +"当你调用一个生成器函数,它并不会返回单独的值,而是返回一个支持生成器协议的生成器对象。当执行 ``yield`` 表达式时,生成器会输出 ``i`` " +"的值,就像 ``return`` 表达式一样。``yield`` 和 ``return`` 最大的区别在于,到达 ``yield`` " +"的时候生成器的执行状态会挂起并保留局部变量。在下一次调用生成器 :meth:`~generator.__next__` 方法的时候,函数会恢复执行。" + +#: ../../howto/functional.rst:473 +msgid "Here's a sample usage of the ``generate_ints()`` generator:" +msgstr "这里有一个 ``generate_ints()`` 生成器的示例:" + +#: ../../howto/functional.rst:490 +msgid "" +"You could equally write ``for i in generate_ints(5)``, or ``a, b, c = " +"generate_ints(3)``." +msgstr "" +"同样,你可以写出 ``for i in generate_ints(5)``,或者 ``a, b, c = generate_ints(3)``。" + +#: ../../howto/functional.rst:493 +msgid "" +"Inside a generator function, ``return value`` causes " +"``StopIteration(value)`` to be raised from the :meth:`~generator.__next__` " +"method. Once this happens, or the bottom of the function is reached, the " +"procession of values ends and the generator cannot yield any further values." +msgstr "" +"在生成器函数里面,``return value`` 会触发从 :meth:`~generator.__next__` 方法抛出 " +"``StopIteration(value)`` 异常。一旦抛出这个异常,或者函数结束,处理数据的过程就会停止,生成器也不会再生成新的值。" + +#: ../../howto/functional.rst:498 +msgid "" +"You could achieve the effect of generators manually by writing your own " +"class and storing all the local variables of the generator as instance " +"variables. For example, returning a list of integers could be done by " +"setting ``self.count`` to 0, and having the :meth:`~iterator.__next__` " +"method increment ``self.count`` and return it. However, for a moderately " +"complicated generator, writing a corresponding class can be much messier." +msgstr "" +"你可以手动编写自己的类来达到生成器的效果,把生成器的所有局部变量作为实例的成员变量存储起来。比如,可以这么返回一个整数列表:把 " +"``self.count`` 设为 0,然后通过 :meth:`~iterator.__next__` 方法增加并返回 ``self.count``。 " +"然而,对于一个中等复杂程度的生成器,写出一个相应的类可能会相当繁杂。" + +#: ../../howto/functional.rst:506 +msgid "" +"The test suite included with Python's library, " +":source:`Lib/test/test_generators.py`, contains a number of more interesting" +" examples. Here's one generator that implements an in-order traversal of a " +"tree using generators recursively. ::" +msgstr "" +"包含在 Python 库中的测试套件 :source:`Lib/test/test_generators.py` " +"里有很多非常有趣的例子。这里是一个用生成器实现树的递归中序遍历示例。::" + +#: ../../howto/functional.rst:511 +msgid "" +"# A recursive generator that generates Tree leaves in in-order.\n" +"def inorder(t):\n" +" if t:\n" +" for x in inorder(t.left):\n" +" yield x\n" +"\n" +" yield t.label\n" +"\n" +" for x in inorder(t.right):\n" +" yield x" +msgstr "" +"# 一个按中序生成 Tree 叶子节点的递归生成器。\n" +"def inorder(t):\n" +" if t:\n" +" for x in inorder(t.left):\n" +" yield x\n" +"\n" +" yield t.label\n" +"\n" +" for x in inorder(t.right):\n" +" yield x" + +#: ../../howto/functional.rst:522 +msgid "" +"Two other examples in ``test_generators.py`` produce solutions for the " +"N-Queens problem (placing N queens on an NxN chess board so that no queen " +"threatens another) and the Knight's Tour (finding a route that takes a " +"knight to every square of an NxN chessboard without visiting any square " +"twice)." +msgstr "" +"另外两个 ``test_generators.py`` 中的例子给出了 N 皇后问题(在 NxN 的棋盘上放置 N " +"个皇后,任何一个都不能吃掉另一个),以及马的遍历路线(在 NxN 的棋盘上给马找出一条不重复的走过所有格子的路线)的解。" + +#: ../../howto/functional.rst:530 +msgid "Passing values into a generator" +msgstr "向生成器传递值" + +#: ../../howto/functional.rst:532 +msgid "" +"In Python 2.4 and earlier, generators only produced output. Once a " +"generator's code was invoked to create an iterator, there was no way to pass" +" any new information into the function when its execution is resumed. You " +"could hack together this ability by making the generator look at a global " +"variable or by passing in some mutable object that callers then modify, but " +"these approaches are messy." +msgstr "" +"在 Python 2.4 " +"及之前的版本中,生成器只产生输出。一旦调用生成器的代码创建一个迭代器,就没有办法在函数恢复执行的时候向它传递新的信息。你可以设法实现这个功能,让生成器引用一个全局变量或者一个调用者可以修改的可变对象,但是这些方法都很繁杂。" + +#: ../../howto/functional.rst:539 +msgid "" +"In Python 2.5 there's a simple way to pass values into a generator. " +":keyword:`yield` became an expression, returning a value that can be " +"assigned to a variable or otherwise operated on::" +msgstr "" +"在 Python 2.5 里有一个简单的将值传递给生成器的方法。:keyword:`yield` " +"变成了一个表达式,返回一个可以赋给变量或执行操作的值::" + +#: ../../howto/functional.rst:543 +msgid "val = (yield i)" +msgstr "val = (yield i)" + +#: ../../howto/functional.rst:545 +msgid "" +"I recommend that you **always** put parentheses around a ``yield`` " +"expression when you're doing something with the returned value, as in the " +"above example. The parentheses aren't always necessary, but it's easier to " +"always add them instead of having to remember when they're needed." +msgstr "" +"我建议你在处理 ``yield`` 表达式返回值的时候, **总是** " +"两边写上括号,就像上面的例子一样。括号并不总是必须的,但是比起记住什么时候需要括号,写出来会更容易一点。" + +#: ../../howto/functional.rst:550 +msgid "" +"(:pep:`342` explains the exact rules, which are that a ``yield``-expression " +"must always be parenthesized except when it occurs at the top-level " +"expression on the right-hand side of an assignment. This means you can " +"write ``val = yield i`` but have to use parentheses when there's an " +"operation, as in ``val = (yield i) + 12``.)" +msgstr "" +"(:pep:`342` 解释了具体的规则,也就是 ``yield`` 表达式必须括起来,除非是出现在最顶级的赋值表达式的右边。 这意味着你可以写 " +"``val = yield i``,但是必须在操作的时候加上括号,就像 ``val = (yield i) + 12``)" + +#: ../../howto/functional.rst:556 +msgid "" +"Values are sent into a generator by calling its :meth:`send(value) " +"` method. This method resumes the generator's code and the " +"``yield`` expression returns the specified value. If the regular " +":meth:`~generator.__next__` method is called, the ``yield`` returns " +"``None``." +msgstr "" +"向生成器发送值是通过调用其 :meth:`send(value) ` 方法。此方法会恢复执行生成器的代码并以 " +"``yield`` 表达式返回指定的值。如果调用了常规的 :meth:`~generator.__next__` 方法,``yield`` 会返回 " +"``None``." + +#: ../../howto/functional.rst:561 +msgid "" +"Here's a simple counter that increments by 1 and allows changing the value " +"of the internal counter." +msgstr "这里有一个简单的每次加 1 的计数器,并允许改变内部计数器的值。" + +#: ../../howto/functional.rst:564 +msgid "" +"def counter(maximum):\n" +" i = 0\n" +" while i < maximum:\n" +" val = (yield i)\n" +" # If value provided, change counter\n" +" if val is not None:\n" +" i = val\n" +" else:\n" +" i += 1" +msgstr "" +"def counter(maximum):\n" +" i = 0\n" +" while i < maximum:\n" +" val = (yield i)\n" +" # 如果提供了值,则改变计数器\n" +" if val is not None:\n" +" i = val\n" +" else:\n" +" i += 1" + +#: ../../howto/functional.rst:576 +msgid "And here's an example of changing the counter:" +msgstr "这是改变计数器的一个示例" + +#: ../../howto/functional.rst:593 +msgid "" +"Because ``yield`` will often be returning ``None``, you should always check " +"for this case. Don't just use its value in expressions unless you're sure " +"that the :meth:`~generator.send` method will be the only method used to " +"resume your generator function." +msgstr "" +"因为 ``yield`` 很多时候会返回 ``None``,所以你应该总是检查这个情况。不要在表达式中使用 ``yield`` 的值,除非你确定 " +":meth:`~generator.send` 是唯一的用来恢复你的生成器函数的方法。" + +#: ../../howto/functional.rst:598 +msgid "" +"In addition to :meth:`~generator.send`, there are two other methods on " +"generators:" +msgstr "除了 :meth:`~generator.send` 之外,生成器还有两个其他的方法:" + +#: ../../howto/functional.rst:601 +msgid "" +":meth:`throw(value) ` is used to raise an exception inside " +"the generator; the exception is raised by the ``yield`` expression where the" +" generator's execution is paused." +msgstr "" +":meth:`throw(value) ` 用于在生成器内部抛出异常;这个异常会在生成器暂停执行的时候由 " +"``yield`` 表达式抛出。" + +#: ../../howto/functional.rst:605 +msgid "" +":meth:`~generator.close` sends a :exc:`GeneratorExit` exception to the " +"generator to terminate the iteration. On receiving this exception, the " +"generator's code must either raise :exc:`GeneratorExit` or " +":exc:`StopIteration`; catching the exception and doing anything else is " +"illegal and will trigger a :exc:`RuntimeError`. :meth:`~generator.close` " +"will also be called by Python's garbage collector when the generator is " +"garbage-collected." +msgstr "" +":meth:`~generator.close` 会向生成器发送一个 :exc:`GeneratorExit` 异常来终结迭代。 " +"当接收到此异常时,生成器的代码必须引发 :exc:`GeneratorExit` 或者 " +":exc:`StopIteration`;捕获此异常并作任何其他操作都是非法的并会触发 :exc:`RuntimeError`。 " +":meth:`~generator.close` 还会在生成器被作为垃圾回收时由 Python 的垃圾回收器调用。" + +#: ../../howto/functional.rst:613 +msgid "" +"If you need to run cleanup code when a :exc:`GeneratorExit` occurs, I " +"suggest using a ``try: ... finally:`` suite instead of catching " +":exc:`GeneratorExit`." +msgstr "" +"如果你要在 :exc:`GeneratorExit` 发生的时候清理代码,我建议使用 ``try: ... finally:`` 组合来代替 " +":exc:`GeneratorExit`。" + +#: ../../howto/functional.rst:616 +msgid "" +"The cumulative effect of these changes is to turn generators from one-way " +"producers of information into both producers and consumers." +msgstr "这些改变的累积效应是,让生成器从单向的信息生产者变成了既是生产者,又是消费者。" + +#: ../../howto/functional.rst:619 +msgid "" +"Generators also become **coroutines**, a more generalized form of " +"subroutines. Subroutines are entered at one point and exited at another " +"point (the top of the function, and a ``return`` statement), but coroutines " +"can be entered, exited, and resumed at many different points (the ``yield`` " +"statements)." +msgstr "" +"生成器也可以成为 **协程** ,一种更广义的子过程形式。子过程可以从一个地方进入,然后从另一个地方退出(从函数的顶端进入,从 ``return`` " +"语句退出),而协程可以进入,退出,然后在很多不同的地方恢复 (``yield`` 语句)。" + +#: ../../howto/functional.rst:626 +msgid "Built-in functions" +msgstr "内置函数" + +#: ../../howto/functional.rst:628 +msgid "" +"Let's look in more detail at built-in functions often used with iterators." +msgstr "我们可以看看迭代器常常用到的函数的更多细节。" + +#: ../../howto/functional.rst:630 +msgid "" +"Two of Python's built-in functions, :func:`map` and :func:`filter` duplicate" +" the features of generator expressions:" +msgstr "Python 内置的两个函数 :func:`map` 和 :func:`filter` 复制了生成器表达式的两个特性:" + +#: ../../howto/functional.rst:633 +msgid "" +":func:`map(f, iterA, iterB, ...) ` returns an iterator over the " +"sequence" +msgstr ":func:`map(f, iterA, iterB, ...) ` 返回一个遍历序列的迭代器" + +#: ../../howto/functional.rst:634 +msgid "" +"``f(iterA[0], iterB[0]), f(iterA[1], iterB[1]), f(iterA[2], iterB[2]), " +"...``." +msgstr "" +"``f(iterA[0], iterB[0]), f(iterA[1], iterB[1]), f(iterA[2], iterB[2]), " +"...``." + +#: ../../howto/functional.rst:644 +msgid "You can of course achieve the same effect with a list comprehension." +msgstr "你当然也可以用列表推导式达到同样的效果。" + +#: ../../howto/functional.rst:646 +msgid "" +":func:`filter(predicate, iter) ` returns an iterator over all the " +"sequence elements that meet a certain condition, and is similarly duplicated" +" by list comprehensions. A **predicate** is a function that returns the " +"truth value of some condition; for use with :func:`filter`, the predicate " +"must take a single value." +msgstr "" +":func:`filter(predicate, iter) ` 返回一个遍历序列中满足指定条件的元素的迭代器,和列表推导式的功能相似。" +" **predicate** (谓词)是一个在特定条件下返回真值的函数;要使用函数 :func:`filter`,谓词函数必须只能接受一个参数。" + +#: ../../howto/functional.rst:659 +msgid "This can also be written as a list comprehension:" +msgstr "这也可以写成列表推导式:" + +#: ../../howto/functional.rst:665 +msgid "" +":func:`enumerate(iter, start=0) ` counts off the elements in the " +"iterable returning 2-tuples containing the count (from *start*) and each " +"element. ::" +msgstr "" +":func:`enumerate(iter, start=0) ` 计数可迭代对象中的元素,然后返回包含每个计数(从 " +"**start** 开始)和元素两个值的元组。::" + +#: ../../howto/functional.rst:669 +msgid "" +">>> for item in enumerate(['subject', 'verb', 'object']):\n" +"... print(item)\n" +"(0, 'subject')\n" +"(1, 'verb')\n" +"(2, 'object')" +msgstr "" +">>> for item in enumerate(['subject', 'verb', 'object']):\n" +"... print(item)\n" +"(0, 'subject')\n" +"(1, 'verb')\n" +"(2, 'object')" + +#: ../../howto/functional.rst:675 +msgid "" +":func:`enumerate` is often used when looping through a list and recording " +"the indexes at which certain conditions are met::" +msgstr ":func:`enumerate` 常常用于遍历列表并记录达到特定条件时的下标::" + +#: ../../howto/functional.rst:678 +msgid "" +"f = open('data.txt', 'r')\n" +"for i, line in enumerate(f):\n" +" if line.strip() == '':\n" +" print('Blank line at line #%i' % i)" +msgstr "" +"f = open('data.txt', 'r')\n" +"for i, line in enumerate(f):\n" +" if line.strip() == '':\n" +" print('Blank line at line #%i' % i)" + +#: ../../howto/functional.rst:683 +msgid "" +":func:`sorted(iterable, key=None, reverse=False) ` collects all the " +"elements of the iterable into a list, sorts the list, and returns the sorted" +" result. The *key* and *reverse* arguments are passed through to the " +"constructed list's :meth:`~list.sort` method. ::" +msgstr "" +":func:`sorted(iterable, key=None, reverse=False) ` 会将 iterable " +"中的元素收集到一个列表中,然后排序并返回结果。其中 *key* 和 *reverse* 参数会传递给所创建列表的 :meth:`~list.sort` " +"方法。::" + +#: ../../howto/functional.rst:688 +msgid "" +">>> import random\n" +">>> # Generate 8 random numbers between [0, 10000)\n" +">>> rand_list = random.sample(range(10000), 8)\n" +">>> rand_list\n" +"[769, 7953, 9828, 6431, 8442, 9878, 6213, 2207]\n" +">>> sorted(rand_list)\n" +"[769, 2207, 6213, 6431, 7953, 8442, 9828, 9878]\n" +">>> sorted(rand_list, reverse=True)\n" +"[9878, 9828, 8442, 7953, 6431, 6213, 2207, 769]" +msgstr "" +">>> import random\n" +">>> # 生成在 [0, 10000) 区间内的 8 个随机数\n" +">>> rand_list = random.sample(range(10000), 8)\n" +">>> rand_list\n" +"[769, 7953, 9828, 6431, 8442, 9878, 6213, 2207]\n" +">>> sorted(rand_list)\n" +"[769, 2207, 6213, 6431, 7953, 8442, 9828, 9878]\n" +">>> sorted(rand_list, reverse=True)\n" +"[9878, 9828, 8442, 7953, 6431, 6213, 2207, 769]" + +#: ../../howto/functional.rst:698 +msgid "" +"(For a more detailed discussion of sorting, see the :ref:`sortinghowto`.)" +msgstr "(对排序更详细的讨论可参见 :ref:`sortinghowto`。)" + +#: ../../howto/functional.rst:701 +msgid "" +"The :func:`any(iter) ` and :func:`all(iter) ` built-ins look at " +"the truth values of an iterable's contents. :func:`any` returns ``True`` if" +" any element in the iterable is a true value, and :func:`all` returns " +"``True`` if all of the elements are true values:" +msgstr "" +"内置函数 :func:`any(iter) ` 和 :func:`all(iter) ` " +"会查看一个可迭代对象内容的逻辑值。:func:`any` 在可迭代对象中任意一个元素为真时返回 ``True``,而 :func:`all` " +"在所有元素为真时返回 ``True``:" + +#: ../../howto/functional.rst:720 +msgid "" +":func:`zip(iterA, iterB, ...) ` takes one element from each iterable " +"and returns them in a tuple::" +msgstr ":func:`zip(iterA, iterB, ...) ` 从每个可迭代对象中选取单个元素组成元组并返回::" + +#: ../../howto/functional.rst:723 +msgid "" +"zip(['a', 'b', 'c'], (1, 2, 3)) =>\n" +" ('a', 1), ('b', 2), ('c', 3)" +msgstr "" +"zip(['a', 'b', 'c'], (1, 2, 3)) =>\n" +" ('a', 1), ('b', 2), ('c', 3)" + +#: ../../howto/functional.rst:726 +msgid "" +"It doesn't construct an in-memory list and exhaust all the input iterators " +"before returning; instead tuples are constructed and returned only if " +"they're requested. (The technical term for this behaviour is `lazy " +"evaluation `__.)" +msgstr "" +"它并不会在内存创建一个列表并因此在返回前而耗尽输入的迭代器;相反,只有在被请求的时候元组才会创建并返回。(这种行为的技术术语叫惰性计算,参见 `lazy" +" evaluation `__.)" + +#: ../../howto/functional.rst:731 +msgid "" +"This iterator is intended to be used with iterables that are all of the same" +" length. If the iterables are of different lengths, the resulting stream " +"will be the same length as the shortest iterable. ::" +msgstr "这个迭代器设计用于长度相同的可迭代对象。如果可迭代对象的长度不一致,返回的数据流的长度会和最短的可迭代对象相同 ::" + +#: ../../howto/functional.rst:735 +msgid "" +"zip(['a', 'b'], (1, 2, 3)) =>\n" +" ('a', 1), ('b', 2)" +msgstr "" +"zip(['a', 'b'], (1, 2, 3)) =>\n" +" ('a', 1), ('b', 2)" + +#: ../../howto/functional.rst:738 +msgid "" +"You should avoid doing this, though, because an element may be taken from " +"the longer iterators and discarded. This means you can't go on to use the " +"iterators further because you risk skipping a discarded element." +msgstr "然而,你应该避免这种情况,因为所有从更长的迭代器中取出的元素都会被丢弃。这意味着之后你也无法冒着跳过被丢弃元素的风险来继续使用这个迭代器。" + +#: ../../howto/functional.rst:744 +msgid "The itertools module" +msgstr "itertools 模块" + +#: ../../howto/functional.rst:746 +msgid "" +"The :mod:`itertools` module contains a number of commonly used iterators as " +"well as functions for combining several iterators. This section will " +"introduce the module's contents by showing small examples." +msgstr ":mod:`itertools` 模块包含很多常用的迭代器以及用于组合多个迭代器的函数。本节会用一些小例子来介绍这个模块的内容。" + +#: ../../howto/functional.rst:750 +msgid "The module's functions fall into a few broad classes:" +msgstr "这个模块里的函数大致可以分为几类:" + +#: ../../howto/functional.rst:752 +msgid "Functions that create a new iterator based on an existing iterator." +msgstr "从已有的迭代器创建新的迭代器的函数。" + +#: ../../howto/functional.rst:753 +msgid "Functions for treating an iterator's elements as function arguments." +msgstr "接受迭代器元素作为参数的函数。" + +#: ../../howto/functional.rst:754 +msgid "Functions for selecting portions of an iterator's output." +msgstr "选取部分迭代器输出的函数。" + +#: ../../howto/functional.rst:755 +msgid "A function for grouping an iterator's output." +msgstr "给迭代器输出分组的函数。" + +#: ../../howto/functional.rst:758 +msgid "Creating new iterators" +msgstr "创建新的迭代器" + +#: ../../howto/functional.rst:760 +msgid "" +":func:`itertools.count(start, step) ` returns an infinite " +"stream of evenly spaced values. You can optionally supply the starting " +"number, which defaults to 0, and the interval between numbers, which " +"defaults to 1::" +msgstr "" +":func:`itertools.count(start, step) ` 返回一个等分的无限数据流。初始值默认为 " +"0,间隔默认为 1,你也可以选择指定初始值和间隔::" + +#: ../../howto/functional.rst:764 +msgid "" +"itertools.count() =>\n" +" 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ...\n" +"itertools.count(10) =>\n" +" 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ...\n" +"itertools.count(10, 5) =>\n" +" 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, ..." +msgstr "" +"itertools.count() =>\n" +" 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ...\n" +"itertools.count(10) =>\n" +" 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ...\n" +"itertools.count(10, 5) =>\n" +" 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, ..." + +#: ../../howto/functional.rst:771 +msgid "" +":func:`itertools.cycle(iter) ` saves a copy of the contents" +" of a provided iterable and returns a new iterator that returns its elements" +" from first to last. The new iterator will repeat these elements " +"infinitely. ::" +msgstr "" +":func:`itertools.cycle(iter) ` " +"保存一份所提供的可迭代对象的副本,并返回一个能产生整个可迭代对象序列的新迭代器。新迭代器会无限重复这些元素。::" + +#: ../../howto/functional.rst:775 +msgid "" +"itertools.cycle([1, 2, 3, 4, 5]) =>\n" +" 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ..." +msgstr "" +"itertools.cycle([1, 2, 3, 4, 5]) =>\n" +" 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ..." + +#: ../../howto/functional.rst:778 +msgid "" +":func:`itertools.repeat(elem, [n]) ` returns the provided " +"element *n* times, or returns the element endlessly if *n* is not provided. " +"::" +msgstr "" +":func:`itertools.repeat(elem, [n]) ` 返回 *n* 次所提供的元素,当 *n* " +"不存在时,返回无数次所提供的元素。 ::" + +#: ../../howto/functional.rst:781 +msgid "" +"itertools.repeat('abc') =>\n" +" abc, abc, abc, abc, abc, abc, abc, abc, abc, abc, ...\n" +"itertools.repeat('abc', 5) =>\n" +" abc, abc, abc, abc, abc" +msgstr "" +"itertools.repeat('abc') =>\n" +" abc, abc, abc, abc, abc, abc, abc, abc, abc, abc, ...\n" +"itertools.repeat('abc', 5) =>\n" +" abc, abc, abc, abc, abc" + +#: ../../howto/functional.rst:786 +msgid "" +":func:`itertools.chain(iterA, iterB, ...) ` takes an " +"arbitrary number of iterables as input, and returns all the elements of the " +"first iterator, then all the elements of the second, and so on, until all of" +" the iterables have been exhausted. ::" +msgstr "" +":func:`itertools.chain(iterA, iterB, ...) ` " +"接受任意数量的可迭代对象作为输入,首先返回第一个迭代器的所有元素,然后是第二个的所有元素,如此一直进行下去,直到消耗掉所有输入的可迭代对象。::" + +#: ../../howto/functional.rst:791 +msgid "" +"itertools.chain(['a', 'b', 'c'], (1, 2, 3)) =>\n" +" a, b, c, 1, 2, 3" +msgstr "" +"itertools.chain(['a', 'b', 'c'], (1, 2, 3)) =>\n" +" a, b, c, 1, 2, 3" + +#: ../../howto/functional.rst:794 +msgid "" +":func:`itertools.islice(iter, [start], stop, [step]) ` " +"returns a stream that's a slice of the iterator. With a single *stop* " +"argument, it will return the first *stop* elements. If you supply a " +"starting index, you'll get *stop-start* elements, and if you supply a value " +"for *step*, elements will be skipped accordingly. Unlike Python's string " +"and list slicing, you can't use negative values for *start*, *stop*, or " +"*step*. ::" +msgstr "" +":func:`itertools.islice(iter, [start], stop, [step]) ` " +"返回一个所输入的迭代器切片的数据流。如果只单独给定 *stop* 参数的话,它会返回从起始算起 *stop* 个数量的元素。如果你提供了起始下标 " +"*start*,你会得到 *stop-start* 个元素;如果你给定了 *step* 参数,数据流会跳过相应的元素。和 Python " +"里的字符串和列表切片不同,你不能在 *start*, *stop* 或者 *step* 这些参数中使用负数。::" + +#: ../../howto/functional.rst:801 +msgid "" +"itertools.islice(range(10), 8) =>\n" +" 0, 1, 2, 3, 4, 5, 6, 7\n" +"itertools.islice(range(10), 2, 8) =>\n" +" 2, 3, 4, 5, 6, 7\n" +"itertools.islice(range(10), 2, 8, 2) =>\n" +" 2, 4, 6" +msgstr "" +"itertools.islice(range(10), 8) =>\n" +" 0, 1, 2, 3, 4, 5, 6, 7\n" +"itertools.islice(range(10), 2, 8) =>\n" +" 2, 3, 4, 5, 6, 7\n" +"itertools.islice(range(10), 2, 8, 2) =>\n" +" 2, 4, 6" + +#: ../../howto/functional.rst:808 +msgid "" +":func:`itertools.tee(iter, [n]) ` replicates an iterator; it " +"returns *n* independent iterators that will all return the contents of the " +"source iterator. If you don't supply a value for *n*, the default is 2. " +"Replicating iterators requires saving some of the contents of the source " +"iterator, so this can consume significant memory if the iterator is large " +"and one of the new iterators is consumed more than the others. ::" +msgstr "" +":func:`itertools.tee(iter, [n]) ` 可以复制一个迭代器;它返回 *n* " +"个能够返回源迭代器内容的独立迭代器。如果你不提供参数 *n*,默认值为 " +"2。复制迭代器需要保存源迭代器的一部分内容,因此在源迭代器比较大且其中一个新迭代器比其他迭代器被消耗得更多的时候,会显著地占用内存。::" + +#: ../../howto/functional.rst:816 +msgid "" +"itertools.tee( itertools.count() ) =>\n" +" iterA, iterB\n" +"\n" +"where iterA ->\n" +" 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ...\n" +"\n" +"and iterB ->\n" +" 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ..." +msgstr "" +"itertools.tee( itertools.count() ) =>\n" +" iterA, iterB\n" +"\n" +"where iterA ->\n" +" 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ...\n" +"\n" +"and iterB ->\n" +" 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ..." + +#: ../../howto/functional.rst:827 +msgid "Calling functions on elements" +msgstr "对元素使用函数" + +#: ../../howto/functional.rst:829 +msgid "" +"The :mod:`operator` module contains a set of functions corresponding to " +"Python's operators. Some examples are :func:`operator.add(a, b) " +"` (adds two values), :func:`operator.ne(a, b) ` " +"(same as ``a != b``), and :func:`operator.attrgetter('id') " +"` (returns a callable that fetches the ``.id`` " +"attribute)." +msgstr "" +":mod:`operator` 模块包含一组对应于 Python 操作符的函数。 比如 :func:`operator.add(a, b) " +"` (两数相加),:func:`operator.ne(a, b) ` (与 ``a != " +"b`` 相同),以及 :func:`operator.attrgetter('id') ` (返回获取 " +"``.id`` 属性的可调用对象)。" + +#: ../../howto/functional.rst:835 +msgid "" +":func:`itertools.starmap(func, iter) ` assumes that the " +"iterable will return a stream of tuples, and calls *func* using these tuples" +" as the arguments::" +msgstr "" +":func:`itertools.starmap(func, iter) ` " +"假定可迭代对象能够返回一个元组的流,并且利用这些元组作为参数来调用 *func*::" + +#: ../../howto/functional.rst:839 +msgid "" +"itertools.starmap(os.path.join,\n" +" [('/bin', 'python'), ('/usr', 'bin', 'java'),\n" +" ('/usr', 'bin', 'perl'), ('/usr', 'bin', 'ruby')])\n" +"=>\n" +" /bin/python, /usr/bin/java, /usr/bin/perl, /usr/bin/ruby" +msgstr "" +"itertools.starmap(os.path.join,\n" +" [('/bin', 'python'), ('/usr', 'bin', 'java'),\n" +" ('/usr', 'bin', 'perl'), ('/usr', 'bin', 'ruby')])\n" +"=>\n" +" /bin/python, /usr/bin/java, /usr/bin/perl, /usr/bin/ruby" + +#: ../../howto/functional.rst:847 +msgid "Selecting elements" +msgstr "选择元素" + +#: ../../howto/functional.rst:849 +msgid "" +"Another group of functions chooses a subset of an iterator's elements based " +"on a predicate." +msgstr "另外一系列函数根据谓词选取一个迭代器中元素的子集。" + +#: ../../howto/functional.rst:852 +msgid "" +":func:`itertools.filterfalse(predicate, iter) ` is " +"the opposite of :func:`filter`, returning all elements for which the " +"predicate returns false::" +msgstr "" +":func:`itertools.filterfalse(predicate, iter) ` 和 " +":func:`filter` 相反,返回所有让 predicate 返回 false 的元素::" + +#: ../../howto/functional.rst:856 +msgid "" +"itertools.filterfalse(is_even, itertools.count()) =>\n" +" 1, 3, 5, 7, 9, 11, 13, 15, ..." +msgstr "" +"itertools.filterfalse(is_even, itertools.count()) =>\n" +" 1, 3, 5, 7, 9, 11, 13, 15, ..." + +#: ../../howto/functional.rst:859 +msgid "" +":func:`itertools.takewhile(predicate, iter) ` returns " +"elements for as long as the predicate returns true. Once the predicate " +"returns false, the iterator will signal the end of its results. ::" +msgstr "" +":func:`itertools.takewhile(predicate, iter) ` 返回一直让 " +"predicate 返回 true 的元素。一旦 predicate 返回 false,迭代器就会发出终止结果的信号。::" + +#: ../../howto/functional.rst:863 +msgid "" +"def less_than_10(x):\n" +" return x < 10\n" +"\n" +"itertools.takewhile(less_than_10, itertools.count()) =>\n" +" 0, 1, 2, 3, 4, 5, 6, 7, 8, 9\n" +"\n" +"itertools.takewhile(is_even, itertools.count()) =>\n" +" 0" +msgstr "" +"def less_than_10(x):\n" +" return x < 10\n" +"\n" +"itertools.takewhile(less_than_10, itertools.count()) =>\n" +" 0, 1, 2, 3, 4, 5, 6, 7, 8, 9\n" +"\n" +"itertools.takewhile(is_even, itertools.count()) =>\n" +" 0" + +#: ../../howto/functional.rst:872 +msgid "" +":func:`itertools.dropwhile(predicate, iter) ` discards " +"elements while the predicate returns true, and then returns the rest of the " +"iterable's results. ::" +msgstr "" +":func:`itertools.dropwhile(predicate, iter) ` 在 " +"predicate 返回 true 的时候丢弃元素,并且返回可迭代对象的剩余结果。::" + +#: ../../howto/functional.rst:876 +msgid "" +"itertools.dropwhile(less_than_10, itertools.count()) =>\n" +" 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ...\n" +"\n" +"itertools.dropwhile(is_even, itertools.count()) =>\n" +" 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..." +msgstr "" +"itertools.dropwhile(less_than_10, itertools.count()) =>\n" +" 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ...\n" +"\n" +"itertools.dropwhile(is_even, itertools.count()) =>\n" +" 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..." + +#: ../../howto/functional.rst:882 +msgid "" +":func:`itertools.compress(data, selectors) ` takes two " +"iterators and returns only those elements of *data* for which the " +"corresponding element of *selectors* is true, stopping whenever either one " +"is exhausted::" +msgstr "" +":func:`itertools.compress(data, selectors) ` " +"接受两个迭代器,然后返回 *data* 中使相应的 *selectors* 中的元素为真的元素;它会在任一个迭代器耗尽的时候停止::" + +#: ../../howto/functional.rst:886 +msgid "" +"itertools.compress([1, 2, 3, 4, 5], [True, True, False, False, True]) =>\n" +" 1, 2, 5" +msgstr "" +"itertools.compress([1, 2, 3, 4, 5], [True, True, False, False, True]) =>\n" +" 1, 2, 5" + +#: ../../howto/functional.rst:891 +msgid "Combinatoric functions" +msgstr "组合函数" + +#: ../../howto/functional.rst:893 +msgid "" +"The :func:`itertools.combinations(iterable, r) ` " +"returns an iterator giving all possible *r*-tuple combinations of the " +"elements contained in *iterable*. ::" +msgstr "" +":func:`itertools.combinations(iterable, r) ` " +"返回一个迭代器,它能给出输入迭代器中所包含的元素的所有可能的 *r* 元元组的组合。::" + +#: ../../howto/functional.rst:897 +msgid "" +"itertools.combinations([1, 2, 3, 4, 5], 2) =>\n" +" (1, 2), (1, 3), (1, 4), (1, 5),\n" +" (2, 3), (2, 4), (2, 5),\n" +" (3, 4), (3, 5),\n" +" (4, 5)\n" +"\n" +"itertools.combinations([1, 2, 3, 4, 5], 3) =>\n" +" (1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 3, 4), (1, 3, 5), (1, 4, 5),\n" +" (2, 3, 4), (2, 3, 5), (2, 4, 5),\n" +" (3, 4, 5)" +msgstr "" +"itertools.combinations([1, 2, 3, 4, 5], 2) =>\n" +" (1, 2), (1, 3), (1, 4), (1, 5),\n" +" (2, 3), (2, 4), (2, 5),\n" +" (3, 4), (3, 5),\n" +" (4, 5)\n" +"\n" +"itertools.combinations([1, 2, 3, 4, 5], 3) =>\n" +" (1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 3, 4), (1, 3, 5), (1, 4, 5),\n" +" (2, 3, 4), (2, 3, 5), (2, 4, 5),\n" +" (3, 4, 5)" + +#: ../../howto/functional.rst:908 +msgid "" +"The elements within each tuple remain in the same order as *iterable* " +"returned them. For example, the number 1 is always before 2, 3, 4, or 5 in " +"the examples above. A similar function, " +":func:`itertools.permutations(iterable, r=None) `, " +"removes this constraint on the order, returning all possible arrangements of" +" length *r*::" +msgstr "" +"每个元组中的元素保持着 *可迭代对象* 返回他们的顺序。例如,在上面的例子中数字 1 总是会在 2, 3, 4 或 5 " +"前面。一个类似的函数,:func:`itertools.permutations(iterable, r=None) " +"`,取消了保持顺序的限制,返回所有可能的长度为 *r* 的排列::" + +#: ../../howto/functional.rst:915 +msgid "" +"itertools.permutations([1, 2, 3, 4, 5], 2) =>\n" +" (1, 2), (1, 3), (1, 4), (1, 5),\n" +" (2, 1), (2, 3), (2, 4), (2, 5),\n" +" (3, 1), (3, 2), (3, 4), (3, 5),\n" +" (4, 1), (4, 2), (4, 3), (4, 5),\n" +" (5, 1), (5, 2), (5, 3), (5, 4)\n" +"\n" +"itertools.permutations([1, 2, 3, 4, 5]) =>\n" +" (1, 2, 3, 4, 5), (1, 2, 3, 5, 4), (1, 2, 4, 3, 5),\n" +" ...\n" +" (5, 4, 3, 2, 1)" +msgstr "" +"itertools.permutations([1, 2, 3, 4, 5], 2) =>\n" +" (1, 2), (1, 3), (1, 4), (1, 5),\n" +" (2, 1), (2, 3), (2, 4), (2, 5),\n" +" (3, 1), (3, 2), (3, 4), (3, 5),\n" +" (4, 1), (4, 2), (4, 3), (4, 5),\n" +" (5, 1), (5, 2), (5, 3), (5, 4)\n" +"\n" +"itertools.permutations([1, 2, 3, 4, 5]) =>\n" +" (1, 2, 3, 4, 5), (1, 2, 3, 5, 4), (1, 2, 4, 3, 5),\n" +" ...\n" +" (5, 4, 3, 2, 1)" + +#: ../../howto/functional.rst:927 +msgid "" +"If you don't supply a value for *r* the length of the iterable is used, " +"meaning that all the elements are permuted." +msgstr "如果你不提供 *r* 参数的值,它会使用可迭代对象的长度,也就是说会排列所有的元素。" + +#: ../../howto/functional.rst:930 +msgid "" +"Note that these functions produce all of the possible combinations by " +"position and don't require that the contents of *iterable* are unique::" +msgstr "注意这些函数会输出所有可能的位置组合,并不要求 *可迭代对象* 的内容不重复::" + +#: ../../howto/functional.rst:933 +msgid "" +"itertools.permutations('aba', 3) =>\n" +" ('a', 'b', 'a'), ('a', 'a', 'b'), ('b', 'a', 'a'),\n" +" ('b', 'a', 'a'), ('a', 'a', 'b'), ('a', 'b', 'a')" +msgstr "" +"itertools.permutations('aba', 3) =>\n" +" ('a', 'b', 'a'), ('a', 'a', 'b'), ('b', 'a', 'a'),\n" +" ('b', 'a', 'a'), ('a', 'a', 'b'), ('a', 'b', 'a')" + +#: ../../howto/functional.rst:937 +msgid "" +"The identical tuple ``('a', 'a', 'b')`` occurs twice, but the two 'a' " +"strings came from different positions." +msgstr "同一个元组 ``('a', 'a', 'b')`` 出现了两次,但是两个 'a' 字符来自不同的位置。" + +#: ../../howto/functional.rst:940 +msgid "" +"The :func:`itertools.combinations_with_replacement(iterable, r) " +"` function relaxes a different " +"constraint: elements can be repeated within a single tuple. Conceptually an" +" element is selected for the first position of each tuple and then is " +"replaced before the second element is selected. ::" +msgstr "" +":func:`itertools.combinations_with_replacement(iterable, r) " +"` " +"函数放松了一个不同的限制:元组中的元素可以重复。从概念讲,为每个元组第一个位置选取一个元素,然后在选择第二个元素前替换掉它。::" + +#: ../../howto/functional.rst:946 +msgid "" +"itertools.combinations_with_replacement([1, 2, 3, 4, 5], 2) =>\n" +" (1, 1), (1, 2), (1, 3), (1, 4), (1, 5),\n" +" (2, 2), (2, 3), (2, 4), (2, 5),\n" +" (3, 3), (3, 4), (3, 5),\n" +" (4, 4), (4, 5),\n" +" (5, 5)" +msgstr "" +"itertools.combinations_with_replacement([1, 2, 3, 4, 5], 2) =>\n" +" (1, 1), (1, 2), (1, 3), (1, 4), (1, 5),\n" +" (2, 2), (2, 3), (2, 4), (2, 5),\n" +" (3, 3), (3, 4), (3, 5),\n" +" (4, 4), (4, 5),\n" +" (5, 5)" + +#: ../../howto/functional.rst:955 +msgid "Grouping elements" +msgstr "为元素分组" + +#: ../../howto/functional.rst:957 +msgid "" +"The last function I'll discuss, :func:`itertools.groupby(iter, " +"key_func=None) `, is the most complicated. " +"``key_func(elem)`` is a function that can compute a key value for each " +"element returned by the iterable. If you don't supply a key function, the " +"key is simply each element itself." +msgstr "" +"我要讨论的最后一个函数,:func:`itertools.groupby(iter,key_func=None) " +"`,是最复杂的函数。``key_func(elem)`` 是一个可以对迭代器返回的每个元素计算键值的函数。 " +"如果你不提供这个键值函数,它就会简化成每个元素自身。" + +#: ../../howto/functional.rst:962 +msgid "" +":func:`~itertools.groupby` collects all the consecutive elements from the " +"underlying iterable that have the same key value, and returns a stream of " +"2-tuples containing a key value and an iterator for the elements with that " +"key." +msgstr "" +":func:`~itertools.groupby` 从所依据的可迭代对象中收集所有具有相同键值的连续元素,然后返回一个长度为 2 " +"的元组的数据流,每个元组包含键值以及对应这个键值的元素所组成的迭代器。" + +#: ../../howto/functional.rst:968 +msgid "" +"city_list = [('Decatur', 'AL'), ('Huntsville', 'AL'), ('Selma', 'AL'),\n" +" ('Anchorage', 'AK'), ('Nome', 'AK'),\n" +" ('Flagstaff', 'AZ'), ('Phoenix', 'AZ'), ('Tucson', 'AZ'),\n" +" ...\n" +" ]\n" +"\n" +"def get_state(city_state):\n" +" return city_state[1]\n" +"\n" +"itertools.groupby(city_list, get_state) =>\n" +" ('AL', iterator-1),\n" +" ('AK', iterator-2),\n" +" ('AZ', iterator-3), ...\n" +"\n" +"where\n" +"iterator-1 =>\n" +" ('Decatur', 'AL'), ('Huntsville', 'AL'), ('Selma', 'AL')\n" +"iterator-2 =>\n" +" ('Anchorage', 'AK'), ('Nome', 'AK')\n" +"iterator-3 =>\n" +" ('Flagstaff', 'AZ'), ('Phoenix', 'AZ'), ('Tucson', 'AZ')" +msgstr "" +"city_list = [('Decatur', 'AL'), ('Huntsville', 'AL'), ('Selma', 'AL'),\n" +" ('Anchorage', 'AK'), ('Nome', 'AK'),\n" +" ('Flagstaff', 'AZ'), ('Phoenix', 'AZ'), ('Tucson', 'AZ'),\n" +" ...\n" +" ]\n" +"\n" +"def get_state(city_state):\n" +" return city_state[1]\n" +"\n" +"itertools.groupby(city_list, get_state) =>\n" +" ('AL', iterator-1),\n" +" ('AK', iterator-2),\n" +" ('AZ', iterator-3), ...\n" +"\n" +"where\n" +"iterator-1 =>\n" +" ('Decatur', 'AL'), ('Huntsville', 'AL'), ('Selma', 'AL')\n" +"iterator-2 =>\n" +" ('Anchorage', 'AK'), ('Nome', 'AK')\n" +"iterator-3 =>\n" +" ('Flagstaff', 'AZ'), ('Phoenix', 'AZ'), ('Tucson', 'AZ')" + +#: ../../howto/functional.rst:990 +msgid "" +":func:`~itertools.groupby` assumes that the underlying iterable's contents " +"will already be sorted based on the key. Note that the returned iterators " +"also use the underlying iterable, so you have to consume the results of " +"iterator-1 before requesting iterator-2 and its corresponding key." +msgstr "" +":func:`~itertools.groupby` " +"假定了所依据的可迭代对象的内容已经根据键值排序。注意,返回的迭代器也会使用所依据的可迭代对象,所以在请求迭代器 2 和相应的键之前你必须先消耗迭代器 1" +" 的结果。" + +#: ../../howto/functional.rst:997 +msgid "The functools module" +msgstr "functools 模块" + +#: ../../howto/functional.rst:999 +msgid "" +"The :mod:`functools` module contains some higher-order functions. A " +"**higher-order function** takes one or more functions as input and returns a" +" new function. The most useful tool in this module is the " +":func:`functools.partial` function." +msgstr "" +":mod:`functools` 模块包含一些高阶函数。 **高阶函数** 接受一个或多个函数作为输入并返回一个新的函数。这个模块中最有用的工具是 " +":func:`functools.partial` 函数。" + +#: ../../howto/functional.rst:1004 +msgid "" +"For programs written in a functional style, you'll sometimes want to " +"construct variants of existing functions that have some of the parameters " +"filled in. Consider a Python function ``f(a, b, c)``; you may wish to create" +" a new function ``g(b, c)`` that's equivalent to ``f(1, b, c)``; you're " +"filling in a value for one of ``f()``'s parameters. This is called " +"\"partial function application\"." +msgstr "" +"对于用函数式风格编写的程序,有时你会希望通过给定部分参数,将已有的函数构造成新的函数。考虑一个 Python 函数 ``f(a, b, " +"c)``;你希望创建一个和 ``f(1, b, c)`` 等价的新函数 ``g(b, c)``;也就是说你给定了 ``f()`` " +"的一个参数的值。这就是所谓的“部分函数应用”。" + +#: ../../howto/functional.rst:1010 +msgid "" +"The constructor for :func:`~functools.partial` takes the arguments " +"``(function, arg1, arg2, ..., kwarg1=value1, kwarg2=value2)``. The " +"resulting object is callable, so you can just call it to invoke ``function``" +" with the filled-in arguments." +msgstr "" +":func:`~functools.partial` 接受参数 ``(function, arg1, arg2, ..., kwarg1=value1," +" kwarg2=value2)``。它会返回一个可调用的对象,所以你能够直接调用这个结果以使用给定参数的 ``function``。" + +#: ../../howto/functional.rst:1015 +msgid "Here's a small but realistic example::" +msgstr "这里有一个很小但很现实的例子::" + +#: ../../howto/functional.rst:1017 +msgid "" +"import functools\n" +"\n" +"def log(message, subsystem):\n" +" \"\"\"Write the contents of 'message' to the specified subsystem.\"\"\"\n" +" print('%s: %s' % (subsystem, message))\n" +" ...\n" +"\n" +"server_log = functools.partial(log, subsystem='server')\n" +"server_log('Unable to open socket')" +msgstr "" +"import functools\n" +"\n" +"def log(message, subsystem):\n" +" \"\"\"将 'message' 的内容写到指定的子系统。\"\"\"\n" +" print('%s: %s' % (subsystem, message))\n" +" ...\n" +"\n" +"server_log = functools.partial(log, subsystem='server')\n" +"server_log('Unable to open socket')" + +#: ../../howto/functional.rst:1027 +msgid "" +":func:`functools.reduce(func, iter, [initial_value]) ` " +"cumulatively performs an operation on all the iterable's elements and, " +"therefore, can't be applied to infinite iterables. *func* must be a function" +" that takes two elements and returns a single value. " +":func:`functools.reduce` takes the first two elements A and B returned by " +"the iterator and calculates ``func(A, B)``. It then requests the third " +"element, C, calculates ``func(func(A, B), C)``, combines this result with " +"the fourth element returned, and continues until the iterable is exhausted." +" If the iterable returns no values at all, a :exc:`TypeError` exception is " +"raised. If the initial value is supplied, it's used as a starting point and" +" ``func(initial_value, A)`` is the first calculation. ::" +msgstr "" +":func:`functools.reduce(func, iter, [initial_value]) ` " +"持续地在可迭代对象的所有元素上执行操作,因此它不能够用在无限的可迭代对象上。*func* " +"必须是一个接受两个元素并返回一个值的函数。:func:`functools.reduce` 接受迭代器返回的前两个元素 A 和 B 并计算 " +"``func(A, B)``。然后它会请求第三个元素,C,计算 ``func(func(A, B), " +"C)``,然后把这个结果再和第四个元素组合并返回,如此继续下去直到消耗整个可迭代对象。如果输入的可迭代对象完全不返回任何值,:exc:`TypeError`" +" 异常就会抛出。如果提供了初值 (initial value),它会被用作起始值,也就是先计算 ``func(initial_value, A)`` " +"。::" + +#: ../../howto/functional.rst:1039 +msgid "" +">>> import operator, functools\n" +">>> functools.reduce(operator.concat, ['A', 'BB', 'C'])\n" +"'ABBC'\n" +">>> functools.reduce(operator.concat, [])\n" +"Traceback (most recent call last):\n" +" ...\n" +"TypeError: reduce() of empty iterable with no initial value\n" +">>> functools.reduce(operator.mul, [1, 2, 3], 1)\n" +"6\n" +">>> functools.reduce(operator.mul, [], 1)\n" +"1" +msgstr "" + +#: ../../howto/functional.rst:1051 +msgid "" +"If you use :func:`operator.add` with :func:`functools.reduce`, you'll add up" +" all the elements of the iterable. This case is so common that there's a " +"special built-in called :func:`sum` to compute it:" +msgstr "" +"如果你在 :func:`functools.reduce` 中使用 " +":func:`operator.add`,你就会把可迭代对象中的所有元素加起来。这种情况非常常见,所以 Python 有一个特殊的内置函数 " +":func:`sum`:" + +#: ../../howto/functional.rst:1063 +msgid "" +"For many uses of :func:`functools.reduce`, though, it can be clearer to just" +" write the obvious :keyword:`for` loop::" +msgstr "不过,对于很多使用 :func:`functools.reduce` 的情形,使用明显的 :keyword:`for` 循环会更清晰::" + +#: ../../howto/functional.rst:1066 +msgid "" +"import functools\n" +"# Instead of:\n" +"product = functools.reduce(operator.mul, [1, 2, 3], 1)\n" +"\n" +"# You can write:\n" +"product = 1\n" +"for i in [1, 2, 3]:\n" +" product *= i" +msgstr "" +"import functools\n" +"# 作为以下语句的替代:\n" +"product = functools.reduce(operator.mul, [1, 2, 3], 1)\n" +"\n" +"# 你可以这样写:\n" +"product = 1\n" +"for i in [1, 2, 3]:\n" +" product *= i" + +#: ../../howto/functional.rst:1075 +msgid "" +"A related function is :func:`itertools.accumulate(iterable, " +"func=operator.add) `. It performs the same " +"calculation, but instead of returning only the final result, " +":func:`~itertools.accumulate` returns an iterator that also yields each " +"partial result::" +msgstr "" +"一个相关的函数是 :func:`itertools.accumulate(iterable, func=operator.add) " +"`。它执行同样的计算,但 :func:`~itertools.accumulate` " +"不是仅仅返回最终结果,而是返回一个会产生每个部分结果的迭代器::" + +#: ../../howto/functional.rst:1080 +msgid "" +"itertools.accumulate([1, 2, 3, 4, 5]) =>\n" +" 1, 3, 6, 10, 15\n" +"\n" +"itertools.accumulate([1, 2, 3, 4, 5], operator.mul) =>\n" +" 1, 2, 6, 24, 120" +msgstr "" +"itertools.accumulate([1, 2, 3, 4, 5]) =>\n" +" 1, 3, 6, 10, 15\n" +"\n" +"itertools.accumulate([1, 2, 3, 4, 5], operator.mul) =>\n" +" 1, 2, 6, 24, 120" + +#: ../../howto/functional.rst:1088 +msgid "The operator module" +msgstr "operator 模块" + +#: ../../howto/functional.rst:1090 +msgid "" +"The :mod:`operator` module was mentioned earlier. It contains a set of " +"functions corresponding to Python's operators. These functions are often " +"useful in functional-style code because they save you from writing trivial " +"functions that perform a single operation." +msgstr "" +"前面已经提到了 :mod:`operator` 模块。它包含一系列对应于 Python " +"操作符的函数。在函数式风格的代码中,这些函数通常很有用,可以帮你省下不少时间,避免写一些琐碎的仅仅执行一个简单操作的函数。" + +#: ../../howto/functional.rst:1095 +msgid "Some of the functions in this module are:" +msgstr "这个模块里的一些函数:" + +#: ../../howto/functional.rst:1097 +msgid "" +"Math operations: ``add()``, ``sub()``, ``mul()``, ``floordiv()``, ``abs()``," +" ..." +msgstr "数学运算: ``add()``,``sub()``,``mul()``,``floordiv()``,``abs()``, ..." + +#: ../../howto/functional.rst:1098 +msgid "Logical operations: ``not_()``, ``truth()``." +msgstr "逻辑运算: ``not_()``,``truth()``。" + +#: ../../howto/functional.rst:1099 +msgid "Bitwise operations: ``and_()``, ``or_()``, ``invert()``." +msgstr "位运算: ``and_()``,``or_()``,``invert()``。" + +#: ../../howto/functional.rst:1100 +msgid "" +"Comparisons: ``eq()``, ``ne()``, ``lt()``, ``le()``, ``gt()``, and ``ge()``." +msgstr "比较: ``eq()``,``ne()``,``lt()``,``le()``,``gt()``,和 ``ge()``。" + +#: ../../howto/functional.rst:1101 +msgid "Object identity: ``is_()``, ``is_not()``." +msgstr "对象标识: ``is_()``,``is_not()``。" + +#: ../../howto/functional.rst:1103 +msgid "Consult the operator module's documentation for a complete list." +msgstr "全部函数列表可以参考 operator 模块的文档。" + +#: ../../howto/functional.rst:1107 +msgid "Small functions and the lambda expression" +msgstr "小函数和 lambda 表达式" + +#: ../../howto/functional.rst:1109 +msgid "" +"When writing functional-style programs, you'll often need little functions " +"that act as predicates or that combine elements in some way." +msgstr "编写函数式风格程序时,你会经常需要很小的函数,作为谓词函数或者以某种方式来组合元素。" + +#: ../../howto/functional.rst:1112 +msgid "" +"If there's a Python built-in or a module function that's suitable, you don't" +" need to define a new function at all::" +msgstr "如果有合适的 Python 内置的或者其他模块中的函数,你就完全不需要定义新的函数::" + +#: ../../howto/functional.rst:1115 +msgid "" +"stripped_lines = [line.strip() for line in lines]\n" +"existing_files = filter(os.path.exists, file_list)" +msgstr "" +"stripped_lines = [line.strip() for line in lines]\n" +"existing_files = filter(os.path.exists, file_list)" + +#: ../../howto/functional.rst:1118 +msgid "" +"If the function you need doesn't exist, you need to write it. One way to " +"write small functions is to use the :keyword:`lambda` expression. " +"``lambda`` takes a number of parameters and an expression combining these " +"parameters, and creates an anonymous function that returns the value of the " +"expression::" +msgstr "" +"如果不存在你需要的函数,你就必须自己编写。一个编写小函数的方式是使用 :keyword:`lambda` 表达式。``lambda`` " +"接受一组参数以及组合这些参数的表达式,它会创建一个返回表达式值的匿名函数::" + +#: ../../howto/functional.rst:1123 +msgid "" +"adder = lambda x, y: x+y\n" +"\n" +"print_assign = lambda name, value: name + '=' + str(value)" +msgstr "" +"adder = lambda x, y: x+y\n" +"\n" +"print_assign = lambda name, value: name + '=' + str(value)" + +#: ../../howto/functional.rst:1127 +msgid "" +"An alternative is to just use the ``def`` statement and define a function in" +" the usual way::" +msgstr "另一种替代方案就是通常的使用 ``def`` 语句来定义函数::" + +#: ../../howto/functional.rst:1130 +msgid "" +"def adder(x, y):\n" +" return x + y\n" +"\n" +"def print_assign(name, value):\n" +" return name + '=' + str(value)" +msgstr "" +"def adder(x, y):\n" +" return x + y\n" +"\n" +"def print_assign(name, value):\n" +" return name + '=' + str(value)" + +#: ../../howto/functional.rst:1136 +msgid "" +"Which alternative is preferable? That's a style question; my usual course " +"is to avoid using ``lambda``." +msgstr "哪一种更受青睐呢?这是一个风格问题;我通常的做法是避免使用 ``lambda``。" + +#: ../../howto/functional.rst:1139 +msgid "" +"One reason for my preference is that ``lambda`` is quite limited in the " +"functions it can define. The result has to be computable as a single " +"expression, which means you can't have multiway ``if... elif... else`` " +"comparisons or ``try... except`` statements. If you try to do too much in a" +" ``lambda`` statement, you'll end up with an overly complicated expression " +"that's hard to read. Quick, what's the following code doing? ::" +msgstr "" +"我这么偏好的一个原因是,``lambda`` 能够定义的函数非常受限。函数的结果必须能够作为单独的表达式来计算,这意味着你不能使用多路 ``if... " +"elif... else`` 比较,或者 ``try... except`` 语句。如果你尝试在 ``lambda`` " +"语句中做太多事情,你最终会把表达式过于复杂以至于难以阅读。你能快速的说出下面的代码做了什么事情吗?::" + +#: ../../howto/functional.rst:1146 +msgid "" +"import functools\n" +"total = functools.reduce(lambda a, b: (0, a[1] + b[1]), items)[1]" +msgstr "" +"import functools\n" +"total = functools.reduce(lambda a, b: (0, a[1] + b[1]), items)[1]" + +#: ../../howto/functional.rst:1149 +msgid "" +"You can figure it out, but it takes time to disentangle the expression to " +"figure out what's going on. Using a short nested ``def`` statements makes " +"things a little bit better::" +msgstr "你可以弄明白,不过要花上时间来理清表达式来搞清楚发生了什么。使用一个简短的嵌套的 ``def`` 语句可以让情况变得更好::" + +#: ../../howto/functional.rst:1153 +msgid "" +"import functools\n" +"def combine(a, b):\n" +" return 0, a[1] + b[1]\n" +"\n" +"total = functools.reduce(combine, items)[1]" +msgstr "" +"import functools\n" +"def combine(a, b):\n" +" return 0, a[1] + b[1]\n" +"\n" +"total = functools.reduce(combine, items)[1]" + +#: ../../howto/functional.rst:1159 +msgid "But it would be best of all if I had simply used a ``for`` loop::" +msgstr "如果我仅仅使用一个 ``for`` 循环会更好::" + +#: ../../howto/functional.rst:1161 +msgid "" +"total = 0\n" +"for a, b in items:\n" +" total += b" +msgstr "" +"total = 0\n" +"for a, b in items:\n" +" total += b" + +#: ../../howto/functional.rst:1165 +msgid "Or the :func:`sum` built-in and a generator expression::" +msgstr "或者使用内置的 :func:`sum` 和一个生成器表达式::" + +#: ../../howto/functional.rst:1167 +msgid "total = sum(b for a, b in items)" +msgstr "total = sum(b for a, b in items)" + +#: ../../howto/functional.rst:1169 +msgid "" +"Many uses of :func:`functools.reduce` are clearer when written as ``for`` " +"loops." +msgstr "许多使用 :func:`functools.reduce` 的情形可以更清晰地写成 ``for`` 循环的形式。" + +#: ../../howto/functional.rst:1171 +msgid "" +"Fredrik Lundh once suggested the following set of rules for refactoring uses" +" of ``lambda``:" +msgstr "Fredrik Lundh 曾经建议以下一组规则来重构 ``lambda`` 的使用:" + +#: ../../howto/functional.rst:1174 +msgid "Write a lambda function." +msgstr "写一个 lambda 函数。" + +#: ../../howto/functional.rst:1175 +msgid "Write a comment explaining what the heck that lambda does." +msgstr "写一句注释来说明这个 lambda 究竟干了什么。" + +#: ../../howto/functional.rst:1176 +msgid "" +"Study the comment for a while, and think of a name that captures the essence" +" of the comment." +msgstr "研究一会这个注释,然后想出一个抓住注释本质的名字。" + +#: ../../howto/functional.rst:1178 +msgid "Convert the lambda to a def statement, using that name." +msgstr "用这个名字,把这个 lambda 改写成 def 语句。" + +#: ../../howto/functional.rst:1179 +msgid "Remove the comment." +msgstr "把注释去掉。" + +#: ../../howto/functional.rst:1181 +msgid "" +"I really like these rules, but you're free to disagree about whether this " +"lambda-free style is better." +msgstr "我非常喜欢这些规则,不过你完全有权利争辩这种消除 lambda 的风格是不是更好。" + +#: ../../howto/functional.rst:1186 +msgid "Revision History and Acknowledgements" +msgstr "修订记录和致谢" + +#: ../../howto/functional.rst:1188 +msgid "" +"The author would like to thank the following people for offering " +"suggestions, corrections and assistance with various drafts of this article:" +" Ian Bicking, Nick Coghlan, Nick Efford, Raymond Hettinger, Jim Jewett, Mike" +" Krell, Leandro Lameiro, Jussi Salmela, Collin Winter, Blake Winton." +msgstr "" +"作者要感谢以下人员对本文各种草稿给予的建议,更正和协助:Ian Bicking,Nick Coghlan, Nick Efford, Raymond " +"Hettinger, Jim Jewett, Mike Krell,Leandro Lameiro, Jussi Salmela, Collin " +"Winter, Blake Winton。" + +#: ../../howto/functional.rst:1193 +msgid "Version 0.1: posted June 30 2006." +msgstr "0.1 版:2006 年 6 月 30 日发布。" + +#: ../../howto/functional.rst:1195 +msgid "Version 0.11: posted July 1 2006. Typo fixes." +msgstr "0.11 版:2006 年 7 月 1 日发布。修正拼写错误。" + +#: ../../howto/functional.rst:1197 +msgid "" +"Version 0.2: posted July 10 2006. Merged genexp and listcomp sections into " +"one. Typo fixes." +msgstr "0.2 版:2006 年 7 月 10 日发布。将 genexp 与 listcomp 两节合二为一。修正拼写错误。" + +#: ../../howto/functional.rst:1200 +msgid "" +"Version 0.21: Added more references suggested on the tutor mailing list." +msgstr "0.21 版:加入了 tutor 邮件列表中建议的更多参考文件。" + +#: ../../howto/functional.rst:1202 +msgid "" +"Version 0.30: Adds a section on the ``functional`` module written by Collin " +"Winter; adds short section on the operator module; a few other edits." +msgstr "" +"0.30 版:添加了有关 ``functional`` 模块的小节,由 Collin Winter 撰写;添加了有关 operator " +"模块的简短小节;其他少量修改。" + +#: ../../howto/functional.rst:1207 +msgid "References" +msgstr "参考文献" + +#: ../../howto/functional.rst:1210 +msgid "General" +msgstr "通用文献" + +#: ../../howto/functional.rst:1212 +msgid "" +"**Structure and Interpretation of Computer Programs**, by Harold Abelson and" +" Gerald Jay Sussman with Julie Sussman. The book can be found at " +"https://mitpress.mit.edu/sicp. In this classic textbook of computer " +"science, chapters 2 and 3 discuss the use of sequences and streams to " +"organize the data flow inside a program. The book uses Scheme for its " +"examples, but many of the design approaches described in these chapters are " +"applicable to functional-style Python code." +msgstr "" +"**Structure and Interpretation of Computer Programs**, Harold Abelson 和 " +"Gerald Jay Sussman 与 Julie Sussman 著。该书可在 https://mitpress.mit.edu/sicp 获取。 " +"在这部计算机科学的经典教科书中,第 2 和第 3 章讨论了使用序列和流来组织程序内部的数据传递。书中的示例使用了 Scheme " +"语言,但这些章节中介绍的许多设计理念同样适用于函数式风格的 Python 代码。" + +#: ../../howto/functional.rst:1220 +msgid "" +"https://defmacro.org/2006/06/19/fp.html: A general introduction to " +"functional programming that uses Java examples and has a lengthy historical " +"introduction." +msgstr "" +"https://defmacro.org/2006/06/19/fp.html: 一个使用 Java 示例并且具有详细的历史说明的函数式编程的总体介绍。" + +#: ../../howto/functional.rst:1223 +msgid "" +"https://en.wikipedia.org/wiki/Functional_programming: General Wikipedia " +"entry describing functional programming." +msgstr "" +"https://en.wikipedia.org/wiki/Functional_programming: 一般性的函数式编程的 Wikipedia " +"条目。" + +#: ../../howto/functional.rst:1226 +msgid "https://en.wikipedia.org/wiki/Coroutine: Entry for coroutines." +msgstr "https://en.wikipedia.org/wiki/Coroutine: 协程条目。" + +#: ../../howto/functional.rst:1228 +msgid "" +"https://en.wikipedia.org/wiki/Partial_application: Entry for the concept of " +"partial function application." +msgstr "https://en.wikipedia.org/wiki/Partial_application: 部分化函数应用相关概念的条目。" + +#: ../../howto/functional.rst:1230 +msgid "" +"https://en.wikipedia.org/wiki/Currying: Entry for the concept of currying." +msgstr "https://en.wikipedia.org/wiki/Currying: 函数柯里化条目。" + +#: ../../howto/functional.rst:1233 +msgid "Python-specific" +msgstr "Python 相关" + +#: ../../howto/functional.rst:1235 +msgid "" +"https://gnosis.cx/TPiP/: The first chapter of David Mertz's book :title-" +"reference:`Text Processing in Python` discusses functional programming for " +"text processing, in the section titled \"Utilizing Higher-Order Functions in" +" Text Processing\"." +msgstr "" +"https://gnosis.cx/TPiP/: David Mertz 书中的第一章 :title-reference:`Text " +"Processing in Python` 中标题为 \"Utilizing Higher-Order Functions in Text " +"Processing\" 的小节讨论了针对文本处理的函数式编程。" + +#: ../../howto/functional.rst:1240 +msgid "" +"Mertz also wrote a 3-part series of articles on functional programming for " +"IBM's DeveloperWorks site; see `part 1 " +"`__, `part 2 " +"`__, and `part 3 " +"`__," +msgstr "" +"Mertz 还在 IBM 的 DeveloperWorks 站点上针对函数式编程撰写了一系列共 3 篇文章;参见 `part 1 " +"`__, `part 2 " +"`__ 和 `part 3 " +"`__," + +#: ../../howto/functional.rst:1248 +msgid "Python documentation" +msgstr "Python 文档" + +#: ../../howto/functional.rst:1250 +msgid "Documentation for the :mod:`itertools` module." +msgstr ":mod:`itertools` 模块文档。" + +#: ../../howto/functional.rst:1252 +msgid "Documentation for the :mod:`functools` module." +msgstr ":mod:`functools` 模块文档。" + +#: ../../howto/functional.rst:1254 +msgid "Documentation for the :mod:`operator` module." +msgstr ":mod:`operator` 模块文档。" + +#: ../../howto/functional.rst:1256 +msgid ":pep:`289`: \"Generator Expressions\"" +msgstr ":pep:`289`: \"Generator Expressions\"" + +#: ../../howto/functional.rst:1258 +msgid "" +":pep:`342`: \"Coroutines via Enhanced Generators\" describes the new " +"generator features in Python 2.5." +msgstr "" +":pep:`342`: \"Coroutines via Enhanced Generators\" 描述了 Python 2.5 中新的生成器特性。" diff --git a/howto/gdb_helpers.po b/howto/gdb_helpers.po new file mode 100644 index 0000000000..24e6a63253 --- /dev/null +++ b/howto/gdb_helpers.po @@ -0,0 +1,900 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:00+0000\n" +"Last-Translator: 99 , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../howto/gdb_helpers.rst:5 +msgid "Debugging C API extensions and CPython Internals with GDB" +msgstr "使用 GDB 调试 C API 扩展和 CPython 内部代码" + +#: ../../howto/gdb_helpers.rst:9 +msgid "" +"This document explains how the Python GDB extension, ``python-gdb.py``, can " +"be used with the GDB debugger to debug CPython extensions and the CPython " +"interpreter itself." +msgstr "" +"本文档介绍了如何将 Python GDB 扩展 ``python-gdb.py`` 与 GDB 调试器一起使用以调试 CPython 扩展以及 " +"CPython 解释器本身。" + +#: ../../howto/gdb_helpers.rst:13 +msgid "" +"When debugging low-level problems such as crashes or deadlocks, a low-level " +"debugger, such as GDB, is useful to diagnose and correct the issue. By " +"default, GDB (or any of its front-ends) doesn't support high-level " +"information specific to the CPython interpreter." +msgstr "" +"当调试低层级问题如崩溃或死锁时,低层级的调试器如 GDB 适合被用来诊断和修正错误。在默认情况下,GDB(或其任一种前端)并不支持 CPython " +"解释器专属的高层级信息。" + +#: ../../howto/gdb_helpers.rst:18 +msgid "" +"The ``python-gdb.py`` extension adds CPython interpreter information to GDB." +" The extension helps introspect the stack of currently executing Python " +"functions. Given a Python object represented by a :c:expr:`PyObject *` " +"pointer, the extension surfaces the type and value of the object." +msgstr "" +"``python-gdb.py`` 扩展可向 GDB 添加 CPython 解释器信息。该扩展能协助对当前执行的 Python 函数栈进行内省。 " +"当给定一个由 :c:expr:`PyObject *` 指针代表的 Python 对象时,该扩展将展示对象的类型和值。" + +#: ../../howto/gdb_helpers.rst:23 +msgid "" +"Developers who are working on CPython extensions or tinkering with parts of " +"CPython that are written in C can use this document to learn how to use the " +"``python-gdb.py`` extension with GDB." +msgstr "" +"开发 CPython 扩展或处理 CPython 中用 C 语言编写的部分的开发人员可以通过本文档学习如何将 ``python-gdb.py`` 扩展与" +" GDB 一起使用。" + +#: ../../howto/gdb_helpers.rst:29 +msgid "" +"This document assumes that you are familiar with the basics of GDB and the " +"CPython C API. It consolidates guidance from the `devguide " +"`_ and the `Python wiki " +"`_." +msgstr "" +"本文档假定你已熟悉 GDB 和 CPython C API 的基础知识。它对来自 `devguide " +"`_ 和 `Python wiki " +"`_ 的内容进行了整合。" + +#: ../../howto/gdb_helpers.rst:36 +msgid "Prerequisites" +msgstr "前提条件" + +#: ../../howto/gdb_helpers.rst:38 +msgid "You need to have:" +msgstr "你需要有:" + +#: ../../howto/gdb_helpers.rst:40 +msgid "" +"GDB 7 or later. (For earlier versions of GDB, see ``Misc/gdbinit`` in the " +"sources of Python 3.11 or earlier.)" +msgstr "" +"GDB 7 或更高的版本。 (对于较低版本的 GDB,请参阅 Python 3.11 或更低版本源代码中的 ``Misc/gdbinit``。)" + +#: ../../howto/gdb_helpers.rst:42 +msgid "" +"GDB-compatible debugging information for Python and any extension you are " +"debugging." +msgstr "针对 Python 和你正在调试的任何扩展的 GDB 兼容调试信息。" + +#: ../../howto/gdb_helpers.rst:44 +msgid "The ``python-gdb.py`` extension." +msgstr "``python-gdb.py`` 扩展。" + +#: ../../howto/gdb_helpers.rst:46 +msgid "" +"The extension is built with Python, but might be distributed separately or " +"not at all. Below, we include tips for a few common systems as examples. " +"Note that even if the instructions match your system, they might be " +"outdated." +msgstr "" +"此扩展与 Python 一起构建,但可能单独发布或根本不发布。下面,我们将以几个常见系统为例进行说明。 " +"请注意即使这些说明与你的系统相匹配,它们也可能已经过时。" + +#: ../../howto/gdb_helpers.rst:52 +msgid "Setup with Python built from source" +msgstr "使用从源代码构建的 Python 进行设置" + +#: ../../howto/gdb_helpers.rst:54 +msgid "" +"When you build CPython from source, debugging information should be " +"available, and the build should add a ``python-gdb.py`` file to the root " +"directory of your repository." +msgstr "" +"当你从源代码构建 CPython 时,调试信息应当是可用的,并且构建应当在你的代码库根目录中添加一个 ``python-gdb.py`` 文件。" + +#: ../../howto/gdb_helpers.rst:58 +msgid "" +"To activate support, you must add the directory containing ``python-gdb.py``" +" to GDB's \"auto-load-safe-path\". If you haven't done this, recent versions" +" of GDB will print out a warning with instructions on how to do this." +msgstr "" +"要激活支持,你必须将包含 ``python-gdb.py`` 的目录添加到 GDB 的 \"auto-load-safe-path\" " +"中。如果你没有这样做,较新版本的 GDB 会打印一个警告来说明如何执行此操作。" + +#: ../../howto/gdb_helpers.rst:65 +msgid "" +"If you do not see instructions for your version of GDB, put this in your " +"configuration file (``~/.gdbinit`` or ``~/.config/gdb/gdbinit``)::" +msgstr "" +"如果你没有看到针对你的 GDB 版本的说明,请将以下内容放到你的配置文件中 (``~/.gdbinit`` 或 " +"``~/.config/gdb/gdbinit``)::" + +#: ../../howto/gdb_helpers.rst:68 +msgid "add-auto-load-safe-path /path/to/cpython" +msgstr "add-auto-load-safe-path /path/to/cpython" + +#: ../../howto/gdb_helpers.rst:70 +msgid "You can also add multiple paths, separated by ``:``." +msgstr "你还可以添加多个路径,以 ``:`` 分隔。" + +#: ../../howto/gdb_helpers.rst:74 +msgid "Setup for Python from a Linux distro" +msgstr "针对 Linux 发行版的 Python 设置" + +#: ../../howto/gdb_helpers.rst:76 +msgid "" +"Most Linux systems provide debug information for the system Python in a " +"package called ``python-debuginfo``, ``python-dbg`` or similar. For example:" +msgstr "" +"大多数 Linux 系统会在名为 ``python-debuginfo``、``python-dbg`` 或类似的包中提供系统 Python " +"的调试信息。例如:" + +#: ../../howto/gdb_helpers.rst:80 +msgid "Fedora:" +msgstr "Fedora:" + +#: ../../howto/gdb_helpers.rst:82 +msgid "" +"sudo dnf install gdb\n" +"sudo dnf debuginfo-install python3" +msgstr "" +"sudo dnf install gdb\n" +"sudo dnf debuginfo-install python3" + +#: ../../howto/gdb_helpers.rst:87 +msgid "Ubuntu:" +msgstr "Ubuntu:" + +#: ../../howto/gdb_helpers.rst:89 +msgid "sudo apt install gdb python3-dbg" +msgstr "sudo apt install gdb python3-dbg" + +#: ../../howto/gdb_helpers.rst:93 +msgid "" +"On several recent Linux systems, GDB can download debugging symbols " +"automatically using *debuginfod*. However, this will not install the " +"``python-gdb.py`` extension; you generally do need to install the debug info" +" package separately." +msgstr "" +"在一些最新的 Linux 系统上,GDB 可以使用 *debuginfod* 自动下载调试符号。不过,这并不会安装 ``python-gdb.py`` " +"扩展;你通常需要单独安装调试信息包。" + +#: ../../howto/gdb_helpers.rst:100 +msgid "Using the Debug build and Development mode" +msgstr "使用调试构建和开发模式" + +#: ../../howto/gdb_helpers.rst:102 +msgid "For easier debugging, you might want to:" +msgstr "为了方便调试,你可能需要:" + +#: ../../howto/gdb_helpers.rst:104 +msgid "" +"Use a :ref:`debug build ` of Python. (When building from " +"source, use ``configure --with-pydebug``. On Linux distros, install and run " +"a package like ``python-debug`` or ``python-dbg``, if available.)" +msgstr "" +"使用 Python 的 :ref:`调试构建版 `。 (当从源代码构建时,使用 ``configure --with-" +"pydebug``。在 Linux 发行版上,安装并运行 ``python-debug`` 或 ``python-dbg`` 之类的包,如果有的话。)" + +#: ../../howto/gdb_helpers.rst:107 +msgid "Use the runtime :ref:`development mode ` (``-X dev``)." +msgstr "使用运行时 :ref:`开发模式 ` (``-X dev``)。" + +#: ../../howto/gdb_helpers.rst:109 +msgid "" +"Both enable extra assertions and disable some optimizations. Sometimes this " +"hides the bug you are trying to find, but in most cases they make the " +"process easier." +msgstr "两者都将启用额外的断言并禁用某些优化。有时这会隐藏你想要查找的程序错误,但大多数情况下它们都能使调试过程更简单。" + +#: ../../howto/gdb_helpers.rst:115 +msgid "Using the ``python-gdb`` extension" +msgstr "使用 ``python-gdb`` 扩展" + +#: ../../howto/gdb_helpers.rst:117 +msgid "" +"When the extension is loaded, it provides two main features: pretty printers" +" for Python values, and additional commands." +msgstr "当该扩展被加载时,它将提供两个主要特性:Python 值的美化打印,以及附加的命令。" + +#: ../../howto/gdb_helpers.rst:121 +msgid "Pretty-printers" +msgstr "美化打印" + +#: ../../howto/gdb_helpers.rst:123 +msgid "" +"This is what a GDB backtrace looks like (truncated) when this extension is " +"enabled::" +msgstr "这是当此扩展被启用时 GDB 回溯信息的显示效果(截取部分)::" + +#: ../../howto/gdb_helpers.rst:126 +msgid "" +"#0 0x000000000041a6b1 in PyObject_Malloc (nbytes=Cannot access memory at address 0x7fffff7fefe8\n" +") at Objects/obmalloc.c:748\n" +"#1 0x000000000041b7c0 in _PyObject_DebugMallocApi (id=111 'o', nbytes=24) at Objects/obmalloc.c:1445\n" +"#2 0x000000000041b717 in _PyObject_DebugMalloc (nbytes=24) at Objects/obmalloc.c:1412\n" +"#3 0x000000000044060a in _PyUnicode_New (length=11) at Objects/unicodeobject.c:346\n" +"#4 0x00000000004466aa in PyUnicodeUCS2_DecodeUTF8Stateful (s=0x5c2b8d \"__lltrace__\", size=11, errors=0x0, consumed=\n" +" 0x0) at Objects/unicodeobject.c:2531\n" +"#5 0x0000000000446647 in PyUnicodeUCS2_DecodeUTF8 (s=0x5c2b8d \"__lltrace__\", size=11, errors=0x0)\n" +" at Objects/unicodeobject.c:2495\n" +"#6 0x0000000000440d1b in PyUnicodeUCS2_FromStringAndSize (u=0x5c2b8d \"__lltrace__\", size=11)\n" +" at Objects/unicodeobject.c:551\n" +"#7 0x0000000000440d94 in PyUnicodeUCS2_FromString (u=0x5c2b8d \"__lltrace__\") at Objects/unicodeobject.c:569\n" +"#8 0x0000000000584abd in PyDict_GetItemString (v=\n" +" {'Yuck': , '__builtins__': , '__file__': 'Lib/test/crashers/nasty_eq_vs_dict.py', '__package__': None, 'y': , 'dict': {0: 0, 1: 1, 2: 2, 3: 3}, '__name__': '__main__', 'z': , '__doc__': None}, key=\n" +" 0x5c2b8d \"__lltrace__\") at Objects/dictobject.c:2171" +msgstr "" + +#: ../../howto/gdb_helpers.rst:142 +msgid "" +"Notice how the dictionary argument to ``PyDict_GetItemString`` is displayed " +"as its ``repr()``, rather than an opaque ``PyObject *`` pointer." +msgstr "" +"请注意传给 ``PyDict_GetItemString`` 的字典参数被显示为其 ``repr()``,而非不透明的 ``PyObject *`` " +"指针。" + +#: ../../howto/gdb_helpers.rst:145 +msgid "" +"The extension works by supplying a custom printing routine for values of " +"type ``PyObject *``. If you need to access lower-level details of an " +"object, then cast the value to a pointer of the appropriate type. For " +"example::" +msgstr "" +"该扩展通过为类型 ``PyObject *`` 的值提供自定义的打印例程来发挥作用。 " +"如果你需要访问一个对象的低层级细节,则要将原值投射为适当类型的指针。例如::" + +#: ../../howto/gdb_helpers.rst:149 +msgid "" +"(gdb) p globals\n" +"$1 = {'__builtins__': , '__name__':\n" +"'__main__', 'ctypes': , '__doc__': None,\n" +"'__package__': None}\n" +"\n" +"(gdb) p *(PyDictObject*)globals\n" +"$2 = {ob_refcnt = 3, ob_type = 0x3dbdf85820, ma_fill = 5, ma_used = 5,\n" +"ma_mask = 7, ma_table = 0x63d0f8, ma_lookup = 0x3dbdc7ea70\n" +", ma_smalltable = {{me_hash = 7065186196740147912,\n" +"me_key = '__builtins__', me_value = },\n" +"{me_hash = -368181376027291943, me_key = '__name__',\n" +"me_value ='__main__'}, {me_hash = 0, me_key = 0x0, me_value = 0x0},\n" +"{me_hash = 0, me_key = 0x0, me_value = 0x0},\n" +"{me_hash = -9177857982131165996, me_key = 'ctypes',\n" +"me_value = },\n" +"{me_hash = -8518757509529533123, me_key = '__doc__', me_value = None},\n" +"{me_hash = 0, me_key = 0x0, me_value = 0x0}, {\n" +" me_hash = 6614918939584953775, me_key = '__package__', me_value = None}}}" +msgstr "" +"(gdb) p globals\n" +"$1 = {'__builtins__': , '__name__':\n" +"'__main__', 'ctypes': , '__doc__': None,\n" +"'__package__': None}\n" +"\n" +"(gdb) p *(PyDictObject*)globals\n" +"$2 = {ob_refcnt = 3, ob_type = 0x3dbdf85820, ma_fill = 5, ma_used = 5,\n" +"ma_mask = 7, ma_table = 0x63d0f8, ma_lookup = 0x3dbdc7ea70\n" +", ma_smalltable = {{me_hash = 7065186196740147912,\n" +"me_key = '__builtins__', me_value = },\n" +"{me_hash = -368181376027291943, me_key = '__name__',\n" +"me_value ='__main__'}, {me_hash = 0, me_key = 0x0, me_value = 0x0},\n" +"{me_hash = 0, me_key = 0x0, me_value = 0x0},\n" +"{me_hash = -9177857982131165996, me_key = 'ctypes',\n" +"me_value = },\n" +"{me_hash = -8518757509529533123, me_key = '__doc__', me_value = None},\n" +"{me_hash = 0, me_key = 0x0, me_value = 0x0}, {\n" +" me_hash = 6614918939584953775, me_key = '__package__', me_value = None}}}" + +#: ../../howto/gdb_helpers.rst:168 +msgid "" +"Note that the pretty-printers do not actually call ``repr()``. For basic " +"types, they try to match its result closely." +msgstr "请注意美化打印并不会实际调用 ``repr()``。对于基本类型,它将尝试尽量匹配其结果。" + +#: ../../howto/gdb_helpers.rst:171 +msgid "" +"An area that can be confusing is that the custom printer for some types look" +" a lot like GDB's built-in printer for standard types. For example, the " +"pretty-printer for a Python ``int`` (:c:expr:`PyLongObject *`) gives a " +"representation that is not distinguishable from one of a regular machine-" +"level integer::" +msgstr "" +"一个可能令人困惑的地方是某些类型的自定义打印效果很像是 GDB 针对标准类型的内置打印形式。例如,针对 Python ``int`` " +"(:c:expr:`PyLongObject *`) 的美化打印表示形式与机器层级上常规的整数并无区别::" + +#: ../../howto/gdb_helpers.rst:177 +msgid "" +"(gdb) p some_machine_integer\n" +"$3 = 42\n" +"\n" +"(gdb) p some_python_integer\n" +"$4 = 42" +msgstr "" +"(gdb) p some_machine_integer\n" +"$3 = 42\n" +"\n" +"(gdb) p some_python_integer\n" +"$4 = 42" + +#: ../../howto/gdb_helpers.rst:183 +msgid "" +"The internal structure can be revealed with a cast to :c:expr:`PyLongObject " +"*`::" +msgstr "内部结构可通过投射到 :c:expr:`PyLongObject *` 来揭示::" + +#: ../../howto/gdb_helpers.rst:185 +msgid "" +"(gdb) p *(PyLongObject*)some_python_integer\n" +"$5 = {ob_base = {ob_base = {ob_refcnt = 8, ob_type = 0x3dad39f5e0}, ob_size = 1},\n" +"ob_digit = {42}}" +msgstr "" +"(gdb) p *(PyLongObject*)some_python_integer\n" +"$5 = {ob_base = {ob_base = {ob_refcnt = 8, ob_type = 0x3dad39f5e0}, ob_size = 1},\n" +"ob_digit = {42}}" + +#: ../../howto/gdb_helpers.rst:189 +msgid "" +"A similar confusion can arise with the ``str`` type, where the output looks " +"a lot like gdb's built-in printer for ``char *``::" +msgstr "类似的困惑也可能发生于 ``str`` 类型,这里的输出看起来很像 gdb 针对 ``char *`` 的内置打印形式::" + +#: ../../howto/gdb_helpers.rst:192 +msgid "" +"(gdb) p ptr_to_python_str\n" +"$6 = '__builtins__'" +msgstr "" +"(gdb) p ptr_to_python_str\n" +"$6 = '__builtins__'" + +#: ../../howto/gdb_helpers.rst:195 +msgid "" +"The pretty-printer for ``str`` instances defaults to using single-quotes (as" +" does Python's ``repr`` for strings) whereas the standard printer for ``char" +" *`` values uses double-quotes and contains a hexadecimal address::" +msgstr "" +"针对 ``str`` 实例的美化打印默认使用单引号(就像 Python 字符串的 ``repr`` 一样)而针对 ``char *`` " +"值的标准打印形式使用双引号并且包含一个十六进制的地址::" + +#: ../../howto/gdb_helpers.rst:199 +msgid "" +"(gdb) p ptr_to_char_star\n" +"$7 = 0x6d72c0 \"hello world\"" +msgstr "" +"(gdb) p ptr_to_char_star\n" +"$7 = 0x6d72c0 \"hello world\"" + +#: ../../howto/gdb_helpers.rst:202 +msgid "" +"Again, the implementation details can be revealed with a cast to " +":c:expr:`PyUnicodeObject *`::" +msgstr "同样地,该实现细节可通过投射为 :c:expr:`PyUnicodeObject *` 来显示::" + +#: ../../howto/gdb_helpers.rst:205 +msgid "" +"(gdb) p *(PyUnicodeObject*)$6\n" +"$8 = {ob_base = {ob_refcnt = 33, ob_type = 0x3dad3a95a0}, length = 12,\n" +"str = 0x7ffff2128500, hash = 7065186196740147912, state = 1, defenc = 0x0}" +msgstr "" +"(gdb) p *(PyUnicodeObject*)$6\n" +"$8 = {ob_base = {ob_refcnt = 33, ob_type = 0x3dad3a95a0}, length = 12,\n" +"str = 0x7ffff2128500, hash = 7065186196740147912, state = 1, defenc = 0x0}" + +#: ../../howto/gdb_helpers.rst:210 +msgid "``py-list``" +msgstr "``py-list``" + +#: ../../howto/gdb_helpers.rst:212 +msgid "" +"The extension adds a ``py-list`` command, which lists the Python source code" +" (if any) for the current frame in the selected thread. The current line is" +" marked with a \">\"::" +msgstr "" +"该扩展添加了一个 ``py-list`` 命令,它将列出选定的线程中当前帧的 Python 源代码(如果存在)。当前行将以一个 \">\" 来标记::" + +#: ../../howto/gdb_helpers.rst:216 +msgid "" +"(gdb) py-list\n" +" 901 if options.profile:\n" +" 902 options.profile = False\n" +" 903 profile_me()\n" +" 904 return\n" +" 905\n" +">906 u = UI()\n" +" 907 if not u.quit:\n" +" 908 try:\n" +" 909 gtk.main()\n" +" 910 except KeyboardInterrupt:\n" +" 911 # properly quit on a keyboard interrupt..." +msgstr "" +"(gdb) py-list\n" +" 901 if options.profile:\n" +" 902 options.profile = False\n" +" 903 profile_me()\n" +" 904 return\n" +" 905\n" +">906 u = UI()\n" +" 907 if not u.quit:\n" +" 908 try:\n" +" 909 gtk.main()\n" +" 910 except KeyboardInterrupt:\n" +" 911 # properly quit on a keyboard interrupt..." + +#: ../../howto/gdb_helpers.rst:229 +msgid "" +"Use ``py-list START`` to list at a different line number within the Python " +"source, and ``py-list START,END`` to list a specific range of lines within " +"the Python source." +msgstr "" +"使用 ``py-list START`` 从不同的行号开始列出 Python 源代码,而 ``py-list START,END`` " +"则列出指定行范围内的 Python 源代码。" + +#: ../../howto/gdb_helpers.rst:234 +msgid "``py-up`` and ``py-down``" +msgstr "``py-up`` 和 ``py-down``" + +#: ../../howto/gdb_helpers.rst:236 +msgid "" +"The ``py-up`` and ``py-down`` commands are analogous to GDB's regular ``up``" +" and ``down`` commands, but try to move at the level of CPython frames, " +"rather than C frames." +msgstr "" +"``py-up`` 和 ``py-down`` 命令类似于 GDB 的常规 ``up`` 和 ``down`` 命令,但会尝试在 CPython " +"帧而不是 C 帧的层级上移动。" + +#: ../../howto/gdb_helpers.rst:240 +msgid "" +"GDB is not always able to read the relevant frame information, depending on " +"the optimization level with which CPython was compiled. Internally, the " +"commands look for C frames that are executing the default frame evaluation " +"function (that is, the core bytecode interpreter loop within CPython) and " +"look up the value of the related ``PyFrameObject *``." +msgstr "" +"GDB 并不总是能够读取相关的帧信息,这取决于编译 CPython 时的优化级别。在内部,这些命令会查找正在执行默认帧求值函数(即 CPython " +"内的核心字节码解释器循环)的 C 帧并查找相关 ``PyFrameObject *`` 的值。" + +#: ../../howto/gdb_helpers.rst:246 +msgid "They emit the frame number (at the C level) within the thread." +msgstr "它们将发出线程内的帧编号(在 C 层级上)。" + +#: ../../howto/gdb_helpers.rst:248 ../../howto/gdb_helpers.rst:320 +msgid "For example::" +msgstr "例如::" + +#: ../../howto/gdb_helpers.rst:250 +msgid "" +"(gdb) py-up\n" +"#37 Frame 0x9420b04, for file /usr/lib/python2.6/site-packages/\n" +"gnome_sudoku/main.py, line 906, in start_game ()\n" +" u = UI()\n" +"(gdb) py-up\n" +"#40 Frame 0x948e82c, for file /usr/lib/python2.6/site-packages/\n" +"gnome_sudoku/gnome_sudoku.py, line 22, in start_game(main=)\n" +" main.start_game()\n" +"(gdb) py-up\n" +"Unable to find an older python frame" +msgstr "" +"(gdb) py-up\n" +"#37 Frame 0x9420b04, for file /usr/lib/python2.6/site-packages/\n" +"gnome_sudoku/main.py, line 906, in start_game ()\n" +" u = UI()\n" +"(gdb) py-up\n" +"#40 Frame 0x948e82c, for file /usr/lib/python2.6/site-packages/\n" +"gnome_sudoku/gnome_sudoku.py, line 22, in start_game(main=)\n" +" main.start_game()\n" +"(gdb) py-up\n" +"Unable to find an older python frame" + +#: ../../howto/gdb_helpers.rst:261 +msgid "so we're at the top of the Python stack." +msgstr "这样我们位于 Python 栈的顶部。" + +#: ../../howto/gdb_helpers.rst:263 +msgid "" +"The frame numbers correspond to those displayed by GDB's standard " +"``backtrace`` command. The command skips C frames which are not executing " +"Python code." +msgstr "帧编号对应于 GDB 的 ``backtrace`` 命令所显示的内容。该命令将跳过未在执行 Python 代码的 C 帧。" + +#: ../../howto/gdb_helpers.rst:267 +msgid "Going back down::" +msgstr "向下回退::" + +#: ../../howto/gdb_helpers.rst:269 +msgid "" +"(gdb) py-down\n" +"#37 Frame 0x9420b04, for file /usr/lib/python2.6/site-packages/gnome_sudoku/main.py, line 906, in start_game ()\n" +" u = UI()\n" +"(gdb) py-down\n" +"#34 (unable to read python frame information)\n" +"(gdb) py-down\n" +"#23 (unable to read python frame information)\n" +"(gdb) py-down\n" +"#19 (unable to read python frame information)\n" +"(gdb) py-down\n" +"#14 Frame 0x99262ac, for file /usr/lib/python2.6/site-packages/gnome_sudoku/game_selector.py, line 201, in run_swallowed_dialog (self=, puzzle=None, saved_games=[{'gsd.auto_fills': 0, 'tracking': {}, 'trackers': {}, 'notes': [], 'saved_at': 1270084485, 'game': '7 8 0 0 0 0 0 5 6 0 0 9 0 8 0 1 0 0 0 4 6 0 0 0 0 7 0 6 5 0 0 0 4 7 9 2 0 0 0 9 0 1 0 0 0 3 9 7 6 0 0 0 1 8 0 6 0 0 0 0 2 8 0 0 0 5 0 4 0 6 0 0 2 1 0 0 0 0 0 4 5\\n7 8 0 0 0 0 0 5 6 0 0 9 0 8 0 1 0 0 0 4 6 0 0 0 0 7 0 6 5 1 8 3 4 7 9 2 0 0 0 9 0 1 0 0 0 3 9 7 6 0 0 0 1 8 0 6 0 0 0 0 2 8 0 0 0 5 0 4 0 6 0 0 2 1 0 0 0 0 0 4 5', 'gsd.impossible_hints': 0, 'timer.__absolute_start_time__': , 'gsd.hints': 0, 'timer.active_time': , 'timer.total_time': }], dialog=, saved_game_model=, sudoku_maker=, main_page=0) at remote 0x98fa6e4>, d=)\n" +" gtk.main()\n" +"(gdb) py-down\n" +"#8 (unable to read python frame information)\n" +"(gdb) py-down\n" +"Unable to find a newer python frame" +msgstr "" +"(gdb) py-down\n" +"#37 Frame 0x9420b04, for file /usr/lib/python2.6/site-packages/gnome_sudoku/main.py, line 906, in start_game ()\n" +" u = UI()\n" +"(gdb) py-down\n" +"#34 (unable to read python frame information)\n" +"(gdb) py-down\n" +"#23 (unable to read python frame information)\n" +"(gdb) py-down\n" +"#19 (unable to read python frame information)\n" +"(gdb) py-down\n" +"#14 Frame 0x99262ac, for file /usr/lib/python2.6/site-packages/gnome_sudoku/game_selector.py, line 201, in run_swallowed_dialog (self=, puzzle=None, saved_games=[{'gsd.auto_fills': 0, 'tracking': {}, 'trackers': {}, 'notes': [], 'saved_at': 1270084485, 'game': '7 8 0 0 0 0 0 5 6 0 0 9 0 8 0 1 0 0 0 4 6 0 0 0 0 7 0 6 5 0 0 0 4 7 9 2 0 0 0 9 0 1 0 0 0 3 9 7 6 0 0 0 1 8 0 6 0 0 0 0 2 8 0 0 0 5 0 4 0 6 0 0 2 1 0 0 0 0 0 4 5\\n7 8 0 0 0 0 0 5 6 0 0 9 0 8 0 1 0 0 0 4 6 0 0 0 0 7 0 6 5 1 8 3 4 7 9 2 0 0 0 9 0 1 0 0 0 3 9 7 6 0 0 0 1 8 0 6 0 0 0 0 2 8 0 0 0 5 0 4 0 6 0 0 2 1 0 0 0 0 0 4 5', 'gsd.impossible_hints': 0, 'timer.__absolute_start_time__': , 'gsd.hints': 0, 'timer.active_time': , 'timer.total_time': }], dialog=, saved_game_model=, sudoku_maker=, main_page=0) at remote 0x98fa6e4>, d=)\n" +" gtk.main()\n" +"(gdb) py-down\n" +"#8 (unable to read python frame information)\n" +"(gdb) py-down\n" +"Unable to find a newer python frame" + +#: ../../howto/gdb_helpers.rst:289 +msgid "and we're at the bottom of the Python stack." +msgstr "现在我们位于 Python 栈的底部。" + +#: ../../howto/gdb_helpers.rst:291 +msgid "" +"Note that in Python 3.12 and newer, the same C stack frame can be used for " +"multiple Python stack frames. This means that ``py-up`` and ``py-down`` may " +"move multiple Python frames at once. For example::" +msgstr "" +"请注意在 Python 3.12 及更新的版本中,同一个 C 栈帧可被用于多个 Python 栈帧。这意味着 ``py-up`` 和 ``py-" +"down`` 可以同时移动多个 Python 帧。例如::" + +#: ../../howto/gdb_helpers.rst:295 +msgid "" +"(gdb) py-up\n" +"#6 Frame 0x7ffff7fb62b0, for file /tmp/rec.py, line 5, in recursive_function (n=0)\n" +" time.sleep(5)\n" +"#6 Frame 0x7ffff7fb6240, for file /tmp/rec.py, line 7, in recursive_function (n=1)\n" +" recursive_function(n-1)\n" +"#6 Frame 0x7ffff7fb61d0, for file /tmp/rec.py, line 7, in recursive_function (n=2)\n" +" recursive_function(n-1)\n" +"#6 Frame 0x7ffff7fb6160, for file /tmp/rec.py, line 7, in recursive_function (n=3)\n" +" recursive_function(n-1)\n" +"#6 Frame 0x7ffff7fb60f0, for file /tmp/rec.py, line 7, in recursive_function (n=4)\n" +" recursive_function(n-1)\n" +"#6 Frame 0x7ffff7fb6080, for file /tmp/rec.py, line 7, in recursive_function (n=5)\n" +" recursive_function(n-1)\n" +"#6 Frame 0x7ffff7fb6020, for file /tmp/rec.py, line 9, in ()\n" +" recursive_function(5)\n" +"(gdb) py-up\n" +"Unable to find an older python frame" +msgstr "" +"(gdb) py-up\n" +"#6 Frame 0x7ffff7fb62b0, for file /tmp/rec.py, line 5, in recursive_function (n=0)\n" +" time.sleep(5)\n" +"#6 Frame 0x7ffff7fb6240, for file /tmp/rec.py, line 7, in recursive_function (n=1)\n" +" recursive_function(n-1)\n" +"#6 Frame 0x7ffff7fb61d0, for file /tmp/rec.py, line 7, in recursive_function (n=2)\n" +" recursive_function(n-1)\n" +"#6 Frame 0x7ffff7fb6160, for file /tmp/rec.py, line 7, in recursive_function (n=3)\n" +" recursive_function(n-1)\n" +"#6 Frame 0x7ffff7fb60f0, for file /tmp/rec.py, line 7, in recursive_function (n=4)\n" +" recursive_function(n-1)\n" +"#6 Frame 0x7ffff7fb6080, for file /tmp/rec.py, line 7, in recursive_function (n=5)\n" +" recursive_function(n-1)\n" +"#6 Frame 0x7ffff7fb6020, for file /tmp/rec.py, line 9, in ()\n" +" recursive_function(5)\n" +"(gdb) py-up\n" +"Unable to find an older python frame" + +#: ../../howto/gdb_helpers.rst:315 +msgid "``py-bt``" +msgstr "``py-bt``" + +#: ../../howto/gdb_helpers.rst:317 +msgid "" +"The ``py-bt`` command attempts to display a Python-level backtrace of the " +"current thread." +msgstr "``py-bt`` 命令会尝试显示当前线程的 Python 层级回溯。" + +#: ../../howto/gdb_helpers.rst:322 +msgid "" +"(gdb) py-bt\n" +"#8 (unable to read python frame information)\n" +"#11 Frame 0x9aead74, for file /usr/lib/python2.6/site-packages/gnome_sudoku/dialog_swallower.py, line 48, in run_dialog (self=, main_page=0) at remote 0x98fa6e4>, d=)\n" +" gtk.main()\n" +"#14 Frame 0x99262ac, for file /usr/lib/python2.6/site-packages/gnome_sudoku/game_selector.py, line 201, in run_swallowed_dialog (self=, puzzle=None, saved_games=[{'gsd.auto_fills': 0, 'tracking': {}, 'trackers': {}, 'notes': [], 'saved_at': 1270084485, 'game': '7 8 0 0 0 0 0 5 6 0 0 9 0 8 0 1 0 0 0 4 6 0 0 0 0 7 0 6 5 0 0 0 4 7 9 2 0 0 0 9 0 1 0 0 0 3 9 7 6 0 0 0 1 8 0 6 0 0 0 0 2 8 0 0 0 5 0 4 0 6 0 0 2 1 0 0 0 0 0 4 5\\n7 8 0 0 0 0 0 5 6 0 0 9 0 8 0 1 0 0 0 4 6 0 0 0 0 7 0 6 5 1 8 3 4 7 9 2 0 0 0 9 0 1 0 0 0 3 9 7 6 0 0 0 1 8 0 6 0 0 0 0 2 8 0 0 0 5 0 4 0 6 0 0 2 1 0 0 0 0 0 4 5', 'gsd.impossible_hints': 0, 'timer.__absolute_start_time__': , 'gsd.hints': 0, 'timer.active_time': , 'timer.total_time': }], dialog=, saved_game_model=, sudoku_maker=)\n" +" main.start_game()" +msgstr "" +"(gdb) py-bt\n" +"#8 (unable to read python frame information)\n" +"#11 Frame 0x9aead74, for file /usr/lib/python2.6/site-packages/gnome_sudoku/dialog_swallower.py, line 48, in run_dialog (self=, main_page=0) at remote 0x98fa6e4>, d=)\n" +" gtk.main()\n" +"#14 Frame 0x99262ac, for file /usr/lib/python2.6/site-packages/gnome_sudoku/game_selector.py, line 201, in run_swallowed_dialog (self=, puzzle=None, saved_games=[{'gsd.auto_fills': 0, 'tracking': {}, 'trackers': {}, 'notes': [], 'saved_at': 1270084485, 'game': '7 8 0 0 0 0 0 5 6 0 0 9 0 8 0 1 0 0 0 4 6 0 0 0 0 7 0 6 5 0 0 0 4 7 9 2 0 0 0 9 0 1 0 0 0 3 9 7 6 0 0 0 1 8 0 6 0 0 0 0 2 8 0 0 0 5 0 4 0 6 0 0 2 1 0 0 0 0 0 4 5\\n7 8 0 0 0 0 0 5 6 0 0 9 0 8 0 1 0 0 0 4 6 0 0 0 0 7 0 6 5 1 8 3 4 7 9 2 0 0 0 9 0 1 0 0 0 3 9 7 6 0 0 0 1 8 0 6 0 0 0 0 2 8 0 0 0 5 0 4 0 6 0 0 2 1 0 0 0 0 0 4 5', 'gsd.impossible_hints': 0, 'timer.__absolute_start_time__': , 'gsd.hints': 0, 'timer.active_time': , 'timer.total_time': }], dialog=, saved_game_model=, sudoku_maker=)\n" +" main.start_game()" + +#: ../../howto/gdb_helpers.rst:336 +msgid "" +"The frame numbers correspond to those displayed by GDB's standard " +"``backtrace`` command." +msgstr "帧编号对应于 GDB 的 ``backtrace`` 命令所显示的内容。" + +#: ../../howto/gdb_helpers.rst:340 +msgid "``py-print``" +msgstr "``py-print``" + +#: ../../howto/gdb_helpers.rst:342 +msgid "" +"The ``py-print`` command looks up a Python name and tries to print it. It " +"looks in locals within the current thread, then globals, then finally " +"builtins::" +msgstr "" +"``py-print`` 命令会查找一个 Python 名称并尝试打印它。它将先在当前线程的 locals 中查找,然后是 globals,最后是 " +"builtins::" + +#: ../../howto/gdb_helpers.rst:346 +msgid "" +"(gdb) py-print self\n" +"local 'self' = ,\n" +"main_page=0) at remote 0x98fa6e4>\n" +"(gdb) py-print __name__\n" +"global '__name__' = 'gnome_sudoku.dialog_swallower'\n" +"(gdb) py-print len\n" +"builtin 'len' = \n" +"(gdb) py-print scarlet_pimpernel\n" +"'scarlet_pimpernel' not found" +msgstr "" +"(gdb) py-print self\n" +"local 'self' = ,\n" +"main_page=0) at remote 0x98fa6e4>\n" +"(gdb) py-print __name__\n" +"global '__name__' = 'gnome_sudoku.dialog_swallower'\n" +"(gdb) py-print len\n" +"builtin 'len' = \n" +"(gdb) py-print scarlet_pimpernel\n" +"'scarlet_pimpernel' not found" + +#: ../../howto/gdb_helpers.rst:356 +msgid "" +"If the current C frame corresponds to multiple Python frames, ``py-print`` " +"only considers the first one." +msgstr "如果当前 C 帧对应多个 Python 帧,则 ``py-print`` 只会考虑其中第一个。" + +#: ../../howto/gdb_helpers.rst:360 +msgid "``py-locals``" +msgstr "``py-locals``" + +#: ../../howto/gdb_helpers.rst:362 +msgid "" +"The ``py-locals`` command looks up all Python locals within the current " +"Python frame in the selected thread, and prints their representations::" +msgstr "" +"``py-locals`` 命令会在选定的线程中查找当前 Python 帧内的所有 Python 的 locals,并打印它们的表示形式::" + +#: ../../howto/gdb_helpers.rst:365 +msgid "" +"(gdb) py-locals\n" +"self = ,\n" +"main_page=0) at remote 0x98fa6e4>\n" +"d = " +msgstr "" +"(gdb) py-locals\n" +"self = ,\n" +"main_page=0) at remote 0x98fa6e4>\n" +"d = " + +#: ../../howto/gdb_helpers.rst:370 +msgid "" +"If the current C frame corresponds to multiple Python frames, locals from " +"all of them will be shown::" +msgstr "如果当前 C 帧对应多个 Python 帧,则它们的所有 locals 都会被显示::" + +#: ../../howto/gdb_helpers.rst:373 +msgid "" +"(gdb) py-locals\n" +"Locals for recursive_function\n" +"n = 0\n" +"Locals for recursive_function\n" +"n = 1\n" +"Locals for recursive_function\n" +"n = 2\n" +"Locals for recursive_function\n" +"n = 3\n" +"Locals for recursive_function\n" +"n = 4\n" +"Locals for recursive_function\n" +"n = 5\n" +"Locals for " +msgstr "" +"(gdb) py-locals\n" +"Locals for recursive_function\n" +"n = 0\n" +"Locals for recursive_function\n" +"n = 1\n" +"Locals for recursive_function\n" +"n = 2\n" +"Locals for recursive_function\n" +"n = 3\n" +"Locals for recursive_function\n" +"n = 4\n" +"Locals for recursive_function\n" +"n = 5\n" +"Locals for " + +#: ../../howto/gdb_helpers.rst:390 +msgid "Use with GDB commands" +msgstr "与 GDB 命令一起使用" + +#: ../../howto/gdb_helpers.rst:392 +msgid "" +"The extension commands complement GDB's built-in commands. For example, you " +"can use a frame numbers shown by ``py-bt`` with the ``frame`` command to go " +"a specific frame within the selected thread, like this::" +msgstr "" +"这些扩展命令是对 GDB 的内置命令的补充。例如,你可以使用 ``py-bt`` 显示的帧编号与 ``frame`` " +"命令一起使用以转到所选线程中的特定帧,如下所示::" + +#: ../../howto/gdb_helpers.rst:396 +msgid "" +"(gdb) py-bt\n" +"(output snipped)\n" +"#68 Frame 0xaa4560, for file Lib/test/regrtest.py, line 1548, in ()\n" +" main()\n" +"(gdb) frame 68\n" +"#68 0x00000000004cd1e6 in PyEval_EvalFrameEx (f=Frame 0xaa4560, for file Lib/test/regrtest.py, line 1548, in (), throwflag=0) at Python/ceval.c:2665\n" +"2665 x = call_function(&sp, oparg);\n" +"(gdb) py-list\n" +"1543 # Run the tests in a context manager that temporary changes the CWD to a\n" +"1544 # temporary and writable directory. If it's not possible to create or\n" +"1545 # change the CWD, the original CWD will be used. The original CWD is\n" +"1546 # available from test_support.SAVEDCWD.\n" +"1547 with test_support.temp_cwd(TESTCWD, quiet=True):\n" +">1548 main()" +msgstr "" +"(gdb) py-bt\n" +"(output snipped)\n" +"#68 Frame 0xaa4560, for file Lib/test/regrtest.py, line 1548, in ()\n" +" main()\n" +"(gdb) frame 68\n" +"#68 0x00000000004cd1e6 in PyEval_EvalFrameEx (f=Frame 0xaa4560, for file Lib/test/regrtest.py, line 1548, in (), throwflag=0) at Python/ceval.c:2665\n" +"2665 x = call_function(&sp, oparg);\n" +"(gdb) py-list\n" +"1543 # Run the tests in a context manager that temporary changes the CWD to a\n" +"1544 # temporary and writable directory. If it's not possible to create or\n" +"1545 # change the CWD, the original CWD will be used. The original CWD is\n" +"1546 # available from test_support.SAVEDCWD.\n" +"1547 with test_support.temp_cwd(TESTCWD, quiet=True):\n" +">1548 main()" + +#: ../../howto/gdb_helpers.rst:411 +msgid "" +"The ``info threads`` command will give you a list of the threads within the " +"process, and you can use the ``thread`` command to select a different one::" +msgstr "``info threads`` 命令将向你提供进程内的线程列表,你还可以使用 ``thread`` 命令来选择不同的线程::" + +#: ../../howto/gdb_helpers.rst:414 +msgid "" +"(gdb) info threads\n" +" 105 Thread 0x7fffefa18710 (LWP 10260) sem_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S:86\n" +" 104 Thread 0x7fffdf5fe710 (LWP 10259) sem_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S:86\n" +"* 1 Thread 0x7ffff7fe2700 (LWP 10145) 0x00000038e46d73e3 in select () at ../sysdeps/unix/syscall-template.S:82" +msgstr "" +"(gdb) info threads\n" +" 105 Thread 0x7fffefa18710 (LWP 10260) sem_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S:86\n" +" 104 Thread 0x7fffdf5fe710 (LWP 10259) sem_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S:86\n" +"* 1 Thread 0x7ffff7fe2700 (LWP 10145) 0x00000038e46d73e3 in select () at ../sysdeps/unix/syscall-template.S:82" + +#: ../../howto/gdb_helpers.rst:419 +msgid "" +"You can use ``thread apply all COMMAND`` or (``t a a COMMAND`` for short) to" +" run a command on all threads. With ``py-bt``, this lets you see what every" +" thread is doing at the Python level::" +msgstr "" +"你可以使用 ``thread apply all COMMAND`` 或 (简短写法 ``t a a COMMAND``) 在所有线程上运行一个命令。 " +"配合 ``py-bt``,这将让你看到每个线程在 Python 层级上做什么::" + +#: ../../howto/gdb_helpers.rst:423 +msgid "" +"(gdb) t a a py-bt\n" +"\n" +"Thread 105 (Thread 0x7fffefa18710 (LWP 10260)):\n" +"#5 Frame 0x7fffd00019d0, for file /home/david/coding/python-svn/Lib/threading.py, line 155, in _acquire_restore (self=<_RLock(_Verbose__verbose=False, _RLock__owner=140737354016512, _RLock__block=, _RLock__count=1) at remote 0xd7ff40>, count_owner=(1, 140737213728528), count=1, owner=140737213728528)\n" +" self.__block.acquire()\n" +"#8 Frame 0x7fffac001640, for file /home/david/coding/python-svn/Lib/threading.py, line 269, in wait (self=<_Condition(_Condition__lock=<_RLock(_Verbose__verbose=False, _RLock__owner=140737354016512, _RLock__block=, _RLock__count=1) at remote 0xd7ff40>, acquire=, _is_owned=, _release_save=, release=, _acquire_restore=, _Verbose__verbose=False, _Condition__waiters=[]) at remote 0xd7fd10>, timeout=None, waiter=, saved_state=(1, 140737213728528))\n" +" self._acquire_restore(saved_state)\n" +"#12 Frame 0x7fffb8001a10, for file /home/david/coding/python-svn/Lib/test/lock_tests.py, line 348, in f ()\n" +" cond.wait()\n" +"#16 Frame 0x7fffb8001c40, for file /home/david/coding/python-svn/Lib/test/lock_tests.py, line 37, in task (tid=140737213728528)\n" +" f()\n" +"\n" +"Thread 104 (Thread 0x7fffdf5fe710 (LWP 10259)):\n" +"#5 Frame 0x7fffe4001580, for file /home/david/coding/python-svn/Lib/threading.py, line 155, in _acquire_restore (self=<_RLock(_Verbose__verbose=False, _RLock__owner=140737354016512, _RLock__block=, _RLock__count=1) at remote 0xd7ff40>, count_owner=(1, 140736940992272), count=1, owner=140736940992272)\n" +" self.__block.acquire()\n" +"#8 Frame 0x7fffc8002090, for file /home/david/coding/python-svn/Lib/threading.py, line 269, in wait (self=<_Condition(_Condition__lock=<_RLock(_Verbose__verbose=False, _RLock__owner=140737354016512, _RLock__block=, _RLock__count=1) at remote 0xd7ff40>, acquire=, _is_owned=, _release_save=, release=, _acquire_restore=, _Verbose__verbose=False, _Condition__waiters=[]) at remote 0xd7fd10>, timeout=None, waiter=, saved_state=(1, 140736940992272))\n" +" self._acquire_restore(saved_state)\n" +"#12 Frame 0x7fffac001c90, for file /home/david/coding/python-svn/Lib/test/lock_tests.py, line 348, in f ()\n" +" cond.wait()\n" +"#16 Frame 0x7fffac0011c0, for file /home/david/coding/python-svn/Lib/test/lock_tests.py, line 37, in task (tid=140736940992272)\n" +" f()\n" +"\n" +"Thread 1 (Thread 0x7ffff7fe2700 (LWP 10145)):\n" +"#5 Frame 0xcb5380, for file /home/david/coding/python-svn/Lib/test/lock_tests.py, line 16, in _wait ()\n" +" time.sleep(0.01)\n" +"#8 Frame 0x7fffd00024a0, for file /home/david/coding/python-svn/Lib/test/lock_tests.py, line 378, in _check_notify (self=, skipped=[], _mirrorOutput=False, testsRun=39, buffer=False, _original_stderr=, _stdout_buffer=, _stderr_buffer=, _moduleSetUpFailed=False, expectedFailures=[], errors=[], _previousTestClass=, unexpectedSuccesses=[], failures=[], shouldStop=False, failfast=False) at remote 0xc185a0>, _threads=(0,), _cleanups=[], _type_equality_funcs={: , : , : , : , , _RLock__count=1) at remote 0xd7ff40>, count_owner=(1, 140737213728528), count=1, owner=140737213728528)\n" +" self.__block.acquire()\n" +"#8 Frame 0x7fffac001640, for file /home/david/coding/python-svn/Lib/threading.py, line 269, in wait (self=<_Condition(_Condition__lock=<_RLock(_Verbose__verbose=False, _RLock__owner=140737354016512, _RLock__block=, _RLock__count=1) at remote 0xd7ff40>, acquire=, _is_owned=, _release_save=, release=, _acquire_restore=, _Verbose__verbose=False, _Condition__waiters=[]) at remote 0xd7fd10>, timeout=None, waiter=, saved_state=(1, 140737213728528))\n" +" self._acquire_restore(saved_state)\n" +"#12 Frame 0x7fffb8001a10, for file /home/david/coding/python-svn/Lib/test/lock_tests.py, line 348, in f ()\n" +" cond.wait()\n" +"#16 Frame 0x7fffb8001c40, for file /home/david/coding/python-svn/Lib/test/lock_tests.py, line 37, in task (tid=140737213728528)\n" +" f()\n" +"\n" +"Thread 104 (Thread 0x7fffdf5fe710 (LWP 10259)):\n" +"#5 Frame 0x7fffe4001580, for file /home/david/coding/python-svn/Lib/threading.py, line 155, in _acquire_restore (self=<_RLock(_Verbose__verbose=False, _RLock__owner=140737354016512, _RLock__block=, _RLock__count=1) at remote 0xd7ff40>, count_owner=(1, 140736940992272), count=1, owner=140736940992272)\n" +" self.__block.acquire()\n" +"#8 Frame 0x7fffc8002090, for file /home/david/coding/python-svn/Lib/threading.py, line 269, in wait (self=<_Condition(_Condition__lock=<_RLock(_Verbose__verbose=False, _RLock__owner=140737354016512, _RLock__block=, _RLock__count=1) at remote 0xd7ff40>, acquire=, _is_owned=, _release_save=, release=, _acquire_restore=, _Verbose__verbose=False, _Condition__waiters=[]) at remote 0xd7fd10>, timeout=None, waiter=, saved_state=(1, 140736940992272))\n" +" self._acquire_restore(saved_state)\n" +"#12 Frame 0x7fffac001c90, for file /home/david/coding/python-svn/Lib/test/lock_tests.py, line 348, in f ()\n" +" cond.wait()\n" +"#16 Frame 0x7fffac0011c0, for file /home/david/coding/python-svn/Lib/test/lock_tests.py, line 37, in task (tid=140736940992272)\n" +" f()\n" +"\n" +"Thread 1 (Thread 0x7ffff7fe2700 (LWP 10145)):\n" +"#5 Frame 0xcb5380, for file /home/david/coding/python-svn/Lib/test/lock_tests.py, line 16, in _wait ()\n" +" time.sleep(0.01)\n" +"#8 Frame 0x7fffd00024a0, for file /home/david/coding/python-svn/Lib/test/lock_tests.py, line 378, in _check_notify (self=, skipped=[], _mirrorOutput=False, testsRun=39, buffer=False, _original_stderr=, _stdout_buffer=, _stderr_buffer=, _moduleSetUpFailed=False, expectedFailures=[], errors=[], _previousTestClass=, unexpectedSuccesses=[], failures=[], shouldStop=False, failfast=False) at remote 0xc185a0>, _threads=(0,), _cleanups=[], _type_equality_funcs={: , : , : , : , , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../howto/index.rst:5 +msgid "Python HOWTOs" +msgstr "Python 指南" + +#: ../../howto/index.rst:7 +msgid "" +"Python HOWTOs are documents that cover a specific topic in-depth. Modeled on" +" the Linux Documentation Project's HOWTO collection, this collection is an " +"effort to foster documentation that's more detailed than the Python Library " +"Reference." +msgstr "" +"Python HOWTO 是深入覆盖特定主题的文档。以 Linux 文档项目的 HOWTO 合集为样板,本合集致力于提供比 Python " +"库参考更详细的文档。" + +#: ../../howto/index.rst:42 +msgid "General:" +msgstr "通用:" + +#: ../../howto/index.rst:44 +msgid ":ref:`a-conceptual-overview-of-asyncio`" +msgstr ":ref:`a-conceptual-overview-of-asyncio`" + +#: ../../howto/index.rst:45 +msgid ":ref:`annotations-howto`" +msgstr ":ref:`annotations-howto`" + +#: ../../howto/index.rst:46 +msgid ":ref:`argparse-tutorial`" +msgstr ":ref:`argparse-tutorial`" + +#: ../../howto/index.rst:47 +msgid ":ref:`descriptorhowto`" +msgstr ":ref:`descriptorhowto`" + +#: ../../howto/index.rst:48 +msgid ":ref:`enum-howto`" +msgstr ":ref:`enum-howto`" + +#: ../../howto/index.rst:49 +msgid ":ref:`functional-howto`" +msgstr ":ref:`functional-howto`" + +#: ../../howto/index.rst:50 +msgid ":ref:`ipaddress-howto`" +msgstr ":ref:`ipaddress-howto`" + +#: ../../howto/index.rst:51 +msgid ":ref:`logging-howto`" +msgstr ":ref:`logging-howto`" + +#: ../../howto/index.rst:52 +msgid ":ref:`logging-cookbook`" +msgstr ":ref:`logging-cookbook`" + +#: ../../howto/index.rst:53 +msgid ":ref:`regex-howto`" +msgstr ":ref:`regex-howto`" + +#: ../../howto/index.rst:54 +msgid ":ref:`sortinghowto`" +msgstr ":ref:`sortinghowto`" + +#: ../../howto/index.rst:55 +msgid ":ref:`unicode-howto`" +msgstr ":ref:`unicode-howto`" + +#: ../../howto/index.rst:56 +msgid ":ref:`urllib-howto`" +msgstr ":ref:`urllib-howto`" + +#: ../../howto/index.rst:58 +msgid "Advanced development:" +msgstr "高级开发:" + +#: ../../howto/index.rst:60 +msgid ":ref:`curses-howto`" +msgstr ":ref:`curses-howto`" + +#: ../../howto/index.rst:61 +msgid ":ref:`freethreading-python-howto`" +msgstr ":ref:`freethreading-python-howto`" + +#: ../../howto/index.rst:62 +msgid ":ref:`freethreading-extensions-howto`" +msgstr ":ref:`freethreading-extensions-howto`" + +#: ../../howto/index.rst:63 +msgid ":ref:`isolating-extensions-howto`" +msgstr ":ref:`isolating-extensions-howto`" + +#: ../../howto/index.rst:64 +msgid ":ref:`python_2.3_mro`" +msgstr ":ref:`python_2.3_mro`" + +#: ../../howto/index.rst:65 +msgid ":ref:`socket-howto`" +msgstr ":ref:`socket-howto`" + +#: ../../howto/index.rst:66 +msgid ":ref:`timerfd-howto`" +msgstr ":ref:`timerfd-howto`" + +#: ../../howto/index.rst:67 +msgid ":ref:`cporting-howto`" +msgstr ":ref:`cporting-howto`" + +#: ../../howto/index.rst:69 +msgid "Debugging and profiling:" +msgstr "调试和性能分析:" + +#: ../../howto/index.rst:71 +msgid ":ref:`gdb`" +msgstr ":ref:`gdb`" + +#: ../../howto/index.rst:72 +msgid ":ref:`instrumentation`" +msgstr ":ref:`instrumentation`" + +#: ../../howto/index.rst:73 +msgid ":ref:`perf_profiling`" +msgstr ":ref:`perf_profiling`" + +#: ../../howto/index.rst:74 +msgid ":ref:`remote-debugging`" +msgstr ":ref:`remote-debugging`" diff --git a/howto/instrumentation.po b/howto/instrumentation.po new file mode 100644 index 0000000000..c519fddd51 --- /dev/null +++ b/howto/instrumentation.po @@ -0,0 +1,892 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../howto/instrumentation.rst:7 +msgid "Instrumenting CPython with DTrace and SystemTap" +msgstr "使用 DTrace 和 SystemTap 检测 CPython" + +#: ../../howto/instrumentation.rst:0 +msgid "author" +msgstr "作者" + +#: ../../howto/instrumentation.rst:9 +msgid "David Malcolm" +msgstr "David Malcolm" + +#: ../../howto/instrumentation.rst:10 +msgid "Łukasz Langa" +msgstr "Łukasz Langa" + +#: ../../howto/instrumentation.rst:12 +msgid "" +"DTrace and SystemTap are monitoring tools, each providing a way to inspect " +"what the processes on a computer system are doing. They both use domain-" +"specific languages allowing a user to write scripts which:" +msgstr "" +"DTrace 和 SystemTap 是监控工具,它们都提供了一种检查计算机系统上的进程的方法。它们都使用特定领域的语言,允许用户编写以下脚本:" + +#: ../../howto/instrumentation.rst:16 +msgid "filter which processes are to be observed" +msgstr "筛选要观察的进程" + +#: ../../howto/instrumentation.rst:17 +msgid "gather data from the processes of interest" +msgstr "从感兴趣的进程中收集数据" + +#: ../../howto/instrumentation.rst:18 +msgid "generate reports on the data" +msgstr "生成有关数据的报告" + +#: ../../howto/instrumentation.rst:20 +msgid "" +"As of Python 3.6, CPython can be built with embedded \"markers\", also known" +" as \"probes\", that can be observed by a DTrace or SystemTap script, making" +" it easier to monitor what the CPython processes on a system are doing." +msgstr "" +"从 Python 3.6 开始,CPython 可以使用嵌入式“标记”构建,也称为“探测器”,可以通过 DTrace 或 SystemTap " +"脚本观察,从而更容易监视系统上的 CPython 进程正在做什么。" + +#: ../../howto/instrumentation.rst:27 +msgid "" +"DTrace markers are implementation details of the CPython interpreter. No " +"guarantees are made about probe compatibility between versions of CPython. " +"DTrace scripts can stop working or work incorrectly without warning when " +"changing CPython versions." +msgstr "" +"DTrace 标记是 CPython 解释器的实现细节。不保证 CPython 版本之间的探针兼容性。 更改 CPython 版本时,DTrace " +"脚本可能会停止工作或无法正常工作而不会发出警告。" + +#: ../../howto/instrumentation.rst:34 +msgid "Enabling the static markers" +msgstr "启用静态标记" + +#: ../../howto/instrumentation.rst:36 +msgid "" +"macOS comes with built-in support for DTrace. On Linux, in order to build " +"CPython with the embedded markers for SystemTap, the SystemTap development " +"tools must be installed." +msgstr "" +"macOS 内置了对 DTrace 的支持。在 Linux 上,为了使用 SystemTap 的嵌入式标记构建 CPython,必须安装 " +"SystemTap 开发工具。" + +#: ../../howto/instrumentation.rst:40 +msgid "On a Linux machine, this can be done via::" +msgstr "在 Linux 机器上,这可以通过以下方式完成::" + +#: ../../howto/instrumentation.rst:42 +msgid "$ yum install systemtap-sdt-devel" +msgstr "$ yum install systemtap-sdt-devel" + +#: ../../howto/instrumentation.rst:44 +msgid "or::" +msgstr "或者::" + +#: ../../howto/instrumentation.rst:46 +msgid "$ sudo apt-get install systemtap-sdt-dev" +msgstr "$ sudo apt-get install systemtap-sdt-dev" + +#: ../../howto/instrumentation.rst:49 +msgid "" +"CPython must then be :option:`configured with the --with-dtrace option " +"<--with-dtrace>`:" +msgstr "之后 CPython 必须 :option:`配置 --with-dtrace 选项 <--with-dtrace>`:" + +#: ../../howto/instrumentation.rst:52 +msgid "checking for --with-dtrace... yes" +msgstr "checking for --with-dtrace... yes" + +#: ../../howto/instrumentation.rst:56 +msgid "" +"On macOS, you can list available DTrace probes by running a Python process " +"in the background and listing all probes made available by the Python " +"provider::" +msgstr "" +"在 macOS 上,您可以通过在后台运行 Python 进程列出可用的 DTrace 探测器,并列出 Python 程序提供的所有探测器::" + +#: ../../howto/instrumentation.rst:60 +msgid "" +"$ python3.6 -q &\n" +"$ sudo dtrace -l -P python$! # or: dtrace -l -m python3.6\n" +"\n" +" ID PROVIDER MODULE FUNCTION NAME\n" +"29564 python18035 python3.6 _PyEval_EvalFrameDefault function-entry\n" +"29565 python18035 python3.6 dtrace_function_entry function-entry\n" +"29566 python18035 python3.6 _PyEval_EvalFrameDefault function-return\n" +"29567 python18035 python3.6 dtrace_function_return function-return\n" +"29568 python18035 python3.6 collect gc-done\n" +"29569 python18035 python3.6 collect gc-start\n" +"29570 python18035 python3.6 _PyEval_EvalFrameDefault line\n" +"29571 python18035 python3.6 maybe_dtrace_line line" +msgstr "" +"$ python3.6 -q &\n" +"$ sudo dtrace -l -P python$! # or: dtrace -l -m python3.6\n" +"\n" +" ID PROVIDER MODULE FUNCTION NAME\n" +"29564 python18035 python3.6 _PyEval_EvalFrameDefault function-entry\n" +"29565 python18035 python3.6 dtrace_function_entry function-entry\n" +"29566 python18035 python3.6 _PyEval_EvalFrameDefault function-return\n" +"29567 python18035 python3.6 dtrace_function_return function-return\n" +"29568 python18035 python3.6 collect gc-done\n" +"29569 python18035 python3.6 collect gc-start\n" +"29570 python18035 python3.6 _PyEval_EvalFrameDefault line\n" +"29571 python18035 python3.6 maybe_dtrace_line line" + +#: ../../howto/instrumentation.rst:73 +msgid "" +"On Linux, you can verify if the SystemTap static markers are present in the " +"built binary by seeing if it contains a \".note.stapsdt\" section." +msgstr "" +"在 Linux 上,您可以通过查看是否包含“.note.stapsdt”部分来验证构建的二进制文件中是否存在 SystemTap 静态标记。" + +#: ../../howto/instrumentation.rst:78 +msgid "" +"$ readelf -S ./python | grep .note.stapsdt\n" +"[30] .note.stapsdt NOTE 0000000000000000 00308d78" +msgstr "" +"$ readelf -S ./python | grep .note.stapsdt\n" +"[30] .note.stapsdt NOTE 0000000000000000 00308d78" + +#: ../../howto/instrumentation.rst:81 +msgid "" +"If you've built Python as a shared library (with the :option:`--enable-" +"shared` configure option), you need to look instead within the shared " +"library. For example::" +msgstr "" +"如果你将 Python 编译为共享库(使用 :option:`--enable-shared` 配置选项),那么你需要改为在共享库内部查看。例如::" + +#: ../../howto/instrumentation.rst:85 +msgid "" +"$ readelf -S libpython3.3dm.so.1.0 | grep .note.stapsdt\n" +"[29] .note.stapsdt NOTE 0000000000000000 00365b68" +msgstr "" +"$ readelf -S libpython3.3dm.so.1.0 | grep .note.stapsdt\n" +"[29] .note.stapsdt NOTE 0000000000000000 00365b68" + +#: ../../howto/instrumentation.rst:88 +msgid "Sufficiently modern readelf can print the metadata::" +msgstr "足够现代的 readelf 命令可以打印元数据::" + +#: ../../howto/instrumentation.rst:90 +msgid "" +"$ readelf -n ./python\n" +"\n" +"Displaying notes found at file offset 0x00000254 with length 0x00000020:\n" +" Owner Data size Description\n" +" GNU 0x00000010 NT_GNU_ABI_TAG (ABI version tag)\n" +" OS: Linux, ABI: 2.6.32\n" +"\n" +"Displaying notes found at file offset 0x00000274 with length 0x00000024:\n" +" Owner Data size Description\n" +" GNU 0x00000014 NT_GNU_BUILD_ID (unique build ID bitstring)\n" +" Build ID: df924a2b08a7e89f6e11251d4602022977af2670\n" +"\n" +"Displaying notes found at file offset 0x002d6c30 with length 0x00000144:\n" +" Owner Data size Description\n" +" stapsdt 0x00000031 NT_STAPSDT (SystemTap probe descriptors)\n" +" Provider: python\n" +" Name: gc__start\n" +" Location: 0x00000000004371c3, Base: 0x0000000000630ce2, Semaphore: 0x00000000008d6bf6\n" +" Arguments: -4@%ebx\n" +" stapsdt 0x00000030 NT_STAPSDT (SystemTap probe descriptors)\n" +" Provider: python\n" +" Name: gc__done\n" +" Location: 0x00000000004374e1, Base: 0x0000000000630ce2, Semaphore: 0x00000000008d6bf8\n" +" Arguments: -8@%rax\n" +" stapsdt 0x00000045 NT_STAPSDT (SystemTap probe descriptors)\n" +" Provider: python\n" +" Name: function__entry\n" +" Location: 0x000000000053db6c, Base: 0x0000000000630ce2, Semaphore: 0x00000000008d6be8\n" +" Arguments: 8@%rbp 8@%r12 -4@%eax\n" +" stapsdt 0x00000046 NT_STAPSDT (SystemTap probe descriptors)\n" +" Provider: python\n" +" Name: function__return\n" +" Location: 0x000000000053dba8, Base: 0x0000000000630ce2, Semaphore: 0x00000000008d6bea\n" +" Arguments: 8@%rbp 8@%r12 -4@%eax" +msgstr "" +"$ readelf -n ./python\n" +"\n" +"Displaying notes found at file offset 0x00000254 with length 0x00000020:\n" +" Owner Data size Description\n" +" GNU 0x00000010 NT_GNU_ABI_TAG (ABI version tag)\n" +" OS: Linux, ABI: 2.6.32\n" +"\n" +"Displaying notes found at file offset 0x00000274 with length 0x00000024:\n" +" Owner Data size Description\n" +" GNU 0x00000014 NT_GNU_BUILD_ID (unique build ID bitstring)\n" +" Build ID: df924a2b08a7e89f6e11251d4602022977af2670\n" +"\n" +"Displaying notes found at file offset 0x002d6c30 with length 0x00000144:\n" +" Owner Data size Description\n" +" stapsdt 0x00000031 NT_STAPSDT (SystemTap probe descriptors)\n" +" Provider: python\n" +" Name: gc__start\n" +" Location: 0x00000000004371c3, Base: 0x0000000000630ce2, Semaphore: 0x00000000008d6bf6\n" +" Arguments: -4@%ebx\n" +" stapsdt 0x00000030 NT_STAPSDT (SystemTap probe descriptors)\n" +" Provider: python\n" +" Name: gc__done\n" +" Location: 0x00000000004374e1, Base: 0x0000000000630ce2, Semaphore: 0x00000000008d6bf8\n" +" Arguments: -8@%rax\n" +" stapsdt 0x00000045 NT_STAPSDT (SystemTap probe descriptors)\n" +" Provider: python\n" +" Name: function__entry\n" +" Location: 0x000000000053db6c, Base: 0x0000000000630ce2, Semaphore: 0x00000000008d6be8\n" +" Arguments: 8@%rbp 8@%r12 -4@%eax\n" +" stapsdt 0x00000046 NT_STAPSDT (SystemTap probe descriptors)\n" +" Provider: python\n" +" Name: function__return\n" +" Location: 0x000000000053dba8, Base: 0x0000000000630ce2, Semaphore: 0x00000000008d6bea\n" +" Arguments: 8@%rbp 8@%r12 -4@%eax" + +#: ../../howto/instrumentation.rst:125 +msgid "" +"The above metadata contains information for SystemTap describing how it can " +"patch strategically placed machine code instructions to enable the tracing " +"hooks used by a SystemTap script." +msgstr "上述元数据包含 SystemTap 信息,它描述了如何修补策略性放置的机器码指令以启用 SystemTap 脚本所使用的跟踪钩子。" + +#: ../../howto/instrumentation.rst:131 +msgid "Static DTrace probes" +msgstr "静态 DTrace 探针" + +#: ../../howto/instrumentation.rst:133 +msgid "" +"The following example DTrace script can be used to show the call/return " +"hierarchy of a Python script, only tracing within the invocation of a " +"function called \"start\". In other words, import-time function invocations " +"are not going to be listed:" +msgstr "" +"下面的 DTrace 脚本示例可以用来显示一个 Python 脚本的调用/返回层次结构,只在调用名为 \"start\" " +"的函数内进行跟踪。换句话说,导入时的函数调用不会被列出。" + +#: ../../howto/instrumentation.rst:138 +msgid "" +"self int indent;\n" +"\n" +"python$target:::function-entry\n" +"/copyinstr(arg1) == \"start\"/\n" +"{\n" +" self->trace = 1;\n" +"}\n" +"\n" +"python$target:::function-entry\n" +"/self->trace/\n" +"{\n" +" printf(\"%d\\t%*s:\", timestamp, 15, probename);\n" +" printf(\"%*s\", self->indent, \"\");\n" +" printf(\"%s:%s:%d\\n\", basename(copyinstr(arg0)), copyinstr(arg1), arg2);\n" +" self->indent++;\n" +"}\n" +"\n" +"python$target:::function-return\n" +"/self->trace/\n" +"{\n" +" self->indent--;\n" +" printf(\"%d\\t%*s:\", timestamp, 15, probename);\n" +" printf(\"%*s\", self->indent, \"\");\n" +" printf(\"%s:%s:%d\\n\", basename(copyinstr(arg0)), copyinstr(arg1), arg2);\n" +"}\n" +"\n" +"python$target:::function-return\n" +"/copyinstr(arg1) == \"start\"/\n" +"{\n" +" self->trace = 0;\n" +"}" +msgstr "" +"self int indent;\n" +"\n" +"python$target:::function-entry\n" +"/copyinstr(arg1) == \"start\"/\n" +"{\n" +" self->trace = 1;\n" +"}\n" +"\n" +"python$target:::function-entry\n" +"/self->trace/\n" +"{\n" +" printf(\"%d\\t%*s:\", timestamp, 15, probename);\n" +" printf(\"%*s\", self->indent, \"\");\n" +" printf(\"%s:%s:%d\\n\", basename(copyinstr(arg0)), copyinstr(arg1), arg2);\n" +" self->indent++;\n" +"}\n" +"\n" +"python$target:::function-return\n" +"/self->trace/\n" +"{\n" +" self->indent--;\n" +" printf(\"%d\\t%*s:\", timestamp, 15, probename);\n" +" printf(\"%*s\", self->indent, \"\");\n" +" printf(\"%s:%s:%d\\n\", basename(copyinstr(arg0)), copyinstr(arg1), arg2);\n" +"}\n" +"\n" +"python$target:::function-return\n" +"/copyinstr(arg1) == \"start\"/\n" +"{\n" +" self->trace = 0;\n" +"}" + +#: ../../howto/instrumentation.rst:172 ../../howto/instrumentation.rst:230 +msgid "It can be invoked like this::" +msgstr "它可以这样调用::" + +#: ../../howto/instrumentation.rst:174 +msgid "$ sudo dtrace -q -s call_stack.d -c \"python3.6 script.py\"" +msgstr "$ sudo dtrace -q -s call_stack.d -c \"python3.6 script.py\"" + +#: ../../howto/instrumentation.rst:176 ../../howto/instrumentation.rst:236 +msgid "The output looks like this:" +msgstr "输出结果会像这样:" + +#: ../../howto/instrumentation.rst:178 +msgid "" +"156641360502280 function-entry:call_stack.py:start:23\n" +"156641360518804 function-entry: call_stack.py:function_1:1\n" +"156641360532797 function-entry: call_stack.py:function_3:9\n" +"156641360546807 function-return: call_stack.py:function_3:10\n" +"156641360563367 function-return: call_stack.py:function_1:2\n" +"156641360578365 function-entry: call_stack.py:function_2:5\n" +"156641360591757 function-entry: call_stack.py:function_1:1\n" +"156641360605556 function-entry: call_stack.py:function_3:9\n" +"156641360617482 function-return: call_stack.py:function_3:10\n" +"156641360629814 function-return: call_stack.py:function_1:2\n" +"156641360642285 function-return: call_stack.py:function_2:6\n" +"156641360656770 function-entry: call_stack.py:function_3:9\n" +"156641360669707 function-return: call_stack.py:function_3:10\n" +"156641360687853 function-entry: call_stack.py:function_4:13\n" +"156641360700719 function-return: call_stack.py:function_4:14\n" +"156641360719640 function-entry: call_stack.py:function_5:18\n" +"156641360732567 function-return: call_stack.py:function_5:21\n" +"156641360747370 function-return:call_stack.py:start:28" +msgstr "" +"156641360502280 function-entry:call_stack.py:start:23\n" +"156641360518804 function-entry: call_stack.py:function_1:1\n" +"156641360532797 function-entry: call_stack.py:function_3:9\n" +"156641360546807 function-return: call_stack.py:function_3:10\n" +"156641360563367 function-return: call_stack.py:function_1:2\n" +"156641360578365 function-entry: call_stack.py:function_2:5\n" +"156641360591757 function-entry: call_stack.py:function_1:1\n" +"156641360605556 function-entry: call_stack.py:function_3:9\n" +"156641360617482 function-return: call_stack.py:function_3:10\n" +"156641360629814 function-return: call_stack.py:function_1:2\n" +"156641360642285 function-return: call_stack.py:function_2:6\n" +"156641360656770 function-entry: call_stack.py:function_3:9\n" +"156641360669707 function-return: call_stack.py:function_3:10\n" +"156641360687853 function-entry: call_stack.py:function_4:13\n" +"156641360700719 function-return: call_stack.py:function_4:14\n" +"156641360719640 function-entry: call_stack.py:function_5:18\n" +"156641360732567 function-return: call_stack.py:function_5:21\n" +"156641360747370 function-return:call_stack.py:start:28" + +#: ../../howto/instrumentation.rst:201 +msgid "Static SystemTap markers" +msgstr "静态 SystemTap 标记" + +#: ../../howto/instrumentation.rst:203 +msgid "" +"The low-level way to use the SystemTap integration is to use the static " +"markers directly. This requires you to explicitly state the binary file " +"containing them." +msgstr "使用 SystemTap 集成的底层方法是直接使用静态标记。这需要你显式地说明包含它们的二进制文件。" + +#: ../../howto/instrumentation.rst:207 +msgid "" +"For example, this SystemTap script can be used to show the call/return " +"hierarchy of a Python script:" +msgstr "例如,这个 SystemTap 脚本可以用来显示 Python 脚本的调用/返回层次结构:" + +#: ../../howto/instrumentation.rst:210 +msgid "" +"probe process(\"python\").mark(\"function__entry\") {\n" +" filename = user_string($arg1);\n" +" funcname = user_string($arg2);\n" +" lineno = $arg3;\n" +"\n" +" printf(\"%s => %s in %s:%d\\\\n\",\n" +" thread_indent(1), funcname, filename, lineno);\n" +"}\n" +"\n" +"probe process(\"python\").mark(\"function__return\") {\n" +" filename = user_string($arg1);\n" +" funcname = user_string($arg2);\n" +" lineno = $arg3;\n" +"\n" +" printf(\"%s <= %s in %s:%d\\\\n\",\n" +" thread_indent(-1), funcname, filename, lineno);\n" +"}" +msgstr "" +"probe process(\"python\").mark(\"function__entry\") {\n" +" filename = user_string($arg1);\n" +" funcname = user_string($arg2);\n" +" lineno = $arg3;\n" +"\n" +" printf(\"%s => %s in %s:%d\\\\n\",\n" +" thread_indent(1), funcname, filename, lineno);\n" +"}\n" +"\n" +"probe process(\"python\").mark(\"function__return\") {\n" +" filename = user_string($arg1);\n" +" funcname = user_string($arg2);\n" +" lineno = $arg3;\n" +"\n" +" printf(\"%s <= %s in %s:%d\\\\n\",\n" +" thread_indent(-1), funcname, filename, lineno);\n" +"}" + +#: ../../howto/instrumentation.rst:232 +msgid "" +"$ stap \\\n" +" show-call-hierarchy.stp \\\n" +" -c \"./python test.py\"" +msgstr "" +"$ stap \\\n" +" show-call-hierarchy.stp \\\n" +" -c \"./python test.py\"" + +#: ../../howto/instrumentation.rst:238 +msgid "" +"11408 python(8274): => __contains__ in Lib/_abcoll.py:362\n" +"11414 python(8274): => __getitem__ in Lib/os.py:425\n" +"11418 python(8274): => encode in Lib/os.py:490\n" +"11424 python(8274): <= encode in Lib/os.py:493\n" +"11428 python(8274): <= __getitem__ in Lib/os.py:426\n" +"11433 python(8274): <= __contains__ in Lib/_abcoll.py:366" +msgstr "" +"11408 python(8274): => __contains__ in Lib/_abcoll.py:362\n" +"11414 python(8274): => __getitem__ in Lib/os.py:425\n" +"11418 python(8274): => encode in Lib/os.py:490\n" +"11424 python(8274): <= encode in Lib/os.py:493\n" +"11428 python(8274): <= __getitem__ in Lib/os.py:426\n" +"11433 python(8274): <= __contains__ in Lib/_abcoll.py:366" + +#: ../../howto/instrumentation.rst:247 +msgid "where the columns are:" +msgstr "其中的列是:" + +#: ../../howto/instrumentation.rst:249 +msgid "time in microseconds since start of script" +msgstr "脚本开始后经过的微秒数" + +#: ../../howto/instrumentation.rst:250 +msgid "name of executable" +msgstr "可执行文件的名字" + +#: ../../howto/instrumentation.rst:251 +msgid "PID of process" +msgstr "进程的 PID" + +#: ../../howto/instrumentation.rst:253 +msgid "" +"and the remainder indicates the call/return hierarchy as the script " +"executes." +msgstr "其余部分则表示脚本执行时的调用/返回层次结构。" + +#: ../../howto/instrumentation.rst:255 +msgid "" +"For a :option:`--enable-shared` build of CPython, the markers are contained " +"within the libpython shared library, and the probe's dotted path needs to " +"reflect this. For example, this line from the above example:" +msgstr "" +"对于 CPython 的 :option:`--enable-shared` 编译版,这些标记包含在 libpython 共享库内部,并且 probe " +"的加点路径需要反映这个。例如,上述示例的这一行:" + +#: ../../howto/instrumentation.rst:259 +msgid "probe process(\"python\").mark(\"function__entry\") {" +msgstr "probe process(\"python\").mark(\"function__entry\") {" + +#: ../../howto/instrumentation.rst:263 +msgid "should instead read:" +msgstr "应改为:" + +#: ../../howto/instrumentation.rst:265 +msgid "" +"probe " +"process(\"python\").library(\"libpython3.6dm.so.1.0\").mark(\"function__entry\")" +" {" +msgstr "" +"probe " +"process(\"python\").library(\"libpython3.6dm.so.1.0\").mark(\"function__entry\")" +" {" + +#: ../../howto/instrumentation.rst:269 +msgid "(assuming a :ref:`debug build ` of CPython 3.6)" +msgstr "(假定为 CPython 3.6 的 :ref:`调试编译版 `)" + +#: ../../howto/instrumentation.rst:275 +msgid "Available static markers" +msgstr "可用的静态标记" + +#: ../../howto/instrumentation.rst:279 +msgid "" +"This marker indicates that execution of a Python function has begun. It is " +"only triggered for pure-Python (bytecode) functions." +msgstr "这个标记表示一个 Python 函数的执行已经开始。它只对纯 Python(字节码)函数触发。" + +#: ../../howto/instrumentation.rst:282 +msgid "" +"The filename, function name, and line number are provided back to the " +"tracing script as positional arguments, which must be accessed using " +"``$arg1``, ``$arg2``, ``$arg3``:" +msgstr "文件名、函数名和行号作为位置参数提供给跟踪脚本,必须使用 ``$arg1``, ``$arg2``, ``$arg3`` 访问:" + +#: ../../howto/instrumentation.rst:286 +msgid "" +"``$arg1`` : ``(const char *)`` filename, accessible using " +"``user_string($arg1)``" +msgstr "``$arg1`` : ``(const char *)`` 文件名,使用 ``user_string($arg1)`` 访问" + +#: ../../howto/instrumentation.rst:288 +msgid "" +"``$arg2`` : ``(const char *)`` function name, accessible using " +"``user_string($arg2)``" +msgstr "``$arg2`` : ``(const char *)`` 函数名,使用 ``user_string($arg2)`` 访问" + +#: ../../howto/instrumentation.rst:291 +msgid "``$arg3`` : ``int`` line number" +msgstr "``$arg3`` : ``int`` 行号" + +#: ../../howto/instrumentation.rst:295 +msgid "" +"This marker is the converse of :c:func:`!function__entry`, and indicates " +"that execution of a Python function has ended (either via ``return``, or via" +" an exception). It is only triggered for pure-Python (bytecode) functions." +msgstr "" +"这个标记与 :c:func:`!function__entry` 相反,表示 Python 函数的执行已经结束(通过 " +"``return``,或者通过异常)。它只会为纯 Python(字节码)函数触发。" + +#: ../../howto/instrumentation.rst:299 +msgid "The arguments are the same as for :c:func:`!function__entry`" +msgstr "参数与 :c:func:`!function__entry` 的相同" + +#: ../../howto/instrumentation.rst:303 +msgid "" +"This marker indicates a Python line is about to be executed. It is the " +"equivalent of line-by-line tracing with a Python profiler. It is not " +"triggered within C functions." +msgstr "这个标记表示一个 Python 行即将被执行。它相当于用 Python 分析器逐行追踪。它不会在 C 函数中触发。" + +#: ../../howto/instrumentation.rst:307 +msgid "The arguments are the same as for :c:func:`!function__entry`." +msgstr "参数与 :c:func:`!function__entry` 的相同。" + +#: ../../howto/instrumentation.rst:311 +msgid "" +"Fires when the Python interpreter starts a garbage collection cycle. " +"``arg0`` is the generation to scan, like :func:`gc.collect`." +msgstr "当 Python 解释器启动一个垃圾回收循环时触发。``arg0`` 是要扫描的代,与 :func:`gc.collect` 一样。" + +#: ../../howto/instrumentation.rst:316 +msgid "" +"Fires when the Python interpreter finishes a garbage collection cycle. " +"``arg0`` is the number of collected objects." +msgstr "当 Python 解释器完成一个垃圾回收循环时被触发。``arg0`` 是收集到的对象的数量。" + +#: ../../howto/instrumentation.rst:321 +msgid "" +"Fires before :mod:`importlib` attempts to find and load the module. ``arg0``" +" is the module name." +msgstr "在 :mod:`importlib` 试图查找并加载模块之前被触发。``arg0`` 是模块名称。" + +#: ../../howto/instrumentation.rst:328 +msgid "" +"Fires after :mod:`importlib`'s find_and_load function is called. ``arg0`` is" +" the module name, ``arg1`` indicates if module was successfully loaded." +msgstr "" +"在 :mod:`importlib` 的 find_and_load 函数被调用后被触发。``arg0`` 是模块名称,``arg1`` " +"表示模块是否成功加载。" + +#: ../../howto/instrumentation.rst:337 +msgid "" +"Fires when :func:`sys.audit` or :c:func:`PySys_Audit` is called. ``arg0`` is" +" the event name as C string, ``arg1`` is a :c:type:`PyObject` pointer to a " +"tuple object." +msgstr "" +"当 :func:`sys.audit` 或 :c:func:`PySys_Audit` 被调用时触发。``arg0`` 是事件名称的 C " +"字符串,``arg1`` 是一个指向元组对象的 :c:type:`PyObject` 指针。" + +#: ../../howto/instrumentation.rst:345 +msgid "C Entry Points" +msgstr "C 入口点" + +#: ../../howto/instrumentation.rst:347 +msgid "" +"To simplify triggering of DTrace markers, Python's C API comes with a number" +" of helper functions that mirror each static marker. On builds of Python " +"without DTrace enabled, these do nothing." +msgstr "" +"为了简化 DTrace 标记的触发,Python 的 C API 附带了许多映射至每个静态标记辅助函数。 在未启用 DTrace 的 Python " +"构建版中,它们将不做任何事。" + +#: ../../howto/instrumentation.rst:351 +msgid "" +"In general, it is not necessary to call these yourself, as Python will do it" +" for you." +msgstr "通常,你不需要自己调用这些辅助函数,因为 Python 会替你完成。" + +#: ../../howto/instrumentation.rst:358 +msgid "C API Function" +msgstr "C API 函数" + +#: ../../howto/instrumentation.rst:359 +msgid "Static Marker" +msgstr "静态标记" + +#: ../../howto/instrumentation.rst:360 +msgid "Notes" +msgstr "备注" + +#: ../../howto/instrumentation.rst:362 +msgid ":c:func:`!line`" +msgstr ":c:func:`!line`" + +#: ../../howto/instrumentation.rst:365 +msgid ":c:func:`!function__entry`" +msgstr ":c:func:`!function__entry`" + +#: ../../howto/instrumentation.rst:368 +msgid ":c:func:`!function__return`" +msgstr ":c:func:`!function__return`" + +#: ../../howto/instrumentation.rst:371 +msgid ":c:func:`!gc__start`" +msgstr ":c:func:`!gc__start`" + +#: ../../howto/instrumentation.rst:374 +msgid ":c:func:`!gc__done`" +msgstr ":c:func:`!gc__done`" + +#: ../../howto/instrumentation.rst:377 +msgid ":c:func:`!instance__new__start`" +msgstr ":c:func:`!instance__new__start`" + +#: ../../howto/instrumentation.rst:378 ../../howto/instrumentation.rst:381 +#: ../../howto/instrumentation.rst:384 ../../howto/instrumentation.rst:387 +msgid "Not used by Python" +msgstr "未被 Python 使用" + +#: ../../howto/instrumentation.rst:380 +msgid ":c:func:`!instance__new__done`" +msgstr ":c:func:`!instance__new__done`" + +#: ../../howto/instrumentation.rst:383 +msgid ":c:func:`!instance__delete__start`" +msgstr ":c:func:`!instance__delete__start`" + +#: ../../howto/instrumentation.rst:386 +msgid ":c:func:`!instance__delete__done`" +msgstr ":c:func:`!instance__delete__done`" + +#: ../../howto/instrumentation.rst:389 +msgid ":c:func:`!import__find__load__start`" +msgstr ":c:func:`!import__find__load__start`" + +#: ../../howto/instrumentation.rst:392 +msgid ":c:func:`!import__find__load__done`" +msgstr ":c:func:`!import__find__load__done`" + +#: ../../howto/instrumentation.rst:395 +msgid ":c:func:`!audit`" +msgstr ":c:func:`!audit`" + +#: ../../howto/instrumentation.rst:400 +msgid "C Probing Checks" +msgstr "" + +#: ../../howto/instrumentation.rst:415 +msgid "" +"All calls to ``PyDTrace`` functions must be guarded by a call to one of " +"these functions. This allows Python to minimize performance impact when " +"probing is disabled." +msgstr "" + +#: ../../howto/instrumentation.rst:419 +msgid "" +"On builds without DTrace enabled, these functions do nothing and return " +"``0``." +msgstr "" + +#: ../../howto/instrumentation.rst:423 +msgid "SystemTap Tapsets" +msgstr "SystemTap Tapsets" + +#: ../../howto/instrumentation.rst:425 +msgid "" +"The higher-level way to use the SystemTap integration is to use a " +"\"tapset\": SystemTap's equivalent of a library, which hides some of the " +"lower-level details of the static markers." +msgstr "" +"使用 SystemTap 集成的更高层次的方法是使用 \"tapset\" :SystemTap 中与库等效的概念,它隐藏了静态标记的一些底层细节。" + +#: ../../howto/instrumentation.rst:429 +msgid "Here is a tapset file, based on a non-shared build of CPython:" +msgstr "这里是一个基于 CPython 的非共享构建的 tapset 文件。" + +#: ../../howto/instrumentation.rst:431 +msgid "" +"/*\n" +" Provide a higher-level wrapping around the function__entry and\n" +" function__return markers:\n" +" \\*/\n" +"probe python.function.entry = process(\"python\").mark(\"function__entry\")\n" +"{\n" +" filename = user_string($arg1);\n" +" funcname = user_string($arg2);\n" +" lineno = $arg3;\n" +" frameptr = $arg4\n" +"}\n" +"probe python.function.return = process(\"python\").mark(\"function__return\")\n" +"{\n" +" filename = user_string($arg1);\n" +" funcname = user_string($arg2);\n" +" lineno = $arg3;\n" +" frameptr = $arg4\n" +"}" +msgstr "" +"/*\n" +" 提供对 function__entry 和 function__return 标记的高级封装\n" +" \\*/\n" +"probe python.function.entry = process(\"python\").mark(\"function__entry\")\n" +"{\n" +" filename = user_string($arg1);\n" +" funcname = user_string($arg2);\n" +" lineno = $arg3;\n" +" frameptr = $arg4\n" +"}\n" +"probe python.function.return = process(\"python\").mark(\"function__return\")\n" +"{\n" +" filename = user_string($arg1);\n" +" funcname = user_string($arg2);\n" +" lineno = $arg3;\n" +" frameptr = $arg4\n" +"}" + +#: ../../howto/instrumentation.rst:452 +msgid "" +"If this file is installed in SystemTap's tapset directory (e.g. " +"``/usr/share/systemtap/tapset``), then these additional probepoints become " +"available:" +msgstr "" +"如果这个文件安装在 SystemTap 的 tapset 目录下(例如 ``/usr/share/systemtap/tapset`` " +"),那么这些额外的探测点就会变得可用。" + +#: ../../howto/instrumentation.rst:458 +msgid "" +"This probe point indicates that execution of a Python function has begun. It" +" is only triggered for pure-Python (bytecode) functions." +msgstr "这个探针点表示一个 Python 函数的执行已经开始。它只对纯 Python(字节码)函数触发。" + +#: ../../howto/instrumentation.rst:463 +msgid "" +"This probe point is the converse of ``python.function.return``, and " +"indicates that execution of a Python function has ended (either via " +"``return``, or via an exception). It is only triggered for pure-Python " +"(bytecode) functions." +msgstr "" +"这个探针点是 ``python.function.return`` 的反义操作,表示一个 Python 函数的执行已经结束(或是通过 " +"``return``,或是通过异常)。它只会针对纯 Python(字节码)函数触发。" + +#: ../../howto/instrumentation.rst:470 +msgid "Examples" +msgstr "例子" + +#: ../../howto/instrumentation.rst:471 +msgid "" +"This SystemTap script uses the tapset above to more cleanly implement the " +"example given above of tracing the Python function-call hierarchy, without " +"needing to directly name the static markers:" +msgstr "" +"这个 SystemTap 脚本使用上面的 tapset 来更清晰地实现上面给出的跟踪 Python 函数调用层次结构的例子,而不需要直接命名静态标记。" + +#: ../../howto/instrumentation.rst:475 +msgid "" +"probe python.function.entry\n" +"{\n" +" printf(\"%s => %s in %s:%d\\n\",\n" +" thread_indent(1), funcname, filename, lineno);\n" +"}\n" +"\n" +"probe python.function.return\n" +"{\n" +" printf(\"%s <= %s in %s:%d\\n\",\n" +" thread_indent(-1), funcname, filename, lineno);\n" +"}" +msgstr "" +"probe python.function.entry\n" +"{\n" +" printf(\"%s => %s in %s:%d\\n\",\n" +" thread_indent(1), funcname, filename, lineno);\n" +"}\n" +"\n" +"probe python.function.return\n" +"{\n" +" printf(\"%s <= %s in %s:%d\\n\",\n" +" thread_indent(-1), funcname, filename, lineno);\n" +"}" + +#: ../../howto/instrumentation.rst:490 +msgid "" +"The following script uses the tapset above to provide a top-like view of all" +" running CPython code, showing the top 20 most frequently entered bytecode " +"frames, each second, across the whole system:" +msgstr "" +"下面的脚本使用上面的 tapset 来提供所有运行中的 CPython 代码的类似 top 的视图,显示了整个系统中每一秒内前 20 " +"个最频繁进入的字节码帧:" + +#: ../../howto/instrumentation.rst:494 +msgid "" +"global fn_calls;\n" +"\n" +"probe python.function.entry\n" +"{\n" +" fn_calls[pid(), filename, funcname, lineno] += 1;\n" +"}\n" +"\n" +"probe timer.ms(1000) {\n" +" printf(\"\\033[2J\\033[1;1H\") /* clear screen \\*/\n" +" printf(\"%6s %80s %6s %30s %6s\\n\",\n" +" \"PID\", \"FILENAME\", \"LINE\", \"FUNCTION\", \"CALLS\")\n" +" foreach ([pid, filename, funcname, lineno] in fn_calls- limit 20) {\n" +" printf(\"%6d %80s %6d %30s %6d\\n\",\n" +" pid, filename, lineno, funcname,\n" +" fn_calls[pid, filename, funcname, lineno]);\n" +" }\n" +" delete fn_calls;\n" +"}" +msgstr "" +"global fn_calls;\n" +"\n" +"probe python.function.entry\n" +"{\n" +" fn_calls[pid(), filename, funcname, lineno] += 1;\n" +"}\n" +"\n" +"probe timer.ms(1000) {\n" +" printf(\"\\033[2J\\033[1;1H\") /* clear screen \\*/\n" +" printf(\"%6s %80s %6s %30s %6s\\n\",\n" +" \"PID\", \"FILENAME\", \"LINE\", \"FUNCTION\", \"CALLS\")\n" +" foreach ([pid, filename, funcname, lineno] in fn_calls- limit 20) {\n" +" printf(\"%6d %80s %6d %30s %6d\\n\",\n" +" pid, filename, lineno, funcname,\n" +" fn_calls[pid, filename, funcname, lineno]);\n" +" }\n" +" delete fn_calls;\n" +"}" diff --git a/howto/ipaddress.po b/howto/ipaddress.po new file mode 100644 index 0000000000..83826f06b2 --- /dev/null +++ b/howto/ipaddress.po @@ -0,0 +1,627 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../howto/ipaddress.rst:9 +msgid "An introduction to the ipaddress module" +msgstr "ipaddress 模块介绍" + +#: ../../howto/ipaddress.rst:0 +msgid "author" +msgstr "作者" + +#: ../../howto/ipaddress.rst:11 +msgid "Peter Moody" +msgstr "Peter Moody" + +#: ../../howto/ipaddress.rst:12 +msgid "Nick Coghlan" +msgstr "Nick Coghlan" + +#: ../../howto/ipaddress.rst-1 +msgid "Overview" +msgstr "概述" + +#: ../../howto/ipaddress.rst:16 +msgid "" +"This document aims to provide a gentle introduction to the :mod:`ipaddress` " +"module. It is aimed primarily at users that aren't already familiar with IP " +"networking terminology, but may also be useful to network engineers wanting " +"an overview of how :mod:`ipaddress` represents IP network addressing " +"concepts." +msgstr "" +"本文档旨在简要介绍 :mod:`ipaddress` 模块。它主要针对那些不熟悉 IP 网络术语的用户,但也可能对想要速览 " +":mod:`ipaddress` 如何代表 IP 网络寻址概念的网络工程师有用。" + +#: ../../howto/ipaddress.rst:24 +msgid "Creating Address/Network/Interface objects" +msgstr "创建 Address/Network/Interface 对象" + +#: ../../howto/ipaddress.rst:26 +msgid "" +"Since :mod:`ipaddress` is a module for inspecting and manipulating IP " +"addresses, the first thing you'll want to do is create some objects. You " +"can use :mod:`ipaddress` to create objects from strings and integers." +msgstr "" +"因为 :mod:`ipaddress` 是一个用于检查和操作 IP 地址的模块,你要做的第一件事就是创建一些对象。您可以使用 " +":mod:`ipaddress` 从字符串和整数创建对象。" + +#: ../../howto/ipaddress.rst:32 +msgid "A Note on IP Versions" +msgstr "关于 IP 版本的说明" + +#: ../../howto/ipaddress.rst:34 +msgid "" +"For readers that aren't particularly familiar with IP addressing, it's " +"important to know that the Internet Protocol (IP) is currently in the " +"process of moving from version 4 of the protocol to version 6. This " +"transition is occurring largely because version 4 of the protocol doesn't " +"provide enough addresses to handle the needs of the whole world, especially " +"given the increasing number of devices with direct connections to the " +"internet." +msgstr "" +"对于不太熟悉 IP 寻址的读者来说,重要的一点是知道互联网协议 (IP) 目前正在从第 4 版协议迁移到第 6 版。进行这样的迁移主要是因为第 4 " +"版协议无法提供足够的地址来满足全世界的需求,特别是考虑到有越来越多的设备连接到了互联网中。" + +#: ../../howto/ipaddress.rst:41 +msgid "" +"Explaining the details of the differences between the two versions of the " +"protocol is beyond the scope of this introduction, but readers need to at " +"least be aware that these two versions exist, and it will sometimes be " +"necessary to force the use of one version or the other." +msgstr "解释协议的两个版本之间的差异的细节超出了本介绍的范围,但读者需要至少知道存在这两个版本,并且有时需要强制使用其中一个版本。" + +#: ../../howto/ipaddress.rst:48 +msgid "IP Host Addresses" +msgstr "IP 主机地址" + +#: ../../howto/ipaddress.rst:50 +msgid "" +"Addresses, often referred to as \"host addresses\" are the most basic unit " +"when working with IP addressing. The simplest way to create addresses is to " +"use the :func:`ipaddress.ip_address` factory function, which automatically " +"determines whether to create an IPv4 or IPv6 address based on the passed in " +"value:" +msgstr "" +"通常称为“主机地址”的地址是使用 IP 寻址时最基本的单元。创建地址的最简单方法是使用 :func:`ipaddress.ip_address` " +"工厂函数,该函数根据传入的值自动确定是创建 IPv4 还是 IPv6 地址:" + +#: ../../howto/ipaddress.rst:61 +msgid "" +"Addresses can also be created directly from integers. Values that will fit " +"within 32 bits are assumed to be IPv4 addresses::" +msgstr "地址也可以直接从整数创建。适合 32 位的值会被假定为 IPv4 地址::" + +#: ../../howto/ipaddress.rst:64 +msgid "" +">>> ipaddress.ip_address(3221225985)\n" +"IPv4Address('192.0.2.1')\n" +">>> ipaddress.ip_address(42540766411282592856903984951653826561)\n" +"IPv6Address('2001:db8::1')" +msgstr "" +">>> ipaddress.ip_address(3221225985)\n" +"IPv4Address('192.0.2.1')\n" +">>> ipaddress.ip_address(42540766411282592856903984951653826561)\n" +"IPv6Address('2001:db8::1')" + +#: ../../howto/ipaddress.rst:69 +msgid "" +"To force the use of IPv4 or IPv6 addresses, the relevant classes can be " +"invoked directly. This is particularly useful to force creation of IPv6 " +"addresses for small integers::" +msgstr "要强制使用 IPv4 或 IPv6 地址,可以直接调用相关的类。这对于强制为小整数创建 IPv6 地址特别有用::" + +#: ../../howto/ipaddress.rst:73 +msgid "" +">>> ipaddress.ip_address(1)\n" +"IPv4Address('0.0.0.1')\n" +">>> ipaddress.IPv4Address(1)\n" +"IPv4Address('0.0.0.1')\n" +">>> ipaddress.IPv6Address(1)\n" +"IPv6Address('::1')" +msgstr "" +">>> ipaddress.ip_address(1)\n" +"IPv4Address('0.0.0.1')\n" +">>> ipaddress.IPv4Address(1)\n" +"IPv4Address('0.0.0.1')\n" +">>> ipaddress.IPv6Address(1)\n" +"IPv6Address('::1')" + +#: ../../howto/ipaddress.rst:82 +msgid "Defining Networks" +msgstr "定义网络" + +#: ../../howto/ipaddress.rst:84 +msgid "" +"Host addresses are usually grouped together into IP networks, so " +":mod:`ipaddress` provides a way to create, inspect and manipulate network " +"definitions. IP network objects are constructed from strings that define the" +" range of host addresses that are part of that network. The simplest form " +"for that information is a \"network address/network prefix\" pair, where the" +" prefix defines the number of leading bits that are compared to determine " +"whether or not an address is part of the network and the network address " +"defines the expected value of those bits." +msgstr "" +"主机地址通常组合在一起形成 IP 网络,因此 :mod:`ipaddress` 提供了一种创建、检查和操作网络定义的方法。 IP " +"网络对象由字符串构成,这些字符串定义作为该网络一部分的主机地址范围。 " +"该信息的最简单形式是“网络地址/网络前缀”对,其中前缀定义了比较的前导比特数,以确定地址是否是网络的一部分,并且网络地址定义了那些位的预期值。" + +#: ../../howto/ipaddress.rst:93 +msgid "" +"As for addresses, a factory function is provided that determines the correct" +" IP version automatically::" +msgstr "对于地址,提供了一个自动确定正确 IP 版本的工厂函数::" + +#: ../../howto/ipaddress.rst:96 +msgid "" +">>> ipaddress.ip_network('192.0.2.0/24')\n" +"IPv4Network('192.0.2.0/24')\n" +">>> ipaddress.ip_network('2001:db8::0/96')\n" +"IPv6Network('2001:db8::/96')" +msgstr "" +">>> ipaddress.ip_network('192.0.2.0/24')\n" +"IPv4Network('192.0.2.0/24')\n" +">>> ipaddress.ip_network('2001:db8::0/96')\n" +"IPv6Network('2001:db8::/96')" + +#: ../../howto/ipaddress.rst:101 +msgid "" +"Network objects cannot have any host bits set. The practical effect of this" +" is that ``192.0.2.1/24`` does not describe a network. Such definitions are" +" referred to as interface objects since the ip-on-a-network notation is " +"commonly used to describe network interfaces of a computer on a given " +"network and are described further in the next section." +msgstr "" +"网络对象不能设置任何主机位。这样做的实际效果是 ``192.0.2.1/24`` 没有描述网络。 这种定义被称为接口对象,因为网络上 IP " +"表示法通常用于描述给定网络上的计算机的网络接口,并在下一节中进一步描述。" + +#: ../../howto/ipaddress.rst:107 +msgid "" +"By default, attempting to create a network object with host bits set will " +"result in :exc:`ValueError` being raised. To request that the additional " +"bits instead be coerced to zero, the flag ``strict=False`` can be passed to " +"the constructor::" +msgstr "" +"默认情况下,尝试创建一个设置了主机位的网络对象将导致 :exc:`ValueError` 被引发。要请求将附加位强制为零,可以将标志 " +"``strict=False`` 传递给构造函数::" + +#: ../../howto/ipaddress.rst:112 +msgid "" +">>> ipaddress.ip_network('192.0.2.1/24')\n" +"Traceback (most recent call last):\n" +" ...\n" +"ValueError: 192.0.2.1/24 has host bits set\n" +">>> ipaddress.ip_network('192.0.2.1/24', strict=False)\n" +"IPv4Network('192.0.2.0/24')" +msgstr "" +">>> ipaddress.ip_network('192.0.2.1/24')\n" +"Traceback (most recent call last):\n" +" ...\n" +"ValueError: 192.0.2.1/24 has host bits set\n" +">>> ipaddress.ip_network('192.0.2.1/24', strict=False)\n" +"IPv4Network('192.0.2.0/24')" + +#: ../../howto/ipaddress.rst:119 +msgid "" +"While the string form offers significantly more flexibility, networks can " +"also be defined with integers, just like host addresses. In this case, the " +"network is considered to contain only the single address identified by the " +"integer, so the network prefix includes the entire network address::" +msgstr "" +"虽然字符串形式提供了更大的灵活性,但网络也可以用整数定义,就像主机地址一样。 " +"在这种情况下,网络被认为只包含由整数标识的单个地址,因此网络前缀包括整个网络地址::" + +#: ../../howto/ipaddress.rst:124 +msgid "" +">>> ipaddress.ip_network(3221225984)\n" +"IPv4Network('192.0.2.0/32')\n" +">>> ipaddress.ip_network(42540766411282592856903984951653826560)\n" +"IPv6Network('2001:db8::/128')" +msgstr "" +">>> ipaddress.ip_network(3221225984)\n" +"IPv4Network('192.0.2.0/32')\n" +">>> ipaddress.ip_network(42540766411282592856903984951653826560)\n" +"IPv6Network('2001:db8::/128')" + +#: ../../howto/ipaddress.rst:129 +msgid "" +"As with addresses, creation of a particular kind of network can be forced by" +" calling the class constructor directly instead of using the factory " +"function." +msgstr "与地址一样,可以通过直接调用类构造函数而不是使用工厂函数来强制创建特定类型的网络。" + +#: ../../howto/ipaddress.rst:135 +msgid "Host Interfaces" +msgstr "主机接口" + +#: ../../howto/ipaddress.rst:137 +msgid "" +"As mentioned just above, if you need to describe an address on a particular " +"network, neither the address nor the network classes are sufficient. " +"Notation like ``192.0.2.1/24`` is commonly used by network engineers and the" +" people who write tools for firewalls and routers as shorthand for \"the " +"host ``192.0.2.1`` on the network ``192.0.2.0/24``\", Accordingly, " +":mod:`ipaddress` provides a set of hybrid classes that associate an address " +"with a particular network. The interface for creation is identical to that " +"for defining network objects, except that the address portion isn't " +"constrained to being a network address." +msgstr "" +"如上所述,如果您需要描述特定网络上的地址,则地址和网络类都不够。像 ``192.0.2.1/24`` " +"这样的表示法通常被网络工程师和为防火墙和路由器编写工具的人用作“ ``192.0.2.0/24`` 网络上的主机 ``192.0.2.1`` " +"”的简写。因此,:mod:`ipaddress` " +"提供了一组将地址与特定网络相关联的混合类。用于创建的接口与用于定义网络对象的接口相同,除了地址部分不限于是网络地址。" + +#: ../../howto/ipaddress.rst:152 +msgid "" +"Integer inputs are accepted (as with networks), and use of a particular IP " +"version can be forced by calling the relevant constructor directly." +msgstr "接受整数输入(与网络一样),并且可以通过直接调用相关构造函数来强制使用特定 IP 版本。" + +#: ../../howto/ipaddress.rst:157 +msgid "Inspecting Address/Network/Interface Objects" +msgstr "审查 Address/Network/Interface 对象" + +#: ../../howto/ipaddress.rst:159 +msgid "" +"You've gone to the trouble of creating an " +"IPv(4|6)(Address|Network|Interface) object, so you probably want to get " +"information about it. :mod:`ipaddress` tries to make doing this easy and " +"intuitive." +msgstr "" +"你已经费心创建了 IPv(4|6)(Address|Network|Interface) 对象,因此你可能希望获得有关它的信息。 " +":mod:`ipaddress` 试图让这个过程变得简单直观。" + +#: ../../howto/ipaddress.rst:163 +msgid "Extracting the IP version::" +msgstr "提取 IP 版本::" + +#: ../../howto/ipaddress.rst:165 +msgid "" +">>> addr4 = ipaddress.ip_address('192.0.2.1')\n" +">>> addr6 = ipaddress.ip_address('2001:db8::1')\n" +">>> addr6.version\n" +"6\n" +">>> addr4.version\n" +"4" +msgstr "" +">>> addr4 = ipaddress.ip_address('192.0.2.1')\n" +">>> addr6 = ipaddress.ip_address('2001:db8::1')\n" +">>> addr6.version\n" +"6\n" +">>> addr4.version\n" +"4" + +#: ../../howto/ipaddress.rst:172 +msgid "Obtaining the network from an interface::" +msgstr "从接口获取网络::" + +#: ../../howto/ipaddress.rst:174 +msgid "" +">>> host4 = ipaddress.ip_interface('192.0.2.1/24')\n" +">>> host4.network\n" +"IPv4Network('192.0.2.0/24')\n" +">>> host6 = ipaddress.ip_interface('2001:db8::1/96')\n" +">>> host6.network\n" +"IPv6Network('2001:db8::/96')" +msgstr "" +">>> host4 = ipaddress.ip_interface('192.0.2.1/24')\n" +">>> host4.network\n" +"IPv4Network('192.0.2.0/24')\n" +">>> host6 = ipaddress.ip_interface('2001:db8::1/96')\n" +">>> host6.network\n" +"IPv6Network('2001:db8::/96')" + +#: ../../howto/ipaddress.rst:181 +msgid "Finding out how many individual addresses are in a network::" +msgstr "找出网络中有多少独立地址::" + +#: ../../howto/ipaddress.rst:183 +msgid "" +">>> net4 = ipaddress.ip_network('192.0.2.0/24')\n" +">>> net4.num_addresses\n" +"256\n" +">>> net6 = ipaddress.ip_network('2001:db8::0/96')\n" +">>> net6.num_addresses\n" +"4294967296" +msgstr "" +">>> net4 = ipaddress.ip_network('192.0.2.0/24')\n" +">>> net4.num_addresses\n" +"256\n" +">>> net6 = ipaddress.ip_network('2001:db8::0/96')\n" +">>> net6.num_addresses\n" +"4294967296" + +#: ../../howto/ipaddress.rst:190 +msgid "Iterating through the \"usable\" addresses on a network::" +msgstr "迭代网络上的“可用”地址::" + +#: ../../howto/ipaddress.rst:192 +msgid "" +">>> net4 = ipaddress.ip_network('192.0.2.0/24')\n" +">>> for x in net4.hosts():\n" +"... print(x)\n" +"192.0.2.1\n" +"192.0.2.2\n" +"192.0.2.3\n" +"192.0.2.4\n" +"...\n" +"192.0.2.252\n" +"192.0.2.253\n" +"192.0.2.254" +msgstr "" +">>> net4 = ipaddress.ip_network('192.0.2.0/24')\n" +">>> for x in net4.hosts():\n" +"... print(x)\n" +"192.0.2.1\n" +"192.0.2.2\n" +"192.0.2.3\n" +"192.0.2.4\n" +"...\n" +"192.0.2.252\n" +"192.0.2.253\n" +"192.0.2.254" + +#: ../../howto/ipaddress.rst:205 +msgid "" +"Obtaining the netmask (i.e. set bits corresponding to the network prefix) or" +" the hostmask (any bits that are not part of the netmask):" +msgstr "获取网络掩码(即对应于网络前缀的设置位)或主机掩码(不属于网络掩码的任何位):" + +#: ../../howto/ipaddress.rst:220 +msgid "Exploding or compressing the address::" +msgstr "展开或压缩地址::" + +#: ../../howto/ipaddress.rst:222 +msgid "" +">>> addr6.exploded\n" +"'2001:0db8:0000:0000:0000:0000:0000:0001'\n" +">>> addr6.compressed\n" +"'2001:db8::1'\n" +">>> net6.exploded\n" +"'2001:0db8:0000:0000:0000:0000:0000:0000/96'\n" +">>> net6.compressed\n" +"'2001:db8::/96'" +msgstr "" +">>> addr6.exploded\n" +"'2001:0db8:0000:0000:0000:0000:0000:0001'\n" +">>> addr6.compressed\n" +"'2001:db8::1'\n" +">>> net6.exploded\n" +"'2001:0db8:0000:0000:0000:0000:0000:0000/96'\n" +">>> net6.compressed\n" +"'2001:db8::/96'" + +#: ../../howto/ipaddress.rst:231 +msgid "" +"While IPv4 doesn't support explosion or compression, the associated objects " +"still provide the relevant properties so that version neutral code can " +"easily ensure the most concise or most verbose form is used for IPv6 " +"addresses while still correctly handling IPv4 addresses." +msgstr "" +"虽然 IPv4 不支持展开或压缩,但关联对象仍提供相关属性,因此版本中性代码可以轻松确保最简洁或最详细的形式用于 IPv6 地址,同时仍能正确处理 " +"IPv4 地址。" + +#: ../../howto/ipaddress.rst:238 +msgid "Networks as lists of Addresses" +msgstr "Network 作为 Address 列表" + +#: ../../howto/ipaddress.rst:240 +msgid "" +"It's sometimes useful to treat networks as lists. This means it is possible" +" to index them like this::" +msgstr "将网络视为列表有时很有用。这意味着可以像这样对它们进行索引::" + +#: ../../howto/ipaddress.rst:243 +msgid "" +">>> net4[1]\n" +"IPv4Address('192.0.2.1')\n" +">>> net4[-1]\n" +"IPv4Address('192.0.2.255')\n" +">>> net6[1]\n" +"IPv6Address('2001:db8::1')\n" +">>> net6[-1]\n" +"IPv6Address('2001:db8::ffff:ffff')" +msgstr "" +">>> net4[1]\n" +"IPv4Address('192.0.2.1')\n" +">>> net4[-1]\n" +"IPv4Address('192.0.2.255')\n" +">>> net6[1]\n" +"IPv6Address('2001:db8::1')\n" +">>> net6[-1]\n" +"IPv6Address('2001:db8::ffff:ffff')" + +#: ../../howto/ipaddress.rst:253 +msgid "" +"It also means that network objects lend themselves to using the list " +"membership test syntax like this::" +msgstr "它还意味着网络对象可以使用像这样的列表成员测试语法::" + +#: ../../howto/ipaddress.rst:256 +msgid "" +"if address in network:\n" +" # do something" +msgstr "" +"if address in network:\n" +" # 执行某种操作" + +#: ../../howto/ipaddress.rst:259 +msgid "Containment testing is done efficiently based on the network prefix::" +msgstr "根据网络前缀有效地完成包含性测试::" + +#: ../../howto/ipaddress.rst:261 +msgid "" +">>> addr4 = ipaddress.ip_address('192.0.2.1')\n" +">>> addr4 in ipaddress.ip_network('192.0.2.0/24')\n" +"True\n" +">>> addr4 in ipaddress.ip_network('192.0.3.0/24')\n" +"False" +msgstr "" +">>> addr4 = ipaddress.ip_address('192.0.2.1')\n" +">>> addr4 in ipaddress.ip_network('192.0.2.0/24')\n" +"True\n" +">>> addr4 in ipaddress.ip_network('192.0.3.0/24')\n" +"False" + +#: ../../howto/ipaddress.rst:269 +msgid "Comparisons" +msgstr "比较运算" + +#: ../../howto/ipaddress.rst:271 +msgid "" +":mod:`ipaddress` provides some simple, hopefully intuitive ways to compare " +"objects, where it makes sense::" +msgstr ":mod:`ipaddress` 提供了一些简单、直观的方式来比较对象(在有意义的情况下)::" + +#: ../../howto/ipaddress.rst:274 +msgid "" +">>> ipaddress.ip_address('192.0.2.1') < ipaddress.ip_address('192.0.2.2')\n" +"True" +msgstr "" +">>> ipaddress.ip_address('192.0.2.1') < ipaddress.ip_address('192.0.2.2')\n" +"True" + +#: ../../howto/ipaddress.rst:277 +msgid "" +"A :exc:`TypeError` exception is raised if you try to compare objects of " +"different versions or different types." +msgstr "如果你尝试比较不同版本或不同类型的对象,则会引发 :exc:`TypeError` 异常。" + +#: ../../howto/ipaddress.rst:282 +msgid "Using IP Addresses with other modules" +msgstr "将 IP 地址与其他模块一起使用" + +#: ../../howto/ipaddress.rst:284 +msgid "" +"Other modules that use IP addresses (such as :mod:`socket`) usually won't " +"accept objects from this module directly. Instead, they must be coerced to " +"an integer or string that the other module will accept::" +msgstr "" +"其他使用 IP 地址的模块 (例如 :mod:`socket`) 通常不会直接接受来自该模块的对象。 " +"相反,它们必须被强制转换为另一个模块可接受的整数或字符串::" + +#: ../../howto/ipaddress.rst:288 +msgid "" +">>> addr4 = ipaddress.ip_address('192.0.2.1')\n" +">>> str(addr4)\n" +"'192.0.2.1'\n" +">>> int(addr4)\n" +"3221225985" +msgstr "" +">>> addr4 = ipaddress.ip_address('192.0.2.1')\n" +">>> str(addr4)\n" +"'192.0.2.1'\n" +">>> int(addr4)\n" +"3221225985" + +#: ../../howto/ipaddress.rst:296 +msgid "Getting more detail when instance creation fails" +msgstr "实例创建失败时获取更多详细信息" + +#: ../../howto/ipaddress.rst:298 +msgid "" +"When creating address/network/interface objects using the version-agnostic " +"factory functions, any errors will be reported as :exc:`ValueError` with a " +"generic error message that simply says the passed in value was not " +"recognized as an object of that type. The lack of a specific error is " +"because it's necessary to know whether the value is *supposed* to be IPv4 or" +" IPv6 in order to provide more detail on why it has been rejected." +msgstr "" +"使用与版本无关的工厂函数创建 address/network/interface 对象时,任何错误都将报告为 :exc:`ValueError` " +",带有一般错误消息,只是说传入的值未被识别为该类型的对象。缺少特定错误是因为需要知道该值*应该*是 IPv4 还是 " +"IPv6,才能提供有关其被拒绝原因的更多详细信息。" + +#: ../../howto/ipaddress.rst:305 +msgid "" +"To support use cases where it is useful to have access to this additional " +"detail, the individual class constructors actually raise the " +":exc:`ValueError` subclasses :exc:`ipaddress.AddressValueError` and " +":exc:`ipaddress.NetmaskValueError` to indicate exactly which part of the " +"definition failed to parse correctly." +msgstr "" +"为了支持访问这些额外细节的用例,各个类构造函数实际上引发了 :exc:`ValueError` 子类 " +":exc:`ipaddress.AddressValueError` 和 :exc:`ipaddress.NetmaskValueError` " +"以准确指示定义的哪一部分无法正确解析。" + +#: ../../howto/ipaddress.rst:311 +msgid "" +"The error messages are significantly more detailed when using the class " +"constructors directly. For example::" +msgstr "直接使用类构造函数时,错误消息更加详细。例如::" + +#: ../../howto/ipaddress.rst:314 +msgid "" +">>> ipaddress.ip_address(\"192.168.0.256\")\n" +"Traceback (most recent call last):\n" +" ...\n" +"ValueError: '192.168.0.256' does not appear to be an IPv4 or IPv6 address\n" +">>> ipaddress.IPv4Address(\"192.168.0.256\")\n" +"Traceback (most recent call last):\n" +" ...\n" +"ipaddress.AddressValueError: Octet 256 (> 255) not permitted in '192.168.0.256'\n" +"\n" +">>> ipaddress.ip_network(\"192.168.0.1/64\")\n" +"Traceback (most recent call last):\n" +" ...\n" +"ValueError: '192.168.0.1/64' does not appear to be an IPv4 or IPv6 network\n" +">>> ipaddress.IPv4Network(\"192.168.0.1/64\")\n" +"Traceback (most recent call last):\n" +" ...\n" +"ipaddress.NetmaskValueError: '64' is not a valid netmask" +msgstr "" +">>> ipaddress.ip_address(\"192.168.0.256\")\n" +"Traceback (most recent call last):\n" +" ...\n" +"ValueError: '192.168.0.256' does not appear to be an IPv4 or IPv6 address\n" +">>> ipaddress.IPv4Address(\"192.168.0.256\")\n" +"Traceback (most recent call last):\n" +" ...\n" +"ipaddress.AddressValueError: Octet 256 (> 255) not permitted in '192.168.0.256'\n" +"\n" +">>> ipaddress.ip_network(\"192.168.0.1/64\")\n" +"Traceback (most recent call last):\n" +" ...\n" +"ValueError: '192.168.0.1/64' does not appear to be an IPv4 or IPv6 network\n" +">>> ipaddress.IPv4Network(\"192.168.0.1/64\")\n" +"Traceback (most recent call last):\n" +" ...\n" +"ipaddress.NetmaskValueError: '64' is not a valid netmask" + +#: ../../howto/ipaddress.rst:332 +msgid "" +"However, both of the module specific exceptions have :exc:`ValueError` as " +"their parent class, so if you're not concerned with the particular type of " +"error, you can still write code like the following::" +msgstr "" +"但是,两个模块特定的异常都有 :exc:`ValueError` 作为它们的父类,所以如果你不关心特定类型的错误,你仍然可以编写如下代码::" + +#: ../../howto/ipaddress.rst:336 +msgid "" +"try:\n" +" network = ipaddress.IPv4Network(address)\n" +"except ValueError:\n" +" print('address/netmask is invalid for IPv4:', address)" +msgstr "" +"try:\n" +" network = ipaddress.IPv4Network(address)\n" +"except ValueError:\n" +" print('address/netmask is invalid for IPv4:', address)" diff --git a/howto/isolating-extensions.po b/howto/isolating-extensions.po new file mode 100644 index 0000000000..5925b2495b --- /dev/null +++ b/howto/isolating-extensions.po @@ -0,0 +1,1167 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../howto/isolating-extensions.rst:7 +msgid "Isolating Extension Modules" +msgstr "隔离扩展模块" + +#: ../../howto/isolating-extensions.rst-1 +msgid "Abstract" +msgstr "摘要" + +#: ../../howto/isolating-extensions.rst:11 +msgid "" +"Traditionally, state belonging to Python extension modules was kept in C " +"``static`` variables, which have process-wide scope. This document describes" +" problems of such per-process state and shows a safer way: per-module state." +msgstr "" +"在传统上,属于 Python 扩展模块的状态都是保存为 C ``static`` 变量,它们具有进程级的作用域。 " +"本文档描述了此类进程级状态的问题并演示了一种更安全的方式:模块级状态。" + +#: ../../howto/isolating-extensions.rst:16 +msgid "" +"The document also describes how to switch to per-module state where " +"possible. This transition involves allocating space for that state, " +"potentially switching from static types to heap types, and—perhaps most " +"importantly—accessing per-module state from code." +msgstr "" +"本文档还描述了如何在可能的情况下切换到模块级状态。这种转换涉及为状态分配空间、从静态类型到堆类型的潜在切换,以及 — 也许是最重要的 — " +"从代码访问模块级状态。" + +#: ../../howto/isolating-extensions.rst:23 +msgid "Who should read this" +msgstr "谁应当阅读本文档" + +#: ../../howto/isolating-extensions.rst:25 +msgid "" +"This guide is written for maintainers of :ref:`C-API ` " +"extensions who would like to make that extension safer to use in " +"applications where Python itself is used as a library." +msgstr "" +"本指南是针对想要让扩展更安全地在将 Python 本身用作库的应用程序中使用的 :ref:`C-API ` 扩展维护者撰写的。" + +#: ../../howto/isolating-extensions.rst:31 +msgid "Background" +msgstr "背景" + +#: ../../howto/isolating-extensions.rst:33 +msgid "" +"An *interpreter* is the context in which Python code runs. It contains " +"configuration (e.g. the import path) and runtime state (e.g. the set of " +"imported modules)." +msgstr "*解释器* 是 Python 代码运行所在的上下文。它包含配置(例如导入路径)和运行时状态(例如已导入模块的集合)。" + +#: ../../howto/isolating-extensions.rst:37 +msgid "" +"Python supports running multiple interpreters in one process. There are two " +"cases to think about—users may run interpreters:" +msgstr "Python 支持在一个进程中运行多个解释器。这里有两种情况需要考虑 — 用户可能会以下列方式运行解释器:" + +#: ../../howto/isolating-extensions.rst:40 +msgid "" +"in sequence, with several :c:func:`Py_InitializeEx`/:c:func:`Py_FinalizeEx` " +"cycles, and" +msgstr "串行,使用多个 :c:func:`Py_InitializeEx`/:c:func:`Py_FinalizeEx` 循环,以及" + +#: ../../howto/isolating-extensions.rst:42 +msgid "" +"in parallel, managing \"sub-interpreters\" using " +":c:func:`Py_NewInterpreter`/:c:func:`Py_EndInterpreter`." +msgstr "" +"并行,使用 :c:func:`Py_NewInterpreter`/:c:func:`Py_EndInterpreter` 管理多个“子解释器”。" + +#: ../../howto/isolating-extensions.rst:45 +msgid "" +"Both cases (and combinations of them) would be most useful when embedding " +"Python within a library. Libraries generally shouldn't make assumptions " +"about the application that uses them, which include assuming a process-wide " +"\"main Python interpreter\"." +msgstr "" +"这两种情况(以及它们的组合)最适用于将 Python 嵌入到某个库中。库通常不应假定使用它们的应用程序,这包括假定存在一个进程级的“主 Python " +"解释器”。" + +#: ../../howto/isolating-extensions.rst:50 +msgid "" +"Historically, Python extension modules don't handle this use case well. Many" +" extension modules (and even some stdlib modules) use *per-process* global " +"state, because C ``static`` variables are extremely easy to use. Thus, data " +"that should be specific to an interpreter ends up being shared between " +"interpreters. Unless the extension developer is careful, it is very easy to " +"introduce edge cases that lead to crashes when a module is loaded in more " +"than one interpreter in the same process." +msgstr "" +"在历史上,Python 扩展模块对这种应用场景处理不佳。许多扩展模块(甚至是某些标准库模块)都是使用 *进程内共享* 的全局状态,因为 C " +"``static`` 变量十分易用。结果,本应专属于某个解释器的数据最终却被多个解释器所共享。 " +"除非扩展的开发者小心谨慎,否则当一个模块被相同进程内的多个解释器导入时很容易引入会导致崩溃的边界情况。" + +#: ../../howto/isolating-extensions.rst:58 +msgid "" +"Unfortunately, *per-interpreter* state is not easy to achieve. Extension " +"authors tend to not keep multiple interpreters in mind when developing, and " +"it is currently cumbersome to test the behavior." +msgstr "不幸的是,*解释器级* 状态很不容易做到。扩展的作者在开发中总是倾向于不考虑多解释器的情况,并且目前要测试此类行为也是很困难的。" + +#: ../../howto/isolating-extensions.rst:63 +msgid "Enter Per-Module State" +msgstr "进入模块级状态" + +#: ../../howto/isolating-extensions.rst:65 +msgid "" +"Instead of focusing on per-interpreter state, Python's C API is evolving to " +"better support the more granular *per-module* state. This means that C-level" +" data should be attached to a *module object*. Each interpreter creates its " +"own module object, keeping the data separate. For testing the isolation, " +"multiple module objects corresponding to a single extension can even be " +"loaded in a single interpreter." +msgstr "" +"Python 的 C API 不是专注于解释器级状态,而是演化为更好地支持更细粒度的 *模块级* 状态。这意味着 C 层级数据应当关联到 " +"*模块对象*。每个解释器都会创建自己的模块对象,保持数据的相互分隔。要测试这种分隔,甚至可以在单个解释器中加载对应于单个扩展的多个模块对象。" + +#: ../../howto/isolating-extensions.rst:72 +msgid "" +"Per-module state provides an easy way to think about lifetime and resource " +"ownership: the extension module will initialize when a module object is " +"created, and clean up when it's freed. In this regard, a module is just like" +" any other :c:expr:`PyObject *`; there are no \"on interpreter shutdown\" " +"hooks to think—or forget—about." +msgstr "" +"模块级状态提供了一种处理生命周期和资源归属的简单方式:扩展模块将在模块对象被创建时初始化,并在其释放时被清理。在这一点上,模块就像是任何其他的 " +":c:expr:`PyObject *`;没有必要添加 — 或者去除 — 处理“解释器关闭”的钩子。" + +#: ../../howto/isolating-extensions.rst:78 +msgid "" +"Note that there are use cases for different kinds of \"globals\": per-" +"process, per-interpreter, per-thread or per-task state. With per-module " +"state as the default, these are still possible, but you should treat them as" +" exceptional cases: if you need them, you should give them additional care " +"and testing. (Note that this guide does not cover them.)" +msgstr "" +"请注意各种不同\"全局\"状态:进程级、解释器级、线程级或任务级状态的应用场景。 " +"默认为模块级状态,其他状态也是可选择的,但你应当将它们视为特殊情况:如果你需要它们,你应当给予它们额外的关注和测试。 (请注意本指南并没有涉及它们。)" + +#: ../../howto/isolating-extensions.rst:87 +msgid "Isolated Module Objects" +msgstr "隔离的模块对象" + +#: ../../howto/isolating-extensions.rst:89 +msgid "" +"The key point to keep in mind when developing an extension module is that " +"several module objects can be created from a single shared library. For " +"example:" +msgstr "在开发扩展模块时要记住的关键点是多个模块对象可以从单个共享库来创建。例如:" + +#: ../../howto/isolating-extensions.rst:93 +msgid "" +">>> import sys\n" +">>> import binascii\n" +">>> old_binascii = binascii\n" +">>> del sys.modules['binascii']\n" +">>> import binascii # create a new module object\n" +">>> old_binascii == binascii\n" +"False" +msgstr "" +">>> import sys\n" +">>> import binascii\n" +">>> old_binascii = binascii\n" +">>> del sys.modules['binascii']\n" +">>> import binascii # create a new module object\n" +">>> old_binascii == binascii\n" +"False" + +#: ../../howto/isolating-extensions.rst:103 +msgid "" +"As a rule of thumb, the two modules should be completely independent. All " +"objects and state specific to the module should be encapsulated within the " +"module object, not shared with other module objects, and cleaned up when the" +" module object is deallocated. Since this just is a rule of thumb, " +"exceptions are possible (see `Managing Global State`_), but they will need " +"more thought and attention to edge cases." +msgstr "" +"作为经验法则,这两个模块应该是完全独立的。模块专属的所有对象和状态应该被封装在模块对象内部,不与其他模块对象共享,并在模块对象被释放时进行清理。 " +"由于这只是一个经验法则,例外情况也是可能的(参见 `Managing Global State`_),但这将需要更多的考虑并注意边界情况。" + +#: ../../howto/isolating-extensions.rst:111 +msgid "" +"While some modules could do with less stringent restrictions, isolated " +"modules make it easier to set clear expectations and guidelines that work " +"across a variety of use cases." +msgstr "虽然有些模块不用太多的严格限制,但是隔离的模块使得更容易制定适合各种应用场景的明确期望和指南。" + +#: ../../howto/isolating-extensions.rst:117 +msgid "Surprising Edge Cases" +msgstr "令人惊讶的边界情况" + +#: ../../howto/isolating-extensions.rst:119 +msgid "" +"Note that isolated modules do create some surprising edge cases. Most " +"notably, each module object will typically not share its classes and " +"exceptions with other similar modules. Continuing from the `example above " +"`__, note that ``old_binascii.Error`` and " +"``binascii.Error`` are separate objects. In the following code, the " +"exception is *not* caught:" +msgstr "" +"请注意隔离的模块会创造一些令人吃惊的边界情况。 最明显的一点,每个模块对象通常都不会与其他类似模块共享它的类和异常。 继续 `example above" +" `__,请注意 ``old_binascii.Error`` 和 " +"``binascii.Error`` 是单独的对象。 在下面的代码中,异常 *不会* 被捕获:" + +#: ../../howto/isolating-extensions.rst:126 +msgid "" +">>> old_binascii.Error == binascii.Error\n" +"False\n" +">>> try:\n" +"... old_binascii.unhexlify(b'qwertyuiop')\n" +"... except binascii.Error:\n" +"... print('boo')\n" +"...\n" +"Traceback (most recent call last):\n" +" File \"\", line 2, in \n" +"binascii.Error: Non-hexadecimal digit found" +msgstr "" +">>> old_binascii.Error == binascii.Error\n" +"False\n" +">>> try:\n" +"... old_binascii.unhexlify(b'qwertyuiop')\n" +"... except binascii.Error:\n" +"... print('boo')\n" +"...\n" +"Traceback (most recent call last):\n" +" File \"\", line 2, in \n" +"binascii.Error: Non-hexadecimal digit found" + +#: ../../howto/isolating-extensions.rst:139 +msgid "" +"This is expected. Notice that pure-Python modules behave the same way: it is" +" a part of how Python works." +msgstr "这是预期的结果。请注意纯 Python 模块的行为相同:它是 Python 语言特性的一部分。" + +#: ../../howto/isolating-extensions.rst:142 +msgid "" +"The goal is to make extension modules safe at the C level, not to make hacks" +" behave intuitively. Mutating ``sys.modules`` \"manually\" counts as a hack." +msgstr "" +"最终目标是让扩展模块在 C 层级上保持安全,而不是让投机取巧的做法也能表现正常。 \"手动\"改变 ``sys.modules`` 就属于投机取巧。" + +#: ../../howto/isolating-extensions.rst:148 +msgid "Making Modules Safe with Multiple Interpreters" +msgstr "让多解释器下模块保持安全" + +#: ../../howto/isolating-extensions.rst:152 +msgid "Managing Global State" +msgstr "管理全局状态" + +#: ../../howto/isolating-extensions.rst:154 +msgid "" +"Sometimes, the state associated with a Python module is not specific to that" +" module, but to the entire process (or something else \"more global\" than a" +" module). For example:" +msgstr "有时,与一个 Python 模块相关联的状态并不是该模块专属的,而是整个进程(或者比模块“更全局化”的其他东西)共享。例如:" + +#: ../../howto/isolating-extensions.rst:158 +msgid "The ``readline`` module manages *the* terminal." +msgstr "``readline`` 模块管理的是 *那个* 终端。" + +#: ../../howto/isolating-extensions.rst:159 +msgid "" +"A module running on a circuit board wants to control *the* on-board LED." +msgstr "在电路板上运行的模块想要控制 *那个* 板载 LED。" + +#: ../../howto/isolating-extensions.rst:162 +msgid "" +"In these cases, the Python module should provide *access* to the global " +"state, rather than *own* it. If possible, write the module so that multiple " +"copies of it can access the state independently (along with other libraries," +" whether for Python or other languages). If that is not possible, consider " +"explicit locking." +msgstr "" +"在这些情况下,Python 模块应当提供对全局状态的 *访问*,而不是 *拥有* 它。 " +"如果可能,编写模块时要让它的多个副本可以独立地访问全局状态(能配合其它的库,不论它们是使用 Python 还是其他语言)。 " +"如果这无法做到,可考虑显式加锁。" + +#: ../../howto/isolating-extensions.rst:168 +msgid "" +"If it is necessary to use process-global state, the simplest way to avoid " +"issues with multiple interpreters is to explicitly prevent a module from " +"being loaded more than once per process—see :ref:`isolating-extensions-" +"optout`." +msgstr "" +"如果有必要使用进程级全局状态,那么避免多解释器相关问题的最简单方式是显式地阻止模块在一个进程中被多次加载 — 参见 :ref:`isolating-" +"extensions-optout`。" + +#: ../../howto/isolating-extensions.rst:175 +msgid "Managing Per-Module State" +msgstr "管理模块级状态" + +#: ../../howto/isolating-extensions.rst:177 +msgid "" +"To use per-module state, use :ref:`multi-phase extension module " +"initialization `. This signals that your module " +"supports multiple interpreters correctly." +msgstr "" +"要使用模块级状态,请使用 :ref:`多阶段扩展模块初始化 `。 " +"这将标示你的模块能正确地支持多解释器。" + +#: ../../howto/isolating-extensions.rst:181 +msgid "" +"Set ``PyModuleDef.m_size`` to a positive number to request that many bytes " +"of storage local to the module. Usually, this will be set to the size of " +"some module-specific ``struct``, which can store all of the module's C-level" +" state. In particular, it is where you should put pointers to classes " +"(including exceptions, but excluding static types) and settings (e.g. " +"``csv``'s :py:data:`~csv.field_size_limit`) which the C code needs to " +"function." +msgstr "" +"将 ``PyModuleDef.m_size`` 设为一个正数来为模块请求指定字节的本地存储。通常,这将被设为某个模块专属 ``struct`` " +"的大小,它可以保存模块的所有 C 层级状态。特别地,它应当是你存放类指针(包括异常,但不包括静态类型)和 C 代码正常运作所需设置(如 ``csv`` " +"的 :py:data:`~csv.field_size_limit` 等)的地方。" + +#: ../../howto/isolating-extensions.rst:190 +msgid "" +"Another option is to store state in the module's ``__dict__``, but you must " +"avoid crashing when users modify ``__dict__`` from Python code. This usually" +" means error- and type-checking at the C level, which is easy to get wrong " +"and hard to test sufficiently." +msgstr "" +"另一个选项是将状态保存在模块的 ``__dict__`` 中,但你必须避免当用户从 Python 代码中修改 ``__dict__`` 导致的程序崩溃。" +" 这通常意味着要在 C 层级上进行错误和类型检查,很容易弄错又很难充分测试。" + +#: ../../howto/isolating-extensions.rst:195 +msgid "" +"However, if module state is not needed in C code, storing it in ``__dict__``" +" only is a good idea." +msgstr "但是,如果 C 代码不需要模块状态,则仅将其保存在 ``__dict__`` 中就是一个好主意。" + +#: ../../howto/isolating-extensions.rst:198 +msgid "" +"If the module state includes ``PyObject`` pointers, the module object must " +"hold references to those objects and implement the module-level hooks " +"``m_traverse``, ``m_clear`` and ``m_free``. These work like ``tp_traverse``," +" ``tp_clear`` and ``tp_free`` of a class. Adding them will require some work" +" and make the code longer; this is the price for modules which can be " +"unloaded cleanly." +msgstr "" +"如果模块状态包括 ``PyObject`` 指针,则模块对象必须持有对这些对象的引用并实现模块层级的钩子 ``m_traverse``, " +"``m_clear`` 和 ``m_free``。它们的作用方式很像类的 ``tp_traverse``, ``tp_clear`` 和 " +"``tp_free``。添加它们将会增加工作量并使代码更冗长;这是为了让模块能干净地卸载所需的代价。" + +#: ../../howto/isolating-extensions.rst:205 +msgid "" +"An example of a module with per-module state is currently available as " +"`xxlimited " +"`__; " +"example module initialization shown at the bottom of the file." +msgstr "" +"带有模块级状态的模块示例目前可在 `xxlimited " +"`__ " +"获取;模块初始化的示例见文件的末尾部分。" + +#: ../../howto/isolating-extensions.rst:213 +msgid "Opt-Out: Limiting to One Module Object per Process" +msgstr "回退选项:每个进程限一个模块对象" + +#: ../../howto/isolating-extensions.rst:215 +msgid "" +"A non-negative ``PyModuleDef.m_size`` signals that a module supports " +"multiple interpreters correctly. If this is not yet the case for your " +"module, you can explicitly make your module loadable only once per process. " +"For example::" +msgstr "" +"非负的 ``PyModuleDef.m_size`` 值表示一个模块能正确地支持多解释器。 " +"如果你的模块还不能做到这样,你可以显式地设置你的模块在每个进程中只能加载一次。例如::" + +#: ../../howto/isolating-extensions.rst:220 +msgid "" +"// A process-wide flag\n" +"static int loaded = 0;\n" +"\n" +"// Mutex to provide thread safety (only needed for free-threaded Python)\n" +"static PyMutex modinit_mutex = {0};\n" +"\n" +"static int\n" +"exec_module(PyObject* module)\n" +"{\n" +" PyMutex_Lock(&modinit_mutex);\n" +" if (loaded) {\n" +" PyMutex_Unlock(&modinit_mutex);\n" +" PyErr_SetString(PyExc_ImportError,\n" +" \"cannot load module more than once per process\");\n" +" return -1;\n" +" }\n" +" loaded = 1;\n" +" PyMutex_Unlock(&modinit_mutex);\n" +" // ... rest of initialization\n" +"}" +msgstr "" +"// 作用于进程的旗标\n" +"static int loaded = 0;\n" +"\n" +"// 提供线程安全的互斥锁(仅在自由线程版 Python 中需要)\n" +"static PyMutex modinit_mutex = {0};\n" +"\n" +"static int\n" +"exec_module(PyObject* module)\n" +"{\n" +" PyMutex_Lock(&modinit_mutex);\n" +" if (loaded) {\n" +" PyMutex_Unlock(&modinit_mutex);\n" +" PyErr_SetString(PyExc_ImportError,\n" +" \"cannot load module more than once per process\");\n" +" return -1;\n" +" }\n" +" loaded = 1;\n" +" PyMutex_Unlock(&modinit_mutex);\n" +" // ... 初始化的其余部分\n" +"}" + +#: ../../howto/isolating-extensions.rst:242 +msgid "" +"If your module's :c:member:`PyModuleDef.m_clear` function is able to prepare" +" for future re-initialization, it should clear the ``loaded`` flag. In this " +"case, your module won't support multiple instances existing *concurrently*, " +"but it will, for example, support being loaded after Python runtime shutdown" +" (:c:func:`Py_FinalizeEx`) and re-initialization (:c:func:`Py_Initialize`)." +msgstr "" +"如果你的模块的 :c:member:`PyModuleDef.m_clear` 函数能够为将来的重新初始化做好准备,它应当清除 ``loaded`` " +"旗标。在此情况下,你的模块将不支持多个实例 *并发地* 存在,但举例来说,它将支持在 Python 运行时关闭 " +"(:c:func:`Py_FinalizeEx`) 和重新初始化 (:c:func:`Py_Initialize`) 之后被加载。" + +#: ../../howto/isolating-extensions.rst:251 +msgid "Module State Access from Functions" +msgstr "函数对模块状态的访问" + +#: ../../howto/isolating-extensions.rst:253 +msgid "" +"Accessing the state from module-level functions is straightforward. " +"Functions get the module object as their first argument; for extracting the " +"state, you can use ``PyModule_GetState``::" +msgstr "" +"从模块层级的函数访问状态是相当直观的。函数通过它们的第一个参数获得模块对象;要提取状态,你可以使用 ``PyModule_GetState``::" + +#: ../../howto/isolating-extensions.rst:257 +msgid "" +"static PyObject *\n" +"func(PyObject *module, PyObject *args)\n" +"{\n" +" my_struct *state = (my_struct*)PyModule_GetState(module);\n" +" if (state == NULL) {\n" +" return NULL;\n" +" }\n" +" // ... rest of logic\n" +"}" +msgstr "" +"static PyObject *\n" +"func(PyObject *module, PyObject *args)\n" +"{\n" +" my_struct *state = (my_struct*)PyModule_GetState(module);\n" +" if (state == NULL) {\n" +" return NULL;\n" +" }\n" +" // ... 其余的逻辑\n" +"}" + +#: ../../howto/isolating-extensions.rst:268 +msgid "" +"``PyModule_GetState`` may return ``NULL`` without setting an exception if " +"there is no module state, i.e. ``PyModuleDef.m_size`` was zero. In your own " +"module, you're in control of ``m_size``, so this is easy to prevent." +msgstr "" +"如果模块状态不存在则 ``PyModule_GetState`` 可能返回 ``NULL`` 而不设置异常,即 " +"``PyModuleDef.m_size`` 为零。在你自己的模块中,你可以任意控制 ``m_size``,因此这很容易避免。" + +#: ../../howto/isolating-extensions.rst:275 +msgid "Heap Types" +msgstr "堆类型" + +#: ../../howto/isolating-extensions.rst:277 +msgid "" +"Traditionally, types defined in C code are *static*; that is, ``static " +"PyTypeObject`` structures defined directly in code and initialized using " +"``PyType_Ready()``." +msgstr "" +"在传统上,在 C 代码中定义的类型都是 *静态的*;也就是说,``static PyTypeObject`` 结构体在代码中直接定义并使用 " +"``PyType_Ready()`` 来初始化。" + +#: ../../howto/isolating-extensions.rst:281 +msgid "" +"Such types are necessarily shared across the process. Sharing them between " +"module objects requires paying attention to any state they own or access. To" +" limit the possible issues, static types are immutable at the Python level: " +"for example, you can't set ``str.myattribute = 123``." +msgstr "" +"这样的类型必须在进程范围内共享。在模块对象之间共享它们需要注意它们所拥有或访问的任何状态。要限制可能出现的问题,静态类型在 Python " +"层级上是不可变的:例如,你无法设置 ``str.myattribute = 123``。" + +#: ../../howto/isolating-extensions.rst:287 +msgid "" +"Sharing truly immutable objects between interpreters is fine, as long as " +"they don't provide access to mutable objects. However, in CPython, every " +"Python object has a mutable implementation detail: the reference count. " +"Changes to the refcount are guarded by the GIL. Thus, code that shares any " +"Python objects across interpreters implicitly depends on CPython's current, " +"process-wide GIL." +msgstr "" +"在解释器之间共享真正不可变的对象是可行的,只要它们不提供对可变对象的访问。但是,在 CPython 中,每个 Python " +"对象都有一个可变的实现细节:引用计数。对引用计数的更改是由 GIL 来保护的。因此,跨解释器共享任何 Python 对象的代码都隐式地依赖于 " +"CPython 现有的、进程级的 GIL。" + +#: ../../howto/isolating-extensions.rst:294 +msgid "" +"Because they are immutable and process-global, static types cannot access " +"\"their\" module state. If any method of such a type requires access to " +"module state, the type must be converted to a *heap-allocated type*, or " +"*heap type* for short. These correspond more closely to classes created by " +"Python's ``class`` statement." +msgstr "" +"因为它们是不可变的进程级全局对象,所以静态类型无法访问“它们的”模块状态。如果任何此种类型的方法需要访问模块状态,则该类型必须被转换为 " +"*堆分配类型*,或者简称为 *堆类型*。此种类型相对更接近由 Python 的 ``class`` 语句所创建的类。" + +#: ../../howto/isolating-extensions.rst:301 +msgid "For new modules, using heap types by default is a good rule of thumb." +msgstr "对于新模块,默认使用堆类型是一个很好的经验法则。" + +#: ../../howto/isolating-extensions.rst:305 +msgid "Changing Static Types to Heap Types" +msgstr "将静态类型改为堆类型" + +#: ../../howto/isolating-extensions.rst:307 +msgid "" +"Static types can be converted to heap types, but note that the heap type API" +" was not designed for \"lossless\" conversion from static types—that is, " +"creating a type that works exactly like a given static type. So, when " +"rewriting the class definition in a new API, you are likely to " +"unintentionally change a few details (e.g. pickleability or inherited " +"slots). Always test the details that are important to you." +msgstr "" +"静态类型可以转换为堆类型,但要注意堆类型 API 并非针对静态类型的“无损”转换 — 也就是说,创建与给定静态类型完全一致的类型来设计的。 " +"因此,当在新的 API 中重写类定义时,你很容易在无意中改变一些细节(例如可封存性或所继承的槽位等)。请始终确保测试对你来说重要的细节。" + +#: ../../howto/isolating-extensions.rst:316 +msgid "" +"Watch out for the following two points in particular (but note that this is " +"not a comprehensive list):" +msgstr "特别要关注以下两点(但请注意这并非一个完整的列表):" + +#: ../../howto/isolating-extensions.rst:319 +msgid "" +"Unlike static types, heap type objects are mutable by default. Use the " +":c:macro:`Py_TPFLAGS_IMMUTABLETYPE` flag to prevent mutability." +msgstr "不同于静态类型,堆类型对象默认是可变的。请使用 :c:macro:`Py_TPFLAGS_IMMUTABLETYPE` 旗标来防止可变性。" + +#: ../../howto/isolating-extensions.rst:321 +msgid "" +"Heap types inherit :c:member:`~PyTypeObject.tp_new` by default, so it may " +"become possible to instantiate them from Python code. You can prevent this " +"with the :c:macro:`Py_TPFLAGS_DISALLOW_INSTANTIATION` flag." +msgstr "" +"堆类型默认继承 :c:member:`~PyTypeObject.tp_new`,因此有可能通过 Python 代码来初始化它们。你可以使用 " +":c:macro:`Py_TPFLAGS_DISALLOW_INSTANTIATION` 旗标来防止此特性。" + +#: ../../howto/isolating-extensions.rst:327 +msgid "Defining Heap Types" +msgstr "定义堆类型" + +#: ../../howto/isolating-extensions.rst:329 +msgid "" +"Heap types can be created by filling a :c:struct:`PyType_Spec` structure, a " +"description or \"blueprint\" of a class, and calling " +":c:func:`PyType_FromModuleAndSpec` to construct a new class object." +msgstr "" +"堆类型可以通过填充 :c:struct:`PyType_Spec` 结构体来创建,它是对于特定类的描述或\"蓝图\",并调用 " +":c:func:`PyType_FromModuleAndSpec` 来构造新的类对象。" + +#: ../../howto/isolating-extensions.rst:334 +msgid "" +"Other functions, like :c:func:`PyType_FromSpec`, can also create heap types," +" but :c:func:`PyType_FromModuleAndSpec` associates the module with the " +"class, allowing access to the module state from methods." +msgstr "" +"其他的函数,如 :c:func:`PyType_FromSpec`,也可以创建堆类型,但 " +":c:func:`PyType_FromModuleAndSpec` 会将模块关联到类,以允许从方法访问模块状态。" + +#: ../../howto/isolating-extensions.rst:338 +msgid "" +"The class should generally be stored in *both* the module state (for safe " +"access from C) and the module's ``__dict__`` (for access from Python code)." +msgstr "" +"类通常应当 *同时* 保存在模块的状态(用于从 C 中安全地访问)和模块的 ``__dict__`` 中(用于从 Python 代码中访问)。" + +#: ../../howto/isolating-extensions.rst:344 +msgid "Garbage-Collection Protocol" +msgstr "垃圾回收协议" + +#: ../../howto/isolating-extensions.rst:346 +msgid "" +"Instances of heap types hold a reference to their type. This ensures that " +"the type isn't destroyed before all its instances are, but may result in " +"reference cycles that need to be broken by the garbage collector." +msgstr "堆类型的实例会持有一个指向其类型的引用。这能确保类型的销毁不会发生在其实例之前,但可能会导致需要由垃圾回收器来打破的引用循环。" + +#: ../../howto/isolating-extensions.rst:351 +msgid "" +"To avoid memory leaks, instances of heap types must implement the garbage " +"collection protocol. That is, heap types should:" +msgstr "要避免内存泄漏,堆类型的实例必须实现垃圾回收协议。也就是说,堆类型应当:" + +#: ../../howto/isolating-extensions.rst:355 +msgid "Have the :c:macro:`Py_TPFLAGS_HAVE_GC` flag." +msgstr "具有 :c:macro:`Py_TPFLAGS_HAVE_GC` 旗标。" + +#: ../../howto/isolating-extensions.rst:356 +msgid "" +"Define a traverse function using :c:data:`Py_tp_traverse`, which visits the " +"type (e.g. using ``Py_VISIT(Py_TYPE(self))``)." +msgstr "" +"定义一个使用 :c:data:`Py_tp_traverse` 的遍历函数,它将访问该类型 (例如使用 " +"``Py_VISIT(Py_TYPE(self))``)。" + +#: ../../howto/isolating-extensions.rst:359 +msgid "" +"Please refer to the documentation of :c:macro:`Py_TPFLAGS_HAVE_GC` and " +":c:member:`~PyTypeObject.tp_traverse` for additional considerations." +msgstr "" +"请参阅 :c:macro:`Py_TPFLAGS_HAVE_GC` 和 :c:member:`~PyTypeObject.tp_traverse` " +"的文档以获取更多说明。" + +#: ../../howto/isolating-extensions.rst:363 +msgid "" +"The API for defining heap types grew organically, leaving it somewhat " +"awkward to use in its current state. The following sections will guide you " +"through common issues." +msgstr "定义堆类型的 API 在有机地增长,使得它目前的使用状况有些尴尬。以下章节将引导您解决常见的问题。" + +#: ../../howto/isolating-extensions.rst:369 +msgid "``tp_traverse`` in Python 3.8 and lower" +msgstr "``tp_traverse`` 在 Python 3.8 及更低的版本中" + +#: ../../howto/isolating-extensions.rst:371 +msgid "" +"The requirement to visit the type from ``tp_traverse`` was added in Python " +"3.9. If you support Python 3.8 and lower, the traverse function must *not* " +"visit the type, so it must be more complicated::" +msgstr "" +"从 ``tp_traverse`` 访问类型的要求是在 Python 3.9 中添加的。如果你要支持 Python 3.8 及更低版本,则遍历函数 " +"*不可* 访问类型,因此必须使用更复杂的方式::" + +#: ../../howto/isolating-extensions.rst:375 +msgid "" +"static int my_traverse(PyObject *self, visitproc visit, void *arg)\n" +"{\n" +" if (Py_Version >= 0x03090000) {\n" +" Py_VISIT(Py_TYPE(self));\n" +" }\n" +" return 0;\n" +"}" +msgstr "" +"static int my_traverse(PyObject *self, visitproc visit, void *arg)\n" +"{\n" +" if (Py_Version >= 0x03090000) {\n" +" Py_VISIT(Py_TYPE(self));\n" +" }\n" +" return 0;\n" +"}" + +#: ../../howto/isolating-extensions.rst:383 +msgid "" +"Unfortunately, :c:data:`Py_Version` was only added in Python 3.11. As a " +"replacement, use:" +msgstr "不幸的是,:c:data:`Py_Version` 直到 Python 3.11 才被加入。作为替代,请使用:" + +#: ../../howto/isolating-extensions.rst:386 +msgid ":c:macro:`PY_VERSION_HEX`, if not using the stable ABI, or" +msgstr ":c:macro:`PY_VERSION_HEX`,如果不使用稳定 ABI 的话,或者" + +#: ../../howto/isolating-extensions.rst:387 +msgid "" +":py:data:`sys.version_info` (via :c:func:`PySys_GetObject` and " +":c:func:`PyArg_ParseTuple`)." +msgstr "" +":py:data:`sys.version_info` (通过 :c:func:`PySys_GetObject` 和 " +":c:func:`PyArg_ParseTuple`)。" + +#: ../../howto/isolating-extensions.rst:392 +msgid "Delegating ``tp_traverse``" +msgstr "委托 ``tp_traverse``" + +#: ../../howto/isolating-extensions.rst:394 +msgid "" +"If your traverse function delegates to the " +":c:member:`~PyTypeObject.tp_traverse` of its base class (or another type), " +"ensure that ``Py_TYPE(self)`` is visited only once. Note that only heap type" +" are expected to visit the type in ``tp_traverse``." +msgstr "" +"如果你的遍历函数委托给了其基类(或另一个类型)的 :c:member:`~PyTypeObject.tp_traverse`,请确保 " +"``Py_TYPE(self)`` 只被访问一次。请注意只有堆类型会被预期访问 ``tp_traverse`` 中的类型。" + +#: ../../howto/isolating-extensions.rst:399 +msgid "For example, if your traverse function includes::" +msgstr "举例来说,如果你的遍历函数包括::" + +#: ../../howto/isolating-extensions.rst:401 +msgid "base->tp_traverse(self, visit, arg)" +msgstr "base->tp_traverse(self, visit, arg)" + +#: ../../howto/isolating-extensions.rst:403 +msgid "...and ``base`` may be a static type, then it should also include::" +msgstr "... 并且 ``base`` 可能是一个静态类型,则它也应当包括::" + +#: ../../howto/isolating-extensions.rst:405 +msgid "" +"if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) {\n" +" // a heap type's tp_traverse already visited Py_TYPE(self)\n" +"} else {\n" +" if (Py_Version >= 0x03090000) {\n" +" Py_VISIT(Py_TYPE(self));\n" +" }\n" +"}" +msgstr "" +"if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) {\n" +" // 一个堆类型的 tp_traverse 已经访问了 Py_TYPE(self)\n" +"} else {\n" +" if (Py_Version >= 0x03090000) {\n" +" Py_VISIT(Py_TYPE(self));\n" +" }\n" +"}" + +#: ../../howto/isolating-extensions.rst:413 +msgid "" +"It is not necessary to handle the type's reference count in " +":c:member:`~PyTypeObject.tp_new` and :c:member:`~PyTypeObject.tp_clear`." +msgstr "" +"不需要在 :c:member:`~PyTypeObject.tp_new` 和 :c:member:`~PyTypeObject.tp_clear` " +"中处理该类型的引用计数。" + +#: ../../howto/isolating-extensions.rst:418 +msgid "Defining ``tp_dealloc``" +msgstr "定义 ``tp_dealloc``" + +#: ../../howto/isolating-extensions.rst:420 +msgid "" +"If your type has a custom :c:member:`~PyTypeObject.tp_dealloc` function, it " +"needs to:" +msgstr "如果你的类型有自定义的 :c:member:`~PyTypeObject.tp_dealloc` 函数,则它需要:" + +#: ../../howto/isolating-extensions.rst:423 +msgid "" +"call :c:func:`PyObject_GC_UnTrack` before any fields are invalidated, and" +msgstr "在任何字段失效之前调用 :c:func:`PyObject_GC_UnTrack`,并且" + +#: ../../howto/isolating-extensions.rst:424 +msgid "decrement the reference count of the type." +msgstr "递减该类型的引用计数。" + +#: ../../howto/isolating-extensions.rst:426 +msgid "" +"To keep the type valid while ``tp_free`` is called, the type's refcount " +"needs to be decremented *after* the instance is deallocated. For example::" +msgstr "要在 ``tp_free`` 被调用时保持类型有效,必须在撤销分配实例 *之后* 递减该类型的引用计数。例如::" + +#: ../../howto/isolating-extensions.rst:429 +msgid "" +"static void my_dealloc(PyObject *self)\n" +"{\n" +" PyObject_GC_UnTrack(self);\n" +" ...\n" +" PyTypeObject *type = Py_TYPE(self);\n" +" type->tp_free(self);\n" +" Py_DECREF(type);\n" +"}" +msgstr "" +"static void my_dealloc(PyObject *self)\n" +"{\n" +" PyObject_GC_UnTrack(self);\n" +" ...\n" +" PyTypeObject *type = Py_TYPE(self);\n" +" type->tp_free(self);\n" +" Py_DECREF(type);\n" +"}" + +#: ../../howto/isolating-extensions.rst:438 +msgid "" +"The default ``tp_dealloc`` function does this, so if your type does *not* " +"override ``tp_dealloc`` you don't need to add it." +msgstr "默认的 ``tp_dealloc`` 函数会执行此操作,因此如果你的类型 *没有* 重载 ``tp_dealloc`` 你就不需要添加它。" + +#: ../../howto/isolating-extensions.rst:444 +msgid "Not overriding ``tp_free``" +msgstr "没有重载 ``tp_free``" + +#: ../../howto/isolating-extensions.rst:446 +msgid "" +"The :c:member:`~PyTypeObject.tp_free` slot of a heap type must be set to " +":c:func:`PyObject_GC_Del`. This is the default; do not override it." +msgstr "" +"堆类型的 :c:member:`~PyTypeObject.tp_free` 槽位必须设为 :c:func:`PyObject_GC_Del`。 " +"这是默认的设置;请不要重载它。" + +#: ../../howto/isolating-extensions.rst:452 +msgid "Avoiding ``PyObject_New``" +msgstr "避免 ``PyObject_New``" + +#: ../../howto/isolating-extensions.rst:454 +msgid "GC-tracked objects need to be allocated using GC-aware functions." +msgstr "带 GC 追踪的对象需要使用带 GC 感知的函数来分配。" + +#: ../../howto/isolating-extensions.rst:456 +msgid "If you use :c:func:`PyObject_New` or :c:func:`PyObject_NewVar`:" +msgstr "如果你使用 :c:func:`PyObject_New` 或 :c:func:`PyObject_NewVar`:" + +#: ../../howto/isolating-extensions.rst:458 +msgid "" +"Get and call type's :c:member:`~PyTypeObject.tp_alloc` slot, if possible. " +"That is, replace ``TYPE *o = PyObject_New(TYPE, typeobj)`` with::" +msgstr "" +"如有可能,请获取并调用类型的 :c:member:`~PyTypeObject.tp_alloc` 槽位。也就是说,将 ``TYPE *o = " +"PyObject_New(TYPE, typeobj)`` 替换为::" + +#: ../../howto/isolating-extensions.rst:461 +msgid "TYPE *o = typeobj->tp_alloc(typeobj, 0);" +msgstr "TYPE *o = typeobj->tp_alloc(typeobj, 0);" + +#: ../../howto/isolating-extensions.rst:463 +msgid "" +"Replace ``o = PyObject_NewVar(TYPE, typeobj, size)`` with the same, but use " +"size instead of the 0." +msgstr "同样地替换 ``o = PyObject_NewVar(TYPE, typeobj, size)``,但要使用指定大小而不是 0。" + +#: ../../howto/isolating-extensions.rst:466 +msgid "" +"If the above is not possible (e.g. inside a custom ``tp_alloc``), call " +":c:func:`PyObject_GC_New` or :c:func:`PyObject_GC_NewVar`::" +msgstr "" +"如果无法执行以上操作(例如在自定义的 ``tp_alloc`` 中),请调用 :c:func:`PyObject_GC_New` 或 " +":c:func:`PyObject_GC_NewVar`::" + +#: ../../howto/isolating-extensions.rst:469 +msgid "" +"TYPE *o = PyObject_GC_New(TYPE, typeobj);\n" +"\n" +"TYPE *o = PyObject_GC_NewVar(TYPE, typeobj, size);" +msgstr "" +"TYPE *o = PyObject_GC_New(TYPE, typeobj);\n" +"\n" +"TYPE *o = PyObject_GC_NewVar(TYPE, typeobj, size);" + +#: ../../howto/isolating-extensions.rst:475 +msgid "Module State Access from Classes" +msgstr "类对模块状态的访问" + +#: ../../howto/isolating-extensions.rst:477 +msgid "" +"If you have a type object defined with :c:func:`PyType_FromModuleAndSpec`, " +"you can call :c:func:`PyType_GetModule` to get the associated module, and " +"then :c:func:`PyModule_GetState` to get the module's state." +msgstr "" +"如果你有一个使用 :c:func:`PyType_FromModuleAndSpec` 定义的类型对象,你可以调用 " +":c:func:`PyType_GetModule` 来获取关联的模块,然后调用 :c:func:`PyModule_GetState` " +"来获取模块的状态。" + +#: ../../howto/isolating-extensions.rst:481 +msgid "" +"To save a some tedious error-handling boilerplate code, you can combine " +"these two steps with :c:func:`PyType_GetModuleState`, resulting in::" +msgstr "要省略一些繁琐的错误处理样板代码,你可以使用 :c:func:`PyType_GetModuleState` 来合并这两步,得到::" + +#: ../../howto/isolating-extensions.rst:484 +msgid "" +"my_struct *state = (my_struct*)PyType_GetModuleState(type);\n" +"if (state == NULL) {\n" +" return NULL;\n" +"}" +msgstr "" +"my_struct *state = (my_struct*)PyType_GetModuleState(type);\n" +"if (state == NULL) {\n" +" return NULL;\n" +"}" + +#: ../../howto/isolating-extensions.rst:491 +msgid "Module State Access from Regular Methods" +msgstr "常规方法对模块状态的访问" + +#: ../../howto/isolating-extensions.rst:493 +msgid "" +"Accessing the module-level state from methods of a class is somewhat more " +"complicated, but is possible thanks to API introduced in Python 3.9. To get " +"the state, you need to first get the *defining class*, and then get the " +"module state from it." +msgstr "" +"从一个类的方法访问模块层级的状态在某些方面会更为复杂,但通过 Python 3.9 所引入的 API 这是可能做到的。为了获取状态,你需要首先获取 " +"*定义的类*,然后从中获取模块状态。" + +#: ../../howto/isolating-extensions.rst:498 +msgid "" +"The largest roadblock is getting *the class a method was defined in*, or " +"that method's \"defining class\" for short. The defining class can have a " +"reference to the module it is part of." +msgstr "最大的障碍是获取 *方法定义所在的类*,简称为方法的\"定义类\"。定义类可以持有一个指向它所属模块的引用。" + +#: ../../howto/isolating-extensions.rst:502 +msgid "" +"Do not confuse the defining class with ``Py_TYPE(self)``. If the method is " +"called on a *subclass* of your type, ``Py_TYPE(self)`` will refer to that " +"subclass, which may be defined in different module than yours." +msgstr "" +"不要混淆定义的类和 ``Py_TYPE(self)``。如果方法是在你的类型的一个 *子类* 上被调用的,则 ``Py_TYPE(self)`` " +"将指向该子类,它可能是在另一个模块中定义的。" + +#: ../../howto/isolating-extensions.rst:507 +msgid "" +"The following Python code can illustrate the concept. " +"``Base.get_defining_class`` returns ``Base`` even if ``type(self) == Sub``:" +msgstr "" +"下面的 Python 代码可以演示这一概念。``Base.get_defining_class`` 将返回 ``Base``,即使 " +"``type(self) == Sub``:" + +#: ../../howto/isolating-extensions.rst:511 +msgid "" +"class Base:\n" +" def get_type_of_self(self):\n" +" return type(self)\n" +"\n" +" def get_defining_class(self):\n" +" return __class__\n" +"\n" +"class Sub(Base):\n" +" pass" +msgstr "" +"class Base:\n" +" def get_type_of_self(self):\n" +" return type(self)\n" +"\n" +" def get_defining_class(self):\n" +" return __class__\n" +"\n" +"class Sub(Base):\n" +" pass" + +#: ../../howto/isolating-extensions.rst:523 +msgid "" +"For a method to get its \"defining class\", it must use the " +":ref:`METH_METHOD | METH_FASTCALL | METH_KEYWORDS ` :c:type:`calling convention ` and" +" the corresponding :c:type:`PyCMethod` signature::" +msgstr "" +"对于要获取其\"定义类\"的方法,它必须使用 :ref:`METH_METHOD | METH_FASTCALL | METH_KEYWORDS " +"` :c:type:`调用惯例 ` " +"以及相应的 :c:type:`PyCMethod` 签名::" + +#: ../../howto/isolating-extensions.rst:528 +msgid "" +"PyObject *PyCMethod(\n" +" PyObject *self, // object the method was called on\n" +" PyTypeObject *defining_class, // defining class\n" +" PyObject *const *args, // C array of arguments\n" +" Py_ssize_t nargs, // length of \"args\"\n" +" PyObject *kwnames) // NULL, or dict of keyword arguments" +msgstr "" +"PyObject *PyCMethod(\n" +" PyObject *self, // 方法调用所在的对象\n" +" PyTypeObject *defining_class, // 定义的类\n" +" PyObject *const *args, // 由参数组成的 C 数组\n" +" Py_ssize_t nargs, // \"args\" 的长度\n" +" PyObject *kwnames) // NULL,或由关键字参数组成的字典" + +#: ../../howto/isolating-extensions.rst:535 +msgid "" +"Once you have the defining class, call :c:func:`PyType_GetModuleState` to " +"get the state of its associated module." +msgstr "一旦你得到了定义的类,即可调用 :c:func:`PyType_GetModuleState` 来获取它所关联的模块的状态。" + +#: ../../howto/isolating-extensions.rst:538 +msgid "For example::" +msgstr "例如:" + +#: ../../howto/isolating-extensions.rst:540 +msgid "" +"static PyObject *\n" +"example_method(PyObject *self,\n" +" PyTypeObject *defining_class,\n" +" PyObject *const *args,\n" +" Py_ssize_t nargs,\n" +" PyObject *kwnames)\n" +"{\n" +" my_struct *state = (my_struct*)PyType_GetModuleState(defining_class);\n" +" if (state == NULL) {\n" +" return NULL;\n" +" }\n" +" ... // rest of logic\n" +"}\n" +"\n" +"PyDoc_STRVAR(example_method_doc, \"...\");\n" +"\n" +"static PyMethodDef my_methods[] = {\n" +" {\"example_method\",\n" +" (PyCFunction)(void(*)(void))example_method,\n" +" METH_METHOD|METH_FASTCALL|METH_KEYWORDS,\n" +" example_method_doc}\n" +" {NULL},\n" +"}" +msgstr "" +"static PyObject *\n" +"example_method(PyObject *self,\n" +" PyTypeObject *defining_class,\n" +" PyObject *const *args,\n" +" Py_ssize_t nargs,\n" +" PyObject *kwnames)\n" +"{\n" +" my_struct *state = (my_struct*)PyType_GetModuleState(defining_class);\n" +" if (state == NULL) {\n" +" return NULL;\n" +" }\n" +" ... // rest of logic\n" +"}\n" +"\n" +"PyDoc_STRVAR(example_method_doc, \"...\");\n" +"\n" +"static PyMethodDef my_methods[] = {\n" +" {\"example_method\",\n" +" (PyCFunction)(void(*)(void))example_method,\n" +" METH_METHOD|METH_FASTCALL|METH_KEYWORDS,\n" +" example_method_doc}\n" +" {NULL},\n" +"}" + +#: ../../howto/isolating-extensions.rst:566 +msgid "Module State Access from Slot Methods, Getters and Setters" +msgstr "槽位方法、读取方法和设置方法对模块状态的访问" + +#: ../../howto/isolating-extensions.rst:570 +msgid "This is new in Python 3.11." +msgstr "这是 Python 3.11 的新增特性。" + +#: ../../howto/isolating-extensions.rst:578 +msgid "" +"Slot methods—the fast C equivalents for special methods, such as " +":c:member:`~PyNumberMethods.nb_add` for :py:attr:`~object.__add__` or " +":c:member:`~PyTypeObject.tp_new` for initialization—have a very simple API " +"that doesn't allow passing in the defining class, unlike with " +":c:type:`PyCMethod`. The same goes for getters and setters defined with " +":c:type:`PyGetSetDef`." +msgstr "" +"槽位方法 — 即特殊方法的 C 快速等价物,如 :c:member:`~PyNumberMethods.nb_add` 对应 " +":py:attr:`~object.__add__` 而 :c:member:`~PyTypeObject.tp_new` 对应初始化方法 — " +"具有不允许传入定义类的非常简单的 API,这不同于 :c:type:`PyCMethod`。同样的机制也适用于通过 " +":c:type:`PyGetSetDef` 定义的读取方法和设置方法。" + +#: ../../howto/isolating-extensions.rst:585 +msgid "" +"To access the module state in these cases, use the " +":c:func:`PyType_GetModuleByDef` function, and pass in the module definition." +" Once you have the module, call :c:func:`PyModule_GetState` to get the " +"state::" +msgstr "" +"要在这些场景下访问模块状态,请使用 :c:func:`PyType_GetModuleByDef` 函数,并传入模块定义。一旦你得到该模块,即可调用 " +":c:func:`PyModule_GetState` 来获取状态::" + +#: ../../howto/isolating-extensions.rst:590 +msgid "" +"PyObject *module = PyType_GetModuleByDef(Py_TYPE(self), &module_def);\n" +"my_struct *state = (my_struct*)PyModule_GetState(module);\n" +"if (state == NULL) {\n" +" return NULL;\n" +"}" +msgstr "" +"PyObject *module = PyType_GetModuleByDef(Py_TYPE(self), &module_def);\n" +"my_struct *state = (my_struct*)PyModule_GetState(module);\n" +"if (state == NULL) {\n" +" return NULL;\n" +"}" + +#: ../../howto/isolating-extensions.rst:596 +msgid "" +":c:func:`!PyType_GetModuleByDef` works by searching the :term:`method " +"resolution order` (i.e. all superclasses) for the first superclass that has " +"a corresponding module." +msgstr "" +":c:func:`!PyType_GetModuleByDef` 的作用方式是通过搜索 :term:`method resolution order` " +"(即所有超类) 来找到具有相应模块的第一个超类。" + +#: ../../howto/isolating-extensions.rst:602 +msgid "" +"In very exotic cases (inheritance chains spanning multiple modules created " +"from the same definition), :c:func:`!PyType_GetModuleByDef` might not return" +" the module of the true defining class. However, it will always return a " +"module with the same definition, ensuring a compatible C memory layout." +msgstr "" +"在非常特别的情况下(继承链跨越由同样定义创建的多个模块),:c:func:`!PyType_GetModuleByDef` " +"可能不会返回真正定义类所属的模块。但是,它总是会返回一个具有同样定义的模块,这将确保具有兼容的 C 内存布局。" + +#: ../../howto/isolating-extensions.rst:610 +msgid "Lifetime of the Module State" +msgstr "模块状态的生命期" + +#: ../../howto/isolating-extensions.rst:612 +msgid "" +"When a module object is garbage-collected, its module state is freed. For " +"each pointer to (a part of) the module state, you must hold a reference to " +"the module object." +msgstr "当一个模块对象被当作垃圾回收时,它的模块状态将被释放。对于每个指向(一部分)模块状态的指针来说,你必须持有一个对模块对象的引用。" + +#: ../../howto/isolating-extensions.rst:616 +msgid "" +"Usually this is not an issue, because types created with " +":c:func:`PyType_FromModuleAndSpec`, and their instances, hold a reference to" +" the module. However, you must be careful in reference counting when you " +"reference module state from other places, such as callbacks for external " +"libraries." +msgstr "" +"通常这不会有问题,因为使用 :c:func:`PyType_FromModuleAndSpec` 创建的类型,以及它们的实例,都持有对模块的引用。 " +"但是,当你从其他地方,例如对外部库的回调引用模块状态时必须小心谨慎。" + +#: ../../howto/isolating-extensions.rst:625 +msgid "Open Issues" +msgstr "未解决的问题" + +#: ../../howto/isolating-extensions.rst:627 +msgid "Several issues around per-module state and heap types are still open." +msgstr "围绕模块级状态和堆类型仍然存在一些未解决的问题。" + +#: ../../howto/isolating-extensions.rst:629 +msgid "" +"Discussions about improving the situation are best held on the `discuss " +"forum under c-api tag `__." +msgstr "" +"有关改进此状况最好的讨论是在 `discuss 论坛的 c-api 标签下 `__ 进行的。" + +#: ../../howto/isolating-extensions.rst:633 +msgid "Per-Class Scope" +msgstr "类级作用域" + +#: ../../howto/isolating-extensions.rst:635 +msgid "" +"It is currently (as of Python 3.11) not possible to attach state to " +"individual *types* without relying on CPython implementation details (which " +"may change in the future—perhaps, ironically, to allow a proper solution for" +" per-class scope)." +msgstr "" +"目前(即 Python 3.11)还无法将状态关联到单个 *类型* 而不依赖于 CPython 实现细节(这在未来可能发生改变 — " +"或许,颇具讽刺意味地,正是为了提供适当的类级作用域解决方案)。" + +#: ../../howto/isolating-extensions.rst:642 +msgid "Lossless Conversion to Heap Types" +msgstr "无损转换为堆类型" + +#: ../../howto/isolating-extensions.rst:644 +msgid "" +"The heap type API was not designed for \"lossless\" conversion from static " +"types; that is, creating a type that works exactly like a given static type." +msgstr "堆类型 API 没有从静态类型进行“无损”转换的设计;所谓无损转换,就是创建与给定静态类型完全一致的类型。" diff --git a/howto/logging-cookbook.po b/howto/logging-cookbook.po new file mode 100644 index 0000000000..dd82ea63f8 --- /dev/null +++ b/howto/logging-cookbook.po @@ -0,0 +1,7812 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-19 15:34+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../howto/logging-cookbook.rst:5 +msgid "Logging Cookbook" +msgstr "日志专题手册" + +#: ../../howto/logging-cookbook.rst:0 +msgid "Author" +msgstr "作者" + +#: ../../howto/logging-cookbook.rst:7 +msgid "Vinay Sajip " +msgstr "Vinay Sajip " + +#: ../../howto/logging-cookbook.rst:9 +msgid "" +"This page contains a number of recipes related to logging, which have been " +"found useful in the past. For links to tutorial and reference information, " +"please see :ref:`cookbook-ref-links`." +msgstr "本页面包含多个与日志相关的专题,历史证明它们是很有用的。教程和参考信息的链接另见 :ref:`cookbook-ref-links`。" + +#: ../../howto/logging-cookbook.rst:16 +msgid "Using logging in multiple modules" +msgstr "在多模块中使用日志" + +#: ../../howto/logging-cookbook.rst:18 +msgid "" +"Multiple calls to ``logging.getLogger('someLogger')`` return a reference to " +"the same logger object. This is true not only within the same module, but " +"also across modules as long as it is in the same Python interpreter process." +" It is true for references to the same object; additionally, application " +"code can define and configure a parent logger in one module and create (but " +"not configure) a child logger in a separate module, and all logger calls to " +"the child will pass up to the parent. Here is a main module::" +msgstr "" +"无论对 ``logging.getLogger('someLogger')`` 进行多少次调用,都会返回同一个 logger " +"对象的引用。不仅在同一个模块内如此,只要是在同一个 Python " +"解释器进程中,跨模块调用也是一样。同样是引用同一个对象,应用程序也可以在一个模块中定义和配置一个父 " +"logger,而在另一个单独的模块中创建(但不配置)子 logger,对于子 logger 的所有调用都会传给父 logger。以下是主模块::" + +#: ../../howto/logging-cookbook.rst:26 +msgid "" +"import logging\n" +"import auxiliary_module\n" +"\n" +"# create logger with 'spam_application'\n" +"logger = logging.getLogger('spam_application')\n" +"logger.setLevel(logging.DEBUG)\n" +"# create file handler which logs even debug messages\n" +"fh = logging.FileHandler('spam.log')\n" +"fh.setLevel(logging.DEBUG)\n" +"# create console handler with a higher log level\n" +"ch = logging.StreamHandler()\n" +"ch.setLevel(logging.ERROR)\n" +"# create formatter and add it to the handlers\n" +"formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')\n" +"fh.setFormatter(formatter)\n" +"ch.setFormatter(formatter)\n" +"# add the handlers to the logger\n" +"logger.addHandler(fh)\n" +"logger.addHandler(ch)\n" +"\n" +"logger.info('creating an instance of auxiliary_module.Auxiliary')\n" +"a = auxiliary_module.Auxiliary()\n" +"logger.info('created an instance of auxiliary_module.Auxiliary')\n" +"logger.info('calling auxiliary_module.Auxiliary.do_something')\n" +"a.do_something()\n" +"logger.info('finished auxiliary_module.Auxiliary.do_something')\n" +"logger.info('calling auxiliary_module.some_function()')\n" +"auxiliary_module.some_function()\n" +"logger.info('done with auxiliary_module.some_function()')" +msgstr "" +"import logging\n" +"import auxiliary_module\n" +"\n" +"# 创建 'spam_application' 日志记录器\n" +"logger = logging.getLogger('spam_application')\n" +"logger.setLevel(logging.DEBUG)\n" +"# 创建可记录调试消息的文件处理器\n" +"fh = logging.FileHandler('spam.log')\n" +"fh.setLevel(logging.DEBUG)\n" +"# 创建具有更高日志层级的控制台处理器\n" +"ch = logging.StreamHandler()\n" +"ch.setLevel(logging.ERROR)\n" +"# 创建格式化器并将其添加到处理器\n" +"formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')\n" +"fh.setFormatter(formatter)\n" +"ch.setFormatter(formatter)\n" +"# 将处理器添加到日志记录器\n" +"logger.addHandler(fh)\n" +"logger.addHandler(ch)\n" +"\n" +"logger.info('creating an instance of auxiliary_module.Auxiliary')\n" +"a = auxiliary_module.Auxiliary()\n" +"logger.info('created an instance of auxiliary_module.Auxiliary')\n" +"logger.info('calling auxiliary_module.Auxiliary.do_something')\n" +"a.do_something()\n" +"logger.info('finished auxiliary_module.Auxiliary.do_something')\n" +"logger.info('calling auxiliary_module.some_function()')\n" +"auxiliary_module.some_function()\n" +"logger.info('done with auxiliary_module.some_function()')" + +#: ../../howto/logging-cookbook.rst:56 +msgid "Here is the auxiliary module::" +msgstr "以下是辅助模块::" + +#: ../../howto/logging-cookbook.rst:58 +msgid "" +"import logging\n" +"\n" +"# create logger\n" +"module_logger = logging.getLogger('spam_application.auxiliary')\n" +"\n" +"class Auxiliary:\n" +" def __init__(self):\n" +" self.logger = logging.getLogger('spam_application.auxiliary.Auxiliary')\n" +" self.logger.info('creating an instance of Auxiliary')\n" +"\n" +" def do_something(self):\n" +" self.logger.info('doing something')\n" +" a = 1 + 1\n" +" self.logger.info('done doing something')\n" +"\n" +"def some_function():\n" +" module_logger.info('received a call to \"some_function\"')" +msgstr "" +"import logging\n" +"\n" +"# 创建日志记录器\n" +"module_logger = logging.getLogger('spam_application.auxiliary')\n" +"\n" +"class Auxiliary:\n" +" def __init__(self):\n" +" self.logger = logging.getLogger('spam_application.auxiliary.Auxiliary')\n" +" self.logger.info('creating an instance of Auxiliary')\n" +"\n" +" def do_something(self):\n" +" self.logger.info('doing something')\n" +" a = 1 + 1\n" +" self.logger.info('done doing something')\n" +"\n" +"def some_function():\n" +" module_logger.info('received a call to \"some_function\"')" + +#: ../../howto/logging-cookbook.rst:76 +msgid "The output looks like this:" +msgstr "输出结果会像这样:" + +#: ../../howto/logging-cookbook.rst:78 +msgid "" +"2005-03-23 23:47:11,663 - spam_application - INFO -\n" +" creating an instance of auxiliary_module.Auxiliary\n" +"2005-03-23 23:47:11,665 - spam_application.auxiliary.Auxiliary - INFO -\n" +" creating an instance of Auxiliary\n" +"2005-03-23 23:47:11,665 - spam_application - INFO -\n" +" created an instance of auxiliary_module.Auxiliary\n" +"2005-03-23 23:47:11,668 - spam_application - INFO -\n" +" calling auxiliary_module.Auxiliary.do_something\n" +"2005-03-23 23:47:11,668 - spam_application.auxiliary.Auxiliary - INFO -\n" +" doing something\n" +"2005-03-23 23:47:11,669 - spam_application.auxiliary.Auxiliary - INFO -\n" +" done doing something\n" +"2005-03-23 23:47:11,670 - spam_application - INFO -\n" +" finished auxiliary_module.Auxiliary.do_something\n" +"2005-03-23 23:47:11,671 - spam_application - INFO -\n" +" calling auxiliary_module.some_function()\n" +"2005-03-23 23:47:11,672 - spam_application.auxiliary - INFO -\n" +" received a call to 'some_function'\n" +"2005-03-23 23:47:11,673 - spam_application - INFO -\n" +" done with auxiliary_module.some_function()" +msgstr "" +"2005-03-23 23:47:11,663 - spam_application - INFO -\n" +" creating an instance of auxiliary_module.Auxiliary\n" +"2005-03-23 23:47:11,665 - spam_application.auxiliary.Auxiliary - INFO -\n" +" creating an instance of Auxiliary\n" +"2005-03-23 23:47:11,665 - spam_application - INFO -\n" +" created an instance of auxiliary_module.Auxiliary\n" +"2005-03-23 23:47:11,668 - spam_application - INFO -\n" +" calling auxiliary_module.Auxiliary.do_something\n" +"2005-03-23 23:47:11,668 - spam_application.auxiliary.Auxiliary - INFO -\n" +" doing something\n" +"2005-03-23 23:47:11,669 - spam_application.auxiliary.Auxiliary - INFO -\n" +" done doing something\n" +"2005-03-23 23:47:11,670 - spam_application - INFO -\n" +" finished auxiliary_module.Auxiliary.do_something\n" +"2005-03-23 23:47:11,671 - spam_application - INFO -\n" +" calling auxiliary_module.some_function()\n" +"2005-03-23 23:47:11,672 - spam_application.auxiliary - INFO -\n" +" received a call to 'some_function'\n" +"2005-03-23 23:47:11,673 - spam_application - INFO -\n" +" done with auxiliary_module.some_function()" + +#: ../../howto/logging-cookbook.rst:102 +msgid "Logging from multiple threads" +msgstr "在多个线程中记录日志" + +#: ../../howto/logging-cookbook.rst:104 +msgid "" +"Logging from multiple threads requires no special effort. The following " +"example shows logging from the main (initial) thread and another thread::" +msgstr "多线程记录日志并不需要特殊处理,以下示例演示了在主线程(起始线程)和其他线程中记录日志的过程::" + +#: ../../howto/logging-cookbook.rst:107 +msgid "" +"import logging\n" +"import threading\n" +"import time\n" +"\n" +"def worker(arg):\n" +" while not arg['stop']:\n" +" logging.debug('Hi from myfunc')\n" +" time.sleep(0.5)\n" +"\n" +"def main():\n" +" logging.basicConfig(level=logging.DEBUG, format='%(relativeCreated)6d %(threadName)s %(message)s')\n" +" info = {'stop': False}\n" +" thread = threading.Thread(target=worker, args=(info,))\n" +" thread.start()\n" +" while True:\n" +" try:\n" +" logging.debug('Hello from main')\n" +" time.sleep(0.75)\n" +" except KeyboardInterrupt:\n" +" info['stop'] = True\n" +" break\n" +" thread.join()\n" +"\n" +"if __name__ == '__main__':\n" +" main()" +msgstr "" +"import logging\n" +"import threading\n" +"import time\n" +"\n" +"def worker(arg):\n" +" while not arg['stop']:\n" +" logging.debug('Hi from myfunc')\n" +" time.sleep(0.5)\n" +"\n" +"def main():\n" +" logging.basicConfig(level=logging.DEBUG, format='%(relativeCreated)6d %(threadName)s %(message)s')\n" +" info = {'stop': False}\n" +" thread = threading.Thread(target=worker, args=(info,))\n" +" thread.start()\n" +" while True:\n" +" try:\n" +" logging.debug('Hello from main')\n" +" time.sleep(0.75)\n" +" except KeyboardInterrupt:\n" +" info['stop'] = True\n" +" break\n" +" thread.join()\n" +"\n" +"if __name__ == '__main__':\n" +" main()" + +#: ../../howto/logging-cookbook.rst:133 +msgid "When run, the script should print something like the following:" +msgstr "脚本会运行输出类似下面的内容:" + +#: ../../howto/logging-cookbook.rst:135 +msgid "" +" 0 Thread-1 Hi from myfunc\n" +" 3 MainThread Hello from main\n" +" 505 Thread-1 Hi from myfunc\n" +" 755 MainThread Hello from main\n" +"1007 Thread-1 Hi from myfunc\n" +"1507 MainThread Hello from main\n" +"1508 Thread-1 Hi from myfunc\n" +"2010 Thread-1 Hi from myfunc\n" +"2258 MainThread Hello from main\n" +"2512 Thread-1 Hi from myfunc\n" +"3009 MainThread Hello from main\n" +"3013 Thread-1 Hi from myfunc\n" +"3515 Thread-1 Hi from myfunc\n" +"3761 MainThread Hello from main\n" +"4017 Thread-1 Hi from myfunc\n" +"4513 MainThread Hello from main\n" +"4518 Thread-1 Hi from myfunc" +msgstr "" +" 0 Thread-1 Hi from myfunc\n" +" 3 MainThread Hello from main\n" +" 505 Thread-1 Hi from myfunc\n" +" 755 MainThread Hello from main\n" +"1007 Thread-1 Hi from myfunc\n" +"1507 MainThread Hello from main\n" +"1508 Thread-1 Hi from myfunc\n" +"2010 Thread-1 Hi from myfunc\n" +"2258 MainThread Hello from main\n" +"2512 Thread-1 Hi from myfunc\n" +"3009 MainThread Hello from main\n" +"3013 Thread-1 Hi from myfunc\n" +"3515 Thread-1 Hi from myfunc\n" +"3761 MainThread Hello from main\n" +"4017 Thread-1 Hi from myfunc\n" +"4513 MainThread Hello from main\n" +"4518 Thread-1 Hi from myfunc" + +#: ../../howto/logging-cookbook.rst:155 +msgid "" +"This shows the logging output interspersed as one might expect. This " +"approach works for more threads than shown here, of course." +msgstr "以上如期显示了不同线程的日志是交替输出的。当然更多的线程也会如此。" + +#: ../../howto/logging-cookbook.rst:159 +msgid "Multiple handlers and formatters" +msgstr "多个 handler 和多种 formatter" + +#: ../../howto/logging-cookbook.rst:161 +msgid "" +"Loggers are plain Python objects. The :meth:`~Logger.addHandler` method has" +" no minimum or maximum quota for the number of handlers you may add. " +"Sometimes it will be beneficial for an application to log all messages of " +"all severities to a text file while simultaneously logging errors or above " +"to the console. To set this up, simply configure the appropriate handlers." +" The logging calls in the application code will remain unchanged. Here is " +"a slight modification to the previous simple module-based configuration " +"example::" +msgstr "" +"日志是个普通的 Python 对象。 :meth:`~Logger.addHandler` 方法可加入不限数量的日志 " +"handler。有时候,应用程序需把严重错误信息记入文本文件,而将一般错误或其他级别的信息输出到控制台。若要进行这样的设定,只需多配置几个日志 " +"handler 即可,应用程序的日志调用代码可以保持不变。下面对之前的分模块日志示例略做修改::" + +#: ../../howto/logging-cookbook.rst:169 +msgid "" +"import logging\n" +"\n" +"logger = logging.getLogger('simple_example')\n" +"logger.setLevel(logging.DEBUG)\n" +"# create file handler which logs even debug messages\n" +"fh = logging.FileHandler('spam.log')\n" +"fh.setLevel(logging.DEBUG)\n" +"# create console handler with a higher log level\n" +"ch = logging.StreamHandler()\n" +"ch.setLevel(logging.ERROR)\n" +"# create formatter and add it to the handlers\n" +"formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')\n" +"ch.setFormatter(formatter)\n" +"fh.setFormatter(formatter)\n" +"# add the handlers to logger\n" +"logger.addHandler(ch)\n" +"logger.addHandler(fh)\n" +"\n" +"# 'application' code\n" +"logger.debug('debug message')\n" +"logger.info('info message')\n" +"logger.warning('warn message')\n" +"logger.error('error message')\n" +"logger.critical('critical message')" +msgstr "" +"import logging\n" +"\n" +"logger = logging.getLogger('simple_example')\n" +"logger.setLevel(logging.DEBUG)\n" +"# 创建可记录调试消息的文件处理器\n" +"fh = logging.FileHandler('spam.log')\n" +"fh.setLevel(logging.DEBUG)\n" +"# 创建具有更高日志层级的控制台处理器\n" +"ch = logging.StreamHandler()\n" +"ch.setLevel(logging.ERROR)\n" +"# 创建格式化器并将其添加到处理器\n" +"formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')\n" +"ch.setFormatter(formatter)\n" +"fh.setFormatter(formatter)\n" +"# 将处理器添加到日志记录器\n" +"logger.addHandler(ch)\n" +"logger.addHandler(fh)\n" +"\n" +"# '应用程序' 代码\n" +"logger.debug('debug message')\n" +"logger.info('info message')\n" +"logger.warning('warn message')\n" +"logger.error('error message')\n" +"logger.critical('critical message')" + +#: ../../howto/logging-cookbook.rst:194 +msgid "" +"Notice that the 'application' code does not care about multiple handlers. " +"All that changed was the addition and configuration of a new handler named " +"*fh*." +msgstr "" +"需要注意的是,“应用程序”内的代码并不关心是否存在多个日志 handler。示例中所做的改变,只是新加入并配置了一个名为 *fh* 的 handler。" + +#: ../../howto/logging-cookbook.rst:197 +msgid "" +"The ability to create new handlers with higher- or lower-severity filters " +"can be very helpful when writing and testing an application. Instead of " +"using many ``print`` statements for debugging, use ``logger.debug``: Unlike " +"the print statements, which you will have to delete or comment out later, " +"the logger.debug statements can remain intact in the source code and remain " +"dormant until you need them again. At that time, the only change that needs" +" to happen is to modify the severity level of the logger and/or handler to " +"debug." +msgstr "" +"在编写和测试应用程序时,若能创建日志 handler 对不同严重级别的日志信息进行过滤,这将十分有用。调试时无需用多条 ``print`` " +"语句,而是采用 ``logger.debug``:print 语句以后还得注释或删掉,而 logger.debug " +"语句可以原样留在源码中保持静默。当需要再次调试时,只要改变日志对象或 handler 的严重级别即可。" + +#: ../../howto/logging-cookbook.rst:208 +msgid "Logging to multiple destinations" +msgstr "在多个地方记录日志" + +#: ../../howto/logging-cookbook.rst:210 +msgid "" +"Let's say you want to log to console and file with different message formats" +" and in differing circumstances. Say you want to log messages with levels of" +" DEBUG and higher to file, and those messages at level INFO and higher to " +"the console. Let's also assume that the file should contain timestamps, but " +"the console messages should not. Here's how you can achieve this::" +msgstr "" +"假定要根据不同的情况将日志以不同的格式写入控制台和文件。比如把 DEBUG 以上级别的日志信息写于文件,并且把 INFO " +"以上的日志信息输出到控制台。再假设日志文件需要包含时间戳,控制台信息则不需要。以下演示了做法::" + +#: ../../howto/logging-cookbook.rst:216 +msgid "" +"import logging\n" +"\n" +"# set up logging to file - see previous section for more details\n" +"logging.basicConfig(level=logging.DEBUG,\n" +" format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',\n" +" datefmt='%m-%d %H:%M',\n" +" filename='/tmp/myapp.log',\n" +" filemode='w')\n" +"# define a Handler which writes INFO messages or higher to the sys.stderr\n" +"console = logging.StreamHandler()\n" +"console.setLevel(logging.INFO)\n" +"# set a format which is simpler for console use\n" +"formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')\n" +"# tell the handler to use this format\n" +"console.setFormatter(formatter)\n" +"# add the handler to the root logger\n" +"logging.getLogger().addHandler(console)\n" +"\n" +"# Now, we can log to the root logger, or any other logger. First the root...\n" +"logging.info('Jackdaws love my big sphinx of quartz.')\n" +"\n" +"# Now, define a couple of other loggers which might represent areas in your\n" +"# application:\n" +"\n" +"logger1 = logging.getLogger('myapp.area1')\n" +"logger2 = logging.getLogger('myapp.area2')\n" +"\n" +"logger1.debug('Quick zephyrs blow, vexing daft Jim.')\n" +"logger1.info('How quickly daft jumping zebras vex.')\n" +"logger2.warning('Jail zesty vixen who grabbed pay from quack.')\n" +"logger2.error('The five boxing wizards jump quickly.')" +msgstr "" +"import logging\n" +"\n" +"# 设置日志记录到文件 —— 参阅前一节了解详情\n" +"logging.basicConfig(level=logging.DEBUG,\n" +" format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',\n" +" datefmt='%m-%d %H:%M',\n" +" filename='/tmp/myapp.log',\n" +" filemode='w')\n" +"# 定义一个将 INFO 或更高层级消息写到 sys.stderr 的处理器\n" +"console = logging.StreamHandler()\n" +"console.setLevel(logging.INFO)\n" +"# 设置一个适用于控制台的更简单格式\n" +"formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')\n" +"# 告诉处理器使用此格式\n" +"console.setFormatter(formatter)\n" +"# 将处理器添加到根日志记录器\n" +"logging.getLogger().addHandler(console)\n" +"\n" +"# 现在我们可以写入根记录器或任何其他记录器。首先是根记录器...\n" +"logging.info('Jackdaws love my big sphinx of quartz.')\n" +"\n" +"# 现在,定义几个可以代表你的应用程序中不同组成部分的\n" +"# 其他日志记录器:\n" +"\n" +"logger1 = logging.getLogger('myapp.area1')\n" +"logger2 = logging.getLogger('myapp.area2')\n" +"\n" +"logger1.debug('Quick zephyrs blow, vexing daft Jim.')\n" +"logger1.info('How quickly daft jumping zebras vex.')\n" +"logger2.warning('Jail zesty vixen who grabbed pay from quack.')\n" +"logger2.error('The five boxing wizards jump quickly.')" + +#: ../../howto/logging-cookbook.rst:248 +msgid "When you run this, on the console you will see" +msgstr "当运行后,你会看到控制台如下所示" + +#: ../../howto/logging-cookbook.rst:250 +msgid "" +"root : INFO Jackdaws love my big sphinx of quartz.\n" +"myapp.area1 : INFO How quickly daft jumping zebras vex.\n" +"myapp.area2 : WARNING Jail zesty vixen who grabbed pay from quack.\n" +"myapp.area2 : ERROR The five boxing wizards jump quickly." +msgstr "" +"root : INFO Jackdaws love my big sphinx of quartz.\n" +"myapp.area1 : INFO How quickly daft jumping zebras vex.\n" +"myapp.area2 : WARNING Jail zesty vixen who grabbed pay from quack.\n" +"myapp.area2 : ERROR The five boxing wizards jump quickly." + +#: ../../howto/logging-cookbook.rst:257 +msgid "and in the file you will see something like" +msgstr "而日志文件将如下所示:" + +#: ../../howto/logging-cookbook.rst:259 +msgid "" +"10-22 22:19 root INFO Jackdaws love my big sphinx of quartz.\n" +"10-22 22:19 myapp.area1 DEBUG Quick zephyrs blow, vexing daft Jim.\n" +"10-22 22:19 myapp.area1 INFO How quickly daft jumping zebras vex.\n" +"10-22 22:19 myapp.area2 WARNING Jail zesty vixen who grabbed pay from quack.\n" +"10-22 22:19 myapp.area2 ERROR The five boxing wizards jump quickly." +msgstr "" +"10-22 22:19 root INFO Jackdaws love my big sphinx of quartz.\n" +"10-22 22:19 myapp.area1 DEBUG Quick zephyrs blow, vexing daft Jim.\n" +"10-22 22:19 myapp.area1 INFO How quickly daft jumping zebras vex.\n" +"10-22 22:19 myapp.area2 WARNING Jail zesty vixen who grabbed pay from quack.\n" +"10-22 22:19 myapp.area2 ERROR The five boxing wizards jump quickly." + +#: ../../howto/logging-cookbook.rst:267 +msgid "" +"As you can see, the DEBUG message only shows up in the file. The other " +"messages are sent to both destinations." +msgstr "如您所见,DEBUG 级别的日志信息只出现在了文件中,而其他信息则两个地方都会输出。" + +#: ../../howto/logging-cookbook.rst:270 +msgid "" +"This example uses console and file handlers, but you can use any number and " +"combination of handlers you choose." +msgstr "上述示例只用到了控制台和文件 handler,当然还可以自由组合任意数量的日志 handler。" + +#: ../../howto/logging-cookbook.rst:273 +msgid "" +"Note that the above choice of log filename ``/tmp/myapp.log`` implies use of" +" a standard location for temporary files on POSIX systems. On Windows, you " +"may need to choose a different directory name for the log - just ensure that" +" the directory exists and that you have the permissions to create and update" +" files in it." +msgstr "" +"请注意上面选择的日志文件名 ``/tmp/myapp.log`` 表示在 POSIX 系统上使用临时文件的标准位置。在 Windows " +"上,你可能需要为日志选择不同的目录名称 —— 只要确保该目录存在并且你有在其中创建和更新文件的权限。" + +#: ../../howto/logging-cookbook.rst:282 +msgid "Custom handling of levels" +msgstr "自定义处理级别" + +#: ../../howto/logging-cookbook.rst:284 +msgid "" +"Sometimes, you might want to do something slightly different from the " +"standard handling of levels in handlers, where all levels above a threshold " +"get processed by a handler. To do this, you need to use filters. Let's look " +"at a scenario where you want to arrange things as follows:" +msgstr "" +"有时,你想要做的可能略微不同于处理器中标准的级别处理方式,即某个界限以上的所有级别都会被处理器所处理。要做到这一点,你需要使用过滤器。 " +"让我们来看一个假设你想要执行如下安排的场景:" + +#: ../../howto/logging-cookbook.rst:289 +msgid "Send messages of severity ``INFO`` and ``WARNING`` to ``sys.stdout``" +msgstr "将严重级别为 ``INFO`` 和 ``WARNING`` 的消息发送到 ``sys.stdout``" + +#: ../../howto/logging-cookbook.rst:290 +msgid "Send messages of severity ``ERROR`` and above to ``sys.stderr``" +msgstr "将严重级别为 ``ERROR`` 及以上的消息发送到 ``sys.stderr``" + +#: ../../howto/logging-cookbook.rst:291 +msgid "Send messages of severity ``DEBUG`` and above to file ``app.log``" +msgstr "将严重级别为 ``DEBUG`` 及以上的消息发送到文件 ``app.log``" + +#: ../../howto/logging-cookbook.rst:293 +msgid "Suppose you configure logging with the following JSON:" +msgstr "假定你使用以下 JSON 来配置日志记录:" + +#: ../../howto/logging-cookbook.rst:295 +msgid "" +"{\n" +" \"version\": 1,\n" +" \"disable_existing_loggers\": false,\n" +" \"formatters\": {\n" +" \"simple\": {\n" +" \"format\": \"%(levelname)-8s - %(message)s\"\n" +" }\n" +" },\n" +" \"handlers\": {\n" +" \"stdout\": {\n" +" \"class\": \"logging.StreamHandler\",\n" +" \"level\": \"INFO\",\n" +" \"formatter\": \"simple\",\n" +" \"stream\": \"ext://sys.stdout\"\n" +" },\n" +" \"stderr\": {\n" +" \"class\": \"logging.StreamHandler\",\n" +" \"level\": \"ERROR\",\n" +" \"formatter\": \"simple\",\n" +" \"stream\": \"ext://sys.stderr\"\n" +" },\n" +" \"file\": {\n" +" \"class\": \"logging.FileHandler\",\n" +" \"formatter\": \"simple\",\n" +" \"filename\": \"app.log\",\n" +" \"mode\": \"w\"\n" +" }\n" +" },\n" +" \"root\": {\n" +" \"level\": \"DEBUG\",\n" +" \"handlers\": [\n" +" \"stderr\",\n" +" \"stdout\",\n" +" \"file\"\n" +" ]\n" +" }\n" +"}" +msgstr "" +"{\n" +" \"version\": 1,\n" +" \"disable_existing_loggers\": false,\n" +" \"formatters\": {\n" +" \"simple\": {\n" +" \"format\": \"%(levelname)-8s - %(message)s\"\n" +" }\n" +" },\n" +" \"handlers\": {\n" +" \"stdout\": {\n" +" \"class\": \"logging.StreamHandler\",\n" +" \"level\": \"INFO\",\n" +" \"formatter\": \"simple\",\n" +" \"stream\": \"ext://sys.stdout\"\n" +" },\n" +" \"stderr\": {\n" +" \"class\": \"logging.StreamHandler\",\n" +" \"level\": \"ERROR\",\n" +" \"formatter\": \"simple\",\n" +" \"stream\": \"ext://sys.stderr\"\n" +" },\n" +" \"file\": {\n" +" \"class\": \"logging.FileHandler\",\n" +" \"formatter\": \"simple\",\n" +" \"filename\": \"app.log\",\n" +" \"mode\": \"w\"\n" +" }\n" +" },\n" +" \"root\": {\n" +" \"level\": \"DEBUG\",\n" +" \"handlers\": [\n" +" \"stderr\",\n" +" \"stdout\",\n" +" \"file\"\n" +" ]\n" +" }\n" +"}" + +#: ../../howto/logging-cookbook.rst:335 +msgid "" +"This configuration does *almost* what we want, except that ``sys.stdout`` " +"would show messages of severity ``ERROR`` and only events of this severity " +"and higher will be tracked as well as ``INFO`` and ``WARNING`` messages. To " +"prevent this, we can set up a filter which excludes those messages and add " +"it to the relevant handler. This can be configured by adding a ``filters`` " +"section parallel to ``formatters`` and ``handlers``:" +msgstr "" +"这个配置 *几乎* 能做到我们想要的,但是除了 ``sys.stdout`` 在 ``INFO`` 和 ``WARNING`` 消息之外会只显示严重程度" +" ``ERROR`` 及以上的消息。为了防止这种情况,我们可以设置一个排除掉这些消息的过滤器并将其添加到相应的处理器中。这可以通过添加一个平行于 " +"``formatters`` 和 ``handlers`` 的 ``filters`` 节来配置:" + +#: ../../howto/logging-cookbook.rst:341 +msgid "" +"{\n" +" \"filters\": {\n" +" \"warnings_and_below\": {\n" +" \"()\" : \"__main__.filter_maker\",\n" +" \"level\": \"WARNING\"\n" +" }\n" +" }\n" +"}" +msgstr "" +"{\n" +" \"filters\": {\n" +" \"warnings_and_below\": {\n" +" \"()\" : \"__main__.filter_maker\",\n" +" \"level\": \"WARNING\"\n" +" }\n" +" }\n" +"}" + +#: ../../howto/logging-cookbook.rst:352 +msgid "and changing the section on the ``stdout`` handler to add it:" +msgstr "并修改 ``stdout`` 处理器上的节来添加它:" + +#: ../../howto/logging-cookbook.rst:354 +msgid "" +"{\n" +" \"stdout\": {\n" +" \"class\": \"logging.StreamHandler\",\n" +" \"level\": \"INFO\",\n" +" \"formatter\": \"simple\",\n" +" \"stream\": \"ext://sys.stdout\",\n" +" \"filters\": [\"warnings_and_below\"]\n" +" }\n" +"}" +msgstr "" +"{\n" +" \"stdout\": {\n" +" \"class\": \"logging.StreamHandler\",\n" +" \"level\": \"INFO\",\n" +" \"formatter\": \"simple\",\n" +" \"stream\": \"ext://sys.stdout\",\n" +" \"filters\": [\"warnings_and_below\"]\n" +" }\n" +"}" + +#: ../../howto/logging-cookbook.rst:366 +msgid "" +"A filter is just a function, so we can define the ``filter_maker`` (a " +"factory function) as follows:" +msgstr "过滤器就是一个函数,因此我们可以定义 ``filter_maker`` (工厂函数) 如下:" + +#: ../../howto/logging-cookbook.rst:369 +msgid "" +"def filter_maker(level):\n" +" level = getattr(logging, level)\n" +"\n" +" def filter(record):\n" +" return record.levelno <= level\n" +"\n" +" return filter" +msgstr "" +"def filter_maker(level):\n" +" level = getattr(logging, level)\n" +"\n" +" def filter(record):\n" +" return record.levelno <= level\n" +"\n" +" return filter" + +#: ../../howto/logging-cookbook.rst:379 +msgid "" +"This converts the string argument passed in to a numeric level, and returns " +"a function which only returns ``True`` if the level of the passed in record " +"is at or below the specified level. Note that in this example I have defined" +" the ``filter_maker`` in a test script ``main.py`` that I run from the " +"command line, so its module will be ``__main__`` - hence the " +"``__main__.filter_maker`` in the filter configuration. You will need to " +"change that if you define it in a different module." +msgstr "" +"此函数将传入的字符串参数转换为数字级别,并返回一个仅在传入等于或低于指定数字级别的级别时返回 ``True`` 的函数。请注意在这个示例中我是将 " +"``filter_maker`` 定义在一个从命令行运行的测试脚本 ``main.py`` 中,因此其所属模块将为 ``__main__`` —— " +"即在过滤器配置中写作 ``__main__.filter_maker``。如果你在不同的模块中定义它则需要加以修改。" + +#: ../../howto/logging-cookbook.rst:387 +msgid "With the filter added, we can run ``main.py``, which in full is:" +msgstr "在添加该过滤器后,我们就可以运行 ``main.py``,完整代码如下:" + +#: ../../howto/logging-cookbook.rst:389 +msgid "" +"import json\n" +"import logging\n" +"import logging.config\n" +"\n" +"CONFIG = '''\n" +"{\n" +" \"version\": 1,\n" +" \"disable_existing_loggers\": false,\n" +" \"formatters\": {\n" +" \"simple\": {\n" +" \"format\": \"%(levelname)-8s - %(message)s\"\n" +" }\n" +" },\n" +" \"filters\": {\n" +" \"warnings_and_below\": {\n" +" \"()\" : \"__main__.filter_maker\",\n" +" \"level\": \"WARNING\"\n" +" }\n" +" },\n" +" \"handlers\": {\n" +" \"stdout\": {\n" +" \"class\": \"logging.StreamHandler\",\n" +" \"level\": \"INFO\",\n" +" \"formatter\": \"simple\",\n" +" \"stream\": \"ext://sys.stdout\",\n" +" \"filters\": [\"warnings_and_below\"]\n" +" },\n" +" \"stderr\": {\n" +" \"class\": \"logging.StreamHandler\",\n" +" \"level\": \"ERROR\",\n" +" \"formatter\": \"simple\",\n" +" \"stream\": \"ext://sys.stderr\"\n" +" },\n" +" \"file\": {\n" +" \"class\": \"logging.FileHandler\",\n" +" \"formatter\": \"simple\",\n" +" \"filename\": \"app.log\",\n" +" \"mode\": \"w\"\n" +" }\n" +" },\n" +" \"root\": {\n" +" \"level\": \"DEBUG\",\n" +" \"handlers\": [\n" +" \"stderr\",\n" +" \"stdout\",\n" +" \"file\"\n" +" ]\n" +" }\n" +"}\n" +"'''\n" +"\n" +"def filter_maker(level):\n" +" level = getattr(logging, level)\n" +"\n" +" def filter(record):\n" +" return record.levelno <= level\n" +"\n" +" return filter\n" +"\n" +"logging.config.dictConfig(json.loads(CONFIG))\n" +"logging.debug('A DEBUG message')\n" +"logging.info('An INFO message')\n" +"logging.warning('A WARNING message')\n" +"logging.error('An ERROR message')\n" +"logging.critical('A CRITICAL message')" +msgstr "" +"import json\n" +"import logging\n" +"import logging.config\n" +"\n" +"CONFIG = '''\n" +"{\n" +" \"version\": 1,\n" +" \"disable_existing_loggers\": false,\n" +" \"formatters\": {\n" +" \"simple\": {\n" +" \"format\": \"%(levelname)-8s - %(message)s\"\n" +" }\n" +" },\n" +" \"filters\": {\n" +" \"warnings_and_below\": {\n" +" \"()\" : \"__main__.filter_maker\",\n" +" \"level\": \"WARNING\"\n" +" }\n" +" },\n" +" \"handlers\": {\n" +" \"stdout\": {\n" +" \"class\": \"logging.StreamHandler\",\n" +" \"level\": \"INFO\",\n" +" \"formatter\": \"simple\",\n" +" \"stream\": \"ext://sys.stdout\",\n" +" \"filters\": [\"warnings_and_below\"]\n" +" },\n" +" \"stderr\": {\n" +" \"class\": \"logging.StreamHandler\",\n" +" \"level\": \"ERROR\",\n" +" \"formatter\": \"simple\",\n" +" \"stream\": \"ext://sys.stderr\"\n" +" },\n" +" \"file\": {\n" +" \"class\": \"logging.FileHandler\",\n" +" \"formatter\": \"simple\",\n" +" \"filename\": \"app.log\",\n" +" \"mode\": \"w\"\n" +" }\n" +" },\n" +" \"root\": {\n" +" \"level\": \"DEBUG\",\n" +" \"handlers\": [\n" +" \"stderr\",\n" +" \"stdout\",\n" +" \"file\"\n" +" ]\n" +" }\n" +"}\n" +"'''\n" +"\n" +"def filter_maker(level):\n" +" level = getattr(logging, level)\n" +"\n" +" def filter(record):\n" +" return record.levelno <= level\n" +"\n" +" return filter\n" +"\n" +"logging.config.dictConfig(json.loads(CONFIG))\n" +"logging.debug('A DEBUG message')\n" +"logging.info('An INFO message')\n" +"logging.warning('A WARNING message')\n" +"logging.error('An ERROR message')\n" +"logging.critical('A CRITICAL message')" + +#: ../../howto/logging-cookbook.rst:457 +msgid "And after running it like this:" +msgstr "使用这样的命令运行它之后:" + +#: ../../howto/logging-cookbook.rst:459 +msgid "python main.py 2>stderr.log >stdout.log" +msgstr "python main.py 2>stderr.log >stdout.log" + +#: ../../howto/logging-cookbook.rst:463 +msgid "We can see the results are as expected:" +msgstr "我们可以看到结果是符合预期的:" + +#: ../../howto/logging-cookbook.rst:465 +msgid "" +"$ more *.log\n" +"::::::::::::::\n" +"app.log\n" +"::::::::::::::\n" +"DEBUG - A DEBUG message\n" +"INFO - An INFO message\n" +"WARNING - A WARNING message\n" +"ERROR - An ERROR message\n" +"CRITICAL - A CRITICAL message\n" +"::::::::::::::\n" +"stderr.log\n" +"::::::::::::::\n" +"ERROR - An ERROR message\n" +"CRITICAL - A CRITICAL message\n" +"::::::::::::::\n" +"stdout.log\n" +"::::::::::::::\n" +"INFO - An INFO message\n" +"WARNING - A WARNING message" +msgstr "" +"$ more *.log\n" +"::::::::::::::\n" +"app.log\n" +"::::::::::::::\n" +"DEBUG - A DEBUG message\n" +"INFO - An INFO message\n" +"WARNING - A WARNING message\n" +"ERROR - An ERROR message\n" +"CRITICAL - A CRITICAL message\n" +"::::::::::::::\n" +"stderr.log\n" +"::::::::::::::\n" +"ERROR - An ERROR message\n" +"CRITICAL - A CRITICAL message\n" +"::::::::::::::\n" +"stdout.log\n" +"::::::::::::::\n" +"INFO - An INFO message\n" +"WARNING - A WARNING message" + +#: ../../howto/logging-cookbook.rst:489 +msgid "Configuration server example" +msgstr "日志配置服务器示例" + +#: ../../howto/logging-cookbook.rst:491 +msgid "" +"Here is an example of a module using the logging configuration server::" +msgstr "以下是一个用到了日志配置服务器的模块示例::" + +#: ../../howto/logging-cookbook.rst:493 +msgid "" +"import logging\n" +"import logging.config\n" +"import time\n" +"import os\n" +"\n" +"# read initial config file\n" +"logging.config.fileConfig('logging.conf')\n" +"\n" +"# create and start listener on port 9999\n" +"t = logging.config.listen(9999)\n" +"t.start()\n" +"\n" +"logger = logging.getLogger('simpleExample')\n" +"\n" +"try:\n" +" # loop through logging calls to see the difference\n" +" # new configurations make, until Ctrl+C is pressed\n" +" while True:\n" +" logger.debug('debug message')\n" +" logger.info('info message')\n" +" logger.warning('warn message')\n" +" logger.error('error message')\n" +" logger.critical('critical message')\n" +" time.sleep(5)\n" +"except KeyboardInterrupt:\n" +" # cleanup\n" +" logging.config.stopListening()\n" +" t.join()" +msgstr "" +"import logging\n" +"import logging.config\n" +"import time\n" +"import os\n" +"\n" +"# 读取初始配置文件\n" +"logging.config.fileConfig('logging.conf')\n" +"\n" +"# 在 9999 端口上创建并启动监听器\n" +"t = logging.config.listen(9999)\n" +"t.start()\n" +"\n" +"logger = logging.getLogger('simpleExample')\n" +"\n" +"try:\n" +" # 循环遍历日志记录调用以查看\n" +" # 新配置进行的修改,直到按下 Ctrl+C\n" +" while True:\n" +" logger.debug('debug message')\n" +" logger.info('info message')\n" +" logger.warning('warn message')\n" +" logger.error('error message')\n" +" logger.critical('critical message')\n" +" time.sleep(5)\n" +"except KeyboardInterrupt:\n" +" # 清理\n" +" logging.config.stopListening()\n" +" t.join()" + +#: ../../howto/logging-cookbook.rst:522 +msgid "" +"And here is a script that takes a filename and sends that file to the " +"server, properly preceded with the binary-encoded length, as the new logging" +" configuration::" +msgstr "以下脚本将接受文件名作为参数,然后将此文件发送到服务器,前面加上文件的二进制编码长度,做为新的日志配置::" + +#: ../../howto/logging-cookbook.rst:526 +msgid "" +"#!/usr/bin/env python\n" +"import socket, sys, struct\n" +"\n" +"with open(sys.argv[1], 'rb') as f:\n" +" data_to_send = f.read()\n" +"\n" +"HOST = 'localhost'\n" +"PORT = 9999\n" +"s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n" +"print('connecting...')\n" +"s.connect((HOST, PORT))\n" +"print('sending config...')\n" +"s.send(struct.pack('>L', len(data_to_send)))\n" +"s.send(data_to_send)\n" +"s.close()\n" +"print('complete')" +msgstr "" +"#!/usr/bin/env python\n" +"import socket, sys, struct\n" +"\n" +"with open(sys.argv[1], 'rb') as f:\n" +" data_to_send = f.read()\n" +"\n" +"HOST = 'localhost'\n" +"PORT = 9999\n" +"s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n" +"print('connecting...')\n" +"s.connect((HOST, PORT))\n" +"print('sending config...')\n" +"s.send(struct.pack('>L', len(data_to_send)))\n" +"s.send(data_to_send)\n" +"s.close()\n" +"print('complete')" + +#: ../../howto/logging-cookbook.rst:547 +msgid "Dealing with handlers that block" +msgstr "处理日志 handler 的阻塞" + +#: ../../howto/logging-cookbook.rst:551 +msgid "" +"Sometimes you have to get your logging handlers to do their work without " +"blocking the thread you're logging from. This is common in web applications," +" though of course it also occurs in other scenarios." +msgstr "有时你必须让日志记录处理程序的运行不会阻塞你要记录日志的线程。这在 Web 应用程序中是很常见,当然在其他场景中也可能发生。" + +#: ../../howto/logging-cookbook.rst:555 +msgid "" +"A common culprit which demonstrates sluggish behaviour is the " +":class:`SMTPHandler`: sending emails can take a long time, for a number of " +"reasons outside the developer's control (for example, a poorly performing " +"mail or network infrastructure). But almost any network-based handler can " +"block: Even a :class:`SocketHandler` operation may do a DNS query under the " +"hood which is too slow (and this query can be deep in the socket library " +"code, below the Python layer, and outside your control)." +msgstr "" +"有一种原因往往会让程序表现迟钝,这就是 " +":class:`SMTPHandler`:由于很多因素是开发人员无法控制的(例如邮件或网络基础设施的性能不佳),发送电子邮件可能需要很长时间。不过几乎所有网络" +" handler 都可能会发生阻塞:即使是 :class:`SocketHandler` 操作也可能在后台执行 DNS " +"查询,而这种查询实在太慢了(并且 DNS 查询还可能在很底层的套接字库代码中,位于 Python 层之下,超出了可控范围)。" + +#: ../../howto/logging-cookbook.rst:563 +msgid "" +"One solution is to use a two-part approach. For the first part, attach only " +"a :class:`QueueHandler` to those loggers which are accessed from " +"performance-critical threads. They simply write to their queue, which can be" +" sized to a large enough capacity or initialized with no upper bound to " +"their size. The write to the queue will typically be accepted quickly, " +"though you will probably need to catch the :exc:`queue.Full` exception as a " +"precaution in your code. If you are a library developer who has performance-" +"critical threads in their code, be sure to document this (together with a " +"suggestion to attach only ``QueueHandlers`` to your loggers) for the benefit" +" of other developers who will use your code." +msgstr "" +"有一种解决方案是分成两部分实现。第一部分,针对那些对性能有要求的关键线程,只为日志对象连接一个 " +":class:`QueueHandler`。日志对象只需简单地写入队列即可,可为队列设置足够大的容量,或者可以在初始化时不设置容量上限。尽管为以防万一,可能需要在代码中捕获" +" :exc:`queue.Full` " +"异常,不过队列写入操作通常会很快得以处理。如果要开发库代码,包含性能要求较高的线程,为了让使用该库的开发人员受益,请务必在开发文档中进行标明(包括建议仅连接" +" ``QueueHandlers`` )." + +#: ../../howto/logging-cookbook.rst:574 +msgid "" +"The second part of the solution is :class:`QueueListener`, which has been " +"designed as the counterpart to :class:`QueueHandler`. A " +":class:`QueueListener` is very simple: it's passed a queue and some " +"handlers, and it fires up an internal thread which listens to its queue for " +"LogRecords sent from ``QueueHandlers`` (or any other source of " +"``LogRecords``, for that matter). The ``LogRecords`` are removed from the " +"queue and passed to the handlers for processing." +msgstr "" +"解决方案的另一部分就是 :class:`QueueListener`,它被设计为 :class:`QueueHandler` 的对应部分。 " +":class:`QueueListener` 非常简单:传入一个队列和一些处理器,并启动一个内部线程,用于侦听 ``QueueHandlers`` " +"(或其他 ``LogRecords`` 源) 发送的 LogRecord 队列。 ``LogRecords`` 会从队列中移除并传给处理器处理。" + +#: ../../howto/logging-cookbook.rst:582 +msgid "" +"The advantage of having a separate :class:`QueueListener` class is that you " +"can use the same instance to service multiple ``QueueHandlers``. This is " +"more resource-friendly than, say, having threaded versions of the existing " +"handler classes, which would eat up one thread per handler for no particular" +" benefit." +msgstr "" +":class:`QueueListener` 作为单独的类,好处就是可以用同一个实例为多个 ``QueueHandlers`` 服务。这比把现有 " +"handler 类线程化更加资源友好,后者会每个 handler 会占用一个线程,却没有特别的好处。" + +#: ../../howto/logging-cookbook.rst:587 +msgid "An example of using these two classes follows (imports omitted)::" +msgstr "以下是这两个类的运用示例(省略了 import 语句)::" + +#: ../../howto/logging-cookbook.rst:589 +msgid "" +"que = queue.Queue(-1) # no limit on size\n" +"queue_handler = QueueHandler(que)\n" +"handler = logging.StreamHandler()\n" +"listener = QueueListener(que, handler)\n" +"root = logging.getLogger()\n" +"root.addHandler(queue_handler)\n" +"formatter = logging.Formatter('%(threadName)s: %(message)s')\n" +"handler.setFormatter(formatter)\n" +"listener.start()\n" +"# The log output will display the thread which generated\n" +"# the event (the main thread) rather than the internal\n" +"# thread which monitors the internal queue. This is what\n" +"# you want to happen.\n" +"root.warning('Look out!')\n" +"listener.stop()" +msgstr "" +"que = queue.Queue(-1) # 对大小没有限制\n" +"queue_handler = QueueHandler(que)\n" +"handler = logging.StreamHandler()\n" +"listener = QueueListener(que, handler)\n" +"root = logging.getLogger()\n" +"root.addHandler(queue_handler)\n" +"formatter = logging.Formatter('%(threadName)s: %(message)s')\n" +"handler.setFormatter(formatter)\n" +"listener.start()\n" +"# 日志输出将显示生成事件的线程(主线程)\n" +"# 而不是监控内部队列的内部线程。这也正是\n" +"# 你所希望的。\n" +"root.warning('Look out!')\n" +"listener.stop()" + +#: ../../howto/logging-cookbook.rst:605 +msgid "which, when run, will produce:" +msgstr "在运行后会产生:" + +#: ../../howto/logging-cookbook.rst:607 +msgid "MainThread: Look out!" +msgstr "MainThread: Look out!" + +#: ../../howto/logging-cookbook.rst:611 +msgid "" +"Although the earlier discussion wasn't specifically talking about async " +"code, but rather about slow logging handlers, it should be noted that when " +"logging from async code, network and even file handlers could lead to " +"problems (blocking the event loop) because some logging is done from " +":mod:`asyncio` internals. It might be best, if any async code is used in an " +"application, to use the above approach for logging, so that any blocking " +"code runs only in the ``QueueListener`` thread." +msgstr "" +"虽然前面的讨论没有专门提及异步代码,但需要注意当在异步代码中记录日志时,网络甚至文件处理器都可能会导致问题(阻塞事件循环)因为某些日志记录是在 " +":mod:`asyncio` 内部完成的。如果在应用程序中使用了任何异步代码,最好的做法是使用上面的日志记录方式,这样任何阻塞式代码都将只在 " +"``QueueListener`` 线程中运行。" + +#: ../../howto/logging-cookbook.rst:619 +msgid "" +"Prior to Python 3.5, the :class:`QueueListener` always passed every message " +"received from the queue to every handler it was initialized with. (This was " +"because it was assumed that level filtering was all done on the other side, " +"where the queue is filled.) From 3.5 onwards, this behaviour can be changed " +"by passing a keyword argument ``respect_handler_level=True`` to the " +"listener's constructor. When this is done, the listener compares the level " +"of each message with the handler's level, and only passes a message to a " +"handler if it's appropriate to do so." +msgstr "" +"在 Python 3.5 之前,:class:`QueueListener` " +"总会把由队列接收到的每条信息都传递给已初始化的每个处理程序。(因为这里假定级别过滤操作已在写入队列时完成了。)从 3.5 " +"版开始,可以修改这种处理方式,只要将关键字参数 ``respect_handler_level=True`` " +"传给侦听器的构造函数即可。这样侦听器将会把每条信息的级别与 handler 的级别进行比较,只在适配时才会将信息传给 handler。" + +#: ../../howto/logging-cookbook.rst:629 +msgid "" +"The :class:`QueueListener` can be started (and stopped) via the " +":keyword:`with` statement. For example:" +msgstr ":class:`QueueListener` 可通过 :keyword:`with` 语句来启动(和停止)。例如:" + +#: ../../howto/logging-cookbook.rst:633 +msgid "" +"with QueueListener(que, handler) as listener:\n" +" # The queue listener automatically starts\n" +" # when the 'with' block is entered.\n" +" pass\n" +"# The queue listener automatically stops once\n" +"# the 'with' block is exited." +msgstr "" +"with QueueListener(que, handler) as listener:\n" +" # 该队列监听器将会在进入\n" +" # 'with' 代码块时自动启动。\n" +" pass\n" +"# 该队列监听器将在退出\n" +"# 'with' 代码块时自动停止。" + +#: ../../howto/logging-cookbook.rst:645 +msgid "Sending and receiving logging events across a network" +msgstr "通过网络收发日志事件" + +#: ../../howto/logging-cookbook.rst:647 +msgid "" +"Let's say you want to send logging events across a network, and handle them " +"at the receiving end. A simple way of doing this is attaching a " +":class:`SocketHandler` instance to the root logger at the sending end::" +msgstr "" +"假定现在要通过网络发送日志事件,并在接收端进行处理。有一种简单的方案,就是在发送端的根日志对象连接一个 :class:`SocketHandler` " +"实例::" + +#: ../../howto/logging-cookbook.rst:651 +msgid "" +"import logging, logging.handlers\n" +"\n" +"rootLogger = logging.getLogger()\n" +"rootLogger.setLevel(logging.DEBUG)\n" +"socketHandler = logging.handlers.SocketHandler('localhost',\n" +" logging.handlers.DEFAULT_TCP_LOGGING_PORT)\n" +"# don't bother with a formatter, since a socket handler sends the event as\n" +"# an unformatted pickle\n" +"rootLogger.addHandler(socketHandler)\n" +"\n" +"# Now, we can log to the root logger, or any other logger. First the root...\n" +"logging.info('Jackdaws love my big sphinx of quartz.')\n" +"\n" +"# Now, define a couple of other loggers which might represent areas in your\n" +"# application:\n" +"\n" +"logger1 = logging.getLogger('myapp.area1')\n" +"logger2 = logging.getLogger('myapp.area2')\n" +"\n" +"logger1.debug('Quick zephyrs blow, vexing daft Jim.')\n" +"logger1.info('How quickly daft jumping zebras vex.')\n" +"logger2.warning('Jail zesty vixen who grabbed pay from quack.')\n" +"logger2.error('The five boxing wizards jump quickly.')" +msgstr "" +"import logging, logging.handlers\n" +"\n" +"rootLogger = logging.getLogger()\n" +"rootLogger.setLevel(logging.DEBUG)\n" +"socketHandler = logging.handlers.SocketHandler('localhost',\n" +" logging.handlers.DEFAULT_TCP_LOGGING_PORT)\n" +"# 不必设置格式化器,因为套接字处理器会将事件以未格式化的\n" +"# pickle 形式发送\n" +"rootLogger.addHandler(socketHandler)\n" +"\n" +"# 现在我们可以写入根记录器或任何其他记录器。首先是根记录器...\n" +"logging.info('Jackdaws love my big sphinx of quartz.')\n" +"\n" +"# 现在定义几个可以代表你的应用程序中不同组成部分的\n" +"# 其他日志记录器:\n" +"\n" +"logger1 = logging.getLogger('myapp.area1')\n" +"logger2 = logging.getLogger('myapp.area2')\n" +"\n" +"logger1.debug('Quick zephyrs blow, vexing daft Jim.')\n" +"logger1.info('How quickly daft jumping zebras vex.')\n" +"logger2.warning('Jail zesty vixen who grabbed pay from quack.')\n" +"logger2.error('The five boxing wizards jump quickly.')" + +#: ../../howto/logging-cookbook.rst:675 +msgid "" +"At the receiving end, you can set up a receiver using the " +":mod:`socketserver` module. Here is a basic working example::" +msgstr "在接收端,可以用 :mod:`socketserver` 模块设置一个接收器。简要示例如下::" + +#: ../../howto/logging-cookbook.rst:678 +msgid "" +"import pickle\n" +"import logging\n" +"import logging.handlers\n" +"import socketserver\n" +"import struct\n" +"\n" +"\n" +"class LogRecordStreamHandler(socketserver.StreamRequestHandler):\n" +" \"\"\"Handler for a streaming logging request.\n" +"\n" +" This basically logs the record using whatever logging policy is\n" +" configured locally.\n" +" \"\"\"\n" +"\n" +" def handle(self):\n" +" \"\"\"\n" +" Handle multiple requests - each expected to be a 4-byte length,\n" +" followed by the LogRecord in pickle format. Logs the record\n" +" according to whatever policy is configured locally.\n" +" \"\"\"\n" +" while True:\n" +" chunk = self.connection.recv(4)\n" +" if len(chunk) < 4:\n" +" break\n" +" slen = struct.unpack('>L', chunk)[0]\n" +" chunk = self.connection.recv(slen)\n" +" while len(chunk) < slen:\n" +" chunk = chunk + self.connection.recv(slen - len(chunk))\n" +" obj = self.unPickle(chunk)\n" +" record = logging.makeLogRecord(obj)\n" +" self.handleLogRecord(record)\n" +"\n" +" def unPickle(self, data):\n" +" return pickle.loads(data)\n" +"\n" +" def handleLogRecord(self, record):\n" +" # if a name is specified, we use the named logger rather than the one\n" +" # implied by the record.\n" +" if self.server.logname is not None:\n" +" name = self.server.logname\n" +" else:\n" +" name = record.name\n" +" logger = logging.getLogger(name)\n" +" # N.B. EVERY record gets logged. This is because Logger.handle\n" +" # is normally called AFTER logger-level filtering. If you want\n" +" # to do filtering, do it at the client end to save wasting\n" +" # cycles and network bandwidth!\n" +" logger.handle(record)\n" +"\n" +"class LogRecordSocketReceiver(socketserver.ThreadingTCPServer):\n" +" \"\"\"\n" +" Simple TCP socket-based logging receiver suitable for testing.\n" +" \"\"\"\n" +"\n" +" allow_reuse_address = True\n" +"\n" +" def __init__(self, host='localhost',\n" +" port=logging.handlers.DEFAULT_TCP_LOGGING_PORT,\n" +" handler=LogRecordStreamHandler):\n" +" socketserver.ThreadingTCPServer.__init__(self, (host, port), handler)\n" +" self.abort = 0\n" +" self.timeout = 1\n" +" self.logname = None\n" +"\n" +" def serve_until_stopped(self):\n" +" import select\n" +" abort = 0\n" +" while not abort:\n" +" rd, wr, ex = select.select([self.socket.fileno()],\n" +" [], [],\n" +" self.timeout)\n" +" if rd:\n" +" self.handle_request()\n" +" abort = self.abort\n" +"\n" +"def main():\n" +" logging.basicConfig(\n" +" format='%(relativeCreated)5d %(name)-15s %(levelname)-8s %(message)s')\n" +" tcpserver = LogRecordSocketReceiver()\n" +" print('About to start TCP server...')\n" +" tcpserver.serve_until_stopped()\n" +"\n" +"if __name__ == '__main__':\n" +" main()" +msgstr "" +"import pickle\n" +"import logging\n" +"import logging.handlers\n" +"import socketserver\n" +"import struct\n" +"\n" +"\n" +"class LogRecordStreamHandler(socketserver.StreamRequestHandler):\n" +" \"\"\"Handler for a streaming logging request.\n" +"\n" +" This basically logs the record using whatever logging policy is\n" +" configured locally.\n" +" \"\"\"\n" +"\n" +" def handle(self):\n" +" \"\"\"\n" +" Handle multiple requests - each expected to be a 4-byte length,\n" +" followed by the LogRecord in pickle format. Logs the record\n" +" according to whatever policy is configured locally.\n" +" \"\"\"\n" +" while True:\n" +" chunk = self.connection.recv(4)\n" +" if len(chunk) < 4:\n" +" break\n" +" slen = struct.unpack('>L', chunk)[0]\n" +" chunk = self.connection.recv(slen)\n" +" while len(chunk) < slen:\n" +" chunk = chunk + self.connection.recv(slen - len(chunk))\n" +" obj = self.unPickle(chunk)\n" +" record = logging.makeLogRecord(obj)\n" +" self.handleLogRecord(record)\n" +"\n" +" def unPickle(self, data):\n" +" return pickle.loads(data)\n" +"\n" +" def handleLogRecord(self, record):\n" +" # 如果指定了名称,我们将使用指定的记录器而不是\n" +" # record 原本使用的。\n" +" if self.server.logname is not None:\n" +" name = self.server.logname\n" +" else:\n" +" name = record.name\n" +" logger = logging.getLogger(name)\n" +" # 注意每条记录都会被写入。这是因为 Logger.handle\n" +" # 通常会在记录器层级过滤之后被调用。如果你希望\n" +" # 进行过滤,请在客户端结束时进行以避免浪费循环\n" +" # 并节省网络带宽!\n" +" logger.handle(record)\n" +"\n" +"class LogRecordSocketReceiver(socketserver.ThreadingTCPServer):\n" +" \"\"\"\n" +" Simple TCP socket-based logging receiver suitable for testing.\n" +" \"\"\"\n" +"\n" +" allow_reuse_address = True\n" +"\n" +" def __init__(self, host='localhost',\n" +" port=logging.handlers.DEFAULT_TCP_LOGGING_PORT,\n" +" handler=LogRecordStreamHandler):\n" +" socketserver.ThreadingTCPServer.__init__(self, (host, port), handler)\n" +" self.abort = 0\n" +" self.timeout = 1\n" +" self.logname = None\n" +"\n" +" def serve_until_stopped(self):\n" +" import select\n" +" abort = 0\n" +" while not abort:\n" +" rd, wr, ex = select.select([self.socket.fileno()],\n" +" [], [],\n" +" self.timeout)\n" +" if rd:\n" +" self.handle_request()\n" +" abort = self.abort\n" +"\n" +"def main():\n" +" logging.basicConfig(\n" +" format='%(relativeCreated)5d %(name)-15s %(levelname)-8s %(message)s')\n" +" tcpserver = LogRecordSocketReceiver()\n" +" print('About to start TCP server...')\n" +" tcpserver.serve_until_stopped()\n" +"\n" +"if __name__ == '__main__':\n" +" main()" + +#: ../../howto/logging-cookbook.rst:763 +msgid "" +"First run the server, and then the client. On the client side, nothing is " +"printed on the console; on the server side, you should see something like:" +msgstr "先运行服务端,再运行客户端。客户端控制台不会显示什么信息;在服务端应该会看到如下内容:" + +#: ../../howto/logging-cookbook.rst:766 +msgid "" +"About to start TCP server...\n" +" 59 root INFO Jackdaws love my big sphinx of quartz.\n" +" 59 myapp.area1 DEBUG Quick zephyrs blow, vexing daft Jim.\n" +" 69 myapp.area1 INFO How quickly daft jumping zebras vex.\n" +" 69 myapp.area2 WARNING Jail zesty vixen who grabbed pay from quack.\n" +" 69 myapp.area2 ERROR The five boxing wizards jump quickly." +msgstr "" +"About to start TCP server...\n" +" 59 root INFO Jackdaws love my big sphinx of quartz.\n" +" 59 myapp.area1 DEBUG Quick zephyrs blow, vexing daft Jim.\n" +" 69 myapp.area1 INFO How quickly daft jumping zebras vex.\n" +" 69 myapp.area2 WARNING Jail zesty vixen who grabbed pay from quack.\n" +" 69 myapp.area2 ERROR The five boxing wizards jump quickly." + +#: ../../howto/logging-cookbook.rst:775 +msgid "" +"Note that there are some security issues with pickle in some scenarios. If " +"these affect you, you can use an alternative serialization scheme by " +"overriding the :meth:`~SocketHandler.makePickle` method and implementing " +"your alternative there, as well as adapting the above script to use your " +"alternative serialization." +msgstr "" +"请注意在某些情况下 pickle 会存在一些安全问题。如果这些问题对你有影响,你可以换用自己的替代序列化方案,只要重写 " +":meth:`~SocketHandler.makePickle` 方法并在其中实现你的替代方案,并调整上述脚本以使用这个替代方案。" + +#: ../../howto/logging-cookbook.rst:783 +msgid "Running a logging socket listener in production" +msgstr "在生产中运行日志套接字侦听器" + +#: ../../howto/logging-cookbook.rst:787 +msgid "" +"To run a logging listener in production, you may need to use a process-" +"management tool such as `Supervisor `_. `Here is a " +"Gist `__ which provides the bare-bones files to run " +"the above functionality using Supervisor. It consists of the following " +"files:" +msgstr "" +"要在生产环境中运行日志记录监听器,你可能需要使用一个进程管理工具如 `Supervisor `_。 " +"`Here is a Gist `__ 提供了使用 Supervisor 来运行上述功能的基本框架文件。 " +"它由以下文件组成:" + +#: ../../howto/logging-cookbook.rst:794 +msgid "File" +msgstr "文件" + +#: ../../howto/logging-cookbook.rst:794 +msgid "Purpose" +msgstr "目的" + +#: ../../howto/logging-cookbook.rst:796 +msgid ":file:`prepare.sh`" +msgstr ":file:`prepare.sh`" + +#: ../../howto/logging-cookbook.rst:796 +msgid "A Bash script to prepare the environment for testing" +msgstr "用于准备针对测试的环境的 Bash 脚本" + +#: ../../howto/logging-cookbook.rst:799 +msgid ":file:`supervisor.conf`" +msgstr ":file:`supervisor.conf`" + +#: ../../howto/logging-cookbook.rst:799 +msgid "" +"The Supervisor configuration file, which has entries for the listener and a " +"multi-process web application" +msgstr "Supervisor 配置文件,其中有用于侦听器和多进程 Web 应用程序的条目" + +#: ../../howto/logging-cookbook.rst:803 +msgid ":file:`ensure_app.sh`" +msgstr ":file:`ensure_app.sh`" + +#: ../../howto/logging-cookbook.rst:803 +msgid "" +"A Bash script to ensure that Supervisor is running with the above " +"configuration" +msgstr "用于确保 Supervisor 在使用上述配置运行的 Bash 脚本" + +#: ../../howto/logging-cookbook.rst:806 +msgid ":file:`log_listener.py`" +msgstr ":file:`log_listener.py`" + +#: ../../howto/logging-cookbook.rst:806 +msgid "" +"The socket listener program which receives log events and records them to a " +"file" +msgstr "接收日志事件并将其记录到文件中的套接字监听器" + +#: ../../howto/logging-cookbook.rst:809 +msgid ":file:`main.py`" +msgstr ":file:`main.py`" + +#: ../../howto/logging-cookbook.rst:809 +msgid "" +"A simple web application which performs logging via a socket connected to " +"the listener" +msgstr "一个通过连接到监听器的套接字来执行日志记录的简单 Web 应用程序" + +#: ../../howto/logging-cookbook.rst:812 +msgid ":file:`webapp.json`" +msgstr ":file:`webapp.json`" + +#: ../../howto/logging-cookbook.rst:812 +msgid "A JSON configuration file for the web application" +msgstr "一个针对 Web 应用程序的 JSON 配置文件" + +#: ../../howto/logging-cookbook.rst:814 +msgid ":file:`client.py`" +msgstr ":file:`client.py`" + +#: ../../howto/logging-cookbook.rst:814 +msgid "A Python script to exercise the web application" +msgstr "使用 Web 应用程序的 Python 脚本" + +#: ../../howto/logging-cookbook.rst:817 +msgid "" +"The web application uses `Gunicorn `_, which is a " +"popular web application server that starts multiple worker processes to " +"handle requests. This example setup shows how the workers can write to the " +"same log file without conflicting with one another --- they all go through " +"the socket listener." +msgstr "" +"该 Web 应用程序使用了 `Gunicorn `_,这个流行的 Web " +"应用服务器可启动多个工作进程来处理请求。这个示例设置演示了多个工作进程是如何写入相同的日志文件而不会相互冲突的 --- 它们都通过套接字监听器进程操作。" + +#: ../../howto/logging-cookbook.rst:822 +msgid "To test these files, do the following in a POSIX environment:" +msgstr "要测试这些文件,请在 POSIX 环境中执行以下操作:" + +#: ../../howto/logging-cookbook.rst:824 +msgid "" +"Download `the Gist `__ as a ZIP archive using the " +":guilabel:`Download ZIP` button." +msgstr "" +"使用 :guilabel:`Download ZIP` 按钮将 `the Gist `__ 下载为 ZIP" +" 归档文件。" + +#: ../../howto/logging-cookbook.rst:827 +msgid "Unzip the above files from the archive into a scratch directory." +msgstr "将上述文件从归档解压缩到一个初始目录中。" + +#: ../../howto/logging-cookbook.rst:829 +msgid "" +"In the scratch directory, run ``bash prepare.sh`` to get things ready. This " +"creates a :file:`run` subdirectory to contain Supervisor-related and log " +"files, and a :file:`venv` subdirectory to contain a virtual environment into" +" which ``bottle``, ``gunicorn`` and ``supervisor`` are installed." +msgstr "" +"在初始目录中,运行 ``bash prepare.sh`` 完成准备工作。这将创建一个 :file:`run` 子目录来包含 Supervisor " +"相关文件和日志文件,以及一个 :file:`venv` 子目录来包含安装了 ``bottle``, ``gunicorn`` 和 " +"``supervisor`` 的虚拟环境。" + +#: ../../howto/logging-cookbook.rst:834 +msgid "" +"Run ``bash ensure_app.sh`` to ensure that Supervisor is running with the " +"above configuration." +msgstr "运行 ``bash ensure_app.sh`` 以确保 Supervisor 正在使用上述配置运行。" + +#: ../../howto/logging-cookbook.rst:837 +msgid "" +"Run ``venv/bin/python client.py`` to exercise the web application, which " +"will lead to records being written to the log." +msgstr "运行 ``venv/bin/python client.py`` 来使用 Web 应用程序,这将使得记录被写入到日志中。" + +#: ../../howto/logging-cookbook.rst:840 +msgid "" +"Inspect the log files in the :file:`run` subdirectory. You should see the " +"most recent log lines in files matching the pattern :file:`app.log*`. They " +"won't be in any particular order, since they have been handled concurrently " +"by different worker processes in a non-deterministic way." +msgstr "" +"检查 :file:`run` 子目录中的日志文件。你应当看到匹配模式为 :file:`app.log*` 的文件中最新的日志记录行。 " +"它们不会有任何特定的顺序,因为它们是由不同的工作进程以不确定的方式并发地处理的。" + +#: ../../howto/logging-cookbook.rst:845 +msgid "" +"You can shut down the listener and the web application by running " +"``venv/bin/supervisorctl -c supervisor.conf shutdown``." +msgstr "" +"你可以通过运行 ``venv/bin/supervisorctl -c supervisor.conf shutdown`` 来关闭监听器和 Web " +"应用程序。" + +#: ../../howto/logging-cookbook.rst:848 +msgid "" +"You may need to tweak the configuration files in the unlikely event that the" +" configured ports clash with something else in your test environment." +msgstr "你可能需要在配置的端口与你的测试环境中其他程序发生意外冲突的情况下调整配置文件。" + +#: ../../howto/logging-cookbook.rst:851 +msgid "" +"The default configuration uses a TCP socket on port 9020. You can use a Unix" +" Domain socket instead of a TCP socket by doing the following:" +msgstr "默认配置使用一个 9020 端口上的 TCP 套接字。你可以通过以下方式改用 Unix 域套接字代替 TCP 套接字:" + +#: ../../howto/logging-cookbook.rst:854 +msgid "" +"In :file:`listener.json`, add a ``socket`` key with the path to the domain " +"socket you want to use. If this key is present, the listener listens on the " +"corresponding domain socket and not on a TCP socket (the ``port`` key is " +"ignored)." +msgstr "" +"在 :file:`listener.json` 中,添加一个 ``socket`` 键并设为你想使用的域套接字路径。 " +"如果存在该键,监听器就将监听相应的域套接字而不是 TCP 套接字 (``port`` 键将被忽略)。" + +#: ../../howto/logging-cookbook.rst:859 +msgid "" +"In :file:`webapp.json`, change the socket handler configuration dictionary " +"so that the ``host`` value is the path to the domain socket, and set the " +"``port`` value to ``null``." +msgstr "" +"在 :file:`webapp.json` 中,修改套接字处理器配置字典以使 ``host`` 值为该域套接字的路径,并将 ``port`` 值设为 " +"``null``。" + +#: ../../howto/logging-cookbook.rst:869 +msgid "Adding contextual information to your logging output" +msgstr "在自己的输出日志中添加上下文信息" + +#: ../../howto/logging-cookbook.rst:871 +msgid "" +"Sometimes you want logging output to contain contextual information in " +"addition to the parameters passed to the logging call. For example, in a " +"networked application, it may be desirable to log client-specific " +"information in the log (e.g. remote client's username, or IP address). " +"Although you could use the *extra* parameter to achieve this, it's not " +"always convenient to pass the information in this way. While it might be " +"tempting to create :class:`Logger` instances on a per-connection basis, this" +" is not a good idea because these instances are not garbage collected. While" +" this is not a problem in practice, when the number of :class:`Logger` " +"instances is dependent on the level of granularity you want to use in " +"logging an application, it could be hard to manage if the number of " +":class:`Logger` instances becomes effectively unbounded." +msgstr "" +"有时,除了调用日志对象时传入的参数之外,还希望日志输出中能包含上下文信息。 " +"比如在网络应用程序中,可能需要在日志中记录某客户端的信息(如远程客户端的用户名或 IP 地址)。这虽然可以用 *extra* " +"参数实现,但传递起来并不总是很方便。虽然为每个网络连接都创建 :class:`Logger` " +"实例貌似不错,但并不是个好主意,因为这些实例不会被垃圾回收。虽然在实践中不是问题,但当 :class:`Logger` " +"实例的数量取决于应用程序要采用的日志粒度时,如果 :class:`Logger` 实例的数量实际上是无限的,则有可能难以管理。" + +#: ../../howto/logging-cookbook.rst:886 +msgid "Using LoggerAdapters to impart contextual information" +msgstr "利用 LoggerAdapter 传递上下文信息" + +#: ../../howto/logging-cookbook.rst:888 +msgid "" +"An easy way in which you can pass contextual information to be output along " +"with logging event information is to use the :class:`LoggerAdapter` class. " +"This class is designed to look like a :class:`Logger`, so that you can call " +":meth:`debug`, :meth:`info`, :meth:`warning`, :meth:`error`, " +":meth:`exception`, :meth:`critical` and :meth:`log`. These methods have the " +"same signatures as their counterparts in :class:`Logger`, so you can use the" +" two types of instances interchangeably." +msgstr "" +"要传递上下文信息和日志事件信息,有一种简单方案是利用 :class:`LoggerAdapter` 类。这个类设计得类似 " +":class:`Logger`,所以可以直接调用 :meth:`debug`、:meth:`info`、 :meth:`warning`、 " +":meth:`error`、:meth:`exception`、 :meth:`critical` 和 :meth:`log`。这些方法的签名与 " +":class:`Logger` 对应的方法相同,所以这两类实例可以交换使用。" + +#: ../../howto/logging-cookbook.rst:896 +msgid "" +"When you create an instance of :class:`LoggerAdapter`, you pass it a " +":class:`Logger` instance and a dict-like object which contains your " +"contextual information. When you call one of the logging methods on an " +"instance of :class:`LoggerAdapter`, it delegates the call to the underlying " +"instance of :class:`Logger` passed to its constructor, and arranges to pass " +"the contextual information in the delegated call. Here's a snippet from the " +"code of :class:`LoggerAdapter`::" +msgstr "" +"当你创建一个 :class:`LoggerAdapter` 的实例时,你会传入一个 :class:`Logger` " +"的实例和一个包含了上下文信息的字典对象。当你调用一个 :class:`LoggerAdapter` 实例的方法时,它会把调用委托给内部的 " +":class:`Logger` 的实例,并为其整理相关的上下文信息。这是 :class:`LoggerAdapter` 的一个代码片段::" + +#: ../../howto/logging-cookbook.rst:904 +msgid "" +"def debug(self, msg, /, *args, **kwargs):\n" +" \"\"\"\n" +" Delegate a debug call to the underlying logger, after adding\n" +" contextual information from this adapter instance.\n" +" \"\"\"\n" +" msg, kwargs = self.process(msg, kwargs)\n" +" self.logger.debug(msg, *args, **kwargs)" +msgstr "" +"def debug(self, msg, /, *args, **kwargs):\n" +" \"\"\"\n" +" 在添加来自这个适配器实例的上下文信息之后,\n" +" 将调试调用委托给下层的日志记录器。\n" +" \"\"\"\n" +" msg, kwargs = self.process(msg, kwargs)\n" +" self.logger.debug(msg, *args, **kwargs)" + +#: ../../howto/logging-cookbook.rst:912 +msgid "" +"The :meth:`~LoggerAdapter.process` method of :class:`LoggerAdapter` is where" +" the contextual information is added to the logging output. It's passed the " +"message and keyword arguments of the logging call, and it passes back " +"(potentially) modified versions of these to use in the call to the " +"underlying logger. The default implementation of this method leaves the " +"message alone, but inserts an 'extra' key in the keyword argument whose " +"value is the dict-like object passed to the constructor. Of course, if you " +"had passed an 'extra' keyword argument in the call to the adapter, it will " +"be silently overwritten." +msgstr "" +":class:`LoggerAdapter` 的 :meth:`~LoggerAdapter.process` 方法是将上下文信息添加到日志的输出中。 " +"它传入日志消息和日志调用的关键字参数,并传回(隐式的)这些修改后的内容去调用底层的日志记录器。此方法的默认参数只是一个消息字段,但留有一个 " +"'extra' 的字段作为关键字参数传给构造器。当然,如果你在调用适配器时传入了一个 'extra' 字段的参数,它会被静默覆盖。" + +#: ../../howto/logging-cookbook.rst:921 +msgid "" +"The advantage of using 'extra' is that the values in the dict-like object " +"are merged into the :class:`LogRecord` instance's __dict__, allowing you to " +"use customized strings with your :class:`Formatter` instances which know " +"about the keys of the dict-like object. If you need a different method, e.g." +" if you want to prepend or append the contextual information to the message " +"string, you just need to subclass :class:`LoggerAdapter` and override " +":meth:`~LoggerAdapter.process` to do what you need. Here is a simple " +"example::" +msgstr "" +"使用 'extra' 的优点是这些键值对会被传入 :class:`LogRecord` 实例的 __dict__ 中,让你通过 " +":class:`Formatter` 的实例直接使用定制的字符串,实例能找到这个字典类对象的键。 " +"如果你需要一个其他的方法,比如说,想要在消息字符串前后增加上下文信息,你只需要创建一个 :class:`LoggerAdapter` 的子类,并覆盖它的" +" :meth:`~LoggerAdapter.process` 方法来做你想做的事情,以下是一个简单的示例::" + +#: ../../howto/logging-cookbook.rst:929 +msgid "" +"class CustomAdapter(logging.LoggerAdapter):\n" +" \"\"\"\n" +" This example adapter expects the passed in dict-like object to have a\n" +" 'connid' key, whose value in brackets is prepended to the log message.\n" +" \"\"\"\n" +" def process(self, msg, kwargs):\n" +" return '[%s] %s' % (self.extra['connid'], msg), kwargs" +msgstr "" +"class CustomAdapter(logging.LoggerAdapter):\n" +" \"\"\"\n" +" This example adapter expects the passed in dict-like object to have a\n" +" 'connid' key, whose value in brackets is prepended to the log message.\n" +" \"\"\"\n" +" def process(self, msg, kwargs):\n" +" return '[%s] %s' % (self.extra['connid'], msg), kwargs" + +#: ../../howto/logging-cookbook.rst:937 +msgid "which you can use like this::" +msgstr "你可以这样使用::" + +#: ../../howto/logging-cookbook.rst:939 +msgid "" +"logger = logging.getLogger(__name__)\n" +"adapter = CustomAdapter(logger, {'connid': some_conn_id})" +msgstr "" +"logger = logging.getLogger(__name__)\n" +"adapter = CustomAdapter(logger, {'connid': some_conn_id})" + +#: ../../howto/logging-cookbook.rst:942 +msgid "" +"Then any events that you log to the adapter will have the value of " +"``some_conn_id`` prepended to the log messages." +msgstr "然后,你记录在适配器中的任何事件消息前将添加 ``some_conn_id`` 的值。" + +#: ../../howto/logging-cookbook.rst:946 +msgid "Using objects other than dicts to pass contextual information" +msgstr "使用除字典之外的其它对象传递上下文信息" + +#: ../../howto/logging-cookbook.rst:948 +msgid "" +"You don't need to pass an actual dict to a :class:`LoggerAdapter` - you " +"could pass an instance of a class which implements ``__getitem__`` and " +"``__iter__`` so that it looks like a dict to logging. This would be useful " +"if you want to generate values dynamically (whereas the values in a dict " +"would be constant)." +msgstr "" +"你不需要将一个实际的字典传递给 :class:`LoggerAdapter`-你可以传入一个实现了 ``__getitem__`` 和 " +"``__iter__`` 的类的实例,这样它就像是一个字典。这对于你想动态生成值(而字典中的值往往是常量)将很有帮助。" + +#: ../../howto/logging-cookbook.rst:957 +msgid "Using Filters to impart contextual information" +msgstr "使用过滤器传递上下文信息" + +#: ../../howto/logging-cookbook.rst:959 +msgid "" +"You can also add contextual information to log output using a user-defined " +":class:`Filter`. ``Filter`` instances are allowed to modify the " +"``LogRecords`` passed to them, including adding additional attributes which " +"can then be output using a suitable format string, or if needed a custom " +":class:`Formatter`." +msgstr "" +"你也可以使用一个用户定义的类 :class:`Filter` 在日志输出中添加上下文信息。``Filter`` 的实例是被允许修改传入的 " +"``LogRecords``,包括添加其他的属性,然后可以使用合适的格式化字符串输出,或者可以使用一个自定义的类 :class:`Formatter`。" + +#: ../../howto/logging-cookbook.rst:964 +msgid "" +"For example in a web application, the request being processed (or at least, " +"the interesting parts of it) can be stored in a threadlocal " +"(:class:`threading.local`) variable, and then accessed from a ``Filter`` to " +"add, say, information from the request - say, the remote IP address and " +"remote user's username - to the ``LogRecord``, using the attribute names " +"'ip' and 'user' as in the ``LoggerAdapter`` example above. In that case, the" +" same format string can be used to get similar output to that shown above. " +"Here's an example script::" +msgstr "" +"例如,在一个 web 应用程序中,正在处理的请求(或者至少是请求的一部分),可以存储在一个线程本地 (:class:`threading.local`)" +" 变量中,然后从 ``Filter`` 中去访问。请求中的信息,如 IP 地址和用户名将被存储在 ``LogRecord`` 中,使用上例 " +"``LoggerAdapter`` 中的 'ip' 和 'user' " +"属性名。在这种情况下,可以使用相同的格式化字符串来得到上例中类似的输出结果。这是一段示例代码::" + +#: ../../howto/logging-cookbook.rst:973 +msgid "" +"import logging\n" +"from random import choice\n" +"\n" +"class ContextFilter(logging.Filter):\n" +" \"\"\"\n" +" This is a filter which injects contextual information into the log.\n" +"\n" +" Rather than use actual contextual information, we just use random\n" +" data in this demo.\n" +" \"\"\"\n" +"\n" +" USERS = ['jim', 'fred', 'sheila']\n" +" IPS = ['123.231.231.123', '127.0.0.1', '192.168.0.1']\n" +"\n" +" def filter(self, record):\n" +"\n" +" record.ip = choice(ContextFilter.IPS)\n" +" record.user = choice(ContextFilter.USERS)\n" +" return True\n" +"\n" +"if __name__ == '__main__':\n" +" levels = (logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR, logging.CRITICAL)\n" +" logging.basicConfig(level=logging.DEBUG,\n" +" format='%(asctime)-15s %(name)-5s %(levelname)-8s IP: %(ip)-15s User: %(user)-8s %(message)s')\n" +" a1 = logging.getLogger('a.b.c')\n" +" a2 = logging.getLogger('d.e.f')\n" +"\n" +" f = ContextFilter()\n" +" a1.addFilter(f)\n" +" a2.addFilter(f)\n" +" a1.debug('A debug message')\n" +" a1.info('An info message with %s', 'some parameters')\n" +" for x in range(10):\n" +" lvl = choice(levels)\n" +" lvlname = logging.getLevelName(lvl)\n" +" a2.log(lvl, 'A message at %s level with %d %s', lvlname, 2, 'parameters')" +msgstr "" +"import logging\n" +"from random import choice\n" +"\n" +"class ContextFilter(logging.Filter):\n" +" \"\"\"\n" +" This is a filter which injects contextual information into the log.\n" +"\n" +" Rather than use actual contextual information, we just use random\n" +" data in this demo.\n" +" \"\"\"\n" +"\n" +" USERS = ['jim', 'fred', 'sheila']\n" +" IPS = ['123.231.231.123', '127.0.0.1', '192.168.0.1']\n" +"\n" +" def filter(self, record):\n" +"\n" +" record.ip = choice(ContextFilter.IPS)\n" +" record.user = choice(ContextFilter.USERS)\n" +" return True\n" +"\n" +"if __name__ == '__main__':\n" +" levels = (logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR, logging.CRITICAL)\n" +" logging.basicConfig(level=logging.DEBUG,\n" +" format='%(asctime)-15s %(name)-5s %(levelname)-8s IP: %(ip)-15s User: %(user)-8s %(message)s')\n" +" a1 = logging.getLogger('a.b.c')\n" +" a2 = logging.getLogger('d.e.f')\n" +"\n" +" f = ContextFilter()\n" +" a1.addFilter(f)\n" +" a2.addFilter(f)\n" +" a1.debug('A debug message')\n" +" a1.info('An info message with %s', 'some parameters')\n" +" for x in range(10):\n" +" lvl = choice(levels)\n" +" lvlname = logging.getLevelName(lvl)\n" +" a2.log(lvl, 'A message at %s level with %d %s', lvlname, 2, 'parameters')" + +#: ../../howto/logging-cookbook.rst:1010 +msgid "which, when run, produces something like:" +msgstr "在运行时,产生如下内容:" + +#: ../../howto/logging-cookbook.rst:1012 +msgid "" +"2010-09-06 22:38:15,292 a.b.c DEBUG IP: 123.231.231.123 User: fred A debug message\n" +"2010-09-06 22:38:15,300 a.b.c INFO IP: 192.168.0.1 User: sheila An info message with some parameters\n" +"2010-09-06 22:38:15,300 d.e.f CRITICAL IP: 127.0.0.1 User: sheila A message at CRITICAL level with 2 parameters\n" +"2010-09-06 22:38:15,300 d.e.f ERROR IP: 127.0.0.1 User: jim A message at ERROR level with 2 parameters\n" +"2010-09-06 22:38:15,300 d.e.f DEBUG IP: 127.0.0.1 User: sheila A message at DEBUG level with 2 parameters\n" +"2010-09-06 22:38:15,300 d.e.f ERROR IP: 123.231.231.123 User: fred A message at ERROR level with 2 parameters\n" +"2010-09-06 22:38:15,300 d.e.f CRITICAL IP: 192.168.0.1 User: jim A message at CRITICAL level with 2 parameters\n" +"2010-09-06 22:38:15,300 d.e.f CRITICAL IP: 127.0.0.1 User: sheila A message at CRITICAL level with 2 parameters\n" +"2010-09-06 22:38:15,300 d.e.f DEBUG IP: 192.168.0.1 User: jim A message at DEBUG level with 2 parameters\n" +"2010-09-06 22:38:15,301 d.e.f ERROR IP: 127.0.0.1 User: sheila A message at ERROR level with 2 parameters\n" +"2010-09-06 22:38:15,301 d.e.f DEBUG IP: 123.231.231.123 User: fred A message at DEBUG level with 2 parameters\n" +"2010-09-06 22:38:15,301 d.e.f INFO IP: 123.231.231.123 User: fred A message at INFO level with 2 parameters" +msgstr "" +"2010-09-06 22:38:15,292 a.b.c DEBUG IP: 123.231.231.123 User: fred A debug message\n" +"2010-09-06 22:38:15,300 a.b.c INFO IP: 192.168.0.1 User: sheila An info message with some parameters\n" +"2010-09-06 22:38:15,300 d.e.f CRITICAL IP: 127.0.0.1 User: sheila A message at CRITICAL level with 2 parameters\n" +"2010-09-06 22:38:15,300 d.e.f ERROR IP: 127.0.0.1 User: jim A message at ERROR level with 2 parameters\n" +"2010-09-06 22:38:15,300 d.e.f DEBUG IP: 127.0.0.1 User: sheila A message at DEBUG level with 2 parameters\n" +"2010-09-06 22:38:15,300 d.e.f ERROR IP: 123.231.231.123 User: fred A message at ERROR level with 2 parameters\n" +"2010-09-06 22:38:15,300 d.e.f CRITICAL IP: 192.168.0.1 User: jim A message at CRITICAL level with 2 parameters\n" +"2010-09-06 22:38:15,300 d.e.f CRITICAL IP: 127.0.0.1 User: sheila A message at CRITICAL level with 2 parameters\n" +"2010-09-06 22:38:15,300 d.e.f DEBUG IP: 192.168.0.1 User: jim A message at DEBUG level with 2 parameters\n" +"2010-09-06 22:38:15,301 d.e.f ERROR IP: 127.0.0.1 User: sheila A message at ERROR level with 2 parameters\n" +"2010-09-06 22:38:15,301 d.e.f DEBUG IP: 123.231.231.123 User: fred A message at DEBUG level with 2 parameters\n" +"2010-09-06 22:38:15,301 d.e.f INFO IP: 123.231.231.123 User: fred A message at INFO level with 2 parameters" + +#: ../../howto/logging-cookbook.rst:1028 +msgid "Use of ``contextvars``" +msgstr "``contextvars`` 的使用" + +#: ../../howto/logging-cookbook.rst:1030 +msgid "" +"Since Python 3.7, the :mod:`contextvars` module has provided context-local " +"storage which works for both :mod:`threading` and :mod:`asyncio` processing " +"needs. This type of storage may thus be generally preferable to thread-" +"locals. The following example shows how, in a multi-threaded environment, " +"logs can populated with contextual information such as, for example, request" +" attributes handled by web applications." +msgstr "" +"自 Python 3.7 起,:mod:`contextvars` 模块提供了同时适用于 :mod:`threading` 和 " +":mod:`asyncio` 处理需求的上下文本地存储。因此这种存储类型通常要比线程本地存储更好。 " +"下面的例子演示了在多线程环境中日志如何用上下文信息来填充内容,例如 Web 应用程序所处理的请求属性。" + +#: ../../howto/logging-cookbook.rst:1036 +msgid "" +"For the purposes of illustration, say that you have different web " +"applications, each independent of the other but running in the same Python " +"process and using a library common to them. How can each of these " +"applications have their own log, where all logging messages from the library" +" (and other request processing code) are directed to the appropriate " +"application's log file, while including in the log additional contextual " +"information such as client IP, HTTP request method and client username?" +msgstr "" +"出于说明的目的,比方说你有几个不同的 Web 应用程序,彼此都保持独立状态但运行在同一个 Python 进程中并且它们共同使用了某个库。 " +"这些应用程序要如何拥有各自的日志记录,其中来自这个库的日志消息(以及其他请求处理代码)会发到对应的应用程序的日志文件,同时在日志中包括额外的上下文信息如客户端" +" IP、HTTP 请求方法和客户端用户名呢?" + +#: ../../howto/logging-cookbook.rst:1043 +msgid "Let's assume that the library can be simulated by the following code:" +msgstr "让我们假定这个库可以通过以下代码来模拟:" + +#: ../../howto/logging-cookbook.rst:1045 +msgid "" +"# webapplib.py\n" +"import logging\n" +"import time\n" +"\n" +"logger = logging.getLogger(__name__)\n" +"\n" +"def useful():\n" +" # Just a representative event logged from the library\n" +" logger.debug('Hello from webapplib!')\n" +" # Just sleep for a bit so other threads get to run\n" +" time.sleep(0.01)" +msgstr "" +"# webapplib.py\n" +"import logging\n" +"import time\n" +"\n" +"logger = logging.getLogger(__name__)\n" +"\n" +"def useful():\n" +" # 一条从库中记录的代表性事件\n" +" logger.debug('Hello from webapplib!')\n" +" # 休眠一下以便其他线程能够运行\n" +" time.sleep(0.01)" + +#: ../../howto/logging-cookbook.rst:1059 +msgid "" +"We can simulate the multiple web applications by means of two simple " +"classes, ``Request`` and ``WebApp``. These simulate how real threaded web " +"applications work - each request is handled by a thread:" +msgstr "" +"我们可以通过两个简单的类 ``Request`` 和 ``WebApp`` 来模拟多个 Web 应用程序。它们模拟了真正的多线程 Web " +"应用程序是如何工作的 —— 每个请求均由单独的线程来处理:" + +#: ../../howto/logging-cookbook.rst:1063 +msgid "" +"# main.py\n" +"import argparse\n" +"from contextvars import ContextVar\n" +"import logging\n" +"import os\n" +"from random import choice\n" +"import threading\n" +"import webapplib\n" +"\n" +"logger = logging.getLogger(__name__)\n" +"root = logging.getLogger()\n" +"root.setLevel(logging.DEBUG)\n" +"\n" +"class Request:\n" +" \"\"\"\n" +" A simple dummy request class which just holds dummy HTTP request method,\n" +" client IP address and client username\n" +" \"\"\"\n" +" def __init__(self, method, ip, user):\n" +" self.method = method\n" +" self.ip = ip\n" +" self.user = user\n" +"\n" +"# A dummy set of requests which will be used in the simulation - we'll just pick\n" +"# from this list randomly. Note that all GET requests are from 192.168.2.XXX\n" +"# addresses, whereas POST requests are from 192.16.3.XXX addresses. Three users\n" +"# are represented in the sample requests.\n" +"\n" +"REQUESTS = [\n" +" Request('GET', '192.168.2.20', 'jim'),\n" +" Request('POST', '192.168.3.20', 'fred'),\n" +" Request('GET', '192.168.2.21', 'sheila'),\n" +" Request('POST', '192.168.3.21', 'jim'),\n" +" Request('GET', '192.168.2.22', 'fred'),\n" +" Request('POST', '192.168.3.22', 'sheila'),\n" +"]\n" +"\n" +"# Note that the format string includes references to request context information\n" +"# such as HTTP method, client IP and username\n" +"\n" +"formatter = logging.Formatter('%(threadName)-11s %(appName)s %(name)-9s %(user)-6s %(ip)s %(method)-4s %(message)s')\n" +"\n" +"# Create our context variables. These will be filled at the start of request\n" +"# processing, and used in the logging that happens during that processing\n" +"\n" +"ctx_request = ContextVar('request')\n" +"ctx_appname = ContextVar('appname')\n" +"\n" +"class InjectingFilter(logging.Filter):\n" +" \"\"\"\n" +" A filter which injects context-specific information into logs and ensures\n" +" that only information for a specific webapp is included in its log\n" +" \"\"\"\n" +" def __init__(self, app):\n" +" self.app = app\n" +"\n" +" def filter(self, record):\n" +" request = ctx_request.get()\n" +" record.method = request.method\n" +" record.ip = request.ip\n" +" record.user = request.user\n" +" record.appName = appName = ctx_appname.get()\n" +" return appName == self.app.name\n" +"\n" +"class WebApp:\n" +" \"\"\"\n" +" A dummy web application class which has its own handler and filter for a\n" +" webapp-specific log.\n" +" \"\"\"\n" +" def __init__(self, name):\n" +" self.name = name\n" +" handler = logging.FileHandler(name + '.log', 'w')\n" +" f = InjectingFilter(self)\n" +" handler.setFormatter(formatter)\n" +" handler.addFilter(f)\n" +" root.addHandler(handler)\n" +" self.num_requests = 0\n" +"\n" +" def process_request(self, request):\n" +" \"\"\"\n" +" This is the dummy method for processing a request. It's called on a\n" +" different thread for every request. We store the context information into\n" +" the context vars before doing anything else.\n" +" \"\"\"\n" +" ctx_request.set(request)\n" +" ctx_appname.set(self.name)\n" +" self.num_requests += 1\n" +" logger.debug('Request processing started')\n" +" webapplib.useful()\n" +" logger.debug('Request processing finished')\n" +"\n" +"def main():\n" +" fn = os.path.splitext(os.path.basename(__file__))[0]\n" +" adhf = argparse.ArgumentDefaultsHelpFormatter\n" +" ap = argparse.ArgumentParser(formatter_class=adhf, prog=fn,\n" +" description='Simulate a couple of web '\n" +" 'applications handling some '\n" +" 'requests, showing how request '\n" +" 'context can be used to '\n" +" 'populate logs')\n" +" aa = ap.add_argument\n" +" aa('--count', '-c', type=int, default=100, help='How many requests to simulate')\n" +" options = ap.parse_args()\n" +"\n" +" # Create the dummy webapps and put them in a list which we can use to select\n" +" # from randomly\n" +" app1 = WebApp('app1')\n" +" app2 = WebApp('app2')\n" +" apps = [app1, app2]\n" +" threads = []\n" +" # Add a common handler which will capture all events\n" +" handler = logging.FileHandler('app.log', 'w')\n" +" handler.setFormatter(formatter)\n" +" root.addHandler(handler)\n" +"\n" +" # Generate calls to process requests\n" +" for i in range(options.count):\n" +" try:\n" +" # Pick an app at random and a request for it to process\n" +" app = choice(apps)\n" +" request = choice(REQUESTS)\n" +" # Process the request in its own thread\n" +" t = threading.Thread(target=app.process_request, args=(request,))\n" +" threads.append(t)\n" +" t.start()\n" +" except KeyboardInterrupt:\n" +" break\n" +"\n" +" # Wait for the threads to terminate\n" +" for t in threads:\n" +" t.join()\n" +"\n" +" for app in apps:\n" +" print('%s processed %s requests' % (app.name, app.num_requests))\n" +"\n" +"if __name__ == '__main__':\n" +" main()" +msgstr "" +"# main.py\n" +"import argparse\n" +"from contextvars import ContextVar\n" +"import logging\n" +"import os\n" +"from random import choice\n" +"import threading\n" +"import webapplib\n" +"\n" +"logger = logging.getLogger(__name__)\n" +"root = logging.getLogger()\n" +"root.setLevel(logging.DEBUG)\n" +"\n" +"class Request:\n" +" \"\"\"\n" +" A simple dummy request class which just holds dummy HTTP request method,\n" +" client IP address and client username\n" +" \"\"\"\n" +" def __init__(self, method, ip, user):\n" +" self.method = method\n" +" self.ip = ip\n" +" self.user = user\n" +"\n" +"# 将在模拟中使用的一组假请求 —— 我们将从这个列表随机选取。\n" +"# 请注意所有 GET 请求都来自 192.168.2.XXX 地址,\n" +"# 而 POST 请求都来自 192.16.3.XXX 地址。\n" +"# 在这些样例请求中有三个用户。\n" +"\n" +"REQUESTS = [\n" +" Request('GET', '192.168.2.20', 'jim'),\n" +" Request('POST', '192.168.3.20', 'fred'),\n" +" Request('GET', '192.168.2.21', 'sheila'),\n" +" Request('POST', '192.168.3.21', 'jim'),\n" +" Request('GET', '192.168.2.22', 'fred'),\n" +" Request('POST', '192.168.3.22', 'sheila'),\n" +"]\n" +"\n" +"# 请注意格式字符串包括了对请求上下文信息的引用\n" +"# 如 HTTP 方法,客户端 IP 和用户名\n" +"\n" +"formatter = logging.Formatter('%(threadName)-11s %(appName)s %(name)-9s %(user)-6s %(ip)s %(method)-4s %(message)s')\n" +"\n" +"# 创建我们的上下文变量。它们将在开始处理请求时被填充,\n" +"# 并将在处理时发生的日志记录中被使用。\n" +"\n" +"ctx_request = ContextVar('request')\n" +"ctx_appname = ContextVar('appname')\n" +"\n" +"class InjectingFilter(logging.Filter):\n" +" \"\"\"\n" +" A filter which injects context-specific information into logs and ensures\n" +" that only information for a specific webapp is included in its log\n" +" \"\"\"\n" +" def __init__(self, app):\n" +" self.app = app\n" +"\n" +" def filter(self, record):\n" +" request = ctx_request.get()\n" +" record.method = request.method\n" +" record.ip = request.ip\n" +" record.user = request.user\n" +" record.appName = appName = ctx_appname.get()\n" +" return appName == self.app.name\n" +"\n" +"class WebApp:\n" +" \"\"\"\n" +" A dummy web application class which has its own handler and filter for a\n" +" webapp-specific log.\n" +" \"\"\"\n" +" def __init__(self, name):\n" +" self.name = name\n" +" handler = logging.FileHandler(name + '.log', 'w')\n" +" f = InjectingFilter(self)\n" +" handler.setFormatter(formatter)\n" +" handler.addFilter(f)\n" +" root.addHandler(handler)\n" +" self.num_requests = 0\n" +"\n" +" def process_request(self, request):\n" +" \"\"\"\n" +" This is the dummy method for processing a request. It's called on a\n" +" different thread for every request. We store the context information into\n" +" the context vars before doing anything else.\n" +" \"\"\"\n" +" ctx_request.set(request)\n" +" ctx_appname.set(self.name)\n" +" self.num_requests += 1\n" +" logger.debug('Request processing started')\n" +" webapplib.useful()\n" +" logger.debug('Request processing finished')\n" +"\n" +"def main():\n" +" fn = os.path.splitext(os.path.basename(__file__))[0]\n" +" adhf = argparse.ArgumentDefaultsHelpFormatter\n" +" ap = argparse.ArgumentParser(formatter_class=adhf, prog=fn,\n" +" description='Simulate a couple of web '\n" +" 'applications handling some '\n" +" 'requests, showing how request '\n" +" 'context can be used to '\n" +" 'populate logs')\n" +" aa = ap.add_argument\n" +" aa('--count', '-c', type=int, default=100, help='How many requests to simulate')\n" +" options = ap.parse_args()\n" +"\n" +" # 创建假 Web 应用并将其放在列表中以便我们\n" +" # 用于随机选取\n" +" app1 = WebApp('app1')\n" +" app2 = WebApp('app2')\n" +" apps = [app1, app2]\n" +" threads = []\n" +" # 添加一个将捕获所有事件的通用处理器\n" +" handler = logging.FileHandler('app.log', 'w')\n" +" handler.setFormatter(formatter)\n" +" root.addHandler(handler)\n" +"\n" +" # 生成调用来处理请求\n" +" for i in range(options.count):\n" +" try:\n" +" # Pick an app at random and a request for it to process\n" +" app = choice(apps)\n" +" request = choice(REQUESTS)\n" +" # Process the request in its own thread\n" +" t = threading.Thread(target=app.process_request, args=(request,))\n" +" threads.append(t)\n" +" t.start()\n" +" except KeyboardInterrupt:\n" +" break\n" +"\n" +" # 等待线程终结\n" +" for t in threads:\n" +" t.join()\n" +"\n" +" for app in apps:\n" +" print('%s processed %s requests' % (app.name, app.num_requests))\n" +"\n" +"if __name__ == '__main__':\n" +" main()" + +#: ../../howto/logging-cookbook.rst:1203 +msgid "" +"If you run the above, you should find that roughly half the requests go into" +" :file:`app1.log` and the rest into :file:`app2.log`, and the all the " +"requests are logged to :file:`app.log`. Each webapp-specific log will " +"contain only log entries for only that webapp, and the request information " +"will be displayed consistently in the log (i.e. the information in each " +"dummy request will always appear together in a log line). This is " +"illustrated by the following shell output:" +msgstr "" +"如果你运行上面的代码,你将会发现约有半数请求是发给 :file:`app1.log` 而其余的则是发给 " +":file:`app2.log`,并且所有请求都会被记录至 :file:`app.log`。每个 Web 应用专属的日志将只包含该 Web " +"应用的日志条目,请求信息也将以一致的方式显示在日志里(即每个模拟请求中的信息将总是在一个日志行中一起显示)。如下面的 shell 输出所示:" + +#: ../../howto/logging-cookbook.rst:1210 +msgid "" +"~/logging-contextual-webapp$ python main.py\n" +"app1 processed 51 requests\n" +"app2 processed 49 requests\n" +"~/logging-contextual-webapp$ wc -l *.log\n" +" 153 app1.log\n" +" 147 app2.log\n" +" 300 app.log\n" +" 600 total\n" +"~/logging-contextual-webapp$ head -3 app1.log\n" +"Thread-3 (process_request) app1 __main__ jim 192.168.3.21 POST Request processing started\n" +"Thread-3 (process_request) app1 webapplib jim 192.168.3.21 POST Hello from webapplib!\n" +"Thread-5 (process_request) app1 __main__ jim 192.168.3.21 POST Request processing started\n" +"~/logging-contextual-webapp$ head -3 app2.log\n" +"Thread-1 (process_request) app2 __main__ sheila 192.168.2.21 GET Request processing started\n" +"Thread-1 (process_request) app2 webapplib sheila 192.168.2.21 GET Hello from webapplib!\n" +"Thread-2 (process_request) app2 __main__ jim 192.168.2.20 GET Request processing started\n" +"~/logging-contextual-webapp$ head app.log\n" +"Thread-1 (process_request) app2 __main__ sheila 192.168.2.21 GET Request processing started\n" +"Thread-1 (process_request) app2 webapplib sheila 192.168.2.21 GET Hello from webapplib!\n" +"Thread-2 (process_request) app2 __main__ jim 192.168.2.20 GET Request processing started\n" +"Thread-3 (process_request) app1 __main__ jim 192.168.3.21 POST Request processing started\n" +"Thread-2 (process_request) app2 webapplib jim 192.168.2.20 GET Hello from webapplib!\n" +"Thread-3 (process_request) app1 webapplib jim 192.168.3.21 POST Hello from webapplib!\n" +"Thread-4 (process_request) app2 __main__ fred 192.168.2.22 GET Request processing started\n" +"Thread-5 (process_request) app1 __main__ jim 192.168.3.21 POST Request processing started\n" +"Thread-4 (process_request) app2 webapplib fred 192.168.2.22 GET Hello from webapplib!\n" +"Thread-6 (process_request) app1 __main__ jim 192.168.3.21 POST Request processing started\n" +"~/logging-contextual-webapp$ grep app1 app1.log | wc -l\n" +"153\n" +"~/logging-contextual-webapp$ grep app2 app2.log | wc -l\n" +"147\n" +"~/logging-contextual-webapp$ grep app1 app.log | wc -l\n" +"153\n" +"~/logging-contextual-webapp$ grep app2 app.log | wc -l\n" +"147" +msgstr "" +"~/logging-contextual-webapp$ python main.py\n" +"app1 processed 51 requests\n" +"app2 processed 49 requests\n" +"~/logging-contextual-webapp$ wc -l *.log\n" +" 153 app1.log\n" +" 147 app2.log\n" +" 300 app.log\n" +" 600 total\n" +"~/logging-contextual-webapp$ head -3 app1.log\n" +"Thread-3 (process_request) app1 __main__ jim 192.168.3.21 POST Request processing started\n" +"Thread-3 (process_request) app1 webapplib jim 192.168.3.21 POST Hello from webapplib!\n" +"Thread-5 (process_request) app1 __main__ jim 192.168.3.21 POST Request processing started\n" +"~/logging-contextual-webapp$ head -3 app2.log\n" +"Thread-1 (process_request) app2 __main__ sheila 192.168.2.21 GET Request processing started\n" +"Thread-1 (process_request) app2 webapplib sheila 192.168.2.21 GET Hello from webapplib!\n" +"Thread-2 (process_request) app2 __main__ jim 192.168.2.20 GET Request processing started\n" +"~/logging-contextual-webapp$ head app.log\n" +"Thread-1 (process_request) app2 __main__ sheila 192.168.2.21 GET Request processing started\n" +"Thread-1 (process_request) app2 webapplib sheila 192.168.2.21 GET Hello from webapplib!\n" +"Thread-2 (process_request) app2 __main__ jim 192.168.2.20 GET Request processing started\n" +"Thread-3 (process_request) app1 __main__ jim 192.168.3.21 POST Request processing started\n" +"Thread-2 (process_request) app2 webapplib jim 192.168.2.20 GET Hello from webapplib!\n" +"Thread-3 (process_request) app1 webapplib jim 192.168.3.21 POST Hello from webapplib!\n" +"Thread-4 (process_request) app2 __main__ fred 192.168.2.22 GET Request processing started\n" +"Thread-5 (process_request) app1 __main__ jim 192.168.3.21 POST Request processing started\n" +"Thread-4 (process_request) app2 webapplib fred 192.168.2.22 GET Hello from webapplib!\n" +"Thread-6 (process_request) app1 __main__ jim 192.168.3.21 POST Request processing started\n" +"~/logging-contextual-webapp$ grep app1 app1.log | wc -l\n" +"153\n" +"~/logging-contextual-webapp$ grep app2 app2.log | wc -l\n" +"147\n" +"~/logging-contextual-webapp$ grep app1 app.log | wc -l\n" +"153\n" +"~/logging-contextual-webapp$ grep app2 app.log | wc -l\n" +"147" + +#: ../../howto/logging-cookbook.rst:1250 +msgid "Imparting contextual information in handlers" +msgstr "在处理器中传递上下文信息" + +#: ../../howto/logging-cookbook.rst:1252 +msgid "" +"Each :class:`~Handler` has its own chain of filters. If you want to add " +"contextual information to a :class:`LogRecord` without leaking it to other " +"handlers, you can use a filter that returns a new :class:`~LogRecord` " +"instead of modifying it in-place, as shown in the following script::" +msgstr "" +"每个 :class:`~Handler` 都有自己的过滤器链。如果你想向一个 :class:`LogRecord` " +"添加上下文信息而不使其泄露给其它处理器,你可以使用一个返回新 :class:`~LogRecord` 而不是原地修改它的过滤器,如下面的脚本所示::" + +#: ../../howto/logging-cookbook.rst:1257 +msgid "" +"import copy\n" +"import logging\n" +"\n" +"def filter(record: logging.LogRecord):\n" +" record = copy.copy(record)\n" +" record.user = 'jim'\n" +" return record\n" +"\n" +"if __name__ == '__main__':\n" +" logger = logging.getLogger()\n" +" logger.setLevel(logging.INFO)\n" +" handler = logging.StreamHandler()\n" +" formatter = logging.Formatter('%(message)s from %(user)-8s')\n" +" handler.setFormatter(formatter)\n" +" handler.addFilter(filter)\n" +" logger.addHandler(handler)\n" +"\n" +" logger.info('A log message')" +msgstr "" +"import copy\n" +"import logging\n" +"\n" +"def filter(record: logging.LogRecord):\n" +" record = copy.copy(record)\n" +" record.user = 'jim'\n" +" return record\n" +"\n" +"if __name__ == '__main__':\n" +" logger = logging.getLogger()\n" +" logger.setLevel(logging.INFO)\n" +" handler = logging.StreamHandler()\n" +" formatter = logging.Formatter('%(message)s from %(user)-8s')\n" +" handler.setFormatter(formatter)\n" +" handler.addFilter(filter)\n" +" logger.addHandler(handler)\n" +"\n" +" logger.info('A log message')" + +#: ../../howto/logging-cookbook.rst:1279 +msgid "Logging to a single file from multiple processes" +msgstr "从多个进程记录至单个文件" + +#: ../../howto/logging-cookbook.rst:1281 +msgid "" +"Although logging is thread-safe, and logging to a single file from multiple " +"threads in a single process *is* supported, logging to a single file from " +"*multiple processes* is *not* supported, because there is no standard way to" +" serialize access to a single file across multiple processes in Python. If " +"you need to log to a single file from multiple processes, one way of doing " +"this is to have all the processes log to a :class:`~handlers.SocketHandler`," +" and have a separate process which implements a socket server which reads " +"from the socket and logs to file. (If you prefer, you can dedicate one " +"thread in one of the existing processes to perform this function.) " +":ref:`This section ` documents this approach in more detail" +" and includes a working socket receiver which can be used as a starting " +"point for you to adapt in your own applications." +msgstr "" +"尽管 logging 是线程安全的,将单个进程中的多个线程日志记录至单个文件也 *是* 受支持的,但将 *多个进程* 中的日志记录至单个文件则 *不是*" +" 受支持的,因为在 Python 中并没有在多个进程中实现对单个文件访问的序列化的标准方案。 " +"如果你需要将多个进程中的日志记录至单个文件,有一个方案是让所有进程都将日志记录至一个 " +":class:`~handlers.SocketHandler`,然后用一个实现了套接字服务器的单独进程一边从套接字中读取一边将日志记录至文件。 " +"(如果愿意的话,你可以在一个现有进程中专门开一个线程来执行此项功能。) :ref:`这一部分 ` " +"文档对此方式有更详细的介绍,并包含一个可用的套接字接收器,你自己的应用可以在此基础上进行适配。" + +#: ../../howto/logging-cookbook.rst:1294 +msgid "" +"You could also write your own handler which uses the " +":class:`~multiprocessing.Lock` class from the :mod:`multiprocessing` module " +"to serialize access to the file from your processes. The stdlib " +":class:`FileHandler` and subclasses do not make use of " +":mod:`multiprocessing`." +msgstr "" +"你也可以编写你自己的处理器,让其使用 :mod:`multiprocessing` 模块中的 " +":class:`~multiprocessing.Lock` 类来顺序访问你的多个进程中的文件。标准库的 :class:`FileHandler` " +"及其子类均未使用 :mod:`multiprocessing`。" + +#: ../../howto/logging-cookbook.rst:1301 +msgid "" +"Alternatively, you can use a ``Queue`` and a :class:`QueueHandler` to send " +"all logging events to one of the processes in your multi-process " +"application. The following example script demonstrates how you can do this; " +"in the example a separate listener process listens for events sent by other " +"processes and logs them according to its own logging configuration. Although" +" the example only demonstrates one way of doing it (for example, you may " +"want to use a listener thread rather than a separate listener process -- the" +" implementation would be analogous) it does allow for completely different " +"logging configurations for the listener and the other processes in your " +"application, and can be used as the basis for code meeting your own specific" +" requirements::" +msgstr "" +"或者,你也可以使用 ``Queue`` 和 :class:`QueueHandler` 将所有的日志事件发送至你的多进程应用的一个进程中。 " +"以下示例脚本演示了如何执行此操作。在示例中,一个单独的监听进程负责监听其他进程的日志事件,并根据自己的配置记录。 " +"尽管示例只演示了这种方法(例如你可能希望使用单独的监听线程而非监听进程 —— " +"它们的实现是类似的),但你也可以在应用程序的监听进程和其他进程使用不同的配置,它可以作为满足你特定需求的一个基础::" + +#: ../../howto/logging-cookbook.rst:1312 +msgid "" +"# You'll need these imports in your own code\n" +"import logging\n" +"import logging.handlers\n" +"import multiprocessing\n" +"\n" +"# Next two import lines for this demo only\n" +"from random import choice, random\n" +"import time\n" +"\n" +"#\n" +"# Because you'll want to define the logging configurations for listener and workers, the\n" +"# listener and worker process functions take a configurer parameter which is a callable\n" +"# for configuring logging for that process. These functions are also passed the queue,\n" +"# which they use for communication.\n" +"#\n" +"# In practice, you can configure the listener however you want, but note that in this\n" +"# simple example, the listener does not apply level or filter logic to received records.\n" +"# In practice, you would probably want to do this logic in the worker processes, to avoid\n" +"# sending events which would be filtered out between processes.\n" +"#\n" +"# The size of the rotated files is made small so you can see the results easily.\n" +"def listener_configurer():\n" +" root = logging.getLogger()\n" +" h = logging.handlers.RotatingFileHandler('mptest.log', 'a', 300, 10)\n" +" f = logging.Formatter('%(asctime)s %(processName)-10s %(name)s %(levelname)-8s %(message)s')\n" +" h.setFormatter(f)\n" +" root.addHandler(h)\n" +"\n" +"# This is the listener process top-level loop: wait for logging events\n" +"# (LogRecords)on the queue and handle them, quit when you get a None for a\n" +"# LogRecord.\n" +"def listener_process(queue, configurer):\n" +" configurer()\n" +" while True:\n" +" try:\n" +" record = queue.get()\n" +" if record is None: # We send this as a sentinel to tell the listener to quit.\n" +" break\n" +" logger = logging.getLogger(record.name)\n" +" logger.handle(record) # No level or filter logic applied - just do it!\n" +" except Exception:\n" +" import sys, traceback\n" +" print('Whoops! Problem:', file=sys.stderr)\n" +" traceback.print_exc(file=sys.stderr)\n" +"\n" +"# Arrays used for random selections in this demo\n" +"\n" +"LEVELS = [logging.DEBUG, logging.INFO, logging.WARNING,\n" +" logging.ERROR, logging.CRITICAL]\n" +"\n" +"LOGGERS = ['a.b.c', 'd.e.f']\n" +"\n" +"MESSAGES = [\n" +" 'Random message #1',\n" +" 'Random message #2',\n" +" 'Random message #3',\n" +"]\n" +"\n" +"# The worker configuration is done at the start of the worker process run.\n" +"# Note that on Windows you can't rely on fork semantics, so each process\n" +"# will run the logging configuration code when it starts.\n" +"def worker_configurer(queue):\n" +" h = logging.handlers.QueueHandler(queue) # Just the one handler needed\n" +" root = logging.getLogger()\n" +" root.addHandler(h)\n" +" # send all messages, for demo; no other level or filter logic applied.\n" +" root.setLevel(logging.DEBUG)\n" +"\n" +"# This is the worker process top-level loop, which just logs ten events with\n" +"# random intervening delays before terminating.\n" +"# The print messages are just so you know it's doing something!\n" +"def worker_process(queue, configurer):\n" +" configurer(queue)\n" +" name = multiprocessing.current_process().name\n" +" print('Worker started: %s' % name)\n" +" for i in range(10):\n" +" time.sleep(random())\n" +" logger = logging.getLogger(choice(LOGGERS))\n" +" level = choice(LEVELS)\n" +" message = choice(MESSAGES)\n" +" logger.log(level, message)\n" +" print('Worker finished: %s' % name)\n" +"\n" +"# Here's where the demo gets orchestrated. Create the queue, create and start\n" +"# the listener, create ten workers and start them, wait for them to finish,\n" +"# then send a None to the queue to tell the listener to finish.\n" +"def main():\n" +" queue = multiprocessing.Queue(-1)\n" +" listener = multiprocessing.Process(target=listener_process,\n" +" args=(queue, listener_configurer))\n" +" listener.start()\n" +" workers = []\n" +" for i in range(10):\n" +" worker = multiprocessing.Process(target=worker_process,\n" +" args=(queue, worker_configurer))\n" +" workers.append(worker)\n" +" worker.start()\n" +" for w in workers:\n" +" w.join()\n" +" queue.put_nowait(None)\n" +" listener.join()\n" +"\n" +"if __name__ == '__main__':\n" +" main()" +msgstr "" +"# 你将在自己的代码中需要这些导入\n" +"import logging\n" +"import logging.handlers\n" +"import multiprocessing\n" +"\n" +"# 以下两行导入仅针对本演示\n" +"from random import choice, random\n" +"import time\n" +"\n" +"#\n" +"# 因为你会希望为监听进程和工作进程定义日志记录配置,\n" +"# 这些进程函数将接受一个可调用对象作为 configurer 形参\n" +"# 用于为进程配置日志记录。这些函数还将接受一个队列,\n" +"# 供它们在通信中使用。\n" +"#\n" +"# 实际上,你可以根据你的需要任意配置监听进程,但请注意在\n" +"# 该简单示例中监听进程没有对收到的记录应用层级或过滤逻辑。\n" +"# 在实践中,你可能会希望在工作进程中执行此逻辑,以避免发送\n" +"# 将会在进程间被过滤掉的事件。\n" +"#\n" +"# 轮转文件的尺寸被设置为很小以便你能方便地查看结果。\n" +"def listener_configurer():\n" +" root = logging.getLogger()\n" +" h = logging.handlers.RotatingFileHandler('mptest.log', 'a', 300, 10)\n" +" f = logging.Formatter('%(asctime)s %(processName)-10s %(name)s %(levelname)-8s %(message)s')\n" +" h.setFormatter(f)\n" +" root.addHandler(h)\n" +"\n" +"# 这是监听进程的最高层级循环:等待队列中的日志记录事件\n" +"# (LogRecords) 并处理它们,当在接受 LogRecord 时收到 None\n" +"# 则退出。\n" +"def listener_process(queue, configurer):\n" +" configurer()\n" +" while True:\n" +" try:\n" +" record = queue.get()\n" +" if record is None: # 我们发送该值以通知监听进程退出。\n" +" break\n" +" logger = logging.getLogger(record.name)\n" +" logger.handle(record) # 未应用层级或过滤逻辑 —— 直接做!\n" +" except Exception:\n" +" import sys, traceback\n" +" print('Whoops! Problem:', file=sys.stderr)\n" +" traceback.print_exc(file=sys.stderr)\n" +"\n" +"# 用于在本演示中随机选取的数组\n" +"\n" +"LEVELS = [logging.DEBUG, logging.INFO, logging.WARNING,\n" +" logging.ERROR, logging.CRITICAL]\n" +"\n" +"LOGGERS = ['a.b.c', 'd.e.f']\n" +"\n" +"MESSAGES = [\n" +" 'Random message #1',\n" +" 'Random message #2',\n" +" 'Random message #3',\n" +"]\n" +"\n" +"# 工作进程配置在工作进程开始运行时完成。\n" +"# 请注意在 Windows 上不能依赖 fork 语义,因此每个进程\n" +"# 将在启动时运行日志记录配置代码。\n" +"def worker_configurer(queue):\n" +" h = logging.handlers.QueueHandler(queue) # 只需要一个处理器\n" +" root = logging.getLogger()\n" +" root.addHandler(h)\n" +" # 发送所有消息,用于演示;未应用其他层级或过滤逻辑。\n" +" root.setLevel(logging.DEBUG)\n" +"\n" +"# 这是工作进程的最高层级循环,它将在结束前以随机间隔\n" +"# 记录十个事件。\n" +"# 打印消息只是让你知道它正在做一些事情!\n" +"def worker_process(queue, configurer):\n" +" configurer(queue)\n" +" name = multiprocessing.current_process().name\n" +" print('Worker started: %s' % name)\n" +" for i in range(10):\n" +" time.sleep(random())\n" +" logger = logging.getLogger(choice(LOGGERS))\n" +" level = choice(LEVELS)\n" +" message = choice(MESSAGES)\n" +" logger.log(level, message)\n" +" print('Worker finished: %s' % name)\n" +"\n" +"# 以下是演示整合各个组件的地方。创建队列,创建并启动\n" +"# 监听进程,创建十个工作进程并启动它们,等待它们结束,\n" +"# 然后向队列发送 None 以通知监听进程退出。\n" +"def main():\n" +" queue = multiprocessing.Queue(-1)\n" +" listener = multiprocessing.Process(target=listener_process,\n" +" args=(queue, listener_configurer))\n" +" listener.start()\n" +" workers = []\n" +" for i in range(10):\n" +" worker = multiprocessing.Process(target=worker_process,\n" +" args=(queue, worker_configurer))\n" +" workers.append(worker)\n" +" worker.start()\n" +" for w in workers:\n" +" w.join()\n" +" queue.put_nowait(None)\n" +" listener.join()\n" +"\n" +"if __name__ == '__main__':\n" +" main()" + +#: ../../howto/logging-cookbook.rst:1417 +msgid "" +"A variant of the above script keeps the logging in the main process, in a " +"separate thread::" +msgstr "上面脚本的一个变种,仍然在主进程中记录日志,但使用一个单独的线程::" + +#: ../../howto/logging-cookbook.rst:1420 +msgid "" +"import logging\n" +"import logging.config\n" +"import logging.handlers\n" +"from multiprocessing import Process, Queue\n" +"import random\n" +"import threading\n" +"import time\n" +"\n" +"def logger_thread(q):\n" +" while True:\n" +" record = q.get()\n" +" if record is None:\n" +" break\n" +" logger = logging.getLogger(record.name)\n" +" logger.handle(record)\n" +"\n" +"\n" +"def worker_process(q):\n" +" qh = logging.handlers.QueueHandler(q)\n" +" root = logging.getLogger()\n" +" root.setLevel(logging.DEBUG)\n" +" root.addHandler(qh)\n" +" levels = [logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR,\n" +" logging.CRITICAL]\n" +" loggers = ['foo', 'foo.bar', 'foo.bar.baz',\n" +" 'spam', 'spam.ham', 'spam.ham.eggs']\n" +" for i in range(100):\n" +" lvl = random.choice(levels)\n" +" logger = logging.getLogger(random.choice(loggers))\n" +" logger.log(lvl, 'Message no. %d', i)\n" +"\n" +"if __name__ == '__main__':\n" +" q = Queue()\n" +" d = {\n" +" 'version': 1,\n" +" 'formatters': {\n" +" 'detailed': {\n" +" 'class': 'logging.Formatter',\n" +" 'format': '%(asctime)s %(name)-15s %(levelname)-8s %(processName)-10s %(message)s'\n" +" }\n" +" },\n" +" 'handlers': {\n" +" 'console': {\n" +" 'class': 'logging.StreamHandler',\n" +" 'level': 'INFO',\n" +" },\n" +" 'file': {\n" +" 'class': 'logging.FileHandler',\n" +" 'filename': 'mplog.log',\n" +" 'mode': 'w',\n" +" 'formatter': 'detailed',\n" +" },\n" +" 'foofile': {\n" +" 'class': 'logging.FileHandler',\n" +" 'filename': 'mplog-foo.log',\n" +" 'mode': 'w',\n" +" 'formatter': 'detailed',\n" +" },\n" +" 'errors': {\n" +" 'class': 'logging.FileHandler',\n" +" 'filename': 'mplog-errors.log',\n" +" 'mode': 'w',\n" +" 'level': 'ERROR',\n" +" 'formatter': 'detailed',\n" +" },\n" +" },\n" +" 'loggers': {\n" +" 'foo': {\n" +" 'handlers': ['foofile']\n" +" }\n" +" },\n" +" 'root': {\n" +" 'level': 'DEBUG',\n" +" 'handlers': ['console', 'file', 'errors']\n" +" },\n" +" }\n" +" workers = []\n" +" for i in range(5):\n" +" wp = Process(target=worker_process, name='worker %d' % (i + 1), args=(q,))\n" +" workers.append(wp)\n" +" wp.start()\n" +" logging.config.dictConfig(d)\n" +" lp = threading.Thread(target=logger_thread, args=(q,))\n" +" lp.start()\n" +" # At this point, the main process could do some useful work of its own\n" +" # Once it's done that, it can wait for the workers to terminate...\n" +" for wp in workers:\n" +" wp.join()\n" +" # And now tell the logging thread to finish up, too\n" +" q.put(None)\n" +" lp.join()" +msgstr "" +"import logging\n" +"import logging.config\n" +"import logging.handlers\n" +"from multiprocessing import Process, Queue\n" +"import random\n" +"import threading\n" +"import time\n" +"\n" +"def logger_thread(q):\n" +" while True:\n" +" record = q.get()\n" +" if record is None:\n" +" break\n" +" logger = logging.getLogger(record.name)\n" +" logger.handle(record)\n" +"\n" +"\n" +"def worker_process(q):\n" +" qh = logging.handlers.QueueHandler(q)\n" +" root = logging.getLogger()\n" +" root.setLevel(logging.DEBUG)\n" +" root.addHandler(qh)\n" +" levels = [logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR,\n" +" logging.CRITICAL]\n" +" loggers = ['foo', 'foo.bar', 'foo.bar.baz',\n" +" 'spam', 'spam.ham', 'spam.ham.eggs']\n" +" for i in range(100):\n" +" lvl = random.choice(levels)\n" +" logger = logging.getLogger(random.choice(loggers))\n" +" logger.log(lvl, 'Message no. %d', i)\n" +"\n" +"if __name__ == '__main__':\n" +" q = Queue()\n" +" d = {\n" +" 'version': 1,\n" +" 'formatters': {\n" +" 'detailed': {\n" +" 'class': 'logging.Formatter',\n" +" 'format': '%(asctime)s %(name)-15s %(levelname)-8s %(processName)-10s %(message)s'\n" +" }\n" +" },\n" +" 'handlers': {\n" +" 'console': {\n" +" 'class': 'logging.StreamHandler',\n" +" 'level': 'INFO',\n" +" },\n" +" 'file': {\n" +" 'class': 'logging.FileHandler',\n" +" 'filename': 'mplog.log',\n" +" 'mode': 'w',\n" +" 'formatter': 'detailed',\n" +" },\n" +" 'foofile': {\n" +" 'class': 'logging.FileHandler',\n" +" 'filename': 'mplog-foo.log',\n" +" 'mode': 'w',\n" +" 'formatter': 'detailed',\n" +" },\n" +" 'errors': {\n" +" 'class': 'logging.FileHandler',\n" +" 'filename': 'mplog-errors.log',\n" +" 'mode': 'w',\n" +" 'level': 'ERROR',\n" +" 'formatter': 'detailed',\n" +" },\n" +" },\n" +" 'loggers': {\n" +" 'foo': {\n" +" 'handlers': ['foofile']\n" +" }\n" +" },\n" +" 'root': {\n" +" 'level': 'DEBUG',\n" +" 'handlers': ['console', 'file', 'errors']\n" +" },\n" +" }\n" +" workers = []\n" +" for i in range(5):\n" +" wp = Process(target=worker_process, name='worker %d' % (i + 1), args=(q,))\n" +" workers.append(wp)\n" +" wp.start()\n" +" logging.config.dictConfig(d)\n" +" lp = threading.Thread(target=logger_thread, args=(q,))\n" +" lp.start()\n" +" # 在这里,主进程可以执行某些对它自己有用的工作\n" +" # 当其完成后,即可等待工作进程终结...\n" +" for wp in workers:\n" +" wp.join()\n" +" # 现在再通知日志记录线程结束\n" +" q.put(None)\n" +" lp.join()" + +#: ../../howto/logging-cookbook.rst:1512 +msgid "" +"This variant shows how you can e.g. apply configuration for particular " +"loggers - e.g. the ``foo`` logger has a special handler which stores all " +"events in the ``foo`` subsystem in a file ``mplog-foo.log``. This will be " +"used by the logging machinery in the main process (even though the logging " +"events are generated in the worker processes) to direct the messages to the " +"appropriate destinations." +msgstr "" +"这段变种的代码展示了如何使用特定的日志记录配置 - 例如 ``foo`` 记录器使用了特殊的处理程序,将 ``foo`` " +"子系统中所有的事件记录至一个文件 ``mplog-foo.log`` " +"。在主进程(即使是在工作进程中产生的日志事件)的日志记录机制中将直接使用恰当的配置。" + +#: ../../howto/logging-cookbook.rst:1519 +msgid "Using concurrent.futures.ProcessPoolExecutor" +msgstr "concurrent.futures.ProcessPoolExecutor 的用法" + +#: ../../howto/logging-cookbook.rst:1521 +msgid "" +"If you want to use :class:`concurrent.futures.ProcessPoolExecutor` to start " +"your worker processes, you need to create the queue slightly differently. " +"Instead of" +msgstr "" +"若要利用 :class:`concurrent.futures.ProcessPoolExecutor` " +"启动工作进程,创建队列的方式应稍有不同。不能是:" + +#: ../../howto/logging-cookbook.rst:1525 +msgid "queue = multiprocessing.Queue(-1)" +msgstr "queue = multiprocessing.Queue(-1)" + +#: ../../howto/logging-cookbook.rst:1529 +msgid "you should use" +msgstr "而应是:" + +#: ../../howto/logging-cookbook.rst:1531 +msgid "" +"queue = multiprocessing.Manager().Queue(-1) # also works with the examples " +"above" +msgstr "queue = multiprocessing.Manager().Queue(-1) # 同样适用于上面的例子" + +#: ../../howto/logging-cookbook.rst:1535 +msgid "and you can then replace the worker creation from this::" +msgstr "然后就可以将以下工作进程的创建过程::" + +#: ../../howto/logging-cookbook.rst:1537 +msgid "" +"workers = []\n" +"for i in range(10):\n" +" worker = multiprocessing.Process(target=worker_process,\n" +" args=(queue, worker_configurer))\n" +" workers.append(worker)\n" +" worker.start()\n" +"for w in workers:\n" +" w.join()" +msgstr "" +"workers = []\n" +"for i in range(10):\n" +" worker = multiprocessing.Process(target=worker_process,\n" +" args=(queue, worker_configurer))\n" +" workers.append(worker)\n" +" worker.start()\n" +"for w in workers:\n" +" w.join()" + +#: ../../howto/logging-cookbook.rst:1546 +msgid "to this (remembering to first import :mod:`concurrent.futures`)::" +msgstr "改为 (记得要先导入 :mod:`concurrent.futures`)::" + +#: ../../howto/logging-cookbook.rst:1548 +msgid "" +"with concurrent.futures.ProcessPoolExecutor(max_workers=10) as executor:\n" +" for i in range(10):\n" +" executor.submit(worker_process, queue, worker_configurer)" +msgstr "" +"with concurrent.futures.ProcessPoolExecutor(max_workers=10) as executor:\n" +" for i in range(10):\n" +" executor.submit(worker_process, queue, worker_configurer)" + +#: ../../howto/logging-cookbook.rst:1553 +msgid "Deploying web applications using Gunicorn and uWSGI" +msgstr "" + +#: ../../howto/logging-cookbook.rst:1555 +msgid "" +"When deploying web applications using `Gunicorn `_ or" +" `uWSGI `_ (or similar), " +"multiple worker processes are created to handle client requests. In such " +"environments, avoid creating file-based handlers directly in your web " +"application. Instead, use a :class:`SocketHandler` to log from the web " +"application to a listener in a separate process. This can be set up using a " +"process management tool such as Supervisor - see `Running a logging socket " +"listener in production`_ for more details." +msgstr "" + +#: ../../howto/logging-cookbook.rst:1565 +msgid "Using file rotation" +msgstr "轮换日志文件" + +#: ../../howto/logging-cookbook.rst:1570 +msgid "" +"Sometimes you want to let a log file grow to a certain size, then open a new" +" file and log to that. You may want to keep a certain number of these files," +" and when that many files have been created, rotate the files so that the " +"number of files and the size of the files both remain bounded. For this " +"usage pattern, the logging package provides a :class:`RotatingFileHandler`::" +msgstr "" +"有时您会希望让日志文件增长到一定大小,然后打开一个新的接着记录日志。 " +"您可能希望只保留一定数量的日志文件,当创建文件达到指定数量后将会轮换文件,从而使文件数量和文件大小都保持在一定范围之内。 " +"对于这种使用模式,日志包提供了一个 :class:`RotatingFileHandler`::" + +#: ../../howto/logging-cookbook.rst:1576 +msgid "" +"import glob\n" +"import logging\n" +"import logging.handlers\n" +"\n" +"LOG_FILENAME = 'logging_rotatingfile_example.out'\n" +"\n" +"# Set up a specific logger with our desired output level\n" +"my_logger = logging.getLogger('MyLogger')\n" +"my_logger.setLevel(logging.DEBUG)\n" +"\n" +"# Add the log message handler to the logger\n" +"handler = logging.handlers.RotatingFileHandler(\n" +" LOG_FILENAME, maxBytes=20, backupCount=5)\n" +"\n" +"my_logger.addHandler(handler)\n" +"\n" +"# Log some messages\n" +"for i in range(20):\n" +" my_logger.debug('i = %d' % i)\n" +"\n" +"# See what files are created\n" +"logfiles = glob.glob('%s*' % LOG_FILENAME)\n" +"\n" +"for filename in logfiles:\n" +" print(filename)" +msgstr "" +"import glob\n" +"import logging\n" +"import logging.handlers\n" +"\n" +"LOG_FILENAME = 'logging_rotatingfile_example.out'\n" +"\n" +"# 使用我们想要的输出层级设置特定的日志记录器\n" +"my_logger = logging.getLogger('MyLogger')\n" +"my_logger.setLevel(logging.DEBUG)\n" +"\n" +"# 将日志消息处理器添加到日志记录器\n" +"handler = logging.handlers.RotatingFileHandler(\n" +" LOG_FILENAME, maxBytes=20, backupCount=5)\n" +"\n" +"my_logger.addHandler(handler)\n" +"\n" +"# 记录一些消息\n" +"for i in range(20):\n" +" my_logger.debug('i = %d' % i)\n" +"\n" +"# 查看创建了哪些文件\n" +"logfiles = glob.glob('%s*' % LOG_FILENAME)\n" +"\n" +"for filename in logfiles:\n" +" print(filename)" + +#: ../../howto/logging-cookbook.rst:1602 +msgid "" +"The result should be 6 separate files, each with part of the log history for" +" the application:" +msgstr "结果应该是 6 个单独的文件,每个文件都包含了应用程序的部分历史日志:" + +#: ../../howto/logging-cookbook.rst:1605 +msgid "" +"logging_rotatingfile_example.out\n" +"logging_rotatingfile_example.out.1\n" +"logging_rotatingfile_example.out.2\n" +"logging_rotatingfile_example.out.3\n" +"logging_rotatingfile_example.out.4\n" +"logging_rotatingfile_example.out.5" +msgstr "" +"logging_rotatingfile_example.out\n" +"logging_rotatingfile_example.out.1\n" +"logging_rotatingfile_example.out.2\n" +"logging_rotatingfile_example.out.3\n" +"logging_rotatingfile_example.out.4\n" +"logging_rotatingfile_example.out.5" + +#: ../../howto/logging-cookbook.rst:1614 +msgid "" +"The most current file is always :file:`logging_rotatingfile_example.out`, " +"and each time it reaches the size limit it is renamed with the suffix " +"``.1``. Each of the existing backup files is renamed to increment the suffix" +" (``.1`` becomes ``.2``, etc.) and the ``.6`` file is erased." +msgstr "" +"最新的文件始终是 :file:`logging_rotatingfile_example.out`,每次到达大小限制时,都会使用后缀 ``.1`` " +"重命名。每个现有的备份文件都会被重命名并增加其后缀 (例如 ``.1`` 变为 ``.2``),而 ``.6`` 文件会被删除掉。" + +#: ../../howto/logging-cookbook.rst:1619 +msgid "" +"Obviously this example sets the log length much too small as an extreme " +"example. You would want to set *maxBytes* to an appropriate value." +msgstr "显然,这个例子将日志长度设置得太小,这是一个极端的例子。你可能希望将 *maxBytes* 设置为一个合适的值。" + +#: ../../howto/logging-cookbook.rst:1627 +msgid "Use of alternative formatting styles" +msgstr "使用其他日志格式化方式" + +#: ../../howto/logging-cookbook.rst:1629 +msgid "" +"When logging was added to the Python standard library, the only way of " +"formatting messages with variable content was to use the %-formatting " +"method. Since then, Python has gained two new formatting approaches: " +":class:`string.Template` (added in Python 2.4) and :meth:`str.format` (added" +" in Python 2.6)." +msgstr "" +"当日志模块被添加至 Python 标准库时,只有一种格式化消息内容的方法即 %-formatting。在那之后,Python 又增加了两种格式化方法: " +":class:`string.Template` (在 Python 2.4 中新增) 和 :meth:`str.format` (在 Python " +"2.6 中新增)。" + +#: ../../howto/logging-cookbook.rst:1635 +msgid "" +"Logging (as of 3.2) provides improved support for these two additional " +"formatting styles. The :class:`Formatter` class been enhanced to take an " +"additional, optional keyword parameter named ``style``. This defaults to " +"``'%'``, but other possible values are ``'{'`` and ``'$'``, which correspond" +" to the other two formatting styles. Backwards compatibility is maintained " +"by default (as you would expect), but by explicitly specifying a style " +"parameter, you get the ability to specify format strings which work with " +":meth:`str.format` or :class:`string.Template`. Here's an example console " +"session to show the possibilities:" +msgstr "" +"日志(从 3.2 开始)为这两种格式化方式提供了更多支持。:class:`Formatter` 类可以添加一个额外的可选关键字参数 " +"``style``。它的默认值是 ``'%'``,其他的值 ``'{'`` 和 ``'$'`` " +"也支持,对应了其他两种格式化样式。其保持了向后兼容(如您所愿),但通过显示指定样式参数,你可以指定格式化字符串的方式是使用 " +":meth:`str.format` 或 :class:`string.Template`。这里是一个控制台会话的示例,展示了这些方式:" + +#: ../../howto/logging-cookbook.rst:1645 +msgid "" +">>> import logging\n" +">>> root = logging.getLogger()\n" +">>> root.setLevel(logging.DEBUG)\n" +">>> handler = logging.StreamHandler()\n" +">>> bf = logging.Formatter('{asctime} {name} {levelname:8s} {message}',\n" +"... style='{')\n" +">>> handler.setFormatter(bf)\n" +">>> root.addHandler(handler)\n" +">>> logger = logging.getLogger('foo.bar')\n" +">>> logger.debug('This is a DEBUG message')\n" +"2010-10-28 15:11:55,341 foo.bar DEBUG This is a DEBUG message\n" +">>> logger.critical('This is a CRITICAL message')\n" +"2010-10-28 15:12:11,526 foo.bar CRITICAL This is a CRITICAL message\n" +">>> df = logging.Formatter('$asctime $name ${levelname} $message',\n" +"... style='$')\n" +">>> handler.setFormatter(df)\n" +">>> logger.debug('This is a DEBUG message')\n" +"2010-10-28 15:13:06,924 foo.bar DEBUG This is a DEBUG message\n" +">>> logger.critical('This is a CRITICAL message')\n" +"2010-10-28 15:13:11,494 foo.bar CRITICAL This is a CRITICAL message\n" +">>>" +msgstr "" +">>> import logging\n" +">>> root = logging.getLogger()\n" +">>> root.setLevel(logging.DEBUG)\n" +">>> handler = logging.StreamHandler()\n" +">>> bf = logging.Formatter('{asctime} {name} {levelname:8s} {message}',\n" +"... style='{')\n" +">>> handler.setFormatter(bf)\n" +">>> root.addHandler(handler)\n" +">>> logger = logging.getLogger('foo.bar')\n" +">>> logger.debug('This is a DEBUG message')\n" +"2010-10-28 15:11:55,341 foo.bar DEBUG This is a DEBUG message\n" +">>> logger.critical('This is a CRITICAL message')\n" +"2010-10-28 15:12:11,526 foo.bar CRITICAL This is a CRITICAL message\n" +">>> df = logging.Formatter('$asctime $name ${levelname} $message',\n" +"... style='$')\n" +">>> handler.setFormatter(df)\n" +">>> logger.debug('This is a DEBUG message')\n" +"2010-10-28 15:13:06,924 foo.bar DEBUG This is a DEBUG message\n" +">>> logger.critical('This is a CRITICAL message')\n" +"2010-10-28 15:13:11,494 foo.bar CRITICAL This is a CRITICAL message\n" +">>>" + +#: ../../howto/logging-cookbook.rst:1669 +msgid "" +"Note that the formatting of logging messages for final output to logs is " +"completely independent of how an individual logging message is constructed. " +"That can still use %-formatting, as shown here::" +msgstr "请注意最终输出到日志的消息格式完全独立于单条日志消息的构造方式。它仍然可以使用 %-formatting,如下所示::" + +#: ../../howto/logging-cookbook.rst:1673 +msgid "" +">>> logger.error('This is an%s %s %s', 'other,', 'ERROR,', 'message')\n" +"2010-10-28 15:19:29,833 foo.bar ERROR This is another, ERROR, message\n" +">>>" +msgstr "" +">>> logger.error('This is an%s %s %s', 'other,', 'ERROR,', 'message')\n" +"2010-10-28 15:19:29,833 foo.bar ERROR This is another, ERROR, message\n" +">>>" + +#: ../../howto/logging-cookbook.rst:1677 +msgid "" +"Logging calls (``logger.debug()``, ``logger.info()`` etc.) only take " +"positional parameters for the actual logging message itself, with keyword " +"parameters used only for determining options for how to handle the actual " +"logging call (e.g. the ``exc_info`` keyword parameter to indicate that " +"traceback information should be logged, or the ``extra`` keyword parameter " +"to indicate additional contextual information to be added to the log). So " +"you cannot directly make logging calls using :meth:`str.format` or " +":class:`string.Template` syntax, because internally the logging package uses" +" %-formatting to merge the format string and the variable arguments. There " +"would be no changing this while preserving backward compatibility, since all" +" logging calls which are out there in existing code will be using %-format " +"strings." +msgstr "" +"日志调用 (``logger.debug()``、``logger.info()`` 等) " +"接受的位置参数只会用于日志信息本身,而关键字参数仅用于日志调用的可选处理参数(如关键字参数 ``exc_info`` 表示应记录跟踪信息, " +"``extra`` 则标识了需要加入日志的额外上下文信息)。 所以不能直接用 :meth:`str.format` 或 " +":class:`string.Template` 语法进行日志调用,因为日志包在内部使用 %-f 格式来合并格式串和参数变量。 " +"在保持向下兼容性时,这一点不会改变,因为已有代码中的所有日志调用都会使用 %-f 格式串。" + +#: ../../howto/logging-cookbook.rst:1690 +msgid "" +"There is, however, a way that you can use {}- and $- formatting to construct" +" your individual log messages. Recall that for a message you can use an " +"arbitrary object as a message format string, and that the logging package " +"will call ``str()`` on that object to get the actual format string. Consider" +" the following two classes::" +msgstr "" +"还有一种方法可以构建自己的日志信息,就是利用 {}- 和 $- 格式。回想一下,任意对象都可用为日志信息的格式串,日志包将会调用该对象的 " +"``str()`` 方法,以获取最终的格式串。不妨看下以下两个类::" + +#: ../../howto/logging-cookbook.rst:1696 ../../howto/logging-cookbook.rst:2784 +msgid "" +"class BraceMessage:\n" +" def __init__(self, fmt, /, *args, **kwargs):\n" +" self.fmt = fmt\n" +" self.args = args\n" +" self.kwargs = kwargs\n" +"\n" +" def __str__(self):\n" +" return self.fmt.format(*self.args, **self.kwargs)\n" +"\n" +"class DollarMessage:\n" +" def __init__(self, fmt, /, **kwargs):\n" +" self.fmt = fmt\n" +" self.kwargs = kwargs\n" +"\n" +" def __str__(self):\n" +" from string import Template\n" +" return Template(self.fmt).substitute(**self.kwargs)" +msgstr "" +"class BraceMessage:\n" +" def __init__(self, fmt, /, *args, **kwargs):\n" +" self.fmt = fmt\n" +" self.args = args\n" +" self.kwargs = kwargs\n" +"\n" +" def __str__(self):\n" +" return self.fmt.format(*self.args, **self.kwargs)\n" +"\n" +"class DollarMessage:\n" +" def __init__(self, fmt, /, **kwargs):\n" +" self.fmt = fmt\n" +" self.kwargs = kwargs\n" +"\n" +" def __str__(self):\n" +" from string import Template\n" +" return Template(self.fmt).substitute(**self.kwargs)" + +#: ../../howto/logging-cookbook.rst:1714 +msgid "" +"Either of these can be used in place of a format string, to allow {}- or " +"$-formatting to be used to build the actual \"message\" part which appears " +"in the formatted log output in place of \"%(message)s\" or \"{message}\" or " +"\"$message\". It's a little unwieldy to use the class names whenever you " +"want to log something, but it's quite palatable if you use an alias such as " +"__ (double underscore --- not to be confused with _, the single underscore " +"used as a synonym/alias for :func:`gettext.gettext` or its brethren)." +msgstr "" +"上述两个类均可代替格式串,使得能用 {}- 或 $-formatting 构建最终的“日志信息”部分,这些信息将出现在格式化后的日志输出中,替换 " +"%(message)s 或“{message}”或“$message”。每次写入日志时都要使用类名,有点不大实用,但如果用上 __ " +"之类的别名就相当合适了(双下划线 --- 不要与 _ 混淆,单下划线用作 :func:`gettext.gettext` 或相关函数的同义词/别名)。" + +#: ../../howto/logging-cookbook.rst:1722 +msgid "" +"The above classes are not included in Python, though they're easy enough to " +"copy and paste into your own code. They can be used as follows (assuming " +"that they're declared in a module called ``wherever``):" +msgstr "Python 并没有上述两个类,当然复制粘贴到自己的代码中也很容易。用法可如下所示(假定在名为 ``wherever`` 的模块中声明):" + +#: ../../howto/logging-cookbook.rst:1726 +msgid "" +">>> from wherever import BraceMessage as __\n" +">>> print(__('Message with {0} {name}', 2, name='placeholders'))\n" +"Message with 2 placeholders\n" +">>> class Point: pass\n" +"...\n" +">>> p = Point()\n" +">>> p.x = 0.5\n" +">>> p.y = 0.5\n" +">>> print(__('Message with coordinates: ({point.x:.2f}, {point.y:.2f})',\n" +"... point=p))\n" +"Message with coordinates: (0.50, 0.50)\n" +">>> from wherever import DollarMessage as __\n" +">>> print(__('Message with $num $what', num=2, what='placeholders'))\n" +"Message with 2 placeholders\n" +">>>" +msgstr "" +">>> from wherever import BraceMessage as __\n" +">>> print(__('Message with {0} {name}', 2, name='placeholders'))\n" +"Message with 2 placeholders\n" +">>> class Point: pass\n" +"...\n" +">>> p = Point()\n" +">>> p.x = 0.5\n" +">>> p.y = 0.5\n" +">>> print(__('Message with coordinates: ({point.x:.2f}, {point.y:.2f})',\n" +"... point=p))\n" +"Message with coordinates: (0.50, 0.50)\n" +">>> from wherever import DollarMessage as __\n" +">>> print(__('Message with $num $what', num=2, what='placeholders'))\n" +"Message with 2 placeholders\n" +">>>" + +#: ../../howto/logging-cookbook.rst:1744 +msgid "" +"While the above examples use ``print()`` to show how the formatting works, " +"you would of course use ``logger.debug()`` or similar to actually log using " +"this approach." +msgstr "" +"上述示例用了 ``print()`` 演示格式化输出的过程,实际记录日志时当然会用类似 ``logger.debug()`` 的方法来应用。" + +#: ../../howto/logging-cookbook.rst:1748 +msgid "" +"One thing to note is that you pay no significant performance penalty with " +"this approach: the actual formatting happens not when you make the logging " +"call, but when (and if) the logged message is actually about to be output to" +" a log by a handler. So the only slightly unusual thing which might trip you" +" up is that the parentheses go around the format string and the arguments, " +"not just the format string. That's because the __ notation is just syntax " +"sugar for a constructor call to one of the :samp:`{XXX}Message` classes." +msgstr "" +"需要注意的是使用这种方式不会对性能造成明显影响:实际的格式化工作不是在日志记录调用时发生的,而是在(如果)处理器即将把日志消息输出到日志时发生的。 " +"因此,唯一可能令人困惑的不寻常之处在于包裹在格式字符串和参数外面的圆括号,而不仅仅是格式字符串。这是因为 __ 标记只是对 " +":samp:`{XXX}Message` 类的构造器的调用的语法糖。" + +#: ../../howto/logging-cookbook.rst:1756 +msgid "" +"If you prefer, you can use a :class:`LoggerAdapter` to achieve a similar " +"effect to the above, as in the following example::" +msgstr "只要愿意,上述类似的效果即可用 :class:`LoggerAdapter` 实现,如下例所示::" + +#: ../../howto/logging-cookbook.rst:1759 +msgid "" +"import logging\n" +"\n" +"class Message:\n" +" def __init__(self, fmt, args):\n" +" self.fmt = fmt\n" +" self.args = args\n" +"\n" +" def __str__(self):\n" +" return self.fmt.format(*self.args)\n" +"\n" +"class StyleAdapter(logging.LoggerAdapter):\n" +" def log(self, level, msg, /, *args, stacklevel=1, **kwargs):\n" +" if self.isEnabledFor(level):\n" +" msg, kwargs = self.process(msg, kwargs)\n" +" self.logger.log(level, Message(msg, args), **kwargs,\n" +" stacklevel=stacklevel+1)\n" +"\n" +"logger = StyleAdapter(logging.getLogger(__name__))\n" +"\n" +"def main():\n" +" logger.debug('Hello, {}', 'world!')\n" +"\n" +"if __name__ == '__main__':\n" +" logging.basicConfig(level=logging.DEBUG)\n" +" main()" +msgstr "" +"import logging\n" +"\n" +"class Message:\n" +" def __init__(self, fmt, args):\n" +" self.fmt = fmt\n" +" self.args = args\n" +"\n" +" def __str__(self):\n" +" return self.fmt.format(*self.args)\n" +"\n" +"class StyleAdapter(logging.LoggerAdapter):\n" +" def log(self, level, msg, /, *args, stacklevel=1, **kwargs):\n" +" if self.isEnabledFor(level):\n" +" msg, kwargs = self.process(msg, kwargs)\n" +" self.logger.log(level, Message(msg, args), **kwargs,\n" +" stacklevel=stacklevel+1)\n" +"\n" +"logger = StyleAdapter(logging.getLogger(__name__))\n" +"\n" +"def main():\n" +" logger.debug('Hello, {}', 'world!')\n" +"\n" +"if __name__ == '__main__':\n" +" logging.basicConfig(level=logging.DEBUG)\n" +" main()" + +#: ../../howto/logging-cookbook.rst:1785 +msgid "" +"The above script should log the message ``Hello, world!`` when run with " +"Python 3.8 or later." +msgstr "在用 Python 3.8 以上版本运行时上述脚本应该会将消息 ``Hello, world!`` 写入日志。" + +#: ../../howto/logging-cookbook.rst:1794 +msgid "Customizing ``LogRecord``" +msgstr "自定义 ``LogRecord``" + +#: ../../howto/logging-cookbook.rst:1796 +msgid "" +"Every logging event is represented by a :class:`LogRecord` instance. When an" +" event is logged and not filtered out by a logger's level, a " +":class:`LogRecord` is created, populated with information about the event " +"and then passed to the handlers for that logger (and its ancestors, up to " +"and including the logger where further propagation up the hierarchy is " +"disabled). Before Python 3.2, there were only two places where this creation" +" was done:" +msgstr "" +"每条日志事件都由一个 :class:`LogRecord` 实例表示。当某事件要记入日志并且没有被某级别过滤掉时,就会创建一个 " +":class:`LogRecord` 对象,并将有关事件的信息填入,传给该日志对象的 handler(及其祖先,直至对象禁止向上传播为止)。在 " +"Python 3.2 之前,只有两个地方会进行事件的创建:" + +#: ../../howto/logging-cookbook.rst:1803 +msgid "" +":meth:`Logger.makeRecord`, which is called in the normal process of logging " +"an event. This invoked :class:`LogRecord` directly to create an instance." +msgstr "" +":meth:`Logger.makeRecord`,在事件正常记入日志的过程中调用。这会直接调用 :class:`LogRecord` 来创建一个实例。" + +#: ../../howto/logging-cookbook.rst:1806 +msgid "" +":func:`makeLogRecord`, which is called with a dictionary containing " +"attributes to be added to the LogRecord. This is typically invoked when a " +"suitable dictionary has been received over the network (e.g. in pickle form " +"via a :class:`~handlers.SocketHandler`, or in JSON form via an " +":class:`~handlers.HTTPHandler`)." +msgstr "" +":func:`makeLogRecord`,调用时会带上一个字典参数,其中存放着要加入 LogRecord " +"的属性。这通常在通过网络接收到合适的字典时调用(如通过 :class:`~handlers.SocketHandler` 以 pickle 形式,或通过" +" :class:`~handlers.HTTPHandler` 以 JSON 形式)。" + +#: ../../howto/logging-cookbook.rst:1812 +msgid "" +"This has usually meant that if you need to do anything special with a " +":class:`LogRecord`, you've had to do one of the following." +msgstr "于是这意味着若要对 :class:`LogRecord` 进行定制,必须进行下述某种操作。" + +#: ../../howto/logging-cookbook.rst:1815 +msgid "" +"Create your own :class:`Logger` subclass, which overrides " +":meth:`Logger.makeRecord`, and set it using :func:`~logging.setLoggerClass` " +"before any loggers that you care about are instantiated." +msgstr "" +"创建 :class:`Logger`  自定义子类,重写 :meth:`Logger.makeRecord`,并在实例化所需日志对象之前用 " +":func:`~logging.setLoggerClass` 进行设置。" + +#: ../../howto/logging-cookbook.rst:1818 +msgid "" +"Add a :class:`Filter` to a logger or handler, which does the necessary " +"special manipulation you need when its :meth:`~Filter.filter` method is " +"called." +msgstr "" +"为日志对象添加 :class:`Filter` 或 handler,当其 :meth:`~Filter.filter` " +"方法被调用时,会执行必要的定制操作。" + +#: ../../howto/logging-cookbook.rst:1822 +msgid "" +"The first approach would be a little unwieldy in the scenario where (say) " +"several different libraries wanted to do different things. Each would " +"attempt to set its own :class:`Logger` subclass, and the one which did this " +"last would win." +msgstr "" +"比如说在有多个不同库要完成不同操作的场景下,第一种方式会有点笨拙。每次都要尝试设置自己的 :class:`Logger` " +"子类,而起作用的是最后一次尝试。" + +#: ../../howto/logging-cookbook.rst:1827 +msgid "" +"The second approach works reasonably well for many cases, but does not allow" +" you to e.g. use a specialized subclass of :class:`LogRecord`. Library " +"developers can set a suitable filter on their loggers, but they would have " +"to remember to do this every time they introduced a new logger (which they " +"would do simply by adding new packages or modules and doing ::" +msgstr "" +"第二种方式在多数情况下效果都比较良好,但不允许你使用特殊化的 :class:`LogRecord` 子类。 " +"库开发者可以为他们的日志记录器设置合适的过滤器,但他们应当要记得每次引入新的日志记录器时都需如此(他们只需通过添加新的包或模块并执行以下操作即可)::" + +#: ../../howto/logging-cookbook.rst:1833 +msgid "logger = logging.getLogger(__name__)" +msgstr "logger = logging.getLogger(__name__)" + +#: ../../howto/logging-cookbook.rst:1835 +msgid "" +"at module level). It's probably one too many things to think about. " +"Developers could also add the filter to a :class:`~logging.NullHandler` " +"attached to their top-level logger, but this would not be invoked if an " +"application developer attached a handler to a lower-level library logger ---" +" so output from that handler would not reflect the intentions of the library" +" developer." +msgstr "" +"或许这样要顾及太多事情。开发人员还可以将过滤器附加到其顶级日志对象的 :class:`~logging.NullHandler` " +"中,但如果应用程序开发人员将 handler 附加到较底层库的日志对象,则不会调用该过滤器 --- 所以 handler " +"输出的内容不会符合库开发人员的预期。" + +#: ../../howto/logging-cookbook.rst:1841 +msgid "" +"In Python 3.2 and later, :class:`~logging.LogRecord` creation is done " +"through a factory, which you can specify. The factory is just a callable you" +" can set with :func:`~logging.setLogRecordFactory`, and interrogate with " +":func:`~logging.getLogRecordFactory`. The factory is invoked with the same " +"signature as the :class:`~logging.LogRecord` constructor, as " +":class:`LogRecord` is the default setting for the factory." +msgstr "" +"在 Python 3.2 以上版本中,:class:`~logging.LogRecord` " +"的创建是通过工厂对象完成的,工厂对象可以指定。工厂对象只是一个可调用对象,可以用 " +":func:`~logging.setLogRecordFactory` 进行设置,并用 " +":func:`~logging.getLogRecordFactory` 进行查询。工厂对象的调用参数与 " +":class:`~logging.LogRecord` 的构造函数相同,因为 :class:`LogRecord` 是工厂对象的默认设置。" + +#: ../../howto/logging-cookbook.rst:1848 +msgid "" +"This approach allows a custom factory to control all aspects of LogRecord " +"creation. For example, you could return a subclass, or just add some " +"additional attributes to the record once created, using a pattern similar to" +" this::" +msgstr "" +"这种方式可以让自定义工厂对象完全控制 LogRecord " +"的创建过程。比如可以返回一个子类,或者在创建的日志对象中加入一些额外的属性,使用方式如下所示::" + +#: ../../howto/logging-cookbook.rst:1852 +msgid "" +"old_factory = logging.getLogRecordFactory()\n" +"\n" +"def record_factory(*args, **kwargs):\n" +" record = old_factory(*args, **kwargs)\n" +" record.custom_attribute = 0xdecafbad\n" +" return record\n" +"\n" +"logging.setLogRecordFactory(record_factory)" +msgstr "" +"old_factory = logging.getLogRecordFactory()\n" +"\n" +"def record_factory(*args, **kwargs):\n" +" record = old_factory(*args, **kwargs)\n" +" record.custom_attribute = 0xdecafbad\n" +" return record\n" +"\n" +"logging.setLogRecordFactory(record_factory)" + +#: ../../howto/logging-cookbook.rst:1861 +msgid "" +"This pattern allows different libraries to chain factories together, and as " +"long as they don't overwrite each other's attributes or unintentionally " +"overwrite the attributes provided as standard, there should be no surprises." +" However, it should be borne in mind that each link in the chain adds run-" +"time overhead to all logging operations, and the technique should only be " +"used when the use of a :class:`Filter` does not provide the desired result." +msgstr "" +"这种模式允许不同的库将多个工厂对象链在一起,只要不会覆盖彼此的属性或标准属性,就不会出现意外。但应记住,工厂链中的每个节点都会增加日志操作的运行开销,本技术仅在采用" +" :class:`Filter` 无法达到目标时才应使用。" + +#: ../../howto/logging-cookbook.rst:1873 +msgid "Subclassing QueueHandler and QueueListener- a ZeroMQ example" +msgstr "子类化 QueueHandler 和 QueueListener - ZeroMQ 示例" + +#: ../../howto/logging-cookbook.rst:1876 ../../howto/logging-cookbook.rst:2009 +msgid "Subclass ``QueueHandler``" +msgstr "子类 ``QueueHandler``" + +#: ../../howto/logging-cookbook.rst:1878 +msgid "" +"You can use a :class:`QueueHandler` subclass to send messages to other kinds" +" of queues, for example a ZeroMQ 'publish' socket. In the example below,the " +"socket is created separately and passed to the handler (as its 'queue')::" +msgstr "" +"你可以使用 :class:`QueueHandler` 子类将消息发送给其他类型的队列,比如 ZeroMQ 'publish' 套接字。 " +"在以下示例中,套接字将单独创建并传给处理器 (作为它的 'queue')::" + +#: ../../howto/logging-cookbook.rst:1882 +msgid "" +"import zmq # using pyzmq, the Python binding for ZeroMQ\n" +"import json # for serializing records portably\n" +"\n" +"ctx = zmq.Context()\n" +"sock = zmq.Socket(ctx, zmq.PUB) # or zmq.PUSH, or other suitable value\n" +"sock.bind('tcp://*:5556') # or wherever\n" +"\n" +"class ZeroMQSocketHandler(QueueHandler):\n" +" def enqueue(self, record):\n" +" self.queue.send_json(record.__dict__)\n" +"\n" +"\n" +"handler = ZeroMQSocketHandler(sock)" +msgstr "" +"import zmq # 使用 pyzmq,这是 ZeroMQ 的 Python 绑定\n" +"import json # 用于可移植地对记录进行序列化\n" +"\n" +"ctx = zmq.Context()\n" +"sock = zmq.Socket(ctx, zmq.PUB) # 或 zmq.PUSH,或其他适当的值\n" +"sock.bind('tcp://*:5556') # 或任何值\n" +"\n" +"class ZeroMQSocketHandler(QueueHandler):\n" +" def enqueue(self, record):\n" +" self.queue.send_json(record.__dict__)\n" +"\n" +"\n" +"handler = ZeroMQSocketHandler(sock)" + +#: ../../howto/logging-cookbook.rst:1897 +msgid "" +"Of course there are other ways of organizing this, for example passing in " +"the data needed by the handler to create the socket::" +msgstr "当然还有其他方案,比如通过 handler 传入所需数据,以创建 socket::" + +#: ../../howto/logging-cookbook.rst:1900 +msgid "" +"class ZeroMQSocketHandler(QueueHandler):\n" +" def __init__(self, uri, socktype=zmq.PUB, ctx=None):\n" +" self.ctx = ctx or zmq.Context()\n" +" socket = zmq.Socket(self.ctx, socktype)\n" +" socket.bind(uri)\n" +" super().__init__(socket)\n" +"\n" +" def enqueue(self, record):\n" +" self.queue.send_json(record.__dict__)\n" +"\n" +" def close(self):\n" +" self.queue.close()" +msgstr "" +"class ZeroMQSocketHandler(QueueHandler):\n" +" def __init__(self, uri, socktype=zmq.PUB, ctx=None):\n" +" self.ctx = ctx or zmq.Context()\n" +" socket = zmq.Socket(self.ctx, socktype)\n" +" socket.bind(uri)\n" +" super().__init__(socket)\n" +"\n" +" def enqueue(self, record):\n" +" self.queue.send_json(record.__dict__)\n" +"\n" +" def close(self):\n" +" self.queue.close()" + +#: ../../howto/logging-cookbook.rst:1915 ../../howto/logging-cookbook.rst:1945 +msgid "Subclass ``QueueListener``" +msgstr "子类 ``QueueListener``" + +#: ../../howto/logging-cookbook.rst:1917 +msgid "" +"You can also subclass :class:`QueueListener` to get messages from other " +"kinds of queues, for example a ZeroMQ 'subscribe' socket. Here's an " +"example::" +msgstr "" +"你还可以子类化 :class:`QueueListener` 来从其他类型的队列中获取消息,比如从 ZeroMQ 'subscribe' 套接字。 " +"下面是一个例子::" + +#: ../../howto/logging-cookbook.rst:1920 +msgid "" +"class ZeroMQSocketListener(QueueListener):\n" +" def __init__(self, uri, /, *handlers, **kwargs):\n" +" self.ctx = kwargs.get('ctx') or zmq.Context()\n" +" socket = zmq.Socket(self.ctx, zmq.SUB)\n" +" socket.setsockopt_string(zmq.SUBSCRIBE, '') # subscribe to everything\n" +" socket.connect(uri)\n" +" super().__init__(socket, *handlers, **kwargs)\n" +"\n" +" def dequeue(self):\n" +" msg = self.queue.recv_json()\n" +" return logging.makeLogRecord(msg)" +msgstr "" +"class ZeroMQSocketListener(QueueListener):\n" +" def __init__(self, uri, /, *handlers, **kwargs):\n" +" self.ctx = kwargs.get('ctx') or zmq.Context()\n" +" socket = zmq.Socket(self.ctx, zmq.SUB)\n" +" socket.setsockopt_string(zmq.SUBSCRIBE, '') # 全部预订\n" +" socket.connect(uri)\n" +" super().__init__(socket, *handlers, **kwargs)\n" +"\n" +" def dequeue(self):\n" +" msg = self.queue.recv_json()\n" +" return logging.makeLogRecord(msg)" + +#: ../../howto/logging-cookbook.rst:1935 +msgid "Subclassing QueueHandler and QueueListener- a ``pynng`` example" +msgstr "子类化 QueueHandler 和 QueueListener - ``pynng`` 示例" + +#: ../../howto/logging-cookbook.rst:1937 +msgid "" +"In a similar way to the above section, we can implement a listener and " +"handler using :pypi:`pynng`, which is a Python binding to `NNG " +"`_, billed as a spiritual successor to ZeroMQ. The" +" following snippets illustrate -- you can test them in an environment which " +"has ``pynng`` installed. Just for variety, we present the listener first." +msgstr "" +"通过与上一节类似的方式,我们可以使用 :pypi:`pynng` 来实现监听器和处理器,这个包是针对 `NNG " +"`_ 的 Python 绑定,它被确定为 ZeroMQ 的精神后继者。以下代码片段被用作演示 -- " +"你可以在安装了 ``pynng`` 的环境中测试它们。为增加变化,我们先编写监听器。" + +#: ../../howto/logging-cookbook.rst:1947 +msgid "" +"# listener.py\n" +"import json\n" +"import logging\n" +"import logging.handlers\n" +"\n" +"import pynng\n" +"\n" +"DEFAULT_ADDR = \"tcp://localhost:13232\"\n" +"\n" +"interrupted = False\n" +"\n" +"class NNGSocketListener(logging.handlers.QueueListener):\n" +"\n" +" def __init__(self, uri, /, *handlers, **kwargs):\n" +" # Have a timeout for interruptibility, and open a\n" +" # subscriber socket\n" +" socket = pynng.Sub0(listen=uri, recv_timeout=500)\n" +" # The b'' subscription matches all topics\n" +" topics = kwargs.pop('topics', None) or b''\n" +" socket.subscribe(topics)\n" +" # We treat the socket as a queue\n" +" super().__init__(socket, *handlers, **kwargs)\n" +"\n" +" def dequeue(self, block):\n" +" data = None\n" +" # Keep looping while not interrupted and no data received over the\n" +" # socket\n" +" while not interrupted:\n" +" try:\n" +" data = self.queue.recv(block=block)\n" +" break\n" +" except pynng.Timeout:\n" +" pass\n" +" except pynng.Closed: # sometimes happens when you hit Ctrl-C\n" +" break\n" +" if data is None:\n" +" return None\n" +" # Get the logging event sent from a publisher\n" +" event = json.loads(data.decode('utf-8'))\n" +" return logging.makeLogRecord(event)\n" +"\n" +" def enqueue_sentinel(self):\n" +" # Not used in this implementation, as the socket isn't really a\n" +" # queue\n" +" pass\n" +"\n" +"logging.getLogger('pynng').propagate = False\n" +"listener = NNGSocketListener(DEFAULT_ADDR, logging.StreamHandler(), topics=b'')\n" +"listener.start()\n" +"print('Press Ctrl-C to stop.')\n" +"try:\n" +" while True:\n" +" pass\n" +"except KeyboardInterrupt:\n" +" interrupted = True\n" +"finally:\n" +" listener.stop()" +msgstr "" + +#: ../../howto/logging-cookbook.rst:2013 +msgid "" +"# sender.py\n" +"import json\n" +"import logging\n" +"import logging.handlers\n" +"import time\n" +"import random\n" +"\n" +"import pynng\n" +"\n" +"DEFAULT_ADDR = \"tcp://localhost:13232\"\n" +"\n" +"class NNGSocketHandler(logging.handlers.QueueHandler):\n" +"\n" +" def __init__(self, uri):\n" +" socket = pynng.Pub0(dial=uri, send_timeout=500)\n" +" super().__init__(socket)\n" +"\n" +" def enqueue(self, record):\n" +" # Send the record as UTF-8 encoded JSON\n" +" d = dict(record.__dict__)\n" +" data = json.dumps(d)\n" +" self.queue.send(data.encode('utf-8'))\n" +"\n" +" def close(self):\n" +" self.queue.close()\n" +"\n" +"logging.getLogger('pynng').propagate = False\n" +"handler = NNGSocketHandler(DEFAULT_ADDR)\n" +"# Make sure the process ID is in the output\n" +"logging.basicConfig(level=logging.DEBUG,\n" +" handlers=[logging.StreamHandler(), handler],\n" +" format='%(levelname)-8s %(name)10s %(process)6s %(message)s')\n" +"levels = (logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR,\n" +" logging.CRITICAL)\n" +"logger_names = ('myapp', 'myapp.lib1', 'myapp.lib2')\n" +"msgno = 1\n" +"while True:\n" +" # Just randomly select some loggers and levels and log away\n" +" level = random.choice(levels)\n" +" logger = logging.getLogger(random.choice(logger_names))\n" +" logger.log(level, 'Message no. %5d' % msgno)\n" +" msgno += 1\n" +" delay = random.random() * 2 + 0.5\n" +" time.sleep(delay)" +msgstr "" +"# sender.py\n" +"import json\n" +"import logging\n" +"import logging.handlers\n" +"import time\n" +"import random\n" +"\n" +"import pynng\n" +"\n" +"DEFAULT_ADDR = \"tcp://localhost:13232\"\n" +"\n" +"class NNGSocketHandler(logging.handlers.QueueHandler):\n" +"\n" +" def __init__(self, uri):\n" +" socket = pynng.Pub0(dial=uri, send_timeout=500)\n" +" super().__init__(socket)\n" +"\n" +" def enqueue(self, record):\n" +" # Send the record as UTF-8 encoded JSON\n" +" d = dict(record.__dict__)\n" +" data = json.dumps(d)\n" +" self.queue.send(data.encode('utf-8'))\n" +"\n" +" def close(self):\n" +" self.queue.close()\n" +"\n" +"logging.getLogger('pynng').propagate = False\n" +"handler = NNGSocketHandler(DEFAULT_ADDR)\n" +"# 确保进程 ID 在输出内容中\n" +"logging.basicConfig(level=logging.DEBUG,\n" +" handlers=[logging.StreamHandler(), handler],\n" +" format='%(levelname)-8s %(name)10s %(process)6s %(message)s')\n" +"levels = (logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR,\n" +" logging.CRITICAL)\n" +"logger_names = ('myapp', 'myapp.lib1', 'myapp.lib2')\n" +"msgno = 1\n" +"while True:\n" +" # 随机地选择日志记录器和层级并记录日志\n" +" level = random.choice(levels)\n" +" logger = logging.getLogger(random.choice(logger_names))\n" +" logger.log(level, 'Message no. %5d' % msgno)\n" +" msgno += 1\n" +" delay = random.random() * 2 + 0.5\n" +" time.sleep(delay)" + +#: ../../howto/logging-cookbook.rst:2060 +msgid "" +"You can run the above two snippets in separate command shells. If we run the" +" listener in one shell and run the sender in two separate shells, we should " +"see something like the following. In the first sender shell:" +msgstr "" +"你可以在不同的命令行 shell 中运行上面两个代码片段。如果我们在一个 shell 中运行监听器并在两个不同的 shell " +"中运行发送器,我们将看到如下的结果。在第一个发送器 shell 中:" + +#: ../../howto/logging-cookbook.rst:2064 +msgid "" +"$ python sender.py\n" +"DEBUG myapp 613 Message no. 1\n" +"WARNING myapp.lib2 613 Message no. 2\n" +"CRITICAL myapp.lib2 613 Message no. 3\n" +"WARNING myapp.lib2 613 Message no. 4\n" +"CRITICAL myapp.lib1 613 Message no. 5\n" +"DEBUG myapp 613 Message no. 6\n" +"CRITICAL myapp.lib1 613 Message no. 7\n" +"INFO myapp.lib1 613 Message no. 8\n" +"(and so on)" +msgstr "" +"$ python sender.py\n" +"DEBUG myapp 613 Message no. 1\n" +"WARNING myapp.lib2 613 Message no. 2\n" +"CRITICAL myapp.lib2 613 Message no. 3\n" +"WARNING myapp.lib2 613 Message no. 4\n" +"CRITICAL myapp.lib1 613 Message no. 5\n" +"DEBUG myapp 613 Message no. 6\n" +"CRITICAL myapp.lib1 613 Message no. 7\n" +"INFO myapp.lib1 613 Message no. 8\n" +"(下略)" + +#: ../../howto/logging-cookbook.rst:2077 +msgid "In the second sender shell:" +msgstr "在第二个发送器 shell 中:" + +#: ../../howto/logging-cookbook.rst:2079 +msgid "" +"$ python sender.py\n" +"INFO myapp.lib2 657 Message no. 1\n" +"CRITICAL myapp.lib2 657 Message no. 2\n" +"CRITICAL myapp 657 Message no. 3\n" +"CRITICAL myapp.lib1 657 Message no. 4\n" +"INFO myapp.lib1 657 Message no. 5\n" +"WARNING myapp.lib2 657 Message no. 6\n" +"CRITICAL myapp 657 Message no. 7\n" +"DEBUG myapp.lib1 657 Message no. 8\n" +"(and so on)" +msgstr "" +"$ python sender.py\n" +"INFO myapp.lib2 657 Message no. 1\n" +"CRITICAL myapp.lib2 657 Message no. 2\n" +"CRITICAL myapp 657 Message no. 3\n" +"CRITICAL myapp.lib1 657 Message no. 4\n" +"INFO myapp.lib1 657 Message no. 5\n" +"WARNING myapp.lib2 657 Message no. 6\n" +"CRITICAL myapp 657 Message no. 7\n" +"DEBUG myapp.lib1 657 Message no. 8\n" +"(下略)" + +#: ../../howto/logging-cookbook.rst:2092 +msgid "In the listener shell:" +msgstr "在监听器 shell 中:" + +#: ../../howto/logging-cookbook.rst:2094 +msgid "" +"$ python listener.py\n" +"Press Ctrl-C to stop.\n" +"DEBUG myapp 613 Message no. 1\n" +"WARNING myapp.lib2 613 Message no. 2\n" +"INFO myapp.lib2 657 Message no. 1\n" +"CRITICAL myapp.lib2 613 Message no. 3\n" +"CRITICAL myapp.lib2 657 Message no. 2\n" +"CRITICAL myapp 657 Message no. 3\n" +"WARNING myapp.lib2 613 Message no. 4\n" +"CRITICAL myapp.lib1 613 Message no. 5\n" +"CRITICAL myapp.lib1 657 Message no. 4\n" +"INFO myapp.lib1 657 Message no. 5\n" +"DEBUG myapp 613 Message no. 6\n" +"WARNING myapp.lib2 657 Message no. 6\n" +"CRITICAL myapp 657 Message no. 7\n" +"CRITICAL myapp.lib1 613 Message no. 7\n" +"INFO myapp.lib1 613 Message no. 8\n" +"DEBUG myapp.lib1 657 Message no. 8\n" +"(and so on)" +msgstr "" +"$ python listener.py\n" +"Press Ctrl-C to stop.\n" +"DEBUG myapp 613 Message no. 1\n" +"WARNING myapp.lib2 613 Message no. 2\n" +"INFO myapp.lib2 657 Message no. 1\n" +"CRITICAL myapp.lib2 613 Message no. 3\n" +"CRITICAL myapp.lib2 657 Message no. 2\n" +"CRITICAL myapp 657 Message no. 3\n" +"WARNING myapp.lib2 613 Message no. 4\n" +"CRITICAL myapp.lib1 613 Message no. 5\n" +"CRITICAL myapp.lib1 657 Message no. 4\n" +"INFO myapp.lib1 657 Message no. 5\n" +"DEBUG myapp 613 Message no. 6\n" +"WARNING myapp.lib2 657 Message no. 6\n" +"CRITICAL myapp 657 Message no. 7\n" +"CRITICAL myapp.lib1 613 Message no. 7\n" +"INFO myapp.lib1 613 Message no. 8\n" +"DEBUG myapp.lib1 657 Message no. 8\n" +"(下略)" + +#: ../../howto/logging-cookbook.rst:2116 +msgid "" +"As you can see, the logging from the two sender processes is interleaved in " +"the listener's output." +msgstr "如你所见,来自两个发送器进程的日志记录会在监听器的输出中交错出现。" + +#: ../../howto/logging-cookbook.rst:2121 +msgid "An example dictionary-based configuration" +msgstr "基于字典进行日志配置的示例" + +#: ../../howto/logging-cookbook.rst:2123 +msgid "" +"Below is an example of a logging configuration dictionary - it's taken from " +"the `documentation on the Django project " +"`_. This dictionary is passed to :func:`~config.dictConfig` to put " +"the configuration into effect::" +msgstr "" +"以下是日志配置字典的一个示例 —— 它取自 Django 项目的 `文档 " +"`_。 此字典将被传给 :func:`~config.dictConfig` 以使配置生效::" + +#: ../../howto/logging-cookbook.rst:2127 +msgid "" +"LOGGING = {\n" +" 'version': 1,\n" +" 'disable_existing_loggers': False,\n" +" 'formatters': {\n" +" 'verbose': {\n" +" 'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',\n" +" 'style': '{',\n" +" },\n" +" 'simple': {\n" +" 'format': '{levelname} {message}',\n" +" 'style': '{',\n" +" },\n" +" },\n" +" 'filters': {\n" +" 'special': {\n" +" '()': 'project.logging.SpecialFilter',\n" +" 'foo': 'bar',\n" +" },\n" +" },\n" +" 'handlers': {\n" +" 'console': {\n" +" 'level': 'INFO',\n" +" 'class': 'logging.StreamHandler',\n" +" 'formatter': 'simple',\n" +" },\n" +" 'mail_admins': {\n" +" 'level': 'ERROR',\n" +" 'class': 'django.utils.log.AdminEmailHandler',\n" +" 'filters': ['special']\n" +" }\n" +" },\n" +" 'loggers': {\n" +" 'django': {\n" +" 'handlers': ['console'],\n" +" 'propagate': True,\n" +" },\n" +" 'django.request': {\n" +" 'handlers': ['mail_admins'],\n" +" 'level': 'ERROR',\n" +" 'propagate': False,\n" +" },\n" +" 'myproject.custom': {\n" +" 'handlers': ['console', 'mail_admins'],\n" +" 'level': 'INFO',\n" +" 'filters': ['special']\n" +" }\n" +" }\n" +"}" +msgstr "" +"LOGGING = {\n" +" 'version': 1,\n" +" 'disable_existing_loggers': False,\n" +" 'formatters': {\n" +" 'verbose': {\n" +" 'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',\n" +" 'style': '{',\n" +" },\n" +" 'simple': {\n" +" 'format': '{levelname} {message}',\n" +" 'style': '{',\n" +" },\n" +" },\n" +" 'filters': {\n" +" 'special': {\n" +" '()': 'project.logging.SpecialFilter',\n" +" 'foo': 'bar',\n" +" },\n" +" },\n" +" 'handlers': {\n" +" 'console': {\n" +" 'level': 'INFO',\n" +" 'class': 'logging.StreamHandler',\n" +" 'formatter': 'simple',\n" +" },\n" +" 'mail_admins': {\n" +" 'level': 'ERROR',\n" +" 'class': 'django.utils.log.AdminEmailHandler',\n" +" 'filters': ['special']\n" +" }\n" +" },\n" +" 'loggers': {\n" +" 'django': {\n" +" 'handlers': ['console'],\n" +" 'propagate': True,\n" +" },\n" +" 'django.request': {\n" +" 'handlers': ['mail_admins'],\n" +" 'level': 'ERROR',\n" +" 'propagate': False,\n" +" },\n" +" 'myproject.custom': {\n" +" 'handlers': ['console', 'mail_admins'],\n" +" 'level': 'INFO',\n" +" 'filters': ['special']\n" +" }\n" +" }\n" +"}" + +#: ../../howto/logging-cookbook.rst:2176 +msgid "" +"For more information about this configuration, you can see the `relevant " +"section " +"`_ of the Django documentation." +msgstr "" +"有关本配置的更多信息,请参阅 Django 文档的 `有关章节 " +"`_ 。" + +#: ../../howto/logging-cookbook.rst:2183 +msgid "Using a rotator and namer to customize log rotation processing" +msgstr "利用 rotator 和 namer 自定义日志轮换操作" + +#: ../../howto/logging-cookbook.rst:2185 +msgid "" +"An example of how you can define a namer and rotator is given in the " +"following runnable script, which shows gzip compression of the log file::" +msgstr "下面的可运行代码给出了你可以怎样定义命名器和轮换器的例子,其中演示了日志文件的 gzip 压缩过程::" + +#: ../../howto/logging-cookbook.rst:2188 +msgid "" +"import gzip\n" +"import logging\n" +"import logging.handlers\n" +"import os\n" +"import shutil\n" +"\n" +"def namer(name):\n" +" return name + \".gz\"\n" +"\n" +"def rotator(source, dest):\n" +" with open(source, 'rb') as f_in:\n" +" with gzip.open(dest, 'wb') as f_out:\n" +" shutil.copyfileobj(f_in, f_out)\n" +" os.remove(source)\n" +"\n" +"\n" +"rh = logging.handlers.RotatingFileHandler('rotated.log', maxBytes=128, backupCount=5)\n" +"rh.rotator = rotator\n" +"rh.namer = namer\n" +"\n" +"root = logging.getLogger()\n" +"root.setLevel(logging.INFO)\n" +"root.addHandler(rh)\n" +"f = logging.Formatter('%(asctime)s %(message)s')\n" +"rh.setFormatter(f)\n" +"for i in range(1000):\n" +" root.info(f'Message no. {i + 1}')" +msgstr "" +"import gzip\n" +"import logging\n" +"import logging.handlers\n" +"import os\n" +"import shutil\n" +"\n" +"def namer(name):\n" +" return name + \".gz\"\n" +"\n" +"def rotator(source, dest):\n" +" with open(source, 'rb') as f_in:\n" +" with gzip.open(dest, 'wb') as f_out:\n" +" shutil.copyfileobj(f_in, f_out)\n" +" os.remove(source)\n" +"\n" +"\n" +"rh = logging.handlers.RotatingFileHandler('rotated.log', maxBytes=128, backupCount=5)\n" +"rh.rotator = rotator\n" +"rh.namer = namer\n" +"\n" +"root = logging.getLogger()\n" +"root.setLevel(logging.INFO)\n" +"root.addHandler(rh)\n" +"f = logging.Formatter('%(asctime)s %(message)s')\n" +"rh.setFormatter(f)\n" +"for i in range(1000):\n" +" root.info(f'Message no. {i + 1}')" + +#: ../../howto/logging-cookbook.rst:2216 +msgid "" +"After running this, you will see six new files, five of which are " +"compressed:" +msgstr "运行此脚本后,你将看到六个新文件,其中五个是已压缩的:" + +#: ../../howto/logging-cookbook.rst:2218 +msgid "" +"$ ls rotated.log*\n" +"rotated.log rotated.log.2.gz rotated.log.4.gz\n" +"rotated.log.1.gz rotated.log.3.gz rotated.log.5.gz\n" +"$ zcat rotated.log.1.gz\n" +"2023-01-20 02:28:17,767 Message no. 996\n" +"2023-01-20 02:28:17,767 Message no. 997\n" +"2023-01-20 02:28:17,767 Message no. 998" +msgstr "" +"$ ls rotated.log*\n" +"rotated.log rotated.log.2.gz rotated.log.4.gz\n" +"rotated.log.1.gz rotated.log.3.gz rotated.log.5.gz\n" +"$ zcat rotated.log.1.gz\n" +"2023-01-20 02:28:17,767 Message no. 996\n" +"2023-01-20 02:28:17,767 Message no. 997\n" +"2023-01-20 02:28:17,767 Message no. 998" + +#: ../../howto/logging-cookbook.rst:2229 +msgid "A more elaborate multiprocessing example" +msgstr "更加详细的多道处理示例" + +#: ../../howto/logging-cookbook.rst:2231 +msgid "" +"The following working example shows how logging can be used with " +"multiprocessing using configuration files. The configurations are fairly " +"simple, but serve to illustrate how more complex ones could be implemented " +"in a real multiprocessing scenario." +msgstr "以下可运行的示例显示了如何利用配置文件在多进程中应用日志。这些配置相当简单,但足以说明如何在真实的多进程场景中实现较为复杂的配置。" + +#: ../../howto/logging-cookbook.rst:2236 +msgid "" +"In the example, the main process spawns a listener process and some worker " +"processes. Each of the main process, the listener and the workers have three" +" separate configurations (the workers all share the same configuration). We " +"can see logging in the main process, how the workers log to a QueueHandler " +"and how the listener implements a QueueListener and a more complex logging " +"configuration, and arranges to dispatch events received via the queue to the" +" handlers specified in the configuration. Note that these configurations are" +" purely illustrative, but you should be able to adapt this example to your " +"own scenario." +msgstr "" +"上述示例中,主进程产生一个侦听器进程和一些工作进程。每个主进程、侦听器进程和工作进程都有三种独立的日志配置(工作进程共享同一套配置)。大家可以看到主进程的日志记录过程、工作线程向" +" QueueHandler 写入日志的过程,以及侦听器实现 QueueListener 和较为复杂的日志配置,如何将由队列接收到的事件分发给配置指定的 " +"handler。请注意,这些配置纯粹用于演示,但应该能调整代码以适用于自己的场景。" + +#: ../../howto/logging-cookbook.rst:2246 +msgid "" +"Here's the script - the docstrings and the comments hopefully explain how it" +" works::" +msgstr "以下是代码——但愿文档字符串和注释能有助于理解其工作原理::" + +#: ../../howto/logging-cookbook.rst:2249 +msgid "" +"import logging\n" +"import logging.config\n" +"import logging.handlers\n" +"from multiprocessing import Process, Queue, Event, current_process\n" +"import os\n" +"import random\n" +"import time\n" +"\n" +"class MyHandler:\n" +" \"\"\"\n" +" A simple handler for logging events. It runs in the listener process and\n" +" dispatches events to loggers based on the name in the received record,\n" +" which then get dispatched, by the logging system, to the handlers\n" +" configured for those loggers.\n" +" \"\"\"\n" +"\n" +" def handle(self, record):\n" +" if record.name == \"root\":\n" +" logger = logging.getLogger()\n" +" else:\n" +" logger = logging.getLogger(record.name)\n" +"\n" +" if logger.isEnabledFor(record.levelno):\n" +" # The process name is transformed just to show that it's the listener\n" +" # doing the logging to files and console\n" +" record.processName = '%s (for %s)' % (current_process().name, record.processName)\n" +" logger.handle(record)\n" +"\n" +"def listener_process(q, stop_event, config):\n" +" \"\"\"\n" +" This could be done in the main process, but is just done in a separate\n" +" process for illustrative purposes.\n" +"\n" +" This initialises logging according to the specified configuration,\n" +" starts the listener and waits for the main process to signal completion\n" +" via the event. The listener is then stopped, and the process exits.\n" +" \"\"\"\n" +" logging.config.dictConfig(config)\n" +" listener = logging.handlers.QueueListener(q, MyHandler())\n" +" listener.start()\n" +" if os.name == 'posix':\n" +" # On POSIX, the setup logger will have been configured in the\n" +" # parent process, but should have been disabled following the\n" +" # dictConfig call.\n" +" # On Windows, since fork isn't used, the setup logger won't\n" +" # exist in the child, so it would be created and the message\n" +" # would appear - hence the \"if posix\" clause.\n" +" logger = logging.getLogger('setup')\n" +" logger.critical('Should not appear, because of disabled logger ...')\n" +" stop_event.wait()\n" +" listener.stop()\n" +"\n" +"def worker_process(config):\n" +" \"\"\"\n" +" A number of these are spawned for the purpose of illustration. In\n" +" practice, they could be a heterogeneous bunch of processes rather than\n" +" ones which are identical to each other.\n" +"\n" +" This initialises logging according to the specified configuration,\n" +" and logs a hundred messages with random levels to randomly selected\n" +" loggers.\n" +"\n" +" A small sleep is added to allow other processes a chance to run. This\n" +" is not strictly needed, but it mixes the output from the different\n" +" processes a bit more than if it's left out.\n" +" \"\"\"\n" +" logging.config.dictConfig(config)\n" +" levels = [logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR,\n" +" logging.CRITICAL]\n" +" loggers = ['foo', 'foo.bar', 'foo.bar.baz',\n" +" 'spam', 'spam.ham', 'spam.ham.eggs']\n" +" if os.name == 'posix':\n" +" # On POSIX, the setup logger will have been configured in the\n" +" # parent process, but should have been disabled following the\n" +" # dictConfig call.\n" +" # On Windows, since fork isn't used, the setup logger won't\n" +" # exist in the child, so it would be created and the message\n" +" # would appear - hence the \"if posix\" clause.\n" +" logger = logging.getLogger('setup')\n" +" logger.critical('Should not appear, because of disabled logger ...')\n" +" for i in range(100):\n" +" lvl = random.choice(levels)\n" +" logger = logging.getLogger(random.choice(loggers))\n" +" logger.log(lvl, 'Message no. %d', i)\n" +" time.sleep(0.01)\n" +"\n" +"def main():\n" +" q = Queue()\n" +" # The main process gets a simple configuration which prints to the console.\n" +" config_initial = {\n" +" 'version': 1,\n" +" 'handlers': {\n" +" 'console': {\n" +" 'class': 'logging.StreamHandler',\n" +" 'level': 'INFO'\n" +" }\n" +" },\n" +" 'root': {\n" +" 'handlers': ['console'],\n" +" 'level': 'DEBUG'\n" +" }\n" +" }\n" +" # The worker process configuration is just a QueueHandler attached to the\n" +" # root logger, which allows all messages to be sent to the queue.\n" +" # We disable existing loggers to disable the \"setup\" logger used in the\n" +" # parent process. This is needed on POSIX because the logger will\n" +" # be there in the child following a fork().\n" +" config_worker = {\n" +" 'version': 1,\n" +" 'disable_existing_loggers': True,\n" +" 'handlers': {\n" +" 'queue': {\n" +" 'class': 'logging.handlers.QueueHandler',\n" +" 'queue': q\n" +" }\n" +" },\n" +" 'root': {\n" +" 'handlers': ['queue'],\n" +" 'level': 'DEBUG'\n" +" }\n" +" }\n" +" # The listener process configuration shows that the full flexibility of\n" +" # logging configuration is available to dispatch events to handlers however\n" +" # you want.\n" +" # We disable existing loggers to disable the \"setup\" logger used in the\n" +" # parent process. This is needed on POSIX because the logger will\n" +" # be there in the child following a fork().\n" +" config_listener = {\n" +" 'version': 1,\n" +" 'disable_existing_loggers': True,\n" +" 'formatters': {\n" +" 'detailed': {\n" +" 'class': 'logging.Formatter',\n" +" 'format': '%(asctime)s %(name)-15s %(levelname)-8s %(processName)-10s %(message)s'\n" +" },\n" +" 'simple': {\n" +" 'class': 'logging.Formatter',\n" +" 'format': '%(name)-15s %(levelname)-8s %(processName)-10s %(message)s'\n" +" }\n" +" },\n" +" 'handlers': {\n" +" 'console': {\n" +" 'class': 'logging.StreamHandler',\n" +" 'formatter': 'simple',\n" +" 'level': 'INFO'\n" +" },\n" +" 'file': {\n" +" 'class': 'logging.FileHandler',\n" +" 'filename': 'mplog.log',\n" +" 'mode': 'w',\n" +" 'formatter': 'detailed'\n" +" },\n" +" 'foofile': {\n" +" 'class': 'logging.FileHandler',\n" +" 'filename': 'mplog-foo.log',\n" +" 'mode': 'w',\n" +" 'formatter': 'detailed'\n" +" },\n" +" 'errors': {\n" +" 'class': 'logging.FileHandler',\n" +" 'filename': 'mplog-errors.log',\n" +" 'mode': 'w',\n" +" 'formatter': 'detailed',\n" +" 'level': 'ERROR'\n" +" }\n" +" },\n" +" 'loggers': {\n" +" 'foo': {\n" +" 'handlers': ['foofile']\n" +" }\n" +" },\n" +" 'root': {\n" +" 'handlers': ['console', 'file', 'errors'],\n" +" 'level': 'DEBUG'\n" +" }\n" +" }\n" +" # Log some initial events, just to show that logging in the parent works\n" +" # normally.\n" +" logging.config.dictConfig(config_initial)\n" +" logger = logging.getLogger('setup')\n" +" logger.info('About to create workers ...')\n" +" workers = []\n" +" for i in range(5):\n" +" wp = Process(target=worker_process, name='worker %d' % (i + 1),\n" +" args=(config_worker,))\n" +" workers.append(wp)\n" +" wp.start()\n" +" logger.info('Started worker: %s', wp.name)\n" +" logger.info('About to create listener ...')\n" +" stop_event = Event()\n" +" lp = Process(target=listener_process, name='listener',\n" +" args=(q, stop_event, config_listener))\n" +" lp.start()\n" +" logger.info('Started listener')\n" +" # We now hang around for the workers to finish their work.\n" +" for wp in workers:\n" +" wp.join()\n" +" # Workers all done, listening can now stop.\n" +" # Logging in the parent still works normally.\n" +" logger.info('Telling listener to stop ...')\n" +" stop_event.set()\n" +" lp.join()\n" +" logger.info('All done.')\n" +"\n" +"if __name__ == '__main__':\n" +" main()" +msgstr "" +"import logging\n" +"import logging.config\n" +"import logging.handlers\n" +"from multiprocessing import Process, Queue, Event, current_process\n" +"import os\n" +"import random\n" +"import time\n" +"\n" +"class MyHandler:\n" +" \"\"\"\n" +" A simple handler for logging events. It runs in the listener process and\n" +" dispatches events to loggers based on the name in the received record,\n" +" which then get dispatched, by the logging system, to the handlers\n" +" configured for those loggers.\n" +" \"\"\"\n" +"\n" +" def handle(self, record):\n" +" if record.name == \"root\":\n" +" logger = logging.getLogger()\n" +" else:\n" +" logger = logging.getLogger(record.name)\n" +"\n" +" if logger.isEnabledFor(record.levelno):\n" +" # 进程名称经过变换以演示是由监听器来执行\n" +" # 记录日志到文件和控制台\n" +" record.processName = '%s (for %s)' % (current_process().name, record.processName)\n" +" logger.handle(record)\n" +"\n" +"def listener_process(q, stop_event, config):\n" +" \"\"\"\n" +" This could be done in the main process, but is just done in a separate\n" +" process for illustrative purposes.\n" +"\n" +" This initialises logging according to the specified configuration,\n" +" starts the listener and waits for the main process to signal completion\n" +" via the event. The listener is then stopped, and the process exits.\n" +" \"\"\"\n" +" logging.config.dictConfig(config)\n" +" listener = logging.handlers.QueueListener(q, MyHandler())\n" +" listener.start()\n" +" if os.name == 'posix':\n" +" # 在 POSIX 系统上,setup 日志记录器将会在\n" +" # 父进程中完成配置,但应当在 dictConfig 调用\n" +" # 之后即已被禁用。\n" +" # 在 Windows 上,由于不会使用 fork,setup 日志记录器\n" +" # 将不会在子进程中退出,因此它将被创建并且显示消息\n" +" # —— 对应 \"if posix\" 子句。\n" +" logger = logging.getLogger('setup')\n" +" logger.critical('Should not appear, because of disabled logger ...')\n" +" stop_event.wait()\n" +" listener.stop()\n" +"\n" +"def worker_process(config):\n" +" \"\"\"\n" +" A number of these are spawned for the purpose of illustration. In\n" +" practice, they could be a heterogeneous bunch of processes rather than\n" +" ones which are identical to each other.\n" +"\n" +" This initialises logging according to the specified configuration,\n" +" and logs a hundred messages with random levels to randomly selected\n" +" loggers.\n" +"\n" +" A small sleep is added to allow other processes a chance to run. This\n" +" is not strictly needed, but it mixes the output from the different\n" +" processes a bit more than if it's left out.\n" +" \"\"\"\n" +" logging.config.dictConfig(config)\n" +" levels = [logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR,\n" +" logging.CRITICAL]\n" +" loggers = ['foo', 'foo.bar', 'foo.bar.baz',\n" +" 'spam', 'spam.ham', 'spam.ham.eggs']\n" +" if os.name == 'posix':\n" +" # 在 POSIX 系统上,setup 日志记录器将会在\n" +" # 父进程中完成配置,但应当在 dictConfig 调用\n" +" # 之后已被禁用。\n" +" # 在 Windows 上,由于不会使用 fork,setup 日志记录器\n" +" # 将不会在子进程中退出,因此它将被创建并且显示消息\n" +" # —— 对应 \"if posix\" 子句。\n" +" logger = logging.getLogger('setup')\n" +" logger.critical('Should not appear, because of disabled logger ...')\n" +" for i in range(100):\n" +" lvl = random.choice(levels)\n" +" logger = logging.getLogger(random.choice(loggers))\n" +" logger.log(lvl, 'Message no. %d', i)\n" +" time.sleep(0.01)\n" +"\n" +"def main():\n" +" q = Queue()\n" +" # 主进程将获得一个打印到控制台的简单配置。\n" +" config_initial = {\n" +" 'version': 1,\n" +" 'handlers': {\n" +" 'console': {\n" +" 'class': 'logging.StreamHandler',\n" +" 'level': 'INFO'\n" +" }\n" +" },\n" +" 'root': {\n" +" 'handlers': ['console'],\n" +" 'level': 'DEBUG'\n" +" }\n" +" }\n" +" # 工作进程配置就是一个附加到根日志记录器的 QueueHandler,\n" +" # 它允许所有消息被发送至队列。\n" +" # 我们禁用现有的日志记录器以禁用在父进程中使用的 \"setup\"\n" +" # 日志记录器。这在 POSIX 中是必需的因为日志记录器将会在\n" +" # fork() 之后出现在子进程中。\n" +" config_worker = {\n" +" 'version': 1,\n" +" 'disable_existing_loggers': True,\n" +" 'handlers': {\n" +" 'queue': {\n" +" 'class': 'logging.handlers.QueueHandler',\n" +" 'queue': q\n" +" }\n" +" },\n" +" 'root': {\n" +" 'handlers': ['queue'],\n" +" 'level': 'DEBUG'\n" +" }\n" +" }\n" +" # 监听器进程配置显示可以使用日志记录配置的\n" +" # 完整适应性以便以你希望的方式将事件分发给\n" +" # 处理器。\n" +" # 我们禁用现有的日志记录器以禁用在父进程中使用的\n" +" # \"setup\" 日志记录器。这在 POSIX 中是必需的因为\n" +" # 日志记录器将会在 fork() 之后出现在子进程中。\n" +" config_listener = {\n" +" 'version': 1,\n" +" 'disable_existing_loggers': True,\n" +" 'formatters': {\n" +" 'detailed': {\n" +" 'class': 'logging.Formatter',\n" +" 'format': '%(asctime)s %(name)-15s %(levelname)-8s %(processName)-10s %(message)s'\n" +" },\n" +" 'simple': {\n" +" 'class': 'logging.Formatter',\n" +" 'format': '%(name)-15s %(levelname)-8s %(processName)-10s %(message)s'\n" +" }\n" +" },\n" +" 'handlers': {\n" +" 'console': {\n" +" 'class': 'logging.StreamHandler',\n" +" 'formatter': 'simple',\n" +" 'level': 'INFO'\n" +" },\n" +" 'file': {\n" +" 'class': 'logging.FileHandler',\n" +" 'filename': 'mplog.log',\n" +" 'mode': 'w',\n" +" 'formatter': 'detailed'\n" +" },\n" +" 'foofile': {\n" +" 'class': 'logging.FileHandler',\n" +" 'filename': 'mplog-foo.log',\n" +" 'mode': 'w',\n" +" 'formatter': 'detailed'\n" +" },\n" +" 'errors': {\n" +" 'class': 'logging.FileHandler',\n" +" 'filename': 'mplog-errors.log',\n" +" 'mode': 'w',\n" +" 'formatter': 'detailed',\n" +" 'level': 'ERROR'\n" +" }\n" +" },\n" +" 'loggers': {\n" +" 'foo': {\n" +" 'handlers': ['foofile']\n" +" }\n" +" },\n" +" 'root': {\n" +" 'handlers': ['console', 'file', 'errors'],\n" +" 'level': 'DEBUG'\n" +" }\n" +" }\n" +" # 记录一些初始事件,以便显示父进程中的日志记录\n" +" # 工作正常。\n" +" logging.config.dictConfig(config_initial)\n" +" logger = logging.getLogger('setup')\n" +" logger.info('About to create workers ...')\n" +" workers = []\n" +" for i in range(5):\n" +" wp = Process(target=worker_process, name='worker %d' % (i + 1),\n" +" args=(config_worker,))\n" +" workers.append(wp)\n" +" wp.start()\n" +" logger.info('Started worker: %s', wp.name)\n" +" logger.info('About to create listener ...')\n" +" stop_event = Event()\n" +" lp = Process(target=listener_process, name='listener',\n" +" args=(q, stop_event, config_listener))\n" +" lp.start()\n" +" logger.info('Started listener')\n" +" # 我们现在要等待工作进程完成其工作。\n" +" for wp in workers:\n" +" wp.join()\n" +" # 工作进程全部结束,现在可以停止监听。\n" +" # 父进程中的日志记录仍然正常进行。\n" +" logger.info('Telling listener to stop ...')\n" +" stop_event.set()\n" +" lp.join()\n" +" logger.info('All done.')\n" +"\n" +"if __name__ == '__main__':\n" +" main()" + +#: ../../howto/logging-cookbook.rst:2458 +msgid "Inserting a BOM into messages sent to a SysLogHandler" +msgstr "在发送给 SysLogHandler 的信息中插入一个 BOM。" + +#: ../../howto/logging-cookbook.rst:2460 +msgid "" +":rfc:`5424` requires that a Unicode message be sent to a syslog daemon as a " +"set of bytes which have the following structure: an optional pure-ASCII " +"component, followed by a UTF-8 Byte Order Mark (BOM), followed by Unicode " +"encoded using UTF-8. (See the :rfc:`relevant section of the specification " +"<5424#section-6>`.)" +msgstr "" +":rfc:`5424` 要求,Unicode 信息应采用字节流形式发送到系统 syslog 守护程序,字节流结构如下所示:可选的纯 ASCII " +"部分,后跟 UTF-8 字节序标记(BOM),然后是采用 UTF-8 编码的 Unicode。(参见 " +":rfc:`相关规范<5424#section-6>`。)" + +#: ../../howto/logging-cookbook.rst:2466 +msgid "" +"In Python 3.1, code was added to :class:`~logging.handlers.SysLogHandler` to" +" insert a BOM into the message, but unfortunately, it was implemented " +"incorrectly, with the BOM appearing at the beginning of the message and " +"hence not allowing any pure-ASCII component to appear before it." +msgstr "" +"在 Python 3.1 的 :class:`~logging.handlers.SysLogHandler` 中,已加入了在日志信息中插入 BOM " +"的代码,但不幸的是,代码并不正确,BOM 出现在了日志信息的开头,因此在它之前就不允许出现纯 ASCII 内容了。" + +#: ../../howto/logging-cookbook.rst:2472 +msgid "" +"As this behaviour is broken, the incorrect BOM insertion code is being " +"removed from Python 3.2.4 and later. However, it is not being replaced, and " +"if you want to produce :rfc:`5424`-compliant messages which include a BOM, " +"an optional pure-ASCII sequence before it and arbitrary Unicode after it, " +"encoded using UTF-8, then you need to do the following:" +msgstr "" +"由于无法正常工作,Python 3.2.4 以上版本已删除了出错的插入 BOM 代码。但已有版本的代码不会被替换,若要生成与 :rfc:`5424` " +"兼容的日志信息,包括一个 BOM 符,前面有可选的纯 ASCII 字节流,后面为 UTF-8 编码的任意 Unicode,那么 需要执行以下操作:" + +#: ../../howto/logging-cookbook.rst:2478 +msgid "" +"Attach a :class:`~logging.Formatter` instance to your " +":class:`~logging.handlers.SysLogHandler` instance, with a format string such" +" as::" +msgstr "" +"为 :class:`~logging.handlers.SysLogHandler` 实例串上一个 " +":class:`~logging.Formatter` 实例,格式串可如下::" + +#: ../../howto/logging-cookbook.rst:2482 +msgid "'ASCII section\\ufeffUnicode section'" +msgstr "'ASCII section\\ufeffUnicode section'" + +#: ../../howto/logging-cookbook.rst:2484 +msgid "" +"The Unicode code point U+FEFF, when encoded using UTF-8, will be encoded as " +"a UTF-8 BOM -- the byte-string ``b'\\xef\\xbb\\xbf'``." +msgstr "用 UTF-8 编码时,Unicode 码位 U+FEFF 将会编码为 UTF-8 BOM——字节串 ``b'\\xef\\xbb\\xbf'``。" + +#: ../../howto/logging-cookbook.rst:2487 +msgid "" +"Replace the ASCII section with whatever placeholders you like, but make sure" +" that the data that appears in there after substitution is always ASCII " +"(that way, it will remain unchanged after UTF-8 encoding)." +msgstr "用任意占位符替换 ASCII 部分,但要保证替换之后的数据一定是 ASCII 码(这样在 UTF-8 编码后就会维持不变)。" + +#: ../../howto/logging-cookbook.rst:2491 +msgid "" +"Replace the Unicode section with whatever placeholders you like; if the data" +" which appears there after substitution contains characters outside the " +"ASCII range, that's fine -- it will be encoded using UTF-8." +msgstr "用任意占位符替换 Unicode 部分;如果替换后的数据包含超出 ASCII 范围的字符,没问题——他们将用 UTF-8 进行编码。" + +#: ../../howto/logging-cookbook.rst:2495 +msgid "" +"The formatted message *will* be encoded using UTF-8 encoding by " +"``SysLogHandler``. If you follow the above rules, you should be able to " +"produce :rfc:`5424`-compliant messages. If you don't, logging may not " +"complain, but your messages will not be RFC 5424-compliant, and your syslog " +"daemon may complain." +msgstr "" +"``SysLogHandler`` *将* 对格式化后的日志信息进行 UTF-8 编码。如果遵循上述规则,应能生成符合 :rfc:`5424` " +"的日志信息。否则,日志记录过程可能不会有什么反馈,但日志信息将不与 RFC 5424 兼容,syslog 守护程序可能会有出错反应。" + +#: ../../howto/logging-cookbook.rst:2502 +msgid "Implementing structured logging" +msgstr "结构化日志的实现代码" + +#: ../../howto/logging-cookbook.rst:2504 +msgid "" +"Although most logging messages are intended for reading by humans, and thus " +"not readily machine-parseable, there might be circumstances where you want " +"to output messages in a structured format which *is* capable of being parsed" +" by a program (without needing complex regular expressions to parse the log " +"message). This is straightforward to achieve using the logging package. " +"There are a number of ways in which this could be achieved, but the " +"following is a simple approach which uses JSON to serialise the event in a " +"machine-parseable manner::" +msgstr "" +"大多数日志信息是供人阅读的,所以机器解析起来并不容易,但某些时候可能希望以结构化的格式输出,以 *能够* " +"被程序解析(无需用到复杂的正则表达式)。这可以直接用 logging 包实现。实现方式有很多,以下是一种比较简单的方案,利用 JSON " +"以机器可解析的方式对事件信息进行序列化::" + +#: ../../howto/logging-cookbook.rst:2512 +msgid "" +"import json\n" +"import logging\n" +"\n" +"class StructuredMessage:\n" +" def __init__(self, message, /, **kwargs):\n" +" self.message = message\n" +" self.kwargs = kwargs\n" +"\n" +" def __str__(self):\n" +" return '%s >>> %s' % (self.message, json.dumps(self.kwargs))\n" +"\n" +"_ = StructuredMessage # optional, to improve readability\n" +"\n" +"logging.basicConfig(level=logging.INFO, format='%(message)s')\n" +"logging.info(_('message 1', foo='bar', bar='baz', num=123, fnum=123.456))" +msgstr "" +"import json\n" +"import logging\n" +"\n" +"class StructuredMessage:\n" +" def __init__(self, message, /, **kwargs):\n" +" self.message = message\n" +" self.kwargs = kwargs\n" +"\n" +" def __str__(self):\n" +" return '%s >>> %s' % (self.message, json.dumps(self.kwargs))\n" +"\n" +"_ = StructuredMessage # 可选项,用于提升可读性\n" +"\n" +"logging.basicConfig(level=logging.INFO, format='%(message)s')\n" +"logging.info(_('message 1', foo='bar', bar='baz', num=123, fnum=123.456))" + +#: ../../howto/logging-cookbook.rst:2528 +msgid "If the above script is run, it prints:" +msgstr "上述代码运行后的结果是:" + +#: ../../howto/logging-cookbook.rst:2530 +msgid "message 1 >>> {\"fnum\": 123.456, \"num\": 123, \"bar\": \"baz\", \"foo\": \"bar\"}" +msgstr "message 1 >>> {\"fnum\": 123.456, \"num\": 123, \"bar\": \"baz\", \"foo\": \"bar\"}" + +#: ../../howto/logging-cookbook.rst:2534 ../../howto/logging-cookbook.rst:2576 +msgid "" +"Note that the order of items might be different according to the version of " +"Python used." +msgstr "请注意,根据 Python 版本的不同,各项数据的输出顺序可能会不一样。" + +#: ../../howto/logging-cookbook.rst:2537 +msgid "" +"If you need more specialised processing, you can use a custom JSON encoder, " +"as in the following complete example::" +msgstr "若需进行更为定制化的处理,可以使用自定义 JSON 编码对象,下面给出完整示例::" + +#: ../../howto/logging-cookbook.rst:2540 +msgid "" +"import json\n" +"import logging\n" +"\n" +"\n" +"class Encoder(json.JSONEncoder):\n" +" def default(self, o):\n" +" if isinstance(o, set):\n" +" return tuple(o)\n" +" elif isinstance(o, str):\n" +" return o.encode('unicode_escape').decode('ascii')\n" +" return super().default(o)\n" +"\n" +"class StructuredMessage:\n" +" def __init__(self, message, /, **kwargs):\n" +" self.message = message\n" +" self.kwargs = kwargs\n" +"\n" +" def __str__(self):\n" +" s = Encoder().encode(self.kwargs)\n" +" return '%s >>> %s' % (self.message, s)\n" +"\n" +"_ = StructuredMessage # optional, to improve readability\n" +"\n" +"def main():\n" +" logging.basicConfig(level=logging.INFO, format='%(message)s')\n" +" logging.info(_('message 1', set_value={1, 2, 3}, snowman='\\u2603'))\n" +"\n" +"if __name__ == '__main__':\n" +" main()" +msgstr "" +"import json\n" +"import logging\n" +"\n" +"\n" +"class Encoder(json.JSONEncoder):\n" +" def default(self, o):\n" +" if isinstance(o, set):\n" +" return tuple(o)\n" +" elif isinstance(o, str):\n" +" return o.encode('unicode_escape').decode('ascii')\n" +" return super().default(o)\n" +"\n" +"class StructuredMessage:\n" +" def __init__(self, message, /, **kwargs):\n" +" self.message = message\n" +" self.kwargs = kwargs\n" +"\n" +" def __str__(self):\n" +" s = Encoder().encode(self.kwargs)\n" +" return '%s >>> %s' % (self.message, s)\n" +"\n" +"_ = StructuredMessage # 可选项,用于提升可读性\n" +"\n" +"def main():\n" +" logging.basicConfig(level=logging.INFO, format='%(message)s')\n" +" logging.info(_('message 1', set_value={1, 2, 3}, snowman='\\u2603'))\n" +"\n" +"if __name__ == '__main__':\n" +" main()" + +#: ../../howto/logging-cookbook.rst:2570 +msgid "When the above script is run, it prints:" +msgstr "上述代码运行后的结果是:" + +#: ../../howto/logging-cookbook.rst:2572 +msgid "message 1 >>> {\"snowman\": \"\\u2603\", \"set_value\": [1, 2, 3]}" +msgstr "message 1 >>> {\"snowman\": \"\\u2603\", \"set_value\": [1, 2, 3]}" + +#: ../../howto/logging-cookbook.rst:2585 +msgid "Customizing handlers with :func:`dictConfig`" +msgstr "利用 :func:`dictConfig` 自定义 handler" + +#: ../../howto/logging-cookbook.rst:2587 +msgid "" +"There are times when you want to customize logging handlers in particular " +"ways, and if you use :func:`dictConfig` you may be able to do this without " +"subclassing. As an example, consider that you may want to set the ownership " +"of a log file. On POSIX, this is easily done using :func:`shutil.chown`, but" +" the file handlers in the stdlib don't offer built-in support. You can " +"customize handler creation using a plain function such as::" +msgstr "" +"有时需要以特定方式自定义日志 handler,如果采用 :func:`dictConfig`,可能无需生成子类就可以做到。比如要设置日志文件的所有权。在" +" POSIX 上,可以利用 :func:`shutil.chown` 轻松完成,但 stdlib 中的文件 handler " +"并不提供内置支持。于是可以用普通函数自定义 handler 的创建,例如::" + +#: ../../howto/logging-cookbook.rst:2594 +msgid "" +"def owned_file_handler(filename, mode='a', encoding=None, owner=None):\n" +" if owner:\n" +" if not os.path.exists(filename):\n" +" open(filename, 'a').close()\n" +" shutil.chown(filename, *owner)\n" +" return logging.FileHandler(filename, mode, encoding)" +msgstr "" +"def owned_file_handler(filename, mode='a', encoding=None, owner=None):\n" +" if owner:\n" +" if not os.path.exists(filename):\n" +" open(filename, 'a').close()\n" +" shutil.chown(filename, *owner)\n" +" return logging.FileHandler(filename, mode, encoding)" + +#: ../../howto/logging-cookbook.rst:2601 +msgid "" +"You can then specify, in a logging configuration passed to " +":func:`dictConfig`, that a logging handler be created by calling this " +"function::" +msgstr "然后,你可以在传给 :func:`dictConfig` 的日志配置中指定通过调用此函数来创建日志处理程序::" + +#: ../../howto/logging-cookbook.rst:2604 +msgid "" +"LOGGING = {\n" +" 'version': 1,\n" +" 'disable_existing_loggers': False,\n" +" 'formatters': {\n" +" 'default': {\n" +" 'format': '%(asctime)s %(levelname)s %(name)s %(message)s'\n" +" },\n" +" },\n" +" 'handlers': {\n" +" 'file':{\n" +" # The values below are popped from this dictionary and\n" +" # used to create the handler, set the handler's level and\n" +" # its formatter.\n" +" '()': owned_file_handler,\n" +" 'level':'DEBUG',\n" +" 'formatter': 'default',\n" +" # The values below are passed to the handler creator callable\n" +" # as keyword arguments.\n" +" 'owner': ['pulse', 'pulse'],\n" +" 'filename': 'chowntest.log',\n" +" 'mode': 'w',\n" +" 'encoding': 'utf-8',\n" +" },\n" +" },\n" +" 'root': {\n" +" 'handlers': ['file'],\n" +" 'level': 'DEBUG',\n" +" },\n" +"}" +msgstr "" +"LOGGING = {\n" +" 'version': 1,\n" +" 'disable_existing_loggers': False,\n" +" 'formatters': {\n" +" 'default': {\n" +" 'format': '%(asctime)s %(levelname)s %(name)s %(message)s'\n" +" },\n" +" },\n" +" 'handlers': {\n" +" 'file':{\n" +" # 下面的值将从该字典中弹出并被用来\n" +" # 创建处理器,设置处理器的层级及其\n" +" # 格式化器:\n" +" '()': owned_file_handler,\n" +" 'level':'DEBUG',\n" +" 'formatter': 'default',\n" +" # 下面的值将以关键字参数形式传给\n" +" # 处理器调用方的可调用对象。\n" +" 'owner': ['pulse', 'pulse'],\n" +" 'filename': 'chowntest.log',\n" +" 'mode': 'w',\n" +" 'encoding': 'utf-8',\n" +" },\n" +" },\n" +" 'root': {\n" +" 'handlers': ['file'],\n" +" 'level': 'DEBUG',\n" +" },\n" +"}" + +#: ../../howto/logging-cookbook.rst:2634 +msgid "" +"In this example I am setting the ownership using the ``pulse`` user and " +"group, just for the purposes of illustration. Putting it together into a " +"working script, ``chowntest.py``::" +msgstr "出于演示目的,以下示例设置用户和用户组为 ``pulse``。代码置于一个可运行的脚本文件 ``chowntest.py`` 中::" + +#: ../../howto/logging-cookbook.rst:2638 +msgid "" +"import logging, logging.config, os, shutil\n" +"\n" +"def owned_file_handler(filename, mode='a', encoding=None, owner=None):\n" +" if owner:\n" +" if not os.path.exists(filename):\n" +" open(filename, 'a').close()\n" +" shutil.chown(filename, *owner)\n" +" return logging.FileHandler(filename, mode, encoding)\n" +"\n" +"LOGGING = {\n" +" 'version': 1,\n" +" 'disable_existing_loggers': False,\n" +" 'formatters': {\n" +" 'default': {\n" +" 'format': '%(asctime)s %(levelname)s %(name)s %(message)s'\n" +" },\n" +" },\n" +" 'handlers': {\n" +" 'file':{\n" +" # The values below are popped from this dictionary and\n" +" # used to create the handler, set the handler's level and\n" +" # its formatter.\n" +" '()': owned_file_handler,\n" +" 'level':'DEBUG',\n" +" 'formatter': 'default',\n" +" # The values below are passed to the handler creator callable\n" +" # as keyword arguments.\n" +" 'owner': ['pulse', 'pulse'],\n" +" 'filename': 'chowntest.log',\n" +" 'mode': 'w',\n" +" 'encoding': 'utf-8',\n" +" },\n" +" },\n" +" 'root': {\n" +" 'handlers': ['file'],\n" +" 'level': 'DEBUG',\n" +" },\n" +"}\n" +"\n" +"logging.config.dictConfig(LOGGING)\n" +"logger = logging.getLogger('mylogger')\n" +"logger.debug('A debug message')" +msgstr "" +"import logging, logging.config, os, shutil\n" +"\n" +"def owned_file_handler(filename, mode='a', encoding=None, owner=None):\n" +" if owner:\n" +" if not os.path.exists(filename):\n" +" open(filename, 'a').close()\n" +" shutil.chown(filename, *owner)\n" +" return logging.FileHandler(filename, mode, encoding)\n" +"\n" +"LOGGING = {\n" +" 'version': 1,\n" +" 'disable_existing_loggers': False,\n" +" 'formatters': {\n" +" 'default': {\n" +" 'format': '%(asctime)s %(levelname)s %(name)s %(message)s'\n" +" },\n" +" },\n" +" 'handlers': {\n" +" 'file':{\n" +" # 下面的值将从此字典中被弹出并被用来\n" +" # 创建处理器、设置处理器的层级\n" +" # 及其格式化器。\n" +" '()': owned_file_handler,\n" +" 'level':'DEBUG',\n" +" 'formatter': 'default',\n" +" # 下面的值将以关键字参数形式传给处理器的\n" +" # 创建方可调用对象。\n" +" 'owner': ['pulse', 'pulse'],\n" +" 'filename': 'chowntest.log',\n" +" 'mode': 'w',\n" +" 'encoding': 'utf-8',\n" +" },\n" +" },\n" +" 'root': {\n" +" 'handlers': ['file'],\n" +" 'level': 'DEBUG',\n" +" },\n" +"}\n" +"\n" +"logging.config.dictConfig(LOGGING)\n" +"logger = logging.getLogger('mylogger')\n" +"logger.debug('A debug message')" + +#: ../../howto/logging-cookbook.rst:2681 +msgid "To run this, you will probably need to run as ``root``:" +msgstr "可能需要 ``root`` 权限才能运行:" + +#: ../../howto/logging-cookbook.rst:2683 +msgid "" +"$ sudo python3.3 chowntest.py\n" +"$ cat chowntest.log\n" +"2013-11-05 09:34:51,128 DEBUG mylogger A debug message\n" +"$ ls -l chowntest.log\n" +"-rw-r--r-- 1 pulse pulse 55 2013-11-05 09:34 chowntest.log" +msgstr "" +"$ sudo python3.3 chowntest.py\n" +"$ cat chowntest.log\n" +"2013-11-05 09:34:51,128 DEBUG mylogger A debug message\n" +"$ ls -l chowntest.log\n" +"-rw-r--r-- 1 pulse pulse 55 2013-11-05 09:34 chowntest.log" + +#: ../../howto/logging-cookbook.rst:2691 +msgid "" +"Note that this example uses Python 3.3 because that's where " +":func:`shutil.chown` makes an appearance. This approach should work with any" +" Python version that supports :func:`dictConfig` - namely, Python 2.7, 3.2 " +"or later. With pre-3.3 versions, you would need to implement the actual " +"ownership change using e.g. :func:`os.chown`." +msgstr "" +"请注意此示例用的是 Python 3.3,因为 :func:`shutil.chown` 是从此版本开始出现的。此方式应当适用于任何支持 " +":func:`dictConfig` 的 Python 版本 —— 例如 Python 2.7, 3.2 或更新的版本。对于 3.3 " +"之前的版本,你应当使用 :func:`os.chown` 之类的函数来实现实际的所有权修改。" + +#: ../../howto/logging-cookbook.rst:2697 +msgid "" +"In practice, the handler-creating function may be in a utility module " +"somewhere in your project. Instead of the line in the configuration::" +msgstr "实际应用中,handler 的创建函数可能位于项目的工具模块中。以下配置::" + +#: ../../howto/logging-cookbook.rst:2700 +msgid "'()': owned_file_handler," +msgstr "'()': owned_file_handler," + +#: ../../howto/logging-cookbook.rst:2702 +msgid "you could use e.g.::" +msgstr "应使用::" + +#: ../../howto/logging-cookbook.rst:2704 +msgid "'()': 'ext://project.util.owned_file_handler'," +msgstr "'()': 'ext://project.util.owned_file_handler'," + +#: ../../howto/logging-cookbook.rst:2706 +msgid "" +"where ``project.util`` can be replaced with the actual name of the package " +"where the function resides. In the above working script, using " +"``'ext://__main__.owned_file_handler'`` should work. Here, the actual " +"callable is resolved by :func:`dictConfig` from the ``ext://`` " +"specification." +msgstr "" +"这里的 ``project.util`` 可以换成函数所在包的实际名称。在上述的可用脚本中,应该可以使用 " +"``'ext://__main__.owned_file_handler'``。在这里,实际的可调用对象是由 :func:`dictConfig` 从 " +"``ext://`` 说明中解析出来的。" + +#: ../../howto/logging-cookbook.rst:2711 +msgid "" +"This example hopefully also points the way to how you could implement other " +"types of file change - e.g. setting specific POSIX permission bits - in the " +"same way, using :func:`os.chmod`." +msgstr "上述示例还指明了其他的文件修改类型的实现方案 —— 比如同样利用 :func:`os.chmod` 设置 POSIX 访问权限位。" + +#: ../../howto/logging-cookbook.rst:2715 +msgid "" +"Of course, the approach could also be extended to types of handler other " +"than a :class:`~logging.FileHandler` - for example, one of the rotating file" +" handlers, or a different type of handler altogether." +msgstr "" +"当然,以上做法也可以扩展到 :class:`~logging.FileHandler` 之外的其他类型的 handler ——比如某个轮换文件 " +"handler,或类型完全不同的其他 handler。" + +#: ../../howto/logging-cookbook.rst:2725 +msgid "Using particular formatting styles throughout your application" +msgstr "生效于整个应用程序的格式化样式" + +#: ../../howto/logging-cookbook.rst:2727 +msgid "" +"In Python 3.2, the :class:`~logging.Formatter` gained a ``style`` keyword " +"parameter which, while defaulting to ``%`` for backward compatibility, " +"allowed the specification of ``{`` or ``$`` to support the formatting " +"approaches supported by :meth:`str.format` and :class:`string.Template`. " +"Note that this governs the formatting of logging messages for final output " +"to logs, and is completely orthogonal to how an individual logging message " +"is constructed." +msgstr "" +"在 Python 3.2 中,:class:`~logging.Formatter` 增加了一个 ``style`` 关键字形参,它默认为 ``%`` " +"以便向下兼容,但是允许采用 ``{`` 或 ``$`` 来支持 :meth:`str.format` 和 " +":class:`string.Template` 所支持的格式化方式。 " +"请注意此形参控制着用于最终输出到日志的日志消息格式,并且与单独日志消息的构造方式完全无关。" + +#: ../../howto/logging-cookbook.rst:2734 +msgid "" +"Logging calls (:meth:`~Logger.debug`, :meth:`~Logger.info` etc.) only take " +"positional parameters for the actual logging message itself, with keyword " +"parameters used only for determining options for how to handle the logging " +"call (e.g. the ``exc_info`` keyword parameter to indicate that traceback " +"information should be logged, or the ``extra`` keyword parameter to indicate" +" additional contextual information to be added to the log). So you cannot " +"directly make logging calls using :meth:`str.format` or " +":class:`string.Template` syntax, because internally the logging package uses" +" %-formatting to merge the format string and the variable arguments. There " +"would be no changing this while preserving backward compatibility, since all" +" logging calls which are out there in existing code will be using %-format " +"strings." +msgstr "" +"日志调用 (:meth:`~Logger.debug`, :meth:`~Logger.info` 等) " +"只接受包含实际日志消息自身的位置参数,而关键字参数仅用于确定如何处理日志调用的选项 (例如 ``exc_info`` " +"关键字参数表示应将回溯信息记入日志,而 ``extra`` 关键字参数则指定要添加到日志的额外上下文信息)。所以你不能直接使用 " +":meth:`str.format` 或 :class:`string.Template` 语法来直接执行日志调用,因为 logging 包在内部是使用" +" % 格式符来合并格式字符串和可变参数的。这一点不应被改变以保持向下兼容性,因为现有代码中所有的日志调用都将使用 % 格式化字符串。" + +#: ../../howto/logging-cookbook.rst:2746 +msgid "" +"There have been suggestions to associate format styles with specific " +"loggers, but that approach also runs into backward compatibility problems " +"because any existing code could be using a given logger name and using " +"%-formatting." +msgstr "有人建议将格式化样式与特定的日志对象进行关联,但其实也会遇到向下兼容的问题,因为已有代码可能用到了某日志对象并采用了 %-f 格式串。" + +#: ../../howto/logging-cookbook.rst:2750 +msgid "" +"For logging to work interoperably between any third-party libraries and your" +" code, decisions about formatting need to be made at the level of the " +"individual logging call. This opens up a couple of ways in which alternative" +" formatting styles can be accommodated." +msgstr "为了让第三方库和自编代码都能够交互使用日志功能,需要决定在单次日志记录调用级别采用什么格式。于是就出现了其他几种格式化样式方案。" + +#: ../../howto/logging-cookbook.rst:2757 +msgid "Using LogRecord factories" +msgstr "LogRecord 工厂的用法" + +#: ../../howto/logging-cookbook.rst:2759 +msgid "" +"In Python 3.2, along with the :class:`~logging.Formatter` changes mentioned " +"above, the logging package gained the ability to allow users to set their " +"own :class:`LogRecord` subclasses, using the :func:`setLogRecordFactory` " +"function. You can use this to set your own subclass of :class:`LogRecord`, " +"which does the Right Thing by overriding the :meth:`~LogRecord.getMessage` " +"method. The base class implementation of this method is where the ``msg % " +"args`` formatting happens, and where you can substitute your alternate " +"formatting; however, you should be careful to support all formatting styles " +"and allow %-formatting as the default, to ensure interoperability with other" +" code. Care should also be taken to call ``str(self.msg)``, just as the base" +" implementation does." +msgstr "" +"在 Python 3.2 中,伴随着 :class:`~logging.Formatter` 的上述变化,logging 包增加了允许用户使用 " +":func:`setLogRecordFactory` 函数来。设置自己的 :class:`LogRecord` 子类的功能。 " +"你可以使用此功能来设置自己的 :class:`LogRecord` 子类,它会通过重写 :meth:`~LogRecord.getMessage` " +"方法来完成适当的操作。``msg % args`` " +"格式化是在此方法的基类实现中进行的,你可以在那里用你自己的格式化操作来替换;但是,你应当注意要支持全部的格式化样式并允许将 %-formatting " +"作为默认样式,以确保与其他代码进行配合。还应当注意调用 ``str(self.msg)``,正如基类实现所做的一样。" + +#: ../../howto/logging-cookbook.rst:2770 +msgid "" +"Refer to the reference documentation on :func:`setLogRecordFactory` and " +":class:`LogRecord` for more information." +msgstr "更多信息请参阅 :func:`setLogRecordFactory` 和 :class:`LogRecord` 的参考文档。" + +#: ../../howto/logging-cookbook.rst:2775 +msgid "Using custom message objects" +msgstr "自定义信息对象的使用" + +#: ../../howto/logging-cookbook.rst:2777 +msgid "" +"There is another, perhaps simpler way that you can use {}- and $- formatting" +" to construct your individual log messages. You may recall (from " +":ref:`arbitrary-object-messages`) that when logging you can use an arbitrary" +" object as a message format string, and that the logging package will call " +":func:`str` on that object to get the actual format string. Consider the " +"following two classes::" +msgstr "" +"另一种方案可能更为简单,可以利用 {}- 和 $- 格式构建自己的日志消息。大家或许还记得 (来自 :ref:`arbitrary-object-" +"messages`),可以用任意对象作为日志信息的格式串,日志包将调用该对象上 :func:`str` 获取实际的格式串。 看下以下两个类::" + +#: ../../howto/logging-cookbook.rst:2802 +msgid "" +"Either of these can be used in place of a format string, to allow {}- or " +"$-formatting to be used to build the actual \"message\" part which appears " +"in the formatted log output in place of “%(message)s” or “{message}” or " +"“$message”. If you find it a little unwieldy to use the class names whenever" +" you want to log something, you can make it more palatable if you use an " +"alias such as ``M`` or ``_`` for the message (or perhaps ``__``, if you are " +"using ``_`` for localization)." +msgstr "" +"以上两个类均都可用于替代格式串,以便用 {}- 或 $-formatting 构建实际的“日志信息”部分,此部分将出现在格式化后的日志输出中,替换 " +"%(message)s、“{message}”或“$message”。每次要写入日志时都使用类名,如果觉得使用不便,可以采用 ``M`` 或 ``_``" +" 之类的别名 (如果将 ``_`` 用于本地化操作,则可用 ``__``)。" + +#: ../../howto/logging-cookbook.rst:2810 +msgid "" +"Examples of this approach are given below. Firstly, formatting with " +":meth:`str.format`::" +msgstr "下面给出示例。首先用 :meth:`str.format` 进行格式化::" + +#: ../../howto/logging-cookbook.rst:2813 +msgid "" +">>> __ = BraceMessage\n" +">>> print(__('Message with {0} {1}', 2, 'placeholders'))\n" +"Message with 2 placeholders\n" +">>> class Point: pass\n" +"...\n" +">>> p = Point()\n" +">>> p.x = 0.5\n" +">>> p.y = 0.5\n" +">>> print(__('Message with coordinates: ({point.x:.2f}, {point.y:.2f})', point=p))\n" +"Message with coordinates: (0.50, 0.50)" +msgstr "" +">>> __ = BraceMessage\n" +">>> print(__('Message with {0} {1}', 2, 'placeholders'))\n" +"Message with 2 placeholders\n" +">>> class Point: pass\n" +"...\n" +">>> p = Point()\n" +">>> p.x = 0.5\n" +">>> p.y = 0.5\n" +">>> print(__('Message with coordinates: ({point.x:.2f}, {point.y:.2f})', point=p))\n" +"Message with coordinates: (0.50, 0.50)" + +#: ../../howto/logging-cookbook.rst:2824 +msgid "Secondly, formatting with :class:`string.Template`::" +msgstr "然后,用 :class:`string.Template` 格式化::" + +#: ../../howto/logging-cookbook.rst:2826 +msgid "" +">>> __ = DollarMessage\n" +">>> print(__('Message with $num $what', num=2, what='placeholders'))\n" +"Message with 2 placeholders\n" +">>>" +msgstr "" +">>> __ = DollarMessage\n" +">>> print(__('Message with $num $what', num=2, what='placeholders'))\n" +"Message with 2 placeholders\n" +">>>" + +#: ../../howto/logging-cookbook.rst:2831 +msgid "" +"One thing to note is that you pay no significant performance penalty with " +"this approach: the actual formatting happens not when you make the logging " +"call, but when (and if) the logged message is actually about to be output to" +" a log by a handler. So the only slightly unusual thing which might trip you" +" up is that the parentheses go around the format string and the arguments, " +"not just the format string. That’s because the __ notation is just syntax " +"sugar for a constructor call to one of the :samp:`{XXX}Message` classes " +"shown above." +msgstr "" +"需要注意的是使用这种方式不会对性能造成明显影响:实际的格式化工作不是在日志记录调用时发生的,而是在(如果)处理器即将把日志消息输出到日志时发生的。 " +"因此,唯一可能令人困惑的不寻常之处在于包裹在格式字符串和参数外面的圆括号,而不仅仅是格式字符串。这是因为 __ 符号只是对上面显示的 " +":samp:`{XXX}Message` 类的构造器的调用的语法糖。" + +#: ../../howto/logging-cookbook.rst:2845 +msgid "Configuring filters with :func:`dictConfig`" +msgstr "利用 :func:`dictConfig` 定义过滤器" + +#: ../../howto/logging-cookbook.rst:2847 +msgid "" +"You *can* configure filters using :func:`~logging.config.dictConfig`, though" +" it might not be obvious at first glance how to do it (hence this recipe). " +"Since :class:`~logging.Filter` is the only filter class included in the " +"standard library, and it is unlikely to cater to many requirements (it's " +"only there as a base class), you will typically need to define your own " +":class:`~logging.Filter` subclass with an overridden " +":meth:`~logging.Filter.filter` method. To do this, specify the ``()`` key in" +" the configuration dictionary for the filter, specifying a callable which " +"will be used to create the filter (a class is the most obvious, but you can " +"provide any callable which returns a :class:`~logging.Filter` instance). " +"Here is a complete example::" +msgstr "" +"用 :func:`~logging.config.dictConfig` *可以* 对日志过滤器进行设置,尽管乍一看做法并不明显(所以才需要本秘籍)。 " +"由于 :class:`~logging.Filter` 是标准库中唯一的日志过滤器类,不太可能满足众多的要求(它只是作为基类存在),通常需要定义自己的 " +":class:`~logging.Filter` 子类,并重写 :meth:`~logging.Filter.filter` " +"方法。为此,请在过滤器的配置字典中设置 ``()`` " +"键,指定要用于创建过滤器的可调用对象(最明显可用的就是给出一个类,但也可以提供任何一个可调用对象,只要能返回 " +":class:`~logging.Filter` 实例即可)。下面是一个完整的例子::" + +#: ../../howto/logging-cookbook.rst:2858 +msgid "" +"import logging\n" +"import logging.config\n" +"import sys\n" +"\n" +"class MyFilter(logging.Filter):\n" +" def __init__(self, param=None):\n" +" self.param = param\n" +"\n" +" def filter(self, record):\n" +" if self.param is None:\n" +" allow = True\n" +" else:\n" +" allow = self.param not in record.msg\n" +" if allow:\n" +" record.msg = 'changed: ' + record.msg\n" +" return allow\n" +"\n" +"LOGGING = {\n" +" 'version': 1,\n" +" 'filters': {\n" +" 'myfilter': {\n" +" '()': MyFilter,\n" +" 'param': 'noshow',\n" +" }\n" +" },\n" +" 'handlers': {\n" +" 'console': {\n" +" 'class': 'logging.StreamHandler',\n" +" 'filters': ['myfilter']\n" +" }\n" +" },\n" +" 'root': {\n" +" 'level': 'DEBUG',\n" +" 'handlers': ['console']\n" +" },\n" +"}\n" +"\n" +"if __name__ == '__main__':\n" +" logging.config.dictConfig(LOGGING)\n" +" logging.debug('hello')\n" +" logging.debug('hello - noshow')" +msgstr "" +"import logging\n" +"import logging.config\n" +"import sys\n" +"\n" +"class MyFilter(logging.Filter):\n" +" def __init__(self, param=None):\n" +" self.param = param\n" +"\n" +" def filter(self, record):\n" +" if self.param is None:\n" +" allow = True\n" +" else:\n" +" allow = self.param not in record.msg\n" +" if allow:\n" +" record.msg = 'changed: ' + record.msg\n" +" return allow\n" +"\n" +"LOGGING = {\n" +" 'version': 1,\n" +" 'filters': {\n" +" 'myfilter': {\n" +" '()': MyFilter,\n" +" 'param': 'noshow',\n" +" }\n" +" },\n" +" 'handlers': {\n" +" 'console': {\n" +" 'class': 'logging.StreamHandler',\n" +" 'filters': ['myfilter']\n" +" }\n" +" },\n" +" 'root': {\n" +" 'level': 'DEBUG',\n" +" 'handlers': ['console']\n" +" },\n" +"}\n" +"\n" +"if __name__ == '__main__':\n" +" logging.config.dictConfig(LOGGING)\n" +" logging.debug('hello')\n" +" logging.debug('hello - noshow')" + +#: ../../howto/logging-cookbook.rst:2900 +msgid "" +"This example shows how you can pass configuration data to the callable which" +" constructs the instance, in the form of keyword parameters. When run, the " +"above script will print:" +msgstr "以上示例展示了将配置数据传给构造实例的可调用对象,形式是关键字参数。运行后将会输出:" + +#: ../../howto/logging-cookbook.rst:2904 +msgid "changed: hello" +msgstr "changed: hello" + +#: ../../howto/logging-cookbook.rst:2908 +msgid "which shows that the filter is working as configured." +msgstr "这说明过滤器按照配置的参数生效了。" + +#: ../../howto/logging-cookbook.rst:2910 +msgid "A couple of extra points to note:" +msgstr "需要额外注意的地方:" + +#: ../../howto/logging-cookbook.rst:2912 +msgid "" +"If you can't refer to the callable directly in the configuration (e.g. if it" +" lives in a different module, and you can't import it directly where the " +"configuration dictionary is), you can use the form ``ext://...`` as " +"described in :ref:`logging-config-dict-externalobj`. For example, you could " +"have used the text ``'ext://__main__.MyFilter'`` instead of ``MyFilter`` in " +"the above example." +msgstr "" +"如果在配置中无法直接引用可调用对象(比如位于不同的模块中,并且不能在配置字典所在的位置直接导入),则可以采用 ``ext://...`` 的形式,正如 " +":ref:`logging-config-dict-externalobj` 所述。例如,在上述示例中可以使用文本 " +"``'ext://__main__.MyFilter'`` 而不是 ``MyFilter`` 对象。" + +#: ../../howto/logging-cookbook.rst:2919 +msgid "" +"As well as for filters, this technique can also be used to configure custom " +"handlers and formatters. See :ref:`logging-config-dict-userdef` for more " +"information on how logging supports using user-defined objects in its " +"configuration, and see the other cookbook recipe :ref:`custom-handlers` " +"above." +msgstr "" +"与过滤器一样,上述技术还可用于配置自定义 handler 和格式化对象。有关如何在日志配置中使用用户自定义对象的更多信息,请参阅 " +":ref:`logging-config-dict-userdef`,以及上述 :ref:`custom-handlers` 的其他指南。" + +#: ../../howto/logging-cookbook.rst:2928 +msgid "Customized exception formatting" +msgstr "异常信息的自定义格式化" + +#: ../../howto/logging-cookbook.rst:2930 +msgid "" +"There might be times when you want to do customized exception formatting - " +"for argument's sake, let's say you want exactly one line per logged event, " +"even when exception information is present. You can do this with a custom " +"formatter class, as shown in the following example::" +msgstr "" +"有时可能需要设置自定义的异常信息格式——考虑到会用到参数,假定要让每条日志事件只占一行,即便存在异常信息也一样。这可以用自定义格式化类来实现,如下所示::" + +#: ../../howto/logging-cookbook.rst:2935 +msgid "" +"import logging\n" +"\n" +"class OneLineExceptionFormatter(logging.Formatter):\n" +" def formatException(self, exc_info):\n" +" \"\"\"\n" +" Format an exception so that it prints on a single line.\n" +" \"\"\"\n" +" result = super().formatException(exc_info)\n" +" return repr(result) # or format into one line however you want to\n" +"\n" +" def format(self, record):\n" +" s = super().format(record)\n" +" if record.exc_text:\n" +" s = s.replace('\\n', '') + '|'\n" +" return s\n" +"\n" +"def configure_logging():\n" +" fh = logging.FileHandler('output.txt', 'w')\n" +" f = OneLineExceptionFormatter('%(asctime)s|%(levelname)s|%(message)s|',\n" +" '%d/%m/%Y %H:%M:%S')\n" +" fh.setFormatter(f)\n" +" root = logging.getLogger()\n" +" root.setLevel(logging.DEBUG)\n" +" root.addHandler(fh)\n" +"\n" +"def main():\n" +" configure_logging()\n" +" logging.info('Sample message')\n" +" try:\n" +" x = 1 / 0\n" +" except ZeroDivisionError as e:\n" +" logging.exception('ZeroDivisionError: %s', e)\n" +"\n" +"if __name__ == '__main__':\n" +" main()" +msgstr "" +"import logging\n" +"\n" +"class OneLineExceptionFormatter(logging.Formatter):\n" +" def formatException(self, exc_info):\n" +" \"\"\"\n" +" Format an exception so that it prints on a single line.\n" +" \"\"\"\n" +" result = super().formatException(exc_info)\n" +" return repr(result) # 或格式化为任何你想要的单行内容\n" +"\n" +" def format(self, record):\n" +" s = super().format(record)\n" +" if record.exc_text:\n" +" s = s.replace('\\n', '') + '|'\n" +" return s\n" +"\n" +"def configure_logging():\n" +" fh = logging.FileHandler('output.txt', 'w')\n" +" f = OneLineExceptionFormatter('%(asctime)s|%(levelname)s|%(message)s|',\n" +" '%d/%m/%Y %H:%M:%S')\n" +" fh.setFormatter(f)\n" +" root = logging.getLogger()\n" +" root.setLevel(logging.DEBUG)\n" +" root.addHandler(fh)\n" +"\n" +"def main():\n" +" configure_logging()\n" +" logging.info('Sample message')\n" +" try:\n" +" x = 1 / 0\n" +" except ZeroDivisionError as e:\n" +" logging.exception('ZeroDivisionError: %s', e)\n" +"\n" +"if __name__ == '__main__':\n" +" main()" + +#: ../../howto/logging-cookbook.rst:2971 +msgid "When run, this produces a file with exactly two lines:" +msgstr "运行后将会生成只有两行信息的文件:" + +#: ../../howto/logging-cookbook.rst:2973 +msgid "" +"28/01/2015 07:21:23|INFO|Sample message|\n" +"28/01/2015 07:21:23|ERROR|ZeroDivisionError: division by zero|'Traceback (most recent call last):\\n File \"logtest7.py\", line 30, in main\\n x = 1 / 0\\nZeroDivisionError: division by zero'|" +msgstr "" +"28/01/2015 07:21:23|INFO|Sample message|\n" +"28/01/2015 07:21:23|ERROR|ZeroDivisionError: division by zero|'Traceback (most recent call last):\\n File \"logtest7.py\", line 30, in main\\n x = 1 / 0\\nZeroDivisionError: division by zero'|" + +#: ../../howto/logging-cookbook.rst:2978 +msgid "" +"While the above treatment is simplistic, it points the way to how exception " +"information can be formatted to your liking. The :mod:`traceback` module may" +" be helpful for more specialized needs." +msgstr "虽然上述处理方式很简单,但也给出了根据喜好对异常信息进行格式化输出的方案。或许 :mod:`traceback` 模块能满足更专门的需求。" + +#: ../../howto/logging-cookbook.rst:2985 +msgid "Speaking logging messages" +msgstr "语音播报日志信息" + +#: ../../howto/logging-cookbook.rst:2987 +msgid "" +"There might be situations when it is desirable to have logging messages " +"rendered in an audible rather than a visible format. This is easy to do if " +"you have text-to-speech (TTS) functionality available in your system, even " +"if it doesn't have a Python binding. Most TTS systems have a command line " +"program you can run, and this can be invoked from a handler using " +":mod:`subprocess`. It's assumed here that TTS command line programs won't " +"expect to interact with users or take a long time to complete, and that the " +"frequency of logged messages will be not so high as to swamp the user with " +"messages, and that it's acceptable to have the messages spoken one at a time" +" rather than concurrently, The example implementation below waits for one " +"message to be spoken before the next is processed, and this might cause " +"other handlers to be kept waiting. Here is a short example showing the " +"approach, which assumes that the ``espeak`` TTS package is available::" +msgstr "" +"有时可能需要以声音的形式呈现日志消息。如果系统自带了文本转语音(TTS)功能,即便没与 Python 关联也很容易做到。大多数 TTS " +"系统都有一个可运行的命令行程序,在 handler 中可以用 :mod:`subprocess` 进行调用。这里假定 TTS " +"命令行程序不会与用户交互,或需要很长时间才会执行完毕,写入日志的信息也不会多到影响用户查看,并且可以接受每次播报一条信息,以下示例实现了等一条信息播完再处理下一条,可能会导致其他" +" handler 的等待。这个简短示例仅供演示,假定 ``espeak`` TTS 包已就绪::" + +#: ../../howto/logging-cookbook.rst:3000 +msgid "" +"import logging\n" +"import subprocess\n" +"import sys\n" +"\n" +"class TTSHandler(logging.Handler):\n" +" def emit(self, record):\n" +" msg = self.format(record)\n" +" # Speak slowly in a female English voice\n" +" cmd = ['espeak', '-s150', '-ven+f3', msg]\n" +" p = subprocess.Popen(cmd, stdout=subprocess.PIPE,\n" +" stderr=subprocess.STDOUT)\n" +" # wait for the program to finish\n" +" p.communicate()\n" +"\n" +"def configure_logging():\n" +" h = TTSHandler()\n" +" root = logging.getLogger()\n" +" root.addHandler(h)\n" +" # the default formatter just returns the message\n" +" root.setLevel(logging.DEBUG)\n" +"\n" +"def main():\n" +" logging.info('Hello')\n" +" logging.debug('Goodbye')\n" +"\n" +"if __name__ == '__main__':\n" +" configure_logging()\n" +" sys.exit(main())" +msgstr "" +"import logging\n" +"import subprocess\n" +"import sys\n" +"\n" +"class TTSHandler(logging.Handler):\n" +" def emit(self, record):\n" +" msg = self.format(record)\n" +" # 以女性的英语语音慢速地说话\n" +" cmd = ['espeak', '-s150', '-ven+f3', msg]\n" +" p = subprocess.Popen(cmd, stdout=subprocess.PIPE,\n" +" stderr=subprocess.STDOUT)\n" +" # 等待程序结束\n" +" p.communicate()\n" +"\n" +"def configure_logging():\n" +" h = TTSHandler()\n" +" root = logging.getLogger()\n" +" root.addHandler(h)\n" +" # 默认格式化器简单地返回消息\n" +" root.setLevel(logging.DEBUG)\n" +"\n" +"def main():\n" +" logging.info('Hello')\n" +" logging.debug('Goodbye')\n" +"\n" +"if __name__ == '__main__':\n" +" configure_logging()\n" +" sys.exit(main())" + +#: ../../howto/logging-cookbook.rst:3029 +msgid "" +"When run, this script should say \"Hello\" and then \"Goodbye\" in a female " +"voice." +msgstr "运行后将会以女声播报“Hello”和“Goodbye”。" + +#: ../../howto/logging-cookbook.rst:3031 +msgid "" +"The above approach can, of course, be adapted to other TTS systems and even " +"other systems altogether which can process messages via external programs " +"run from a command line." +msgstr "当然,上述方案也适用于其他 TTS 系统,甚至可以通过利用命令行运行的外部程序来处理消息。" + +#: ../../howto/logging-cookbook.rst:3039 +msgid "Buffering logging messages and outputting them conditionally" +msgstr "缓冲日志消息并有条件地输出它们" + +#: ../../howto/logging-cookbook.rst:3041 +msgid "" +"There might be situations where you want to log messages in a temporary area" +" and only output them if a certain condition occurs. For example, you may " +"want to start logging debug events in a function, and if the function " +"completes without errors, you don't want to clutter the log with the " +"collected debug information, but if there is an error, you want all the " +"debug information to be output as well as the error." +msgstr "" +"在某些情况下,你可能希望在临时区域中记录日志消息,并且只在发生某种特定的情况下才输出它们。 " +"例如,你可能希望起始在函数中记录调试事件,如果函数执行完成且没有错误,你不希望输出收集的调试信息以避免造成日志混乱,但如果出现错误,那么你希望所有调试以及错误消息被输出。" + +#: ../../howto/logging-cookbook.rst:3048 +msgid "" +"Here is an example which shows how you could do this using a decorator for " +"your functions where you want logging to behave this way. It makes use of " +"the :class:`logging.handlers.MemoryHandler`, which allows buffering of " +"logged events until some condition occurs, at which point the buffered " +"events are ``flushed`` - passed to another handler (the ``target`` handler) " +"for processing. By default, the ``MemoryHandler`` flushed when its buffer " +"gets filled up or an event whose level is greater than or equal to a " +"specified threshold is seen. You can use this recipe with a more specialised" +" subclass of ``MemoryHandler`` if you want custom flushing behavior." +msgstr "" +"下面是一个示例,展示如何在你的日志记录函数上使用装饰器以实现这一功能。该示例使用 " +":class:`logging.handlers.MemoryHandler`,它允许缓冲已记录的事件直到某些条件发生,缓冲的事件才会被刷新 " +"(``flushed``) —— 传递给另一个处理程序 (``target`` handler) " +"进行处理。默认情况下,``MemoryHandler`` 在其缓冲区被填满时被刷新,或者看到一个级别大于或等于指定阈值的事件。 " +"如果想要自定义刷新行为,你可以通过更专业的 ``MemoryHandler`` 子类来使用这个秘诀。" + +#: ../../howto/logging-cookbook.rst:3058 +msgid "" +"The example script has a simple function, ``foo``, which just cycles through" +" all the logging levels, writing to ``sys.stderr`` to say what level it's " +"about to log at, and then actually logging a message at that level. You can " +"pass a parameter to ``foo`` which, if true, will log at ERROR and CRITICAL " +"levels - otherwise, it only logs at DEBUG, INFO and WARNING levels." +msgstr "" +"这个示例脚本有一个简单的函数 ``foo``,它只是在所有的日志级别中循环运行,写到 ``sys.stderr`` " +",说明它要记录在哪个级别上,然后在这个级别上实际记录一个消息。你可以给 ``foo`` 传递一个参数,如果为 true ,它将在 ERROR 和 " +"CRITICAL 级别记录,否则,它只在 DEBUG、INFO 和 WARNING 级别记录。" + +#: ../../howto/logging-cookbook.rst:3064 +msgid "" +"The script just arranges to decorate ``foo`` with a decorator which will do " +"the conditional logging that's required. The decorator takes a logger as a " +"parameter and attaches a memory handler for the duration of the call to the " +"decorated function. The decorator can be additionally parameterised using a " +"target handler, a level at which flushing should occur, and a capacity for " +"the buffer (number of records buffered). These default to a " +":class:`~logging.StreamHandler` which writes to ``sys.stderr``, " +"``logging.ERROR`` and ``100`` respectively." +msgstr "" +"脚本只是使用了一个装饰器来装饰 " +"``foo``,这个装饰器将记录执行所需的条件。装饰器使用一个记录器作为参数,并在调用被装饰的函数期间附加一个内存处理程序。装饰器可以使用目标处理程序、记录级别和缓冲区的容量(缓冲记录的数量)来附加参数。这些参数分别默认为写入" +" ``sys.stderr`` 的 :class:`~logging.StreamHandler`,``logging.ERROR`` 和 " +"``100``。" + +#: ../../howto/logging-cookbook.rst:3072 +msgid "Here's the script::" +msgstr "以下是脚本::" + +#: ../../howto/logging-cookbook.rst:3074 +msgid "" +"import logging\n" +"from logging.handlers import MemoryHandler\n" +"import sys\n" +"\n" +"logger = logging.getLogger(__name__)\n" +"logger.addHandler(logging.NullHandler())\n" +"\n" +"def log_if_errors(logger, target_handler=None, flush_level=None, capacity=None):\n" +" if target_handler is None:\n" +" target_handler = logging.StreamHandler()\n" +" if flush_level is None:\n" +" flush_level = logging.ERROR\n" +" if capacity is None:\n" +" capacity = 100\n" +" handler = MemoryHandler(capacity, flushLevel=flush_level, target=target_handler)\n" +"\n" +" def decorator(fn):\n" +" def wrapper(*args, **kwargs):\n" +" logger.addHandler(handler)\n" +" try:\n" +" return fn(*args, **kwargs)\n" +" except Exception:\n" +" logger.exception('call failed')\n" +" raise\n" +" finally:\n" +" super(MemoryHandler, handler).flush()\n" +" logger.removeHandler(handler)\n" +" return wrapper\n" +"\n" +" return decorator\n" +"\n" +"def write_line(s):\n" +" sys.stderr.write('%s\\n' % s)\n" +"\n" +"def foo(fail=False):\n" +" write_line('about to log at DEBUG ...')\n" +" logger.debug('Actually logged at DEBUG')\n" +" write_line('about to log at INFO ...')\n" +" logger.info('Actually logged at INFO')\n" +" write_line('about to log at WARNING ...')\n" +" logger.warning('Actually logged at WARNING')\n" +" if fail:\n" +" write_line('about to log at ERROR ...')\n" +" logger.error('Actually logged at ERROR')\n" +" write_line('about to log at CRITICAL ...')\n" +" logger.critical('Actually logged at CRITICAL')\n" +" return fail\n" +"\n" +"decorated_foo = log_if_errors(logger)(foo)\n" +"\n" +"if __name__ == '__main__':\n" +" logger.setLevel(logging.DEBUG)\n" +" write_line('Calling undecorated foo with False')\n" +" assert not foo(False)\n" +" write_line('Calling undecorated foo with True')\n" +" assert foo(True)\n" +" write_line('Calling decorated foo with False')\n" +" assert not decorated_foo(False)\n" +" write_line('Calling decorated foo with True')\n" +" assert decorated_foo(True)" +msgstr "" +"import logging\n" +"from logging.handlers import MemoryHandler\n" +"import sys\n" +"\n" +"logger = logging.getLogger(__name__)\n" +"logger.addHandler(logging.NullHandler())\n" +"\n" +"def log_if_errors(logger, target_handler=None, flush_level=None, capacity=None):\n" +" if target_handler is None:\n" +" target_handler = logging.StreamHandler()\n" +" if flush_level is None:\n" +" flush_level = logging.ERROR\n" +" if capacity is None:\n" +" capacity = 100\n" +" handler = MemoryHandler(capacity, flushLevel=flush_level, target=target_handler)\n" +"\n" +" def decorator(fn):\n" +" def wrapper(*args, **kwargs):\n" +" logger.addHandler(handler)\n" +" try:\n" +" return fn(*args, **kwargs)\n" +" except Exception:\n" +" logger.exception('call failed')\n" +" raise\n" +" finally:\n" +" super(MemoryHandler, handler).flush()\n" +" logger.removeHandler(handler)\n" +" return wrapper\n" +"\n" +" return decorator\n" +"\n" +"def write_line(s):\n" +" sys.stderr.write('%s\\n' % s)\n" +"\n" +"def foo(fail=False):\n" +" write_line('about to log at DEBUG ...')\n" +" logger.debug('Actually logged at DEBUG')\n" +" write_line('about to log at INFO ...')\n" +" logger.info('Actually logged at INFO')\n" +" write_line('about to log at WARNING ...')\n" +" logger.warning('Actually logged at WARNING')\n" +" if fail:\n" +" write_line('about to log at ERROR ...')\n" +" logger.error('Actually logged at ERROR')\n" +" write_line('about to log at CRITICAL ...')\n" +" logger.critical('Actually logged at CRITICAL')\n" +" return fail\n" +"\n" +"decorated_foo = log_if_errors(logger)(foo)\n" +"\n" +"if __name__ == '__main__':\n" +" logger.setLevel(logging.DEBUG)\n" +" write_line('Calling undecorated foo with False')\n" +" assert not foo(False)\n" +" write_line('Calling undecorated foo with True')\n" +" assert foo(True)\n" +" write_line('Calling decorated foo with False')\n" +" assert not decorated_foo(False)\n" +" write_line('Calling decorated foo with True')\n" +" assert decorated_foo(True)" + +#: ../../howto/logging-cookbook.rst:3135 +msgid "When this script is run, the following output should be observed:" +msgstr "运行此脚本时,应看到以下输出:" + +#: ../../howto/logging-cookbook.rst:3137 +msgid "" +"Calling undecorated foo with False\n" +"about to log at DEBUG ...\n" +"about to log at INFO ...\n" +"about to log at WARNING ...\n" +"Calling undecorated foo with True\n" +"about to log at DEBUG ...\n" +"about to log at INFO ...\n" +"about to log at WARNING ...\n" +"about to log at ERROR ...\n" +"about to log at CRITICAL ...\n" +"Calling decorated foo with False\n" +"about to log at DEBUG ...\n" +"about to log at INFO ...\n" +"about to log at WARNING ...\n" +"Calling decorated foo with True\n" +"about to log at DEBUG ...\n" +"about to log at INFO ...\n" +"about to log at WARNING ...\n" +"about to log at ERROR ...\n" +"Actually logged at DEBUG\n" +"Actually logged at INFO\n" +"Actually logged at WARNING\n" +"Actually logged at ERROR\n" +"about to log at CRITICAL ...\n" +"Actually logged at CRITICAL" +msgstr "" +"Calling undecorated foo with False\n" +"about to log at DEBUG ...\n" +"about to log at INFO ...\n" +"about to log at WARNING ...\n" +"Calling undecorated foo with True\n" +"about to log at DEBUG ...\n" +"about to log at INFO ...\n" +"about to log at WARNING ...\n" +"about to log at ERROR ...\n" +"about to log at CRITICAL ...\n" +"Calling decorated foo with False\n" +"about to log at DEBUG ...\n" +"about to log at INFO ...\n" +"about to log at WARNING ...\n" +"Calling decorated foo with True\n" +"about to log at DEBUG ...\n" +"about to log at INFO ...\n" +"about to log at WARNING ...\n" +"about to log at ERROR ...\n" +"Actually logged at DEBUG\n" +"Actually logged at INFO\n" +"Actually logged at WARNING\n" +"Actually logged at ERROR\n" +"about to log at CRITICAL ...\n" +"Actually logged at CRITICAL" + +#: ../../howto/logging-cookbook.rst:3165 +msgid "" +"As you can see, actual logging output only occurs when an event is logged " +"whose severity is ERROR or greater, but in that case, any previous events at" +" lower severities are also logged." +msgstr "如你所见,实际日志记录输出仅在消息等级为 ERROR 或更高的事件时发生,但在这种情况下,任何之前较低消息等级的事件还会被记录。" + +#: ../../howto/logging-cookbook.rst:3169 +msgid "You can of course use the conventional means of decoration::" +msgstr "你当然可以使用传统的装饰方法::" + +#: ../../howto/logging-cookbook.rst:3171 +msgid "" +"@log_if_errors(logger)\n" +"def foo(fail=False):\n" +" ..." +msgstr "" +"@log_if_errors(logger)\n" +"def foo(fail=False):\n" +" ..." + +#: ../../howto/logging-cookbook.rst:3179 +msgid "Sending logging messages to email, with buffering" +msgstr "将日志消息发送至电子邮件,附带缓存支持" + +#: ../../howto/logging-cookbook.rst:3181 +msgid "" +"To illustrate how you can send log messages via email, so that a set number " +"of messages are sent per email, you can subclass " +":class:`~logging.handlers.BufferingHandler`. In the following example, " +"which you can adapt to suit your specific needs, a simple test harness is " +"provided which allows you to run the script with command line arguments " +"specifying what you typically need to send things via SMTP. (Run the " +"downloaded script with the ``-h`` argument to see the required and optional " +"arguments.)" +msgstr "" +"为演示如何通过电子邮件发送日志消息,让每封电子邮件发送指定数量的日志消息,你可以子类化 " +":class:`~logging.handlers.BufferingHandler`. " +"对于下面的例子,你可以继续调整以适合你自己的特定需求,它提供了简单的测试代码来允许你附带命令行参数运行该脚本来指定你需要通过 SMTP 发送的内容。 " +"(请附带 ``-h`` 参数运行已下载的脚本来查看必须的和可选的参数。)" + +#: ../../howto/logging-cookbook.rst:3189 +msgid "" +"import logging\n" +"import logging.handlers\n" +"import smtplib\n" +"\n" +"class BufferingSMTPHandler(logging.handlers.BufferingHandler):\n" +" def __init__(self, mailhost, port, username, password, fromaddr, toaddrs,\n" +" subject, capacity):\n" +" logging.handlers.BufferingHandler.__init__(self, capacity)\n" +" self.mailhost = mailhost\n" +" self.mailport = port\n" +" self.username = username\n" +" self.password = password\n" +" self.fromaddr = fromaddr\n" +" if isinstance(toaddrs, str):\n" +" toaddrs = [toaddrs]\n" +" self.toaddrs = toaddrs\n" +" self.subject = subject\n" +" self.setFormatter(logging.Formatter(\"%(asctime)s %(levelname)-5s %(message)s\"))\n" +"\n" +" def flush(self):\n" +" if len(self.buffer) > 0:\n" +" try:\n" +" smtp = smtplib.SMTP(self.mailhost, self.mailport)\n" +" smtp.starttls()\n" +" smtp.login(self.username, self.password)\n" +" msg = \"From: %s\\r\\nTo: %s\\r\\nSubject: %s\\r\\n\\r\\n\" % (self.fromaddr, ','.join(self.toaddrs), self.subject)\n" +" for record in self.buffer:\n" +" s = self.format(record)\n" +" msg = msg + s + \"\\r\\n\"\n" +" smtp.sendmail(self.fromaddr, self.toaddrs, msg)\n" +" smtp.quit()\n" +" except Exception:\n" +" if logging.raiseExceptions:\n" +" raise\n" +" self.buffer = []\n" +"\n" +"if __name__ == '__main__':\n" +" import argparse\n" +"\n" +" ap = argparse.ArgumentParser()\n" +" aa = ap.add_argument\n" +" aa('host', metavar='HOST', help='SMTP server')\n" +" aa('--port', '-p', type=int, default=587, help='SMTP port')\n" +" aa('user', metavar='USER', help='SMTP username')\n" +" aa('password', metavar='PASSWORD', help='SMTP password')\n" +" aa('to', metavar='TO', help='Addressee for emails')\n" +" aa('sender', metavar='SENDER', help='Sender email address')\n" +" aa('--subject', '-s',\n" +" default='Test Logging email from Python logging module (buffering)',\n" +" help='Subject of email')\n" +" options = ap.parse_args()\n" +" logger = logging.getLogger()\n" +" logger.setLevel(logging.DEBUG)\n" +" h = BufferingSMTPHandler(options.host, options.port, options.user,\n" +" options.password, options.sender,\n" +" options.to, options.subject, 10)\n" +" logger.addHandler(h)\n" +" for i in range(102):\n" +" logger.info(\"Info index = %d\", i)\n" +" h.flush()\n" +" h.close()" +msgstr "" +"import logging\n" +"import logging.handlers\n" +"import smtplib\n" +"\n" +"class BufferingSMTPHandler(logging.handlers.BufferingHandler):\n" +" def __init__(self, mailhost, port, username, password, fromaddr, toaddrs,\n" +" subject, capacity):\n" +" logging.handlers.BufferingHandler.__init__(self, capacity)\n" +" self.mailhost = mailhost\n" +" self.mailport = port\n" +" self.username = username\n" +" self.password = password\n" +" self.fromaddr = fromaddr\n" +" if isinstance(toaddrs, str):\n" +" toaddrs = [toaddrs]\n" +" self.toaddrs = toaddrs\n" +" self.subject = subject\n" +" self.setFormatter(logging.Formatter(\"%(asctime)s %(levelname)-5s %(message)s\"))\n" +"\n" +" def flush(self):\n" +" if len(self.buffer) > 0:\n" +" try:\n" +" smtp = smtplib.SMTP(self.mailhost, self.mailport)\n" +" smtp.starttls()\n" +" smtp.login(self.username, self.password)\n" +" msg = \"From: %s\\r\\nTo: %s\\r\\nSubject: %s\\r\\n\\r\\n\" % (self.fromaddr, ','.join(self.toaddrs), self.subject)\n" +" for record in self.buffer:\n" +" s = self.format(record)\n" +" msg = msg + s + \"\\r\\n\"\n" +" smtp.sendmail(self.fromaddr, self.toaddrs, msg)\n" +" smtp.quit()\n" +" except Exception:\n" +" if logging.raiseExceptions:\n" +" raise\n" +" self.buffer = []\n" +"\n" +"if __name__ == '__main__':\n" +" import argparse\n" +"\n" +" ap = argparse.ArgumentParser()\n" +" aa = ap.add_argument\n" +" aa('host', metavar='HOST', help='SMTP server')\n" +" aa('--port', '-p', type=int, default=587, help='SMTP port')\n" +" aa('user', metavar='USER', help='SMTP username')\n" +" aa('password', metavar='PASSWORD', help='SMTP password')\n" +" aa('to', metavar='TO', help='Addressee for emails')\n" +" aa('sender', metavar='SENDER', help='Sender email address')\n" +" aa('--subject', '-s',\n" +" default='Test Logging email from Python logging module (buffering)',\n" +" help='Subject of email')\n" +" options = ap.parse_args()\n" +" logger = logging.getLogger()\n" +" logger.setLevel(logging.DEBUG)\n" +" h = BufferingSMTPHandler(options.host, options.port, options.user,\n" +" options.password, options.sender,\n" +" options.to, options.subject, 10)\n" +" logger.addHandler(h)\n" +" for i in range(102):\n" +" logger.info(\"Info index = %d\", i)\n" +" h.flush()\n" +" h.close()" + +#: ../../howto/logging-cookbook.rst:3253 +msgid "" +"If you run this script and your SMTP server is correctly set up, you should " +"find that it sends eleven emails to the addressee you specify. The first ten" +" emails will each have ten log messages, and the eleventh will have two " +"messages. That makes up 102 messages as specified in the script." +msgstr "" +"如果你运行此脚本并且你的 SMTP 服务器已正确设置,你将发现它会向你指定的地址发出十一封电子邮件。 " +"前十封邮件每封各有十条日志消息,第十一封将有两条消息。如脚本所指定的总计为 102 条消息。" + +#: ../../howto/logging-cookbook.rst:3261 +msgid "Formatting times using UTC (GMT) via configuration" +msgstr "通过配置使用 UTC (GMT) 格式化时间" + +#: ../../howto/logging-cookbook.rst:3263 +msgid "" +"Sometimes you want to format times using UTC, which can be done using a " +"class such as ``UTCFormatter``, shown below::" +msgstr "有时你会想要使用 UTC 时间格式,这可以用 ``UTCFormatter`` 这样的类来实现,如下所示::" + +#: ../../howto/logging-cookbook.rst:3266 +msgid "" +"import logging\n" +"import time\n" +"\n" +"class UTCFormatter(logging.Formatter):\n" +" converter = time.gmtime" +msgstr "" +"import logging\n" +"import time\n" +"\n" +"class UTCFormatter(logging.Formatter):\n" +" converter = time.gmtime" + +#: ../../howto/logging-cookbook.rst:3272 +msgid "" +"and you can then use the ``UTCFormatter`` in your code instead of " +":class:`~logging.Formatter`. If you want to do that via configuration, you " +"can use the :func:`~logging.config.dictConfig` API with an approach " +"illustrated by the following complete example::" +msgstr "" +"然后你可以在你的代码中使用 ``UTCFormatter``,而不是 :class:`~logging.Formatter`。 " +"如果你想通过配置来实现这一功能,你可以使用 :func:`~logging.config.dictConfig` API " +"来完成,该方法在以下完整示例中展示::" + +#: ../../howto/logging-cookbook.rst:3277 +msgid "" +"import logging\n" +"import logging.config\n" +"import time\n" +"\n" +"class UTCFormatter(logging.Formatter):\n" +" converter = time.gmtime\n" +"\n" +"LOGGING = {\n" +" 'version': 1,\n" +" 'disable_existing_loggers': False,\n" +" 'formatters': {\n" +" 'utc': {\n" +" '()': UTCFormatter,\n" +" 'format': '%(asctime)s %(message)s',\n" +" },\n" +" 'local': {\n" +" 'format': '%(asctime)s %(message)s',\n" +" }\n" +" },\n" +" 'handlers': {\n" +" 'console1': {\n" +" 'class': 'logging.StreamHandler',\n" +" 'formatter': 'utc',\n" +" },\n" +" 'console2': {\n" +" 'class': 'logging.StreamHandler',\n" +" 'formatter': 'local',\n" +" },\n" +" },\n" +" 'root': {\n" +" 'handlers': ['console1', 'console2'],\n" +" }\n" +"}\n" +"\n" +"if __name__ == '__main__':\n" +" logging.config.dictConfig(LOGGING)\n" +" logging.warning('The local time is %s', time.asctime())" +msgstr "" +"import logging\n" +"import logging.config\n" +"import time\n" +"\n" +"class UTCFormatter(logging.Formatter):\n" +" converter = time.gmtime\n" +"\n" +"LOGGING = {\n" +" 'version': 1,\n" +" 'disable_existing_loggers': False,\n" +" 'formatters': {\n" +" 'utc': {\n" +" '()': UTCFormatter,\n" +" 'format': '%(asctime)s %(message)s',\n" +" },\n" +" 'local': {\n" +" 'format': '%(asctime)s %(message)s',\n" +" }\n" +" },\n" +" 'handlers': {\n" +" 'console1': {\n" +" 'class': 'logging.StreamHandler',\n" +" 'formatter': 'utc',\n" +" },\n" +" 'console2': {\n" +" 'class': 'logging.StreamHandler',\n" +" 'formatter': 'local',\n" +" },\n" +" },\n" +" 'root': {\n" +" 'handlers': ['console1', 'console2'],\n" +" }\n" +"}\n" +"\n" +"if __name__ == '__main__':\n" +" logging.config.dictConfig(LOGGING)\n" +" logging.warning('The local time is %s', time.asctime())" + +#: ../../howto/logging-cookbook.rst:3315 +msgid "When this script is run, it should print something like:" +msgstr "脚本会运行输出类似下面的内容:" + +#: ../../howto/logging-cookbook.rst:3317 +msgid "" +"2015-10-17 12:53:29,501 The local time is Sat Oct 17 13:53:29 2015\n" +"2015-10-17 13:53:29,501 The local time is Sat Oct 17 13:53:29 2015" +msgstr "" +"2015-10-17 12:53:29,501 The local time is Sat Oct 17 13:53:29 2015\n" +"2015-10-17 13:53:29,501 The local time is Sat Oct 17 13:53:29 2015" + +#: ../../howto/logging-cookbook.rst:3322 +msgid "" +"showing how the time is formatted both as local time and UTC, one for each " +"handler." +msgstr "展示了如何将时间格式化为本地时间和 UTC 两种形式,其中每种形式对应一个日志处理器。" + +#: ../../howto/logging-cookbook.rst:3329 +msgid "Using a context manager for selective logging" +msgstr "使用上下文管理器的可选的日志记录" + +#: ../../howto/logging-cookbook.rst:3331 +msgid "" +"There are times when it would be useful to temporarily change the logging " +"configuration and revert it back after doing something. For this, a context " +"manager is the most obvious way of saving and restoring the logging context." +" Here is a simple example of such a context manager, which allows you to " +"optionally change the logging level and add a logging handler purely in the " +"scope of the context manager::" +msgstr "" +"有时候,我们需要暂时更改日志配置,并在执行某些操作后将其还原。为此,上下文管理器是实现保存和恢复日志上下文的最明显的方式。这是一个关于上下文管理器的简单例子,它允许你在上下文管理器的作用域内更改日志记录等级以及增加日志处理器::" + +#: ../../howto/logging-cookbook.rst:3338 +msgid "" +"import logging\n" +"import sys\n" +"\n" +"class LoggingContext:\n" +" def __init__(self, logger, level=None, handler=None, close=True):\n" +" self.logger = logger\n" +" self.level = level\n" +" self.handler = handler\n" +" self.close = close\n" +"\n" +" def __enter__(self):\n" +" if self.level is not None:\n" +" self.old_level = self.logger.level\n" +" self.logger.setLevel(self.level)\n" +" if self.handler:\n" +" self.logger.addHandler(self.handler)\n" +"\n" +" def __exit__(self, et, ev, tb):\n" +" if self.level is not None:\n" +" self.logger.setLevel(self.old_level)\n" +" if self.handler:\n" +" self.logger.removeHandler(self.handler)\n" +" if self.handler and self.close:\n" +" self.handler.close()\n" +" # implicit return of None => don't swallow exceptions" +msgstr "" +"import logging\n" +"import sys\n" +"\n" +"class LoggingContext:\n" +" def __init__(self, logger, level=None, handler=None, close=True):\n" +" self.logger = logger\n" +" self.level = level\n" +" self.handler = handler\n" +" self.close = close\n" +"\n" +" def __enter__(self):\n" +" if self.level is not None:\n" +" self.old_level = self.logger.level\n" +" self.logger.setLevel(self.level)\n" +" if self.handler:\n" +" self.logger.addHandler(self.handler)\n" +"\n" +" def __exit__(self, et, ev, tb):\n" +" if self.level is not None:\n" +" self.logger.setLevel(self.old_level)\n" +" if self.handler:\n" +" self.logger.removeHandler(self.handler)\n" +" if self.handler and self.close:\n" +" self.handler.close()\n" +" # 隐式地返回 None => 不捕获异常" + +#: ../../howto/logging-cookbook.rst:3364 +msgid "" +"If you specify a level value, the logger's level is set to that value in the" +" scope of the with block covered by the context manager. If you specify a " +"handler, it is added to the logger on entry to the block and removed on exit" +" from the block. You can also ask the manager to close the handler for you " +"on block exit - you could do this if you don't need the handler any more." +msgstr "" +"如果指定上下文管理器的日志记录等级属性,则在上下文管理器的 with " +"语句所涵盖的代码中,日志记录器的记录等级将临时设置为上下文管理器所配置的日志记录等级。 " +"如果指定上下文管理的日志处理器属性,则该句柄在进入上下文管理器的上下文时添加到记录器中,并在退出时被删除。 " +"如果你再也不需要该日志处理器时,你可以让上下文管理器在退出上下文管理器的上下文时关闭它。" + +#: ../../howto/logging-cookbook.rst:3370 +msgid "" +"To illustrate how it works, we can add the following block of code to the " +"above::" +msgstr "为了说明它是如何工作的,我们可以在上面添加以下代码块::" + +#: ../../howto/logging-cookbook.rst:3373 +msgid "" +"if __name__ == '__main__':\n" +" logger = logging.getLogger('foo')\n" +" logger.addHandler(logging.StreamHandler())\n" +" logger.setLevel(logging.INFO)\n" +" logger.info('1. This should appear just once on stderr.')\n" +" logger.debug('2. This should not appear.')\n" +" with LoggingContext(logger, level=logging.DEBUG):\n" +" logger.debug('3. This should appear once on stderr.')\n" +" logger.debug('4. This should not appear.')\n" +" h = logging.StreamHandler(sys.stdout)\n" +" with LoggingContext(logger, level=logging.DEBUG, handler=h, close=True):\n" +" logger.debug('5. This should appear twice - once on stderr and once on stdout.')\n" +" logger.info('6. This should appear just once on stderr.')\n" +" logger.debug('7. This should not appear.')" +msgstr "" +"if __name__ == '__main__':\n" +" logger = logging.getLogger('foo')\n" +" logger.addHandler(logging.StreamHandler())\n" +" logger.setLevel(logging.INFO)\n" +" logger.info('1. This should appear just once on stderr.')\n" +" logger.debug('2. This should not appear.')\n" +" with LoggingContext(logger, level=logging.DEBUG):\n" +" logger.debug('3. This should appear once on stderr.')\n" +" logger.debug('4. This should not appear.')\n" +" h = logging.StreamHandler(sys.stdout)\n" +" with LoggingContext(logger, level=logging.DEBUG, handler=h, close=True):\n" +" logger.debug('5. This should appear twice - once on stderr and once on stdout.')\n" +" logger.info('6. This should appear just once on stderr.')\n" +" logger.debug('7. This should not appear.')" + +#: ../../howto/logging-cookbook.rst:3388 +msgid "" +"We initially set the logger's level to ``INFO``, so message #1 appears and " +"message #2 doesn't. We then change the level to ``DEBUG`` temporarily in the" +" following ``with`` block, and so message #3 appears. After the block exits," +" the logger's level is restored to ``INFO`` and so message #4 doesn't " +"appear. In the next ``with`` block, we set the level to ``DEBUG`` again but " +"also add a handler writing to ``sys.stdout``. Thus, message #5 appears twice" +" on the console (once via ``stderr`` and once via ``stdout``). After the " +"``with`` statement's completion, the status is as it was before so message " +"#6 appears (like message #1) whereas message #7 doesn't (just like message " +"#2)." +msgstr "" +"我们最初设置日志记录器的消息等级为 ``INFO``,因此消息#1 出现,消息#2 没有出现。在接下来的 ``with`` " +"代码块中我们暂时将消息等级变更为 ``DEBUG``,从而消息 #3 出现。在这一代码块退出后,日志记录器的消息等级恢复为 ``INFO`` ,从而消息" +" #4 没有出现。在下一个 ``with`` 代码块中,我们再一次将设置消息等级设置为 ``DEBUG``,同时添加一个将消息写入 " +"``sys.stdout`` 的日志处理器。因此,消息#5 在控制台出现两次 (分别通过 ``stderr`` 和 ``stdout`` )。在 " +"``with`` 语句完成后,状态与之前一样,因此消息 #6 出现(类似消息 #1),而消息 #7 没有出现(类似消息 #2)。" + +#: ../../howto/logging-cookbook.rst:3398 +msgid "If we run the resulting script, the result is as follows:" +msgstr "如果我们运行生成的脚本,结果如下:" + +#: ../../howto/logging-cookbook.rst:3400 +msgid "" +"$ python logctx.py\n" +"1. This should appear just once on stderr.\n" +"3. This should appear once on stderr.\n" +"5. This should appear twice - once on stderr and once on stdout.\n" +"5. This should appear twice - once on stderr and once on stdout.\n" +"6. This should appear just once on stderr." +msgstr "" +"$ python logctx.py\n" +"1. This should appear just once on stderr.\n" +"3. This should appear once on stderr.\n" +"5. This should appear twice - once on stderr and once on stdout.\n" +"5. This should appear twice - once on stderr and once on stdout.\n" +"6. This should appear just once on stderr." + +#: ../../howto/logging-cookbook.rst:3409 +msgid "" +"If we run it again, but pipe ``stderr`` to ``/dev/null``, we see the " +"following, which is the only message written to ``stdout``:" +msgstr "" +"我们将 ``stderr`` 标准错误重定向到 ``/dev/null``,我再次运行生成的脚本,唯一被写入 ``stdout`` " +"标准输出的消息,即我们所能看见的消息,如下:" + +#: ../../howto/logging-cookbook.rst:3412 +msgid "" +"$ python logctx.py 2>/dev/null\n" +"5. This should appear twice - once on stderr and once on stdout." +msgstr "" +"$ python logctx.py 2>/dev/null\n" +"5. This should appear twice - once on stderr and once on stdout." + +#: ../../howto/logging-cookbook.rst:3417 +msgid "Once again, but piping ``stdout`` to ``/dev/null``, we get:" +msgstr "再一次,将 ``stdout`` 标准输出重定向到 ``/dev/null``,我获得如下结果:" + +#: ../../howto/logging-cookbook.rst:3419 +msgid "" +"$ python logctx.py >/dev/null\n" +"1. This should appear just once on stderr.\n" +"3. This should appear once on stderr.\n" +"5. This should appear twice - once on stderr and once on stdout.\n" +"6. This should appear just once on stderr." +msgstr "" +"$ python logctx.py >/dev/null\n" +"1. This should appear just once on stderr.\n" +"3. This should appear once on stderr.\n" +"5. This should appear twice - once on stderr and once on stdout.\n" +"6. This should appear just once on stderr." + +#: ../../howto/logging-cookbook.rst:3427 +msgid "" +"In this case, the message #5 printed to ``stdout`` doesn't appear, as " +"expected." +msgstr "在这种情况下,与预期一致,打印到 ``stdout`` 标准输出的消息#5 不会出现。" + +#: ../../howto/logging-cookbook.rst:3429 +msgid "" +"Of course, the approach described here can be generalised, for example to " +"attach logging filters temporarily. Note that the above code works in Python" +" 2 as well as Python 3." +msgstr "当然,这里描述的方法可以被推广,例如临时附加日志记录过滤器。请注意,上面的代码适用于 Python 2 以及 Python 3。" + +#: ../../howto/logging-cookbook.rst:3437 +msgid "A CLI application starter template" +msgstr "命令行日志应用起步" + +#: ../../howto/logging-cookbook.rst:3439 +msgid "Here's an example which shows how you can:" +msgstr "下面的示例提供了如下功能:" + +#: ../../howto/logging-cookbook.rst:3441 +msgid "Use a logging level based on command-line arguments" +msgstr "根据命令行参数确定日志级别" + +#: ../../howto/logging-cookbook.rst:3442 +msgid "" +"Dispatch to multiple subcommands in separate files, all logging at the same " +"level in a consistent way" +msgstr "在单独的文件中分发多条子命令,同一级别的子命令均以一致的方式记录。" + +#: ../../howto/logging-cookbook.rst:3444 +msgid "Make use of simple, minimal configuration" +msgstr "最简单的配置用法" + +#: ../../howto/logging-cookbook.rst:3446 +msgid "" +"Suppose we have a command-line application whose job is to stop, start or " +"restart some services. This could be organised for the purposes of " +"illustration as a file ``app.py`` that is the main script for the " +"application, with individual commands implemented in ``start.py``, " +"``stop.py`` and ``restart.py``. Suppose further that we want to control the " +"verbosity of the application via a command-line argument, defaulting to " +"``logging.INFO``. Here's one way that ``app.py`` could be written::" +msgstr "" +"假定有一个命令行应用程序,用于停止、启动或重新启动某些服务。为了便于演示,不妨将 ``app.py`` 作为应用程序的主代码文件,并在 " +"``start.py``、``stop.py`` 和 ``restart.py`` " +"中实现单独的命令。再假定要通过命令行参数控制应用程序的日志粒度,默认为 ``logging.INFO``。以下是 ``app.py`` 的一个示例::" + +#: ../../howto/logging-cookbook.rst:3454 +msgid "" +"import argparse\n" +"import importlib\n" +"import logging\n" +"import os\n" +"import sys\n" +"\n" +"def main(args=None):\n" +" scriptname = os.path.basename(__file__)\n" +" parser = argparse.ArgumentParser(scriptname)\n" +" levels = ('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')\n" +" parser.add_argument('--log-level', default='INFO', choices=levels)\n" +" subparsers = parser.add_subparsers(dest='command',\n" +" help='Available commands:')\n" +" start_cmd = subparsers.add_parser('start', help='Start a service')\n" +" start_cmd.add_argument('name', metavar='NAME',\n" +" help='Name of service to start')\n" +" stop_cmd = subparsers.add_parser('stop',\n" +" help='Stop one or more services')\n" +" stop_cmd.add_argument('names', metavar='NAME', nargs='+',\n" +" help='Name of service to stop')\n" +" restart_cmd = subparsers.add_parser('restart',\n" +" help='Restart one or more services')\n" +" restart_cmd.add_argument('names', metavar='NAME', nargs='+',\n" +" help='Name of service to restart')\n" +" options = parser.parse_args()\n" +" # the code to dispatch commands could all be in this file. For the purposes\n" +" # of illustration only, we implement each command in a separate module.\n" +" try:\n" +" mod = importlib.import_module(options.command)\n" +" cmd = getattr(mod, 'command')\n" +" except (ImportError, AttributeError):\n" +" print('Unable to find the code for command \\'%s\\'' % options.command)\n" +" return 1\n" +" # Could get fancy here and load configuration from file or dictionary\n" +" logging.basicConfig(level=options.log_level,\n" +" format='%(levelname)s %(name)s %(message)s')\n" +" cmd(options)\n" +"\n" +"if __name__ == '__main__':\n" +" sys.exit(main())" +msgstr "" +"import argparse\n" +"import importlib\n" +"import logging\n" +"import os\n" +"import sys\n" +"\n" +"def main(args=None):\n" +" scriptname = os.path.basename(__file__)\n" +" parser = argparse.ArgumentParser(scriptname)\n" +" levels = ('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')\n" +" parser.add_argument('--log-level', default='INFO', choices=levels)\n" +" subparsers = parser.add_subparsers(dest='command',\n" +" help='Available commands:')\n" +" start_cmd = subparsers.add_parser('start', help='Start a service')\n" +" start_cmd.add_argument('name', metavar='NAME',\n" +" help='Name of service to start')\n" +" stop_cmd = subparsers.add_parser('stop',\n" +" help='Stop one or more services')\n" +" stop_cmd.add_argument('names', metavar='NAME', nargs='+',\n" +" help='Name of service to stop')\n" +" restart_cmd = subparsers.add_parser('restart',\n" +" help='Restart one or more services')\n" +" restart_cmd.add_argument('names', metavar='NAME', nargs='+',\n" +" help='Name of service to restart')\n" +" options = parser.parse_args()\n" +" # 分发命令的代码可以全都放在此文件中。只是出于演示目的,\n" +" # 我们将在单独的模块中实现每个命令。\n" +" try:\n" +" mod = importlib.import_module(options.command)\n" +" cmd = getattr(mod, 'command')\n" +" except (ImportError, AttributeError):\n" +" print('Unable to find the code for command \\'%s\\'' % options.command)\n" +" return 1\n" +" # 这里可以做得更为灵活并从文件或目录加载配置\n" +" logging.basicConfig(level=options.log_level,\n" +" format='%(levelname)s %(name)s %(message)s')\n" +" cmd(options)\n" +"\n" +"if __name__ == '__main__':\n" +" sys.exit(main())" + +#: ../../howto/logging-cookbook.rst:3495 +msgid "" +"And the ``start``, ``stop`` and ``restart`` commands can be implemented in " +"separate modules, like so for starting::" +msgstr "``start``、``stop`` 和 ``restart`` 命令可以在单独的模块中实现,启动命令的代码可如下::" + +#: ../../howto/logging-cookbook.rst:3498 +msgid "" +"# start.py\n" +"import logging\n" +"\n" +"logger = logging.getLogger(__name__)\n" +"\n" +"def command(options):\n" +" logger.debug('About to start %s', options.name)\n" +" # actually do the command processing here ...\n" +" logger.info('Started the \\'%s\\' service.', options.name)" +msgstr "" +"# start.py\n" +"import logging\n" +"\n" +"logger = logging.getLogger(__name__)\n" +"\n" +"def command(options):\n" +" logger.debug('About to start %s', options.name)\n" +" # 在此进行实际的命令处理 ...\n" +" logger.info('Started the \\'%s\\' service.', options.name)" + +#: ../../howto/logging-cookbook.rst:3508 +msgid "and thus for stopping::" +msgstr "然后是停止命令的代码::" + +#: ../../howto/logging-cookbook.rst:3510 +msgid "" +"# stop.py\n" +"import logging\n" +"\n" +"logger = logging.getLogger(__name__)\n" +"\n" +"def command(options):\n" +" n = len(options.names)\n" +" if n == 1:\n" +" plural = ''\n" +" services = '\\'%s\\'' % options.names[0]\n" +" else:\n" +" plural = 's'\n" +" services = ', '.join('\\'%s\\'' % name for name in options.names)\n" +" i = services.rfind(', ')\n" +" services = services[:i] + ' and ' + services[i + 2:]\n" +" logger.debug('About to stop %s', services)\n" +" # actually do the command processing here ...\n" +" logger.info('Stopped the %s service%s.', services, plural)" +msgstr "" +"# stop.py\n" +"import logging\n" +"\n" +"logger = logging.getLogger(__name__)\n" +"\n" +"def command(options):\n" +" n = len(options.names)\n" +" if n == 1:\n" +" plural = ''\n" +" services = '\\'%s\\'' % options.names[0]\n" +" else:\n" +" plural = 's'\n" +" services = ', '.join('\\'%s\\'' % name for name in options.names)\n" +" i = services.rfind(', ')\n" +" services = services[:i] + ' and ' + services[i + 2:]\n" +" logger.debug('About to stop %s', services)\n" +" # 在此进行实际的命令处理 ...\n" +" logger.info('Stopped the %s service%s.', services, plural)" + +#: ../../howto/logging-cookbook.rst:3529 +msgid "and similarly for restarting::" +msgstr "重启命令类似::" + +#: ../../howto/logging-cookbook.rst:3531 +msgid "" +"# restart.py\n" +"import logging\n" +"\n" +"logger = logging.getLogger(__name__)\n" +"\n" +"def command(options):\n" +" n = len(options.names)\n" +" if n == 1:\n" +" plural = ''\n" +" services = '\\'%s\\'' % options.names[0]\n" +" else:\n" +" plural = 's'\n" +" services = ', '.join('\\'%s\\'' % name for name in options.names)\n" +" i = services.rfind(', ')\n" +" services = services[:i] + ' and ' + services[i + 2:]\n" +" logger.debug('About to restart %s', services)\n" +" # actually do the command processing here ...\n" +" logger.info('Restarted the %s service%s.', services, plural)" +msgstr "" +"# restart.py\n" +"import logging\n" +"\n" +"logger = logging.getLogger(__name__)\n" +"\n" +"def command(options):\n" +" n = len(options.names)\n" +" if n == 1:\n" +" plural = ''\n" +" services = '\\'%s\\'' % options.names[0]\n" +" else:\n" +" plural = 's'\n" +" services = ', '.join('\\'%s\\'' % name for name in options.names)\n" +" i = services.rfind(', ')\n" +" services = services[:i] + ' and ' + services[i + 2:]\n" +" logger.debug('About to restart %s', services)\n" +" # 在此进行实际的命令处理 ...\n" +" logger.info('Restarted the %s service%s.', services, plural)" + +#: ../../howto/logging-cookbook.rst:3550 +msgid "" +"If we run this application with the default log level, we get output like " +"this:" +msgstr "如果以默认日志级别运行该程序,会得到以下结果:" + +#: ../../howto/logging-cookbook.rst:3552 +msgid "" +"$ python app.py start foo\n" +"INFO start Started the 'foo' service.\n" +"\n" +"$ python app.py stop foo bar\n" +"INFO stop Stopped the 'foo' and 'bar' services.\n" +"\n" +"$ python app.py restart foo bar baz\n" +"INFO restart Restarted the 'foo', 'bar' and 'baz' services." +msgstr "" +"$ python app.py start foo\n" +"INFO start Started the 'foo' service.\n" +"\n" +"$ python app.py stop foo bar\n" +"INFO stop Stopped the 'foo' and 'bar' services.\n" +"\n" +"$ python app.py restart foo bar baz\n" +"INFO restart Restarted the 'foo', 'bar' and 'baz' services." + +#: ../../howto/logging-cookbook.rst:3563 +msgid "" +"The first word is the logging level, and the second word is the module or " +"package name of the place where the event was logged." +msgstr "第一个单词是日志级别,第二个单词是日志事件所在的模块或包的名称。" + +#: ../../howto/logging-cookbook.rst:3566 +msgid "" +"If we change the logging level, then we can change the information sent to " +"the log. For example, if we want more information:" +msgstr "如果修改了日志级别,发送给日志的信息就能得以改变。如要显示更多信息,则可:" + +#: ../../howto/logging-cookbook.rst:3569 +msgid "" +"$ python app.py --log-level DEBUG start foo\n" +"DEBUG start About to start foo\n" +"INFO start Started the 'foo' service.\n" +"\n" +"$ python app.py --log-level DEBUG stop foo bar\n" +"DEBUG stop About to stop 'foo' and 'bar'\n" +"INFO stop Stopped the 'foo' and 'bar' services.\n" +"\n" +"$ python app.py --log-level DEBUG restart foo bar baz\n" +"DEBUG restart About to restart 'foo', 'bar' and 'baz'\n" +"INFO restart Restarted the 'foo', 'bar' and 'baz' services." +msgstr "" +"$ python app.py --log-level DEBUG start foo\n" +"DEBUG start About to start foo\n" +"INFO start Started the 'foo' service.\n" +"\n" +"$ python app.py --log-level DEBUG stop foo bar\n" +"DEBUG stop About to stop 'foo' and 'bar'\n" +"INFO stop Stopped the 'foo' and 'bar' services.\n" +"\n" +"$ python app.py --log-level DEBUG restart foo bar baz\n" +"DEBUG restart About to restart 'foo', 'bar' and 'baz'\n" +"INFO restart Restarted the 'foo', 'bar' and 'baz' services." + +#: ../../howto/logging-cookbook.rst:3583 +msgid "And if we want less:" +msgstr "若要显示的信息少一些,则:" + +#: ../../howto/logging-cookbook.rst:3585 +msgid "" +"$ python app.py --log-level WARNING start foo\n" +"$ python app.py --log-level WARNING stop foo bar\n" +"$ python app.py --log-level WARNING restart foo bar baz" +msgstr "" +"$ python app.py --log-level WARNING start foo\n" +"$ python app.py --log-level WARNING stop foo bar\n" +"$ python app.py --log-level WARNING restart foo bar baz" + +#: ../../howto/logging-cookbook.rst:3591 +msgid "" +"In this case, the commands don't print anything to the console, since " +"nothing at ``WARNING`` level or above is logged by them." +msgstr "这里的命令不会向控制台输出任何信息,因为没有记录 ``WARNING`` 以上级别的日志。" + +#: ../../howto/logging-cookbook.rst:3597 +msgid "A Qt GUI for logging" +msgstr "Qt GUI 日志示例" + +#: ../../howto/logging-cookbook.rst:3599 +msgid "" +"A question that comes up from time to time is about how to log to a GUI " +"application. The `Qt `_ framework is a popular cross-" +"platform UI framework with Python bindings using :pypi:`PySide2` or " +":pypi:`PyQt5` libraries." +msgstr "" +"一个时常被提出的问题是 GUI 应用程序要如何记录日志。`Qt `_ 框架是一个流行的跨平台 UI " +"框架,它具有使用 :pypi:`PySide2` 或 :pypi:`PyQt5` 库的 Python 绑定。" + +#: ../../howto/logging-cookbook.rst:3604 +msgid "" +"The following example shows how to log to a Qt GUI. This introduces a simple" +" ``QtHandler`` class which takes a callable, which should be a slot in the " +"main thread that does GUI updates. A worker thread is also created to show " +"how you can log to the GUI from both the UI itself (via a button for manual " +"logging) as well as a worker thread doing work in the background (here, just" +" logging messages at random levels with random short delays in between)." +msgstr "" +"下面的例子演示了将日志写入 Qt GUI 程序的过程。这里引入了一个简单的 ``QtHandler`` " +"类,参数是一个可调用对象,其应为嵌入主线程某个“槽位”中运行的,因为 GUI 的更新由主线程完成。这里还创建了一个工作线程,以便演示由 " +"UI(通过人工点击日志按钮)和后台工作线程(此处只是记录级别和时间间隔均随机生成的日志信息)将日志写入 GUI 的过程。" + +#: ../../howto/logging-cookbook.rst:3611 +msgid "" +"The worker thread is implemented using Qt's ``QThread`` class rather than " +"the :mod:`threading` module, as there are circumstances where one has to use" +" ``QThread``, which offers better integration with other ``Qt`` components." +msgstr "" +"该工作线程是用 Qt 的 ``QThread`` 类实现的,而不是 :mod:`threading` 模块,因为某些情况下只能采用 " +"``QThread``,它与其他 ``Qt`` 组件的集成性更好一些。" + +#: ../../howto/logging-cookbook.rst:3615 +msgid "" +"The code should work with recent releases of any of ``PySide6``, ``PyQt6``, " +"``PySide2`` or ``PyQt5``. You should be able to adapt the approach to " +"earlier versions of Qt. Please refer to the comments in the code snippet for" +" more detailed information." +msgstr "" +"此代码应当适用于最新的 ``PySide6``, ``PyQt6``, ``PySide2`` 或 ``PyQt5`` 发布版。 " +"你也可以将此做法适配到更早的 Qt 版本。请参阅代码片段中的注释来获取更详细的信息。" + +#: ../../howto/logging-cookbook.rst:3620 +msgid "" +"import logging\n" +"import random\n" +"import sys\n" +"import time\n" +"\n" +"# Deal with minor differences between different Qt packages\n" +"try:\n" +" from PySide6 import QtCore, QtGui, QtWidgets\n" +" Signal = QtCore.Signal\n" +" Slot = QtCore.Slot\n" +"except ImportError:\n" +" try:\n" +" from PyQt6 import QtCore, QtGui, QtWidgets\n" +" Signal = QtCore.pyqtSignal\n" +" Slot = QtCore.pyqtSlot\n" +" except ImportError:\n" +" try:\n" +" from PySide2 import QtCore, QtGui, QtWidgets\n" +" Signal = QtCore.Signal\n" +" Slot = QtCore.Slot\n" +" except ImportError:\n" +" from PyQt5 import QtCore, QtGui, QtWidgets\n" +" Signal = QtCore.pyqtSignal\n" +" Slot = QtCore.pyqtSlot\n" +"\n" +"logger = logging.getLogger(__name__)\n" +"\n" +"\n" +"#\n" +"# Signals need to be contained in a QObject or subclass in order to be correctly\n" +"# initialized.\n" +"#\n" +"class Signaller(QtCore.QObject):\n" +" signal = Signal(str, logging.LogRecord)\n" +"\n" +"#\n" +"# Output to a Qt GUI is only supposed to happen on the main thread. So, this\n" +"# handler is designed to take a slot function which is set up to run in the main\n" +"# thread. In this example, the function takes a string argument which is a\n" +"# formatted log message, and the log record which generated it. The formatted\n" +"# string is just a convenience - you could format a string for output any way\n" +"# you like in the slot function itself.\n" +"#\n" +"# You specify the slot function to do whatever GUI updates you want. The handler\n" +"# doesn't know or care about specific UI elements.\n" +"#\n" +"class QtHandler(logging.Handler):\n" +" def __init__(self, slotfunc, *args, **kwargs):\n" +" super().__init__(*args, **kwargs)\n" +" self.signaller = Signaller()\n" +" self.signaller.signal.connect(slotfunc)\n" +"\n" +" def emit(self, record):\n" +" s = self.format(record)\n" +" self.signaller.signal.emit(s, record)\n" +"\n" +"#\n" +"# This example uses QThreads, which means that the threads at the Python level\n" +"# are named something like \"Dummy-1\". The function below gets the Qt name of the\n" +"# current thread.\n" +"#\n" +"def ctname():\n" +" return QtCore.QThread.currentThread().objectName()\n" +"\n" +"\n" +"#\n" +"# Used to generate random levels for logging.\n" +"#\n" +"LEVELS = (logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR,\n" +" logging.CRITICAL)\n" +"\n" +"#\n" +"# This worker class represents work that is done in a thread separate to the\n" +"# main thread. The way the thread is kicked off to do work is via a button press\n" +"# that connects to a slot in the worker.\n" +"#\n" +"# Because the default threadName value in the LogRecord isn't much use, we add\n" +"# a qThreadName which contains the QThread name as computed above, and pass that\n" +"# value in an \"extra\" dictionary which is used to update the LogRecord with the\n" +"# QThread name.\n" +"#\n" +"# This example worker just outputs messages sequentially, interspersed with\n" +"# random delays of the order of a few seconds.\n" +"#\n" +"class Worker(QtCore.QObject):\n" +" @Slot()\n" +" def start(self):\n" +" extra = {'qThreadName': ctname() }\n" +" logger.debug('Started work', extra=extra)\n" +" i = 1\n" +" # Let the thread run until interrupted. This allows reasonably clean\n" +" # thread termination.\n" +" while not QtCore.QThread.currentThread().isInterruptionRequested():\n" +" delay = 0.5 + random.random() * 2\n" +" time.sleep(delay)\n" +" try:\n" +" if random.random() < 0.1:\n" +" raise ValueError('Exception raised: %d' % i)\n" +" else:\n" +" level = random.choice(LEVELS)\n" +" logger.log(level, 'Message after delay of %3.1f: %d', delay, i, extra=extra)\n" +" except ValueError as e:\n" +" logger.exception('Failed: %s', e, extra=extra)\n" +" i += 1\n" +"\n" +"#\n" +"# Implement a simple UI for this cookbook example. This contains:\n" +"#\n" +"# * A read-only text edit window which holds formatted log messages\n" +"# * A button to start work and log stuff in a separate thread\n" +"# * A button to log something from the main thread\n" +"# * A button to clear the log window\n" +"#\n" +"class Window(QtWidgets.QWidget):\n" +"\n" +" COLORS = {\n" +" logging.DEBUG: 'black',\n" +" logging.INFO: 'blue',\n" +" logging.WARNING: 'orange',\n" +" logging.ERROR: 'red',\n" +" logging.CRITICAL: 'purple',\n" +" }\n" +"\n" +" def __init__(self, app):\n" +" super().__init__()\n" +" self.app = app\n" +" self.textedit = te = QtWidgets.QPlainTextEdit(self)\n" +" # Set whatever the default monospace font is for the platform\n" +" f = QtGui.QFont('nosuchfont')\n" +" if hasattr(f, 'Monospace'):\n" +" f.setStyleHint(f.Monospace)\n" +" else:\n" +" f.setStyleHint(f.StyleHint.Monospace) # for Qt6\n" +" te.setFont(f)\n" +" te.setReadOnly(True)\n" +" PB = QtWidgets.QPushButton\n" +" self.work_button = PB('Start background work', self)\n" +" self.log_button = PB('Log a message at a random level', self)\n" +" self.clear_button = PB('Clear log window', self)\n" +" self.handler = h = QtHandler(self.update_status)\n" +" # Remember to use qThreadName rather than threadName in the format string.\n" +" fs = '%(asctime)s %(qThreadName)-12s %(levelname)-8s %(message)s'\n" +" formatter = logging.Formatter(fs)\n" +" h.setFormatter(formatter)\n" +" logger.addHandler(h)\n" +" # Set up to terminate the QThread when we exit\n" +" app.aboutToQuit.connect(self.force_quit)\n" +"\n" +" # Lay out all the widgets\n" +" layout = QtWidgets.QVBoxLayout(self)\n" +" layout.addWidget(te)\n" +" layout.addWidget(self.work_button)\n" +" layout.addWidget(self.log_button)\n" +" layout.addWidget(self.clear_button)\n" +" self.setFixedSize(900, 400)\n" +"\n" +" # Connect the non-worker slots and signals\n" +" self.log_button.clicked.connect(self.manual_update)\n" +" self.clear_button.clicked.connect(self.clear_display)\n" +"\n" +" # Start a new worker thread and connect the slots for the worker\n" +" self.start_thread()\n" +" self.work_button.clicked.connect(self.worker.start)\n" +" # Once started, the button should be disabled\n" +" self.work_button.clicked.connect(lambda : self.work_button.setEnabled(False))\n" +"\n" +" def start_thread(self):\n" +" self.worker = Worker()\n" +" self.worker_thread = QtCore.QThread()\n" +" self.worker.setObjectName('Worker')\n" +" self.worker_thread.setObjectName('WorkerThread') # for qThreadName\n" +" self.worker.moveToThread(self.worker_thread)\n" +" # This will start an event loop in the worker thread\n" +" self.worker_thread.start()\n" +"\n" +" def kill_thread(self):\n" +" # Just tell the worker to stop, then tell it to quit and wait for that\n" +" # to happen\n" +" self.worker_thread.requestInterruption()\n" +" if self.worker_thread.isRunning():\n" +" self.worker_thread.quit()\n" +" self.worker_thread.wait()\n" +" else:\n" +" print('worker has already exited.')\n" +"\n" +" def force_quit(self):\n" +" # For use when the window is closed\n" +" if self.worker_thread.isRunning():\n" +" self.kill_thread()\n" +"\n" +" # The functions below update the UI and run in the main thread because\n" +" # that's where the slots are set up\n" +"\n" +" @Slot(str, logging.LogRecord)\n" +" def update_status(self, status, record):\n" +" color = self.COLORS.get(record.levelno, 'black')\n" +" s = '
%s
' % (color, status)\n" +" self.textedit.appendHtml(s)\n" +"\n" +" @Slot()\n" +" def manual_update(self):\n" +" # This function uses the formatted message passed in, but also uses\n" +" # information from the record to format the message in an appropriate\n" +" # color according to its severity (level).\n" +" level = random.choice(LEVELS)\n" +" extra = {'qThreadName': ctname() }\n" +" logger.log(level, 'Manually logged!', extra=extra)\n" +"\n" +" @Slot()\n" +" def clear_display(self):\n" +" self.textedit.clear()\n" +"\n" +"\n" +"def main():\n" +" QtCore.QThread.currentThread().setObjectName('MainThread')\n" +" logging.getLogger().setLevel(logging.DEBUG)\n" +" app = QtWidgets.QApplication(sys.argv)\n" +" example = Window(app)\n" +" example.show()\n" +" if hasattr(app, 'exec'):\n" +" rc = app.exec()\n" +" else:\n" +" rc = app.exec_()\n" +" sys.exit(rc)\n" +"\n" +"if __name__=='__main__':\n" +" main()" +msgstr "" + +#: ../../howto/logging-cookbook.rst:3851 +msgid "Logging to syslog with RFC5424 support" +msgstr "将日志记录到带有 RFC5424 支持的 syslog" + +#: ../../howto/logging-cookbook.rst:3853 +msgid "" +"Although :rfc:`5424` dates from 2009, most syslog servers are configured by " +"default to use the older :rfc:`3164`, which hails from 2001. When " +"``logging`` was added to Python in 2003, it supported the earlier (and only " +"existing) protocol at the time. Since RFC 5424 came out, as there has not " +"been widespread deployment of it in syslog servers, the " +":class:`~logging.handlers.SysLogHandler` functionality has not been updated." +msgstr "" + +#: ../../howto/logging-cookbook.rst:3860 +msgid "" +"RFC 5424 contains some useful features such as support for structured data, " +"and if you need to be able to log to a syslog server with support for it, " +"you can do so with a subclassed handler which looks something like this::" +msgstr "" +"RFC 5424 包括一些有用的特性例如对结构化数据的支持等,如果你想要能够将日志记录到带有该协议支持的 syslog " +"服务器上,你可以使用一个看起来像是这样的子类化处理器来实现::" + +#: ../../howto/logging-cookbook.rst:3864 +msgid "" +"import datetime as dt\n" +"import logging.handlers\n" +"import re\n" +"import socket\n" +"import time\n" +"\n" +"class SysLogHandler5424(logging.handlers.SysLogHandler):\n" +"\n" +" tz_offset = re.compile(r'([+-]\\d{2})(\\d{2})$')\n" +" escaped = re.compile(r'([\\]\"\\\\])')\n" +"\n" +" def __init__(self, *args, **kwargs):\n" +" self.msgid = kwargs.pop('msgid', None)\n" +" self.appname = kwargs.pop('appname', None)\n" +" super().__init__(*args, **kwargs)\n" +"\n" +" def format(self, record):\n" +" version = 1\n" +" asctime = dt.datetime.fromtimestamp(record.created).isoformat()\n" +" m = self.tz_offset.match(time.strftime('%z'))\n" +" has_offset = False\n" +" if m and time.timezone:\n" +" hrs, mins = m.groups()\n" +" if int(hrs) or int(mins):\n" +" has_offset = True\n" +" if not has_offset:\n" +" asctime += 'Z'\n" +" else:\n" +" asctime += f'{hrs}:{mins}'\n" +" try:\n" +" hostname = socket.gethostname()\n" +" except Exception:\n" +" hostname = '-'\n" +" appname = self.appname or '-'\n" +" procid = record.process\n" +" msgid = '-'\n" +" msg = super().format(record)\n" +" sdata = '-'\n" +" if hasattr(record, 'structured_data'):\n" +" sd = record.structured_data\n" +" # This should be a dict where the keys are SD-ID and the value is a\n" +" # dict mapping PARAM-NAME to PARAM-VALUE (refer to the RFC for what these\n" +" # mean)\n" +" # There's no error checking here - it's purely for illustration, and you\n" +" # can adapt this code for use in production environments\n" +" parts = []\n" +"\n" +" def replacer(m):\n" +" g = m.groups()\n" +" return '\\\\' + g[0]\n" +"\n" +" for sdid, dv in sd.items():\n" +" part = f'[{sdid}'\n" +" for k, v in dv.items():\n" +" s = str(v)\n" +" s = self.escaped.sub(replacer, s)\n" +" part += f' {k}=\"{s}\"'\n" +" part += ']'\n" +" parts.append(part)\n" +" sdata = ''.join(parts)\n" +" return f'{version} {asctime} {hostname} {appname} {procid} {msgid} {sdata} {msg}'" +msgstr "" + +#: ../../howto/logging-cookbook.rst:3926 +msgid "" +"You'll need to be familiar with RFC 5424 to fully understand the above code," +" and it may be that you have slightly different needs (e.g. for how you pass" +" structural data to the log). Nevertheless, the above should be adaptable to" +" your speciric needs. With the above handler, you'd pass structured data " +"using something like this::" +msgstr "" +"你需要熟悉 RFC 5424 才能完全理解上面的代码,你还可能会有稍加变化的的需求(例如你要如何将结构化数据记入日志)。 " +"不管怎样,上面的代码应当根据你的特定需求来灵活调整。通过上面的处理器,你可以使用类似这样的代码来传入结构化数据::" + +#: ../../howto/logging-cookbook.rst:3931 +msgid "" +"sd = {\n" +" 'foo@12345': {'bar': 'baz', 'baz': 'bozz', 'fizz': r'buzz'},\n" +" 'foo@54321': {'rab': 'baz', 'zab': 'bozz', 'zzif': r'buzz'}\n" +"}\n" +"extra = {'structured_data': sd}\n" +"i = 1\n" +"logger.debug('Message %d', i, extra=extra)" +msgstr "" +"sd = {\n" +" 'foo@12345': {'bar': 'baz', 'baz': 'bozz', 'fizz': r'buzz'},\n" +" 'foo@54321': {'rab': 'baz', 'zab': 'bozz', 'zzif': r'buzz'}\n" +"}\n" +"extra = {'structured_data': sd}\n" +"i = 1\n" +"logger.debug('Message %d', i, extra=extra)" + +#: ../../howto/logging-cookbook.rst:3940 +msgid "How to treat a logger like an output stream" +msgstr "如何将日志记录器作为输出流" + +#: ../../howto/logging-cookbook.rst:3942 +msgid "" +"Sometimes, you need to interface to a third-party API which expects a file-" +"like object to write to, but you want to direct the API's output to a " +"logger. You can do this using a class which wraps a logger with a file-like " +"API. Here's a short script illustrating such a class:" +msgstr "" +"有时,你需要通过接口访问某个预期要写入到文件型对象的第三方 API,但你希望将 API 的输出重定向到一个日志记录器。你可以使用一个以文件类 API " +"来包装日志记录器的类。下面是一个演示这样的类的简短脚本:" + +#: ../../howto/logging-cookbook.rst:3947 +msgid "" +"import logging\n" +"\n" +"class LoggerWriter:\n" +" def __init__(self, logger, level):\n" +" self.logger = logger\n" +" self.level = level\n" +"\n" +" def write(self, message):\n" +" if message != '\\n': # avoid printing bare newlines, if you like\n" +" self.logger.log(self.level, message)\n" +"\n" +" def flush(self):\n" +" # doesn't actually do anything, but might be expected of a file-like\n" +" # object - so optional depending on your situation\n" +" pass\n" +"\n" +" def close(self):\n" +" # doesn't actually do anything, but might be expected of a file-like\n" +" # object - so optional depending on your situation. You might want\n" +" # to set a flag so that later calls to write raise an exception\n" +" pass\n" +"\n" +"def main():\n" +" logging.basicConfig(level=logging.DEBUG)\n" +" logger = logging.getLogger('demo')\n" +" info_fp = LoggerWriter(logger, logging.INFO)\n" +" debug_fp = LoggerWriter(logger, logging.DEBUG)\n" +" print('An INFO message', file=info_fp)\n" +" print('A DEBUG message', file=debug_fp)\n" +"\n" +"if __name__ == \"__main__\":\n" +" main()" +msgstr "" +"import logging\n" +"\n" +"class LoggerWriter:\n" +" def __init__(self, logger, level):\n" +" self.logger = logger\n" +" self.level = level\n" +"\n" +" def write(self, message):\n" +" if message != '\\n': # 避免打印空白行,如果你希望如此\n" +" self.logger.log(self.level, message)\n" +"\n" +" def flush(self):\n" +" # 实际上不做任何事,但对文件型对象来说应当提供\n" +" # —— 因此根据你的情况作为可选项\n" +" pass\n" +"\n" +" def close(self):\n" +" # 实际上不做任何事,但对文件型对象来说应当提供\n" +" # —— 因此根据你的情况作为可选项。你可能会希望\n" +" # 设置一个旗标以便后续的写入调用引发异常\n" +" pass\n" +"\n" +"def main():\n" +" logging.basicConfig(level=logging.DEBUG)\n" +" logger = logging.getLogger('demo')\n" +" info_fp = LoggerWriter(logger, logging.INFO)\n" +" debug_fp = LoggerWriter(logger, logging.DEBUG)\n" +" print('An INFO message', file=info_fp)\n" +" print('A DEBUG message', file=debug_fp)\n" +"\n" +"if __name__ == \"__main__\":\n" +" main()" + +#: ../../howto/logging-cookbook.rst:3982 +msgid "When this script is run, it prints" +msgstr "当此脚本运行时,它将打印" + +#: ../../howto/logging-cookbook.rst:3984 +msgid "" +"INFO:demo:An INFO message\n" +"DEBUG:demo:A DEBUG message" +msgstr "" +"INFO:demo:An INFO message\n" +"DEBUG:demo:A DEBUG message" + +#: ../../howto/logging-cookbook.rst:3989 +msgid "" +"You could also use ``LoggerWriter`` to redirect ``sys.stdout`` and " +"``sys.stderr`` by doing something like this:" +msgstr "" +"你还可以使用 ``LoggerWriter`` 通过下面这样的做法来重定向 ``sys.stdout`` 和 ``sys.stderr``:" + +#: ../../howto/logging-cookbook.rst:3992 +msgid "" +"import sys\n" +"\n" +"sys.stdout = LoggerWriter(logger, logging.INFO)\n" +"sys.stderr = LoggerWriter(logger, logging.WARNING)" +msgstr "" +"import sys\n" +"\n" +"sys.stdout = LoggerWriter(logger, logging.INFO)\n" +"sys.stderr = LoggerWriter(logger, logging.WARNING)" + +#: ../../howto/logging-cookbook.rst:3999 +msgid "" +"You should do this *after* configuring logging for your needs. In the above " +"example, the :func:`~logging.basicConfig` call does this (using the " +"``sys.stderr`` value *before* it is overwritten by a ``LoggerWriter`` " +"instance). Then, you'd get this kind of result:" +msgstr "" +"你应当在根据需要配置日志记录 *之后* 再这样做。在上面的例子中,:func:`~logging.basicConfig` 调用执行了此操作(在 " +"``sys.stderr`` 被一个 ``LoggerWriter`` 实例覆盖 *之前* 使用它的值)。然后,你将得到这样的结果:" + +#: ../../howto/logging-cookbook.rst:4004 +msgid "" +">>> print('Foo')\n" +"INFO:demo:Foo\n" +">>> print('Bar', file=sys.stderr)\n" +"WARNING:demo:Bar\n" +">>>" +msgstr "" +">>> print('Foo')\n" +"INFO:demo:Foo\n" +">>> print('Bar', file=sys.stderr)\n" +"WARNING:demo:Bar\n" +">>>" + +#: ../../howto/logging-cookbook.rst:4012 +msgid "" +"Of course, the examples above show output according to the format used by " +":func:`~logging.basicConfig`, but you can use a different formatter when you" +" configure logging." +msgstr "" +"当然,上面的例子是按照 :func:`~logging.basicConfig` 所使用的格式来显示输出的,但你也可以在配置日志记录时使用其他的格式。" + +#: ../../howto/logging-cookbook.rst:4016 +msgid "" +"Note that with the above scheme, you are somewhat at the mercy of buffering " +"and the sequence of write calls which you are intercepting. For example, " +"with the definition of ``LoggerWriter`` above, if you have the snippet" +msgstr "" +"请注意当使用上面的预置方案时,你将在一定程度上受到你所拦截的写入调用的缓冲和顺序的控制。例如,在使用上述 ``LoggerWriter`` " +"的定义的情况下,如果你使用代码段" + +#: ../../howto/logging-cookbook.rst:4020 +msgid "" +"sys.stderr = LoggerWriter(logger, logging.WARNING)\n" +"1 / 0" +msgstr "" +"sys.stderr = LoggerWriter(logger, logging.WARNING)\n" +"1 / 0" + +#: ../../howto/logging-cookbook.rst:4025 +msgid "then running the script results in" +msgstr "则运行该脚本的结果为" + +#: ../../howto/logging-cookbook.rst:4027 +msgid "" +"WARNING:demo:Traceback (most recent call last):\n" +"\n" +"WARNING:demo: File \"/home/runner/cookbook-loggerwriter/test.py\", line 53, in \n" +"\n" +"WARNING:demo:\n" +"WARNING:demo:main()\n" +"WARNING:demo: File \"/home/runner/cookbook-loggerwriter/test.py\", line 49, in main\n" +"\n" +"WARNING:demo:\n" +"WARNING:demo:1 / 0\n" +"WARNING:demo:ZeroDivisionError\n" +"WARNING:demo::\n" +"WARNING:demo:division by zero" +msgstr "" +"WARNING:demo:Traceback (most recent call last):\n" +"\n" +"WARNING:demo: File \"/home/runner/cookbook-loggerwriter/test.py\", line 53, in \n" +"\n" +"WARNING:demo:\n" +"WARNING:demo:main()\n" +"WARNING:demo: File \"/home/runner/cookbook-loggerwriter/test.py\", line 49, in main\n" +"\n" +"WARNING:demo:\n" +"WARNING:demo:1 / 0\n" +"WARNING:demo:ZeroDivisionError\n" +"WARNING:demo::\n" +"WARNING:demo:division by zero" + +#: ../../howto/logging-cookbook.rst:4043 +msgid "" +"As you can see, this output isn't ideal. That's because the underlying code " +"which writes to ``sys.stderr`` makes multiple writes, each of which results " +"in a separate logged line (for example, the last three lines above). To get " +"around this problem, you need to buffer things and only output log lines " +"when newlines are seen. Let's use a slightly better implementation of " +"``LoggerWriter``:" +msgstr "" +"如你所见,这个输出并不很理想。那是因为下层的写入 ``sys.stderr`` " +"的代码会执行多次写入,每次都将产生一条单独的日志记录行(例如,上面的最后三行)。要避免这个问题,你需要使用缓冲并且只在看到换行符时才输出日志记录行。 " +"让我们使用一个更好些的 ``LoggerWriter`` 实现:" + +#: ../../howto/logging-cookbook.rst:4049 +msgid "" +"class BufferingLoggerWriter(LoggerWriter):\n" +" def __init__(self, logger, level):\n" +" super().__init__(logger, level)\n" +" self.buffer = ''\n" +"\n" +" def write(self, message):\n" +" if '\\n' not in message:\n" +" self.buffer += message\n" +" else:\n" +" parts = message.split('\\n')\n" +" if self.buffer:\n" +" s = self.buffer + parts.pop(0)\n" +" self.logger.log(self.level, s)\n" +" self.buffer = parts.pop()\n" +" for part in parts:\n" +" self.logger.log(self.level, part)" +msgstr "" +"class BufferingLoggerWriter(LoggerWriter):\n" +" def __init__(self, logger, level):\n" +" super().__init__(logger, level)\n" +" self.buffer = ''\n" +"\n" +" def write(self, message):\n" +" if '\\n' not in message:\n" +" self.buffer += message\n" +" else:\n" +" parts = message.split('\\n')\n" +" if self.buffer:\n" +" s = self.buffer + parts.pop(0)\n" +" self.logger.log(self.level, s)\n" +" self.buffer = parts.pop()\n" +" for part in parts:\n" +" self.logger.log(self.level, part)" + +#: ../../howto/logging-cookbook.rst:4068 +msgid "" +"This just buffers up stuff until a newline is seen, and then logs complete " +"lines. With this approach, you get better output:" +msgstr "这段代码对内容进行了缓冲直至遇到换行符,然后将完整的行写入日志记录。通过这种方式,你将得到更好的输出:" + +#: ../../howto/logging-cookbook.rst:4071 +msgid "" +"WARNING:demo:Traceback (most recent call last):\n" +"WARNING:demo: File \"/home/runner/cookbook-loggerwriter/main.py\", line 55, in \n" +"WARNING:demo: main()\n" +"WARNING:demo: File \"/home/runner/cookbook-loggerwriter/main.py\", line 52, in main\n" +"WARNING:demo: 1/0\n" +"WARNING:demo:ZeroDivisionError: division by zero" +msgstr "" +"WARNING:demo:Traceback (most recent call last):\n" +"WARNING:demo: File \"/home/runner/cookbook-loggerwriter/main.py\", line 55, in \n" +"WARNING:demo: main()\n" +"WARNING:demo: File \"/home/runner/cookbook-loggerwriter/main.py\", line 52, in main\n" +"WARNING:demo: 1/0\n" +"WARNING:demo:ZeroDivisionError: division by zero" + +#: ../../howto/logging-cookbook.rst:4081 +msgid "How to uniformly handle newlines in logging output" +msgstr "如何统一地处理日志记录输出中的换行符" + +#: ../../howto/logging-cookbook.rst:4083 +msgid "" +"Usually, messages that are logged (say to console or file) consist of a " +"single line of text. However, sometimes there is a need to handle messages " +"with multiple lines - whether because a logging format string contains " +"newlines, or logged data contains newlines. If you want to handle such " +"messages uniformly, so that each line in the logged message appears " +"uniformly formatted as if it was logged separately, you can do this using a " +"handler mixin, as in the following snippet:" +msgstr "" +"通常,被记录的消息(输出到控制台或文件)是由单行文本组成的。不过,在某些时候也会需要处理具有多行的消息 —— " +"不论是因为日志格式字符串包含换行符,还是因为被记录的数据包含换行符。 " +"如果你想以统一的方式处理此类消息,使得被记录的消息中的每一行格式看起来保持一致就像它是被单独记录的,你可以使用处理器混入类做到这一点,如下面的代码片段所示:" + +#: ../../howto/logging-cookbook.rst:4091 +msgid "" +"# Assume this is in a module mymixins.py\n" +"import copy\n" +"\n" +"class MultilineMixin:\n" +" def emit(self, record):\n" +" s = record.getMessage()\n" +" if '\\n' not in s:\n" +" super().emit(record)\n" +" else:\n" +" lines = s.splitlines()\n" +" rec = copy.copy(record)\n" +" rec.args = None\n" +" for line in lines:\n" +" rec.msg = line\n" +" super().emit(rec)" +msgstr "" +"# 假定这是在模块 mymixins.py 中\n" +"import copy\n" +"\n" +"class MultilineMixin:\n" +" def emit(self, record):\n" +" s = record.getMessage()\n" +" if '\\n' not in s:\n" +" super().emit(record)\n" +" else:\n" +" lines = s.splitlines()\n" +" rec = copy.copy(record)\n" +" rec.args = None\n" +" for line in lines:\n" +" rec.msg = line\n" +" super().emit(rec)" + +#: ../../howto/logging-cookbook.rst:4109 +msgid "You can use the mixin as in the following script:" +msgstr "你可以像下面的脚本一样使用该混入类:" + +#: ../../howto/logging-cookbook.rst:4111 +msgid "" +"import logging\n" +"\n" +"from mymixins import MultilineMixin\n" +"\n" +"logger = logging.getLogger(__name__)\n" +"\n" +"class StreamHandler(MultilineMixin, logging.StreamHandler):\n" +" pass\n" +"\n" +"if __name__ == '__main__':\n" +" logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)-9s %(message)s',\n" +" handlers = [StreamHandler()])\n" +" logger.debug('Single line')\n" +" logger.debug('Multiple lines:\\nfool me once ...')\n" +" logger.debug('Another single line')\n" +" logger.debug('Multiple lines:\\n%s', 'fool me ...\\ncan\\'t get fooled again')" +msgstr "" +"import logging\n" +"\n" +"from mymixins import MultilineMixin\n" +"\n" +"logger = logging.getLogger(__name__)\n" +"\n" +"class StreamHandler(MultilineMixin, logging.StreamHandler):\n" +" pass\n" +"\n" +"if __name__ == '__main__':\n" +" logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)-9s %(message)s',\n" +" handlers = [StreamHandler()])\n" +" logger.debug('Single line')\n" +" logger.debug('Multiple lines:\\nfool me once ...')\n" +" logger.debug('Another single line')\n" +" logger.debug('Multiple lines:\\n%s', 'fool me ...\\ncan\\'t get fooled again')" + +#: ../../howto/logging-cookbook.rst:4130 +msgid "The script, when run, prints something like:" +msgstr "在运行时,这个脚本将打印如下内容:" + +#: ../../howto/logging-cookbook.rst:4132 +msgid "" +"2025-07-02 13:54:47,234 DEBUG Single line\n" +"2025-07-02 13:54:47,234 DEBUG Multiple lines:\n" +"2025-07-02 13:54:47,234 DEBUG fool me once ...\n" +"2025-07-02 13:54:47,234 DEBUG Another single line\n" +"2025-07-02 13:54:47,234 DEBUG Multiple lines:\n" +"2025-07-02 13:54:47,234 DEBUG fool me ...\n" +"2025-07-02 13:54:47,234 DEBUG can't get fooled again" +msgstr "" +"2025-07-02 13:54:47,234 DEBUG Single line\n" +"2025-07-02 13:54:47,234 DEBUG Multiple lines:\n" +"2025-07-02 13:54:47,234 DEBUG fool me once ...\n" +"2025-07-02 13:54:47,234 DEBUG Another single line\n" +"2025-07-02 13:54:47,234 DEBUG Multiple lines:\n" +"2025-07-02 13:54:47,234 DEBUG fool me ...\n" +"2025-07-02 13:54:47,234 DEBUG can't get fooled again" + +#: ../../howto/logging-cookbook.rst:4142 +msgid "" +"If, on the other hand, you are concerned about `log injection " +"`_, you can use a " +"formatter which escapes newlines, as per the following example:" +msgstr "" +"另一方面,如果你担心 `日志注入 `_,你可以使用对换行符进行转义的格式化器,就像下面的例子:" + +#: ../../howto/logging-cookbook.rst:4146 +msgid "" +"import logging\n" +"\n" +"logger = logging.getLogger(__name__)\n" +"\n" +"class EscapingFormatter(logging.Formatter):\n" +" def format(self, record):\n" +" s = super().format(record)\n" +" return s.replace('\\n', r'\\n')\n" +"\n" +"if __name__ == '__main__':\n" +" h = logging.StreamHandler()\n" +" h.setFormatter(EscapingFormatter('%(asctime)s %(levelname)-9s %(message)s'))\n" +" logging.basicConfig(level=logging.DEBUG, handlers = [h])\n" +" logger.debug('Single line')\n" +" logger.debug('Multiple lines:\\nfool me once ...')\n" +" logger.debug('Another single line')\n" +" logger.debug('Multiple lines:\\n%s', 'fool me ...\\ncan\\'t get fooled again')" +msgstr "" +"import logging\n" +"\n" +"logger = logging.getLogger(__name__)\n" +"\n" +"class EscapingFormatter(logging.Formatter):\n" +" def format(self, record):\n" +" s = super().format(record)\n" +" return s.replace('\\n', r'\\n')\n" +"\n" +"if __name__ == '__main__':\n" +" h = logging.StreamHandler()\n" +" h.setFormatter(EscapingFormatter('%(asctime)s %(levelname)-9s %(message)s'))\n" +" logging.basicConfig(level=logging.DEBUG, handlers = [h])\n" +" logger.debug('Single line')\n" +" logger.debug('Multiple lines:\\nfool me once ...')\n" +" logger.debug('Another single line')\n" +" logger.debug('Multiple lines:\\n%s', 'fool me ...\\ncan\\'t get fooled again')" + +#: ../../howto/logging-cookbook.rst:4166 +msgid "" +"You can, of course, use whatever escaping scheme makes the most sense for " +"you. The script, when run, should produce output like this:" +msgstr "当然,你可以使用任何对你来说最合适的转义方案。在运行时,这个脚本将会产生这样的输出:" + +#: ../../howto/logging-cookbook.rst:4169 +msgid "" +"2025-07-09 06:47:33,783 DEBUG Single line\n" +"2025-07-09 06:47:33,783 DEBUG Multiple lines:\\nfool me once ...\n" +"2025-07-09 06:47:33,783 DEBUG Another single line\n" +"2025-07-09 06:47:33,783 DEBUG Multiple lines:\\nfool me ...\\ncan't get fooled again" +msgstr "" +"2025-07-09 06:47:33,783 DEBUG Single line\n" +"2025-07-09 06:47:33,783 DEBUG Multiple lines:\\nfool me once ...\n" +"2025-07-09 06:47:33,783 DEBUG Another single line\n" +"2025-07-09 06:47:33,783 DEBUG Multiple lines:\\nfool me ...\\ncan't get fooled again" + +#: ../../howto/logging-cookbook.rst:4176 +msgid "" +"Escaping behaviour can't be the stdlib default , as it would break backwards" +" compatibility." +msgstr "转义行为不能是标准库默认设置,因为它会破坏向下兼容性。" + +#: ../../howto/logging-cookbook.rst:4182 +msgid "Patterns to avoid" +msgstr "理应避免的用法" + +#: ../../howto/logging-cookbook.rst:4184 +msgid "" +"Although the preceding sections have described ways of doing things you " +"might need to do or deal with, it is worth mentioning some usage patterns " +"which are *unhelpful*, and which should therefore be avoided in most cases. " +"The following sections are in no particular order." +msgstr "" +"前几节虽介绍了几种方案,描述了可能需要处理的操作,但值得一提的是,有些用法是 *没有好处* 的,大多数情况下应该避免使用。下面几节的顺序不分先后。" + +#: ../../howto/logging-cookbook.rst:4190 +msgid "Opening the same log file multiple times" +msgstr "多次打开同一个日志文件" + +#: ../../howto/logging-cookbook.rst:4192 +msgid "" +"On Windows, you will generally not be able to open the same file multiple " +"times as this will lead to a \"file is in use by another process\" error. " +"However, on POSIX platforms you'll not get any errors if you open the same " +"file multiple times. This could be done accidentally, for example by:" +msgstr "" +"因会导致 \"文件被其他进程占用 \"错误,所以在 Windows 中一般无法多次打开同一个文件。但在 POSIX " +"平台中,多次打开同一个文件不会报任何错误。这种操作可能是意外发生的,比如:" + +#: ../../howto/logging-cookbook.rst:4197 +msgid "" +"Adding a file handler more than once which references the same file (e.g. by" +" a copy/paste/forget-to-change error)." +msgstr "多次添加指向同一文件的 handler(比如通过复制/粘贴,或忘记修改)。" + +#: ../../howto/logging-cookbook.rst:4200 +msgid "" +"Opening two files that look different, as they have different names, but are" +" the same because one is a symbolic link to the other." +msgstr "打开两个貌似不同(文件名不一样)的文件,但一个是另一个的符号链接,所以其实是同一个文件。" + +#: ../../howto/logging-cookbook.rst:4203 +msgid "" +"Forking a process, following which both parent and child have a reference to" +" the same file. This might be through use of the :mod:`multiprocessing` " +"module, for example." +msgstr "进程 fork,然后父进程和子进程都有对同一文件的引用。例如,这可能是通过使用 :mod:`multiprocessing` 模块实现的。" + +#: ../../howto/logging-cookbook.rst:4207 +msgid "" +"Opening a file multiple times might *appear* to work most of the time, but " +"can lead to a number of problems in practice:" +msgstr "在大多数情况下,多次打开同一个文件 *貌似* 一切正常,但实际会导致很多问题。" + +#: ../../howto/logging-cookbook.rst:4210 +msgid "" +"Logging output can be garbled because multiple threads or processes try to " +"write to the same file. Although logging guards against concurrent use of " +"the same handler instance by multiple threads, there is no such protection " +"if concurrent writes are attempted by two different threads using two " +"different handler instances which happen to point to the same file." +msgstr "" +"由于多个线程或进程会尝试写入同一个文件,日志输出可能会出现乱码。尽管日志对象可以防止多个线程同时使用同一个 handler " +"实例,但如果两个不同的线程使用不同的 handler 实例同时写入文件,而这两个 handler 又恰好指向同一个文件,那么就失去了这种防护。" + +#: ../../howto/logging-cookbook.rst:4216 +msgid "" +"An attempt to delete a file (e.g. during file rotation) silently fails, " +"because there is another reference pointing to it. This can lead to " +"confusion and wasted debugging time - log entries end up in unexpected " +"places, or are lost altogether. Or a file that was supposed to be moved " +"remains in place, and grows in size unexpectedly despite size-based rotation" +" being supposedly in place." +msgstr "" +"尝试删除文件(例如在轮换日志文件时)会静默地失败,因为存在另一个指向它的引用。这可能导致混乱并浪费调试时间 —— " +"日志条目会出现在意想不到的地方,或者完全丢失。 " +"或者会有应当移除的文件仍然保持存在,文件还会在已经设置了基于文件大小的轮换的情况下仍然增长到预料之外的大小。" + +#: ../../howto/logging-cookbook.rst:4223 +msgid "" +"Use the techniques outlined in :ref:`multiple-processes` to circumvent such " +"issues." +msgstr "请用 :ref:`multiple-processes` 中介绍的技术来避免上述问题。" + +#: ../../howto/logging-cookbook.rst:4227 +msgid "Using loggers as attributes in a class or passing them as parameters" +msgstr "将日志对象用作属性或传递参数" + +#: ../../howto/logging-cookbook.rst:4229 +msgid "" +"While there might be unusual cases where you'll need to do this, in general " +"there is no point because loggers are singletons. Code can always access a " +"given logger instance by name using ``logging.getLogger(name)``, so passing " +"instances around and holding them as instance attributes is pointless. Note " +"that in other languages such as Java and C#, loggers are often static class " +"attributes. However, this pattern doesn't make sense in Python, where the " +"module (and not the class) is the unit of software decomposition." +msgstr "" +"虽然特殊情况下可能有必要如此,但一般来说没有意义,因为日志是单实例对象。代码总是可以通过 ``logging.getLogger(name)`` " +"用名称访问一个已有的日志对象实例,因此将实例作为参数来传递,或作为属性留存,都是毫无意义的。请注意,在其他语言中,如 Java 和 " +"C#,日志对象通常是静态类属性。但在 Python 中是没有意义的,因为软件拆分的单位是模块(而不是类)。" + +#: ../../howto/logging-cookbook.rst:4238 +msgid "" +"Adding handlers other than :class:`~logging.NullHandler` to a logger in a " +"library" +msgstr "为库中的日志记录器添加 :class:`~logging.NullHandler` 以外的处理器" + +#: ../../howto/logging-cookbook.rst:4240 +msgid "" +"Configuring logging by adding handlers, formatters and filters is the " +"responsibility of the application developer, not the library developer. If " +"you are maintaining a library, ensure that you don't add handlers to any of " +"your loggers other than a :class:`~logging.NullHandler` instance." +msgstr "" +"通过添加 handler、formatter 和 filter " +"来配置日志,这是应用程序开发人员的责任,而不是库开发人员该做的。如果正在维护一个库,请确保不要向任何日志对象添加 " +":class:`~logging.NullHandler` 实例以外的 handler。" + +#: ../../howto/logging-cookbook.rst:4246 +msgid "Creating a lot of loggers" +msgstr "创建大量的日志对象" + +#: ../../howto/logging-cookbook.rst:4248 +msgid "" +"Loggers are singletons that are never freed during a script execution, and " +"so creating lots of loggers will use up memory which can't then be freed. " +"Rather than create a logger per e.g. file processed or network connection " +"made, use the :ref:`existing mechanisms ` for passing " +"contextual information into your logs and restrict the loggers created to " +"those describing areas within your application (generally modules, but " +"occasionally slightly more fine-grained than that)." +msgstr "" +"日志是单实例对象,在代码执行过程中不会被释放,因此创建大量的日志对象会占用很多内存,而这些内存又不能被释放。与其为每个文件或网络连接创建一个日志,还不如利用" +" :ref:`已有机制 ` " +"将上下文信息传给自定义日志对象,并将创建的日志对象限制在应用程序内的指定区域(通常是模块,但偶尔会再精细些)使用。" + +#: ../../howto/logging-cookbook.rst:4259 +msgid "Other resources" +msgstr "其他资源" + +#: ../../howto/logging-cookbook.rst:4263 +msgid "Module :mod:`logging`" +msgstr "模块 :mod:`logging`" + +#: ../../howto/logging-cookbook.rst:4264 +msgid "API reference for the logging module." +msgstr "日志记录模块的 API 参考。" + +#: ../../howto/logging-cookbook.rst:4266 +msgid "Module :mod:`logging.config`" +msgstr ":mod:`logging.config` 模块" + +#: ../../howto/logging-cookbook.rst:4267 +msgid "Configuration API for the logging module." +msgstr "日志记录模块的配置 API。" + +#: ../../howto/logging-cookbook.rst:4269 +msgid "Module :mod:`logging.handlers`" +msgstr ":mod:`logging.handlers` 模块" + +#: ../../howto/logging-cookbook.rst:4270 +msgid "Useful handlers included with the logging module." +msgstr "日志记录模块附带的有用处理器。" + +#: ../../howto/logging-cookbook.rst:4272 +msgid ":ref:`Basic Tutorial `" +msgstr ":ref:`基础教程 `" + +#: ../../howto/logging-cookbook.rst:4274 +msgid ":ref:`Advanced Tutorial `" +msgstr ":ref:`进阶教程 `" diff --git a/howto/logging.po b/howto/logging.po new file mode 100644 index 0000000000..2635f44764 --- /dev/null +++ b/howto/logging.po @@ -0,0 +1,2059 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../howto/logging.rst:5 +msgid "Logging HOWTO" +msgstr "日志指南" + +#: ../../howto/logging.rst:0 +msgid "Author" +msgstr "作者" + +#: ../../howto/logging.rst:7 +msgid "Vinay Sajip " +msgstr "Vinay Sajip " + +#: ../../howto/logging.rst:13 +msgid "" +"This page contains tutorial information. For links to reference information " +"and a logging cookbook, please see :ref:`tutorial-ref-links`." +msgstr "本页面包含教学信息。要获取参考信息和日志记录指导书的链接,请查看 :ref:`tutorial-ref-links`。" + +#: ../../howto/logging.rst:17 +msgid "Basic Logging Tutorial" +msgstr "日志基础教程" + +#: ../../howto/logging.rst:19 +msgid "" +"Logging is a means of tracking events that happen when some software runs. " +"The software's developer adds logging calls to their code to indicate that " +"certain events have occurred. An event is described by a descriptive message" +" which can optionally contain variable data (i.e. data that is potentially " +"different for each occurrence of the event). Events also have an importance " +"which the developer ascribes to the event; the importance can also be called" +" the *level* or *severity*." +msgstr "" +"日志是对软件执行时所发生事件的一种追踪方式。软件开发人员对他们的代码添加日志调用,借此来指示某事件的发生。一个事件通过一些包含变量数据的描述信息来描述(比如:每个事件发生时的数据都是不同的)。开发者还会区分事件的重要性,重要性也被称为" +" *等级* 或 *严重性*。" + +#: ../../howto/logging.rst:28 +msgid "When to use logging" +msgstr "什么时候使用日志" + +#: ../../howto/logging.rst:30 +msgid "" +"You can access logging functionality by creating a logger via ``logger = " +"logging.getLogger(__name__)``, and then calling the logger's " +":meth:`~Logger.debug`, :meth:`~Logger.info`, :meth:`~Logger.warning`, " +":meth:`~Logger.error` and :meth:`~Logger.critical` methods. To determine " +"when to use logging, and to see which logger methods to use when, see the " +"table below. It states, for each of a set of common tasks, the best tool to " +"use for that task." +msgstr "" +"你可以通过执行 ``logger = logging.getLogger(__name__)`` 创建一个日志记录器,然后调用日志记录器的 " +":meth:`~Logger.debug`, :meth:`~Logger.info`, :meth:`~Logger.warning`, " +":meth:`~Logger.error` 和 :meth:`~Logger.critical` 方法来使用日志记录功能。 " +"要确定何时使用日志记录,以及确定要使用哪个日志记录器方法,请参阅下表。 它针对一组常见任务中的每一个都列出了最适合该任务的工具。" + +#: ../../howto/logging.rst:38 +msgid "Task you want to perform" +msgstr "你想要执行的任务" + +#: ../../howto/logging.rst:38 +msgid "The best tool for the task" +msgstr "此任务最好的工具" + +#: ../../howto/logging.rst:40 +msgid "" +"Display console output for ordinary usage of a command line script or " +"program" +msgstr "对于命令行或程序的应用,结果显示在控制台。" + +#: ../../howto/logging.rst:40 +msgid ":func:`print`" +msgstr ":func:`print`" + +#: ../../howto/logging.rst:44 +msgid "" +"Report events that occur during normal operation of a program (e.g. for " +"status monitoring or fault investigation)" +msgstr "在对程序的普通操作发生时提交事件报告 (比如:状态监控和错误调查)" + +#: ../../howto/logging.rst:44 +msgid "" +"A logger's :meth:`~Logger.info` (or :meth:`~Logger.debug` method for very " +"detailed output for diagnostic purposes)" +msgstr "" +"日志记录器的 :meth:`~Logger.info` (或者对于诊断目的需要非常详细的输出时则使用 :meth:`~Logger.debug` 方法)" + +#: ../../howto/logging.rst:49 +msgid "Issue a warning regarding a particular runtime event" +msgstr "提出一个警告信息基于一个特殊的运行时事件" + +#: ../../howto/logging.rst:49 +msgid "" +":func:`warnings.warn` in library code if the issue is avoidable and the " +"client application should be modified to eliminate the warning" +msgstr ":func:`warnings.warn` 位于代码库中,该事件是可以避免的,需要修改客户端应用以消除告警" + +#: ../../howto/logging.rst:54 +msgid "" +"A logger's :meth:`~Logger.warning` method if there is nothing the client " +"application can do about the situation, but the event should still be noted" +msgstr "对于客户端应用无法干预,但事件仍然需要被关注的场合则使用日志记录器的 :meth:`~Logger.warning` 方法" + +#: ../../howto/logging.rst:60 +msgid "Report an error regarding a particular runtime event" +msgstr "对一个特殊的运行时事件报告错误" + +#: ../../howto/logging.rst:60 +msgid "Raise an exception" +msgstr "引发异常" + +#: ../../howto/logging.rst:63 +msgid "" +"Report suppression of an error without raising an exception (e.g. error " +"handler in a long-running server process)" +msgstr "报告错误而不引发异常 (如在长时间运行中的服务端进程的错误处理)" + +#: ../../howto/logging.rst:63 +msgid "" +"A logger's :meth:`~Logger.error`, :meth:`~Logger.exception` or " +":meth:`~Logger.critical` method as appropriate for the specific error and " +"application domain" +msgstr "" +"日志记录器的 :meth:`~Logger.error`, :meth:`~Logger.exception` 或 " +":meth:`~Logger.critical` 方法分别适用于特定的错误及应用领域" + +#: ../../howto/logging.rst:70 +msgid "" +"The logger methods are named after the level or severity of the events they " +"are used to track. The standard levels and their applicability are described" +" below (in increasing order of severity):" +msgstr "日志记录器方法以它们所追踪的事件级别或严重程度来命名。标准的级别及其适用性如下所述(严重程度从低至高):" + +#: ../../howto/logging.rst:77 ../../howto/logging.rst:875 +msgid "Level" +msgstr "级别" + +#: ../../howto/logging.rst:77 +msgid "When it's used" +msgstr "何时使用" + +#: ../../howto/logging.rst:79 ../../howto/logging.rst:885 +msgid "``DEBUG``" +msgstr "``DEBUG``" + +#: ../../howto/logging.rst:79 +msgid "" +"Detailed information, typically of interest only when diagnosing problems." +msgstr "细节信息,仅当诊断问题时适用。" + +#: ../../howto/logging.rst:82 ../../howto/logging.rst:883 +msgid "``INFO``" +msgstr "``INFO``" + +#: ../../howto/logging.rst:82 +msgid "Confirmation that things are working as expected." +msgstr "确认程序按预期运行。" + +#: ../../howto/logging.rst:85 ../../howto/logging.rst:881 +msgid "``WARNING``" +msgstr "``WARNING``" + +#: ../../howto/logging.rst:85 +msgid "" +"An indication that something unexpected happened, or indicative of some " +"problem in the near future (e.g. 'disk space low'). The software is still " +"working as expected." +msgstr "表明有已经或即将发生的意外(例如:磁盘空间不足)。程序仍按预期进行。" + +#: ../../howto/logging.rst:90 ../../howto/logging.rst:879 +msgid "``ERROR``" +msgstr "``ERROR``" + +#: ../../howto/logging.rst:90 +msgid "" +"Due to a more serious problem, the software has not been able to perform " +"some function." +msgstr "由于严重的问题,程序的某些功能已经不能正常执行" + +#: ../../howto/logging.rst:93 ../../howto/logging.rst:877 +msgid "``CRITICAL``" +msgstr "``CRITICAL``" + +#: ../../howto/logging.rst:93 +msgid "" +"A serious error, indicating that the program itself may be unable to " +"continue running." +msgstr "严重的错误,表明程序已不能继续执行" + +#: ../../howto/logging.rst:97 +msgid "" +"The default level is ``WARNING``, which means that only events of this " +"severity and higher will be tracked, unless the logging package is " +"configured to do otherwise." +msgstr "默认的级别是 ``WARNING``,意味着只会追踪该严重程度及以上的事件,除非 logging 包另有其他配置。" + +#: ../../howto/logging.rst:100 +msgid "" +"Events that are tracked can be handled in different ways. The simplest way " +"of handling tracked events is to print them to the console. Another common " +"way is to write them to a disk file." +msgstr "所追踪事件可以以不同形式处理。最简单的方式是输出到控制台。另一种常用的方式是写入磁盘文件。" + +#: ../../howto/logging.rst:108 +msgid "A simple example" +msgstr "一个简单的例子" + +#: ../../howto/logging.rst:110 +msgid "A very simple example is::" +msgstr "一个非常简单的例子::" + +#: ../../howto/logging.rst:112 +msgid "" +"import logging\n" +"logging.warning('Watch out!') # will print a message to the console\n" +"logging.info('I told you so') # will not print anything" +msgstr "" +"import logging\n" +"logging.warning('Watch out!') # 将打印一条消息到控制台\n" +"logging.info('I told you so') # 将不打印任何消息" + +#: ../../howto/logging.rst:116 +msgid "If you type these lines into a script and run it, you'll see:" +msgstr "如果你在命令行中输入这些代码并运行,你将会看到:" + +#: ../../howto/logging.rst:118 +msgid "WARNING:root:Watch out!" +msgstr "WARNING:root:Watch out!" + +#: ../../howto/logging.rst:122 +msgid "" +"printed out on the console. The ``INFO`` message doesn't appear because the " +"default level is ``WARNING``. The printed message includes the indication of" +" the level and the description of the event provided in the logging call, " +"i.e. 'Watch out!'. The actual output can be formatted quite flexibly if you " +"need that; formatting options will also be explained later." +msgstr "" +"在控制台上打印出来。``INFO`` 消息没有出现是因为默认级别为 ``WARNING``。 " +"打印的消息包括在日志记录调用中提供的事件级别和描述信息,例如 'Watch out!'。 " +"实际输出可以按你的需要相当灵活地格式化;格式化选项也将在后文中进行说明。" + +#: ../../howto/logging.rst:128 +msgid "" +"Notice that in this example, we use functions directly on the ``logging`` " +"module, like ``logging.debug``, rather than creating a logger and calling " +"functions on it. These functions operate on the root logger, but can be " +"useful as they will call :func:`~logging.basicConfig` for you if it has not " +"been called yet, like in this example. In larger programs you'll usually " +"want to control the logging configuration explicitly however - so for that " +"reason as well as others, it's better to create loggers and call their " +"methods." +msgstr "" +"请注意在这个例子中,我们是直接使用 ``logging`` 模块的函数,比如 ``logging.debug``,而不是创建一个日志记录器并调用其方法。" +" 这些函数作用于根日志记录器,但它们在未被调用时将会调用 :func:`~logging.basicConfig` 来发挥作用,就像在这个例子中那样。 " +"然而在更大的程序中你通常会需要显式地控制日志记录的配置 —— 所以出于这样那样的理由,最好还是创建日志记录器并调用其方法。" + +#: ../../howto/logging.rst:137 +msgid "Logging to a file" +msgstr "记录日志到文件" + +#: ../../howto/logging.rst:139 +msgid "" +"A very common situation is that of recording logging events in a file, so " +"let's look at that next. Be sure to try the following in a newly started " +"Python interpreter, and don't just continue from the session described " +"above::" +msgstr "" +"一种很常见的情况是将日志事件记录到文件中,下面让我们来看这个问题。请确认在一个新启动的 Python " +"解释器中尝试以下操作,而非在上面描述的会话中继续::" + +#: ../../howto/logging.rst:143 +msgid "" +"import logging\n" +"logger = logging.getLogger(__name__)\n" +"logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG)\n" +"logger.debug('This message should go to the log file')\n" +"logger.info('So should this')\n" +"logger.warning('And this, too')\n" +"logger.error('And non-ASCII stuff, too, like Øresund and Malmö')" +msgstr "" +"import logging\n" +"logger = logging.getLogger(__name__)\n" +"logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG)\n" +"logger.debug('This message should go to the log file')\n" +"logger.info('So should this')\n" +"logger.warning('And this, too')\n" +"logger.error('And non-ASCII stuff, too, like Øresund and Malmö')" + +#: ../../howto/logging.rst:151 +msgid "" +"The *encoding* argument was added. In earlier Python versions, or if not " +"specified, the encoding used is the default value used by :func:`open`. " +"While not shown in the above example, an *errors* argument can also now be " +"passed, which determines how encoding errors are handled. For available " +"values and the default, see the documentation for :func:`open`." +msgstr "" +"增加了 *encoding* 参数。在更早的 Python 版本中或没有指定时,编码会用 :func:`open` " +"使用的默认值。尽管在上面的例子中没有展示,但也可以传入一个决定如何处理编码错误的 *errors* 参数。可使用的值和默认值,请参照 " +":func:`open` 的文档。" + +#: ../../howto/logging.rst:158 +msgid "" +"And now if we open the file and look at what we have, we should find the log" +" messages:" +msgstr "现在,如果我们打开日志文件,我们应当能看到日志信息:" + +#: ../../howto/logging.rst:161 +msgid "" +"DEBUG:__main__:This message should go to the log file\n" +"INFO:__main__:So should this\n" +"WARNING:__main__:And this, too\n" +"ERROR:__main__:And non-ASCII stuff, too, like Øresund and Malmö" +msgstr "" +"DEBUG:__main__:This message should go to the log file\n" +"INFO:__main__:So should this\n" +"WARNING:__main__:And this, too\n" +"ERROR:__main__:And non-ASCII stuff, too, like Øresund and Malmö" + +#: ../../howto/logging.rst:168 +msgid "" +"This example also shows how you can set the logging level which acts as the " +"threshold for tracking. In this case, because we set the threshold to " +"``DEBUG``, all of the messages were printed." +msgstr "该示例同样展示了如何设置日志追踪级别的阈值。该示例中,由于我们设置的阈值是 ``DEBUG``,所有信息都将被打印。" + +#: ../../howto/logging.rst:172 +msgid "" +"If you want to set the logging level from a command-line option such as:" +msgstr "如果你想从命令行设置日志级别,例如:" + +#: ../../howto/logging.rst:174 +msgid "--log=INFO" +msgstr "--log=INFO" + +#: ../../howto/logging.rst:178 +msgid "" +"and you have the value of the parameter passed for ``--log`` in some " +"variable *loglevel*, you can use::" +msgstr "并且你将 ``--log`` 命令的参数存进了变量 *loglevel*,你可以用:" + +#: ../../howto/logging.rst:181 +msgid "getattr(logging, loglevel.upper())" +msgstr "getattr(logging, loglevel.upper())" + +#: ../../howto/logging.rst:183 +msgid "" +"to get the value which you'll pass to :func:`basicConfig` via the *level* " +"argument. You may want to error check any user input value, perhaps as in " +"the following example::" +msgstr "获取要通过 *level* 参数传给 :func:`basicConfig` 的值。可如下对用户输入值进行错误检查:" + +#: ../../howto/logging.rst:187 +msgid "" +"# assuming loglevel is bound to the string value obtained from the\n" +"# command line argument. Convert to upper case to allow the user to\n" +"# specify --log=DEBUG or --log=debug\n" +"numeric_level = getattr(logging, loglevel.upper(), None)\n" +"if not isinstance(numeric_level, int):\n" +" raise ValueError('Invalid log level: %s' % loglevel)\n" +"logging.basicConfig(level=numeric_level, ...)" +msgstr "" +"# 假定 loglevel 绑定到从命令行参数获取的字符串值。\n" +"# 转换为大写形式以允许用户指定 --log=DEBUG 或 --log=debug\n" +"numeric_level = getattr(logging, loglevel.upper(), None)\n" +"if not isinstance(numeric_level, int):\n" +" raise ValueError('Invalid log level: %s' % loglevel)\n" +"logging.basicConfig(level=numeric_level, ...)" + +#: ../../howto/logging.rst:195 +msgid "" +"The call to :func:`basicConfig` should come *before* any calls to a logger's" +" methods such as :meth:`~Logger.debug`, :meth:`~Logger.info`, etc. " +"Otherwise, that logging event may not be handled in the desired manner." +msgstr "" +"对 :func:`basicConfig` 的调用应当在任何对日志记录器方法的调用如 :meth:`~Logger.debug`, " +":meth:`~Logger.info` 等 *之前* 执行。否则,日志记录事件可能无法以预期的方式来处理。" + +#: ../../howto/logging.rst:199 +msgid "" +"If you run the above script several times, the messages from successive runs" +" are appended to the file *example.log*. If you want each run to start " +"afresh, not remembering the messages from earlier runs, you can specify the " +"*filemode* argument, by changing the call in the above example to::" +msgstr "" +"如果多次运行上述脚本,则连续运行的消息将追加到文件 *example.log* 。 " +"如果你希望每次运行重新开始,而不是记住先前运行的消息,则可以通过将上例中的调用更改为来指定 *filemode* 参数::" + +#: ../../howto/logging.rst:204 +msgid "" +"logging.basicConfig(filename='example.log', filemode='w', " +"level=logging.DEBUG)" +msgstr "" +"logging.basicConfig(filename='example.log', filemode='w', " +"level=logging.DEBUG)" + +#: ../../howto/logging.rst:206 +msgid "" +"The output will be the same as before, but the log file is no longer " +"appended to, so the messages from earlier runs are lost." +msgstr "输出将与之前相同,但不再追加进日志文件,因此早期运行的消息将丢失。" + +#: ../../howto/logging.rst:211 +msgid "Logging variable data" +msgstr "记录变量数据" + +#: ../../howto/logging.rst:213 +msgid "" +"To log variable data, use a format string for the event description message " +"and append the variable data as arguments. For example::" +msgstr "要记录变量数据,请使用格式字符串作为事件描述消息,并附加传入变量数据作为参数。例如::" + +#: ../../howto/logging.rst:216 +msgid "" +"import logging\n" +"logging.warning('%s before you %s', 'Look', 'leap!')" +msgstr "" +"import logging\n" +"logging.warning('%s before you %s', 'Look', 'leap!')" + +#: ../../howto/logging.rst:219 +msgid "will display:" +msgstr "将显示:" + +#: ../../howto/logging.rst:221 +msgid "WARNING:root:Look before you leap!" +msgstr "WARNING:root:Look before you leap!" + +#: ../../howto/logging.rst:225 +msgid "" +"As you can see, merging of variable data into the event description message " +"uses the old, %-style of string formatting. This is for backwards " +"compatibility: the logging package pre-dates newer formatting options such " +"as :meth:`str.format` and :class:`string.Template`. These newer formatting " +"options *are* supported, but exploring them is outside the scope of this " +"tutorial: see :ref:`formatting-styles` for more information." +msgstr "" +"如你所见,将可变数据合并到事件描述消息中使用旧的 % 形式的字符串格式化。这是为了向后兼容:logging 包的出现时间早于较新的格式化选项例如 " +":meth:`str.format` 和 :class:`string.Template`。这些较新格式化选项 *是* " +"受支持的,但探索它们超出了本教程的范围:有关详细信息,请参阅 :ref:`formatting-styles`。" + +#: ../../howto/logging.rst:234 +msgid "Changing the format of displayed messages" +msgstr "更改显示消息的格式" + +#: ../../howto/logging.rst:236 +msgid "" +"To change the format which is used to display messages, you need to specify " +"the format you want to use::" +msgstr "要更改用于显示消息的格式,你需要指定要使用的格式::" + +#: ../../howto/logging.rst:239 +msgid "" +"import logging\n" +"logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)\n" +"logging.debug('This message should appear on the console')\n" +"logging.info('So should this')\n" +"logging.warning('And this, too')" +msgstr "" +"import logging\n" +"logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)\n" +"logging.debug('This message should appear on the console')\n" +"logging.info('So should this')\n" +"logging.warning('And this, too')" + +#: ../../howto/logging.rst:245 +msgid "which would print:" +msgstr "这将输出:" + +#: ../../howto/logging.rst:247 +msgid "" +"DEBUG:This message should appear on the console\n" +"INFO:So should this\n" +"WARNING:And this, too" +msgstr "" +"DEBUG:This message should appear on the console\n" +"INFO:So should this\n" +"WARNING:And this, too" + +#: ../../howto/logging.rst:253 +msgid "" +"Notice that the 'root' which appeared in earlier examples has disappeared. " +"For a full set of things that can appear in format strings, you can refer to" +" the documentation for :ref:`logrecord-attributes`, but for simple usage, " +"you just need the *levelname* (severity), *message* (event description, " +"including variable data) and perhaps to display when the event occurred. " +"This is described in the next section." +msgstr "" +"注意在前面例子中出现的“root”已消失。文档 :ref:`logrecord-attributes` " +"列出了可在格式字符串中出现的所有内容,但在简单的使用场景中,你只需要 *levelname* (严重性)、*message* " +"(事件描述,包含可变的数据)或许再加上事件发生的时间。这将在下一节中介绍。" + +#: ../../howto/logging.rst:262 +msgid "Displaying the date/time in messages" +msgstr "在消息中显示日期/时间" + +#: ../../howto/logging.rst:264 +msgid "" +"To display the date and time of an event, you would place '%(asctime)s' in " +"your format string::" +msgstr "要显示事件的日期和时间,你可以在格式字符串中放置 '%(asctime)s' ::" + +#: ../../howto/logging.rst:267 +msgid "" +"import logging\n" +"logging.basicConfig(format='%(asctime)s %(message)s')\n" +"logging.warning('is when this event was logged.')" +msgstr "" +"import logging\n" +"logging.basicConfig(format='%(asctime)s %(message)s')\n" +"logging.warning('is when this event was logged.')" + +#: ../../howto/logging.rst:271 +msgid "which should print something like this:" +msgstr "应该打印这样的东西:" + +#: ../../howto/logging.rst:273 +msgid "2010-12-12 11:41:42,612 is when this event was logged." +msgstr "2010-12-12 11:41:42,612 is when this event was logged." + +#: ../../howto/logging.rst:277 +msgid "" +"The default format for date/time display (shown above) is like ISO8601 or " +":rfc:`3339`. If you need more control over the formatting of the date/time, " +"provide a *datefmt* argument to ``basicConfig``, as in this example::" +msgstr "" +"日期/时间显示的默认格式(如上所示)类似于 ISO8601 或 :rfc:`3339`。如果你需要更多地控制日期/时间的格式,请为 " +"``basicConfig`` 提供 *datefmt* 参数,如下例所示::" + +#: ../../howto/logging.rst:281 +msgid "" +"import logging\n" +"logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')\n" +"logging.warning('is when this event was logged.')" +msgstr "" +"import logging\n" +"logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')\n" +"logging.warning('is when this event was logged.')" + +#: ../../howto/logging.rst:285 +msgid "which would display something like this:" +msgstr "这会显示如下内容:" + +#: ../../howto/logging.rst:287 +msgid "12/12/2010 11:46:36 AM is when this event was logged." +msgstr "12/12/2010 11:46:36 AM is when this event was logged." + +#: ../../howto/logging.rst:291 +msgid "" +"The format of the *datefmt* argument is the same as supported by " +":func:`time.strftime`." +msgstr "*datefmt* 参数的格式与 :func:`time.strftime` 支持的格式相同。" + +#: ../../howto/logging.rst:296 +msgid "Next Steps" +msgstr "后续步骤" + +#: ../../howto/logging.rst:298 +msgid "" +"That concludes the basic tutorial. It should be enough to get you up and " +"running with logging. There's a lot more that the logging package offers, " +"but to get the best out of it, you'll need to invest a little more of your " +"time in reading the following sections. If you're ready for that, grab some " +"of your favourite beverage and carry on." +msgstr "" +"基本教程到此结束。它应该足以让你启动并运行日志记录。logging 包提供了更多功能,但为了充分利用它,你需要花更多的时间来阅读以下部分。 " +"如果你准备好了,可以拿一些你最喜欢的饮料然后继续。" + +#: ../../howto/logging.rst:304 +msgid "" +"If your logging needs are simple, then use the above examples to incorporate" +" logging into your own scripts, and if you run into problems or don't " +"understand something, please post a question in the Help category of the " +"`Python discussion forum `_ and you " +"should receive help before too long." +msgstr "" +"如果你的日志记录需求较为简单,那么可以使用上述示例将日志功能集成到你自己的脚本中。如果在操作过程中遇到问题或对某些内容不理解,你可以在 `Python " +"讨论论坛 `_ 的“帮助”分类下发布问题,通常很快就会得到帮助。" + +#: ../../howto/logging.rst:310 +msgid "" +"Still here? You can carry on reading the next few sections, which provide a " +"slightly more advanced/in-depth tutorial than the basic one above. After " +"that, you can take a look at the :ref:`logging-cookbook`." +msgstr "" +"还不够?你可以继续阅读接下来的几个部分,这些部分提供了比上面基本部分更高级或深入的教程。之后,你可以看一下 :ref:`logging-" +"cookbook` ." + +#: ../../howto/logging.rst:318 +msgid "Advanced Logging Tutorial" +msgstr "进阶日志教程" + +#: ../../howto/logging.rst:320 +msgid "" +"The logging library takes a modular approach and offers several categories " +"of components: loggers, handlers, filters, and formatters." +msgstr "日志库采用模块化方法,并提供几类组件:记录器、处理器、过滤器和格式器。" + +#: ../../howto/logging.rst:323 +msgid "Loggers expose the interface that application code directly uses." +msgstr "记录器暴露了应用程序代码直接使用的接口。" + +#: ../../howto/logging.rst:324 +msgid "" +"Handlers send the log records (created by loggers) to the appropriate " +"destination." +msgstr "处理器将日志记录(由记录器创建)发送到适当的目标。" + +#: ../../howto/logging.rst:326 +msgid "" +"Filters provide a finer grained facility for determining which log records " +"to output." +msgstr "过滤器提供了更细粒度的功能,用于确定要输出的日志记录。" + +#: ../../howto/logging.rst:328 +msgid "Formatters specify the layout of log records in the final output." +msgstr "格式器指定最终输出中日志记录的样式。" + +#: ../../howto/logging.rst:330 +msgid "" +"Log event information is passed between loggers, handlers, filters and " +"formatters in a :class:`LogRecord` instance." +msgstr "日志事件信息在 :class:`LogRecord` 实例中的记录器、处理器、过滤器和格式器之间传递。" + +#: ../../howto/logging.rst:333 +msgid "" +"Logging is performed by calling methods on instances of the :class:`Logger` " +"class (hereafter called :dfn:`loggers`). Each instance has a name, and they " +"are conceptually arranged in a namespace hierarchy using dots (periods) as " +"separators. For example, a logger named 'scan' is the parent of loggers " +"'scan.text', 'scan.html' and 'scan.pdf'. Logger names can be anything you " +"want, and indicate the area of an application in which a logged message " +"originates." +msgstr "" +"通过调用 :class:`Logger` 类(以下称为 :dfn:`loggers`,记录器)的实例来执行日志记录。 " +"每个实例都有一个名称,它们在概念上以点(句点)作为分隔符排列在命名空间的层次结构中。例如,名为 'scan' 的记录器是记录器 'scan.text' " +",'scan.html' 和 'scan.pdf' 的父级。记录器名称可以是你想要的任何名称,并指示记录消息源自的应用程序区域。" + +#: ../../howto/logging.rst:340 +msgid "" +"A good convention to use when naming loggers is to use a module-level " +"logger, in each module which uses logging, named as follows::" +msgstr "在命名记录器时使用的一个好习惯是在每个使用日志记录的模块中使用模块级记录器,命名如下::" + +#: ../../howto/logging.rst:343 +msgid "logger = logging.getLogger(__name__)" +msgstr "logger = logging.getLogger(__name__)" + +#: ../../howto/logging.rst:345 +msgid "" +"This means that logger names track the package/module hierarchy, and it's " +"intuitively obvious where events are logged just from the logger name." +msgstr "这意味着记录器名称跟踪包或模块的层次结构,并且直观地从记录器名称显示记录事件的位置。" + +#: ../../howto/logging.rst:348 +msgid "" +"The root of the hierarchy of loggers is called the root logger. That's the " +"logger used by the functions :func:`debug`, :func:`info`, :func:`warning`, " +":func:`error` and :func:`critical`, which just call the same-named method of" +" the root logger. The functions and the methods have the same signatures. " +"The root logger's name is printed as 'root' in the logged output." +msgstr "" +"记录器层次结构的根称为根记录器。这是函数 :func:`debug`、 :func:`info`、 :func:`warning`、 " +":func:`error` 和 :func:`critical` 使用的记录器,它们就是调用了根记录器的同名方法。函数和方法具有相同的签名。 " +"根记录器的名称在输出中打印为 'root' 。" + +#: ../../howto/logging.rst:354 +msgid "" +"It is, of course, possible to log messages to different destinations. " +"Support is included in the package for writing log messages to files, HTTP " +"GET/POST locations, email via SMTP, generic sockets, queues, or OS-specific " +"logging mechanisms such as syslog or the Windows NT event log. Destinations " +"are served by :dfn:`handler` classes. You can create your own log " +"destination class if you have special requirements not met by any of the " +"built-in handler classes." +msgstr "" +"当然,可以将消息记录到不同的地方。软件包中的支持包含,用于将日志消息写入文件、HTTP GET/POST 位置、通过 SMTP " +"发送电子邮件、通用套接字、队列或特定于操作系统的日志记录机制(如 syslog 或 Windows NT 事件日志)。目标由 " +":dfn:`handler` 类提供。如果你有任何内置处理器类未满足的特殊要求,则可以创建自己的日志目标类。" + +#: ../../howto/logging.rst:361 +msgid "" +"By default, no destination is set for any logging messages. You can specify " +"a destination (such as console or file) by using :func:`basicConfig` as in " +"the tutorial examples. If you call the functions :func:`debug`, " +":func:`info`, :func:`warning`, :func:`error` and :func:`critical`, they will" +" check to see if no destination is set; and if one is not set, they will set" +" a destination of the console (``sys.stderr``) and a default format for the " +"displayed message before delegating to the root logger to do the actual " +"message output." +msgstr "" +"默认情况下,没有为任何日志消息设置目标。你可以使用 :func:`basicConfig` 指定目标(例如控制台或文件),如教程示例中所示。 " +"如果你调用函数 :func:`debug`、 :func:`info`、 :func:`warning`、 :func:`error` 和 " +":func:`critical`,它们将检查是否有设置目标;如果没有设置,将在委托给根记录器进行实际的消息输出之前设置目标为控制台 " +"(``sys.stderr``) 并设置显示消息的默认格式。" + +#: ../../howto/logging.rst:369 +msgid "The default format set by :func:`basicConfig` for messages is:" +msgstr "由 :func:`basicConfig` 设置的消息默认格式为:" + +#: ../../howto/logging.rst:371 +msgid "severity:logger name:message" +msgstr "严重等级:日志记录器名称:消息" + +#: ../../howto/logging.rst:375 +msgid "" +"You can change this by passing a format string to :func:`basicConfig` with " +"the *format* keyword argument. For all options regarding how a format string" +" is constructed, see :ref:`formatter-objects`." +msgstr "" +"你可以通过使用 *format* 参数将格式字符串传递给 :func:`basicConfig` 来更改此设置。有关如何构造格式字符串的所有选项,请参阅" +" :ref:`formatter-objects` 。" + +#: ../../howto/logging.rst:380 +msgid "Logging Flow" +msgstr "记录流程" + +#: ../../howto/logging.rst:382 +msgid "" +"The flow of log event information in loggers and handlers is illustrated in " +"the following diagram." +msgstr "记录器和处理器中的日志事件信息流程如下图所示。" + +#: ../../howto/logging.rst:433 +msgid "Loggers" +msgstr "记录器" + +#: ../../howto/logging.rst:435 +msgid "" +":class:`Logger` objects have a threefold job. First, they expose several " +"methods to application code so that applications can log messages at " +"runtime. Second, logger objects determine which log messages to act upon " +"based upon severity (the default filtering facility) or filter objects. " +"Third, logger objects pass along relevant log messages to all interested log" +" handlers." +msgstr "" +":class:`Logger` " +"对象有三重任务。首先,它们向应用程序代码公开了几种方法,以便应用程序可以在运行时记录消息。其次,记录器对象根据严重性(默认过滤工具)或过滤器对象确定要处理的日志消息。第三,记录器对象将相关的日志消息传递给所有感兴趣的日志处理器。" + +#: ../../howto/logging.rst:441 +msgid "" +"The most widely used methods on logger objects fall into two categories: " +"configuration and message sending." +msgstr "记录器对象上使用最广泛的方法分为两类:配置和消息发送。" + +#: ../../howto/logging.rst:444 +msgid "These are the most common configuration methods:" +msgstr "这些是最常见的配置方法:" + +#: ../../howto/logging.rst:446 +msgid "" +":meth:`Logger.setLevel` specifies the lowest-severity log message a logger " +"will handle, where debug is the lowest built-in severity level and critical " +"is the highest built-in severity. For example, if the severity level is " +"INFO, the logger will handle only INFO, WARNING, ERROR, and CRITICAL " +"messages and will ignore DEBUG messages." +msgstr "" +":meth:`Logger.setLevel` 指定记录器将处理的最低严重性日志消息,其中 debug 是最低内置严重性级别,critical " +"是最高内置严重性级别。例如,如果严重性级别为 INFO,则记录器将仅处理 INFO、WARNING、ERROR 和 CRITICAL 消息,并将忽略 " +"DEBUG 消息。" + +#: ../../howto/logging.rst:452 +msgid "" +":meth:`Logger.addHandler` and :meth:`Logger.removeHandler` add and remove " +"handler objects from the logger object. Handlers are covered in more detail" +" in :ref:`handler-basic`." +msgstr "" +":meth:`Logger.addHandler` 和 :meth:`Logger.removeHandler` " +"从记录器对象中添加和删除处理器对象。处理器在以下内容中有更详细的介绍 :ref:`handler-basic`。" + +#: ../../howto/logging.rst:456 +msgid "" +":meth:`Logger.addFilter` and :meth:`Logger.removeFilter` add and remove " +"filter objects from the logger object. Filters are covered in more detail " +"in :ref:`filter`." +msgstr "" +":meth:`Logger.addFilter` 和 :meth:`Logger.removeFilter` 可以添加或移除记录器对象中的过滤器。 " +":ref:`filter` 包含更多的过滤器细节。" + +#: ../../howto/logging.rst:460 +msgid "" +"You don't need to always call these methods on every logger you create. See " +"the last two paragraphs in this section." +msgstr "你不需要总是在你创建的每个记录器上都调用这些方法。请参阅本节的最后两段。" + +#: ../../howto/logging.rst:463 +msgid "" +"With the logger object configured, the following methods create log " +"messages:" +msgstr "配置记录器对象后,以下方法将创建日志消息:" + +#: ../../howto/logging.rst:465 +msgid "" +":meth:`Logger.debug`, :meth:`Logger.info`, :meth:`Logger.warning`, " +":meth:`Logger.error`, and :meth:`Logger.critical` all create log records " +"with a message and a level that corresponds to their respective method " +"names. The message is actually a format string, which may contain the " +"standard string substitution syntax of ``%s``, ``%d``, ``%f``, and so on. " +"The rest of their arguments is a list of objects that correspond with the " +"substitution fields in the message. With regard to ``**kwargs``, the " +"logging methods care only about a keyword of ``exc_info`` and use it to " +"determine whether to log exception information." +msgstr "" +":meth:`Logger.debug` , :meth:`Logger.info` , :meth:`Logger.warning` , " +":meth:`Logger.error` 和 :meth:`Logger.critical` " +"都创建日志记录,包含消息和与其各自方法名称对应的级别。该消息实际上是一个格式化字符串,它可能包含标准字符串替换语法 ``%s``、``%d``、 " +"``%f`` 等等。其余参数是与消息中的替换字段对应的对象列表。关于 ``**kwargs``,日志记录方法只关注 ``exc_info`` " +"的关键字,并用它来确定是否记录异常信息。" + +#: ../../howto/logging.rst:475 +msgid "" +":meth:`Logger.exception` creates a log message similar to " +":meth:`Logger.error`. The difference is that :meth:`Logger.exception` dumps" +" a stack trace along with it. Call this method only from an exception " +"handler." +msgstr "" +":meth:`Logger.exception` 创建与 :meth:`Logger.error` 相似的日志信息。不同之处是, " +":meth:`Logger.exception` 同时还记录当前的堆栈追踪。仅从异常处理程序调用此方法。" + +#: ../../howto/logging.rst:479 +msgid "" +":meth:`Logger.log` takes a log level as an explicit argument. This is a " +"little more verbose for logging messages than using the log level " +"convenience methods listed above, but this is how to log at custom log " +"levels." +msgstr "" +":meth:`Logger.log` " +"将日志级别作为显式参数。对于记录消息而言,这比使用上面列出的日志级别便利方法更加冗长,但这是使用自定义日志级别的方法。" + +#: ../../howto/logging.rst:483 +msgid "" +":func:`getLogger` returns a reference to a logger instance with the " +"specified name if it is provided, or ``root`` if not. The names are period-" +"separated hierarchical structures. Multiple calls to :func:`getLogger` with" +" the same name will return a reference to the same logger object. Loggers " +"that are further down in the hierarchical list are children of loggers " +"higher up in the list. For example, given a logger with a name of ``foo``, " +"loggers with names of ``foo.bar``, ``foo.bar.baz``, and ``foo.bam`` are all " +"descendants of ``foo``." +msgstr "" +":func:`getLogger` 返回对具有指定名称的记录器实例的引用(如果已提供),或者如果没有则返回 ``root`` " +"。名称是以句点分隔的层次结构。多次调用 :func:`getLogger` " +"具有相同的名称将返回对同一记录器对象的引用。在分层列表中较低的记录器是列表中较高的记录器的子项。例如,给定一个名为 ``foo`` 的记录器,名称为 " +"``foo.bar``、``foo.bar.baz`` 和 ``foo.bam`` 的记录器都是 ``foo`` 子项。" + +#: ../../howto/logging.rst:491 +msgid "" +"Loggers have a concept of *effective level*. If a level is not explicitly " +"set on a logger, the level of its parent is used instead as its effective " +"level. If the parent has no explicit level set, *its* parent is examined, " +"and so on - all ancestors are searched until an explicitly set level is " +"found. The root logger always has an explicit level set (``WARNING`` by " +"default). When deciding whether to process an event, the effective level of " +"the logger is used to determine whether the event is passed to the logger's " +"handlers." +msgstr "" +"记录器具有 *有效等级* 的概念。如果未在记录器上显式设置级别,则使用其父记录器的级别作为其有效级别。如果父记录器没有明确的级别设置,则检查 *其* " +"父级。依此类推,搜索所有上级元素,直到找到明确设置的级别。根记录器始终具有明确的级别配置(默认情况下为 ``WARNING`` " +")。在决定是否处理事件时,记录器的有效级别用于确定事件是否传递给记录器相关的处理器。" + +#: ../../howto/logging.rst:499 +msgid "" +"Child loggers propagate messages up to the handlers associated with their " +"ancestor loggers. Because of this, it is unnecessary to define and configure" +" handlers for all the loggers an application uses. It is sufficient to " +"configure handlers for a top-level logger and create child loggers as " +"needed. (You can, however, turn off propagation by setting the *propagate* " +"attribute of a logger to ``False``.)" +msgstr "" +"子记录器将消息传播到与其父级记录器关联的处理器。因此,不必为应用程序使用的所有记录器定义和配置处理器。一般为顶级记录器配置处理器,再根据需要创建子记录器就足够了。(但是,你可以通过将记录器的" +" *propagate* 属性设置为 ``False`` 来关闭传播。)" + +#: ../../howto/logging.rst:510 +msgid "Handlers" +msgstr "处理器" + +#: ../../howto/logging.rst:512 +msgid "" +":class:`~logging.Handler` objects are responsible for dispatching the " +"appropriate log messages (based on the log messages' severity) to the " +"handler's specified destination. :class:`Logger` objects can add zero or " +"more handler objects to themselves with an :meth:`~Logger.addHandler` " +"method. As an example scenario, an application may want to send all log " +"messages to a log file, all log messages of error or higher to stdout, and " +"all messages of critical to an email address. This scenario requires three " +"individual handlers where each handler is responsible for sending messages " +"of a specific severity to a specific location." +msgstr "" +":class:`~logging.Handler` 对象负责将适当的日志消息(基于日志消息的严重性)分派给处理器的指定目标。 " +":class:`Logger` 对象可以使用 :meth:`~Logger.addHandler` " +"方法向自己添加零个或多个处理器对象。作为示例场景,应用程序可能希望将所有日志消息发送到日志文件,将错误或更高的所有日志消息发送到标准输出,以及将所有关键消息发送至一个邮件地址。" +" 此方案需要三个单独的处理器,其中每个处理器负责将特定严重性的消息发送到特定位置。" + +#: ../../howto/logging.rst:522 +msgid "" +"The standard library includes quite a few handler types (see :ref:`useful-" +"handlers`); the tutorials use mainly :class:`StreamHandler` and " +":class:`FileHandler` in its examples." +msgstr "" +"标准库包含很多处理器类型 (参见 :ref:`useful-handlers`);教程主要使用 :class:`StreamHandler` 和 " +":class:`FileHandler`。" + +#: ../../howto/logging.rst:526 +msgid "" +"There are very few methods in a handler for application developers to " +"concern themselves with. The only handler methods that seem relevant for " +"application developers who are using the built-in handler objects (that is, " +"not creating custom handlers) are the following configuration methods:" +msgstr "处理器中很少有方法可供应用程序开发人员使用。使用内置处理器对象(即不创建自定义处理器)的应用程序开发人员能用到的仅有以下配置方法:" + +#: ../../howto/logging.rst:531 +msgid "" +"The :meth:`~Handler.setLevel` method, just as in logger objects, specifies " +"the lowest severity that will be dispatched to the appropriate destination." +" Why are there two :meth:`~Handler.setLevel` methods? The level set in the" +" logger determines which severity of messages it will pass to its handlers." +" The level set in each handler determines which messages that handler will " +"send on." +msgstr "" +":meth:`~Handler.setLevel` 方法,就像在日志记录器对象中一样,指定将被分派到适当目标的最低严重性。为什么有两个 " +":meth:`~Handler.setLevel` 方法?在日志记录器中设置的级别确定要传递给其处理器的消息的严重性。 " +"每个处理器中设置的级别则确定该处理器将发送哪些消息。" + +#: ../../howto/logging.rst:537 +msgid "" +":meth:`~Handler.setFormatter` selects a Formatter object for this handler to" +" use." +msgstr ":meth:`~Handler.setFormatter` 选择一个该处理器使用的 Formatter 对象。" + +#: ../../howto/logging.rst:540 +msgid "" +":meth:`~Handler.addFilter` and :meth:`~Handler.removeFilter` respectively " +"configure and deconfigure filter objects on handlers." +msgstr "" +":meth:`~Handler.addFilter` 和 :meth:`~Handler.removeFilter` " +"分别在处理器上配置和取消配置过滤器对象。" + +#: ../../howto/logging.rst:543 +msgid "" +"Application code should not directly instantiate and use instances of " +":class:`Handler`. Instead, the :class:`Handler` class is a base class that " +"defines the interface that all handlers should have and establishes some " +"default behavior that child classes can use (or override)." +msgstr "" +"应用程序代码不应直接实例化并使用 :class:`Handler` 的实例。相反, :class:`Handler` " +"类是一个基类,它定义了所有处理器应该具有的接口,并建立了子类可以使用(或覆盖)的一些默认行为。" + +#: ../../howto/logging.rst:550 +msgid "Formatters" +msgstr "格式器" + +#: ../../howto/logging.rst:552 +msgid "" +"Formatter objects configure the final order, structure, and contents of the " +"log message. Unlike the base :class:`logging.Handler` class, application " +"code may instantiate formatter classes, although you could likely subclass " +"the formatter if your application needs special behavior. The constructor " +"takes three optional arguments -- a message format string, a date format " +"string and a style indicator." +msgstr "" +"格式化器对象配置日志消息的最终顺序、结构和内容。与 :class:`logging.Handler` " +"类不同,应用程序代码可以实例化格式器类,但如果应用程序需要特殊行为,则可能会对格式化器进行子类化定制。构造函数有三个可选参数 —— " +"消息格式字符串、日期格式字符串和样式指示符。" + +#: ../../howto/logging.rst:561 +msgid "" +"If there is no message format string, the default is to use the raw message." +" If there is no date format string, the default date format is:" +msgstr "如果没有消息格式字符串,则默认使用原始消息。如果没有日期格式字符串,则默认日期格式为:" + +#: ../../howto/logging.rst:564 +msgid "%Y-%m-%d %H:%M:%S" +msgstr "%Y-%m-%d %H:%M:%S" + +#: ../../howto/logging.rst:568 +msgid "" +"with the milliseconds tacked on at the end. The ``style`` is one of ``'%'``," +" ``'{'``, or ``'$'``. If one of these is not specified, then ``'%'`` will be" +" used." +msgstr "" +"在末尾加上毫秒数。``style`` 是 ``'%'``, ``'{'`` 或 ``'$'`` 之一。如果未指定其中之一,则将使用 ``'%'``。" + +#: ../../howto/logging.rst:571 +msgid "" +"If the ``style`` is ``'%'``, the message format string uses ``%()s`` styled string substitution; the possible keys are documented in " +":ref:`logrecord-attributes`. If the style is ``'{'``, the message format " +"string is assumed to be compatible with :meth:`str.format` (using keyword " +"arguments), while if the style is ``'$'`` then the message format string " +"should conform to what is expected by :meth:`string.Template.substitute`." +msgstr "" +"如果 ``style`` 为 ``'%'``,则消息格式字符串将使用 ``%()s`` " +"样式的字符串替换;可用的键值记录在 :ref:`logrecord-attributes` 中。如果样式为 ``'{'``,则将假定消息格式字符串与 " +":meth:`str.format` 兼容(使用关键字参数),而如果样式为 ``'$'`` 则消息格式字符串应当符合 " +":meth:`string.Template.substitute` 的预期。" + +#: ../../howto/logging.rst:578 +msgid "Added the ``style`` parameter." +msgstr "添加 ``style`` 形参。" + +#: ../../howto/logging.rst:581 +msgid "" +"The following message format string will log the time in a human-readable " +"format, the severity of the message, and the contents of the message, in " +"that order::" +msgstr "以下消息格式字符串将以人类可读的格式记录时间、消息的严重性以及消息的内容,按此顺序::" + +#: ../../howto/logging.rst:585 +msgid "'%(asctime)s - %(levelname)s - %(message)s'" +msgstr "'%(asctime)s - %(levelname)s - %(message)s'" + +#: ../../howto/logging.rst:587 +msgid "" +"Formatters use a user-configurable function to convert the creation time of " +"a record to a tuple. By default, :func:`time.localtime` is used; to change " +"this for a particular formatter instance, set the ``converter`` attribute of" +" the instance to a function with the same signature as " +":func:`time.localtime` or :func:`time.gmtime`. To change it for all " +"formatters, for example if you want all logging times to be shown in GMT, " +"set the ``converter`` attribute in the Formatter class (to ``time.gmtime`` " +"for GMT display)." +msgstr "" +"格式器通过用户可配置的函数将记录的创建时间转换为元组。默认情况下,使用 :func:`time.localtime` " +";要为特定格式器实例更改此项,请将实例的 ``converter`` 属性设置为与 :func:`time.localtime` 或 " +":func:`time.gmtime` 具有相同签名的函数。 要为所有格式器更改它,例如,如果你希望所有记录时间都以 GMT 显示,请在格式器类中设置 " +"``converter`` 属性 (对于 GMT 显示,设置为 ``time.gmtime``)。" + +#: ../../howto/logging.rst:597 +msgid "Configuring Logging" +msgstr "配置日志记录" + +#: ../../howto/logging.rst:601 +msgid "Programmers can configure logging in three ways:" +msgstr "开发者可以通过三种方式配置日志记录:" + +#: ../../howto/logging.rst:603 +msgid "" +"Creating loggers, handlers, and formatters explicitly using Python code that" +" calls the configuration methods listed above." +msgstr "使用调用上面列出的配置方法的 Python 代码显式创建记录器、处理器和格式器。" + +#: ../../howto/logging.rst:605 +msgid "" +"Creating a logging config file and reading it using the :func:`fileConfig` " +"function." +msgstr "创建日志配置文件并使用 :func:`fileConfig` 函数读取它。" + +#: ../../howto/logging.rst:607 +msgid "" +"Creating a dictionary of configuration information and passing it to the " +":func:`dictConfig` function." +msgstr "创建配置信息字典并将其传递给 :func:`dictConfig` 函数。" + +#: ../../howto/logging.rst:610 +msgid "" +"For the reference documentation on the last two options, see :ref:`logging-" +"config-api`. The following example configures a very simple logger, a " +"console handler, and a simple formatter using Python code::" +msgstr "" +"有关最后两个选项的参考文档,请参阅 :ref:`logging-config-api`。以下示例使用 Python " +"代码配置一个非常简单的记录器、一个控制台处理器和一个简单的格式器::" + +#: ../../howto/logging.rst:614 +msgid "" +"import logging\n" +"\n" +"# create logger\n" +"logger = logging.getLogger('simple_example')\n" +"logger.setLevel(logging.DEBUG)\n" +"\n" +"# create console handler and set level to debug\n" +"ch = logging.StreamHandler()\n" +"ch.setLevel(logging.DEBUG)\n" +"\n" +"# create formatter\n" +"formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')\n" +"\n" +"# add formatter to ch\n" +"ch.setFormatter(formatter)\n" +"\n" +"# add ch to logger\n" +"logger.addHandler(ch)\n" +"\n" +"# 'application' code\n" +"logger.debug('debug message')\n" +"logger.info('info message')\n" +"logger.warning('warn message')\n" +"logger.error('error message')\n" +"logger.critical('critical message')" +msgstr "" +"import logging\n" +"\n" +"# 创建日志记录器 logger\n" +"logger = logging.getLogger('simple_example')\n" +"logger.setLevel(logging.DEBUG)\n" +"\n" +"# 创建控制台处理器 ch 并将等级设为 debug\n" +"ch = logging.StreamHandler()\n" +"ch.setLevel(logging.DEBUG)\n" +"\n" +"# 创建格式化器 formatter\n" +"formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')\n" +"\n" +"# 将 formatter 添加到 ch\n" +"ch.setFormatter(formatter)\n" +"\n" +"# 将 ch 添加到 logger\n" +"logger.addHandler(ch)\n" +"\n" +"# '应用程序' 代码\n" +"logger.debug('debug message')\n" +"logger.info('info message')\n" +"logger.warning('warn message')\n" +"logger.error('error message')\n" +"logger.critical('critical message')" + +#: ../../howto/logging.rst:640 +msgid "" +"Running this module from the command line produces the following output:" +msgstr "从命令行运行此模块将生成以下输出:" + +#: ../../howto/logging.rst:642 +msgid "" +"$ python simple_logging_module.py\n" +"2005-03-19 15:10:26,618 - simple_example - DEBUG - debug message\n" +"2005-03-19 15:10:26,620 - simple_example - INFO - info message\n" +"2005-03-19 15:10:26,695 - simple_example - WARNING - warn message\n" +"2005-03-19 15:10:26,697 - simple_example - ERROR - error message\n" +"2005-03-19 15:10:26,773 - simple_example - CRITICAL - critical message" +msgstr "" +"$ python simple_logging_module.py\n" +"2005-03-19 15:10:26,618 - simple_example - DEBUG - debug message\n" +"2005-03-19 15:10:26,620 - simple_example - INFO - info message\n" +"2005-03-19 15:10:26,695 - simple_example - WARNING - warn message\n" +"2005-03-19 15:10:26,697 - simple_example - ERROR - error message\n" +"2005-03-19 15:10:26,773 - simple_example - CRITICAL - critical message" + +#: ../../howto/logging.rst:651 +msgid "" +"The following Python module creates a logger, handler, and formatter nearly " +"identical to those in the example listed above, with the only difference " +"being the names of the objects::" +msgstr "以下 Python 模块创建的记录器、处理器和格式器几乎与上面列出的示例中的相同,唯一的区别是对象的名称::" + +#: ../../howto/logging.rst:655 +msgid "" +"import logging\n" +"import logging.config\n" +"\n" +"logging.config.fileConfig('logging.conf')\n" +"\n" +"# create logger\n" +"logger = logging.getLogger('simpleExample')\n" +"\n" +"# 'application' code\n" +"logger.debug('debug message')\n" +"logger.info('info message')\n" +"logger.warning('warn message')\n" +"logger.error('error message')\n" +"logger.critical('critical message')" +msgstr "" +"import logging\n" +"import logging.config\n" +"\n" +"logging.config.fileConfig('logging.conf')\n" +"\n" +"# 创建日志记录器 logger\n" +"logger = logging.getLogger('simpleExample')\n" +"\n" +"# '应用程序' 代码\n" +"logger.debug('debug message')\n" +"logger.info('info message')\n" +"logger.warning('warn message')\n" +"logger.error('error message')\n" +"logger.critical('critical message')" + +#: ../../howto/logging.rst:670 +msgid "Here is the logging.conf file:" +msgstr "这是 logging.conf 文件:" + +#: ../../howto/logging.rst:672 +msgid "" +"[loggers]\n" +"keys=root,simpleExample\n" +"\n" +"[handlers]\n" +"keys=consoleHandler\n" +"\n" +"[formatters]\n" +"keys=simpleFormatter\n" +"\n" +"[logger_root]\n" +"level=DEBUG\n" +"handlers=consoleHandler\n" +"\n" +"[logger_simpleExample]\n" +"level=DEBUG\n" +"handlers=consoleHandler\n" +"qualname=simpleExample\n" +"propagate=0\n" +"\n" +"[handler_consoleHandler]\n" +"class=StreamHandler\n" +"level=DEBUG\n" +"formatter=simpleFormatter\n" +"args=(sys.stdout,)\n" +"\n" +"[formatter_simpleFormatter]\n" +"format=%(asctime)s - %(name)s - %(levelname)s - %(message)s" +msgstr "" +"[loggers]\n" +"keys=root,simpleExample\n" +"\n" +"[handlers]\n" +"keys=consoleHandler\n" +"\n" +"[formatters]\n" +"keys=simpleFormatter\n" +"\n" +"[logger_root]\n" +"level=DEBUG\n" +"handlers=consoleHandler\n" +"\n" +"[logger_simpleExample]\n" +"level=DEBUG\n" +"handlers=consoleHandler\n" +"qualname=simpleExample\n" +"propagate=0\n" +"\n" +"[handler_consoleHandler]\n" +"class=StreamHandler\n" +"level=DEBUG\n" +"formatter=simpleFormatter\n" +"args=(sys.stdout,)\n" +"\n" +"[formatter_simpleFormatter]\n" +"format=%(asctime)s - %(name)s - %(levelname)s - %(message)s" + +#: ../../howto/logging.rst:702 +msgid "" +"The output is nearly identical to that of the non-config-file-based example:" +msgstr "其输出与不基于配置文件的示例几乎相同:" + +#: ../../howto/logging.rst:704 +msgid "" +"$ python simple_logging_config.py\n" +"2005-03-19 15:38:55,977 - simpleExample - DEBUG - debug message\n" +"2005-03-19 15:38:55,979 - simpleExample - INFO - info message\n" +"2005-03-19 15:38:56,054 - simpleExample - WARNING - warn message\n" +"2005-03-19 15:38:56,055 - simpleExample - ERROR - error message\n" +"2005-03-19 15:38:56,130 - simpleExample - CRITICAL - critical message" +msgstr "" +"$ python simple_logging_config.py\n" +"2005-03-19 15:38:55,977 - simpleExample - DEBUG - debug message\n" +"2005-03-19 15:38:55,979 - simpleExample - INFO - info message\n" +"2005-03-19 15:38:56,054 - simpleExample - WARNING - warn message\n" +"2005-03-19 15:38:56,055 - simpleExample - ERROR - error message\n" +"2005-03-19 15:38:56,130 - simpleExample - CRITICAL - critical message" + +#: ../../howto/logging.rst:713 +msgid "" +"You can see that the config file approach has a few advantages over the " +"Python code approach, mainly separation of configuration and code and the " +"ability of noncoders to easily modify the logging properties." +msgstr "你可以看到配置文件方法相较于 Python 代码方法有一些优势,主要是配置和代码的分离以及非开发者轻松修改日志记录属性的能力。" + +#: ../../howto/logging.rst:717 +msgid "" +"The :func:`fileConfig` function takes a default parameter, " +"``disable_existing_loggers``, which defaults to ``True`` for reasons of " +"backward compatibility. This may or may not be what you want, since it will " +"cause any non-root loggers existing before the :func:`fileConfig` call to be" +" disabled unless they (or an ancestor) are explicitly named in the " +"configuration. Please refer to the reference documentation for more " +"information, and specify ``False`` for this parameter if you wish." +msgstr "" +":func:`fileConfig` 函数接受一个默认参数 ``disable_existing_loggers``,出于向后兼容的原因,默认为 " +"``True``。这可能与您的期望不同,因为除非在配置中明确命名它们(或其父级),否则它将导致在 :func:`fileConfig` " +"调用之前存在的任何非 root 记录器被禁用。有关更多信息,请参阅参考文档,如果需要,请将此参数指定为 ``False``。" + +#: ../../howto/logging.rst:725 +msgid "" +"The dictionary passed to :func:`dictConfig` can also specify a Boolean value" +" with key ``disable_existing_loggers``, which if not specified explicitly in" +" the dictionary also defaults to being interpreted as ``True``. This leads " +"to the logger-disabling behaviour described above, which may not be what you" +" want - in which case, provide the key explicitly with a value of ``False``." +msgstr "" +"传递给 :func:`dictConfig` 的字典也可以用键 ``disable_existing_loggers`` " +"指定一个布尔值,如果没有在字典中明确指定,也默认被解释为 ``True`` " +"。这会导致上面描述的记录器禁用行为,这可能与你的期望不同——在这种情况下,请明确地为其提供 ``False`` 值。" + +#: ../../howto/logging.rst:735 +msgid "" +"Note that the class names referenced in config files need to be either " +"relative to the logging module, or absolute values which can be resolved " +"using normal import mechanisms. Thus, you could use either " +":class:`~logging.handlers.WatchedFileHandler` (relative to the logging " +"module) or ``mypackage.mymodule.MyHandler`` (for a class defined in package " +"``mypackage`` and module ``mymodule``, where ``mypackage`` is available on " +"the Python import path)." +msgstr "" +"请注意,配置文件中引用的类名称需要相对于日志记录模块,或者可以使用常规导入机制解析的绝对值。 因此,你可以使用 " +":class:`~logging.handlers.WatchedFileHandler` (相对于日志记录模块) 或 " +"``mypackage.mymodule.MyHandler`` (对于在 ``mypackage`` 包中定义的类和模块 ``mymodule`` " +",其中 ``mypackage`` 在 Python 导入路径上可用)。" + +#: ../../howto/logging.rst:743 +msgid "" +"In Python 3.2, a new means of configuring logging has been introduced, using" +" dictionaries to hold configuration information. This provides a superset of" +" the functionality of the config-file-based approach outlined above, and is " +"the recommended configuration method for new applications and deployments. " +"Because a Python dictionary is used to hold configuration information, and " +"since you can populate that dictionary using different means, you have more " +"options for configuration. For example, you can use a configuration file in " +"JSON format, or, if you have access to YAML processing functionality, a file" +" in YAML format, to populate the configuration dictionary. Or, of course, " +"you can construct the dictionary in Python code, receive it in pickled form " +"over a socket, or use whatever approach makes sense for your application." +msgstr "" +"在 Python 3.2 中,引入了一种新的配置日志记录的方法,使用字典来保存配置信息。 " +"这提供了上述基于配置文件方法的功能的超集,并且是新应用程序和部署的推荐配置方法。因为 Python " +"字典用于保存配置信息,并且由于你可以使用不同的方式填充该字典,因此你有更多的配置选项。例如,你可以使用 JSON 格式的配置文件,或者如果你有权访问 " +"YAML 处理功能,则可以使用 YAML 格式的文件来填充配置字典。当然,你可以在 Python 代码中构造字典,通过套接字以 pickle " +"形式接收它,或者使用对你的应用程序合理的任何方法。" + +#: ../../howto/logging.rst:755 +msgid "" +"Here's an example of the same configuration as above, in YAML format for the" +" new dictionary-based approach:" +msgstr "以下是与上述相同配置的示例,采用 YAML 格式,用于新的基于字典的方法:" + +#: ../../howto/logging.rst:758 +msgid "" +"version: 1\n" +"formatters:\n" +" simple:\n" +" format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'\n" +"handlers:\n" +" console:\n" +" class: logging.StreamHandler\n" +" level: DEBUG\n" +" formatter: simple\n" +" stream: ext://sys.stdout\n" +"loggers:\n" +" simpleExample:\n" +" level: DEBUG\n" +" handlers: [console]\n" +" propagate: no\n" +"root:\n" +" level: DEBUG\n" +" handlers: [console]" +msgstr "" +"version: 1\n" +"formatters:\n" +" simple:\n" +" format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'\n" +"handlers:\n" +" console:\n" +" class: logging.StreamHandler\n" +" level: DEBUG\n" +" formatter: simple\n" +" stream: ext://sys.stdout\n" +"loggers:\n" +" simpleExample:\n" +" level: DEBUG\n" +" handlers: [console]\n" +" propagate: no\n" +"root:\n" +" level: DEBUG\n" +" handlers: [console]" + +#: ../../howto/logging.rst:779 +msgid "" +"For more information about logging using a dictionary, see :ref:`logging-" +"config-api`." +msgstr "有关使用字典进行日志记录的更多信息,请参阅 :ref:`logging-config-api`。" + +#: ../../howto/logging.rst:783 +msgid "What happens if no configuration is provided" +msgstr "如果没有提供配置会发生什么" + +#: ../../howto/logging.rst:785 +msgid "" +"If no logging configuration is provided, it is possible to have a situation " +"where a logging event needs to be output, but no handlers can be found to " +"output the event." +msgstr "如果未提供日志记录配置,则可能出现需要输出日志记录事件,但无法找到输出事件的处理器的情况。" + +#: ../../howto/logging.rst:789 +msgid "" +"The event is output using a 'handler of last resort', stored in " +":data:`lastResort`. This internal handler is not associated with any logger," +" and acts like a :class:`~logging.StreamHandler` which writes the event " +"description message to the current value of ``sys.stderr`` (therefore " +"respecting any redirections which may be in effect). No formatting is done " +"on the message - just the bare event description message is printed. The " +"handler's level is set to ``WARNING``, so all events at this and greater " +"severities will be output." +msgstr "" +"事件将使用‘最后的处理器’来输出,它存储在 :data:`lastResort` 中。这个内部处理器与任何日志记录器都没有关联,它的作用类似于 " +":class:`~logging.StreamHandler`,它将事件描述消息写入到 ``sys.stderr`` " +"的当前值(因此会遵循任何已生效的重定向)。没有对消息进行任何格式化 —— 只打印简单的事件描述消息。该处理器的级别被设为 " +"``WARNING``,因此将输出严重性在此级别以上的所有事件。" + +#: ../../howto/logging.rst:800 +msgid "For versions of Python prior to 3.2, the behaviour is as follows:" +msgstr "对于 3.2 之前的 Python 版本,行为如下:" + +#: ../../howto/logging.rst:802 +msgid "" +"If :data:`raiseExceptions` is ``False`` (production mode), the event is " +"silently dropped." +msgstr "如果 :data:`raiseExceptions` 为 ``False`` (生产模式),则该事件会被静默地丢弃。" + +#: ../../howto/logging.rst:805 +msgid "" +"If :data:`raiseExceptions` is ``True`` (development mode), a message 'No " +"handlers could be found for logger X.Y.Z' is printed once." +msgstr "" +"如果 :data:`raiseExceptions` 为 ``True`` (开发模式),则会打印一条消息 'No handlers could be " +"found for logger X.Y.Z'。" + +#: ../../howto/logging.rst:808 +msgid "" +"To obtain the pre-3.2 behaviour, :data:`lastResort` can be set to ``None``." +msgstr "要获得 3.2 之前的行为,可以将 :data:`lastResort` 设为 ``None``。" + +#: ../../howto/logging.rst:814 +msgid "Configuring Logging for a Library" +msgstr "为库配置日志" + +#: ../../howto/logging.rst:816 +msgid "" +"When developing a library which uses logging, you should take care to " +"document how the library uses logging - for example, the names of loggers " +"used. Some consideration also needs to be given to its logging " +"configuration. If the using application does not use logging, and library " +"code makes logging calls, then (as described in the previous section) events" +" of severity ``WARNING`` and greater will be printed to ``sys.stderr``. This" +" is regarded as the best default behaviour." +msgstr "" +"在开发带日志的库时,你应该在文档中详细说明,你的库会如何使用日志——例如,使用的记录器的名称。还需要考虑其日志配置。如果使用库的应用程序不使用日志,且库代码调用日志进行记录,那么(如上一节所述)严重性为" +" ``WARNING`` 和更高级别的事件将被打印到 ``sys.stderr``。这被认为是最好的默认行为。" + +#: ../../howto/logging.rst:824 +msgid "" +"If for some reason you *don't* want these messages printed in the absence of" +" any logging configuration, you can attach a do-nothing handler to the top-" +"level logger for your library. This avoids the message being printed, since " +"a handler will always be found for the library's events: it just doesn't " +"produce any output. If the library user configures logging for application " +"use, presumably that configuration will add some handlers, and if levels are" +" suitably configured then logging calls made in library code will send " +"output to those handlers, as normal." +msgstr "" +"如果由于某种原因,你 *不* " +"希望在没有任何日志记录配置的情况下打印这些消息,则可以将无操作处理器附加到库的顶级记录器。这样可以避免打印消息,因为将始终为库的事件找到处理器:它不会产生任何输出。如果库用户配置应用程序使用的日志记录,可能是配置将添加一些处理器,如果级别已适当配置,则在库代码中进行的日志记录调用将正常地将输出发送给这些处理器。" + +#: ../../howto/logging.rst:833 +msgid "" +"A do-nothing handler is included in the logging package: " +":class:`~logging.NullHandler` (since Python 3.1). An instance of this " +"handler could be added to the top-level logger of the logging namespace used" +" by the library (*if* you want to prevent your library's logged events being" +" output to ``sys.stderr`` in the absence of logging configuration). If all " +"logging by a library *foo* is done using loggers with names matching " +"'foo.x', 'foo.x.y', etc. then the code::" +msgstr "" +"日志包中包含一个不做任何事情的处理器: :class:`~logging.NullHandler` (自 Python 3.1 起)。 " +"可以将此处理器的实例添加到库使用的日志记录命名空间的顶级记录器中 (*如果* 你希望在没有日志记录配置的情况下阻止库的记录事件输出到 " +"``sys.stderr``)。 如果库 *foo* 的所有日志记录都是使用名称匹配 'foo.x' , 'foo.x.y' " +"等的记录器完成的,那么代码::" + +#: ../../howto/logging.rst:841 +msgid "" +"import logging\n" +"logging.getLogger('foo').addHandler(logging.NullHandler())" +msgstr "" +"import logging\n" +"logging.getLogger('foo').addHandler(logging.NullHandler())" + +#: ../../howto/logging.rst:844 +msgid "" +"should have the desired effect. If an organisation produces a number of " +"libraries, then the logger name specified can be 'orgname.foo' rather than " +"just 'foo'." +msgstr "应该有预计的效果。如果一个组织生成了许多库,则指定的记录器名称可以是“orgname.foo”而不仅仅是“foo” 。" + +#: ../../howto/logging.rst:848 +msgid "" +"It is strongly advised that you *do not log to the root logger* in your " +"library. Instead, use a logger with a unique and easily identifiable name, " +"such as the ``__name__`` for your library's top-level package or module. " +"Logging to the root logger will make it difficult or impossible for the " +"application developer to configure the logging verbosity or handlers of your" +" library as they wish." +msgstr "" +"强烈建议在你的库中 " +"*不要将日志记录到根记录器*,而为你的库的最高层级包或模块使用一个具有唯一的易识别的名称——例如,``__name__``——的记录器。将日志记录到根记录器,会使应用程序开发人员按照他们的意愿配置你的库的日志的详细程度或处理器变得困难,或者完全不可能。" + +#: ../../howto/logging.rst:855 +msgid "" +"It is strongly advised that you *do not add any handlers other than* " +":class:`~logging.NullHandler` *to your library's loggers*. This is because " +"the configuration of handlers is the prerogative of the application " +"developer who uses your library. The application developer knows their " +"target audience and what handlers are most appropriate for their " +"application: if you add handlers 'under the hood', you might well interfere " +"with their ability to carry out unit tests and deliver logs which suit their" +" requirements." +msgstr "" +"强烈建议你 *不要将* :class:`~logging.NullHandler` *以外的任何处理器添加到库的记录器中* " +"。这是因为处理器的配置是使用你的库的应用程序开发人员的权利。应用程序开发人员了解他们的目标受众以及哪些处理器最适合他们的应用程序:如果你在“底层”添加处理器,则可能会干扰他们执行单元测试和提供符合其要求的日志的能力。" + +#: ../../howto/logging.rst:866 +msgid "Logging Levels" +msgstr "日志级别" + +#: ../../howto/logging.rst:868 +msgid "" +"The numeric values of logging levels are given in the following table. These" +" are primarily of interest if you want to define your own levels, and need " +"them to have specific values relative to the predefined levels. If you " +"define a level with the same numeric value, it overwrites the predefined " +"value; the predefined name is lost." +msgstr "" +"日志记录级别的数值在下表中给出。如果你想要定义自己的级别,并且需要它们具有相对于预定义级别的特定值,那么这你可能对以下内容感兴趣。如果你定义具有相同数值的级别,它将覆盖预定义的值;预定义的名称将失效。" + +#: ../../howto/logging.rst:875 +msgid "Numeric value" +msgstr "数值" + +#: ../../howto/logging.rst:877 +msgid "50" +msgstr "50" + +#: ../../howto/logging.rst:879 +msgid "40" +msgstr "40" + +#: ../../howto/logging.rst:881 +msgid "30" +msgstr "30" + +#: ../../howto/logging.rst:883 +msgid "20" +msgstr "20" + +#: ../../howto/logging.rst:885 +msgid "10" +msgstr "10" + +#: ../../howto/logging.rst:887 +msgid "``NOTSET``" +msgstr "``NOTSET``" + +#: ../../howto/logging.rst:887 +msgid "0" +msgstr "0" + +#: ../../howto/logging.rst:890 +msgid "" +"Levels can also be associated with loggers, being set either by the " +"developer or through loading a saved logging configuration. When a logging " +"method is called on a logger, the logger compares its own level with the " +"level associated with the method call. If the logger's level is higher than " +"the method call's, no logging message is actually generated. This is the " +"basic mechanism controlling the verbosity of logging output." +msgstr "" +"级别也可以与记录器关联,可以由开发人员设置,也可以通过加载保存的日志配置来设置。在记录器上调用记录方法时,记录器会将自己的级别与调用的方法的级别进行比较。如果记录器的级别高于调用的方法的级别,则实际上不会生成任何记录消息。这是控制日志记录输出详细程度的基本机制。" + +#: ../../howto/logging.rst:897 +msgid "" +"Logging messages are encoded as instances of the :class:`~logging.LogRecord`" +" class. When a logger decides to actually log an event, a " +":class:`~logging.LogRecord` instance is created from the logging message." +msgstr "" +"日志消息被编码为 :class:`~logging.LogRecord` 类的实例。当记录器决定实际记录一个事件时,将从记录消息创建一个 " +":class:`~logging.LogRecord` 实例。" + +#: ../../howto/logging.rst:901 +msgid "" +"Logging messages are subjected to a dispatch mechanism through the use of " +":dfn:`handlers`, which are instances of subclasses of the :class:`Handler` " +"class. Handlers are responsible for ensuring that a logged message (in the " +"form of a :class:`LogRecord`) ends up in a particular location (or set of " +"locations) which is useful for the target audience for that message (such as" +" end users, support desk staff, system administrators, developers). Handlers" +" are passed :class:`LogRecord` instances intended for particular " +"destinations. Each logger can have zero, one or more handlers associated " +"with it (via the :meth:`~Logger.addHandler` method of :class:`Logger`). In " +"addition to any handlers directly associated with a logger, *all handlers " +"associated with all ancestors of the logger* are called to dispatch the " +"message (unless the *propagate* flag for a logger is set to a false value, " +"at which point the passing to ancestor handlers stops)." +msgstr "" +"使用 :class:`Handler` 类的子例的实例 :dfn:`handlers`,可以为日志消息建立分派机制。处理器负责确保记录的消息(以 " +":class:`LogRecord` " +"的形式)最终到达对该消息的目标受众(如最终用户、技术支持员工、系统管理员或开发人员)有用的一个或多个位置上。想要去到特定目标的 " +":class:`LogRecord` 实例会被传给相应的处理器。每个记录器可以有零、一或多个与之相关联的处理器(通过 :class:`Logger` 的" +" :meth:`~Logger.addHandler` 方法)。除了与记录器直接关联的所有处理器之外,还会将消息分派给 " +"*记录器的所有祖先关联的各个处理器*(除非某个记录器的 *propagate* 旗标被设为假值,这将使向祖先的传递在其处终止)。" + +#: ../../howto/logging.rst:915 +msgid "" +"Just as for loggers, handlers can have levels associated with them. A " +"handler's level acts as a filter in the same way as a logger's level does. " +"If a handler decides to actually dispatch an event, the " +":meth:`~Handler.emit` method is used to send the message to its destination." +" Most user-defined subclasses of :class:`Handler` will need to override this" +" :meth:`~Handler.emit`." +msgstr "" +"就像记录器一样,处理器可以具有与它们相关联的级别。处理器的级别作为过滤器,其方式与记录器级别相同。如果处理器决定分派一个事件,则使用 " +":meth:`~Handler.emit` 方法将消息发送到其目标。大多数用户定义的 :class:`Handler` 子类都需要重写 " +":meth:`~Handler.emit`." + +#: ../../howto/logging.rst:924 +msgid "Custom Levels" +msgstr "自定义级别" + +#: ../../howto/logging.rst:926 +msgid "" +"Defining your own levels is possible, but should not be necessary, as the " +"existing levels have been chosen on the basis of practical experience. " +"However, if you are convinced that you need custom levels, great care should" +" be exercised when doing this, and it is possibly *a very bad idea to define" +" custom levels if you are developing a library*. That's because if multiple " +"library authors all define their own custom levels, there is a chance that " +"the logging output from such multiple libraries used together will be " +"difficult for the using developer to control and/or interpret, because a " +"given numeric value might mean different things for different libraries." +msgstr "" +"定义你自己的级别是可能的,但不一定是必要的,因为现有级别是根据实践经验选择的。但是,如果你确信需要自定义级别,那么在执行此操作时应特别小心,如果你正在开发库,则" +" *定义自定义级别可能是一个非常糟糕的主意* 。 " +"这是因为如果多个库作者都定义了他们自己的自定义级别,那么使用开发人员很难控制和解释这些多个库的日志记录输出,因为给定的数值对于不同的库可能意味着不同的东西。" + +#: ../../howto/logging.rst:939 +msgid "Useful Handlers" +msgstr "有用的处理器" + +#: ../../howto/logging.rst:941 +msgid "" +"In addition to the base :class:`Handler` class, many useful subclasses are " +"provided:" +msgstr "作为 :class:`Handler` 基类的补充,提供了很多有用的子类:" + +#: ../../howto/logging.rst:944 +msgid "" +":class:`StreamHandler` instances send messages to streams (file-like " +"objects)." +msgstr ":class:`StreamHandler` 实例发送消息到流(类似文件对象)。" + +#: ../../howto/logging.rst:947 +msgid ":class:`FileHandler` instances send messages to disk files." +msgstr ":class:`FileHandler` 实例将消息发送到硬盘文件。" + +#: ../../howto/logging.rst:949 +msgid "" +":class:`~handlers.BaseRotatingHandler` is the base class for handlers that " +"rotate log files at a certain point. It is not meant to be instantiated " +"directly. Instead, use :class:`~handlers.RotatingFileHandler` or " +":class:`~handlers.TimedRotatingFileHandler`." +msgstr "" +":class:`~handlers.BaseRotatingHandler` 是轮换日志文件的处理器的基类。它并不应该直接实例化。而应该使用 " +":class:`~handlers.RotatingFileHandler` 或 " +":class:`~handlers.TimedRotatingFileHandler` 代替它。" + +#: ../../howto/logging.rst:954 +msgid "" +":class:`~handlers.RotatingFileHandler` instances send messages to disk " +"files, with support for maximum log file sizes and log file rotation." +msgstr "" +":class:`~handlers.RotatingFileHandler` 实例将消息发送到硬盘文件,支持最大日志文件大小和日志文件轮换。" + +#: ../../howto/logging.rst:957 +msgid "" +":class:`~handlers.TimedRotatingFileHandler` instances send messages to disk " +"files, rotating the log file at certain timed intervals." +msgstr "" +":class:`~handlers.TimedRotatingFileHandler` 实例将消息发送到硬盘文件,以特定的时间间隔轮换日志文件。" + +#: ../../howto/logging.rst:960 +msgid "" +":class:`~handlers.SocketHandler` instances send messages to TCP/IP sockets. " +"Since 3.4, Unix domain sockets are also supported." +msgstr "" +":class:`~handlers.SocketHandler` 实例将消息发送到 TCP/IP 套接字。从 3.4 开始,也支持 Unix 域套接字。" + +#: ../../howto/logging.rst:963 +msgid "" +":class:`~handlers.DatagramHandler` instances send messages to UDP sockets. " +"Since 3.4, Unix domain sockets are also supported." +msgstr "" +":class:`~handlers.DatagramHandler` 实例将消息发送到 UDP 套接字。从 3.4 开始,也支持 Unix 域套接字。" + +#: ../../howto/logging.rst:966 +msgid "" +":class:`~handlers.SMTPHandler` instances send messages to a designated email" +" address." +msgstr ":class:`~handlers.SMTPHandler` 实例将消息发送到指定的电子邮件地址。" + +#: ../../howto/logging.rst:969 +msgid "" +":class:`~handlers.SysLogHandler` instances send messages to a Unix syslog " +"daemon, possibly on a remote machine." +msgstr ":class:`~handlers.SysLogHandler` 实例将消息发送到 Unix syslog 守护程序,可能在远程计算机上。" + +#: ../../howto/logging.rst:972 +msgid "" +":class:`~handlers.NTEventLogHandler` instances send messages to a Windows " +"NT/2000/XP event log." +msgstr "" +":class:`~handlers.NTEventLogHandler` 实例将消息发送到 Windows NT/2000/XP 事件日志。" + +#: ../../howto/logging.rst:975 +msgid "" +":class:`~handlers.MemoryHandler` instances send messages to a buffer in " +"memory, which is flushed whenever specific criteria are met." +msgstr ":class:`~handlers.MemoryHandler` 实例将消息发送到内存中的缓冲区,只要满足特定条件,缓冲区就会刷新。" + +#: ../../howto/logging.rst:978 +msgid "" +":class:`~handlers.HTTPHandler` instances send messages to an HTTP server " +"using either ``GET`` or ``POST`` semantics." +msgstr "" +":class:`~handlers.HTTPHandler` 实例使用 ``GET`` 或 ``POST`` 方法将消息发送到 HTTP 服务器。" + +#: ../../howto/logging.rst:981 +msgid "" +":class:`~handlers.WatchedFileHandler` instances watch the file they are " +"logging to. If the file changes, it is closed and reopened using the file " +"name. This handler is only useful on Unix-like systems; Windows does not " +"support the underlying mechanism used." +msgstr "" +":class:`~handlers.WatchedFileHandler` " +"实例会监视他们要写入日志的文件。如果文件发生更改,则会关闭该文件并使用文件名重新打开。此处理器仅在类 Unix 系统上有用;Windows " +"不支持依赖的基础机制。" + +#: ../../howto/logging.rst:986 +msgid "" +":class:`~handlers.QueueHandler` instances send messages to a queue, such as " +"those implemented in the :mod:`queue` or :mod:`multiprocessing` modules." +msgstr "" +":class:`~handlers.QueueHandler` 实例将消息发送到队列,例如在 :mod:`queue` 或 " +":mod:`multiprocessing` 模块中实现的队列。" + +#: ../../howto/logging.rst:989 +msgid "" +":class:`NullHandler` instances do nothing with error messages. They are used" +" by library developers who want to use logging, but want to avoid the 'No " +"handlers could be found for logger *XXX*' message which can be displayed if " +"the library user has not configured logging. See :ref:`library-config` for " +"more information." +msgstr "" +":class:`NullHandler` 实例不对错误消息执行任何操作。如果库开发者希望使用日志记录,但又希望避免出现“找不到日志记录器 *XXX* " +"的处理器”消息则可以使用它们。更多信息请参阅 :ref:`library-config`。" + +#: ../../howto/logging.rst:995 +msgid "The :class:`NullHandler` class." +msgstr ":class:`NullHandler` 类。" + +#: ../../howto/logging.rst:998 +msgid "The :class:`~handlers.QueueHandler` class." +msgstr ":class:`~handlers.QueueHandler` 类。" + +#: ../../howto/logging.rst:1001 +msgid "" +"The :class:`NullHandler`, :class:`StreamHandler` and :class:`FileHandler` " +"classes are defined in the core logging package. The other handlers are " +"defined in a sub-module, :mod:`logging.handlers`. (There is also another " +"sub-module, :mod:`logging.config`, for configuration functionality.)" +msgstr "" +":class:`NullHandler`、 :class:`StreamHandler` 和 :class:`FileHandler` " +"类在核心日志包中定义。其他处理器定义在 :mod:`logging.handlers` 中。(还有另一个子模块 " +":mod:`logging.config`,用于配置功能)" + +#: ../../howto/logging.rst:1006 +msgid "" +"Logged messages are formatted for presentation through instances of the " +":class:`Formatter` class. They are initialized with a format string suitable" +" for use with the % operator and a dictionary." +msgstr "" +"记录的消息通过 :class:`Formatter` 类的实例进行格式化后呈现。它们使用能与 % 运算符一起使用的格式字符串和字典进行初始化。" + +#: ../../howto/logging.rst:1010 +msgid "" +"For formatting multiple messages in a batch, instances of " +":class:`BufferingFormatter` can be used. In addition to the format string " +"(which is applied to each message in the batch), there is provision for " +"header and trailer format strings." +msgstr "" +"要批量格式化多条消息,可以使用 :class:`BufferingFormatter` 的实例。 " +"除了格式字符串(它将应用于批次中的每条消息)以外,还提供了标头和尾部格式字符串。" + +#: ../../howto/logging.rst:1015 +msgid "" +"When filtering based on logger level and/or handler level is not enough, " +"instances of :class:`Filter` can be added to both :class:`Logger` and " +":class:`Handler` instances (through their :meth:`~Handler.addFilter` " +"method). Before deciding to process a message further, both loggers and " +"handlers consult all their filters for permission. If any filter returns a " +"false value, the message is not processed further." +msgstr "" +"当基于记录器级别和处理器级别的过滤不够时,可以将 :class:`Filter` 的实例添加到 :class:`Logger` 和 " +":class:`Handler` 实例(通过它们的 :meth:`~Handler.addFilter` " +"方法)。在决定进一步处理消息之前,记录器和处理器都会查询其所有过滤器以获得许可。如果任何过滤器返回 false 值,则不会进一步处理该消息。" + +#: ../../howto/logging.rst:1022 +msgid "" +"The basic :class:`Filter` functionality allows filtering by specific logger " +"name. If this feature is used, messages sent to the named logger and its " +"children are allowed through the filter, and all others dropped." +msgstr "" +"基本 :class:`Filter` " +"的功能允许按特定的记录器名称进行过滤。如果使用此功能,则允许通过过滤器发送到指定记录器及其子项的消息,并丢弃其他所有消息。" + +#: ../../howto/logging.rst:1030 +msgid "Exceptions raised during logging" +msgstr "记录日志时引发的异常" + +#: ../../howto/logging.rst:1032 +msgid "" +"The logging package is designed to swallow exceptions which occur while " +"logging in production. This is so that errors which occur while handling " +"logging events - such as logging misconfiguration, network or other similar " +"errors - do not cause the application using logging to terminate " +"prematurely." +msgstr "" +"logging " +"包被设计为,当在生产环境下使用时,忽略记录日志时发生的异常。这样,处理与日志相关的事件时发生的错误(例如日志配置错误、网络或其它类似错误)不会导致使用日志的应用程序终止。" + +#: ../../howto/logging.rst:1037 +msgid "" +":class:`SystemExit` and :class:`KeyboardInterrupt` exceptions are never " +"swallowed. Other exceptions which occur during the :meth:`~Handler.emit` " +"method of a :class:`Handler` subclass are passed to its " +":meth:`~Handler.handleError` method." +msgstr "" +":class:`SystemExit` 和 :class:`KeyboardInterrupt` 异常永远不会被忽略。在 " +":class:`Handler` 的子类的 :meth:`~Handler.emit` 方法中发生的其它异常将被传递给其 " +":meth:`~Handler.handleError` 方法。" + +#: ../../howto/logging.rst:1042 +msgid "" +"The default implementation of :meth:`~Handler.handleError` in " +":class:`Handler` checks to see if a module-level variable, " +":data:`raiseExceptions`, is set. If set, a traceback is printed to " +":data:`sys.stderr`. If not set, the exception is swallowed." +msgstr "" +":class:`Handler` 中的 :meth:`~Handler.handleError` 的默认实现是检查是否设置了模块级变量 " +":data:`raiseExceptions`。如有设置,则会将回溯打印到 :data:`sys.stderr`。如果未设置,则忽略异常。" + +#: ../../howto/logging.rst:1048 +msgid "" +"The default value of :data:`raiseExceptions` is ``True``. This is because " +"during development, you typically want to be notified of any exceptions that" +" occur. It's advised that you set :data:`raiseExceptions` to ``False`` for " +"production usage." +msgstr "" +":data:`raiseExceptions` 的默认值是 ``True``。这是因为在开发期间,你通常想要在发生异常时收到通知。建议你将 " +":data:`raiseExceptions` 设为 ``False`` 供生产环境下使用。" + +#: ../../howto/logging.rst:1058 +msgid "Using arbitrary objects as messages" +msgstr "使用任意对象作为消息" + +#: ../../howto/logging.rst:1060 +msgid "" +"In the preceding sections and examples, it has been assumed that the message" +" passed when logging the event is a string. However, this is not the only " +"possibility. You can pass an arbitrary object as a message, and its " +":meth:`~object.__str__` method will be called when the logging system needs " +"to convert it to a string representation. In fact, if you want to, you can " +"avoid computing a string representation altogether - for example, the " +":class:`~handlers.SocketHandler` emits an event by pickling it and sending " +"it over the wire." +msgstr "" +"在前面的部分和示例中,都假设记录事件时传递的消息是字符串。 " +"但是,这不是唯一的可能性。你可以将任意对象作为消息传递,并且当日志记录系统需要将其转换为字符串表示时,将调用其 " +":meth:`~object.__str__` 方法。实际上,如果你愿意,你可以完全避免计算字符串表示。例如, " +":class:`~handlers.SocketHandler` 用 pickle 处理事件后,通过网络发送。" + +#: ../../howto/logging.rst:1071 +msgid "Optimization" +msgstr "优化" + +#: ../../howto/logging.rst:1073 +msgid "" +"Formatting of message arguments is deferred until it cannot be avoided. " +"However, computing the arguments passed to the logging method can also be " +"expensive, and you may want to avoid doing it if the logger will just throw " +"away your event. To decide what to do, you can call the " +":meth:`~Logger.isEnabledFor` method which takes a level argument and returns" +" true if the event would be created by the Logger for that level of call. " +"You can write code like this::" +msgstr "" +"消息参数的格式化将被推迟,直到无法避免。但是,计算传递给日志记录方法的参数也可能很消耗资源,如果记录器只是丢弃你的事件,你可能希望避免这样做。要决定做什么,可以调用" +" :meth:`~Logger.isEnabledFor` 方法,该方法接受一个 level 参数,如果记录器为该级别的调用创建了该事件,则返回 " +"true。你可以写这样的代码::" + +#: ../../howto/logging.rst:1081 +msgid "" +"if logger.isEnabledFor(logging.DEBUG):\n" +" logger.debug('Message with %s, %s', expensive_func1(),\n" +" expensive_func2())" +msgstr "" +"if logger.isEnabledFor(logging.DEBUG):\n" +" logger.debug('Message with %s, %s', expensive_func1(),\n" +" expensive_func2())" + +#: ../../howto/logging.rst:1085 +msgid "" +"so that if the logger's threshold is set above ``DEBUG``, the calls to " +"``expensive_func1`` and ``expensive_func2`` are never made." +msgstr "" +"因此如果日志记录器的阈值设置高于 ``DEBUG``,则永远不会调用 ``expensive_func1`` 和 " +"``expensive_func2``。" + +#: ../../howto/logging.rst:1088 +msgid "" +"In some cases, :meth:`~Logger.isEnabledFor` can itself be more expensive " +"than you'd like (e.g. for deeply nested loggers where an explicit level is " +"only set high up in the logger hierarchy). In such cases (or if you want to " +"avoid calling a method in tight loops), you can cache the result of a call " +"to :meth:`~Logger.isEnabledFor` in a local or instance variable, and use " +"that instead of calling the method each time. Such a cached value would only" +" need to be recomputed when the logging configuration changes dynamically " +"while the application is running (which is not all that common)." +msgstr "" +"在某些情况下, :meth:`~Logger.isEnabledFor` " +"本身可能比你想要的更消耗资源(例如,对于深度嵌套的记录器,其中仅在记录器层次结构中设置了显式级别)。在这种情况下(或者如果你想避免在紧密循环中调用方法),你可以在本地或实例变量中将调用的结果缓存到" +" :meth:`~Logger.isEnabledFor` " +",并使用它而不是每次调用方法。在日志记录配置在应用程序运行时动态更改(这不常见)时,只需要重新计算这样的缓存值即可。" + +#: ../../howto/logging.rst:1097 +msgid "" +"There are other optimizations which can be made for specific applications " +"which need more precise control over what logging information is collected. " +"Here's a list of things you can do to avoid processing during logging which " +"you don't need:" +msgstr "对于需要对收集的日志信息进行更精确控制的特定应用程序,还可以进行其他优化。以下列出了在日志记录过程中您可以避免的非必须处理操作:" + +#: ../../howto/logging.rst:1103 +msgid "What you don't want to collect" +msgstr "你不想收集的内容" + +#: ../../howto/logging.rst:1103 +msgid "How to avoid collecting it" +msgstr "如何避免收集它" + +#: ../../howto/logging.rst:1105 +msgid "Information about where calls were made from." +msgstr "有关调用来源的信息" + +#: ../../howto/logging.rst:1105 +msgid "" +"Set ``logging._srcfile`` to ``None``. This avoids calling " +":func:`sys._getframe`, which may help to speed up your code in environments " +"like PyPy (which can't speed up code that uses :func:`sys._getframe`)." +msgstr "" +"将 ``logging._srcfile`` 设置为 ``None``。这避免了调用 :func:`sys._getframe`,这可能有助于加速 " +"PyPy 等环境(无法加速使用 :func:`sys._getframe` 的代码)中的代码。" + +#: ../../howto/logging.rst:1111 +msgid "Threading information." +msgstr "线程信息" + +#: ../../howto/logging.rst:1111 +msgid "Set ``logging.logThreads`` to ``False``." +msgstr "将 ``logging.logThreads`` 设为 ``False``。" + +#: ../../howto/logging.rst:1113 +msgid "Current process ID (:func:`os.getpid`)" +msgstr "当前进程 ID (:func:`os.getpid`)" + +#: ../../howto/logging.rst:1113 +msgid "Set ``logging.logProcesses`` to ``False``." +msgstr "将 ``logging.logProcesses`` 设为 ``False``。" + +#: ../../howto/logging.rst:1115 +msgid "" +"Current process name when using ``multiprocessing`` to manage multiple " +"processes." +msgstr "当使用 ``multiprocessing`` 来管理多个进程时的当前进程名称。" + +#: ../../howto/logging.rst:1115 +msgid "Set ``logging.logMultiprocessing`` to ``False``." +msgstr "将 ``logging.logMultiprocessing`` 设为 ``False``。" + +#: ../../howto/logging.rst:1118 +msgid "Current :class:`asyncio.Task` name when using ``asyncio``." +msgstr "在使用 ``asyncio`` 时的当前 :class:`asyncio.Task` 名称。" + +#: ../../howto/logging.rst:1118 +msgid "Set ``logging.logAsyncioTasks`` to ``False``." +msgstr "将 ``logging.logAsyncioTasks`` 设为 ``False``。" + +#: ../../howto/logging.rst:1122 +msgid "" +"Also note that the core logging module only includes the basic handlers. If " +"you don't import :mod:`logging.handlers` and :mod:`logging.config`, they " +"won't take up any memory." +msgstr "" +"另请注意,核心日志记录模块仅包含基本处理器。如果你不导入 :mod:`logging.handlers` 和 :mod:`logging.config`" +" ,它们将不会占用任何内存。" + +#: ../../howto/logging.rst:1129 +msgid "Other resources" +msgstr "其他资源" + +#: ../../howto/logging.rst:1133 +msgid "Module :mod:`logging`" +msgstr "模块 :mod:`logging`" + +#: ../../howto/logging.rst:1134 +msgid "API reference for the logging module." +msgstr "日志记录模块的 API 参考。" + +#: ../../howto/logging.rst:1136 +msgid "Module :mod:`logging.config`" +msgstr ":mod:`logging.config` 模块" + +#: ../../howto/logging.rst:1137 +msgid "Configuration API for the logging module." +msgstr "日志记录模块的配置 API。" + +#: ../../howto/logging.rst:1139 +msgid "Module :mod:`logging.handlers`" +msgstr ":mod:`logging.handlers` 模块" + +#: ../../howto/logging.rst:1140 +msgid "Useful handlers included with the logging module." +msgstr "日志记录模块附带的有用处理器。" + +#: ../../howto/logging.rst:1142 +msgid ":ref:`A logging cookbook `" +msgstr ":ref:`日志操作手册 `" diff --git a/howto/mro.po b/howto/mro.po new file mode 100644 index 0000000000..4c028c5fe8 --- /dev/null +++ b/howto/mro.po @@ -0,0 +1,1165 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-06-29 17:42+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../howto/mro.rst:4 +msgid "The Python 2.3 Method Resolution Order" +msgstr "Python 2.3 方法解析顺序" + +#: ../../howto/mro.rst:8 +msgid "" +"This is a historical document, provided as an appendix to the official " +"documentation. The Method Resolution Order discussed here was *introduced* " +"in Python 2.3, but it is still used in later versions -- including Python 3." +msgstr "" +"这是一份历史性的文档,作为官方文档的附录提供。这里所讨论的方法解析顺序在 Python 2.3 中 *被引入*,但在之后的版本中仍然被使用 -- 包括 " +"Python 3." + +#: ../../howto/mro.rst:13 +msgid "By `Michele Simionato `__." +msgstr "" + +#: ../../howto/mro.rst:0 +msgid "Abstract" +msgstr "摘要" + +#: ../../howto/mro.rst:17 +msgid "" +"*This document is intended for Python programmers who want to understand the" +" C3 Method Resolution Order used in Python 2.3. Although it is not intended " +"for newbies, it is quite pedagogical with many worked out examples. I am " +"not aware of other publicly available documents with the same scope, " +"therefore it should be useful.*" +msgstr "" +"*本文档的目标读者是那些希望理解 Python 2.3 中使用的 C3 方法解析顺序的 Python 程序员。 " +"虽然它不是为新手准备的,但它具有很强的教学性,包含许多实用的例子。据我所知还没有其他公开文档涵盖相同的领域,因此它应该是有用的。*" + +#: ../../howto/mro.rst:23 +msgid "Disclaimer:" +msgstr "免责声明:" + +#: ../../howto/mro.rst:25 +msgid "" +"*I donate this document to the Python Software Foundation, under the Python " +"2.3 license. As usual in these circumstances, I warn the reader that what " +"follows* should *be correct, but I don't give any warranty. Use it at your " +"own risk and peril!*" +msgstr "" +"*我将此文档捐赠给 Python 软件基金会,采用 Python 2.3 许可。如在这种情况下通常做法,我警示读者下面的内容* 应该 " +"*是正确的,但我不提供任何保证。请自行承担使用风险与损害!*" + +#: ../../howto/mro.rst:30 +msgid "Acknowledgments:" +msgstr "致谢:" + +#: ../../howto/mro.rst:32 +msgid "" +"*All the people of the Python mailing list who sent me their support. Paul " +"Foley who pointed out various imprecisions and made me to add the part on " +"local precedence ordering. David Goodger for help with the formatting in " +"reStructuredText. David Mertz for help with the editing. Finally, Guido van " +"Rossum who enthusiastically added this document to the official Python 2.3 " +"home-page.*" +msgstr "" +"*Python 邮件列表中所有对我表示支持的人。Paul Foley,他指出了各种不精确之处并让我添加了本地优先排序的部分。David Goodger " +"在 reStructuredText 格式化方面的帮助。David Mertz 在编辑方面提供的帮助。最后,Guido van Rossum " +"热心地将本文档添加到官方 Python 2.3 主页。*" + +#: ../../howto/mro.rst:40 +msgid "The beginning" +msgstr "开始" + +#: ../../howto/mro.rst:42 +msgid "*Felix qui potuit rerum cognoscere causas* -- Virgilius" +msgstr "*Felix qui potuit rerum cognoscere causas* -- Virgilius" + +#: ../../howto/mro.rst:44 +msgid "" +"Everything started with a post by Samuele Pedroni to the Python development " +"mailing list [#]_. In his post, Samuele showed that the Python 2.2 method " +"resolution order is not monotonic and he proposed to replace it with the C3 " +"method resolution order. Guido agreed with his arguments and therefore now " +"Python 2.3 uses C3. The C3 method itself has nothing to do with Python, " +"since it was invented by people working on Dylan and it is described in a " +"paper intended for lispers [#]_. The present paper gives a (hopefully) " +"readable discussion of the C3 algorithm for Pythonistas who want to " +"understand the reasons for the change." +msgstr "" +"事情开始于 Samuele Pedroni 在 Python 开发邮件列表上的一个帖子 [#]_。在他的帖子里,Samuele 表示 Python " +"2.2 方法解析顺序不是单调的并提议用 C3 方法解析顺序来替代它。Guido 认同他的意见因此现在 Python 2.3 使用了 C3。C3 " +"方法本身与 Python 没有关系,因为它由使用 Dylan 的人发明并在一篇针对 lisp 程序员的论文中描述 [#]_。 " +"本文给出了面向希望理解这项改变的理由的 Python 使用者的(尽可能)易读的 C3 算法相关讨论。" + +#: ../../howto/mro.rst:55 +msgid "" +"First of all, let me point out that what I am going to say only applies to " +"the *new style classes* introduced in Python 2.2: *classic classes* " +"maintain their old method resolution order, depth first and then left to " +"right. Therefore, there is no breaking of old code for classic classes; and" +" even if in principle there could be breaking of code for Python 2.2 new " +"style classes, in practice the cases in which the C3 resolution order " +"differs from the Python 2.2 method resolution order are so rare that no real" +" breaking of code is expected. Therefore:" +msgstr "" +"首先,我要指出我即将介绍的情况仅作用于在 Python 2.2 中引入的 *新式类*: *经典类* 将保持其原有的方法解析顺序,深度优先并且从左至右。 " +"因此,不存在对经典类原有代码的破坏;而且虽然在原理上存在对 Python 2.2 新式类代码的破坏,但在实践中 C3 解析顺序与 Python 2.2 " +"方法解析顺序存在不同的情况是如此稀少以至于不会真正破坏原有代码。所以:" + +#: ../../howto/mro.rst:64 +msgid "*Don't be scared!*" +msgstr "*不必害怕!*" + +#: ../../howto/mro.rst:66 +msgid "" +"Moreover, unless you make strong use of multiple inheritance and you have " +"non-trivial hierarchies, you don't need to understand the C3 algorithm, and " +"you can easily skip this paper. On the other hand, if you really want to " +"know how multiple inheritance works, then this paper is for you. The good " +"news is that things are not as complicated as you might expect." +msgstr "" +"此外,除非你高强度地使用多重继承并且有复杂的层级结构,否则你就不需要理解 C3 算法,可以轻松地跳过本文。 " +"另一方面,如果你真的想知道多重继承是如何工作的,那么本文就是为你准备的。好消息是事情并没有你想象的那么复杂。" + +#: ../../howto/mro.rst:73 +msgid "Let me begin with some basic definitions." +msgstr "让我们从一些基本的定义开始。" + +#: ../../howto/mro.rst:75 +msgid "" +"Given a class C in a complicated multiple inheritance hierarchy, it is a " +"non-trivial task to specify the order in which methods are overridden, i.e. " +"to specify the order of the ancestors of C." +msgstr "在一个复杂的多重继承层级结构中给定一个类 C,要指明方法的覆盖顺序,即 C 的祖先的顺序是一项并不轻松的任务。" + +#: ../../howto/mro.rst:79 +msgid "" +"The list of the ancestors of a class C, including the class itself, ordered " +"from the nearest ancestor to the furthest, is called the class precedence " +"list or the *linearization* of C." +msgstr "类 C 的祖先列表(包括类本身)从最近的祖先到最远的祖先排序,称为类优先级列表或 C 的 *线性化*。" + +#: ../../howto/mro.rst:83 +msgid "" +"The *Method Resolution Order* (MRO) is the set of rules that construct the " +"linearization. In the Python literature, the idiom \"the MRO of C\" is also" +" used as a synonymous for the linearization of the class C." +msgstr "" +"*方法解析顺序* (MRO) 是构造线性化的规则集合。在 Python 的语境中,术语 \"C 的 MRO\" 也会被用作类 C 的线性化的同义词。" + +#: ../../howto/mro.rst:88 +msgid "" +"For instance, in the case of single inheritance hierarchy, if C is a " +"subclass of C1, and C1 is a subclass of C2, then the linearization of C is " +"simply the list [C, C1 , C2]. However, with multiple inheritance " +"hierarchies, the construction of the linearization is more cumbersome, since" +" it is more difficult to construct a linearization that respects *local " +"precedence ordering* and *monotonicity*." +msgstr "" +"举例来说,在单继承层级结构的情况下,如果 C 是 C1 的子类,而 C1 是 C2 的子类,那么 C 的线性化就是简单的列表 [C, C1 , C2]。" +" 但是,对于多继承层级结构,线性化的构造就比较麻烦了,因为要构造一个尊重 *局部优先级排序* 和 *单调性* 的线性化将更为困难。" + +#: ../../howto/mro.rst:96 +msgid "" +"I will discuss the local precedence ordering later, but I can give the " +"definition of monotonicity here. A MRO is monotonic when the following is " +"true: *if C1 precedes C2 in the linearization of C, then C1 precedes C2 in " +"the linearization of any subclass of C*. Otherwise, the innocuous operation " +"of deriving a new class could change the resolution order of methods, " +"potentially introducing very subtle bugs. Examples where this happens will " +"be shown later." +msgstr "" +"我稍后会讨论局部优先级顺序问题,但我可以先在这里给出单调性的定义。当以下情况为真时一个 MRO 就是单调的:*如果在 C 的线性化中 C1 先于 " +"C2,那么在 C 的任何子类的线性化中 C1 都先于 C2*。 " +"在其他情况下,派生新类的无害操作就可能会改变方法的解析顺序,从而可能引入非常微妙的程序错误。稍后将举例说明这种情况。" + +#: ../../howto/mro.rst:104 +msgid "" +"Not all classes admit a linearization. There are cases, in complicated " +"hierarchies, where it is not possible to derive a class such that its " +"linearization respects all the desired properties." +msgstr "并非所有的类都允许线性化。在复杂的层级结构中,有些情况下不可能派生出一个类使其线性化遵循所有需要的属性。" + +#: ../../howto/mro.rst:108 +msgid "Here I give an example of this situation. Consider the hierarchy" +msgstr "在此我举一个例子来说明这种情况。考虑以下层级结构" + +#: ../../howto/mro.rst:116 +msgid "" +"which can be represented with the following inheritance graph, where I have " +"denoted with O the ``object`` class, which is the beginning of any hierarchy" +" for new style classes:" +msgstr "它可以用以下继承图来表示,其中我用 O 来标记 ``object`` 类,它是任何新式类层级结构的起点:" + +#: ../../howto/mro.rst:120 +msgid "" +" -----------\n" +"| |\n" +"| O |\n" +"| / \\ |\n" +" - X Y /\n" +" | / | /\n" +" | / |/\n" +" A B\n" +" \\ /\n" +" ?" +msgstr "" +" -----------\n" +"| |\n" +"| O |\n" +"| / \\ |\n" +" - X Y /\n" +" | / | /\n" +" | / |/\n" +" A B\n" +" \\ /\n" +" ?" + +#: ../../howto/mro.rst:133 +msgid "" +"In this case, it is not possible to derive a new class C from A and B, since" +" X precedes Y in A, but Y precedes X in B, therefore the method resolution " +"order would be ambiguous in C." +msgstr "" +"在此情况下,从 A 和 B 派生新类是不可能的,因为在 A 中 X 先于 Y,但在 B 中 Y 先于 X,因此在 C 中方法解析顺序将出现歧义。" + +#: ../../howto/mro.rst:137 +msgid "" +"Python 2.3 raises an exception in this situation (TypeError: MRO conflict " +"among bases Y, X) forbidding the naive programmer from creating ambiguous " +"hierarchies. Python 2.2 instead does not raise an exception, but chooses an" +" *ad hoc* ordering (CABXYO in this case)." +msgstr "" +"Python 2.3 在此情况下会引发异常 (TypeError: MRO conflict among bases Y, X) " +"以防止程序员在无意中创建有歧义的层级结构。Python 2.2 不会引发异常,而是会选择一个 *临时* 顺序 (在本例中为 CABXYO)。" + +#: ../../howto/mro.rst:143 +msgid "The C3 Method Resolution Order" +msgstr "C3 方法解析顺序" + +#: ../../howto/mro.rst:145 +msgid "" +"Let me introduce a few simple notations which will be useful for the " +"following discussion. I will use the shortcut notation::" +msgstr "让我们引入一些适用于接下来的讨论的简单标记法。我会使用这样的快捷标记::" + +#: ../../howto/mro.rst:148 +msgid "C1 C2 ... CN" +msgstr "C1 C2 ... CN" + +#: ../../howto/mro.rst:150 +msgid "to indicate the list of classes [C1, C2, ... , CN]." +msgstr "来表示类列表 [C1, C2, ... , CN]。" + +#: ../../howto/mro.rst:152 +msgid "The *head* of the list is its first element::" +msgstr "列表的 *head* 是其第一个元素::" + +#: ../../howto/mro.rst:154 +msgid "head = C1" +msgstr "head = C1" + +#: ../../howto/mro.rst:156 +msgid "whereas the *tail* is the rest of the list::" +msgstr "而 *tail* 则是列表的其余元素::" + +#: ../../howto/mro.rst:158 +msgid "tail = C2 ... CN." +msgstr "tail = C2 ... CN." + +#: ../../howto/mro.rst:160 +msgid "I shall also use the notation::" +msgstr "我还将使用这样的标记::" + +#: ../../howto/mro.rst:162 +msgid "C + (C1 C2 ... CN) = C C1 C2 ... CN" +msgstr "C + (C1 C2 ... CN) = C C1 C2 ... CN" + +#: ../../howto/mro.rst:164 +msgid "to denote the sum of the lists [C] + [C1, C2, ... ,CN]." +msgstr "来表示列表 [C] + [C1,C2,...,CN] 的总和。" + +#: ../../howto/mro.rst:166 +msgid "Now I can explain how the MRO works in Python 2.3." +msgstr "现在我就可以解释 MRO 在 Python 2.3 中的工作原理了。" + +#: ../../howto/mro.rst:168 +msgid "" +"Consider a class C in a multiple inheritance hierarchy, with C inheriting " +"from the base classes B1, B2, ... , BN. We want to compute the " +"linearization L[C] of the class C. The rule is the following:" +msgstr "考虑多重继承层级结构中的类 C,C 继承自基类 B1, B2, ... , BN。我们想要计算类 C 的线性化 L[C]。规则如下:" + +#: ../../howto/mro.rst:173 +msgid "" +"*the linearization of C is the sum of C plus the merge of the linearizations" +" of the parents and the list of the parents.*" +msgstr "*C 的线性化就是 C 加上对父类的线性化与父类列表进行合并的总和。*" + +#: ../../howto/mro.rst:176 +msgid "In symbolic notation::" +msgstr "使用符号标记法::" + +#: ../../howto/mro.rst:178 +msgid "L[C(B1 ... BN)] = C + merge(L[B1] ... L[BN], B1 ... BN)" +msgstr "L[C(B1 ... BN)] = C + merge(L[B1] ... L[BN], B1 ... BN)" + +#: ../../howto/mro.rst:180 +msgid "" +"In particular, if C is the ``object`` class, which has no parents, the " +"linearization is trivial::" +msgstr "特别地,如果 C 为 ``object`` 类,它是没有父类的,其线性化很简单::" + +#: ../../howto/mro.rst:183 +msgid "L[object] = object." +msgstr "L[object] = object." + +#: ../../howto/mro.rst:185 +msgid "" +"However, in general one has to compute the merge according to the following " +"prescription:" +msgstr "不过,在通常情况下我们需要根据以下预设规则来计算合并结果:" + +#: ../../howto/mro.rst:188 +msgid "" +"*take the head of the first list, i.e L[B1][0]; if this head is not in the " +"tail of any of the other lists, then add it to the linearization of C and " +"remove it from the lists in the merge, otherwise look at the head of the " +"next list and take it, if it is a good head. Then repeat the operation " +"until all the class are removed or it is impossible to find good heads. In " +"this case, it is impossible to construct the merge, Python 2.3 will refuse " +"to create the class C and will raise an exception.*" +msgstr "" +"*取第一个列表的 head,即 L[B1][0];如果这个 head 不在任何其他列表的 tail 内,则将其添加到 C " +"的线性化中,并在合并结果中将其从列表中移除,否则如果下一个列表的 head 是好的 head 则使用它。 " +"然后重复上述操作直到所有类都被移除或是无法找到好的 head。在这种情况下将无法构造合并结果,Python 2.3 将拒绝创建类 C 并将引发 异常。*" + +#: ../../howto/mro.rst:197 +msgid "" +"This prescription ensures that the merge operation *preserves* the ordering," +" if the ordering can be preserved. On the other hand, if the order cannot " +"be preserved (as in the example of serious order disagreement discussed " +"above) then the merge cannot be computed." +msgstr "" +"这一预设规则可以确保合并操作 *保留* 顺序,如果顺序能被保留的话。 " +"在另一方面,如果顺序无法被保留(如上文讨论的顺序严重不一致的例子)则无法计算合并结果。" + +#: ../../howto/mro.rst:202 +msgid "" +"The computation of the merge is trivial if C has only one parent (single " +"inheritance); in this case::" +msgstr "如果 C 只有一个父类(单一继承)则合并结果的计算将很简单;在这种情况下::" + +#: ../../howto/mro.rst:205 +msgid "L[C(B)] = C + merge(L[B],B) = C + L[B]" +msgstr "L[C(B)] = C + merge(L[B],B) = C + L[B]" + +#: ../../howto/mro.rst:207 +msgid "" +"However, in the case of multiple inheritance things are more cumbersome and " +"I don't expect you can understand the rule without a couple of examples ;-)" +msgstr "不过,对于多重继承的情况事情就会比较麻烦,如果不举几个例子我估计你是无法理解具体规则的 ;-)" + +#: ../../howto/mro.rst:212 +msgid "Examples" +msgstr "例子" + +#: ../../howto/mro.rst:214 +msgid "First example. Consider the following hierarchy:" +msgstr "第一个例子。考虑以下层级结构:" + +#: ../../howto/mro.rst:224 +msgid "In this case the inheritance graph can be drawn as:" +msgstr "在这种情况下继承图可以绘制为:" + +#: ../../howto/mro.rst:226 +msgid "" +" 6\n" +" ---\n" +"Level 3 | O | (more general)\n" +" / --- \\\n" +" / | \\ |\n" +" / | \\ |\n" +" / | \\ |\n" +" --- --- --- |\n" +"Level 2 3 | D | 4| E | | F | 5 |\n" +" --- --- --- |\n" +" \\ \\ _ / | |\n" +" \\ / \\ _ | |\n" +" \\ / \\ | |\n" +" --- --- |\n" +"Level 1 1 | B | | C | 2 |\n" +" --- --- |\n" +" \\ / |\n" +" \\ / \\ /\n" +" ---\n" +"Level 0 0 | A | (more specialized)\n" +" ---" +msgstr "" +" 6\n" +" ---\n" +"Level 3 | O | (more general)\n" +" / --- \\\n" +" / | \\ |\n" +" / | \\ |\n" +" / | \\ |\n" +" --- --- --- |\n" +"Level 2 3 | D | 4| E | | F | 5 |\n" +" --- --- --- |\n" +" \\ \\ _ / | |\n" +" \\ / \\ _ | |\n" +" \\ / \\ | |\n" +" --- --- |\n" +"Level 1 1 | B | | C | 2 |\n" +" --- --- |\n" +" \\ / |\n" +" \\ / \\ /\n" +" ---\n" +"Level 0 0 | A | (more specialized)\n" +" ---" + +#: ../../howto/mro.rst:251 +msgid "The linearizations of O,D,E and F are trivial::" +msgstr "O、D、E 和 F 的线性化很简单::" + +#: ../../howto/mro.rst:253 +msgid "" +"L[O] = O\n" +"L[D] = D O\n" +"L[E] = E O\n" +"L[F] = F O" +msgstr "" +"L[O] = O\n" +"L[D] = D O\n" +"L[E] = E O\n" +"L[F] = F O" + +#: ../../howto/mro.rst:258 +msgid "The linearization of B can be computed as::" +msgstr "B 的线性化可以被计算为::" + +#: ../../howto/mro.rst:260 +msgid "L[B] = B + merge(DO, EO, DE)" +msgstr "L[B] = B + merge(DO, EO, DE)" + +#: ../../howto/mro.rst:262 +msgid "" +"We see that D is a good head, therefore we take it and we are reduced to " +"compute ``merge(O,EO,E)``. Now O is not a good head, since it is in the " +"tail of the sequence EO. In this case the rule says that we have to skip to" +" the next sequence. Then we see that E is a good head; we take it and we " +"are reduced to compute ``merge(O,O)`` which gives O. Therefore::" +msgstr "" +"我们看到 D 是一个好的 head,因此我们使用它这样就可以简化为计算 ``merge(O,EO,E)``。现在 O 不是一个好的 " +"head,因为它在序列 EO 的 tail 内。在这种情况下规则要求我们必须跳到下一个序列。然后我们可以看到 E 是一个好的 " +"head;我们使用它这样就可以简化为计算 ``merge(O,O)`` 从而得到 O。因此::" + +#: ../../howto/mro.rst:268 +msgid "L[B] = B D E O" +msgstr "L[B] = B D E O" + +#: ../../howto/mro.rst:270 +msgid "Using the same procedure one finds::" +msgstr "使用同样的步骤我们将发现::" + +#: ../../howto/mro.rst:272 +msgid "" +"L[C] = C + merge(DO,FO,DF)\n" +" = C + D + merge(O,FO,F)\n" +" = C + D + F + merge(O,O)\n" +" = C D F O" +msgstr "" +"L[C] = C + merge(DO,FO,DF)\n" +" = C + D + merge(O,FO,F)\n" +" = C + D + F + merge(O,O)\n" +" = C D F O" + +#: ../../howto/mro.rst:277 +msgid "Now we can compute::" +msgstr "现在我们可以计算::" + +#: ../../howto/mro.rst:279 +msgid "" +"L[A] = A + merge(BDEO,CDFO,BC)\n" +" = A + B + merge(DEO,CDFO,C)\n" +" = A + B + C + merge(DEO,DFO)\n" +" = A + B + C + D + merge(EO,FO)\n" +" = A + B + C + D + E + merge(O,FO)\n" +" = A + B + C + D + E + F + merge(O,O)\n" +" = A B C D E F O" +msgstr "" +"L[A] = A + merge(BDEO,CDFO,BC)\n" +" = A + B + merge(DEO,CDFO,C)\n" +" = A + B + C + merge(DEO,DFO)\n" +" = A + B + C + D + merge(EO,FO)\n" +" = A + B + C + D + E + merge(O,FO)\n" +" = A + B + C + D + E + F + merge(O,O)\n" +" = A B C D E F O" + +#: ../../howto/mro.rst:287 +msgid "" +"In this example, the linearization is ordered in a pretty nice way according" +" to the inheritance level, in the sense that lower levels (i.e. more " +"specialized classes) have higher precedence (see the inheritance graph). " +"However, this is not the general case." +msgstr "在这个例子中,线性化按照继承级别进行了良好的排序,即级别越低(即更特化的类)优先级越高(见继承图)。然而,这并不是一般的情况。" + +#: ../../howto/mro.rst:292 +msgid "" +"I leave as an exercise for the reader to compute the linearization for my " +"second example:" +msgstr "我把计算第二个例子的线性化作为一个练习留给读者完成:" + +#: ../../howto/mro.rst:303 +msgid "" +"The only difference with the previous example is the change B(D,E) --> " +"B(E,D); however even such a little modification completely changes the " +"ordering of the hierarchy:" +msgstr "与前一例子的唯一区别在于 B(D,E) --> B(E,D);然而即使是这样一个小小的改动也完全改变了层级结构的顺序:" + +#: ../../howto/mro.rst:307 +msgid "" +" 6\n" +" ---\n" +"Level 3 | O |\n" +" / --- \\\n" +" / | \\\n" +" / | \\\n" +" / | \\\n" +" --- --- ---\n" +"Level 2 2 | E | 4 | D | | F | 5\n" +" --- --- ---\n" +" \\ / \\ /\n" +" \\ / \\ /\n" +" \\ / \\ /\n" +" --- ---\n" +"Level 1 1 | B | | C | 3\n" +" --- ---\n" +" \\ /\n" +" \\ /\n" +" ---\n" +"Level 0 0 | A |\n" +" ---" +msgstr "" +" 6\n" +" ---\n" +"Level 3 | O |\n" +" / --- \\\n" +" / | \\\n" +" / | \\\n" +" / | \\\n" +" --- --- ---\n" +"Level 2 2 | E | 4 | D | | F | 5\n" +" --- --- ---\n" +" \\ / \\ /\n" +" \\ / \\ /\n" +" \\ / \\ /\n" +" --- ---\n" +"Level 1 1 | B | | C | 3\n" +" --- ---\n" +" \\ /\n" +" \\ /\n" +" ---\n" +"Level 0 0 | A |\n" +" ---" + +#: ../../howto/mro.rst:332 +msgid "" +"Notice that the class E, which is in the second level of the hierarchy, " +"precedes the class C, which is in the first level of the hierarchy, i.e. E " +"is more specialized than C, even if it is in a higher level." +msgstr "请注意处在层级结构第二层级的类 E,它先于处在层级结构第一层级的类 C,也就是说,E 比 C 更特化,即便它处在更高的层级。" + +#: ../../howto/mro.rst:336 +msgid "" +"A lazy programmer can obtain the MRO directly from Python 2.2, since in this" +" case it coincides with the Python 2.3 linearization. It is enough to " +"invoke the :meth:`~type.mro` method of class A:" +msgstr "" +"懒惰的程序员可以直接获取 Python 2.2 的 MRO,因为在这种情况下它会与 Python 2.3 的线性化恰好一致。只需调用类 A 的 " +":meth:`~type.mro` 方法就够了:" + +#: ../../howto/mro.rst:345 +msgid "" +"Finally, let me consider the example discussed in the first section, " +"involving a serious order disagreement. In this case, it is straightforward" +" to compute the linearizations of O, X, Y, A and B:" +msgstr "最后,让我来讲解第一小节所讨论的例子,其中涉及严重的顺序不一致问题。在这种情况下,可以直接计算 O、X、Y、A 和 B 的线性化:" + +#: ../../howto/mro.rst:349 +msgid "" +"L[O] = 0\n" +"L[X] = X O\n" +"L[Y] = Y O\n" +"L[A] = A X Y O\n" +"L[B] = B Y X O" +msgstr "" +"L[O] = 0\n" +"L[X] = X O\n" +"L[Y] = Y O\n" +"L[A] = A X Y O\n" +"L[B] = B Y X O" + +#: ../../howto/mro.rst:357 +msgid "" +"However, it is impossible to compute the linearization for a class C that " +"inherits from A and B::" +msgstr "然而,要计算继承自 A 和 B 的类 C 的线性化则是不可能的::" + +#: ../../howto/mro.rst:360 +msgid "" +"L[C] = C + merge(AXYO, BYXO, AB)\n" +" = C + A + merge(XYO, BYXO, B)\n" +" = C + A + B + merge(XYO, YXO)" +msgstr "" +"L[C] = C + merge(AXYO, BYXO, AB)\n" +" = C + A + merge(XYO, BYXO, B)\n" +" = C + A + B + merge(XYO, YXO)" + +#: ../../howto/mro.rst:364 +msgid "" +"At this point we cannot merge the lists XYO and YXO, since X is in the tail " +"of YXO whereas Y is in the tail of XYO: therefore there are no good heads " +"and the C3 algorithm stops. Python 2.3 raises an error and refuses to " +"create the class C." +msgstr "" +"此时我们无法合并列表 XYO 和 YXO,因为 X 在 YXO 的 tail 内,而 Y 在 XYO 的 tail 内:因此没有好的 head 从而 " +"C3 算法将停止。Python 2.3 将引发一个错误并拒绝创建类 C。" + +#: ../../howto/mro.rst:370 +msgid "Bad Method Resolution Orders" +msgstr "坏的方法解析顺序" + +#: ../../howto/mro.rst:372 +msgid "" +"A MRO is *bad* when it breaks such fundamental properties as local " +"precedence ordering and monotonicity. In this section, I will show that " +"both the MRO for classic classes and the MRO for new style classes in Python" +" 2.2 are bad." +msgstr "" +"当一个 MRO 破坏了诸如局部优先顺序和单调性等基本属性时它就是 *坏的*。在本节中,我将证明 Python 2.2 中经典类的 MRO 和新式类的 " +"MRO 都是坏的。" + +#: ../../howto/mro.rst:377 +msgid "" +"It is easier to start with the local precedence ordering. Consider the " +"following example:" +msgstr "从局部优先顺序开始会更简单。请看下面的例子:" + +#: ../../howto/mro.rst:384 +msgid "with inheritance diagram" +msgstr "继承图如下" + +#: ../../howto/mro.rst:386 +msgid "" +" O\n" +" |\n" +"(buy spam) F\n" +" | \\\n" +" | E (buy eggs)\n" +" | /\n" +" G\n" +"\n" +" (buy eggs or spam ?)" +msgstr "" +" O\n" +" |\n" +"(buy spam) F\n" +" | \\\n" +" | E (buy eggs)\n" +" | /\n" +" G\n" +"\n" +" (buy eggs or spam ?)" + +#: ../../howto/mro.rst:399 +msgid "" +"We see that class G inherits from F and E, with F *before* E: therefore we " +"would expect the attribute *G.remember2buy* to be inherited by " +"*F.remember2buy* and not by *E.remember2buy*: nevertheless Python 2.2 gives" +msgstr "" +"我们看到类 G 继承自 F 和 E,其中 F *先于* E:因此我们预期属性 *G.remember2buy* 会被 *F.remember2buy* " +"而不是被 *E.remember2buy* 所继承:然而 Python 2.2 给出的结果是" + +#: ../../howto/mro.rst:407 +msgid "" +"This is a breaking of local precedence ordering since the order in the local" +" precedence list, i.e. the list of the parents of G, is not preserved in the" +" Python 2.2 linearization of G::" +msgstr "这是对局部优先顺序的破坏因为在 Python 2.2 对 G 进行线性化时,局部优先列表即 G 的父类列表中的顺序并不会被保留::" + +#: ../../howto/mro.rst:411 +msgid "L[G,P22]= G E F object # F *follows* E" +msgstr "L[G,P22]= G E F object # F 在 E *之后*" + +#: ../../howto/mro.rst:413 +msgid "" +"One could argue that the reason why F follows E in the Python 2.2 " +"linearization is that F is less specialized than E, since F is the " +"superclass of E; nevertheless the breaking of local precedence ordering is " +"quite non-intuitive and error prone. This is particularly true since it is " +"a different from old style classes:" +msgstr "" +"有人可能会说在 Python 2.2 的线性化中 F 在 E 之后的原因是 F 的特化程度低于 E,因为 F 是 E " +"的超类;然而打破局部优先排序是相当反直觉且容易导致错误的。这一点因为它与旧式类不同而尤其明显:" + +#: ../../howto/mro.rst:425 +msgid "" +"In this case the MRO is GFEF and the local precedence ordering is preserved." +msgstr "在这种情况下 MRO 为 GFEF 并保留了局部优先顺序。" + +#: ../../howto/mro.rst:428 +msgid "" +"As a general rule, hierarchies such as the previous one should be avoided, " +"since it is unclear if F should override E or vice-versa. Python 2.3 solves " +"the ambiguity by raising an exception in the creation of class G, " +"effectively stopping the programmer from generating ambiguous hierarchies. " +"The reason for that is that the C3 algorithm fails when the merge::" +msgstr "" +"作为一般规则,应当避免像上面这样的层级结构,因为不清楚 F 是否应该重写 E,反之亦然。Python 2.3 通过在创建类 G " +"时引发异常解决了这个歧义性问题,有效地阻止了程序员生成有歧义的层级结构。其原因是 C3 算法在执行以下合并时将会失败::" + +#: ../../howto/mro.rst:435 +msgid "merge(FO,EFO,FE)" +msgstr "merge(FO,EFO,FE)" + +#: ../../howto/mro.rst:437 +msgid "" +"cannot be computed, because F is in the tail of EFO and E is in the tail of " +"FE." +msgstr "这是无法计算的,因为 F 在 EFO 的 tail 内而 E 在 FE 的 tail 内。" + +#: ../../howto/mro.rst:440 +msgid "" +"The real solution is to design a non-ambiguous hierarchy, i.e. to derive G " +"from E and F (the more specific first) and not from F and E; in this case " +"the MRO is GEF without any doubt." +msgstr "" +"真正的解决办法是设计一个无歧义的层级结构,即从 E 和 F(更特化的放在前面)而不是从 F 和 E 派生出 G;在这种情况下 MRO 毫无疑问就是 " +"GEF。" + +#: ../../howto/mro.rst:444 +msgid "" +" O\n" +" |\n" +" F (spam)\n" +" / |\n" +"(eggs) E |\n" +" \\ |\n" +" G\n" +" (eggs, no doubt)" +msgstr "" +" O\n" +" |\n" +" F (spam)\n" +" / |\n" +"(eggs) E |\n" +" \\ |\n" +" G\n" +" (eggs, no doubt)" + +#: ../../howto/mro.rst:456 +msgid "" +"Python 2.3 forces the programmer to write good hierarchies (or, at least, " +"less error-prone ones)." +msgstr "Python 2.3 会强迫程序员编写好的(或者,至少不那么容易出错的)层级结构。" + +#: ../../howto/mro.rst:459 +msgid "" +"On a related note, let me point out that the Python 2.3 algorithm is smart " +"enough to recognize obvious mistakes, as the duplication of classes in the " +"list of parents:" +msgstr "与此相关的一点,我要指出 Python 2.3 的算法足够聪明,它能识别明显的错误,比如父类列表中重复的类:" + +#: ../../howto/mro.rst:469 +msgid "" +"Python 2.2 (both for classic classes and new style classes) in this " +"situation, would not raise any exception." +msgstr "在这种情况下,Python 2.2(包括经典类和新式类)则不会引发任何异常。" + +#: ../../howto/mro.rst:472 +msgid "" +"Finally, I would like to point out two lessons we have learned from this " +"example:" +msgstr "最后,我想指出我们从这个例子中汲取的两点教训:" + +#: ../../howto/mro.rst:475 +msgid "" +"despite the name, the MRO determines the resolution order of attributes, not" +" only of methods;" +msgstr "尽管名称如此,MRO 是决定属性的解析顺序,而不仅仅是方法的解析顺序;" + +#: ../../howto/mro.rst:478 +msgid "" +"the default food for Pythonistas is spam ! (but you already knew that ;-)" +msgstr "Python 爱好者的默认食物是 spam ! (不过你已经知道这一点了 ;-)" + +#: ../../howto/mro.rst:481 +msgid "" +"Having discussed the issue of local precedence ordering, let me now consider" +" the issue of monotonicity. My goal is to show that neither the MRO for " +"classic classes nor that for Python 2.2 new style classes is monotonic." +msgstr "在讨论了局部优先顺序问题之后,现在再让我来讲解单调性。我的目标是证明经典类和 Python 2.2 新式类的 MRO 都不是单调的。" + +#: ../../howto/mro.rst:486 +msgid "" +"To prove that the MRO for classic classes is non-monotonic is rather " +"trivial, it is enough to look at the diamond diagram:" +msgstr "要证明经典类的 MRO 是非单调的相当简单,只要看一下这个钻石形图就够了:" + +#: ../../howto/mro.rst:489 +msgid "" +" C\n" +" / \\\n" +" / \\\n" +"A B\n" +" \\ /\n" +" \\ /\n" +" D" +msgstr "" +" C\n" +" / \\\n" +" / \\\n" +"A B\n" +" \\ /\n" +" \\ /\n" +" D" + +#: ../../howto/mro.rst:500 +msgid "One easily discerns the inconsistency::" +msgstr "人们很容易发现其中的不一致性::" + +#: ../../howto/mro.rst:502 +msgid "" +"L[B,P21] = B C # B precedes C : B's methods win\n" +"L[D,P21] = D A C B C # B follows C : C's methods win!" +msgstr "" +"L[B,P21] = B C # B 在 C 前 : B 的方法胜出\n" +"L[D,P21] = D A C B C # B 在 C 之后 : C 的方法胜出!" + +#: ../../howto/mro.rst:505 +msgid "" +"On the other hand, there are no problems with the Python 2.2 and 2.3 MROs, " +"they give both::" +msgstr "另一方面,Python 2.2 和 Python 2.3 的 MRO 则没有问题,它们都将给出以下结果::" + +#: ../../howto/mro.rst:508 +msgid "L[D] = D A B C" +msgstr "L[D] = D A B C" + +#: ../../howto/mro.rst:510 +msgid "" +"Guido points out in his essay [#]_ that the classic MRO is not so bad in " +"practice, since one can typically avoids diamonds for classic classes. But " +"all new style classes inherit from ``object``, therefore diamonds are " +"unavoidable and inconsistencies shows up in every multiple inheritance " +"graph." +msgstr "" +"Guido 在他的文章 [#]_ 中指出经典的 MRO 在实践中并没有那么坏,因为人们通常可以避免经典类形成钻石形继承图。但是所有新式类都继承自 " +"``object``,因此钻石形继承图是不可避免的并且在每个多重继承图中都会出现不一致性。" + +#: ../../howto/mro.rst:516 +msgid "" +"The MRO of Python 2.2 makes breaking monotonicity difficult, but not " +"impossible. The following example, originally provided by Samuele Pedroni, " +"shows that the MRO of Python 2.2 is non-monotonic:" +msgstr "" +"Python 2.2 的 MRO 使打破单调性变得困难,但并非不可能。下面是最初由 Samuele Pedroni 提供的例子,显示 Python " +"2.2 的 MRO 是非单调的:" + +#: ../../howto/mro.rst:530 +msgid "" +"Here are the linearizations according to the C3 MRO (the reader should " +"verify these linearizations as an exercise and draw the inheritance diagram " +";-) ::" +msgstr "以下是根据 C3 MRO 进行的线性化 (读者应当将验证这些线性化作为练习并绘制继承图 ;-) ::" + +#: ../../howto/mro.rst:534 +msgid "" +"L[A] = A O\n" +"L[B] = B O\n" +"L[C] = C O\n" +"L[D] = D O\n" +"L[E] = E O\n" +"L[K1]= K1 A B C O\n" +"L[K2]= K2 D B E O\n" +"L[K3]= K3 D A O\n" +"L[Z] = Z K1 K2 K3 D A B C E O" +msgstr "" +"L[A] = A O\n" +"L[B] = B O\n" +"L[C] = C O\n" +"L[D] = D O\n" +"L[E] = E O\n" +"L[K1]= K1 A B C O\n" +"L[K2]= K2 D B E O\n" +"L[K3]= K3 D A O\n" +"L[Z] = Z K1 K2 K3 D A B C E O" + +#: ../../howto/mro.rst:544 +msgid "" +"Python 2.2 gives exactly the same linearizations for A, B, C, D, E, K1, K2 " +"and K3, but a different linearization for Z::" +msgstr "Python 2.2 对 A、B、C、D、E、K1、K2 和 K3 给出了完全相同的线性化,但对 Z 则给出了不同的线性化::" + +#: ../../howto/mro.rst:547 +msgid "L[Z,P22] = Z K1 K3 A K2 D B C E O" +msgstr "L[Z,P22] = Z K1 K3 A K2 D B C E O" + +#: ../../howto/mro.rst:549 +msgid "" +"It is clear that this linearization is *wrong*, since A comes before D " +"whereas in the linearization of K3 A comes *after* D. In other words, in K3 " +"methods derived by D override methods derived by A, but in Z, which still is" +" a subclass of K3, methods derived by A override methods derived by D! This" +" is a violation of monotonicity. Moreover, the Python 2.2 linearization of " +"Z is also inconsistent with local precedence ordering, since the local " +"precedence list of the class Z is [K1, K2, K3] (K2 precedes K3), whereas in " +"the linearization of Z K2 *follows* K3. These problems explain why the 2.2 " +"rule has been dismissed in favor of the C3 rule." +msgstr "" +"很明显这种线性化是 *错误* 的,因为 A 在 D 之前,而在 K3 的线性化中 A 在 D 之后。换句话说,在 K3 中由 D 派生的方法会重写由 A" +" 派生的方法,但在仍为 K3 子类的 Z 中,由 A 派生的方法会重写由 D 派生的方法!这破坏了单调性。此外,Z 的 Python 2.2 " +"线性化也与局部优先顺序不一致,因为类 Z 的局部优先列表是 [K1, K2, K3] (K2 先于 K3),而在 Z 的线性化中则是 K2 *跟随* " +"K3。这些问题解释了为什么 2.2 规则被否定而改用 C3 规则。" + +#: ../../howto/mro.rst:561 +msgid "The end" +msgstr "结束" + +#: ../../howto/mro.rst:563 +msgid "" +"This section is for the impatient reader, who skipped all the previous " +"sections and jumped immediately to the end. This section is for the lazy " +"programmer too, who didn't want to exercise her/his brain. Finally, it is " +"for the programmer with some hubris, otherwise s/he would not be reading a " +"paper on the C3 method resolution order in multiple inheritance hierarchies " +";-) These three virtues taken all together (and *not* separately) deserve a " +"prize: the prize is a short Python 2.2 script that allows you to compute " +"the 2.3 MRO without risk to your brain. Simply change the last line to play" +" with the various examples I have discussed in this paper.::" +msgstr "" +"本节是为没有耐心的读者准备的,他们会跳过前面的所有章节,直接跳到结尾。这部分也是为懒惰的程序员准备的,因为他们不想动脑筋。 " +"最后,这部分也是为有些自负的程序员准备的,否则他/她就不会去阅读一篇关于多重继承层次结构中的 C3 方法解析顺序的论文了 ;-) 这三个优点合在一起(而" +" *不是* 分开)应该得到一个奖励:这个奖励就是一个简短的 Python 2.2 脚本,它可以在不影响你的大脑的情况下计算 2.3 MRO。 " +"只需修改最后一行就可以尝试我在本文中讨论的各种示例::" + +#: ../../howto/mro.rst:574 +msgid "" +"#\n" +"\n" +"\"\"\"C3 algorithm by Samuele Pedroni (with readability enhanced by me).\"\"\"\n" +"\n" +"class __metaclass__(type):\n" +" \"All classes are metamagically modified to be nicely printed\"\n" +" __repr__ = lambda cls: cls.__name__\n" +"\n" +"class ex_2:\n" +" \"Serious order disagreement\" #From Guido\n" +" class O: pass\n" +" class X(O): pass\n" +" class Y(O): pass\n" +" class A(X,Y): pass\n" +" class B(Y,X): pass\n" +" try:\n" +" class Z(A,B): pass #creates Z(A,B) in Python 2.2\n" +" except TypeError:\n" +" pass # Z(A,B) cannot be created in Python 2.3\n" +"\n" +"class ex_5:\n" +" \"My first example\"\n" +" class O: pass\n" +" class F(O): pass\n" +" class E(O): pass\n" +" class D(O): pass\n" +" class C(D,F): pass\n" +" class B(D,E): pass\n" +" class A(B,C): pass\n" +"\n" +"class ex_6:\n" +" \"My second example\"\n" +" class O: pass\n" +" class F(O): pass\n" +" class E(O): pass\n" +" class D(O): pass\n" +" class C(D,F): pass\n" +" class B(E,D): pass\n" +" class A(B,C): pass\n" +"\n" +"class ex_9:\n" +" \"Difference between Python 2.2 MRO and C3\" #From Samuele\n" +" class O: pass\n" +" class A(O): pass\n" +" class B(O): pass\n" +" class C(O): pass\n" +" class D(O): pass\n" +" class E(O): pass\n" +" class K1(A,B,C): pass\n" +" class K2(D,B,E): pass\n" +" class K3(D,A): pass\n" +" class Z(K1,K2,K3): pass\n" +"\n" +"def merge(seqs):\n" +" print '\\n\\nCPL[%s]=%s' % (seqs[0][0],seqs),\n" +" res = []; i=0\n" +" while 1:\n" +" nonemptyseqs=[seq for seq in seqs if seq]\n" +" if not nonemptyseqs: return res\n" +" i+=1; print '\\n',i,'round: candidates...',\n" +" for seq in nonemptyseqs: # find merge candidates among seq heads\n" +" cand = seq[0]; print ' ',cand,\n" +" nothead=[s for s in nonemptyseqs if cand in s[1:]]\n" +" if nothead: cand=None #reject candidate\n" +" else: break\n" +" if not cand: raise \"Inconsistent hierarchy\"\n" +" res.append(cand)\n" +" for seq in nonemptyseqs: # remove cand\n" +" if seq[0] == cand: del seq[0]\n" +"\n" +"def mro(C):\n" +" \"Compute the class precedence list (mro) according to C3\"\n" +" return merge([[C]]+map(mro,C.__bases__)+[list(C.__bases__)])\n" +"\n" +"def print_mro(C):\n" +" print '\\nMRO[%s]=%s' % (C,mro(C))\n" +" print '\\nP22 MRO[%s]=%s' % (C,C.mro())\n" +"\n" +"print_mro(ex_9.Z)\n" +"\n" +"#" +msgstr "" +"#\n" +"\n" +"\"\"\"C3 algorithm by Samuele Pedroni (with readability enhanced by me).\"\"\"\n" +"\n" +"class __metaclass__(type):\n" +" \"All classes are metamagically modified to be nicely printed\"\n" +" __repr__ = lambda cls: cls.__name__\n" +"\n" +"class ex_2:\n" +" \"Serious order disagreement\" #From Guido\n" +" class O: pass\n" +" class X(O): pass\n" +" class Y(O): pass\n" +" class A(X,Y): pass\n" +" class B(Y,X): pass\n" +" try:\n" +" class Z(A,B): pass #creates Z(A,B) in Python 2.2\n" +" except TypeError:\n" +" pass # Z(A,B) cannot be created in Python 2.3\n" +"\n" +"class ex_5:\n" +" \"My first example\"\n" +" class O: pass\n" +" class F(O): pass\n" +" class E(O): pass\n" +" class D(O): pass\n" +" class C(D,F): pass\n" +" class B(D,E): pass\n" +" class A(B,C): pass\n" +"\n" +"class ex_6:\n" +" \"My second example\"\n" +" class O: pass\n" +" class F(O): pass\n" +" class E(O): pass\n" +" class D(O): pass\n" +" class C(D,F): pass\n" +" class B(E,D): pass\n" +" class A(B,C): pass\n" +"\n" +"class ex_9:\n" +" \"Difference between Python 2.2 MRO and C3\" #From Samuele\n" +" class O: pass\n" +" class A(O): pass\n" +" class B(O): pass\n" +" class C(O): pass\n" +" class D(O): pass\n" +" class E(O): pass\n" +" class K1(A,B,C): pass\n" +" class K2(D,B,E): pass\n" +" class K3(D,A): pass\n" +" class Z(K1,K2,K3): pass\n" +"\n" +"def merge(seqs):\n" +" print '\\n\\nCPL[%s]=%s' % (seqs[0][0],seqs),\n" +" res = []; i=0\n" +" while 1:\n" +" nonemptyseqs=[seq for seq in seqs if seq]\n" +" if not nonemptyseqs: return res\n" +" i+=1; print '\\n',i,'round: candidates...',\n" +" for seq in nonemptyseqs: # find merge candidates among seq heads\n" +" cand = seq[0]; print ' ',cand,\n" +" nothead=[s for s in nonemptyseqs if cand in s[1:]]\n" +" if nothead: cand=None #reject candidate\n" +" else: break\n" +" if not cand: raise \"Inconsistent hierarchy\"\n" +" res.append(cand)\n" +" for seq in nonemptyseqs: # remove cand\n" +" if seq[0] == cand: del seq[0]\n" +"\n" +"def mro(C):\n" +" \"Compute the class precedence list (mro) according to C3\"\n" +" return merge([[C]]+map(mro,C.__bases__)+[list(C.__bases__)])\n" +"\n" +"def print_mro(C):\n" +" print '\\nMRO[%s]=%s' % (C,mro(C))\n" +" print '\\nP22 MRO[%s]=%s' % (C,C.mro())\n" +"\n" +"print_mro(ex_9.Z)\n" +"\n" +"#" + +#: ../../howto/mro.rst:656 +msgid "That's all folks," +msgstr "就是这样了朋友们," + +#: ../../howto/mro.rst:658 +msgid "enjoy !" +msgstr "好好享受吧!" + +#: ../../howto/mro.rst:662 +msgid "Resources" +msgstr "参考资源" + +#: ../../howto/mro.rst:664 +msgid "" +"The thread on python-dev started by Samuele Pedroni: " +"https://mail.python.org/pipermail/python-dev/2002-October/029035.html" +msgstr "" +"由 Samuele Pedroni 在 python-dev " +"发起的讨论:https://mail.python.org/pipermail/python-dev/2002-October/029035.html" + +#: ../../howto/mro.rst:667 +msgid "" +"The paper *A Monotonic Superclass Linearization for Dylan*: " +"https://doi.org/10.1145/236337.236343" +msgstr "" +"论文 *A Monotonic Superclass Linearization for Dylan*: " +"https://doi.org/10.1145/236337.236343" + +#: ../../howto/mro.rst:670 +msgid "" +"Guido van Rossum's essay, *Unifying types and classes in Python 2.2*: " +"https://web.archive.org/web/20140210194412/http://www.python.org/download/releases/2.2.2/descrintro" +msgstr "" +"Guido van Rossum 的文章,*Unifying types and classes in Python 2.2*: " +"https://web.archive.org/web/20140210194412/http://www.python.org/download/releases/2.2.2/descrintro" diff --git a/howto/perf_profiling.po b/howto/perf_profiling.po new file mode 100644 index 0000000000..baec848653 --- /dev/null +++ b/howto/perf_profiling.po @@ -0,0 +1,526 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:00+0000\n" +"Last-Translator: 99 , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../howto/perf_profiling.rst:7 +msgid "Python support for the ``perf map`` compatible profilers" +msgstr "" + +#: ../../howto/perf_profiling.rst:0 +msgid "author" +msgstr "作者" + +#: ../../howto/perf_profiling.rst:9 +msgid "Pablo Galindo" +msgstr "Pablo Galindo" + +#: ../../howto/perf_profiling.rst:11 +msgid "" +"`The Linux perf profiler `_ and `samply " +"`_ are powerful tools that allow you to " +"profile and obtain information about the performance of your application. " +"Both tools have vibrant ecosystems that aid with the analysis of the data " +"they produce." +msgstr "" + +#: ../../howto/perf_profiling.rst:16 +msgid "" +"The main problem with using these profilers with Python applications is that" +" they only get information about native symbols, that is, the names of " +"functions and procedures written in C. This means that the names and file " +"names of Python functions in your code will not appear in the profiler " +"output." +msgstr "" + +#: ../../howto/perf_profiling.rst:21 +msgid "" +"Since Python 3.12, the interpreter can run in a special mode that allows " +"Python functions to appear in the output of compatible profilers. When this " +"mode is enabled, the interpreter will interpose a small piece of code " +"compiled on the fly before the execution of every Python function and it " +"will teach the profiler the relationship between this piece of code and the " +"associated Python function using :doc:`perf map files <../c-api/perfmaps>`." +msgstr "" + +#: ../../howto/perf_profiling.rst:30 +msgid "" +"Support for profiling is available on Linux and macOS on select " +"architectures. Perf is available on Linux, while samply can be used on both " +"Linux and macOS. samply support on macOS is available starting from Python " +"3.15. Check the output of the ``configure`` build step or check the output " +"of ``python -m sysconfig | grep HAVE_PERF_TRAMPOLINE`` to see if your system" +" is supported." +msgstr "" + +#: ../../howto/perf_profiling.rst:37 +msgid "For example, consider the following script:" +msgstr "例如,考虑以下脚本:" + +#: ../../howto/perf_profiling.rst:39 +msgid "" +"def foo(n):\n" +" result = 0\n" +" for _ in range(n):\n" +" result += 1\n" +" return result\n" +"\n" +"def bar(n):\n" +" foo(n)\n" +"\n" +"def baz(n):\n" +" bar(n)\n" +"\n" +"if __name__ == \"__main__\":\n" +" baz(1000000)" +msgstr "" +"def foo(n):\n" +" result = 0\n" +" for _ in range(n):\n" +" result += 1\n" +" return result\n" +"\n" +"def bar(n):\n" +" foo(n)\n" +"\n" +"def baz(n):\n" +" bar(n)\n" +"\n" +"if __name__ == \"__main__\":\n" +" baz(1000000)" + +#: ../../howto/perf_profiling.rst:56 +msgid "We can run ``perf`` to sample CPU stack traces at 9999 hertz::" +msgstr "我们可以运行 ``perf`` 以 9999 赫兹的频率来对 CPU 栈追踪信息进行采样::" + +#: ../../howto/perf_profiling.rst:58 +msgid "$ perf record -F 9999 -g -o perf.data python my_script.py" +msgstr "$ perf record -F 9999 -g -o perf.data python my_script.py" + +#: ../../howto/perf_profiling.rst:60 +msgid "Then we can use ``perf report`` to analyze the data:" +msgstr "然后我们可以使用 ``perf report`` 来分析数据:" + +#: ../../howto/perf_profiling.rst:62 +msgid "" +"$ perf report --stdio -n -g\n" +"\n" +"# Children Self Samples Command Shared Object Symbol\n" +"# ........ ........ ............ .......... .................. ..........................................\n" +"#\n" +" 91.08% 0.00% 0 python.exe python.exe [.] _start\n" +" |\n" +" ---_start\n" +" |\n" +" --90.71%--__libc_start_main\n" +" Py_BytesMain\n" +" |\n" +" |--56.88%--pymain_run_python.constprop.0\n" +" | |\n" +" | |--56.13%--_PyRun_AnyFileObject\n" +" | | _PyRun_SimpleFileObject\n" +" | | |\n" +" | | |--55.02%--run_mod\n" +" | | | |\n" +" | | | --54.65%--PyEval_EvalCode\n" +" | | | _PyEval_EvalFrameDefault\n" +" | | | PyObject_Vectorcall\n" +" | | | _PyEval_Vector\n" +" | | | _PyEval_EvalFrameDefault\n" +" | | | PyObject_Vectorcall\n" +" | | | _PyEval_Vector\n" +" | | | _PyEval_EvalFrameDefault\n" +" | | | PyObject_Vectorcall\n" +" | | | _PyEval_Vector\n" +" | | | |\n" +" | | | |--51.67%--_PyEval_EvalFrameDefault\n" +" | | | | |\n" +" | | | | |--11.52%--_PyCompactLong_Add\n" +" | | | | | |\n" +" | | | | | |--2.97%--_PyObject_Malloc\n" +"..." +msgstr "" + +#: ../../howto/perf_profiling.rst:101 +msgid "" +"As you can see, the Python functions are not shown in the output, only " +"``_PyEval_EvalFrameDefault`` (the function that evaluates the Python " +"bytecode) shows up. Unfortunately that's not very useful because all Python " +"functions use the same C function to evaluate bytecode so we cannot know " +"which Python function corresponds to which bytecode-evaluating function." +msgstr "" +"如你所见,Python 函数不会显示在输出中,只有 ``_PyEval_EvalFrameDefault`` (执行 Python 字节码的函数) " +"会显示出来。不幸的是,这并没有什么用处,因为所有 Python 函数都使用相同的 C 函数来执行字节码,所以我们无法知道哪个 Python " +"函数与哪个字节码执行函数相对应。" + +#: ../../howto/perf_profiling.rst:106 +msgid "" +"Instead, if we run the same experiment with ``perf`` support enabled we get:" +msgstr "相反,如果我们在启用 ``perf`` 支持的情况下运行相同的实验,我们将获得:" + +#: ../../howto/perf_profiling.rst:108 +msgid "" +"$ perf report --stdio -n -g\n" +"\n" +"# Children Self Samples Command Shared Object Symbol\n" +"# ........ ........ ............ .......... .................. .....................................................................\n" +"#\n" +" 90.58% 0.36% 1 python.exe python.exe [.] _start\n" +" |\n" +" ---_start\n" +" |\n" +" --89.86%--__libc_start_main\n" +" Py_BytesMain\n" +" |\n" +" |--55.43%--pymain_run_python.constprop.0\n" +" | |\n" +" | |--54.71%--_PyRun_AnyFileObject\n" +" | | _PyRun_SimpleFileObject\n" +" | | |\n" +" | | |--53.62%--run_mod\n" +" | | | |\n" +" | | | --53.26%--PyEval_EvalCode\n" +" | | | py:::/src/script.py\n" +" | | | _PyEval_EvalFrameDefault\n" +" | | | PyObject_Vectorcall\n" +" | | | _PyEval_Vector\n" +" | | | py::baz:/src/script.py\n" +" | | | _PyEval_EvalFrameDefault\n" +" | | | PyObject_Vectorcall\n" +" | | | _PyEval_Vector\n" +" | | | py::bar:/src/script.py\n" +" | | | _PyEval_EvalFrameDefault\n" +" | | | PyObject_Vectorcall\n" +" | | | _PyEval_Vector\n" +" | | | py::foo:/src/script.py\n" +" | | | |\n" +" | | | |--51.81%--_PyEval_EvalFrameDefault\n" +" | | | | |\n" +" | | | | |--13.77%--_PyCompactLong_Add\n" +" | | | | | |\n" +" | | | | | |--3.26%--_PyObject_Malloc" +msgstr "" + +#: ../../howto/perf_profiling.rst:153 +msgid "Using the samply profiler" +msgstr "" + +#: ../../howto/perf_profiling.rst:155 +msgid "" +"samply is a modern profiler that can be used as an alternative to perf. It " +"uses the same perf map files that Python generates, making it compatible " +"with Python's profiling support. samply is particularly useful on macOS " +"where perf is not available." +msgstr "" + +#: ../../howto/perf_profiling.rst:160 +msgid "" +"To use samply with Python, first install it following the instructions at " +"https://github.com/mstange/samply, then run::" +msgstr "" + +#: ../../howto/perf_profiling.rst:163 +msgid "$ samply record PYTHONPERFSUPPORT=1 python my_script.py" +msgstr "" + +#: ../../howto/perf_profiling.rst:165 +msgid "" +"This will open a web interface where you can analyze the profiling data " +"interactively. The advantage of samply is that it provides a modern web-" +"based interface for analyzing profiling data and works on both Linux and " +"macOS." +msgstr "" + +#: ../../howto/perf_profiling.rst:170 +msgid "" +"On macOS, samply support requires Python 3.15 or later. Also on macOS, " +"samply can't profile signed Python executables due to restrictions by macOS." +" You can profile with Python binaries that you've compiled yourself, or " +"which are unsigned or locally-signed (such as anything installed by " +"Homebrew). In order to attach to running processes on macOS, run ``samply " +"setup`` once (and every time samply is updated) to self-sign the samply " +"binary." +msgstr "" + +#: ../../howto/perf_profiling.rst:178 +msgid "How to enable ``perf`` profiling support" +msgstr "如何启用 ``perf`` 性能分析支持" + +#: ../../howto/perf_profiling.rst:180 +msgid "" +"``perf`` profiling support can be enabled either from the start using the " +"environment variable :envvar:`PYTHONPERFSUPPORT` or the :option:`-X perf " +"<-X>` option, or dynamically using :func:`sys.activate_stack_trampoline` and" +" :func:`sys.deactivate_stack_trampoline`." +msgstr "" +"``perf`` 性能分析支持可以在一开始就通过使用环境变量 :envvar:`PYTHONPERFSUPPORT` 或 :option:`-X " +"perf <-X>` 选项来启用,也可以动态地使用 :func:`sys.activate_stack_trampoline` 和 " +":func:`sys.deactivate_stack_trampoline` 来启用。" + +#: ../../howto/perf_profiling.rst:186 +msgid "" +"The :mod:`!sys` functions take precedence over the :option:`!-X` option, the" +" :option:`!-X` option takes precedence over the environment variable." +msgstr ":mod:`!sys` 函数的优先级高于 :option:`!-X` 选项,:option:`!-X` 选项的优先级高于环境变量。" + +#: ../../howto/perf_profiling.rst:189 +msgid "Example, using the environment variable::" +msgstr "示例,使用环境变量::" + +#: ../../howto/perf_profiling.rst:191 +msgid "" +"$ PYTHONPERFSUPPORT=1 perf record -F 9999 -g -o perf.data python my_script.py\n" +"$ perf report -g -i perf.data" +msgstr "" +"$ PYTHONPERFSUPPORT=1 perf record -F 9999 -g -o perf.data python my_script.py\n" +"$ perf report -g -i perf.data" + +#: ../../howto/perf_profiling.rst:194 +msgid "Example, using the :option:`!-X` option::" +msgstr "示例,使用 :option:`!-X` 选项::" + +#: ../../howto/perf_profiling.rst:196 +msgid "" +"$ perf record -F 9999 -g -o perf.data python -X perf my_script.py\n" +"$ perf report -g -i perf.data" +msgstr "" +"$ perf record -F 9999 -g -o perf.data python -X perf my_script.py\n" +"$ perf report -g -i perf.data" + +#: ../../howto/perf_profiling.rst:199 +msgid "Example, using the :mod:`sys` APIs in file :file:`example.py`:" +msgstr "示例,在文件 :file:`example.py` 中使用 :mod:`sys` API:" + +#: ../../howto/perf_profiling.rst:201 +msgid "" +"import sys\n" +"\n" +"sys.activate_stack_trampoline(\"perf\")\n" +"do_profiled_stuff()\n" +"sys.deactivate_stack_trampoline()\n" +"\n" +"non_profiled_stuff()" +msgstr "" +"import sys\n" +"\n" +"sys.activate_stack_trampoline(\"perf\")\n" +"do_profiled_stuff()\n" +"sys.deactivate_stack_trampoline()\n" +"\n" +"non_profiled_stuff()" + +#: ../../howto/perf_profiling.rst:211 +msgid "...then::" +msgstr "...然后::" + +#: ../../howto/perf_profiling.rst:213 +msgid "" +"$ perf record -F 9999 -g -o perf.data python ./example.py\n" +"$ perf report -g -i perf.data" +msgstr "" +"$ perf record -F 9999 -g -o perf.data python ./example.py\n" +"$ perf report -g -i perf.data" + +#: ../../howto/perf_profiling.rst:218 +msgid "How to obtain the best results" +msgstr "如何获取最佳结果" + +#: ../../howto/perf_profiling.rst:220 +msgid "" +"For best results, keep frame pointers enabled. On supported GCC-compatible " +"toolchains, CPython builds itself with ``-fno-omit-frame-pointer`` and " +"similar flags (see :option:`--without-frame-pointers` for details). These " +"flags allow profilers to unwind using only the frame pointer and not on " +"DWARF debug information. This is because as the code that is interposed to " +"allow ``perf`` support is dynamically generated it doesn't have any DWARF " +"debugging information available." +msgstr "" + +#: ../../howto/perf_profiling.rst:228 +msgid "" +"You can check if your system has been compiled with this flag by running::" +msgstr "你可以通过运行以下命令来检查你的系统是否附带此标志来编译的::" + +#: ../../howto/perf_profiling.rst:230 +msgid "$ python -m sysconfig | grep 'no-omit-frame-pointer'" +msgstr "$ python -m sysconfig | grep 'no-omit-frame-pointer'" + +#: ../../howto/perf_profiling.rst:232 +msgid "" +"If you don't see any output it means that your interpreter has not been " +"compiled with frame pointers and therefore it may not be able to show Python" +" functions in the output of ``perf``." +msgstr "如果你没有看到任何输出,则意味着你的解释器没有附带帧指针来编译,因而它可能无法在 ``perf`` 的输出中显示 Python 函数。" + +#: ../../howto/perf_profiling.rst:238 +msgid "How to work without frame pointers" +msgstr "如何在不带帧指针的情况下使用" + +#: ../../howto/perf_profiling.rst:240 +msgid "" +"If you are working with a Python interpreter that has been compiled without " +"frame pointers, you can still use the ``perf`` profiler, but the overhead " +"will be a bit higher because Python needs to generate unwinding information " +"for every Python function call on the fly. Additionally, ``perf`` will take " +"more time to process the data because it will need to use the DWARF " +"debugging information to unwind the stack and this is a slow process." +msgstr "" +"如果你使用在不带帧指针的情况下编译的 Python 解释器,你仍然可以使用 ``perf`` 性能分析器,但会有较高的资源开销,因为 Python " +"需要为每个 Python 函数即时生成展开信息。此外,``perf`` 将花费更多时间来处理数据,因为它需要使用 DWARF " +"调试信息来展开栈,而这是一个缓慢的过程。" + +#: ../../howto/perf_profiling.rst:247 +msgid "" +"To enable this mode, you can use the environment variable " +":envvar:`PYTHON_PERF_JIT_SUPPORT` or the :option:`-X perf_jit <-X>` option, " +"which will enable the JIT mode for the ``perf`` profiler." +msgstr "" +"要启用此模式,你可以使用环境变量 :envvar:`PYTHON_PERF_JIT_SUPPORT` 或 :option:`-X perf_jit " +"<-X>` 选项,它将为 ``perf`` 性能分析器启用 JIT 模式。" + +#: ../../howto/perf_profiling.rst:253 +msgid "" +"Due to a bug in the ``perf`` tool, only ``perf`` versions higher than v6.8 " +"will work with the JIT mode. The fix was also backported to the v6.7.2 " +"version of the tool." +msgstr "" +"由于 ``perf`` 工具的一个程序错误,只有 ``perf`` 版本号高于 v6.8 才能使用 JIT 模式。修复也向下移植到了此工具的 " +"v6.7.2 版。" + +#: ../../howto/perf_profiling.rst:257 +msgid "" +"Note that when checking the version of the ``perf`` tool (which can be done " +"by running ``perf version``) you must take into account that some distros " +"add some custom version numbers including a ``-`` character. This means " +"that ``perf 6.7-3`` is not necessarily ``perf 6.7.3``." +msgstr "" +"请注意,在检查 ``perf`` 工具的版本时(这可通过运行 ``perf version`` 来完成),你必须将某些发行版添加的包括了 ``-`` " +"字符的自定义版本号纳入考虑。这意味着 ``perf 6.7-3`` 不一定等于 ``perf 6.7.3``。" + +#: ../../howto/perf_profiling.rst:262 +msgid "" +"When using the perf JIT mode, you need an extra step before you can run " +"``perf report``. You need to call the ``perf inject`` command to inject the " +"JIT information into the ``perf.data`` file.::" +msgstr "" +"当使用 perf JIT 模式时,在你运行 ``perf report`` 之前你还需要一个额外的步骤。你需要调用 ``perf inject`` " +"命令来将 JIT 信息注入 ``perf.data`` 文件。::" + +#: ../../howto/perf_profiling.rst:266 +msgid "" +"$ perf record -F 9999 -g -k 1 --call-graph dwarf -o perf.data python -Xperf_jit my_script.py\n" +"$ perf inject -i perf.data --jit --output perf.jit.data\n" +"$ perf report -g -i perf.jit.data" +msgstr "" +"$ perf record -F 9999 -g -k 1 --call-graph dwarf -o perf.data python -Xperf_jit my_script.py\n" +"$ perf inject -i perf.data --jit --output perf.jit.data\n" +"$ perf report -g -i perf.jit.data" + +#: ../../howto/perf_profiling.rst:270 +msgid "or using the environment variable::" +msgstr "或者使用环境变量::" + +#: ../../howto/perf_profiling.rst:272 +msgid "" +"$ PYTHON_PERF_JIT_SUPPORT=1 perf record -F 9999 -g --call-graph dwarf -o perf.data python my_script.py\n" +"$ perf inject -i perf.data --jit --output perf.jit.data\n" +"$ perf report -g -i perf.jit.data" +msgstr "" +"$ PYTHON_PERF_JIT_SUPPORT=1 perf record -F 9999 -g --call-graph dwarf -o perf.data python my_script.py\n" +"$ perf inject -i perf.data --jit --output perf.jit.data\n" +"$ perf report -g -i perf.jit.data" + +#: ../../howto/perf_profiling.rst:276 +msgid "" +"``perf inject --jit`` command will read ``perf.data``, automatically pick up" +" the perf dump file that Python creates (in ``/tmp/perf-$PID.dump``), and " +"then create ``perf.jit.data`` which merges all the JIT information together." +" It should also create a lot of ``jitted-XXXX-N.so`` files in the current " +"directory which are ELF images for all the JIT trampolines that were created" +" by Python." +msgstr "" +"``perf inject --jit`` 命令将读取 ``perf.data``,自动获取 Python 创建的 perf 转储文件(在 " +"``/tmp/perf-$PID.dump`` 中),然后创建将所有 JIT 信息合并到一起的 ``perf.jit.data`` 文件。 " +"它还会在当前目录下创建大量 ``jitted-XXXX-N.so`` 文件,它们是 Python 所创建的所有 JIT 跳板的 ELF 映像。" + +#: ../../howto/perf_profiling.rst:284 +msgid "" +"When using ``--call-graph dwarf``, the ``perf`` tool will take snapshots of " +"the stack of the process being profiled and save the information in the " +"``perf.data`` file. By default, the size of the stack dump is 8192 bytes, " +"but you can change the size by passing it after a comma like ``--call-graph " +"dwarf,16384``." +msgstr "" +"当使用 ``--call-graph dwarf`` 时,``perf`` 工具将对被分析进程的栈打快照并将信息保存在 ``perf.data`` " +"文件中。在默认情况下,栈转储的大小为 8192 字节,但你可以通过额外传入一个逗号加数值如 ``--call-graph dwarf,16384`` " +"来改变这个大小。" + +#: ../../howto/perf_profiling.rst:290 +msgid "" +"The size of the stack dump is important because if the size is too small " +"``perf`` will not be able to unwind the stack and the output will be " +"incomplete. On the other hand, if the size is too big, then ``perf`` won't " +"be able to sample the process as frequently as it would like as the overhead" +" will be higher." +msgstr "" +"栈转储的大小很重要,因为如果这个值太小 ``perf`` 将无法展开栈信息,而输出将不完整。另一方面,如果这个值太大,那么 ``perf`` " +"将无法按需以足够的频率对进程执行采样,因为那样资源开销会过高。" + +#: ../../howto/perf_profiling.rst:296 +msgid "" +"The stack size is particularly important when profiling Python code compiled" +" with low optimization levels (like ``-O0``), as these builds tend to have " +"larger stack frames. If you are compiling Python with ``-O0`` and not seeing" +" Python functions in your profiling output, try increasing the stack dump " +"size to 65528 bytes (the maximum)::" +msgstr "" +"栈大小在对使用较低优化级别 (如 ``-O0``) 编译的 Python 代码进行性能分析时更为重要,因为这类构建版往往有更大的栈帧。如果你是使用 " +"``-O0`` 来编译 Python 并且没有在你的性能分析输出中看到 Python 函数,请尝试将栈转储大小增加到 65528 字节 (最大值)::" + +#: ../../howto/perf_profiling.rst:302 +msgid "" +"$ perf record -F 9999 -g -k 1 --call-graph dwarf,65528 -o perf.data python " +"-Xperf_jit my_script.py" +msgstr "" +"$ perf record -F 9999 -g -k 1 --call-graph dwarf,65528 -o perf.data python " +"-Xperf_jit my_script.py" + +#: ../../howto/perf_profiling.rst:304 +msgid "Different compilation flags can significantly impact stack sizes:" +msgstr "不同的编译标志可能显著地影响栈大小:" + +#: ../../howto/perf_profiling.rst:306 +msgid "" +"Builds with ``-O0`` typically have much larger stack frames than those with " +"``-O1`` or higher" +msgstr "使用 ``-O0`` 构建通常会比使用 ``-O1`` 或更高级别的构建具有大得多的栈帧" + +#: ../../howto/perf_profiling.rst:307 +msgid "" +"Adding optimizations (``-O1``, ``-O2``, etc.) typically reduces stack size" +msgstr "添加优化 (``-O1``, ``-O2`` 等) 通常会减小栈大小" + +#: ../../howto/perf_profiling.rst:308 +msgid "" +"Frame pointers (``-fno-omit-frame-pointer``) generally provide more reliable" +" stack unwinding" +msgstr "帧指针 (``-fno-omit-frame-pointer``) 通常会提供更可靠的栈展开" diff --git a/howto/pyporting.po b/howto/pyporting.po new file mode 100644 index 0000000000..5eaafac664 --- /dev/null +++ b/howto/pyporting.po @@ -0,0 +1,97 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../howto/pyporting.rst:7 +msgid "How to port Python 2 Code to Python 3" +msgstr "如何将 Python 2 代码移植到 Python 3" + +#: ../../howto/pyporting.rst:0 +msgid "author" +msgstr "作者" + +#: ../../howto/pyporting.rst:9 +msgid "Brett Cannon" +msgstr "Brett Cannon" + +#: ../../howto/pyporting.rst:11 +msgid "" +"Python 2 reached its official end-of-life at the start of 2020. This means " +"that no new bug reports, fixes, or changes will be made to Python 2 - it's " +"no longer supported: see :pep:`373` and `status of Python versions " +"`_." +msgstr "" +"Python 2 生命期在 2020 年初正式结束。这意味着 Python 2 将不再有新的错误报告、修复或更改 —— 它已不再受到支持:请参阅 " +":pep:`373` 和 `Python 版本的状态 `_。" + +#: ../../howto/pyporting.rst:16 +msgid "" +"If you are looking to port an extension module instead of pure Python code, " +"please see :ref:`cporting-howto`." +msgstr "如果您希望迁移扩展模块而不是纯 Python 代码,请参阅 :ref:`cporting-howto`。" + +#: ../../howto/pyporting.rst:19 +msgid "" +"The archived python-porting_ mailing list may contain some useful guidance." +msgstr "已归档的 python-porting_ 邮件列表可能包含一些有用的指导。" + +#: ../../howto/pyporting.rst:21 +msgid "" +"Since Python 3.11 the original porting guide was discontinued. You can find " +"the old guide in the `archive " +"`_." +msgstr "" +"自 Python 3.11 开始原来的移植指南已不再可用。你可以在 `归档 " +"`_ 中找到这个旧指南。" + +#: ../../howto/pyporting.rst:27 +msgid "Third-party guides" +msgstr "第三方指南" + +#: ../../howto/pyporting.rst:29 +msgid "There are also multiple third-party guides that might be useful:" +msgstr "还存在多个第三方指南可能对你有帮助:" + +#: ../../howto/pyporting.rst:31 +msgid "`Guide by Fedora `_" +msgstr "`Fedora 的指南 `_" + +#: ../../howto/pyporting.rst:32 +msgid "`PyCon 2020 tutorial `_" +msgstr "`PyCon 2020 教程 `_" + +#: ../../howto/pyporting.rst:33 +msgid "" +"`Guide by DigitalOcean " +"`_" +msgstr "" +"`DigitalOcean 的指南 `_" + +#: ../../howto/pyporting.rst:34 +msgid "" +"`Guide by ActiveState `_" +msgstr "" +"`ActiveState 的指南 `_" diff --git a/howto/regex.po b/howto/regex.po new file mode 100644 index 0000000000..0ad16f3e4a --- /dev/null +++ b/howto/regex.po @@ -0,0 +1,2668 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# 99 , 2026 +# python-doc bot, 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-11 16:26+0000\n" +"PO-Revision-Date: 2025-09-16 00:00+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../howto/regex.rst:5 +msgid "Regular expression HOWTO" +msgstr "正则表达式指南" + +#: ../../howto/regex.rst:0 +msgid "Author" +msgstr "作者" + +#: ../../howto/regex.rst:7 +msgid "A.M. Kuchling " +msgstr "A.M. Kuchling " + +#: ../../howto/regex.rst-1 +msgid "Abstract" +msgstr "摘要" + +#: ../../howto/regex.rst:18 +msgid "" +"This document is an introductory tutorial to using regular expressions in " +"Python with the :mod:`re` module. It provides a gentler introduction than " +"the corresponding section in the Library Reference." +msgstr "本文是关于在 Python 中通过 :mod:`re` 模块使用正则表达式的入门教程。它提供了比“标准库参考”的相关章节更平易的介绍。" + +#: ../../howto/regex.rst:24 +msgid "Introduction" +msgstr "引言" + +#: ../../howto/regex.rst:26 +msgid "" +"Regular expressions (called REs, or regexes, or regex patterns) are " +"essentially a tiny, highly specialized programming language embedded inside " +"Python and made available through the :mod:`re` module. Using this little " +"language, you specify the rules for the set of possible strings that you " +"want to match; this set might contain English sentences, or e-mail " +"addresses, or TeX commands, or anything you like. You can then ask " +"questions such as \"Does this string match the pattern?\", or \"Is there a " +"match for the pattern anywhere in this string?\". You can also use REs to " +"modify a string or to split it apart in various ways." +msgstr "" +"正则表达式(Regular expressions,也叫 REs、regexs 或 regex patterns),本质上是嵌入 Python " +"内部并通过 :mod:`re` " +"模块提供的一种微小的、高度专业化的编程语言。使用这种小语言,你可以为想要匹配的可能字符串编写规则;这些字符串可能是英文句子、邮箱地址、TeX " +"命令或任何你喜欢的内容。然后,你可以提出诸如“此字符串是否与表达式匹配?”、“字符串中是否存在表达式的匹配项?”之类的问题。你还可以用正则来修改字符串,或以各种方式将其拆分。" + +#: ../../howto/regex.rst:35 +msgid "" +"Regular expression patterns are compiled into a series of bytecodes which " +"are then executed by a matching engine written in C. For advanced use, it " +"may be necessary to pay careful attention to how the engine will execute a " +"given RE, and write the RE in a certain way in order to produce bytecode " +"that runs faster. Optimization isn't covered in this document, because it " +"requires that you have a good understanding of the matching engine's " +"internals." +msgstr "" +"正则表达式会被编译成一系列字节码,然后由 C " +"语言编写的匹配引擎执行。对于高级用途,可能有必要特别注意引擎将如何执行一个给定的正则,并以某种方式写入正则,以生成运行更快的字节码。本文不涉及优化问题,因为这要求你对正则引擎的匹配过程有很好的了解。" + +#: ../../howto/regex.rst:42 +msgid "" +"The regular expression language is relatively small and restricted, so not " +"all possible string processing tasks can be done using regular expressions." +" There are also tasks that *can* be done with regular expressions, but the " +"expressions turn out to be very complicated. In these cases, you may be " +"better off writing Python code to do the processing; while Python code will " +"be slower than an elaborate regular expression, it will also probably be " +"more understandable." +msgstr "" +"正则表达式语言相对较小且受限,因此并非所有可能的字符串处理任务都可以使用正则表达式完成。有些任务尽管 *可以* " +"用正则表达式来完成,但表达式会变得非常复杂。这些情况下,最好通过编写 Python 代码来进行处理。也许 Python " +"代码会比精心设计的正则表达式慢,但它可能更容易理解。" + +#: ../../howto/regex.rst:51 +msgid "Simple patterns" +msgstr "简单模式" + +#: ../../howto/regex.rst:53 +msgid "" +"We'll start by learning about the simplest possible regular expressions. " +"Since regular expressions are used to operate on strings, we'll begin with " +"the most common task: matching characters." +msgstr "让我们从最简单的正则表达式开始吧。由于正则表达式是用来操作字符串的,我们将从最常见的任务开始:匹配字符。" + +#: ../../howto/regex.rst:57 +msgid "" +"For a detailed explanation of the computer science underlying regular " +"expressions (deterministic and non-deterministic finite automata), you can " +"refer to almost any textbook on writing compilers." +msgstr "关于正则表达式背后的计算机科学的详细解释(确定性和非确定性有限自动机),你可以参考几乎所有关于编写编译器的教科书。" + +#: ../../howto/regex.rst:63 +msgid "Matching characters" +msgstr "匹配字符" + +#: ../../howto/regex.rst:65 +msgid "" +"Most letters and characters will simply match themselves. For example, the " +"regular expression ``test`` will match the string ``test`` exactly. (You " +"can enable a case-insensitive mode that would let this RE match ``Test`` or " +"``TEST`` as well; more about this later.)" +msgstr "" +"大多数字母和符号都会简单地匹配自身。例如,正则表达式 ``test`` 将会精确地匹配到 ``test`` " +"。(你可以启用不区分大小写模式,让这个正则也匹配 ``Test`` 或 ``TEST``,稍后会详细介绍。)" + +#: ../../howto/regex.rst:70 +msgid "" +"There are exceptions to this rule; some characters are special " +":dfn:`metacharacters`, and don't match themselves. Instead, they signal " +"that some out-of-the-ordinary thing should be matched, or they affect other " +"portions of the RE by repeating them or changing their meaning. Much of " +"this document is devoted to discussing various metacharacters and what they " +"do." +msgstr "" +"但该规则有例外。有些字符是特殊的 :dfn:`元字符`,并不匹配自身。 " +"事实上,它们表示匹配一些非常规的内容,或者通过重复它们或改变它们的含义来影响正则的其他部分。 本文的大部分内容都致力于讨论各种元字符及其作用。" + +#: ../../howto/regex.rst:76 +msgid "" +"Here's a complete list of the metacharacters; their meanings will be " +"discussed in the rest of this HOWTO." +msgstr "这是元字符的完整列表。它们的含义将在本 HOWTO 的其余部分进行讨论。" + +#: ../../howto/regex.rst:79 +msgid ". ^ $ * + ? { } [ ] \\ | ( )" +msgstr ". ^ $ * + ? { } [ ] \\ | ( )" + +#: ../../howto/regex.rst:83 +msgid "" +"The first metacharacters we'll look at are ``[`` and ``]``. They're used for" +" specifying a character class, which is a set of characters that you wish to" +" match. Characters can be listed individually, or a range of characters can" +" be indicated by giving two characters and separating them by a ``'-'``. " +"For example, ``[abc]`` will match any of the characters ``a``, ``b``, or " +"``c``; this is the same as ``[a-c]``, which uses a range to express the same" +" set of characters. If you wanted to match only lowercase letters, your RE " +"would be ``[a-z]``." +msgstr "" +"首先介绍的元字符是 ``[`` 和 ``]`` " +"。这两个元字符用于指定一个字符类,也就是你希望匹配的字符的一个集合。这些字符可以单独地列出,也可以用字符范围来表示(给出两个字符并用 ``'-'`` " +"分隔)。例如,``[abc]`` 将匹配 ``a``、``b``、``c`` 之中的任意一个字符;这与 ``[a-c]`` " +"相同,后者使用一个范围来表达相同的字符集合。如果只想匹配小写字母,则正则表达式将是 ``[a-z]``。" + +#: ../../howto/regex.rst:92 +msgid "" +"Metacharacters (except ``\\``) are not active inside classes. For example, " +"``[akm$]`` will match any of the characters ``'a'``, ``'k'``, ``'m'``, or " +"``'$'``; ``'$'`` is usually a metacharacter, but inside a character class " +"it's stripped of its special nature." +msgstr "" +"元字符 (除了 ``\\``) 在字符类中是不起作用的。例如,``[akm$]`` 将会匹配以下任一字符 ``'a'``, ``'k'``, " +"``'m'`` 或 ``'$'``;``'$'`` 通常是一个元字符,但在一个字符类中它的特殊性被消除了。" + +#: ../../howto/regex.rst:97 +msgid "" +"You can match the characters not listed within the class by " +":dfn:`complementing` the set. This is indicated by including a ``'^'`` as " +"the first character of the class. For example, ``[^5]`` will match any " +"character except ``'5'``. If the caret appears elsewhere in a character " +"class, it does not have special meaning. For example: ``[5^]`` will match " +"either a ``'5'`` or a ``'^'``." +msgstr "" +"你可以通过对集合 :dfn:`取反` 来匹配字符类中未列出的字符。 方法是把 ``'^'`` 放在字符类的最开头。 例如,``[^5]`` 将匹配除 " +"``'5'`` 之外的任何字符。 如果插入符出现在字符类的其他位置,则它没有特殊含义。 例如: ``[5^]`` 将匹配 ``'5'`` 或 " +"``'^'``。" + +#: ../../howto/regex.rst:103 +msgid "" +"Perhaps the most important metacharacter is the backslash, ``\\``. As in " +"Python string literals, the backslash can be followed by various characters " +"to signal various special sequences. It's also used to escape all the " +"metacharacters so you can still match them in patterns; for example, if you " +"need to match a ``[`` or ``\\``, you can precede them with a backslash to " +"remove their special meaning: ``\\[`` or ``\\\\``." +msgstr "" +"也许最重要的元字符是反斜杠,``\\``。 与 Python 字符串字面量一样,反斜杠后面可以跟各种字符来表示各种特殊序列。 " +"它还用于转义元字符,以便可以在表达式中匹配元字符本身。 例如,如果需要匹配一个 ``[`` 或 " +"``\\``,可以在其前面加上一个反斜杠来消除它们的特殊含义: ``\\[`` 或 ``\\\\``。" + +#: ../../howto/regex.rst:110 +msgid "" +"Some of the special sequences beginning with ``'\\'`` represent predefined " +"sets of characters that are often useful, such as the set of digits, the set" +" of letters, or the set of anything that isn't whitespace." +msgstr "一些以 ``'\\'`` 开头的特殊序列表示预定义的字符集合,这些字符集通常很有用,例如数字集合、字母集合或非空白字符集合。" + +#: ../../howto/regex.rst:115 +msgid "" +"Let's take an example: ``\\w`` matches any alphanumeric character. If the " +"regex pattern is expressed in bytes, this is equivalent to the class " +"``[a-zA-Z0-9_]``. If the regex pattern is a string, ``\\w`` will match all " +"the characters marked as letters in the Unicode database provided by the " +":mod:`unicodedata` module. You can use the more restricted definition of " +"``\\w`` in a string pattern by supplying the :const:`re.ASCII` flag when " +"compiling the regular expression." +msgstr "" +"让我们举一个例子: ``\\w`` 匹配任何字母数字字符。 如果正则表达式以 bytes 类型表示,``\\w`` 相当于字符类 " +"``[a-zA-Z0-9_]``。 如果正则表达式是 str 类型,``\\w`` 将匹配由 :mod:`unicodedata` 模块提供的 " +"Unicode 数据库中标记为字母的所有字符。 通过在编译正则表达式时提供 :const:`re.ASCII` 标志,可以在 str " +"表达式中使用较为狭窄的 ``\\w`` 定义。" + +#: ../../howto/regex.rst:123 +msgid "" +"The following list of special sequences isn't complete. For a complete list " +"of sequences and expanded class definitions for Unicode string patterns, see" +" the last part of :ref:`Regular Expression Syntax ` in the " +"Standard Library reference. In general, the Unicode versions match any " +"character that's in the appropriate category in the Unicode database." +msgstr "" +"以下为特殊序列的不完全列表。有关 Unicode 字符串正则表达式的序列和扩展类定义的完整列表,参见标准库参考中 :ref:`正则表达式语法 ` 的最后一部分。通常,Unicode 版本的字符类会匹配 Unicode 数据库的相应类别中的任何字符。" + +#: ../../howto/regex.rst:130 +msgid "``\\d``" +msgstr "``\\d``" + +#: ../../howto/regex.rst:131 +msgid "Matches any decimal digit; this is equivalent to the class ``[0-9]``." +msgstr "匹配任何十进制数字,等价于字符类 ``[0-9]``。" + +#: ../../howto/regex.rst:133 +msgid "``\\D``" +msgstr "``\\D``" + +#: ../../howto/regex.rst:134 +msgid "" +"Matches any non-digit character; this is equivalent to the class ``[^0-9]``." +msgstr "匹配任何非数字字符,等价于字符类 ``[^0-9]``。" + +#: ../../howto/regex.rst:136 +msgid "``\\s``" +msgstr "``\\s``" + +#: ../../howto/regex.rst:137 +msgid "" +"Matches any whitespace character; this is equivalent to the class ``[ " +"\\t\\n\\r\\f\\v]``." +msgstr "匹配任何空白字符,等价于字符类 ``[ \\t\\n\\r\\f\\v]``。" + +#: ../../howto/regex.rst:140 +msgid "``\\S``" +msgstr "``\\S``" + +#: ../../howto/regex.rst:141 +msgid "" +"Matches any non-whitespace character; this is equivalent to the class ``[^ " +"\\t\\n\\r\\f\\v]``." +msgstr "匹配任何非空白字符,等价于字符类 ``[^ \\t\\n\\r\\f\\v]``。" + +#: ../../howto/regex.rst:144 +msgid "``\\w``" +msgstr "``\\w``" + +#: ../../howto/regex.rst:145 +msgid "" +"Matches any alphanumeric character; this is equivalent to the class " +"``[a-zA-Z0-9_]``." +msgstr "匹配任何字母与数字字符,等价于字符类 ``[a-zA-Z0-9_]``。" + +#: ../../howto/regex.rst:148 +msgid "``\\W``" +msgstr "``\\W``" + +#: ../../howto/regex.rst:149 +msgid "" +"Matches any non-alphanumeric character; this is equivalent to the class " +"``[^a-zA-Z0-9_]``." +msgstr "匹配任何非字母与数字字符,等价于字符类 ``[^a-zA-Z0-9_]``。" + +#: ../../howto/regex.rst:152 +msgid "" +"These sequences can be included inside a character class. For example, " +"``[\\s,.]`` is a character class that will match any whitespace character, " +"or ``','`` or ``'.'``." +msgstr "这些序列可以包含在字符类中。例如,``[\\s,.]`` 是一个匹配任何空白字符、``','`` 或 ``'.'`` 的字符类。" + +#: ../../howto/regex.rst:156 +msgid "" +"The final metacharacter in this section is ``.``. It matches anything " +"except a newline character, and there's an alternate mode " +"(:const:`re.DOTALL`) where it will match even a newline. ``.`` is often " +"used where you want to match \"any character\"." +msgstr "" +"本节的最后一个元字符是 ``.``。它匹配除换行符之外的任何字符,并且有一个可选模式( :const:`re.DOTALL` " +"),在该模式下它甚至可以匹配换行符。``.`` 通常用于你想匹配“任何字符”的场景。" + +#: ../../howto/regex.rst:163 +msgid "Repeating things" +msgstr "重复内容" + +#: ../../howto/regex.rst:165 +msgid "" +"Being able to match varying sets of characters is the first thing regular " +"expressions can do that isn't already possible with the methods available on" +" strings. However, if that was the only additional capability of regexes, " +"they wouldn't be much of an advance. Another capability is that you can " +"specify that portions of the RE must be repeated a certain number of times." +msgstr "" +"能够匹配各种各样的字符集合是正则表达式可以做到的第一件事,而这是字符串方法所不能做到的。但是,如果正则表达式就只有这么一个附加功能,它很难说的上有多大优势。另一个功能是,你可以指定正则的某部分必须重复一定的次数。" + +#: ../../howto/regex.rst:171 +msgid "" +"The first metacharacter for repeating things that we'll look at is ``*``. " +"``*`` doesn't match the literal character ``'*'``; instead, it specifies " +"that the previous character can be matched zero or more times, instead of " +"exactly once." +msgstr "" +"我们先来说说重复元字符 ``*``。``*`` 并不是匹配一个字面字符 ``'*'`` " +"。实际上,它指定前一个字符可以匹配零次或更多次,而不是只匹配一次。" + +#: ../../howto/regex.rst:175 +msgid "" +"For example, ``ca*t`` will match ``'ct'`` (0 ``'a'`` characters), ``'cat'`` " +"(1 ``'a'``), ``'caaat'`` (3 ``'a'`` characters), and so forth." +msgstr "" +"例如,``ca*t`` 将匹配 ``'ct'`` (0 个 ``'a'``)、``'cat'`` (1 个 ``'a'``)、``'caaat'`` " +"(3 个 ``'a'``) 等等。" + +#: ../../howto/regex.rst:178 +msgid "" +"Repetitions such as ``*`` are :dfn:`greedy`; when repeating a RE, the " +"matching engine will try to repeat it as many times as possible. If later " +"portions of the pattern don't match, the matching engine will then back up " +"and try again with fewer repetitions." +msgstr "" +"类似 ``*`` 这样的重复是 :dfn:`贪婪的`。当重复正则时,匹配引擎将尝试重复尽可能多的次数。 " +"如果表达式的后续部分不匹配,则匹配引擎将回退并以较少的重复次数再次尝试。" + +#: ../../howto/regex.rst:183 +msgid "" +"A step-by-step example will make this more obvious. Let's consider the " +"expression ``a[bcd]*b``. This matches the letter ``'a'``, zero or more " +"letters from the class ``[bcd]``, and finally ends with a ``'b'``. Now " +"imagine matching this RE against the string ``'abcbd'``." +msgstr "" +"通过一个逐步示例更容易理解这一点。让我们分析一下表达式 ``a[bcd]*b``。该表达式首先匹配一个字母 ``'a'``,接着匹配字符类 " +"``[bcd]`` 中的零个或更多个字母,最后以一个 ``'b'`` 结尾。现在想象一下用这个正则来匹配字符串 ``'abcbd'``。" + +#: ../../howto/regex.rst:189 +msgid "Step" +msgstr "步骤" + +#: ../../howto/regex.rst:189 +msgid "Matched" +msgstr "匹配" + +#: ../../howto/regex.rst:189 +msgid "Explanation" +msgstr "说明" + +#: ../../howto/regex.rst:191 +msgid "1" +msgstr "1" + +#: ../../howto/regex.rst:191 +msgid "``a``" +msgstr "``a``" + +#: ../../howto/regex.rst:191 +msgid "The ``a`` in the RE matches." +msgstr "正则中的 ``a`` 匹配成功。" + +#: ../../howto/regex.rst:193 +msgid "2" +msgstr "2" + +#: ../../howto/regex.rst:193 +msgid "``abcbd``" +msgstr "``abcbd``" + +#: ../../howto/regex.rst:193 +msgid "" +"The engine matches ``[bcd]*``, going as far as it can, which is to the end " +"of the string." +msgstr "引擎尽可能多地匹配 ``[bcd]*``,直至字符串末尾。" + +#: ../../howto/regex.rst:197 +msgid "3" +msgstr "3" + +#: ../../howto/regex.rst:197 ../../howto/regex.rst:205 +msgid "*Failure*" +msgstr "*失败*" + +#: ../../howto/regex.rst:197 +msgid "" +"The engine tries to match ``b``, but the current position is at the end of " +"the string, so it fails." +msgstr "引擎尝试匹配 ``b``,但是当前位置位于字符串末尾,所以匹配失败。" + +#: ../../howto/regex.rst:202 +msgid "4" +msgstr "4" + +#: ../../howto/regex.rst:202 ../../howto/regex.rst:213 +msgid "``abcb``" +msgstr "``abcb``" + +#: ../../howto/regex.rst:202 +msgid "Back up, so that ``[bcd]*`` matches one less character." +msgstr "回退,让 ``[bcd]*`` 少匹配一个字符。" + +#: ../../howto/regex.rst:205 +msgid "5" +msgstr "5" + +#: ../../howto/regex.rst:205 +msgid "" +"Try ``b`` again, but the current position is at the last character, which is" +" a ``'d'``." +msgstr "再次尝试匹配 ``b``,但是当前位置上的字符是最后一个字符 ``'d'``。" + +#: ../../howto/regex.rst:209 +msgid "6" +msgstr "6" + +#: ../../howto/regex.rst:209 +msgid "``abc``" +msgstr "``abc``" + +#: ../../howto/regex.rst:209 +msgid "Back up again, so that ``[bcd]*`` is only matching ``bc``." +msgstr "再次回退,让 ``[bcd]*`` 只匹配 ``bc``。" + +#: ../../howto/regex.rst:213 +msgid "7" +msgstr "7" + +#: ../../howto/regex.rst:213 +msgid "" +"Try ``b`` again. This time the character at the current position is " +"``'b'``, so it succeeds." +msgstr "再次尝试匹配 ``b``。这一次当前位置的字符是 ``'b'``,所以它成功了。" + +#: ../../howto/regex.rst:219 +msgid "" +"The end of the RE has now been reached, and it has matched ``'abcb'``. This" +" demonstrates how the matching engine goes as far as it can at first, and if" +" no match is found it will then progressively back up and retry the rest of " +"the RE again and again. It will back up until it has tried zero matches for" +" ``[bcd]*``, and if that subsequently fails, the engine will conclude that " +"the string doesn't match the RE at all." +msgstr "" +"此时正则表达式已经到达了尽头,并且匹配到了 ``'abcb'``。 " +"这个例子演示了匹配引擎一开始会尽其所能地进行匹配,如果没有找到匹配,它将逐步回退并重试正则的剩余部分,如此往复,直至 ``[bcd]*`` " +"只匹配零次。如果随后的匹配还是失败了,那么引擎会宣告整个正则表达式与字符串匹配失败。" + +#: ../../howto/regex.rst:226 +msgid "" +"Another repeating metacharacter is ``+``, which matches one or more times. " +"Pay careful attention to the difference between ``*`` and ``+``; ``*`` " +"matches *zero* or more times, so whatever's being repeated may not be " +"present at all, while ``+`` requires at least *one* occurrence. To use a " +"similar example, ``ca+t`` will match ``'cat'`` (1 ``'a'``), ``'caaat'`` (3 " +"``'a'``\\ s), but won't match ``'ct'``." +msgstr "" +"另一个重复元字符是 ``+``,表示匹配一次或更多次。请注意 ``*`` 与 ``+`` 之间的差别。 ``*`` 表示匹配 *零次* " +"或更多次,也就是说它所重复的内容是可以完全不出现的。而 ``+`` 则要求至少出现一次。举一个类似的例子,``ca+t`` 可以匹配 ``'cat'``" +" (1 个 ``'a'``) 或 ``'caaat'`` (3 个 ``'a'``),但不能匹配 ``'ct'``。" + +#: ../../howto/regex.rst:233 +msgid "" +"There are two more repeating operators or quantifiers. The question mark " +"character, ``?``, matches either once or zero times; you can think of it as " +"marking something as being optional. For example, ``home-?brew`` matches " +"either ``'homebrew'`` or ``'home-brew'``." +msgstr "" +"此外还有两个重复操作符或限定符。问号 ``?`` 表示匹配一次或零次;你可以认为它把某项内容变成了可选的。例如,``home-?brew`` 可以匹配 " +"``'homebrew'`` 或 ``'home-brew'``。" + +#: ../../howto/regex.rst:238 +msgid "" +"The most complicated quantifier is ``{m,n}``, where *m* and *n* are decimal " +"integers. This quantifier means there must be at least *m* repetitions, and" +" at most *n*. For example, ``a/{1,3}b`` will match ``'a/b'``, ``'a//b'``, " +"and ``'a///b'``. It won't match ``'ab'``, which has no slashes, or " +"``'a////b'``, which has four." +msgstr "" +"最复杂的限定符是 ``{m,n}``,其中 *m* 和 *n* 都是十进制整数。该限定符表示必须至少重复 *m* 次,至多重复 *n* 次。 " +"例如,``a/{1,3}b`` 将匹配 ``'a/b'``, ``'a//b'`` 和 ``'a///b'``。它不能匹配 " +"``'ab'``,因为其中没有斜杠,也不能匹配 ``'a////b'``,因为其中有四个斜杠。" + +#: ../../howto/regex.rst:244 +msgid "" +"You can omit either *m* or *n*; in that case, a reasonable value is assumed " +"for the missing value. Omitting *m* is interpreted as a lower limit of 0, " +"while omitting *n* results in an upper bound of infinity." +msgstr "*m* 和 *n* 不是必填的,缺失的情况下会设定为默认值。缺失 *m* 会解释为最少重复 0 次,缺失 *n* 则解释为最多重复无限次。" + +#: ../../howto/regex.rst:248 +msgid "" +"The simplest case ``{m}`` matches the preceding item exactly *m* times. For " +"example, ``a/{2}b`` will only match ``'a//b'``." +msgstr "最简单情况 ``{m}`` 将与前一项完全匹配 *m* 次。例如,``a/{2}b`` 将只匹配 ``'a//b'``。" + +#: ../../howto/regex.rst:251 +msgid "" +"Readers of a reductionist bent may notice that the three other quantifiers " +"can all be expressed using this notation. ``{0,}`` is the same as ``*``, " +"``{1,}`` is equivalent to ``+``, and ``{0,1}`` is the same as ``?``. It's " +"better to use ``*``, ``+``, or ``?`` when you can, simply because they're " +"shorter and easier to read." +msgstr "" +"细心的读者可能会注意到另外三个限定符都可以使用此标记法来表示。``{0,}`` 等同于 ``*``, ``{1,}`` 等同于 ``+``, 而 " +"``{0,1}`` 等同于 ``?``。在可能的情况下使用 ``*``, ``+`` 或 ``?`` 会更好,因为它们更为简短易读。" + +#: ../../howto/regex.rst:259 +msgid "Using regular expressions" +msgstr "使用正则表达式" + +#: ../../howto/regex.rst:261 +msgid "" +"Now that we've looked at some simple regular expressions, how do we actually" +" use them in Python? The :mod:`re` module provides an interface to the " +"regular expression engine, allowing you to compile REs into objects and then" +" perform matches with them." +msgstr "" +"现在我们已经了解了一些简单的正则表达式,那么我们如何在 Python 中实际使用它们呢? :mod:`re` " +"模块提供了正则表达式引擎的接口,可以让你将正则编译为对象,然后用它们来进行匹配。" + +#: ../../howto/regex.rst:268 +msgid "Compiling regular expressions" +msgstr "编译正则表达式" + +#: ../../howto/regex.rst:270 +msgid "" +"Regular expressions are compiled into pattern objects, which have methods " +"for various operations such as searching for pattern matches or performing " +"string substitutions. ::" +msgstr "正则表达式被编译成模式对象,模式对象具有各种操作的方法,例如搜索模式匹配或执行字符串替换。::" + +#: ../../howto/regex.rst:274 +msgid "" +">>> import re\n" +">>> p = re.compile('ab*')\n" +">>> p\n" +"re.compile('ab*')" +msgstr "" +">>> import re\n" +">>> p = re.compile('ab*')\n" +">>> p\n" +"re.compile('ab*')" + +#: ../../howto/regex.rst:279 +msgid "" +":func:`re.compile` also accepts an optional *flags* argument, used to enable" +" various special features and syntax variations. We'll go over the " +"available settings later, but for now a single example will do::" +msgstr "" +":func:`re.compile` 也接受一个可选的 *flags* 参数,用于启用各种特殊功能和语法变体。 " +"我们稍后将介绍可用的设置,但现在只需一个例子 ::" + +#: ../../howto/regex.rst:283 +msgid ">>> p = re.compile('ab*', re.IGNORECASE)" +msgstr ">>> p = re.compile('ab*', re.IGNORECASE)" + +#: ../../howto/regex.rst:285 +msgid "" +"The RE is passed to :func:`re.compile` as a string. REs are handled as " +"strings because regular expressions aren't part of the core Python language," +" and no special syntax was created for expressing them. (There are " +"applications that don't need REs at all, so there's no need to bloat the " +"language specification by including them.) Instead, the :mod:`re` module is " +"simply a C extension module included with Python, just like the " +":mod:`socket` or :mod:`zlib` modules." +msgstr "" +"正则作为字符串传递给 :func:`re.compile`。正则被处理为字符串,因为正则表达式不是核心 Python " +"语言的一部分,并且没有创建用于表达它们的特殊语法。 (有些应用程序根本不需要正则,因此不需要通过包含它们来扩展语言规范。)相反,:mod:`re` " +"模块只是 Python 附带的 C 扩展模块,就类似于 :mod:`socket` 或 :mod:`zlib` 模块。" + +#: ../../howto/regex.rst:292 +msgid "" +"Putting REs in strings keeps the Python language simpler, but has one " +"disadvantage which is the topic of the next section." +msgstr "将正则放在字符串中可以使 Python 语言更简单,但有一个缺点是下一节的主题。" + +#: ../../howto/regex.rst:299 +msgid "The backslash plague" +msgstr "反斜杠灾难" + +#: ../../howto/regex.rst:301 +msgid "" +"As stated earlier, regular expressions use the backslash character " +"(``'\\'``) to indicate special forms or to allow special characters to be " +"used without invoking their special meaning. This conflicts with Python's " +"usage of the same character for the same purpose in string literals." +msgstr "" +"如前所述,正则表达式使用反斜杠字符 (``'\\'``) 来表示特殊形式或允许使用特殊字符而不调用它们的特殊含义。这与 Python " +"在字符串文字中用于相同目的的相同字符的使用相冲突。" + +#: ../../howto/regex.rst:306 +msgid "" +"Let's say you want to write a RE that matches the string ``\\section``, " +"which might be found in a LaTeX file. To figure out what to write in the " +"program code, start with the desired string to be matched. Next, you must " +"escape any backslashes and other metacharacters by preceding them with a " +"backslash, resulting in the string ``\\\\section``. The resulting string " +"that must be passed to :func:`re.compile` must be ``\\\\section``. However," +" to express this as a Python string literal, both backslashes must be " +"escaped *again*." +msgstr "" +"假设你想要编写一个与字符串 ``\\section`` 相匹配的正则,它可以在 LaTeX 文件中找到。 " +"要找出在程序代码中写入的内容,请从要匹配的字符串开始。接下来,您必须通过在反斜杠前面添加反斜杠和其他元字符,从而产生字符串 " +"``\\\\section``。必须传递给 :func:`re.compile` 的结果字符串必须是 ``\\\\section``。 " +"但是,要将其表示为 Python 字符串文字,必须 *再次* 转义两个反斜杠。" + +#: ../../howto/regex.rst:315 +msgid "Characters" +msgstr "字符" + +#: ../../howto/regex.rst:315 +msgid "Stage" +msgstr "阶段" + +#: ../../howto/regex.rst:317 +msgid "``\\section``" +msgstr "``\\section``" + +#: ../../howto/regex.rst:317 +msgid "Text string to be matched" +msgstr "被匹配的字符串" + +#: ../../howto/regex.rst:319 +msgid "``\\\\section``" +msgstr "``\\\\section``" + +#: ../../howto/regex.rst:319 +msgid "Escaped backslash for :func:`re.compile`" +msgstr "为 :func:`re.compile` 转义的反斜杠" + +#: ../../howto/regex.rst:321 ../../howto/regex.rst:348 +msgid "``\"\\\\\\\\section\"``" +msgstr "``\"\\\\\\\\section\"``" + +#: ../../howto/regex.rst:321 +msgid "Escaped backslashes for a string literal" +msgstr "为字符串字面量转义的反斜杠" + +#: ../../howto/regex.rst:324 +msgid "" +"In short, to match a literal backslash, one has to write ``'\\\\\\\\'`` as " +"the RE string, because the regular expression must be ``\\\\``, and each " +"backslash must be expressed as ``\\\\`` inside a regular Python string " +"literal. In REs that feature backslashes repeatedly, this leads to lots of " +"repeated backslashes and makes the resulting strings difficult to " +"understand." +msgstr "" +"简而言之,要匹配文字反斜杠,必须将 ``'\\\\\\\\'`` 写为正则字符串,因为正则表达式必须是 ``\\\\``,并且每个反斜杠必须表示为 " +"``\\\\`` 在常规 Python 字符串字面中。在反复使用反斜杠的正则中,这会导致大量重复的反斜杠,并使得生成的字符串难以理解。" + +#: ../../howto/regex.rst:330 +msgid "" +"The solution is to use Python's raw string notation for regular expressions;" +" backslashes are not handled in any special way in a string literal prefixed" +" with ``'r'``, so ``r\"\\n\"`` is a two-character string containing ``'\\'``" +" and ``'n'``, while ``\"\\n\"`` is a one-character string containing a " +"newline. Regular expressions will often be written in Python code using this" +" raw string notation." +msgstr "" +"解决方案是使用 Python 的原始字符串表示法来表示正则表达式;反斜杠不以任何特殊的方式处理前缀为 ``'r'`` 的字符串字面,因此 " +"``r\"\\n\"`` 是一个包含 ``'\\'`` 和 ``'n'`` 的双字符字符串,而 ``\"\\n\"`` 是一个包含换行符的单字符字符串。" +" 正则表达式通常使用这种原始字符串表示法用 Python 代码编写。" + +#: ../../howto/regex.rst:336 +msgid "" +"In addition, special escape sequences that are valid in regular expressions," +" but not valid as Python string literals, now result in a " +":exc:`SyntaxWarning` and will eventually become a :exc:`SyntaxError`, which " +"means the sequences will be invalid if raw string notation or escaping the " +"backslashes isn't used." +msgstr "" +"此外,在正则表达式中有效,但在 Python 字符串字面值中无效的特殊转义序列现在会导致 :exc:`SyntaxWarning` 并且最终将成为 " +":exc:`SyntaxError`,这意味着如果未使用原始字符串表示法或对反斜杠进行转义则这些序列将变得无效。" + +#: ../../howto/regex.rst:344 +msgid "Regular String" +msgstr "常规字符串" + +#: ../../howto/regex.rst:344 +msgid "Raw string" +msgstr "原始字符串" + +#: ../../howto/regex.rst:346 +msgid "``\"ab*\"``" +msgstr "``\"ab*\"``" + +#: ../../howto/regex.rst:346 +msgid "``r\"ab*\"``" +msgstr "``r\"ab*\"``" + +#: ../../howto/regex.rst:348 +msgid "``r\"\\\\section\"``" +msgstr "``r\"\\\\section\"``" + +#: ../../howto/regex.rst:350 +msgid "``\"\\\\w+\\\\s+\\\\1\"``" +msgstr "``\"\\\\w+\\\\s+\\\\1\"``" + +#: ../../howto/regex.rst:350 +msgid "``r\"\\w+\\s+\\1\"``" +msgstr "``r\"\\w+\\s+\\1\"``" + +#: ../../howto/regex.rst:355 +msgid "Performing matches" +msgstr "执行匹配" + +#: ../../howto/regex.rst:357 +msgid "" +"Once you have an object representing a compiled regular expression, what do " +"you do with it? Pattern objects have several methods and attributes. Only " +"the most significant ones will be covered here; consult the :mod:`re` docs " +"for a complete listing." +msgstr "" +"一旦你有一个表示编译正则表达式的对象,你用它做什么?模式对象有几种方法和属性。这里只介绍最重要的内容;请参阅 :mod:`re` 文档获取完整列表。" + +#: ../../howto/regex.rst:363 ../../howto/regex.rst:418 +#: ../../howto/regex.rst:1074 +msgid "Method/Attribute" +msgstr "方法 / 属性" + +#: ../../howto/regex.rst:363 ../../howto/regex.rst:418 +#: ../../howto/regex.rst:1074 +msgid "Purpose" +msgstr "目的" + +#: ../../howto/regex.rst:365 +msgid "``search()``" +msgstr "``search()``" + +#: ../../howto/regex.rst:365 +msgid "Scan through a string, looking for any location where this RE matches." +msgstr "扫描字符串,查找此正则匹配的任何位置。" + +#: ../../howto/regex.rst:368 +msgid "``prefixmatch()``" +msgstr "``prefixmatch()``" + +#: ../../howto/regex.rst:368 +msgid "" +"Determine if the RE matches at the beginning of the string. Previously named" +" :ref:`match() `." +msgstr "确定正则是否从字符串的开头匹配。 之前名为 :ref:`match() `。" + +#: ../../howto/regex.rst:372 +msgid "``findall()``" +msgstr "``findall()``" + +#: ../../howto/regex.rst:372 +msgid "Find all substrings where the RE matches, and return them as a list." +msgstr "找到 RE 匹配的所有子字符串,并将它们作为列表返回。" + +#: ../../howto/regex.rst:375 +msgid "``finditer()``" +msgstr "``finditer()``" + +#: ../../howto/regex.rst:375 +msgid "" +"Find all substrings where the RE matches, and return them as an " +":term:`iterator`." +msgstr "找到 RE 匹配的所有子字符串,并将它们作为 :term:`iterator` 返回。" + +#: ../../howto/regex.rst:379 +msgid "" +":meth:`~re.Pattern.search` and :meth:`~re.Pattern.prefixmatch` return " +"``None`` if no match can be found. If they're successful, a :ref:`match " +"object ` instance is returned, containing information about " +"the match: where it starts and ends, the substring it matched, and more." +msgstr "" + +#: ../../howto/regex.rst:384 +msgid "" +"You can learn about this by interactively experimenting with the :mod:`re` " +"module." +msgstr "你可以通过交互式地试验 :mod:`re` 模块来学习这一点。" + +#: ../../howto/regex.rst:387 +msgid "" +"This HOWTO uses the standard Python interpreter for its examples. First, run" +" the Python interpreter, import the :mod:`re` module, and compile a RE::" +msgstr "" +"本 HOWTO 使用标准 Python 解释器作为示例。首先,运行 Python 解释器,导入 :mod:`re` 模块,然后编译一个正则 ::" + +#: ../../howto/regex.rst:390 +msgid "" +">>> import re\n" +">>> p = re.compile('[a-z]+')\n" +">>> p\n" +"re.compile('[a-z]+')" +msgstr "" +">>> import re\n" +">>> p = re.compile('[a-z]+')\n" +">>> p\n" +"re.compile('[a-z]+')" + +#: ../../howto/regex.rst:395 +msgid "" +"Now, you can try matching various strings against the RE ``[a-z]+``. An " +"empty string shouldn't match at all, since ``+`` means 'one or more " +"repetitions'. :meth:`~re.Pattern.search` should return ``None`` in this " +"case, which will cause the interpreter to print no output. You can " +"explicitly print the result of :meth:`!search` to make this clear. ::" +msgstr "" + +#: ../../howto/regex.rst:401 +msgid "" +">>> p.search(\"\")\n" +">>> print(p.search(\"\"))\n" +"None" +msgstr "" + +#: ../../howto/regex.rst:405 +msgid "" +"Now, let's try it on a string that it should match, such as ``tempo``. In " +"this case, :meth:`~re.Pattern.search` will return a :ref:`match object " +"`, so you should store the result in a variable for later " +"use. ::" +msgstr "" + +#: ../../howto/regex.rst:409 +msgid "" +">>> m = p.search('tempo')\n" +">>> m\n" +"" +msgstr "" + +#: ../../howto/regex.rst:413 +msgid "" +"Now you can query the :ref:`match object ` for information " +"about the matching string. Match object instances also have several methods" +" and attributes; the most important ones are:" +msgstr "" +"现在你可以检查 :ref:`匹配对象 ` 以获取有关匹配字符串的信息。匹配对象实例也有几个方法和属性;最重要的是:" + +#: ../../howto/regex.rst:420 +msgid "``group()``" +msgstr "``group()``" + +#: ../../howto/regex.rst:420 +msgid "Return the string matched by the RE" +msgstr "返回正则匹配的字符串" + +#: ../../howto/regex.rst:422 +msgid "``start()``" +msgstr "``start()``" + +#: ../../howto/regex.rst:422 +msgid "Return the starting position of the match" +msgstr "返回匹配的开始位置" + +#: ../../howto/regex.rst:424 +msgid "``end()``" +msgstr "``end()``" + +#: ../../howto/regex.rst:424 +msgid "Return the ending position of the match" +msgstr "返回匹配的结束位置" + +#: ../../howto/regex.rst:426 +msgid "``span()``" +msgstr "``span()``" + +#: ../../howto/regex.rst:426 +msgid "Return a tuple containing the (start, end) positions of the match" +msgstr "返回包含匹配 (start, end) 位置的元组" + +#: ../../howto/regex.rst:430 +msgid "Trying these methods will soon clarify their meaning::" +msgstr "尝试这些方法很快就会清楚它们的含义::" + +#: ../../howto/regex.rst:432 +msgid "" +">>> m.group()\n" +"'tempo'\n" +">>> m.start(), m.end()\n" +"(0, 5)\n" +">>> m.span()\n" +"(0, 5)" +msgstr "" +">>> m.group()\n" +"'tempo'\n" +">>> m.start(), m.end()\n" +"(0, 5)\n" +">>> m.span()\n" +"(0, 5)" + +#: ../../howto/regex.rst:439 +msgid "" +":meth:`~re.Match.group` returns the substring that was matched by the RE. " +":meth:`~re.Match.start` and :meth:`~re.Match.end` return the starting and " +"ending index of the match. :meth:`~re.Match.span` returns both start and end" +" indexes in a single tuple. The :meth:`~re.Pattern.search` method of " +"patterns scans through the string, so the match may not start at zero. " +"However, the :meth:`~re.Pattern.prefixmatch` method only checks if the RE " +"matches at the start of a string, so :meth:`!start` will always be zero in " +"that case. ::" +msgstr "" + +#: ../../howto/regex.rst:448 +msgid "" +">>> m = p.search('::: message'); print(m)\n" +"\n" +">>> m.group()\n" +"'message'\n" +">>> m.span()\n" +"(4, 11)\n" +">>> print(p.prefixmatch('::: message'))\n" +"None" +msgstr "" + +#: ../../howto/regex.rst:457 +msgid "" +"In actual programs, the most common style is to store the :ref:`match object" +" ` in a variable, and then check if it was ``None``. This " +"usually looks like::" +msgstr "" +"在实际程序中,最常见的样式是在变量中存储 :ref:`匹配对象 `,然后检查它是否为 ``None``。 " +"这通常看起来像::" + +#: ../../howto/regex.rst:461 +msgid "" +"p = re.compile( ... )\n" +"m = p.search( 'string goes here' )\n" +"if m:\n" +" print('Match found: ', m.group())\n" +"else:\n" +" print('No match')" +msgstr "" + +#: ../../howto/regex.rst:468 +msgid "" +"Two pattern methods return all of the matches for a pattern. " +":meth:`~re.Pattern.findall` returns a list of matching strings::" +msgstr "两种模式方法返回模式的所有匹配项。 :meth:`~re.Pattern.findall` 返回匹配字符串的列表::" + +#: ../../howto/regex.rst:471 +msgid "" +">>> p = re.compile(r'\\d+')\n" +">>> p.findall('12 drummers drumming, 11 pipers piping, 10 lords a-leaping')\n" +"['12', '11', '10']" +msgstr "" +">>> p = re.compile(r'\\d+')\n" +">>> p.findall('12 drummers drumming, 11 pipers piping, 10 lords a-leaping')\n" +"['12', '11', '10']" + +#: ../../howto/regex.rst:475 +msgid "" +"The ``r`` prefix, making the literal a raw string literal, is needed in this" +" example because escape sequences in a normal \"cooked\" string literal that" +" are not recognized by Python, as opposed to regular expressions, now result" +" in a :exc:`SyntaxWarning` and will eventually become a :exc:`SyntaxError`." +" See :ref:`the-backslash-plague`." +msgstr "" +"在这个例子中需要 ``r`` 前缀,使字面值成为原始字符串字面值,因为普通的“加工”字符串字面值中的转义序列不能被 Python " +"所识别,不能构成正则表达式,会导致 :exc:`SyntaxWarning` 并且最终将变为 :exc:`SyntaxError`。 参见 " +":ref:`the-backslash-plague`。" + +#: ../../howto/regex.rst:481 +msgid "" +":meth:`~re.Pattern.findall` has to create the entire list before it can be " +"returned as the result. The :meth:`~re.Pattern.finditer` method returns a " +"sequence of :ref:`match object ` instances as an " +":term:`iterator`::" +msgstr "" +":meth:`~re.Pattern.findall` 必须先创建整个列表才能返回结果。 :meth:`~re.Pattern.finditer` " +"方法将一个 :ref:`匹配对象 ` 的序列返回为一个 :term:`iterator` ::" + +#: ../../howto/regex.rst:485 +msgid "" +">>> iterator = p.finditer('12 drummers drumming, 11 ... 10 ...')\n" +">>> iterator\n" +"\n" +">>> for match in iterator:\n" +"... print(match.span())\n" +"...\n" +"(0, 2)\n" +"(22, 24)\n" +"(29, 31)" +msgstr "" +">>> iterator = p.finditer('12 drummers drumming, 11 ... 10 ...')\n" +">>> iterator\n" +"\n" +">>> for match in iterator:\n" +"... print(match.span())\n" +"...\n" +"(0, 2)\n" +"(22, 24)\n" +"(29, 31)" + +#: ../../howto/regex.rst:497 +msgid "Module-level functions" +msgstr "模块级函数" + +#: ../../howto/regex.rst:499 +msgid "" +"You don't have to create a pattern object and call its methods; the " +":mod:`re` module also provides top-level functions called " +":func:`~re.search`, :func:`~re.prefixmatch`, :func:`~re.findall`, " +":func:`~re.sub`, and so forth. These functions take the same arguments as " +"the corresponding pattern method with the RE string added as the first " +"argument, and still return either ``None`` or a :ref:`match object ` instance. ::" +msgstr "" + +#: ../../howto/regex.rst:506 +msgid "" +">>> print(re.prefixmatch(r'From\\s+', 'Fromage amk'))\n" +"None\n" +">>> re.prefixmatch(r'From\\s+', 'From amk Thu May 14 19:12:10 1998')\n" +"" +msgstr "" + +#: ../../howto/regex.rst:511 +msgid "" +"Under the hood, these functions simply create a pattern object for you and " +"call the appropriate method on it. They also store the compiled object in a" +" cache, so future calls using the same RE won't need to parse the pattern " +"again and again." +msgstr "" +"本质上,这些函数只是为你创建一个模式对象,并在其上调用适当的方法。它们还将编译对象存储在缓存中,因此未来使用相同正则的调用将不需要再次解析该模式。" + +#: ../../howto/regex.rst:516 +msgid "" +"Should you use these module-level functions, or should you get the pattern " +"and call its methods yourself? If you're accessing a regex within a loop, " +"pre-compiling it will save a few function calls. Outside of loops, there's " +"not much difference thanks to the internal cache." +msgstr "" +"你是否应该使用这些模块级函数,还是应该自己获取模式并调用其方法?如果你正在循环中访问正则表达式,预编译它将节省一些函数调用。 " +"在循环之外,由于有内部缓存,没有太大区别。" + +#: ../../howto/regex.rst:524 +msgid "Compilation flags" +msgstr "编译旗标" + +#: ../../howto/regex.rst:528 +msgid "" +"Compilation flags let you modify some aspects of how regular expressions " +"work. Flags are available in the :mod:`re` module under two names, a long " +"name such as :const:`IGNORECASE` and a short, one-letter form such as " +":const:`I`. (If you're familiar with Perl's pattern modifiers, the one-" +"letter forms use the same letters; the short form of :const:`re.VERBOSE` is " +":const:`re.X`, for example.) Multiple flags can be specified by bitwise OR-" +"ing them; ``re.I | re.M`` sets both the :const:`I` and :const:`M` flags, for" +" example." +msgstr "" +"编译标志允许你修改正则表达式的工作方式。标志在 :mod:`re` 模块中有两个名称,长名称如 :const:`IGNORECASE` " +"和一个简短的单字母形式,例如 :const:`I`。 (如果你熟悉 Perl 的模式修饰符,则单字母形式使用和其相同的字母;例如, " +":const:`re.VERBOSE` 的缩写形式为 :const:`re.X`。)多个标志可以 通过按位或运算来指定它们;例如,``re.I | " +"re.M`` 设置 :const:`I` 和 :const:`M` 标志。" + +#: ../../howto/regex.rst:536 +msgid "" +"Here's a table of the available flags, followed by a more detailed " +"explanation of each one." +msgstr "这是一个可用标志表,以及每个标志的更详细说明。" + +#: ../../howto/regex.rst:540 +msgid "Flag" +msgstr "标志" + +#: ../../howto/regex.rst:540 +msgid "Meaning" +msgstr "含义" + +#: ../../howto/regex.rst:542 +msgid ":const:`ASCII`, :const:`A`" +msgstr ":const:`ASCII`, :const:`A`" + +#: ../../howto/regex.rst:542 +msgid "" +"Makes several escapes like ``\\w``, ``\\b``, ``\\s`` and ``\\d`` match only " +"on ASCII characters with the respective property." +msgstr "使几个转义如 ``\\w``、``\\b``、``\\s`` 和 ``\\d`` 匹配仅与具有相应特征属性的 ASCII 字符匹配。" + +#: ../../howto/regex.rst:546 +msgid ":const:`DOTALL`, :const:`S`" +msgstr ":const:`DOTALL`, :const:`S`" + +#: ../../howto/regex.rst:546 +msgid "Make ``.`` match any character, including newlines." +msgstr "使 ``.`` 匹配任何字符,包括换行符。" + +#: ../../howto/regex.rst:549 +msgid ":const:`IGNORECASE`, :const:`I`" +msgstr ":const:`IGNORECASE`, :const:`I`" + +#: ../../howto/regex.rst:549 +msgid "Do case-insensitive matches." +msgstr "进行大小写不敏感匹配。" + +#: ../../howto/regex.rst:551 +msgid ":const:`LOCALE`, :const:`L`" +msgstr ":const:`LOCALE`, :const:`L`" + +#: ../../howto/regex.rst:551 +msgid "Do a locale-aware match." +msgstr "进行区域设置感知匹配。" + +#: ../../howto/regex.rst:553 +msgid ":const:`MULTILINE`, :const:`M`" +msgstr ":const:`MULTILINE`, :const:`M`" + +#: ../../howto/regex.rst:553 +msgid "Multi-line matching, affecting ``^`` and ``$``." +msgstr "多行匹配,影响 ``^`` 和 ``$``。" + +#: ../../howto/regex.rst:556 +msgid ":const:`VERBOSE`, :const:`X` (for 'extended')" +msgstr ":const:`VERBOSE`, :const:`X` (表示 'extended')" + +#: ../../howto/regex.rst:556 +msgid "" +"Enable verbose REs, which can be organized more cleanly and understandably." +msgstr "启用详细的正则,可以更清晰,更容易理解。" + +#: ../../howto/regex.rst:565 +msgid "" +"Perform case-insensitive matching; character class and literal strings will " +"match letters by ignoring case. For example, ``[A-Z]`` will match lowercase" +" letters, too. Full Unicode matching also works unless the :const:`ASCII` " +"flag is used to disable non-ASCII matches. When the Unicode patterns " +"``[a-z]`` or ``[A-Z]`` are used in combination with the :const:`IGNORECASE` " +"flag, they will match the 52 ASCII letters and 4 additional non-ASCII " +"letters: 'İ' (U+0130, Latin capital letter I with dot above), 'ı' (U+0131, " +"Latin small letter dotless i), 'ſ' (U+017F, Latin small letter long s) and " +"'K' (U+212A, Kelvin sign). ``Spam`` will match ``'Spam'``, ``'spam'``, " +"``'spAM'``, or ``'ſpam'`` (the latter is matched only in Unicode mode). This" +" lowercasing doesn't take the current locale into account; it will if you " +"also set the :const:`LOCALE` flag." +msgstr "" +"执行不区分大小写的匹配;字符类和字面字符串将通过忽略大小写来匹配字母。例如,``[A-Z]`` 也匹配小写字母。除非使用 :const:`ASCII` " +"标志来禁用非 ASCII 匹配,否则完全 Unicode 匹配也有效。当 Unicode 模式 ``[a-z]`` 或 ``[A-Z]`` 与 " +":const:`IGNORECASE` 标志结合使用时,它们将匹配 52 个 ASCII 字母和 4 个额外的非 ASCII 字母:'İ' " +"(U+0130,拉丁大写字母 I,带上面的点),'ı' (U+0131,拉丁文小写字母无点 i),'s' (U+017F,拉丁文小写字母长 s) " +"和'K' (U+212A,开尔文符号)。``Spam`` 将匹配 ``'Spam'``,``'spam'``,``'spAM'`` 或 " +"``'ſpam'`` (后者仅在 Unicode 模式下匹配)。此小写不考虑当前区域设置;如果你还设置了 :const:`LOCALE` " +"标志,则将考虑。" + +#: ../../howto/regex.rst:583 +msgid "" +"Make ``\\w``, ``\\W``, ``\\b``, ``\\B`` and case-insensitive matching " +"dependent on the current locale instead of the Unicode database." +msgstr "使 ``\\w``、``\\W``、``\\b``、``\\B`` 和大小写不敏感匹配依赖于当前区域而不是 Unicode 数据库。" + +#: ../../howto/regex.rst:586 +msgid "" +"Locales are a feature of the C library intended to help in writing programs " +"that take account of language differences. For example, if you're " +"processing encoded French text, you'd want to be able to write ``\\w+`` to " +"match words, but ``\\w`` only matches the character class ``[A-Za-z]`` in " +"bytes patterns; it won't match bytes corresponding to ``é`` or ``ç``. If " +"your system is configured properly and a French locale is selected, certain " +"C functions will tell the program that the byte corresponding to ``é`` " +"should also be considered a letter. Setting the :const:`LOCALE` flag when " +"compiling a regular expression will cause the resulting compiled object to " +"use these C functions for ``\\w``; this is slower, but also enables ``\\w+``" +" to match French words as you'd expect. The use of this flag is discouraged " +"in Python 3 as the locale mechanism is very unreliable, it only handles one " +"\"culture\" at a time, and it only works with 8-bit locales. Unicode " +"matching is already enabled by default in Python 3 for Unicode (str) " +"patterns, and it is able to handle different locales/languages." +msgstr "" +"区域设置是 C 库的一个功能,旨在帮助编写考虑到语言差异的程序。例如,如果你正在处理编码的法语文本,那么你希望能够编写 ``\\w+`` 来匹配单词,但" +" ``\\w`` 只匹配字符类 ``[A-Za-z]`` 字节模式;它不会匹配对应于 ``é`` 或 ``ç`` " +"的字节。如果你的系统配置正确并且选择了法语区域设置,某些 C 函数将告诉程序对应于 ``é`` 的字节也应该被视为字母。在编译正则表达式时设置 " +":const:`LOCALE` 标志将导致生成的编译对象将这些 C 函数用于 ``\\w``;这比较慢,但也可以使 ``\\w+`` " +"匹配你所期望的法语单词。在 Python 3 中不鼓励使用此标志,因为语言环境机制非常不可靠,它一次只处理一个“文化”,它只适用于 8 " +"位语言环境。默认情况下,Python 3 中已经为 Unicode(str)模式启用了 Unicode 匹配,并且它能够处理不同的区域/语言。" + +#: ../../howto/regex.rst:608 +msgid "" +"(``^`` and ``$`` haven't been explained yet; they'll be introduced in " +"section :ref:`more-metacharacters`.)" +msgstr "(``^`` 和 ``$`` 还没有解释;它们将在以下部分介绍 :ref:`more-metacharacters`。)" + +#: ../../howto/regex.rst:611 +msgid "" +"Usually ``^`` matches only at the beginning of the string, and ``$`` matches" +" only at the end of the string and immediately before the newline (if any) " +"at the end of the string. When this flag is specified, ``^`` matches at the " +"beginning of the string and at the beginning of each line within the string," +" immediately following each newline. Similarly, the ``$`` metacharacter " +"matches either at the end of the string and at the end of each line " +"(immediately preceding each newline)." +msgstr "" +"通常 ``^`` 只匹配字符串的开头,而 ``$`` 只匹配字符串的结尾,紧接在字符串末尾的换行符(如果有的话)之前。当指定了这个标志时,``^`` " +"匹配字符串的开头和字符串中每一行的开头,紧跟在每个换行符之后。类似地,``$`` 元字符匹配字符串的结尾和每行的结尾(紧接在每个换行符之前)。" + +#: ../../howto/regex.rst:624 +msgid "" +"Makes the ``'.'`` special character match any character at all, including a " +"newline; without this flag, ``'.'`` will match anything *except* a newline." +msgstr "使 ``'.'`` 特殊字符匹配任何字符,包括换行符;没有这个标志,``'.'`` 将匹配任何字符 *除了* 换行符。" + +#: ../../howto/regex.rst:632 +msgid "" +"Make ``\\w``, ``\\W``, ``\\b``, ``\\B``, ``\\s`` and ``\\S`` perform ASCII-" +"only matching instead of full Unicode matching. This is only meaningful for " +"Unicode patterns, and is ignored for byte patterns." +msgstr "" +"使 ``\\w``、``\\W``、``\\b``、``\\B``、``\\s`` 和 ``\\S`` 执行仅 ASCII 匹配而不是完整匹配 " +"Unicode 匹配。这仅对 Unicode 模式有意义,并且对于字节模式将被忽略。" + +#: ../../howto/regex.rst:641 +msgid "" +"This flag allows you to write regular expressions that are more readable by " +"granting you more flexibility in how you can format them. When this flag " +"has been specified, whitespace within the RE string is ignored, except when " +"the whitespace is in a character class or preceded by an unescaped " +"backslash; this lets you organize and indent the RE more clearly. This flag" +" also lets you put comments within a RE that will be ignored by the engine; " +"comments are marked by a ``'#'`` that's neither in a character class nor " +"preceded by an unescaped backslash." +msgstr "" + +#: ../../howto/regex.rst:650 +msgid "" +"For example, here's a RE that uses :const:`re.VERBOSE`; see how much easier " +"it is to read? ::" +msgstr "例如,这里的正则使用 :const:`re.VERBOSE`;看看阅读有多容易?::" + +#: ../../howto/regex.rst:653 +msgid "" +"charref = re.compile(r\"\"\"\n" +" &[#] # Start of a numeric entity reference\n" +" (\n" +" 0[0-7]+ # Octal form\n" +" | [0-9]+ # Decimal form\n" +" | x[0-9a-fA-F]+ # Hexadecimal form\n" +" )\n" +" ; # Trailing semicolon\n" +"\"\"\", re.VERBOSE)" +msgstr "" +"charref = re.compile(r\"\"\"\n" +" &[#] # 数字实体引用的开始\n" +" (\n" +" 0[0-7]+ # 八进制形式\n" +" | [0-9]+ # 十进制形式\n" +" | x[0-9a-fA-F]+ # 十六进制形式\n" +" )\n" +" ; # 末尾分号\n" +"\"\"\", re.VERBOSE)" + +#: ../../howto/regex.rst:663 +msgid "Without the verbose setting, the RE would look like this::" +msgstr "如果没有详细设置,正则将如下所示::" + +#: ../../howto/regex.rst:665 +msgid "" +"charref = re.compile(\"&#(0[0-7]+\"\n" +" \"|[0-9]+\"\n" +" \"|x[0-9a-fA-F]+);\")" +msgstr "" +"charref = re.compile(\"&#(0[0-7]+\"\n" +" \"|[0-9]+\"\n" +" \"|x[0-9a-fA-F]+);\")" + +#: ../../howto/regex.rst:669 +msgid "" +"In the above example, Python's automatic concatenation of string literals " +"has been used to break up the RE into smaller pieces, but it's still more " +"difficult to understand than the version using :const:`re.VERBOSE`." +msgstr "" +"在上面的例子中,Python 的字符串文字的自动连接已被用于将正则分解为更小的部分,但它仍然比以下使用 :const:`re.VERBOSE` " +"版本更难理解。" + +#: ../../howto/regex.rst:675 +msgid "More pattern power" +msgstr "更多的模式能力" + +#: ../../howto/regex.rst:677 +msgid "" +"So far we've only covered a part of the features of regular expressions. In" +" this section, we'll cover some new metacharacters, and how to use groups to" +" retrieve portions of the text that was matched." +msgstr "到目前为止,我们只介绍了正则表达式的一部分功能。在本节中,我们将介绍一些新的元字符,以及如何使用组来检索匹配的文本部分。" + +#: ../../howto/regex.rst:685 +msgid "More metacharacters" +msgstr "更多的元字符" + +#: ../../howto/regex.rst:687 +msgid "" +"There are some metacharacters that we haven't covered yet. Most of them " +"will be covered in this section." +msgstr "我们还没有涉及到一些元字符。其中大部分内容将在本节中介绍。" + +#: ../../howto/regex.rst:690 +msgid "" +"Some of the remaining metacharacters to be discussed are :dfn:`zero-width " +"assertions`. They don't cause the engine to advance through the string; " +"instead, they consume no characters at all, and simply succeed or fail. For" +" example, ``\\b`` is an assertion that the current position is located at a " +"word boundary; the position isn't changed by the ``\\b`` at all. This means" +" that zero-width assertions should never be repeated, because if they match " +"once at a given location, they can obviously be matched an infinite number " +"of times." +msgstr "" +"要讨论的其余一些元字符是 :dfn:`零宽度断言`。 " +"它们不会使解析引擎在字符串中前进一个字符;相反,它们根本不占用任何字符,只是成功或失败。例如,``\\b`` " +"是一个断言,指明当前位置位于字边界;这个位置根本不会被 ``\\b`` " +"改变。这意味着永远不应重复零宽度断言,因为如果它们在给定位置匹配一次,它们显然可以无限次匹配。" + +#: ../../howto/regex.rst:698 +msgid "``|``" +msgstr "``|``" + +#: ../../howto/regex.rst:699 +msgid "" +"Alternation, or the \"or\" operator. If *A* and *B* are regular " +"expressions, ``A|B`` will match any string that matches either *A* or *B*. " +"``|`` has very low precedence in order to make it work reasonably when " +"you're alternating multi-character strings. ``Crow|Servo`` will match either" +" ``'Crow'`` or ``'Servo'``, not ``'Cro'``, a ``'w'`` or an ``'S'``, and " +"``'ervo'``." +msgstr "" +"交替,即“or”运算符。如果 *A* 和 *B* 是正则表达式,``A|B`` 将匹配任何与 *A* 或 *B* 匹配的字符串。``|`` " +"具有非常低的优先级,以便在交替使用多字符字符串时使其合理地工作。``Crow|Servo`` 将匹配 ``'Crow'`` 或 " +"``'Servo'``,而不是 ``'Cro'``、``'w'`` 或 ``'S'`` 和 ``'ervo'``。" + +#: ../../howto/regex.rst:705 +msgid "" +"To match a literal ``'|'``, use ``\\|``, or enclose it inside a character " +"class, as in ``[|]``." +msgstr "要匹配字面 ``'|'``,请使用 ``\\|``,或将其括在字符类中,如 ``[|]``。" + +#: ../../howto/regex.rst:708 +msgid "``^``" +msgstr "``^``" + +#: ../../howto/regex.rst:709 +msgid "" +"Matches at the beginning of lines. Unless the :const:`MULTILINE` flag has " +"been set, this will only match at the beginning of the string. In " +":const:`MULTILINE` mode, this also matches immediately after each newline " +"within the string." +msgstr "" +"在行的开头匹配。除非设置了 :const:`MULTILINE` 标志,否则只会在字符串的开头匹配。在 :const:`MULTILINE` " +"模式下,这也在字符串中的每个换行符后立即匹配。" + +#: ../../howto/regex.rst:713 +msgid "" +"For example, if you wish to match the word ``From`` only at the beginning of" +" a line, the RE to use is ``^From``. ::" +msgstr "例如,如果你希望仅在行的开头匹配单词 ``From``,则要使用的正则 ``^From``。::" + +#: ../../howto/regex.rst:716 +msgid "" +">>> print(re.search('^From', 'From Here to Eternity'))\n" +"\n" +">>> print(re.search('^From', 'Reciting From Memory'))\n" +"None" +msgstr "" +">>> print(re.search('^From', 'From Here to Eternity'))\n" +"\n" +">>> print(re.search('^From', 'Reciting From Memory'))\n" +"None" + +#: ../../howto/regex.rst:721 +msgid "To match a literal ``'^'``, use ``\\^``." +msgstr "要匹配字面 ``'^'``,使用 ``\\^``。" + +#: ../../howto/regex.rst:723 +msgid "``$``" +msgstr "``$``" + +#: ../../howto/regex.rst:724 +msgid "" +"Matches at the end of a line, which is defined as either the end of the " +"string, or any location followed by a newline character. ::" +msgstr "匹配行的末尾,定义为字符串的结尾,或者后跟换行符的任何位置。::" + +#: ../../howto/regex.rst:727 +msgid "" +">>> print(re.search('}$', '{block}'))\n" +"\n" +">>> print(re.search('}$', '{block} '))\n" +"None\n" +">>> print(re.search('}$', '{block}\\n'))\n" +"" +msgstr "" +">>> print(re.search('}$', '{block}'))\n" +"\n" +">>> print(re.search('}$', '{block} '))\n" +"None\n" +">>> print(re.search('}$', '{block}\\n'))\n" +"" + +#: ../../howto/regex.rst:734 +msgid "" +"To match a literal ``'$'``, use ``\\$`` or enclose it inside a character " +"class, as in ``[$]``." +msgstr "要匹配字面 ``'$'``,使用 ``\\$`` 或者将其包裹在一个字符类中,例如 ``[$]``。" + +#: ../../howto/regex.rst:737 +msgid "``\\A``" +msgstr "``\\A``" + +#: ../../howto/regex.rst:738 +msgid "" +"Matches only at the start of the string. When not in :const:`MULTILINE` " +"mode, ``\\A`` and ``^`` are effectively the same. In :const:`MULTILINE` " +"mode, they're different: ``\\A`` still matches only at the beginning of the " +"string, but ``^`` may match at any location inside the string that follows a" +" newline character." +msgstr "" +"仅匹配字符串的开头。 当不在 :const:`MULTILINE` 模式时,``\\A`` 和 ``^`` 实际上是相同的。 在 " +":const:`MULTILINE` 模式中,它们是不同的: ``\\A`` 仍然只在字符串的开头匹配,但 ``^`` " +"可以匹配在换行符之后的字符串内的任何位置。" + +#: ../../howto/regex.rst:743 +msgid "``\\z``" +msgstr "``\\z``" + +#: ../../howto/regex.rst:744 +msgid "Matches only at the end of the string." +msgstr "只匹配字符串尾。" + +#: ../../howto/regex.rst:746 +msgid "``\\Z``" +msgstr "``\\Z``" + +#: ../../howto/regex.rst:747 +msgid "The same as ``\\z``. For compatibility with old Python versions." +msgstr "与 ``\\z`` 相同。与旧版本 Python 保持兼容性。" + +#: ../../howto/regex.rst:749 +msgid "``\\b``" +msgstr "``\\b``" + +#: ../../howto/regex.rst:750 +msgid "" +"Word boundary. This is a zero-width assertion that matches only at the " +"beginning or end of a word. A word is defined as a sequence of alphanumeric" +" characters, so the end of a word is indicated by whitespace or a non-" +"alphanumeric character." +msgstr "字边界。这是一个零宽度断言,仅在单词的开头或结尾处匹配。单词被定义为一个字母数字字符序列,因此单词的结尾由空格或非字母数字字符表示。" + +#: ../../howto/regex.rst:755 +msgid "" +"The following example matches ``class`` only when it's a complete word; it " +"won't match when it's contained inside another word. ::" +msgstr "以下示例仅当它是一个完整的单词时匹配 ``class``;当它包含在另一个单词中时将不会匹配。 ::" + +#: ../../howto/regex.rst:758 +msgid "" +">>> p = re.compile(r'\\bclass\\b')\n" +">>> print(p.search('no class at all'))\n" +"\n" +">>> print(p.search('the declassified algorithm'))\n" +"None\n" +">>> print(p.search('one subclass is'))\n" +"None" +msgstr "" +">>> p = re.compile(r'\\bclass\\b')\n" +">>> print(p.search('no class at all'))\n" +"\n" +">>> print(p.search('the declassified algorithm'))\n" +"None\n" +">>> print(p.search('one subclass is'))\n" +"None" + +#: ../../howto/regex.rst:766 +msgid "" +"There are two subtleties you should remember when using this special " +"sequence. First, this is the worst collision between Python's string " +"literals and regular expression sequences. In Python's string literals, " +"``\\b`` is the backspace character, ASCII value 8. If you're not using raw " +"strings, then Python will convert the ``\\b`` to a backspace, and your RE " +"won't match as you expect it to. The following example looks the same as our" +" previous RE, but omits the ``'r'`` in front of the RE string. ::" +msgstr "" +"使用这个特殊序列时,你应该记住两个细微之处。首先,这是 Python 的字符串文字和正则表达式序列之间最严重的冲突。在 Python " +"的字符串文字中,``\\b`` 是退格字符,ASCII 值为 8。如果你没有使用原始字符串,那么 Python 会将 ``\\b`` " +"转换为退格,你的正则不会按照你的预期匹配。以下示例与我们之前的正则看起来相同,但省略了正则字符串前面的 ``'r'``。::" + +#: ../../howto/regex.rst:774 +msgid "" +">>> p = re.compile('\\bclass\\b')\n" +">>> print(p.search('no class at all'))\n" +"None\n" +">>> print(p.search('\\b' + 'class' + '\\b'))\n" +"" +msgstr "" +">>> p = re.compile('\\bclass\\b')\n" +">>> print(p.search('no class at all'))\n" +"None\n" +">>> print(p.search('\\b' + 'class' + '\\b'))\n" +"" + +#: ../../howto/regex.rst:780 +msgid "" +"Second, inside a character class, where there's no use for this assertion, " +"``\\b`` represents the backspace character, for compatibility with Python's " +"string literals." +msgstr "其次,在一个字符类中,这个断言没有用处,``\\b`` 表示退格字符,以便与 Python 的字符串文字兼容。" + +#: ../../howto/regex.rst:784 +msgid "``\\B``" +msgstr "``\\B``" + +#: ../../howto/regex.rst:785 +msgid "" +"Another zero-width assertion, this is the opposite of ``\\b``, only matching" +" when the current position is not at a word boundary." +msgstr "另一个零宽度断言,这与 ``\\b`` 相反,仅在当前位置不在字边界时才匹配。" + +#: ../../howto/regex.rst:790 +msgid "Grouping" +msgstr "分组" + +#: ../../howto/regex.rst:792 +msgid "" +"Frequently you need to obtain more information than just whether the RE " +"matched or not. Regular expressions are often used to dissect strings by " +"writing a RE divided into several subgroups which match different components" +" of interest. For example, an RFC-822 header line is divided into a header " +"name and a value, separated by a ``':'``, like this:" +msgstr "" +"通常,你需要获取更多信息,而不仅仅是正则是否匹配。正则表达式通常用于通过将正则分成几个子组来解析字符串,这些子组匹配不同的感兴趣组件。 " +"例如,RFC-822 标题行分为标题名称和值,用 ``':'`` 分隔,如下所示:" + +#: ../../howto/regex.rst:798 +msgid "" +"From: author@example.com\n" +"User-Agent: Thunderbird 1.5.0.9 (X11/20061227)\n" +"MIME-Version: 1.0\n" +"To: editor@example.com" +msgstr "" +"From: author@example.com\n" +"User-Agent: Thunderbird 1.5.0.9 (X11/20061227)\n" +"MIME-Version: 1.0\n" +"To: editor@example.com" + +#: ../../howto/regex.rst:805 +msgid "" +"This can be handled by writing a regular expression which matches an entire " +"header line, and has one group which matches the header name, and another " +"group which matches the header's value." +msgstr "这可以通过编写与整个标题行匹配的正则表达式来处理,并且具有与标题名称匹配的一个组,以及与标题的值匹配的另一个组。" + +#: ../../howto/regex.rst:809 +msgid "" +"Groups are marked by the ``'('``, ``')'`` metacharacters. ``'('`` and " +"``')'`` have much the same meaning as they do in mathematical expressions; " +"they group together the expressions contained inside them, and you can " +"repeat the contents of a group with a quantifier, such as ``*``, ``+``, " +"``?``, or ``{m,n}``. For example, ``(ab)*`` will match zero or more " +"repetitions of ``ab``. ::" +msgstr "" +"分组是用 ``'('``, ``')'`` 元字符来标记的。``'('`` 和 ``')'`` " +"与它们在数学表达式中的含义基本一致;它们会将所包含的表达式合为一组,并且你可以使用限定符例如 ``*``, ``+``, ``?``, 或 " +"``{m,n}`` 来重复一个分组的内容。举例来说,``(ab)*`` 将匹配 ``ab`` 的零次或多次重复。 ::" + +#: ../../howto/regex.rst:816 +msgid "" +">>> p = re.compile('(ab)*')\n" +">>> print(p.search('ababababab').span())\n" +"(0, 10)" +msgstr "" + +#: ../../howto/regex.rst:820 +msgid "" +"Groups indicated with ``'('``, ``')'`` also capture the starting and ending " +"index of the text that they match; this can be retrieved by passing an " +"argument to :meth:`~re.Match.group`, :meth:`~re.Match.start`, " +":meth:`~re.Match.end`, and :meth:`~re.Match.span`. Groups are numbered " +"starting with 0. Group 0 is always present; it's the whole RE, so " +":ref:`match object ` methods all have group 0 as their " +"default argument. Later we'll see how to express groups that don't capture " +"the span of text that they match. ::" +msgstr "" +"用 ``'('``,``')'`` 表示的组也捕获它们匹配的文本的起始和结束索引;这可以通过将参数传递给 " +":meth:`~re.Match.group`、:meth:`~re.Match.start`、:meth:`~re.Match.end` 以及 " +":meth:`~re.Match.span`。组从 0 开始编号。组 0 始终存在;它表示整个正则,所以 :ref:`匹配对象 ` 方法都将组 0 作为默认参数。稍后我们将看到如何表达不捕获它们匹配的文本范围的组。::" + +#: ../../howto/regex.rst:829 +msgid "" +">>> p = re.compile('(a)b')\n" +">>> m = p.search('ab')\n" +">>> m.group()\n" +"'ab'\n" +">>> m.group(0)\n" +"'ab'" +msgstr "" + +#: ../../howto/regex.rst:836 +msgid "" +"Subgroups are numbered from left to right, from 1 upward. Groups can be " +"nested; to determine the number, just count the opening parenthesis " +"characters, going from left to right. ::" +msgstr "子组从左到右编号,从 1 向上编号。组可以嵌套;要确定编号,只需计算从左到右的左括号字符。::" + +#: ../../howto/regex.rst:840 +msgid "" +">>> p = re.compile('(a(b)c)d')\n" +">>> m = p.search('abcd')\n" +">>> m.group(0)\n" +"'abcd'\n" +">>> m.group(1)\n" +"'abc'\n" +">>> m.group(2)\n" +"'b'" +msgstr "" + +#: ../../howto/regex.rst:849 +msgid "" +":meth:`~re.Match.group` can be passed multiple group numbers at a time, in " +"which case it will return a tuple containing the corresponding values for " +"those groups. ::" +msgstr ":meth:`~re.Match.group` 可以一次传递多个组号,在这种情况下,它将返回一个包含这些组的相应值的元组。::" + +#: ../../howto/regex.rst:852 +msgid "" +">>> m.group(2,1,2)\n" +"('b', 'abc', 'b')" +msgstr "" +">>> m.group(2,1,2)\n" +"('b', 'abc', 'b')" + +#: ../../howto/regex.rst:855 +msgid "" +"The :meth:`~re.Match.groups` method returns a tuple containing the strings " +"for all the subgroups, from 1 up to however many there are. ::" +msgstr ":meth:`~re.Match.groups` 方法返回一个元组,其中包含所有子组的字符串,从 1 到最后一个子组。::" + +#: ../../howto/regex.rst:858 +msgid "" +">>> m.groups()\n" +"('abc', 'b')" +msgstr "" +">>> m.groups()\n" +"('abc', 'b')" + +#: ../../howto/regex.rst:861 +msgid "" +"Backreferences in a pattern allow you to specify that the contents of an " +"earlier capturing group must also be found at the current location in the " +"string. For example, ``\\1`` will succeed if the exact contents of group 1 " +"can be found at the current position, and fails otherwise. Remember that " +"Python's string literals also use a backslash followed by numbers to allow " +"including arbitrary characters in a string, so be sure to use a raw string " +"when incorporating backreferences in a RE." +msgstr "" +"模式中的后向引用允许你指定还必须在字符串中的当前位置找到先前捕获组的内容。例如,如果可以在当前位置找到组 1 的确切内容,则 ``\\1`` " +"将成功,否则将失败。请记住,Python 的字符串文字也使用反斜杠后跟数字以允许在字符串中包含任意字符,因此正则中引入反向引用时务必使用原始字符串。" + +#: ../../howto/regex.rst:869 +msgid "For example, the following RE detects doubled words in a string. ::" +msgstr "例如,以下正则检测字符串中重复的单词。::" + +#: ../../howto/regex.rst:871 +msgid "" +">>> p = re.compile(r'\\b(\\w+)\\s+\\1\\b')\n" +">>> p.search('Paris in the the spring').group()\n" +"'the the'" +msgstr "" +">>> p = re.compile(r'\\b(\\w+)\\s+\\1\\b')\n" +">>> p.search('Paris in the the spring').group()\n" +"'the the'" + +#: ../../howto/regex.rst:875 +msgid "" +"Backreferences like this aren't often useful for just searching through a " +"string --- there are few text formats which repeat data in this way --- but " +"you'll soon find out that they're *very* useful when performing string " +"substitutions." +msgstr "" +"像这样的后向引用通常不仅仅用于搜索字符串 —— 很少有文本格式以这种方式重复数据 —— 但是你很快就会发现它们在执行字符串替换时 *非常* 有用。" + +#: ../../howto/regex.rst:881 +msgid "Non-capturing and named groups" +msgstr "非捕获和命名分组" + +#: ../../howto/regex.rst:883 +msgid "" +"Elaborate REs may use many groups, both to capture substrings of interest, " +"and to group and structure the RE itself. In complex REs, it becomes " +"difficult to keep track of the group numbers. There are two features which " +"help with this problem. Both of them use a common syntax for regular " +"expression extensions, so we'll look at that first." +msgstr "" +"精心设计的正则可以使用许多组,既可以捕获感兴趣的子串,也可以对正则本身进行分组和构建。在复杂的正则中,很难跟踪组号。有两个功能可以帮助解决这个问题。 " +"它们都使用常用语法进行正则表达式扩展,因此我们首先看一下。" + +#: ../../howto/regex.rst:889 +msgid "" +"Perl 5 is well known for its powerful additions to standard regular " +"expressions. For these new features the Perl developers couldn't choose new " +"single-keystroke metacharacters or new special sequences beginning with " +"``\\`` without making Perl's regular expressions confusingly different from " +"standard REs. If they chose ``&`` as a new metacharacter, for example, old " +"expressions would be assuming that ``&`` was a regular character and " +"wouldn't have escaped it by writing ``\\&`` or ``[&]``." +msgstr "" +"Perl 5 以其对标准正则表达式的强大补充而闻名。对于这些新功能,Perl 开发人员无法选择新的单键击元字符或以 ``\\`` 开头的新特殊序列,否则" +" Perl 的正则表达式与标准正则容易混淆。例如,如果他们选择 ``&`` 作为一个新的元字符,旧的表达式将假设 ``&`` " +"是一个普通字符,并且不会编写 ``\\&`` 或 ``[&]``。" + +#: ../../howto/regex.rst:896 +msgid "" +"The solution chosen by the Perl developers was to use ``(?...)`` as the " +"extension syntax. ``?`` immediately after a parenthesis was a syntax error " +"because the ``?`` would have nothing to repeat, so this didn't introduce any" +" compatibility problems. The characters immediately after the ``?`` " +"indicate what extension is being used, so ``(?=foo)`` is one thing (a " +"positive lookahead assertion) and ``(?:foo)`` is something else (a non-" +"capturing group containing the subexpression ``foo``)." +msgstr "" +"Perl 开发人员选择的解决方案是使用 ``(?...)`` 作为扩展语法。括号后面紧跟 ``?`` 是一个语法错误,因为 ``?`` " +"没有什么可重复的,所以这样并不会带来任何兼容性问题。紧跟在 ``?`` 之后的字符表示正在使用的扩展语法,所以 ``(?=foo)`` " +"是一种语法(一个肯定型前视断言),而 ``(?:foo)`` 是另一种语法(包含子表达式 ``foo`` 的非捕获组)。" + +#: ../../howto/regex.rst:904 +msgid "" +"Python supports several of Perl's extensions and adds an extension syntax to" +" Perl's extension syntax. If the first character after the question mark is" +" a ``P``, you know that it's an extension that's specific to Python." +msgstr "" +"Python 支持一些 Perl 的扩展,并增加了新的扩展语法用于 Perl 的扩展语法。如果在问号之后的第一个字符为 ``P``,即表明其为 " +"Python 专属的扩展。" + +#: ../../howto/regex.rst:909 +msgid "" +"Now that we've looked at the general extension syntax, we can return to the " +"features that simplify working with groups in complex REs." +msgstr "现在我们已经了解了一般的扩展语法,我们可以回到简化复杂正则中组处理的功能。" + +#: ../../howto/regex.rst:912 +msgid "" +"Sometimes you'll want to use a group to denote a part of a regular " +"expression, but aren't interested in retrieving the group's contents. You " +"can make this fact explicit by using a non-capturing group: ``(?:...)``, " +"where you can replace the ``...`` with any other regular expression. ::" +msgstr "" +"有时你会想要使用组来表示正则表达式的一部分,但是对检索组的内容不感兴趣。 你可以通过使用非捕获组来显式表达这个事实: " +"``(?:...)``,你可以用任何其他正则表达式替换 ``...``。::" + +#: ../../howto/regex.rst:917 +msgid "" +">>> m = re.search(\"([abc])+\", \"abc\")\n" +">>> m.groups()\n" +"('c',)\n" +">>> m = re.search(\"(?:[abc])+\", \"abc\")\n" +">>> m.groups()\n" +"()" +msgstr "" + +#: ../../howto/regex.rst:924 +msgid "" +"Except for the fact that you can't retrieve the contents of what the group " +"matched, a non-capturing group behaves exactly the same as a capturing " +"group; you can put anything inside it, repeat it with a repetition " +"metacharacter such as ``*``, and nest it within other groups (capturing or " +"non-capturing). ``(?:...)`` is particularly useful when modifying an " +"existing pattern, since you can add new groups without changing how all the " +"other groups are numbered. It should be mentioned that there's no " +"performance difference in searching between capturing and non-capturing " +"groups; neither form is any faster than the other." +msgstr "" +"除了你无法检索组匹配内容的事实外,非捕获组的行为与捕获组完全相同;你可以在里面放任何东西,用重复元字符重复它,比如 " +"``*``,然后把它嵌入其他组(捕获或不捕获)。``(?:...)`` 在修改现有模式时特别有用,因为你可以添加新组而不更改所有其他组的编号方式。 " +"值得一提的是,捕获和非捕获组之间的搜索没有性能差异;两种形式没有一种更快。" + +#: ../../howto/regex.rst:933 +msgid "" +"A more significant feature is named groups: instead of referring to them by " +"numbers, groups can be referenced by a name." +msgstr "更重要的功能是命名组:不是通过数字引用它们,而是可以通过名称引用组。" + +#: ../../howto/regex.rst:936 +msgid "" +"The syntax for a named group is one of the Python-specific extensions: " +"``(?P...)``. *name* is, obviously, the name of the group. Named " +"groups behave exactly like capturing groups, and additionally associate a " +"name with a group. The :ref:`match object ` methods that " +"deal with capturing groups all accept either integers that refer to the " +"group by number or strings that contain the desired group's name. Named " +"groups are still given numbers, so you can retrieve information about a " +"group in two ways::" +msgstr "" +"命名组的语法是 Python 特定的扩展之一: ``(?P...)``。 *name* 显然是该组的名称。 " +"命名组的行为与捕获组完全相同,并且还将名称与组关联。 处理捕获组的 :ref:`匹配对象 ` " +"方法都接受按编号引用组的整数或包含所需组名的字符串。 命名组仍然是给定的数字,因此你可以通过两种方式检索有关组的信息::" + +#: ../../howto/regex.rst:944 +msgid "" +">>> p = re.compile(r'(?P\\b\\w+\\b)')\n" +">>> m = p.search( '(((( Lots of punctuation )))' )\n" +">>> m.group('word')\n" +"'Lots'\n" +">>> m.group(1)\n" +"'Lots'" +msgstr "" +">>> p = re.compile(r'(?P\\b\\w+\\b)')\n" +">>> m = p.search( '(((( Lots of punctuation )))' )\n" +">>> m.group('word')\n" +"'Lots'\n" +">>> m.group(1)\n" +"'Lots'" + +#: ../../howto/regex.rst:951 +msgid "" +"Additionally, you can retrieve named groups as a dictionary with " +":meth:`~re.Match.groupdict`::" +msgstr "此外,你可以通过 :meth:`~re.Match.groupdict` 将命名分组提取为一个字典::" + +#: ../../howto/regex.rst:954 +msgid "" +">>> m = re.search(r'(?P\\w+) (?P\\w+)', 'Jane Doe')\n" +">>> m.groupdict()\n" +"{'first': 'Jane', 'last': 'Doe'}" +msgstr "" + +#: ../../howto/regex.rst:958 +msgid "" +"Named groups are handy because they let you use easily remembered names, " +"instead of having to remember numbers. Here's an example RE from the " +":mod:`imaplib` module::" +msgstr "命名分组很方便因为它们让你可以使用容易记忆的名称,而不必记忆数字。下面是一个来自 :mod:`imaplib` 模块的正则表达式示例::" + +#: ../../howto/regex.rst:962 +msgid "" +"InternalDate = re.compile(r'INTERNALDATE \"'\n" +" r'(?P[ 123][0-9])-(?P[A-Z][a-z][a-z])-'\n" +" r'(?P[0-9][0-9][0-9][0-9])'\n" +" r' (?P[0-9][0-9]):(?P[0-9][0-9]):(?P[0-9][0-9])'\n" +" r' (?P[-+])(?P[0-9][0-9])(?P[0-9][0-9])'\n" +" r'\"')" +msgstr "" +"InternalDate = re.compile(r'INTERNALDATE \"'\n" +" r'(?P[ 123][0-9])-(?P[A-Z][a-z][a-z])-'\n" +" r'(?P[0-9][0-9][0-9][0-9])'\n" +" r' (?P[0-9][0-9]):(?P[0-9][0-9]):(?P[0-9][0-9])'\n" +" r' (?P[-+])(?P[0-9][0-9])(?P[0-9][0-9])'\n" +" r'\"')" + +#: ../../howto/regex.rst:969 +msgid "" +"It's obviously much easier to retrieve ``m.group('zonem')``, instead of " +"having to remember to retrieve group 9." +msgstr "检索 ``m.group('zonem')`` 显然要容易得多,而不必记住检索第 9 组。" + +#: ../../howto/regex.rst:972 +msgid "" +"The syntax for backreferences in an expression such as ``(...)\\1`` refers " +"to the number of the group. There's naturally a variant that uses the group" +" name instead of the number. This is another Python extension: ``(?P=name)``" +" indicates that the contents of the group called *name* should again be " +"matched at the current point. The regular expression for finding doubled " +"words, ``\\b(\\w+)\\s+\\1\\b`` can also be written as " +"``\\b(?P\\w+)\\s+(?P=word)\\b``::" +msgstr "" +"表达式中的后向引用语法,例如 ``(...)\\1``,指的是组的编号。 当然有一种变体使用组名而不是数字。 这是另一个 Python 扩展: " +"``(?P=name)`` 表示在当前点再次匹配名为 *name* 的组的内容。 " +"用于查找重复单词的正则表达式,``\\b(\\w+)\\s+\\1\\b`` 也可以写为 " +"``\\b(?P\\w+)\\s+(?P=word)\\b``::" + +#: ../../howto/regex.rst:979 +msgid "" +">>> p = re.compile(r'\\b(?P\\w+)\\s+(?P=word)\\b')\n" +">>> p.search('Paris in the the spring').group()\n" +"'the the'" +msgstr "" +">>> p = re.compile(r'\\b(?P\\w+)\\s+(?P=word)\\b')\n" +">>> p.search('Paris in the the spring').group()\n" +"'the the'" + +#: ../../howto/regex.rst:985 +msgid "Lookahead assertions" +msgstr "前视断言" + +#: ../../howto/regex.rst:987 +msgid "" +"Another zero-width assertion is the lookahead assertion. Lookahead " +"assertions are available in both positive and negative form, and look like " +"this:" +msgstr "另一个零宽断言是前视断言。前视断言有肯定型和否定型两种形式,如下所示:" + +#: ../../howto/regex.rst:990 +msgid "``(?=...)``" +msgstr "``(?=…)``" + +#: ../../howto/regex.rst:991 +msgid "" +"Positive lookahead assertion. This succeeds if the contained regular " +"expression, represented here by ``...``, successfully matches at the current" +" location, and fails otherwise. But, once the contained expression has been " +"tried, the matching engine doesn't advance at all; the rest of the pattern " +"is tried right where the assertion started." +msgstr "" +"肯定型前视断言。如果内部的表达式(这里用 ``...`` 来表示)在当前位置可以匹配,则匹配成功,否则匹配失败。 " +"但是,内部表达式尝试匹配之后,正则引擎并不会向前推进;正则表达式的其余部分依然会在断言开始的地方尝试匹配。" + +#: ../../howto/regex.rst:997 +msgid "``(?!...)``" +msgstr "``(?!…)``" + +#: ../../howto/regex.rst:998 +msgid "" +"Negative lookahead assertion. This is the opposite of the positive " +"assertion; it succeeds if the contained expression *doesn't* match at the " +"current position in the string." +msgstr "否定型前视断言。与肯定型断言正好相反,如果内部表达式在字符串中的当前位置 **不** 匹配,则成功。" + +#: ../../howto/regex.rst:1002 +msgid "" +"To make this concrete, let's look at a case where a lookahead is useful. " +"Consider a simple pattern to match a filename and split it apart into a base" +" name and an extension, separated by a ``.``. For example, in ``news.rc``, " +"``news`` is the base name, and ``rc`` is the filename's extension." +msgstr "" +"更具体一些,来看一个前视的实用案例。考虑用一个简单的表达式来匹配文件名并将其拆分为基本名称和扩展名,以 ``.`` 分隔。例如,在 " +"``news.rc`` 中,``news`` 是基本名称,``rc`` 是文件名的扩展名。" + +#: ../../howto/regex.rst:1007 +msgid "The pattern to match this is quite simple:" +msgstr "与此匹配的模式非常简单:" + +#: ../../howto/regex.rst:1009 +msgid "``.*[.].*$``" +msgstr "``.*[.].*$``" + +#: ../../howto/regex.rst:1011 +msgid "" +"Notice that the ``.`` needs to be treated specially because it's a " +"metacharacter, so it's inside a character class to only match that specific " +"character. Also notice the trailing ``$``; this is added to ensure that all" +" the rest of the string must be included in the extension. This regular " +"expression matches ``foo.bar`` and ``autoexec.bat`` and ``sendmail.cf`` and " +"``printers.conf``." +msgstr "" +"请注意,``.`` 需要特别处理,因为它是元字符,所以它在字符类中只能匹配特定字符。还要注意尾随的 " +"``$``;添加此项以确保扩展名中的所有其余字符串都必须包含在扩展名中。这个正则表达式匹配 " +"``foo.bar``、``autoexec.bat``、``sendmail.cf`` 和 ``printers.conf``。" + +#: ../../howto/regex.rst:1018 +msgid "" +"Now, consider complicating the problem a bit; what if you want to match " +"filenames where the extension is not ``bat``? Some incorrect attempts:" +msgstr "现在,考虑使更复杂一点的问题;如果你想匹配扩展名不是 ``bat`` 的文件名怎么办?一些错误的尝试:" + +#: ../../howto/regex.rst:1021 +msgid "``.*[.][^b].*$``" +msgstr "``.*[.][^b].*$``" + +#: ../../howto/regex.rst:1023 +msgid "" +"The first attempt above tries to exclude ``bat`` by requiring that the first" +" character of the extension is not a ``b``. This is wrong, because the " +"pattern also doesn't match ``foo.bar``." +msgstr "" +"上面的第一次尝试将通过要求扩展的第一个字符不为 ``b`` 来排除 ``bat``。这是错误的,因为该模式同样不能匹配 ``foo.bar``。" + +#: ../../howto/regex.rst:1027 +msgid "``.*[.]([^b]..|.[^a].|..[^t])$``" +msgstr "``.*[.]([^b]..|.[^a].|..[^t])$``" + +#: ../../howto/regex.rst:1029 +msgid "" +"The expression gets messier when you try to patch up the first solution by " +"requiring one of the following cases to match: the first character of the " +"extension isn't ``b``; the second character isn't ``a``; or the third " +"character isn't ``t``. This accepts ``foo.bar`` and rejects " +"``autoexec.bat``, but it requires a three-letter extension and won't accept " +"a filename with a two-letter extension such as ``sendmail.cf``. We'll " +"complicate the pattern again in an effort to fix it." +msgstr "" +"当你尝试通过要求以下一种情况匹配来修补第一个解决方案时,表达式变得更加混乱:扩展的第一个字符不是 ``b``;第二个字符不是 " +"``a``;或者第三个字符不是 ``t``。这接受 ``foo.bar`` 并拒绝 " +"``autoexec.bat``,但它需要三个字母的扩展名,并且不接受带有两个字母扩展名的文件名,例如 ``sendmail.cf``。 " +"为了解决这个问题,我们会再次使模式复杂化。" + +#: ../../howto/regex.rst:1037 +msgid "``.*[.]([^b].?.?|.[^a]?.?|..?[^t]?)$``" +msgstr "``.*[.]([^b].?.?|.[^a]?.?|..?[^t]?)$``" + +#: ../../howto/regex.rst:1039 +msgid "" +"In the third attempt, the second and third letters are all made optional in " +"order to allow matching extensions shorter than three characters, such as " +"``sendmail.cf``." +msgstr "在第三次尝试中,第二个和第三个字母都是可选的,以便允许匹配的扩展名短于三个字符,例如 ``sendmail.cf``。" + +#: ../../howto/regex.rst:1043 +msgid "" +"The pattern's getting really complicated now, which makes it hard to read " +"and understand. Worse, if the problem changes and you want to exclude both " +"``bat`` and ``exe`` as extensions, the pattern would get even more " +"complicated and confusing." +msgstr "" +"模式现在变得非常复杂,这使得它难以阅读和理解。更糟糕的是,如果问题发生变化并且你想要将 ``bat`` 和 ``exe`` " +"排除为扩展,那么该模式将变得更加复杂和混乱。" + +#: ../../howto/regex.rst:1048 +msgid "A negative lookahead cuts through all this confusion:" +msgstr "否定型前视可以解决所有这些困扰:" + +#: ../../howto/regex.rst:1050 +msgid "``.*[.](?!bat$)[^.]*$``" +msgstr "``.*[.](?!bat$)[^.]*$``" + +#: ../../howto/regex.rst:1052 +msgid "" +"The negative lookahead means: if the expression ``bat`` doesn't match at " +"this point, try the rest of the pattern; if ``bat$`` does match, the whole " +"pattern will fail. The trailing ``$`` is required to ensure that something " +"like ``sample.batch``, where the extension only starts with ``bat``, will be" +" allowed. The ``[^.]*`` makes sure that the pattern works when there are " +"multiple dots in the filename." +msgstr "" +"否定前视意味着:如果表达式 ``bat`` 在这个点位不匹配,则尝试模式的其余部分;如果 ``bat$`` 匹配,整个模式将匹配失败。需要有末尾的 " +"``$`` 来确保 ``sample.batch`` 这样的内容,其中扩展名只能以 ``bat`` 开头,将被允许。``[^.]*`` " +"将确保当文件名中有多个点号时该模式仍能正常工作。" + +#: ../../howto/regex.rst:1059 +msgid "" +"Excluding another filename extension is now easy; simply add it as an " +"alternative inside the assertion. The following pattern excludes filenames " +"that end in either ``bat`` or ``exe``:" +msgstr "现在很容易排除另一个文件扩展名;只需在断言中添加它作为替代。以下模式排除以 ``bat`` 或 ``exe`` 结尾的文件名:" + +#: ../../howto/regex.rst:1063 +msgid "``.*[.](?!bat$|exe$)[^.]*$``" +msgstr "``.*[.](?!bat$|exe$)[^.]*$``" + +#: ../../howto/regex.rst:1067 +msgid "Modifying strings" +msgstr "修改字符串" + +#: ../../howto/regex.rst:1069 +msgid "" +"Up to this point, we've simply performed searches against a static string. " +"Regular expressions are also commonly used to modify strings in various " +"ways, using the following pattern methods:" +msgstr "到目前为止,我们只是针对静态字符串执行搜索。正则表达式通常也用于以各种方式修改字符串,使用以下模式方法:" + +#: ../../howto/regex.rst:1076 +msgid "``split()``" +msgstr "``split()``" + +#: ../../howto/regex.rst:1076 +msgid "Split the string into a list, splitting it wherever the RE matches" +msgstr "将字符串拆分为一个列表,在正则匹配的任何地方将其拆分" + +#: ../../howto/regex.rst:1079 +msgid "``sub()``" +msgstr "``sub()``" + +#: ../../howto/regex.rst:1079 +msgid "" +"Find all substrings where the RE matches, and replace them with a different " +"string" +msgstr "找到正则匹配的所有子字符串,并用不同的字符串替换它们" + +#: ../../howto/regex.rst:1082 +msgid "``subn()``" +msgstr "``subn()``" + +#: ../../howto/regex.rst:1082 +msgid "" +"Does the same thing as :meth:`!sub`, but returns the new string and the " +"number of replacements" +msgstr "与 :meth:`!sub` 相同,但返回新字符串和替换次数" + +#: ../../howto/regex.rst:1089 +msgid "Splitting strings" +msgstr "" + +#: ../../howto/regex.rst:1091 +msgid "" +"The :meth:`~re.Pattern.split` method of a pattern splits a string apart " +"wherever the RE matches, returning a list of the pieces. It's similar to the" +" :meth:`~str.split` method of strings but provides much more generality in " +"the delimiters that you can split by; string :meth:`!split` only supports " +"splitting by whitespace or by a fixed string. As you'd expect, there's a " +"module-level :func:`re.split` function, too." +msgstr "" +"模式的 :meth:`~re.Pattern.split` 方法在正则匹配的任何地方拆分字符串,返回一个片段列表。它类似于 " +":meth:`~str.split` 字符串方法,但在可用的分隔符方面提供了更多的通用性;字符串的 :meth:`!split` " +"仅支持按空格或固定字符串进行拆分。正如你所期望的那样,还有一个模块级 :func:`re.split` 函数。" + +#: ../../howto/regex.rst:1102 +msgid "" +"Split *string* by the matches of the regular expression. If capturing " +"parentheses are used in the RE, then their contents will also be returned as" +" part of the resulting list. If *maxsplit* is nonzero, at most *maxsplit* " +"splits are performed." +msgstr "" +"通过正则表达式的匹配拆分 *字符串*。如果在正则中使用捕获括号,则它们的内容也将作为结果列表的一部分返回。如果 *maxsplit* 非零,则最多执行 " +"*maxsplit* 次拆分。" + +#: ../../howto/regex.rst:1107 +msgid "" +"You can limit the number of splits made, by passing a value for *maxsplit*. " +"When *maxsplit* is nonzero, at most *maxsplit* splits will be made, and the " +"remainder of the string is returned as the final element of the list. In " +"the following example, the delimiter is any sequence of non-alphanumeric " +"characters. ::" +msgstr "" +"你可以通过传递 *maxsplit* 的值来限制分割的数量。当 *maxsplit* 非零时,将最多进行 *maxsplit* " +"次拆分,并且字符串的其余部分将作为列表的最后一个元素返回。在以下示例中,分隔符是任何非字母数字字符序列。::" + +#: ../../howto/regex.rst:1113 +msgid "" +">>> p = re.compile(r'\\W+')\n" +">>> p.split('This is a test, short and sweet, of split().')\n" +"['This', 'is', 'a', 'test', 'short', 'and', 'sweet', 'of', 'split', '']\n" +">>> p.split('This is a test, short and sweet, of split().', 3)\n" +"['This', 'is', 'a', 'test, short and sweet, of split().']" +msgstr "" +">>> p = re.compile(r'\\W+')\n" +">>> p.split('This is a test, short and sweet, of split().')\n" +"['This', 'is', 'a', 'test', 'short', 'and', 'sweet', 'of', 'split', '']\n" +">>> p.split('This is a test, short and sweet, of split().', 3)\n" +"['This', 'is', 'a', 'test, short and sweet, of split().']" + +#: ../../howto/regex.rst:1119 +msgid "" +"Sometimes you're not only interested in what the text between delimiters is," +" but also need to know what the delimiter was. If capturing parentheses are" +" used in the RE, then their values are also returned as part of the list. " +"Compare the following calls::" +msgstr "" +"有时你不仅对分隔符之间的文本感兴趣,而且还需要知道分隔符是什么。如果在正则中使用捕获括号,则它们的值也将作为列表的一部分返回。比较以下调用::" + +#: ../../howto/regex.rst:1124 +msgid "" +">>> p = re.compile(r'\\W+')\n" +">>> p2 = re.compile(r'(\\W+)')\n" +">>> p.split('This... is a test.')\n" +"['This', 'is', 'a', 'test', '']\n" +">>> p2.split('This... is a test.')\n" +"['This', '... ', 'is', ' ', 'a', ' ', 'test', '.', '']" +msgstr "" +">>> p = re.compile(r'\\W+')\n" +">>> p2 = re.compile(r'(\\W+)')\n" +">>> p.split('This... is a test.')\n" +"['This', 'is', 'a', 'test', '']\n" +">>> p2.split('This... is a test.')\n" +"['This', '... ', 'is', ' ', 'a', ' ', 'test', '.', '']" + +#: ../../howto/regex.rst:1131 +msgid "" +"The module-level function :func:`re.split` adds the RE to be used as the " +"first argument, but is otherwise the same. ::" +msgstr "模块级函数 :func:`re.split` 将正则作为第一个参数添加,但在其他方面是相同的。::" + +#: ../../howto/regex.rst:1134 +msgid "" +">>> re.split(r'[\\W]+', 'Words, words, words.')\n" +"['Words', 'words', 'words', '']\n" +">>> re.split(r'([\\W]+)', 'Words, words, words.')\n" +"['Words', ', ', 'words', ', ', 'words', '.', '']\n" +">>> re.split(r'[\\W]+', 'Words, words, words.', 1)\n" +"['Words', 'words, words.']" +msgstr "" +">>> re.split(r'[\\W]+', 'Words, words, words.')\n" +"['Words', 'words', 'words', '']\n" +">>> re.split(r'([\\W]+)', 'Words, words, words.')\n" +"['Words', ', ', 'words', ', ', 'words', '.', '']\n" +">>> re.split(r'[\\W]+', 'Words, words, words.', 1)\n" +"['Words', 'words, words.']" + +#: ../../howto/regex.rst:1143 +msgid "Search and replace" +msgstr "" + +#: ../../howto/regex.rst:1145 +msgid "" +"Another common task is to find all the matches for a pattern, and replace " +"them with a different string. The :meth:`~re.Pattern.sub` method takes a " +"replacement value, which can be either a string or a function, and the " +"string to be processed." +msgstr "" +"另一个常见任务是找到模式的所有匹配项,并用不同的字符串替换它们。 :meth:`~re.Pattern.sub` " +"方法接受一个替换值(可以是字符串或函数)以及要处理的字符串。" + +#: ../../howto/regex.rst:1152 +msgid "" +"Returns the string obtained by replacing the leftmost non-overlapping " +"occurrences of the RE in *string* by the replacement *replacement*. If the " +"pattern isn't found, *string* is returned unchanged." +msgstr "" +"返回通过替换 *replacement* 替换 *string* 中正则的最左边非重叠出现而获得的字符串。如果未找到模式,则 *string* " +"将保持不变。" + +#: ../../howto/regex.rst:1156 +msgid "" +"The optional argument *count* is the maximum number of pattern occurrences " +"to be replaced; *count* must be a non-negative integer. The default value " +"of 0 means to replace all occurrences." +msgstr "可选参数 *count* 是要替换的模式最大的出现次数;*count* 必须是非负整数。默认值 0 表示替换所有。" + +#: ../../howto/regex.rst:1160 +msgid "" +"Here's a simple example of using the :meth:`~re.Pattern.sub` method. It " +"replaces colour names with the word ``colour``::" +msgstr "这是一个使用 :meth:`~re.Pattern.sub` 方法的简单示例。它用 ``colour`` 这个词取代颜色名称::" + +#: ../../howto/regex.rst:1163 +msgid "" +">>> p = re.compile('(blue|white|red)')\n" +">>> p.sub('colour', 'blue socks and red shoes')\n" +"'colour socks and colour shoes'\n" +">>> p.sub('colour', 'blue socks and red shoes', count=1)\n" +"'colour socks and red shoes'" +msgstr "" +">>> p = re.compile('(blue|white|red)')\n" +">>> p.sub('colour', 'blue socks and red shoes')\n" +"'colour socks and colour shoes'\n" +">>> p.sub('colour', 'blue socks and red shoes', count=1)\n" +"'colour socks and red shoes'" + +#: ../../howto/regex.rst:1169 +msgid "" +"The :meth:`~re.Pattern.subn` method does the same work, but returns a " +"2-tuple containing the new string value and the number of replacements that" +" were performed::" +msgstr ":meth:`~re.Pattern.subn` 方法完成相同的工作,但返回一个包含新字符串值和已执行的替换次数的 2 元组::" + +#: ../../howto/regex.rst:1172 +msgid "" +">>> p = re.compile('(blue|white|red)')\n" +">>> p.subn('colour', 'blue socks and red shoes')\n" +"('colour socks and colour shoes', 2)\n" +">>> p.subn('colour', 'no colours at all')\n" +"('no colours at all', 0)" +msgstr "" +">>> p = re.compile('(blue|white|red)')\n" +">>> p.subn('colour', 'blue socks and red shoes')\n" +"('colour socks and colour shoes', 2)\n" +">>> p.subn('colour', 'no colours at all')\n" +"('no colours at all', 0)" + +#: ../../howto/regex.rst:1178 +msgid "" +"Empty matches are replaced only when they're not adjacent to a previous " +"empty match. ::" +msgstr "仅当空匹配与前一个空匹配不相邻时,才会替换空匹配。::" + +#: ../../howto/regex.rst:1181 +msgid "" +">>> p = re.compile('x*')\n" +">>> p.sub('-', 'abxd')\n" +"'-a-b--d-'" +msgstr "" +">>> p = re.compile('x*')\n" +">>> p.sub('-', 'abxd')\n" +"'-a-b--d-'" + +#: ../../howto/regex.rst:1185 +msgid "" +"If *replacement* is a string, any backslash escapes in it are processed. " +"That is, ``\\n`` is converted to a single newline character, ``\\r`` is " +"converted to a carriage return, and so forth. Unknown escapes such as " +"``\\&`` are left alone. Backreferences, such as ``\\6``, are replaced with " +"the substring matched by the corresponding group in the RE. This lets you " +"incorporate portions of the original text in the resulting replacement " +"string." +msgstr "" +"如果 *replacement* 是一个字符串,则处理其中的任何反斜杠转义。也就是说,``\\n`` 被转换为单个换行符,``\\r`` " +"被转换为回车符,依此类推。诸如 ``\\&`` 之类的未知转义将保持不变。后向引用,例如 ``\\6``,被替换为正则中相应组匹配的子字符串。 " +"这使你可以在生成的替换字符串中合并原始文本的部分内容。" + +#: ../../howto/regex.rst:1192 +msgid "" +"This example matches the word ``section`` followed by a string enclosed in " +"``{``, ``}``, and changes ``section`` to ``subsection``::" +msgstr "" +"这个例子匹配单词 ``section`` 后跟一个用 ``{``,``}`` 括起来的字符串,并将 ``section`` 改为 " +"``subsection`` ::" + +#: ../../howto/regex.rst:1195 +msgid "" +">>> p = re.compile('section{ ( [^}]* ) }', re.VERBOSE)\n" +">>> p.sub(r'subsection{\\1}','section{First} section{second}')\n" +"'subsection{First} subsection{second}'" +msgstr "" +">>> p = re.compile('section{ ( [^}]* ) }', re.VERBOSE)\n" +">>> p.sub(r'subsection{\\1}','section{First} section{second}')\n" +"'subsection{First} subsection{second}'" + +#: ../../howto/regex.rst:1199 +msgid "" +"There's also a syntax for referring to named groups as defined by the " +"``(?P...)`` syntax. ``\\g`` will use the substring matched by " +"the group named ``name``, and ``\\g`` uses the corresponding group" +" number. ``\\g<2>`` is therefore equivalent to ``\\2``, but isn't ambiguous" +" in a replacement string such as ``\\g<2>0``. (``\\20`` would be " +"interpreted as a reference to group 20, not a reference to group 2 followed " +"by the literal character ``'0'``.) The following substitutions are all " +"equivalent, but use all three variations of the replacement string. ::" +msgstr "" +"还有一种语法用于引用由 ``(?P...)`` 语法定义的命名组。``\\g`` 将使用名为 ``name`` " +"的组匹配的子字符串,``\\g`` 使用相应的组号。因此 ``\\g<2>`` 等同于 ``\\2``,但在诸如 ``\\g<2>0``" +" 之类的替换字符串中并不模糊。 (``\\20`` 将被解释为对组 20 的引用,而不是对组 2 的引用,后跟字面字符 ``'0'``。) " +"以下替换都是等效的,但使用所有三种变体替换字符串。::" + +#: ../../howto/regex.rst:1208 +msgid "" +">>> p = re.compile('section{ (?P [^}]* ) }', re.VERBOSE)\n" +">>> p.sub(r'subsection{\\1}','section{First}')\n" +"'subsection{First}'\n" +">>> p.sub(r'subsection{\\g<1>}','section{First}')\n" +"'subsection{First}'\n" +">>> p.sub(r'subsection{\\g}','section{First}')\n" +"'subsection{First}'" +msgstr "" +">>> p = re.compile('section{ (?P [^}]* ) }', re.VERBOSE)\n" +">>> p.sub(r'subsection{\\1}','section{First}')\n" +"'subsection{First}'\n" +">>> p.sub(r'subsection{\\g<1>}','section{First}')\n" +"'subsection{First}'\n" +">>> p.sub(r'subsection{\\g}','section{First}')\n" +"'subsection{First}'" + +#: ../../howto/regex.rst:1216 +msgid "" +"*replacement* can also be a function, which gives you even more control. If" +" *replacement* is a function, the function is called for every non-" +"overlapping occurrence of *pattern*. On each call, the function is passed a" +" :ref:`match object ` argument for the match and can use this" +" information to compute the desired replacement string and return it." +msgstr "" +"*replacement* 也可以是一个函数,它可以为你提供更多控制。如果 *replacement* 是一个函数,则为 *pattern* " +"的每次非重叠出现将调用该函数。在每次调用时,函数都会传递一个匹配的 :ref:`匹配对象 ` " +"参数,并可以使用此信息计算所需的替换字符串并将其返回。" + +#: ../../howto/regex.rst:1222 +msgid "" +"In the following example, the replacement function translates decimals into " +"hexadecimal::" +msgstr "在以下示例中,替换函数将十进制数转换为十六进制::" + +#: ../../howto/regex.rst:1225 +msgid "" +">>> def hexrepl(match):\n" +"... \"Return the hex string for a decimal number\"\n" +"... value = int(match.group())\n" +"... return hex(value)\n" +"...\n" +">>> p = re.compile(r'\\d+')\n" +">>> p.sub(hexrepl, 'Call 65490 for printing, 49152 for user code.')\n" +"'Call 0xffd2 for printing, 0xc000 for user code.'" +msgstr "" +">>> def hexrepl(match):\n" +"... \"返回十进制数字的十六进制字符串\"\n" +"... value = int(match.group())\n" +"... return hex(value)\n" +"...\n" +">>> p = re.compile(r'\\d+')\n" +">>> p.sub(hexrepl, 'Call 65490 for printing, 49152 for user code.')\n" +"'Call 0xffd2 for printing, 0xc000 for user code.'" + +#: ../../howto/regex.rst:1234 +msgid "" +"When using the module-level :func:`re.sub` function, the pattern is passed " +"as the first argument. The pattern may be provided as an object or as a " +"string; if you need to specify regular expression flags, you must either use" +" a pattern object as the first parameter, or use embedded modifiers in the " +"pattern string, e.g. ``sub(\"(?i)b+\", \"x\", \"bbbb BBBB\")`` returns ``'x " +"x'``." +msgstr "" +"使用模块级别 :func:`re.sub` 函数时,模式作为第一个参数传递。 " +"模式可以是对象或字符串;如果需要指定正则表达式标志,则必须使用模式对象作为第一个参数,或者在模式字符串中使用嵌入式修饰符,例如: " +"``sub(\"(?i)b+\", \"x\", \"bbbb BBBB\")`` 返回 ``'x x'``。" + +#: ../../howto/regex.rst:1242 +msgid "Common problems" +msgstr "" + +#: ../../howto/regex.rst:1244 +msgid "" +"Regular expressions are a powerful tool for some applications, but in some " +"ways their behaviour isn't intuitive and at times they don't behave the way " +"you may expect them to. This section will point out some of the most common" +" pitfalls." +msgstr "" +"正则表达式对于某些应用程序来说是一个强大的工具,但在某些方面,它们的行为并不直观,有时它们的行为方式与你的预期不同。本节将指出一些最常见的陷阱。" + +#: ../../howto/regex.rst:1250 +msgid "Use string methods" +msgstr "" + +#: ../../howto/regex.rst:1252 +msgid "" +"Sometimes using the :mod:`re` module is a mistake. If you're matching a " +"fixed string, or a single character class, and you're not using any " +":mod:`re` features such as the :const:`~re.IGNORECASE` flag, then the full " +"power of regular expressions may not be required. Strings have several " +"methods for performing operations with fixed strings and they're usually " +"much faster, because the implementation is a single small C loop that's been" +" optimized for the purpose, instead of the large, more generalized regular " +"expression engine." +msgstr "" +"有时使用 :mod:`re` 模块是一个错误。如果你匹配固定字符串或单个字符类,并且你没有使用任何 :mod:`re` 功能,例如 " +":const:`~re.IGNORECASE` 标志,那么正则表达式的全部功能可能不是必需的。 " +"字符串有几种方法可以使用固定字符串执行操作,它们通常要快得多,因为实现是一个针对此目的而优化的单个小 C 循环,而不是大型、更通用的正则表达式引擎。" + +#: ../../howto/regex.rst:1260 +msgid "" +"One example might be replacing a single fixed string with another one; for " +"example, you might replace ``word`` with ``deed``. :func:`re.sub` seems " +"like the function to use for this, but consider the :meth:`~str.replace` " +"method. Note that :meth:`!replace` will also replace ``word`` inside words," +" turning ``swordfish`` into ``sdeedfish``, but the naive RE ``word`` would " +"have done that, too. (To avoid performing the substitution on parts of " +"words, the pattern would have to be ``\\bword\\b``, in order to require that" +" ``word`` have a word boundary on either side. This takes the job beyond " +":meth:`!replace`'s abilities.)" +msgstr "" +"一个例子可能是用另一个固定字符串替换一个固定字符串;例如,你可以用 ``deed`` 替换 ``word``。 :func:`re.sub` " +"看起来像是用于此的函数,但请考虑 :meth:`~str.replace` 方法。注意 :meth:`!replace` 也会替换单词里面的 " +"``word``,把 ``swordfish`` 变成 ``sdeedfish``,但简单的正则 ``word`` 也会这样做。 " +"(为了避免对单词的部分进行替换,模式必须是 ``\\bword\\b``,以便要求 ``word`` 在任何一方都有一个单词边界。这使得工作超出了 " +":meth:`!replace` 的能力。)" + +#: ../../howto/regex.rst:1269 +msgid "" +"Another common task is deleting every occurrence of a single character from " +"a string or replacing it with another single character. You might do this " +"with something like ``re.sub('\\n', ' ', S)``, but :meth:`~str.translate` is" +" capable of doing both tasks and will be faster than any regular expression " +"operation can be." +msgstr "" +"另一个常见任务是从字符串中删除单个字符的每个匹配项或将其替换为另一个字符。你可以用 ``re.sub('\\n', ' ', S)`` " +"之类的东西来做这件事,但是 :meth:`~str.translate` 能够完成这两项任务,并且比任何正则表达式都快。" + +#: ../../howto/regex.rst:1275 +msgid "" +"In short, before turning to the :mod:`re` module, consider whether your " +"problem can be solved with a faster and simpler string method." +msgstr "简而言之,在转向 :mod:`re` 模块之前,请考虑是否可以使用更快更简单的字符串方法解决问题。" + +#: ../../howto/regex.rst:1282 +msgid "prefixmatch() (aka match) versus search()" +msgstr "" + +#: ../../howto/regex.rst:1284 +msgid "" +":func:`~re.prefixmatch` was added in Python 3.15 as the :ref:`preferred name" +" ` for :func:`~re.match`. Before this, it was only " +"known as :func:`!match` and the distinction with :func:`~re.search` was " +"often misunderstood." +msgstr "" + +#: ../../howto/regex.rst:1289 +msgid "" +":func:`!prefixmatch` aka :func:`!match` only checks if the RE matches at the" +" beginning of the string while :func:`!search` scans forward through the " +"string for a match. ::" +msgstr "" + +#: ../../howto/regex.rst:1293 +msgid "" +">>> print(re.prefixmatch('super', 'superstition').span())\n" +"(0, 5)\n" +">>> print(re.prefixmatch('super', 'insuperable'))\n" +"None" +msgstr "" + +#: ../../howto/regex.rst:1298 +msgid "" +"On the other hand, :func:`~re.search` scans forward through the string, " +"reporting the first match it finds. ::" +msgstr "" + +#: ../../howto/regex.rst:1301 +msgid "" +">>> print(re.search('super', 'superstition').span())\n" +"(0, 5)\n" +">>> print(re.search('super', 'insuperable').span())\n" +"(2, 7)" +msgstr "" +">>> print(re.search('super', 'superstition').span())\n" +"(0, 5)\n" +">>> print(re.search('super', 'insuperable').span())\n" +"(2, 7)" + +#: ../../howto/regex.rst:1306 +msgid "" +"This distinction is important to remember when using the old " +":func:`~re.match` name in code requiring compatibility with older Python " +"versions." +msgstr "" + +#: ../../howto/regex.rst:1311 +msgid "Greedy versus non-greedy" +msgstr "" + +#: ../../howto/regex.rst:1313 +msgid "" +"When repeating a regular expression, as in ``a*``, the resulting action is " +"to consume as much of the pattern as possible. This fact often bites you " +"when you're trying to match a pair of balanced delimiters, such as the angle" +" brackets surrounding an HTML tag. The naive pattern for matching a single " +"HTML tag doesn't work because of the greedy nature of ``.*``. ::" +msgstr "" +"当重复一个正则表达式时,就像在 ``a*`` 中一样,最终的动作就是消耗尽可能多的模式。当你尝试匹配一对对称分隔符,例如 HTML " +"标记周围的尖括号时,这个事实经常会让你感到困惑。因为 ``.*`` 的贪婪性质,用于匹配单个 HTML 标记的简单模式不起作用。 ::" + +#: ../../howto/regex.rst:1319 +msgid "" +">>> s = 'Title'\n" +">>> len(s)\n" +"32\n" +">>> print(re.prefixmatch('<.*>', s).span())\n" +"(0, 32)\n" +">>> print(re.prefixmatch('<.*>', s).group())\n" +"Title" +msgstr "" + +#: ../../howto/regex.rst:1327 +msgid "" +"The RE matches the ``'<'`` in ``''``, and the ``.*`` consumes the rest" +" of the string. There's still more left in the RE, though, and the ``>`` " +"can't match at the end of the string, so the regular expression engine has " +"to backtrack character by character until it finds a match for the ``>``. " +"The final match extends from the ``'<'`` in ``''`` to the ``'>'`` in " +"``''``, which isn't what you want." +msgstr "" +"正则匹配 ``''`` 中的 ``'<'``,然后 ``.*`` 消耗字符串的其余部分。但正则中还有剩余部分需要匹配,而 ``>`` " +"在字符串的末尾不能匹配,所以正则表达式引擎必须逐个字符地回溯,直到它找到匹配 ``>``。最终匹配从 ``''`` 中的 ``'<'`` " +"扩展到 ``''`` 中的 ``'>'``,而这并不是你想要的结果。" + +#: ../../howto/regex.rst:1334 +msgid "" +"In this case, the solution is to use the non-greedy quantifiers ``*?``, " +"``+?``, ``??``, or ``{m,n}?``, which match as *little* text as possible. In" +" the above example, the ``'>'`` is tried immediately after the first ``'<'``" +" matches, and when it fails, the engine advances a character at a time, " +"retrying the ``'>'`` at every step. This produces just the right result::" +msgstr "" +"在这种情况下,解决方案是使用非贪婪限定符 ``*?``, ``+?``, ``??`` 或 ``{m,n}?``,它们会匹配尽可能 *少的* 文本。 " +"在上面的例子中,``'>'`` 会在第一个 ``'<'`` 匹配后被立即尝试,而当匹配失败时,引擎将每次前进一个字符,并在每一步重试 ``'>'``。 " +"这将产生正确的结果::" + +#: ../../howto/regex.rst:1340 +msgid "" +">>> print(re.prefixmatch('<.*?>', s).group())\n" +"" +msgstr "" + +#: ../../howto/regex.rst:1343 +msgid "" +"(Note that parsing HTML or XML with regular expressions is painful. Quick-" +"and-dirty patterns will handle common cases, but HTML and XML have special " +"cases that will break the obvious regular expression; by the time you've " +"written a regular expression that handles all of the possible cases, the " +"patterns will be *very* complicated. Use an HTML or XML parser module for " +"such tasks.)" +msgstr "" +"(请注意,使用正则表达式解析 HTML 或 XML 很痛苦。简单粗暴的模式可以处理常见情况,但 HTML 和 XML " +"有特殊情况会破坏明显的正则表达式;当你编写正则表达式处理所有可能的情况时,模式将非常复杂。使用 HTML 或 XML 解析器模块来执行此类任务。)" + +#: ../../howto/regex.rst:1351 +msgid "Using re.VERBOSE" +msgstr "使用 re.VERBOSE" + +#: ../../howto/regex.rst:1353 +msgid "" +"By now you've probably noticed that regular expressions are a very compact " +"notation, but they're not terribly readable. REs of moderate complexity can" +" become lengthy collections of backslashes, parentheses, and metacharacters," +" making them difficult to read and understand." +msgstr "" +"到目前为止,你可能已经注意到正则表达式是一种非常紧凑的表示法,但它们并不是非常易读。 " +"具有中等复杂度的正则可能会成为反斜杠、括号和元字符的冗长集合,使其难以阅读和理解。" + +#: ../../howto/regex.rst:1358 +msgid "" +"For such REs, specifying the :const:`re.VERBOSE` flag when compiling the " +"regular expression can be helpful, because it allows you to format the " +"regular expression more clearly." +msgstr "对于这样的正则,在编译正则表达式时指定 :const:`re.VERBOSE` 标志可能会有所帮助,因为它允许你更清楚地格式化正则表达式。" + +#: ../../howto/regex.rst:1362 +msgid "" +"The ``re.VERBOSE`` flag has several effects. Whitespace in the regular " +"expression that *isn't* inside a character class is ignored. This means " +"that an expression such as ``dog | cat`` is equivalent to the less readable " +"``dog|cat``, but ``[a b]`` will still match the characters ``'a'``, ``'b'``," +" or a space. In addition, you can also put comments inside a RE; comments " +"extend from a ``#`` character to the next newline. When used with triple-" +"quoted strings, this enables REs to be formatted more neatly::" +msgstr "" +"``re.VERBOSE`` 标志有几种效果。正则表达式中的 *不是* 在字符类中的空格将被忽略。这意味着表达式如 ``dog | cat`` " +"等同于不太可读的 ``dog|cat``,但 ``[a b]`` 仍将匹配字符 ``'a'``、``'b'`` 或空格。 " +"此外,你还可以在正则中放置注释;注释从 ``#`` 字符扩展到下一个换行符。当与三引号字符串一起使用时,这使正则的格式更加整齐::" + +#: ../../howto/regex.rst:1370 +msgid "" +"pat = re.compile(r\"\"\"\n" +" \\s* # Skip leading whitespace\n" +" (?P
[^:]+) # Header name\n" +" \\s* : # Whitespace, and a colon\n" +" (?P.*?) # The header's value -- *? used to\n" +" # lose the following trailing whitespace\n" +" \\s*$ # Trailing whitespace to end-of-line\n" +"\"\"\", re.VERBOSE)" +msgstr "" +"pat = re.compile(r\"\"\"\n" +" \\s* # 跳过前导空白\n" +" (?P
[^:]+) # 标题名\n" +" \\s* : # 空白和一个冒号\n" +" (?P.*?) # 标题的值 -- *? 用于\n" +" # 去掉后面的末尾空白\n" +" \\s*$ # 末尾空白到行尾\n" +"\"\"\", re.VERBOSE)" + +#: ../../howto/regex.rst:1379 +msgid "This is far more readable than::" +msgstr "这比下面的写法更具可读性::" + +#: ../../howto/regex.rst:1381 +msgid "pat = re.compile(r\"\\s*(?P
[^:]+)\\s*:(?P.*?)\\s*$\")" +msgstr "pat = re.compile(r\"\\s*(?P
[^:]+)\\s*:(?P.*?)\\s*$\")" + +#: ../../howto/regex.rst:1385 +msgid "Feedback" +msgstr "反馈" + +#: ../../howto/regex.rst:1387 +msgid "" +"Regular expressions are a complicated topic. Did this document help you " +"understand them? Were there parts that were unclear, or problems you " +"encountered that weren't covered here? If so, please send suggestions for " +"improvements to the :ref:`issue tracker `." +msgstr "" + +#: ../../howto/regex.rst:1392 +msgid "" +"The most complete book on regular expressions is almost certainly Jeffrey " +"Friedl's Mastering Regular Expressions, published by O'Reilly. " +"Unfortunately, it exclusively concentrates on Perl and Java's flavours of " +"regular expressions, and doesn't contain any Python material at all, so it " +"won't be useful as a reference for programming in Python. (The first " +"edition covered Python's now-removed :mod:`!regex` module, which won't help " +"you much.) Consider checking it out from your library." +msgstr "" +"关于正则表达式的最完整的书几乎肯定是由 O'Reilly 出版的 Jeffrey Friedl 的 Mastering Regular " +"Expressions。不幸的是,它专注于 Perl 和 Java 的正则表达式,并且根本不包含任何 Python 材料,因此它不能用作 Python " +"编程的参考。 (第一版涵盖了 Python 现在删除的 :mod:`!regex` 模块,这对你没有多大帮助。)考虑从你的图书馆中查找它。" diff --git a/howto/remote_debugging.po b/howto/remote_debugging.po new file mode 100644 index 0000000000..a42d174c25 --- /dev/null +++ b/howto/remote_debugging.po @@ -0,0 +1,1345 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../howto/remote_debugging.rst:4 +msgid "Remote debugging attachment protocol" +msgstr "远程调试附加协议" + +#: ../../howto/remote_debugging.rst:6 +msgid "" +"This protocol enables external tools to attach to a running CPython process " +"and execute Python code remotely." +msgstr "此协议使得外部工具能够附加到正在运行的 CPython 进程并远程执行 Python 代码。" + +#: ../../howto/remote_debugging.rst:9 +msgid "" +"Most platforms require elevated privileges to attach to another Python " +"process." +msgstr "大多数平台上需要提升的权限才能附加到另一个 Python 进程。" + +#: ../../howto/remote_debugging.rst:12 +msgid "Disabling remote debugging" +msgstr "禁用远程调试" + +#: ../../howto/remote_debugging.rst:14 +msgid "To disable remote debugging support, use any of the following:" +msgstr "要禁用远程调试支持,请使用下列方式之一:" + +#: ../../howto/remote_debugging.rst:16 +msgid "" +"Set the :envvar:`PYTHON_DISABLE_REMOTE_DEBUG` environment variable to ``1`` " +"before starting the interpreter." +msgstr "在启动解释器之前将 :envvar:`PYTHON_DISABLE_REMOTE_DEBUG` 环境变量设为 ``1``。" + +#: ../../howto/remote_debugging.rst:18 +msgid "Use the :option:`-X disable_remote_debug` command-line option." +msgstr "使用 :option:`-X disable_remote_debug` 命令行选项。" + +#: ../../howto/remote_debugging.rst:19 +msgid "Compile Python with the :option:`--without-remote-debug` build flag." +msgstr "编译 Python 时使用 :option:`--without-remote-debug` 构建旗标。" + +#: ../../howto/remote_debugging.rst:24 +msgid "Permission requirements" +msgstr "权限需求" + +#: ../../howto/remote_debugging.rst:26 +msgid "" +"Attaching to a running Python process for remote debugging requires elevated" +" privileges on most platforms. The specific requirements and troubleshooting" +" steps depend on your operating system:" +msgstr "在大多数平台上,需要提升的权限才能附加到一个正在运行的 Python 进程以远程调试。具体的需求和故障排除方法取决于您的操作系统:" + +#: ../../howto/remote_debugging.rst:31 +msgid "Linux" +msgstr "Linux" + +#: ../../howto/remote_debugging.rst:32 +msgid "" +"The tracer process must have the ``CAP_SYS_PTRACE`` capability or equivalent" +" privileges. You can only trace processes you own and can signal. Tracing " +"may fail if the process is already being traced, or if it is running with " +"set-user-ID or set-group-ID. Security modules like Yama may further restrict" +" tracing." +msgstr "" +"追踪进程必须拥有 ``CAP_SYS_PTRACE`` 能力或等价的权限。你只能追踪你拥有且可发送信号的进程。如果该进程正被追踪或者在 set-" +"user-ID 或 set-group-ID 下运行,追踪可能失败。Yama 等安全模块可能会进一步限制追踪。" + +#: ../../howto/remote_debugging.rst:38 +msgid "To temporarily relax ptrace restrictions (until reboot), run:" +msgstr "若要暂时放松 ptrace 限制(直到重启),可以运行:" + +#: ../../howto/remote_debugging.rst:40 +msgid "``echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope``" +msgstr "``echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope``" + +#: ../../howto/remote_debugging.rst:44 +msgid "" +"Disabling ``ptrace_scope`` reduces system hardening and should only be done " +"in trusted environments." +msgstr "禁用 ``ptrace_scope`` 会降低系统安全强度,因而只应在受信任的环境中进行。" + +#: ../../howto/remote_debugging.rst:47 +msgid "" +"If running inside a container, use ``--cap-add=SYS_PTRACE`` or " +"``--privileged``, and run as root if needed." +msgstr "" +"若在容器中运行,使用 ``--cap-add=SYS_PTRACE`` 或者 ``--privileged``,并按需以 root 身份运行。" + +#: ../../howto/remote_debugging.rst:50 +msgid "Try re-running the command with elevated privileges:" +msgstr "尝试用提升的权限重新运行命令:" + +#: ../../howto/remote_debugging.rst:52 +msgid "``sudo -E !!``" +msgstr "``sudo -E !!``" + +#: ../../howto/remote_debugging.rst:56 +msgid "macOS" +msgstr "macOS" + +#: ../../howto/remote_debugging.rst:57 +msgid "" +"To attach to another process, you typically need to run your debugging tool " +"with elevated privileges. This can be done by using ``sudo`` or running as " +"root." +msgstr "要附加到另一个进程,您通常需要通过使用 ``sudo`` 或以 root 身份运行,从而以提升的权限运行调试工具。" + +#: ../../howto/remote_debugging.rst:61 +msgid "" +"Even when attaching to processes you own, macOS may block debugging unless " +"the debugger is run with root privileges due to system security " +"restrictions." +msgstr "即使您拥有要附加到的进程,在 macOS 上调试仍可能因系统安全限制被阻止,除非使用 root 权限运行调试器。" + +#: ../../howto/remote_debugging.rst:66 +msgid "Windows" +msgstr "Windows" + +#: ../../howto/remote_debugging.rst:67 +msgid "" +"To attach to another process, you usually need to run your debugging tool " +"with administrative privileges. Start the command prompt or terminal as " +"Administrator." +msgstr "要附加到另一个进程,您通常需要以管理员权限运行调试工具:以管理员身份运行命令提示符或者终端。" + +#: ../../howto/remote_debugging.rst:71 +msgid "" +"Some processes may still be inaccessible even with Administrator rights, " +"unless you have the ``SeDebugPrivilege`` privilege enabled." +msgstr "使用管理员权限时,除非启用 ``SeDebugPrivilege`` 权限,否则有的进程仍可能无法被访问。" + +#: ../../howto/remote_debugging.rst:74 +msgid "" +"To resolve file or folder access issues, adjust the security permissions:" +msgstr "要解决文件或文件夹访问的问题,请调整安全权限:" + +#: ../../howto/remote_debugging.rst:76 +msgid "Right-click the file or folder and select **Properties**." +msgstr "右键文件或文件夹并选择 **属性**。" + +#: ../../howto/remote_debugging.rst:77 +msgid "Go to the **Security** tab to view users and groups with access." +msgstr "在 **安全** 选项卡中查看有访问权限的用户和用户组。" + +#: ../../howto/remote_debugging.rst:78 +msgid "Click **Edit** to modify permissions." +msgstr "点击 **编辑** 以调整权限。" + +#: ../../howto/remote_debugging.rst:79 +msgid "Select your user account." +msgstr "选择您的用户账户。" + +#: ../../howto/remote_debugging.rst:80 +msgid "In **Permissions**, check **Read** or **Full control** as needed." +msgstr "在 **权限** 中,按需勾选 **读取** 或者 **完全控制**。" + +#: ../../howto/remote_debugging.rst:81 +msgid "Click **Apply**, then **OK** to confirm." +msgstr "在点击 **应用** 后点击 **确定**。" + +#: ../../howto/remote_debugging.rst:86 +msgid "" +"Ensure you've satisfied all :ref:`permission-requirements` before " +"proceeding." +msgstr "在继续前,请确保您已满足所有 :ref:`permission-requirements`。" + +#: ../../howto/remote_debugging.rst:88 +msgid "" +"This section describes the low-level protocol that enables external tools to" +" inject and execute a Python script within a running CPython process." +msgstr "本节描述了低级协议,该协议使外部工具能够在运行的 CPython 进程中注入和执行 Python 脚本。" + +#: ../../howto/remote_debugging.rst:91 +msgid "" +"This mechanism forms the basis of the :func:`sys.remote_exec` function, " +"which instructs a remote Python process to execute a ``.py`` file. However, " +"this section does not document the usage of that function. Instead, it " +"provides a detailed explanation of the underlying protocol, which takes as " +"input the ``pid`` of a target Python process and the path to a Python source" +" file to be executed. This information supports independent reimplementation" +" of the protocol, regardless of programming language." +msgstr "" +"该机制构成了 :func:`sys.remote_exec` 函数的基础,该函数用于指示远程 Python 进程执行指定的 ``.py`` " +"文件。但本节并不记录该函数的具体用法,而是详细阐述其底层协议的工作原理——该协议以目标 Python 进程的 ``pid`` 和待执行的 Python " +"源文件路径作为输入。这些信息支持协议的独立重新实现,且不受编程语言限制。" + +#: ../../howto/remote_debugging.rst:101 +msgid "" +"The execution of the injected script depends on the interpreter reaching a " +"safe evaluation point. As a result, execution may be delayed depending on " +"the runtime state of the target process." +msgstr "注入脚本的执行依赖于解释器到达安全的求值点。因此,实际执行时机可能会因目标进程的运行时状态而产生延迟。" + +#: ../../howto/remote_debugging.rst:105 +msgid "" +"Once injected, the script is executed by the interpreter within the target " +"process the next time a safe evaluation point is reached. This approach " +"enables remote execution capabilities without modifying the behavior or " +"structure of the running Python application." +msgstr "" +"一旦注入,脚本将在解释器下一次达到安全求值点时在目标进程中执行。这种方法能够在不修改运行中 Python 应用的行为或结构的情况下实现远程执行功能。" + +#: ../../howto/remote_debugging.rst:110 +msgid "" +"Subsequent sections provide a step-by-step description of the protocol, " +"including techniques for locating interpreter structures in memory, safely " +"accessing internal fields, and triggering code execution. Platform-specific " +"variations are noted where applicable, and example implementations are " +"included to clarify each operation." +msgstr "" +"后续各节提供了该协议的逐步描述,包括定位内存中解释器结构的技术、安全访问内部字段以及触发代码执行的方法。适用的情况下会注明平台特定的变体,并包含示例实现以澄清每个操作。" + +#: ../../howto/remote_debugging.rst:117 +msgid "Locating the PyRuntime structure" +msgstr "定位 PyRuntime 结构" + +#: ../../howto/remote_debugging.rst:119 +msgid "" +"CPython places the ``PyRuntime`` structure in a dedicated binary section to " +"help external tools find it at runtime. The name and format of this section " +"vary by platform. For example, ``.PyRuntime`` is used on ELF systems, and " +"``__DATA,__PyRuntime`` is used on macOS. Tools can find the offset of this " +"structure by examining the binary on disk." +msgstr "" +"CPython 将 ``PyRuntime`` 结构放置在一个专用的二进制节中,以帮助外部工具在运行时找到它。该节的名称和格式因平台而异。例如,在 " +"ELF 系统上使用 ``.PyRuntime``,在 macOS 上使用 " +"``__DATA,__PyRuntime``。工具可以通过检查磁盘上的二进制文件来找到该结构的偏移量。" + +#: ../../howto/remote_debugging.rst:125 +msgid "" +"The ``PyRuntime`` structure contains CPython’s global interpreter state and " +"provides access to other internal data, including the list of interpreters, " +"thread states, and debugger support fields." +msgstr "" +"``PyRuntime`` 结构包含 CPython 的全局解释器状态,并提供对其他内部数据的访问,包括解释器列表、线程状态和调试器支持字段。" + +#: ../../howto/remote_debugging.rst:129 +msgid "" +"To work with a remote Python process, a debugger must first find the memory " +"address of the ``PyRuntime`` structure in the target process. This address " +"can’t be hardcoded or calculated from a symbol name, because it depends on " +"where the operating system loaded the binary." +msgstr "" +"要处理远程 Python 进程,调试器首先必须在目标进程中找到 ``PyRuntime`` " +"结构的内存地址。这个地址不能硬编码或通过符号名计算,因为它取决于操作系统加载二进制文件的位置。" + +#: ../../howto/remote_debugging.rst:134 +msgid "" +"The method for finding ``PyRuntime`` depends on the platform, but the steps " +"are the same in general:" +msgstr "查找 ``PyRuntime`` 的方法取决于平台,但一般步骤是相同的:" + +#: ../../howto/remote_debugging.rst:137 +msgid "" +"Find the base address where the Python binary or shared library was loaded " +"in the target process." +msgstr "找到 Python 二进制文件或共享库在目标进程中加载的基址。" + +#: ../../howto/remote_debugging.rst:139 +msgid "" +"Use the on-disk binary to locate the offset of the ``.PyRuntime`` section." +msgstr "使用磁盘上的二进制文件定位 ``.PyRuntime`` 段的偏移。" + +#: ../../howto/remote_debugging.rst:140 +msgid "" +"Add the section offset to the base address to compute the address in memory." +msgstr "将段偏移加到基址上,计算出内存中的地址。" + +#: ../../howto/remote_debugging.rst:142 +msgid "" +"The sections below explain how to do this on each supported platform and " +"include example code." +msgstr "以下部分将说明在每个受支持平台上如何进行此操作,并包括示例代码。" + +#: ../../howto/remote_debugging.rst:146 +msgid "Linux (ELF)" +msgstr "Linux (ELF)" + +#: ../../howto/remote_debugging.rst:147 +msgid "To find the ``PyRuntime`` structure on Linux:" +msgstr "在 Linux 上查找 ``PyRuntime`` 结构:" + +#: ../../howto/remote_debugging.rst:149 +msgid "" +"Read the process’s memory map (for example, ``/proc//maps``) to find " +"the address where the Python executable or ``libpython`` was loaded." +msgstr "" +"读取进程的内存映射 (例如,``/proc//maps``) 以找到 Python 可执行文件或 ``libpython`` 加载的地址。" + +#: ../../howto/remote_debugging.rst:151 +msgid "" +"Parse the ELF section headers in the binary to get the offset of the " +"``.PyRuntime`` section." +msgstr "解析二进制文件中的 ELF 段头,获取 ``.PyRuntime`` 段的偏移。" + +#: ../../howto/remote_debugging.rst:153 +msgid "" +"Add that offset to the base address from step 1 to get the memory address of" +" ``PyRuntime``." +msgstr "将此偏移加到步骤 1 中的基址上,得到 ``PyRuntime`` 的内存地址。" + +#: ../../howto/remote_debugging.rst:156 ../../howto/remote_debugging.rst:218 +#: ../../howto/remote_debugging.rst:288 ../../howto/remote_debugging.rst:557 +msgid "The following is an example implementation::" +msgstr "以下是一个示例实现::" + +#: ../../howto/remote_debugging.rst:158 +msgid "" +"def find_py_runtime_linux(pid: int) -> int:\n" +" # Step 1: Try to find the Python executable in memory\n" +" binary_path, base_address = find_mapped_binary(\n" +" pid, name_contains=\"python\"\n" +" )\n" +"\n" +" # Step 2: Fallback to shared library if executable is not found\n" +" if binary_path is None:\n" +" binary_path, base_address = find_mapped_binary(\n" +" pid, name_contains=\"libpython\"\n" +" )\n" +"\n" +" # Step 3: Parse ELF headers to get .PyRuntime section offset\n" +" section_offset = parse_elf_section_offset(\n" +" binary_path, \".PyRuntime\"\n" +" )\n" +"\n" +" # Step 4: Compute PyRuntime address in memory\n" +" return base_address + section_offset" +msgstr "" +"def find_py_runtime_linux(pid: int) -> int:\n" +" # 步骤 1:尝试在内存中找到 Python 可执行文件\n" +" binary_path, base_address = find_mapped_binary(\n" +" pid, name_contains=\"python\"\n" +" )\n" +"\n" +" # 步骤 2:如果找不到可执行文件,则回退到共享库\n" +" if binary_path is None:\n" +" binary_path, base_address = find_mapped_binary(\n" +" pid, name_contains=\"libpython\"\n" +" )\n" +"\n" +" # 步骤 3:解析 ELF 头以获取.PyRuntime 节的偏移量\n" +" section_offset = parse_elf_section_offset(\n" +" binary_path, \".PyRuntime\"\n" +" )\n" +"\n" +" # 步骤 4:计算内存中的 PyRuntime 地址\n" +" return base_address + section_offset" + +#: ../../howto/remote_debugging.rst:179 +msgid "" +"On Linux systems, there are two main approaches to read memory from another " +"process. The first is through the ``/proc`` filesystem, specifically by " +"reading from ``/proc/[pid]/mem`` which provides direct access to the " +"process's memory. This requires appropriate permissions - either being the " +"same user as the target process or having root access. The second approach " +"is using the ``process_vm_readv()`` system call which provides a more " +"efficient way to copy memory between processes. While ptrace's " +"``PTRACE_PEEKTEXT`` operation can also be used to read memory, it is " +"significantly slower as it only reads one word at a time and requires " +"multiple context switches between the tracer and tracee processes." +msgstr "" +"在 Linux 系统上,有两种主要方法读取另一个进程的内存。第一种是通过 ``/proc`` 文件系统,具体来说是通过读取 " +"``/proc/[pid]/mem`` ,它提供了对进程内存的直接访问。这需要适当的权限——要么是与目标进程相同的用户,要么拥有 root " +"权限。第二种方法是使用 ``process_vm_readv()`` 系统调用,它提供了在进程间复制内存的更高效方式。虽然 ptrace 的 " +"``PTRACE_PEEKTEXT`` " +"操作也可以用来读取内存,但它显著较慢,因为它一次只读取一个字,并且需要在跟踪器和被跟踪进程之间进行多次上下文切换。" + +#: ../../howto/remote_debugging.rst:190 +msgid "" +"For parsing ELF sections, the process involves reading and interpreting the " +"ELF file format structures from the binary file on disk. The ELF header " +"contains a pointer to the section header table. Each section header contains" +" metadata about a section including its name (stored in a separate string " +"table), offset, and size. To find a specific section like .PyRuntime, you " +"need to walk through these headers and match the section name. The section " +"header then provides the offset where that section exists in the file, which" +" can be used to calculate its runtime address when the binary is loaded into" +" memory." +msgstr "" +"为了解析 ELF 节,过程包括从磁盘上的二进制文件中读取和解释 ELF 文件格式结构。ELF " +"头部包含一个指向节头表的指针。每个节头包含有关节的元数据,包括其名称(存储在单独的字符串表中)、偏移量和大小。要查找特定节(如.PyRuntime),需要遍历这些头部并匹配节名称。节头然后提供该节在文件中存在的偏移量,这可以用来计算二进制文件加载到内存时的运行时地址。" + +#: ../../howto/remote_debugging.rst:199 +msgid "" +"You can read more about the ELF file format in the `ELF specification " +"`_." +msgstr "" +"你可以在 `ELF 规范 " +"`_ 中了解更多关于 ELF" +" 文件格式的信息。" + +#: ../../howto/remote_debugging.rst:204 +msgid "macOS (Mach-O)" +msgstr "macOS (Mach-O)" + +#: ../../howto/remote_debugging.rst:205 +msgid "To find the ``PyRuntime`` structure on macOS:" +msgstr "在 macOS 上查找 ``PyRuntime`` 结构:" + +#: ../../howto/remote_debugging.rst:207 +msgid "" +"Call ``task_for_pid()`` to get the ``mach_port_t`` task port for the target " +"process. This handle is needed to read memory using APIs like " +"``mach_vm_read_overwrite`` and ``mach_vm_region``." +msgstr "" +"调用 ``task_for_pid()`` 以获取目标进程的 ``mach_port_t`` 任务端口。此句柄用于通过 " +"``mach_vm_read_overwrite`` 和 ``mach_vm_region`` 等 API 读取内存。" + +#: ../../howto/remote_debugging.rst:210 +msgid "" +"Scan the memory regions to find the one containing the Python executable or " +"``libpython``." +msgstr "扫描内存区域,找到包含 Python 可执行文件或 ``libpython`` 的区域。" + +#: ../../howto/remote_debugging.rst:212 +msgid "" +"Load the binary file from disk and parse the Mach-O headers to find the " +"section named ``PyRuntime`` in the ``__DATA`` segment. On macOS, symbol " +"names are automatically prefixed with an underscore, so the ``PyRuntime`` " +"symbol appears as ``_PyRuntime`` in the symbol table, but the section name " +"is not affected." +msgstr "" +"从磁盘加载二进制文件并解析 Mach-O 头部,以在 ``__DATA`` 段中找到名为 ``PyRuntime`` 的节。在 macOS " +"上,符号名称自动以一个下划线为前缀,因此 ``PyRuntime`` 符号在符号表中显示为 ``_PyRuntime``,但节名称不受影响。" + +#: ../../howto/remote_debugging.rst:220 +msgid "" +"def find_py_runtime_macos(pid: int) -> int:\n" +" # Step 1: Get access to the process's memory\n" +" handle = get_memory_access_handle(pid)\n" +"\n" +" # Step 2: Try to find the Python executable in memory\n" +" binary_path, base_address = find_mapped_binary(\n" +" handle, name_contains=\"python\"\n" +" )\n" +"\n" +" # Step 3: Fallback to libpython if the executable is not found\n" +" if binary_path is None:\n" +" binary_path, base_address = find_mapped_binary(\n" +" handle, name_contains=\"libpython\"\n" +" )\n" +"\n" +" # Step 4: Parse Mach-O headers to get __DATA,__PyRuntime section offset\n" +" section_offset = parse_macho_section_offset(\n" +" binary_path, \"__DATA\", \"__PyRuntime\"\n" +" )\n" +"\n" +" # Step 5: Compute the PyRuntime address in memory\n" +" return base_address + section_offset" +msgstr "" +"def find_py_runtime_macos(pid: int) -> int:\n" +" # 步骤 1:访问进程的内存\n" +" handle = get_memory_access_handle(pid)\n" +"\n" +" # 步骤 2:尝试在内存中找到 Python 可执行文件\n" +" binary_path, base_address = find_mapped_binary(\n" +" handle, name_contains=\"python\"\n" +" )\n" +"\n" +" # 步骤 3:如果找不到可执行文件,则回退到 libpython\n" +" if binary_path is None:\n" +" binary_path, base_address = find_mapped_binary(\n" +" handle, name_contains=\"libpython\"\n" +" )\n" +"\n" +" # 步骤 4:解析 Mach-O 头以获取__DATA,__PyRuntime 段的偏移量\n" +" section_offset = parse_macho_section_offset(\n" +" binary_path, \"__DATA\", \"__PyRuntime\"\n" +" )\n" +"\n" +" # 步骤 5:计算内存中的 PyRuntime 地址\n" +" return base_address + section_offset" + +#: ../../howto/remote_debugging.rst:243 +msgid "" +"On macOS, accessing another process's memory requires using Mach-O specific " +"APIs and file formats. The first step is obtaining a ``task_port`` handle " +"via ``task_for_pid()``, which provides access to the target process's memory" +" space. This handle enables memory operations through APIs like " +"``mach_vm_read_overwrite()``." +msgstr "" +"在 macOS 上,访问另一个进程的内存需要使用 Mach-O 特定的 API 和文件格式。第一步是通过 ``task_for_pid()`` 获取 " +"``task_port`` 句柄,这提供了对目标进程内存空间的访问。此句柄通过 ``mach_vm_read_overwrite()`` 等 API " +"启用内存操作。" + +#: ../../howto/remote_debugging.rst:249 +msgid "" +"The process memory can be examined using ``mach_vm_region()`` to scan " +"through the virtual memory space, while ``proc_regionfilename()`` helps " +"identify which binary files are loaded at each memory region. When the " +"Python binary or library is found, its Mach-O headers need to be parsed to " +"locate the ``PyRuntime`` structure." +msgstr "" +"可以使用 ``mach_vm_region()`` 检查进程内存,以扫描虚拟内存空间,而 ``proc_regionfilename()`` " +"帮助识别每个内存区域加载了哪些二进制文件。当找到 Python 二进制文件或库时,需要解析其 Mach-O 头部以定位 ``PyRuntime`` " +"结构。" + +#: ../../howto/remote_debugging.rst:254 +msgid "" +"The Mach-O format organizes code and data into segments and sections. The " +"``PyRuntime`` structure lives in a section named ``__PyRuntime`` within the " +"``__DATA`` segment. The actual runtime address calculation involves finding " +"the ``__TEXT`` segment which serves as the binary's base address, then " +"locating the ``__DATA`` segment containing our target section. The final " +"address is computed by combining the base address with the appropriate " +"section offsets from the Mach-O headers." +msgstr "" +"Mach-O 格式将代码和数据组织到段和节中。``PyRuntime`` 结构位于 ``__DATA`` 段中的名为 ``__PyRuntime`` " +"的节内。实际的运行时地址计算涉及找到作为二进制文件基址的 ``__TEXT`` 段,然后定位包含目标节的 ``__DATA`` " +"段。最终地址是通过将基址与 Mach-O 头部中的适当节偏移量组合来计算的。" + +#: ../../howto/remote_debugging.rst:262 +msgid "" +"Note that accessing another process's memory on macOS typically requires " +"elevated privileges - either root access or special security entitlements " +"granted to the debugging process." +msgstr "请注意,在 macOS 上访问另一个进程的内存通常需要提升权限——要么是 root 访问权限,要么是授予调试进程的特殊安全权限。" + +#: ../../howto/remote_debugging.rst:268 +msgid "Windows (PE)" +msgstr "Windows (PE)" + +#: ../../howto/remote_debugging.rst:269 +msgid "To find the ``PyRuntime`` structure on Windows:" +msgstr "在 Windows 上查找 ``PyRuntime`` 结构:" + +#: ../../howto/remote_debugging.rst:271 +msgid "" +"Use the ToolHelp API to enumerate all modules loaded in the target process. " +"This is done using functions such as `CreateToolhelp32Snapshot " +"`_, `Module32First " +"`_, and `Module32Next " +"`_." +msgstr "" +"使用 ToolHelp API 枚举目标进程中加载的所有模块。这通过使用如 `CreateToolhelp32Snapshot " +"`_, `Module32First " +"`_, 和 `Module32Next `_ 等函数来完成。" + +#: ../../howto/remote_debugging.rst:278 +msgid "" +"Identify the module corresponding to :file:`python.exe` or " +":file:`python{XY}.dll`, where ``X`` and ``Y`` are the major and minor " +"version numbers of the Python version, and record its base address." +msgstr "" +"识别对应于 :file:`python.exe` 或 :file:`python{XY}.dll` 的模块,其中 ``X`` 和 ``Y`` 是 " +"Python 版本的主次版本号,并记录其基址。" + +#: ../../howto/remote_debugging.rst:281 +msgid "" +"Locate the ``PyRuntim`` section. Due to the PE format's 8-character limit on" +" section names (defined as ``IMAGE_SIZEOF_SHORT_NAME``), the original name " +"``PyRuntime`` is truncated. This section contains the ``PyRuntime`` " +"structure." +msgstr "" +"定位 ``PyRuntim`` 节。由于 PE 格式对节名称有 8 个字符的限制 (定义为 " +"``IMAGE_SIZEOF_SHORT_NAME``),原始名称 ``PyRuntime`` 被截断。 此节包含 ``PyRuntime`` 结构。" + +#: ../../howto/remote_debugging.rst:285 +msgid "" +"Retrieve the section’s relative virtual address (RVA) and add it to the base" +" address of the module." +msgstr "检索节的相对虚拟地址(RVA),并将其添加到模块的基址。" + +#: ../../howto/remote_debugging.rst:290 +msgid "" +"def find_py_runtime_windows(pid: int) -> int:\n" +" # Step 1: Try to find the Python executable in memory\n" +" binary_path, base_address = find_loaded_module(\n" +" pid, name_contains=\"python\"\n" +" )\n" +"\n" +" # Step 2: Fallback to shared pythonXY.dll if the executable is not\n" +" # found\n" +" if binary_path is None:\n" +" binary_path, base_address = find_loaded_module(\n" +" pid, name_contains=\"python3\"\n" +" )\n" +"\n" +" # Step 3: Parse PE section headers to get the RVA of the PyRuntime\n" +" # section. The section name appears as \"PyRuntim\" due to the\n" +" # 8-character limit defined by the PE format (IMAGE_SIZEOF_SHORT_NAME).\n" +" section_rva = parse_pe_section_offset(binary_path, \"PyRuntim\")\n" +"\n" +" # Step 4: Compute PyRuntime address in memory\n" +" return base_address + section_rva" +msgstr "" +"def find_py_runtime_windows(pid: int) -> int:\n" +" # 步骤 1:尝试在内存中找到 Python 可执行文件\n" +" binary_path, base_address = find_loaded_module(\n" +" pid, name_contains=\"python\"\n" +" )\n" +"\n" +" # 步骤 2:如果可执行文件未找到,则回退到共享的 pythonXY.dll\n" +" if binary_path is None:\n" +" binary_path, base_address = find_loaded_module(\n" +" pid, name_contains=\"python3\"\n" +" )\n" +"\n" +" # 步骤 3:解析 PE 节头以获取 PyRuntime 节的相对虚拟地址(RVA)。\n" +" # 由于 PE 格式(IMAGE_SIZEOF_SHORT_NAME)规定的 8 字符限制,\n" +" # 该节的名称显示为\"PyRuntim\"。\n" +" section_rva = parse_pe_section_offset(binary_path, \"PyRuntim\")\n" +"\n" +" # 步骤 4:计算内存中的 PyRuntime 地址\n" +" return base_address + section_rva" + +#: ../../howto/remote_debugging.rst:312 +msgid "" +"On Windows, accessing another process's memory requires using the Windows " +"API functions like ``CreateToolhelp32Snapshot()`` and " +"``Module32First()/Module32Next()`` to enumerate loaded modules. The " +"``OpenProcess()`` function provides a handle to access the target process's " +"memory space, enabling memory operations through ``ReadProcessMemory()``." +msgstr "" +"在 Windows 上,访问另一个进程的内存需要使用 Windows API 函数,如 ``CreateToolhelp32Snapshot()``" +" 和 ``Module32First()/Module32Next()`` 来枚举已加载的模块。``OpenProcess()`` " +"函数提供了一个句柄,用于访问目标进程的内存空间,通过 ``ReadProcessMemory()`` 实现内存操作。" + +#: ../../howto/remote_debugging.rst:318 +msgid "" +"The process memory can be examined by enumerating loaded modules to find the" +" Python binary or DLL. When found, its PE headers need to be parsed to " +"locate the ``PyRuntime`` structure." +msgstr "" +"可以通过枚举已加载的模块来检查进程内存,以找到 Python 二进制文件或 DLL。找到后,需要解析其 PE 头以定位 ``PyRuntime`` " +"结构。" + +#: ../../howto/remote_debugging.rst:322 +msgid "" +"The PE format organizes code and data into sections. The ``PyRuntime`` " +"structure lives in a section named \"PyRuntim\" (truncated from " +"\"PyRuntime\" due to PE's 8-character name limit). The actual runtime " +"address calculation involves finding the module's base address from the " +"module entry, then locating our target section in the PE headers. The final " +"address is computed by combining the base address with the section's virtual" +" address from the PE section headers." +msgstr "" +"PE 格式将代码和数据组织到节中。``PyRuntime`` 结构位于名为 \"PyRuntim\" 的节中(由于 PE 的 8 字符名称限制,从 " +"\"PyRuntime\" 截断)。实际的运行时地址计算涉及从模块入口找到模块的基址,然后在 PE 头中定位目标节。最终地址是通过将基址与 PE " +"节头中的节的虚拟地址组合来计算的。" + +#: ../../howto/remote_debugging.rst:329 +msgid "" +"Note that accessing another process's memory on Windows typically requires " +"appropriate privileges - either administrative access or the " +"``SeDebugPrivilege`` privilege granted to the debugging process." +msgstr "" +"请注意,在 Windows 上访问另一个进程的内存通常需要适当的权限——要么是管理员访问权限,要么是授予调试进程的 " +"``SeDebugPrivilege`` 权限。" + +#: ../../howto/remote_debugging.rst:335 +msgid "Reading _Py_DebugOffsets" +msgstr "读取_Py_DebugOffsets" + +#: ../../howto/remote_debugging.rst:337 +msgid "" +"Once the address of the ``PyRuntime`` structure has been determined, the " +"next step is to read the ``_Py_DebugOffsets`` structure located at the " +"beginning of the ``PyRuntime`` block." +msgstr "" +"一旦确定了 ``PyRuntime`` 结构的地址,下一步就是读取位于 ``PyRuntime`` 块开头的 ``_Py_DebugOffsets``" +" 结构。" + +#: ../../howto/remote_debugging.rst:341 +msgid "" +"This structure provides version-specific field offsets that are needed to " +"safely read interpreter and thread state memory. These offsets vary between " +"CPython versions and must be checked before use to ensure they are " +"compatible." +msgstr "" +"该结构提供了特定版本的字段偏移量,这些偏移量用于安全地读取解释器和线程状态内存。这些偏移量在 CPython " +"版本之间有所变化,必须在使用前进行检查以确保它们是兼容的。" + +#: ../../howto/remote_debugging.rst:345 +msgid "To read and check the debug offsets, follow these steps:" +msgstr "要读取和检查调试偏移量,请按照以下步骤操作:" + +#: ../../howto/remote_debugging.rst:347 +msgid "" +"Read memory from the target process starting at the ``PyRuntime`` address, " +"covering the same number of bytes as the ``_Py_DebugOffsets`` structure. " +"This structure is located at the very start of the ``PyRuntime`` memory " +"block. Its layout is defined in CPython’s internal headers and stays the " +"same within a given minor version, but may change in major versions." +msgstr "" +"从目标进程的 ``PyRuntime`` 地址开始读取内存,覆盖的字节数与 ``_Py_DebugOffsets`` 结构相同。该结构位于 " +"``PyRuntime`` 内存块的起始位置。其布局在 CPython 的内部头文件中定义,并在给定的小版本中保持不变,但在大版本中可能会发生变化。" + +#: ../../howto/remote_debugging.rst:353 +msgid "Check that the structure contains valid data:" +msgstr "检查该结构是否包含有效数据:" + +#: ../../howto/remote_debugging.rst:355 +msgid "The ``cookie`` field must match the expected debug marker." +msgstr "``cookie`` 字段必须与预期的调试标记匹配。" + +#: ../../howto/remote_debugging.rst:356 +msgid "" +"The ``version`` field must match the version of the Python interpreter used " +"by the debugger." +msgstr "``version`` 字段必须与调试器使用的 Python 解释器版本匹配。" + +#: ../../howto/remote_debugging.rst:358 +msgid "" +"If either the debugger or the target process is using a pre-release version " +"(for example, an alpha, beta, or release candidate), the versions must match" +" exactly." +msgstr "如果调试器或目标进程使用的是预发布版本(例如,alpha、beta 或发布候选版本),则版本必须完全匹配。" + +#: ../../howto/remote_debugging.rst:361 +msgid "" +"The ``free_threaded`` field must have the same value in both the debugger " +"and the target process." +msgstr "``free_threaded`` 字段在调试器和目标进程中必须具有相同的值。" + +#: ../../howto/remote_debugging.rst:364 +msgid "" +"If the structure is valid, the offsets it contains can be used to locate " +"fields in memory. If any check fails, the debugger should stop the operation" +" to avoid reading memory in the wrong format." +msgstr "如果结构体有效,其中包含的偏移量可以用于定位内存中的字段。如果任何检查失败,调试器应停止操作,以避免以错误格式读取内存。" + +#: ../../howto/remote_debugging.rst:368 +msgid "" +"The following is an example implementation that reads and checks " +"``_Py_DebugOffsets``::" +msgstr "以下是一个读取和检查 ``_Py_DebugOffsets`` 的示例实现::" + +#: ../../howto/remote_debugging.rst:371 +msgid "" +"def read_debug_offsets(pid: int, py_runtime_addr: int) -> DebugOffsets:\n" +" # Step 1: Read memory from the target process at the PyRuntime address\n" +" data = read_process_memory(\n" +" pid, address=py_runtime_addr, size=DEBUG_OFFSETS_SIZE\n" +" )\n" +"\n" +" # Step 2: Deserialize the raw bytes into a _Py_DebugOffsets structure\n" +" debug_offsets = parse_debug_offsets(data)\n" +"\n" +" # Step 3: Validate the contents of the structure\n" +" if debug_offsets.cookie != EXPECTED_COOKIE:\n" +" raise RuntimeError(\"Invalid or missing debug cookie\")\n" +" if debug_offsets.version != LOCAL_PYTHON_VERSION:\n" +" raise RuntimeError(\n" +" \"Mismatch between caller and target Python versions\"\n" +" )\n" +" if debug_offsets.free_threaded != LOCAL_FREE_THREADED:\n" +" raise RuntimeError(\"Mismatch in free-threaded configuration\")\n" +"\n" +" return debug_offsets" +msgstr "" +"def read_debug_offsets(pid: int, py_runtime_addr: int) -> DebugOffsets:\n" +" # 步骤 1:从目标进程中读取 PyRuntime 地址处的内存\n" +" data = read_process_memory(\n" +" pid, address=py_runtime_addr, size=DEBUG_OFFSETS_SIZE\n" +" )\n" +"\n" +" # 步骤 2:将原始字节反序列化为_Py_DebugOffsets 结构体\n" +" debug_offsets = parse_debug_offsets(data)\n" +"\n" +" # 步骤 3:验证结构体的内容\n" +" if debug_offsets.cookie != EXPECTED_COOKIE:\n" +" raise RuntimeError(\"Invalid or missing debug cookie\")\n" +" if debug_offsets.version != LOCAL_PYTHON_VERSION:\n" +" raise RuntimeError(\n" +" \"Mismatch between caller and target Python versions\"\n" +" )\n" +" if debug_offsets.free_threaded != LOCAL_FREE_THREADED:\n" +" raise RuntimeError(\"Mismatch in free-threaded configuration\")\n" +"\n" +" return debug_offsets" + +#: ../../howto/remote_debugging.rst:396 +msgid "**Process suspension recommended**" +msgstr "**建议挂起进程**" + +#: ../../howto/remote_debugging.rst:398 +msgid "" +"To avoid race conditions and ensure memory consistency, it is strongly " +"recommended that the target process be suspended before performing any " +"operations that read or write internal interpreter state. The Python runtime" +" may concurrently mutate interpreter data structures—such as creating or " +"destroying threads—during normal execution. This can result in invalid " +"memory reads or writes." +msgstr "" +"为避免竞态条件并确保内存一致性,在执行任何读取或写入解释器内部状态的操作前,强烈建议先挂起目标进程。Python " +"运行时可能在正常执行期间并发修改解释器数据结构(例如创建或销毁线程),这可能导致无效的内存读写操作。" + +#: ../../howto/remote_debugging.rst:405 +msgid "" +"A debugger may suspend execution by attaching to the process with ``ptrace``" +" or by sending a ``SIGSTOP`` signal. Execution should only be resumed after " +"debugger-side memory operations are complete." +msgstr "" +"调试器可以通过使用 ``ptrace`` 附加到进程或发送 ``SIGSTOP`` 信号来挂起执行。只有在调试器端的内存操作完成后,才应恢复执行。" + +#: ../../howto/remote_debugging.rst:411 +msgid "" +"Some tools, such as profilers or sampling-based debuggers, may operate on a " +"running process without suspension. In such cases, tools must be explicitly " +"designed to handle partially updated or inconsistent memory. For most " +"debugger implementations, suspending the process remains the safest and most" +" robust approach." +msgstr "" +"一些工具,如性能分析器或基于采样的调试器,可以在不挂起运行进程的情况下操作。在这种情况下,工具必须明确设计以处理部分更新或不一致的内存。对于大多数调试器实现来说,挂起进程仍然是最安全、最稳健的方法。" + +#: ../../howto/remote_debugging.rst:419 +msgid "Locating the interpreter and thread state" +msgstr "定位解释器和线程状态" + +#: ../../howto/remote_debugging.rst:421 +msgid "" +"Before code can be injected and executed in a remote Python process, the " +"debugger must choose a thread in which to schedule execution. This is " +"necessary because the control fields used to perform remote code injection " +"are located in the ``_PyRemoteDebuggerSupport`` structure, which is embedded" +" in a ``PyThreadState`` object. These fields are modified by the debugger to" +" request execution of injected scripts." +msgstr "" +"在远程 Python 进程中注入并执行代码前,调试器必须选定一个目标线程来调度执行。这是因为用于远程代码注入的控制字段位于 " +"``_PyRemoteDebuggerSupport`` 结构体中,而该结构体又嵌入在 ``PyThreadState`` " +"对象内。调试器通过修改这些字段来请求执行已注入的脚本。" + +#: ../../howto/remote_debugging.rst:428 +msgid "" +"The ``PyThreadState`` structure represents a thread running inside a Python " +"interpreter. It maintains the thread’s evaluation context and contains the " +"fields required for debugger coordination. Locating a valid " +"``PyThreadState`` is therefore a key prerequisite for triggering execution " +"remotely." +msgstr "" +"``PyThreadState`` 结构体表示在 Python " +"解释器内运行的线程。它维护线程的求值上下文,并包含调试器协调所需的字段。因此,定位一个有效的 ``PyThreadState`` " +"是触发远程执行的关键前提。" + +#: ../../howto/remote_debugging.rst:433 +msgid "" +"A thread is typically selected based on its role or ID. In most cases, the " +"main thread is used, but some tools may target a specific thread by its " +"native thread ID. Once the target thread is chosen, the debugger must locate" +" both the interpreter and the associated thread state structures in memory." +msgstr "" +"通常基于线程的角色或 ID 来选择线程。在大多数情况下,使用主线程,但一些工具可能通过其本地线程 ID " +"定位特定线程。一旦选择了目标线程,调试器必须在内存中定位解释器和相关的线程状态结构。" + +#: ../../howto/remote_debugging.rst:438 +msgid "The relevant internal structures are defined as follows:" +msgstr "相关内部结构体定义如下:" + +#: ../../howto/remote_debugging.rst:440 +msgid "" +"``PyInterpreterState`` represents an isolated Python interpreter instance. " +"Each interpreter maintains its own set of imported modules, built-in state, " +"and thread state list. Although most Python applications use a single " +"interpreter, CPython supports multiple interpreters in the same process." +msgstr "" +"``PyInterpreterState`` 表示一个隔离的 Python " +"解释器实例。每个解释器维护其自己的导入模块集、内置状态和线程状态列表。尽管大多数 Python 应用程序使用单个解释器,但 CPython " +"支持在同一进程中使用多个解释器。" + +#: ../../howto/remote_debugging.rst:445 +msgid "" +"``PyThreadState`` represents a thread running within an interpreter. It " +"contains execution state and the control fields used by the debugger." +msgstr "``PyThreadState`` 表示在解释器内运行的线程。它包含执行状态和调试器使用的控制字段。" + +#: ../../howto/remote_debugging.rst:448 +msgid "To locate a thread:" +msgstr "要定位一个线程:" + +#: ../../howto/remote_debugging.rst:450 +msgid "" +"Use the offset ``runtime_state.interpreters_head`` to obtain the address of " +"the first interpreter in the ``PyRuntime`` structure. This is the entry " +"point to the linked list of active interpreters." +msgstr "" +"使用偏移量 ``runtime_state.interpreters_head`` 获取 ``PyRuntime`` " +"结构体中第一个解释器的地址。这是活动解释器链表的入口点。" + +#: ../../howto/remote_debugging.rst:454 +msgid "" +"Use the offset ``interpreter_state.threads_main`` to access the main thread " +"state associated with the selected interpreter. This is typically the most " +"reliable thread to target." +msgstr "" +"使用偏移量 ``interpreter_state.threads_main`` 访问与选定解释器相关联的主线程状态。这通常是目标的最可靠线程。" + +#: ../../howto/remote_debugging.rst:458 +msgid "" +"Optionally, use the offset ``interpreter_state.threads_head`` to iterate " +"through the linked list of all thread states. Each ``PyThreadState`` " +"structure contains a ``native_thread_id`` field, which may be compared to a " +"target thread ID to find a specific thread." +msgstr "" +"可选地,使用偏移量 ``interpreter_state.threads_head`` 遍历所有线程状态的链表。每个 " +"``PyThreadState`` 结构体包含一个 ``native_thread_id`` 字段,可以将其与目标线程 ID 进行比较以找到特定线程。" + +#: ../../howto/remote_debugging.rst:463 +msgid "" +"Once a valid ``PyThreadState`` has been found, its address can be used in " +"later steps of the protocol, such as writing debugger control fields and " +"scheduling execution." +msgstr "一旦找到有效的 ``PyThreadState``,其地址可以在协议的后续步骤中使用,例如写入调试器控制字段和调度执行。" + +#: ../../howto/remote_debugging.rst:467 +msgid "" +"The following is an example implementation that locates the main thread " +"state::" +msgstr "以下是一个定位主线程状态的示例实现::" + +#: ../../howto/remote_debugging.rst:469 +msgid "" +"def find_main_thread_state(\n" +" pid: int, py_runtime_addr: int, debug_offsets: DebugOffsets,\n" +") -> int:\n" +" # Step 1: Read interpreters_head from PyRuntime\n" +" interp_head_ptr = (\n" +" py_runtime_addr + debug_offsets.runtime_state.interpreters_head\n" +" )\n" +" interp_addr = read_pointer(pid, interp_head_ptr)\n" +" if interp_addr == 0:\n" +" raise RuntimeError(\"No interpreter found in the target process\")\n" +"\n" +" # Step 2: Read the threads_main pointer from the interpreter\n" +" threads_main_ptr = (\n" +" interp_addr + debug_offsets.interpreter_state.threads_main\n" +" )\n" +" thread_state_addr = read_pointer(pid, threads_main_ptr)\n" +" if thread_state_addr == 0:\n" +" raise RuntimeError(\"Main thread state is not available\")\n" +"\n" +" return thread_state_addr" +msgstr "" +"def find_main_thread_state(\n" +" pid: int, py_runtime_addr: int, debug_offsets: DebugOffsets,\n" +") -> int:\n" +" # 步骤 1:从 PyRuntime 中读取 interpreters_head\n" +" interp_head_ptr = (\n" +" py_runtime_addr + debug_offsets.runtime_state.interpreters_head\n" +" )\n" +" interp_addr = read_pointer(pid, interp_head_ptr)\n" +" if interp_addr == 0:\n" +" raise RuntimeError(\"在目标进程中没有找到解释器\")\n" +"\n" +" # 步骤 2:从解释器中读取 threads_main 指针\n" +" threads_main_ptr = (\n" +" interp_addr + debug_offsets.interpreter_state.threads_main\n" +" )\n" +" thread_state_addr = read_pointer(pid, threads_main_ptr)\n" +" if thread_state_addr == 0:\n" +" raise RuntimeError(\"主线程状态不可用\")\n" +"\n" +" return thread_state_addr" + +#: ../../howto/remote_debugging.rst:490 +msgid "" +"The following example demonstrates how to locate a thread by its native " +"thread ID::" +msgstr "以下示例演示了如何通过其本地线程 ID 定位线程::" + +#: ../../howto/remote_debugging.rst:493 +msgid "" +"def find_thread_by_id(\n" +" pid: int,\n" +" interp_addr: int,\n" +" debug_offsets: DebugOffsets,\n" +" target_tid: int,\n" +") -> int:\n" +" # Start at threads_head and walk the linked list\n" +" thread_ptr = read_pointer(\n" +" pid,\n" +" interp_addr + debug_offsets.interpreter_state.threads_head\n" +" )\n" +"\n" +" while thread_ptr:\n" +" native_tid_ptr = (\n" +" thread_ptr + debug_offsets.thread_state.native_thread_id\n" +" )\n" +" native_tid = read_int(pid, native_tid_ptr)\n" +" if native_tid == target_tid:\n" +" return thread_ptr\n" +" thread_ptr = read_pointer(\n" +" pid,\n" +" thread_ptr + debug_offsets.thread_state.next\n" +" )\n" +"\n" +" raise RuntimeError(\"Thread with the given ID was not found\")" +msgstr "" +"def find_thread_by_id(\n" +" pid: int,\n" +" interp_addr: int,\n" +" debug_offsets: DebugOffsets,\n" +" target_tid: int,\n" +") -> int:\n" +" # 从 threads_head 开始遍历链表\n" +" thread_ptr = read_pointer(\n" +" pid,\n" +" interp_addr + debug_offsets.interpreter_state.threads_head\n" +" )\n" +"\n" +" while thread_ptr:\n" +" native_tid_ptr = (\n" +" thread_ptr + debug_offsets.thread_state.native_thread_id\n" +" )\n" +" native_tid = read_int(pid, native_tid_ptr)\n" +" if native_tid == target_tid:\n" +" return thread_ptr\n" +" thread_ptr = read_pointer(\n" +" pid,\n" +" thread_ptr + debug_offsets.thread_state.next\n" +" )\n" +"\n" +" raise RuntimeError(\"没有找到给定ID的线程\")" + +#: ../../howto/remote_debugging.rst:520 +msgid "" +"Once a valid thread state has been located, the debugger can proceed with " +"modifying its control fields and scheduling execution, as described in the " +"next section." +msgstr "一旦定位到有效的线程状态,调试器可以继续修改其控制字段并调度执行,如下一节所述。" + +#: ../../howto/remote_debugging.rst:525 +msgid "Writing control information" +msgstr "写入控制信息" + +#: ../../howto/remote_debugging.rst:527 +msgid "" +"Once a valid ``PyThreadState`` structure has been identified, the debugger " +"may modify control fields within it to schedule the execution of a specified" +" Python script. These control fields are checked periodically by the " +"interpreter, and when set correctly, they trigger the execution of remote " +"code at a safe point in the evaluation loop." +msgstr "" +"一旦识别出有效的 ``PyThreadState`` 结构体,调试器可以修改其中的控制字段以调度指定 Python " +"脚本的执行。这些控制字段由解释器定期检查,当正确设置时,它们会在求值循环的安全点触发远程代码的执行。" + +#: ../../howto/remote_debugging.rst:533 +msgid "" +"Each ``PyThreadState`` contains a ``_PyRemoteDebuggerSupport`` structure " +"used for communication between the debugger and the interpreter. The " +"locations of its fields are defined by the ``_Py_DebugOffsets`` structure " +"and include the following:" +msgstr "" +"每个 ``PyThreadState`` 包含一个 ``_PyRemoteDebuggerSupport`` " +"结构体,用于调试器和解释器之间的通信。其字段的位置由 ``_Py_DebugOffsets`` 结构体定义,包括以下内容:" + +#: ../../howto/remote_debugging.rst:538 +msgid "" +"``debugger_script_path``: A fixed-size buffer that holds the full path to a " +"Python source file (``.py``). This file must be accessible and readable by " +"the target process when execution is triggered." +msgstr "" +"``debugger_script_path``: 一个固定大小的缓冲区,用于存储 Python 源文件 (``.py``) " +"的完整路径。当触发执行时,目标进程必须能够访问并读取该文件。" + +#: ../../howto/remote_debugging.rst:542 +msgid "" +"``debugger_pending_call``: An integer flag. Setting this to ``1`` tells the " +"interpreter that a script is ready to be executed." +msgstr "``debugger_pending_call``:一个整数型旗标。将其设为 ``1`` 表示告知解释器已有脚本准备就绪等待执行。" + +#: ../../howto/remote_debugging.rst:545 +msgid "" +"``eval_breaker``: A field checked by the interpreter during execution. " +"Setting bit 5 (``_PY_EVAL_PLEASE_STOP_BIT``, value ``1U << 5``) in this " +"field causes the interpreter to pause and check for debugger activity." +msgstr "" +"``eval_breaker``: 解释器在执行过程中会检查的字段。设置该字段的第 5 位 " +"(``_PY_EVAL_PLEASE_STOP_BIT``,值为 ``1U << 5``) 将使解释器暂停并检查调试器活动。" + +#: ../../howto/remote_debugging.rst:549 +msgid "" +"To complete the injection, the debugger must perform the following steps:" +msgstr "要完成注入,调试器必须执行以下步骤:" + +#: ../../howto/remote_debugging.rst:551 +msgid "Write the full script path into the ``debugger_script_path`` buffer." +msgstr "将完整脚本路径写入 ``debugger_script_path`` 缓冲区。" + +#: ../../howto/remote_debugging.rst:552 +msgid "Set ``debugger_pending_call`` to ``1``." +msgstr "将 ``debugger_pending_call`` 设置为 ``1``。" + +#: ../../howto/remote_debugging.rst:553 +msgid "" +"Read the current value of ``eval_breaker``, set bit 5 " +"(``_PY_EVAL_PLEASE_STOP_BIT``), and write the updated value back. This " +"signals the interpreter to check for debugger activity." +msgstr "" +"读取 ``eval_breaker`` 的当前值,设置位 5 " +"(``_PY_EVAL_PLEASE_STOP_BIT``),并将更新后的值写回。这会指示解释器检查调试器活动。" + +#: ../../howto/remote_debugging.rst:559 +msgid "" +"def inject_script(\n" +" pid: int,\n" +" thread_state_addr: int,\n" +" debug_offsets: DebugOffsets,\n" +" script_path: str\n" +") -> None:\n" +" # Compute the base offset of _PyRemoteDebuggerSupport\n" +" support_base = (\n" +" thread_state_addr +\n" +" debug_offsets.debugger_support.remote_debugger_support\n" +" )\n" +"\n" +" # Step 1: Write the script path into debugger_script_path\n" +" script_path_ptr = (\n" +" support_base +\n" +" debug_offsets.debugger_support.debugger_script_path\n" +" )\n" +" write_string(pid, script_path_ptr, script_path)\n" +"\n" +" # Step 2: Set debugger_pending_call to 1\n" +" pending_ptr = (\n" +" support_base +\n" +" debug_offsets.debugger_support.debugger_pending_call\n" +" )\n" +" write_int(pid, pending_ptr, 1)\n" +"\n" +" # Step 3: Set _PY_EVAL_PLEASE_STOP_BIT (bit 5, value 1 << 5) in\n" +" # eval_breaker\n" +" eval_breaker_ptr = (\n" +" thread_state_addr +\n" +" debug_offsets.debugger_support.eval_breaker\n" +" )\n" +" breaker = read_int(pid, eval_breaker_ptr)\n" +" breaker |= (1 << 5)\n" +" write_int(pid, eval_breaker_ptr, breaker)" +msgstr "" +"def inject_script(\n" +" pid: int,\n" +" thread_state_addr: int,\n" +" debug_offsets: DebugOffsets,\n" +" script_path: str\n" +") -> None:\n" +" # 计算 _PyRemoteDebuggerSupport 的基准偏移量\n" +" support_base = (\n" +" thread_state_addr +\n" +" debug_offsets.debugger_support.remote_debugger_support\n" +" )\n" +"\n" +" # 步骤 1:将脚本路径写入 debugger_script_path\n" +" script_path_ptr = (\n" +" support_base +\n" +" debug_offsets.debugger_support.debugger_script_path\n" +" )\n" +" write_string(pid, script_path_ptr, script_path)\n" +"\n" +" # 步骤 2:将 debugger_pending_call 设置为 1\n" +" pending_ptr = (\n" +" support_base +\n" +" debug_offsets.debugger_support.debugger_pending_call\n" +" )\n" +" write_int(pid, pending_ptr, 1)\n" +"\n" +" # 步骤 3:在 eval_breaker 中设置 _PY_EVAL_PLEASE_STOP_BIT\n" +" # (第 5 位,值为 1 << 5)\n" +" eval_breaker_ptr = (\n" +" thread_state_addr +\n" +" debug_offsets.debugger_support.eval_breaker\n" +" )\n" +" breaker = read_int(pid, eval_breaker_ptr)\n" +" breaker |= (1 << 5)\n" +" write_int(pid, eval_breaker_ptr, breaker)" + +#: ../../howto/remote_debugging.rst:596 +msgid "" +"Once these fields are set, the debugger may resume the process (if it was " +"suspended). The interpreter will process the request at the next safe " +"evaluation point, load the script from disk, and execute it." +msgstr "设置这些字段后,调试器可以恢复进程(如果它被挂起)。解释器将在下一个安全求值点处理请求,从磁盘加载脚本并执行它。" + +#: ../../howto/remote_debugging.rst:600 +msgid "" +"It is the responsibility of the debugger to ensure that the script file " +"remains present and accessible to the target process during execution." +msgstr "调试器有责任确保脚本文件在执行期间对目标进程保持存在和可访问。" + +#: ../../howto/remote_debugging.rst:605 +msgid "" +"Script execution is asynchronous. The script file cannot be deleted " +"immediately after injection. The debugger should wait until the injected " +"script has produced an observable effect before removing the file. This " +"effect depends on what the script is designed to do. For example, a debugger" +" might wait until the remote process connects back to a socket before " +"removing the script. Once such an effect is observed, it is safe to assume " +"the file is no longer needed." +msgstr "" +"脚本执行是异步的。注入脚本后不能立即删除脚本文件。调试器应等待注入脚本产生可观察的效果后再删除文件。这个效果取决于脚本的设计目的。例如,调试器可能会等待远程进程连接回套接字后再删除脚本。一旦观察到此类效果,可以安全地假设文件不再需要。" + +#: ../../howto/remote_debugging.rst:614 +msgid "Summary" +msgstr "总结" + +#: ../../howto/remote_debugging.rst:616 +msgid "To inject and execute a Python script in a remote process:" +msgstr "要在远程进程中注入并执行 Python 脚本:" + +#: ../../howto/remote_debugging.rst:618 +msgid "Locate the ``PyRuntime`` structure in the target process’s memory." +msgstr "在目标进程的内存中定位 ``PyRuntime`` 结构体。" + +#: ../../howto/remote_debugging.rst:619 +msgid "" +"Read and validate the ``_Py_DebugOffsets`` structure at the beginning of " +"``PyRuntime``." +msgstr "读取并验证 ``PyRuntime`` 开头的 ``_Py_DebugOffsets`` 结构体。" + +#: ../../howto/remote_debugging.rst:621 +msgid "Use the offsets to locate a valid ``PyThreadState``." +msgstr "使用该偏移量来定位一个有效的 ``PyThreadState``。" + +#: ../../howto/remote_debugging.rst:622 +msgid "Write the path to a Python script into ``debugger_script_path``." +msgstr "将一个 Python 脚本的路径写入到 ``debugger_script_path``。" + +#: ../../howto/remote_debugging.rst:623 +msgid "Set the ``debugger_pending_call`` flag to ``1``." +msgstr "将 ``debugger_pending_call`` 旗标设为 ``1``。" + +#: ../../howto/remote_debugging.rst:624 +msgid "Set ``_PY_EVAL_PLEASE_STOP_BIT`` in the ``eval_breaker`` field." +msgstr "设置 ``eval_breaker`` 字段中的 ``_PY_EVAL_PLEASE_STOP_BIT``。" + +#: ../../howto/remote_debugging.rst:625 +msgid "" +"Resume the process (if suspended). The script will execute at the next safe " +"evaluation point." +msgstr "恢复进程(如已挂起)。脚本将在下一个安全求值点开始执行。" + +#: ../../howto/remote_debugging.rst:631 +msgid "Security and threat model" +msgstr "安全与威胁模型Security and threat model" + +#: ../../howto/remote_debugging.rst:633 +msgid "" +"The remote debugging protocol relies on the same operating system primitives" +" used by native debuggers such as GDB and LLDB. Attaching to a process " +"requires the **same privileges** that those debuggers require, for example " +"``ptrace`` / Yama LSM on Linux, ``task_for_pid`` on macOS, and " +"``SeDebugPrivilege`` on Windows. Python does not introduce any new " +"privilege escalation path; if an attacker already possesses the permissions " +"needed to attach to a process, they could equally use GDB to read memory or " +"inject code." +msgstr "" + +#: ../../howto/remote_debugging.rst:642 +msgid "" +"The following principles define what is, and is not, considered a security " +"vulnerability in this feature:" +msgstr "" + +#: ../../howto/remote_debugging.rst:645 +msgid "Attaching requires OS-level privileges" +msgstr "" + +#: ../../howto/remote_debugging.rst:646 +msgid "" +"On every supported platform the operating system gates cross-process memory " +"access behind privilege checks (``CAP_SYS_PTRACE``, root, or administrator " +"rights). A report that demonstrates an issue only after these privileges " +"have already been obtained is **not** a vulnerability in CPython, since the " +"OS security boundary was already crossed." +msgstr "" + +#: ../../howto/remote_debugging.rst:652 +msgid "" +"Crashes or memory errors when reading a compromised process are not " +"vulnerabilities" +msgstr "" + +#: ../../howto/remote_debugging.rst:653 +msgid "" +"A tool that reads internal interpreter state from a target process must " +"trust that memory to be well-formed. If the target process has been " +"corrupted or is controlled by an attacker, the debugger or profiler may " +"crash, produce garbage output, or behave unpredictably. This is the same " +"risk accepted by every ``ptrace``-based debugger. Bugs in this category " +"(buffer overflows, segmentation faults, or undefined behaviour triggered by " +"reading corrupted state) are **not** treated as security issues, though " +"fixes that improve robustness are welcome." +msgstr "" + +#: ../../howto/remote_debugging.rst:662 +msgid "Vulnerabilities in the target process are not in scope" +msgstr "" + +#: ../../howto/remote_debugging.rst:663 +msgid "" +"If the Python process being debugged has already been compromised, the " +"attacker already controls execution in that process. Demonstrating further " +"impact from that starting point does not constitute a vulnerability in the " +"remote debugging protocol." +msgstr "" + +#: ../../howto/remote_debugging.rst:669 +msgid "When to use ``PYTHON_DISABLE_REMOTE_DEBUG``" +msgstr "" + +#: ../../howto/remote_debugging.rst:671 +msgid "" +"The environment variable :envvar:`PYTHON_DISABLE_REMOTE_DEBUG` (and the " +"equivalent :option:`-X disable_remote_debug` flag) allows operators to " +"disable the in-process side of the protocol as a **defence-in-depth** " +"measure. This may be useful in hardened or sandboxed deployment " +"environments where no debugging or profiling of the process is expected and " +"reducing attack surface is a priority, even though the OS-level privilege " +"checks already prevent unprivileged access." +msgstr "" + +#: ../../howto/remote_debugging.rst:679 +msgid "" +"Setting this variable does **not** affect other OS-level debugging " +"interfaces (``ptrace``, ``/proc``, ``task_for_pid``, etc.), which remain " +"available according to their own permission models." +msgstr "" +"设置此变量 **不会** 影响其他 OS 层级的调试接口 (``ptrace``, ``/proc``, ``task_for_pid`` " +"等等),它们将根据它们各自的权限模型保持可用。" diff --git a/howto/sockets.po b/howto/sockets.po new file mode 100644 index 0000000000..f4cef41476 --- /dev/null +++ b/howto/sockets.po @@ -0,0 +1,730 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../howto/sockets.rst:5 +msgid "Socket Programming HOWTO" +msgstr "套接字编程指南" + +#: ../../howto/sockets.rst:0 +msgid "Author" +msgstr "作者" + +#: ../../howto/sockets.rst:7 +msgid "Gordon McMillan" +msgstr "Gordon McMillan" + +#: ../../howto/sockets.rst-1 +msgid "Abstract" +msgstr "摘要" + +#: ../../howto/sockets.rst:12 +msgid "" +"Sockets are used nearly everywhere, but are one of the most severely " +"misunderstood technologies around. This is a 10,000 foot overview of " +"sockets. It's not really a tutorial - you'll still have work to do in " +"getting things operational. It doesn't cover the fine points (and there are " +"a lot of them), but I hope it will give you enough background to begin using" +" them decently." +msgstr "" +"套接字几乎无处不在,但是它却是被误解最严重的技术之一。这是一篇简单的套接字概述。并不是一篇真正的教程 —— " +"你需要做更多的事情才能让它工作起来。其中也并没有涵盖细节(细节会有很多),但是我希望它能提供足够的背景知识,让你像模像样的开始使用套接字" + +#: ../../howto/sockets.rst:20 +msgid "Sockets" +msgstr "套接字" + +#: ../../howto/sockets.rst:22 +msgid "" +"I'm only going to talk about INET (i.e. IPv4) sockets, but they account for " +"at least 99% of the sockets in use. And I'll only talk about STREAM (i.e. " +"TCP) sockets - unless you really know what you're doing (in which case this " +"HOWTO isn't for you!), you'll get better behavior and performance from a " +"STREAM socket than anything else. I will try to clear up the mystery of what" +" a socket is, as well as some hints on how to work with blocking and non-" +"blocking sockets. But I'll start by talking about blocking sockets. You'll " +"need to know how they work before dealing with non-blocking sockets." +msgstr "" +"我将只讨论关于 INET(比如:IPv4 地址族)的套接字,但是它将覆盖几乎 99% 的套接字使用场景。并且我将仅讨论 " +"STREAM(比如:TCP)类型的套接字 - 除非你真的知道你在做什么(那么这篇 HOWTO 可能并不适合你),使用 STREAM " +"类型的套接字将会得到比其它类型更好的表现与性能。我将尝试揭开套接字的神秘面纱,也会讲到一些阻塞与非阻塞套接字的使用。但是我将以阻塞套接字为起点开始讨论。只有你了解它是如何工作的以后才能处理非阻塞套接字。" + +#: ../../howto/sockets.rst:31 +msgid "" +"Part of the trouble with understanding these things is that \"socket\" can " +"mean a number of subtly different things, depending on context. So first, " +"let's make a distinction between a \"client\" socket - an endpoint of a " +"conversation, and a \"server\" socket, which is more like a switchboard " +"operator. The client application (your browser, for example) uses \"client\"" +" sockets exclusively; the web server it's talking to uses both \"server\" " +"sockets and \"client\" sockets." +msgstr "" +"理解这些东西的难点之一在于「套接字」可以表示很多微妙差异的东西,这取决于上下文。所以首先,让我们先分清楚「客户端」套接字和「服务端」套接字之间的不同,客户端套接字表示对话的一端,服务端套接字更像是总机接线员。客户端程序只能(比如:你的浏览器)使用「客户端」套接字;网络服务器则可以使用「服务端」套接字和「客户端」套接字来会话" + +#: ../../howto/sockets.rst:40 +msgid "History" +msgstr "历史" + +#: ../../howto/sockets.rst:42 +msgid "" +"Of the various forms of :abbr:`IPC (Inter Process Communication)`, sockets " +"are by far the most popular. On any given platform, there are likely to be " +"other forms of IPC that are faster, but for cross-platform communication, " +"sockets are about the only game in town." +msgstr "" +"目前为止,在各种形式的 :abbr:`IPC (进程间通信)` 中,套接字是最流行的。在任何指定的平台上,可能会有其它更快的 IPC " +"形式,但是就跨平台通信来说,套接字大概是唯一的玩法" + +#: ../../howto/sockets.rst:47 +msgid "" +"They were invented in Berkeley as part of the BSD flavor of Unix. They " +"spread like wildfire with the internet. With good reason --- the combination" +" of sockets with INET makes talking to arbitrary machines around the world " +"unbelievably easy (at least compared to other schemes)." +msgstr "" +"套接字作为 Unix 的 BSD 分支的一部分诞生于 Berkeley。它们像野火一样在互联网上传播。这是有充分理由的 --- 套接字与 INET " +"的结合让世界各地的任何机器之间的通信变得令人难以置信的简单(至少是与其他方案相比)。" + +#: ../../howto/sockets.rst:54 +msgid "Creating a Socket" +msgstr "创建套接字" + +#: ../../howto/sockets.rst:56 +msgid "" +"Roughly speaking, when you clicked on the link that brought you to this " +"page, your browser did something like the following::" +msgstr "简略地说,当你点击带你来到这个页面的链接时,你的浏览器就已经做了下面这几件事情::" + +#: ../../howto/sockets.rst:59 +msgid "" +"# create an INET, STREAMing socket\n" +"s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n" +"# now connect to the web server on port 80 - the normal http port\n" +"s.connect((\"www.python.org\", 80))" +msgstr "" +"# 创建一个 INET, STREAMing 套接字\n" +"s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n" +"# 现在连接到 web 服务器 80 端口 - 标准的 http 端口\n" +"s.connect((\"www.python.org\", 80))" + +#: ../../howto/sockets.rst:64 +msgid "" +"When the ``connect`` completes, the socket ``s`` can be used to send in a " +"request for the text of the page. The same socket will read the reply, and " +"then be destroyed. That's right, destroyed. Client sockets are normally only" +" used for one exchange (or a small set of sequential exchanges)." +msgstr "" +"当连接完成,套接字可以用来发送请求来接收页面上显示的文字。同样是这个套接字也会用来读取响应,最后再被销毁。是的,被销毁了。客户端套接字通常用来做一次交换(或者说一小组序列的交换)。" + +#: ../../howto/sockets.rst:70 +msgid "" +"What happens in the web server is a bit more complex. First, the web server " +"creates a \"server socket\"::" +msgstr "网络服务器发生了什么这个问题就有点复杂了。首先,服务器创建一个「服务端套接字」::" + +#: ../../howto/sockets.rst:73 +msgid "" +"# create an INET, STREAMing socket\n" +"serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n" +"# bind the socket to a public host, and a well-known port\n" +"serversocket.bind((socket.gethostname(), 80))\n" +"# become a server socket\n" +"serversocket.listen(5)" +msgstr "" +"# 创建一个 INET, STREAM 套接字\n" +"serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n" +"# 将套接字绑定到一个全局的主机和知名的端口\n" +"serversocket.bind((socket.gethostname(), 80))\n" +"# 成为服务器套接字\n" +"serversocket.listen(5)" + +#: ../../howto/sockets.rst:80 +msgid "" +"A couple things to notice: we used ``socket.gethostname()`` so that the " +"socket would be visible to the outside world. If we had used " +"``s.bind(('localhost', 80))`` or ``s.bind(('127.0.0.1', 80))`` we would " +"still have a \"server\" socket, but one that was only visible within the " +"same machine. ``s.bind(('', 80))`` specifies that the socket is reachable " +"by any address the machine happens to have." +msgstr "" +"有几件事需要注意:我们使用了 ``socket.gethostname()``,所以套接字将外网可见。如果我们使用的是 " +"``s.bind(('localhost', 80))`` 或者 ``s.bind(('127.0.0.1', " +"80))``,也会得到一个「服务端」套接字,但是后者只在同一机器上可见。``s.bind(('', " +"80))`` 则指定套接字可以被机器上的任何地址碰巧连接" + +#: ../../howto/sockets.rst:87 +msgid "" +"A second thing to note: low number ports are usually reserved for \"well " +"known\" services (HTTP, SNMP etc). If you're playing around, use a nice high" +" number (4 digits)." +msgstr "" +"第二个需要注意的点是:低端口号通常被一些「常用的」服务(HTTP, SNMP 等)所保留。如果你想把程序跑起来,最好使用一个高位端口号(通常是 4 " +"位的数字)。" + +#: ../../howto/sockets.rst:91 +msgid "" +"Finally, the argument to ``listen`` tells the socket library that we want it" +" to queue up as many as 5 connect requests (the normal max) before refusing " +"outside connections. If the rest of the code is written properly, that " +"should be plenty." +msgstr "" +"最后,``listen`` 方法的参数会告诉套接字库,我们希望在队列中累积多达 5 个(通常的最大值)连接请求后再拒绝外部连接。 " +"如果所有其他代码都准确无误,这个队列长度应该是足够的。" + +#: ../../howto/sockets.rst:95 +msgid "" +"Now that we have a \"server\" socket, listening on port 80, we can enter the" +" mainloop of the web server::" +msgstr "现在我们已经有一个「服务端」套接字,监听了 80 端口,我们可以进入网络服务器的主循环了::" + +#: ../../howto/sockets.rst:98 +msgid "" +"while True:\n" +" # accept connections from outside\n" +" (clientsocket, address) = serversocket.accept()\n" +" # now do something with the clientsocket\n" +" # in this case, we'll pretend this is a threaded server\n" +" ct = make_client_thread(clientsocket)\n" +" ct.start()" +msgstr "" +"while True:\n" +" # 接受外来的连接\n" +" (clientsocket, address) = serversocket.accept()\n" +" # 现在使用 clientsocket 执行一些操作\n" +" # 在本场景中,我们假装这是个线程化服务器\n" +" ct = make_client_thread(clientsocket)\n" +" ct.start()" + +#: ../../howto/sockets.rst:106 +msgid "" +"There's actually 3 general ways in which this loop could work - dispatching " +"a thread to handle ``clientsocket``, create a new process to handle " +"``clientsocket``, or restructure this app to use non-blocking sockets, and " +"multiplex between our \"server\" socket and any active ``clientsocket``\\ s " +"using ``select``. More about that later. The important thing to understand " +"now is this: this is *all* a \"server\" socket does. It doesn't send any " +"data. It doesn't receive any data. It just produces \"client\" sockets. Each" +" ``clientsocket`` is created in response to some *other* \"client\" socket " +"doing a ``connect()`` to the host and port we're bound to. As soon as we've " +"created that ``clientsocket``, we go back to listening for more connections." +" The two \"clients\" are free to chat it up - they are using some " +"dynamically allocated port which will be recycled when the conversation " +"ends." +msgstr "" +"实际上,通常有 3 种方法可以让这个循环工作起来 - 调度一个线程来处理 ``clientsocket``,创建一个新进程来处理 " +"``clientsocket``,或者把这个应用改成使用非阻塞模式套接字,并使用 ``select`` 来实现「服务端」套接字与任意活动 " +"``clientsocket`` 之间的多路复用。稍后会详细介绍。现在最重要的是理解:这就是一个「服务端」套接字做的 *所有* " +"事情。它并没有发送任何数据。也没有接收任何数据。它只创建「客户端」套接字。每个 ``clientsocket`` 都是为了响应某些 *其它* " +"客户端套接字 ``connect()`` 到我们绑定的主机和端口。一旦创建 ``clientsocket`` " +"完成,就会返回并监听更多的连接请求。两个客户端可以随意通信 - 它们使用了一些动态分配的端口,会话结束时端口才会被回收" + +#: ../../howto/sockets.rst:121 +msgid "IPC" +msgstr "进程间通信" + +#: ../../howto/sockets.rst:123 +msgid "" +"If you need fast IPC between two processes on one machine, you should look " +"into pipes or shared memory. If you do decide to use AF_INET sockets, bind " +"the \"server\" socket to ``'localhost'``. On most platforms, this will take " +"a shortcut around a couple of layers of network code and be quite a bit " +"faster." +msgstr "" +"如果你需要在同一台机器上进行两个进程间的快速 IPC 通信,你应该了解管道或者共享内存。如果你决定使用 AF_INET " +"类型的套接字,绑定「服务端」套接字到 ``'localhost'`` " +"。在大多数平台,这将会使用一个许多网络层间的通用快捷方式(本地回环地址)并且速度会快很多" + +#: ../../howto/sockets.rst:129 +msgid "" +"The :mod:`multiprocessing` integrates cross-platform IPC into a higher-level" +" API." +msgstr ":mod:`multiprocessing` 模块使跨平台 IPC 通信成为一个高层的 API" + +#: ../../howto/sockets.rst:134 +msgid "Using a Socket" +msgstr "使用一个套接字" + +#: ../../howto/sockets.rst:136 +msgid "" +"The first thing to note, is that the web browser's \"client\" socket and the" +" web server's \"client\" socket are identical beasts. That is, this is a " +"\"peer to peer\" conversation. Or to put it another way, *as the designer, " +"you will have to decide what the rules of etiquette are for a conversation*." +" Normally, the ``connect``\\ ing socket starts the conversation, by sending " +"in a request, or perhaps a signon. But that's a design decision - it's not a" +" rule of sockets." +msgstr "" +"首先需要注意,浏览器的「客户端」套接字和网络服务器的「客户端」套接字是极为相似的。即这种会话是「点对点」的。或者也可以说 " +"*你作为设计师需要自行决定会话的规则和礼节* 。通常情况下,``连接`` " +"套接字通过发送一个请求或者信号来开始一次会话。但这属于设计决定,并不是套接字规则。" + +#: ../../howto/sockets.rst:143 +msgid "" +"Now there are two sets of verbs to use for communication. You can use " +"``send`` and ``recv``, or you can transform your client socket into a file-" +"like beast and use ``read`` and ``write``. The latter is the way Java " +"presents its sockets. I'm not going to talk about it here, except to warn " +"you that you need to use ``flush`` on sockets. These are buffered \"files\"," +" and a common mistake is to ``write`` something, and then ``read`` for a " +"reply. Without a ``flush`` in there, you may wait forever for the reply, " +"because the request may still be in your output buffer." +msgstr "" +"现在有两组用于通信的动词。你可以使用 ``send`` 和 ``recv``,或者你可以把客户端套接字改成文件类型的形式来使用 ``read`` 和 " +"``write`` 方法。后者是 Java 语言中表示套接字的方法,我将不会在这儿讨论这个,但是要提醒你需要调用套接字的 ``flush`` " +"方法。这些是“缓冲”的文件,一个经常出现的错误是 ``write`` 一些东西,然后就直接开始 ``read`` 一个响应。如果不调用 " +"``flush``,你可能会一直等待这个响应,因为请求可能还在你的输出缓冲中。" + +#: ../../howto/sockets.rst:152 +msgid "" +"Now we come to the major stumbling block of sockets - ``send`` and ``recv`` " +"operate on the network buffers. They do not necessarily handle all the bytes" +" you hand them (or expect from them), because their major focus is handling " +"the network buffers. In general, they return when the associated network " +"buffers have been filled (``send``) or emptied (``recv``). They then tell " +"you how many bytes they handled. It is *your* responsibility to call them " +"again until your message has been completely dealt with." +msgstr "" +"现在我来到了套接字的两个主要的绊脚石 - ``send`` 和 ``recv`` " +"操作网络缓冲区。它们并不一定可以处理所有你想要(期望)的字节,因为它们主要关注点是处理网络缓冲。通常,它们在关联的网络缓冲区 ``send`` 或者清空" +" ``recv`` 时返回。然后告诉你处理了多少个字节。*你* 的责任是一直调用它们直到你所有的消息处理完成。" + +#: ../../howto/sockets.rst:160 +msgid "" +"When a ``recv`` returns 0 bytes, it means the other side has closed (or is " +"in the process of closing) the connection. You will not receive any more " +"data on this connection. Ever. You may be able to send data successfully; " +"I'll talk more about this later." +msgstr "" +"当 ``recv`` 方法返回 0 " +"字节时,就表示另一端已经关闭(或者它所在的进程关闭)了连接。你再也不能从这个连接上获取到任何数据了。你可以成功的发送数据;我将在后面讨论这一点。" + +#: ../../howto/sockets.rst:165 +msgid "" +"A protocol like HTTP uses a socket for only one transfer. The client sends a" +" request, then reads a reply. That's it. The socket is discarded. This " +"means that a client can detect the end of the reply by receiving 0 bytes." +msgstr "" +"像 HTTP 这样的协议只使用一个套接字进行一次传输。客户端发送一个请求,然后读取响应。就这么简单。套接字会被销毁。这意味着客户端可以通过接收 0 " +"字节来检测响应的结束。" + +#: ../../howto/sockets.rst:169 +msgid "" +"But if you plan to reuse your socket for further transfers, you need to " +"realize that *there is no* :abbr:`EOT (End of Transfer)` *on a socket.* I " +"repeat: if a socket ``send`` or ``recv`` returns after handling 0 bytes, the" +" connection has been broken. If the connection has *not* been broken, you " +"may wait on a ``recv`` forever, because the socket will *not* tell you that " +"there's nothing more to read (for now). Now if you think about that a bit, " +"you'll come to realize a fundamental truth of sockets: *messages must either" +" be fixed length* (yuck), *or be delimited* (shrug), *or indicate how long " +"they are* (much better), *or end by shutting down the connection*. The " +"choice is entirely yours, (but some ways are righter than others)." +msgstr "" +"但是如果你打算在随后来的传输中复用套接字的话,你需要明白 *套接字里面是不存在 :abbr:`EOT (传输结束)`* 的。重复一下:套接字 " +"``send`` 或者 ``recv`` 完 0 字节后返回,连接会中断。如果连接没有被断开,你可能会永远处于等待 ``recv`` " +"的状态,因为(就目前来说)套接字 *不会* " +"告诉你不用再读取了。现在如果你细心一点,你可能会意识到套接字基本事实:*消息必须要么具有固定长度,要么可以界定,要么指定了长度(比较好的做法),要么以关闭连接为结束*。选择完全由你而定(这比让别人定更合理)。" + +#: ../../howto/sockets.rst:180 +msgid "" +"Assuming you don't want to end the connection, the simplest solution is a " +"fixed length message::" +msgstr "假定你不希望结束连接,那么最简单的解决方案就是使用定长消息::" + +#: ../../howto/sockets.rst:183 +msgid "" +"class MySocket:\n" +" \"\"\"demonstration class only\n" +" - coded for clarity, not efficiency\n" +" \"\"\"\n" +"\n" +" def __init__(self, sock=None):\n" +" if sock is None:\n" +" self.sock = socket.socket(\n" +" socket.AF_INET, socket.SOCK_STREAM)\n" +" else:\n" +" self.sock = sock\n" +"\n" +" def connect(self, host, port):\n" +" self.sock.connect((host, port))\n" +"\n" +" def mysend(self, msg):\n" +" totalsent = 0\n" +" while totalsent < MSGLEN:\n" +" sent = self.sock.send(msg[totalsent:])\n" +" if sent == 0:\n" +" raise RuntimeError(\"socket connection broken\")\n" +" totalsent = totalsent + sent\n" +"\n" +" def myreceive(self):\n" +" chunks = []\n" +" bytes_recd = 0\n" +" while bytes_recd < MSGLEN:\n" +" chunk = self.sock.recv(min(MSGLEN - bytes_recd, 2048))\n" +" if chunk == b'':\n" +" raise RuntimeError(\"socket connection broken\")\n" +" chunks.append(chunk)\n" +" bytes_recd = bytes_recd + len(chunk)\n" +" return b''.join(chunks)" +msgstr "" +"class MySocket:\n" +" \"\"\"仅用于演示的类\n" +" - 代码保证清晰,不保证效率\n" +" \"\"\"\n" +"\n" +" def __init__(self, sock=None):\n" +" if sock is None:\n" +" self.sock = socket.socket(\n" +" socket.AF_INET, socket.SOCK_STREAM)\n" +" else:\n" +" self.sock = sock\n" +"\n" +" def connect(self, host, port):\n" +" self.sock.connect((host, port))\n" +"\n" +" def mysend(self, msg):\n" +" totalsent = 0\n" +" while totalsent < MSGLEN:\n" +" sent = self.sock.send(msg[totalsent:])\n" +" if sent == 0:\n" +" raise RuntimeError(\"socket connection broken\")\n" +" totalsent = totalsent + sent\n" +"\n" +" def myreceive(self):\n" +" chunks = []\n" +" bytes_recd = 0\n" +" while bytes_recd < MSGLEN:\n" +" chunk = self.sock.recv(min(MSGLEN - bytes_recd, 2048))\n" +" if chunk == b'':\n" +" raise RuntimeError(\"socket connection broken\")\n" +" chunks.append(chunk)\n" +" bytes_recd = bytes_recd + len(chunk)\n" +" return b''.join(chunks)" + +#: ../../howto/sockets.rst:217 +msgid "" +"The sending code here is usable for almost any messaging scheme - in Python " +"you send strings, and you can use ``len()`` to determine its length (even if" +" it has embedded ``\\0`` characters). It's mostly the receiving code that " +"gets more complex. (And in C, it's not much worse, except you can't use " +"``strlen`` if the message has embedded ``\\0``\\ s.)" +msgstr "" +"发送部分的代码几乎可用于任何消息传递方案 —— 在 Python 中你发送字符串,可以使用 ``len()`` 方法来确定它的长度(即使它嵌入了 " +"``\\0`` 字符),主要是接收代码变得更复杂。(在 C 语言中,并没有更糟糕,除非消息嵌入了 ``\\0`` 字符而且你又无法使用 " +"``strlen``)" + +#: ../../howto/sockets.rst:223 +msgid "" +"The easiest enhancement is to make the first character of the message an " +"indicator of message type, and have the type determine the length. Now you " +"have two ``recv``\\ s - the first to get (at least) that first character so " +"you can look up the length, and the second in a loop to get the rest. If you" +" decide to go the delimited route, you'll be receiving in some arbitrary " +"chunk size, (4096 or 8192 is frequently a good match for network buffer " +"sizes), and scanning what you've received for a delimiter." +msgstr "" +"最简单的改进是让消息的第一个字符表示消息类型,由类型决定长度。现在你需要两次 ``recv`` —— " +"第一次取(至少)第一个字符来知晓长度,第二次在循环中获取剩余所有的消息。如果你决定使用分隔符的方式,你将收到一些任意大小的块,(4096 或者 8192" +" 通常是比较合适的网络缓冲区大小),然后扫描你接收到的内容来查找分隔符" + +#: ../../howto/sockets.rst:231 +msgid "" +"One complication to be aware of: if your conversational protocol allows " +"multiple messages to be sent back to back (without some kind of reply), and " +"you pass ``recv`` an arbitrary chunk size, you may end up reading the start " +"of a following message. You'll need to put that aside and hold onto it, " +"until it's needed." +msgstr "" +"一个需要意识到的复杂情况是:如果你的会话协议允许多个消息被发送回来(没有响应),调用 ``recv`` " +"传入任意大小的块,你可能会因为读到后续接收的消息而停止读取。你需要将它放在一边并保存,直到它需要为止。" + +#: ../../howto/sockets.rst:237 +msgid "" +"Prefixing the message with its length (say, as 5 numeric characters) gets " +"more complex, because (believe it or not), you may not get all 5 characters " +"in one ``recv``. In playing around, you'll get away with it; but in high " +"network loads, your code will very quickly break unless you use two ``recv``" +" loops - the first to determine the length, the second to get the data part " +"of the message. Nasty. This is also when you'll discover that ``send`` does " +"not always manage to get rid of everything in one pass. And despite having " +"read this, you will eventually get bit by it!" +msgstr "" +"以其长度(例如,作为 5 个数字字符)作为消息前缀时会变得更复杂,因为(信不信由你)你可能无法在一个 ``recv`` 中获得所有 5 " +"个字符。在一般使用时,你会侥幸避免该状况;但是在高网络负载中,除非你使用两个 ``recv`` 循环,否则你的代码将很快中断 —— " +"第一个用于确定长度,第二个用于获取消息的数据部分。这很讨厌。当你发现 ``send`` 并不总是能在一次传输中搞定一切时,你也会有这种感觉。 " +"尽管已经阅读过这篇文章,你最终还是会被它坑到!" + +#: ../../howto/sockets.rst:246 +msgid "" +"In the interests of space, building your character, (and preserving my " +"competitive position), these enhancements are left as an exercise for the " +"reader. Lets move on to cleaning up." +msgstr "限于篇幅,磨练你的意志,(以及保持我的竞争优势),这些改进将留给读者作为练习。现在让我们继续。" + +#: ../../howto/sockets.rst:252 +msgid "Binary Data" +msgstr "二进制数据" + +#: ../../howto/sockets.rst:254 +msgid "" +"It is perfectly possible to send binary data over a socket. The major " +"problem is that not all machines use the same formats for binary data. For " +"example, `network byte order " +"`_ is big-endian, with " +"the most significant byte first, so a 16 bit integer with the value ``1`` " +"would be the two hex bytes ``00 01``. However, most common processors " +"(x86/AMD64, ARM, RISC-V), are little-endian, with the least significant byte" +" first - that same ``1`` would be ``01 00``." +msgstr "" +"通过套接字发送二进制数据是完全可能的。主要问题是,并非所有机器都使用相同的二进制数据格式。例如,`网络字节顺序 " +"`_ 是大端序的,最大的字节在前,所以一个值为" +" ``1`` 的 16 位整数将是两个十六进制字节 ``00 01``。然而,大多数常见的处理器(x86 / AMD64 " +",ARM,RISC-V)是小端序的,最小的字节在前 -- 同样的 ``1`` 将是 ``01 00``。" + +#: ../../howto/sockets.rst:262 +msgid "" +"Socket libraries have calls for converting 16 and 32 bit integers - ``ntohl," +" htonl, ntohs, htons`` where \"n\" means *network* and \"h\" means *host*, " +"\"s\" means *short* and \"l\" means *long*. Where network order is host " +"order, these do nothing, but where the machine is byte-reversed, these swap " +"the bytes around appropriately." +msgstr "" +"Socket 库有转换 16 位和 32 位整数的调用 - ``ntohl, htonl, ntohs, htons``,其中 \"n\" 表示 " +"*网络* , \"h\" 表示 *主机* , \"s\" 表示 *short* , \"l\" 表示 *long* " +"。当网络顺序与主机顺序相同时,这些调用不做任何事情,但当机器的字节序相反时,这些调用会适当地交换字节。" + +#: ../../howto/sockets.rst:268 +msgid "" +"In these days of 64-bit machines, the ASCII representation of binary data is" +" frequently smaller than the binary representation. That's because a " +"surprising amount of the time, most integers have the value 0, or maybe 1. " +"The string ``\"0\"`` would be two bytes, while a full 64-bit integer would " +"be 8. Of course, this doesn't fit well with fixed-length messages. " +"Decisions, decisions." +msgstr "" +"在现今的 64 位机器中,二进制数据的 ASCII 表示往往比二进制表示要小。这是因为在非常多的时候大部分整数的值均为 0 或者 1。字符串形式的 " +"``\"0\"`` 为两个字节,而一个完整的 64 位整数将是八个。当然这不适用于固定长度的信息。自行决定,请自行决定。" + +#: ../../howto/sockets.rst:277 +msgid "Disconnecting" +msgstr "断开连接" + +#: ../../howto/sockets.rst:279 +msgid "" +"Strictly speaking, you're supposed to use ``shutdown`` on a socket before " +"you ``close`` it. The ``shutdown`` is an advisory to the socket at the " +"other end. Depending on the argument you pass it, it can mean \"I'm not " +"going to send anymore, but I'll still listen\", or \"I'm not listening, good" +" riddance!\". Most socket libraries, however, are so used to programmers " +"neglecting to use this piece of etiquette that normally a ``close`` is the " +"same as ``shutdown(); close()``. So in most situations, an explicit " +"``shutdown`` is not needed." +msgstr "" +"严格地讲,你应该在 ``close`` 它之前将套接字 ``shutdown``。``shutdown`` " +"是发送给套接字另一端的一种建议。调用时参数不同意义也不一样,它可能意味着「我不会再发送了,但我仍然会监听」,或者「我没有监听了,真棒!」。然而,大多数套接字库或者程序员都习惯了忽略使用这种礼节,因为通常情况下" +" ``close`` 与 ``shutdown(); close()`` 是一样的。所以在大多数情况下,不需要显式的 ``shutdown``。" + +#: ../../howto/sockets.rst:287 +msgid "" +"One way to use ``shutdown`` effectively is in an HTTP-like exchange. The " +"client sends a request and then does a ``shutdown(1)``. This tells the " +"server \"This client is done sending, but can still receive.\" The server " +"can detect \"EOF\" by a receive of 0 bytes. It can assume it has the " +"complete request. The server sends a reply. If the ``send`` completes " +"successfully then, indeed, the client was still receiving." +msgstr "" +"高效使用 ``shutdown`` 的一种方法是在类似 HTTP 的交换中。客户端发送请求,然后执行 ``shutdown(1)``。 " +"这告诉服务器“此客户端已完成发送,但仍可以接收”。服务器可以通过接收 0 字节来检测“EOF”。它可以假设它有完整的请求。服务器发送回复。如果 " +"``send`` 成功完成,那么客户端仍在接收。" + +#: ../../howto/sockets.rst:294 +msgid "" +"Python takes the automatic shutdown a step further, and says that when a " +"socket is garbage collected, it will automatically do a ``close`` if it's " +"needed. But relying on this is a very bad habit. If your socket just " +"disappears without doing a ``close``, the socket at the other end may hang " +"indefinitely, thinking you're just being slow. *Please* ``close`` your " +"sockets when you're done." +msgstr "" +"Python 进一步自动关闭,并说当一个套接字被垃圾收集时,如果需要它会自动执行 ``close`` " +"。但依靠这个机制是一个非常坏的习惯。如果你的套接字在没有 ``close`` " +"的情况下就消失了,那么另一端的套接字可能会无限期地挂起,以为你只是慢了一步。完成后 *请* ``close`` 你的套接字。" + +#: ../../howto/sockets.rst:302 +msgid "When Sockets Die" +msgstr "套接字何时销毁" + +#: ../../howto/sockets.rst:304 +msgid "" +"Probably the worst thing about using blocking sockets is what happens when " +"the other side comes down hard (without doing a ``close``). Your socket is " +"likely to hang. TCP is a reliable protocol, and it will wait a long, long " +"time before giving up on a connection. If you're using threads, the entire " +"thread is essentially dead. There's not much you can do about it. As long as" +" you aren't doing something dumb, like holding a lock while doing a blocking" +" read, the thread isn't really consuming much in the way of resources. Do " +"*not* try to kill the thread - part of the reason that threads are more " +"efficient than processes is that they avoid the overhead associated with the" +" automatic recycling of resources. In other words, if you do manage to kill " +"the thread, your whole process is likely to be screwed up." +msgstr "" +"使用阻塞套接字最糟糕的事情可能就是当另一边下线时 (没有 ``close``) 会发生什么。你的套接字可能会挂起。TCP " +"是一种可靠的协议,它会在放弃连接之前等待很长时间。如果你正在使用线程,那么整个线程基本上已经死了。你无能为力。只要你没有做一些愚蠢的事情,比如在进行阻塞读取时持有一个锁,那么线程并没有真正消耗掉资源。" +" *不要* 尝试杀死线程 —— 线程比进程更有效的部分原因是它们避免了与自动回收资源相关的开销。换句话说,如果你设法杀死线程,你的整个进程很可能被搞坏。" + +#: ../../howto/sockets.rst:318 +msgid "Non-blocking Sockets" +msgstr "非阻塞的套接字" + +#: ../../howto/sockets.rst:320 +msgid "" +"If you've understood the preceding, you already know most of what you need " +"to know about the mechanics of using sockets. You'll still use the same " +"calls, in much the same ways. It's just that, if you do it right, your app " +"will be almost inside-out." +msgstr "" +"如果你已理解上述内容,那么你已经了解了使用套接字的机制所需了解的大部分内容。你仍将以相同的方式使用相同的函数调用。 " +"只是,如果你做得对,你的应用程序几乎是由内到外的。" + +#: ../../howto/sockets.rst:325 +msgid "" +"In Python, you use ``socket.setblocking(False)`` to make it non-blocking. In" +" C, it's more complex, (for one thing, you'll need to choose between the BSD" +" flavor ``O_NONBLOCK`` and the almost indistinguishable POSIX flavor " +"``O_NDELAY``, which is completely different from ``TCP_NODELAY``), but it's " +"the exact same idea. You do this after creating the socket, but before using" +" it. (Actually, if you're nuts, you can switch back and forth.)" +msgstr "" +"在 Python 中是使用 ``socket.setblocking(False)`` 来设置非阻塞。在 C 中的做法更为复杂(例如,你需要在 BSD " +"风格的 ``O_NONBLOCK`` 和几乎无区别的 POSIX 风格的 ``O_NDELAY`` 之间作出选择,这与 ``TCP_NODELAY`` " +"完全不一样),但其思路实际上是相同的。你要在创建套接字之后但在使用它之前执行此操作。 (实际上,如果你是疯子的话也可以反复进行切换。)" + +#: ../../howto/sockets.rst:332 +msgid "" +"The major mechanical difference is that ``send``, ``recv``, ``connect`` and " +"``accept`` can return without having done anything. You have (of course) a " +"number of choices. You can check return code and error codes and generally " +"drive yourself crazy. If you don't believe me, try it sometime. Your app " +"will grow large, buggy and suck CPU. So let's skip the brain-dead solutions " +"and do it right." +msgstr "" +"主要的机制差异是 ``send``、``recv``、``connect`` 和 ``accept`` 可以在没有做任何事情的情况下返回。 " +"你(当然)有很多选择。你可以检查返回代码和错误代码,通常会让自己发疯。如果你不相信我,请尝试一下。你的应用程序将变得越来越大、越来越多 bug、吸干 " +"CPU。因此,让我们跳过伤脑的解决方案并做正确的事。" + +#: ../../howto/sockets.rst:339 +msgid "Use ``select``." +msgstr "使用 ``select`` 库" + +#: ../../howto/sockets.rst:341 +msgid "" +"In C, coding ``select`` is fairly complex. In Python, it's a piece of cake, " +"but it's close enough to the C version that if you understand ``select`` in " +"Python, you'll have little trouble with it in C::" +msgstr "" +"在 C 中,编码 ``select`` 相当复杂。在 Python 中,它是很简单,但它与 C 版本足够接近,如果你在 Python 中理解 " +"``select``,那么在 C 中你几乎不会遇到麻烦::" + +#: ../../howto/sockets.rst:345 +msgid "" +"ready_to_read, ready_to_write, in_error = \\\n" +" select.select(\n" +" potential_readers,\n" +" potential_writers,\n" +" potential_errs,\n" +" timeout)" +msgstr "" +"ready_to_read, ready_to_write, in_error = \\\n" +" select.select(\n" +" potential_readers,\n" +" potential_writers,\n" +" potential_errs,\n" +" timeout)" + +#: ../../howto/sockets.rst:352 +msgid "" +"You pass ``select`` three lists: the first contains all sockets that you " +"might want to try reading; the second all the sockets you might want to try " +"writing to, and the last (normally left empty) those that you want to check " +"for errors. You should note that a socket can go into more than one list. " +"The ``select`` call is blocking, but you can give it a timeout. This is " +"generally a sensible thing to do - give it a nice long timeout (say a " +"minute) unless you have good reason to do otherwise." +msgstr "" +"你传递给 ``select`` " +"三个列表:第一个包含你可能想要尝试读取的所有套接字;第二个是你可能想要尝试写入的所有套接字,以及要检查错误的最后一个(通常为空)。你应该注意,套接字可以进入多个列表。" +" ``select`` 调用是阻塞的,但你可以给它一个超时。这通常是一件明智的事情 —— 给它一个很长的超时(比如一分钟),除非你有充分的理由不这样做。" + +#: ../../howto/sockets.rst:360 +msgid "" +"In return, you will get three lists. They contain the sockets that are " +"actually readable, writable and in error. Each of these lists is a subset " +"(possibly empty) of the corresponding list you passed in." +msgstr "作为返回,你将获得三个列表。它们包含实际可读、可写和有错误的套接字。这些列表中的每一个都是你传入的相应列表的子集(可能为空)。" + +#: ../../howto/sockets.rst:364 +msgid "" +"If a socket is in the output readable list, you can be as-close-to-certain-" +"as-we-ever-get-in-this-business that a ``recv`` on that socket will return " +"*something*. Same idea for the writable list. You'll be able to send " +"*something*. Maybe not all you want to, but *something* is better than " +"nothing. (Actually, any reasonably healthy socket will return as writable -" +" it just means outbound network buffer space is available.)" +msgstr "" +"如果一个套接字在输出可读列表中,你几乎可以确定那个套接字上的 ``recv`` 将返回 *一些内容* 。可写列表的也相同,你将能够发送 *一些内容* 。" +" 也许不是你想要的全部,但 *有些东西* 比没有东西更好。 (实际上,任何合理健康的套接字都将以可写方式返回 —— " +"它只是意味着出站网络缓冲区空间可用。)" + +#: ../../howto/sockets.rst:371 +msgid "" +"If you have a \"server\" socket, put it in the potential_readers list. If it" +" comes out in the readable list, your ``accept`` will (almost certainly) " +"work. If you have created a new socket to ``connect`` to someone else, put " +"it in the potential_writers list. If it shows up in the writable list, you " +"have a decent chance that it has connected." +msgstr "" +"如果你有一个“服务器”套接字,请将其放在 potential_readers 列表中。如果它出现在可读列表中,那么你的 ``accept`` " +"(几乎肯定)会起作用。如果你已经创建了一个新的套接字 ``connect`` 其他人,请将它放在 potential_writers " +"列表中。如果它出现在可写列表中,那么它有可能已连接。" + +#: ../../howto/sockets.rst:377 +msgid "" +"Actually, ``select`` can be handy even with blocking sockets. It's one way " +"of determining whether you will block - the socket returns as readable when " +"there's something in the buffers. However, this still doesn't help with the" +" problem of determining whether the other end is done, or just busy with " +"something else." +msgstr "" +"实际上,即使使用阻塞套接字,``select`` 也很方便。这是确定是否阻塞的一种方法 —— " +"当缓冲区中存在某些内容时,套接字返回为可读。然而,这仍然无助于确定另一端是否完成或者只是忙于其他事情的问题。" + +#: ../../howto/sockets.rst:382 +msgid "" +"**Portability alert**: On Unix, ``select`` works both with the sockets and " +"files. Don't try this on Windows. On Windows, ``select`` works with sockets " +"only. Also note that in C, many of the more advanced socket options are done" +" differently on Windows. In fact, on Windows I usually use threads (which " +"work very, very well) with my sockets." +msgstr "" +"**可移植性警告** :在 Unix 上,``select`` 适用于套接字和文件。不要在 Windows 上尝试。在 Windows 上, " +"``select`` 仅适用于套接字。另请注意,在 C 中,许多更高级的套接字选项在 Windows 上的执行方式不同。事实上,在 Windows " +"上我通常将线程与套接字配合使用(效果非常非常好)。" diff --git a/howto/sorting.po b/howto/sorting.po new file mode 100644 index 0000000000..1bdbdc28db --- /dev/null +++ b/howto/sorting.po @@ -0,0 +1,786 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../howto/sorting.rst:4 +msgid "Sorting Techniques" +msgstr "排序的技术" + +#: ../../howto/sorting.rst:0 +msgid "Author" +msgstr "作者" + +#: ../../howto/sorting.rst:6 +msgid "Andrew Dalke and Raymond Hettinger" +msgstr "Andrew Dalke 与 Raymond Hettinger" + +#: ../../howto/sorting.rst:9 +msgid "" +"Python lists have a built-in :meth:`list.sort` method that modifies the list" +" in-place. There is also a :func:`sorted` built-in function that builds a " +"new sorted list from an iterable." +msgstr "内置列表方法 :meth:`list.sort` 原地修改列表,而内置函数 :func:`sorted` 由可迭代对象新建有序列表。" + +#: ../../howto/sorting.rst:13 +msgid "" +"In this document, we explore the various techniques for sorting data using " +"Python." +msgstr "在本文档中,我们将探索使用 Python 对数据进行排序的各种技术。" + +#: ../../howto/sorting.rst:17 +msgid "Sorting Basics" +msgstr "排序的基础知识" + +#: ../../howto/sorting.rst:19 +msgid "" +"A simple ascending sort is very easy: just call the :func:`sorted` function." +" It returns a new sorted list:" +msgstr "普通的升序排序非常容易:只需调用 :func:`sorted` 函数。它返回新有序列表:" + +#: ../../howto/sorting.rst:22 +msgid "" +">>> sorted([5, 2, 3, 1, 4])\n" +"[1, 2, 3, 4, 5]" +msgstr "" +">>> sorted([5, 2, 3, 1, 4])\n" +"[1, 2, 3, 4, 5]" + +#: ../../howto/sorting.rst:27 +msgid "" +"You can also use the :meth:`list.sort` method. It modifies the list in-place" +" (and returns ``None`` to avoid confusion). Usually it's less convenient " +"than :func:`sorted` - but if you don't need the original list, it's slightly" +" more efficient." +msgstr "" +"亦可用 :meth:`list.sort` 方法。它原地修改原列表(并返回 ``None`` 以避免混淆)。往往不如 :func:`sorted` " +"方便——但若不需原列表,用它会略高效些。" + +#: ../../howto/sorting.rst:32 +msgid "" +">>> a = [5, 2, 3, 1, 4]\n" +">>> a.sort()\n" +">>> a\n" +"[1, 2, 3, 4, 5]" +msgstr "" +">>> a = [5, 2, 3, 1, 4]\n" +">>> a.sort()\n" +">>> a\n" +"[1, 2, 3, 4, 5]" + +#: ../../howto/sorting.rst:39 +msgid "" +"Another difference is that the :meth:`list.sort` method is only defined for " +"lists. In contrast, the :func:`sorted` function accepts any iterable." +msgstr "另一个区别是 :meth:`list.sort` 方法只为列表定义,而 :func:`sorted` 函数接受任何可迭代对象。" + +#: ../../howto/sorting.rst:42 +msgid "" +">>> sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'})\n" +"[1, 2, 3, 4, 5]" +msgstr "" +">>> sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'})\n" +"[1, 2, 3, 4, 5]" + +#: ../../howto/sorting.rst:48 +msgid "Key Functions" +msgstr "键函数" + +#: ../../howto/sorting.rst:50 +msgid "" +"The :meth:`list.sort` method and the functions :func:`sorted`, :func:`min`, " +":func:`max`, :func:`heapq.nsmallest`, and :func:`heapq.nlargest` have a " +"*key* parameter to specify a function (or other callable) to be called on " +"each list element prior to making comparisons." +msgstr "" +":meth:`list.sort` 方法以及 :func:`sorted`, :func:`min`, :func:`max`, " +":func:`heapq.nsmallest` 和 :func:`heapq.nlargest` 等函数都有一个 *key* " +"形参用以指定要在进行比较之前对每个列表元素调用的函数(或其它可调用对象)。" + +#: ../../howto/sorting.rst:56 +msgid "" +"For example, here's a case-insensitive string comparison using " +":meth:`str.casefold`:" +msgstr "例如,下面是使用 :meth:`str.casefold` 进行不区分大小写的字符串比较:" + +#: ../../howto/sorting.rst:59 +msgid "" +">>> sorted(\"This is a test string from Andrew\".split(), key=str.casefold)\n" +"['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']" +msgstr "" +">>> sorted(\"This is a test string from Andrew\".split(), key=str.casefold)\n" +"['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']" + +#: ../../howto/sorting.rst:64 +msgid "" +"The value of the *key* parameter should be a function (or other callable) " +"that takes a single argument and returns a key to use for sorting purposes. " +"This technique is fast because the key function is called exactly once for " +"each input record." +msgstr "*key* 形参的值需为一元函数(或其它可调用对象),其返回值用于排序。这很快,因为键函数只需在输入的每个记录上调用恰好一次。" + +#: ../../howto/sorting.rst:69 +msgid "" +"A common pattern is to sort complex objects using some of the object's " +"indices as keys. For example:" +msgstr "常见的模式是用对象的某一些索引作为键对复杂对象排序。例如:" + +#: ../../howto/sorting.rst:72 +msgid "" +">>> student_tuples = [\n" +"... ('john', 'A', 15),\n" +"... ('jane', 'B', 12),\n" +"... ('dave', 'B', 10),\n" +"... ]\n" +">>> sorted(student_tuples, key=lambda student: student[2]) # sort by age\n" +"[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]" +msgstr "" +">>> student_tuples = [\n" +"... ('john', 'A', 15),\n" +"... ('jane', 'B', 12),\n" +"... ('dave', 'B', 10),\n" +"... ]\n" +">>> sorted(student_tuples, key=lambda student: student[2]) # 按年龄排序\n" +"[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]" + +#: ../../howto/sorting.rst:82 +msgid "" +"The same technique works for objects with named attributes. For example:" +msgstr "同样的方法对于有具名属性的对象也适用。例如:" + +#: ../../howto/sorting.rst:84 +msgid "" +">>> class Student:\n" +"... def __init__(self, name, grade, age):\n" +"... self.name = name\n" +"... self.grade = grade\n" +"... self.age = age\n" +"... def __repr__(self):\n" +"... return repr((self.name, self.grade, self.age))\n" +"\n" +">>> student_objects = [\n" +"... Student('john', 'A', 15),\n" +"... Student('jane', 'B', 12),\n" +"... Student('dave', 'B', 10),\n" +"... ]\n" +">>> sorted(student_objects, key=lambda student: student.age) # sort by age\n" +"[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]" +msgstr "" +">>> class Student:\n" +"... def __init__(self, name, grade, age):\n" +"... self.name = name\n" +"... self.grade = grade\n" +"... self.age = age\n" +"... def __repr__(self):\n" +"... return repr((self.name, self.grade, self.age))\n" +"\n" +">>> student_objects = [\n" +"... Student('john', 'A', 15),\n" +"... Student('jane', 'B', 12),\n" +"... Student('dave', 'B', 10),\n" +"... ]\n" +">>> sorted(student_objects, key=lambda student: student.age) # 按年龄排序\n" +"[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]" + +#: ../../howto/sorting.rst:102 +msgid "" +"Objects with named attributes can be made by a regular class as shown above," +" or they can be instances of :class:`~dataclasses.dataclass` or a " +":term:`named tuple`." +msgstr "" +"有具名属性的对象可像上面这样用一个常规的类来创建,亦可是 :class:`~dataclasses.dataclass` 实例或 " +":term:`named tuple`." + +#: ../../howto/sorting.rst:107 +msgid "Operator Module Functions and Partial Function Evaluation" +msgstr "运算符模块的函数与函数的偏求值" + +#: ../../howto/sorting.rst:109 +msgid "" +"The :term:`key function` patterns shown above are very common, so Python " +"provides convenience functions to make accessor functions easier and faster." +" The :mod:`operator` module has :func:`~operator.itemgetter`, " +":func:`~operator.attrgetter`, and a :func:`~operator.methodcaller` function." +msgstr "" +"上述 :term:`key function` 模式相当常见,为了让访问器函数更加好写好用,Python " +"提供了一些便捷函数。:mod:`operator` 模块里有 " +":func:`~operator.itemgetter`、:func:`~operator.attrgetter` 和 " +":func:`~operator.methodcaller` 函数。" + +#: ../../howto/sorting.rst:114 +msgid "Using those functions, the above examples become simpler and faster:" +msgstr "用了那些函数之后,前面的示例变得更简单,运行起来也更快:" + +#: ../../howto/sorting.rst:116 +msgid "" +">>> from operator import itemgetter, attrgetter\n" +"\n" +">>> sorted(student_tuples, key=itemgetter(2))\n" +"[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]\n" +"\n" +">>> sorted(student_objects, key=attrgetter('age'))\n" +"[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]" +msgstr "" +">>> from operator import itemgetter, attrgetter\n" +"\n" +">>> sorted(student_tuples, key=itemgetter(2))\n" +"[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]\n" +"\n" +">>> sorted(student_objects, key=attrgetter('age'))\n" +"[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]" + +#: ../../howto/sorting.rst:126 +msgid "" +"The operator module functions allow multiple levels of sorting. For example," +" to sort by *grade* then by *age*:" +msgstr "运算符模块的函数可以用来作多级排序。例如,按 *grade* 排序,然后按 *age* 排序:" + +#: ../../howto/sorting.rst:129 +msgid "" +">>> sorted(student_tuples, key=itemgetter(1,2))\n" +"[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]\n" +"\n" +">>> sorted(student_objects, key=attrgetter('grade', 'age'))\n" +"[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]" +msgstr "" +">>> sorted(student_tuples, key=itemgetter(1,2))\n" +"[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]\n" +"\n" +">>> sorted(student_objects, key=attrgetter('grade', 'age'))\n" +"[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]" + +#: ../../howto/sorting.rst:137 +msgid "" +"The :mod:`functools` module provides another helpful tool for making key-" +"functions. The :func:`~functools.partial` function can reduce the `arity " +"`_ of a multi-argument function making " +"it suitable for use as a key-function." +msgstr "" +"另一个有助于创建键函数的工具位于 :mod:`functools` 模块。:func:`~functools.partial` 函数可以降低多元函数的 " +"`元数 `_ 使之适合做键函数。" + +#: ../../howto/sorting.rst:142 +msgid "" +">>> from functools import partial\n" +">>> from unicodedata import normalize\n" +"\n" +">>> names = 'Zoë Åbjørn Núñez Élana Zeke Abe Nubia Eloise'.split()\n" +"\n" +">>> sorted(names, key=partial(normalize, 'NFD'))\n" +"['Abe', 'Åbjørn', 'Eloise', 'Élana', 'Nubia', 'Núñez', 'Zeke', 'Zoë']\n" +"\n" +">>> sorted(names, key=partial(normalize, 'NFC'))\n" +"['Abe', 'Eloise', 'Nubia', 'Núñez', 'Zeke', 'Zoë', 'Åbjørn', 'Élana']" +msgstr "" +">>> from functools import partial\n" +">>> from unicodedata import normalize\n" +"\n" +">>> names = 'Zoë Åbjørn Núñez Élana Zeke Abe Nubia Eloise'.split()\n" +"\n" +">>> sorted(names, key=partial(normalize, 'NFD'))\n" +"['Abe', 'Åbjørn', 'Eloise', 'Élana', 'Nubia', 'Núñez', 'Zeke', 'Zoë']\n" +"\n" +">>> sorted(names, key=partial(normalize, 'NFC'))\n" +"['Abe', 'Eloise', 'Nubia', 'Núñez', 'Zeke', 'Zoë', 'Åbjørn', 'Élana']" + +#: ../../howto/sorting.rst:156 +msgid "Ascending and Descending" +msgstr "升序与降序" + +#: ../../howto/sorting.rst:158 +msgid "" +"Both :meth:`list.sort` and :func:`sorted` accept a *reverse* parameter with " +"a boolean value. This is used to flag descending sorts. For example, to get " +"the student data in reverse *age* order:" +msgstr "" +":meth:`list.sort` 和 :func:`sorted` 接受布尔形参 *reverse* 用于标记降序排序。例如,将学生数据按 *age*" +" 倒序排序:" + +#: ../../howto/sorting.rst:162 +msgid "" +">>> sorted(student_tuples, key=itemgetter(2), reverse=True)\n" +"[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]\n" +"\n" +">>> sorted(student_objects, key=attrgetter('age'), reverse=True)\n" +"[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]" +msgstr "" +">>> sorted(student_tuples, key=itemgetter(2), reverse=True)\n" +"[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]\n" +"\n" +">>> sorted(student_objects, key=attrgetter('age'), reverse=True)\n" +"[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]" + +#: ../../howto/sorting.rst:171 +msgid "Sort Stability and Complex Sorts" +msgstr "排序稳定性与复杂排序" + +#: ../../howto/sorting.rst:173 +msgid "" +"Sorts are guaranteed to be `stable " +"`_\\. That means " +"that when multiple records have the same key, their original order is " +"preserved." +msgstr "" +"排序保证 `稳定 " +"`_:等键记录保持原始顺序。" + +#: ../../howto/sorting.rst:177 +msgid "" +">>> data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)]\n" +">>> sorted(data, key=itemgetter(0))\n" +"[('blue', 1), ('blue', 2), ('red', 1), ('red', 2)]" +msgstr "" +">>> data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)]\n" +">>> sorted(data, key=itemgetter(0))\n" +"[('blue', 1), ('blue', 2), ('red', 1), ('red', 2)]" + +#: ../../howto/sorting.rst:183 +msgid "" +"Notice how the two records for *blue* retain their original order so that " +"``('blue', 1)`` is guaranteed to precede ``('blue', 2)``." +msgstr "注意 *blue* 的两个记录是如何保序的: ``('blue', 1)`` 保证先于 ``('blue', 2)``。" + +#: ../../howto/sorting.rst:186 +msgid "" +"This wonderful property lets you build complex sorts in a series of sorting " +"steps. For example, to sort the student data by descending *grade* and then " +"ascending *age*, do the *age* sort first and then sort again using *grade*:" +msgstr "" +"这个了不起的特性使得借助一系列排序步骤构建出复杂排序成为可能。例如,要按 *grade* 降序后 *age* 升序排序学生数据,只需先用 *age* " +"排序再用 *grade* 排序即可:" + +#: ../../howto/sorting.rst:190 +msgid "" +">>> s = sorted(student_objects, key=attrgetter('age')) # sort on secondary key\n" +">>> sorted(s, key=attrgetter('grade'), reverse=True) # now sort on primary key, descending\n" +"[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]" +msgstr "" +">>> s = sorted(student_objects, key=attrgetter('age')) # 根据次要键(年龄)排序\n" +">>> sorted(s, key=attrgetter('grade'), reverse=True) # 现在根据主要键(成绩)降序排序\n" +"[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]" + +#: ../../howto/sorting.rst:196 +msgid "" +"This can be abstracted out into a wrapper function that can take a list and " +"tuples of field and order to sort them on multiple passes." +msgstr "可抽象为包装函数,依据接收的一些字段序的元组对接收的列表做多趟排序。" + +#: ../../howto/sorting.rst:199 +msgid "" +">>> def multisort(xs, specs):\n" +"... for key, reverse in reversed(specs):\n" +"... xs.sort(key=attrgetter(key), reverse=reverse)\n" +"... return xs\n" +"\n" +">>> multisort(list(student_objects), (('grade', True), ('age', False)))\n" +"[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]" +msgstr "" +">>> def multisort(xs, specs):\n" +"... for key, reverse in reversed(specs):\n" +"... xs.sort(key=attrgetter(key), reverse=reverse)\n" +"... return xs\n" +"\n" +">>> multisort(list(student_objects), (('grade', True), ('age', False)))\n" +"[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]" + +#: ../../howto/sorting.rst:209 +msgid "" +"The `Timsort `_ algorithm used in " +"Python does multiple sorts efficiently because it can take advantage of any " +"ordering already present in a dataset." +msgstr "" +"Python 中使用的 `Timsort `_ " +"算法可以借助数据集中任何已有的有序性来高效地进行多种排序。" + +#: ../../howto/sorting.rst:214 +msgid "Decorate-Sort-Undecorate" +msgstr "装饰 - 排序 - 去装饰" + +#: ../../howto/sorting.rst:216 +msgid "This idiom is called Decorate-Sort-Undecorate after its three steps:" +msgstr "装饰 - 排序 - 去装饰 (Decorate-Sort-Undecorate) 得名于它的三个步骤:" + +#: ../../howto/sorting.rst:218 +msgid "" +"First, the initial list is decorated with new values that control the sort " +"order." +msgstr "首先,用控制排序顺序的新值装饰初始列表。" + +#: ../../howto/sorting.rst:220 +msgid "Second, the decorated list is sorted." +msgstr "其次,排序装饰后的列表。" + +#: ../../howto/sorting.rst:222 +msgid "" +"Finally, the decorations are removed, creating a list that contains only the" +" initial values in the new order." +msgstr "最后,去除装饰即得按新顺序排列的初始值的列表。" + +#: ../../howto/sorting.rst:225 +msgid "" +"For example, to sort the student data by *grade* using the DSU approach:" +msgstr "例如,用 DSU 方法按 *grade* 排序学生数据:" + +#: ../../howto/sorting.rst:227 +msgid "" +">>> decorated = [(student.grade, i, student) for i, student in enumerate(student_objects)]\n" +">>> decorated.sort()\n" +">>> [student for grade, i, student in decorated] # undecorate\n" +"[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]" +msgstr "" +">>> decorated = [(student.grade, i, student) for i, student in enumerate(student_objects)]\n" +">>> decorated.sort()\n" +">>> [student for grade, i, student in decorated] # 取消装饰\n" +"[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]" + +#: ../../howto/sorting.rst:234 +msgid "" +"This idiom works because tuples are compared lexicographically; the first " +"items are compared; if they are the same then the second items are compared," +" and so on." +msgstr "这个方法之所以有效是因为元组按字典顺序进行比较,先比较第一项;如果它们相同则比较第二个项目,依此类推。" + +#: ../../howto/sorting.rst:238 +msgid "" +"It is not strictly necessary in all cases to include the index *i* in the " +"decorated list, but including it gives two benefits:" +msgstr "不一定在所有情况下都要在装饰列表中包含索引 *i* ,但包含它有两个好处:" + +#: ../../howto/sorting.rst:241 +msgid "" +"The sort is stable -- if two items have the same key, their order will be " +"preserved in the sorted list." +msgstr "排序是稳定的——如果两个项具有相同的键,它们的顺序将保留在排序列表中。" + +#: ../../howto/sorting.rst:244 +msgid "" +"The original items do not have to be comparable because the ordering of the " +"decorated tuples will be determined by at most the first two items. So for " +"example the original list could contain complex numbers which cannot be " +"sorted directly." +msgstr "原始项目不必具有可比性,因为装饰元组的排序最多由前两项决定。因此,例如原始列表可能包含无法直接排序的复数。" + +#: ../../howto/sorting.rst:249 +msgid "" +"Another name for this idiom is `Schwartzian transform " +"`_\\, after Randal L. " +"Schwartz, who popularized it among Perl programmers." +msgstr "" +"这个方法的另一个名字是 Randal L. Schwartz 在 Perl 程序员中推广的 `Schwartzian transform " +"`_\\ ." + +#: ../../howto/sorting.rst:253 +msgid "" +"Now that Python sorting provides key-functions, this technique is not often " +"needed." +msgstr "既然 Python 排序提供了键函数,那么通常不需要这种技术。" + +#: ../../howto/sorting.rst:256 +msgid "Comparison Functions" +msgstr "比较函数" + +#: ../../howto/sorting.rst:258 +msgid "" +"Unlike key functions that return an absolute value for sorting, a comparison" +" function computes the relative ordering for two inputs." +msgstr "与返回一个用于排序的绝对值的键函数不同,比较函数是计算两个输入的相对排序。" + +#: ../../howto/sorting.rst:261 +msgid "" +"For example, a `balance scale " +"`_" +" compares two samples giving a relative ordering: lighter, equal, or " +"heavier. Likewise, a comparison function such as ``cmp(a, b)`` will return a" +" negative value for less-than, zero if the inputs are equal, or a positive " +"value for greater-than." +msgstr "" +"例如,一个 `天平 " +"`_" +" 会比较两个样本并给出一个相对排序:较轻、相等或较重。类似地,一个比较函数如 ``cmp(a, b)`` " +"将返回一个负值表示小于,零表示相等,或是一个正值表示大于。" + +#: ../../howto/sorting.rst:268 +msgid "" +"It is common to encounter comparison functions when translating algorithms " +"from other languages. Also, some libraries provide comparison functions as " +"part of their API. For example, :func:`locale.strcoll` is a comparison " +"function." +msgstr "" +"当从其他语言转写算法时经常会遇到比较函数。此外,某些库也提供了比较函数作为其 API 的组成部分。例如,:func:`locale.strcoll` " +"就是一个比较函数。" + +#: ../../howto/sorting.rst:272 +msgid "" +"To accommodate those situations, Python provides " +":class:`functools.cmp_to_key` to wrap the comparison function to make it " +"usable as a key function::" +msgstr "" +"为了适应这些情况,Python 提供了 :class:`functools.cmp_to_key` 用来包装比较函数使其可以作为键函数来使用::" + +#: ../../howto/sorting.rst:276 +msgid "sorted(words, key=cmp_to_key(strcoll)) # locale-aware sort order" +msgstr "sorted(words, key=cmp_to_key(strcoll)) # 基于地区的排序规则" + +#: ../../howto/sorting.rst:279 +msgid "Strategies For Unorderable Types and Values" +msgstr "不可排序类型和值的策略" + +#: ../../howto/sorting.rst:281 +msgid "" +"A number of type and value issues can arise when sorting. Here are some " +"strategies that can help:" +msgstr "在排序时可能出现多种涉及类型和值的问题。下面是一些有助于解决问题的策略:" + +#: ../../howto/sorting.rst:284 +msgid "Convert non-comparable input types to strings prior to sorting:" +msgstr "在排序之前将不可比较的输入类型转换为字符串:" + +#: ../../howto/sorting.rst:286 +msgid "" +">>> data = ['twelve', '11', 10]\n" +">>> sorted(map(str, data))\n" +"['10', '11', 'twelve']" +msgstr "" +">>> data = ['twelve', '11', 10]\n" +">>> sorted(map(str, data))\n" +"['10', '11', 'twelve']" + +#: ../../howto/sorting.rst:292 +msgid "" +"This is needed because most cross-type comparisons raise a :exc:`TypeError`." +msgstr "需要这样做是因为大多数跨类型比较都会引发 :exc:`TypeError`。" + +#: ../../howto/sorting.rst:295 +msgid "Remove special values prior to sorting:" +msgstr "在排序之前移除特殊的值:" + +#: ../../howto/sorting.rst:297 +msgid "" +">>> from math import isnan\n" +">>> from itertools import filterfalse\n" +">>> data = [3.3, float('nan'), 1.1, 2.2]\n" +">>> sorted(filterfalse(isnan, data))\n" +"[1.1, 2.2, 3.3]" +msgstr "" +">>> from math import isnan\n" +">>> from itertools import filterfalse\n" +">>> data = [3.3, float('nan'), 1.1, 2.2]\n" +">>> sorted(filterfalse(isnan, data))\n" +"[1.1, 2.2, 3.3]" + +#: ../../howto/sorting.rst:305 +msgid "" +"This is needed because the `IEEE-754 standard " +"`_ specifies that, \"Every NaN shall" +" compare unordered with everything, including itself.\"" +msgstr "" +"这是必要的,因为 `IEEE-754 标准 `_ 规定,\"每一个 " +"NaN 都应该与包括其自身在内的任何事物进行无序比较。\"" + +#: ../../howto/sorting.rst:309 +msgid "Likewise, ``None`` can be stripped from datasets as well:" +msgstr "同样,``None`` 也可以从数据集中剥离:" + +#: ../../howto/sorting.rst:311 +msgid "" +">>> data = [3.3, None, 1.1, 2.2]\n" +">>> sorted(x for x in data if x is not None)\n" +"[1.1, 2.2, 3.3]" +msgstr "" +">>> data = [3.3, None, 1.1, 2.2]\n" +">>> sorted(x for x in data if x is not None)\n" +"[1.1, 2.2, 3.3]" + +#: ../../howto/sorting.rst:317 +msgid "This is needed because ``None`` is not comparable to other types." +msgstr "这是必需的,因为 ``None`` 与其他类型不具有可比性。" + +#: ../../howto/sorting.rst:319 +msgid "Convert mapping types into sorted item lists before sorting:" +msgstr "在排序之前将映射类型转换为已排序的项列表:" + +#: ../../howto/sorting.rst:321 +msgid "" +">>> data = [{'a': 1}, {'b': 2}]\n" +">>> sorted(data, key=lambda d: sorted(d.items()))\n" +"[{'a': 1}, {'b': 2}]" +msgstr "" +">>> data = [{'a': 1}, {'b': 2}]\n" +">>> sorted(data, key=lambda d: sorted(d.items()))\n" +"[{'a': 1}, {'b': 2}]" + +#: ../../howto/sorting.rst:327 +msgid "" +"This is needed because dict-to-dict comparisons raise a :exc:`TypeError`." +msgstr "这是必需的,因为字典到字典的比较会引发 :exc:`TypeError`。" + +#: ../../howto/sorting.rst:330 +msgid "Convert set types into sorted lists before sorting:" +msgstr "在排序之前将集合类型转换为排序列表:" + +#: ../../howto/sorting.rst:332 +msgid "" +">>> data = [{'a', 'b', 'c'}, {'b', 'c', 'd'}]\n" +">>> sorted(map(sorted, data))\n" +"[['a', 'b', 'c'], ['b', 'c', 'd']]" +msgstr "" +">>> data = [{'a', 'b', 'c'}, {'b', 'c', 'd'}]\n" +">>> sorted(map(sorted, data))\n" +"[['a', 'b', 'c'], ['b', 'c', 'd']]" + +#: ../../howto/sorting.rst:338 +msgid "" +"This is needed because the elements contained in set types do not have a " +"deterministic order. For example, ``list({'a', 'b'})`` may produce either " +"``['a', 'b']`` or ``['b', 'a']``." +msgstr "" +"这是必需的,因为集合类型中包含的元素没有确定的顺序。例如,``list({'a', 'b'})`` 可以产生 ``['a', 'b']`` 或 " +"``['b', 'a']``。" + +#: ../../howto/sorting.rst:343 +msgid "Odds and Ends" +msgstr "杂项说明" + +#: ../../howto/sorting.rst:345 +msgid "" +"For locale aware sorting, use :func:`locale.strxfrm` for a key function or " +":func:`locale.strcoll` for a comparison function. This is necessary because" +" \"alphabetical\" sort orderings can vary across cultures even if the " +"underlying alphabet is the same." +msgstr "" +"对于可感知语言区域的排序,请使用 :func:`locale.strxfrm` 作为键函数或使用 :func:`locale.strcoll` " +"作为比较函数。因为在不同的文化中即便字母表相同,\"字母\"排列顺序也可能不同,所以这样做是必要的。" + +#: ../../howto/sorting.rst:350 +msgid "" +"The *reverse* parameter still maintains sort stability (so that records with" +" equal keys retain the original order). Interestingly, that effect can be " +"simulated without the parameter by using the builtin :func:`reversed` " +"function twice:" +msgstr "" +"*reverse* 参数仍然保持排序稳定性(因此具有相等键的记录保留原始顺序)。有趣的是,通过使用内置的 :func:`reversed` " +"函数两次,可以在没有参数的情况下模拟该效果:" + +#: ../../howto/sorting.rst:355 +msgid "" +">>> data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)]\n" +">>> standard_way = sorted(data, key=itemgetter(0), reverse=True)\n" +">>> double_reversed = list(reversed(sorted(reversed(data), key=itemgetter(0))))\n" +">>> assert standard_way == double_reversed\n" +">>> standard_way\n" +"[('red', 1), ('red', 2), ('blue', 1), ('blue', 2)]" +msgstr "" +">>> data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)]\n" +">>> standard_way = sorted(data, key=itemgetter(0), reverse=True)\n" +">>> double_reversed = list(reversed(sorted(reversed(data), key=itemgetter(0))))\n" +">>> assert standard_way == double_reversed\n" +">>> standard_way\n" +"[('red', 1), ('red', 2), ('blue', 1), ('blue', 2)]" + +#: ../../howto/sorting.rst:364 +msgid "" +"The sort routines use ``<`` when making comparisons between two objects. So," +" it is easy to add a standard sort order to a class by defining an " +":meth:`~object.__lt__` method:" +msgstr "" +"排序例程在两个对象之间进行比较时使用 ``<``。因此,通过定义一个 :meth:`~object.__lt__` " +"方法,就可以轻松地为类添加标准排序顺序:" + +#: ../../howto/sorting.rst:368 +msgid "" +">>> Student.__lt__ = lambda self, other: self.age < other.age\n" +">>> sorted(student_objects)\n" +"[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]" +msgstr "" +">>> Student.__lt__ = lambda self, other: self.age < other.age\n" +">>> sorted(student_objects)\n" +"[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]" + +#: ../../howto/sorting.rst:374 +msgid "" +"However, note that ``<`` can fall back to using :meth:`~object.__gt__` if " +":meth:`~object.__lt__` is not implemented (see :func:`object.__lt__` for " +"details on the mechanics). To avoid surprises, :pep:`8` recommends that all" +" six comparison methods be implemented. The " +":func:`~functools.total_ordering` decorator is provided to make that task " +"easier." +msgstr "" +"不过,请注意 ``<`` 在 :meth:`~object.__lt__` 未被实现时可以回退为使用 :meth:`~object.__gt__` " +"(请参阅 :func:`object.__lt__` 了解相关机制的细节)。为避免意外,:pep:`8` 建议实现所有的六个比较方法。 " +":func:`~functools.total_ordering` 装饰器被提供用来令此任务更为容易。" + +#: ../../howto/sorting.rst:381 +msgid "" +"Key functions need not depend directly on the objects being sorted. A key " +"function can also access external resources. For instance, if the student " +"grades are stored in a dictionary, they can be used to sort a separate list " +"of student names:" +msgstr "键函数不需要直接依赖于被排序的对象。键函数还可以访问外部资源。例如,如果学生成绩存储在字典中,则可以使用它们对单独的学生姓名列表进行排序:" + +#: ../../howto/sorting.rst:386 +msgid "" +">>> students = ['dave', 'john', 'jane']\n" +">>> newgrades = {'john': 'F', 'jane':'A', 'dave': 'C'}\n" +">>> sorted(students, key=newgrades.__getitem__)\n" +"['jane', 'dave', 'john']" +msgstr "" +">>> students = ['dave', 'john', 'jane']\n" +">>> newgrades = {'john': 'F', 'jane':'A', 'dave': 'C'}\n" +">>> sorted(students, key=newgrades.__getitem__)\n" +"['jane', 'dave', 'john']" + +#: ../../howto/sorting.rst:394 +msgid "Partial Sorts" +msgstr "部分排序" + +#: ../../howto/sorting.rst:396 +msgid "" +"Some applications require only some of the data to be ordered. The standard" +" library provides several tools that do less work than a full sort:" +msgstr "有些应用程序只需要对部分数据进行排序。标准库提供了几种工具可以执行比完整排序更轻量的任务:" + +#: ../../howto/sorting.rst:399 +msgid "" +":func:`min` and :func:`max` return the smallest and largest values, " +"respectively. These functions make a single pass over the input data and " +"require almost no auxiliary memory." +msgstr ":func:`min` 和 :func:`max` 可分别返回最小和最大值。这两个函数只需逐一检查输入数据而几乎不需要任何额外的内存。" + +#: ../../howto/sorting.rst:403 +msgid "" +":func:`heapq.nsmallest` and :func:`heapq.nlargest` return the *n* smallest " +"and largest values, respectively. These functions make a single pass over " +"the data keeping only *n* elements in memory at a time. For values of *n* " +"that are small relative to the number of inputs, these functions make far " +"fewer comparisons than a full sort." +msgstr "" +":func:`heapq.nsmallest` 和 :func:`heapq.nlargest` 可分别返回 *n* 个最小和最大的值。 " +"这两个函数每次只需逐一检查数据并仅需在内存中保留 *n* 个元素。对于相对于输入总数来说较小的 *n* 值来说,这两个函数将进行远少于完整排序的比较。" + +#: ../../howto/sorting.rst:409 +msgid "" +":func:`heapq.heappush` and :func:`heapq.heappop` create and maintain a " +"partially sorted arrangement of data that keeps the smallest element at " +"position ``0``. These functions are suitable for implementing priority " +"queues which are commonly used for task scheduling." +msgstr "" +":func:`heapq.heappush` 和 :func:`heapq.heappop` 会创建并维护一组部分排序的数据其中最小的元素将处在 " +"``0`` 位置上。这两个函数很适合实现常用于任务调度的优先级队列。" diff --git a/howto/timerfd.po b/howto/timerfd.po new file mode 100644 index 0000000000..d1402363b8 --- /dev/null +++ b/howto/timerfd.po @@ -0,0 +1,470 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../howto/timerfd.rst:5 +msgid "timer file descriptor HOWTO" +msgstr "定时器文件描述符指南" + +#: ../../howto/timerfd.rst:0 +msgid "Release" +msgstr "发布版本" + +#: ../../howto/timerfd.rst:7 +msgid "1.13" +msgstr "1.13" + +#: ../../howto/timerfd.rst:9 +msgid "" +"This HOWTO discusses Python's support for the linux timer file descriptor." +msgstr "本指南讨论了 Python 对 linux 定时器文件描述符的支持。" + +#: ../../howto/timerfd.rst:13 +msgid "Examples" +msgstr "例子" + +#: ../../howto/timerfd.rst:15 +msgid "" +"The following example shows how to use a timer file descriptor to execute a " +"function twice a second:" +msgstr "下面的例子演示了如何使用定时器文件描述符每秒钟执行两次某个函数:" + +#: ../../howto/timerfd.rst:18 +msgid "" +"# Practical scripts should use really use a non-blocking timer,\n" +"# we use a blocking timer here for simplicity.\n" +"import os, time\n" +"\n" +"# Create the timer file descriptor\n" +"fd = os.timerfd_create(time.CLOCK_REALTIME)\n" +"\n" +"# Start the timer in 1 second, with an interval of half a second\n" +"os.timerfd_settime(fd, initial=1, interval=0.5)\n" +"\n" +"try:\n" +" # Process timer events four times.\n" +" for _ in range(4):\n" +" # read() will block until the timer expires\n" +" _ = os.read(fd, 8)\n" +" print(\"Timer expired\")\n" +"finally:\n" +" # Remember to close the timer file descriptor!\n" +" os.close(fd)" +msgstr "" +"# 真正实用的脚本应当使用非阻塞型定时器,\n" +"# 这里我们使用阻塞型定时器是出于简单化考虑。\n" +"import os, time\n" +"\n" +"# 创建定时器文件描述符\n" +"fd = os.timerfd_create(time.CLOCK_REALTIME)\n" +"\n" +"# 在 1 秒钟时启动定时器,间隔时间为半秒\n" +"os.timerfd_settime(fd, initial=1, interval=0.5)\n" +"\n" +"try:\n" +" # 处理定时器事件四次。\n" +" for _ in range(4):\n" +" # read() 将会阻塞直到定时器过期\n" +" _ = os.read(fd, 8)\n" +" print(\"Timer expired\")\n" +"finally:\n" +" # 记住要关闭定时器文件描述符!\n" +" os.close(fd)" + +#: ../../howto/timerfd.rst:40 +msgid "" +"To avoid the precision loss caused by the :class:`float` type, timer file " +"descriptors allow specifying initial expiration and interval in integer " +"nanoseconds with ``_ns`` variants of the functions." +msgstr "" +"为避免 :class:`float` 类型导致的精度损失,定时器文件描述符允许使用这些函数的 ``_ns`` " +"变种形式以整数纳秒值指定初始到期时间和间隔。" + +#: ../../howto/timerfd.rst:44 +msgid "" +"This example shows how :func:`~select.epoll` can be used with timer file " +"descriptors to wait until the file descriptor is ready for reading:" +msgstr "这个例子演示了如何使用 :func:`~select.epoll` 配合定时器文件描述符来执行等待直到文件描述符准备好读取:" + +#: ../../howto/timerfd.rst:47 +msgid "" +"import os, time, select, socket, sys\n" +"\n" +"# Create an epoll object\n" +"ep = select.epoll()\n" +"\n" +"# In this example, use loopback address to send \"stop\" command to the server.\n" +"#\n" +"# $ telnet 127.0.0.1 1234\n" +"# Trying 127.0.0.1...\n" +"# Connected to 127.0.0.1.\n" +"# Escape character is '^]'.\n" +"# stop\n" +"# Connection closed by foreign host.\n" +"#\n" +"sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n" +"sock.bind((\"127.0.0.1\", 1234))\n" +"sock.setblocking(False)\n" +"sock.listen(1)\n" +"ep.register(sock, select.EPOLLIN)\n" +"\n" +"# Create timer file descriptors in non-blocking mode.\n" +"num = 3\n" +"fds = []\n" +"for _ in range(num):\n" +" fd = os.timerfd_create(time.CLOCK_REALTIME, flags=os.TFD_NONBLOCK)\n" +" fds.append(fd)\n" +" # Register the timer file descriptor for read events\n" +" ep.register(fd, select.EPOLLIN)\n" +"\n" +"# Start the timer with os.timerfd_settime_ns() in nanoseconds.\n" +"# Timer 1 fires every 0.25 seconds; timer 2 every 0.5 seconds; etc\n" +"for i, fd in enumerate(fds, start=1):\n" +" one_sec_in_nsec = 10**9\n" +" i = i * one_sec_in_nsec\n" +" os.timerfd_settime_ns(fd, initial=i//4, interval=i//4)\n" +"\n" +"timeout = 3\n" +"try:\n" +" conn = None\n" +" is_active = True\n" +" while is_active:\n" +" # Wait for the timer to expire for 3 seconds.\n" +" # epoll.poll() returns a list of (fd, event) pairs.\n" +" # fd is a file descriptor.\n" +" # sock and conn[=returned value of socket.accept()] are socket objects, not file descriptors.\n" +" # So use sock.fileno() and conn.fileno() to get the file descriptors.\n" +" events = ep.poll(timeout)\n" +"\n" +" # If more than one timer file descriptors are ready for reading at once,\n" +" # epoll.poll() returns a list of (fd, event) pairs.\n" +" #\n" +" # In this example settings,\n" +" # 1st timer fires every 0.25 seconds in 0.25 seconds. (0.25, 0.5, 0.75, 1.0, ...)\n" +" # 2nd timer every 0.5 seconds in 0.5 seconds. (0.5, 1.0, 1.5, 2.0, ...)\n" +" # 3rd timer every 0.75 seconds in 0.75 seconds. (0.75, 1.5, 2.25, 3.0, ...)\n" +" #\n" +" # In 0.25 seconds, only 1st timer fires.\n" +" # In 0.5 seconds, 1st timer and 2nd timer fires at once.\n" +" # In 0.75 seconds, 1st timer and 3rd timer fires at once.\n" +" # In 1.5 seconds, 1st timer, 2nd timer and 3rd timer fires at once.\n" +" #\n" +" # If a timer file descriptor is signaled more than once since\n" +" # the last os.read() call, os.read() returns the number of signaled\n" +" # as host order of class bytes.\n" +" print(f\"Signaled events={events}\")\n" +" for fd, event in events:\n" +" if event & select.EPOLLIN:\n" +" if fd == sock.fileno():\n" +" # Check if there is a connection request.\n" +" print(f\"Accepting connection {fd}\")\n" +" conn, addr = sock.accept()\n" +" conn.setblocking(False)\n" +" print(f\"Accepted connection {conn} from {addr}\")\n" +" ep.register(conn, select.EPOLLIN)\n" +" elif conn and fd == conn.fileno():\n" +" # Check if there is data to read.\n" +" print(f\"Reading data {fd}\")\n" +" data = conn.recv(1024)\n" +" if data:\n" +" # You should catch UnicodeDecodeError exception for safety.\n" +" cmd = data.decode()\n" +" if cmd.startswith(\"stop\"):\n" +" print(f\"Stopping server\")\n" +" is_active = False\n" +" else:\n" +" print(f\"Unknown command: {cmd}\")\n" +" else:\n" +" # No more data, close connection\n" +" print(f\"Closing connection {fd}\")\n" +" ep.unregister(conn)\n" +" conn.close()\n" +" conn = None\n" +" elif fd in fds:\n" +" print(f\"Reading timer {fd}\")\n" +" count = int.from_bytes(os.read(fd, 8), byteorder=sys.byteorder)\n" +" print(f\"Timer {fds.index(fd) + 1} expired {count} times\")\n" +" else:\n" +" print(f\"Unknown file descriptor {fd}\")\n" +"finally:\n" +" for fd in fds:\n" +" ep.unregister(fd)\n" +" os.close(fd)\n" +" ep.close()" +msgstr "" +"import os, time, select, socket, sys\n" +"\n" +"# 创建一个 epoll 对象\n" +"ep = select.epoll()\n" +"\n" +"# 在本例中,使用回环地址向服务器发送 \"stop\" 命令。\n" +"#\n" +"# $ telnet 127.0.0.1 1234\n" +"# Trying 127.0.0.1...\n" +"# Connected to 127.0.0.1.\n" +"# Escape character is '^]'.\n" +"# stop\n" +"# Connection closed by foreign host.\n" +"#\n" +"sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n" +"sock.bind((\"127.0.0.1\", 1234))\n" +"sock.setblocking(False)\n" +"sock.listen(1)\n" +"ep.register(sock, select.EPOLLIN)\n" +"\n" +"# 以非阻塞模式创建定时器文件描述符。\n" +"num = 3\n" +"fds = []\n" +"for _ in range(num):\n" +" fd = os.timerfd_create(time.CLOCK_REALTIME, flags=os.TFD_NONBLOCK)\n" +" fds.append(fd)\n" +" # 注册定时器文件描述符用于读取事件\n" +" ep.register(fd, select.EPOLLIN)\n" +"\n" +"# 以纳秒精度的 os.timerfd_settime_ns() 启动定时器。\n" +"# 定时器 1 间隔为 0.25 秒;定时器 2 间隔为 0.5 秒;依此类推\n" +"for i, fd in enumerate(fds, start=1):\n" +" one_sec_in_nsec = 10**9\n" +" i = i * one_sec_in_nsec\n" +" os.timerfd_settime_ns(fd, initial=i//4, interval=i//4)\n" +"\n" +"timeout = 3\n" +"try:\n" +" conn = None\n" +" is_active = True\n" +" while is_active:\n" +" # 等待定时器 3 秒到期。\n" +" # epoll.poll() 返回一个 (fd, event) 对的列表。\n" +" # fd 是一个文件描述符。\n" +" # sock 和 conn[=socket.accept() 的返回值] 是套接字对象,而不是文件描述符。\n" +" # 因此使用 sock.fileno() 和 conn.fileno() 来获取文件描述符。\n" +" events = ep.poll(timeout)\n" +"\n" +" # 如果同时有多个定时器文件描述符准备读取,\n" +" # epoll.poll() 将返回一个 (fd, event) 对的列表。\n" +" #\n" +" # 在本例的设置中,\n" +" # 第 1 个定时器在 0.25 秒后间隔 0.25 秒启动。 (0.25, 0.5, 0.75, 1.0, ...)\n" +" # 第 2 个定时器在 0.5 秒后间隔 0.5 秒启动。 (0.5, 1.0, 1.5, 2.0, ...)\n" +" # 第 3 个定时器在 0.75 秒后间隔 0.75 秒启动。 (0.75, 1.5, 2.25, 3.0, ...)\n" +" #\n" +" # 在 0.25 秒时,只有第 1 个定时器启动。\n" +" # 在 0.5 秒时,第 1 个定时器和第 2 个定时器同时启动。\n" +" # 在 0.75 秒时,第 1 个定时器和第 3 个定时器同时启动。\n" +" # 在 1.5 秒时,第 1 个定时器、第 2 个定时器和第 3 个定时器同时启动。\n" +" #\n" +" # 如果一个定时器文件描述符自上次 os.read() 调用后\n" +" # 多次发出信号,os.read() 将以主机的类字节顺序\n" +" # 返回发出信号的次数。\n" +" print(f\"Signaled events={events}\")\n" +" for fd, event in events:\n" +" if event & select.EPOLLIN:\n" +" if fd == sock.fileno():\n" +" # 检查是否有连接请求。\n" +" print(f\"Accepting connection {fd}\")\n" +" conn, addr = sock.accept()\n" +" conn.setblocking(False)\n" +" print(f\"Accepted connection {conn} from {addr}\")\n" +" ep.register(conn, select.EPOLLIN)\n" +" elif conn and fd == conn.fileno():\n" +" # 检查是否有数据要读取。\n" +" print(f\"Reading data {fd}\")\n" +" data = conn.recv(1024)\n" +" if data:\n" +" # 安全起见你应当捕获 UnicodeDecodeError 异常。\n" +" cmd = data.decode()\n" +" if cmd.startswith(\"stop\"):\n" +" print(f\"Stopping server\")\n" +" is_active = False\n" +" else:\n" +" print(f\"Unknown command: {cmd}\")\n" +" else:\n" +" # 已无数据,关闭连接\n" +" print(f\"Closing connection {fd}\")\n" +" ep.unregister(conn)\n" +" conn.close()\n" +" conn = None\n" +" elif fd in fds:\n" +" print(f\"Reading timer {fd}\")\n" +" count = int.from_bytes(os.read(fd, 8), byteorder=sys.byteorder)\n" +" print(f\"Timer {fds.index(fd) + 1} expired {count} times\")\n" +" else:\n" +" print(f\"Unknown file descriptor {fd}\")\n" +"finally:\n" +" for fd in fds:\n" +" ep.unregister(fd)\n" +" os.close(fd)\n" +" ep.close()" + +#: ../../howto/timerfd.rst:153 +msgid "" +"This example shows how :func:`~select.select` can be used with timer file " +"descriptors to wait until the file descriptor is ready for reading:" +msgstr "这个例子演示了如何使用 :func:`~select.select` 配合定时器文件描述符来执行等待直到文件描述符准备好读取:" + +#: ../../howto/timerfd.rst:156 +msgid "" +"import os, time, select, socket, sys\n" +"\n" +"# In this example, use loopback address to send \"stop\" command to the server.\n" +"#\n" +"# $ telnet 127.0.0.1 1234\n" +"# Trying 127.0.0.1...\n" +"# Connected to 127.0.0.1.\n" +"# Escape character is '^]'.\n" +"# stop\n" +"# Connection closed by foreign host.\n" +"#\n" +"sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n" +"sock.bind((\"127.0.0.1\", 1234))\n" +"sock.setblocking(False)\n" +"sock.listen(1)\n" +"\n" +"# Create timer file descriptors in non-blocking mode.\n" +"num = 3\n" +"fds = [os.timerfd_create(time.CLOCK_REALTIME, flags=os.TFD_NONBLOCK)\n" +" for _ in range(num)]\n" +"select_fds = fds + [sock]\n" +"\n" +"# Start the timers with os.timerfd_settime() in seconds.\n" +"# Timer 1 fires every 0.25 seconds; timer 2 every 0.5 seconds; etc\n" +"for i, fd in enumerate(fds, start=1):\n" +" os.timerfd_settime(fd, initial=i/4, interval=i/4)\n" +"\n" +"timeout = 3\n" +"try:\n" +" conn = None\n" +" is_active = True\n" +" while is_active:\n" +" # Wait for the timer to expire for 3 seconds.\n" +" # select.select() returns a list of file descriptors or objects.\n" +" rfd, wfd, xfd = select.select(select_fds, select_fds, select_fds, timeout)\n" +" for fd in rfd:\n" +" if fd == sock:\n" +" # Check if there is a connection request.\n" +" print(f\"Accepting connection {fd}\")\n" +" conn, addr = sock.accept()\n" +" conn.setblocking(False)\n" +" print(f\"Accepted connection {conn} from {addr}\")\n" +" select_fds.append(conn)\n" +" elif conn and fd == conn:\n" +" # Check if there is data to read.\n" +" print(f\"Reading data {fd}\")\n" +" data = conn.recv(1024)\n" +" if data:\n" +" # You should catch UnicodeDecodeError exception for safety.\n" +" cmd = data.decode()\n" +" if cmd.startswith(\"stop\"):\n" +" print(f\"Stopping server\")\n" +" is_active = False\n" +" else:\n" +" print(f\"Unknown command: {cmd}\")\n" +" else:\n" +" # No more data, close connection\n" +" print(f\"Closing connection {fd}\")\n" +" select_fds.remove(conn)\n" +" conn.close()\n" +" conn = None\n" +" elif fd in fds:\n" +" print(f\"Reading timer {fd}\")\n" +" count = int.from_bytes(os.read(fd, 8), byteorder=sys.byteorder)\n" +" print(f\"Timer {fds.index(fd) + 1} expired {count} times\")\n" +" else:\n" +" print(f\"Unknown file descriptor {fd}\")\n" +"finally:\n" +" for fd in fds:\n" +" os.close(fd)\n" +" sock.close()\n" +" sock = None" +msgstr "" +"import os, time, select, socket, sys\n" +"\n" +"# 在本例中,使用回环地址向服务器发送 \"stop\" 命令。\n" +"#\n" +"# $ telnet 127.0.0.1 1234\n" +"# Trying 127.0.0.1...\n" +"# Connected to 127.0.0.1.\n" +"# Escape character is '^]'.\n" +"# stop\n" +"# Connection closed by foreign host.\n" +"#\n" +"sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n" +"sock.bind((\"127.0.0.1\", 1234))\n" +"sock.setblocking(False)\n" +"sock.listen(1)\n" +"\n" +"# 以非阻塞模式创建定时器文件描述符。\n" +"num = 3\n" +"fds = [os.timerfd_create(time.CLOCK_REALTIME, flags=os.TFD_NONBLOCK)\n" +" for _ in range(num)]\n" +"select_fds = fds + [sock]\n" +"\n" +"# 使用 os.timerfd_settime() 启动指定秒数的定时器。\n" +"# 定时器 1 间隔为 0.25 秒;定时器 2 间隔为 0.5 秒;依此类推\n" +"for i, fd in enumerate(fds, start=1):\n" +" os.timerfd_settime(fd, initial=i/4, interval=i/4)\n" +"\n" +"timeout = 3\n" +"try:\n" +" conn = None\n" +" is_active = True\n" +" while is_active:\n" +" # 等待定时器 3 秒到期。\n" +" # select.select() 返回一个文件描述符或对象的列表。\n" +" rfd, wfd, xfd = select.select(select_fds, select_fds, select_fds, timeout)\n" +" for fd in rfd:\n" +" if fd == sock:\n" +" # 检查是否有连接请求。\n" +" print(f\"Accepting connection {fd}\")\n" +" conn, addr = sock.accept()\n" +" conn.setblocking(False)\n" +" print(f\"Accepted connection {conn} from {addr}\")\n" +" select_fds.append(conn)\n" +" elif conn and fd == conn:\n" +" # 检查是否有数据要读取。\n" +" print(f\"Reading data {fd}\")\n" +" data = conn.recv(1024)\n" +" if data:\n" +" # 安全起见你应当捕获 UnicodeDecodeError 异常。\n" +" cmd = data.decode()\n" +" if cmd.startswith(\"stop\"):\n" +" print(f\"Stopping server\")\n" +" is_active = False\n" +" else:\n" +" print(f\"Unknown command: {cmd}\")\n" +" else:\n" +" # 已无数据,关闭连接\n" +" print(f\"Closing connection {fd}\")\n" +" select_fds.remove(conn)\n" +" conn.close()\n" +" conn = None\n" +" elif fd in fds:\n" +" print(f\"Reading timer {fd}\")\n" +" count = int.from_bytes(os.read(fd, 8), byteorder=sys.byteorder)\n" +" print(f\"Timer {fds.index(fd) + 1} expired {count} times\")\n" +" else:\n" +" print(f\"Unknown file descriptor {fd}\")\n" +"finally:\n" +" for fd in fds:\n" +" os.close(fd)\n" +" sock.close()\n" +" sock = None" diff --git a/howto/unicode.po b/howto/unicode.po new file mode 100644 index 0000000000..108ab99628 --- /dev/null +++ b/howto/unicode.po @@ -0,0 +1,1487 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../howto/unicode.rst:5 +msgid "Unicode HOWTO" +msgstr "Unicode 指南" + +#: ../../howto/unicode.rst:0 +msgid "Release" +msgstr "发布版本" + +#: ../../howto/unicode.rst:7 +msgid "1.12" +msgstr "1.12" + +#: ../../howto/unicode.rst:9 +msgid "" +"This HOWTO discusses Python's support for the Unicode specification for " +"representing textual data, and explains various problems that people " +"commonly encounter when trying to work with Unicode." +msgstr "本文介绍了 Python 对表示文本数据的 Unicode 规范的支持,并对各种 Unicode 常见使用问题做了解释。" + +#: ../../howto/unicode.rst:15 +msgid "Introduction to Unicode" +msgstr "Unicode 概述" + +#: ../../howto/unicode.rst:18 +msgid "Definitions" +msgstr "定义" + +#: ../../howto/unicode.rst:20 +msgid "" +"Today's programs need to be able to handle a wide variety of characters. " +"Applications are often internationalized to display messages and output in a" +" variety of user-selectable languages; the same program might need to output" +" an error message in English, French, Japanese, Hebrew, or Russian. Web " +"content can be written in any of these languages and can also include a " +"variety of emoji symbols. Python's string type uses the Unicode Standard for" +" representing characters, which lets Python programs work with all these " +"different possible characters." +msgstr "" +"如今的程序需要能够处理各种各样的字符。应用程序通常做了国际化处理,用户可以选择不同的语言显示信息和输出数据。同一个程序可能需要以英语、法语、日语、希伯来语或俄语输出错误信息。网页内容可能由这些语言书写,并且可能包含不同的表情符号。Python" +" 的字符串类型采用 Unicode 标准来表示字符,使得 Python 程序能够正常处理所有这些不同的字符。" + +#: ../../howto/unicode.rst:30 +msgid "" +"Unicode (https://www.unicode.org/) is a specification that aims to list " +"every character used by human languages and give each character its own " +"unique code. The Unicode specifications are continually revised and updated" +" to add new languages and symbols." +msgstr "" +"Unicode " +"规范(https://www.unicode.org/)旨在罗列人类语言所用到的所有字符,并赋予每个字符唯一的编码。该规范一直在进行修订和更新,不断加入新的语种和符号。" + +#: ../../howto/unicode.rst:35 +msgid "" +"A **character** is the smallest possible component of a text. 'A', 'B', " +"'C', etc., are all different characters. So are 'È' and 'Í'. Characters " +"vary depending on the language or context you're talking about. For " +"example, there's a character for \"Roman Numeral One\", 'Ⅰ', that's separate" +" from the uppercase letter 'I'. They'll usually look the same, but these " +"are two different characters that have different meanings." +msgstr "" +"一个 **字符** 是文本的最小组件。‘A’、‘B’、‘C’等都是不同的字符。‘È’和‘Í’ " +"也一样。字符会随着语言或者上下文的变化而变化。比如,‘Ⅰ’是一个表示“罗马数字 1”的字符,它与大写字母‘I’ " +"不同。它们往往看起来相同,但这是两个有着不同含义的字符。" + +#: ../../howto/unicode.rst:42 +msgid "" +"The Unicode standard describes how characters are represented by **code " +"points**. A code point value is an integer in the range 0 to 0x10FFFF " +"(about 1.1 million values, the `actual number assigned " +"`_ is less than that). In " +"the standard and in this document, a code point is written using the " +"notation ``U+265E`` to mean the character with value ``0x265e`` (9,822 in " +"decimal)." +msgstr "" +"Unicode 标准描述了字符是如何用 **码位(code point)** 表示的。码位的取值范围是 0 到 0x10FFFF 的整数(大约 110 " +"万个值,`实际分配的数字 `_ 没有那么多)。在 " +"Unicode 标准和本文中,码位采用 ``U+265E`` 的形式,表示值为 ``0x265e`` 的字符(十进制为 9822)。" + +#: ../../howto/unicode.rst:50 +msgid "" +"The Unicode standard contains a lot of tables listing characters and their " +"corresponding code points:" +msgstr "Unicode 标准中包含了许多表格,列出了很多字符及其对应的码位。" + +#: ../../howto/unicode.rst:53 +msgid "" +"0061 'a'; LATIN SMALL LETTER A\n" +"0062 'b'; LATIN SMALL LETTER B\n" +"0063 'c'; LATIN SMALL LETTER C\n" +"...\n" +"007B '{'; LEFT CURLY BRACKET\n" +"...\n" +"2167 'Ⅷ'; ROMAN NUMERAL EIGHT\n" +"2168 'Ⅸ'; ROMAN NUMERAL NINE\n" +"...\n" +"265E '♞'; BLACK CHESS KNIGHT\n" +"265F '♟'; BLACK CHESS PAWN\n" +"...\n" +"1F600 '😀'; GRINNING FACE\n" +"1F609 '😉'; WINKING FACE\n" +"..." +msgstr "" +"0061 'a'; 拉丁字母 A 小写\n" +"0062 'b'; 拉丁字母 B 小写\n" +"0063 'c'; 拉丁字母 C 小写\n" +"...\n" +"007B '{'; 左花括号\n" +"...\n" +"2167 'Ⅷ'; 罗马数字八\n" +"2168 'Ⅸ'; 罗马数字九\n" +"...\n" +"265E '♞'; 国际象棋黑马\n" +"265F '♟'; 国际象棋黑兵\n" +"...\n" +"1F600 '😀'; 微笑脸\n" +"1F609 '😉'; 眨眼脸\n" +"..." + +#: ../../howto/unicode.rst:71 +msgid "" +"Strictly, these definitions imply that it's meaningless to say 'this is " +"character ``U+265E``'. ``U+265E`` is a code point, which represents some " +"particular character; in this case, it represents the character 'BLACK CHESS" +" KNIGHT', '♞'. In informal contexts, this distinction between code points " +"and characters will sometimes be forgotten." +msgstr "" +"严格地说,上述定义暗示了以下说法是没有意义的:“这是字符 ``U+265E``”。``U+265E`` " +"只是一个码位,代表某个特定的字符;这里它代表了字符“国际象棋黑骑士” '♞'。在非正式的上下文中,有时会忽略码位和字符的区别。" + +#: ../../howto/unicode.rst:78 +msgid "" +"A character is represented on a screen or on paper by a set of graphical " +"elements that's called a **glyph**. The glyph for an uppercase A, for " +"example, is two diagonal strokes and a horizontal stroke, though the exact " +"details will depend on the font being used. Most Python code doesn't need " +"to worry about glyphs; figuring out the correct glyph to display is " +"generally the job of a GUI toolkit or a terminal's font renderer." +msgstr "" +"一个字符在屏幕或纸上被表示为一组图形元素,被称为 **字形(glyph)** 。比如,大写字母 A " +"的字形,是两笔斜线和一笔横线,而具体的细节取决于所使用的字体。大部分 Python 代码不必担心字形,找到正确的显示字形通常是交给 GUI " +"工具包或终端的字体渲染程序来完成。" + +#: ../../howto/unicode.rst:87 +msgid "Encodings" +msgstr "编码" + +#: ../../howto/unicode.rst:89 +msgid "" +"To summarize the previous section: a Unicode string is a sequence of code " +"points, which are numbers from 0 through ``0x10FFFF`` (1,114,111 decimal). " +"This sequence of code points needs to be represented in memory as a set of " +"**code units**, and **code units** are then mapped to 8-bit bytes. The " +"rules for translating a Unicode string into a sequence of bytes are called a" +" **character encoding**, or just an **encoding**." +msgstr "" +"上一段可以归结为:一个 Unicode 字符串是一系列码位(从 0 到 ``0x10FFFF`` 或者说十进制的 1,114,111 " +"的数字)组成的序列。这一序列在内存中需被表示为一组 **码元(code unit)** , **码元** 会映射成包含八个二进制位的字节。将 " +"Unicode 字符串翻译成字节序列的规则称为 **字符编码** ,或者 **编码** 。" + +#: ../../howto/unicode.rst:97 +msgid "" +"The first encoding you might think of is using 32-bit integers as the code " +"unit, and then using the CPU's representation of 32-bit integers. In this " +"representation, the string \"Python\" might look like this:" +msgstr "" +"大家首先会想到的编码可能是用 32 位的整数作为码元,然后采用 CPU 对 32 位整数的表示法。字符串 \"Python\" " +"用这种表示法可能会如下所示:" + +#: ../../howto/unicode.rst:101 +msgid "" +" P y t h o n\n" +"0x50 00 00 00 79 00 00 00 74 00 00 00 68 00 00 00 6f 00 00 00 6e 00 00 00\n" +" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23" +msgstr "" +" P y t h o n\n" +"0x50 00 00 00 79 00 00 00 74 00 00 00 68 00 00 00 6f 00 00 00 6e 00 00 00\n" +" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23" + +#: ../../howto/unicode.rst:107 +msgid "" +"This representation is straightforward but using it presents a number of " +"problems." +msgstr "这种表示法非常直白,但也存在一些问题。" + +#: ../../howto/unicode.rst:110 +msgid "It's not portable; different processors order the bytes differently." +msgstr "不具可移植性;不同的处理器的字节序不同。" + +#: ../../howto/unicode.rst:112 +msgid "" +"It's very wasteful of space. In most texts, the majority of the code points" +" are less than 127, or less than 255, so a lot of space is occupied by " +"``0x00`` bytes. The above string takes 24 bytes compared to the 6 bytes " +"needed for an ASCII representation. Increased RAM usage doesn't matter too " +"much (desktop computers have gigabytes of RAM, and strings aren't usually " +"that large), but expanding our usage of disk and network bandwidth by a " +"factor of 4 is intolerable." +msgstr "" +"非常浪费空间。在大多数文本中,大部分码位都小于 127 或 255,因此字节 ``0x00`` 占用了大量空间。相较于 ASCII 表示法所需的 6 " +"个字节,以上字符串需要占用 24 个字节。RAM 用量的增加没那么要紧(台式计算机有成 GB 的 " +"RAM,而字符串通常不会有那么大),但要把磁盘和网络带宽的用量增加 4 倍是无法忍受的。" + +#: ../../howto/unicode.rst:120 +msgid "" +"It's not compatible with existing C functions such as ``strlen()``, so a new" +" family of wide string functions would need to be used." +msgstr "与现有的 C 函数 (如 ``strlen()``) 不兼容,因此需要采用一套新的宽字符串函数。" + +#: ../../howto/unicode.rst:123 +msgid "" +"Therefore this encoding isn't used very much, and people instead choose " +"other encodings that are more efficient and convenient, such as UTF-8." +msgstr "因此这种编码用得不多,人们转而选择其他更高效、更方便的编码,比如 UTF-8。" + +#: ../../howto/unicode.rst:126 +msgid "" +"UTF-8 is one of the most commonly used encodings, and Python often defaults " +"to using it. UTF stands for \"Unicode Transformation Format\", and the '8' " +"means that 8-bit values are used in the encoding. (There are also UTF-16 " +"and UTF-32 encodings, but they are less frequently used than UTF-8.) UTF-8 " +"uses the following rules:" +msgstr "" +"UTF-8 是最常用的编码之一,Python 往往默认会采用它。UTF 代表“Unicode Transformation Format”,'8' " +"表示编码采用 8 位数。(UTF-16 和 UTF-32 编码也是存在的,但其使用频率不如 UTF-8。)UTF-8 的规则如下:" + +#: ../../howto/unicode.rst:132 +msgid "" +"If the code point is < 128, it's represented by the corresponding byte " +"value." +msgstr "如果码位 < 128,则直接用对应的字节值表示。" + +#: ../../howto/unicode.rst:133 +msgid "" +"If the code point is >= 128, it's turned into a sequence of two, three, or " +"four bytes, where each byte of the sequence is between 128 and 255." +msgstr "如果码位 >= 128,则转换为 2、3、4 个字节的序列,每个字节值都位于 128 和 255 之间。" + +#: ../../howto/unicode.rst:136 +msgid "UTF-8 has several convenient properties:" +msgstr "UTF-8 有几个很方便的特性:" + +#: ../../howto/unicode.rst:138 +msgid "It can handle any Unicode code point." +msgstr "可以处理任何 Unicode 码位。" + +#: ../../howto/unicode.rst:139 +msgid "" +"A Unicode string is turned into a sequence of bytes that contains embedded " +"zero bytes only where they represent the null character (U+0000). This means" +" that UTF-8 strings can be processed by C functions such as ``strcpy()`` and" +" sent through protocols that can't handle zero bytes for anything other than" +" end-of-string markers." +msgstr "" +"Unicode 字符串被转换为一个字节序列,仅在表示空(null)字符(U+0000)时才会包含零值的字节。这意味着 ``strcpy()`` 之类的 " +"C 函数可以处理 UTF-8 字符串,而且用那些不能处理字符串结束符之外的零值字节的协议也能发送。" + +#: ../../howto/unicode.rst:144 +msgid "A string of ASCII text is also valid UTF-8 text." +msgstr "ASCII 字符串也是合法的 UTF-8 文本。" + +#: ../../howto/unicode.rst:145 +msgid "" +"UTF-8 is fairly compact; the majority of commonly used characters can be " +"represented with one or two bytes." +msgstr "UTF-8 相当紧凑;大多数常用字符均可用一两个字节表示。" + +#: ../../howto/unicode.rst:147 +msgid "" +"If bytes are corrupted or lost, it's possible to determine the start of the " +"next UTF-8-encoded code point and resynchronize. It's also unlikely that " +"random 8-bit data will look like valid UTF-8." +msgstr "" +"如果字节数据被损坏或丢失,则可以找出下一个 UTF-8 码点的开始位置并重新开始同步。随机的 8 位数据也不太可能像是有效的 UTF-8 编码。" + +#: ../../howto/unicode.rst:150 +msgid "" +"UTF-8 is a byte oriented encoding. The encoding specifies that each " +"character is represented by a specific sequence of one or more bytes. This " +"avoids the byte-ordering issues that can occur with integer and word " +"oriented encodings, like UTF-16 and UTF-32, where the sequence of bytes " +"varies depending on the hardware on which the string was encoded." +msgstr "" +"UTF-8 是一种面向字节的编码。编码规定了每个字符由一个或多个字节的序列表示。这避免了面向整数和面向字的编码(如 UTF-16 和 " +"UTF-32)可能出现的字节顺序问题,那时的字节序列会因执行编码的硬件而异。" + +#: ../../howto/unicode.rst:158 ../../howto/unicode.rst:516 +#: ../../howto/unicode.rst:737 +msgid "References" +msgstr "参考文献" + +#: ../../howto/unicode.rst:160 +msgid "" +"The `Unicode Consortium site `_ has character " +"charts, a glossary, and PDF versions of the Unicode specification. Be " +"prepared for some difficult reading. `A chronology " +"`_ of the origin and development of " +"Unicode is also available on the site." +msgstr "" +"`Unicode Consortium 站点 `_ 包含 Unicode 规范的字符图表、词汇表和 " +"PDF 版本。请做好准备,有些内容读起来有点难度。该网站上还提供了 Unicode 起源和发展的 `年表 " +"`_ ." + +#: ../../howto/unicode.rst:165 +msgid "" +"On the Computerphile Youtube channel, Tom Scott briefly `discusses the " +"history of Unicode and UTF-8 `_" +" (9 minutes 36 seconds)." +msgstr "" +"在 Computerphile 的 Youtube 频道上,Tom Scott 简要地 `讨论 Unicode 和 UTF-8 的历史 " +"`_ (9 分 36 秒)。" + +#: ../../howto/unicode.rst:169 +msgid "" +"To help understand the standard, Jukka Korpela has written `an introductory " +"guide `_ to reading the Unicode " +"character tables." +msgstr "" +"为了帮助理解该标准,Jukka Korpela 编写了阅读 Unicode 字符表的 `介绍性指南 " +"`_ ." + +#: ../../howto/unicode.rst:173 +msgid "" +"Another `good introductory article " +"`_ was written by Joel Spolsky. If this " +"introduction didn't make things clear to you, you should try reading this " +"alternate article before continuing." +msgstr "" +"Joel Spolsky 撰写了另一篇 `不错的介绍性文章 " +"`_。如果本文没让您弄清楚,那应在继续之前先试着读读这篇文章。" + +#: ../../howto/unicode.rst:178 +msgid "" +"Wikipedia entries are often helpful; see the entries for \"`character " +"encoding `_\" and `UTF-8 " +"`_, for example." +msgstr "" +"Wikipedia 条目通常也有帮助;例如请参阅\"`字符编码 " +"`_\"和 `UTF-8 " +"`_ 的条目。" + +#: ../../howto/unicode.rst:184 +msgid "Python's Unicode Support" +msgstr "Python 对 Unicode 的支持" + +#: ../../howto/unicode.rst:186 +msgid "" +"Now that you've learned the rudiments of Unicode, we can look at Python's " +"Unicode features." +msgstr "现在您已经了解了 Unicode 的基础知识,可以看下 Python 的 Unicode 特性。" + +#: ../../howto/unicode.rst:190 +msgid "The String Type" +msgstr "字符串类型" + +#: ../../howto/unicode.rst:192 +msgid "" +"Since Python 3.0, the language's :class:`str` type contains Unicode " +"characters, meaning any string created using ``\"unicode rocks!\"``, " +"``'unicode rocks!'``, or the triple-quoted string syntax is stored as " +"Unicode." +msgstr "" +"从 Python 3.0 开始, :class:`str` 类型包含了 Unicode 字符,这意味着用 ``\"unicode " +"rocks!\"``、``'unicode rocks!'`` 或三重引号字符串语法创建的任何字符串都会存储为 Unicode。" + +#: ../../howto/unicode.rst:196 +msgid "" +"The default encoding for Python source code is UTF-8, so you can simply " +"include a Unicode character in a string literal::" +msgstr "Python 源代码的默认编码是 UTF-8,因此可以直接在字符串中包含 Unicode 字符::" + +#: ../../howto/unicode.rst:199 +msgid "" +"try:\n" +" with open('/tmp/input.txt', 'r') as f:\n" +" ...\n" +"except OSError:\n" +" # 'File not found' error message.\n" +" print(\"Fichier non trouvé\")" +msgstr "" +"try:\n" +" with open('/tmp/input.txt', 'r') as f:\n" +" ...\n" +"except OSError:\n" +" # 'File not found' 错误消息。\n" +" print(\"Fichier non trouvé\")" + +#: ../../howto/unicode.rst:206 +msgid "" +"Side note: Python 3 also supports using Unicode characters in identifiers::" +msgstr "旁注:Python 3 还支持在标识符中使用 Unicode 字符::" + +#: ../../howto/unicode.rst:208 +msgid "" +"répertoire = \"/tmp/records.log\"\n" +"with open(répertoire, \"w\") as f:\n" +" f.write(\"test\\n\")" +msgstr "" +"répertoire = \"/tmp/records.log\"\n" +"with open(répertoire, \"w\") as f:\n" +" f.write(\"test\\n\")" + +#: ../../howto/unicode.rst:212 +msgid "" +"If you can't enter a particular character in your editor or want to keep the" +" source code ASCII-only for some reason, you can also use escape sequences " +"in string literals. (Depending on your system, you may see the actual " +"capital-delta glyph instead of a \\u escape.) ::" +msgstr "" +"如果无法在编辑器中输入某个字符,或出于某种原因想只保留 ASCII 编码的源代码,则还可以在字符串中使用转义序列。(根据系统的不同,可能会看到真的大写 " +"Delta 字形而不是 \\u 转义符。)::" + +#: ../../howto/unicode.rst:217 +msgid "" +">>> \"\\N{GREEK CAPITAL LETTER DELTA}\" # Using the character name\n" +"'\\u0394'\n" +">>> \"\\u0394\" # Using a 16-bit hex value\n" +"'\\u0394'\n" +">>> \"\\U00000394\" # Using a 32-bit hex value\n" +"'\\u0394'" +msgstr "" +">>> \"\\N{GREEK CAPITAL LETTER DELTA}\" # 使用字符名称\n" +"'\\u0394'\n" +">>> \"\\u0394\" # 使用 16 比特位十六进制数值\n" +"'\\u0394'\n" +">>> \"\\U00000394\" # 使用 32 比特位十六进制数值\n" +"'\\u0394'" + +#: ../../howto/unicode.rst:224 +msgid "" +"In addition, one can create a string using the :func:`~bytes.decode` method " +"of :class:`bytes`. This method takes an *encoding* argument, such as " +"``UTF-8``, and optionally an *errors* argument." +msgstr "" +"此外,可以用 :class:`bytes` 的 :func:`~bytes.decode` 方法创建一个字符串。该方法可以接受 *encoding* " +"参数,比如可以为 ``UTF-8``,以及可选的 *errors* 参数。" + +#: ../../howto/unicode.rst:228 +msgid "" +"The *errors* argument specifies the response when the input string can't be " +"converted according to the encoding's rules. Legal values for this argument" +" are ``'strict'`` (raise a :exc:`UnicodeDecodeError` exception), " +"``'replace'`` (use ``U+FFFD``, ``REPLACEMENT CHARACTER``), ``'ignore'`` " +"(just leave the character out of the Unicode result), or " +"``'backslashreplace'`` (inserts a ``\\xNN`` escape sequence). The following " +"examples show the differences::" +msgstr "" +"若无法根据编码规则对输入字符串进行编码,*errors* 参数指定了响应策略。该参数的合法值可以是 ``'strict'`` (触发 " +":exc:`UnicodeDecodeError` 异常)、``'replace'`` (用 ``U+FFFD``、``REPLACEMENT " +"CHARACTER``)、``'ignore'`` (只是将字符从 Unicode 结果中去掉),或 ``'backslashreplace'`` " +"(插入一个 ``\\xNN`` 转义序列)。以下示例演示了这些不同的参数::" + +#: ../../howto/unicode.rst:236 +msgid "" +">>> b'\\x80abc'.decode(\"utf-8\", \"strict\")\n" +"Traceback (most recent call last):\n" +" ...\n" +"UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0:\n" +" invalid start byte\n" +">>> b'\\x80abc'.decode(\"utf-8\", \"replace\")\n" +"'\\ufffdabc'\n" +">>> b'\\x80abc'.decode(\"utf-8\", \"backslashreplace\")\n" +"'\\\\x80abc'\n" +">>> b'\\x80abc'.decode(\"utf-8\", \"ignore\")\n" +"'abc'" +msgstr "" +">>> b'\\x80abc'.decode(\"utf-8\", \"strict\")\n" +"Traceback (most recent call last):\n" +" ...\n" +"UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0:\n" +" invalid start byte\n" +">>> b'\\x80abc'.decode(\"utf-8\", \"replace\")\n" +"'\\ufffdabc'\n" +">>> b'\\x80abc'.decode(\"utf-8\", \"backslashreplace\")\n" +"'\\\\x80abc'\n" +">>> b'\\x80abc'.decode(\"utf-8\", \"ignore\")\n" +"'abc'" + +#: ../../howto/unicode.rst:248 +msgid "" +"Encodings are specified as strings containing the encoding's name. Python " +"comes with roughly 100 different encodings; see the Python Library Reference" +" at :ref:`standard-encodings` for a list. Some encodings have multiple " +"names; for example, ``'latin-1'``, ``'iso_8859_1'`` and ``'8859``' are all " +"synonyms for the same encoding." +msgstr "" +"编码格式以包含编码格式名称的字符串来指明。Python 有大约 100 种不同的编码格式;清单详见 Python 库参考文档 " +":ref:`standard-encodings`。一些编码格式有多个名称,比如 ``'latin-1'``、``'iso_8859_1'`` 和 " +"``'8859`` 都是指同一种编码。" + +#: ../../howto/unicode.rst:254 +msgid "" +"One-character Unicode strings can also be created with the :func:`chr` " +"built-in function, which takes integers and returns a Unicode string of " +"length 1 that contains the corresponding code point. The reverse operation " +"is the built-in :func:`ord` function that takes a one-character Unicode " +"string and returns the code point value::" +msgstr "" +"利用内置函数 :func:`chr` 还可以创建单字符的 Unicode 字符串,该函数可接受整数参数,并返回包含对应码位的长度为 1 的 " +"Unicode 字符串。内置函数 :func:`ord` 是其逆操作,参数为单个字符的 Unicode 字符串,并返回码位值::" + +#: ../../howto/unicode.rst:260 +msgid "" +">>> chr(57344)\n" +"'\\ue000'\n" +">>> ord('\\ue000')\n" +"57344" +msgstr "" +">>> chr(57344)\n" +"'\\ue000'\n" +">>> ord('\\ue000')\n" +"57344" + +#: ../../howto/unicode.rst:266 +msgid "Converting to Bytes" +msgstr "转换为字节" + +#: ../../howto/unicode.rst:268 +msgid "" +"The opposite method of :meth:`bytes.decode` is :meth:`str.encode`, which " +"returns a :class:`bytes` representation of the Unicode string, encoded in " +"the requested *encoding*." +msgstr "" +":meth:`bytes.decode` 的逆方法是 :meth:`str.encode`,它会返回 Unicode 字符串的 " +":class:`bytes` 形式,已按要求的 *encoding* 进行了编码。" + +#: ../../howto/unicode.rst:272 +msgid "" +"The *errors* parameter is the same as the parameter of the " +":meth:`~bytes.decode` method but supports a few more possible handlers. As " +"well as ``'strict'``, ``'ignore'``, and ``'replace'`` (which in this case " +"inserts a question mark instead of the unencodable character), there is also" +" ``'xmlcharrefreplace'`` (inserts an XML character reference), " +"``backslashreplace`` (inserts a ``\\uNNNN`` escape sequence) and " +"``namereplace`` (inserts a ``\\N{...}`` escape sequence)." +msgstr "" +"参数 *errors* 的意义与 :meth:`~bytes.decode` 方法相同,但支持更多可能的处理器。除了 ``'strict'``、 " +"``'ignore'`` 和 ``'replace'`` (这时会插入问号替换掉无法编码的字符),还有 ``'xmlcharrefreplace'``" +" (插入一个 XML 字符引用)、``backslashreplace`` (插入一个 ``\\uNNNN`` 转义序列) 和 " +"``namereplace`` (插入一个 ``\\N{...}`` 转义序列)。" + +#: ../../howto/unicode.rst:280 +msgid "The following example shows the different results::" +msgstr "以下例子演示了各种不同的结果::" + +#: ../../howto/unicode.rst:282 +msgid "" +">>> u = chr(40960) + 'abcd' + chr(1972)\n" +">>> u.encode('utf-8')\n" +"b'\\xea\\x80\\x80abcd\\xde\\xb4'\n" +">>> u.encode('ascii')\n" +"Traceback (most recent call last):\n" +" ...\n" +"UnicodeEncodeError: 'ascii' codec can't encode character '\\ua000' in\n" +" position 0: ordinal not in range(128)\n" +">>> u.encode('ascii', 'ignore')\n" +"b'abcd'\n" +">>> u.encode('ascii', 'replace')\n" +"b'?abcd?'\n" +">>> u.encode('ascii', 'xmlcharrefreplace')\n" +"b'ꀀabcd޴'\n" +">>> u.encode('ascii', 'backslashreplace')\n" +"b'\\\\ua000abcd\\\\u07b4'\n" +">>> u.encode('ascii', 'namereplace')\n" +"b'\\\\N{YI SYLLABLE IT}abcd\\\\u07b4'" +msgstr "" +">>> u = chr(40960) + 'abcd' + chr(1972)\n" +">>> u.encode('utf-8')\n" +"b'\\xea\\x80\\x80abcd\\xde\\xb4'\n" +">>> u.encode('ascii')\n" +"Traceback (most recent call last):\n" +" ...\n" +"UnicodeEncodeError: 'ascii' codec can't encode character '\\ua000' in\n" +" position 0: ordinal not in range(128)\n" +">>> u.encode('ascii', 'ignore')\n" +"b'abcd'\n" +">>> u.encode('ascii', 'replace')\n" +"b'?abcd?'\n" +">>> u.encode('ascii', 'xmlcharrefreplace')\n" +"b'ꀀabcd޴'\n" +">>> u.encode('ascii', 'backslashreplace')\n" +"b'\\\\ua000abcd\\\\u07b4'\n" +">>> u.encode('ascii', 'namereplace')\n" +"b'\\\\N{YI SYLLABLE IT}abcd\\\\u07b4'" + +#: ../../howto/unicode.rst:301 +msgid "" +"The low-level routines for registering and accessing the available encodings" +" are found in the :mod:`codecs` module. Implementing new encodings also " +"requires understanding the :mod:`codecs` module. However, the encoding and " +"decoding functions returned by this module are usually more low-level than " +"is comfortable, and writing new encodings is a specialized task, so the " +"module won't be covered in this HOWTO." +msgstr "" +"用于注册和访问可用编码格式的底层函数,位于 :mod:`codecs` 模块中。若要实现新的编码格式,则还需要了解 :mod:`codecs` 模块。 " +"不过该模块返回的编码和解码函数通常更为底层一些,不大好用,编写新的编码格式是一项专业的任务,因此本文不会涉及该模块。" + +#: ../../howto/unicode.rst:310 +msgid "Unicode Literals in Python Source Code" +msgstr "Python 源代码中的 Unicode 字面值" + +#: ../../howto/unicode.rst:312 +msgid "" +"In Python source code, specific Unicode code points can be written using the" +" ``\\u`` escape sequence, which is followed by four hex digits giving the " +"code point. The ``\\U`` escape sequence is similar, but expects eight hex " +"digits, not four::" +msgstr "" +"在 Python 源代码中,可以用 ``\\u`` 转义序列书写特定的 Unicode 码位,该序列后跟 4 个代表码位的十六进制数字。``\\U`` " +"转义序列用法类似,但要用 8 个十六进制数字,而不是 4 个::" + +#: ../../howto/unicode.rst:317 +msgid "" +">>> s = \"a\\xac\\u1234\\u20ac\\U00008000\"\n" +"... # ^^^^ two-digit hex escape\n" +"... # ^^^^^^ four-digit Unicode escape\n" +"... # ^^^^^^^^^^ eight-digit Unicode escape\n" +">>> [ord(c) for c in s]\n" +"[97, 172, 4660, 8364, 32768]" +msgstr "" +">>> s = \"a\\xac\\u1234\\u20ac\\U00008000\"\n" +"... # ^^^^ 两位十六进制数转义\n" +"... # ^^^^^^ 四位 Unicode 转义\n" +"... # ^^^^^^^^^^ 八位 Unicode 转义\n" +">>> [ord(c) for c in s]\n" +"[97, 172, 4660, 8364, 32768]" + +#: ../../howto/unicode.rst:324 +msgid "" +"Using escape sequences for code points greater than 127 is fine in small " +"doses, but becomes an annoyance if you're using many accented characters, as" +" you would in a program with messages in French or some other accent-using " +"language. You can also assemble strings using the :func:`chr` built-in " +"function, but this is even more tedious." +msgstr "" +"对大于 127 " +"的码位使用转义序列,数量不多时没什么问题,但如果要用到很多重音字符,这会变得很烦人,类似于程序中的信息是用法语或其他使用重音的语言写的。也可以用内置函数" +" :func:`chr` 拼装字符串,但会更加乏味。" + +#: ../../howto/unicode.rst:330 +msgid "" +"Ideally, you'd want to be able to write literals in your language's natural " +"encoding. You could then edit Python source code with your favorite editor " +"which would display the accented characters naturally, and have the right " +"characters used at runtime." +msgstr "" +"理想情况下,都希望能用母语的编码书写文本。还能用喜好的编辑器编辑 Python 源代码,编辑器要能自然地显示重音符,并在运行时使用正确的字符。" + +#: ../../howto/unicode.rst:335 +msgid "" +"Python supports writing source code in UTF-8 by default, but you can use " +"almost any encoding if you declare the encoding being used. This is done by" +" including a special comment as either the first or second line of the " +"source file::" +msgstr "" +"默认情况下,Python 支持以 UTF-8 " +"格式编写源代码,但如果声明要用的编码,则几乎可以使用任何编码。只要在源文件的第一行或第二行包含一个特殊注释即可::" + +#: ../../howto/unicode.rst:339 +msgid "" +"#!/usr/bin/env python\n" +"# -*- coding: latin-1 -*-\n" +"\n" +"u = 'abcdé'\n" +"print(ord(u[-1]))" +msgstr "" +"#!/usr/bin/env python\n" +"# -*- coding: latin-1 -*-\n" +"\n" +"u = 'abcdé'\n" +"print(ord(u[-1]))" + +#: ../../howto/unicode.rst:345 +msgid "" +"The syntax is inspired by Emacs's notation for specifying variables local to" +" a file. Emacs supports many different variables, but Python only supports " +"'coding'. The ``-*-`` symbols indicate to Emacs that the comment is " +"special; they have no significance to Python but are a convention. Python " +"looks for ``coding: name`` or ``coding=name`` in the comment." +msgstr "" +"上述语法的灵感来自于 Emacs 用于指定文件局部变量的符号。Emacs 支持许多不同的变量,但 Python 仅支持“编码”。``-*-`` 符号向 " +"Emacs 标明该注释是特殊的;这对 Python 没有什么意义,只是一种约定。Python 会在注释中查找 ``coding: name`` 或 " +"``coding=name``." + +#: ../../howto/unicode.rst:351 +msgid "" +"If you don't include such a comment, the default encoding used will be UTF-8" +" as already mentioned. See also :pep:`263` for more information." +msgstr "如果没有这种注释,则默认编码将会是前面提到的 UTF-8。更多信息请参阅 :pep:`263`。" + +#: ../../howto/unicode.rst:358 +msgid "Unicode Properties" +msgstr "Unicode 属性" + +#: ../../howto/unicode.rst:360 +msgid "" +"The Unicode specification includes a database of information about code " +"points. For each defined code point, the information includes the " +"character's name, its category, the numeric value if applicable (for " +"characters representing numeric concepts such as the Roman numerals, " +"fractions such as one-third and four-fifths, etc.). There are also display-" +"related properties, such as how to use the code point in bidirectional text." +msgstr "" +"Unicode " +"规范包含了一个码位信息数据库。对于定义的每一个码位,都包含了字符的名称、类别、数值(对于表示数字概念的字符,如罗马数字、分数如三分之一和五分之四等)。还有有关显示的属性,比如如何在双向文本中使用码位。" + +#: ../../howto/unicode.rst:368 +msgid "" +"The following program displays some information about several characters, " +"and prints the numeric value of one particular character::" +msgstr "以下程序显示了几个字符的信息,并打印一个字符的数值::" + +#: ../../howto/unicode.rst:371 +msgid "" +"import unicodedata\n" +"\n" +"u = chr(233) + chr(0x0bf2) + chr(3972) + chr(6000) + chr(13231)\n" +"\n" +"for i, c in enumerate(u):\n" +" print(i, '%04x' % ord(c), unicodedata.category(c), end=\" \")\n" +" print(unicodedata.name(c))\n" +"\n" +"# Get numeric value of second character\n" +"print(unicodedata.numeric(u[1]))" +msgstr "" +"import unicodedata\n" +"\n" +"u = chr(233) + chr(0x0bf2) + chr(3972) + chr(6000) + chr(13231)\n" +"\n" +"for i, c in enumerate(u):\n" +" print(i, '%04x' % ord(c), unicodedata.category(c), end=\" \")\n" +" print(unicodedata.name(c))\n" +"\n" +"# 获取第二个字符的数值\n" +"print(unicodedata.numeric(u[1]))" + +#: ../../howto/unicode.rst:382 +msgid "When run, this prints:" +msgstr "当运行时,这将打印出:" + +#: ../../howto/unicode.rst:384 +msgid "" +"0 00e9 Ll LATIN SMALL LETTER E WITH ACUTE\n" +"1 0bf2 No TAMIL NUMBER ONE THOUSAND\n" +"2 0f84 Mn TIBETAN MARK HALANTA\n" +"3 1770 Lo TAGBANWA LETTER SA\n" +"4 33af So SQUARE RAD OVER S SQUARED\n" +"1000.0" +msgstr "" +"0 00e9 Ll LATIN SMALL LETTER E WITH ACUTE\n" +"1 0bf2 No TAMIL NUMBER ONE THOUSAND\n" +"2 0f84 Mn TIBETAN MARK HALANTA\n" +"3 1770 Lo TAGBANWA LETTER SA\n" +"4 33af So SQUARE RAD OVER S SQUARED\n" +"1000.0" + +#: ../../howto/unicode.rst:393 +msgid "" +"The category codes are abbreviations describing the nature of the character." +" These are grouped into categories such as \"Letter\", \"Number\", " +"\"Punctuation\", or \"Symbol\", which in turn are broken up into " +"subcategories. To take the codes from the above output, ``'Ll'`` means " +"'Letter, lowercase', ``'No'`` means \"Number, other\", ``'Mn'`` is \"Mark, " +"nonspacing\", and ``'So'`` is \"Symbol, other\". See `the General Category " +"Values section of the Unicode Character Database documentation " +"`_ for a list" +" of category codes." +msgstr "" +"类别代码是描述字符性质的一个缩写。分为“字母”、“数字”、“标点符号”或“符号”等类别,而这些类别又分为子类别。就以上输出的代码而言,``'Ll'`` " +"表示“字母,小写”,``'No'`` 表示“数字,其他”,``'Mn'`` 表示“标记,非空白符” , ``'So'`` " +"是“符号,其他”。有关类别代码的清单,请参阅 `Unicode 字符库文档 " +"`_ " +"的“通用类别值”部分。" + +#: ../../howto/unicode.rst:404 +msgid "Comparing Strings" +msgstr "字符串比较" + +#: ../../howto/unicode.rst:406 +msgid "" +"Unicode adds some complication to comparing strings, because the same set of" +" characters can be represented by different sequences of code points. For " +"example, a letter like 'ê' can be represented as a single code point U+00EA," +" or as U+0065 U+0302, which is the code point for 'e' followed by a code " +"point for 'COMBINING CIRCUMFLEX ACCENT'. These will produce the same output" +" when printed, but one is a string of length 1 and the other is of length 2." +msgstr "" +"Unicode 让字符串的比较变得复杂了一些,因为同一组字符可能由不同的码位序列组成。例如,像“ê”这样的字母可以表示为单码位 U+00EA,或是 " +"U+0065 U+0302,即“e”的码位后跟“COMBINING CIRCUMFLEX " +"ACCENT”的码位。虽然在打印时会产生同样的输出,但一个是长度为 1 的字符串,另一个是长度为 2 的字符串。" + +#: ../../howto/unicode.rst:414 +msgid "" +"One tool for a case-insensitive comparison is the :meth:`~str.casefold` " +"string method that converts a string to a case-insensitive form following an" +" algorithm described by the Unicode Standard. This algorithm has special " +"handling for characters such as the German letter 'ß' (code point U+00DF), " +"which becomes the pair of lowercase letters 'ss'." +msgstr "" +"一种不区分大小写比较的工具是字符串方法 :meth:`~str.casefold`,将按照 Unicode " +"标准描述的算法将字符串转换为不区分大小写的形式。该算法对诸如德语字母“ß”(代码点 U+00DF)之类的字符进行了特殊处理,变为一对小写字母“ss”。" + +#: ../../howto/unicode.rst:423 +msgid "" +">>> street = 'Gürzenichstraße'\n" +">>> street.casefold()\n" +"'gürzenichstrasse'" +msgstr "" +">>> street = 'Gürzenichstraße'\n" +">>> street.casefold()\n" +"'gürzenichstrasse'" + +#: ../../howto/unicode.rst:427 +msgid "" +"A second tool is the :mod:`unicodedata` module's " +":func:`~unicodedata.normalize` function that converts strings to one of " +"several normal forms, where letters followed by a combining character are " +"replaced with single characters. :func:`~unicodedata.normalize` can be used" +" to perform string comparisons that won't falsely report inequality if two " +"strings use combining characters differently:" +msgstr "" +"第二个工具是 :mod:`unicodedata` 模块的 :func:`~unicodedata.normalize` " +"函数,该函数可将字符串转换为几种规范化形式之一,即用单字符替换后面带一个组合字符的多个字母。 " +":func:`~unicodedata.normalize` 可被用于执行字符串比较,如果两个字符串使用不同的组合字符,也不会错误地报告两者不相等:" + +#: ../../howto/unicode.rst:436 +msgid "" +"import unicodedata\n" +"\n" +"def compare_strs(s1, s2):\n" +" def NFD(s):\n" +" return unicodedata.normalize('NFD', s)\n" +"\n" +" return NFD(s1) == NFD(s2)\n" +"\n" +"single_char = 'ê'\n" +"multiple_chars = '\\N{LATIN SMALL LETTER E}\\N{COMBINING CIRCUMFLEX ACCENT}'\n" +"print('length of first string=', len(single_char))\n" +"print('length of second string=', len(multiple_chars))\n" +"print(compare_strs(single_char, multiple_chars))" +msgstr "" +"import unicodedata\n" +"\n" +"def compare_strs(s1, s2):\n" +" def NFD(s):\n" +" return unicodedata.normalize('NFD', s)\n" +"\n" +" return NFD(s1) == NFD(s2)\n" +"\n" +"single_char = 'ê'\n" +"multiple_chars = '\\N{LATIN SMALL LETTER E}\\N{COMBINING CIRCUMFLEX ACCENT}'\n" +"print('length of first string=', len(single_char))\n" +"print('length of second string=', len(multiple_chars))\n" +"print(compare_strs(single_char, multiple_chars))" + +#: ../../howto/unicode.rst:450 +msgid "When run, this outputs:" +msgstr "当运行时,这将输出:" + +#: ../../howto/unicode.rst:452 +msgid "" +"$ python compare-strs.py\n" +"length of first string= 1\n" +"length of second string= 2\n" +"True" +msgstr "" +"$ python compare-strs.py\n" +"length of first string= 1\n" +"length of second string= 2\n" +"True" + +#: ../../howto/unicode.rst:459 +msgid "" +"The first argument to the :func:`~unicodedata.normalize` function is a " +"string giving the desired normalization form, which can be one of 'NFC', " +"'NFKC', 'NFD', and 'NFKD'." +msgstr "" +":func:`~unicodedata.normalize` " +"函数的第一个参数是个字符串,给出所需的规范化形式,可以是“NFC”、“NFKC”、“NFD”和“NFKD”之一。" + +#: ../../howto/unicode.rst:463 +msgid "The Unicode Standard also specifies how to do caseless comparisons::" +msgstr "Unicode 标准还设定了如何进行不区分大小写的比较::" + +#: ../../howto/unicode.rst:465 +msgid "" +"import unicodedata\n" +"\n" +"def compare_caseless(s1, s2):\n" +" def NFD(s):\n" +" return unicodedata.normalize('NFD', s)\n" +"\n" +" return NFD(NFD(s1).casefold()) == NFD(NFD(s2).casefold())\n" +"\n" +"# Example usage\n" +"single_char = 'ê'\n" +"multiple_chars = '\\N{LATIN CAPITAL LETTER E}\\N{COMBINING CIRCUMFLEX ACCENT}'\n" +"\n" +"print(compare_caseless(single_char, multiple_chars))" +msgstr "" +"import unicodedata\n" +"\n" +"def compare_caseless(s1, s2):\n" +" def NFD(s):\n" +" return unicodedata.normalize('NFD', s)\n" +"\n" +" return NFD(NFD(s1).casefold()) == NFD(NFD(s2).casefold())\n" +"\n" +"# 使用示例\n" +"single_char = 'ê'\n" +"multiple_chars = '\\N{LATIN CAPITAL LETTER E}\\N{COMBINING CIRCUMFLEX ACCENT}'\n" +"\n" +"print(compare_caseless(single_char, multiple_chars))" + +#: ../../howto/unicode.rst:479 +msgid "" +"This will print ``True``. (Why is :func:`!NFD` invoked twice? Because " +"there are a few characters that make :meth:`~str.casefold` return a non-" +"normalized string, so the result needs to be normalized again. See section " +"3.13 of the Unicode Standard for a discussion and an example.)" +msgstr "" +"这将打印 ``True``。 (为什么 :func:`!NFD` 会被调用两次?因为有几个字符会使 :meth:`~str.casefold` " +"返回非规范化的字符串,所以需要再次对结果进行规范化处理。有关讨论和示例,请参阅 Unicode 标准第 3.13 节)。" + +#: ../../howto/unicode.rst:486 +msgid "Unicode Regular Expressions" +msgstr "Unicode 正则表达式" + +#: ../../howto/unicode.rst:488 +msgid "" +"The regular expressions supported by the :mod:`re` module can be provided " +"either as bytes or strings. Some of the special character sequences such as" +" ``\\d`` and ``\\w`` have different meanings depending on whether the " +"pattern is supplied as bytes or a string. For example, ``\\d`` will match " +"the characters ``[0-9]`` in bytes but in strings will match any character " +"that's in the ``'Nd'`` category." +msgstr "" +":mod:`re` 模块支持的正则表达式可以用字节串或字符串的形式提供。有一些特殊字符序列,比如 ``\\d`` 和 ``\\w`` " +"具有不同的含义,具体取决于匹配模式是以字节串还是字符串形式提供的。例如,``\\d`` 将匹配字节串中的字符 ``[0-9]``,但对于字符串将会匹配 " +"``'Nd'`` 类别中的任何字符。" + +#: ../../howto/unicode.rst:495 +msgid "" +"The string in this example has the number 57 written in both Thai and Arabic" +" numerals::" +msgstr "上述示例中的字符串包含了泰语和阿拉伯数字书写的数字 57::" + +#: ../../howto/unicode.rst:498 +msgid "" +"import re\n" +"p = re.compile(r'\\d+')\n" +"\n" +"s = \"Over \\u0e55\\u0e57 57 flavours\"\n" +"m = p.search(s)\n" +"print(repr(m.group()))" +msgstr "" +"import re\n" +"p = re.compile(r'\\d+')\n" +"\n" +"s = \"Over \\u0e55\\u0e57 57 flavours\"\n" +"m = p.search(s)\n" +"print(repr(m.group()))" + +#: ../../howto/unicode.rst:505 +msgid "" +"When executed, ``\\d+`` will match the Thai numerals and print them out. If" +" you supply the :const:`re.ASCII` flag to :func:`~re.compile`, ``\\d+`` will" +" match the substring \"57\" instead." +msgstr "" +"执行时,``\\d+`` 将匹配上泰语数字并打印出来。如果向 :func:`~re.compile` 提供的是 :const:`re.ASCII` " +"标志,``\\d+`` 则会匹配子串 \"57\"。" + +#: ../../howto/unicode.rst:509 +msgid "" +"Similarly, ``\\w`` matches a wide variety of Unicode characters but only " +"``[a-zA-Z0-9_]`` in bytes or if :const:`re.ASCII` is supplied, and ``\\s`` " +"will match either Unicode whitespace characters or ``[ \\t\\n\\r\\f\\v]``." +msgstr "" +"类似地,``\\w`` 将匹配多种 Unicode 字符,但对于字节串或指定了 :const:`re.ASCII` 时则只会匹配 " +"``[a-zA-Z0-9_]``;而 ``\\s`` 将匹配 Unicode 空白符或 ``[ \\t\\n\\r\\f\\v]``。" + +#: ../../howto/unicode.rst:520 +msgid "Some good alternative discussions of Python's Unicode support are:" +msgstr "关于 Python 的 Unicode 支持,其他还有一些很好的讨论:" + +#: ../../howto/unicode.rst:522 +msgid "" +"`Processing Text Files in Python 3 `_, " +"by Nick Coghlan." +msgstr "" +"`用 Python 3 处理文本文件 `_ " +",作者 Nick Coghlan。" + +#: ../../howto/unicode.rst:523 +msgid "" +"`Pragmatic Unicode `_, a PyCon " +"2012 presentation by Ned Batchelder." +msgstr "" +"`实用的 Unicode `_,Ned Batchelder " +"在 PyCon 2012 上的演示。" + +#: ../../howto/unicode.rst:525 +msgid "" +"The :class:`str` type is described in the Python library reference at " +":ref:`textseq`." +msgstr ":class:`str` 类型在 Python 库参考文档 :ref:`textseq` 中有介绍。" + +#: ../../howto/unicode.rst:528 +msgid "The documentation for the :mod:`unicodedata` module." +msgstr ":mod:`unicodedata` 模块的文档" + +#: ../../howto/unicode.rst:530 +msgid "The documentation for the :mod:`codecs` module." +msgstr ":mod:`codecs` 模块的文档" + +#: ../../howto/unicode.rst:532 +msgid "" +"Marc-André Lemburg gave `a presentation titled \"Python and Unicode\" (PDF " +"slides) `_ at " +"EuroPython 2002. The slides are an excellent overview of the design of " +"Python 2's Unicode features (where the Unicode string type is called " +"``unicode`` and literals start with ``u``)." +msgstr "" +"Marc-André Lemburg 在 EuroPython 2002 上发布了 `a presentation titled \"Python " +"and Unicode\" (PDF slides) `_。 该演示文稿很好地概括了 Python 2 的 Unicode 特性设计(其中 Unicode 字符串类型称为 " +"``unicode`` 且其字面值带有 ``u`` 前缀)。" + +#: ../../howto/unicode.rst:540 +msgid "Reading and Writing Unicode Data" +msgstr "Unicode 数据的读写" + +#: ../../howto/unicode.rst:542 +msgid "" +"Once you've written some code that works with Unicode data, the next problem" +" is input/output. How do you get Unicode strings into your program, and how" +" do you convert Unicode into a form suitable for storage or transmission?" +msgstr "" +"既然处理 Unicode 数据的代码写好了,下一个问题就是输入/输出了。如何将 Unicode 字符串读入程序,如何将 Unicode " +"转换为适于存储或传输的形式呢?" + +#: ../../howto/unicode.rst:546 +msgid "" +"It's possible that you may not need to do anything depending on your input " +"sources and output destinations; you should check whether the libraries used" +" in your application support Unicode natively. XML parsers often return " +"Unicode data, for example. Many relational databases also support Unicode-" +"valued columns and can return Unicode values from an SQL query." +msgstr "" +"根据输入源和输出目标的不同,或许什么都不用干;请检查一下应用程序用到的库是否原生支持 Unicode。例如,XML 解析器往往会返回 Unicode " +"数据。许多关系数据库的字段也支持 Unicode 值,并且 SQL 查询也能返回 Unicode 值。" + +#: ../../howto/unicode.rst:552 +msgid "" +"Unicode data is usually converted to a particular encoding before it gets " +"written to disk or sent over a socket. It's possible to do all the work " +"yourself: open a file, read an 8-bit bytes object from it, and convert the " +"bytes with ``bytes.decode(encoding)``. However, the manual approach is not " +"recommended." +msgstr "" +"在写入磁盘或通过套接字发送之前,Unicode 数据通常要转换为特定的编码。可以自己完成所有工作:打开一个文件,从中读取一个 8 位字节对象,然后用 " +"``bytes.decode(encoding)`` 对字节串进行转换。但是,不推荐采用这种全人工的方案。" + +#: ../../howto/unicode.rst:557 +msgid "" +"One problem is the multi-byte nature of encodings; one Unicode character can" +" be represented by several bytes. If you want to read the file in " +"arbitrary-sized chunks (say, 1024 or 4096 bytes), you need to write error-" +"handling code to catch the case where only part of the bytes encoding a " +"single Unicode character are read at the end of a chunk. One solution would" +" be to read the entire file into memory and then perform the decoding, but " +"that prevents you from working with files that are extremely large; if you " +"need to read a 2 GiB file, you need 2 GiB of RAM. (More, really, since for " +"at least a moment you'd need to have both the encoded string and its Unicode" +" version in memory.)" +msgstr "" +"编码的多字节特性就是一个难题;一个 Unicode 字符可以用几个字节表示。如果要以任意大小的块(例如 1024 或 4096 " +"字节)读取文件,那么在块的末尾可能只读到某个 Unicode 字符的部分字节,这就需要编写错误处理代码。 " +"有一种解决方案是将整个文件读入内存,然后进行解码,但这样就没法处理很大的文件了;若要读取 2 GB 的文件,就需要 2 GB 的 " +"RAM。(其实需要的内存会更多些,因为至少有一段时间需要在内存中同时存放已编码字符串及其 Unicode 版本。)" + +#: ../../howto/unicode.rst:567 +msgid "" +"The solution would be to use the low-level decoding interface to catch the " +"case of partial coding sequences. The work of implementing this has already" +" been done for you: the built-in :func:`open` function can return a file-" +"like object that assumes the file's contents are in a specified encoding and" +" accepts Unicode parameters for methods such as :meth:`~io.TextIOBase.read` " +"and :meth:`~io.TextIOBase.write`. This works through :func:`open`\\'s " +"*encoding* and *errors* parameters which are interpreted just like those in " +":meth:`str.encode` and :meth:`bytes.decode`." +msgstr "" +"解决方案是利用底层解码接口去捕获编码序列不完整的情况。这部分代码已经是现成的:内置函数 :func:`open` " +"可以返回一个文件类的对象,该对象认为文件的内容采用指定的编码,:meth:`~io.TextIOBase.read` 和 " +":meth:`~io.TextIOBase.write` 等方法接受 Unicode 参数。只要用 :func:`open` 的 *encoding* " +"和 *errors* 参数即可,参数释义同 :meth:`str.encode` 和 :meth:`bytes.decode`。" + +#: ../../howto/unicode.rst:576 +msgid "Reading Unicode from a file is therefore simple::" +msgstr "因此从文件读取 Unicode 就比较简单了::" + +#: ../../howto/unicode.rst:578 +msgid "" +"with open('unicode.txt', encoding='utf-8') as f:\n" +" for line in f:\n" +" print(repr(line))" +msgstr "" +"with open('unicode.txt', encoding='utf-8') as f:\n" +" for line in f:\n" +" print(repr(line))" + +#: ../../howto/unicode.rst:582 +msgid "" +"It's also possible to open files in update mode, allowing both reading and " +"writing::" +msgstr "也可以在更新模式下打开文件,以便同时读取和写入::" + +#: ../../howto/unicode.rst:585 +msgid "" +"with open('test', encoding='utf-8', mode='w+') as f:\n" +" f.write('\\u4500 blah blah blah\\n')\n" +" f.seek(0)\n" +" print(repr(f.readline()[:1]))" +msgstr "" +"with open('test', encoding='utf-8', mode='w+') as f:\n" +" f.write('\\u4500 blah blah blah\\n')\n" +" f.seek(0)\n" +" print(repr(f.readline()[:1]))" + +#: ../../howto/unicode.rst:590 +msgid "" +"The Unicode character ``U+FEFF`` is used as a byte-order mark (BOM), and is " +"often written as the first character of a file in order to assist with " +"autodetection of the file's byte ordering. Some encodings, such as UTF-16, " +"expect a BOM to be present at the start of a file; when such an encoding is " +"used, the BOM will be automatically written as the first character and will " +"be silently dropped when the file is read. There are variants of these " +"encodings, such as 'utf-16-le' and 'utf-16-be' for little-endian and big-" +"endian encodings, that specify one particular byte ordering and don't skip " +"the BOM." +msgstr "" +"Unicode 字符 ``U+FEFF`` 用作字节顺序标记(BOM),通常作为文件的第一个字符写入,以帮助自动检测文件的字节顺序。某些编码(例如 " +"UTF-16)期望在文件开头出现 BOM;当采用这种编码时,BOM 将自动作为第一个字符写入,并在读取文件时会静默删除。这些编码有多种变体,例如用于 " +"little-endian 和 big-endian 编码的“utf-16-le”和“utf-16-be”,会指定一种特定的字节顺序并且不会忽略 " +"BOM." + +#: ../../howto/unicode.rst:599 +msgid "" +"In some areas, it is also convention to use a \"BOM\" at the start of UTF-8 " +"encoded files; the name is misleading since UTF-8 is not byte-order " +"dependent. The mark simply announces that the file is encoded in UTF-8. For" +" reading such files, use the 'utf-8-sig' codec to automatically skip the " +"mark if present." +msgstr "" +"在某些地区,习惯在 UTF-8 编码文件的开头用上“BOM”;此名称具有误导性,因为 UTF-8 与字节顺序无关。此标记只是声明该文件以 UTF-8 " +"编码。要读取此类文件,请使用“utf-8-sig”编解码器自动忽略此标记。" + +#: ../../howto/unicode.rst:606 +msgid "Unicode filenames" +msgstr "Unicode 文件名" + +#: ../../howto/unicode.rst:608 +msgid "" +"Most of the operating systems in common use today support filenames that " +"contain arbitrary Unicode characters. Usually this is implemented by " +"converting the Unicode string into some encoding that varies depending on " +"the system. Today Python is converging on using UTF-8: Python on MacOS has " +"used UTF-8 for several versions, and Python 3.6 switched to using UTF-8 on " +"Windows as well. On Unix systems, there will only be a :term:`filesystem " +"encoding `. if you've set the " +"``LANG`` or ``LC_CTYPE`` environment variables; if you haven't, the default " +"encoding is again UTF-8." +msgstr "" +"当今大多数操作系统都支持包含任意 Unicode 字符的文件名。通常这是通过将 Unicode 字符串转换为某种根据具体系统而定的编码格式来实现的。 " +"如今的 Python 倾向于使用 UTF-8:MacOS 上的 Python 已经在多个版本中使用了 UTF-8,而 Python 3.6 也已在 " +"Windows 上改用了 UTF-8。在 Unix 系统中,将只有一个 :term:`文件系统编码格式 `。如果你已设置了 ``LANG`` 或 ``LC_CTYPE`` 环境变量的话;如果未设置,则默认编码格式还是 " +"UTF-8." + +#: ../../howto/unicode.rst:618 +msgid "" +"The :func:`sys.getfilesystemencoding` function returns the encoding to use " +"on your current system, in case you want to do the encoding manually, but " +"there's not much reason to bother. When opening a file for reading or " +"writing, you can usually just provide the Unicode string as the filename, " +"and it will be automatically converted to the right encoding for you::" +msgstr "" +":func:`sys.getfilesystemencoding` " +"函数将返回要在当前系统采用的编码,若想手动进行编码时即可用到,但无需多虑。在打开文件进行读写时,通常只需提供 Unicode " +"字符串作为文件名,会自动转换为合适的编码格式::" + +#: ../../howto/unicode.rst:624 +msgid "" +"filename = 'filename\\u4500abc'\n" +"with open(filename, 'w') as f:\n" +" f.write('blah\\n')" +msgstr "" +"filename = 'filename\\u4500abc'\n" +"with open(filename, 'w') as f:\n" +" f.write('blah\\n')" + +#: ../../howto/unicode.rst:628 +msgid "" +"Functions in the :mod:`os` module such as :func:`os.stat` will also accept " +"Unicode filenames." +msgstr ":mod:`os` 模块中的函数也能接受 Unicode 文件名,如 :func:`os.stat`。" + +#: ../../howto/unicode.rst:631 +msgid "" +"The :func:`os.listdir` function returns filenames, which raises an issue: " +"should it return the Unicode version of filenames, or should it return bytes" +" containing the encoded versions? :func:`os.listdir` can do both, depending" +" on whether you provided the directory path as bytes or a Unicode string. " +"If you pass a Unicode string as the path, filenames will be decoded using " +"the filesystem's encoding and a list of Unicode strings will be returned, " +"while passing a byte path will return the filenames as bytes. For example, " +"assuming the default :term:`filesystem encoding ` is UTF-8, running the following program::" +msgstr "" +":func:`os.listdir` 函数返回文件名,这引发了一个问题:它应该返回文件名的 Unicode 版本,还是应该返回包含已编码版本的字节串? " +"这两者 :func:`os.listdir` 都能做到,具体取决于你给出的目录路径是字节串还是 Unicode 字符串形式的。如果你传入一个 " +"Unicode 字符串作为路径,文件名将使用文件系统的编码格式进行解码并返回一个 Unicode " +"字符串列表,而传入一个字节串形式的路径则将返回字节串形式的文件名。例如,假定默认 :term:`文件系统编码 ` 为 UTF-8,运行以下程序::" + +#: ../../howto/unicode.rst:641 +msgid "" +"fn = 'filename\\u4500abc'\n" +"f = open(fn, 'w')\n" +"f.close()\n" +"\n" +"import os\n" +"print(os.listdir(b'.'))\n" +"print(os.listdir('.'))" +msgstr "" +"fn = 'filename\\u4500abc'\n" +"f = open(fn, 'w')\n" +"f.close()\n" +"\n" +"import os\n" +"print(os.listdir(b'.'))\n" +"print(os.listdir('.'))" + +#: ../../howto/unicode.rst:649 +msgid "will produce the following output:" +msgstr "将产生以下输出:" + +#: ../../howto/unicode.rst:651 +msgid "" +"$ python listdir-test.py\n" +"[b'filename\\xe4\\x94\\x80abc', ...]\n" +"['filename\\u4500abc', ...]" +msgstr "" +"$ python listdir-test.py\n" +"[b'filename\\xe4\\x94\\x80abc', ...]\n" +"['filename\\u4500abc', ...]" + +#: ../../howto/unicode.rst:657 +msgid "" +"The first list contains UTF-8-encoded filenames, and the second list " +"contains the Unicode versions." +msgstr "第一个列表包含 UTF-8 编码的文件名,第二个列表则包含 Unicode 版本的。" + +#: ../../howto/unicode.rst:660 +msgid "" +"Note that on most occasions, you should can just stick with using Unicode " +"with these APIs. The bytes APIs should only be used on systems where " +"undecodable file names can be present; that's pretty much only Unix systems " +"now." +msgstr "" +"请注意,大多时候应该坚持用这些 API 处理 Unicode。字节串 API 应该仅用于可能存在不可解码文件名的系统;现在几乎仅剩 Unix 系统了。" + +#: ../../howto/unicode.rst:667 +msgid "Tips for Writing Unicode-aware Programs" +msgstr "识别 Unicode 的编程技巧" + +#: ../../howto/unicode.rst:669 +msgid "" +"This section provides some suggestions on writing software that deals with " +"Unicode." +msgstr "本节提供了一些关于编写 Unicode 处理软件的建议。" + +#: ../../howto/unicode.rst:672 +msgid "The most important tip is:" +msgstr "最重要的技巧如下:" + +#: ../../howto/unicode.rst:674 +msgid "" +"Software should only work with Unicode strings internally, decoding the " +"input data as soon as possible and encoding the output only at the end." +msgstr "程序应只在内部处理 Unicode 字符串,尽快对输入数据进行解码,并只在最后对输出进行编码。" + +#: ../../howto/unicode.rst:677 +msgid "" +"If you attempt to write processing functions that accept both Unicode and " +"byte strings, you will find your program vulnerable to bugs wherever you " +"combine the two different kinds of strings. There is no automatic encoding " +"or decoding: if you do e.g. ``str + bytes``, a :exc:`TypeError` will be " +"raised." +msgstr "" +"如果尝试编写的处理函数对 Unicode " +"和字节串形式的字符串都能接受,就会发现组合使用两种不同类型的字符串时,容易产生差错。没办法做到自动编码或解码:如果执行 ``str + " +"bytes``,则会触发 :exc:`TypeError`。" + +#: ../../howto/unicode.rst:682 +msgid "" +"When using data coming from a web browser or some other untrusted source, a " +"common technique is to check for illegal characters in a string before using" +" the string in a generated command line or storing it in a database. If " +"you're doing this, be careful to check the decoded string, not the encoded " +"bytes data; some encodings may have interesting properties, such as not " +"being bijective or not being fully ASCII-compatible. This is especially " +"true if the input data also specifies the encoding, since the attacker can " +"then choose a clever way to hide malicious text in the encoded bytestream." +msgstr "" +"当要使用的数据来自 Web " +"浏览器或其他不受信来源时,常用技术是在用该字符串生成命令行之前,或要存入数据库之前,先检查字符串中是否包含非法字符。请仔细检查解码后的字符串,而不是编码格式的字节串数据;有些编码可能具备一些有趣的特性,例如与" +" ASCII 不是一一对应或不完全兼容。如果输入数据还指定了编码格式,则尤其如此,因为攻击者可以选择一种巧妙的方式将恶意文本隐藏在经过编码的字节流中。" + +#: ../../howto/unicode.rst:693 +msgid "Converting Between File Encodings" +msgstr "在文件编码格式之间进行转换" + +#: ../../howto/unicode.rst:695 +msgid "" +"The :class:`~codecs.StreamRecoder` class can transparently convert between " +"encodings, taking a stream that returns data in encoding #1 and behaving " +"like a stream returning data in encoding #2." +msgstr "" +":class:`~codecs.StreamRecoder` 类可以在两种编码之间透明地进行转换,参数为编码格式为 #1 " +"的数据流,表现行为则是编码格式为 #2 的数据流。" + +#: ../../howto/unicode.rst:699 +msgid "" +"For example, if you have an input file *f* that's in Latin-1, you can wrap " +"it with a :class:`~codecs.StreamRecoder` to return bytes encoded in UTF-8::" +msgstr "" +"假设输入文件 *f* 采用 Latin-1 编码格式,即可用 :class:`~codecs.StreamRecoder` 包装后返回 UTF-8 " +"编码的字节串::" + +#: ../../howto/unicode.rst:703 +msgid "" +"new_f = codecs.StreamRecoder(f,\n" +" # en/decoder: used by read() to encode its results and\n" +" # by write() to decode its input.\n" +" codecs.getencoder('utf-8'), codecs.getdecoder('utf-8'),\n" +"\n" +" # reader/writer: used to read and write to the stream.\n" +" codecs.getreader('latin-1'), codecs.getwriter('latin-1') )" +msgstr "" +"new_f = codecs.StreamRecoder(f,\n" +" # en/decoder: 被 read() 用来编码其结果\n" +" # 并被 write() 用来解码其输入。\n" +" codecs.getencoder('utf-8'), codecs.getdecoder('utf-8'),\n" +"\n" +" # reader/writer: 用于读取和写入流。\n" +" codecs.getreader('latin-1'), codecs.getwriter('latin-1') )" + +#: ../../howto/unicode.rst:713 +msgid "Files in an Unknown Encoding" +msgstr "编码格式未知的文件" + +#: ../../howto/unicode.rst:715 +msgid "" +"What can you do if you need to make a change to a file, but don't know the " +"file's encoding? If you know the encoding is ASCII-compatible and only want" +" to examine or modify the ASCII parts, you can open the file with the " +"``surrogateescape`` error handler::" +msgstr "" +"若需对文件进行修改,但不知道文件的编码,那该怎么办呢?如果已知编码格式与 ASCII 兼容,并且只想查看或修改 ASCII 部分,则可利用 " +"``surrogateescape`` 错误处理器打开文件::" + +#: ../../howto/unicode.rst:720 +msgid "" +"with open(fname, 'r', encoding=\"ascii\", errors=\"surrogateescape\") as f:\n" +" data = f.read()\n" +"\n" +"# make changes to the string 'data'\n" +"\n" +"with open(fname + '.new', 'w',\n" +" encoding=\"ascii\", errors=\"surrogateescape\") as f:\n" +" f.write(data)" +msgstr "" +"with open(fname, 'r', encoding=\"ascii\", errors=\"surrogateescape\") as f:\n" +" data = f.read()\n" +"\n" +"# 对字符串“data”进行更改\n" +"\n" +"with open(fname + '.new', 'w',\n" +" encoding=\"ascii\", errors=\"surrogateescape\") as f:\n" +" f.write(data)" + +#: ../../howto/unicode.rst:729 +msgid "" +"The ``surrogateescape`` error handler will decode any non-ASCII bytes as " +"code points in a special range running from U+DC80 to U+DCFF. These code " +"points will then turn back into the same bytes when the ``surrogateescape`` " +"error handler is used to encode the data and write it back out." +msgstr "" +"``surrogateescape`` 错误处理器会把所有非 ASCII 字节解码为 U+DC80 至 U+DCFF 这一特殊范围的码位。当 " +"``surrogateescape`` 错误处理器用于数据编码并回写时,这些码位将转换回原样。" + +#: ../../howto/unicode.rst:739 +msgid "" +"One section of `Mastering Python 3 Input/Output " +"`_, a " +"PyCon 2010 talk by David Beazley, discusses text processing and binary data " +"handling." +msgstr "" +"David Beazley 在 PyCon 2010 上的演讲 `掌握 Python 3 输入/输出 " +"`_ " +"中,有一节讨论了文本和二进制数据的处理。" + +#: ../../howto/unicode.rst:743 +msgid "" +"The `PDF slides for Marc-André Lemburg's presentation \"Writing Unicode-" +"aware Applications in Python\" " +"`_ discuss questions of character encodings as " +"well as how to internationalize and localize an application. These slides " +"cover Python 2.x only." +msgstr "" +"`Marc-André Lemburg 演示的 PDF 幻灯片\"在 Python 中编写支持 Unicode 的应用程序\" " +"`_,讨论了字符编码问题以及如何国际化和本地化应用程序。这些幻灯片仅涵盖 Python 2.x。" + +#: ../../howto/unicode.rst:749 +msgid "" +"`The Guts of Unicode in Python `_ is a PyCon 2013 talk by Benjamin Peterson that " +"discusses the internal Unicode representation in Python 3.3." +msgstr "" +"`Python Unicode 实质 `_ 是 Benjamin Peterson 在 PyCon 2013 上的演讲,讨论了 Unicode 在 Python 3.3 " +"中的内部表示。" + +#: ../../howto/unicode.rst:756 +msgid "Acknowledgements" +msgstr "致谢" + +#: ../../howto/unicode.rst:758 +msgid "" +"The initial draft of this document was written by Andrew Kuchling. It has " +"since been revised further by Alexander Belopolsky, Georg Brandl, Andrew " +"Kuchling, and Ezio Melotti." +msgstr "" +"本文初稿由 Andrew Kuchling 撰写。此后,Alexander Belopolsky、Georg Brandl、Andrew " +"Kuchling 和 Ezio Melotti 作了进一步修订。" + +#: ../../howto/unicode.rst:762 +msgid "" +"Thanks to the following people who have noted errors or offered suggestions " +"on this article: Éric Araujo, Nicholas Bastin, Nick Coghlan, Marius " +"Gedminas, Kent Johnson, Ken Krugler, Marc-André Lemburg, Martin von Löwis, " +"Terry J. Reedy, Serhiy Storchaka, Eryk Sun, Chad Whitacre, Graham Wideman." +msgstr "" +"感谢以下各位指出本文错误或提出建议:Éric Araujo、Nicholas Bastin、Nick Coghlan、Marius Gedminas, " +"Kent Johnson, Ken Krugler, Marc-André Lemburg, Martin von Löwis, Terry J. " +"Reedy, Serhiy Storchaka, Eryk Sun, Chad Whitacre, Graham Wideman." diff --git a/howto/urllib2.po b/howto/urllib2.po new file mode 100644 index 0000000000..b2a6764ea8 --- /dev/null +++ b/howto/urllib2.po @@ -0,0 +1,1081 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../howto/urllib2.rst:5 +msgid "HOWTO Fetch Internet Resources Using The urllib Package" +msgstr "如何利用 urllib 包获取网络资源" + +#: ../../howto/urllib2.rst:0 +msgid "Author" +msgstr "作者" + +#: ../../howto/urllib2.rst:7 +msgid "`Michael Foord `_" +msgstr "`Michael Foord `_" + +#: ../../howto/urllib2.rst:11 +msgid "Introduction" +msgstr "概述" + +#: ../../howto/urllib2.rst:15 +msgid "" +"You may also find useful the following article on fetching web resources " +"with Python:" +msgstr "关于如何用 Python 获取 web 资源,以下文章或许也很有用:" + +#: ../../howto/urllib2.rst:18 +msgid "" +"`Basic Authentication " +"`__" +msgstr "" +"`基本身份认证 " +"`__" + +#: ../../howto/urllib2.rst:20 +msgid "A tutorial on *Basic Authentication*, with examples in Python." +msgstr "*基本认证* 的教程,带有一些 Python 示例。" + +#: ../../howto/urllib2.rst:22 +msgid "" +"**urllib.request** is a Python module for fetching URLs (Uniform Resource " +"Locators). It offers a very simple interface, in the form of the *urlopen* " +"function. This is capable of fetching URLs using a variety of different " +"protocols. It also offers a slightly more complex interface for handling " +"common situations - like basic authentication, cookies, proxies and so on. " +"These are provided by objects called handlers and openers." +msgstr "" +"**urllib.request** 是用于获取 URL(统一资源定位符)的 Python 模块。它以 *urlopen* " +"函数的形式提供了一个非常简单的接口,能用不同的协议获取 " +"URL。同时它还为处理各种常见情形提供了一个稍微复杂一些的接口——比如:基础身份认证、cookies、代理等等。这些功能是由名为 handlers 和 " +"opener 的对象提供的。" + +#: ../../howto/urllib2.rst:29 +msgid "" +"urllib.request supports fetching URLs for many \"URL schemes\" (identified " +"by the string before the ``\":\"`` in URL - for example ``\"ftp\"`` is the " +"URL scheme of ``\"ftp://python.org/\"``) using their associated network " +"protocols (e.g. FTP, HTTP). This tutorial focuses on the most common case, " +"HTTP." +msgstr "" +"urllib.request 支持多种 \"URL 方案\" (通过 URL 中 ``\":\"`` 之前的字符串加以区分 —— 如 " +"``\"ftp://python.org/\"`` 中的 ``\"ftp\"``) 即为采用其关联网络协议(FTP、HTTP 之类)的 URL 方案 " +"。本教程重点关注最常用的 HTTP 场景。" + +#: ../../howto/urllib2.rst:34 +msgid "" +"For straightforward situations *urlopen* is very easy to use. But as soon as" +" you encounter errors or non-trivial cases when opening HTTP URLs, you will " +"need some understanding of the HyperText Transfer Protocol. The most " +"comprehensive and authoritative reference to HTTP is :rfc:`2616`. This is a " +"technical document and not intended to be easy to read. This HOWTO aims to " +"illustrate using *urllib*, with enough detail about HTTP to help you " +"through. It is not intended to replace the :mod:`urllib.request` docs, but " +"is supplementary to them." +msgstr "" +"对于简单场景而言, *urlopen* 用起来十分容易。但只要在打开 HTTP URL " +"时遇到错误或非常情况,就需要对超文本传输协议有所了解才行。最全面、最权威的 HTTP 参考是 :rfc:`2616` " +"。那是一份技术文档,并没有追求可读性。本文旨在说明 *urllib* 的用法,为了便于阅读也附带了足够详细的 HTTP 信息。本文并不是为了替代 " +":mod:`urllib.request` 文档,只是其补充说明而已。" + +#: ../../howto/urllib2.rst:44 +msgid "Fetching URLs" +msgstr "获取 URL 资源" + +#: ../../howto/urllib2.rst:46 +msgid "The simplest way to use urllib.request is as follows::" +msgstr "urllib.request 最简单的使用方式如下所示::" + +#: ../../howto/urllib2.rst:48 +msgid "" +"import urllib.request\n" +"with urllib.request.urlopen('http://python.org/') as response:\n" +" html = response.read()" +msgstr "" +"import urllib.request\n" +"with urllib.request.urlopen('http://python.org/') as response:\n" +" html = response.read()" + +#: ../../howto/urllib2.rst:52 +msgid "" +"If you wish to retrieve a resource via URL and store it in a temporary " +"location, you can do so via the :func:`shutil.copyfileobj` and " +":func:`tempfile.NamedTemporaryFile` functions::" +msgstr "" +"如果想通过 URL 获取资源并临时存储一下,可以采用 :func:`shutil.copyfileobj` 和 " +":func:`tempfile.NamedTemporaryFile` 函数::" + +#: ../../howto/urllib2.rst:56 +msgid "" +"import shutil\n" +"import tempfile\n" +"import urllib.request\n" +"\n" +"with urllib.request.urlopen('http://python.org/') as response:\n" +" with tempfile.NamedTemporaryFile(delete=False) as tmp_file:\n" +" shutil.copyfileobj(response, tmp_file)\n" +"\n" +"with open(tmp_file.name) as html:\n" +" pass" +msgstr "" +"import shutil\n" +"import tempfile\n" +"import urllib.request\n" +"\n" +"with urllib.request.urlopen('http://python.org/') as response:\n" +" with tempfile.NamedTemporaryFile(delete=False) as tmp_file:\n" +" shutil.copyfileobj(response, tmp_file)\n" +"\n" +"with open(tmp_file.name) as html:\n" +" pass" + +#: ../../howto/urllib2.rst:67 +msgid "" +"Many uses of urllib will be that simple (note that instead of an 'http:' URL" +" we could have used a URL starting with 'ftp:', 'file:', etc.). However, " +"it's the purpose of this tutorial to explain the more complicated cases, " +"concentrating on HTTP." +msgstr "" +"urllib 的很多用法就是这么简单(注意 URL 不仅可以 http: 开头,还可以是 ftp: 、file: " +"等)。不过本教程的目的是介绍更加复杂的应用场景,重点还是关注 HTTP。" + +#: ../../howto/urllib2.rst:72 +msgid "" +"HTTP is based on requests and responses - the client makes requests and " +"servers send responses. urllib.request mirrors this with a ``Request`` " +"object which represents the HTTP request you are making. In its simplest " +"form you create a Request object that specifies the URL you want to fetch. " +"Calling ``urlopen`` with this Request object returns a response object for " +"the URL requested. This response is a file-like object, which means you can " +"for example call ``.read()`` on the response::" +msgstr "" +"HTTP 以请求和响应为基础——客户端生成请求,服务器发送响应。urllib.request 用 ``Request`` 对象来表示要生成的 HTTP " +"请求。最简单的形式就是创建一个 Request 对象,指定了想要获取的 URL。用这个 Request 对象作为参数调用 ``urlopen`` " +",将会返回该 URL 的响应对象。响应对象类似于文件对象,就是说可以对其调用 ``.read()`` 之类的方法::" + +#: ../../howto/urllib2.rst:80 +msgid "" +"import urllib.request\n" +"\n" +"req = urllib.request.Request('http://python.org/')\n" +"with urllib.request.urlopen(req) as response:\n" +" the_page = response.read()" +msgstr "" +"import urllib.request\n" +"\n" +"req = urllib.request.Request('http://python.org/')\n" +"with urllib.request.urlopen(req) as response:\n" +" the_page = response.read()" + +#: ../../howto/urllib2.rst:86 +msgid "" +"Note that urllib.request makes use of the same Request interface to handle " +"all URL schemes. For example, you can make an FTP request like so::" +msgstr "请注意,urllib.request 用同一个 Request 接口处理所有 URL 方案。比如可生成 FTP 请求如下::" + +#: ../../howto/urllib2.rst:89 +msgid "req = urllib.request.Request('ftp://example.com/')" +msgstr "req = urllib.request.Request('ftp://example.com/')" + +#: ../../howto/urllib2.rst:91 +msgid "" +"In the case of HTTP, there are two extra things that Request objects allow " +"you to do: First, you can pass data to be sent to the server. Second, you " +"can pass extra information (\"metadata\") *about* the data or about the " +"request itself, to the server - this information is sent as HTTP " +"\"headers\". Let's look at each of these in turn." +msgstr "" +"就 HTTP 而言,Request 对象能够做两件额外的事情:首先可以把数据传给服务器。其次,可以将 *有关* " +"数据或请求本身的额外信息(metadata)传给服务器——这些信息将会作为 HTTP“头部”数据发送。下面依次看下。" + +#: ../../howto/urllib2.rst:98 +msgid "Data" +msgstr "数据" + +#: ../../howto/urllib2.rst:100 +msgid "" +"Sometimes you want to send data to a URL (often the URL will refer to a CGI " +"(Common Gateway Interface) script or other web application). With HTTP, this" +" is often done using what's known as a **POST** request. This is often what " +"your browser does when you submit a HTML form that you filled in on the web." +" Not all POSTs have to come from forms: you can use a POST to transmit " +"arbitrary data to your own application. In the common case of HTML forms, " +"the data needs to be encoded in a standard way, and then passed to the " +"Request object as the ``data`` argument. The encoding is done using a " +"function from the :mod:`urllib.parse` library. ::" +msgstr "" +"有时需要向某个 URL 发送数据,通常此 URL 会指向某个 CGI(通用网关接口)脚本或其他 web 应用。对于 HTTP 而言,这通常会用所谓的 " +"**POST** 请求来完成。当要把 Web 页填写的 HTML 表单提交时,浏览器通常会执行此操作。但并不是所有的 POST 都来自表单:可以用 " +"POST 方式传输任何数据到自己的应用上。对于通常的 HTML 表单,数据需要以标准的方式编码,然后作为 ``data`` 参数传给 Request " +"对象。编码过程是用 :mod:`urllib.parse` 库的函数完成的。::" + +#: ../../howto/urllib2.rst:110 +msgid "" +"import urllib.parse\n" +"import urllib.request\n" +"\n" +"url = 'http://www.someserver.com/cgi-bin/register.cgi'\n" +"values = {'name' : 'Michael Foord',\n" +" 'location' : 'Northampton',\n" +" 'language' : 'Python' }\n" +"\n" +"data = urllib.parse.urlencode(values)\n" +"data = data.encode('ascii') # data should be bytes\n" +"req = urllib.request.Request(url, data)\n" +"with urllib.request.urlopen(req) as response:\n" +" the_page = response.read()" +msgstr "" +"import urllib.parse\n" +"import urllib.request\n" +"\n" +"url = 'http://www.someserver.com/cgi-bin/register.cgi'\n" +"values = {'name' : 'Michael Foord',\n" +" 'location' : 'Northampton',\n" +" 'language' : 'Python' }\n" +"\n" +"data = urllib.parse.urlencode(values)\n" +"data = data.encode('ascii') # 数据应为字节串\n" +"req = urllib.request.Request(url, data)\n" +"with urllib.request.urlopen(req) as response:\n" +" the_page = response.read()" + +#: ../../howto/urllib2.rst:124 +msgid "" +"Note that other encodings are sometimes required (e.g. for file upload from " +"HTML forms - see `HTML Specification, Form Submission " +"`_ for more " +"details)." +msgstr "" +"请注意,有时还需要采用其他编码,比如由 HTML 表单上传文件——更多细节请参见 `HTML 规范,提交表单 " +"`_ ." + +#: ../../howto/urllib2.rst:129 +msgid "" +"If you do not pass the ``data`` argument, urllib uses a **GET** request. One" +" way in which GET and POST requests differ is that POST requests often have " +"\"side-effects\": they change the state of the system in some way (for " +"example by placing an order with the website for a hundredweight of tinned " +"spam to be delivered to your door). Though the HTTP standard makes it clear" +" that POSTs are intended to *always* cause side-effects, and GET requests " +"*never* to cause side-effects, nothing prevents a GET request from having " +"side-effects, nor a POST requests from having no side-effects. Data can also" +" be passed in an HTTP GET request by encoding it in the URL itself." +msgstr "" +"如果不传递 ``data`` 参数,urllib 将采用 **GET** 请求。GET 和 POST 请求有一点不同,POST " +"请求往往具有“副作用”,它们会以某种方式改变系统的状态。例如,从网站下一个订单,购买一大堆罐装垃圾并运送到家。尽管 HTTP 标准明确指出 POST " +"*总是* 要导致副作用,而 GET 请求 *从来不会* 导致副作用。但没有什么办法能阻止 GET 和 POST 请求的副作用。数据也可以在 HTTP " +"GET 请求中传递,只要把数据编码到 URL 中即可。" + +#: ../../howto/urllib2.rst:139 +msgid "This is done as follows::" +msgstr "做法如下所示::" + +#: ../../howto/urllib2.rst:141 +msgid "" +">>> import urllib.request\n" +">>> import urllib.parse\n" +">>> data = {}\n" +">>> data['name'] = 'Somebody Here'\n" +">>> data['location'] = 'Northampton'\n" +">>> data['language'] = 'Python'\n" +">>> url_values = urllib.parse.urlencode(data)\n" +">>> print(url_values) # The order may differ from below.\n" +"name=Somebody+Here&language=Python&location=Northampton\n" +">>> url = 'http://www.example.com/example.cgi'\n" +">>> full_url = url + '?' + url_values\n" +">>> data = urllib.request.urlopen(full_url)" +msgstr "" +">>> import urllib.request\n" +">>> import urllib.parse\n" +">>> data = {}\n" +">>> data['name'] = 'Somebody Here'\n" +">>> data['location'] = 'Northampton'\n" +">>> data['language'] = 'Python'\n" +">>> url_values = urllib.parse.urlencode(data)\n" +">>> print(url_values) # The order may differ from below.\n" +"name=Somebody+Here&language=Python&location=Northampton\n" +">>> url = 'http://www.example.com/example.cgi'\n" +">>> full_url = url + '?' + url_values\n" +">>> data = urllib.request.urlopen(full_url)" + +#: ../../howto/urllib2.rst:154 +msgid "" +"Notice that the full URL is created by adding a ``?`` to the URL, followed " +"by the encoded values." +msgstr "请注意,完整的 URL 是通过在其中添加 ``?`` 创建的,后面跟着经过编码的数据。" + +#: ../../howto/urllib2.rst:158 +msgid "Headers" +msgstr "HTTP 头部信息" + +#: ../../howto/urllib2.rst:160 +msgid "" +"We'll discuss here one particular HTTP header, to illustrate how to add " +"headers to your HTTP request." +msgstr "下面介绍一个具体的 HTTP 头部信息,以此说明如何在 HTTP 请求加入头部信息。" + +#: ../../howto/urllib2.rst:163 +msgid "" +"Some websites [#]_ dislike being browsed by programs, or send different " +"versions to different browsers [#]_. By default urllib identifies itself as " +"``Python-urllib/x.y`` (where ``x`` and ``y`` are the major and minor version" +" numbers of the Python release, e.g. ``Python-urllib/2.5``), which may " +"confuse the site, or just plain not work. The way a browser identifies " +"itself is through the ``User-Agent`` header [#]_. When you create a Request " +"object you can pass a dictionary of headers in. The following example makes " +"the same request as above, but identifies itself as a version of Internet " +"Explorer [#]_. ::" +msgstr "" +"有些网站 [#]_ 不愿被程序浏览到,或者要向不同的浏览器发送不同版本 [#]_ 的网页。默认情况下,urllib 将自身标识为“Python-" +"urllib/xy” (其中 ``x``、``y`` 是 Python 版本的主、次版本号,例如 ``Python-" +"urllib/2.5``),这可能会让网站不知所措,或者干脆就使其无法正常工作。浏览器是通过头部信息 ``User-Agent`` [#]_ " +"来标识自己的。在创建 Request 对象时,可以传入字典形式的头部信息。以下示例将生成与之前相同的请求,只是将自身标识为某个版本的 Internet " +"Explorer [#]_ ::" + +#: ../../howto/urllib2.rst:174 +msgid "" +"import urllib.parse\n" +"import urllib.request\n" +"\n" +"url = 'http://www.someserver.com/cgi-bin/register.cgi'\n" +"user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'\n" +"values = {'name': 'Michael Foord',\n" +" 'location': 'Northampton',\n" +" 'language': 'Python' }\n" +"headers = {'User-Agent': user_agent}\n" +"\n" +"data = urllib.parse.urlencode(values)\n" +"data = data.encode('ascii')\n" +"req = urllib.request.Request(url, data, headers)\n" +"with urllib.request.urlopen(req) as response:\n" +" the_page = response.read()" +msgstr "" +"import urllib.parse\n" +"import urllib.request\n" +"\n" +"url = 'http://www.someserver.com/cgi-bin/register.cgi'\n" +"user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'\n" +"values = {'name': 'Michael Foord',\n" +" 'location': 'Northampton',\n" +" 'language': 'Python' }\n" +"headers = {'User-Agent': user_agent}\n" +"\n" +"data = urllib.parse.urlencode(values)\n" +"data = data.encode('ascii')\n" +"req = urllib.request.Request(url, data, headers)\n" +"with urllib.request.urlopen(req) as response:\n" +" the_page = response.read()" + +#: ../../howto/urllib2.rst:190 +msgid "" +"The response also has two useful methods. See the section on `info and " +"geturl`_ which comes after we have a look at what happens when things go " +"wrong." +msgstr "响应对象也有两个很有用的方法。请参阅 `info and geturl`_ 一节,该节位于我们讨论完出错情况之后。" + +#: ../../howto/urllib2.rst:195 +msgid "Handling Exceptions" +msgstr "异常的处理" + +#: ../../howto/urllib2.rst:197 +msgid "" +"*urlopen* raises :exc:`~urllib.error.URLError` when it cannot handle a " +"response (though as usual with Python APIs, built-in exceptions such as " +":exc:`ValueError`, :exc:`TypeError` etc. may also be raised)." +msgstr "" +"当 *urlopen* 无法处理响应信息时将会引发 :exc:`~urllib.error.URLError` (当然与 Python API " +"通常的情况一样,也可能会引发如 :exc:`ValueError`, :exc:`TypeError` 之类的内置异常)。" + +#: ../../howto/urllib2.rst:201 +msgid "" +":exc:`~urllib.error.HTTPError` is the subclass of " +":exc:`~urllib.error.URLError` raised in the specific case of HTTP URLs." +msgstr "" +":exc:`~urllib.error.HTTPError` 是在 HTTP URL 的特定情况下引发的 " +":exc:`~urllib.error.URLError` 的子类。" + +#: ../../howto/urllib2.rst:204 +msgid "" +"The exception classes are exported from the :mod:`urllib.error` module." +msgstr "上述异常类是从 :mod:`urllib.error` 模块中导出的。" + +#: ../../howto/urllib2.rst:207 +msgid "URLError" +msgstr "URLError" + +#: ../../howto/urllib2.rst:209 +msgid "" +"Often, URLError is raised because there is no network connection (no route " +"to the specified server), or the specified server doesn't exist. In this " +"case, the exception raised will have a 'reason' attribute, which is a tuple " +"containing an error code and a text error message." +msgstr "" +"触发 URLError 的原因,通常是网络不通(或者没有到指定服务器的路由),或者指定的服务器不存在。这时触发的异常会带有一个 reason " +"属性,是一个包含错误代码和文本错误信息的元组。" + +#: ../../howto/urllib2.rst:214 +msgid "e.g. ::" +msgstr "例如::" + +#: ../../howto/urllib2.rst:216 +msgid "" +">>> req = urllib.request.Request('http://www.pretend_server.org')\n" +">>> try: urllib.request.urlopen(req)\n" +"... except urllib.error.URLError as e:\n" +"... print(e.reason)\n" +"...\n" +"(4, 'getaddrinfo failed')" +msgstr "" +">>> req = urllib.request.Request('http://www.pretend_server.org')\n" +">>> try: urllib.request.urlopen(req)\n" +"... except urllib.error.URLError as e:\n" +"... print(e.reason)\n" +"...\n" +"(4, 'getaddrinfo failed')" + +#: ../../howto/urllib2.rst:225 +msgid "HTTPError" +msgstr "HTTPError" + +#: ../../howto/urllib2.rst:227 +msgid "" +"Every HTTP response from the server contains a numeric \"status code\". " +"Sometimes the status code indicates that the server is unable to fulfil the " +"request. The default handlers will handle some of these responses for you " +"(for example, if the response is a \"redirection\" that requests the client " +"fetch the document from a different URL, urllib will handle that for you). " +"For those it can't handle, urlopen will raise an " +":exc:`~urllib.error.HTTPError`. Typical errors include '404' (page not " +"found), '403' (request forbidden), and '401' (authentication required)." +msgstr "" +"来自服务器的每个 HTTP 响应都包含一个数字形式的“状态码”。 " +"有时该状态码表明服务器无法完成请求。默认的处理器将会为你处理其中的部分响应(例如,当响应为要求客户端从另一 URL " +"获取文档的“重定向”响应时,urllib 将为你处理该响应)。对于无法处理的响应,urlopen 将会引发 " +":exc:`~urllib.error.HTTPError`。典型的错误包括 \"404\"(页面未找到)、\"403\"(请求遭拒)和 " +"\"401\"(需要身份认证)等。" + +#: ../../howto/urllib2.rst:235 +msgid "" +"See section 10 of :rfc:`2616` for a reference on all the HTTP error codes." +msgstr "全部的 HTTP 错误码请参阅 :rfc:`2616` 。" + +#: ../../howto/urllib2.rst:237 +msgid "" +"The :exc:`~urllib.error.HTTPError` instance raised will have an integer " +"'code' attribute, which corresponds to the error sent by the server." +msgstr "" +"被引发的 :exc:`~urllib.error.HTTPError` 实例将有一个整数形式的 'code' 属性,对应于服务器发送的错误信息。" + +#: ../../howto/urllib2.rst:241 +msgid "Error Codes" +msgstr "错误代码" + +#: ../../howto/urllib2.rst:243 +msgid "" +"Because the default handlers handle redirects (codes in the 300 range), and " +"codes in the 100--299 range indicate success, you will usually only see " +"error codes in the 400--599 range." +msgstr "" +"由于默认处理函数会自行处理重定向(300 段的错误码),而且 100--299 的状态码表示成功,因此通常只会出现 400--599 的错误码。" + +#: ../../howto/urllib2.rst:247 +msgid "" +":attr:`http.server.BaseHTTPRequestHandler.responses` is a useful dictionary " +"of response codes that shows all the response codes used by :rfc:`2616`. An " +"excerpt from the dictionary is shown below ::" +msgstr "" +":attr:`http.server.BaseHTTPRequestHandler.responses` 是一个很有用的响应码字典,它提供了 " +":rfc:`2616` 用到的所有码。下面显示了来自该字典的一段摘录 ::" + +#: ../../howto/urllib2.rst:251 +msgid "" +"responses = {\n" +" ...\n" +" : ('OK', 'Request fulfilled, document follows'),\n" +" ...\n" +" : ('Forbidden',\n" +" 'Request forbidden -- authorization will '\n" +" 'not help'),\n" +" : ('Not Found',\n" +" 'Nothing matches the given URI'),\n" +" ...\n" +" : (\"I'm a Teapot\",\n" +" 'Server refuses to brew coffee because '\n" +" 'it is a teapot'),\n" +" ...\n" +" : ('Service Unavailable',\n" +" 'The server cannot process the '\n" +" 'request due to a high load'),\n" +" ...\n" +" }" +msgstr "" +"responses = {\n" +" ...\n" +" : ('OK', 'Request fulfilled, document follows'),\n" +" ...\n" +" : ('Forbidden',\n" +" 'Request forbidden -- authorization will '\n" +" 'not help'),\n" +" : ('Not Found',\n" +" 'Nothing matches the given URI'),\n" +" ...\n" +" : (\"I'm a Teapot\",\n" +" 'Server refuses to brew coffee because '\n" +" 'it is a teapot'),\n" +" ...\n" +" : ('Service Unavailable',\n" +" 'The server cannot process the '\n" +" 'request due to a high load'),\n" +" ...\n" +" }" + +#: ../../howto/urllib2.rst:271 +msgid "" +"When an error is raised the server responds by returning an HTTP error code " +"*and* an error page. You can use the :exc:`~urllib.error.HTTPError` instance" +" as a response on the page returned. This means that as well as the code " +"attribute, it also has read, geturl, and info, methods as returned by the " +"``urllib.response`` module::" +msgstr "" +"当错误被引发时服务器会通过返回 HTTP 错误码 *和* 错误页面进行响应。你可以在返回的页面上使用 " +":exc:`~urllib.error.HTTPError` 实例作为响应。这意味着除了 code 属性之外,它还像 " +"``urllib.response`` 模块所返回的对象那样具有 read, geturl 和 info 等方法::" + +#: ../../howto/urllib2.rst:276 +msgid "" +">>> req = urllib.request.Request('http://www.python.org/fish.html')\n" +">>> try:\n" +"... urllib.request.urlopen(req)\n" +"... except urllib.error.HTTPError as e:\n" +"... print(e.code)\n" +"... print(e.read())\n" +"...\n" +"404\n" +"b'\\n\\n\\nPage Not Found\\n\n" +" ..." +msgstr "" +">>> req = urllib.request.Request('http://www.python.org/fish.html')\n" +">>> try:\n" +"... urllib.request.urlopen(req)\n" +"... except urllib.error.HTTPError as e:\n" +"... print(e.code)\n" +"... print(e.read())\n" +"...\n" +"404\n" +"b'\\n\\n\\nPage Not Found\\n\n" +" ..." + +#: ../../howto/urllib2.rst:291 +msgid "Wrapping it Up" +msgstr "总之" + +#: ../../howto/urllib2.rst:293 +msgid "" +"So if you want to be prepared for :exc:`~urllib.error.HTTPError` *or* " +":exc:`~urllib.error.URLError` there are two basic approaches. I prefer the " +"second approach." +msgstr "" +"因此当你想为 :exc:`~urllib.error.HTTPError` *或* :exc:`~urllib.error.URLError` " +"做好准备时有两种基本的方案。我更倾向使用第二种方案。" + +#: ../../howto/urllib2.rst:297 +msgid "Number 1" +msgstr "第一种方案" + +#: ../../howto/urllib2.rst:302 +msgid "" +"from urllib.request import Request, urlopen\n" +"from urllib.error import URLError, HTTPError\n" +"req = Request(someurl)\n" +"try:\n" +" response = urlopen(req)\n" +"except HTTPError as e:\n" +" print('The server couldn\\'t fulfill the request.')\n" +" print('Error code: ', e.code)\n" +"except URLError as e:\n" +" print('We failed to reach a server.')\n" +" print('Reason: ', e.reason)\n" +"else:\n" +" # everything is fine" +msgstr "" +"from urllib.request import Request, urlopen\n" +"from urllib.error import URLError, HTTPError\n" +"req = Request(someurl)\n" +"try:\n" +" response = urlopen(req)\n" +"except HTTPError as e:\n" +" print('The server couldn\\'t fulfill the request.')\n" +" print('Error code: ', e.code)\n" +"except URLError as e:\n" +" print('We failed to reach a server.')\n" +" print('Reason: ', e.reason)\n" +"else:\n" +" # 一切正常" + +#: ../../howto/urllib2.rst:319 +msgid "" +"The ``except HTTPError`` *must* come first, otherwise ``except URLError`` " +"will *also* catch an :exc:`~urllib.error.HTTPError`." +msgstr "" +"``except HTTPError`` *必须* 首先被处理,否则 ``except URLError`` 将会 *同时* 捕获 " +":exc:`~urllib.error.HTTPError`." + +#: ../../howto/urllib2.rst:323 +msgid "Number 2" +msgstr "第二种方案" + +#: ../../howto/urllib2.rst:327 +msgid "" +"from urllib.request import Request, urlopen\n" +"from urllib.error import URLError\n" +"req = Request(someurl)\n" +"try:\n" +" response = urlopen(req)\n" +"except URLError as e:\n" +" if hasattr(e, 'reason'):\n" +" print('We failed to reach a server.')\n" +" print('Reason: ', e.reason)\n" +" elif hasattr(e, 'code'):\n" +" print('The server couldn\\'t fulfill the request.')\n" +" print('Error code: ', e.code)\n" +"else:\n" +" # everything is fine" +msgstr "" +"from urllib.request import Request, urlopen\n" +"from urllib.error import URLError\n" +"req = Request(someurl)\n" +"try:\n" +" response = urlopen(req)\n" +"except URLError as e:\n" +" if hasattr(e, 'reason'):\n" +" print('We failed to reach a server.')\n" +" print('Reason: ', e.reason)\n" +" elif hasattr(e, 'code'):\n" +" print('The server couldn\\'t fulfill the request.')\n" +" print('Error code: ', e.code)\n" +"else:\n" +" # 一切正常" + +#: ../../howto/urllib2.rst:344 +msgid "info and geturl" +msgstr "info 和 geturl 方法" + +#: ../../howto/urllib2.rst:346 +msgid "" +"The response returned by urlopen (or the :exc:`~urllib.error.HTTPError` " +"instance) has two useful methods :meth:`!info` and :meth:`!geturl` and is " +"defined in the module :mod:`urllib.response`." +msgstr "" +"urlopen 返回的响应(或 :exc:`~urllib.error.HTTPError` 实例)包含两个有用的方法 :meth:`!info` 和 " +":meth:`!geturl` 并且是在 :mod:`urllib.response` 模块中定义的。" + +#: ../../howto/urllib2.rst:350 +msgid "" +"**geturl** - this returns the real URL of the page fetched. This is useful " +"because ``urlopen`` (or the opener object used) may have followed a " +"redirect. The URL of the page fetched may not be the same as the URL " +"requested." +msgstr "" +"**geturl** —— 返回所获取页面的真实 URL。 该方法很有用,因为 ``urlopen`` (或所用的 opener 对象) " +"可能已经经过了一次重定向。 已获取页面的 URL 未必就是所请求的 URL。" + +#: ../../howto/urllib2.rst:354 +msgid "" +"**info** - this returns a dictionary-like object that describes the page " +"fetched, particularly the headers sent by the server. It is currently an " +":class:`http.client.HTTPMessage` instance." +msgstr "" +"**info** - 该方法返回一个类似字典的对象,描述了所获取的页面,特别是由服务器送出的头部信息(headers) 。目前它是一个 " +":class:`http.client.HTTPMessage` 实例。" + +#: ../../howto/urllib2.rst:358 +msgid "" +"Typical headers include 'Content-length', 'Content-type', and so on. See the" +" `Quick Reference to HTTP Headers `_ for a " +"useful listing of HTTP headers with brief explanations of their meaning and " +"use." +msgstr "" +"典型的标头包括 'Content-length', 'Content-type' 等等。请参阅 `HTTP 标头快速参考 " +"`_ 获取 HTTP 标头的完整列表及其含义和用法的简要说明。" + +#: ../../howto/urllib2.rst:365 +msgid "Openers and Handlers" +msgstr "Opener 和 Handler" + +#: ../../howto/urllib2.rst:367 +msgid "" +"When you fetch a URL you use an opener (an instance of the perhaps " +"confusingly named :class:`urllib.request.OpenerDirector`). Normally we have " +"been using the default opener - via ``urlopen`` - but you can create custom " +"openers. Openers use handlers. All the \"heavy lifting\" is done by the " +"handlers. Each handler knows how to open URLs for a particular URL scheme " +"(http, ftp, etc.), or how to handle an aspect of URL opening, for example " +"HTTP redirections or HTTP cookies." +msgstr "" +"当你获取 URL 时会使用一个 opener(名称可能有些令人困惑的 :class:`urllib.request.OpenerDirector` " +"的实例)。通常我们会使用默认的 opener —— 通过 ``urlopen`` —— 但你也可以创建自定义的 opener。opener 还会用到 " +"handler。所有 “繁重工作” 都是由 handler 来完成的。每种 handler 都知道要以何种 URL 方案(http, ftp " +"等等)来打开特定的 URL,或是如何处理 URL 打开时的特定操作,例如 HTTP 重定向或 HTTP cookie 等。" + +#: ../../howto/urllib2.rst:375 +msgid "" +"You will want to create openers if you want to fetch URLs with specific " +"handlers installed, for example to get an opener that handles cookies, or to" +" get an opener that does not handle redirections." +msgstr "" +"若要用已安装的某个 handler 获取 URL,需要创建一个 opener 对象,例如处理 cookie 的 opener,或对重定向不做处理的 " +"opener." + +#: ../../howto/urllib2.rst:379 +msgid "" +"To create an opener, instantiate an ``OpenerDirector``, and then call " +"``.add_handler(some_handler_instance)`` repeatedly." +msgstr "" +"若要创建 opener,请实例化一个 ``OpenerDirector``,然后重复调用 " +"``.add_handler(some_handler_instance)``." + +#: ../../howto/urllib2.rst:382 +msgid "" +"Alternatively, you can use ``build_opener``, which is a convenience function" +" for creating opener objects with a single function call. ``build_opener`` " +"adds several handlers by default, but provides a quick way to add more " +"and/or override the default handlers." +msgstr "" +"或者也可以用 ``build_opener``,这是个用单次调用创建 opener 对象的便捷函数。``build_opener`` 默认会添加几个 " +"handler,不过还提供了一种快速添加和/或覆盖默认 handler 的方法。" + +#: ../../howto/urllib2.rst:387 +msgid "" +"Other sorts of handlers you might want to can handle proxies, " +"authentication, and other common but slightly specialised situations." +msgstr "可能还需要其他类型的 handler,以便处理代理、身份认证和其他常见但稍微特殊的情况。" + +#: ../../howto/urllib2.rst:390 +msgid "" +"``install_opener`` can be used to make an ``opener`` object the (global) " +"default opener. This means that calls to ``urlopen`` will use the opener you" +" have installed." +msgstr "" +"``install_opener`` 可用于让 ``opener`` 对象成为(全局)默认 opener。这意味着调用 ``urlopen`` " +"时会采用已安装的 opener。" + +#: ../../howto/urllib2.rst:394 +msgid "" +"Opener objects have an ``open`` method, which can be called directly to " +"fetch urls in the same way as the ``urlopen`` function: there's no need to " +"call ``install_opener``, except as a convenience." +msgstr "" +"opener 对象带有一个 ``open`` 方法,可供直接调用以获取 url,方式与 ``urlopen`` " +"函数相同。除非是为了调用方便,否则没必要去调用 ``install_opener``。" + +#: ../../howto/urllib2.rst:400 +msgid "Basic Authentication" +msgstr "基本认证" + +#: ../../howto/urllib2.rst:402 +msgid "" +"To illustrate creating and installing a handler we will use the " +"``HTTPBasicAuthHandler``. For a more detailed discussion of this subject -- " +"including an explanation of how Basic Authentication works - see the `Basic " +"Authentication Tutorial " +"`__." +msgstr "" +"为了说明 handler 的创建和安装过程我们将使用 ``HTTPBasicAuthHandler``。有关该主题的更详细讨论 -- " +"包括对基本身份认证的原理的阐述 -- 请参阅 `Basic Authentication Tutorial " +"`__." + +#: ../../howto/urllib2.rst:408 +msgid "" +"When authentication is required, the server sends a header (as well as the " +"401 error code) requesting authentication. This specifies the " +"authentication scheme and a 'realm'. The header looks like: ``WWW-" +"Authenticate: SCHEME realm=\"REALM\"``." +msgstr "" +"如果需要身份认证,服务器会发送一条请求身份认证的头部信息(以及 401 错误代码)。 这条信息中指明了身份认证方式和“安全区域(realm)”。 " +"格式如下所示: ``WWW-Authenticate: SCHEME realm=\"REALM\"`` 。" + +#: ../../howto/urllib2.rst:413 +msgid "e.g." +msgstr "例如" + +#: ../../howto/urllib2.rst:415 +msgid "WWW-Authenticate: Basic realm=\"cPanel Users\"" +msgstr "WWW-Authenticate: Basic realm=\"cPanel Users\"" + +#: ../../howto/urllib2.rst:420 +msgid "" +"The client should then retry the request with the appropriate name and " +"password for the realm included as a header in the request. This is 'basic " +"authentication'. In order to simplify this process we can create an instance" +" of ``HTTPBasicAuthHandler`` and an opener to use this handler." +msgstr "" +"然后,客户端应重试发起请求,请求数据中的头部信息应包含安全区域对应的用户名和密码。这就是“基本身份认证”。为了简化此过程,可以创建 " +"``HTTPBasicAuthHandler`` 的一个实例及使用它的 opener。" + +#: ../../howto/urllib2.rst:425 +msgid "" +"The ``HTTPBasicAuthHandler`` uses an object called a password manager to " +"handle the mapping of URLs and realms to passwords and usernames. If you " +"know what the realm is (from the authentication header sent by the server), " +"then you can use a ``HTTPPasswordMgr``. Frequently one doesn't care what the" +" realm is. In that case, it is convenient to use " +"``HTTPPasswordMgrWithDefaultRealm``. This allows you to specify a default " +"username and password for a URL. This will be supplied in the absence of you" +" providing an alternative combination for a specific realm. We indicate this" +" by providing ``None`` as the realm argument to the ``add_password`` method." +msgstr "" +"``HTTPBasicAuthHandler`` 用一个名为密码管理器的对象来管理 " +"URL、安全区域与密码、用户名之间的映射关系。如果知道确切的安全区域(来自服务器发送的身份认证头部信息),那就可以用到 " +"``HTTPPasswordMgr``。通常人们并不关心安全区域是什么,这时用 ``HTTPPasswordMgrWithDefaultRealm`` " +"就很方便,允许为 URL 指定默认的用户名和密码。当没有为某个安全区域提供用户名和密码时,就会用到默认值。下面用 ``None`` 作为 " +"``add_password`` 方法的安全区域参数,表明采用默认用户名和密码。" + +#: ../../howto/urllib2.rst:435 +msgid "" +"The top-level URL is the first URL that requires authentication. URLs " +"\"deeper\" than the URL you pass to .add_password() will also match. ::" +msgstr "首先需要身份认证的是顶级 URL。比传给 .add_password() 的 URL 级别“更深”的 URL 也会得以匹配。::" + +#: ../../howto/urllib2.rst:438 +msgid "" +"# create a password manager\n" +"password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()\n" +"\n" +"# Add the username and password.\n" +"# If we knew the realm, we could use it instead of None.\n" +"top_level_url = \"http://example.com/foo/\"\n" +"password_mgr.add_password(None, top_level_url, username, password)\n" +"\n" +"handler = urllib.request.HTTPBasicAuthHandler(password_mgr)\n" +"\n" +"# create \"opener\" (OpenerDirector instance)\n" +"opener = urllib.request.build_opener(handler)\n" +"\n" +"# use the opener to fetch a URL\n" +"opener.open(a_url)\n" +"\n" +"# Install the opener.\n" +"# Now all calls to urllib.request.urlopen use our opener.\n" +"urllib.request.install_opener(opener)" +msgstr "" +"# 创建一个密码管理器\n" +"password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()\n" +"\n" +"# 添加用户名和密码。\n" +"# 如果我们知道安全区域(realm),可以用它代替 None。\n" +"top_level_url = \"http://example.com/foo/\"\n" +"password_mgr.add_password(None, top_level_url, username, password)\n" +"\n" +"handler = urllib.request.HTTPBasicAuthHandler(password_mgr)\n" +"\n" +"# 创建 \"opener\" (OpenerDirector 实例)\n" +"opener = urllib.request.build_opener(handler)\n" +"\n" +"# 使用 opener 获取一个 URL\n" +"opener.open(a_url)\n" +"\n" +"# 安装 opener。\n" +"# 现在所有对 urllib.request.urlopen 的调用都将使用此 opener。\n" +"urllib.request.install_opener(opener)" + +#: ../../howto/urllib2.rst:460 +msgid "" +"In the above example we only supplied our ``HTTPBasicAuthHandler`` to " +"``build_opener``. By default openers have the handlers for normal situations" +" -- ``ProxyHandler`` (if a proxy setting such as an :envvar:`!http_proxy` " +"environment variable is set), ``UnknownHandler``, ``HTTPHandler``, " +"``HTTPDefaultErrorHandler``, ``HTTPRedirectHandler``, ``FTPHandler``, " +"``FileHandler``, ``DataHandler``, ``HTTPErrorProcessor``." +msgstr "" +"在上面的示例中我们只向 ``build_opener`` 提供了 ``HTTPBasicAuthHandler``。在默认情况下 opener " +"会包含针对常见状况的处理器 -- ``ProxyHandler`` (如果设置了代理如设置了 :envvar:`!http_proxy` " +"环境变量),``UnknownHandler``, ``HTTPHandler``, ``HTTPDefaultErrorHandler``, " +"``HTTPRedirectHandler``, ``FTPHandler``, ``FileHandler``, ``DataHandler``, " +"``HTTPErrorProcessor``." + +#: ../../howto/urllib2.rst:467 +msgid "" +"``top_level_url`` is in fact *either* a full URL (including the 'http:' " +"scheme component and the hostname and optionally the port number) e.g. " +"``\"http://example.com/\"`` *or* an \"authority\" (i.e. the hostname, " +"optionally including the port number) e.g. ``\"example.com\"`` or " +"``\"example.com:8080\"`` (the latter example includes a port number). The " +"authority, if present, must NOT contain the \"userinfo\" component - for " +"example ``\"joe:password@example.com\"`` is not correct." +msgstr "" +"``top_level_url`` 其实 *要么* 是一条完整的 URL(包括“http:”部分和主机名及可选的端口号),比如 " +"``\"http://example.com/\"``, *要么* 是一条“访问权限”(即主机名,及可选的端口号),比如 " +"``\"example.com\"`` 或 ``\"example.com:8080\"`` (后一个例子包含了端口号)。 访问权限 **不得** " +"包含“用户信息”部分 —— 比如 ``\"joe:password@example.com\"`` 就不正确。" + +#: ../../howto/urllib2.rst:477 +msgid "Proxies" +msgstr "代理" + +#: ../../howto/urllib2.rst:479 +msgid "" +"**urllib** will auto-detect your proxy settings and use those. This is " +"through the ``ProxyHandler``, which is part of the normal handler chain when" +" a proxy setting is detected. Normally that's a good thing, but there are " +"occasions when it may not be helpful [#]_. One way to do this is to setup " +"our own ``ProxyHandler``, with no proxies defined. This is done using " +"similar steps to setting up a `Basic Authentication`_ handler: ::" +msgstr "" +"**urllib** 将自动检测并使用代理设置。这是通过 ``ProxyHandler`` 实现的,当检测到代理设置时,是正常 handler " +"链中的一部分。通常这是一件好事,但有时也可能会无效 [#]_。一种方案是配置自己的 ``ProxyHandler``,不要定义代理。设置的步骤与 " +"`Basic Authentication`_ handler 类似::" + +#: ../../howto/urllib2.rst:486 +msgid "" +">>> proxy_support = urllib.request.ProxyHandler({})\n" +">>> opener = urllib.request.build_opener(proxy_support)\n" +">>> urllib.request.install_opener(opener)" +msgstr "" +">>> proxy_support = urllib.request.ProxyHandler({})\n" +">>> opener = urllib.request.build_opener(proxy_support)\n" +">>> urllib.request.install_opener(opener)" + +#: ../../howto/urllib2.rst:492 +msgid "" +"Currently ``urllib.request`` *does not* support fetching of ``https`` " +"locations through a proxy. However, this can be enabled by extending " +"urllib.request as shown in the recipe [#]_." +msgstr "" +"目前 ``urllib.request`` *尚不* 支持通过代理抓取 ``https`` 链接地址。但此功能可以通过扩展 urllib.request" +" 来启用,如以下例程所示 [#]_。" + +#: ../../howto/urllib2.rst:498 +msgid "" +"``HTTP_PROXY`` will be ignored if a variable ``REQUEST_METHOD`` is set; see " +"the documentation on :func:`~urllib.request.getproxies`." +msgstr "" +"如果设置了 ``REQUEST_METHOD`` 变量,则会忽略 ``HTTP_PROXY``;参阅 " +":func:`~urllib.request.getproxies` 文档。" + +#: ../../howto/urllib2.rst:503 +msgid "Sockets and Layers" +msgstr "套接字与分层" + +#: ../../howto/urllib2.rst:505 +msgid "" +"The Python support for fetching resources from the web is layered. urllib " +"uses the :mod:`http.client` library, which in turn uses the socket library." +msgstr "Python 获取 Web 资源的能力是分层的。urllib 用到的是 :mod:`http.client` 库,而后者又用到了套接字库。" + +#: ../../howto/urllib2.rst:508 +msgid "" +"As of Python 2.3 you can specify how long a socket should wait for a " +"response before timing out. This can be useful in applications which have to" +" fetch web pages. By default the socket module has *no timeout* and can " +"hang. Currently, the socket timeout is not exposed at the http.client or " +"urllib.request levels. However, you can set the default timeout globally for" +" all sockets using ::" +msgstr "" +"从 Python 2.3 开始,可以指定套接字等待响应的超时时间。这对必须要读到网页数据的应用程序会很有用。默认情况下,套接字模块 *不会超时* " +"并且可以挂起。目前,套接字超时机制未暴露给 http.client 或 urllib.request 层使用。不过可以为所有套接字设置默认的全局超时::" + +#: ../../howto/urllib2.rst:514 +msgid "" +"import socket\n" +"import urllib.request\n" +"\n" +"# timeout in seconds\n" +"timeout = 10\n" +"socket.setdefaulttimeout(timeout)\n" +"\n" +"# this call to urllib.request.urlopen now uses the default timeout\n" +"# we have set in the socket module\n" +"req = urllib.request.Request('http://www.voidspace.org.uk')\n" +"response = urllib.request.urlopen(req)" +msgstr "" +"import socket\n" +"import urllib.request\n" +"\n" +"# 超时秒数\n" +"timeout = 10\n" +"socket.setdefaulttimeout(timeout)\n" +"\n" +"# 这个对 urllib.request.urlopen 的调用现在将使用\n" +"# 我们在 socket 模块中设置的默认超时值\n" +"req = urllib.request.Request('http://www.voidspace.org.uk')\n" +"response = urllib.request.urlopen(req)" + +#: ../../howto/urllib2.rst:531 +msgid "Footnotes" +msgstr "备注" + +#: ../../howto/urllib2.rst:533 +msgid "This document was reviewed and revised by John Lee." +msgstr "这篇文档由 John Lee 审订。" + +#: ../../howto/urllib2.rst:535 +msgid "Google for example." +msgstr "例如 Google。" + +#: ../../howto/urllib2.rst:536 +msgid "" +"Browser sniffing is a very bad practice for website design - building sites " +"using web standards is much more sensible. Unfortunately a lot of sites " +"still send different versions to different browsers." +msgstr "" +"对于网站设计而言,探测不同的浏览器是非常糟糕的做法——更为明智的做法是采用 web " +"标准构建网站。不幸的是,很多网站依然向不同的浏览器发送不同版本的网页。" + +#: ../../howto/urllib2.rst:539 +msgid "" +"The user agent for MSIE 6 is *'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT" +" 5.1; SV1; .NET CLR 1.1.4322)'*" +msgstr "" +"MSIE 6 的 user-agent 信息是 *“Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;" +" SV1; .NET CLR 1.1.4322)”*" + +#: ../../howto/urllib2.rst:541 +msgid "" +"For details of more HTTP request headers, see `Quick Reference to HTTP " +"Headers`_." +msgstr "有关 HTTP 请求的头部信息,详情请参阅 `Quick Reference to HTTP Headers`_。" + +#: ../../howto/urllib2.rst:543 +msgid "" +"In my case I have to use a proxy to access the internet at work. If you " +"attempt to fetch *localhost* URLs through this proxy it blocks them. IE is " +"set to use the proxy, which urllib picks up on. In order to test scripts " +"with a localhost server, I have to prevent urllib from using the proxy." +msgstr "" +"本人必须使用代理才能在工作中访问互联网。如果尝试通过代理获取 *localhost* URL,将会遭到阻止。IE 设置为代理模式,urllib " +"就会获取到配置信息。为了用 localhost 服务器测试脚本,我必须阻止 urllib 使用代理。" + +#: ../../howto/urllib2.rst:548 +msgid "" +"urllib opener for SSL proxy (CONNECT method): `ASPN Cookbook Recipe " +"`_." +msgstr "" +"urllib 的 SSL 代理 opener (CONNECT 方法): `ASPN Cookbook Recipe " +"`_." diff --git a/improve-page-nojs.po b/improve-page-nojs.po new file mode 100644 index 0000000000..cdd279f13c --- /dev/null +++ b/improve-page-nojs.po @@ -0,0 +1,63 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../improve-page-nojs.rst:5 +msgid "Improve a documentation page" +msgstr "改进文档页面" + +#: ../../improve-page-nojs.rst:13 +msgid "" +"We are always interested to hear ideas about improvements to the " +"documentation." +msgstr "我们总是愿意获取有关改进本文档的各种想法。" + +#: ../../improve-page-nojs.rst:17 +msgid "" +"If the bug or suggested improvement concerns the translation of this " +"documentation, open an issue or edit the page in `translation's repository " +"`_ instead." +msgstr "如果程序缺陷或建议的改进涉及此文档的翻译,请到 `文档翻译代码仓库 `_ 中提出问题或修改建议。 " + +#: ../../improve-page-nojs.rst:21 +msgid "You have a few ways to ask questions or suggest changes:" +msgstr "你可以用几种方式提出问题或建议修改:" + +#: ../../improve-page-nojs.rst:23 +msgid "" +"You can start a discussion about the page on the Python discussion forum. " +"This link will start a topic in the Documentation category: `New " +"Documentation topic `_." +msgstr "" +"你可以在 Python 讨论区发起关于此页面的讨论。 此链接将在 Documentation 区新建一个主题帖: `New Documentation " +"topic `_。" + +#: ../../improve-page-nojs.rst:27 +msgid "" +"You can open an issue on the Python GitHub issue tracker. This link will " +"create a new issue with the \"docs\" label: `New docs issue " +"`_." +msgstr "" +"你可以在 Python GitHub 问题追踪页发起 issue。 此链接将新建一个带有 \"docs\" 标签的 issue: `New docs " +"issue " +"`_。" diff --git a/improve-page.po b/improve-page.po new file mode 100644 index 0000000000..90fc7da67f --- /dev/null +++ b/improve-page.po @@ -0,0 +1,74 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../improve-page.rst:5 +msgid "Improve a documentation page" +msgstr "改进文档页面" + +#: ../../improve-page.rst:43 +msgid "" +"We are always interested to hear ideas about improvements to the " +"documentation." +msgstr "我们总是愿意获取有关改进本文档的各种想法。" + +#: ../../improve-page.rst:45 +msgid "" +"You were reading \"PAGETITLE\" at ``_. The source for that page is" +" on `GitHub " +"`_." +msgstr "" +"你正在阅读 ``_ 上的 \"PAGETITLE\"。 该页面的源代码存放于 `GitHub " +"`_。" + +#: ../../improve-page.rst:50 +msgid "" +"If the bug or suggested improvement concerns the translation of this " +"documentation, open an issue or edit the page in `translation's repository " +"`_ instead." +msgstr "如果程序缺陷或建议的改进涉及此文档的翻译,请到 `文档翻译代码仓库 `_ 中提出问题或修改建议。 " + +#: ../../improve-page.rst:54 +msgid "You have a few ways to ask questions or suggest changes:" +msgstr "你可以用几种方式提出问题或建议修改:" + +#: ../../improve-page.rst:56 +msgid "" +"You can start a discussion about the page on the Python discussion forum. " +"This link will start a pre-populated topic: `Question about page " +"\"PAGETITLE\" `_." +msgstr "" + +#: ../../improve-page.rst:60 +msgid "" +"You can open an issue on the Python GitHub issue tracker. This link will " +"create a new pre-populated issue: `Docs: problem with page \"PAGETITLE\" " +"`_." +msgstr "" + +#: ../../improve-page.rst:64 +msgid "" +"You can `edit the page on GitHub " +"`_ to " +"open a pull request and begin the contribution process." +msgstr "" diff --git a/installing/index.po b/installing/index.po new file mode 100644 index 0000000000..a546f3556e --- /dev/null +++ b/installing/index.po @@ -0,0 +1,354 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../installing/index.rst:7 +msgid "Installing Python modules" +msgstr "安装 Python 模块" + +#: ../../installing/index.rst:9 +msgid "" +"As a popular open source development project, Python has an active " +"supporting community of contributors and users that also make their software" +" available for other Python developers to use under open-source license " +"terms." +msgstr "作为一个热门的开源开发项目,Python 拥有活跃的贡献者和用户支持社区并让他们的软件可供其他 Python 开发者在开源许可条款下使用。" + +#: ../../installing/index.rst:13 +msgid "" +"This allows Python users to share and collaborate effectively, benefiting " +"from the solutions others have already created to common (and sometimes even" +" rare!) problems, as well as potentially contributing their own solutions to" +" the common pool." +msgstr "" +"这允许 Python " +"用户有效地共享和协作,从其他人已经为常见(有时甚至是罕见的)问题所创建的解决方案中获益,以及可以将他们自己的解决方案贡献到公共资源库中。" + +#: ../../installing/index.rst:18 +msgid "" +"This guide covers the installation part of the process. For a guide to " +"creating and sharing your own Python projects, refer to the `Python " +"packaging user guide`_." +msgstr "" +"本指南涵盖了该流程中安装的部分。有关创建和共享自己的 Python 项目的指导,请参阅 `Python packaging user guide`_。" + +#: ../../installing/index.rst:26 +msgid "" +"For corporate and other institutional users, be aware that many " +"organisations have their own policies around using and contributing to open " +"source software. Please take such policies into account when making use of " +"the distribution and installation tools provided with Python." +msgstr "对于企业和其他机构用户,请注意许多组织都有自己的政策来使用和贡献开源软件。在使用 Python 提供的分发和安装工具时,请考虑这些政策。" + +#: ../../installing/index.rst:33 +msgid "Key terms" +msgstr "关键术语" + +#: ../../installing/index.rst:35 +msgid "" +":program:`pip` is the preferred installer program. It is included by default" +" with the Python binary installers." +msgstr ":program:`pip` 是首选的安装程序。 它默认包括在 Python 二进制安装程序中。" + +#: ../../installing/index.rst:37 +msgid "" +"A *virtual environment* is a semi-isolated Python environment that allows " +"packages to be installed for use by a particular application, rather than " +"being installed system wide." +msgstr "*虚拟环境* 是一种半隔离的 Python 环境,允许为特定的应用安装各自的包,而不是安装到整个系统。" + +#: ../../installing/index.rst:40 +msgid "" +"``venv`` is the standard tool for creating virtual environments. It defaults" +" to installing :program:`pip` into all created virtual environments." +msgstr "``venv`` 是用于创建虚拟环境的标准工具。 它默认会将 :program:`pip` 安装至所创建的每个虚拟环境中。" + +#: ../../installing/index.rst:42 +msgid "" +"``virtualenv`` is a third-party alternative (and predecessor) to ``venv``." +msgstr "``virtualenv`` 是 ``venv`` 的一个第三方替代物(及其前身)。" + +#: ../../installing/index.rst:44 +msgid "" +"The `Python Package Index (PyPI) `__ is a public " +"repository of open source licensed packages made available for use by other " +"Python users." +msgstr "" +"`Python Package Index (PyPI) `__ 是一个供所有 Python " +"用户使用的开源许可的公共软件包仓库。" + +#: ../../installing/index.rst:47 +msgid "" +"The `Python Packaging Authority `__ is the group of " +"developers and documentation authors responsible for the maintenance and " +"evolution of the standard packaging tools and the associated metadata and " +"file format standards. They maintain a variety of tools, documentation, and " +"issue trackers on `GitHub `__." +msgstr "" + +#: ../../installing/index.rst:54 +msgid "" +"The use of ``venv`` is now recommended for creating virtual environments." +msgstr "现在推荐使用 ``venv`` 来创建虚拟环境。" + +#: ../../installing/index.rst:59 +msgid "" +"`Python Packaging User Guide: Creating and using virtual environments " +"`__" +msgstr "" +"`Python 软件包用户指南:创建和使用虚拟环境 " +"`__" + +#: ../../installing/index.rst:64 +msgid "Basic usage" +msgstr "基本使用" + +#: ../../installing/index.rst:66 +msgid "" +"The standard packaging tools are all designed to be used from the command " +"line." +msgstr "标准打包工具完全是针对命令行使用方式来设计的。" + +#: ../../installing/index.rst:69 +msgid "" +"The following command will install the latest version of a module and its " +"dependencies from PyPI::" +msgstr "" + +#: ../../installing/index.rst:72 +msgid "python -m pip install SomePackage" +msgstr "python -m pip install SomePackage" + +#: ../../installing/index.rst:76 +msgid "" +"For POSIX users (including macOS and Linux users), the examples in this " +"guide assume the use of a :term:`virtual environment`." +msgstr "" +"对于 POSIX 用户(包括 macOS 和 Linux 用户),本指南中的示例假定使用了 :term:`virtual environment`。" + +#: ../../installing/index.rst:79 +msgid "" +"For Windows users, the examples in this guide assume that the option to " +"adjust the system PATH environment variable was selected when installing " +"Python." +msgstr "对于 Windows 用户,本指南中的示例假定在安装 Python 时选择了修改系统 PATH 环境变量。" + +#: ../../installing/index.rst:83 +msgid "" +"It's also possible to specify an exact or minimum version directly on the " +"command line. When using comparator operators such as ``>``, ``<`` or some " +"other special character which get interpreted by shell, the package name and" +" the version should be enclosed within double quotes::" +msgstr "" +"在命令行中指定一个准确或最小版本也是可以的。当使用比较运算符例如 ``>``, ``<`` " +"或其他某些可以被终端所解析的特殊字符时,包名称与版本号应当用双引号括起来::" + +#: ../../installing/index.rst:88 +msgid "" +"python -m pip install SomePackage==1.0.4 # specific version\n" +"python -m pip install \"SomePackage>=1.0.4\" # minimum version" +msgstr "" +"python -m pip install SomePackage==1.0.4 # 特定版本\n" +"python -m pip install \"SomePackage>=1.0.4\" # 最小版本" + +#: ../../installing/index.rst:91 +msgid "" +"Normally, if a suitable module is already installed, attempting to install " +"it again will have no effect. Upgrading existing modules must be requested " +"explicitly::" +msgstr "通常,如果一个匹配的模块已安装,尝试再次安装将不会有任何效果。要升级现有模块必须显式地发出请求::" + +#: ../../installing/index.rst:95 +msgid "python -m pip install --upgrade SomePackage" +msgstr "python -m pip install --upgrade SomePackage" + +#: ../../installing/index.rst:97 +msgid "" +"More information and resources regarding :program:`pip` and its capabilities" +" can be found in the `Python Packaging User Guide " +"`__." +msgstr "" + +#: ../../installing/index.rst:100 +msgid "" +"Creation of virtual environments is done through the :mod:`venv` module. " +"Installing packages into an active virtual environment uses the commands " +"shown above." +msgstr "虚拟环境的创建可使用 :mod:`venv` 模块来完成。向已激活虚拟环境安装软件包可使用上文所介绍的命令。" + +#: ../../installing/index.rst:106 +msgid "" +"`Python Packaging User Guide: Installing Python Distribution Packages " +"`__" +msgstr "" +"`Python 软件包用户指南:安装 Python 分发包 `__" + +#: ../../installing/index.rst:111 +msgid "How do I ...?" +msgstr "我应如何 ...?" + +#: ../../installing/index.rst:113 +msgid "These are quick answers or links for some common tasks." +msgstr "这是一些常见任务的快速解答或相关链接。" + +#: ../../installing/index.rst:118 +msgid "... install packages just for the current user?" +msgstr "... 只为当前用户安装软件包?" + +#: ../../installing/index.rst:120 +msgid "" +"Passing the ``--user`` option to ``python -m pip install`` will install a " +"package just for the current user, rather than for all users of the system." +msgstr "将 ``--user`` 选项传入 ``python -m pip install`` 将只为当前用户而非为系统中的所有用户安装软件包。" + +#: ../../installing/index.rst:125 +msgid "... install scientific Python packages?" +msgstr "... 安装科学计算类 Python 软件包?" + +#: ../../installing/index.rst:127 +msgid "" +"A number of scientific Python packages have complex binary dependencies, and" +" aren't currently easy to install using :program:`pip` directly. It will " +"often be easier for users to install these packages by `other means " +"`__ rather than attempting to install" +" them with :program:`pip`." +msgstr "" + +#: ../../installing/index.rst:135 +msgid "" +"`Python Packaging User Guide: Installing Scientific Packages " +"`__" +msgstr "`Python 软件包用户指南:安装科学计算类软件包 `__" + +#: ../../installing/index.rst:140 +msgid "... work with multiple versions of Python installed in parallel?" +msgstr "... 使用并行安装的多个 Python 版本?" + +#: ../../installing/index.rst:142 +msgid "" +"On Linux, macOS, and other POSIX systems, use the versioned Python commands " +"in combination with the ``-m`` switch to run the appropriate copy of " +":program:`pip`::" +msgstr "" + +#: ../../installing/index.rst:146 +msgid "" +"python3 -m pip install SomePackage # default Python 3\n" +"python3.14 -m pip install SomePackage # specifically Python 3.14" +msgstr "" + +#: ../../installing/index.rst:149 +msgid "Appropriately versioned :program:`pip` commands may also be available." +msgstr "也可以使用对应适当版本的 :program:`pip` 命令。" + +#: ../../installing/index.rst:151 +msgid "" +"On Windows, use the :program:`py` Python launcher in combination with the " +"``-m`` switch::" +msgstr "在 Windows 上,可使用 :program:`py` Python 启动器配合 ``-m`` 开关::" + +#: ../../installing/index.rst:154 +msgid "" +"py -3 -m pip install SomePackage # default Python 3\n" +"py -3.14 -m pip install SomePackage # specifically Python 3.14" +msgstr "" +"py -3 -m pip install SomePackage # 默认的 Python 3\n" +"py -3.14 -m pip install SomePackage # Python 3.14 专属" + +#: ../../installing/index.rst:166 +msgid "Common installation issues" +msgstr "常见的安装问题" + +#: ../../installing/index.rst:169 +msgid "Installing into the system Python on Linux" +msgstr "在 Linux 的系统 Python 版本上安装" + +#: ../../installing/index.rst:171 +msgid "" +"On Linux systems, a Python installation will typically be included as part " +"of the distribution. Installing into this Python installation requires root " +"access to the system, and may interfere with the operation of the system " +"package manager and other components of the system if a component is " +"unexpectedly upgraded using :program:`pip`." +msgstr "" +"在 Linux 系统上,通常会包括某个 Python 版本作为发行版的组成部分。 将软件包安装到这个 Python 版本中需要有系统 root " +"权限,并可能会干扰到系统软件包管理器和其他系统组件的运作,如果在使用 :program:`pip` 时意外升级了某个组件的话。" + +#: ../../installing/index.rst:177 +msgid "" +"On such systems, it is often better to use a virtual environment or a per-" +"user installation when installing packages with :program:`pip`." +msgstr "在这样的系统上,在通过 :program:`pip` 安装软件包时使用虚拟环境或分用户安装是更好的做法。" + +#: ../../installing/index.rst:182 +msgid "Pip not installed" +msgstr "未安装 pip" + +#: ../../installing/index.rst:184 +msgid "" +"It is possible that :program:`pip` does not get installed by default. One " +"potential fix is::" +msgstr "在默认情况下 :program:`pip` 有可能未被安装。 一个可能的解决办法是::" + +#: ../../installing/index.rst:186 +msgid "python -m ensurepip --default-pip" +msgstr "python -m ensurepip --default-pip" + +#: ../../installing/index.rst:188 +msgid "" +"There are also additional resources for `installing pip " +"`__." +msgstr "" + +#: ../../installing/index.rst:193 +msgid "Installing binary extensions" +msgstr "安装二进制编译扩展" + +#: ../../installing/index.rst:195 +msgid "" +"Python once relied heavily on source-based distribution, with end users " +"being expected to compile extension modules from source as part of the " +"installation process." +msgstr "" + +#: ../../installing/index.rst:199 +msgid "" +"With the introduction of the binary wheel format, and the ability to publish" +" wheels through PyPI, this problem is diminishing, as users are more " +"regularly able to install pre-built extensions rather than needing to build " +"them themselves." +msgstr "" + +#: ../../installing/index.rst:204 +msgid "" +"Some of the solutions for installing `scientific software " +"`__ that are not yet available as " +"pre-built wheel files may also help with obtaining other binary extensions " +"without needing to build them locally." +msgstr "" + +#: ../../installing/index.rst:211 +msgid "" +"`Python Packaging User Guide: Binary Extensions " +"`__" +msgstr "`Python 软件包用户指南:二进制码扩展 `__" diff --git a/library/__future__.po b/library/__future__.po new file mode 100644 index 0000000000..aef93b6be1 --- /dev/null +++ b/library/__future__.po @@ -0,0 +1,296 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/__future__.rst:2 +msgid ":mod:`!__future__` --- Future statement definitions" +msgstr ":mod:`!__future__` --- Future 语句定义" + +#: ../../library/__future__.rst:7 +msgid "**Source code:** :source:`Lib/__future__.py`" +msgstr "**源代码:** :source:`Lib/__future__.py`" + +#: ../../library/__future__.rst:11 +msgid "" +"Imports of the form ``from __future__ import feature`` are called " +":ref:`future statements `. These are special-cased by the Python " +"compiler to allow the use of new Python features in modules containing the " +"future statement before the release in which the feature becomes standard." +msgstr "" +"``from __future__ import feature`` 形式的导入被称为 :ref:`future 语句 `。它们会被 " +"Python 编译器当作特例,通过包含 future 语句来允许新的 Python 特性在该特性成为语言标准之前发布的模块中使用。" + +#: ../../library/__future__.rst:16 +msgid "" +"While these future statements are given additional special meaning by the " +"Python compiler, they are still executed like any other import statement and" +" the :mod:`!__future__` exists and is handled by the import system the same " +"way any other Python module would be. This design serves three purposes:" +msgstr "" +"虽然这些 future 语句被 Python 编译器赋予了额外的特殊含义,但它们仍然像会其他导入语句一样被执行,而 :mod:`!__future__`" +" 的存在和被导入系统处理的方式与其他任何 Python 模块的相同。 这种设计有三个目的:" + +#: ../../library/__future__.rst:21 +msgid "" +"To avoid confusing existing tools that analyze import statements and expect " +"to find the modules they're importing." +msgstr "避免混淆已有的分析 import 语句并查找 import 的模块的工具。" + +#: ../../library/__future__.rst:24 +msgid "" +"To document when incompatible changes were introduced, and when they will be" +" --- or were --- made mandatory. This is a form of executable " +"documentation, and can be inspected programmatically via importing " +":mod:`!__future__` and examining its contents." +msgstr "" +"记录不兼容的修改在何时被引入,以及在何时将会 --- 或是确定 --- 成为强制要求。 这是一种可执行的文件形式,并可通过导入 " +":mod:`!__future__` 在程序中进行检测并获取其内容。" + +#: ../../library/__future__.rst:29 +msgid "" +"To ensure that :ref:`future statements ` run under releases prior to" +" Python 2.1 at least yield runtime exceptions (the import of " +":mod:`!__future__` will fail, because there was no module of that name prior" +" to 2.1)." +msgstr "" +"确保 :ref:`future 语句 ` 在 Python 2.1 之前的发布版上运行时至少会产生运行时异常(对 " +":mod:`!__future__` 的导入会失败,因为 2.1 之前没有这个模块名称)。" + +#: ../../library/__future__.rst:34 +msgid "Module Contents" +msgstr "模块内容" + +#: ../../library/__future__.rst:36 +msgid "" +"No feature description will ever be deleted from :mod:`!__future__`. Since " +"its introduction in Python 2.1 the following features have found their way " +"into the language using this mechanism:" +msgstr "" +"特性描述绝不会从 :mod:`!__future__` 中删除。 自从在 Python 2.1 中引入以来已经使用这种机制将下列特性加入到语言之中:" + +#: ../../library/__future__.rst:45 +msgid "feature" +msgstr "特性" + +#: ../../library/__future__.rst:46 +msgid "optional in" +msgstr "可选版本" + +#: ../../library/__future__.rst:47 +msgid "mandatory in" +msgstr "强制加入版本" + +#: ../../library/__future__.rst:48 +msgid "effect" +msgstr "效果" + +#: ../../library/__future__.rst:50 +msgid "2.1.0b1" +msgstr "2.1.0b1" + +#: ../../library/__future__.rst:51 +msgid "2.2" +msgstr "2.2" + +#: ../../library/__future__.rst:52 +msgid ":pep:`227`: *Statically Nested Scopes*" +msgstr ":pep:`227`: *静态嵌套作用域*" + +#: ../../library/__future__.rst:54 +msgid "2.2.0a1" +msgstr "2.2.0a1" + +#: ../../library/__future__.rst:55 +msgid "2.3" +msgstr "2.3" + +#: ../../library/__future__.rst:56 +msgid ":pep:`255`: *Simple Generators*" +msgstr ":pep:`255`: *简单生成器*" + +#: ../../library/__future__.rst:58 +msgid "2.2.0a2" +msgstr "2.2.0a2" + +#: ../../library/__future__.rst:59 ../../library/__future__.rst:63 +#: ../../library/__future__.rst:71 ../../library/__future__.rst:75 +msgid "3.0" +msgstr "3.0" + +#: ../../library/__future__.rst:60 +msgid ":pep:`238`: *Changing the Division Operator*" +msgstr ":pep:`238`: *修改除法运算符*" + +#: ../../library/__future__.rst:62 ../../library/__future__.rst:66 +msgid "2.5.0a1" +msgstr "2.5.0a1" + +#: ../../library/__future__.rst:64 +msgid ":pep:`328`: *Imports: Multi-Line and Absolute/Relative*" +msgstr ":pep:`328`: *导入:多行与绝对/相对*" + +#: ../../library/__future__.rst:67 +msgid "2.6" +msgstr "2.6" + +#: ../../library/__future__.rst:68 +msgid ":pep:`343`: *The “with” Statement*" +msgstr ":pep:`343`: *“with”语句*" + +#: ../../library/__future__.rst:70 ../../library/__future__.rst:74 +msgid "2.6.0a2" +msgstr "2.6.0a2" + +#: ../../library/__future__.rst:72 +msgid ":pep:`3105`: *Make print a function*" +msgstr ":pep:`3105`: *print 改为函数*" + +#: ../../library/__future__.rst:76 +msgid ":pep:`3112`: *Bytes literals in Python 3000*" +msgstr ":pep:`3112`: *Python 3000 中的字节字面值*" + +#: ../../library/__future__.rst:78 +msgid "3.5.0b1" +msgstr "3.5.0b1" + +#: ../../library/__future__.rst:79 +msgid "3.7" +msgstr "3.7" + +#: ../../library/__future__.rst:80 +msgid ":pep:`479`: *StopIteration handling inside generators*" +msgstr ":pep:`479`: *在生成器中处理 StopIteration*" + +#: ../../library/__future__.rst:82 +msgid "3.7.0b1" +msgstr "3.7.0b1" + +#: ../../library/__future__.rst:83 +msgid "Never [1]_" +msgstr "从不 [1]_" + +#: ../../library/__future__.rst:84 +msgid "" +":pep:`563`: *Postponed evaluation of annotations*, :pep:`649`: *Deferred " +"evaluation of annotations using descriptors*" +msgstr ":pep:`563`: *延迟标注求值*, :pep:`649`: *使用描述器的标注延迟求值*" + +#: ../../library/__future__.rst:93 +msgid "Each statement in :file:`__future__.py` is of the form::" +msgstr ":file:`__future__.py` 中的每一条语句都是以下格式的::" + +#: ../../library/__future__.rst:95 +msgid "" +"FeatureName = _Feature(OptionalRelease, MandatoryRelease,\n" +" CompilerFlag)" +msgstr "" +"FeatureName = _Feature(OptionalRelease, MandatoryRelease,\n" +" CompilerFlag)" + +#: ../../library/__future__.rst:98 +msgid "" +"where, normally, *OptionalRelease* is less than *MandatoryRelease*, and both" +" are 5-tuples of the same form as :data:`sys.version_info`::" +msgstr "" +"通常 *OptionalRelease* 要比 *MandatoryRelease* 小,并且都是和 :data:`sys.version_info` " +"格式一致的 5 元素元组::" + +#: ../../library/__future__.rst:101 +msgid "" +"(PY_MAJOR_VERSION, # the 2 in 2.1.0a3; an int\n" +" PY_MINOR_VERSION, # the 1; an int\n" +" PY_MICRO_VERSION, # the 0; an int\n" +" PY_RELEASE_LEVEL, # \"alpha\", \"beta\", \"candidate\" or \"final\"; string\n" +" PY_RELEASE_SERIAL # the 3; an int\n" +")" +msgstr "" +"(PY_MAJOR_VERSION, # 2.1.0a3 中的 2; 一个整数\n" +" PY_MINOR_VERSION, # 1; 一个整数\n" +" PY_MICRO_VERSION, # 0; 一个整数\n" +" PY_RELEASE_LEVEL, # \"alpha\", \"beta\", \"candidate\" 或 \"final\"; 字符串\n" +" PY_RELEASE_SERIAL # 3; 一个整数\n" +")" + +#: ../../library/__future__.rst:110 +msgid "" +"*OptionalRelease* records the first release in which the feature was " +"accepted." +msgstr "*OptionalRelease* 记录了一个特性首次发布时的 Python 版本。" + +#: ../../library/__future__.rst:114 +msgid "" +"In the case of a *MandatoryRelease* that has not yet occurred, " +"*MandatoryRelease* predicts the release in which the feature will become " +"part of the language." +msgstr "在 *MandatoryRelease* 还没有发布时,*MandatoryRelease* 表示该特性会变成语言的一部分的预测时间。" + +#: ../../library/__future__.rst:118 +msgid "" +"Else *MandatoryRelease* records when the feature became part of the " +"language; in releases at or after that, modules no longer need a future " +"statement to use the feature in question, but may continue to use such " +"imports." +msgstr "" +"其他情况下,*MandatoryRelease* 用来记录这个特性是何时成为语言的一部分的。从该版本往后,使用该特性将不需要 future " +"语句,不过很多人还是会加上对应的 import。" + +#: ../../library/__future__.rst:122 +msgid "" +"*MandatoryRelease* may also be ``None``, meaning that a planned feature got " +"dropped or that it is not yet decided." +msgstr "*MandatoryRelease* 也可能为 ``None``,表示计划中的特性被撤销或尚未确定。" + +#: ../../library/__future__.rst:127 +msgid "" +"*CompilerFlag* is the (bitfield) flag that should be passed in the fourth " +"argument to the built-in function :func:`compile` to enable the feature in " +"dynamically compiled code. This flag is stored in the " +":attr:`_Feature.compiler_flag` attribute on :class:`_Feature` instances." +msgstr "" +"*CompilerFlag* 是一个(位)旗标,对于动态编译的代码应当将其作为第四个参数传给内置函数 :func:`compile` 以启用相应的特性。" +" 该旗标存储在 :class:`_Feature` 实例的 :attr:`_Feature.compiler_flag` 属性中。" + +#: ../../library/__future__.rst:133 +msgid "" +"``from __future__ import annotations`` was previously scheduled to become " +"mandatory in Python 3.10, but the change was delayed and ultimately " +"canceled. This feature will eventually be deprecated and removed. See " +":pep:`649` and :pep:`749`." +msgstr "" +"``from __future__ import annotations`` 曾计划在 Python 3.10 中强制执行,但这一更改被推迟并最终取消。" +" 此特性最终将被弃用并移除。参见 :pep:`649` 和 :pep:`749`。" + +#: ../../library/__future__.rst:141 +msgid ":ref:`future`" +msgstr ":ref:`future`" + +#: ../../library/__future__.rst:142 +msgid "How the compiler treats future imports." +msgstr "编译器怎样处理 future import。" + +#: ../../library/__future__.rst:144 +msgid ":pep:`236` - Back to the __future__" +msgstr ":pep:`236` - 回到 __future__" + +#: ../../library/__future__.rst:145 +msgid "The original proposal for the __future__ mechanism." +msgstr "有关 __future__ 机制的最初提议。" diff --git a/library/__main__.po b/library/__main__.po new file mode 100644 index 0000000000..981de582fb --- /dev/null +++ b/library/__main__.po @@ -0,0 +1,703 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/__main__.rst:2 +msgid ":mod:`!__main__` --- Top-level code environment" +msgstr ":mod:`!__main__` --- 最高层级代码环境" + +#: ../../library/__main__.rst:10 +msgid "" +"In Python, the special name ``__main__`` is used for two important " +"constructs:" +msgstr "Python 的特殊名 ``__main__`` 用于两个重要的构造:" + +#: ../../library/__main__.rst:12 +msgid "" +"the name of the top-level environment of the program, which can be checked " +"using the ``__name__ == '__main__'`` expression; and" +msgstr "程序的顶层环境的名称,可用表达式 ``__name__ == '__main__'`` 来检查;以及" + +#: ../../library/__main__.rst:14 +msgid "the ``__main__.py`` file in Python packages." +msgstr "Python 包中的文件 ``__main__.py``。" + +#: ../../library/__main__.rst:16 +msgid "" +"Both of these mechanisms are related to Python modules; how users interact " +"with them and how they interact with each other. They are explained in " +"detail below. If you're new to Python modules, see the tutorial section " +":ref:`tut-modules` for an introduction." +msgstr "" +"这两个机制都与 Python 模块相关——用户与它们如何交互,及它们之间如何交互——下文详述。而教程的 :ref:`tut-modules` " +"一节则为初学者介绍了 Python 模块。" + +#: ../../library/__main__.rst:25 +msgid "``__name__ == '__main__'``" +msgstr "``__name__ == '__main__'``" + +#: ../../library/__main__.rst:27 +msgid "" +"When a Python module or package is imported, ``__name__`` is set to the " +"module's name. Usually, this is the name of the Python file itself without " +"the ``.py`` extension::" +msgstr "" +"当一个 Python 模块或包被导入时,``__name__`` 被设为模块的名称——通常为 Python 文件本身的名称去掉 ``.py`` 后缀:" + +#: ../../library/__main__.rst:31 +msgid "" +">>> import configparser\n" +">>> configparser.__name__\n" +"'configparser'" +msgstr "" +">>> import configparser\n" +">>> configparser.__name__\n" +"'configparser'" + +#: ../../library/__main__.rst:35 +msgid "" +"If the file is part of a package, ``__name__`` will also include the parent " +"package's path::" +msgstr "如果文件是包的一部分,则 ``__name__`` 还将包括父包的路径:" + +#: ../../library/__main__.rst:38 +msgid "" +">>> from concurrent.futures import process\n" +">>> process.__name__\n" +"'concurrent.futures.process'" +msgstr "" +">>> from concurrent.futures import process\n" +">>> process.__name__\n" +"'concurrent.futures.process'" + +#: ../../library/__main__.rst:42 +msgid "" +"However, if the module is executed in the top-level code environment, its " +"``__name__`` is set to the string ``'__main__'``." +msgstr "而若模块是在顶层代码环境中执行的,则其 ``__name__`` 被设为字符串 ``'__main__'``。" + +#: ../../library/__main__.rst:46 +msgid "What is the \"top-level code environment\"?" +msgstr "什么是“顶层代码环境”?" + +#: ../../library/__main__.rst:48 +msgid "" +"``__main__`` is the name of the environment where top-level code is run. " +"\"Top-level code\" is the first user-specified Python module that starts " +"running. It's \"top-level\" because it imports all other modules that the " +"program needs. Sometimes \"top-level code\" is called an *entry point* to " +"the application." +msgstr "" +"``__main__`` 是顶层代码运行环境的名称。“顶层代码”是指由用户指定的最先开始运行的那一个 Python " +"模块。之所以它是“顶层”,是因为它将导入程序所需的所有其它模块。有时“顶层代码”被称为应用程序的 *入口点*。" + +#: ../../library/__main__.rst:53 +msgid "The top-level code environment can be:" +msgstr "顶层代码环境可以是:" + +#: ../../library/__main__.rst:55 +msgid "the scope of an interactive prompt::" +msgstr "交互提示符的作用域:" + +#: ../../library/__main__.rst:57 +msgid "" +">>> __name__\n" +"'__main__'" +msgstr "" +">>> __name__\n" +"'__main__'" + +#: ../../library/__main__.rst:60 +msgid "the Python module passed to the Python interpreter as a file argument:" +msgstr "作为文件参数传给 Python 解释器的 Python 模块:" + +#: ../../library/__main__.rst:62 +msgid "" +"$ python helloworld.py\n" +"Hello, world!" +msgstr "" +"$ python helloworld.py\n" +"Hello, world!" + +#: ../../library/__main__.rst:67 +msgid "" +"the Python module or package passed to the Python interpreter with the " +":option:`-m` argument:" +msgstr "与 :option:`-m` 一起传给 Python 解释器的 Python 模块或包:" + +#: ../../library/__main__.rst:70 +msgid "" +"$ python -m tarfile\n" +"usage: tarfile.py [-h] [-v] (...)" +msgstr "" +"$ python -m tarfile\n" +"usage: tarfile.py [-h] [-v] (...)" + +#: ../../library/__main__.rst:75 +msgid "Python code read by the Python interpreter from standard input:" +msgstr "Python 解释器从标准输入中读取的 Python 代码:" + +#: ../../library/__main__.rst:77 +msgid "" +"$ echo \"import this\" | python\n" +"The Zen of Python, by Tim Peters\n" +"\n" +"Beautiful is better than ugly.\n" +"Explicit is better than implicit.\n" +"..." +msgstr "" +"$ echo \"import this\" | python\n" +"The Zen of Python, by Tim Peters\n" +"\n" +"Beautiful is better than ugly.\n" +"Explicit is better than implicit.\n" +"..." + +#: ../../library/__main__.rst:86 +msgid "" +"Python code passed to the Python interpreter with the :option:`-c` argument:" +msgstr "与 :option:`-c` 一起传给 Python 解释器的 Python 代码:" + +#: ../../library/__main__.rst:88 +msgid "" +"$ python -c \"import this\"\n" +"The Zen of Python, by Tim Peters\n" +"\n" +"Beautiful is better than ugly.\n" +"Explicit is better than implicit.\n" +"..." +msgstr "" +"$ python -c \"import this\"\n" +"The Zen of Python, by Tim Peters\n" +"\n" +"Beautiful is better than ugly.\n" +"Explicit is better than implicit.\n" +"..." + +#: ../../library/__main__.rst:97 +msgid "" +"In each of these situations, the top-level module's ``__name__`` is set to " +"``'__main__'``." +msgstr "上述每种情况中的顶层模块的 ``__name__`` 被设为 ``'__main__'``。" + +#: ../../library/__main__.rst:100 +msgid "" +"As a result, a module can discover whether or not it is running in the top-" +"level environment by checking its own ``__name__``, which allows a common " +"idiom for conditionally executing code when the module is not initialized " +"from an import statement::" +msgstr "作为结果,模块通过检查自己的 ``__name__`` 可发现自己是否运行于顶层环境,使一些代码仅当模块不是被导入语句初始化的时候才执行:" + +#: ../../library/__main__.rst:105 +msgid "" +"if __name__ == '__main__':\n" +" # Execute when the module is not initialized from an import statement.\n" +" ..." +msgstr "" +"if __name__ == '__main__':\n" +" # 将在模块不是由于 import 语句被初始化的情况下执行。\n" +" ..." + +#: ../../library/__main__.rst:111 +msgid "" +"For a more detailed look at how ``__name__`` is set in all situations, see " +"the tutorial section :ref:`tut-modules`." +msgstr "关于在所有情况下 ``__name__`` 是被如何设置的,详见教程的 :ref:`tut-modules` 一节。" + +#: ../../library/__main__.rst:116 ../../library/__main__.rst:239 +msgid "Idiomatic Usage" +msgstr "惯用法" + +#: ../../library/__main__.rst:118 +msgid "" +"Some modules contain code that is intended for script use only, like parsing" +" command-line arguments or fetching data from standard input. If a module " +"like this was imported from a different module, for example to unit test it," +" the script code would unintentionally execute as well." +msgstr "" +"有些模块包含了仅供脚本使用的代码,比如解析命令行参数或从标准输入获取数据。 " +"如果这样的模块被从不同的模块中导入,例如为了单元测试,脚本代码也会无意中执行。" + +#: ../../library/__main__.rst:123 +msgid "" +"This is where using the ``if __name__ == '__main__'`` code block comes in " +"handy. Code within this block won't run unless the module is executed in the" +" top-level environment." +msgstr "" +"这就是 ``if __name__ == '__main__'`` 代码块的用武之地。除非模块在顶层环境中被执行,否则该块内的代码不会运行。" + +#: ../../library/__main__.rst:127 +msgid "" +"Putting as few statements as possible in the block below ``if __name__ == " +"'__main__'`` can improve code clarity and correctness. Most often, a " +"function named ``main`` encapsulates the program's primary behavior::" +msgstr "" +"将尽可能少的语句放在位于 ``if __name__ == '__main__'`` 之下的代码块中可以提高代码的清晰度和准确度。通常,将由一个名为 " +"``main`` 的函数来封装程序的主要行为::" + +#: ../../library/__main__.rst:131 +msgid "" +"# echo.py\n" +"\n" +"import shlex\n" +"import sys\n" +"\n" +"def echo(phrase: str) -> None:\n" +" \"\"\"A dummy wrapper around print.\"\"\"\n" +" # for demonstration purposes, you can imagine that there is some\n" +" # valuable and reusable logic inside this function\n" +" print(phrase)\n" +"\n" +"def main() -> int:\n" +" \"\"\"Echo the input arguments to standard output\"\"\"\n" +" phrase = shlex.join(sys.argv)\n" +" echo(phrase)\n" +" return 0\n" +"\n" +"if __name__ == '__main__':\n" +" sys.exit(main()) # next section explains the use of sys.exit" +msgstr "" +"# echo.py\n" +"\n" +"import shlex\n" +"import sys\n" +"\n" +"def echo(phrase: str) -> None:\n" +" \"\"\"一个对 print 的简单包装器。\"\"\"\n" +" # 出于演示目的,你可以想象在此函数内部\n" +" # 存在有价值且可重用的逻辑\n" +" print(phrase)\n" +"\n" +"def main() -> int:\n" +" \"\"\"将输入参数回显到标准输出\"\"\"\n" +" phrase = shlex.join(sys.argv)\n" +" echo(phrase)\n" +" return 0\n" +"\n" +"if __name__ == '__main__':\n" +" sys.exit(main()) # 下一节将讲解 sys.exit 的使用" + +#: ../../library/__main__.rst:151 +msgid "" +"Note that if the module didn't encapsulate code inside the ``main`` function" +" but instead put it directly within the ``if __name__ == '__main__'`` block," +" the ``phrase`` variable would be global to the entire module. This is " +"error-prone as other functions within the module could be unintentionally " +"using the global variable instead of a local name. A ``main`` function " +"solves this problem." +msgstr "" +"请注意,如果模块没有将代码封装在 ``main`` 函数内,而是直接放在 ``if __name__ == '__main__'`` 块内,那么这个 " +"``phrase`` 变量对整个模块来说就是全局变量。这很容易出错,因为模块内的其他函数可能会无意中使用全局变量而不是局部名称。一个 ``main`` " +"函数解决了这个问题。" + +#: ../../library/__main__.rst:158 +msgid "" +"Using a ``main`` function has the added benefit of the ``echo`` function " +"itself being isolated and importable elsewhere. When ``echo.py`` is " +"imported, the ``echo`` and ``main`` functions will be defined, but neither " +"of them will be called, because ``__name__ != '__main__'``." +msgstr "" +"使用 ``main`` 函数有一个额外的好处,就是 ``echo`` 函数本身是孤立的,可以在其他地方导入。当 ``echo.py`` " +"被导入时,``echo`` 和 ``main`` 函数将被定义,但它们都不会被调用,因为 ``__name__ != '__main__'``。" + +#: ../../library/__main__.rst:165 +msgid "Packaging Considerations" +msgstr "打包考量" + +#: ../../library/__main__.rst:167 +msgid "" +"``main`` functions are often used to create command-line tools by specifying" +" them as entry points for console scripts. When this is done, `pip " +"`_ inserts the function call into a template script, " +"where the return value of ``main`` is passed into :func:`sys.exit`. For " +"example::" +msgstr "" +"``main`` 函数经常被用来创建命令行工具,把它们指定为控制台脚本的入口点。当这样做时,`pip `_ " +"将函数调用插入到模板脚本中,其中 ``main`` 的返回值被传递到 :func:`sys.exit`。例如::" + +#: ../../library/__main__.rst:173 +msgid "sys.exit(main())" +msgstr "sys.exit(main())" + +#: ../../library/__main__.rst:175 +msgid "" +"Since the call to ``main`` is wrapped in :func:`sys.exit`, the expectation " +"is that your function will return some value acceptable as an input to " +":func:`sys.exit`; typically, an integer or ``None`` (which is implicitly " +"returned if your function does not have a return statement)." +msgstr "" +"由于 ``main`` 调用被包裹在 :func:`sys.exit` 中,期望你的函数将返回一些可被 :func:`sys.exit` " +"作为输入而接受的值;通常为一个整数或 ``None`` (如果你的函数没有返回语句则将隐式地返回)。" + +#: ../../library/__main__.rst:180 +msgid "" +"By proactively following this convention ourselves, our module will have the" +" same behavior when run directly (i.e. ``python echo.py``) as it will have " +"if we later package it as a console script entry-point in a pip-installable " +"package." +msgstr "" +"通过主动遵循这一惯例,我们的模块在直接运行时 (即 ``python echo.py``) 会有相同的行为,当我们以后把它打包成可用 pip " +"安装的软件包的控制台脚本入口时也会如此。" + +#: ../../library/__main__.rst:185 +msgid "" +"In particular, be careful about returning strings from your ``main`` " +"function. :func:`sys.exit` will interpret a string argument as a failure " +"message, so your program will have an exit code of ``1``, indicating " +"failure, and the string will be written to :data:`sys.stderr`. The " +"``echo.py`` example from earlier exemplifies using the ``sys.exit(main())`` " +"convention." +msgstr "" +"特别地,要小心从你的 ``main`` 函数中返回字符串。 :func:`sys.exit` 将把一个字符串参数解释为失败信息,所以你的程序将有一个 " +"``1`` 的退出代码,表示失败。并且这个字符串将被写入 :data:`sys.stderr`。前面的 ``echo.py`` 例子举例说明了使用 " +"``sys.exit(main())`` 的约定。" + +#: ../../library/__main__.rst:193 +msgid "" +"`Python Packaging User Guide `_ contains a " +"collection of tutorials and references on how to distribute and install " +"Python packages with modern tools." +msgstr "" +"`Python 打包用户指南 `_ 包含了一系列关于如何用现代工具分发和安装 Python" +" 包的教程和参考资料。" + +#: ../../library/__main__.rst:199 +msgid "``__main__.py`` in Python Packages" +msgstr "Python 包中的 ``__main__.py``" + +#: ../../library/__main__.rst:201 +msgid "" +"If you are not familiar with Python packages, see section :ref:`tut-" +"packages` of the tutorial. Most commonly, the ``__main__.py`` file is used " +"to provide a command-line interface for a package. Consider the following " +"hypothetical package, \"bandclass\":" +msgstr "" +"如果你不熟悉 Python 包,请参阅本教程的 :ref:`tut-packages` 一节。最常见的是,``__main__.py`` " +"文件被用来为一个包提供命令行接口。假设有下面这个虚构的包,\"bandclass\":" + +#: ../../library/__main__.rst:206 +msgid "" +"bandclass\n" +" ├── __init__.py\n" +" ├── __main__.py\n" +" └── student.py" +msgstr "" +"bandclass\n" +" ├── __init__.py\n" +" ├── __main__.py\n" +" └── student.py" + +#: ../../library/__main__.rst:213 +msgid "" +"``__main__.py`` will be executed when the package itself is invoked directly" +" from the command line using the :option:`-m` flag. For example:" +msgstr "当使用 :option:`-m` 标志从命令行直接调用软件包本身时,将执行 ``__main__.py``。例如:" + +#: ../../library/__main__.rst:216 +msgid "$ python -m bandclass" +msgstr "$ python -m bandclass" + +#: ../../library/__main__.rst:220 +msgid "" +"This command will cause ``__main__.py`` to run. How you utilize this " +"mechanism will depend on the nature of the package you are writing, but in " +"this hypothetical case, it might make sense to allow the teacher to search " +"for students::" +msgstr "" +"这个命令将导致 ``__main__.py`` " +"的运行。你如何利用这一机制将取决于你所编写的软件包的性质,但在这个假设的案例中,允许教师搜索学生可能是有意义的::" + +#: ../../library/__main__.rst:225 +msgid "" +"# bandclass/__main__.py\n" +"\n" +"import sys\n" +"from .student import search_students\n" +"\n" +"student_name = sys.argv[1] if len(sys.argv) >= 2 else ''\n" +"print(f'Found student: {search_students(student_name)}')" +msgstr "" +"# bandclass/__main__.py\n" +"\n" +"import sys\n" +"from .student import search_students\n" +"\n" +"student_name = sys.argv[1] if len(sys.argv) >= 2 else ''\n" +"print(f'Found student: {search_students(student_name)}')" + +#: ../../library/__main__.rst:233 +msgid "" +"Note that ``from .student import search_students`` is an example of a " +"relative import. This import style can be used when referencing modules " +"within a package. For more details, see :ref:`intra-package-references` in " +"the :ref:`tut-modules` section of the tutorial." +msgstr "" +"注意,``from .student import search_students`` 是一个相对导入的例子。 " +"这种导入方式可以在引用一个包内的模块时使用。更多细节,请参见教程 :ref:`tut-modules` 中的 :ref:`intra-package-" +"references` 一节。" + +#: ../../library/__main__.rst:241 +msgid "" +"The content of ``__main__.py`` typically isn't fenced with an ``if __name__ " +"== '__main__'`` block. Instead, those files are kept short and import " +"functions to execute from other modules. Those other modules can then be " +"easily unit-tested and are properly reusable." +msgstr "" +"``__main__.py`` 的内容通常不会用 ``if __name__ == '__main__'`` 块围起来。 " +"相反,这些文件会保持简短并从其他模块导入函数来执行。这样其他模块就可以很容易地进行单元测试并可以适当地重用。" + +#: ../../library/__main__.rst:246 +msgid "" +"If used, an ``if __name__ == '__main__'`` block will still work as expected " +"for a ``__main__.py`` file within a package, because its ``__name__`` " +"attribute will include the package's path if imported::" +msgstr "" +"如果使用,一个 ``if __name__ == '__main__'`` 区块仍然会像预期的那样对包内的 ``__main__.py`` " +"文件起作用,因为如果导入,它的 ``__name__`` 属性将包括包的路径::" + +#: ../../library/__main__.rst:250 +msgid "" +">>> import asyncio.__main__\n" +">>> asyncio.__main__.__name__\n" +"'asyncio.__main__'" +msgstr "" +">>> import asyncio.__main__\n" +">>> asyncio.__main__.__name__\n" +"'asyncio.__main__'" + +#: ../../library/__main__.rst:254 +msgid "" +"This won't work for ``__main__.py`` files in the root directory of a " +"``.zip`` file though. Hence, for consistency, a minimal ``__main__.py`` " +"without a ``__name__`` check is preferred." +msgstr "" +"但这对 ``.zip`` 文件的根目录中的 ``__main__.py`` 文件不起作用。因此,为了保持一致性,建议使用不带 ``__name__`` " +"检测的最小化 ``__main__.py``。" + +#: ../../library/__main__.rst:260 +msgid "" +"See :mod:`venv` for an example of a package with a minimal ``__main__.py`` " +"in the standard library. It doesn't contain a ``if __name__ == '__main__'`` " +"block. You can invoke it with ``python -m venv [directory]``." +msgstr "" +"请参阅 :mod:`venv` 以获取标准库中具有最小化 ``__main__.py`` 的软件包示例。它不包含 ``if __name__ == " +"'__main__'`` 代码块。你可以用 ``python -m venv [directory]`` 来调用它。" + +#: ../../library/__main__.rst:264 +msgid "" +"See :mod:`runpy` for more details on the :option:`-m` flag to the " +"interpreter executable." +msgstr "参见 :mod:`runpy` 以了解更多关于解释器可执行文件的 :option:`-m` 标志的细节。" + +#: ../../library/__main__.rst:267 +msgid "" +"See :mod:`zipapp` for how to run applications packaged as *.zip* files. In " +"this case Python looks for a ``__main__.py`` file in the root directory of " +"the archive." +msgstr "" +"参见 :mod:`zipapp` 了解如何运行打包成 *.zip* 文件的应用程序。在这种情况下,Python 会在归档文件的根目录下寻找一个 " +"``__main__.py`` 文件。" + +#: ../../library/__main__.rst:274 +msgid "``import __main__``" +msgstr "``import __main__``" + +#: ../../library/__main__.rst:276 +msgid "" +"Regardless of which module a Python program was started with, other modules " +"running within that same program can import the top-level environment's " +"scope (:term:`namespace`) by importing the ``__main__`` module. This " +"doesn't import a ``__main__.py`` file but rather whichever module that " +"received the special name ``'__main__'``." +msgstr "" +"不管 Python 程序是用哪个模块启动的,在同一程序中运行的其他模块可以通过导入 ``__main__`` 模块来导入顶层环境的作用域 ( " +":term:`namespace` )。这并不是导入一个 ``__main__.py`` 文件,而是导入使用特殊名称 ``'__main__'`` " +"的那个模块。" + +#: ../../library/__main__.rst:282 +msgid "Here is an example module that consumes the ``__main__`` namespace::" +msgstr "下面是一个使用 ``__main__`` 命名空间的模块的例子::" + +#: ../../library/__main__.rst:284 +msgid "" +"# namely.py\n" +"\n" +"import __main__\n" +"\n" +"def did_user_define_their_name():\n" +" return 'my_name' in dir(__main__)\n" +"\n" +"def print_user_name():\n" +" if not did_user_define_their_name():\n" +" raise ValueError('Define the variable `my_name`!')\n" +"\n" +" print(__main__.my_name)" +msgstr "" +"# namely.py\n" +"\n" +"import __main__\n" +"\n" +"def did_user_define_their_name():\n" +" return 'my_name' in dir(__main__)\n" +"\n" +"def print_user_name():\n" +" if not did_user_define_their_name():\n" +" raise ValueError('Define the variable `my_name`!')\n" +"\n" +" print(__main__.my_name)" + +#: ../../library/__main__.rst:297 +msgid "Example usage of this module could be as follows::" +msgstr "该模块的用法示例如下::" + +#: ../../library/__main__.rst:299 +msgid "" +"# start.py\n" +"\n" +"import sys\n" +"\n" +"from namely import print_user_name\n" +"\n" +"# my_name = \"Dinsdale\"\n" +"\n" +"def main():\n" +" try:\n" +" print_user_name()\n" +" except ValueError as ve:\n" +" return str(ve)\n" +"\n" +"if __name__ == \"__main__\":\n" +" sys.exit(main())" +msgstr "" +"# start.py\n" +"\n" +"import sys\n" +"\n" +"from namely import print_user_name\n" +"\n" +"# my_name = \"Dinsdale\"\n" +"\n" +"def main():\n" +" try:\n" +" print_user_name()\n" +" except ValueError as ve:\n" +" return str(ve)\n" +"\n" +"if __name__ == \"__main__\":\n" +" sys.exit(main())" + +#: ../../library/__main__.rst:316 +msgid "Now, if we started our program, the result would look like this:" +msgstr "现在,如果我们启动我们的程序,结果会是这样的:" + +#: ../../library/__main__.rst:318 +msgid "" +"$ python start.py\n" +"Define the variable `my_name`!" +msgstr "" +"$ python start.py\n" +"Define the variable `my_name`!" + +#: ../../library/__main__.rst:323 +msgid "" +"The exit code of the program would be 1, indicating an error. Uncommenting " +"the line with ``my_name = \"Dinsdale\"`` fixes the program and now it exits " +"with status code 0, indicating success:" +msgstr "" +"该程序的退出代码为 1,表明有错误。取消对 ``my_name = \"Dinsdale\"`` 这一行的注释,就可以修复程序,现在它的退出状态代码为 " +"0,表示成功。" + +#: ../../library/__main__.rst:327 +msgid "" +"$ python start.py\n" +"Dinsdale" +msgstr "" +"$ python start.py\n" +"Dinsdale" + +#: ../../library/__main__.rst:332 +msgid "" +"Note that importing ``__main__`` doesn't cause any issues with " +"unintentionally running top-level code meant for script use which is put in " +"the ``if __name__ == \"__main__\"`` block of the ``start`` module. Why does " +"this work?" +msgstr "" +"请注意,导入 ``__main__`` 不会导致无意中运行旨在用于脚本的顶层代码的问题,这些代码被放在模块 ``start`` 的 ``if " +"__name__ == \"__main__\"`` 块中。为什么这行得通?" + +#: ../../library/__main__.rst:336 +msgid "" +"Python inserts an empty ``__main__`` module in :data:`sys.modules` at " +"interpreter startup, and populates it by running top-level code. In our " +"example this is the ``start`` module which runs line by line and imports " +"``namely``. In turn, ``namely`` imports ``__main__`` (which is really " +"``start``). That's an import cycle! Fortunately, since the partially " +"populated ``__main__`` module is present in :data:`sys.modules`, Python " +"passes that to ``namely``. See :ref:`Special considerations for __main__ " +"` in the import system's reference for details on how " +"this works." +msgstr "" +"Python 解释器启动时会在 :data:`sys.modules` 中插入一个空的 ``__main__`` 模块,并通过运行最高层级代码来填充它。" +" 在我们的例子中这就是 ``start`` 模块,它逐行运行并导入 ``namely``。相应地,``namely`` 会导入 ``__main__``" +" (它实际上就是 ``start``)。这就是一个导入循环!幸运的是,由于部分填充的 ``__main__`` 模块存在于 " +":data:`sys.modules` 中,Python 会将其传递给 ``namely``。请参阅导入系统的参考文档中 :ref:`有关 " +"__main__ 的特别考量 ` 来了解其中的详情。" + +#: ../../library/__main__.rst:345 +msgid "" +"The Python REPL is another example of a \"top-level environment\", so " +"anything defined in the REPL becomes part of the ``__main__`` scope::" +msgstr "Python REPL 是另一个\"顶层环境\"的例子,所以在 REPL 中定义的任何东西都成为 ``__main__`` 作用域的一部分::" + +#: ../../library/__main__.rst:348 +msgid "" +">>> import namely\n" +">>> namely.did_user_define_their_name()\n" +"False\n" +">>> namely.print_user_name()\n" +"Traceback (most recent call last):\n" +"...\n" +"ValueError: Define the variable `my_name`!\n" +">>> my_name = 'Jabberwocky'\n" +">>> namely.did_user_define_their_name()\n" +"True\n" +">>> namely.print_user_name()\n" +"Jabberwocky" +msgstr "" +">>> import namely\n" +">>> namely.did_user_define_their_name()\n" +"False\n" +">>> namely.print_user_name()\n" +"Traceback (most recent call last):\n" +"...\n" +"ValueError: Define the variable `my_name`!\n" +">>> my_name = 'Jabberwocky'\n" +">>> namely.did_user_define_their_name()\n" +"True\n" +">>> namely.print_user_name()\n" +"Jabberwocky" + +#: ../../library/__main__.rst:361 +msgid "" +"The ``__main__`` scope is used in the implementation of :mod:`pdb` and " +":mod:`rlcompleter`." +msgstr "``__main__`` 作用域用于 :mod:`pdb` 和 :mod:`rlcompleter` 的实现。" diff --git a/library/_thread.po b/library/_thread.po new file mode 100644 index 0000000000..3c9764f758 --- /dev/null +++ b/library/_thread.po @@ -0,0 +1,361 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/_thread.rst:2 +msgid ":mod:`!_thread` --- Low-level threading API" +msgstr ":mod:`!_thread` --- 低层级多线程 API" + +#: ../../library/_thread.rst:15 +msgid "" +"This module provides low-level primitives for working with multiple threads " +"(also called :dfn:`light-weight processes` or :dfn:`tasks`) --- multiple " +"threads of control sharing their global data space. For synchronization, " +"simple locks (also called :dfn:`mutexes` or :dfn:`binary semaphores`) are " +"provided. The :mod:`threading` module provides an easier to use and higher-" +"level threading API built on top of this module." +msgstr "" +"该模块提供了操作多个线程 (也被称为 :dfn:`轻量级进程` 或 :dfn:`任务`) 的底层原语 —— " +"多个控制线程共享全局数据空间。为了处理同步问题,也提供了简单的锁机制 (也称为 :dfn:`互斥锁` 或 :dfn:`二进制信号`)。 " +":mod:`threading` 模块基于该模块提供了更易用的高级多线程 API。" + +#: ../../library/_thread.rst:26 +msgid "This module used to be optional, it is now always available." +msgstr "这个模块曾经为可选项,但现在总是可用。" + +#: ../../library/_thread.rst:29 +msgid "This module defines the following constants and functions:" +msgstr "这个模块定义了以下常量和函数:" + +#: ../../library/_thread.rst:33 +msgid "Raised on thread-specific errors." +msgstr "发生线程相关错误时抛出。" + +#: ../../library/_thread.rst:35 +msgid "This is now a synonym of the built-in :exc:`RuntimeError`." +msgstr "现在是内建异常 :exc:`RuntimeError` 的别名。" + +#: ../../library/_thread.rst:41 +msgid "This is the type of lock objects." +msgstr "锁对象的类型。" + +#: ../../library/_thread.rst:46 +msgid "" +"Start a new thread and return its identifier. The thread executes the " +"function *function* with the argument list *args* (which must be a tuple). " +"The optional *kwargs* argument specifies a dictionary of keyword arguments." +msgstr "" +"开启一个新线程并返回其标识。线程执行函数 *function* 并附带参数列表 *args* (必须是元组)。可选的 *kwargs* " +"参数指定一个关键字参数字典。" + +#: ../../library/_thread.rst:50 +msgid "When the function returns, the thread silently exits." +msgstr "当函数返回时,线程会静默地退出。" + +#: ../../library/_thread.rst:52 +msgid "" +"When the function terminates with an unhandled exception, " +":func:`sys.unraisablehook` is called to handle the exception. The *object* " +"attribute of the hook argument is *function*. By default, a stack trace is " +"printed and then the thread exits (but other threads continue to run)." +msgstr "" +"当函数因某个未处理异常而终结时,:func:`sys.unraisablehook` 会被调用以处理异常。钩子参数的 *object* 属性为 " +"*function*。在默认情况下,会打印堆栈回溯然后该线程将退出(但其他线程会继续运行)。" + +#: ../../library/_thread.rst:57 +msgid "" +"When the function raises a :exc:`SystemExit` exception, it is silently " +"ignored." +msgstr "当函数引发 :exc:`SystemExit` 异常时,它会被静默地忽略。" + +#: ../../library/_thread.rst:60 +msgid "" +"Raises an :ref:`auditing event ` ``_thread.start_new_thread`` with" +" arguments ``function``, ``args``, ``kwargs``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``_thread.start_new_thread`` 并附带参数 ``function``," +" ``args``, ``kwargs``." + +#: ../../library/_thread.rst:62 +msgid ":func:`sys.unraisablehook` is now used to handle unhandled exceptions." +msgstr "现在会使用 :func:`sys.unraisablehook` 来处理未处理的异常。" + +#: ../../library/_thread.rst:68 +msgid "" +"Simulate the effect of a signal arriving in the main thread. A thread can " +"use this function to interrupt the main thread, though there is no guarantee" +" that the interruption will happen immediately." +msgstr "模拟一个信号到达主线程的效果。线程可使用此函数来打断主线程,虽然并不保证打断将立即发生。" + +#: ../../library/_thread.rst:72 +msgid "" +"If given, *signum* is the number of the signal to simulate. If *signum* is " +"not given, :const:`signal.SIGINT` is simulated." +msgstr "" +"如果给出 *signum*,则表示要模拟的信号的编号。如果未给出 *signum*,则将模拟 :const:`signal.SIGINT`。" + +#: ../../library/_thread.rst:75 +msgid "" +"If the given signal isn't handled by Python (it was set to " +":const:`signal.SIG_DFL` or :const:`signal.SIG_IGN`), this function does " +"nothing." +msgstr "" +"如果给出的信号未被 Python 处理 (它被设为 :const:`signal.SIG_DFL` 或 " +":const:`signal.SIG_IGN`),则此函数将不做任何操作。" + +#: ../../library/_thread.rst:79 +msgid "The *signum* argument is added to customize the signal number." +msgstr "添加了 *signum* 参数来定制信号的编号。" + +#: ../../library/_thread.rst:83 +msgid "" +"This does not emit the corresponding signal but schedules a call to the " +"associated handler (if it exists). If you want to truly emit the signal, use" +" :func:`signal.raise_signal`." +msgstr "" +"这并不会发出对应的信号而是将一个调用排入关联处理器的计划任务(如果处理器存在的话)。如果你想要真的发出信号,请使用 " +":func:`signal.raise_signal`." + +#: ../../library/_thread.rst:90 +msgid "" +"Raise the :exc:`SystemExit` exception. When not caught, this will cause the" +" thread to exit silently." +msgstr "抛出 :exc:`SystemExit` 异常。如果没有捕获的话,这个异常会使线程退出。" + +#: ../../library/_thread.rst:104 +msgid "" +"Return a new lock object. Methods of locks are described below. The lock " +"is initially unlocked." +msgstr "返回一个新的锁对象。锁中的方法在后面描述。初始情况下锁处于解锁状态。" + +#: ../../library/_thread.rst:110 +msgid "" +"Return the 'thread identifier' of the current thread. This is a nonzero " +"integer. Its value has no direct meaning; it is intended as a magic cookie " +"to be used e.g. to index a dictionary of thread-specific data. Thread " +"identifiers may be recycled when a thread exits and another thread is " +"created." +msgstr "" +"返回当前线程的“线程标识符”。它是一个非零的整数。它的值没有直接含义,主要是用作 magic " +"cookie,比如作为含有线程相关数据的字典的索引。线程标识符可能会在线程退出,新线程创建时被复用。" + +#: ../../library/_thread.rst:118 +msgid "" +"Return the native integral Thread ID of the current thread assigned by the " +"kernel. This is a non-negative integer. Its value may be used to uniquely " +"identify this particular thread system-wide (until the thread terminates, " +"after which the value may be recycled by the OS)." +msgstr "" +"返回内核分配给当前线程的原生集成线程 ID。这是一个非负整数。它的值可被用来在整个系统中唯一地标识这个特定线程(直到线程终结,在那之后该值可能会被 OS" +" 回收再利用)。" + +#: ../../library/_thread.rst:123 ../../library/_thread.rst:148 +msgid "Availability" +msgstr "Availability" + +#: ../../library/_thread.rst:127 +msgid "Added support for GNU/kFreeBSD." +msgstr "增加了对 GNU/kFreeBSD 的支持。" + +#: ../../library/_thread.rst:133 +msgid "" +"Return the thread stack size used when creating new threads. The optional " +"*size* argument specifies the stack size to be used for subsequently created" +" threads, and must be 0 (use platform or configured default) or a positive " +"integer value of at least 32,768 (32 KiB). If *size* is not specified, 0 is " +"used. If changing the thread stack size is unsupported, a " +":exc:`RuntimeError` is raised. If the specified stack size is invalid, a " +":exc:`ValueError` is raised and the stack size is unmodified. 32 KiB is " +"currently the minimum supported stack size value to guarantee sufficient " +"stack space for the interpreter itself. Note that some platforms may have " +"particular restrictions on values for the stack size, such as requiring a " +"minimum stack size > 32 KiB or requiring allocation in multiples of the " +"system memory page size - platform documentation should be referred to for " +"more information (4 KiB pages are common; using multiples of 4096 for the " +"stack size is the suggested approach in the absence of more specific " +"information)." +msgstr "" +"返回创建线程时使用的堆栈大小。可选参数 *size* 指定之后新建的线程的堆栈大小,而且一定要是 0(根据平台或者默认配置)或者最小是 " +"32,768(32KiB)的一个正整数。如果 *size* 没有指定,默认是 0。如果不支持改变线程堆栈大小,会抛出 " +":exc:`RuntimeError` 错误。如果指定的堆栈大小不合法,会抛出 :exc:`ValueError` 错误并且不会修改堆栈大小。32KiB" +" 是当前最小的能保证解释器有足够堆栈空间的堆栈大小。需要注意的是部分平台对于堆栈大小会有特定的限制,例如要求大于 32KiB " +"的堆栈大小或者需要根据系统内存页面的整数倍进行分配 - 应当查阅平台文档有关详细信息(4KiB 页面比较普遍,在没有更具体信息的情况下,建议的方法是使用" +" 4096 的倍数作为堆栈大小)。" + +#: ../../library/_thread.rst:150 +msgid "Unix platforms with POSIX threads support." +msgstr "带有 POSIX 线程支持的 Unix 平台。" + +#: ../../library/_thread.rst:155 +msgid "" +"The maximum value allowed for the *timeout* parameter of :meth:`Lock.acquire" +" `. Specifying a timeout greater than this value " +"will raise an :exc:`OverflowError`." +msgstr "" +":meth:`Lock.acquire ` 的 *timeout* 形参所允许的最大值。指定大于该值的 " +"timeout 将引发 :exc:`OverflowError`。" + +#: ../../library/_thread.rst:162 +msgid "Lock objects have the following methods:" +msgstr "锁对象有以下方法:" + +#: ../../library/_thread.rst:167 +msgid "" +"Without any optional argument, this method acquires the lock " +"unconditionally, if necessary waiting until it is released by another thread" +" (only one thread at a time can acquire a lock --- that's their reason for " +"existence)." +msgstr "没有任何可选参数时,该方法无条件申请获得锁,有必要的话会等待其他线程释放锁(同时只有一个线程能获得锁 —— 这正是锁存在的原因)。" + +#: ../../library/_thread.rst:171 +msgid "" +"If the *blocking* argument is present, the action depends on its value: if " +"it is false, the lock is only acquired if it can be acquired immediately " +"without waiting, while if it is true, the lock is acquired unconditionally " +"as above." +msgstr "" +"如果提供了 *blocking* " +"参数,具体的行为将取决于它的值:如果它为假值,则只在能够立即获取到锁而无需等待时才会获取,而如果它为真值,则会与上面一样无条件地获取锁。" + +#: ../../library/_thread.rst:176 +msgid "" +"If the floating-point *timeout* argument is present and positive, it " +"specifies the maximum wait time in seconds before returning. A negative " +"*timeout* argument specifies an unbounded wait. You cannot specify a " +"*timeout* if *blocking* is false." +msgstr "" +"如果提供了浮点数形式的 *timeout* 参数且为正值,它将指明在返回之前的最大等待秒数。负的 *timeout* 参数表示无限期的等待。如果 " +"*blocking* 为假值则你不能指定 *timeout*。" + +#: ../../library/_thread.rst:181 +msgid "" +"The return value is ``True`` if the lock is acquired successfully, ``False``" +" if not." +msgstr "如果成功获取到锁会返回 ``True``,否则返回 ``False``。" + +#: ../../library/_thread.rst:184 +msgid "The *timeout* parameter is new." +msgstr "新的 *timeout* 形参。" + +#: ../../library/_thread.rst:187 +msgid "Lock acquires can now be interrupted by signals on POSIX." +msgstr "现在获取锁的操作可以被 POSIX 信号中断。" + +#: ../../library/_thread.rst:190 +msgid "Lock acquires can now be interrupted by signals on Windows." +msgstr "在 Windows 上现在可以通过信号来中断锁的获取。" + +#: ../../library/_thread.rst:196 +msgid "" +"Releases the lock. The lock must have been acquired earlier, but not " +"necessarily by the same thread." +msgstr "释放锁。锁必须已经被获取过,但不一定是同一个线程获取的。" + +#: ../../library/_thread.rst:202 +msgid "" +"Return the status of the lock: ``True`` if it has been acquired by some " +"thread, ``False`` if not." +msgstr "返回锁的状态:如果已被某个线程获取,返回 ``True``,否则返回 ``False``。" + +#: ../../library/_thread.rst:205 +msgid "" +"In addition to these methods, lock objects can also be used via the " +":keyword:`with` statement, e.g.::" +msgstr "除了这些方法之外,锁对象也可以通过 :keyword:`with` 语句使用,例如:" + +#: ../../library/_thread.rst:208 +msgid "" +"import _thread\n" +"\n" +"a_lock = _thread.allocate_lock()\n" +"\n" +"with a_lock:\n" +" print(\"a_lock is locked while this executes\")" +msgstr "" +"import _thread\n" +"\n" +"a_lock = _thread.allocate_lock()\n" +"\n" +"with a_lock:\n" +" print(\"在执行这段代码时,a_lock 已被锁定\")" + +#: ../../library/_thread.rst:215 +msgid "**Caveats:**" +msgstr "**注意事项:**" + +#: ../../library/_thread.rst:219 +msgid "" +"Interrupts always go to the main thread (the :exc:`KeyboardInterrupt` " +"exception will be received by that thread.)" +msgstr "中断总是会到主线程 (:exc:`KeyboardInterrupt` 异常将由该线程接收。)" + +#: ../../library/_thread.rst:222 +msgid "" +"Calling :func:`sys.exit` or raising the :exc:`SystemExit` exception is " +"equivalent to calling :func:`_thread.exit`." +msgstr "" +"调用 :func:`sys.exit` 或是抛出 :exc:`SystemExit` 异常等效于调用 :func:`_thread.exit`。" + +#: ../../library/_thread.rst:225 +msgid "" +"When the main thread exits, it is system defined whether the other threads " +"survive. On most systems, they are killed without executing :keyword:`try` " +"... :keyword:`finally` clauses or executing object destructors." +msgstr "" +"当主线程退出时,由系统决定其他线程是否存活。在大多数系统中,这些线程会直接被杀掉,不会执行 :keyword:`try` ... " +":keyword:`finally` 语句,也不会执行对象析构函数。" + +#: ../../library/_thread.rst:7 +msgid "light-weight processes" +msgstr "轻量级进程" + +#: ../../library/_thread.rst:7 +msgid "processes, light-weight" +msgstr "进程,轻量级" + +#: ../../library/_thread.rst:7 +msgid "binary semaphores" +msgstr "二元信号量" + +#: ../../library/_thread.rst:7 +msgid "semaphores, binary" +msgstr "信号量,二元" + +#: ../../library/_thread.rst:22 +msgid "pthreads" +msgstr "pthreads" + +#: ../../library/_thread.rst:22 +msgid "threads" +msgstr "threads" + +#: ../../library/_thread.rst:22 +msgid "POSIX" +msgstr "POSIX" + +#: ../../library/_thread.rst:217 +msgid "module" +msgstr "module" + +#: ../../library/_thread.rst:217 +msgid "signal" +msgstr "signal" diff --git a/library/abc.po b/library/abc.po new file mode 100644 index 0000000000..6795523734 --- /dev/null +++ b/library/abc.po @@ -0,0 +1,643 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/abc.rst:2 +msgid ":mod:`!abc` --- Abstract Base Classes" +msgstr ":mod:`!abc` --- 抽象基类" + +#: ../../library/abc.rst:11 +msgid "**Source code:** :source:`Lib/abc.py`" +msgstr "**源代码:** :source:`Lib/abc.py`" + +#: ../../library/abc.rst:15 +msgid "" +"This module provides the infrastructure for defining :term:`abstract base " +"classes ` (ABCs) in Python, as outlined in :pep:`3119`;" +" see the PEP for why this was added to Python. (See also :pep:`3141` and the" +" :mod:`numbers` module regarding a type hierarchy for numbers based on " +"ABCs.)" +msgstr "" +"该模块提供了在 Python 中定义 :term:`抽象基类 ` (ABC) 的组件,在 " +":pep:`3119` 中已有概述。查看 PEP 文档了解为什么需要在 Python 中增加这个模块。(也可查看 :pep:`3141` 以及 " +":mod:`numbers` 模块了解基于 ABC 的数字类型继承关系。)" + +#: ../../library/abc.rst:20 +msgid "" +"The :mod:`collections` module has some concrete classes that derive from " +"ABCs; these can, of course, be further derived. In addition, the " +":mod:`collections.abc` submodule has some ABCs that can be used to test " +"whether a class or instance provides a particular interface, for example, if" +" it is :term:`hashable` or if it is a :term:`mapping`." +msgstr "" +":mod:`collections` 模块中有一些派生自 ABC 的实体类;当然,这些类还可以进一步被派生。 " +"此外,:mod:`collections.abc` 子模块中有一些可被用于测试一个类或实例是否提供了特定接口的 ABC,例如,它是否为 " +":term:`hashable` 或者是否为 :term:`mapping` 等。" + +#: ../../library/abc.rst:27 +msgid "" +"This module provides the metaclass :class:`ABCMeta` for defining ABCs and a " +"helper class :class:`ABC` to alternatively define ABCs through inheritance:" +msgstr "" +"该模块提供了一个元类 :class:`ABCMeta`,可以用来定义抽象类,另外还提供一个工具类 " +":class:`ABC`,可以用它以继承的方式定义抽象基类。" + +#: ../../library/abc.rst:32 +msgid "" +"A helper class that has :class:`ABCMeta` as its metaclass. With this class," +" an abstract base class can be created by simply deriving from :class:`!ABC`" +" avoiding sometimes confusing metaclass usage, for example::" +msgstr "" +"一个使用 :class:`ABCMeta` 作为元类的辅助类。使用这个类,可以通过简单地从 :class:`!ABC` " +"派生的方式创建抽象基类,这将避免时常令人混淆的元类用法,例如::" + +#: ../../library/abc.rst:36 +msgid "" +"from abc import ABC\n" +"\n" +"class MyABC(ABC):\n" +" pass" +msgstr "" +"from abc import ABC\n" +"\n" +"class MyABC(ABC):\n" +" pass" + +#: ../../library/abc.rst:41 +msgid "" +"Note that the type of :class:`!ABC` is still :class:`ABCMeta`, therefore " +"inheriting from :class:`!ABC` requires the usual precautions regarding " +"metaclass usage, as multiple inheritance may lead to metaclass conflicts. " +"One may also define an abstract base class by passing the metaclass keyword " +"and using :class:`!ABCMeta` directly, for example::" +msgstr "" +"请注意 :class:`!ABC` 的类型仍然是 :class:`ABCMeta`,因此继承 :class:`!ABC` " +"仍然需要考虑使用元类的注意事项,比如可能会导致元类冲突的多重继承。你也可以通过传入 metaclass 关键字并直接使用 " +":class:`!ABCMeta` 来定义抽象基类,例如::" + +#: ../../library/abc.rst:47 +msgid "" +"from abc import ABCMeta\n" +"\n" +"class MyABC(metaclass=ABCMeta):\n" +" pass" +msgstr "" +"from abc import ABCMeta\n" +"\n" +"class MyABC(metaclass=ABCMeta):\n" +" pass" + +#: ../../library/abc.rst:57 +msgid "Metaclass for defining Abstract Base Classes (ABCs)." +msgstr "用于定义抽象基类(ABC)的元类。" + +#: ../../library/abc.rst:59 +msgid "" +"Use this metaclass to create an ABC. An ABC can be subclassed directly, and" +" then acts as a mix-in class. You can also register unrelated concrete " +"classes (even built-in classes) and unrelated ABCs as \"virtual subclasses\"" +" -- these and their descendants will be considered subclasses of the " +"registering ABC by the built-in :func:`issubclass` function, but the " +"registering ABC won't show up in their MRO (Method Resolution Order) nor " +"will method implementations defined by the registering ABC be callable (not " +"even via :func:`super`). [#]_" +msgstr "" +"使用该元类以创建抽象基类。抽象基类可以像 mix-in 类一样直接被子类继承。你也可以将不相关的具体类(包括内建类)和抽象基类注册为\"虚拟子类\" " +"—— 这些类以及它们的子类会被内建函数 :func:`issubclass` 识别为对应的抽象基类的子类,但是该抽象基类不会出现在其 " +"MRO(Method Resolution Order,方法解析顺序)中,抽象基类中实现的方法也不可调用(即使通过 :func:`super` " +"调用也不行)。[#]_" + +#: ../../library/abc.rst:68 +msgid "" +"Classes created with a metaclass of :class:`!ABCMeta` have the following " +"method:" +msgstr "使用 :class:`!ABCMeta` 元类创建的类具有以下方法:" + +#: ../../library/abc.rst:72 +msgid "Register *subclass* as a \"virtual subclass\" of this ABC. For example::" +msgstr "将 *subclass* 注册为该 ABC 的“虚拟子类”。例如::" + +#: ../../library/abc.rst:75 +msgid "" +"from abc import ABC\n" +"\n" +"class MyABC(ABC):\n" +" pass\n" +"\n" +"MyABC.register(tuple)\n" +"\n" +"assert issubclass(tuple, MyABC)\n" +"assert isinstance((), MyABC)" +msgstr "" +"from abc import ABC\n" +"\n" +"class MyABC(ABC):\n" +" pass\n" +"\n" +"MyABC.register(tuple)\n" +"\n" +"assert issubclass(tuple, MyABC)\n" +"assert isinstance((), MyABC)" + +#: ../../library/abc.rst:85 +msgid "Returns the registered subclass, to allow usage as a class decorator." +msgstr "返回注册的子类,使其能够作为类装饰器。" + +#: ../../library/abc.rst:88 +msgid "" +"To detect calls to :meth:`!register`, you can use the " +":func:`get_cache_token` function." +msgstr "要检测对 :meth:`!register` 的调用,你可以使用 :func:`get_cache_token` 函数。" + +#: ../../library/abc.rst:92 +msgid "You can also override this method in an abstract base class:" +msgstr "你也可以在抽象基类中重写这个方法:" + +#: ../../library/abc.rst:96 +msgid "(Must be defined as a class method.)" +msgstr "(必须定义为类方法。)" + +#: ../../library/abc.rst:98 +msgid "" +"Check whether *subclass* is considered a subclass of this ABC. This means " +"that you can customize the behavior of :func:`issubclass` further without " +"the need to call :meth:`register` on every class you want to consider a " +"subclass of the ABC. (This class method is called from the " +":meth:`~type.__subclasscheck__` method of the ABC.)" +msgstr "" +"检查 *subclass* 是否为该 ABC 的子类。这意味着你可以进一步定制 :func:`issubclass` 的行为而无需在每个你希望作为该 " +"ABC 的子类的类上调用 :meth:`register`。 (这个类方法是在该 ABC 的 " +":meth:`~type.__subclasscheck__` 方法上被调用的。)" + +#: ../../library/abc.rst:104 +msgid "" +"This method should return ``True``, ``False`` or :data:`NotImplemented`. If" +" it returns ``True``, the *subclass* is considered a subclass of this ABC. " +"If it returns ``False``, the *subclass* is not considered a subclass of this" +" ABC, even if it would normally be one. If it returns " +":data:`!NotImplemented`, the subclass check is continued with the usual " +"mechanism." +msgstr "" +"该方法应返回 ``True``、``False`` 或 :data:`NotImplemented`。如果返回 ``True``,则 " +"*subclass* 被视为该抽象基类的子类。如果返回 ``False``,则 *subclass* 不被视为此抽象基类的子类,即使它通常是。如果返回 " +":data:`!NotImplemented`,则继续按照常规机制检查子类。" + +#: ../../library/abc.rst:114 +msgid "" +"For a demonstration of these concepts, look at this example ABC definition::" +msgstr "为了对这些概念做一演示,请看以下定义 ABC 的示例::" + +#: ../../library/abc.rst:116 +msgid "" +"class Foo:\n" +" def __getitem__(self, index):\n" +" ...\n" +" def __len__(self):\n" +" ...\n" +" def get_iterator(self):\n" +" return iter(self)\n" +"\n" +"class MyIterable(ABC):\n" +"\n" +" @abstractmethod\n" +" def __iter__(self):\n" +" while False:\n" +" yield None\n" +"\n" +" def get_iterator(self):\n" +" return self.__iter__()\n" +"\n" +" @classmethod\n" +" def __subclasshook__(cls, C):\n" +" if cls is MyIterable:\n" +" if any(\"__iter__\" in B.__dict__ for B in C.__mro__):\n" +" return True\n" +" return NotImplemented\n" +"\n" +"MyIterable.register(Foo)" +msgstr "" +"class Foo:\n" +" def __getitem__(self, index):\n" +" ...\n" +" def __len__(self):\n" +" ...\n" +" def get_iterator(self):\n" +" return iter(self)\n" +"\n" +"class MyIterable(ABC):\n" +"\n" +" @abstractmethod\n" +" def __iter__(self):\n" +" while False:\n" +" yield None\n" +"\n" +" def get_iterator(self):\n" +" return self.__iter__()\n" +"\n" +" @classmethod\n" +" def __subclasshook__(cls, C):\n" +" if cls is MyIterable:\n" +" if any(\"__iter__\" in B.__dict__ for B in C.__mro__):\n" +" return True\n" +" return NotImplemented\n" +"\n" +"MyIterable.register(Foo)" + +#: ../../library/abc.rst:143 +msgid "" +"The ABC ``MyIterable`` defines the standard iterable method, " +":meth:`~object.__iter__`, as an abstract method. The implementation given " +"here can still be called from subclasses. The :meth:`!get_iterator` method " +"is also part of the ``MyIterable`` abstract base class, but it does not have" +" to be overridden in non-abstract derived classes." +msgstr "" +"ABC ``MyIterable`` 将标准的可迭代对象方法 :meth:`~object.__iter__` 定义为一个抽象方法。 " +"这里给出的实现仍可以从子类中调用。 :meth:`!get_iterator` 方法也是 ``MyIterable`` " +"抽象基类的一部分,但它并非必须在非抽象的派生类中被重写。" + +#: ../../library/abc.rst:149 +msgid "" +"The :meth:`__subclasshook__` class method defined here says that any class " +"that has an :meth:`~object.__iter__` method in its :attr:`~object.__dict__` " +"(or in that of one of its base classes, accessed via the " +":attr:`~type.__mro__` list) is considered a ``MyIterable`` too." +msgstr "" +"这里定义的 :meth:`__subclasshook__` 类方法指明任何在其 :attr:`~object.__dict__` (或在其通过 " +":attr:`~type.__mro__` 列表访问的基类) 中具有 :meth:`~object.__iter__` 方法的类也都会被视为 " +"``MyIterable``." + +#: ../../library/abc.rst:154 +msgid "" +"Finally, the last line makes ``Foo`` a virtual subclass of ``MyIterable``, " +"even though it does not define an :meth:`~object.__iter__` method (it uses " +"the old-style iterable protocol, defined in terms of :meth:`~object.__len__`" +" and :meth:`~object.__getitem__`). Note that this will not make " +"``get_iterator`` available as a method of ``Foo``, so it is provided " +"separately." +msgstr "" +"最后,末尾的行使得 ``Foo`` 成为 ``MyIterable`` 的一个虚子类,即使它没有定义 :meth:`~object.__iter__` " +"方法(它使用了以 :meth:`~object.__len__` 和 :meth:`~object.__getitem__` " +"等方法定义的旧式可迭代协议)。请注意这将不会使 ``get_iterator`` 成为 ``Foo`` 可用的方法,所以它会被单独提供。" + +#: ../../library/abc.rst:163 +msgid "The :mod:`!abc` module also provides the following decorator:" +msgstr ":mod:`!abc` 模块还提供了下列装饰器:" + +#: ../../library/abc.rst:167 +msgid "A decorator indicating abstract methods." +msgstr "用于声明抽象方法的装饰器。" + +#: ../../library/abc.rst:169 +msgid "" +"Using this decorator requires that the class's metaclass is :class:`ABCMeta`" +" or is derived from it. A class that has a metaclass derived from " +":class:`!ABCMeta` cannot be instantiated unless all of its abstract methods " +"and properties are overridden. The abstract methods can be called using any" +" of the normal 'super' call mechanisms. :func:`!abstractmethod` may be used" +" to declare abstract methods for properties and descriptors." +msgstr "" +"使用此装饰器要求类的元类是 :class:`ABCMeta` 或是其派生类。一个具有派生自 :class:`!ABCMeta` " +"的元类的类无法被实例化,除非它全部的抽象方法和特征属性均已被重载。抽象方法可通过任何普通的 'super' 调用机制来调用。 " +":func:`!abstractmethod` 可被用于声明特征属性和描述器的抽象方法。" + +#: ../../library/abc.rst:176 +msgid "" +"Dynamically adding abstract methods to a class, or attempting to modify the " +"abstraction status of a method or class once it is created, are only " +"supported using the :func:`update_abstractmethods` function. The " +":func:`!abstractmethod` only affects subclasses derived using regular " +"inheritance; \"virtual subclasses\" registered with the ABC's " +":meth:`~ABCMeta.register` method are not affected." +msgstr "" +"动态地添加抽象方法到一个类,或尝试在方法或类被创建后修改其抽象状态等操作仅在使用 :func:`update_abstractmethods` " +"函数时受到支持。 :func:`!abstractmethod` 只会影响使用常规继承所派生的子类;通过 ABC 的 " +":meth:`~ABCMeta.register` 方法注册的“虚子类”不会受到影响。" + +#: ../../library/abc.rst:183 +msgid "" +"When :func:`!abstractmethod` is applied in combination with other method " +"descriptors, it should be applied as the innermost decorator, as shown in " +"the following usage examples::" +msgstr "当 :func:`!abstractmethod` 与其他方法描述器配合应用时,它应当被应用为最内层的装饰器,如以下用法示例所示::" + +#: ../../library/abc.rst:187 +msgid "" +"class C(ABC):\n" +" @abstractmethod\n" +" def my_abstract_method(self, arg1):\n" +" ...\n" +" @classmethod\n" +" @abstractmethod\n" +" def my_abstract_classmethod(cls, arg2):\n" +" ...\n" +" @staticmethod\n" +" @abstractmethod\n" +" def my_abstract_staticmethod(arg3):\n" +" ...\n" +"\n" +" @property\n" +" @abstractmethod\n" +" def my_abstract_property(self):\n" +" ...\n" +" @my_abstract_property.setter\n" +" @abstractmethod\n" +" def my_abstract_property(self, val):\n" +" ...\n" +"\n" +" @abstractmethod\n" +" def _get_x(self):\n" +" ...\n" +" @abstractmethod\n" +" def _set_x(self, val):\n" +" ...\n" +" x = property(_get_x, _set_x)" +msgstr "" +"class C(ABC):\n" +" @abstractmethod\n" +" def my_abstract_method(self, arg1):\n" +" ...\n" +" @classmethod\n" +" @abstractmethod\n" +" def my_abstract_classmethod(cls, arg2):\n" +" ...\n" +" @staticmethod\n" +" @abstractmethod\n" +" def my_abstract_staticmethod(arg3):\n" +" ...\n" +"\n" +" @property\n" +" @abstractmethod\n" +" def my_abstract_property(self):\n" +" ...\n" +" @my_abstract_property.setter\n" +" @abstractmethod\n" +" def my_abstract_property(self, val):\n" +" ...\n" +"\n" +" @abstractmethod\n" +" def _get_x(self):\n" +" ...\n" +" @abstractmethod\n" +" def _set_x(self, val):\n" +" ...\n" +" x = property(_get_x, _set_x)" + +#: ../../library/abc.rst:217 +msgid "" +"In order to correctly interoperate with the abstract base class machinery, " +"the descriptor must identify itself as abstract using " +":attr:`!__isabstractmethod__`. In general, this attribute should be ``True``" +" if any of the methods used to compose the descriptor are abstract. For " +"example, Python's built-in :class:`property` does the equivalent of::" +msgstr "" +"为了正确地与抽象基类机制互操作,描述器必须使用 :attr:`!__isabstractmethod__` 将自身标识为抽象的。 " +"通常,如果组成描述器的任一方法是抽象的,那么此属性就应为 ``True``。例如,Python 的内置 :class:`property` " +"所做的就等价于::" + +#: ../../library/abc.rst:223 +msgid "" +"class Descriptor:\n" +" ...\n" +" @property\n" +" def __isabstractmethod__(self):\n" +" return any(getattr(f, '__isabstractmethod__', False) for\n" +" f in (self._fget, self._fset, self._fdel))" +msgstr "" +"class Descriptor:\n" +" ...\n" +" @property\n" +" def __isabstractmethod__(self):\n" +" return any(getattr(f, '__isabstractmethod__', False) for\n" +" f in (self._fget, self._fset, self._fdel))" + +#: ../../library/abc.rst:232 +msgid "" +"Unlike Java abstract methods, these abstract methods may have an " +"implementation. This implementation can be called via the :func:`super` " +"mechanism from the class that overrides it. This could be useful as an end-" +"point for a super-call in a framework that uses cooperative multiple-" +"inheritance." +msgstr "" +"不同于 Java 抽象方法,这些抽象方法可能具有一个实现。这个实现可在重写它的类上通过 :func:`super` 机制来调用。 " +"这在使用协作多重继承的框架中可以被用作 super 调用的一个终点。" + +#: ../../library/abc.rst:239 +msgid "The :mod:`!abc` module also supports the following legacy decorators:" +msgstr ":mod:`!abc` 模块还支持下列旧式装饰器:" + +#: ../../library/abc.rst:244 +msgid "" +"It is now possible to use :class:`classmethod` with :func:`abstractmethod`, " +"making this decorator redundant." +msgstr "现在可以让 :class:`classmethod` 配合 :func:`abstractmethod` 使用,使得此装饰器变得冗余。" + +#: ../../library/abc.rst:248 +msgid "" +"A subclass of the built-in :func:`classmethod`, indicating an abstract " +"classmethod. Otherwise it is similar to :func:`abstractmethod`." +msgstr "" +"内置 :func:`classmethod` 的子类,指明一个抽象类方法。在其他方面它都类似于 :func:`abstractmethod`。" + +#: ../../library/abc.rst:251 +msgid "" +"This special case is deprecated, as the :func:`classmethod` decorator is now" +" correctly identified as abstract when applied to an abstract method::" +msgstr "这个特例已被弃用,因为现在当 :func:`classmethod` 装饰器应用于抽象方法时它会被正确地标识为抽象的::" + +#: ../../library/abc.rst:255 +msgid "" +"class C(ABC):\n" +" @classmethod\n" +" @abstractmethod\n" +" def my_abstract_classmethod(cls, arg):\n" +" ..." +msgstr "" +"class C(ABC):\n" +" @classmethod\n" +" @abstractmethod\n" +" def my_abstract_classmethod(cls, arg):\n" +" ..." + +#: ../../library/abc.rst:265 +msgid "" +"It is now possible to use :class:`staticmethod` with :func:`abstractmethod`," +" making this decorator redundant." +msgstr "现在可以让 :class:`staticmethod` 配合 :func:`abstractmethod` 使用,使得此装饰器变得冗余。" + +#: ../../library/abc.rst:269 +msgid "" +"A subclass of the built-in :func:`staticmethod`, indicating an abstract " +"staticmethod. Otherwise it is similar to :func:`abstractmethod`." +msgstr "" +"内置 :func:`staticmethod` 的子类,指明一个抽象静态方法。在其他方面它都类似于 :func:`abstractmethod`。" + +#: ../../library/abc.rst:272 +msgid "" +"This special case is deprecated, as the :func:`staticmethod` decorator is " +"now correctly identified as abstract when applied to an abstract method::" +msgstr "这个特例已被弃用,因为现在当 :func:`staticmethod` 装饰器应用于抽象方法时它会被正确地标识为抽象的::" + +#: ../../library/abc.rst:276 +msgid "" +"class C(ABC):\n" +" @staticmethod\n" +" @abstractmethod\n" +" def my_abstract_staticmethod(arg):\n" +" ..." +msgstr "" +"class C(ABC):\n" +" @staticmethod\n" +" @abstractmethod\n" +" def my_abstract_staticmethod(arg):\n" +" ..." + +#: ../../library/abc.rst:285 +msgid "" +"It is now possible to use :class:`property`, :meth:`property.getter`, " +":meth:`property.setter` and :meth:`property.deleter` with " +":func:`abstractmethod`, making this decorator redundant." +msgstr "" +"现在可以让 :class:`property`, :meth:`property.getter`, :meth:`property.setter` 和 " +":meth:`property.deleter` 配合 :func:`abstractmethod` 使用,使得此装饰器变得冗余。" + +#: ../../library/abc.rst:290 +msgid "" +"A subclass of the built-in :func:`property`, indicating an abstract " +"property." +msgstr "内置 :func:`property` 的子类,指明一个抽象特性属性。" + +#: ../../library/abc.rst:293 +msgid "" +"This special case is deprecated, as the :func:`property` decorator is now " +"correctly identified as abstract when applied to an abstract method::" +msgstr "这个特例已被弃用,因为现在当 :func:`property` 装饰器应用于抽象方法时它会被正确地标识为抽象的::" + +#: ../../library/abc.rst:297 +msgid "" +"class C(ABC):\n" +" @property\n" +" @abstractmethod\n" +" def my_abstract_property(self):\n" +" ..." +msgstr "" +"class C(ABC):\n" +" @property\n" +" @abstractmethod\n" +" def my_abstract_property(self):\n" +" ..." + +#: ../../library/abc.rst:303 +msgid "" +"The above example defines a read-only property; you can also define a read-" +"write abstract property by appropriately marking one or more of the " +"underlying methods as abstract::" +msgstr "上面的例子定义了一个只读特征属性;你也可以通过适当地将一个或多个下层方法标记为抽象的来定义可读写的抽象特征属性::" + +#: ../../library/abc.rst:307 +msgid "" +"class C(ABC):\n" +" @property\n" +" def x(self):\n" +" ...\n" +"\n" +" @x.setter\n" +" @abstractmethod\n" +" def x(self, val):\n" +" ..." +msgstr "" +"class C(ABC):\n" +" @property\n" +" def x(self):\n" +" ...\n" +"\n" +" @x.setter\n" +" @abstractmethod\n" +" def x(self, val):\n" +" ..." + +#: ../../library/abc.rst:317 +msgid "" +"If only some components are abstract, only those components need to be " +"updated to create a concrete property in a subclass::" +msgstr "如果只有某些组件是抽象的,则只需更新那些组件即可在子类中创建具体的特征属性::" + +#: ../../library/abc.rst:320 +msgid "" +"class D(C):\n" +" @C.x.setter\n" +" def x(self, val):\n" +" ..." +msgstr "" +"class D(C):\n" +" @C.x.setter\n" +" def x(self, val):\n" +" ..." + +#: ../../library/abc.rst:326 +msgid "The :mod:`!abc` module also provides the following functions:" +msgstr ":mod:`!abc` 模块还提供了下列函数:" + +#: ../../library/abc.rst:330 +msgid "Returns the current abstract base class cache token." +msgstr "返回当前抽象基类的缓存令牌。" + +#: ../../library/abc.rst:332 +msgid "" +"The token is an opaque object (that supports equality testing) identifying " +"the current version of the abstract base class cache for virtual subclasses." +" The token changes with every call to :meth:`ABCMeta.register` on any ABC." +msgstr "" +"此令牌是一个不透明对象(支持相等性测试),用于为虚子类标识抽象基类缓存的当前版本。此令牌会在任何 ABC 上每次调用 " +":meth:`ABCMeta.register` 时发生更改。" + +#: ../../library/abc.rst:340 +msgid "" +"A function to recalculate an abstract class's abstraction status. This " +"function should be called if a class's abstract methods have been " +"implemented or changed after it was created. Usually, this function should " +"be called from within a class decorator." +msgstr "" +"重新计算一个抽象类的抽象状态的函数。如果一个类的抽象方法在类被创建后被实现或被修改则应当调用此函数。通常,此函数应当在一个类装饰器内部被调用。" + +#: ../../library/abc.rst:345 +msgid "Returns *cls*, to allow usage as a class decorator." +msgstr "返回 *cls*,使其能够用作类装饰器。" + +#: ../../library/abc.rst:347 +msgid "If *cls* is not an instance of :class:`ABCMeta`, does nothing." +msgstr "如果 *cls* 不是 :class:`ABCMeta` 的实例,则不做任何操作。" + +#: ../../library/abc.rst:351 +msgid "" +"This function assumes that *cls*'s superclasses are already updated. It does" +" not update any subclasses." +msgstr "此函数会假定 *cls* 的上级类已经被更新。它不会更新任何子类。" + +#: ../../library/abc.rst:357 +msgid "Footnotes" +msgstr "脚注" + +#: ../../library/abc.rst:358 +msgid "" +"C++ programmers should note that Python's virtual base class concept is not " +"the same as C++'s." +msgstr "C++ 程序员需要注意:Python 中虚基类的概念和 C++ 中的并不相同。" diff --git a/library/aifc.po b/library/aifc.po new file mode 100644 index 0000000000..abe35f1b03 --- /dev/null +++ b/library/aifc.po @@ -0,0 +1,43 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/aifc.rst:2 +msgid ":mod:`!aifc` --- Read and write AIFF and AIFC files" +msgstr ":mod:`!aifc` --- 读写 AIFF 和 AIFC 文件" + +#: ../../library/aifc.rst:10 +msgid "" +"This module is no longer part of the Python standard library. It was " +":ref:`removed in Python 3.13 ` after being deprecated in" +" Python 3.11. The removal was decided in :pep:`594`." +msgstr "" +"此模块已不再是 Python 标准库的一部分。它在 Python 3.11 中被弃用后又在 :ref:`Python 3.13 中被移除 " +"`。移除计划是在 :pep:`594` 确定的。" + +#: ../../library/aifc.rst:14 +msgid "" +"The last version of Python that provided the :mod:`!aifc` module was `Python" +" 3.12 `_." +msgstr "" +"提供 :mod:`!aifc` 模块的最后一个 Python 版本是 `Python 3.12 " +"`_." diff --git a/library/allos.po b/library/allos.po new file mode 100644 index 0000000000..e2e04d9b39 --- /dev/null +++ b/library/allos.po @@ -0,0 +1,37 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/allos.rst:5 +msgid "Generic Operating System Services" +msgstr "通用操作系统服务" + +#: ../../library/allos.rst:7 +msgid "" +"The modules described in this chapter provide interfaces to operating system" +" features that are available on (almost) all operating systems, such as " +"files and a clock. The interfaces are generally modeled after the Unix or C" +" interfaces, but they are available on most other systems as well. Here's " +"an overview:" +msgstr "" +"本章中描述的各模块提供了在(几乎)所有的操作系统上可用的操作系统特性的接口,例如文件和时钟。这些接口通常以 Unix 或 C " +"接口为参考对象,不过在大多数其他系统上也可用。这里有一个概述:" diff --git a/library/annotationlib.po b/library/annotationlib.po new file mode 100644 index 0000000000..d3cff5e845 --- /dev/null +++ b/library/annotationlib.po @@ -0,0 +1,1348 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-11 17:18+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/annotationlib.rst:2 +msgid ":mod:`!annotationlib` --- Functionality for introspecting annotations" +msgstr ":mod:`!annotationlib` --- 用于内省注解的功能" + +#: ../../library/annotationlib.rst:9 +msgid "**Source code:** :source:`Lib/annotationlib.py`" +msgstr "**源代码:** :source:`Lib/annotationlib.py`" + +#: ../../library/annotationlib.rst:18 +msgid "" +"The :mod:`!annotationlib` module provides tools for introspecting " +":term:`annotations ` on modules, classes, and functions." +msgstr ":mod:`!annotationlib` 模块提供了用于在模块、类和函数上内省 :term:`注解 ` 的工具。" + +#: ../../library/annotationlib.rst:21 +msgid "" +"Annotations are :ref:`lazily evaluated ` and often contain " +"forward references to objects that are not yet defined when the annotation " +"is created. This module provides a set of low-level tools that can be used " +"to retrieve annotations in a reliable way, even in the presence of forward " +"references and other edge cases." +msgstr "" +"类型注解是 :ref:`延迟求值 ` " +"的,并且通常包含对在注解创建时尚未定义的对象的前向引用。这个模块提供了一组底层工具,即使在存在前向引用和其他极端情况时,也能以可靠的方式获取注解。" + +#: ../../library/annotationlib.rst:26 +msgid "" +"This module supports retrieving annotations in three main formats (see " +":class:`Format`), each of which works best for different use cases:" +msgstr "该模块支持以三种主要格式 (见 :class:`Format`) 检索注解,每种格式适用于不同的使用场景:" + +#: ../../library/annotationlib.rst:29 +msgid "" +":attr:`~Format.VALUE` evaluates the annotations and returns their value. " +"This is most straightforward to work with, but it may raise errors, for " +"example if the annotations contain references to undefined names." +msgstr "" +":attr:`~Format.VALUE` 会对注解进行求值并返回其值。这种格式使用起来最直接,但可能会引发错误,例如当注解中包含对未定义名称的引用时。" + +#: ../../library/annotationlib.rst:32 +msgid "" +":attr:`~Format.FORWARDREF` returns :class:`ForwardRef` objects for " +"annotations that cannot be resolved, allowing you to inspect the annotations" +" without evaluating them. This is useful when you need to work with " +"annotations that may contain unresolved forward references." +msgstr "" +":attr:`~Format.FORWARDREF` 会为无法解析的注解返回 :class:`ForwardRef` " +"对象,允许你在不求值注解的情况下检查它们。当你需要处理可能包含未解析前向引用的注解时,这种格式非常有用。" + +#: ../../library/annotationlib.rst:36 +msgid "" +":attr:`~Format.STRING` returns the annotations as a string, similar to how " +"it would appear in the source file. This is useful for documentation " +"generators that want to display annotations in a readable way." +msgstr "" +":attr:`~Format.STRING` " +"会将注解以字符串形式返回,类似于其在源代码文件中的呈现方式。这对于希望以可读方式展示注解的文档生成器非常有用。" + +#: ../../library/annotationlib.rst:40 +msgid "" +"The :func:`get_annotations` function is the main entry point for retrieving " +"annotations. Given a function, class, or module, it returns an annotations " +"dictionary in the requested format. This module also provides functionality " +"for working directly with the :term:`annotate function` that is used to " +"evaluate annotations, such as :func:`get_annotate_from_class_namespace` and " +":func:`call_annotate_function`, as well as the " +":func:`call_evaluate_function` function for working with :term:`evaluate " +"functions `." +msgstr "" +":func:`get_annotations` " +"函数是检索注解的主要入口点。给定一个函数、类或模块,它会以请求的格式返回注解字典。此模块还提供了直接处理用于求值注解的 :term:`annotate " +"function` 的功能,例如 :func:`get_annotate_from_class_namespace` 和 " +":func:`call_annotate_function`,以及用于处理 :term:`求值函数 ` 的 " +":func:`call_evaluate_function` 函数。" + +#: ../../library/annotationlib.rst:51 +msgid "" +"Most functionality in this module can execute arbitrary code; see :ref:`the " +"security section ` for more information." +msgstr "此模块中的大多数功能都可执行任意代码;请参阅 :ref:`安全章节 ` 了解详情。" + +#: ../../library/annotationlib.rst:56 +msgid "" +":pep:`649` proposed the current model for how annotations work in Python." +msgstr ":pep:`649` 提出了 Python 中注解工作方式的当前模型。" + +#: ../../library/annotationlib.rst:58 +msgid "" +":pep:`749` expanded on various aspects of :pep:`649` and introduced the " +":mod:`!annotationlib` module." +msgstr ":pep:`749` 在 :pep:`649` 的基础上进行了多方面扩展,并引入了 :mod:`!annotationlib` 模块。" + +#: ../../library/annotationlib.rst:61 +msgid "" +":ref:`annotations-howto` provides best practices for working with " +"annotations." +msgstr ":ref:`annotations-howto` 提供了使用注解的最佳实践指南。" + +#: ../../library/annotationlib.rst:64 +msgid "" +":pypi:`typing-extensions` provides a backport of :func:`get_annotations` " +"that works on earlier versions of Python." +msgstr "" +":pypi:`typing-extensions` 提供了 :func:`get_annotations` 的向后移植版本,可在早期 Python " +"版本上使用。" + +#: ../../library/annotationlib.rst:68 +msgid "Annotation semantics" +msgstr "注解语义(Annotation semantics)" + +#: ../../library/annotationlib.rst:70 +msgid "" +"The way annotations are evaluated has changed over the history of Python 3, " +"and currently still depends on a :ref:`future import `. There have " +"been execution models for annotations:" +msgstr "" +"在 Python 3 的发展历程中,注解的求值方式发生了多次变化,目前仍依赖于 :ref:`future import " +"`。注解的执行模型主要有以下几种:" + +#: ../../library/annotationlib.rst:74 +msgid "" +"*Stock semantics* (default in Python 3.0 through 3.13; see :pep:`3107` and " +":pep:`526`): Annotations are evaluated eagerly, as they are encountered in " +"the source code." +msgstr "" +"*标准语义* (Python 3.0 至 3.13 的默认行为;参见 :pep:`3107` 和 " +":pep:`526`):注解会在源代码中被遇到时立即求值。" + +#: ../../library/annotationlib.rst:77 +msgid "" +"*Stringified annotations* (used with ``from __future__ import annotations`` " +"in Python 3.7 and newer; see :pep:`563`): Annotations are stored as strings " +"only." +msgstr "" +"*字符串化注解* (在 Python 3.7 及更高版本中使用 ``from __future__ import annotations`` 启用;参见" +" :pep:`563`):注解仅以字符串形式存储。" + +#: ../../library/annotationlib.rst:80 +msgid "" +"*Deferred evaluation* (default in Python 3.14 and newer; see :pep:`649` and " +":pep:`749`): Annotations are evaluated lazily, only when they are accessed." +msgstr "" +"*延迟求值* (Python 3.14 及更高版本的默认行为;参见 :pep:`649` 和 " +":pep:`749`):注解会延迟求值,仅在被访问时才会进行。" + +#: ../../library/annotationlib.rst:83 +msgid "As an example, consider the following program::" +msgstr "举个例子,考虑以下程序::" + +#: ../../library/annotationlib.rst:85 +msgid "" +"def func(a: Cls) -> None:\n" +" print(a)\n" +"\n" +"class Cls: pass\n" +"\n" +"print(func.__annotations__)" +msgstr "" +"def func(a: Cls) -> None:\n" +" print(a)\n" +"\n" +"class Cls: pass\n" +"\n" +"print(func.__annotations__)" + +#: ../../library/annotationlib.rst:92 +msgid "This will behave as follows:" +msgstr "其行为如下:" + +#: ../../library/annotationlib.rst:94 +msgid "" +"Under stock semantics (Python 3.13 and earlier), it will throw a " +":exc:`NameError` at the line where ``func`` is defined, because ``Cls`` is " +"an undefined name at that point." +msgstr "" +"在标准语义(Python 3.13 及更早版本)下,程序会在定义 ``func`` 的行抛出 :exc:`NameError`,因为此时 ``Cls``" +" 是一个未定义的名称。" + +#: ../../library/annotationlib.rst:97 +msgid "" +"Under stringified annotations (if ``from __future__ import annotations`` is " +"used), it will print ``{'a': 'Cls', 'return': 'None'}``." +msgstr "" +"在字符串化注解 (使用 ``from __future__ import annotations``) 下,程序会打印 ``{'a': 'Cls', " +"'return': 'None'}``." + +#: ../../library/annotationlib.rst:99 +msgid "" +"Under deferred evaluation (Python 3.14 and later), it will print ``{'a': " +", 'return': None}``." +msgstr "" +"在延迟求值(Python 3.14 及更高版本)下,程序会打印 ``{'a': , 'return': None}``。" + +#: ../../library/annotationlib.rst:102 +msgid "" +"Stock semantics were used when function annotations were first introduced in" +" Python 3.0 (by :pep:`3107`) because this was the simplest, most obvious way" +" to implement annotations. The same execution model was used when variable " +"annotations were introduced in Python 3.6 (by :pep:`526`). However, stock " +"semantics caused problems when using annotations as type hints, such as a " +"need to refer to names that are not yet defined when the annotation is " +"encountered. In addition, there were performance problems with executing " +"annotations at module import time. Therefore, in Python 3.7, :pep:`563` " +"introduced the ability to store annotations as strings using the ``from " +"__future__ import annotations`` syntax. The plan at the time was to " +"eventually make this behavior the default, but a problem appeared: " +"stringified annotations are more difficult to process for those who " +"introspect annotations at runtime. An alternative proposal, :pep:`649`, " +"introduced the third execution model, deferred evaluation, and was " +"implemented in Python 3.14. Stringified annotations are still used if ``from" +" __future__ import annotations`` is present, but this behavior will " +"eventually be removed." +msgstr "" +"当 Python 3.0 通过 :pep:`3107` 首次引入函数注解时,采用标准语义是因为这是实现注解最简单、最直观的方式。Python 3.6 " +"通过 :pep:`526` " +"引入变量注解时,也使用了相同的执行模型。然而,标准语义在将注解用作类型提示时会引发问题,例如在遇到注解时需要引用尚未定义的名称。此外,在模块导入时执行注解还存在性能问题。因此,Python" +" 3.7 通过 :pep:`563` 引入了使用 ``from __future__ import annotations`` " +"语法将注解存储为字符串的功能。当时的计划是最终将这种行为设为默认,但出现了一个问题:对于在运行时内省注解的人来说,字符串化注解更难处理。另一个提案 " +":pep:`649` 引入了第三种执行模型——延迟求值,并在 Python 3.14 中实现。如果存在 ``from __future__ import" +" annotations``,仍然会使用字符串化注解,但这种行为最终会被移除。" + +#: ../../library/annotationlib.rst:121 +msgid "Classes" +msgstr "类" + +#: ../../library/annotationlib.rst:125 +msgid "" +"An :class:`~enum.IntEnum` describing the formats in which annotations can be" +" returned. Members of the enum, or their equivalent integer values, can be " +"passed to :func:`get_annotations` and other functions in this module, as " +"well as to :attr:`~object.__annotate__` functions." +msgstr "" +"一个 :class:`~enum.IntEnum` 枚举类,用于描述注解可以返回的格式。该枚举的成员或其等效整数值可传递给 " +":func:`get_annotations` 以及本模块中的其他函数,也可传递给 :attr:`~object.__annotate__` 函数。" + +#: ../../library/annotationlib.rst:133 +msgid "Values are the result of evaluating the annotation expressions." +msgstr "值是对注解表达式求值的结果。" + +#: ../../library/annotationlib.rst:138 +msgid "" +"Special value used to signal that an annotate function is being evaluated in" +" a special environment with fake globals. When passed this value, annotate " +"functions should either return the same value as for the " +":attr:`Format.VALUE` format, or raise :exc:`NotImplementedError` to signal " +"that they do not support execution in this environment. This format is only " +"used internally and should not be passed to the functions in this module." +msgstr "" +"特殊值,用于表示注解函数正在具有伪全局变量的特殊环境中求值。当传递此值时,注解函数应返回与 :attr:`Format.VALUE` " +"格式相同的值,或者抛出 :exc:`NotImplementedError` " +"以表示它们不支持在此环境中执行。此格式仅在内部使用,不应传递给本模块中的函数。" + +#: ../../library/annotationlib.rst:149 +msgid "" +"Values are real annotation values (as per :attr:`Format.VALUE` format) for " +"defined values, and :class:`ForwardRef` proxies for undefined values. Real " +"objects may contain references to :class:`ForwardRef` proxy objects." +msgstr "" +"对于已定义的值,使用真实的注解值(按照 :attr:`Format.VALUE` 格式);对于未定义的值,使用 :class:`ForwardRef` " +"代理。真实对象可能包含对 :class:`ForwardRef` 代理对象的引用。" + +#: ../../library/annotationlib.rst:157 +msgid "" +"Values are the text string of the annotation as it appears in the source " +"code, up to modifications including, but not restricted to, whitespace " +"normalizations and constant values optimizations." +msgstr "值是注解在源代码中显示的文本字符串,可能经过包括但不限于空白符规范化和常数值优化的修改。" + +#: ../../library/annotationlib.rst:161 +msgid "" +"The exact values of these strings may change in future versions of Python." +msgstr "这些字符串的确切值可能在未来的 Python 版本中发生变化。" + +#: ../../library/annotationlib.rst:167 +msgid "A proxy object for forward references in annotations." +msgstr "用于注解中前向引用的代理对象。" + +#: ../../library/annotationlib.rst:169 +msgid "" +"Instances of this class are returned when the :attr:`~Format.FORWARDREF` " +"format is used and annotations contain a name that cannot be resolved. This " +"can happen when a forward reference is used in an annotation, such as when a" +" class is referenced before it is defined." +msgstr "" +"当使用 :attr:`~Format.FORWARDREF` " +"格式且注解包含无法解析的名称时,将返回此类的实例。这种情况通常发生在注解中使用前向引用时,例如在类定义之前引用该类。" + +#: ../../library/annotationlib.rst:176 +msgid "" +"A string containing the code that was evaluated to produce the " +":class:`~ForwardRef`. The string may not be exactly equivalent to the " +"original source." +msgstr "一个包含生成 :class:`~ForwardRef` 所执行代码的字符串。该字符串可能与原始源代码不完全等同。" + +#: ../../library/annotationlib.rst:182 +msgid "Evaluate the forward reference, returning its value." +msgstr "对前向引用进行求值,返回其值。" + +#: ../../library/annotationlib.rst:184 +msgid "" +"If the *format* argument is :attr:`~Format.VALUE` (the default), this method" +" may throw an exception, such as :exc:`NameError`, if the forward reference " +"refers to a name that cannot be resolved. The arguments to this method can " +"be used to provide bindings for names that would otherwise be undefined. If " +"the *format* argument is :attr:`~Format.FORWARDREF`, the method will never " +"throw an exception, but may return a :class:`~ForwardRef` instance. For " +"example, if the forward reference object contains the code " +"``list[undefined]``, where ``undefined`` is a name that is not defined, " +"evaluating it with the :attr:`~Format.FORWARDREF` format will return " +"``list[ForwardRef('undefined')]``. If the *format* argument is " +":attr:`~Format.STRING`, the method will return " +":attr:`~ForwardRef.__forward_arg__`." +msgstr "" +"如果 *format* 参数为 :attr:`~Format.VALUE` (默认值),当此方法遇到无法解析的前向引用名称时,可能会抛出 " +":exc:`NameError` 等异常。该方法的参数可用于为那些原本未定义的名称提供绑定。如果 *format* 参数为 " +":attr:`~Format.FORWARDREF`,此方法绝不会抛出异常,但可能会返回一个 :class:`~ForwardRef` 实例。 " +"例如,当前向引用对象包含代码 ``list[undefined]``,其中 ``undefined`` 是一个未定义的名称,使用 " +":attr:`~Format.FORWARDREF` 格式对其求值将返回 ``list[ForwardRef('undefined')]``。如果 " +"*format* 参数为 :attr:`~Format.STRING`,此方法将返回 " +":attr:`~ForwardRef.__forward_arg__`." + +#: ../../library/annotationlib.rst:196 +msgid "" +"The *owner* parameter provides the preferred mechanism for passing scope " +"information to this method. The owner of a :class:`~ForwardRef` is the " +"object that contains the annotation from which the :class:`~ForwardRef` " +"derives, such as a module object, type object, or function object." +msgstr "" +"*owner* 形参提供了向此方法传递作用域信息的首选机制。:class:`~ForwardRef` 的所有者是包含该 " +":class:`~ForwardRef` 所源自的注解的对象,例如模块对象、类型对象或函数对象。" + +#: ../../library/annotationlib.rst:201 +msgid "" +"The *globals*, *locals*, and *type_params* parameters provide a more precise" +" mechanism for influencing the names that are available when the " +":class:`~ForwardRef` is evaluated. *globals* and *locals* are passed to " +":func:`eval`, representing the global and local namespaces in which the name" +" is evaluated. The *type_params* parameter is relevant for objects created " +"using the native syntax for :ref:`generic classes ` and " +":ref:`functions `. It is a tuple of :ref:`type parameters" +" ` that are in scope while the forward reference is being " +"evaluated. For example, if evaluating a :class:`~ForwardRef` retrieved from " +"an annotation found in the class namespace of a generic class ``C``, " +"*type_params* should be set to ``C.__type_params__``." +msgstr "" +"*globals*、*locals* 和 *type_params* 形参提供了一种更精确的机制,用于影响在求值 " +":class:`~ForwardRef` 时可用的名称。*globals* 和 *locals* 会传递给 " +":func:`eval`,表示求值该名称时的全局和局部命名空间。*type_params* 参数与使用原生语法创建的 :ref:`泛型类 " +"` 和 :ref:`函数 ` 对象相关。它是一个 :ref:`类型形参 " +"` 元组,表示在求值前向引用时的作用域内的类型参数。例如,如果要对从泛型类 ``C`` 的类命名空间中的注解获取的 " +":class:`~ForwardRef` 进行求值,*type_params* 应设置为 ``C.__type_params__``。" + +#: ../../library/annotationlib.rst:212 +msgid "" +":class:`~ForwardRef` instances returned by :func:`get_annotations` retain " +"references to information about the scope they originated from, so calling " +"this method with no further arguments may be sufficient to evaluate such " +"objects. :class:`~ForwardRef` instances created by other means may not have " +"any information about their scope, so passing arguments to this method may " +"be necessary to evaluate them successfully." +msgstr "" +"由 :func:`get_annotations` 返回的 :class:`~ForwardRef` " +"实例会保留其来源作用域的信息,因此调用此方法时无需传递额外参数即可对这些对象进行求值。而通过其他方式创建的 :class:`~ForwardRef` " +"实例可能不包含任何作用域信息,因此可能需要向此方法传递参数才能成功对其进行求值。" + +#: ../../library/annotationlib.rst:219 +msgid "" +"If no *owner*, *globals*, *locals*, or *type_params* are provided and the " +":class:`~ForwardRef` does not contain information about its origin, empty " +"globals and locals dictionaries are used." +msgstr "" +"如果未提供 *owner*、*globals*、*locals* 或 *type_params* 参数,并且 :class:`~ForwardRef` " +"不包含其来源信息,则会使用空的全局和局部字典。" + +#: ../../library/annotationlib.rst:227 +msgid "Functions" +msgstr "函数" + +#: ../../library/annotationlib.rst:231 +msgid "" +"Convert an annotations dict containing runtime values to a dict containing " +"only strings. If the values are not already strings, they are converted " +"using :func:`type_repr`. This is meant as a helper for user-provided " +"annotate functions that support the :attr:`~Format.STRING` format but do not" +" have access to the code creating the annotations." +msgstr "" +"将包含运行时值的注解字典转换为仅包含字符串的字典。如果值已经是字符串,则保持不变;否则,使用 :func:`type_repr` " +"进行转换。这是为用户提供的注解函数提供的辅助工具,这些函数支持 :attr:`~Format.STRING` 格式,但无法访问创建注解的代码。" + +#: ../../library/annotationlib.rst:238 +msgid "" +"For example, this is used to implement the :attr:`~Format.STRING` for " +":class:`typing.TypedDict` classes created through the functional syntax:" +msgstr "" +"例如,这用于为通过函数式语法创建的 :class:`typing.TypedDict` 类实现 :attr:`~Format.STRING` 格式:" + +#: ../../library/annotationlib.rst:241 +msgid "" +">>> from typing import TypedDict\n" +">>> Movie = TypedDict(\"movie\", {\"name\": str, \"year\": int})\n" +">>> get_annotations(Movie, format=Format.STRING)\n" +"{'name': 'str', 'year': 'int'}" +msgstr "" +">>> from typing import TypedDict\n" +">>> Movie = TypedDict(\"movie\", {\"name\": str, \"year\": int})\n" +">>> get_annotations(Movie, format=Format.STRING)\n" +"{'name': 'str', 'year': 'int'}" + +#: ../../library/annotationlib.rst:252 +msgid "" +"Call the :term:`annotate function` *annotate* with the given *format*, a " +"member of the :class:`Format` enum, and return the annotations dictionary " +"produced by the function." +msgstr "" +"使用给定的 *format* (:class:`Format` 枚举的成员) 调用 :term:`annotate function` " +"*annotate*,并返回该函数生成的注解字典。" + +#: ../../library/annotationlib.rst:256 +msgid "" +"This helper function is required because annotate functions generated by the" +" compiler for functions, classes, and modules only support the " +":attr:`~Format.VALUE` format when called directly. To support other formats," +" this function calls the annotate function in a special environment that " +"allows it to produce annotations in the other formats. This is a useful " +"building block when implementing functionality that needs to partially " +"evaluate annotations while a class is being constructed." +msgstr "" +"之所以需要这个辅助函数,是因为编译器为函数、类和模块生成的注解函数在直接调用时仅支持 :attr:`~Format.VALUE` " +"格式。为了支持其他格式,此函数会在一个特殊环境中调用注解函数,使其能够生成其他格式的注解。在实现需要在类构建过程中部分求值注解的功能时,这是一个有用的构建块。" + +#: ../../library/annotationlib.rst:265 +msgid "" +"*owner* is the object that owns the annotation function, usually a function," +" class, or module. If provided, it is used in the :attr:`~Format.FORWARDREF`" +" format to produce a :class:`ForwardRef` object that carries more " +"information." +msgstr "" +"*owner* 是拥有注解函数的对象,通常是函数、类或模块。如果提供了该参数,它会在 :attr:`~Format.FORWARDREF` " +"格式中用于生成一个携带更多信息的 :class:`ForwardRef` 对象。" + +#: ../../library/annotationlib.rst:272 +msgid "" +":PEP:`PEP 649 <649#the-stringizer-and-the-fake-globals-environment>` " +"contains an explanation of the implementation technique used by this " +"function." +msgstr "" +":PEP:`PEP 649 <649#the-stringizer-and-the-fake-globals-environment>` " +"中包含了对此函数所使用的实现技术的解释。" + +#: ../../library/annotationlib.rst:280 +msgid "" +"Call the :term:`evaluate function` *evaluate* with the given *format*, a " +"member of the :class:`Format` enum, and return the value produced by the " +"function. This is similar to :func:`call_annotate_function`, but the latter " +"always returns a dictionary mapping strings to annotations, while this " +"function returns a single value." +msgstr "" +"使用给定的 *format* (:class:`Format` 枚举的成员) 调用 :term:`evaluate function` " +"*evaluate*,并返回该函数生成的值。这与 :func:`call_annotate_function` " +"类似,但后者始终返回一个将字符串映射到注解的字典,而此函数返回单个值。" + +#: ../../library/annotationlib.rst:286 +msgid "" +"This is intended for use with the evaluate functions generated for lazily " +"evaluated elements related to type aliases and type parameters:" +msgstr "此功能旨在与为类型别名和类型参数相关的延迟求值元素生成的求值函数一起使用:" + +#: ../../library/annotationlib.rst:289 +msgid ":meth:`typing.TypeAliasType.evaluate_value`, the value of type aliases" +msgstr ":meth:`typing.TypeAliasType.evaluate_value`,类型别名的值" + +#: ../../library/annotationlib.rst:290 +msgid ":meth:`typing.TypeVar.evaluate_bound`, the bound of type variables" +msgstr ":meth:`typing.TypeVar.evaluate_bound`,类型变量的边界" + +#: ../../library/annotationlib.rst:291 +msgid "" +":meth:`typing.TypeVar.evaluate_constraints`, the constraints of type " +"variables" +msgstr ":meth:`typing.TypeVar.evaluate_constraints`,类型变量的约束" + +#: ../../library/annotationlib.rst:293 +msgid "" +":meth:`typing.TypeVar.evaluate_default`, the default value of type variables" +msgstr ":meth:`typing.TypeVar.evaluate_default`,类型变量的默认值" + +#: ../../library/annotationlib.rst:295 +msgid "" +":meth:`typing.ParamSpec.evaluate_default`, the default value of parameter " +"specifications" +msgstr ":meth:`typing.ParamSpec.evaluate_default`,形参规格的默认值" + +#: ../../library/annotationlib.rst:297 +msgid "" +":meth:`typing.TypeVarTuple.evaluate_default`, the default value of type " +"variable tuples" +msgstr ":meth:`typing.TypeVarTuple.evaluate_default`,类型变量元组的默认值" + +#: ../../library/annotationlib.rst:300 +msgid "" +"*owner* is the object that owns the evaluate function, such as the type " +"alias or type variable object." +msgstr "*owner* 是拥有求值函数的对象,例如类型别名或类型变量对象。" + +#: ../../library/annotationlib.rst:303 +msgid "" +"*format* can be used to control the format in which the value is returned:" +msgstr "*format* 可用于控制返回值的格式:" + +#: ../../library/annotationlib.rst:305 +msgid "" +">>> type Alias = undefined\n" +">>> call_evaluate_function(Alias.evaluate_value, Format.VALUE)\n" +"Traceback (most recent call last):\n" +"...\n" +"NameError: name 'undefined' is not defined\n" +">>> call_evaluate_function(Alias.evaluate_value, Format.FORWARDREF)\n" +"ForwardRef('undefined')\n" +">>> call_evaluate_function(Alias.evaluate_value, Format.STRING)\n" +"'undefined'" +msgstr "" +">>> type Alias = undefined\n" +">>> call_evaluate_function(Alias.evaluate_value, Format.VALUE)\n" +"Traceback (most recent call last):\n" +"...\n" +"NameError: name 'undefined' is not defined\n" +">>> call_evaluate_function(Alias.evaluate_value, Format.FORWARDREF)\n" +"ForwardRef('undefined')\n" +">>> call_evaluate_function(Alias.evaluate_value, Format.STRING)\n" +"'undefined'" + +#: ../../library/annotationlib.rst:321 +msgid "" +"Retrieve the :term:`annotate function` from a class namespace dictionary " +"*namespace*. Return :const:`!None` if the namespace does not contain an " +"annotate function. This is primarily useful before the class has been fully " +"created (e.g., in a metaclass); after the class exists, the annotate " +"function can be retrieved with ``cls.__annotate__``. See :ref:`below " +"` for an example using this function in a " +"metaclass." +msgstr "" +"从类命名空间字典 *namespace* 中检索 :term:`annotate function`。如果命名空间中不包含注解函数,则返回 " +":const:`!None`。这在类完全创建之前(例如在元类中)特别有用;类创建后,可以通过 ``cls.__annotate__`` " +"检索注解函数。有关在元类中使用此函数的示例,请参阅 :ref:`下文 `。" + +#: ../../library/annotationlib.rst:331 +msgid "Compute the annotations dict for an object." +msgstr "计算一个对象的注解字典。" + +#: ../../library/annotationlib.rst:333 +msgid "" +"*obj* may be a callable, class, module, or other object with " +":attr:`~object.__annotate__` or :attr:`~object.__annotations__` attributes. " +"Passing any other object raises :exc:`TypeError`." +msgstr "" +"*obj* 可以是可调用对象、类、模块或其他具有 :attr:`~object.__annotate__` 或 " +":attr:`~object.__annotations__` 属性的对象。传递任何其他对象会引发 :exc:`TypeError`。" + +#: ../../library/annotationlib.rst:337 +msgid "" +"The *format* parameter controls the format in which annotations are " +"returned, and must be a member of the :class:`Format` enum or its integer " +"equivalent. The different formats work as follows:" +msgstr "*format* 形参控制注解的返回格式,必须是 :class:`Format` 枚举的成员或其整数值。不同格式的工作方式如下:" + +#: ../../library/annotationlib.rst:341 +msgid "" +"VALUE: :attr:`!object.__annotations__` is tried first; if that does not " +"exist, the :attr:`!object.__annotate__` function is called if it exists." +msgstr "" +"VALUE: 首先尝试使用 :attr:`!object.__annotations__`;如果该属性不存在,则调用 " +":attr:`!object.__annotate__` 函数(如果存在)。" + +#: ../../library/annotationlib.rst:344 +msgid "" +"FORWARDREF: If :attr:`!object.__annotations__` exists and can be evaluated " +"successfully, it is used; otherwise, the :attr:`!object.__annotate__` " +"function is called. If it does not exist either, " +":attr:`!object.__annotations__` is tried again and any error from accessing " +"it is re-raised." +msgstr "" +"FORWARDREF: 如果 :attr:`!object.__annotations__` 存在且可以成功求值,则使用它;否则,调用 " +":attr:`!object.__annotate__` 函数。如果该函数也不存在,则再次尝试使用 " +":attr:`!object.__annotations__`,并重新引发访问它时发生的任何错误。" + +#: ../../library/annotationlib.rst:349 +msgid "" +"When calling :attr:`!object.__annotate__` it is first called with " +":attr:`~Format.FORWARDREF`. If this is not implemented, it will then check " +"if :attr:`~Format.VALUE_WITH_FAKE_GLOBALS` is supported and use that in the " +"fake globals environment. If neither of these formats are supported, it will" +" fall back to using :attr:`~Format.VALUE`. If :attr:`~Format.VALUE` fails, " +"the error from this call will be raised." +msgstr "" +"当调用 :attr:`!object.__annotate__` 时它会先附带 :attr:`~Format.FORWARDREF` 被调用。 " +"如果该属性未被实现,它将再检查 :attr:`~Format.VALUE_WITH_FAKE_GLOBALS` 是否受到支持并在伪全局环境中使用它。 " +"如果这些格式均不受支持,它将回退到使用 :attr:`~Format.VALUE`。如果 :attr:`~Format.VALUE` " +"失败,来自该调用的错误将被引发。" + +#: ../../library/annotationlib.rst:355 +msgid "" +"STRING: If :attr:`!object.__annotate__` exists, it is called first; " +"otherwise, :attr:`!object.__annotations__` is used and stringified using " +":func:`annotations_to_string`." +msgstr "" +"STRING: 如果 :attr:`!object.__annotate__` 存在,则首先调用它;否则,使用 " +":attr:`!object.__annotations__` 并使用 :func:`annotations_to_string` 进行字符串化。" + +#: ../../library/annotationlib.rst:359 +msgid "" +"When calling :attr:`!object.__annotate__` it is first called with " +":attr:`~Format.STRING`. If this is not implemented, it will then check if " +":attr:`~Format.VALUE_WITH_FAKE_GLOBALS` is supported and use that in the " +"fake globals environment. If neither of these formats are supported, it will" +" fall back to using :attr:`~Format.VALUE` with the result converted using " +":func:`annotations_to_string`. If :attr:`~Format.VALUE` fails, the error " +"from this call will be raised." +msgstr "" +"当调用 :attr:`!object.__annotate__` 时它会先附带 :attr:`~Format.STRING` 被调用。 " +"如果该属性未被实现,它将再检查 :attr:`~Format.VALUE_WITH_FAKE_GLOBALS` 是否受到支持并在伪全局环境中使用它。 " +"如果这些格式均不受支持,它将回退到使用 :attr:`~Format.VALUE` 并附带使用 " +":func:`annotations_to_string` 转换后的结果。如果 :attr:`~Format.VALUE` " +"失败,来自该调用的错误将被引发。" + +#: ../../library/annotationlib.rst:366 +msgid "" +"Returns a dict. :func:`!get_annotations` returns a new dict every time it's " +"called; calling it twice on the same object will return two different but " +"equivalent dicts." +msgstr "" +"返回一个字典。:func:`!get_annotations` 每次调用时都会返回一个新字典;对同一对象调用两次会返回两个不同但相等的字典。" + +#: ../../library/annotationlib.rst:370 +msgid "This function handles several details for you:" +msgstr "该函数帮助你处理若干细节:" + +#: ../../library/annotationlib.rst:372 +msgid "" +"If *eval_str* is true, values of type :class:`!str` will be un-stringized " +"using :func:`eval`. This is intended for use with stringized annotations " +"(``from __future__ import annotations``). It is an error to set *eval_str* " +"to true with formats other than :attr:`Format.VALUE`." +msgstr "" +"如果 *eval_str* 为 True,则会使用 :func:`eval` 对 :class:`!str` " +"类型的值进行反字符串化处理。这旨在配合字符串化的注解使用 (如 ``from __future__ import annotations``)。将 " +"*eval_str* 与 :attr:`Format.VALUE` 以外的格式一起设为 True 是错误的。" + +#: ../../library/annotationlib.rst:377 +msgid "" +"If *obj* doesn't have an annotations dict, returns an empty dict. (Functions" +" and methods always have an annotations dict; classes, modules, and other " +"types of callables may not.)" +msgstr "如果 *obj* 不包含注解字典,返回一个空字典。(函数和方法永远包含注解字典;类、模块和其他类型的可调用对象则可能没有。)" + +#: ../../library/annotationlib.rst:381 +msgid "" +"Ignores inherited annotations on classes, as well as annotations on " +"metaclasses. If a class doesn't have its own annotations dict, returns an " +"empty dict." +msgstr "忽略类上的继承注解以及元类上的注解。如果类没有自己的注解字典,则返回空字典。" + +#: ../../library/annotationlib.rst:384 +msgid "" +"All accesses to object members and dict values are done using ``getattr()`` " +"and ``dict.get()`` for safety." +msgstr "因安全原因,所有对于对象成员和字典值的访问将通过 ``getattr()`` 和 ``dict.get()`` 完成。" + +#: ../../library/annotationlib.rst:387 +msgid "" +"*eval_str* controls whether or not values of type :class:`!str` are replaced" +" with the result of calling :func:`eval` on those values:" +msgstr "*eval_str* 控制是否将 :class:`!str` 类型的值替换为对这些值调用 :func:`eval` 的结果:" + +#: ../../library/annotationlib.rst:390 +msgid "" +"If eval_str is true, :func:`eval` is called on values of type :class:`!str`." +" (Note that :func:`!get_annotations` doesn't catch exceptions; if " +":func:`eval` raises an exception, it will unwind the stack past the " +":func:`!get_annotations` call.)" +msgstr "" +"如果 eval_str 为 true,则会对 :class:`!str` 类型的值调用 :func:`eval`。(注意 " +":func:`!get_annotations` 不会捕获异常;如果 :func:`eval` 引发异常,它将使堆栈展开到 " +":func:`!get_annotations` 调用之外。)" + +#: ../../library/annotationlib.rst:394 +msgid "" +"If *eval_str* is false (the default), values of type :class:`!str` are " +"unchanged." +msgstr "如果 *eval_str* 为 false(默认值),则 :class:`!str` 类型的值保持不变。" + +#: ../../library/annotationlib.rst:397 +msgid "" +"*globals* and *locals* are passed in to :func:`eval`; see the documentation " +"for :func:`eval` for more information. If *globals* or *locals* is " +":const:`!None`, this function may replace that value with a context-specific" +" default, contingent on ``type(obj)``:" +msgstr "" +"*globals* 和 *locals* 会被传递给 :func:`eval`;更多信息请参阅 :func:`eval` 的文档。如果 " +"*globals* 或 *locals* 为 :const:`!None`,此函数可能会根据 ``type(obj)`` " +"用特定于上下文的默认值替换该值:" + +#: ../../library/annotationlib.rst:402 +msgid "If *obj* is a module, *globals* defaults to ``obj.__dict__``." +msgstr "如果 *obj* 是一个模块,*globals* 默认使用 ``obj.__dict__``。" + +#: ../../library/annotationlib.rst:403 +msgid "" +"If *obj* is a class, *globals* defaults to " +"``sys.modules[obj.__module__].__dict__`` and *locals* defaults to the *obj* " +"class namespace." +msgstr "" +"如果 *obj* 是一个类,*globals* 默认使用 ``sys.modules[obj.__module__].__dict__``,而 " +"*locals* 默认使用 *obj* 类的命名空间。" + +#: ../../library/annotationlib.rst:406 +msgid "" +"If *obj* is a callable, *globals* defaults to :attr:`obj.__globals__ " +"`, although if *obj* is a wrapped function (using " +":func:`functools.update_wrapper`) or a :class:`functools.partial` object, it" +" is unwrapped until a non-wrapped function is found." +msgstr "" +"如果 *obj* 是一个可调用对象,*globals* 默认使用 :attr:`obj.__globals__ " +"`,不过如果 *obj* 是一个包装函数 (使用 " +":func:`functools.update_wrapper`) 或 :class:`functools.partial` " +"对象,则会对其进行解包,直到找到一个未被包装的函数为止。" + +#: ../../library/annotationlib.rst:412 +msgid "" +"Calling :func:`!get_annotations` is best practice for accessing the " +"annotations dict of any object. See :ref:`annotations-howto` for more " +"information on annotations best practices." +msgstr "" +"调用 :func:`!get_annotations` 是访问任何对象的注解字典的最佳实践。有关注解最佳实践的更多信息,请参阅 " +":ref:`annotations-howto`." + +#: ../../library/annotationlib.rst:416 +msgid "" +">>> def f(a: int, b: str) -> float:\n" +"... pass\n" +">>> get_annotations(f)\n" +"{'a': , 'b': , 'return': }" +msgstr "" +">>> def f(a: int, b: str) -> float:\n" +"... pass\n" +">>> get_annotations(f)\n" +"{'a': , 'b': , 'return': }" + +#: ../../library/annotationlib.rst:427 +msgid "" +"Convert an arbitrary Python value to a format suitable for use by the " +":attr:`~Format.STRING` format. This calls :func:`repr` for most objects, but" +" has special handling for some objects, such as type objects." +msgstr "" +"将任意 Python 值转换为适合 :attr:`~Format.STRING` 格式使用的形式。对于大多数对象,这会调用 " +":func:`repr`,但对某些对象(如类型对象)有特殊处理。" + +#: ../../library/annotationlib.rst:431 +msgid "" +"This is meant as a helper for user-provided annotate functions that support " +"the :attr:`~Format.STRING` format but do not have access to the code " +"creating the annotations. It can also be used to provide a user-friendly " +"string representation for other objects that contain values that are " +"commonly encountered in annotations." +msgstr "" +"这旨在作为用户提供的注解函数的辅助工具,这些函数支持 :attr:`~Format.STRING` " +"格式,但无法访问创建注解的代码。它还可以用于为包含在注解中常见的值的其他对象提供用户友好的字符串表示。" + +#: ../../library/annotationlib.rst:441 +msgid "Recipes" +msgstr "例程" + +#: ../../library/annotationlib.rst:446 +msgid "Using annotations in a metaclass" +msgstr "在元类中使用注解" + +#: ../../library/annotationlib.rst:448 +msgid "" +"A :ref:`metaclass ` may want to inspect or even modify the " +"annotations in a class body during class creation. Doing so requires " +"retrieving annotations from the class namespace dictionary. For classes " +"created with ``from __future__ import annotations``, the annotations will be" +" in the ``__annotations__`` key of the dictionary. For other classes with " +"annotations, :func:`get_annotate_from_class_namespace` can be used to get " +"the annotate function, and :func:`call_annotate_function` can be used to " +"call it and retrieve the annotations. Using the :attr:`~Format.FORWARDREF` " +"format will usually be best, because this allows the annotations to refer to" +" names that cannot yet be resolved when the class is created." +msgstr "" +":ref:`元类 ` 可能需要在类创建过程中检查甚至修改类体中的注解。实现这一需求需要从类命名空间字典中获取注解。对于使用 " +"``from __future__ import annotations`` 创建的类,注解会存储在字典的 ``__annotations__`` " +"键中。而对于其他带有注解的类,可以通过 :func:`get_annotate_from_class_namespace` 获取注解函数,再使用 " +":func:`call_annotate_function` 调用该函数来获取注解。通常建议优先使用 " +":attr:`~Format.FORWARDREF` 格式,因为这种格式允许注解引用在类创建时尚未解析的名称。" + +#: ../../library/annotationlib.rst:459 +msgid "" +"To modify the annotations, it is best to create a wrapper annotate function " +"that calls the original annotate function, makes any necessary adjustments, " +"and returns the result." +msgstr "要修改注解,最好创建一个包装注解函数,该函数调用原始注解函数,进行必要的调整,并返回结果。" + +#: ../../library/annotationlib.rst:463 +msgid "" +"Below is an example of a metaclass that filters out all " +":class:`typing.ClassVar` annotations from the class and puts them in a " +"separate attribute:" +msgstr "下面是一个元类的示例,该元类从类中过滤掉所有 :class:`typing.ClassVar` 注解,并将它们放入单独的属性中:" + +#: ../../library/annotationlib.rst:466 +msgid "" +"import annotationlib\n" +"import typing\n" +"\n" +"class ClassVarSeparator(type):\n" +" def __new__(mcls, name, bases, ns):\n" +" if \"__annotations__\" in ns: # from __future__ import annotations\n" +" annotations = ns[\"__annotations__\"]\n" +" classvar_keys = {\n" +" key for key, value in annotations.items()\n" +" # Use string comparison for simplicity; a more robust solution\n" +" # could use annotationlib.ForwardRef.evaluate\n" +" if value.startswith(\"ClassVar\")\n" +" }\n" +" classvars = {key: annotations[key] for key in classvar_keys}\n" +" ns[\"__annotations__\"] = {\n" +" key: value for key, value in annotations.items()\n" +" if key not in classvar_keys\n" +" }\n" +" wrapped_annotate = None\n" +" elif annotate := annotationlib.get_annotate_from_class_namespace(ns):\n" +" annotations = annotationlib.call_annotate_function(\n" +" annotate, format=annotationlib.Format.FORWARDREF\n" +" )\n" +" classvar_keys = {\n" +" key for key, value in annotations.items()\n" +" if typing.get_origin(value) is typing.ClassVar\n" +" }\n" +" classvars = {key: annotations[key] for key in classvar_keys}\n" +"\n" +" def wrapped_annotate(format):\n" +" annos = annotationlib.call_annotate_function(annotate, format, owner=typ)\n" +" return {key: value for key, value in annos.items() if key not in classvar_keys}\n" +"\n" +" else: # no annotations\n" +" classvars = {}\n" +" wrapped_annotate = None\n" +" typ = super().__new__(mcls, name, bases, ns)\n" +"\n" +" if wrapped_annotate is not None:\n" +" # Wrap the original __annotate__ with a wrapper that removes ClassVars\n" +" typ.__annotate__ = wrapped_annotate\n" +" typ.classvars = classvars # Store the ClassVars in a separate attribute\n" +" return typ" +msgstr "" +"import annotationlib\n" +"import typing\n" +"\n" +"class ClassVarSeparator(type):\n" +" def __new__(mcls, name, bases, ns):\n" +" if \"__annotations__\" in ns: # from __future__ import annotations\n" +" annotations = ns[\"__annotations__\"]\n" +" classvar_keys = {\n" +" key for key, value in annotations.items()\n" +" # 为了简单起见,可以使用字符串比较;更稳健的解决方案\n" +" # 可以使用 annotationlib.ForwardRef.evaluate。\n" +" if value.startswith(\"ClassVar\")\n" +" }\n" +" classvars = {key: annotations[key] for key in classvar_keys}\n" +" ns[\"__annotations__\"] = {\n" +" key: value for key, value in annotations.items()\n" +" if key not in classvar_keys\n" +" }\n" +" wrapped_annotate = None\n" +" elif annotate := annotationlib.get_annotate_from_class_namespace(ns):\n" +" annotations = annotationlib.call_annotate_function(\n" +" annotate, format=annotationlib.Format.FORWARDREF\n" +" )\n" +" classvar_keys = {\n" +" key for key, value in annotations.items()\n" +" if typing.get_origin(value) is typing.ClassVar\n" +" }\n" +" classvars = {key: annotations[key] for key in classvar_keys}\n" +"\n" +" def wrapped_annotate(format):\n" +" annos = annotationlib.call_annotate_function(annotate, format, owner=typ)\n" +" return {key: value for key, value in annos.items() if key not in classvar_keys}\n" +"\n" +" else: # 没有注解\n" +" classvars = {}\n" +" wrapped_annotate = None\n" +" typ = super().__new__(mcls, name, bases, ns)\n" +"\n" +" if wrapped_annotate is not None:\n" +" # 将原始的 __annotate__ 函数用一个包装器包裹起来,该包装器会移除 ClassVars。\n" +" typ.__annotate__ = wrapped_annotate\n" +" typ.classvars = classvars # 将 ClassVars 存储在一个单独的属性中。\n" +" return typ" + +#: ../../library/annotationlib.rst:514 +msgid "Creating a custom callable annotate function" +msgstr "" + +#: ../../library/annotationlib.rst:516 +msgid "" +"Custom :term:`annotate functions ` may be literal " +"functions like those automatically generated for functions, classes, and " +"modules. Or, they may wish to utilise the encapsulation provided by classes," +" in which case any :term:`callable` can be used as an :term:`annotate " +"function`." +msgstr "" + +#: ../../library/annotationlib.rst:521 +msgid "" +"To provide the :attr:`~Format.VALUE`, :attr:`~Format.STRING`, or " +":attr:`~Format.FORWARDREF` formats directly, an :term:`annotate function` " +"must provide the following attribute:" +msgstr "" + +#: ../../library/annotationlib.rst:525 +msgid "" +"A callable ``__call__`` with signature ``__call__(format, /) -> dict``, that" +" does not raise a :exc:`NotImplementedError` when called with a supported " +"format." +msgstr "" + +#: ../../library/annotationlib.rst:528 +msgid "" +"To provide the :attr:`~Format.VALUE_WITH_FAKE_GLOBALS` format, which is used" +" to automatically generate :attr:`~Format.STRING` or " +":attr:`~Format.FORWARDREF` if they are not supported directly, " +":term:`annotate functions ` must provide the following " +"attributes:" +msgstr "" + +#: ../../library/annotationlib.rst:533 +msgid "" +"A callable ``__call__`` with signature ``__call__(format, /) -> dict``, that" +" does not raise a :exc:`NotImplementedError` when called with " +":attr:`~Format.VALUE_WITH_FAKE_GLOBALS`." +msgstr "" + +#: ../../library/annotationlib.rst:536 +msgid "" +"A :ref:`code object ` ``__code__`` containing the compiled " +"code for the annotate function." +msgstr "" + +#: ../../library/annotationlib.rst:538 +msgid "" +"Optional: A tuple of the function's positional defaults ``__kwdefaults__``, " +"if the function represented by ``__code__`` uses any positional defaults." +msgstr "" + +#: ../../library/annotationlib.rst:540 +msgid "" +"Optional: A dict of the function's keyword defaults ``__defaults__``, if the" +" function represented by ``__code__`` uses any keyword defaults." +msgstr "" + +#: ../../library/annotationlib.rst:542 +msgid "Optional: All other :ref:`function attributes `." +msgstr "" + +#: ../../library/annotationlib.rst:544 +msgid "" +"class Annotate:\n" +" called_formats = []\n" +"\n" +" def __call__(self, format=None, /, *, _self=None):\n" +" # When called with fake globals, `_self` will be the\n" +" # actual self value, and `self` will be the format.\n" +" if _self is not None:\n" +" self, format = _self, self\n" +"\n" +" self.called_formats.append(format)\n" +" if format <= 2: # VALUE or VALUE_WITH_FAKE_GLOBALS\n" +" return {\"x\": MyType}\n" +" raise NotImplementedError\n" +"\n" +" __code__ = __call__.__code__\n" +" __defaults__ = (None,)\n" +" __kwdefaults__ = property(lambda self: dict(_self=self))\n" +"\n" +" __globals__ = {}\n" +" __builtins__ = {}\n" +" __closure__ = None" +msgstr "" + +#: ../../library/annotationlib.rst:568 +msgid "This can then be called with:" +msgstr "" + +#: ../../library/annotationlib.rst:570 +msgid "" +">>> from annotationlib import call_annotate_function, Format\n" +">>> call_annotate_function(Annotate(), format=Format.STRING)\n" +"{'x': 'MyType'}" +msgstr "" + +#: ../../library/annotationlib.rst:576 +msgid "Or used as the annotate function for an object:" +msgstr "" + +#: ../../library/annotationlib.rst:578 +msgid "" +">>> from annotationlib import get_annotations, Format\n" +">>> class C:\n" +"... pass\n" +">>> C.__annotate__ = Annotate()\n" +">>> get_annotations(Annotate(), format=Format.STRING)\n" +"{'x': 'MyType'}" +msgstr "" + +#: ../../library/annotationlib.rst:589 +msgid "Limitations of the ``STRING`` format" +msgstr "``STRING`` 格式的局限性" + +#: ../../library/annotationlib.rst:591 +msgid "" +"The :attr:`~Format.STRING` format is meant to approximate the source code of" +" the annotation, but the implementation strategy used means that it is not " +"always possible to recover the exact source code." +msgstr "" +":attr:`~Format.STRING` 格式的设计初衷是尽可能还原注解的源代码形式,但由于采用的实现策略限制,它并不总能精确恢复原始的源代码。" + +#: ../../library/annotationlib.rst:595 +msgid "" +"First, the stringifier of course cannot recover any information that is not " +"present in the compiled code, including comments, whitespace, " +"parenthesization, and operations that get simplified by the compiler." +msgstr "首先,字符串化器显然无法恢复编译后代码中不存在的任何信息,包括注释、空白符、括号结构以及被编译器简化的操作。" + +#: ../../library/annotationlib.rst:599 +msgid "" +"Second, the stringifier can intercept almost all operations that involve " +"names looked up in some scope, but it cannot intercept operations that " +"operate fully on constants. As a corollary, this also means it is not safe " +"to request the ``STRING`` format on untrusted code: Python is powerful " +"enough that it is possible to achieve arbitrary code execution even with no " +"access to any globals or builtins. For example:" +msgstr "" +"其次,字符串化器几乎可以拦截所有涉及在某个作用域中查找名称的操作,但它无法拦截完全基于常量的操作。由此推论,这也意味着在不可信代码上请求 " +"``STRING`` 格式是不安全的:Python 功能强大,即使没有访问任何全局变量或内置函数,也有可能实现任意代码执行。例如:" + +#: ../../library/annotationlib.rst:605 +msgid "" +">>> def f(x: (1).__class__.__base__.__subclasses__()[-1].__init__.__builtins__[\"print\"](\"Hello world\")): pass\n" +"...\n" +">>> annotationlib.get_annotations(f, format=annotationlib.Format.STRING)\n" +"Hello world\n" +"{'x': 'None'}" +msgstr "" +">>> def f(x: (1).__class__.__base__.__subclasses__()[-1].__init__.__builtins__[\"print\"](\"Hello world\")): pass\n" +"...\n" +">>> annotationlib.get_annotations(f, format=annotationlib.Format.STRING)\n" +"Hello world\n" +"{'x': 'None'}" + +#: ../../library/annotationlib.rst:614 +msgid "" +"This particular example works as of the time of writing, but it relies on " +"implementation details and is not guaranteed to work in the future." +msgstr "此特定示例在撰写本文时能够正常工作,但它依赖于实现细节,并不能保证在未来版本中仍然有效。" + +#: ../../library/annotationlib.rst:617 +msgid "" +"Among the different kinds of expressions that exist in Python, as " +"represented by the :mod:`ast` module, some expressions are supported, " +"meaning that the ``STRING`` format can generally recover the original source" +" code; others are unsupported, meaning that they may result in incorrect " +"output or an error." +msgstr "" +"在 Python 中存在的各种表达式中,由 :mod:`ast` 模块表示,有些表达式是被支持的,这意味着 ``STRING`` " +"格式通常可以恢复原始源代码;而另一些表达式则不被支持,这可能导致输出不正确或产生错误。" + +#: ../../library/annotationlib.rst:622 +msgid "The following are supported (sometimes with caveats):" +msgstr "以下类型是受支持的(有些带有额外说明):" + +#: ../../library/annotationlib.rst:624 +msgid ":class:`ast.BinOp`" +msgstr ":class:`ast.BinOp`" + +#: ../../library/annotationlib.rst:625 +msgid ":class:`ast.UnaryOp`" +msgstr ":class:`ast.UnaryOp`" + +#: ../../library/annotationlib.rst:627 +msgid "" +":class:`ast.Invert` (``~``), :class:`ast.UAdd` (``+``), and " +":class:`ast.USub` (``-``) are supported" +msgstr "" +":class:`ast.Invert` (``~``), :class:`ast.UAdd` (``+``) 和 :class:`ast.USub` " +"(``-``) 受支持" + +#: ../../library/annotationlib.rst:628 +msgid ":class:`ast.Not` (``not``) is not supported" +msgstr ":class:`ast.Not` (``not``) 不受支持" + +#: ../../library/annotationlib.rst:630 +msgid ":class:`ast.Dict` (except when using ``**`` unpacking)" +msgstr ":class:`ast.Dict` (当使用 ``**`` 解包时除外)" + +#: ../../library/annotationlib.rst:631 +msgid ":class:`ast.Set`" +msgstr ":class:`ast.Set`" + +#: ../../library/annotationlib.rst:632 +msgid ":class:`ast.Compare`" +msgstr ":class:`ast.Compare`" + +#: ../../library/annotationlib.rst:634 +msgid ":class:`ast.Eq` and :class:`ast.NotEq` are supported" +msgstr ":class:`ast.Eq` 和 :class:`ast.NotEq` 受支持" + +#: ../../library/annotationlib.rst:635 +msgid "" +":class:`ast.Lt`, :class:`ast.LtE`, :class:`ast.Gt`, and :class:`ast.GtE` are" +" supported, but the operand may be flipped" +msgstr "" +":class:`ast.Lt`, :class:`ast.LtE`, :class:`ast.Gt` 和 :class:`ast.GtE` " +"受支持,但操作数可能被交换" + +#: ../../library/annotationlib.rst:636 +msgid "" +":class:`ast.Is`, :class:`ast.IsNot`, :class:`ast.In`, and :class:`ast.NotIn`" +" are not supported" +msgstr "" +":class:`ast.Is`, :class:`ast.IsNot`, :class:`ast.In` 和 :class:`ast.NotIn` " +"不受支持" + +#: ../../library/annotationlib.rst:638 +msgid ":class:`ast.Call` (except when using ``**`` unpacking)" +msgstr ":class:`ast.Call` (当使用 ``**`` 解包时除外)" + +#: ../../library/annotationlib.rst:639 +msgid "" +":class:`ast.Constant` (though not the exact representation of the constant; " +"for example, escape sequences in strings are lost; hexadecimal numbers are " +"converted to decimal)" +msgstr ":class:`ast.Constant` (但不是常量的准确表示形式;例如,字符串形式的转义序列会丢失;十六进制数字会被转换为十进制)" + +#: ../../library/annotationlib.rst:641 +msgid ":class:`ast.Attribute` (assuming the value is not a constant)" +msgstr ":class:`ast.Attribute` (假定其值不为常量)" + +#: ../../library/annotationlib.rst:642 +msgid ":class:`ast.Subscript` (assuming the value is not a constant)" +msgstr ":class:`ast.Subscript` (假定其值不为常量)" + +#: ../../library/annotationlib.rst:643 +msgid ":class:`ast.Starred` (``*`` unpacking)" +msgstr ":class:`ast.Starred` (``*`` 解包)" + +#: ../../library/annotationlib.rst:644 +msgid ":class:`ast.Name`" +msgstr ":class:`ast.Name`" + +#: ../../library/annotationlib.rst:645 +msgid ":class:`ast.List`" +msgstr ":class:`ast.List`" + +#: ../../library/annotationlib.rst:646 +msgid ":class:`ast.Tuple`" +msgstr ":class:`ast.Tuple`" + +#: ../../library/annotationlib.rst:647 +msgid ":class:`ast.Slice`" +msgstr ":class:`ast.Slice`" + +#: ../../library/annotationlib.rst:649 +msgid "" +"The following are unsupported, but throw an informative error when " +"encountered by the stringifier:" +msgstr "以下表达式不被支持,但当字符串化器遇到它们时会抛出一个具有信息性的错误:" + +#: ../../library/annotationlib.rst:652 +msgid "" +":class:`ast.FormattedValue` (f-strings; error is not detected if conversion " +"specifiers like ``!r`` are used)" +msgstr ":class:`ast.FormattedValue` (f-字符串;如果使用了如 ``!r`` 这样的转换说明符,则不会检测到错误)" + +#: ../../library/annotationlib.rst:654 +msgid ":class:`ast.JoinedStr` (f-strings)" +msgstr ":class:`ast.JoinedStr` (f-字符串)" + +#: ../../library/annotationlib.rst:656 +msgid "The following are unsupported and result in incorrect output:" +msgstr "以下表达式不被支持,且会导致输出不正确:" + +#: ../../library/annotationlib.rst:658 +msgid ":class:`ast.BoolOp` (``and`` and ``or``)" +msgstr ":class:`ast.BoolOp` (``and`` 和 ``or``)" + +#: ../../library/annotationlib.rst:659 +msgid ":class:`ast.IfExp`" +msgstr ":class:`ast.IfExp`" + +#: ../../library/annotationlib.rst:660 +msgid ":class:`ast.Lambda`" +msgstr ":class:`ast.Lambda`" + +#: ../../library/annotationlib.rst:661 +msgid ":class:`ast.ListComp`" +msgstr ":class:`ast.ListComp`" + +#: ../../library/annotationlib.rst:662 +msgid ":class:`ast.SetComp`" +msgstr ":class:`ast.SetComp`" + +#: ../../library/annotationlib.rst:663 +msgid ":class:`ast.DictComp`" +msgstr ":class:`ast.DictComp`" + +#: ../../library/annotationlib.rst:664 +msgid ":class:`ast.GeneratorExp`" +msgstr ":class:`ast.GeneratorExp`" + +#: ../../library/annotationlib.rst:666 +msgid "" +"The following are disallowed in annotation scopes and therefore not " +"relevant:" +msgstr "以下内容在注解作用域中不被允许,因此不予考虑:" + +#: ../../library/annotationlib.rst:668 +msgid ":class:`ast.NamedExpr` (``:=``)" +msgstr ":class:`ast.NamedExpr` (``:=``)" + +#: ../../library/annotationlib.rst:669 +msgid ":class:`ast.Await`" +msgstr ":class:`ast.Await`" + +#: ../../library/annotationlib.rst:670 +msgid ":class:`ast.Yield`" +msgstr ":class:`ast.Yield`" + +#: ../../library/annotationlib.rst:671 +msgid ":class:`ast.YieldFrom`" +msgstr ":class:`ast.YieldFrom`" + +#: ../../library/annotationlib.rst:675 +msgid "Limitations of the ``FORWARDREF`` format" +msgstr "``FORWARDREF`` 格式的局限性" + +#: ../../library/annotationlib.rst:677 +msgid "" +"The :attr:`~Format.FORWARDREF` format aims to produce real values as much as" +" possible, with anything that cannot be resolved replaced with " +":class:`ForwardRef` objects. It is affected by broadly the same Limitations " +"as the :attr:`~Format.STRING` format: annotations that perform operations on" +" literals or that use unsupported expression types may raise exceptions when" +" evaluated using the :attr:`~Format.FORWARDREF` format." +msgstr "" +":attr:`~Format.FORWARDREF` 格式旨在尽可能生成实际值,对于无法解析的内容则用 :class:`ForwardRef` " +"对象替代。该格式受到的限制与 :attr:`~Format.STRING` 格式基本相同:当使用 :attr:`~Format.FORWARDREF` " +"格式求值时,若注解包含对字面值的操作或使用了不支持的表达式类型,可能会引发异常。" + +#: ../../library/annotationlib.rst:684 +msgid "Below are a few examples of the behavior with unsupported expressions:" +msgstr "以下是使用不支持的表达式时的行为示例:" + +#: ../../library/annotationlib.rst:686 +msgid "" +">>> from annotationlib import get_annotations, Format\n" +">>> def zerodiv(x: 1 / 0): ...\n" +">>> get_annotations(zerodiv, format=Format.STRING)\n" +"Traceback (most recent call last):\n" +" ...\n" +"ZeroDivisionError: division by zero\n" +">>> get_annotations(zerodiv, format=Format.FORWARDREF)\n" +"Traceback (most recent call last):\n" +" ...\n" +"ZeroDivisionError: division by zero\n" +">>> def ifexp(x: 1 if y else 0): ...\n" +">>> get_annotations(ifexp, format=Format.STRING)\n" +"{'x': '1'}" +msgstr "" +">>> from annotationlib import get_annotations, Format\n" +">>> def zerodiv(x: 1 / 0): ...\n" +">>> get_annotations(zerodiv, format=Format.STRING)\n" +"Traceback (most recent call last):\n" +" ...\n" +"ZeroDivisionError: division by zero\n" +">>> get_annotations(zerodiv, format=Format.FORWARDREF)\n" +"Traceback (most recent call last):\n" +" ...\n" +"ZeroDivisionError: division by zero\n" +">>> def ifexp(x: 1 if y else 0): ...\n" +">>> get_annotations(ifexp, format=Format.STRING)\n" +"{'x': '1'}" + +#: ../../library/annotationlib.rst:705 +msgid "Security implications of introspecting annotations" +msgstr "内省注解的安全影响" + +#: ../../library/annotationlib.rst:707 +msgid "" +"Much of the functionality in this module involves executing code related to " +"annotations, which can then do arbitrary things. For example, " +":func:`get_annotations` may call an arbitrary :term:`annotate function`, and" +" :meth:`ForwardRef.evaluate` may call :func:`eval` on an arbitrary string. " +"Code contained in an annotation might make arbitrary system calls, enter an " +"infinite loop, or perform any other operation. This is also true for any " +"access of the :attr:`~object.__annotations__` attribute, and for various " +"functions in the :mod:`typing` module that work with annotations, such as " +":func:`typing.get_type_hints`." +msgstr "" +"本模块的大部分功能涉及执行与注解相关的代码,这些代码可能执行任意操作。例如,:func:`get_annotations` 可能调用任意的 " +":term:`annotate function`,而 :meth:`ForwardRef.evaluate` 可能对任意字符串调用 " +":func:`eval`。注解中包含的代码可能进行任意的系统调用、进入无限循环或执行任何其他操作。对于任何访问 " +":attr:`~object.__annotations__` 属性的操作,以及 :mod:`typing` 模块中处理注解的各种函数 (如 " +":func:`typing.get_type_hints`) 也是如此。" + +#: ../../library/annotationlib.rst:716 +msgid "" +"Any security issue arising from this also applies immediately after " +"importing code that may contain untrusted annotations: importing code can " +"always cause arbitrary operations to be performed. However, it is unsafe to " +"accept strings or other input from an untrusted source and pass them to any " +"of the APIs for introspecting annotations, for example by editing an " +"``__annotations__`` dictionary or directly creating a :class:`ForwardRef` " +"object." +msgstr "" +"由此产生的任何安全问题同样适用于导入可能包含不受信任注解的代码后立即执行的情况:导入代码始终可能导致执行任意操作。然而,接受来自不受信任来源的字符串或其他输入并将其传递给任何用于内省注解的" +" API 是不安全的,例如通过编辑 ``__annotations__`` 字典或直接创建 :class:`ForwardRef` 对象。" diff --git a/library/archiving.po b/library/archiving.po new file mode 100644 index 0000000000..c3cf7f7c76 --- /dev/null +++ b/library/archiving.po @@ -0,0 +1,36 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/archiving.rst:5 +msgid "Data Compression and Archiving" +msgstr "数据压缩和存档" + +#: ../../library/archiving.rst:7 +msgid "" +"The modules described in this chapter support data compression with the " +"zlib, gzip, bzip2, lzma, and zstd algorithms, and the creation of ZIP- and " +"tar-format archives. See also :ref:`archiving-operations` provided by the " +":mod:`shutil` module." +msgstr "" +"本章中描述的模块支持使用 zlib, gzip, bzip2, lzma 和 zstd 算法进行数据压缩,以及创建 ZIP 和 tar 格式的归档文件。" +" 另请参阅由 :mod:`shutil` 模块提供的 :ref:`archiving-operations`。" diff --git a/library/argparse.po b/library/argparse.po new file mode 100644 index 0000000000..97baf54c37 --- /dev/null +++ b/library/argparse.po @@ -0,0 +1,4325 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-06-09 17:19+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/argparse.rst:2 +msgid "" +":mod:`!argparse` --- Parser for command-line options, arguments and " +"subcommands" +msgstr ":mod:`!argparse` --- 用于命令行选项、参数和子命令的解析器" + +#: ../../library/argparse.rst:12 +msgid "**Source code:** :source:`Lib/argparse.py`" +msgstr "**源代码:** :source:`Lib/argparse.py`" + +#: ../../library/argparse.rst:16 +msgid "" +"While :mod:`!argparse` is the default recommended standard library module " +"for implementing basic command line applications, authors with more exacting" +" requirements for exactly how their command line applications behave may " +"find it doesn't provide the necessary level of control. Refer to " +":ref:`choosing-an-argument-parser` for alternatives to consider when " +"``argparse`` doesn't support behaviors that the application requires (such " +"as entirely disabling support for interspersed options and positional " +"arguments, or accepting option parameter values that start with ``-`` even " +"when they correspond to another defined option)." +msgstr "" +"虽然 :mod:`!argparse` " +"是默认推荐的用于实现基本命令行应用程序的标准库模块,但对于命令行应用程序的行为有更明确的要求的开发者可能会发现它并未提供所需层次的控制能力。 请参阅 " +":ref:`choosing-an-argument-parser` 了解当 ``argparse`` " +"不支持特定应用程序需要的行为(例如完全禁用分散选项和位置参数,或接受以 ``-`` 开头的选项形参值即使它们对应了其它已定义的选项)时可以考虑的替代。" + +#: ../../library/argparse.rst-1 +msgid "Tutorial" +msgstr "教程" + +#: ../../library/argparse.rst:30 +msgid "" +"This page contains the API reference information. For a more gentle " +"introduction to Python command-line parsing, have a look at the " +":ref:`argparse tutorial `." +msgstr "" +"此页面包含该 API 的参考信息。有关 Python 命令行解析更细致的介绍,请参阅 :ref:`argparse 教程 `." + +#: ../../library/argparse.rst:34 +msgid "" +"The :mod:`!argparse` module makes it easy to write user-friendly command-" +"line interfaces. The program defines what arguments it requires, and " +":mod:`!argparse` will figure out how to parse those out of :data:`sys.argv`." +" The :mod:`!argparse` module also automatically generates help and usage " +"messages. The module will also issue errors when users give the program " +"invalid arguments." +msgstr "" +":mod:`!argparse` 模块让编写用户友好的命令行接口变得容易。程序定义它需要哪些参数,:mod:`!argparse` 将会知道如何从 " +":data:`sys.argv` 解析它们。:mod:`!argparse` " +"模块还能自动生成帮助和用法消息文本。该模块还会在用户向程序传入无效参数时发出错误提示。" + +#: ../../library/argparse.rst:40 +msgid "" +"The :mod:`!argparse` module's support for command-line interfaces is built " +"around an instance of :class:`argparse.ArgumentParser`. It is a container " +"for argument specifications and has options that apply to the parser as " +"whole::" +msgstr "" +":mod:`!argparse` 模块对命令行界面的支持是围绕 :class:`argparse.ArgumentParser` " +"实例建立的。它是一个用于参数规格说明的容器并包含应用于解析器的一组选项::" + +#: ../../library/argparse.rst:44 +msgid "" +"parser = argparse.ArgumentParser(\n" +" prog='ProgramName',\n" +" description='What the program does',\n" +" epilog='Text at the bottom of help')" +msgstr "" +"parser = argparse.ArgumentParser(\n" +" prog='ProgramName',\n" +" description='What the program does',\n" +" epilog='Text at the bottom of help')" + +#: ../../library/argparse.rst:49 +msgid "" +"The :meth:`ArgumentParser.add_argument` method attaches individual argument " +"specifications to the parser. It supports positional arguments, options " +"that accept values, and on/off flags::" +msgstr "" +":meth:`ArgumentParser.add_argument` " +"方法将单个参数规格说明关联到解析器。它支持位置参数,接受各种值的选项,以及各种启用/禁用旗标::" + +#: ../../library/argparse.rst:53 +msgid "" +"parser.add_argument('filename') # positional argument\n" +"parser.add_argument('-c', '--count') # option that takes a value\n" +"parser.add_argument('-v', '--verbose',\n" +" action='store_true') # on/off flag" +msgstr "" +"parser.add_argument('filename') # 位置参数\n" +"parser.add_argument('-c', '--count') # 接受一个值的选项\n" +"parser.add_argument('-v', '--verbose',\n" +" action='store_true') # 启用/禁用旗标" + +#: ../../library/argparse.rst:58 +msgid "" +"The :meth:`ArgumentParser.parse_args` method runs the parser and places the " +"extracted data in a :class:`argparse.Namespace` object::" +msgstr "" +":meth:`ArgumentParser.parse_args` 方法运行解析器并将提取的数据放入 " +":class:`argparse.Namespace` 对象::" + +#: ../../library/argparse.rst:61 +msgid "" +"args = parser.parse_args()\n" +"print(args.filename, args.count, args.verbose)" +msgstr "" +"args = parser.parse_args()\n" +"print(args.filename, args.count, args.verbose)" + +#: ../../library/argparse.rst:65 +msgid "" +"If you're looking for a guide about how to upgrade :mod:`optparse` code to " +":mod:`!argparse`, see :ref:`Upgrading Optparse Code `." +msgstr "" +"如果您正在寻找如何将 :mod:`optparse` 代码升级到 :mod:`!argparse` 的指南,请参阅 :ref:`Upgrading " +"Optparse Code `." + +#: ../../library/argparse.rst:69 +msgid "ArgumentParser objects" +msgstr "ArgumentParser 对象" + +#: ../../library/argparse.rst:79 +msgid "" +"Create a new :class:`ArgumentParser` object. All parameters should be passed" +" as keyword arguments. Each parameter has its own more detailed description " +"below, but in short they are:" +msgstr "" +"创建一个新的 :class:`ArgumentParser` " +"对象。所有的参数都应当作为关键字参数传入。每个参数在下面都有它更详细的描述,但简而言之,它们是:" + +#: ../../library/argparse.rst:83 +msgid "" +"prog_ - The name of the program (default: generated from the ``__main__`` " +"module attributes and ``sys.argv[0]``)" +msgstr "prog_ - 程序的名称 (默认值:根据 ``__main__`` 模块属性和 ``sys.argv[0]`` 生成)" + +#: ../../library/argparse.rst:86 +msgid "" +"usage_ - The string describing the program usage (default: generated from " +"arguments added to parser)" +msgstr "usage_ - 描述程序用途的字符串(默认值:从添加到解析器的参数生成)" + +#: ../../library/argparse.rst:89 +msgid "" +"description_ - Text to display before the argument help (by default, no " +"text)" +msgstr "description_ - 要在参数帮助信息之前显示的文本(默认:无文本)" + +#: ../../library/argparse.rst:92 +msgid "" +"epilog_ - Text to display after the argument help (by default, no text)" +msgstr "epilog_ - 要在参数帮助信息之后显示的文本(默认:无文本)" + +#: ../../library/argparse.rst:94 +msgid "" +"parents_ - A list of :class:`ArgumentParser` objects whose arguments should " +"also be included" +msgstr "parents_ - 一个 :class:`ArgumentParser` 对象的列表,它们的参数也应包含在内" + +#: ../../library/argparse.rst:97 +msgid "formatter_class_ - A class for customizing the help output" +msgstr "formatter_class_ - 用于自定义帮助文档输出格式的类" + +#: ../../library/argparse.rst:99 +msgid "" +"prefix_chars_ - The set of characters that prefix optional arguments " +"(default: '-')" +msgstr "prefix_chars_ - 可选参数的前缀字符集合(默认值: '-')" + +#: ../../library/argparse.rst:102 +msgid "" +"fromfile_prefix_chars_ - The set of characters that prefix files from which " +"additional arguments should be read (default: ``None``)" +msgstr "" +"fromfile_prefix_chars_ - 当需要从文件中读取其他参数时,用于标识文件名的前缀字符集合 (默认值: ``None``)" + +#: ../../library/argparse.rst:105 +msgid "" +"argument_default_ - The global default value for arguments (default: " +"``None``)" +msgstr "argument_default_ - 参数的全局默认值 (默认值: ``None``)" + +#: ../../library/argparse.rst:108 +msgid "" +"conflict_handler_ - The strategy for resolving conflicting optionals " +"(usually unnecessary)" +msgstr "conflict_handler_ - 解决冲突选项的策略(通常是不必要的)" + +#: ../../library/argparse.rst:111 +msgid "" +"add_help_ - Add a ``-h/--help`` option to the parser (default: ``True``)" +msgstr "add_help_ - 为解析器添加一个 ``-h/--help`` 选项 (默认值: ``True``)" + +#: ../../library/argparse.rst:113 +msgid "" +"allow_abbrev_ - Allows long options to be abbreviated if the abbreviation is" +" unambiguous (default: ``True``)" +msgstr "allow_abbrev_ - 如果缩写是无歧义的则允许对长选项进行缩写 (默认值: ``True``)" + +#: ../../library/argparse.rst:116 +msgid "" +"exit_on_error_ - Determines whether or not :class:`!ArgumentParser` exits " +"with error info when an error occurs. (default: ``True``)" +msgstr "" +"exit_on_error_ - 确定当出现错误时,:class:`!ArgumentParser` 是否退出并显示错误信息。(默认值: " +"``True``)" + +#: ../../library/argparse.rst:119 +msgid "" +"suggest_on_error_ - Enables suggestions for mistyped argument choices and " +"subparser names (default: ``False``)" +msgstr "suggest_on_error_ - 启用针对错误的参数选择和子解析器名称的提示 (默认值: ``False``)" + +#: ../../library/argparse.rst:122 +msgid "color_ - Allow color output (default: ``True``)" +msgstr "color_ - 允许彩色输出 (默认值: ``True``)" + +#: ../../library/argparse.rst:124 +msgid "*allow_abbrev* parameter was added." +msgstr "增加了 *allow_abbrev* 参数。" + +#: ../../library/argparse.rst:127 +msgid "" +"In previous versions, *allow_abbrev* also disabled grouping of short flags " +"such as ``-vv`` to mean ``-v -v``." +msgstr "在之前的版本中,*allow_abbrev* 还会禁用短旗标分组,例如 ``-vv`` 表示为 ``-v -v``。" + +#: ../../library/argparse.rst:131 +msgid "*exit_on_error* parameter was added." +msgstr "添加了 *exit_on_error* 形参。" + +#: ../../library/argparse.rst:134 +msgid "*suggest_on_error* and *color* parameters were added." +msgstr "增加了 *suggest_on_error* 和 *color* 形参。" + +#: ../../library/argparse.rst:137 ../../library/argparse.rst:695 +msgid "The following sections describe how each of these are used." +msgstr "以下部分描述这些参数如何使用。" + +#: ../../library/argparse.rst:143 +msgid "prog" +msgstr "prog" + +#: ../../library/argparse.rst:146 +msgid "" +"By default, :class:`ArgumentParser` calculates the name of the program to " +"display in help messages depending on the way the Python interpreter was " +"run:" +msgstr "默认情况下,:class:`ArgumentParser` 根据 Python 解释器的运行方式,计算出要在帮助信息中显示的程序名称:" + +#: ../../library/argparse.rst:149 +msgid "" +"The :func:`base name ` of ``sys.argv[0]`` if a file was " +"passed as argument." +msgstr "" +"如果作为参数传递的是文件,则是 ``sys.argv[0]`` 的 :func:`basename `。" + +#: ../../library/argparse.rst:151 +msgid "" +"The Python interpreter name followed by ``sys.argv[0]`` if a directory or a " +"zipfile was passed as argument." +msgstr "如果作为参数传递的是目录或 ZIP 文件,则是 Python 解释器名称,后接 ``sys.argv[0]``。" + +#: ../../library/argparse.rst:153 +msgid "" +"The Python interpreter name followed by ``-m`` followed by the module or " +"package name if the :option:`-m` option was used." +msgstr "如果使用 :option:`-m` 选项则是在 Python 解释器名称后接 ``-m`` 再加模块或包的名称。" + +#: ../../library/argparse.rst:156 +msgid "" +"This default is almost always desirable because it will make the help " +"messages match the string that was used to invoke the program on the command" +" line. However, to change this default behavior, another value can be " +"supplied using the ``prog=`` argument to :class:`ArgumentParser`::" +msgstr "" +"默认行为几乎总是符合需求因为它将使帮助消息与在命令行上唤起程序所用的字符串相匹配。不过,要更改此默认行为,可以将 ``prog=`` 参数传入 " +":class:`ArgumentParser` 以提供另外的值::" + +#: ../../library/argparse.rst:161 +msgid "" +">>> parser = argparse.ArgumentParser(prog='myprogram')\n" +">>> parser.print_help()\n" +"usage: myprogram [-h]\n" +"\n" +"options:\n" +" -h, --help show this help message and exit" +msgstr "" +">>> parser = argparse.ArgumentParser(prog='myprogram')\n" +">>> parser.print_help()\n" +"usage: myprogram [-h]\n" +"\n" +"options:\n" +" -h, --help show this help message and exit" + +#: ../../library/argparse.rst:168 +msgid "" +"Note that the program name, whether determined from ``sys.argv[0]``, from " +"the ``__main__`` module attributes or from the ``prog=`` argument, is " +"available to help messages using the ``%(prog)s`` format specifier." +msgstr "" +"需要注意程序名称,无论是由 ``sys.argv[0]``,由 ``__main__`` 模块属性还是由 ``prog=`` " +"参数来确定的,都可以在帮助消息中使用 ``%(prog)s`` 格式说明符来引用。" + +#: ../../library/argparse.rst:175 +msgid "" +">>> parser = argparse.ArgumentParser(prog='myprogram')\n" +">>> parser.add_argument('--foo', help='foo of the %(prog)s program')\n" +">>> parser.print_help()\n" +"usage: myprogram [-h] [--foo FOO]\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" --foo FOO foo of the myprogram program" +msgstr "" +">>> parser = argparse.ArgumentParser(prog='myprogram')\n" +">>> parser.add_argument('--foo', help='foo of the %(prog)s program')\n" +">>> parser.print_help()\n" +"usage: myprogram [-h] [--foo FOO]\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" --foo FOO foo of the myprogram program" + +#: ../../library/argparse.rst:184 +msgid "" +"The default ``prog`` value now reflects how ``__main__`` was actually " +"executed, rather than always being ``os.path.basename(sys.argv[0])``." +msgstr "" +"默认的 ``prog`` 值现在将反映出 ``__main__`` 实际是如何被执行的,而不是始终为 " +"``os.path.basename(sys.argv[0])``。" + +#: ../../library/argparse.rst:189 +msgid "usage" +msgstr "usage(用法)" + +#: ../../library/argparse.rst:191 +msgid "" +"By default, :class:`ArgumentParser` calculates the usage message from the " +"arguments it contains. The default message can be overridden with the " +"``usage=`` keyword argument::" +msgstr "" +"默认情况下,:class:`ArgumentParser` 会从它所包含的参数中计算出用法消息。默认消息可以通过 ``usage=`` " +"关键字参数进行覆盖::" + +#: ../../library/argparse.rst:195 +msgid "" +">>> parser = argparse.ArgumentParser(prog='PROG', usage='%(prog)s [options]')\n" +">>> parser.add_argument('--foo', nargs='?', help='foo help')\n" +">>> parser.add_argument('bar', nargs='+', help='bar help')\n" +">>> parser.print_help()\n" +"usage: PROG [options]\n" +"\n" +"positional arguments:\n" +" bar bar help\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" --foo [FOO] foo help" +msgstr "" +">>> parser = argparse.ArgumentParser(prog='PROG', usage='%(prog)s [options]')\n" +">>> parser.add_argument('--foo', nargs='?', help='foo help')\n" +">>> parser.add_argument('bar', nargs='+', help='bar help')\n" +">>> parser.print_help()\n" +"usage: PROG [options]\n" +"\n" +"positional arguments:\n" +" bar bar help\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" --foo [FOO] foo help" + +#: ../../library/argparse.rst:208 +msgid "" +"The ``%(prog)s`` format specifier is available to fill in the program name " +"in your usage messages." +msgstr "在用法消息中可以使用 ``%(prog)s`` 格式说明符来填入程序名称。" + +#: ../../library/argparse.rst:211 +msgid "" +"When a custom usage message is specified for the main parser, you may also " +"want to consider passing the ``prog`` argument to " +":meth:`~ArgumentParser.add_subparsers` or the ``prog`` and the ``usage`` " +"arguments to :meth:`~_SubParsersAction.add_parser`, to ensure consistent " +"command prefixes and usage information across subparsers." +msgstr "" +"当为主解析器指定了自定义用法消息时,你可能还需要考虑将 ``prog`` 参数传递给 " +":meth:`~ArgumentParser.add_subparsers`,或将 ``prog`` 和 ``usage`` 参数传递给 " +":meth:`~_SubParsersAction.add_parser`,以确保跨子解析器的命令前缀和用法信息一致。" + +#: ../../library/argparse.rst:221 +msgid "description" +msgstr "description(描述)" + +#: ../../library/argparse.rst:223 +msgid "" +"Most calls to the :class:`ArgumentParser` constructor will use the " +"``description=`` keyword argument. This argument gives a brief description " +"of what the program does and how it works. In help messages, the " +"description is displayed between the command-line usage string and the help " +"messages for the various arguments." +msgstr "" +"大多数对 :class:`ArgumentParser` 构造器的调用都会使用 ``description=`` " +"关键字参数。这个参数简要描述这个程序做什么以及怎么做。在帮助消息中,这个描述会显示在命令行用法字符串和各种参数的帮助消息之间。" + +#: ../../library/argparse.rst:229 +msgid "" +"By default, the description will be line-wrapped so that it fits within the " +"given space. To change this behavior, see the formatter_class_ argument." +msgstr "在默认情况下,description 将被换行以便适应给定的空间。如果想改变这种行为,见 formatter_class_ 参数。" + +#: ../../library/argparse.rst:234 +msgid "epilog" +msgstr "epilog" + +#: ../../library/argparse.rst:236 +msgid "" +"Some programs like to display additional description of the program after " +"the description of the arguments. Such text can be specified using the " +"``epilog=`` argument to :class:`ArgumentParser`::" +msgstr "" +"一些程序喜欢在参数帮助信息之后显示额外的对程序的描述。这种文字能够通过给 :class:`ArgumentParser` 提供 ``epilog=`` " +"参数而被指定::" + +#: ../../library/argparse.rst:240 +msgid "" +">>> parser = argparse.ArgumentParser(\n" +"... description='A foo that bars',\n" +"... epilog=\"And that's how you'd foo a bar\")\n" +">>> parser.print_help()\n" +"usage: argparse.py [-h]\n" +"\n" +"A foo that bars\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +"\n" +"And that's how you'd foo a bar" +msgstr "" +">>> parser = argparse.ArgumentParser(\n" +"... description='A foo that bars',\n" +"... epilog=\"And that's how you'd foo a bar\")\n" +">>> parser.print_help()\n" +"usage: argparse.py [-h]\n" +"\n" +"A foo that bars\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +"\n" +"And that's how you'd foo a bar" + +#: ../../library/argparse.rst:253 +msgid "" +"As with the description_ argument, the ``epilog=`` text is by default line-" +"wrapped, but this behavior can be adjusted with the formatter_class_ " +"argument to :class:`ArgumentParser`." +msgstr "" +"和 description_ 参数一样,``epilog=`` 文本在默认情况下会换行,但是这种行为能够通过向 " +":class:`ArgumentParser` 提供 formatter_class_ 参数来调整。" + +#: ../../library/argparse.rst:259 +msgid "parents" +msgstr "parents" + +#: ../../library/argparse.rst:261 +msgid "" +"Sometimes, several parsers share a common set of arguments. Rather than " +"repeating the definitions of these arguments, a single parser with all the " +"shared arguments and passed to ``parents=`` argument to " +":class:`ArgumentParser` can be used. The ``parents=`` argument takes a list" +" of :class:`ArgumentParser` objects, collects all the positional and " +"optional actions from them, and adds these actions to the " +":class:`ArgumentParser` object being constructed::" +msgstr "" +"有些时候,少数解析器会使用同一系列参数。单个解析器能够通过提供 ``parents=`` 参数给 :class:`ArgumentParser` " +"而使用相同的参数而不是重复这些参数的定义。``parents=`` 参数使用 :class:`ArgumentParser` " +"对象的列表,从它们那里收集所有的位置和可选的行为,然后将这些行为加到正在构建的 :class:`ArgumentParser` 对象。" + +#: ../../library/argparse.rst:268 +msgid "" +">>> parent_parser = argparse.ArgumentParser(add_help=False)\n" +">>> parent_parser.add_argument('--parent', type=int)\n" +"\n" +">>> foo_parser = argparse.ArgumentParser(parents=[parent_parser])\n" +">>> foo_parser.add_argument('foo')\n" +">>> foo_parser.parse_args(['--parent', '2', 'XXX'])\n" +"Namespace(foo='XXX', parent=2)\n" +"\n" +">>> bar_parser = argparse.ArgumentParser(parents=[parent_parser])\n" +">>> bar_parser.add_argument('--bar')\n" +">>> bar_parser.parse_args(['--bar', 'YYY'])\n" +"Namespace(bar='YYY', parent=None)" +msgstr "" +">>> parent_parser = argparse.ArgumentParser(add_help=False)\n" +">>> parent_parser.add_argument('--parent', type=int)\n" +"\n" +">>> foo_parser = argparse.ArgumentParser(parents=[parent_parser])\n" +">>> foo_parser.add_argument('foo')\n" +">>> foo_parser.parse_args(['--parent', '2', 'XXX'])\n" +"Namespace(foo='XXX', parent=2)\n" +"\n" +">>> bar_parser = argparse.ArgumentParser(parents=[parent_parser])\n" +">>> bar_parser.add_argument('--bar')\n" +">>> bar_parser.parse_args(['--bar', 'YYY'])\n" +"Namespace(bar='YYY', parent=None)" + +#: ../../library/argparse.rst:281 +msgid "" +"Note that most parent parsers will specify ``add_help=False``. Otherwise, " +"the :class:`ArgumentParser` will see two ``-h/--help`` options (one in the " +"parent and one in the child) and raise an error." +msgstr "" +"请注意大多数父解析器会指定 ``add_help=False``。否则,:class:`ArgumentParser` 将会看到两个 " +"``-h/--help`` 选项(一个在父参数中一个在子参数中)并且产生一个错误。" + +#: ../../library/argparse.rst:286 +msgid "" +"You must fully initialize the parsers before passing them via ``parents=``. " +"If you change the parent parsers after the child parser, those changes will " +"not be reflected in the child." +msgstr "你在通过 ``parents=`` 传递解析器之前必须完全初始化它们。如果你在子解析器之后改变父解析器,这些改变将不会反映在子解析器上。" + +#: ../../library/argparse.rst:294 +msgid "formatter_class" +msgstr "formatter_class" + +#: ../../library/argparse.rst:296 +msgid "" +":class:`ArgumentParser` objects allow the help formatting to be customized " +"by specifying an alternate formatting class. Currently, there are four such" +" classes:" +msgstr ":class:`ArgumentParser` 对象允许通过指定备用格式化类来自定义帮助格式。目前,有四种这样的类。" + +#: ../../library/argparse.rst:305 +msgid "" +":class:`RawDescriptionHelpFormatter` and :class:`RawTextHelpFormatter` give " +"more control over how textual descriptions are displayed. By default, " +":class:`ArgumentParser` objects line-wrap the description_ and epilog_ texts" +" in command-line help messages::" +msgstr "" +":class:`RawDescriptionHelpFormatter` 和 :class:`RawTextHelpFormatter` " +"在正文的描述和展示上给与了更多的控制。:class:`ArgumentParser` 对象会将 description_ 和 epilog_ " +"的文字在命令行中自动换行::" + +#: ../../library/argparse.rst:310 +msgid "" +">>> parser = argparse.ArgumentParser(\n" +"... prog='PROG',\n" +"... description='''this description\n" +"... was indented weird\n" +"... but that is okay''',\n" +"... epilog='''\n" +"... likewise for this epilog whose whitespace will\n" +"... be cleaned up and whose words will be wrapped\n" +"... across a couple lines''')\n" +">>> parser.print_help()\n" +"usage: PROG [-h]\n" +"\n" +"this description was indented weird but that is okay\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +"\n" +"likewise for this epilog whose whitespace will be cleaned up and whose words\n" +"will be wrapped across a couple lines" +msgstr "" +">>> parser = argparse.ArgumentParser(\n" +"... prog='PROG',\n" +"... description='''this description\n" +"... was indented weird\n" +"... but that is okay''',\n" +"... epilog='''\n" +"... likewise for this epilog whose whitespace will\n" +"... be cleaned up and whose words will be wrapped\n" +"... across a couple lines''')\n" +">>> parser.print_help()\n" +"usage: PROG [-h]\n" +"\n" +"this description was indented weird but that is okay\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +"\n" +"likewise for this epilog whose whitespace will be cleaned up and whose words\n" +"will be wrapped across a couple lines" + +#: ../../library/argparse.rst:330 +msgid "" +"Passing :class:`RawDescriptionHelpFormatter` as ``formatter_class=`` " +"indicates that description_ and epilog_ are already correctly formatted and " +"should not be line-wrapped::" +msgstr "" +"传 :class:`RawDescriptionHelpFormatter` 给 ``formatter_class=`` 表示 " +"description_ 和 epilog_ 已经被正确的格式化了,不能在命令行中被自动换行::" + +#: ../../library/argparse.rst:334 +msgid "" +">>> parser = argparse.ArgumentParser(\n" +"... prog='PROG',\n" +"... formatter_class=argparse.RawDescriptionHelpFormatter,\n" +"... description=textwrap.dedent('''\\\n" +"... Please do not mess up this text!\n" +"... --------------------------------\n" +"... I have indented it\n" +"... exactly the way\n" +"... I want it\n" +"... '''))\n" +">>> parser.print_help()\n" +"usage: PROG [-h]\n" +"\n" +"Please do not mess up this text!\n" +"--------------------------------\n" +" I have indented it\n" +" exactly the way\n" +" I want it\n" +"\n" +"options:\n" +" -h, --help show this help message and exit" +msgstr "" +">>> parser = argparse.ArgumentParser(\n" +"... prog='PROG',\n" +"... formatter_class=argparse.RawDescriptionHelpFormatter,\n" +"... description=textwrap.dedent('''\\\n" +"... Please do not mess up this text!\n" +"... --------------------------------\n" +"... I have indented it\n" +"... exactly the way\n" +"... I want it\n" +"... '''))\n" +">>> parser.print_help()\n" +"usage: PROG [-h]\n" +"\n" +"Please do not mess up this text!\n" +"--------------------------------\n" +" I have indented it\n" +" exactly the way\n" +" I want it\n" +"\n" +"options:\n" +" -h, --help show this help message and exit" + +#: ../../library/argparse.rst:356 +msgid "" +":class:`RawTextHelpFormatter` maintains whitespace for all sorts of help " +"text, including argument descriptions. However, multiple newlines are " +"replaced with one. If you wish to preserve multiple blank lines, add spaces " +"between the newlines." +msgstr "" +":class:`RawTextHelpFormatter` " +"保留各种帮助文本的空白符,包括参数描述。但是,多个换行符会被替换为一个。如果你希望保留多个空行,请在换行符之间添加空格。" + +#: ../../library/argparse.rst:361 +msgid "" +":class:`ArgumentDefaultsHelpFormatter` automatically adds information about " +"default values to each of the argument help messages::" +msgstr ":class:`ArgumentDefaultsHelpFormatter` 自动添加默认的值的信息到每一个帮助信息的参数中::" + +#: ../../library/argparse.rst:364 +msgid "" +">>> parser = argparse.ArgumentParser(\n" +"... prog='PROG',\n" +"... formatter_class=argparse.ArgumentDefaultsHelpFormatter)\n" +">>> parser.add_argument('--foo', type=int, default=42, help='FOO!')\n" +">>> parser.add_argument('bar', nargs='*', default=[1, 2, 3], help='BAR!')\n" +">>> parser.print_help()\n" +"usage: PROG [-h] [--foo FOO] [bar ...]\n" +"\n" +"positional arguments:\n" +" bar BAR! (default: [1, 2, 3])\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" --foo FOO FOO! (default: 42)" +msgstr "" +">>> parser = argparse.ArgumentParser(\n" +"... prog='PROG',\n" +"... formatter_class=argparse.ArgumentDefaultsHelpFormatter)\n" +">>> parser.add_argument('--foo', type=int, default=42, help='FOO!')\n" +">>> parser.add_argument('bar', nargs='*', default=[1, 2, 3], help='BAR!')\n" +">>> parser.print_help()\n" +"usage: PROG [-h] [--foo FOO] [bar ...]\n" +"\n" +"positional arguments:\n" +" bar BAR! (default: [1, 2, 3])\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" --foo FOO FOO! (default: 42)" + +#: ../../library/argparse.rst:379 +msgid "" +":class:`MetavarTypeHelpFormatter` uses the name of the type_ argument for " +"each argument as the display name for its values (rather than using the " +"dest_ as the regular formatter does)::" +msgstr "" +":class:`MetavarTypeHelpFormatter` 为它的值在每一个参数中使用 type_ 的参数名当作它的显示名(而不是使用通常的格式" +" dest_ )::" + +#: ../../library/argparse.rst:383 +msgid "" +">>> parser = argparse.ArgumentParser(\n" +"... prog='PROG',\n" +"... formatter_class=argparse.MetavarTypeHelpFormatter)\n" +">>> parser.add_argument('--foo', type=int)\n" +">>> parser.add_argument('bar', type=float)\n" +">>> parser.print_help()\n" +"usage: PROG [-h] [--foo int] float\n" +"\n" +"positional arguments:\n" +" float\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" --foo int" +msgstr "" +">>> parser = argparse.ArgumentParser(\n" +"... prog='PROG',\n" +"... formatter_class=argparse.MetavarTypeHelpFormatter)\n" +">>> parser.add_argument('--foo', type=int)\n" +">>> parser.add_argument('bar', type=float)\n" +">>> parser.print_help()\n" +"usage: PROG [-h] [--foo int] float\n" +"\n" +"positional arguments:\n" +" float\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" --foo int" + +#: ../../library/argparse.rst:400 +msgid "prefix_chars" +msgstr "prefix_chars" + +#: ../../library/argparse.rst:402 +msgid "" +"Most command-line options will use ``-`` as the prefix, e.g. ``-f/--foo``. " +"Parsers that need to support different or additional prefix characters, e.g." +" for options like ``+f`` or ``/foo``, may specify them using the " +"``prefix_chars=`` argument to the :class:`ArgumentParser` constructor::" +msgstr "" +"大多数命令行选项会使用 ``-`` 作为前缀,例如 ``-f/--foo``。如果解析器需要支持不同的或者额外的前缀字符,例如像 ``+f`` 或 " +"``/foo`` 之类的选项,可以在 :class:`ArgumentParser` 构造器中使用 ``prefix_chars=`` " +"参数来指定它们::" + +#: ../../library/argparse.rst:408 +msgid "" +">>> parser = argparse.ArgumentParser(prog='PROG', prefix_chars='-+')\n" +">>> parser.add_argument('+f')\n" +">>> parser.add_argument('++bar')\n" +">>> parser.parse_args('+f X ++bar Y'.split())\n" +"Namespace(bar='Y', f='X')" +msgstr "" +">>> parser = argparse.ArgumentParser(prog='PROG', prefix_chars='-+')\n" +">>> parser.add_argument('+f')\n" +">>> parser.add_argument('++bar')\n" +">>> parser.parse_args('+f X ++bar Y'.split())\n" +"Namespace(bar='Y', f='X')" + +#: ../../library/argparse.rst:414 +msgid "" +"The ``prefix_chars=`` argument defaults to ``'-'``. Supplying a set of " +"characters that does not include ``-`` will cause ``-f/--foo`` options to be" +" disallowed." +msgstr "" +"``prefix_chars=`` 参数默认使用 ``'-'``。提供一组不包括 ``-`` 的字符将导致 ``-f/--foo`` 选项不被允许。" + +#: ../../library/argparse.rst:420 +msgid "fromfile_prefix_chars" +msgstr "fromfile_prefix_chars" + +#: ../../library/argparse.rst:422 +msgid "" +"Sometimes, when dealing with a particularly long argument list, it may make " +"sense to keep the list of arguments in a file rather than typing it out at " +"the command line. If the ``fromfile_prefix_chars=`` argument is given to " +"the :class:`ArgumentParser` constructor, then arguments that start with any " +"of the specified characters will be treated as files, and will be replaced " +"by the arguments they contain. For example::" +msgstr "" +"在某些时候,如在处理一个特别长的参数列表时,把参数列表保存在一个文件中而不是在命令行中打印出来会更有意义。如果提供 " +"``fromfile_prefix_chars=`` 参数给 :class:`ArgumentParser` " +"构造器,则任何以指定字符打头的参数都将被当作文件来处理,并将被它们包含的参数所替代。举例来说::" + +#: ../../library/argparse.rst:429 +msgid "" +">>> with open('args.txt', 'w', encoding=sys.getfilesystemencoding()) as fp:\n" +"... fp.write('-f\\nbar')\n" +"...\n" +">>> parser = argparse.ArgumentParser(fromfile_prefix_chars='@')\n" +">>> parser.add_argument('-f')\n" +">>> parser.parse_args(['-f', 'foo', '@args.txt'])\n" +"Namespace(f='bar')" +msgstr "" +">>> with open('args.txt', 'w', encoding=sys.getfilesystemencoding()) as fp:\n" +"... fp.write('-f\\nbar')\n" +"...\n" +">>> parser = argparse.ArgumentParser(fromfile_prefix_chars='@')\n" +">>> parser.add_argument('-f')\n" +">>> parser.parse_args(['-f', 'foo', '@args.txt'])\n" +"Namespace(f='bar')" + +#: ../../library/argparse.rst:437 +msgid "" +"Arguments read from a file must be one per line by default (but see also " +":meth:`~ArgumentParser.convert_arg_line_to_args`) and are treated as if they" +" were in the same place as the original file referencing argument on the " +"command line. So in the example above, the expression ``['-f', 'foo', " +"'@args.txt']`` is considered equivalent to the expression ``['-f', 'foo', " +"'-f', 'bar']``." +msgstr "" +"从文件读取的参数在默认情况下必须一个一行 (但是可参见 " +":meth:`~ArgumentParser.convert_arg_line_to_args`) " +"并且它们被视为与命令行上的原始文件引用参数位于同一位置。所以在以上例子中,``['-f', 'foo', '@args.txt']`` 的表达式和 " +"``['-f', 'foo', '-f', 'bar']`` 的表达式相同。" + +#: ../../library/argparse.rst:445 +msgid "" +"Each line is treated as a single argument, so an empty line is read as an " +"empty string (``''``)." +msgstr "" + +#: ../../library/argparse.rst:448 +msgid "" +":class:`ArgumentParser` uses :term:`filesystem encoding and error handler` " +"to read the file containing arguments." +msgstr "" +":class:`ArgumentParser` 使用 :term:`filesystem encoding and error handler` " +"来读取包含参数的文件。" + +#: ../../library/argparse.rst:451 +msgid "" +"The ``fromfile_prefix_chars=`` argument defaults to ``None``, meaning that " +"arguments will never be treated as file references." +msgstr "``fromfile_prefix_chars=`` 参数默认为 ``None``,意味着参数不会被当作文件对待。" + +#: ../../library/argparse.rst:454 +msgid "" +":class:`ArgumentParser` changed encoding and errors to read arguments files " +"from default (e.g. :func:`locale.getpreferredencoding(False) " +"` and ``\"strict\"``) to the :term:`filesystem " +"encoding and error handler`. Arguments file should be encoded in UTF-8 " +"instead of ANSI Codepage on Windows." +msgstr "" +":class:`ArgumentParser` 将读取参数的编码格式和错误处理方式从默认值 (即 " +":func:`locale.getpreferredencoding(False) ` 和 " +"``\"strict\"``) 改为 :term:`filesystem encoding and error handler`。在 Windows " +"上参数文件应当以 UTF-8 而不是 ANSI 代码页来编码。" + +#: ../../library/argparse.rst:462 +msgid "argument_default" +msgstr "argument_default" + +#: ../../library/argparse.rst:464 +msgid "" +"Generally, argument defaults are specified either by passing a default to " +":meth:`~ArgumentParser.add_argument` or by calling the " +":meth:`~ArgumentParser.set_defaults` methods with a specific set of name-" +"value pairs. Sometimes however, it may be useful to specify a single " +"parser-wide default for arguments. This can be accomplished by passing the " +"``argument_default=`` keyword argument to :class:`ArgumentParser`. For " +"example, to globally suppress attribute creation on " +":meth:`~ArgumentParser.parse_args` calls, we supply " +"``argument_default=SUPPRESS``::" +msgstr "" +"一般情况下,参数默认会通过设置一个默认到 :meth:`~ArgumentParser.add_argument` 或者调用带一组指定键值对的 " +":meth:`ArgumentParser.set_defaults` 方法。但是有些时候,为参数指定一个普遍适用的解析器会更有用。这能够通过传入 " +"``argument_default=`` 关键字参数给 :class:`ArgumentParser` 来完成。例如,要全局禁止在 " +":meth:`~ArgumentParser.parse_args` 中创建属性,我们提供 " +"``argument_default=SUPPRESS``::" + +#: ../../library/argparse.rst:473 +msgid "" +">>> parser = argparse.ArgumentParser(argument_default=argparse.SUPPRESS)\n" +">>> parser.add_argument('--foo')\n" +">>> parser.add_argument('bar', nargs='?')\n" +">>> parser.parse_args(['--foo', '1', 'BAR'])\n" +"Namespace(bar='BAR', foo='1')\n" +">>> parser.parse_args([])\n" +"Namespace()" +msgstr "" +">>> parser = argparse.ArgumentParser(argument_default=argparse.SUPPRESS)\n" +">>> parser.add_argument('--foo')\n" +">>> parser.add_argument('bar', nargs='?')\n" +">>> parser.parse_args(['--foo', '1', 'BAR'])\n" +"Namespace(bar='BAR', foo='1')\n" +">>> parser.parse_args([])\n" +"Namespace()" + +#: ../../library/argparse.rst:484 +msgid "allow_abbrev" +msgstr "allow_abbrev" + +#: ../../library/argparse.rst:486 +msgid "" +"Normally, when you pass an argument list to the " +":meth:`~ArgumentParser.parse_args` method of an :class:`ArgumentParser`, it " +":ref:`recognizes abbreviations ` of long options." +msgstr "" +"正常情况下,当你向 :class:`ArgumentParser` 的 :meth:`~ArgumentParser.parse_args` " +"方法传入一个参数列表时,它会 :ref:`识别长选项的缩写 `。" + +#: ../../library/argparse.rst:490 +msgid "" +"This feature can be disabled by setting ``allow_abbrev`` to ``False``::" +msgstr "这个特性可以设置 ``allow_abbrev`` 为 ``False`` 来关闭::" + +#: ../../library/argparse.rst:492 +msgid "" +">>> parser = argparse.ArgumentParser(prog='PROG', allow_abbrev=False)\n" +">>> parser.add_argument('--foobar', action='store_true')\n" +">>> parser.add_argument('--foonley', action='store_false')\n" +">>> parser.parse_args(['--foon'])\n" +"usage: PROG [-h] [--foobar] [--foonley]\n" +"PROG: error: unrecognized arguments: --foon" +msgstr "" +">>> parser = argparse.ArgumentParser(prog='PROG', allow_abbrev=False)\n" +">>> parser.add_argument('--foobar', action='store_true')\n" +">>> parser.add_argument('--foonley', action='store_false')\n" +">>> parser.parse_args(['--foon'])\n" +"usage: PROG [-h] [--foobar] [--foonley]\n" +"PROG: error: unrecognized arguments: --foon" + +#: ../../library/argparse.rst:503 +msgid "conflict_handler" +msgstr "conflict_handler" + +#: ../../library/argparse.rst:505 +msgid "" +":class:`ArgumentParser` objects do not allow two actions with the same " +"option string. By default, :class:`ArgumentParser` objects raise an " +"exception if an attempt is made to create an argument with an option string " +"that is already in use::" +msgstr "" +":class:`ArgumentParser` 对象不允许在相同选项字符串下有两种行为。默认情况下, :class:`ArgumentParser` " +"对象会产生一个异常如果去创建一个正在使用的选项字符串参数::" + +#: ../../library/argparse.rst:510 +msgid "" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> parser.add_argument('-f', '--foo', help='old foo help')\n" +">>> parser.add_argument('--foo', help='new foo help')\n" +"Traceback (most recent call last):\n" +" ..\n" +"ArgumentError: argument --foo: conflicting option string(s): --foo" +msgstr "" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> parser.add_argument('-f', '--foo', help='old foo help')\n" +">>> parser.add_argument('--foo', help='new foo help')\n" +"Traceback (most recent call last):\n" +" ..\n" +"ArgumentError: argument --foo: conflicting option string(s): --foo" + +#: ../../library/argparse.rst:517 +msgid "" +"Sometimes (e.g. when using parents_) it may be useful to simply override any" +" older arguments with the same option string. To get this behavior, the " +"value ``'resolve'`` can be supplied to the ``conflict_handler=`` argument of" +" :class:`ArgumentParser`::" +msgstr "" +"有些时候(例如:使用 parents_),重写旧的有相同选项字符串的参数会更有用。为了产生这种行为,``'resolve'`` 值可以提供给 " +":class:`ArgumentParser` 的 ``conflict_handler=`` 参数::" + +#: ../../library/argparse.rst:522 +msgid "" +">>> parser = argparse.ArgumentParser(prog='PROG', conflict_handler='resolve')\n" +">>> parser.add_argument('-f', '--foo', help='old foo help')\n" +">>> parser.add_argument('--foo', help='new foo help')\n" +">>> parser.print_help()\n" +"usage: PROG [-h] [-f FOO] [--foo FOO]\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" -f FOO old foo help\n" +" --foo FOO new foo help" +msgstr "" +">>> parser = argparse.ArgumentParser(prog='PROG', conflict_handler='resolve')\n" +">>> parser.add_argument('-f', '--foo', help='old foo help')\n" +">>> parser.add_argument('--foo', help='new foo help')\n" +">>> parser.print_help()\n" +"usage: PROG [-h] [-f FOO] [--foo FOO]\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" -f FOO old foo help\n" +" --foo FOO new foo help" + +#: ../../library/argparse.rst:533 +msgid "" +"Note that :class:`ArgumentParser` objects only remove an action if all of " +"its option strings are overridden. So, in the example above, the old " +"``-f/--foo`` action is retained as the ``-f`` action, because only the " +"``--foo`` option string was overridden." +msgstr "" +"注意 :class:`ArgumentParser` 对象只能在一个动作的所有选项字符串都被重写时才会移除它。所以,在上面的例子中,旧的 " +"``-f/--foo`` 动作会与 ``-f`` 动作保持一致,因为只有 ``--foo`` 选项字符串被重写。" + +#: ../../library/argparse.rst:540 +msgid "add_help" +msgstr "add_help" + +#: ../../library/argparse.rst:542 +msgid "" +"By default, :class:`ArgumentParser` objects add an option which simply " +"displays the parser's help message. If ``-h`` or ``--help`` is supplied at " +"the command line, the :class:`!ArgumentParser` help will be printed." +msgstr "" +"在默认情况下,:class:`ArgumentParser` 对象会添加一个简单地显示解析器的帮助消息的选项。如果在命令行中提供了 ``-h`` 或 " +"``--help``,则会打印 :class:`!ArgumentParser` 帮助消息。" + +#: ../../library/argparse.rst:546 +msgid "" +"Occasionally, it may be useful to disable the addition of this help option. " +"This can be achieved by passing ``False`` as the ``add_help=`` argument to " +":class:`ArgumentParser`::" +msgstr "" +"有时候可能会需要关闭额外的帮助信息。这可以通过在 :class:`ArgumentParser` 中设置 ``add_help=`` 参数为 " +"``False`` 来实现::" + +#: ../../library/argparse.rst:550 +msgid "" +">>> parser = argparse.ArgumentParser(prog='PROG', add_help=False)\n" +">>> parser.add_argument('--foo', help='foo help')\n" +">>> parser.print_help()\n" +"usage: PROG [--foo FOO]\n" +"\n" +"options:\n" +" --foo FOO foo help" +msgstr "" +">>> parser = argparse.ArgumentParser(prog='PROG', add_help=False)\n" +">>> parser.add_argument('--foo', help='foo help')\n" +">>> parser.print_help()\n" +"usage: PROG [--foo FOO]\n" +"\n" +"options:\n" +" --foo FOO foo help" + +#: ../../library/argparse.rst:558 +msgid "" +"The help option is typically ``-h/--help``. The exception to this is if the " +"``prefix_chars=`` is specified and does not include ``-``, in which case " +"``-h`` and ``--help`` are not valid options. In this case, the first " +"character in ``prefix_chars`` is used to prefix the help options::" +msgstr "" +"帮助选项一般为 ``-h/--help``。如果 ``prefix_chars=`` 被指定并且没有包含 ``-`` 字符,在这种情况下,``-h`` " +"``--help`` 不是有效的选项。此时,``prefix_chars`` 的第一个字符将用作帮助选项的前缀::" + +#: ../../library/argparse.rst:564 +msgid "" +">>> parser = argparse.ArgumentParser(prog='PROG', prefix_chars='+/')\n" +">>> parser.print_help()\n" +"usage: PROG [+h]\n" +"\n" +"options:\n" +" +h, ++help show this help message and exit" +msgstr "" +">>> parser = argparse.ArgumentParser(prog='PROG', prefix_chars='+/')\n" +">>> parser.print_help()\n" +"usage: PROG [+h]\n" +"\n" +"options:\n" +" +h, ++help show this help message and exit" + +#: ../../library/argparse.rst:573 +msgid "exit_on_error" +msgstr "exit_on_error" + +#: ../../library/argparse.rst:575 +msgid "" +"Normally, when you pass an invalid argument list to the " +":meth:`~ArgumentParser.parse_args` method of an :class:`ArgumentParser`, it " +"will print a *message* to :data:`sys.stderr` and exit with a status code of " +"2." +msgstr "" +"通常,当你向 :class:`ArgumentParser` 的 :meth:`~ArgumentParser.parse_args` " +"方法传入一个无效的参数列表时,它会将 *message* 打印到 :data:`sys.stderr` 并附带状态码 2 退出程序。" + +#: ../../library/argparse.rst:579 +msgid "" +"If the user would like to catch errors manually, the feature can be enabled " +"by setting ``exit_on_error`` to ``False``::" +msgstr "如果用户想要手动捕获错误,可通过将 ``exit_on_error`` 设为 ``False`` 来启用该特性::" + +#: ../../library/argparse.rst:582 +msgid "" +">>> parser = argparse.ArgumentParser(exit_on_error=False)\n" +">>> parser.add_argument('--integers', type=int)\n" +"_StoreAction(option_strings=['--integers'], dest='integers', nargs=None, const=None, default=None, type=, choices=None, help=None, metavar=None)\n" +">>> try:\n" +"... parser.parse_args('--integers a'.split())\n" +"... except argparse.ArgumentError:\n" +"... print('Catching an argumentError')\n" +"...\n" +"Catching an argumentError" +msgstr "" +">>> parser = argparse.ArgumentParser(exit_on_error=False)\n" +">>> parser.add_argument('--integers', type=int)\n" +"_StoreAction(option_strings=['--integers'], dest='integers', nargs=None, const=None, default=None, type=, choices=None, help=None, metavar=None)\n" +">>> try:\n" +"... parser.parse_args('--integers a'.split())\n" +"... except argparse.ArgumentError:\n" +"... print('Catching an argumentError')\n" +"...\n" +"Catching an argumentError" + +#: ../../library/argparse.rst:595 +msgid "suggest_on_error" +msgstr "suggest_on_error" + +#: ../../library/argparse.rst:597 +msgid "" +"By default, when a user passes an invalid argument choice or subparser name," +" :class:`ArgumentParser` will exit with error info and list the permissible " +"argument choices (if specified) or subparser names as part of the error " +"message." +msgstr "" +"默认情况下,当用户传递无效的参数选择或子解析器名称时,:class:`ArgumentParser` " +"将退出并显示错误信息,并列出允许的参数选择(如果指定)或子解析器名称作为错误消息的一部分。" + +#: ../../library/argparse.rst:601 +msgid "" +"If the user would like to enable suggestions for mistyped argument choices " +"and subparser names, the feature can be enabled by setting " +"``suggest_on_error`` to ``True``. Note that this only applies for arguments " +"when the choices specified are strings::" +msgstr "" +"如果用户希望启用对输入错误的参数选择和子解析器名称的建议,可以通过将 ``suggest_on_error`` 设置为 ``True`` " +"来启用该特性。注意,这只适用于指定的选择是字符串的参数::" + +#: ../../library/argparse.rst:606 +msgid "" +">>> parser = argparse.ArgumentParser(suggest_on_error=True)\n" +">>> parser.add_argument('--action', choices=['debug', 'dryrun'])\n" +">>> parser.parse_args(['--action', 'debugg'])\n" +"usage: tester.py [-h] [--action {debug,dryrun}]\n" +"tester.py: error: argument --action: invalid choice: 'debugg', maybe you meant 'debug'? (choose from debug, dryrun)" +msgstr "" +">>> parser = argparse.ArgumentParser(suggest_on_error=True)\n" +">>> parser.add_argument('--action', choices=['debug', 'dryrun'])\n" +">>> parser.parse_args(['--action', 'debugg'])\n" +"usage: tester.py [-h] [--action {debug,dryrun}]\n" +"tester.py: error: argument --action: invalid choice: 'debugg', maybe you meant 'debug'? (choose from debug, dryrun)" + +#: ../../library/argparse.rst:612 +msgid "" +"If you're writing code that needs to be compatible with older Python " +"versions and want to opportunistically use ``suggest_on_error`` when it's " +"available, you can set it as an attribute after initializing the parser " +"instead of using the keyword argument::" +msgstr "" +"如果你正在编写需要与旧版本的 Python 兼容的代码,并希望在可用时使用 " +"``suggest_on_error``,你可以在初始化解析器后将其设置为属性,而不是使用关键字参数::" + +#: ../../library/argparse.rst:617 +msgid "" +">>> parser = argparse.ArgumentParser(description='Process some integers.')\n" +">>> parser.suggest_on_error = True" +msgstr "" +">>> parser = argparse.ArgumentParser(description='Process some integers.')\n" +">>> parser.suggest_on_error = True" + +#: ../../library/argparse.rst:624 +msgid "color" +msgstr "color" + +#: ../../library/argparse.rst:626 +msgid "" +"By default, the help message is printed in color using `ANSI escape " +"sequences `__. If you want " +"plain text help messages, you can disable this :ref:`in your local " +"environment `, or in the argument parser itself " +"by setting ``color`` to ``False``::" +msgstr "" +"默认情况下,帮助信息会使用 `ANSI 转义序列 `__" +" 以彩色形式输出。如果你需要纯文本格式的帮助信息,可以 :ref:`在你的本地环境中 ` " +"禁用此功能,或者在参数解析器中通过将 ``color`` 参数设置为 ``False`` 来实现::" + +#: ../../library/argparse.rst:632 +msgid "" +">>> parser = argparse.ArgumentParser(description='Process some integers.',\n" +"... color=False)\n" +">>> parser.add_argument('--action', choices=['sum', 'max'])\n" +">>> parser.add_argument('integers', metavar='N', type=int, nargs='+',\n" +"... help='an integer for the accumulator')\n" +">>> parser.parse_args(['--help'])" +msgstr "" +">>> parser = argparse.ArgumentParser(description='处理一些整数。',\n" +"... color=False)\n" +">>> parser.add_argument('--action', choices=['sum', 'max'])\n" +">>> parser.add_argument('integers', metavar='N', type=int, nargs='+',\n" +"... help='一个用于累加器的整数值')\n" +">>> parser.parse_args(['--help'])" + +#: ../../library/argparse.rst:639 +msgid "" +"Note that when ``color=True``, colored output depends on both environment " +"variables and terminal capabilities. However, if ``color=False``, colored " +"output is always disabled, even if environment variables like " +"``FORCE_COLOR`` are set." +msgstr "" +"请注意当 ``color=True`` 时,彩色输出效果同时取决于环境变量和终端功能。不过,如果 " +"``color=False``,彩色输出将始终被禁用,即使设置了 ``FORCE_COLOR`` 等环境变量。" + +#: ../../library/argparse.rst:646 +msgid "" +"Error messages will include color codes when redirecting stderr to a file. " +"To avoid this, set the |NO_COLOR|_ or :envvar:`PYTHON_COLORS` environment " +"variable (for example, ``NO_COLOR=1 python script.py 2> errors.txt``)." +msgstr "" +"在把 stderr 重定向到文件时错误消息将包括颜色代码。要避免此问题,可以设置 |NO_COLOR|_ 或 " +":envvar:`PYTHON_COLORS` 环境变量 (例如,``NO_COLOR=1 python script.py 2> " +"errors.txt``)." + +#: ../../library/argparse.rst:655 +msgid "The add_argument() method" +msgstr "add_argument() 方法" + +#: ../../library/argparse.rst:661 +msgid "" +"Define how a single command-line argument should be parsed. Each parameter " +"has its own more detailed description below, but in short they are:" +msgstr "定义单个的命令行参数应当如何解析。每个形参都在下面有它自己更多的描述,长话短说有:" + +#: ../../library/argparse.rst:664 +msgid "" +"`name or flags`_ - Either a name or a list of option strings, e.g. ``'foo'``" +" or ``'-f', '--foo'``." +msgstr "" +"`name or flags`_ - 一个名称或是由选项字符串组成的列表,例如 ``'foo'`` 或 ``'-f', '--foo'``。" + +#: ../../library/argparse.rst:667 +msgid "" +"action_ - The basic type of action to be taken when this argument is " +"encountered at the command line." +msgstr "action_ - 当参数在命令行中出现时使用的动作基本类型。" + +#: ../../library/argparse.rst:670 +msgid "nargs_ - The number of command-line arguments that should be consumed." +msgstr "nargs_ - 命令行参数应当消耗的数目。" + +#: ../../library/argparse.rst:672 +msgid "" +"const_ - A constant value required by some action_ and nargs_ selections." +msgstr "const_ - 被一些 action_ 和 nargs_ 选择所需求的常数。" + +#: ../../library/argparse.rst:674 +msgid "" +"default_ - The value produced if the argument is absent from the command " +"line and if it is absent from the namespace object." +msgstr "default_ - 当参数未在命令行中出现并且也不存在于命名空间对象时所产生的值。" + +#: ../../library/argparse.rst:677 +msgid "" +"type_ - The type to which the command-line argument should be converted." +msgstr "type_ - 命令行参数应当被转换成的类型。" + +#: ../../library/argparse.rst:679 +msgid "choices_ - A sequence of the allowable values for the argument." +msgstr "choices_ - 由允许作为参数的值组成的序列。" + +#: ../../library/argparse.rst:681 +msgid "" +"required_ - Whether or not the command-line option may be omitted (optionals" +" only)." +msgstr "required_ - 此命令行选项是否可省略(仅选项可用)。" + +#: ../../library/argparse.rst:684 +msgid "help_ - A brief description of what the argument does." +msgstr "help_ - 一个此选项作用的简单描述。" + +#: ../../library/argparse.rst:686 +msgid "metavar_ - A name for the argument in usage messages." +msgstr "metavar_ - 在使用方法消息中使用的参数值示例。" + +#: ../../library/argparse.rst:688 +msgid "" +"dest_ - The name of the attribute to be added to the object returned by " +":meth:`parse_args`." +msgstr "dest_ - 被添加到 :meth:`parse_args` 所返回对象上的属性名。" + +#: ../../library/argparse.rst:691 +msgid "deprecated_ - Whether or not use of the argument is deprecated." +msgstr "deprecated_ - 参数的使用是否已被弃用。" + +#: ../../library/argparse.rst:693 +msgid "" +"The method returns an :class:`Action` object representing the argument." +msgstr "此方法将返回一个代表参数内容的 :class:`Action` 对象。" + +#: ../../library/argparse.rst:701 +msgid "name or flags" +msgstr "name or flags" + +#: ../../library/argparse.rst:703 +msgid "" +"The :meth:`~ArgumentParser.add_argument` method must know whether an " +"optional argument, like ``-f`` or ``--foo``, or a positional argument, like " +"a list of filenames, is expected. The first arguments passed to " +":meth:`~ArgumentParser.add_argument` must therefore be either a series of " +"flags, or a simple argument name." +msgstr "" +":meth:`~ArgumentParser.add_argument` 方法必须知道是要接收一个可选参数,如 ``-f`` 或 " +"``--foo``,还是一个位置参数,如由文件名组成的列表。因此首先传递给 :meth:`~ArgumentParser.add_argument` " +"的参数必须是一组旗标,或一个简单的参数名称。" + +#: ../../library/argparse.rst:709 +msgid "For example, an optional argument could be created like::" +msgstr "例如,可以这样创建可选参数::" + +#: ../../library/argparse.rst:711 +msgid ">>> parser.add_argument('-f', '--foo')" +msgstr ">>> parser.add_argument('-f', '--foo')" + +#: ../../library/argparse.rst:713 +msgid "while a positional argument could be created like::" +msgstr "而位置参数可以这么创建::" + +#: ../../library/argparse.rst:715 +msgid ">>> parser.add_argument('bar')" +msgstr ">>> parser.add_argument('bar')" + +#: ../../library/argparse.rst:717 +msgid "" +"When :meth:`~ArgumentParser.parse_args` is called, optional arguments will " +"be identified by the ``-`` prefix, and the remaining arguments will be " +"assumed to be positional::" +msgstr "" +"当 :meth:`~ArgumentParser.parse_args` 被调用,选项会以 ``-`` 前缀识别,剩下的参数则会被假定为位置参数::" + +#: ../../library/argparse.rst:721 +msgid "" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> parser.add_argument('-f', '--foo')\n" +">>> parser.add_argument('bar')\n" +">>> parser.parse_args(['BAR'])\n" +"Namespace(bar='BAR', foo=None)\n" +">>> parser.parse_args(['BAR', '--foo', 'FOO'])\n" +"Namespace(bar='BAR', foo='FOO')\n" +">>> parser.parse_args(['--foo', 'FOO'])\n" +"usage: PROG [-h] [-f FOO] bar\n" +"PROG: error: the following arguments are required: bar" +msgstr "" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> parser.add_argument('-f', '--foo')\n" +">>> parser.add_argument('bar')\n" +">>> parser.parse_args(['BAR'])\n" +"Namespace(bar='BAR', foo=None)\n" +">>> parser.parse_args(['BAR', '--foo', 'FOO'])\n" +"Namespace(bar='BAR', foo='FOO')\n" +">>> parser.parse_args(['--foo', 'FOO'])\n" +"usage: PROG [-h] [-f FOO] bar\n" +"PROG: error: the following arguments are required: bar" + +#: ../../library/argparse.rst:732 +msgid "" +"By default, :mod:`!argparse` automatically handles the internal naming and " +"display names of arguments, simplifying the process without requiring " +"additional configuration. As such, you do not need to specify the dest_ and " +"metavar_ parameters. For optional arguments, the dest_ parameter defaults to" +" the argument name, with underscores ``_`` replacing hyphens ``-``. The " +"metavar_ parameter defaults to the upper-cased name. For example::" +msgstr "" +"在默认情况下,:mod:`!argparse` 会自动处理参数的内部命名和显示名称,简化相关过程而无需额外配置。 因此,你不需要指定 dest_ 和 " +"metavar_ 形参。 对于可选参数,dest_ 形参默认为参数名,用下划线 ``_`` 替换连字符 ``-``。 metavar_ " +"形参默认为大写的名称。 例如::" + +#: ../../library/argparse.rst:740 +msgid "" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> parser.add_argument('--foo-bar')\n" +">>> parser.parse_args(['--foo-bar', 'FOO-BAR'])\n" +"Namespace(foo_bar='FOO-BAR')\n" +">>> parser.print_help()\n" +"usage: [-h] [--foo-bar FOO-BAR]\n" +"\n" +"optional arguments:\n" +" -h, --help show this help message and exit\n" +" --foo-bar FOO-BAR" +msgstr "" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> parser.add_argument('--foo-bar')\n" +">>> parser.parse_args(['--foo-bar', 'FOO-BAR'])\n" +"Namespace(foo_bar='FOO-BAR')\n" +">>> parser.print_help()\n" +"usage: [-h] [--foo-bar FOO-BAR]\n" +"\n" +"optional arguments:\n" +" -h, --help show this help message and exit\n" +" --foo-bar FOO-BAR" + +#: ../../library/argparse.rst:755 +msgid "action" +msgstr "action" + +#: ../../library/argparse.rst:757 +msgid "" +":class:`ArgumentParser` objects associate command-line arguments with " +"actions. These actions can do just about anything with the command-line " +"arguments associated with them, though most actions simply add an attribute " +"to the object returned by :meth:`~ArgumentParser.parse_args`. The " +"``action`` keyword argument specifies how the command-line arguments should " +"be handled. The supplied actions are:" +msgstr "" +":class:`ArgumentParser` 对象将命令行参数与动作相关联。这些动作可以做与它们相关联的命令行参数的任何事,尽管大多数动作只是简单的向" +" :meth:`~ArgumentParser.parse_args` 返回的对象上添加属性。``action`` " +"命名参数指定了这个命令行参数应当如何处理。可用的动作有:" + +#: ../../library/argparse.rst:763 +msgid "" +"``'store'`` - This just stores the argument's value. This is the default " +"action." +msgstr "``'store'`` - 这用于存储参数的值。这是默认的动作。" + +#: ../../library/argparse.rst:766 +msgid "" +"``'store_const'`` - This stores the value specified by the const_ keyword " +"argument; note that the const_ keyword argument defaults to ``None``. The " +"``'store_const'`` action is most commonly used with optional arguments that " +"specify some sort of flag. For example::" +msgstr "" +"``'store_const'`` - 存储由 const_ 关键字参数指定的值;请注意 const_ 关键字参数默认为 " +"``None``。``'store_const'`` 动作最常被用于指定某类旗标的可选参数。例如::" + +#: ../../library/argparse.rst:771 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', action='store_const', const=42)\n" +">>> parser.parse_args(['--foo'])\n" +"Namespace(foo=42)" +msgstr "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', action='store_const', const=42)\n" +">>> parser.parse_args(['--foo'])\n" +"Namespace(foo=42)" + +#: ../../library/argparse.rst:776 +msgid "" +"``'store_true'`` and ``'store_false'`` - These are special cases of " +"``'store_const'`` that respectively store the values ``True`` and ``False`` " +"with default values of ``False`` and ``True``::" +msgstr "" +"``'store_true'`` 和 ``'store_false'`` - 这些是 ``'store_const'`` 分别用于存储 ``True``" +" 和 ``False`` 的特例,其默认值为 ``False`` 和 ``True``::" + +#: ../../library/argparse.rst:781 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', action='store_true')\n" +">>> parser.add_argument('--bar', action='store_false')\n" +">>> parser.add_argument('--baz', action='store_false')\n" +">>> parser.parse_args('--foo --bar'.split())\n" +"Namespace(foo=True, bar=False, baz=True)" +msgstr "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', action='store_true')\n" +">>> parser.add_argument('--bar', action='store_false')\n" +">>> parser.add_argument('--baz', action='store_false')\n" +">>> parser.parse_args('--foo --bar'.split())\n" +"Namespace(foo=True, bar=False, baz=True)" + +#: ../../library/argparse.rst:788 +msgid "" +"``'append'`` - This appends each argument value to a list. It is useful for " +"allowing an option to be specified multiple times. If the default value is a" +" non-empty list, the parsed value will start with the default list's " +"elements and any values from the command line will be appended after those " +"default values. Example usage::" +msgstr "" +"``'append'`` - " +"这会将各个参数值添加到列表。它适用于允许一个选项被多次指定的情况。如果默认值是一个非空列表,则被解析的值将以默认列表的元素打头而任何来自命令行的值将添加到这些默认值之后。示例用法::" + +#: ../../library/argparse.rst:794 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', action='append', default=['0'])\n" +">>> parser.parse_args('--foo 1 --foo 2'.split())\n" +"Namespace(foo=['0', '1', '2'])" +msgstr "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', action='append', default=['0'])\n" +">>> parser.parse_args('--foo 1 --foo 2'.split())\n" +"Namespace(foo=['0', '1', '2'])" + +#: ../../library/argparse.rst:799 +msgid "" +"``'append_const'`` - This appends the value specified by the const_ keyword " +"argument to a list; note that the const_ keyword argument defaults to " +"``None``. The ``'append_const'`` action is typically useful when multiple " +"arguments need to store constants to the same list. For example::" +msgstr "" +"``'append_const'`` - 这会将由 const_ 关键字参数指定的值添加到一个列表;请注意 const_ 关键字参数默认为 " +"``None``。``'append_const'`` 动作通常适用于多个参数需要将常量存储到同一个列表的场合。例如::" + +#: ../../library/argparse.rst:805 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--str', dest='types', action='append_const', const=str)\n" +">>> parser.add_argument('--int', dest='types', action='append_const', const=int)\n" +">>> parser.parse_args('--str --int'.split())\n" +"Namespace(types=[, ])" +msgstr "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--str', dest='types', action='append_const', const=str)\n" +">>> parser.add_argument('--int', dest='types', action='append_const', const=int)\n" +">>> parser.parse_args('--str --int'.split())\n" +"Namespace(types=[, ])" + +#: ../../library/argparse.rst:811 +msgid "" +"``'extend'`` - This appends each item from a multi-value argument to a list." +" The ``'extend'`` action is typically used with the nargs_ keyword argument " +"value ``'+'`` or ``'*'``. Note that when nargs_ is ``None`` (the default) or" +" ``'?'``, each character of the argument string will be appended to the " +"list. Example usage::" +msgstr "" +"``'extend'`` - 这会将来自多值参数的每个条目添加到一个列表。``'extend'`` 动作通常配合 nargs_ 关键字参数值 " +"``'+'`` 或 ``'*'`` 使用。请注意当 nargs_ 为 ``None`` (默认值) 或 ``'?'`` " +"时,参数字符串的每个字符都将被添加到列表。示例用法::" + +#: ../../library/argparse.rst:819 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument(\"--foo\", action=\"extend\", nargs=\"+\", type=str)\n" +">>> parser.parse_args([\"--foo\", \"f1\", \"--foo\", \"f2\", \"f3\", \"f4\"])\n" +"Namespace(foo=['f1', 'f2', 'f3', 'f4'])" +msgstr "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument(\"--foo\", action=\"extend\", nargs=\"+\", type=str)\n" +">>> parser.parse_args([\"--foo\", \"f1\", \"--foo\", \"f2\", \"f3\", \"f4\"])\n" +"Namespace(foo=['f1', 'f2', 'f3', 'f4'])" + +#: ../../library/argparse.rst:826 +msgid "" +"``'count'`` - This counts the number of times an argument occurs. For " +"example, this is useful for increasing verbosity levels::" +msgstr "``'count'`` - 这将统计一个参数出现的次数。例如,这适用于递增详情级别::" + +#: ../../library/argparse.rst:829 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--verbose', '-v', action='count', default=0)\n" +">>> parser.parse_args(['-vvv'])\n" +"Namespace(verbose=3)" +msgstr "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--verbose', '-v', action='count', default=0)\n" +">>> parser.parse_args(['-vvv'])\n" +"Namespace(verbose=3)" + +#: ../../library/argparse.rst:834 +msgid "Note, the *default* will be ``None`` unless explicitly set to *0*." +msgstr "请注意,*default* 将为 ``None``,除非显式地设为 *0*。" + +#: ../../library/argparse.rst:836 +msgid "" +"``'help'`` - This prints a complete help message for all the options in the " +"current parser and then exits. By default a help action is automatically " +"added to the parser. See :class:`ArgumentParser` for details of how the " +"output is created." +msgstr "" +"``'help'`` - 打印所有当前解析器中的选项和参数的完整帮助信息,然后退出。默认情况下,一个 help " +"动作会被自动加入解析器。关于输出是如何创建的,参阅 :class:`ArgumentParser`。" + +#: ../../library/argparse.rst:841 +msgid "" +"``'version'`` - This expects a ``version=`` keyword argument in the " +":meth:`~ArgumentParser.add_argument` call, and prints version information " +"and exits when invoked::" +msgstr "" +"``'version'`` - 期望有一个 ``version=`` 命名参数在 " +":meth:`~ArgumentParser.add_argument` 调用中,并打印版本信息并在调用后退出::" + +#: ../../library/argparse.rst:845 +msgid "" +">>> import argparse\n" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> parser.add_argument('--version', action='version', version='%(prog)s 2.0')\n" +">>> parser.parse_args(['--version'])\n" +"PROG 2.0" +msgstr "" +">>> import argparse\n" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> parser.add_argument('--version', action='version', version='%(prog)s 2.0')\n" +">>> parser.parse_args(['--version'])\n" +"PROG 2.0" + +#: ../../library/argparse.rst:851 +msgid "" +"You may also specify an arbitrary action by passing an :class:`Action` " +"subclass (e.g. :class:`BooleanOptionalAction`) or other object that " +"implements the same interface. Only actions that consume command-line " +"arguments (e.g. ``'store'``, ``'append'``, ``'extend'``, or custom actions " +"with non-zero ``nargs``) can be used with positional arguments." +msgstr "" +"你也可以通过传递一个 :class:`Action` 子类 (例如 :class:`BooleanOptionalAction`) " +"或实现相同接口的其他对象来指定任意操作。需要注意的是,只有那些会消耗命令行参数的操作(例如 " +"``'store'``、``'append'``、``'extend'``,或是设置了非零 ``nargs`` 值的自定义操作)才能与位置参数一起使用。" + +#: ../../library/argparse.rst:857 +msgid "" +"The recommended way to create a custom action is to extend :class:`Action`, " +"overriding the :meth:`!__call__` method and optionally the :meth:`!__init__`" +" and :meth:`!format_usage` methods. You can also register custom actions " +"using the :meth:`~ArgumentParser.register` method and reference them by " +"their registered name." +msgstr "" +"创建自定义动作的推荐方式是扩展 :class:`Action`,重写 :meth:`!__call__` 方法以及可选的 " +":meth:`!__init__` 和 :meth:`!format_usage` 方法。你还可以使用 " +":meth:`~ArgumentParser.register` 方法注册自定义动作并通过其注册名称来引用它们。" + +#: ../../library/argparse.rst:862 +msgid "An example of a custom action::" +msgstr "一个自定义动作的例子::" + +#: ../../library/argparse.rst:864 +msgid "" +">>> class FooAction(argparse.Action):\n" +"... def __init__(self, option_strings, dest, nargs=None, **kwargs):\n" +"... if nargs is not None:\n" +"... raise ValueError(\"nargs not allowed\")\n" +"... super().__init__(option_strings, dest, **kwargs)\n" +"... def __call__(self, parser, namespace, values, option_string=None):\n" +"... print('%r %r %r' % (namespace, values, option_string))\n" +"... setattr(namespace, self.dest, values)\n" +"...\n" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', action=FooAction)\n" +">>> parser.add_argument('bar', action=FooAction)\n" +">>> args = parser.parse_args('1 --foo 2'.split())\n" +"Namespace(bar=None, foo=None) '1' None\n" +"Namespace(bar='1', foo=None) '2' '--foo'\n" +">>> args\n" +"Namespace(bar='1', foo='2')" +msgstr "" +">>> class FooAction(argparse.Action):\n" +"... def __init__(self, option_strings, dest, nargs=None, **kwargs):\n" +"... if nargs is not None:\n" +"... raise ValueError(\"nargs not allowed\")\n" +"... super().__init__(option_strings, dest, **kwargs)\n" +"... def __call__(self, parser, namespace, values, option_string=None):\n" +"... print('%r %r %r' % (namespace, values, option_string))\n" +"... setattr(namespace, self.dest, values)\n" +"...\n" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', action=FooAction)\n" +">>> parser.add_argument('bar', action=FooAction)\n" +">>> args = parser.parse_args('1 --foo 2'.split())\n" +"Namespace(bar=None, foo=None) '1' None\n" +"Namespace(bar='1', foo=None) '2' '--foo'\n" +">>> args\n" +"Namespace(bar='1', foo='2')" + +#: ../../library/argparse.rst:882 +msgid "For more details, see :class:`Action`." +msgstr "更多描述,见 :class:`Action`。" + +#: ../../library/argparse.rst:888 +msgid "nargs" +msgstr "nargs" + +#: ../../library/argparse.rst:890 +msgid "" +":class:`ArgumentParser` objects usually associate a single command-line " +"argument with a single action to be taken. The ``nargs`` keyword argument " +"associates a different number of command-line arguments with a single " +"action. See also :ref:`specifying-ambiguous-arguments`. The supported values" +" are:" +msgstr "" +":class:`ArgumentParser` 对象通常会将一个单独的命令行参数关联到一个单独的要执行的动作。``nargs`` " +"关键字参数会将不同数量的命令行参数关联到一个单独的动作。另请参阅 :ref:`specifying-ambiguous-" +"arguments`。受支持的值有:" + +#: ../../library/argparse.rst:895 +msgid "" +"``N`` (an integer). ``N`` arguments from the command line will be gathered " +"together into a list. For example::" +msgstr "``N`` (一个整数)。命令行中的 ``N`` 个参数会被聚集到一个列表中。 例如::" + +#: ../../library/argparse.rst:898 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', nargs=2)\n" +">>> parser.add_argument('bar', nargs=1)\n" +">>> parser.parse_args('c --foo a b'.split())\n" +"Namespace(bar=['c'], foo=['a', 'b'])" +msgstr "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', nargs=2)\n" +">>> parser.add_argument('bar', nargs=1)\n" +">>> parser.parse_args('c --foo a b'.split())\n" +"Namespace(bar=['c'], foo=['a', 'b'])" + +#: ../../library/argparse.rst:904 +msgid "" +"Note that ``nargs=1`` produces a list of one item. This is different from " +"the default, in which the item is produced by itself." +msgstr "注意 ``nargs=1`` 会产生一个单元素列表。这和默认的元素本身是不同的。" + +#: ../../library/argparse.rst:909 +msgid "" +"``'?'``. One argument will be consumed from the command line if possible, " +"and produced as a single item. If no command-line argument is present, the " +"value from default_ will be produced. Note that for optional arguments, " +"there is an additional case - the option string is present but not followed " +"by a command-line argument. In this case the value from const_ will be " +"produced. Some examples to illustrate this::" +msgstr "" +"``'?'``。如果可能的话,会从命令行中消耗一个参数,并产生一个单独项。如果当前没有命令行参数,将会产生 default_ " +"值。注意对于可选参数来说,还有一个额外情况 —— 出现了选项字符串但没有跟随命令行参数,在此情况下将会产生 const_ " +"值。一些说明这种情况的例子如下::" + +#: ../../library/argparse.rst:916 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', nargs='?', const='c', default='d')\n" +">>> parser.add_argument('bar', nargs='?', default='d')\n" +">>> parser.parse_args(['XX', '--foo', 'YY'])\n" +"Namespace(bar='XX', foo='YY')\n" +">>> parser.parse_args(['XX', '--foo'])\n" +"Namespace(bar='XX', foo='c')\n" +">>> parser.parse_args([])\n" +"Namespace(bar='d', foo='d')" +msgstr "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', nargs='?', const='c', default='d')\n" +">>> parser.add_argument('bar', nargs='?', default='d')\n" +">>> parser.parse_args(['XX', '--foo', 'YY'])\n" +"Namespace(bar='XX', foo='YY')\n" +">>> parser.parse_args(['XX', '--foo'])\n" +"Namespace(bar='XX', foo='c')\n" +">>> parser.parse_args([])\n" +"Namespace(bar='d', foo='d')" + +#: ../../library/argparse.rst:926 +msgid "" +"One of the more common uses of ``nargs='?'`` is to allow optional input and " +"output files::" +msgstr "``nargs='?'`` 的一个更普遍用法是允许可选的输入或输出文件::" + +#: ../../library/argparse.rst:929 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('infile', nargs='?')\n" +">>> parser.add_argument('outfile', nargs='?')\n" +">>> parser.parse_args(['input.txt', 'output.txt'])\n" +"Namespace(infile='input.txt', outfile='output.txt')\n" +">>> parser.parse_args(['input.txt'])\n" +"Namespace(infile='input.txt', outfile=None)\n" +">>> parser.parse_args([])\n" +"Namespace(infile=None, outfile=None)" +msgstr "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('infile', nargs='?')\n" +">>> parser.add_argument('outfile', nargs='?')\n" +">>> parser.parse_args(['input.txt', 'output.txt'])\n" +"Namespace(infile='input.txt', outfile='output.txt')\n" +">>> parser.parse_args(['input.txt'])\n" +"Namespace(infile='input.txt', outfile=None)\n" +">>> parser.parse_args([])\n" +"Namespace(infile=None, outfile=None)" + +#: ../../library/argparse.rst:941 +msgid "" +"``'*'``. All command-line arguments present are gathered into a list. Note" +" that it generally doesn't make much sense to have more than one positional " +"argument with ``nargs='*'``, but multiple optional arguments with " +"``nargs='*'`` is possible. For example::" +msgstr "" +"``'*'``。所有当前命令行参数被聚集到一个列表中。注意通过 ``nargs='*'`` " +"来实现多个位置参数通常没有意义,但是多个选项是可能的。例如::" + +#: ../../library/argparse.rst:946 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', nargs='*')\n" +">>> parser.add_argument('--bar', nargs='*')\n" +">>> parser.add_argument('baz', nargs='*')\n" +">>> parser.parse_args('a b --foo x y --bar 1 2'.split())\n" +"Namespace(bar=['1', '2'], baz=['a', 'b'], foo=['x', 'y'])" +msgstr "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', nargs='*')\n" +">>> parser.add_argument('--bar', nargs='*')\n" +">>> parser.add_argument('baz', nargs='*')\n" +">>> parser.parse_args('a b --foo x y --bar 1 2'.split())\n" +"Namespace(bar=['1', '2'], baz=['a', 'b'], foo=['x', 'y'])" + +#: ../../library/argparse.rst:955 +msgid "" +"``'+'``. Just like ``'*'``, all command-line arguments present are gathered " +"into a list. Additionally, an error message will be generated if there " +"wasn't at least one command-line argument present. For example::" +msgstr "" +"``'+'``。和 ``'*'`` 类似,所有当前命令行参数被聚集到一个列表中。另外,如果不存在至少一个命令行参数则会生成一条错误消息。例如::" + +#: ../../library/argparse.rst:959 +msgid "" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> parser.add_argument('foo', nargs='+')\n" +">>> parser.parse_args(['a', 'b'])\n" +"Namespace(foo=['a', 'b'])\n" +">>> parser.parse_args([])\n" +"usage: PROG [-h] foo [foo ...]\n" +"PROG: error: the following arguments are required: foo" +msgstr "" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> parser.add_argument('foo', nargs='+')\n" +">>> parser.parse_args(['a', 'b'])\n" +"Namespace(foo=['a', 'b'])\n" +">>> parser.parse_args([])\n" +"usage: PROG [-h] foo [foo ...]\n" +"PROG: error: the following arguments are required: foo" + +#: ../../library/argparse.rst:967 +msgid "" +"If the ``nargs`` keyword argument is not provided, the number of arguments " +"consumed is determined by the action_. Generally this means a single " +"command-line argument will be consumed and a single item (not a list) will " +"be produced. Actions that do not consume command-line arguments (e.g. " +"``'store_const'``) set ``nargs=0``." +msgstr "" +"如果未提供 ``nargs`` 关键字参数,则消耗参数的数量将由 action_ " +"来确定。通常这意味着消耗一个命令行参数并产生一个条目(而非列表)。不消耗命令行参数的动作 (例如 ``'store_const'``) 则要设置 " +"``nargs=0``." + +#: ../../library/argparse.rst:977 +msgid "const" +msgstr "const" + +#: ../../library/argparse.rst:979 +msgid "" +"The ``const`` argument of :meth:`~ArgumentParser.add_argument` is used to " +"hold constant values that are not read from the command line but are " +"required for the various :class:`ArgumentParser` actions. The two most " +"common uses of it are:" +msgstr "" +":meth:`~ArgumentParser.add_argument` 的 ``const`` 参数用于保存不从命令行中读取但被各种 " +":class:`ArgumentParser` 动作需求的常数值。最常用的两例为:" + +#: ../../library/argparse.rst:983 +msgid "" +"When :meth:`~ArgumentParser.add_argument` is called with " +"``action='store_const'`` or ``action='append_const'``. These actions add " +"the ``const`` value to one of the attributes of the object returned by " +":meth:`~ArgumentParser.parse_args`. See the action_ description for " +"examples. If ``const`` is not provided to " +":meth:`~ArgumentParser.add_argument`, it will receive a default value of " +"``None``." +msgstr "" +"当 :meth:`~ArgumentParser.add_argument` 附带 ``action='store_const'`` 或 " +"``action='append_const'`` 被调用时。这些动作会把 ``const`` 值添加到 " +":meth:`~ArgumentParser.parse_args` 所返回的对象的属性中。请查看 action_ 的示例描述。如果未将 " +"``const`` 提供给 :meth:`~ArgumentParser.add_argument`,它将接收一个 ``None`` 的默认值。" + +#: ../../library/argparse.rst:991 +msgid "" +"When :meth:`~ArgumentParser.add_argument` is called with option strings " +"(like ``-f`` or ``--foo``) and ``nargs='?'``. This creates an optional " +"argument that can be followed by zero or one command-line arguments. When " +"parsing the command line, if the option string is encountered with no " +"command-line argument following it, the value from ``const`` will be used. " +"See the nargs_ description for examples." +msgstr "" +"当 :meth:`~ArgumentParser.add_argument` 附带选项字符串 (如 ``-f`` 或 ``--foo``) 和 " +"``nargs='?'`` " +"被调用的时候。这会创建一个可以跟随零至一个命令行参数的选项参数。当解析该命令行时,如果选项字符串没有跟随任何命令行参数,将使用来自 ``const`` " +"的值。请参阅 nargs_ 描述中的示例。" + +#: ../../library/argparse.rst:998 +msgid "" +"``const=None`` by default, including when ``action='append_const'`` or " +"``action='store_const'``." +msgstr "" +"在默认情况下 ``const=None``,包括 ``action='append_const'`` 或 " +"``action='store_const'`` 的时候。" + +#: ../../library/argparse.rst:1005 +msgid "default" +msgstr "默认值" + +#: ../../library/argparse.rst:1007 +msgid "" +"All optional arguments and some positional arguments may be omitted at the " +"command line. The ``default`` keyword argument of " +":meth:`~ArgumentParser.add_argument`, whose value defaults to ``None``, " +"specifies what value should be used if the command-line argument is not " +"present. For optional arguments, the ``default`` value is used when the " +"option string was not present at the command line::" +msgstr "" +"所有选项和一些位置参数可能在命令行中被忽略。:meth:`~ArgumentParser.add_argument` 的命名参数 " +"``default``,默认值为 ``None``,指定了在命令行参数未出现时应当使用的值。对于选项,``default`` " +"值在选项未在命令行中出现时使用::" + +#: ../../library/argparse.rst:1014 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', default=42)\n" +">>> parser.parse_args(['--foo', '2'])\n" +"Namespace(foo='2')\n" +">>> parser.parse_args([])\n" +"Namespace(foo=42)" +msgstr "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', default=42)\n" +">>> parser.parse_args(['--foo', '2'])\n" +"Namespace(foo='2')\n" +">>> parser.parse_args([])\n" +"Namespace(foo=42)" + +#: ../../library/argparse.rst:1021 +msgid "" +"If the target namespace already has an attribute set, the action *default* " +"will not overwrite it::" +msgstr "如果目标命名空间已经有一个属性集,则 *default* 动作不会覆盖它::" + +#: ../../library/argparse.rst:1024 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', default=42)\n" +">>> parser.parse_args([], namespace=argparse.Namespace(foo=101))\n" +"Namespace(foo=101)" +msgstr "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', default=42)\n" +">>> parser.parse_args([], namespace=argparse.Namespace(foo=101))\n" +"Namespace(foo=101)" + +#: ../../library/argparse.rst:1029 +msgid "" +"If the ``default`` value is a string, the parser parses the value as if it " +"were a command-line argument. In particular, the parser applies any type_ " +"conversion argument, if provided, before setting the attribute on the " +":class:`Namespace` return value. Otherwise, the parser uses the value as " +"is::" +msgstr "" +"如果 ``default`` 值是一个字符串,解析器解析此值就像一个命令行参数。特别是,在将属性设置在 :class:`Namespace` " +"的返回值之前,解析器应用任何提供的 type_ 转换参数。否则解析器使用原值::" + +#: ../../library/argparse.rst:1034 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--length', default='10', type=int)\n" +">>> parser.add_argument('--width', default=10.5, type=int)\n" +">>> parser.parse_args()\n" +"Namespace(length=10, width=10.5)" +msgstr "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--length', default='10', type=int)\n" +">>> parser.add_argument('--width', default=10.5, type=int)\n" +">>> parser.parse_args()\n" +"Namespace(length=10, width=10.5)" + +#: ../../library/argparse.rst:1040 +msgid "" +"For positional arguments with nargs_ equal to ``?`` or ``*``, the " +"``default`` value is used when no command-line argument was present::" +msgstr "对于 nargs_ 等于 ``?`` 或 ``*`` 的位置参数,``default`` 值在没有命令行参数出现时使用::" + +#: ../../library/argparse.rst:1043 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('foo', nargs='?', default=42)\n" +">>> parser.parse_args(['a'])\n" +"Namespace(foo='a')\n" +">>> parser.parse_args([])\n" +"Namespace(foo=42)" +msgstr "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('foo', nargs='?', default=42)\n" +">>> parser.parse_args(['a'])\n" +"Namespace(foo='a')\n" +">>> parser.parse_args([])\n" +"Namespace(foo=42)" + +#: ../../library/argparse.rst:1050 +msgid "" +"Because ``nargs='*'`` gathers any supplied values into a list, an absent " +"positional argument yields an empty list (``[]``). Only a non-``None`` " +"*default* overrides this (so ``default=None`` still gives ``[]``)." +msgstr "" + +#: ../../library/argparse.rst:1054 +msgid "" +"For required_ arguments, the ``default`` value is ignored. For example, this" +" applies to positional arguments with nargs_ values other than ``?`` or " +"``*``, or optional arguments marked as ``required=True``." +msgstr "" +"对于 required_ 参数,``default`` 值将被忽略。例如,这将适用于带有 ``?`` 和 ``*`` 以外的 nargs_ " +"值的位置参数,或者被标记为 ``required=True`` 的可选参数。" + +#: ../../library/argparse.rst:1058 +msgid "" +"Providing ``default=argparse.SUPPRESS`` causes no attribute to be added if " +"the command-line argument was not present::" +msgstr "提供 ``default=argparse.SUPPRESS`` 导致命令行参数未出现时没有属性被添加::" + +#: ../../library/argparse.rst:1061 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', default=argparse.SUPPRESS)\n" +">>> parser.parse_args([])\n" +"Namespace()\n" +">>> parser.parse_args(['--foo', '1'])\n" +"Namespace(foo='1')" +msgstr "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', default=argparse.SUPPRESS)\n" +">>> parser.parse_args([])\n" +"Namespace()\n" +">>> parser.parse_args(['--foo', '1'])\n" +"Namespace(foo='1')" + +#: ../../library/argparse.rst:1072 +msgid "type" +msgstr "type -- 类型" + +#: ../../library/argparse.rst:1074 +msgid "" +"By default, the parser reads command-line arguments in as simple strings. " +"However, quite often the command-line string should instead be interpreted " +"as another type, such as a :class:`float` or :class:`int`. The ``type`` " +"keyword for :meth:`~ArgumentParser.add_argument` allows any necessary type-" +"checking and type conversions to be performed." +msgstr "" +"默认情况下,解析器会将命令行参数当作简单字符串读入。然而,命令行字符串经常应当被解读为其他类型,例如 :class:`float` 或 " +":class:`int`。:meth:`~ArgumentParser.add_argument` 的 ``type`` " +"关键字允许执行任何必要的类型检查和类型转换。" + +#: ../../library/argparse.rst:1080 +msgid "" +"If the type_ keyword is used with the default_ keyword, the type converter " +"is only applied if the default is a string." +msgstr "如果 type_ 关键字使用了 default_ 关键字,则类型转换器仅会在默认值为字符串时被应用。" + +#: ../../library/argparse.rst:1083 +msgid "" +"The argument to ``type`` can be a callable that accepts a single string or " +"the name of a registered type (see :meth:`~ArgumentParser.register`) If the " +"function raises :exc:`ArgumentTypeError`, :exc:`TypeError`, or " +":exc:`ValueError`, the exception is caught and a nicely formatted error " +"message is displayed. Other exception types are not handled." +msgstr "" +"传给 ``type`` 的参数可以是接受一个字符串或一个已注册类型名称 (参见 :meth:`~ArgumentParser.register`) " +"的可调用对象。如果该函数引发了 :exc:`ArgumentTypeError`, :exc:`TypeError` 或 " +":exc:`ValueError`,异常将被捕获并显示经良好格式化的错误消息。其他异常类型则不会被处理。" + +#: ../../library/argparse.rst:1089 +msgid "Common built-in types and functions can be used as type converters:" +msgstr "普通内置类型和函数可被用作类型转换器:" + +#: ../../library/argparse.rst:1091 +msgid "" +"import argparse\n" +"import pathlib\n" +"\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument('count', type=int)\n" +"parser.add_argument('distance', type=float)\n" +"parser.add_argument('street', type=ascii)\n" +"parser.add_argument('code_point', type=ord)\n" +"parser.add_argument('datapath', type=pathlib.Path)" +msgstr "" +"import argparse\n" +"import pathlib\n" +"\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument('count', type=int)\n" +"parser.add_argument('distance', type=float)\n" +"parser.add_argument('street', type=ascii)\n" +"parser.add_argument('code_point', type=ord)\n" +"parser.add_argument('datapath', type=pathlib.Path)" + +#: ../../library/argparse.rst:1103 +msgid "User defined functions can be used as well:" +msgstr "用户自定义的函数也可以被使用:" + +#: ../../library/argparse.rst:1105 +msgid "" +">>> def hyphenated(string):\n" +"... return '-'.join([word[:4] for word in string.casefold().split()])\n" +"...\n" +">>> parser = argparse.ArgumentParser()\n" +">>> _ = parser.add_argument('short_title', type=hyphenated)\n" +">>> parser.parse_args(['\"The Tale of Two Cities\"'])\n" +"Namespace(short_title='\"the-tale-of-two-citi')" +msgstr "" +">>> def hyphenated(string):\n" +"... return '-'.join([word[:4] for word in string.casefold().split()])\n" +"...\n" +">>> parser = argparse.ArgumentParser()\n" +">>> _ = parser.add_argument('short_title', type=hyphenated)\n" +">>> parser.parse_args(['\"The Tale of Two Cities\"'])\n" +"Namespace(short_title='\"the-tale-of-two-citi')" + +#: ../../library/argparse.rst:1115 +msgid "" +"The :func:`bool` function is not recommended as a type converter. All it " +"does is convert empty strings to ``False`` and non-empty strings to " +"``True``. This is usually not what is desired::" +msgstr "" + +#: ../../library/argparse.rst:1119 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> _ = parser.add_argument('--verbose', type=bool)\n" +">>> parser.parse_args(['--verbose', 'False'])\n" +"Namespace(verbose=True)" +msgstr "" + +#: ../../library/argparse.rst:1124 +msgid "" +"See :class:`BooleanOptionalAction` or ``action='store_true'`` for common " +"alternatives." +msgstr "" + +#: ../../library/argparse.rst:1127 +msgid "" +"In general, the ``type`` keyword is a convenience that should only be used " +"for simple conversions that can only raise one of the three supported " +"exceptions. Anything with more interesting error-handling or resource " +"management should be done downstream after the arguments are parsed." +msgstr "" +"通常,``type`` " +"关键字是仅应被用于只会引发上述三种被支持的异常的简单转换的便捷选项。任何具有更复杂错误处理或资源管理的转换都应当在参数被解析后由下游代码来完成。" + +#: ../../library/argparse.rst:1132 +msgid "" +"For example, JSON or YAML conversions have complex error cases that require " +"better reporting than can be given by the ``type`` keyword. A " +":exc:`~json.JSONDecodeError` would not be well formatted and a " +":exc:`FileNotFoundError` exception would not be handled at all." +msgstr "" +"例如,JSON 或 YAML 转换具有复杂的错误情况,需要能给出比 ``type`` " +"关键字所能给出的更好的报告。:exc:`~json.JSONDecodeError` 将不会被良好地格式化而 " +":exc:`FileNotFoundError` 异常则完全不会被处理。" + +#: ../../library/argparse.rst:1137 +msgid "" +"Even :class:`~argparse.FileType` has its limitations for use with the " +"``type`` keyword. If one argument uses :class:`~argparse.FileType` and then" +" a subsequent argument fails, an error is reported but the file is not " +"automatically closed. In this case, it would be better to wait until after " +"the parser has run and then use the :keyword:`with`-statement to manage the " +"files." +msgstr "" +"甚至 :class:`~argparse.FileType` 在用于 ``type`` 关键字时也是有限制的。如果一个参数使用了 " +":class:`~argparse.FileType` " +"并且有一个后续参数出错,则将报告错误但文件并不会被自动关闭。在此情况下,更好的做法是等待直到解析器运行完毕再使用 :keyword:`with` " +"语句来管理文件。" + +#: ../../library/argparse.rst:1144 +msgid "" +"For type checkers that simply check against a fixed set of values, consider " +"using the choices_ keyword instead." +msgstr "对于简单地检查一组固定值的类型检查器,请考虑改用 choices_ 关键字。" + +#: ../../library/argparse.rst:1151 +msgid "choices" +msgstr "choices" + +#: ../../library/argparse.rst:1153 +msgid "" +"Some command-line arguments should be selected from a restricted set of " +"values. These can be handled by passing a sequence object as the *choices* " +"keyword argument to :meth:`~ArgumentParser.add_argument`. When the command " +"line is parsed, argument values will be checked, and an error message will " +"be displayed if the argument was not one of the acceptable values::" +msgstr "" +"某些命令行参数应当从一组受限的值中选择。这可以通过将一个序列对象作为 *choices* 关键字参数传给 " +":meth:`~ArgumentParser.add_argument` " +"来处理。当执行命令行解析时,参数值将被检查,如果参数不是可接受的值之一就将显示错误消息::" + +#: ../../library/argparse.rst:1159 +msgid "" +">>> parser = argparse.ArgumentParser(prog='game.py')\n" +">>> parser.add_argument('move', choices=['rock', 'paper', 'scissors'])\n" +">>> parser.parse_args(['rock'])\n" +"Namespace(move='rock')\n" +">>> parser.parse_args(['fire'])\n" +"usage: game.py [-h] {rock,paper,scissors}\n" +"game.py: error: argument move: invalid choice: 'fire' (choose from 'rock',\n" +"'paper', 'scissors')" +msgstr "" +">>> parser = argparse.ArgumentParser(prog='game.py')\n" +">>> parser.add_argument('move', choices=['rock', 'paper', 'scissors'])\n" +">>> parser.parse_args(['rock'])\n" +"Namespace(move='rock')\n" +">>> parser.parse_args(['fire'])\n" +"usage: game.py [-h] {rock,paper,scissors}\n" +"game.py: error: argument move: invalid choice: 'fire' (choose from 'rock',\n" +"'paper', 'scissors')" + +#: ../../library/argparse.rst:1168 +msgid "" +"Any sequence can be passed as the *choices* value, so :class:`list` objects," +" :class:`tuple` objects, and custom sequences are all supported." +msgstr "" +"任何序列都可作为 *choices* 值传入,因此 :class:`list` 对象、:class:`tuple` 对象以及自定义序列都是受支持的。" + +#: ../../library/argparse.rst:1171 +msgid "" +"Use of :class:`enum.Enum` is not recommended because it is difficult to " +"control its appearance in usage, help, and error messages." +msgstr "不建议使用 :class:`enum.Enum`,因为要控制其在用法、帮助和错误消息中的外观是很困难的。" + +#: ../../library/argparse.rst:1174 +msgid "" +"Note that *choices* are checked after any type_ conversions have been " +"performed, so objects in *choices* should match the type_ specified. This " +"can make *choices* appear unfamiliar in usage, help, or error messages." +msgstr "" +"请注意 *choices* 会在执行任何 type_ 转换后被检查,因此 *choices* 中的对象应当与指定的 type_ 相匹配。这可能使得 " +"*choices* 在使用、帮助或错误消息中显示异常。" + +#: ../../library/argparse.rst:1179 +msgid "" +"To keep *choices* user-friendly, consider a custom type wrapper that " +"converts and formats values, or omit type_ and handle conversion in your " +"application code." +msgstr "要保持 *choices* 显示对用户友好,可考虑使用转换和格式化值的自定义类型包装器,或省略 type_ 并在你的应用代码中处理转换。" + +#: ../../library/argparse.rst:1183 +msgid "" +"Formatted choices override the default *metavar* which is normally derived " +"from *dest*. This is usually what you want because the user never sees the " +"*dest* parameter. If this display isn't desirable (perhaps because there " +"are many choices), just specify an explicit metavar_." +msgstr "" +"已格式化的选项会覆盖默认的 *metavar*,该值一般是派生自 *dest*。这通常就是你所需要的,因为用户永远不会看到 *dest* " +"形参。如果不想要这样的显示(或许因为有很多选择),只需指定一个显式的 metavar_。" + +#: ../../library/argparse.rst:1192 +msgid "required" +msgstr "required" + +#: ../../library/argparse.rst:1194 +msgid "" +"In general, the :mod:`!argparse` module assumes that flags like ``-f`` and " +"``--bar`` indicate *optional* arguments, which can always be omitted at the " +"command line. To make an option *required*, ``True`` can be specified for " +"the ``required=`` keyword argument to :meth:`~ArgumentParser.add_argument`::" +msgstr "" +"通常,:mod:`!argparse` 模块会假定像 ``-f`` 和 ``--bar`` 这样的旗标是表示 *可选* " +"参数,它们总是可以在命令行中被省略。要让一个选项成为 *必需*,则可以将 ``True`` 作为 ``required=`` 关键字参数传给 " +":meth:`~ArgumentParser.add_argument`::" + +#: ../../library/argparse.rst:1199 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', required=True)\n" +">>> parser.parse_args(['--foo', 'BAR'])\n" +"Namespace(foo='BAR')\n" +">>> parser.parse_args([])\n" +"usage: [-h] --foo FOO\n" +": error: the following arguments are required: --foo" +msgstr "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', required=True)\n" +">>> parser.parse_args(['--foo', 'BAR'])\n" +"Namespace(foo='BAR')\n" +">>> parser.parse_args([])\n" +"usage: [-h] --foo FOO\n" +": error: the following arguments are required: --foo" + +#: ../../library/argparse.rst:1207 +msgid "" +"As the example shows, if an option is marked as ``required``, " +":meth:`~ArgumentParser.parse_args` will report an error if that option is " +"not present at the command line." +msgstr "" +"如这个例子所示,如果一个选项被标记为 " +"``required``,则当该选项未在命令行中出现时,:meth:`~ArgumentParser.parse_args` 将会报告一个错误。" + +#: ../../library/argparse.rst:1213 +msgid "" +"Required options are generally considered bad form because users expect " +"*options* to be *optional*, and thus they should be avoided when possible." +msgstr "必需的选项通常被认为是不适宜的,因为用户会预期 *options* 都是 *可选的*,因此在可能的情况下应当避免使用它们。" + +#: ../../library/argparse.rst:1220 +msgid "help" +msgstr "help" + +#: ../../library/argparse.rst:1222 +msgid "" +"The ``help`` value is a string containing a brief description of the " +"argument. When a user requests help (usually by using ``-h`` or ``--help`` " +"at the command line), these ``help`` descriptions will be displayed with " +"each argument." +msgstr "" +"``help`` 值是一个包含参数的简短描述的字符串。当用户请求帮助时(一般是通过在命令行中使用 ``-h`` 或 ``--help`` 的方式),这些" +" ``help`` 描述信息将随每个参数一同显示。" + +#: ../../library/argparse.rst:1227 +msgid "" +"The ``help`` strings can include various format specifiers to avoid " +"repetition of things like the program name or the argument default_. The " +"available specifiers include the program name, ``%(prog)s`` and most keyword" +" arguments to :meth:`~ArgumentParser.add_argument`, e.g. ``%(default)s``, " +"``%(type)s``, etc.::" +msgstr "" +"``help`` 字符串可包括各种格式描述符以避免重复使用程序名称或参数 default_ 等文本。有效的描述符包括程序名称 ``%(prog)s`` " +"和传给 :meth:`~ArgumentParser.add_argument` 的大部分关键字参数,例如 ``%(default)s``, " +"``%(type)s`` 等等::" + +#: ../../library/argparse.rst:1232 +msgid "" +">>> parser = argparse.ArgumentParser(prog='frobble')\n" +">>> parser.add_argument('bar', nargs='?', type=int, default=42,\n" +"... help='the bar to %(prog)s (default: %(default)s)')\n" +">>> parser.print_help()\n" +"usage: frobble [-h] [bar]\n" +"\n" +"positional arguments:\n" +" bar the bar to frobble (default: 42)\n" +"\n" +"options:\n" +" -h, --help show this help message and exit" +msgstr "" +">>> parser = argparse.ArgumentParser(prog='frobble')\n" +">>> parser.add_argument('bar', nargs='?', type=int, default=42,\n" +"... help='the bar to %(prog)s (default: %(default)s)')\n" +">>> parser.print_help()\n" +"usage: frobble [-h] [bar]\n" +"\n" +"positional arguments:\n" +" bar the bar to frobble (default: 42)\n" +"\n" +"options:\n" +" -h, --help show this help message and exit" + +#: ../../library/argparse.rst:1244 +msgid "" +"As the help string supports %-formatting, if you want a literal ``%`` to " +"appear in the help string, you must escape it as ``%%``." +msgstr "由于帮助字符串支持 %-formatting,如果你希望在帮助字符串中显示 ``%`` 字面值,你必须将其转义为 ``%%``。" + +#: ../../library/argparse.rst:1247 +msgid "" +":mod:`!argparse` supports silencing the help entry for certain options, by " +"setting the ``help`` value to ``argparse.SUPPRESS``::" +msgstr "" +":mod:`!argparse` 支持静默特定选项的帮助条目,具体方式是将 ``help`` 值设为 ``argparse.SUPPRESS``::" + +#: ../../library/argparse.rst:1250 +msgid "" +">>> parser = argparse.ArgumentParser(prog='frobble')\n" +">>> parser.add_argument('--foo', help=argparse.SUPPRESS)\n" +">>> parser.print_help()\n" +"usage: frobble [-h]\n" +"\n" +"options:\n" +" -h, --help show this help message and exit" +msgstr "" +">>> parser = argparse.ArgumentParser(prog='frobble')\n" +">>> parser.add_argument('--foo', help=argparse.SUPPRESS)\n" +">>> parser.print_help()\n" +"usage: frobble [-h]\n" +"\n" +"options:\n" +" -h, --help show this help message and exit" + +#: ../../library/argparse.rst:1262 +msgid "metavar" +msgstr "metavar" + +#: ../../library/argparse.rst:1264 +msgid "" +"When :class:`ArgumentParser` generates help messages, it needs some way to " +"refer to each expected argument. By default, :class:`!ArgumentParser` " +"objects use the dest_ value as the \"name\" of each object. By default, for" +" positional argument actions, the dest_ value is used directly, and for " +"optional argument actions, the dest_ value is uppercased. So, a single " +"positional argument with ``dest='bar'`` will be referred to as ``bar``. A " +"single optional argument ``--foo`` that should be followed by a single " +"command-line argument will be referred to as ``FOO``. An example::" +msgstr "" +"当 :class:`ArgumentParser` " +"生成帮助消息时,它需要用某种方式来引用每个预期的参数。默认情况下,:class:`!ArgumentParser` 对象使用 dest_ " +"值作为每个对象的“名字”。默认情况下,对于位置参数动作,dest_ 值将被直接使用,而对于可选参数动作,dest_ 值将被转为大写形式。因此,对于 " +"``dest='bar'`` 位置参数的引用形式将为 ``bar``。带有单个命令行参数的可选参数 ``--foo`` 的引用形式将为 " +"``FOO``。一个样例::" + +#: ../../library/argparse.rst:1273 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo')\n" +">>> parser.add_argument('bar')\n" +">>> parser.parse_args('X --foo Y'.split())\n" +"Namespace(bar='X', foo='Y')\n" +">>> parser.print_help()\n" +"usage: [-h] [--foo FOO] bar\n" +"\n" +"positional arguments:\n" +" bar\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" --foo FOO" +msgstr "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo')\n" +">>> parser.add_argument('bar')\n" +">>> parser.parse_args('X --foo Y'.split())\n" +"Namespace(bar='X', foo='Y')\n" +">>> parser.print_help()\n" +"usage: [-h] [--foo FOO] bar\n" +"\n" +"positional arguments:\n" +" bar\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" --foo FOO" + +#: ../../library/argparse.rst:1288 +msgid "An alternative name can be specified with ``metavar``::" +msgstr "可以使用 ``metavar`` 来指定一个替代名称::" + +#: ../../library/argparse.rst:1290 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', metavar='YYY')\n" +">>> parser.add_argument('bar', metavar='XXX')\n" +">>> parser.parse_args('X --foo Y'.split())\n" +"Namespace(bar='X', foo='Y')\n" +">>> parser.print_help()\n" +"usage: [-h] [--foo YYY] XXX\n" +"\n" +"positional arguments:\n" +" XXX\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" --foo YYY" +msgstr "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', metavar='YYY')\n" +">>> parser.add_argument('bar', metavar='XXX')\n" +">>> parser.parse_args('X --foo Y'.split())\n" +"Namespace(bar='X', foo='Y')\n" +">>> parser.print_help()\n" +"usage: [-h] [--foo YYY] XXX\n" +"\n" +"positional arguments:\n" +" XXX\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" --foo YYY" + +#: ../../library/argparse.rst:1305 +msgid "" +"Note that ``metavar`` only changes the *displayed* name - the name of the " +"attribute on the :meth:`~ArgumentParser.parse_args` object is still " +"determined by the dest_ value." +msgstr "" +"请注意 ``metavar`` 仅改变 *显示的* 名称 - :meth:`~ArgumentParser.parse_args` " +"对象的属性名称仍然会由 dest_ 值确定。" + +#: ../../library/argparse.rst:1309 +msgid "" +"Different values of ``nargs`` may cause the metavar to be used multiple " +"times. Providing a tuple to ``metavar`` specifies a different display for " +"each of the arguments::" +msgstr "" +"不同的 ``nargs`` 值可能导致 metavar 被多次使用。提供一个元组给 ``metavar`` 即为每个参数指定不同的显示信息::" + +#: ../../library/argparse.rst:1313 +msgid "" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> parser.add_argument('-x', nargs=2)\n" +">>> parser.add_argument('--foo', nargs=2, metavar=('bar', 'baz'))\n" +">>> parser.print_help()\n" +"usage: PROG [-h] [-x X X] [--foo bar baz]\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" -x X X\n" +" --foo bar baz" +msgstr "" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> parser.add_argument('-x', nargs=2)\n" +">>> parser.add_argument('--foo', nargs=2, metavar=('bar', 'baz'))\n" +">>> parser.print_help()\n" +"usage: PROG [-h] [-x X X] [--foo bar baz]\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" -x X X\n" +" --foo bar baz" + +#: ../../library/argparse.rst:1328 +msgid "dest" +msgstr "dest" + +#: ../../library/argparse.rst:1330 +msgid "" +"Most :class:`ArgumentParser` actions add some value as an attribute of the " +"object returned by :meth:`~ArgumentParser.parse_args`. The name of this " +"attribute is determined by the ``dest`` keyword argument of " +":meth:`~ArgumentParser.add_argument`. For positional argument actions, " +"``dest`` is normally supplied as the first argument to " +":meth:`~ArgumentParser.add_argument`::" +msgstr "" +"大多数 :class:`ArgumentParser` 动作会添加一些值作为 :meth:`~ArgumentParser.parse_args` " +"所返回对象的一个属性。该属性的名称由 :meth:`~ArgumentParser.add_argument` 的 ``dest`` 关键字参数确定。 " +"对于位置参数动作,``dest`` 通常会作为 :meth:`~ArgumentParser.add_argument` 的第一个参数提供::" + +#: ../../library/argparse.rst:1337 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('bar')\n" +">>> parser.parse_args(['XXX'])\n" +"Namespace(bar='XXX')" +msgstr "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('bar')\n" +">>> parser.parse_args(['XXX'])\n" +"Namespace(bar='XXX')" + +#: ../../library/argparse.rst:1342 +msgid "" +"For optional argument actions, the value of ``dest`` is normally inferred " +"from the option strings. :class:`ArgumentParser` generates the value of " +"``dest`` by taking the first long option string and stripping away the " +"initial ``--`` string. If no long option strings were supplied, ``dest`` " +"will be derived from the first short option string by stripping the initial " +"``-`` character. Any internal ``-`` characters will be converted to ``_`` " +"characters to make sure the string is a valid attribute name. The examples " +"below illustrate this behavior::" +msgstr "" +"对于可选参数动作,``dest`` 的值通常取自选项字符串。:class:`ArgumentParser` 会通过接受第一个长选项字符串并去掉开头的 " +"``--`` 字符串来生成 ``dest`` 的值。如果没有提供长选项字符串,则 ``dest`` 将通过接受第一个短选项字符串并去掉开头的 ``-``" +" 字符来获得。任何内部的 ``-`` 字符都将被转换为 ``_`` 字符以确保字符串是有效的属性名称。下面的例子显示了这种行为::" + +#: ../../library/argparse.rst:1351 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('-f', '--foo-bar', '--foo')\n" +">>> parser.add_argument('-x', '-y')\n" +">>> parser.parse_args('-f 1 -x 2'.split())\n" +"Namespace(foo_bar='1', x='2')\n" +">>> parser.parse_args('--foo 1 -y 2'.split())\n" +"Namespace(foo_bar='1', x='2')" +msgstr "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('-f', '--foo-bar', '--foo')\n" +">>> parser.add_argument('-x', '-y')\n" +">>> parser.parse_args('-f 1 -x 2'.split())\n" +"Namespace(foo_bar='1', x='2')\n" +">>> parser.parse_args('--foo 1 -y 2'.split())\n" +"Namespace(foo_bar='1', x='2')" + +#: ../../library/argparse.rst:1359 +msgid "``dest`` allows a custom attribute name to be provided::" +msgstr "``dest`` 允许提供自定义属性名称::" + +#: ../../library/argparse.rst:1361 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', dest='bar')\n" +">>> parser.parse_args('--foo XXX'.split())\n" +"Namespace(bar='XXX')" +msgstr "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', dest='bar')\n" +">>> parser.parse_args('--foo XXX'.split())\n" +"Namespace(bar='XXX')" + +#: ../../library/argparse.rst:1370 +msgid "deprecated" +msgstr "deprecated" + +#: ../../library/argparse.rst:1372 +msgid "" +"During a project's lifetime, some arguments may need to be removed from the " +"command line. Before removing them, you should inform your users that the " +"arguments are deprecated and will be removed. The ``deprecated`` keyword " +"argument of :meth:`~ArgumentParser.add_argument`, which defaults to " +"``False``, specifies if the argument is deprecated and will be removed in " +"the future. For arguments, if ``deprecated`` is ``True``, then a warning " +"will be printed to :data:`sys.stderr` when the argument is used::" +msgstr "" +"在一个项目的生命期内,某些命令行参数可能需要被移除。在移除它们之前,你应当通知你的用户这些参数已被弃用并将被移除。:meth:`~ArgumentParser.add_argument`" +" 的 ``deprecated`` 关键字参数指明参数已被弃用并将在未来被移除,其默认值为 ``False``。对于每个参数,如果 " +"``deprecated`` 为 ``True``,那么当该参数被使用时会打印一条警告到 :data:`sys.stderr`::" + +#: ../../library/argparse.rst:1382 +msgid "" +">>> import argparse\n" +">>> parser = argparse.ArgumentParser(prog='snake.py')\n" +">>> parser.add_argument('--legs', default=0, type=int, deprecated=True)\n" +">>> parser.parse_args([])\n" +"Namespace(legs=0)\n" +">>> parser.parse_args(['--legs', '4'])\n" +"snake.py: warning: option '--legs' is deprecated\n" +"Namespace(legs=4)" +msgstr "" +">>> import argparse\n" +">>> parser = argparse.ArgumentParser(prog='snake.py')\n" +">>> parser.add_argument('--legs', default=0, type=int, deprecated=True)\n" +">>> parser.parse_args([])\n" +"Namespace(legs=0)\n" +">>> parser.parse_args(['--legs', '4'])\n" +"snake.py: warning: option '--legs' is deprecated\n" +"Namespace(legs=4)" + +#: ../../library/argparse.rst:1395 +msgid "Action classes" +msgstr "Action 类" + +#: ../../library/argparse.rst:1397 +msgid "" +":class:`!Action` classes implement the Action API, a callable which returns " +"a callable which processes arguments from the command-line. Any object which" +" follows this API may be passed as the ``action`` parameter to " +":meth:`~ArgumentParser.add_argument`." +msgstr "" +":class:`!Action` 类实现了 Action API,是一个返回可调用对象的可调用对象,它返回的可调用对象将处理来自命令行的参数。任何遵循此" +" API 的对象均可作为 ``action`` 形参传给 :meth:`~ArgumentParser.add_argument`。" + +#: ../../library/argparse.rst:1406 +msgid "" +":class:`!Action` objects are used by an :class:`ArgumentParser` to represent" +" the information needed to parse a single argument from one or more strings " +"from the command line. The :class:`!Action` class must accept the two " +"positional arguments plus any keyword arguments passed to " +":meth:`ArgumentParser.add_argument` except for the ``action`` itself." +msgstr "" +":class:`!Action` 对象会被 :class:`ArgumentParser` " +"用来代表从命令行中的一个或多个字符串中解析出单个参数所必须的信息。:class:`!Action` 类必须接受两个位置参数加上传给 " +":meth:`ArgumentParser.add_argument` 的除了 ``action`` 本身的任何关键字参数。" + +#: ../../library/argparse.rst:1412 +msgid "" +"Instances of :class:`!Action` (or return value of any callable to the " +"``action`` parameter) should have attributes :attr:`!dest`, " +":attr:`!option_strings`, :attr:`!default`, :attr:`!type`, :attr:`!required`," +" :attr:`!help`, etc. defined. The easiest way to ensure these attributes are" +" defined is to call :meth:`!Action.__init__`." +msgstr "" +":class:`!Action` 的实例(或作为 ``action`` 形参的任何可调用对象的返回值)应当定义 :attr:`!dest`, " +":attr:`!option_strings`, :attr:`!default`, :attr:`!type`, :attr:`!required`," +" :attr:`!help` 等属性。确定这些属性的最容易的方式是调用 :meth:`!Action.__init__`。" + +#: ../../library/argparse.rst:1420 +msgid "" +":class:`!Action` instances should be callable, so subclasses must override " +"the :meth:`!__call__` method, which should accept four parameters:" +msgstr "" +":class:`!Action` 的实例应当为可调用对象,因此所有子类都必须重写 :meth:`!__call__` 方法,它应当接受四个形参:" + +#: ../../library/argparse.rst:1423 +msgid "" +"*parser* - The :class:`ArgumentParser` object which contains this action." +msgstr "*parser* - 包含此动作的 :class:`ArgumentParser` 对象。" + +#: ../../library/argparse.rst:1425 +msgid "" +"*namespace* - The :class:`Namespace` object that will be returned by " +":meth:`~ArgumentParser.parse_args`. Most actions add an attribute to this " +"object using :func:`setattr`." +msgstr "" +"*namespace* - 将由 :meth:`~ArgumentParser.parse_args` 返回的 :class:`Namespace` " +"对象。大多数动作会使用 :func:`setattr` 为此对象添加一个属性。" + +#: ../../library/argparse.rst:1429 +msgid "" +"*values* - The associated command-line arguments, with any type conversions " +"applied. Type conversions are specified with the type_ keyword argument to " +":meth:`~ArgumentParser.add_argument`." +msgstr "" +"*values* - 关联的命令行参数,已应用了所有的类型转换。类型转换是由传给 " +":meth:`~ArgumentParser.add_argument` 的 type_ 关键字参数指定的。" + +#: ../../library/argparse.rst:1433 +msgid "" +"*option_string* - The option string that was used to invoke this action. The" +" ``option_string`` argument is optional, and will be absent if the action is" +" associated with a positional argument." +msgstr "" +"*option_string* - 被用于唤起此动作的选项字符串。``option_string`` " +"参数是可选的,并且在动作被关联到位置参数时将被略去。" + +#: ../../library/argparse.rst:1437 +msgid "" +"The :meth:`!__call__` method may perform arbitrary actions, but will " +"typically set attributes on the ``namespace`` based on ``dest`` and " +"``values``." +msgstr "" +":meth:`!__call__` 方法可以执行任意动作,但通常将基于 ``dest`` 和 ``values`` 来设置 ``namespace`` " +"的属性。" + +#: ../../library/argparse.rst:1442 +msgid "" +":class:`!Action` subclasses can define a :meth:`!format_usage` method that " +"takes no argument and return a string which will be used when printing the " +"usage of the program. If such method is not provided, a sensible default " +"will be used." +msgstr "" +":class:`!Action` 子类可以定义 :meth:`!format_usage` " +"方法,该方法不接受任何参数并返回一个将被用于打印程序的用法说明的字符串。如果未提供此方法,则将使用适当的默认值。" + +#: ../../library/argparse.rst:1448 +msgid "" +"A subclass of :class:`Action` for handling boolean flags with positive and " +"negative options. Adding a single argument such as ``--foo`` automatically " +"creates both ``--foo`` and ``--no-foo`` options, storing ``True`` and " +"``False`` respectively::" +msgstr "" +"一个继承自 :class:`Action` 的子类,专门用于处理带有正负选项的布尔标志。当添加类似 ``--foo`` " +"的单个参数时,该子类会自动同时创建 ``--foo`` 和 ``--no-foo`` 两个选项,并分别存储 ``True`` 和 ``False`` " +"值::" + +#: ../../library/argparse.rst:1453 +msgid "" +">>> import argparse\n" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', action=argparse.BooleanOptionalAction)\n" +">>> parser.parse_args(['--no-foo'])\n" +"Namespace(foo=False)" +msgstr "" +">>> import argparse\n" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', action=argparse.BooleanOptionalAction)\n" +">>> parser.parse_args(['--no-foo'])\n" +"Namespace(foo=False)" + +#: ../../library/argparse.rst:1463 +msgid "The parse_args() method" +msgstr "parse_args() 方法" + +#: ../../library/argparse.rst:1467 +msgid "" +"Convert argument strings to objects and assign them as attributes of the " +"namespace. Return the populated namespace." +msgstr "将参数字符串转换为对象并将其设为命名空间的属性。返回带有成员的命名空间。" + +#: ../../library/argparse.rst:1470 +msgid "" +"Previous calls to :meth:`add_argument` determine exactly what objects are " +"created and how they are assigned. See the documentation for " +":meth:`!add_argument` for details." +msgstr "" +"之前对 :meth:`add_argument` 的调用决定了哪些对象会被创建以及它们如何被赋值。请参阅 :meth:`!add_argument` " +"的文档了解详情。" + +#: ../../library/argparse.rst:1474 +msgid "" +"args_ - List of strings to parse. The default is taken from " +":data:`sys.argv`." +msgstr "args_ - 要解析的字符串列表。默认值是从 :data:`sys.argv` 获取。" + +#: ../../library/argparse.rst:1477 +msgid "" +"namespace_ - An object to take the attributes. The default is a new empty " +":class:`Namespace` object." +msgstr "namespace_ - 用于获取属性的对象。默认值是一个新的空 :class:`Namespace` 对象。" + +#: ../../library/argparse.rst:1482 +msgid "Option value syntax" +msgstr "选项值语法" + +#: ../../library/argparse.rst:1484 +msgid "" +"The :meth:`~ArgumentParser.parse_args` method supports several ways of " +"specifying the value of an option (if it takes one). In the simplest case, " +"the option and its value are passed as two separate arguments::" +msgstr "" +":meth:`~ArgumentParser.parse_args` " +"方法支持多种指定选项值的方式(如果它接受选项的话)。在最简单的情况下,选项和它的值是作为两个单独参数传入的::" + +#: ../../library/argparse.rst:1488 +msgid "" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> parser.add_argument('-x')\n" +">>> parser.add_argument('--foo')\n" +">>> parser.parse_args(['-x', 'X'])\n" +"Namespace(foo=None, x='X')\n" +">>> parser.parse_args(['--foo', 'FOO'])\n" +"Namespace(foo='FOO', x=None)" +msgstr "" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> parser.add_argument('-x')\n" +">>> parser.add_argument('--foo')\n" +">>> parser.parse_args(['-x', 'X'])\n" +"Namespace(foo=None, x='X')\n" +">>> parser.parse_args(['--foo', 'FOO'])\n" +"Namespace(foo='FOO', x=None)" + +#: ../../library/argparse.rst:1496 +msgid "" +"For long options (options with names longer than a single character), the " +"option and value can also be passed as a single command-line argument, using" +" ``=`` to separate them::" +msgstr "对于长选项(名称长度超过一个字符的选项),选项和值也可以作为单个命令行参数传入,使用 ``=`` 分隔它们即可::" + +#: ../../library/argparse.rst:1500 +msgid "" +">>> parser.parse_args(['--foo=FOO'])\n" +"Namespace(foo='FOO', x=None)" +msgstr "" +">>> parser.parse_args(['--foo=FOO'])\n" +"Namespace(foo='FOO', x=None)" + +#: ../../library/argparse.rst:1503 +msgid "" +"For short options (options only one character long), the option and its " +"value can be concatenated::" +msgstr "对于短选项(长度只有一个字符的选项),选项和它的值可以拼接在一起::" + +#: ../../library/argparse.rst:1506 +msgid "" +">>> parser.parse_args(['-xX'])\n" +"Namespace(foo=None, x='X')" +msgstr "" +">>> parser.parse_args(['-xX'])\n" +"Namespace(foo=None, x='X')" + +#: ../../library/argparse.rst:1509 +msgid "" +"Several short options can be joined together, using only a single ``-`` " +"prefix, as long as only the last option (or none of them) requires a value::" +msgstr "有些短选项可以使用单个 ``-`` 前缀来进行合并,如果仅有最后一个选项(或没有任何选项)需要值的话::" + +#: ../../library/argparse.rst:1512 +msgid "" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> parser.add_argument('-x', action='store_true')\n" +">>> parser.add_argument('-y', action='store_true')\n" +">>> parser.add_argument('-z')\n" +">>> parser.parse_args(['-xyzZ'])\n" +"Namespace(x=True, y=True, z='Z')" +msgstr "" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> parser.add_argument('-x', action='store_true')\n" +">>> parser.add_argument('-y', action='store_true')\n" +">>> parser.add_argument('-z')\n" +">>> parser.parse_args(['-xyzZ'])\n" +"Namespace(x=True, y=True, z='Z')" + +#: ../../library/argparse.rst:1521 +msgid "Invalid arguments" +msgstr "无效的参数" + +#: ../../library/argparse.rst:1523 +msgid "" +"While parsing the command line, :meth:`~ArgumentParser.parse_args` checks " +"for a variety of errors, including ambiguous options, invalid types, invalid" +" options, wrong number of positional arguments, etc. When it encounters " +"such an error, it exits and prints the error along with a usage message::" +msgstr "" +"在解析命令行时,:meth:`~ArgumentParser.parse_args` " +"会检测多种错误,包括有歧义的选项、无效的类型、无效的选项、错误的位置参数个数等等。当遇到这种错误时,它将退出并打印出错误文本同时附带用法消息::" + +#: ../../library/argparse.rst:1528 +msgid "" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> parser.add_argument('--foo', type=int)\n" +">>> parser.add_argument('bar', nargs='?')\n" +"\n" +">>> # invalid type\n" +">>> parser.parse_args(['--foo', 'spam'])\n" +"usage: PROG [-h] [--foo FOO] [bar]\n" +"PROG: error: argument --foo: invalid int value: 'spam'\n" +"\n" +">>> # invalid option\n" +">>> parser.parse_args(['--bar'])\n" +"usage: PROG [-h] [--foo FOO] [bar]\n" +"PROG: error: no such option: --bar\n" +"\n" +">>> # wrong number of arguments\n" +">>> parser.parse_args(['spam', 'badger'])\n" +"usage: PROG [-h] [--foo FOO] [bar]\n" +"PROG: error: extra arguments found: badger" +msgstr "" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> parser.add_argument('--foo', type=int)\n" +">>> parser.add_argument('bar', nargs='?')\n" +"\n" +">>> # invalid type\n" +">>> parser.parse_args(['--foo', 'spam'])\n" +"usage: PROG [-h] [--foo FOO] [bar]\n" +"PROG: error: argument --foo: invalid int value: 'spam'\n" +"\n" +">>> # invalid option\n" +">>> parser.parse_args(['--bar'])\n" +"usage: PROG [-h] [--foo FOO] [bar]\n" +"PROG: error: no such option: --bar\n" +"\n" +">>> # wrong number of arguments\n" +">>> parser.parse_args(['spam', 'badger'])\n" +"usage: PROG [-h] [--foo FOO] [bar]\n" +"PROG: error: extra arguments found: badger" + +#: ../../library/argparse.rst:1549 +msgid "Arguments containing ``-``" +msgstr "包含 ``-`` 的参数" + +#: ../../library/argparse.rst:1551 +msgid "" +"The :meth:`~ArgumentParser.parse_args` method attempts to give errors " +"whenever the user has clearly made a mistake, but some situations are " +"inherently ambiguous. For example, the command-line argument ``-1`` could " +"either be an attempt to specify an option or an attempt to provide a " +"positional argument. The :meth:`~ArgumentParser.parse_args` method is " +"cautious here: positional arguments may only begin with ``-`` if they look " +"like negative numbers and there are no options in the parser that look like " +"negative numbers::" +msgstr "" +":meth:`~ArgumentParser.parse_args` 方法会在用户明显出错时尝试给出错误信息,但某些情况本身就存在歧义。例如,命令行参数" +" ``-1`` 可能是尝试指定一个选项也可能是尝试提供一个位置参数。:meth:`~ArgumentParser.parse_args` " +"方法在此会谨慎行事:位置参数只有在它们看起来像负数并且解析器中没有任何选项看起来像负数时才能以 ``-`` 打头。::" + +#: ../../library/argparse.rst:1559 +msgid "" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> parser.add_argument('-x')\n" +">>> parser.add_argument('foo', nargs='?')\n" +"\n" +">>> # no negative number options, so -1 is a positional argument\n" +">>> parser.parse_args(['-x', '-1'])\n" +"Namespace(foo=None, x='-1')\n" +"\n" +">>> # no negative number options, so -1 and -5 are positional arguments\n" +">>> parser.parse_args(['-x', '-1', '-5'])\n" +"Namespace(foo='-5', x='-1')\n" +"\n" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> parser.add_argument('-1', dest='one')\n" +">>> parser.add_argument('foo', nargs='?')\n" +"\n" +">>> # negative number options present, so -1 is an option\n" +">>> parser.parse_args(['-1', 'X'])\n" +"Namespace(foo=None, one='X')\n" +"\n" +">>> # negative number options present, so -2 is an option\n" +">>> parser.parse_args(['-2'])\n" +"usage: PROG [-h] [-1 ONE] [foo]\n" +"PROG: error: no such option: -2\n" +"\n" +">>> # negative number options present, so both -1s are options\n" +">>> parser.parse_args(['-1', '-1'])\n" +"usage: PROG [-h] [-1 ONE] [foo]\n" +"PROG: error: argument -1: expected one argument" +msgstr "" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> parser.add_argument('-x')\n" +">>> parser.add_argument('foo', nargs='?')\n" +"\n" +">>> # 没有负数选项,因此 -1 是位置参数\n" +">>> parser.parse_args(['-x', '-1'])\n" +"Namespace(foo=None, x='-1')\n" +"\n" +">>> # 没有负数选项,因此 -1 和 -5 是位置参数\n" +">>> parser.parse_args(['-x', '-1', '-5'])\n" +"Namespace(foo='-5', x='-1')\n" +"\n" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> parser.add_argument('-1', dest='one')\n" +">>> parser.add_argument('foo', nargs='?')\n" +"\n" +">>> # 有负数选项,因此 -1 是选项\n" +">>> parser.parse_args(['-1', 'X'])\n" +"Namespace(foo=None, one='X')\n" +"\n" +">>> # 有负数选项,因此 -2 是选项\n" +">>> parser.parse_args(['-2'])\n" +"usage: PROG [-h] [-1 ONE] [foo]\n" +"PROG: error: no such option: -2\n" +"\n" +">>> # 有负数选项,因此两个 -1 都是选项\n" +">>> parser.parse_args(['-1', '-1'])\n" +"usage: PROG [-h] [-1 ONE] [foo]\n" +"PROG: error: argument -1: expected one argument" + +#: ../../library/argparse.rst:1589 +msgid "" +"If you have positional arguments that must begin with ``-`` and don't look " +"like negative numbers, you can insert the pseudo-argument ``'--'`` which " +"tells :meth:`~ArgumentParser.parse_args` that everything after that is a " +"positional argument::" +msgstr "" +"如果你有必须以 ``-`` 打头的位置参数并且看起来不像负数,你可以插入伪参数 ``'--'`` 以告诉 " +":meth:`~ArgumentParser.parse_args` 在那之后的内容是一个位置参数::" + +#: ../../library/argparse.rst:1594 +msgid "" +">>> parser.parse_args(['--', '-f'])\n" +"Namespace(foo='-f', one=None)" +msgstr "" +">>> parser.parse_args(['--', '-f'])\n" +"Namespace(foo='-f', one=None)" + +#: ../../library/argparse.rst:1597 +msgid "" +"See also :ref:`the argparse howto on ambiguous arguments ` for more details." +msgstr "" +"另请参阅 :ref:`针对有歧义参数的 argparse 指引 ` 来了解更多细节。" + +#: ../../library/argparse.rst:1603 +msgid "Argument abbreviations (prefix matching)" +msgstr "参数缩写(前缀匹配)" + +#: ../../library/argparse.rst:1605 +msgid "" +"The :meth:`~ArgumentParser.parse_args` method :ref:`by default " +"` allows long options to be abbreviated to a prefix, if the " +"abbreviation is unambiguous (the prefix matches a unique option)::" +msgstr "" +":meth:`~ArgumentParser.parse_args` 方法 :ref:`在默认情况下 ` " +"允许将长选项缩写为前缀,如果缩写无歧义(即前缀与一个特定选项相匹配)的话::" + +#: ../../library/argparse.rst:1609 +msgid "" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> parser.add_argument('-bacon')\n" +">>> parser.add_argument('-badger')\n" +">>> parser.parse_args('-bac MMM'.split())\n" +"Namespace(bacon='MMM', badger=None)\n" +">>> parser.parse_args('-bad WOOD'.split())\n" +"Namespace(bacon=None, badger='WOOD')\n" +">>> parser.parse_args('-ba BA'.split())\n" +"usage: PROG [-h] [-bacon BACON] [-badger BADGER]\n" +"PROG: error: ambiguous option: -ba could match -badger, -bacon" +msgstr "" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> parser.add_argument('-bacon')\n" +">>> parser.add_argument('-badger')\n" +">>> parser.parse_args('-bac MMM'.split())\n" +"Namespace(bacon='MMM', badger=None)\n" +">>> parser.parse_args('-bad WOOD'.split())\n" +"Namespace(bacon=None, badger='WOOD')\n" +">>> parser.parse_args('-ba BA'.split())\n" +"usage: PROG [-h] [-bacon BACON] [-badger BADGER]\n" +"PROG: error: ambiguous option: -ba could match -badger, -bacon" + +#: ../../library/argparse.rst:1620 +msgid "" +"An error is produced for arguments that could produce more than one options." +" This feature can be disabled by setting :ref:`allow_abbrev` to ``False``." +msgstr "可产生一个以上选项的参数会引发错误。此特性可通过将 :ref:`allow_abbrev` 设为 ``False`` 来禁用。" + +#: ../../library/argparse.rst:1626 +msgid "Beyond ``sys.argv``" +msgstr "在 ``sys.argv`` 以外" + +#: ../../library/argparse.rst:1628 +msgid "" +"Sometimes it may be useful to have an :class:`ArgumentParser` parse " +"arguments other than those of :data:`sys.argv`. This can be accomplished by" +" passing a list of strings to :meth:`~ArgumentParser.parse_args`. This is " +"useful for testing at the interactive prompt::" +msgstr "" +"有时在 :data:`sys.argv` 以外增加 :class:`ArgumentParser` 解析参数也很有用处。这可以通过将一个字符串列表传给 " +":meth:`~ArgumentParser.parse_args` 来实现。它适用于在交互提示符下进行测试::" + +#: ../../library/argparse.rst:1633 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument(\n" +"... 'integers', metavar='int', type=int, choices=range(10),\n" +"... nargs='+', help='an integer in the range 0..9')\n" +">>> parser.add_argument(\n" +"... '--sum', dest='accumulate', action='store_const', const=sum,\n" +"... default=max, help='sum the integers (default: find the max)')\n" +">>> parser.parse_args(['1', '2', '3', '4'])\n" +"Namespace(accumulate=, integers=[1, 2, 3, 4])\n" +">>> parser.parse_args(['1', '2', '3', '4', '--sum'])\n" +"Namespace(accumulate=, integers=[1, 2, 3, 4])" +msgstr "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument(\n" +"... 'integers', metavar='int', type=int, choices=range(10),\n" +"... nargs='+', help='an integer in the range 0..9')\n" +">>> parser.add_argument(\n" +"... '--sum', dest='accumulate', action='store_const', const=sum,\n" +"... default=max, help='sum the integers (default: find the max)')\n" +">>> parser.parse_args(['1', '2', '3', '4'])\n" +"Namespace(accumulate=, integers=[1, 2, 3, 4])\n" +">>> parser.parse_args(['1', '2', '3', '4', '--sum'])\n" +"Namespace(accumulate=, integers=[1, 2, 3, 4])" + +#: ../../library/argparse.rst:1648 +msgid "The Namespace object" +msgstr "命名空间对象" + +#: ../../library/argparse.rst:1652 +msgid "" +"Simple class used by default by :meth:`~ArgumentParser.parse_args` to create" +" an object holding attributes and return it." +msgstr "由 :meth:`~ArgumentParser.parse_args` 默认使用的简单类,可创建一个存放属性的对象并将其返回。" + +#: ../../library/argparse.rst:1655 +msgid "" +"This class is deliberately simple, just an :class:`object` subclass with a " +"readable string representation. If you prefer to have dict-like view of the " +"attributes, you can use the standard Python idiom, :func:`vars`::" +msgstr "" +"这个类被有意做得很简单,只是一个具有可读字符串表示形式的 :class:`object` 子类。如果你更喜欢类似字典的属性视图,你可以使用标准 " +"Python 中惯常的 :func:`vars`::" + +#: ../../library/argparse.rst:1659 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo')\n" +">>> args = parser.parse_args(['--foo', 'BAR'])\n" +">>> vars(args)\n" +"{'foo': 'BAR'}" +msgstr "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo')\n" +">>> args = parser.parse_args(['--foo', 'BAR'])\n" +">>> vars(args)\n" +"{'foo': 'BAR'}" + +#: ../../library/argparse.rst:1665 +msgid "" +"It may also be useful to have an :class:`ArgumentParser` assign attributes " +"to an already existing object, rather than a new :class:`Namespace` object." +" This can be achieved by specifying the ``namespace=`` keyword argument::" +msgstr "" +"另一个用处是让 :class:`ArgumentParser` 为一个已存在对象而不是为一个新的 :class:`Namespace` 对象的属性赋值。" +" 这可以通过指定 ``namespace=`` 关键字参数来实现::" + +#: ../../library/argparse.rst:1669 +msgid "" +">>> class C:\n" +"... pass\n" +"...\n" +">>> c = C()\n" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo')\n" +">>> parser.parse_args(args=['--foo', 'BAR'], namespace=c)\n" +">>> c.foo\n" +"'BAR'" +msgstr "" +">>> class C:\n" +"... pass\n" +"...\n" +">>> c = C()\n" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo')\n" +">>> parser.parse_args(args=['--foo', 'BAR'], namespace=c)\n" +">>> c.foo\n" +"'BAR'" + +#: ../../library/argparse.rst:1681 +msgid "Other utilities" +msgstr "其它实用工具" + +#: ../../library/argparse.rst:1684 +msgid "Subcommands" +msgstr "子命令" + +#: ../../library/argparse.rst:1691 +msgid "" +"Many programs split up their functionality into a number of subcommands, for" +" example, the ``svn`` program can invoke subcommands like ``svn checkout``, " +"``svn update``, and ``svn commit``. Splitting up functionality this way can" +" be a particularly good idea when a program performs several different " +"functions which require different kinds of command-line arguments. " +":class:`ArgumentParser` supports the creation of such subcommands with the " +":meth:`!add_subparsers` method. The :meth:`!add_subparsers` method is " +"normally called with no arguments and returns a special action object. This" +" object has a single method, :meth:`~_SubParsersAction.add_parser`, which " +"takes a command name and any :class:`!ArgumentParser` constructor arguments," +" and returns an :class:`!ArgumentParser` object that can be modified as " +"usual." +msgstr "" +"许多程序都将其功能拆分为一系列子命令,例如,``svn`` 程序可唤起像 ``svn checkout``, ``svn update`` 和 " +"``svn commit`` " +"等子命令。当一个程序执行的多种不同功能需要不同类型的命令行参数时,这种拆分功能的方式是一个非常好的主意。:class:`ArgumentParser` " +"通过 :meth:`!add_subparsers` 方法支持创建这样的子命令。:meth:`!add_subparsers` " +"方法通常不带参数地调用并返回一个特殊的动作对象。该对象只有一个方法 " +":meth:`~_SubParsersAction.add_parser`,它接受一个命令名称和任意多个 " +":class:`!ArgumentParser` 构造器参数,并返回一个可以通常方式进行修改的 :class:`!ArgumentParser` 对象。" + +#: ../../library/argparse.rst:1703 +msgid "Description of parameters:" +msgstr "形参的描述" + +#: ../../library/argparse.rst:1705 +msgid "" +"*title* - title for the sub-parser group in help output; by default " +"\"subcommands\" if description is provided, otherwise uses title for " +"positional arguments" +msgstr "*title* - 帮助输出中子解析器分组的标题;如果提供了描述则默认为 \"subcommands\",否则使用位置参数的标题" + +#: ../../library/argparse.rst:1709 +msgid "" +"*description* - description for the sub-parser group in help output, by " +"default ``None``" +msgstr "*description* - 帮助输出中对子解析器组的描述,默认为 ``None``" + +#: ../../library/argparse.rst:1712 +msgid "" +"*prog* - usage information that will be displayed with subcommand help, by " +"default the name of the program and any positional arguments before the " +"subparser argument" +msgstr "*prog* - 将与子命令帮助一同显示的用法信息,默认为程序名和子解析器参数之前的任何位置参数" + +#: ../../library/argparse.rst:1716 +msgid "" +"*parser_class* - class which will be used to create sub-parser instances, by" +" default the class of the current parser (e.g. :class:`ArgumentParser`)" +msgstr "" +"*parser_class* - 将被用于创建子解析器实例的类,默认为当前解析器类 (例如 :class:`ArgumentParser`)" + +#: ../../library/argparse.rst:1719 +msgid "" +"action_ - the basic type of action to be taken when this argument is " +"encountered at the command line" +msgstr "action_ - 当此参数在命令行中出现时要执行动作的基本类型" + +#: ../../library/argparse.rst:1722 +msgid "" +"dest_ - name of the attribute under which subcommand name will be stored; by" +" default ``None`` and no value is stored" +msgstr "dest_ - 将被用于保存子命令名称的属性名;默认为 ``None`` 即不保存任何值" + +#: ../../library/argparse.rst:1725 +msgid "" +"required_ - Whether or not a subcommand must be provided, by default " +"``False`` (added in 3.7)" +msgstr "required_ - 是否必须要提供子命令,默认为 ``False`` (在 3.7 中新增)" + +#: ../../library/argparse.rst:1728 +msgid "help_ - help for sub-parser group in help output, by default ``None``" +msgstr "help_ - 在输出帮助中的子解析器分组帮助信息,默认为 ``None``" + +#: ../../library/argparse.rst:1730 +msgid "" +"metavar_ - string presenting available subcommands in help; by default it is" +" ``None`` and presents subcommands in form {cmd1, cmd2, ..}" +msgstr "metavar_ - 帮助信息中表示可用子命令的字符串;默认为 ``None`` 并以 {cmd1, cmd2, ..} 的形式表示子命令" + +#: ../../library/argparse.rst:1733 +msgid "Some example usage::" +msgstr "一些使用示例::" + +#: ../../library/argparse.rst:1735 +msgid "" +">>> # create the top-level parser\n" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> parser.add_argument('--foo', action='store_true', help='foo help')\n" +">>> subparsers = parser.add_subparsers(help='subcommand help')\n" +">>>\n" +">>> # create the parser for the \"a\" command\n" +">>> parser_a = subparsers.add_parser('a', help='a help')\n" +">>> parser_a.add_argument('bar', type=int, help='bar help')\n" +">>>\n" +">>> # create the parser for the \"b\" command\n" +">>> parser_b = subparsers.add_parser('b', help='b help')\n" +">>> parser_b.add_argument('--baz', choices=('X', 'Y', 'Z'), help='baz help')\n" +">>>\n" +">>> # parse some argument lists\n" +">>> parser.parse_args(['a', '12'])\n" +"Namespace(bar=12, foo=False)\n" +">>> parser.parse_args(['--foo', 'b', '--baz', 'Z'])\n" +"Namespace(baz='Z', foo=True)" +msgstr "" +">>> # 创建一个最高层级解析器\n" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> parser.add_argument('--foo', action='store_true', help='foo help')\n" +">>> subparsers = parser.add_subparsers(help='subcommand help')\n" +">>>\n" +">>> # 创建一个针对 \"a\" 命令的解析器\n" +">>> parser_a = subparsers.add_parser('a', help='a help')\n" +">>> parser_a.add_argument('bar', type=int, help='bar help')\n" +">>>\n" +">>> # 创建一个针对 \"b\" 命令的解析器\n" +">>> parser_b = subparsers.add_parser('b', help='b help')\n" +">>> parser_b.add_argument('--baz', choices=('X', 'Y', 'Z'), help='baz help')\n" +">>>\n" +">>> # 解析一些参数列表\n" +">>> parser.parse_args(['a', '12'])\n" +"Namespace(bar=12, foo=False)\n" +">>> parser.parse_args(['--foo', 'b', '--baz', 'Z'])\n" +"Namespace(baz='Z', foo=True)" + +#: ../../library/argparse.rst:1754 +msgid "" +"Note that the object returned by :meth:`parse_args` will only contain " +"attributes for the main parser and the subparser that was selected by the " +"command line (and not any other subparsers). So in the example above, when " +"the ``a`` command is specified, only the ``foo`` and ``bar`` attributes are " +"present, and when the ``b`` command is specified, only the ``foo`` and " +"``baz`` attributes are present." +msgstr "" +"请注意 :meth:`parse_args` " +"返回的对象将只包含主解析器和由命令行所选择的子解析器的属性(而没有任何其他子解析器)。因此在上面的例子中,当指定了 ``a`` 命令时,将只存在 " +"``foo`` 和 ``bar`` 属性,而当指定了 ``b`` 命令时,则只存在 ``foo`` 和 ``baz`` 属性。" + +#: ../../library/argparse.rst:1761 +msgid "" +"Similarly, when a help message is requested from a subparser, only the help " +"for that particular parser will be printed. The help message will not " +"include parent parser or sibling parser messages. (A help message for each " +"subparser command, however, can be given by supplying the ``help=`` argument" +" to :meth:`~_SubParsersAction.add_parser` as above.)" +msgstr "" +"类似地,当一个子解析器请求帮助消息时,只有该特定解析器的帮助消息会被打印出来。帮助消息将不包括父解析器或同级解析器的消息。(每个子解析器命令一条帮助消息,但是,也可以像上面那样通过将" +" ``help=`` 参数传入 :meth:`~_SubParsersAction.add_parser` 来给出。)" + +#: ../../library/argparse.rst:1769 +msgid "" +">>> parser.parse_args(['--help'])\n" +"usage: PROG [-h] [--foo] {a,b} ...\n" +"\n" +"positional arguments:\n" +" {a,b} subcommand help\n" +" a a help\n" +" b b help\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" --foo foo help\n" +"\n" +">>> parser.parse_args(['a', '--help'])\n" +"usage: PROG a [-h] bar\n" +"\n" +"positional arguments:\n" +" bar bar help\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +"\n" +">>> parser.parse_args(['b', '--help'])\n" +"usage: PROG b [-h] [--baz {X,Y,Z}]\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" --baz {X,Y,Z} baz help" +msgstr "" +">>> parser.parse_args(['--help'])\n" +"usage: PROG [-h] [--foo] {a,b} ...\n" +"\n" +"positional arguments:\n" +" {a,b} subcommand help\n" +" a a help\n" +" b b help\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" --foo foo help\n" +"\n" +">>> parser.parse_args(['a', '--help'])\n" +"usage: PROG a [-h] bar\n" +"\n" +"positional arguments:\n" +" bar bar help\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +"\n" +">>> parser.parse_args(['b', '--help'])\n" +"usage: PROG b [-h] [--baz {X,Y,Z}]\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +" --baz {X,Y,Z} baz help" + +#: ../../library/argparse.rst:1797 +msgid "" +"The :meth:`add_subparsers` method also supports ``title`` and " +"``description`` keyword arguments. When either is present, the subparser's " +"commands will appear in their own group in the help output. For example::" +msgstr "" +":meth:`add_subparsers` 方法也支持 ``title`` 和 ``description`` " +"关键字参数。当其中任意一个存在时,子解析器的命令将出现在输出帮助消息中它们自己的分组内。例如::" + +#: ../../library/argparse.rst:1801 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> subparsers = parser.add_subparsers(title='subcommands',\n" +"... description='valid subcommands',\n" +"... help='additional help')\n" +">>> subparsers.add_parser('foo')\n" +">>> subparsers.add_parser('bar')\n" +">>> parser.parse_args(['-h'])\n" +"usage: [-h] {foo,bar} ...\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +"\n" +"subcommands:\n" +" valid subcommands\n" +"\n" +" {foo,bar} additional help" +msgstr "" +">>> parser = argparse.ArgumentParser()\n" +">>> subparsers = parser.add_subparsers(title='subcommands',\n" +"... description='valid subcommands',\n" +"... help='additional help')\n" +">>> subparsers.add_parser('foo')\n" +">>> subparsers.add_parser('bar')\n" +">>> parser.parse_args(['-h'])\n" +"usage: [-h] {foo,bar} ...\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +"\n" +"subcommands:\n" +" valid subcommands\n" +"\n" +" {foo,bar} additional help" + +#: ../../library/argparse.rst:1818 +msgid "" +"Furthermore, :meth:`~_SubParsersAction.add_parser` supports an additional " +"*aliases* argument, which allows multiple strings to refer to the same " +"subparser. This example, like ``svn``, aliases ``co`` as a shorthand for " +"``checkout``::" +msgstr "" +"此外,:meth:`~_SubParsersAction.add_parser` 还支持附加的 *aliases* " +"参数,它允许多个字符串指向同一个子解析器。下面的例子,类似于 ``svn``,将别名 ``co`` 设为 ``checkout`` 的缩写形式::" + +#: ../../library/argparse.rst:1823 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> subparsers = parser.add_subparsers()\n" +">>> checkout = subparsers.add_parser('checkout', aliases=['co'])\n" +">>> checkout.add_argument('foo')\n" +">>> parser.parse_args(['co', 'bar'])\n" +"Namespace(foo='bar')" +msgstr "" +">>> parser = argparse.ArgumentParser()\n" +">>> subparsers = parser.add_subparsers()\n" +">>> checkout = subparsers.add_parser('checkout', aliases=['co'])\n" +">>> checkout.add_argument('foo')\n" +">>> parser.parse_args(['co', 'bar'])\n" +"Namespace(foo='bar')" + +#: ../../library/argparse.rst:1830 +msgid "" +":meth:`~_SubParsersAction.add_parser` supports also an additional " +"*deprecated* argument, which allows to deprecate the subparser." +msgstr "" +":meth:`~_SubParsersAction.add_parser` 也支持附加的 *deprecated* 参数,它允许弃用子解析器。" + +#: ../../library/argparse.rst:1844 +msgid "" +"One particularly effective way of handling subcommands is to combine the use" +" of the :meth:`add_subparsers` method with calls to :meth:`set_defaults` so " +"that each subparser knows which Python function it should execute. For " +"example::" +msgstr "" +"一个特别有效的处理子命令的方式是将 :meth:`add_subparsers` 方法与对 :meth:`set_defaults` " +"的调用结合起来使用以便每个子解析器能知道应当执行哪个 Python 函数。例如::" + +#: ../../library/argparse.rst:1849 +msgid "" +">>> # subcommand functions\n" +">>> def foo(args):\n" +"... print(args.x * args.y)\n" +"...\n" +">>> def bar(args):\n" +"... print('((%s))' % args.z)\n" +"...\n" +">>> # create the top-level parser\n" +">>> parser = argparse.ArgumentParser()\n" +">>> subparsers = parser.add_subparsers(required=True)\n" +">>>\n" +">>> # create the parser for the \"foo\" command\n" +">>> parser_foo = subparsers.add_parser('foo')\n" +">>> parser_foo.add_argument('-x', type=int, default=1)\n" +">>> parser_foo.add_argument('y', type=float)\n" +">>> parser_foo.set_defaults(func=foo)\n" +">>>\n" +">>> # create the parser for the \"bar\" command\n" +">>> parser_bar = subparsers.add_parser('bar')\n" +">>> parser_bar.add_argument('z')\n" +">>> parser_bar.set_defaults(func=bar)\n" +">>>\n" +">>> # parse the args and call whatever function was selected\n" +">>> args = parser.parse_args('foo 1 -x 2'.split())\n" +">>> args.func(args)\n" +"2.0\n" +">>>\n" +">>> # parse the args and call whatever function was selected\n" +">>> args = parser.parse_args('bar XYZYX'.split())\n" +">>> args.func(args)\n" +"((XYZYX))" +msgstr "" +">>> # 子命令函数\n" +">>> def foo(args):\n" +"... print(args.x * args.y)\n" +"...\n" +">>> def bar(args):\n" +"... print('((%s))' % args.z)\n" +"...\n" +">>> # 创建最高层级解析器\n" +">>> parser = argparse.ArgumentParser()\n" +">>> subparsers = parser.add_subparsers(required=True)\n" +">>>\n" +">>> # 创建针对 \"foo\" 命令的解析器\n" +">>> parser_foo = subparsers.add_parser('foo')\n" +">>> parser_foo.add_argument('-x', type=int, default=1)\n" +">>> parser_foo.add_argument('y', type=float)\n" +">>> parser_foo.set_defaults(func=foo)\n" +">>>\n" +">>> # 创建针对 \"bar\" 命令的解析器\n" +">>> parser_bar = subparsers.add_parser('bar')\n" +">>> parser_bar.add_argument('z')\n" +">>> parser_bar.set_defaults(func=bar)\n" +">>>\n" +">>> # 解析参数并调用被选定的任何函数\n" +">>> args = parser.parse_args('foo 1 -x 2'.split())\n" +">>> args.func(args)\n" +"2.0\n" +">>>\n" +">>> # 解析参数并调用被选定的任何函数\n" +">>> args = parser.parse_args('bar XYZYX'.split())\n" +">>> args.func(args)\n" +"((XYZYX))" + +#: ../../library/argparse.rst:1881 +msgid "" +"This way, you can let :meth:`parse_args` do the job of calling the " +"appropriate function after argument parsing is complete. Associating " +"functions with actions like this is typically the easiest way to handle the " +"different actions for each of your subparsers. However, if it is necessary " +"to check the name of the subparser that was invoked, the ``dest`` keyword " +"argument to the :meth:`add_subparsers` call will work::" +msgstr "" +"通过这种方式,你可以在参数解析结束后让 :meth:`parse_args` " +"执行调用适当函数的任务。像这样将函数关联到动作通常是你处理每个子解析器的不同动作的最简便方式。但是,如果有必要检查被唤起的子解析器的名称,则 " +":meth:`add_subparsers` 调用的 ``dest`` 关键字参数将可实现::" + +#: ../../library/argparse.rst:1888 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> subparsers = parser.add_subparsers(dest='subparser_name')\n" +">>> subparser1 = subparsers.add_parser('1')\n" +">>> subparser1.add_argument('-x')\n" +">>> subparser2 = subparsers.add_parser('2')\n" +">>> subparser2.add_argument('y')\n" +">>> parser.parse_args(['2', 'frobble'])\n" +"Namespace(subparser_name='2', y='frobble')" +msgstr "" +">>> parser = argparse.ArgumentParser()\n" +">>> subparsers = parser.add_subparsers(dest='subparser_name')\n" +">>> subparser1 = subparsers.add_parser('1')\n" +">>> subparser1.add_argument('-x')\n" +">>> subparser2 = subparsers.add_parser('2')\n" +">>> subparser2.add_argument('y')\n" +">>> parser.parse_args(['2', 'frobble'])\n" +"Namespace(subparser_name='2', y='frobble')" + +#: ../../library/argparse.rst:1897 +msgid "New *required* keyword-only parameter." +msgstr "新增 *required* 仅限关键字形参。" + +#: ../../library/argparse.rst:1900 +msgid "" +"Subparser's *prog* is no longer affected by a custom usage message in the " +"main parser." +msgstr "子解析器的 *prog* 将不再受主解析器中自定义用法说明消息的影响。" + +#: ../../library/argparse.rst:1906 +msgid "FileType objects" +msgstr "FileType 对象" + +#: ../../library/argparse.rst:1910 +msgid "" +"The :class:`FileType` factory creates objects that can be passed to the type" +" argument of :meth:`ArgumentParser.add_argument`. Arguments that have " +":class:`FileType` objects as their type will open command-line arguments as " +"files with the requested modes, buffer sizes, encodings and error handling " +"(see the :func:`open` function for more details)::" +msgstr "" +":class:`FileType` 工厂类用于创建可作为 :meth:`ArgumentParser.add_argument` 的 type " +"参数传入的对象。以 :class:`FileType` " +"对象作为其类型的参数将使用命令行参数以所请求模式、缓冲区大小、编码格式和错误处理方式打开文件(请参阅 :func:`open` 函数了解详情)::" + +#: ../../library/argparse.rst:1916 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--raw', type=argparse.FileType('wb', 0))\n" +">>> parser.add_argument('out', type=argparse.FileType('w', encoding='UTF-8'))\n" +">>> parser.parse_args(['--raw', 'raw.dat', 'file.txt'])\n" +"Namespace(out=<_io.TextIOWrapper name='file.txt' mode='w' encoding='UTF-8'>, raw=<_io.FileIO name='raw.dat' mode='wb'>)" +msgstr "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--raw', type=argparse.FileType('wb', 0))\n" +">>> parser.add_argument('out', type=argparse.FileType('w', encoding='UTF-8'))\n" +">>> parser.parse_args(['--raw', 'raw.dat', 'file.txt'])\n" +"Namespace(out=<_io.TextIOWrapper name='file.txt' mode='w' encoding='UTF-8'>, raw=<_io.FileIO name='raw.dat' mode='wb'>)" + +#: ../../library/argparse.rst:1922 +msgid "" +"FileType objects understand the pseudo-argument ``'-'`` and automatically " +"convert this into :data:`sys.stdin` for readable :class:`FileType` objects " +"and :data:`sys.stdout` for writable :class:`FileType` objects::" +msgstr "" +"FileType 对象能理解伪参数 ``'-'`` 并会自动将其转换为 :data:`sys.stdin` 用于可读的 " +":class:`FileType` 对象以及 :data:`sys.stdout` 用于可写的 :class:`FileType` 对象::" + +#: ../../library/argparse.rst:1926 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('infile', type=argparse.FileType('r'))\n" +">>> parser.parse_args(['-'])\n" +"Namespace(infile=<_io.TextIOWrapper name='' encoding='UTF-8'>)" +msgstr "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('infile', type=argparse.FileType('r'))\n" +">>> parser.parse_args(['-'])\n" +"Namespace(infile=<_io.TextIOWrapper name='' encoding='UTF-8'>)" + +#: ../../library/argparse.rst:1933 +msgid "" +"If one argument uses *FileType* and then a subsequent argument fails, an " +"error is reported but the file is not automatically closed. This can also " +"clobber the output files. In this case, it would be better to wait until " +"after the parser has run and then use the :keyword:`with`-statement to " +"manage the files." +msgstr "" +"如果一个参数使用 " +"*FileType*,然后随后的参数失败,则报告错误,但文件不会自动关闭。这也会破坏输出文件。在这种情况下,最好等到解析器运行之后,然后使用 " +":keyword:`with` 语句来管理文件。" + +#: ../../library/argparse.rst:1939 +msgid "Added the *encoding* and *errors* parameters." +msgstr "增加了 *encoding* 和 *errors* 形参。" + +#: ../../library/argparse.rst:1946 +msgid "Argument groups" +msgstr "参数组" + +#: ../../library/argparse.rst:1951 +msgid "" +"By default, :class:`ArgumentParser` groups command-line arguments into " +"\"positional arguments\" and \"options\" when displaying help messages. When" +" there is a better conceptual grouping of arguments than this default one, " +"appropriate groups can be created using the :meth:`!add_argument_group` " +"method::" +msgstr "" +"在默认情况下,:class:`ArgumentParser` " +"会在显示帮助消息时将命令行参数分为“位置参数”和“选项”两组。当存在比默认更好的分组概念时,可以使用 " +":meth:`!add_argument_group` 方法来创建适当的分组::" + +#: ../../library/argparse.rst:1957 +msgid "" +">>> parser = argparse.ArgumentParser(prog='PROG', add_help=False)\n" +">>> group = parser.add_argument_group('group')\n" +">>> group.add_argument('--foo', help='foo help')\n" +">>> group.add_argument('bar', help='bar help')\n" +">>> parser.print_help()\n" +"usage: PROG [--foo FOO] bar\n" +"\n" +"group:\n" +" bar bar help\n" +" --foo FOO foo help" +msgstr "" +">>> parser = argparse.ArgumentParser(prog='PROG', add_help=False)\n" +">>> group = parser.add_argument_group('group')\n" +">>> group.add_argument('--foo', help='foo help')\n" +">>> group.add_argument('bar', help='bar help')\n" +">>> parser.print_help()\n" +"usage: PROG [--foo FOO] bar\n" +"\n" +"group:\n" +" bar bar help\n" +" --foo FOO foo help" + +#: ../../library/argparse.rst:1968 +msgid "" +"The :meth:`add_argument_group` method returns an argument group object which" +" has an :meth:`~ArgumentParser.add_argument` method just like a regular " +":class:`ArgumentParser`. When an argument is added to the group, the parser" +" treats it just like a normal argument, but displays the argument in a " +"separate group for help messages. The :meth:`!add_argument_group` method " +"accepts *title* and *description* arguments which can be used to customize " +"this display::" +msgstr "" +":meth:`add_argument_group` 方法返回一个具有 :meth:`~ArgumentParser.add_argument` " +"方法的参数分组对象,这与常规的 :class:`ArgumentParser` " +"一样。当一个参数被加入分组时,解析器会将它视为一个正常的参数,但是会在单独的帮助消息分组中显示该参数。:meth:`!add_argument_group`" +" 方法接受 *title* 和 *description* 参数以使用它们来定制显示内容::" + +#: ../../library/argparse.rst:1976 +msgid "" +">>> parser = argparse.ArgumentParser(prog='PROG', add_help=False)\n" +">>> group1 = parser.add_argument_group('group1', 'group1 description')\n" +">>> group1.add_argument('foo', help='foo help')\n" +">>> group2 = parser.add_argument_group('group2', 'group2 description')\n" +">>> group2.add_argument('--bar', help='bar help')\n" +">>> parser.print_help()\n" +"usage: PROG [--bar BAR] foo\n" +"\n" +"group1:\n" +" group1 description\n" +"\n" +" foo foo help\n" +"\n" +"group2:\n" +" group2 description\n" +"\n" +" --bar BAR bar help" +msgstr "" +">>> parser = argparse.ArgumentParser(prog='PROG', add_help=False)\n" +">>> group1 = parser.add_argument_group('group1', 'group1 description')\n" +">>> group1.add_argument('foo', help='foo help')\n" +">>> group2 = parser.add_argument_group('group2', 'group2 description')\n" +">>> group2.add_argument('--bar', help='bar help')\n" +">>> parser.print_help()\n" +"usage: PROG [--bar BAR] foo\n" +"\n" +"group1:\n" +" group1 description\n" +"\n" +" foo foo help\n" +"\n" +"group2:\n" +" group2 description\n" +"\n" +" --bar BAR bar help" + +#: ../../library/argparse.rst:1994 +msgid "" +"The optional, keyword-only parameters argument_default_ and " +"conflict_handler_ allow for finer-grained control of the behavior of the " +"argument group. These parameters have the same meaning as in the " +":class:`ArgumentParser` constructor, but apply specifically to the argument " +"group rather than the entire parser." +msgstr "" +"可选的仅限关键字形参 argument_default_ 和 conflict_handler_ 允许对参数分组行为进行更细粒度的控制。这些形参具有与 " +":class:`ArgumentParser` 构造器中相同的含义,但是专门应用于参数分组而不是整个解析器。" + +#: ../../library/argparse.rst:1999 +msgid "" +"Note that any arguments not in your user-defined groups will end up back in " +"the usual \"positional arguments\" and \"optional arguments\" sections." +msgstr "请注意任意不在你的自定义分组中的参数最终都将回到通常的“位置参数”和“可选参数”分组中。" + +#: ../../library/argparse.rst:2002 +msgid "" +"Within each argument group, arguments are displayed in help output in the " +"order in which they are added." +msgstr "" + +#: ../../library/argparse.rst:2005 +msgid "" +"Calling :meth:`add_argument_group` on an argument group now raises an " +"exception. This nesting was never supported, often failed to work correctly," +" and was unintentionally exposed through inheritance." +msgstr "" +"在参数分组上调用 :meth:`add_argument_group` " +"现在会引发异常。这样的嵌套从未受到支持,经常无法正确工作,并且是由于继承而在无意中对外公开的。" + +#: ../../library/argparse.rst:2010 +msgid "Passing prefix_chars_ to :meth:`add_argument_group` is now deprecated." +msgstr "将 prefix_chars_ 传给 :meth:`add_argument_group` 的做法现在已被弃用。" + +#: ../../library/argparse.rst:2016 +msgid "Mutual exclusion" +msgstr "互斥" + +#: ../../library/argparse.rst:2020 +msgid "" +"Create a mutually exclusive group. :mod:`!argparse` will make sure that only" +" one of the arguments in the mutually exclusive group was present on the " +"command line::" +msgstr "创建一个互斥分组。:mod:`!argparse` 将会确保互斥分组中只有一个参数在命令行中可用::" + +#: ../../library/argparse.rst:2024 +msgid "" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> group = parser.add_mutually_exclusive_group()\n" +">>> group.add_argument('--foo', action='store_true')\n" +">>> group.add_argument('--bar', action='store_false')\n" +">>> parser.parse_args(['--foo'])\n" +"Namespace(bar=True, foo=True)\n" +">>> parser.parse_args(['--bar'])\n" +"Namespace(bar=False, foo=False)\n" +">>> parser.parse_args(['--foo', '--bar'])\n" +"usage: PROG [-h] [--foo | --bar]\n" +"PROG: error: argument --bar: not allowed with argument --foo" +msgstr "" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> group = parser.add_mutually_exclusive_group()\n" +">>> group.add_argument('--foo', action='store_true')\n" +">>> group.add_argument('--bar', action='store_false')\n" +">>> parser.parse_args(['--foo'])\n" +"Namespace(bar=True, foo=True)\n" +">>> parser.parse_args(['--bar'])\n" +"Namespace(bar=False, foo=False)\n" +">>> parser.parse_args(['--foo', '--bar'])\n" +"usage: PROG [-h] [--foo | --bar]\n" +"PROG: error: argument --bar: not allowed with argument --foo" + +#: ../../library/argparse.rst:2036 +msgid "" +"The :meth:`add_mutually_exclusive_group` method also accepts a *required* " +"argument, to indicate that at least one of the mutually exclusive arguments " +"is required::" +msgstr "" +":meth:`add_mutually_exclusive_group` 方法也接受一个 *required* " +"参数,表示在互斥组中至少有一个参数是需要的::" + +#: ../../library/argparse.rst:2040 +msgid "" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> group = parser.add_mutually_exclusive_group(required=True)\n" +">>> group.add_argument('--foo', action='store_true')\n" +">>> group.add_argument('--bar', action='store_false')\n" +">>> parser.parse_args([])\n" +"usage: PROG [-h] (--foo | --bar)\n" +"PROG: error: one of the arguments --foo --bar is required" +msgstr "" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> group = parser.add_mutually_exclusive_group(required=True)\n" +">>> group.add_argument('--foo', action='store_true')\n" +">>> group.add_argument('--bar', action='store_false')\n" +">>> parser.parse_args([])\n" +"usage: PROG [-h] (--foo | --bar)\n" +"PROG: error: one of the arguments --foo --bar is required" + +#: ../../library/argparse.rst:2048 +msgid "" +"Note that currently mutually exclusive argument groups do not support the " +"*title* and *description* arguments of " +":meth:`~ArgumentParser.add_argument_group`. However, a mutually exclusive " +"group can be added to an argument group that has a title and description. " +"For example::" +msgstr "" +"请注意当前互斥的参数组不支持 :meth:`~ArgumentParser.add_argument_group` 的 *title* 和 " +"*description* 参数。但是,互斥的参数组可以被添加到具有 title 和 description 的参数组中。例如::" + +#: ../../library/argparse.rst:2054 +msgid "" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> group = parser.add_argument_group('Group title', 'Group description')\n" +">>> exclusive_group = group.add_mutually_exclusive_group(required=True)\n" +">>> exclusive_group.add_argument('--foo', help='foo help')\n" +">>> exclusive_group.add_argument('--bar', help='bar help')\n" +">>> parser.print_help()\n" +"usage: PROG [-h] (--foo FOO | --bar BAR)\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +"\n" +"Group title:\n" +" Group description\n" +"\n" +" --foo FOO foo help\n" +" --bar BAR bar help" +msgstr "" +">>> parser = argparse.ArgumentParser(prog='PROG')\n" +">>> group = parser.add_argument_group('Group title', 'Group description')\n" +">>> exclusive_group = group.add_mutually_exclusive_group(required=True)\n" +">>> exclusive_group.add_argument('--foo', help='foo help')\n" +">>> exclusive_group.add_argument('--bar', help='bar help')\n" +">>> parser.print_help()\n" +"usage: PROG [-h] (--foo FOO | --bar BAR)\n" +"\n" +"options:\n" +" -h, --help show this help message and exit\n" +"\n" +"Group title:\n" +" Group description\n" +"\n" +" --foo FOO foo help\n" +" --bar BAR bar help" + +#: ../../library/argparse.rst:2071 +msgid "" +"Calling :meth:`add_argument_group` or :meth:`add_mutually_exclusive_group` " +"on a mutually exclusive group now raises an exception. This nesting was " +"never supported, often failed to work correctly, and was unintentionally " +"exposed through inheritance." +msgstr "" +"在互斥组上调用 :meth:`add_argument_group` 或 :meth:`add_mutually_exclusive_group` " +"现在会引发异常。这种嵌套从未得到支持,经常不能正确工作,并在无意中通过继承暴露出来。" + +#: ../../library/argparse.rst:2079 +msgid "Parser defaults" +msgstr "解析器默认值" + +#: ../../library/argparse.rst:2083 +msgid "" +"Most of the time, the attributes of the object returned by " +":meth:`parse_args` will be fully determined by inspecting the command-line " +"arguments and the argument actions. :meth:`set_defaults` allows some " +"additional attributes that are determined without any inspection of the " +"command line to be added::" +msgstr "" +"在大多数时候,:meth:`parse_args` 所返回对象的属性将完全通过检查命令行参数和参数动作来确定。:meth:`set_defaults` " +"则允许加入一些无须任何命令行检查的额外属性::" + +#: ../../library/argparse.rst:2089 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('foo', type=int)\n" +">>> parser.set_defaults(bar=42, baz='badger')\n" +">>> parser.parse_args(['736'])\n" +"Namespace(bar=42, baz='badger', foo=736)" +msgstr "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('foo', type=int)\n" +">>> parser.set_defaults(bar=42, baz='badger')\n" +">>> parser.parse_args(['736'])\n" +"Namespace(bar=42, baz='badger', foo=736)" + +#: ../../library/argparse.rst:2095 +msgid "" +"Note that defaults can be set at both the parser level using " +":meth:`set_defaults` and at the argument level using :meth:`add_argument`. " +"If both are called for the same argument, the last default set for an " +"argument is used::" +msgstr "" +"请注意默认值可以使用 :meth:`set_defaults` 在解析器层级设置也可以使用 :meth:`add_argument` " +"在参数层级设置。如果为同一个参数同时调用这两者,则会使用该参数的最后一次默认值设置::" + +#: ../../library/argparse.rst:2099 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', default='bar')\n" +">>> parser.set_defaults(foo='spam')\n" +">>> parser.parse_args([])\n" +"Namespace(foo='spam')" +msgstr "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', default='bar')\n" +">>> parser.set_defaults(foo='spam')\n" +">>> parser.parse_args([])\n" +"Namespace(foo='spam')" + +#: ../../library/argparse.rst:2105 +msgid "" +"Parser-level defaults can be particularly useful when working with multiple " +"parsers. See the :meth:`~ArgumentParser.add_subparsers` method for an " +"example of this type." +msgstr "" +"解析器层级默认值在需要多解析器时会特别有用。请参阅 :meth:`~ArgumentParser.add_subparsers` " +"方法了解此类型的一个示例。" + +#: ../../library/argparse.rst:2111 +msgid "" +"Get the default value for a namespace attribute, as set by either " +":meth:`~ArgumentParser.add_argument` or by " +":meth:`~ArgumentParser.set_defaults`::" +msgstr "" +"获取一个命名空间属性的默认值,该值是由 :meth:`~ArgumentParser.add_argument` 或 " +":meth:`~ArgumentParser.set_defaults` 设置的::" + +#: ../../library/argparse.rst:2115 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', default='badger')\n" +">>> parser.get_default('foo')\n" +"'badger'" +msgstr "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', default='badger')\n" +">>> parser.get_default('foo')\n" +"'badger'" + +#: ../../library/argparse.rst:2122 +msgid "Printing help" +msgstr "打印帮助" + +#: ../../library/argparse.rst:2124 +msgid "" +"In most typical applications, :meth:`~ArgumentParser.parse_args` will take " +"care of formatting and printing any usage or error messages. However, " +"several formatting methods are available:" +msgstr "" +"在大多数典型应用中,:meth:`~ArgumentParser.parse_args` " +"将负责任何用法和错误消息的格式化和打印。但是,也可使用某些其他格式化方法:" + +#: ../../library/argparse.rst:2130 +msgid "" +"Print a brief description of how the :class:`ArgumentParser` should be " +"invoked on the command line. If *file* is ``None``, :data:`sys.stdout` is " +"assumed." +msgstr "" +"打印一段简短描述,说明应当如何在命令行中唤起 :class:`ArgumentParser`。如果 *file* 为 ``None``,则默认使用 " +":data:`sys.stdout`." + +#: ../../library/argparse.rst:2136 +msgid "" +"Print a help message, including the program usage and information about the " +"arguments registered with the :class:`ArgumentParser`. If *file* is " +"``None``, :data:`sys.stdout` is assumed." +msgstr "" +"打印一条帮助消息,包括程序用法和通过 :class:`ArgumentParser` 注册的相关参数信息。如果 *file* 为 " +"``None``,则默认使用 :data:`sys.stdout`。" + +#: ../../library/argparse.rst:2140 +msgid "" +"There are also variants of these methods that simply return a string instead" +" of printing it:" +msgstr "还存在这些方法的几个变化形式,它们只返回字符串而不打印消息:" + +#: ../../library/argparse.rst:2145 +msgid "" +"Return a string containing a brief description of how the " +":class:`ArgumentParser` should be invoked on the command line." +msgstr "返回一个包含简短描述的字符串,说明应当如何在命令行中唤起 :class:`ArgumentParser`。" + +#: ../../library/argparse.rst:2150 +msgid "" +"Return a string containing a help message, including the program usage and " +"information about the arguments registered with the :class:`ArgumentParser`." +msgstr "返回一个包含帮助消息的字符串,包括程序用法和通过 :class:`ArgumentParser` 注册的相关参数信息。" + +#: ../../library/argparse.rst:2155 +msgid "Partial parsing" +msgstr "部分解析" + +#: ../../library/argparse.rst:2159 +msgid "" +"Sometimes a script only needs to handle a specific set of command-line " +"arguments, leaving any unrecognized arguments for another script or program." +" In these cases, the :meth:`~ArgumentParser.parse_known_args` method can be " +"useful." +msgstr "" +"有时一个脚本只需要处理特定的命令行参数集合,把不能识别的参数留给其他脚本或程序。在这种情况下,:meth:`~ArgumentParser.parse_known_args`" +" 方法就会很有用处。" + +#: ../../library/argparse.rst:2164 +msgid "" +"This method works similarly to :meth:`~ArgumentParser.parse_args`, but it " +"does not raise an error for extra, unrecognized arguments. Instead, it " +"parses the known arguments and returns a two item tuple that contains the " +"populated namespace and the list of any unrecognized arguments." +msgstr "" +"此方法的运作方式与 :meth:`~ArgumentParser.parse_args` " +"类似,但它不会针对额外的不能识别的参数引发错误。它会解析已知参数并返回一个包含已填充命名空间和不能识别的参数列表的二元组。" + +#: ../../library/argparse.rst:2171 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', action='store_true')\n" +">>> parser.add_argument('bar')\n" +">>> parser.parse_known_args(['--foo', '--badger', 'BAR', 'spam'])\n" +"(Namespace(bar='BAR', foo=True), ['--badger', 'spam'])" +msgstr "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo', action='store_true')\n" +">>> parser.add_argument('bar')\n" +">>> parser.parse_known_args(['--foo', '--badger', 'BAR', 'spam'])\n" +"(Namespace(bar='BAR', foo=True), ['--badger', 'spam'])" + +#: ../../library/argparse.rst:2178 +msgid "" +":ref:`Prefix matching ` rules apply to " +":meth:`~ArgumentParser.parse_known_args`. The parser may consume an option " +"even if it's just a prefix of one of its known options, instead of leaving " +"it in the remaining arguments list." +msgstr "" +":ref:`前缀匹配 ` 规则应用于 " +":meth:`~ArgumentParser.parse_known_args`。一个解析器即使在某个选项只是已知选项的前缀时也能读取该选项,而不是将其放入剩余参数列表。" + +#: ../../library/argparse.rst:2185 +msgid "Customizing file parsing" +msgstr "自定义文件解析" + +#: ../../library/argparse.rst:2189 +msgid "" +"Arguments that are read from a file (see the *fromfile_prefix_chars* keyword" +" argument to the :class:`ArgumentParser` constructor) are read one argument " +"per line. :meth:`convert_arg_line_to_args` can be overridden for fancier " +"reading." +msgstr "" +"从文件读取的参数(见 :class:`ArgumentParser` 的 *fromfile_prefix_chars* " +"关键字参数)将是一行读取一个参数。:meth:`convert_arg_line_to_args` 可被重写以使用更复杂的读取方式。" + +#: ../../library/argparse.rst:2194 +msgid "" +"This method takes a single argument *arg_line* which is a string read from " +"the argument file. It returns a list of arguments parsed from this string. " +"The method is called once per line read from the argument file, in order." +msgstr "" +"此方法接受从参数文件读取的字符串形式的单个参数 " +"*arg_line*。它返回从该字符串解析出的参数列表。此方法将在每次按顺序从参数文件读取一行时被调用一次。" + +#: ../../library/argparse.rst:2198 +msgid "" +"A useful override of this method is one that treats each space-separated " +"word as an argument. The following example demonstrates how to do this::" +msgstr "此方法的一个有用的重写是将每个以空格分隔的单词视为一个参数。下面的例子演示了如何实现这一点::" + +#: ../../library/argparse.rst:2201 +msgid "" +"class MyArgumentParser(argparse.ArgumentParser):\n" +" def convert_arg_line_to_args(self, arg_line):\n" +" return arg_line.split()" +msgstr "" +"class MyArgumentParser(argparse.ArgumentParser):\n" +" def convert_arg_line_to_args(self, arg_line):\n" +" return arg_line.split()" + +#: ../../library/argparse.rst:2205 +msgid "" +"Note that with this override an argument can no longer contain spaces, since" +" each space-separated word becomes a separate argument." +msgstr "" + +#: ../../library/argparse.rst:2210 +msgid "Exiting methods" +msgstr "退出方法" + +#: ../../library/argparse.rst:2214 +msgid "" +"This method terminates the program, exiting with the specified *status* and," +" if given, it prints a *message* to :data:`sys.stderr` before that. The user" +" can override this method to handle these steps differently::" +msgstr "" +"此方法将终结程序,退出时附带指定的 *status*,并且如果给出了 *message* 则会在退出前将其打印到 :data:`sys.stderr`。" +" 用户可重写此方法以不同方式来处理这些步骤::" + +#: ../../library/argparse.rst:2218 +msgid "" +"class ErrorCatchingArgumentParser(argparse.ArgumentParser):\n" +" def exit(self, status=0, message=None):\n" +" if status:\n" +" raise Exception(f'Exiting because of an error: {message}')\n" +" exit(status)" +msgstr "" +"class ErrorCatchingArgumentParser(argparse.ArgumentParser):\n" +" def exit(self, status=0, message=None):\n" +" if status:\n" +" raise Exception(f'Exiting because of an error: {message}')\n" +" exit(status)" + +#: ../../library/argparse.rst:2226 +msgid "" +"This method prints a usage message, including the *message*, to " +":data:`sys.stderr` and terminates the program with a status code of 2." +msgstr "此方法将把用法消息包括 *message* 打印到 :data:`sys.stderr` 并附带状态码 2 终结程序。" + +#: ../../library/argparse.rst:2231 +msgid "Intermixed parsing" +msgstr "混合解析" + +#: ../../library/argparse.rst:2236 +msgid "" +"A number of Unix commands allow the user to intermix optional arguments with" +" positional arguments. The :meth:`~ArgumentParser.parse_intermixed_args` " +"and :meth:`~ArgumentParser.parse_known_intermixed_args` methods support this" +" parsing style." +msgstr "" +"许多 Unix 命令允许用户混用可选参数与位置参数。:meth:`~ArgumentParser.parse_intermixed_args` 和 " +":meth:`~ArgumentParser.parse_known_intermixed_args` 方法均支持这种解析风格。" + +#: ../../library/argparse.rst:2241 +msgid "" +"These parsers do not support all the :mod:`!argparse` features, and will " +"raise exceptions if unsupported features are used. In particular, " +"subparsers, and mutually exclusive groups that include both optionals and " +"positionals are not supported." +msgstr "" +"这些解析器并不支持所有的 :mod:`!argparse` " +"特性,并且当不受支持的特性被使用时将会引发异常。具体来说,子解析器以及同时包括可选参数和位置参数的互斥分组是不受支持的。" + +#: ../../library/argparse.rst:2246 +msgid "" +"The following example shows the difference between " +":meth:`~ArgumentParser.parse_known_args` and " +":meth:`~ArgumentParser.parse_intermixed_args`: the former returns ``['2', " +"'3']`` as unparsed arguments, while the latter collects all the positionals " +"into ``rest``. ::" +msgstr "" +"下面的例子显示了 :meth:`~ArgumentParser.parse_known_args` 与 " +":meth:`~ArgumentParser.parse_intermixed_args` 之间的差异:前者会将 ``['2', '3']`` " +"返回为未解析的参数,而后者会将所有位置参数收集至 ``rest`` 中。::" + +#: ../../library/argparse.rst:2252 +msgid "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo')\n" +">>> parser.add_argument('cmd')\n" +">>> parser.add_argument('rest', nargs='*', type=int)\n" +">>> parser.parse_known_args('doit 1 --foo bar 2 3'.split())\n" +"(Namespace(cmd='doit', foo='bar', rest=[1]), ['2', '3'])\n" +">>> parser.parse_intermixed_args('doit 1 --foo bar 2 3'.split())\n" +"Namespace(cmd='doit', foo='bar', rest=[1, 2, 3])" +msgstr "" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.add_argument('--foo')\n" +">>> parser.add_argument('cmd')\n" +">>> parser.add_argument('rest', nargs='*', type=int)\n" +">>> parser.parse_known_args('doit 1 --foo bar 2 3'.split())\n" +"(Namespace(cmd='doit', foo='bar', rest=[1]), ['2', '3'])\n" +">>> parser.parse_intermixed_args('doit 1 --foo bar 2 3'.split())\n" +"Namespace(cmd='doit', foo='bar', rest=[1, 2, 3])" + +#: ../../library/argparse.rst:2261 +msgid "" +":meth:`~ArgumentParser.parse_known_intermixed_args` returns a two item tuple" +" containing the populated namespace and the list of remaining argument " +"strings. :meth:`~ArgumentParser.parse_intermixed_args` raises an error if " +"there are any remaining unparsed argument strings." +msgstr "" +":meth:`~ArgumentParser.parse_known_intermixed_args` " +"返回由两个条目组成的元组,其中包含带成员的命名空间以及剩余参数字符串列表。当存在任何剩余的未解析参数字符串时 " +":meth:`~ArgumentParser.parse_intermixed_args` 将引发一个错误。" + +#: ../../library/argparse.rst:2270 +msgid "Registering custom types or actions" +msgstr "注册自定义的类型或动作" + +#: ../../library/argparse.rst:2274 +msgid "" +"Sometimes it's desirable to use a custom string in error messages to provide" +" more user-friendly output. In these cases, :meth:`!register` can be used to" +" register custom actions or types with a parser and allow you to reference " +"the type by their registered name instead of their callable name." +msgstr "" +"在某些时候有必要在错误消息中使用自定义的字符串以提供对用户更友好的输出。在这种情况下,可以使用 :meth:`!register` " +"来注册带有解析器的自定义动作或类型并允许你按其注册名称而非其可调用对象名称来引用该类型。" + +#: ../../library/argparse.rst:2279 +msgid "" +"The :meth:`!register` method accepts three arguments - a *registry_name*, " +"specifying the internal registry where the object will be stored (e.g., " +"``action``, ``type``), *value*, which is the key under which the object will" +" be registered, and object, the callable to be registered." +msgstr "" +":meth:`!register` 方法接受三个参数 —— *registry_name*,指定将要存储对象的内部注册表 (例如 ``action``," +" ``type``),*value*,将要注册对象对应的键,以及 object,将要注册的可调用对象。" + +#: ../../library/argparse.rst:2284 +msgid "" +"The following example shows how to register a custom type with a parser::" +msgstr "下面的例子演示了如何注册一个带解析器的自定义类型::" + +#: ../../library/argparse.rst:2286 +msgid "" +">>> import argparse\n" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.register('type', 'hexadecimal integer', lambda s: int(s, 16))\n" +">>> parser.add_argument('--foo', type='hexadecimal integer')\n" +"_StoreAction(option_strings=['--foo'], dest='foo', nargs=None, const=None, default=None, type='hexadecimal integer', choices=None, required=False, help=None, metavar=None, deprecated=False)\n" +">>> parser.parse_args(['--foo', '0xFA'])\n" +"Namespace(foo=250)\n" +">>> parser.parse_args(['--foo', '1.2'])\n" +"usage: PROG [-h] [--foo FOO]\n" +"PROG: error: argument --foo: invalid 'hexadecimal integer' value: '1.2'" +msgstr "" +">>> import argparse\n" +">>> parser = argparse.ArgumentParser()\n" +">>> parser.register('type', 'hexadecimal integer', lambda s: int(s, 16))\n" +">>> parser.add_argument('--foo', type='hexadecimal integer')\n" +"_StoreAction(option_strings=['--foo'], dest='foo', nargs=None, const=None, default=None, type='hexadecimal integer', choices=None, required=False, help=None, metavar=None, deprecated=False)\n" +">>> parser.parse_args(['--foo', '0xFA'])\n" +"Namespace(foo=250)\n" +">>> parser.parse_args(['--foo', '1.2'])\n" +"usage: PROG [-h] [--foo FOO]\n" +"PROG: error: argument --foo: invalid 'hexadecimal integer' value: '1.2'" + +#: ../../library/argparse.rst:2298 +msgid "Exceptions" +msgstr "异常" + +#: ../../library/argparse.rst:2302 +msgid "An error from creating or using an argument (optional or positional)." +msgstr "来自创建或使用某个参数的错误(可选或位置参数)。" + +#: ../../library/argparse.rst:2304 +msgid "" +"The string value of this exception is the message, augmented with " +"information about the argument that caused it." +msgstr "此异常的字符串值即异常消息,并附带有导致该异常的参数的相关信息。" + +#: ../../library/argparse.rst:2309 +msgid "" +"Raised when something goes wrong converting a command line string to a type." +msgstr "当从一个命令行字符串到特定类型的转换出现问题时引发。" + +#: ../../library/argparse.rst:2313 +msgid "Guides and Tutorials" +msgstr "指南与教程" + +#: ../../library/argparse.rst:907 +msgid "? (question mark)" +msgstr "? (问号)" + +#: ../../library/argparse.rst:907 ../../library/argparse.rst:939 +#: ../../library/argparse.rst:953 +msgid "in argparse module" +msgstr "在 argparse 模块中" + +#: ../../library/argparse.rst:939 +msgid "* (asterisk)" +msgstr "* (星号)" + +#: ../../library/argparse.rst:953 +msgid "+ (plus)" +msgstr "+ (加号)" diff --git a/library/array.po b/library/array.po new file mode 100644 index 0000000000..9235b2888c --- /dev/null +++ b/library/array.po @@ -0,0 +1,586 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# 99 , 2026 +# python-doc bot, 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-11 16:26+0000\n" +"PO-Revision-Date: 2025-09-16 00:00+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/array.rst:2 +msgid ":mod:`!array` --- Efficient arrays of numeric values" +msgstr ":mod:`!array` --- 高效的数值数组" + +#: ../../library/array.rst:11 +msgid "" +"This module defines an object type which can compactly represent an array of" +" basic values: characters, integers, floating-point numbers, complex " +"numbers. Arrays are mutable :term:`sequence` types and behave very much " +"like lists, except that the type of objects stored in them is constrained. " +"The type is specified at object creation time by using a :dfn:`type code`, " +"which is a single character. The following type codes are defined:" +msgstr "" + +#: ../../library/array.rst:19 +msgid "Type code" +msgstr "类型码" + +#: ../../library/array.rst:19 +msgid "C Type" +msgstr "C 类型" + +#: ../../library/array.rst:19 +msgid "Python Type" +msgstr "Python 类型" + +#: ../../library/array.rst:19 +msgid "Minimum size in bytes" +msgstr "最小字节数" + +#: ../../library/array.rst:19 +msgid "Notes" +msgstr "备注" + +#: ../../library/array.rst:21 +msgid "``'b'``" +msgstr "``'b'``" + +#: ../../library/array.rst:21 +msgid "signed char" +msgstr "signed char" + +#: ../../library/array.rst:21 ../../library/array.rst:23 +#: ../../library/array.rst:29 ../../library/array.rst:31 +#: ../../library/array.rst:33 ../../library/array.rst:35 +#: ../../library/array.rst:37 ../../library/array.rst:39 +#: ../../library/array.rst:41 ../../library/array.rst:43 +msgid "int" +msgstr "int" + +#: ../../library/array.rst:21 ../../library/array.rst:23 +msgid "1" +msgstr "1" + +#: ../../library/array.rst:23 +msgid "``'B'``" +msgstr "``'B'``" + +#: ../../library/array.rst:23 +msgid "unsigned char" +msgstr "unsigned char" + +#: ../../library/array.rst:25 +msgid "``'u'``" +msgstr "``'u'``" + +#: ../../library/array.rst:25 +msgid "wchar_t" +msgstr "wchar_t" + +#: ../../library/array.rst:25 ../../library/array.rst:27 +msgid "Unicode character" +msgstr "Unicode 字符" + +#: ../../library/array.rst:25 ../../library/array.rst:29 +#: ../../library/array.rst:31 ../../library/array.rst:33 +#: ../../library/array.rst:35 ../../library/array.rst:45 +msgid "2" +msgstr "2" + +#: ../../library/array.rst:25 +msgid "\\(1)" +msgstr "\\(1)" + +#: ../../library/array.rst:27 +msgid "``'w'``" +msgstr "``'w'``" + +#: ../../library/array.rst:27 +msgid "Py_UCS4" +msgstr "Py_UCS4" + +#: ../../library/array.rst:27 ../../library/array.rst:37 +#: ../../library/array.rst:39 ../../library/array.rst:47 +msgid "4" +msgstr "4" + +#: ../../library/array.rst:27 +msgid "\\(2)" +msgstr "\\(2)" + +#: ../../library/array.rst:29 +msgid "``'h'``" +msgstr "``'h'``" + +#: ../../library/array.rst:29 +msgid "signed short" +msgstr "signed short" + +#: ../../library/array.rst:31 +msgid "``'H'``" +msgstr "``'H'``" + +#: ../../library/array.rst:31 +msgid "unsigned short" +msgstr "unsigned short" + +#: ../../library/array.rst:33 +msgid "``'i'``" +msgstr "``'i'``" + +#: ../../library/array.rst:33 +msgid "signed int" +msgstr "signed int" + +#: ../../library/array.rst:35 +msgid "``'I'``" +msgstr "``'I'``" + +#: ../../library/array.rst:35 +msgid "unsigned int" +msgstr "unsigned int" + +#: ../../library/array.rst:37 +msgid "``'l'``" +msgstr "``'l'``" + +#: ../../library/array.rst:37 +msgid "signed long" +msgstr "signed long" + +#: ../../library/array.rst:39 +msgid "``'L'``" +msgstr "``'L'``" + +#: ../../library/array.rst:39 +msgid "unsigned long" +msgstr "unsigned long" + +#: ../../library/array.rst:41 +msgid "``'q'``" +msgstr "``'q'``" + +#: ../../library/array.rst:41 +msgid "signed long long" +msgstr "signed long long" + +#: ../../library/array.rst:41 ../../library/array.rst:43 +#: ../../library/array.rst:49 ../../library/array.rst:51 +msgid "8" +msgstr "8" + +#: ../../library/array.rst:43 +msgid "``'Q'``" +msgstr "``'Q'``" + +#: ../../library/array.rst:43 +msgid "unsigned long long" +msgstr "unsigned long long" + +#: ../../library/array.rst:45 +msgid "``'e'``" +msgstr "``'e'``" + +#: ../../library/array.rst:45 +msgid "_Float16" +msgstr "" + +#: ../../library/array.rst:45 ../../library/array.rst:47 +#: ../../library/array.rst:49 +msgid "float" +msgstr "float" + +#: ../../library/array.rst:45 +msgid "\\(3)" +msgstr "\\(3)" + +#: ../../library/array.rst:47 +msgid "``'f'``" +msgstr "``'f'``" + +#: ../../library/array.rst:49 +msgid "``'d'``" +msgstr "``'d'``" + +#: ../../library/array.rst:49 +msgid "double" +msgstr "double" + +#: ../../library/array.rst:51 +msgid "``'Zf'``" +msgstr "``'Zf'``" + +#: ../../library/array.rst:51 +msgid "float complex" +msgstr "" + +#: ../../library/array.rst:51 ../../library/array.rst:53 +msgid "complex" +msgstr "复数" + +#: ../../library/array.rst:51 ../../library/array.rst:53 +msgid "\\(4)" +msgstr "\\(4)" + +#: ../../library/array.rst:53 +msgid "``'Zd'``" +msgstr "" + +#: ../../library/array.rst:53 +msgid "double complex" +msgstr "" + +#: ../../library/array.rst:53 +msgid "16" +msgstr "16" + +#: ../../library/array.rst:57 +msgid "Notes:" +msgstr "备注:" + +#: ../../library/array.rst:60 +msgid "It can be 16 bits or 32 bits depending on the platform." +msgstr "可能为 16 位或 32 位,取决于具体的平台。" + +#: ../../library/array.rst:62 +msgid "" +"``array('u')`` now uses :c:type:`wchar_t` as C type instead of deprecated " +"``Py_UNICODE``. This change doesn't affect its behavior because " +"``Py_UNICODE`` is alias of :c:type:`wchar_t` since Python 3.3." +msgstr "" +"``array('u')`` 现在使用 :c:type:`wchar_t` 作为 C 类型而不是已不建议使用的 " +"``Py_UNICODE``。这个改变不会影响其行为,因为 ``Py_UNICODE`` 自 Python 3.3 起就是 " +":c:type:`wchar_t` 的别名。" + +#: ../../library/array.rst:67 +msgid "Please migrate to ``'w'`` typecode." +msgstr "请迁移到 ``'w'`` 类型码。" + +#: ../../library/array.rst:74 +msgid "" +"The IEEE 754 binary16 \"half precision\" type was introduced in the 2008 " +"revision of the `IEEE 754 standard `_. This type is not " +"widely supported by C compilers. It's available as :c:expr:`_Float16` type," +" if the compiler supports the Annex H of the C23 standard." +msgstr "" + +#: ../../library/array.rst:83 +msgid "" +"Complex types (``Zf`` and ``Zd``) are available unconditionally, regardless " +"on support for complex types (the Annex G of the C11 standard) by the C " +"compiler. As specified in the C11 standard, each complex type is represented" +" by a two-element C array containing, respectively, the real and imaginary " +"parts." +msgstr "" + +#: ../../library/array.rst:93 +msgid "" +"The :ref:`ctypes ` and :ref:`struct ` modules, as well as third-party modules like `numpy " +"`__," +" use similar -- but slightly different -- type codes." +msgstr "" + +#: ../../library/array.rst:99 +msgid "" +"The actual representation of values is determined by the machine " +"architecture (strictly speaking, by the C implementation). The actual size " +"can be accessed through the :attr:`array.itemsize` attribute." +msgstr "值的实际表示是由机器架构(严格说是由 C 实现)决定的。实际大小可以通过 :attr:`array.itemsize` 属性来访问。" + +#: ../../library/array.rst:103 +msgid "The module defines the following item:" +msgstr "此模块定义了以下项目:" + +#: ../../library/array.rst:108 +msgid "A tuple with all available type codes." +msgstr "" + +#: ../../library/array.rst:110 +msgid "The type changed from :class:`str` to :class:`tuple`." +msgstr "" + +#: ../../library/array.rst:114 +msgid "The module defines the following type:" +msgstr "此模块定义了以下类型:" + +#: ../../library/array.rst:119 +msgid "" +"A new array whose items are restricted by *typecode*, and initialized from " +"the optional *initializer* value, which must be a :class:`bytes` or " +":class:`bytearray` object, a Unicode string, or iterable over elements of " +"the appropriate type." +msgstr "" +"一个由 *typecode* 限定其条目的新数组,并能根据可选的 *initializer* 值来初始化。*initializer* 必须是 " +":class:`bytes` 或 :class:`bytearray` 对象、Unicode 字符串或元素类型合适的可迭代对象。" + +#: ../../library/array.rst:124 +msgid "" +"If given a :class:`bytes` or :class:`bytearray` object, the initializer is " +"passed to the new array's :meth:`frombytes` method; if given a Unicode " +"string, the initializer is passed to the :meth:`fromunicode` method; " +"otherwise, the initializer's iterator is passed to the :meth:`extend` method" +" to add initial items to the array." +msgstr "" +"如果给定了一个 :class:`bytes` 或 :class:`bytearray` 对象,则将 *initializer* 传给新数组的 " +":meth:`frombytes` 方法;如果给定了一个 Unicode 字符串,则将 *initializer* 传给 " +":meth:`fromunicode` 方法;在其他情况下,则将 *initializer* 的迭代器传给 :meth:`extend` " +"方法以向数组添加初始条目。" + +#: ../../library/array.rst:131 +msgid "" +"Array objects support the ordinary :ref:`mutable ` " +":term:`sequence` operations of indexing, slicing, concatenation, and " +"multiplication. When using slice assignment, the assigned value must be an " +"array object with the same type code; in all other cases, :exc:`TypeError` " +"is raised. Array objects also implement the buffer interface, and may be " +"used wherever :term:`bytes-like objects ` are supported." +msgstr "" +"数组对象支持普通的 :ref:`可变 ` :term:`sequence` 操作如索引、切片、拼接和重复等。 " +"当使用切片赋值时,所赋的值必须为具有相同类型码的数组对象;在所有其他情况下,都将引发 :exc:`TypeError`。 " +"数组对象还实现了缓冲区接口,可以被用于所有支持 :term:`字节型对象 ` 的场合。" + +#: ../../library/array.rst:137 +msgid "" +"Raises an :ref:`auditing event ` ``array.__new__`` with arguments " +"``typecode``, ``initializer``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``array.__new__`` 并附带参数 ``typecode``, " +"``initializer``." + +#: ../../library/array.rst:142 +msgid "The typecode character used to create the array." +msgstr "在创建数组时使用的类型码字符。" + +#: ../../library/array.rst:147 +msgid "The length in bytes of one array item in the internal representation." +msgstr "内部表示中,单个数组项的长度。单位为字节。" + +#: ../../library/array.rst:152 +msgid "Append a new item with the specified value to the end of the array." +msgstr "" + +#: ../../library/array.rst:157 +msgid "" +"Return a tuple ``(address, length)`` giving the current memory address and " +"the length in elements of the buffer used to hold array's contents. The " +"size of the memory buffer in bytes can be computed as " +"``array.buffer_info()[1] * array.itemsize``. This is occasionally useful " +"when working with low-level (and inherently unsafe) I/O interfaces that " +"require memory addresses, such as certain :c:func:`!ioctl` operations. The " +"returned numbers are valid as long as the array exists and no length-" +"changing operations are applied to it." +msgstr "" +"返回一个元组 ``(address, length)`` " +"给出存放数组内容的内存缓冲区的当前地址和长度(以元素个数为单位)。以字节为单位的内存缓冲区大小可通过 ``array.buffer_info()[1] " +"* array.itemsize`` 来计算。工作在需要内存地址的底层(因此天然地不够安全)的 I/O 接口上时,这有时会有用,例如某些 " +":c:func:`!ioctl` 操作。只要数组还存在,并且没有对其应用过改变长度的操作,则返回的数值就是有效的。" + +#: ../../library/array.rst:167 +msgid "" +"When using array objects from code written in C or C++ (the only way to " +"effectively make use of this information), it makes more sense to use the " +"buffer interface supported by array objects. This method is maintained for " +"backward compatibility and should be avoided in new code. The buffer " +"interface is documented in :ref:`bufferobjects`." +msgstr "" +"只有在使用以 C 或 C++ " +"编写的代码中的数组对象时,才能有效利用该信息,但此时,更合理的是,使用数组对象支持的缓冲区接口。因此,该方法的存在仅仅是为了向后兼容性,应避免在新代码中使用。缓冲区接口的文档参见" +" :ref:`bufferobjects`." + +#: ../../library/array.rst:176 +msgid "" +"\"Byteswap\" all items of the array. This is only supported for values " +"which are 1, 2, 4, 8 or 16 bytes in size; for other types of values, " +":exc:`RuntimeError` is raised. It is useful when reading data from a file " +"written on a machine with a different byte order. Note, that for complex " +"types the order of components (the real part, followed by imaginary part) is" +" preserved." +msgstr "" + +#: ../../library/array.rst:185 +msgid "Return the number of occurrences of *value* in the array." +msgstr "" + +#: ../../library/array.rst:190 +msgid "" +"Append items from *iterable* to the end of the array. If *iterable* is " +"another array, it must have *exactly* the same type code; if not, " +":exc:`TypeError` will be raised. If *iterable* is not an array, it must be " +"iterable and its elements must be the right type to be appended to the " +"array." +msgstr "" +"将来自 *iterable* 的项添加到数组末尾。如果 *iterable* 是另一个数组,它必须具有 *完全* 相同的类型码;否则将引发 " +":exc:`TypeError`。如果 *iterable* 不是一个数组,则它必须为可迭代对象且其元素的类型须为可添加到数组的适当类型。" + +#: ../../library/array.rst:198 +msgid "" +"Appends items from the :term:`bytes-like object`, interpreting its content " +"as an array of machine values (as if it had been read from a file using the " +":meth:`fromfile` method)." +msgstr "" +"添加来自 :term:`bytes-like object` 的条目,将其内容解读为由机器值组成的数组(就像是使用 :meth:`fromfile` " +"方法从文件中读取内容一样)。" + +#: ../../library/array.rst:202 +msgid ":meth:`!fromstring` is renamed to :meth:`frombytes` for clarity." +msgstr ":meth:`!fromstring` 被重命名为含义更准确的 :meth:`frombytes`。" + +#: ../../library/array.rst:208 +msgid "" +"Read *n* items (as machine values) from the :term:`file object` *f* and " +"append them to the end of the array. If less than *n* items are available, " +":exc:`EOFError` is raised, but the items that were available are still " +"inserted into the array." +msgstr "" +"从 :term:`file object` *f* 中读取 *n* 项(视为机器值)并将它们添加到数组末尾。如果可用的项少于 *n* 项,则会引发 " +":exc:`EOFError`,但可用的项仍然会被加进数组。" + +#: ../../library/array.rst:216 +msgid "" +"Append items from the list. This is equivalent to ``for x in list: " +"a.append(x)`` except that if there is a type error, the array is unchanged." +msgstr "" +"将来自列表的项添加到数组末尾。等价于 ``for x in list: a.append(x)``,而不同之处在于,若发生类型错误,数组则不会被改变。" + +#: ../../library/array.rst:222 +msgid "" +"Extends this array with data from the given Unicode string. The array must " +"have type code ``'u'`` or ``'w'``; otherwise a :exc:`ValueError` is raised. " +"Use ``array.frombytes(unicodestring.encode(enc))`` to append Unicode data to" +" an array of some other type." +msgstr "" +"使用来自给定的 Unicode 字符串的数据扩展该数组。该数组的类型码必须为 ``'u'`` 或 ``'w'``;否则将引发 " +":exc:`ValueError`。请使用 ``array.frombytes(unicodestring.encode(enc))`` 将 " +"Unicode 数据添加到其他类型的数组。" + +#: ../../library/array.rst:230 +msgid "" +"Return the smallest *i* such that *i* is the index of the first occurrence " +"of *value* in the array. The optional arguments *start* and *stop* can be " +"specified to search for *value* within a subsection of the array. Raise " +":exc:`ValueError` if *value* is not found." +msgstr "" + +#: ../../library/array.rst:235 +msgid "Added optional *start* and *stop* parameters." +msgstr "添加了可选的 *start* 和 *stop* 形参。" + +#: ../../library/array.rst:241 +msgid "" +"Insert a new item *value* in the array before position *index*. Negative " +"values are treated as being relative to the end of the array." +msgstr "" + +#: ../../library/array.rst:247 +msgid "" +"Removes the item with the index *i* from the array and returns it. The " +"optional argument defaults to ``-1``, so that by default the last item is " +"removed and returned." +msgstr "从数组中移除下标为 *i* 的项并将其返回。可选参数默认值为 ``-1``,因此默认移除并返回末项。" + +#: ../../library/array.rst:254 +msgid "Remove the first occurrence of *value* from the array." +msgstr "从数组中移除第一个出现的 *value*。" + +#: ../../library/array.rst:259 +msgid "Remove all elements from the array." +msgstr "从数组中移除所有元素。" + +#: ../../library/array.rst:266 +msgid "Reverse the order of the items in the array." +msgstr "反转数组中各项的顺序。" + +#: ../../library/array.rst:271 +msgid "" +"Convert the array to an array of machine values and return the bytes " +"representation (the same sequence of bytes that would be written to a file " +"by the :meth:`tofile` method.)" +msgstr "将数组转换为一个由机器值组成的数组并返回其字节表示(和用 :meth:`tofile` 方法写入文件的字节序列相同)。" + +#: ../../library/array.rst:275 +msgid ":meth:`!tostring` is renamed to :meth:`tobytes` for clarity." +msgstr ":meth:`!tostring` 被重命名为含义更准确的 :meth:`tobytes`。" + +#: ../../library/array.rst:281 +msgid "Write all items (as machine values) to the :term:`file object` *f*." +msgstr "将所有项(作为机器值)写入 :term:`file object` *f*。" + +#: ../../library/array.rst:286 +msgid "Convert the array to an ordinary list with the same items." +msgstr "将数组转换为由相同的项组成的普通列表。" + +#: ../../library/array.rst:291 +msgid "" +"Convert the array to a Unicode string. The array must have a type ``'u'`` " +"or ``'w'``; otherwise a :exc:`ValueError` is raised. Use " +"``array.tobytes().decode(enc)`` to obtain a Unicode string from an array of " +"some other type." +msgstr "" +"将数组转换为一个 Unicode 字符串。数组的类型必须为 ``'u'`` 或 ``'w'``;否则将引发 :exc:`ValueError`。 请使用" +" ``array.tobytes().decode(enc)`` 来从其他类型的数组获取 Unicode 字符串。" + +#: ../../library/array.rst:296 +msgid "" +"The string representation of array objects has the form ``array(typecode, " +"initializer)``. The *initializer* is omitted if the array is empty, " +"otherwise it is a Unicode string if the *typecode* is ``'u'`` or ``'w'``, " +"otherwise it is a list of numbers. The string representation is guaranteed " +"to be able to be converted back to an array with the same type and value " +"using :func:`eval`, so long as the :class:`~array.array` class has been " +"imported using ``from array import array``. Variables ``inf`` and ``nan`` " +"must also be defined if it contains corresponding floating-point values. " +"Examples::" +msgstr "" +"数组对象的字符串表示形式是 ``array(typecode, initializer)``。如果数组为空则 *initializer* " +"将被省略,否则如果 *typecode* 为 ``'u'`` 或 ``'w'`` 则为 Unicode 字符串,否则为由数字组成的列表。只要 " +":class:`~array.array` 类是使用 ``from array import array`` 导入的,该字符串表示形式就保证能使用 " +":func:`eval` 转换回具有相同类型和值的数组。如果它包含相应的浮点数值则还必须定义变量 ``inf`` 和 ``nan``。例如::" + +#: ../../library/array.rst:308 +msgid "" +"array('l')\n" +"array('w', 'hello \\u2641')\n" +"array('l', [1, 2, 3, 4, 5])\n" +"array('d', [1.0, 2.0, 3.14, -inf, nan])" +msgstr "" +"array('l')\n" +"array('w', 'hello \\u2641')\n" +"array('l', [1, 2, 3, 4, 5])\n" +"array('d', [1.0, 2.0, 3.14, -inf, nan])" + +#: ../../library/array.rst:316 +msgid "Module :mod:`struct`" +msgstr ":mod:`struct` 模块" + +#: ../../library/array.rst:317 +msgid "Packing and unpacking of heterogeneous binary data." +msgstr "打包和解包异构二进制数据。" + +#: ../../library/array.rst:319 +msgid "`NumPy `_" +msgstr "`NumPy `_" + +#: ../../library/array.rst:320 +msgid "The NumPy package defines another array type." +msgstr "NumPy 包定义了另一数组类型。" + +#: ../../library/array.rst:7 +msgid "arrays" +msgstr "数组" diff --git a/library/ast.po b/library/ast.po new file mode 100644 index 0000000000..d938ee1c9b --- /dev/null +++ b/library/ast.po @@ -0,0 +1,4667 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-21 16:26+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/ast.rst:2 +msgid ":mod:`!ast` --- Abstract syntax trees" +msgstr ":mod:`!ast` --- 抽象语法树" + +#: ../../library/ast.rst:14 +msgid "**Source code:** :source:`Lib/ast.py`" +msgstr "**源代码:** :source:`Lib/ast.py`" + +#: ../../library/ast.rst:18 +msgid "" +"The :mod:`!ast` module helps Python applications to process trees of the " +"Python abstract syntax grammar. The abstract syntax itself might change " +"with each Python release; this module helps to find out programmatically " +"what the current grammar looks like." +msgstr "" + +#: ../../library/ast.rst:23 +msgid "" +"An abstract syntax tree can be generated by passing " +":data:`ast.PyCF_ONLY_AST` as a flag to the :func:`compile` built-in " +"function, or using the :func:`parse` helper provided in this module. The " +"result will be a tree of objects whose classes all inherit from " +":class:`ast.AST`. An abstract syntax tree can be compiled into a Python " +"code object using the built-in :func:`compile` function." +msgstr "" +"抽象语法树可通过将 :data:`ast.PyCF_ONLY_AST` 作为旗标传递给 :func:`compile` " +"内置函数来生成,或是使用此模块中提供的 :func:`parse` 辅助函数。返回结果将是一个由许多对象构成的树,这些对象所属的类都继承自 " +":class:`ast.AST`。抽象语法树可被内置的 :func:`compile` 函数编译为一个 Python 代码对象。" + +#: ../../library/ast.rst:33 +msgid "Abstract grammar" +msgstr "抽象语法" + +#: ../../library/ast.rst:35 +msgid "The abstract grammar is currently defined as follows:" +msgstr "抽象文法目前定义如下" + +#: ../../library/ast.rst:37 +msgid "" +"-- ASDL's 4 builtin types are:\n" +"-- identifier, int, string, constant\n" +"\n" +"module Python\n" +"{\n" +" mod = Module(stmt* body, type_ignore* type_ignores)\n" +" | Interactive(stmt* body)\n" +" | Expression(expr body)\n" +" | FunctionType(expr* argtypes, expr returns)\n" +"\n" +" stmt = FunctionDef(identifier name, arguments args,\n" +" stmt* body, expr* decorator_list, expr? returns,\n" +" string? type_comment, type_param* type_params)\n" +" | AsyncFunctionDef(identifier name, arguments args,\n" +" stmt* body, expr* decorator_list, expr? returns,\n" +" string? type_comment, type_param* type_params)\n" +"\n" +" | ClassDef(identifier name,\n" +" expr* bases,\n" +" keyword* keywords,\n" +" stmt* body,\n" +" expr* decorator_list,\n" +" type_param* type_params)\n" +" | Return(expr? value)\n" +"\n" +" | Delete(expr* targets)\n" +" | Assign(expr* targets, expr value, string? type_comment)\n" +" | TypeAlias(expr name, type_param* type_params, expr value)\n" +" | AugAssign(expr target, operator op, expr value)\n" +" -- 'simple' indicates that we annotate simple name without parens\n" +" | AnnAssign(expr target, expr annotation, expr? value, int simple)\n" +"\n" +" -- use 'orelse' because else is a keyword in target languages\n" +" | For(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)\n" +" | AsyncFor(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)\n" +" | While(expr test, stmt* body, stmt* orelse)\n" +" | If(expr test, stmt* body, stmt* orelse)\n" +" | With(withitem* items, stmt* body, string? type_comment)\n" +" | AsyncWith(withitem* items, stmt* body, string? type_comment)\n" +"\n" +" | Match(expr subject, match_case* cases)\n" +"\n" +" | Raise(expr? exc, expr? cause)\n" +" | Try(stmt* body, excepthandler* handlers, stmt* orelse, stmt* finalbody)\n" +" | TryStar(stmt* body, excepthandler* handlers, stmt* orelse, stmt* finalbody)\n" +" | Assert(expr test, expr? msg)\n" +"\n" +" | Import(alias* names)\n" +" | ImportFrom(identifier? module, alias* names, int? level)\n" +"\n" +" | Global(identifier* names)\n" +" | Nonlocal(identifier* names)\n" +" | Expr(expr value)\n" +" | Pass | Break | Continue\n" +"\n" +" -- col_offset is the byte offset in the utf8 string the parser uses\n" +" attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)\n" +"\n" +" -- BoolOp() can use left & right?\n" +" expr = BoolOp(boolop op, expr* values)\n" +" | NamedExpr(expr target, expr value)\n" +" | BinOp(expr left, operator op, expr right)\n" +" | UnaryOp(unaryop op, expr operand)\n" +" | Lambda(arguments args, expr body)\n" +" | IfExp(expr test, expr body, expr orelse)\n" +" | Dict(expr?* keys, expr* values)\n" +" | Set(expr* elts)\n" +" | ListComp(expr elt, comprehension* generators)\n" +" | SetComp(expr elt, comprehension* generators)\n" +" | DictComp(expr key, expr value, comprehension* generators)\n" +" | GeneratorExp(expr elt, comprehension* generators)\n" +" -- the grammar constrains where yield expressions can occur\n" +" | Await(expr value)\n" +" | Yield(expr? value)\n" +" | YieldFrom(expr value)\n" +" -- need sequences for compare to distinguish between\n" +" -- x < 4 < 3 and (x < 4) < 3\n" +" | Compare(expr left, cmpop* ops, expr* comparators)\n" +" | Call(expr func, expr* args, keyword* keywords)\n" +" | FormattedValue(expr value, int conversion, expr? format_spec)\n" +" | Interpolation(expr value, constant str, int conversion, expr? format_spec)\n" +" | JoinedStr(expr* values)\n" +" | TemplateStr(expr* values)\n" +" | Constant(constant value, string? kind)\n" +"\n" +" -- the following expression can appear in assignment context\n" +" | Attribute(expr value, identifier attr, expr_context ctx)\n" +" | Subscript(expr value, expr slice, expr_context ctx)\n" +" | Starred(expr value, expr_context ctx)\n" +" | Name(identifier id, expr_context ctx)\n" +" | List(expr* elts, expr_context ctx)\n" +" | Tuple(expr* elts, expr_context ctx)\n" +"\n" +" -- can appear only in Subscript\n" +" | Slice(expr? lower, expr? upper, expr? step)\n" +"\n" +" -- col_offset is the byte offset in the utf8 string the parser uses\n" +" attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)\n" +"\n" +" expr_context = Load | Store | Del\n" +"\n" +" boolop = And | Or\n" +"\n" +" operator = Add | Sub | Mult | MatMult | Div | Mod | Pow | LShift\n" +" | RShift | BitOr | BitXor | BitAnd | FloorDiv\n" +"\n" +" unaryop = Invert | Not | UAdd | USub\n" +"\n" +" cmpop = Eq | NotEq | Lt | LtE | Gt | GtE | Is | IsNot | In | NotIn\n" +"\n" +" comprehension = (expr target, expr iter, expr* ifs, int is_async)\n" +"\n" +" excepthandler = ExceptHandler(expr? type, identifier? name, stmt* body)\n" +" attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)\n" +"\n" +" arguments = (arg* posonlyargs, arg* args, arg? vararg, arg* kwonlyargs,\n" +" expr?* kw_defaults, arg? kwarg, expr* defaults)\n" +"\n" +" arg = (identifier arg, expr? annotation, string? type_comment)\n" +" attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)\n" +"\n" +" -- keyword arguments supplied to call (NULL identifier for **kwargs)\n" +" keyword = (identifier? arg, expr value)\n" +" attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)\n" +"\n" +" -- import name with optional 'as' alias.\n" +" alias = (identifier name, identifier? asname)\n" +" attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)\n" +"\n" +" withitem = (expr context_expr, expr? optional_vars)\n" +"\n" +" match_case = (pattern pattern, expr? guard, stmt* body)\n" +"\n" +" pattern = MatchValue(expr value)\n" +" | MatchSingleton(constant value)\n" +" | MatchSequence(pattern* patterns)\n" +" | MatchMapping(expr* keys, pattern* patterns, identifier? rest)\n" +" | MatchClass(expr cls, pattern* patterns, identifier* kwd_attrs, pattern* kwd_patterns)\n" +"\n" +" | MatchStar(identifier? name)\n" +" -- The optional \"rest\" MatchMapping parameter handles capturing extra mapping keys\n" +"\n" +" | MatchAs(pattern? pattern, identifier? name)\n" +" | MatchOr(pattern* patterns)\n" +"\n" +" attributes (int lineno, int col_offset, int end_lineno, int end_col_offset)\n" +"\n" +" type_ignore = TypeIgnore(int lineno, string tag)\n" +"\n" +" type_param = TypeVar(identifier name, expr? bound, expr? default_value)\n" +" | ParamSpec(identifier name, expr? default_value)\n" +" | TypeVarTuple(identifier name, expr? default_value)\n" +" attributes (int lineno, int col_offset, int end_lineno, int end_col_offset)\n" +"}\n" +msgstr "" +"-- ASDL's 4 builtin types are:\n" +"-- identifier, int, string, constant\n" +"\n" +"module Python\n" +"{\n" +" mod = Module(stmt* body, type_ignore* type_ignores)\n" +" | Interactive(stmt* body)\n" +" | Expression(expr body)\n" +" | FunctionType(expr* argtypes, expr returns)\n" +"\n" +" stmt = FunctionDef(identifier name, arguments args,\n" +" stmt* body, expr* decorator_list, expr? returns,\n" +" string? type_comment, type_param* type_params)\n" +" | AsyncFunctionDef(identifier name, arguments args,\n" +" stmt* body, expr* decorator_list, expr? returns,\n" +" string? type_comment, type_param* type_params)\n" +"\n" +" | ClassDef(identifier name,\n" +" expr* bases,\n" +" keyword* keywords,\n" +" stmt* body,\n" +" expr* decorator_list,\n" +" type_param* type_params)\n" +" | Return(expr? value)\n" +"\n" +" | Delete(expr* targets)\n" +" | Assign(expr* targets, expr value, string? type_comment)\n" +" | TypeAlias(expr name, type_param* type_params, expr value)\n" +" | AugAssign(expr target, operator op, expr value)\n" +" -- 'simple' indicates that we annotate simple name without parens\n" +" | AnnAssign(expr target, expr annotation, expr? value, int simple)\n" +"\n" +" -- use 'orelse' because else is a keyword in target languages\n" +" | For(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)\n" +" | AsyncFor(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)\n" +" | While(expr test, stmt* body, stmt* orelse)\n" +" | If(expr test, stmt* body, stmt* orelse)\n" +" | With(withitem* items, stmt* body, string? type_comment)\n" +" | AsyncWith(withitem* items, stmt* body, string? type_comment)\n" +"\n" +" | Match(expr subject, match_case* cases)\n" +"\n" +" | Raise(expr? exc, expr? cause)\n" +" | Try(stmt* body, excepthandler* handlers, stmt* orelse, stmt* finalbody)\n" +" | TryStar(stmt* body, excepthandler* handlers, stmt* orelse, stmt* finalbody)\n" +" | Assert(expr test, expr? msg)\n" +"\n" +" | Import(alias* names)\n" +" | ImportFrom(identifier? module, alias* names, int? level)\n" +"\n" +" | Global(identifier* names)\n" +" | Nonlocal(identifier* names)\n" +" | Expr(expr value)\n" +" | Pass | Break | Continue\n" +"\n" +" -- col_offset is the byte offset in the utf8 string the parser uses\n" +" attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)\n" +"\n" +" -- BoolOp() can use left & right?\n" +" expr = BoolOp(boolop op, expr* values)\n" +" | NamedExpr(expr target, expr value)\n" +" | BinOp(expr left, operator op, expr right)\n" +" | UnaryOp(unaryop op, expr operand)\n" +" | Lambda(arguments args, expr body)\n" +" | IfExp(expr test, expr body, expr orelse)\n" +" | Dict(expr?* keys, expr* values)\n" +" | Set(expr* elts)\n" +" | ListComp(expr elt, comprehension* generators)\n" +" | SetComp(expr elt, comprehension* generators)\n" +" | DictComp(expr key, expr value, comprehension* generators)\n" +" | GeneratorExp(expr elt, comprehension* generators)\n" +" -- the grammar constrains where yield expressions can occur\n" +" | Await(expr value)\n" +" | Yield(expr? value)\n" +" | YieldFrom(expr value)\n" +" -- need sequences for compare to distinguish between\n" +" -- x < 4 < 3 and (x < 4) < 3\n" +" | Compare(expr left, cmpop* ops, expr* comparators)\n" +" | Call(expr func, expr* args, keyword* keywords)\n" +" | FormattedValue(expr value, int conversion, expr? format_spec)\n" +" | Interpolation(expr value, constant str, int conversion, expr? format_spec)\n" +" | JoinedStr(expr* values)\n" +" | TemplateStr(expr* values)\n" +" | Constant(constant value, string? kind)\n" +"\n" +" -- the following expression can appear in assignment context\n" +" | Attribute(expr value, identifier attr, expr_context ctx)\n" +" | Subscript(expr value, expr slice, expr_context ctx)\n" +" | Starred(expr value, expr_context ctx)\n" +" | Name(identifier id, expr_context ctx)\n" +" | List(expr* elts, expr_context ctx)\n" +" | Tuple(expr* elts, expr_context ctx)\n" +"\n" +" -- can appear only in Subscript\n" +" | Slice(expr? lower, expr? upper, expr? step)\n" +"\n" +" -- col_offset is the byte offset in the utf8 string the parser uses\n" +" attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)\n" +"\n" +" expr_context = Load | Store | Del\n" +"\n" +" boolop = And | Or\n" +"\n" +" operator = Add | Sub | Mult | MatMult | Div | Mod | Pow | LShift\n" +" | RShift | BitOr | BitXor | BitAnd | FloorDiv\n" +"\n" +" unaryop = Invert | Not | UAdd | USub\n" +"\n" +" cmpop = Eq | NotEq | Lt | LtE | Gt | GtE | Is | IsNot | In | NotIn\n" +"\n" +" comprehension = (expr target, expr iter, expr* ifs, int is_async)\n" +"\n" +" excepthandler = ExceptHandler(expr? type, identifier? name, stmt* body)\n" +" attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)\n" +"\n" +" arguments = (arg* posonlyargs, arg* args, arg? vararg, arg* kwonlyargs,\n" +" expr?* kw_defaults, arg? kwarg, expr* defaults)\n" +"\n" +" arg = (identifier arg, expr? annotation, string? type_comment)\n" +" attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)\n" +"\n" +" -- keyword arguments supplied to call (NULL identifier for **kwargs)\n" +" keyword = (identifier? arg, expr value)\n" +" attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)\n" +"\n" +" -- import name with optional 'as' alias.\n" +" alias = (identifier name, identifier? asname)\n" +" attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)\n" +"\n" +" withitem = (expr context_expr, expr? optional_vars)\n" +"\n" +" match_case = (pattern pattern, expr? guard, stmt* body)\n" +"\n" +" pattern = MatchValue(expr value)\n" +" | MatchSingleton(constant value)\n" +" | MatchSequence(pattern* patterns)\n" +" | MatchMapping(expr* keys, pattern* patterns, identifier? rest)\n" +" | MatchClass(expr cls, pattern* patterns, identifier* kwd_attrs, pattern* kwd_patterns)\n" +"\n" +" | MatchStar(identifier? name)\n" +" -- The optional \"rest\" MatchMapping parameter handles capturing extra mapping keys\n" +"\n" +" | MatchAs(pattern? pattern, identifier? name)\n" +" | MatchOr(pattern* patterns)\n" +"\n" +" attributes (int lineno, int col_offset, int end_lineno, int end_col_offset)\n" +"\n" +" type_ignore = TypeIgnore(int lineno, string tag)\n" +"\n" +" type_param = TypeVar(identifier name, expr? bound, expr? default_value)\n" +" | ParamSpec(identifier name, expr? default_value)\n" +" | TypeVarTuple(identifier name, expr? default_value)\n" +" attributes (int lineno, int col_offset, int end_lineno, int end_col_offset)\n" +"}\n" + +#: ../../library/ast.rst:42 +msgid "Node classes" +msgstr "节点类" + +#: ../../library/ast.rst:46 +msgid "" +"This is the base of all AST node classes. The actual node classes are " +"derived from the :file:`Parser/Python.asdl` file, which is reproduced " +":ref:`above `. They are defined in the :mod:`!_ast` C " +"module and re-exported in :mod:`!ast`." +msgstr "" + +#: ../../library/ast.rst:51 +msgid "" +"There is one class defined for each left-hand side symbol in the abstract " +"grammar (for example, :class:`ast.stmt` or :class:`ast.expr`). In addition," +" there is one class defined for each constructor on the right-hand side; " +"these classes inherit from the classes for the left-hand side trees. For " +"example, :class:`ast.BinOp` inherits from :class:`ast.expr`. For production" +" rules with alternatives (aka \"sums\"), the left-hand side class is " +"abstract: only instances of specific constructor nodes are ever created." +msgstr "" +"抽象文法中的每个等号左边的符号 (比方说, :class:`ast.stmt` 或者 :class:`ast.expr`) " +"定义了一个类。另外,在等号右边,对每一个构造器也定义了一个类;这些类继承自等号左边的类。比如,:class:`ast.BinOp` 继承自 " +":class:`ast.expr`。 对于多分支产生式(也就是含有“ | ”的产生式),左边的类是抽象的;只有具体构造器类的实例能够被 compile " +"函数构造。" + +#: ../../library/ast.rst:64 +msgid "" +"Each concrete class has an attribute :attr:`!_fields` which gives the names " +"of all child nodes." +msgstr "每个实体类都具有属性 :attr:`!_fields`,它给出了所有子节点的名字。" + +#: ../../library/ast.rst:67 +msgid "" +"Each instance of a concrete class has one attribute for each child node, of " +"the type as defined in the grammar. For example, :class:`ast.BinOp` " +"instances have an attribute :attr:`left` of type :class:`ast.expr`." +msgstr "" +"每个具体类的实例为自己的每个子节点都准备了一个属性来引用该子节点,属性的类型就是文法中所定义的。比如,:class:`ast.BinOp` " +"的实例有个属性 :attr:`left`,类型是 :class:`ast.expr`。" + +#: ../../library/ast.rst:71 +msgid "" +"If these attributes are marked as optional in the grammar (using a question " +"mark), the value might be ``None``. If the attributes can have zero-or-more" +" values (marked with an asterisk), the values are represented as Python " +"lists. All possible attributes must be present and have valid values when " +"compiling an AST with :func:`compile`." +msgstr "" +"如果这些属性在文法中标记为可选(用问号标记),对应值可能会是 ``None``。如果这些属性可有零或多个值(用星号标记),对应值会用 Python " +"的列表来表示。在用 :func:`compile` 将 AST 编译为可执行代码时,所有的属性必须已经被赋值为有效的值。" + +#: ../../library/ast.rst:79 +msgid "" +"The :attr:`!_field_types` attribute on each concrete class is a dictionary " +"mapping field names (as also listed in :attr:`_fields`) to their types." +msgstr "" +"每个实体类上的 :attr:`!_field_types` 属性都是一个将字段名(与在 :attr:`_fields` " +"中列出的相同)映射到其类型的字典。" + +#: ../../library/ast.rst:82 +msgid "" +">>> ast.TypeVar._field_types\n" +"{'name': , 'bound': ast.expr | None, 'default_value': ast.expr | None}" +msgstr "" +">>> ast.TypeVar._field_types\n" +"{'name': , 'bound': ast.expr | None, 'default_value': ast.expr | None}" + +#: ../../library/ast.rst:94 +msgid "" +"Instances of :class:`ast.expr` and :class:`ast.stmt` subclasses have " +":attr:`lineno`, :attr:`col_offset`, :attr:`end_lineno`, and " +":attr:`end_col_offset` attributes. The :attr:`lineno` and " +":attr:`end_lineno` are the first and last line numbers of source text span " +"(1-indexed so the first line is line 1) and the :attr:`col_offset` and " +":attr:`end_col_offset` are the corresponding UTF-8 byte offsets of the first" +" and last tokens that generated the node. The UTF-8 offset is recorded " +"because the parser uses UTF-8 internally." +msgstr "" +":class:`ast.expr` 和 :class:`ast.stmt` 的子类的实例的属性包括 " +":attr:`lineno`、:attr:`col_offset`、:attr:`end_lineno` 和 " +":attr:`end_col_offset`。:attr:`lineno` 和 :attr:`end_lineno` " +"是源码中属于该节点的部分从哪一行开始,到哪一行结束(数字 1 指第一行,以此类推);:attr:`col_offset` 和 " +":attr:`end_col_offset` 是第一个和最后一个属于该节点的 token 的 UTF-8 字节偏移量。记录 UTF-8 " +"偏移量的原因是解析器内部使用 UTF-8。" + +#: ../../library/ast.rst:103 +msgid "" +"Note that the end positions are not required by the compiler and are " +"therefore optional. The end offset is *after* the last symbol, for example " +"one can get the source segment of a one-line expression node using " +"``source_line[node.col_offset : node.end_col_offset]``." +msgstr "" +"注意编译器不需要结束位置,所以结束位置是可选的。结束偏移在最后一个符号 *之后* ,例如你可以通过 " +"``source_line[node.col_offset : node.end_col_offset]`` 获得一个单行表达式节点的源码片段。" + +#: ../../library/ast.rst:108 +msgid "" +"The constructor of a class :class:`ast.T` parses its arguments as follows:" +msgstr ":class:`ast.T` 类的构造器像下面这样解析它的参数:" + +#: ../../library/ast.rst:110 +msgid "" +"If there are positional arguments, there must be as many as there are items " +"in :attr:`T._fields`; they will be assigned as attributes of these names." +msgstr "如果只用位置参数,参数的数量必须和 :attr:`T._fields` 中的项一样多;它们会按顺序赋值到这些属性上。" + +#: ../../library/ast.rst:112 +msgid "" +"If there are keyword arguments, they will set the attributes of the same " +"names to the given values." +msgstr "如果有关键字参数,它们会为与其关键字同名的属性赋值。" + +#: ../../library/ast.rst:115 +msgid "" +"For example, to create and populate an :class:`ast.UnaryOp` node, you could " +"use ::" +msgstr "比方说,要创建和填充节点 :class:`ast.UnaryOp`,你得用 ::" + +#: ../../library/ast.rst:118 +msgid "" +"node = ast.UnaryOp(ast.USub(), ast.Constant(5, lineno=0, col_offset=0),\n" +" lineno=0, col_offset=0)" +msgstr "" +"node = ast.UnaryOp(ast.USub(), ast.Constant(5, lineno=0, col_offset=0),\n" +" lineno=0, col_offset=0)" + +#: ../../library/ast.rst:121 +msgid "" +"If a field that is optional in the grammar is omitted from the constructor, " +"it defaults to ``None``. If a list field is omitted, it defaults to the " +"empty list. If a field of type :class:`!ast.expr_context` is omitted, it " +"defaults to :class:`Load() `. If any other field is omitted, a " +":exc:`DeprecationWarning` is raised and the AST node will not have this " +"field. In Python 3.15, this condition will raise an error." +msgstr "" +"如果从构造器中省略一个在语法中可选的字段,则其默认值为 ``None``。如果省略一个列表字段,则其默认值为空列表。如果省略一个 " +":class:`!ast.expr_context` 类型的字段,则其默认值 为 :class:`Load() `。 " +"如果省略任何其他字段,则会引发 :exc:`DeprecationWarning` 并且 AST 节点将不包含此字段。在 Python " +"3.15,这种情况将引发一个错误。" + +#: ../../library/ast.rst:130 +msgid "Class :class:`ast.Constant` is now used for all constants." +msgstr ":class:`ast.Constant` 类现在用于所有常量。" + +#: ../../library/ast.rst:134 +msgid "" +"Simple indices are represented by their value, extended slices are " +"represented as tuples." +msgstr "简单索引由它们的值表示,扩展切片表示为元组。" + +#: ../../library/ast.rst:139 +msgid "" +"AST node constructors were changed to provide sensible defaults for omitted " +"fields: optional fields now default to ``None``, list fields default to an " +"empty list, and fields of type :class:`!ast.expr_context` default to " +":class:`Load() `. Previously, omitted attributes would not exist " +"on constructed nodes (accessing them raised :exc:`AttributeError`)." +msgstr "" + +#: ../../library/ast.rst:147 +msgid "" +"The :meth:`~object.__repr__` output of :class:`~ast.AST` nodes includes the " +"values of the node fields." +msgstr ":class:`~ast.AST` 节点的 :meth:`~object.__repr__` 输出包括节点字段的值。" + +#: ../../library/ast.rst:152 +msgid "" +"Previous versions of Python provided the AST classes :class:`!ast.Num`, " +":class:`!ast.Str`, :class:`!ast.Bytes`, :class:`!ast.NameConstant` and " +":class:`!ast.Ellipsis`, which were deprecated in Python 3.8. These classes " +"were removed in Python 3.14, and their functionality has been replaced with " +":class:`ast.Constant`." +msgstr "" +"之前版本的 Python 提供了 AST 类 :class:`!ast.Num`, :class:`!ast.Str`, " +":class:`!ast.Bytes`, :class:`!ast.NameConstant` 和 :class:`!ast.Ellipsis`,它们在" +" Python 3.8 中被弃用。这些类在 Python 3.14 中已被移除,其功能被 :class:`ast.Constant` 代替。" + +#: ../../library/ast.rst:160 +msgid "" +"Old classes :class:`!ast.Index` and :class:`!ast.ExtSlice` are still " +"available, but they will be removed in future Python releases. In the " +"meantime, instantiating them will return an instance of a different class." +msgstr "" +"原有的类 :class:`!ast.Index` 和 :class:`!ast.ExtSlice` 仍然可用,但它们将在未来的 Python " +"发布版中被移除。同时,实例化它们将返回其他某个类的实例。" + +#: ../../library/ast.rst:167 +msgid "" +"Previous versions of Python allowed the creation of AST nodes that were " +"missing required fields. Similarly, AST node constructors allowed arbitrary " +"keyword arguments that were set as attributes of the AST node, even if they " +"did not match any of the fields of the AST node. This behavior is deprecated" +" and will be removed in Python 3.15." +msgstr "" +"之前版本的 Python 允许创建缺少必需字段的 AST 节点。类似地,AST 节点构造器也允许任意用于设置 AST " +"节点属性的关键字参数,即使它们不能匹配任何 AST 节点的字段。此行为已被弃用并将在 Python 3.15 中移除。" + +#: ../../library/ast.rst:174 +msgid "" +"The descriptions of the specific node classes displayed here were initially " +"adapted from the fantastic `Green Tree Snakes " +"`__ project and all its " +"contributors." +msgstr "" +"在此显示的特定节点类的描述最初是改编自杰出的 `Green Tree Snakes " +"`__ 项目及其所有贡献者。" + +#: ../../library/ast.rst:183 +msgid "Root nodes" +msgstr "根节点" + +#: ../../library/ast.rst:187 +msgid "" +"A Python module, as with :ref:`file input `. Node type generated" +" by :func:`ast.parse` in the default ``\"exec\"`` *mode*." +msgstr "" +"一个 Python 模块,用于 :ref:`文件输入 `。由 :func:`ast.parse` 以默认 " +"``\"exec\"`` *mode* 生成的节点类型。" + +#: ../../library/ast.rst:190 +msgid "``body`` is a :class:`list` of the module's :ref:`ast-statements`." +msgstr "``body`` 是由该模块的 :ref:`ast-statements` 组成的 :class:`list`。" + +#: ../../library/ast.rst:192 +msgid "" +"``type_ignores`` is a :class:`list` of the module's type ignore comments; " +"see :func:`ast.parse` for more details." +msgstr "" +"``type_ignores`` 是由该模块的类型忽略注释组成的 :class:`list`;请参阅 :func:`ast.parse` 了解详情。" + +#: ../../library/ast.rst:195 +msgid "" +">>> print(ast.dump(ast.parse('x = 1'), indent=4))\n" +"Module(\n" +" body=[\n" +" Assign(\n" +" targets=[\n" +" Name(id='x', ctx=Store())],\n" +" value=Constant(value=1))])" +msgstr "" +">>> print(ast.dump(ast.parse('x = 1'), indent=4))\n" +"Module(\n" +" body=[\n" +" Assign(\n" +" targets=[\n" +" Name(id='x', ctx=Store())],\n" +" value=Constant(value=1))])" + +#: ../../library/ast.rst:208 +msgid "" +"A single Python :ref:`expression input `. Node type " +"generated by :func:`ast.parse` when *mode* is ``\"eval\"``." +msgstr "" +"单个 Python :ref:`表达式输入 `。当 *mode* 为 ``\"eval\"`` 时由 " +":func:`ast.parse` 所生成的节点类型。" + +#: ../../library/ast.rst:211 +msgid "" +"``body`` is a single node, one of the :ref:`expression types `." +msgstr "``body`` 为单独节点,是某一个 :ref:`表达式类型 `。" + +#: ../../library/ast.rst:214 +msgid "" +">>> print(ast.dump(ast.parse('123', mode='eval'), indent=4))\n" +"Expression(\n" +" body=Constant(value=123))" +msgstr "" +">>> print(ast.dump(ast.parse('123', mode='eval'), indent=4))\n" +"Expression(\n" +" body=Constant(value=123))" + +#: ../../library/ast.rst:223 +msgid "" +"A single :ref:`interactive input `, like in :ref:`tut-interac`." +" Node type generated by :func:`ast.parse` when *mode* is ``\"single\"``." +msgstr "" +"单个 :ref:`交互式输入 `,就像在 :ref:`tut-interac` 中一样。当 *mode* 为 " +"``\"single\"`` 时由 :func:`ast.parse` 所生成的节点类型。" + +#: ../../library/ast.rst:226 +msgid "" +"``body`` is a :class:`list` of :ref:`statement nodes `." +msgstr "``body`` 是由 :ref:`语句节点 ` 组成的 :class:`list`。" + +#: ../../library/ast.rst:228 +msgid "" +">>> print(ast.dump(ast.parse('x = 1; y = 2', mode='single'), indent=4))\n" +"Interactive(\n" +" body=[\n" +" Assign(\n" +" targets=[\n" +" Name(id='x', ctx=Store())],\n" +" value=Constant(value=1)),\n" +" Assign(\n" +" targets=[\n" +" Name(id='y', ctx=Store())],\n" +" value=Constant(value=2))])" +msgstr "" +">>> print(ast.dump(ast.parse('x = 1; y = 2', mode='single'), indent=4))\n" +"Interactive(\n" +" body=[\n" +" Assign(\n" +" targets=[\n" +" Name(id='x', ctx=Store())],\n" +" value=Constant(value=1)),\n" +" Assign(\n" +" targets=[\n" +" Name(id='y', ctx=Store())],\n" +" value=Constant(value=2))])" + +#: ../../library/ast.rst:245 +msgid "" +"A representation of an old-style type comments for functions, as Python " +"versions prior to 3.5 didn't support :pep:`484` annotations. Node type " +"generated by :func:`ast.parse` when *mode* is ``\"func_type\"``." +msgstr "" +"函数的旧风格类型注释表示形式,因为 Python 3.5 之前的版本不支持 :pep:`484` 标注。当 *mode* 为 " +"``\"func_type\"`` 时由 :func:`ast.parse` 所生成的节点类型。" + +#: ../../library/ast.rst:249 +msgid "Such type comments would look like this::" +msgstr "此种类型注释的形式是这样的::" + +#: ../../library/ast.rst:251 +msgid "" +"def sum_two_number(a, b):\n" +" # type: (int, int) -> int\n" +" return a + b" +msgstr "" +"def sum_two_number(a, b):\n" +" # type: (int, int) -> int\n" +" return a + b" + +#: ../../library/ast.rst:255 +msgid "" +"``argtypes`` is a :class:`list` of :ref:`expression nodes `." +msgstr "``argtypes`` 是由 :ref:`表达式节点 ` 组成的 :class:`list`。" + +#: ../../library/ast.rst:257 +msgid "``returns`` is a single :ref:`expression node `." +msgstr "``returns`` 是单独的 :ref:`表达式节点 `。" + +#: ../../library/ast.rst:259 +msgid "" +">>> print(ast.dump(ast.parse('(int, str) -> List[int]', mode='func_type'), indent=4))\n" +"FunctionType(\n" +" argtypes=[\n" +" Name(id='int', ctx=Load()),\n" +" Name(id='str', ctx=Load())],\n" +" returns=Subscript(\n" +" value=Name(id='List', ctx=Load()),\n" +" slice=Name(id='int', ctx=Load()),\n" +" ctx=Load()))" +msgstr "" +">>> print(ast.dump(ast.parse('(int, str) -> List[int]', mode='func_type'), indent=4))\n" +"FunctionType(\n" +" argtypes=[\n" +" Name(id='int', ctx=Load()),\n" +" Name(id='str', ctx=Load())],\n" +" returns=Subscript(\n" +" value=Name(id='List', ctx=Load()),\n" +" slice=Name(id='int', ctx=Load()),\n" +" ctx=Load()))" + +#: ../../library/ast.rst:275 +msgid "Literals" +msgstr "字面值" + +#: ../../library/ast.rst:279 +msgid "" +"A constant value. The ``value`` attribute of the ``Constant`` literal " +"contains the Python object it represents. The values represented can be " +"instances of :class:`str`, :class:`bytes`, :class:`int`, :class:`float`, " +":class:`complex`, and :class:`bool`, and the constants :data:`None` and " +":data:`Ellipsis`." +msgstr "" +"一个常量值。``Constant`` 字面值的 ``value`` 属性包含它所代表的 Python 对象。它所表示的值可以是 " +":class:`str`, :class:`bytes`, :class:`int`, :class:`float`, :class:`complex`" +" 或 :class:`bool` 的实例及常量 :data:`None` 和 :data:`Ellipsis`。" + +#: ../../library/ast.rst:284 +msgid "" +"The ``kind`` attribute is an optional string. For string literals with a " +"``u`` prefix, ``kind`` is set to ``'u'``. For all other constants, ``kind`` " +"is ``None``." +msgstr "" + +#: ../../library/ast.rst:288 +msgid "" +">>> print(ast.dump(ast.parse('123', mode='eval'), indent=4))\n" +"Expression(\n" +" body=Constant(value=123))\n" +">>> print(ast.dump(ast.parse(\"u'hello'\", mode='eval'), indent=4))\n" +"Expression(\n" +" body=Constant(value='hello', kind='u'))" +msgstr "" + +#: ../../library/ast.rst:300 +msgid "" +"Node representing a single formatting field in an f-string. If the string " +"contains a single formatting field and nothing else the node can be isolated" +" otherwise it appears in :class:`JoinedStr`." +msgstr "" +"表示 f-字符串中单个格式化字段的节点。如果该字符串只包含单个格式化字段而没有任何其他内容则该节点可以被单独使用,否则它将在 " +":class:`JoinedStr` 中出现。" + +#: ../../library/ast.rst:304 +msgid "" +"``value`` is any expression node (such as a literal, a variable, or a " +"function call)." +msgstr "``value`` 为任意的表达式节点(如一个字面值、变量或函数调用)。" + +#: ../../library/ast.rst:306 ../../library/ast.rst:388 +msgid "``conversion`` is an integer:" +msgstr "``conversion`` 是一个整数:" + +#: ../../library/ast.rst:308 +msgid "-1: no formatting" +msgstr "-1: 无格式化" + +#: ../../library/ast.rst:309 +msgid "97 (``ord('a')``): ``!a`` :func:`ASCII ` formatting" +msgstr "97 (``ord('a')``): ``!a`` :func:`ASCII ` 格式化" + +#: ../../library/ast.rst:310 +msgid "114 (``ord('r')``): ``!r`` :func:`repr` formatting" +msgstr "114 (``ord('r')``): ``!r`` :func:`repr` 格式化" + +#: ../../library/ast.rst:311 +msgid "115 (``ord('s')``): ``!s`` :func:`string ` formatting" +msgstr "115 (``ord('s')``): ``!s`` :func:`字符串 ` 格式化" + +#: ../../library/ast.rst:313 +msgid "" +"``format_spec`` is a :class:`JoinedStr` node representing the formatting of " +"the value, or ``None`` if no format was specified. Both ``conversion`` and " +"``format_spec`` can be set at the same time." +msgstr "" +"``format_spec`` 是一个代表值的格式化的 :class:`JoinedStr` 节点,或者如果未指定格式则为 ``None``。 " +"``conversion`` 和 ``format_spec`` 可以被同时设置。" + +#: ../../library/ast.rst:320 +msgid "" +"An f-string, comprising a series of :class:`FormattedValue` and " +":class:`Constant` nodes." +msgstr "一个 f-字符串,由一系列 :class:`FormattedValue` 和 :class:`Constant` 节点组成。" + +#: ../../library/ast.rst:323 +msgid "" +">>> print(ast.dump(ast.parse('f\"sin({a}) is {sin(a):.3}\"', mode='eval'), indent=4))\n" +"Expression(\n" +" body=JoinedStr(\n" +" values=[\n" +" Constant(value='sin('),\n" +" FormattedValue(\n" +" value=Name(id='a', ctx=Load()),\n" +" conversion=-1),\n" +" Constant(value=') is '),\n" +" FormattedValue(\n" +" value=Call(\n" +" func=Name(id='sin', ctx=Load()),\n" +" args=[\n" +" Name(id='a', ctx=Load())]),\n" +" conversion=-1,\n" +" format_spec=JoinedStr(\n" +" values=[\n" +" Constant(value='.3')]))]))" +msgstr "" +">>> print(ast.dump(ast.parse('f\"sin({a}) is {sin(a):.3}\"', mode='eval'), indent=4))\n" +"Expression(\n" +" body=JoinedStr(\n" +" values=[\n" +" Constant(value='sin('),\n" +" FormattedValue(\n" +" value=Name(id='a', ctx=Load()),\n" +" conversion=-1),\n" +" Constant(value=') is '),\n" +" FormattedValue(\n" +" value=Call(\n" +" func=Name(id='sin', ctx=Load()),\n" +" args=[\n" +" Name(id='a', ctx=Load())]),\n" +" conversion=-1,\n" +" format_spec=JoinedStr(\n" +" values=[\n" +" Constant(value='.3')]))]))" + +#: ../../library/ast.rst:349 +msgid "" +"Node representing a template string literal, comprising a series of " +":class:`Interpolation` and :class:`Constant` nodes. These nodes may be any " +"order, and do not need to be interleaved." +msgstr "" +"表示模板字符串字面值的节点,由一系列 :class:`Interpolation` 节点和 :class:`Constant` 节点组成。 " +"这些节点可以按任意顺序排列,且不需要交错分布。" + +#: ../../library/ast.rst:353 +msgid "" +">>> expr = ast.parse('t\"{name} finished {place:ordinal}\"', mode='eval')\n" +">>> print(ast.dump(expr, indent=4))\n" +"Expression(\n" +" body=TemplateStr(\n" +" values=[\n" +" Interpolation(\n" +" value=Name(id='name', ctx=Load()),\n" +" str='name',\n" +" conversion=-1),\n" +" Constant(value=' finished '),\n" +" Interpolation(\n" +" value=Name(id='place', ctx=Load()),\n" +" str='place',\n" +" conversion=-1,\n" +" format_spec=JoinedStr(\n" +" values=[\n" +" Constant(value='ordinal')]))]))" +msgstr "" +">>> expr = ast.parse('t\"{name} finished {place:ordinal}\"', mode='eval')\n" +">>> print(ast.dump(expr, indent=4))\n" +"Expression(\n" +" body=TemplateStr(\n" +" values=[\n" +" Interpolation(\n" +" value=Name(id='name', ctx=Load()),\n" +" str='name',\n" +" conversion=-1),\n" +" Constant(value=' finished '),\n" +" Interpolation(\n" +" value=Name(id='place', ctx=Load()),\n" +" str='place',\n" +" conversion=-1,\n" +" format_spec=JoinedStr(\n" +" values=[\n" +" Constant(value='ordinal')]))]))" + +#: ../../library/ast.rst:377 +msgid "" +"Node representing a single interpolation field in a template string literal." +msgstr "节点表示模板字符串字面值中单个插值字段。" + +#: ../../library/ast.rst:379 +msgid "" +"``value`` is any expression node (such as a literal, a variable, or a " +"function call). This has the same meaning as ``FormattedValue.value``." +msgstr "``value`` 可以是任意表达式节点(例如字面值、变量或函数调用)。该含义与 ``FormattedValue.value`` 相同。" + +#: ../../library/ast.rst:382 +msgid "" +"``str`` is a constant containing the text of the interpolation expression." +msgstr "``str`` 是一个包含插值表达式文本的常量。" + +#: ../../library/ast.rst:384 +msgid "" +"If ``str`` is set to ``None``, then ``value`` is used to generate code when " +"calling :func:`ast.unparse`. This no longer guarantees that the generated " +"code is identical to the original and is intended for code generation." +msgstr "" +"如果 ``str`` 被设为 ``None``,则在调用 :func:`ast.unparse` 时将使用 ``value`` 来生成代码。 " +"这将不再保证生成的代码与原始代码相同并作为代码生成的目标。" + +#: ../../library/ast.rst:390 +msgid "-1: no conversion" +msgstr "-1:不转换" + +#: ../../library/ast.rst:391 +msgid "97 (``ord('a')``): ``!a`` :func:`ASCII ` conversion" +msgstr "97 (``ord('a')``): ``!a`` :func:`ASCII ` 转换" + +#: ../../library/ast.rst:392 +msgid "114 (``ord('r')``): ``!r`` :func:`repr` conversion" +msgstr "114 (``ord('r')``): ``!r`` :func:`repr` 转换" + +#: ../../library/ast.rst:393 +msgid "115 (``ord('s')``): ``!s`` :func:`string ` conversion" +msgstr "115 (``ord('s')``): ``!s`` :func:`字符串 ` 转换" + +#: ../../library/ast.rst:395 +msgid "This has the same meaning as ``FormattedValue.conversion``." +msgstr "这与 ``FormattedValue.conversion`` 的含义相同。" + +#: ../../library/ast.rst:396 +msgid "" +"``format_spec`` is a :class:`JoinedStr` node representing the formatting of " +"the value, or ``None`` if no format was specified. Both ``conversion`` and " +"``format_spec`` can be set at the same time. This has the same meaning as " +"``FormattedValue.format_spec``." +msgstr "" +"``format_spec`` 是一个代表值的格式化的 :class:`JoinedStr` 节点,或者如果未指定格式则为 ``None``。 " +"``conversion`` 和 ``format_spec`` 可以被同时设置。这与 ``FormattedValue.format_spec`` " +"的含义相同。" + +#: ../../library/ast.rst:405 +msgid "" +"A list or tuple. ``elts`` holds a list of nodes representing the elements. " +"``ctx`` is :class:`Store` if the container is an assignment target (i.e. " +"``(x,y)=something``), and :class:`Load` otherwise." +msgstr "" +"一个列表或元组。``elts`` 保存一个代表元素的节点的列表。``ctx`` 在容器为赋值的目标时 (如 ``(x,y)=something``) 是" +" :class:`Store`,否则是 :class:`Load`。" + +#: ../../library/ast.rst:409 +msgid "" +">>> print(ast.dump(ast.parse('[1, 2, 3]', mode='eval'), indent=4))\n" +"Expression(\n" +" body=List(\n" +" elts=[\n" +" Constant(value=1),\n" +" Constant(value=2),\n" +" Constant(value=3)],\n" +" ctx=Load()))\n" +">>> print(ast.dump(ast.parse('(1, 2, 3)', mode='eval'), indent=4))\n" +"Expression(\n" +" body=Tuple(\n" +" elts=[\n" +" Constant(value=1),\n" +" Constant(value=2),\n" +" Constant(value=3)],\n" +" ctx=Load()))" +msgstr "" +">>> print(ast.dump(ast.parse('[1, 2, 3]', mode='eval'), indent=4))\n" +"Expression(\n" +" body=List(\n" +" elts=[\n" +" Constant(value=1),\n" +" Constant(value=2),\n" +" Constant(value=3)],\n" +" ctx=Load()))\n" +">>> print(ast.dump(ast.parse('(1, 2, 3)', mode='eval'), indent=4))\n" +"Expression(\n" +" body=Tuple(\n" +" elts=[\n" +" Constant(value=1),\n" +" Constant(value=2),\n" +" Constant(value=3)],\n" +" ctx=Load()))" + +#: ../../library/ast.rst:431 +msgid "A set. ``elts`` holds a list of nodes representing the set's elements." +msgstr "一个集合。``elts`` 保存一个代表集合的元素的节点的列表。" + +#: ../../library/ast.rst:433 +msgid "" +">>> print(ast.dump(ast.parse('{1, 2, 3}', mode='eval'), indent=4))\n" +"Expression(\n" +" body=Set(\n" +" elts=[\n" +" Constant(value=1),\n" +" Constant(value=2),\n" +" Constant(value=3)]))" +msgstr "" +">>> print(ast.dump(ast.parse('{1, 2, 3}', mode='eval'), indent=4))\n" +"Expression(\n" +" body=Set(\n" +" elts=[\n" +" Constant(value=1),\n" +" Constant(value=2),\n" +" Constant(value=3)]))" + +#: ../../library/ast.rst:446 +msgid "" +"A dictionary. ``keys`` and ``values`` hold lists of nodes representing the " +"keys and the values respectively, in matching order (what would be returned " +"when calling :code:`dictionary.keys()` and :code:`dictionary.values()`)." +msgstr "" +"一个字典。``keys`` 和 ``values`` 保存分别代表键和值的节点的列表,按照匹配的顺序(即当调用 " +":code:`dictionary.keys()` 和 :code:`dictionary.values()` 时将返回的结果)。" + +#: ../../library/ast.rst:450 +msgid "" +"When doing dictionary unpacking using dictionary literals the expression to " +"be expanded goes in the ``values`` list, with a ``None`` at the " +"corresponding position in ``keys``." +msgstr "" +"当使用字典字面值进行字典解包操作时要扩展的表达式放入 ``values`` 列表,并将 ``None`` 放入 ``keys`` 的对应位置。" + +#: ../../library/ast.rst:454 +msgid "" +">>> print(ast.dump(ast.parse('{\"a\":1, **d}', mode='eval'), indent=4))\n" +"Expression(\n" +" body=Dict(\n" +" keys=[\n" +" Constant(value='a'),\n" +" None],\n" +" values=[\n" +" Constant(value=1),\n" +" Name(id='d', ctx=Load())]))" +msgstr "" +">>> print(ast.dump(ast.parse('{\"a\":1, **d}', mode='eval'), indent=4))\n" +"Expression(\n" +" body=Dict(\n" +" keys=[\n" +" Constant(value='a'),\n" +" None],\n" +" values=[\n" +" Constant(value=1),\n" +" Name(id='d', ctx=Load())]))" + +#: ../../library/ast.rst:468 +msgid "Variables" +msgstr "变量" + +#: ../../library/ast.rst:472 +msgid "" +"A variable name. ``id`` holds the name as a string, and ``ctx`` is one of " +"the following types." +msgstr "一个变量名。``id`` 将名称保存为字符串,而 ``ctx`` 为下列类型之一。" + +#: ../../library/ast.rst:480 +msgid "" +"Variable references can be used to load the value of a variable, to assign a" +" new value to it, or to delete it. Variable references are given a context " +"to distinguish these cases." +msgstr "变量引用可被用来载入一个变量的值,为其赋一个新值,或是将其删除。变量引用会给出一个上下文来区分这几种情况。" + +#: ../../library/ast.rst:484 +msgid "" +">>> print(ast.dump(ast.parse('a'), indent=4))\n" +"Module(\n" +" body=[\n" +" Expr(\n" +" value=Name(id='a', ctx=Load()))])\n" +"\n" +">>> print(ast.dump(ast.parse('a = 1'), indent=4))\n" +"Module(\n" +" body=[\n" +" Assign(\n" +" targets=[\n" +" Name(id='a', ctx=Store())],\n" +" value=Constant(value=1))])\n" +"\n" +">>> print(ast.dump(ast.parse('del a'), indent=4))\n" +"Module(\n" +" body=[\n" +" Delete(\n" +" targets=[\n" +" Name(id='a', ctx=Del())])])" +msgstr "" +">>> print(ast.dump(ast.parse('a'), indent=4))\n" +"Module(\n" +" body=[\n" +" Expr(\n" +" value=Name(id='a', ctx=Load()))])\n" +"\n" +">>> print(ast.dump(ast.parse('a = 1'), indent=4))\n" +"Module(\n" +" body=[\n" +" Assign(\n" +" targets=[\n" +" Name(id='a', ctx=Store())],\n" +" value=Constant(value=1))])\n" +"\n" +">>> print(ast.dump(ast.parse('del a'), indent=4))\n" +"Module(\n" +" body=[\n" +" Delete(\n" +" targets=[\n" +" Name(id='a', ctx=Del())])])" + +#: ../../library/ast.rst:510 +msgid "" +"A ``*var`` variable reference. ``value`` holds the variable, typically a " +":class:`Name` node. This type must be used when building a :class:`Call` " +"node with ``*args``." +msgstr "" +"一个 ``*var`` 变量引用。``value`` 保存变量,通常为一个 :class:`Name` 节点。此类型必须在构建 " +":class:`Call` 节点并传入 ``*args`` 时被使用。" + +#: ../../library/ast.rst:514 +msgid "" +">>> print(ast.dump(ast.parse('a, *b = it'), indent=4))\n" +"Module(\n" +" body=[\n" +" Assign(\n" +" targets=[\n" +" Tuple(\n" +" elts=[\n" +" Name(id='a', ctx=Store()),\n" +" Starred(\n" +" value=Name(id='b', ctx=Store()),\n" +" ctx=Store())],\n" +" ctx=Store())],\n" +" value=Name(id='it', ctx=Load()))])" +msgstr "" +">>> print(ast.dump(ast.parse('a, *b = it'), indent=4))\n" +"Module(\n" +" body=[\n" +" Assign(\n" +" targets=[\n" +" Tuple(\n" +" elts=[\n" +" Name(id='a', ctx=Store()),\n" +" Starred(\n" +" value=Name(id='b', ctx=Store()),\n" +" ctx=Store())],\n" +" ctx=Store())],\n" +" value=Name(id='it', ctx=Load()))])" + +#: ../../library/ast.rst:534 +msgid "Expressions" +msgstr "表达式" + +#: ../../library/ast.rst:538 +msgid "" +"When an expression, such as a function call, appears as a statement by " +"itself with its return value not used or stored, it is wrapped in this " +"container. ``value`` holds one of the other nodes in this section, a " +":class:`Constant`, a :class:`Name`, a :class:`Lambda`, a :class:`Yield` or " +":class:`YieldFrom` node." +msgstr "" +"当一个表达式,例如函数调用,本身作为一个语句出现并且其返回值未被使用或存储时,它会被包装在此容器中。``value`` 保存本节中的其他节点之一,一个 " +":class:`Constant`, :class:`Name`, :class:`Lambda`, :class:`Yield` 或者 " +":class:`YieldFrom` 节点。" + +#: ../../library/ast.rst:543 +msgid "" +">>> print(ast.dump(ast.parse('-a'), indent=4))\n" +"Module(\n" +" body=[\n" +" Expr(\n" +" value=UnaryOp(\n" +" op=USub(),\n" +" operand=Name(id='a', ctx=Load())))])" +msgstr "" +">>> print(ast.dump(ast.parse('-a'), indent=4))\n" +"Module(\n" +" body=[\n" +" Expr(\n" +" value=UnaryOp(\n" +" op=USub(),\n" +" operand=Name(id='a', ctx=Load())))])" + +#: ../../library/ast.rst:556 +msgid "" +"A unary operation. ``op`` is the operator, and ``operand`` any expression " +"node." +msgstr "一个单目运算。``op`` 是运算符,而 ``operand`` 是任意表达式节点。" + +#: ../../library/ast.rst:565 +msgid "" +"Unary operator tokens. :class:`Not` is the ``not`` keyword, :class:`Invert` " +"is the ``~`` operator." +msgstr "单目运算符对应的形符。 :class:`Not` 是 ``not`` 关键字,:class:`Invert` 是 ``~`` 运算符。" + +#: ../../library/ast.rst:568 +msgid "" +">>> print(ast.dump(ast.parse('not x', mode='eval'), indent=4))\n" +"Expression(\n" +" body=UnaryOp(\n" +" op=Not(),\n" +" operand=Name(id='x', ctx=Load())))" +msgstr "" +">>> print(ast.dump(ast.parse('not x', mode='eval'), indent=4))\n" +"Expression(\n" +" body=UnaryOp(\n" +" op=Not(),\n" +" operand=Name(id='x', ctx=Load())))" + +#: ../../library/ast.rst:579 +msgid "" +"A binary operation (like addition or division). ``op`` is the operator, and " +"``left`` and ``right`` are any expression nodes." +msgstr "一个双目运算(如相加或相减)。``op`` 是运算符,而 ``left`` 和 ``right`` 是任意表达式节点。" + +#: ../../library/ast.rst:582 +msgid "" +">>> print(ast.dump(ast.parse('x + y', mode='eval'), indent=4))\n" +"Expression(\n" +" body=BinOp(\n" +" left=Name(id='x', ctx=Load()),\n" +" op=Add(),\n" +" right=Name(id='y', ctx=Load())))" +msgstr "" +">>> print(ast.dump(ast.parse('x + y', mode='eval'), indent=4))\n" +"Expression(\n" +" body=BinOp(\n" +" left=Name(id='x', ctx=Load()),\n" +" op=Add(),\n" +" right=Name(id='y', ctx=Load())))" + +#: ../../library/ast.rst:606 +msgid "Binary operator tokens." +msgstr "双目运算符对应的形符。" + +#: ../../library/ast.rst:611 +msgid "" +"A boolean operation, 'or' or 'and'. ``op`` is :class:`Or` or :class:`And`. " +"``values`` are the values involved. Consecutive operations with the same " +"operator, such as ``a or b or c``, are collapsed into one node with several " +"values." +msgstr "" +"一个布尔运算,'or' 或者 'and'。``op`` 是 :class:`Or` 或者 :class:`And`。``values`` " +"是参与运算的值。具有相同运算符的连续运算,如 ``a or b or c``,会被折叠为具有多个值的单个节点。" + +#: ../../library/ast.rst:616 +msgid "This doesn't include ``not``, which is a :class:`UnaryOp`." +msgstr "这不包括 ``not``,它属于 :class:`UnaryOp`。" + +#: ../../library/ast.rst:618 +msgid "" +">>> print(ast.dump(ast.parse('x or y', mode='eval'), indent=4))\n" +"Expression(\n" +" body=BoolOp(\n" +" op=Or(),\n" +" values=[\n" +" Name(id='x', ctx=Load()),\n" +" Name(id='y', ctx=Load())]))" +msgstr "" +">>> print(ast.dump(ast.parse('x or y', mode='eval'), indent=4))\n" +"Expression(\n" +" body=BoolOp(\n" +" op=Or(),\n" +" values=[\n" +" Name(id='x', ctx=Load()),\n" +" Name(id='y', ctx=Load())]))" + +#: ../../library/ast.rst:632 +msgid "Boolean operator tokens." +msgstr "布尔运算符对应的形符。" + +#: ../../library/ast.rst:637 +msgid "" +"A comparison of two or more values. ``left`` is the first value in the " +"comparison, ``ops`` the list of operators, and ``comparators`` the list of " +"values after the first element in the comparison." +msgstr "" +"两个或更多值之间的比较运算。``left`` 是参加比较的第一个值,``ops`` 是由运算符组成的列表,而 ``comparators`` " +"是由参加比较的第一个元素之后的值组成的列表。" + +#: ../../library/ast.rst:641 +msgid "" +">>> print(ast.dump(ast.parse('1 <= a < 10', mode='eval'), indent=4))\n" +"Expression(\n" +" body=Compare(\n" +" left=Constant(value=1),\n" +" ops=[\n" +" LtE(),\n" +" Lt()],\n" +" comparators=[\n" +" Name(id='a', ctx=Load()),\n" +" Constant(value=10)]))" +msgstr "" +">>> print(ast.dump(ast.parse('1 <= a < 10', mode='eval'), indent=4))\n" +"Expression(\n" +" body=Compare(\n" +" left=Constant(value=1),\n" +" ops=[\n" +" LtE(),\n" +" Lt()],\n" +" comparators=[\n" +" Name(id='a', ctx=Load()),\n" +" Constant(value=10)]))" + +#: ../../library/ast.rst:666 +msgid "Comparison operator tokens." +msgstr "比较运算符对应的形符。" + +#: ../../library/ast.rst:671 +msgid "" +"A function call. ``func`` is the function, which will often be a " +":class:`Name` or :class:`Attribute` object. Of the arguments:" +msgstr "" +"一个函数调用。``func`` 是函数,它通常是一个 :class:`Name` 或 :class:`Attribute` 对象。对于其参数:" + +#: ../../library/ast.rst:674 +msgid "``args`` holds a list of the arguments passed by position." +msgstr "``args`` 保存由按位置传入的参数组成的列表。" + +#: ../../library/ast.rst:675 +msgid "" +"``keywords`` holds a list of :class:`.keyword` objects representing " +"arguments passed by keyword." +msgstr "``keywords`` 保存了一个代表以关键字传入的参数的 :class:`.keyword` 对象的列表。" + +#: ../../library/ast.rst:678 +msgid "" +"The ``args`` and ``keywords`` arguments are optional and default to empty " +"lists." +msgstr "``args`` 和 ``keywords`` 参数是可选的并且默认为空列表。" + +#: ../../library/ast.rst:680 +msgid "" +">>> print(ast.dump(ast.parse('func(a, b=c, *d, **e)', mode='eval'), indent=4))\n" +"Expression(\n" +" body=Call(\n" +" func=Name(id='func', ctx=Load()),\n" +" args=[\n" +" Name(id='a', ctx=Load()),\n" +" Starred(\n" +" value=Name(id='d', ctx=Load()),\n" +" ctx=Load())],\n" +" keywords=[\n" +" keyword(\n" +" arg='b',\n" +" value=Name(id='c', ctx=Load())),\n" +" keyword(\n" +" value=Name(id='e', ctx=Load()))]))" +msgstr "" +">>> print(ast.dump(ast.parse('func(a, b=c, *d, **e)', mode='eval'), indent=4))\n" +"Expression(\n" +" body=Call(\n" +" func=Name(id='func', ctx=Load()),\n" +" args=[\n" +" Name(id='a', ctx=Load()),\n" +" Starred(\n" +" value=Name(id='d', ctx=Load()),\n" +" ctx=Load())],\n" +" keywords=[\n" +" keyword(\n" +" arg='b',\n" +" value=Name(id='c', ctx=Load())),\n" +" keyword(\n" +" value=Name(id='e', ctx=Load()))]))" + +#: ../../library/ast.rst:701 +msgid "" +"A keyword argument to a function call or class definition. ``arg`` is a raw " +"string of the parameter name, ``value`` is a node to pass in." +msgstr "传给函数调用或类定义的关键字参数。``arg`` 是形参名称对应的原始字符串,``value`` 是要传入的节点。" + +#: ../../library/ast.rst:707 +msgid "" +"An expression such as ``a if b else c``. Each field holds a single node, so " +"in the following example, all three are :class:`Name` nodes." +msgstr "" +"一个表达式例如 ``a if b else c``。每个字段保存一个单独节点,因而在下面的示例中,三个节点均为 :class:`Name` 节点。" + +#: ../../library/ast.rst:710 +msgid "" +">>> print(ast.dump(ast.parse('a if b else c', mode='eval'), indent=4))\n" +"Expression(\n" +" body=IfExp(\n" +" test=Name(id='b', ctx=Load()),\n" +" body=Name(id='a', ctx=Load()),\n" +" orelse=Name(id='c', ctx=Load())))" +msgstr "" +">>> print(ast.dump(ast.parse('a if b else c', mode='eval'), indent=4))\n" +"Expression(\n" +" body=IfExp(\n" +" test=Name(id='b', ctx=Load()),\n" +" body=Name(id='a', ctx=Load()),\n" +" orelse=Name(id='c', ctx=Load())))" + +#: ../../library/ast.rst:722 +msgid "" +"Attribute access, e.g. ``d.keys``. ``value`` is a node, typically a " +":class:`Name`. ``attr`` is a bare string giving the name of the attribute, " +"and ``ctx`` is :class:`Load`, :class:`Store` or :class:`Del` according to " +"how the attribute is acted on." +msgstr "" +"属性访问,例如 ``d.keys``。``value`` 是一个节点,通常为 :class:`Name`。``attr`` " +"是一个给出属性名称的纯字符串,而 ``ctx`` 根据属性操作的方式可以为 :class:`Load`, :class:`Store` 或 " +":class:`Del`." + +#: ../../library/ast.rst:727 +msgid "" +">>> print(ast.dump(ast.parse('snake.colour', mode='eval'), indent=4))\n" +"Expression(\n" +" body=Attribute(\n" +" value=Name(id='snake', ctx=Load()),\n" +" attr='colour',\n" +" ctx=Load()))" +msgstr "" +">>> print(ast.dump(ast.parse('snake.colour', mode='eval'), indent=4))\n" +"Expression(\n" +" body=Attribute(\n" +" value=Name(id='snake', ctx=Load()),\n" +" attr='colour',\n" +" ctx=Load()))" + +#: ../../library/ast.rst:739 +msgid "" +"A named expression. This AST node is produced by the assignment expressions " +"operator (also known as the walrus operator). As opposed to the " +":class:`Assign` node in which the first argument can be multiple nodes, in " +"this case both ``target`` and ``value`` must be single nodes." +msgstr "" +"一个带名称的表达式。此 AST 节点是由赋值表达式运算符(或称海象运算符)产生的。与第一个参数可以有多个节点的 :class:`Assign` " +"节点不同,在此情况下 ``target`` 和 ``value`` 都必须为单独节点。" + +#: ../../library/ast.rst:744 +msgid "" +">>> print(ast.dump(ast.parse('(x := 4)', mode='eval'), indent=4))\n" +"Expression(\n" +" body=NamedExpr(\n" +" target=Name(id='x', ctx=Store()),\n" +" value=Constant(value=4)))" +msgstr "" +">>> print(ast.dump(ast.parse('(x := 4)', mode='eval'), indent=4))\n" +"Expression(\n" +" body=NamedExpr(\n" +" target=Name(id='x', ctx=Store()),\n" +" value=Constant(value=4)))" + +#: ../../library/ast.rst:755 +msgid "Subscripting" +msgstr "抽取" + +#: ../../library/ast.rst:759 +msgid "" +"A subscript, such as ``l[1]``. ``value`` is the subscripted object (usually " +"sequence or mapping). ``slice`` is an index, slice or key. It can be a " +":class:`Tuple` and contain a :class:`Slice`. ``ctx`` is :class:`Load`, " +":class:`Store` or :class:`Del` according to the action performed with the " +"subscript." +msgstr "" +"抽取操作,如 ``l[1]``。``value`` 是被抽取的对象(通常为序列或映射)。``slice`` 是索引号、切片或键。它可以是一个包含 " +":class:`Slice` 的 :class:`Tuple`。``ctx`` 根据抽取所执行的操作可以为 :class:`Load`, " +":class:`Store` 或 :class:`Del`。" + +#: ../../library/ast.rst:765 +msgid "" +">>> print(ast.dump(ast.parse('l[1:2, 3]', mode='eval'), indent=4))\n" +"Expression(\n" +" body=Subscript(\n" +" value=Name(id='l', ctx=Load()),\n" +" slice=Tuple(\n" +" elts=[\n" +" Slice(\n" +" lower=Constant(value=1),\n" +" upper=Constant(value=2)),\n" +" Constant(value=3)],\n" +" ctx=Load()),\n" +" ctx=Load()))" +msgstr "" +">>> print(ast.dump(ast.parse('l[1:2, 3]', mode='eval'), indent=4))\n" +"Expression(\n" +" body=Subscript(\n" +" value=Name(id='l', ctx=Load()),\n" +" slice=Tuple(\n" +" elts=[\n" +" Slice(\n" +" lower=Constant(value=1),\n" +" upper=Constant(value=2)),\n" +" Constant(value=3)],\n" +" ctx=Load()),\n" +" ctx=Load()))" + +#: ../../library/ast.rst:783 +msgid "" +"Regular slicing (on the form ``lower:upper`` or ``lower:upper:step``). Can " +"occur only inside the *slice* field of :class:`Subscript`, either directly " +"or as an element of :class:`Tuple`." +msgstr "" +"常规切片 (形式如 ``lower:upper`` 或 ``lower:upper:step``)。只能在 :class:`Subscript` 的 " +"*slice* 字段内部出现,可以是直接切片对象或是作为 :class:`Tuple` 的元素。" + +#: ../../library/ast.rst:787 +msgid "" +">>> print(ast.dump(ast.parse('l[1:2]', mode='eval'), indent=4))\n" +"Expression(\n" +" body=Subscript(\n" +" value=Name(id='l', ctx=Load()),\n" +" slice=Slice(\n" +" lower=Constant(value=1),\n" +" upper=Constant(value=2)),\n" +" ctx=Load()))" +msgstr "" +">>> print(ast.dump(ast.parse('l[1:2]', mode='eval'), indent=4))\n" +"Expression(\n" +" body=Subscript(\n" +" value=Name(id='l', ctx=Load()),\n" +" slice=Slice(\n" +" lower=Constant(value=1),\n" +" upper=Constant(value=2)),\n" +" ctx=Load()))" + +#: ../../library/ast.rst:800 +msgid "Comprehensions" +msgstr "推导式" + +#: ../../library/ast.rst:807 +msgid "" +"List and set comprehensions, generator expressions, and dictionary " +"comprehensions. ``elt`` (or ``key`` and ``value``) is a single node " +"representing the part that will be evaluated for each item." +msgstr "" +"列表和集合推导式、生成器表达式以及字典推导式。``elt`` (或 ``key`` 和 ``value``) " +"是一个代表将针对每个条目被求值的部分的单独节点。" + +#: ../../library/ast.rst:811 +msgid "``generators`` is a list of :class:`comprehension` nodes." +msgstr "``generators`` 是一个由 :class:`comprehension` 节点组成的列表。" + +#: ../../library/ast.rst:813 +msgid "" +">>> print(ast.dump(\n" +"... ast.parse('[x for x in numbers]', mode='eval'),\n" +"... indent=4,\n" +"... ))\n" +"Expression(\n" +" body=ListComp(\n" +" elt=Name(id='x', ctx=Load()),\n" +" generators=[\n" +" comprehension(\n" +" target=Name(id='x', ctx=Store()),\n" +" iter=Name(id='numbers', ctx=Load()),\n" +" is_async=0)]))\n" +">>> print(ast.dump(\n" +"... ast.parse('{x: x**2 for x in numbers}', mode='eval'),\n" +"... indent=4,\n" +"... ))\n" +"Expression(\n" +" body=DictComp(\n" +" key=Name(id='x', ctx=Load()),\n" +" value=BinOp(\n" +" left=Name(id='x', ctx=Load()),\n" +" op=Pow(),\n" +" right=Constant(value=2)),\n" +" generators=[\n" +" comprehension(\n" +" target=Name(id='x', ctx=Store()),\n" +" iter=Name(id='numbers', ctx=Load()),\n" +" is_async=0)]))\n" +">>> print(ast.dump(\n" +"... ast.parse('{x for x in numbers}', mode='eval'),\n" +"... indent=4,\n" +"... ))\n" +"Expression(\n" +" body=SetComp(\n" +" elt=Name(id='x', ctx=Load()),\n" +" generators=[\n" +" comprehension(\n" +" target=Name(id='x', ctx=Store()),\n" +" iter=Name(id='numbers', ctx=Load()),\n" +" is_async=0)]))" +msgstr "" +">>> print(ast.dump(\n" +"... ast.parse('[x for x in numbers]', mode='eval'),\n" +"... indent=4,\n" +"... ))\n" +"Expression(\n" +" body=ListComp(\n" +" elt=Name(id='x', ctx=Load()),\n" +" generators=[\n" +" comprehension(\n" +" target=Name(id='x', ctx=Store()),\n" +" iter=Name(id='numbers', ctx=Load()),\n" +" is_async=0)]))\n" +">>> print(ast.dump(\n" +"... ast.parse('{x: x**2 for x in numbers}', mode='eval'),\n" +"... indent=4,\n" +"... ))\n" +"Expression(\n" +" body=DictComp(\n" +" key=Name(id='x', ctx=Load()),\n" +" value=BinOp(\n" +" left=Name(id='x', ctx=Load()),\n" +" op=Pow(),\n" +" right=Constant(value=2)),\n" +" generators=[\n" +" comprehension(\n" +" target=Name(id='x', ctx=Store()),\n" +" iter=Name(id='numbers', ctx=Load()),\n" +" is_async=0)]))\n" +">>> print(ast.dump(\n" +"... ast.parse('{x for x in numbers}', mode='eval'),\n" +"... indent=4,\n" +"... ))\n" +"Expression(\n" +" body=SetComp(\n" +" elt=Name(id='x', ctx=Load()),\n" +" generators=[\n" +" comprehension(\n" +" target=Name(id='x', ctx=Store()),\n" +" iter=Name(id='numbers', ctx=Load()),\n" +" is_async=0)]))" + +#: ../../library/ast.rst:859 +msgid "" +"One ``for`` clause in a comprehension. ``target`` is the reference to use " +"for each element - typically a :class:`Name` or :class:`Tuple` node. " +"``iter`` is the object to iterate over. ``ifs`` is a list of test " +"expressions: each ``for`` clause can have multiple ``ifs``." +msgstr "" +"推导式中的一个 ``for`` 子句。``target`` 是针对每个元素使用的引用 —— 通常为一个 :class:`Name` 或 " +":class:`Tuple` 节点。``iter`` 是要执行迭代的对象。``ifs`` 是一个由测试表达式组成的列表:每个 ``for`` " +"子句都可以拥有多个 ``ifs``。" + +#: ../../library/ast.rst:864 +msgid "" +"``is_async`` indicates a comprehension is asynchronous (using an ``async " +"for`` instead of ``for``). The value is an integer (0 or 1)." +msgstr "" +"``is_async`` 表明推导式是异步的 (使用 ``async for`` 而不是 ``for``)。它的值是一个整数 (0 或 1)。" + +#: ../../library/ast.rst:867 +msgid "" +">>> print(ast.dump(ast.parse('[ord(c) for line in file for c in line]', mode='eval'),\n" +"... indent=4)) # Multiple comprehensions in one.\n" +"Expression(\n" +" body=ListComp(\n" +" elt=Call(\n" +" func=Name(id='ord', ctx=Load()),\n" +" args=[\n" +" Name(id='c', ctx=Load())]),\n" +" generators=[\n" +" comprehension(\n" +" target=Name(id='line', ctx=Store()),\n" +" iter=Name(id='file', ctx=Load()),\n" +" is_async=0),\n" +" comprehension(\n" +" target=Name(id='c', ctx=Store()),\n" +" iter=Name(id='line', ctx=Load()),\n" +" is_async=0)]))\n" +"\n" +">>> print(ast.dump(ast.parse('(n**2 for n in it if n>5 if n<10)', mode='eval'),\n" +"... indent=4)) # generator comprehension\n" +"Expression(\n" +" body=GeneratorExp(\n" +" elt=BinOp(\n" +" left=Name(id='n', ctx=Load()),\n" +" op=Pow(),\n" +" right=Constant(value=2)),\n" +" generators=[\n" +" comprehension(\n" +" target=Name(id='n', ctx=Store()),\n" +" iter=Name(id='it', ctx=Load()),\n" +" ifs=[\n" +" Compare(\n" +" left=Name(id='n', ctx=Load()),\n" +" ops=[\n" +" Gt()],\n" +" comparators=[\n" +" Constant(value=5)]),\n" +" Compare(\n" +" left=Name(id='n', ctx=Load()),\n" +" ops=[\n" +" Lt()],\n" +" comparators=[\n" +" Constant(value=10)])],\n" +" is_async=0)]))\n" +"\n" +">>> print(ast.dump(ast.parse('[i async for i in soc]', mode='eval'),\n" +"... indent=4)) # Async comprehension\n" +"Expression(\n" +" body=ListComp(\n" +" elt=Name(id='i', ctx=Load()),\n" +" generators=[\n" +" comprehension(\n" +" target=Name(id='i', ctx=Store()),\n" +" iter=Name(id='soc', ctx=Load()),\n" +" is_async=1)]))" +msgstr "" +">>> print(ast.dump(ast.parse('[ord(c) for line in file for c in line]', mode='eval'),\n" +"... indent=4)) # 多个推导式合一。\n" +"Expression(\n" +" body=ListComp(\n" +" elt=Call(\n" +" func=Name(id='ord', ctx=Load()),\n" +" args=[\n" +" Name(id='c', ctx=Load())]),\n" +" generators=[\n" +" comprehension(\n" +" target=Name(id='line', ctx=Store()),\n" +" iter=Name(id='file', ctx=Load()),\n" +" is_async=0),\n" +" comprehension(\n" +" target=Name(id='c', ctx=Store()),\n" +" iter=Name(id='line', ctx=Load()),\n" +" is_async=0)]))\n" +"\n" +">>> print(ast.dump(ast.parse('(n**2 for n in it if n>5 if n<10)', mode='eval'),\n" +"... indent=4)) # 生成器推导式\n" +"Expression(\n" +" body=GeneratorExp(\n" +" elt=BinOp(\n" +" left=Name(id='n', ctx=Load()),\n" +" op=Pow(),\n" +" right=Constant(value=2)),\n" +" generators=[\n" +" comprehension(\n" +" target=Name(id='n', ctx=Store()),\n" +" iter=Name(id='it', ctx=Load()),\n" +" ifs=[\n" +" Compare(\n" +" left=Name(id='n', ctx=Load()),\n" +" ops=[\n" +" Gt()],\n" +" comparators=[\n" +" Constant(value=5)]),\n" +" Compare(\n" +" left=Name(id='n', ctx=Load()),\n" +" ops=[\n" +" Lt()],\n" +" comparators=[\n" +" Constant(value=10)])],\n" +" is_async=0)]))\n" +"\n" +">>> print(ast.dump(ast.parse('[i async for i in soc]', mode='eval'),\n" +"... indent=4)) # 异步推导式\n" +"Expression(\n" +" body=ListComp(\n" +" elt=Name(id='i', ctx=Load()),\n" +" generators=[\n" +" comprehension(\n" +" target=Name(id='i', ctx=Store()),\n" +" iter=Name(id='soc', ctx=Load()),\n" +" is_async=1)]))" + +#: ../../library/ast.rst:929 +msgid "Statements" +msgstr "语句" + +#: ../../library/ast.rst:933 +msgid "" +"An assignment. ``targets`` is a list of nodes, and ``value`` is a single " +"node." +msgstr "一次赋值。``targets`` 是一个由节点组成的列表,而 ``value`` 是一个单独节点。" + +#: ../../library/ast.rst:935 +msgid "" +"Multiple nodes in ``targets`` represents assigning the same value to each. " +"Unpacking is represented by putting a :class:`Tuple` or :class:`List` within" +" ``targets``." +msgstr "" +"``targets`` 中有多个节点表示将同一个值赋给多个目标。解包操作是通过在 ``targets`` 中放入一个 :class:`Tuple` 或 " +":class:`List` 来表示的。" + +#: ../../library/ast.rst:941 ../../library/ast.rst:1236 +#: ../../library/ast.rst:1430 ../../library/ast.rst:1996 +msgid "" +"``type_comment`` is an optional string with the type annotation as a " +"comment." +msgstr "``type_comment`` 是带有以注释表示的类型标注的可选的字符串。" + +#: ../../library/ast.rst:943 +msgid "" +">>> print(ast.dump(ast.parse('a = b = 1'), indent=4)) # Multiple assignment\n" +"Module(\n" +" body=[\n" +" Assign(\n" +" targets=[\n" +" Name(id='a', ctx=Store()),\n" +" Name(id='b', ctx=Store())],\n" +" value=Constant(value=1))])\n" +"\n" +">>> print(ast.dump(ast.parse('a,b = c'), indent=4)) # Unpacking\n" +"Module(\n" +" body=[\n" +" Assign(\n" +" targets=[\n" +" Tuple(\n" +" elts=[\n" +" Name(id='a', ctx=Store()),\n" +" Name(id='b', ctx=Store())],\n" +" ctx=Store())],\n" +" value=Name(id='c', ctx=Load()))])" +msgstr "" +">>> print(ast.dump(ast.parse('a = b = 1'), indent=4)) # 多重赋值\n" +"Module(\n" +" body=[\n" +" Assign(\n" +" targets=[\n" +" Name(id='a', ctx=Store()),\n" +" Name(id='b', ctx=Store())],\n" +" value=Constant(value=1))])\n" +"\n" +">>> print(ast.dump(ast.parse('a,b = c'), indent=4)) # 解包\n" +"Module(\n" +" body=[\n" +" Assign(\n" +" targets=[\n" +" Tuple(\n" +" elts=[\n" +" Name(id='a', ctx=Store()),\n" +" Name(id='b', ctx=Store())],\n" +" ctx=Store())],\n" +" value=Name(id='c', ctx=Load()))])" + +#: ../../library/ast.rst:969 +msgid "" +"An assignment with a type annotation. ``target`` is a single node and can be" +" a :class:`Name`, an :class:`Attribute` or a :class:`Subscript`. " +"``annotation`` is the annotation, such as a :class:`Constant` or " +":class:`Name` node. ``value`` is a single optional node." +msgstr "" +"带有类型标注的赋值。``target`` 是单独的节点并可以是一个 :class:`Name`, :class:`Attribute` 或 " +":class:`Subscript`。``annotation`` 是标注,例如一个 :class:`Constant` 或 :class:`Name`" +" 节点。``value`` 是单独的可选节点。" + +#: ../../library/ast.rst:974 +msgid "" +"``simple`` is always either 0 (indicating a \"complex\" target) or 1 " +"(indicating a \"simple\" target). A \"simple\" target consists solely of a " +":class:`Name` node that does not appear between parentheses; all other " +"targets are considered complex. Only simple targets appear in the " +":attr:`~object.__annotations__` dictionary of modules and classes." +msgstr "" +"``simple`` 将始终为 0 (表示一个“复杂”目标) 或 1 (表示一个“简单”目标)。 “简单”目标仅由一个两边不带圆括号的 " +":class:`Name` 节点组成;所有其他目标均被视为复杂目标。 只有简单目标会出现在模块和类的 " +":attr:`~object.__annotations__` 字典中。" + +#: ../../library/ast.rst:980 +msgid "" +">>> print(ast.dump(ast.parse('c: int'), indent=4))\n" +"Module(\n" +" body=[\n" +" AnnAssign(\n" +" target=Name(id='c', ctx=Store()),\n" +" annotation=Name(id='int', ctx=Load()),\n" +" simple=1)])\n" +"\n" +">>> print(ast.dump(ast.parse('(a): int = 1'), indent=4)) # Annotation with parenthesis\n" +"Module(\n" +" body=[\n" +" AnnAssign(\n" +" target=Name(id='a', ctx=Store()),\n" +" annotation=Name(id='int', ctx=Load()),\n" +" value=Constant(value=1),\n" +" simple=0)])\n" +"\n" +">>> print(ast.dump(ast.parse('a.b: int'), indent=4)) # Attribute annotation\n" +"Module(\n" +" body=[\n" +" AnnAssign(\n" +" target=Attribute(\n" +" value=Name(id='a', ctx=Load()),\n" +" attr='b',\n" +" ctx=Store()),\n" +" annotation=Name(id='int', ctx=Load()),\n" +" simple=0)])\n" +"\n" +">>> print(ast.dump(ast.parse('a[1]: int'), indent=4)) # Subscript annotation\n" +"Module(\n" +" body=[\n" +" AnnAssign(\n" +" target=Subscript(\n" +" value=Name(id='a', ctx=Load()),\n" +" slice=Constant(value=1),\n" +" ctx=Store()),\n" +" annotation=Name(id='int', ctx=Load()),\n" +" simple=0)])" +msgstr "" +">>> print(ast.dump(ast.parse('c: int'), indent=4))\n" +"Module(\n" +" body=[\n" +" AnnAssign(\n" +" target=Name(id='c', ctx=Store()),\n" +" annotation=Name(id='int', ctx=Load()),\n" +" simple=1)])\n" +"\n" +">>> print(ast.dump(ast.parse('(a): int = 1'), indent=4)) # 带有圆括号的标注\n" +"Module(\n" +" body=[\n" +" AnnAssign(\n" +" target=Name(id='a', ctx=Store()),\n" +" annotation=Name(id='int', ctx=Load()),\n" +" value=Constant(value=1),\n" +" simple=0)])\n" +"\n" +">>> print(ast.dump(ast.parse('a.b: int'), indent=4)) # 属性标注\n" +"Module(\n" +" body=[\n" +" AnnAssign(\n" +" target=Attribute(\n" +" value=Name(id='a', ctx=Load()),\n" +" attr='b',\n" +" ctx=Store()),\n" +" annotation=Name(id='int', ctx=Load()),\n" +" simple=0)])\n" +"\n" +">>> print(ast.dump(ast.parse('a[1]: int'), indent=4)) # 下标标注\n" +"Module(\n" +" body=[\n" +" AnnAssign(\n" +" target=Subscript(\n" +" value=Name(id='a', ctx=Load()),\n" +" slice=Constant(value=1),\n" +" ctx=Store()),\n" +" annotation=Name(id='int', ctx=Load()),\n" +" simple=0)])" + +#: ../../library/ast.rst:1024 +msgid "" +"Augmented assignment, such as ``a += 1``. In the following example, " +"``target`` is a :class:`Name` node for ``x`` (with the :class:`Store` " +"context), ``op`` is :class:`Add`, and ``value`` is a :class:`Constant` with " +"value for 1." +msgstr "" +"增强赋值,如 ``a += 1``。在下面的例子中,``target`` 是一个针对 ``x`` (带有 :class:`Store` 上下文) 的 " +":class:`Name` 节点,``op`` 为 :class:`Add`,而 ``value`` 是一个值为 1 的 " +":class:`Constant`." + +#: ../../library/ast.rst:1029 +msgid "" +"The ``target`` attribute cannot be of class :class:`Tuple` or :class:`List`," +" unlike the targets of :class:`Assign`." +msgstr "" +"``target`` 属性不可以是 :class:`Tuple` 或 :class:`List` 类,这与 :class:`Assign` 的目标不同。" + +#: ../../library/ast.rst:1032 +msgid "" +">>> print(ast.dump(ast.parse('x += 2'), indent=4))\n" +"Module(\n" +" body=[\n" +" AugAssign(\n" +" target=Name(id='x', ctx=Store()),\n" +" op=Add(),\n" +" value=Constant(value=2))])" +msgstr "" +">>> print(ast.dump(ast.parse('x += 2'), indent=4))\n" +"Module(\n" +" body=[\n" +" AugAssign(\n" +" target=Name(id='x', ctx=Store()),\n" +" op=Add(),\n" +" value=Constant(value=2))])" + +#: ../../library/ast.rst:1045 +msgid "" +"A ``raise`` statement. ``exc`` is the exception object to be raised, " +"normally a :class:`Call` or :class:`Name`, or ``None`` for a standalone " +"``raise``. ``cause`` is the optional part for ``y`` in ``raise x from y``." +msgstr "" +"一条 ``raise`` 语句。``exc`` 是要引发的异常,对于一个单独的 ``raise`` 通常为 :class:`Call` 或 " +":class:`Name`,或者为 ``None``。``cause`` 是针对 ``raise x from y`` 中 ``y`` 的可选部分。" + +#: ../../library/ast.rst:1049 +msgid "" +">>> print(ast.dump(ast.parse('raise x from y'), indent=4))\n" +"Module(\n" +" body=[\n" +" Raise(\n" +" exc=Name(id='x', ctx=Load()),\n" +" cause=Name(id='y', ctx=Load()))])" +msgstr "" +">>> print(ast.dump(ast.parse('raise x from y'), indent=4))\n" +"Module(\n" +" body=[\n" +" Raise(\n" +" exc=Name(id='x', ctx=Load()),\n" +" cause=Name(id='y', ctx=Load()))])" + +#: ../../library/ast.rst:1061 +msgid "" +"An assertion. ``test`` holds the condition, such as a :class:`Compare` node." +" ``msg`` holds the failure message." +msgstr "一条断言。``test`` 保存条件,例如为一个 :class:`Compare` 节点。``msg`` 保存失败消息。" + +#: ../../library/ast.rst:1064 +msgid "" +">>> print(ast.dump(ast.parse('assert x,y'), indent=4))\n" +"Module(\n" +" body=[\n" +" Assert(\n" +" test=Name(id='x', ctx=Load()),\n" +" msg=Name(id='y', ctx=Load()))])" +msgstr "" +">>> print(ast.dump(ast.parse('assert x,y'), indent=4))\n" +"Module(\n" +" body=[\n" +" Assert(\n" +" test=Name(id='x', ctx=Load()),\n" +" msg=Name(id='y', ctx=Load()))])" + +#: ../../library/ast.rst:1076 +msgid "" +"Represents a ``del`` statement. ``targets`` is a list of nodes, such as " +":class:`Name`, :class:`Attribute` or :class:`Subscript` nodes." +msgstr "" +"代表一条 ``del`` 语句。``targets`` 是一个由节点组成的列表,例如 :class:`Name`, :class:`Attribute`" +" 或 :class:`Subscript` 节点。" + +#: ../../library/ast.rst:1079 +msgid "" +">>> print(ast.dump(ast.parse('del x,y,z'), indent=4))\n" +"Module(\n" +" body=[\n" +" Delete(\n" +" targets=[\n" +" Name(id='x', ctx=Del()),\n" +" Name(id='y', ctx=Del()),\n" +" Name(id='z', ctx=Del())])])" +msgstr "" +">>> print(ast.dump(ast.parse('del x,y,z'), indent=4))\n" +"Module(\n" +" body=[\n" +" Delete(\n" +" targets=[\n" +" Name(id='x', ctx=Del()),\n" +" Name(id='y', ctx=Del()),\n" +" Name(id='z', ctx=Del())])])" + +#: ../../library/ast.rst:1093 +msgid "A ``pass`` statement." +msgstr "一条 ``pass`` 语句。" + +#: ../../library/ast.rst:1095 +msgid "" +">>> print(ast.dump(ast.parse('pass'), indent=4))\n" +"Module(\n" +" body=[\n" +" Pass()])" +msgstr "" +">>> print(ast.dump(ast.parse('pass'), indent=4))\n" +"Module(\n" +" body=[\n" +" Pass()])" + +#: ../../library/ast.rst:1105 +msgid "" +"A :ref:`type alias ` created through the :keyword:`type` " +"statement. ``name`` is the name of the alias, ``type_params`` is a list of " +":ref:`type parameters `, and ``value`` is the value of the " +"type alias." +msgstr "" +"通过 :keyword:`type` 语句创建的 :ref:`类型别名 `。``name`` " +"是别名的名称,``type_params`` 是 :ref:`类型形参 ` 的列表,而 ``value`` " +"是类型别名的值。" + +#: ../../library/ast.rst:1110 +msgid "" +">>> print(ast.dump(ast.parse('type Alias = int'), indent=4))\n" +"Module(\n" +" body=[\n" +" TypeAlias(\n" +" name=Name(id='Alias', ctx=Store()),\n" +" value=Name(id='int', ctx=Load()))])" +msgstr "" +">>> print(ast.dump(ast.parse('type Alias = int'), indent=4))\n" +"Module(\n" +" body=[\n" +" TypeAlias(\n" +" name=Name(id='Alias', ctx=Store()),\n" +" value=Name(id='int', ctx=Load()))])" + +#: ../../library/ast.rst:1121 +msgid "" +"Other statements which are only applicable inside functions or loops are " +"described in other sections." +msgstr "其他仅在函数或循环内部可用的语句将在其他小节中描述。" + +#: ../../library/ast.rst:1125 +msgid "Imports" +msgstr "导入" + +#: ../../library/ast.rst:1129 +msgid "An import statement. ``names`` is a list of :class:`alias` nodes." +msgstr "一条导入语句。``names`` 是一个由 :class:`alias` 节点组成的列表。" + +#: ../../library/ast.rst:1131 +msgid "" +">>> print(ast.dump(ast.parse('import x,y,z'), indent=4))\n" +"Module(\n" +" body=[\n" +" Import(\n" +" names=[\n" +" alias(name='x'),\n" +" alias(name='y'),\n" +" alias(name='z')])])" +msgstr "" +">>> print(ast.dump(ast.parse('import x,y,z'), indent=4))\n" +"Module(\n" +" body=[\n" +" Import(\n" +" names=[\n" +" alias(name='x'),\n" +" alias(name='y'),\n" +" alias(name='z')])])" + +#: ../../library/ast.rst:1145 +msgid "" +"Represents ``from x import y``. ``module`` is a raw string of the 'from' " +"name, without any leading dots, or ``None`` for statements such as ``from . " +"import foo``. ``level`` is an integer holding the level of the relative " +"import (0 means absolute import)." +msgstr "" +"代表 ``from x import y``。``module`` 是一个 'from' 名称的原始字符串,不带任何前导点号,或者为 ``None`` " +"表示 ``from . import foo`` 这样的语句。``level`` 是一个保存相对导入层级的整数(0 表示绝对导入)。" + +#: ../../library/ast.rst:1150 +msgid "" +">>> print(ast.dump(ast.parse('from y import x,y,z'), indent=4))\n" +"Module(\n" +" body=[\n" +" ImportFrom(\n" +" module='y',\n" +" names=[\n" +" alias(name='x'),\n" +" alias(name='y'),\n" +" alias(name='z')],\n" +" level=0)])" +msgstr "" +">>> print(ast.dump(ast.parse('from y import x,y,z'), indent=4))\n" +"Module(\n" +" body=[\n" +" ImportFrom(\n" +" module='y',\n" +" names=[\n" +" alias(name='x'),\n" +" alias(name='y'),\n" +" alias(name='z')],\n" +" level=0)])" + +#: ../../library/ast.rst:1166 +msgid "" +"Both parameters are raw strings of the names. ``asname`` can be ``None`` if " +"the regular name is to be used." +msgstr "两个形参均为名称的原始字符串。如果要使用常规名称则 ``asname`` 可以为 ``None``。" + +#: ../../library/ast.rst:1169 +msgid "" +">>> print(ast.dump(ast.parse('from ..foo.bar import a as b, c'), indent=4))\n" +"Module(\n" +" body=[\n" +" ImportFrom(\n" +" module='foo.bar',\n" +" names=[\n" +" alias(name='a', asname='b'),\n" +" alias(name='c')],\n" +" level=2)])" +msgstr "" +">>> print(ast.dump(ast.parse('from ..foo.bar import a as b, c'), indent=4))\n" +"Module(\n" +" body=[\n" +" ImportFrom(\n" +" module='foo.bar',\n" +" names=[\n" +" alias(name='a', asname='b'),\n" +" alias(name='c')],\n" +" level=2)])" + +#: ../../library/ast.rst:1182 +msgid "Control flow" +msgstr "控制流" + +#: ../../library/ast.rst:1185 +msgid "" +"Optional clauses such as ``else`` are stored as an empty list if they're not" +" present." +msgstr "可选的子句如 ``else`` 如果不存在则会被存储为一个空列表。" + +#: ../../library/ast.rst:1190 +msgid "" +"An ``if`` statement. ``test`` holds a single node, such as a " +":class:`Compare` node. ``body`` and ``orelse`` each hold a list of nodes." +msgstr "" +"一条 ``if`` 语句。``test`` 保存一个单独节点,如一个 :class:`Compare` 节点。``body`` 和 ``orelse``" +" 各自保存一个节点列表。" + +#: ../../library/ast.rst:1193 +msgid "" +"``elif`` clauses don't have a special representation in the AST, but rather " +"appear as extra :class:`If` nodes within the ``orelse`` section of the " +"previous one." +msgstr "" +"``elif`` 子句在 AST 中没有特别的表示形式,而是作为上文介绍的 ``orelse`` 部分之内的一个额外 :class:`If` 节点出现。" + +#: ../../library/ast.rst:1197 +msgid "" +">>> print(ast.dump(ast.parse(\"\"\"\n" +"... if x:\n" +"... ...\n" +"... elif y:\n" +"... ...\n" +"... else:\n" +"... ...\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" If(\n" +" test=Name(id='x', ctx=Load()),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))],\n" +" orelse=[\n" +" If(\n" +" test=Name(id='y', ctx=Load()),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))],\n" +" orelse=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))])])])" +msgstr "" +">>> print(ast.dump(ast.parse(\"\"\"\n" +"... if x:\n" +"... ...\n" +"... elif y:\n" +"... ...\n" +"... else:\n" +"... ...\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" If(\n" +" test=Name(id='x', ctx=Load()),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))],\n" +" orelse=[\n" +" If(\n" +" test=Name(id='y', ctx=Load()),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))],\n" +" orelse=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))])])])" + +#: ../../library/ast.rst:1227 +msgid "" +"A ``for`` loop. ``target`` holds the variable(s) the loop assigns to, as a " +"single :class:`Name`, :class:`Tuple`, :class:`List`, :class:`Attribute` or " +":class:`Subscript` node. ``iter`` holds the item to be looped over, again as" +" a single node. ``body`` and ``orelse`` contain lists of nodes to execute. " +"Those in ``orelse`` are executed if the loop finishes normally, rather than " +"via a ``break`` statement." +msgstr "" +"一个 ``for`` 循环。``target`` 保存循环赋值的变量,是一个单独的 :class:`Name`, :class:`Tuple`, " +":class:`List`, :class:`Attribute` 或 :class:`Subscript` 节点。``iter`` " +"保存要被循环的条目,同样也是一个单独节点。``body`` 和 ``orelse`` 包含要执行的节点列表。``orelse`` " +"中的语句会在循环正常结束时被执行,而不是通过 ``break`` 语句执行。" + +#: ../../library/ast.rst:1238 +msgid "" +">>> print(ast.dump(ast.parse(\"\"\"\n" +"... for x in y:\n" +"... ...\n" +"... else:\n" +"... ...\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" For(\n" +" target=Name(id='x', ctx=Store()),\n" +" iter=Name(id='y', ctx=Load()),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))],\n" +" orelse=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))])])" +msgstr "" +">>> print(ast.dump(ast.parse(\"\"\"\n" +"... for x in y:\n" +"... ...\n" +"... else:\n" +"... ...\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" For(\n" +" target=Name(id='x', ctx=Store()),\n" +" iter=Name(id='y', ctx=Load()),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))],\n" +" orelse=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))])])" + +#: ../../library/ast.rst:1261 +msgid "" +"A ``while`` loop. ``test`` holds the condition, such as a :class:`Compare` " +"node." +msgstr "一个 ``while`` 循环。``test`` 保存条件,如一个 :class:`Compare` 节点。" + +#: ../../library/ast.rst:1264 +msgid "" +">>> print(ast.dump(ast.parse(\"\"\"\n" +"... while x:\n" +"... ...\n" +"... else:\n" +"... ...\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" While(\n" +" test=Name(id='x', ctx=Load()),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))],\n" +" orelse=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))])])" +msgstr "" +">>> print(ast.dump(ast.parse(\"\"\"\n" +"... while x:\n" +"... ...\n" +"... else:\n" +"... ...\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" While(\n" +" test=Name(id='x', ctx=Load()),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))],\n" +" orelse=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))])])" + +#: ../../library/ast.rst:1287 +msgid "The ``break`` and ``continue`` statements." +msgstr "``break`` 和 ``continue`` 语句。" + +#: ../../library/ast.rst:1289 +msgid "" +">>> print(ast.dump(ast.parse(\"\"\"\\\n" +"... for a in b:\n" +"... if a > 5:\n" +"... break\n" +"... else:\n" +"... continue\n" +"...\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" For(\n" +" target=Name(id='a', ctx=Store()),\n" +" iter=Name(id='b', ctx=Load()),\n" +" body=[\n" +" If(\n" +" test=Compare(\n" +" left=Name(id='a', ctx=Load()),\n" +" ops=[\n" +" Gt()],\n" +" comparators=[\n" +" Constant(value=5)]),\n" +" body=[\n" +" Break()],\n" +" orelse=[\n" +" Continue()])])])" +msgstr "" +">>> print(ast.dump(ast.parse(\"\"\"\\\n" +"... for a in b:\n" +"... if a > 5:\n" +"... break\n" +"... else:\n" +"... continue\n" +"...\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" For(\n" +" target=Name(id='a', ctx=Store()),\n" +" iter=Name(id='b', ctx=Load()),\n" +" body=[\n" +" If(\n" +" test=Compare(\n" +" left=Name(id='a', ctx=Load()),\n" +" ops=[\n" +" Gt()],\n" +" comparators=[\n" +" Constant(value=5)]),\n" +" body=[\n" +" Break()],\n" +" orelse=[\n" +" Continue()])])])" + +#: ../../library/ast.rst:1320 +msgid "" +"``try`` blocks. All attributes are list of nodes to execute, except for " +"``handlers``, which is a list of :class:`ExceptHandler` nodes." +msgstr "" +"``try`` 代码块。所有属性都是要执行的节点列表,除了 ``handlers``,它是一个 :class:`ExceptHandler` 节点列表。" + +#: ../../library/ast.rst:1323 +msgid "" +">>> print(ast.dump(ast.parse(\"\"\"\n" +"... try:\n" +"... ...\n" +"... except Exception:\n" +"... ...\n" +"... except OtherException as e:\n" +"... ...\n" +"... else:\n" +"... ...\n" +"... finally:\n" +"... ...\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" Try(\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))],\n" +" handlers=[\n" +" ExceptHandler(\n" +" type=Name(id='Exception', ctx=Load()),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))]),\n" +" ExceptHandler(\n" +" type=Name(id='OtherException', ctx=Load()),\n" +" name='e',\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))])],\n" +" orelse=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))],\n" +" finalbody=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))])])" +msgstr "" +">>> print(ast.dump(ast.parse(\"\"\"\n" +"... try:\n" +"... ...\n" +"... except Exception:\n" +"... ...\n" +"... except OtherException as e:\n" +"... ...\n" +"... else:\n" +"... ...\n" +"... finally:\n" +"... ...\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" Try(\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))],\n" +" handlers=[\n" +" ExceptHandler(\n" +" type=Name(id='Exception', ctx=Load()),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))]),\n" +" ExceptHandler(\n" +" type=Name(id='OtherException', ctx=Load()),\n" +" name='e',\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))])],\n" +" orelse=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))],\n" +" finalbody=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))])])" + +#: ../../library/ast.rst:1365 +msgid "" +"``try`` blocks which are followed by ``except*`` clauses. The attributes are" +" the same as for :class:`Try` but the :class:`ExceptHandler` nodes in " +"``handlers`` are interpreted as ``except*`` blocks rather than ``except``." +msgstr "" + +#: ../../library/ast.rst:1369 +msgid "" +">>> print(ast.dump(ast.parse(\"\"\"\n" +"... try:\n" +"... ...\n" +"... except* Exception:\n" +"... ...\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" TryStar(\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))],\n" +" handlers=[\n" +" ExceptHandler(\n" +" type=Name(id='Exception', ctx=Load()),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))])])])" +msgstr "" +">>> print(ast.dump(ast.parse(\"\"\"\n" +"... try:\n" +"... ...\n" +"... except* Exception:\n" +"... ...\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" TryStar(\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))],\n" +" handlers=[\n" +" ExceptHandler(\n" +" type=Name(id='Exception', ctx=Load()),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))])])])" + +#: ../../library/ast.rst:1394 +msgid "" +"A single ``except`` clause. ``type`` is the exception type it will match, " +"typically a :class:`Name` node (or ``None`` for a catch-all ``except:`` " +"clause). ``name`` is a raw string for the name to hold the exception, or " +"``None`` if the clause doesn't have ``as foo``. ``body`` is a list of nodes." +msgstr "" +"一个单独的 ``except`` 子句。``type`` 是它将匹配的异常,通常为一个 :class:`Name` 节点(或 ``None`` " +"表示捕获全部的 ``except:`` 子句)。``name`` 是一个用于存放异常的别名的原始字符串,或者如果子句没有 ``as foo`` 则为 " +"``None``。``body`` 为一个节点列表。" + +#: ../../library/ast.rst:1399 +msgid "" +">>> print(ast.dump(ast.parse(\"\"\"\\\n" +"... try:\n" +"... a + 1\n" +"... except TypeError:\n" +"... pass\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" Try(\n" +" body=[\n" +" Expr(\n" +" value=BinOp(\n" +" left=Name(id='a', ctx=Load()),\n" +" op=Add(),\n" +" right=Constant(value=1)))],\n" +" handlers=[\n" +" ExceptHandler(\n" +" type=Name(id='TypeError', ctx=Load()),\n" +" body=[\n" +" Pass()])])])" +msgstr "" +">>> print(ast.dump(ast.parse(\"\"\"\\\n" +"... try:\n" +"... a + 1\n" +"... except TypeError:\n" +"... pass\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" Try(\n" +" body=[\n" +" Expr(\n" +" value=BinOp(\n" +" left=Name(id='a', ctx=Load()),\n" +" op=Add(),\n" +" right=Constant(value=1)))],\n" +" handlers=[\n" +" ExceptHandler(\n" +" type=Name(id='TypeError', ctx=Load()),\n" +" body=[\n" +" Pass()])])])" + +#: ../../library/ast.rst:1425 +msgid "" +"A ``with`` block. ``items`` is a list of :class:`withitem` nodes " +"representing the context managers, and ``body`` is the indented block inside" +" the context." +msgstr "" +"一个 ``with`` 代码块。``items`` 是一个代表上下文管理器的 :class:`withitem` 节点列表,而 ``body`` " +"是该上下文中的缩进代码块。" + +#: ../../library/ast.rst:1435 +msgid "" +"A single context manager in a ``with`` block. ``context_expr`` is the " +"context manager, often a :class:`Call` node. ``optional_vars`` is a " +":class:`Name`, :class:`Tuple` or :class:`List` for the ``as foo`` part, or " +"``None`` if that isn't used." +msgstr "" +"一个 ``with`` 代码块中单独的上下文管理器。``context_expr`` 为上下文管理器,通常为一个 :class:`Call` 节点。 " +"``optional_vars`` 为一个针对 ``as foo`` 部分的 :class:`Name`, :class:`Tuple` 或 " +":class:`List`,或者如果未使用别名则为 ``None``。" + +#: ../../library/ast.rst:1440 +msgid "" +">>> print(ast.dump(ast.parse(\"\"\"\\\n" +"... with a as b, c as d:\n" +"... something(b, d)\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" With(\n" +" items=[\n" +" withitem(\n" +" context_expr=Name(id='a', ctx=Load()),\n" +" optional_vars=Name(id='b', ctx=Store())),\n" +" withitem(\n" +" context_expr=Name(id='c', ctx=Load()),\n" +" optional_vars=Name(id='d', ctx=Store()))],\n" +" body=[\n" +" Expr(\n" +" value=Call(\n" +" func=Name(id='something', ctx=Load()),\n" +" args=[\n" +" Name(id='b', ctx=Load()),\n" +" Name(id='d', ctx=Load())]))])])" +msgstr "" +">>> print(ast.dump(ast.parse(\"\"\"\\\n" +"... with a as b, c as d:\n" +"... something(b, d)\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" With(\n" +" items=[\n" +" withitem(\n" +" context_expr=Name(id='a', ctx=Load()),\n" +" optional_vars=Name(id='b', ctx=Store())),\n" +" withitem(\n" +" context_expr=Name(id='c', ctx=Load()),\n" +" optional_vars=Name(id='d', ctx=Store()))],\n" +" body=[\n" +" Expr(\n" +" value=Call(\n" +" func=Name(id='something', ctx=Load()),\n" +" args=[\n" +" Name(id='b', ctx=Load()),\n" +" Name(id='d', ctx=Load())]))])])" + +#: ../../library/ast.rst:1466 +msgid "Pattern matching" +msgstr "模式匹配" + +#: ../../library/ast.rst:1471 +msgid "" +"A ``match`` statement. ``subject`` holds the subject of the match (the " +"object that is being matched against the cases) and ``cases`` contains an " +"iterable of :class:`match_case` nodes with the different cases." +msgstr "" +"一条 ``match`` 语句。``subject`` 保存匹配的目标(与 cases 相匹配的对象)而 ``cases`` 包含一个由不同分支的 " +":class:`match_case` 节点组成的可迭代对象。" + +#: ../../library/ast.rst:1479 +msgid "" +"A single case pattern in a ``match`` statement. ``pattern`` contains the " +"match pattern that the subject will be matched against. Note that the " +":class:`AST` nodes produced for patterns differ from those produced for " +"expressions, even when they share the same syntax." +msgstr "" +"一个 ``match`` 语句中单独的 case 模式。``pattern`` 包含目标将要去匹配的匹配模式。请注意针对模式所产生的 " +":class:`AST` 节点不同于针对表达式所产生的节点,即使它们共享相同的语法。" + +#: ../../library/ast.rst:1484 +msgid "" +"The ``guard`` attribute contains an expression that will be evaluated if the" +" pattern matches the subject." +msgstr "``guard`` 属性包含一个当模式与目标相匹配时将被求值的表达式。" + +#: ../../library/ast.rst:1487 +msgid "" +"``body`` contains a list of nodes to execute if the pattern matches and the " +"result of evaluating the guard expression is true." +msgstr "``body`` 包含一个当模式匹配并且对 guard 表达式求值的结果为真时要执行的节点列表。" + +#: ../../library/ast.rst:1490 +msgid "" +">>> print(ast.dump(ast.parse(\"\"\"\n" +"... match x:\n" +"... case [x] if x>0:\n" +"... ...\n" +"... case tuple():\n" +"... ...\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" Match(\n" +" subject=Name(id='x', ctx=Load()),\n" +" cases=[\n" +" match_case(\n" +" pattern=MatchSequence(\n" +" patterns=[\n" +" MatchAs(name='x')]),\n" +" guard=Compare(\n" +" left=Name(id='x', ctx=Load()),\n" +" ops=[\n" +" Gt()],\n" +" comparators=[\n" +" Constant(value=0)]),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))]),\n" +" match_case(\n" +" pattern=MatchClass(\n" +" cls=Name(id='tuple', ctx=Load())),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))])])])" +msgstr "" +">>> print(ast.dump(ast.parse(\"\"\"\n" +"... match x:\n" +"... case [x] if x>0:\n" +"... ...\n" +"... case tuple():\n" +"... ...\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" Match(\n" +" subject=Name(id='x', ctx=Load()),\n" +" cases=[\n" +" match_case(\n" +" pattern=MatchSequence(\n" +" patterns=[\n" +" MatchAs(name='x')]),\n" +" guard=Compare(\n" +" left=Name(id='x', ctx=Load()),\n" +" ops=[\n" +" Gt()],\n" +" comparators=[\n" +" Constant(value=0)]),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))]),\n" +" match_case(\n" +" pattern=MatchClass(\n" +" cls=Name(id='tuple', ctx=Load())),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))])])])" + +#: ../../library/ast.rst:1528 +msgid "" +"A match literal or value pattern that compares by equality. ``value`` is an " +"expression node. Permitted value nodes are restricted as described in the " +"match statement documentation. This pattern succeeds if the match subject is" +" equal to the evaluated value." +msgstr "" +"一个按相等性进行比较的匹配字面值或值模式。``value`` 为一个表达式节点。允许的值节点被限制为 match 语句文档中所描述的节点。 " +"如果匹配目标等于 value 的求值结果则模式匹配成功。" + +#: ../../library/ast.rst:1533 +msgid "" +">>> print(ast.dump(ast.parse(\"\"\"\n" +"... match x:\n" +"... case \"Relevant\":\n" +"... ...\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" Match(\n" +" subject=Name(id='x', ctx=Load()),\n" +" cases=[\n" +" match_case(\n" +" pattern=MatchValue(\n" +" value=Constant(value='Relevant')),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))])])])" +msgstr "" +">>> print(ast.dump(ast.parse(\"\"\"\n" +"... match x:\n" +"... case \"Relevant\":\n" +"... ...\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" Match(\n" +" subject=Name(id='x', ctx=Load()),\n" +" cases=[\n" +" match_case(\n" +" pattern=MatchValue(\n" +" value=Constant(value='Relevant')),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))])])])" + +#: ../../library/ast.rst:1556 +msgid "" +"A match literal pattern that compares by identity. ``value`` is the " +"singleton to be compared against: ``None``, ``True``, or ``False``. This " +"pattern succeeds if the match subject is the given constant." +msgstr "" +"一个按标识号进行比较的匹配字面值模式。``value`` 为用于比较的单例对象: ``None``, ``True`` 或 ``False``。 " +"如果匹配目标为给定的常量则该模式匹配成功。" + +#: ../../library/ast.rst:1560 +msgid "" +">>> print(ast.dump(ast.parse(\"\"\"\n" +"... match x:\n" +"... case None:\n" +"... ...\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" Match(\n" +" subject=Name(id='x', ctx=Load()),\n" +" cases=[\n" +" match_case(\n" +" pattern=MatchSingleton(value=None),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))])])])" +msgstr "" +">>> print(ast.dump(ast.parse(\"\"\"\n" +"... match x:\n" +"... case None:\n" +"... ...\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" Match(\n" +" subject=Name(id='x', ctx=Load()),\n" +" cases=[\n" +" match_case(\n" +" pattern=MatchSingleton(value=None),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))])])])" + +#: ../../library/ast.rst:1582 +msgid "" +"A match sequence pattern. ``patterns`` contains the patterns to be matched " +"against the subject elements if the subject is a sequence. Matches a " +"variable length sequence if one of the subpatterns is a ``MatchStar`` node, " +"otherwise matches a fixed length sequence." +msgstr "" +"一个匹配序列模式。``patterns`` 包含当目标为一个序列时要与目标元素进行匹配的模式。如果某一子模式为 ``MatchStar`` " +"节点则将匹配一个变长度序列,否则将匹配一个固定长度序列。" + +#: ../../library/ast.rst:1587 +msgid "" +">>> print(ast.dump(ast.parse(\"\"\"\n" +"... match x:\n" +"... case [1, 2]:\n" +"... ...\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" Match(\n" +" subject=Name(id='x', ctx=Load()),\n" +" cases=[\n" +" match_case(\n" +" pattern=MatchSequence(\n" +" patterns=[\n" +" MatchValue(\n" +" value=Constant(value=1)),\n" +" MatchValue(\n" +" value=Constant(value=2))]),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))])])])" +msgstr "" +">>> print(ast.dump(ast.parse(\"\"\"\n" +"... match x:\n" +"... case [1, 2]:\n" +"... ...\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" Match(\n" +" subject=Name(id='x', ctx=Load()),\n" +" cases=[\n" +" match_case(\n" +" pattern=MatchSequence(\n" +" patterns=[\n" +" MatchValue(\n" +" value=Constant(value=1)),\n" +" MatchValue(\n" +" value=Constant(value=2))]),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))])])])" + +#: ../../library/ast.rst:1614 +msgid "" +"Matches the rest of the sequence in a variable length match sequence " +"pattern. If ``name`` is not ``None``, a list containing the remaining " +"sequence elements is bound to that name if the overall sequence pattern is " +"successful." +msgstr "" +"匹配一个可变长度匹配序列模式中的剩余部分序列。如果 ``name`` 不为 " +"``None``,则当整个序列模式匹配成功时将把一个包含剩余序列元素的列表绑定到该名称。" + +#: ../../library/ast.rst:1618 +msgid "" +">>> print(ast.dump(ast.parse(\"\"\"\n" +"... match x:\n" +"... case [1, 2, *rest]:\n" +"... ...\n" +"... case [*_]:\n" +"... ...\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" Match(\n" +" subject=Name(id='x', ctx=Load()),\n" +" cases=[\n" +" match_case(\n" +" pattern=MatchSequence(\n" +" patterns=[\n" +" MatchValue(\n" +" value=Constant(value=1)),\n" +" MatchValue(\n" +" value=Constant(value=2)),\n" +" MatchStar(name='rest')]),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))]),\n" +" match_case(\n" +" pattern=MatchSequence(\n" +" patterns=[\n" +" MatchStar()]),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))])])])" +msgstr "" +">>> print(ast.dump(ast.parse(\"\"\"\n" +"... match x:\n" +"... case [1, 2, *rest]:\n" +"... ...\n" +"... case [*_]:\n" +"... ...\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" Match(\n" +" subject=Name(id='x', ctx=Load()),\n" +" cases=[\n" +" match_case(\n" +" pattern=MatchSequence(\n" +" patterns=[\n" +" MatchValue(\n" +" value=Constant(value=1)),\n" +" MatchValue(\n" +" value=Constant(value=2)),\n" +" MatchStar(name='rest')]),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))]),\n" +" match_case(\n" +" pattern=MatchSequence(\n" +" patterns=[\n" +" MatchStar()]),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))])])])" + +#: ../../library/ast.rst:1655 +msgid "" +"A match mapping pattern. ``keys`` is a sequence of expression nodes. " +"``patterns`` is a corresponding sequence of pattern nodes. ``rest`` is an " +"optional name that can be specified to capture the remaining mapping " +"elements. Permitted key expressions are restricted as described in the match" +" statement documentation." +msgstr "" +"一个匹配的映射模式。``keys`` 为一个由表达式节点组成的序列。``patterns`` 为一个由对应的模式节点组成的序列。``rest`` " +"是一个可被指定用来捕获剩余映射元素的可选名称。允许的关键字表达式被限制为与 match 语句文档中所描述的一致。" + +#: ../../library/ast.rst:1661 +msgid "" +"This pattern succeeds if the subject is a mapping, all evaluated key " +"expressions are present in the mapping, and the value corresponding to each " +"key matches the corresponding subpattern. If ``rest`` is not ``None``, a " +"dict containing the remaining mapping elements is bound to that name if the " +"overall mapping pattern is successful." +msgstr "" +"如果目标为一个映射、所有被求值的表达式都存在于该映射中,并且对应于每个键的值都与对应的子模式相匹配则此模式匹配成功。如果 ``rest`` 不为 " +"``None``,则当整个映射模式匹配成功时会将一个包含剩余映射元素的字典绑定到该名称。" + +#: ../../library/ast.rst:1667 +msgid "" +">>> print(ast.dump(ast.parse(\"\"\"\n" +"... match x:\n" +"... case {1: _, 2: _}:\n" +"... ...\n" +"... case {**rest}:\n" +"... ...\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" Match(\n" +" subject=Name(id='x', ctx=Load()),\n" +" cases=[\n" +" match_case(\n" +" pattern=MatchMapping(\n" +" keys=[\n" +" Constant(value=1),\n" +" Constant(value=2)],\n" +" patterns=[\n" +" MatchAs(),\n" +" MatchAs()]),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))]),\n" +" match_case(\n" +" pattern=MatchMapping(rest='rest'),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))])])])" +msgstr "" +">>> print(ast.dump(ast.parse(\"\"\"\n" +"... match x:\n" +"... case {1: _, 2: _}:\n" +"... ...\n" +"... case {**rest}:\n" +"... ...\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" Match(\n" +" subject=Name(id='x', ctx=Load()),\n" +" cases=[\n" +" match_case(\n" +" pattern=MatchMapping(\n" +" keys=[\n" +" Constant(value=1),\n" +" Constant(value=2)],\n" +" patterns=[\n" +" MatchAs(),\n" +" MatchAs()]),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))]),\n" +" match_case(\n" +" pattern=MatchMapping(rest='rest'),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))])])])" + +#: ../../library/ast.rst:1702 +msgid "" +"A match class pattern. ``cls`` is an expression giving the nominal class to " +"be matched. ``patterns`` is a sequence of pattern nodes to be matched " +"against the class defined sequence of pattern matching attributes. " +"``kwd_attrs`` is a sequence of additional attributes to be matched " +"(specified as keyword arguments in the class pattern), ``kwd_patterns`` are " +"the corresponding patterns (specified as keyword values in the class " +"pattern)." +msgstr "" +"一个 match 类模式。``cls`` 为一个给出要匹配的名义类的表达式。``patterns`` " +"为一个由要与该类所定义的模式匹配属性相匹配的模式节点组成的序列。``kwd_attrs`` " +"为一个由要匹配的附加属性(指定为该类模式中的关键字参数)组成的序列,``kwd_patterns`` 为对应的模式(指定为该类模式中的关键字值)。" + +#: ../../library/ast.rst:1709 +msgid "" +"This pattern succeeds if the subject is an instance of the nominated class, " +"all positional patterns match the corresponding class-defined attributes, " +"and any specified keyword attributes match their corresponding pattern." +msgstr "如果目标为被指名类的一个实例、所有的位置模式都与对应的类定义属性相匹配,并且任何被指定的关键字属性都与其对应的模式相匹配则此模式匹配成功。" + +#: ../../library/ast.rst:1713 +msgid "" +"Note: classes may define a property that returns self in order to match a " +"pattern node against the instance being matched. Several builtin types are " +"also matched that way, as described in the match statement documentation." +msgstr "" +"注意:类可能会定义一个返回自身的特征属性以便能将一个模式节点与被匹配的实例相匹配。某些内置类型也是以这种方式来匹配的,与 match " +"语句文档中所描述的一致。" + +#: ../../library/ast.rst:1717 +msgid "" +">>> print(ast.dump(ast.parse(\"\"\"\n" +"... match x:\n" +"... case Point2D(0, 0):\n" +"... ...\n" +"... case Point3D(x=0, y=0, z=0):\n" +"... ...\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" Match(\n" +" subject=Name(id='x', ctx=Load()),\n" +" cases=[\n" +" match_case(\n" +" pattern=MatchClass(\n" +" cls=Name(id='Point2D', ctx=Load()),\n" +" patterns=[\n" +" MatchValue(\n" +" value=Constant(value=0)),\n" +" MatchValue(\n" +" value=Constant(value=0))]),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))]),\n" +" match_case(\n" +" pattern=MatchClass(\n" +" cls=Name(id='Point3D', ctx=Load()),\n" +" kwd_attrs=[\n" +" 'x',\n" +" 'y',\n" +" 'z'],\n" +" kwd_patterns=[\n" +" MatchValue(\n" +" value=Constant(value=0)),\n" +" MatchValue(\n" +" value=Constant(value=0)),\n" +" MatchValue(\n" +" value=Constant(value=0))]),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))])])])" +msgstr "" +">>> print(ast.dump(ast.parse(\"\"\"\n" +"... match x:\n" +"... case Point2D(0, 0):\n" +"... ...\n" +"... case Point3D(x=0, y=0, z=0):\n" +"... ...\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" Match(\n" +" subject=Name(id='x', ctx=Load()),\n" +" cases=[\n" +" match_case(\n" +" pattern=MatchClass(\n" +" cls=Name(id='Point2D', ctx=Load()),\n" +" patterns=[\n" +" MatchValue(\n" +" value=Constant(value=0)),\n" +" MatchValue(\n" +" value=Constant(value=0))]),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))]),\n" +" match_case(\n" +" pattern=MatchClass(\n" +" cls=Name(id='Point3D', ctx=Load()),\n" +" kwd_attrs=[\n" +" 'x',\n" +" 'y',\n" +" 'z'],\n" +" kwd_patterns=[\n" +" MatchValue(\n" +" value=Constant(value=0)),\n" +" MatchValue(\n" +" value=Constant(value=0)),\n" +" MatchValue(\n" +" value=Constant(value=0))]),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))])])])" + +#: ../../library/ast.rst:1764 +msgid "" +"A match \"as-pattern\", capture pattern or wildcard pattern. ``pattern`` " +"contains the match pattern that the subject will be matched against. If the " +"pattern is ``None``, the node represents a capture pattern (i.e a bare name)" +" and will always succeed." +msgstr "" +"一个匹配 \"as-模式\"、捕获模式或通配符模式。``pattern`` 包含将要与目标相匹配的匹配模式。如果模式为 " +"``None``,则该节点代表一个捕获模式(即一个简单的名称)并将总是会成功。" + +#: ../../library/ast.rst:1769 +msgid "" +"The ``name`` attribute contains the name that will be bound if the pattern " +"is successful. If ``name`` is ``None``, ``pattern`` must also be ``None`` " +"and the node represents the wildcard pattern." +msgstr "" +"``name`` 属性包含当模式匹配成功时将要绑定的名称。如果 ``name`` 为 ``None``,则 ``pattern`` 也必须为 " +"``None`` 并且该节点代表的是通配符模式。" + +#: ../../library/ast.rst:1773 +msgid "" +">>> print(ast.dump(ast.parse(\"\"\"\n" +"... match x:\n" +"... case [x] as y:\n" +"... ...\n" +"... case _:\n" +"... ...\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" Match(\n" +" subject=Name(id='x', ctx=Load()),\n" +" cases=[\n" +" match_case(\n" +" pattern=MatchAs(\n" +" pattern=MatchSequence(\n" +" patterns=[\n" +" MatchAs(name='x')]),\n" +" name='y'),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))]),\n" +" match_case(\n" +" pattern=MatchAs(),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))])])])" +msgstr "" +">>> print(ast.dump(ast.parse(\"\"\"\n" +"... match x:\n" +"... case [x] as y:\n" +"... ...\n" +"... case _:\n" +"... ...\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" Match(\n" +" subject=Name(id='x', ctx=Load()),\n" +" cases=[\n" +" match_case(\n" +" pattern=MatchAs(\n" +" pattern=MatchSequence(\n" +" patterns=[\n" +" MatchAs(name='x')]),\n" +" name='y'),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))]),\n" +" match_case(\n" +" pattern=MatchAs(),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))])])])" + +#: ../../library/ast.rst:1806 +msgid "" +"A match \"or-pattern\". An or-pattern matches each of its subpatterns in " +"turn to the subject, until one succeeds. The or-pattern is then deemed to " +"succeed. If none of the subpatterns succeed the or-pattern fails. The " +"``patterns`` attribute contains a list of match pattern nodes that will be " +"matched against the subject." +msgstr "" +"一个匹配 \"or-模式\"。or-模式会依次将其每个子模式与目标相匹配,直到有一个匹配成功。此时该 or-模式将被视为匹配成功。 " +"如果没有一个子模式匹配成功则该 or-模式匹配失败。``patterns`` 属性包含一个由将与目标相匹配的匹配模式节点组成的列表。" + +#: ../../library/ast.rst:1812 +msgid "" +">>> print(ast.dump(ast.parse(\"\"\"\n" +"... match x:\n" +"... case [x] | (y):\n" +"... ...\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" Match(\n" +" subject=Name(id='x', ctx=Load()),\n" +" cases=[\n" +" match_case(\n" +" pattern=MatchOr(\n" +" patterns=[\n" +" MatchSequence(\n" +" patterns=[\n" +" MatchAs(name='x')]),\n" +" MatchAs(name='y')]),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))])])])" +msgstr "" +">>> print(ast.dump(ast.parse(\"\"\"\n" +"... match x:\n" +"... case [x] | (y):\n" +"... ...\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" Match(\n" +" subject=Name(id='x', ctx=Load()),\n" +" cases=[\n" +" match_case(\n" +" pattern=MatchOr(\n" +" patterns=[\n" +" MatchSequence(\n" +" patterns=[\n" +" MatchAs(name='x')]),\n" +" MatchAs(name='y')]),\n" +" body=[\n" +" Expr(\n" +" value=Constant(value=Ellipsis))])])])" + +#: ../../library/ast.rst:1839 +msgid "Type annotations" +msgstr "类型标注" + +#: ../../library/ast.rst:1843 +msgid "" +"A ``# type: ignore`` comment located at *lineno*. *tag* is the optional tag " +"specified by the form ``# type: ignore ``." +msgstr "" +"位于 *lineno* 的 ``# type: ignore`` 注释。 *tag* 是通过 ``# type: ignore `` " +"形式指定的可选标签。" + +#: ../../library/ast.rst:1846 +msgid "" +">>> print(ast.dump(ast.parse('x = 1 # type: ignore', type_comments=True), indent=4))\n" +"Module(\n" +" body=[\n" +" Assign(\n" +" targets=[\n" +" Name(id='x', ctx=Store())],\n" +" value=Constant(value=1))],\n" +" type_ignores=[\n" +" TypeIgnore(lineno=1, tag='')])\n" +">>> print(ast.dump(ast.parse('x: bool = 1 # type: ignore[assignment]', type_comments=True), indent=4))\n" +"Module(\n" +" body=[\n" +" AnnAssign(\n" +" target=Name(id='x', ctx=Store()),\n" +" annotation=Name(id='bool', ctx=Load()),\n" +" value=Constant(value=1),\n" +" simple=1)],\n" +" type_ignores=[\n" +" TypeIgnore(lineno=1, tag='[assignment]')])" +msgstr "" +">>> print(ast.dump(ast.parse('x = 1 # type: ignore', type_comments=True), indent=4))\n" +"Module(\n" +" body=[\n" +" Assign(\n" +" targets=[\n" +" Name(id='x', ctx=Store())],\n" +" value=Constant(value=1))],\n" +" type_ignores=[\n" +" TypeIgnore(lineno=1, tag='')])\n" +">>> print(ast.dump(ast.parse('x: bool = 1 # type: ignore[assignment]', type_comments=True), indent=4))\n" +"Module(\n" +" body=[\n" +" AnnAssign(\n" +" target=Name(id='x', ctx=Store()),\n" +" annotation=Name(id='bool', ctx=Load()),\n" +" value=Constant(value=1),\n" +" simple=1)],\n" +" type_ignores=[\n" +" TypeIgnore(lineno=1, tag='[assignment]')])" + +#: ../../library/ast.rst:1869 +msgid "" +":class:`!TypeIgnore` nodes are not generated when the *type_comments* " +"parameter is set to ``False`` (default). See :func:`ast.parse` for more " +"details." +msgstr "" +"当 *type_comments* 形参被设为 ``False`` (默认值) 时将不会生成 :class:`!TypeIgnore` 节点。详情参见 " +":func:`ast.parse`." + +#: ../../library/ast.rst:1877 +msgid "Type parameters" +msgstr "类型形参" + +#: ../../library/ast.rst:1879 +msgid "" +":ref:`Type parameters ` can exist on classes, functions, and " +"type aliases." +msgstr ":ref:`类型形参 ` 可以存在于类、函数和类型别名中。" + +#: ../../library/ast.rst:1884 +msgid "" +"A :class:`typing.TypeVar`. ``name`` is the name of the type variable. " +"``bound`` is the bound or constraints, if any. If ``bound`` is a " +":class:`Tuple`, it represents constraints; otherwise it represents the " +"bound. ``default_value`` is the default value; if the :class:`!TypeVar` has " +"no default, this attribute will be set to ``None``." +msgstr "" +"一个 :class:`typing.TypeVar`。``name`` 是类型变量的名称。``bound`` 是边界或约束,如果有的话。如果 " +"``bound`` 是一个 :class:`Tuple`,则它是表示约束;否则它是表示边界。``default_value`` 是默认值;如果 " +":class:`!TypeVar` 没有默认值,该属性将被设为 ``None``。" + +#: ../../library/ast.rst:1890 +msgid "" +">>> print(ast.dump(ast.parse(\"type Alias[T: int = bool] = list[T]\"), indent=4))\n" +"Module(\n" +" body=[\n" +" TypeAlias(\n" +" name=Name(id='Alias', ctx=Store()),\n" +" type_params=[\n" +" TypeVar(\n" +" name='T',\n" +" bound=Name(id='int', ctx=Load()),\n" +" default_value=Name(id='bool', ctx=Load()))],\n" +" value=Subscript(\n" +" value=Name(id='list', ctx=Load()),\n" +" slice=Name(id='T', ctx=Load()),\n" +" ctx=Load()))])" +msgstr "" +">>> print(ast.dump(ast.parse(\"type Alias[T: int = bool] = list[T]\"), indent=4))\n" +"Module(\n" +" body=[\n" +" TypeAlias(\n" +" name=Name(id='Alias', ctx=Store()),\n" +" type_params=[\n" +" TypeVar(\n" +" name='T',\n" +" bound=Name(id='int', ctx=Load()),\n" +" default_value=Name(id='bool', ctx=Load()))],\n" +" value=Subscript(\n" +" value=Name(id='list', ctx=Load()),\n" +" slice=Name(id='T', ctx=Load()),\n" +" ctx=Load()))])" + +#: ../../library/ast.rst:1909 ../../library/ast.rst:1944 +#: ../../library/ast.rst:1976 +msgid "Added the *default_value* parameter." +msgstr "增加了 *default_value* 形参。" + +#: ../../library/ast.rst:1914 +msgid "" +"A :class:`typing.ParamSpec`. ``name`` is the name of the parameter " +"specification. ``default_value`` is the default value; if the " +":class:`!ParamSpec` has no default, this attribute will be set to ``None``." +msgstr "" +"一个 :class:`typing.ParamSpec`。``name`` 是形参规则说明的名称。``default_value`` 是默认值;如果 " +":class:`!ParamSpec` 没有默认值,该属性将被设为 ``None``。" + +#: ../../library/ast.rst:1918 +msgid "" +">>> print(ast.dump(ast.parse(\"type Alias[**P = [int, str]] = Callable[P, int]\"), indent=4))\n" +"Module(\n" +" body=[\n" +" TypeAlias(\n" +" name=Name(id='Alias', ctx=Store()),\n" +" type_params=[\n" +" ParamSpec(\n" +" name='P',\n" +" default_value=List(\n" +" elts=[\n" +" Name(id='int', ctx=Load()),\n" +" Name(id='str', ctx=Load())],\n" +" ctx=Load()))],\n" +" value=Subscript(\n" +" value=Name(id='Callable', ctx=Load()),\n" +" slice=Tuple(\n" +" elts=[\n" +" Name(id='P', ctx=Load()),\n" +" Name(id='int', ctx=Load())],\n" +" ctx=Load()),\n" +" ctx=Load()))])" +msgstr "" +">>> print(ast.dump(ast.parse(\"type Alias[**P = [int, str]] = Callable[P, int]\"), indent=4))\n" +"Module(\n" +" body=[\n" +" TypeAlias(\n" +" name=Name(id='Alias', ctx=Store()),\n" +" type_params=[\n" +" ParamSpec(\n" +" name='P',\n" +" default_value=List(\n" +" elts=[\n" +" Name(id='int', ctx=Load()),\n" +" Name(id='str', ctx=Load())],\n" +" ctx=Load()))],\n" +" value=Subscript(\n" +" value=Name(id='Callable', ctx=Load()),\n" +" slice=Tuple(\n" +" elts=[\n" +" Name(id='P', ctx=Load()),\n" +" Name(id='int', ctx=Load())],\n" +" ctx=Load()),\n" +" ctx=Load()))])" + +#: ../../library/ast.rst:1949 +msgid "" +"A :class:`typing.TypeVarTuple`. ``name`` is the name of the type variable " +"tuple. ``default_value`` is the default value; if the :class:`!TypeVarTuple`" +" has no default, this attribute will be set to ``None``." +msgstr "" +"一个 :class:`typing.TypeVarTuple`。``name`` 是类型变量元组的名称。``default_value`` " +"是默认值;如果 :class:`!TypeVarTuple` 没有默认值,该属性将被设为 ``None``。" + +#: ../../library/ast.rst:1953 +msgid "" +">>> print(ast.dump(ast.parse(\"type Alias[*Ts = ()] = tuple[*Ts]\"), indent=4))\n" +"Module(\n" +" body=[\n" +" TypeAlias(\n" +" name=Name(id='Alias', ctx=Store()),\n" +" type_params=[\n" +" TypeVarTuple(\n" +" name='Ts',\n" +" default_value=Tuple(ctx=Load()))],\n" +" value=Subscript(\n" +" value=Name(id='tuple', ctx=Load()),\n" +" slice=Tuple(\n" +" elts=[\n" +" Starred(\n" +" value=Name(id='Ts', ctx=Load()),\n" +" ctx=Load())],\n" +" ctx=Load()),\n" +" ctx=Load()))])" +msgstr "" +">>> print(ast.dump(ast.parse(\"type Alias[*Ts = ()] = tuple[*Ts]\"), indent=4))\n" +"Module(\n" +" body=[\n" +" TypeAlias(\n" +" name=Name(id='Alias', ctx=Store()),\n" +" type_params=[\n" +" TypeVarTuple(\n" +" name='Ts',\n" +" default_value=Tuple(ctx=Load()))],\n" +" value=Subscript(\n" +" value=Name(id='tuple', ctx=Load()),\n" +" slice=Tuple(\n" +" elts=[\n" +" Starred(\n" +" value=Name(id='Ts', ctx=Load()),\n" +" ctx=Load())],\n" +" ctx=Load()),\n" +" ctx=Load()))])" + +#: ../../library/ast.rst:1980 +msgid "Function and class definitions" +msgstr "函数与类定义" + +#: ../../library/ast.rst:1984 +msgid "A function definition." +msgstr "一个函数定义。" + +#: ../../library/ast.rst:1986 +msgid "``name`` is a raw string of the function name." +msgstr "``name`` 是函数名称的原始字符串。" + +#: ../../library/ast.rst:1987 +msgid "``args`` is an :class:`arguments` node." +msgstr "``args`` 是一个 :class:`arguments` 节点。" + +#: ../../library/ast.rst:1988 +msgid "``body`` is the list of nodes inside the function." +msgstr "``body`` 是函数内部的节点列表。" + +#: ../../library/ast.rst:1989 +msgid "" +"``decorator_list`` is the list of decorators to be applied, stored outermost" +" first (i.e. the first in the list will be applied last)." +msgstr "``decorator_list`` 是要应用的装饰器列表,最外层的最先保存(即列表中的第一项将最后被应用)。" + +#: ../../library/ast.rst:1991 +msgid "``returns`` is the return annotation." +msgstr "``returns`` 是返回标注。" + +#: ../../library/ast.rst:1992 ../../library/ast.rst:2155 +msgid "``type_params`` is a list of :ref:`type parameters `." +msgstr "``type_params`` 是一个 :ref:`类型形参 ` 的列表。" + +#: ../../library/ast.rst:1998 ../../library/ast.rst:2182 +#: ../../library/ast.rst:2193 +msgid "Added ``type_params``." +msgstr "增加了 ``type_params``。" + +#: ../../library/ast.rst:2004 +msgid "" +"``lambda`` is a minimal function definition that can be used inside an " +"expression. Unlike :class:`FunctionDef`, ``body`` holds a single node." +msgstr "" +"``lambda`` 是可在表达式内部使用的最小化函数定义。不同于 :class:`FunctionDef`,``body`` 是保存一个单独节点。" + +#: ../../library/ast.rst:2007 +msgid "" +">>> print(ast.dump(ast.parse('lambda x,y: ...'), indent=4))\n" +"Module(\n" +" body=[\n" +" Expr(\n" +" value=Lambda(\n" +" args=arguments(\n" +" args=[\n" +" arg(arg='x'),\n" +" arg(arg='y')]),\n" +" body=Constant(value=Ellipsis)))])" +msgstr "" +">>> print(ast.dump(ast.parse('lambda x,y: ...'), indent=4))\n" +"Module(\n" +" body=[\n" +" Expr(\n" +" value=Lambda(\n" +" args=arguments(\n" +" args=[\n" +" arg(arg='x'),\n" +" arg(arg='y')]),\n" +" body=Constant(value=Ellipsis)))])" + +#: ../../library/ast.rst:2023 +msgid "The arguments for a function." +msgstr "函数的参数。" + +#: ../../library/ast.rst:2025 +msgid "" +"``posonlyargs``, ``args`` and ``kwonlyargs`` are lists of :class:`arg` " +"nodes." +msgstr "``posonlyargs``, ``args`` 和 ``kwonlyargs`` 均为 :class:`arg` 节点的列表。" + +#: ../../library/ast.rst:2026 +msgid "" +"``vararg`` and ``kwarg`` are single :class:`arg` nodes, referring to the " +"``*args, **kwargs`` parameters." +msgstr "" +"``vararg`` 和 ``kwarg`` 均为单独的 :class:`arg` 节点,指向 ``*args, **kwargs`` 形参。" + +#: ../../library/ast.rst:2028 +msgid "" +"``kw_defaults`` is a list of default values for keyword-only arguments. If " +"one is ``None``, the corresponding argument is required." +msgstr "``kw_defaults`` 是一个由仅限关键字参数默认值组成的列表。如果有一个为 ``None``,则对应的参数为必须的参数。" + +#: ../../library/ast.rst:2030 +msgid "" +"``defaults`` is a list of default values for arguments that can be passed " +"positionally. If there are fewer defaults, they correspond to the last n " +"arguments." +msgstr "``defaults`` 是一个由可按位置传入的参数的默认值组成的列表。如果默认值个数少于参数个数,则它们将对应最后 n 个参数。" + +#: ../../library/ast.rst:2037 +msgid "" +"A single argument in a list. ``arg`` is a raw string of the argument name; " +"``annotation`` is its annotation, such as a :class:`Name` node." +msgstr "" +"列表中的一个单独参数。``arg`` 为参数名称原始字符串;``annotation`` 为其标注,如一个 :class:`Name` 节点。" + +#: ../../library/ast.rst:2042 +msgid "" +"``type_comment`` is an optional string with the type annotation as a comment" +msgstr "``type_comment`` 是一个可选的将注释用作类型标注的字符串。" + +#: ../../library/ast.rst:2044 +msgid "" +">>> print(ast.dump(ast.parse(\"\"\"\\\n" +"... @decorator1\n" +"... @decorator2\n" +"... def f(a: 'annotation', b=1, c=2, *d, e, f=3, **g) -> 'return annotation':\n" +"... pass\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" FunctionDef(\n" +" name='f',\n" +" args=arguments(\n" +" args=[\n" +" arg(\n" +" arg='a',\n" +" annotation=Constant(value='annotation')),\n" +" arg(arg='b'),\n" +" arg(arg='c')],\n" +" vararg=arg(arg='d'),\n" +" kwonlyargs=[\n" +" arg(arg='e'),\n" +" arg(arg='f')],\n" +" kw_defaults=[\n" +" None,\n" +" Constant(value=3)],\n" +" kwarg=arg(arg='g'),\n" +" defaults=[\n" +" Constant(value=1),\n" +" Constant(value=2)]),\n" +" body=[\n" +" Pass()],\n" +" decorator_list=[\n" +" Name(id='decorator1', ctx=Load()),\n" +" Name(id='decorator2', ctx=Load())],\n" +" returns=Constant(value='return annotation'))])" +msgstr "" +">>> print(ast.dump(ast.parse(\"\"\"\\\n" +"... @decorator1\n" +"... @decorator2\n" +"... def f(a: 'annotation', b=1, c=2, *d, e, f=3, **g) -> 'return annotation':\n" +"... pass\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" FunctionDef(\n" +" name='f',\n" +" args=arguments(\n" +" args=[\n" +" arg(\n" +" arg='a',\n" +" annotation=Constant(value='annotation')),\n" +" arg(arg='b'),\n" +" arg(arg='c')],\n" +" vararg=arg(arg='d'),\n" +" kwonlyargs=[\n" +" arg(arg='e'),\n" +" arg(arg='f')],\n" +" kw_defaults=[\n" +" None,\n" +" Constant(value=3)],\n" +" kwarg=arg(arg='g'),\n" +" defaults=[\n" +" Constant(value=1),\n" +" Constant(value=2)]),\n" +" body=[\n" +" Pass()],\n" +" decorator_list=[\n" +" Name(id='decorator1', ctx=Load()),\n" +" Name(id='decorator2', ctx=Load())],\n" +" returns=Constant(value='return annotation'))])" + +#: ../../library/ast.rst:2084 +msgid "A ``return`` statement." +msgstr "一条 ``return`` 语句。" + +#: ../../library/ast.rst:2086 +msgid "" +">>> print(ast.dump(ast.parse('return 4'), indent=4))\n" +"Module(\n" +" body=[\n" +" Return(\n" +" value=Constant(value=4))])" +msgstr "" +">>> print(ast.dump(ast.parse('return 4'), indent=4))\n" +"Module(\n" +" body=[\n" +" Return(\n" +" value=Constant(value=4))])" + +#: ../../library/ast.rst:2098 +msgid "" +"A ``yield`` or ``yield from`` expression. Because these are expressions, " +"they must be wrapped in an :class:`Expr` node if the value sent back is not " +"used." +msgstr "" +"一个 ``yield`` 或 ``yield from`` 表达式。因为这些属于表达式,所以如果发回的值未被使用则必须将它们包装在 " +":class:`Expr` 节点中。" + +#: ../../library/ast.rst:2101 +msgid "" +">>> print(ast.dump(ast.parse('yield x'), indent=4))\n" +"Module(\n" +" body=[\n" +" Expr(\n" +" value=Yield(\n" +" value=Name(id='x', ctx=Load())))])\n" +"\n" +">>> print(ast.dump(ast.parse('yield from x'), indent=4))\n" +"Module(\n" +" body=[\n" +" Expr(\n" +" value=YieldFrom(\n" +" value=Name(id='x', ctx=Load())))])" +msgstr "" +">>> print(ast.dump(ast.parse('yield x'), indent=4))\n" +"Module(\n" +" body=[\n" +" Expr(\n" +" value=Yield(\n" +" value=Name(id='x', ctx=Load())))])\n" +"\n" +">>> print(ast.dump(ast.parse('yield from x'), indent=4))\n" +"Module(\n" +" body=[\n" +" Expr(\n" +" value=YieldFrom(\n" +" value=Name(id='x', ctx=Load())))])" + +#: ../../library/ast.rst:2121 +msgid "" +"``global`` and ``nonlocal`` statements. ``names`` is a list of raw strings." +msgstr "``global`` 和 ``nonlocal`` 语句。``names`` 为一个由原始字符串组成的列表。" + +#: ../../library/ast.rst:2123 +msgid "" +">>> print(ast.dump(ast.parse('global x,y,z'), indent=4))\n" +"Module(\n" +" body=[\n" +" Global(\n" +" names=[\n" +" 'x',\n" +" 'y',\n" +" 'z'])])\n" +"\n" +">>> print(ast.dump(ast.parse('nonlocal x,y,z'), indent=4))\n" +"Module(\n" +" body=[\n" +" Nonlocal(\n" +" names=[\n" +" 'x',\n" +" 'y',\n" +" 'z'])])" +msgstr "" +">>> print(ast.dump(ast.parse('global x,y,z'), indent=4))\n" +"Module(\n" +" body=[\n" +" Global(\n" +" names=[\n" +" 'x',\n" +" 'y',\n" +" 'z'])])\n" +"\n" +">>> print(ast.dump(ast.parse('nonlocal x,y,z'), indent=4))\n" +"Module(\n" +" body=[\n" +" Nonlocal(\n" +" names=[\n" +" 'x',\n" +" 'y',\n" +" 'z'])])" + +#: ../../library/ast.rst:2146 +msgid "A class definition." +msgstr "一个类定义。" + +#: ../../library/ast.rst:2148 +msgid "``name`` is a raw string for the class name" +msgstr "``name`` 为类名称的原始字符串。" + +#: ../../library/ast.rst:2149 +msgid "``bases`` is a list of nodes for explicitly specified base classes." +msgstr "``bases`` 为一个由显式指明的基类节点组成的列表。" + +#: ../../library/ast.rst:2150 +msgid "" +"``keywords`` is a list of :class:`.keyword` nodes, principally for " +"'metaclass'. Other keywords will be passed to the metaclass, as per " +":pep:`3115`." +msgstr "" +"``keywords`` 是一个 :class:`.keyword` 节点的列表,主要用于‘元类’。其他关键字将被传给相应的元类,参见 " +":pep:`3115`." + +#: ../../library/ast.rst:2152 +msgid "" +"``body`` is a list of nodes representing the code within the class " +"definition." +msgstr "``body`` 是一个由代表类定义内部代码的节点组成的列表。" + +#: ../../library/ast.rst:2154 +msgid "``decorator_list`` is a list of nodes, as in :class:`FunctionDef`." +msgstr "``decorator_list`` 是一个节点的列表,与 :class:`FunctionDef` 中的一致。" + +#: ../../library/ast.rst:2157 +msgid "" +">>> print(ast.dump(ast.parse(\"\"\"\\\n" +"... @decorator1\n" +"... @decorator2\n" +"... class Foo(base1, base2, metaclass=meta):\n" +"... pass\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" ClassDef(\n" +" name='Foo',\n" +" bases=[\n" +" Name(id='base1', ctx=Load()),\n" +" Name(id='base2', ctx=Load())],\n" +" keywords=[\n" +" keyword(\n" +" arg='metaclass',\n" +" value=Name(id='meta', ctx=Load()))],\n" +" body=[\n" +" Pass()],\n" +" decorator_list=[\n" +" Name(id='decorator1', ctx=Load()),\n" +" Name(id='decorator2', ctx=Load())])])" +msgstr "" +">>> print(ast.dump(ast.parse(\"\"\"\\\n" +"... @decorator1\n" +"... @decorator2\n" +"... class Foo(base1, base2, metaclass=meta):\n" +"... pass\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" ClassDef(\n" +" name='Foo',\n" +" bases=[\n" +" Name(id='base1', ctx=Load()),\n" +" Name(id='base2', ctx=Load())],\n" +" keywords=[\n" +" keyword(\n" +" arg='metaclass',\n" +" value=Name(id='meta', ctx=Load()))],\n" +" body=[\n" +" Pass()],\n" +" decorator_list=[\n" +" Name(id='decorator1', ctx=Load()),\n" +" Name(id='decorator2', ctx=Load())])])" + +#: ../../library/ast.rst:2186 +msgid "Async and await" +msgstr "async 与 await" + +#: ../../library/ast.rst:2190 +msgid "" +"An ``async def`` function definition. Has the same fields as " +":class:`FunctionDef`." +msgstr "一个 ``async def`` 函数定义。具有与 :class:`FunctionDef` 相同的字段。" + +#: ../../library/ast.rst:2199 +msgid "" +"An ``await`` expression. ``value`` is what it waits for. Only valid in the " +"body of an :class:`AsyncFunctionDef`." +msgstr "" +"一个 ``await`` 表达式。``value`` 是它所等待的值。仅在 :class:`AsyncFunctionDef` 的函数体内可用。" + +#: ../../library/ast.rst:2202 +msgid "" +">>> print(ast.dump(ast.parse(\"\"\"\\\n" +"... async def f():\n" +"... await other_func()\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" AsyncFunctionDef(\n" +" name='f',\n" +" args=arguments(),\n" +" body=[\n" +" Expr(\n" +" value=Await(\n" +" value=Call(\n" +" func=Name(id='other_func', ctx=Load()))))])])" +msgstr "" +">>> print(ast.dump(ast.parse(\"\"\"\\\n" +"... async def f():\n" +"... await other_func()\n" +"... \"\"\"), indent=4))\n" +"Module(\n" +" body=[\n" +" AsyncFunctionDef(\n" +" name='f',\n" +" args=arguments(),\n" +" body=[\n" +" Expr(\n" +" value=Await(\n" +" value=Call(\n" +" func=Name(id='other_func', ctx=Load()))))])])" + +#: ../../library/ast.rst:2223 +msgid "" +"``async for`` loops and ``async with`` context managers. They have the same " +"fields as :class:`For` and :class:`With`, respectively. Only valid in the " +"body of an :class:`AsyncFunctionDef`." +msgstr "" +"``async for`` 循环和 ``async with`` 上下文管理器。它们分别具有与 :class:`For` 和 :class:`With`" +" 相同的字段。仅在 :class:`AsyncFunctionDef` 的函数体内可用。" + +#: ../../library/ast.rst:2228 +msgid "" +"When a string is parsed by :func:`ast.parse`, operator nodes (subclasses of " +":class:`ast.operator`, :class:`ast.unaryop`, :class:`ast.cmpop`, " +":class:`ast.boolop` and :class:`ast.expr_context`) on the returned tree will" +" be singletons. Changes to one will be reflected in all other occurrences of" +" the same value (for example, :class:`ast.Add`)." +msgstr "" +"当一个字符串由 :func:`ast.parse` 来解析时,所返回的树中的运算符节点 (为 :class:`ast.operator`, " +":class:`ast.unaryop`, :class:`ast.cmpop`, :class:`ast.boolop` 和 " +":class:`ast.expr_context` 的子类) 将均为单例对象。对其中某一个 (例如 :class:`ast.Add`) " +"的修改将反映到同一个值所出现的其他位置上。" + +#: ../../library/ast.rst:2236 +msgid ":mod:`!ast` helpers" +msgstr ":mod:`!ast` 辅助函数" + +#: ../../library/ast.rst:2238 +msgid "" +"Apart from the node classes, the :mod:`!ast` module defines these utility " +"functions and classes for traversing abstract syntax trees:" +msgstr "" + +#: ../../library/ast.rst:2243 +msgid "" +"Parse the source into an AST node. Equivalent to ``compile(source, " +"filename, mode, flags=FLAGS_VALUE, optimize=optimize)``, where " +"``FLAGS_VALUE`` is ``ast.PyCF_ONLY_AST`` if ``optimize <= 0`` and " +"``ast.PyCF_OPTIMIZED_AST`` otherwise." +msgstr "" +"将 source 解析为一个 AST 节点。等价于 ``compile(source, filename, mode, " +"flags=FLAGS_VALUE, optimize=optimize)``,其中当 ``optimize <= 0`` 时 " +"``FLAGS_VALUE`` 为 ``ast.PyCF_ONLY_AST`` 否则为 ``ast.PyCF_OPTIMIZED_AST``。" + +#: ../../library/ast.rst:2248 +msgid "" +"If ``type_comments=True`` is given, the parser is modified to check and " +"return type comments as specified by :pep:`484` and :pep:`526`. This is " +"equivalent to adding :data:`ast.PyCF_TYPE_COMMENTS` to the flags passed to " +":func:`compile`. This will report syntax errors for misplaced type " +"comments. Without this flag, type comments will be ignored, and the " +"``type_comment`` field on selected AST nodes will always be ``None``. In " +"addition, the locations of ``# type: ignore`` comments will be returned as " +"the ``type_ignores`` attribute of :class:`Module` (otherwise it is always an" +" empty list)." +msgstr "" +"如果给出 ``type_comments=True``,解析器会被修改只检查并返回 :pep:`484` 和 :pep:`526` 所规定的类型注释。 " +"这相当于将 :data:`ast.PyCF_TYPE_COMMENTS` 添加到传给 :func:`compile` 的旗标中。 " +"这将报告针对未正确放置类型注释的语法错误。没有这个旗标,类型注释将被忽略,而选定的 AST 节点上的 ``type_comment`` 字段将始终为 " +"``None``。此外,``# type: ignore`` 注释的位置将作为 :class:`Module` 的 ``type_ignores`` " +"属性被返回(在其他情况下则总是为空列表)。" + +#: ../../library/ast.rst:2258 +msgid "" +"In addition, if ``mode`` is ``'func_type'``, the input syntax is modified to" +" correspond to :pep:`484` \"signature type comments\", e.g. ``(str, int) -> " +"List[str]``." +msgstr "" +"并且,如果 ``mode`` 为 ``'func_type'``,则输入语法会进行与 :pep:`484` \"签名类型注释\" 对应的修改,例如 " +"``(str, int) -> List[str]``." + +#: ../../library/ast.rst:2262 +msgid "" +"Setting ``feature_version`` to a tuple ``(major, minor)`` will result in a " +"\"best-effort\" attempt to parse using that Python version's grammar. For " +"example, setting ``feature_version=(3, 9)`` will attempt to disallow parsing" +" of :keyword:`match` statements. Currently ``major`` must equal to ``3``. " +"The lowest supported version is ``(3, 7)`` (and this may increase in future " +"Python versions); the highest is ``sys.version_info[0:2]``. \"Best-effort\" " +"attempt means there is no guarantee that the parse (or success of the parse)" +" is the same as when run on the Python version corresponding to " +"``feature_version``." +msgstr "" +"将 ``feature_version`` 设为元组 ``(major, minor)`` 将导致使用相应 Python 版本的语法来“尽力”尝试解析。" +" 例如,设置 ``feature_version=(3, 9)`` 将尝试禁止解析 :keyword:`match` 语句。目前 ``major`` " +"必须等于 ``3``。最低的受支持版本为 ``(3, 7)`` (并且这可能在未来的 Python 版本中增高);最高版本为 " +"``sys.version_info[0:2]``。 “尽力”尝试意味着不能保证解析(或解析成功)与在对应于 ``feature_version`` 的" +" Python 版本上运行时相同。" + +#: ../../library/ast.rst:2272 +msgid "" +"If source contains a null character (``\\0``), :exc:`ValueError` is raised." +msgstr "如果源包含一个空字符 (``\\0``),则会引发 :exc:`ValueError`。" + +#: ../../library/ast.rst:2275 +msgid "" +"Note that successfully parsing source code into an AST object doesn't " +"guarantee that the source code provided is valid Python code that can be " +"executed as the compilation step can raise further :exc:`SyntaxError` " +"exceptions. For instance, the source ``return 42`` generates a valid AST " +"node for a return statement, but it cannot be compiled alone (it needs to be" +" inside a function node)." +msgstr "" +"请注意成功将源代码解析为 AST 对象并不能保证该源代码提供了可被执行的有效 Python 代码,因为编译步骤还可能引发其他的 " +":exc:`SyntaxError` 异常。例如,对于源代码 ``return 42`` 可以生成一条有效的 return 语句 AST " +"节点,但它不能被单独编译(它必须位于一个函数节点之内)。" + +#: ../../library/ast.rst:2282 +msgid "" +"In particular, :func:`ast.parse` won't do any scoping checks, which the " +"compilation step does." +msgstr "特别地,:func:`ast.parse` 不会执行任何作用域检查,这是由编译步骤来做的。" + +#: ../../library/ast.rst:2286 +msgid "" +"It is possible to crash the Python interpreter with a sufficiently " +"large/complex string due to stack depth limitations in Python's AST " +"compiler." +msgstr "足够复杂或是巨大的字符串可能导致 Python 解释器的崩溃,因为 Python 的 AST 编译器是有栈深限制的。" + +#: ../../library/ast.rst:2290 +msgid "Added ``type_comments``, ``mode='func_type'`` and ``feature_version``." +msgstr "增加了 ``type_comments``, ``mode='func_type'`` 和 ``feature_version``。" + +#: ../../library/ast.rst:2293 +msgid "" +"The minimum supported version for ``feature_version`` is now ``(3, 7)``. The" +" ``optimize`` argument was added." +msgstr "现在最低的支持 ``feature_version`` 的版本为 ``(3, 7)``。增加了 ``optimize`` 参数。" + +#: ../../library/ast.rst:2300 +msgid "" +"Unparse an :class:`ast.AST` object and generate a string with code that " +"would produce an equivalent :class:`ast.AST` object if parsed back with " +":func:`ast.parse`." +msgstr "" +"反向解析一个 :class:`ast.AST` 对象并生成一个包含当再次使用 :func:`ast.parse` 解析时将产生同样的 " +":class:`ast.AST` 对象的代码的字符串。" + +#: ../../library/ast.rst:2305 +msgid "" +"The produced code string will not necessarily be equal to the original code " +"that generated the :class:`ast.AST` object (without any compiler " +"optimizations, such as constant tuples/frozensets)." +msgstr "" +"所产生的代码字符串将不一定与生成 :class:`ast.AST` 对象的原始代码完全一致(不带任何编译器优化,例如常量元组/冻结集合等)。" + +#: ../../library/ast.rst:2310 +msgid "" +"Trying to unparse a highly complex expression would result with " +":exc:`RecursionError`." +msgstr "尝试反向解析一个高度复杂的表达式可能会导致 :exc:`RecursionError`。" + +#: ../../library/ast.rst:2318 +msgid "" +"Evaluate an expression node or a string containing only a Python literal or " +"container display. The string or node provided may only consist of the " +"following Python literal structures: strings, bytes, numbers, tuples, lists," +" dicts, sets, booleans, ``None`` and ``Ellipsis``." +msgstr "" +"对表达式节点或仅包含 Python 字面值或容器表示形式的字符串进行求值。所提供的字符串或节点可能只包含下列 Python " +"字面值结构:字符串、字节串、数字、元组、列表、字典、集合、布尔值、``None`` 和 ``Ellipsis``。" + +#: ../../library/ast.rst:2323 +msgid "" +"This can be used for evaluating strings containing Python values without the" +" need to parse the values oneself. It is not capable of evaluating " +"arbitrarily complex expressions, for example involving operators or " +"indexing." +msgstr "" +"这可被用于对包含 Python 值的字符串进行求值而不必解析这些值本身。它不能对任意的复杂表达式进行求值,例如涉及运算符或索引操作的表达式。" + +#: ../../library/ast.rst:2328 +msgid "" +"This function had been documented as \"safe\" in the past without defining " +"what that meant. That was misleading. This is specifically designed not to " +"execute Python code, unlike the more general :func:`eval`. There is no " +"namespace, no name lookups, or ability to call out. But it is not free from " +"attack: A relatively small input can lead to memory exhaustion or to C stack" +" exhaustion, crashing the process. There is also the possibility for " +"excessive CPU consumption denial of service on some inputs. Calling it on " +"untrusted data is thus not recommended." +msgstr "" +"此函数过去曾被描述为“安全”但并未定义其含义。这是存在误导性的。此函数被专门设计为不执行 Python 代码,这与更通用的 :func:`eval` " +"不同。它没有命名空间、没有名称查找或执行外部调用的能力。但是它并不能完全避免攻击:一个相对较小的输入有可能导致内存耗尽或 C " +"栈耗尽,使得进程崩溃。还可能在某些输入上出现过度消耗 CPU 的拒绝服务问题。因此不建议在未被信任的数据上调用它。" + +#: ../../library/ast.rst:2338 +msgid "" +"It is possible to crash the Python interpreter due to stack depth " +"limitations in Python's AST compiler." +msgstr "有可能由于 Python 的 AST 编译器中的栈深度限制而导致 Python 解释器的崩溃。" + +#: ../../library/ast.rst:2341 +msgid "" +"It can raise :exc:`ValueError`, :exc:`TypeError`, :exc:`SyntaxError`, " +":exc:`MemoryError` and :exc:`RecursionError` depending on the malformed " +"input." +msgstr "" +"根据输入错误的具体形式它可能引发 :exc:`ValueError`, :exc:`TypeError`, :exc:`SyntaxError`, " +":exc:`MemoryError` 以及 :exc:`RecursionError`。" + +#: ../../library/ast.rst:2345 +msgid "Now allows bytes and set literals." +msgstr "目前支持字节和集合。" + +#: ../../library/ast.rst:2348 +msgid "Now supports creating empty sets with ``'set()'``." +msgstr "现在支持通过 ``'set()'`` 创建空集合。" + +#: ../../library/ast.rst:2351 +msgid "For string inputs, leading spaces and tabs are now stripped." +msgstr "对于字符串输入,打头的空格和制表符现在会被去除。" + +#: ../../library/ast.rst:2357 +msgid "" +"Return the docstring of the given *node* (which must be a " +":class:`FunctionDef`, :class:`AsyncFunctionDef`, :class:`ClassDef`, or " +":class:`Module` node), or ``None`` if it has no docstring. If *clean* is " +"true, clean up the docstring's indentation with :func:`inspect.cleandoc`." +msgstr "" +"返回给定 *node* (必须为 :class:`FunctionDef`, :class:`AsyncFunctionDef`, " +":class:`ClassDef` 或 :class:`Module` 节点) 的文档字符串,或者如果没有文档字符串则返回 ``None``。如果 " +"*clean* 为真值,则通过 :func:`inspect.cleandoc` 清除文档字符串的缩进。" + +#: ../../library/ast.rst:2363 +msgid ":class:`AsyncFunctionDef` is now supported." +msgstr "目前支持 :class:`AsyncFunctionDef`" + +#: ../../library/ast.rst:2369 +msgid "" +"Get source code segment of the *source* that generated *node*. If some " +"location information (:attr:`~ast.AST.lineno`, :attr:`~ast.AST.end_lineno`, " +":attr:`~ast.AST.col_offset`, or :attr:`~ast.AST.end_col_offset`) is missing," +" return ``None``." +msgstr "" +"获取生成 *node* 的 *source* 的源代码段。如果丢失了某些位置信息 (:attr:`~ast.AST.lineno`, " +":attr:`~ast.AST.end_lineno`, :attr:`~ast.AST.col_offset` 或 " +":attr:`~ast.AST.end_col_offset`),则返回 ``None``。" + +#: ../../library/ast.rst:2373 +msgid "" +"If *padded* is ``True``, the first line of a multi-line statement will be " +"padded with spaces to match its original position." +msgstr "如果 *padded* 为 ``True``,则多行语句的第一行将以与其初始位置相匹配的空格填充。" + +#: ../../library/ast.rst:2381 +msgid "" +"When you compile a node tree with :func:`compile`, the compiler expects " +":attr:`~ast.AST.lineno` and :attr:`~ast.AST.col_offset` attributes for every" +" node that supports them. This is rather tedious to fill in for generated " +"nodes, so this helper adds these attributes recursively where not already " +"set, by setting them to the values of the parent node. It works recursively" +" starting at *node*." +msgstr "" +"当你使用 :func:`compile` 来编译节点树时,编译器会接受每个支持 :attr:`~ast.AST.lineno` 和 " +":attr:`~ast.AST.col_offset` 属性的节点的相应信息。 " +"对于已生成的节点来说这是相当繁琐的,因此这个辅助工具会递归地为尚未设置这些属性的节点添加它们,具体做法是将其设为父节点的对应值。它将从 *node* " +"开始递归地执行。" + +#: ../../library/ast.rst:2390 +msgid "" +"Increment the line number and end line number of each node in the tree " +"starting at *node* by *n*. This is useful to \"move code\" to a different " +"location in a file." +msgstr "从 *node* 开始按 *n* 递增节点树中每个节点的行号和结束行号。这在“移动代码”到文件中的不同位置时很有用处。" + +#: ../../library/ast.rst:2397 +msgid "" +"Copy source location (:attr:`~ast.AST.lineno`, :attr:`~ast.AST.col_offset`, " +":attr:`~ast.AST.end_lineno`, and :attr:`~ast.AST.end_col_offset`) from " +"*old_node* to *new_node* if possible, and return *new_node*." +msgstr "" +"在可能的情况下将源位置 (:attr:`~ast.AST.lineno`, :attr:`~ast.AST.col_offset`, " +":attr:`~ast.AST.end_lineno` 和 :attr:`~ast.AST.end_col_offset`) 从 *old_node* " +"拷贝到 *new_node*,并返回 *new_node*。" + +#: ../../library/ast.rst:2404 +msgid "" +"Yield a tuple of ``(fieldname, value)`` for each field in ``node._fields`` " +"that is present on *node*." +msgstr "" +"针对于 *node* 上在 ``node._fields`` 中出现的每个字段产生一个 ``(fieldname, value)`` 元组。" + +#: ../../library/ast.rst:2410 +msgid "" +"Yield all direct child nodes of *node*, that is, all fields that are nodes " +"and all items of fields that are lists of nodes." +msgstr "产生 *node* 所有的直接子节点,也就是说,所有为节点的字段和所有为节点列表的字段条目。" + +#: ../../library/ast.rst:2416 +msgid "" +"Recursively yield all descendant nodes in the tree starting at *node* " +"(including *node* itself), in no specified order. This is useful if you " +"only want to modify nodes in place and don't care about the context." +msgstr "" +"递归地产生节点树中从 *node* 开始(包括 *node* 本身)的所有下级节点,没有确定的排序方式。 " +"这在你仅想要原地修改节点而不关心具体上下文时很有用处。" + +#: ../../library/ast.rst:2423 +msgid "" +"A node visitor base class that walks the abstract syntax tree and calls a " +"visitor function for every node found. This function may return a value " +"which is forwarded by the :meth:`visit` method." +msgstr "" +"一个遍历抽象语法树并针对所找到的每个节点调用访问器函数的节点访问器基类。该函数可能会返回一个由 :meth:`visit` 方法所提供的值。" + +#: ../../library/ast.rst:2427 +msgid "" +"This class is meant to be subclassed, with the subclass adding visitor " +"methods." +msgstr "这个类应当被子类化,并由子类来添加访问器方法。" + +#: ../../library/ast.rst:2432 +msgid "" +"Visit a node. The default implementation calls the method called " +":samp:`self.visit_{classname}` where *classname* is the name of the node " +"class, or :meth:`generic_visit` if that method doesn't exist." +msgstr "" +"访问一个节点。默认实现会调用名为 :samp:`self.visit_{classname}` 的方法其中 *classname* " +"为节点类的名称,或者如果该方法不存在则为 :meth:`generic_visit`。" + +#: ../../library/ast.rst:2438 +msgid "This visitor calls :meth:`visit` on all children of the node." +msgstr "该访问器会在节点的所有子节点上调用 :meth:`visit`。" + +#: ../../library/ast.rst:2440 +msgid "" +"Note that child nodes of nodes that have a custom visitor method won't be " +"visited unless the visitor calls :meth:`generic_visit` or visits them " +"itself." +msgstr "请注意所有包含自定义访问器方法的节点的子节点将不会被访问除非访问器调用了 :meth:`generic_visit` 或是自行访问它们。" + +#: ../../library/ast.rst:2446 +msgid "Handles all constant nodes." +msgstr "处理所有常量节点。" + +#: ../../library/ast.rst:2448 +msgid "" +"Don't use the :class:`NodeVisitor` if you want to apply changes to nodes " +"during traversal. For this a special visitor exists " +"(:class:`NodeTransformer`) that allows modifications." +msgstr "" +"如果你想在遍历期间应用对节点的修改则请不要使用 :class:`NodeVisitor`。对此目的可使用一个允许修改的特殊访问器 " +"(:class:`NodeTransformer`)." + +#: ../../library/ast.rst:2454 +msgid "" +"Methods :meth:`!visit_Num`, :meth:`!visit_Str`, :meth:`!visit_Bytes`, " +":meth:`!visit_NameConstant` and :meth:`!visit_Ellipsis` will not be called " +"in Python 3.14+. Add the :meth:`visit_Constant` method instead to handle " +"all constant nodes." +msgstr "" +":meth:`!visit_Num`, :meth:`!visit_Str`, :meth:`!visit_Bytes`, " +":meth:`!visit_NameConstant` 和 :meth:`!visit_Ellipsis` 等方法在 Python 3.14+ " +"中将不会再被调用。请改为添加 :meth:`visit_Constant` 方法来处理所有常量节点。" + +#: ../../library/ast.rst:2462 +msgid "" +"A :class:`NodeVisitor` subclass that walks the abstract syntax tree and " +"allows modification of nodes." +msgstr ":class:`NodeVisitor` 的子类,用于遍历抽象语法树,并允许修改节点。" + +#: ../../library/ast.rst:2465 +msgid "" +"The :class:`NodeTransformer` will walk the AST and use the return value of " +"the visitor methods to replace or remove the old node. If the return value " +"of the visitor method is ``None``, the node will be removed from its " +"location, otherwise it is replaced with the return value. The return value " +"may be the original node in which case no replacement takes place." +msgstr "" +":class:`NodeTransformer` 将遍历抽象语法树并使用访问器方法的返回值去替换或移除旧节点。如果访问器方法的返回值为 " +"``None``,则该节点将从其位置移除,否则将替换为返回值。当返回值是原始节点时,无需替换。" + +#: ../../library/ast.rst:2471 +msgid "" +"Here is an example transformer that rewrites all occurrences of name lookups" +" (``foo``) to ``data['foo']``::" +msgstr "如下是一个转换器示例,它将所有出现的名称 (``foo``) 重写为 ``data['foo']``::" + +#: ../../library/ast.rst:2474 +msgid "" +"class RewriteName(NodeTransformer):\n" +"\n" +" def visit_Name(self, node):\n" +" return Subscript(\n" +" value=Name(id='data', ctx=Load()),\n" +" slice=Constant(value=node.id),\n" +" ctx=node.ctx\n" +" )" +msgstr "" +"class RewriteName(NodeTransformer):\n" +"\n" +" def visit_Name(self, node):\n" +" return Subscript(\n" +" value=Name(id='data', ctx=Load()),\n" +" slice=Constant(value=node.id),\n" +" ctx=node.ctx\n" +" )" + +#: ../../library/ast.rst:2483 +msgid "" +"Keep in mind that if the node you're operating on has child nodes you must " +"either transform the child nodes yourself or call the " +":meth:`~ast.NodeVisitor.generic_visit` method for the node first." +msgstr "" +"请记住如果你正在操作的节点具有子节点,你必须先自行转换这些子节点或是为该节点调用 " +":meth:`~ast.NodeVisitor.generic_visit` 方法。" + +#: ../../library/ast.rst:2487 +msgid "" +"For nodes that were part of a collection of statements (that applies to all " +"statement nodes), the visitor may also return a list of nodes rather than " +"just a single node." +msgstr "对于属于语句集合(适用于所有语句节点)的节点,访问者还可以返回节点列表而不仅仅是单个节点。" + +#: ../../library/ast.rst:2491 +msgid "" +"If :class:`NodeTransformer` introduces new nodes (that weren't part of " +"original tree) without giving them location information (such as " +":attr:`~ast.AST.lineno`), :func:`fix_missing_locations` should be called " +"with the new sub-tree to recalculate the location information::" +msgstr "" +"如果 :class:`NodeTransformer` 引入了新的(不属于原节点树的一部分的)节点而没有给出它们的位置信息(如 " +":attr:`~ast.AST.lineno` 等),则应当调用 :func:`fix_missing_locations` " +"并传入新的子节点树来重新计算位置信息::" + +#: ../../library/ast.rst:2496 +msgid "" +"tree = ast.parse('foo', mode='eval')\n" +"new_tree = fix_missing_locations(RewriteName().visit(tree))" +msgstr "" +"tree = ast.parse('foo', mode='eval')\n" +"new_tree = fix_missing_locations(RewriteName().visit(tree))" + +#: ../../library/ast.rst:2499 +msgid "Usually you use the transformer like this::" +msgstr "通常你可以像这样使用转换器::" + +#: ../../library/ast.rst:2501 +msgid "node = YourTransformer().visit(node)" +msgstr "node = YourTransformer().visit(node)" + +#: ../../library/ast.rst:2506 +msgid "" +"Return a formatted dump of the tree in *node*. This is mainly useful for " +"debugging purposes. If *annotate_fields* is true (by default), the returned" +" string will show the names and the values for fields. If *annotate_fields* " +"is false, the result string will be more compact by omitting unambiguous " +"field names. Attributes such as line numbers and column offsets are not " +"dumped by default. If this is wanted, *include_attributes* can be set to " +"true." +msgstr "" +"返回 *node* 中树结构的格式化转储。这主要适用于调试目的。如果 *annotate_fields* " +"为真值(默认),返回的字符串将显示字段的名称和值。如果 *annotate_fields* 为假值,结果字符串将通过省略无歧义的字段名称变得更为紧凑。 " +"默认情况下不会转储行号和列偏移等属性。如果需要,可将 *include_attributes* 设为真值。" + +#: ../../library/ast.rst:2514 +msgid "" +"If *indent* is a non-negative integer or string, then the tree will be " +"pretty-printed with that indent level. An indent level of 0, negative, or " +"``\"\"`` will only insert newlines. ``None`` (the default) selects the " +"single line representation. Using a positive integer indent indents that " +"many spaces per level. If *indent* is a string (such as ``\"\\t\"``), that " +"string is used to indent each level." +msgstr "" +"如果 *indent* 是一个非负整数或者字符串,那么节点树将被美化输出为指定的缩进级别。如果缩进级别为 0、负数或者 ``\"\"`` " +"则将只插入换行符。``None`` (默认) 将选择最紧凑的表示形式。使用一个正整数将让每个级别缩进相应数量的空格。如果 *indent* 是一个字符串" +" (如 ``\"\\t\"``),该字符串会被用于缩进每个级别。" + +#: ../../library/ast.rst:2521 +msgid "" +"If *show_empty* is false (the default), optional empty lists will be omitted" +" from the output. Optional ``None`` values are always omitted." +msgstr "如果 *show_empty* 为(默认的)假值,则可选的空列表将从输出中被忽略。可选的 ``None`` 值总是会被忽略。" + +#: ../../library/ast.rst:2525 +msgid "Added the *indent* option." +msgstr "添加了 *indent* 选项。" + +#: ../../library/ast.rst:2528 +msgid "Added the *show_empty* option." +msgstr "增加了 *show_empty* 选项。" + +#: ../../library/ast.rst:2531 +msgid "" +">>> print(ast.dump(ast.parse(\"\"\"\\\n" +"... async def f():\n" +"... await other_func()\n" +"... \"\"\"), indent=4, show_empty=True))\n" +"Module(\n" +" body=[\n" +" AsyncFunctionDef(\n" +" name='f',\n" +" args=arguments(\n" +" posonlyargs=[],\n" +" args=[],\n" +" kwonlyargs=[],\n" +" kw_defaults=[],\n" +" defaults=[]),\n" +" body=[\n" +" Expr(\n" +" value=Await(\n" +" value=Call(\n" +" func=Name(id='other_func', ctx=Load()),\n" +" args=[],\n" +" keywords=[])))],\n" +" decorator_list=[],\n" +" type_params=[])],\n" +" type_ignores=[])" +msgstr "" +">>> print(ast.dump(ast.parse(\"\"\"\\\n" +"... async def f():\n" +"... await other_func()\n" +"... \"\"\"), indent=4, show_empty=True))\n" +"Module(\n" +" body=[\n" +" AsyncFunctionDef(\n" +" name='f',\n" +" args=arguments(\n" +" posonlyargs=[],\n" +" args=[],\n" +" kwonlyargs=[],\n" +" kw_defaults=[],\n" +" defaults=[]),\n" +" body=[\n" +" Expr(\n" +" value=Await(\n" +" value=Call(\n" +" func=Name(id='other_func', ctx=Load()),\n" +" args=[],\n" +" keywords=[])))],\n" +" decorator_list=[],\n" +" type_params=[])],\n" +" type_ignores=[])" + +#: ../../library/ast.rst:2561 +msgid "Recursively compares two ASTs." +msgstr "递归地比较两个 AST。" + +#: ../../library/ast.rst:2563 +msgid "" +"*compare_attributes* affects whether AST attributes are considered in the " +"comparison. If *compare_attributes* is ``False`` (default), then attributes " +"are ignored. Otherwise they must all be equal. This option is useful to " +"check whether the ASTs are structurally equal but differ in whitespace or " +"similar details. Attributes include line numbers and column offsets." +msgstr "" +"*compare_attributes* 影响在比较中是否考虑 AST 属性。如果 *compare_attributes* 为 ``False`` " +"(默认值) ,则忽略属性。否则它们必须是相等的。此选项用于检查 AST 是否在结构上相等,但在空白符或类似细节上有所不同。属性包括行号和列偏移量。" + +#: ../../library/ast.rst:2576 +msgid "Compiler flags" +msgstr "编译器标志" + +#: ../../library/ast.rst:2578 +msgid "" +"The following flags may be passed to :func:`compile` in order to change " +"effects on the compilation of a program:" +msgstr "下列旗标可被传给 :func:`compile` 用来改变程序编译的效果:" + +#: ../../library/ast.rst:2583 +msgid "" +"Enables support for top-level ``await``, ``async for``, ``async with`` and " +"async comprehensions." +msgstr "启用对最高层级 ``await``, ``async for``, ``async with`` 以及异步推导式的支持。" + +#: ../../library/ast.rst:2590 +msgid "" +"Generates and returns an abstract syntax tree instead of returning a " +"compiled code object." +msgstr "生成并返回一个抽象语法树而不是返回一个已编译的代码对象。" + +#: ../../library/ast.rst:2595 +msgid "" +"The returned AST is optimized according to the *optimize* argument in " +":func:`compile` or :func:`ast.parse`." +msgstr "" +"返回的 AST 已根据 :func:`compile` 或 :func:`ast.parse` 中的 *optimize* 参数进行了优化。" + +#: ../../library/ast.rst:2602 +msgid "" +"Enables support for :pep:`484` and :pep:`526` style type comments (``# type:" +" ``, ``# type: ignore ``)." +msgstr "" +"启用对 :pep:`484` 和 :pep:`526` 风格的类型注释的支持 (``# type: ``, ``# type: ignore" +" ``)." + +#: ../../library/ast.rst:2611 +msgid "Command-line usage" +msgstr "命令行用法" + +#: ../../library/ast.rst:2615 +msgid "" +"The :mod:`!ast` module can be executed as a script from the command line. It" +" is as simple as:" +msgstr "" + +#: ../../library/ast.rst:2618 +msgid "python -m ast [-m ] [-a] [infile]" +msgstr "python -m ast [-m ] [-a] [infile]" + +#: ../../library/ast.rst:2622 +msgid "The following options are accepted:" +msgstr "可以接受以下选项:" + +#: ../../library/ast.rst:2628 +msgid "Show the help message and exit." +msgstr "显示帮助信息并退出。" + +#: ../../library/ast.rst:2633 +msgid "" +"Specify what kind of code must be compiled, like the *mode* argument in " +":func:`parse`." +msgstr "指明哪种代码必须被编译,相当于 :func:`parse` 中的 *mode* 参数。" + +#: ../../library/ast.rst:2638 +msgid "Don't parse type comments." +msgstr "不要解析类型注释。" + +#: ../../library/ast.rst:2642 +msgid "Include attributes such as line numbers and column offsets." +msgstr "包括属性如行号和列偏移。" + +#: ../../library/ast.rst:2647 +msgid "Indentation of nodes in AST (number of spaces)." +msgstr "AST 中节点的缩进(空格数)。" + +#: ../../library/ast.rst:2651 +msgid "" +"Python version in the format 3.x (for example, 3.10). Defaults to the " +"current version of the interpreter." +msgstr "3.x 格式(例如 3.10)的 Python 版本。默认为解释器的当前版本。" + +#: ../../library/ast.rst:2659 +msgid "Optimization level for parser. Defaults to no optimization." +msgstr "解析器的优化级别。默认为无优化。" + +#: ../../library/ast.rst:2665 +msgid "" +"Show empty lists and fields that are ``None``. Defaults to not showing empty" +" objects." +msgstr "显示空列表和为 ``None`` 的字段。默认不显示空对象。" + +#: ../../library/ast.rst:2671 +msgid "" +"If :file:`infile` is specified its contents are parsed to AST and dumped to " +"stdout. Otherwise, the content is read from stdin." +msgstr "如果指定了 :file:`infile` 则其内容将被解析为 AST 并转储至 stdout。在其他情况下,将从 stdin 读取内容。" + +#: ../../library/ast.rst:2677 +msgid "" +"`Green Tree Snakes `_, an external " +"documentation resource, has good details on working with Python ASTs." +msgstr "" +"`Green Tree Snakes `_,一个外部文档资源,包含处理" +" Python AST 的完整细节。" + +#: ../../library/ast.rst:2680 +msgid "" +"`ASTTokens `_ " +"annotates Python ASTs with the positions of tokens and text in the source " +"code that generated them. This is helpful for tools that make source code " +"transformations." +msgstr "" +"`ASTTokens `_ 会为" +" Python AST 标注生成它们的源代码中的形符和文本的位置。这对执行源代码转换的工具很有帮助。" + +#: ../../library/ast.rst:2685 +msgid "" +"`leoAst.py `_ unifies the token-based and parse-tree-based views of python programs " +"by inserting two-way links between tokens and ast nodes." +msgstr "" +"`leoAst.py `_ 通过在形符和 ast 节点之间插入双向链接统一了 python 程序基于形符的和基于解析树的视图。" + +#: ../../library/ast.rst:2690 +msgid "" +"`LibCST `_ parses code as a Concrete Syntax " +"Tree that looks like an ast tree and keeps all formatting details. It's " +"useful for building automated refactoring (codemod) applications and " +"linters." +msgstr "" +"`LibCST `_ 将代码解析为一个实体语法树(Concrete Syntax " +"Tree),它看起来像是 ast 树而又保留了所有格式化细节。它对构建自动化重构(codemod)应用和代码质量检查工具很有用处。" + +#: ../../library/ast.rst:2695 +msgid "" +"`Parso `_ is a Python parser that supports " +"error recovery and round-trip parsing for different Python versions (in " +"multiple Python versions). Parso is also able to list multiple syntax errors" +" in your Python file." +msgstr "" +"`Parso `_ 是一个支持错误恢复和不同 Python 版本的(在多个 Python " +"版本中)往返解析的 Python 解析器。Parso 还能列出你的 Python 文件中的许多语法错误。" + +#: ../../library/ast.rst:59 +msgid "? (question mark)" +msgstr "? (问号)" + +#: ../../library/ast.rst:59 ../../library/ast.rst:60 +msgid "in AST grammar" +msgstr "在 AST 语法中" + +#: ../../library/ast.rst:60 +msgid "* (asterisk)" +msgstr "* (星号)" diff --git a/library/asynchat.po b/library/asynchat.po new file mode 100644 index 0000000000..dcd893aa37 --- /dev/null +++ b/library/asynchat.po @@ -0,0 +1,47 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/asynchat.rst:2 +msgid ":mod:`!asynchat` --- Asynchronous socket command/response handler" +msgstr ":mod:`!asynchat` --- 异步套接字命令/响应处理器" + +#: ../../library/asynchat.rst:10 +msgid "" +"This module is no longer part of the Python standard library. It was " +":ref:`removed in Python 3.12 ` after being deprecated " +"in Python 3.6. The removal was decided in :pep:`594`." +msgstr "" +"此模块已不再是 Python 标准库的一部分。它在 Python 3.6 中被弃用后又在 :ref:`Python 3.12 中被移除 " +"`。移除计划是在 :pep:`594` 中确定的。" + +#: ../../library/asynchat.rst:14 +msgid "Applications should use the :mod:`asyncio` module instead." +msgstr "应用程序应当改用 :mod:`asyncio` 模块。" + +#: ../../library/asynchat.rst:16 +msgid "" +"The last version of Python that provided the :mod:`!asynchat` module was " +"`Python 3.11 `_." +msgstr "" +"提供 :mod:`!asynchat` 模块的最后一个 Python 版本是 `Python 3.11 " +"`_." diff --git a/library/asyncio-api-index.po b/library/asyncio-api-index.po new file mode 100644 index 0000000000..8170b76eca --- /dev/null +++ b/library/asyncio-api-index.po @@ -0,0 +1,446 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/asyncio-api-index.rst:6 +msgid "High-level API Index" +msgstr "高层级 API 索引" + +#: ../../library/asyncio-api-index.rst:8 +msgid "This page lists all high-level async/await enabled asyncio APIs." +msgstr "这个页面列举了所有能用于 async/await 的高层级 asyncio API。" + +#: ../../library/asyncio-api-index.rst:12 +msgid "Tasks" +msgstr "任务" + +#: ../../library/asyncio-api-index.rst:14 +msgid "" +"Utilities to run asyncio programs, create Tasks, and await on multiple " +"things with timeouts." +msgstr "运行异步程序,创建 Task 对象,以及带有超时机制地等待多个事项的工具集。" + +#: ../../library/asyncio-api-index.rst:21 +msgid ":func:`run`" +msgstr ":func:`run`" + +#: ../../library/asyncio-api-index.rst:22 +msgid "Create event loop, run a coroutine, close the loop." +msgstr "创建事件循环,运行一个协程,关闭事件循环。" + +#: ../../library/asyncio-api-index.rst:24 +msgid ":class:`Runner`" +msgstr ":class:`Runner`" + +#: ../../library/asyncio-api-index.rst:25 +msgid "A context manager that simplifies multiple async function calls." +msgstr "一个能够简化多次异步函数调用操作的上下文管理器。" + +#: ../../library/asyncio-api-index.rst:27 +msgid ":class:`Task`" +msgstr ":class:`Task`" + +#: ../../library/asyncio-api-index.rst:28 +msgid "Task object." +msgstr "Task 对象" + +#: ../../library/asyncio-api-index.rst:30 +msgid ":class:`TaskGroup`" +msgstr ":class:`TaskGroup`" + +#: ../../library/asyncio-api-index.rst:31 +msgid "" +"A context manager that holds a group of tasks. Provides a convenient and " +"reliable way to wait for all tasks in the group to finish." +msgstr "持有一组任务的上下文管理器。它提供了一种等待分组中所有任务完成的方便可靠的方式。" + +#: ../../library/asyncio-api-index.rst:35 +msgid ":func:`create_task`" +msgstr ":func:`create_task`" + +#: ../../library/asyncio-api-index.rst:36 +msgid "Start an asyncio Task, then returns it." +msgstr "启动一个异步 Task,然后将其返回。" + +#: ../../library/asyncio-api-index.rst:38 +msgid ":func:`current_task`" +msgstr ":func:`current_task`" + +#: ../../library/asyncio-api-index.rst:39 +msgid "Return the current Task." +msgstr "返回当前 Task 对象" + +#: ../../library/asyncio-api-index.rst:41 +msgid ":func:`all_tasks`" +msgstr ":func:`all_tasks`" + +#: ../../library/asyncio-api-index.rst:42 +msgid "Return all tasks that are not yet finished for an event loop." +msgstr "返回一个事件循环的所有尚未完成的任务。" + +#: ../../library/asyncio-api-index.rst:44 +msgid "``await`` :func:`sleep`" +msgstr "``await`` :func:`sleep`" + +#: ../../library/asyncio-api-index.rst:45 +msgid "Sleep for a number of seconds." +msgstr "休眠几秒。" + +#: ../../library/asyncio-api-index.rst:47 +msgid "``await`` :func:`gather`" +msgstr "``await`` :func:`gather`" + +#: ../../library/asyncio-api-index.rst:48 +msgid "Schedule and wait for things concurrently." +msgstr "并发执行所有事件的调度和等待。" + +#: ../../library/asyncio-api-index.rst:50 +msgid "``await`` :func:`wait_for`" +msgstr "``await`` :func:`wait_for`" + +#: ../../library/asyncio-api-index.rst:51 +msgid "Run with a timeout." +msgstr "有超时控制的运行。" + +#: ../../library/asyncio-api-index.rst:53 +msgid "``await`` :func:`shield`" +msgstr "``await`` :func:`shield`" + +#: ../../library/asyncio-api-index.rst:54 +msgid "Shield from cancellation." +msgstr "屏蔽取消操作" + +#: ../../library/asyncio-api-index.rst:56 +msgid "``await`` :func:`wait`" +msgstr "``await`` :func:`wait`" + +#: ../../library/asyncio-api-index.rst:57 +msgid "Monitor for completion." +msgstr "完成情况的监控器" + +#: ../../library/asyncio-api-index.rst:59 +msgid ":func:`timeout`" +msgstr ":func:`timeout`" + +#: ../../library/asyncio-api-index.rst:60 +msgid "Run with a timeout. Useful in cases when ``wait_for`` is not suitable." +msgstr "设置超时运行。在 ``wait_for`` 不适合的情况下会很有用。" + +#: ../../library/asyncio-api-index.rst:62 +msgid ":func:`to_thread`" +msgstr ":func:`to_thread`" + +#: ../../library/asyncio-api-index.rst:63 +msgid "Asynchronously run a function in a separate OS thread." +msgstr "在不同的 OS 线程中异步地运行一个函数。" + +#: ../../library/asyncio-api-index.rst:65 +msgid ":func:`run_coroutine_threadsafe`" +msgstr ":func:`run_coroutine_threadsafe`" + +#: ../../library/asyncio-api-index.rst:66 +msgid "Schedule a coroutine from another OS thread." +msgstr "从其他 OS 线程中调度一个协程。" + +#: ../../library/asyncio-api-index.rst:68 +msgid "``for in`` :func:`as_completed`" +msgstr "``for in`` :func:`as_completed`" + +#: ../../library/asyncio-api-index.rst:69 +msgid "Monitor for completion with a ``for`` loop." +msgstr "用 ``for`` 循环监控完成情况。" + +#: ../../library/asyncio-api-index.rst:73 +#: ../../library/asyncio-api-index.rst:109 +#: ../../library/asyncio-api-index.rst:133 +#: ../../library/asyncio-api-index.rst:169 +#: ../../library/asyncio-api-index.rst:205 +#: ../../library/asyncio-api-index.rst:230 +msgid "Examples" +msgstr "例子" + +#: ../../library/asyncio-api-index.rst:74 +msgid "" +":ref:`Using asyncio.gather() to run things in parallel " +"`." +msgstr ":ref:`使用 asyncio.gather() 并行运行 `." + +#: ../../library/asyncio-api-index.rst:77 +msgid "" +":ref:`Using asyncio.wait_for() to enforce a timeout " +"`." +msgstr ":ref:`使用 asyncio.wait_for() 强制超时 `." + +#: ../../library/asyncio-api-index.rst:80 +msgid ":ref:`Cancellation `." +msgstr ":ref:`取消操作 `." + +#: ../../library/asyncio-api-index.rst:82 +msgid ":ref:`Using asyncio.sleep() `." +msgstr ":ref:`asyncio.sleep() 的用法 `." + +#: ../../library/asyncio-api-index.rst:84 +msgid "See also the main :ref:`Tasks documentation page `." +msgstr "请主要参阅 :ref:`协程与任务文档 `." + +#: ../../library/asyncio-api-index.rst:88 +msgid "Queues" +msgstr "队列" + +#: ../../library/asyncio-api-index.rst:90 +msgid "" +"Queues should be used to distribute work amongst multiple asyncio Tasks, " +"implement connection pools, and pub/sub patterns." +msgstr "队列可被用于在多个异步 Task 之间分配工作、实现连接池以及发布/订阅模式。" + +#: ../../library/asyncio-api-index.rst:98 +msgid ":class:`Queue`" +msgstr ":class:`Queue`" + +#: ../../library/asyncio-api-index.rst:99 +msgid "A FIFO queue." +msgstr "先进先出队列" + +#: ../../library/asyncio-api-index.rst:101 +msgid ":class:`PriorityQueue`" +msgstr ":class:`PriorityQueue`" + +#: ../../library/asyncio-api-index.rst:102 +msgid "A priority queue." +msgstr "优先级队列。" + +#: ../../library/asyncio-api-index.rst:104 +msgid ":class:`LifoQueue`" +msgstr ":class:`LifoQueue`" + +#: ../../library/asyncio-api-index.rst:105 +msgid "A LIFO queue." +msgstr "后进先出队列。" + +#: ../../library/asyncio-api-index.rst:110 +msgid "" +":ref:`Using asyncio.Queue to distribute workload between several Tasks " +"`." +msgstr ":ref:`使用 asyncio.Queue 在多个并发任务间分配工作量 `." + +#: ../../library/asyncio-api-index.rst:113 +msgid "See also the :ref:`Queues documentation page `." +msgstr "请参阅 :ref:`队列文档 `." + +#: ../../library/asyncio-api-index.rst:117 +msgid "Subprocesses" +msgstr "子进程" + +#: ../../library/asyncio-api-index.rst:119 +msgid "Utilities to spawn subprocesses and run shell commands." +msgstr "用于生成子进程和运行 shell 命令的工具包。" + +#: ../../library/asyncio-api-index.rst:125 +msgid "``await`` :func:`create_subprocess_exec`" +msgstr "``await`` :func:`create_subprocess_exec`" + +#: ../../library/asyncio-api-index.rst:126 +msgid "Create a subprocess." +msgstr "创建一个子进程。" + +#: ../../library/asyncio-api-index.rst:128 +msgid "``await`` :func:`create_subprocess_shell`" +msgstr "``await`` :func:`create_subprocess_shell`" + +#: ../../library/asyncio-api-index.rst:129 +msgid "Run a shell command." +msgstr "运行一个 shell 命令。" + +#: ../../library/asyncio-api-index.rst:134 +msgid ":ref:`Executing a shell command `." +msgstr ":ref:`执行一个 shell 命令 `." + +#: ../../library/asyncio-api-index.rst:136 +msgid "" +"See also the :ref:`subprocess APIs ` documentation." +msgstr "请参阅 :ref:`子进程 APIs ` 相关文档。" + +#: ../../library/asyncio-api-index.rst:141 +msgid "Streams" +msgstr "流" + +#: ../../library/asyncio-api-index.rst:143 +msgid "High-level APIs to work with network IO." +msgstr "用于网络 IO 处理的高层级 API。" + +#: ../../library/asyncio-api-index.rst:149 +msgid "``await`` :func:`open_connection`" +msgstr "``await`` :func:`open_connection`" + +#: ../../library/asyncio-api-index.rst:150 +msgid "Establish a TCP connection." +msgstr "建立一个 TCP 连接。" + +#: ../../library/asyncio-api-index.rst:152 +msgid "``await`` :func:`open_unix_connection`" +msgstr "``await`` :func:`open_unix_connection`" + +#: ../../library/asyncio-api-index.rst:153 +msgid "Establish a Unix socket connection." +msgstr "建立一个 Unix socket 连接。" + +#: ../../library/asyncio-api-index.rst:155 +msgid "``await`` :func:`start_server`" +msgstr "``await`` :func:`start_server`" + +#: ../../library/asyncio-api-index.rst:156 +msgid "Start a TCP server." +msgstr "启动 TCP 服务。" + +#: ../../library/asyncio-api-index.rst:158 +msgid "``await`` :func:`start_unix_server`" +msgstr "``await`` :func:`start_unix_server`" + +#: ../../library/asyncio-api-index.rst:159 +msgid "Start a Unix socket server." +msgstr "启动一个 Unix 套接字服务。" + +#: ../../library/asyncio-api-index.rst:161 +msgid ":class:`StreamReader`" +msgstr ":class:`StreamReader`" + +#: ../../library/asyncio-api-index.rst:162 +msgid "High-level async/await object to receive network data." +msgstr "接收网络数据的高级 async/await 对象。" + +#: ../../library/asyncio-api-index.rst:164 +msgid ":class:`StreamWriter`" +msgstr ":class:`StreamWriter`" + +#: ../../library/asyncio-api-index.rst:165 +msgid "High-level async/await object to send network data." +msgstr "发送网络数据的高级 async/await 对象。" + +#: ../../library/asyncio-api-index.rst:170 +msgid ":ref:`Example TCP client `." +msgstr ":ref:`TCP 客户端样例 `." + +#: ../../library/asyncio-api-index.rst:172 +msgid "See also the :ref:`streams APIs ` documentation." +msgstr "请参阅 :ref:`流 API ` 文档。" + +#: ../../library/asyncio-api-index.rst:177 +msgid "Synchronization" +msgstr "同步" + +#: ../../library/asyncio-api-index.rst:179 +msgid "Threading-like synchronization primitives that can be used in Tasks." +msgstr "可在 Task 中使用的类似线程的同步原语。" + +#: ../../library/asyncio-api-index.rst:185 +msgid ":class:`Lock`" +msgstr ":class:`Lock`" + +#: ../../library/asyncio-api-index.rst:186 +msgid "A mutex lock." +msgstr "互斥锁。" + +#: ../../library/asyncio-api-index.rst:188 +msgid ":class:`Event`" +msgstr ":class:`Event`" + +#: ../../library/asyncio-api-index.rst:189 +msgid "An event object." +msgstr "事件对象。" + +#: ../../library/asyncio-api-index.rst:191 +msgid ":class:`Condition`" +msgstr ":class:`Condition`" + +#: ../../library/asyncio-api-index.rst:192 +msgid "A condition object." +msgstr "条件对象" + +#: ../../library/asyncio-api-index.rst:194 +msgid ":class:`Semaphore`" +msgstr ":class:`Semaphore`" + +#: ../../library/asyncio-api-index.rst:195 +msgid "A semaphore." +msgstr "信号量" + +#: ../../library/asyncio-api-index.rst:197 +msgid ":class:`BoundedSemaphore`" +msgstr ":class:`BoundedSemaphore`" + +#: ../../library/asyncio-api-index.rst:198 +msgid "A bounded semaphore." +msgstr "有界的信号量。" + +#: ../../library/asyncio-api-index.rst:200 +msgid ":class:`Barrier`" +msgstr ":class:`Barrier`" + +#: ../../library/asyncio-api-index.rst:201 +msgid "A barrier object." +msgstr "一个 Barrier 对象。" + +#: ../../library/asyncio-api-index.rst:206 +msgid ":ref:`Using asyncio.Event `." +msgstr ":ref:`asyncio.Event 的用法 `." + +#: ../../library/asyncio-api-index.rst:208 +msgid ":ref:`Using asyncio.Barrier `." +msgstr ":ref:`使用 asyncio.Barrier `。" + +#: ../../library/asyncio-api-index.rst:210 +msgid "" +"See also the documentation of asyncio :ref:`synchronization primitives " +"`." +msgstr "请参阅 asyncio :ref:`同步原语 ` 文档。" + +#: ../../library/asyncio-api-index.rst:215 +msgid "Exceptions" +msgstr "异常" + +#: ../../library/asyncio-api-index.rst:222 +msgid ":exc:`asyncio.CancelledError`" +msgstr ":exc:`asyncio.CancelledError`" + +#: ../../library/asyncio-api-index.rst:223 +msgid "Raised when a Task is cancelled. See also :meth:`Task.cancel`." +msgstr "当一个 Task 对象被取消的时候被引发。请参阅 :meth:`Task.cancel`。" + +#: ../../library/asyncio-api-index.rst:225 +msgid ":exc:`asyncio.BrokenBarrierError`" +msgstr ":exc:`asyncio.BrokenBarrierError`" + +#: ../../library/asyncio-api-index.rst:226 +msgid "Raised when a Barrier is broken. See also :meth:`Barrier.wait`." +msgstr "当一个 Barrier 对象被破坏时引发。另请参阅 :meth:`Barrier.wait`。" + +#: ../../library/asyncio-api-index.rst:231 +msgid "" +":ref:`Handling CancelledError to run code on cancellation request " +"`." +msgstr ":ref:`处理 CancelledError 以在取消请求时运行代码 `." + +#: ../../library/asyncio-api-index.rst:234 +msgid "" +"See also the full list of :ref:`asyncio-specific exceptions `." +msgstr "请参阅完整的 :ref:`asyncio 专用异常 ` 列表。" diff --git a/library/asyncio-dev.po b/library/asyncio-dev.po new file mode 100644 index 0000000000..5bb40055b5 --- /dev/null +++ b/library/asyncio-dev.po @@ -0,0 +1,836 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# 99 , 2026 +# python-doc bot, 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:00+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/asyncio-dev.rst:7 +msgid "Developing with asyncio" +msgstr "用 asyncio 开发" + +#: ../../library/asyncio-dev.rst:9 +msgid "" +"Asynchronous programming is different from classic \"sequential\" " +"programming." +msgstr "异步编程与传统的“顺序”编程不同。" + +#: ../../library/asyncio-dev.rst:12 +msgid "" +"This page lists common mistakes and traps and explains how to avoid them." +msgstr "本页列出常见的错误和陷阱,并解释如何避免它们。" + +#: ../../library/asyncio-dev.rst:19 +msgid "Debug Mode" +msgstr "调试模式" + +#: ../../library/asyncio-dev.rst:21 +msgid "" +"By default asyncio runs in production mode. In order to ease the " +"development asyncio has a *debug mode*." +msgstr "默认情况下,asyncio 以生产模式运行。为了简化开发,asyncio 还有一种*调试模式* 。" + +#: ../../library/asyncio-dev.rst:24 +msgid "There are several ways to enable asyncio debug mode:" +msgstr "有几种方法可以启用异步调试模式:" + +#: ../../library/asyncio-dev.rst:26 +msgid "" +"Setting the :envvar:`PYTHONASYNCIODEBUG` environment variable to ``1``." +msgstr "将 :envvar:`PYTHONASYNCIODEBUG` 环境变量设置为 ``1``。" + +#: ../../library/asyncio-dev.rst:28 +msgid "Using the :ref:`Python Development Mode `." +msgstr "使用 :ref:`Python 开发模式 `。" + +#: ../../library/asyncio-dev.rst:30 +msgid "Passing ``debug=True`` to :func:`asyncio.run`." +msgstr "将 ``debug=True`` 传递给 :func:`asyncio.run`。" + +#: ../../library/asyncio-dev.rst:32 +msgid "Calling :meth:`loop.set_debug`." +msgstr "调用 :meth:`loop.set_debug`。" + +#: ../../library/asyncio-dev.rst:34 +msgid "In addition to enabling the debug mode, consider also:" +msgstr "除了启用调试模式外,还要考虑:" + +#: ../../library/asyncio-dev.rst:36 +msgid "" +"setting the log level of the :ref:`asyncio logger ` to " +":py:const:`logging.DEBUG`, for example the following snippet of code can be " +"run at startup of the application::" +msgstr "" +"将 :ref:`asyncio logger ` 的级别设为 " +":py:const:`logging.DEBUG`,例如下面的代码片段可以在应用程序启动时运行::" + +#: ../../library/asyncio-dev.rst:40 +msgid "logging.basicConfig(level=logging.DEBUG)" +msgstr "logging.basicConfig(level=logging.DEBUG)" + +#: ../../library/asyncio-dev.rst:42 +msgid "" +"configuring the :mod:`warnings` module to display :exc:`ResourceWarning` " +"warnings. One way of doing that is by using the :option:`-W` ``default`` " +"command line option." +msgstr "" +"配置 :mod:`warnings` 模块以显示 :exc:`ResourceWarning` 警告。一种方法是使用 :option:`-W` " +"``default`` 命令行选项。" + +#: ../../library/asyncio-dev.rst:47 +msgid "When the debug mode is enabled:" +msgstr "启用调试模式时:" + +#: ../../library/asyncio-dev.rst:49 +msgid "" +"Many non-threadsafe asyncio APIs (such as :meth:`loop.call_soon` and " +":meth:`loop.call_at` methods) raise an exception if they are called from a " +"wrong thread." +msgstr "" +"许多非线程安全的异步 APIs (例如 :meth:`loop.call_soon` 和 :meth:`loop.call_at` " +"方法),如果从错误的线程调用,则会引发异常。" + +#: ../../library/asyncio-dev.rst:53 +msgid "" +"The execution time of the I/O selector is logged if it takes too long to " +"perform an I/O operation." +msgstr "如果执行 I/O 操作花费的时间太长,则记录 I/O 选择器的执行时间。" + +#: ../../library/asyncio-dev.rst:56 +msgid "" +"Callbacks taking longer than 100 milliseconds are logged. The " +":attr:`loop.slow_callback_duration` attribute can be used to set the minimum" +" execution duration in seconds that is considered \"slow\"." +msgstr "" +"执行时间超过 100 毫秒的回调会被写入日志。 :attr:`loop.slow_callback_duration` " +"属性可用于设置以秒为单位的将被视为“缓慢”的最小执行持续时间。" + +#: ../../library/asyncio-dev.rst:64 +msgid "Concurrency and Multithreading" +msgstr "并发性和多线程" + +#: ../../library/asyncio-dev.rst:66 +msgid "" +"An event loop runs in a thread (typically the main thread) and executes all " +"callbacks and Tasks in its thread. While a Task is running in the event " +"loop, no other Tasks can run in the same thread. When a Task executes an " +"``await`` expression, the running Task gets suspended, and the event loop " +"executes the next Task." +msgstr "" +"事件循环在线程中运行 " +"(通常是主线程),并在其线程中执行所有回调和任务。当一个任务在事件循环中运行时,没有其他任务可以在同一个线程中运行。当一个任务执行一个 " +"``await`` 表达式时,正在运行的任务被挂起,事件循环执行下一个任务。" + +#: ../../library/asyncio-dev.rst:72 +msgid "" +"To schedule a :term:`callback` from another OS thread, the " +":meth:`loop.call_soon_threadsafe` method should be used. Example::" +msgstr "" +"要调度来自另一 OS 线程的 :term:`callback`,应该使用 :meth:`loop.call_soon_threadsafe` 方法。 " +"例如::" + +#: ../../library/asyncio-dev.rst:75 +msgid "loop.call_soon_threadsafe(callback, *args)" +msgstr "loop.call_soon_threadsafe(callback, *args)" + +#: ../../library/asyncio-dev.rst:77 +msgid "" +"Almost all asyncio objects are not thread safe, which is typically not a " +"problem unless there is code that works with them from outside of a Task or " +"a callback. If there's a need for such code to call a low-level asyncio " +"API, the :meth:`loop.call_soon_threadsafe` method should be used, e.g.::" +msgstr "" +"几乎所有异步对象都不是线程安全的,这通常不是问题,除非在任务或回调函数之外有代码可以使用它们。如果需要这样的代码来调用低级异步 API,应该使用 " +":meth:`loop.call_soon_threadsafe` 方法,例如::" + +#: ../../library/asyncio-dev.rst:83 +msgid "loop.call_soon_threadsafe(fut.cancel)" +msgstr "loop.call_soon_threadsafe(fut.cancel)" + +#: ../../library/asyncio-dev.rst:85 +msgid "" +"To schedule a coroutine object from a different OS thread, the " +":func:`run_coroutine_threadsafe` function should be used. It returns a " +":class:`concurrent.futures.Future` to access the result::" +msgstr "" +"要从不同的 OS 线程调度一个协程对象,应该使用 :func:`run_coroutine_threadsafe` 函数。它返回一个 " +":class:`concurrent.futures.Future`。查询结果::" + +#: ../../library/asyncio-dev.rst:89 +msgid "" +"async def coro_func():\n" +" return await asyncio.sleep(1, 42)\n" +"\n" +"# Later in another OS thread:\n" +"\n" +"future = asyncio.run_coroutine_threadsafe(coro_func(), loop)\n" +"# Wait for the result:\n" +"result = future.result()" +msgstr "" +"async def coro_func():\n" +" return await asyncio.sleep(1, 42)\n" +"\n" +"# 随后在另一个 OS 线程中:\n" +"\n" +"future = asyncio.run_coroutine_threadsafe(coro_func(), loop)\n" +"# 等待结果:\n" +"result = future.result()" + +#: ../../library/asyncio-dev.rst:98 +msgid "To handle signals the event loop must be run in the main thread." +msgstr "为了能处理信号,事件循环必须在主线程中运行。" + +#: ../../library/asyncio-dev.rst:101 +msgid "" +"The :meth:`loop.run_in_executor` method can be used with a " +":class:`concurrent.futures.ThreadPoolExecutor` or " +":class:`~concurrent.futures.InterpreterPoolExecutor` to execute blocking " +"code in a different OS thread without blocking the OS thread that the event " +"loop runs in." +msgstr "" +":meth:`loop.run_in_executor` 方法可以配合 " +":class:`concurrent.futures.ThreadPoolExecutor` 或 " +":class:`~concurrent.futures.InterpreterPoolExecutor` 使用以在不同的 OS " +"线程中执行阻塞型的代码而不会阻塞事件循环运行所在的 OS 线程。" + +#: ../../library/asyncio-dev.rst:107 +msgid "" +"There is currently no way to schedule coroutines or callbacks directly from " +"a different process (such as one started with :mod:`multiprocessing`). The " +":ref:`asyncio-event-loop-methods` section lists APIs that can read from " +"pipes and watch file descriptors without blocking the event loop. In " +"addition, asyncio's :ref:`Subprocess ` APIs provide a " +"way to start a process and communicate with it from the event loop. Lastly, " +"the aforementioned :meth:`loop.run_in_executor` method can also be used with" +" a :class:`concurrent.futures.ProcessPoolExecutor` to execute code in a " +"different process." +msgstr "" +"目前没有办法直接从另一个进程(如使用 :mod:`multiprocessing` 启动的进程)安排协程或回调。 :ref:`asyncio-" +"event-loop-methods` 小节列出了一些可以从管道读取并监视文件描述符而不会阻塞事件循环的 API。此外,asyncio 的 " +":ref:`子进程 ` API 提供了一种启动进程并在事件循环中与其通信的办法。最后,之前提到的 " +":meth:`loop.run_in_executor` 方法也可以配合 " +":class:`concurrent.futures.ProcessPoolExecutor` 使用以在另一个进程中执行代码。" + +#: ../../library/asyncio-dev.rst:121 +msgid "Running Blocking Code" +msgstr "运行阻塞的代码" + +#: ../../library/asyncio-dev.rst:123 +msgid "" +"Blocking (CPU-bound) code should not be called directly. For example, if a " +"function performs a CPU-intensive calculation for 1 second, all concurrent " +"asyncio Tasks and IO operations would be delayed by 1 second." +msgstr "" +"不应该直接调用阻塞 ( CPU 绑定) 代码。例如,如果一个函数执行 1 秒的 CPU 密集型计算,那么所有并发异步任务和 IO 操作都将延迟 1 秒。" + +#: ../../library/asyncio-dev.rst:128 +msgid "" +"An executor can be used to run a task in a different thread, including in a " +"different interpreter, or even in a different process to avoid blocking the " +"OS thread with the event loop. See the :meth:`loop.run_in_executor` method " +"for more details." +msgstr "" +"可以使用执行器让任务运行在不同的线程中,包括不同的解释器中,或者甚至在不同的进程中以避免阻塞事件循环所在的 OS 线程。请参阅 " +":meth:`loop.run_in_executor` 方法了解详情。" + +#: ../../library/asyncio-dev.rst:138 +msgid "Logging" +msgstr "日志记录" + +#: ../../library/asyncio-dev.rst:140 +msgid "" +"asyncio uses the :mod:`logging` module and all logging is performed via the " +"``\"asyncio\"`` logger." +msgstr "asyncio 使用 :mod:`logging` 模块,所有日志记录都是通过 ``\"asyncio\"`` logger 执行的。" + +#: ../../library/asyncio-dev.rst:143 +msgid "" +"The default log level is :py:const:`logging.INFO`, which can be easily " +"adjusted::" +msgstr "默认的日志级别是 :py:const:`logging.INFO`,它可以被方便地调整::" + +#: ../../library/asyncio-dev.rst:146 +msgid "logging.getLogger(\"asyncio\").setLevel(logging.WARNING)" +msgstr "logging.getLogger(\"asyncio\").setLevel(logging.WARNING)" + +#: ../../library/asyncio-dev.rst:149 +msgid "" +"Network logging can block the event loop. It is recommended to use a " +"separate thread for handling logs or use non-blocking IO. For example, see " +":ref:`blocking-handlers`." +msgstr "" +"网络日志会阻塞事件循环。建议使用一个单独线程来处理日志或者使用非阻塞式 IO。例如,可以参阅 :ref:`blocking-handlers`。" + +#: ../../library/asyncio-dev.rst:157 +msgid "Detect never-awaited coroutines" +msgstr "检测从未被等待的协程" + +#: ../../library/asyncio-dev.rst:159 +msgid "" +"When a coroutine function is called, but not awaited (e.g. ``coro()`` " +"instead of ``await coro()``) or the coroutine is not scheduled with " +":meth:`asyncio.create_task`, asyncio will emit a :exc:`RuntimeWarning`::" +msgstr "" +"当协程函数被调用而不是被等待时 (即执行 ``coro()`` 而不是 ``await coro()``) 或者协程没有通过 " +":meth:`asyncio.create_task` 被排入计划日程,asyncio 将会发出一条 :exc:`RuntimeWarning`::" + +#: ../../library/asyncio-dev.rst:164 +msgid "" +"import asyncio\n" +"\n" +"async def test():\n" +" print(\"never scheduled\")\n" +"\n" +"async def main():\n" +" test()\n" +"\n" +"asyncio.run(main())" +msgstr "" +"import asyncio\n" +"\n" +"async def test():\n" +" print(\"never scheduled\")\n" +"\n" +"async def main():\n" +" test()\n" +"\n" +"asyncio.run(main())" + +#: ../../library/asyncio-dev.rst:174 ../../library/asyncio-dev.rst:219 +#: ../../library/asyncio-dev.rst:393 ../../library/asyncio-dev.rst:450 +msgid "Output::" +msgstr "输出::" + +#: ../../library/asyncio-dev.rst:176 +msgid "" +"test.py:7: RuntimeWarning: coroutine 'test' was never awaited\n" +" test()" +msgstr "" +"test.py:7: RuntimeWarning: coroutine 'test' was never awaited\n" +" test()" + +#: ../../library/asyncio-dev.rst:179 ../../library/asyncio-dev.rst:235 +msgid "Output in debug mode::" +msgstr "调试模式的输出::" + +#: ../../library/asyncio-dev.rst:181 +msgid "" +"test.py:7: RuntimeWarning: coroutine 'test' was never awaited\n" +"Coroutine created at (most recent call last)\n" +" File \"../t.py\", line 9, in \n" +" asyncio.run(main(), debug=True)\n" +"\n" +" < .. >\n" +"\n" +" File \"../t.py\", line 7, in main\n" +" test()\n" +" test()" +msgstr "" +"test.py:7: RuntimeWarning: coroutine 'test' was never awaited\n" +"Coroutine created at (most recent call last)\n" +" File \"../t.py\", line 9, in \n" +" asyncio.run(main(), debug=True)\n" +"\n" +" < .. >\n" +"\n" +" File \"../t.py\", line 7, in main\n" +" test()\n" +" test()" + +#: ../../library/asyncio-dev.rst:192 +msgid "" +"The usual fix is to either await the coroutine or call the " +":meth:`asyncio.create_task` function::" +msgstr "通常的修复方法是等待协程或者调用 :meth:`asyncio.create_task` 函数::" + +#: ../../library/asyncio-dev.rst:195 +msgid "" +"async def main():\n" +" await test()" +msgstr "" +"async def main():\n" +" await test()" + +#: ../../library/asyncio-dev.rst:200 +msgid "Detect never-retrieved exceptions" +msgstr "检测从未被获取的异常" + +#: ../../library/asyncio-dev.rst:202 +msgid "" +"If a :meth:`Future.set_exception` is called but the Future object is never " +"awaited on, the exception would never be propagated to the user code. In " +"this case, asyncio would emit a log message when the Future object is " +"garbage collected." +msgstr "" +"如果调用了 :meth:`Future.set_exception`,但 Future 对象从未被等待,异常将永远不会传播到用户代码。在这种情况下,当 " +"Future 对象被垃圾收集时,asyncio 将发出一条日志消息。" + +#: ../../library/asyncio-dev.rst:207 +msgid "Example of an unhandled exception::" +msgstr "未处理异常的例子::" + +#: ../../library/asyncio-dev.rst:209 +msgid "" +"import asyncio\n" +"\n" +"async def bug():\n" +" raise Exception(\"not consumed\")\n" +"\n" +"async def main():\n" +" asyncio.create_task(bug())\n" +"\n" +"asyncio.run(main())" +msgstr "" +"import asyncio\n" +"\n" +"async def bug():\n" +" raise Exception(\"not consumed\")\n" +"\n" +"async def main():\n" +" asyncio.create_task(bug())\n" +"\n" +"asyncio.run(main())" + +#: ../../library/asyncio-dev.rst:221 +msgid "" +"Task exception was never retrieved\n" +"future: \n" +" exception=Exception('not consumed')>\n" +"\n" +"Traceback (most recent call last):\n" +" File \"test.py\", line 4, in bug\n" +" raise Exception(\"not consumed\")\n" +"Exception: not consumed" +msgstr "" +"Task exception was never retrieved\n" +"future: \n" +" exception=Exception('not consumed')>\n" +"\n" +"Traceback (most recent call last):\n" +" File \"test.py\", line 4, in bug\n" +" raise Exception(\"not consumed\")\n" +"Exception: not consumed" + +#: ../../library/asyncio-dev.rst:230 +msgid "" +":ref:`Enable the debug mode ` to get the traceback where" +" the task was created::" +msgstr ":ref:`激活调试模式 ` 以获取任务创建处的跟踪信息::" + +#: ../../library/asyncio-dev.rst:233 +msgid "asyncio.run(main(), debug=True)" +msgstr "asyncio.run(main(), debug=True)" + +#: ../../library/asyncio-dev.rst:237 +msgid "" +"Task exception was never retrieved\n" +"future: \n" +" exception=Exception('not consumed') created at asyncio/tasks.py:321>\n" +"\n" +"source_traceback: Object created at (most recent call last):\n" +" File \"../t.py\", line 9, in \n" +" asyncio.run(main(), debug=True)\n" +"\n" +"< .. >\n" +"\n" +"Traceback (most recent call last):\n" +" File \"../t.py\", line 4, in bug\n" +" raise Exception(\"not consumed\")\n" +"Exception: not consumed" +msgstr "" +"Task exception was never retrieved\n" +"future: \n" +" exception=Exception('not consumed') created at asyncio/tasks.py:321>\n" +"\n" +"source_traceback: Object created at (most recent call last):\n" +" File \"../t.py\", line 9, in \n" +" asyncio.run(main(), debug=True)\n" +"\n" +"< .. >\n" +"\n" +"Traceback (most recent call last):\n" +" File \"../t.py\", line 4, in bug\n" +" raise Exception(\"not consumed\")\n" +"Exception: not consumed" + +#: ../../library/asyncio-dev.rst:254 +msgid "Asynchronous generators best practices" +msgstr "异步生成器最佳实践" + +#: ../../library/asyncio-dev.rst:256 +msgid "" +"Writing correct and efficient asyncio code requires awareness of certain " +"pitfalls. This section outlines essential best practices that can save you " +"hours of debugging." +msgstr "要编写正确且高效的 asyncio 代码就必须注意某些陷阱。 本节概述了可为您节省大量调试时间的关键最佳实践。" + +#: ../../library/asyncio-dev.rst:261 +msgid "Close asynchronous generators explicitly" +msgstr "显式地关闭异步生成器" + +#: ../../library/asyncio-dev.rst:263 +msgid "" +"It is recommended to manually close the :term:`asynchronous generator " +"`. If a generator exits early - for " +"example, due to an exception raised in the body of an ``async for`` loop - " +"its asynchronous cleanup code may run in an unexpected context. This can " +"occur after the tasks it depends on have completed, or during the event loop" +" shutdown when the async-generator's garbage collection hook is called." +msgstr "" +"建议手动关闭 :term:`异步生成器 `。 如果一个生成器过早关闭 —— " +"例如,由于在 ``async for`` 循环体中引发了异常 —— 它的异步清理代码可能会在非预期的上下文中运行。 " +"这可能发生在它所依赖的任务完成之后,或是在异步生成器的垃圾收集钩子被调用时事件循环关闭期间。" + +#: ../../library/asyncio-dev.rst:271 +msgid "" +"To avoid this, explicitly close the generator by calling its " +":meth:`~agen.aclose` method, or use the :func:`contextlib.aclosing` context " +"manager::" +msgstr "" +"要避免此问题,请通过调用生成器的 :meth:`~agen.aclose` 方法显式地关闭它,或是使用 " +":func:`contextlib.aclosing` 上下文管理器::" + +#: ../../library/asyncio-dev.rst:275 +msgid "" +"import asyncio\n" +"import contextlib\n" +"\n" +"async def gen():\n" +" yield 1\n" +" yield 2\n" +"\n" +"async def func():\n" +" async with contextlib.aclosing(gen()) as g:\n" +" async for x in g:\n" +" break # Don't iterate until the end\n" +"\n" +"asyncio.run(func())" +msgstr "" +"import asyncio\n" +"import contextlib\n" +"\n" +"async def gen():\n" +" yield 1\n" +" yield 2\n" +"\n" +"async def func():\n" +" async with contextlib.aclosing(gen()) as g:\n" +" async for x in g:\n" +" break # 不迭代一直到结束\n" +"\n" +"asyncio.run(func())" + +#: ../../library/asyncio-dev.rst:289 +msgid "" +"As noted above, the cleanup code for these asynchronous generators is " +"deferred. The following example demonstrates that the finalization of an " +"asynchronous generator can occur in an unexpected order::" +msgstr "如上所述,这些异步生成器的清理代码会延迟执行。 下面的例子显示异步生成器的最终化可能会以非预期的顺序发生::" + +#: ../../library/asyncio-dev.rst:293 +msgid "" +"import asyncio\n" +"work_done = False\n" +"\n" +"async def cursor():\n" +" try:\n" +" yield 1\n" +" finally:\n" +" assert work_done\n" +"\n" +"async def rows():\n" +" global work_done\n" +" try:\n" +" yield 2\n" +" finally:\n" +" await asyncio.sleep(0.1) # imitate some async work\n" +" work_done = True\n" +"\n" +"\n" +"async def main():\n" +" async for c in cursor():\n" +" async for r in rows():\n" +" break\n" +" break\n" +"\n" +"asyncio.run(main())" +msgstr "" + +#: ../../library/asyncio-dev.rst:319 +msgid "For this example, we get the following output::" +msgstr "对于这个例子,我们将得到以下输出::" + +#: ../../library/asyncio-dev.rst:321 +msgid "" +"unhandled exception during asyncio.run() shutdown\n" +"task: ()> exception=AssertionError()>\n" +"Traceback (most recent call last):\n" +" File \"example.py\", line 6, in cursor\n" +" yield 1\n" +"asyncio.exceptions.CancelledError\n" +"\n" +"During handling of the above exception, another exception occurred:\n" +"\n" +"Traceback (most recent call last):\n" +" File \"example.py\", line 8, in cursor\n" +" assert work_done\n" +" ^^^^^^^^^\n" +"AssertionError" +msgstr "" +"unhandled exception during asyncio.run() shutdown\n" +"task: ()> exception=AssertionError()>\n" +"Traceback (most recent call last):\n" +" File \"example.py\", line 6, in cursor\n" +" yield 1\n" +"asyncio.exceptions.CancelledError\n" +"\n" +"During handling of the above exception, another exception occurred:\n" +"\n" +"Traceback (most recent call last):\n" +" File \"example.py\", line 8, in cursor\n" +" assert work_done\n" +" ^^^^^^^^^\n" +"AssertionError" + +#: ../../library/asyncio-dev.rst:336 +msgid "" +"The ``cursor()`` asynchronous generator was finalized before the ``rows`` " +"generator - an unexpected behavior." +msgstr "``cursor()`` 异步生成器会在 ``rows`` 生成器之前执行最终化 —— 这是非预期的行为。" + +#: ../../library/asyncio-dev.rst:339 +msgid "" +"The example can be fixed by explicitly closing the ``cursor`` and ``rows`` " +"async-generators::" +msgstr "这个例子可通过显式地关闭 ``cursor`` 和 ``rows`` 异步生成器来修正问题::" + +#: ../../library/asyncio-dev.rst:342 +msgid "" +"async def main():\n" +" async with contextlib.aclosing(cursor()) as cursor_gen:\n" +" async for c in cursor_gen:\n" +" async with contextlib.aclosing(rows()) as rows_gen:\n" +" async for r in rows_gen:\n" +" break\n" +" break" +msgstr "" +"async def main():\n" +" async with contextlib.aclosing(cursor()) as cursor_gen:\n" +" async for c in cursor_gen:\n" +" async with contextlib.aclosing(rows()) as rows_gen:\n" +" async for r in rows_gen:\n" +" break\n" +" break" + +#: ../../library/asyncio-dev.rst:352 +msgid "Create asynchronous generators only when the event loop is running" +msgstr "仅在事件循环正在运行时创建异步生成器" + +#: ../../library/asyncio-dev.rst:354 +msgid "" +"It is recommended to create :term:`asynchronous generators ` only after the event loop has been created." +msgstr "推荐做法是只在事件循环已被创建之后才创建 :term:`异步生成器 `。" + +#: ../../library/asyncio-dev.rst:358 +msgid "" +"To ensure that asynchronous generators close reliably, the event loop uses " +"the :func:`sys.set_asyncgen_hooks` function to register callback functions. " +"These callbacks update the list of running asynchronous generators to keep " +"it in a consistent state." +msgstr "" + +#: ../../library/asyncio-dev.rst:363 +msgid "" +"When the :meth:`loop.shutdown_asyncgens() `" +" function is called, the running generators are stopped gracefully and the " +"list is cleared." +msgstr "" + +#: ../../library/asyncio-dev.rst:367 +msgid "" +"The asynchronous generator invokes the corresponding system hook during its " +"first iteration. At the same time, the generator records that the hook has " +"been called and does not call it again." +msgstr "" + +#: ../../library/asyncio-dev.rst:371 +msgid "" +"Therefore, if iteration begins before the event loop is created, the event " +"loop will not be able to add the generator to its list of active generators " +"because the hooks are set after the generator attempts to call them. " +"Consequently, the event loop will not be able to terminate the generator if " +"necessary." +msgstr "" + +#: ../../library/asyncio-dev.rst:377 +msgid "Consider the following example::" +msgstr "比如下面的例子::" + +#: ../../library/asyncio-dev.rst:379 +msgid "" +"import asyncio\n" +"\n" +"async def agenfn():\n" +" try:\n" +" yield 10\n" +" finally:\n" +" await asyncio.sleep(0)\n" +"\n" +"\n" +"with asyncio.Runner() as runner:\n" +" agen = agenfn()\n" +" print(runner.run(anext(agen)))\n" +" del agen" +msgstr "" +"import asyncio\n" +"\n" +"async def agenfn():\n" +" try:\n" +" yield 10\n" +" finally:\n" +" await asyncio.sleep(0)\n" +"\n" +"\n" +"with asyncio.Runner() as runner:\n" +" agen = agenfn()\n" +" print(runner.run(anext(agen)))\n" +" del agen" + +#: ../../library/asyncio-dev.rst:395 +msgid "" +"10\n" +"Exception ignored while closing generator :\n" +"Traceback (most recent call last):\n" +" File \"example.py\", line 13, in \n" +" del agen\n" +" ^^^^\n" +"RuntimeError: async generator ignored GeneratorExit" +msgstr "" +"10\n" +"Exception ignored while closing generator :\n" +"Traceback (most recent call last):\n" +" File \"example.py\", line 13, in \n" +" del agen\n" +" ^^^^\n" +"RuntimeError: async generator ignored GeneratorExit" + +#: ../../library/asyncio-dev.rst:403 +msgid "This example can be fixed as follows::" +msgstr "该示例可用以下方式修复::" + +#: ../../library/asyncio-dev.rst:405 +msgid "" +"import asyncio\n" +"\n" +"async def agenfn():\n" +" try:\n" +" yield 10\n" +" finally:\n" +" await asyncio.sleep(0)\n" +"\n" +"async def main():\n" +" agen = agenfn()\n" +" print(await anext(agen))\n" +" del agen\n" +"\n" +"asyncio.run(main())" +msgstr "" +"import asyncio\n" +"\n" +"async def agenfn():\n" +" try:\n" +" yield 10\n" +" finally:\n" +" await asyncio.sleep(0)\n" +"\n" +"async def main():\n" +" agen = agenfn()\n" +" print(await anext(agen))\n" +" del agen\n" +"\n" +"asyncio.run(main())" + +#: ../../library/asyncio-dev.rst:422 +msgid "Avoid concurrent iteration and closure of the same generator" +msgstr "避免同一迭代器的并发迭代和闭包" + +#: ../../library/asyncio-dev.rst:424 +msgid "" +"Async generators may be reentered while another :meth:`~agen.__anext__` / " +":meth:`~agen.athrow` / :meth:`~agen.aclose` call is in progress. This may " +"lead to an inconsistent state of the async generator and can cause errors." +msgstr "" +"异步生成器可以在其他 :meth:`~agen.__anext__` / :meth:`~agen.athrow` / " +":meth:`~agen.aclose` 调用正在进行时重新进入。 这可能导致异步生成器状态不一致并造成错误。" + +#: ../../library/asyncio-dev.rst:429 +msgid "Let's consider the following example::" +msgstr "" + +#: ../../library/asyncio-dev.rst:431 +msgid "" +"import asyncio\n" +"\n" +"async def consumer():\n" +" for idx in range(100):\n" +" await asyncio.sleep(0)\n" +" message = yield idx\n" +" print('received', message)\n" +"\n" +"async def amain():\n" +" agenerator = consumer()\n" +" await agenerator.asend(None)\n" +"\n" +" fa = asyncio.create_task(agenerator.asend('A'))\n" +" fb = asyncio.create_task(agenerator.asend('B'))\n" +" await fa\n" +" await fb\n" +"\n" +"asyncio.run(amain())" +msgstr "" + +#: ../../library/asyncio-dev.rst:452 +msgid "" +"received A\n" +"Traceback (most recent call last):\n" +" File \"test.py\", line 38, in \n" +" asyncio.run(amain())\n" +" ~~~~~~~~~~~^^^^^^^^^\n" +" File \"Lib/asyncio/runners.py\", line 204, in run\n" +" return runner.run(main)\n" +" ~~~~~~~~~~^^^^^^\n" +" File \"Lib/asyncio/runners.py\", line 127, in run\n" +" return self._loop.run_until_complete(task)\n" +" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^\n" +" File \"Lib/asyncio/base_events.py\", line 719, in run_until_complete\n" +" return future.result()\n" +" ~~~~~~~~~~~~~^^\n" +" File \"test.py\", line 36, in amain\n" +" await fb\n" +"RuntimeError: anext(): asynchronous generator is already running" +msgstr "" + +#: ../../library/asyncio-dev.rst:471 +msgid "" +"Therefore, it is recommended to avoid using asynchronous generators in " +"parallel tasks or across multiple event loops." +msgstr "" diff --git a/library/asyncio-eventloop.po b/library/asyncio-eventloop.po new file mode 100644 index 0000000000..795e4b5423 --- /dev/null +++ b/library/asyncio-eventloop.po @@ -0,0 +1,3129 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-15 16:14+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/asyncio-eventloop.rst:8 +msgid "Event loop" +msgstr "事件循环" + +#: ../../library/asyncio-eventloop.rst:10 +msgid "" +"**Source code:** :source:`Lib/asyncio/events.py`, " +":source:`Lib/asyncio/base_events.py`" +msgstr "" +"**源代码:** :source:`Lib/asyncio/events.py`, " +":source:`Lib/asyncio/base_events.py`" + +#: ../../library/asyncio-eventloop.rst:16 +msgid "Preface" +msgstr "前言" + +#: ../../library/asyncio-eventloop.rst:17 +msgid "" +"The event loop is the core of every asyncio application. Event loops run " +"asynchronous tasks and callbacks, perform network IO operations, and run " +"subprocesses." +msgstr "事件循环是每个 asyncio 应用的核心。 事件循环会运行异步任务和回调,执行网络 IO 操作,以及运行子进程。" + +#: ../../library/asyncio-eventloop.rst:21 +msgid "" +"Application developers should typically use the high-level asyncio " +"functions, such as :func:`asyncio.run`, and should rarely need to reference " +"the loop object or call its methods. This section is intended mostly for " +"authors of lower-level code, libraries, and frameworks, who need finer " +"control over the event loop behavior." +msgstr "" +"应用开发者通常应当使用高层级的 asyncio 函数,例如 :func:`asyncio.run`,应当很少有必要引用循环对象或调用其方法。 " +"本节所针对的主要是低层级代码、库和框架的编写者,他们需要更细致地控制事件循环行为。" + +#: ../../library/asyncio-eventloop.rst:28 +msgid "Obtaining the Event Loop" +msgstr "获取事件循环" + +#: ../../library/asyncio-eventloop.rst:29 +msgid "" +"The following low-level functions can be used to get, set, or create an " +"event loop:" +msgstr "以下低层级函数可被用于获取、设置或创建事件循环:" + +#: ../../library/asyncio-eventloop.rst:34 +msgid "Return the running event loop in the current OS thread." +msgstr "返回当前 OS 线程中正在运行的事件循环。" + +#: ../../library/asyncio-eventloop.rst:36 +msgid "Raise a :exc:`RuntimeError` if there is no running event loop." +msgstr "如果没有正在运行的事件循环则会引发 :exc:`RuntimeError`。" + +#: ../../library/asyncio-eventloop.rst:38 +msgid "This function can only be called from a coroutine or a callback." +msgstr "此函数只能由协程或回调来调用。" + +#: ../../library/asyncio-eventloop.rst:44 +msgid "Get the current event loop." +msgstr "获取当前事件循环。" + +#: ../../library/asyncio-eventloop.rst:46 +msgid "" +"When called from a coroutine or a callback (e.g. scheduled with call_soon or" +" similar API), this function will always return the running event loop." +msgstr "当在协程或回调中被调用时(例如通过 call_soon 或类似 API 加入计划任务),此函数将始终返回正在运行的事件循环。" + +#: ../../library/asyncio-eventloop.rst:50 +msgid "" +"If there is no running event loop set, the function will return the result " +"of the ``get_event_loop_policy().get_event_loop()`` call." +msgstr "" +"如果没有设置正在运行的事件循环,此函数将返回 ``get_event_loop_policy().get_event_loop()`` 调用的结果。" + +#: ../../library/asyncio-eventloop.rst:53 +msgid "" +"Because this function has rather complex behavior (especially when custom " +"event loop policies are in use), using the :func:`get_running_loop` function" +" is preferred to :func:`get_event_loop` in coroutines and callbacks." +msgstr "" +"由于此函数具有相当复杂的行为(特别是在使用了自定义事件循环策略的时候),更推荐在协程和回调中使用 :func:`get_running_loop` " +"函数而非 :func:`get_event_loop`。" + +#: ../../library/asyncio-eventloop.rst:58 +msgid "" +"As noted above, consider using the higher-level :func:`asyncio.run` " +"function, instead of using these lower level functions to manually create " +"and close an event loop." +msgstr "如上文所说,请考虑使用高层级的 :func:`asyncio.run` 函数,而不是使用这些低层级的函数来手动创建和关闭事件循环。" + +#: ../../library/asyncio-eventloop.rst:62 +msgid "Raises a :exc:`RuntimeError` if there is no current event loop." +msgstr "如果没有当前事件循环则会引发 :exc:`RuntimeError`。" + +#: ../../library/asyncio-eventloop.rst:67 +msgid "" +"The :mod:`!asyncio` policy system is deprecated and will be removed in " +"Python 3.16; from there on, this function will return the current running " +"event loop if present else it will return the loop set by " +":func:`set_event_loop`." +msgstr "" +":mod:`!asyncio` 策略系统已弃用,将在 Python 3.16 " +"中删除;从那时起,此函数将返回当前正在运行的事件循环(如果存在),否则它将返回由 :func:`set_event_loop` 设置的循环。" + +#: ../../library/asyncio-eventloop.rst:74 +msgid "Set *loop* as the current event loop for the current OS thread." +msgstr "将 *loop* 设为当前 OS 线程的当前事件循环。" + +#: ../../library/asyncio-eventloop.rst:78 +msgid "Create and return a new event loop object." +msgstr "创建并返回一个新的事件循环对象。" + +#: ../../library/asyncio-eventloop.rst:80 +msgid "" +"Note that the behaviour of :func:`get_event_loop`, :func:`set_event_loop`, " +"and :func:`new_event_loop` functions can be altered by :ref:`setting a " +"custom event loop policy `." +msgstr "" +"请注意 :func:`get_event_loop`, :func:`set_event_loop` 以及 :func:`new_event_loop`" +" 函数的行为可以通过 :ref:`设置自定义事件循环策略 ` 来改变。" + +#: ../../library/asyncio-eventloop.rst:86 +msgid "Contents" +msgstr "目录" + +#: ../../library/asyncio-eventloop.rst:87 +msgid "This documentation page contains the following sections:" +msgstr "本文档包含下列小节:" + +#: ../../library/asyncio-eventloop.rst:89 +msgid "" +"The `Event Loop Methods`_ section is the reference documentation of the " +"event loop APIs;" +msgstr "`Event Loop Methods`_ 一节是事件循环 API 的参考文档;" + +#: ../../library/asyncio-eventloop.rst:92 +msgid "" +"The `Callback Handles`_ section documents the :class:`Handle` and " +":class:`TimerHandle` instances which are returned from scheduling methods " +"such as :meth:`loop.call_soon` and :meth:`loop.call_later`;" +msgstr "" +"`回调处理`_ 章节是从调度方法 例如 :meth:`loop.call_soon` 和 :meth:`loop.call_later` 中返回 " +":class:`Handle` 和 :class:`TimerHandle` 实例的文档。" + +#: ../../library/asyncio-eventloop.rst:96 +msgid "" +"The `Server Objects`_ section documents types returned from event loop " +"methods like :meth:`loop.create_server`;" +msgstr "`Server Objects`_ 小节记录了从事件循环方法返回的类型,比如 :meth:`loop.create_server`;" + +#: ../../library/asyncio-eventloop.rst:99 +msgid "" +"The `Event Loop Implementations`_ section documents the " +":class:`SelectorEventLoop` and :class:`ProactorEventLoop` classes;" +msgstr "" +"`Event Loop Implementations`_ 章节记录了 :class:`SelectorEventLoop` 和 " +":class:`ProactorEventLoop` 类;" + +#: ../../library/asyncio-eventloop.rst:102 +msgid "" +"The `Examples`_ section showcases how to work with some event loop APIs." +msgstr "`Examples`_ 小节展示了如何使用某些事件循环 API。" + +#: ../../library/asyncio-eventloop.rst:109 +msgid "Event loop methods" +msgstr "事件循环方法集" + +#: ../../library/asyncio-eventloop.rst:111 +msgid "Event loops have **low-level** APIs for the following:" +msgstr "事件循环有下列 **低级** APIs:" + +#: ../../library/asyncio-eventloop.rst:119 +msgid "Running and stopping the loop" +msgstr "运行和停止循环" + +#: ../../library/asyncio-eventloop.rst:123 +msgid "Run until the *future* (an instance of :class:`Future`) has completed." +msgstr "运行直到 *future* ( :class:`Future` 的实例 ) 被完成。" + +#: ../../library/asyncio-eventloop.rst:126 +msgid "" +"If the argument is a :ref:`coroutine object ` it is implicitly " +"scheduled to run as a :class:`asyncio.Task`." +msgstr "如果参数是 :ref:`协程对象 ` 则将被隐式调度作为 :class:`asyncio.Task` 来运行。" + +#: ../../library/asyncio-eventloop.rst:129 +msgid "Return the Future's result or raise its exception." +msgstr "返回 Future 的结果 或者引发相关异常。" + +#: ../../library/asyncio-eventloop.rst:133 +msgid "Run the event loop until :meth:`stop` is called." +msgstr "运行事件循环直到 :meth:`stop` 被调用。" + +#: ../../library/asyncio-eventloop.rst:135 +msgid "" +"If :meth:`stop` is called before :meth:`run_forever` is called, the loop " +"will poll the I/O selector once with a timeout of zero, run all callbacks " +"scheduled in response to I/O events (and those that were already scheduled)," +" and then exit." +msgstr "" +"如果 :meth:`stop` 在调用 :meth:`run_forever` 之前被调用,循环将轮询一次 I/O " +"选择器并设置超时为零,再运行所有已加入计划任务的回调来响应 I/O 事件(以及已加入计划任务的事件),然后退出。" + +#: ../../library/asyncio-eventloop.rst:140 +msgid "" +"If :meth:`stop` is called while :meth:`run_forever` is running, the loop " +"will run the current batch of callbacks and then exit. Note that new " +"callbacks scheduled by callbacks will not run in this case; instead, they " +"will run the next time :meth:`run_forever` or :meth:`run_until_complete` is " +"called." +msgstr "" +"如果 :meth:`stop` 在 :meth:`run_forever` 运行期间被调用,循环将运行当前批次的回调然后退出。 " +"请注意在此情况下由回调加入计划任务的新回调将不会运行;它们将会在下次 :meth:`run_forever` 或 " +":meth:`run_until_complete` 被调用时运行。" + +#: ../../library/asyncio-eventloop.rst:148 +msgid "Stop the event loop." +msgstr "停止事件循环。" + +#: ../../library/asyncio-eventloop.rst:152 +msgid "Return ``True`` if the event loop is currently running." +msgstr "返回 ``True`` 如果事件循环当前正在运行。" + +#: ../../library/asyncio-eventloop.rst:156 +msgid "Return ``True`` if the event loop was closed." +msgstr "如果事件循环已经被关闭则返回 ``True``。" + +#: ../../library/asyncio-eventloop.rst:160 +msgid "Close the event loop." +msgstr "关闭事件循环。" + +#: ../../library/asyncio-eventloop.rst:162 +msgid "" +"The loop must not be running when this function is called. Any pending " +"callbacks will be discarded." +msgstr "当这个函数被调用的时候,循环必须处于非运行状态。待处理的回调将被丢弃。" + +#: ../../library/asyncio-eventloop.rst:165 +msgid "" +"This method clears all queues and shuts down the executor, but does not wait" +" for the executor to finish." +msgstr "此方法清除所有的队列并立即关闭执行器,不会等待执行器完成。" + +#: ../../library/asyncio-eventloop.rst:168 +msgid "" +"This method is idempotent and irreversible. No other methods should be " +"called after the event loop is closed." +msgstr "这个方法是幂等的和不可逆的。事件循环关闭后,不应调用其他方法。" + +#: ../../library/asyncio-eventloop.rst:174 +msgid "" +"Schedule all currently open :term:`asynchronous generator` objects to close " +"with an :meth:`~agen.aclose` call. After calling this method, the event " +"loop will issue a warning if a new asynchronous generator is iterated. This " +"should be used to reliably finalize all scheduled asynchronous generators." +msgstr "" +"安排所有当前打开的 :term:`asynchronous generator` 对象通过 :meth:`~agen.aclose` 调用来关闭。 " +"在调用此方法后,如果有新的异步生成器被迭代则事件循环将会发出警告。 这应当被用来可靠地最终化所有已加入计划任务的异步生成器。" + +#: ../../library/asyncio-eventloop.rst:180 +msgid "" +"Note that there is no need to call this function when :func:`asyncio.run` is" +" used." +msgstr "请注意当使用 :func:`asyncio.run` 时不必调用此函数。" + +#: ../../library/asyncio-eventloop.rst:183 +#: ../../library/asyncio-eventloop.rst:1397 +#: ../../library/asyncio-eventloop.rst:1859 +msgid "Example::" +msgstr "示例::" + +#: ../../library/asyncio-eventloop.rst:185 +msgid "" +"try:\n" +" loop.run_forever()\n" +"finally:\n" +" loop.run_until_complete(loop.shutdown_asyncgens())\n" +" loop.close()" +msgstr "" +"try:\n" +" loop.run_forever()\n" +"finally:\n" +" loop.run_until_complete(loop.shutdown_asyncgens())\n" +" loop.close()" + +#: ../../library/asyncio-eventloop.rst:196 +msgid "" +"Schedule the closure of the default executor and wait for it to join all of " +"the threads in the :class:`~concurrent.futures.ThreadPoolExecutor`. Once " +"this method has been called, using the default executor with " +":meth:`loop.run_in_executor` will raise a :exc:`RuntimeError`." +msgstr "" +"安排默认执行器的关闭并等待它合并 :class:`~concurrent.futures.ThreadPoolExecutor` 中的所有线程。 " +"一旦此方法被调用,将默认执行器与 :meth:`loop.run_in_executor` 一起使用将引发 :exc:`RuntimeError`。" + +#: ../../library/asyncio-eventloop.rst:202 +msgid "" +"The *timeout* parameter specifies the amount of time (in :class:`float` " +"seconds) the executor will be given to finish joining. With the default, " +"``None``, the executor is allowed an unlimited amount of time." +msgstr "" +"*timeout* 形参指定提供给执行器结束合并的时间限制(为 :class:`float` 形式的秒数)。 在默认情况下,该值为 " +"``None``,即允许执行器无时间限制地执行。" + +#: ../../library/asyncio-eventloop.rst:207 +msgid "" +"If the *timeout* is reached, a :exc:`RuntimeWarning` is emitted and the " +"default executor is terminated without waiting for its threads to finish " +"joining." +msgstr "如果达到了 *timeout*,将会发出 :exc:`RuntimeWarning` 并且默认执行器将会终结而不等待其线程结束合并。" + +#: ../../library/asyncio-eventloop.rst:213 +msgid "" +"Do not call this method when using :func:`asyncio.run`, as the latter " +"handles default executor shutdown automatically." +msgstr "当使用 :func:`asyncio.run` 时不要调用此方法,因为它会自动处理默认执行器的关闭。" + +#: ../../library/asyncio-eventloop.rst:218 +msgid "Added the *timeout* parameter." +msgstr "增加了 *timeout* 形参。" + +#: ../../library/asyncio-eventloop.rst:222 +msgid "Scheduling callbacks" +msgstr "安排回调" + +#: ../../library/asyncio-eventloop.rst:226 +msgid "" +"Schedule the *callback* :term:`callback` to be called with *args* arguments " +"at the next iteration of the event loop." +msgstr "安排 *callback* :term:`callback` 在事件循环的下一次迭代时附带 *args* 参数被调用。" + +#: ../../library/asyncio-eventloop.rst:229 +msgid "" +"Return an instance of :class:`asyncio.Handle`, which can be used later to " +"cancel the callback." +msgstr "返回一个 :class:`asyncio.Handle` 的实例,可在此后被用来取消回调。" + +#: ../../library/asyncio-eventloop.rst:232 +msgid "" +"Callbacks are called in the order in which they are registered. Each " +"callback will be called exactly once." +msgstr "回调按其注册顺序被调用。每个回调仅被调用一次。" + +#: ../../library/asyncio-eventloop.rst:235 +msgid "" +"The optional keyword-only *context* argument specifies a custom " +":class:`contextvars.Context` for the *callback* to run in. Callbacks use the" +" current context when no *context* is provided." +msgstr "" +"可选的仅限关键字参数 *context* 指定一个自定义的 :class:`contextvars.Context` 供 *callback* " +"在其中运行。 当未提供 *context* 时回调将使用当前上下文。" + +#: ../../library/asyncio-eventloop.rst:239 +msgid "Unlike :meth:`call_soon_threadsafe`, this method is not thread-safe." +msgstr "与 :meth:`call_soon_threadsafe` 不同,此方法不是线程安全的。" + +#: ../../library/asyncio-eventloop.rst:243 +msgid "" +"A thread-safe variant of :meth:`call_soon`. When scheduling callbacks from " +"another thread, this function *must* be used, since :meth:`call_soon` is not" +" thread-safe." +msgstr "" +":meth:`call_soon` 的线程安全版。 当从另一个线程安排回调时,*必须* 使用此函数,因为 :meth:`call_soon` " +"不是线程安全的。" + +#: ../../library/asyncio-eventloop.rst:247 +msgid "" +"This function is safe to be called from a reentrant context or signal " +"handler, however, it is not safe or fruitful to use the returned handle in " +"such contexts." +msgstr "此函数可以从一个重入上下文或信号处理器安全地调用,不过,在这样的上下文中使用所返回的句柄则不是安全或有益的。" + +#: ../../library/asyncio-eventloop.rst:250 +msgid "" +"Raises :exc:`RuntimeError` if called on a loop that's been closed. This can " +"happen on a secondary thread when the main application is shutting down." +msgstr "如果在已被关闭的循环上调用则会引发 :exc:`RuntimeError`。 这可能会在主应用程序被关闭时在二级线程上发生。" + +#: ../../library/asyncio-eventloop.rst:254 +msgid "" +"See the :ref:`concurrency and multithreading ` " +"section of the documentation." +msgstr "" +"参见 :ref:`concurrency and multithreading ` 部分的文档。" + +#: ../../library/asyncio-eventloop.rst:257 +#: ../../library/asyncio-eventloop.rst:314 +#: ../../library/asyncio-eventloop.rst:340 +msgid "" +"The *context* keyword-only parameter was added. See :pep:`567` for more " +"details." +msgstr "加入仅限关键字形参 *context*。请参阅 :pep:`567` 查看更多细节。" + +#: ../../library/asyncio-eventloop.rst:265 +msgid "" +"Most :mod:`asyncio` scheduling functions don't allow passing keyword " +"arguments. To do that, use :func:`functools.partial`::" +msgstr "大多数 :mod:`asyncio` 的调度函数不允许传递关键字参数。为此,请使用 :func:`functools.partial`::" + +#: ../../library/asyncio-eventloop.rst:268 +msgid "" +"# will schedule \"print(\"Hello\", flush=True)\"\n" +"loop.call_soon(\n" +" functools.partial(print, \"Hello\", flush=True))" +msgstr "" +"# 将把 \"print(\"Hello\", flush=True)\" 加入计划任务\n" +"loop.call_soon(\n" +" functools.partial(print, \"Hello\", flush=True))" + +#: ../../library/asyncio-eventloop.rst:272 +msgid "" +"Using partial objects is usually more convenient than using lambdas, as " +"asyncio can render partial objects better in debug and error messages." +msgstr "使用 partial 对象通常比使用 lambda 更方便,asyncio 在调试和错误消息中能更好的呈现 partial 对象。" + +#: ../../library/asyncio-eventloop.rst:280 +msgid "Scheduling delayed callbacks" +msgstr "调度延迟回调" + +#: ../../library/asyncio-eventloop.rst:282 +msgid "" +"Event loop provides mechanisms to schedule callback functions to be called " +"at some point in the future. Event loop uses monotonic clocks to track " +"time." +msgstr "事件循环提供安排调度函数在将来某个时刻调用的机制。事件循环使用单调时钟来跟踪时间。" + +#: ../../library/asyncio-eventloop.rst:289 +msgid "" +"Schedule *callback* to be called after the given *delay* number of seconds " +"(can be either an int or a float)." +msgstr "安排 *callback* 在给定的 *delay* 秒(可以是 int 或者 float)后被调用。" + +#: ../../library/asyncio-eventloop.rst:292 +#: ../../library/asyncio-eventloop.rst:331 +msgid "" +"An instance of :class:`asyncio.TimerHandle` is returned which can be used to" +" cancel the callback." +msgstr "返回一个 :class:`asyncio.TimerHandle` 实例,该实例能用于取消回调。" + +#: ../../library/asyncio-eventloop.rst:295 +msgid "" +"*callback* will be called exactly once. If two callbacks are scheduled for " +"exactly the same time, the order in which they are called is undefined." +msgstr "*callback* 只被调用一次。如果两个回调被安排在同样的时间点,执行顺序未限定。" + +#: ../../library/asyncio-eventloop.rst:299 +msgid "" +"The optional positional *args* will be passed to the callback when it is " +"called. Use :func:`functools.partial` :ref:`to pass keyword arguments " +"` to *callback*." +msgstr "" +"可选的位置参数 *args* 将在回调被调用时传入。 使用 :func:`functools.partial` :ref:`将关键字参数 " +"` 传给 *callback*。" + +#: ../../library/asyncio-eventloop.rst:304 +msgid "" +"An optional keyword-only *context* argument allows specifying a custom " +":class:`contextvars.Context` for the *callback* to run in. The current " +"context is used when no *context* is provided." +msgstr "" +"可选的仅限关键字参数 *context* 允许 *callback* 运行在一个指定的自定义 :class:`contextvars.Context` " +"对象中。如果没有提供 *context* ,则使用当前上下文。" + +#: ../../library/asyncio-eventloop.rst:310 +msgid "" +"For performance, callbacks scheduled with :meth:`loop.call_later` may run up" +" to one clock-resolution early (see " +"``time.get_clock_info('monotonic').resolution``)." +msgstr "" +"出于性能考虑,使用 :meth:`loop.call_later` 调度的回调函数可能会提前最多一个时钟分辨率的时间执行(具体精度可通过 " +"``time.get_clock_info('monotonic').resolution`` 查看)。" + +#: ../../library/asyncio-eventloop.rst:318 +msgid "" +"In Python 3.7 and earlier with the default event loop implementation, the " +"*delay* could not exceed one day. This has been fixed in Python 3.8." +msgstr "在 Python 3.7 和更早版本的默认事件循环实现中, *delay* 不能超过一天。这在 Python 3.8 中已被修复。" + +#: ../../library/asyncio-eventloop.rst:325 +msgid "" +"Schedule *callback* to be called at the given absolute timestamp *when* (an " +"int or a float), using the same time reference as :meth:`loop.time`." +msgstr "" +"安排 *callback* 在给定的绝对时间戳 *when* (int 或 float) 被调用,使用与 :meth:`loop.time` " +"同样的时间参考。" + +#: ../../library/asyncio-eventloop.rst:329 +msgid "This method's behavior is the same as :meth:`call_later`." +msgstr "本方法的行为和 :meth:`call_later` 方法相同。" + +#: ../../library/asyncio-eventloop.rst:336 +msgid "" +"For performance, callbacks scheduled with :meth:`loop.call_at` may run up to" +" one clock-resolution early (see " +"``time.get_clock_info('monotonic').resolution``)." +msgstr "" +"出于性能考虑,使用 :meth:`loop.call_at` 调度的回调函数可能会提前最多一个时钟分辨率的时间执行(具体精度可通过 " +"``time.get_clock_info('monotonic').resolution`` 查看)。" + +#: ../../library/asyncio-eventloop.rst:344 +msgid "" +"In Python 3.7 and earlier with the default event loop implementation, the " +"difference between *when* and the current time could not exceed one day. " +"This has been fixed in Python 3.8." +msgstr "" +"在 Python 3.7 和更早版本的默认事件循环实现中,*when* 和当前时间相差不能超过一天。 在 Python 3.8 中已被修复。" + +#: ../../library/asyncio-eventloop.rst:351 +msgid "" +"Return the current time, as a :class:`float` value, according to the event " +"loop's internal monotonic clock." +msgstr "根据事件循环内部的单调时钟,返回当前时间为一个 :class:`float` 值。" + +#: ../../library/asyncio-eventloop.rst:355 +msgid "" +"In Python 3.7 and earlier timeouts (relative *delay* or absolute *when*) " +"should not exceed one day. This has been fixed in Python 3.8." +msgstr "" +"在 Python 3.7 和更早版本中超时 (相对的 *delay* 或绝对的 *when*) 不能超过一天。这在 Python 3.8 中已被修复。" + +#: ../../library/asyncio-eventloop.rst:361 +msgid "The :func:`asyncio.sleep` function." +msgstr ":func:`asyncio.sleep` 函数。" + +#: ../../library/asyncio-eventloop.rst:365 +msgid "Creating futures and tasks" +msgstr "创建 Future 和 Task" + +#: ../../library/asyncio-eventloop.rst:369 +msgid "Create an :class:`asyncio.Future` object attached to the event loop." +msgstr "创建一个附加到事件循环中的 :class:`asyncio.Future` 对象。" + +#: ../../library/asyncio-eventloop.rst:371 +msgid "" +"This is the preferred way to create Futures in asyncio. This lets third-" +"party event loops provide alternative implementations of the Future object " +"(with better performance or instrumentation)." +msgstr "" +"这是在 asyncio 中创建 Futures 的首选方式。这让第三方事件循环可以提供 Future 对象的替代实现 (更好的性能或者功能)。" + +#: ../../library/asyncio-eventloop.rst:379 +msgid "" +"Schedule the execution of :ref:`coroutine ` *coro*. Return a " +":class:`Task` object." +msgstr "将 :ref:`协程 ` *coro* 的执行加入计划任务。 返回一个 :class:`Task` 对象。" + +#: ../../library/asyncio-eventloop.rst:382 +msgid "" +"Third-party event loops can use their own subclass of :class:`Task` for " +"interoperability. In this case, the result type is a subclass of " +":class:`Task`." +msgstr "" +"第三方的事件循环可以使用它们自己的 :class:`Task` 子类来满足互操作性。这种情况下结果类型是一个 :class:`Task` 的子类。" + +#: ../../library/asyncio-eventloop.rst:386 +msgid "" +"The full function signature is largely the same as that of the :class:`Task`" +" constructor (or factory) - all of the keyword arguments to this function " +"are passed through to that interface." +msgstr "完整函数签名与 :class:`Task` 构造器(或工厂函数)的大致相同 —— 所有传给此函数的关键字参数都会被传给该接口。" + +#: ../../library/asyncio-eventloop.rst:390 +msgid "" +"If the *name* argument is provided and not ``None``, it is set as the name " +"of the task using :meth:`Task.set_name`." +msgstr "如果提供了 *name* 参数且不为 ``None``,它会使用 :meth:`Task.set_name` 来设为任务的名称。" + +#: ../../library/asyncio-eventloop.rst:393 +msgid "" +"An optional keyword-only *context* argument allows specifying a custom " +":class:`contextvars.Context` for the *coro* to run in. The current context " +"copy is created when no *context* is provided." +msgstr "" +"可选的 *context* 参数允许指定自定义的 :class:`contextvars.Context` 供 *coro* 运行。当未提供 " +"*context* 时将创建当前上下文的副本。" + +#: ../../library/asyncio-eventloop.rst:397 +msgid "" +"An optional keyword-only *eager_start* argument allows specifying if the " +"task should execute eagerly during the call to create_task, or be scheduled " +"later. If *eager_start* is not passed the mode set by " +":meth:`loop.set_task_factory` will be used." +msgstr "" +"一个可选的只有关键字的 *eager_start* 参数允许指定任务是应该在调用 create_task 期间紧急执行,还是稍后调度。如果没有传递 " +"*eager_start*,则会使用 :meth:`loop.set_task_factory` 设置的模式。" + +#: ../../library/asyncio-eventloop.rst:402 +msgid "Added the *name* parameter." +msgstr "添加了 *name* 参数。" + +#: ../../library/asyncio-eventloop.rst:405 +msgid "Added the *context* parameter." +msgstr "增加了 *context* 形参。" + +#: ../../library/asyncio-eventloop.rst:408 +msgid "" +"Added ``kwargs`` which passes on arbitrary extra parameters, including " +"``name`` and ``context``." +msgstr "增加了 ``kwargs``,它将传递任意附加形参,包括 ``name`` 和 ``context``。" + +#: ../../library/asyncio-eventloop.rst:411 +msgid "" +"Rolled back the change that passes on *name* and *context* (if it is None), " +"while still passing on other arbitrary keyword arguments (to avoid breaking " +"backwards compatibility with 3.13.3)." +msgstr "" +"撤回传递 *name* 和 *context* (如果其为 None) 的更改,虽然仍会传递其他任何关键字参数(以避免破坏与 3.13.3 " +"的向下兼容)。" + +#: ../../library/asyncio-eventloop.rst:415 +msgid "" +"All *kwargs* are now passed on. The *eager_start* parameter works with eager" +" task factories." +msgstr "现在所有 *kwargs* 都会被传递。 *eager_start* 形参适用于主动型任务工厂。" + +#: ../../library/asyncio-eventloop.rst:420 +msgid "Set a task factory that will be used by :meth:`loop.create_task`." +msgstr "设置一个任务工厂,它将由 :meth:`loop.create_task` 来使用。" + +#: ../../library/asyncio-eventloop.rst:423 +msgid "" +"If *factory* is ``None`` the default task factory will be set. Otherwise, " +"*factory* must be a *callable* with the signature matching ``(loop, coro, " +"**kwargs)``, where *loop* is a reference to the active event loop, and " +"*coro* is a coroutine object. The callable must pass on all *kwargs*, and " +"return a :class:`asyncio.Task`-compatible object." +msgstr "" +"如果 *factory* 为 ``None`` 则将设置默认的任务工厂。在其他情况下,*factory* 必须是一个 *可调用对象* 且其签名要匹配 " +"``(loop, coro, **kwargs)``,其中 *loop* 是一个指向活动事件循环的引用,而 *coro* 是一个协程对象。 " +"该可调用对象必须传递所有 *kwargs*,并且返回一个 :class:`asyncio.Task` 兼容对象。" + +#: ../../library/asyncio-eventloop.rst:429 +msgid "Required that all *kwargs* are passed on to :class:`asyncio.Task`." +msgstr "要求所有 *kwargs* 被传递给 :class:`asyncio.Task`。" + +#: ../../library/asyncio-eventloop.rst:432 +msgid "" +"*name* is no longer passed to task factories. *context* is no longer passed " +"to task factories if it is ``None``." +msgstr "*name* 不再会被传递给任务工厂函数。如果其为 ``None`` 则 *context* 也不再会被传递给任务工厂函数。" + +#: ../../library/asyncio-eventloop.rst:436 +msgid "" +"*name* and *context* are now unconditionally passed on to task factories " +"again." +msgstr "现在 *name* 和 *context* 会被无条件地再次传递给任务工厂。" + +#: ../../library/asyncio-eventloop.rst:441 +msgid "Return a task factory or ``None`` if the default one is in use." +msgstr "返回一个任务工厂,或者如果是使用默认值则返回 ``None``。" + +#: ../../library/asyncio-eventloop.rst:445 +msgid "Opening network connections" +msgstr "打开网络连接" + +#: ../../library/asyncio-eventloop.rst:457 +msgid "" +"Open a streaming transport connection to a given address specified by *host*" +" and *port*." +msgstr "打开一个流式传输连接,连接到由 *host* 和 *port* 指定的地址。" + +#: ../../library/asyncio-eventloop.rst:460 +msgid "" +"The socket family can be either :py:const:`~socket.AF_INET` or " +":py:const:`~socket.AF_INET6` depending on *host* (or the *family* argument, " +"if provided)." +msgstr "" +"套接字族可以是 :py:const:`~socket.AF_INET` 或 :py:const:`~socket.AF_INET6`,具体取决于 " +"*host* (或 *family* 参数,如果有提供的话)。" + +#: ../../library/asyncio-eventloop.rst:464 +msgid "The socket type will be :py:const:`~socket.SOCK_STREAM`." +msgstr "套接字类型将为 :py:const:`~socket.SOCK_STREAM`。" + +#: ../../library/asyncio-eventloop.rst:466 +#: ../../library/asyncio-eventloop.rst:1274 +#: ../../library/asyncio-eventloop.rst:1293 +msgid "" +"*protocol_factory* must be a callable returning an :ref:`asyncio protocol " +"` implementation." +msgstr "" +"*protocol_factory* 必须为一个返回 :ref:`asyncio 协议 ` 实现的可调用对象。" + +#: ../../library/asyncio-eventloop.rst:469 +msgid "" +"This method will try to establish the connection in the background. When " +"successful, it returns a ``(transport, protocol)`` pair." +msgstr "这个方法会尝试在后台创建连接。当创建成功,返回 ``(transport, protocol)`` 组合。" + +#: ../../library/asyncio-eventloop.rst:472 +msgid "The chronological synopsis of the underlying operation is as follows:" +msgstr "底层操作的大致的执行顺序是这样的:" + +#: ../../library/asyncio-eventloop.rst:474 +msgid "" +"The connection is established and a :ref:`transport ` is " +"created for it." +msgstr "创建连接并为其创建一个 :ref:`传输 `。" + +#: ../../library/asyncio-eventloop.rst:477 +msgid "" +"*protocol_factory* is called without arguments and is expected to return a " +":ref:`protocol ` instance." +msgstr "不带参数地调用 *protocol_factory* 并预期返回一个 :ref:`协议 ` 实例。" + +#: ../../library/asyncio-eventloop.rst:480 +msgid "" +"The protocol instance is coupled with the transport by calling its " +":meth:`~BaseProtocol.connection_made` method." +msgstr "协议实例通过调用其 :meth:`~BaseProtocol.connection_made` 方法与传输进行配对。" + +#: ../../library/asyncio-eventloop.rst:483 +msgid "A ``(transport, protocol)`` tuple is returned on success." +msgstr "成功时返回一个 ``(transport, protocol)`` 元组。" + +#: ../../library/asyncio-eventloop.rst:485 +msgid "" +"The created transport is an implementation-dependent bidirectional stream." +msgstr "创建的传输是一个具体实现相关的双向流。" + +#: ../../library/asyncio-eventloop.rst:488 +#: ../../library/asyncio-eventloop.rst:621 +msgid "Other arguments:" +msgstr "其他参数:" + +#: ../../library/asyncio-eventloop.rst:490 +msgid "" +"*ssl*: if given and not false, a SSL/TLS transport is created (by default a " +"plain TCP transport is created). If *ssl* is a :class:`ssl.SSLContext` " +"object, this context is used to create the transport; if *ssl* is " +":const:`True`, a default context returned from " +":func:`ssl.create_default_context` is used." +msgstr "" +"*ssl*: 如果给定该参数且不为假值,则会创建一个 SSL/TLS 传输(默认创建一个纯 TCP 传输)。如果 *ssl* 是一个 " +":class:`ssl.SSLContext` 对象,则会使用此上下文来创建传输对象;如果 *ssl* 为 :const:`True`,则会使用从 " +":func:`ssl.create_default_context` 返回的默认上下文。" + +#: ../../library/asyncio-eventloop.rst:496 +msgid ":ref:`SSL/TLS security considerations `" +msgstr ":ref:`SSL/TLS 安全考量 `" + +#: ../../library/asyncio-eventloop.rst:498 +msgid "" +"*server_hostname* sets or overrides the hostname that the target server's " +"certificate will be matched against. Should only be passed if *ssl* is not " +"``None``. By default the value of the *host* argument is used. If *host* " +"is empty, there is no default and you must pass a value for " +"*server_hostname*. If *server_hostname* is an empty string, hostname " +"matching is disabled (which is a serious security risk, allowing for " +"potential man-in-the-middle attacks)." +msgstr "" +"*server_hostname* 设置或覆盖目标服务器的证书将要匹配的主机名。应当只在 *ssl* 不为 ``None`` 时传入。 默认情况下会使用" +" *host* 参数的值。如果 *host* 为空那就没有默认值,你必须为 *server_hostname* 传入一个值。如果 " +"*server_hostname* 为空字符串,则主机名匹配会被禁用(这是一个严重的安全风险,使得潜在的中间人攻击成为可能)。" + +#: ../../library/asyncio-eventloop.rst:506 +msgid "" +"*family*, *proto*, *flags* are the optional address family, protocol and " +"flags to be passed through to getaddrinfo() for *host* resolution. If given," +" these should all be integers from the corresponding :mod:`socket` module " +"constants." +msgstr "" +"*family*, *proto*, *flags* 是可选的地址族、协议和标志,它们会被传递给 getaddrinfo() 来对 *host* " +"进行解析。如果要指定的话,这些都应该是来自于 :mod:`socket` 模块的对应常量。" + +#: ../../library/asyncio-eventloop.rst:511 +msgid "" +"*happy_eyeballs_delay*, if given, enables Happy Eyeballs for this " +"connection. It should be a floating-point number representing the amount of " +"time in seconds to wait for a connection attempt to complete, before " +"starting the next attempt in parallel. This is the \"Connection Attempt " +"Delay\" as defined in :rfc:`8305`. A sensible default value recommended by " +"the RFC is ``0.25`` (250 milliseconds)." +msgstr "" +"如果给出 *happy_eyeballs_delay*,它将为此连接启用 Happy Eyeballs。 " +"该函数应当为一个表示在开始下一个并行尝试之前要等待连接尝试完成的秒数的浮点数。这也就是在 :rfc:`8305` 中定义的 \"连接尝试延迟\"。该 " +"RFC 所推荐的合理默认值为 ``0.25`` (250 毫秒)。" + +#: ../../library/asyncio-eventloop.rst:519 +msgid "" +"*interleave* controls address reordering when a host name resolves to " +"multiple IP addresses. If ``0`` or unspecified, no reordering is done, and " +"addresses are tried in the order returned by :meth:`getaddrinfo`. If a " +"positive integer is specified, the addresses are interleaved by address " +"family, and the given integer is interpreted as \"First Address Family " +"Count\" as defined in :rfc:`8305`. The default is ``0`` if " +"*happy_eyeballs_delay* is not specified, and ``1`` if it is." +msgstr "" +"*interleave* 控制当主机名解析为多个 IP 地址时的地址重排序。如果该参数为 ``0`` 或未指定,则不会进行重排序,这些地址会按 " +":meth:`getaddrinfo` 所返回的顺序进行尝试。如果指定了一个正整数,这些地址会按地址族交错排列,而指定的整数会被解读为 " +":rfc:`8305` 所定义的 \"首个地址族计数\"。如果 *happy_eyeballs_delay* 未指定则默认值为 ``0``,否则为 " +"``1``。" + +#: ../../library/asyncio-eventloop.rst:528 +msgid "" +"*sock*, if given, should be an existing, already connected " +":class:`socket.socket` object to be used by the transport. If *sock* is " +"given, none of *host*, *port*, *family*, *proto*, *flags*, " +"*happy_eyeballs_delay*, *interleave* and *local_addr* should be specified." +msgstr "" +"如果给出 *sock*,它应当是一个已存在、已连接并将被传输所使用的 :class:`socket.socket` 对象。如果给出了 *sock*,则 " +"*host*, *port*, *family*, *proto*, *flags*, *happy_eyeballs_delay*, " +"*interleave* 和 *local_addr* 都不应当被指定。" + +#: ../../library/asyncio-eventloop.rst:536 +#: ../../library/asyncio-eventloop.rst:658 +#: ../../library/asyncio-eventloop.rst:906 +msgid "" +"The *sock* argument transfers ownership of the socket to the transport " +"created. To close the socket, call the transport's " +":meth:`~asyncio.BaseTransport.close` method." +msgstr "" +"*sock* 参数可将套接字的所有权转给所创建的传输。要关闭该套接字,请调用传输的 " +":meth:`~asyncio.BaseTransport.close` 方法。" + +#: ../../library/asyncio-eventloop.rst:540 +msgid "" +"*local_addr*, if given, is a ``(local_host, local_port)`` tuple used to bind" +" the socket locally. The *local_host* and *local_port* are looked up using " +"``getaddrinfo()``, similarly to *host* and *port*." +msgstr "" +"如果给出 *local_addr*,它应当是一个用来在本地绑定套接字的 ``(local_host, local_port)`` 元组。 " +"*local_host* 和 *local_port* 会使用 ``getaddrinfo()`` 来查找,这与 *host* 和 *port* 类似。" + +#: ../../library/asyncio-eventloop.rst:544 +#: ../../library/asyncio-eventloop.rst:1002 +msgid "" +"*ssl_handshake_timeout* is (for a TLS connection) the time in seconds to " +"wait for the TLS handshake to complete before aborting the connection. " +"``60.0`` seconds if ``None`` (default)." +msgstr "" +"*ssl_handshake_timeout* 是(用于 TLS 连接的)在放弃连接之前要等待 TLS 握手完成的秒数。如果参数为 ``None`` " +"则使用 (默认的) ``60.0``。" + +#: ../../library/asyncio-eventloop.rst:548 +#: ../../library/asyncio-eventloop.rst:813 +#: ../../library/asyncio-eventloop.rst:917 +#: ../../library/asyncio-eventloop.rst:1006 +msgid "" +"*ssl_shutdown_timeout* is the time in seconds to wait for the SSL shutdown " +"to complete before aborting the connection. ``30.0`` seconds if ``None`` " +"(default)." +msgstr "" +"*ssl_shutdown_timeout* 是在放弃连接之前要等待 SSL 关闭完成的秒数。如为 ``None`` (默认值) 则使用 " +"``30.0``。" + +#: ../../library/asyncio-eventloop.rst:552 +msgid "" +"*all_errors* determines what exceptions are raised when a connection cannot " +"be created. By default, only a single ``Exception`` is raised: the first " +"exception if there is only one or all errors have same message, or a single " +"``OSError`` with the error messages combined. When ``all_errors`` is " +"``True``, an ``ExceptionGroup`` will be raised containing all exceptions " +"(even if there is only one)." +msgstr "" +"*all_errors* 确定当无法创建连接时要引发何种异常。在默认情况下,只有一个 ``Exception`` " +"会被引发:即只有一个异常或所有错误的消息相同,或者是合并了多个错误消息的单个 ``OSError``。当 ``all_errors`` 为 " +"``True`` 时,将引发一个包含所有异常的 ``ExceptionGroup`` (即使只有一个异常)。" + +#: ../../library/asyncio-eventloop.rst:562 +#: ../../library/asyncio-eventloop.rst:825 +msgid "Added support for SSL/TLS in :class:`ProactorEventLoop`." +msgstr ":class:`ProactorEventLoop` 类中添加 SSL/TLS 支持。" + +#: ../../library/asyncio-eventloop.rst:566 +msgid "" +"The socket option :ref:`socket.TCP_NODELAY ` is set " +"by default for all TCP connections." +msgstr "" +"套接字选项 :ref:`socket.TCP_NODELAY ` 默认将为所有 TCP 连接设置。" + +#: ../../library/asyncio-eventloop.rst:571 +#: ../../library/asyncio-eventloop.rst:927 +msgid "Added the *ssl_handshake_timeout* parameter." +msgstr "添加了 *ssl_handshake_timeout* 参数。" + +#: ../../library/asyncio-eventloop.rst:575 +msgid "Added the *happy_eyeballs_delay* and *interleave* parameters." +msgstr "增加了 *happy_eyeballs_delay* 和 *interleave* 形参。" + +#: ../../library/asyncio-eventloop.rst:577 +msgid "" +"Happy Eyeballs Algorithm: Success with Dual-Stack Hosts. When a server's " +"IPv4 path and protocol are working, but the server's IPv6 path and protocol " +"are not working, a dual-stack client application experiences significant " +"connection delay compared to an IPv4-only client. This is undesirable " +"because it causes the dual-stack client to have a worse user experience. " +"This document specifies requirements for algorithms that reduce this user-" +"visible delay and provides an algorithm." +msgstr "" +"Happy Eyeballs 算法:成功使用双栈主机。当服务器的 IPv4 路径和协议工作正常,但服务器的 IPv6 " +"路径和协议工作不正常时,双线客户端应用程序相比仅有 IPv4 的客户端会感受到明显的连接延迟。这是不可接受的因为它会导致双栈客户端糟糕的用户体验。 " +"这篇文档指明了减少这种用户可见延迟的算法要求并提供了具体的算法。" + +#: ../../library/asyncio-eventloop.rst:586 +msgid "For more information: https://datatracker.ietf.org/doc/html/rfc6555" +msgstr "详情参见:https://datatracker.ietf.org/doc/html/rfc6555" + +#: ../../library/asyncio-eventloop.rst:590 +#: ../../library/asyncio-eventloop.rst:722 +#: ../../library/asyncio-eventloop.rst:839 +#: ../../library/asyncio-eventloop.rst:879 +#: ../../library/asyncio-eventloop.rst:931 +#: ../../library/asyncio-eventloop.rst:1014 +msgid "Added the *ssl_shutdown_timeout* parameter." +msgstr "添加了 *ssl_shutdown_timeout* 形参。" + +#: ../../library/asyncio-eventloop.rst:592 +msgid "*all_errors* was added." +msgstr "添加了 *all_errors*。" + +#: ../../library/asyncio-eventloop.rst:597 +msgid "" +"The :func:`open_connection` function is a high-level alternative API. It " +"returns a pair of (:class:`StreamReader`, :class:`StreamWriter`) that can be" +" used directly in async/await code." +msgstr "" +":func:`open_connection` 函数是一个高层级的替代 API。它返回一对 (:class:`StreamReader`, " +":class:`StreamWriter`),可在 async/await 代码中直接使用。" + +#: ../../library/asyncio-eventloop.rst:608 +msgid "Create a datagram connection." +msgstr "创建一个数据报连接。" + +#: ../../library/asyncio-eventloop.rst:610 +msgid "" +"The socket family can be either :py:const:`~socket.AF_INET`, " +":py:const:`~socket.AF_INET6`, or :py:const:`~socket.AF_UNIX`, depending on " +"*host* (or the *family* argument, if provided)." +msgstr "" +"套接字族可以是 :py:const:`~socket.AF_INET`, :py:const:`~socket.AF_INET6` 或 " +":py:const:`~socket.AF_UNIX`,具体取决于 *host* (或 *family* 参数,如果有提供的话)。" + +#: ../../library/asyncio-eventloop.rst:614 +msgid "The socket type will be :py:const:`~socket.SOCK_DGRAM`." +msgstr "套接字类型将为 :py:const:`~socket.SOCK_DGRAM`。" + +#: ../../library/asyncio-eventloop.rst:616 +#: ../../library/asyncio-eventloop.rst:749 +#: ../../library/asyncio-eventloop.rst:898 +msgid "" +"*protocol_factory* must be a callable returning a :ref:`protocol ` implementation." +msgstr "*protocol_factory* 必须为一个返回 :ref:`协议 ` 实现的可调用对象。" + +#: ../../library/asyncio-eventloop.rst:619 +#: ../../library/asyncio-eventloop.rst:704 +msgid "A tuple of ``(transport, protocol)`` is returned on success." +msgstr "成功时返回一个 ``(transport, protocol)`` 元组。" + +#: ../../library/asyncio-eventloop.rst:623 +msgid "" +"*local_addr*, if given, is a ``(local_host, local_port)`` tuple used to bind" +" the socket locally. The *local_host* and *local_port* are looked up using " +":meth:`getaddrinfo`." +msgstr "" +"如果给出 *local_addr*,它应当是一个用来在本地绑定套接字的 ``(local_host, local_port)`` 元组。 " +"*local_host* 和 *local_port* 是使用 :meth:`getaddrinfo` 来查找的。" + +#: ../../library/asyncio-eventloop.rst:629 +msgid "" +"On Windows, when using the proactor event loop with ``local_addr=None``, an " +":exc:`OSError` with :attr:`!errno.WSAEINVAL` will be raised when running it." +msgstr "" +"在 Windows 系统上,当使用 proactor 事件循环并且设置 ``local_addr=None`` 时,运行过程中将会引发一个带有 " +":attr:`!errno.WSAEINVAL` 错误码的 :exc:`OSError` 异常。" + +#: ../../library/asyncio-eventloop.rst:633 +msgid "" +"*remote_addr*, if given, is a ``(remote_host, remote_port)`` tuple used to " +"connect the socket to a remote address. The *remote_host* and *remote_port*" +" are looked up using :meth:`getaddrinfo`." +msgstr "" +"*remote_addr*,如果指定的话,就是一个 ``(remote_host, remote_port)`` " +"元组,用于同一个远程地址连接。*remote_host* 和 *remote_port* 是使用 :meth:`getaddrinfo` 来查找的。" + +#: ../../library/asyncio-eventloop.rst:637 +msgid "" +"*family*, *proto*, *flags* are the optional address family, protocol and " +"flags to be passed through to :meth:`getaddrinfo` for *host* resolution. If " +"given, these should all be integers from the corresponding :mod:`socket` " +"module constants." +msgstr "" +"*family*, *proto*, *flags* 是可选的地址族,协议和标志,其会被传递给 :meth:`getaddrinfo` 来完成 " +"*host* 的解析。如果要指定的话,这些都应该是来自于 :mod:`socket` 模块的对应常量。" + +#: ../../library/asyncio-eventloop.rst:642 +msgid "" +"*reuse_port* tells the kernel to allow this endpoint to be bound to the same" +" port as other existing endpoints are bound to, so long as they all set this" +" flag when being created. This option is not supported on Windows and some " +"Unixes. If the :ref:`socket.SO_REUSEPORT ` constant " +"is not defined then this capability is unsupported." +msgstr "" +"*reuse_port* 告知内核允许此端点绑定到其他现有端点所绑定的相同端口上,只要它们在创建时都设置了这个旗标。这个选项在 Windows 和某些 " +"Unix 上将不受支持。如果 :ref:`socket.SO_REUSEPORT ` " +"常量未被定义那么该功能就是不受支持的。" + +#: ../../library/asyncio-eventloop.rst:648 +msgid "" +"*allow_broadcast* tells the kernel to allow this endpoint to send messages " +"to the broadcast address." +msgstr "*allow_broadcast* 告知内核允许此端点向广播地址发送消息。" + +#: ../../library/asyncio-eventloop.rst:651 +msgid "" +"*sock* can optionally be specified in order to use a preexisting, already " +"connected, :class:`socket.socket` object to be used by the transport. If " +"specified, *local_addr* and *remote_addr* should be omitted (must be " +":const:`None`)." +msgstr "" +"*sock* 可选择通过指定此值用于使用一个预先存在的,已经处于连接状态的 :class:`socket.socket` " +"对象,并将其提供给此传输对象使用。如果指定了这个值, *local_addr* 和 *remote_addr* 就应该被忽略 (必须为 " +":const:`None`)." + +#: ../../library/asyncio-eventloop.rst:662 +msgid "" +"See :ref:`UDP echo client protocol ` and " +":ref:`UDP echo server protocol ` examples." +msgstr "" +"参见 :ref:`UDP echo 客户端协议 ` 和 :ref:`UDP " +"echo 服务端协议 ` 的例子。" + +#: ../../library/asyncio-eventloop.rst:665 +msgid "" +"The *family*, *proto*, *flags*, *reuse_address*, *reuse_port*, " +"*allow_broadcast*, and *sock* parameters were added." +msgstr "" +"添加了 *family*, *proto*, *flags*, *reuse_address*, *reuse_port*, " +"*allow_broadcast* 和 *sock* 等形参。" + +#: ../../library/asyncio-eventloop.rst:669 +msgid "Added support for Windows." +msgstr "添加 Windows 的支持。" + +#: ../../library/asyncio-eventloop.rst:672 +msgid "" +"The *reuse_address* parameter is no longer supported, as using " +":ref:`socket.SO_REUSEADDR ` poses a significant " +"security concern for UDP. Explicitly passing ``reuse_address=True`` will " +"raise an exception." +msgstr "" +"*reuse_address* 形参已不再受支持,因为使用 :ref:`socket.SO_REUSEADDR ` 对于 UDP 会造成显著的安全问题。显式地传入 ``reuse_address=True`` 将引发异常。" + +#: ../../library/asyncio-eventloop.rst:678 +msgid "" +"When multiple processes with differing UIDs assign sockets to an identical " +"UDP socket address with ``SO_REUSEADDR``, incoming packets can become " +"randomly distributed among the sockets." +msgstr "" +"当具有不同 UID 的多个进程将套接字赋给具有 ``SO_REUSEADDR`` 的相同 UDP 套接字地址时,传入的数据包可能会在套接字间随机分配。" + +#: ../../library/asyncio-eventloop.rst:682 +msgid "" +"For supported platforms, *reuse_port* can be used as a replacement for " +"similar functionality. With *reuse_port*, :ref:`socket.SO_REUSEPORT ` is used instead, which specifically prevents processes with" +" differing UIDs from assigning sockets to the same socket address." +msgstr "" +"对于受支持的平台,可以使用 *reuse_port* 作为类似功能的替代。通过 *reuse_port*,将会改用 " +":ref:`socket.SO_REUSEPORT `,它能防止具有不同 UID " +"的进程将套接字赋给相同的套接字地址。" + +#: ../../library/asyncio-eventloop.rst:689 +msgid "" +"The *reuse_address* parameter, disabled since Python 3.8.1, 3.7.6 and " +"3.6.10, has been entirely removed." +msgstr "自 Python 3.8.1, 3.7.6 和 3.6.10 起被禁用的 *reuse_address* 形参现已被完全移除。" + +#: ../../library/asyncio-eventloop.rst:699 +msgid "Create a Unix connection." +msgstr "创建 Unix 连接。" + +#: ../../library/asyncio-eventloop.rst:701 +msgid "" +"The socket family will be :py:const:`~socket.AF_UNIX`; socket type will be " +":py:const:`~socket.SOCK_STREAM`." +msgstr "" +"套接字族将为 :py:const:`~socket.AF_UNIX`;套接字类型将为 :py:const:`~socket.SOCK_STREAM`。" + +#: ../../library/asyncio-eventloop.rst:706 +msgid "" +"*path* is the name of a Unix domain socket and is required, unless a *sock* " +"parameter is specified. Abstract Unix sockets, :class:`str`, " +":class:`bytes`, and :class:`~pathlib.Path` paths are supported." +msgstr "" +"*path* 是所要求的 Unix 域套接字的名字,除非指定了 *sock* 形参。抽象的 Unix 套接字,:class:`str`, " +":class:`bytes` 和 :class:`~pathlib.Path` 路径都是受支持的。" + +#: ../../library/asyncio-eventloop.rst:711 +msgid "" +"See the documentation of the :meth:`loop.create_connection` method for " +"information about arguments to this method." +msgstr "请查看 :meth:`loop.create_connection` 方法的文档了解有关此方法的参数的信息。" + +#: ../../library/asyncio-eventloop.rst:714 +#: ../../library/asyncio-eventloop.rst:870 +#: ../../library/asyncio-eventloop.rst:1376 +#: ../../library/asyncio-eventloop.rst:1929 +#: ../../library/asyncio-eventloop.rst:1936 +msgid "Availability" +msgstr "Availability" + +#: ../../library/asyncio-eventloop.rst:716 +msgid "" +"Added the *ssl_handshake_timeout* parameter. The *path* parameter can now be" +" a :term:`path-like object`." +msgstr "" +"增加了 *ssl_handshake_timeout* 参数。现在 *path* 参数可以是一个 :term:`path-like object`。" + +#: ../../library/asyncio-eventloop.rst:726 +msgid "Creating network servers" +msgstr "创建网络服务" + +#: ../../library/asyncio-eventloop.rst:742 +msgid "" +"Create a TCP server (socket type :const:`~socket.SOCK_STREAM`) listening on " +"*port* of the *host* address." +msgstr "" +"创建一个 TCP 服务器 (套接字类型 :const:`~socket.SOCK_STREAM`) 在 *host* 地址的 *port* 上进行监听。" + +#: ../../library/asyncio-eventloop.rst:745 +msgid "Returns a :class:`Server` object." +msgstr "返回一个 :class:`Server` 对象。" + +#: ../../library/asyncio-eventloop.rst:747 +msgid "Arguments:" +msgstr "参数:" + +#: ../../library/asyncio-eventloop.rst:752 +msgid "" +"The *host* parameter can be set to several types which determine where the " +"server would be listening:" +msgstr "*host* 形参可被设为几种类型,它确定了服务器所应监听的位置:" + +#: ../../library/asyncio-eventloop.rst:755 +msgid "" +"If *host* is a string, the TCP server is bound to a single network interface" +" specified by *host*." +msgstr "如果 *host* 是一个字符串,则 TCP 服务器会被绑定到 *host* 所指明的单一网络接口。" + +#: ../../library/asyncio-eventloop.rst:758 +msgid "" +"If *host* is a sequence of strings, the TCP server is bound to all network " +"interfaces specified by the sequence." +msgstr "如果 *host* 是一个字符串序列,则 TCP 服务器会被绑定到序列所指明的所有网络接口。" + +#: ../../library/asyncio-eventloop.rst:761 +msgid "" +"If *host* is an empty string or ``None``, all interfaces are assumed and a " +"list of multiple sockets will be returned (most likely one for IPv4 and " +"another one for IPv6)." +msgstr "" +"如果 *host* 是一个空字符串或 ``None``,则会应用所有接口并将返回包含多个套接字的列表(通常是一个 IPv4 的加一个 IPv6 的)。" + +#: ../../library/asyncio-eventloop.rst:765 +msgid "" +"The *port* parameter can be set to specify which port the server should " +"listen on. If ``0`` or ``None`` (the default), a random unused port will be " +"selected (note that if *host* resolves to multiple network interfaces, a " +"different random port will be selected for each interface)." +msgstr "" +"可以设置 *port* 参数来指定服务器应该监听哪个端口。 如果为 ``0`` 或者 ``None`` " +"(默认值),将选择一个随机的未使用的端口(注意,如果 *host* 解析到多个网络接口,将为每个接口选择一个不同的随机端口)。" + +#: ../../library/asyncio-eventloop.rst:770 +msgid "" +"*family* can be set to either :const:`socket.AF_INET` or " +":const:`~socket.AF_INET6` to force the socket to use IPv4 or IPv6. If not " +"set, the *family* will be determined from host name (defaults to " +":const:`~socket.AF_UNSPEC`)." +msgstr "" +"*family* 可被设为 :const:`socket.AF_INET` 或 :const:`~socket.AF_INET6` 以强制此套接字使用 " +"IPv4 或 IPv6。如果未设定,则 *family* 将通过主机名来确定 (默认为 :const:`~socket.AF_UNSPEC`)。" + +#: ../../library/asyncio-eventloop.rst:775 +msgid "*flags* is a bitmask for :meth:`getaddrinfo`." +msgstr "*flags* 是用于 :meth:`getaddrinfo` 的位掩码。" + +#: ../../library/asyncio-eventloop.rst:777 +msgid "" +"*sock* can optionally be specified in order to use a preexisting socket " +"object. If specified, *host* and *port* must not be specified." +msgstr "可以选择指定 *sock* 以便使用预先存在的套接字对象。如果指定了此参数,则不可再指定 *host* 和 *port*。" + +#: ../../library/asyncio-eventloop.rst:782 +msgid "" +"The *sock* argument transfers ownership of the socket to the server created." +" To close the socket, call the server's :meth:`~asyncio.Server.close` " +"method." +msgstr "" +"*sock* 参数可将套接字的所有权转给所创建的服务器。要关闭该套接字,请调用服务器的 :meth:`~asyncio.Server.close` " +"方法。" + +#: ../../library/asyncio-eventloop.rst:786 +msgid "" +"*backlog* is the maximum number of queued connections passed to " +":meth:`~socket.socket.listen` (defaults to 100)." +msgstr "*backlog* 是传递给 :meth:`~socket.socket.listen` 的最大排队连接的数量(默认为 100)。" + +#: ../../library/asyncio-eventloop.rst:789 +msgid "" +"*ssl* can be set to an :class:`~ssl.SSLContext` instance to enable TLS over " +"the accepted connections." +msgstr "*ssl* 可被设置为一个 :class:`~ssl.SSLContext` 实例以在所接受的连接上启用 TLS。" + +#: ../../library/asyncio-eventloop.rst:792 +msgid "" +"*reuse_address* tells the kernel to reuse a local socket in ``TIME_WAIT`` " +"state, without waiting for its natural timeout to expire. If not specified " +"will automatically be set to ``True`` on Unix." +msgstr "" +"*reuse_address* 告知内核要重用一个处于 ``TIME_WAIT`` 状态的本地套接字,而不是等待其自然超时失效。如果未指定此参数则在 " +"Unix 上将自动设置为 ``True``。" + +#: ../../library/asyncio-eventloop.rst:797 +msgid "" +"*reuse_port* tells the kernel to allow this endpoint to be bound to the same" +" port as other existing endpoints are bound to, so long as they all set this" +" flag when being created. This option is not supported on Windows." +msgstr "" +"*reuse_port* 告知内核,只要在创建的时候都设置了这个标志,就允许此端点绑定到其它端点列表所绑定的同样的端口上。这个选项在 Windows " +"上是不支持的。" + +#: ../../library/asyncio-eventloop.rst:802 +msgid "" +"*keep_alive* set to ``True`` keeps connections active by enabling the " +"periodic transmission of messages." +msgstr "*keep_alive* 设为 ``True`` 将通过启用定期的消息传输来使连接保持活动状态。" + +#: ../../library/asyncio-eventloop.rst:807 +msgid "Added the *keep_alive* parameter." +msgstr "增加了 *keep_alive* 形参。" + +#: ../../library/asyncio-eventloop.rst:809 +msgid "" +"*ssl_handshake_timeout* is (for a TLS server) the time in seconds to wait " +"for the TLS handshake to complete before aborting the connection. ``60.0`` " +"seconds if ``None`` (default)." +msgstr "" +"*ssl_handshake_timeout* 是(用于 TLS 服务器的)在放弃连接之前要等待 TLS 握手完成的秒数。 如果为 ``None`` " +"(默认值) 则等于 ``60.0`` 秒。" + +#: ../../library/asyncio-eventloop.rst:817 +msgid "" +"*start_serving* set to ``True`` (the default) causes the created server to " +"start accepting connections immediately. When set to ``False``, the user " +"should await on :meth:`Server.start_serving` or :meth:`Server.serve_forever`" +" to make the server to start accepting connections." +msgstr "" +"*start_serving* 设置成 ``True`` (默认值) 会导致创建服务器并立即开始接受连接。 设置成 ``False``,用户需要等待 " +":meth:`Server.start_serving` 或者 :meth:`Server.serve_forever` 以使服务器开始接受连接。" + +#: ../../library/asyncio-eventloop.rst:829 +msgid "The *host* parameter can be a sequence of strings." +msgstr "*host* 形参可以是一个字符串的序列。" + +#: ../../library/asyncio-eventloop.rst:833 +msgid "" +"Added *ssl_handshake_timeout* and *start_serving* parameters. The socket " +"option :ref:`socket.TCP_NODELAY ` is set by default " +"for all TCP connections." +msgstr "" +"增加了 *ssl_handshake_timeout* 和 *start_serving* 形参。套接字选项 " +":ref:`socket.TCP_NODELAY ` 会默认为所有 TCP 连接设置。" + +#: ../../library/asyncio-eventloop.rst:843 +msgid "" +"The :func:`start_server` function is a higher-level alternative API that " +"returns a pair of :class:`StreamReader` and :class:`StreamWriter` that can " +"be used in an async/await code." +msgstr "" +":func:`start_server` 函数是一个高层级的替代 API,它返回一对 :class:`StreamReader` 和 " +":class:`StreamWriter`,可在 async/await 代码中使用。" + +#: ../../library/asyncio-eventloop.rst:855 +msgid "" +"Similar to :meth:`loop.create_server` but works with the " +":py:const:`~socket.AF_UNIX` socket family." +msgstr "" +"与 :meth:`loop.create_server` 类似但是专用于 :py:const:`~socket.AF_UNIX` 套接字族。" + +#: ../../library/asyncio-eventloop.rst:858 +msgid "" +"*path* is the name of a Unix domain socket, and is required, unless a *sock*" +" argument is provided. Abstract Unix sockets, :class:`str`, :class:`bytes`," +" and :class:`~pathlib.Path` paths are supported." +msgstr "" +"*path* 是必要的 Unix 域套接字名称,除非提供了 *sock* 参数。抽象的 Unix 套接字,:class:`str`, " +":class:`bytes` 和 :class:`~pathlib.Path` 路径都是受支持的。" + +#: ../../library/asyncio-eventloop.rst:863 +msgid "" +"If *cleanup_socket* is true then the Unix socket will automatically be " +"removed from the filesystem when the server is closed, unless the socket has" +" been replaced after the server has been created." +msgstr "" +"如果 *cleanup_socket* 为真值那么当服务器关闭时 Unix 套接字将自动从文件系统中被移除,除非套接字在服务器创建之后被替换。" + +#: ../../library/asyncio-eventloop.rst:867 +msgid "" +"See the documentation of the :meth:`loop.create_server` method for " +"information about arguments to this method." +msgstr "请查看 :meth:`loop.create_server` 方法的文档了解有关此方法的参数的信息。" + +#: ../../library/asyncio-eventloop.rst:874 +msgid "" +"Added the *ssl_handshake_timeout* and *start_serving* parameters. The *path*" +" parameter can now be a :class:`~pathlib.Path` object." +msgstr "" +"增加了 *ssl_handshake_timeout* 和 *start_serving* 参数。现在 *path* 参数可以是一个 " +":class:`~pathlib.Path` 对象。" + +#: ../../library/asyncio-eventloop.rst:883 +msgid "Added the *cleanup_socket* parameter." +msgstr "增加了 *cleanup_socket* 形参。" + +#: ../../library/asyncio-eventloop.rst:891 +msgid "Wrap an already accepted connection into a transport/protocol pair." +msgstr "将已被接受的连接包装成一个传输/协议对。" + +#: ../../library/asyncio-eventloop.rst:893 +msgid "" +"This method can be used by servers that accept connections outside of " +"asyncio but that use asyncio to handle them." +msgstr "此方法可被服务器用来接受 asyncio 以外的连接,但是使用 asyncio 来处理它们。" + +#: ../../library/asyncio-eventloop.rst:896 +#: ../../library/asyncio-eventloop.rst:988 +msgid "Parameters:" +msgstr "参数:" + +#: ../../library/asyncio-eventloop.rst:901 +msgid "" +"*sock* is a preexisting socket object returned from :meth:`socket.accept " +"`." +msgstr "" +"*sock* 是一个预先存在的套接字对象,它是由 :meth:`socket.accept ` 返回的。" + +#: ../../library/asyncio-eventloop.rst:910 +msgid "" +"*ssl* can be set to an :class:`~ssl.SSLContext` to enable SSL over the " +"accepted connections." +msgstr "*ssl* 可被设置为一个 :class:`~ssl.SSLContext` 以在接受的连接上启用 SSL。" + +#: ../../library/asyncio-eventloop.rst:913 +msgid "" +"*ssl_handshake_timeout* is (for an SSL connection) the time in seconds to " +"wait for the SSL handshake to complete before aborting the connection. " +"``60.0`` seconds if ``None`` (default)." +msgstr "" +"*ssl_handshake_timeout* 是 (为一个 SSL 连接) 在中止连接前,等待 SSL 握手完成的时间【单位秒】。如果为 " +"``None`` (缺省) 则是 ``60.0`` 秒。" + +#: ../../library/asyncio-eventloop.rst:921 +msgid "Returns a ``(transport, protocol)`` pair." +msgstr "返回一个 ``(transport, protocol)`` 对。" + +#: ../../library/asyncio-eventloop.rst:935 +msgid "Transferring files" +msgstr "传输文件" + +#: ../../library/asyncio-eventloop.rst:941 +msgid "" +"Send a *file* over a *transport*. Return the total number of bytes sent." +msgstr "将 *file* 通过 *transport* 发送。返回所发送的字节总数。" + +#: ../../library/asyncio-eventloop.rst:944 +msgid "The method uses high-performance :meth:`os.sendfile` if available." +msgstr "如果可用的话,该方法将使用高性能的 :meth:`os.sendfile`。" + +#: ../../library/asyncio-eventloop.rst:946 +msgid "*file* must be a regular file object opened in binary mode." +msgstr "*file* 必须是个二进制模式打开的常规文件对象。" + +#: ../../library/asyncio-eventloop.rst:948 +#: ../../library/asyncio-eventloop.rst:1218 +msgid "" +"*offset* tells from where to start reading the file. If specified, *count* " +"is the total number of bytes to transmit as opposed to sending the file " +"until EOF is reached. File position is always updated, even when this method" +" raises an error, and :meth:`file.tell() ` can be used to " +"obtain the actual number of bytes sent." +msgstr "" +"*offset* 指明从何处开始读取文件。如果指定了 *count*,它是要传输的字节总数而不再一直发送文件直至抵达 EOF。 " +"文件位置总是会被更新,即使此方法引发了错误,并可以使用 :meth:`file.tell() ` " +"来获取实际发送的字节总数。" + +#: ../../library/asyncio-eventloop.rst:955 +msgid "" +"*fallback* set to ``True`` makes asyncio to manually read and send the file " +"when the platform does not support the sendfile system call (e.g. Windows or" +" SSL socket on Unix)." +msgstr "" +"*fallback* 设为 ``True`` 会使得 asyncio 在平台不支持 sendfile 系统调用时手动读取并发送文件(例如 Windows" +" 或 Unix 上的 SSL 套接字)。" + +#: ../../library/asyncio-eventloop.rst:959 +msgid "" +"Raise :exc:`SendfileNotAvailableError` if the system does not support the " +"*sendfile* syscall and *fallback* is ``False``." +msgstr "" +"如果系统不支持 *sendfile* 系统调用且 *fallback* 为 ``False`` 则会引发 " +":exc:`SendfileNotAvailableError`." + +#: ../../library/asyncio-eventloop.rst:966 +msgid "TLS upgrade" +msgstr "TLS 升级" + +#: ../../library/asyncio-eventloop.rst:974 +msgid "Upgrade an existing transport-based connection to TLS." +msgstr "将现有基于传输的连接升级到 TLS。" + +#: ../../library/asyncio-eventloop.rst:976 +msgid "" +"Create a TLS coder/decoder instance and insert it between the *transport* " +"and the *protocol*. The coder/decoder implements both *transport*-facing " +"protocol and *protocol*-facing transport." +msgstr "" +"创建一个 TLS 编码器/解码器实例并将其插入到 *transport* 和 *protocol* 之间。该编码器/解码器同时实现了面向 " +"*transport* 的协议和面向 *protocol* 的传输。" + +#: ../../library/asyncio-eventloop.rst:980 +msgid "" +"Return the created two-interface instance. After *await*, the *protocol* " +"must stop using the original *transport* and communicate with the returned " +"object only because the coder caches *protocol*-side data and sporadically " +"exchanges extra TLS session packets with *transport*." +msgstr "" +"返回已创建的双接口实例。在 *await* 之后,*protocol* 必须停止使用原始 *transport* " +"并仅与所返回的对象通信,因为编码器会缓存 *protocol* 方的数据并会不定期地与 *transport* 交换额外的 TLS 会话数据包。" + +#: ../../library/asyncio-eventloop.rst:985 +msgid "" +"In some situations (e.g. when the passed transport is already closing) this " +"may return ``None``." +msgstr "在某些情况下(例如当传入的 transport 已经关闭)这可能返回 ``None``。" + +#: ../../library/asyncio-eventloop.rst:990 +msgid "" +"*transport* and *protocol* instances that methods like " +":meth:`~loop.create_server` and :meth:`~loop.create_connection` return." +msgstr "" +"由 :meth:`~loop.create_server` 和 :meth:`~loop.create_connection` 等方法所返回的 " +"*transport* 和 *protocol* 实例。" + +#: ../../library/asyncio-eventloop.rst:994 +msgid "*sslcontext*: a configured instance of :class:`~ssl.SSLContext`." +msgstr "*sslcontext* :一个已经配置好的 :class:`~ssl.SSLContext` 实例。" + +#: ../../library/asyncio-eventloop.rst:996 +msgid "" +"*server_side* pass ``True`` when a server-side connection is being upgraded " +"(like the one created by :meth:`~loop.create_server`)." +msgstr "" +"当服务端连接已升级时 (如 :meth:`~loop.create_server` 所创建的对象) *server_side* 会传入 " +"``True``." + +#: ../../library/asyncio-eventloop.rst:999 +msgid "" +"*server_hostname*: sets or overrides the host name that the target server's " +"certificate will be matched against." +msgstr "*server_hostname* :设置或者覆盖目标服务器证书中相对应的主机名。" + +#: ../../library/asyncio-eventloop.rst:1019 +msgid "Watching file descriptors" +msgstr "监控文件描述符" + +#: ../../library/asyncio-eventloop.rst:1023 +msgid "" +"Start monitoring the *fd* file descriptor for read availability and invoke " +"*callback* with the specified arguments once *fd* is available for reading." +msgstr "开始监视 *fd* 文件描述符以获取读取的可用性,一旦 *fd* 可用于读取,使用指定的参数调用 *callback* 。" + +#: ../../library/asyncio-eventloop.rst:1027 +#: ../../library/asyncio-eventloop.rst:1041 +msgid "" +"Any preexisting callback registered for *fd* is cancelled and replaced by " +"*callback*." +msgstr "任何为 *fd* 注册的预先存在的回调都会被取消并由 *callback* 代替。" + +#: ../../library/asyncio-eventloop.rst:1032 +msgid "" +"Stop monitoring the *fd* file descriptor for read availability. Returns " +"``True`` if *fd* was previously being monitored for reads." +msgstr "停止监视 *fd* 文件描述符的读取可用性。如果之前正在监视 *fd* 的读取则返回 ``True``。" + +#: ../../library/asyncio-eventloop.rst:1037 +msgid "" +"Start monitoring the *fd* file descriptor for write availability and invoke " +"*callback* with the specified arguments *args* once *fd* is available for " +"writing." +msgstr "开始监视 *fd* 文件描述符的写入可用性并在 *fd* 可用于写入时唤起 *callback* 并附带指定的参数 *args*。" + +#: ../../library/asyncio-eventloop.rst:1044 +#: ../../library/asyncio-eventloop.rst:1363 +msgid "" +"Use :func:`functools.partial` :ref:`to pass keyword arguments ` to *callback*." +msgstr "" +"使用 :func:`functools.partial` :ref:`传递关键字参数 ` 给 " +"*callback*." + +#: ../../library/asyncio-eventloop.rst:1049 +msgid "" +"Stop monitoring the *fd* file descriptor for write availability. Returns " +"``True`` if *fd* was previously being monitored for writes." +msgstr "停止监视 *fd* 文件描述符的写入可用性。如果之前正在监视 *fd* 的写入则返回 ``True``。" + +#: ../../library/asyncio-eventloop.rst:1052 +msgid "" +"See also :ref:`Platform Support ` section for some" +" limitations of these methods." +msgstr "另请查看 :ref:`平台支持 ` 一节了解以上方法的某些限制。" + +#: ../../library/asyncio-eventloop.rst:1057 +msgid "Working with socket objects directly" +msgstr "直接使用 socket 对象" + +#: ../../library/asyncio-eventloop.rst:1059 +msgid "" +"In general, protocol implementations that use transport-based APIs such as " +":meth:`loop.create_connection` and :meth:`loop.create_server` are faster " +"than implementations that work with sockets directly. However, there are " +"some use cases when performance is not critical, and working with " +":class:`~socket.socket` objects directly is more convenient." +msgstr "" +"通常,使用基于传输的 API 的协议实现,例如 :meth:`loop.create_connection` 和 " +":meth:`loop.create_server` 比直接使用套接字的实现更快。但是,在某些应用场景下性能并不非常重要,直接使用 " +":class:`~socket.socket` 对象会更方便。" + +#: ../../library/asyncio-eventloop.rst:1069 +msgid "" +"Receive up to *nbytes* from *sock*. Asynchronous version of " +":meth:`socket.recv() `." +msgstr "" +"从 *sock* 接收至多 *nbytes*。 :meth:`socket.recv() ` 的异步版本。" + +#: ../../library/asyncio-eventloop.rst:1072 +msgid "Return the received data as a bytes object." +msgstr "返回接收到的数据(bytes 对象)。" + +#: ../../library/asyncio-eventloop.rst:1074 +#: ../../library/asyncio-eventloop.rst:1089 +#: ../../library/asyncio-eventloop.rst:1101 +#: ../../library/asyncio-eventloop.rst:1114 +#: ../../library/asyncio-eventloop.rst:1130 +#: ../../library/asyncio-eventloop.rst:1146 +#: ../../library/asyncio-eventloop.rst:1157 +#: ../../library/asyncio-eventloop.rst:1193 +#: ../../library/asyncio-eventloop.rst:1232 +msgid "*sock* must be a non-blocking socket." +msgstr "*sock* 必须是个非阻塞套接字。" + +#: ../../library/asyncio-eventloop.rst:1076 +msgid "" +"Even though this method was always documented as a coroutine method, " +"releases before Python 3.7 returned a :class:`Future`. Since Python 3.7 this" +" is an ``async def`` method." +msgstr "" +"虽然这个方法总是被记录为协程方法,但它在 Python 3.7 之前的发行版中会返回一个 :class:`Future`。从 Python 3.7 " +"开始它则是一个 ``async def`` 方法。" + +#: ../../library/asyncio-eventloop.rst:1084 +msgid "" +"Receive data from *sock* into the *buf* buffer. Modeled after the blocking " +":meth:`socket.recv_into() ` method." +msgstr "" +"从 *sock* 接收数据放入 *buf* 缓冲区。模仿了阻塞型的 :meth:`socket.recv_into() " +"` 方法。" + +#: ../../library/asyncio-eventloop.rst:1087 +msgid "Return the number of bytes written to the buffer." +msgstr "返回写入缓冲区的字节数。" + +#: ../../library/asyncio-eventloop.rst:1096 +msgid "" +"Receive a datagram of up to *bufsize* from *sock*. Asynchronous version of " +":meth:`socket.recvfrom() `." +msgstr "" +"从 *sock* 接收最大为 *bufsize* 的数据报。 :meth:`socket.recvfrom() " +"` 的异步版本。" + +#: ../../library/asyncio-eventloop.rst:1099 +msgid "Return a tuple of (received data, remote address)." +msgstr "返回一个 (已接收数据,远程地址) 元组。" + +#: ../../library/asyncio-eventloop.rst:1108 +msgid "" +"Receive a datagram of up to *nbytes* from *sock* into *buf*. Asynchronous " +"version of :meth:`socket.recvfrom_into() `." +msgstr "" +"从 *sock* 接收最大为 *nbytes* 的数据报并放入 *buf*。 :meth:`socket.recvfrom_into() " +"` 的异步版本。" + +#: ../../library/asyncio-eventloop.rst:1112 +msgid "Return a tuple of (number of bytes received, remote address)." +msgstr "返回一个 (已接收字节数,远程地址) 元组。" + +#: ../../library/asyncio-eventloop.rst:1121 +msgid "" +"Send *data* to the *sock* socket. Asynchronous version of " +":meth:`socket.sendall() `." +msgstr "" +"将 *data* 发送到 *sock* 套接字。 :meth:`socket.sendall() ` " +"的异步版本。" + +#: ../../library/asyncio-eventloop.rst:1124 +msgid "" +"This method continues to send to the socket until either all data in *data* " +"has been sent or an error occurs. ``None`` is returned on success. On " +"error, an exception is raised. Additionally, there is no way to determine " +"how much data, if any, was successfully processed by the receiving end of " +"the connection." +msgstr "" +"此方法会持续发送数据到套接字直至 *data* 中的所有数据发送完毕或是有错误发生。当成功时会返回 ``None``。当发生错误时,会引发一个异常。 " +"此外,没有办法能确定有多少数据或是否有数据被连接的接收方成功处理。" + +#: ../../library/asyncio-eventloop.rst:1132 +#: ../../library/asyncio-eventloop.rst:1195 +msgid "" +"Even though the method was always documented as a coroutine method, before " +"Python 3.7 it returned a :class:`Future`. Since Python 3.7, this is an " +"``async def`` method." +msgstr "" +"虽然这个方法一直被标记为协程方法。但是,Python 3.7 之前,该方法返回 :class:`Future`,从 Python 3.7 " +"开始,这个方法是 ``async def`` 方法。" + +#: ../../library/asyncio-eventloop.rst:1140 +msgid "" +"Send a datagram from *sock* to *address*. Asynchronous version of " +":meth:`socket.sendto() `." +msgstr "" +"从 *sock* 向 *address* 发送数据报。 :meth:`socket.sendto() ` " +"的异步版本。" + +#: ../../library/asyncio-eventloop.rst:1144 +msgid "Return the number of bytes sent." +msgstr "返回已发送的字节数。" + +#: ../../library/asyncio-eventloop.rst:1153 +msgid "Connect *sock* to a remote socket at *address*." +msgstr "将 *sock* 连接到位于 *address* 的远程套接字。" + +#: ../../library/asyncio-eventloop.rst:1155 +msgid "" +"Asynchronous version of :meth:`socket.connect() `." +msgstr ":meth:`socket.connect() ` 的异步版本。" + +#: ../../library/asyncio-eventloop.rst:1159 +msgid "" +"With :class:`SelectorEventLoop`, *address* does not need to be resolved: for" +" :const:`~socket.AF_INET` and :const:`~socket.AF_INET6` sockets, " +"``sock_connect`` first checks whether *address* is already resolved by " +"calling :func:`socket.inet_pton`, and uses :meth:`loop.getaddrinfo` to " +"resolve it if it is not." +msgstr "" + +#: ../../library/asyncio-eventloop.rst:1165 +msgid "" +":class:`ProactorEventLoop`, the default event loop on Windows, does not " +"resolve *address*. The host must already be a numeric IP address; passing a" +" host name raises :exc:`OSError`. Resolve the address with " +":meth:`loop.getaddrinfo` first, or use :meth:`loop.create_connection`, which" +" resolves the address on every platform." +msgstr "" + +#: ../../library/asyncio-eventloop.rst:1171 +msgid "" +"With :class:`SelectorEventLoop`, ``address`` no longer needs to be resolved." +msgstr "" + +#: ../../library/asyncio-eventloop.rst:1177 +msgid "" +":meth:`loop.create_connection` and :func:`asyncio.open_connection() " +"`." +msgstr "" +":meth:`loop.create_connection` 和 :func:`asyncio.open_connection() " +"`." + +#: ../../library/asyncio-eventloop.rst:1184 +msgid "" +"Accept a connection. Modeled after the blocking :meth:`socket.accept() " +"` method." +msgstr "接受一个连接。模仿了阻塞型的 :meth:`socket.accept() ` 方法。" + +#: ../../library/asyncio-eventloop.rst:1187 +msgid "" +"The socket must be bound to an address and listening for connections. The " +"return value is a pair ``(conn, address)`` where *conn* is a *new* socket " +"object usable to send and receive data on the connection, and *address* is " +"the address bound to the socket on the other end of the connection." +msgstr "" +"此套接字必须绑定到一个地址上并且监听连接。返回值是一个 ``(conn, address)`` 对,其中 *conn* 是一个 " +"*新*的套接字对象,用于在此连接上收发数据,*address* 是连接的另一端的套接字所绑定的地址。" + +#: ../../library/asyncio-eventloop.rst:1202 +msgid ":meth:`loop.create_server` and :func:`start_server`." +msgstr ":meth:`loop.create_server` 和 :func:`start_server`。" + +#: ../../library/asyncio-eventloop.rst:1208 +msgid "" +"Send a file using high-performance :mod:`os.sendfile` if possible. Return " +"the total number of bytes sent." +msgstr "在可能的情况下使用高性能的 :mod:`os.sendfile` 发送文件。返回所发送的字节总数。" + +#: ../../library/asyncio-eventloop.rst:1211 +msgid "" +"Asynchronous version of :meth:`socket.sendfile() `." +msgstr ":meth:`socket.sendfile() ` 的异步版本。" + +#: ../../library/asyncio-eventloop.rst:1213 +msgid "" +"*sock* must be a non-blocking :const:`socket.SOCK_STREAM` " +":class:`~socket.socket`." +msgstr "*sock* 必须为非阻塞型的 :const:`socket.SOCK_STREAM` :class:`~socket.socket`。" + +#: ../../library/asyncio-eventloop.rst:1216 +msgid "*file* must be a regular file object open in binary mode." +msgstr "*file* 必须是个用二进制方式打开的常规文件对象。" + +#: ../../library/asyncio-eventloop.rst:1225 +msgid "" +"*fallback*, when set to ``True``, makes asyncio manually read and send the " +"file when the platform does not support the sendfile syscall (e.g. Windows " +"or SSL socket on Unix)." +msgstr "" +"当 *fallback* 被设为 ``True`` 时,会使用 asyncio 在平台不支持 sendfile 系统调用时手动读取并发送文件(例如 " +"Windows 或 Unix 上的 SSL 套接字)。" + +#: ../../library/asyncio-eventloop.rst:1229 +msgid "" +"Raise :exc:`SendfileNotAvailableError` if the system does not support " +"*sendfile* syscall and *fallback* is ``False``." +msgstr "" +"如果系统不支持 *sendfile* 并且 *fallback* 为 ``False``,引发 " +":exc:`SendfileNotAvailableError` 异常。" + +#: ../../library/asyncio-eventloop.rst:1238 +msgid "DNS" +msgstr "DNS" + +#: ../../library/asyncio-eventloop.rst:1244 +msgid "Asynchronous version of :meth:`socket.getaddrinfo`." +msgstr "异步版的 :meth:`socket.getaddrinfo`。" + +#: ../../library/asyncio-eventloop.rst:1249 +msgid "Asynchronous version of :meth:`socket.getnameinfo`." +msgstr "异步版的 :meth:`socket.getnameinfo`。" + +#: ../../library/asyncio-eventloop.rst:1252 +msgid "" +"Both *getaddrinfo* and *getnameinfo* internally utilize their synchronous " +"versions through the loop's default thread pool executor. When this executor" +" is saturated, these methods may experience delays, which higher-level " +"networking libraries may report as increased timeouts. To mitigate this, " +"consider using a custom executor for other user tasks, or setting a default " +"executor with a larger number of workers." +msgstr "" +"*getaddrinfo* 和 *getnameinfo* 均在内部通过循环的默认线程池执行器使用其同步版本。 " +"当执行器饱和时,这些方法可能会遭遇延迟,对此高层级网络库可能报告为更多的超时。 " +"为缓解此问题,可以考虑使用针对其他用户任务的自定义执行器,或者设置具有更多工作线程的默认执行器。" + +#: ../../library/asyncio-eventloop.rst:1259 +msgid "" +"Both *getaddrinfo* and *getnameinfo* methods were always documented to " +"return a coroutine, but prior to Python 3.7 they were, in fact, returning " +":class:`asyncio.Future` objects. Starting with Python 3.7 both methods are " +"coroutines." +msgstr "" +"*getaddrinfo* 和 *getnameinfo* 方法一直被标记返回一个协程,但是 Python 3.7 之前,实际返回的是 " +":class:`asyncio.Future` 对象。从 Python 3.7 开始,这两个方法是协程。" + +#: ../../library/asyncio-eventloop.rst:1267 +msgid "Working with pipes" +msgstr "使用管道" + +#: ../../library/asyncio-eventloop.rst:1272 +msgid "Register the read end of *pipe* in the event loop." +msgstr "在事件循环中注册 *pipe* 的读取端。" + +#: ../../library/asyncio-eventloop.rst:1277 +#: ../../library/asyncio-eventloop.rst:1296 +msgid "" +"*pipe* is a :term:`file-like object `. See :ref:`Supported " +"pipe objects ` for the objects supported as *pipe*." +msgstr "" + +#: ../../library/asyncio-eventloop.rst:1281 +msgid "" +"Return pair ``(transport, protocol)``, where *transport* supports the " +":class:`ReadTransport` interface and *protocol* is an object instantiated by" +" the *protocol_factory*." +msgstr "" +"返回一对 ``(transport, protocol)``,其中 *transport* 支持 :class:`ReadTransport` 接口而 " +"*protocol* 是由 *protocol_factory* 所实例化的对象。" + +#: ../../library/asyncio-eventloop.rst:1285 +#: ../../library/asyncio-eventloop.rst:1304 +msgid "" +"With :class:`SelectorEventLoop` event loop, the *pipe* is set to non-" +"blocking mode." +msgstr "使用 :class:`SelectorEventLoop` 事件循环, *pipe* 被设置为非阻塞模式。" + +#: ../../library/asyncio-eventloop.rst:1291 +msgid "Register the write end of *pipe* in the event loop." +msgstr "在事件循环中注册 *pipe* 的写入端。" + +#: ../../library/asyncio-eventloop.rst:1300 +msgid "" +"Return pair ``(transport, protocol)``, where *transport* supports " +":class:`WriteTransport` interface and *protocol* is an object instantiated " +"by the *protocol_factory*." +msgstr "" +"返回一对 ``(transport, protocol)``,其中 *transport* 支持 :class:`WriteTransport` 接口而" +" *protocol* 是由 *protocol_factory* 所实例化的对象。" + +#: ../../library/asyncio-eventloop.rst:1310 +msgid "Supported pipe objects" +msgstr "" + +#: ../../library/asyncio-eventloop.rst:1311 +msgid "" +"These methods only work with objects the operating system can poll for " +"readiness or perform overlapped I/O on. Regular files on disk are **not** " +"supported on any platform. There is no asynchronous file I/O in asyncio; " +"use :meth:`loop.run_in_executor` to read and write regular files without " +"blocking the event loop." +msgstr "" + +#: ../../library/asyncio-eventloop.rst:1317 +msgid "" +"On Unix, with :class:`SelectorEventLoop`, *pipe* must wrap one of the " +"following:" +msgstr "" + +#: ../../library/asyncio-eventloop.rst:1320 +msgid "" +"a pipe, such as an end of an :func:`os.pipe` pair or a FIFO created with " +":func:`os.mkfifo`;" +msgstr "" + +#: ../../library/asyncio-eventloop.rst:1322 +msgid "a socket;" +msgstr "" + +#: ../../library/asyncio-eventloop.rst:1323 +msgid "a character device, such as a terminal." +msgstr "" + +#: ../../library/asyncio-eventloop.rst:1325 +msgid "" +"On Windows, where only :class:`ProactorEventLoop` implements these methods, " +"*pipe* must wrap a handle opened for overlapped I/O (that is, created with " +"the ``FILE_FLAG_OVERLAPPED`` flag), since the handle has to be associated " +"with an I/O completion port. Handles that were not opened for overlapped " +"I/O are rejected. In particular, the standard streams (:data:`sys.stdin`, " +":data:`sys.stdout` and :data:`sys.stderr`), console handles, and the pipes " +"created by :func:`os.pipe` are **not** opened for overlapped I/O and " +"therefore cannot be used with these methods." +msgstr "" + +#: ../../library/asyncio-eventloop.rst:1336 +msgid "" +":class:`SelectorEventLoop` does not support the above methods on Windows. " +"Use :class:`ProactorEventLoop` instead for Windows." +msgstr "" +"在 Windows 中 :class:`SelectorEventLoop` 不支持上述方法。对于 Windows 请改用 " +":class:`ProactorEventLoop`." + +#: ../../library/asyncio-eventloop.rst:1341 +msgid "" +"The :meth:`loop.subprocess_exec` and :meth:`loop.subprocess_shell` methods." +msgstr ":meth:`loop.subprocess_exec` 和 :meth:`loop.subprocess_shell` 方法。" + +#: ../../library/asyncio-eventloop.rst:1346 +msgid "Unix signals" +msgstr "Unix 信号" + +#: ../../library/asyncio-eventloop.rst:1352 +msgid "" +"Set *callback* as the handler for the *signum* signal, passing *args* as " +"positional arguments." +msgstr "" +"将 *callback* 设为 *signum* 信号的处理器,并传入 *args* 作为位置参数。as positional arguments." + +#: ../../library/asyncio-eventloop.rst:1355 +msgid "" +"The callback will be invoked by *loop*, along with other queued callbacks " +"and runnable coroutines of that event loop. Unlike signal handlers " +"registered using :func:`signal.signal`, a callback registered with this " +"function is allowed to interact with the event loop." +msgstr "" +"此回调将与该事件循环中其他加入队列的回调和可运行协程一起由 *loop* 唤起。不同于使用 :func:`signal.signal` " +"注册的信号处理程序,使用此函数注册的回调可以与事件循环进行交互。" + +#: ../../library/asyncio-eventloop.rst:1360 +msgid "" +"Raise :exc:`ValueError` if the signal number is invalid or uncatchable. " +"Raise :exc:`RuntimeError` if there is a problem setting up the handler." +msgstr "" +"如果信号数字非法或者不可捕获,就抛出一个 :exc:`ValueError`。如果建立处理器的过程中出现问题,会抛出一个 " +":exc:`RuntimeError`." + +#: ../../library/asyncio-eventloop.rst:1366 +msgid "" +"Like :func:`signal.signal`, this function must be invoked in the main " +"thread." +msgstr "和 :func:`signal.signal` 一样,这个函数只能在主线程中调用。" + +#: ../../library/asyncio-eventloop.rst:1371 +msgid "Remove the handler for the *sig* signal." +msgstr "移除 *sig* 信号的处理程序。" + +#: ../../library/asyncio-eventloop.rst:1373 +msgid "" +"Return ``True`` if the signal handler was removed, or ``False`` if no " +"handler was set for the given signal." +msgstr "如果信号处理程序被移除则返回 ``True``,否则如果给定信号未设置处理程序则返回 ``False``。" + +#: ../../library/asyncio-eventloop.rst:1380 +msgid "The :mod:`signal` module." +msgstr ":mod:`signal` 模块。" + +#: ../../library/asyncio-eventloop.rst:1384 +msgid "Executing code in thread or process pools" +msgstr "在线程或者进程池中执行代码。" + +#: ../../library/asyncio-eventloop.rst:1388 +msgid "" +"Arrange for *func* to be called in the specified executor passing *args* as " +"positional arguments." +msgstr "安排 *func* 在指定的执行器中被调用并传入 *args* 作为位置参数。as positional arguments." + +#: ../../library/asyncio-eventloop.rst:1391 +msgid "" +"The *executor* argument should be an :class:`concurrent.futures.Executor` " +"instance. The default executor is used if *executor* is ``None``. The " +"default executor can be set by :meth:`loop.set_default_executor`, otherwise," +" a :class:`concurrent.futures.ThreadPoolExecutor` will be lazy-initialized " +"and used by :func:`run_in_executor` if needed." +msgstr "" +"*executor* 参数应当是一个 :class:`concurrent.futures.Executor` 实例。如果 *executor* 为 " +"``None`` 则使用默认执行器。默认执行器可通过 :meth:`loop.set_default_executor` " +"来设置,在其他情况下,将在有需要时惰性初始化 :class:`concurrent.futures.ThreadPoolExecutor` 并由 " +":func:`run_in_executor` 来使用。" + +#: ../../library/asyncio-eventloop.rst:1399 +msgid "" +"import asyncio\n" +"import concurrent.futures\n" +"\n" +"def blocking_io():\n" +" # File operations (such as logging) can block the\n" +" # event loop: run them in a thread pool.\n" +" with open('/dev/urandom', 'rb') as f:\n" +" return f.read(100)\n" +"\n" +"def cpu_bound():\n" +" # CPU-bound operations will block the event loop:\n" +" # in general it is preferable to run them in a\n" +" # process pool.\n" +" return sum(i * i for i in range(10 ** 7))\n" +"\n" +"async def main():\n" +" loop = asyncio.get_running_loop()\n" +"\n" +" ## Options:\n" +"\n" +" # 1. Run in the default loop's executor:\n" +" result = await loop.run_in_executor(\n" +" None, blocking_io)\n" +" print('default thread pool', result)\n" +"\n" +" # 2. Run in a custom thread pool:\n" +" with concurrent.futures.ThreadPoolExecutor() as pool:\n" +" result = await loop.run_in_executor(\n" +" pool, blocking_io)\n" +" print('custom thread pool', result)\n" +"\n" +" # 3. Run in a custom process pool:\n" +" with concurrent.futures.ProcessPoolExecutor() as pool:\n" +" result = await loop.run_in_executor(\n" +" pool, cpu_bound)\n" +" print('custom process pool', result)\n" +"\n" +" # 4. Run in a custom interpreter pool:\n" +" with concurrent.futures.InterpreterPoolExecutor() as pool:\n" +" result = await loop.run_in_executor(\n" +" pool, cpu_bound)\n" +" print('custom interpreter pool', result)\n" +"\n" +"if __name__ == '__main__':\n" +" asyncio.run(main())" +msgstr "" +"import asyncio\n" +"import concurrent.futures\n" +"\n" +"def blocking_io():\n" +" # 文件操作(如日志记录)会阻塞\n" +" # 事件循环:在线程池中运行它们。\n" +" with open('/dev/urandom', 'rb') as f:\n" +" return f.read(100)\n" +"\n" +"def cpu_bound():\n" +" # CPU 密集型操作将阻塞事件循环:\n" +" # 通常,最好在进程池中运行它们。\n" +" return sum(i * i for i in range(10 ** 7))\n" +"\n" +"async def main():\n" +" loop = asyncio.get_running_loop()\n" +"\n" +" ## 选项:\n" +"\n" +" # 1. 在默认循环执行器中运行:\n" +" result = await loop.run_in_executor(\n" +" None, blocking_io)\n" +" print('default thread pool', result)\n" +"\n" +" # 2. 在自定义线程池中运行:\n" +" with concurrent.futures.ThreadPoolExecutor() as pool:\n" +" result = await loop.run_in_executor(\n" +" pool, blocking_io)\n" +" print('custom thread pool', result)\n" +"\n" +" # 3. 在自定义进程池中运行:\n" +" with concurrent.futures.ProcessPoolExecutor() as pool:\n" +" result = await loop.run_in_executor(\n" +" pool, cpu_bound)\n" +" print('custom process pool', result)\n" +"\n" +" # 4. 在自定义解释器池中运行:\n" +" with concurrent.futures.InterpreterPoolExecutor() as pool:\n" +" result = await loop.run_in_executor(\n" +" pool, cpu_bound)\n" +" print('custom interpreter pool', result)\n" +"\n" +"if __name__ == '__main__':\n" +" asyncio.run(main())" + +#: ../../library/asyncio-eventloop.rst:1445 +msgid "" +"Note that the entry point guard (``if __name__ == '__main__'``) is required " +"for option 3 due to the peculiarities of :mod:`multiprocessing`, which is " +"used by :class:`~concurrent.futures.ProcessPoolExecutor`. See :ref:`Safe " +"importing of main module `." +msgstr "" +"请注意需要为选项 3 设置入口点保护 (``if __name__ == '__main__'``),这是由于 " +":mod:`multiprocessing` 的特殊性,它将由 " +":class:`~concurrent.futures.ProcessPoolExecutor` 来使用。参见 :ref:`主模块的安全导入 " +"`." + +#: ../../library/asyncio-eventloop.rst:1450 +msgid "This method returns a :class:`asyncio.Future` object." +msgstr "这个方法返回一个 :class:`asyncio.Future` 对象。" + +#: ../../library/asyncio-eventloop.rst:1452 +msgid "" +"Use :func:`functools.partial` :ref:`to pass keyword arguments ` to *func*." +msgstr "" +"使用 :func:`functools.partial` :ref:`传递关键字参数 ` 给 " +"*func*." + +#: ../../library/asyncio-eventloop.rst:1455 +msgid "" +":meth:`loop.run_in_executor` no longer configures the ``max_workers`` of the" +" thread pool executor it creates, instead leaving it up to the thread pool " +"executor (:class:`~concurrent.futures.ThreadPoolExecutor`) to set the " +"default." +msgstr "" +":meth:`loop.run_in_executor` 不会再配置它所创建的线程池执行器的 ``max_workers``,而是将其留给线程池执行器 " +"(:class:`~concurrent.futures.ThreadPoolExecutor`) 来设置默认值。" + +#: ../../library/asyncio-eventloop.rst:1464 +msgid "" +"Set *executor* as the default executor used by :meth:`run_in_executor`. " +"*executor* must be an instance of " +":class:`~concurrent.futures.ThreadPoolExecutor`, which includes " +":class:`~concurrent.futures.InterpreterPoolExecutor`." +msgstr "" +"将 *executor* 设为 :meth:`run_in_executor` 所使用的默认执行器。 *executor* 必须是 " +":class:`~concurrent.futures.ThreadPoolExecutor` (其中包括 " +":class:`~concurrent.futures.InterpreterPoolExecutor`) 的实例。" + +#: ../../library/asyncio-eventloop.rst:1469 +msgid "" +"*executor* must be an instance of " +":class:`~concurrent.futures.ThreadPoolExecutor`." +msgstr "*executor* 必须是 :class:`~concurrent.futures.ThreadPoolExecutor` 的实例。" + +#: ../../library/asyncio-eventloop.rst:1475 +msgid "Error handling API" +msgstr "错误处理 API" + +#: ../../library/asyncio-eventloop.rst:1477 +msgid "Allows customizing how exceptions are handled in the event loop." +msgstr "允许自定义事件循环中如何去处理异常。" + +#: ../../library/asyncio-eventloop.rst:1481 +msgid "Set *handler* as the new event loop exception handler." +msgstr "将 *handler* 设置为新的事件循环异常处理器。" + +#: ../../library/asyncio-eventloop.rst:1483 +msgid "" +"If *handler* is ``None``, the default exception handler will be set. " +"Otherwise, *handler* must be a callable with the signature matching ``(loop," +" context)``, where ``loop`` is a reference to the active event loop, and " +"``context`` is a ``dict`` object containing the details of the exception " +"(see :meth:`call_exception_handler` documentation for details about " +"context)." +msgstr "" +"如果 *handler* 为 ``None``,将设置默认的异常处理程序。在其他情况下,*handler* 必须是一个可调用对象且签名匹配 " +"``(loop, context)``,其中 ``loop`` 是对活动事件循环的引用,而 ``context`` 是一个包含异常详情的 " +"``dict`` (请查看 :meth:`call_exception_handler` 文档来获取关于上下文的更多信息)。" + +#: ../../library/asyncio-eventloop.rst:1491 +msgid "" +"If the handler is called on behalf of a :class:`~asyncio.Task` or " +":class:`~asyncio.Handle`, it is run in the :class:`contextvars.Context` of " +"that task or callback handle." +msgstr "" +"如果针对一个 :class:`~asyncio.Task` 或 :class:`~asyncio.Handle` " +"调用了该异常处理器,它将在相应任务或回调句柄的 :class:`contextvars.Context` 中运行。" + +#: ../../library/asyncio-eventloop.rst:1497 +msgid "" +"The handler may be called in the :class:`~contextvars.Context` of the task " +"or handle where the exception originated." +msgstr "该处理器可能会在发生异常的任务或句柄的 :class:`~contextvars.Context` 中被调用。" + +#: ../../library/asyncio-eventloop.rst:1502 +msgid "" +"Return the current exception handler, or ``None`` if no custom exception " +"handler was set." +msgstr "返回当前的异常处理器,如果没有设置异常处理器,则返回 ``None``。" + +#: ../../library/asyncio-eventloop.rst:1509 +msgid "Default exception handler." +msgstr "默认的异常处理器。" + +#: ../../library/asyncio-eventloop.rst:1511 +msgid "" +"This is called when an exception occurs and no exception handler is set. " +"This can be called by a custom exception handler that wants to defer to the " +"default handler behavior." +msgstr "此方法会在发生异常且未设置异常处理程序时被调用。此方法也可以由想要具有不同于默认处理程序的行为的自定义异常处理程序来调用。" + +#: ../../library/asyncio-eventloop.rst:1515 +msgid "" +"*context* parameter has the same meaning as in " +":meth:`call_exception_handler`." +msgstr "*context* 参数和 :meth:`call_exception_handler` 中的同名参数完全相同。" + +#: ../../library/asyncio-eventloop.rst:1520 +msgid "Call the current event loop exception handler." +msgstr "调用当前事件循环的异常处理器。" + +#: ../../library/asyncio-eventloop.rst:1522 +msgid "" +"*context* is a ``dict`` object containing the following keys (new keys may " +"be introduced in future Python versions):" +msgstr "*context* 是个包含下列键的 ``dict`` 对象 (未来版本的 Python 可能会引入新键):" + +#: ../../library/asyncio-eventloop.rst:1525 +msgid "'message': Error message;" +msgstr "'message': 错误消息;" + +#: ../../library/asyncio-eventloop.rst:1526 +msgid "'exception' (optional): Exception object;" +msgstr "'exception' (可选): 异常对象;" + +#: ../../library/asyncio-eventloop.rst:1527 +msgid "'future' (optional): :class:`asyncio.Future` instance;" +msgstr "'future' (可选): :class:`asyncio.Future` 实例;" + +#: ../../library/asyncio-eventloop.rst:1528 +msgid "'task' (optional): :class:`asyncio.Task` instance;" +msgstr "'task' (可选): :class:`asyncio.Task` 实例;" + +#: ../../library/asyncio-eventloop.rst:1529 +msgid "'handle' (optional): :class:`asyncio.Handle` instance;" +msgstr "'handle' (可选): :class:`asyncio.Handle` 实例;" + +#: ../../library/asyncio-eventloop.rst:1530 +msgid "'protocol' (optional): :ref:`Protocol ` instance;" +msgstr "'protocol' (可选): :ref:`Protocol ` 实例;" + +#: ../../library/asyncio-eventloop.rst:1531 +msgid "'transport' (optional): :ref:`Transport ` instance;" +msgstr "'transport' (可选): :ref:`Transport ` 实例;" + +#: ../../library/asyncio-eventloop.rst:1532 +msgid "'socket' (optional): :class:`socket.socket` instance;" +msgstr "'socket' (可选): :class:`socket.socket` 实例;" + +#: ../../library/asyncio-eventloop.rst:1533 +msgid "'source_traceback' (optional): Traceback of the source;" +msgstr "'source_traceback' (可选):源的回溯;" + +#: ../../library/asyncio-eventloop.rst:1534 +msgid "'handle_traceback' (optional): Traceback of the handle;" +msgstr "'handle_traceback' (可选):句柄的回溯;" + +#: ../../library/asyncio-eventloop.rst:1535 +msgid "'asyncgen' (optional): Asynchronous generator that caused" +msgstr "'asyncgen' (可选): 异步生成器,它导致了" + +#: ../../library/asyncio-eventloop.rst:1536 +msgid "the exception." +msgstr "这个异常" + +#: ../../library/asyncio-eventloop.rst:1540 +msgid "" +"This method should not be overloaded in subclassed event loops. For custom " +"exception handling, use the :meth:`set_exception_handler` method." +msgstr "此方法不应在子类化的事件循环中被重载。对于自定义的异常处理,请使用 :meth:`set_exception_handler` 方法。" + +#: ../../library/asyncio-eventloop.rst:1545 +msgid "Enabling debug mode" +msgstr "开启调试模式" + +#: ../../library/asyncio-eventloop.rst:1549 +msgid "Get the debug mode (:class:`bool`) of the event loop." +msgstr "获取事件循环调试模式设置 (:class:`bool`)。" + +#: ../../library/asyncio-eventloop.rst:1551 +msgid "" +"The default value is ``True`` if the environment variable " +":envvar:`PYTHONASYNCIODEBUG` is set to a non-empty string, ``False`` " +"otherwise." +msgstr "" +"如果环境变量 :envvar:`PYTHONASYNCIODEBUG` 是一个非空字符串,就返回 ``True``,否则就返回 ``False``。" + +#: ../../library/asyncio-eventloop.rst:1557 +msgid "Set the debug mode of the event loop." +msgstr "设置事件循环的调试模式。" + +#: ../../library/asyncio-eventloop.rst:1561 +msgid "" +"The new :ref:`Python Development Mode ` can now also be used to " +"enable the debug mode." +msgstr "现在也可以通过新的 :ref:`Python 开发模式 ` 来启用调试模式。" + +#: ../../library/asyncio-eventloop.rst:1566 +msgid "" +"This attribute can be used to set the minimum execution duration in seconds " +"that is considered \"slow\". When debug mode is enabled, \"slow\" callbacks " +"are logged." +msgstr "该属性可用于设置会被视为“缓慢”的以秒数表示的最短执行时间。当启用调试模式时,“缓慢”的回调将被记录到日志。" + +#: ../../library/asyncio-eventloop.rst:1570 +msgid "Default value is 100 milliseconds." +msgstr "默认值为 100 毫秒。" + +#: ../../library/asyncio-eventloop.rst:1574 +msgid "The :ref:`debug mode of asyncio `." +msgstr ":ref:`asyncio 的调试模式 `。" + +#: ../../library/asyncio-eventloop.rst:1578 +msgid "Running subprocesses" +msgstr "运行子进程" + +#: ../../library/asyncio-eventloop.rst:1580 +msgid "" +"Methods described in this subsections are low-level. In regular async/await" +" code consider using the high-level :func:`asyncio.create_subprocess_shell` " +"and :func:`asyncio.create_subprocess_exec` convenience functions instead." +msgstr "" +"本小节所描述的方法都是低层级的。在常规 async/await 代码中请考虑改用高层级的 " +":func:`asyncio.create_subprocess_shell` 和 " +":func:`asyncio.create_subprocess_exec` 便捷函数。" + +#: ../../library/asyncio-eventloop.rst:1587 +msgid "" +"On Windows, the default event loop :class:`ProactorEventLoop` supports " +"subprocesses, whereas :class:`SelectorEventLoop` does not. See " +":ref:`Subprocess Support on Windows ` for " +"details." +msgstr "" +"在 Windows 中,默认的事件循环 :class:`ProactorEventLoop` 支持子进程,而 " +":class:`SelectorEventLoop` 不支持。参见 :ref:`Windows 中的子进程支持 `." + +#: ../../library/asyncio-eventloop.rst:1599 +msgid "" +"Create a subprocess from one or more string arguments specified by *args*." +msgstr "用 *args* 指定的一个或者多个字符串型参数创建一个子进程。" + +#: ../../library/asyncio-eventloop.rst:1602 +msgid "*args* must be a list of strings represented by:" +msgstr "*args* 必须是个由下列形式的字符串组成的列表:" + +#: ../../library/asyncio-eventloop.rst:1604 +msgid ":class:`str`;" +msgstr ":class:`str`;" + +#: ../../library/asyncio-eventloop.rst:1605 +msgid "" +"or :class:`bytes`, encoded to the :ref:`filesystem encoding `." +msgstr "或者由 :ref:`文件系统编码格式 ` 编码的 :class:`bytes`。" + +#: ../../library/asyncio-eventloop.rst:1608 +msgid "" +"The first string specifies the program executable, and the remaining strings" +" specify the arguments. Together, string arguments form the ``argv`` of the" +" program." +msgstr "第一个字符串指定可执行程序,其余的字符串指定其参数。所有字符串参数共同组成了程序的 ``argv``。" + +#: ../../library/asyncio-eventloop.rst:1612 +msgid "" +"This is similar to the standard library :class:`subprocess.Popen` class " +"called with ``shell=False`` and the list of strings passed as the first " +"argument; however, where :class:`~subprocess.Popen` takes a single argument " +"which is list of strings, *subprocess_exec* takes multiple string arguments." +msgstr "" +"此方法类似于调用标准库 :class:`subprocess.Popen` 类,设置 ``shell=False`` " +"并将字符串列表作为第一个参数传入;但是,:class:`~subprocess.Popen` 只接受一个单独的字符串列表参数,而 " +"*subprocess_exec* 接受多个字符串参数。" + +#: ../../library/asyncio-eventloop.rst:1618 +msgid "" +"The *protocol_factory* must be a callable returning a subclass of the " +":class:`asyncio.SubprocessProtocol` class." +msgstr "" +"*protocol_factory* 必须为一个返回 :class:`asyncio.SubprocessProtocol` 类的子类的可调用对象。" + +#: ../../library/asyncio-eventloop.rst:1621 +msgid "Other parameters:" +msgstr "其他参数:" + +#: ../../library/asyncio-eventloop.rst:1623 +msgid "*stdin* can be any of these:" +msgstr "*stdin* 可以是以下对象之一:" + +#: ../../library/asyncio-eventloop.rst:1625 +#: ../../library/asyncio-eventloop.rst:1636 +#: ../../library/asyncio-eventloop.rst:1646 +msgid "a file-like object" +msgstr "一个文件型对象" + +#: ../../library/asyncio-eventloop.rst:1626 +msgid "" +"an existing file descriptor (a positive integer), for example those created " +"with :meth:`os.pipe`" +msgstr "一个现有的文件描述符(一个正整数),例如用 :meth:`os.pipe` 创建的文件描述符" + +#: ../../library/asyncio-eventloop.rst:1627 +#: ../../library/asyncio-eventloop.rst:1637 +#: ../../library/asyncio-eventloop.rst:1647 +msgid "" +"the :const:`subprocess.PIPE` constant (default) which will create a new pipe" +" and connect it," +msgstr ":const:`subprocess.PIPE` 常量(默认),将创建并连接一个新的管道。" + +#: ../../library/asyncio-eventloop.rst:1629 +#: ../../library/asyncio-eventloop.rst:1639 +#: ../../library/asyncio-eventloop.rst:1649 +msgid "" +"the value ``None`` which will make the subprocess inherit the file " +"descriptor from this process" +msgstr "``None`` 值,这将使得子进程继承来自此进程的文件描述符" + +#: ../../library/asyncio-eventloop.rst:1631 +#: ../../library/asyncio-eventloop.rst:1641 +#: ../../library/asyncio-eventloop.rst:1651 +msgid "" +"the :const:`subprocess.DEVNULL` constant which indicates that the special " +":data:`os.devnull` file will be used" +msgstr ":const:`subprocess.DEVNULL` 常量,这表示将使用特殊的 :data:`os.devnull` 文件" + +#: ../../library/asyncio-eventloop.rst:1634 +msgid "*stdout* can be any of these:" +msgstr "*stdout* 可以是以下对象之一:" + +#: ../../library/asyncio-eventloop.rst:1644 +msgid "*stderr* can be any of these:" +msgstr "*stderr* 可以是以下对象之一:" + +#: ../../library/asyncio-eventloop.rst:1653 +msgid "" +"the :const:`subprocess.STDOUT` constant which will connect the standard " +"error stream to the process' standard output stream" +msgstr ":const:`subprocess.STDOUT` 常量,将把标准错误流连接到进程的标准输出流" + +#: ../../library/asyncio-eventloop.rst:1656 +msgid "" +"All other keyword arguments are passed to :class:`subprocess.Popen` without " +"interpretation, except for *bufsize*, *universal_newlines*, *shell*, *text*," +" *encoding* and *errors*, which should not be specified at all." +msgstr "" +"所有其他关键字参数会被不加解释地传给 :class:`subprocess.Popen`,除了 *bufsize*, " +"*universal_newlines*, *shell*, *text*, *encoding* 和 *errors*,它们都不应当被指定。" + +#: ../../library/asyncio-eventloop.rst:1661 +msgid "" +"The ``asyncio`` subprocess API does not support decoding the streams as " +"text. :func:`bytes.decode` can be used to convert the bytes returned from " +"the stream to text." +msgstr "" +"``asyncio`` 子进程 API 不支持将流解码为文本。可以使用 :func:`bytes.decode` 来将从流返回的字节串转换为文本。" + +#: ../../library/asyncio-eventloop.rst:1665 +msgid "" +"If a file-like object passed as *stdin*, *stdout* or *stderr* represents a " +"pipe, then the other side of this pipe should be registered with " +":meth:`~loop.connect_write_pipe` or :meth:`~loop.connect_read_pipe` for use " +"with the event loop." +msgstr "" +"如果作为 *stdin*, *stdout* 或 *stderr* 传入的文件型对象是代表一个管道,则该管道的另一端应当用 " +":meth:`~loop.connect_write_pipe` 或 :meth:`~loop.connect_read_pipe` " +"来注册以配合事件循环使用。" + +#: ../../library/asyncio-eventloop.rst:1670 +msgid "" +"See the constructor of the :class:`subprocess.Popen` class for documentation" +" on other arguments." +msgstr "其他参数的文档,请参阅 :class:`subprocess.Popen` 类的构造函数。" + +#: ../../library/asyncio-eventloop.rst:1673 +msgid "" +"Returns a pair of ``(transport, protocol)``, where *transport* conforms to " +"the :class:`asyncio.SubprocessTransport` base class and *protocol* is an " +"object instantiated by the *protocol_factory*." +msgstr "" +"返回一对 ``(transport, protocol)``,其中 *transport* 来自 " +":class:`asyncio.SubprocessTransport` 基类而 *protocol* 是由 *protocol_factory* " +"所实例化的对象。" + +#: ../../library/asyncio-eventloop.rst:1677 +#: ../../library/asyncio-eventloop.rst:1703 +msgid "" +"If the transport is closed or is garbage collected, the child process is " +"killed if it is still running." +msgstr "如果传输被关闭或作为垃圾被回收,则当子进程仍在运行时它将被杀掉。" + +#: ../../library/asyncio-eventloop.rst:1685 +msgid "" +"Create a subprocess from *cmd*, which can be a :class:`str` or a " +":class:`bytes` string encoded to the :ref:`filesystem encoding `, using the platform's \"shell\" syntax." +msgstr "" +"基于 *cmd* 创建一个子进程,该参数可以是一个 :class:`str` 或者按 :ref:`文件系统编码格式 ` 编码得到的 :class:`bytes`,使用平台的 \"shell\" 语法。" + +#: ../../library/asyncio-eventloop.rst:1690 +msgid "" +"This is similar to the standard library :class:`subprocess.Popen` class " +"called with ``shell=True``." +msgstr "这类似于用 ``shell=True`` 调用标准库的 :class:`subprocess.Popen` 类。" + +#: ../../library/asyncio-eventloop.rst:1693 +msgid "" +"The *protocol_factory* must be a callable returning a subclass of the " +":class:`SubprocessProtocol` class." +msgstr "*protocol_factory* 必须为一个返回 :class:`SubprocessProtocol` 类的子类的可调用对象。" + +#: ../../library/asyncio-eventloop.rst:1696 +msgid "" +"See :meth:`~loop.subprocess_exec` for more details about the remaining " +"arguments." +msgstr "请参阅 :meth:`~loop.subprocess_exec` 了解有关其余参数的详情。" + +#: ../../library/asyncio-eventloop.rst:1699 +msgid "" +"Returns a pair of ``(transport, protocol)``, where *transport* conforms to " +"the :class:`SubprocessTransport` base class and *protocol* is an object " +"instantiated by the *protocol_factory*." +msgstr "" +"返回一对 ``(transport, protocol)``,其中 *transport* 来自 " +":class:`SubprocessTransport` 基类而 *protocol* 是由 *protocol_factory* 所实例化的对象。" + +#: ../../library/asyncio-eventloop.rst:1707 +msgid "" +"It is the application's responsibility to ensure that all whitespace and " +"special characters are quoted appropriately to avoid `shell injection " +"`_ " +"vulnerabilities. The :func:`shlex.quote` function can be used to properly " +"escape whitespace and special characters in strings that are going to be " +"used to construct shell commands." +msgstr "" +"应用程序要负责确保正确地转义所有空白字符和特殊字符以防止 `shell 注入 " +"`_ 漏洞。 " +":func:`shlex.quote` 函数可以被用来正确地转义字符串中可能被用来构造 shell 命令的空白字符和特殊字符。" + +#: ../../library/asyncio-eventloop.rst:1716 +msgid "Callback handles" +msgstr "回调处理" + +#: ../../library/asyncio-eventloop.rst:1720 +msgid "" +"A callback wrapper object returned by :meth:`loop.call_soon`, " +":meth:`loop.call_soon_threadsafe`." +msgstr "" +"由 :meth:`loop.call_soon`, :meth:`loop.call_soon_threadsafe` 所返回的回调包装器对象。" + +#: ../../library/asyncio-eventloop.rst:1725 +msgid "" +"Return the :class:`contextvars.Context` object associated with the handle." +msgstr "返回关联到该句柄的 :class:`contextvars.Context` 对象。" + +#: ../../library/asyncio-eventloop.rst:1732 +msgid "" +"Cancel the callback. If the callback has already been canceled or executed," +" this method has no effect." +msgstr "取消回调。如果此回调已被取消或已被执行,此方法将没有任何效果。" + +#: ../../library/asyncio-eventloop.rst:1737 +msgid "Return ``True`` if the callback was cancelled." +msgstr "如果此回调已被取消则返回 ``True``。" + +#: ../../library/asyncio-eventloop.rst:1743 +msgid "" +"A callback wrapper object returned by :meth:`loop.call_later`, and " +":meth:`loop.call_at`." +msgstr "由 :meth:`loop.call_later` 和 :meth:`loop.call_at` 所返回的回调包装器对象。" + +#: ../../library/asyncio-eventloop.rst:1746 +msgid "This class is a subclass of :class:`Handle`." +msgstr "这个类是 :class:`Handle` 的子类。" + +#: ../../library/asyncio-eventloop.rst:1750 +msgid "Return a scheduled callback time as :class:`float` seconds." +msgstr "返回加入计划任务的回调时间,以 :class:`float` 值表示的秒数。" + +#: ../../library/asyncio-eventloop.rst:1752 +msgid "" +"The time is an absolute timestamp, using the same time reference as " +":meth:`loop.time`." +msgstr "时间值是一个绝对时间戳,使用与 :meth:`loop.time` 相同的时间引用。" + +#: ../../library/asyncio-eventloop.rst:1759 +msgid "Server objects" +msgstr "服务器对象" + +#: ../../library/asyncio-eventloop.rst:1761 +msgid "" +"Server objects are created by :meth:`loop.create_server`, " +":meth:`loop.create_unix_server`, :func:`start_server`, and " +":func:`start_unix_server` functions." +msgstr "" +"Server 对象可使用 :meth:`loop.create_server`, :meth:`loop.create_unix_server`, " +":func:`start_server` 和 :func:`start_unix_server` 等函数来创建。" + +#: ../../library/asyncio-eventloop.rst:1765 +msgid "Do not instantiate the :class:`Server` class directly." +msgstr "请不要直接实例化 :class:`Server` 类。" + +#: ../../library/asyncio-eventloop.rst:1769 +msgid "" +"*Server* objects are asynchronous context managers. When used in an ``async" +" with`` statement, it's guaranteed that the Server object is closed and not " +"accepting new connections when the ``async with`` statement is completed::" +msgstr "" +"*Server* 对象是异步上下文管理器。当用于 ``async with`` 语句时,异步上下文管理器可以确保 Server 对象被关闭,并且在 " +"``async with`` 语句完成后,不接受新的连接::" + +#: ../../library/asyncio-eventloop.rst:1774 +msgid "" +"srv = await loop.create_server(...)\n" +"\n" +"async with srv:\n" +" # some code\n" +"\n" +"# At this point, srv is closed and no longer accepts new connections." +msgstr "" +"srv = await loop.create_server(...)\n" +"\n" +"async with srv:\n" +" # 一些代码\n" +"\n" +"# 此时,srv 已关闭并不再接受新的连接。" + +#: ../../library/asyncio-eventloop.rst:1782 +msgid "Server object is an asynchronous context manager since Python 3.7." +msgstr "从 Python 3.7 开始,Server 对象是一个异步上下文管理器。" + +#: ../../library/asyncio-eventloop.rst:1785 +msgid "" +"This class was exposed publicly as ``asyncio.Server`` in Python 3.9.11, " +"3.10.3 and 3.11." +msgstr "这个类在 Python 3.9.11, 3.10.3 和 3.11 中作为 ``asyncio.Server`` 对外公开。" + +#: ../../library/asyncio-eventloop.rst:1790 +msgid "" +"Stop serving: close listening sockets and set the :attr:`sockets` attribute " +"to ``None``." +msgstr "停止服务:关闭监听的套接字并且设置 :attr:`sockets` 属性为 ``None``。" + +#: ../../library/asyncio-eventloop.rst:1793 +msgid "" +"The sockets that represent existing incoming client connections are left " +"open." +msgstr "用于表示已经连进来的客户端连接会保持打开的状态。" + +#: ../../library/asyncio-eventloop.rst:1796 +msgid "" +"The server is closed asynchronously; use the :meth:`wait_closed` coroutine " +"to wait until the server is closed (and no more connections are active)." +msgstr "服务器是被异步关闭的;使用 :meth:`wait_closed` 协程来等待服务器关闭(将不再有激活的连接)。" + +#: ../../library/asyncio-eventloop.rst:1802 +msgid "Close all existing incoming client connections." +msgstr "关闭所有现有的传入客户端连接。" + +#: ../../library/asyncio-eventloop.rst:1804 +msgid "" +"Calls :meth:`~asyncio.BaseTransport.close` on all associated transports." +msgstr "在所有关联的传输上调用 :meth:`~asyncio.BaseTransport.close`。" + +#: ../../library/asyncio-eventloop.rst:1807 +msgid "" +":meth:`close` should be called before :meth:`close_clients` when closing the" +" server to avoid races with new clients connecting." +msgstr "当关闭服务器时 :meth:`close` 应当在 :meth:`close_clients` 之前被调用以避免与新的客户端连接发生竞争。" + +#: ../../library/asyncio-eventloop.rst:1814 +msgid "" +"Close all existing incoming client connections immediately, without waiting " +"for pending operations to complete." +msgstr "立即关闭所有现有的传入客户端连接,无需等待挂起的操作完成。" + +#: ../../library/asyncio-eventloop.rst:1817 +msgid "" +"Calls :meth:`~asyncio.WriteTransport.abort` on all associated transports." +msgstr "在所有关联的传输上调用 :meth:`~asyncio.WriteTransport.abort`。" + +#: ../../library/asyncio-eventloop.rst:1820 +msgid "" +":meth:`close` should be called before :meth:`abort_clients` when closing the" +" server to avoid races with new clients connecting." +msgstr "当关闭服务器时应当在 :meth:`abort_clients` 之前调用 :meth:`close` 以避免与新的客户端连接发生竞争。" + +#: ../../library/asyncio-eventloop.rst:1827 +msgid "Return the event loop associated with the server object." +msgstr "返回与服务器对象相关联的事件循环。" + +#: ../../library/asyncio-eventloop.rst:1834 +msgid "Start accepting connections." +msgstr "开始接受连接。" + +#: ../../library/asyncio-eventloop.rst:1836 +msgid "" +"This method is idempotent, so it can be called when the server is already " +"serving." +msgstr "此方法是幂等的,所以它可在服务器已在运行时被调用。" + +#: ../../library/asyncio-eventloop.rst:1839 +msgid "" +"The *start_serving* keyword-only parameter to :meth:`loop.create_server` and" +" :meth:`asyncio.start_server` allows creating a Server object that is not " +"accepting connections initially. In this case ``Server.start_serving()``, " +"or :meth:`Server.serve_forever` can be used to make the Server start " +"accepting connections." +msgstr "" +"传给 :meth:`loop.create_server` 和 :meth:`asyncio.start_server` 的 " +"*start_serving* 仅限关键字形参允许创建不接受初始连接的 Server 对象。在此情况下可以使用 " +"``Server.start_serving()`` 或 :meth:`Server.serve_forever` 让 Server 对象开始接受连接。" + +#: ../../library/asyncio-eventloop.rst:1851 +msgid "" +"Start accepting connections until the coroutine is cancelled. Cancellation " +"of ``serve_forever`` task causes the server to be closed." +msgstr "开始接受连接,直到协程被取消。``serve_forever`` 任务的取消将导致服务器被关闭。" + +#: ../../library/asyncio-eventloop.rst:1855 +msgid "" +"This method can be called if the server is already accepting connections. " +"Only one ``serve_forever`` task can exist per one *Server* object." +msgstr "如果服务器已经在接受连接了,这个方法可以被调用。每个 *Server* 对象,仅能有一个 ``serve_forever`` 任务。" + +#: ../../library/asyncio-eventloop.rst:1861 +msgid "" +"async def client_connected(reader, writer):\n" +" # Communicate with the client with\n" +" # reader/writer streams. For example:\n" +" await reader.readline()\n" +"\n" +"async def main(host, port):\n" +" srv = await asyncio.start_server(\n" +" client_connected, host, port)\n" +" await srv.serve_forever()\n" +"\n" +"asyncio.run(main('127.0.0.1', 0))" +msgstr "" +"async def client_connected(reader, writer):\n" +" # 使用 reader/writer 流与客户端通信。例如:\n" +" await reader.readline()\n" +"\n" +"async def main(host, port):\n" +" srv = await asyncio.start_server(\n" +" client_connected, host, port)\n" +" await srv.serve_forever()\n" +"\n" +"asyncio.run(main('127.0.0.1', 0))" + +#: ../../library/asyncio-eventloop.rst:1877 +msgid "Return ``True`` if the server is accepting new connections." +msgstr "如果服务器正在接受新连接的状态,返回 ``True``。" + +#: ../../library/asyncio-eventloop.rst:1884 +msgid "" +"Wait until the :meth:`close` method completes and all active connections " +"have finished." +msgstr "等待直到 :meth:`close` 方法完成且所有活动的连接结束。" + +#: ../../library/asyncio-eventloop.rst:1889 +msgid "" +"List of socket-like objects, ``asyncio.trsock.TransportSocket``, which the " +"server is listening on." +msgstr "由类套接字对象组成的列表 ``asyncio.trsock.TransportSocket``,服务器将监听这些对象。" + +#: ../../library/asyncio-eventloop.rst:1892 +msgid "" +"Prior to Python 3.7 ``Server.sockets`` used to return an internal list of " +"server sockets directly. In 3.7 a copy of that list is returned." +msgstr "" +"在 Python 3.7 之前 ``Server.sockets`` 会直接返回内部的服务器套接字列表。在 3.7 版则会返回该列表的副本。" + +#: ../../library/asyncio-eventloop.rst:1902 +msgid "Event loop implementations" +msgstr "事件循环实现" + +#: ../../library/asyncio-eventloop.rst:1904 +msgid "" +"asyncio ships with two different event loop implementations: " +":class:`SelectorEventLoop` and :class:`ProactorEventLoop`." +msgstr "" +"asyncio 带有两种不同的事件循环实现::class:`SelectorEventLoop` 和 " +":class:`ProactorEventLoop`." + +#: ../../library/asyncio-eventloop.rst:1907 +msgid "By default asyncio is configured to use :class:`EventLoop`." +msgstr "在默认情况下 asyncio 将被配置为使用 :class:`EventLoop`。" + +#: ../../library/asyncio-eventloop.rst:1912 +msgid "" +"A subclass of :class:`AbstractEventLoop` based on the :mod:`selectors` " +"module." +msgstr "基于 :mod:`selectors` 模块的 :class:`AbstractEventLoop` 的子类。" + +#: ../../library/asyncio-eventloop.rst:1915 +msgid "" +"Uses the most efficient *selector* available for the given platform. It is " +"also possible to manually configure the exact selector implementation to be " +"used::" +msgstr "使用给定平台中最高效的可用 *selector*。也可以手动配置要使用的特定 selector::" + +#: ../../library/asyncio-eventloop.rst:1919 +msgid "" +"import asyncio\n" +"import selectors\n" +"\n" +"async def main():\n" +" ...\n" +"\n" +"loop_factory = lambda: asyncio.SelectorEventLoop(selectors.SelectSelector())\n" +"asyncio.run(main(), loop_factory=loop_factory)" +msgstr "" +"import asyncio\n" +"import selectors\n" +"\n" +"async def main():\n" +" ...\n" +"\n" +"loop_factory = lambda: asyncio.SelectorEventLoop(selectors.SelectSelector())\n" +"asyncio.run(main(), loop_factory=loop_factory)" + +#: ../../library/asyncio-eventloop.rst:1934 +msgid "" +"A subclass of :class:`AbstractEventLoop` for Windows that uses \"I/O " +"Completion Ports\" (IOCP)." +msgstr "" +"使用 \"I/O Completion Ports\" (IOCP) 的针对 Windows 的 :class:`AbstractEventLoop` " +"子类。" + +#: ../../library/asyncio-eventloop.rst:1940 +msgid "" +"`MSDN documentation on I/O Completion Ports " +"`_." +msgstr "" +"`有关 I/O 完成端口的 MSDN 文档 `_." + +#: ../../library/asyncio-eventloop.rst:1945 +msgid "" +"An alias to the most efficient available subclass of " +":class:`AbstractEventLoop` for the given platform." +msgstr "在给定平台上可用的最高效的 :class:`AbstractEventLoop` 子类的别名。" + +#: ../../library/asyncio-eventloop.rst:1948 +msgid "" +"It is an alias to :class:`SelectorEventLoop` on Unix and " +":class:`ProactorEventLoop` on Windows." +msgstr "" +"它在 Unix 上是 :class:`SelectorEventLoop` 的别名而在 Windows 上是 " +":class:`ProactorEventLoop` 的别名。" + +#: ../../library/asyncio-eventloop.rst:1954 +msgid "Abstract base class for asyncio-compliant event loops." +msgstr "asyncio 兼容事件循环的抽象基类。" + +#: ../../library/asyncio-eventloop.rst:1956 +msgid "" +"The :ref:`asyncio-event-loop-methods` section lists all methods that an " +"alternative implementation of ``AbstractEventLoop`` should have defined." +msgstr "" +":ref:`asyncio-event-loop-methods` 一节列出了 ``AbstractEventLoop`` " +"的替代实现应当要定义的所有方法。" + +#: ../../library/asyncio-eventloop.rst:1962 +msgid "Examples" +msgstr "例子" + +#: ../../library/asyncio-eventloop.rst:1964 +msgid "" +"Note that all examples in this section **purposefully** show how to use the " +"low-level event loop APIs, such as :meth:`loop.run_forever` and " +":meth:`loop.call_soon`. Modern asyncio applications rarely need to be " +"written this way; consider using the high-level functions like " +":func:`asyncio.run`." +msgstr "" +"请注意本节中的所有示例都 **有意地** 演示了如何使用低层级的事件循环 API,例如 :meth:`loop.run_forever` 和 " +":meth:`loop.call_soon`。现代的 asyncio 应用很少需要以这样的方式编写;请考虑使用高层级的函数例如 " +":func:`asyncio.run`." + +#: ../../library/asyncio-eventloop.rst:1974 +msgid "Hello World with call_soon()" +msgstr "call_soon() 的 Hello World 示例。" + +#: ../../library/asyncio-eventloop.rst:1976 +msgid "" +"An example using the :meth:`loop.call_soon` method to schedule a callback. " +"The callback displays ``\"Hello World\"`` and then stops the event loop::" +msgstr "" +"一个使用 :meth:`loop.call_soon` 方法来安排回调的示例。回调会显示 ``\"Hello World\"`` 然后停止事件循环::" + +#: ../../library/asyncio-eventloop.rst:1980 +msgid "" +"import asyncio\n" +"\n" +"def hello_world(loop):\n" +" \"\"\"A callback to print 'Hello World' and stop the event loop\"\"\"\n" +" print('Hello World')\n" +" loop.stop()\n" +"\n" +"loop = asyncio.new_event_loop()\n" +"\n" +"# Schedule a call to hello_world()\n" +"loop.call_soon(hello_world, loop)\n" +"\n" +"# Blocking call interrupted by loop.stop()\n" +"try:\n" +" loop.run_forever()\n" +"finally:\n" +" loop.close()" +msgstr "" +"import asyncio\n" +"\n" +"def hello_world(loop):\n" +" \"\"\"打印 'Hello World' 并停止事件循环的回调\"\"\"\n" +" print('Hello World')\n" +" loop.stop()\n" +"\n" +"loop = asyncio.new_event_loop()\n" +"\n" +"# 将对 hello_world() 的调用加入计划任务\n" +"loop.call_soon(hello_world, loop)\n" +"\n" +"# 阻塞调用被 loop.stop() 中断\n" +"try:\n" +" loop.run_forever()\n" +"finally:\n" +" loop.close()" + +#: ../../library/asyncio-eventloop.rst:2000 +msgid "" +"A similar :ref:`Hello World ` example created with a coroutine " +"and the :func:`run` function." +msgstr "一个类似的 :ref:`Hello World ` 示例,使用协程和 :func:`run` 函数创建。" + +#: ../../library/asyncio-eventloop.rst:2007 +msgid "Display the current date with call_later()" +msgstr "使用 call_later() 来展示当前的日期" + +#: ../../library/asyncio-eventloop.rst:2009 +msgid "" +"An example of a callback displaying the current date every second. The " +"callback uses the :meth:`loop.call_later` method to reschedule itself after " +"5 seconds, and then stops the event loop::" +msgstr "" +"一个每秒刷新显示当前日期的示例。回调使用 :meth:`loop.call_later` 方法在 5 秒后将自身重新加入计划日程,然后停止事件循环::" + +#: ../../library/asyncio-eventloop.rst:2013 +msgid "" +"import asyncio\n" +"import datetime as dt\n" +"\n" +"def display_date(end_time, loop):\n" +" print(dt.datetime.now())\n" +" if (loop.time() + 1.0) < end_time:\n" +" loop.call_later(1, display_date, end_time, loop)\n" +" else:\n" +" loop.stop()\n" +"\n" +"loop = asyncio.new_event_loop()\n" +"\n" +"# Schedule the first call to display_date()\n" +"end_time = loop.time() + 5.0\n" +"loop.call_soon(display_date, end_time, loop)\n" +"\n" +"# Blocking call interrupted by loop.stop()\n" +"try:\n" +" loop.run_forever()\n" +"finally:\n" +" loop.close()" +msgstr "" +"import asyncio\n" +"import datetime as dt\n" +"\n" +"def display_date(end_time, loop):\n" +" print(dt.datetime.now())\n" +" if (loop.time() + 1.0) < end_time:\n" +" loop.call_later(1, display_date, end_time, loop)\n" +" else:\n" +" loop.stop()\n" +"\n" +"loop = asyncio.new_event_loop()\n" +"\n" +"# 将对 display_date() 的第一次调用加入计划任务\n" +"end_time = loop.time() + 5.0\n" +"loop.call_soon(display_date, end_time, loop)\n" +"\n" +"# 被 loop.stop() 中断的阻塞调用\n" +"try:\n" +" loop.run_forever()\n" +"finally:\n" +" loop.close()" + +#: ../../library/asyncio-eventloop.rst:2037 +msgid "" +"A similar :ref:`current date ` example created with a" +" coroutine and the :func:`run` function." +msgstr "" +"一个类似的 :ref:`current date ` 示例,使用协程和 :func:`run` 函数创建。" + +#: ../../library/asyncio-eventloop.rst:2044 +msgid "Watch a file descriptor for read events" +msgstr "监控一个文件描述符的读事件" + +#: ../../library/asyncio-eventloop.rst:2046 +msgid "" +"Wait until a file descriptor received some data using the " +":meth:`loop.add_reader` method and then close the event loop::" +msgstr "使用 :meth:`loop.add_reader` 方法,等到文件描述符收到一些数据,然后关闭事件循环::" + +#: ../../library/asyncio-eventloop.rst:2049 +msgid "" +"import asyncio\n" +"from socket import socketpair\n" +"\n" +"# Create a pair of connected file descriptors\n" +"rsock, wsock = socketpair()\n" +"\n" +"loop = asyncio.new_event_loop()\n" +"\n" +"def reader():\n" +" data = rsock.recv(100)\n" +" print(\"Received:\", data.decode())\n" +"\n" +" # We are done: unregister the file descriptor\n" +" loop.remove_reader(rsock)\n" +"\n" +" # Stop the event loop\n" +" loop.stop()\n" +"\n" +"# Register the file descriptor for read event\n" +"loop.add_reader(rsock, reader)\n" +"\n" +"# Simulate the reception of data from the network\n" +"loop.call_soon(wsock.send, 'abc'.encode())\n" +"\n" +"try:\n" +" # Run the event loop\n" +" loop.run_forever()\n" +"finally:\n" +" # We are done. Close sockets and the event loop.\n" +" rsock.close()\n" +" wsock.close()\n" +" loop.close()" +msgstr "" +"import asyncio\n" +"from socket import socketpair\n" +"\n" +"# 创建一对已连接的文件描述符\n" +"rsock, wsock = socketpair()\n" +"\n" +"loop = asyncio.new_event_loop()\n" +"\n" +"def reader():\n" +" data = rsock.recv(100)\n" +" print(\"Received:\", data.decode())\n" +"\n" +" # 已完成:注销文件描述符\n" +" loop.remove_reader(rsock)\n" +"\n" +" # 停止事件循环\n" +" loop.stop()\n" +"\n" +"# 为读取事件注册文件描述符\n" +"loop.add_reader(rsock, reader)\n" +"\n" +"# 模拟从网络接收数据\n" +"loop.call_soon(wsock.send, 'abc'.encode())\n" +"\n" +"try:\n" +" # 运行事件循环\n" +" loop.run_forever()\n" +"finally:\n" +" # 已完成。关闭套接字和事件循环。\n" +" rsock.close()\n" +" wsock.close()\n" +" loop.close()" + +#: ../../library/asyncio-eventloop.rst:2084 +msgid "" +"A similar :ref:`example ` using " +"transports, protocols, and the :meth:`loop.create_connection` method." +msgstr "" +"一个类似的 :ref:`示例 `,使用传输、协议和 " +":meth:`loop.create_connection` 方法创建。" + +#: ../../library/asyncio-eventloop.rst:2088 +msgid "" +"Another similar :ref:`example ` " +"using the high-level :func:`asyncio.open_connection` function and streams." +msgstr "" +"另一个类似的 :ref:`示例 `,使用了高层级的 " +":func:`asyncio.open_connection` 函数和流。" + +#: ../../library/asyncio-eventloop.rst:2096 +msgid "Set signal handlers for SIGINT and SIGTERM" +msgstr "为 SIGINT 和 SIGTERM 设置信号处理器" + +#: ../../library/asyncio-eventloop.rst:2098 +msgid "(This ``signal`` example only works on Unix.)" +msgstr "(这个 ``signal`` 示例只适用于 Unix。)" + +#: ../../library/asyncio-eventloop.rst:2100 +msgid "" +"Register handlers for signals :const:`~signal.SIGINT` and " +":const:`~signal.SIGTERM` using the :meth:`loop.add_signal_handler` method::" +msgstr "" +"使用 :meth:`loop.add_signal_handler` 方法为信号 :const:`~signal.SIGINT` 和 " +":const:`~signal.SIGTERM` 注册处理器::" + +#: ../../library/asyncio-eventloop.rst:2103 +msgid "" +"import asyncio\n" +"import functools\n" +"import os\n" +"import signal\n" +"\n" +"def ask_exit(signame, loop):\n" +" print(\"got signal %s: exit\" % signame)\n" +" loop.stop()\n" +"\n" +"async def main():\n" +" loop = asyncio.get_running_loop()\n" +"\n" +" for signame in {'SIGINT', 'SIGTERM'}:\n" +" loop.add_signal_handler(\n" +" getattr(signal, signame),\n" +" functools.partial(ask_exit, signame, loop))\n" +"\n" +" await asyncio.sleep(3600)\n" +"\n" +"print(\"Event loop running for 1 hour, press Ctrl+C to interrupt.\")\n" +"print(f\"pid {os.getpid()}: send SIGINT or SIGTERM to exit.\")\n" +"\n" +"asyncio.run(main())" +msgstr "" +"import asyncio\n" +"import functools\n" +"import os\n" +"import signal\n" +"\n" +"def ask_exit(signame, loop):\n" +" print(\"got signal %s: exit\" % signame)\n" +" loop.stop()\n" +"\n" +"async def main():\n" +" loop = asyncio.get_running_loop()\n" +"\n" +" for signame in {'SIGINT', 'SIGTERM'}:\n" +" loop.add_signal_handler(\n" +" getattr(signal, signame),\n" +" functools.partial(ask_exit, signame, loop))\n" +"\n" +" await asyncio.sleep(3600)\n" +"\n" +"print(\"Event loop running for 1 hour, press Ctrl+C to interrupt.\")\n" +"print(f\"pid {os.getpid()}: send SIGINT or SIGTERM to exit.\")\n" +"\n" +"asyncio.run(main())" diff --git a/library/asyncio-exceptions.po b/library/asyncio-exceptions.po new file mode 100644 index 0000000000..9f554756cd --- /dev/null +++ b/library/asyncio-exceptions.po @@ -0,0 +1,109 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/asyncio-exceptions.rst:8 +msgid "Exceptions" +msgstr "异常" + +#: ../../library/asyncio-exceptions.rst:10 +msgid "**Source code:** :source:`Lib/asyncio/exceptions.py`" +msgstr "**源代码:** :source:`Lib/asyncio/exceptions.py`" + +#: ../../library/asyncio-exceptions.rst:16 +msgid "" +"A deprecated alias of :exc:`TimeoutError`, raised when the operation has " +"exceeded the given deadline." +msgstr ":exc:`TimeoutError` 的一个已被弃用的别名,会在操作超出了给定的时限时引发。" + +#: ../../library/asyncio-exceptions.rst:21 +msgid "This class was made an alias of :exc:`TimeoutError`." +msgstr "这个类是 :exc:`TimeoutError` 的别名。" + +#: ../../library/asyncio-exceptions.rst:26 +msgid "The operation has been cancelled." +msgstr "该操作已被取消。" + +#: ../../library/asyncio-exceptions.rst:28 +msgid "" +"This exception can be caught to perform custom operations when asyncio Tasks" +" are cancelled. In almost all situations the exception must be re-raised." +msgstr "取消 asyncio 任务时,可以捕获此异常以执行自定义操作。在几乎所有情况下,都必须重新引发异常。" + +#: ../../library/asyncio-exceptions.rst:34 +msgid "" +":exc:`CancelledError` is now a subclass of :class:`BaseException` rather " +"than :class:`Exception`." +msgstr "" +":exc:`CancelledError` 现在是 :class:`BaseException` 的子类而不是 :class:`Exception` " +"的子类。" + +#: ../../library/asyncio-exceptions.rst:39 +msgid "Invalid internal state of :class:`Task` or :class:`Future`." +msgstr ":class:`Task` 或 :class:`Future` 的内部状态无效。" + +#: ../../library/asyncio-exceptions.rst:41 +msgid "" +"Can be raised in situations like setting a result value for a *Future* " +"object that already has a result value set." +msgstr "在为已设置结果值的 *Future* 对象设置结果值等情况下,可以引发此异常。" + +#: ../../library/asyncio-exceptions.rst:47 +msgid "" +"The \"sendfile\" syscall is not available for the given socket or file type." +msgstr "\"sendfile\" 系统调用不适用于给定的套接字或文件类型。" + +#: ../../library/asyncio-exceptions.rst:50 +msgid "A subclass of :exc:`RuntimeError`." +msgstr ":exc:`RuntimeError` 的子类。" + +#: ../../library/asyncio-exceptions.rst:55 +msgid "The requested read operation did not complete fully." +msgstr "请求的读取操作未完全完成。" + +#: ../../library/asyncio-exceptions.rst:57 +msgid "Raised by the :ref:`asyncio stream APIs`." +msgstr "由 :ref:`asyncio stream APIs` 引发。" + +#: ../../library/asyncio-exceptions.rst:59 +msgid "This exception is a subclass of :exc:`EOFError`." +msgstr "此异常是 :exc:`EOFError` 的子类。" + +#: ../../library/asyncio-exceptions.rst:63 +msgid "The total number (:class:`int`) of expected bytes." +msgstr "预期字节的总数 (:class:`int`)。" + +#: ../../library/asyncio-exceptions.rst:67 +msgid "A string of :class:`bytes` read before the end of stream was reached." +msgstr "到达流结束之前读取的 :class:`bytes` 字符串。" + +#: ../../library/asyncio-exceptions.rst:72 +msgid "Reached the buffer size limit while looking for a separator." +msgstr "在查找分隔符时达到缓冲区大小限制。" + +#: ../../library/asyncio-exceptions.rst:74 +msgid "Raised by the :ref:`asyncio stream APIs `." +msgstr "由 :ref:`asyncio stream APIs ` 引发。" + +#: ../../library/asyncio-exceptions.rst:78 +msgid "The total number of to be consumed bytes." +msgstr "要消耗的字节总数。" diff --git a/library/asyncio-extending.po b/library/asyncio-extending.po new file mode 100644 index 0000000000..9a4f760d57 --- /dev/null +++ b/library/asyncio-extending.po @@ -0,0 +1,169 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/asyncio-extending.rst:6 +msgid "Extending" +msgstr "扩展" + +#: ../../library/asyncio-extending.rst:8 +msgid "" +"The main direction for :mod:`asyncio` extending is writing custom *event " +"loop* classes. Asyncio has helpers that could be used to simplify this task." +msgstr ":mod:`asyncio` 扩展的主要方向是编写自定义的 *事件循环* 类。asyncio 具有可以被用来简化此任务的辅助工具。" + +#: ../../library/asyncio-extending.rst:13 +msgid "" +"Third-parties should reuse existing asyncio code with caution, a new Python " +"version is free to break backward compatibility in *internal* part of API." +msgstr "第三方应当小心谨慎地重用现有的 asyncio 代码,新的 Python 版本可以自由地打破 API 的 *内部* 部分的向后兼容性。" + +#: ../../library/asyncio-extending.rst:19 +msgid "Writing a Custom Event Loop" +msgstr "编写自定义事件循环" + +#: ../../library/asyncio-extending.rst:21 +msgid "" +":class:`asyncio.AbstractEventLoop` declares very many methods. Implementing" +" all them from scratch is a tedious job." +msgstr ":class:`asyncio.AbstractEventLoop` 声明了大量的方法。从头开始全部实现它们将是一件烦琐的工作。" + +#: ../../library/asyncio-extending.rst:24 +msgid "" +"A loop can get many common methods implementation for free by inheriting " +"from :class:`asyncio.BaseEventLoop`." +msgstr "一个事件循环可以通过从 :class:`asyncio.BaseEventLoop` 继承来自动地获得许多常用方法的实现。" + +#: ../../library/asyncio-extending.rst:27 +msgid "" +"In turn, the successor should implement a bunch of *private* methods " +"declared but not implemented in :class:`asyncio.BaseEventLoop`." +msgstr "相应地,继承者应当实现多个在 :class:`asyncio.BaseEventLoop` 中已声明但未实现的 *私有* 方法。" + +#: ../../library/asyncio-extending.rst:30 +msgid "" +"For example, ``loop.create_connection()`` checks arguments, resolves DNS " +"addresses, and calls ``loop._make_socket_transport()`` that should be " +"implemented by inherited class. The ``_make_socket_transport()`` method is " +"not documented and is considered as an *internal* API." +msgstr "" +"例如,``loop.create_connection()`` 会检查参数,解析 DNS 地址,并调用应当由派生类来实现的 " +"``loop._make_socket_transport()``。``_make_socket_transport()`` 方法未被写入文档并被视为 " +"*内部* API。" + +#: ../../library/asyncio-extending.rst:38 +msgid "Future and Task private constructors" +msgstr "Future 和 Task 私有构造器" + +#: ../../library/asyncio-extending.rst:40 +msgid "" +":class:`asyncio.Future` and :class:`asyncio.Task` should be never created " +"directly, please use corresponding :meth:`loop.create_future` and " +":meth:`loop.create_task`, or :func:`asyncio.create_task` factories instead." +msgstr "" +":class:`asyncio.Future` 和 :class:`asyncio.Task` 不应该被直接实例化,请使用对应的 " +":meth:`loop.create_future`, :meth:`loop.create_task` 或 " +":func:`asyncio.create_task` 工厂函数。" + +#: ../../library/asyncio-extending.rst:44 +msgid "" +"However, third-party *event loops* may *reuse* built-in future and task " +"implementations for the sake of getting a complex and highly optimized code " +"for free." +msgstr "但是,第三方 *事件循环* 可能会 *重用* 内置的 Future 和 Task 实现以自动获得复杂且高度优化的代码。" + +#: ../../library/asyncio-extending.rst:47 +msgid "For this purpose the following, *private* constructors are listed:" +msgstr "出于这个目的,下面列出了相应的 *私有* 构造器:" + +#: ../../library/asyncio-extending.rst:51 +msgid "Create a built-in future instance." +msgstr "创建一个内置的 Future 实例。" + +#: ../../library/asyncio-extending.rst:53 +msgid "*loop* is an optional event loop instance." +msgstr "*loop* 是一个可选的事件循环实例。" + +#: ../../library/asyncio-extending.rst:57 +msgid "Create a built-in task instance." +msgstr "创建一个内置的 Task 实例。" + +#: ../../library/asyncio-extending.rst:59 +msgid "" +"*loop* is an optional event loop instance. The rest of arguments are " +"described in :meth:`loop.create_task` description." +msgstr "*loop* 是一个可选的事件循环实例。其余参数会在 :meth:`loop.create_task` 说明中加以描述。" + +#: ../../library/asyncio-extending.rst:64 +msgid "*context* argument is added." +msgstr "添加了 *context* 参数。" + +#: ../../library/asyncio-extending.rst:69 +msgid "Task lifetime support" +msgstr "Task 生命周期支持" + +#: ../../library/asyncio-extending.rst:71 +msgid "" +"A third party task implementation should call the following functions to " +"keep a task visible by :func:`asyncio.all_tasks` and " +":func:`asyncio.current_task`:" +msgstr "" +"第三方任务实现应当调用下列函数以使任务对 :func:`asyncio.all_tasks` 和 " +":func:`asyncio.current_task` 可见:" + +#: ../../library/asyncio-extending.rst:76 +msgid "Register a new *task* as managed by *asyncio*." +msgstr "注册一个新的 *task* 并由 *asyncio* 管理。" + +#: ../../library/asyncio-extending.rst:78 +msgid "Call the function from a task constructor." +msgstr "在任务构造器中调用此函数。" + +#: ../../library/asyncio-extending.rst:82 +msgid "Unregister a *task* from *asyncio* internal structures." +msgstr "从 *asyncio* 内部结构中注销 *task*。" + +#: ../../library/asyncio-extending.rst:84 +msgid "The function should be called when a task is about to finish." +msgstr "此函数应当在任务将要结束时被调用。" + +#: ../../library/asyncio-extending.rst:88 +msgid "Switch the current task to the *task* argument." +msgstr "将当前任务切换为 *task* 参数。" + +#: ../../library/asyncio-extending.rst:90 +msgid "" +"Call the function just before executing a portion of embedded *coroutine* " +"(:meth:`coroutine.send` or :meth:`coroutine.throw`)." +msgstr "" +"在执行嵌入的 *coroutine* (:meth:`coroutine.send` 或 :meth:`coroutine.throw`) " +"的一部分之前调用此函数。" + +#: ../../library/asyncio-extending.rst:95 +msgid "Switch the current task back from *task* to ``None``." +msgstr "将当前任务从 *task* 切换回 ``None``。" + +#: ../../library/asyncio-extending.rst:97 +msgid "" +"Call the function just after :meth:`coroutine.send` or " +":meth:`coroutine.throw` execution." +msgstr "在 :meth:`coroutine.send` 或 :meth:`coroutine.throw` 执行之后调用此函数。" diff --git a/library/asyncio-future.po b/library/asyncio-future.po new file mode 100644 index 0000000000..10415b6e4a --- /dev/null +++ b/library/asyncio-future.po @@ -0,0 +1,465 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/asyncio-future.rst:8 +msgid "Futures" +msgstr "Futures" + +#: ../../library/asyncio-future.rst:10 +msgid "" +"**Source code:** :source:`Lib/asyncio/futures.py`, " +":source:`Lib/asyncio/base_futures.py`" +msgstr "" +"**源代码:** :source:`Lib/asyncio/futures.py`, " +":source:`Lib/asyncio/base_futures.py`" + +#: ../../library/asyncio-future.rst:15 +msgid "" +"*Future* objects are used to bridge **low-level callback-based code** with " +"high-level async/await code." +msgstr "*Future* 对象用来链接 **底层回调式代码** 和高层异步/等待式代码。" + +#: ../../library/asyncio-future.rst:20 +msgid "Future Functions" +msgstr "Future 函数" + +#: ../../library/asyncio-future.rst:24 +msgid "Return ``True`` if *obj* is either of:" +msgstr "如果 *obj* 为下面任意对象,返回 ``True``:" + +#: ../../library/asyncio-future.rst:26 +msgid "an instance of :class:`asyncio.Future`," +msgstr "一个 :class:`asyncio.Future` 类的实例," + +#: ../../library/asyncio-future.rst:27 +msgid "an instance of :class:`asyncio.Task`," +msgstr "一个 :class:`asyncio.Task` 类的实例," + +#: ../../library/asyncio-future.rst:28 +msgid "a Future-like object with a ``_asyncio_future_blocking`` attribute." +msgstr "带有 ``_asyncio_future_blocking`` 属性的类似 Future 的对象。" + +#: ../../library/asyncio-future.rst:36 +msgid "Return:" +msgstr "返回:" + +#: ../../library/asyncio-future.rst:38 +msgid "" +"*obj* argument as is, if *obj* is a :class:`Future`, a :class:`Task`, or a " +"Future-like object (:func:`isfuture` is used for the test.)" +msgstr "" +"*obj* 参数会保持原样,如果 *obj* 是 :class:`Future`、 :class:`Task` 或类似 Future 的对象 ( " +":func:`isfuture` 用于测试。)" + +#: ../../library/asyncio-future.rst:42 +msgid "" +"a :class:`Task` object wrapping *obj*, if *obj* is a coroutine " +"(:func:`iscoroutine` is used for the test); in this case the coroutine will " +"be scheduled by ``ensure_future()``." +msgstr "" +"封装了 *obj* 的 :class:`Task` 对象,如果 *obj* 是一个协程 (使用 :func:`iscoroutine` " +"进行检测);在此情况下该协程将通过 ``ensure_future()`` 加入执行计划。" + +#: ../../library/asyncio-future.rst:47 +msgid "" +"a :class:`Task` object that would await on *obj*, if *obj* is an awaitable " +"(:func:`inspect.isawaitable` is used for the test.)" +msgstr "" +"等待 *obj* 的 :class:`Task` 对象,如果 *obj* 是一个可等待对象 ( :func:`inspect.isawaitable` " +"用于测试)" + +#: ../../library/asyncio-future.rst:50 +msgid "If *obj* is neither of the above a :exc:`TypeError` is raised." +msgstr "如果 *obj* 不是上述对象会引发一个 :exc:`TypeError` 异常。" + +#: ../../library/asyncio-future.rst:54 +msgid "" +"Save a reference to the result of this function, to avoid a task " +"disappearing mid-execution." +msgstr "保存一个指向此函数的结果的引用,以避免任务在执行期间消失。" + +#: ../../library/asyncio-future.rst:57 +msgid "" +"See also the :func:`create_task` function which is the preferred way for " +"creating new tasks or use :class:`asyncio.TaskGroup` which keeps reference " +"to the task internally." +msgstr "" +"另请参阅 :func:`create_task` 函数,它是创建新任务的首选方式或者使用 " +":class:`asyncio.TaskGroup`,它会在内部保存指向任务的引用。" + +#: ../../library/asyncio-future.rst:61 +msgid "The function accepts any :term:`awaitable` object." +msgstr "这个函数接受任意 :term:`awaitable` 对象。" + +#: ../../library/asyncio-future.rst:64 +msgid "" +"Deprecation warning is emitted if *obj* is not a Future-like object and " +"*loop* is not specified and there is no running event loop." +msgstr "如果 *obj* 不是 Future 类对象同时未指定 *loop* 并且没有正在运行的事件循环则会发出弃用警告。" + +#: ../../library/asyncio-future.rst:71 +msgid "" +"Wrap a :class:`concurrent.futures.Future` object in a " +":class:`asyncio.Future` object." +msgstr "" +"将一个 :class:`concurrent.futures.Future` 对象封装到 :class:`asyncio.Future` 对象中。" + +#: ../../library/asyncio-future.rst:74 +msgid "" +"Deprecation warning is emitted if *future* is not a Future-like object and " +"*loop* is not specified and there is no running event loop." +msgstr "如果 *future* 不是 Future 类对象同时未指定 *loop* 并且没有正在运行的事件循环则会发出弃用警告。" + +#: ../../library/asyncio-future.rst:81 +msgid "Future Object" +msgstr "Future 对象" + +#: ../../library/asyncio-future.rst:85 +msgid "" +"A Future represents an eventual result of an asynchronous operation. Not " +"thread-safe." +msgstr "一个 Future 代表一个异步运算的最终结果。线程不安全。" + +#: ../../library/asyncio-future.rst:88 +msgid "" +"Future is an :term:`awaitable` object. Coroutines can await on Future " +"objects until they either have a result or an exception set, or until they " +"are cancelled. A Future can be awaited multiple times and the result is " +"same." +msgstr "" +"Future 是一个 :term:`awaitable` 对象。协程可以等待 Future 对象直到它们有结果或设置了异常,或者直到它们被取消。一个 " +"Future 可被等待多次并且结果相同。" + +#: ../../library/asyncio-future.rst:93 +msgid "" +"Typically Futures are used to enable low-level callback-based code (e.g. in " +"protocols implemented using asyncio :ref:`transports `) to interoperate with high-level async/await code." +msgstr "" +"通常 Future 用于支持底层回调式代码 (例如在协议实现中使用 asyncio :ref:`transports `) 与高层异步/等待式代码交互。" + +#: ../../library/asyncio-future.rst:98 +msgid "" +"The rule of thumb is to never expose Future objects in user-facing APIs, and" +" the recommended way to create a Future object is to call " +":meth:`loop.create_future`. This way alternative event loop implementations" +" can inject their own optimized implementations of a Future object." +msgstr "" +"经验告诉我们永远不要在面向用户的接口中暴露 Future 对象,同时建议使用 :meth:`loop.create_future` 来创建 Future" +" 对象。这种方法可以让其它事件循环实现注入自己的优化版 Future 对象。" + +#: ../../library/asyncio-future.rst:104 +msgid "Added support for the :mod:`contextvars` module." +msgstr "加入对 :mod:`contextvars` 模块的支持。" + +#: ../../library/asyncio-future.rst:107 +msgid "" +"Deprecation warning is emitted if *loop* is not specified and there is no " +"running event loop." +msgstr "如果未指定 *loop* 并且没有正在运行的事件循环则会发出弃用警告。" + +#: ../../library/asyncio-future.rst:113 +msgid "Return the result of the Future." +msgstr "返回 Future 的结果。" + +#: ../../library/asyncio-future.rst:115 +msgid "" +"If the Future is *done* and has a result set by the :meth:`set_result` " +"method, the result value is returned." +msgstr "如果 Future 状态为 *完成* ,并由 :meth:`set_result` 方法设置一个结果,则返回这个结果。" + +#: ../../library/asyncio-future.rst:118 +msgid "" +"If the Future is *done* and has an exception set by the " +":meth:`set_exception` method, this method raises the exception." +msgstr "如果 Future 状态为 *完成* ,并由 :meth:`set_exception` 方法设置一个异常,那么这个方法会引发异常。" + +#: ../../library/asyncio-future.rst:121 ../../library/asyncio-future.rst:213 +msgid "" +"If the Future has been *cancelled*, this method raises a " +":exc:`CancelledError` exception." +msgstr "如果 Future 已 *取消*,方法会引发一个 :exc:`CancelledError` 异常。" + +#: ../../library/asyncio-future.rst:124 +msgid "" +"If the Future's result isn't yet available, this method raises an " +":exc:`InvalidStateError` exception." +msgstr "如果 Future 的结果还不可用,此方法会引发一个 :exc:`InvalidStateError` 异常。" + +#: ../../library/asyncio-future.rst:129 +msgid "Mark the Future as *done* and set its result." +msgstr "将 Future 标记为 *完成* 并设置结果。" + +#: ../../library/asyncio-future.rst:131 ../../library/asyncio-future.rst:138 +msgid "" +"Raises an :exc:`InvalidStateError` error if the Future is already *done*." +msgstr "如果 Future 已经 *完成* 则抛出一个 :exc:`InvalidStateError` 错误。" + +#: ../../library/asyncio-future.rst:136 +msgid "Mark the Future as *done* and set an exception." +msgstr "将 Future 标记为 *完成* 并设置一个异常。" + +#: ../../library/asyncio-future.rst:143 +msgid "Return ``True`` if the Future is *done*." +msgstr "如果 Future 为已 *完成* 则返回 ``True``。" + +#: ../../library/asyncio-future.rst:145 +msgid "" +"A Future is *done* if it was *cancelled* or if it has a result or an " +"exception set with :meth:`set_result` or :meth:`set_exception` calls." +msgstr "" +"如果 Future 为 *取消* 或调用 :meth:`set_result` 设置了结果或调用 :meth:`set_exception` " +"设置了异常,那么它就是 *完成* 。" + +#: ../../library/asyncio-future.rst:151 +msgid "Return ``True`` if the Future was *cancelled*." +msgstr "如果 Future 已 *取消* 则返回 ``True``" + +#: ../../library/asyncio-future.rst:153 +msgid "" +"The method is usually used to check if a Future is not *cancelled* before " +"setting a result or an exception for it::" +msgstr "这个方法通常在设置结果或异常前用来检查 Future 是否已 *取消* ::" + +#: ../../library/asyncio-future.rst:156 +msgid "" +"if not fut.cancelled():\n" +" fut.set_result(42)" +msgstr "" +"if not fut.cancelled():\n" +" fut.set_result(42)" + +#: ../../library/asyncio-future.rst:161 +msgid "Add a callback to be run when the Future is *done*." +msgstr "添加一个在 Future *完成* 时运行的回调函数。" + +#: ../../library/asyncio-future.rst:163 +msgid "The *callback* is called with the Future object as its only argument." +msgstr "调用 *callback* 时,Future 对象是它的唯一参数。" + +#: ../../library/asyncio-future.rst:166 +msgid "" +"If the Future is already *done* when this method is called, the callback is " +"scheduled with :meth:`loop.call_soon`." +msgstr "如果调用这个方法时 Future 已经 *完成*,回调函数会被 :meth:`loop.call_soon` 调度。" + +#: ../../library/asyncio-future.rst:169 +msgid "" +"An optional keyword-only *context* argument allows specifying a custom " +":class:`contextvars.Context` for the *callback* to run in. The current " +"context is used when no *context* is provided." +msgstr "" +"可选的仅限关键字参数 *context* 允许 *callback* 运行在一个指定的自定义 :class:`contextvars.Context` " +"对象中。如果没有提供 *context* ,则使用当前上下文。" + +#: ../../library/asyncio-future.rst:173 +msgid "" +":func:`functools.partial` can be used to pass parameters to the callback, " +"e.g.::" +msgstr "可以用 :func:`functools.partial` 给回调函数传递参数,例如::" + +#: ../../library/asyncio-future.rst:176 +msgid "" +"# Call 'print(\"Future:\", fut)' when \"fut\" is done.\n" +"fut.add_done_callback(\n" +" functools.partial(print, \"Future:\"))" +msgstr "" +"# 当 \"fut\" 已完成时则调用 'print(\"Future:\", fut)'.\n" +"fut.add_done_callback(\n" +" functools.partial(print, \"Future:\"))" + +#: ../../library/asyncio-future.rst:180 +msgid "" +"The *context* keyword-only parameter was added. See :pep:`567` for more " +"details." +msgstr "加入仅限关键字形参 *context*。请参阅 :pep:`567` 查看更多细节。" + +#: ../../library/asyncio-future.rst:186 +msgid "Remove *callback* from the callbacks list." +msgstr "从回调列表中移除 *callback* 。" + +#: ../../library/asyncio-future.rst:188 +msgid "" +"Returns the number of callbacks removed, which is typically 1, unless a " +"callback was added more than once." +msgstr "返回被移除的回调函数的数量,通常为 1,除非一个回调函数被添加多次。" + +#: ../../library/asyncio-future.rst:193 +msgid "Cancel the Future and schedule callbacks." +msgstr "取消 Future 并调度回调函数。" + +#: ../../library/asyncio-future.rst:195 +msgid "" +"If the Future is already *done* or *cancelled*, return ``False``. Otherwise," +" change the Future's state to *cancelled*, schedule the callbacks, and " +"return ``True``." +msgstr "" +"如果 Future 已经 *完成* 或 *取消* ,返回 ``False``。否则将 Future 状态改为 *取消* 并在调度回调函数后返回 " +"``True``." + +#: ../../library/asyncio-future.rst:199 +msgid "" +"The optional string argument *msg* is passed as the argument to the " +":exc:`CancelledError` exception raised when a cancelled Future is awaited." +msgstr "可选参数 *msg* 将被作为传给在等待已取消的 Future 时引发的 :exc:`CancelledError` 异常的参数。" + +#: ../../library/asyncio-future.rst:203 +msgid "Added the *msg* parameter." +msgstr "增加了 *msg* 形参。" + +#: ../../library/asyncio-future.rst:208 +msgid "Return the exception that was set on this Future." +msgstr "返回 Future 已设置的异常。" + +#: ../../library/asyncio-future.rst:210 +msgid "" +"The exception (or ``None`` if no exception was set) is returned only if the " +"Future is *done*." +msgstr "只有 Future 在 *完成* 时才返回异常(或者 ``None``,如果没有设置异常)。" + +#: ../../library/asyncio-future.rst:216 +msgid "" +"If the Future isn't *done* yet, this method raises an " +":exc:`InvalidStateError` exception." +msgstr "如果 Future 还没 *完成* ,这个方法会引发一个 :exc:`InvalidStateError` 异常。" + +#: ../../library/asyncio-future.rst:221 +msgid "Return the event loop the Future object is bound to." +msgstr "返回 Future 对象已绑定的事件循环。" + +#: ../../library/asyncio-future.rst:228 +msgid "" +"This example creates a Future object, creates and schedules an asynchronous " +"Task to set result for the Future, and waits until the Future has a result::" +msgstr "这个例子创建一个 Future 对象,创建和调度一个异步任务去设置 Future 结果,然后等待其结果::" + +#: ../../library/asyncio-future.rst:232 +msgid "" +"async def set_after(fut, delay, value):\n" +" # Sleep for *delay* seconds.\n" +" await asyncio.sleep(delay)\n" +"\n" +" # Set *value* as a result of *fut* Future.\n" +" fut.set_result(value)\n" +"\n" +"async def main():\n" +" # Get the current event loop.\n" +" loop = asyncio.get_running_loop()\n" +"\n" +" # Create a new Future object.\n" +" fut = loop.create_future()\n" +"\n" +" # Run \"set_after()\" coroutine in a parallel Task.\n" +" # We are using the low-level \"loop.create_task()\" API here because\n" +" # we already have a reference to the event loop at hand.\n" +" # Otherwise we could have just used \"asyncio.create_task()\".\n" +" loop.create_task(\n" +" set_after(fut, 1, '... world'))\n" +"\n" +" print('hello ...')\n" +"\n" +" # Wait until *fut* has a result (1 second) and print it.\n" +" print(await fut)\n" +"\n" +"asyncio.run(main())" +msgstr "" +"async def set_after(fut, delay, value):\n" +" # 休眠 *delay* 秒。\n" +" await asyncio.sleep(delay)\n" +"\n" +" # 将 *value* 设为 Future 对象 *fut* 的结果。\n" +" fut.set_result(value)\n" +"\n" +"async def main():\n" +" # 获取当前事件循环。\n" +" loop = asyncio.get_running_loop()\n" +"\n" +" # 新建一个 Future 对象。\n" +" fut = loop.create_future()\n" +"\n" +" # 在一个并行的任务中运行 \"set_after()\" 协程。\n" +" # 在这里我们使用低层级的 \"loop.create_task()\" API\n" +" # 因为我们手头已经拥有一个对事件循环的引用。\n" +" # 在其他情况下我们可以使用 \"asyncio.create_task()\"。\n" +" loop.create_task(\n" +" set_after(fut, 1, '... world'))\n" +"\n" +" print('hello ...')\n" +"\n" +" # 等待直到 *fut* 得出结果 (1 秒) 并打印它。\n" +" print(await fut)\n" +"\n" +"asyncio.run(main())" + +#: ../../library/asyncio-future.rst:263 +msgid "" +"The Future object was designed to mimic :class:`concurrent.futures.Future`." +" Key differences include:" +msgstr "该 Future 对象是为了模仿 :class:`concurrent.futures.Future` 类。主要差异包含:" + +#: ../../library/asyncio-future.rst:266 +msgid "" +"unlike asyncio Futures, :class:`concurrent.futures.Future` instances cannot " +"be awaited." +msgstr "与 asyncio 的 Future 不同,:class:`concurrent.futures.Future` 实例不是可等待对象。" + +#: ../../library/asyncio-future.rst:269 +msgid "" +":meth:`asyncio.Future.result` and :meth:`asyncio.Future.exception` do not " +"accept the *timeout* argument." +msgstr "" +":meth:`asyncio.Future.result` 和 :meth:`asyncio.Future.exception` 不接受 " +"*timeout* 参数。" + +#: ../../library/asyncio-future.rst:272 +msgid "" +":meth:`asyncio.Future.result` and :meth:`asyncio.Future.exception` raise an " +":exc:`InvalidStateError` exception when the Future is not *done*." +msgstr "" +"Future 没有 *完成* 时 :meth:`asyncio.Future.result` 和 " +":meth:`asyncio.Future.exception` 抛出一个 :exc:`InvalidStateError` 异常。" + +#: ../../library/asyncio-future.rst:276 +msgid "" +"Callbacks registered with :meth:`asyncio.Future.add_done_callback` are not " +"called immediately. They are scheduled with :meth:`loop.call_soon` instead." +msgstr "" +"使用 :meth:`asyncio.Future.add_done_callback` 注册的回调函数不会立即调用,而是被 " +":meth:`loop.call_soon` 调度。" + +#: ../../library/asyncio-future.rst:280 +msgid "" +"asyncio Future is not compatible with the :func:`concurrent.futures.wait` " +"and :func:`concurrent.futures.as_completed` functions." +msgstr "" +"asyncio Future 不能兼容 :func:`concurrent.futures.wait` 和 " +":func:`concurrent.futures.as_completed` 函数。" + +#: ../../library/asyncio-future.rst:284 +msgid "" +":meth:`asyncio.Future.cancel` accepts an optional ``msg`` argument, but " +":meth:`concurrent.futures.Future.cancel` does not." +msgstr "" +":meth:`asyncio.Future.cancel` 接受一个可选的 ``msg`` 参数,但 " +":meth:`concurrent.futures.Future.cancel` 无此参数。" diff --git a/library/asyncio-graph.po b/library/asyncio-graph.po new file mode 100644 index 0000000000..ae6f982298 --- /dev/null +++ b/library/asyncio-graph.po @@ -0,0 +1,247 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-09 16:24+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/asyncio-graph.rst:8 +msgid "Call graph introspection" +msgstr "" + +#: ../../library/asyncio-graph.rst:10 +msgid "**Source code:** :source:`Lib/asyncio/graph.py`" +msgstr "**源代码:** :source:`Lib/asyncio/graph.py`" + +#: ../../library/asyncio-graph.rst:14 +msgid "" +"asyncio has powerful runtime call graph introspection utilities to trace the" +" entire call graph of a running *coroutine* or *task*, or a suspended " +"*future*. These utilities and the underlying machinery can be used from " +"within a Python program or by external profilers and debuggers." +msgstr "" +"asyncio 具有强大的运行时调用图内省工具,可以跟踪正在运行的 *协程* 或 *任务* 或挂起的 *future* " +"的整个调用图。这些工具和底层机制可以在 Python 程序中使用,也可以由外部性能分析器和调试器使用。" + +#: ../../library/asyncio-graph.rst:22 +msgid ":ref:`asyncio-introspection-tools`" +msgstr "" + +#: ../../library/asyncio-graph.rst:23 +msgid "" +"Command-line tools for inspecting tasks in another running Python process." +msgstr "" + +#: ../../library/asyncio-graph.rst:31 +msgid "" +"Print the async call graph for the current task or the provided " +":class:`Task` or :class:`Future`." +msgstr "打印当前任务或提供的 :class:`Task` 或 :class:`Future` 的异步调用图。" + +#: ../../library/asyncio-graph.rst:34 +msgid "" +"This function prints entries starting from the top frame and going down " +"towards the invocation point." +msgstr "此函数从顶部帧开始打印条目,并向下打印到调用点。" + +#: ../../library/asyncio-graph.rst:37 +msgid "" +"The function receives an optional *future* argument. If not passed, the " +"current running task will be used." +msgstr "该函数接收一个可选的 *future* 参数。如果没有传入,则使用当前运行的任务。" + +#: ../../library/asyncio-graph.rst:40 ../../library/asyncio-graph.rst:99 +msgid "" +"If the function is called on *the current task*, the optional keyword-only " +"*depth* argument can be used to skip the specified number of frames from top" +" of the stack." +msgstr "如果在 *当前任务* 上调用该函数,可选的仅限关键字 *depth* 参数可用于从堆栈顶部跳过指定的帧数。" + +#: ../../library/asyncio-graph.rst:44 +msgid "" +"If the optional keyword-only *limit* argument is provided, each call stack " +"in the resulting graph is truncated to include at most ``abs(limit)`` " +"entries. If *limit* is positive, the entries left are the closest to the " +"invocation point. If *limit* is negative, the topmost entries are left. If " +"*limit* is omitted or ``None``, all entries are present. If *limit* is " +"``0``, the call stack is not printed at all, only \"awaited by\" information" +" is printed." +msgstr "" +"如果提供了可选的仅限关键字 *limit* 参数,则结果图中的每个调用堆栈将被截断,以最多包含 ``abs(limit)`` 项。如果 *limit* " +"为正数,则剩下的条目是最接近调用点的。如果 *limit* 为负数,则保留最上面的项。如果 *limit* 省略或为 " +"``None``,则所有条目都存在。如果 *limit* 为 ``0``,则根本不打印调用堆栈,只打印“awaited by”信息。" + +#: ../../library/asyncio-graph.rst:52 +msgid "" +"If *file* is omitted or ``None``, the function will print to " +":data:`sys.stdout`." +msgstr "如果 *file* 省略或为 ``None``,该函数将打印到 :data:`sys.stdout`。" + +#: ../../library/asyncio-graph.rst:55 +msgid "**Example:**" +msgstr "**示例:**" + +#: ../../library/asyncio-graph.rst:57 +msgid "The following Python code:" +msgstr "以下 Python 代码:" + +#: ../../library/asyncio-graph.rst:59 +msgid "" +"import asyncio\n" +"\n" +"async def test():\n" +" asyncio.print_call_graph()\n" +"\n" +"async def main():\n" +" async with asyncio.TaskGroup() as g:\n" +" g.create_task(test(), name='test')\n" +"\n" +"asyncio.run(main())" +msgstr "" +"import asyncio\n" +"\n" +"async def test():\n" +" asyncio.print_call_graph()\n" +"\n" +"async def main():\n" +" async with asyncio.TaskGroup() as g:\n" +" g.create_task(test(), name='test')\n" +"\n" +"asyncio.run(main())" + +#: ../../library/asyncio-graph.rst:72 +msgid "will print::" +msgstr "将打印::" + +#: ../../library/asyncio-graph.rst:74 +msgid "" +"* Task(name='test', id=0x1039f0fe0)\n" +"+ Call stack:\n" +"| File 't2.py', line 4, in async test()\n" +"+ Awaited by:\n" +" * Task(name='Task-1', id=0x103a5e060)\n" +" + Call stack:\n" +" | File 'taskgroups.py', line 107, in async TaskGroup.__aexit__()\n" +" | File 't2.py', line 7, in async main()" +msgstr "" +"* Task(name='test', id=0x1039f0fe0)\n" +"+ Call stack:\n" +"| File 't2.py', line 4, in async test()\n" +"+ Awaited by:\n" +" * Task(name='Task-1', id=0x103a5e060)\n" +" + Call stack:\n" +" | File 'taskgroups.py', line 107, in async TaskGroup.__aexit__()\n" +" | File 't2.py', line 7, in async main()" + +#: ../../library/asyncio-graph.rst:85 +msgid "" +"Like :func:`print_call_graph`, but returns a string. If *future* is ``None``" +" and there's no current task, the function returns an empty string." +msgstr "" +"类似于 :func:`print_call_graph`,但返回一个字符串。如果 *future* 为 ``None`` " +"并且没有当前任务,则该函数返回一个空字符串。" + +#: ../../library/asyncio-graph.rst:92 +msgid "" +"Capture the async call graph for the current task or the provided " +":class:`Task` or :class:`Future`." +msgstr "捕获当前任务或提供的 :class:`Task` 或 :class:`Future` 的异步调用图。" + +#: ../../library/asyncio-graph.rst:95 +msgid "" +"The function receives an optional *future* argument. If not passed, the " +"current running task will be used. If there's no current task, the function " +"returns ``None``." +msgstr "该函数接收一个可选的 *future* 参数。如果没有传入,则使用当前运行的任务。如果当前没有任务,该函数返回 ``None``。" + +#: ../../library/asyncio-graph.rst:103 +msgid "Returns a ``FutureCallGraph`` data class object:" +msgstr "返回一个 ``FutureCallGraph`` 数据类对象:" + +#: ../../library/asyncio-graph.rst:105 +msgid "``FutureCallGraph(future, call_stack, awaited_by)``" +msgstr "``FutureCallGraph(future, call_stack, awaited_by)``" + +#: ../../library/asyncio-graph.rst:107 +msgid "" +"Where *future* is a reference to a :class:`Future` or a :class:`Task` (or " +"their subclasses.)" +msgstr "其中 *future* 是一个指向 :class:`Future` 或 :class:`Task` (或其子类) 的引用。" + +#: ../../library/asyncio-graph.rst:110 +msgid "``call_stack`` is a tuple of ``FrameCallGraphEntry`` objects." +msgstr "``call_stack`` 是一个 ``FrameCallGraphEntry`` 对象的元组。" + +#: ../../library/asyncio-graph.rst:112 +msgid "``awaited_by`` is a tuple of ``FutureCallGraph`` objects." +msgstr "``awaited_by`` 是一个 ``FutureCallGraph`` 对象的元组。" + +#: ../../library/asyncio-graph.rst:114 +msgid "``FrameCallGraphEntry(frame)``" +msgstr "``FrameCallGraphEntry(frame)``" + +#: ../../library/asyncio-graph.rst:116 +msgid "" +"Where *frame* is a frame object of a regular Python function in the call " +"stack." +msgstr "其中 *frame* 是调用栈中常规 Python 函数的帧对象。" + +#: ../../library/asyncio-graph.rst:121 +msgid "Low level utility functions" +msgstr "底层实用工具函数" + +#: ../../library/asyncio-graph.rst:123 +msgid "" +"To introspect an async call graph asyncio requires cooperation from control " +"flow structures, such as :func:`shield` or :class:`TaskGroup`. Any time an " +"intermediate :class:`Future` object with low-level APIs like " +":meth:`Future.add_done_callback() ` is " +"involved, the following two functions should be used to inform asyncio about" +" how exactly such intermediate future objects are connected with the tasks " +"they wrap or control." +msgstr "" +"要内省一个异步调用图,asyncio 需要控制流结构的配合,比如 :func:`shield` 或 :class:`TaskGroup`。 " +"任何时候涉及到具有底层 API (如 :meth:`Future.add_done_callback() " +"`) 的中间 :class:`Future` 对象时,都应该使用以下两个函数来通知 " +"asyncio 这些中间 Future 对象是如何与它们包装或控制的任务连接的。" + +#: ../../library/asyncio-graph.rst:134 +msgid "Record that *future* is awaited on by *waiter*." +msgstr "记录 *future* 被 *waiter* 等待。" + +#: ../../library/asyncio-graph.rst:136 ../../library/asyncio-graph.rst:149 +msgid "" +"Both *future* and *waiter* must be instances of :class:`Future` or " +":class:`Task` or their subclasses, otherwise the call would have no effect." +msgstr "" +"*future* 和 *waiter* 都必须是 :class:`Future` 或 :class:`Task` " +"或它们的子类的实例,否则该调用将不起作用。" + +#: ../../library/asyncio-graph.rst:140 +msgid "" +"A call to ``future_add_to_awaited_by()`` must be followed by an eventual " +"call to the :func:`future_discard_from_awaited_by` function with the same " +"arguments." +msgstr "" +"调用 ``future_add_to_awaited_by()`` 必须随后使用相同的参数最终调用 " +":func:`future_discard_from_awaited_by` 函数。" + +#: ../../library/asyncio-graph.rst:147 +msgid "Record that *future* is no longer awaited on by *waiter*." +msgstr "记录 *future* 不再被 *waiter* 等待。" diff --git a/library/asyncio-llapi-index.po b/library/asyncio-llapi-index.po new file mode 100644 index 0000000000..293f8427ed --- /dev/null +++ b/library/asyncio-llapi-index.po @@ -0,0 +1,1059 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/asyncio-llapi-index.rst:6 +msgid "Low-level API Index" +msgstr "低层级 API 索引" + +#: ../../library/asyncio-llapi-index.rst:8 +msgid "This page lists all low-level asyncio APIs." +msgstr "本页列出所有低层级的 asyncio API。" + +#: ../../library/asyncio-llapi-index.rst:12 +msgid "Obtaining the Event Loop" +msgstr "获取事件循环" + +#: ../../library/asyncio-llapi-index.rst:18 +msgid ":func:`asyncio.get_running_loop`" +msgstr ":func:`asyncio.get_running_loop`" + +#: ../../library/asyncio-llapi-index.rst:19 +msgid "The **preferred** function to get the running event loop." +msgstr "获取当前运行的事件循环的 **首选** 函数。" + +#: ../../library/asyncio-llapi-index.rst:21 +msgid ":func:`asyncio.get_event_loop`" +msgstr ":func:`asyncio.get_event_loop`" + +#: ../../library/asyncio-llapi-index.rst:22 +msgid "" +"Get an event loop instance (running or current via the current policy)." +msgstr "获取一个事件循环实例(正在运行的事件循环或通过当前策略确定的当前事件循环)。" + +#: ../../library/asyncio-llapi-index.rst:24 +msgid ":func:`asyncio.set_event_loop`" +msgstr ":func:`asyncio.set_event_loop`" + +#: ../../library/asyncio-llapi-index.rst:25 +msgid "Set the event loop as current via the current policy." +msgstr "通过当前策略将事件循环设置为当前事件循环。" + +#: ../../library/asyncio-llapi-index.rst:27 +msgid ":func:`asyncio.new_event_loop`" +msgstr ":func:`asyncio.new_event_loop`" + +#: ../../library/asyncio-llapi-index.rst:28 +msgid "Create a new event loop." +msgstr "创建一个新的事件循环。" + +#: ../../library/asyncio-llapi-index.rst:32 +#: ../../library/asyncio-llapi-index.rst:269 +msgid "Examples" +msgstr "例子" + +#: ../../library/asyncio-llapi-index.rst:33 +msgid ":ref:`Using asyncio.get_running_loop() `." +msgstr ":ref:`使用 asyncio.get_running_loop() `。" + +#: ../../library/asyncio-llapi-index.rst:37 +msgid "Event Loop Methods" +msgstr "事件循环方法集" + +#: ../../library/asyncio-llapi-index.rst:39 +msgid "" +"See also the main documentation section about the :ref:`asyncio-event-loop-" +"methods`." +msgstr "另请参阅有关 :ref:`asyncio-event-loop-methods` 的主文档章节。" + +#: ../../library/asyncio-llapi-index.rst:42 +msgid "Lifecycle" +msgstr "生命周期" + +#: ../../library/asyncio-llapi-index.rst:47 +msgid ":meth:`loop.run_until_complete`" +msgstr ":meth:`loop.run_until_complete`" + +#: ../../library/asyncio-llapi-index.rst:48 +msgid "Run a Future/Task/awaitable until complete." +msgstr "运行一个期程/任务/可等待对象直到完成。" + +#: ../../library/asyncio-llapi-index.rst:50 +msgid ":meth:`loop.run_forever`" +msgstr ":meth:`loop.run_forever`" + +#: ../../library/asyncio-llapi-index.rst:51 +msgid "Run the event loop forever." +msgstr "一直运行事件循环。" + +#: ../../library/asyncio-llapi-index.rst:53 +msgid ":meth:`loop.stop`" +msgstr ":meth:`loop.stop`" + +#: ../../library/asyncio-llapi-index.rst:54 +msgid "Stop the event loop." +msgstr "停止事件循环。" + +#: ../../library/asyncio-llapi-index.rst:56 +msgid ":meth:`loop.close`" +msgstr ":meth:`loop.close`" + +#: ../../library/asyncio-llapi-index.rst:57 +msgid "Close the event loop." +msgstr "关闭事件循环。" + +#: ../../library/asyncio-llapi-index.rst:59 +msgid ":meth:`loop.is_running`" +msgstr ":meth:`loop.is_running`" + +#: ../../library/asyncio-llapi-index.rst:60 +msgid "Return ``True`` if the event loop is running." +msgstr "返回 ``True``,如果事件循环正在运行。" + +#: ../../library/asyncio-llapi-index.rst:62 +msgid ":meth:`loop.is_closed`" +msgstr ":meth:`loop.is_closed`" + +#: ../../library/asyncio-llapi-index.rst:63 +msgid "Return ``True`` if the event loop is closed." +msgstr "返回 ``True``,如果事件循环已经被关闭。" + +#: ../../library/asyncio-llapi-index.rst:65 +msgid "``await`` :meth:`loop.shutdown_asyncgens`" +msgstr "``await`` :meth:`loop.shutdown_asyncgens`" + +#: ../../library/asyncio-llapi-index.rst:66 +msgid "Close asynchronous generators." +msgstr "关闭异步生成器。" + +#: ../../library/asyncio-llapi-index.rst:69 +msgid "Debugging" +msgstr "调试" + +#: ../../library/asyncio-llapi-index.rst:74 +msgid ":meth:`loop.set_debug`" +msgstr ":meth:`loop.set_debug`" + +#: ../../library/asyncio-llapi-index.rst:75 +msgid "Enable or disable the debug mode." +msgstr "开启或禁用调试模式。" + +#: ../../library/asyncio-llapi-index.rst:77 +msgid ":meth:`loop.get_debug`" +msgstr ":meth:`loop.get_debug`" + +#: ../../library/asyncio-llapi-index.rst:78 +msgid "Get the current debug mode." +msgstr "获取当前调试模式。" + +#: ../../library/asyncio-llapi-index.rst:81 +msgid "Scheduling Callbacks" +msgstr "调度回调函数" + +#: ../../library/asyncio-llapi-index.rst:86 +msgid ":meth:`loop.call_soon`" +msgstr ":meth:`loop.call_soon`" + +#: ../../library/asyncio-llapi-index.rst:87 +msgid "Invoke a callback soon." +msgstr "尽快调用回调。" + +#: ../../library/asyncio-llapi-index.rst:89 +msgid ":meth:`loop.call_soon_threadsafe`" +msgstr ":meth:`loop.call_soon_threadsafe`" + +#: ../../library/asyncio-llapi-index.rst:90 +msgid "A thread-safe variant of :meth:`loop.call_soon`." +msgstr ":meth:`loop.call_soon` 方法线程安全的变体。" + +#: ../../library/asyncio-llapi-index.rst:92 +msgid ":meth:`loop.call_later`" +msgstr ":meth:`loop.call_later`" + +#: ../../library/asyncio-llapi-index.rst:93 +msgid "Invoke a callback *after* the given time." +msgstr "在给定时间 *之后* 调用回调函数。" + +#: ../../library/asyncio-llapi-index.rst:95 +msgid ":meth:`loop.call_at`" +msgstr ":meth:`loop.call_at`" + +#: ../../library/asyncio-llapi-index.rst:96 +msgid "Invoke a callback *at* the given time." +msgstr "在 *指定* 时间调用回调函数。" + +#: ../../library/asyncio-llapi-index.rst:99 +msgid "Thread/Interpreter/Process Pool" +msgstr "线程/解释器/进程池" + +#: ../../library/asyncio-llapi-index.rst:104 +msgid "``await`` :meth:`loop.run_in_executor`" +msgstr "``await`` :meth:`loop.run_in_executor`" + +#: ../../library/asyncio-llapi-index.rst:105 +msgid "" +"Run a CPU-bound or other blocking function in a :mod:`concurrent.futures` " +"executor." +msgstr "在 :mod:`concurrent.futures` 执行器中运行一个 CPU 密集型或其他阻塞函数。" + +#: ../../library/asyncio-llapi-index.rst:108 +msgid ":meth:`loop.set_default_executor`" +msgstr ":meth:`loop.set_default_executor`" + +#: ../../library/asyncio-llapi-index.rst:109 +msgid "Set the default executor for :meth:`loop.run_in_executor`." +msgstr "设置 :meth:`loop.run_in_executor` 默认执行器。" + +#: ../../library/asyncio-llapi-index.rst:112 +msgid "Tasks and Futures" +msgstr "任务与期程" + +#: ../../library/asyncio-llapi-index.rst:117 +msgid ":meth:`loop.create_future`" +msgstr ":meth:`loop.create_future`" + +#: ../../library/asyncio-llapi-index.rst:118 +msgid "Create a :class:`Future` object." +msgstr "创建一个 :class:`Future` 对象。" + +#: ../../library/asyncio-llapi-index.rst:120 +msgid ":meth:`loop.create_task`" +msgstr ":meth:`loop.create_task`" + +#: ../../library/asyncio-llapi-index.rst:121 +msgid "Schedule coroutine as a :class:`Task`." +msgstr "将协程当作 :class:`Task` 一样调度。" + +#: ../../library/asyncio-llapi-index.rst:123 +msgid ":meth:`loop.set_task_factory`" +msgstr ":meth:`loop.set_task_factory`" + +#: ../../library/asyncio-llapi-index.rst:124 +msgid "" +"Set a factory used by :meth:`loop.create_task` to create :class:`Tasks " +"`." +msgstr "设置 :meth:`loop.create_task` 使用的工厂,它将用来创建 :class:`Tasks `。" + +#: ../../library/asyncio-llapi-index.rst:127 +msgid ":meth:`loop.get_task_factory`" +msgstr ":meth:`loop.get_task_factory`" + +#: ../../library/asyncio-llapi-index.rst:128 +msgid "" +"Get the factory :meth:`loop.create_task` uses to create :class:`Tasks " +"`." +msgstr "获取 :meth:`loop.create_task` 使用的工厂,它用来创建 :class:`Tasks `。" + +#: ../../library/asyncio-llapi-index.rst:132 +msgid "DNS" +msgstr "DNS" + +#: ../../library/asyncio-llapi-index.rst:137 +msgid "``await`` :meth:`loop.getaddrinfo`" +msgstr "``await`` :meth:`loop.getaddrinfo`" + +#: ../../library/asyncio-llapi-index.rst:138 +msgid "Asynchronous version of :meth:`socket.getaddrinfo`." +msgstr "异步版的 :meth:`socket.getaddrinfo`。" + +#: ../../library/asyncio-llapi-index.rst:140 +msgid "``await`` :meth:`loop.getnameinfo`" +msgstr "``await`` :meth:`loop.getnameinfo`" + +#: ../../library/asyncio-llapi-index.rst:141 +msgid "Asynchronous version of :meth:`socket.getnameinfo`." +msgstr "异步版的 :meth:`socket.getnameinfo`。" + +#: ../../library/asyncio-llapi-index.rst:144 +msgid "Networking and IPC" +msgstr "网络和 IPC" + +#: ../../library/asyncio-llapi-index.rst:149 +msgid "``await`` :meth:`loop.create_connection`" +msgstr "``await`` :meth:`loop.create_connection`" + +#: ../../library/asyncio-llapi-index.rst:150 +msgid "Open a TCP connection." +msgstr "打开一个 TCP 连接。" + +#: ../../library/asyncio-llapi-index.rst:152 +msgid "``await`` :meth:`loop.create_server`" +msgstr "``await`` :meth:`loop.create_server`" + +#: ../../library/asyncio-llapi-index.rst:153 +msgid "Create a TCP server." +msgstr "创建一个 TCP 服务。" + +#: ../../library/asyncio-llapi-index.rst:155 +msgid "``await`` :meth:`loop.create_unix_connection`" +msgstr "``await`` :meth:`loop.create_unix_connection`" + +#: ../../library/asyncio-llapi-index.rst:156 +msgid "Open a Unix socket connection." +msgstr "打开一个 Unix socket 连接。" + +#: ../../library/asyncio-llapi-index.rst:158 +msgid "``await`` :meth:`loop.create_unix_server`" +msgstr "``await`` :meth:`loop.create_unix_server`" + +#: ../../library/asyncio-llapi-index.rst:159 +msgid "Create a Unix socket server." +msgstr "创建一个 Unix socket 服务。" + +#: ../../library/asyncio-llapi-index.rst:161 +msgid "``await`` :meth:`loop.connect_accepted_socket`" +msgstr "``await`` :meth:`loop.connect_accepted_socket`" + +#: ../../library/asyncio-llapi-index.rst:162 +msgid "Wrap a :class:`~socket.socket` into a ``(transport, protocol)`` pair." +msgstr "将 :class:`~socket.socket` 包装成 ``(transport, protocol)`` 对。" + +#: ../../library/asyncio-llapi-index.rst:165 +msgid "``await`` :meth:`loop.create_datagram_endpoint`" +msgstr "``await`` :meth:`loop.create_datagram_endpoint`" + +#: ../../library/asyncio-llapi-index.rst:166 +msgid "Open a datagram (UDP) connection." +msgstr "打开一个数据报 (UDP) 连接。" + +#: ../../library/asyncio-llapi-index.rst:168 +msgid "``await`` :meth:`loop.sendfile`" +msgstr "``await`` :meth:`loop.sendfile`" + +#: ../../library/asyncio-llapi-index.rst:169 +msgid "Send a file over a transport." +msgstr "通过传输通道发送一个文件。" + +#: ../../library/asyncio-llapi-index.rst:171 +msgid "``await`` :meth:`loop.start_tls`" +msgstr "``await`` :meth:`loop.start_tls`" + +#: ../../library/asyncio-llapi-index.rst:172 +msgid "Upgrade an existing connection to TLS." +msgstr "将一个已建立的连接升级到 TLS。" + +#: ../../library/asyncio-llapi-index.rst:174 +msgid "``await`` :meth:`loop.connect_read_pipe`" +msgstr "``await`` :meth:`loop.connect_read_pipe`" + +#: ../../library/asyncio-llapi-index.rst:175 +msgid "Wrap a read end of a pipe into a ``(transport, protocol)`` pair." +msgstr "将管道读取端包装成 ``(transport, protocol)`` 对。" + +#: ../../library/asyncio-llapi-index.rst:177 +msgid "``await`` :meth:`loop.connect_write_pipe`" +msgstr "``await`` :meth:`loop.connect_write_pipe`" + +#: ../../library/asyncio-llapi-index.rst:178 +msgid "Wrap a write end of a pipe into a ``(transport, protocol)`` pair." +msgstr "将管道写入端包装成 ``(transport, protocol)`` 对。" + +#: ../../library/asyncio-llapi-index.rst:181 +msgid "Sockets" +msgstr "套接字" + +#: ../../library/asyncio-llapi-index.rst:186 +msgid "``await`` :meth:`loop.sock_recv`" +msgstr "``await`` :meth:`loop.sock_recv`" + +#: ../../library/asyncio-llapi-index.rst:187 +msgid "Receive data from the :class:`~socket.socket`." +msgstr "从 :class:`~socket.socket` 接收数据。" + +#: ../../library/asyncio-llapi-index.rst:189 +msgid "``await`` :meth:`loop.sock_recv_into`" +msgstr "``await`` :meth:`loop.sock_recv_into`" + +#: ../../library/asyncio-llapi-index.rst:190 +msgid "Receive data from the :class:`~socket.socket` into a buffer." +msgstr "从 :class:`~socket.socket` 接收数据到一个缓冲区中。" + +#: ../../library/asyncio-llapi-index.rst:192 +msgid "``await`` :meth:`loop.sock_recvfrom`" +msgstr "``await`` :meth:`loop.sock_recvfrom`" + +#: ../../library/asyncio-llapi-index.rst:193 +msgid "Receive a datagram from the :class:`~socket.socket`." +msgstr "从 :class:`~socket.socket` 接收数据报。" + +#: ../../library/asyncio-llapi-index.rst:195 +msgid "``await`` :meth:`loop.sock_recvfrom_into`" +msgstr "``await`` :meth:`loop.sock_recvfrom_into`" + +#: ../../library/asyncio-llapi-index.rst:196 +msgid "Receive a datagram from the :class:`~socket.socket` into a buffer." +msgstr "从 :class:`~socket.socket` 接收数据报并放入缓冲区。" + +#: ../../library/asyncio-llapi-index.rst:198 +msgid "``await`` :meth:`loop.sock_sendall`" +msgstr "``await`` :meth:`loop.sock_sendall`" + +#: ../../library/asyncio-llapi-index.rst:199 +msgid "Send data to the :class:`~socket.socket`." +msgstr "发送数据到 :class:`~socket.socket`。" + +#: ../../library/asyncio-llapi-index.rst:201 +msgid "``await`` :meth:`loop.sock_sendto`" +msgstr "``await`` :meth:`loop.sock_sendto`" + +#: ../../library/asyncio-llapi-index.rst:202 +msgid "Send a datagram via the :class:`~socket.socket` to the given address." +msgstr "通过 :class:`~socket.socket` 向给定的地址发送数据报。" + +#: ../../library/asyncio-llapi-index.rst:204 +msgid "``await`` :meth:`loop.sock_connect`" +msgstr "``await`` :meth:`loop.sock_connect`" + +#: ../../library/asyncio-llapi-index.rst:205 +msgid "Connect the :class:`~socket.socket`." +msgstr "连接 :class:`~socket.socket`。" + +#: ../../library/asyncio-llapi-index.rst:207 +msgid "``await`` :meth:`loop.sock_accept`" +msgstr "``await`` :meth:`loop.sock_accept`" + +#: ../../library/asyncio-llapi-index.rst:208 +msgid "Accept a :class:`~socket.socket` connection." +msgstr "接受一个 :class:`~socket.socket` 连接。" + +#: ../../library/asyncio-llapi-index.rst:210 +msgid "``await`` :meth:`loop.sock_sendfile`" +msgstr "``await`` :meth:`loop.sock_sendfile`" + +#: ../../library/asyncio-llapi-index.rst:211 +msgid "Send a file over the :class:`~socket.socket`." +msgstr "利用 :class:`~socket.socket` 发送一个文件。" + +#: ../../library/asyncio-llapi-index.rst:213 +msgid ":meth:`loop.add_reader`" +msgstr ":meth:`loop.add_reader`" + +#: ../../library/asyncio-llapi-index.rst:214 +msgid "Start watching a file descriptor for read availability." +msgstr "开始对一个文件描述符的可读性的监视。" + +#: ../../library/asyncio-llapi-index.rst:216 +msgid ":meth:`loop.remove_reader`" +msgstr ":meth:`loop.remove_reader`" + +#: ../../library/asyncio-llapi-index.rst:217 +msgid "Stop watching a file descriptor for read availability." +msgstr "停止对一个文件描述符的可读性的监视。" + +#: ../../library/asyncio-llapi-index.rst:219 +msgid ":meth:`loop.add_writer`" +msgstr ":meth:`loop.add_writer`" + +#: ../../library/asyncio-llapi-index.rst:220 +msgid "Start watching a file descriptor for write availability." +msgstr "开始对一个文件描述符的可写性的监视。" + +#: ../../library/asyncio-llapi-index.rst:222 +msgid ":meth:`loop.remove_writer`" +msgstr ":meth:`loop.remove_writer`" + +#: ../../library/asyncio-llapi-index.rst:223 +msgid "Stop watching a file descriptor for write availability." +msgstr "停止对一个文件描述符的可写性的监视。" + +#: ../../library/asyncio-llapi-index.rst:226 +msgid "Unix Signals" +msgstr "Unix 信号" + +#: ../../library/asyncio-llapi-index.rst:231 +msgid ":meth:`loop.add_signal_handler`" +msgstr ":meth:`loop.add_signal_handler`" + +#: ../../library/asyncio-llapi-index.rst:232 +msgid "Add a handler for a :mod:`signal`." +msgstr "给 :mod:`signal` 添加一个处理回调函数。" + +#: ../../library/asyncio-llapi-index.rst:234 +msgid ":meth:`loop.remove_signal_handler`" +msgstr ":meth:`loop.remove_signal_handler`" + +#: ../../library/asyncio-llapi-index.rst:235 +msgid "Remove a handler for a :mod:`signal`." +msgstr "删除 :mod:`signal` 的处理回调函数。" + +#: ../../library/asyncio-llapi-index.rst:238 +msgid "Subprocesses" +msgstr "子进程集" + +#: ../../library/asyncio-llapi-index.rst:243 +msgid ":meth:`loop.subprocess_exec`" +msgstr ":meth:`loop.subprocess_exec`" + +#: ../../library/asyncio-llapi-index.rst:244 +msgid "Spawn a subprocess." +msgstr "衍生一个子进程" + +#: ../../library/asyncio-llapi-index.rst:246 +msgid ":meth:`loop.subprocess_shell`" +msgstr ":meth:`loop.subprocess_shell`" + +#: ../../library/asyncio-llapi-index.rst:247 +msgid "Spawn a subprocess from a shell command." +msgstr "从 shell 命令衍生一个子进程。" + +#: ../../library/asyncio-llapi-index.rst:250 +msgid "Error Handling" +msgstr "错误处理" + +#: ../../library/asyncio-llapi-index.rst:255 +msgid ":meth:`loop.call_exception_handler`" +msgstr ":meth:`loop.call_exception_handler`" + +#: ../../library/asyncio-llapi-index.rst:256 +msgid "Call the exception handler." +msgstr "调用异常处理器。" + +#: ../../library/asyncio-llapi-index.rst:258 +msgid ":meth:`loop.set_exception_handler`" +msgstr ":meth:`loop.set_exception_handler`" + +#: ../../library/asyncio-llapi-index.rst:259 +msgid "Set a new exception handler." +msgstr "设置一个新的异常处理器。" + +#: ../../library/asyncio-llapi-index.rst:261 +msgid ":meth:`loop.get_exception_handler`" +msgstr ":meth:`loop.get_exception_handler`" + +#: ../../library/asyncio-llapi-index.rst:262 +msgid "Get the current exception handler." +msgstr "获取当前异常处理器。" + +#: ../../library/asyncio-llapi-index.rst:264 +msgid ":meth:`loop.default_exception_handler`" +msgstr ":meth:`loop.default_exception_handler`" + +#: ../../library/asyncio-llapi-index.rst:265 +msgid "The default exception handler implementation." +msgstr "默认异常处理器实现。" + +#: ../../library/asyncio-llapi-index.rst:270 +msgid "" +":ref:`Using asyncio.new_event_loop() and loop.run_forever() " +"`." +msgstr "" +":ref:`使用 asyncio.new_event_loop() 和 loop.run_forever() " +"`." + +#: ../../library/asyncio-llapi-index.rst:273 +msgid ":ref:`Using loop.call_later() `." +msgstr ":ref:`使用 loop.call_later() `." + +#: ../../library/asyncio-llapi-index.rst:275 +msgid "" +"Using ``loop.create_connection()`` to implement :ref:`an echo-client " +"`." +msgstr "" +"使用 ``loop.create_connection()`` 实现 :ref:`echo 客户端 " +"`." + +#: ../../library/asyncio-llapi-index.rst:278 +msgid "" +"Using ``loop.create_connection()`` to :ref:`connect a socket " +"`." +msgstr "" +"使用 ``loop.create_connection()`` 来 :ref:`连接套接字 " +"`." + +#: ../../library/asyncio-llapi-index.rst:281 +msgid "" +":ref:`Using add_reader() to watch an FD for read events " +"`." +msgstr ":ref:`使用 add_reader() 监听 FD(文件描述符) 的读取事件 `." + +#: ../../library/asyncio-llapi-index.rst:284 +msgid ":ref:`Using loop.add_signal_handler() `." +msgstr ":ref:`使用 loop.add_signal_handler() `." + +#: ../../library/asyncio-llapi-index.rst:286 +msgid "" +":ref:`Using loop.subprocess_exec() `." +msgstr ":ref:`使用 loop.subprocess_exec() `。" + +#: ../../library/asyncio-llapi-index.rst:290 +msgid "Transports" +msgstr "传输" + +#: ../../library/asyncio-llapi-index.rst:292 +msgid "All transports implement the following methods:" +msgstr "所有传输都实现以下方法:" + +#: ../../library/asyncio-llapi-index.rst:298 +msgid ":meth:`transport.close() `" +msgstr ":meth:`transport.close() `" + +#: ../../library/asyncio-llapi-index.rst:299 +msgid "Close the transport." +msgstr "关闭传输。" + +#: ../../library/asyncio-llapi-index.rst:301 +msgid ":meth:`transport.is_closing() `" +msgstr ":meth:`transport.is_closing() `" + +#: ../../library/asyncio-llapi-index.rst:302 +msgid "Return ``True`` if the transport is closing or is closed." +msgstr "返回 ``True``,如果传输正在关闭或已经关闭。" + +#: ../../library/asyncio-llapi-index.rst:304 +msgid ":meth:`transport.get_extra_info() `" +msgstr ":meth:`transport.get_extra_info() `" + +#: ../../library/asyncio-llapi-index.rst:305 +msgid "Request for information about the transport." +msgstr "请求传输的相关信息。" + +#: ../../library/asyncio-llapi-index.rst:307 +msgid ":meth:`transport.set_protocol() `" +msgstr ":meth:`transport.set_protocol() `" + +#: ../../library/asyncio-llapi-index.rst:308 +msgid "Set a new protocol." +msgstr "设置一个新协议。" + +#: ../../library/asyncio-llapi-index.rst:310 +msgid ":meth:`transport.get_protocol() `" +msgstr ":meth:`transport.get_protocol() `" + +#: ../../library/asyncio-llapi-index.rst:311 +msgid "Return the current protocol." +msgstr "返回当前协议。" + +#: ../../library/asyncio-llapi-index.rst:314 +msgid "" +"Transports that can receive data (TCP and Unix connections, pipes, etc). " +"Returned from methods like :meth:`loop.create_connection`, " +":meth:`loop.create_unix_connection`, :meth:`loop.connect_read_pipe`, etc:" +msgstr "" +"可以接收数据的传输(TCP 和 Unix 连接,管道等)。 由 :meth:`loop.create_connection`, " +":meth:`loop.create_unix_connection`, :meth:`loop.connect_read_pipe` 等方法返回:" + +#: ../../library/asyncio-llapi-index.rst:319 +msgid "Read Transports" +msgstr "读取传输" + +#: ../../library/asyncio-llapi-index.rst:324 +msgid ":meth:`transport.is_reading() `" +msgstr ":meth:`transport.is_reading() `" + +#: ../../library/asyncio-llapi-index.rst:325 +msgid "Return ``True`` if the transport is receiving." +msgstr "返回 ``True``,如果传输正在接收。" + +#: ../../library/asyncio-llapi-index.rst:327 +msgid ":meth:`transport.pause_reading() `" +msgstr ":meth:`transport.pause_reading() `" + +#: ../../library/asyncio-llapi-index.rst:328 +msgid "Pause receiving." +msgstr "暂停接收。" + +#: ../../library/asyncio-llapi-index.rst:330 +msgid ":meth:`transport.resume_reading() `" +msgstr ":meth:`transport.resume_reading() `" + +#: ../../library/asyncio-llapi-index.rst:331 +msgid "Resume receiving." +msgstr "继续接收。" + +#: ../../library/asyncio-llapi-index.rst:334 +msgid "" +"Transports that can Send data (TCP and Unix connections, pipes, etc). " +"Returned from methods like :meth:`loop.create_connection`, " +":meth:`loop.create_unix_connection`, :meth:`loop.connect_write_pipe`, etc:" +msgstr "" +"可以发送数据的传输(TCP 和 Unix 连接,管道等)。 由 :meth:`loop.create_connection`, " +":meth:`loop.create_unix_connection`, :meth:`loop.connect_write_pipe` 等方法返回:" + +#: ../../library/asyncio-llapi-index.rst:339 +msgid "Write Transports" +msgstr "写入传输" + +#: ../../library/asyncio-llapi-index.rst:344 +msgid ":meth:`transport.write() `" +msgstr ":meth:`transport.write() `" + +#: ../../library/asyncio-llapi-index.rst:345 +msgid "Write data to the transport." +msgstr "向传输写入数据。" + +#: ../../library/asyncio-llapi-index.rst:347 +msgid ":meth:`transport.writelines() `" +msgstr ":meth:`transport.writelines() `" + +#: ../../library/asyncio-llapi-index.rst:348 +msgid "Write buffers to the transport." +msgstr "向传输写入缓冲。" + +#: ../../library/asyncio-llapi-index.rst:350 +msgid ":meth:`transport.can_write_eof() `" +msgstr ":meth:`transport.can_write_eof() `" + +#: ../../library/asyncio-llapi-index.rst:351 +msgid "Return :const:`True` if the transport supports sending EOF." +msgstr "返回 :const:`True`,如果传输支持发送 EOF。" + +#: ../../library/asyncio-llapi-index.rst:353 +msgid ":meth:`transport.write_eof() `" +msgstr ":meth:`transport.write_eof() `" + +#: ../../library/asyncio-llapi-index.rst:354 +msgid "Close and send EOF after flushing buffered data." +msgstr "在冲洗已缓冲的数据后关闭传输和发送 EOF。" + +#: ../../library/asyncio-llapi-index.rst:356 +msgid ":meth:`transport.abort() `" +msgstr ":meth:`transport.abort() `" + +#: ../../library/asyncio-llapi-index.rst:357 +#: ../../library/asyncio-llapi-index.rst:383 +msgid "Close the transport immediately." +msgstr "立即关闭传输。" + +#: ../../library/asyncio-llapi-index.rst:359 +msgid "" +":meth:`transport.get_write_buffer_size() " +"`" +msgstr "" +":meth:`transport.get_write_buffer_size() " +"`" + +#: ../../library/asyncio-llapi-index.rst:361 +msgid "Return the current size of the output buffer." +msgstr "返回当前输出缓冲区的大小。" + +#: ../../library/asyncio-llapi-index.rst:363 +msgid "" +":meth:`transport.get_write_buffer_limits() " +"`" +msgstr "" +":meth:`transport.get_write_buffer_limits() " +"`" + +#: ../../library/asyncio-llapi-index.rst:365 +msgid "Return high and low water marks for write flow control." +msgstr "返回写入流控制的高位标记位和低位标记位。" + +#: ../../library/asyncio-llapi-index.rst:367 +msgid "" +":meth:`transport.set_write_buffer_limits() " +"`" +msgstr "" +":meth:`transport.set_write_buffer_limits() " +"`" + +#: ../../library/asyncio-llapi-index.rst:369 +msgid "Set new high and low water marks for write flow control." +msgstr "设置新的写入流控制的高位标记位和低位标记位。" + +#: ../../library/asyncio-llapi-index.rst:372 +msgid "Transports returned by :meth:`loop.create_datagram_endpoint`:" +msgstr "由 :meth:`loop.create_datagram_endpoint` 返回的传输:" + +#: ../../library/asyncio-llapi-index.rst:374 +msgid "Datagram Transports" +msgstr "数据报传输" + +#: ../../library/asyncio-llapi-index.rst:379 +msgid ":meth:`transport.sendto() `" +msgstr ":meth:`transport.sendto() `" + +#: ../../library/asyncio-llapi-index.rst:380 +msgid "Send data to the remote peer." +msgstr "发送数据到远程对等端。" + +#: ../../library/asyncio-llapi-index.rst:382 +msgid ":meth:`transport.abort() `" +msgstr ":meth:`transport.abort() `" + +#: ../../library/asyncio-llapi-index.rst:386 +msgid "" +"Low-level transport abstraction over subprocesses. Returned by " +":meth:`loop.subprocess_exec` and :meth:`loop.subprocess_shell`:" +msgstr "" +"基于子进程的底层抽象传输,它由 :meth:`loop.subprocess_exec` 和 :meth:`loop.subprocess_shell`" +" 返回:" + +#: ../../library/asyncio-llapi-index.rst:390 +msgid "Subprocess Transports" +msgstr "子进程传输" + +#: ../../library/asyncio-llapi-index.rst:395 +msgid ":meth:`transport.get_pid() `" +msgstr ":meth:`transport.get_pid() `" + +#: ../../library/asyncio-llapi-index.rst:396 +msgid "Return the subprocess process id." +msgstr "返回子进程的进程 ID。" + +#: ../../library/asyncio-llapi-index.rst:398 +msgid "" +":meth:`transport.get_pipe_transport() " +"`" +msgstr "" +":meth:`transport.get_pipe_transport() " +"`" + +#: ../../library/asyncio-llapi-index.rst:400 +msgid "" +"Return the transport for the requested communication pipe (*stdin*, " +"*stdout*, or *stderr*)." +msgstr "返回请求通信管道 (*stdin*, *stdout*, 或 *stderr*) 的传输。" + +#: ../../library/asyncio-llapi-index.rst:403 +msgid "" +":meth:`transport.get_returncode() `" +msgstr "" +":meth:`transport.get_returncode() `" + +#: ../../library/asyncio-llapi-index.rst:404 +msgid "Return the subprocess return code." +msgstr "返回子进程的返回码。" + +#: ../../library/asyncio-llapi-index.rst:406 +msgid ":meth:`transport.kill() `" +msgstr ":meth:`transport.kill() `" + +#: ../../library/asyncio-llapi-index.rst:407 +msgid "Kill the subprocess." +msgstr "杀死子进程。" + +#: ../../library/asyncio-llapi-index.rst:409 +msgid ":meth:`transport.send_signal() `" +msgstr ":meth:`transport.send_signal() `" + +#: ../../library/asyncio-llapi-index.rst:410 +msgid "Send a signal to the subprocess." +msgstr "发送一个信号到子进程。" + +#: ../../library/asyncio-llapi-index.rst:412 +msgid ":meth:`transport.terminate() `" +msgstr ":meth:`transport.terminate() `" + +#: ../../library/asyncio-llapi-index.rst:413 +msgid "Stop the subprocess." +msgstr "停止子进程。" + +#: ../../library/asyncio-llapi-index.rst:415 +msgid ":meth:`transport.close() `" +msgstr ":meth:`transport.close() `" + +#: ../../library/asyncio-llapi-index.rst:416 +msgid "Kill the subprocess and close all pipes." +msgstr "杀死子进程并关闭所有管道。" + +#: ../../library/asyncio-llapi-index.rst:420 +msgid "Protocols" +msgstr "协议" + +#: ../../library/asyncio-llapi-index.rst:422 +msgid "Protocol classes can implement the following **callback methods**:" +msgstr "协议类可以实现以下 **回调方法**:" + +#: ../../library/asyncio-llapi-index.rst:428 +msgid "``callback`` :meth:`connection_made() `" +msgstr "``callback`` :meth:`connection_made() `" + +#: ../../library/asyncio-llapi-index.rst:429 +msgid "Called when a connection is made." +msgstr "连接建立时被调用。" + +#: ../../library/asyncio-llapi-index.rst:431 +msgid "``callback`` :meth:`connection_lost() `" +msgstr "``callback`` :meth:`connection_lost() `" + +#: ../../library/asyncio-llapi-index.rst:432 +msgid "Called when the connection is lost or closed." +msgstr "连接丢失或关闭时将被调用。" + +#: ../../library/asyncio-llapi-index.rst:434 +msgid "``callback`` :meth:`pause_writing() `" +msgstr "``callback`` :meth:`pause_writing() `" + +#: ../../library/asyncio-llapi-index.rst:435 +msgid "Called when the transport's buffer goes over the high water mark." +msgstr "传输的缓冲区超过高位标记位时被调用。" + +#: ../../library/asyncio-llapi-index.rst:437 +msgid "``callback`` :meth:`resume_writing() `" +msgstr "``callback`` :meth:`resume_writing() `" + +#: ../../library/asyncio-llapi-index.rst:438 +msgid "Called when the transport's buffer drains below the low water mark." +msgstr "传输的缓冲区降到低位标记位以下时被调用。" + +#: ../../library/asyncio-llapi-index.rst:441 +msgid "Streaming Protocols (TCP, Unix Sockets, Pipes)" +msgstr "流协议 (TCP, Unix 套接字,管道)" + +#: ../../library/asyncio-llapi-index.rst:446 +msgid "``callback`` :meth:`data_received() `" +msgstr "``callback`` :meth:`data_received() `" + +#: ../../library/asyncio-llapi-index.rst:447 +msgid "Called when some data is received." +msgstr "接收到数据时被调用。" + +#: ../../library/asyncio-llapi-index.rst:449 +msgid "``callback`` :meth:`eof_received() `" +msgstr "``callback`` :meth:`eof_received() `" + +#: ../../library/asyncio-llapi-index.rst:450 +#: ../../library/asyncio-llapi-index.rst:465 +msgid "Called when an EOF is received." +msgstr "接收到 EOF 时被调用。" + +#: ../../library/asyncio-llapi-index.rst:453 +msgid "Buffered Streaming Protocols" +msgstr "缓冲流协议" + +#: ../../library/asyncio-llapi-index.rst:458 +msgid "``callback`` :meth:`get_buffer() `" +msgstr "``callback`` :meth:`get_buffer() `" + +#: ../../library/asyncio-llapi-index.rst:459 +msgid "Called to allocate a new receive buffer." +msgstr "调用后会分配新的接收缓冲区。" + +#: ../../library/asyncio-llapi-index.rst:461 +msgid "" +"``callback`` :meth:`buffer_updated() `" +msgstr "" +"``callback`` :meth:`buffer_updated() `" + +#: ../../library/asyncio-llapi-index.rst:462 +msgid "Called when the buffer was updated with the received data." +msgstr "用接收的数据更新缓冲区时被调用。" + +#: ../../library/asyncio-llapi-index.rst:464 +msgid "``callback`` :meth:`eof_received() `" +msgstr "``callback`` :meth:`eof_received() `" + +#: ../../library/asyncio-llapi-index.rst:468 +msgid "Datagram Protocols" +msgstr "数据报协议" + +#: ../../library/asyncio-llapi-index.rst:473 +msgid "" +"``callback`` :meth:`datagram_received() " +"`" +msgstr "" +"``callback`` :meth:`datagram_received() " +"`" + +#: ../../library/asyncio-llapi-index.rst:475 +msgid "Called when a datagram is received." +msgstr "接收到数据报时被调用。" + +#: ../../library/asyncio-llapi-index.rst:477 +msgid "" +"``callback`` :meth:`error_received() `" +msgstr "" +"``callback`` :meth:`error_received() `" + +#: ../../library/asyncio-llapi-index.rst:478 +msgid "" +"Called when a previous send or receive operation raises an :class:`OSError`." +msgstr "前一个发送或接收操作引发 :class:`OSError` 时被调用。" + +#: ../../library/asyncio-llapi-index.rst:482 +msgid "Subprocess Protocols" +msgstr "子进程协议" + +#: ../../library/asyncio-llapi-index.rst:487 +msgid "``callback`` :meth:`~SubprocessProtocol.pipe_data_received`" +msgstr "``callback`` :meth:`~SubprocessProtocol.pipe_data_received`" + +#: ../../library/asyncio-llapi-index.rst:488 +msgid "" +"Called when the child process writes data into its *stdout* or *stderr* " +"pipe." +msgstr "子进程向 *stdout* 或 *stderr* 管道写入数据时被调用。" + +#: ../../library/asyncio-llapi-index.rst:491 +msgid "``callback`` :meth:`~SubprocessProtocol.pipe_connection_lost`" +msgstr "``callback`` :meth:`~SubprocessProtocol.pipe_connection_lost`" + +#: ../../library/asyncio-llapi-index.rst:492 +msgid "" +"Called when one of the pipes communicating with the child process is closed." +msgstr "与子进程通信的其中一个管道关闭时被调用。" + +#: ../../library/asyncio-llapi-index.rst:495 +msgid "" +"``callback`` :meth:`process_exited() `" +msgstr "" +"``callback`` :meth:`process_exited() `" + +#: ../../library/asyncio-llapi-index.rst:497 +msgid "" +"Called when the child process has exited. It can be called before " +":meth:`~SubprocessProtocol.pipe_data_received` and " +":meth:`~SubprocessProtocol.pipe_connection_lost` methods." +msgstr "" +"当子进程退出时被调用。可在 :meth:`~SubprocessProtocol.pipe_data_received` 和 " +":meth:`~SubprocessProtocol.pipe_connection_lost` 方法之前被调用。" + +#: ../../library/asyncio-llapi-index.rst:503 +msgid "Event Loop Policies" +msgstr "事件循环策略" + +#: ../../library/asyncio-llapi-index.rst:505 +msgid "" +"Policies is a low-level mechanism to alter the behavior of functions like " +":func:`asyncio.get_event_loop`. See also the main :ref:`policies section " +"` for more details." +msgstr "" +"策略是改变 :func:`asyncio.get_event_loop` 这类函数行为的一个底层机制。更多细节可以查阅 :ref:`策略部分 " +"`." + +#: ../../library/asyncio-llapi-index.rst:511 +msgid "Accessing Policies" +msgstr "访问策略" + +#: ../../library/asyncio-llapi-index.rst:516 +msgid ":meth:`asyncio.get_event_loop_policy`" +msgstr ":meth:`asyncio.get_event_loop_policy`" + +#: ../../library/asyncio-llapi-index.rst:517 +msgid "Return the current process-wide policy." +msgstr "返回当前进程域的策略。" + +#: ../../library/asyncio-llapi-index.rst:519 +msgid ":meth:`asyncio.set_event_loop_policy`" +msgstr ":meth:`asyncio.set_event_loop_policy`" + +#: ../../library/asyncio-llapi-index.rst:520 +msgid "Set a new process-wide policy." +msgstr "设置一个新的进程域策略。" + +#: ../../library/asyncio-llapi-index.rst:522 +msgid ":class:`AbstractEventLoopPolicy`" +msgstr ":class:`AbstractEventLoopPolicy`" + +#: ../../library/asyncio-llapi-index.rst:523 +msgid "Base class for policy objects." +msgstr "策略对象的基类。" diff --git a/library/asyncio-platforms.po b/library/asyncio-platforms.po new file mode 100644 index 0000000000..8eb4a98929 --- /dev/null +++ b/library/asyncio-platforms.po @@ -0,0 +1,191 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/asyncio-platforms.rst:9 +msgid "Platform Support" +msgstr "平台支持" + +#: ../../library/asyncio-platforms.rst:11 +msgid "" +"The :mod:`asyncio` module is designed to be portable, but some platforms " +"have subtle differences and limitations due to the platforms' underlying " +"architecture and capabilities." +msgstr ":mod:`asyncio` 模块被设计为可移植的,但由于平台的底层架构和功能,一些平台存在细微的差异和限制。" + +#: ../../library/asyncio-platforms.rst:17 +msgid "All Platforms" +msgstr "所有平台" + +#: ../../library/asyncio-platforms.rst:19 +msgid "" +":meth:`loop.add_reader` and :meth:`loop.add_writer` cannot be used to " +"monitor file I/O." +msgstr ":meth:`loop.add_reader` 和 :meth:`loop.add_writer` 不能用来监视文件 I/O。" + +#: ../../library/asyncio-platforms.rst:24 +msgid "Windows" +msgstr "Windows" + +#: ../../library/asyncio-platforms.rst:26 +msgid "" +"**Source code:** :source:`Lib/asyncio/proactor_events.py`, " +":source:`Lib/asyncio/windows_events.py`, " +":source:`Lib/asyncio/windows_utils.py`" +msgstr "" +"**源代码:** :source:`Lib/asyncio/proactor_events.py`, " +":source:`Lib/asyncio/windows_events.py`, " +":source:`Lib/asyncio/windows_utils.py`" + +#: ../../library/asyncio-platforms.rst:34 +msgid "On Windows, :class:`ProactorEventLoop` is now the default event loop." +msgstr "在 Windows 上,:class:`ProactorEventLoop` 现在是默认的事件循环。" + +#: ../../library/asyncio-platforms.rst:36 +msgid "All event loops on Windows do not support the following methods:" +msgstr "Windows 上的所有事件循环都不支持以下方法:" + +#: ../../library/asyncio-platforms.rst:38 +msgid "" +":meth:`loop.create_unix_connection` and :meth:`loop.create_unix_server` are " +"not supported. The :const:`socket.AF_UNIX` socket family is specific to " +"Unix." +msgstr "" +"不支持 :meth:`loop.create_unix_connection` 和 :meth:`loop.create_unix_server`。 " +":const:`socket.AF_UNIX` 套接字族是 Unix 专属的。" + +#: ../../library/asyncio-platforms.rst:42 +msgid "" +":meth:`loop.add_signal_handler` and :meth:`loop.remove_signal_handler` are " +"not supported." +msgstr "" +"不支持 :meth:`loop.add_signal_handler` 和 :meth:`loop.remove_signal_handler`。" + +#: ../../library/asyncio-platforms.rst:45 +msgid ":class:`SelectorEventLoop` has the following limitations:" +msgstr ":class:`SelectorEventLoop` 有下列限制:" + +#: ../../library/asyncio-platforms.rst:47 +msgid "" +":class:`~selectors.SelectSelector` is used to wait on socket events: it " +"supports sockets and is limited to 512 sockets." +msgstr ":class:`~selectors.SelectSelector` 只被用于等待套接字事件:它支持套接字且最多支持 512 个套接字。" + +#: ../../library/asyncio-platforms.rst:50 +msgid "" +":meth:`loop.add_reader` and :meth:`loop.add_writer` only accept socket " +"handles (e.g. pipe file descriptors are not supported)." +msgstr "" +":meth:`loop.add_reader` 和 :meth:`loop.add_writer` 只接受套接字句柄(例如不支持管道文件描述符)。" + +#: ../../library/asyncio-platforms.rst:53 +msgid "" +"Pipes are not supported, so the :meth:`loop.connect_read_pipe` and " +":meth:`loop.connect_write_pipe` methods are not implemented." +msgstr "" +"因为不支持管道,所以 :meth:`loop.connect_read_pipe` 和 :meth:`loop.connect_write_pipe`" +" 方法没有实现。" + +#: ../../library/asyncio-platforms.rst:56 +msgid "" +":ref:`Subprocesses ` are not supported, i.e. " +":meth:`loop.subprocess_exec` and :meth:`loop.subprocess_shell` methods are " +"not implemented." +msgstr "" +"不支持 :ref:`Subprocesses `,也就是 " +":meth:`loop.subprocess_exec` 和 :meth:`loop.subprocess_shell` 方法没有实现。" + +#: ../../library/asyncio-platforms.rst:60 +msgid ":class:`ProactorEventLoop` has the following limitations:" +msgstr ":class:`ProactorEventLoop` 有下列限制:" + +#: ../../library/asyncio-platforms.rst:62 +msgid "" +"The :meth:`loop.add_reader` and :meth:`loop.add_writer` methods are not " +"supported." +msgstr "不支持 :meth:`loop.add_reader` 和 :meth:`loop.add_writer` 方法。" + +#: ../../library/asyncio-platforms.rst:65 +msgid "" +"The resolution of the monotonic clock on Windows is usually around 15.6 " +"milliseconds. The best resolution is 0.5 milliseconds. The resolution " +"depends on the hardware (availability of `HPET " +"`_) and on the " +"Windows configuration." +msgstr "" +"通常 Windows 上单调时钟的分辨率约为 15.6 毫秒。最佳分辨率是 0.5 毫秒。分辨率依赖于具体的硬件 (`HPET " +"`_ 的可用性) 和 Windows" +" 的设置。" + +#: ../../library/asyncio-platforms.rst:75 +msgid "Subprocess Support on Windows" +msgstr "Windows 的子进程支持" + +#: ../../library/asyncio-platforms.rst:77 +msgid "" +"On Windows, the default event loop :class:`ProactorEventLoop` supports " +"subprocesses, whereas :class:`SelectorEventLoop` does not." +msgstr "" +"在 Windows 上,默认的事件循环 :class:`ProactorEventLoop` 支持子进程,而 " +":class:`SelectorEventLoop` 则不支持。" + +#: ../../library/asyncio-platforms.rst:82 +msgid "macOS" +msgstr "macOS" + +#: ../../library/asyncio-platforms.rst:84 +msgid "Modern macOS versions are fully supported." +msgstr "完整支持现代 macOS 版本。" + +#: ../../library/asyncio-platforms.rst:87 +msgid "macOS <= 10.8" +msgstr "macOS <= 10.8" + +#: ../../library/asyncio-platforms.rst:88 +msgid "" +"On macOS 10.6, 10.7 and 10.8, the default event loop uses " +":class:`selectors.KqueueSelector`, which does not support character devices " +"on these versions. The :class:`SelectorEventLoop` can be manually " +"configured to use :class:`~selectors.SelectSelector` or " +":class:`~selectors.PollSelector` to support character devices on these older" +" versions of macOS. Example::" +msgstr "" +"在 macOS 10.6, 10.7 和 10.8 上,默认的事件循环使用 " +":class:`selectors.KqueueSelector`,在这些版本上它并不支持字符设备。可以手工配置 " +":class:`SelectorEventLoop` 来使用 :class:`~selectors.SelectSelector` 或 " +":class:`~selectors.PollSelector` 以在这些较老版本的 macOS 上支持字符设备。例如::" + +#: ../../library/asyncio-platforms.rst:95 +msgid "" +"import asyncio\n" +"import selectors\n" +"\n" +"selector = selectors.SelectSelector()\n" +"loop = asyncio.SelectorEventLoop(selector)\n" +"asyncio.set_event_loop(loop)" +msgstr "" +"import asyncio\n" +"import selectors\n" +"\n" +"selector = selectors.SelectSelector()\n" +"loop = asyncio.SelectorEventLoop(selector)\n" +"asyncio.set_event_loop(loop)" diff --git a/library/asyncio-policy.po b/library/asyncio-policy.po new file mode 100644 index 0000000000..52c20e28f6 --- /dev/null +++ b/library/asyncio-policy.po @@ -0,0 +1,249 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/asyncio-policy.rst:8 +msgid "Policies" +msgstr "策略" + +#: ../../library/asyncio-policy.rst:12 +msgid "" +"Policies are deprecated and will be removed in Python 3.16. Users are " +"encouraged to use the :func:`asyncio.run` function or the " +":class:`asyncio.Runner` with *loop_factory* to use the desired loop " +"implementation." +msgstr "" +"策略已弃用,并将在 Python 3.16 中删除。鼓励用户使用 :func:`asyncio.run` 函数或 " +":class:`asyncio.Runner` 并附带 *loop_factory* 以使用想要的循环实现。" + +#: ../../library/asyncio-policy.rst:18 +msgid "" +"An event loop policy is a global object used to get and set the current " +":ref:`event loop `, as well as create new event loops. " +"The default policy can be :ref:`replaced ` with " +":ref:`built-in alternatives ` to use different event" +" loop implementations, or substituted by a :ref:`custom policy ` that can override these behaviors." +msgstr "" +"事件循环策略是一个用于获取和设置当前 :ref:`事件循环 ` 的全局对象,还可以创建新的事件循环。 " +"默认策略可以被 :ref:`替换 ` 为 :ref:`内置替代策略 ` 以使用不同的事件循环实现,或者替换为可以覆盖这些行为的 :ref:`自定义策略 `." + +#: ../../library/asyncio-policy.rst:27 +msgid "" +"The :ref:`policy object ` gets and sets a separate " +"event loop per *context*. This is per-thread by default, though custom " +"policies could define *context* differently." +msgstr "" +":ref:`策略对象 ` 可为每个 *context* 获取和设置单独的事件循环。 " +"在默认情况下是分线程,不过自定义策略可以按不同的方式定义 *context*。" + +#: ../../library/asyncio-policy.rst:32 +msgid "" +"Custom event loop policies can control the behavior of " +":func:`get_event_loop`, :func:`set_event_loop`, and :func:`new_event_loop`." +msgstr "" +"自定义事件循环策略可以控制 :func:`get_event_loop`, :func:`set_event_loop` 和 " +":func:`new_event_loop` 的行为。" + +#: ../../library/asyncio-policy.rst:35 +msgid "" +"Policy objects should implement the APIs defined in the " +":class:`AbstractEventLoopPolicy` abstract base class." +msgstr "策略对象应该实现 :class:`AbstractEventLoopPolicy` 抽象基类中定义的 API。" + +#: ../../library/asyncio-policy.rst:42 +msgid "Getting and Setting the Policy" +msgstr "获取和设置策略" + +#: ../../library/asyncio-policy.rst:44 +msgid "" +"The following functions can be used to get and set the policy for the " +"current process:" +msgstr "可以使用下面函数获取和设置当前进程的策略:" + +#: ../../library/asyncio-policy.rst:49 +msgid "Return the current process-wide policy." +msgstr "返回当前进程域的策略。" + +#: ../../library/asyncio-policy.rst:51 +msgid "" +"The :func:`get_event_loop_policy` function is deprecated and will be removed" +" in Python 3.16." +msgstr ":func:`get_event_loop_policy` 函数已弃用,并将在 Python 3.16 中删除。" + +#: ../../library/asyncio-policy.rst:57 +msgid "Set the current process-wide policy to *policy*." +msgstr "将 *policy* 设置为当前进程域策略。" + +#: ../../library/asyncio-policy.rst:59 +msgid "If *policy* is set to ``None``, the default policy is restored." +msgstr "如果 *policy* 设为 ``None`` 将恢复默认策略。" + +#: ../../library/asyncio-policy.rst:61 +msgid "" +"The :func:`set_event_loop_policy` function is deprecated and will be removed" +" in Python 3.16." +msgstr ":func:`set_event_loop_policy` 函数已弃用,并将在 Python 3.16 中删除。" + +#: ../../library/asyncio-policy.rst:69 +msgid "Policy Objects" +msgstr "策略对象" + +#: ../../library/asyncio-policy.rst:71 +msgid "The abstract event loop policy base class is defined as follows:" +msgstr "抽象事件循环策略基类定义如下:" + +#: ../../library/asyncio-policy.rst:75 +msgid "An abstract base class for asyncio policies." +msgstr "asyncio 策略的抽象基类。" + +#: ../../library/asyncio-policy.rst:79 +msgid "Get the event loop for the current context." +msgstr "为当前上下文获取事件循环。" + +#: ../../library/asyncio-policy.rst:81 +msgid "" +"Return an event loop object implementing the :class:`AbstractEventLoop` " +"interface." +msgstr "返回一个实现 :class:`AbstractEventLoop` 接口的事件循环对象。" + +#: ../../library/asyncio-policy.rst:84 ../../library/asyncio-policy.rst:96 +msgid "This method should never return ``None``." +msgstr "该方法永远不应返回 ``None``。" + +#: ../../library/asyncio-policy.rst:90 +msgid "Set the event loop for the current context to *loop*." +msgstr "将当前上下文的事件循环设置为 *loop*。" + +#: ../../library/asyncio-policy.rst:94 +msgid "Create and return a new event loop object." +msgstr "创建并返回一个新的事件循环对象。" + +#: ../../library/asyncio-policy.rst:98 +msgid "" +"The :class:`AbstractEventLoopPolicy` class is deprecated and will be removed" +" in Python 3.16." +msgstr ":class:`AbstractEventLoopPolicy` 类已弃用,并将在 Python 3.16 中删除。" + +#: ../../library/asyncio-policy.rst:105 +msgid "asyncio ships with the following built-in policies:" +msgstr "asyncio 附带下列内置策略:" + +#: ../../library/asyncio-policy.rst:110 +msgid "" +"The default asyncio policy. Uses :class:`SelectorEventLoop` on Unix and " +":class:`ProactorEventLoop` on Windows." +msgstr "" +"默认的 asyncio 策略。在 Unix 上使用 :class:`SelectorEventLoop` 而在 Windows 上使用 " +":class:`ProactorEventLoop`." + +#: ../../library/asyncio-policy.rst:113 +msgid "" +"There is no need to install the default policy manually. asyncio is " +"configured to use the default policy automatically." +msgstr "不需要手动安装默认策略。asyncio 已配置成自动使用默认策略。" + +#: ../../library/asyncio-policy.rst:118 +msgid "On Windows, :class:`ProactorEventLoop` is now used by default." +msgstr "在 Windows 上,现在默认会使用 :class:`ProactorEventLoop`。" + +#: ../../library/asyncio-policy.rst:120 +msgid "" +"The :meth:`get_event_loop` method of the default asyncio policy now raises a" +" :exc:`RuntimeError` if there is no set event loop." +msgstr "" +"如果没有设置事件循环,默认 asyncio 策略的 :meth:`get_event_loop` 方法现在引发 :exc:`RuntimeError`。" + +#: ../../library/asyncio-policy.rst:124 +msgid "" +"The :class:`DefaultEventLoopPolicy` class is deprecated and will be removed " +"in Python 3.16." +msgstr ":class:`DefaultEventLoopPolicy` 类已被弃用并将在 Python 3.16 中移除。" + +#: ../../library/asyncio-policy.rst:131 +msgid "" +"An alternative event loop policy that uses the :class:`SelectorEventLoop` " +"event loop implementation." +msgstr "一个使用 :class:`SelectorEventLoop` 事件循环实现的替代事件循环策略。" + +#: ../../library/asyncio-policy.rst:134 ../../library/asyncio-policy.rst:146 +msgid "Availability" +msgstr "Availability" + +#: ../../library/asyncio-policy.rst:136 +msgid "" +"The :class:`WindowsSelectorEventLoopPolicy` class is deprecated and will be " +"removed in Python 3.16." +msgstr ":class:`WindowsSelectorEventLoopPolicy` 类已被弃用并将在 Python 3.16 中移除。" + +#: ../../library/asyncio-policy.rst:143 +msgid "" +"An alternative event loop policy that uses the :class:`ProactorEventLoop` " +"event loop implementation." +msgstr "使用 :class:`ProactorEventLoop` 事件循环实现的另一种事件循环策略。" + +#: ../../library/asyncio-policy.rst:148 +msgid "" +"The :class:`WindowsProactorEventLoopPolicy` class is deprecated and will be " +"removed in Python 3.16." +msgstr ":class:`WindowsProactorEventLoopPolicy` 类已被弃用并将在 Python 3.16 中移除。" + +#: ../../library/asyncio-policy.rst:156 +msgid "Custom Policies" +msgstr "自定义策略" + +#: ../../library/asyncio-policy.rst:158 +msgid "" +"To implement a new event loop policy, it is recommended to subclass " +":class:`DefaultEventLoopPolicy` and override the methods for which custom " +"behavior is wanted, e.g.::" +msgstr "要实现一个新的事件循环策略,建议子类化 :class:`DefaultEventLoopPolicy` 并重写需要定制行为的方法,例如::" + +#: ../../library/asyncio-policy.rst:162 +msgid "" +"class MyEventLoopPolicy(asyncio.DefaultEventLoopPolicy):\n" +"\n" +" def get_event_loop(self):\n" +" \"\"\"Get the event loop.\n" +"\n" +" This may be None or an instance of EventLoop.\n" +" \"\"\"\n" +" loop = super().get_event_loop()\n" +" # Do something with loop ...\n" +" return loop\n" +"\n" +"asyncio.set_event_loop_policy(MyEventLoopPolicy())" +msgstr "" +"class MyEventLoopPolicy(asyncio.DefaultEventLoopPolicy):\n" +"\n" +" def get_event_loop(self):\n" +" \"\"\"获取事件循环。\n" +"\n" +" 这可能为 None 或是一个 EventLoop 的实例。\n" +" \"\"\"\n" +" loop = super().get_event_loop()\n" +" # 对 loop 执行一些操作 ...\n" +" return loop\n" +"\n" +"asyncio.set_event_loop_policy(MyEventLoopPolicy())" diff --git a/library/asyncio-protocol.po b/library/asyncio-protocol.po new file mode 100644 index 0000000000..462a599ee3 --- /dev/null +++ b/library/asyncio-protocol.po @@ -0,0 +1,1742 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/asyncio-protocol.rst:9 +msgid "Transports and Protocols" +msgstr "传输和协议" + +#: ../../library/asyncio-protocol.rst:12 +msgid "Preface" +msgstr "前言" + +#: ../../library/asyncio-protocol.rst:13 +msgid "" +"Transports and Protocols are used by the **low-level** event loop APIs such " +"as :meth:`loop.create_connection`. They use callback-based programming " +"style and enable high-performance implementations of network or IPC " +"protocols (e.g. HTTP)." +msgstr "" +"传输和协议会被像 :meth:`loop.create_connection` 这类 **底层** " +"事件循环接口使用。它们使用基于回调的编程风格支持网络或 IPC 协议(如 HTTP)的高性能实现。" + +#: ../../library/asyncio-protocol.rst:18 +msgid "" +"Essentially, transports and protocols should only be used in libraries and " +"frameworks and never in high-level asyncio applications." +msgstr "基本上,传输和协议应只在库和框架上使用,而不应该在高层的异步应用中使用它们。" + +#: ../../library/asyncio-protocol.rst:22 +msgid "This documentation page covers both `Transports`_ and `Protocols`_." +msgstr "本文档包含 `Transports`_ 和 `Protocols`_。" + +#: ../../library/asyncio-protocol.rst:25 +msgid "Introduction" +msgstr "概述" + +#: ../../library/asyncio-protocol.rst:26 +msgid "" +"At the highest level, the transport is concerned with *how* bytes are " +"transmitted, while the protocol determines *which* bytes to transmit (and to" +" some extent when)." +msgstr "在最顶层,传输只关心 **怎样** 传送字节内容,而协议决定传送 **哪些** 字节内容 (还要在一定程度上考虑何时)。" + +#: ../../library/asyncio-protocol.rst:30 +msgid "" +"A different way of saying the same thing: a transport is an abstraction for " +"a socket (or similar I/O endpoint) while a protocol is an abstraction for an" +" application, from the transport's point of view." +msgstr "也可以这样说:从传输的角度来看,传输是套接字 (或类似的 I/O 终端) 的抽象,而协议是应用程序的抽象。" + +#: ../../library/asyncio-protocol.rst:35 +msgid "" +"Yet another view is the transport and protocol interfaces together define an" +" abstract interface for using network I/O and interprocess I/O." +msgstr "换另一种说法,传输和协议一起定义网络 I/O 和进程间 I/O 的抽象接口。" + +#: ../../library/asyncio-protocol.rst:39 +msgid "" +"There is always a 1:1 relationship between transport and protocol objects: " +"the protocol calls transport methods to send data, while the transport calls" +" protocol methods to pass it data that has been received." +msgstr "传输对象和协议对象总是一对一关系:协议调用传输方法来发送数据,而传输在接收到数据时调用协议方法传递数据。" + +#: ../../library/asyncio-protocol.rst:44 +msgid "" +"Most of connection oriented event loop methods (such as " +":meth:`loop.create_connection`) usually accept a *protocol_factory* argument" +" used to create a *Protocol* object for an accepted connection, represented " +"by a *Transport* object. Such methods usually return a tuple of " +"``(transport, protocol)``." +msgstr "" +"大部分面向连接的事件循环方法 (如 :meth:`loop.create_connection` ) 通常接受 *protocol_factory* " +"参数为接收到的连接创建 *协议* 对象,并用 *传输* 对象来表示。这些方法一般会返回 ``(transport, protocol)`` 元组。" + +#: ../../library/asyncio-protocol.rst:51 +msgid "Contents" +msgstr "目录" + +#: ../../library/asyncio-protocol.rst:52 +msgid "This documentation page contains the following sections:" +msgstr "本文档包含下列小节:" + +#: ../../library/asyncio-protocol.rst:54 +msgid "" +"The `Transports`_ section documents asyncio :class:`BaseTransport`, " +":class:`ReadTransport`, :class:`WriteTransport`, :class:`Transport`, " +":class:`DatagramTransport`, and :class:`SubprocessTransport` classes." +msgstr "" +"`Transports`_ 部分记载 asyncio :class:`BaseTransport`、 :class:`ReadTransport`、 " +":class:`WriteTransport`、 :class:`Transport`、 :class:`DatagramTransport` 和 " +":class:`SubprocessTransport` 等类。" + +#: ../../library/asyncio-protocol.rst:59 +msgid "" +"The `Protocols`_ section documents asyncio :class:`BaseProtocol`, " +":class:`Protocol`, :class:`BufferedProtocol`, :class:`DatagramProtocol`, and" +" :class:`SubprocessProtocol` classes." +msgstr "" +"`Protocols`_ 部分记载 asyncio :class:`BaseProtocol`、 :class:`Protocol`、 " +":class:`BufferedProtocol`、 :class:`DatagramProtocol` 和 " +":class:`SubprocessProtocol` 等类。" + +#: ../../library/asyncio-protocol.rst:63 +msgid "" +"The `Examples`_ section showcases how to work with transports, protocols, " +"and low-level event loop APIs." +msgstr "`Examples`_ 部分展示怎样使用传输、协议和底层事件循环接口。" + +#: ../../library/asyncio-protocol.rst:70 +msgid "Transports" +msgstr "传输" + +#: ../../library/asyncio-protocol.rst:72 +msgid "**Source code:** :source:`Lib/asyncio/transports.py`" +msgstr "**源码:** :source:`Lib/asyncio/transports.py`" + +#: ../../library/asyncio-protocol.rst:76 +msgid "" +"Transports are classes provided by :mod:`asyncio` in order to abstract " +"various kinds of communication channels." +msgstr "传输属于 :mod:`asyncio` 模块中的类,用来抽象各种通信通道。" + +#: ../../library/asyncio-protocol.rst:79 +msgid "" +"Transport objects are always instantiated by an :ref:`asyncio event loop " +"`." +msgstr "传输对象总是由 :ref:`异步 IO 事件循环 ` 实例化。" + +#: ../../library/asyncio-protocol.rst:82 +msgid "" +"asyncio implements transports for TCP, UDP, SSL, and subprocess pipes. The " +"methods available on a transport depend on the transport's kind." +msgstr "异步 IO 实现 TCP、UDP、SSL 和子进程管道的传输。传输上可用的方法由传输的类型决定。" + +#: ../../library/asyncio-protocol.rst:85 +msgid "" +"The transport classes are :ref:`not thread safe `." +msgstr "传输类属于 :ref:`线程不安全`。" + +#: ../../library/asyncio-protocol.rst:89 +msgid "Transports Hierarchy" +msgstr "传输层级" + +#: ../../library/asyncio-protocol.rst:93 +msgid "" +"Base class for all transports. Contains methods that all asyncio transports" +" share." +msgstr "所有传输的基类。包含所有异步 IO 传输共用的方法。" + +#: ../../library/asyncio-protocol.rst:98 +msgid "A base transport for write-only connections." +msgstr "只写连接的基础传输。" + +#: ../../library/asyncio-protocol.rst:100 +msgid "" +"Instances of the *WriteTransport* class are returned from the " +":meth:`loop.connect_write_pipe` event loop method and are also used by " +"subprocess-related methods like :meth:`loop.subprocess_exec`." +msgstr "" +"*WriteTransport* 类的实例由 :meth:`loop.connect_write_pipe` 事件循环方法返回,也被子进程相关的方法如 " +":meth:`loop.subprocess_exec` 使用。" + +#: ../../library/asyncio-protocol.rst:107 +msgid "A base transport for read-only connections." +msgstr "只读连接的基础传输。" + +#: ../../library/asyncio-protocol.rst:109 +msgid "" +"Instances of the *ReadTransport* class are returned from the " +":meth:`loop.connect_read_pipe` event loop method and are also used by " +"subprocess-related methods like :meth:`loop.subprocess_exec`." +msgstr "" +"*ReadTransport* 类的实例由 :meth:`loop.connect_read_pipe` 事件循环方法返回,也被子进程相关的方法如 " +":meth:`loop.subprocess_exec` 使用。" + +#: ../../library/asyncio-protocol.rst:116 +msgid "" +"Interface representing a bidirectional transport, such as a TCP connection." +msgstr "接口代表一个双向传输,如 TCP 连接。" + +#: ../../library/asyncio-protocol.rst:119 +msgid "" +"The user does not instantiate a transport directly; they call a utility " +"function, passing it a protocol factory and other information necessary to " +"create the transport and protocol." +msgstr "用户不用直接实例化传输;调用一个功能函数,给它传递协议工厂和其它需要的信息就可以创建传输和协议。" + +#: ../../library/asyncio-protocol.rst:123 +msgid "" +"Instances of the *Transport* class are returned from or used by event loop " +"methods like :meth:`loop.create_connection`, " +":meth:`loop.create_unix_connection`, :meth:`loop.create_server`, " +":meth:`loop.sendfile`, etc." +msgstr "" +"*Transport* 类实例由如 :meth:`loop.create_connection`、 " +":meth:`loop.create_unix_connection` , :meth:`loop.create_server` , " +":meth:`loop.sendfile` 等这类事件循环方法使用或返回。" + +#: ../../library/asyncio-protocol.rst:131 +msgid "A transport for datagram (UDP) connections." +msgstr "数据报 (UDP) 传输连接。" + +#: ../../library/asyncio-protocol.rst:133 +msgid "" +"Instances of the *DatagramTransport* class are returned from the " +":meth:`loop.create_datagram_endpoint` event loop method." +msgstr "" +"*DatagramTransport* 类实例由事件循环方法 :meth:`loop.create_datagram_endpoint` 返回。" + +#: ../../library/asyncio-protocol.rst:139 +msgid "" +"An abstraction to represent a connection between a parent and its child OS " +"process." +msgstr "表示父进程和子进程之间连接的抽象。" + +#: ../../library/asyncio-protocol.rst:142 +msgid "" +"Instances of the *SubprocessTransport* class are returned from event loop " +"methods :meth:`loop.subprocess_shell` and :meth:`loop.subprocess_exec`." +msgstr "" +"*SubprocessTransport* 类的实例由事件循环方法 :meth:`loop.subprocess_shell` 和 " +":meth:`loop.subprocess_exec` 返回。" + +#: ../../library/asyncio-protocol.rst:148 +msgid "Base Transport" +msgstr "基础传输" + +#: ../../library/asyncio-protocol.rst:152 +msgid "Close the transport." +msgstr "关闭传输。" + +#: ../../library/asyncio-protocol.rst:154 +msgid "" +"If the transport has a buffer for outgoing data, buffered data will be " +"flushed asynchronously. No more data will be received. After all buffered " +"data is flushed, the protocol's :meth:`protocol.connection_lost() " +"` method will be called with :const:`None` as " +"its argument. The transport should not be used once it is closed." +msgstr "" +"如果传输具有外发数据缓冲区,已缓存的数据将被异步地发送。之后将不会再接收更多数据。在所有已缓存的数据被发送之后,协议的 " +":meth:`protocol.connection_lost() ` 方法将被调用并以 " +":const:`None` 作为其参数。在传输关闭后它就不应再被使用。" + +#: ../../library/asyncio-protocol.rst:164 +msgid "Return ``True`` if the transport is closing or is closed." +msgstr "返回 ``True``,如果传输正在关闭或已经关闭。" + +#: ../../library/asyncio-protocol.rst:168 +msgid "" +"Return information about the transport or underlying resources it uses." +msgstr "返回传输或它使用的底层资源信息。" + +#: ../../library/asyncio-protocol.rst:171 +msgid "" +"*name* is a string representing the piece of transport-specific information " +"to get." +msgstr "*name* 是表示要获取传输特定信息的字符串。" + +#: ../../library/asyncio-protocol.rst:174 +msgid "" +"*default* is the value to return if the information is not available, or if " +"the transport does not support querying it with the given third-party event " +"loop implementation or on the current platform." +msgstr "*default* 是在信息不可用或传输不支持第三方事件循环实现或当前平台查询时返回的值。" + +#: ../../library/asyncio-protocol.rst:179 +msgid "" +"For example, the following code attempts to get the underlying socket object" +" of the transport::" +msgstr "例如下面代码尝试获取传输相关套接字对象::" + +#: ../../library/asyncio-protocol.rst:182 +msgid "" +"sock = transport.get_extra_info('socket')\n" +"if sock is not None:\n" +" print(sock.getsockopt(...))" +msgstr "" +"sock = transport.get_extra_info('socket')\n" +"if sock is not None:\n" +" print(sock.getsockopt(...))" + +#: ../../library/asyncio-protocol.rst:186 +msgid "Categories of information that can be queried on some transports:" +msgstr "传输可查询信息类别:" + +#: ../../library/asyncio-protocol.rst:188 +msgid "socket:" +msgstr "套接字:" + +#: ../../library/asyncio-protocol.rst:190 +msgid "" +"``'peername'``: the remote address to which the socket is connected, result " +"of :meth:`socket.socket.getpeername` (``None`` on error)" +msgstr "" +"``'peername'``: 套接字连接时的远端地址,:meth:`socket.socket.getpeername` 方法的结果 (出错时为 " +"``None`` )" + +#: ../../library/asyncio-protocol.rst:194 +msgid "``'socket'``: :class:`socket.socket` instance" +msgstr "``'socket'``: :class:`socket.socket` 实例" + +#: ../../library/asyncio-protocol.rst:196 +msgid "" +"``'sockname'``: the socket's own address, result of " +":meth:`socket.socket.getsockname`" +msgstr "``'sockname'``: 套接字本地地址, :meth:`socket.socket.getsockname` 方法的结果" + +#: ../../library/asyncio-protocol.rst:199 +msgid "SSL socket:" +msgstr "SSL 套接字:" + +#: ../../library/asyncio-protocol.rst:201 +msgid "" +"``'compression'``: the compression algorithm being used as a string, or " +"``None`` if the connection isn't compressed; result of " +":meth:`ssl.SSLSocket.compression`" +msgstr "" +"``'compression'``: 用字符串指定压缩算法,或者连接没有压缩时为 ``None`` " +";:meth:`ssl.SSLSocket.compression` 的结果。" + +#: ../../library/asyncio-protocol.rst:205 +msgid "" +"``'cipher'``: a three-value tuple containing the name of the cipher being " +"used, the version of the SSL protocol that defines its use, and the number " +"of secret bits being used; result of :meth:`ssl.SSLSocket.cipher`" +msgstr "" +"``'cipher'``: 一个三值的元组,包含使用密码的名称,定义使用的 SSL 协议的版本,使用的加密位数。 " +":meth:`ssl.SSLSocket.cipher` 的结果。" + +#: ../../library/asyncio-protocol.rst:210 +msgid "" +"``'peercert'``: peer certificate; result of " +":meth:`ssl.SSLSocket.getpeercert`" +msgstr "``'peercert'``: 远端凭证; :meth:`ssl.SSLSocket.getpeercert` 结果。" + +#: ../../library/asyncio-protocol.rst:213 +msgid "``'sslcontext'``: :class:`ssl.SSLContext` instance" +msgstr "``'sslcontext'``: :class:`ssl.SSLContext` 实例" + +#: ../../library/asyncio-protocol.rst:215 +msgid "" +"``'ssl_object'``: :class:`ssl.SSLObject` or :class:`ssl.SSLSocket` instance" +msgstr "``'ssl_object'``: :class:`ssl.SSLObject` 或 :class:`ssl.SSLSocket` 实例" + +#: ../../library/asyncio-protocol.rst:218 +msgid "pipe:" +msgstr "管道:" + +#: ../../library/asyncio-protocol.rst:220 +msgid "``'pipe'``: pipe object" +msgstr "``'pipe'``: 管道对象" + +#: ../../library/asyncio-protocol.rst:222 +msgid "subprocess:" +msgstr "子进程:" + +#: ../../library/asyncio-protocol.rst:224 +msgid "``'subprocess'``: :class:`subprocess.Popen` instance" +msgstr "``'subprocess'``: :class:`subprocess.Popen` 实例" + +#: ../../library/asyncio-protocol.rst:228 +msgid "Set a new protocol." +msgstr "设置一个新协议。" + +#: ../../library/asyncio-protocol.rst:230 +msgid "" +"Switching protocol should only be done when both protocols are documented to" +" support the switch." +msgstr "只有两种协议都写明支持切换才能完成切换协议。" + +#: ../../library/asyncio-protocol.rst:235 +msgid "Return the current protocol." +msgstr "返回当前协议。" + +#: ../../library/asyncio-protocol.rst:239 +msgid "Read-only Transports" +msgstr "只读传输" + +#: ../../library/asyncio-protocol.rst:243 +msgid "Return ``True`` if the transport is receiving new data." +msgstr "如果传输正在接收新数据则返回 ``True``。" + +#: ../../library/asyncio-protocol.rst:249 +msgid "" +"Pause the receiving end of the transport. No data will be passed to the " +"protocol's :meth:`protocol.data_received() ` method " +"until :meth:`resume_reading` is called." +msgstr "" +"暂停传输的接收端。:meth:`protocol.data_received() ` " +"方法将不会收到数据,除非 :meth:`resume_reading`  被调用。" + +#: ../../library/asyncio-protocol.rst:253 +msgid "" +"The method is idempotent, i.e. it can be called when the transport is " +"already paused or closed." +msgstr "这个方法是幂等的,即它可以在传输已经暂停或关闭时调用。" + +#: ../../library/asyncio-protocol.rst:259 +msgid "" +"Resume the receiving end. The protocol's :meth:`protocol.data_received() " +"` method will be called once again if some data is " +"available for reading." +msgstr "" +"恢复接收端。如果有数据可读取时,协议方法 :meth:`protocol.data_received() " +"` 将再次被调用。" + +#: ../../library/asyncio-protocol.rst:263 +msgid "" +"The method is idempotent, i.e. it can be called when the transport is " +"already reading." +msgstr "这个方法是幂等的,即它可以在传输已经准备好读取数据时调用。" + +#: ../../library/asyncio-protocol.rst:269 +msgid "Write-only Transports" +msgstr "只写传输" + +#: ../../library/asyncio-protocol.rst:273 +msgid "" +"Close the transport immediately, without waiting for pending operations to " +"complete. Buffered data will be lost. No more data will be received. The " +"protocol's :meth:`protocol.connection_lost() `" +" method will eventually be called with :const:`None` as its argument." +msgstr "" +"立即关闭传输,不会等待已提交的操作处理完毕。已缓存的数据将会丢失。不会接收更多数据。最终 :const:`None` 将作为协议的 " +":meth:`protocol.connection_lost() ` 方法的参数被调用。" + +#: ../../library/asyncio-protocol.rst:281 +msgid "" +"Return :const:`True` if the transport supports " +":meth:`~WriteTransport.write_eof`, :const:`False` if not." +msgstr "" +"如果传输支持 :meth:`~WriteTransport.write_eof` 返回 :const:`True` 否则返回 " +":const:`False`." + +#: ../../library/asyncio-protocol.rst:286 +msgid "Return the current size of the output buffer used by the transport." +msgstr "返回传输使用输出缓冲区的当前大小。" + +#: ../../library/asyncio-protocol.rst:290 +msgid "" +"Get the *high* and *low* watermarks for write flow control. Return a tuple " +"``(low, high)`` where *low* and *high* are positive number of bytes." +msgstr "" +"获取写入流控制 *high* 和 *low* 高低标记位。返回元组 ``(low, high)``, *low* 和 *high* 为正字节数。" + +#: ../../library/asyncio-protocol.rst:294 +msgid "Use :meth:`set_write_buffer_limits` to set the limits." +msgstr "使用 :meth:`set_write_buffer_limits` 设置限制。" + +#: ../../library/asyncio-protocol.rst:300 +msgid "Set the *high* and *low* watermarks for write flow control." +msgstr "设置写入流控制 *high* 和 *low* 高低标记位。" + +#: ../../library/asyncio-protocol.rst:302 +msgid "" +"These two values (measured in number of bytes) control when the protocol's " +":meth:`protocol.pause_writing() ` and " +":meth:`protocol.resume_writing() ` methods are " +"called. If specified, the low watermark must be less than or equal to the " +"high watermark. Neither *high* nor *low* can be negative." +msgstr "" +"这两个值(以字节数表示)控制何时调用协议的 :meth:`protocol.pause_writing() " +"` 和 :meth:`protocol.resume_writing() " +"` 方法。如果指明,则低水位必须小于或等于高水位。 *high* 和 *low* " +"都不能为负值。" + +#: ../../library/asyncio-protocol.rst:310 +msgid "" +":meth:`~BaseProtocol.pause_writing` is called when the buffer size becomes " +"greater than or equal to the *high* value. If writing has been paused, " +":meth:`~BaseProtocol.resume_writing` is called when the buffer size becomes " +"less than or equal to the *low* value." +msgstr "" +":meth:`~BaseProtocol.pause_writing` 会在缓冲区尺寸大于或等于 *high* 值时被调用。 " +"如果写入已经被暂停,:meth:`~BaseProtocol.resume_writing` 会在缓冲区尺寸小于或等于 *low* 值时被调用。" + +#: ../../library/asyncio-protocol.rst:315 +msgid "" +"The defaults are implementation-specific. If only the high watermark is " +"given, the low watermark defaults to an implementation-specific value less " +"than or equal to the high watermark. Setting *high* to zero forces *low* to" +" zero as well, and causes :meth:`~BaseProtocol.pause_writing` to be called " +"whenever the buffer becomes non-empty. Setting *low* to zero causes " +":meth:`~BaseProtocol.resume_writing` to be called only once the buffer is " +"empty. Use of zero for either limit is generally sub-optimal as it reduces " +"opportunities for doing I/O and computation concurrently." +msgstr "" +"默认值是实现专属的。如果只给出了高水位值,则低水位值默认为一个小于或等于高水位值的实现专属值。将 *high* 设为零会强制将 *low* " +"也设为零,并使得 :meth:`~BaseProtocol.pause_writing` 在缓冲区变为非空的任何时刻被调用。将 *low* 设为零会使得" +" :meth:`~BaseProtocol.resume_writing` 在缓冲区为空时只被调用一次。 " +"对于上下限都使用零值通常是不够优化的,因为它减少了并发执行 I/O 和计算的机会。" + +#: ../../library/asyncio-protocol.rst:326 +msgid "Use :meth:`~WriteTransport.get_write_buffer_limits` to get the limits." +msgstr "可使用 :meth:`~WriteTransport.get_write_buffer_limits` 来获取上下限值。" + +#: ../../library/asyncio-protocol.rst:331 +msgid "Write some *data* bytes to the transport." +msgstr "将一些 *data* 字节串写入传输。" + +#: ../../library/asyncio-protocol.rst:333 +#: ../../library/asyncio-protocol.rst:362 +msgid "" +"This method does not block; it buffers the data and arranges for it to be " +"sent out asynchronously." +msgstr "此方法不会阻塞;它会缓冲数据并安排其被异步地发出。" + +#: ../../library/asyncio-protocol.rst:338 +msgid "" +"Write a list (or any iterable) of data bytes to the transport. This is " +"functionally equivalent to calling :meth:`write` on each element yielded by " +"the iterable, but may be implemented more efficiently." +msgstr "" +"将数据字节串的列表(或任意可迭代对象)写入传输。这在功能上等价于在可迭代对象产生的每个元素上调用 :meth:`write`,但其实现可能更为高效。" + +#: ../../library/asyncio-protocol.rst:345 +msgid "" +"Close the write end of the transport after flushing all buffered data. Data " +"may still be received." +msgstr "在刷新所有已缓冲数据之后关闭传输的写入端。数据仍可以被接收。" + +#: ../../library/asyncio-protocol.rst:348 +msgid "" +"This method can raise :exc:`NotImplementedError` if the transport (e.g. SSL)" +" doesn't support half-closed connections." +msgstr "如果传输(例如 SSL)不支持半关闭的连接,此方法会引发 :exc:`NotImplementedError`。" + +#: ../../library/asyncio-protocol.rst:353 +msgid "Datagram Transports" +msgstr "数据报传输" + +#: ../../library/asyncio-protocol.rst:357 +msgid "" +"Send the *data* bytes to the remote peer given by *addr* (a transport-" +"dependent target address). If *addr* is :const:`None`, the data is sent to " +"the target address given on transport creation." +msgstr "" +"将 *data* 字节串发送到 *addr* (基于传输的目标地址) 所给定的远端对等方。如果 *addr* 为 " +":const:`None`,则将数据发送到传输创建时给定的目标地址。" + +#: ../../library/asyncio-protocol.rst:365 +msgid "" +"This method can be called with an empty bytes object to send a zero-length " +"datagram. The buffer size calculation used for flow control is also updated " +"to account for the datagram header." +msgstr "调用此方法时可以传入一个空字节串对象来发送零长度的数据报。用于流量控制的缓冲区大小计算也会被更新以计入数据报的标头。" + +#: ../../library/asyncio-protocol.rst:372 +msgid "" +"Close the transport immediately, without waiting for pending operations to " +"complete. Buffered data will be lost. No more data will be received. The " +"protocol's :meth:`protocol.connection_lost() `" +" method will eventually be called with :const:`None` as its argument." +msgstr "" +"立即关闭传输,不会等待已提交的操作执行完毕。已缓存的数据将会丢失。不会接收更多的数据。协议的 " +":meth:`protocol.connection_lost() ` 方法最终将附带 " +":const:`None` 作为参数被调用。" + +#: ../../library/asyncio-protocol.rst:382 +msgid "Subprocess Transports" +msgstr "子进程传输" + +#: ../../library/asyncio-protocol.rst:386 +msgid "Return the subprocess process id as an integer." +msgstr "将子进程的进程 ID 以整数形式返回。" + +#: ../../library/asyncio-protocol.rst:390 +msgid "" +"Return the transport for the communication pipe corresponding to the integer" +" file descriptor *fd*:" +msgstr "返回对应于整数文件描述符 *fd* 的通信管道的传输:" + +#: ../../library/asyncio-protocol.rst:393 +msgid "" +"``0``: writable streaming transport of the standard input (*stdin*), or " +":const:`None` if the subprocess was not created with ``stdin=PIPE``" +msgstr "" +"``0``: 标准输入 (*stdin*) 的可写流式传输,或者如果子进程创建时未设置 ``stdin=PIPE`` 则为 :const:`None`" + +#: ../../library/asyncio-protocol.rst:395 +msgid "" +"``1``: readable streaming transport of the standard output (*stdout*), or " +":const:`None` if the subprocess was not created with ``stdout=PIPE``" +msgstr "" +"``1``: 标准输出 (*stdout*) 的可读流式传输,或者如果子进程创建时未设置 ``stdout=PIPE`` 则为 " +":const:`None`" + +#: ../../library/asyncio-protocol.rst:397 +msgid "" +"``2``: readable streaming transport of the standard error (*stderr*), or " +":const:`None` if the subprocess was not created with ``stderr=PIPE``" +msgstr "" +"``2``: 标准错误 (*stderr*) 的可读流式传输,或者如果子进程创建时未设置 ``stderr=PIPE`` 则为 " +":const:`None`" + +#: ../../library/asyncio-protocol.rst:399 +msgid "other *fd*: :const:`None`" +msgstr "其他 *fd*: :const:`None`" + +#: ../../library/asyncio-protocol.rst:403 +msgid "" +"Return the subprocess return code as an integer or :const:`None` if it " +"hasn't returned, which is similar to the :attr:`subprocess.Popen.returncode`" +" attribute." +msgstr "" +"返回整数形式的进程返回码,或者如果还未返回则为 :const:`None`,这类似于 " +":attr:`subprocess.Popen.returncode` 属性。" + +#: ../../library/asyncio-protocol.rst:409 +msgid "Kill the subprocess." +msgstr "杀死子进程。" + +#: ../../library/asyncio-protocol.rst:411 +msgid "" +"On POSIX systems, the function sends SIGKILL to the subprocess. On Windows, " +"this method is an alias for :meth:`terminate`." +msgstr "" +"在 POSIX 系统中,函数会发送 SIGKILL 到子进程。在 Windows 中,此方法是 :meth:`terminate` 的别名。" + +#: ../../library/asyncio-protocol.rst:414 +msgid "See also :meth:`subprocess.Popen.kill`." +msgstr "另请参见 :meth:`subprocess.Popen.kill`。" + +#: ../../library/asyncio-protocol.rst:418 +msgid "" +"Send the *signal* number to the subprocess, as in " +":meth:`subprocess.Popen.send_signal`." +msgstr "发送 *signal* 编号到子进程,与 :meth:`subprocess.Popen.send_signal` 一样。" + +#: ../../library/asyncio-protocol.rst:423 +msgid "Stop the subprocess." +msgstr "停止子进程。" + +#: ../../library/asyncio-protocol.rst:425 +msgid "" +"On POSIX systems, this method sends :py:const:`~signal.SIGTERM` to the " +"subprocess. On Windows, the Windows API function :c:func:`!TerminateProcess`" +" is called to stop the subprocess." +msgstr "" +"在 POSIX 系统中,此方法会发送 :py:const:`~signal.SIGTERM` 到子进程。在 Windows 中,则会调用 Windows" +" API 函数 :c:func:`!TerminateProcess` 来停止子进程。" + +#: ../../library/asyncio-protocol.rst:429 +msgid "See also :meth:`subprocess.Popen.terminate`." +msgstr "另请参见 :meth:`subprocess.Popen.terminate`。" + +#: ../../library/asyncio-protocol.rst:433 +msgid "Kill the subprocess by calling the :meth:`kill` method." +msgstr "通过调用 :meth:`kill` 方法来杀死子进程。" + +#: ../../library/asyncio-protocol.rst:435 +msgid "" +"If the subprocess hasn't returned yet, and close transports of *stdin*, " +"*stdout*, and *stderr* pipes." +msgstr "如果子进程尚未返回,并关闭 *stdin*, *stdout* 和 *stderr* 管道的传输。" + +#: ../../library/asyncio-protocol.rst:442 +msgid "Protocols" +msgstr "协议" + +#: ../../library/asyncio-protocol.rst:444 +msgid "**Source code:** :source:`Lib/asyncio/protocols.py`" +msgstr "**源码:** :source:`Lib/asyncio/protocols.py`" + +#: ../../library/asyncio-protocol.rst:448 +msgid "" +"asyncio provides a set of abstract base classes that should be used to " +"implement network protocols. Those classes are meant to be used together " +"with :ref:`transports `." +msgstr "" +"asyncio 提供了一组抽象基类,它们应当被用于实现网络协议。这些类被设计为与 :ref:`传输 ` 配合使用。" + +#: ../../library/asyncio-protocol.rst:452 +msgid "" +"Subclasses of abstract base protocol classes may implement some or all " +"methods. All these methods are callbacks: they are called by transports on " +"certain events, for example when some data is received. A base protocol " +"method should be called by the corresponding transport." +msgstr "" +"抽象基础协议类的子类可以实现其中的部分或全部方法。所有这些方法都是回调:它们由传输在特定事件时调用,例如当数据被接收的时候。 " +"基础协议方法应当由相应的传输来调用。" + +#: ../../library/asyncio-protocol.rst:459 +msgid "Base Protocols" +msgstr "基础协议" + +#: ../../library/asyncio-protocol.rst:463 +msgid "Base protocol with methods that all protocols share." +msgstr "带有所有协议的共享方法的基础协议。" + +#: ../../library/asyncio-protocol.rst:467 +msgid "" +"The base class for implementing streaming protocols (TCP, Unix sockets, " +"etc)." +msgstr "用于实现流式协议(TCP, Unix 套接字等等)的基类。" + +#: ../../library/asyncio-protocol.rst:472 +msgid "" +"A base class for implementing streaming protocols with manual control of the" +" receive buffer." +msgstr "用于实现可对接收缓冲区进行手动控制的流式协议的基类。" + +#: ../../library/asyncio-protocol.rst:477 +msgid "The base class for implementing datagram (UDP) protocols." +msgstr "用于实现数据报(UDP)协议的基类。" + +#: ../../library/asyncio-protocol.rst:481 +msgid "" +"The base class for implementing protocols communicating with child processes" +" (unidirectional pipes)." +msgstr "用于实现与子进程通信(单向管道)的协议的基类。" + +#: ../../library/asyncio-protocol.rst:486 +msgid "Base Protocol" +msgstr "基础协议" + +#: ../../library/asyncio-protocol.rst:488 +msgid "All asyncio protocols can implement Base Protocol callbacks." +msgstr "所有 asyncio 协议均可实现基础协议回调。" + +#: ../../library/asyncio-protocol.rst:491 +msgid "Connection Callbacks" +msgstr "连接回调" + +#: ../../library/asyncio-protocol.rst:492 +msgid "" +"Connection callbacks are called on all protocols, exactly once per a " +"successful connection. All other protocol callbacks can only be called " +"between those two methods." +msgstr "连接回调会在所有协议上被调用,每个成功的连接将恰好调用一次。所有其他协议回调只能在以下两个方法之间被调用。" + +#: ../../library/asyncio-protocol.rst:498 +msgid "Called when a connection is made." +msgstr "连接建立时被调用。" + +#: ../../library/asyncio-protocol.rst:500 +msgid "" +"The *transport* argument is the transport representing the connection. The " +"protocol is responsible for storing the reference to its transport." +msgstr "*transport* 参数是代表连接的传输。此协议负责将引用保存至对应的传输。" + +#: ../../library/asyncio-protocol.rst:506 +msgid "Called when the connection is lost or closed." +msgstr "连接丢失或关闭时将被调用。" + +#: ../../library/asyncio-protocol.rst:508 +msgid "" +"The argument is either an exception object or :const:`None`. The latter " +"means a regular EOF is received, or the connection was aborted or closed by " +"this side of the connection." +msgstr "方法的参数是一个异常对象或为 :const:`None`。后者意味着收到了常规的 EOF,或者连接被连接的一端取消或关闭。" + +#: ../../library/asyncio-protocol.rst:514 +msgid "Flow Control Callbacks" +msgstr "流控制回调" + +#: ../../library/asyncio-protocol.rst:515 +msgid "" +"Flow control callbacks can be called by transports to pause or resume " +"writing performed by the protocol." +msgstr "流控制回调可由传输来调用以暂停或恢复协议所执行的写入操作。" + +#: ../../library/asyncio-protocol.rst:518 +msgid "" +"See the documentation of the :meth:`~WriteTransport.set_write_buffer_limits`" +" method for more details." +msgstr "请查看 :meth:`~WriteTransport.set_write_buffer_limits` 方法的文档了解详情。" + +#: ../../library/asyncio-protocol.rst:523 +msgid "Called when the transport's buffer goes over the high watermark." +msgstr "当传输的缓冲区升至高水位以上时将被调用。" + +#: ../../library/asyncio-protocol.rst:527 +msgid "Called when the transport's buffer drains below the low watermark." +msgstr "当传输的缓冲区降到低水位以下时将被调用。" + +#: ../../library/asyncio-protocol.rst:529 +msgid "" +"If the buffer size equals the high watermark, " +":meth:`~BaseProtocol.pause_writing` is not called: the buffer size must go " +"strictly over." +msgstr "" +"如果缓冲区大小等于高水位值,则 :meth:`~BaseProtocol.pause_writing` 不会被调用:缓冲区大小必须要高于该值。" + +#: ../../library/asyncio-protocol.rst:533 +msgid "" +"Conversely, :meth:`~BaseProtocol.resume_writing` is called when the buffer " +"size is equal or lower than the low watermark. These end conditions are " +"important to ensure that things go as expected when either mark is zero." +msgstr "" +"相反地,:meth:`~BaseProtocol.resume_writing` 会在缓冲区大小等于或小于低水位值时被调用。 " +"这些结束条件对于当两个水位取零值时也能确保符合预期的行为是很重要的。" + +#: ../../library/asyncio-protocol.rst:540 +msgid "Streaming Protocols" +msgstr "流式协议" + +#: ../../library/asyncio-protocol.rst:542 +msgid "" +"Event methods, such as :meth:`loop.create_server`, " +":meth:`loop.create_unix_server`, :meth:`loop.create_connection`, " +":meth:`loop.create_unix_connection`, :meth:`loop.connect_accepted_socket`, " +":meth:`loop.connect_read_pipe`, and :meth:`loop.connect_write_pipe` accept " +"factories that return streaming protocols." +msgstr "" +"事件方法,例如 :meth:`loop.create_server`, :meth:`loop.create_unix_server`, " +":meth:`loop.create_connection`, :meth:`loop.create_unix_connection`, " +":meth:`loop.connect_accepted_socket`, :meth:`loop.connect_read_pipe` 和 " +":meth:`loop.connect_write_pipe` 都接受返回流式协议的工厂。" + +#: ../../library/asyncio-protocol.rst:550 +msgid "" +"Called when some data is received. *data* is a non-empty bytes object " +"containing the incoming data." +msgstr "当收到数据时被调用。 *data* 为包含入站数据的非空字节串对象。" + +#: ../../library/asyncio-protocol.rst:553 +msgid "" +"Whether the data is buffered, chunked or reassembled depends on the " +"transport. In general, you shouldn't rely on specific semantics and instead" +" make your parsing generic and flexible. However, data is always received in" +" the correct order." +msgstr "" +"数据是否会被缓冲、分块或重组取决于具体传输。通常,你不应依赖于特定的语义而应使你的解析具有通用性和灵活性。但是,数据总是要以正确的顺序被接收。" + +#: ../../library/asyncio-protocol.rst:558 +msgid "" +"The method can be called an arbitrary number of times while a connection is " +"open." +msgstr "此方法在连接打开期间可以被调用任意次数。" + +#: ../../library/asyncio-protocol.rst:561 +msgid "" +"However, :meth:`protocol.eof_received() ` is called " +"at most once. Once ``eof_received()`` is called, ``data_received()`` is not" +" called anymore." +msgstr "" +"但是,:meth:`protocol.eof_received() ` 最多只会被调用一次。一旦 " +"``eof_received()`` 被调用,``data_received()`` 就不会再被调用。" + +#: ../../library/asyncio-protocol.rst:567 +msgid "" +"Called when the other end signals it won't send any more data (for example " +"by calling :meth:`transport.write_eof() `, if the " +"other end also uses asyncio)." +msgstr "" +"当另一端发信号表示不会再发送数据时被调用(例如通过调用 :meth:`transport.write_eof() " +"`,如果另一端也使用 asyncio 的话)。" + +#: ../../library/asyncio-protocol.rst:572 +msgid "" +"This method may return a false value (including ``None``), in which case the" +" transport will close itself. Conversely, if this method returns a true " +"value, the protocol used determines whether to close the transport. Since " +"the default implementation returns ``None``, it implicitly closes the " +"connection." +msgstr "" +"此方法可能返回假值 (包括 ``None``),在此情况下传输将会自行关闭。相反地,如果此方法返回真值,将以所用的协议来确定是否要关闭传输。 " +"由于默认实现是返回 ``None``,因此它会隐式地关闭连接。" + +#: ../../library/asyncio-protocol.rst:578 +msgid "" +"Some transports, including SSL, don't support half-closed connections, in " +"which case returning true from this method will result in the connection " +"being closed." +msgstr "某些传输,包括 SSL 在内,并不支持半关闭的连接,在此情况下从该方法返回真值将导致连接被关闭。" + +#: ../../library/asyncio-protocol.rst:583 +#: ../../library/asyncio-protocol.rst:641 +msgid "State machine:" +msgstr "状态机:" + +#: ../../library/asyncio-protocol.rst:585 +msgid "" +"start -> connection_made\n" +" [-> data_received]*\n" +" [-> eof_received]?\n" +"-> connection_lost -> end" +msgstr "" +"start -> connection_made\n" +" [-> data_received]*\n" +" [-> eof_received]?\n" +"-> connection_lost -> end" + +#: ../../library/asyncio-protocol.rst:594 +msgid "Buffered Streaming Protocols" +msgstr "缓冲流协议" + +#: ../../library/asyncio-protocol.rst:598 +msgid "" +"Buffered Protocols can be used with any event loop method that supports " +"`Streaming Protocols`_." +msgstr "带缓冲的协议可与任何支持 `Streaming Protocols`_ 的事件循环方法配合使用。" + +#: ../../library/asyncio-protocol.rst:601 +msgid "" +"``BufferedProtocol`` implementations allow explicit manual allocation and " +"control of the receive buffer. Event loops can then use the buffer provided" +" by the protocol to avoid unnecessary data copies. This can result in " +"noticeable performance improvement for protocols that receive big amounts of" +" data. Sophisticated protocol implementations can significantly reduce the " +"number of buffer allocations." +msgstr "" +"``BufferedProtocol`` 实现允许显式手动分配和控制接收缓冲区。随后事件循环可以使用协议提供的缓冲区来避免不必要的数据复制。 " +"这对于接收大量数据的协议来说会有明显的性能提升。复杂的协议实现能显著地减少缓冲区分配的数量。" + +#: ../../library/asyncio-protocol.rst:608 +msgid "" +"The following callbacks are called on :class:`BufferedProtocol` instances:" +msgstr "以下回调是在 :class:`BufferedProtocol` 实例上被调用的:" + +#: ../../library/asyncio-protocol.rst:613 +msgid "Called to allocate a new receive buffer." +msgstr "调用后会分配新的接收缓冲区。" + +#: ../../library/asyncio-protocol.rst:615 +msgid "" +"*sizehint* is the recommended minimum size for the returned buffer. It is " +"acceptable to return smaller or larger buffers than what *sizehint* " +"suggests. When set to -1, the buffer size can be arbitrary. It is an error " +"to return a buffer with a zero size." +msgstr "" +"*sizehint* 是推荐的返回缓冲区最小尺寸。返回小于或大于 *sizehint* 推荐尺寸的缓冲区也是可接受的。当设为 -1 " +"时,缓冲区尺寸可以是任意的。返回尺寸为零的缓冲区则是错误的。" + +#: ../../library/asyncio-protocol.rst:620 +msgid "" +"``get_buffer()`` must return an object implementing the :ref:`buffer " +"protocol `." +msgstr "``get_buffer()`` 必须返回一个实现了 :ref:`缓冲区协议 ` 的对象。" + +#: ../../library/asyncio-protocol.rst:625 +msgid "Called when the buffer was updated with the received data." +msgstr "用接收的数据更新缓冲区时被调用。" + +#: ../../library/asyncio-protocol.rst:627 +msgid "*nbytes* is the total number of bytes that were written to the buffer." +msgstr "*nbytes* 是被写入到缓冲区的字节总数。" + +#: ../../library/asyncio-protocol.rst:631 +msgid "" +"See the documentation of the :meth:`protocol.eof_received() " +"` method." +msgstr "请查看 :meth:`protocol.eof_received() ` 方法的文档。" + +#: ../../library/asyncio-protocol.rst:635 +msgid "" +":meth:`~BufferedProtocol.get_buffer` can be called an arbitrary number of " +"times during a connection. However, :meth:`protocol.eof_received() " +"` is called at most once and, if called, " +":meth:`~BufferedProtocol.get_buffer` and " +":meth:`~BufferedProtocol.buffer_updated` won't be called after it." +msgstr "" +"在连接期间 :meth:`~BufferedProtocol.get_buffer` 可以被调用任意次数。 " +"但是,:meth:`protocol.eof_received() ` " +"最多只能被调用一次,如果被调用,则在此之后 :meth:`~BufferedProtocol.get_buffer` 和 " +":meth:`~BufferedProtocol.buffer_updated` 不能再被调用。" + +#: ../../library/asyncio-protocol.rst:643 +msgid "" +"start -> connection_made\n" +" [-> get_buffer\n" +" [-> buffer_updated]?\n" +" ]*\n" +" [-> eof_received]?\n" +"-> connection_lost -> end" +msgstr "" +"start -> connection_made\n" +" [-> get_buffer\n" +" [-> buffer_updated]?\n" +" ]*\n" +" [-> eof_received]?\n" +"-> connection_lost -> end" + +#: ../../library/asyncio-protocol.rst:654 +msgid "Datagram Protocols" +msgstr "数据报协议" + +#: ../../library/asyncio-protocol.rst:656 +msgid "" +"Datagram Protocol instances should be constructed by protocol factories " +"passed to the :meth:`loop.create_datagram_endpoint` method." +msgstr "数据报协议实例应当由传递给 :meth:`loop.create_datagram_endpoint` 方法的协议工厂来构造。" + +#: ../../library/asyncio-protocol.rst:661 +msgid "" +"Called when a datagram is received. *data* is a bytes object containing the" +" incoming data. *addr* is the address of the peer sending the data; the " +"exact format depends on the transport." +msgstr "当接收到数据报时被调用。 *data* 是包含传入数据的字节串对象。 *addr* 是发送数据的对等端地址;实际的格式取决于具体传输。" + +#: ../../library/asyncio-protocol.rst:667 +msgid "" +"Called when a previous send or receive operation raises an :class:`OSError`." +" *exc* is the :class:`OSError` instance." +msgstr "当前一个发送或接收操作引发 :class:`OSError` 时被调用。 *exc* 是 :class:`OSError` 的实例。" + +#: ../../library/asyncio-protocol.rst:670 +msgid "" +"This method is called in rare conditions, when the transport (e.g. UDP) " +"detects that a datagram could not be delivered to its recipient. In many " +"conditions though, undeliverable datagrams will be silently dropped." +msgstr "此方法会在当传输(例如 UDP)检测到无法将数据报传给接收方等极少数情况下被调用。而在大多数情况下,无法送达的数据报将被静默地丢弃。" + +#: ../../library/asyncio-protocol.rst:677 +msgid "" +"On BSD systems (macOS, FreeBSD, etc.) flow control is not supported for " +"datagram protocols, because there is no reliable way to detect send failures" +" caused by writing too many packets." +msgstr "在 BSD 系统(macOS, FreeBSD 等等)上,数据报协议不支持流控制,因为没有可靠的方式来检测因写入过多包所导致的发送失败。" + +#: ../../library/asyncio-protocol.rst:681 +msgid "" +"The socket always appears 'ready' and excess packets are dropped. An " +":class:`OSError` with ``errno`` set to :const:`errno.ENOBUFS` may or may not" +" be raised; if it is raised, it will be reported to " +":meth:`DatagramProtocol.error_received` but otherwise ignored." +msgstr "" +"套接字总是显示为 'ready' 且多余的包会被丢弃。有一定的可能性会引发 :class:`OSError` 并设置 ``errno`` 为 " +":const:`errno.ENOBUFS`;如果此异常被引发,它将被报告给 " +":meth:`DatagramProtocol.error_received`,在其他情况下则会被忽略。" + +#: ../../library/asyncio-protocol.rst:690 +msgid "Subprocess Protocols" +msgstr "子进程协议" + +#: ../../library/asyncio-protocol.rst:692 +msgid "" +"Subprocess Protocol instances should be constructed by protocol factories " +"passed to the :meth:`loop.subprocess_exec` and :meth:`loop.subprocess_shell`" +" methods." +msgstr "" +"子进程协议实例应当由传递给 :meth:`loop.subprocess_exec` 和 :meth:`loop.subprocess_shell` " +"方法的协议工厂函数来构造。" + +#: ../../library/asyncio-protocol.rst:698 +msgid "" +"Called when the child process writes data into its stdout or stderr pipe." +msgstr "当子进程向其 stdout 或 stderr 管道写入数据时被调用。" + +#: ../../library/asyncio-protocol.rst:701 +msgid "*fd* is the integer file descriptor of the pipe." +msgstr "*fd* 是以整数表示的管道文件描述符。" + +#: ../../library/asyncio-protocol.rst:703 +msgid "*data* is a non-empty bytes object containing the received data." +msgstr "*data* 是包含已接收数据的非空字节串对象。" + +#: ../../library/asyncio-protocol.rst:707 +msgid "" +"Called when one of the pipes communicating with the child process is closed." +msgstr "与子进程通信的其中一个管道关闭时被调用。" + +#: ../../library/asyncio-protocol.rst:710 +msgid "*fd* is the integer file descriptor that was closed." +msgstr "*fd* 是以整数表示的已关闭文件描述符。" + +#: ../../library/asyncio-protocol.rst:714 +msgid "Called when the child process has exited." +msgstr "子进程退出时被调用。" + +#: ../../library/asyncio-protocol.rst:716 +msgid "" +"It can be called before :meth:`~SubprocessProtocol.pipe_data_received` and " +":meth:`~SubprocessProtocol.pipe_connection_lost` methods." +msgstr "" +"它可以在 :meth:`~SubprocessProtocol.pipe_data_received` 和 " +":meth:`~SubprocessProtocol.pipe_connection_lost` 方法之前被调用。" + +#: ../../library/asyncio-protocol.rst:721 +msgid "Examples" +msgstr "例子" + +#: ../../library/asyncio-protocol.rst:726 +msgid "TCP Echo Server" +msgstr "TCP 回显服务器" + +#: ../../library/asyncio-protocol.rst:728 +msgid "" +"Create a TCP echo server using the :meth:`loop.create_server` method, send " +"back received data, and close the connection::" +msgstr "使用 :meth:`loop.create_server` 方法创建 TCP 回显服务器,发回已接收的数据,并关闭连接::" + +#: ../../library/asyncio-protocol.rst:731 +msgid "" +"import asyncio\n" +"\n" +"\n" +"class EchoServerProtocol(asyncio.Protocol):\n" +" def connection_made(self, transport):\n" +" peername = transport.get_extra_info('peername')\n" +" print('Connection from {}'.format(peername))\n" +" self.transport = transport\n" +"\n" +" def data_received(self, data):\n" +" message = data.decode()\n" +" print('Data received: {!r}'.format(message))\n" +"\n" +" print('Send: {!r}'.format(message))\n" +" self.transport.write(data)\n" +"\n" +" print('Close the client socket')\n" +" self.transport.close()\n" +"\n" +"\n" +"async def main():\n" +" # Get a reference to the event loop as we plan to use\n" +" # low-level APIs.\n" +" loop = asyncio.get_running_loop()\n" +"\n" +" server = await loop.create_server(\n" +" EchoServerProtocol,\n" +" '127.0.0.1', 8888)\n" +"\n" +" async with server:\n" +" await server.serve_forever()\n" +"\n" +"\n" +"asyncio.run(main())" +msgstr "" +"import asyncio\n" +"\n" +"\n" +"class EchoServerProtocol(asyncio.Protocol):\n" +" def connection_made(self, transport):\n" +" peername = transport.get_extra_info('peername')\n" +" print('Connection from {}'.format(peername))\n" +" self.transport = transport\n" +"\n" +" def data_received(self, data):\n" +" message = data.decode()\n" +" print('Data received: {!r}'.format(message))\n" +"\n" +" print('Send: {!r}'.format(message))\n" +" self.transport.write(data)\n" +"\n" +" print('Close the client socket')\n" +" self.transport.close()\n" +"\n" +"\n" +"async def main():\n" +" # 获取指向事件循环的引用\n" +" # 因为我们准备使用低层级 API。\n" +" loop = asyncio.get_running_loop()\n" +"\n" +" server = await loop.create_server(\n" +" EchoServerProtocol,\n" +" '127.0.0.1', 8888)\n" +"\n" +" async with server:\n" +" await server.serve_forever()\n" +"\n" +"\n" +"asyncio.run(main())" + +#: ../../library/asyncio-protocol.rst:769 +msgid "" +"The :ref:`TCP echo server using streams ` " +"example uses the high-level :func:`asyncio.start_server` function." +msgstr "" +":ref:`使用流的 TCP 回显服务器 ` 示例,使用了高层级的 " +":func:`asyncio.start_server` 函数。" + +#: ../../library/asyncio-protocol.rst:775 +msgid "TCP Echo Client" +msgstr "TCP 回显客户端" + +#: ../../library/asyncio-protocol.rst:777 +msgid "" +"A TCP echo client using the :meth:`loop.create_connection` method, sends " +"data, and waits until the connection is closed::" +msgstr "使用 :meth:`loop.create_connection` 方法的 TCP 回显客户端,发送数据并等待,直到连接被关闭::" + +#: ../../library/asyncio-protocol.rst:780 +msgid "" +"import asyncio\n" +"\n" +"\n" +"class EchoClientProtocol(asyncio.Protocol):\n" +" def __init__(self, message, on_con_lost):\n" +" self.message = message\n" +" self.on_con_lost = on_con_lost\n" +"\n" +" def connection_made(self, transport):\n" +" transport.write(self.message.encode())\n" +" print('Data sent: {!r}'.format(self.message))\n" +"\n" +" def data_received(self, data):\n" +" print('Data received: {!r}'.format(data.decode()))\n" +"\n" +" def connection_lost(self, exc):\n" +" print('The server closed the connection')\n" +" self.on_con_lost.set_result(True)\n" +"\n" +"\n" +"async def main():\n" +" # Get a reference to the event loop as we plan to use\n" +" # low-level APIs.\n" +" loop = asyncio.get_running_loop()\n" +"\n" +" on_con_lost = loop.create_future()\n" +" message = 'Hello World!'\n" +"\n" +" transport, protocol = await loop.create_connection(\n" +" lambda: EchoClientProtocol(message, on_con_lost),\n" +" '127.0.0.1', 8888)\n" +"\n" +" # Wait until the protocol signals that the connection\n" +" # is lost and close the transport.\n" +" try:\n" +" await on_con_lost\n" +" finally:\n" +" transport.close()\n" +"\n" +"\n" +"asyncio.run(main())" +msgstr "" +"import asyncio\n" +"\n" +"\n" +"class EchoClientProtocol(asyncio.Protocol):\n" +" def __init__(self, message, on_con_lost):\n" +" self.message = message\n" +" self.on_con_lost = on_con_lost\n" +"\n" +" def connection_made(self, transport):\n" +" transport.write(self.message.encode())\n" +" print('Data sent: {!r}'.format(self.message))\n" +"\n" +" def data_received(self, data):\n" +" print('Data received: {!r}'.format(data.decode()))\n" +"\n" +" def connection_lost(self, exc):\n" +" print('The server closed the connection')\n" +" self.on_con_lost.set_result(True)\n" +"\n" +"\n" +"async def main():\n" +" # 获取指向事件循环的引用\n" +" # 因为我们准备使用低层级 API。\n" +" loop = asyncio.get_running_loop()\n" +"\n" +" on_con_lost = loop.create_future()\n" +" message = 'Hello World!'\n" +"\n" +" transport, protocol = await loop.create_connection(\n" +" lambda: EchoClientProtocol(message, on_con_lost),\n" +" '127.0.0.1', 8888)\n" +"\n" +" # 等待发出连接丢失的协议信号\n" +" # 并关闭传输。\n" +" try:\n" +" await on_con_lost\n" +" finally:\n" +" transport.close()\n" +"\n" +"\n" +"asyncio.run(main())" + +#: ../../library/asyncio-protocol.rst:825 +msgid "" +"The :ref:`TCP echo client using streams ` " +"example uses the high-level :func:`asyncio.open_connection` function." +msgstr "" +":ref:`使用流的 TCP 回显客户端 ` 示例,使用了高层级的 " +":func:`asyncio.open_connection` 函数。" + +#: ../../library/asyncio-protocol.rst:832 +msgid "UDP Echo Server" +msgstr "UDP 回显服务器" + +#: ../../library/asyncio-protocol.rst:834 +msgid "" +"A UDP echo server, using the :meth:`loop.create_datagram_endpoint` method, " +"sends back received data::" +msgstr "使用 :meth:`loop.create_datagram_endpoint` 方法的 UDP 回显服务器,发回已接收的数据::" + +#: ../../library/asyncio-protocol.rst:837 +msgid "" +"import asyncio\n" +"\n" +"\n" +"class EchoServerProtocol:\n" +" def connection_made(self, transport):\n" +" self.transport = transport\n" +"\n" +" def datagram_received(self, data, addr):\n" +" message = data.decode()\n" +" print('Received %r from %s' % (message, addr))\n" +" print('Send %r to %s' % (message, addr))\n" +" self.transport.sendto(data, addr)\n" +"\n" +"\n" +"async def main():\n" +" print(\"Starting UDP server\")\n" +"\n" +" # Get a reference to the event loop as we plan to use\n" +" # low-level APIs.\n" +" loop = asyncio.get_running_loop()\n" +"\n" +" # One protocol instance will be created to serve all\n" +" # client requests.\n" +" transport, protocol = await loop.create_datagram_endpoint(\n" +" EchoServerProtocol,\n" +" local_addr=('127.0.0.1', 9999))\n" +"\n" +" try:\n" +" await asyncio.sleep(3600) # Serve for 1 hour.\n" +" finally:\n" +" transport.close()\n" +"\n" +"\n" +"asyncio.run(main())" +msgstr "" +"import asyncio\n" +"\n" +"\n" +"class EchoServerProtocol:\n" +" def connection_made(self, transport):\n" +" self.transport = transport\n" +"\n" +" def datagram_received(self, data, addr):\n" +" message = data.decode()\n" +" print('Received %r from %s' % (message, addr))\n" +" print('Send %r to %s' % (message, addr))\n" +" self.transport.sendto(data, addr)\n" +"\n" +"\n" +"async def main():\n" +" print(\"Starting UDP server\")\n" +"\n" +" # 获取对事件循环的引用\n" +" # 因为我们打算使用低层级的 APIs。\n" +" loop = asyncio.get_running_loop()\n" +"\n" +" # 将创建一个协议实例来为所有客户端请求提供服务。\n" +" transport, protocol = await loop.create_datagram_endpoint(\n" +" EchoServerProtocol,\n" +" local_addr=('127.0.0.1', 9999))\n" +"\n" +" try:\n" +" await asyncio.sleep(3600) # 服务持续 1 小时。\n" +" finally:\n" +" transport.close()\n" +"\n" +"\n" +"asyncio.run(main())" + +#: ../../library/asyncio-protocol.rst:876 +msgid "UDP Echo Client" +msgstr "UDP 回显客户端" + +#: ../../library/asyncio-protocol.rst:878 +msgid "" +"A UDP echo client, using the :meth:`loop.create_datagram_endpoint` method, " +"sends data and closes the transport when it receives the answer::" +msgstr "" +"使用 :meth:`loop.create_datagram_endpoint` 方法的 UDP 回显客户端,发送数据并在收到回应时关闭传输::" + +#: ../../library/asyncio-protocol.rst:881 +msgid "" +"import asyncio\n" +"\n" +"\n" +"class EchoClientProtocol:\n" +" def __init__(self, message, on_con_lost):\n" +" self.message = message\n" +" self.on_con_lost = on_con_lost\n" +" self.transport = None\n" +"\n" +" def connection_made(self, transport):\n" +" self.transport = transport\n" +" print('Send:', self.message)\n" +" self.transport.sendto(self.message.encode())\n" +"\n" +" def datagram_received(self, data, addr):\n" +" print(\"Received:\", data.decode())\n" +"\n" +" print(\"Close the socket\")\n" +" self.transport.close()\n" +"\n" +" def error_received(self, exc):\n" +" print('Error received:', exc)\n" +"\n" +" def connection_lost(self, exc):\n" +" print(\"Connection closed\")\n" +" self.on_con_lost.set_result(True)\n" +"\n" +"\n" +"async def main():\n" +" # Get a reference to the event loop as we plan to use\n" +" # low-level APIs.\n" +" loop = asyncio.get_running_loop()\n" +"\n" +" on_con_lost = loop.create_future()\n" +" message = \"Hello World!\"\n" +"\n" +" transport, protocol = await loop.create_datagram_endpoint(\n" +" lambda: EchoClientProtocol(message, on_con_lost),\n" +" remote_addr=('127.0.0.1', 9999))\n" +"\n" +" try:\n" +" await on_con_lost\n" +" finally:\n" +" transport.close()\n" +"\n" +"\n" +"asyncio.run(main())" +msgstr "" +"import asyncio\n" +"\n" +"\n" +"class EchoClientProtocol:\n" +" def __init__(self, message, on_con_lost):\n" +" self.message = message\n" +" self.on_con_lost = on_con_lost\n" +" self.transport = None\n" +"\n" +" def connection_made(self, transport):\n" +" self.transport = transport\n" +" print('Send:', self.message)\n" +" self.transport.sendto(self.message.encode())\n" +"\n" +" def datagram_received(self, data, addr):\n" +" print(\"Received:\", data.decode())\n" +"\n" +" print(\"Close the socket\")\n" +" self.transport.close()\n" +"\n" +" def error_received(self, exc):\n" +" print('Error received:', exc)\n" +"\n" +" def connection_lost(self, exc):\n" +" print(\"Connection closed\")\n" +" self.on_con_lost.set_result(True)\n" +"\n" +"\n" +"async def main():\n" +" # 获取一个对事件循环的引用\n" +" # 因为我们计划使用低层级的 API。\n" +" loop = asyncio.get_running_loop()\n" +"\n" +" on_con_lost = loop.create_future()\n" +" message = \"Hello World!\"\n" +"\n" +" transport, protocol = await loop.create_datagram_endpoint(\n" +" lambda: EchoClientProtocol(message, on_con_lost),\n" +" remote_addr=('127.0.0.1', 9999))\n" +"\n" +" try:\n" +" await on_con_lost\n" +" finally:\n" +" transport.close()\n" +"\n" +"\n" +"asyncio.run(main())" + +#: ../../library/asyncio-protocol.rst:933 +msgid "Connecting Existing Sockets" +msgstr "连接已有的套接字" + +#: ../../library/asyncio-protocol.rst:935 +msgid "" +"Wait until a socket receives data using the :meth:`loop.create_connection` " +"method with a protocol::" +msgstr "附带一个协议使用 :meth:`loop.create_connection` 方法,等待直到套接字接收数据::" + +#: ../../library/asyncio-protocol.rst:938 +msgid "" +"import asyncio\n" +"import socket\n" +"\n" +"\n" +"class MyProtocol(asyncio.Protocol):\n" +"\n" +" def __init__(self, on_con_lost):\n" +" self.transport = None\n" +" self.on_con_lost = on_con_lost\n" +"\n" +" def connection_made(self, transport):\n" +" self.transport = transport\n" +"\n" +" def data_received(self, data):\n" +" print(\"Received:\", data.decode())\n" +"\n" +" # We are done: close the transport;\n" +" # connection_lost() will be called automatically.\n" +" self.transport.close()\n" +"\n" +" def connection_lost(self, exc):\n" +" # The socket has been closed\n" +" self.on_con_lost.set_result(True)\n" +"\n" +"\n" +"async def main():\n" +" # Get a reference to the event loop as we plan to use\n" +" # low-level APIs.\n" +" loop = asyncio.get_running_loop()\n" +" on_con_lost = loop.create_future()\n" +"\n" +" # Create a pair of connected sockets\n" +" rsock, wsock = socket.socketpair()\n" +"\n" +" # Register the socket to wait for data.\n" +" transport, protocol = await loop.create_connection(\n" +" lambda: MyProtocol(on_con_lost), sock=rsock)\n" +"\n" +" # Simulate the reception of data from the network.\n" +" loop.call_soon(wsock.send, 'abc'.encode())\n" +"\n" +" try:\n" +" await protocol.on_con_lost\n" +" finally:\n" +" transport.close()\n" +" wsock.close()\n" +"\n" +"asyncio.run(main())" +msgstr "" +"import asyncio\n" +"import socket\n" +"\n" +"\n" +"class MyProtocol(asyncio.Protocol):\n" +"\n" +" def __init__(self, on_con_lost):\n" +" self.transport = None\n" +" self.on_con_lost = on_con_lost\n" +"\n" +" def connection_made(self, transport):\n" +" self.transport = transport\n" +"\n" +" def data_received(self, data):\n" +" print(\"Received:\", data.decode())\n" +"\n" +" # 已完成:关闭传输;\n" +" # connection_lost() 将自动被调用。\n" +" self.transport.close()\n" +"\n" +" def connection_lost(self, exc):\n" +" # 套接字已被关闭\n" +" self.on_con_lost.set_result(True)\n" +"\n" +"\n" +"async def main():\n" +" # 获取指向事件循环的引用\n" +" # 因为我们准备使用低层级 API。\n" +" loop = asyncio.get_running_loop()\n" +" on_con_lost = loop.create_future()\n" +"\n" +" # 创建一对已连接的套接字\n" +" rsock, wsock = socket.socketpair()\n" +"\n" +" # 注册套接字以等待数据。\n" +" transport, protocol = await loop.create_connection(\n" +" lambda: MyProtocol(on_con_lost), sock=rsock)\n" +"\n" +" # 模拟从网络接收数据。\n" +" loop.call_soon(wsock.send, 'abc'.encode())\n" +"\n" +" try:\n" +" await protocol.on_con_lost\n" +" finally:\n" +" transport.close()\n" +" wsock.close()\n" +"\n" +"asyncio.run(main())" + +#: ../../library/asyncio-protocol.rst:989 +msgid "" +"The :ref:`watch a file descriptor for read events " +"` example uses the low-level " +":meth:`loop.add_reader` method to register an FD." +msgstr "" +"使用低层级的 :meth:`loop.add_reader` 方法来注册一个 FD 的 :ref:`监视文件描述符以读取事件 " +"` 示例。" + +#: ../../library/asyncio-protocol.rst:993 +msgid "" +"The :ref:`register an open socket to wait for data using streams " +"` example uses high-level streams" +" created by the :func:`open_connection` function in a coroutine." +msgstr "" +"使用在协程中通过 :func:`open_connection` 函数创建的高层级流的 :ref:`注册一个打开的套接字以等待使用流的数据 " +"` 示例。" + +#: ../../library/asyncio-protocol.rst:1000 +msgid "loop.subprocess_exec() and SubprocessProtocol" +msgstr "loop.subprocess_exec() 与 SubprocessProtocol" + +#: ../../library/asyncio-protocol.rst:1002 +msgid "" +"An example of a subprocess protocol used to get the output of a subprocess " +"and to wait for the subprocess exit." +msgstr "一个使用子进程协议来获取子进程的输出并等待子进程退出的示例。" + +#: ../../library/asyncio-protocol.rst:1005 +msgid "The subprocess is created by the :meth:`loop.subprocess_exec` method::" +msgstr "这个子进程是由 :meth:`loop.subprocess_exec` 方法创建的::" + +#: ../../library/asyncio-protocol.rst:1007 +msgid "" +"import asyncio\n" +"import sys\n" +"\n" +"class DateProtocol(asyncio.SubprocessProtocol):\n" +" def __init__(self, exit_future):\n" +" self.exit_future = exit_future\n" +" self.output = bytearray()\n" +" self.pipe_closed = False\n" +" self.exited = False\n" +"\n" +" def pipe_connection_lost(self, fd, exc):\n" +" self.pipe_closed = True\n" +" self.check_for_exit()\n" +"\n" +" def pipe_data_received(self, fd, data):\n" +" self.output.extend(data)\n" +"\n" +" def process_exited(self):\n" +" self.exited = True\n" +" # process_exited() method can be called before\n" +" # pipe_connection_lost() method: wait until both methods are\n" +" # called.\n" +" self.check_for_exit()\n" +"\n" +" def check_for_exit(self):\n" +" if self.pipe_closed and self.exited:\n" +" self.exit_future.set_result(True)\n" +"\n" +"async def get_date():\n" +" # Get a reference to the event loop as we plan to use\n" +" # low-level APIs.\n" +" loop = asyncio.get_running_loop()\n" +"\n" +" code = 'import datetime as dt; print(dt.datetime.now())'\n" +" exit_future = asyncio.Future(loop=loop)\n" +"\n" +" # Create the subprocess controlled by DateProtocol;\n" +" # redirect the standard output into a pipe.\n" +" transport, protocol = await loop.subprocess_exec(\n" +" lambda: DateProtocol(exit_future),\n" +" sys.executable, '-c', code,\n" +" stdin=None, stderr=None)\n" +"\n" +" # Wait for the subprocess exit using the process_exited()\n" +" # method of the protocol.\n" +" await exit_future\n" +"\n" +" # Close the stdout pipe.\n" +" transport.close()\n" +"\n" +" # Read the output which was collected by the\n" +" # pipe_data_received() method of the protocol.\n" +" data = bytes(protocol.output)\n" +" return data.decode('ascii').rstrip()\n" +"\n" +"date = asyncio.run(get_date())\n" +"print(f\"Current date: {date}\")" +msgstr "" +"import asyncio\n" +"import sys\n" +"\n" +"class DateProtocol(asyncio.SubprocessProtocol):\n" +" def __init__(self, exit_future):\n" +" self.exit_future = exit_future\n" +" self.output = bytearray()\n" +" self.pipe_closed = False\n" +" self.exited = False\n" +"\n" +" def pipe_connection_lost(self, fd, exc):\n" +" self.pipe_closed = True\n" +" self.check_for_exit()\n" +"\n" +" def pipe_data_received(self, fd, data):\n" +" self.output.extend(data)\n" +"\n" +" def process_exited(self):\n" +" self.exited = True\n" +" # process_exited() 方法可以在\n" +" # pipe_connection_lost() 方法之前被调用:\n" +" # 等待直到两个方法都已被调用。\n" +" self.check_for_exit()\n" +"\n" +" def check_for_exit(self):\n" +" if self.pipe_closed and self.exited:\n" +" self.exit_future.set_result(True)\n" +"\n" +"async def get_date():\n" +" # 获取对事件循环的引用因为我们打算使用\n" +" # 低层级 API。\n" +" loop = asyncio.get_running_loop()\n" +"\n" +" code = 'import datetime as dt; print(dt.datetime.now())'\n" +" exit_future = asyncio.Future(loop=loop)\n" +"\n" +" # 创建由 DateProtocol 控制的子进程;\n" +" # 重定向标准输出到一个管道。\n" +" transport, protocol = await loop.subprocess_exec(\n" +" lambda: DateProtocol(exit_future),\n" +" sys.executable, '-c', code,\n" +" stdin=None, stderr=None)\n" +"\n" +" # 使用协议的 process_exited() 方法\n" +" # 等待子进程退出。\n" +" await exit_future\n" +"\n" +" # 关闭 stdout 管道。\n" +" transport.close()\n" +"\n" +" # 读取由协议的 pipe_data_received() 方法\n" +" # 所收集的输出。\n" +" data = bytes(protocol.output)\n" +" return data.decode('ascii').rstrip()\n" +"\n" +"date = asyncio.run(get_date())\n" +"print(f\"Current date: {date}\")" + +#: ../../library/asyncio-protocol.rst:1065 +msgid "" +"See also the :ref:`same example ` " +"written using high-level APIs." +msgstr "" +"另请参阅使用高层级 API 编写的 :ref:`相同示例 `。" diff --git a/library/asyncio-queue.po b/library/asyncio-queue.po new file mode 100644 index 0000000000..445f08c870 --- /dev/null +++ b/library/asyncio-queue.po @@ -0,0 +1,409 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-11 15:33+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/asyncio-queue.rst:7 +msgid "Queues" +msgstr "队列" + +#: ../../library/asyncio-queue.rst:9 +msgid "**Source code:** :source:`Lib/asyncio/queues.py`" +msgstr "**源代码:** :source:`Lib/asyncio/queues.py`" + +#: ../../library/asyncio-queue.rst:13 +msgid "" +"asyncio queues are designed to be similar to classes of the :mod:`queue` " +"module. Although asyncio queues are not thread-safe, they are designed to " +"be used specifically in async/await code." +msgstr "" +"asyncio 队列被设计成与 :mod:`queue` 模块类似。尽管 asyncio 队列不是线程安全的,但它们是被设计专用于 " +"async/await 代码的。" + +#: ../../library/asyncio-queue.rst:17 +msgid "" +"Note that methods of asyncio queues don't have a *timeout* parameter; use " +":func:`asyncio.wait_for` function to do queue operations with a timeout." +msgstr "" +"注意 asyncio 的队列没有 *timeout* 形参;请使用 :func:`asyncio.wait_for` 函数为队列添加超时操作。" + +#: ../../library/asyncio-queue.rst:21 +msgid "See also the `Examples`_ section below." +msgstr "参见下面的 `Examples`_ 部分。" + +#: ../../library/asyncio-queue.rst:24 +msgid "Queue" +msgstr "Queue" + +#: ../../library/asyncio-queue.rst:28 +msgid "A first in, first out (FIFO) queue." +msgstr "先进,先出(FIFO)队列" + +#: ../../library/asyncio-queue.rst:30 +msgid "" +"If *maxsize* is less than or equal to zero, the queue size is infinite. If " +"it is an integer greater than ``0``, then ``await put()`` blocks when the " +"queue reaches *maxsize* until an item is removed by :meth:`get`." +msgstr "" +"如果 *maxsize* 小于等于零,则队列尺寸是无限的。如果是大于 ``0`` 的整数,则当队列达到 *maxsize* 时,``await " +"put()`` 将阻塞至某个元素被 :meth:`get` 取出。" + +#: ../../library/asyncio-queue.rst:35 +msgid "" +"Unlike the standard library threading :mod:`queue`, the size of the queue is" +" always known and can be returned by calling the :meth:`qsize` method." +msgstr "不像标准库中的线程型 :mod:`queue`,队列的大小一直是已知的,可以通过调用 :meth:`qsize` 方法返回。" + +#: ../../library/asyncio-queue.rst:39 +msgid "Removed the *loop* parameter." +msgstr "移除了 *loop* 形参。" + +#: ../../library/asyncio-queue.rst:43 +msgid "This class is :ref:`not thread safe `." +msgstr "这个类 :ref:`不是线程安全的 `。" + +#: ../../library/asyncio-queue.rst:47 +msgid "Number of items allowed in the queue." +msgstr "队列中可存放的元素数量。" + +#: ../../library/asyncio-queue.rst:51 +msgid "Return ``True`` if the queue is empty, ``False`` otherwise." +msgstr "如果队列为空返回 ``True``,否则返回 ``False``。" + +#: ../../library/asyncio-queue.rst:55 +msgid "Return ``True`` if there are :attr:`maxsize` items in the queue." +msgstr "如果有 :attr:`maxsize` 个条目在队列中,则返回 ``True`` 。" + +#: ../../library/asyncio-queue.rst:57 +msgid "" +"If the queue was initialized with ``maxsize=0`` (the default), then " +":meth:`full` never returns ``True``." +msgstr "如果队列用 ``maxsize=0`` (默认值) 初始化,则 :meth:`full` 永远不会返回 ``True``。" + +#: ../../library/asyncio-queue.rst:63 +msgid "" +"Remove and return an item from the queue. If queue is empty, wait until an " +"item is available." +msgstr "从队列中删除并返回一个元素。如果队列为空,则等待,直到队列中有元素。" + +#: ../../library/asyncio-queue.rst:66 +msgid "" +"Raises :exc:`QueueShutDown` if the queue has been shut down and is empty, or" +" if the queue has been shut down immediately." +msgstr "如果队列已被关闭并且为空,或者如果队列已被立即关闭则会引发 :exc:`QueueShutDown`。" + +#: ../../library/asyncio-queue.rst:71 +msgid "" +"Return an item if one is immediately available, else raise " +":exc:`QueueEmpty`." +msgstr "如果有元素立即可用则返回一个元素,否则引发 :exc:`QueueEmpty`。" + +#: ../../library/asyncio-queue.rst:74 +msgid "" +"Raises :exc:`QueueShutDown` if the queue has been shut down and is empty." +msgstr "" + +#: ../../library/asyncio-queue.rst:79 +msgid "Block until all items in the queue have been received and processed." +msgstr "阻塞至队列中所有的元素都被接收和处理完毕。" + +#: ../../library/asyncio-queue.rst:81 +msgid "" +"The count of unfinished tasks goes up whenever an item is added to the " +"queue. The count goes down whenever a consumer coroutine calls " +":meth:`task_done` to indicate that the item was retrieved and all work on it" +" is complete. When the count of unfinished tasks drops to zero, " +":meth:`join` unblocks." +msgstr "" +"当条目添加到队列的时候,未完成任务的计数就会增加。每当消费协程调用 :meth:`task_done` " +"表示这个条目已经被回收,该条目所有工作已经完成,未完成计数就会减少。当未完成计数降到零的时候, :meth:`join` 阻塞被解除。" + +#: ../../library/asyncio-queue.rst:90 +msgid "" +"Put an item into the queue. If the queue is full, wait until a free slot is " +"available before adding the item." +msgstr "添加一个元素进队列。如果队列满了,在添加元素之前,会一直等待空闲插槽可用。" + +#: ../../library/asyncio-queue.rst:93 ../../library/asyncio-queue.rst:101 +msgid "Raises :exc:`QueueShutDown` if the queue has been shut down." +msgstr "如果队列已被关闭则会引发 :exc:`QueueShutDown`。" + +#: ../../library/asyncio-queue.rst:97 +msgid "Put an item into the queue without blocking." +msgstr "不阻塞地放一个元素入队列。" + +#: ../../library/asyncio-queue.rst:99 +msgid "If no free slot is immediately available, raise :exc:`QueueFull`." +msgstr "如果没有立即可用的空闲槽,引发 :exc:`QueueFull` 异常。" + +#: ../../library/asyncio-queue.rst:105 +msgid "Return the number of items in the queue." +msgstr "返回队列中的元素数量。" + +#: ../../library/asyncio-queue.rst:109 +msgid "Put a :class:`Queue` instance into a shutdown mode." +msgstr "将一个 :class:`Queue` 实例置为关闭模式。" + +#: ../../library/asyncio-queue.rst:111 +msgid "" +"The queue can no longer grow. Future calls to :meth:`~Queue.put` raise " +":exc:`QueueShutDown`. Currently blocked callers of :meth:`~Queue.put` will " +"be unblocked and will raise :exc:`QueueShutDown` in the formerly awaiting " +"task." +msgstr "" +"该队列将不可再增长。未来对 :meth:`~Queue.put` 的调用将引发 :exc:`QueueShutDown`。当前被阻塞的 " +":meth:`~Queue.put` 的调用方将被取消阻塞并会在之前等待的任务中引发 :exc:`QueueShutDown`。" + +#: ../../library/asyncio-queue.rst:116 +msgid "" +"If *immediate* is false (the default), the queue can be wound down normally " +"with :meth:`~Queue.get` calls to extract tasks that have already been " +"loaded." +msgstr "如果 *immediate* 为假值(默认),则队列可通过 :meth:`~Queue.get` 调用正常缩减以提取已被加载的任务。" + +#: ../../library/asyncio-queue.rst:120 +msgid "" +"And if :meth:`~Queue.task_done` is called for each remaining task, a pending" +" :meth:`~Queue.join` will be unblocked normally." +msgstr "" +"而如果 :meth:`~Queue.task_done` 针对每个剩余的任务被调用,则挂起的 :meth:`~Queue.join` 将被正常取消阻塞。" + +#: ../../library/asyncio-queue.rst:123 +msgid "" +"Once the queue is empty, future calls to :meth:`~Queue.get` will raise " +":exc:`QueueShutDown`." +msgstr "一旦队列为空,未来对 :meth:`~Queue.get` 的调用将会引发 :exc:`QueueShutDown`。" + +#: ../../library/asyncio-queue.rst:126 +msgid "" +"If *immediate* is true, the queue is terminated immediately. The queue is " +"drained to be completely empty and the count of unfinished tasks is reduced " +"by the number of tasks drained. If unfinished tasks is zero, callers of " +":meth:`~Queue.join` are unblocked. Also, blocked callers of " +":meth:`~Queue.get` are unblocked and will raise :exc:`QueueShutDown` because" +" the queue is empty." +msgstr "" +"如果 *immediate* 为真值,则队列会被立即终结。队列将缩减至完全为空而未完成任务的计数将去除已缩减的任务数。如果未完成任务数为零,则 " +":meth:`~Queue.join` 的调用方将被取消阻塞。此外,被阻塞的 :meth:`~Queue.get` 调用方也将被取消阻塞并将引发 " +":exc:`QueueShutDown` 因为队列已为空。" + +#: ../../library/asyncio-queue.rst:134 +msgid "" +"Use caution when using :meth:`~Queue.join` with *immediate* set to true. " +"This unblocks the join even when no work has been done on the tasks, " +"violating the usual invariant for joining a queue." +msgstr "" +"在 *immediate* 设为真值的情况下使用 :meth:`~Queue.join` 需要小心谨慎。 " +"这会取消对已加入任务的阻塞即使任务尚未被执行,从而破坏通常的加入队列任务的不变性。" + +#: ../../library/asyncio-queue.rst:142 +msgid "Indicate that a formerly enqueued work item is complete." +msgstr "表明之前加入队列的工作条目已经完成。" + +#: ../../library/asyncio-queue.rst:144 +msgid "" +"Used by queue consumers. For each :meth:`~Queue.get` used to fetch a work " +"item, a subsequent call to :meth:`task_done` tells the queue that the " +"processing on the work item is complete." +msgstr "" +"由队列的消费者使用。对于每个被用于获取工作条目的 :meth:`~Queue.get`,将有一个对 :meth:`task_done` " +"的后续调用来告诉队列工作条目的操作已完成。" + +#: ../../library/asyncio-queue.rst:148 +msgid "" +"If a :meth:`join` is currently blocking, it will resume when all items have " +"been processed (meaning that a :meth:`task_done` call was received for every" +" item that had been :meth:`~Queue.put` into the queue)." +msgstr "" +"如果 :meth:`join` 当前正在阻塞,在所有条目都被处理后,将解除阻塞 (意味着每个 :meth:`~Queue.put` 进队列的条目的 " +":meth:`task_done` 都被收到)。" + +#: ../../library/asyncio-queue.rst:153 +msgid "" +"Raises :exc:`ValueError` if called more times than there were items placed " +"in the queue." +msgstr "如果被调用的次数多于放入队列中的项目数量,将引发 :exc:`ValueError`。" + +#: ../../library/asyncio-queue.rst:158 +msgid "Priority Queue" +msgstr "优先级队列" + +#: ../../library/asyncio-queue.rst:162 +msgid "" +"A variant of :class:`Queue`; retrieves entries in priority order (lowest " +"first)." +msgstr ":class:`Queue` 的变体;按优先级顺序取出条目 (最小的先取出)。" + +#: ../../library/asyncio-queue.rst:165 +msgid "Entries are typically tuples of the form ``(priority_number, data)``." +msgstr "条目通常是 ``(priority_number, data)`` 形式的元组。" + +#: ../../library/asyncio-queue.rst:170 +msgid "LIFO Queue" +msgstr "后进先出队列" + +#: ../../library/asyncio-queue.rst:174 +msgid "" +"A variant of :class:`Queue` that retrieves most recently added entries first" +" (last in, first out)." +msgstr ":class:`Queue` 的变体,先取出最近添加的条目(后进,先出)。" + +#: ../../library/asyncio-queue.rst:179 +msgid "Exceptions" +msgstr "异常" + +#: ../../library/asyncio-queue.rst:183 +msgid "" +"This exception is raised when the :meth:`~Queue.get_nowait` method is called" +" on an empty queue." +msgstr "当队列为空的时候,调用 :meth:`~Queue.get_nowait` 方法而引发这个异常。" + +#: ../../library/asyncio-queue.rst:189 +msgid "" +"Exception raised when the :meth:`~Queue.put_nowait` method is called on a " +"queue that has reached its *maxsize*." +msgstr "当队列中条目数量已经达到它的 *maxsize* 的时候,调用 :meth:`~Queue.put_nowait` 方法而引发的异常。" + +#: ../../library/asyncio-queue.rst:195 +msgid "" +"Exception raised when :meth:`~Queue.put`, :meth:`~Queue.put_nowait`, " +":meth:`~Queue.get` or :meth:`~Queue.get_nowait` is called on a queue which " +"has been shut down." +msgstr "" + +#: ../../library/asyncio-queue.rst:203 +msgid "Examples" +msgstr "例子" + +#: ../../library/asyncio-queue.rst:207 +msgid "" +"Queues can be used to distribute workload between several concurrent tasks::" +msgstr "队列能被用于多个并发任务的工作量分配::" + +#: ../../library/asyncio-queue.rst:210 +msgid "" +"import asyncio\n" +"import random\n" +"import time\n" +"\n" +"\n" +"async def worker(name, queue):\n" +" while True:\n" +" # Get a \"work item\" out of the queue.\n" +" sleep_for = await queue.get()\n" +"\n" +" # Sleep for the \"sleep_for\" seconds.\n" +" await asyncio.sleep(sleep_for)\n" +"\n" +" # Notify the queue that the \"work item\" has been processed.\n" +" queue.task_done()\n" +"\n" +" print(f'{name} has slept for {sleep_for:.2f} seconds')\n" +"\n" +"\n" +"async def main():\n" +" # Create a queue that we will use to store our \"workload\".\n" +" queue = asyncio.Queue()\n" +"\n" +" # Generate random timings and put them into the queue.\n" +" total_sleep_time = 0\n" +" for _ in range(20):\n" +" sleep_for = random.uniform(0.05, 1.0)\n" +" total_sleep_time += sleep_for\n" +" queue.put_nowait(sleep_for)\n" +"\n" +" # Create three worker tasks to process the queue concurrently.\n" +" tasks = []\n" +" for i in range(3):\n" +" task = asyncio.create_task(worker(f'worker-{i}', queue))\n" +" tasks.append(task)\n" +"\n" +" # Wait until the queue is fully processed.\n" +" started_at = time.monotonic()\n" +" await queue.join()\n" +" total_slept_for = time.monotonic() - started_at\n" +"\n" +" # Cancel our worker tasks.\n" +" for task in tasks:\n" +" task.cancel()\n" +" # Wait until all worker tasks are cancelled.\n" +" await asyncio.gather(*tasks, return_exceptions=True)\n" +"\n" +" print('====')\n" +" print(f'3 workers slept in parallel for {total_slept_for:.2f} seconds')\n" +" print(f'total expected sleep time: {total_sleep_time:.2f} seconds')\n" +"\n" +"\n" +"asyncio.run(main())" +msgstr "" +"import asyncio\n" +"import random\n" +"import time\n" +"\n" +"\n" +"async def worker(name, queue):\n" +" while True:\n" +" # 从队列获取一个“工作项”。\n" +" sleep_for = await queue.get()\n" +"\n" +" # 休眠 \"sleep_for\" 秒。\n" +" await asyncio.sleep(sleep_for)\n" +"\n" +" # 通知队列“工作项”已被处理。\n" +" queue.task_done()\n" +"\n" +" print(f'{name} has slept for {sleep_for:.2f} seconds')\n" +"\n" +"\n" +"async def main():\n" +" # 创建一个用于存储我们的“工作项”的队列。\n" +" queue = asyncio.Queue()\n" +"\n" +" # 生成随机时段并将它们放入队列。\n" +" total_sleep_time = 0\n" +" for _ in range(20):\n" +" sleep_for = random.uniform(0.05, 1.0)\n" +" total_sleep_time += sleep_for\n" +" queue.put_nowait(sleep_for)\n" +"\n" +" # 创建三个工作任务来并发地处理队列。\n" +" tasks = []\n" +" for i in range(3):\n" +" task = asyncio.create_task(worker(f'worker-{i}', queue))\n" +" tasks.append(task)\n" +"\n" +" # 等待直到队列处理完毕。\n" +" started_at = time.monotonic()\n" +" await queue.join()\n" +" total_slept_for = time.monotonic() - started_at\n" +"\n" +" # 取消我们的工作任务。\n" +" for task in tasks:\n" +" task.cancel()\n" +" # 等待直到所有工作任务都被取消。\n" +" await asyncio.gather(*tasks, return_exceptions=True)\n" +"\n" +" print('====')\n" +" print(f'3 workers slept in parallel for {total_slept_for:.2f} seconds')\n" +" print(f'total expected sleep time: {total_sleep_time:.2f} seconds')\n" +"\n" +"\n" +"asyncio.run(main())" diff --git a/library/asyncio-runner.po b/library/asyncio-runner.po new file mode 100644 index 0000000000..eb3eb6e303 --- /dev/null +++ b/library/asyncio-runner.po @@ -0,0 +1,299 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/asyncio-runner.rst:6 +msgid "Runners" +msgstr "运行器" + +#: ../../library/asyncio-runner.rst:8 +msgid "**Source code:** :source:`Lib/asyncio/runners.py`" +msgstr "**源代码:** :source:`Lib/asyncio/runners.py`" + +#: ../../library/asyncio-runner.rst:11 +msgid "" +"This section outlines high-level asyncio primitives to run asyncio code." +msgstr "本节将简述用于运行异步代码的高层级异步原语。" + +#: ../../library/asyncio-runner.rst:13 +msgid "" +"They are built on top of an :ref:`event loop ` with the " +"aim to simplify async code usage for common wide-spread scenarios." +msgstr "它们构建于 :ref:`事件循环 ` 之上,其目标是简化针对常见通用场景的异步代码的用法。" + +#: ../../library/asyncio-runner.rst:23 +msgid "Running an asyncio Program" +msgstr "运行 asyncio 程序" + +#: ../../library/asyncio-runner.rst:27 +msgid "Execute *coro* in an asyncio event loop and return the result." +msgstr "在 asyncio 事件循环中执行 *coro* 并返回结果。" + +#: ../../library/asyncio-runner.rst:29 ../../library/asyncio-runner.rst:121 +msgid "The argument can be any awaitable object." +msgstr "参数可以是任意可等待对象。" + +#: ../../library/asyncio-runner.rst:31 +msgid "" +"This function runs the awaitable, taking care of managing the asyncio event " +"loop, *finalizing asynchronous generators*, and closing the executor." +msgstr "此函数会运行该可等待对象,负责管理 asyncio 事件循环,*终结化异步生成器*,并关闭执行器。" + +#: ../../library/asyncio-runner.rst:35 ../../library/asyncio-runner.rst:131 +msgid "" +"This function cannot be called when another asyncio event loop is running in" +" the same thread." +msgstr "当有其他 asyncio 事件循环在同一线程中运行时,此函数不能被调用。" + +#: ../../library/asyncio-runner.rst:38 ../../library/asyncio-runner.rst:97 +msgid "" +"If *debug* is ``True``, the event loop will be run in debug mode. ``False`` " +"disables debug mode explicitly. ``None`` is used to respect the global " +":ref:`asyncio-debug-mode` settings." +msgstr "" +"如果 *debug* 为 ``True``,事件循环将运行于调试模式。``False`` 将显式地禁用调试模式。使用 ``None`` 将沿用全局 " +":ref:`asyncio-debug-mode` 设置。" + +#: ../../library/asyncio-runner.rst:42 +msgid "" +"If *loop_factory* is not ``None``, it is used to create a new event loop; " +"otherwise :func:`asyncio.new_event_loop` is used. The loop is closed at the " +"end. This function should be used as a main entry point for asyncio " +"programs, and should ideally only be called once. It is recommended to use " +"*loop_factory* to configure the event loop instead of policies. Passing " +":class:`asyncio.EventLoop` allows running asyncio without the policy system." +msgstr "" +"如果 *loop_factory* 不为 ``None``,它将被用来创建一个新的事件循环;否则将会使用 " +":func:`asyncio.new_event_loop`。最终该循环将被关闭。此函数应当被用作 asyncio " +"程序的主入口点,在理想情况下应当只被调用一次。建议使用 *loop_factory* 来配置事件循环而不是使用策略。传入 " +":class:`asyncio.EventLoop` 将允许不带策略系统地运行 asyncio。" + +#: ../../library/asyncio-runner.rst:50 +msgid "" +"The executor is given a timeout duration of 5 minutes to shutdown. If the " +"executor hasn't finished within that duration, a warning is emitted and the " +"executor is closed." +msgstr "执行器的关闭有 5 分钟的超时限制。如果执行器未在时限之内结束,将发出警告消息并关闭执行器。" + +#: ../../library/asyncio-runner.rst:54 +msgid "Example::" +msgstr "示例::" + +#: ../../library/asyncio-runner.rst:56 +msgid "" +"async def main():\n" +" await asyncio.sleep(1)\n" +" print('hello')\n" +"\n" +"asyncio.run(main())" +msgstr "" +"async def main():\n" +" await asyncio.sleep(1)\n" +" print('hello')\n" +"\n" +"asyncio.run(main())" + +#: ../../library/asyncio-runner.rst:64 +msgid "Updated to use :meth:`loop.shutdown_default_executor`." +msgstr "更新为使用 :meth:`loop.shutdown_default_executor`。" + +#: ../../library/asyncio-runner.rst:69 +msgid "" +"*debug* is ``None`` by default to respect the global debug mode settings." +msgstr "默认情况下 *debug* 为 ``None`` 即沿用全局调试模式设置。" + +#: ../../library/asyncio-runner.rst:73 +msgid "Added *loop_factory* parameter." +msgstr "增加了 *loop_factory* 形参。" + +#: ../../library/asyncio-runner.rst:77 ../../library/asyncio-runner.rst:136 +msgid "*coro* can be any awaitable object." +msgstr "*coro* 可以是任意可等待对象。" + +#: ../../library/asyncio-runner.rst:81 +msgid "" +"The :mod:`!asyncio` policy system is deprecated and will be removed in " +"Python 3.16; from there on, an explicit *loop_factory* is needed to " +"configure the event loop." +msgstr "" +":mod:`!asyncio` 策略系统已弃用,将在 Python 3.16 中删除;从那时起,需要显式的 *loop_factory* " +"来配置事件循环。" + +#: ../../library/asyncio-runner.rst:87 +msgid "Runner context manager" +msgstr "运行器上下文管理器" + +#: ../../library/asyncio-runner.rst:91 +msgid "" +"A context manager that simplifies *multiple* async function calls in the " +"same context." +msgstr "对在相同上下文中 *多个* 异步函数调用进行简化的上下文管理器。" + +#: ../../library/asyncio-runner.rst:94 +msgid "" +"Sometimes several top-level async functions should be called in the same " +":ref:`event loop ` and :class:`contextvars.Context`." +msgstr "" +"有时多个最高层级异步函数应当在同一个 :ref:`事件循环 ` 和 " +":class:`contextvars.Context` 中被调用。" + +#: ../../library/asyncio-runner.rst:101 +msgid "" +"*loop_factory* could be used for overriding the loop creation. It is the " +"responsibility of the *loop_factory* to set the created loop as the current " +"one. By default :func:`asyncio.new_event_loop` is used and set as current " +"event loop with :func:`asyncio.set_event_loop` if *loop_factory* is " +"``None``." +msgstr "" +"*loop_factory* 可被用来重载循环的创建。 *loop_factory* 要负责将所创建的循环设置为当前事件循环。在默认情况下如果 " +"*loop_factory* 为 ``None`` 则会使用 :func:`asyncio.new_event_loop` 并通过 " +":func:`asyncio.set_event_loop` 将其设置为当前事件循环。" + +#: ../../library/asyncio-runner.rst:106 +msgid "" +"Basically, :func:`asyncio.run` example can be rewritten with the runner " +"usage::" +msgstr "基本上,:func:`asyncio.run` 示例可以通过运行器的用法来重写::" + +#: ../../library/asyncio-runner.rst:108 +msgid "" +"async def main():\n" +" await asyncio.sleep(1)\n" +" print('hello')\n" +"\n" +"with asyncio.Runner() as runner:\n" +" runner.run(main())" +msgstr "" +"async def main():\n" +" await asyncio.sleep(1)\n" +" print('hello')\n" +"\n" +"with asyncio.Runner() as runner:\n" +" runner.run(main())" + +#: ../../library/asyncio-runner.rst:119 +msgid "Execute *coro* in the embedded event loop." +msgstr "在嵌入的事件循环中执行 *coro*。" + +#: ../../library/asyncio-runner.rst:123 +msgid "If the argument is a coroutine, it is wrapped in a Task." +msgstr "如果参数是协程,则将其包装在 Task 中。" + +#: ../../library/asyncio-runner.rst:125 +msgid "" +"An optional keyword-only *context* argument allows specifying a custom " +":class:`contextvars.Context` for the code to run in. The runner's default " +"context is used if context is ``None``." +msgstr "" +"可选的仅限关键字参数 *context* 允许指定一个自定义 :class:`contextvars.Context` 用作代码运行所在的上下文。 " +"如果上下文为 ``None`` 则会使用运行器的默认上下文。" + +#: ../../library/asyncio-runner.rst:129 +msgid "Returns the awaitable's result or raises an exception." +msgstr "返回可等待对象的结果或引发异常。" + +#: ../../library/asyncio-runner.rst:140 +msgid "Close the runner." +msgstr "关闭运行器。" + +#: ../../library/asyncio-runner.rst:142 +msgid "" +"Finalize asynchronous generators, shutdown default executor, close the event" +" loop and release embedded :class:`contextvars.Context`." +msgstr "最终化异步生成器,停止默认执行器,关闭事件循环并释放嵌入的 :class:`contextvars.Context`。" + +#: ../../library/asyncio-runner.rst:147 +msgid "Return the event loop associated with the runner instance." +msgstr "返回关联到运行器实例的事件循环。" + +#: ../../library/asyncio-runner.rst:151 +msgid "" +":class:`Runner` uses the lazy initialization strategy, its constructor " +"doesn't initialize underlying low-level structures." +msgstr ":class:`Runner` 会使用惰性初始化策略,它的构造器不会初始化下层的低层级结构体。" + +#: ../../library/asyncio-runner.rst:154 +msgid "" +"Embedded *loop* and *context* are created at the :keyword:`with` body " +"entering or the first call of :meth:`run` or :meth:`get_loop`." +msgstr "" +"嵌入的 *loop* 和 *context* 是在进入 :keyword:`with` 语句体或者对 :meth:`run` 或 " +":meth:`get_loop` 的首次调用时被创建的。" + +#: ../../library/asyncio-runner.rst:159 +msgid "Handling Keyboard Interruption" +msgstr "处理键盘中断" + +#: ../../library/asyncio-runner.rst:163 +msgid "" +"When :const:`signal.SIGINT` is raised by :kbd:`Ctrl-C`, " +":exc:`KeyboardInterrupt` exception is raised in the main thread by default. " +"However this doesn't work with :mod:`asyncio` because it can interrupt " +"asyncio internals and can hang the program from exiting." +msgstr "" +"当 :const:`signal.SIGINT` 被 :kbd:`Ctrl-C` 引发时,默认将在主线程中引发 " +":exc:`KeyboardInterrupt`。但是这并不适用于 :mod:`asyncio` 因为它可以中断异步的内部操作并能挂起要退出的程序。" + +#: ../../library/asyncio-runner.rst:168 +msgid "" +"To mitigate this issue, :mod:`asyncio` handles :const:`signal.SIGINT` as " +"follows:" +msgstr "为解决此问题,:mod:`asyncio` 将按以下步骤处理 :const:`signal.SIGINT`:" + +#: ../../library/asyncio-runner.rst:170 +msgid "" +":meth:`asyncio.Runner.run` installs a custom :const:`signal.SIGINT` handler " +"before any user code is executed and removes it when exiting from the " +"function." +msgstr "" +":meth:`asyncio.Runner.run` 在任何用户代码被执行之前安装一个自定义的 :const:`signal.SIGINT` " +"处理器并在从该函数退出时将其移除。" + +#: ../../library/asyncio-runner.rst:172 +msgid "" +"The :class:`~asyncio.Runner` creates the main task for the passed coroutine " +"for its execution." +msgstr ":class:`~asyncio.Runner` 为所传入的协程创建主任务供其执行。" + +#: ../../library/asyncio-runner.rst:174 +msgid "" +"When :const:`signal.SIGINT` is raised by :kbd:`Ctrl-C`, the custom signal " +"handler cancels the main task by calling :meth:`asyncio.Task.cancel` which " +"raises :exc:`asyncio.CancelledError` inside the main task. This causes the " +"Python stack to unwind, ``try/except`` and ``try/finally`` blocks can be " +"used for resource cleanup. After the main task is cancelled, " +":meth:`asyncio.Runner.run` raises :exc:`KeyboardInterrupt`." +msgstr "" +"当 :const:`signal.SIGINT` 被 :kbd:`Ctrl-C` 引发时,自定义的信号处理器将通过调用 " +":meth:`asyncio.Task.cancel` 在主任务内部引发 :exc:`asyncio.CancelledError` 来取消主任务。 " +"这将导致 Python 栈回退,``try/except`` 和 ``try/finally`` 代码块可被用于资源清理。 " +"在主任务被取消之后,:meth:`asyncio.Runner.run` 将引发 :exc:`KeyboardInterrupt`。" + +#: ../../library/asyncio-runner.rst:180 +msgid "" +"A user could write a tight loop which cannot be interrupted by " +":meth:`asyncio.Task.cancel`, in which case the second following " +":kbd:`Ctrl-C` immediately raises the :exc:`KeyboardInterrupt` without " +"cancelling the main task." +msgstr "" +"用户可以编写无法通过 :meth:`asyncio.Task.cancel` 来中断的紧密循环,在这种情况下后续的第二次 :kbd:`Ctrl-C` " +"将立即引发 :exc:`KeyboardInterrupt` 而不会取消主任务。" diff --git a/library/asyncio-stream.po b/library/asyncio-stream.po new file mode 100644 index 0000000000..f4e3518be3 --- /dev/null +++ b/library/asyncio-stream.po @@ -0,0 +1,843 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/asyncio-stream.rst:7 +msgid "Streams" +msgstr "流" + +#: ../../library/asyncio-stream.rst:9 +msgid "**Source code:** :source:`Lib/asyncio/streams.py`" +msgstr "**源码:** :source:`Lib/asyncio/streams.py`" + +#: ../../library/asyncio-stream.rst:13 +msgid "" +"Streams are high-level async/await-ready primitives to work with network " +"connections. Streams allow sending and receiving data without using " +"callbacks or low-level protocols and transports." +msgstr "流是用于处理网络连接的支持 async/await 的高层级原语。流允许发送和接收数据,而不需要使用回调或低级协议和传输。" + +#: ../../library/asyncio-stream.rst:19 +msgid "" +"Here is an example of a TCP echo client written using asyncio streams::" +msgstr "下面是一个使用 asyncio streams 编写的 TCP echo 客户端示例::" + +#: ../../library/asyncio-stream.rst:22 ../../library/asyncio-stream.rst:441 +msgid "" +"import asyncio\n" +"\n" +"async def tcp_echo_client(message):\n" +" reader, writer = await asyncio.open_connection(\n" +" '127.0.0.1', 8888)\n" +"\n" +" print(f'Send: {message!r}')\n" +" writer.write(message.encode())\n" +" await writer.drain()\n" +"\n" +" data = await reader.read(100)\n" +" print(f'Received: {data.decode()!r}')\n" +"\n" +" print('Close the connection')\n" +" writer.close()\n" +" await writer.wait_closed()\n" +"\n" +"asyncio.run(tcp_echo_client('Hello World!'))" +msgstr "" +"import asyncio\n" +"\n" +"async def tcp_echo_client(message):\n" +" reader, writer = await asyncio.open_connection(\n" +" '127.0.0.1', 8888)\n" +"\n" +" print(f'Send: {message!r}')\n" +" writer.write(message.encode())\n" +" await writer.drain()\n" +"\n" +" data = await reader.read(100)\n" +" print(f'Received: {data.decode()!r}')\n" +"\n" +" print('Close the connection')\n" +" writer.close()\n" +" await writer.wait_closed()\n" +"\n" +"asyncio.run(tcp_echo_client('Hello World!'))" + +#: ../../library/asyncio-stream.rst:42 +msgid "See also the `Examples`_ section below." +msgstr "参见下面的 `Examples`_ 部分。" + +#: ../../library/asyncio-stream.rst:46 +msgid "Stream Functions" +msgstr "Stream 函数" + +#: ../../library/asyncio-stream.rst:47 +msgid "" +"The following top-level asyncio functions can be used to create and work " +"with streams:" +msgstr "下面的高级 asyncio 函数可以用来创建和处理流:" + +#: ../../library/asyncio-stream.rst:59 +msgid "" +"Establish a network connection and return a pair of ``(reader, writer)`` " +"objects." +msgstr "建立网络连接并返回一对 ``(reader, writer)`` 对象。" + +#: ../../library/asyncio-stream.rst:62 +msgid "" +"The returned *reader* and *writer* objects are instances of " +":class:`StreamReader` and :class:`StreamWriter` classes." +msgstr "" +"返回的 *reader* 和 *writer* 对象是 :class:`StreamReader` 和 :class:`StreamWriter` " +"类的实例。" + +#: ../../library/asyncio-stream.rst:65 ../../library/asyncio-stream.rst:112 +msgid "" +"*limit* determines the buffer size limit used by the returned " +":class:`StreamReader` instance. By default the *limit* is set to 64 KiB." +msgstr "" +"*limit* 确定返回的 :class:`StreamReader` 实例使用的缓冲区大小限制。默认情况下,*limit* 设置为 64 KiB。" + +#: ../../library/asyncio-stream.rst:69 +msgid "" +"The rest of the arguments are passed directly to " +":meth:`loop.create_connection`." +msgstr "其余的参数直接传递到 :meth:`loop.create_connection`。" + +#: ../../library/asyncio-stream.rst:74 ../../library/asyncio-stream.rst:154 +msgid "" +"The *sock* argument transfers ownership of the socket to the " +":class:`StreamWriter` created. To close the socket, call its " +":meth:`~asyncio.StreamWriter.close` method." +msgstr "" +"*sock* 参数可将套接字的所有权转给所创建的 :class:`StreamWriter`。要关闭该套接字,请调用其 " +":meth:`~asyncio.StreamWriter.close` 方法。" + +#: ../../library/asyncio-stream.rst:78 +msgid "Added the *ssl_handshake_timeout* parameter." +msgstr "添加了 *ssl_handshake_timeout* 形参。" + +#: ../../library/asyncio-stream.rst:81 +msgid "Added the *happy_eyeballs_delay* and *interleave* parameters." +msgstr "增加了 *happy_eyeballs_delay* 和 *interleave* 形参。" + +#: ../../library/asyncio-stream.rst:84 ../../library/asyncio-stream.rst:128 +#: ../../library/asyncio-stream.rst:164 ../../library/asyncio-stream.rst:199 +msgid "Removed the *loop* parameter." +msgstr "移除了 *loop* 形参。" + +#: ../../library/asyncio-stream.rst:87 ../../library/asyncio-stream.rst:131 +#: ../../library/asyncio-stream.rst:167 ../../library/asyncio-stream.rst:202 +#: ../../library/asyncio-stream.rst:408 +msgid "Added the *ssl_shutdown_timeout* parameter." +msgstr "添加了 *ssl_shutdown_timeout* 形参。" + +#: ../../library/asyncio-stream.rst:101 +msgid "Start a socket server." +msgstr "启动套接字服务。" + +#: ../../library/asyncio-stream.rst:103 +msgid "" +"The *client_connected_cb* callback is called whenever a new client " +"connection is established. It receives a ``(reader, writer)`` pair as two " +"arguments, instances of the :class:`StreamReader` and :class:`StreamWriter` " +"classes." +msgstr "" +"当一个新的客户端连接被建立时,回调函数 *client_connected_cb* 会被调用。该函数会接收到一对参数 ``(reader, " +"writer)``,reader 是类 :class:`StreamReader` 的实例,而 writer 是类 " +":class:`StreamWriter` 的实例。" + +#: ../../library/asyncio-stream.rst:108 +msgid "" +"*client_connected_cb* can be a plain callable or a :ref:`coroutine function " +"`; if it is a coroutine function, it will be automatically " +"scheduled as a :class:`Task`." +msgstr "" +"*client_connected_cb* 既可以是普通的可调用对象也可以是一个 :ref:`协程函数 `; " +"如果它是一个协程函数,它将自动作为 :class:`Task` 被调度。" + +#: ../../library/asyncio-stream.rst:116 +msgid "" +"The rest of the arguments are passed directly to :meth:`loop.create_server`." +msgstr "余下的参数将会直接传递给 :meth:`loop.create_server`." + +#: ../../library/asyncio-stream.rst:121 ../../library/asyncio-stream.rst:189 +msgid "" +"The *sock* argument transfers ownership of the socket to the server created." +" To close the socket, call the server's :meth:`~asyncio.Server.close` " +"method." +msgstr "" +"*sock* 参数可将套接字的所有权转给所创建的服务器。要关闭该套接字,请调用服务器的 :meth:`~asyncio.Server.close` " +"方法。" + +#: ../../library/asyncio-stream.rst:125 +msgid "Added the *ssl_handshake_timeout* and *start_serving* parameters." +msgstr "增加了 *ssl_handshake_timeout* 和 *start_serving* 形参。" + +#: ../../library/asyncio-stream.rst:134 +msgid "Added the *keep_alive* parameter." +msgstr "增加了 *keep_alive* 形参。" + +#: ../../library/asyncio-stream.rst:139 +msgid "Unix Sockets" +msgstr "Unix 套接字" + +#: ../../library/asyncio-stream.rst:145 +msgid "" +"Establish a Unix socket connection and return a pair of ``(reader, " +"writer)``." +msgstr "建立一个 Unix 套接字连接并返回 ``(reader, writer)`` 这对返回值。" + +#: ../../library/asyncio-stream.rst:148 +msgid "Similar to :func:`open_connection` but operates on Unix sockets." +msgstr "与 :func:`open_connection` 相似,但是是在 Unix 套接字上的操作。" + +#: ../../library/asyncio-stream.rst:150 +msgid "See also the documentation of :meth:`loop.create_unix_connection`." +msgstr "请看文档 :meth:`loop.create_unix_connection`." + +#: ../../library/asyncio-stream.rst:158 ../../library/asyncio-stream.rst:193 +msgid "Availability" +msgstr "适用" + +#: ../../library/asyncio-stream.rst:160 +msgid "" +"Added the *ssl_handshake_timeout* parameter. The *path* parameter can now be" +" a :term:`path-like object`" +msgstr "" +"增加了 *ssl_handshake_timeout* 形参。现在 *path* 形参可以是一个 :term:`path-like object`" + +#: ../../library/asyncio-stream.rst:177 +msgid "Start a Unix socket server." +msgstr "启动一个 Unix 套接字服务。" + +#: ../../library/asyncio-stream.rst:179 +msgid "Similar to :func:`start_server` but works with Unix sockets." +msgstr "与 :func:`start_server` 相似,但是是在 Unix 套接字上的操作。" + +#: ../../library/asyncio-stream.rst:181 +msgid "" +"If *cleanup_socket* is true then the Unix socket will automatically be " +"removed from the filesystem when the server is closed, unless the socket has" +" been replaced after the server has been created." +msgstr "" +"如果 *cleanup_socket* 为真值那么当服务器关闭时 Unix 套接字将自动从文件系统中被移除,除非套接字在服务器创建之后被替换。" + +#: ../../library/asyncio-stream.rst:185 +msgid "See also the documentation of :meth:`loop.create_unix_server`." +msgstr "请看文档 :meth:`loop.create_unix_server`." + +#: ../../library/asyncio-stream.rst:195 +msgid "" +"Added the *ssl_handshake_timeout* and *start_serving* parameters. The *path*" +" parameter can now be a :term:`path-like object`." +msgstr "" +"增加了 *ssl_handshake_timeout* 和 *start_serving* 形参。现在 *path* 形参可以是一个 " +":term:`path-like object`." + +#: ../../library/asyncio-stream.rst:205 +msgid "Added the *cleanup_socket* parameter." +msgstr "增加了 *cleanup_socket* 形参。" + +#: ../../library/asyncio-stream.rst:210 +msgid "StreamReader" +msgstr "StreamReader" + +#: ../../library/asyncio-stream.rst:214 +msgid "" +"Represents a reader object that provides APIs to read data from the IO " +"stream. As an :term:`asynchronous iterable`, the object supports the " +":keyword:`async for` statement." +msgstr "" +"代表一个提供从 IO 流读取数据的 API 的读取器。作为一个 :term:`asynchronous iterable`,该对象支持 " +":keyword:`async for` 语句。" + +#: ../../library/asyncio-stream.rst:218 +msgid "" +"It is not recommended to instantiate *StreamReader* objects directly; use " +":func:`open_connection` and :func:`start_server` instead." +msgstr "" +"不推荐直接实例化 *StreamReader* 对象,建议使用 :func:`open_connection` 和 " +":func:`start_server` 来获取 *StreamReader* 实例。" + +#: ../../library/asyncio-stream.rst:224 +msgid "Acknowledge the EOF." +msgstr "识别 EOF。" + +#: ../../library/asyncio-stream.rst:229 +msgid "Read up to *n* bytes from the stream." +msgstr "从流读取至多 *n* 个字节。" + +#: ../../library/asyncio-stream.rst:231 +msgid "" +"If *n* is not provided or set to ``-1``, read until EOF, then return all " +"read :class:`bytes`. If EOF was received and the internal buffer is empty, " +"return an empty ``bytes`` object." +msgstr "" +"如果未提供 *n* 或是设为 ``-1``,则一直读取到 EOF,然后返回所读取的全部 :class:`bytes`。如果收到 EOF " +"并且内部缓冲区为空,则返回一个空 ``bytes`` 对象。" + +#: ../../library/asyncio-stream.rst:236 +msgid "If *n* is ``0``, return an empty ``bytes`` object immediately." +msgstr "如果 *n* 为 ``0``,则立即返回一个空 ``bytes`` 对象。" + +#: ../../library/asyncio-stream.rst:238 +msgid "" +"If *n* is positive, return at most *n* available ``bytes`` as soon as at " +"least 1 byte is available in the internal buffer. If EOF is received before " +"any byte is read, return an empty ``bytes`` object." +msgstr "" +"如果 *n* 为正值,则一旦内部缓冲区有至少 1 个字节可用就返回至多 *n* 个可用的 ``bytes``。如果在读取任何字节之前收到 " +"EOF,则返回一个空 ``bytes`` 对象。" + +#: ../../library/asyncio-stream.rst:246 +msgid "Read one line, where \"line\" is a sequence of bytes ending with ``\\n``." +msgstr "读取一行,其中“行”指的是以 ``\\n`` 结尾的字节序列。" + +#: ../../library/asyncio-stream.rst:249 +msgid "" +"If EOF is received and ``\\n`` was not found, the method returns partially " +"read data." +msgstr "如果读到 EOF 而没有找到 ``\\n``,该方法返回部分读取的数据。" + +#: ../../library/asyncio-stream.rst:252 +msgid "" +"If EOF is received and the internal buffer is empty, return an empty " +"``bytes`` object." +msgstr "如果读到 EOF,且内部缓冲区为空,则返回一个空的 ``bytes`` 对象。" + +#: ../../library/asyncio-stream.rst:258 +msgid "Read exactly *n* bytes." +msgstr "精确读取 *n* 个 bytes,不会超过也不能少于。" + +#: ../../library/asyncio-stream.rst:260 +msgid "" +"Raise an :exc:`IncompleteReadError` if EOF is reached before *n* can be " +"read. Use the :attr:`IncompleteReadError.partial` attribute to get the " +"partially read data." +msgstr "" +"如果在读取完 *n* 个 byte 之前读取到 EOF,则会引发 :exc:`IncompleteReadError` 异常。使用 " +":attr:`IncompleteReadError.partial` 属性来获取到达流结束之前读取的 bytes 字符串。" + +#: ../../library/asyncio-stream.rst:267 +msgid "Read data from the stream until *separator* is found." +msgstr "从流中读取数据直至遇到 *separator*" + +#: ../../library/asyncio-stream.rst:269 +msgid "" +"On success, the data and separator will be removed from the internal buffer " +"(consumed). Returned data will include the separator at the end." +msgstr "成功后,数据和指定的 separator 将从内部缓冲区中删除 (或者说被消费掉)。返回的数据将包括在末尾的指定 separator。" + +#: ../../library/asyncio-stream.rst:273 +msgid "" +"If the amount of data read exceeds the configured stream limit, a " +":exc:`LimitOverrunError` exception is raised, and the data is left in the " +"internal buffer and can be read again." +msgstr "如果读取的数据量超过了配置的流限制,将引发 :exc:`LimitOverrunError` 异常,数据将留在内部缓冲区中并可以再次读取。" + +#: ../../library/asyncio-stream.rst:277 +msgid "" +"If EOF is reached before the complete separator is found, an " +":exc:`IncompleteReadError` exception is raised, and the internal buffer is " +"reset. The :attr:`IncompleteReadError.partial` attribute may contain a " +"portion of the separator." +msgstr "" +"如果在找到完整的 separator 之前到达 EOF,则会引发 :exc:`IncompleteReadError` 异常,并重置内部缓冲区。 " +":attr:`IncompleteReadError.partial` 属性可能包含指定 separator 的一部分。" + +#: ../../library/asyncio-stream.rst:282 +msgid "" +"The *separator* may also be a tuple of separators. In this case the return " +"value will be the shortest possible that has any separator as the suffix. " +"For the purposes of :exc:`LimitOverrunError`, the shortest possible " +"separator is considered to be the one that matched." +msgstr "" +"*separator* 也可以是由分隔符组成的元组。在这种情况下返回值将为以任意分隔符为后缀的最短可能值。对于 " +":exc:`LimitOverrunError` 来说,分隔符的最短可能值将被认为是匹配的值。" + +#: ../../library/asyncio-stream.rst:292 +msgid "The *separator* parameter may now be a :class:`tuple` of separators." +msgstr "现在 *separator* 形参可以是由分隔符组成的 :class:`tuple`。" + +#: ../../library/asyncio-stream.rst:297 +msgid "" +"Return ``True`` if the buffer is empty and :meth:`feed_eof` was called." +msgstr "如果缓冲区为空并且 :meth:`feed_eof` 被调用,则返回 ``True``。" + +#: ../../library/asyncio-stream.rst:302 +msgid "StreamWriter" +msgstr "StreamWriter" + +#: ../../library/asyncio-stream.rst:306 +msgid "" +"Represents a writer object that provides APIs to write data to the IO " +"stream." +msgstr "这个类表示一个写入器对象,该对象提供 API 以便于写数据至 IO 流中。" + +#: ../../library/asyncio-stream.rst:309 +msgid "" +"It is not recommended to instantiate *StreamWriter* objects directly; use " +":func:`open_connection` and :func:`start_server` instead." +msgstr "" +"不建议直接实例化 *StreamWriter*;而应改用 :func:`open_connection` 和 :func:`start_server`。" + +#: ../../library/asyncio-stream.rst:315 +msgid "" +"The method attempts to write the *data* to the underlying socket " +"immediately. If that fails, the data is queued in an internal write buffer " +"until it can be sent." +msgstr "此方法会尝试立即将 *data* 写入到下层的套接字。如果写入失败,数据会被排入内部写缓冲队列直到可以被发送。" + +#: ../../library/asyncio-stream.rst:319 +msgid "" +"The *data* buffer should be a bytes, bytearray, or C-contiguous one-" +"dimensional memoryview object." +msgstr "*data* 缓冲区应为字节串、字节数组或 C 连续的一维内存视图对象。" + +#: ../../library/asyncio-stream.rst:322 ../../library/asyncio-stream.rst:335 +msgid "The method should be used along with the ``drain()`` method::" +msgstr "此方法应当与 ``drain()`` 方法一起使用::" + +#: ../../library/asyncio-stream.rst:324 +msgid "" +"stream.write(data)\n" +"await stream.drain()" +msgstr "" +"stream.write(data)\n" +"await stream.drain()" + +#: ../../library/asyncio-stream.rst:330 +msgid "" +"The method writes a list (or any iterable) of bytes to the underlying socket" +" immediately. If that fails, the data is queued in an internal write buffer " +"until it can be sent." +msgstr "此方法会立即尝试将一个字节串列表(或任何可迭代对象)写入到下层的套接字。如果写入失败,数据会被排入内部写缓冲队列直到可以被发送。" + +#: ../../library/asyncio-stream.rst:337 +msgid "" +"stream.writelines(lines)\n" +"await stream.drain()" +msgstr "" +"stream.writelines(lines)\n" +"await stream.drain()" + +#: ../../library/asyncio-stream.rst:342 +msgid "The method closes the stream and the underlying socket." +msgstr "此方法会关闭流以及下层的套接字。" + +#: ../../library/asyncio-stream.rst:344 +msgid "" +"The method should be used, though not mandatory, along with the " +"``wait_closed()`` method::" +msgstr "此方法应当与 ``wait_closed()`` 方法一起使用,但这并非强制要求::" + +#: ../../library/asyncio-stream.rst:347 +msgid "" +"stream.close()\n" +"await stream.wait_closed()" +msgstr "" +"stream.close()\n" +"await stream.wait_closed()" + +#: ../../library/asyncio-stream.rst:352 +msgid "" +"Return ``True`` if the underlying transport supports the :meth:`write_eof` " +"method, ``False`` otherwise." +msgstr "如果下层的传输支持 :meth:`write_eof` 方法则返回 ``True``,否则返回 ``False``。" + +#: ../../library/asyncio-stream.rst:357 +msgid "" +"Close the write end of the stream after the buffered write data is flushed." +msgstr "在已缓冲的写入数据被刷新后关闭流的写入端。" + +#: ../../library/asyncio-stream.rst:362 +msgid "Return the underlying asyncio transport." +msgstr "返回下层的 asyncio 传输。" + +#: ../../library/asyncio-stream.rst:366 +msgid "" +"Access optional transport information; see " +":meth:`BaseTransport.get_extra_info` for details." +msgstr "访问可选的传输信息;详情参见 :meth:`BaseTransport.get_extra_info`。" + +#: ../../library/asyncio-stream.rst:372 +msgid "" +"Wait until it is appropriate to resume writing to the stream. Example::" +msgstr "等待直到可以适当地恢复写入到流。示例::" + +#: ../../library/asyncio-stream.rst:375 +msgid "" +"writer.write(data)\n" +"await writer.drain()" +msgstr "" +"writer.write(data)\n" +"await writer.drain()" + +#: ../../library/asyncio-stream.rst:378 +msgid "" +"This is a flow control method that interacts with the underlying IO write " +"buffer. When the size of the buffer reaches the high watermark, *drain()* " +"blocks until the size of the buffer is drained down to the low watermark and" +" writing can be resumed. When there is nothing to wait for, the " +":meth:`drain` returns immediately." +msgstr "" +"这是一个与下层的 IO 写缓冲区进行交互的流程控制方法。当缓冲区大小达到最高水位(最大上限)时,*drain()* " +"会阻塞直到缓冲区大小减少至最低水位以便恢复写入。当没有要等待的数据时,:meth:`drain` 会立即返回。" + +#: ../../library/asyncio-stream.rst:389 +msgid "Upgrade an existing stream-based connection to TLS." +msgstr "将现有基于流的连接升级到 TLS。" + +#: ../../library/asyncio-stream.rst:391 +msgid "Parameters:" +msgstr "参数:" + +#: ../../library/asyncio-stream.rst:393 +msgid "*sslcontext*: a configured instance of :class:`~ssl.SSLContext`." +msgstr "*sslcontext* :一个已经配置好的 :class:`~ssl.SSLContext` 实例。" + +#: ../../library/asyncio-stream.rst:395 +msgid "" +"*server_hostname*: sets or overrides the host name that the target server's " +"certificate will be matched against." +msgstr "*server_hostname* :设置或者覆盖目标服务器证书中相对应的主机名。" + +#: ../../library/asyncio-stream.rst:398 +msgid "" +"*ssl_handshake_timeout* is the time in seconds to wait for the TLS handshake" +" to complete before aborting the connection. ``60.0`` seconds if ``None`` " +"(default)." +msgstr "" +"*ssl_handshake_timeout* 是在放弃连接之前要等待 TLS 握手完成的秒数。如为 ``None`` (默认值) 则使用 " +"``60.0``。" + +#: ../../library/asyncio-stream.rst:402 +msgid "" +"*ssl_shutdown_timeout* is the time in seconds to wait for the SSL shutdown " +"to complete before aborting the connection. ``30.0`` seconds if ``None`` " +"(default)." +msgstr "" +"*ssl_shutdown_timeout* 是在放弃连接之前要等待 SSL 关闭完成的秒数。如为 ``None`` (默认值) 则使用 " +"``30.0``。" + +#: ../../library/asyncio-stream.rst:414 +msgid "" +"Return ``True`` if the stream is closed or in the process of being closed." +msgstr "如果流已被关闭或正在被关闭则返回 ``True``。" + +#: ../../library/asyncio-stream.rst:422 +msgid "Wait until the stream is closed." +msgstr "等待直到流被关闭。" + +#: ../../library/asyncio-stream.rst:424 +msgid "" +"Should be called after :meth:`close` to wait until the underlying connection" +" is closed, ensuring that all data has been flushed before e.g. exiting the " +"program." +msgstr "应当在 :meth:`close` 之后调用以等待直到下层连接被关闭,确保所有数据在退出程序之前已刷新。" + +#: ../../library/asyncio-stream.rst:432 +msgid "Examples" +msgstr "例子" + +#: ../../library/asyncio-stream.rst:437 +msgid "TCP echo client using streams" +msgstr "使用流的 TCP 回显客户端" + +#: ../../library/asyncio-stream.rst:439 +msgid "TCP echo client using the :func:`asyncio.open_connection` function::" +msgstr "使用 :func:`asyncio.open_connection` 函数的 TCP 回显客户端::" + +#: ../../library/asyncio-stream.rst:463 +msgid "" +"The :ref:`TCP echo client protocol " +"` example uses the low-level " +":meth:`loop.create_connection` method." +msgstr "" +"使用低层级 :meth:`loop.create_connection` 方法的 :ref:`TCP 回显客户端协议 " +"` 示例。" + +#: ../../library/asyncio-stream.rst:470 +msgid "TCP echo server using streams" +msgstr "使用流的 TCP 回显服务器" + +#: ../../library/asyncio-stream.rst:472 +msgid "TCP echo server using the :func:`asyncio.start_server` function::" +msgstr "TCP 回显服务器使用 :func:`asyncio.start_server` 函数::" + +#: ../../library/asyncio-stream.rst:474 +msgid "" +"import asyncio\n" +"\n" +"async def handle_echo(reader, writer):\n" +" data = await reader.read(100)\n" +" message = data.decode()\n" +" addr = writer.get_extra_info('peername')\n" +"\n" +" print(f\"Received {message!r} from {addr!r}\")\n" +"\n" +" print(f\"Send: {message!r}\")\n" +" writer.write(data)\n" +" await writer.drain()\n" +"\n" +" print(\"Close the connection\")\n" +" writer.close()\n" +" await writer.wait_closed()\n" +"\n" +"async def main():\n" +" server = await asyncio.start_server(\n" +" handle_echo, '127.0.0.1', 8888)\n" +"\n" +" addrs = ', '.join(str(sock.getsockname()) for sock in server.sockets)\n" +" print(f'Serving on {addrs}')\n" +"\n" +" async with server:\n" +" await server.serve_forever()\n" +"\n" +"asyncio.run(main())" +msgstr "" +"import asyncio\n" +"\n" +"async def handle_echo(reader, writer):\n" +" data = await reader.read(100)\n" +" message = data.decode()\n" +" addr = writer.get_extra_info('peername')\n" +"\n" +" print(f\"Received {message!r} from {addr!r}\")\n" +"\n" +" print(f\"Send: {message!r}\")\n" +" writer.write(data)\n" +" await writer.drain()\n" +"\n" +" print(\"Close the connection\")\n" +" writer.close()\n" +" await writer.wait_closed()\n" +"\n" +"async def main():\n" +" server = await asyncio.start_server(\n" +" handle_echo, '127.0.0.1', 8888)\n" +"\n" +" addrs = ', '.join(str(sock.getsockname()) for sock in server.sockets)\n" +" print(f'Serving on {addrs}')\n" +"\n" +" async with server:\n" +" await server.serve_forever()\n" +"\n" +"asyncio.run(main())" + +#: ../../library/asyncio-stream.rst:506 +msgid "" +"The :ref:`TCP echo server protocol " +"` example uses the " +":meth:`loop.create_server` method." +msgstr "" +"使用 :meth:`loop.create_server` 方法的 :ref:`TCP 回显服务器协议 " +"` 示例。" + +#: ../../library/asyncio-stream.rst:511 +msgid "Get HTTP headers" +msgstr "获取 HTTP 标头" + +#: ../../library/asyncio-stream.rst:513 +msgid "" +"Simple example querying HTTP headers of the URL passed on the command line::" +msgstr "查询命令行传入 URL 的 HTTP 标头的简单示例::" + +#: ../../library/asyncio-stream.rst:515 +msgid "" +"import asyncio\n" +"import urllib.parse\n" +"import sys\n" +"\n" +"async def print_http_headers(url):\n" +" url = urllib.parse.urlsplit(url)\n" +" if url.scheme == 'https':\n" +" reader, writer = await asyncio.open_connection(\n" +" url.hostname, 443, ssl=True)\n" +" else:\n" +" reader, writer = await asyncio.open_connection(\n" +" url.hostname, 80)\n" +"\n" +" query = (\n" +" f\"HEAD {url.path or '/'} HTTP/1.0\\r\\n\"\n" +" f\"Host: {url.hostname}\\r\\n\"\n" +" f\"\\r\\n\"\n" +" )\n" +"\n" +" writer.write(query.encode('latin-1'))\n" +" while True:\n" +" line = await reader.readline()\n" +" if not line:\n" +" break\n" +"\n" +" line = line.decode('latin1').rstrip()\n" +" if line:\n" +" print(f'HTTP header> {line}')\n" +"\n" +" # Ignore the body, close the socket\n" +" writer.close()\n" +" await writer.wait_closed()\n" +"\n" +"url = sys.argv[1]\n" +"asyncio.run(print_http_headers(url))" +msgstr "" +"import asyncio\n" +"import urllib.parse\n" +"import sys\n" +"\n" +"async def print_http_headers(url):\n" +" url = urllib.parse.urlsplit(url)\n" +" if url.scheme == 'https':\n" +" reader, writer = await asyncio.open_connection(\n" +" url.hostname, 443, ssl=True)\n" +" else:\n" +" reader, writer = await asyncio.open_connection(\n" +" url.hostname, 80)\n" +"\n" +" query = (\n" +" f\"HEAD {url.path or '/'} HTTP/1.0\\r\\n\"\n" +" f\"Host: {url.hostname}\\r\\n\"\n" +" f\"\\r\\n\"\n" +" )\n" +"\n" +" writer.write(query.encode('latin-1'))\n" +" while True:\n" +" line = await reader.readline()\n" +" if not line:\n" +" break\n" +"\n" +" line = line.decode('latin1').rstrip()\n" +" if line:\n" +" print(f'HTTP header> {line}')\n" +"\n" +" # Ignore the body, close the socket\n" +" writer.close()\n" +" await writer.wait_closed()\n" +"\n" +"url = sys.argv[1]\n" +"asyncio.run(print_http_headers(url))" + +#: ../../library/asyncio-stream.rst:552 +msgid "Usage::" +msgstr "用法::" + +#: ../../library/asyncio-stream.rst:554 +msgid "python example.py http://example.com/path/page.html" +msgstr "python example.py http://example.com/path/page.html" + +#: ../../library/asyncio-stream.rst:556 +msgid "or with HTTPS::" +msgstr "或使用 HTTPS::" + +#: ../../library/asyncio-stream.rst:558 +msgid "python example.py https://example.com/path/page.html" +msgstr "python example.py https://example.com/path/page.html" + +#: ../../library/asyncio-stream.rst:564 +msgid "Register an open socket to wait for data using streams" +msgstr "注册一个打开的套接字以等待使用流的数据" + +#: ../../library/asyncio-stream.rst:566 +msgid "" +"Coroutine waiting until a socket receives data using the " +":func:`open_connection` function::" +msgstr "使用 :func:`open_connection` 函数实现等待直到套接字接收到数据的协程::" + +#: ../../library/asyncio-stream.rst:569 +msgid "" +"import asyncio\n" +"import socket\n" +"\n" +"async def wait_for_data():\n" +" # Get a reference to the current event loop because\n" +" # we want to access low-level APIs.\n" +" loop = asyncio.get_running_loop()\n" +"\n" +" # Create a pair of connected sockets.\n" +" rsock, wsock = socket.socketpair()\n" +"\n" +" # Register the open socket to wait for data.\n" +" reader, writer = await asyncio.open_connection(sock=rsock)\n" +"\n" +" # Simulate the reception of data from the network\n" +" loop.call_soon(wsock.send, 'abc'.encode())\n" +"\n" +" # Wait for data\n" +" data = await reader.read(100)\n" +"\n" +" # Got data, we are done: close the socket\n" +" print(\"Received:\", data.decode())\n" +" writer.close()\n" +" await writer.wait_closed()\n" +"\n" +" # Close the second socket\n" +" wsock.close()\n" +"\n" +"asyncio.run(wait_for_data())" +msgstr "" +"import asyncio\n" +"import socket\n" +"\n" +"async def wait_for_data():\n" +" # 获取一个指向当前事件循环的引用\n" +" # 因为我们想要访问低层级的 API。\n" +" loop = asyncio.get_running_loop()\n" +"\n" +" # 创建一对已连接的套接字。\n" +" rsock, wsock = socket.socketpair()\n" +"\n" +" # 注册打开的套接字以等待数据。\n" +" reader, writer = await asyncio.open_connection(sock=rsock)\n" +"\n" +" # 模拟从网络接收数据\n" +" loop.call_soon(wsock.send, 'abc'.encode())\n" +"\n" +" # 等待数据\n" +" data = await reader.read(100)\n" +"\n" +" # 获得数据,我们已完成:关闭套接字\n" +" print(\"Received:\", data.decode())\n" +" writer.close()\n" +" await writer.wait_closed()\n" +"\n" +" # 关闭第二个套接字\n" +" wsock.close()\n" +"\n" +"asyncio.run(wait_for_data())" + +#: ../../library/asyncio-stream.rst:601 +msgid "" +"The :ref:`register an open socket to wait for data using a protocol " +"` example uses a low-level protocol and " +"the :meth:`loop.create_connection` method." +msgstr "" +"使用低层级协议以及 :meth:`loop.create_connection` 方法的 :ref:`注册一个打开的套接字以等待使用协议的数据 " +"` 示例。" + +#: ../../library/asyncio-stream.rst:605 +msgid "" +"The :ref:`watch a file descriptor for read events " +"` example uses the low-level " +":meth:`loop.add_reader` method to watch a file descriptor." +msgstr "" +"使用低层级的 :meth:`loop.add_reader` 方法来监视文件描述符的 :ref:`监视文件描述符以读取事件 " +"` 示例。" diff --git a/library/asyncio-subprocess.po b/library/asyncio-subprocess.po new file mode 100644 index 0000000000..dab63e32f0 --- /dev/null +++ b/library/asyncio-subprocess.po @@ -0,0 +1,628 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/asyncio-subprocess.rst:7 +msgid "Subprocesses" +msgstr "子进程" + +#: ../../library/asyncio-subprocess.rst:9 +msgid "" +"**Source code:** :source:`Lib/asyncio/subprocess.py`, " +":source:`Lib/asyncio/base_subprocess.py`" +msgstr "" +"**源代码:** :source:`Lib/asyncio/subprocess.py`, " +":source:`Lib/asyncio/base_subprocess.py`" + +#: ../../library/asyncio-subprocess.rst:14 +msgid "" +"This section describes high-level async/await asyncio APIs to create and " +"manage subprocesses." +msgstr "本节介绍了用于创建和管理子进程的高层级 async/await asyncio API。" + +#: ../../library/asyncio-subprocess.rst:19 +msgid "" +"Here's an example of how asyncio can run a shell command and obtain its " +"result::" +msgstr "下面的例子演示了如何用 asyncio 运行一个 shell 命令并获取其结果::" + +#: ../../library/asyncio-subprocess.rst:22 +msgid "" +"import asyncio\n" +"\n" +"async def run(cmd):\n" +" proc = await asyncio.create_subprocess_shell(\n" +" cmd,\n" +" stdout=asyncio.subprocess.PIPE,\n" +" stderr=asyncio.subprocess.PIPE)\n" +"\n" +" stdout, stderr = await proc.communicate()\n" +"\n" +" print(f'[{cmd!r} exited with {proc.returncode}]')\n" +" if stdout:\n" +" print(f'[stdout]\\n{stdout.decode()}')\n" +" if stderr:\n" +" print(f'[stderr]\\n{stderr.decode()}')\n" +"\n" +"asyncio.run(run('ls /zzz'))" +msgstr "" +"import asyncio\n" +"\n" +"async def run(cmd):\n" +" proc = await asyncio.create_subprocess_shell(\n" +" cmd,\n" +" stdout=asyncio.subprocess.PIPE,\n" +" stderr=asyncio.subprocess.PIPE)\n" +"\n" +" stdout, stderr = await proc.communicate()\n" +"\n" +" print(f'[{cmd!r} exited with {proc.returncode}]')\n" +" if stdout:\n" +" print(f'[stdout]\\n{stdout.decode()}')\n" +" if stderr:\n" +" print(f'[stderr]\\n{stderr.decode()}')\n" +"\n" +"asyncio.run(run('ls /zzz'))" + +#: ../../library/asyncio-subprocess.rst:40 +msgid "will print::" +msgstr "将打印::" + +#: ../../library/asyncio-subprocess.rst:42 +msgid "" +"['ls /zzz' exited with 1]\n" +"[stderr]\n" +"ls: /zzz: No such file or directory" +msgstr "" +"['ls /zzz' exited with 1]\n" +"[stderr]\n" +"ls: /zzz: No such file or directory" + +#: ../../library/asyncio-subprocess.rst:46 +msgid "" +"Because all asyncio subprocess functions are asynchronous and asyncio " +"provides many tools to work with such functions, it is easy to execute and " +"monitor multiple subprocesses in parallel. It is indeed trivial to modify " +"the above example to run several commands simultaneously::" +msgstr "" +"由于所有 asyncio 子进程函数都是异步的并且 asyncio 提供了许多工具用来配合这些函数使用,因此并行地执行和监视多个子进程十分容易。 " +"要修改上面的例子来同时运行多个命令确实是非常简单的::" + +#: ../../library/asyncio-subprocess.rst:51 +msgid "" +"async def main():\n" +" await asyncio.gather(\n" +" run('ls /zzz'),\n" +" run('sleep 1; echo \"hello\"'))\n" +"\n" +"asyncio.run(main())" +msgstr "" +"async def main():\n" +" await asyncio.gather(\n" +" run('ls /zzz'),\n" +" run('sleep 1; echo \"hello\"'))\n" +"\n" +"asyncio.run(main())" + +#: ../../library/asyncio-subprocess.rst:58 +msgid "See also the `Examples`_ subsection." +msgstr "另请参阅 `Examples`_ 小节。" + +#: ../../library/asyncio-subprocess.rst:62 +msgid "Creating Subprocesses" +msgstr "创建子进程" + +#: ../../library/asyncio-subprocess.rst:68 +msgid "Create a subprocess." +msgstr "创建一个子进程。" + +#: ../../library/asyncio-subprocess.rst:70 +#: ../../library/asyncio-subprocess.rst:92 +msgid "" +"The *limit* argument sets the buffer limit for :class:`StreamReader` " +"wrappers for :attr:`~asyncio.subprocess.Process.stdout` and " +":attr:`~asyncio.subprocess.Process.stderr` (if :const:`subprocess.PIPE` is " +"passed to *stdout* and *stderr* arguments)." +msgstr "" +"*limit* 参数为 :attr:`~asyncio.subprocess.Process.stdout` 和 " +":attr:`~asyncio.subprocess.Process.stderr` 设置 :class:`StreamReader` " +"包装器的缓冲区上限(如果将 :const:`subprocess.PIPE` 传给 *stdout* 和 *stderr* 参数)。" + +#: ../../library/asyncio-subprocess.rst:74 +#: ../../library/asyncio-subprocess.rst:96 +msgid "Return a :class:`~asyncio.subprocess.Process` instance." +msgstr "返回一个 :class:`~asyncio.subprocess.Process` 实例。" + +#: ../../library/asyncio-subprocess.rst:76 +msgid "" +"See the documentation of :meth:`loop.subprocess_exec` for other parameters." +msgstr "有关其他形参的说明请查阅 :meth:`loop.subprocess_exec` 的文档。" + +#: ../../library/asyncio-subprocess.rst:79 +#: ../../library/asyncio-subprocess.rst:101 +msgid "" +"If the process object is garbage collected while the process is still " +"running, the child process will be killed." +msgstr "如果当进程仍在运行时进程对象被作为垃圾回收,则将杀掉子进程。" + +#: ../../library/asyncio-subprocess.rst:82 +#: ../../library/asyncio-subprocess.rst:113 +msgid "Removed the *loop* parameter." +msgstr "移除了 *loop* 形参。" + +#: ../../library/asyncio-subprocess.rst:90 +msgid "Run the *cmd* shell command." +msgstr "运行 *cmd* shell 命令。" + +#: ../../library/asyncio-subprocess.rst:98 +msgid "" +"See the documentation of :meth:`loop.subprocess_shell` for other parameters." +msgstr "有关其他形参的说明请查阅 :meth:`loop.subprocess_shell` 的文档。" + +#: ../../library/asyncio-subprocess.rst:106 +msgid "" +"It is the application's responsibility to ensure that all whitespace and " +"special characters are quoted appropriately to avoid `shell injection " +"`_ " +"vulnerabilities. The :func:`shlex.quote` function can be used to properly " +"escape whitespace and special shell characters in strings that are going to " +"be used to construct shell commands." +msgstr "" +"应用程序要负责确保正确地转义所有空白字符和特殊字符以防止 `shell 注入 " +"`_ 漏洞。 " +":func:`shlex.quote` 函数可以被用来正确地转义字符串中可以被用来构造 shell 命令的空白字符和特殊 shell 字符。" + +#: ../../library/asyncio-subprocess.rst:118 +msgid "" +"Subprocesses are available for Windows if a :class:`ProactorEventLoop` is " +"used. See :ref:`Subprocess Support on Windows ` " +"for details." +msgstr "" +"如果使用了 :class:`ProactorEventLoop` 则子进程将在 Windows 中可用。详情参见 :ref:`Windows " +"上的子进程支持 `。" + +#: ../../library/asyncio-subprocess.rst:124 +msgid "" +"asyncio also has the following *low-level* APIs to work with subprocesses: " +":meth:`loop.subprocess_exec`, :meth:`loop.subprocess_shell`, " +":meth:`loop.connect_read_pipe`, :meth:`loop.connect_write_pipe`, as well as " +"the :ref:`Subprocess Transports ` and " +":ref:`Subprocess Protocols `." +msgstr "" +"asyncio 还有下列 *低层级* API 可配合子进程使用::meth:`loop.subprocess_exec`, " +":meth:`loop.subprocess_shell`, :meth:`loop.connect_read_pipe`, " +":meth:`loop.connect_write_pipe` 以及 :ref:`子进程传输 ` 和 :ref:`子进程协议 `。" + +#: ../../library/asyncio-subprocess.rst:132 +msgid "Constants" +msgstr "常量" + +#: ../../library/asyncio-subprocess.rst:137 +msgid "Can be passed to the *stdin*, *stdout* or *stderr* parameters." +msgstr "可以被传递给 *stdin*, *stdout* 或 *stderr* 形参。" + +#: ../../library/asyncio-subprocess.rst:139 +msgid "" +"If *PIPE* is passed to *stdin* argument, the :attr:`Process.stdin " +"` attribute will point to a " +":class:`~asyncio.StreamWriter` instance." +msgstr "" +"如果将 *PIPE* 传给 *stdin* 参数,则 :attr:`Process.stdin " +"` 属性将指向一个 :class:`~asyncio.StreamWriter` " +"实例。" + +#: ../../library/asyncio-subprocess.rst:143 +msgid "" +"If *PIPE* is passed to *stdout* or *stderr* arguments, the " +":attr:`Process.stdout ` and " +":attr:`Process.stderr ` attributes will " +"point to :class:`~asyncio.StreamReader` instances." +msgstr "" +"如果将 *PIPE* 传给 *stdout* 或 *stderr* 参数,则 :attr:`Process.stdout " +"` 和 :attr:`Process.stderr " +"` 属性将指向 :class:`~asyncio.StreamReader` " +"实例。" + +#: ../../library/asyncio-subprocess.rst:151 +msgid "" +"Special value that can be used as the *stderr* argument and indicates that " +"standard error should be redirected into standard output." +msgstr "可以用作 *stderr* 参数的特殊值,表示标准错误应当被重定向到标准输出。" + +#: ../../library/asyncio-subprocess.rst:157 +msgid "" +"Special value that can be used as the *stdin*, *stdout* or *stderr* argument" +" to process creation functions. It indicates that the special file " +":data:`os.devnull` will be used for the corresponding subprocess stream." +msgstr "" +"可以用作进程创建函数的 *stdin*, *stdout* 或 *stderr* 参数的特殊值。它表示将为相应的子进程流使用特殊文件 " +":data:`os.devnull`." + +#: ../../library/asyncio-subprocess.rst:163 +msgid "Interacting with Subprocesses" +msgstr "与子进程交互" + +#: ../../library/asyncio-subprocess.rst:165 +msgid "" +"Both :func:`create_subprocess_exec` and :func:`create_subprocess_shell` " +"functions return instances of the *Process* class. *Process* is a high-" +"level wrapper that allows communicating with subprocesses and watching for " +"their completion." +msgstr "" +":func:`create_subprocess_exec` 和 :func:`create_subprocess_shell` 函数都返回 " +"*Process* 类的实例。 *Process* 是一个高层级包装器,它允许与子进程通信并监视其完成情况。" + +#: ../../library/asyncio-subprocess.rst:173 +msgid "" +"An object that wraps OS processes created by the " +":func:`~asyncio.create_subprocess_exec` and " +":func:`~asyncio.create_subprocess_shell` functions." +msgstr "" +"一个用于包装由 :func:`~asyncio.create_subprocess_exec` 和 " +":func:`~asyncio.create_subprocess_shell` 函数创建的 OS 进程的对象。" + +#: ../../library/asyncio-subprocess.rst:177 +msgid "" +"This class is designed to have a similar API to the " +":class:`subprocess.Popen` class, but there are some notable differences:" +msgstr "这个类被设计为具有与 :class:`subprocess.Popen` 类相似的 API,但两者有一些重要的差异:" + +#: ../../library/asyncio-subprocess.rst:181 +msgid "" +"unlike Popen, Process instances do not have an equivalent to the " +":meth:`~subprocess.Popen.poll` method;" +msgstr "不同于 Popen,Process 实例没有与 :meth:`~subprocess.Popen.poll` 方法等价的方法;" + +#: ../../library/asyncio-subprocess.rst:184 +msgid "" +"the :meth:`~asyncio.subprocess.Process.communicate` and " +":meth:`~asyncio.subprocess.Process.wait` methods don't have a *timeout* " +"parameter: use the :func:`~asyncio.wait_for` function;" +msgstr "" +":meth:`~asyncio.subprocess.Process.communicate` 和 " +":meth:`~asyncio.subprocess.Process.wait` 方法没有 *timeout* 形参:请使用 " +":func:`~asyncio.wait_for` 函数;" + +#: ../../library/asyncio-subprocess.rst:188 +msgid "" +"the :meth:`Process.wait() ` method is " +"asynchronous, whereas :meth:`subprocess.Popen.wait` method is implemented as" +" a blocking busy loop;" +msgstr "" +":meth:`Process.wait() ` 方法是异步的,而 " +":meth:`subprocess.Popen.wait` 方法则被实现为阻塞型忙循环;" + +#: ../../library/asyncio-subprocess.rst:192 +msgid "the *universal_newlines* parameter is not supported." +msgstr "*universal_newlines* 形参不被支持。" + +#: ../../library/asyncio-subprocess.rst:194 +msgid "This class is :ref:`not thread safe `." +msgstr "这个类 :ref:`不是线程安全的 `。" + +#: ../../library/asyncio-subprocess.rst:196 +msgid "" +"See also the :ref:`Subprocess and Threads ` " +"section." +msgstr "请参阅 :ref:`子进程和线程 ` 部分。" + +#: ../../library/asyncio-subprocess.rst:202 +msgid "Wait for the child process to terminate." +msgstr "等待子进程终结。" + +#: ../../library/asyncio-subprocess.rst:204 +msgid "Set and return the :attr:`returncode` attribute." +msgstr "设置并返回 :attr:`returncode` 属性。" + +#: ../../library/asyncio-subprocess.rst:208 +msgid "" +"This method can deadlock when using ``stdout=PIPE`` or ``stderr=PIPE`` and " +"the child process generates so much output that it blocks waiting for the OS" +" pipe buffer to accept more data. Use the :meth:`communicate` method when " +"using pipes to avoid this condition." +msgstr "" +"当使用 ``stdout=PIPE`` 或 ``stderr=PIPE`` 并且子进程产生了足以阻塞 OS " +"管道缓冲区等待接收更多的数据的输出时,此方法会发生死锁。当使用管道时请使用 :meth:`communicate` 方法来避免这种情况。" + +#: ../../library/asyncio-subprocess.rst:217 +msgid "Interact with process:" +msgstr "与进程交互:" + +#: ../../library/asyncio-subprocess.rst:219 +msgid "send data to *stdin* (if *input* is not ``None``);" +msgstr "发送数据到 *stdin* (如果 *input* 不为 ``None``);" + +#: ../../library/asyncio-subprocess.rst:220 +msgid "closes *stdin*;" +msgstr "关闭 *stdin*;" + +#: ../../library/asyncio-subprocess.rst:221 +msgid "read data from *stdout* and *stderr*, until EOF is reached;" +msgstr "从 *stdout* 和 *stderr* 读取数据,直至到达 EOF;" + +#: ../../library/asyncio-subprocess.rst:222 +msgid "wait for process to terminate." +msgstr "等待进程终结。" + +#: ../../library/asyncio-subprocess.rst:224 +msgid "" +"The optional *input* argument is the data (:class:`bytes` object) that will " +"be sent to the child process." +msgstr "可选的 *input* 参数为将被发送到子进程的数据 (:class:`bytes` 对象)。" + +#: ../../library/asyncio-subprocess.rst:227 +msgid "Return a tuple ``(stdout_data, stderr_data)``." +msgstr "返回一个元组 ``(stdout_data, stderr_data)``。" + +#: ../../library/asyncio-subprocess.rst:229 +msgid "" +"If either :exc:`BrokenPipeError` or :exc:`ConnectionResetError` exception is" +" raised when writing *input* into *stdin*, the exception is ignored. This " +"condition occurs when the process exits before all data are written into " +"*stdin*." +msgstr "" +"如果在将 *input* 写入到 *stdin* 时引发了 :exc:`BrokenPipeError` 或 " +":exc:`ConnectionResetError` 异常,异常会被忽略。此条件会在进程先于所有数据被写入到 *stdin* 之前退出时发生。" + +#: ../../library/asyncio-subprocess.rst:234 +msgid "" +"If it is desired to send data to the process' *stdin*, the process needs to " +"be created with ``stdin=PIPE``. Similarly, to get anything other than " +"``None`` in the result tuple, the process has to be created with " +"``stdout=PIPE`` and/or ``stderr=PIPE`` arguments." +msgstr "" +"如果想要将数据发送到进程的 *stdin*,则创建进程时必须使用 ``stdin=PIPE``。类似地,要在结果元组中获得任何不为 ``None`` " +"的值,则创建进程时必须使用 ``stdout=PIPE`` 和/或 ``stderr=PIPE`` 参数。" + +#: ../../library/asyncio-subprocess.rst:240 +msgid "" +"Note, that the data read is buffered in memory, so do not use this method if" +" the data size is large or unlimited." +msgstr "注意,数据读取在内存中是带缓冲的,因此如果数据量过大或不受限则不要使用此方法。" + +#: ../../library/asyncio-subprocess.rst:245 +msgid "*stdin* gets closed when ``input=None`` too." +msgstr "*stdin* 在 ``input=None`` 时也会被关闭。" + +#: ../../library/asyncio-subprocess.rst:249 +msgid "Sends the signal *signal* to the child process." +msgstr "将信号 *signal* 发送给子进程。" + +#: ../../library/asyncio-subprocess.rst:253 +msgid "" +"On Windows, :py:const:`~signal.SIGTERM` is an alias for :meth:`terminate`. " +"``CTRL_C_EVENT`` and ``CTRL_BREAK_EVENT`` can be sent to processes started " +"with a *creationflags* parameter which includes " +"``CREATE_NEW_PROCESS_GROUP``." +msgstr "" +"在 Windows 上,:py:const:`~signal.SIGTERM` 是 :meth:`terminate` 的别名。 " +"``CTRL_C_EVENT`` 和 ``CTRL_BREAK_EVENT`` 可被发送给启动时带有 *creationflags* 形参且其中包括 " +"``CREATE_NEW_PROCESS_GROUP`` 的进程。" + +#: ../../library/asyncio-subprocess.rst:260 +msgid "Stop the child process." +msgstr "停止子进程。" + +#: ../../library/asyncio-subprocess.rst:262 +msgid "" +"On POSIX systems this method sends :py:const:`~signal.SIGTERM` to the child " +"process." +msgstr "在 POSIX 系统上此方法会发送 :py:const:`~signal.SIGTERM` 给子进程。" + +#: ../../library/asyncio-subprocess.rst:265 +msgid "" +"On Windows the Win32 API function :c:func:`!TerminateProcess` is called to " +"stop the child process." +msgstr "在 Windows 上会调用 Win32 API 函数 :c:func:`!TerminateProcess` 来停止子进程。" + +#: ../../library/asyncio-subprocess.rst:270 +msgid "Kill the child process." +msgstr "杀掉子进程。" + +#: ../../library/asyncio-subprocess.rst:272 +msgid "" +"On POSIX systems this method sends :py:data:`~signal.SIGKILL` to the child " +"process." +msgstr "在 POSIX 系统中此方法会发送 :py:data:`~signal.SIGKILL` 给子进程。" + +#: ../../library/asyncio-subprocess.rst:275 +msgid "On Windows this method is an alias for :meth:`terminate`." +msgstr "在 Windows 上此方法是 :meth:`terminate` 的别名。" + +#: ../../library/asyncio-subprocess.rst:279 +msgid "" +"Standard input stream (:class:`~asyncio.StreamWriter`) or ``None`` if the " +"process was created with ``stdin=None``." +msgstr "" +"标准输入流 (:class:`~asyncio.StreamWriter`) 或者如果进程创建时设置了 ``stdin=None`` 则为 " +"``None``." + +#: ../../library/asyncio-subprocess.rst:284 +msgid "" +"Standard output stream (:class:`~asyncio.StreamReader`) or ``None`` if the " +"process was created with ``stdout=None``." +msgstr "" +"标准输出流 (:class:`~asyncio.StreamReader`) 或者如果进程创建时设置了 ``stdout=None`` 则为 " +"``None``." + +#: ../../library/asyncio-subprocess.rst:289 +msgid "" +"Standard error stream (:class:`~asyncio.StreamReader`) or ``None`` if the " +"process was created with ``stderr=None``." +msgstr "" +"标准错误流 (:class:`~asyncio.StreamReader`) 或者如果进程创建时设置了 ``stderr=None`` 则为 " +"``None``." + +#: ../../library/asyncio-subprocess.rst:294 +msgid "" +"Use the :meth:`communicate` method rather than :attr:`process.stdin.write() " +"`, :attr:`await process.stdout.read() ` or :attr:`await " +"process.stderr.read() `. This avoids deadlocks due to streams " +"pausing reading or writing and blocking the child process." +msgstr "" +"使用 :meth:`communicate` 方法而非 :attr:`process.stdin.write() `, " +":attr:`await process.stdout.read() ` 或 :attr:`await " +"process.stderr.read() `。这可以避免由于流暂停读取或写入并阻塞子进程而导致的死锁。" + +#: ../../library/asyncio-subprocess.rst:303 +msgid "Process identification number (PID)." +msgstr "进程标识号(PID)。" + +#: ../../library/asyncio-subprocess.rst:305 +msgid "" +"Note that for processes created by the " +":func:`~asyncio.create_subprocess_shell` function, this attribute is the PID" +" of the spawned shell." +msgstr "" +"请注意对于由 :func:`~asyncio.create_subprocess_shell` 函数所创建的进程,这个属性将是所生成的 shell 的 " +"PID." + +#: ../../library/asyncio-subprocess.rst:310 +msgid "Return code of the process when it exits." +msgstr "进程退出时的返回码。" + +#: ../../library/asyncio-subprocess.rst:312 +msgid "A ``None`` value indicates that the process has not terminated yet." +msgstr "``None`` 值表示进程尚未终止。" + +#: ../../library/asyncio-subprocess.rst:314 +msgid "" +"For processes created with :func:`~asyncio.create_subprocess_exec`, a " +"negative value ``-N`` indicates that the child was terminated by signal " +"``N`` (POSIX only)." +msgstr "" +"对于使用 :func:`~asyncio.create_subprocess_exec` 创建的进程,一个负值 ``-N`` 表示子进程被信号 " +"``N`` 终结(仅 POSIX)。" + +#: ../../library/asyncio-subprocess.rst:318 +msgid "" +"For processes created with :func:`~asyncio.create_subprocess_shell`, the " +"return code reflects the exit status of the shell itself (e.g. ``/bin/sh``)," +" which may map signals to codes such as ``128+N``. See the documentation of " +"the shell (for example, the Bash manual's Exit Status) for details." +msgstr "" +"对于使用 :func:`~asyncio.create_subprocess_shell` 创建的进程,返回代码反映了 shell 本身 (例如 " +"``/bin/sh``) 的退出状态,它可能会将信号映射到诸如 ``128+N`` 的代码。 详情参见 shell 的文档(例如,Bash " +"文档的退出状态说明)。" + +#: ../../library/asyncio-subprocess.rst:329 +msgid "Subprocess and Threads" +msgstr "子进程和线程" + +#: ../../library/asyncio-subprocess.rst:331 +msgid "" +"Standard asyncio event loop supports running subprocesses from different " +"threads by default." +msgstr "标准 asyncio 事件循环默认支持从不同线程中运行子进程。" + +#: ../../library/asyncio-subprocess.rst:334 +msgid "" +"On Windows subprocesses are provided by :class:`ProactorEventLoop` only " +"(default), :class:`SelectorEventLoop` has no subprocess support." +msgstr "" +"在 Windows 上子进程(默认)只由 :class:`ProactorEventLoop` " +"提供,:class:`SelectorEventLoop` 没有子进程支持。" + +#: ../../library/asyncio-subprocess.rst:337 +msgid "" +"Note that alternative event loop implementations might have own limitations;" +" please refer to their documentation." +msgstr "请注意其他的事件循环实现可能有其本身的限制;请查看它们各自的文档。" + +#: ../../library/asyncio-subprocess.rst:342 +msgid "" +"The :ref:`Concurrency and multithreading in asyncio ` section." +msgstr ":ref:`asyncio 中的并发和多线程 ` 章节。" + +#: ../../library/asyncio-subprocess.rst:347 +msgid "Examples" +msgstr "例子" + +#: ../../library/asyncio-subprocess.rst:349 +msgid "" +"An example using the :class:`~asyncio.subprocess.Process` class to control a" +" subprocess and the :class:`StreamReader` class to read from its standard " +"output." +msgstr "" +"一个使用 :class:`~asyncio.subprocess.Process` 类来控制子进程并用 :class:`StreamReader` " +"类来从其标准输出读取信息的示例。" + +#: ../../library/asyncio-subprocess.rst:355 +msgid "" +"The subprocess is created by the :func:`create_subprocess_exec` function::" +msgstr "这个子进程是由 :func:`create_subprocess_exec` 函数创建的::" + +#: ../../library/asyncio-subprocess.rst:358 +msgid "" +"import asyncio\n" +"import sys\n" +"\n" +"async def get_date():\n" +" code = 'import datetime as dt; print(dt.datetime.now())'\n" +"\n" +" # Create the subprocess; redirect the standard output\n" +" # into a pipe.\n" +" proc = await asyncio.create_subprocess_exec(\n" +" sys.executable, '-c', code,\n" +" stdout=asyncio.subprocess.PIPE)\n" +"\n" +" # Read one line of output.\n" +" data = await proc.stdout.readline()\n" +" line = data.decode('ascii').rstrip()\n" +"\n" +" # Wait for the subprocess exit.\n" +" await proc.wait()\n" +" return line\n" +"\n" +"date = asyncio.run(get_date())\n" +"print(f\"Current date: {date}\")" +msgstr "" +"import asyncio\n" +"import sys\n" +"\n" +"async def get_date():\n" +" code = 'import datetime as dt; print(dt.datetime.now())'\n" +"\n" +" # 创建子进程;重定向标准输出\n" +" # 至一个管道。\n" +" proc = await asyncio.create_subprocess_exec(\n" +" sys.executable, '-c', code,\n" +" stdout=asyncio.subprocess.PIPE)\n" +"\n" +" # 读取一行输出。\n" +" data = await proc.stdout.readline()\n" +" line = data.decode('ascii').rstrip()\n" +"\n" +" # 等待子进程退出。\n" +" await proc.wait()\n" +" return line\n" +"\n" +"date = asyncio.run(get_date())\n" +"print(f\"Current date: {date}\")" + +#: ../../library/asyncio-subprocess.rst:382 +msgid "" +"See also the :ref:`same example ` written " +"using low-level APIs." +msgstr "另请参阅使用低层级 API 编写的 :ref:`相同示例 `。" diff --git a/library/asyncio-sync.po b/library/asyncio-sync.po new file mode 100644 index 0000000000..4ecd75133b --- /dev/null +++ b/library/asyncio-sync.po @@ -0,0 +1,737 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/asyncio-sync.rst:7 +msgid "Synchronization Primitives" +msgstr "同步原语" + +#: ../../library/asyncio-sync.rst:9 +msgid "**Source code:** :source:`Lib/asyncio/locks.py`" +msgstr "**源代码:** :source:`Lib/asyncio/locks.py`" + +#: ../../library/asyncio-sync.rst:13 +msgid "" +"asyncio synchronization primitives are designed to be similar to those of " +"the :mod:`threading` module with two important caveats:" +msgstr "asyncio 同步原语被设计为与 :mod:`threading` 模块的类似,但有两个关键注意事项:" + +#: ../../library/asyncio-sync.rst:16 +msgid "" +"asyncio primitives are not thread-safe, therefore they should not be used " +"for OS thread synchronization (use :mod:`threading` for that);" +msgstr "asyncio 原语不是线程安全的,因此它们不应被用于 OS 线程同步 (而应当使用 :mod:`threading`);" + +#: ../../library/asyncio-sync.rst:20 +msgid "" +"methods of these synchronization primitives do not accept the *timeout* " +"argument; use the :func:`asyncio.wait_for` function to perform operations " +"with timeouts." +msgstr "这些同步原语的方法不接受 *timeout* 参数;请使用 :func:`asyncio.wait_for` 函数来执行带有超时的操作。" + +#: ../../library/asyncio-sync.rst:24 +msgid "asyncio has the following basic synchronization primitives:" +msgstr "asyncio 具有下列基本同步原语:" + +#: ../../library/asyncio-sync.rst:26 +msgid ":class:`Lock`" +msgstr ":class:`Lock`" + +#: ../../library/asyncio-sync.rst:27 +msgid ":class:`Event`" +msgstr ":class:`Event`" + +#: ../../library/asyncio-sync.rst:28 +msgid ":class:`Condition`" +msgstr ":class:`Condition`" + +#: ../../library/asyncio-sync.rst:29 +msgid ":class:`Semaphore`" +msgstr ":class:`Semaphore`" + +#: ../../library/asyncio-sync.rst:30 +msgid ":class:`BoundedSemaphore`" +msgstr ":class:`BoundedSemaphore`" + +#: ../../library/asyncio-sync.rst:31 +msgid ":class:`Barrier`" +msgstr ":class:`Barrier`" + +#: ../../library/asyncio-sync.rst:38 +msgid "Lock" +msgstr "Lock" + +#: ../../library/asyncio-sync.rst:42 +msgid "Implements a mutex lock for asyncio tasks. Not thread-safe." +msgstr "实现一个用于 asyncio 任务的互斥锁。非线程安全。" + +#: ../../library/asyncio-sync.rst:44 +msgid "" +"An asyncio lock can be used to guarantee exclusive access to a shared " +"resource." +msgstr "asyncio 锁可被用来保证对共享资源的独占访问。" + +#: ../../library/asyncio-sync.rst:47 +msgid "" +"The preferred way to use a Lock is an :keyword:`async with` statement::" +msgstr "使用 Lock 的推荐方式是通过 :keyword:`async with` 语句::" + +#: ../../library/asyncio-sync.rst:50 +msgid "" +"lock = asyncio.Lock()\n" +"\n" +"# ... later\n" +"async with lock:\n" +" # access shared state" +msgstr "" +"lock = asyncio.Lock()\n" +"\n" +"# ... 稍后\n" +"async with lock:\n" +" # 访问共享状态" + +#: ../../library/asyncio-sync.rst:56 ../../library/asyncio-sync.rst:201 +#: ../../library/asyncio-sync.rst:309 +msgid "which is equivalent to::" +msgstr "这等价于::" + +#: ../../library/asyncio-sync.rst:58 +msgid "" +"lock = asyncio.Lock()\n" +"\n" +"# ... later\n" +"await lock.acquire()\n" +"try:\n" +" # access shared state\n" +"finally:\n" +" lock.release()" +msgstr "" +"lock = asyncio.Lock()\n" +"\n" +"# ... 稍后\n" +"await lock.acquire()\n" +"try:\n" +" # 访问共享状态\n" +"finally:\n" +" lock.release()" + +#: ../../library/asyncio-sync.rst:67 ../../library/asyncio-sync.rst:113 +#: ../../library/asyncio-sync.rst:189 ../../library/asyncio-sync.rst:297 +#: ../../library/asyncio-sync.rst:353 +msgid "Removed the *loop* parameter." +msgstr "移除了 *loop* 形参。" + +#: ../../library/asyncio-sync.rst:73 +msgid "Acquire the lock." +msgstr "获取锁。" + +#: ../../library/asyncio-sync.rst:75 +msgid "" +"This method waits until the lock is *unlocked*, sets it to *locked* and " +"returns ``True``." +msgstr "此方法会等待直至锁为 *unlocked*,将其设为 *locked* 并返回 ``True``。" + +#: ../../library/asyncio-sync.rst:78 +msgid "" +"When more than one coroutine is blocked in :meth:`acquire` waiting for the " +"lock to be unlocked, only one coroutine eventually proceeds." +msgstr "当有一个以上的协程在 :meth:`acquire` 中被阻塞则会等待解锁,最终只有一个协程会被执行。" + +#: ../../library/asyncio-sync.rst:82 +msgid "" +"Acquiring a lock is *fair*: the coroutine that proceeds will be the first " +"coroutine that started waiting on the lock." +msgstr "锁的获取是 *公平的*: 被执行的协程将是第一个开始等待锁的协程。" + +#: ../../library/asyncio-sync.rst:87 +msgid "Release the lock." +msgstr "释放锁。" + +#: ../../library/asyncio-sync.rst:89 +msgid "When the lock is *locked*, reset it to *unlocked* and return." +msgstr "当锁为 *locked* 时,将其设为 *unlocked* 并返回。" + +#: ../../library/asyncio-sync.rst:91 +msgid "If the lock is *unlocked*, a :exc:`RuntimeError` is raised." +msgstr "如果锁为 *unlocked*,则会引发 :exc:`RuntimeError`。" + +#: ../../library/asyncio-sync.rst:95 +msgid "Return ``True`` if the lock is *locked*." +msgstr "如果锁为 *locked* 则返回 ``True``。" + +#: ../../library/asyncio-sync.rst:99 +msgid "Event" +msgstr "Event" + +#: ../../library/asyncio-sync.rst:103 +msgid "An event object. Not thread-safe." +msgstr "事件对象。该对象不是线程安全的。" + +#: ../../library/asyncio-sync.rst:105 +msgid "" +"An asyncio event can be used to notify multiple asyncio tasks that some " +"event has happened." +msgstr "asyncio 事件可被用来通知多个 asyncio 任务已经有事件发生。" + +#: ../../library/asyncio-sync.rst:108 +msgid "" +"An Event object manages an internal flag that can be set to *true* with the " +":meth:`~Event.set` method and reset to *false* with the :meth:`clear` " +"method. The :meth:`~Event.wait` method blocks until the flag is set to " +"*true*. The flag is set to *false* initially." +msgstr "" +"Event 对象会管理一个内部旗标,可通过 :meth:`~Event.set` 方法将其设为 *true* 并通过 :meth:`clear` " +"方法将其重设为 *false*。 :meth:`~Event.wait` 方法会阻塞直至该旗标被设为 *true*。该旗标初始时会被设为 " +"*false*." + +#: ../../library/asyncio-sync.rst:118 ../../library/asyncio-sync.rst:377 +msgid "Example::" +msgstr "示例::" + +#: ../../library/asyncio-sync.rst:120 +msgid "" +"async def waiter(event):\n" +" print('waiting for it ...')\n" +" await event.wait()\n" +" print('... got it!')\n" +"\n" +"async def main():\n" +" # Create an Event object.\n" +" event = asyncio.Event()\n" +"\n" +" # Spawn a Task to wait until 'event' is set.\n" +" waiter_task = asyncio.create_task(waiter(event))\n" +"\n" +" # Sleep for 1 second and set the event.\n" +" await asyncio.sleep(1)\n" +" event.set()\n" +"\n" +" # Wait until the waiter task is finished.\n" +" await waiter_task\n" +"\n" +"asyncio.run(main())" +msgstr "" +"async def waiter(event):\n" +" print('waiting for it ...')\n" +" await event.wait()\n" +" print('... got it!')\n" +"\n" +"async def main():\n" +" # 创建一个 Event 对象。\n" +" event = asyncio.Event()\n" +"\n" +" # 产生一个任务等待直到 'event' 被设置。\n" +" waiter_task = asyncio.create_task(waiter(event))\n" +"\n" +" # 休眠 1 秒钟并设置事件。\n" +" await asyncio.sleep(1)\n" +" event.set()\n" +"\n" +" # 等待直到 waiter 任务完成。\n" +" await waiter_task\n" +"\n" +"asyncio.run(main())" + +#: ../../library/asyncio-sync.rst:144 +msgid "Wait until the event is set." +msgstr "等待直至事件被设置。" + +#: ../../library/asyncio-sync.rst:146 +msgid "" +"If the event is set, return ``True`` immediately. Otherwise block until " +"another task calls :meth:`~Event.set`." +msgstr "如果事件已被设置,则立即返回 ``True``。否则将阻塞直至另一个任务调用 :meth:`~Event.set`。" + +#: ../../library/asyncio-sync.rst:151 +msgid "Set the event." +msgstr "设置事件。" + +#: ../../library/asyncio-sync.rst:153 +msgid "All tasks waiting for event to be set will be immediately awakened." +msgstr "所有等待事件被设置的任务将被立即唤醒。" + +#: ../../library/asyncio-sync.rst:158 +msgid "Clear (unset) the event." +msgstr "清空(取消设置)事件。" + +#: ../../library/asyncio-sync.rst:160 +msgid "" +"Subsequent tasks awaiting on :meth:`~Event.wait` will now block until the " +":meth:`~Event.set` method is called again." +msgstr "通过 :meth:`~Event.wait` 进行等待的持续任务现在将会阻塞直至 :meth:`~Event.set` 方法被再次调用" + +#: ../../library/asyncio-sync.rst:165 +msgid "Return ``True`` if the event is set." +msgstr "如果事件已被设置则返回 ``True``。" + +#: ../../library/asyncio-sync.rst:169 +msgid "Condition" +msgstr "Condition" + +#: ../../library/asyncio-sync.rst:173 +msgid "A Condition object. Not thread-safe." +msgstr "条件对象。该对象不是线程安全的。" + +#: ../../library/asyncio-sync.rst:175 +msgid "" +"An asyncio condition primitive can be used by a task to wait for some event " +"to happen and then get exclusive access to a shared resource." +msgstr "asyncio 条件原语可被任务用于等待某个事件发生,然后获取对共享资源的独占访问。" + +#: ../../library/asyncio-sync.rst:179 +msgid "" +"In essence, a Condition object combines the functionality of an " +":class:`Event` and a :class:`Lock`. It is possible to have multiple " +"Condition objects share one Lock, which allows coordinating exclusive access" +" to a shared resource between different tasks interested in particular " +"states of that shared resource." +msgstr "" +"在本质上,Condition 对象合并了 :class:`Event` 和 :class:`Lock` 的功能。多个 Condition " +"对象有可能共享一个 Lock,这允许关注于共享资源的特定状态的不同任务实现对共享资源的协同独占访问。" + +#: ../../library/asyncio-sync.rst:185 +msgid "" +"The optional *lock* argument must be a :class:`Lock` object or ``None``. In" +" the latter case a new Lock object is created automatically." +msgstr "可选的 *lock* 参数必须为 :class:`Lock` 对象或 ``None``。在后一种情况下会自动创建一个新的 Lock 对象。" + +#: ../../library/asyncio-sync.rst:192 +msgid "" +"The preferred way to use a Condition is an :keyword:`async with` statement::" +msgstr "使用 Condition 的推荐方式是通过 :keyword:`async with` 语句::" + +#: ../../library/asyncio-sync.rst:195 +msgid "" +"cond = asyncio.Condition()\n" +"\n" +"# ... later\n" +"async with cond:\n" +" await cond.wait()" +msgstr "" +"cond = asyncio.Condition()\n" +"\n" +"# ... 稍后\n" +"async with cond:\n" +" await cond.wait()" + +#: ../../library/asyncio-sync.rst:203 +msgid "" +"cond = asyncio.Condition()\n" +"\n" +"# ... later\n" +"await cond.acquire()\n" +"try:\n" +" await cond.wait()\n" +"finally:\n" +" cond.release()" +msgstr "" +"cond = asyncio.Condition()\n" +"\n" +"# ... 稍后\n" +"await cond.acquire()\n" +"try:\n" +" await cond.wait()\n" +"finally:\n" +" cond.release()" + +#: ../../library/asyncio-sync.rst:215 +msgid "Acquire the underlying lock." +msgstr "获取下层的锁。" + +#: ../../library/asyncio-sync.rst:217 +msgid "" +"This method waits until the underlying lock is *unlocked*, sets it to " +"*locked* and returns ``True``." +msgstr "此方法会等待直至下层的锁为 *unlocked*,将其设为 *locked* 并返回 ``True``。" + +#: ../../library/asyncio-sync.rst:222 +msgid "" +"Wake up *n* tasks (1 by default) waiting on this condition. If fewer than " +"*n* tasks are waiting they are all awakened." +msgstr "唤醒正在等待此条件的 *n* 个任务(默认 1 个)。如果正在等待的任务少于 *n* 个则它们都将被唤醒。" + +#: ../../library/asyncio-sync.rst:225 ../../library/asyncio-sync.rst:240 +msgid "" +"The lock must be acquired before this method is called and released shortly " +"after. If called with an *unlocked* lock a :exc:`RuntimeError` error is " +"raised." +msgstr "" +"锁必须在此方法被调用前被获取并在随后被快速释放。如果通过一个 *unlocked* 锁调用则会引发 :exc:`RuntimeError`。" + +#: ../../library/asyncio-sync.rst:231 +msgid "Return ``True`` if the underlying lock is acquired." +msgstr "如果下层的锁已被获取则返回 ``True``。" + +#: ../../library/asyncio-sync.rst:235 +msgid "Wake up all tasks waiting on this condition." +msgstr "唤醒所有正在等待此条件的任务。" + +#: ../../library/asyncio-sync.rst:237 +msgid "This method acts like :meth:`notify`, but wakes up all waiting tasks." +msgstr "此方法的行为类似于 :meth:`notify`,但会唤醒所有正在等待的任务。" + +#: ../../library/asyncio-sync.rst:246 +msgid "Release the underlying lock." +msgstr "释放下层的锁。" + +#: ../../library/asyncio-sync.rst:248 +msgid "When invoked on an unlocked lock, a :exc:`RuntimeError` is raised." +msgstr "当在未锁定的锁上唤起时,会引发 :exc:`RuntimeError`。" + +#: ../../library/asyncio-sync.rst:254 +msgid "Wait until notified." +msgstr "等待直至收到通知。" + +#: ../../library/asyncio-sync.rst:256 +msgid "" +"If the calling task has not acquired the lock when this method is called, a " +":exc:`RuntimeError` is raised." +msgstr "当此方法被调用时如果调用方任务未获得锁,则会引发 :exc:`RuntimeError`。" + +#: ../../library/asyncio-sync.rst:259 +msgid "" +"This method releases the underlying lock, and then blocks until it is " +"awakened by a :meth:`notify` or :meth:`notify_all` call. Once awakened, the " +"Condition re-acquires its lock and this method returns ``True``." +msgstr "" +"这个方法会释放下层的锁,然后保持阻塞直到被 :meth:`notify` 或 :meth:`notify_all` 调用所唤醒。 " +"一旦被唤醒,Condition 会重新获取它的锁并且此方法将返回 ``True``。" + +#: ../../library/asyncio-sync.rst:264 +msgid "" +"Note that a task *may* return from this call spuriously, which is why the " +"caller should always re-check the state and be prepared to " +":meth:`~Condition.wait` again. For this reason, you may prefer to use " +":meth:`~Condition.wait_for` instead." +msgstr "" +"请注意一个任务 *有可能* 虚假地从此调用返回,这就是为什么调用者总是应当重新检查状态并准备好再次执行 :meth:`~Condition.wait`。" +" 出于此理由,你可能会倾向于改用 :meth:`~Condition.wait_for`。" + +#: ../../library/asyncio-sync.rst:272 +msgid "Wait until a predicate becomes *true*." +msgstr "等待直到目标值变为 *true*。" + +#: ../../library/asyncio-sync.rst:274 +msgid "" +"The predicate must be a callable which result will be interpreted as a " +"boolean value. The method will repeatedly :meth:`~Condition.wait` until the" +" predicate evaluates to *true*. The final value is the return value." +msgstr "" +"目标必须为一个可调用对象,其结果将被解读为一个布尔值。此方法将重复地执行 :meth:`~Condition.wait` 直到目标被求值为 *真*。 " +"最终的值将被作为返回值。" + +#: ../../library/asyncio-sync.rst:281 +msgid "Semaphore" +msgstr "Semaphore" + +#: ../../library/asyncio-sync.rst:285 +msgid "A Semaphore object. Not thread-safe." +msgstr "信号量对象。该对象不是线程安全的。" + +#: ../../library/asyncio-sync.rst:287 +msgid "" +"A semaphore manages an internal counter which is decremented by each " +":meth:`acquire` call and incremented by each :meth:`release` call. The " +"counter can never go below zero; when :meth:`acquire` finds that it is zero," +" it blocks, waiting until some task calls :meth:`release`." +msgstr "" +"信号量会管理一个内部计数器,该计数器会随每次 :meth:`acquire` 调用递减并随每次 :meth:`release` 调用递增。 " +"计数器的值永远不会降到零以下;当 :meth:`acquire` 发现其值为零时,它将保持阻塞直到有某个任务调用了 :meth:`release`。" + +#: ../../library/asyncio-sync.rst:293 +msgid "" +"The optional *value* argument gives the initial value for the internal " +"counter (``1`` by default). If the given value is less than ``0`` a " +":exc:`ValueError` is raised." +msgstr "" +"可选的 *value* 参数用来为内部计数器赋初始值 (默认值为 ``1``)。如果给定的值小于 ``0`` 则会引发 " +":exc:`ValueError`." + +#: ../../library/asyncio-sync.rst:300 +msgid "" +"The preferred way to use a Semaphore is an :keyword:`async with` statement::" +msgstr "使用 Semaphore 的推荐方式是通过 :keyword:`async with` 语句::" + +#: ../../library/asyncio-sync.rst:303 +msgid "" +"sem = asyncio.Semaphore(10)\n" +"\n" +"# ... later\n" +"async with sem:\n" +" # work with shared resource" +msgstr "" +"sem = asyncio.Semaphore(10)\n" +"\n" +"# ... 稍后\n" +"async with sem:\n" +" # 操作共享的资源" + +#: ../../library/asyncio-sync.rst:311 +msgid "" +"sem = asyncio.Semaphore(10)\n" +"\n" +"# ... later\n" +"await sem.acquire()\n" +"try:\n" +" # work with shared resource\n" +"finally:\n" +" sem.release()" +msgstr "" +"sem = asyncio.Semaphore(10)\n" +"\n" +"# ... 稍后\n" +"await sem.acquire()\n" +"try:\n" +" # 操作共享的资源\n" +"finally:\n" +" sem.release()" + +#: ../../library/asyncio-sync.rst:323 +msgid "Acquire a semaphore." +msgstr "获取一个信号量。" + +#: ../../library/asyncio-sync.rst:325 +msgid "" +"If the internal counter is greater than zero, decrement it by one and return" +" ``True`` immediately. If it is zero, wait until a :meth:`release` is " +"called and return ``True``." +msgstr "" +"如果内部计数器的值大于零,则将其减一并立即返回 ``True``。如果其值为零,则会等待直到 :meth:`release` 被调用并返回 " +"``True``." + +#: ../../library/asyncio-sync.rst:331 +msgid "Returns ``True`` if semaphore can not be acquired immediately." +msgstr "如果信号量对象无法被立即获取则返回 ``True``。" + +#: ../../library/asyncio-sync.rst:335 +msgid "" +"Release a semaphore, incrementing the internal counter by one. Can wake up a" +" task waiting to acquire the semaphore." +msgstr "释放一个信号量对象,将内部计数器的值加一。可以唤醒一个正在等待获取信号量对象的任务。" + +#: ../../library/asyncio-sync.rst:338 +msgid "" +"Unlike :class:`BoundedSemaphore`, :class:`Semaphore` allows making more " +"``release()`` calls than ``acquire()`` calls." +msgstr "" +"不同于 :class:`BoundedSemaphore`,:class:`Semaphore` 允许执行的 ``release()`` 调用多于 " +"``acquire()`` 调用。" + +#: ../../library/asyncio-sync.rst:343 +msgid "BoundedSemaphore" +msgstr "BoundedSemaphore" + +#: ../../library/asyncio-sync.rst:347 +msgid "A bounded semaphore object. Not thread-safe." +msgstr "有界信号量对象。该对象不是线程安全的。" + +#: ../../library/asyncio-sync.rst:349 +msgid "" +"Bounded Semaphore is a version of :class:`Semaphore` that raises a " +":exc:`ValueError` in :meth:`~Semaphore.release` if it increases the internal" +" counter above the initial *value*." +msgstr "" +"BoundedSemaphore 是特殊版本的 :class:`Semaphore`,如果在 :meth:`~Semaphore.release` " +"中内部计数器值增加到初始 *value* 以上它将引发一个 :exc:`ValueError`。" + +#: ../../library/asyncio-sync.rst:358 +msgid "Barrier" +msgstr "Barrier" + +#: ../../library/asyncio-sync.rst:362 +msgid "A barrier object. Not thread-safe." +msgstr "屏障对象。该对象不是线程安全的。" + +#: ../../library/asyncio-sync.rst:364 +msgid "" +"A barrier is a simple synchronization primitive that allows to block until " +"*parties* number of tasks are waiting on it. Tasks can wait on the " +":meth:`~Barrier.wait` method and would be blocked until the specified number" +" of tasks end up waiting on :meth:`~Barrier.wait`. At that point all of the " +"waiting tasks would unblock simultaneously." +msgstr "" +"屏障是一个允许阻塞直到 *parties* 个任务在其上等待的简单同步原语。任务可以在 :meth:`~Barrier.wait` " +"方法上等待并将被阻塞直到有指定数量的任务在 :meth:`~Barrier.wait` 上等待。在那时所有正在等待的任务将同时撤销阻塞。" + +#: ../../library/asyncio-sync.rst:370 +msgid "" +":keyword:`async with` can be used as an alternative to awaiting on " +":meth:`~Barrier.wait`." +msgstr ":keyword:`async with` 可以被用作在 :meth:`~Barrier.wait` 上等待的替代。" + +#: ../../library/asyncio-sync.rst:373 +msgid "The barrier can be reused any number of times." +msgstr "屏障可被重复使用任意次数。" + +#: ../../library/asyncio-sync.rst:379 +msgid "" +"async def example_barrier():\n" +" # barrier with 3 parties\n" +" b = asyncio.Barrier(3)\n" +"\n" +" # create 2 new waiting tasks\n" +" asyncio.create_task(b.wait())\n" +" asyncio.create_task(b.wait())\n" +"\n" +" await asyncio.sleep(0)\n" +" print(b)\n" +"\n" +" # The third .wait() call passes the barrier\n" +" await b.wait()\n" +" print(b)\n" +" print(\"barrier passed\")\n" +"\n" +" await asyncio.sleep(0)\n" +" print(b)\n" +"\n" +"asyncio.run(example_barrier())" +msgstr "" +"async def example_barrier():\n" +" # 包含三部分的屏障\n" +" b = asyncio.Barrier(3)\n" +"\n" +" # 新建 2 个等待任务\n" +" asyncio.create_task(b.wait())\n" +" asyncio.create_task(b.wait())\n" +"\n" +" await asyncio.sleep(0)\n" +" print(b)\n" +"\n" +" # 第三个 .wait() 调用通过屏障\n" +" await b.wait()\n" +" print(b)\n" +" print(\"barrier passed\")\n" +"\n" +" await asyncio.sleep(0)\n" +" print(b)\n" +"\n" +"asyncio.run(example_barrier())" + +#: ../../library/asyncio-sync.rst:400 +msgid "Result of this example is::" +msgstr "该示例的结果为::" + +#: ../../library/asyncio-sync.rst:402 +msgid "" +"\n" +"\n" +"barrier passed\n" +"" +msgstr "" +"\n" +"\n" +"barrier passed\n" +"" + +#: ../../library/asyncio-sync.rst:412 +msgid "" +"Pass the barrier. When all the tasks party to the barrier have called this " +"function, they are all unblocked simultaneously." +msgstr "穿过屏障。当屏障汇集的所有任务都调用了此函数时,它们将被同时撤销阻塞。" + +#: ../../library/asyncio-sync.rst:415 +msgid "" +"When a waiting or blocked task in the barrier is cancelled, this task exits " +"the barrier which stays in the same state. If the state of the barrier is " +"\"filling\", the number of waiting task decreases by 1." +msgstr "当该屏障中等待或阻塞的任务被取消时,此任务将退出屏障而屏障将保持相同状态。如果屏障的状态为 \"正在填充\",则等待的任务数量将减 1。" + +#: ../../library/asyncio-sync.rst:420 +msgid "" +"The return value is an integer in the range of 0 to ``parties-1``, different" +" for each task. This can be used to select a task to do some special " +"housekeeping, e.g.::" +msgstr "" +"返回值是一个 0 到 ``parties-1`` 之间的整数,对于每个任务来说各不相同。这可被用来选择一个任务以执行某些特别的操作。例如::" + +#: ../../library/asyncio-sync.rst:424 +msgid "" +"...\n" +"async with barrier as position:\n" +" if position == 0:\n" +" # Only one task prints this\n" +" print('End of *draining phase*')" +msgstr "" +"...\n" +"async with barrier as position:\n" +" if position == 0:\n" +" # 只有一个任务会打印此内容\n" +" print('End of *draining phase*')" + +#: ../../library/asyncio-sync.rst:430 +msgid "" +"This method may raise a :class:`BrokenBarrierError` exception if the barrier" +" is broken or reset while a task is waiting. It could raise a " +":exc:`CancelledError` if a task is cancelled." +msgstr "" +"如果屏障在有任务在等待时已被破坏或重置则此方法可能会引发 :class:`BrokenBarrierError`。如果有任务被取消则它可能会引发 " +":exc:`CancelledError`." + +#: ../../library/asyncio-sync.rst:437 +msgid "" +"Return the barrier to the default, empty state. Any tasks waiting on it " +"will receive the :class:`BrokenBarrierError` exception." +msgstr "将屏障返回为默认的空白状态。任何正在其上等待的任务将会接收到 :class:`BrokenBarrierError` 异常。" + +#: ../../library/asyncio-sync.rst:440 +msgid "" +"If a barrier is broken it may be better to just leave it and create a new " +"one." +msgstr "如果屏障已被破坏则最好的是让其保持原状并创建一个新的屏障。" + +#: ../../library/asyncio-sync.rst:445 +msgid "" +"Put the barrier into a broken state. This causes any active or future calls" +" to :meth:`~Barrier.wait` to fail with the :class:`BrokenBarrierError`. Use " +"this for example if one of the tasks needs to abort, to avoid infinite " +"waiting tasks." +msgstr "" +"将屏障置为已破坏状态。这会导致任何已激活或未来对 :meth:`~Barrier.wait` 的调用失败并引发 " +":class:`BrokenBarrierError`。例如可以在需要中止某个任务时使用此方法,以避免无限等待任务。" + +#: ../../library/asyncio-sync.rst:452 +msgid "The number of tasks required to pass the barrier." +msgstr "通过该屏障所需的任务数量。" + +#: ../../library/asyncio-sync.rst:456 +msgid "The number of tasks currently waiting in the barrier while filling." +msgstr "当执行填充时正在屏障中等待的任务的数量。" + +#: ../../library/asyncio-sync.rst:460 +msgid "A boolean that is ``True`` if the barrier is in the broken state." +msgstr "一个布尔值,值为 ``True`` 表明屏障为破损状态。" + +#: ../../library/asyncio-sync.rst:465 +msgid "" +"This exception, a subclass of :exc:`RuntimeError`, is raised when the " +":class:`Barrier` object is reset or broken." +msgstr "该异常是 :exc:`RuntimeError` 的子类,当 :class:`Barrier` 对象被重置或破坏时被引发。" + +#: ../../library/asyncio-sync.rst:473 +msgid "" +"Acquiring a lock using ``await lock`` or ``yield from lock`` and/or " +":keyword:`with` statement (``with await lock``, ``with (yield from lock)``) " +"was removed. Use ``async with lock`` instead." +msgstr "" +"使用 ``await lock`` 或 ``yield from lock`` 以及/或者 :keyword:`with` 语句 (``with " +"await lock``, ``with (yield from lock)``) 来获取锁的操作已被移除。请改用 ``async with " +"lock``." diff --git a/library/asyncio-task.po b/library/asyncio-task.po new file mode 100644 index 0000000000..384ec05c3c --- /dev/null +++ b/library/asyncio-task.po @@ -0,0 +1,2497 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Silver Teal, 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:00+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/asyncio-task.rst:6 +msgid "Coroutines and tasks" +msgstr "协程与任务" + +#: ../../library/asyncio-task.rst:8 +msgid "" +"This section outlines high-level asyncio APIs to work with coroutines and " +"Tasks." +msgstr "本节将简述用于协程与任务的高层级 API。" + +#: ../../library/asyncio-task.rst:19 ../../library/asyncio-task.rst:148 +msgid "Coroutines" +msgstr "协程" + +#: ../../library/asyncio-task.rst:21 +msgid "**Source code:** :source:`Lib/asyncio/coroutines.py`" +msgstr "**源码:** :source:`Lib/asyncio/coroutines.py`" + +#: ../../library/asyncio-task.rst:25 +msgid "" +":term:`Coroutines ` declared with the async/await syntax is the " +"preferred way of writing asyncio applications. For example, the following " +"snippet of code prints \"hello\", waits 1 second, and then prints " +"\"world\"::" +msgstr "" +"通过 async/await 语法来声明 :term:`协程 ` 是编写 asyncio 应用的推荐方式。例如,以下代码段会打印 " +"\"hello\",等待 1 秒,再打印 \"world\"::" + +#: ../../library/asyncio-task.rst:30 +msgid "" +">>> import asyncio\n" +"\n" +">>> async def main():\n" +"... print('hello')\n" +"... await asyncio.sleep(1)\n" +"... print('world')\n" +"\n" +">>> asyncio.run(main())\n" +"hello\n" +"world" +msgstr "" +">>> import asyncio\n" +"\n" +">>> async def main():\n" +"... print('hello')\n" +"... await asyncio.sleep(1)\n" +"... print('world')\n" +"\n" +">>> asyncio.run(main())\n" +"hello\n" +"world" + +#: ../../library/asyncio-task.rst:41 +msgid "" +"Note that simply calling a coroutine will not schedule it to be executed::" +msgstr "注意:简单地调用一个协程并不会使其被调度执行::" + +#: ../../library/asyncio-task.rst:44 +msgid "" +">>> main()\n" +"" +msgstr "" +">>> main()\n" +"" + +#: ../../library/asyncio-task.rst:47 +msgid "" +"To actually run a coroutine, asyncio provides the following mechanisms:" +msgstr "要实际运行一个协程,asyncio 提供了以下几种机制:" + +#: ../../library/asyncio-task.rst:49 +msgid "" +"The :func:`asyncio.run` function to run the top-level entry point \"main()\"" +" function (see the above example.)" +msgstr ":func:`asyncio.run` 函数用来运行最高层级的入口点 \"main()\" 函数 (参见上面的示例。)" + +#: ../../library/asyncio-task.rst:52 +msgid "" +"Awaiting on a coroutine. The following snippet of code will print \"hello\"" +" after waiting for 1 second, and then print \"world\" after waiting for " +"*another* 2 seconds::" +msgstr "对协程执行 await。以下代码段会在等待 1 秒后打印 \"hello\",然后 *再次* 等待 2 秒后打印 \"world\"::" + +#: ../../library/asyncio-task.rst:56 +msgid "" +"import asyncio\n" +"import time\n" +"\n" +"async def say_after(delay, what):\n" +" await asyncio.sleep(delay)\n" +" print(what)\n" +"\n" +"async def main():\n" +" print(f\"started at {time.strftime('%X')}\")\n" +"\n" +" await say_after(1, 'hello')\n" +" await say_after(2, 'world')\n" +"\n" +" print(f\"finished at {time.strftime('%X')}\")\n" +"\n" +"asyncio.run(main())" +msgstr "" +"import asyncio\n" +"import time\n" +"\n" +"async def say_after(delay, what):\n" +" await asyncio.sleep(delay)\n" +" print(what)\n" +"\n" +"async def main():\n" +" print(f\"started at {time.strftime('%X')}\")\n" +"\n" +" await say_after(1, 'hello')\n" +" await say_after(2, 'world')\n" +"\n" +" print(f\"finished at {time.strftime('%X')}\")\n" +"\n" +"asyncio.run(main())" + +#: ../../library/asyncio-task.rst:73 +msgid "Expected output::" +msgstr "预期的输出::" + +#: ../../library/asyncio-task.rst:75 +msgid "" +"started at 17:13:52\n" +"hello\n" +"world\n" +"finished at 17:13:55" +msgstr "" +"started at 17:13:52\n" +"hello\n" +"world\n" +"finished at 17:13:55" + +#: ../../library/asyncio-task.rst:80 +msgid "" +"The :func:`asyncio.create_task` function to run coroutines concurrently as " +"asyncio :class:`Tasks `." +msgstr "" +":func:`asyncio.create_task` 函数用来并发运行作为 asyncio :class:`任务 ` 的多个协程。" + +#: ../../library/asyncio-task.rst:83 +msgid "" +"Let's modify the above example and run two ``say_after`` coroutines " +"*concurrently*::" +msgstr "让我们修改以上示例,*并发* 运行两个 ``say_after`` 协程::" + +#: ../../library/asyncio-task.rst:86 +msgid "" +"async def main():\n" +" task1 = asyncio.create_task(\n" +" say_after(1, 'hello'))\n" +"\n" +" task2 = asyncio.create_task(\n" +" say_after(2, 'world'))\n" +"\n" +" print(f\"started at {time.strftime('%X')}\")\n" +"\n" +" # Wait until both tasks are completed (should take\n" +" # around 2 seconds.)\n" +" await task1\n" +" await task2\n" +"\n" +" print(f\"finished at {time.strftime('%X')}\")" +msgstr "" +"async def main():\n" +" task1 = asyncio.create_task(\n" +" say_after(1, 'hello'))\n" +"\n" +" task2 = asyncio.create_task(\n" +" say_after(2, 'world'))\n" +"\n" +" print(f\"started at {time.strftime('%X')}\")\n" +"\n" +" # 等待直到两个任务都完成\n" +" # (会花费约 2 秒钟。)\n" +" await task1\n" +" await task2\n" +"\n" +" print(f\"finished at {time.strftime('%X')}\")" + +#: ../../library/asyncio-task.rst:102 +msgid "" +"Note that expected output now shows that the snippet runs 1 second faster " +"than before::" +msgstr "注意,预期的输出显示代码段的运行时间比之前快了 1 秒::" + +#: ../../library/asyncio-task.rst:105 +msgid "" +"started at 17:14:32\n" +"hello\n" +"world\n" +"finished at 17:14:34" +msgstr "" +"started at 17:14:32\n" +"hello\n" +"world\n" +"finished at 17:14:34" + +#: ../../library/asyncio-task.rst:110 +msgid "" +"The :class:`asyncio.TaskGroup` class provides a more modern alternative to " +":func:`create_task`. Using this API, the last example becomes::" +msgstr "" +":class:`asyncio.TaskGroup` 类提供了 :func:`create_task` 的更现代化的替代。使用此 " +"API,之前的例子将变为::" + +#: ../../library/asyncio-task.rst:114 +msgid "" +"async def main():\n" +" async with asyncio.TaskGroup() as tg:\n" +" task1 = tg.create_task(\n" +" say_after(1, 'hello'))\n" +"\n" +" task2 = tg.create_task(\n" +" say_after(2, 'world'))\n" +"\n" +" print(f\"started at {time.strftime('%X')}\")\n" +"\n" +" # The await is implicit when the context manager exits.\n" +"\n" +" print(f\"finished at {time.strftime('%X')}\")" +msgstr "" +"async def main():\n" +" async with asyncio.TaskGroup() as tg:\n" +" task1 = tg.create_task(\n" +" say_after(1, 'hello'))\n" +"\n" +" task2 = tg.create_task(\n" +" say_after(2, 'world'))\n" +"\n" +" print(f\"started at {time.strftime('%X')}\")\n" +"\n" +" # 当上下文管理器退出时 await 是隐式执行的。\n" +"\n" +" print(f\"finished at {time.strftime('%X')}\")" + +#: ../../library/asyncio-task.rst:128 +msgid "The timing and output should be the same as for the previous version." +msgstr "用时和输出结果应当与之前的版本相同。" + +#: ../../library/asyncio-task.rst:130 +msgid ":class:`asyncio.TaskGroup`." +msgstr ":class:`asyncio.TaskGroup`." + +#: ../../library/asyncio-task.rst:137 +msgid "Awaitables" +msgstr "可等待对象" + +#: ../../library/asyncio-task.rst:139 +msgid "" +"We say that an object is an **awaitable** object if it can be used in an " +":keyword:`await` expression. Many asyncio APIs are designed to accept " +"awaitables." +msgstr "" +"如果一个对象可以在 :keyword:`await` 语句中使用,那么它就是 **可等待** 对象。许多 asyncio API " +"都被设计为接受可等待对象。" + +#: ../../library/asyncio-task.rst:143 +msgid "" +"There are three main types of *awaitable* objects: **coroutines**, " +"**Tasks**, and **Futures**." +msgstr "*可等待* 对象有三种主要类型:**协程**, **任务** 和 **Future**." + +#: ../../library/asyncio-task.rst:149 +msgid "" +"Python coroutines are *awaitables* and therefore can be awaited from other " +"coroutines::" +msgstr "Python 协程属于 *可等待* 对象,因此可以在其他协程中被等待::" + +#: ../../library/asyncio-task.rst:152 +msgid "" +"import asyncio\n" +"\n" +"async def nested():\n" +" return 42\n" +"\n" +"async def main():\n" +" # Nothing happens if we just call \"nested()\".\n" +" # A coroutine object is created but not awaited,\n" +" # so it *won't run at all*.\n" +" nested() # will raise a \"RuntimeWarning\".\n" +"\n" +" # Let's do it differently now and await it:\n" +" print(await nested()) # will print \"42\".\n" +"\n" +"asyncio.run(main())" +msgstr "" +"import asyncio\n" +"\n" +"async def nested():\n" +" return 42\n" +"\n" +"async def main():\n" +" # 如果我们只调用 \"nested()\" 则无事发生。\n" +" # 一个协程对象被创建但是没有被等待,\n" +" # 因此它 *根本不会运行*。\n" +" nested() # 将引发 \"RuntimeWarning\"。\n" +"\n" +" # 现在让我们等待它:\n" +" print(await nested()) # 将打印 \"42\"。\n" +"\n" +"asyncio.run(main())" + +#: ../../library/asyncio-task.rst:170 +msgid "" +"In this documentation the term \"coroutine\" can be used for two closely " +"related concepts:" +msgstr "在本文档中 \"协程\" 可用来表示两个紧密关联的概念:" + +#: ../../library/asyncio-task.rst:173 +msgid "a *coroutine function*: an :keyword:`async def` function;" +msgstr "*协程函数*: 定义形式为 :keyword:`async def` 的函数;" + +#: ../../library/asyncio-task.rst:175 +msgid "" +"a *coroutine object*: an object returned by calling a *coroutine function*." +msgstr "*协程对象*: 调用 *协程函数* 所返回的对象。" + +#: ../../library/asyncio-task.rst:180 +msgid "Tasks" +msgstr "任务" + +#: ../../library/asyncio-task.rst:181 +msgid "*Tasks* are used to schedule coroutines *concurrently*." +msgstr "*任务* 被用来 *并发地* 调度协程。" + +#: ../../library/asyncio-task.rst:183 +msgid "" +"When a coroutine is wrapped into a *Task* with functions like " +":func:`asyncio.create_task` the coroutine is automatically scheduled to run " +"soon::" +msgstr "当一个协程被 :func:`asyncio.create_task` 等函数封装为一个 *任务* 时,该协程会被自动调度执行::" + +#: ../../library/asyncio-task.rst:187 +msgid "" +"import asyncio\n" +"\n" +"async def nested():\n" +" return 42\n" +"\n" +"async def main():\n" +" # Schedule nested() to run soon concurrently\n" +" # with \"main()\".\n" +" task = asyncio.create_task(nested())\n" +"\n" +" # \"task\" can now be used to cancel \"nested()\", or\n" +" # can simply be awaited to wait until it is complete:\n" +" await task\n" +"\n" +"asyncio.run(main())" +msgstr "" +"import asyncio\n" +"\n" +"async def nested():\n" +" return 42\n" +"\n" +"async def main():\n" +" # 调度 nested() 与 \"main()\" 并发运行。\n" +" task = asyncio.create_task(nested())\n" +"\n" +" # 现在可以通过 \"task\" 来取消 \"nested()\",\n" +" # 也可以等待 \"task\" 直到它被完成:\n" +" await task\n" +"\n" +"asyncio.run(main())" + +#: ../../library/asyncio-task.rst:205 +msgid "Futures" +msgstr "Futures" + +#: ../../library/asyncio-task.rst:206 +msgid "" +"A :class:`Future` is a special **low-level** awaitable object that " +"represents an **eventual result** of an asynchronous operation." +msgstr ":class:`Future` 是一种特殊的 **低层级** 可等待对象,表示一个异步操作的 **最终结果**。" + +#: ../../library/asyncio-task.rst:209 +msgid "" +"When a Future object is *awaited* it means that the coroutine will wait " +"until the Future is resolved in some other place." +msgstr "当一个 Future 对象 *被等待*,这意味着协程将保持等待直到该 Future 对象在其他地方操作完毕。" + +#: ../../library/asyncio-task.rst:212 +msgid "" +"Future objects in asyncio are needed to allow callback-based code to be used" +" with async/await." +msgstr "在 asyncio 中需要 Future 对象以便允许通过 async/await 使用基于回调的代码。" + +#: ../../library/asyncio-task.rst:215 +msgid "" +"Normally **there is no need** to create Future objects at the application " +"level code." +msgstr "通常情况下 **没有必要** 在应用层级的代码中创建 Future 对象。" + +#: ../../library/asyncio-task.rst:218 +msgid "" +"Future objects, sometimes exposed by libraries and some asyncio APIs, can be" +" awaited::" +msgstr "Future 对象有时会由库和某些 asyncio API 暴露给用户,用作可等待对象::" + +#: ../../library/asyncio-task.rst:221 +msgid "" +"async def main():\n" +" await function_that_returns_a_future_object()\n" +"\n" +" # this is also valid:\n" +" await asyncio.gather(\n" +" function_that_returns_a_future_object(),\n" +" some_python_coroutine()\n" +" )" +msgstr "" +"async def main():\n" +" await function_that_returns_a_future_object()\n" +"\n" +" # 这样也可以:\n" +" await asyncio.gather(\n" +" function_that_returns_a_future_object(),\n" +" some_python_coroutine()\n" +" )" + +#: ../../library/asyncio-task.rst:230 +msgid "" +"A good example of a low-level function that returns a Future object is " +":meth:`loop.run_in_executor`." +msgstr "一个很好的返回 Future 对象的低层级函数的示例是 :meth:`loop.run_in_executor`。" + +#: ../../library/asyncio-task.rst:235 +msgid "Creating tasks" +msgstr "创建任务" + +#: ../../library/asyncio-task.rst:237 +msgid "**Source code:** :source:`Lib/asyncio/tasks.py`" +msgstr "**源码:** :source:`Lib/asyncio/tasks.py`" + +#: ../../library/asyncio-task.rst:243 +msgid "" +"Wrap the *coro* :ref:`coroutine ` into a :class:`Task` and " +"schedule its execution. Return the Task object." +msgstr "将 *coro* :ref:`协程 ` 封装为一个 :class:`Task` 并调度其执行。返回 Task 对象。" + +#: ../../library/asyncio-task.rst:246 +msgid "" +"The full function signature is largely the same as that of the :class:`Task`" +" constructor (or factory) - all of the keyword arguments to this function " +"are passed through to that interface." +msgstr "完整函数签名与 :class:`Task` 构造器(或工厂函数)的大致相同 —— 所有传给此函数的关键字参数都会被传给该接口。" + +#: ../../library/asyncio-task.rst:250 +msgid "" +"An optional keyword-only *context* argument allows specifying a custom " +":class:`contextvars.Context` for the *coro* to run in. The current context " +"copy is created when no *context* is provided." +msgstr "" +"可选的 *context* 参数允许指定自定义的 :class:`contextvars.Context` 供 *coro* 运行。当未提供 " +"*context* 时将创建当前上下文的副本。" + +#: ../../library/asyncio-task.rst:254 +msgid "" +"An optional keyword-only *eager_start* argument allows specifying if the " +"task should execute eagerly during the call to create_task, or be scheduled " +"later. If *eager_start* is not passed the mode set by " +":meth:`loop.set_task_factory` will be used." +msgstr "" +"一个可选的仅限关键字的 *eager_start* 参数允许指定任务是应该在调用 create_task 期间主动执行,还是应稍后被调度。如果没有传递 " +"*eager_start*,则会使用 :meth:`loop.set_task_factory` 设置的模式。" + +#: ../../library/asyncio-task.rst:259 +msgid "" +"The task is executed in the loop returned by :func:`get_running_loop`, " +":exc:`RuntimeError` is raised if there is no running loop in current thread." +msgstr "" +"该任务会在 :func:`get_running_loop` 返回的循环中执行,如果当前线程没有在运行的循环则会引发 " +":exc:`RuntimeError`." + +#: ../../library/asyncio-task.rst:265 +msgid "" +":meth:`asyncio.TaskGroup.create_task` is a new alternative leveraging " +"structural concurrency; it allows for waiting for a group of related tasks " +"with strong safety guarantees." +msgstr "" +":meth:`asyncio.TaskGroup.create_task` 是一个平衡了结构化并发的新选择;它允许等待一组相关任务并具有极强的安全保证。" + +#: ../../library/asyncio-task.rst:271 +msgid "" +"Save a reference to the result of this function, to avoid a task " +"disappearing mid-execution. The event loop only keeps weak references to " +"tasks. A task that isn't referenced elsewhere may get garbage collected at " +"any time, even before it's done. For reliable \"fire-and-forget\" background" +" tasks, gather them in a collection::" +msgstr "" +"保存一个指向此函数的结果的引用,以避免任务在执行过程中消失。事件循环将只保留对任务的弱引用。 " +"未在其他地方被引用的任务可能在任何时候被作为垃圾回收,即使是在它被完成之前。如果需要可靠的“发射后不用管”后台任务,请将它们放到一个多项集中::" + +#: ../../library/asyncio-task.rst:278 +msgid "" +"background_tasks = set()\n" +"\n" +"for i in range(10):\n" +" task = asyncio.create_task(some_coro(param=i))\n" +"\n" +" # Add task to the set. This creates a strong reference.\n" +" background_tasks.add(task)\n" +"\n" +" # To prevent keeping references to finished tasks forever,\n" +" # make each task remove its own reference from the set after\n" +" # completion:\n" +" task.add_done_callback(background_tasks.discard)" +msgstr "" +"background_tasks = set()\n" +"\n" +"for i in range(10):\n" +" task = asyncio.create_task(some_coro(param=i))\n" +"\n" +" # 将任务加入集合。这将创建一个强引用。\n" +" background_tasks.add(task)\n" +"\n" +" # 为避免永远保留对已结束任务的引用,\n" +" # 让每个任务在完成后将对自己的引用\n" +" # 移出集合:\n" +" task.add_done_callback(background_tasks.discard)" + +#: ../../library/asyncio-task.rst:293 ../../library/asyncio-task.rst:1236 +msgid "Added the *name* parameter." +msgstr "增加了 *name* 形参。" + +#: ../../library/asyncio-task.rst:296 ../../library/asyncio-task.rst:1243 +msgid "Added the *context* parameter." +msgstr "增加了 *context* 形参。" + +#: ../../library/asyncio-task.rst:299 +msgid "Added the *eager_start* parameter by passing on all *kwargs*." +msgstr "通过传递所有的 *kwargs* 添加了 *eager_start* 形参。" + +#: ../../library/asyncio-task.rst:304 +msgid "Task cancellation" +msgstr "任务取消" + +#: ../../library/asyncio-task.rst:306 +msgid "" +"Tasks can easily and safely be cancelled. When a task is cancelled, " +":exc:`asyncio.CancelledError` will be raised in the task at the next " +"opportunity." +msgstr "任务可以便捷和安全地取消。当任务被取消时,:exc:`asyncio.CancelledError` 将在遇到机会时在任务中被引发。" + +#: ../../library/asyncio-task.rst:310 +msgid "" +"It is recommended that coroutines use ``try/finally`` blocks to robustly " +"perform clean-up logic. In case :exc:`asyncio.CancelledError` is explicitly " +"caught, it should generally be propagated when clean-up is complete. " +":exc:`asyncio.CancelledError` directly subclasses :exc:`BaseException` so " +"most code will not need to be aware of it." +msgstr "" +"推荐协程使用 ``try/finally`` 代码块来可靠地执行清理逻辑。对于 :exc:`asyncio.CancelledError` " +"被显式捕获的情况,它通常应当在清理完成时被传播。 :exc:`asyncio.CancelledError` 会直接子类化 " +":exc:`BaseException` 因此大多数代码都不需要关心这一点。" + +#: ../../library/asyncio-task.rst:316 +msgid "" +"The asyncio components that enable structured concurrency, like " +":class:`asyncio.TaskGroup` and :func:`asyncio.timeout`, are implemented " +"using cancellation internally and might misbehave if a coroutine swallows " +":exc:`asyncio.CancelledError`. Similarly, user code should not generally " +"call :meth:`uncancel `. However, in cases when " +"suppressing :exc:`asyncio.CancelledError` is truly desired, it is necessary " +"to also call ``uncancel()`` to completely remove the cancellation state." +msgstr "" +"启用结构化并发的 asyncio 组件,如 :class:`asyncio.TaskGroup` 和 " +":func:`asyncio.timeout`,在内部是使用撤销操作来实现的因而在协程屏蔽了 :exc:`asyncio.CancelledError`" +" 时可能无法正常工作。类似地,用户代码通常也不应调用 :meth:`uncancel `。 " +"但是,在确实想要屏蔽 :exc:`asyncio.CancelledError` 的情况下,则还有必要调用 ``uncancel()`` " +"来完全移除撤销状态。" + +#: ../../library/asyncio-task.rst:328 +msgid "Task groups" +msgstr "任务组" + +#: ../../library/asyncio-task.rst:330 +msgid "" +"Task groups combine a task creation API with a convenient and reliable way " +"to wait for all tasks in the group to finish." +msgstr "任务组合并了一套用于等待分组中所有任务完成的方便可靠方式的任务创建 API。" + +#: ../../library/asyncio-task.rst:335 +msgid "" +"An :ref:`asynchronous context manager ` holding a " +"group of tasks. Tasks can be added to the group using :meth:`create_task`. " +"All tasks are awaited when the context manager exits." +msgstr "" +"持有一个任务分组的 :ref:`异步上下文管理器 `。可以使用 :meth:`create_task` " +"将任务添加到分组中。当该上下文管理器退出时所有任务都将被等待。" + +#: ../../library/asyncio-task.rst:344 +msgid "" +"Create a task in this task group. The signature matches that of " +":func:`asyncio.create_task`. If the task group is inactive (e.g. not yet " +"entered, already finished, or in the process of shutting down), we will " +"close the given ``coro``." +msgstr "" +"在该任务组中创建一个任务。签名与 :func:`asyncio.create_task` 的签名相匹配。 " +"如果该任务组未激活(例如尚未进入、已经结束或在关闭过程中),我们将关闭所给出的 ``coro``。" + +#: ../../library/asyncio-task.rst:352 +msgid "Close the given coroutine if the task group is not active." +msgstr "如果任务组未激活则关闭所给出的协程。" + +#: ../../library/asyncio-task.rst:356 +msgid "Passes on all *kwargs* to :meth:`loop.create_task`" +msgstr "将所有的 *kwargs* 传递给 :meth:`loop.create_task`" + +#: ../../library/asyncio-task.rst:360 +msgid "" +"Cancel the task group. This is a non-exceptional, early exit of the task " +"group's lifetime -- useful once the group's goal has been met or its " +"services no longer needed." +msgstr "" + +#: ../../library/asyncio-task.rst:364 +msgid "" +":meth:`~asyncio.Task.cancel` will be called on any tasks in the group that " +"aren't yet done, as well as the parent (body) of the group. The task group " +"context manager will exit *without* :exc:`asyncio.CancelledError` being " +"raised." +msgstr "" + +#: ../../library/asyncio-task.rst:368 +msgid "" +"If :meth:`cancel` is called before entering the task group, the group will " +"be cancelled upon entry. This is useful for patterns where one piece of " +"code passes an unused :class:`asyncio.TaskGroup` instance to another in " +"order to have the ability to cancel anything run within the group." +msgstr "" + +#: ../../library/asyncio-task.rst:373 +msgid "" +":meth:`cancel` is idempotent and may be called after the task group has " +"already exited." +msgstr "" + +#: ../../library/asyncio-task.rst:376 +msgid "Some ways to use :meth:`cancel`:" +msgstr "" + +#: ../../library/asyncio-task.rst:378 +msgid "call it from the task group body based on some condition or event" +msgstr "" + +#: ../../library/asyncio-task.rst:379 +msgid "" +"pass the task group instance to child tasks via :meth:`create_task`, " +"allowing a child task to conditionally cancel the entire entire group" +msgstr "" + +#: ../../library/asyncio-task.rst:381 +msgid "" +"pass the task group instance or bound :meth:`cancel` method to some other " +"task *before* opening the task group, allowing remote cancellation" +msgstr "" + +#: ../../library/asyncio-task.rst:386 ../../library/asyncio-task.rst:546 +#: ../../library/asyncio-task.rst:719 ../../library/asyncio-task.rst:780 +#: ../../library/asyncio-task.rst:806 ../../library/asyncio-task.rst:847 +msgid "Example::" +msgstr "示例::" + +#: ../../library/asyncio-task.rst:388 +msgid "" +"async def main():\n" +" async with asyncio.TaskGroup() as tg:\n" +" task1 = tg.create_task(some_coro(...))\n" +" task2 = tg.create_task(another_coro(...))\n" +" print(f\"Both tasks have completed now: {task1.result()}, {task2.result()}\")" +msgstr "" +"async def main():\n" +" async with asyncio.TaskGroup() as tg:\n" +" task1 = tg.create_task(some_coro(...))\n" +" task2 = tg.create_task(another_coro(...))\n" +" print(f\"Both tasks have completed now: {task1.result()}, {task2.result()}\")" + +#: ../../library/asyncio-task.rst:394 +msgid "" +"The ``async with`` statement will wait for all tasks in the group to finish." +" While waiting, new tasks may still be added to the group (for example, by " +"passing ``tg`` into one of the coroutines and calling ``tg.create_task()`` " +"in that coroutine). There is also opportunity to request termination of the" +" entire task group with ``tg.cancel()``, based on some condition. Once the " +"last task has finished and the ``async with`` block is exited, no new tasks " +"may be added to the group." +msgstr "" + +#: ../../library/asyncio-task.rst:402 +msgid "" +"The first time any of the tasks belonging to the group fails with an " +"exception other than :exc:`asyncio.CancelledError`, the remaining tasks in " +"the group are cancelled. No further tasks can then be added to the group. At" +" this point, if the body of the ``async with`` statement is still active " +"(i.e., :meth:`~object.__aexit__` hasn't been called yet), the task directly " +"containing the ``async with`` statement is also cancelled. The resulting " +":exc:`asyncio.CancelledError` will interrupt an ``await``, but it will not " +"bubble out of the containing ``async with`` statement." +msgstr "" +"当首次有任何属于分组的任务因 :exc:`asyncio.CancelledError` 以外的异常而失败时,分组中的剩余任务将被取消。 " +"在此之后将无法添加更多任务到该分组中。在这种情况下,如果 ``async with`` 语句体仍然为激活状态(即 " +":meth:`~object.__aexit__` 尚未被调用),则直接包含 ``async with`` 语句的任务也会被取消。结果 " +":exc:`asyncio.CancelledError` 将中断一个 ``await``,但它将不会跳出包含的 ``async with`` 语句。" + +#: ../../library/asyncio-task.rst:412 +msgid "" +"Once all tasks have finished, if any tasks have failed with an exception " +"other than :exc:`asyncio.CancelledError`, those exceptions are combined in " +"an :exc:`ExceptionGroup` or :exc:`BaseExceptionGroup` (as appropriate; see " +"their documentation) which is then raised." +msgstr "" +"一旦所有任务被完成,如果有任何任务因 :exc:`asyncio.CancelledError` 以外的异常而失败,这些异常会被组合在 " +":exc:`ExceptionGroup` 或 :exc:`BaseExceptionGroup` 中(选择其中较适合的一个;参见其文档)并将随后引发。" + +#: ../../library/asyncio-task.rst:419 +msgid "" +"Two base exceptions are treated specially: If any task fails with " +":exc:`KeyboardInterrupt` or :exc:`SystemExit`, the task group still cancels " +"the remaining tasks and waits for them, but then the initial " +":exc:`KeyboardInterrupt` or :exc:`SystemExit` is re-raised instead of " +":exc:`ExceptionGroup` or :exc:`BaseExceptionGroup`." +msgstr "" +"两个基础异常会被特别对待:如果有任何任务因 :exc:`KeyboardInterrupt` 或 :exc:`SystemExit` " +"而失败,任务分组仍然会取消剩余的任务并等待它们,但随后初始 :exc:`KeyboardInterrupt` 或 :exc:`SystemExit` " +"而不是 :exc:`ExceptionGroup` 或 :exc:`BaseExceptionGroup` 会被重新引发。" + +#: ../../library/asyncio-task.rst:425 +msgid "" +"If the body of the ``async with`` statement exits with an exception (so " +":meth:`~object.__aexit__` is called with an exception set), this is treated " +"the same as if one of the tasks failed: the remaining tasks are cancelled " +"and then waited for, and non-cancellation exceptions are grouped into an " +"exception group and raised. The exception passed into " +":meth:`~object.__aexit__`, unless it is :exc:`asyncio.CancelledError`, is " +"also included in the exception group. The same special case is made for " +":exc:`KeyboardInterrupt` and :exc:`SystemExit` as in the previous paragraph." +msgstr "" +"如果 ``async with`` 语句体因异常而退出(这样将调用 :meth:`~object.__aexit__` " +"并附带一个异常),此种情况会与有任务失败时一样对待:剩余任务将被取消然后被等待,而非取消类异常会被加入到一个异常分组并被引发。传入到 " +":meth:`~object.__aexit__` 的异常,除了 :exc:`asyncio.CancelledError` " +"以外,也都会被包括在该异常分组中。同样的特殊对待也适用于上一段所说的 :exc:`KeyboardInterrupt` 和 " +":exc:`SystemExit`." + +#: ../../library/asyncio-task.rst:437 +msgid "" +"Task groups are careful not to mix up the internal cancellation used to " +"\"wake up\" their :meth:`~object.__aexit__` with cancellation requests for " +"the task in which they are running made by other parties. In particular, " +"when one task group is syntactically nested in another, and both experience " +"an exception in one of their child tasks simultaneously, the inner task " +"group will process its exceptions, and then the outer task group will " +"receive another cancellation and process its own exceptions." +msgstr "" +"对于任务组应当注意不要将用于“唤醒”其 :meth:`~object.__aexit__` 的内部取消请求与其他地方对其运行的任务提出的取消请求相混淆。" +" " +"具体来说,当一个任务组在语法上嵌套于另一个任务组中,而两个任务组的某个子任务同时发生异常时,内层的任务组将处理其异常,然后外层的任务组将收到另一个取消请求并处理它自己的异常。" + +#: ../../library/asyncio-task.rst:445 +msgid "" +"In the case where a task group is cancelled externally and also must raise " +"an :exc:`ExceptionGroup`, it will call the parent task's " +":meth:`~asyncio.Task.cancel` method. This ensures that a " +":exc:`asyncio.CancelledError` will be raised at the next :keyword:`await`, " +"so the cancellation is not lost." +msgstr "" +"对于任务组在外部被取消同时必须引发 :exc:`ExceptionGroup` 的情况,它将调用父任务的 " +":meth:`~asyncio.Task.cancel` 方法。这样可以确保 :exc:`asyncio.CancelledError` 会在下一次 " +":keyword:`await` 时被引发,因此取消操作不会丢失。" + +#: ../../library/asyncio-task.rst:451 +msgid "" +"Task groups preserve the cancellation count reported by " +":meth:`asyncio.Task.cancelling`." +msgstr "任务组将保留 :meth:`asyncio.Task.cancelling` 所报告的取消次数。" + +#: ../../library/asyncio-task.rst:456 +msgid "" +"Improved handling of simultaneous internal and external cancellations and " +"correct preservation of cancellation counts." +msgstr "改进了同时处理内部和外部取消操作以及正确保留取消计数的功能。" + +#: ../../library/asyncio-task.rst:460 +msgid "Sleeping" +msgstr "休眠" + +#: ../../library/asyncio-task.rst:465 +msgid "Block for *delay* seconds." +msgstr "阻塞 *delay* 指定的秒数。" + +#: ../../library/asyncio-task.rst:467 +msgid "" +"If *result* is provided, it is returned to the caller when the coroutine " +"completes." +msgstr "如果指定了 *result*,则当协程完成时将其返回给调用者。" + +#: ../../library/asyncio-task.rst:470 +msgid "" +"``sleep()`` always suspends the current task, allowing other tasks to run." +msgstr "``sleep()`` 总是会挂起当前任务,以允许其他任务运行。" + +#: ../../library/asyncio-task.rst:473 +msgid "" +"Setting the delay to 0 provides an optimized path to allow other tasks to " +"run. This can be used by long-running functions to avoid blocking the event " +"loop for the full duration of the function call." +msgstr "将 delay 设为 0 将提供一个经优化的路径以允许其他任务运行。这可供长期间运行的函数使用以避免在函数调用的全过程中阻塞事件循环。" + +#: ../../library/asyncio-task.rst:479 +msgid "" +"Example of coroutine displaying the current date every second for 5 " +"seconds::" +msgstr "以下协程示例运行 5 秒,每秒显示一次当前日期::" + +#: ../../library/asyncio-task.rst:482 +msgid "" +"import asyncio\n" +"import datetime as dt\n" +"\n" +"async def display_date():\n" +" loop = asyncio.get_running_loop()\n" +" end_time = loop.time() + 5.0\n" +" while True:\n" +" print(dt.datetime.now())\n" +" if (loop.time() + 1.0) >= end_time:\n" +" break\n" +" await asyncio.sleep(1)\n" +"\n" +"asyncio.run(display_date())" +msgstr "" +"import asyncio\n" +"import datetime as dt\n" +"\n" +"async def display_date():\n" +" loop = asyncio.get_running_loop()\n" +" end_time = loop.time() + 5.0\n" +" while True:\n" +" print(dt.datetime.now())\n" +" if (loop.time() + 1.0) >= end_time:\n" +" break\n" +" await asyncio.sleep(1)\n" +"\n" +"asyncio.run(display_date())" + +#: ../../library/asyncio-task.rst:497 ../../library/asyncio-task.rst:595 +#: ../../library/asyncio-task.rst:694 ../../library/asyncio-task.rst:872 +#: ../../library/asyncio-task.rst:927 ../../library/asyncio-task.rst:984 +msgid "Removed the *loop* parameter." +msgstr "移除了 *loop* 形参。" + +#: ../../library/asyncio-task.rst:500 +msgid "Raises :exc:`ValueError` if *delay* is :data:`~math.nan`." +msgstr "如果 *delay* 为 :data:`~math.nan` 则会引发 :exc:`ValueError`。" + +#: ../../library/asyncio-task.rst:505 +msgid "Running tasks concurrently" +msgstr "并发地运行任务" + +#: ../../library/asyncio-task.rst:509 +msgid "" +"Run :ref:`awaitable objects ` in the *aws* sequence " +"*concurrently*." +msgstr "*并发* 运行 *aws* 序列中的 :ref:`可等待对象 `。" + +#: ../../library/asyncio-task.rst:512 +msgid "" +"If any awaitable in *aws* is a coroutine, it is automatically scheduled as a" +" Task." +msgstr "如果 *aws* 中的某个可等待对象为协程,它将自动被作为一个任务调度。" + +#: ../../library/asyncio-task.rst:515 +msgid "" +"If all awaitables are completed successfully, the result is an aggregate " +"list of returned values. The order of result values corresponds to the " +"order of awaitables in *aws*." +msgstr "如果所有可等待对象都成功完成,结果将是一个由所有返回值聚合而成的列表。结果值的顺序与 *aws* 中可等待对象的顺序一致。" + +#: ../../library/asyncio-task.rst:519 +msgid "" +"If *return_exceptions* is ``False`` (default), the first raised exception is" +" immediately propagated to the task that awaits on ``gather()``. Other " +"awaitables in the *aws* sequence **won't be cancelled** and will continue to" +" run." +msgstr "" +"如果 *return_exceptions* 为 ``False`` (默认),所引发的首个异常会立即传播给等待 ``gather()`` " +"的任务。*aws* 序列中的其他可等待对象 **不会被取消** 并将继续运行。" + +#: ../../library/asyncio-task.rst:524 +msgid "" +"If *return_exceptions* is ``True``, exceptions are treated the same as " +"successful results, and aggregated in the result list." +msgstr "如果 *return_exceptions* 为 ``True``,异常会和成功的结果一样处理,并聚合至结果列表。" + +#: ../../library/asyncio-task.rst:527 +msgid "" +"If ``gather()`` is *cancelled*, all submitted awaitables (that have not " +"completed yet) are also *cancelled*." +msgstr "如果 ``gather()`` *被取消*,所有被提交 (尚未完成) 的可等待对象也会 *被取消*。" + +#: ../../library/asyncio-task.rst:530 +msgid "" +"If any Task or Future from the *aws* sequence is *cancelled*, it is treated " +"as if it raised :exc:`CancelledError` -- the ``gather()`` call is **not** " +"cancelled in this case. This is to prevent the cancellation of one " +"submitted Task/Future to cause other Tasks/Futures to be cancelled." +msgstr "" +"如果 *aws* 序列中的任一 Task 或 Future 对象 *被取消*,它将被当作引发了 :exc:`CancelledError` 一样处理 " +"-- 在此情况下 ``gather()`` 调用 **不会** 被取消。这是为了防止一个已提交的 Task/Future 被取消导致其他 " +"Tasks/Future 也被取消。" + +#: ../../library/asyncio-task.rst:537 +msgid "" +"A new alternative to create and run tasks concurrently and wait for their " +"completion is :class:`asyncio.TaskGroup`. *TaskGroup* provides stronger " +"safety guarantees than *gather* for scheduling a nesting of subtasks: if a " +"task (or a subtask, a task scheduled by a task) raises an exception, " +"*TaskGroup* will, while *gather* will not, cancel the remaining scheduled " +"tasks." +msgstr "" +"一个创建、并发地运行任务并等待它们完成的新选择是 :class:`asyncio.TaskGroup`。 *TaskGroup* " +"针对嵌套子任务的调度提供比 *gather* 更强的安全保证:如果一个任务(或子任务,即由某个任务调度的任务)引发了异常,*TaskGroup* " +"将取消剩余的已排期任务,而 *gather* 不会这样做。" + +#: ../../library/asyncio-task.rst:548 +msgid "" +"import asyncio\n" +"\n" +"async def factorial(name, number):\n" +" f = 1\n" +" for i in range(2, number + 1):\n" +" print(f\"Task {name}: Compute factorial({number}), currently i={i}...\")\n" +" await asyncio.sleep(1)\n" +" f *= i\n" +" print(f\"Task {name}: factorial({number}) = {f}\")\n" +" return f\n" +"\n" +"async def main():\n" +" # Schedule three calls *concurrently*:\n" +" L = await asyncio.gather(\n" +" factorial(\"A\", 2),\n" +" factorial(\"B\", 3),\n" +" factorial(\"C\", 4),\n" +" )\n" +" print(L)\n" +"\n" +"asyncio.run(main())\n" +"\n" +"# Expected output:\n" +"#\n" +"# Task A: Compute factorial(2), currently i=2...\n" +"# Task B: Compute factorial(3), currently i=2...\n" +"# Task C: Compute factorial(4), currently i=2...\n" +"# Task A: factorial(2) = 2\n" +"# Task B: Compute factorial(3), currently i=3...\n" +"# Task C: Compute factorial(4), currently i=3...\n" +"# Task B: factorial(3) = 6\n" +"# Task C: Compute factorial(4), currently i=4...\n" +"# Task C: factorial(4) = 24\n" +"# [2, 6, 24]" +msgstr "" +"import asyncio\n" +"\n" +"async def factorial(name, number):\n" +" f = 1\n" +" for i in range(2, number + 1):\n" +" print(f\"Task {name}: Compute factorial({number}), currently i={i}...\")\n" +" await asyncio.sleep(1)\n" +" f *= i\n" +" print(f\"Task {name}: factorial({number}) = {f}\")\n" +" return f\n" +"\n" +"async def main():\n" +" # *并发地* 调度这三次调用:\n" +" L = await asyncio.gather(\n" +" factorial(\"A\", 2),\n" +" factorial(\"B\", 3),\n" +" factorial(\"C\", 4),\n" +" )\n" +" print(L)\n" +"\n" +"asyncio.run(main())\n" +"\n" +"# 预期的输出:\n" +"#\n" +"# Task A: Compute factorial(2), currently i=2...\n" +"# Task B: Compute factorial(3), currently i=2...\n" +"# Task C: Compute factorial(4), currently i=2...\n" +"# Task A: factorial(2) = 2\n" +"# Task B: Compute factorial(3), currently i=3...\n" +"# Task C: Compute factorial(4), currently i=3...\n" +"# Task B: factorial(3) = 6\n" +"# Task C: Compute factorial(4), currently i=4...\n" +"# Task C: factorial(4) = 24\n" +"# [2, 6, 24]" + +#: ../../library/asyncio-task.rst:584 +msgid "" +"If *return_exceptions* is false, cancelling gather() after it has been " +"marked done won't cancel any submitted awaitables. For instance, gather can " +"be marked done after propagating an exception to the caller, therefore, " +"calling ``gather.cancel()`` after catching an exception (raised by one of " +"the awaitables) from gather won't cancel any other awaitables." +msgstr "" +"如果 *return_exceptions* 为假值,则在 gather() 被标记为完成后取消它将不会取消任何已提交的可等待对象。 " +"例如,在将一个异常传播给调用者之后,gather 可被标记为已完成,因此,在从 gather 捕获一个(由可等待对象所引发的)异常之后调用 " +"``gather.cancel()`` 将不会取消任何其他可等待对象。" + +#: ../../library/asyncio-task.rst:591 +msgid "" +"If the *gather* itself is cancelled, the cancellation is propagated " +"regardless of *return_exceptions*." +msgstr "如果 *gather* 本身被取消,则无论 *return_exceptions* 取值为何,取消都会被传播。" + +#: ../../library/asyncio-task.rst:598 +msgid "" +"Deprecation warning is emitted if no positional arguments are provided or " +"not all positional arguments are Future-like objects and there is no running" +" event loop." +msgstr "如果未提供位置参数或者并非所有位置参数均为 Future 类对象并且没有正在运行的事件循环则会发出弃用警告。" + +#: ../../library/asyncio-task.rst:607 +msgid "Eager task factory" +msgstr "主动任务工厂" + +#: ../../library/asyncio-task.rst:611 +msgid "A task factory for eager task execution." +msgstr "用于主动任务执行的任务工厂" + +#: ../../library/asyncio-task.rst:613 +msgid "" +"When using this factory (via " +":meth:`loop.set_task_factory(asyncio.eager_task_factory) " +"`), coroutines begin execution synchronously during " +":class:`Task` construction. Tasks are only scheduled on the event loop if " +"they block. This can be a performance improvement as the overhead of loop " +"scheduling is avoided for coroutines that complete synchronously." +msgstr "" +"当使用这个工厂函数时 (通过 :meth:`loop.set_task_factory(asyncio.eager_task_factory) " +"`),协程将在 :class:`Task` " +"被构造时同步开始执行。仅当任务面临阻塞时,它们才会被调度到事件循环上。这将避免可同步完成的协程被调度到事件循环所带来的开销,从而可以达成性能提升。" + +#: ../../library/asyncio-task.rst:619 +msgid "" +"A common example where this is beneficial is coroutines which employ caching" +" or memoization to avoid actual I/O when possible." +msgstr "此特性会带来好处的一个常见例子是应用了缓存或记忆功能以便在可能的情况避免实际 I/O 的协程。" + +#: ../../library/asyncio-task.rst:624 +msgid "" +"Immediate execution of the coroutine is a semantic change. If the coroutine " +"returns or raises, the task is never scheduled to the event loop. If the " +"coroutine execution blocks, the task is scheduled to the event loop. This " +"change may introduce behavior changes to existing applications. For example," +" the application's task execution order is likely to change." +msgstr "" +"协程的就地执行是一项语义改变。如果协程返回或引发异常,任务将永远不会被调度到事件循环上。如果协程的执行发生阻塞,任务将会被调度到事件循环上。这项改变可能会向现有应用程序引入行为变化。例如,应用程序的任务执行顺序可能会发生改变。" + +#: ../../library/asyncio-task.rst:635 +msgid "" +"Create an eager task factory, similar to :func:`eager_task_factory`, using " +"the provided *custom_task_constructor* when creating a new task instead of " +"the default :class:`Task`." +msgstr "" +"创建一个主动型任务工厂,类似于 :func:`eager_task_factory`,在创建新任务时使用所提供的 " +"*custom_task_constructor* 而不是默认的 :class:`Task`。" + +#: ../../library/asyncio-task.rst:639 +msgid "" +"*custom_task_constructor* must be a *callable* with the signature matching " +"the signature of :class:`Task.__init__ `. The callable must return a " +":class:`asyncio.Task`-compatible object." +msgstr "" +"*custom_task_constructor* 必须是一个 *可调用对象*,其签名与 :class:`Task.__init__ ` " +"的签名相匹配。该可调用对象必须返回一个兼容 :class:`asyncio.Task` 的对象。" + +#: ../../library/asyncio-task.rst:643 +msgid "" +"This function returns a *callable* intended to be used as a task factory of " +"an event loop via :meth:`loop.set_task_factory(factory) " +"`)." +msgstr "" +"此函数返回一个 *可调用对象*,将通过 :meth:`loop.set_task_factory(factory) " +"`) 被用作一个事件循环的任务工厂。" + +#: ../../library/asyncio-task.rst:650 +msgid "Shielding from cancellation" +msgstr "屏蔽取消操作" + +#: ../../library/asyncio-task.rst:654 +msgid "" +"Protect an :ref:`awaitable object ` from being " +":meth:`cancelled `." +msgstr "保护一个 :ref:`可等待对象 ` 防止其被 :meth:`取消 `。" + +#: ../../library/asyncio-task.rst:657 ../../library/asyncio-task.rst:827 +msgid "If *aw* is a coroutine it is automatically scheduled as a Task." +msgstr "如果 *aw* 是一个协程,它将自动被作为任务调度。" + +#: ../../library/asyncio-task.rst:659 +msgid "The statement::" +msgstr "以下语句::" + +#: ../../library/asyncio-task.rst:661 +msgid "" +"task = asyncio.create_task(something())\n" +"res = await shield(task)" +msgstr "" +"task = asyncio.create_task(something())\n" +"res = await shield(task)" + +#: ../../library/asyncio-task.rst:664 +msgid "is equivalent to::" +msgstr "相当于::" + +#: ../../library/asyncio-task.rst:666 +msgid "res = await something()" +msgstr "res = await something()" + +#: ../../library/asyncio-task.rst:668 +msgid "" +"*except* that if the coroutine containing it is cancelled, the Task running " +"in ``something()`` is not cancelled. From the point of view of " +"``something()``, the cancellation did not happen. Although its caller is " +"still cancelled, so the \"await\" expression still raises a " +":exc:`CancelledError`." +msgstr "" +"*不同之处* 在于如果包含它的协程被取消,在 ``something()`` 中运行的任务不会被取消。从 ``something()`` " +"的角度看来,取消操作并没有发生。然而其调用者已被取消,因此 \"await\" 表达式仍然会引发 :exc:`CancelledError`。" + +#: ../../library/asyncio-task.rst:674 +msgid "" +"If ``something()`` is cancelled by other means (i.e. from within itself) " +"that would also cancel ``shield()``." +msgstr "如果通过其他方式取消 ``something()`` (例如在其内部操作) 则 ``shield()`` 也会取消。" + +#: ../../library/asyncio-task.rst:677 +msgid "" +"If it is desired to completely ignore cancellation (not recommended) the " +"``shield()`` function should be combined with a try/except clause, as " +"follows::" +msgstr "如果希望完全忽略取消操作 (不推荐) 则 ``shield()`` 函数需要配合一个 try/except 代码段,如下所示::" + +#: ../../library/asyncio-task.rst:681 +msgid "" +"task = asyncio.create_task(something())\n" +"try:\n" +" res = await shield(task)\n" +"except CancelledError:\n" +" res = None" +msgstr "" +"task = asyncio.create_task(something())\n" +"try:\n" +" res = await shield(task)\n" +"except CancelledError:\n" +" res = None" + +#: ../../library/asyncio-task.rst:689 +msgid "" +"Save a reference to tasks passed to this function, to avoid a task " +"disappearing mid-execution. The event loop only keeps weak references to " +"tasks. A task that isn't referenced elsewhere may get garbage collected at " +"any time, even before it's done." +msgstr "" +"保存一个传给此函数的任务的引用,以避免任务在执行过程中消失。事件循环将只保留对任务的弱引用。 " +"未在其他地方被引用的任务可能在任何时候被作为垃圾回收,即使是在它被完成之前。" + +#: ../../library/asyncio-task.rst:697 +msgid "" +"Deprecation warning is emitted if *aw* is not Future-like object and there " +"is no running event loop." +msgstr "如果 *aw* 不是 Future 类对象并且没有正在运行的事件循环则会发出弃用警告。" + +#: ../../library/asyncio-task.rst:703 +msgid "Timeouts" +msgstr "超时" + +#: ../../library/asyncio-task.rst:707 +msgid "" +"Return an :ref:`asynchronous context manager ` that " +"can be used to limit the amount of time spent waiting on something." +msgstr "返回一个可被用于限制等待某个操作所耗费时间的 :ref:`异步上下文管理器 `。" + +#: ../../library/asyncio-task.rst:711 +msgid "" +"*delay* can either be ``None``, or a float/int number of seconds to wait. If" +" *delay* is ``None``, no time limit will be applied; this can be useful if " +"the delay is unknown when the context manager is created." +msgstr "" +"*delay* 可以为 ``None``,或是一个表示等待秒数的浮点数/整数。如果 *delay* 为 " +"``None``,将不会应用时间限制;如果当创建上下文管理器时无法确定延时则此设置将很适用。" + +#: ../../library/asyncio-task.rst:716 +msgid "" +"In either case, the context manager can be rescheduled after creation using " +":meth:`Timeout.reschedule`." +msgstr "在两种情况下,该上下文管理器都可以在创建之后使用 :meth:`Timeout.reschedule` 来重新安排计划。" + +#: ../../library/asyncio-task.rst:721 +msgid "" +"async def main():\n" +" async with asyncio.timeout(10):\n" +" await long_running_task()" +msgstr "" +"async def main():\n" +" async with asyncio.timeout(10):\n" +" await long_running_task()" + +#: ../../library/asyncio-task.rst:725 +msgid "" +"If ``long_running_task`` takes more than 10 seconds to complete, the context" +" manager will cancel the current task and handle the resulting " +":exc:`asyncio.CancelledError` internally, transforming it into a " +":exc:`TimeoutError` which can be caught and handled." +msgstr "" +"如果 ``long_running_task`` 耗费 10 秒以上完成,该上下文管理器将取消当前任务并在内部处理所引发的 " +":exc:`asyncio.CancelledError`,将其转化为可被捕获和处理的 :exc:`TimeoutError`。" + +#: ../../library/asyncio-task.rst:732 +msgid "" +"The :func:`asyncio.timeout` context manager is what transforms the " +":exc:`asyncio.CancelledError` into a :exc:`TimeoutError`, which means the " +":exc:`TimeoutError` can only be caught *outside* of the context manager." +msgstr "" +":func:`asyncio.timeout` 上下文管理器负责将 :exc:`asyncio.CancelledError` 转化为 " +":exc:`TimeoutError`,这意味着 :exc:`TimeoutError` 只能在该上下文管理器 *之外* 被捕获。" + +#: ../../library/asyncio-task.rst:737 +msgid "Example of catching :exc:`TimeoutError`::" +msgstr "捕获 :exc:`TimeoutError` 的示例::" + +#: ../../library/asyncio-task.rst:739 +msgid "" +"async def main():\n" +" try:\n" +" async with asyncio.timeout(10):\n" +" await long_running_task()\n" +" except TimeoutError:\n" +" print(\"The long operation timed out, but we've handled it.\")\n" +"\n" +" print(\"This statement will run regardless.\")" +msgstr "" +"async def main():\n" +" try:\n" +" async with asyncio.timeout(10):\n" +" await long_running_task()\n" +" except TimeoutError:\n" +" print(\"The long operation timed out, but we've handled it.\")\n" +"\n" +" print(\"This statement will run regardless.\")" + +#: ../../library/asyncio-task.rst:748 +msgid "" +"The context manager produced by :func:`asyncio.timeout` can be rescheduled " +"to a different deadline and inspected." +msgstr ":func:`asyncio.timeout` 所产生的上下文管理器可以被重新调整到不同的终止点并执行检查。" + +#: ../../library/asyncio-task.rst:753 +msgid "" +"An :ref:`asynchronous context manager ` for " +"cancelling overdue coroutines." +msgstr "一个用于撤销已过期协程的 :ref:`异步上下文管理器 `。" + +#: ../../library/asyncio-task.rst:756 +msgid "" +"Prefer using :func:`asyncio.timeout` or :func:`asyncio.timeout_at` rather " +"than instantiating :class:`!Timeout` directly." +msgstr "" +"建议使用 :func:`asyncio.timeout` 或 :func:`asyncio.timeout_at` 而不是直接实例化 " +":class:`!Timeout`。" + +#: ../../library/asyncio-task.rst:759 +msgid "" +"``when`` should be an absolute time at which the context should time out, as" +" measured by the event loop's clock:" +msgstr "``when`` 应当是一个指明上下文将要过期的绝对时间,由事件循环的时钟来计时。" + +#: ../../library/asyncio-task.rst:762 +msgid "If ``when`` is ``None``, the timeout will never trigger." +msgstr "如果 ``when`` 为 ``None``,则超时将永远不会被触发。" + +#: ../../library/asyncio-task.rst:763 +msgid "" +"If ``when < loop.time()``, the timeout will trigger on the next iteration of" +" the event loop." +msgstr "如果 ``when < loop.time()``,则超时将在事件循环的下一次迭代中被触发。" + +#: ../../library/asyncio-task.rst:768 +msgid "" +"Return the current deadline, or ``None`` if the current deadline is not set." +msgstr "返回当前终止点,或者如果未设置当前终止点则返回 ``None``。" + +#: ../../library/asyncio-task.rst:773 +msgid "Reschedule the timeout." +msgstr "重新安排超时。" + +#: ../../library/asyncio-task.rst:777 +msgid "" +"Return whether the context manager has exceeded its deadline (expired)." +msgstr "返回上下文管理器是否已超出时限(过期)。" + +#: ../../library/asyncio-task.rst:782 +msgid "" +"async def main():\n" +" try:\n" +" # We do not know the timeout when starting, so we pass ``None``.\n" +" async with asyncio.timeout(None) as cm:\n" +" # We know the timeout now, so we reschedule it.\n" +" new_deadline = get_running_loop().time() + 10\n" +" cm.reschedule(new_deadline)\n" +"\n" +" await long_running_task()\n" +" except TimeoutError:\n" +" pass\n" +"\n" +" if cm.expired():\n" +" print(\"Looks like we haven't finished on time.\")" +msgstr "" +"async def main():\n" +" try:\n" +" # 当开始时我们并不知道超时值,所以我们传入 ``None``。\n" +" async with asyncio.timeout(None) as cm:\n" +" # 现在我们知道超时值了,所以我们将它重新加入计划任务。\n" +" new_deadline = get_running_loop().time() + 10\n" +" cm.reschedule(new_deadline)\n" +"\n" +" await long_running_task()\n" +" except TimeoutError:\n" +" pass\n" +"\n" +" if cm.expired():\n" +" print(\"Looks like we haven't finished on time.\")" + +#: ../../library/asyncio-task.rst:797 +msgid "Timeout context managers can be safely nested." +msgstr "超时上下文管理器可以被安全地嵌套。" + +#: ../../library/asyncio-task.rst:803 +msgid "" +"Similar to :func:`asyncio.timeout`, except *when* is the absolute time to " +"stop waiting, or ``None``." +msgstr "类似于 :func:`asyncio.timeout`,不同之处在于 *when* 是停止等待的绝对时间,或者为 ``None``。" + +#: ../../library/asyncio-task.rst:808 +msgid "" +"async def main():\n" +" loop = get_running_loop()\n" +" deadline = loop.time() + 20\n" +" try:\n" +" async with asyncio.timeout_at(deadline):\n" +" await long_running_task()\n" +" except TimeoutError:\n" +" print(\"The long operation timed out, but we've handled it.\")\n" +"\n" +" print(\"This statement will run regardless.\")" +msgstr "" +"async def main():\n" +" loop = get_running_loop()\n" +" deadline = loop.time() + 20\n" +" try:\n" +" async with asyncio.timeout_at(deadline):\n" +" await long_running_task()\n" +" except TimeoutError:\n" +" print(\"The long operation timed out, but we've handled it.\")\n" +"\n" +" print(\"This statement will run regardless.\")" + +#: ../../library/asyncio-task.rst:824 +msgid "" +"Wait for the *aw* :ref:`awaitable ` to complete with a " +"timeout." +msgstr "等待 *aw* :ref:`可等待对象 ` 完成,指定 timeout 秒数后超时。" + +#: ../../library/asyncio-task.rst:829 +msgid "" +"*timeout* can either be ``None`` or a float or int number of seconds to wait" +" for. If *timeout* is ``None``, block until the future completes." +msgstr "" +"*timeout* 可以为 ``None``,也可以为 float 或 int 型数值表示的等待秒数。如果 *timeout* 为 " +"``None``,则等待直到完成。" + +#: ../../library/asyncio-task.rst:833 +msgid "" +"If a timeout occurs, it cancels the task and raises :exc:`TimeoutError`." +msgstr "如果发生超时,将取消任务并引发 :exc:`TimeoutError`。" + +#: ../../library/asyncio-task.rst:836 +msgid "" +"To avoid the task :meth:`cancellation `, wrap it in " +":func:`shield`." +msgstr "要避免任务 :meth:`取消 `,可以加上 :func:`shield`。" + +#: ../../library/asyncio-task.rst:839 +msgid "" +"The function will wait until the future is actually cancelled, so the total " +"wait time may exceed the *timeout*. If an exception happens during " +"cancellation, it is propagated." +msgstr "此函数将等待直到 Future 确实被取消,所以总等待时间可能超过 *timeout*。如果在取消期间发生了异常,异常将会被传播。" + +#: ../../library/asyncio-task.rst:843 +msgid "If the wait is cancelled, the future *aw* is also cancelled." +msgstr "如果等待被取消,则 *aw* 指定的对象也会被取消。" + +#: ../../library/asyncio-task.rst:849 +msgid "" +"async def eternity():\n" +" # Sleep for one hour\n" +" await asyncio.sleep(3600)\n" +" print('yay!')\n" +"\n" +"async def main():\n" +" # Wait for at most 1 second\n" +" try:\n" +" await asyncio.wait_for(eternity(), timeout=1.0)\n" +" except TimeoutError:\n" +" print('timeout!')\n" +"\n" +"asyncio.run(main())\n" +"\n" +"# Expected output:\n" +"#\n" +"# timeout!" +msgstr "" +"async def eternity():\n" +" # 休眠一小时\n" +" await asyncio.sleep(3600)\n" +" print('yay!')\n" +"\n" +"async def main():\n" +" # 等待至多 1 秒\n" +" try:\n" +" await asyncio.wait_for(eternity(), timeout=1.0)\n" +" except TimeoutError:\n" +" print('timeout!')\n" +"\n" +"asyncio.run(main())\n" +"\n" +"# 预期的输出:\n" +"#\n" +"# timeout!" + +#: ../../library/asyncio-task.rst:867 +msgid "" +"When *aw* is cancelled due to a timeout, ``wait_for`` waits for *aw* to be " +"cancelled. Previously, it raised :exc:`TimeoutError` immediately." +msgstr "" +"当 *aw* 由于超时被取消时,``wait_for`` 会等待 *aw* 被取消。在之前版本中,它会立即引发 :exc:`TimeoutError`." + +#: ../../library/asyncio-task.rst:875 +msgid "Raises :exc:`TimeoutError` instead of :exc:`asyncio.TimeoutError`." +msgstr "引发 :exc:`TimeoutError` 而不是 :exc:`asyncio.TimeoutError`。" + +#: ../../library/asyncio-task.rst:880 +msgid "Waiting primitives" +msgstr "等待原语" + +#: ../../library/asyncio-task.rst:885 +msgid "" +"Run :class:`~asyncio.Future` and :class:`~asyncio.Task` instances in the " +"*aws* iterable concurrently and block until the condition specified by " +"*return_when*." +msgstr "" +"并发地运行 *aws* 可迭代对象中的 :class:`~asyncio.Future` 和 :class:`~asyncio.Task` " +"实例并进入阻塞状态直到满足 *return_when* 所指定的条件。" + +#: ../../library/asyncio-task.rst:889 +msgid "The *aws* iterable must not be empty." +msgstr "*aws* 可迭代对象必须不为空。" + +#: ../../library/asyncio-task.rst:891 +msgid "Returns two sets of Tasks/Futures: ``(done, pending)``." +msgstr "返回两个 Task/Future 集合: ``(done, pending)``。" + +#: ../../library/asyncio-task.rst:893 +msgid "Usage::" +msgstr "用法::" + +#: ../../library/asyncio-task.rst:895 +msgid "done, pending = await asyncio.wait(aws)" +msgstr "done, pending = await asyncio.wait(aws)" + +#: ../../library/asyncio-task.rst:897 +msgid "" +"*timeout* (a float or int), if specified, can be used to control the maximum" +" number of seconds to wait before returning." +msgstr "如指定 *timeout* (float 或 int 类型) 则它将被用于控制返回之前等待的最长秒数。" + +#: ../../library/asyncio-task.rst:900 +msgid "" +"Note that this function does not raise :exc:`TimeoutError`. Futures or Tasks" +" that aren't done when the timeout occurs are simply returned in the second " +"set." +msgstr "" +"请注意此函数不会引发 :exc:`TimeoutError`。当超时发生时尚未完成的 Future 或 Task 会在设定的秒数后被直接返回。" + +#: ../../library/asyncio-task.rst:904 +msgid "" +"*return_when* indicates when this function should return. It must be one of" +" the following constants:" +msgstr "*return_when* 指定此函数应在何时返回。它必须为以下常数之一:" + +#: ../../library/asyncio-task.rst:910 +msgid "Constant" +msgstr "常量" + +#: ../../library/asyncio-task.rst:911 +msgid "Description" +msgstr "描述" + +#: ../../library/asyncio-task.rst:914 +msgid "The function will return when any future finishes or is cancelled." +msgstr "函数将在任意可等待对象结束或取消时返回。" + +#: ../../library/asyncio-task.rst:917 +msgid "" +"The function will return when any future finishes by raising an exception. " +"If no future raises an exception then it is equivalent to " +":const:`ALL_COMPLETED`." +msgstr "" +"该函数将在任何 future 对象由于引发异常而结束时返回。如果没有任何 future 对象引发异常,则其等价于 " +":const:`ALL_COMPLETED`." + +#: ../../library/asyncio-task.rst:922 +msgid "The function will return when all futures finish or are cancelled." +msgstr "函数将在所有可等待对象结束或取消时返回。" + +#: ../../library/asyncio-task.rst:924 +msgid "" +"Unlike :func:`~asyncio.wait_for`, ``wait()`` does not cancel the futures " +"when a timeout occurs." +msgstr "与 :func:`~asyncio.wait_for` 不同,``wait()`` 在超时发生时不会取消可等待对象。" + +#: ../../library/asyncio-task.rst:930 +msgid "Passing coroutine objects to ``wait()`` directly is forbidden." +msgstr "直接向 ``wait()`` 传入协程对象是被禁止的。" + +#: ../../library/asyncio-task.rst:933 ../../library/asyncio-task.rst:991 +msgid "Added support for generators yielding tasks." +msgstr "增加了对产生任务的生成器的支持。" + +#: ../../library/asyncio-task.rst:939 +msgid "" +"Run :ref:`awaitable objects ` in the *aws* iterable " +"concurrently. The returned object can be iterated to obtain the results of " +"the awaitables as they finish." +msgstr "" +"并发地运行 *aws* 可迭代对象中的 :ref:`可等待对象 `。 " +"返回的对象可以被迭代以获取可等待对象结束时的结果。" + +#: ../../library/asyncio-task.rst:943 +msgid "" +"The object returned by ``as_completed()`` can be iterated as an " +":term:`asynchronous iterator` or a plain :term:`iterator`. When asynchronous" +" iteration is used, the originally-supplied awaitables are yielded if they " +"are tasks or futures. This makes it easy to correlate previously-scheduled " +"tasks with their results. Example::" +msgstr "" +"由 ``as_completed()`` 返回的对象可作为 :term:`asynchronous iterator` 或普通的 " +":term:`iterator` 被迭代。当使用异步迭代时,原来提供的可等待对象如果为 Task 或 Future 对象则会被产出。 " +"这样可以更容易地将之前加入计划的任务与其结果进行对应。例如::" + +#: ../../library/asyncio-task.rst:949 +msgid "" +"ipv4_connect = create_task(open_connection(\"127.0.0.1\", 80))\n" +"ipv6_connect = create_task(open_connection(\"::1\", 80))\n" +"tasks = [ipv4_connect, ipv6_connect]\n" +"\n" +"async for earliest_connect in as_completed(tasks):\n" +" # earliest_connect is done. The result can be obtained by\n" +" # awaiting it or calling earliest_connect.result()\n" +" reader, writer = await earliest_connect\n" +"\n" +" if earliest_connect is ipv6_connect:\n" +" print(\"IPv6 connection established.\")\n" +" else:\n" +" print(\"IPv4 connection established.\")" +msgstr "" +"ipv4_connect = create_task(open_connection(\"127.0.0.1\", 80))\n" +"ipv6_connect = create_task(open_connection(\"::1\", 80))\n" +"tasks = [ipv4_connect, ipv6_connect]\n" +"\n" +"async for earliest_connect in as_completed(tasks):\n" +" # earliest_connect 已完成。要获取结果可通过等待它\n" +" # 或是调用 earliest_connect.result()\n" +" reader, writer = await earliest_connect\n" +"\n" +" if earliest_connect is ipv6_connect:\n" +" print(\"IPv6 connection established.\")\n" +" else:\n" +" print(\"IPv4 connection established.\")" + +#: ../../library/asyncio-task.rst:963 +msgid "" +"During asynchronous iteration, implicitly-created tasks will be yielded for " +"supplied awaitables that aren't tasks or futures." +msgstr "在异步迭代期间,将为不属于 Task 或 Future 对象的可等待对象产出隐式创建的任务。" + +#: ../../library/asyncio-task.rst:966 +msgid "" +"When used as a plain iterator, each iteration yields a new coroutine that " +"returns the result or raises the exception of the next completed awaitable. " +"This pattern is compatible with Python versions older than 3.13::" +msgstr "" +"当被用作普通的迭代器时,每次迭代将产出一个返回结果的新协程或是引发下一个完成的等待对象对应的异常。此模式将与 Python 3.13 " +"之前的版本保持兼容::" + +#: ../../library/asyncio-task.rst:970 +msgid "" +"ipv4_connect = create_task(open_connection(\"127.0.0.1\", 80))\n" +"ipv6_connect = create_task(open_connection(\"::1\", 80))\n" +"tasks = [ipv4_connect, ipv6_connect]\n" +"\n" +"for next_connect in as_completed(tasks):\n" +" # next_connect is not one of the original task objects. It must be\n" +" # awaited to obtain the result value or raise the exception of the\n" +" # awaitable that finishes next.\n" +" reader, writer = await next_connect" +msgstr "" +"ipv4_connect = create_task(open_connection(\"127.0.0.1\", 80))\n" +"ipv6_connect = create_task(open_connection(\"::1\", 80))\n" +"tasks = [ipv4_connect, ipv6_connect]\n" +"\n" +"for next_connect in as_completed(tasks):\n" +" # next_connect 不是原始 Task 对象之一。\n" +" # 它必须被等待以获取结果值或是引发\n" +" # 接下来要结束的可等待对象的异常。\n" +" reader, writer = await next_connect" + +#: ../../library/asyncio-task.rst:980 +msgid "" +"A :exc:`TimeoutError` is raised if the timeout occurs before all awaitables " +"are done. This is raised by the ``async for`` loop during asynchronous " +"iteration or by the coroutines yielded during plain iteration." +msgstr "" +"如果在所有可等待对象完成之前达到超时限制则会引发 :exc:`TimeoutError`。这将在异步迭代期间由 ``async for`` " +"循环引发或是在普通迭代期间由所产出的协程引发。" + +#: ../../library/asyncio-task.rst:987 +msgid "" +"Deprecation warning is emitted if not all awaitable objects in the *aws* " +"iterable are Future-like objects and there is no running event loop." +msgstr "如果 *aws* 可迭代对象中的可等待对象不全为 Future 类对象并且没有正在运行的事件循环则会发出弃用警告。" + +#: ../../library/asyncio-task.rst:994 +msgid "" +"The result can now be used as either an :term:`asynchronous iterator` or as " +"a plain :term:`iterator` (previously it was only a plain iterator)." +msgstr "" +"该结果现在可被用作 :term:`asynchronous iterator` 或是普通的 :term:`iterator` " +"(在之前它只是普通的迭代器)。" + +#: ../../library/asyncio-task.rst:1000 +msgid "Running in threads" +msgstr "在线程中运行" + +#: ../../library/asyncio-task.rst:1005 +msgid "Asynchronously run function *func* in a separate thread." +msgstr "在不同的线程中异步地运行函数 *func*。" + +#: ../../library/asyncio-task.rst:1007 +msgid "" +"Any \\*args and \\*\\*kwargs supplied for this function are directly passed " +"to *func*. Also, the current :class:`contextvars.Context` is propagated, " +"allowing context variables from the event loop thread to be accessed in the " +"separate thread." +msgstr "" +"向此函数提供的任何 \\*args 和 \\*\\*kwargs 会被直接传给 *func*。并且,当前 " +":class:`contextvars.Context` 会被传播,允许在不同的线程中访问来自事件循环的上下文变量。" + +#: ../../library/asyncio-task.rst:1012 +msgid "" +"Return a coroutine that can be awaited to get the eventual result of *func*." +msgstr "返回一个可被等待以获取 *func* 的最终结果的协程。" + +#: ../../library/asyncio-task.rst:1014 +msgid "" +"This coroutine function is primarily intended to be used for executing IO-" +"bound functions/methods that would otherwise block the event loop if they " +"were run in the main thread. For example::" +msgstr "这个协程函数主要是用于执行在其他情况下会阻塞事件循环的 IO 密集型函数/方法。例如::" + +#: ../../library/asyncio-task.rst:1018 +msgid "" +"def blocking_io():\n" +" print(f\"start blocking_io at {time.strftime('%X')}\")\n" +" # Note that time.sleep() can be replaced with any blocking\n" +" # IO-bound operation, such as file operations.\n" +" time.sleep(1)\n" +" print(f\"blocking_io complete at {time.strftime('%X')}\")\n" +"\n" +"async def main():\n" +" print(f\"started main at {time.strftime('%X')}\")\n" +"\n" +" await asyncio.gather(\n" +" asyncio.to_thread(blocking_io),\n" +" asyncio.sleep(1))\n" +"\n" +" print(f\"finished main at {time.strftime('%X')}\")\n" +"\n" +"\n" +"asyncio.run(main())\n" +"\n" +"# Expected output:\n" +"#\n" +"# started main at 19:50:53\n" +"# start blocking_io at 19:50:53\n" +"# blocking_io complete at 19:50:54\n" +"# finished main at 19:50:54" +msgstr "" +"def blocking_io():\n" +" print(f\"start blocking_io at {time.strftime('%X')}\")\n" +" # 请注意 time.sleep() 可被替换为任意一种\n" +" # 阻塞式 IO 密集型操作,例如文件操作。\n" +" time.sleep(1)\n" +" print(f\"blocking_io complete at {time.strftime('%X')}\")\n" +"\n" +"async def main():\n" +" print(f\"started main at {time.strftime('%X')}\")\n" +"\n" +" await asyncio.gather(\n" +" asyncio.to_thread(blocking_io),\n" +" asyncio.sleep(1))\n" +"\n" +" print(f\"finished main at {time.strftime('%X')}\")\n" +"\n" +"\n" +"asyncio.run(main())\n" +"\n" +"# 预期的输出:\n" +"#\n" +"# started main at 19:50:53\n" +"# start blocking_io at 19:50:53\n" +"# blocking_io complete at 19:50:54\n" +"# finished main at 19:50:54" + +#: ../../library/asyncio-task.rst:1044 +msgid "" +"Directly calling ``blocking_io()`` in any coroutine would block the event " +"loop for its duration, resulting in an additional 1 second of run time. " +"Instead, by using ``asyncio.to_thread()``, we can run it in a separate " +"thread without blocking the event loop." +msgstr "" +"在任何协程中直接调用 ``blocking_io()`` 将会在调用期间阻塞事件循环,导致额外的 1 秒运行时间。但是,通过改用 " +"``asyncio.to_thread()``,我们可以在单独的线程中运行它从而不会阻塞事件循环。" + +#: ../../library/asyncio-task.rst:1051 +msgid "" +"Due to the :term:`GIL`, ``asyncio.to_thread()`` can typically only be used " +"to make IO-bound functions non-blocking. However, for extension modules that" +" release the GIL or alternative Python implementations that don't have one, " +"``asyncio.to_thread()`` can also be used for CPU-bound functions." +msgstr "" +"由于 :term:`GIL` 的存在,``asyncio.to_thread()`` 通常只能被用来将 IO 密集型函数变为非阻塞的。但是,对于会释放 " +"GIL 的扩展模块或无此限制的替代性 Python 实现来说,``asyncio.to_thread()`` 也可被用于 CPU 密集型函数。" + +#: ../../library/asyncio-task.rst:1060 +msgid "Scheduling from other threads" +msgstr "跨线程调度" + +#: ../../library/asyncio-task.rst:1064 +msgid "Submit a coroutine to the given event loop. Thread-safe." +msgstr "向指定事件循环提交一个协程。(线程安全)" + +#: ../../library/asyncio-task.rst:1066 +msgid "" +"Return a :class:`concurrent.futures.Future` to wait for the result from " +"another OS thread." +msgstr "返回一个 :class:`concurrent.futures.Future` 以等待来自其他 OS 线程的结果。" + +#: ../../library/asyncio-task.rst:1069 +msgid "" +"This function is meant to be called from a different OS thread than the one " +"where the event loop is running. Example::" +msgstr "此函数应该从另一个 OS 线程中调用,而非事件循环运行所在线程。示例::" + +#: ../../library/asyncio-task.rst:1072 +msgid "" +"def in_thread(loop: asyncio.AbstractEventLoop) -> None:\n" +" # Run some blocking IO\n" +" pathlib.Path(\"example.txt\").write_text(\"hello world\", encoding=\"utf8\")\n" +"\n" +" # Create a coroutine\n" +" coro = asyncio.sleep(1, result=3)\n" +"\n" +" # Submit the coroutine to a given loop\n" +" future = asyncio.run_coroutine_threadsafe(coro, loop)\n" +"\n" +" # Wait for the result with an optional timeout argument\n" +" assert future.result(timeout=2) == 3\n" +"\n" +"async def amain() -> None:\n" +" # Get the running loop\n" +" loop = asyncio.get_running_loop()\n" +"\n" +" # Run something in a thread\n" +" await asyncio.to_thread(in_thread, loop)" +msgstr "" +"def in_thread(loop: asyncio.AbstractEventLoop) -> None:\n" +" # 运行一些阻塞 IO\n" +" pathlib.Path(\"example.txt\").write_text(\"hello world\", encoding=\"utf8\")\n" +"\n" +" # 创建一个协程\n" +" coro = asyncio.sleep(1, result=3)\n" +"\n" +" # 将协程提交给给定的循环\n" +" future = asyncio.run_coroutine_threadsafe(coro, loop)\n" +"\n" +" # 使用可选的 timeout 参数等待结果\n" +" assert future.result(timeout=2) == 3\n" +"\n" +"async def amain() -> None:\n" +" # 获取正在运行的循环\n" +" loop = asyncio.get_running_loop()\n" +"\n" +" # 在线程中运行一些东西\n" +" await asyncio.to_thread(in_thread, loop)" + +#: ../../library/asyncio-task.rst:1092 +msgid "It's also possible to run the other way around. Example::" +msgstr "也有可能反过来运行。例如::" + +#: ../../library/asyncio-task.rst:1094 +msgid "" +"@contextlib.contextmanager\n" +"def loop_in_thread() -> Generator[asyncio.AbstractEventLoop]:\n" +" loop_fut = concurrent.futures.Future[asyncio.AbstractEventLoop]()\n" +" stop_event = asyncio.Event()\n" +"\n" +" async def main() -> None:\n" +" loop_fut.set_result(asyncio.get_running_loop())\n" +" await stop_event.wait()\n" +"\n" +" with concurrent.futures.ThreadPoolExecutor(1) as tpe:\n" +" complete_fut = tpe.submit(asyncio.run, main())\n" +" for fut in concurrent.futures.as_completed((loop_fut, complete_fut)):\n" +" if fut is loop_fut:\n" +" loop = loop_fut.result()\n" +" try:\n" +" yield loop\n" +" finally:\n" +" loop.call_soon_threadsafe(stop_event.set)\n" +" else:\n" +" fut.result()\n" +"\n" +"# Create a loop in another thread\n" +"with loop_in_thread() as loop:\n" +" # Create a coroutine\n" +" coro = asyncio.sleep(1, result=3)\n" +"\n" +" # Submit the coroutine to a given loop\n" +" future = asyncio.run_coroutine_threadsafe(coro, loop)\n" +"\n" +" # Wait for the result with an optional timeout argument\n" +" assert future.result(timeout=2) == 3" +msgstr "" +"@contextlib.contextmanager\n" +"def loop_in_thread() -> Generator[asyncio.AbstractEventLoop]:\n" +" loop_fut = concurrent.futures.Future[asyncio.AbstractEventLoop]()\n" +" stop_event = asyncio.Event()\n" +"\n" +" async def main() -> None:\n" +" loop_fut.set_result(asyncio.get_running_loop())\n" +" await stop_event.wait()\n" +"\n" +" with concurrent.futures.ThreadPoolExecutor(1) as tpe:\n" +" complete_fut = tpe.submit(asyncio.run, main())\n" +" for fut in concurrent.futures.as_completed((loop_fut, complete_fut)):\n" +" if fut is loop_fut:\n" +" loop = loop_fut.result()\n" +" try:\n" +" yield loop\n" +" finally:\n" +" loop.call_soon_threadsafe(stop_event.set)\n" +" else:\n" +" fut.result()\n" +"\n" +"# 在另一线程中创建循环\n" +"with loop_in_thread() as loop:\n" +" # 创建一个协程\n" +" coro = asyncio.sleep(1, result=3)\n" +"\n" +" # 将协程提交至给定的循环\n" +" future = asyncio.run_coroutine_threadsafe(coro, loop)\n" +"\n" +" # 附带可选的超时参数等待结果\n" +" assert future.result(timeout=2) == 3" + +#: ../../library/asyncio-task.rst:1126 +msgid "" +"If an exception is raised in the coroutine, the returned Future will be " +"notified. It can also be used to cancel the task in the event loop::" +msgstr "如果在协程内产生了异常,将会通知返回的 Future 对象。它也可被用来取消事件循环中的任务::" + +#: ../../library/asyncio-task.rst:1130 +msgid "" +"try:\n" +" result = future.result(timeout)\n" +"except TimeoutError:\n" +" print('The coroutine took too long, cancelling the task...')\n" +" future.cancel()\n" +"except Exception as exc:\n" +" print(f'The coroutine raised an exception: {exc!r}')\n" +"else:\n" +" print(f'The coroutine returned: {result!r}')" +msgstr "" +"try:\n" +" result = future.result(timeout)\n" +"except TimeoutError:\n" +" print('The coroutine took too long, cancelling the task...')\n" +" future.cancel()\n" +"except Exception as exc:\n" +" print(f'The coroutine raised an exception: {exc!r}')\n" +"else:\n" +" print(f'The coroutine returned: {result!r}')" + +#: ../../library/asyncio-task.rst:1140 +msgid "" +"See the :ref:`concurrency and multithreading ` " +"section of the documentation." +msgstr "" +"参见 :ref:`concurrency and multithreading ` 部分的文档。" + +#: ../../library/asyncio-task.rst:1143 +msgid "" +"Unlike other asyncio functions this function requires the *loop* argument to" +" be passed explicitly." +msgstr "不同于其他 asyncio 函数,此函数要求显式地传入 *loop* 参数。" + +#: ../../library/asyncio-task.rst:1150 +msgid "Introspection" +msgstr "内省" + +#: ../../library/asyncio-task.rst:1155 +msgid "" +"Return the currently running :class:`Task` instance, or ``None`` if no task " +"is running." +msgstr "返回当前运行的 :class:`Task` 实例,如果没有正在运行的任务则返回 ``None``。" + +#: ../../library/asyncio-task.rst:1158 +msgid "" +"If *loop* is ``None`` :func:`get_running_loop` is used to get the current " +"loop." +msgstr "如果 *loop* 为 ``None`` 则会使用 :func:`get_running_loop` 获取当前事件循环。" + +#: ../../library/asyncio-task.rst:1166 +msgid "" +"Return a set of not yet finished :class:`Task` objects run by the loop." +msgstr "返回事件循环所运行的未完成的 :class:`Task` 对象的集合。" + +#: ../../library/asyncio-task.rst:1169 +msgid "" +"If *loop* is ``None``, :func:`get_running_loop` is used for getting current " +"loop." +msgstr "如果 *loop* 为 ``None``,则会使用 :func:`get_running_loop` 获取当前事件循环。" + +#: ../../library/asyncio-task.rst:1177 +msgid "Return ``True`` if *obj* is a coroutine object." +msgstr "如果 *obj* 是一个协程对象则返回 ``True``。" + +#: ../../library/asyncio-task.rst:1184 +msgid "Task object" +msgstr "Task 对象" + +#: ../../library/asyncio-task.rst:1188 +msgid "" +"A :class:`Future-like ` object that runs a Python :ref:`coroutine " +"`. Not thread-safe." +msgstr "" +"一个运行 Python :ref:`协程 ` 的 :class:`Future-like ` 对象。 非线程安全。" + +#: ../../library/asyncio-task.rst:1191 +msgid "" +"Tasks are used to run coroutines in event loops. If a coroutine awaits on a " +"Future, the Task suspends the execution of the coroutine and waits for the " +"completion of the Future. When the Future is *done*, the execution of the " +"wrapped coroutine resumes." +msgstr "" +"Task 对象被用来在事件循环中运行协程。如果一个协程在等待一个 Future 对象,Task 对象会挂起该协程的执行并等待该 Future " +"对象完成。当该 Future 对象 *完成*,被打包的协程将恢复执行。" + +#: ../../library/asyncio-task.rst:1197 +msgid "" +"Event loops use cooperative scheduling: an event loop runs one Task at a " +"time. While a Task awaits for the completion of a Future, the event loop " +"runs other Tasks, callbacks, or performs IO operations." +msgstr "" +"事件循环使用协同日程调度:一个事件循环每次运行一个 Task 对象。而一个 Task 对象会等待一个 Future 对象完成,该事件循环会运行其他 " +"Task、回调或执行 IO 操作。" + +#: ../../library/asyncio-task.rst:1202 +msgid "" +"Use the high-level :func:`asyncio.create_task` function to create Tasks, or " +"the low-level :meth:`loop.create_task` or :func:`ensure_future` functions. " +"Manual instantiation of Tasks is discouraged." +msgstr "" +"使用高层级的 :func:`asyncio.create_task` 函数来创建 Task 对象,也可用低层级的 " +":meth:`loop.create_task` 或 :func:`ensure_future` 函数。不建议手动实例化 Task 对象。" + +#: ../../library/asyncio-task.rst:1207 +msgid "" +"To cancel a running Task use the :meth:`cancel` method. Calling it will " +"cause the Task to throw a :exc:`CancelledError` exception into the wrapped " +"coroutine. If a coroutine is awaiting on a future-like object during " +"cancellation, the awaited object will be cancelled." +msgstr "" + +#: ../../library/asyncio-task.rst:1212 +msgid "" +":meth:`cancelled` can be used to check if the Task was cancelled. The method" +" returns ``True`` if the wrapped coroutine did not suppress the " +":exc:`CancelledError` exception and was actually cancelled." +msgstr "" +":meth:`cancelled` 可被用来检测 Task 对象是否被取消。如果打包的协程没有抑制 :exc:`CancelledError` " +"异常并且确实被取消,该方法将返回 ``True``。" + +#: ../../library/asyncio-task.rst:1217 +msgid "" +":class:`asyncio.Task` inherits from :class:`Future` all of its APIs except " +":meth:`Future.set_result` and :meth:`Future.set_exception`." +msgstr "" +":class:`asyncio.Task` 从 :class:`Future` 继承了其除 :meth:`Future.set_result` 和 " +":meth:`Future.set_exception` 以外的所有 API。" + +#: ../../library/asyncio-task.rst:1221 +msgid "" +"An optional keyword-only *context* argument allows specifying a custom " +":class:`contextvars.Context` for the *coro* to run in. If no *context* is " +"provided, the Task copies the current context and later runs its coroutine " +"in the copied context." +msgstr "" +"可选的仅限关键字参数 *context* 允许指定自定义的 :class:`contextvars.Context` 供 *coro* 运行。 " +"如果未提供 *context*,Task 将拷贝当前上下文并随后在拷贝的上下文中运行其协程。" + +#: ../../library/asyncio-task.rst:1226 +msgid "" +"An optional keyword-only *eager_start* argument allows eagerly starting the " +"execution of the :class:`asyncio.Task` at task creation time. If set to " +"``True`` and the event loop is running, the task will start executing the " +"coroutine immediately, until the first time the coroutine blocks. If the " +"coroutine returns or raises without blocking, the task will be finished " +"eagerly and will skip scheduling to the event loop." +msgstr "" +"可选的仅限关键字参数 *eager_start* 允许在任务创建时主动开始 :class:`asyncio.Task` 的执行。如果设为 " +"``True`` 并且事件循环正在运行,任务将立即开始执行协程,直到该协程第一次阻塞。 " +"如果协程未发生阻塞即返回或引发异常,任务将主动结束并将跳过向事件循环添加计划任务。" + +#: ../../library/asyncio-task.rst:1233 +msgid "Added support for the :mod:`contextvars` module." +msgstr "加入对 :mod:`contextvars` 模块的支持。" + +#: ../../library/asyncio-task.rst:1239 +msgid "" +"Deprecation warning is emitted if *loop* is not specified and there is no " +"running event loop." +msgstr "如果未指定 *loop* 并且没有正在运行的事件循环则会发出弃用警告。" + +#: ../../library/asyncio-task.rst:1246 +msgid "Added the *eager_start* parameter." +msgstr "增加了 *eager_start* 形参。" + +#: ../../library/asyncio-task.rst:1251 +msgid "Return ``True`` if the Task is *done*." +msgstr "如果 Task 对象 *已完成* 则返回 ``True``。" + +#: ../../library/asyncio-task.rst:1253 +msgid "" +"A Task is *done* when the wrapped coroutine either returned a value, raised " +"an exception, or the Task was cancelled." +msgstr "当 Task 所封包的协程返回一个值、引发一个异常或 Task 本身被取消时,则会被认为 *已完成*。" + +#: ../../library/asyncio-task.rst:1258 +msgid "Return the result of the Task." +msgstr "返回 Task 的结果。" + +#: ../../library/asyncio-task.rst:1260 +msgid "" +"If the Task is *done*, the result of the wrapped coroutine is returned (or " +"if the coroutine raised an exception, that exception is re-raised.)" +msgstr "如果 Task 对象 *已完成*,其封包的协程的结果会被返回 (或者当协程引发异常时,该异常会被重新引发。)" + +#: ../../library/asyncio-task.rst:1264 ../../library/asyncio-task.rst:1278 +msgid "" +"If the Task has been *cancelled*, this method raises a :exc:`CancelledError`" +" exception." +msgstr "如果 Task 对象 *被取消*,此方法会引发一个 :exc:`CancelledError` 异常。" + +#: ../../library/asyncio-task.rst:1267 +msgid "" +"If the Task's result isn't yet available, this method raises an " +":exc:`InvalidStateError` exception." +msgstr "如果 Task 对象的结果还不可用,此方法会引发一个 :exc:`InvalidStateError` 异常。" + +#: ../../library/asyncio-task.rst:1272 +msgid "Return the exception of the Task." +msgstr "返回 Task 对象的异常。" + +#: ../../library/asyncio-task.rst:1274 +msgid "" +"If the wrapped coroutine raised an exception that exception is returned. If" +" the wrapped coroutine returned normally this method returns ``None``." +msgstr "如果所封包的协程引发了一个异常,该异常将被返回。如果所封包的协程正常返回则该方法将返回 ``None``。" + +#: ../../library/asyncio-task.rst:1281 +msgid "" +"If the Task isn't *done* yet, this method raises an :exc:`InvalidStateError`" +" exception." +msgstr "如果 Task 对象尚未 *完成*,此方法将引发一个 :exc:`InvalidStateError` 异常。" + +#: ../../library/asyncio-task.rst:1286 +msgid "Add a callback to be run when the Task is *done*." +msgstr "添加一个回调,将在 Task 对象 *完成* 时被运行。" + +#: ../../library/asyncio-task.rst:1288 ../../library/asyncio-task.rst:1297 +msgid "This method should only be used in low-level callback-based code." +msgstr "此方法应该仅在低层级的基于回调的代码中使用。" + +#: ../../library/asyncio-task.rst:1290 +msgid "" +"See the documentation of :meth:`Future.add_done_callback` for more details." +msgstr "要了解更多细节请查看 :meth:`Future.add_done_callback` 的文档。" + +#: ../../library/asyncio-task.rst:1295 +msgid "Remove *callback* from the callbacks list." +msgstr "从回调列表中移除 *callback* 。" + +#: ../../library/asyncio-task.rst:1299 +msgid "" +"See the documentation of :meth:`Future.remove_done_callback` for more " +"details." +msgstr "要了解更多细节请查看 :meth:`Future.remove_done_callback` 的文档。" + +#: ../../library/asyncio-task.rst:1304 +msgid "Return the list of stack frames for this Task." +msgstr "返回此 Task 对象的栈框架列表。" + +#: ../../library/asyncio-task.rst:1306 +msgid "" +"If the wrapped coroutine is not done, this returns the stack where it is " +"suspended. If the coroutine has completed successfully or was cancelled, " +"this returns an empty list. If the coroutine was terminated by an exception," +" this returns the list of traceback frames." +msgstr "" +"如果所封包的协程未完成,这将返回其挂起所在的栈。如果协程已成功完成或被取消,这将返回一个空列表。如果协程被一个异常终止,这将返回回溯框架列表。" + +#: ../../library/asyncio-task.rst:1312 +msgid "The frames are always ordered from oldest to newest." +msgstr "框架总是按从旧到新排序。" + +#: ../../library/asyncio-task.rst:1314 +msgid "Only one stack frame is returned for a suspended coroutine." +msgstr "每个被挂起的协程只返回一个栈框架。" + +#: ../../library/asyncio-task.rst:1316 +msgid "" +"The optional *limit* argument sets the maximum number of frames to return; " +"by default all available frames are returned. The ordering of the returned " +"list differs depending on whether a stack or a traceback is returned: the " +"newest frames of a stack are returned, but the oldest frames of a traceback " +"are returned. (This matches the behavior of the traceback module.)" +msgstr "" +"可选的 *limit* " +"参数指定返回框架的数量上限;默认返回所有框架。返回列表的顺序要看是返回一个栈还是一个回溯:栈返回最新的框架,回溯返回最旧的框架。(这与 " +"traceback 模块的行为保持一致。)" + +#: ../../library/asyncio-task.rst:1325 +msgid "Print the stack or traceback for this Task." +msgstr "打印此 Task 对象的栈或回溯。" + +#: ../../library/asyncio-task.rst:1327 +msgid "" +"This produces output similar to that of the traceback module for the frames " +"retrieved by :meth:`get_stack`." +msgstr "此方法产生的输出类似于 traceback 模块通过 :meth:`get_stack` 所获取的框架。" + +#: ../../library/asyncio-task.rst:1330 +msgid "The *limit* argument is passed to :meth:`get_stack` directly." +msgstr "*limit* 参数会直接传递给 :meth:`get_stack`。" + +#: ../../library/asyncio-task.rst:1332 +msgid "" +"The *file* argument is an I/O stream to which the output is written; by " +"default output is written to :data:`sys.stdout`." +msgstr "*file* 参数是输出所写入的 I/O 流;在默认情况下输出会写入到 :data:`sys.stdout`。" + +#: ../../library/asyncio-task.rst:1337 +msgid "Return the coroutine object wrapped by the :class:`Task`." +msgstr "返回由 :class:`Task` 包装的协程对象。" + +#: ../../library/asyncio-task.rst:1341 +msgid "" +"This will return ``None`` for Tasks which have already completed eagerly. " +"See the :ref:`Eager Task Factory `." +msgstr "这对于已经主动完成的任务将返回 ``None``。参见 :ref:`主动任务工厂 `。" + +#: ../../library/asyncio-task.rst:1348 +msgid "Newly added eager task execution means result may be ``None``." +msgstr "新增加的主动任务执行意味着结果可能为 ``None``。" + +#: ../../library/asyncio-task.rst:1352 +msgid "" +"Return the :class:`contextvars.Context` object associated with the task." +msgstr "返回关联到该任务的 :class:`contextvars.Context` 对象。" + +#: ../../library/asyncio-task.rst:1359 +msgid "Return the name of the Task." +msgstr "返回 Task 的名称。" + +#: ../../library/asyncio-task.rst:1361 +msgid "" +"If no name has been explicitly assigned to the Task, the default asyncio " +"Task implementation generates a default name during instantiation." +msgstr "如果没有一个 Task 名称被显式地赋值,默认的 asyncio Task 实现会在实例化期间生成一个默认名称。" + +#: ../../library/asyncio-task.rst:1369 +msgid "Set the name of the Task." +msgstr "设置 Task 的名称。" + +#: ../../library/asyncio-task.rst:1371 +msgid "" +"The *value* argument can be any object, which is then converted to a string." +msgstr "*value* 参数可以为任意对象,它随后会被转换为字符串。" + +#: ../../library/asyncio-task.rst:1374 +msgid "" +"In the default Task implementation, the name will be visible in the " +":func:`repr` output of a task object." +msgstr "在默认的 Task 实现中,名称将在 Task 对象的 :func:`repr` 输出中可见。" + +#: ../../library/asyncio-task.rst:1381 +msgid "Request the Task to be cancelled." +msgstr "请求取消 Task 对象。" + +#: ../../library/asyncio-task.rst:1383 +msgid "" +"If the Task is already *done* or *cancelled*, return ``False``, otherwise, " +"return ``True``." +msgstr "如果该 Task 已经 *完成* 或 *取消*,则返回 ``False``,否则,将返回 ``True``。" + +#: ../../library/asyncio-task.rst:1386 +msgid "" +"The method arranges for a :exc:`CancelledError` exception to be thrown into " +"the wrapped coroutine on the next cycle of the event loop." +msgstr "该方法将安排在下一轮事件循环中将 :exc:`CancelledError` 异常抛出给被封包的协程。" + +#: ../../library/asyncio-task.rst:1389 +msgid "" +"The coroutine then has a chance to clean up or even deny the request by " +"suppressing the exception with a :keyword:`try` ... ... ``except " +"CancelledError`` ... :keyword:`finally` block. Therefore, unlike " +":meth:`Future.cancel`, :meth:`Task.cancel` does not guarantee that the Task " +"will be cancelled, although suppressing cancellation completely is not " +"common and is actively discouraged. Should the coroutine nevertheless " +"decide to suppress the cancellation, it needs to call :meth:`Task.uncancel` " +"in addition to catching the exception." +msgstr "" +"协程随后将有机会进行清理甚至通过 :keyword:`try` ... ... ``except CancelledError`` ... " +":keyword:`finally` 代码块抑制异常来拒绝请求。因此,不同于 :meth:`Future.cancel`, " +":meth:`Task.cancel` 不保证 Task 会被取消,虽然完全抑制撤销并不常见也很不建议这样做。 " +"但是如果协程决定要抑制撤销,那么它需要在捕获异常之外还调用 :meth:`Task.uncancel`。" + +#: ../../library/asyncio-task.rst:1399 +msgid "" +"If the Task being cancelled is currently awaiting on a future-like object, " +"that awaited object will also be cancelled. This cancellation propagates " +"down the entire chain of awaited objects." +msgstr "" + +#: ../../library/asyncio-task.rst:1403 +msgid "Added the *msg* parameter." +msgstr "增加了 *msg* 形参。" + +#: ../../library/asyncio-task.rst:1406 +msgid "" +"The ``msg`` parameter is propagated from cancelled task to its awaiter." +msgstr "``msg`` 形参将从被取消的任务传播到其等待方。" + +#: ../../library/asyncio-task.rst:1411 +msgid "" +"The following example illustrates how coroutines can intercept the " +"cancellation request::" +msgstr "以下示例演示了协程是如何侦听取消请求的::" + +#: ../../library/asyncio-task.rst:1414 +msgid "" +"async def cancel_me():\n" +" print('cancel_me(): before sleep')\n" +"\n" +" try:\n" +" # Wait for 1 hour\n" +" await asyncio.sleep(3600)\n" +" except asyncio.CancelledError:\n" +" print('cancel_me(): cancel sleep')\n" +" raise\n" +" finally:\n" +" print('cancel_me(): after sleep')\n" +"\n" +"async def main():\n" +" # Create a \"cancel_me\" Task\n" +" task = asyncio.create_task(cancel_me())\n" +"\n" +" # Wait for 1 second\n" +" await asyncio.sleep(1)\n" +"\n" +" task.cancel()\n" +" try:\n" +" await task\n" +" except asyncio.CancelledError:\n" +" print(\"main(): cancel_me is cancelled now\")\n" +"\n" +"asyncio.run(main())\n" +"\n" +"# Expected output:\n" +"#\n" +"# cancel_me(): before sleep\n" +"# cancel_me(): cancel sleep\n" +"# cancel_me(): after sleep\n" +"# main(): cancel_me is cancelled now" +msgstr "" +"async def cancel_me():\n" +" print('cancel_me(): before sleep')\n" +"\n" +" try:\n" +" # 等待 1 小时\n" +" await asyncio.sleep(3600)\n" +" except asyncio.CancelledError:\n" +" print('cancel_me(): cancel sleep')\n" +" raise\n" +" finally:\n" +" print('cancel_me(): after sleep')\n" +"\n" +"async def main():\n" +" # 创建一个 \"cancel_me\" 任务\n" +" task = asyncio.create_task(cancel_me())\n" +"\n" +" # 等待 1 秒\n" +" await asyncio.sleep(1)\n" +"\n" +" task.cancel()\n" +" try:\n" +" await task\n" +" except asyncio.CancelledError:\n" +" print(\"main(): cancel_me is cancelled now\")\n" +"\n" +"asyncio.run(main())\n" +"\n" +"# 预期的输出:\n" +"#\n" +"# cancel_me(): before sleep\n" +"# cancel_me(): cancel sleep\n" +"# cancel_me(): after sleep\n" +"# main(): cancel_me is cancelled now" + +#: ../../library/asyncio-task.rst:1450 +msgid "Return ``True`` if the Task is *cancelled*." +msgstr "如果 Task 对象 *被取消* 则返回 ``True``。" + +#: ../../library/asyncio-task.rst:1452 +msgid "" +"The Task is *cancelled* when the cancellation was requested with " +":meth:`cancel` and the wrapped coroutine propagated the " +":exc:`CancelledError` exception thrown into it." +msgstr "" +"当使用 :meth:`cancel` 发出取消请求时 Task 会被 *取消*,其封包的协程将传播被抛入的 :exc:`CancelledError` " +"异常。" + +#: ../../library/asyncio-task.rst:1458 +msgid "Decrement the count of cancellation requests to this Task." +msgstr "递减对此任务的取消请求计数。" + +#: ../../library/asyncio-task.rst:1460 +msgid "Returns the remaining number of cancellation requests." +msgstr "返回剩余的取消请求数量。" + +#: ../../library/asyncio-task.rst:1462 +msgid "" +"Note that once execution of a cancelled task completed, further calls to " +":meth:`uncancel` are ineffective." +msgstr "请注意一旦被取消的任务执行完成,继续调用 :meth:`uncancel` 将是无效的。" + +#: ../../library/asyncio-task.rst:1467 +msgid "" +"This method is used by asyncio's internals and isn't expected to be used by " +"end-user code. In particular, if a Task gets successfully uncancelled, this" +" allows for elements of structured concurrency like :ref:`taskgroups` and " +":func:`asyncio.timeout` to continue running, isolating cancellation to the " +"respective structured block. For example::" +msgstr "" +"此方法是供 asyncio 内部使用而不应被最终用户代码所使用。特别地,在一个 Task 成功地保持未取消状态的时候使用,这可以允许结构化的并发元素如 " +":ref:`taskgroups` 和 :func:`asyncio.timeout` 继续运行,将取消操作隔离在相应的结构化代码块中。例如::" + +#: ../../library/asyncio-task.rst:1474 +msgid "" +"async def make_request_with_timeout():\n" +" try:\n" +" async with asyncio.timeout(1):\n" +" # Structured block affected by the timeout:\n" +" await make_request()\n" +" await make_another_request()\n" +" except TimeoutError:\n" +" log(\"There was a timeout\")\n" +" # Outer code not affected by the timeout:\n" +" await unrelated_code()" +msgstr "" +"async def make_request_with_timeout():\n" +" try:\n" +" async with asyncio.timeout(1):\n" +" # 受超时影响的结构块:\n" +" await make_request()\n" +" await make_another_request()\n" +" except TimeoutError:\n" +" log(\"There was a timeout\")\n" +" # 不受超时影响的外层代码:\n" +" await unrelated_code()" + +#: ../../library/asyncio-task.rst:1485 +msgid "" +"While the block with ``make_request()`` and ``make_another_request()`` might" +" get cancelled due to the timeout, ``unrelated_code()`` should continue " +"running even in case of the timeout. This is implemented with " +":meth:`uncancel`. :class:`TaskGroup` context managers use :func:`uncancel` " +"in a similar fashion." +msgstr "" +"带有 ``make_request()`` 和 ``make_another_request()`` 的代码块可能因超时而被取消,而 " +"``unrelated_code()`` 应当在超时的情况下继续运行。这是通过 :meth:`uncancel` 实现的。 " +":class:`TaskGroup` 上下文管理器也会以类似的方式来使用 :func:`uncancel`。" + +#: ../../library/asyncio-task.rst:1491 +msgid "" +"If end-user code is, for some reason, suppressing cancellation by catching " +":exc:`CancelledError`, it needs to call this method to remove the " +"cancellation state." +msgstr "如果最终用户代码出于某种原因通过捕获 :exc:`CancelledError` 抑制撤销操作,那么它需要调用此方法来移除撤销状态。" + +#: ../../library/asyncio-task.rst:1495 +msgid "" +"When this method decrements the cancellation count to zero, the method " +"checks if a previous :meth:`cancel` call had arranged for " +":exc:`CancelledError` to be thrown into the task. If it hasn't been thrown " +"yet, that arrangement will be rescinded (by resetting the internal " +"``_must_cancel`` flag)." +msgstr "" +"当该方法将取消计数递减至零,该方法会检查之前的 :meth:`cancel` 调用是否已安排将 :exc:`CancelledError` " +"抛出到任务中。如果尚未抛出,则该安排将被撤销(通过重置内部的 ``_must_cancel`` 旗标)。" + +#: ../../library/asyncio-task.rst:1501 +msgid "Changed to rescind pending cancellation requests upon reaching zero." +msgstr "更改为在到达零值时撤回待处理的取消请求。" + +#: ../../library/asyncio-task.rst:1506 +msgid "" +"Return the number of pending cancellation requests to this Task, i.e., the " +"number of calls to :meth:`cancel` less the number of :meth:`uncancel` calls." +msgstr "返回对此 Task 的挂起请求次数,即对 :meth:`cancel` 的调用次数减去 :meth:`uncancel` 的调用次数。" + +#: ../../library/asyncio-task.rst:1510 +msgid "" +"Note that if this number is greater than zero but the Task is still " +"executing, :meth:`cancelled` will still return ``False``. This is because " +"this number can be lowered by calling :meth:`uncancel`, which can lead to " +"the task not being cancelled after all if the cancellation requests go down " +"to zero." +msgstr "" +"请注意如果该数字大于零但相应 Task 仍在执行,:meth:`cancelled` 仍将返回 ``False``。这是因为该数字可通过调用 " +":meth:`uncancel` 来减少,这会导致任务在取消请求降到零时尚未被取消。" + +#: ../../library/asyncio-task.rst:1516 +msgid "" +"This method is used by asyncio's internals and isn't expected to be used by " +"end-user code. See :meth:`uncancel` for more details." +msgstr "此方法是供 asyncio 内部使用而不应被最终用户代码所使用。请参阅 :meth:`uncancel` 了解详情。" diff --git a/library/asyncio.po b/library/asyncio.po new file mode 100644 index 0000000000..76255ecbcf --- /dev/null +++ b/library/asyncio.po @@ -0,0 +1,214 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/asyncio.rst:100 +msgid "High-level APIs" +msgstr "高层级 API" + +#: ../../library/asyncio.rst:113 +msgid "Low-level APIs" +msgstr "低层级 API" + +#: ../../library/asyncio.rst:124 +msgid "Guides and Tutorials" +msgstr "指南与教程" + +#: ../../library/asyncio.rst:2 +msgid ":mod:`!asyncio` --- Asynchronous I/O" +msgstr ":mod:`!asyncio` --- 异步 I/O" + +#: ../../library/asyncio.rst-1 +msgid "Hello World!" +msgstr "Hello World!" + +#: ../../library/asyncio.rst:13 +msgid "" +"import asyncio\n" +"\n" +"async def main():\n" +" print('Hello ...')\n" +" await asyncio.sleep(1)\n" +" print('... World!')\n" +"\n" +"asyncio.run(main())" +msgstr "" +"import asyncio\n" +"\n" +"async def main():\n" +" print('Hello ...')\n" +" await asyncio.sleep(1)\n" +" print('... World!')\n" +"\n" +"asyncio.run(main())" + +#: ../../library/asyncio.rst:22 +msgid "" +"asyncio is a library to write **concurrent** code using the **async/await** " +"syntax." +msgstr "asyncio 是用来编写 **并发** 代码的库,使用 **async/await** 语法。" + +#: ../../library/asyncio.rst:25 +msgid "" +"asyncio is used as a foundation for multiple Python asynchronous frameworks " +"that provide high-performance network and web-servers, database connection " +"libraries, distributed task queues, etc." +msgstr "asyncio 被用作多个 Python 异步框架的基础,这些框架提供高性能网络和网站服务,数据库连接库,分布式任务队列等等。" + +#: ../../library/asyncio.rst:29 +msgid "" +"asyncio is often a perfect fit for IO-bound and high-level **structured** " +"network code." +msgstr "asyncio 往往是构建 IO 密集型和高层级 **结构化** 网络代码的最佳选择。" + +#: ../../library/asyncio.rst:34 +msgid ":ref:`a-conceptual-overview-of-asyncio`" +msgstr ":ref:`a-conceptual-overview-of-asyncio`" + +#: ../../library/asyncio.rst:35 +msgid "Explanation of the fundamentals of asyncio." +msgstr "有关 asyncio 的基础介绍。" + +#: ../../library/asyncio.rst:37 +msgid "asyncio provides a set of **high-level** APIs to:" +msgstr "asyncio 提供一组 **高层级** API 用于:" + +#: ../../library/asyncio.rst:39 +msgid "" +":ref:`run Python coroutines ` concurrently and have full control " +"over their execution;" +msgstr "并发地 :ref:`运行 Python 协程 ` 并对其执行过程实现完全控制;" + +#: ../../library/asyncio.rst:42 +msgid "perform :ref:`network IO and IPC `;" +msgstr "执行 :ref:`网络 IO 和 IPC `;" + +#: ../../library/asyncio.rst:44 +msgid "control :ref:`subprocesses `;" +msgstr "控制 :ref:`子进程 `;" + +#: ../../library/asyncio.rst:46 +msgid "distribute tasks via :ref:`queues `;" +msgstr "通过 :ref:`队列 ` 分发任务;" + +#: ../../library/asyncio.rst:48 +msgid ":ref:`synchronize ` concurrent code;" +msgstr ":ref:`同步 ` 并发代码;" + +#: ../../library/asyncio.rst:50 +msgid "" +"Additionally, there are **low-level** APIs for *library and framework " +"developers* to:" +msgstr "此外,还有一些 **低层级** API 以支持 *库和框架的开发者* 实现:" + +#: ../../library/asyncio.rst:53 +msgid "" +"create and manage :ref:`event loops `, which provide " +"asynchronous APIs for :ref:`networking `, running " +":ref:`subprocesses `, handling :ref:`OS signals " +"`, etc;" +msgstr "" +"创建和管理 :ref:`事件循环 `,它提供用于 :ref:`连接网络 " +"`, 运行 :ref:`子进程 `, 处理 :ref:`OS 信号 " +"` 等功能的异步 API;" + +#: ../../library/asyncio.rst:58 +msgid "" +"implement efficient protocols using :ref:`transports `;" +msgstr "使用 :ref:`transports ` 实现高效率协议;" + +#: ../../library/asyncio.rst:61 +msgid "" +":ref:`bridge ` callback-based libraries and code with " +"async/await syntax." +msgstr "通过 async/await 语法 :ref:`桥接 ` 基于回调的库和代码。" + +#: ../../includes/wasm-notavail.rst:3 +msgid "Availability" +msgstr "适用范围" + +#: ../../includes/wasm-notavail.rst:5 +msgid "" +"This module does not work or is not available on WebAssembly. See " +":ref:`wasm-availability` for more information." +msgstr "此模块在 WebAssembly 平台上无效或不可用。请参阅 :ref:`wasm-availability` 了解详情。" + +#: ../../library/asyncio.rst:69 +msgid "asyncio REPL" +msgstr "asyncio REPL" + +#: ../../library/asyncio.rst:70 +msgid "" +"You can experiment with an ``asyncio`` concurrent context in the " +":term:`REPL`:" +msgstr "你可以在 :term:`REPL` 中尝试使用 ``asyncio`` 并发上下文:" + +#: ../../library/asyncio.rst:72 +msgid "" +"$ python -m asyncio\n" +"asyncio REPL ...\n" +"Use \"await\" directly instead of \"asyncio.run()\".\n" +"Type \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n" +">>> import asyncio\n" +">>> await asyncio.sleep(10, result='hello')\n" +"'hello'" +msgstr "" +"$ python -m asyncio\n" +"asyncio REPL ...\n" +"Use \"await\" directly instead of \"asyncio.run()\".\n" +"Type \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n" +">>> import asyncio\n" +">>> await asyncio.sleep(10, result='hello')\n" +"'hello'" + +#: ../../library/asyncio.rst:82 +msgid "" +"This REPL provides limited compatibility with :envvar:`PYTHON_BASIC_REPL`. " +"It is recommended that the default REPL is used for full functionality and " +"the latest features." +msgstr "" +"这个 REPL 提供了与 :envvar:`PYTHON_BASIC_REPL` 的有限兼容性。推荐使用默认的 REPL 以获得完整功能和最新特性。" + +#: ../../library/asyncio.rst:86 +msgid "" +"Raises an :ref:`auditing event ` ``cpython.run_stdin`` with no " +"arguments." +msgstr "引发一个不带参数的 :ref:`审计事件 ` ``cpython.run_stdin``。" + +#: ../../library/asyncio.rst:88 +msgid "(also 3.11.10, 3.10.15, 3.9.20, and 3.8.20) Emits audit events." +msgstr "(还有 3.11.10, 3.10.15, 3.9.20 和 3.8.20)将发出审计事件。" + +#: ../../library/asyncio.rst:91 +msgid "" +"Uses PyREPL if possible, in which case :envvar:`PYTHONSTARTUP` is also " +"executed. Emits audit events." +msgstr "如果可能则使用 PyREPL,在此情况下 :envvar:`PYTHONSTARTUP` 也会被执行。将发出审计事件。" + +#: ../../library/asyncio.rst:99 +msgid "Reference" +msgstr "参考" + +#: ../../library/asyncio.rst:133 +msgid "The source code for asyncio can be found in :source:`Lib/asyncio/`." +msgstr "asyncio 的源代码可以在 :source:`Lib/asyncio/` 中找到。" diff --git a/library/asyncore.po b/library/asyncore.po new file mode 100644 index 0000000000..c723178979 --- /dev/null +++ b/library/asyncore.po @@ -0,0 +1,47 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/asyncore.rst:2 +msgid ":mod:`!asyncore` --- Asynchronous socket handler" +msgstr ":mod:`!asyncore` --- 异步套接字处理器" + +#: ../../library/asyncore.rst:10 +msgid "" +"This module is no longer part of the Python standard library. It was " +":ref:`removed in Python 3.12 ` after being deprecated " +"in Python 3.6. The removal was decided in :pep:`594`." +msgstr "" +"此模块已不再是 Python 标准库的一部分。它在 Python 3.6 中被弃用后又在 :ref:`Python 3.12 中被移除 " +"`。移除计划是在 :pep:`594` 中确定的。" + +#: ../../library/asyncore.rst:14 +msgid "Applications should use the :mod:`asyncio` module instead." +msgstr "应用程序应当改用 :mod:`asyncio` 模块。" + +#: ../../library/asyncore.rst:16 +msgid "" +"The last version of Python that provided the :mod:`!asyncore` module was " +"`Python 3.11 `_." +msgstr "" +"提供 :mod:`!asyncore` 模块的最后一个 Python 版本是 `Python 3.11 " +"`_." diff --git a/library/atexit.po b/library/atexit.po new file mode 100644 index 0000000000..c014fb2105 --- /dev/null +++ b/library/atexit.po @@ -0,0 +1,236 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/atexit.rst:2 +msgid ":mod:`!atexit` --- Exit handlers" +msgstr ":mod:`!atexit` --- 退出处理器" + +#: ../../library/atexit.rst:12 +msgid "" +"The :mod:`!atexit` module defines functions to register and unregister " +"cleanup functions. Functions thus registered are automatically executed " +"upon normal interpreter termination. :mod:`!atexit` runs these functions in" +" the *reverse* order in which they were registered; if you register ``A``, " +"``B``, and ``C``, at interpreter termination time they will be run in the " +"order ``C``, ``B``, ``A``." +msgstr "" +":mod:`!atexit` 模块定义了用于注册和注销清理函数的函数。 这样注册的函数会在解释器正常终止时自动执行。 :mod:`!atexit` " +"会按这些函数的注册顺序 *反序* 运行它们;如果你注册了 ``A``, ``B`` 和 ``C``,则在解释器终止时它们将按 ``C``, ``B``," +" ``A`` 的顺序运行。" + +#: ../../library/atexit.rst:19 +msgid "" +"**Note:** The functions registered via this module are not called when the " +"program is killed by a signal not handled by Python, when a Python fatal " +"internal error is detected, or when :func:`os._exit` is called." +msgstr "" +"**注意:** 通过该模块注册的函数,在程序被未被 Python 捕获的信号杀死时并不会执行,在检测到 Python 内部致命错误以及调用了 " +":func:`os._exit` 时也不会执行。" + +#: ../../library/atexit.rst:23 +msgid "" +"**Note:** The effect of registering or unregistering functions from within a" +" cleanup function is undefined." +msgstr "**注意:** 在清理函数内部注册或注销函数可能产生的影响是未定义的。" + +#: ../../library/atexit.rst:26 +msgid "" +"When used with C-API subinterpreters, registered functions are local to the " +"interpreter they were registered in." +msgstr "当配合 C-API 子解释器使用时,已注册函数是它们所注册解释器中的局部对象。" + +#: ../../library/atexit.rst:32 +msgid "" +"Register *func* as a function to be executed at termination. Any optional " +"arguments that are to be passed to *func* must be passed as arguments to " +":func:`register`. It is possible to register the same function and " +"arguments more than once." +msgstr "" +"将 *func* 注册为终止时执行的函数。任何传给 *func* 的可选的参数都应当作为参数传给 :func:`register`. " +"可以多次注册同样的函数及参数。" + +#: ../../library/atexit.rst:37 +msgid "" +"At normal program termination (for instance, if :func:`sys.exit` is called " +"or the main module's execution completes), all functions registered are " +"called in last in, first out order. The assumption is that lower level " +"modules will normally be imported before higher level modules and thus must " +"be cleaned up later." +msgstr "" +"在正常的程序终止时 (举例来说,当调用了 :func:`sys.exit` 或是主模块的执行完成时), " +"所有注册过的函数都会以后进先出的顺序执行。这样做是假定更底层的模块通常会比高层模块更早引入,因此需要更晚清理。" + +#: ../../library/atexit.rst:43 +msgid "" +"If an exception is raised during execution of the exit handlers, a traceback" +" is printed (unless :exc:`SystemExit` is raised) and the exception " +"information is saved. After all exit handlers have had a chance to run, the" +" last exception to be raised is re-raised." +msgstr "" +"如果在 exit 处理器执行期间引发了异常,将会打印回溯信息 (除非引发的是 :exc:`SystemExit`) 并且异常信息会被保存。在所有 " +"exit 处理器都获得运行机会之后,所引发的最后一个异常会被重新引发。" + +#: ../../library/atexit.rst:48 +msgid "" +"This function returns *func*, which makes it possible to use it as a " +"decorator." +msgstr "这个函数返回 *func* 对象,可以把它当作装饰器使用。" + +#: ../../library/atexit.rst:52 +msgid "" +"Starting new threads or calling :func:`os.fork` from a registered function " +"can lead to race condition between the main Python runtime thread freeing " +"thread states while internal :mod:`threading` routines or the new process " +"try to use that state. This can lead to crashes rather than clean shutdown." +msgstr "" +"启动新线程或从已注册的函数调用 :func:`os.fork` 可能导致主 Python 运行时线程释放线程状态而内部 :mod:`threading`" +" 例程或新进程试图使用该状态之间的竞争条件。这会造成程序崩溃而不是正常关闭。" + +#: ../../library/atexit.rst:58 +msgid "" +"Attempts to start a new thread or :func:`os.fork` a new process in a " +"registered function now leads to :exc:`RuntimeError`." +msgstr "现在尝试启动新线程或在已注册的函数中 :func:`os.fork` 新进程会导致 :exc:`RuntimeError`。" + +#: ../../library/atexit.rst:64 +msgid "" +"Remove *func* from the list of functions to be run at interpreter shutdown. " +":func:`unregister` silently does nothing if *func* was not previously " +"registered. If *func* has been registered more than once, every occurrence " +"of that function in the :mod:`!atexit` call stack will be removed. Equality" +" comparisons (``==``) are used internally during unregistration, so function" +" references do not need to have matching identities." +msgstr "" +"将 *func* 移出当解释器关闭时要运行的函数列表。 如果 *func* 之前未被注册则 :func:`unregister` 将静默地不做任何事。 " +"如果 *func* 已被注册一次以上,则该函数每次在 :mod:`!atexit` 调用栈中的出现都将被移除。 当取消注册时会在内部使用相等性比较 " +"(``==``),因而函数引用不需要具有匹配的标识号。" + +#: ../../library/atexit.rst:74 +msgid "Module :mod:`readline`" +msgstr "模块 :mod:`readline`" + +#: ../../library/atexit.rst:75 +msgid "" +"Useful example of :mod:`!atexit` to read and write :mod:`readline` history " +"files." +msgstr "使用 :mod:`!atexit` 读写 :mod:`readline` 历史文件的有用的例子。" + +#: ../../library/atexit.rst:82 +msgid ":mod:`!atexit` Example" +msgstr ":mod:`!atexit` 示例" + +#: ../../library/atexit.rst:84 +msgid "" +"The following simple example demonstrates how a module can initialize a " +"counter from a file when it is imported and save the counter's updated value" +" automatically when the program terminates without relying on the " +"application making an explicit call into this module at termination. ::" +msgstr "" +"以下简单例子演示了一个模块在被导入时如何从文件初始化一个计数器,并在程序终结时自动保存计数器的更新值,此操作不依赖于应用在终结时对此模块进行显式调用。 " +"::" + +#: ../../library/atexit.rst:89 +msgid "" +"try:\n" +" with open('counterfile') as infile:\n" +" _count = int(infile.read())\n" +"except FileNotFoundError:\n" +" _count = 0\n" +"\n" +"def incrcounter(n):\n" +" global _count\n" +" _count = _count + n\n" +"\n" +"def savecounter():\n" +" with open('counterfile', 'w') as outfile:\n" +" outfile.write('%d' % _count)\n" +"\n" +"import atexit\n" +"\n" +"atexit.register(savecounter)" +msgstr "" +"try:\n" +" with open('counterfile') as infile:\n" +" _count = int(infile.read())\n" +"except FileNotFoundError:\n" +" _count = 0\n" +"\n" +"def incrcounter(n):\n" +" global _count\n" +" _count = _count + n\n" +"\n" +"def savecounter():\n" +" with open('counterfile', 'w') as outfile:\n" +" outfile.write('%d' % _count)\n" +"\n" +"import atexit\n" +"\n" +"atexit.register(savecounter)" + +#: ../../library/atexit.rst:107 +msgid "" +"Positional and keyword arguments may also be passed to :func:`register` to " +"be passed along to the registered function when it is called::" +msgstr "位置和关键字参数也可传入 :func:`register` 以便传递给被调用的已注册函数::" + +#: ../../library/atexit.rst:110 +msgid "" +"def goodbye(name, adjective):\n" +" print('Goodbye %s, it was %s to meet you.' % (name, adjective))\n" +"\n" +"import atexit\n" +"\n" +"atexit.register(goodbye, 'Donny', 'nice')\n" +"# or:\n" +"atexit.register(goodbye, adjective='nice', name='Donny')" +msgstr "" +"def goodbye(name, adjective):\n" +" print('Goodbye %s, it was %s to meet you.' % (name, adjective))\n" +"\n" +"import atexit\n" +"\n" +"atexit.register(goodbye, 'Donny', 'nice')\n" +"# 或者:\n" +"atexit.register(goodbye, adjective='nice', name='Donny')" + +#: ../../library/atexit.rst:119 +msgid "Usage as a :term:`decorator`::" +msgstr "作为 :term:`decorator` 使用::" + +#: ../../library/atexit.rst:121 +msgid "" +"import atexit\n" +"\n" +"@atexit.register\n" +"def goodbye():\n" +" print('You are now leaving the Python sector.')" +msgstr "" +"import atexit\n" +"\n" +"@atexit.register\n" +"def goodbye():\n" +" print('You are now leaving the Python sector.')" + +#: ../../library/atexit.rst:127 +msgid "This only works with functions that can be called without arguments." +msgstr "只有在函数不需要任何参数调用时才能工作。" diff --git a/library/audioop.po b/library/audioop.po new file mode 100644 index 0000000000..60fc1db476 --- /dev/null +++ b/library/audioop.po @@ -0,0 +1,43 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/audioop.rst:2 +msgid ":mod:`!audioop` --- Manipulate raw audio data" +msgstr ":mod:`!audioop` --- 处理原始音频数据" + +#: ../../library/audioop.rst:10 +msgid "" +"This module is no longer part of the Python standard library. It was " +":ref:`removed in Python 3.13 ` after being deprecated in" +" Python 3.11. The removal was decided in :pep:`594`." +msgstr "" +"此模块已不再是 Python 标准库的一部分。它在 Python 3.11 中被弃用后又在 :ref:`Python 3.13 中被移除 " +"`。移除计划是在 :pep:`594` 确定的。" + +#: ../../library/audioop.rst:14 +msgid "" +"The last version of Python that provided the :mod:`!audioop` module was " +"`Python 3.12 `_." +msgstr "" +"提供 :mod:`!audioop` 模块的最后一个 Python 版本是 `Python 3.12 " +"`_." diff --git a/library/audit_events.po b/library/audit_events.po new file mode 100644 index 0000000000..86941da83d --- /dev/null +++ b/library/audit_events.po @@ -0,0 +1,143 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/audit_events.rst:6 +msgid "Audit events table" +msgstr "审计事件表" + +#: ../../library/audit_events.rst:8 +msgid "" +"This table contains all events raised by :func:`sys.audit` or " +":c:func:`PySys_Audit` calls throughout the CPython runtime and the standard " +"library. These calls were added in 3.8 or later (see :pep:`578`)." +msgstr "" +"下表包含了在整个 CPython 运行时和标准库中由 :func:`sys.audit` 或 :c:func:`PySys_Audit` " +"调用所引发的全部事件。这些调用是在 3.8 或更高版本中添加的 (参见 :pep:`578`)。" + +#: ../../library/audit_events.rst:12 +msgid "" +"See :func:`sys.addaudithook` and :c:func:`PySys_AddAuditHook` for " +"information on handling these events." +msgstr "" +"请参阅 :func:`sys.addaudithook` 和 :c:func:`PySys_AddAuditHook` 了解有关处理这些事件的详细信息。" + +#: ../../library/audit_events.rst:17 +msgid "" +"This table is generated from the CPython documentation, and may not " +"represent events raised by other implementations. See your runtime specific " +"documentation for actual events raised." +msgstr "此表是根据 CPython 文档生成的,可能无法表示其他实现所引发的事件。请参阅你的运行时专属的文档了解实际引发的事件。" + +#: ../../library/audit_events.rst:23 +msgid "" +"The following events are raised internally and do not correspond to any " +"public API of CPython:" +msgstr "下列事件只在内部被引发,不对应任何 CPython 公共 API:" + +#: ../../library/audit_events.rst:27 +msgid "Audit event" +msgstr "审计事件" + +#: ../../library/audit_events.rst:27 +msgid "Arguments" +msgstr "参数" + +#: ../../library/audit_events.rst:29 +msgid "_winapi.CreateFile" +msgstr "_winapi.CreateFile" + +#: ../../library/audit_events.rst:29 +msgid "" +"``file_name``, ``desired_access``, ``share_mode``, ``creation_disposition``," +" ``flags_and_attributes``" +msgstr "" +"``file_name``, ``desired_access``, ``share_mode``, ``creation_disposition``," +" ``flags_and_attributes``" + +#: ../../library/audit_events.rst:33 +msgid "_winapi.CreateJunction" +msgstr "_winapi.CreateJunction" + +#: ../../library/audit_events.rst:33 +msgid "``src_path``, ``dst_path``" +msgstr "``src_path``, ``dst_path``" + +#: ../../library/audit_events.rst:35 +msgid "_winapi.CreateNamedPipe" +msgstr "_winapi.CreateNamedPipe" + +#: ../../library/audit_events.rst:35 +msgid "``name``, ``open_mode``, ``pipe_mode``" +msgstr "``name``, ``open_mode``, ``pipe_mode``" + +#: ../../library/audit_events.rst:37 +msgid "_winapi.CreatePipe" +msgstr "_winapi.CreatePipe" + +#: ../../library/audit_events.rst:39 +msgid "_winapi.CreateProcess" +msgstr "_winapi.CreateProcess" + +#: ../../library/audit_events.rst:39 +msgid "``application_name``, ``command_line``, ``current_directory``" +msgstr "``application_name``, ``command_line``, ``current_directory``" + +#: ../../library/audit_events.rst:42 +msgid "_winapi.OpenProcess" +msgstr "_winapi.OpenProcess" + +#: ../../library/audit_events.rst:42 +msgid "``process_id``, ``desired_access``" +msgstr "``process_id``, ``desired_access``" + +#: ../../library/audit_events.rst:44 +msgid "_winapi.TerminateProcess" +msgstr "_winapi.TerminateProcess" + +#: ../../library/audit_events.rst:44 +msgid "``handle``, ``exit_code``" +msgstr "``handle``, ``exit_code``" + +#: ../../library/audit_events.rst:46 +msgid "_posixsubprocess.fork_exec" +msgstr "_posixsubprocess.fork_exec" + +#: ../../library/audit_events.rst:46 +msgid "``exec_list``, ``args``, ``env``" +msgstr "``exec_list``, ``args``, ``env``" + +#: ../../library/audit_events.rst:48 +msgid "ctypes.PyObj_FromPtr" +msgstr "ctypes.PyObj_FromPtr" + +#: ../../library/audit_events.rst:48 +msgid "``obj``" +msgstr "``obj``" + +#: ../../library/audit_events.rst:51 +msgid "The ``_posixsubprocess.fork_exec`` internal audit event." +msgstr "``_posixsubprocess.fork_exec`` 内部审计事件。" + +#: ../../library/audit_events.rst:3 +msgid "audit events" +msgstr "审计事件" diff --git a/library/base64.po b/library/base64.po new file mode 100644 index 0000000000..ebce47d86d --- /dev/null +++ b/library/base64.po @@ -0,0 +1,568 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-17 15:44+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/base64.rst:2 +msgid ":mod:`!base64` --- Base16, Base32, Base64, Base85 Data Encodings" +msgstr ":mod:`!base64` --- Base16, Base32, Base64, Base85 数据编码" + +#: ../../library/base64.rst:8 +msgid "**Source code:** :source:`Lib/base64.py`" +msgstr "**源代码:** :source:`Lib/base64.py`" + +#: ../../library/base64.rst:16 +msgid "" +"This module provides functions for encoding binary data to printable ASCII " +"characters and decoding such encodings back to binary data. This includes " +"the :ref:`encodings specified in ` :rfc:`4648` (Base64, " +"Base32 and Base16), the :ref:`Base85 encoding ` specified in" +" `PDF 2.0 `_, and non-standard " +"variants of Base85 used elsewhere." +msgstr "" + +#: ../../library/base64.rst:24 +msgid "" +"There are two interfaces provided by this module. The modern interface " +"supports encoding :term:`bytes-like objects ` to ASCII " +":class:`bytes`, and decoding :term:`bytes-like objects ` " +"or strings containing ASCII to :class:`bytes`. Both base-64 alphabets " +"defined in :rfc:`4648` (normal, and URL- and filesystem-safe) are supported." +msgstr "" +"此模块提供了两个接口。较新的接口支持将 :term:`字节类对象 ` 编码为 ASCII " +":class:`bytes`,以及将 :term:`字节类对象 ` 或包含 ASCII 的字符串解码为 " +":class:`bytes`。在 :rfc:`4648` 中定义的几种 base-64 字母表(普通的以及 URL 和文件系统安全的)都受到支持。" + +#: ../../library/base64.rst:30 +msgid "" +"The :ref:`legacy interface ` does not support decoding from " +"strings, but it does provide functions for encoding and decoding to and from" +" :term:`file objects `. It only supports the Base64 standard " +"alphabet, and it adds newlines every 76 characters as per :rfc:`2045`. Note" +" that if you are looking for :rfc:`2045` support you probably want to be " +"looking at the :mod:`email` package instead." +msgstr "" +":ref:`旧式接口 ` 不支持对字符串的解码,但它提供了用于编码和解码 :term:`文件对象 ` 的函数。它只支持 Base64 标准字符表,并且按照 :rfc:`2045` 的规定会每 76 个字符增加一个换行符。 " +"请注意如果你要找 :rfc:`2045` 支持那么你可能应当改用 :mod:`email` 包。" + +#: ../../library/base64.rst:38 +msgid "" +"ASCII-only Unicode strings are now accepted by the decoding functions of the" +" modern interface." +msgstr "新的接口提供的解码函数现在已经支持只包含 ASCII 的 Unicode 字符串。" + +#: ../../library/base64.rst:42 +msgid "" +"Any :term:`bytes-like objects ` are now accepted by all " +"encoding and decoding functions in this module. Ascii85/Base85 support " +"added." +msgstr "" +"所有 :term:`类字节对象 ` 现在已经被所有编码和解码函数接受。添加了对 Ascii85/Base85 " +"的支持。" + +#: ../../library/base64.rst:50 +msgid "RFC 4648 Encodings" +msgstr "RFC 4648 编码格式" + +#: ../../library/base64.rst:52 +msgid "" +"The :rfc:`4648` encodings are suitable for encoding binary data so that it " +"can be safely sent by email, used as parts of URLs, or included as part of " +"an HTTP POST request." +msgstr "" +":rfc:`4648` 中的编码格式适用于编码二进制数据以便它能安全地通过电子邮件发送、用作 URL 的组成部分,或者包括在 HTTP POST " +"请求当中。" + +#: ../../library/base64.rst:58 +msgid "" +"Encode the :term:`bytes-like object` *s* using Base64 and return the encoded" +" :class:`bytes`." +msgstr "对 :term:`bytes-like object` *s* 进行 Base64 编码,并返回编码后的 :class:`bytes`。" + +#: ../../library/base64.rst:61 +msgid "" +"Optional *altchars* must be a :term:`bytes-like object` of length 2 which " +"specifies an alternative alphabet for the ``+`` and ``/`` characters. This " +"allows an application to e.g. generate URL or filesystem safe Base64 " +"strings. The default is ``None``, for which the standard Base64 alphabet is" +" used." +msgstr "" +"可选项 *altchars* 必须是一个长度为 2 的 :term:`bytes-like object`,它指定了用于替换 ``+`` 和 ``/``" +" 的字符表。这允许应用程序生成对 URL 或文件系统安全的 Base64 字符串。默认值为 ``None``,即使用标准 Base64 字符表。" + +#: ../../library/base64.rst:66 +msgid "" +"May assert or raise a :exc:`ValueError` if the length of *altchars* is not " +"2. Raises a :exc:`TypeError` if *altchars* is not a :term:`bytes-like " +"object`." +msgstr "" +"如果 *altchars* 的长度不为 2 则可以断言或引发 :exc:`ValueError`。如果 *altchars* 不是 " +":term:`bytes-like object` 则会引发 :exc:`TypeError`。" + +#: ../../library/base64.rst:72 +msgid "" +"Decode the Base64 encoded :term:`bytes-like object` or ASCII string *s* and " +"return the decoded :class:`bytes`." +msgstr "" +"解码 Base64 编码过的 :term:`bytes-like object` 或 ASCII 字符串 *s* 并返回解码过的 " +":class:`bytes`." + +#: ../../library/base64.rst:75 +msgid "" +"Optional *altchars* must be a :term:`bytes-like object` or ASCII string of " +"length 2 which specifies the alternative alphabet used instead of the ``+`` " +"and ``/`` characters." +msgstr "" +"可选项 *altchars* 必须是一个长度为 2 的 :term:`bytes-like object` 或 ASCII 字符串,它指定了用于替换 " +"``+`` 和 ``/`` 的字符表。" + +#: ../../library/base64.rst:79 +msgid "" +"A :exc:`binascii.Error` exception is raised if *s* is incorrectly padded." +msgstr "如果 *s* 被不正确地填充,将引发 :exc:`binascii.Error`。" + +#: ../../library/base64.rst:82 +msgid "" +"If *validate* is ``False`` (the default), characters that are neither in the" +" normal base-64 alphabet nor the alternative alphabet are discarded prior to" +" the padding check. If *validate* is ``True``, these non-alphabet " +"characters in the input result in a :exc:`binascii.Error`." +msgstr "" +"如果 *validate* 值为 ``False`` (默认情况),则在填充检查前,将丢弃既不在标准 base-64 " +"字母表之中也不在备用字母表中的字符。如果 *validate* 为 ``True``,这些非 base64 字符将导致 " +":exc:`binascii.Error`。" + +#: ../../library/base64.rst:88 +msgid "" +"For more information about the strict base64 check, see " +":func:`binascii.a2b_base64`" +msgstr "有关严格 base64 检查的详情,请参阅 :func:`binascii.a2b_base64`" + +#: ../../library/base64.rst:90 +msgid "" +"May assert or raise a :exc:`ValueError` if the length of *altchars* is not " +"2." +msgstr "如果 *altchars* 的长度不为 2 则可以断言或引发 :exc:`ValueError`。" + +#: ../../library/base64.rst:94 +msgid "" +"Encode :term:`bytes-like object` *s* using the standard Base64 alphabet and " +"return the encoded :class:`bytes`." +msgstr "" +"编码 :term:`bytes-like object` *s*,使用标准 Base64 字母表并返回编码过的 :class:`bytes`。" + +#: ../../library/base64.rst:100 +msgid "" +"Decode :term:`bytes-like object` or ASCII string *s* using the standard " +"Base64 alphabet and return the decoded :class:`bytes`." +msgstr "" +"解码 :term:`bytes-like object` 或 ASCII 字符串 *s*,使用标准 Base64 字母表并返回解码过的 " +":class:`bytes`." + +#: ../../library/base64.rst:106 +msgid "" +"Encode :term:`bytes-like object` *s* using the URL- and filesystem-safe " +"alphabet, which substitutes ``-`` instead of ``+`` and ``_`` instead of " +"``/`` in the standard Base64 alphabet, and return the encoded " +":class:`bytes`. The result can still contain ``=``." +msgstr "" +"编码 :term:`bytes-like object` *s*,使用 URL 与文件系统安全的字母表,使用 ``-`` 以及 ``_`` 代替标准 " +"Base64 字母表中的 ``+`` 和 ``/``。返回编码过的 :class:`bytes`。结果中可能包含 ``=``。" + +#: ../../library/base64.rst:115 +msgid "" +"Decode :term:`bytes-like object` or ASCII string *s* using the URL- and " +"filesystem-safe alphabet, which substitutes ``-`` instead of ``+`` and ``_``" +" instead of ``/`` in the standard Base64 alphabet, and return the decoded " +":class:`bytes`." +msgstr "" +"解码 :term:`bytes-like object` 或 ASCII 字符串 *s*,使用 URL 与文件系统安全的字母表,使用 ``-`` 以及 " +"``_`` 代替标准 Base64 字母表中的 ``+`` 和 ``/``。返回解码过的 :class:`bytes`。" + +#: ../../library/base64.rst:124 +msgid "" +"Encode the :term:`bytes-like object` *s* using Base32 and return the encoded" +" :class:`bytes`." +msgstr "用 Base32 编码 :term:`bytes-like object` *s* 并返回编码过的 :class:`bytes`。" + +#: ../../library/base64.rst:130 +msgid "" +"Decode the Base32 encoded :term:`bytes-like object` or ASCII string *s* and " +"return the decoded :class:`bytes`." +msgstr "" +"解码 Base32 编码过的 :term:`bytes-like object` 或 ASCII 字符串 *s* 并返回解码过的 " +":class:`bytes`." + +#: ../../library/base64.rst:133 ../../library/base64.rst:181 +msgid "" +"Optional *casefold* is a flag specifying whether a lowercase alphabet is " +"acceptable as input. For security purposes, the default is ``False``." +msgstr "可选的 *casefold* 是一个指定小写字母是否可接受为输入的标志。为了安全考虑,默认值为 ``False``。" + +#: ../../library/base64.rst:137 +msgid "" +":rfc:`4648` allows for optional mapping of the digit 0 (zero) to the letter " +"O (oh), and for optional mapping of the digit 1 (one) to either the letter I" +" (eye) or letter L (el). The optional argument *map01* when not ``None``, " +"specifies which letter the digit 1 should be mapped to (when *map01* is not " +"``None``, the digit 0 is always mapped to the letter O). For security " +"purposes the default is ``None``, so that 0 and 1 are not allowed in the " +"input." +msgstr "" +":rfc:`4648` 允许可以选择将数码 0 (zero) 映射为字母 O (oh),并可以选择将数码 1 (one) 映射为字母 I (eye) " +"或字母 L (el)。可选参数 *map01* 在不为 ``None`` 时,指定数码 1 应当映射为哪个字母 (当 *map01* 不为 " +"``None`` 时,数码 0 总是被映射为字母 O)。出于安全考虑其默认值为 ``None``,因而在输入中不允许 0 和 1。" + +#: ../../library/base64.rst:144 ../../library/base64.rst:185 +msgid "" +"A :exc:`binascii.Error` is raised if *s* is incorrectly padded or if there " +"are non-alphabet characters present in the input." +msgstr "如果 *s* 被错误地填充或输入中存在字母表之外的字符,将引发 :exc:`binascii.Error`。" + +#: ../../library/base64.rst:151 +msgid "" +"Similar to :func:`b32encode` but uses the Extended Hex Alphabet, as defined " +"in :rfc:`4648`." +msgstr "类似于 :func:`b32encode` 但是使用 Extended Hex Alphabet,如 :rfc:`4648` 所定义。" + +#: ../../library/base64.rst:159 +msgid "" +"Similar to :func:`b32decode` but uses the Extended Hex Alphabet, as defined " +"in :rfc:`4648`." +msgstr "类似于 :func:`b32decode` 但是使用 Extended Hex Alphabet,如 :rfc:`4648` 所定义。" + +#: ../../library/base64.rst:162 +msgid "" +"This version does not allow the digit 0 (zero) to the letter O (oh) and " +"digit 1 (one) to either the letter I (eye) or letter L (el) mappings, all " +"these characters are included in the Extended Hex Alphabet and are not " +"interchangeable." +msgstr "" +"这个版本不允许数字 0(零)与字母 O(oh)和数字 1(一)与字母 I(eye)或字母 L " +"(el)的映射,所有这些字符都包含在扩展的十六进制字母表中,不能互换。" + +#: ../../library/base64.rst:172 +msgid "" +"Encode the :term:`bytes-like object` *s* using Base16 and return the encoded" +" :class:`bytes`." +msgstr "用 Base16 编码 :term:`bytes-like object` *s* 并返回编码过的 :class:`bytes`。" + +#: ../../library/base64.rst:178 +msgid "" +"Decode the Base16 encoded :term:`bytes-like object` or ASCII string *s* and " +"return the decoded :class:`bytes`." +msgstr "" +"解码 Base16 编码过的 :term:`bytes-like object` 或 ASCII 字符串 *s* 并返回解码过的 " +":class:`bytes`." + +#: ../../library/base64.rst:192 +msgid "Base85 Encodings" +msgstr "Base85 编码格式" + +#: ../../library/base64.rst:194 +msgid "" +"Base85 encoding is a family of algorithms which represent four bytes using " +"five ASCII characters. Originally implemented in the Unix ``btoa(1)`` " +"utility, a version of it was later adopted by Adobe in the PostScript " +"language and is standardized in PDF 2.0 (ISO 32000-2). This version, in both" +" its ``btoa`` and PDF variants, is implemented by :func:`a85encode`." +msgstr "" + +#: ../../library/base64.rst:201 +msgid "" +"A separate version, using a different output character set, was defined as " +"an April Fool's joke in :rfc:`1924` but is now used by Git and other " +"software. This version is implemented by :func:`b85encode`." +msgstr "" + +#: ../../library/base64.rst:205 +msgid "" +"Finally, a third version, using yet another output character set designed " +"for safe inclusion in programming language strings, is defined by ZeroMQ and" +" implemented here by :func:`z85encode`." +msgstr "" + +#: ../../library/base64.rst:209 +msgid "" +"The functions present in this module differ in how they handle the " +"following:" +msgstr "" + +#: ../../library/base64.rst:211 +msgid "Whether to include and expect enclosing ``<~`` and ``~>`` markers." +msgstr "" + +#: ../../library/base64.rst:212 +msgid "Whether to fold the input into multiple lines." +msgstr "" + +#: ../../library/base64.rst:213 +msgid "The set of ASCII characters used for encoding." +msgstr "" + +#: ../../library/base64.rst:214 +msgid "Compact encodings of sequences of spaces and null bytes." +msgstr "" + +#: ../../library/base64.rst:215 +msgid "The encoding of zero-padding bytes applied to the input." +msgstr "" + +#: ../../library/base64.rst:217 +msgid "" +"Refer to the documentation of the individual functions for more information." +msgstr "请参阅每个函数的文档了解详情。" + +#: ../../library/base64.rst:221 +msgid "" +"Encode the :term:`bytes-like object` *b* using Ascii85 and return the " +"encoded :class:`bytes`." +msgstr "用 Ascii85 编码 :term:`bytes-like object` *b* 并返回编码过的 :class:`bytes`。" + +#: ../../library/base64.rst:224 +msgid "" +"*foldspaces* is an optional flag that uses the special short sequence 'y' " +"instead of 4 consecutive spaces (ASCII 0x20) as supported by 'btoa'. This " +"feature is not supported by the standard encoding used in PDF." +msgstr "" + +#: ../../library/base64.rst:228 +msgid "" +"*wrapcol* controls whether the output should have newline (``b'\\n'``) " +"characters added to it. If this is non-zero, each output line will be at " +"most this many characters long, excluding the trailing newline." +msgstr "" +"*wrapcol* 控制输出是否应当添加换行符 (``b'\\n'``)。如其为非零值,则每个输出行将只有该值所限定长度的字符数量,不包括末尾换行符。" + +#: ../../library/base64.rst:232 +msgid "" +"*pad* controls whether zero-padding applied to the end of the input is fully" +" retained in the output encoding, as done by ``btoa``, producing an exact " +"multiple of 5 bytes of output. This is not part of the standard encoding " +"used in PDF, as it does not preserve the length of the data." +msgstr "" + +#: ../../library/base64.rst:238 +msgid "" +"*adobe* controls whether the encoded byte sequence is framed with ``<~`` and" +" ``~>``, as in a PostScript base-85 string literal. Note that while " +"ASCII85Decode streams in PDF documents *must* be terminated with ``~>``, " +"they *must not* use a leading ``<~``." +msgstr "" + +#: ../../library/base64.rst:248 +msgid "" +"Decode the Ascii85 encoded :term:`bytes-like object` or ASCII string *b* and" +" return the decoded :class:`bytes`." +msgstr "" +"解码 Ascii85 编码过的 :term:`bytes-like object` 或 ASCII 字符串 *b* 并返回解码过的 " +":class:`bytes`." + +#: ../../library/base64.rst:251 +msgid "" +"*foldspaces* is a flag that specifies whether the 'y' short sequence should " +"be accepted as shorthand for 4 consecutive spaces (ASCII 0x20). This feature" +" is not supported by the standard Ascii85 encoding used in PDF and " +"PostScript." +msgstr "" + +#: ../../library/base64.rst:256 +msgid "" +"*adobe* controls whether the ``<~`` and ``~>`` markers are present. While " +"the leading ``<~`` is not required, the input must end with ``~>``, or a " +":exc:`ValueError` is raised." +msgstr "" + +#: ../../library/base64.rst:260 +msgid "" +"*ignorechars* should be a byte string containing characters to ignore from " +"the input. This should only contain whitespace characters, and by default " +"contains all whitespace characters in ASCII." +msgstr "*ignorechars* 应当是一个包含要从输入中忽略的字符的字节串。这应当只包含空白字符,并且默认包含 ASCII 中所有的空白字符。" + +#: ../../library/base64.rst:269 +msgid "" +"Encode the :term:`bytes-like object` *b* using base85 (as used in e.g. git-" +"style binary diffs) and return the encoded :class:`bytes`." +msgstr "" +"用 base85(如 git 风格的二进制 diff 数据所用格式)编码 :term:`bytes-like object` *b* 并返回编码后的 " +":class:`bytes`." + +#: ../../library/base64.rst:272 +msgid "" +"The input is padded with ``b'\\0'`` so its length is a multiple of 4 bytes " +"before encoding. If *pad* is true, all the resulting characters are " +"retained in the output, which will always be a multiple of 5 bytes, and thus" +" the length of the data may not be preserved on decoding." +msgstr "" + +#: ../../library/base64.rst:283 +msgid "" +"Decode the base85-encoded :term:`bytes-like object` or ASCII string *b* and " +"return the decoded :class:`bytes`." +msgstr "" + +#: ../../library/base64.rst:291 +msgid "" +"Encode the :term:`bytes-like object` *s* using Z85 (as used in ZeroMQ) and " +"return the encoded :class:`bytes`." +msgstr "" + +#: ../../library/base64.rst:294 +msgid "" +"The `ZeroMQ specification `_ requires the " +"length of Z85-encoded data to be a multiple of 5 bytes. To produce compliant" +" data frames, you must pad the input data to this function to a multiple of " +"4 bytes." +msgstr "" + +#: ../../library/base64.rst:304 +msgid "" +"Decode the Z85-encoded :term:`bytes-like object` or ASCII string *s* and " +"return the decoded :class:`bytes`." +msgstr "" + +#: ../../library/base64.rst:313 +msgid "Legacy Interface" +msgstr "旧式接口" + +#: ../../library/base64.rst:317 +msgid "" +"Decode the contents of the binary *input* file and write the resulting " +"binary data to the *output* file. *input* and *output* must be :term:`file " +"objects `. *input* will be read until ``input.readline()`` " +"returns an empty bytes object." +msgstr "" +"解码二进制 *input* 文件的内容并将结果二进制数据写入 *output* 文件。 *input* 和 *output* 必须为 " +":term:`文件对象 `. *input* 将被读取直至 ``input.readline()`` 返回空字节串对象。" + +#: ../../library/base64.rst:325 +msgid "" +"Decode the :term:`bytes-like object` *s*, which must contain one or more " +"lines of base64 encoded data, and return the decoded :class:`bytes`." +msgstr "" +"解码 :term:`bytes-like object` *s*,该对象必须包含一行或多行 base64 编码的数据,并返回已解码的 " +":class:`bytes`." + +#: ../../library/base64.rst:333 +msgid "" +"Encode the contents of the binary *input* file and write the resulting " +"base64 encoded data to the *output* file. *input* and *output* must be " +":term:`file objects `. *input* will be read until " +"``input.read()`` returns an empty bytes object. :func:`encode` inserts a " +"newline character (``b'\\n'``) after every 76 bytes of the output, as well " +"as ensuring that the output always ends with a newline, as per :rfc:`2045` " +"(MIME)." +msgstr "" +"编码二进制 *input* 文件的内容并将经 base64 编码的数据写入 *output* 文件。 *input* 和 *output* 必须为 " +":term:`文件对象 `。 *input* 将被读取直到 ``input.read()`` 返回空字节串对象。 " +":func:`encode` 会在每输出 76 个字节之后插入一个换行符 (``b'\\n'``),并会确保输出总是以换行符来结束,如 " +":rfc:`2045` (MIME) 所规定的那样。" + +#: ../../library/base64.rst:343 +msgid "" +"Encode the :term:`bytes-like object` *s*, which can contain arbitrary binary" +" data, and return :class:`bytes` containing the base64-encoded data, with " +"newlines (``b'\\n'``) inserted after every 76 bytes of output, and ensuring " +"that there is a trailing newline, as per :rfc:`2045` (MIME)." +msgstr "" +"编码 :term:`bytes-like object` *s*,其中可以包含任意二进制数据,并返回包含经 base64 编码数据的 " +":class:`bytes`,每输出 76 个字节之后将带一个换行符 (``b'\\n'``),并会确保在末尾也有一个换行符,如 :rfc:`2045`" +" (MIME) 所规定的那样。" + +#: ../../library/base64.rst:351 +msgid "An example usage of the module:" +msgstr "此模块的一个使用示例:" + +#: ../../library/base64.rst:364 +msgid "Security Considerations" +msgstr "安全考量" + +#: ../../library/base64.rst:366 +msgid "" +"A new security considerations section was added to :rfc:`4648` (section 12);" +" it's recommended to review the security section for any code deployed to " +"production." +msgstr "在 :rfc:`4648` 中新增了安全事项部分(第 12 节);对于要部署到生产环境的任何代码都建议充分考虑此安全事项部分。" + +#: ../../library/base64.rst:371 +msgid "Module :mod:`binascii`" +msgstr "模块 :mod:`binascii`" + +#: ../../library/base64.rst:372 +msgid "" +"Support module containing ASCII-to-binary and binary-to-ASCII conversions." +msgstr "支持模块,包含 ASCII 到二进制和二进制到 ASCII 转换。" + +#: ../../library/base64.rst:374 +msgid "" +":rfc:`1521` - MIME (Multipurpose Internet Mail Extensions) Part One: " +"Mechanisms for Specifying and Describing the Format of Internet Message " +"Bodies" +msgstr "" +":rfc:`1521` - MIME (Multipurpose Internet Mail Extensions) " +"第一部分:规定并描述因特网消息体的格式的机制。" + +#: ../../library/base64.rst:375 +msgid "" +"Section 5.2, \"Base64 Content-Transfer-Encoding,\" provides the definition " +"of the base64 encoding." +msgstr "第 5.2 节,“Base64 内容转换编码格式”提供了 base64 编码格式的定义。" + +#: ../../library/base64.rst:378 +msgid "" +"`ISO 32000-2 Portable document format - Part 2: PDF 2.0 " +"`_" +msgstr "" + +#: ../../library/base64.rst:379 +msgid "" +"Section 7.4.3, \"ASCII85Decode Filter,\" provides the definition of the " +"Ascii85 encoding used in PDF and PostScript, including the output character " +"set and the details of data length preservation using zero-padding and " +"partial output groups." +msgstr "" + +#: ../../library/base64.rst:384 +msgid "`ZeroMQ RFC 32/Z85 `_" +msgstr "" + +#: ../../library/base64.rst:385 +msgid "" +"The \"Formal Specification\" section provides the character set used in Z85." +msgstr "" + +#: ../../library/base64.rst:10 +msgid "base64" +msgstr "base64" + +#: ../../library/base64.rst:10 +msgid "encoding" +msgstr "encoding" + +#: ../../library/base64.rst:10 +msgid "MIME" +msgstr "MIME" + +#: ../../library/base64.rst:10 +msgid "base64 encoding" +msgstr "base64 编码格式" diff --git a/library/bdb.po b/library/bdb.po new file mode 100644 index 0000000000..b66e4d4288 --- /dev/null +++ b/library/bdb.po @@ -0,0 +1,716 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:00+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/bdb.rst:2 +msgid ":mod:`!bdb` --- Debugger framework" +msgstr ":mod:`!bdb` --- 调试器框架" + +#: ../../library/bdb.rst:7 +msgid "**Source code:** :source:`Lib/bdb.py`" +msgstr "**源代码:** :source:`Lib/bdb.py`" + +#: ../../library/bdb.rst:11 +msgid "" +"The :mod:`!bdb` module handles basic debugger functions, like setting " +"breakpoints or managing execution via the debugger." +msgstr ":mod:`!bdb` 模块处理基本的调试器函数,例如设置中断点或通过调试器来管理执行。" + +#: ../../library/bdb.rst:14 +msgid "The following exception is defined:" +msgstr "定义了以下异常:" + +#: ../../library/bdb.rst:18 +msgid "Exception raised by the :class:`Bdb` class for quitting the debugger." +msgstr "由 :class:`Bdb` 类引发用于退出调试器的异常。" + +#: ../../library/bdb.rst:21 +msgid "The :mod:`!bdb` module also defines two classes:" +msgstr ":mod:`!bdb` 模块还定义了两个类:" + +#: ../../library/bdb.rst:25 +msgid "" +"This class implements temporary breakpoints, ignore counts, disabling and " +"(re-)enabling, and conditionals." +msgstr "这个类实现了临时性中断点、忽略计数、禁用与(重新)启用,以及条件设置等。" + +#: ../../library/bdb.rst:28 +msgid "" +"Breakpoints are indexed by number through a list called :attr:`bpbynumber` " +"and by ``(file, line)`` pairs through :attr:`bplist`. The former points to " +"a single instance of class :class:`Breakpoint`. The latter points to a list" +" of such instances since there may be more than one breakpoint per line." +msgstr "" +"中断点通过一个名为 :attr:`bpbynumber` 的列表基于数字并通过 :attr:`bplist` 基于 ``(file, line)`` " +"对进行索引。前者指向一个 :class:`Breakpoint` 类的单独实例。后者指向一个由这种实例组成的列表,因为在每一行中可能存在多个中断点。" + +#: ../../library/bdb.rst:33 +msgid "" +"When creating a breakpoint, its associated :attr:`file name ` should " +"be in canonical form. If a :attr:`funcname` is defined, a breakpoint " +":attr:`hit ` will be counted when the first line of that function is " +"executed. A :attr:`conditional ` breakpoint always counts a " +":attr:`hit `." +msgstr "" +"当创建一个中断点时,它所关联的 :attr:`文件名 ` 应当为规范形式。如果定义了 " +":attr:`funcname`,则当该函数的第一行被执行时将增加一次中断点 :attr:`命中 ` 次数。 :attr:`有条件的 " +"` 中断点将总是会计入 :attr:`命中 ` 次数。" + +#: ../../library/bdb.rst:39 +msgid ":class:`Breakpoint` instances have the following methods:" +msgstr ":class:`Breakpoint` 的实例具有下列方法:" + +#: ../../library/bdb.rst:43 +msgid "" +"Delete the breakpoint from the list associated to a file/line. If it is the" +" last breakpoint in that position, it also deletes the entry for the " +"file/line." +msgstr "从关联到文件/行的列表中删除此中断点。如果它是该位置上的最后一个中断点,还将删除相应的文件/行条目。" + +#: ../../library/bdb.rst:50 +msgid "Mark the breakpoint as enabled." +msgstr "将此中断点标记为启用。" + +#: ../../library/bdb.rst:55 +msgid "Mark the breakpoint as disabled." +msgstr "将此中断点标记为禁用。" + +#: ../../library/bdb.rst:60 +msgid "" +"Return a string with all the information about the breakpoint, nicely " +"formatted:" +msgstr "返回一个带有关于此中断点的所有信息的,格式良好的字符串:" + +#: ../../library/bdb.rst:63 +msgid "Breakpoint number." +msgstr "中断点编号。" + +#: ../../library/bdb.rst:64 +msgid "Temporary status (del or keep)." +msgstr "临时状态(删除或保留)。" + +#: ../../library/bdb.rst:65 +msgid "File/line position." +msgstr "文件/行位置。" + +#: ../../library/bdb.rst:66 +msgid "Break condition." +msgstr "中断条件" + +#: ../../library/bdb.rst:67 +msgid "Number of times to ignore." +msgstr "要忽略的次数。" + +#: ../../library/bdb.rst:68 +msgid "Number of times hit." +msgstr "命中的次数。" + +#: ../../library/bdb.rst:74 +msgid "" +"Print the output of :meth:`bpformat` to the file *out*, or if it is " +"``None``, to standard output." +msgstr "将 :meth:`bpformat` 的输出打印到文件 *out*,或者如果为 ``None`` 则打印到标准输出。" + +#: ../../library/bdb.rst:77 +msgid ":class:`Breakpoint` instances have the following attributes:" +msgstr ":class:`Breakpoint` 实例具有以下属性:" + +#: ../../library/bdb.rst:81 +msgid "File name of the :class:`Breakpoint`." +msgstr ":class:`Breakpoint` 的文件名。" + +#: ../../library/bdb.rst:85 +msgid "Line number of the :class:`Breakpoint` within :attr:`file`." +msgstr ":class:`Breakpoint` 在 :attr:`file` 中的行号。" + +#: ../../library/bdb.rst:89 +msgid "``True`` if a :class:`Breakpoint` at (file, line) is temporary." +msgstr "如果位于 (file, line) 的 :class:`Breakpoint` 是临时性的则返回 ``True``。" + +#: ../../library/bdb.rst:93 +msgid "Condition for evaluating a :class:`Breakpoint` at (file, line)." +msgstr "在 (file, line) 上对 :class:`Breakpoint` 求值的条件。" + +#: ../../library/bdb.rst:97 +msgid "" +"Function name that defines whether a :class:`Breakpoint` is hit upon " +"entering the function." +msgstr "用于定义在进入函数时一个 :class:`Breakpoint` 是否命中的函数的名称。" + +#: ../../library/bdb.rst:102 +msgid "``True`` if :class:`Breakpoint` is enabled." +msgstr "如果 :class:`Breakpoint` 被启用则返回 ``True``。" + +#: ../../library/bdb.rst:106 +msgid "Numeric index for a single instance of a :class:`Breakpoint`." +msgstr "一个 :class:`Breakpoint` 单独实例的数字索引。" + +#: ../../library/bdb.rst:110 +msgid "" +"Dictionary of :class:`Breakpoint` instances indexed by (:attr:`file`, " +":attr:`line`) tuples." +msgstr "以 (:attr:`file`, :attr:`line`) 元组作为索引的 :class:`Breakpoint` 实例的字典。" + +#: ../../library/bdb.rst:115 +msgid "Number of times to ignore a :class:`Breakpoint`." +msgstr "忽略一个 :class:`Breakpoint` 的次数。" + +#: ../../library/bdb.rst:119 +msgid "Count of the number of times a :class:`Breakpoint` has been hit." +msgstr "命中一个 :class:`Breakpoint` 的次数统计。" + +#: ../../library/bdb.rst:123 +msgid "The :class:`Bdb` class acts as a generic Python debugger base class." +msgstr ":class:`Bdb` 类是作为通用的 Python 调试器基类。" + +#: ../../library/bdb.rst:125 +msgid "" +"This class takes care of the details of the trace facility; a derived class " +"should implement user interaction. The standard debugger class " +"(:class:`pdb.Pdb`) is an example." +msgstr "这个类负责追踪工具的细节;所派生的类应当实现用户交互。标准调试器类 (:class:`pdb.Pdb`) 就是一个例子。" + +#: ../../library/bdb.rst:129 +msgid "" +"The *skip* argument, if given, must be an iterable of glob-style module name" +" patterns. The debugger will not step into frames that originate in a " +"module that matches one of these patterns. Whether a frame is considered to " +"originate in a certain module is determined by the ``__name__`` in the frame" +" globals." +msgstr "" +"如果给出了 *skip* 参数,它必须是一个包含 glob 风格的模块名称模式的可迭代对象。调试器将不会步进到来自与这些模式相匹配的模块的帧。 " +"一个帧是否会被视为来自特定的模块是由帧的 ``__name__`` 全局变量来确定的。" + +#: ../../library/bdb.rst:135 +msgid "" +"The *backend* argument specifies the backend to use for :class:`Bdb`. It can" +" be either ``'settrace'`` or ``'monitoring'``. ``'settrace'`` uses " +":func:`sys.settrace` which has the best backward compatibility. The " +"``'monitoring'`` backend uses the new :mod:`sys.monitoring` that was " +"introduced in Python 3.12, which can be much more efficient because it can " +"disable unused events. We are trying to keep the exact interfaces for both " +"backends, but there are some differences. The debugger developers are " +"encouraged to use the ``'monitoring'`` backend to achieve better " +"performance." +msgstr "" +"*backend* 参数指定用于 :class:`Bdb` 的后端。它可以是 ``'settrace'`` 或 ``'monitoring'``。 " +"``'settrace'`` 使用 :func:`sys.settrace`,它具有最佳的向后兼容性。``'monitoring'`` 后端使用 " +"Python 3.12 中引入的新的 :mod:`sys.monitoring` 模块,它可以更高效,因为它可以禁用未使用的事件。 " +"我们正试图为两个后端保留确切的接口,但存在一些差异。我们鼓励调试器开发人员使用 ``'monitoring'`` 后端来实现更好的性能。" + +#: ../../library/bdb.rst:145 +msgid "Added the *skip* parameter." +msgstr "增加了 *skip* 形参。" + +#: ../../library/bdb.rst:148 +msgid "Added the *backend* parameter." +msgstr "增加了 *backend* 形参。" + +#: ../../library/bdb.rst:151 +msgid "" +"The following methods of :class:`Bdb` normally don't need to be overridden." +msgstr ":class:`Bdb` 的以下方法通常不需要被重写。" + +#: ../../library/bdb.rst:155 +msgid "Return canonical form of *filename*." +msgstr "返回 *filename* 的规范形式。" + +#: ../../library/bdb.rst:157 +msgid "" +"For real file names, the canonical form is an operating-system-dependent, " +":func:`case-normalized ` :func:`absolute path " +"`. A *filename* with angle brackets, such as " +"``\"\"`` generated in interactive mode, is returned unchanged." +msgstr "" +"对于真实的文件名称,此规范形式是一个依赖于具体操作系统的,:func:`大小写规范的 ` :func:`绝对路径 " +"`。在交互模式下生成的带有尖括号的 *filename*,如 ``\"\"``,会被不加修改地返回。" + +#: ../../library/bdb.rst:164 +msgid "" +"Start tracing. For ``'settrace'`` backend, this method is equivalent to " +"``sys.settrace(self.trace_dispatch)``" +msgstr "" +"开始追踪。对于 ``'settrace'`` 后端,此方法等价于 ``sys.settrace(self.trace_dispatch)``" + +#: ../../library/bdb.rst:171 +msgid "" +"Stop tracing. For ``'settrace'`` backend, this method is equivalent to " +"``sys.settrace(None)``" +msgstr "停止追踪。对于 ``'settrace'`` 后端,此方法等价于 ``sys.settrace(None)``。" + +#: ../../library/bdb.rst:178 +msgid "" +"Set the :attr:`!botframe`, :attr:`!stopframe`, :attr:`!returnframe` and " +":attr:`quitting ` attributes with values ready to start " +"debugging." +msgstr "" +"将 :attr:`!botframe`, :attr:`!stopframe`, :attr:`!returnframe` 和 " +":attr:`quitting ` 属性设为准备开始调试的值。" + +#: ../../library/bdb.rst:183 +msgid "" +"This function is installed as the trace function of debugged frames. Its " +"return value is the new trace function (in most cases, that is, itself)." +msgstr "此函数被安装为被调试帧的追踪函数。它的返回值是新的追踪函数(在大多数情况下就是它自身)。" + +#: ../../library/bdb.rst:186 +msgid "" +"The default implementation decides how to dispatch a frame, depending on the" +" type of event (passed as a string) that is about to be executed. *event* " +"can be one of the following:" +msgstr "默认实现会决定如何分派帧,这取决于即将被执行的事件的类型(作为字符串传入)。 *event* 可以是下列值之一:" + +#: ../../library/bdb.rst:190 +msgid "``\"line\"``: A new line of code is going to be executed." +msgstr "``\"line\"``: 一个新的代码行即将被执行。" + +#: ../../library/bdb.rst:191 +msgid "" +"``\"call\"``: A function is about to be called, or another code block " +"entered." +msgstr "``\"call\"``: 一个函数即将被调用,或者进入了另一个代码块。" + +#: ../../library/bdb.rst:193 +msgid "``\"return\"``: A function or other code block is about to return." +msgstr "``\"return\"``: 一个函数或其他代码块即将返回。" + +#: ../../library/bdb.rst:194 +msgid "``\"exception\"``: An exception has occurred." +msgstr "``\"exception\"``: 一个异常已发生。" + +#: ../../library/bdb.rst:196 +msgid "For all the events, specialized functions (see below) are called." +msgstr "" + +#: ../../library/bdb.rst:198 +msgid "The *arg* parameter depends on the previous event." +msgstr "*arg* 形参取决于之前的事件。" + +#: ../../library/bdb.rst:200 +msgid "" +"See the documentation for :func:`sys.settrace` for more information on the " +"trace function. For more information on code and frame objects, refer to " +":ref:`types`." +msgstr "请参阅 :func:`sys.settrace` 的文档了解追踪函数的更多信息。对于代码和帧对象的详情,请参考 :ref:`types`。" + +#: ../../library/bdb.rst:206 +msgid "" +"If the debugger should stop on the current line, invoke the " +":meth:`user_line` method (which should be overridden in subclasses). Raise a" +" :exc:`BdbQuit` exception if the :attr:`quitting ` flag is " +"set (which can be set from :meth:`user_line`). Return a reference to the " +":meth:`trace_dispatch` method for further tracing in that scope." +msgstr "" +"如果调试器应该在当前行上停止,则唤起 :meth:`user_line` 方法(该方法应当在子类中被重写)。如果设置了 :attr:`quitting" +" ` 旗标(可通过 :meth:`user_line` 来设置)则将引发 :exc:`BdbQuit` 异常。返回一个对 " +":meth:`trace_dispatch` 方法的引用以便在该作用域内进一步地追踪。" + +#: ../../library/bdb.rst:214 +msgid "" +"If the debugger should stop on this function call, invoke the " +":meth:`user_call` method (which should be overridden in subclasses). Raise a" +" :exc:`BdbQuit` exception if the :attr:`quitting ` flag is " +"set (which can be set from :meth:`user_call`). Return a reference to the " +":meth:`trace_dispatch` method for further tracing in that scope." +msgstr "" +"如果调试器应该在此函数调用上停止,则唤起 :meth:`user_call` 方法(该方法应当在子类中被重写)。如果设置了 " +":attr:`quitting ` 旗标(可通过 :meth:`user_call` 来设置)则将引发 " +":exc:`BdbQuit` 异常。返回一个对 :meth:`trace_dispatch` 方法的引用以便在该作用域内进一步地追踪。" + +#: ../../library/bdb.rst:222 +msgid "" +"If the debugger should stop on this function return, invoke the " +":meth:`user_return` method (which should be overridden in subclasses). Raise" +" a :exc:`BdbQuit` exception if the :attr:`quitting ` flag is " +"set (which can be set from :meth:`user_return`). Return a reference to the " +":meth:`trace_dispatch` method for further tracing in that scope." +msgstr "" +"如果调试器应当在此函数返回时停止,则唤起 :meth:`user_return` 方法(该方法应当在子类中被重写)。如果设置了 " +":attr:`quitting ` 旗标(可通过 :meth:`user_return` 来设置)则将引发 " +":exc:`BdbQuit` 异常。返回一个对 :meth:`trace_dispatch` 方法的引用以便在该作用域内进一步地追踪。" + +#: ../../library/bdb.rst:230 +msgid "" +"If the debugger should stop at this exception, invokes the " +":meth:`user_exception` method (which should be overridden in subclasses). " +"Raise a :exc:`BdbQuit` exception if the :attr:`quitting ` " +"flag is set (which can be set from :meth:`user_exception`). Return a " +"reference to the :meth:`trace_dispatch` method for further tracing in that " +"scope." +msgstr "" +"如果调试器应当在此异常上停止,则唤起 :meth:`user_exception` 方法(该方法应当在子类中被重写)。如果设置了 " +":attr:`quitting ` 旗标(可通过 :meth:`user_exception` 设置)则将引发 " +":exc:`BdbQuit` 异常。返回一个对 :meth:`trace_dispatch` 方法的引用以便在该作用域内进一步地追踪。" + +#: ../../library/bdb.rst:236 +msgid "" +"Normally derived classes don't override the following methods, but they may " +"if they want to redefine the definition of stopping and breakpoints." +msgstr "通常情况下派生的类不会重写下列方法,但是如果想要重新定义停止和中断点的定义则可能会重写它们。" + +#: ../../library/bdb.rst:241 +msgid "Return ``True`` if *module_name* matches any skip pattern." +msgstr "如果 *module_name* 匹配到任何跳过模式则返回 ``True``。" + +#: ../../library/bdb.rst:245 +msgid "Return ``True`` if *frame* is below the starting frame in the stack." +msgstr "如果 *frame* 在栈的起始帧之下则返回 ``True``。" + +#: ../../library/bdb.rst:249 +msgid "Return ``True`` if there is an effective breakpoint for this line." +msgstr "如果该行有生效的中断点则返回 ``True``。" + +#: ../../library/bdb.rst:251 +msgid "" +"Check whether a line or function breakpoint exists and is in effect. Delete" +" temporary breakpoints based on information from :func:`effective`." +msgstr "检测某行或某函数是否存在中断点且处于生效状态。基于来自 :func:`effective` 的信息删除临时中断点。" + +#: ../../library/bdb.rst:256 +msgid "Return ``True`` if any breakpoint exists for *frame*'s filename." +msgstr "如果存在任何针对 *frame* 的文件名的中断点则返回 ``True``。" + +#: ../../library/bdb.rst:258 +msgid "" +"Derived classes should override these methods to gain control over debugger " +"operation." +msgstr "派生的类应当重写这些方法以获取调试器操作的控制权。" + +#: ../../library/bdb.rst:263 +msgid "" +"Called from :meth:`dispatch_call` if a break might stop inside the called " +"function." +msgstr "如果中断可能在被调用的函数内停止则会从 :meth:`dispatch_call` 来调用。" + +#: ../../library/bdb.rst:266 +msgid "" +"*argument_list* is not used anymore and will always be ``None``. The " +"argument is kept for backwards compatibility." +msgstr "*argument_list* 已不再使用并将始终为 ``None``。该参数被保留用于向下兼容。" + +#: ../../library/bdb.rst:271 +msgid "" +"Called from :meth:`dispatch_line` when either :meth:`stop_here` or " +":meth:`break_here` returns ``True``." +msgstr "" +"当 :meth:`stop_here` 或 :meth:`break_here` 返回 ``True`` 时则会从 " +":meth:`dispatch_line` 来调用。" + +#: ../../library/bdb.rst:276 +msgid "" +"Called from :meth:`dispatch_return` when :meth:`stop_here` returns ``True``." +msgstr "当 :meth:`stop_here` 返回 ``True`` 时则会从 :meth:`dispatch_return` 来调用。" + +#: ../../library/bdb.rst:280 +msgid "" +"Called from :meth:`dispatch_exception` when :meth:`stop_here` returns " +"``True``." +msgstr "当 :meth:`stop_here` 返回 ``True`` 时则会从 :meth:`dispatch_exception` 来调用。" + +#: ../../library/bdb.rst:285 +msgid "Handle how a breakpoint must be removed when it is a temporary one." +msgstr "处理当一个中断点属于临时性中断点时是否必须要移除它。" + +#: ../../library/bdb.rst:287 +msgid "This method must be implemented by derived classes." +msgstr "此方法必须由派生类来实现。" + +#: ../../library/bdb.rst:290 +msgid "" +"Derived classes and clients can call the following methods to affect the " +"stepping state." +msgstr "派生类与客户端可以调用以下方法来影响步进状态。" + +#: ../../library/bdb.rst:295 +msgid "Stop after one line of code." +msgstr "在一行代码之后停止。" + +#: ../../library/bdb.rst:299 +msgid "Stop on the next line in or below the given frame." +msgstr "在给定的帧以内或以下的下一行停止。" + +#: ../../library/bdb.rst:303 +msgid "Stop when returning from the given frame." +msgstr "当从给定的帧返回时停止。" + +#: ../../library/bdb.rst:307 +msgid "" +"Stop when the line with the *lineno* greater than the current one is reached" +" or when returning from current frame." +msgstr "当到达行号大于当前行的 *lineno* 行时,或者从当前帧返回时停止。" + +#: ../../library/bdb.rst:312 +msgid "" +"Start debugging from *frame*. If *frame* is not specified, debugging starts" +" from caller's frame." +msgstr "从 *frame* 开始调试。如果未指定 *frame*,则从调用者的帧开始调试。" + +#: ../../library/bdb.rst:315 +msgid "" +":func:`set_trace` will enter the debugger immediately, rather than on the " +"next line of code to be executed." +msgstr ":func:`set_trace` 将立即进入调试器,而不是在下一行要执行的代码上进入。" + +#: ../../library/bdb.rst:321 +msgid "" +"Stop only at breakpoints or when finished. If there are no breakpoints, set" +" the system trace function to ``None``." +msgstr "仅在中断点上或是当结束时停止。如果不存在中断点,则将系统追踪函数设为 ``None``。" + +#: ../../library/bdb.rst:328 +msgid "" +"Set the :attr:`!quitting` attribute to ``True``. This raises :exc:`BdbQuit`" +" in the next call to one of the :meth:`!dispatch_\\*` methods." +msgstr "" +"将 :attr:`!quitting` 属性设为 ``True``。这将在对某个 :meth:`!dispatch_\\*` 方法的下一次调用中引发 " +":exc:`BdbQuit`." + +#: ../../library/bdb.rst:332 +msgid "" +"Derived classes and clients can call the following methods to manipulate " +"breakpoints. These methods return a string containing an error message if " +"something went wrong, or ``None`` if all is well." +msgstr "" +"派生的类和客户端可以调用下列方法来操纵中断点。如果出现错误则这些方法将返回一个包含错误消息的字符串,或者如果一切正常则返回 ``None``。" + +#: ../../library/bdb.rst:338 +msgid "" +"Set a new breakpoint. If the *lineno* line doesn't exist for the *filename*" +" passed as argument, return an error message. The *filename* should be in " +"canonical form, as described in the :meth:`canonic` method." +msgstr "" +"设置一个新的中断点。如果对于作为参数传入的 *filename* 不存在 *lineno*,则返回一条错误消息。 *filename* " +"应为规范的形式,如在 :meth:`canonic` 方法中描述的。" + +#: ../../library/bdb.rst:344 +msgid "" +"Delete the breakpoints in *filename* and *lineno*. If none were set, return" +" an error message." +msgstr "删除位于 *filename* 和 *lineno* 的中断点。如果未设置过中断点,则返回一条错误消息。" + +#: ../../library/bdb.rst:349 +msgid "" +"Delete the breakpoint which has the index *arg* in the " +":attr:`Breakpoint.bpbynumber`. If *arg* is not numeric or out of range, " +"return an error message." +msgstr "" +"删除 :attr:`Breakpoint.bpbynumber` 中索引号为 *arg* 的中断点。如果 *arg* " +"不是数字或超出范围,则返回一条错误消息。" + +#: ../../library/bdb.rst:355 +msgid "" +"Delete all breakpoints in *filename*. If none were set, return an error " +"message." +msgstr "删除位于 *filename* 的所有中断点。如果未设置过中断点,则返回一条错误消息。" + +#: ../../library/bdb.rst:360 +msgid "" +"Delete all existing breakpoints. If none were set, return an error message." +msgstr "删除所有现存的中断点。如果未设置过中断点,则返回一条错误消息。" + +#: ../../library/bdb.rst:365 +msgid "" +"Return a breakpoint specified by the given number. If *arg* is a string, it" +" will be converted to a number. If *arg* is a non-numeric string, if the " +"given breakpoint never existed or has been deleted, a :exc:`ValueError` is " +"raised." +msgstr "" +"返回由指定数字所指明的中断点。如果 *arg* 是一个字符串,它将被转换为一个数字。如果 *arg* " +"不是一个表示数字的字符串,如果给定的中断点不存在或者已被删除,则会引发 :exc:`ValueError`。" + +#: ../../library/bdb.rst:374 +msgid "Return ``True`` if there is a breakpoint for *lineno* in *filename*." +msgstr "如果存在针对 *filename* 中 *lineno* 的中断点则返回 ``True``。" + +#: ../../library/bdb.rst:378 +msgid "" +"Return all breakpoints for *lineno* in *filename*, or an empty list if none " +"are set." +msgstr "返回 *filename* 中在 *lineno* 上的所有中断点,或者如果未设置任何中断点则返回一个空列表。" + +#: ../../library/bdb.rst:383 +msgid "" +"Return all breakpoints in *filename*, or an empty list if none are set." +msgstr "返回 *filename* 中的所有中断点,或者如果未设置任何中断点则返回一个空列表。" + +#: ../../library/bdb.rst:387 +msgid "Return all breakpoints that are set." +msgstr "返回已设置的所有中断点。" + +#: ../../library/bdb.rst:390 +msgid "" +"Derived classes and clients can call the following methods to disable and " +"restart events to achieve better performance. These methods only work when " +"using the ``'monitoring'`` backend." +msgstr "派生类和客户端可以调用以下方法来禁用和重新启动事件,以获得更好的性能。这些方法仅在使用 ``'monitoring'`` 后端时有效。" + +#: ../../library/bdb.rst:396 +msgid "" +"Disable the current event until the next time :func:`restart_events` is " +"called. This is helpful when the debugger is not interested in the current " +"line." +msgstr "禁用当前事件,直到下次调用 :func:`restart_events`。当调试器对当前行不感兴趣时,这很有帮助。" + +#: ../../library/bdb.rst:404 +msgid "" +"Restart all the disabled events. This function is automatically called in " +"``dispatch_*`` methods after ``user_*`` methods are called. If the " +"``dispatch_*`` methods are not overridden, the disabled events will be " +"restarted after each user interaction." +msgstr "" +"重新启动所有禁用的事件。在调用 ``user_*`` 方法后,在 ``dispatch_*`` 方法中会自动调用此函数。如果 " +"``dispatch_*`` 方法未被重写,则禁用的事件将在每次用户交互后重新启动。" + +#: ../../library/bdb.rst:412 +msgid "" +"Derived classes and clients can call the following methods to get a data " +"structure representing a stack trace." +msgstr "派生类与客户端可以调用以下方法来获取一个代表栈回溯信息的数据结构。" + +#: ../../library/bdb.rst:417 +msgid "Return a list of (frame, lineno) tuples in a stack trace, and a size." +msgstr "返回一个栈回溯中 (frame, lineno) 元组的列表,及一个大小值。" + +#: ../../library/bdb.rst:419 +msgid "" +"The most recently called frame is last in the list. The size is the number " +"of frames below the frame where the debugger was invoked." +msgstr "最近调用的帧将排在列表的末尾。大小值即调试器被唤起所在帧之下的帧数量。" + +#: ../../library/bdb.rst:424 +msgid "" +"Return a string with information about a stack entry, which is a ``(frame, " +"lineno)`` tuple. The return string contains:" +msgstr "返回一个字符串,其内容为有关以 ``(frame, lineno)`` 元组表示的特定栈条目的信息。返回的字符串包含:" + +#: ../../library/bdb.rst:427 +msgid "The canonical filename which contains the frame." +msgstr "包含该帧的规范文件名。" + +#: ../../library/bdb.rst:428 +msgid "The function name or ``\"\"``." +msgstr "函数名称或 ``\"\"``。" + +#: ../../library/bdb.rst:429 +msgid "The input arguments." +msgstr "输入参数。" + +#: ../../library/bdb.rst:430 +msgid "The return value." +msgstr "返回值。" + +#: ../../library/bdb.rst:431 +msgid "The line of code (if it exists)." +msgstr "代码的行(如果存在)。" + +#: ../../library/bdb.rst:434 +msgid "" +"The following two methods can be called by clients to use a debugger to " +"debug a :term:`statement`, given as a string." +msgstr "以下两个方法可由客户端调用以使用一个调试器来调试一条以字符串形式给出的 :term:`statement`。" + +#: ../../library/bdb.rst:439 +msgid "" +"Debug a statement executed via the :func:`exec` function. *globals* " +"defaults to :attr:`!__main__.__dict__`, *locals* defaults to *globals*." +msgstr "" +"调试一条通过 :func:`exec` 函数执行的语句。 *globals* 默认为 " +":attr:`!__main__.__dict__`,*locals* 默认为 *globals*。" + +#: ../../library/bdb.rst:444 +msgid "" +"Debug an expression executed via the :func:`eval` function. *globals* and " +"*locals* have the same meaning as in :meth:`run`." +msgstr "" +"调试一条通过 :func:`eval` 函数执行的表达式。 *globals* 和 *locals* 的含义与在 :meth:`run` 中的相同。" + +#: ../../library/bdb.rst:449 +msgid "For backwards compatibility. Calls the :meth:`run` method." +msgstr "为了保证向下兼容性。调用 :meth:`run` 方法。" + +#: ../../library/bdb.rst:453 +msgid "Debug a single function call, and return its result." +msgstr "调试一个单独的函数调用,并返回其结果。" + +#: ../../library/bdb.rst:456 +msgid "Finally, the module defines the following functions:" +msgstr "最后,这个模块定义了以下函数:" + +#: ../../library/bdb.rst:460 +msgid "" +"Return ``True`` if we should break here, depending on the way the " +":class:`Breakpoint` *b* was set." +msgstr "如果应当在此中断则返回 ``True``,具体取决于 :class:`Breakpoint` *b* 的设置方式。" + +#: ../../library/bdb.rst:463 +msgid "" +"If it was set via line number, it checks if :attr:`b.line " +"` is the same as the one in *frame*. If the breakpoint " +"was set via :attr:`function name `, we have to " +"check we are in the right *frame* (the right function) and if we are on its " +"first executable line." +msgstr "" +"如果是通过行号设置的,它将检查 :attr:`b.line ` 是否与 *frame* 中的行一致。 " +"如果中断点是通过 :attr:`函数名称 ` 设置的,则必须检查是否位于正确的 *帧* (正确的函数)" +" 以及是否位于其中第一个可执行的行。" + +#: ../../library/bdb.rst:472 +msgid "" +"Return ``(active breakpoint, delete temporary flag)`` or ``(None, None)`` as" +" the breakpoint to act upon." +msgstr "" +"返回 ``(active breakpoint, delete temporary flag)`` 或 ``(None, None)`` " +"作为目标中断点。" + +#: ../../library/bdb.rst:475 +msgid "" +"The *active breakpoint* is the first entry in :attr:`bplist " +"` for the (:attr:`file `, " +":attr:`line `) (which must exist) that is " +":attr:`enabled `, for which :func:`checkfuncname` is" +" true, and that has neither a false :attr:`condition ` " +"nor positive :attr:`ignore ` count. The *flag*, " +"meaning that a temporary breakpoint should be deleted, is ``False`` only " +"when the :attr:`cond ` cannot be evaluated (in which " +"case, :attr:`ignore ` count is ignored)." +msgstr "" +"*激活的中断点* 是 :attr:`bplist ` 中对应 (:attr:`file " +"`, :attr:`line `) (它必须存在) 的第一个 " +":attr:`已启用的 ` 条目,对应的 :func:`checkfuncname` " +"为真值,并且没有为假值的 :attr:`cond ` 或为正值的 :attr:`ignore " +"` 计数。 *flag* 表示临时中断点应当被删除,它仅在 :attr:`cond " +"` 无法被求值时 (在此情况下,:attr:`ignore ` " +"计数将被忽略) 才会为 ``False``。" + +#: ../../library/bdb.rst:486 +msgid "If no such entry exists, then ``(None, None)`` is returned." +msgstr "如果不存在这样的条目,则返回 ``(None, None)``。" + +#: ../../library/bdb.rst:491 +msgid "Start debugging with a :class:`Bdb` instance from caller's frame." +msgstr "使用一个来自调用方的帧的 :class:`Bdb` 实例开始调试。" + +#: ../../library/bdb.rst:326 +msgid "quitting (bdb.Bdb attribute)" +msgstr "quitting (bdb.Bdb 属性)" diff --git a/library/binary.po b/library/binary.po new file mode 100644 index 0000000000..2a628e6fa4 --- /dev/null +++ b/library/binary.po @@ -0,0 +1,49 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/binary.rst:5 +msgid "Binary Data Services" +msgstr "二进制数据服务" + +#: ../../library/binary.rst:7 +msgid "" +"The modules described in this chapter provide some basic services operations" +" for manipulation of binary data. Other operations on binary data, " +"specifically in relation to file formats and network protocols, are " +"described in the relevant sections." +msgstr "本章介绍的模块提供了一些操作二进制数据的基本服务操作。有关二进制数据的其他操作,特别是与文件格式和网络协议有关的操作,将在相关章节中介绍。" + +#: ../../library/binary.rst:12 +msgid "" +"Some libraries described under :ref:`textservices` also work with either " +"ASCII-compatible binary formats (for example, :mod:`re`) or all binary data " +"(for example, :mod:`difflib`)." +msgstr "" +"在 :ref:`textservices` 下介绍的一些库也可以使用 ASCII 兼容的二进制格式 (例如 :mod:`re`) 或所有二进制数据 " +"(例如 :mod:`difflib`)。" + +#: ../../library/binary.rst:16 +msgid "" +"In addition, see the documentation for Python's built-in binary data types " +"in :ref:`binaryseq`." +msgstr "另外,请参阅 Python 的内置二进制数据类型的文档 :ref:`binaryseq`。" diff --git a/library/binascii.po b/library/binascii.po new file mode 100644 index 0000000000..e94c708aba --- /dev/null +++ b/library/binascii.po @@ -0,0 +1,278 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-31 16:04+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/binascii.rst:2 +msgid ":mod:`!binascii` --- Convert between binary and ASCII" +msgstr ":mod:`!binascii` --- 在二进制数据和 ASCII 之间进行转换" + +#: ../../library/binascii.rst:13 +msgid "" +"The :mod:`!binascii` module contains a number of methods to convert between " +"binary and various ASCII-encoded binary representations. Normally, you will " +"not use these functions directly but use wrapper modules like :mod:`base64` " +"instead. The :mod:`!binascii` module contains low-level functions written in" +" C for greater speed that are used by the higher-level modules." +msgstr "" +":mod:`!binascii` 模块包含多个方法用来在二进制数据和多种 ASCII 编码的二进制数据表示形式之间进行转换。 " +"在通常情况下,你不会直接使用这些函数而是使用 :mod:`base64` 这样的包装器模块作为替代。 :mod:`!binascii` 模块包含用 C " +"语言编写的供这些高层级模块使用的低层级函数以获得更快的运行速度。" + +#: ../../library/binascii.rst:22 +msgid "" +"``a2b_*`` functions accept Unicode strings containing only ASCII characters." +" Other functions only accept :term:`bytes-like objects ` " +"(such as :class:`bytes`, :class:`bytearray` and other objects that support " +"the buffer protocol)." +msgstr "" +"``a2b_*`` 函数接受只含有 ASCII 码的 Unicode 字符串。其他函数只接受 :term:`字节型对象 ` (如 :class:`bytes`,:class:`bytearray` 和其他支持缓冲区协议的对象)。" + +#: ../../library/binascii.rst:27 +msgid "" +"ASCII-only unicode strings are now accepted by the ``a2b_*`` functions." +msgstr " ``a2b_*`` 函数支持只包含 ASCII 的 Unicode 字符串。" + +#: ../../library/binascii.rst:31 +msgid "The :mod:`!binascii` module defines the following functions:" +msgstr ":mod:`!binascii` 模块定义了下列函数:" + +#: ../../library/binascii.rst:36 +msgid "" +"Convert a single line of uuencoded data back to binary and return the binary" +" data. Lines normally contain 45 (binary) bytes, except for the last line. " +"Line data may be followed by whitespace." +msgstr "" +"将单行 uu 编码数据转换成二进制数据并返回。uu 编码每行的数据通常包含 45 个(二进制)字节,最后一行除外。每行数据后面可能跟有空格。" + +#: ../../library/binascii.rst:43 +msgid "" +"Convert binary data to a line of ASCII characters, the return value is the " +"converted line, including a newline char. The length of *data* should be at " +"most 45. If *backtick* is true, zeros are represented by ``'`'`` instead of " +"spaces." +msgstr "" +"将二进制数据转换为 ASCII 编码字符,返回值是转换后的行数据,包括换行符。 *data* 的长度最多为 45。如果 *backtick* 为 " +"true,则零由 ``'`'`` 而不是空格表示。" + +#: ../../library/binascii.rst:47 +msgid "Added the *backtick* parameter." +msgstr "增加 *backtick* 形参。" + +#: ../../library/binascii.rst:53 +msgid "" +"Convert a block of base64 data back to binary and return the binary data. " +"More than one line may be passed at a time." +msgstr "将 base64 数据块转换成二进制并以二进制数据形式返回。一次可以传递多行数据。" + +#: ../../library/binascii.rst:56 +msgid "" +"If *strict_mode* is true, only valid base64 data will be converted. Invalid " +"base64 data will raise :exc:`binascii.Error`." +msgstr "" +"如果 *strict_mode* 为真值,则将只转换有效的 base64 数据。无效的 base64 数据将会引发 " +":exc:`binascii.Error`." + +#: ../../library/binascii.rst:59 +msgid "Valid base64:" +msgstr "有效的 base64:" + +#: ../../library/binascii.rst:61 +msgid "Conforms to :rfc:`3548`." +msgstr "遵循 :rfc:`3548`。" + +#: ../../library/binascii.rst:62 +msgid "Contains only characters from the base64 alphabet." +msgstr "仅包含来自 base64 字符表的字符。" + +#: ../../library/binascii.rst:63 +msgid "" +"Contains no excess data after padding (including excess padding, newlines, " +"etc.)." +msgstr "不包含填充后的额外数据(包括冗余填充、换行符等)。" + +#: ../../library/binascii.rst:64 +msgid "Does not start with a padding." +msgstr "不以填充符打头。" + +#: ../../library/binascii.rst:66 +msgid "Added the *strict_mode* parameter." +msgstr "增加了 *strict_mode* 形参。" + +#: ../../library/binascii.rst:72 +msgid "" +"Convert binary data to a line of ASCII characters in base64 coding. The " +"return value is the converted line, including a newline char if *newline* is" +" true. The output of this function conforms to :rfc:`3548`." +msgstr "" +"将二进制数据转换为一行用 base64 编码的 ASCII 字符串。返回值是转换后的行数据,如果 *newline* 为 " +"true,则返回值包括换行符。该函数的输出符合 :rfc:`3548`。" + +#: ../../library/binascii.rst:76 +msgid "Added the *newline* parameter." +msgstr "增加 *newline* 形参。" + +#: ../../library/binascii.rst:82 +msgid "" +"Convert a block of quoted-printable data back to binary and return the " +"binary data. More than one line may be passed at a time. If the optional " +"argument *header* is present and true, underscores will be decoded as " +"spaces." +msgstr "" +"将一个引号可打印的数据块转换成二进制数据并返回。一次可以转换多行。如果可选参数 *header* 存在且为 true,则数据中的下划线将被解码成空格。" + +#: ../../library/binascii.rst:89 +msgid "" +"Convert binary data to a line(s) of ASCII characters in quoted-printable " +"encoding. The return value is the converted line(s). If the optional " +"argument *quotetabs* is present and true, all tabs and spaces will be " +"encoded. If the optional argument *istext* is present and true, newlines " +"are not encoded but trailing whitespace will be encoded. If the optional " +"argument *header* is present and true, spaces will be encoded as underscores" +" per :rfc:`1522`. If the optional argument *header* is present and false, " +"newline characters will be encoded as well; otherwise linefeed conversion " +"might corrupt the binary data stream." +msgstr "" +"将二进制数据转换为一行或多行带引号可打印编码的 ASCII 字符串。返回值是转换后的行数据。如果可选参数 *quotetabs* " +"存在且为真值,则对所有制表符和空格进行编码。如果可选参数 *istext* 存在且为真值,则不对新行进行编码,但将对尾随空格进行编码。如果可选参数 " +"*header* 存在且为 true,则空格将被编码为下划线 :rfc:`1522`。如果可选参数 *header* " +"存在且为假值,则也会对换行符进行编码;不进行换行转换编码可能会破坏二进制数据流。" + +#: ../../library/binascii.rst:102 +msgid "" +"Compute a 16-bit CRC value of *data*, starting with *value* as the initial " +"CRC, and return the result. This uses the CRC-CCITT polynomial *x*:sup:`16`" +" + *x*:sup:`12` + *x*:sup:`5` + 1, often represented as 0x1021. This CRC is" +" used in the binhex4 format." +msgstr "" +"以 *value* 作为初始 CRC 计算 *data* 的 16 位 CRC 值,返回其结果。这里使用 CRC-CCITT 生成多项式 " +"*x*:sup:`16` + *x*:sup:`12` + *x*:sup:`5` + 1,通常表示为 0x1021。该 CRC 被用于 binhex4" +" 格式。" + +#: ../../library/binascii.rst:110 +msgid "" +"Compute CRC-32, the unsigned 32-bit checksum of *data*, starting with an " +"initial CRC of *value*. The default initial CRC is zero. The algorithm is " +"consistent with the ZIP file checksum. Since the algorithm is designed for " +"use as a checksum algorithm, it is not suitable for use as a general hash " +"algorithm. Use as follows::" +msgstr "" +"计算 CRC-32,即 *data* 的无符号 32 位校验和,初始 CRC 值为 *value*。默认的初始 CRC 值为零。该算法与 ZIP " +"文件校验和算法一致。由于该算法被设计用作校验和算法,因此不适合用作通用哈希算法。使用方式如下::" + +#: ../../library/binascii.rst:116 +msgid "" +"print(binascii.crc32(b\"hello world\"))\n" +"# Or, in two pieces:\n" +"crc = binascii.crc32(b\"hello\")\n" +"crc = binascii.crc32(b\" world\", crc)\n" +"print('crc32 = {:#010x}'.format(crc))" +msgstr "" +"print(binascii.crc32(b\"hello world\"))\n" +"# 或者,分成两块:\n" +"crc = binascii.crc32(b\"hello\")\n" +"crc = binascii.crc32(b\" world\", crc)\n" +"print('crc32 = {:#010x}'.format(crc))" + +#: ../../library/binascii.rst:122 +msgid "The result is always unsigned." +msgstr "结果将总是不带符号的。" + +#: ../../library/binascii.rst:128 +msgid "" +"Return the hexadecimal representation of the binary *data*. Every byte of " +"*data* is converted into the corresponding 2-digit hex representation. The " +"returned bytes object is therefore twice as long as the length of *data*." +msgstr "" +"返回二进制数据 *data* 的十六进制表示形式。 *data* 的每个字节都被转换为相应的 2 位十六进制表示形式。因此返回的字节对象的长度是 " +"*data* 的两倍。" + +#: ../../library/binascii.rst:132 +msgid "" +"Similar functionality (but returning a text string) is also conveniently " +"accessible using the :meth:`bytes.hex` method." +msgstr "使用 :meth:`bytes.hex` 方法也可以方便地实现相似的功能(但仅返回文本字符串)。" + +#: ../../library/binascii.rst:135 +msgid "" +"If *sep* is specified, it must be a single character str or bytes object. It" +" will be inserted in the output after every *bytes_per_sep* input bytes. " +"Separator placement is counted from the right end of the output by default, " +"if you wish to count from the left, supply a negative *bytes_per_sep* value." +msgstr "" +"如果指定了 *sep*,它必须为单字符 str 或 bytes 对象。它将被插入每个 *bytes_per_sep* 输入字节之后。 " +"分隔符位置默认从输出的右端开始计数,如果你希望从左端开始计数,请提供一个负的 *bytes_per_sep* 值。" + +#: ../../library/binascii.rst:150 +msgid "The *sep* and *bytes_per_sep* parameters were added." +msgstr "添加了 *sep* 和 *bytes_per_sep* 形参。" + +#: ../../library/binascii.rst:156 +msgid "" +"Return the binary data represented by the hexadecimal string *hexstr*. This" +" function is the inverse of :func:`b2a_hex`. *hexstr* must contain an even " +"number of hexadecimal digits (which can be upper or lower case), otherwise " +"an :exc:`Error` exception is raised." +msgstr "" +"返回由十六进制字符串 *hexstr* 表示的二进制数据。此函数功能与 :func:`b2a_hex` 相反。 *hexstr* " +"必须包含偶数个十六进制数字(可以是大写或小写),否则会引发 :exc:`Error` 异常。" + +#: ../../library/binascii.rst:161 +msgid "" +"Similar functionality (but more liberal towards whitespace) is also " +"accessible using the :meth:`bytes.fromhex` class method." +msgstr "" + +#: ../../library/binascii.rst:166 +msgid "Exception raised on errors. These are usually programming errors." +msgstr "通常是因为编程错误引发的异常。" + +#: ../../library/binascii.rst:171 +msgid "" +"Exception raised on incomplete data. These are usually not programming " +"errors, but may be handled by reading a little more data and trying again." +msgstr "数据不完整引发的异常。通常不是编程错误导致的,可以通过读取更多的数据并再次尝试来处理该异常。" + +#: ../../library/binascii.rst:177 +msgid "Module :mod:`base64`" +msgstr "模块 :mod:`base64`" + +#: ../../library/binascii.rst:178 +msgid "" +"Support for RFC compliant base64-style encoding in base 16, 32, 64, and 85." +msgstr "支持符合 RFC 规范的 base16、base32、base64 和 base85 编码。" + +#: ../../library/binascii.rst:181 +msgid "Module :mod:`quopri`" +msgstr "模块 :mod:`quopri`" + +#: ../../library/binascii.rst:182 +msgid "Support for quoted-printable encoding used in MIME email messages." +msgstr "支持在 MIME 版本电子邮件中使用引号可打印编码。" + +#: ../../library/binascii.rst:8 +msgid "module" +msgstr "module" + +#: ../../library/binascii.rst:8 +msgid "base64" +msgstr "base64" diff --git a/library/bisect.po b/library/bisect.po new file mode 100644 index 0000000000..136914e23b --- /dev/null +++ b/library/bisect.po @@ -0,0 +1,442 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-06-09 17:19+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/bisect.rst:2 +msgid ":mod:`!bisect` --- Array bisection algorithm" +msgstr ":mod:`!bisect` --- 数组二分算法" + +#: ../../library/bisect.rst:10 +msgid "**Source code:** :source:`Lib/bisect.py`" +msgstr "**源代码:** :source:`Lib/bisect.py`" + +#: ../../library/bisect.rst:14 +msgid "" +"This module provides support for maintaining a list in sorted order without " +"having to sort the list after each insertion. For long lists of items with " +"expensive comparison operations, this can be an improvement over linear " +"searches or frequent resorting." +msgstr "" +"本模块提供对维护一个已排序列表而无须在每次插入后对该列表重排序的支持。对于具有大量条目需要大量比较运算的长列表,这改进了原来的线性搜索或频繁重排序。" + +#: ../../library/bisect.rst:19 +msgid "" +"The module is called :mod:`!bisect` because it uses a basic bisection " +"algorithm to do its work. Unlike other bisection tools that search for a " +"specific value, the functions in this module are designed to locate an " +"insertion point. Accordingly, the functions never call an " +":meth:`~object.__eq__` method to determine whether a value has been found. " +"Instead, the functions only call the :meth:`~object.__lt__` method and will " +"return an insertion point between values in an array." +msgstr "" +"本模块被命名为 :mod:`!bisect` 是因为它使用基本的二分算法来完成任务。 " +"不同与其他搜索特定值的二分算法工具,本模块中的函数被设计为确定一个插入点。 相应地,这些函数绝不会调用 :meth:`~object.__eq__` " +"来确定是否找到特定的值。 相反,这些函数只会调用 :meth:`~object.__lt__` 方法并将返回一个数组值之间的插入点。" + +#: ../../library/bisect.rst:29 +msgid "" +"The functions in this module are not thread-safe. If multiple threads " +"concurrently use :mod:`!bisect` functions on the same sequence, this may " +"result in undefined behaviour. Likewise, if the provided sequence is mutated" +" by a different thread while a :mod:`!bisect` function is operating on it, " +"the result is undefined. For example, using :py:func:`~bisect.insort_left` " +"on the same list from multiple threads may result in the list becoming " +"unsorted." +msgstr "" +"本模块中的函数不是线程安全的。 如果多个线程并发地在同一个序列上使用 :mod:`!bisect` 函数,可能会导致未定义的行为。 同样地,如果 " +":mod:`!bisect` 函数正在操作序列时该序列被其他线程修改,结果也将是未定义的。 例如,从多个线程对同一个列表使用 " +":py:func:`~bisect.insort_left` 可能会导致该列表处于未排序状态。" + +#: ../../library/bisect.rst:39 +msgid "The following functions are provided:" +msgstr "定义了以下函数:" + +#: ../../library/bisect.rst:44 +msgid "" +"Locate the insertion point for *x* in *a* to maintain sorted order. The " +"parameters *lo* and *hi* may be used to specify a subset of the list which " +"should be considered; by default the entire list is used. If *x* is already" +" present in *a*, the insertion point will be before (to the left of) any " +"existing entries. The return value is suitable for use as the first " +"parameter to ``list.insert()`` assuming that *a* is already sorted." +msgstr "" +"在 *a* 中找到 *x* 合适的插入点以维持有序。参数 *lo* 和 *hi* 可以被用于确定需要考虑的子集;默认情况下整个列表都会被使用。如果 " +"*x* 已经在 *a* 里存在,那么插入点会在已存在元素之前(也就是左边)。如果 *a* 是列表(list)的话,返回值是可以被放在 " +"``list.insert()`` 的第一个参数的。" + +#: ../../library/bisect.rst:51 +msgid "" +"The returned insertion point *ip* partitions the array *a* into two slices " +"such that ``all(elem < x for elem in a[lo : ip])`` is true for the left " +"slice and ``all(elem >= x for elem in a[ip : hi])`` is true for the right " +"slice." +msgstr "" +"返回的插入点 *ip* 将数组 *a* 分为两个切片使得对于左侧切片 ``all(elem < x for elem in a[lo : ip])`` " +"为真值而对于右侧切片 ``all(elem >= x for elem in a[ip : hi])`` 为真值。" + +#: ../../library/bisect.rst:56 +msgid "" +"*key* specifies a :term:`key function` of one argument that is used to " +"extract a comparison key from each element in the array. To support " +"searching complex records, the key function is not applied to the *x* value." +msgstr "" +"*key* 指定带有单个参数的 :term:`key function` 用来从数组的每个元素中提取比较键。为了支持搜索复杂记录,键函数不会被应用到 " +"*x* 值。" + +#: ../../library/bisect.rst:60 +msgid "" +"If *key* is ``None``, the elements are compared directly and no key function" +" is called." +msgstr "如果 *key* 为 ``None``,则将直接比较元素而不调用任何键函数。" + +#: ../../library/bisect.rst:63 ../../library/bisect.rst:77 +#: ../../library/bisect.rst:95 ../../library/bisect.rst:115 +msgid "Added the *key* parameter." +msgstr "增加了 *key* 形参。" + +#: ../../library/bisect.rst:70 +msgid "" +"Similar to :py:func:`~bisect.bisect_left`, but returns an insertion point " +"which comes after (to the right of) any existing entries of *x* in *a*." +msgstr "" +"类似于 :py:func:`~bisect.bisect_left`,但是返回的插入点是在 *a* 中任何现有条目 *x* 之后(即其右侧)。" + +#: ../../library/bisect.rst:73 +msgid "" +"The returned insertion point *ip* partitions the array *a* into two slices " +"such that ``all(elem <= x for elem in a[lo : ip])`` is true for the left " +"slice and ``all(elem > x for elem in a[ip : hi])`` is true for the right " +"slice." +msgstr "" +"返回的插入点 *ip* 将数组 *a* 分为两个切片使得对于左侧切片 ``all(elem <= x for elem in a[lo : ip])``" +" 为真值而对于右侧切片 ``all(elem > x for elem in a[ip : hi])`` 为真值。" + +#: ../../library/bisect.rst:83 +msgid "Insert *x* in *a* in sorted order." +msgstr "按照已排序顺序将 *x* 插入到 *a* 中。" + +#: ../../library/bisect.rst:85 +msgid "" +"This function first runs :py:func:`~bisect.bisect_left` to locate an " +"insertion point. Next, it runs the :meth:`~sequence.insert` method on *a* to" +" insert *x* at the appropriate position to maintain sort order." +msgstr "" +"此函数会先运行 :py:func:`~bisect.bisect_left` 来定位一个插入点。然后,它会在 *a* 上运行 " +":meth:`~sequence.insert` 方法在适当的位置插入 *x* 以保持排序顺序。" + +#: ../../library/bisect.rst:89 ../../library/bisect.rst:109 +msgid "" +"To support inserting records in a table, the *key* function (if any) is " +"applied to *x* for the search step but not for the insertion step." +msgstr "为了支持将记录插入到表中,*key* 函数(如果存在)将被应用到 *x* 用于搜索步骤但不会用于插入步骤。" + +#: ../../library/bisect.rst:92 ../../library/bisect.rst:112 +msgid "" +"Keep in mind that the *O*\\ (log *n*) search is dominated by the slow *O*\\ " +"(*n*) insertion step." +msgstr "请记住 *O*\\ (log *n*) 搜索是由缓慢的 *O*\\ (*n*) 插入步骤主导的。" + +#: ../../library/bisect.rst:102 +msgid "" +"Similar to :py:func:`~bisect.insort_left`, but inserting *x* in *a* after " +"any existing entries of *x*." +msgstr "类似于 :py:func:`~bisect.insort_left`,但是会把 *x* 插入到 *a* 中任何现有条目 *x* 之后。" + +#: ../../library/bisect.rst:105 +msgid "" +"This function first runs :py:func:`~bisect.bisect_right` to locate an " +"insertion point. Next, it runs the :meth:`~sequence.insert` method on *a* to" +" insert *x* at the appropriate position to maintain sort order." +msgstr "" +"此函数会先运行 :py:func:`~bisect.bisect_right` 来定位一个插入点。然后,它会在 *a* 上运行 " +":meth:`~sequence.insert` 方法在适当的位置插入 *x* 以保持排序顺序。" + +#: ../../library/bisect.rst:120 +msgid "Performance Notes" +msgstr "性能说明" + +#: ../../library/bisect.rst:122 +msgid "" +"When writing time sensitive code using *bisect()* and *insort()*, keep these" +" thoughts in mind:" +msgstr "当使用 *bisect()* 和 *insort()* 编写时间敏感的代码时,请记住以下概念。" + +#: ../../library/bisect.rst:125 +msgid "" +"Bisection is effective for searching ranges of values. For locating specific" +" values, dictionaries are more performant." +msgstr "二分法对于搜索一定范围的值是很高效的。对于定位特定的值,则字典的性能更好。" + +#: ../../library/bisect.rst:128 +msgid "" +"The *insort()* functions are *O*\\ (*n*) because the logarithmic search step" +" is dominated by the linear time insertion step." +msgstr "*insort()* 函数的时间复杂度为 *O*\\ (*n*) 因为对数时间的搜索步骤被线性时间的插入步骤所主导。" + +#: ../../library/bisect.rst:131 +msgid "" +"The search functions are stateless and discard key function results after " +"they are used. Consequently, if the search functions are used in a loop, " +"the key function may be called again and again on the same array elements. " +"If the key function isn't fast, consider wrapping it with " +":py:func:`functools.cache` to avoid duplicate computations. Alternatively, " +"consider searching an array of precomputed keys to locate the insertion " +"point (as shown in the examples section below)." +msgstr "" +"这些搜索函数都是无状态的并且会在它们被使用后丢弃键函数的结果。因此,如果在一个循环中使用搜索函数,则键函数可能会在同一个数据元素上被反复调用。 " +"如果键函数速度不够快,请考虑用 :py:func:`functools.cache` 来包装它以避免重复计算。 " +"另外,也可以考虑搜索一个预先计算好的键数组来定位插入点(如下面的示例小节所演示的)。" + +#: ../../library/bisect.rst:141 +msgid "" +"`Sorted Collections `_ is a " +"high performance module that uses *bisect* to managed sorted collections of " +"data." +msgstr "" +"`Sorted Collections `_ 是一个使用" +" *bisect* 来管理数据的已排序多项集的高性能模块。" + +#: ../../library/bisect.rst:145 +msgid "" +"The `SortedCollection recipe " +"`_ uses " +"bisect to build a full-featured collection class with straight-forward " +"search methods and support for a key-function. The keys are precomputed to " +"save unnecessary calls to the key function during searches." +msgstr "" +"`SortedCollection recipe " +"`_ 使用 bisect " +"构建了一个功能完整的多项集类,拥有直观的搜索方法和对键函数的支持。所有键函数都是预先计算好的以避免在搜索期间对键函数的不必要的调用。" + +#: ../../library/bisect.rst:153 +msgid "Searching Sorted Lists" +msgstr "搜索有序列表" + +#: ../../library/bisect.rst:155 +msgid "" +"The above `bisect functions`_ are useful for finding insertion points but " +"can be tricky or awkward to use for common searching tasks. The following " +"five functions show how to transform them into the standard lookups for " +"sorted lists::" +msgstr "" +"上面的 `bisect functions`_ 对于找到插入点是有用的,但在一般的搜索任务中可能会有点尴尬。 " +"下面的五个函数展示了如何将其转换为针对有序列表的标准查找函数::" + +#: ../../library/bisect.rst:160 +msgid "" +"def index(a, x):\n" +" 'Locate the leftmost value exactly equal to x'\n" +" i = bisect_left(a, x)\n" +" if i != len(a) and a[i] == x:\n" +" return i\n" +" raise ValueError\n" +"\n" +"def find_lt(a, x):\n" +" 'Find rightmost value less than x'\n" +" i = bisect_left(a, x)\n" +" if i:\n" +" return a[i-1]\n" +" raise ValueError\n" +"\n" +"def find_le(a, x):\n" +" 'Find rightmost value less than or equal to x'\n" +" i = bisect_right(a, x)\n" +" if i:\n" +" return a[i-1]\n" +" raise ValueError\n" +"\n" +"def find_gt(a, x):\n" +" 'Find leftmost value greater than x'\n" +" i = bisect_right(a, x)\n" +" if i != len(a):\n" +" return a[i]\n" +" raise ValueError\n" +"\n" +"def find_ge(a, x):\n" +" 'Find leftmost item greater than or equal to x'\n" +" i = bisect_left(a, x)\n" +" if i != len(a):\n" +" return a[i]\n" +" raise ValueError" +msgstr "" +"def index(a, x):\n" +" '定位恰好等于 x 的最靠左的值'\n" +" i = bisect_left(a, x)\n" +" if i != len(a) and a[i] == x:\n" +" return i\n" +" raise ValueError\n" +"\n" +"def find_lt(a, x):\n" +" '找到小于 x 的最靠右的值'\n" +" i = bisect_left(a, x)\n" +" if i:\n" +" return a[i-1]\n" +" raise ValueError\n" +"\n" +"def find_le(a, x):\n" +" '找到小于等于 x 的最靠右的值'\n" +" i = bisect_right(a, x)\n" +" if i:\n" +" return a[i-1]\n" +" raise ValueError\n" +"\n" +"def find_gt(a, x):\n" +" '找到大于 x 的最靠左的值'\n" +" i = bisect_right(a, x)\n" +" if i != len(a):\n" +" return a[i]\n" +" raise ValueError\n" +"\n" +"def find_ge(a, x):\n" +" '找到大于等于 x 的最靠左的项'\n" +" i = bisect_left(a, x)\n" +" if i != len(a):\n" +" return a[i]\n" +" raise ValueError" + +#: ../../library/bisect.rst:197 +msgid "Examples" +msgstr "例子" + +#: ../../library/bisect.rst:201 +msgid "" +"The :py:func:`~bisect.bisect` function can be useful for numeric table " +"lookups. This example uses :py:func:`~bisect.bisect` to look up a letter " +"grade for an exam score (say) based on a set of ordered numeric breakpoints:" +" 90 and up is an 'A', 80 to 89 is a 'B', and so on::" +msgstr "" +":py:func:`~bisect.bisect` 函数对于数字表查询也是适用的。这个例子使用 :py:func:`~bisect.bisect` " +"根据一组有序的数字划分点来查找考试成绩对应的字母等级:(如)90 及以上为 'A',80 至 89 为 'B',依此类推::" + +#: ../../library/bisect.rst:206 +msgid "" +">>> def grade(score):\n" +"... i = bisect([60, 70, 80, 90], score)\n" +"... return \"FDCBA\"[i]\n" +"...\n" +">>> [grade(score) for score in [33, 99, 77, 70, 89, 90, 100]]\n" +"['F', 'A', 'C', 'C', 'B', 'A', 'A']" +msgstr "" + +#: ../../library/bisect.rst:213 +msgid "" +"The :py:func:`~bisect.bisect` and :py:func:`~bisect.insort` functions also " +"work with lists of tuples. The *key* argument can serve to extract the " +"field used for ordering records in a table::" +msgstr "" +":py:func:`~bisect.bisect` 和 :py:func:`~bisect.insort` 函数也适用于元组的列表。 *key* " +"参数可以提取用于表中记录排序的字段::" + +#: ../../library/bisect.rst:217 +msgid "" +">>> from collections import namedtuple\n" +">>> from operator import attrgetter\n" +">>> from bisect import bisect, insort\n" +">>> from pprint import pprint\n" +"\n" +">>> Movie = namedtuple('Movie', ('name', 'released', 'director'))\n" +"\n" +">>> movies = [\n" +"... Movie('Jaws', 1975, 'Spielberg'),\n" +"... Movie('Titanic', 1997, 'Cameron'),\n" +"... Movie('The Birds', 1963, 'Hitchcock'),\n" +"... Movie('Aliens', 1986, 'Cameron')\n" +"... ]\n" +"\n" +">>> # Find the first movie released after 1960\n" +">>> by_year = attrgetter('released')\n" +">>> movies.sort(key=by_year)\n" +">>> movies[bisect(movies, 1960, key=by_year)]\n" +"Movie(name='The Birds', released=1963, director='Hitchcock')\n" +"\n" +">>> # Insert a movie while maintaining sort order\n" +">>> romance = Movie('Love Story', 1970, 'Hiller')\n" +">>> insort(movies, romance, key=by_year)\n" +">>> pprint(movies)\n" +"[Movie(name='The Birds', released=1963, director='Hitchcock'),\n" +" Movie(name='Love Story', released=1970, director='Hiller'),\n" +" Movie(name='Jaws', released=1975, director='Spielberg'),\n" +" Movie(name='Aliens', released=1986, director='Cameron'),\n" +" Movie(name='Titanic', released=1997, director='Cameron')]" +msgstr "" +">>> from collections import namedtuple\n" +">>> from operator import attrgetter\n" +">>> from bisect import bisect, insort\n" +">>> from pprint import pprint\n" +"\n" +">>> Movie = namedtuple('Movie', ('name', 'released', 'director'))\n" +"\n" +">>> movies = [\n" +"... Movie('Jaws', 1975, 'Spielberg'),\n" +"... Movie('Titanic', 1997, 'Cameron'),\n" +"... Movie('The Birds', 1963, 'Hitchcock'),\n" +"... Movie('Aliens', 1986, 'Cameron')\n" +"... ]\n" +"\n" +">>> # 找到 1960 年之后上映的第一部电影\n" +">>> by_year = attrgetter('released')\n" +">>> movies.sort(key=by_year)\n" +">>> movies[bisect(movies, 1960, key=by_year)]\n" +"Movie(name='The Birds', released=1963, director='Hitchcock')\n" +"\n" +">>> # 在保持排序顺序的同时插入一部电影\n" +">>> romance = Movie('Love Story', 1970, 'Hiller')\n" +">>> insort(movies, romance, key=by_year)\n" +">>> pprint(movies)\n" +"[Movie(name='The Birds', released=1963, director='Hitchcock'),\n" +" Movie(name='Love Story', released=1970, director='Hiller'),\n" +" Movie(name='Jaws', released=1975, director='Spielberg'),\n" +" Movie(name='Aliens', released=1986, director='Cameron'),\n" +" Movie(name='Titanic', released=1997, director='Cameron')]" + +#: ../../library/bisect.rst:247 +msgid "" +"If the key function is expensive, it is possible to avoid repeated function " +"calls by searching a list of precomputed keys to find the index of a " +"record::" +msgstr "如果键函数较为消耗资源,可以通过搜索一个预先计算的键列表来查找记录的索引以避免重复的函数调用::" + +#: ../../library/bisect.rst:250 +msgid "" +">>> data = [('red', 5), ('blue', 1), ('yellow', 8), ('black', 0)]\n" +">>> data.sort(key=lambda r: r[1]) # Or use operator.itemgetter(1).\n" +">>> keys = [r[1] for r in data] # Precompute a list of keys.\n" +">>> data[bisect_left(keys, 0)]\n" +"('black', 0)\n" +">>> data[bisect_left(keys, 1)]\n" +"('blue', 1)\n" +">>> data[bisect_left(keys, 5)]\n" +"('red', 5)\n" +">>> data[bisect_left(keys, 8)]\n" +"('yellow', 8)" +msgstr "" +">>> data = [('red', 5), ('blue', 1), ('yellow', 8), ('black', 0)]\n" +">>> data.sort(key=lambda r: r[1]) # 或者使用 operator.itemgetter(1)。\n" +">>> keys = [r[1] for r in data] # 预计算一个由键组成的列表。\n" +">>> data[bisect_left(keys, 0)]\n" +"('black', 0)\n" +">>> data[bisect_left(keys, 1)]\n" +"('blue', 1)\n" +">>> data[bisect_left(keys, 5)]\n" +"('red', 5)\n" +">>> data[bisect_left(keys, 8)]\n" +"('yellow', 8)" diff --git a/library/builtins.po b/library/builtins.po new file mode 100644 index 0000000000..c79ee21cda --- /dev/null +++ b/library/builtins.po @@ -0,0 +1,110 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/builtins.rst:2 +msgid ":mod:`!builtins` --- Built-in objects" +msgstr ":mod:`!builtins` --- 内置对象" + +#: ../../library/builtins.rst:9 +msgid "" +"This module provides direct access to all 'built-in' identifiers of Python; " +"for example, ``builtins.open`` is the full name for the built-in function " +":func:`open`." +msgstr "" +"此模块提供了对 Python 的所有'内置'标识符的直接访问;例如,``builtins.open`` 是内置函数 :func:`open` " +"的完整名称。" + +#: ../../library/builtins.rst:12 +msgid "" +"This module is not normally accessed explicitly by most applications, but " +"can be useful in modules that provide objects with the same name as a built-" +"in value, but in which the built-in of that name is also needed. For " +"example, in a module that wants to implement an :func:`open` function that " +"wraps the built-in :func:`open`, this module can be used directly::" +msgstr "" +"大多数应用程序通常不会显式访问此模块,但在提供与内置值同名的对象的模块中可能很有用,因为其中同时又需要使用该名称对应的内置对象。例如,在一个想要实现包装了内置" +" :func:`open` 的 :func:`open` 函数的模块中,可以直接使用此模块::" + +#: ../../library/builtins.rst:18 +msgid "" +"import builtins\n" +"\n" +"def open(path):\n" +" f = builtins.open(path, 'r')\n" +" return UpperCaser(f)\n" +"\n" +"class UpperCaser:\n" +" '''Wrapper around a file that converts output to uppercase.'''\n" +"\n" +" def __init__(self, f):\n" +" self._f = f\n" +"\n" +" def read(self, count=-1):\n" +" return self._f.read(count).upper()\n" +"\n" +" # ..." +msgstr "" +"import builtins\n" +"\n" +"def open(path):\n" +" f = builtins.open(path, 'r')\n" +" return UpperCaser(f)\n" +"\n" +"class UpperCaser:\n" +" '''文件的包装类,将读取的内容转换为大写输出'''\n" +"\n" +" def __init__(self, f):\n" +" self._f = f\n" +"\n" +" def read(self, count=-1):\n" +" return self._f.read(count).upper()\n" +"\n" +" # ..." + +#: ../../library/builtins.rst:35 +msgid "" +"As an implementation detail, most modules have the name ``__builtins__`` " +"made available as part of their globals. The value of ``__builtins__`` is " +"normally either this module or the value of this module's " +":attr:`~object.__dict__` attribute. Since this is an implementation detail, " +"it may not be used by alternate implementations of Python." +msgstr "" +"作为一个实现细节,大多数模块都将名称 ``__builtins__`` 作为其全局变量的一部分提供。``__builtins__`` " +"的值通常是这个模块或者这个模块的 :attr:`~object.__dict__` 属性的值。由于这是一个实现细节,因此 Python " +"的替代实现可能不会使用它。" + +#: ../../library/builtins.rst:43 +msgid ":ref:`built-in-consts`" +msgstr ":ref:`built-in-consts`" + +#: ../../library/builtins.rst:44 +msgid ":ref:`bltin-exceptions`" +msgstr ":ref:`bltin-exceptions`" + +#: ../../library/builtins.rst:45 +msgid ":ref:`built-in-funcs`" +msgstr ":ref:`built-in-funcs`" + +#: ../../library/builtins.rst:46 +msgid ":ref:`bltin-types`" +msgstr ":ref:`bltin-types`" diff --git a/library/bz2.po b/library/bz2.po new file mode 100644 index 0000000000..f5895e2835 --- /dev/null +++ b/library/bz2.po @@ -0,0 +1,476 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/bz2.rst:2 +msgid ":mod:`!bz2` --- Support for :program:`bzip2` compression" +msgstr ":mod:`!bz2` --- 对 :program:`bzip2` 压缩算法的支持" + +#: ../../library/bz2.rst:12 +msgid "**Source code:** :source:`Lib/bz2.py`" +msgstr "**源代码:** :source:`Lib/bz2.py`" + +#: ../../library/bz2.rst:16 +msgid "" +"This module provides a comprehensive interface for compressing and " +"decompressing data using the bzip2 compression algorithm." +msgstr "此模块提供了使用 bzip2 压缩算法压缩和解压数据的一套完整的接口。" + +#: ../../library/bz2.rst:19 +msgid "The :mod:`!bz2` module contains:" +msgstr ":mod:`!bz2` 模块包含:" + +#: ../../library/bz2.rst:21 +msgid "" +"The :func:`.open` function and :class:`BZ2File` class for reading and " +"writing compressed files." +msgstr "用于读写压缩文件的 :func:`.open` 函数和 :class:`BZ2File` 类。" + +#: ../../library/bz2.rst:23 +msgid "" +"The :class:`BZ2Compressor` and :class:`BZ2Decompressor` classes for " +"incremental (de)compression." +msgstr "用于增量压缩和解压的 :class:`BZ2Compressor` 和 :class:`BZ2Decompressor` 类。" + +#: ../../library/bz2.rst:25 +msgid "" +"The :func:`compress` and :func:`decompress` functions for one-shot " +"(de)compression." +msgstr "用于一次性压缩和解压的 :func:`compress` 和 :func:`decompress` 函数。" + +#: ../../includes/optional-module.rst:1 +msgid "" +"This is an :term:`optional module`. If it is missing from your copy of " +"CPython, look for documentation from your distributor (that is, whoever " +"provided Python to you). If you are the distributor, see :ref:`optional-" +"module-requirements`." +msgstr "" +"这是一个 :term:`optional module`。如果它在你的 CPython 副本中缺失,请查看你的发行方(也就是说,向你提供 Python " +"的人)的文档。如果你就是发行方,请参阅 :ref:`optional-module-requirements`。" + +#: ../../library/bz2.rst:32 +msgid "(De)compression of files" +msgstr "文件压缩和解压" + +#: ../../library/bz2.rst:36 +msgid "" +"Open a bzip2-compressed file in binary or text mode, returning a :term:`file" +" object`." +msgstr "以二进制或文本模式打开 bzip2 压缩文件,返回一个 :term:`file object`。" + +#: ../../library/bz2.rst:39 +msgid "" +"As with the constructor for :class:`BZ2File`, the *filename* argument can be" +" an actual filename (a :class:`str` or :class:`bytes` object), or an " +"existing file object to read from or write to." +msgstr "" +"和 :class:`BZ2File` 的构造函数类似,*filename* 参数可以是一个实际的文件名(:class:`str` 或 " +":class:`bytes` 对象),或是已有的可供读取或写入的文件对象。" + +#: ../../library/bz2.rst:43 +msgid "" +"The *mode* argument can be any of ``'r'``, ``'rb'``, ``'w'``, ``'wb'``, " +"``'x'``, ``'xb'``, ``'a'`` or ``'ab'`` for binary mode, or ``'rt'``, " +"``'wt'``, ``'xt'``, or ``'at'`` for text mode. The default is ``'rb'``." +msgstr "" +"*mode* 参数可设为二进制模式的 " +"``'r'``、``'rb'``、``'w'``、``'wb'``、``'x'``、``'xb'``、``'a'`` 或 " +"``'ab'``,或者文本模式的 ``'rt'``、``'wt'``、``'xt'`` 或 ``'at'``。默认是 ``'rb'``。" + +#: ../../library/bz2.rst:47 +msgid "" +"The *compresslevel* argument is an integer from 1 to 9, as for the " +":class:`BZ2File` constructor." +msgstr "*compresslevel* 参数是 1 到 9 的整数,和 :class:`BZ2File` 的构造函数一样。" + +#: ../../library/bz2.rst:50 +msgid "" +"For binary mode, this function is equivalent to the :class:`BZ2File` " +"constructor: ``BZ2File(filename, mode, compresslevel=compresslevel)``. In " +"this case, the *encoding*, *errors* and *newline* arguments must not be " +"provided." +msgstr "" +"对于二进制模式,这个函数等价于 :class:`BZ2File` 构造器: ``BZ2File(filename, mode, " +"compresslevel=compresslevel)``。在这种情况下,不可提供 *encoding*, *errors* 和 *newline* " +"参数。" + +#: ../../library/bz2.rst:55 +msgid "" +"For text mode, a :class:`BZ2File` object is created, and wrapped in an " +":class:`io.TextIOWrapper` instance with the specified encoding, error " +"handling behavior, and line ending(s)." +msgstr "" +"对于文本模式,将会创建一个 :class:`BZ2File` 对象,并将它包装到一个 :class:`io.TextIOWrapper` " +"实例中,此实例带有指定的编码格式、错误处理行为和行结束符。" + +#: ../../library/bz2.rst:61 ../../library/bz2.rst:177 +msgid "The ``'x'`` (exclusive creation) mode was added." +msgstr "添加了 ``'x'`` (独占创建) 模式。" + +#: ../../library/bz2.rst:64 ../../library/bz2.rst:184 +msgid "Accepts a :term:`path-like object`." +msgstr "接受一个 :term:`path-like object`。" + +#: ../../library/bz2.rst:70 +msgid "Open a bzip2-compressed file in binary mode." +msgstr "用二进制模式打开 bzip2 压缩文件。" + +#: ../../library/bz2.rst:72 +msgid "" +"If *filename* is a :class:`str` or :class:`bytes` object, open the named " +"file directly. Otherwise, *filename* should be a :term:`file object`, which " +"will be used to read or write the compressed data." +msgstr "" +"如果 *filename* 是一个 :class:`str` 或 :class:`bytes` 对象,则直接打开指定名称的文件。 " +"否则的话,*filename* 应当是一个 :term:`file object`,它将被用来读取或写入压缩数据。" + +#: ../../library/bz2.rst:76 +msgid "" +"The *mode* argument can be either ``'r'`` for reading (default), ``'w'`` for" +" overwriting, ``'x'`` for exclusive creation, or ``'a'`` for appending. " +"These can equivalently be given as ``'rb'``, ``'wb'``, ``'xb'`` and ``'ab'``" +" respectively." +msgstr "" +"*mode* 参数可以是表示读取的 ``'r'`` (默认值),表示覆写的 ``'w'``,表示独占创建的 ``'x'``,或表示添加的 " +"``'a'``。 这些模式还可分别以 ``'rb'``, ``'wb'``, ``'xb'`` 和 ``'ab'`` 的等价形式给出。" + +#: ../../library/bz2.rst:81 +msgid "" +"If *filename* is a file object (rather than an actual file name), a mode of " +"``'w'`` does not truncate the file, and is instead equivalent to ``'a'``." +msgstr "如果 *filename* 是一个文件对象(而不是实际的文件名),则 ``'w'`` 模式并不会截断文件,而是会等价于 ``'a'``。" + +#: ../../library/bz2.rst:84 +msgid "" +"If *mode* is ``'w'`` or ``'a'``, *compresslevel* can be an integer between " +"``1`` and ``9`` specifying the level of compression: ``1`` produces the " +"least compression, and ``9`` (default) produces the most compression." +msgstr "" +"如果 *mode* 为 ``'w'`` 或 ``'a'``,则 *compresslevel* 可以是 ``1`` 到 ``9`` " +"之间的整数,用于指定压缩等级: ``1`` 产生最低压缩率,而 ``9`` (默认值) 产生最高压缩率。" + +#: ../../library/bz2.rst:88 +msgid "" +"If *mode* is ``'r'``, the input file may be the concatenation of multiple " +"compressed streams." +msgstr "如果 *mode* 为 ``'r'``,则输入文件可以为多个压缩流的拼接。" + +#: ../../library/bz2.rst:91 +msgid "" +":class:`BZ2File` provides all of the members specified by the " +":class:`io.BufferedIOBase`, except for :meth:`~io.BufferedIOBase.detach` and" +" :meth:`~io.IOBase.truncate`. Iteration and the :keyword:`with` statement " +"are supported." +msgstr "" +":class:`BZ2File` 提供了 :class:`io.BufferedIOBase` 所指定的所有成员,但 " +":meth:`~io.BufferedIOBase.detach` 和 :meth:`~io.IOBase.truncate` 除外。并支持迭代和 " +":keyword:`with` 语句。" + +#: ../../library/bz2.rst:96 +msgid ":class:`BZ2File` also provides the following methods and attributes:" +msgstr ":class:`BZ2File` 还提供了以下方法和属性:" + +#: ../../library/bz2.rst:100 +msgid "" +"Return buffered data without advancing the file position. At least one byte " +"of data will be returned (unless at EOF). The exact number of bytes returned" +" is unspecified." +msgstr "返回缓冲的数据而不前移文件位置。至少将返回一个字节的数据(除非为 EOF)。实际返回的字节数不确定。" + +#: ../../library/bz2.rst:104 +msgid "" +"While calling :meth:`peek` does not change the file position of the " +":class:`BZ2File`, it may change the position of the underlying file object " +"(e.g. if the :class:`BZ2File` was constructed by passing a file object for " +"*filename*)." +msgstr "" +"虽然调用 :meth:`peek` 不会改变 :class:`BZ2File` 的文件位置,但它可能改变下层文件对象的位置(举例来说如果 " +":class:`BZ2File` 是通过传入一个文件对象作为 *filename* 的话)。" + +#: ../../library/bz2.rst:113 +msgid "Return the file descriptor for the underlying file." +msgstr "返回底层文件的文件描述符。" + +#: ../../library/bz2.rst:119 +msgid "Return whether the file was opened for reading." +msgstr "返回文件是否已被打开供读取。" + +#: ../../library/bz2.rst:125 +msgid "Return whether the file supports seeking." +msgstr "返回文件是否支持定位。" + +#: ../../library/bz2.rst:131 +msgid "Return whether the file was opened for writing." +msgstr "返回文件是否已被打开供写入。" + +#: ../../library/bz2.rst:137 +msgid "" +"Read up to *size* uncompressed bytes, while trying to avoid making multiple " +"reads from the underlying stream. Reads up to a buffer's worth of data if " +"size is negative." +msgstr "读取至多 *size* 个未压缩字节,将会避免多次从下层流读取。如果 size 为负值则读取至多为缓冲区数据大小。" + +#: ../../library/bz2.rst:141 +msgid "Returns ``b''`` if the file is at EOF." +msgstr "如果文件位置为 EOF 则返回 ``b''``。" + +#: ../../library/bz2.rst:147 +msgid "Read bytes into *b*." +msgstr "将字节数据读取到 *b*。" + +#: ../../library/bz2.rst:149 +msgid "Returns the number of bytes read (0 for EOF)." +msgstr "返回读取的字节数(0 表示 EOF)。" + +#: ../../library/bz2.rst:155 +msgid "``'rb'`` for reading and ``'wb'`` for writing." +msgstr "``'rb'`` 表示可读而 ``'wb'`` 表示可写。" + +#: ../../library/bz2.rst:161 +msgid "" +"The bzip2 file name. Equivalent to the :attr:`~io.FileIO.name` attribute of" +" the underlying :term:`file object`." +msgstr "bzip2 文件名。等价于下层 :term:`file object` 的 :attr:`~io.FileIO.name` 属性。" + +#: ../../library/bz2.rst:167 +msgid "Support for the :keyword:`with` statement was added." +msgstr "添加了对 :keyword:`with` 语句的支持。" + +#: ../../library/bz2.rst:170 +msgid "" +"Support was added for *filename* being a :term:`file object` instead of an " +"actual filename." +msgstr "添加了对 *filename* 使用 :term:`file object` 而非实际文件名的支持。" + +#: ../../library/bz2.rst:174 +msgid "" +"The ``'a'`` (append) mode was added, along with support for reading multi-" +"stream files." +msgstr "添加了 ``'a'`` (append) 模式,以及对读取多数据流文件的支持。" + +#: ../../library/bz2.rst:180 +msgid "" +"The :meth:`~io.BufferedIOBase.read` method now accepts an argument of " +"``None``." +msgstr ":meth:`~io.BufferedIOBase.read` 方法现在接受 ``None`` 作为参数。" + +#: ../../library/bz2.rst:187 +msgid "" +"The *buffering* parameter has been removed. It was ignored and deprecated " +"since Python 3.0. Pass an open file object to control how the file is " +"opened." +msgstr "*buffering* 形参已被移除。它自 Python 3.0 起即被忽略并弃用。请传入一个打开的文件对象来控制文件的打开方式。" + +#: ../../library/bz2.rst:192 +msgid "The *compresslevel* parameter became keyword-only." +msgstr "*compresslevel* 形参成为仅限关键字参数。" + +#: ../../library/bz2.rst:194 +msgid "" +"This class is thread unsafe in the face of multiple simultaneous readers or " +"writers, just like its equivalent classes in :mod:`gzip` and :mod:`lzma` " +"have always been." +msgstr "" +"这个类在面对多个同时读取器或写入器时是线程不安全的,就如它在 :mod:`gzip` 和 :mod:`lzma` 中的等价类一贯的特性一样。" + +#: ../../library/bz2.rst:201 +msgid "Incremental (de)compression" +msgstr "增量压缩和解压" + +#: ../../library/bz2.rst:205 +msgid "" +"Create a new compressor object. This object may be used to compress data " +"incrementally. For one-shot compression, use the :func:`compress` function " +"instead." +msgstr "创建一个新的压缩器对象。此对象可被用来执行增量数据压缩。对于一次性压缩,请改用 :func:`compress` 函数。" + +#: ../../library/bz2.rst:209 ../../library/bz2.rst:297 +msgid "" +"*compresslevel*, if given, must be an integer between ``1`` and ``9``. The " +"default is ``9``." +msgstr "如果给定 *compresslevel*,它必须为 ``1`` 至 ``9`` 之间的整数。默认值为 ``9``。" + +#: ../../library/bz2.rst:214 +msgid "" +"Provide data to the compressor object. Returns a chunk of compressed data if" +" possible, or an empty byte string otherwise." +msgstr "向压缩器对象提供数据。在可能的情况下返回一段已压缩数据,否则返回空字节串。" + +#: ../../library/bz2.rst:217 +msgid "" +"When you have finished providing data to the compressor, call the " +":meth:`flush` method to finish the compression process." +msgstr "当你已结束向压缩器提供数据时,请调用 :meth:`flush` 方法来完成压缩过程。" + +#: ../../library/bz2.rst:223 +msgid "" +"Finish the compression process. Returns the compressed data left in internal" +" buffers." +msgstr "结束压缩过程,返回内部缓冲中剩余的压缩完成的数据。" + +#: ../../library/bz2.rst:226 +msgid "" +"The compressor object may not be used after this method has been called." +msgstr "调用此方法之后压缩器对象将不可再被使用。" + +#: ../../library/bz2.rst:231 +msgid "" +"Create a new decompressor object. This object may be used to decompress data" +" incrementally. For one-shot compression, use the :func:`decompress` " +"function instead." +msgstr "创建一个新的解压缩器对象。此对象可被用来执行增量数据解压缩。对于一次性解压缩,请改用 :func:`decompress` 函数。" + +#: ../../library/bz2.rst:236 +msgid "" +"This class does not transparently handle inputs containing multiple " +"compressed streams, unlike :func:`decompress` and :class:`BZ2File`. If you " +"need to decompress a multi-stream input with :class:`BZ2Decompressor`, you " +"must use a new decompressor for each stream." +msgstr "" +"这个类不会透明地处理包含多个已压缩数据流的输入,这不同于 :func:`decompress` 和 :class:`BZ2File`。如果你需要通过 " +":class:`BZ2Decompressor` 来解压缩多个数据流输入,你必须为每个数据流都使用新的解压缩器。" + +#: ../../library/bz2.rst:243 +msgid "" +"Decompress *data* (a :term:`bytes-like object`), returning uncompressed data" +" as bytes. Some of *data* may be buffered internally, for use in later calls" +" to :meth:`decompress`. The returned data should be concatenated with the " +"output of any previous calls to :meth:`decompress`." +msgstr "" +"解压缩 *data* (一个 :term:`bytes-like object`),返回字节串形式的解压缩数据。某些 *data* " +"可以在内部被缓冲,以便用于后续的 :meth:`decompress` 调用。返回的数据应当与之前任何 :meth:`decompress` " +"调用的输出进行拼接。" + +#: ../../library/bz2.rst:249 +msgid "" +"If *max_length* is nonnegative, returns at most *max_length* bytes of " +"decompressed data. If this limit is reached and further output can be " +"produced, the :attr:`~.needs_input` attribute will be set to ``False``. In " +"this case, the next call to :meth:`~.decompress` may provide *data* as " +"``b''`` to obtain more of the output." +msgstr "" +"如果 *max_length* 为非负数,将返回至多 *max_length* 个字节的解压缩数据。如果达到此限制并且可以产生后续输出,则 " +":attr:`~.needs_input` 属性将被设为 ``False``。在这种情况下,下一次 :meth:`~.decompress` 调用提供的" +" *data* 可以为 ``b''`` 以获取更多的输出。" + +#: ../../library/bz2.rst:256 +msgid "" +"If all of the input data was decompressed and returned (either because this " +"was less than *max_length* bytes, or because *max_length* was negative), the" +" :attr:`~.needs_input` attribute will be set to ``True``." +msgstr "" +"如果所有输入数据都已被解压缩并返回(或是因为它少于 *max_length* 个字节,或是因为 *max_length* 为负数),则 " +":attr:`~.needs_input` 属性将被设为 ``True``。" + +#: ../../library/bz2.rst:261 +msgid "" +"Attempting to decompress data after the end of stream is reached raises an " +":exc:`EOFError`. Any data found after the end of the stream is ignored and " +"saved in the :attr:`~.unused_data` attribute." +msgstr "" +"在到达数据流末尾之后再尝试解压缩数据会引发 :exc:`EOFError`。在数据流末尾之后获取的任何数据都会被忽略并存储至 " +":attr:`~.unused_data` 属性。" + +#: ../../library/bz2.rst:265 +msgid "Added the *max_length* parameter." +msgstr "添加了 *max_length* 形参。" + +#: ../../library/bz2.rst:270 +msgid "``True`` if the end-of-stream marker has been reached." +msgstr "若达到了数据流的末尾标记则为 ``True``。" + +#: ../../library/bz2.rst:277 +msgid "Data found after the end of the compressed stream." +msgstr "在压缩数据流的末尾之后获取的数据。" + +#: ../../library/bz2.rst:279 +msgid "" +"If this attribute is accessed before the end of the stream has been reached," +" its value will be ``b''``." +msgstr "如果在达到数据流末尾之前访问此属性,其值将为 ``b''``。" + +#: ../../library/bz2.rst:284 +msgid "" +"``False`` if the :meth:`.decompress` method can provide more decompressed " +"data before requiring new uncompressed input." +msgstr "如果在要求新的未压缩输入之前 :meth:`.decompress` 方法可以提供更多的解压缩数据则为 ``False``。" + +#: ../../library/bz2.rst:291 +msgid "One-shot (de)compression" +msgstr "一次性压缩或解压缩" + +#: ../../library/bz2.rst:295 +msgid "Compress *data*, a :term:`bytes-like object `." +msgstr "压缩 *data*,此参数为一个 :term:`字节类对象 `。" + +#: ../../library/bz2.rst:300 +msgid "For incremental compression, use a :class:`BZ2Compressor` instead." +msgstr "对于增量压缩,请改用 :class:`BZ2Compressor`。" + +#: ../../library/bz2.rst:305 +msgid "Decompress *data*, a :term:`bytes-like object `." +msgstr "解压缩 *data*,此参数为一个 :term:`字节类对象 `。" + +#: ../../library/bz2.rst:307 +msgid "" +"If *data* is the concatenation of multiple compressed streams, decompress " +"all of the streams." +msgstr "如果 *data* 是多个压缩数据流的拼接,则解压缩所有数据流。" + +#: ../../library/bz2.rst:310 +msgid "For incremental decompression, use a :class:`BZ2Decompressor` instead." +msgstr "对于增量解压缩,请改用 :class:`BZ2Decompressor`。" + +#: ../../library/bz2.rst:312 +msgid "Support for multi-stream inputs was added." +msgstr "支持了多数据流的输入。" + +#: ../../library/bz2.rst:318 +msgid "Examples of usage" +msgstr "用法示例" + +#: ../../library/bz2.rst:320 +msgid "Below are some examples of typical usage of the :mod:`!bz2` module." +msgstr "以下是 :mod:`!bz2` 模块典型用法的一些示例。" + +#: ../../library/bz2.rst:322 +msgid "" +"Using :func:`compress` and :func:`decompress` to demonstrate round-trip " +"compression:" +msgstr "使用 :func:`compress` 和 :func:`decompress` 来显示往复式的压缩:" + +#: ../../library/bz2.rst:340 +msgid "Using :class:`BZ2Compressor` for incremental compression:" +msgstr "使用 :class:`BZ2Compressor` 进行增量压缩:" + +#: ../../library/bz2.rst:358 +msgid "" +"The example above uses a very \"nonrandom\" stream of data (a stream of " +"``b\"z\"`` chunks). Random data tends to compress poorly, while ordered, " +"repetitive data usually yields a high compression ratio." +msgstr "" +"上面的示例使用了一个相当 \"非随机\" 的数据流(即 ``b\"z\"`` 块的数据流)。 " +"随机数据的压缩率通常很差,而有序、重复的数据通常会产生很高的压缩率。" + +#: ../../library/bz2.rst:362 +msgid "Writing and reading a bzip2-compressed file in binary mode:" +msgstr "用二进制模式写入和读取 bzip2 压缩文件:" diff --git a/library/calendar.po b/library/calendar.po new file mode 100644 index 0000000000..a090338909 --- /dev/null +++ b/library/calendar.po @@ -0,0 +1,851 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-19 15:34+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/calendar.rst:2 +msgid ":mod:`!calendar` --- General calendar-related functions" +msgstr ":mod:`!calendar` --- 通用日历相关函数" + +#: ../../library/calendar.rst:10 +msgid "**Source code:** :source:`Lib/calendar.py`" +msgstr "**源代码:** :source:`Lib/calendar.py`" + +#: ../../library/calendar.rst:14 +msgid "" +"This module allows you to output calendars like the Unix :program:`cal` " +"program, and provides additional useful functions related to the calendar. " +"By default, these calendars have Monday as the first day of the week, and " +"Sunday as the last (the European convention). Use :func:`setfirstweekday` to" +" set the first day of the week to Sunday (6) or to any other weekday. " +"Parameters that specify dates are given as integers. For related " +"functionality, see also the :mod:`datetime` and :mod:`time` modules." +msgstr "" +"这个模块让你可以输出像 Unix :program:`cal` 那样的日历,它还提供了其它与日历相关的实用函数。 " +"默认情况下,这些日历把星期一作为一周的第一天,星期天作为一周的最后一天(这是欧洲惯例)。可以使用 :func:`setfirstweekday` " +"方法设置一周的第一天为星期天 (6) 或者其它任意一天。函数全部接收整数类型的参数用来指定日期。其它相关功能参见 :mod:`datetime` 和 " +":mod:`time` 模块。" + +#: ../../library/calendar.rst:22 +msgid "" +"The functions and classes defined in this module use an idealized calendar, " +"the current Gregorian calendar extended indefinitely in both directions. " +"This matches the definition of the \"proleptic Gregorian\" calendar in " +"Dershowitz and Reingold's book \"Calendrical Calculations\", where it's the " +"base calendar for all computations. Zero and negative years are interpreted" +" as prescribed by the ISO 8601 standard. Year 0 is 1 BC, year -1 is 2 BC, " +"and so on." +msgstr "" +"在这个模块中定义的函数和类都基于一个理想化的日历——向过去和未来两个方向无限扩展的现行公历。这与 Dershowitz 和 Reingold " +"的书“历法计算”中所有计算的基本日历 \"proleptic Gregorian\" 历的定义相符。0 和负数年份按照 ISO 8601 标准解释:0 " +"年指公元前 1 年,-1 年指公元前 2 年,依此类推。" + +#: ../../library/calendar.rst:33 +msgid "" +"Creates a :class:`Calendar` object. *firstweekday* is an integer specifying " +"the first day of the week. :const:`MONDAY` is ``0`` (the default), " +":const:`SUNDAY` is ``6``." +msgstr "" +"创建一个 :class:`Calendar` 对象。*firstweekday* 是一个用来指定每星期第一天的整数。:const:`MONDAY` 是 " +"``0`` (默认值),:const:`SUNDAY` 是 ``6``。" + +#: ../../library/calendar.rst:36 +msgid "" +"A :class:`Calendar` object provides several methods that can be used for " +"preparing the calendar data for formatting. This class doesn't do any " +"formatting itself. This is the job of subclasses." +msgstr "" +":class:`Calendar` 对象提供了一些可用于对日历数据进行格式化的准备的方法。这个类本身不执行任何格式化操作。 这部分任务应由子类来完成。" + +#: ../../library/calendar.rst:41 +msgid ":class:`Calendar` instances have the following methods and attributes:" +msgstr ":class:`Calendar` 实例具有以下方法和属性:" + +#: ../../library/calendar.rst:45 +msgid "The first weekday as an integer (0--6)." +msgstr "以整数 (0--6) 表示的每星期第一天。" + +#: ../../library/calendar.rst:47 +msgid "" +"This property can also be set and read using " +":meth:`~Calendar.setfirstweekday` and :meth:`~Calendar.getfirstweekday` " +"respectively." +msgstr "" +"该特征属性也可分别使用 :meth:`~Calendar.setfirstweekday` 和 " +":meth:`~Calendar.getfirstweekday` 来设置和读取。" + +#: ../../library/calendar.rst:53 +msgid "Return an :class:`int` for the current first weekday (0--6)." +msgstr "返回一个 :class:`int` 表示当前的每周第一天 (0--6)。" + +#: ../../library/calendar.rst:55 +msgid "Identical to reading the :attr:`~Calendar.firstweekday` property." +msgstr "相当于读取 :attr:`~Calendar.firstweekday` 特征属性。" + +#: ../../library/calendar.rst:59 +msgid "" +"Set the first weekday to *firstweekday*, passed as an :class:`int` (0--6)." +msgstr "" + +#: ../../library/calendar.rst:61 +msgid "Identical to setting the :attr:`~Calendar.firstweekday` property." +msgstr "相当于设置 :attr:`~Calendar.firstweekday` 特征属性。" + +#: ../../library/calendar.rst:65 +msgid "" +"Return an iterator for the weekday numbers that will be used for one week. " +"The first value from the iterator will be the same as the value of the " +":attr:`~Calendar.firstweekday` property." +msgstr "" + +#: ../../library/calendar.rst:72 +msgid "" +"Return an iterator for the month *month* (1--12) in the year *year*. This " +"iterator will return all days (as :class:`datetime.date` objects) for the " +"month and all days before the start of the month or after the end of the " +"month that are required to get a complete week." +msgstr "" +"为 *year* 年 *month* 月 (1-12) 返回一个迭代器。这个迭代器返回当月的所有日期(使用 :class:`datetime.date`" +" 对象),日期包含了本月头尾用于组成完整一周的日期。" + +#: ../../library/calendar.rst:80 +msgid "" +"Return an iterator for the month *month* in the year *year* similar to " +":meth:`itermonthdates`, but not restricted by the :class:`datetime.date` " +"range. Days returned will simply be day of the month numbers. For the days " +"outside of the specified month, the day number is ``0``." +msgstr "" +"为 *year* 年 *month* 月返回一个与 :meth:`itermonthdates` 类似的迭代器,但不会受 " +":class:`datetime.date` 范围的限制。返回的日期只是月内日期序号。对于不在当月的日期,返回数字 ``0``。" + +#: ../../library/calendar.rst:88 +msgid "" +"Return an iterator for the month *month* in the year *year* similar to " +":meth:`itermonthdates`, but not restricted by the :class:`datetime.date` " +"range. Days returned will be tuples consisting of a day of the month number " +"and a weekday number." +msgstr "" + +#: ../../library/calendar.rst:96 +msgid "" +"Return an iterator for the month *month* in the year *year* similar to " +":meth:`itermonthdates`, but not restricted by the :class:`datetime.date` " +"range. Days returned will be tuples consisting of a year, a month and a day " +"of the month numbers." +msgstr "" +"为 *year* 年 *month* 月返回一个与 :meth:`itermonthdates` 类似的迭代器,但不会受 " +":class:`datetime.date` 范围的限制。迭代器的元素为一个由年、月、日组成的元组。" + +#: ../../library/calendar.rst:106 +msgid "" +"Return an iterator for the month *month* in the year *year* similar to " +":meth:`itermonthdates`, but not restricted by the :class:`datetime.date` " +"range. Days returned will be tuples consisting of a year, a month, a day of " +"the month, and a day of the week numbers." +msgstr "" +"为 *year* 年 *month* 月返回一个与 :meth:`itermonthdates` 类似的迭代器,但不会受 " +":class:`datetime.date` 范围的限制。迭代器的元素为一个由年、月、日和代表星期几的数字组成的元组。" + +#: ../../library/calendar.rst:116 +msgid "" +"Return a list of the weeks in the month *month* of the *year* as full weeks." +" Weeks are lists of seven :class:`datetime.date` objects." +msgstr "" +"返回 *year* 年 *month* 月的周组成的列表。列表中的每一个周是由七个 :class:`datetime.date` 对象组成的列表。" + +#: ../../library/calendar.rst:122 +msgid "" +"Return a list of the weeks in the month *month* of the *year* as full weeks." +" Weeks are lists of seven tuples of day numbers and weekday numbers." +msgstr "返回 *year* 年 *month* 月的周组成的列表。列表中的每一个周是七个由日数和代表星期几的数字组成的元组的列表。" + +#: ../../library/calendar.rst:129 +msgid "" +"Return a list of the weeks in the month *month* of the *year* as full weeks." +" Weeks are lists of seven day numbers." +msgstr "返回 *year* 年 *month* 月的周组成的列表。列表中的每一个周是由七个日数组成的列表。" + +#: ../../library/calendar.rst:135 +msgid "" +"Return the data for the specified year ready for formatting. The return " +"value is a list of month rows. Each month row contains up to *width* months " +"(defaulting to 3). Each month contains between 4 and 6 weeks and each week " +"contains 1--7 days. Days are :class:`datetime.date` objects." +msgstr "" +"返回可以用来格式化的指定年月的数据。返回的值是一个列表,列表是月份组成的行。每一行包含了最多 *width* " +"个月(默认为3)。每个月包含了4到6周,每周包含1--7天。每一天使用 :class:`datetime.date` 对象。" + +#: ../../library/calendar.rst:143 +msgid "" +"Return the data for the specified year ready for formatting (similar to " +":meth:`yeardatescalendar`). Entries in the week lists are tuples of day " +"numbers and weekday numbers. Day numbers outside this month are zero." +msgstr "" +"返回可以用来格式化的指定年月的数据(与 :meth:`yeardatescalendar` " +"类似)。周列表的元素是由表示日期的数字和表示星期几的数字组成的元组。不在这个月的日子为0。" + +#: ../../library/calendar.rst:150 +msgid "" +"Return the data for the specified year ready for formatting (similar to " +":meth:`yeardatescalendar`). Entries in the week lists are day numbers. Day " +"numbers outside this month are zero." +msgstr "" +"返回可以用来格式化的指定年月的数据(与 :meth:`yeardatescalendar` 类似)。周列表的元素是表示日期的数字。不在这个月的日子为0。" + +#: ../../library/calendar.rst:157 +msgid "This class can be used to generate plain text calendars." +msgstr "可以使用这个类生成纯文本日历。" + +#: ../../library/calendar.rst:159 +msgid ":class:`TextCalendar` instances have the following methods:" +msgstr ":class:`TextCalendar` 实例有以下方法:" + +#: ../../library/calendar.rst:164 +msgid "" +"Return a string representing a single day formatted with the given *width*. " +"If *theday* is ``0``, return a string of spaces of the specified width, " +"representing an empty day. The *weekday* parameter is unused." +msgstr "" +"返回一个代表格式化为指定 *width* 的单独日期的字符串表示形式。 如果 *theday* 为 " +"``0``,则返回指定宽度的空格字符串,代表一个空日期。 *weekday* 形参未被使用。" + +#: ../../library/calendar.rst:171 +msgid "" +"Return a single week in a string with no newline. If *w* is provided, it " +"specifies the width of the date columns, which are centered. Depends on the " +"first weekday as specified in the constructor or set by the " +":meth:`setfirstweekday` method." +msgstr "" +"返回以不带换行符的字符串表示的单个星期。 如果提供了 *w*,它将指定日期列的宽度,日期列将居中对齐。 具体内容还依赖于构造器或 " +":meth:`setfirstweekday` 方法指定每周的星期几为第一天。" + +#: ../../library/calendar.rst:179 +msgid "" +"Return a string representing the name of a single weekday formatted to the " +"specified *width*. The *weekday* parameter is an integer representing the " +"day of the week, where ``0`` is Monday and ``6`` is Sunday." +msgstr "" +"返回一个代表单个周日期名称的格式化为 *width* 所指定宽度的字符串。 *weekday* 形参是表示某个周日期的整数,其中 ``0`` 为星期一而" +" ``6`` 为星期日。" + +#: ../../library/calendar.rst:186 +msgid "" +"Return a string containing the header row of weekday names, formatted with " +"the given *width* for each column. The names depend on the locale settings " +"and are padded to the specified width." +msgstr "" +"返回一个包含周日期名称标题行的字符串,其中每一列格式化为 *width* 所给定的宽度。 这些名称依赖于语言区域设置并将被填充至指定的宽度。" + +#: ../../library/calendar.rst:193 +msgid "" +"Return a month's calendar in a multi-line string. If *w* is provided, it " +"specifies the width of the date columns, which are centered. If *l* is " +"given, it specifies the number of lines that each week will use. Depends on " +"the first weekday as specified in the constructor or set by the " +":meth:`setfirstweekday` method." +msgstr "" +"返回指定月的用多行字符串表示的月历。*w* 为日期列的宽度,日期列居中打印。*l* 指定了周与周之间的行距。返回的日历还依赖于构造器或者 " +":meth:`setfirstweekday` 方法指定的每周的第一天是哪一天。" + +#: ../../library/calendar.rst:202 +msgid "" +"Return a string representing the month's name centered within the specified " +"*width*. If *withyear* is ``True``, include the year in the output. The " +"*theyear* and *themonth* parameters specify the year and month for the name " +"to be formatted respectively." +msgstr "" +"返回一个代表月份名称的在以 *width* 指定的宽度内居中的字符串。 如果 *withyear* 为 ``True``,则会在输出中包括年份。 " +"*theyear* 和 *themonth* 形参指定年份和月份以便其名称可以相应地被格式化。" + +#: ../../library/calendar.rst:210 +msgid "Print a month's calendar as returned by :meth:`formatmonth`." +msgstr "调用 :meth:`formatmonth` 方法并打印返回的月历。" + +#: ../../library/calendar.rst:215 +msgid "" +"Return a *m*-column calendar for an entire year as a multi-line string. " +"Optional parameters *w*, *l*, and *c* are for date column width, lines per " +"week, and number of spaces between month columns, respectively. Depends on " +"the first weekday as specified in the constructor or set by the " +":meth:`setfirstweekday` method. The earliest year for which a calendar can " +"be generated is platform-dependent." +msgstr "" +"返回指定年的用多行字符串表示的 *m* 列年历。可选参数 *w*、*l* 和 *c* " +"分别表示日期列宽,周的行距,和月与月之间的纵向间隔。同样依赖于构造器或者 :meth:`setfirstweekday` " +"方法指定的每周的第一天是哪一天。可以生成年历的最早的年是哪一年依赖于使用的平台。" + +#: ../../library/calendar.rst:225 +msgid "" +"Print the calendar for an entire year as returned by :meth:`formatyear`." +msgstr "调用 :meth:`formatyear` 方法并打印返回的年历。" + +#: ../../library/calendar.rst:230 +msgid "This class can be used to generate HTML calendars." +msgstr "可以使用这个类生成 HTML 日历。" + +#: ../../library/calendar.rst:233 +msgid ":class:`!HTMLCalendar` instances have the following methods:" +msgstr ":class:`!HTMLCalendar` 实例有以下方法:" + +#: ../../library/calendar.rst:237 +msgid "" +"Return a month's calendar as an HTML table. If *withyear* is true the year " +"will be included in the header, otherwise just the month name will be used." +msgstr "返回一个 HTML 表格作为指定年月的日历。 *withyear* 为真,则年份将会包含在表头,否则只显示月份。" + +#: ../../library/calendar.rst:244 +msgid "" +"Return a year's calendar as an HTML table. *width* (defaulting to 3) " +"specifies the number of months per row." +msgstr "返回一个 HTML 表格作为指定年份的日历。 *width* (默认为3) 用于规定每一行显示月份的数量。" + +#: ../../library/calendar.rst:250 +msgid "" +"Return a year's calendar as a complete HTML page. *width* (defaulting to 3) " +"specifies the number of months per row. *css* is the name for the cascading " +"style sheet to be used. :const:`None` can be passed if no style sheet should" +" be used. *encoding* specifies the encoding to be used for the output " +"(defaulting to the system default encoding)." +msgstr "" +"返回一个完整的 HTML 页面作为指定年份的日历。 *width*(默认为3) 用于规定每一行显示的月份数量。 *css* " +"为层叠样式表的名字。如果不使用任何层叠样式表,可以使用 :const:`None` 。 *encoding* 为输出页面的编码 " +"(默认为系统的默认编码)。" + +#: ../../library/calendar.rst:259 +msgid "" +"Return a month name as an HTML table row. If *withyear* is true the year " +"will be included in the row, otherwise just the month name will be used." +msgstr "将一个月份名称以 HTML 表格行的形式返回。 如果 *withyear* 为真值则年份将被包括在行中,否则将只使用月份名称。" + +#: ../../library/calendar.rst:264 +msgid "" +":class:`!HTMLCalendar` has the following attributes you can override to " +"customize the CSS classes used by the calendar:" +msgstr ":class:`!HTMLCalendar` 有以下属性,你可以重写它们来自定义应用日历的样式。" + +#: ../../library/calendar.rst:269 +msgid "" +"A list of CSS classes used for each weekday. The default class list is::" +msgstr "一个对应星期一到星期天的 CSS class 列表。默认列表为 ::" + +#: ../../library/calendar.rst:271 +msgid "cssclasses = [\"mon\", \"tue\", \"wed\", \"thu\", \"fri\", \"sat\", \"sun\"]" +msgstr "cssclasses = [\"mon\", \"tue\", \"wed\", \"thu\", \"fri\", \"sat\", \"sun\"]" + +#: ../../library/calendar.rst:273 +msgid "more styles can be added for each day::" +msgstr "可以向每天加入其它样式 ::" + +#: ../../library/calendar.rst:275 +msgid "cssclasses = [\"mon text-bold\", \"tue\", \"wed\", \"thu\", \"fri\", \"sat\", \"sun red\"]" +msgstr "cssclasses = [\"mon text-bold\", \"tue\", \"wed\", \"thu\", \"fri\", \"sat\", \"sun red\"]" + +#: ../../library/calendar.rst:277 +msgid "Note that the length of this list must be seven items." +msgstr "需要注意的是,列表的长度必须为7。" + +#: ../../library/calendar.rst:282 +msgid "The CSS class for a weekday occurring in the previous or coming month." +msgstr "出现在上个月或下个月的工作日的 CSS 类。" + +#: ../../library/calendar.rst:289 +msgid "" +"A list of CSS classes used for weekday names in the header row. The default " +"is the same as :attr:`cssclasses`." +msgstr "用于标题行中的工作日名称的 CSS 类列表。默认值与 :attr:`cssclasses` 相同。" + +#: ../../library/calendar.rst:297 +msgid "" +"The month's head CSS class (used by :meth:`formatmonthname`). The default " +"value is ``\"month\"``." +msgstr "月份的头 CSS 类(由 :meth:`formatmonthname` 使用)。默认值为 ``\"month\"`` 。" + +#: ../../library/calendar.rst:305 +msgid "" +"The CSS class for the whole month's table (used by :meth:`formatmonth`). The" +" default value is ``\"month\"``." +msgstr "某个月的月历的 CSS 类(由 :meth:`formatmonth` 使用)。默认值为 ``\"month\"`` 。" + +#: ../../library/calendar.rst:313 +msgid "" +"The CSS class for the whole year's table of tables (used by " +":meth:`formatyear`). The default value is ``\"year\"``." +msgstr "某年的年历的 CSS 类(由 :meth:`formatyear` 使用)。默认值为 ``\"year\"`` 。" + +#: ../../library/calendar.rst:321 +msgid "" +"The CSS class for the table head for the whole year (used by " +":meth:`formatyear`). The default value is ``\"year\"``." +msgstr "年历的表头 CSS 类(由 :meth:`formatyear` 使用)。默认值为 ``\"year\"`` 。" + +#: ../../library/calendar.rst:327 +msgid "" +"Note that although the naming for the above described class attributes is " +"singular (e.g. ``cssclass_month`` ``cssclass_noday``), one can replace the " +"single CSS class with a space separated list of CSS classes, for example::" +msgstr "" +"需要注意的是,尽管上面命名的样式类都是单独出现的(如: ``cssclass_month`` ``cssclass_noday``), " +"但我们可以使用空格将样式类列表中的多个元素分隔开,例如::" + +#: ../../library/calendar.rst:331 +msgid "\"text-bold text-red\"" +msgstr "\"text-bold text-red\"" + +#: ../../library/calendar.rst:333 +msgid "Here is an example how :class:`!HTMLCalendar` can be customized::" +msgstr "下面是一个如何自定义 :class:`!HTMLCalendar` 的示例 ::" + +#: ../../library/calendar.rst:335 +msgid "" +"class CustomHTMLCal(calendar.HTMLCalendar):\n" +" cssclasses = [style + \" text-nowrap\" for style in\n" +" calendar.HTMLCalendar.cssclasses]\n" +" cssclass_month_head = \"text-center month-head\"\n" +" cssclass_month = \"text-center month\"\n" +" cssclass_year = \"text-italic lead\"" +msgstr "" +"class CustomHTMLCal(calendar.HTMLCalendar):\n" +" cssclasses = [style + \" text-nowrap\" for style in\n" +" calendar.HTMLCalendar.cssclasses]\n" +" cssclass_month_head = \"text-center month-head\"\n" +" cssclass_month = \"text-center month\"\n" +" cssclass_year = \"text-italic lead\"" + +#: ../../library/calendar.rst:345 +msgid "" +"This subclass of :class:`TextCalendar` can be passed a locale name in the " +"constructor and will return month and weekday names in the specified locale." +msgstr "可以向这个 :class:`TextCalendar` 的子类的构造器传入一个语言区域名称并将返回指定语言区域下的月份和星期名称。" + +#: ../../library/calendar.rst:351 +msgid "" +"This subclass of :class:`HTMLCalendar` can be passed a locale name in the " +"constructor and will return month and weekday names in the specified locale." +msgstr "可以向这个 :class:`HTMLCalendar` 的子类的构造器传入一个语言区域名称并将返回指定语言区域下的月份和星期名称。" + +#: ../../library/calendar.rst:357 +msgid "" +"The constructor, :meth:`!formatweekday` and :meth:`!formatmonthname` methods" +" of these two classes temporarily change the ``LC_TIME`` locale to the given" +" *locale*. Because the current locale is a process-wide setting, they are " +"not thread-safe." +msgstr "" +"这两个类的构造器、:meth:`!formatweekday` 和 :meth:`!formatmonthname` 方法会临时将 " +"``LC_TIME`` 语言区域更改为给定的 *locale*。 因为当前语言区域是进程级的设置,所以它们不是线程安全的。" + +#: ../../library/calendar.rst:363 +msgid "" +"For simple text calendars this module provides the following functions." +msgstr "这个模块为简单的文本日历提供了下列函数。" + +#: ../../library/calendar.rst:367 +msgid "" +"Sets the weekday (``0`` is Monday, ``6`` is Sunday) to start each week. The " +"values :const:`MONDAY`, :const:`TUESDAY`, :const:`WEDNESDAY`, " +":const:`THURSDAY`, :const:`FRIDAY`, :const:`SATURDAY`, and :const:`SUNDAY` " +"are provided for convenience. For example, to set the first weekday to " +"Sunday::" +msgstr "" +"设置每一周的开始 (``0`` 表示星期一,``6`` 表示星期天)。 提供了 " +":const:`MONDAY`、:const:`TUESDAY`、:const:`WEDNESDAY`、:const:`THURSDAY`、:const:`FRIDAY`、:const:`SATURDAY`" +" 和 :const:`SUNDAY` 几个常量值作为方便。 例如,设置每周的第一天为星期天::" + +#: ../../library/calendar.rst:372 +msgid "" +"import calendar\n" +"calendar.setfirstweekday(calendar.SUNDAY)" +msgstr "" +"import calendar\n" +"calendar.setfirstweekday(calendar.SUNDAY)" + +#: ../../library/calendar.rst:378 +msgid "Returns the current setting for the weekday to start each week." +msgstr "返回当前设置的每星期的第一天的数值。" + +#: ../../library/calendar.rst:383 +msgid "" +"Returns :const:`True` if *year* is a leap year, otherwise :const:`False`." +msgstr "如果 *year* 是闰年则返回 :const:`True` ,否则返回 :const:`False`。" + +#: ../../library/calendar.rst:388 +msgid "" +"Returns the number of leap years in the range from *y1* to *y2* (exclusive)," +" where *y1* and *y2* are years." +msgstr "返回在范围 *y1* 至 *y2* (不包括 y2)之间的闰年的年数,其中 *y1* 和 *y2* 是年份。" + +#: ../../library/calendar.rst:391 +msgid "This function works for ranges spanning a century change." +msgstr "此函数对于跨越世纪初的范围也适用。" + +#: ../../library/calendar.rst:396 +msgid "" +"Returns the day of the week (``0`` is Monday) for *year* (``1970``--...), " +"*month* (``1``--``12``), *day* (``1``--``31``)." +msgstr "" +"返回某年( ``1970`` -- ...),某月( ``1`` -- ``12`` ),某日( ``1`` -- ``31`` )是星期几( " +"``0`` 是星期一)。" + +#: ../../library/calendar.rst:402 +msgid "" +"Return a header containing abbreviated weekday names. *width* specifies the " +"width in characters for one weekday." +msgstr "" + +#: ../../library/calendar.rst:408 +msgid "" +"Returns weekday of first day of the month and number of days in month, for " +"the specified *year* and *month*." +msgstr "" + +#: ../../library/calendar.rst:414 +msgid "" +"Returns a matrix representing a month's calendar. Each row represents a " +"week; days outside of the month are represented by zeros. Each week begins " +"with Monday unless set by :func:`setfirstweekday`." +msgstr "" +"返回表示一个月的日历的矩阵。 每一行代表一周;此月份外的日子由零表示。 每周从周一开始,除非使用 :func:`setfirstweekday` " +"改变设置。" + +#: ../../library/calendar.rst:421 +msgid "Prints a month's calendar as returned by :func:`month`." +msgstr "打印由 :func:`month` 返回的一个月的日历。" + +#: ../../library/calendar.rst:426 +msgid "" +"Returns a month's calendar in a multi-line string using the " +":meth:`~TextCalendar.formatmonth` of the :class:`TextCalendar` class." +msgstr "" +"使用 :class:`TextCalendar` 类的 :meth:`~TextCalendar.formatmonth` " +"返回多行字符串形式的月份日历。" + +#: ../../library/calendar.rst:432 +msgid "" +"Prints the calendar for an entire year as returned by :func:`calendar`." +msgstr "打印由 :func:`calendar` 返回的整年的日历。" + +#: ../../library/calendar.rst:437 +msgid "" +"Returns a 3-column calendar for an entire year as a multi-line string using " +"the :meth:`~TextCalendar.formatyear` of the :class:`TextCalendar` class." +msgstr "" +"使用 :class:`TextCalendar` 类的 :meth:`~TextCalendar.formatyear` 返回一个整年的 3 列日历。" + +#: ../../library/calendar.rst:443 +msgid "" +"An unrelated but handy function that takes a time tuple such as returned by " +"the :func:`~time.gmtime` function in the :mod:`time` module, and returns the" +" corresponding Unix timestamp value, assuming an epoch of 1970, and the " +"POSIX encoding. In fact, :func:`time.gmtime` and :func:`timegm` are each " +"other's inverse." +msgstr "" + +#: ../../library/calendar.rst:450 +msgid "The :mod:`!calendar` module exports the following data attributes:" +msgstr "" + +#: ../../library/calendar.rst:454 +msgid "" +"A sequence that represents the days of the week in the current locale, where" +" Monday is day number 0." +msgstr "在当前语言区域下表示周内日期的序列,其中“星期一”为 0 号日。" + +#: ../../library/calendar.rst:464 +msgid "" +"A sequence that represents the abbreviated days of the week in the current " +"locale, where Mon is day number 0." +msgstr "在当前语言区域下简写表示周内日期的序列,其中“一” 为 0 号日。" + +#: ../../library/calendar.rst:479 +msgid "" +"Aliases for the days of the week, where ``MONDAY`` is ``0`` and ``SUNDAY`` " +"is ``6``." +msgstr "星期内每日序号的别名,其中 ``MONDAY`` 是 ``0`` 而 ``SUNDAY`` 是 ``6``。" + +#: ../../library/calendar.rst:487 +msgid "" +"Enumeration defining days of the week as integer constants. The members of " +"this enumeration are exported to the module scope as :data:`MONDAY` through " +":data:`SUNDAY`." +msgstr "" +"将星期内的每一天定义为整数常量的枚举。 该枚举的成员以 :data:`MONDAY` 至 :data:`SUNDAY` 的形式导出到模块作用域。" + +#: ../../library/calendar.rst:496 +msgid "" +"A sequence that represents the months of the year in the current locale. " +"This follows normal convention of January being month number 1, so it has a " +"length of 13 and ``month_name[0]`` is the empty string." +msgstr "" +"在当前语言区域中表示一年中每个月份的序列。 这遵循一月的月序号为 1 的通常惯例,所以其长度为 13 且 ``month_name[0]`` " +"为空字符串。" + +#: ../../library/calendar.rst:507 +msgid "" +"A sequence that represents the abbreviated months of the year in the current" +" locale. This follows normal convention of January being month number 1, so" +" it has a length of 13 and ``month_abbr[0]`` is the empty string." +msgstr "" +"在当前语言区域下简写表示一年中月份的序列。 这遵循一月的月份序号为 1 的通常惯例,所以其长度为 13 且 ``month_abbr[0]`` " +"为空字符串。" + +#: ../../library/calendar.rst:528 +msgid "" +"Aliases for the months of the year, where ``JANUARY`` is ``1`` and " +"``DECEMBER`` is ``12``." +msgstr "一年中各个月份的别名,其中 ``JANUARY`` 是 ``1`` 而 ``DECEMBER`` 是 ``12``。" + +#: ../../library/calendar.rst:536 +msgid "" +"Enumeration defining months of the year as integer constants. The members of" +" this enumeration are exported to the module scope as :data:`JANUARY` " +"through :data:`DECEMBER`." +msgstr "" +"将一年中各个月份定义为整数常量的枚举。 该枚举的成员以 :data:`JANUARY` 至 :data:`DECEMBER` 的形式导出到模块作用域。" + +#: ../../library/calendar.rst:543 +msgid "The :mod:`!calendar` module defines the following exceptions:" +msgstr "" + +#: ../../library/calendar.rst:547 +msgid "" +"A subclass of :exc:`ValueError` and :exc:`IndexError`, raised when the given" +" month number is outside of the range 1-12 (inclusive)." +msgstr "" + +#: ../../library/calendar.rst:550 +msgid "" +":exc:`IllegalMonthError` is now also a subclass of :exc:`ValueError`. New " +"code should avoid catching :exc:`IndexError`." +msgstr "" + +#: ../../library/calendar.rst:557 +msgid "The invalid month number." +msgstr "无效的月份数字。" + +#: ../../library/calendar.rst:562 +msgid "" +"A subclass of :exc:`ValueError`, raised when the given weekday number is " +"outside of the range 0-6 (inclusive)." +msgstr ":exc:`ValueError` 的子类,当给定的星期数字超出 0-6 范围(包含边界值)时引发。" + +#: ../../library/calendar.rst:567 +msgid "The invalid weekday number." +msgstr "无效的星期数字。" + +#: ../../library/calendar.rst:572 +msgid "Module :mod:`datetime`" +msgstr "模块 :mod:`datetime`" + +#: ../../library/calendar.rst:573 +msgid "" +"Object-oriented interface to dates and times with similar functionality to " +"the :mod:`time` module." +msgstr "为日期和时间提供与 :mod:`time` 模块相似功能的面向对象接口。" + +#: ../../library/calendar.rst:576 +msgid "Module :mod:`time`" +msgstr "模块 :mod:`time`" + +#: ../../library/calendar.rst:577 +msgid "Low-level time related functions." +msgstr "底层时间相关函数。" + +#: ../../library/calendar.rst:583 +msgid "Command-line usage" +msgstr "命令行用法" + +#: ../../library/calendar.rst:587 +msgid "" +"The :mod:`!calendar` module can be executed as a script from the command " +"line to interactively print a calendar." +msgstr "" + +#: ../../library/calendar.rst:590 +msgid "" +"python -m calendar [-h] [-L LOCALE] [-e ENCODING] [-t {text,html}]\n" +" [-w WIDTH] [-l LINES] [-s SPACING] [-m MONTHS] [-c CSS]\n" +" [-f FIRST_WEEKDAY] [year] [month]" +msgstr "" +"python -m calendar [-h] [-L LOCALE] [-e ENCODING] [-t {text,html}]\n" +" [-w WIDTH] [-l LINES] [-s SPACING] [-m MONTHS] [-c CSS]\n" +" [-f FIRST_WEEKDAY] [year] [month]" + +#: ../../library/calendar.rst:597 +msgid "For example, to print a calendar for the year 2000:" +msgstr "例如,打印 2000 年的日历:" + +#: ../../library/calendar.rst:599 +msgid "" +"$ python -m calendar 2000\n" +" 2000\n" +"\n" +" January February March\n" +"Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su\n" +" 1 2 1 2 3 4 5 6 1 2 3 4 5\n" +" 3 4 5 6 7 8 9 7 8 9 10 11 12 13 6 7 8 9 10 11 12\n" +"10 11 12 13 14 15 16 14 15 16 17 18 19 20 13 14 15 16 17 18 19\n" +"17 18 19 20 21 22 23 21 22 23 24 25 26 27 20 21 22 23 24 25 26\n" +"24 25 26 27 28 29 30 28 29 27 28 29 30 31\n" +"31\n" +"\n" +" April May June\n" +"Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su\n" +" 1 2 1 2 3 4 5 6 7 1 2 3 4\n" +" 3 4 5 6 7 8 9 8 9 10 11 12 13 14 5 6 7 8 9 10 11\n" +"10 11 12 13 14 15 16 15 16 17 18 19 20 21 12 13 14 15 16 17 18\n" +"17 18 19 20 21 22 23 22 23 24 25 26 27 28 19 20 21 22 23 24 25\n" +"24 25 26 27 28 29 30 29 30 31 26 27 28 29 30\n" +"\n" +" July August September\n" +"Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su\n" +" 1 2 1 2 3 4 5 6 1 2 3\n" +" 3 4 5 6 7 8 9 7 8 9 10 11 12 13 4 5 6 7 8 9 10\n" +"10 11 12 13 14 15 16 14 15 16 17 18 19 20 11 12 13 14 15 16 17\n" +"17 18 19 20 21 22 23 21 22 23 24 25 26 27 18 19 20 21 22 23 24\n" +"24 25 26 27 28 29 30 28 29 30 31 25 26 27 28 29 30\n" +"31\n" +"\n" +" October November December\n" +"Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su\n" +" 1 1 2 3 4 5 1 2 3\n" +" 2 3 4 5 6 7 8 6 7 8 9 10 11 12 4 5 6 7 8 9 10\n" +" 9 10 11 12 13 14 15 13 14 15 16 17 18 19 11 12 13 14 15 16 17\n" +"16 17 18 19 20 21 22 20 21 22 23 24 25 26 18 19 20 21 22 23 24\n" +"23 24 25 26 27 28 29 27 28 29 30 25 26 27 28 29 30 31\n" +"30 31" +msgstr "" +"$ python -m calendar 2000\n" +" 2000\n" +"\n" +" January February March\n" +"Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su\n" +" 1 2 1 2 3 4 5 6 1 2 3 4 5\n" +" 3 4 5 6 7 8 9 7 8 9 10 11 12 13 6 7 8 9 10 11 12\n" +"10 11 12 13 14 15 16 14 15 16 17 18 19 20 13 14 15 16 17 18 19\n" +"17 18 19 20 21 22 23 21 22 23 24 25 26 27 20 21 22 23 24 25 26\n" +"24 25 26 27 28 29 30 28 29 27 28 29 30 31\n" +"31\n" +"\n" +" April May June\n" +"Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su\n" +" 1 2 1 2 3 4 5 6 7 1 2 3 4\n" +" 3 4 5 6 7 8 9 8 9 10 11 12 13 14 5 6 7 8 9 10 11\n" +"10 11 12 13 14 15 16 15 16 17 18 19 20 21 12 13 14 15 16 17 18\n" +"17 18 19 20 21 22 23 22 23 24 25 26 27 28 19 20 21 22 23 24 25\n" +"24 25 26 27 28 29 30 29 30 31 26 27 28 29 30\n" +"\n" +" July August September\n" +"Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su\n" +" 1 2 1 2 3 4 5 6 1 2 3\n" +" 3 4 5 6 7 8 9 7 8 9 10 11 12 13 4 5 6 7 8 9 10\n" +"10 11 12 13 14 15 16 14 15 16 17 18 19 20 11 12 13 14 15 16 17\n" +"17 18 19 20 21 22 23 21 22 23 24 25 26 27 18 19 20 21 22 23 24\n" +"24 25 26 27 28 29 30 28 29 30 31 25 26 27 28 29 30\n" +"31\n" +"\n" +" October November December\n" +"Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su\n" +" 1 1 2 3 4 5 1 2 3\n" +" 2 3 4 5 6 7 8 6 7 8 9 10 11 12 4 5 6 7 8 9 10\n" +" 9 10 11 12 13 14 15 13 14 15 16 17 18 19 11 12 13 14 15 16 17\n" +"16 17 18 19 20 21 22 20 21 22 23 24 25 26 18 19 20 21 22 23 24\n" +"23 24 25 26 27 28 29 27 28 29 30 25 26 27 28 29 30 31\n" +"30 31" + +#: ../../library/calendar.rst:640 +msgid "The following options are accepted:" +msgstr "可以接受以下选项:" + +#: ../../library/calendar.rst:647 +msgid "Show the help message and exit." +msgstr "显示帮助信息并退出。" + +#: ../../library/calendar.rst:652 +msgid "The locale to use for month and weekday names. Defaults to English." +msgstr "月份和星期名称所使用的语言区域。 默认为英语。" + +#: ../../library/calendar.rst:658 +msgid "" +"The encoding to use for output. :option:`--encoding` is required if " +":option:`--locale` is set." +msgstr "输出所使用的编码格式。 如果设置了 :option:`--locale` 则 :option:`--encoding` 将是必须的。" + +#: ../../library/calendar.rst:664 +msgid "Print the calendar to the terminal as text, or as an HTML document." +msgstr "将日历以文本或 HTML 文档的形式打印到终端。" + +#: ../../library/calendar.rst:670 +msgid "" +"The weekday to start each week. Must be a number between 0 (Monday) and 6 " +"(Sunday). Defaults to 0." +msgstr "每个星期的开始星期序号。 必须为 0 (星期一) 到 6 (星期日) 之间的数字。 默认为 0。" + +#: ../../library/calendar.rst:678 +msgid "The year to print the calendar for. Defaults to the current year." +msgstr "要打印日历的年份。 默认为当前年份。" + +#: ../../library/calendar.rst:684 +msgid "" +"The month of the specified :option:`year` to print the calendar for. Must be" +" a number between 1 and 12, and may only be used in text mode. Defaults to " +"printing a calendar for the full year." +msgstr "指定 :option:`year` 中要打印日历的月份。 必须是 1 到 12 之间的数字,且只能在文本模式下使用。 默认打印全年的日历。" + +#: ../../library/calendar.rst:690 +msgid "*Text-mode options:*" +msgstr "*文本模式选项:*" + +#: ../../library/calendar.rst:694 +msgid "" +"The width of the date column in terminal columns. The date is printed " +"centred in the column. Any value lower than 2 is ignored. Defaults to 2." +msgstr "以终端的列数表示的日期列宽度。 日期将打印在列中央。 小于 2 的值将被忽略。 默认为 2。" + +#: ../../library/calendar.rst:702 +msgid "" +"The number of lines for each week in terminal rows. The date is printed top-" +"aligned. Any value lower than 1 is ignored. Defaults to 1." +msgstr "以终端的行数表示的每周的行数。 日期将顶端对齐打印。小于 1 的值将被忽略。 默认为 1。" + +#: ../../library/calendar.rst:710 +msgid "" +"The space between months in columns. Any value lower than 2 is ignored. " +"Defaults to 6." +msgstr "列中的月份之间的空格。 小于 2 的值将被忽略。 默认为 6。" + +#: ../../library/calendar.rst:717 +msgid "The number of months printed per row. Defaults to 3." +msgstr "每行打印的月份数。 默认为 3。" + +#: ../../library/calendar.rst:720 +msgid "" +"By default, today's date is highlighted in color and can be :ref:`controlled" +" using environment variables `." +msgstr "在默认情况下,当天的日期将以彩色高亮并可以 :ref:`使用环境变量来控制 `。" + +#: ../../library/calendar.rst:724 +msgid "*HTML-mode options:*" +msgstr "*HTML 模式选项:*" + +#: ../../library/calendar.rst:728 +msgid "" +"The path of a CSS stylesheet to use for the calendar. This must either be " +"relative to the generated HTML, or an absolute HTTP or ``file:///`` URL." +msgstr "日历要使用的 CSS 样式表的路径。 该路径必须是相对于所生成的 HTML,或是一个绝对 HTTP 或 ``file:///`` URL。" diff --git a/library/cgi.po b/library/cgi.po new file mode 100644 index 0000000000..13d262ccba --- /dev/null +++ b/library/cgi.po @@ -0,0 +1,52 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/cgi.rst:2 +msgid ":mod:`!cgi` --- Common Gateway Interface support" +msgstr ":mod:`!cgi` --- 通用网关接口支持" + +#: ../../library/cgi.rst:10 +msgid "" +"This module is no longer part of the Python standard library. It was " +":ref:`removed in Python 3.13 ` after being deprecated in" +" Python 3.11. The removal was decided in :pep:`594`." +msgstr "" +"此模块已不再是 Python 标准库的一部分。 它在 Python 3.11 中被弃用后又在 :ref:`Python 3.13 中被移除 " +"`。 移除计划是在 :pep:`594` 确定的。" + +#: ../../library/cgi.rst:14 +msgid "" +"A fork of the module on PyPI can be used instead: :pypi:`legacy-cgi`. This " +"is a copy of the cgi module, no longer maintained or supported by the core " +"Python team." +msgstr "" +"可以改用 PyPI 上该模块的分叉版本: :pypi:`legacy-cgi`。 这是 cgi 模块的一个拷贝,不再被核心 Python " +"团队所维护或支持。" + +#: ../../library/cgi.rst:18 +msgid "" +"The last version of Python that provided the :mod:`!cgi` module was `Python " +"3.12 `_." +msgstr "" +"提供 :mod:`!cgi` 模块的最后一个 Python 版本是 `Python 3.12 " +"`_。" diff --git a/library/cgitb.po b/library/cgitb.po new file mode 100644 index 0000000000..40659afc23 --- /dev/null +++ b/library/cgitb.po @@ -0,0 +1,52 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/cgitb.rst:2 +msgid ":mod:`!cgitb` --- Traceback manager for CGI scripts" +msgstr ":mod:`!cgitb` --- 用于 CGI 脚本的回溯管理器" + +#: ../../library/cgitb.rst:10 +msgid "" +"This module is no longer part of the Python standard library. It was " +":ref:`removed in Python 3.13 ` after being deprecated in" +" Python 3.11. The removal was decided in :pep:`594`." +msgstr "" +"此模块已不再是 Python 标准库的一部分。 它在 Python 3.11 中被弃用后又在 :ref:`Python 3.13 中被移除 " +"`。 移除计划是在 :pep:`594` 确定的。" + +#: ../../library/cgitb.rst:14 +msgid "" +"A fork of the module on PyPI can now be used instead: :pypi:`legacy-cgi`. " +"This is a copy of the cgi module, no longer maintained or supported by the " +"core Python team." +msgstr "" +"现在可以改用 PyPI 上该模块的分叉版本: :pypi:`legacy-cgi`。 这是 cgi 模块的一个拷贝,不再被核心 Python " +"团队所维护和支持。" + +#: ../../library/cgitb.rst:18 +msgid "" +"The last version of Python that provided the :mod:`!cgitb` module was " +"`Python 3.12 `_." +msgstr "" +"提供 :mod:`!cgitb` 模块的最后一个 Python 版本是 `Python 3.12 " +"`_。" diff --git a/library/chunk.po b/library/chunk.po new file mode 100644 index 0000000000..5182d5aeab --- /dev/null +++ b/library/chunk.po @@ -0,0 +1,43 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/chunk.rst:2 +msgid ":mod:`!chunk` --- Read IFF chunked data" +msgstr ":mod:`!chunk` --- 读取 IFF 分块数据" + +#: ../../library/chunk.rst:10 +msgid "" +"This module is no longer part of the Python standard library. It was " +":ref:`removed in Python 3.13 ` after being deprecated in" +" Python 3.11. The removal was decided in :pep:`594`." +msgstr "" +"此模块已不再是 Python 标准库的一部分。 它在 Python 3.11 中被弃用后又在 :ref:`Python 3.13 中被移除 " +"`。 移除计划是在 :pep:`594` 确定的。" + +#: ../../library/chunk.rst:14 +msgid "" +"The last version of Python that provided the :mod:`!chunk` module was " +"`Python 3.12 `_." +msgstr "" +"提供 :mod:`!chunk` 模块的最后一个 Python 版本是 `Python 3.12 " +"`_。" diff --git a/library/cmath.po b/library/cmath.po new file mode 100644 index 0000000000..ce748bb560 --- /dev/null +++ b/library/cmath.po @@ -0,0 +1,695 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/cmath.rst:2 +msgid ":mod:`!cmath` --- Mathematical functions for complex numbers" +msgstr ":mod:`!cmath` --- 针对复数的数学函数" + +#: ../../library/cmath.rst:9 +msgid "" +"This module provides access to mathematical functions for complex numbers. " +"The functions in this module accept integers, floating-point numbers or " +"complex numbers as arguments. They will also accept any Python object that " +"has either a :meth:`~object.__complex__` or a :meth:`~object.__float__` " +"method: these methods are used to convert the object to a complex or " +"floating-point number, respectively, and the function is then applied to the" +" result of the conversion." +msgstr "" +"本模块提供了一些适用于复数的数学函数。 本模块中的函数接受整数、浮点数或复数作为参数。 它们也接受任意具有 " +":meth:`~object.__complex__` 或 :meth:`~object.__float__` 方法的 Python " +"对象:这些方法分别用于将对象转换为复数或浮点数,然后再将函数应用于转换后的结果。" + +#: ../../library/cmath.rst:18 +msgid "" +"For functions involving branch cuts, we have the problem of deciding how to " +"define those functions on the cut itself. Following Kahan's \"Branch cuts " +"for complex elementary functions\" paper, as well as Annex G of C99 and " +"later C standards, we use the sign of zero to distinguish one side of the " +"branch cut from the other: for a branch cut along (a portion of) the real " +"axis we look at the sign of the imaginary part, while for a branch cut along" +" the imaginary axis we look at the sign of the real part." +msgstr "" +"对于涉及分支切割的函数,我们会有确定如何在切割本身上定义这些函数的问题。 根据 Kahan 的论文 \"Branch cuts for complex " +"elementary functions\",以及 C99 的附录 G 和之后的 C " +"标准,我们使用零符号来区别分支切割的一侧和另一侧:对于沿实轴(一部分)的分支切割我们要看虚部的符号,而对于沿虚轴的分支切割我们则要看实部的符号。" + +#: ../../library/cmath.rst:26 +msgid "" +"For example, the :func:`cmath.sqrt` function has a branch cut along the " +"negative real axis. An argument of ``-2-0j`` is treated as though it lies " +"*below* the branch cut, and so gives a result on the negative imaginary " +"axis::" +msgstr "" +"例如,:func:`cmath.sqrt` 函数有一个沿着负实轴的支割线。 参数 ``-2-0j`` 会被当作位于支割线的 *下方* " +"来处理,因而将给出一个负虚轴上的结果::" + +#: ../../library/cmath.rst:31 +msgid "" +">>> cmath.sqrt(-2-0j)\n" +"-1.4142135623730951j" +msgstr "" +">>> cmath.sqrt(-2-0j)\n" +"-1.4142135623730951j" + +#: ../../library/cmath.rst:34 +msgid "" +"But an argument of ``-2+0j`` is treated as though it lies above the branch " +"cut::" +msgstr "但是参数 ``-2+0j`` 则会被当作位于支割线的上方来处理::" + +#: ../../library/cmath.rst:37 +msgid "" +">>> cmath.sqrt(-2+0j)\n" +"1.4142135623730951j" +msgstr "" +">>> cmath.sqrt(-2+0j)\n" +"1.4142135623730951j" + +#: ../../library/cmath.rst:42 +msgid "**Conversions to and from polar coordinates**" +msgstr "**针对极坐标的转换**" + +#: ../../library/cmath.rst:44 +msgid ":func:`phase(z) `" +msgstr ":func:`phase(z) `" + +#: ../../library/cmath.rst:44 +msgid "Return the phase of *z*" +msgstr "返回 *z* 的相位" + +#: ../../library/cmath.rst:45 +msgid ":func:`polar(z) `" +msgstr ":func:`polar(z) `" + +#: ../../library/cmath.rst:45 +msgid "Return the representation of *z* in polar coordinates" +msgstr "返回 *z* 的极坐标表示形式" + +#: ../../library/cmath.rst:46 +msgid ":func:`rect(r, phi) `" +msgstr ":func:`rect(r, phi) `" + +#: ../../library/cmath.rst:46 +msgid "Return the complex number *z* with polar coordinates *r* and *phi*" +msgstr "返回具有极坐标 *r* 和 *phi* 的复数 *z*" + +#: ../../library/cmath.rst:48 +msgid "**Power and logarithmic functions**" +msgstr "**幂函数与对数函数**" + +#: ../../library/cmath.rst:50 +msgid ":func:`exp(z) `" +msgstr ":func:`exp(z) `" + +#: ../../library/cmath.rst:50 +msgid "Return *e* raised to the power *z*" +msgstr "返回 *e* 的 *z* 次幂" + +#: ../../library/cmath.rst:51 +msgid ":func:`log(z[, base]) `" +msgstr ":func:`log(z[, base]) `" + +#: ../../library/cmath.rst:51 +msgid "Return the logarithm of *z* to the given *base* (*e* by default)" +msgstr "返回 *z* 的指定底数 *base* (默认为 *e*) 的对数" + +#: ../../library/cmath.rst:52 +msgid ":func:`log10(z) `" +msgstr ":func:`log10(z) `" + +#: ../../library/cmath.rst:52 +msgid "Return the base-10 logarithm of *z*" +msgstr "返回 *z* 的以 10 为底的对数" + +#: ../../library/cmath.rst:53 +msgid ":func:`sqrt(z) `" +msgstr ":func:`sqrt(z) `" + +#: ../../library/cmath.rst:53 +msgid "Return the square root of *z*" +msgstr "返回 *z* 的平方根" + +#: ../../library/cmath.rst:55 +msgid "**Trigonometric functions**" +msgstr "**三角函数**" + +#: ../../library/cmath.rst:57 +msgid ":func:`acos(z) `" +msgstr ":func:`acos(z) `" + +#: ../../library/cmath.rst:57 +msgid "Return the arc cosine of *z*" +msgstr "返回 *z* 的反余弦" + +#: ../../library/cmath.rst:58 +msgid ":func:`asin(z) `" +msgstr ":func:`asin(z) `" + +#: ../../library/cmath.rst:58 +msgid "Return the arc sine of *z*" +msgstr "返回 *z* 的反正弦" + +#: ../../library/cmath.rst:59 +msgid ":func:`atan(z) `" +msgstr ":func:`atan(z) `" + +#: ../../library/cmath.rst:59 +msgid "Return the arc tangent of *z*" +msgstr "返回 *z* 的反正切" + +#: ../../library/cmath.rst:60 +msgid ":func:`cos(z) `" +msgstr ":func:`cos(z) `" + +#: ../../library/cmath.rst:60 +msgid "Return the cosine of *z*" +msgstr "返回 *z* 的余弦" + +#: ../../library/cmath.rst:61 +msgid ":func:`sin(z) `" +msgstr ":func:`sin(z) `" + +#: ../../library/cmath.rst:61 +msgid "Return the sine of *z*" +msgstr "返回 *z* 的正弦" + +#: ../../library/cmath.rst:62 +msgid ":func:`tan(z) `" +msgstr ":func:`tan(z) `" + +#: ../../library/cmath.rst:62 +msgid "Return the tangent of *z*" +msgstr "返回 *z* 的正切" + +#: ../../library/cmath.rst:64 +msgid "**Hyperbolic functions**" +msgstr "**双曲函数**" + +#: ../../library/cmath.rst:66 +msgid ":func:`acosh(z) `" +msgstr ":func:`acosh(z) `" + +#: ../../library/cmath.rst:66 +msgid "Return the inverse hyperbolic cosine of *z*" +msgstr "返回 *z* 的反双曲余弦" + +#: ../../library/cmath.rst:67 +msgid ":func:`asinh(z) `" +msgstr ":func:`asinh(z) `" + +#: ../../library/cmath.rst:67 +msgid "Return the inverse hyperbolic sine of *z*" +msgstr "返回 *z* 的反双曲正弦" + +#: ../../library/cmath.rst:68 +msgid ":func:`atanh(z) `" +msgstr ":func:`atanh(z) `" + +#: ../../library/cmath.rst:68 +msgid "Return the inverse hyperbolic tangent of *z*" +msgstr "返回 *z* 的反双曲正切" + +#: ../../library/cmath.rst:69 +msgid ":func:`cosh(z) `" +msgstr ":func:`cosh(z) `" + +#: ../../library/cmath.rst:69 +msgid "Return the hyperbolic cosine of *z*" +msgstr "返回 *z* 的双曲余弦" + +#: ../../library/cmath.rst:70 +msgid ":func:`sinh(z) `" +msgstr ":func:`sinh(z) `" + +#: ../../library/cmath.rst:70 +msgid "Return the hyperbolic sine of *z*" +msgstr "返回 *z* 的双曲正弦" + +#: ../../library/cmath.rst:71 +msgid ":func:`tanh(z) `" +msgstr ":func:`tanh(z) `" + +#: ../../library/cmath.rst:71 +msgid "Return the hyperbolic tangent of *z*" +msgstr "返回 *z* 的双曲正切" + +#: ../../library/cmath.rst:73 +msgid "**Classification functions**" +msgstr "**分类函数**" + +#: ../../library/cmath.rst:75 +msgid ":func:`isfinite(z) `" +msgstr ":func:`isfinite(z) `" + +#: ../../library/cmath.rst:75 +msgid "Check if all components of *z* are finite" +msgstr "检测是否 *z* 的所有部分均为有限值" + +#: ../../library/cmath.rst:76 +msgid ":func:`isinf(z) `" +msgstr ":func:`isinf(z) `" + +#: ../../library/cmath.rst:76 +msgid "Check if any component of *z* is infinite" +msgstr "检测 *z* 的任一部分是否为无穷大" + +#: ../../library/cmath.rst:77 +msgid ":func:`isnan(z) `" +msgstr ":func:`isnan(z) `" + +#: ../../library/cmath.rst:77 +msgid "Check if any component of *z* is a NaN" +msgstr "检测 *z* 的任一部分是否为 NaN" + +#: ../../library/cmath.rst:78 +msgid ":func:`isclose(a, b, *, rel_tol, abs_tol) `" +msgstr ":func:`isclose(a, b, *, rel_tol, abs_tol) `" + +#: ../../library/cmath.rst:78 +msgid "Check if the values *a* and *b* are close to each other" +msgstr "检查 *a* 和 *b* 的值是否彼此接近" + +#: ../../library/cmath.rst:80 +msgid "**Constants**" +msgstr "**常量**" + +#: ../../library/cmath.rst:82 +msgid ":data:`pi`" +msgstr ":data:`pi`" + +#: ../../library/cmath.rst:82 +msgid "*π* = 3.141592..." +msgstr "*π* = 3.141592..." + +#: ../../library/cmath.rst:83 +msgid ":data:`e`" +msgstr ":data:`e`" + +#: ../../library/cmath.rst:83 +msgid "*e* = 2.718281..." +msgstr "*e* = 2.718281..." + +#: ../../library/cmath.rst:84 +msgid ":data:`tau`" +msgstr ":data:`tau`" + +#: ../../library/cmath.rst:84 +msgid "*τ* = 2\\ *π* = 6.283185..." +msgstr "*τ* = 2\\ *π* = 6.283185..." + +#: ../../library/cmath.rst:85 +msgid ":data:`inf`" +msgstr ":data:`inf`" + +#: ../../library/cmath.rst:85 +msgid "Positive infinity" +msgstr "正无穷" + +#: ../../library/cmath.rst:86 +msgid ":data:`infj`" +msgstr ":data:`infj`" + +#: ../../library/cmath.rst:86 +msgid "Pure imaginary infinity" +msgstr "纯虚部无穷" + +#: ../../library/cmath.rst:87 +msgid ":data:`nan`" +msgstr ":data:`nan`" + +#: ../../library/cmath.rst:87 +msgid "\"Not a number\" (NaN)" +msgstr "\"非数字\" (NaN)" + +#: ../../library/cmath.rst:88 +msgid ":data:`nanj`" +msgstr ":data:`nanj`" + +#: ../../library/cmath.rst:88 +msgid "Pure imaginary NaN" +msgstr "纯虚部 NaN" + +#: ../../library/cmath.rst:93 +msgid "Conversions to and from polar coordinates" +msgstr "到极坐标和从极坐标的转换" + +#: ../../library/cmath.rst:95 +msgid "" +"A Python complex number ``z`` is stored internally using *rectangular* or " +"*Cartesian* coordinates. It is completely determined by its *real part* " +"``z.real`` and its *imaginary part* ``z.imag``." +msgstr "" +"Python 复数 ``z`` 是使用 *直角* 或 *笛卡尔* 坐标在内部存储的。 它完全由其 *实部* ``z.real`` 和 *虚部* " +"``z.imag`` 来确定。" + +#: ../../library/cmath.rst:99 +msgid "" +"*Polar coordinates* give an alternative way to represent a complex number. " +"In polar coordinates, a complex number *z* is defined by the modulus *r* and" +" the phase angle *phi*. The modulus *r* is the distance from *z* to the " +"origin, while the phase *phi* is the counterclockwise angle, measured in " +"radians, from the positive x-axis to the line segment that joins the origin " +"to *z*." +msgstr "" +"*极坐标* 提供了另一种复数的表示方法。在极坐标中,一个复数 *z* 由模量 *r* 和相位角 *phi* 来定义。模量 *r* 是从 *z* " +"到坐标原点的距离,而相位角 *phi* 是以弧度为单位的,逆时针的,从正X轴到连接原点和 *z* 的线段间夹角的角度。" + +#: ../../library/cmath.rst:106 +msgid "" +"The following functions can be used to convert from the native rectangular " +"coordinates to polar coordinates and back." +msgstr "下面的函数可用于原生直角坐标与极坐标的相互转换。" + +#: ../../library/cmath.rst:111 +msgid "" +"Return the phase of *z* (also known as the *argument* of *z*), as a float. " +"``phase(z)`` is equivalent to ``math.atan2(z.imag, z.real)``. The result " +"lies in the range [-\\ *π*, *π*], and the branch cut for this operation lies" +" along the negative real axis. The sign of the result is the same as the " +"sign of ``z.imag``, even when ``z.imag`` is zero::" +msgstr "" +"将 *z* 的相位 (或称 *z* 的 *参数*) 作为一个浮点数返回。 ``phase(z)`` 等价于 ``math.atan2(z.imag, " +"z.real)``。 结果将位于 [-\\ *π*, *π*] 范围内,且此操作的支割线将位于负实轴上。 结果的正负号将与 ``z.imag`` " +"的正负号相同,即使 ``z.imag`` 值为零::" + +#: ../../library/cmath.rst:117 +msgid "" +">>> phase(-1+0j)\n" +"3.141592653589793\n" +">>> phase(-1-0j)\n" +"-3.141592653589793" +msgstr "" +">>> phase(-1+0j)\n" +"3.141592653589793\n" +">>> phase(-1-0j)\n" +"-3.141592653589793" + +#: ../../library/cmath.rst:125 +msgid "" +"The modulus (absolute value) of a complex number *z* can be computed using " +"the built-in :func:`abs` function. There is no separate :mod:`!cmath` " +"module function for this operation." +msgstr "" +"一个复数 *z* 的模(绝对值)可以使用内置的 :func:`abs` 函数来计算。 没有针对此操作的单独 :mod:`!cmath` 模块函数。" + +#: ../../library/cmath.rst:132 +msgid "" +"Return the representation of *z* in polar coordinates. Returns a pair ``(r," +" phi)`` where *r* is the modulus of *z* and *phi* is the phase of *z*. " +"``polar(z)`` is equivalent to ``(abs(z), phase(z))``." +msgstr "" +"返回在极坐标中 *z* 的表示形式。 返回一个数值对 ``(r, phi)`` 其中 *r* 是 *z* 的模数而 *phi* 是 *z* 的相位。 " +"``polar(z)`` 等价于 ``(abs(z), phase(z))``。" + +#: ../../library/cmath.rst:140 +msgid "" +"Return the complex number *z* with polar coordinates *r* and *phi*. " +"Equivalent to ``complex(r * math.cos(phi), r * math.sin(phi))``." +msgstr "" +"返回具有极坐标 *r* 和 *phi* 的复数 *z*。 等价于 ``complex(r * math.cos(phi), r * " +"math.sin(phi))``。" + +#: ../../library/cmath.rst:145 +msgid "Power and logarithmic functions" +msgstr "幂函数与对数函数" + +#: ../../library/cmath.rst:149 +msgid "" +"Return *e* raised to the power *z*, where *e* is the base of natural " +"logarithms." +msgstr "返回 *e* 的 *z* 次方,其中 *e* 是自然对数的底数。" + +#: ../../library/cmath.rst:155 +msgid "" +"Return the logarithm of *z* to the given *base*. If the *base* is not " +"specified, returns the natural logarithm of *z*. There is one branch cut, " +"from 0 along the negative real axis to -∞." +msgstr "" +"返回 *z* 的以给定的 *base* 为底的对数。 如果没有指定 *base*,则返回 *z* 的自然对数。 存在一条支割线,即沿着负实轴从 0 到 " +"-∞。" + +#: ../../library/cmath.rst:162 +msgid "" +"Return the base-10 logarithm of *z*. This has the same branch cut as " +":func:`log`." +msgstr "返回 *z* 的以 10 为底的对数。 它具有与 :func:`log` 相同的支割线。" + +#: ../../library/cmath.rst:168 +msgid "" +"Return the square root of *z*. This has the same branch cut as :func:`log`." +msgstr "返回 *z* 的平方根。 它具有与 :func:`log` 相同的支割线。" + +#: ../../library/cmath.rst:172 +msgid "Trigonometric functions" +msgstr "三角函数" + +#: ../../library/cmath.rst:176 +msgid "" +"Return the arc cosine of *z*. There are two branch cuts: One extends right " +"from 1 along the real axis to ∞. The other extends left from -1 along the " +"real axis to -∞." +msgstr "返回 *z* 的反余弦。 存在两条支割线:一条沿着实轴从 1 到 ∞。 另一条沿着实轴从 -1 向左延伸到 -∞。" + +#: ../../library/cmath.rst:183 +msgid "" +"Return the arc sine of *z*. This has the same branch cuts as :func:`acos`." +msgstr "返回 *z* 的反正弦。 它具有与 :func:`acos` 相同的支割线。" + +#: ../../library/cmath.rst:188 +msgid "" +"Return the arc tangent of *z*. There are two branch cuts: One extends from " +"``1j`` along the imaginary axis to ``∞j``. The other extends from ``-1j`` " +"along the imaginary axis to ``-∞j``." +msgstr "" +"返回 *z* 的反正切。 存在两条支割线:一条沿着虚轴从 ``1j`` 到 ``∞j``。 另一条沿着虚轴从 ``-1j`` 延伸到 ``-∞j``。" + +#: ../../library/cmath.rst:195 +msgid "Return the cosine of *z*." +msgstr "返回 *z* 的余弦。" + +#: ../../library/cmath.rst:200 +msgid "Return the sine of *z*." +msgstr "返回 *z* 的正弦。" + +#: ../../library/cmath.rst:205 +msgid "Return the tangent of *z*." +msgstr "返回 *z* 的正切。" + +#: ../../library/cmath.rst:209 +msgid "Hyperbolic functions" +msgstr "双曲函数" + +#: ../../library/cmath.rst:213 +msgid "" +"Return the inverse hyperbolic cosine of *z*. There is one branch cut, " +"extending left from 1 along the real axis to -∞." +msgstr "返回 *z* 的反双曲余弦。 存在一条支割线,沿着实轴从 1 向左延伸到 -∞。" + +#: ../../library/cmath.rst:219 +msgid "" +"Return the inverse hyperbolic sine of *z*. There are two branch cuts: One " +"extends from ``1j`` along the imaginary axis to ``∞j``. The other extends " +"from ``-1j`` along the imaginary axis to ``-∞j``." +msgstr "" +"返回 *z* 的反双曲正弦。 存在两条支割线:一条沿着虚轴从 ``1j`` 延伸到 ``∞j``。 另一条沿着虚轴从 ``-1j`` 延伸到 " +"``-∞j``。" + +#: ../../library/cmath.rst:226 +msgid "" +"Return the inverse hyperbolic tangent of *z*. There are two branch cuts: One" +" extends from ``1`` along the real axis to ``∞``. The other extends from " +"``-1`` along the real axis to ``-∞``." +msgstr "" +"返回 *z* 的反双曲正切。 存在两条支割线:一条沿着实轴从 ``1`` 延伸到 ``∞``。 另一条沿着实轴从 ``-1`` 延伸到 ``-∞``。" + +#: ../../library/cmath.rst:233 +msgid "Return the hyperbolic cosine of *z*." +msgstr "返回 *z* 的双曲余弦。" + +#: ../../library/cmath.rst:238 +msgid "Return the hyperbolic sine of *z*." +msgstr "返回 *z* 的双曲正弦。" + +#: ../../library/cmath.rst:243 +msgid "Return the hyperbolic tangent of *z*." +msgstr "返回 *z* 的双曲正切。" + +#: ../../library/cmath.rst:247 +msgid "Classification functions" +msgstr "分类函数" + +#: ../../library/cmath.rst:251 +msgid "" +"Return ``True`` if both the real and imaginary parts of *z* are finite, and " +"``False`` otherwise." +msgstr "如果 *z* 的实部和虚部均为有限值则返回 ``True``,否则返回 ``False``。" + +#: ../../library/cmath.rst:259 +msgid "" +"Return ``True`` if either the real or the imaginary part of *z* is an " +"infinity, and ``False`` otherwise." +msgstr "如果 *z* 的实部或虚部为无穷大则返回 ``True``,否则返回 ``False``。" + +#: ../../library/cmath.rst:265 +msgid "" +"Return ``True`` if either the real or the imaginary part of *z* is a NaN, " +"and ``False`` otherwise." +msgstr "如果 *z* 的实部或虚部为 NaN 则返回 ``True``,否则返回 ``False``。" + +#: ../../library/cmath.rst:271 +msgid "" +"Return ``True`` if the values *a* and *b* are close to each other and " +"``False`` otherwise." +msgstr "若 *a* 和 *b* 的值比较接近则返回 ``True``,否则返回 ``False``。" + +#: ../../library/cmath.rst:274 +msgid "" +"Whether or not two values are considered close is determined according to " +"given absolute and relative tolerances. If no errors occur, the result will" +" be: ``abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)``." +msgstr "" +"两个值是否会被视为相近是根据给定的绝对和相对容差来确定的。 如果未发生错误,结果将为: ``abs(a-b) <= max(rel_tol * " +"max(abs(a), abs(b)), abs_tol)``。" + +#: ../../library/cmath.rst:278 +msgid "" +"*rel_tol* is the relative tolerance -- it is the maximum allowed difference " +"between *a* and *b*, relative to the larger absolute value of *a* or *b*. " +"For example, to set a tolerance of 5%, pass ``rel_tol=0.05``. The default " +"tolerance is ``1e-09``, which assures that the two values are the same " +"within about 9 decimal digits. *rel_tol* must be nonnegative and less than " +"``1.0``." +msgstr "" +"*rel_tol* 是相对容差 -- 它是 *a* 和 *b* 之间的最大允许差值,相对于 *a* 或 *b* 中绝对值较大的一个而言。 例如,要设置 " +"5% 的容差,则传入 ``rel_tol=0.05``。 默认的容差为 ``1e-09``,这将确保两个值在大约 9 个十进制数位内是相同的。 " +"*rel_tol* 必须为非负值并且小于 ``1.0``。" + +#: ../../library/cmath.rst:285 +msgid "" +"*abs_tol* is the absolute tolerance; it defaults to ``0.0`` and it must be " +"nonnegative. When comparing ``x`` to ``0.0``, ``isclose(x, 0)`` is computed" +" as ``abs(x) <= rel_tol * abs(x)``, which is ``False`` for any ``x`` and " +"rel_tol less than ``1.0``. So add an appropriate positive abs_tol argument " +"to the call." +msgstr "" +"*abs_tol* 是绝对容差;其默认值为 ``0.0`` 并且必须为非负值。 当将 ``x`` 与 ``0.0`` 比较时,``isclose(x, " +"0)`` 将按 ``abs(x) <= rel_tol * abs(x)`` 来计算,对于 ``x`` 和小于 ``1.0`` 的 rel_tol " +"来说均为 ``False``。 因此请为该调用添一个为适当正值的 abs_tol。" + +#: ../../library/cmath.rst:291 +msgid "" +"The IEEE 754 special values of ``NaN``, ``inf``, and ``-inf`` will be " +"handled according to IEEE rules. Specifically, ``NaN`` is not considered " +"close to any other value, including ``NaN``. ``inf`` and ``-inf`` are only " +"considered close to themselves." +msgstr "" +"IEEE 754特殊值 ``NaN`` , ``inf`` 和 ``-inf`` 将根据IEEE规则处理。具体来说, ``NaN`` " +"不被认为接近任何其他值,包括 ``NaN`` 。 ``inf`` 和 ``-inf`` 只被认为接近自己。" + +#: ../../library/cmath.rst:300 +msgid ":pep:`485` -- A function for testing approximate equality" +msgstr ":pep:`485` —— 用于测试近似相等的函数" + +#: ../../library/cmath.rst:304 +msgid "Constants" +msgstr "常量" + +#: ../../library/cmath.rst:308 +msgid "The mathematical constant *π*, as a float." +msgstr "数学常数 *π* ,作为一个浮点数。" + +#: ../../library/cmath.rst:313 +msgid "The mathematical constant *e*, as a float." +msgstr "数学常数 *e* ,作为一个浮点数。" + +#: ../../library/cmath.rst:318 +msgid "The mathematical constant *τ*, as a float." +msgstr "数学常数 *τ* ,作为一个浮点数。" + +#: ../../library/cmath.rst:325 +msgid "Floating-point positive infinity. Equivalent to ``float('inf')``." +msgstr "浮点正无穷大。相当于 ``float('inf')``。" + +#: ../../library/cmath.rst:332 +msgid "" +"Complex number with zero real part and positive infinity imaginary part. " +"Equivalent to ``complex(0.0, float('inf'))``." +msgstr "具有零实部和正无穷虚部的复数。相当于 ``complex(0.0, float('inf'))``。" + +#: ../../library/cmath.rst:340 +msgid "" +"A floating-point \"not a number\" (NaN) value. Equivalent to " +"``float('nan')``. See also :data:`math.nan`." +msgstr "浮点 \"非数字\" (NaN) 值。 相当于 ``float('nan')``。 另请参阅 :data:`math.nan`。" + +#: ../../library/cmath.rst:348 +msgid "" +"Complex number with zero real part and NaN imaginary part. Equivalent to " +"``complex(0.0, float('nan'))``." +msgstr "具有零实部和 NaN 虚部的复数。相当于 ``complex(0.0, float('nan'))``。" + +#: ../../library/cmath.rst:356 +msgid "" +"Note that the selection of functions is similar, but not identical, to that " +"in module :mod:`math`. The reason for having two modules is that some users" +" aren't interested in complex numbers, and perhaps don't even know what they" +" are. They would rather have ``math.sqrt(-1)`` raise an exception than " +"return a complex number. Also note that the functions defined in " +":mod:`!cmath` always return a complex number, even if the answer can be " +"expressed as a real number (in which case the complex number has an " +"imaginary part of zero)." +msgstr "" +"请注意函数的选择与模块 :mod:`math` 中的相似,但不完全相同。 设置两个模块的理由在于某些用户对复数不感兴趣,也许根本不知道它们是什么。 " +"他们宁愿让 ``math.sqrt(-1)`` 引发异常而不是返回一个复数。 另请注意在 :mod:`!cmath` " +"中定义的函数将始终返回复数,即使结果可以表示为实数(在这种情况下该复数的虚部为零)。" + +#: ../../library/cmath.rst:364 +msgid "" +"A note on branch cuts: They are curves along which the given function fails " +"to be continuous. They are a necessary feature of many complex functions. " +"It is assumed that if you need to compute with complex functions, you will " +"understand about branch cuts. Consult almost any (not too elementary) book " +"on complex variables for enlightenment. For information of the proper " +"choice of branch cuts for numerical purposes, a good reference should be the" +" following:" +msgstr "" +"关于支割线的注释:它们是沿着给定函数无法连续的曲线。它们是许多复变函数的必要特征。 假设您需要使用复变函数进行计算,您将会了解支割线的概念。 " +"请参阅几乎所有关于复变函数的(不太基本)的书来获得启发。 对于如何正确地基于数值目的来选择支割线的相关信息,一个良好的参考如下:" + +#: ../../library/cmath.rst:374 +msgid "" +"Kahan, W: Branch cuts for complex elementary functions; or, Much ado about " +"nothing's sign bit. In Iserles, A., and Powell, M. (eds.), The state of the" +" art in numerical analysis. Clarendon Press (1987) pp165--211." +msgstr "" +"Kahan, W: Branch cuts for complex elementary functions; or, Much ado about " +"nothing's sign bit. In Iserles, A., and Powell, M. (eds.), The state of the " +"art in numerical analysis. Clarendon Press (1987) pp165--211." + +#: ../../library/cmath.rst:354 +msgid "module" +msgstr "module" + +#: ../../library/cmath.rst:354 +msgid "math" +msgstr "math" diff --git a/library/cmd.po b/library/cmd.po new file mode 100644 index 0000000000..4b7872194e --- /dev/null +++ b/library/cmd.po @@ -0,0 +1,667 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/cmd.rst:2 +msgid ":mod:`!cmd` --- Support for line-oriented command interpreters" +msgstr ":mod:`!cmd` --- 对面向行的命令解释器的支持" + +#: ../../library/cmd.rst:9 +msgid "**Source code:** :source:`Lib/cmd.py`" +msgstr "**源代码:** :source:`Lib/cmd.py`" + +#: ../../library/cmd.rst:13 +msgid "" +"The :class:`Cmd` class provides a simple framework for writing line-oriented" +" command interpreters. These are often useful for test harnesses, " +"administrative tools, and prototypes that will later be wrapped in a more " +"sophisticated interface." +msgstr "" +":class:`Cmd` 类提供简单框架用于编写面向行的命令解释器。 这些通常对测试工具,管理工具和原型有用,这些工具随后将被包含在更复杂的接口中。" + +#: ../../library/cmd.rst:20 +msgid "" +"A :class:`Cmd` instance or subclass instance is a line-oriented interpreter " +"framework. There is no good reason to instantiate :class:`Cmd` itself; " +"rather, it's useful as a superclass of an interpreter class you define " +"yourself in order to inherit :class:`Cmd`'s methods and encapsulate action " +"methods." +msgstr "" +"一个 :class:`Cmd` 实例或子类实例是面向行的解释器框架结构。 实例化 :class:`Cmd` 本身是没有充分理由的, " +"它作为自定义解释器类的超类是非常有用的为了继承 :class:`Cmd` 的方法并且封装动作方法。" + +#: ../../library/cmd.rst:25 +msgid "" +"The optional argument *completekey* is the :mod:`readline` name of a " +"completion key; it defaults to :kbd:`Tab`. If *completekey* is not " +":const:`None` and :mod:`readline` is available, command completion is done " +"automatically." +msgstr "" +"可选参数 *completekey* 是完成键的 :mod:`readline` 名称;默认是 :kbd:`Tab` 。如果 *completekey*" +" 不是 :const:`None` 并且 :mod:`readline` 是可用的, 命令完成会自动完成。" + +#: ../../library/cmd.rst:29 +msgid "" +"The default, ``'tab'``, is treated specially, so that it refers to the " +":kbd:`Tab` key on every :data:`readline.backend`. Specifically, if " +":data:`readline.backend` is ``editline``, ``Cmd`` will use ``'^I'`` instead " +"of ``'tab'``. Note that other values are not treated this way, and might " +"only work with a specific backend." +msgstr "" +"默认值 ``'tab'`` 会被特殊对待,以使其在任何 :data:`readline.backend` 上都指向 :kbd:`Tab` 键。 " +"根据特殊规则,如果 :data:`readline.backend` 是 ``editline``,``Cmd`` 将使用 ``'^I'`` 而不是 " +"``'tab'``。 请注意其它的值不会以这种方式来处理,并可能仅适用于特定的后端。" + +#: ../../library/cmd.rst:36 +msgid "" +"The optional arguments *stdin* and *stdout* specify the input and output " +"file objects that the Cmd instance or subclass instance will use for input " +"and output. If not specified, they will default to :data:`sys.stdin` and " +":data:`sys.stdout`." +msgstr "" +"可选参数 *stdin* 和 *stdout* 指定了 Cmd 实例或子类实例将用于输入和输出的文件对象。如果没有指定,它们将默认为 " +":data:`sys.stdin` 和 :data:`sys.stdout` 。" + +#: ../../library/cmd.rst:41 +msgid "" +"If you want a given *stdin* to be used, make sure to set the instance's " +":attr:`use_rawinput` attribute to ``False``, otherwise *stdin* will be " +"ignored." +msgstr "" +"如果你想要使用一个给定的 *stdin* ,确保将实例的 :attr:`use_rawinput` 属性设置为 ``False`` ,否则 " +"*stdin* 将被忽略。" + +#: ../../library/cmd.rst:45 +msgid "``completekey='tab'`` is replaced by ``'^I'`` for ``editline``." +msgstr "对于 ``editline`` 来说 ``completekey='tab'`` 将被替换为 ``'^I'``。" + +#: ../../library/cmd.rst:52 +msgid "Cmd Objects" +msgstr "Cmd 对象" + +#: ../../library/cmd.rst:54 +msgid "A :class:`Cmd` instance has the following methods:" +msgstr ":class:`Cmd` 实例有下列方法:" + +#: ../../library/cmd.rst:59 +msgid "" +"Repeatedly issue a prompt, accept input, parse an initial prefix off the " +"received input, and dispatch to action methods, passing them the remainder " +"of the line as argument." +msgstr "反复发出提示,接受输入,从收到的输入中解析出一个初始前缀,并分派给操作方法,将其余的行作为参数传递给它们。" + +#: ../../library/cmd.rst:63 +msgid "" +"The optional argument is a banner or intro string to be issued before the " +"first prompt (this overrides the :attr:`intro` class attribute)." +msgstr "可选参数是在第一个提示之前发布的横幅或介绍字符串(这将覆盖 :attr:`intro` 类属性)。" + +#: ../../library/cmd.rst:66 +msgid "" +"If the :mod:`readline` module is loaded, input will automatically inherit " +":program:`bash`\\ -like history-list editing (e.g. :kbd:`Control-P` scrolls " +"back to the last command, :kbd:`Control-N` forward to the next one, " +":kbd:`Control-F` moves the cursor to the right non-destructively, " +":kbd:`Control-B` moves the cursor to the left non-destructively, etc.)." +msgstr "" +"如果 :mod:`readline` 模块已被加载,输入将自动继承类似 :program:`bash`\\ 的历史列表编辑功能(例如, " +":kbd:`Control-P` 滚动到上一条命令,:kbd:`Control-N` 前进到下一条命令,:kbd:`Control-F` " +"非破坏性地将光标向右移动,:kbd:`Control-B` 非破坏性地将光标向左移动,等等)。" + +#: ../../library/cmd.rst:72 +msgid "An end-of-file on input is passed back as the string ``'EOF'``." +msgstr "输入的文件结束符将作为字符串 ``'EOF'`` 被传回。" + +#: ../../library/cmd.rst:78 +msgid "" +"An interpreter instance will recognize a command name ``foo`` if and only if" +" it has a method :meth:`!do_foo`. As a special case, a line beginning with " +"the character ``'?'`` is dispatched to the method :meth:`do_help`. As " +"another special case, a line beginning with the character ``'!'`` is " +"dispatched to the method :meth:`!do_shell` (if such a method is defined)." +msgstr "" +"当且仅当命令名称 ``foo`` 具有 :meth:`!do_foo` 方法时解释器实例才会识别它。 存在一种特殊情况,以字符 ``'?'`` " +"开头的行将被分派给 :meth:`do_help` 方法。 还存在另一种特殊情况,以字符 ``'!'`` 开头的行将被分派给 " +":meth:`!do_shell` 方法(如果定义了该方法的话)。" + +#: ../../library/cmd.rst:84 +msgid "" +"This method will return when the :meth:`postcmd` method returns a true " +"value. The *stop* argument to :meth:`postcmd` is the return value from the " +"command's corresponding :meth:`!do_\\*` method." +msgstr "" +"当 :meth:`postcmd` 方法返回真值时此方法将返回。 :meth:`postcmd` 的 *stop* 参数是命令对应的 " +":meth:`!do_\\*` 方法的返回值。" + +#: ../../library/cmd.rst:88 +msgid "" +"If completion is enabled, completing commands will be done automatically, " +"and completing of commands args is done by calling :meth:`!complete_foo` " +"with arguments *text*, *line*, *begidx*, and *endidx*. *text* is the string" +" prefix we are attempting to match: all returned matches must begin with it." +" *line* is the current input line with leading whitespace removed, *begidx* " +"and *endidx* are the beginning and ending indexes of the prefix text, which " +"could be used to provide different completion depending upon which position " +"the argument is in." +msgstr "" +"如果启用了补全,则会自动完成命令的补全,命令参数的补全则是通过调用 :meth:`!complete_foo` 并附带参数 *text*, " +"*line*, *begidx* 和 *endidx* 来完成的。 *text* 是我们要尝试匹配的字符串前缀:所有被返回的匹配必须以它为开头。 " +"*line* 是去除了开头空白符的当前输入行,*begidx* 和 *endidx* " +"是前缀文本的开始和结束索引号,它们可被用来根据参数所在的位置提供不同的补全。" + +#: ../../library/cmd.rst:99 +msgid "" +"All subclasses of :class:`Cmd` inherit a predefined :meth:`!do_help`. This " +"method, called with an argument ``'bar'``, invokes the corresponding method " +":meth:`!help_bar`, and if that is not present, prints the docstring of " +":meth:`!do_bar`, if available. With no argument, :meth:`!do_help` lists all" +" available help topics (that is, all commands with corresponding " +":meth:`!help_\\*` methods or commands that have docstrings), and also lists " +"any undocumented commands." +msgstr "" +"所有 :class:`Cmd` 的子类都继承了一个预定义的 :meth:`!do_help`。 调用该方法时传入一个参数 " +"``'bar'``,将唤起对应的方法 :meth:`!help_bar`,如果该方法不存在,则将打印 :meth:`!do_bar` " +"的文档字符串,如果有文档字符串的话。 在没有参数的情况下,:meth:`!do_help` 将列出所有可用的帮助主题(即任何具有对应的 " +":meth:`!help_\\*` 方法的命令或具有文档字符串的命令),还会列出任何未写入文档的命令。" + +#: ../../library/cmd.rst:110 +msgid "" +"Interpret the argument as though it had been typed in response to the " +"prompt. This may be overridden, but should not normally need to be; see the " +":meth:`precmd` and :meth:`postcmd` methods for useful execution hooks. The " +"return value is a flag indicating whether interpretation of commands by the " +"interpreter should stop. If there is a :meth:`!do_\\*` method for the " +"command *str*, the return value of that method is returned, otherwise the " +"return value from the :meth:`default` method is returned." +msgstr "" +"解释该参数就好像它是为响应提示而键入的一样。 此方法可以被重写,但通常不需要这样做;请参阅针对有用的执行钩子的 :meth:`precmd` 和 " +":meth:`postcmd` 方法。 返回值是一个指明解释器对命令的解释是否应停止的旗标。 如果对于命令 *str* 存在 " +":meth:`!do_\\*` 方法,则将返回该方法的返回值,否则将返回 :meth:`default` 方法的返回值。" + +#: ../../library/cmd.rst:121 +msgid "" +"Method called when an empty line is entered in response to the prompt. If " +"this method is not overridden, it repeats the last nonempty command entered." +msgstr "在响应提示输入空行时调用的方法。如果此方法未被覆盖,则重复输入的最后一个非空命令。" + +#: ../../library/cmd.rst:127 +msgid "" +"Method called on an input line when the command prefix is not recognized. If" +" this method is not overridden, it prints an error message and returns." +msgstr "当命令前缀不能被识别的时候在输入行调用的方法。如果此方法未被覆盖,它将输出一个错误信息并返回。" + +#: ../../library/cmd.rst:133 +msgid "" +"Method called to complete an input line when no command-specific " +":meth:`!complete_\\*` method is available. By default, it returns an empty " +"list." +msgstr "当没有命令专属的 :meth:`!complete_\\*` 方法可供使用时将被调用以完成输入行的方法。 在默认情况下,它将返回一个空列表。" + +#: ../../library/cmd.rst:139 +msgid "" +"Method called to display a list of strings as a compact set of columns. Each" +" column is only as wide as necessary. Columns are separated by two spaces " +"for readability." +msgstr "调用以将一个字符串列表显示为紧凑的列集的方法。 每列的宽度仅够显示其内容。 各列之间以两个空格分隔以保证可读性。" + +#: ../../library/cmd.rst:146 +msgid "" +"Hook method executed just before the command line *line* is interpreted, but" +" after the input prompt is generated and issued. This method is a stub in " +":class:`Cmd`; it exists to be overridden by subclasses. The return value is" +" used as the command which will be executed by the :meth:`onecmd` method; " +"the :meth:`precmd` implementation may re-write the command or simply return " +"*line* unchanged." +msgstr "" +"钩方法在命令行 *line* 被解释之前执行,但是在输入提示被生成和发出后。这个方法是一个在 :class:`Cmd` " +"中的存根;它的存在是为了被子类覆盖。返回值被用作 :meth:`onecmd` 方法执行的命令; :meth:`precmd` " +"的实现或许会重写命令或者简单地返回 *line* 不变。" + +#: ../../library/cmd.rst:156 +msgid "" +"Hook method executed just after a command dispatch is finished. This method" +" is a stub in :class:`Cmd`; it exists to be overridden by subclasses. " +"*line* is the command line which was executed, and *stop* is a flag which " +"indicates whether execution will be terminated after the call to " +":meth:`postcmd`; this will be the return value of the :meth:`onecmd` method." +" The return value of this method will be used as the new value for the " +"internal flag which corresponds to *stop*; returning false will cause " +"interpretation to continue." +msgstr "" +"钩方法只在命令调度完成后执行。这个方法是一个在 :class:`Cmd` 中的存根;它的存在是为了被子类覆盖。 *line* 是被执行的命令行, " +"*stop* 是一个表示在调用 :meth:`postcmd` 之后是否终止执行的标志;这将作为 :meth:`onecmd` " +"方法的返回值。这个方法的返回值被用作与 *stop* 相关联的内部标志的新值;返回 false 将导致解释继续。" + +#: ../../library/cmd.rst:167 +msgid "" +"Hook method executed once when :meth:`cmdloop` is called. This method is a " +"stub in :class:`Cmd`; it exists to be overridden by subclasses." +msgstr "钩方法当 :meth:`cmdloop` 被调用时执行一次。此方法是一个在 :class:`Cmd` 中的存根;它的存在是为了被子类覆盖。" + +#: ../../library/cmd.rst:173 +msgid "" +"Hook method executed once when :meth:`cmdloop` is about to return. This " +"method is a stub in :class:`Cmd`; it exists to be overridden by subclasses." +msgstr "" +"钩方法在 :meth:`cmdloop` 即将返回时执行一次。这个方法是一个在 :class:`Cmd` 中的存根;它的存在是为了被子类覆盖。" + +#: ../../library/cmd.rst:177 +msgid "" +"Instances of :class:`Cmd` subclasses have some public instance variables:" +msgstr ":class:`Cmd` 的子类的实例有一些公共实例变量:" + +#: ../../library/cmd.rst:181 +msgid "The prompt issued to solicit input." +msgstr "用于请求输入的提示符。" + +#: ../../library/cmd.rst:186 +msgid "The string of characters accepted for the command prefix." +msgstr "接受命令前缀的字符串。" + +#: ../../library/cmd.rst:191 +msgid "The last nonempty command prefix seen." +msgstr "最近的非空命令前缀。" + +#: ../../library/cmd.rst:196 +msgid "" +"A list of queued input lines. The cmdqueue list is checked in " +":meth:`cmdloop` when new input is needed; if it is nonempty, its elements " +"will be processed in order, as if entered at the prompt." +msgstr "" +"排队的输入行列表。当需要新的输入时,在 :meth:`cmdloop` 中检查 cmdqueue " +"列表;如果它不是空的,它的元素将被按顺序处理,就像在提示符处输入一样。" + +#: ../../library/cmd.rst:203 +msgid "" +"A string to issue as an intro or banner. May be overridden by giving the " +":meth:`cmdloop` method an argument." +msgstr "要作为简介或横幅发出的字符串。 可以通过给 :meth:`cmdloop` 方法一个参数来覆盖它。" + +#: ../../library/cmd.rst:209 +msgid "" +"The header to issue if the help output has a section for documented " +"commands." +msgstr "如果帮助输出包含一个已记录命令的小节时要发出的标题。" + +#: ../../library/cmd.rst:214 +msgid "" +"The header to issue if the help output has a section for miscellaneous help" +" topics (that is, there are :meth:`!help_\\*` methods without corresponding " +":meth:`!do_\\*` methods)." +msgstr "" +"如果帮助输出包含一个杂项帮助主题小节时(也就是说,存在没有对应 :meth:`!do_\\*` 方法的 :meth:`!help_\\*` " +"方法)要发出的标题。" + +#: ../../library/cmd.rst:221 +msgid "" +"The header to issue if the help output has a section for undocumented " +"commands (that is, there are :meth:`!do_\\*` methods without corresponding " +":meth:`!help_\\*` methods)." +msgstr "" +"如果帮助输出包含一个未写入文档的命令小节时(也就是说,存在没有对应 :meth:`!help_\\*` 方法的 :meth:`!do_\\*` " +"方法)要发出的标题。" + +#: ../../library/cmd.rst:228 +msgid "" +"The character used to draw separator lines under the help-message headers. " +"If empty, no ruler line is drawn. It defaults to ``'='``." +msgstr "用于在帮助信息标题的下方绘制分隔符的字符,如果为空,则不绘制标尺线。这个字符默认是 ``'='`` 。" + +#: ../../library/cmd.rst:234 +msgid "" +"A flag, defaulting to true. If true, :meth:`cmdloop` uses :func:`input` to " +"display a prompt and read the next command; if false, " +":data:`sys.stdout.write() ` and :data:`sys.stdin.readline() " +"` are used. (This means that by importing :mod:`readline`, on " +"systems that support it, the interpreter will automatically support " +":program:`Emacs`\\ -like line editing and command-history keystrokes.)" +msgstr "" +"一个旗标,默认为真值。 如为真值,:meth:`cmdloop` 将使用 :func:`input` 显示一条提示并读取下一个命令;如为假值,则将使用 " +":data:`sys.stdout.write() ` 和 :data:`sys.stdin.readline() " +"`。 (这意味着通过在受支持的系统上导入 :mod:`readline`,解释器将自动支持类似 :program:`Emacs` " +"的行编辑和命令历史按键操作。)" + +#: ../../library/cmd.rst:244 +msgid "Cmd Example" +msgstr "Cmd 例子" + +#: ../../library/cmd.rst:248 +msgid "" +"The :mod:`!cmd` module is mainly useful for building custom shells that let " +"a user work with a program interactively." +msgstr "" +":mod:`!cmd` 模块主要被用于构建自定义 shell 让用户以交互的方式使用一个程序。模块主要被用于构建自定义 shell " +"让用户以交互的方式使用一个程序。" + +#: ../../library/cmd.rst:251 +msgid "" +"This section presents a simple example of how to build a shell around a few " +"of the commands in the :mod:`turtle` module." +msgstr "这部分提供了一个简单的例子来介绍如何使用一部分在 :mod:`turtle` 模块中的命令构建一个 shell 。" + +#: ../../library/cmd.rst:254 +msgid "" +"Basic turtle commands such as :meth:`~turtle.forward` are added to a " +":class:`Cmd` subclass with method named :meth:`!do_forward`. The argument " +"is converted to a number and dispatched to the turtle module. The docstring" +" is used in the help utility provided by the shell." +msgstr "" +"基本 turtle 命令比如 :meth:`~turtle.forward` 将被添加到一个具有名为 :meth:`!do_forward` 的方法的 " +":class:`Cmd` 子类。 参数将被转换为数字并发送给 turtle 模块。 文档字符串将被用于 shell 所提供的帮助工具。" + +#: ../../library/cmd.rst:259 +msgid "" +"The example also includes a basic record and playback facility implemented " +"with the :meth:`~Cmd.precmd` method which is responsible for converting the " +"input to lowercase and writing the commands to a file. The " +":meth:`!do_playback` method reads the file and adds the recorded commands to" +" the :attr:`~Cmd.cmdqueue` for immediate playback::" +msgstr "" +"该示例还包括一个通过 :meth:`~Cmd.precmd` 方法实现的基本录制和回放工具,这个方法负责将输入转换为小写形式并将命令写入到文件。 " +":meth:`!do_playback` 方法将读取文件并将被录制的命令添加到 :attr:`~Cmd.cmdqueue` 用于立即回放::" + +#: ../../library/cmd.rst:265 +msgid "" +"import cmd, sys\n" +"from turtle import *\n" +"\n" +"class TurtleShell(cmd.Cmd):\n" +" intro = 'Welcome to the turtle shell. Type help or ? to list commands.\\n'\n" +" prompt = '(turtle) '\n" +" file = None\n" +"\n" +" # ----- basic turtle commands -----\n" +" def do_forward(self, arg):\n" +" 'Move the turtle forward by the specified distance: FORWARD 10'\n" +" forward(*parse(arg))\n" +" def do_right(self, arg):\n" +" 'Turn turtle right by given number of degrees: RIGHT 20'\n" +" right(*parse(arg))\n" +" def do_left(self, arg):\n" +" 'Turn turtle left by given number of degrees: LEFT 90'\n" +" left(*parse(arg))\n" +" def do_goto(self, arg):\n" +" 'Move turtle to an absolute position with changing orientation. GOTO 100 200'\n" +" goto(*parse(arg))\n" +" def do_home(self, arg):\n" +" 'Return turtle to the home position: HOME'\n" +" home()\n" +" def do_circle(self, arg):\n" +" 'Draw circle with given radius an options extent and steps: CIRCLE 50'\n" +" circle(*parse(arg))\n" +" def do_position(self, arg):\n" +" 'Print the current turtle position: POSITION'\n" +" print('Current position is %d %d\\n' % position())\n" +" def do_heading(self, arg):\n" +" 'Print the current turtle heading in degrees: HEADING'\n" +" print('Current heading is %d\\n' % (heading(),))\n" +" def do_color(self, arg):\n" +" 'Set the color: COLOR BLUE'\n" +" color(arg.lower())\n" +" def do_undo(self, arg):\n" +" 'Undo (repeatedly) the last turtle action(s): UNDO'\n" +" def do_reset(self, arg):\n" +" 'Clear the screen and return turtle to center: RESET'\n" +" reset()\n" +" def do_bye(self, arg):\n" +" 'Stop recording, close the turtle window, and exit: BYE'\n" +" print('Thank you for using Turtle')\n" +" self.close()\n" +" bye()\n" +" return True\n" +"\n" +" # ----- record and playback -----\n" +" def do_record(self, arg):\n" +" 'Save future commands to filename: RECORD rose.cmd'\n" +" self.file = open(arg, 'w')\n" +" def do_playback(self, arg):\n" +" 'Playback commands from a file: PLAYBACK rose.cmd'\n" +" self.close()\n" +" with open(arg) as f:\n" +" self.cmdqueue.extend(f.read().splitlines())\n" +" def precmd(self, line):\n" +" line = line.lower()\n" +" if self.file and 'playback' not in line:\n" +" print(line, file=self.file)\n" +" return line\n" +" def close(self):\n" +" if self.file:\n" +" self.file.close()\n" +" self.file = None\n" +"\n" +"def parse(arg):\n" +" 'Convert a series of zero or more numbers to an argument tuple'\n" +" return tuple(map(int, arg.split()))\n" +"\n" +"if __name__ == '__main__':\n" +" TurtleShell().cmdloop()" +msgstr "" +"import cmd, sys\n" +"from turtle import *\n" +"\n" +"class TurtleShell(cmd.Cmd):\n" +" intro = 'Welcome to the turtle shell. Type help or ? to list commands.\\n'\n" +" prompt = '(turtle) '\n" +" file = None\n" +"\n" +" # ----- 基本 turtle 命令 -----\n" +" def do_forward(self, arg):\n" +" 'Move the turtle forward by the specified distance: FORWARD 10'\n" +" forward(*parse(arg))\n" +" def do_right(self, arg):\n" +" 'Turn turtle right by given number of degrees: RIGHT 20'\n" +" right(*parse(arg))\n" +" def do_left(self, arg):\n" +" 'Turn turtle left by given number of degrees: LEFT 90'\n" +" left(*parse(arg))\n" +" def do_goto(self, arg):\n" +" 'Move turtle to an absolute position with changing orientation. GOTO 100 200'\n" +" goto(*parse(arg))\n" +" def do_home(self, arg):\n" +" 'Return turtle to the home position: HOME'\n" +" home()\n" +" def do_circle(self, arg):\n" +" 'Draw circle with given radius an options extent and steps: CIRCLE 50'\n" +" circle(*parse(arg))\n" +" def do_position(self, arg):\n" +" 'Print the current turtle position: POSITION'\n" +" print('Current position is %d %d\\n' % position())\n" +" def do_heading(self, arg):\n" +" 'Print the current turtle heading in degrees: HEADING'\n" +" print('Current heading is %d\\n' % (heading(),))\n" +" def do_color(self, arg):\n" +" 'Set the color: COLOR BLUE'\n" +" color(arg.lower())\n" +" def do_undo(self, arg):\n" +" 'Undo (repeatedly) the last turtle action(s): UNDO'\n" +" def do_reset(self, arg):\n" +" 'Clear the screen and return turtle to center: RESET'\n" +" reset()\n" +" def do_bye(self, arg):\n" +" 'Stop recording, close the turtle window, and exit: BYE'\n" +" print('Thank you for using Turtle')\n" +" self.close()\n" +" bye()\n" +" return True\n" +"\n" +" # ----- 记录和回放 -----\n" +" def do_record(self, arg):\n" +" 'Save future commands to filename: RECORD rose.cmd'\n" +" self.file = open(arg, 'w')\n" +" def do_playback(self, arg):\n" +" 'Playback commands from a file: PLAYBACK rose.cmd'\n" +" self.close()\n" +" with open(arg) as f:\n" +" self.cmdqueue.extend(f.read().splitlines())\n" +" def precmd(self, line):\n" +" line = line.lower()\n" +" if self.file and 'playback' not in line:\n" +" print(line, file=self.file)\n" +" return line\n" +" def close(self):\n" +" if self.file:\n" +" self.file.close()\n" +" self.file = None\n" +"\n" +"def parse(arg):\n" +" 'Convert a series of zero or more numbers to an argument tuple'\n" +" return tuple(map(int, arg.split()))\n" +"\n" +"if __name__ == '__main__':\n" +" TurtleShell().cmdloop()" + +#: ../../library/cmd.rst:340 +msgid "" +"Here is a sample session with the turtle shell showing the help functions, " +"using blank lines to repeat commands, and the simple record and playback " +"facility:" +msgstr "这是一个示例会话,其中 turtle shell 显示帮助功能,使用空行重复命令,以及简单的记录和回放功能:" + +#: ../../library/cmd.rst:343 +msgid "" +"Welcome to the turtle shell. Type help or ? to list commands.\n" +"\n" +"(turtle) ?\n" +"\n" +"Documented commands (type help ):\n" +"========================================\n" +"bye color goto home playback record right\n" +"circle forward heading left position reset undo\n" +"\n" +"(turtle) help forward\n" +"Move the turtle forward by the specified distance: FORWARD 10\n" +"(turtle) record spiral.cmd\n" +"(turtle) position\n" +"Current position is 0 0\n" +"\n" +"(turtle) heading\n" +"Current heading is 0\n" +"\n" +"(turtle) reset\n" +"(turtle) circle 20\n" +"(turtle) right 30\n" +"(turtle) circle 40\n" +"(turtle) right 30\n" +"(turtle) circle 60\n" +"(turtle) right 30\n" +"(turtle) circle 80\n" +"(turtle) right 30\n" +"(turtle) circle 100\n" +"(turtle) right 30\n" +"(turtle) circle 120\n" +"(turtle) right 30\n" +"(turtle) circle 120\n" +"(turtle) heading\n" +"Current heading is 180\n" +"\n" +"(turtle) forward 100\n" +"(turtle)\n" +"(turtle) right 90\n" +"(turtle) forward 100\n" +"(turtle)\n" +"(turtle) right 90\n" +"(turtle) forward 400\n" +"(turtle) right 90\n" +"(turtle) forward 500\n" +"(turtle) right 90\n" +"(turtle) forward 400\n" +"(turtle) right 90\n" +"(turtle) forward 300\n" +"(turtle) playback spiral.cmd\n" +"Current position is 0 0\n" +"\n" +"Current heading is 0\n" +"\n" +"Current heading is 180\n" +"\n" +"(turtle) bye\n" +"Thank you for using Turtle" +msgstr "" +"Welcome to the turtle shell. Type help or ? to list commands.\n" +"\n" +"(turtle) ?\n" +"\n" +"Documented commands (type help ):\n" +"========================================\n" +"bye color goto home playback record right\n" +"circle forward heading left position reset undo\n" +"\n" +"(turtle) help forward\n" +"Move the turtle forward by the specified distance: FORWARD 10\n" +"(turtle) record spiral.cmd\n" +"(turtle) position\n" +"Current position is 0 0\n" +"\n" +"(turtle) heading\n" +"Current heading is 0\n" +"\n" +"(turtle) reset\n" +"(turtle) circle 20\n" +"(turtle) right 30\n" +"(turtle) circle 40\n" +"(turtle) right 30\n" +"(turtle) circle 60\n" +"(turtle) right 30\n" +"(turtle) circle 80\n" +"(turtle) right 30\n" +"(turtle) circle 100\n" +"(turtle) right 30\n" +"(turtle) circle 120\n" +"(turtle) right 30\n" +"(turtle) circle 120\n" +"(turtle) heading\n" +"Current heading is 180\n" +"\n" +"(turtle) forward 100\n" +"(turtle)\n" +"(turtle) right 90\n" +"(turtle) forward 100\n" +"(turtle)\n" +"(turtle) right 90\n" +"(turtle) forward 400\n" +"(turtle) right 90\n" +"(turtle) forward 500\n" +"(turtle) right 90\n" +"(turtle) forward 400\n" +"(turtle) right 90\n" +"(turtle) forward 300\n" +"(turtle) playback spiral.cmd\n" +"Current position is 0 0\n" +"\n" +"Current heading is 0\n" +"\n" +"Current heading is 180\n" +"\n" +"(turtle) bye\n" +"Thank you for using Turtle" + +#: ../../library/cmd.rst:74 +msgid "? (question mark)" +msgstr "? (问号)" + +#: ../../library/cmd.rst:74 +msgid "in a command interpreter" +msgstr "在命令解释器中" + +#: ../../library/cmd.rst:74 +msgid "! (exclamation)" +msgstr "! (感叹号)" diff --git a/library/cmdline.po b/library/cmdline.po new file mode 100644 index 0000000000..d365333707 --- /dev/null +++ b/library/cmdline.po @@ -0,0 +1,240 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# Freesand Leo , 2025 +# 99 , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:00+0000\n" +"Last-Translator: 99 , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/cmdline.rst:5 +msgid "Modules command-line interface (CLI)" +msgstr "模块命令行界面(CLI)" + +#: ../../library/cmdline.rst:7 +msgid "The following modules have a command-line interface." +msgstr "下列模块具有命令行界面。" + +#: ../../library/cmdline.rst:9 +msgid ":ref:`ast `" +msgstr ":ref:`ast `" + +#: ../../library/cmdline.rst:10 +msgid ":ref:`asyncio `" +msgstr ":ref:`asyncio `" + +#: ../../library/cmdline.rst:11 +msgid ":mod:`base64`" +msgstr ":mod:`base64`" + +#: ../../library/cmdline.rst:12 +msgid ":ref:`calendar `" +msgstr ":ref:`calendar `" + +#: ../../library/cmdline.rst:13 +msgid ":mod:`code`" +msgstr ":mod:`code`" + +#: ../../library/cmdline.rst:14 +msgid ":ref:`compileall `" +msgstr ":ref:`compileall `" + +#: ../../library/cmdline.rst:15 +msgid "``cProfile``: see :ref:`profiling.tracing `" +msgstr "" + +#: ../../library/cmdline.rst:16 +msgid ":ref:`dis `" +msgstr ":ref:`dis `" + +#: ../../library/cmdline.rst:17 +msgid ":ref:`doctest `" +msgstr ":ref:`doctest `" + +#: ../../library/cmdline.rst:18 +msgid ":mod:`!encodings.rot_13`" +msgstr ":mod:`!encodings.rot_13`" + +#: ../../library/cmdline.rst:19 +msgid ":ref:`ensurepip `" +msgstr ":ref:`ensurepip `" + +#: ../../library/cmdline.rst:20 +msgid ":mod:`filecmp`" +msgstr ":mod:`filecmp`" + +#: ../../library/cmdline.rst:21 +msgid ":mod:`fileinput`" +msgstr ":mod:`fileinput`" + +#: ../../library/cmdline.rst:22 +msgid ":mod:`ftplib`" +msgstr ":mod:`ftplib`" + +#: ../../library/cmdline.rst:23 +msgid ":ref:`gzip `" +msgstr ":ref:`gzip `" + +#: ../../library/cmdline.rst:24 +msgid ":ref:`http.server `" +msgstr ":ref:`http.server `" + +#: ../../library/cmdline.rst:25 +msgid ":ref:`idlelib `" +msgstr ":ref:`idlelib `" + +#: ../../library/cmdline.rst:26 +msgid ":ref:`inspect `" +msgstr ":ref:`inspect `" + +#: ../../library/cmdline.rst:27 +msgid ":ref:`json `" +msgstr ":ref:`json `" + +#: ../../library/cmdline.rst:28 +msgid ":ref:`mimetypes `" +msgstr ":ref:`mimetypes `" + +#: ../../library/cmdline.rst:29 +msgid ":ref:`pdb `" +msgstr ":ref:`pdb `" + +#: ../../library/cmdline.rst:30 +msgid ":ref:`pickle `" +msgstr ":ref:`pickle `" + +#: ../../library/cmdline.rst:31 +msgid ":ref:`pickletools `" +msgstr ":ref:`pickletools `" + +#: ../../library/cmdline.rst:32 +msgid ":ref:`platform `" +msgstr ":ref:`platform `" + +#: ../../library/cmdline.rst:33 +msgid ":mod:`poplib`" +msgstr ":mod:`poplib`" + +#: ../../library/cmdline.rst:34 +msgid ":ref:`profiling.sampling `" +msgstr "" + +#: ../../library/cmdline.rst:35 +msgid ":ref:`profiling.tracing `" +msgstr "" + +#: ../../library/cmdline.rst:36 +msgid ":ref:`pstats `" +msgstr "" + +#: ../../library/cmdline.rst:37 +msgid ":ref:`py_compile `" +msgstr ":ref:`py_compile `" + +#: ../../library/cmdline.rst:38 +msgid ":mod:`pyclbr`" +msgstr ":mod:`pyclbr`" + +#: ../../library/cmdline.rst:39 +msgid ":mod:`pydoc`" +msgstr ":mod:`pydoc`" + +#: ../../library/cmdline.rst:40 +msgid ":mod:`quopri`" +msgstr ":mod:`quopri`" + +#: ../../library/cmdline.rst:41 +msgid ":ref:`random `" +msgstr ":ref:`random `" + +#: ../../library/cmdline.rst:42 +msgid ":mod:`runpy`" +msgstr ":mod:`runpy`" + +#: ../../library/cmdline.rst:43 +msgid ":ref:`site `" +msgstr ":ref:`site `" + +#: ../../library/cmdline.rst:44 +msgid ":ref:`sqlite3 `" +msgstr ":ref:`sqlite3 `" + +#: ../../library/cmdline.rst:45 +msgid ":ref:`symtable `" +msgstr ":ref:`symtable `" + +#: ../../library/cmdline.rst:46 +msgid ":ref:`sysconfig `" +msgstr ":ref:`sysconfig `" + +#: ../../library/cmdline.rst:47 +msgid ":mod:`tabnanny`" +msgstr ":mod:`tabnanny`" + +#: ../../library/cmdline.rst:48 +msgid ":ref:`tarfile `" +msgstr ":ref:`tarfile `" + +#: ../../library/cmdline.rst:49 +msgid ":mod:`!this`" +msgstr ":mod:`!this`" + +#: ../../library/cmdline.rst:50 +msgid ":ref:`timeit `" +msgstr ":ref:`timeit `" + +#: ../../library/cmdline.rst:51 +msgid ":ref:`tokenize `" +msgstr ":ref:`tokenize `" + +#: ../../library/cmdline.rst:52 +msgid ":ref:`trace `" +msgstr ":ref:`trace `" + +#: ../../library/cmdline.rst:53 +msgid ":mod:`turtledemo`" +msgstr ":mod:`turtledemo`" + +#: ../../library/cmdline.rst:54 +msgid ":ref:`unittest `" +msgstr ":ref:`unittest `" + +#: ../../library/cmdline.rst:55 +msgid ":ref:`uuid `" +msgstr ":ref:`uuid `" + +#: ../../library/cmdline.rst:56 +msgid ":ref:`venv `" +msgstr ":ref:`venv `" + +#: ../../library/cmdline.rst:57 +msgid ":ref:`webbrowser `" +msgstr ":ref:`webbrowser `" + +#: ../../library/cmdline.rst:58 +msgid ":ref:`zipapp `" +msgstr ":ref:`zipapp `" + +#: ../../library/cmdline.rst:59 +msgid ":ref:`zipfile `" +msgstr ":ref:`zipfile `" + +#: ../../library/cmdline.rst:61 +msgid "See also the :ref:`Python command-line interface `." +msgstr "另请参阅 :ref:`Python 命令行界面 `。" diff --git a/library/cmdlinelibs.po b/library/cmdlinelibs.po new file mode 100644 index 0000000000..8ce03aa25b --- /dev/null +++ b/library/cmdlinelibs.po @@ -0,0 +1,36 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/cmdlinelibs.rst:5 +msgid "Command-line interface libraries" +msgstr "命令行界面库" + +#: ../../library/cmdlinelibs.rst:7 +msgid "" +"The modules described in this chapter assist with implementing command line " +"and terminal interfaces for applications." +msgstr "本章介绍的模块可以为应用程序实现命令行和终端界面。" + +#: ../../library/cmdlinelibs.rst:10 +msgid "Here's an overview:" +msgstr "以下是一个概览:" diff --git a/library/code.po b/library/code.po new file mode 100644 index 0000000000..4bd05146ec --- /dev/null +++ b/library/code.po @@ -0,0 +1,304 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/code.rst:2 +msgid ":mod:`!code` --- Interpreter base classes" +msgstr ":mod:`!code` --- 解释器基类" + +#: ../../library/code.rst:7 +msgid "**Source code:** :source:`Lib/code.py`" +msgstr "**源代码:** :source:`Lib/code.py`" + +#: ../../library/code.rst:11 +msgid "" +"The ``code`` module provides facilities to implement read-eval-print loops " +"in Python. Two classes and convenience functions are included which can be " +"used to build applications which provide an interactive interpreter prompt." +msgstr "" +"``code`` 模块提供了在 Python 中实现 read-eval-print " +"循环的功能。它包含两个类和一些快捷功能,可用于构建提供交互式解释器的应用程序。" + +#: ../../library/code.rst:18 +msgid "" +"This class deals with parsing and interpreter state (the user's namespace); " +"it does not deal with input buffering or prompting or input file naming (the" +" filename is always passed in explicitly). The optional *locals* argument " +"specifies a mapping to use as the namespace in which code will be executed; " +"it defaults to a newly created dictionary with key ``'__name__'`` set to " +"``'__console__'`` and key ``'__doc__'`` set to ``None``." +msgstr "" +"这个类会处理解析和解释器状态(用户的命名空间);它不会处理输入缓冲、提示或输入文件命名(文件名总是显式地传入)。 可选的 *locals* " +"参数指定一个映射作为代码执行所在的命名空间;它默认是一个新创建的字典,该字典中的键 ``'__name__'`` 设为 " +"``'__console__'`` 而键 ``'__doc__'`` 设为 ``None``。" + +#: ../../library/code.rst:25 +msgid "" +"Note that functions and classes objects created under an " +":class:`!InteractiveInterpreter` instance will belong to the namespace " +"specified by *locals*. They are only pickleable if *locals* is the namespace" +" of an existing module." +msgstr "" +"请注意在 :class:`!InteractiveInterpreter` 实例下创建的函数和类对象将属于由 *locals* 指定的命名空间。 只有当" +" *locals* 是现有模块的命名空间时它们才是可 pickle 的。" + +#: ../../library/code.rst:34 +msgid "" +"Closely emulate the behavior of the interactive Python interpreter. This " +"class builds on :class:`InteractiveInterpreter` and adds prompting using the" +" familiar ``sys.ps1`` and ``sys.ps2``, and input buffering. If *local_exit* " +"is true, ``exit()`` and ``quit()`` in the console will not raise " +":exc:`SystemExit`, but instead return to the calling code." +msgstr "" +"高度模仿交互式 Python 解释器的行为。 这个类基于 :class:`InteractiveInterpreter` 构建并使用熟悉的 " +"``sys.ps1`` 和 ``sys.ps2`` 来增加提示,以及输入缓冲功能。 如果 *local_exit* 为真值,控制台中的 " +"``exit()`` 和 ``quit()`` 将不会引发 :exc:`SystemExit`,而是返回到调用方代码。" + +#: ../../library/code.rst:40 ../../library/code.rst:58 +msgid "Added *local_exit* parameter." +msgstr "增加了 *local_exit* 形参。" + +#: ../../library/code.rst:45 +msgid "" +"Convenience function to run a read-eval-print loop. This creates a new " +"instance of :class:`InteractiveConsole` and sets *readfunc* to be used as " +"the :meth:`InteractiveConsole.raw_input` method, if provided. If *local* is" +" provided, it is passed to the :class:`InteractiveConsole` constructor for " +"use as the default namespace for the interpreter loop. If *local_exit* is " +"provided, it is passed to the :class:`InteractiveConsole` constructor. The " +":meth:`~InteractiveConsole.interact` method of the instance is then run with" +" *banner* and *exitmsg* passed as the banner and exit message to use, if " +"provided. The console object is discarded after use." +msgstr "" +"运行一个读取-求值-打印循环的便捷函数。 这会创建一个新的 :class:`InteractiveConsole` 实例并设置 *readfunc* " +"作为 :meth:`InteractiveConsole.raw_input` 方法,如果有提供的话。 如果提供了 *local*,它将被传给 " +":class:`InteractiveConsole` 构造器以用作解释器循环的默认命名空间。 如果提供了 *local_exit*,它将被传给 " +":class:`InteractiveConsole` 构造器。 实例的 :meth:`~InteractiveConsole.interact` " +"方法将随后运行并传入 *banner* 和 *exitmsg* 以作为标题和退出消息,如果有提供的话。 控制台对象在使用后将被丢弃。" + +#: ../../library/code.rst:55 +msgid "Added *exitmsg* parameter." +msgstr "加入 *exitmsg* 参数。" + +#: ../../library/code.rst:63 +msgid "" +"This function is useful for programs that want to emulate Python's " +"interpreter main loop (a.k.a. the read-eval-print loop). The tricky part is" +" to determine when the user has entered an incomplete command that can be " +"completed by entering more text (as opposed to a complete command or a " +"syntax error). This function *almost* always makes the same decision as the" +" real interpreter main loop." +msgstr "" +"这个函数主要用来模拟 Python 解释器的主循环(即 read-eval-print " +"循环)。难点的部分是当用户输入不完整命令时,判断能否通过之后的输入来完成(要么成为完整的命令,要么语法错误)。该函数 *几乎* " +"和实际的解释器主循环的判断是相同的。" + +#: ../../library/code.rst:70 +msgid "" +"*source* is the source string; *filename* is the optional filename from " +"which source was read, defaulting to ``''``; and *symbol* is the " +"optional grammar start symbol, which should be ``'single'`` (the default), " +"``'eval'`` or ``'exec'``." +msgstr "" +"*source* 是源字符串;*filename* 是可选的用作读取源的文件名,默认为 ``''``;*symbol* " +"是可选的语法开启符号,应为 ``'single'`` (默认), ``'eval'`` 或 ``'exec'``。" + +#: ../../library/code.rst:75 +msgid "" +"Returns a code object (the same as ``compile(source, filename, symbol)``) if" +" the command is complete and valid; ``None`` if the command is incomplete; " +"raises :exc:`SyntaxError` if the command is complete and contains a syntax " +"error, or raises :exc:`OverflowError` or :exc:`ValueError` if the command " +"contains an invalid literal." +msgstr "" +"如果命令完整且有效则返回一个代码对象 (等价于 ``compile(source, filename, symbol)``);如果命令不完整则返回 " +"``None``;如果命令完整但包含语法错误则会引发 :exc:`SyntaxError` 或 :exc:`OverflowError` " +"而如果命令包含无效字面值则将引发 :exc:`ValueError`。" + +#: ../../library/code.rst:85 +msgid "Interactive Interpreter Objects" +msgstr "交互解释器对象" + +#: ../../library/code.rst:90 +msgid "" +"Compile and run some source in the interpreter. Arguments are the same as " +"for :func:`compile_command`; the default for *filename* is ``''``, " +"and for *symbol* is ``'single'``. One of several things can happen:" +msgstr "" +"在解释器中编译并运行一段源码。 所用参数与 :func:`compile_command` 一样;*filename* 的默认值为 " +"``''``,*symbol* 则为 ``'single'``。 可能发生以下情况之一:" + +#: ../../library/code.rst:94 +msgid "" +"The input is incorrect; :func:`compile_command` raised an exception " +"(:exc:`SyntaxError` or :exc:`OverflowError`). A syntax traceback will be " +"printed by calling the :meth:`showsyntaxerror` method. :meth:`runsource` " +"returns ``False``." +msgstr "" +"输入不正确;:func:`compile_command` 引发了一个异常 (:exc:`SyntaxError` 或 " +":exc:`OverflowError`)。 将通过调用 :meth:`showsyntaxerror` 方法打印语法回溯信息。 " +":meth:`runsource` 返回 ``False``。" + +#: ../../library/code.rst:99 +msgid "" +"The input is incomplete, and more input is required; :func:`compile_command`" +" returned ``None``. :meth:`runsource` returns ``True``." +msgstr "" +"输入不完整,需要更多输入;函数 :func:`compile_command` 返回 ``None`` 。方法 :meth:`runsource` 返回" +" ``True`` 。" + +#: ../../library/code.rst:102 +msgid "" +"The input is complete; :func:`compile_command` returned a code object. The " +"code is executed by calling the :meth:`runcode` (which also handles run-time" +" exceptions, except for :exc:`SystemExit`). :meth:`runsource` returns " +"``False``." +msgstr "" +"输入完整;:func:`compile_command` 返回了一个代码对象。 将通过调用 :meth:`runcode` " +"执行代码(该方法也会处理运行时异常,:exc:`SystemExit` 除外)。 :meth:`runsource` 返回 ``False``。" + +#: ../../library/code.rst:106 +msgid "" +"The return value can be used to decide whether to use ``sys.ps1`` or " +"``sys.ps2`` to prompt the next line." +msgstr "该返回值用于决定使用 ``sys.ps1`` 还是 ``sys.ps2`` 来作为下一行的输入提示符。" + +#: ../../library/code.rst:112 +msgid "" +"Execute a code object. When an exception occurs, :meth:`showtraceback` is " +"called to display a traceback. All exceptions are caught except " +":exc:`SystemExit`, which is allowed to propagate." +msgstr "" +"执行一个代码对象。当发生异常时,调用 :meth:`showtraceback` 来显示回溯。除 :exc:`SystemExit` " +"(允许传播)以外的所有异常都会被捕获。" + +#: ../../library/code.rst:116 +msgid "" +"A note about :exc:`KeyboardInterrupt`: this exception may occur elsewhere in" +" this code, and may not always be caught. The caller should be prepared to " +"deal with it." +msgstr "" +"有关 :exc:`KeyboardInterrupt` 的说明,该异常可能发生于此代码的其他位置,并且并不总能被捕获。 调用者应当准备好处理它。" + +#: ../../library/code.rst:123 +msgid "" +"Display the syntax error that just occurred. This does not display a stack " +"trace because there isn't one for syntax errors. If *filename* is given, it " +"is stuffed into the exception instead of the default filename provided by " +"Python's parser, because it always uses ``''`` when reading from a " +"string. The output is written by the :meth:`write` method." +msgstr "" +"显示刚发生的语法错误。 这不会显示堆栈回溯因为语法错误并无此种信息。 如果给出了 *filename*,它会被放入异常来替代 Python " +"解析器所提供的默认文件名,因为它在从一个字符串读取时总是会使用 ``''``。 输出将由 :meth:`write` 方法来写入。" + +#: ../../library/code.rst:132 +msgid "" +"Display the exception that just occurred. We remove the first stack item " +"because it is within the interpreter object implementation. The output is " +"written by the :meth:`write` method." +msgstr "显示刚发生的异常。 我们移除了第一个堆栈条目因为它从属于解释器对象的实现。 输出将由 :meth:`write` 方法来写入。" + +#: ../../library/code.rst:136 +msgid "" +"The full chained traceback is displayed instead of just the primary " +"traceback." +msgstr "将显示完整的链式回溯,而不只是主回溯。" + +#: ../../library/code.rst:142 +msgid "" +"Write a string to the standard error stream (``sys.stderr``). Derived " +"classes should override this to provide the appropriate output handling as " +"needed." +msgstr "将一个字符串写入到标准错误流 (``sys.stderr``)。 派生类应重写此方法以提供必要的正确输出处理。" + +#: ../../library/code.rst:149 +msgid "Interactive Console Objects" +msgstr "交互式控制台对象" + +#: ../../library/code.rst:151 +msgid "" +"The :class:`InteractiveConsole` class is a subclass of " +":class:`InteractiveInterpreter`, and so offers all the methods of the " +"interpreter objects as well as the following additions." +msgstr "" +":class:`InteractiveConsole` 类是 :class:`InteractiveInterpreter` " +"的子类,因此它提供了解释器对象的所有方法,还有以下的额外方法。" + +#: ../../library/code.rst:158 +msgid "" +"Closely emulate the interactive Python console. The optional *banner* " +"argument specify the banner to print before the first interaction; by " +"default it prints a banner similar to the one printed by the standard Python" +" interpreter, followed by the class name of the console object in " +"parentheses (so as not to confuse this with the real interpreter -- since " +"it's so close!)." +msgstr "" +"近似地模拟交互式 Python 终端。 可选的 *banner* 参数指定要在第一次交互前打印的条幅;默认情况下会类似于标准 Python " +"解释器所打印的内容,并附上外加圆括号的终端对象类名(这样就不会与真正的解释器混淆 —— 因为确实太像了!)" + +#: ../../library/code.rst:164 +msgid "" +"The optional *exitmsg* argument specifies an exit message printed when " +"exiting. Pass the empty string to suppress the exit message. If *exitmsg* is" +" not given or ``None``, a default message is printed." +msgstr "" +"可选的 *exitmsg* 参数指定要在退出时打印的退出消息。 传入空字符串可以屏蔽退出消息。 如果 *exitmsg* 未给出或为 " +"``None``,则将打印默认消息。" + +#: ../../library/code.rst:168 +msgid "To suppress printing any banner, pass an empty string." +msgstr "要禁止打印任何条幅消息,请传递一个空字符串。" + +#: ../../library/code.rst:171 +msgid "Print an exit message when exiting." +msgstr "退出时打印退出消息。" + +#: ../../library/code.rst:177 +msgid "" +"Push a line of source text to the interpreter. The line should not have a " +"trailing newline; it may have internal newlines. The line is appended to a " +"buffer and the interpreter's :meth:`~InteractiveInterpreter.runsource` " +"method is called with the concatenated contents of the buffer as source. If" +" this indicates that the command was executed or invalid, the buffer is " +"reset; otherwise, the command is incomplete, and the buffer is left as it " +"was after the line was appended. The return value is ``True`` if more input" +" is required, ``False`` if the line was dealt with in some way (this is the " +"same as :meth:`!runsource`)." +msgstr "" +"将一行源代码文本推入解释器。 行内容不应带有末尾换行符;它可以有内部换行符。 行内容会被添加到一缓冲区然后调用解释器的 " +":meth:`~InteractiveInterpreter.runsource` 方法并附带缓冲区内容的拼接结果作为源文本。 " +"如果提示命令已执行或不合法,缓冲区将被重置;在其他情况下,则命令不完整,缓冲区将在添加行后保持原样。 如果需要更多的输入则返回值为 " +"``True``,如果行已按某种方式被处理则返回值为 ``False`` (这与 :meth:`!runsource` 相同)。" + +#: ../../library/code.rst:189 +msgid "Remove any unhandled source text from the input buffer." +msgstr "从输入缓冲区中删除所有未处理的内容。" + +#: ../../library/code.rst:194 +msgid "" +"Write a prompt and read a line. The returned line does not include the " +"trailing newline. When the user enters the EOF key sequence, " +":exc:`EOFError` is raised. The base implementation reads from ``sys.stdin``;" +" a subclass may replace this with a different implementation." +msgstr "" +"输出提示并读取一行。返回的行不包含末尾的换行符。当用户输入 EOF 键序列时,会引发 :exc:`EOFError` 异常。默认实现是从 " +"``sys.stdin`` 读取;子类可以用其他实现代替。" diff --git a/library/codecs.po b/library/codecs.po new file mode 100644 index 0000000000..709d5cd95f --- /dev/null +++ b/library/codecs.po @@ -0,0 +1,3209 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-15 16:52+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/codecs.rst:2 +msgid ":mod:`!codecs` --- Codec registry and base classes" +msgstr ":mod:`!codecs` --- 编解码器注册和相关基类" + +#: ../../library/codecs.rst:11 +msgid "**Source code:** :source:`Lib/codecs.py`" +msgstr "**源代码:** :source:`Lib/codecs.py`" + +#: ../../library/codecs.rst:23 +msgid "" +"This module defines base classes for standard Python codecs (encoders and " +"decoders) and provides access to the internal Python codec registry, which " +"manages the codec and error handling lookup process. Most standard codecs " +"are :term:`text encodings `, which encode text to bytes (and " +"decode bytes to text), but there are also codecs provided that encode text " +"to text, and bytes to bytes. Custom codecs may encode and decode between " +"arbitrary types, but some module features are restricted to be used " +"specifically with :term:`text encodings ` or with codecs that" +" encode to :class:`bytes`." +msgstr "" +"这个模块定义了标准 Python 编解码器(编码器和解码器)的基类并提供对内部 Python " +"编解码器注册表的访问,该注册表负责管理编解码器和错误处理的查找过程。 大多数标准编解码器都属于 :term:`文本编码格式 `,它们可将文本编码为字节串(以及将字节串解码为文本),但也提供了一些将文本编码为文本,以及将字节串编码为字节串的编解码器。 " +"自定义编解码器可以在任意类型间进行编码和解码,但某些模块特性被限制为仅适用于 :term:`文本编码格式 ` " +"或将数据编码为 :class:`bytes` 的编解码器。" + +#: ../../library/codecs.rst:33 +msgid "" +"The module defines the following functions for encoding and decoding with " +"any codec:" +msgstr "该模块定义了以下用于使用任何编解码器进行编码和解码的函数:" + +#: ../../library/codecs.rst:38 +msgid "Encodes *obj* using the codec registered for *encoding*." +msgstr "使用为 *encoding* 注册的编解码器对 *obj* 进行编码。" + +#: ../../library/codecs.rst:40 +msgid "" +"*Errors* may be given to set the desired error handling scheme. The default " +"error handler is ``'strict'`` meaning that encoding errors raise " +":exc:`ValueError` (or a more codec specific subclass, such as " +":exc:`UnicodeEncodeError`). Refer to :ref:`codec-base-classes` for more " +"information on codec error handling." +msgstr "" +"可以给定 *Errors* 以设置所需要的错误处理方案。 默认的错误处理方案 ``'strict'`` 表示编码错误将引发 " +":exc:`ValueError` (或更特定编解码器相关的子类,例如 :exc:`UnicodeEncodeError`)。 请参阅 " +":ref:`codec-base-classes` 了解有关编解码器错误处理的更多信息。" + +#: ../../library/codecs.rst:48 +msgid "Decodes *obj* using the codec registered for *encoding*." +msgstr "使用为 *encoding* 注册的编解码器对 *obj* 进行解码。" + +#: ../../library/codecs.rst:50 +msgid "" +"*Errors* may be given to set the desired error handling scheme. The default " +"error handler is ``'strict'`` meaning that decoding errors raise " +":exc:`ValueError` (or a more codec specific subclass, such as " +":exc:`UnicodeDecodeError`). Refer to :ref:`codec-base-classes` for more " +"information on codec error handling." +msgstr "" +"可以给定 *Errors* 以设置所需要的错误处理方案。 默认的错误处理方案 ``'strict'`` 表示解码错误将引发 " +":exc:`ValueError` (或更特定编解码器相关的子类,例如 :exc:`UnicodeDecodeError`)。 请参阅 " +":ref:`codec-base-classes` 了解有关编解码器错误处理的更多信息。" + +#: ../../library/codecs.rst:58 +msgid "" +"Return a mapping suitable for encoding with a custom single-byte encoding. " +"Given a :class:`str` *string* of up to 256 characters representing a " +"decoding table, returns either a compact internal mapping object " +"``EncodingMap`` or a :class:`dictionary ` mapping character ordinals " +"to byte values. Raises a :exc:`TypeError` on invalid input." +msgstr "" +"返回一个适用于以自定义单字节编码格式进行编码的映射。 给定一个表示解码表的至多 256 个字符的 :class:`str` " +"*string*,返回一个将字符序号映射到字节值的紧凑内部映射对象 ``EncodingMap`` 或 :class:`字典 `。 " +"对于不合法的输入将引发 :exc:`TypeError`。" + +#: ../../library/codecs.rst:64 +msgid "The full details for each codec can also be looked up directly:" +msgstr "每种编解码器的完整细节也可以直接查找获取:" + +#: ../../library/codecs.rst:68 +msgid "" +"Looks up the codec info in the Python codec registry and returns a " +":class:`CodecInfo` object as defined below." +msgstr "在 Python 编解码器注册表中查找编解码器信息,并返回一个 :class:`CodecInfo` 对象,其定义见下文。" + +#: ../../library/codecs.rst:71 +msgid "" +"Encodings are first looked up in the registry's cache. If not found, the " +"list of registered search functions is scanned. If no :class:`CodecInfo` " +"object is found, a :exc:`LookupError` is raised. Otherwise, the " +":class:`CodecInfo` object is stored in the cache and returned to the caller." +msgstr "" +"首先将会在注册表缓存中查找编码,如果未找到,则会扫描注册的搜索函数列表。 如果没有找到 :class:`CodecInfo` 对象,则将引发 " +":exc:`LookupError`。 否则,:class:`CodecInfo` 对象将被存入缓存并返回给调用者。" + +#: ../../library/codecs.rst:78 +msgid "" +"Codec details when looking up the codec registry. The constructor arguments " +"are stored in attributes of the same name:" +msgstr "查找编解码器注册表所得到的编解码器细节信息。 构造器参数将保存为同名的属性:" + +#: ../../library/codecs.rst:84 +msgid "The name of the encoding." +msgstr "编码名称" + +#: ../../library/codecs.rst:90 +msgid "" +"The stateless encoding and decoding functions. These must be functions or " +"methods which have the same interface as the :meth:`~Codec.encode` and " +":meth:`~Codec.decode` methods of Codec instances (see :ref:`Codec Interface " +"`). The functions or methods are expected to work in a " +"stateless mode." +msgstr "" +"无状态的编码和解码函数。 它们必须是具有与 Codec 的 :meth:`~Codec.encode` 和 :meth:`~Codec.decode` " +"方法相同接口的函数或方法 (参见 :ref:`Codec 接口 `)。 这些函数或方法应当工作于无状态的模式。" + +#: ../../library/codecs.rst:100 +msgid "" +"Incremental encoder and decoder classes or factory functions. These have to " +"provide the interface defined by the base classes " +":class:`IncrementalEncoder` and :class:`IncrementalDecoder`, respectively. " +"Incremental codecs can maintain state." +msgstr "" +"增量式的编码器和解码器类或工厂函数。 这些函数必须分别提供由基类 :class:`IncrementalEncoder` 和 " +":class:`IncrementalDecoder` 所定义的接口。 增量式编解码器可以保持状态。" + +#: ../../library/codecs.rst:109 +msgid "" +"Stream writer and reader classes or factory functions. These have to provide" +" the interface defined by the base classes :class:`StreamWriter` and " +":class:`StreamReader`, respectively. Stream codecs can maintain state." +msgstr "" +"流式写入器和读取器类或工厂函数。 这些函数必须分别提供由基类 :class:`StreamWriter` 和 :class:`StreamReader`" +" 所定义的接口。 流式编解码器可以保持状态。" + +#: ../../library/codecs.rst:114 +msgid "" +"To simplify access to the various codec components, the module provides " +"these additional functions which use :func:`lookup` for the codec lookup:" +msgstr "为了简化对各种编解码器组件的访问,本模块提供了以下附加函数,它们使用 :func:`lookup` 来执行编解码器查找:" + +#: ../../library/codecs.rst:119 +msgid "" +"Look up the codec for the given encoding and return its encoder function." +msgstr "查找给定编码的编解码器并返回其编码器函数。" + +#: ../../library/codecs.rst:121 ../../library/codecs.rst:128 +#: ../../library/codecs.rst:154 ../../library/codecs.rst:162 +msgid "Raises a :exc:`LookupError` in case the encoding cannot be found." +msgstr "在编码无法找到时将引发 :exc:`LookupError`。" + +#: ../../library/codecs.rst:126 +msgid "" +"Look up the codec for the given encoding and return its decoder function." +msgstr "查找给定编码的编解码器并返回其解码器函数。" + +#: ../../library/codecs.rst:133 +msgid "" +"Look up the codec for the given encoding and return its incremental encoder " +"class or factory function." +msgstr "查找给定编码的编解码器并返回其增量式编码器类或工厂函数。" + +#: ../../library/codecs.rst:136 +msgid "" +"Raises a :exc:`LookupError` in case the encoding cannot be found or the " +"codec doesn't support an incremental encoder." +msgstr "在编码无法找到或编解码器不支持增量式编码器时将引发 :exc:`LookupError`。" + +#: ../../library/codecs.rst:142 +msgid "" +"Look up the codec for the given encoding and return its incremental decoder " +"class or factory function." +msgstr "查找给定编码的编解码器并返回其增量式解码器类或工厂函数。" + +#: ../../library/codecs.rst:145 +msgid "" +"Raises a :exc:`LookupError` in case the encoding cannot be found or the " +"codec doesn't support an incremental decoder." +msgstr "在编码无法找到或编解码器不支持增量式解码器时将引发 :exc:`LookupError`。" + +#: ../../library/codecs.rst:151 +msgid "" +"Look up the codec for the given encoding and return its " +":class:`StreamReader` class or factory function." +msgstr "查找给定编码的编解码器并返回其 :class:`StreamReader` 类或工厂函数。" + +#: ../../library/codecs.rst:159 +msgid "" +"Look up the codec for the given encoding and return its " +":class:`StreamWriter` class or factory function." +msgstr "查找给定编码的编解码器并返回其 :class:`StreamWriter` 类或工厂函数。" + +#: ../../library/codecs.rst:164 +msgid "" +"Custom codecs are made available by registering a suitable codec search " +"function:" +msgstr "自定义编解码器的启用是通过注册适当的编解码器搜索函数:" + +#: ../../library/codecs.rst:169 +msgid "" +"Register a codec search function. Search functions are expected to take one " +"argument, being the encoding name in all lower case letters with hyphens and" +" spaces converted to underscores, and return a :class:`CodecInfo` object. In" +" case a search function cannot find a given encoding, it should return " +"``None``." +msgstr "" +"注册一个编解码器搜索函数。 搜索函数预期接收一个参数,即全部以小写字母表示的编码格式名称,其中中连字符和空格会被转换为下划线,并返回一个 " +":class:`CodecInfo` 对象。 在搜索函数无法找到给定编码格式的情况下,它应当返回 ``None``。" + +#: ../../library/codecs.rst:175 +msgid "Hyphens and spaces are converted to underscore." +msgstr "连字符和空格会被转换为下划线。" + +#: ../../library/codecs.rst:181 +msgid "" +"Unregister a codec search function and clear the registry's cache. If the " +"search function is not registered, do nothing." +msgstr "注销一个编解码器搜索函数并清空注册表缓存。 如果指定搜索函数未被注册,则不做任何操作。" + +#: ../../library/codecs.rst:187 +msgid "" +"While the builtin :func:`open` and the associated :mod:`io` module are the " +"recommended approach for working with encoded text files, this module " +"provides additional utility functions and classes that allow the use of a " +"wider range of codecs when working with binary files:" +msgstr "" +"虽然内置的 :func:`open` 和相关联的 :mod:`io` " +"模块是操作已编码文本文件的推荐方式,但本模块也提供了额外的工具函数和类,允许在操作二进制文件时使用更多种类的编解码器:" + +#: ../../library/codecs.rst:194 +msgid "" +"Open an encoded file using the given *mode* and return an instance of " +":class:`StreamReaderWriter`, providing transparent encoding/decoding. The " +"default file mode is ``'r'``, meaning to open the file in read mode." +msgstr "" +"使用给定的 *mode* 打开已编码的文件并返回一个 :class:`StreamReaderWriter` 的实例,提供透明的编码/解码。 " +"默认的文件模式为 ``'r'``,表示以读取模式打开文件。" + +#: ../../library/codecs.rst:200 +msgid "" +"If *encoding* is not ``None``, then the underlying encoded files are always " +"opened in binary mode. No automatic conversion of ``'\\n'`` is done on " +"reading and writing. The *mode* argument may be any binary mode acceptable " +"to the built-in :func:`open` function; the ``'b'`` is automatically added." +msgstr "" +"如果 *encoding* 不为 ``None``,则下层的已编码文件总是以二进制模式打开。 在读取和写入时不会自动执行 ``'\\n'`` 的转换。 " +"*mode* 参数可以是内置 :func:`open` 函数所接受的任意二进制模式;``'b'`` 会被自动添加。" + +#: ../../library/codecs.rst:206 +msgid "" +"*encoding* specifies the encoding which is to be used for the file. Any " +"encoding that encodes to and decodes from bytes is allowed, and the data " +"types supported by the file methods depend on the codec used." +msgstr "" +"*encoding* 指定文件所要使用的编码格式。 允许任何编码为字节串或从字节串解码的编码格式,而文件方法所支持的数据类型则取决于所使用的编解码器。" + +#: ../../library/codecs.rst:210 +msgid "" +"*errors* may be given to define the error handling. It defaults to " +"``'strict'`` which causes a :exc:`ValueError` to be raised in case an " +"encoding error occurs." +msgstr "" +"可以指定 *errors* 来定义错误处理方案。 默认值 ``'strict'`` 表示在出现编码错误时引发 :exc:`ValueError`。" + +#: ../../library/codecs.rst:213 +msgid "" +"*buffering* has the same meaning as for the built-in :func:`open` function. " +"It defaults to -1 which means that the default buffer size will be used." +msgstr "*buffering* 的含义与内置 :func:`open` 函数中的相同。 默认值 -1 表示将使用默认的缓冲区大小。" + +#: ../../library/codecs.rst:216 +msgid "The ``'U'`` mode has been removed." +msgstr "``'U'`` 模式已被移除。" + +#: ../../library/codecs.rst:221 +msgid ":func:`codecs.open` has been superseded by :func:`open`." +msgstr ":func:`codecs.open` 已被 :func:`open` 取代。" + +#: ../../library/codecs.rst:226 +msgid "" +"Return a :class:`StreamRecoder` instance, a wrapped version of *file* which " +"provides transparent transcoding. The original file is closed when the " +"wrapped version is closed." +msgstr "" +"返回一个 :class:`StreamRecoder` 实例,它提供了 *file* 的透明转码包装版本。 当包装版本被关闭时原始文件也会被关闭。" + +#: ../../library/codecs.rst:230 +msgid "" +"Data written to the wrapped file is decoded according to the given " +"*data_encoding* and then written to the original file as bytes using " +"*file_encoding*. Bytes read from the original file are decoded according to " +"*file_encoding*, and the result is encoded using *data_encoding*." +msgstr "" +"写入已包装文件的数据会根据给定的 *data_encoding* 解码,然后以使用 *file_encoding* 的字节形式写入原始文件。 " +"从原始文件读取的字节串将根据 *file_encoding* 解码,其结果将使用 *data_encoding* 进行编码。" + +#: ../../library/codecs.rst:236 +msgid "If *file_encoding* is not given, it defaults to *data_encoding*." +msgstr "如果 *file_encoding* 未给定,则默认为 *data_encoding*。" + +#: ../../library/codecs.rst:238 +msgid "" +"*errors* may be given to define the error handling. It defaults to " +"``'strict'``, which causes :exc:`ValueError` to be raised in case an " +"encoding error occurs." +msgstr "" +"可以指定 *errors* 来定义错误处理方案。 默认值 ``'strict'`` 表示在出现编码错误时引发 :exc:`ValueError`。" + +#: ../../library/codecs.rst:245 +msgid "" +"Uses an incremental encoder to iteratively encode the input provided by " +"*iterator*. *iterator* must yield :class:`str` objects. This function is a " +":term:`generator`. The *errors* argument (as well as any other keyword " +"argument) is passed through to the incremental encoder." +msgstr "" +"使用增量式编码器通过迭代来编码由 *iterator* 提供的输入。 *iterator* 必须产生 :class:`str` 对象。 此函数属于 " +":term:`generator`。 *errors* 参数(以及任何其他关键字参数)会被传递给增量式编码器。" + +#: ../../library/codecs.rst:250 +msgid "" +"This function requires that the codec accept text :class:`str` objects to " +"encode. Therefore it does not support bytes-to-bytes encoders such as " +"``base64_codec``." +msgstr "" +"此函数要求编解码器接受 :class:`str` 对象形式的文本进行编码。 因此它不支持字节到字节的编码器,例如 ``base64_codec``。" + +#: ../../library/codecs.rst:257 +msgid "" +"Uses an incremental decoder to iteratively decode the input provided by " +"*iterator*. *iterator* must yield :class:`bytes` objects. This function is a" +" :term:`generator`. The *errors* argument (as well as any other keyword " +"argument) is passed through to the incremental decoder." +msgstr "" +"使用增量式解码器通过迭代来解码由 *iterator* 提供的输入。 *iterator* 必须产生 :class:`bytes` 对象。 此函数属于 " +":term:`generator`。 *errors* 参数(以及任何其他关键字参数)会被传递给增量式解码器。" + +#: ../../library/codecs.rst:262 +msgid "" +"This function requires that the codec accept :class:`bytes` objects to " +"decode. Therefore it does not support text-to-text encoders such as " +"``rot_13``, although ``rot_13`` may be used equivalently with " +":func:`iterencode`." +msgstr "" +"此函数要求编解码器接受 :class:`bytes` 对象进行解码。 因此它不支持文本到文本的编码器,例如 ``rot_13``,但是 " +"``rot_13`` 可以通过同样效果的 :func:`iterencode` 来使用。" + +#: ../../library/codecs.rst:270 +msgid "" +"Return a :class:`tuple` containing the raw bytes of *buffer*, a " +":ref:`buffer-compatible object ` or :class:`str` (encoded to " +"UTF-8 before processing), and their length in bytes." +msgstr "" +"返回一个包含 *buffer* 中原始字节数据的 :class:`tuple`,一个 :ref:`缓冲区兼容对象 ` 或 " +":class:`str` (在处理前已编码为 UTF-8),及其字节长度。" + +#: ../../library/codecs.rst:274 +msgid "The *errors* argument is ignored." +msgstr "*errors* 参数会被忽略。" + +#: ../../library/codecs.rst:276 +msgid "" +">>> codecs.readbuffer_encode(b\"Zito\")\n" +"(b'Zito', 4)" +msgstr "" +">>> codecs.readbuffer_encode(b\"Zito\")\n" +"(b'Zito', 4)" + +#: ../../library/codecs.rst:282 +msgid "" +"The module also provides the following constants which are useful for " +"reading and writing to platform dependent files:" +msgstr "本模块还提供了以下常量,适用于读取和写入依赖于平台的文件:" + +#: ../../library/codecs.rst:297 +msgid "" +"These constants define various byte sequences, being Unicode byte order " +"marks (BOMs) for several encodings. They are used in UTF-16 and UTF-32 data " +"streams to indicate the byte order used, and in UTF-8 as a Unicode " +"signature. :const:`BOM_UTF16` is either :const:`BOM_UTF16_BE` or " +":const:`BOM_UTF16_LE` depending on the platform's native byte order, " +":const:`BOM` is an alias for :const:`BOM_UTF16`, :const:`BOM_LE` for " +":const:`BOM_UTF16_LE` and :const:`BOM_BE` for :const:`BOM_UTF16_BE`. The " +"others represent the BOM in UTF-8 and UTF-32 encodings." +msgstr "" +"这些常量定义了多种字节序列,即一些编码格式的 Unicode 字节顺序标记(BOM)。 它们在 UTF-16 和 UTF-32 " +"数据流中被用以指明所使用的字节顺序,并在 UTF-8 中被用作 Unicode 签名。 :const:`BOM_UTF16` 是 " +":const:`BOM_UTF16_BE` 或 :const:`BOM_UTF16_LE`,具体取决于平台的本机字节顺序,:const:`BOM` 是 " +":const:`BOM_UTF16` 的别名, :const:`BOM_LE` 是 :const:`BOM_UTF16_LE` " +"的别名,:const:`BOM_BE` 是 :const:`BOM_UTF16_BE` 的别名。 其他序列则表示 UTF-8 和 UTF-32 " +"编码格式中的 BOM。" + +#: ../../library/codecs.rst:311 +msgid "Codec Base Classes" +msgstr "编解码器基类" + +#: ../../library/codecs.rst:313 +msgid "" +"The :mod:`!codecs` module defines a set of base classes which define the " +"interfaces for working with codec objects, and can also be used as the basis" +" for custom codec implementations." +msgstr "" + +#: ../../library/codecs.rst:317 +msgid "" +"Each codec has to define four interfaces to make it usable as codec in " +"Python: stateless encoder, stateless decoder, stream reader and stream " +"writer. The stream reader and writers typically reuse the stateless " +"encoder/decoder to implement the file protocols. Codec authors also need to " +"define how the codec will handle encoding and decoding errors." +msgstr "" +"每种编解码器必须定义四个接口以便用作 Python 中的编解码器:无状态编码器、无状态解码器、流读取器和流写入器。 " +"流读取器和写入器通常会重用无状态编码器/解码器来实现文件协议。 编解码器作者还需要定义编解码器将如何处理编码和解码错误。" + +#: ../../library/codecs.rst:328 +msgid "Error Handlers" +msgstr "错误处理方案" + +#: ../../library/codecs.rst:330 +msgid "" +"To simplify and standardize error handling, codecs may implement different " +"error handling schemes by accepting the *errors* string argument:" +msgstr "为了简化和标准化错误处理,编解码器可以通过接受 *errors* 字符串参数来实现不同的错误处理方案:" + +#: ../../library/codecs.rst:350 +msgid "" +"The following error handlers can be used with all Python :ref:`standard-" +"encodings` codecs:" +msgstr "以下错误处理器可以用于所有的 Python :ref:`standard-encodings` 编解码器:" + +#: ../../library/codecs.rst:356 ../../library/codecs.rst:399 +#: ../../library/codecs.rst:419 +msgid "Value" +msgstr "值" + +#: ../../library/codecs.rst:356 ../../library/codecs.rst:399 +#: ../../library/codecs.rst:419 ../../library/codecs.rst:1376 +#: ../../library/codecs.rst:1448 ../../library/codecs.rst:1533 +msgid "Meaning" +msgstr "含意" + +#: ../../library/codecs.rst:358 +msgid "``'strict'``" +msgstr "``'strict'``" + +#: ../../library/codecs.rst:358 +msgid "" +"Raise :exc:`UnicodeError` (or a subclass), this is the default. Implemented " +"in :func:`strict_errors`." +msgstr "引发 :exc:`UnicodeError` (或其子类),这是默认的方案。 在 :func:`strict_errors` 中实现。" + +#: ../../library/codecs.rst:362 +msgid "``'ignore'``" +msgstr "``'ignore'``" + +#: ../../library/codecs.rst:362 +msgid "" +"Ignore the malformed data and continue without further notice. Implemented " +"in :func:`ignore_errors`." +msgstr "忽略错误格式的数据并且不加进一步通知就继续执行。 在 :func:`ignore_errors` 中实现。" + +#: ../../library/codecs.rst:366 +msgid "``'replace'``" +msgstr "``'replace'``" + +#: ../../library/codecs.rst:366 +msgid "" +"Replace with a replacement marker. On encoding, use ``?`` (ASCII character)." +" On decoding, use ``�`` (U+FFFD, the official REPLACEMENT CHARACTER). " +"Implemented in :func:`replace_errors`." +msgstr "" +"用一个替代标记来替换。 在编码时,使用 ``?`` (ASCII 字符)。 在解码时,使用 ``�`` (U+FFFD,官方的 REPLACEMENT " +"CHARACTER)。 在 :func:`replace_errors` 中实现。" + +#: ../../library/codecs.rst:372 +msgid "``'backslashreplace'``" +msgstr "``'backslashreplace'``" + +#: ../../library/codecs.rst:372 +msgid "" +"Replace with backslashed escape sequences. On encoding, use hexadecimal form" +" of Unicode code point with formats :samp:`\\\\x{hh}` :samp:`\\\\u{xxxx}` " +":samp:`\\\\U{xxxxxxxx}`. On decoding, use hexadecimal form of byte value " +"with format :samp:`\\\\x{hh}`. Implemented in " +":func:`backslashreplace_errors`." +msgstr "" +"用反斜杠转义序列来替换。 在编码时,使用格式为 :samp:`\\\\x{hh}` :samp:`\\\\u{xxxx}` " +":samp:`\\\\U{xxxxxxxx}` 的 Unicode 码位十六进制表示形式。 在解码时,使用格式为 :samp:`\\\\x{hh}` " +"的字节值十六进制表示形式。 在 :func:`backslashreplace_errors` 中实现。" + +#: ../../library/codecs.rst:381 +msgid "``'surrogateescape'``" +msgstr "``'surrogateescape'``" + +#: ../../library/codecs.rst:381 +msgid "" +"On decoding, replace byte with individual surrogate code ranging from " +"``U+DC80`` to ``U+DCFF``. This code will then be turned back into the same " +"byte when the ``'surrogateescape'`` error handler is used when encoding the " +"data. (See :pep:`383` for more.)" +msgstr "" +"在解码时,将字节替换为 ``U+DC80`` 至 ``U+DCFF`` 范围内的单个代理代码。 当在编码数据时使用 " +"``'surrogateescape'`` 错误处理方案时,此代理将被转换回相同的字节。 (请参阅 :pep:`383` 了解详情。)" + +#: ../../library/codecs.rst:395 +msgid "" +"The following error handlers are only applicable to encoding (within " +":term:`text encodings `):" +msgstr "下列错误处理器仅在编码时适用(在 :term:`文本编码格式 ` 类别以内):" + +#: ../../library/codecs.rst:401 +msgid "``'xmlcharrefreplace'``" +msgstr "``'xmlcharrefreplace'``" + +#: ../../library/codecs.rst:401 +msgid "" +"Replace with XML/HTML numeric character reference, which is a decimal form " +"of Unicode code point with format :samp:`&#{num};`. Implemented in " +":func:`xmlcharrefreplace_errors`." +msgstr "" +"用 XML/HTML 数字字符引用来替换,即格式为 :samp:`&#{num};` 的 Unicode 码位十进制表示形式。 在 " +":func:`xmlcharrefreplace_errors` 中实现。" + +#: ../../library/codecs.rst:407 +msgid "``'namereplace'``" +msgstr "``'namereplace'``" + +#: ../../library/codecs.rst:407 +msgid "" +"Replace with ``\\N{...}`` escape sequences, what appears in the braces is " +"the Name property from Unicode Character Database. Implemented in " +":func:`namereplace_errors`." +msgstr "" +"用 ``\\N{...}`` 转义序列来替换,出现在花括号中的是来自 Unicode 字符数据库的 Name 属性。 在 " +":func:`namereplace_errors` 中实现。" + +#: ../../library/codecs.rst:416 +msgid "" +"In addition, the following error handler is specific to the given codecs:" +msgstr "此外,以下错误处理方案被专门用于指定的编解码器:" + +#: ../../library/codecs.rst:13 ../../library/codecs.rst:419 +msgid "Codecs" +msgstr "编解码器" + +#: ../../library/codecs.rst:421 +msgid "``'surrogatepass'``" +msgstr "``'surrogatepass'``" + +#: ../../library/codecs.rst:421 +msgid "utf-8, utf-16, utf-32, utf-16-be, utf-16-le, utf-32-be, utf-32-le" +msgstr "utf-8, utf-16, utf-32, utf-16-be, utf-16-le, utf-32-be, utf-32-le" + +#: ../../library/codecs.rst:421 +msgid "" +"Allow encoding and decoding surrogate code point (``U+D800`` - ``U+DFFF``) " +"as normal code point. Otherwise these codecs treat the presence of surrogate" +" code point in :class:`str` as an error." +msgstr "" +"允许将代理码位 (``U+D800`` - ``U+DFFF``) 作为正常码位来编码和解码。 否则这些编解码器会将 :class:`str` " +"中出现的代理码位视为错误。" + +#: ../../library/codecs.rst:428 +msgid "The ``'surrogateescape'`` and ``'surrogatepass'`` error handlers." +msgstr "``'surrogateescape'`` 和 ``'surrogatepass'`` 错误处理方案。" + +#: ../../library/codecs.rst:431 +msgid "" +"The ``'surrogatepass'`` error handler now works with utf-16\\* and utf-32\\*" +" codecs." +msgstr "``'surrogatepass'`` 错误处理器现在可适用于 utf-16\\* 和 utf-32\\* 编解码器。" + +#: ../../library/codecs.rst:435 +msgid "The ``'namereplace'`` error handler." +msgstr "``'namereplace'`` 错误处理方案。" + +#: ../../library/codecs.rst:438 +msgid "" +"The ``'backslashreplace'`` error handler now works with decoding and " +"translating." +msgstr "``'backslashreplace'`` 错误处理器现在可适用于解码和转码。" + +#: ../../library/codecs.rst:442 +msgid "" +"The set of allowed values can be extended by registering a new named error " +"handler:" +msgstr "允许的值集合可以通过注册新命名的错误处理方案来扩展:" + +#: ../../library/codecs.rst:447 +msgid "" +"Register the error handling function *error_handler* under the name *name*. " +"The *error_handler* argument will be called during encoding and decoding in " +"case of an error, when *name* is specified as the errors parameter." +msgstr "" +"在名称 *name* 之下注册错误处理函数 *error_handler*。 当 *name* 被指定为错误形参时,*error_handler* " +"参数所指定的对象将在编码和解码期间发生错误的情况下被调用," + +#: ../../library/codecs.rst:451 +msgid "" +"For encoding, *error_handler* will be called with a " +":exc:`UnicodeEncodeError` instance, which contains information about the " +"location of the error. The error handler must either raise this or a " +"different exception, or return a tuple with a replacement for the " +"unencodable part of the input and a position where encoding should continue." +" The replacement may be either :class:`str` or :class:`bytes`. If the " +"replacement is bytes, the encoder will simply copy them into the output " +"buffer. If the replacement is a string, the encoder will encode the " +"replacement. Encoding continues on original input at the specified position." +" Negative position values will be treated as being relative to the end of " +"the input string. If the resulting position is out of bound an " +":exc:`IndexError` will be raised." +msgstr "" +"对于编码操作,将会调用 *error_handler* 并传入一个 :exc:`UnicodeEncodeError` " +"实例,其中包含有关错误位置的信息。 " +"错误处理程序必须引发此异常或别的异常,或者也可以返回一个元组,其中包含输入的不可编码部分的替换对象,以及应当继续进行编码的位置。 替换对象可以为 " +":class:`str` 或 :class:`bytes` 类型。 如果替换对象为字节串,编码器将简单地将其复制到输出缓冲区。 " +"如果替换对象为字符串,编码器将对替换对象进行编码。 对原始输入的编码操作会在指定位置继续进行。 负的位置值将被视为相对于输入字符串的末尾。 " +"如果结果位置超出范围则将引发 :exc:`IndexError`。" + +#: ../../library/codecs.rst:463 +msgid "" +"Decoding and translating works similarly, except :exc:`UnicodeDecodeError` " +"or :exc:`UnicodeTranslateError` will be passed to the handler and that the " +"replacement from the error handler will be put into the output directly." +msgstr "" +"解码和转换的做法很相似,不同之处在于将把 :exc:`UnicodeDecodeError` 或 " +":exc:`UnicodeTranslateError` 传给处理程序,并且来自错误处理程序的替换对象将被直接放入输出。" + +#: ../../library/codecs.rst:468 +msgid "" +"Previously registered error handlers (including the standard error handlers)" +" can be looked up by name:" +msgstr "之前注册的错误处理方案(包括标准错误处理方案)可通过名称进行查找:" + +#: ../../library/codecs.rst:473 +msgid "Return the error handler previously registered under the name *name*." +msgstr "返回之前在名称 *name* 之下注册的错误处理方案。" + +#: ../../library/codecs.rst:475 +msgid "Raises a :exc:`LookupError` in case the handler cannot be found." +msgstr "在处理方案无法找到时将引发 :exc:`LookupError`。" + +#: ../../library/codecs.rst:477 +msgid "" +"The following standard error handlers are also made available as module " +"level functions:" +msgstr "以下标准错误处理方案也可通过模块层级函数的方式来使用:" + +#: ../../library/codecs.rst:482 +msgid "Implements the ``'strict'`` error handling." +msgstr "实现了 ``'strict'`` 错误处理。" + +#: ../../library/codecs.rst:484 +msgid "Each encoding or decoding error raises a :exc:`UnicodeError`." +msgstr "每个编码或解码错误都将引发 :exc:`UnicodeError`。" + +#: ../../library/codecs.rst:489 +msgid "Implements the ``'ignore'`` error handling." +msgstr "实现了 ``'ignore'`` 错误处理。" + +#: ../../library/codecs.rst:491 +msgid "" +"Malformed data is ignored; encoding or decoding is continued without further" +" notice." +msgstr "错误格式的数据会被忽略;编码或解码将继续执行而不再通知。" + +#: ../../library/codecs.rst:497 +msgid "Implements the ``'replace'`` error handling." +msgstr "实现了 ``'replace'`` 错误处理。" + +#: ../../library/codecs.rst:499 +msgid "" +"Substitutes ``?`` (ASCII character) for encoding errors or ``�`` (U+FFFD, " +"the official REPLACEMENT CHARACTER) for decoding errors." +msgstr "" +"使用 ``?`` (ASCII 字符) 替换编码错误或者使用 ``�`` (U+FFFD,官方的 REPLACEMENT CHARACTER) " +"替换解码错误。" + +#: ../../library/codecs.rst:505 +msgid "Implements the ``'backslashreplace'`` error handling." +msgstr "实现了 ``'backslashreplace'`` 错误处理。" + +#: ../../library/codecs.rst:507 +msgid "" +"Malformed data is replaced by a backslashed escape sequence. On encoding, " +"use the hexadecimal form of Unicode code point with formats " +":samp:`\\\\x{hh}` :samp:`\\\\u{xxxx}` :samp:`\\\\U{xxxxxxxx}`. On decoding, " +"use the hexadecimal form of byte value with format :samp:`\\\\x{hh}`." +msgstr "" +"错误格式的数据会用反斜杠转义序列来替换。 在编码时,使用格式为 :samp:`\\\\x{hh}` :samp:`\\\\u{xxxx}` " +":samp:`\\\\U{xxxxxxxx}` 的 Unicode 码位十六进制表示形式。 在解码时,使用格式为 :samp:`\\\\x{hh}` " +"的字节值 十六进制表示形式。" + +#: ../../library/codecs.rst:513 +msgid "Works with decoding and translating." +msgstr "适用于解码和转码。" + +#: ../../library/codecs.rst:519 +msgid "" +"Implements the ``'xmlcharrefreplace'`` error handling (for encoding within " +":term:`text encoding` only)." +msgstr "实现 ``'xmlcharrefreplace'`` 错误处理(仅限 :term:`text encoding` 范围内的编码操作)。" + +#: ../../library/codecs.rst:522 +msgid "" +"The unencodable character is replaced by an appropriate XML/HTML numeric " +"character reference, which is a decimal form of Unicode code point with " +"format :samp:`&#{num};` ." +msgstr "" +"不可编码的字符会被替换为适当的 XML/HTML 数值字符引用,即格式为 :samp:`&#{num};` 的十进制形式 Unicode 码位。" + +#: ../../library/codecs.rst:529 +msgid "" +"Implements the ``'namereplace'`` error handling (for encoding within " +":term:`text encoding` only)." +msgstr "实现 ``'namereplace'`` 错误处理(仅限 :term:`text encoding` 范围内的编码操作)。" + +#: ../../library/codecs.rst:532 +msgid "" +"The unencodable character is replaced by a ``\\N{...}`` escape sequence. The" +" set of characters that appear in the braces is the Name property from " +"Unicode Character Database. For example, the German lowercase letter ``'ß'``" +" will be converted to byte sequence ``\\N{LATIN SMALL LETTER SHARP S}`` ." +msgstr "" +"不可编码的字符会被替换为 ``\\N{...}`` 转义序列。 出现在花括号内的字符集合是来自于 Unicode 字符数据库的 Name 属性。 " +"例如,德语小写字母 ``'ß'`` 将被转换为字符序列 ``\\N{LATIN SMALL LETTER SHARP S}``。" + +#: ../../library/codecs.rst:543 +msgid "Stateless Encoding and Decoding" +msgstr "无状态的编码和解码" + +#: ../../library/codecs.rst:545 +msgid "" +"The base :class:`Codec` class defines these methods which also define the " +"function interfaces of the stateless encoder and decoder:" +msgstr "基本 :class:`Codec` 类定义了这些方法,同时还定义了无状态编码器和解码器的函数接口:" + +#: ../../library/codecs.rst:553 +msgid "" +"Encodes the object *input* and returns a tuple (output object, length " +"consumed). For instance, :term:`text encoding` converts a string object to a" +" bytes object using a particular character set encoding (e.g., ``cp1252`` or" +" ``iso-8859-1``)." +msgstr "" +"编码 *input* 对象并返回一个元组 (输出对象, 消耗长度)。 例如,:term:`text encoding` 会使用特定的字符集编码格式 " +"(例如 ``cp1252`` 或 ``iso-8859-1``) 将字符串转换为字节串对象。" + +#: ../../library/codecs.rst:558 ../../library/codecs.rst:580 +msgid "" +"The *errors* argument defines the error handling to apply. It defaults to " +"``'strict'`` handling." +msgstr "*errors* 参数定义了要应用的错误处理方案。 默认为 ``'strict'`` 处理方案。" + +#: ../../library/codecs.rst:561 +msgid "" +"The method may not store state in the :class:`Codec` instance. Use " +":class:`StreamWriter` for codecs which have to keep state in order to make " +"encoding efficient." +msgstr "" +"此方法不一定会在 :class:`Codec` 实例中保存状态。 可使用必须保存状态的 :class:`StreamWriter` " +"作为编解码器以便高效地进行编码。" + +#: ../../library/codecs.rst:565 +msgid "" +"The encoder must be able to handle zero length input and return an empty " +"object of the output object type in this situation." +msgstr "编码器必须能够处理零长度的输入并在此情况下返回输出对象类型的空对象。" + +#: ../../library/codecs.rst:571 +msgid "" +"Decodes the object *input* and returns a tuple (output object, length " +"consumed). For instance, for a :term:`text encoding`, decoding converts a " +"bytes object encoded using a particular character set encoding to a string " +"object." +msgstr "" +"解码 *input* 对象并返回一个元组 (输出对象, 消耗长度)。 例如,:term:`text encoding` " +"的解码操作会使用特定的字符集编码格式将字节串对象转换为字符串对象。" + +#: ../../library/codecs.rst:576 +msgid "" +"For text encodings and bytes-to-bytes codecs, *input* must be a bytes object" +" or one which provides the read-only buffer interface -- for example, buffer" +" objects and memory mapped files." +msgstr "" +"对于文本编码格式和字节到字节编解码器,*input* 必须为一个字节串对象或提供了只读缓冲区接口的对象 -- 例如,缓冲区对象和映射到内存的文件。" + +#: ../../library/codecs.rst:583 +msgid "" +"The method may not store state in the :class:`Codec` instance. Use " +":class:`StreamReader` for codecs which have to keep state in order to make " +"decoding efficient." +msgstr "" +"此方法不一定会在 :class:`Codec` 实例中保存状态。 可使用必须保存状态的 :class:`StreamReader` " +"作为编解码器以便高效地进行解码。" + +#: ../../library/codecs.rst:587 +msgid "" +"The decoder must be able to handle zero length input and return an empty " +"object of the output object type in this situation." +msgstr "解码器必须能够处理零长度的输入并在此情况下返回输出对象类型的空对象。" + +#: ../../library/codecs.rst:592 +msgid "Incremental Encoding and Decoding" +msgstr "增量式的编码和解码" + +#: ../../library/codecs.rst:594 +msgid "" +"The :class:`IncrementalEncoder` and :class:`IncrementalDecoder` classes " +"provide the basic interface for incremental encoding and decoding. " +"Encoding/decoding the input isn't done with one call to the stateless " +"encoder/decoder function, but with multiple calls to the " +":meth:`~IncrementalEncoder.encode`/:meth:`~IncrementalDecoder.decode` method" +" of the incremental encoder/decoder. The incremental encoder/decoder keeps " +"track of the encoding/decoding process during method calls." +msgstr "" +":class:`IncrementalEncoder` 和 :class:`IncrementalDecoder` 类提供了增量式编码和解码的基本接口。" +" 对输入的编码/解码不是通过对无状态编码器/解码器的一次调用,而是通过对增量式编码器/解码器的 " +":meth:`~IncrementalEncoder.encode`/:meth:`~IncrementalDecoder.decode` " +"方法的多次调用。 增量式编码器/解码器会在方法调用期间跟踪编码/解码过程。" + +#: ../../library/codecs.rst:602 +msgid "" +"The joined output of calls to the " +":meth:`~IncrementalEncoder.encode`/:meth:`~IncrementalDecoder.decode` method" +" is the same as if all the single inputs were joined into one, and this " +"input was encoded/decoded with the stateless encoder/decoder." +msgstr "" +"调用 :meth:`~IncrementalEncoder.encode`/:meth:`~IncrementalDecoder.decode` " +"方法后的全部输出相当于将所有通过无状态编码器/解码器进行编码/解码的单个输入连接在一起所得到的输出。" + +#: ../../library/codecs.rst:611 +msgid "IncrementalEncoder Objects" +msgstr "IncrementalEncoder 对象" + +#: ../../library/codecs.rst:613 +msgid "" +"The :class:`IncrementalEncoder` class is used for encoding an input in " +"multiple steps. It defines the following methods which every incremental " +"encoder must define in order to be compatible with the Python codec " +"registry." +msgstr "" +":class:`IncrementalEncoder` 类用来对一个输入进行分步编码。 它定义了以下方法,每个增量式编码器都必须定义这些方法以便与 " +"Python 编解码器注册表相兼容。" + +#: ../../library/codecs.rst:620 +msgid "Constructor for an :class:`IncrementalEncoder` instance." +msgstr ":class:`IncrementalEncoder` 实例的构造器。" + +#: ../../library/codecs.rst:622 +msgid "" +"All incremental encoders must provide this constructor interface. They are " +"free to add additional keyword arguments, but only the ones defined here are" +" used by the Python codec registry." +msgstr "" +"所有增量式编码器必须提供此构造器接口。 它们可以自由地添加额外的关键字参数,但只有在这里定义的参数才会被 Python 编解码器注册表所使用。" + +#: ../../library/codecs.rst:626 +msgid "" +"The :class:`IncrementalEncoder` may implement different error handling " +"schemes by providing the *errors* keyword argument. See :ref:`error-" +"handlers` for possible values." +msgstr "" +":class:`IncrementalEncoder` 可以通过提供 *errors* 关键字参数来实现不同的错误处理方案。 可用的值请参阅 " +":ref:`error-handlers`。" + +#: ../../library/codecs.rst:630 +msgid "" +"The *errors* argument will be assigned to an attribute of the same name. " +"Assigning to this attribute makes it possible to switch between different " +"error handling strategies during the lifetime of the " +":class:`IncrementalEncoder` object." +msgstr "" +"*errors* 参数将被赋值给一个同名的属性。 通过对此属性赋值就可以在 :class:`IncrementalEncoder` " +"对象的生命期内在不同的错误处理策略之间进行切换。" + +#: ../../library/codecs.rst:638 +msgid "" +"Encodes *object* (taking the current state of the encoder into account) and " +"returns the resulting encoded object. If this is the last call to " +":meth:`encode` *final* must be true (the default is false)." +msgstr "" +"编码 *object* (会将编码器的当前状态纳入考虑) 并返回已编码的结果对象。 如果这是对 :meth:`encode` 的最终调用则 " +"*final* 必须为真值(默认为假值)。" + +#: ../../library/codecs.rst:645 +msgid "" +"Reset the encoder to the initial state. The output is discarded: call " +"``.encode(object, final=True)``, passing an empty byte or text string if " +"necessary, to reset the encoder and to get the output." +msgstr "" +"将编码器重置为初始状态。 输出将被丢弃:调用 ``.encode(object, " +"final=True)``,在必要时传入一个空字节串或字符串,重置编码器并得到输出。" + +#: ../../library/codecs.rst:652 +msgid "" +"Return the current state of the encoder which must be an integer. The " +"implementation should make sure that ``0`` is the most common state. (States" +" that are more complicated than integers can be converted into an integer by" +" marshaling/pickling the state and encoding the bytes of the resulting " +"string into an integer.)" +msgstr "" +"返回编码器的当前状态,该值必须为一个整数。 实现应当确保 ``0`` 是最常见的状态。 " +"(比整数更复杂的状态表示可以通过编组/选择状态并将结果字符串的字节数据编码为整数来转换为一个整数值)。" + +#: ../../library/codecs.rst:661 +msgid "" +"Set the state of the encoder to *state*. *state* must be an encoder state " +"returned by :meth:`getstate`." +msgstr "将编码器的状态设为 *state*。 *state* 必须为 :meth:`getstate` 所返回的一个编码器状态。" + +#: ../../library/codecs.rst:668 +msgid "IncrementalDecoder Objects" +msgstr "IncrementalDecoder 对象" + +#: ../../library/codecs.rst:670 +msgid "" +"The :class:`IncrementalDecoder` class is used for decoding an input in " +"multiple steps. It defines the following methods which every incremental " +"decoder must define in order to be compatible with the Python codec " +"registry." +msgstr "" +":class:`IncrementalDecoder` 类用来对一个输入进行分步解码。 它定义了以下方法,每个增量式解码器都必须定义这些方法以便与 " +"Python 编解码器注册表相兼容。" + +#: ../../library/codecs.rst:677 +msgid "Constructor for an :class:`IncrementalDecoder` instance." +msgstr ":class:`IncrementalDecoder` 实例的构造器。" + +#: ../../library/codecs.rst:679 +msgid "" +"All incremental decoders must provide this constructor interface. They are " +"free to add additional keyword arguments, but only the ones defined here are" +" used by the Python codec registry." +msgstr "" +"所有增量式解码器必须提供此构造器接口。 它们可以自由地添加额外的关键字参数,但只有在这里定义的参数才会被 Python 编解码器注册表所使用。" + +#: ../../library/codecs.rst:683 +msgid "" +"The :class:`IncrementalDecoder` may implement different error handling " +"schemes by providing the *errors* keyword argument. See :ref:`error-" +"handlers` for possible values." +msgstr "" +":class:`IncrementalDecoder` 可以通过提供 *errors* 关键字参数来实现不同的错误处理方案。 可用的值请参阅 " +":ref:`error-handlers`。" + +#: ../../library/codecs.rst:687 +msgid "" +"The *errors* argument will be assigned to an attribute of the same name. " +"Assigning to this attribute makes it possible to switch between different " +"error handling strategies during the lifetime of the " +":class:`IncrementalDecoder` object." +msgstr "" +"*errors* 参数将被赋值给一个同名的属性。 通过对此属性赋值就可以在 :class:`IncrementalDecoder` " +"对象的生命期内在不同的错误处理策略之间进行切换。" + +#: ../../library/codecs.rst:695 +msgid "" +"Decodes *object* (taking the current state of the decoder into account) and " +"returns the resulting decoded object. If this is the last call to " +":meth:`decode` *final* must be true (the default is false). If *final* is " +"true the decoder must decode the input completely and must flush all " +"buffers. If this isn't possible (e.g. because of incomplete byte sequences " +"at the end of the input) it must initiate error handling just like in the " +"stateless case (which might raise an exception)." +msgstr "" +"解码 *object* (会将解码器的当前状态纳入考虑) 并返回已解码的结果对象。 如果这是对 :meth:`decode` 的最终调用则 " +"*final* 必须为真值(默认为假值)。 如果 *final* 为真值则解码器必须对输入进行完全解码并且必须 刷新所有缓冲区。 " +"如果这无法做到(例如由于在输入结束时字节串序列不完整)则它必须像在无状态的情况下那样初始化错误处理(这可能引发一个异常)。" + +#: ../../library/codecs.rst:706 +msgid "Reset the decoder to the initial state." +msgstr "将解码器重置为初始状态。" + +#: ../../library/codecs.rst:711 +msgid "" +"Return the current state of the decoder. This must be a tuple with two " +"items, the first must be the buffer containing the still undecoded input. " +"The second must be an integer and can be additional state info. (The " +"implementation should make sure that ``0`` is the most common additional " +"state info.) If this additional state info is ``0`` it must be possible to " +"set the decoder to the state which has no input buffered and ``0`` as the " +"additional state info, so that feeding the previously buffered input to the " +"decoder returns it to the previous state without producing any output. " +"(Additional state info that is more complicated than integers can be " +"converted into an integer by marshaling/pickling the info and encoding the " +"bytes of the resulting string into an integer.)" +msgstr "" +"返回解码器的当前状态。 这必须为一个二元组,第一项必须是包含尚未解码的输入的缓冲区。 第二项必须为一个整数,可以表示附加状态信息。 (实现应当确保 " +"``0`` 是最常见的附加状态信息。) 如果此附加状态信息为 ``0`` 则必须可以将解码器设为没有已缓冲输入并且以 ``0`` " +"作为附加状态信息,以便将先前已缓冲的输入馈送到解码器使其返回到先前的状态而不产生任何输出。 " +"(比整数更复杂的附加状态信息可以通过编组/选择状态信息并将结果字符串的字节数据编码为整数来转换为一个整数值。)" + +#: ../../library/codecs.rst:726 +msgid "" +"Set the state of the decoder to *state*. *state* must be a decoder state " +"returned by :meth:`getstate`." +msgstr "将解码器的状态设为 *state*。 *state* 必须为 :meth:`getstate` 所返回的一个解码器状态。" + +#: ../../library/codecs.rst:731 +msgid "Stream Encoding and Decoding" +msgstr "流式的编码和解码" + +#: ../../library/codecs.rst:734 +msgid "" +"The :class:`StreamWriter` and :class:`StreamReader` classes provide generic " +"working interfaces which can be used to implement new encoding submodules " +"very easily. See :mod:`!encodings.utf_8` for an example of how this is done." +msgstr "" +":class:`StreamWriter` 和 :class:`StreamReader` " +"类提供了一些泛用工作接口,可被用来非常方便地实现新的编码格式子模块。 请参阅 :mod:`!encodings.utf_8` " +"中的示例了解如何做到这一点。" + +#: ../../library/codecs.rst:742 +msgid "StreamWriter Objects" +msgstr "StreamWriter 对象" + +#: ../../library/codecs.rst:744 +msgid "" +"The :class:`StreamWriter` class is a subclass of :class:`Codec` and defines " +"the following methods which every stream writer must define in order to be " +"compatible with the Python codec registry." +msgstr "" +":class:`StreamWriter` 类是 :class:`Codec` 的子类,它定义了以下方法,每个流式写入器都必须定义这些方法以便与 " +"Python 编解码器注册表相兼容。" + +#: ../../library/codecs.rst:751 +msgid "Constructor for a :class:`StreamWriter` instance." +msgstr ":class:`StreamWriter` 实例的构造器。" + +#: ../../library/codecs.rst:753 +msgid "" +"All stream writers must provide this constructor interface. They are free to" +" add additional keyword arguments, but only the ones defined here are used " +"by the Python codec registry." +msgstr "" +"所有流式写入器必须提供此构造器接口。 它们可以自由地添加额外的关键字参数,但只有在这里定义的参数才会被 Python 编解码器注册表所使用。" + +#: ../../library/codecs.rst:757 +msgid "" +"The *stream* argument must be a file-like object open for writing text or " +"binary data, as appropriate for the specific codec." +msgstr "*stream* 参数必须为一个基于特定编解码器打开用于写入文本或二进制数据的文件型对象。" + +#: ../../library/codecs.rst:760 +msgid "" +"The :class:`StreamWriter` may implement different error handling schemes by " +"providing the *errors* keyword argument. See :ref:`error-handlers` for the " +"standard error handlers the underlying stream codec may support." +msgstr "" +":class:`StreamWriter` 可以通过提供 *errors* 关键字参数来实现不同的错误处理方案。 请参阅 :ref:`error-" +"handlers` 了解下层的流式编解码器可支持的标准错误处理方案。" + +#: ../../library/codecs.rst:764 +msgid "" +"The *errors* argument will be assigned to an attribute of the same name. " +"Assigning to this attribute makes it possible to switch between different " +"error handling strategies during the lifetime of the :class:`StreamWriter` " +"object." +msgstr "" +"*errors* 参数将被赋值给一个同名的属性。 通过对此属性赋值就可以在 :class:`StreamWriter` " +"对象的生命期内在不同的错误处理策略之间进行切换。" + +#: ../../library/codecs.rst:770 +msgid "Writes the object's contents encoded to the stream." +msgstr "将编码后的对象内容写入到流。" + +#: ../../library/codecs.rst:775 +msgid "" +"Writes the concatenated iterable of strings to the stream (possibly by " +"reusing the :meth:`write` method). Infinite or very large iterables are not " +"supported. The standard bytes-to-bytes codecs do not support this method." +msgstr "" +"将拼接后的字符串可迭代对象写入到流(可能通过重用 :meth:`write` 方法)。 无限长或非常大的可迭代对象不受支持。 " +"标准的字节到字节编解码器不支持此方法。" + +#: ../../library/codecs.rst:783 ../../library/codecs.rst:878 +msgid "Resets the codec buffers used for keeping internal state." +msgstr "重置用于保持内部状态的编解码器缓冲区。" + +#: ../../library/codecs.rst:785 +msgid "" +"Calling this method should ensure that the data on the output is put into a " +"clean state that allows appending of new fresh data without having to rescan" +" the whole stream to recover state." +msgstr "调用此方法应当确保在干净的状态下放入输出数据,以允许直接添加新的干净数据而无须重新扫描整个流来恢复状态。" + +#: ../../library/codecs.rst:790 +msgid "" +"In addition to the above methods, the :class:`StreamWriter` must also " +"inherit all other methods and attributes from the underlying stream." +msgstr "除了上述的方法,:class:`StreamWriter` 还必须继承来自下层流的所有其他方法和属性。" + +#: ../../library/codecs.rst:797 +msgid "StreamReader Objects" +msgstr "StreamReader 对象" + +#: ../../library/codecs.rst:799 +msgid "" +"The :class:`StreamReader` class is a subclass of :class:`Codec` and defines " +"the following methods which every stream reader must define in order to be " +"compatible with the Python codec registry." +msgstr "" +":class:`StreamReader` 类是 :class:`Codec` 的子类,它定义了以下方法,每个流式读取器都必须定义这些方法以便与 " +"Python 编解码器注册表相兼容。" + +#: ../../library/codecs.rst:806 +msgid "Constructor for a :class:`StreamReader` instance." +msgstr ":class:`StreamReader` 实例的构造器。" + +#: ../../library/codecs.rst:808 +msgid "" +"All stream readers must provide this constructor interface. They are free to" +" add additional keyword arguments, but only the ones defined here are used " +"by the Python codec registry." +msgstr "" +"所有流式读取器必须提供此构造器接口。 它们可以自由地添加额外的关键字参数,但只有在这里定义的参数才会被 Python 编解码器注册表所使用。" + +#: ../../library/codecs.rst:812 +msgid "" +"The *stream* argument must be a file-like object open for reading text or " +"binary data, as appropriate for the specific codec." +msgstr "*stream* 参数必须为一个基于特定编解码器打开用于读取文本或二进制数据的文件型对象。" + +#: ../../library/codecs.rst:815 +msgid "" +"The :class:`StreamReader` may implement different error handling schemes by " +"providing the *errors* keyword argument. See :ref:`error-handlers` for the " +"standard error handlers the underlying stream codec may support." +msgstr "" +":class:`StreamReader` 可以通过提供 *errors* 关键字参数来实现不同的错误处理方案。 请参阅 :ref:`error-" +"handlers` 了解下层的流式编解码器可支持的标准错误处理方案。" + +#: ../../library/codecs.rst:819 +msgid "" +"The *errors* argument will be assigned to an attribute of the same name. " +"Assigning to this attribute makes it possible to switch between different " +"error handling strategies during the lifetime of the :class:`StreamReader` " +"object." +msgstr "" +"*errors* 参数将被赋值给一个同名的属性。 通过对此属性赋值就可以在 :class:`StreamReader` " +"对象的生命期内在不同的错误处理策略之间进行切换。" + +#: ../../library/codecs.rst:823 +msgid "" +"The set of allowed values for the *errors* argument can be extended with " +":func:`register_error`." +msgstr "*errors* 参数所允许的值集合可以使用 :func:`register_error` 来扩展。" + +#: ../../library/codecs.rst:829 +msgid "Decodes data from the stream and returns the resulting object." +msgstr "解码来自流的数据并返回结果对象。" + +#: ../../library/codecs.rst:831 +msgid "" +"The *chars* argument indicates the number of decoded code points or bytes to" +" return. The :func:`read` method will never return more data than requested," +" but it might return less, if there is not enough available." +msgstr "" +"*chars* 参数指明要返回的解码后码位或字节数量。 :func:`read` " +"方法绝不会返回超出请求数量的数据,但如果可用数量不足,它可能返回少于请求数量的数据。" + +#: ../../library/codecs.rst:836 +msgid "" +"The *size* argument indicates the approximate maximum number of encoded " +"bytes or code points to read for decoding. The decoder can modify this " +"setting as appropriate. The default value -1 indicates to read and decode as" +" much as possible. This parameter is intended to prevent having to decode " +"huge files in one step." +msgstr "" +"*size* 参数指明要读取并解码的已编码字节或码位的最大数量近似值。 解码器可以适当地修改此设置。 默认值 -1 表示尽可能多地读取并解码。 " +"此形参的目的是防止一次性解码过于巨大的文件。" + +#: ../../library/codecs.rst:843 +msgid "" +"The *firstline* flag indicates that it would be sufficient to only return " +"the first line, if there are decoding errors on later lines." +msgstr "*firstline* 旗标指明如果在后续行发生解码错误,则仅返回第一行就足够了。" + +#: ../../library/codecs.rst:847 +msgid "" +"The method should use a greedy read strategy meaning that it should read as " +"much data as is allowed within the definition of the encoding and the given " +"size, e.g. if optional encoding endings or state markers are available on " +"the stream, these should be read too." +msgstr "" +"此方法应当使用“贪婪”读取策略,这意味着它应当在编码格式定义和给定大小所允许的情况下尽可能多地读取数据,例如,如果在流上存在可选的编码结束或状态标记,这些内容也应当被读取。" + +#: ../../library/codecs.rst:855 +msgid "Read one line from the input stream and return the decoded data." +msgstr "从输入流读取一行并返回解码后的数据。" + +#: ../../library/codecs.rst:857 +msgid "" +"*size*, if given, is passed as size argument to the stream's :meth:`read` " +"method." +msgstr "如果给定了 *size*,则将其作为 size 参数传递给流的 :meth:`read` 方法。" + +#: ../../library/codecs.rst:860 +msgid "" +"If *keepends* is false line-endings will be stripped from the lines " +"returned." +msgstr "如果 *keepends* 为假值,则行结束符将从返回的行中去除。" + +#: ../../library/codecs.rst:866 +msgid "" +"Read all lines available on the input stream and return them as a list of " +"lines." +msgstr "从输入流读取所有行并将其作为一个行列表返回。" + +#: ../../library/codecs.rst:869 +msgid "" +"Line-endings are implemented using the codec's :meth:`decode` method and are" +" included in the list entries if *keepends* is true." +msgstr "行结束符会使用编解码器的 :meth:`decode` 方法来实现,并且如果 *keepends* 为真值则会将其包含在列表条目中。" + +#: ../../library/codecs.rst:872 +msgid "" +"*sizehint*, if given, is passed as the *size* argument to the stream's " +":meth:`read` method." +msgstr "如果给定了 *sizehint*,则将其作为 *size* 参数传递给流的 :meth:`read` 方法。" + +#: ../../library/codecs.rst:880 +msgid "" +"Note that no stream repositioning should take place. This method is " +"primarily intended to be able to recover from decoding errors." +msgstr "请注意不应当对流进行重定位。 使用此方法的主要目的是为了能够从解码错误中恢复。" + +#: ../../library/codecs.rst:884 +msgid "" +"In addition to the above methods, the :class:`StreamReader` must also " +"inherit all other methods and attributes from the underlying stream." +msgstr "除了上述的方法,:class:`StreamReader` 还必须继承来自下层流的所有其他方法和属性。" + +#: ../../library/codecs.rst:890 +msgid "StreamReaderWriter Objects" +msgstr "StreamReaderWriter 对象" + +#: ../../library/codecs.rst:892 +msgid "" +"The :class:`StreamReaderWriter` is a convenience class that allows wrapping " +"streams which work in both read and write modes." +msgstr ":class:`StreamReaderWriter` 是一个方便的类,允许对同时工作于读取和写入模式的流进行包装。" + +#: ../../library/codecs.rst:895 ../../library/codecs.rst:919 +msgid "" +"The design is such that one can use the factory functions returned by the " +":func:`lookup` function to construct the instance." +msgstr "其设计使得开发者可以使用 :func:`lookup` 函数所返回的工厂函数来构造实例。" + +#: ../../library/codecs.rst:901 +msgid "" +"Creates a :class:`StreamReaderWriter` instance. *stream* must be a file-like" +" object. *Reader* and *Writer* must be factory functions or classes " +"providing the :class:`StreamReader` and :class:`StreamWriter` interface " +"resp. Error handling is done in the same way as defined for the stream " +"readers and writers." +msgstr "" +"创建一个 :class:`StreamReaderWriter` 实例。 *stream* 必须为一个文件型对象。 *Reader* 和 " +"*Writer* 必须为分别提供了 :class:`StreamReader` 和 :class:`StreamWriter` 接口的工厂函数或类。 " +"错误处理通过与流式读取器和写入器所定义的相同方式来完成。" + +#: ../../library/codecs.rst:906 +msgid "" +":class:`StreamReaderWriter` instances define the combined interfaces of " +":class:`StreamReader` and :class:`StreamWriter` classes. They inherit all " +"other methods and attributes from the underlying stream." +msgstr "" +":class:`StreamReaderWriter` 实例定义了 :class:`StreamReader` 和 " +":class:`StreamWriter` 类的组合接口。 它们还继承了来自下层流的所有其他方法和属性。" + +#: ../../library/codecs.rst:914 +msgid "StreamRecoder Objects" +msgstr "StreamRecoder 对象" + +#: ../../library/codecs.rst:916 +msgid "" +"The :class:`StreamRecoder` translates data from one encoding to another, " +"which is sometimes useful when dealing with different encoding environments." +msgstr ":class:`StreamRecoder` 将数据从一种编码格式转换为另一种,这对于处理不同编码环境的情况有时会很有用。" + +#: ../../library/codecs.rst:925 +msgid "" +"Creates a :class:`StreamRecoder` instance which implements a two-way " +"conversion: *encode* and *decode* work on the frontend — the data visible to" +" code calling :meth:`~StreamReader.read` and :meth:`~StreamWriter.write`, " +"while *Reader* and *Writer* work on the backend — the data in *stream*." +msgstr "" +"创建一个实现了双向转换的 :class:`StreamRecoder` 实例: *encode* 和 *decode* 工作于前端 —— 调用 " +":meth:`~StreamReader.read` 和 :meth:`~StreamWriter.write` 的代码可见的数据,而 *Reader*" +" 和 *Writer* 工作于后端 —— *stream* 中的数据。" + +#: ../../library/codecs.rst:931 +msgid "" +"You can use these objects to do transparent transcodings, e.g., from Latin-1" +" to UTF-8 and back." +msgstr "你可以使用这些对象来进行透明转码,例如从 Latin-1 转为 UTF-8 以及反向转换。" + +#: ../../library/codecs.rst:934 +msgid "The *stream* argument must be a file-like object." +msgstr "*stream* 参数必须为一个文件型对象。" + +#: ../../library/codecs.rst:936 +msgid "" +"The *encode* and *decode* arguments must adhere to the :class:`Codec` " +"interface. *Reader* and *Writer* must be factory functions or classes " +"providing objects of the :class:`StreamReader` and :class:`StreamWriter` " +"interface respectively." +msgstr "" +"*encode* 和 *decode* 参数必须遵循 :class:`Codec` 接口。 *Reader* 和 *Writer* 必须为分别提供了 " +":class:`StreamReader` 和 :class:`StreamWriter` 接口对象的工厂函数或类。" + +#: ../../library/codecs.rst:941 +msgid "" +"Error handling is done in the same way as defined for the stream readers and" +" writers." +msgstr "错误处理通过与流式读取器和写入器所定义的相同方式来完成。" + +#: ../../library/codecs.rst:945 +msgid "" +":class:`StreamRecoder` instances define the combined interfaces of " +":class:`StreamReader` and :class:`StreamWriter` classes. They inherit all " +"other methods and attributes from the underlying stream." +msgstr "" +":class:`StreamRecoder` 实例定义了 :class:`StreamReader` 和 :class:`StreamWriter` " +"类的组合接口。 它们还继承了来自下层流的所有其他方法和属性。" + +#: ../../library/codecs.rst:953 +msgid "Encodings and Unicode" +msgstr "编码格式与 Unicode" + +#: ../../library/codecs.rst:955 +msgid "" +"Strings are stored internally as sequences of code points in range " +"``U+0000``--``U+10FFFF``. (See :pep:`393` for more details about the " +"implementation.) Once a string object is used outside of CPU and memory, " +"endianness and how these arrays are stored as bytes become an issue. As with" +" other codecs, serialising a string into a sequence of bytes is known as " +"*encoding*, and recreating the string from the sequence of bytes is known as" +" *decoding*. There are a variety of different text serialisation codecs, " +"which are collectivity referred to as :term:`text encodings `." +msgstr "" +"字符串在系统内部存储为 ``U+0000``--``U+10FFFF`` 范围内的码位序列。 (请参阅 :pep:`393` 了解有关实现的详情。) " +"一旦字符串对象要在 CPU 和内存以外使用,字节的大小端顺序和字节数组的存储方式就成为一个影响因素。 " +"如同使用其他编解码器一样,将字符串序列化为字节序列被称为 *编码*,而从字节序列重建字符串被称为 *解码*。 " +"存在许多不同的文本序列化编解码器,它们被统称为 :term:`文本编码格式 `。" + +#: ../../library/codecs.rst:965 +msgid "" +"The simplest text encoding (called ``'latin-1'`` or ``'iso-8859-1'``) maps " +"the code points 0--255 to the bytes ``0x0``--``0xff``, which means that a " +"string object that contains code points above ``U+00FF`` can't be encoded " +"with this codec. Doing so will raise a :exc:`UnicodeEncodeError` that looks " +"like the following (although the details of the error message may differ): " +"``UnicodeEncodeError: 'latin-1' codec can't encode character '\\u1234' in " +"position 3: ordinal not in range(256)``." +msgstr "" +"最简单的文本编码格式 (称为 ``'latin-1'`` 或 ``'iso-8859-1'``) 将码位 0--255 映射为字节值 " +"``0x0``--``0xff``,这意味着包含 ``U+00FF`` 以上码位的字符串对象无法使用此编解码器进行编码。 这样做将引发 " +":exc:`UnicodeEncodeError`,其形式类似下面这样(不过详细的错误信息可能会有所不同): ``UnicodeEncodeError:" +" 'latin-1' codec can't encode character '\\u1234' in position 3: ordinal not" +" in range(256)``。" + +#: ../../library/codecs.rst:973 +msgid "" +"There's another group of encodings (the so called charmap encodings) that " +"choose a different subset of all Unicode code points and how these code " +"points are mapped to the bytes ``0x0``--``0xff``. To see how this is done " +"simply open e.g. :file:`encodings/cp1252.py` (which is an encoding that is " +"used primarily on Windows). There's a string constant with 256 characters " +"that shows you which character is mapped to which byte value." +msgstr "" +"还有另外一组编码格式(所谓的字符映射编码)会选择全部 Unicode 码位的不同子集并设定如何将这些码位映射为字节值 " +"``0x0``--``0xff``。 要查看这是如何实现的,只需简单地打开相应源码例如 :file:`encodings/cp1252.py` " +"(这是一个主要在 Windows 上使用的编码格式)。 其中会有一个包含 256 个字符的字符串常量,指明每个字符所映射的字节值。" + +#: ../../library/codecs.rst:980 +msgid "" +"All of these encodings can only encode 256 of the 1114112 code points " +"defined in Unicode. A simple and straightforward way that can store each " +"Unicode code point, is to store each code point as four consecutive bytes. " +"There are two possibilities: store the bytes in big endian or in little " +"endian order. These two encodings are called ``UTF-32-BE`` and ``UTF-32-LE``" +" respectively. Their disadvantage is that if, for example, you use " +"``UTF-32-BE`` on a little endian machine you will always have to swap bytes " +"on encoding and decoding. Python's ``UTF-16`` and ``UTF-32`` codecs avoid " +"this problem by using the platform's native byte order when no BOM is " +"present. Python follows prevailing platform practice, so native-endian data " +"round-trips without redundant byte swapping, even though the Unicode " +"Standard defaults to big-endian when the byte order is unspecified. When " +"these bytes are read by a CPU with a different endianness, the bytes have to" +" be swapped. To be able to detect the endianness of a ``UTF-16`` or " +"``UTF-32`` byte sequence, a BOM (\"Byte Order Mark\") is used. This is the " +"Unicode character ``U+FEFF``. This character can be prepended to every " +"``UTF-16`` or ``UTF-32`` byte sequence. The byte swapped version of this " +"character (``0xFFFE``) is an illegal character that may not appear in a " +"Unicode text. When the first character of a ``UTF-16`` or ``UTF-32`` byte " +"sequence is ``U+FFFE``, the bytes have to be swapped on decoding." +msgstr "" +"所有这些编码格式只能编码在 Unicode 中定义的 1114112 个码位中的 256 个。 一种能够存储每个 Unicode " +"码位的简单直观的做法就是将每个码位存储为四个连续的字节。 这有两种可能的方式:以大端序或小端序存储字节。 这两种编码格式分别被称为 " +"``UTF-32-BE`` 和 ``UTF-32-LE``。 它们是有缺点的,举例来说,如果你在小端序的机器上使用 ``UTF-32-BE`` " +"你就必须在编码和解码时交换字节顺序。 Python 的 ``UTF-16`` 和 ``UTF-32`` 编解码器会在没有 BOM " +"时通过使用平台的原生字节序来避免这个问题。 Python 会遵循主流平台的最佳实践,这样原生字节序的数据在处理时就没有冗余的字节交换,即使 " +"Unicode 标准在未指明字节序时默认使用大端序。 当 CPU 以不同的字节序读取字节数据时,必须进行字节交换。 为了能够检测 ``UTF-16`` " +"或 ``UTF-32`` 字节序列的字节序,可以使用 BOM (\"Byte Order Mark\")。 对应 Unicode 字符 " +"``U+FEFF``。 此字符可被添加到每个 ``UTF-16`` 或 ``UTF-32`` 字节序列之前。此字符的交换字节版本 " +"(``0xFFFE``) 是不可在 Unicode 文本中出现的非法字符。 当一个 ``UTF-16`` 或 ``UTF-32`` 的首字符为 " +"``U+FFFE`` 时,该字节数据就必须在解码时交换字节序。" + +#: ../../library/codecs.rst:1001 +msgid "" +"Unfortunately the character ``U+FEFF`` had a second purpose as a ``ZERO " +"WIDTH NO-BREAK SPACE``: a character that has no width and doesn't allow a " +"word to be split. It can e.g. be used to give hints to a ligature algorithm." +" With Unicode 4.0 using ``U+FEFF`` as a ``ZERO WIDTH NO-BREAK SPACE`` has " +"been deprecated (with ``U+2060`` (``WORD JOINER``) assuming this role). " +"Nevertheless Unicode software still must be able to handle ``U+FEFF`` in " +"both roles: as a BOM it's a device to determine the storage layout of the " +"encoded bytes, and vanishes once the byte sequence has been decoded into a " +"string; as a ``ZERO WIDTH NO-BREAK SPACE`` it's a normal character that will" +" be decoded like any other." +msgstr "" +"不幸的是字符 ``U+FEFF`` 还有另一个作为 ``ZERO WIDTH NO-BREAK SPACE`` " +"的含义:表示没有宽度且不允许拆分单词的字符。 例如它可被用于对连字算法进行提示。 在 Unicode 4.0 中 ``U+FEFF`` 作为 " +"``ZERO WIDTH NO-BREAK SPACE`` 的含义已被弃用 (使用 ``U+2060`` (``WORD JOINER``) " +"担任此任务)。 不过 Unicode 软件仍然必须能够在两种任务下处理 ``U+FEFF``: 作为 BOM " +"它是确定已编码字节串的存储布局的标记,并会在字节序列被解码为字符串时消失;作为 ``ZERO WIDTH NO-BREAK SPACE`` " +"它是会如任何其他字符一样被解码的普通字符。" + +#: ../../library/codecs.rst:1011 +msgid "" +"There's another encoding that is able to encode the full range of Unicode " +"characters: UTF-8. UTF-8 is an 8-bit encoding, which means there are no " +"issues with byte order in UTF-8. Each byte in a UTF-8 byte sequence consists" +" of two parts: marker bits (the most significant bits) and payload bits. The" +" marker bits are a sequence of zero to four ``1`` bits followed by a ``0`` " +"bit. Unicode characters are encoded like this (with x being payload bits, " +"which when concatenated give the Unicode character):" +msgstr "" +"还有另一种编码格式能够对所有 Unicode 字符进行编码:UTF-8。 UTF-8 是一种 8 位编码,这意味着在 UTF-8 中没有字节顺序问题。 " +"UTF-8 字节序列中的每个字节由两部分组成:标志位(最重要的位)和内容位。 标志位是由零至四个值为 ``1`` 的二进制位加一个值为 ``0`` " +"的二进制位构成的序列。 Unicode 字符会按以下形式进行编码(其中 x 为内容位,当拼接为一体时将给出对应的 Unicode 字符):" + +#: ../../library/codecs.rst:1020 +msgid "Range" +msgstr "范围" + +#: ../../library/codecs.rst:1020 +msgid "Encoding" +msgstr "编码" + +#: ../../library/codecs.rst:1022 +msgid "``U-00000000`` ... ``U-0000007F``" +msgstr "``U-00000000`` ... ``U-0000007F``" + +#: ../../library/codecs.rst:1022 +msgid "0xxxxxxx" +msgstr "0xxxxxxx" + +#: ../../library/codecs.rst:1024 +msgid "``U-00000080`` ... ``U-000007FF``" +msgstr "``U-00000080`` ... ``U-000007FF``" + +#: ../../library/codecs.rst:1024 +msgid "110xxxxx 10xxxxxx" +msgstr "110xxxxx 10xxxxxx" + +#: ../../library/codecs.rst:1026 +msgid "``U-00000800`` ... ``U-0000FFFF``" +msgstr "``U-00000800`` ... ``U-0000FFFF``" + +#: ../../library/codecs.rst:1026 +msgid "1110xxxx 10xxxxxx 10xxxxxx" +msgstr "1110xxxx 10xxxxxx 10xxxxxx" + +#: ../../library/codecs.rst:1028 +msgid "``U-00010000`` ... ``U-0010FFFF``" +msgstr "``U-00010000`` ... ``U-0010FFFF``" + +#: ../../library/codecs.rst:1028 +msgid "11110xxx 10xxxxxx 10xxxxxx 10xxxxxx" +msgstr "11110xxx 10xxxxxx 10xxxxxx 10xxxxxx" + +#: ../../library/codecs.rst:1031 +msgid "" +"The least significant bit of the Unicode character is the rightmost x bit." +msgstr "Unicode 字符最不重要的一个位就是最右侧的二进制位 x。" + +#: ../../library/codecs.rst:1033 +msgid "" +"As UTF-8 is an 8-bit encoding no BOM is required and any ``U+FEFF`` " +"character in the decoded string (even if it's the first character) is " +"treated as a ``ZERO WIDTH NO-BREAK SPACE``." +msgstr "" +"由于 UTF-8 是一种 8 位编码格式,因此 BOM 是不必要的,并且已编码字符串中的任何 ``U+FEFF`` " +"字符(即使是作为第一个字符)都会被视为是 ``ZERO WIDTH NO-BREAK SPACE``。" + +#: ../../library/codecs.rst:1037 +msgid "" +"Without external information it's impossible to reliably determine which " +"encoding was used for encoding a string. Each charmap encoding can decode " +"any random byte sequence. However that's not possible with UTF-8, as UTF-8 " +"byte sequences have a structure that doesn't allow arbitrary byte sequences." +" To increase the reliability with which a UTF-8 encoding can be detected, " +"Microsoft invented a variant of UTF-8 (that Python calls ``\"utf-8-sig\"``) " +"for its Notepad program: Before any of the Unicode characters is written to " +"the file, a UTF-8 encoded BOM (which looks like this as a byte sequence: " +"``0xef``, ``0xbb``, ``0xbf``) is written. As it's rather improbable that any" +" charmap encoded file starts with these byte values (which would e.g. map to" +msgstr "" +"在没有外部信息的情况下将不可能毫无疑义地确定一个字符串使用了何种编码格式。 每种字符映射编码格式都可以解码任意的随机字节序列。 然而对 UTF-8 " +"来说这却是不可能的,因为 UTF-8 字节序列具有不允许任意字节序列的特别结构。 为了提升 UTF-8 编码格式检测的可靠性,Microsoft " +"发明了一种 UTF-8 的变体形式 (Python 称之为 ``\"utf-8-sig\"``) 专门用于其 Notepad 程序:在任何 " +"Unicode 字节被写入文件之前,会先写入一个 UTF-8 编码的 BOM (它看起来是这样一个字节序列: ``0xef``, ``0xbb``, " +"``0xbf``)。 由于任何字符映射编码后的文件都不大可能以这些字节值开头 (例如它们会映射为" + +#: ../../library/codecs.rst:0 +msgid "LATIN SMALL LETTER I WITH DIAERESIS" +msgstr "LATIN SMALL LETTER I WITH DIAERESIS" + +#: ../../library/codecs.rst:0 +msgid "RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK" +msgstr "RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK" + +#: ../../library/codecs.rst:0 +msgid "INVERTED QUESTION MARK" +msgstr "INVERTED QUESTION MARK" + +#: ../../library/codecs.rst:1053 +msgid "" +"in iso-8859-1), this increases the probability that a ``utf-8-sig`` encoding" +" can be correctly guessed from the byte sequence. So here the BOM is not " +"used to be able to determine the byte order used for generating the byte " +"sequence, but as a signature that helps in guessing the encoding. On " +"encoding the utf-8-sig codec will write ``0xef``, ``0xbb``, ``0xbf`` as the " +"first three bytes to the file. On decoding ``utf-8-sig`` will skip those " +"three bytes if they appear as the first three bytes in the file. In UTF-8, " +"the use of the BOM is discouraged and should generally be avoided." +msgstr "" +"对于 iso-8859-1 编码格式来说),这提升了根据字节序列来正确猜测 ``utf-8-sig`` 编码格式的成功率。 所以在这里 BOM " +"的作用并不是帮助确定生成字节序列所使用的字节顺序,而是作为帮助猜测编码格式的记号。 在进行编码时 utf-8-sig 编解码器将把 ``0xef``, " +"``0xbb``, ``0xbf`` 作为头三个字节写入文件。 在进行解码时 ``utf-8-sig`` " +"将跳过这三个字节,如果它们作为文件的头三个字节出现的话。 在 UTF-8 中并不推荐使用 BOM,通常应当避免它们的出现。" + +#: ../../library/codecs.rst:1066 +msgid "Standard Encodings" +msgstr "标准编码" + +#: ../../library/codecs.rst:1068 +msgid "" +"Python comes with a number of codecs built-in, either implemented as C " +"functions or with dictionaries as mapping tables. The following table lists " +"the codecs by name, together with a few common aliases, and the languages " +"for which the encoding is likely used. Neither the list of aliases nor the " +"list of languages is meant to be exhaustive. Notice that spelling " +"alternatives that only differ in case or use a hyphen instead of an " +"underscore are also valid aliases because they are equivalent when " +"normalized by :func:`~encodings.normalize_encoding`. For example, " +"``'utf-8'`` is a valid alias for the ``'utf_8'`` codec." +msgstr "" +"Python 内置了多种编解码器,这些编解码器既可以通过 C " +"函数实现,也可以使用字典作为映射表来实现。下表按名称列出了这些编解码器,同时提供了部分常用别名以及该编码格式可能适用的语言。需要注意的是,所列的别名列表和语言列表并非详尽无遗。此外,请注意,仅存在大小写差异或使用连字符替代下划线的拼写变体同样属于有效别名,因为在经过" +" :func:`~encodings.normalize_encoding` 规范化处理后,这些形式是等效的。例如,``'utf-8'`` 就是 " +"``'utf_8'`` 编解码器的一个有效别名。" + +#: ../../library/codecs.rst:1080 +msgid "" +"The below table lists the most common aliases, for a complete list refer to " +"the source :source:`aliases.py ` file." +msgstr "" +"下表列出了最常见的编解码器别名,如需查看完整列表,请参阅源文件 :source:`aliases.py " +"`。" + +#: ../../library/codecs.rst:1083 +msgid "" +"On Windows, ``cpXXX`` codecs are available for all code pages. But only " +"codecs listed in the following table are guarantead to exist on other " +"platforms." +msgstr "在 Windows 系统上,``cpXXX`` 编解码器可用于所有代码页。 但只有下表中列出的编解码器才能保证在其他平台上存在。" + +#: ../../library/codecs.rst:1089 +msgid "" +"Some common encodings can bypass the codecs lookup machinery to improve " +"performance. These optimization opportunities are only recognized by CPython" +" for a limited set of (case insensitive) aliases: utf-8, utf8, latin-1, " +"latin1, iso-8859-1, iso8859-1, mbcs (Windows only), ascii, us-ascii, utf-16," +" utf16, utf-32, utf32, and the same using underscores instead of dashes. " +"Using alternative aliases for these encodings may result in slower " +"execution." +msgstr "" +"有些常见编码格式可以绕过编解码器查找机制来提升性能。 这些优化机会对于 CPython 来说仅能通过一组有限的别名(大小写不敏感)来识别:utf-8, " +"utf8, latin-1, latin1, iso-8859-1, iso8859-1, mbcs (Windows 专属), ascii, us-" +"ascii, utf-16, utf16, utf-32, utf32, 也包括使用下划线替代连字符的的形式。 " +"使用这些编码格式的其他别名可能会导致更慢的执行速度。" + +#: ../../library/codecs.rst:1097 +msgid "Optimization opportunity recognized for us-ascii." +msgstr "可识别针对 us-ascii 的优化机会。" + +#: ../../library/codecs.rst:1100 +msgid "" +"Many of the character sets support the same languages. They vary in " +"individual characters (e.g. whether the EURO SIGN is supported or not), and " +"in the assignment of characters to code positions. For the European " +"languages in particular, the following variants typically exist:" +msgstr "" +"许多字符集都支持相同的语言。 它们在个别字符(例如是否支持 EURO SIGN 等)以及给字符所分配的码位方面存在差异。 " +"特别是对于欧洲语言来说,通常存在以下几种变体:" + +#: ../../library/codecs.rst:1105 +msgid "an ISO 8859 codeset" +msgstr "某个 ISO 8859 编码集" + +#: ../../library/codecs.rst:1107 +msgid "" +"a Microsoft Windows code page, which is typically derived from an 8859 " +"codeset, but replaces control characters with additional graphic characters" +msgstr "某个 Microsoft Windows 编码页,通常是派生自某个 8859 编码集,但会用附加的图形字符来替换控制字符。" + +#: ../../library/codecs.rst:1110 +msgid "an IBM EBCDIC code page" +msgstr "某个 IBM EBCDIC 编码页" + +#: ../../library/codecs.rst:1112 +msgid "an IBM PC code page, which is ASCII compatible" +msgstr "某个 IBM PC 编码页,通常会兼容 ASCII" + +#: ../../library/codecs.rst:1117 ../../library/codecs.rst:1376 +#: ../../library/codecs.rst:1448 ../../library/codecs.rst:1533 +msgid "Codec" +msgstr "编码" + +#: ../../library/codecs.rst:1117 ../../library/codecs.rst:1376 +#: ../../library/codecs.rst:1448 ../../library/codecs.rst:1533 +msgid "Aliases" +msgstr "别名" + +#: ../../library/codecs.rst:1117 +msgid "Languages" +msgstr "语言" + +#: ../../library/codecs.rst:1119 +msgid "ascii" +msgstr "ascii" + +#: ../../library/codecs.rst:1119 +msgid "646, us-ascii" +msgstr "646, us-ascii" + +#: ../../library/codecs.rst:1119 ../../library/codecs.rst:1125 +#: ../../library/codecs.rst:1133 +msgid "English" +msgstr "英语" + +#: ../../library/codecs.rst:1121 +msgid "big5" +msgstr "big5" + +#: ../../library/codecs.rst:1121 +msgid "big5-tw, csbig5" +msgstr "big5-tw, csbig5" + +#: ../../library/codecs.rst:1121 ../../library/codecs.rst:1123 +#: ../../library/codecs.rst:1182 +msgid "Traditional Chinese" +msgstr "繁体中文" + +#: ../../library/codecs.rst:1123 +msgid "big5hkscs" +msgstr "big5hkscs" + +#: ../../library/codecs.rst:1123 +msgid "big5-hkscs, hkscs" +msgstr "big5-hkscs, hkscs" + +#: ../../library/codecs.rst:1125 +msgid "cp037" +msgstr "cp037" + +#: ../../library/codecs.rst:1125 +msgid "IBM037, IBM039" +msgstr "IBM037, IBM039" + +#: ../../library/codecs.rst:1127 +msgid "cp273" +msgstr "cp273" + +#: ../../library/codecs.rst:1127 +msgid "273, IBM273, csIBM273" +msgstr "273, IBM273, csIBM273" + +#: ../../library/codecs.rst:1127 +msgid "German" +msgstr "德语" + +#: ../../library/codecs.rst:1131 +msgid "cp424" +msgstr "cp424" + +#: ../../library/codecs.rst:1131 +msgid "EBCDIC-CP-HE, IBM424" +msgstr "EBCDIC-CP-HE, IBM424" + +#: ../../library/codecs.rst:1131 ../../library/codecs.rst:1151 +#: ../../library/codecs.rst:1161 ../../library/codecs.rst:1205 +#: ../../library/codecs.rst:1268 +msgid "Hebrew" +msgstr "希伯来语" + +#: ../../library/codecs.rst:1133 +msgid "cp437" +msgstr "cp437" + +#: ../../library/codecs.rst:1133 +msgid "437, IBM437" +msgstr "437, IBM437" + +#: ../../library/codecs.rst:1135 +msgid "cp500" +msgstr "cp500" + +#: ../../library/codecs.rst:1135 +msgid "EBCDIC-CP-BE, EBCDIC-CP-CH, IBM500" +msgstr "EBCDIC-CP-BE, EBCDIC-CP-CH, IBM500" + +#: ../../library/codecs.rst:1135 ../../library/codecs.rst:1144 +#: ../../library/codecs.rst:1155 ../../library/codecs.rst:1192 +#: ../../library/codecs.rst:1199 ../../library/codecs.rst:1252 +#: ../../library/codecs.rst:1280 ../../library/codecs.rst:1308 +msgid "Western Europe" +msgstr "西欧" + +#: ../../library/codecs.rst:1138 +msgid "cp720" +msgstr "cp720" + +#: ../../library/codecs.rst:1138 ../../library/codecs.rst:1165 +#: ../../library/codecs.rst:1207 ../../library/codecs.rst:1264 +msgid "Arabic" +msgstr "阿拉伯语" + +#: ../../library/codecs.rst:1140 +msgid "cp737" +msgstr "cp737" + +#: ../../library/codecs.rst:1140 ../../library/codecs.rst:1171 +#: ../../library/codecs.rst:1175 ../../library/codecs.rst:1201 +#: ../../library/codecs.rst:1266 ../../library/codecs.rst:1301 +msgid "Greek" +msgstr "希腊语" + +#: ../../library/codecs.rst:1142 +msgid "cp775" +msgstr "cp775" + +#: ../../library/codecs.rst:1142 +msgid "IBM775" +msgstr "IBM775" + +#: ../../library/codecs.rst:1142 ../../library/codecs.rst:1209 +#: ../../library/codecs.rst:1276 +msgid "Baltic languages" +msgstr "波罗的海语言" + +#: ../../library/codecs.rst:1144 +msgid "cp850" +msgstr "cp850" + +#: ../../library/codecs.rst:1144 +msgid "850, IBM850" +msgstr "850, IBM850" + +#: ../../library/codecs.rst:1146 +msgid "cp852" +msgstr "cp852" + +#: ../../library/codecs.rst:1146 +msgid "852, IBM852" +msgstr "852, IBM852" + +#: ../../library/codecs.rst:1146 ../../library/codecs.rst:1194 +#: ../../library/codecs.rst:1255 ../../library/codecs.rst:1305 +msgid "Central and Eastern Europe" +msgstr "中欧和东欧" + +#: ../../library/codecs.rst:1148 +msgid "cp855" +msgstr "cp855" + +#: ../../library/codecs.rst:1148 +msgid "855, IBM855" +msgstr "855, IBM855" + +#: ../../library/codecs.rst:1148 ../../library/codecs.rst:1196 +#: ../../library/codecs.rst:1261 ../../library/codecs.rst:1298 +msgid "Belarusian, Bulgarian, Macedonian, Russian, Serbian" +msgstr "白俄罗斯语,保加利亚语,马其顿语,俄语,塞尔维亚语" + +#: ../../library/codecs.rst:1151 +msgid "cp856" +msgstr "cp856" + +#: ../../library/codecs.rst:1153 +msgid "cp857" +msgstr "cp857" + +#: ../../library/codecs.rst:1153 +msgid "857, IBM857" +msgstr "857, IBM857" + +#: ../../library/codecs.rst:1153 ../../library/codecs.rst:1186 +#: ../../library/codecs.rst:1203 ../../library/codecs.rst:1270 +#: ../../library/codecs.rst:1310 +msgid "Turkish" +msgstr "土耳其语" + +#: ../../library/codecs.rst:1155 +msgid "cp858" +msgstr "cp858" + +#: ../../library/codecs.rst:1155 +msgid "858, IBM00858" +msgstr "" + +#: ../../library/codecs.rst:1157 +msgid "cp860" +msgstr "cp860" + +#: ../../library/codecs.rst:1157 +msgid "860, IBM860" +msgstr "860, IBM860" + +#: ../../library/codecs.rst:1157 +msgid "Portuguese" +msgstr "葡萄牙语" + +#: ../../library/codecs.rst:1159 +msgid "cp861" +msgstr "cp861" + +#: ../../library/codecs.rst:1159 +msgid "861, CP-IS, IBM861" +msgstr "861, CP-IS, IBM861" + +#: ../../library/codecs.rst:1159 ../../library/codecs.rst:1303 +msgid "Icelandic" +msgstr "冰岛语" + +#: ../../library/codecs.rst:1161 +msgid "cp862" +msgstr "cp862" + +#: ../../library/codecs.rst:1161 +msgid "862, IBM862" +msgstr "862, IBM862" + +#: ../../library/codecs.rst:1163 +msgid "cp863" +msgstr "cp863" + +#: ../../library/codecs.rst:1163 +msgid "863, IBM863" +msgstr "863, IBM863" + +#: ../../library/codecs.rst:1163 +msgid "Canadian" +msgstr "加拿大语" + +#: ../../library/codecs.rst:1165 +msgid "cp864" +msgstr "cp864" + +#: ../../library/codecs.rst:1165 +msgid "IBM864" +msgstr "IBM864" + +#: ../../library/codecs.rst:1167 +msgid "cp865" +msgstr "cp865" + +#: ../../library/codecs.rst:1167 +msgid "865, IBM865" +msgstr "865, IBM865" + +#: ../../library/codecs.rst:1167 +msgid "Danish, Norwegian" +msgstr "丹麦语/挪威语" + +#: ../../library/codecs.rst:1169 +msgid "cp866" +msgstr "cp866" + +#: ../../library/codecs.rst:1169 +msgid "866, IBM866" +msgstr "866, IBM866" + +#: ../../library/codecs.rst:1169 ../../library/codecs.rst:1286 +msgid "Russian" +msgstr "俄语" + +#: ../../library/codecs.rst:1171 +msgid "cp869" +msgstr "cp869" + +#: ../../library/codecs.rst:1171 +msgid "869, CP-GR, IBM869" +msgstr "869, CP-GR, IBM869" + +#: ../../library/codecs.rst:1173 +msgid "cp874" +msgstr "cp874" + +#: ../../library/codecs.rst:1173 +msgid "Thai" +msgstr "泰语" + +#: ../../library/codecs.rst:1175 +msgid "cp875" +msgstr "cp875" + +#: ../../library/codecs.rst:1177 +msgid "cp932" +msgstr "cp932" + +#: ../../library/codecs.rst:1177 +msgid "932, ms932, mskanji, ms-kanji, windows-31j" +msgstr "932, ms932, mskanji, ms-kanji, windows-31j" + +#: ../../library/codecs.rst:1177 ../../library/codecs.rst:1213 +#: ../../library/codecs.rst:1215 ../../library/codecs.rst:1217 +#: ../../library/codecs.rst:1234 ../../library/codecs.rst:1237 +#: ../../library/codecs.rst:1242 ../../library/codecs.rst:1245 +#: ../../library/codecs.rst:1247 ../../library/codecs.rst:1315 +#: ../../library/codecs.rst:1318 ../../library/codecs.rst:1321 +msgid "Japanese" +msgstr "日语" + +#: ../../library/codecs.rst:1180 +msgid "cp949" +msgstr "cp949" + +#: ../../library/codecs.rst:1180 +msgid "949, ms949, uhc" +msgstr "949, ms949, uhc" + +#: ../../library/codecs.rst:1180 ../../library/codecs.rst:1219 +#: ../../library/codecs.rst:1249 ../../library/codecs.rst:1284 +msgid "Korean" +msgstr "韩语" + +#: ../../library/codecs.rst:1182 +msgid "cp950" +msgstr "cp950" + +#: ../../library/codecs.rst:1182 +msgid "950, ms950" +msgstr "950, ms950" + +#: ../../library/codecs.rst:1184 +msgid "cp1006" +msgstr "cp1006" + +#: ../../library/codecs.rst:1184 +msgid "Urdu" +msgstr "乌尔都语" + +#: ../../library/codecs.rst:1186 +msgid "cp1026" +msgstr "cp1026" + +#: ../../library/codecs.rst:1186 +msgid "ibm1026" +msgstr "ibm1026" + +#: ../../library/codecs.rst:1188 +msgid "cp1125" +msgstr "cp1125" + +#: ../../library/codecs.rst:1188 +msgid "1125, ibm1125, cp866u, ruscii" +msgstr "1125, ibm1125, cp866u, ruscii" + +#: ../../library/codecs.rst:1188 ../../library/codecs.rst:1292 +msgid "Ukrainian" +msgstr "乌克兰语" + +#: ../../library/codecs.rst:1192 +msgid "cp1140" +msgstr "cp1140" + +#: ../../library/codecs.rst:1192 +msgid "IBM01140" +msgstr "" + +#: ../../library/codecs.rst:1194 +msgid "cp1250" +msgstr "cp1250" + +#: ../../library/codecs.rst:1194 +msgid "windows-1250" +msgstr "windows-1250" + +#: ../../library/codecs.rst:1196 +msgid "cp1251" +msgstr "cp1251" + +#: ../../library/codecs.rst:1196 +msgid "windows-1251" +msgstr "windows-1251" + +#: ../../library/codecs.rst:1199 +msgid "cp1252" +msgstr "cp1252" + +#: ../../library/codecs.rst:1199 +msgid "windows-1252" +msgstr "windows-1252" + +#: ../../library/codecs.rst:1201 +msgid "cp1253" +msgstr "cp1253" + +#: ../../library/codecs.rst:1201 +msgid "windows-1253" +msgstr "windows-1253" + +#: ../../library/codecs.rst:1203 +msgid "cp1254" +msgstr "cp1254" + +#: ../../library/codecs.rst:1203 +msgid "windows-1254" +msgstr "windows-1254" + +#: ../../library/codecs.rst:1205 +msgid "cp1255" +msgstr "cp1255" + +#: ../../library/codecs.rst:1205 +msgid "windows-1255" +msgstr "windows-1255" + +#: ../../library/codecs.rst:1207 +msgid "cp1256" +msgstr "cp1256" + +#: ../../library/codecs.rst:1207 +msgid "windows-1256" +msgstr "windows-1256" + +#: ../../library/codecs.rst:1209 +msgid "cp1257" +msgstr "cp1257" + +#: ../../library/codecs.rst:1209 +msgid "windows-1257" +msgstr "windows-1257" + +#: ../../library/codecs.rst:1211 +msgid "cp1258" +msgstr "cp1258" + +#: ../../library/codecs.rst:1211 +msgid "windows-1258" +msgstr "windows-1258" + +#: ../../library/codecs.rst:1211 +msgid "Vietnamese" +msgstr "越南语" + +#: ../../library/codecs.rst:1213 +msgid "euc_jp" +msgstr "euc_jp" + +#: ../../library/codecs.rst:1213 +msgid "eucjp, ujis, u-jis" +msgstr "eucjp, ujis, u-jis" + +#: ../../library/codecs.rst:1215 +msgid "euc_jis_2004" +msgstr "euc_jis_2004" + +#: ../../library/codecs.rst:1215 +msgid "jisx0213, eucjis2004" +msgstr "jisx0213, eucjis2004" + +#: ../../library/codecs.rst:1217 +msgid "euc_jisx0213" +msgstr "euc_jisx0213" + +#: ../../library/codecs.rst:1217 +msgid "eucjisx0213" +msgstr "eucjisx0213" + +#: ../../library/codecs.rst:1219 +msgid "euc_kr" +msgstr "euc_kr" + +#: ../../library/codecs.rst:1219 +msgid "euckr, korean, ksc5601, ks_c-5601, ks_c-5601-1987, ksx1001, ks_x-1001" +msgstr "euckr, korean, ksc5601, ks_c-5601, ks_c-5601-1987, ksx1001, ks_x-1001" + +#: ../../library/codecs.rst:1223 +msgid "gb2312" +msgstr "gb2312" + +#: ../../library/codecs.rst:1223 +msgid "" +"chinese, csiso58gb231280, euc-cn, euccn, eucgb2312-cn, gb2312-1980, " +"gb2312-80, iso-ir-58" +msgstr "" +"chinese, csiso58gb231280, euc-cn, euccn, eucgb2312-cn, gb2312-1980, " +"gb2312-80, iso-ir-58" + +#: ../../library/codecs.rst:1223 ../../library/codecs.rst:1232 +msgid "Simplified Chinese" +msgstr "简体中文" + +#: ../../library/codecs.rst:1228 +msgid "gbk" +msgstr "gbk" + +#: ../../library/codecs.rst:1228 +msgid "936, cp936, ms936" +msgstr "936, cp936, ms936" + +#: ../../library/codecs.rst:1228 ../../library/codecs.rst:1230 +msgid "Unified Chinese" +msgstr "统一汉语" + +#: ../../library/codecs.rst:1230 +msgid "gb18030" +msgstr "gb18030" + +#: ../../library/codecs.rst:1230 +msgid "gb18030-2000" +msgstr "gb18030-2000" + +#: ../../library/codecs.rst:1232 +msgid "hz" +msgstr "hz" + +#: ../../library/codecs.rst:1232 +msgid "hzgb, hz-gb, hz-gb-2312" +msgstr "hzgb, hz-gb, hz-gb-2312" + +#: ../../library/codecs.rst:1234 +msgid "iso2022_jp" +msgstr "iso2022_jp" + +#: ../../library/codecs.rst:1234 +msgid "csiso2022jp, iso2022jp, iso-2022-jp" +msgstr "csiso2022jp, iso2022jp, iso-2022-jp" + +#: ../../library/codecs.rst:1237 +msgid "iso2022_jp_1" +msgstr "iso2022_jp_1" + +#: ../../library/codecs.rst:1237 +msgid "iso2022jp-1, iso-2022-jp-1" +msgstr "iso2022jp-1, iso-2022-jp-1" + +#: ../../library/codecs.rst:1239 +msgid "iso2022_jp_2" +msgstr "iso2022_jp_2" + +#: ../../library/codecs.rst:1239 +msgid "iso2022jp-2, iso-2022-jp-2" +msgstr "iso2022jp-2, iso-2022-jp-2" + +#: ../../library/codecs.rst:1239 +msgid "Japanese, Korean, Simplified Chinese, Western Europe, Greek" +msgstr "日语,韩语,简体中文,西欧,希腊语" + +#: ../../library/codecs.rst:1242 +msgid "iso2022_jp_2004" +msgstr "iso2022_jp_2004" + +#: ../../library/codecs.rst:1242 +msgid "iso2022jp-2004, iso-2022-jp-2004" +msgstr "iso2022jp-2004, iso-2022-jp-2004" + +#: ../../library/codecs.rst:1245 +msgid "iso2022_jp_3" +msgstr "iso2022_jp_3" + +#: ../../library/codecs.rst:1245 +msgid "iso2022jp-3, iso-2022-jp-3" +msgstr "iso2022jp-3, iso-2022-jp-3" + +#: ../../library/codecs.rst:1247 +msgid "iso2022_jp_ext" +msgstr "iso2022_jp_ext" + +#: ../../library/codecs.rst:1247 +msgid "iso2022jp-ext, iso-2022-jp-ext" +msgstr "iso2022jp-ext, iso-2022-jp-ext" + +#: ../../library/codecs.rst:1249 +msgid "iso2022_kr" +msgstr "iso2022_kr" + +#: ../../library/codecs.rst:1249 +msgid "csiso2022kr, iso2022kr, iso-2022-kr" +msgstr "csiso2022kr, iso2022kr, iso-2022-kr" + +#: ../../library/codecs.rst:1252 +msgid "latin_1" +msgstr "latin_1" + +#: ../../library/codecs.rst:1252 +msgid "iso-8859-1, iso8859-1, 8859, cp819, latin, latin1, L1" +msgstr "iso-8859-1, iso8859-1, 8859, cp819, latin, latin1, L1" + +#: ../../library/codecs.rst:1255 +msgid "iso8859_2" +msgstr "iso8859_2" + +#: ../../library/codecs.rst:1255 +msgid "iso-8859-2, latin2, L2" +msgstr "iso-8859-2, latin2, L2" + +#: ../../library/codecs.rst:1257 +msgid "iso8859_3" +msgstr "iso8859_3" + +#: ../../library/codecs.rst:1257 +msgid "iso-8859-3, latin3, L3" +msgstr "iso-8859-3, latin3, L3" + +#: ../../library/codecs.rst:1257 +msgid "Esperanto, Maltese" +msgstr "世界语,马耳他语" + +#: ../../library/codecs.rst:1259 +msgid "iso8859_4" +msgstr "iso8859_4" + +#: ../../library/codecs.rst:1259 +msgid "iso-8859-4, latin4, L4" +msgstr "iso-8859-4, latin4, L4" + +#: ../../library/codecs.rst:1259 +msgid "Northern Europe" +msgstr "北欧" + +#: ../../library/codecs.rst:1261 +msgid "iso8859_5" +msgstr "iso8859_5" + +#: ../../library/codecs.rst:1261 +msgid "iso-8859-5, cyrillic" +msgstr "iso-8859-5, cyrillic" + +#: ../../library/codecs.rst:1264 +msgid "iso8859_6" +msgstr "iso8859_6" + +#: ../../library/codecs.rst:1264 +msgid "iso-8859-6, arabic" +msgstr "iso-8859-6, arabic" + +#: ../../library/codecs.rst:1266 +msgid "iso8859_7" +msgstr "iso8859_7" + +#: ../../library/codecs.rst:1266 +msgid "iso-8859-7, greek, greek8" +msgstr "iso-8859-7, greek, greek8" + +#: ../../library/codecs.rst:1268 +msgid "iso8859_8" +msgstr "iso8859_8" + +#: ../../library/codecs.rst:1268 +msgid "iso-8859-8, hebrew" +msgstr "iso-8859-8, hebrew" + +#: ../../library/codecs.rst:1270 +msgid "iso8859_9" +msgstr "iso8859_9" + +#: ../../library/codecs.rst:1270 +msgid "iso-8859-9, latin5, L5" +msgstr "iso-8859-9, latin5, L5" + +#: ../../library/codecs.rst:1272 +msgid "iso8859_10" +msgstr "iso8859_10" + +#: ../../library/codecs.rst:1272 +msgid "iso-8859-10, latin6, L6" +msgstr "iso-8859-10, latin6, L6" + +#: ../../library/codecs.rst:1272 +msgid "Nordic languages" +msgstr "北欧语言" + +#: ../../library/codecs.rst:1274 +msgid "iso8859_11" +msgstr "iso8859_11" + +#: ../../library/codecs.rst:1274 +msgid "iso-8859-11, thai" +msgstr "iso-8859-11, thai" + +#: ../../library/codecs.rst:1274 +msgid "Thai languages" +msgstr "泰语" + +#: ../../library/codecs.rst:1276 +msgid "iso8859_13" +msgstr "iso8859_13" + +#: ../../library/codecs.rst:1276 +msgid "iso-8859-13, latin7, L7" +msgstr "iso-8859-13, latin7, L7" + +#: ../../library/codecs.rst:1278 +msgid "iso8859_14" +msgstr "iso8859_14" + +#: ../../library/codecs.rst:1278 +msgid "iso-8859-14, latin8, L8" +msgstr "iso-8859-14, latin8, L8" + +#: ../../library/codecs.rst:1278 +msgid "Celtic languages" +msgstr "凯尔特语" + +#: ../../library/codecs.rst:1280 +msgid "iso8859_15" +msgstr "iso8859_15" + +#: ../../library/codecs.rst:1280 +msgid "iso-8859-15, latin9, L9" +msgstr "iso-8859-15, latin9, L9" + +#: ../../library/codecs.rst:1282 +msgid "iso8859_16" +msgstr "iso8859_16" + +#: ../../library/codecs.rst:1282 +msgid "iso-8859-16, latin10, L10" +msgstr "iso-8859-16, latin10, L10" + +#: ../../library/codecs.rst:1282 +msgid "South-Eastern Europe" +msgstr "东南欧" + +#: ../../library/codecs.rst:1284 +msgid "johab" +msgstr "johab" + +#: ../../library/codecs.rst:1284 +msgid "cp1361, ms1361" +msgstr "cp1361, ms1361" + +#: ../../library/codecs.rst:1286 +msgid "koi8_r" +msgstr "koi8_r" + +#: ../../library/codecs.rst:1288 +msgid "koi8_t" +msgstr "koi8_t" + +#: ../../library/codecs.rst:1288 +msgid "Tajik" +msgstr "塔吉克" + +#: ../../library/codecs.rst:1292 +msgid "koi8_u" +msgstr "koi8_u" + +#: ../../library/codecs.rst:1294 +msgid "kz1048" +msgstr "kz1048" + +#: ../../library/codecs.rst:1294 +msgid "kz_1048, strk1048_2002, rk1048" +msgstr "kz_1048, strk1048_2002, rk1048" + +#: ../../library/codecs.rst:1294 ../../library/codecs.rst:1312 +msgid "Kazakh" +msgstr "哈萨克语" + +#: ../../library/codecs.rst:1298 +msgid "mac_cyrillic" +msgstr "mac_cyrillic" + +#: ../../library/codecs.rst:1298 +msgid "maccyrillic" +msgstr "maccyrillic" + +#: ../../library/codecs.rst:1301 +msgid "mac_greek" +msgstr "mac_greek" + +#: ../../library/codecs.rst:1301 +msgid "macgreek" +msgstr "macgreek" + +#: ../../library/codecs.rst:1303 +msgid "mac_iceland" +msgstr "mac_iceland" + +#: ../../library/codecs.rst:1303 +msgid "maciceland" +msgstr "maciceland" + +#: ../../library/codecs.rst:1305 +msgid "mac_latin2" +msgstr "mac_latin2" + +#: ../../library/codecs.rst:1305 +msgid "maclatin2, maccentraleurope, mac_centeuro" +msgstr "maclatin2, maccentraleurope, mac_centeuro" + +#: ../../library/codecs.rst:1308 +msgid "mac_roman" +msgstr "mac_roman" + +#: ../../library/codecs.rst:1308 +msgid "macroman, macintosh" +msgstr "macroman, macintosh" + +#: ../../library/codecs.rst:1310 +msgid "mac_turkish" +msgstr "mac_turkish" + +#: ../../library/codecs.rst:1310 +msgid "macturkish" +msgstr "macturkish" + +#: ../../library/codecs.rst:1312 +msgid "ptcp154" +msgstr "ptcp154" + +#: ../../library/codecs.rst:1312 +msgid "csptcp154, pt154, cp154, cyrillic-asian" +msgstr "csptcp154, pt154, cp154, cyrillic-asian" + +#: ../../library/codecs.rst:1315 +msgid "shift_jis" +msgstr "shift_jis" + +#: ../../library/codecs.rst:1315 +msgid "csshiftjis, shiftjis, sjis, s_jis" +msgstr "csshiftjis, shiftjis, sjis, s_jis" + +#: ../../library/codecs.rst:1318 +msgid "shift_jis_2004" +msgstr "shift_jis_2004" + +#: ../../library/codecs.rst:1318 +msgid "shiftjis2004, sjis_2004, sjis2004" +msgstr "shiftjis2004, sjis_2004, sjis2004" + +#: ../../library/codecs.rst:1321 +msgid "shift_jisx0213" +msgstr "shift_jisx0213" + +#: ../../library/codecs.rst:1321 +msgid "shiftjisx0213, sjisx0213, s_jisx0213" +msgstr "shiftjisx0213, sjisx0213, s_jisx0213" + +#: ../../library/codecs.rst:1324 +msgid "utf_32" +msgstr "utf_32" + +#: ../../library/codecs.rst:1324 +msgid "U32, utf32" +msgstr "U32, utf32" + +#: ../../library/codecs.rst:1324 ../../library/codecs.rst:1326 +#: ../../library/codecs.rst:1328 ../../library/codecs.rst:1330 +#: ../../library/codecs.rst:1332 ../../library/codecs.rst:1334 +#: ../../library/codecs.rst:1336 ../../library/codecs.rst:1338 +#: ../../library/codecs.rst:1340 +msgid "all languages" +msgstr "所有语言" + +#: ../../library/codecs.rst:1326 +msgid "utf_32_be" +msgstr "utf_32_be" + +#: ../../library/codecs.rst:1326 +msgid "UTF-32BE" +msgstr "UTF-32BE" + +#: ../../library/codecs.rst:1328 +msgid "utf_32_le" +msgstr "utf_32_le" + +#: ../../library/codecs.rst:1328 +msgid "UTF-32LE" +msgstr "UTF-32LE" + +#: ../../library/codecs.rst:1330 +msgid "utf_16" +msgstr "utf_16" + +#: ../../library/codecs.rst:1330 +msgid "U16, utf16" +msgstr "U16, utf16" + +#: ../../library/codecs.rst:1332 +msgid "utf_16_be" +msgstr "utf_16_be" + +#: ../../library/codecs.rst:1332 +msgid "UTF-16BE" +msgstr "UTF-16BE" + +#: ../../library/codecs.rst:1334 +msgid "utf_16_le" +msgstr "utf_16_le" + +#: ../../library/codecs.rst:1334 +msgid "UTF-16LE" +msgstr "UTF-16LE" + +#: ../../library/codecs.rst:1336 +msgid "utf_7" +msgstr "utf_7" + +#: ../../library/codecs.rst:1336 +msgid "U7, unicode-1-1-utf-7" +msgstr "U7, unicode-1-1-utf-7" + +#: ../../library/codecs.rst:1338 +msgid "utf_8" +msgstr "utf_8" + +#: ../../library/codecs.rst:1338 +msgid "U8, UTF, utf8, cp65001" +msgstr "U8, UTF, utf8, cp65001" + +#: ../../library/codecs.rst:1340 +msgid "utf_8_sig" +msgstr "utf_8_sig" + +#: ../../library/codecs.rst:1343 +msgid "" +"The utf-16\\* and utf-32\\* encoders no longer allow surrogate code points " +"(``U+D800``--``U+DFFF``) to be encoded. The utf-32\\* decoders no longer " +"decode byte sequences that correspond to surrogate code points." +msgstr "" +"utf-16\\* 和 utf-32\\* 编码器将不再允许编码代理码位 (``U+D800``--``U+DFFF``)。 utf-32\\* " +"解码器将不再解码与代理码位相对应的字节序列。" + +#: ../../library/codecs.rst:1349 +msgid "``cp65001`` is now an alias to ``utf_8``." +msgstr "``cp65001`` 现在是 ``utf_8`` 的一个别名。" + +#: ../../library/codecs.rst:1352 +msgid "On Windows, ``cpXXX`` codecs are now available for all code pages." +msgstr "在 Windows 系统上,现在所有代码页都可以使用 ``cpXXX`` 编解码器了。" + +#: ../../library/codecs.rst:1357 +msgid "Python Specific Encodings" +msgstr "Python 专属的编码格式" + +#: ../../library/codecs.rst:1359 +msgid "" +"A number of predefined codecs are specific to Python, so their codec names " +"have no meaning outside Python. These are listed in the tables below based " +"on the expected input and output types (note that while text encodings are " +"the most common use case for codecs, the underlying codec infrastructure " +"supports arbitrary data transforms rather than just text encodings). For " +"asymmetric codecs, the stated meaning describes the encoding direction." +msgstr "" +"有一些预定义编解码器是 Python 专属的,因此它们在 Python 之外没有意义。 " +"这些编解码器按其所预期的输入和输出类型在下表中列出(请注意虽然文本编码是编解码器最常见的使用场景,但下层的编解码器架构支持任意数据转换而不仅是文本编码)。" +" 对于非对称编解码器,该列描述的含义是编码方向。" + +#: ../../library/codecs.rst:1367 +msgid "Text Encodings" +msgstr "文字编码" + +#: ../../library/codecs.rst:1369 +msgid "" +"The following codecs provide :class:`str` to :class:`bytes` encoding and " +":term:`bytes-like object` to :class:`str` decoding, similar to the Unicode " +"text encodings." +msgstr "" +"以下编解码器提供了 :class:`str` 到 :class:`bytes` 的编码和 :term:`bytes-like object` 到 " +":class:`str` 的解码,类似于 Unicode 文本编码。" + +#: ../../library/codecs.rst:1378 +msgid "idna" +msgstr "idna" + +#: ../../library/codecs.rst:1378 +msgid "" +"Implement :rfc:`3490`, see also :mod:`encodings.idna`. Only " +"``errors='strict'`` is supported." +msgstr "实现 :rfc:`3490`,另请参阅 :mod:`encodings.idna` 。仅支持 ``errors='strict'`` 。" + +#: ../../library/codecs.rst:1384 +msgid "mbcs" +msgstr "mbcs" + +#: ../../library/codecs.rst:1384 +msgid "ansi, dbcs" +msgstr "ansi, dbcs" + +#: ../../library/codecs.rst:1384 +msgid "" +"Windows only: Encode the operand according to the ANSI codepage (CP_ACP)." +msgstr "Windows 专属:根据 ANSI 代码页(CP_ACP)对操作数进行编码。" + +#: ../../library/codecs.rst:1388 +msgid "oem" +msgstr "oem" + +#: ../../library/codecs.rst:1388 +msgid "" +"Windows only: Encode the operand according to the OEM codepage (CP_OEMCP)." +msgstr "Windows 专属:根据 OEM 代码页(CP_OEMCP)对操作数进行编码。" + +#: ../../library/codecs.rst:1394 +msgid "palmos" +msgstr "palmos" + +#: ../../library/codecs.rst:1394 +msgid "Encoding of PalmOS 3.5." +msgstr "PalmOS 3.5 的编码格式" + +#: ../../library/codecs.rst:1396 +msgid "punycode" +msgstr "punycode" + +#: ../../library/codecs.rst:1396 +msgid "Implement :rfc:`3492`. Stateful codecs are not supported." +msgstr "实现 :rfc:`3492`。 不支持有状态编解码器。" + +#: ../../library/codecs.rst:1400 +msgid "raw_unicode_escape" +msgstr "raw_unicode_escape" + +#: ../../library/codecs.rst:1400 +msgid "" +"Latin-1 encoding with :samp:`\\\\u{XXXX}` and :samp:`\\\\U{XXXXXXXX}` for " +"other code points. Existing backslashes are not escaped in any way. It is " +"used in the Python pickle protocol." +msgstr "" +"Latin-1 编码格式附带对其他码位以 :samp:`\\\\u{XXXX}` 和 :samp:`\\\\U{XXXXXXXX}` 进行编码。 " +"现有的反斜杠不会以任何方式转义。 它被用于 Python 的 pickle 协议。" + +#: ../../library/codecs.rst:1410 +msgid "undefined" +msgstr "undefined" + +#: ../../library/codecs.rst:1410 +msgid "This Codec should only be used for testing purposes." +msgstr "该编解码器应当仅用于测试目的。" + +#: ../../library/codecs.rst:1414 +msgid "" +"Raise an exception for all conversions, even empty strings. The error " +"handler is ignored." +msgstr "所有转换都将引发异常,甚至对空字符串也不例外。 错误处理方案会被忽略。" + +#: ../../library/codecs.rst:1419 +msgid "unicode_escape" +msgstr "unicode_escape" + +#: ../../library/codecs.rst:1419 +msgid "" +"Encoding suitable as the contents of a Unicode literal in ASCII-encoded " +"Python source code, except that quotes are not escaped. Decode from Latin-1 " +"source code. Beware that Python source code actually uses UTF-8 by default." +msgstr "" +"适合用于以 ASCII 编码的 Python 源代码中的 Unicode 字面值内容的编码格式,但引号不会被转义。 对 Latin-1 源代码进行解码。" +" 请注意 Python 源代码实际上默认使用 UTF-8。" + +#: ../../library/codecs.rst:1431 +msgid "\"unicode_internal\" codec is removed." +msgstr "\"unicode_internal\" 编解码器已被移除。" + +#: ../../library/codecs.rst:1438 +msgid "Binary Transforms" +msgstr "二进制转换" + +#: ../../library/codecs.rst:1440 +msgid "" +"The following codecs provide binary transforms: :term:`bytes-like object` to" +" :class:`bytes` mappings. They are not supported by :meth:`bytes.decode` " +"(which only produces :class:`str` output)." +msgstr "" +"以下编解码器提供了二进制转换: :term:`bytes-like object` 到 :class:`bytes` 的映射。 它们不被 " +":meth:`bytes.decode` 所支持(该方法只生成 :class:`str` 类型的输出)。" + +#: ../../library/codecs.rst:1448 +msgid "Encoder / decoder" +msgstr "编码器/解码器" + +#: ../../library/codecs.rst:1450 +msgid "base64_codec [#b64]_" +msgstr "base64_codec [#b64]_" + +#: ../../library/codecs.rst:1450 +msgid "base64, base_64" +msgstr "base64, base_64" + +#: ../../library/codecs.rst:1450 +msgid "" +"Convert the operand to multiline MIME base64 (the result always includes a " +"trailing ``'\\n'``)." +msgstr "将操作数转换为多行 MIME base64 (结果总是包含一个末尾的 ``'\\n'``)" + +#: ../../library/codecs.rst:1455 +msgid "" +"accepts any :term:`bytes-like object` as input for encoding and decoding" +msgstr "接受任意 :term:`bytes-like object` 作为输入用于编码和解码" + +#: ../../library/codecs.rst:1450 +msgid ":meth:`base64.encodebytes` / :meth:`base64.decodebytes`" +msgstr ":meth:`base64.encodebytes` / :meth:`base64.decodebytes`" + +#: ../../library/codecs.rst:1461 +msgid "bz2_codec" +msgstr "bz2_codec" + +#: ../../library/codecs.rst:1461 +msgid "bz2" +msgstr "bz2" + +#: ../../library/codecs.rst:1461 +msgid "Compress the operand using bz2." +msgstr "使用bz2压缩操作数" + +#: ../../library/codecs.rst:1461 +msgid ":meth:`bz2.compress` / :meth:`bz2.decompress`" +msgstr ":meth:`bz2.compress` / :meth:`bz2.decompress`" + +#: ../../library/codecs.rst:1464 +msgid "hex_codec" +msgstr "hex_codec" + +#: ../../library/codecs.rst:1464 +msgid "hex" +msgstr "hex" + +#: ../../library/codecs.rst:1464 +msgid "" +"Convert the operand to hexadecimal representation, with two digits per byte." +msgstr "将操作数转换为十六进制表示,每个字节有两位数" + +#: ../../library/codecs.rst:1464 +msgid ":meth:`binascii.b2a_hex` / :meth:`binascii.a2b_hex`" +msgstr ":meth:`binascii.b2a_hex` / :meth:`binascii.a2b_hex`" + +#: ../../library/codecs.rst:1469 +msgid "quopri_codec" +msgstr "quopri_codec" + +#: ../../library/codecs.rst:1469 +msgid "quopri, quotedprintable, quoted_printable" +msgstr "quopri, quotedprintable, quoted_printable" + +#: ../../library/codecs.rst:1469 +msgid "Convert the operand to MIME quoted printable." +msgstr "将操作数转换为 MIME 带引号的可打印数据" + +#: ../../library/codecs.rst:1469 +msgid ":meth:`quopri.encode` with ``quotetabs=True`` / :meth:`quopri.decode`" +msgstr ":meth:`quopri.encode` 且 ``quotetabs=True`` / :meth:`quopri.decode`" + +#: ../../library/codecs.rst:1473 +msgid "uu_codec" +msgstr "uu_codec" + +#: ../../library/codecs.rst:1473 +msgid "uu" +msgstr "uu" + +#: ../../library/codecs.rst:1473 +msgid "Convert the operand using uuencode." +msgstr "使用uuencode转换操作数" + +#: ../../library/codecs.rst:1476 +msgid "zlib_codec" +msgstr "zlib_codec" + +#: ../../library/codecs.rst:1476 +msgid "zip, zlib" +msgstr "zip, zlib" + +#: ../../library/codecs.rst:1476 +msgid "Compress the operand using gzip." +msgstr "使用gzip压缩操作数" + +#: ../../library/codecs.rst:1476 +msgid ":meth:`zlib.compress` / :meth:`zlib.decompress`" +msgstr ":meth:`zlib.compress` / :meth:`zlib.decompress`" + +#: ../../library/codecs.rst:1480 +msgid "" +"In addition to :term:`bytes-like objects `, " +"``'base64_codec'`` also accepts ASCII-only instances of :class:`str` for " +"decoding" +msgstr "" +"除了 :term:`字节类对象 `,``'base64_codec'`` 也接受仅包含 ASCII 的 " +":class:`str` 实例用于解码" + +#: ../../library/codecs.rst:1484 +msgid "Restoration of the binary transforms." +msgstr "恢复二进制转换。" + +#: ../../library/codecs.rst:1487 +msgid "Restoration of the aliases for the binary transforms." +msgstr "恢复二进制转换的别名。" + +#: ../../library/codecs.rst:1494 +msgid "Standalone Codec Functions" +msgstr "独立编解码器函数" + +#: ../../library/codecs.rst:1496 +msgid "" +"The following functions provide encoding and decoding functionality similar " +"to codecs, but are not available as named codecs through " +":func:`codecs.encode` or :func:`codecs.decode`. They are used internally " +"(for example, by :mod:`pickle`) and behave similarly to the " +"``string_escape`` codec that was removed in Python 3." +msgstr "" +"下列函数提供了与编解码器类似的编码和解码功能,但并不能通过 :func:`codecs.encode` 或 :func:`codecs.decode` " +"作为已命名的编解码器使用。 它们仅供内部使用(例如,由 :mod:`pickle` 使用)且其行为类似于已在 Python 3 中被移除的 " +"``string_escape`` 编解码器。" + +#: ../../library/codecs.rst:1503 +msgid "" +"Encode *input* using escape sequences. Similar to how :func:`repr` on bytes " +"produces escaped byte values." +msgstr "使用转义序列对 *input* 进行编码。 类似于字节串上的 :func:`repr` 产生转义后的字节值。" + +#: ../../library/codecs.rst:1506 +msgid "*input* must be a :class:`bytes` object." +msgstr "*input* 必须是一个 :class:`bytes` 对象。" + +#: ../../library/codecs.rst:1508 ../../library/codecs.rst:1517 +msgid "" +"Returns a tuple ``(output, length)`` where *output* is a :class:`bytes` " +"object and *length* is the number of bytes consumed." +msgstr "" +"返回一个元组 ``(output, length)`` 其中 *output* 为 :class:`bytes` 对象而 *length* " +"为消耗的字节数。" + +#: ../../library/codecs.rst:1513 +msgid "Decode *input* from escape sequences back to the original bytes." +msgstr "将 *input* 从转义序列解码回原始字节串。" + +#: ../../library/codecs.rst:1515 +msgid "*input* must be a :term:`bytes-like object`." +msgstr "*input* 必须是一个 :term:`bytes-like object`。" + +#: ../../library/codecs.rst:1524 +msgid "Text Transforms" +msgstr "文字转换" + +#: ../../library/codecs.rst:1526 +msgid "" +"The following codec provides a text transform: a :class:`str` to " +":class:`str` mapping. It is not supported by :meth:`str.encode` (which only " +"produces :class:`bytes` output)." +msgstr "" +"以下编解码器提供了文本转换: :class:`str` 到 :class:`str` 的映射。 它不被 :meth:`str.encode` " +"所支持(该方法只生成 :class:`bytes` 类型的输出)。" + +#: ../../library/codecs.rst:1535 +msgid "rot_13" +msgstr "rot_13" + +#: ../../library/codecs.rst:1535 +msgid "rot13" +msgstr "rot13" + +#: ../../library/codecs.rst:1535 +msgid "Return the Caesar-cypher encryption of the operand." +msgstr "返回操作数的凯撒密码加密结果" + +#: ../../library/codecs.rst:1540 +msgid "Restoration of the ``rot_13`` text transform." +msgstr "恢复 ``rot_13`` 文本转换。" + +#: ../../library/codecs.rst:1543 +msgid "Restoration of the ``rot13`` alias." +msgstr "恢复 ``rot13`` 别名。" + +#: ../../library/codecs.rst:1548 +msgid ":mod:`!encodings` --- Encodings package" +msgstr "" + +#: ../../library/codecs.rst:1553 +msgid "This module implements the following functions:" +msgstr "这个模块实现了以下函数:" + +#: ../../library/codecs.rst:1557 +msgid "Normalize encoding name *encoding*." +msgstr "规范化编码格式名称 *encoding*。" + +#: ../../library/codecs.rst:1559 +msgid "" +"Normalization works as follows: all non-alphanumeric characters except the " +"dot used for Python package names are collapsed and replaced with a single " +"underscore, leading and trailing underscores are removed. For example, ``' " +"-;#'`` becomes ``'_'``." +msgstr "" +"规范化的运作方式如下:用于 Python 包名称的点号除外的所有非字母数字类字符都会被缩减替换为一个下划线,开头和末尾的下划线将被移除。 例如,``' " +"-;#'`` 将变为 ``'_'``。" + +#: ../../library/codecs.rst:1564 +msgid "Note that *encoding* should be ASCII only." +msgstr "请注意 *encoding* 应当仅用 ASCII 字符。" + +#: ../../library/codecs.rst:1568 +msgid "" +"The following functions should not be used directly, except for testing " +"purposes; :func:`codecs.lookup` should be used instead." +msgstr "以下函数不应被直接使用,除非出于测试目的;应当改用 :func:`codecs.lookup`。" + +#: ../../library/codecs.rst:1574 +msgid "" +"Search for the codec module corresponding to the given encoding name " +"*encoding*." +msgstr "搜索与给定的编码格式名称 *encoding* 相对应的编解码器模块。" + +#: ../../library/codecs.rst:1577 +msgid "" +"This function first normalizes the *encoding* using " +":func:`normalize_encoding`, then looks for a corresponding alias. It " +"attempts to import a codec module from the encodings package using either " +"the alias or the normalized name. If the module is found and defines a valid" +" ``getregentry()`` function that returns a :class:`codecs.CodecInfo` object," +" the codec is cached and returned." +msgstr "" +"此函数首先会使用 :func:`normalize_encoding` 来规范化 *encoding*,然后查找相应的别名。 " +"它会尝试使用别名或规范化的名称从 encodings 包导入一个编解码器模块。 如果模块被找到并且它定义了有效的返回 " +":class:`codecs.CodecInfo` 对象的 ``getregentry()`` 函数,该编解码器将被缓存并被返回。" + +#: ../../library/codecs.rst:1584 +msgid "" +"If the codec module defines a ``getaliases()`` function any returned aliases" +" are registered for future use." +msgstr "如果该编解码器模块定义了 ``getaliases()`` 函数则任何被返回的别名都将被注册以供将来使用。" + +#: ../../library/codecs.rst:1590 +msgid "" +"Search for a Windows code page encoding *encoding* of the form ``cpXXXX``." +msgstr "搜索形式为 ``cpXXXX`` 的 Windows 代码页编码格式 *encoding*。" + +#: ../../library/codecs.rst:1592 +msgid "" +"If the code page is valid and supported, return a :class:`codecs.CodecInfo` " +"object for it." +msgstr "如果代码页有效且受到支持,则返回与它对应的 :class:`codecs.CodecInfo` 对象。" + +#: ../../library/codecs.rst:1595 ../../library/codecs.rst:1681 +msgid "Availability" +msgstr "Availability" + +#: ../../library/codecs.rst:1600 +msgid "This module implements the following exception:" +msgstr "这个模块实现了以下异常:" + +#: ../../library/codecs.rst:1604 +msgid "Raised when a codec is invalid or incompatible." +msgstr "当一个编解码器无效或不兼容时引发。" + +#: ../../library/codecs.rst:1608 +msgid "" +":mod:`!encodings.idna` --- Internationalized Domain Names in Applications" +msgstr "" + +#: ../../library/codecs.rst:1614 +msgid "" +"This module implements :rfc:`3490` (Internationalized Domain Names in " +"Applications) and :rfc:`3492` (Nameprep: A Stringprep Profile for " +"Internationalized Domain Names (IDN)). It builds upon the ``punycode`` " +"encoding and :mod:`stringprep`." +msgstr "" +"此模块实现了 :rfc:`3490` (应用程序中的国际化域名) 和 :rfc:`3492` (Nameprep: 用于国际化域名 (IDN) 的 " +"Stringprep 配置文件)。 它是在 ``punycode`` 编码格式和 :mod:`stringprep` 的基础上构建的。" + +#: ../../library/codecs.rst:1619 +msgid "" +"If you need the IDNA 2008 standard from :rfc:`5891` and :rfc:`5895`, use the" +" third-party :pypi:`idna` module." +msgstr "" +"如果你需要来自 :rfc:`5891` 和 :rfc:`5895` 的 IDNA 2008 标准,请使用第三方的 :pypi:`idna` 模块。" + +#: ../../library/codecs.rst:1622 +msgid "" +"These RFCs together define a protocol to support non-ASCII characters in " +"domain names. A domain name containing non-ASCII characters (such as " +"``www.Alliancefrançaise.nu``) is converted into an ASCII-compatible encoding" +" (ACE, such as ``www.xn--alliancefranaise-npb.nu``). The ACE form of the " +"domain name is then used in all places where arbitrary characters are not " +"allowed by the protocol, such as DNS queries, HTTP :mailheader:`Host` " +"fields, and so on. This conversion is carried out in the application; if " +"possible invisible to the user: The application should transparently convert" +" Unicode domain labels to IDNA on the wire, and convert back ACE labels to " +"Unicode before presenting them to the user." +msgstr "" +"这些 RFC 共同定义了一个在域名中支持非 ASCII 字符的协议。 一个包含非 ASCII 字符的域名 (例如 " +"``www.Alliancefrançaise.nu``) 会被转换为兼容 ASCII 的编码格式 (简称 ACE,例如 ``www.xn--" +"alliancefranaise-npb.nu``)。 随后此域名的 ACE 形式可以用于所有由于特定协议而不允许使用任意字符的场合,例如 DNS " +"查询,HTTP :mailheader:`Host` 字段等等。 此转换是在应用中进行的;如有可能将对用户不可见:应用应当透明地将 Unicode " +"域名标签转换为线上的 IDNA,并在 ACE 标签被呈现给用户之前将其转换回 Unicode。" + +#: ../../library/codecs.rst:1633 +msgid "" +"Python supports this conversion in several ways: the ``idna`` codec " +"performs conversion between Unicode and ACE, separating an input string into" +" labels based on the separator characters defined in :rfc:`section 3.1 of " +"RFC 3490 <3490#section-3.1>` and converting each label to ACE as required, " +"and conversely separating an input byte string into labels based on the " +"``.`` separator and converting any ACE labels found into unicode. " +"Furthermore, the :mod:`socket` module transparently converts Unicode host " +"names to ACE, so that applications need not be concerned about converting " +"host names themselves when they pass them to the socket module. On top of " +"that, modules that have host names as function parameters, such as " +":mod:`http.client` and :mod:`ftplib`, accept Unicode host names " +"(:mod:`http.client` then also transparently sends an IDNA hostname in the " +":mailheader:`Host` field if it sends that field at all)." +msgstr "" +"Python 以多种方式支持这种转换: ``idna`` 编解码器执行 Unicode 和 ACE 之间的转换,基于在 :rfc:`section " +"3.1 of RFC 3490 <3490#section-3.1>` 中定义的分隔字符将输入字符串拆分为标签,再根据需要将每个标签转换为 " +"ACE,相反地又会基于 ``.`` 分隔符将输入字节串拆分为标签,再将找到的任何 ACE 标签转换为 Unicode。 此外,:mod:`socket`" +" 模块可透明地将 Unicode 主机名转换为 ACE,以便应用在将它们传给 socket 模块时无须自行转换主机名。 " +"除此之外,许多包含以主机名作为函数参数的模块例如 :mod:`http.client` 和 :mod:`ftplib` 都接受 Unicode " +"主机名(并且 :mod:`http.client` 也会在 :mailheader:`Host` 字段中透明地发送 IDNA " +"主机名,如果它需要发送该字段的话)。" + +#: ../../library/codecs.rst:1646 +msgid "" +"When receiving host names from the wire (such as in reverse name lookup), no" +" automatic conversion to Unicode is performed: applications wishing to " +"present such host names to the user should decode them to Unicode." +msgstr "" +"当从线路接收主机名时(例如反向名称查找),到 Unicode 的转换不会自动被执行:希望向用户提供此种主机名的应用应当将它们解码为 Unicode。" + +#: ../../library/codecs.rst:1650 +msgid "" +"The module :mod:`!encodings.idna` also implements the nameprep procedure, " +"which performs certain normalizations on host names, to achieve case-" +"insensitivity of international domain names, and to unify similar " +"characters. The nameprep functions can be used directly if desired." +msgstr "" + +#: ../../library/codecs.rst:1658 +msgid "" +"Return the nameprepped version of *label*. The implementation currently " +"assumes query strings, so ``AllowUnassigned`` is true." +msgstr "返回 *label* 经过名称处理操作的版本。 该实现目前基于查询字符串,因此 ``AllowUnassigned`` 为真值。" + +#: ../../library/codecs.rst:1664 +msgid "" +"Convert a label to ASCII, as specified in :rfc:`3490`. ``UseSTD3ASCIIRules``" +" is assumed to be false." +msgstr "将标签转换为 ASCII,规则定义见 :rfc:`3490`。 ``UseSTD3ASCIIRules`` 预设为假值。" + +#: ../../library/codecs.rst:1670 +msgid "Convert a label to Unicode, as specified in :rfc:`3490`." +msgstr "将标签转换为 Unicode,规则定义见 :rfc:`3490`。" + +#: ../../library/codecs.rst:1674 +msgid ":mod:`!encodings.mbcs` --- Windows ANSI codepage" +msgstr "" + +#: ../../library/codecs.rst:1679 +msgid "This module implements the ANSI codepage (CP_ACP)." +msgstr "此模块实现ANSI代码页(CP_ACP)。" + +#: ../../library/codecs.rst:1683 +msgid "" +"Before 3.2, the *errors* argument was ignored; ``'replace'`` was always used" +" to encode, and ``'ignore'`` to decode." +msgstr "" +"在 3.2 版之前, *errors* 参数会被忽略;总是会使用 ``'replace'`` 进行编码,并使用 ``'ignore'`` 进行解码。" + +#: ../../library/codecs.rst:1687 +msgid "Support any error handler." +msgstr "支持任何错误处理" + +#: ../../library/codecs.rst:1692 +msgid ":mod:`!encodings.utf_8_sig` --- UTF-8 codec with BOM signature" +msgstr ":mod:`!encodings.utf_8_sig` --- 带 BOM 签名的 UTF-8 编解码器" + +#: ../../library/codecs.rst:1698 +msgid "" +"This module implements a variant of the UTF-8 codec. On encoding, a UTF-8 " +"encoded BOM will be prepended to the UTF-8 encoded bytes. For the stateful " +"encoder this is only done once (on the first write to the byte stream). On " +"decoding, an optional UTF-8 encoded BOM at the start of the data will be " +"skipped." +msgstr "" +"此模块实现了 UTF-8 编解码器的一个变种:在编码时将把 UTF-8 已编码 BOM 添加到 UTF-8 编码字节数据的开头。 " +"对于有状态编码器此操作只执行一次(当首次写入字节流时)。 在解码时将跳过数据开头作为可选项的 UTF-8 已编码 BOM。" + +#: ../../library/codecs.rst:13 +msgid "Unicode" +msgstr "Unicode" + +#: ../../library/codecs.rst:13 +msgid "encode" +msgstr "encode" + +#: ../../library/codecs.rst:13 +msgid "decode" +msgstr "decode" + +#: ../../library/codecs.rst:13 +msgid "streams" +msgstr "streams" + +#: ../../library/codecs.rst:13 +msgid "stackable" +msgstr "stackable" + +#: ../../library/codecs.rst:338 +msgid "strict" +msgstr "strict" + +#: ../../library/codecs.rst:338 ../../library/codecs.rst:390 +#: ../../library/codecs.rst:413 +msgid "error handler's name" +msgstr "错误处理器名称" + +#: ../../library/codecs.rst:338 +msgid "ignore" +msgstr "ignore" + +#: ../../library/codecs.rst:338 +msgid "replace" +msgstr "replace" + +#: ../../library/codecs.rst:338 +msgid "backslashreplace" +msgstr "backslashreplace" + +#: ../../library/codecs.rst:338 +msgid "surrogateescape" +msgstr "surrogateescape" + +#: ../../library/codecs.rst:338 +msgid "? (question mark)" +msgstr "? (问号)" + +#: ../../library/codecs.rst:338 +msgid "replacement character" +msgstr "替代字符" + +#: ../../library/codecs.rst:338 +msgid "\\ (backslash)" +msgstr "\\ (反斜杠)" + +#: ../../library/codecs.rst:338 ../../library/codecs.rst:390 +msgid "escape sequence" +msgstr "转义序列" + +#: ../../library/codecs.rst:338 +msgid "\\x" +msgstr "\\x" + +#: ../../library/codecs.rst:338 +msgid "\\u" +msgstr "\\u" + +#: ../../library/codecs.rst:338 +msgid "\\U" +msgstr "\\U" + +#: ../../library/codecs.rst:390 +msgid "xmlcharrefreplace" +msgstr "xmlcharrefreplace" + +#: ../../library/codecs.rst:390 +msgid "namereplace" +msgstr "namereplace" + +#: ../../library/codecs.rst:413 +msgid "surrogatepass" +msgstr "surrogatepass" diff --git a/library/codeop.po b/library/codeop.po new file mode 100644 index 0000000000..1afe17869a --- /dev/null +++ b/library/codeop.po @@ -0,0 +1,132 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/codeop.rst:2 +msgid ":mod:`!codeop` --- Compile Python code" +msgstr ":mod:`!codeop` --- 编译 Python 代码" + +#: ../../library/codeop.rst:10 +msgid "**Source code:** :source:`Lib/codeop.py`" +msgstr "**源代码:** :source:`Lib/codeop.py`" + +#: ../../library/codeop.rst:14 +msgid "" +"The :mod:`!codeop` module provides utilities upon which the Python read-" +"eval-print loop can be emulated, as is done in the :mod:`code` module. As a" +" result, you probably don't want to use the module directly; if you want to " +"include such a loop in your program you probably want to use the :mod:`code`" +" module instead." +msgstr "" +":mod:`!codeop` 模块提供了可以模拟Python读取-执行-打印循环的实用程序,就像在 :mod:`code` 模块中所做的一样。 " +"因此,你可能不会想要直接使用该模块;如果你想在程序中包含这样的循环,你可能需要改用 :mod:`code` 模块。" + +#: ../../library/codeop.rst:20 +msgid "There are two parts to this job:" +msgstr "这个任务有两个部分:" + +#: ../../library/codeop.rst:22 +msgid "" +"Being able to tell if a line of input completes a Python statement: in " +"short, telling whether to print '``>>>``' or '``...``' next." +msgstr "能够判断一行输入是否完成了一条 Python 语句:简而言之,就是告诉我们接下来是要打印 '``>>>``' 还是 '``...``'。" + +#: ../../library/codeop.rst:25 +msgid "" +"Remembering which future statements the user has entered, so subsequent " +"input can be compiled with these in effect." +msgstr "记住用户已输入了哪些 future 语句,这样后续的输入可以在这些语句生效的状态下被编译。" + +#: ../../library/codeop.rst:28 +msgid "" +"The :mod:`!codeop` module provides a way of doing each of these things, and " +"a way of doing them both." +msgstr ":mod:`!codeop` 模块提供了分别执行这两部分之一的方式,还有同时执行这两个部分的方式。" + +#: ../../library/codeop.rst:31 +msgid "To do just the former:" +msgstr "只执行前一部分:" + +#: ../../library/codeop.rst:35 +msgid "" +"Tries to compile *source*, which should be a string of Python code and " +"return a code object if *source* is valid Python code. In that case, the " +"filename attribute of the code object will be *filename*, which defaults to " +"``''``. Returns ``None`` if *source* is *not* valid Python code, but" +" is a prefix of valid Python code." +msgstr "" +"尝试编译 *source*,这应当是一个 Python 代码字符串,并且在 *source* 是有效的 Python 代码时返回一个代码对象。 " +"在此情况下,代码对象的 filename 属性将为 *filename*,其默认值为 ``''``。 如果 *source* 不是有效的 " +"Python 代码,而是有效的 Python 代码的一个前缀时将返回 ``None``。" + +#: ../../library/codeop.rst:41 +msgid "" +"If there is a problem with *source*, an exception will be raised. " +":exc:`SyntaxError` is raised if there is invalid Python syntax, and " +":exc:`OverflowError` or :exc:`ValueError` if there is an invalid literal." +msgstr "" +"如果 *source* 存在问题,将引发异常。 如果存在无效的 Python 语法将引发 " +":exc:`SyntaxError`,而如果存在无效的字面值则将引发 :exc:`OverflowError` 或 :exc:`ValueError`。" + +#: ../../library/codeop.rst:45 +msgid "" +"The *symbol* argument determines whether *source* is compiled as a statement" +" (``'single'``, the default), as a sequence of :term:`statement` " +"(``'exec'``) or as an :term:`expression` (``'eval'``). Any other value will" +" cause :exc:`ValueError` to be raised." +msgstr "" +"*symbol* 参数确定 *source* 是作为一条语句 (``'single'``,为默认值),作为一个 :term:`statement` " +"的序列 (``'exec'``) 还是作为一个 :term:`expression` (``'eval'``) 来进行编译。 任何其他值都将导致引发 " +":exc:`ValueError`。" + +#: ../../library/codeop.rst:52 +msgid "" +"It is possible (but not likely) that the parser stops parsing with a " +"successful outcome before reaching the end of the source; in this case, " +"trailing symbols may be ignored instead of causing an error. For example, a" +" backslash followed by two newlines may be followed by arbitrary garbage. " +"This will be fixed once the API for the parser is better." +msgstr "" +"解析器有可能(但很不常见)会在到达源码结尾之前停止解析并成功输出结果;在这种情况下,末尾的符号可能会被忽略而不是引发错误。 " +"例如,一个反斜杠加两个换行符之后可以跟随任何无意义的符号。 一旦解析器 API 得到改进将修正这个问题。" + +#: ../../library/codeop.rst:61 +msgid "" +"Instances of this class have :meth:`~object.__call__` methods identical in " +"signature to the built-in function :func:`compile`, but with the difference " +"that if the instance compiles program text containing a :mod:`__future__` " +"statement, the instance 'remembers' and compiles all subsequent program " +"texts with the statement in force." +msgstr "" +"该类的实例具有 :meth:`~object.__call__` 方法,其签名与内置函数 :func:`compile` " +"相似,区别在于如果该实例编译了包含 :mod:`__future__` 语句的程序文本,则该实例会'记住'并在后续所有程序文本的编译中使该语句保持生效。" + +#: ../../library/codeop.rst:70 +msgid "" +"Instances of this class have :meth:`~object.__call__` methods identical in " +"signature to :func:`compile_command`; the difference is that if the instance" +" compiles program text containing a :mod:`__future__` statement, the " +"instance 'remembers' and compiles all subsequent program texts with the " +"statement in force." +msgstr "" +"该类的实例具有 :meth:`~object.__call__` 方法,其签名与 :func:`compile_command` " +"相似;区别在于如果该实例编译了包含 :mod:`__future__` 语句的程序文本,则该实例会'记住'并在后续所有程序文本的编译中使该语句保持生效。" diff --git a/library/collections.abc.po b/library/collections.abc.po new file mode 100644 index 0000000000..221a2f98b7 --- /dev/null +++ b/library/collections.abc.po @@ -0,0 +1,947 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-06-09 17:19+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/collections.abc.rst:2 +msgid ":mod:`!collections.abc` --- Abstract Base Classes for Containers" +msgstr ":mod:`!collections.abc` --- 容器的抽象基类" + +#: ../../library/collections.abc.rst:10 +msgid "Formerly, this module was part of the :mod:`collections` module." +msgstr "该模块曾是 :mod:`collections` 模块的组成部分。" + +#: ../../library/collections.abc.rst:13 +msgid "**Source code:** :source:`Lib/_collections_abc.py`" +msgstr "**源代码:** :source:`Lib/_collections_abc.py`" + +#: ../../library/collections.abc.rst:23 +msgid "" +"This module provides :term:`abstract base classes ` " +"that can be used to test whether a class provides a particular interface; " +"for example, whether it is :term:`hashable` or whether it is a " +":term:`mapping`." +msgstr "" +"本模块提供了一些 :term:`抽象基类 `,它们可被用于测试一个类是否提供某个特定的接口;例如,它是否为 " +":term:`hashable` 或是否为 :term:`mapping` 等。" + +#: ../../library/collections.abc.rst:27 +msgid "" +"An :func:`issubclass` or :func:`isinstance` test for an interface works in " +"one of three ways." +msgstr "一个接口的 :func:`issubclass` 或 :func:`isinstance` 测试采用以下三种方式之一。" + +#: ../../library/collections.abc.rst:30 +msgid "" +"A newly written class can inherit directly from one of the abstract base " +"classes. The class must supply the required abstract methods. The " +"remaining mixin methods come from inheritance and can be overridden if " +"desired. Other methods may be added as needed:" +msgstr "新编写的类可以直接继承自某个抽象基类。 该类必须提供所需的抽象方法。 其余混入方法来自于继承并且可在需要时被重写。 其他方法可按需添加:" + +#: ../../library/collections.abc.rst:35 +msgid "" +"class C(Sequence): # Direct inheritance\n" +" def __init__(self): ... # Extra method not required by the ABC\n" +" def __getitem__(self, index): ... # Required abstract method\n" +" def __len__(self): ... # Required abstract method\n" +" def count(self, value): ... # Optionally override a mixin method" +msgstr "" +"class C(Sequence): # 直接继承\n" +" def __init__(self): ... # ABC 所不需要的额外方法\n" +" def __getitem__(self, index): ... # 需要的抽象方法\n" +" def __len__(self): ... # 需要的抽象方法\n" +" def count(self, value): ... # 可选覆盖一个混入方法" + +#: ../../library/collections.abc.rst:43 +msgid "" +">>> issubclass(C, Sequence)\n" +"True\n" +">>> isinstance(C(), Sequence)\n" +"True" +msgstr "" +">>> issubclass(C, Sequence)\n" +"True\n" +">>> isinstance(C(), Sequence)\n" +"True" + +#: ../../library/collections.abc.rst:50 +msgid "" +"Existing classes and built-in classes can be registered as \"virtual " +"subclasses\" of the ABCs. Those classes should define the full API " +"including all of the abstract methods and all of the mixin methods. This " +"lets users rely on :func:`issubclass` or :func:`isinstance` tests to " +"determine whether the full interface is supported. The exception to this " +"rule is for methods that are automatically inferred from the rest of the " +"API:" +msgstr "" +"已有的类和内置类可被注册为 ABC 的\"虚拟子类\"。 这些类应当定义完整的 API 包括所有抽象方法和所有混入方法。 这使得用户能依靠 " +":func:`issubclass` 或 :func:`isinstance` 测试来确定完整接口是否受到支持。 此规则的例外情况是那些从 API " +"的其他部分自动推断出来的方法:" + +#: ../../library/collections.abc.rst:58 +msgid "" +"class D: # No inheritance\n" +" def __init__(self): ... # Extra method not required by the ABC\n" +" def __getitem__(self, index): ... # Abstract method\n" +" def __len__(self): ... # Abstract method\n" +" def count(self, value): ... # Mixin method\n" +" def index(self, value): ... # Mixin method\n" +"\n" +"Sequence.register(D) # Register instead of inherit" +msgstr "" +"class D: # 无继承\n" +" def __init__(self): ... # ABC 所不需要的额外方法\n" +" def __getitem__(self, index): ... # 抽象方法\n" +" def __len__(self): ... # 抽象方法\n" +" def count(self, value): ... # 混入方法\n" +" def index(self, value): ... # 混入方法\n" +"\n" +"Sequence.register(D) # 注册而非继承" + +#: ../../library/collections.abc.rst:69 +msgid "" +">>> issubclass(D, Sequence)\n" +"True\n" +">>> isinstance(D(), Sequence)\n" +"True" +msgstr "" +">>> issubclass(D, Sequence)\n" +"True\n" +">>> isinstance(D(), Sequence)\n" +"True" + +#: ../../library/collections.abc.rst:76 +msgid "" +"In this example, class :class:`!D` does not need to define ``__contains__``," +" ``__iter__``, and ``__reversed__`` because the :ref:`in-operator " +"`, the :term:`iteration ` logic, and the " +":func:`reversed` function automatically fall back to using ``__getitem__`` " +"and ``__len__``." +msgstr "" +"在这个例子中,:class:`!D` 类不需要定义 ``__contains__``, ``__iter__`` 和 " +"``__reversed__``,因为 :ref:`in 运算符 `, :term:`迭代 ` 逻辑和 " +":func:`reversed` 函数会自动回退为使用 ``__getitem__`` 和 ``__len__``。" + +#: ../../library/collections.abc.rst:82 +msgid "" +"Some simple interfaces are directly recognizable by the presence of the " +"required methods (unless those methods have been set to :const:`None`):" +msgstr "某些简单接口可以根据所需方法是否存在来直接识别 (除非这些方法已被设置为 :const:`None`):" + +#: ../../library/collections.abc.rst:85 +msgid "" +"class E:\n" +" def __iter__(self): ...\n" +" def __next__(self): ..." +msgstr "" +"class E:\n" +" def __iter__(self): ...\n" +" def __next__(self): ..." + +#: ../../library/collections.abc.rst:91 +msgid "" +">>> issubclass(E, Iterable)\n" +"True\n" +">>> isinstance(E(), Iterable)\n" +"True" +msgstr "" +">>> issubclass(E, Iterable)\n" +"True\n" +">>> isinstance(E(), Iterable)\n" +"True" + +#: ../../library/collections.abc.rst:98 +msgid "" +"Complex interfaces do not support this last technique because an interface " +"is more than just the presence of method names. Interfaces specify " +"semantics and relationships between methods that cannot be inferred solely " +"from the presence of specific method names. For example, knowing that a " +"class supplies ``__getitem__``, ``__len__``, and ``__iter__`` is " +"insufficient for distinguishing a :class:`Sequence` from a :class:`Mapping`." +msgstr "" +"复杂的接口不支持最后这种技术手段因为接口并不只是作为方法名称存在。 接口指明了方法之间的语义和关系,这些是无法根据特定方法名称的存在推断出来的。 " +"例如,知道一个类提供了 ``__getitem__``, ``__len__`` 和 ``__iter__`` 并不足以区分 " +":class:`Sequence` 和 :class:`Mapping`。" + +#: ../../library/collections.abc.rst:106 +msgid "" +"These abstract classes now support ``[]``. See :ref:`types-genericalias` and" +" :pep:`585`." +msgstr "这些抽象类现在都支持 ``[]``。 参见 :ref:`types-genericalias` 和 :pep:`585`。" + +#: ../../library/collections.abc.rst:113 +msgid "Collections Abstract Base Classes" +msgstr "容器抽象基类" + +#: ../../library/collections.abc.rst:115 +msgid "" +"The collections module offers the following :term:`ABCs `:" +msgstr "collections 模块提供了以下 :term:`ABCs `:" + +#: ../../library/collections.abc.rst:120 +msgid "ABC" +msgstr "抽象基类" + +#: ../../library/collections.abc.rst:120 +msgid "Inherits from" +msgstr "继承自" + +#: ../../library/collections.abc.rst:120 +msgid "Abstract Methods" +msgstr "抽象方法" + +#: ../../library/collections.abc.rst:120 +msgid "Mixin Methods" +msgstr "混入方法" + +#: ../../library/collections.abc.rst:122 +msgid ":class:`Container` [1]_" +msgstr ":class:`Container` [1]_" + +#: ../../library/collections.abc.rst:122 +msgid "``__contains__``" +msgstr "``__contains__``" + +#: ../../library/collections.abc.rst:123 +msgid ":class:`Hashable` [1]_" +msgstr ":class:`Hashable` [1]_" + +#: ../../library/collections.abc.rst:123 +msgid "``__hash__``" +msgstr "``__hash__``" + +#: ../../library/collections.abc.rst:124 +msgid ":class:`Iterable` [1]_ [2]_" +msgstr ":class:`Iterable` [1]_ [2]_" + +#: ../../library/collections.abc.rst:124 ../../library/collections.abc.rst:125 +msgid "``__iter__``" +msgstr "``__iter__``" + +#: ../../library/collections.abc.rst:125 +msgid ":class:`Iterator` [1]_" +msgstr ":class:`Iterator` [1]_" + +#: ../../library/collections.abc.rst:125 ../../library/collections.abc.rst:126 +msgid ":class:`Iterable`" +msgstr ":class:`Iterable`" + +#: ../../library/collections.abc.rst:125 +msgid "``__next__``" +msgstr "``__next__``" + +#: ../../library/collections.abc.rst:126 +msgid ":class:`Reversible` [1]_" +msgstr ":class:`Reversible` [1]_" + +#: ../../library/collections.abc.rst:126 +msgid "``__reversed__``" +msgstr "``__reversed__``" + +#: ../../library/collections.abc.rst:127 +msgid ":class:`Generator` [1]_" +msgstr ":class:`Generator` [1]_" + +#: ../../library/collections.abc.rst:127 +msgid ":class:`Iterator`" +msgstr ":class:`Iterator`" + +#: ../../library/collections.abc.rst:127 ../../library/collections.abc.rst:176 +msgid "``send``, ``throw``" +msgstr "``send``, ``throw``" + +#: ../../library/collections.abc.rst:127 +msgid "``close``, ``__iter__``, ``__next__``" +msgstr "``close``, ``__iter__``, ``__next__``" + +#: ../../library/collections.abc.rst:128 +msgid ":class:`Sized` [1]_" +msgstr ":class:`Sized` [1]_" + +#: ../../library/collections.abc.rst:128 +msgid "``__len__``" +msgstr "``__len__``" + +#: ../../library/collections.abc.rst:129 +msgid ":class:`Callable` [1]_" +msgstr ":class:`Callable` [1]_" + +#: ../../library/collections.abc.rst:129 +msgid "``__call__``" +msgstr "``__call__``" + +#: ../../library/collections.abc.rst:130 +msgid ":class:`Collection` [1]_" +msgstr ":class:`Collection` [1]_" + +#: ../../library/collections.abc.rst:130 +msgid ":class:`Sized`, :class:`Iterable`, :class:`Container`" +msgstr ":class:`Sized`, :class:`Iterable`, :class:`Container`" + +#: ../../library/collections.abc.rst:130 ../../library/collections.abc.rst:146 +msgid "``__contains__``, ``__iter__``, ``__len__``" +msgstr "``__contains__``, ``__iter__``, ``__len__``" + +#: ../../library/collections.abc.rst:134 ../../library/collections.abc.rst:137 +#: ../../library/collections.abc.rst:143 +msgid ":class:`Sequence`" +msgstr ":class:`Sequence`" + +#: ../../library/collections.abc.rst:134 +msgid ":class:`Reversible`, :class:`Collection`" +msgstr ":class:`Reversible`, :class:`Collection`" + +#: ../../library/collections.abc.rst:134 ../../library/collections.abc.rst:143 +msgid "``__getitem__``, ``__len__``" +msgstr "``__getitem__``, ``__len__``" + +#: ../../library/collections.abc.rst:134 +msgid "" +"``__contains__``, ``__iter__``, ``__reversed__``, ``index``, and ``count``" +msgstr "" +"``__contains__``, ``__iter__``, ``__reversed__``, ``index`` 和 ``count``" + +#: ../../library/collections.abc.rst:137 +msgid ":class:`MutableSequence`" +msgstr ":class:`MutableSequence`" + +#: ../../library/collections.abc.rst:137 +msgid "" +"``__getitem__``, ``__setitem__``, ``__delitem__``, ``__len__``, ``insert``" +msgstr "" +"``__getitem__``, ``__setitem__``, ``__delitem__``, ``__len__``, ``insert``" + +#: ../../library/collections.abc.rst:137 +msgid "" +"Inherited :class:`Sequence` methods and ``append``, ``clear``, ``reverse``, " +"``extend``, ``pop``, ``remove``, and ``__iadd__``" +msgstr "" +"继承了 :class:`Sequence` 的方法以及 ``append``, ``clear``, ``reverse``, ``extend``, " +"``pop``, ``remove`` 和 ``__iadd__``" + +#: ../../library/collections.abc.rst:143 +msgid ":class:`ByteString`" +msgstr ":class:`ByteString`" + +#: ../../library/collections.abc.rst:143 +msgid "Inherited :class:`Sequence` methods" +msgstr "继承的 :class:`Sequence` 方法" + +#: ../../library/collections.abc.rst:146 ../../library/collections.abc.rst:151 +msgid ":class:`Set`" +msgstr ":class:`Set`" + +#: ../../library/collections.abc.rst:146 ../../library/collections.abc.rst:157 +msgid ":class:`Collection`" +msgstr ":class:`Collection`" + +#: ../../library/collections.abc.rst:146 +msgid "" +"``__le__``, ``__lt__``, ``__eq__``, ``__ne__``, ``__gt__``, ``__ge__``, " +"``__and__``, ``__or__``, ``__sub__``, ``__rsub__``, ``__xor__``, " +"``__rxor__`` and ``isdisjoint``" +msgstr "" +"``__le__``, ``__lt__``, ``__eq__``, ``__ne__``, ``__gt__``, ``__ge__``, " +"``__and__``, ``__or__``, ``__sub__``, ``__rsub__``, ``__xor__``, " +"``__rxor__`` 和 ``isdisjoint``" + +#: ../../library/collections.abc.rst:151 +msgid ":class:`MutableSet`" +msgstr ":class:`MutableSet`" + +#: ../../library/collections.abc.rst:151 +msgid "``__contains__``, ``__iter__``, ``__len__``, ``add``, ``discard``" +msgstr "``__contains__``, ``__iter__``, ``__len__``, ``add``, ``discard``" + +#: ../../library/collections.abc.rst:151 +msgid "" +"Inherited :class:`Set` methods and ``clear``, ``pop``, ``remove``, " +"``__ior__``, ``__iand__``, ``__ixor__``, and ``__isub__``" +msgstr "" +"继承自 :class:`Set` 的方法以及 ``clear``, ``pop``, ``remove``, ``__ior__``, " +"``__iand__``, ``__ixor__``,和 ``__isub__``" + +#: ../../library/collections.abc.rst:157 ../../library/collections.abc.rst:161 +msgid ":class:`Mapping`" +msgstr ":class:`Mapping`" + +#: ../../library/collections.abc.rst:157 +msgid "``__getitem__``, ``__iter__``, ``__len__``" +msgstr "``__getitem__``, ``__iter__``, ``__len__``" + +#: ../../library/collections.abc.rst:157 +msgid "" +"``__contains__``, ``keys``, ``items``, ``values``, ``get``, ``__eq__``, and " +"``__ne__``" +msgstr "" +"``__contains__``, ``keys``, ``items``, ``values``, ``get``, ``__eq__`` 和 " +"``__ne__``" + +#: ../../library/collections.abc.rst:161 +msgid ":class:`MutableMapping`" +msgstr ":class:`MutableMapping`" + +#: ../../library/collections.abc.rst:161 +msgid "" +"``__getitem__``, ``__setitem__``, ``__delitem__``, ``__iter__``, ``__len__``" +msgstr "" +"``__getitem__``, ``__setitem__``, ``__delitem__``, ``__iter__``, ``__len__``" + +#: ../../library/collections.abc.rst:161 +msgid "" +"Inherited :class:`Mapping` methods and ``pop``, ``popitem``, ``clear``, " +"``update``, and ``setdefault``" +msgstr "" +"继承自 :class:`Mapping` 的方法以及 ``pop``, ``popitem``, ``clear``, ``update``,和 " +"``setdefault``" + +#: ../../library/collections.abc.rst:168 +msgid ":class:`MappingView`" +msgstr ":class:`MappingView`" + +#: ../../library/collections.abc.rst:168 +msgid ":class:`Sized`" +msgstr ":class:`Sized`" + +#: ../../library/collections.abc.rst:168 +msgid "``__init__``, ``__len__`` and ``__repr__``" +msgstr "``__init__``, ``__len__`` 和 ``__repr__``" + +#: ../../library/collections.abc.rst:169 +msgid ":class:`ItemsView`" +msgstr ":class:`ItemsView`" + +#: ../../library/collections.abc.rst:169 ../../library/collections.abc.rst:171 +msgid ":class:`MappingView`, :class:`Set`" +msgstr ":class:`MappingView`, :class:`Set`" + +#: ../../library/collections.abc.rst:169 ../../library/collections.abc.rst:171 +#: ../../library/collections.abc.rst:173 +msgid "``__contains__``, ``__iter__``" +msgstr "``__contains__``, ``__iter__``" + +#: ../../library/collections.abc.rst:171 +msgid ":class:`KeysView`" +msgstr ":class:`KeysView`" + +#: ../../library/collections.abc.rst:173 +msgid ":class:`ValuesView`" +msgstr ":class:`ValuesView`" + +#: ../../library/collections.abc.rst:173 +msgid ":class:`MappingView`, :class:`Collection`" +msgstr ":class:`MappingView`, :class:`Collection`" + +#: ../../library/collections.abc.rst:175 +msgid ":class:`Awaitable` [1]_" +msgstr ":class:`Awaitable` [1]_" + +#: ../../library/collections.abc.rst:175 +msgid "``__await__``" +msgstr "``__await__``" + +#: ../../library/collections.abc.rst:176 +msgid ":class:`Coroutine` [1]_" +msgstr ":class:`Coroutine` [1]_" + +#: ../../library/collections.abc.rst:176 +msgid ":class:`Awaitable`" +msgstr ":class:`Awaitable`" + +#: ../../library/collections.abc.rst:176 +msgid "``close``" +msgstr "``close``" + +#: ../../library/collections.abc.rst:177 +msgid ":class:`AsyncIterable` [1]_" +msgstr ":class:`AsyncIterable` [1]_" + +#: ../../library/collections.abc.rst:177 ../../library/collections.abc.rst:178 +msgid "``__aiter__``" +msgstr "``__aiter__``" + +#: ../../library/collections.abc.rst:178 +msgid ":class:`AsyncIterator` [1]_" +msgstr ":class:`AsyncIterator` [1]_" + +#: ../../library/collections.abc.rst:178 +msgid ":class:`AsyncIterable`" +msgstr ":class:`AsyncIterable`" + +#: ../../library/collections.abc.rst:178 +msgid "``__anext__``" +msgstr "``__anext__``" + +#: ../../library/collections.abc.rst:179 +msgid ":class:`AsyncGenerator` [1]_" +msgstr ":class:`AsyncGenerator` [1]_" + +#: ../../library/collections.abc.rst:179 +msgid ":class:`AsyncIterator`" +msgstr ":class:`AsyncIterator`" + +#: ../../library/collections.abc.rst:179 +msgid "``asend``, ``athrow``" +msgstr "``asend``, ``athrow``" + +#: ../../library/collections.abc.rst:179 +msgid "``aclose``, ``__aiter__``, ``__anext__``" +msgstr "``aclose``, ``__aiter__``, ``__anext__``" + +#: ../../library/collections.abc.rst:180 +msgid ":class:`Buffer` [1]_" +msgstr ":class:`Buffer` [1]_" + +#: ../../library/collections.abc.rst:180 +msgid "``__buffer__``" +msgstr "``__buffer__``" + +#: ../../library/collections.abc.rst:185 +msgid "Footnotes" +msgstr "附注" + +#: ../../library/collections.abc.rst:186 +msgid "" +"These ABCs override :meth:`~abc.ABCMeta.__subclasshook__` to support testing" +" an interface by verifying the required methods are present and have not " +"been set to :const:`None`. This only works for simple interfaces. More " +"complex interfaces require registration or direct subclassing." +msgstr "" +"这些 ABC 重写了 :meth:`~abc.ABCMeta.__subclasshook__` 以便支持通过验证所需的方法是否存在并且没有被设为 " +":const:`None` 来测试一个接口。 这只适用于简单的接口。 更复杂的接口需要注册或者直接子类化。" + +#: ../../library/collections.abc.rst:192 +msgid "" +"Checking ``isinstance(obj, Iterable)`` detects classes that are registered " +"as :class:`Iterable` or that have an :meth:`~container.__iter__` method, but" +" it does not detect classes that iterate with the " +":meth:`~object.__getitem__` method. The only reliable way to determine " +"whether an object is :term:`iterable` is to call ``iter(obj)``." +msgstr "" +"``isinstance(obj, Iterable)`` 检查能侦测到被注册为 :class:`Iterable` 或者具有 " +":meth:`~container.__iter__` 方法的类,但它不能侦测到使用 :meth:`~object.__getitem__` " +"方法进行迭代的类。 确定一个对象是否为 :term:`iterable` 的唯一可靠方式是调用 ``iter(obj)``。" + +#: ../../library/collections.abc.rst:200 +msgid "Collections Abstract Base Classes -- Detailed Descriptions" +msgstr "多项集抽象基类 -- 详细描述" + +#: ../../library/collections.abc.rst:205 +msgid "ABC for classes that provide the :meth:`~object.__contains__` method." +msgstr "提供了 :meth:`~object.__contains__` 方法的抽象基类。" + +#: ../../library/collections.abc.rst:209 +msgid "ABC for classes that provide the :meth:`~object.__hash__` method." +msgstr "提供了 :meth:`~object.__hash__` 方法的抽象基类。" + +#: ../../library/collections.abc.rst:213 +msgid "ABC for classes that provide the :meth:`~object.__len__` method." +msgstr "用于提供 :meth:`~object.__len__` 方法的类的 ABC" + +#: ../../library/collections.abc.rst:217 +msgid "ABC for classes that provide the :meth:`~object.__call__` method." +msgstr "用于提供 :meth:`~object.__call__` 方法的类的 ABC" + +#: ../../library/collections.abc.rst:219 +msgid "" +"See :ref:`annotating-callables` for details on how to use :class:`!Callable`" +" in type annotations." +msgstr "有关如何在类型标注中使用 :class:`!Callable` 的详细信息请参阅 :ref:`annotating-callables`。" + +#: ../../library/collections.abc.rst:224 +msgid "ABC for classes that provide the :meth:`~container.__iter__` method." +msgstr "用于提供 :meth:`~container.__iter__` 方法的类的 ABC" + +#: ../../library/collections.abc.rst:226 +msgid "" +"Checking ``isinstance(obj, Iterable)`` detects classes that are registered " +"as :class:`Iterable` or that have an :meth:`~container.__iter__` method, but" +" it does not detect classes that iterate with the " +":meth:`~object.__getitem__` method. The only reliable way to determine " +"whether an object is :term:`iterable` is to call ``iter(obj)``." +msgstr "" +"``isinstance(obj, Iterable)`` 检查能侦测到被注册为 :class:`Iterable` 或者具有 " +":meth:`~container.__iter__` 方法的类,但它不能侦测到使用 :meth:`~object.__getitem__` " +"方法进行迭代的类。 确定一个对象是否为 :term:`iterable` 的唯一可靠方式是调用 ``iter(obj)``。" + +#: ../../library/collections.abc.rst:235 +msgid "ABC for sized iterable container classes." +msgstr "针对有大小的可迭代容器类的 ABC。" + +#: ../../library/collections.abc.rst:241 +msgid "" +"ABC for classes that provide the :meth:`~iterator.__iter__` and " +":meth:`~iterator.__next__` methods. See also the definition of " +":term:`iterator`." +msgstr "" +"提供了 :meth:`~iterator.__iter__` 和 :meth:`~iterator.__next__` 方法的抽象基类。参见 " +":term:`iterator` 的定义。" + +#: ../../library/collections.abc.rst:247 +msgid "" +"ABC for iterable classes that also provide the :meth:`~object.__reversed__` " +"method." +msgstr "用于同时提供了 :meth:`~object.__reversed__` 方法的可迭代类的 ABC" + +#: ../../library/collections.abc.rst:254 +msgid "" +"ABC for :term:`generator` classes that implement the protocol defined in " +":pep:`342` that extends :term:`iterators ` with the " +":meth:`~generator.send`, :meth:`~generator.throw` and " +":meth:`~generator.close` methods." +msgstr "" +"用于实现了 :pep:`342` 中定义的协议的 :term:`generator` 类的 ABC,它通过 " +":meth:`~generator.send`, :meth:`~generator.throw` 和 :meth:`~generator.close`" +" 方法对 :term:`迭代器 ` 进行了扩展。" + +#: ../../library/collections.abc.rst:259 +msgid "" +"See :ref:`annotating-generators-and-coroutines` for details on using " +":class:`!Generator` in type annotations." +msgstr "" +"有关在类型标注中使用 :class:`!Generator` 的详细信息请参阅 :ref:`annotating-generators-and-" +"coroutines`。" + +#: ../../library/collections.abc.rst:268 +msgid "ABCs for read-only and mutable :term:`sequences `." +msgstr "只读的与可变的 :term:`序列 ` 的抽象基类。" + +#: ../../library/collections.abc.rst:270 +msgid "" +"Implementation note: Some of the mixin methods, such as " +":meth:`~container.__iter__`, :meth:`~object.__reversed__`, and " +":meth:`~sequence.index` make repeated calls to the underlying " +":meth:`~object.__getitem__` method. Consequently, if " +":meth:`~object.__getitem__` is implemented with constant access speed, the " +"mixin methods will have linear performance; however, if the underlying " +"method is linear (as it would be with a linked list), the mixins will have " +"quadratic performance and will likely need to be overridden." +msgstr "" +"实现注意事项:某些混入方法,如 :meth:`~container.__iter__`, :meth:`~object.__reversed__` 和 " +":meth:`~sequence.index`,会重复调用下层的 :meth:`~object.__getitem__` 方法。 因此,如果 " +":meth:`~object.__getitem__` " +"被实现为常数级访问速度,则混入方法的性能将为线性级;但是,如果下层的方法是线性的(例如链表就是如此),则混入方法的性能将为平方级并可能需要被重写。" + +#: ../../library/collections.abc.rst:282 +msgid "Return first index of *value*." +msgstr "返回首个 *value* 的索引。" + +#: ../../library/collections.abc.rst:284 +msgid "Raises :exc:`ValueError` if the value is not present." +msgstr "如果该值不存在则会引发 :exc:`ValueError`。" + +#: ../../library/collections.abc.rst:286 +msgid "" +"Supporting the *start* and *stop* arguments is optional, but recommended." +msgstr "对 *start* 和 *stop* 参数的支持是可选项,但建议使用。" + +#: ../../library/collections.abc.rst:288 +msgid "" +"The :meth:`~sequence.index` method gained support for the *stop* and *start*" +" arguments." +msgstr ":meth:`~sequence.index` 方法获得对 *stop* 和 *start* 参数的支持。" + +#: ../../library/collections.abc.rst:292 +msgid "The :class:`ByteString` ABC has been deprecated." +msgstr ":class:`ByteString` ABC 已被弃用。" + +#: ../../library/collections.abc.rst:295 +msgid "" +"Use ``isinstance(obj, collections.abc.Buffer)`` to test if ``obj`` " +"implements the :ref:`buffer protocol ` at runtime. For use in" +" type annotations, either use :class:`Buffer` or a union that explicitly " +"specifies the types your code supports (e.g., ``bytes | bytearray | " +"memoryview``)." +msgstr "" +"使用 ``isinstance(obj, collections.abc.Buffer)`` 来测试 ``obj`` 是否在运行时实现了 " +":ref:`缓冲区协议 `。 要用于类型标注,则使用 :class:`Buffer` " +"或是显式指明你的代码所支持的类型的并集 (例如 ``bytes | bytearray | memoryview``)。" + +#: ../../library/collections.abc.rst:301 +msgid "" +":class:`!ByteString` was originally intended to be an abstract class that " +"would serve as a supertype of both :class:`bytes` and :class:`bytearray`. " +"However, since the ABC never had any methods, knowing that an object was an " +"instance of :class:`!ByteString` never actually told you anything useful " +"about the object. Other common buffer types such as :class:`memoryview` were" +" also never understood as subtypes of :class:`!ByteString` (either at " +"runtime or by static type checkers)." +msgstr "" +":class:`!ByteString` 原本是想作为 :class:`bytes` 和 :class:`bytearray` 的超类型的抽象基类提供。" +" 不过,由于该 ABC 从未有过任何方法,知道一个对象是 :class:`!ByteString` 的实例并不能真正告诉你有关该对象的任何有用信息。 " +"其他常见缓冲区类型如 :class:`memoryview` 同样不能被当作是 :class:`!ByteString` " +"的子类型(无论是在运行时还是对于静态类型检查器)。" + +#: ../../library/collections.abc.rst:309 +msgid "See :pep:`PEP 688 <688#current-options>` for more details." +msgstr "请参阅 :pep:`PEP 688 <688#current-options>` 了解详情。" + +#: ../../library/collections.abc.rst:314 +msgid "ABCs for read-only and mutable :ref:`sets `." +msgstr "用于只读和可变 :ref:`集合 ` 的 ABC。" + +#: ../../library/collections.abc.rst:319 +msgid "ABCs for read-only and mutable :term:`mappings `." +msgstr "只读的与可变的 :term:`映射 ` 的抽象基类。" + +#: ../../library/collections.abc.rst:326 +msgid "" +"ABCs for mapping, items, keys, and values :term:`views `." +msgstr "映射、条目、键和值的 :term:`视图 ` 的抽象基类。" + +#: ../../library/collections.abc.rst:330 +msgid "" +"ABC for :term:`awaitable` objects, which can be used in :keyword:`await` " +"expressions. Custom implementations must provide the " +":meth:`~object.__await__` method." +msgstr "" +"针对 :term:`awaitable` 对象的 ABC,它可被用于 :keyword:`await` 表达式。 自定义实现必须提供 " +":meth:`~object.__await__` 方法。" + +#: ../../library/collections.abc.rst:334 +msgid "" +":term:`Coroutine ` objects and instances of the " +":class:`~collections.abc.Coroutine` ABC are all instances of this ABC." +msgstr "" +":term:`协程 ` 对象和 :class:`~collections.abc.Coroutine` ABC 的实例都是这个 " +"ABC 的实例。" + +#: ../../library/collections.abc.rst:338 +msgid "" +"In CPython, generator-based coroutines (:term:`generators ` " +"decorated with :deco:`types.coroutine`) are *awaitables*, even though they " +"do not have an :meth:`~object.__await__` method. Using ``isinstance(gencoro," +" Awaitable)`` for them will return ``False``. Use " +":func:`inspect.isawaitable` to detect them." +msgstr "" +"在 CPython 中,基于生成器的协程 (使用 :deco:`types.coroutine` 装饰的 :term:`生成器 " +"`) 都是 *可等待对象*,即使它们没有 :meth:`~object.__await__` 方法。 对它们使用 " +"``isinstance(gencoro, Awaitable)`` 将返回 ``False``。 请使用 " +":func:`inspect.isawaitable` 来检测它们。" + +#: ../../library/collections.abc.rst:348 +msgid "" +"ABC for :term:`coroutine` compatible classes. These implement the following" +" methods, defined in :ref:`coroutine-objects`: :meth:`~coroutine.send`, " +":meth:`~coroutine.throw`, and :meth:`~coroutine.close`. Custom " +"implementations must also implement :meth:`~object.__await__`. All " +":class:`Coroutine` instances are also instances of :class:`Awaitable`." +msgstr "" +"用于 :term:`coroutine` 兼容类的 ABC。 实现了如下定义在 :ref:`coroutine-objects` 里的方法: " +":meth:`~coroutine.send`, :meth:`~coroutine.throw` 和 " +":meth:`~coroutine.close`。 自定义实现还必须实现 :meth:`~object.__await__`。 所有的 " +":class:`Coroutine` 实例同时也是 :class:`Awaitable` 的实例。" + +#: ../../library/collections.abc.rst:356 +msgid "" +"In CPython, generator-based coroutines (:term:`generators ` " +"decorated with :deco:`types.coroutine`) are *awaitables*, even though they " +"do not have an :meth:`~object.__await__` method. Using ``isinstance(gencoro," +" Coroutine)`` for them will return ``False``. Use " +":func:`inspect.isawaitable` to detect them." +msgstr "" +"在 CPython 中,基于生成器的协程 (使用 :deco:`types.coroutine` 装饰的 :term:`生成器 " +"`) 都是 *可等待对象*,即使它们没有 :meth:`~object.__await__` 方法。 对它们使用 " +"``isinstance(gencoro, Coroutine)`` 将返回 ``False``。 请使用 " +":func:`inspect.isawaitable` 来检测它们。" + +#: ../../library/collections.abc.rst:362 +msgid "" +"See :ref:`annotating-generators-and-coroutines` for details on using " +":class:`!Coroutine` in type annotations. The variance and order of type " +"parameters correspond to those of :class:`Generator`." +msgstr "" +"有关在类型标注中使用 :class:`!Coroutine` 的详细信息请参阅 :ref:`annotating-generators-and-" +"coroutines`。 类型形参的型变与顺序与 :class:`Generator` 的相对应。" + +#: ../../library/collections.abc.rst:371 +msgid "" +"ABC for classes that provide an ``__aiter__`` method. See also the " +"definition of :term:`asynchronous iterable`." +msgstr "" +"针对提供了 ``__aiter__`` 方法的类的 ABC。 另请参阅 :term:`asynchronous iterable` 的定义。" + +#: ../../library/collections.abc.rst:378 +msgid "" +"ABC for classes that provide ``__aiter__`` and ``__anext__`` methods. See " +"also the definition of :term:`asynchronous iterator`." +msgstr "" +"提供了 ``__aiter__`` 和 ``__anext__`` 方法的抽象基类。参见 :term:`asynchronous iterator` " +"的定义。" + +#: ../../library/collections.abc.rst:385 +msgid "" +"ABC for :term:`asynchronous generator` classes that implement the protocol " +"defined in :pep:`525` and :pep:`492`." +msgstr "" +"针对实现了在 :pep:`525` 和 :pep:`492` 中定义的协议的 :term:`asynchronous generator` 类的 " +"ABC。" + +#: ../../library/collections.abc.rst:388 +msgid "" +"See :ref:`annotating-generators-and-coroutines` for details on using " +":class:`!AsyncGenerator` in type annotations." +msgstr "" +"有关在类型标注中使用 :class:`!AsyncGenerator` 的详细信息请参阅 :ref:`annotating-generators-" +"and-coroutines`。" + +#: ../../library/collections.abc.rst:395 +msgid "" +"ABC for classes that provide the :meth:`~object.__buffer__` method, " +"implementing the :ref:`buffer protocol `. See :pep:`688`." +msgstr "" +"针对提供 :meth:`~object.__buffer__` 方法的类的 ABC,实现了 :ref:`缓冲区协议 `。 " +"参见 :pep:`688`。" + +#: ../../library/collections.abc.rst:401 +msgid "Examples and Recipes" +msgstr "例子和配方" + +#: ../../library/collections.abc.rst:403 +msgid "" +"ABCs allow us to ask classes or instances if they provide particular " +"functionality, for example::" +msgstr "ABC 允许我们询问类或实例是否提供特定的功能,例如::" + +#: ../../library/collections.abc.rst:406 +msgid "" +"size = None\n" +"if isinstance(myvar, collections.abc.Sized):\n" +" size = len(myvar)" +msgstr "" +"size = None\n" +"if isinstance(myvar, collections.abc.Sized):\n" +" size = len(myvar)" + +#: ../../library/collections.abc.rst:410 +msgid "" +"Several of the ABCs are also useful as mixins that make it easier to develop" +" classes supporting container APIs. For example, to write a class " +"supporting the full :class:`Set` API, it is only necessary to supply the " +"three underlying abstract methods: :meth:`~object.__contains__`, " +":meth:`~container.__iter__`, and :meth:`~object.__len__`. The ABC supplies " +"the remaining methods such as :meth:`!__and__` and " +":meth:`~frozenset.isdisjoint`::" +msgstr "" +"有些 ABC 还适用于作为混入类,这可以更容易地开发支持容器 API 的类。 例如,要写一个支持完整 :class:`Set` API " +"的类,只需要提供三个下层抽象方法: :meth:`~object.__contains__`, :meth:`~container.__iter__` " +"和 :meth:`~object.__len__`。 ABC 会提供其余的方法如 :meth:`!__and__` 和 " +":meth:`~frozenset.isdisjoint`::" + +#: ../../library/collections.abc.rst:417 +msgid "" +"class ListBasedSet(collections.abc.Set):\n" +" ''' Alternate set implementation favoring space over speed\n" +" and not requiring the set elements to be hashable. '''\n" +" def __init__(self, iterable):\n" +" self.elements = lst = []\n" +" for value in iterable:\n" +" if value not in lst:\n" +" lst.append(value)\n" +"\n" +" def __iter__(self):\n" +" return iter(self.elements)\n" +"\n" +" def __contains__(self, value):\n" +" return value in self.elements\n" +"\n" +" def __len__(self):\n" +" return len(self.elements)\n" +"\n" +"s1 = ListBasedSet('abcdef')\n" +"s2 = ListBasedSet('defghi')\n" +"overlap = s1 & s2 # The __and__() method is supported automatically" +msgstr "" +"class ListBasedSet(collections.abc.Set):\n" +" ''' 空间重于速度并且不要求集合元素可哈希的\n" +" 替代性集合实现。 '''\n" +" def __init__(self, iterable):\n" +" self.elements = lst = []\n" +" for value in iterable:\n" +" if value not in lst:\n" +" lst.append(value)\n" +"\n" +" def __iter__(self):\n" +" return iter(self.elements)\n" +"\n" +" def __contains__(self, value):\n" +" return value in self.elements\n" +"\n" +" def __len__(self):\n" +" return len(self.elements)\n" +"\n" +"s1 = ListBasedSet('abcdef')\n" +"s2 = ListBasedSet('defghi')\n" +"overlap = s1 & s2 # 自动支持 __and__() 方法" + +#: ../../library/collections.abc.rst:439 +msgid "Notes on using :class:`Set` and :class:`MutableSet` as a mixin:" +msgstr "当把 :class:`Set` 和 :class:`MutableSet` 用作混入类时需注意:" + +#: ../../library/collections.abc.rst:442 +msgid "" +"Since some set operations create new sets, the default mixin methods need a " +"way to create new instances from an :term:`iterable`. The class constructor " +"is assumed to have a signature in the form ``ClassName(iterable)``. That " +"assumption is factored-out to an internal :class:`classmethod` called " +":meth:`!_from_iterable` which calls ``cls(iterable)`` to produce a new set. " +"If the :class:`Set` mixin is being used in a class with a different " +"constructor signature, you will need to override :meth:`!_from_iterable` " +"with a classmethod or regular method that can construct new instances from " +"an iterable argument." +msgstr "" +"由于某些集合操作会创建新的集合,默认的混入方法需要一种根据 :term:`iterable` 创建新实例的方式。 假定类构造器具有 " +"``ClassName(iterable)`` 形式的签名。 该假设被提取到一个名为 :meth:`!_from_iterable` 的内部 " +":class:`classmethod` 中,该方法会调用 ``cls(iterable)`` 来产生一个新的集合。 如果 :class:`Set` " +"混入类在具有不同构造器签名的类中被使用,你将需要通过一个能根据可迭代对象参数构造新实例的类方法或常规方法来重写 " +":meth:`!_from_iterable`。" + +#: ../../library/collections.abc.rst:453 +msgid "" +"To override the comparisons (presumably for speed, as the semantics are " +"fixed), redefine :meth:`~object.__le__` and :meth:`~object.__ge__`, then the" +" other operations will automatically follow suit." +msgstr "" +"要重写比较运算(应该是为了提高速度,因为其语义是固定的),请重新定义 :meth:`~object.__le__` 和 " +":meth:`~object.__ge__`,然后其他运算将自动跟进。" + +#: ../../library/collections.abc.rst:459 +msgid "" +"The :class:`Set` mixin provides a :meth:`!_hash` method to compute a hash " +"value for the set; however, :meth:`~object.__hash__` is not defined because " +"not all sets are :term:`hashable` or immutable. To add set hashability " +"using mixins, inherit from both :class:`Set` and :class:`Hashable`, then " +"define ``__hash__ = Set._hash``." +msgstr "" + +#: ../../library/collections.abc.rst:467 +msgid "" +"`OrderedSet recipe `_ for an " +"example built on :class:`MutableSet`." +msgstr "" +"`OrderedSet recipe `_ 是基于 " +":class:`MutableSet` 构建的一个示例。" + +#: ../../library/collections.abc.rst:470 +msgid "For more about ABCs, see the :mod:`abc` module and :pep:`3119`." +msgstr "有关 ABC 的更多信息,参见 :mod:`abc` 模块和 :pep:`3119`。" diff --git a/library/collections.po b/library/collections.po new file mode 100644 index 0000000000..1f7cefa0d1 --- /dev/null +++ b/library/collections.po @@ -0,0 +1,2242 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-06-07 16:19+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/collections.rst:2 +msgid ":mod:`!collections` --- Container datatypes" +msgstr ":mod:`!collections` --- 容器数据类型" + +#: ../../library/collections.rst:10 +msgid "**Source code:** :source:`Lib/collections/__init__.py`" +msgstr "**源代码:** :source:`Lib/collections/__init__.py`" + +#: ../../library/collections.rst:20 +msgid "" +"This module implements specialized container datatypes providing " +"alternatives to Python's general purpose built-in containers, :class:`dict`," +" :class:`list`, :class:`set`, and :class:`tuple`." +msgstr "" +"这个模块实现了一些专门化的容器,提供了对 Python 的通用内建容器 :class:`dict`、:class:`list`、:class:`set`" +" 和 :class:`tuple` 的补充。" + +#: ../../library/collections.rst:25 +msgid ":func:`namedtuple`" +msgstr ":func:`namedtuple`" + +#: ../../library/collections.rst:25 +msgid "factory function for creating tuple subclasses with named fields" +msgstr "一个工厂函数,用来创建元组的子类,子类的字段是有名称的。" + +#: ../../library/collections.rst:26 +msgid ":class:`deque`" +msgstr ":class:`deque`" + +#: ../../library/collections.rst:26 +msgid "list-like container with fast appends and pops on either end" +msgstr "类似列表的容器,但 append 和 pop 在其两端的速度都很快。" + +#: ../../library/collections.rst:27 +msgid ":class:`ChainMap`" +msgstr ":class:`ChainMap`" + +#: ../../library/collections.rst:27 +msgid "dict-like class for creating a single view of multiple mappings" +msgstr "类似字典的类,用于创建包含多个映射的单个视图。" + +#: ../../library/collections.rst:28 +msgid ":class:`Counter`" +msgstr ":class:`Counter`" + +#: ../../library/collections.rst:28 +msgid "dict subclass for counting :term:`hashable` objects" +msgstr "用于计数 :term:`hashable` 对象的字典子类" + +#: ../../library/collections.rst:29 +msgid ":class:`OrderedDict`" +msgstr ":class:`OrderedDict`" + +#: ../../library/collections.rst:29 +msgid "dict subclass that remembers the order entries were added" +msgstr "字典的子类,能记住条目被添加进去的顺序。" + +#: ../../library/collections.rst:30 +msgid ":class:`defaultdict`" +msgstr ":class:`defaultdict`" + +#: ../../library/collections.rst:30 +msgid "dict subclass that calls a factory function to supply missing values" +msgstr "字典的子类,通过调用用户指定的工厂函数,为键提供默认值。" + +#: ../../library/collections.rst:31 +msgid ":class:`UserDict`" +msgstr ":class:`UserDict`" + +#: ../../library/collections.rst:31 +msgid "wrapper around dictionary objects for easier dict subclassing" +msgstr "封装了字典对象,简化了字典子类化" + +#: ../../library/collections.rst:32 +msgid ":class:`UserList`" +msgstr ":class:`UserList`" + +#: ../../library/collections.rst:32 +msgid "wrapper around list objects for easier list subclassing" +msgstr "封装了列表对象,简化了列表子类化" + +#: ../../library/collections.rst:33 +msgid ":class:`UserString`" +msgstr ":class:`UserString`" + +#: ../../library/collections.rst:33 +msgid "wrapper around string objects for easier string subclassing" +msgstr "封装了字符串对象,简化了字符串子类化" + +#: ../../library/collections.rst:38 +msgid ":class:`ChainMap` objects" +msgstr ":class:`ChainMap` 对象" + +#: ../../library/collections.rst:42 +msgid "" +"A :class:`ChainMap` class is provided for quickly linking a number of " +"mappings so they can be treated as a single unit. It is often much faster " +"than creating a new dictionary and running multiple :meth:`~dict.update` " +"calls." +msgstr "" +":class:`ChainMap` 类将多个映射迅速地链到一起,这样它们就可以作为一个单元处理。这通常比创建一个新字典再重复地使用 " +":meth:`~dict.update` 要快得多。" + +#: ../../library/collections.rst:46 +msgid "" +"The class can be used to simulate nested scopes and is useful in templating." +msgstr "这个类可以用于模拟嵌套作用域,并且在模板化时很有用。" + +#: ../../library/collections.rst:50 +msgid "" +"A :class:`ChainMap` groups multiple dicts or other mappings together to " +"create a single, updateable view. If no *maps* are specified, a single " +"empty dictionary is provided so that a new chain always has at least one " +"mapping." +msgstr "" +"一个 :class:`ChainMap` 将多个字典或者其他映射组合在一起,创建一个单独的可更新的视图。 如果没有指定任何 " +"*maps*,一个空字典会被作为 *maps*。这样,每个新链至少包含一个映射。" + +#: ../../library/collections.rst:54 +msgid "" +"The underlying mappings are stored in a list. That list is public and can " +"be accessed or updated using the *maps* attribute. There is no other state." +msgstr "底层映射被存储在一个列表中。这个列表是公开的,可以通过 *maps* 属性存取和更新。没有其他的状态。" + +#: ../../library/collections.rst:57 +msgid "" +"Lookups search the underlying mappings successively until a key is found. " +"In contrast, writes, updates, and deletions only operate on the first " +"mapping." +msgstr "搜索查询底层映射,直到一个键被找到。不同的是,写,更新和删除只操作第一个映射。" + +#: ../../library/collections.rst:60 +msgid "" +"A :class:`ChainMap` incorporates the underlying mappings by reference. So, " +"if one of the underlying mappings gets updated, those changes will be " +"reflected in :class:`ChainMap`." +msgstr "" +"一个 :class:`ChainMap` 通过引用合并底层映射。 所以,如果一个底层映射更新了,这些更改会反映到 :class:`ChainMap` 。" + +#: ../../library/collections.rst:64 +msgid "" +"All of the usual dictionary methods are supported. In addition, there is a " +"*maps* attribute, a method for creating new subcontexts, and a property for " +"accessing all but the first mapping:" +msgstr "" +"支持所有常用字典方法。另外还有一个 *maps* 属性(attribute),一个创建子上下文的方法(method), " +"一个存取它们首个映射的属性(property):" + +#: ../../library/collections.rst:70 +msgid "" +"A user updateable list of mappings. The list is ordered from first-searched" +" to last-searched. It is the only stored state and can be modified to " +"change which mappings are searched. The list should always contain at least" +" one mapping." +msgstr "一个可以更新的映射列表。这个列表是按照第一次搜索到最后一次搜索的顺序组织的。它是仅有的存储状态,可以被修改。列表最少包含一个映射。" + +#: ../../library/collections.rst:77 +msgid "" +"Returns a new :class:`ChainMap` containing a new map followed by all of the " +"maps in the current instance. If ``m`` is specified, it becomes the new map" +" at the front of the list of mappings; if not specified, an empty dict is " +"used, so that a call to ``d.new_child()`` is equivalent to: ``ChainMap({}, " +"*d.maps)``. If any keyword arguments are specified, they update passed map " +"or new empty dict. This method is used for creating subcontexts that can be " +"updated without altering values in any of the parent mappings." +msgstr "" +"返回一个新的 :class:`ChainMap`,其中包含一个新的映射,后面跟随当前实例中的所有映射。 如果指定了 " +"``m``,它会成为新的映射加在映射列表的前面;如果未指定,则会使用一个空字典,因此调用 ``d.new_child()`` 就等价于 " +"``ChainMap({}, *d.maps)``。 如果指定了任何关键字参数,它们会更新所传入的映射或新的空字典。 " +"此方法被用于创建子上下文,它可在不改变任何上级映射的情况下被更新。" + +#: ../../library/collections.rst:86 +msgid "The optional ``m`` parameter was added." +msgstr "添加了可选的 ``m`` 形参。" + +#: ../../library/collections.rst:89 +msgid "Keyword arguments support was added." +msgstr "增加了对关键字参数的支持。" + +#: ../../library/collections.rst:94 +msgid "" +"Property returning a new :class:`ChainMap` containing all of the maps in the" +" current instance except the first one. This is useful for skipping the " +"first map in the search. Use cases are similar to those for the " +":keyword:`nonlocal` keyword used in :term:`nested scopes `. " +"The use cases also parallel those for the built-in :func:`super` function. " +"A reference to ``d.parents`` is equivalent to: ``ChainMap(*d.maps[1:])``." +msgstr "" +"属性返回一个新的 :class:`ChainMap` 包含所有的当前实例的映射,除了第一个。这样可以在搜索的时候跳过第一个映射。 使用的场景类似在 " +":term:`nested scopes ` 嵌套作用域中使用 :keyword:`nonlocal` " +"关键词。用例也可以类比内建函数 :func:`super` 。一个 ``d.parents`` 的引用等价于 " +"``ChainMap(*d.maps[1:])`` 。" + +#: ../../library/collections.rst:102 +msgid "" +"Note, the iteration order of a :class:`ChainMap` is determined by scanning " +"the mappings last to first::" +msgstr "注意,:class:`ChainMap` 的迭代顺序是通过从后往前扫描所有映射来确定的::" + +#: ../../library/collections.rst:105 +msgid "" +">>> baseline = {'music': 'bach', 'art': 'rembrandt'}\n" +">>> adjustments = {'art': 'van gogh', 'opera': 'carmen'}\n" +">>> list(ChainMap(adjustments, baseline))\n" +"['music', 'art', 'opera']" +msgstr "" +">>> baseline = {'music': 'bach', 'art': 'rembrandt'}\n" +">>> adjustments = {'art': 'van gogh', 'opera': 'carmen'}\n" +">>> list(ChainMap(adjustments, baseline))\n" +"['music', 'art', 'opera']" + +#: ../../library/collections.rst:110 +msgid "" +"This gives the same ordering as a series of :meth:`dict.update` calls " +"starting with the last mapping::" +msgstr "使得顺序与从最后一个映射开始调用一系列 :meth:`dict.update` 得到的字典的迭代顺序相同::" + +#: ../../library/collections.rst:113 +msgid "" +">>> combined = baseline.copy()\n" +">>> combined.update(adjustments)\n" +">>> list(combined)\n" +"['music', 'art', 'opera']" +msgstr "" +">>> combined = baseline.copy()\n" +">>> combined.update(adjustments)\n" +">>> list(combined)\n" +"['music', 'art', 'opera']" + +#: ../../library/collections.rst:118 +msgid "Added support for ``|`` and ``|=`` operators, specified in :pep:`584`." +msgstr "增加了对 ``|`` 和 ``|=`` 运算符的支持,相关说明见 :pep:`584`。" + +#: ../../library/collections.rst:123 +msgid "" +"The `MultiContext class " +"`_" +" in the Enthought `CodeTools package " +"`_ has options to support writing to" +" any mapping in the chain." +msgstr "" +"`MultiContext class " +"`_" +" 在 Enthought `CodeTools package `_ " +"有支持写映射的选项。" + +#: ../../library/collections.rst:129 +msgid "" +"Django's `Context class " +"`_ " +"for templating is a read-only chain of mappings. It also features pushing " +"and popping of contexts similar to the " +":meth:`~collections.ChainMap.new_child` method and the " +":attr:`~collections.ChainMap.parents` property." +msgstr "" +"Django 中用于模板的 `Context class " +"`_ " +"是只读的映射链。 它还具有上下文推送和弹出特性,类似于 :meth:`~collections.ChainMap.new_child` 方法和 " +":attr:`~collections.ChainMap.parents` 特征属性。" + +#: ../../library/collections.rst:136 +msgid "" +"The `Nested Contexts recipe " +"`_ has options to control whether writes and other " +"mutations apply only to the first mapping or to any mapping in the chain." +msgstr "" +"`Nested Contexts recipe `_ 提供了对于写入和其他修改是只应用于链路中第一个映射还是所有映射的选项。" + +#: ../../library/collections.rst:141 +msgid "" +"A `greatly simplified read-only version of Chainmap " +"`_." +msgstr "一个 `极简的只读版 Chainmap `_." + +#: ../../library/collections.rst:146 +msgid ":class:`ChainMap` Examples and Recipes" +msgstr ":class:`ChainMap` 例子和方法" + +#: ../../library/collections.rst:148 +msgid "This section shows various approaches to working with chained maps." +msgstr "这一节提供了多个使用链映射的案例。" + +#: ../../library/collections.rst:151 +msgid "Example of simulating Python's internal lookup chain::" +msgstr "模拟 Python 内部 lookup 链的例子::" + +#: ../../library/collections.rst:153 +msgid "" +"import builtins\n" +"pylookup = ChainMap(locals(), globals(), vars(builtins))" +msgstr "" +"import builtins\n" +"pylookup = ChainMap(locals(), globals(), vars(builtins))" + +#: ../../library/collections.rst:156 +msgid "" +"Example of letting user specified command-line arguments take precedence " +"over environment variables which in turn take precedence over default " +"values::" +msgstr "让用户指定的命令行参数优先于环境变量,优先于默认值的例子 ::" + +#: ../../library/collections.rst:159 +msgid "" +"import os, argparse\n" +"\n" +"defaults = {'color': 'red', 'user': 'guest'}\n" +"\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument('-u', '--user')\n" +"parser.add_argument('-c', '--color')\n" +"namespace = parser.parse_args()\n" +"command_line_args = {k: v for k, v in vars(namespace).items() if v is not None}\n" +"\n" +"combined = ChainMap(command_line_args, os.environ, defaults)\n" +"print(combined['color'])\n" +"print(combined['user'])" +msgstr "" +"import os, argparse\n" +"\n" +"defaults = {'color': 'red', 'user': 'guest'}\n" +"\n" +"parser = argparse.ArgumentParser()\n" +"parser.add_argument('-u', '--user')\n" +"parser.add_argument('-c', '--color')\n" +"namespace = parser.parse_args()\n" +"command_line_args = {k: v for k, v in vars(namespace).items() if v is not None}\n" +"\n" +"combined = ChainMap(command_line_args, os.environ, defaults)\n" +"print(combined['color'])\n" +"print(combined['user'])" + +#: ../../library/collections.rst:173 +msgid "" +"Example patterns for using the :class:`ChainMap` class to simulate nested " +"contexts::" +msgstr "用 :class:`ChainMap` 类模拟嵌套上下文的例子 ::" + +#: ../../library/collections.rst:176 +msgid "" +"c = ChainMap() # Create root context\n" +"d = c.new_child() # Create nested child context\n" +"e = c.new_child() # Child of c, independent from d\n" +"e.maps[0] # Current context dictionary -- like Python's locals()\n" +"e.maps[-1] # Root context -- like Python's globals()\n" +"e.parents # Enclosing context chain -- like Python's nonlocals\n" +"\n" +"d['x'] = 1 # Set value in current context\n" +"d['x'] # Get first key in the chain of contexts\n" +"del d['x'] # Delete from current context\n" +"list(d) # All nested values\n" +"k in d # Check all nested values\n" +"len(d) # Number of nested values\n" +"d.items() # All nested items\n" +"dict(d) # Flatten into a regular dictionary" +msgstr "" +"c = ChainMap() # 创建根上下文\n" +"d = c.new_child() # 创建嵌套的子上下文\n" +"e = c.new_child() # c 的子上下文,独立于 d\n" +"e.maps[0] # 当前上下文字典 -- 类似 Python 的 locals()\n" +"e.maps[-1] # 根上下文 -- 类似 Python 的 globals()\n" +"e.parents # 闭包的上下文链 -- 类似 Python 的 nonlocals\n" +"\n" +"d['x'] = 1 # 在当前上下文中设置值\n" +"d['x'] # 在上下文链中获取第一个键\n" +"del d['x'] # 在当前上下文中删除\n" +"list(d) # 所有嵌套的值\n" +"k in d # 检查所有嵌套的值\n" +"len(d) # 嵌套的值的数量\n" +"d.items() # 所有嵌套的条目\n" +"dict(d) # 展平为一个常规字典" + +#: ../../library/collections.rst:192 +msgid "" +"The :class:`ChainMap` class only makes updates (writes and deletions) to the" +" first mapping in the chain while lookups will search the full chain. " +"However, if deep writes and deletions are desired, it is easy to make a " +"subclass that updates keys found deeper in the chain::" +msgstr "" +":class:`ChainMap` 类只更新链中的第一个映射,但lookup会搜索整个链。 " +"然而,如果需要深度写和删除,也可以很容易的通过定义一个子类来实现它 ::" + +#: ../../library/collections.rst:197 +msgid "" +"class DeepChainMap(ChainMap):\n" +" 'Variant of ChainMap that allows direct updates to inner scopes'\n" +"\n" +" def __setitem__(self, key, value):\n" +" for mapping in self.maps:\n" +" if key in mapping:\n" +" mapping[key] = value\n" +" return\n" +" self.maps[0][key] = value\n" +"\n" +" def __delitem__(self, key):\n" +" for mapping in self.maps:\n" +" if key in mapping:\n" +" del mapping[key]\n" +" return\n" +" raise KeyError(key)\n" +"\n" +">>> d = DeepChainMap({'zebra': 'black'}, {'elephant': 'blue'}, {'lion': 'yellow'})\n" +">>> d['lion'] = 'orange' # update an existing key two levels down\n" +">>> d['snake'] = 'red' # new keys get added to the topmost dict\n" +">>> del d['elephant'] # remove an existing key one level down\n" +">>> d # display result\n" +"DeepChainMap({'zebra': 'black', 'snake': 'red'}, {}, {'lion': 'orange'})" +msgstr "" +"class DeepChainMap(ChainMap):\n" +" 'Variant of ChainMap that allows direct updates to inner scopes'\n" +"\n" +" def __setitem__(self, key, value):\n" +" for mapping in self.maps:\n" +" if key in mapping:\n" +" mapping[key] = value\n" +" return\n" +" self.maps[0][key] = value\n" +"\n" +" def __delitem__(self, key):\n" +" for mapping in self.maps:\n" +" if key in mapping:\n" +" del mapping[key]\n" +" return\n" +" raise KeyError(key)\n" +"\n" +">>> d = DeepChainMap({'zebra': 'black'}, {'elephant': 'blue'}, {'lion': 'yellow'})\n" +">>> d['lion'] = 'orange' # 更新向下两级的现有键\n" +">>> d['snake'] = 'red' # 添加新键到最高层级的字典\n" +">>> del d['elephant'] # 移除向下一级的现有键\n" +">>> d # 显示结果\n" +"DeepChainMap({'zebra': 'black', 'snake': 'red'}, {}, {'lion': 'orange'})" + +#: ../../library/collections.rst:223 +msgid ":class:`Counter` objects" +msgstr ":class:`Counter` 对象" + +#: ../../library/collections.rst:225 +msgid "" +"A counter tool is provided to support convenient and rapid tallies. For " +"example::" +msgstr "一个计数器工具,为的是可以方便快速地计数。例如::" + +#: ../../library/collections.rst:228 +msgid "" +">>> # Tally occurrences of words in a list\n" +">>> cnt = Counter()\n" +">>> for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:\n" +"... cnt[word] += 1\n" +"...\n" +">>> cnt\n" +"Counter({'blue': 3, 'red': 2, 'green': 1})\n" +"\n" +">>> # Find the ten most common words in Hamlet\n" +">>> import re\n" +">>> words = re.findall(r'\\w+', open('hamlet.txt').read().lower())\n" +">>> Counter(words).most_common(10)\n" +"[('the', 1143), ('and', 966), ('to', 762), ('of', 669), ('i', 631),\n" +" ('you', 554), ('a', 546), ('my', 514), ('hamlet', 471), ('in', 451)]" +msgstr "" +">>> # 统计一个列表中各单词的出现次数\n" +">>> cnt = Counter()\n" +">>> for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:\n" +"... cnt[word] += 1\n" +"...\n" +">>> cnt\n" +"Counter({'blue': 3, 'red': 2, 'green': 1})\n" +"\n" +">>> # 找出《哈姆雷特》中出现次数排前十的单词\n" +">>> import re\n" +">>> words = re.findall(r'\\w+', open('hamlet.txt').read().lower())\n" +">>> Counter(words).most_common(10)\n" +"[('the', 1143), ('and', 966), ('to', 762), ('of', 669), ('i', 631),\n" +" ('you', 554), ('a', 546), ('my', 514), ('hamlet', 471), ('in', 451)]" + +#: ../../library/collections.rst:247 +msgid "" +"A :class:`Counter` is a :class:`dict` subclass for counting :term:`hashable`" +" objects. It is a collection where elements are stored as dictionary keys " +"and their counts are stored as dictionary values. Counts are allowed to be " +"any integer value including zero or negative counts. The :class:`Counter` " +"class is similar to bags or multisets in other languages." +msgstr "" +":class:`Counter` 是 :class:`dict` 的子类,用于计数 :term:`hashable` " +"对象。它是一个多项集,元素存储为字典的键而它们的计数存储为字典的值。计数可以是任何整数,包括零或负的计数值。:class:`Counter` " +"类与其他语言中的 bag 或 multiset 很相似。" + +#: ../../library/collections.rst:253 +msgid "" +"Elements are counted from an *iterable* or initialized from another " +"*mapping* (or counter):" +msgstr "它可以通过计数一个 *iterable* 中的元素来初始化,或用其它 *mapping* (包括 counter) 初始化:" + +#: ../../library/collections.rst:261 +msgid "" +"Counter objects have a dictionary interface except that they return a zero " +"count for missing items instead of raising a :exc:`KeyError`:" +msgstr "" +"Counter 对象的接口类似于字典,不同的是,如果查询的键不在 Counter 中,它会返回一个 0 而不是引发一个 :exc:`KeyError`:" + +#: ../../library/collections.rst:268 +msgid "" +"Setting a count to zero does not remove an element from a counter. Use " +"``del`` to remove it entirely:" +msgstr "设置一个计数为0不会从计数器中移去一个元素。使用 ``del`` 来删除它:" + +#: ../../library/collections.rst:276 +msgid "" +"As a :class:`dict` subclass, :class:`Counter` inherited the capability to " +"remember insertion order. Math operations on *Counter* objects also " +"preserve order. Results are ordered according to when an element is first " +"encountered in the left operand and then by the order encountered in the " +"right operand." +msgstr "" +"作为 :class:`dict` 的子类,:class:`Counter` 继承了记住插入顺序的功能。*Counter* " +"对象间的数学运算也是保序的。结果首先把左操作数中存在的元素按照它们在左操作数中的顺序排序,后面跟着其它元素,按它们在右操作数中的顺序排序。" + +#: ../../library/collections.rst:282 +msgid "" +"Counter objects support additional methods beyond those available for all " +"dictionaries:" +msgstr "Counter 对象在对所有字典可用的方法以外还支持一些附加方法:" + +#: ../../library/collections.rst:287 +msgid "" +"Return an iterator over elements repeating each as many times as its count." +" Elements are returned in the order first encountered. If an element's " +"count is less than one, :meth:`elements` will ignore it." +msgstr "" +"返回一个迭代器,其中每个元素将重复出现计数值所指定次。 元素会按首次出现的顺序返回。 如果一个元素的计数值小于一,:meth:`elements` " +"将会忽略它。" + +#: ../../library/collections.rst:297 +msgid "" +"Return a list of the *n* most common elements and their counts from the most" +" common to the least. If *n* is omitted or ``None``, :meth:`most_common` " +"returns *all* elements in the counter. Elements with equal counts are " +"ordered in the order first encountered:" +msgstr "" +"返回一个列表,其中包含 *n* 个最常见的元素及出现次数,按常见程度由高到低排序。 如果 *n* 被省略或为 " +"``None``,:meth:`most_common` 将返回计数器中的 *所有* 元素。 计数值相等的元素按首次出现的顺序排序:" + +#: ../../library/collections.rst:309 +msgid "" +"Elements are subtracted from an *iterable* or from another *mapping* (or " +"counter). Like :meth:`dict.update` but subtracts counts instead of " +"replacing them. Both inputs and outputs may be zero or negative." +msgstr "" +"减去一个 *可迭代对象* 或 *映射对象* (或 counter) 中的元素。类似于 :meth:`dict.update` " +"但是是减去而非替换。输入和输出都可以是 0 或负数。" + +#: ../../library/collections.rst:323 +msgid "Compute the sum of the counts." +msgstr "计算总计数值。" + +#: ../../library/collections.rst:331 +msgid "" +"The usual dictionary methods are available for :class:`Counter` objects " +"except for two which work differently for counters." +msgstr "通常字典方法都可用于 :class:`Counter` 对象,除了有两个方法工作方式与字典并不相同。" + +#: ../../library/collections.rst:336 +msgid "This class method is not implemented for :class:`Counter` objects." +msgstr "这个类方法没有在 :class:`Counter` 中实现。" + +#: ../../library/collections.rst:342 +msgid "" +"Elements are counted from an *iterable* or added-in from another *mapping* " +"(or counter). Like :meth:`dict.update` but adds counts instead of replacing" +" them. Also, the *iterable* is expected to be a sequence of elements, not a" +" sequence of ``(key, value)`` pairs." +msgstr "" +"加上一个 *可迭代对象* 或 *映射对象* (或 counter) 中的元素。类似于 :meth:`dict.update` " +"但是是加上而非替换。另外,*可迭代对象* 应当是一个元素序列,而不是一个 ``(key, value)`` 对的序列。" + +#: ../../library/collections.rst:347 +msgid "" +"Counters support rich comparison operators for equality, subset, and " +"superset relationships: ``==``, ``!=``, ``<``, ``<=``, ``>``, ``>=``. All of" +" those tests treat missing elements as having zero counts so that " +"``Counter(a=1) == Counter(a=1, b=0)`` returns true." +msgstr "" +"计数对象支持相等性、子集和超集关系等富比较运算符: ``==``, ``!=``, ``<``, ``<=``, ``>``, ``>=``。 " +"所有这些检测会将不存在的元素当作计数值为零,因此 ``Counter(a=1) == Counter(a=1, b=0)`` 将返回真值。" + +#: ../../library/collections.rst:352 +msgid "Rich comparison operations were added." +msgstr "增加了富比较运算。" + +#: ../../library/collections.rst:355 +msgid "" +"In equality tests, missing elements are treated as having zero counts. " +"Formerly, ``Counter(a=3)`` and ``Counter(a=3, b=0)`` were considered " +"distinct." +msgstr "" +"在相等性检测中,不存在的元素会被当作计数值为零。 在此之前,``Counter(a=3)`` 和 ``Counter(a=3, b=0)`` " +"会被视为不同。" + +#: ../../library/collections.rst:360 +msgid "Common patterns for working with :class:`Counter` objects::" +msgstr ":class:`Counter` 对象的常用操作::" + +#: ../../library/collections.rst:362 +msgid "" +"c.total() # total of all counts\n" +"c.clear() # reset all counts\n" +"list(c) # list unique elements\n" +"set(c) # convert to a set\n" +"dict(c) # convert to a regular dictionary\n" +"c.items() # access the (elem, cnt) pairs\n" +"Counter(dict(list_of_pairs)) # convert from a list of (elem, cnt) pairs\n" +"c.most_common()[:-n-1:-1] # n least common elements\n" +"+c # remove zero and negative counts" +msgstr "" +"c.total() # 所有计数的总和\n" +"c.clear() # 重置所有计数\n" +"list(c) # 列出不同的元素\n" +"set(c) # 转换为集合\n" +"dict(c) # 转换为常规字典\n" +"c.items() # 访问 (元素, 计数) 对\n" +"Counter(dict(list_of_pairs)) # 转换自 (元素, 计数) 对的列表\n" +"c.most_common()[:-n-1:-1] # n 个最不常见的元素\n" +"+c # 移除为零和负的计数" + +#: ../../library/collections.rst:372 +msgid "" +"Several mathematical operations are provided for combining :class:`Counter` " +"objects to produce multisets (counters that have counts greater than zero). " +"Addition and subtraction combine counters by adding or subtracting the " +"counts of corresponding elements. Intersection and union return the minimum" +" and maximum of corresponding counts. Equality and inclusion compare " +"corresponding counts. Each operation can accept inputs with signed counts, " +"but the output will exclude results with counts of zero or less." +msgstr "" +"提供了几种数学运算用来合并 :class:`Counter` 对象,产生多集(所有计数值均大于零的 " +"counter)。加减运算通过增加或减少两者间对应元素的计数来合并 " +"counter。交并运算返回对应计数的最小值和最大值。相等和包含运算比较对应的计数。每个运算的参数都可以含有有符号的计数,但输出将排除计数小于等于零的元素。" + +#: ../../library/collections.rst:380 +msgid "" +">>> c = Counter(a=3, b=1)\n" +">>> d = Counter(a=1, b=2)\n" +">>> c + d # add two counters together: c[x] + d[x]\n" +"Counter({'a': 4, 'b': 3})\n" +">>> c - d # subtract (keeping only positive counts)\n" +"Counter({'a': 2})\n" +">>> c & d # intersection: min(c[x], d[x])\n" +"Counter({'a': 1, 'b': 1})\n" +">>> c | d # union: max(c[x], d[x])\n" +"Counter({'a': 3, 'b': 2})\n" +">>> c == d # equality: c[x] == d[x]\n" +"False\n" +">>> c <= d # inclusion: c[x] <= d[x]\n" +"False" +msgstr "" +">>> c = Counter(a=3, b=1)\n" +">>> d = Counter(a=1, b=2)\n" +">>> c + d # 将两个计数器相加: c[x] + d[x]\n" +"Counter({'a': 4, 'b': 3})\n" +">>> c - d # 相减(只保留为正的计数)\n" +"Counter({'a': 2})\n" +">>> c & d # 交集: min(c[x], d[x])\n" +"Counter({'a': 1, 'b': 1})\n" +">>> c | d # 并集: max(c[x], d[x])\n" +"Counter({'a': 3, 'b': 2})\n" +">>> c == d # 相等: c[x] == d[x]\n" +"False\n" +">>> c <= d # 包含: c[x] <= d[x]\n" +"False" + +#: ../../library/collections.rst:397 +msgid "" +"Unary addition and subtraction are shortcuts for adding an empty counter or " +"subtracting from an empty counter." +msgstr "单目加和减(一元操作符)意思是从空计数器加或者减去。" + +#: ../../library/collections.rst:406 +msgid "" +"Added support for unary plus, unary minus, and in-place multiset operations." +msgstr "添加了对一元加,一元减和原地多集操作的支持。" + +#: ../../library/collections.rst:411 +msgid "" +"Counters were primarily designed to work with positive integers to represent" +" running counts; however, care was taken to not unnecessarily preclude use " +"cases needing other types or negative values. To help with those use cases," +" this section documents the minimum range and type restrictions." +msgstr "计数器主要是为了表达运行的正的计数而设计;但是,小心不要预先排除负数或者其他类型。为了帮助这些用例,这一节记录了最小范围和类型限制。" + +#: ../../library/collections.rst:416 +msgid "" +"The :class:`Counter` class itself is a dictionary subclass with no " +"restrictions on its keys and values. The values are intended to be numbers " +"representing counts, but you *could* store anything in the value field." +msgstr ":class:`Counter` 类是一个字典的子类,不限制键和值。值用于表示计数,但你实际上 *可以* 存储任何其他值。" + +#: ../../library/collections.rst:420 +msgid "" +"The :meth:`~Counter.most_common` method requires only that the values be " +"orderable." +msgstr ":meth:`~Counter.most_common` 方法只要求值是可排序的。" + +#: ../../library/collections.rst:422 +msgid "" +"For in-place operations such as ``c[key] += 1``, the value type need only " +"support addition and subtraction. So fractions, floats, and decimals would " +"work and negative values are supported. The same is also true for " +":meth:`~Counter.update` and :meth:`~Counter.subtract` which allow negative " +"and zero values for both inputs and outputs." +msgstr "" +"参与原地操作如 ``c[key] += 1`` 的值的类型只需要支持加和减,所以分数、小数和 decimals " +"都可以用,也支持负数。:meth:`~Counter.update` 和 :meth:`~Counter.subtract` " +"当然也一样,输入和输出都支持 0 和 负数。" + +#: ../../library/collections.rst:428 +msgid "" +"The multiset methods are designed only for use cases with positive values. " +"The inputs may be negative or zero, but only outputs with positive values " +"are created. There are no type restrictions, but the value type needs to " +"support addition, subtraction, and comparison." +msgstr "多集方法是专为只会遇到正值的使用情况设计的。输入可以是 0 或负数,但只输出计数为正的值。没有类型限制,但值的类型需支持加、减和比较操作。" + +#: ../../library/collections.rst:433 +msgid "" +"The :meth:`~Counter.elements` method requires integer counts. It ignores " +"zero and negative counts." +msgstr ":meth:`~Counter.elements` 方法要求整数计数。忽略零和负数计数。" + +#: ../../library/collections.rst:438 +msgid "" +"`Bag class `_ in Smalltalk." +msgstr "" +"Smalltalk 中的 `Bag class `_。" + +#: ../../library/collections.rst:441 +msgid "" +"Wikipedia entry for `Multisets `_." +msgstr "Wikipedia 链接 `Multisets `_." + +#: ../../library/collections.rst:443 +msgid "" +"`C++ multisets `_ tutorial with examples." +msgstr "" +"`C++ multisets `_ 教程和例子。" + +#: ../../library/collections.rst:446 +msgid "" +"For mathematical operations on multisets and their use cases, see *Knuth, " +"Donald. The Art of Computer Programming Volume II, Section 4.6.3, Exercise " +"19*." +msgstr "" +"关于多重集合的数学运算及其用例,参考 *Knuth, Donald. The Art of Computer Programming Volume " +"II, Section 4.6.3, Exercise 19* 。" + +#: ../../library/collections.rst:450 +msgid "" +"To enumerate all distinct multisets of a given size over a given set of " +"elements, see :func:`itertools.combinations_with_replacement`::" +msgstr "" +"要在给定元素集合上枚举给定大小的所有不同多重集合,参考 :func:`itertools.combinations_with_replacement` " +"::" + +#: ../../library/collections.rst:453 +msgid "" +"map(Counter, combinations_with_replacement('ABC', 2)) # --> AA AB AC BB BC " +"CC" +msgstr "" +"map(Counter, combinations_with_replacement('ABC', 2)) # --> AA AB AC BB BC " +"CC" + +#: ../../library/collections.rst:457 +msgid ":class:`deque` objects" +msgstr ":class:`deque` 对象" + +#: ../../library/collections.rst:461 +msgid "" +"Returns a new deque object initialized left-to-right (using :meth:`append`) " +"with data from *iterable*. If *iterable* is not specified, the new deque is" +" empty." +msgstr "" +"返回一个新的双向队列对象,从左到右初始化(用方法 :meth:`append`) ,从 *iterable* (迭代对象) 数据创建。如果 " +"*iterable* 没有指定,新队列为空。" + +#: ../../library/collections.rst:464 +msgid "" +"Deques are a generalization of stacks and queues (the name is pronounced " +"\"deck\" and is short for \"double-ended queue\"). Deques support thread-" +"safe, memory efficient appends and pops from either side of the deque with " +"approximately the same *O*\\ (1) performance in either direction." +msgstr "" +"Deque 队列是对栈或 queue 队列的泛化(该名称的发音为 \"deck\",是 \"double-ended queue\" 的简写形式)。 " +"Deque 支持线程安全,高度节省内存地从 deque 的任一端添加和弹出条目,在两个方向上的大致性能均为 *O*\\ (1)。" + +#: ../../library/collections.rst:469 +msgid "" +"Though :class:`list` objects support similar operations, they are optimized " +"for fast fixed-length operations and incur *O*\\ (*n*) memory movement costs" +" for ``pop(0)`` and ``insert(0, v)`` operations which change both the size " +"and position of the underlying data representation." +msgstr "" +"虽然 :class:`list` 对象也支持类似的操作,但它们是针对快速的固定长度的操作进行优化而 ``pop(0)`` 和 ``insert(0, " +"v)`` 操作对下层数据表示的大小和位置改变都将产生 *O*\\ (*n*) 的内存移动开销。" + +#: ../../library/collections.rst:475 +msgid "" +"If *maxlen* is not specified or is ``None``, deques may grow to an arbitrary" +" length. Otherwise, the deque is bounded to the specified maximum length. " +"Once a bounded length deque is full, when new items are added, a " +"corresponding number of items are discarded from the opposite end. Bounded " +"length deques provide functionality similar to the ``tail`` filter in Unix. " +"They are also useful for tracking transactions and other pools of data where" +" only the most recent activity is of interest." +msgstr "" +"如果 *maxlen* 没有指定或者是 ``None`` ,deques " +"可以增长到任意长度。否则,deque就限定到指定最大长度。一旦限定长度的deque满了,当新项加入时,同样数量的项就从另一端弹出。限定长度deque提供类似Unix" +" filter ``tail`` 的功能。它们同样可以用于追踪最近的事务和其他数据池活动。" + +#: ../../library/collections.rst:483 +msgid "Deques are :ref:`generic ` over the type of their contents." +msgstr "" + +#: ../../library/collections.rst:486 +msgid "Deque objects support the following methods:" +msgstr "双向队列(deque)对象支持以下方法:" + +#: ../../library/collections.rst:490 +msgid "Add *item* to the right side of the deque." +msgstr "" + +#: ../../library/collections.rst:495 +msgid "Add *item* to the left side of the deque." +msgstr "" + +#: ../../library/collections.rst:500 +msgid "Remove all elements from the deque leaving it with length 0." +msgstr "移除所有元素,使其长度为0." + +#: ../../library/collections.rst:505 +msgid "Create a shallow copy of the deque." +msgstr "创建一份浅拷贝。" + +#: ../../library/collections.rst:512 +msgid "Count the number of deque elements equal to *value*." +msgstr "" + +#: ../../library/collections.rst:519 +msgid "" +"Extend the right side of the deque by appending elements from the iterable " +"argument." +msgstr "扩展deque的右侧,通过添加iterable参数中的元素。" + +#: ../../library/collections.rst:525 +msgid "" +"Extend the left side of the deque by appending elements from *iterable*. " +"Note, the series of left appends results in reversing the order of elements " +"in the iterable argument." +msgstr "扩展deque的左侧,通过添加iterable参数中的元素。注意,左添加时,在结果中iterable参数中的顺序将被反过来添加。" + +#: ../../library/collections.rst:532 +msgid "" +"Return the position of *value* in the deque (at or after index *start* and " +"before index *stop*). Returns the first match or raises :exc:`ValueError` " +"if not found." +msgstr "" + +#: ../../library/collections.rst:541 +msgid "Insert *value* into the deque at position *index*." +msgstr "" + +#: ../../library/collections.rst:543 +msgid "" +"If the insertion would cause a bounded deque to grow beyond *maxlen*, an " +":exc:`IndexError` is raised." +msgstr "如果插入会导致一个限长 deque 超出长度 *maxlen* 的话,就引发一个 :exc:`IndexError`。" + +#: ../../library/collections.rst:551 +msgid "" +"Remove and return an element from the right side of the deque. If no " +"elements are present, raises an :exc:`IndexError`." +msgstr "移去并且返回一个元素,deque 最右侧的那一个。 如果没有元素的话,就引发一个 :exc:`IndexError`。" + +#: ../../library/collections.rst:557 +msgid "" +"Remove and return an element from the left side of the deque. If no elements" +" are present, raises an :exc:`IndexError`." +msgstr "移去并且返回一个元素,deque 最左侧的那一个。 如果没有元素的话,就引发 :exc:`IndexError`。" + +#: ../../library/collections.rst:563 +msgid "" +"Remove the first occurrence of *value*. If not found, raises a " +":exc:`ValueError`." +msgstr "移除找到的第一个 *value*。 如果没有的话就引发 :exc:`ValueError`。" + +#: ../../library/collections.rst:569 +msgid "Reverse the elements of the deque in-place and then return ``None``." +msgstr "将deque逆序排列。返回 ``None`` 。" + +#: ../../library/collections.rst:576 +msgid "" +"Rotate the deque *n* steps to the right. If *n* is negative, rotate to the " +"left." +msgstr "向右循环移动 *n* 步。 如果 *n* 是负数,就向左循环。" + +#: ../../library/collections.rst:579 +msgid "" +"When the deque is not empty, rotating one step to the right is equivalent to" +" ``d.appendleft(d.pop())``, and rotating one step to the left is equivalent " +"to ``d.append(d.popleft())``." +msgstr "" +"如果deque不是空的,向右循环移动一步就等价于 ``d.appendleft(d.pop())`` , 向左循环一步就等价于 " +"``d.append(d.popleft())`` 。" + +#: ../../library/collections.rst:584 +msgid "Deque objects also provide one read-only attribute:" +msgstr "Deque对象同样提供了一个只读属性:" + +#: ../../library/collections.rst:588 +msgid "Maximum size of a deque or ``None`` if unbounded." +msgstr "Deque的最大尺寸,如果没有限定的话就是 ``None`` 。" + +#: ../../library/collections.rst:593 +msgid "" +"In addition to the above, deques support iteration, pickling, ``len(d)``, " +"``reversed(d)``, ``copy.copy(d)``, ``copy.deepcopy(d)``, membership testing " +"with the :keyword:`in` operator, and subscript references such as ``d[0]`` " +"to access the first element. Indexed access is *O*\\ (1) at both ends but " +"slows to *O*\\ (*n*) in the middle. For fast random access, use lists " +"instead." +msgstr "" +"在上述操作以外,deque 还支持迭代, 封存, ``len(d)``, ``reversed(d)``, ``copy.copy(d)``, " +"``copy.deepcopy(d)``, 使用 :keyword:`in` 运算符的成员检测以及下标引用例如通过 ``d[0]`` 访问首个元素等。 " +"索引访问在两端的时间复杂度均为 *O*\\ (1) 但在中间则会低至 *O*\\ (*n*)。 对于快速随机访问,请改用列表。" + +#: ../../library/collections.rst:599 +msgid "" +"Starting in version 3.5, deques support ``__add__()``, ``__mul__()``, and " +"``__imul__()``." +msgstr "Deque从版本3.5开始支持 ``__add__()``, ``__mul__()``, 和 ``__imul__()`` 。" + +#: ../../library/collections.rst:602 +msgid "Example:" +msgstr "示例:" + +#: ../../library/collections.rst:604 +msgid "" +">>> from collections import deque\n" +">>> d = deque('ghi') # make a new deque with three items\n" +">>> for elem in d: # iterate over the deque's elements\n" +"... print(elem.upper())\n" +"G\n" +"H\n" +"I\n" +"\n" +">>> d.append('j') # add a new entry to the right side\n" +">>> d.appendleft('f') # add a new entry to the left side\n" +">>> d # show the representation of the deque\n" +"deque(['f', 'g', 'h', 'i', 'j'])\n" +"\n" +">>> d.pop() # return and remove the rightmost item\n" +"'j'\n" +">>> d.popleft() # return and remove the leftmost item\n" +"'f'\n" +">>> list(d) # list the contents of the deque\n" +"['g', 'h', 'i']\n" +">>> d[0] # peek at leftmost item\n" +"'g'\n" +">>> d[-1] # peek at rightmost item\n" +"'i'\n" +"\n" +">>> list(reversed(d)) # list the contents of a deque in reverse\n" +"['i', 'h', 'g']\n" +">>> 'h' in d # search the deque\n" +"True\n" +">>> d.extend('jkl') # add multiple elements at once\n" +">>> d\n" +"deque(['g', 'h', 'i', 'j', 'k', 'l'])\n" +">>> d.rotate(1) # right rotation\n" +">>> d\n" +"deque(['l', 'g', 'h', 'i', 'j', 'k'])\n" +">>> d.rotate(-1) # left rotation\n" +">>> d\n" +"deque(['g', 'h', 'i', 'j', 'k', 'l'])\n" +"\n" +">>> deque(reversed(d)) # make a new deque in reverse order\n" +"deque(['l', 'k', 'j', 'i', 'h', 'g'])\n" +">>> d.clear() # empty the deque\n" +">>> d.pop() # cannot pop from an empty deque\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in -toplevel-\n" +" d.pop()\n" +"IndexError: pop from an empty deque\n" +"\n" +">>> d.extendleft('abc') # extendleft() reverses the input order\n" +">>> d\n" +"deque(['c', 'b', 'a'])" +msgstr "" +">>> from collections import deque\n" +">>> d = deque('ghi') # 新建一个包含三项的双端队列\n" +">>> for elem in d: # 迭代双端队列的元素\n" +"... print(elem.upper())\n" +"G\n" +"H\n" +"I\n" +"\n" +">>> d.append('j') # 添加一个新条目到右端\n" +">>> d.appendleft('f') # 添加一个新条目到左端\n" +">>> d # 显示双端队列的表示形式\n" +"deque(['f', 'g', 'h', 'i', 'j'])\n" +"\n" +">>> d.pop() # 返回并移除最右端的项\n" +"'j'\n" +">>> d.popleft() # 返回并移除最左端的项\n" +"'f'\n" +">>> list(d) # 列出双端队列的内容\n" +"['g', 'h', 'i']\n" +">>> d[0] # 查看最左端的项\n" +"'g'\n" +">>> d[-1] # 查看最右端的项\n" +"'i'\n" +"\n" +">>> list(reversed(d)) # 反向列出双端队列的内容\n" +"['i', 'h', 'g']\n" +">>> 'h' in d # 搜索双端队列\n" +"True\n" +">>> d.extend('jkl') # 一次添加多个元素\n" +">>> d\n" +"deque(['g', 'h', 'i', 'j', 'k', 'l'])\n" +">>> d.rotate(1) # 向右轮转\n" +">>> d\n" +"deque(['l', 'g', 'h', 'i', 'j', 'k'])\n" +">>> d.rotate(-1) # 向左轮转\n" +">>> d\n" +"deque(['g', 'h', 'i', 'j', 'k', 'l'])\n" +"\n" +">>> deque(reversed(d)) # 新建一个反向的双端队列\n" +"deque(['l', 'k', 'j', 'i', 'h', 'g'])\n" +">>> d.clear() # 清空双端队列\n" +">>> d.pop() # 无法从空的双端队列弹出元素\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in -toplevel-\n" +" d.pop()\n" +"IndexError: pop from an empty deque\n" +"\n" +">>> d.extendleft('abc') # extendleft() 将反转输入顺序\n" +">>> d\n" +"deque(['c', 'b', 'a'])" + +#: ../../library/collections.rst:659 +msgid ":class:`deque` Recipes" +msgstr ":class:`deque` 用法" + +#: ../../library/collections.rst:661 +msgid "This section shows various approaches to working with deques." +msgstr "这一节展示了deque的多种用法。" + +#: ../../library/collections.rst:663 +msgid "" +"Bounded length deques provide functionality similar to the ``tail`` filter " +"in Unix::" +msgstr "限长deque提供了类似Unix ``tail`` 过滤功能 ::" + +#: ../../library/collections.rst:666 +msgid "" +"def tail(filename, n=10):\n" +" 'Return the last n lines of a file'\n" +" with open(filename) as f:\n" +" return deque(f, n)" +msgstr "" +"def tail(filename, n=10):\n" +" '返回文件的最后 n 行'\n" +" with open(filename) as f:\n" +" return deque(f, n)" + +#: ../../library/collections.rst:671 +msgid "" +"Another approach to using deques is to maintain a sequence of recently added" +" elements by appending to the right and popping to the left::" +msgstr "另一个用法是维护一个近期添加元素的序列,通过从右边添加和从左边弹出 ::" + +#: ../../library/collections.rst:674 +msgid "" +"def moving_average(iterable, n=3):\n" +" # moving_average([40, 30, 50, 46, 39, 44]) --> 40.0 42.0 45.0 43.0\n" +" # https://en.wikipedia.org/wiki/Moving_average\n" +" it = iter(iterable)\n" +" d = deque(itertools.islice(it, n-1))\n" +" d.appendleft(0)\n" +" s = sum(d)\n" +" for elem in it:\n" +" s += elem - d.popleft()\n" +" d.append(elem)\n" +" yield s / n" +msgstr "" +"def moving_average(iterable, n=3):\n" +" # moving_average([40, 30, 50, 46, 39, 44]) --> 40.0 42.0 45.0 43.0\n" +" # https://en.wikipedia.org/wiki/Moving_average\n" +" it = iter(iterable)\n" +" d = deque(itertools.islice(it, n-1))\n" +" d.appendleft(0)\n" +" s = sum(d)\n" +" for elem in it:\n" +" s += elem - d.popleft()\n" +" d.append(elem)\n" +" yield s / n" + +#: ../../library/collections.rst:686 +msgid "" +"A `round-robin scheduler `_ can be implemented with input iterators stored in a " +":class:`deque`. Values are yielded from the active iterator in position " +"zero. If that iterator is exhausted, it can be removed with " +":meth:`~deque.popleft`; otherwise, it can be cycled back to the end with the" +" :meth:`~deque.rotate` method::" +msgstr "" +"一个 `轮询调度器 `_ 可以通过在 " +":class:`deque` 中放入迭代器来实现。值从当前迭代器的位置0被取出并暂存(yield)。 如果这个迭代器消耗完毕,就用 " +":meth:`~deque.popleft` 将其从队列中移去;否则,就通过 :meth:`~deque.rotate` 将它移到队列的末尾 ::" + +#: ../../library/collections.rst:693 +msgid "" +"def roundrobin(*iterables):\n" +" \"roundrobin('ABC', 'D', 'EF') --> A D E B F C\"\n" +" iterators = deque(map(iter, iterables))\n" +" while iterators:\n" +" try:\n" +" while True:\n" +" yield next(iterators[0])\n" +" iterators.rotate(-1)\n" +" except StopIteration:\n" +" # Remove an exhausted iterator.\n" +" iterators.popleft()" +msgstr "" +"def roundrobin(*iterables):\n" +" \"roundrobin('ABC', 'D', 'EF') --> A D E B F C\"\n" +" iterators = deque(map(iter, iterables))\n" +" while iterators:\n" +" try:\n" +" while True:\n" +" yield next(iterators[0])\n" +" iterators.rotate(-1)\n" +" except StopIteration:\n" +" # 移除已耗尽的迭代器。\n" +" iterators.popleft()" + +#: ../../library/collections.rst:705 +msgid "" +"The :meth:`~deque.rotate` method provides a way to implement :class:`deque` " +"slicing and deletion. For example, a pure Python implementation of ``del " +"d[n]`` relies on the ``rotate()`` method to position elements to be popped::" +msgstr "" +":meth:`~deque.rotate` 方法提供了一种方式来实现 :class:`deque` 切片和删除。 例如,一个纯的 Python " +"``del d[n]`` 实现依赖于 ``rotate()`` 来定位要弹出的元素 ::" + +#: ../../library/collections.rst:709 +msgid "" +"def delete_nth(d, n):\n" +" d.rotate(-n)\n" +" d.popleft()\n" +" d.rotate(n)" +msgstr "" +"def delete_nth(d, n):\n" +" d.rotate(-n)\n" +" d.popleft()\n" +" d.rotate(n)" + +#: ../../library/collections.rst:714 +msgid "" +"To implement :class:`deque` slicing, use a similar approach applying " +":meth:`~deque.rotate` to bring a target element to the left side of the " +"deque. Remove old entries with :meth:`~deque.popleft`, add new entries with " +":meth:`~deque.extend`, and then reverse the rotation. With minor variations " +"on that approach, it is easy to implement Forth style stack manipulations " +"such as ``dup``, ``drop``, ``swap``, ``over``, ``pick``, ``rot``, and " +"``roll``." +msgstr "" +"要实现 :class:`deque` 切片, 使用一个类似的方法,应用 :meth:`~deque.rotate` 将目标元素放到左边。通过 " +":meth:`~deque.popleft` 移去老的条目(entries),通过 :meth:`~deque.extend` 添加新的条目, 然后反向" +" rotate。基于这种方法的微小变化,很容易实现 Forth 风格的栈操作,诸如 ``dup``, ``drop``, ``swap``, " +"``over``, ``pick``, ``rot``, 和 ``roll`` 。" + +#: ../../library/collections.rst:724 +msgid ":class:`defaultdict` objects" +msgstr ":class:`defaultdict` 对象" + +#: ../../library/collections.rst:730 +msgid "" +"Return a new dictionary-like object. :class:`defaultdict` is a subclass of " +"the built-in :class:`dict` class. It overrides one method and adds one " +"writable instance variable. The remaining functionality is the same as for " +"the :class:`dict` class and is not documented here." +msgstr "" +"返回一个新的类似字典的对象。 :class:`defaultdict` 是内置 :class:`dict` 类的子类。 " +"它重写了一个方法并添加了一个可写的实例变量。 其余的功能与 :class:`dict` 类相同因而不在此文档中写明。" + +#: ../../library/collections.rst:735 +msgid "" +"The first argument provides the initial value for the " +":attr:`default_factory` attribute; it defaults to ``None``. All remaining " +"arguments are treated the same as if they were passed to the :class:`dict` " +"constructor, including keyword arguments." +msgstr "" +"本对象包含一个名为 :attr:`default_factory` 的属性,构造时,第一个参数用于为该属性提供初始值,默认为 " +"``None``。所有其他参数(包括关键字参数)都相当于传递给 :class:`dict` 的构造函数。" + +#: ../../library/collections.rst:740 +msgid "" +":class:`!defaultdict`\\s are :ref:`generic ` over two types, " +"signifying (respectively) the types of the dictionary's keys and values." +msgstr "" + +#: ../../library/collections.rst:744 +msgid "" +":class:`defaultdict` objects support the following method in addition to the" +" standard :class:`dict` operations:" +msgstr ":class:`defaultdict` 对象除了支持标准 :class:`dict` 的操作,还支持以下方法作为扩展:" + +#: ../../library/collections.rst:749 +msgid "" +"If the :attr:`default_factory` attribute is ``None``, this raises a " +":exc:`KeyError` exception with the *key* as argument." +msgstr "" +"如果 :attr:`default_factory` 属性为 ``None``,则调用本方法会抛出 :exc:`KeyError` 异常,附带参数 " +"*key*。" + +#: ../../library/collections.rst:752 +msgid "" +"If :attr:`default_factory` is not ``None``, it is called without arguments " +"to provide a default value for the given *key*, this value is inserted in " +"the dictionary for the *key*, and returned." +msgstr "" +"如果 :attr:`default_factory` 不为 ``None``,则它会被(不带参数地)调用来为 *key* 提供一个默认值,这个值和 " +"*key* 作为一对键值对被插入到字典中,并作为本方法的返回值返回。" + +#: ../../library/collections.rst:756 +msgid "" +"If calling :attr:`default_factory` raises an exception this exception is " +"propagated unchanged." +msgstr "如果调用 :attr:`default_factory` 时抛出了异常,这个异常会原封不动地向外层传递。" + +#: ../../library/collections.rst:759 +msgid "" +"This method is called by the :meth:`~object.__getitem__` method of the " +":class:`dict` class when the requested key is not found; whatever it returns" +" or raises is then returned or raised by :meth:`~object.__getitem__`." +msgstr "" +"当请求的键未找到时本方法会被 :class:`dict` 类的 :meth:`~object.__getitem__` " +"方法调用;它返回或引发的任何对象都会被 :meth:`~object.__getitem__` 返回或引发。" + +#: ../../library/collections.rst:763 +msgid "" +"Note that :meth:`__missing__` is *not* called for any operations besides " +":meth:`~object.__getitem__`. This means that :meth:`~dict.get` will, like " +"normal dictionaries, return ``None`` as a default rather than using " +":attr:`default_factory`." +msgstr "" +"请注意除了 :meth:`~object.__getitem__` 以外 :meth:`__missing__` 将 *不会* 被调用以执行任何操作。 " +"这意味着 :meth:`~dict.get` 会像普通字典一样返回 ``None`` 作为默认值而不是使用 " +":attr:`default_factory`。" + +#: ../../library/collections.rst:769 +msgid ":class:`defaultdict` objects support the following instance variable:" +msgstr ":class:`defaultdict` 对象支持以下实例变量:" + +#: ../../library/collections.rst:774 +msgid "" +"This attribute is used by the :meth:`~defaultdict.__missing__` method; it is" +" initialized from the first argument to the constructor, if present, or to " +"``None``, if absent." +msgstr "" +"本属性由 :meth:`~defaultdict.__missing__` " +"方法来调用。如果构造对象时提供了第一个参数,则本属性会被初始化成那个参数,如果未提供第一个参数,则本属性为 ``None``。" + +#: ../../library/collections.rst:778 ../../library/collections.rst:1207 +msgid "" +"Added merge (``|``) and update (``|=``) operators, specified in :pep:`584`." +msgstr "增加了合并 (``|``) 与更新 (``|=``) 运算符,相关说明见 :pep:`584`。" + +#: ../../library/collections.rst:784 +msgid ":class:`defaultdict` Examples" +msgstr ":class:`defaultdict` 例子" + +#: ../../library/collections.rst:786 +msgid "" +"Using :class:`list` as the :attr:`~defaultdict.default_factory`, it is easy " +"to group a sequence of key-value pairs into a dictionary of lists:" +msgstr "" +"使用 :class:`list` 作为 " +":attr:`~defaultdict.default_factory`,很轻松地将(键-值对组成的)序列转换为(键-列表组成的)字典:" + +#: ../../library/collections.rst:797 +msgid "" +"When each key is encountered for the first time, it is not already in the " +"mapping; so an entry is automatically created using the " +":attr:`~defaultdict.default_factory` function which returns an empty " +":class:`list`. The :meth:`list.append` operation then attaches the value to" +" the new list. When keys are encountered again, the look-up proceeds " +"normally (returning the list for that key) and the :meth:`list.append` " +"operation adds another value to the list. This technique is simpler and " +"faster than an equivalent technique using :meth:`dict.setdefault`:" +msgstr "" +"当每个键首次被遇到时,它还不在映射之中;所以会使用 :attr:`~defaultdict.default_factory` " +"函数自动创建一个条目,该函数返回一个空的 :class:`list`。 随后将使用 :meth:`list.append` 操作将值添加到这个新列表中。" +" 当再次遇到该键时,将正常地执行查找并且 :meth:`list.append` 操作会将另一个值添加到列表中。 这个做法相比使用 " +":meth:`dict.setdefault` 的等价做法更简单更快速:" + +#: ../../library/collections.rst:812 +msgid "" +"Setting the :attr:`~defaultdict.default_factory` to :class:`int` makes the " +":class:`defaultdict` useful for counting (like a bag or multiset in other " +"languages):" +msgstr "" +"设置 :attr:`~defaultdict.default_factory` 为 :class:`int`,使 " +":class:`defaultdict` 用于计数(类似其他语言中的 bag 或 multiset):" + +#: ../../library/collections.rst:824 +msgid "" +"When a letter is first encountered, it is missing from the mapping, so the " +":attr:`~defaultdict.default_factory` function calls :func:`int` to supply a " +"default count of zero. The increment operation then builds up the count for" +" each letter." +msgstr "" +"当一个字母首次遇到时,它会查询失败,则 :attr:`~defaultdict.default_factory` 会调用 :func:`int` " +"来提供一个整数 0 作为默认值。后续的自增操作建立起对每个字母的计数。" + +#: ../../library/collections.rst:828 +msgid "" +"The function :func:`int` which always returns zero is just a special case of" +" constant functions. A faster and more flexible way to create constant " +"functions is to use a lambda function which can supply any constant value " +"(not just zero):" +msgstr "" +"函数 :func:`int` 总是返回 0,这是常数函数的特殊情况。一个更快和灵活的方法是使用 lambda 函数,可以提供任何常量值(不只是0):" + +#: ../../library/collections.rst:841 +msgid "" +"Setting the :attr:`~defaultdict.default_factory` to :class:`set` makes the " +":class:`defaultdict` useful for building a dictionary of sets:" +msgstr "" +"设置 :attr:`~defaultdict.default_factory` 为 :class:`set` 使 " +":class:`defaultdict` 用于构建 set 集合:" + +#: ../../library/collections.rst:854 +msgid ":func:`namedtuple` Factory Function for Tuples with Named Fields" +msgstr ":func:`namedtuple` 命名元组的工厂函数" + +#: ../../library/collections.rst:856 +msgid "" +"Named tuples assign meaning to each position in a tuple and allow for more " +"readable, self-documenting code. They can be used wherever regular tuples " +"are used, and they add the ability to access fields by name instead of " +"position index." +msgstr "命名元组赋予每个位置一个含义,提供可读性和自文档性。它们可以用于任何普通元组,并添加了通过名字获取值的能力,通过索引值也是可以的。" + +#: ../../library/collections.rst:862 +msgid "" +"Returns a new tuple subclass named *typename*. The new subclass is used to " +"create tuple-like objects that have fields accessible by attribute lookup as" +" well as being indexable and iterable. Instances of the subclass also have " +"a helpful docstring (with *typename* and *field_names*) and a helpful " +":meth:`~object.__repr__` method which lists the tuple contents in a " +"``name=value`` format." +msgstr "" +"返回一个新的名为 *typename* 的元组子类。 这个新子类将被用于创建具有即可通过索引和迭代又可通过属性查找来访问的字段的元组型对象。 " +"这样的子类实例还将具有文档字符串 (包含 *typename* 和 *field_names*) 和以 ``name=value`` 格式列出元组内容的" +" :meth:`~object.__repr__` 方法以方便使用。" + +#: ../../library/collections.rst:869 +msgid "" +"The *field_names* are a sequence of strings such as ``['x', 'y']``. " +"Alternatively, *field_names* can be a single string with each fieldname " +"separated by whitespace and/or commas, for example ``'x y'`` or ``'x, y'``." +msgstr "" +"*field_names* 是一个像 ``[‘x’, ‘y’]`` 一样的字符串序列。另外 *field_names* " +"可以是一个纯字符串,用空白或逗号分隔开元素名,比如 ``'x y'`` 或者 ``'x, y'`` 。" + +#: ../../library/collections.rst:873 +msgid "" +"Any valid Python identifier may be used for a fieldname except for names " +"starting with an underscore. Valid identifiers consist of letters, digits, " +"and underscores but do not start with a digit or underscore and cannot be a " +":mod:`keyword` such as *class*, *for*, *return*, *global*, *pass*, or " +"*raise*." +msgstr "" +"任何有效的 Python 标识符都可以作为字段名,除了下划线开头的那些。有效标识符由字母,数字,下划线组成,但首字母不能是数字或下划线,另外不能是关键词" +" :mod:`keyword` 比如 *class*, *for*, *return*, *global*, *pass*, 或 *raise* 。" + +#: ../../library/collections.rst:879 +msgid "" +"If *rename* is true, invalid fieldnames are automatically replaced with " +"positional names. For example, ``['abc', 'def', 'ghi', 'abc']`` is " +"converted to ``['abc', '_1', 'ghi', '_3']``, eliminating the keyword ``def``" +" and the duplicate fieldname ``abc``." +msgstr "" +"如果 *rename* 为真, 无效字段名会自动转换成位置名。比如 ``['abc', 'def', 'ghi', 'abc']`` 转换成 " +"``['abc', '_1', 'ghi', '_3']`` , 消除关键词 ``def`` 和重复字段名 ``abc`` 。" + +#: ../../library/collections.rst:884 +msgid "" +"*defaults* can be ``None`` or an :term:`iterable` of default values. Since " +"fields with a default value must come after any fields without a default, " +"the *defaults* are applied to the rightmost parameters. For example, if the" +" fieldnames are ``['x', 'y', 'z']`` and the defaults are ``(1, 2)``, then " +"``x`` will be a required argument, ``y`` will default to ``1``, and ``z`` " +"will default to ``2``." +msgstr "" +"*defaults* 可以为 ``None`` 或者是一个默认值的 :term:`iterable` " +"。由于带有默认值的字段必须在没有默认值的字段之后,*defaults* 会应用到最右边的参数。比如如果字段名为 ``['x', 'y', 'z']`` " +"而默认值为 ``(1, 2)`` ,那么 ``x`` 就必须指定一个参数值 ,``y`` 默认值为 ``1`` , ``z`` 默认值为 ``2`` 。" + +#: ../../library/collections.rst:891 +msgid "" +"If *module* is defined, the :attr:`~type.__module__` attribute of the named " +"tuple is set to that value." +msgstr "如果定义了 *module*,则命名元组的 :attr:`~type.__module__` 属性将被设为该值。" + +#: ../../library/collections.rst:894 +msgid "" +"Named tuple instances do not have per-instance dictionaries, so they are " +"lightweight and require no more memory than regular tuples." +msgstr "具名元组实例毋需字典来保存每个实例的不同属性,所以它们轻量,占用的内存和普通元组一样。" + +#: ../../library/collections.rst:897 +msgid "" +"To support pickling, the named tuple class should be assigned to a variable " +"that matches *typename*." +msgstr "要支持封存操作,应当将命名元组类赋值给一个匹配 *typename* 的变量。" + +#: ../../library/collections.rst:900 +msgid "Added support for *rename*." +msgstr "添加了对 *rename* 的支持。" + +#: ../../library/collections.rst:903 +msgid "" +"The *verbose* and *rename* parameters became :ref:`keyword-only arguments " +"`." +msgstr "*verbose* 和 *rename* 参数成为 :ref:`仅限关键字参数 `." + +#: ../../library/collections.rst:907 +msgid "Added the *module* parameter." +msgstr "添加了 *module* 参数。" + +#: ../../library/collections.rst:910 +msgid "Removed the *verbose* parameter and the :attr:`!_source` attribute." +msgstr "移除了 *verbose* 形参和 :attr:`!_source` 属性。" + +#: ../../library/collections.rst:913 +msgid "" +"Added the *defaults* parameter and the " +":attr:`~somenamedtuple._field_defaults` attribute." +msgstr "添加了 *defaults* 形参和 :attr:`~somenamedtuple._field_defaults` 属性。" + +#: ../../library/collections.rst:917 +msgid "" +">>> # Basic example\n" +">>> Point = namedtuple('Point', ['x', 'y'])\n" +">>> p = Point(11, y=22) # instantiate with positional or keyword arguments\n" +">>> p[0] + p[1] # indexable like the plain tuple (11, 22)\n" +"33\n" +">>> x, y = p # unpack like a regular tuple\n" +">>> x, y\n" +"(11, 22)\n" +">>> p.x + p.y # fields also accessible by name\n" +"33\n" +">>> p # readable __repr__ with a name=value style\n" +"Point(x=11, y=22)" +msgstr "" +">>> # 基本示例\n" +">>> Point = namedtuple('Point', ['x', 'y'])\n" +">>> p = Point(11, y=22) # 使用位置或关键字参数进行实例化\n" +">>> p[0] + p[1] # 像普通元组 (11, 22) 一样可索引\n" +"33\n" +">>> x, y = p # 像普通元组一样解包\n" +">>> x, y\n" +"(11, 22)\n" +">>> p.x + p.y # 字段也可按名称访问\n" +"33\n" +">>> p # 名称=值 风格的易读的 __repr__\n" +"Point(x=11, y=22)" + +#: ../../library/collections.rst:933 +msgid "" +"Named tuples are especially useful for assigning field names to result " +"tuples returned by the :mod:`csv` or :mod:`sqlite3` modules::" +msgstr "命名元组尤其有用于为 :mod:`csv` 或 :mod:`sqlite3` 模块返回的结果元组赋予字段名::" + +#: ../../library/collections.rst:936 +msgid "" +"EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade')\n" +"\n" +"import csv\n" +"for emp in map(EmployeeRecord._make, csv.reader(open(\"employees.csv\", \"rb\"))):\n" +" print(emp.name, emp.title)\n" +"\n" +"import sqlite3\n" +"conn = sqlite3.connect('/companydata')\n" +"cursor = conn.cursor()\n" +"cursor.execute('SELECT name, age, title, department, paygrade FROM employees')\n" +"for emp in map(EmployeeRecord._make, cursor.fetchall()):\n" +" print(emp.name, emp.title)" +msgstr "" +"EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade')\n" +"\n" +"import csv\n" +"for emp in map(EmployeeRecord._make, csv.reader(open(\"employees.csv\", \"rb\"))):\n" +" print(emp.name, emp.title)\n" +"\n" +"import sqlite3\n" +"conn = sqlite3.connect('/companydata')\n" +"cursor = conn.cursor()\n" +"cursor.execute('SELECT name, age, title, department, paygrade FROM employees')\n" +"for emp in map(EmployeeRecord._make, cursor.fetchall()):\n" +" print(emp.name, emp.title)" + +#: ../../library/collections.rst:949 +msgid "" +"In addition to the methods inherited from tuples, named tuples support three" +" additional methods and two attributes. To prevent conflicts with field " +"names, the method and attribute names start with an underscore." +msgstr "除了继承元组的方法,命名元组还支持三个额外的方法和两个属性。为了防止字段名冲突,方法和属性以下划线开始。" + +#: ../../library/collections.rst:955 +msgid "" +"Class method that makes a new instance from an existing sequence or " +"iterable." +msgstr "类方法,从已有的序列或可迭代对象创建一个新实例。" + +#: ../../library/collections.rst:957 +msgid "" +">>> t = [11, 22]\n" +">>> Point._make(t)\n" +"Point(x=11, y=22)" +msgstr "" +">>> t = [11, 22]\n" +">>> Point._make(t)\n" +"Point(x=11, y=22)" + +#: ../../library/collections.rst:965 +msgid "" +"Return a new :class:`dict` which maps field names to their corresponding " +"values:" +msgstr "返回一个新的 :class:`dict` ,它将字段名称映射到它们对应的值:" + +#: ../../library/collections.rst:968 +msgid "" +">>> p = Point(x=11, y=22)\n" +">>> p._asdict()\n" +"{'x': 11, 'y': 22}" +msgstr "" +">>> p = Point(x=11, y=22)\n" +">>> p._asdict()\n" +"{'x': 11, 'y': 22}" + +#: ../../library/collections.rst:974 +msgid "Returns an :class:`OrderedDict` instead of a regular :class:`dict`." +msgstr "返回一个 :class:`OrderedDict` 而不是 :class:`dict` 。" + +#: ../../library/collections.rst:977 +msgid "" +"Returns a regular :class:`dict` instead of an :class:`OrderedDict`. As of " +"Python 3.7, regular dicts are guaranteed to be ordered. If the extra " +"features of :class:`OrderedDict` are required, the suggested remediation is " +"to cast the result to the desired type: ``OrderedDict(nt._asdict())``." +msgstr "" +"返回一个常规 :class:`dict` 而不是 :class:`OrderedDict`。 因为自 Python 3.7 起,常规字典已经保证有序。 " +"如果需要 :class:`OrderedDict` 的额外特性,推荐的解决方案是将结果转换为需要的类型: " +"``OrderedDict(nt._asdict())``。" + +#: ../../library/collections.rst:986 +msgid "" +"Return a new instance of the named tuple replacing specified fields with new" +" values::" +msgstr "返回一个新的命名元组实例,并将指定域替换为新的值 ::" + +#: ../../library/collections.rst:989 +msgid "" +">>> p = Point(x=11, y=22)\n" +">>> p._replace(x=33)\n" +"Point(x=33, y=22)\n" +"\n" +">>> for partnum, record in inventory.items():\n" +"... inventory[partnum] = record._replace(price=newprices[partnum], timestamp=time.now())" +msgstr "" +">>> p = Point(x=11, y=22)\n" +">>> p._replace(x=33)\n" +"Point(x=33, y=22)\n" +"\n" +">>> for partnum, record in inventory.items():\n" +"... inventory[partnum] = record._replace(price=newprices[partnum], timestamp=time.now())" + +#: ../../library/collections.rst:996 +msgid "" +"Named tuples are also supported by generic function :func:`copy.replace`." +msgstr "泛型函数 :func:`copy.replace` 也支持具名元组。" + +#: ../../library/collections.rst:998 +msgid "" +"Raise :exc:`TypeError` instead of :exc:`ValueError` for invalid keyword " +"arguments." +msgstr "对于无效的关键字参数将引发 :exc:`TypeError` 而不是 :exc:`ValueError`。" + +#: ../../library/collections.rst:1004 +msgid "" +"Tuple of strings listing the field names. Useful for introspection and for " +"creating new named tuple types from existing named tuples." +msgstr "字符串元组列出了字段名。用于内省以及从现有命名元组创建一个新的命名元组类型。" + +#: ../../library/collections.rst:1007 +msgid "" +">>> p._fields # view the field names\n" +"('x', 'y')\n" +"\n" +">>> Color = namedtuple('Color', 'red green blue')\n" +">>> Pixel = namedtuple('Pixel', Point._fields + Color._fields)\n" +">>> Pixel(11, 22, 128, 255, 0)\n" +"Pixel(x=11, y=22, red=128, green=255, blue=0)" +msgstr "" +">>> p._fields # 查看字段名\n" +"('x', 'y')\n" +"\n" +">>> Color = namedtuple('Color', 'red green blue')\n" +">>> Pixel = namedtuple('Pixel', Point._fields + Color._fields)\n" +">>> Pixel(11, 22, 128, 255, 0)\n" +"Pixel(x=11, y=22, red=128, green=255, blue=0)" + +#: ../../library/collections.rst:1019 +msgid "Dictionary mapping field names to default values." +msgstr "字典将字段名称映射到默认值。" + +#: ../../library/collections.rst:1021 +msgid "" +">>> Account = namedtuple('Account', ['type', 'balance'], defaults=[0])\n" +">>> Account._field_defaults\n" +"{'balance': 0}\n" +">>> Account('premium')\n" +"Account(type='premium', balance=0)" +msgstr "" +">>> Account = namedtuple('Account', ['type', 'balance'], defaults=[0])\n" +">>> Account._field_defaults\n" +"{'balance': 0}\n" +">>> Account('premium')\n" +"Account(type='premium', balance=0)" + +#: ../../library/collections.rst:1029 +msgid "" +"To retrieve a field whose name is stored in a string, use the " +":func:`getattr` function:" +msgstr "要获取一个名称存储在字符串中的字段,使用 :func:`getattr` 函数:" + +#: ../../library/collections.rst:1035 +msgid "" +"To convert a dictionary to a named tuple, use the double-star-operator (as " +"described in :ref:`tut-unpacking-arguments`):" +msgstr "转换一个字典到命名元组,使用 ** 双星操作符(如 :ref:`tut-unpacking-arguments` 所述):" + +#: ../../library/collections.rst:1042 +msgid "" +"Since a named tuple is a regular Python class, it is easy to add or change " +"functionality with a subclass. Here is how to add a calculated field and a " +"fixed-width print format:" +msgstr "因为一个命名元组是一个正常的 Python 类,它可以很容易的通过子类更改功能。这里是如何添加一个计算域和定宽输出打印格式:" + +#: ../../library/collections.rst:1046 +msgid "" +">>> class Point(namedtuple('Point', ['x', 'y'])):\n" +"... __slots__ = ()\n" +"... @property\n" +"... def hypot(self):\n" +"... return (self.x ** 2 + self.y ** 2) ** 0.5\n" +"... def __str__(self):\n" +"... return 'Point: x=%6.3f y=%6.3f hypot=%6.3f' % (self.x, self.y, self.hypot)\n" +"\n" +">>> for p in Point(3, 4), Point(14, 5/7):\n" +"... print(p)\n" +"Point: x= 3.000 y= 4.000 hypot= 5.000\n" +"Point: x=14.000 y= 0.714 hypot=14.018" +msgstr "" +">>> class Point(namedtuple('Point', ['x', 'y'])):\n" +"... __slots__ = ()\n" +"... @property\n" +"... def hypot(self):\n" +"... return (self.x ** 2 + self.y ** 2) ** 0.5\n" +"... def __str__(self):\n" +"... return 'Point: x=%6.3f y=%6.3f hypot=%6.3f' % (self.x, self.y, self.hypot)\n" +"\n" +">>> for p in Point(3, 4), Point(14, 5/7):\n" +"... print(p)\n" +"Point: x= 3.000 y= 4.000 hypot= 5.000\n" +"Point: x=14.000 y= 0.714 hypot=14.018" + +#: ../../library/collections.rst:1061 +msgid "" +"The subclass shown above sets ``__slots__`` to an empty tuple. This helps " +"keep memory requirements low by preventing the creation of instance " +"dictionaries." +msgstr "上面的子类设置 ``__slots__`` 为一个空元组。通过阻止创建实例字典保持了较低的内存开销。" + +#: ../../library/collections.rst:1064 +msgid "" +"Subclassing is not useful for adding new, stored fields. Instead, simply " +"create a new named tuple type from the :attr:`~somenamedtuple._fields` " +"attribute:" +msgstr "" +"子类化对于添加新的可存储字段是没有用的。应当通过 :attr:`~somenamedtuple._fields` 属性创建一个新的命名元组类型来实现:" + +#: ../../library/collections.rst:1069 +msgid "" +"Docstrings can be customized by making direct assignments to the ``__doc__``" +" fields:" +msgstr "文档字符串可以自定义,通过直接赋值给 ``__doc__`` 属性:" + +#: ../../library/collections.rst:1078 +msgid "Property docstrings became writeable." +msgstr "特征属性的文档字符串变为可写。" + +#: ../../library/collections.rst:1083 +msgid "" +"See :class:`typing.NamedTuple` for a way to add type hints for named tuples." +" It also provides an elegant notation using the :keyword:`class` keyword::" +msgstr "" +"请参阅 :class:`typing.NamedTuple` ,以获取为命名元组添加类型提示的方法。 它还使用 :keyword:`class` " +"关键字提供了一种优雅的符号::" + +#: ../../library/collections.rst:1087 +msgid "" +"class Component(NamedTuple):\n" +" part_number: int\n" +" weight: float\n" +" description: Optional[str] = None" +msgstr "" +"class Component(NamedTuple):\n" +" part_number: int\n" +" weight: float\n" +" description: Optional[str] = None" + +#: ../../library/collections.rst:1092 +msgid "" +"See :meth:`types.SimpleNamespace` for a mutable namespace based on an " +"underlying dictionary instead of a tuple." +msgstr "对于以字典为底层的可变命名空间,参考 :meth:`types.SimpleNamespace` 。" + +#: ../../library/collections.rst:1095 +msgid "" +"The :mod:`dataclasses` module provides a decorator and functions for " +"automatically adding generated special methods to user-defined classes." +msgstr ":mod:`dataclasses` 模块提供了一个装饰器和一些函数,用于自动将生成的特殊方法添加到用户定义的类中。" + +#: ../../library/collections.rst:1100 +msgid ":class:`OrderedDict` objects" +msgstr ":class:`OrderedDict` 对象" + +#: ../../library/collections.rst:1102 +msgid "" +"Ordered dictionaries are just like regular dictionaries but have some extra " +"capabilities relating to ordering operations. They have become less " +"important now that the built-in :class:`dict` class gained the ability to " +"remember insertion order (this new behavior became guaranteed in Python " +"3.7)." +msgstr "" +"有序词典就像常规词典一样,但有一些与排序操作相关的额外功能。由于内置的 :class:`dict` 类获得了记住插入顺序的能力(在 Python 3.7" +" 中保证了这种新行为),它们变得不那么重要了。" + +#: ../../library/collections.rst:1108 +msgid "Some differences from :class:`dict` still remain:" +msgstr "一些与 :class:`dict` 的不同仍然存在:" + +#: ../../library/collections.rst:1110 +msgid "" +"The regular :class:`dict` was designed to be very good at mapping " +"operations. Tracking insertion order was secondary." +msgstr "常规的 :class:`dict` 被设计为非常擅长映射操作。 跟踪插入顺序是次要的。" + +#: ../../library/collections.rst:1113 +msgid "" +"The :class:`OrderedDict` was designed to be good at reordering operations. " +"Space efficiency, iteration speed, and the performance of update operations " +"were secondary." +msgstr ":class:`OrderedDict` 旨在擅长重新排序操作。 空间效率、迭代速度和更新操作的性能是次要的。" + +#: ../../library/collections.rst:1117 +msgid "" +"The :class:`OrderedDict` algorithm can handle frequent reordering operations" +" better than :class:`dict`. As shown in the recipes below, this makes it " +"suitable for implementing various kinds of LRU caches." +msgstr "" +":class:`OrderedDict` 算法能比 :class:`dict` 更好地处理频繁的重排序操作。 如下面的例程所示,这使得它更适用于实现各种" +" LRU 缓存。" + +#: ../../library/collections.rst:1121 +msgid "" +"The equality operation for :class:`OrderedDict` checks for matching order." +msgstr "对于 :class:`OrderedDict` ,相等操作检查匹配顺序。" + +#: ../../library/collections.rst:1123 +msgid "" +"A regular :class:`dict` can emulate the order sensitive equality test with " +"``p == q and all(k1 == k2 for k1, k2 in zip(p, q))``." +msgstr "" +"常规的 :class:`dict` 可以使用 ``p == q and all(k1 == k2 for k1, k2 in zip(p, q))`` " +"进行模拟顺序相等性测试。" + +#: ../../library/collections.rst:1126 +msgid "" +"The :meth:`~OrderedDict.popitem` method of :class:`OrderedDict` has a " +"different signature. It accepts an optional argument to specify which item " +"is popped." +msgstr "" +":class:`OrderedDict` 的 :meth:`~OrderedDict.popitem` 方法具有不同的签名。 " +"它接受一个可选参数来指定要弹出哪一项。" + +#: ../../library/collections.rst:1129 +msgid "" +"A regular :class:`dict` can emulate OrderedDict's ``od.popitem(last=True)`` " +"with ``d.popitem()`` which is guaranteed to pop the rightmost (last) item." +msgstr "" +"常规的 :class:`dict` 可以使用 ``d.popitem()`` 模拟 OrderedDict 的 " +"``od.popitem(last=True)``,其保证会返回最右边(最后)的项。" + +#: ../../library/collections.rst:1132 +msgid "" +"A regular :class:`dict` can emulate OrderedDict's ``od.popitem(last=False)``" +" with ``(k := next(iter(d)), d.pop(k))`` which will return and remove the " +"leftmost (first) item if it exists." +msgstr "" +"常规的 :class:`dict` 可以通过 ``(k := next(iter(d)), d.pop(k))`` 来模拟 OrderedDict 的 " +"``od.popitem(last=False)``,它将返回并移除最左边(开头)的条目,如果条目存在的话。" + +#: ../../library/collections.rst:1136 +msgid "" +":class:`OrderedDict` has a :meth:`~OrderedDict.move_to_end` method to " +"efficiently reposition an element to an endpoint." +msgstr "" +":class:`OrderedDict` 具有一个 :meth:`~OrderedDict.move_to_end` 方法以高效地将元素移到任一端点。" + +#: ../../library/collections.rst:1139 +msgid "" +"A regular :class:`dict` can emulate OrderedDict's ``od.move_to_end(k, " +"last=True)`` with ``d[k] = d.pop(k)`` which will move the key and its " +"associated value to the rightmost (last) position." +msgstr "" +"常规的 :class:`dict` 可以通过 ``d[k] = d.pop(k)`` 来模拟 OrderedDict 的 " +"``od.move_to_end(k, last=True)``,它将把键及其所关联的值移到最右边(末尾)的位置。" + +#: ../../library/collections.rst:1143 +msgid "" +"A regular :class:`dict` does not have an efficient equivalent for " +"OrderedDict's ``od.move_to_end(k, last=False)`` which moves the key and its " +"associated value to the leftmost (first) position." +msgstr "" +"常规的 :class:`dict` 没有 OrderedDict 的 ``od.move_to_end(k, last=False)`` " +"的高效等价物,它会把键及其所关联的值移到最左边(开头)的位置。" + +#: ../../library/collections.rst:1147 +msgid "" +"Until Python 3.8, :class:`dict` lacked a :meth:`~object.__reversed__` " +"method." +msgstr "在 Python 3.8 之前,:class:`dict` 都缺少 :meth:`~object.__reversed__` 方法。" + +#: ../../library/collections.rst:1154 +msgid "" +"Return an instance of a :class:`dict` subclass that has methods specialized " +"for rearranging dictionary order." +msgstr "返回一个 :class:`dict` 子类的实例,它具有专门用于重新排列字典顺序的方法。" + +#: ../../library/collections.rst:1161 +msgid "" +"The :meth:`popitem` method for ordered dictionaries returns and removes a " +"(key, value) pair. The pairs are returned in :abbr:`LIFO (last-in, first-" +"out)` order if *last* is true or :abbr:`FIFO (first-in, first-out)` order if" +" false." +msgstr "" +"有序字典的 :meth:`popitem` 方法移除并返回一个 (key, value) 键值对。 如果 *last* 值为真,则按 " +":abbr:`LIFO (last-in, first-out)` 后进先出的顺序返回键值对,否则就按 :abbr:`FIFO (first-in, " +"first-out)` 先进先出的顺序返回键值对。" + +#: ../../library/collections.rst:1168 +msgid "" +"Move an existing *key* to either end of an ordered dictionary. The item is " +"moved to the right end if *last* is true (the default) or to the beginning " +"if *last* is false. Raises :exc:`KeyError` if the *key* does not exist:" +msgstr "" +"将一个现有的 *key* 移到有序字典的任一端。 如果 *last* 为真值(默认)则将条目移到右端,或者如果 *last* 为假值则将条目移到开头。 " +"如果 *key* 不存在则会引发 :exc:`KeyError`:" + +#: ../../library/collections.rst:1173 +msgid "" +">>> d = OrderedDict.fromkeys('abcde')\n" +">>> d.move_to_end('b')\n" +">>> ''.join(d)\n" +"'acdeb'\n" +">>> d.move_to_end('b', last=False)\n" +">>> ''.join(d)\n" +"'bacde'" +msgstr "" +">>> d = OrderedDict.fromkeys('abcde')\n" +">>> d.move_to_end('b')\n" +">>> ''.join(d)\n" +"'acdeb'\n" +">>> d.move_to_end('b', last=False)\n" +">>> ''.join(d)\n" +"'bacde'" + +#: ../../library/collections.rst:1185 +msgid "" +"In addition to the usual mapping methods, ordered dictionaries also support " +"reverse iteration using :func:`reversed`." +msgstr "相对于通常的映射方法,有序字典还另外提供了逆序迭代的支持,通过 :func:`reversed` 。" + +#: ../../library/collections.rst:1190 +msgid "" +"Equality tests between :class:`OrderedDict` objects are order-sensitive and " +"are roughly equivalent to ``list(od1.items())==list(od2.items())``." +msgstr "" +":class:`OrderedDict` 对象之间的相等性检测对顺序敏感并且大致等价于 " +"``list(od1.items())==list(od2.items())``。" + +#: ../../library/collections.rst:1193 +msgid "" +"Equality tests between :class:`OrderedDict` objects and other " +":class:`~collections.abc.Mapping` objects are order-insensitive like regular" +" dictionaries. This allows :class:`OrderedDict` objects to be substituted " +"anywhere a regular dictionary is used." +msgstr "" +":class:`OrderedDict` 对象和其他 :class:`~collections.abc.Mapping` " +"对象之间的相等性检测像常规字典那样对顺序不敏感。 这允许 :class:`OrderedDict` 对象在任何可使用字典的地方被替代。" + +#: ../../library/collections.rst:1198 +msgid "" +"The items, keys, and values :term:`views ` of " +":class:`OrderedDict` now support reverse iteration using :func:`reversed`." +msgstr "" +":class:`OrderedDict` 的项(item),键(key)和值(value) :term:`视图 ` " +"现在支持逆序迭代,通过 :func:`reversed` 。" + +#: ../../library/collections.rst:1202 +msgid "" +"With the acceptance of :pep:`468`, order is retained for keyword arguments " +"passed to the :class:`OrderedDict` constructor and its :meth:`~dict.update` " +"method." +msgstr "" +"随着 :pep:`468` 的通过,传给 :class:`OrderedDict` 构造器及其 :meth:`~dict.update` " +"方法的关键字参数顺序将被保留。" + +#: ../../library/collections.rst:1212 +msgid ":class:`OrderedDict` Examples and Recipes" +msgstr ":class:`OrderedDict` 例子和用法" + +#: ../../library/collections.rst:1214 +msgid "" +"It is straightforward to create an ordered dictionary variant that remembers" +" the order the keys were *last* inserted. If a new entry overwrites an " +"existing entry, the original insertion position is changed and moved to the " +"end::" +msgstr "创建记住键值 *最后* 插入顺序的有序字典变体很简单。 如果新条目覆盖现有条目,则原始插入位置将更改并移至末尾::" + +#: ../../library/collections.rst:1219 +msgid "" +"class LastUpdatedOrderedDict(OrderedDict):\n" +" 'Store items in the order the keys were last added'\n" +"\n" +" def __setitem__(self, key, value):\n" +" super().__setitem__(key, value)\n" +" self.move_to_end(key)" +msgstr "" +"class LastUpdatedOrderedDict(OrderedDict):\n" +" 'Store items in the order the keys were last added'\n" +"\n" +" def __setitem__(self, key, value):\n" +" super().__setitem__(key, value)\n" +" self.move_to_end(key)" + +#: ../../library/collections.rst:1226 +msgid "" +"An :class:`OrderedDict` would also be useful for implementing variants of " +":func:`functools.lru_cache`:" +msgstr "一个 :class:`OrderedDict` 对于实现 :func:`functools.lru_cache` 的变体也很有用:" + +#: ../../library/collections.rst:1229 +msgid "" +"from collections import OrderedDict\n" +"from time import monotonic\n" +"\n" +"class TimeBoundedLRU:\n" +" \"LRU Cache that invalidates and refreshes old entries.\"\n" +"\n" +" def __init__(self, func, maxsize=128, maxage=30):\n" +" self.cache = OrderedDict() # { args : (timestamp, result)}\n" +" self.func = func\n" +" self.maxsize = maxsize\n" +" self.maxage = maxage\n" +"\n" +" def __call__(self, *args):\n" +" if args in self.cache:\n" +" self.cache.move_to_end(args)\n" +" timestamp, result = self.cache[args]\n" +" if monotonic() - timestamp <= self.maxage:\n" +" return result\n" +" result = self.func(*args)\n" +" self.cache[args] = monotonic(), result\n" +" if len(self.cache) > self.maxsize:\n" +" self.cache.popitem(last=False)\n" +" return result" +msgstr "" + +#: ../../library/collections.rst:1256 +msgid "" +"class MultiHitLRUCache:\n" +" \"\"\" LRU cache that defers caching a result until\n" +" it has been requested multiple times.\n" +"\n" +" To avoid flushing the LRU cache with one-time requests,\n" +" we don't cache until a request has been made more than once.\n" +"\n" +" \"\"\"\n" +"\n" +" def __init__(self, func, maxsize=128, maxrequests=4096, cache_after=1):\n" +" self.requests = OrderedDict() # { uncached_key : request_count }\n" +" self.cache = OrderedDict() # { cached_key : function_result }\n" +" self.func = func\n" +" self.maxrequests = maxrequests # max number of uncached requests\n" +" self.maxsize = maxsize # max number of stored return values\n" +" self.cache_after = cache_after\n" +"\n" +" def __call__(self, *args):\n" +" if args in self.cache:\n" +" self.cache.move_to_end(args)\n" +" return self.cache[args]\n" +" result = self.func(*args)\n" +" self.requests[args] = self.requests.get(args, 0) + 1\n" +" if self.requests[args] <= self.cache_after:\n" +" self.requests.move_to_end(args)\n" +" if len(self.requests) > self.maxrequests:\n" +" self.requests.popitem(last=False)\n" +" else:\n" +" self.requests.pop(args, None)\n" +" self.cache[args] = result\n" +" if len(self.cache) > self.maxsize:\n" +" self.cache.popitem(last=False)\n" +" return result" +msgstr "" +"class MultiHitLRUCache:\n" +" \"\"\" LRU cache that defers caching a result until\n" +" it has been requested multiple times.\n" +"\n" +" To avoid flushing the LRU cache with one-time requests,\n" +" we don't cache until a request has been made more than once.\n" +"\n" +" \"\"\"\n" +"\n" +" def __init__(self, func, maxsize=128, maxrequests=4096, cache_after=1):\n" +" self.requests = OrderedDict() # { uncached_key : request_count }\n" +" self.cache = OrderedDict() # { cached_key : function_result }\n" +" self.func = func\n" +" self.maxrequests = maxrequests # 未缓存请求的最大数量\n" +" self.maxsize = maxsize # 已存储返回值的最大数量\n" +" self.cache_after = cache_after\n" +"\n" +" def __call__(self, *args):\n" +" if args in self.cache:\n" +" self.cache.move_to_end(args)\n" +" return self.cache[args]\n" +" result = self.func(*args)\n" +" self.requests[args] = self.requests.get(args, 0) + 1\n" +" if self.requests[args] <= self.cache_after:\n" +" self.requests.move_to_end(args)\n" +" if len(self.requests) > self.maxrequests:\n" +" self.requests.popitem(last=False)\n" +" else:\n" +" self.requests.pop(args, None)\n" +" self.cache[args] = result\n" +" if len(self.cache) > self.maxsize:\n" +" self.cache.popitem(last=False)\n" +" return result" + +#: ../../library/collections.rst:1325 +msgid ":class:`UserDict` objects" +msgstr ":class:`UserDict` 对象" + +#: ../../library/collections.rst:1327 +msgid "" +"The class, :class:`UserDict` acts as a wrapper around dictionary objects. " +"The need for this class has been partially supplanted by the ability to " +"subclass directly from :class:`dict`; however, this class can be easier to " +"work with because the underlying dictionary is accessible as an attribute." +msgstr "" +":class:`UserDict` 类是用作字典对象的外包装。对这个类的需求已部分由直接创建 :class:`dict` " +"的子类的功能所替代;不过,这个类处理起来更容易,因为底层的字典可以作为属性来访问。" + +#: ../../library/collections.rst:1337 +msgid "" +"Class that simulates a dictionary. The instance's contents are kept in a " +"regular dictionary, which is accessible via the :attr:`data` attribute of " +":class:`!UserDict` instances. If arguments are provided, they are used to " +"initialize :attr:`data`, like a regular dictionary." +msgstr "" + +#: ../../library/collections.rst:1342 +msgid "" +"In addition to supporting the methods and operations of mappings, " +":class:`!UserDict` instances provide the following attribute:" +msgstr "" + +#: ../../library/collections.rst:1347 +msgid "" +"A real dictionary used to store the contents of the :class:`UserDict` class." +msgstr "一个真实的字典,用于保存 :class:`UserDict` 类的内容。" + +#: ../../library/collections.rst:1353 +msgid ":class:`UserList` objects" +msgstr ":class:`UserList` 对象" + +#: ../../library/collections.rst:1355 +msgid "" +"This class acts as a wrapper around list objects. It is a useful base class" +" for your own list-like classes which can inherit from them and override " +"existing methods or add new ones. In this way, one can add new behaviors to" +" lists." +msgstr "" +"这个类封装了列表对象。它是一个有用的基础类,对于你想自定义的类似列表的类,可以继承和覆盖现有的方法,也可以添加新的方法。这样我们可以对列表添加新的行为。" + +#: ../../library/collections.rst:1360 +msgid "" +"The need for this class has been partially supplanted by the ability to " +"subclass directly from :class:`list`; however, this class can be easier to " +"work with because the underlying list is accessible as an attribute." +msgstr "" +"对这个类的需求已部分由直接创建 :class:`list` 的子类的功能所替代;不过,这个类处理起来更容易,因为底层的列表可以作为属性来访问。" + +#: ../../library/collections.rst:1366 +msgid "" +"Class that simulates a list. The instance's contents are kept in a regular " +"list, which is accessible via the :attr:`data` attribute of " +":class:`UserList` instances. The instance's contents are initially set to a" +" copy of *list*, defaulting to the empty list ``[]``. *list* can be any " +"iterable, for example a real Python list or a :class:`UserList` object." +msgstr "" +"模拟一个列表。这个实例的内容被保存为一个正常列表,通过 :class:`UserList` 的 :attr:`data` " +"属性存取。实例内容被初始化为一个 *list* 的copy,默认为 ``[]`` 空列表。 *list* 可以是迭代对象,比如一个 Python " +"列表,或者一个 :class:`UserList` 对象。" + +#: ../../library/collections.rst:1372 +msgid "" +"In addition to supporting the methods and operations of mutable sequences, " +":class:`UserList` instances provide the following attribute:" +msgstr ":class:`UserList` 提供了以下属性作为可变序列的方法和操作的扩展:" + +#: ../../library/collections.rst:1377 +msgid "" +"A real :class:`list` object used to store the contents of the " +":class:`UserList` class." +msgstr "一个 :class:`list` 对象用于存储 :class:`UserList` 的内容。" + +#: ../../library/collections.rst:1380 +msgid "" +"**Subclassing requirements:** Subclasses of :class:`UserList` are expected " +"to offer a constructor which can be called with either no arguments or one " +"argument. List operations which return a new sequence attempt to create an " +"instance of the actual implementation class. To do so, it assumes that the " +"constructor can be called with a single parameter, which is a sequence " +"object used as a data source." +msgstr "" +"**子类化的要求:** :class:`UserList` " +"的子类需要提供一个构造器,可以无参数调用,或者一个参数调用。返回一个新序列的列表操作需要创建一个实现类的实例。它假定了构造器可以以一个参数进行调用,这个参数是一个序列对象,作为数据源。" + +#: ../../library/collections.rst:1387 +msgid "" +"If a derived class does not wish to comply with this requirement, all of the" +" special methods supported by this class will need to be overridden; please " +"consult the sources for information about the methods which need to be " +"provided in that case." +msgstr "如果一个派生类不希望遵从这个要求,所有的特殊方法就必须重写;请参照源代码了解哪些方法需要提供。" + +#: ../../library/collections.rst:1393 +msgid ":class:`UserString` objects" +msgstr ":class:`UserString` 对象" + +#: ../../library/collections.rst:1395 +msgid "" +"The class, :class:`UserString` acts as a wrapper around string objects. The " +"need for this class has been partially supplanted by the ability to subclass" +" directly from :class:`str`; however, this class can be easier to work with " +"because the underlying string is accessible as an attribute." +msgstr "" +":class:`UserString` 类是用作字符串对象的外包装。对这个类的需求已部分由直接创建 :class:`str` " +"的子类的功能所替代;不过,这个类处理起来更容易,因为底层的字符串可以作为属性来访问。" + +#: ../../library/collections.rst:1403 +msgid "" +"Class that simulates a string object. The instance's content is kept in a " +"regular string object, which is accessible via the :attr:`data` attribute of" +" :class:`UserString` instances. The instance's contents are initially set " +"to a copy of *seq*. The *seq* argument can be any object which can be " +"converted into a string using the built-in :func:`str` function." +msgstr "" +"模拟一个字符串对象。这个实例对象的内容保存为一个正常字符串,通过 :class:`UserString` 的 :attr:`data` " +"属性存取。实例内容初始化设置为 *seq* 的copy。*seq* 参数可以是任何可通过内建 :func:`str` 函数转换为字符串的对象。" + +#: ../../library/collections.rst:1410 +msgid "" +"In addition to supporting the methods and operations of strings, " +":class:`UserString` instances provide the following attribute:" +msgstr ":class:`UserString` 提供了以下属性作为字符串方法和操作的额外支持:" + +#: ../../library/collections.rst:1415 +msgid "" +"A real :class:`str` object used to store the contents of the " +":class:`UserString` class." +msgstr "一个真正的 :class:`str` 对象用来存放 :class:`UserString` 类的内容。" + +#: ../../library/collections.rst:1418 +msgid "" +"New methods ``__getnewargs__``, ``__rmod__``, ``casefold``, ``format_map``, " +"``isprintable``, and ``maketrans``." +msgstr "" +"新方法 ``__getnewargs__``, ``__rmod__``, ``casefold``, ``format_map``, " +"``isprintable``, 和 ``maketrans``。" diff --git a/library/colorsys.po b/library/colorsys.po new file mode 100644 index 0000000000..a21d056981 --- /dev/null +++ b/library/colorsys.po @@ -0,0 +1,100 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/colorsys.rst:2 +msgid ":mod:`!colorsys` --- Conversions between color systems" +msgstr ":mod:`!colorsys` --- 颜色系统间的转换" + +#: ../../library/colorsys.rst:9 +msgid "**Source code:** :source:`Lib/colorsys.py`" +msgstr "**源代码:** :source:`Lib/colorsys.py`" + +#: ../../library/colorsys.rst:13 +msgid "" +"The :mod:`!colorsys` module defines bidirectional conversions of color " +"values between colors expressed in the RGB (Red Green Blue) color space used" +" in computer monitors and three other coordinate systems: YIQ, HLS (Hue " +"Lightness Saturation) and HSV (Hue Saturation Value). Coordinates in all of" +" these color spaces are floating-point values. In the YIQ space, the Y " +"coordinate is between 0 and 1, but the I and Q coordinates can be positive " +"or negative. In all other spaces, the coordinates are all between 0 and 1." +msgstr "" +":mod:`!colorsys` 模块定义了计算机显示器所用的 RGB (Red Green Blue) 色彩空间与三种其他色彩坐标系统 YIQ, " +"HLS (Hue Lightness Saturation) 和 HSV (Hue Saturation Value) 表示的颜色值之间的双向转换。 " +"所有这些色彩空间的坐标都使用浮点数值来表示。 在 YIQ 空间中,Y 坐标取值为 0 和 1 之间,而 I 和 Q 坐标均可以为正数或负数。 " +"在所有其他空间中,坐标取值均为 0 和 1 之间。" + +#: ../../library/colorsys.rst:23 +msgid "" +"More information about color spaces can be found at " +"https://poynton.ca/ColorFAQ.html and " +"https://www.cambridgeincolour.com/tutorials/color-spaces.htm." +msgstr "" +"有关色彩空间的更多信息可访问 https://poynton.ca/ColorFAQ.html 和 " +"https://www.cambridgeincolour.com/tutorials/color-spaces.htm。" + +#: ../../library/colorsys.rst:27 +msgid "The :mod:`!colorsys` module defines the following functions:" +msgstr ":mod:`!colorsys` 模块定义了下列函数:" + +#: ../../library/colorsys.rst:32 +msgid "Convert the color from RGB coordinates to YIQ coordinates." +msgstr "把颜色从 RGB 坐标转为 YIQ 坐标。" + +#: ../../library/colorsys.rst:37 +msgid "Convert the color from YIQ coordinates to RGB coordinates." +msgstr "把颜色从 YIQ 坐标转为 RGB 坐标。" + +#: ../../library/colorsys.rst:42 +msgid "Convert the color from RGB coordinates to HLS coordinates." +msgstr "把颜色从 RGB 坐标转为 HLS 坐标。" + +#: ../../library/colorsys.rst:47 +msgid "Convert the color from HLS coordinates to RGB coordinates." +msgstr "把颜色从 HLS 坐标转为 RGB 坐标。" + +#: ../../library/colorsys.rst:52 +msgid "Convert the color from RGB coordinates to HSV coordinates." +msgstr "把颜色从 RGB 坐标转为 HSV 坐标。" + +#: ../../library/colorsys.rst:57 +msgid "Convert the color from HSV coordinates to RGB coordinates." +msgstr "把颜色从 HSV 坐标转为 RGB 坐标。" + +#: ../../library/colorsys.rst:59 +msgid "Example::" +msgstr "示例::" + +#: ../../library/colorsys.rst:61 +msgid "" +">>> import colorsys\n" +">>> colorsys.rgb_to_hsv(0.2, 0.4, 0.4)\n" +"(0.5, 0.5, 0.4)\n" +">>> colorsys.hsv_to_rgb(0.5, 0.5, 0.4)\n" +"(0.2, 0.4, 0.4)" +msgstr "" +">>> import colorsys\n" +">>> colorsys.rgb_to_hsv(0.2, 0.4, 0.4)\n" +"(0.5, 0.5, 0.4)\n" +">>> colorsys.hsv_to_rgb(0.5, 0.5, 0.4)\n" +"(0.2, 0.4, 0.4)" diff --git a/library/compileall.po b/library/compileall.po new file mode 100644 index 0000000000..1c84547e8a --- /dev/null +++ b/library/compileall.po @@ -0,0 +1,491 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/compileall.rst:2 +msgid ":mod:`!compileall` --- Byte-compile Python libraries" +msgstr ":mod:`!compileall` --- 字节编译 Python 库" + +#: ../../library/compileall.rst:7 +msgid "**Source code:** :source:`Lib/compileall.py`" +msgstr "**源代码:** :source:`Lib/compileall.py`" + +#: ../../library/compileall.rst:11 +msgid "" +"This module provides some utility functions to support installing Python " +"libraries. These functions compile Python source files in a directory tree." +" This module can be used to create the cached byte-code files at library " +"installation time, which makes them available for use even by users who " +"don't have write permission to the library directories." +msgstr "" +"这个模块提供了一些工具函数来支持安装 Python 库。 这些函数可以编译一个目录树中的 Python 源文件。 " +"这个模块可被用来在安装库时创建缓存的字节码文件,这使得它们对于没有库目录写入权限的用户来说也是可用的。" + +#: ../../includes/wasm-notavail.rst:3 +msgid "Availability" +msgstr "可用性" + +#: ../../includes/wasm-notavail.rst:5 +msgid "" +"This module does not work or is not available on WebAssembly. See " +":ref:`wasm-availability` for more information." +msgstr "此模块在 WebAssembly 平台上无效或不可用。 请参阅 :ref:`wasm-availability` 了解详情。" + +#: ../../library/compileall.rst:22 +msgid "Command-line use" +msgstr "使用命令行" + +#: ../../library/compileall.rst:24 +msgid "" +"This module can work as a script (using :program:`python -m compileall`) to " +"compile Python sources." +msgstr "此模块可以作为脚本运行 (使用 :program:`python -m compileall`) 来编译 Python 源代码。" + +#: ../../library/compileall.rst:32 +msgid "" +"Positional arguments are files to compile or directories that contain source" +" files, traversed recursively. If no argument is given, behave as if the " +"command line was :samp:`-l {}`." +msgstr "" +"位置参数是要编译的文件或包含源文件的目录,目录将被递归地遍历。 如果没有给出参数,则其行为如同使用了命令行 :samp:`-l " +"{}`。" + +#: ../../library/compileall.rst:38 +msgid "" +"Do not recurse into subdirectories, only compile source code files directly " +"contained in the named or implied directories." +msgstr "不要递归到子目录,只编译直接包含在指明或隐含的目录中的源代码文件。" + +#: ../../library/compileall.rst:43 +msgid "Force rebuild even if timestamps are up-to-date." +msgstr "强制重新构建即使时间戳是最新的。" + +#: ../../library/compileall.rst:47 +msgid "" +"Do not print the list of files compiled. If passed once, error messages will" +" still be printed. If passed twice (``-qq``), all output is suppressed." +msgstr "不要打印已编译文件的列表。 如果传入一次,则错误消息仍将被打印。 如果传入两次 (``-qq``),所有输出都会被屏蔽。" + +#: ../../library/compileall.rst:52 +msgid "" +"Directory prepended to the path to each file being compiled. This will " +"appear in compilation time tracebacks, and is also compiled in to the byte-" +"code file, where it will be used in tracebacks and other messages in cases " +"where the source file does not exist at the time the byte-code file is " +"executed." +msgstr "" +"要附加到每个被编译文件的路径之前的目录。 " +"这将出现在编译时回溯信息中,并且还会被编译到字节码文件中,届时它将在字节码文件被执行而源文件已不存在的情况下被用于回溯和其他消息。" + +#: ../../library/compileall.rst:60 +msgid "" +"Remove the given prefix from paths recorded in the ``.pyc`` files. Paths are" +" made relative to the prefix." +msgstr "从记录在 ``.pyc`` 文件中的路径移除给定的前缀。 路径将成为基于该前缀的相对路径。" + +#: ../../library/compileall.rst:63 +msgid "This option can be used with ``-p`` but not with ``-d``." +msgstr "该选项可用于 ``-p`` 但不可用于 ``-d``。" + +#: ../../library/compileall.rst:67 +msgid "" +"Prepend the given prefix to paths recorded in the ``.pyc`` files. Use ``-p " +"/`` to make the paths absolute." +msgstr "将给定的前缀添加到记录在 ``.pyc`` 文件中的路径。 使用 ``-p /`` 将使路径成为绝对路径。" + +#: ../../library/compileall.rst:70 +msgid "This option can be used with ``-s`` but not with ``-d``." +msgstr "该选项可用于 ``-s`` 但不可用于 ``-d``。" + +#: ../../library/compileall.rst:74 +msgid "" +"regex is used to search the full path to each file considered for " +"compilation, and if the regex produces a match, the file is skipped." +msgstr "regex 会被用于搜索每个要执行编译的文件的完整路径,而如果 regex 产生了一个匹配,则相应文件会被跳过。" + +#: ../../library/compileall.rst:79 +msgid "" +"Read the file ``list`` and add each line that it contains to the list of " +"files and directories to compile. If ``list`` is ``-``, read lines from " +"``stdin``." +msgstr "" +"读取文件 ``list`` 并将其包含的每一行添加到要编译的文件和目录列表中。 如果 ``list`` 为 ``-``,则从 ``stdin`` " +"读取行。" + +#: ../../library/compileall.rst:85 +msgid "" +"Write the byte-code files to their legacy locations and names, which may " +"overwrite byte-code files created by another version of Python. The default" +" is to write files to their :pep:`3147` locations and names, which allows " +"byte-code files from multiple versions of Python to coexist." +msgstr "" +"将字节码写入到它们的传统位置和名称,这可能会覆盖由另一版本的 Python 所创建的字节码文件。 默认是将文件写入到它们的 :pep:`3147` " +"位置和名称,这允许来自多个版本的 Python 字节码文件共存。" + +#: ../../library/compileall.rst:92 +msgid "" +"Control the maximum recursion level for subdirectories. If this is given, " +"then ``-l`` option will not be taken into account. :program:`python -m " +"compileall -r 0` is equivalent to :program:`python -m compileall" +" -l`." +msgstr "" +"控制子目录的最大递归层级。 如果给出此选项,则 ``-l`` 选项将不会被考虑。 :program:`python -m compileall " +" -r 0` 等价于 :program:`python -m compileall -l`。" + +#: ../../library/compileall.rst:99 +msgid "" +"Use *N* workers to compile the files within the given directory. If ``0`` is" +" used, then the result of :func:`os.process_cpu_count` will be used." +msgstr "" +"使用 *N* 个工作进程来编译给定目录中的文件。 如果使用 ``0``,则将使用 :func:`os.process_cpu_count` 的结果。" + +#: ../../library/compileall.rst:105 +msgid "" +"Control how the generated byte-code files are invalidated at runtime. The " +"``timestamp`` value, means that ``.pyc`` files with the source timestamp and" +" size embedded will be generated. The ``checked-hash`` and ``unchecked-" +"hash`` values cause hash-based pycs to be generated. Hash-based pycs embed a" +" hash of the source file contents rather than a timestamp. See :ref:`pyc-" +"invalidation` for more information on how Python validates bytecode cache " +"files at runtime. The default is ``timestamp`` if the " +":envvar:`SOURCE_DATE_EPOCH` environment variable is not set, and ``checked-" +"hash`` if the ``SOURCE_DATE_EPOCH`` environment variable is set." +msgstr "" +"控制生成的字节码文件在运行时的失效规则。 值为 ``timestamp``,意味着将生成嵌入了源时间戳和大小的 ``.pyc`` 文件。 " +"``checked-hash`` 和 ``unchecked-hash`` 等值将导致生成基于哈希的 pyc。 基于哈希的 pyc " +"嵌入了源文件内容的哈希值而不是时间戳。 请参阅 :ref:`pyc-invalidation` 了解有关 Python " +"在运行时如何验证字节码缓存文件的更多信息。 如果未设置 :envvar:`SOURCE_DATE_EPOCH` 环境变量则默认值为 " +"``timestamp``,而如果设置了 ``SOURCE_DATE_EPOCH`` 则为 ``checked-hash``。" + +#: ../../library/compileall.rst:118 +msgid "" +"Compile with the given optimization level. May be used multiple times to " +"compile for multiple levels at a time (for example, ``compileall -o 1 -o " +"2``)." +msgstr "使用给定的优化级别进行编译。 可以多次使用来一次性地针对多个级别进行编译 (例如,``compileall -o 1 -o 2``)。" + +#: ../../library/compileall.rst:124 +msgid "Ignore symlinks pointing outside the given directory." +msgstr "忽略指向给定目录之外的符号链接。" + +#: ../../library/compileall.rst:128 +msgid "" +"If two ``.pyc`` files with different optimization level have the same " +"content, use hard links to consolidate duplicate files." +msgstr "如果两个不同优化级别的 ``.pyc`` 文件具有相同的内容,则使用硬链接来合并重复的文件。" + +#: ../../library/compileall.rst:131 +msgid "Added the ``-i``, ``-b`` and ``-h`` options." +msgstr "增加了 ``-i``, ``-b`` 和 ``-h`` 选项。" + +#: ../../library/compileall.rst:134 +msgid "" +"Added the ``-j``, ``-r``, and ``-qq`` options. ``-q`` option was changed " +"to a multilevel value. ``-b`` will always produce a byte-code file ending " +"in ``.pyc``, never ``.pyo``." +msgstr "" +"增加了 ``-j``, ``-r`` 和 ``-qq`` 选项。 ``-q`` 选项改为多级别值。 ``-b`` 将总是产生以 ``.pyc`` " +"为后缀的字节码文件,而不是 ``.pyo``。" + +#: ../../library/compileall.rst:139 +msgid "Added the ``--invalidation-mode`` option." +msgstr "增加了 ``--invalidation-mode`` 选项。" + +#: ../../library/compileall.rst:142 +msgid "" +"Added the ``-s``, ``-p``, ``-e`` and ``--hardlink-dupes`` options. Raised " +"the default recursion limit from 10 to :py:func:`sys.getrecursionlimit()`. " +"Added the possibility to specify the ``-o`` option multiple times." +msgstr "" +"增加了 ``-s``, ``-p``, ``-e`` 和 ``--hardlink-dupes`` 选项。 将默认的递归限制从 10 提高到 " +":py:func:`sys.getrecursionlimit()`。 增加允许多次指定 ``-o`` 选项。" + +#: ../../library/compileall.rst:149 +msgid "" +"There is no command-line option to control the optimization level used by " +"the :func:`compile` function, because the Python interpreter itself already " +"provides the option: :program:`python -O -m compileall`." +msgstr "" +"没有可以控制 :func:`compile` 函数所使用的优化级别的命令行选项,因为 Python 解释器本身已经提供了该选项: " +":program:`python -O -m compileall`。" + +#: ../../library/compileall.rst:153 +msgid "" +"Similarly, the :func:`compile` function respects the " +":data:`sys.pycache_prefix` setting. The generated bytecode cache will only " +"be useful if :func:`compile` is run with the same :data:`sys.pycache_prefix`" +" (if any) that will be used at runtime." +msgstr "" +"类似地,:func:`compile` 函数会遵循 :data:`sys.pycache_prefix` 设置。 所生成的字节码缓存将仅在 " +":func:`compile` 附带与将在运行时使用的相同 :data:`sys.pycache_prefix` 时可用(如果存在该设置)。" + +#: ../../library/compileall.rst:159 +msgid "Public functions" +msgstr "公有函数" + +#: ../../library/compileall.rst:163 +msgid "" +"Recursively descend the directory tree named by *dir*, compiling all " +":file:`.py` files along the way. Return a true value if all the files " +"compiled successfully, and a false value otherwise." +msgstr "递归地深入名为 *dir* 的目录树,在途中编译所有 :file:`.py` 文件。 如果所有文件都编译成功则返回真值,否则返回假值。" + +#: ../../library/compileall.rst:167 +msgid "" +"The *maxlevels* parameter is used to limit the depth of the recursion; it " +"defaults to ``sys.getrecursionlimit()``." +msgstr "*maxlevels* 形参被用来限制递归深度;它默认为 ``sys.getrecursionlimit()``。" + +#: ../../library/compileall.rst:170 +msgid "" +"If *ddir* is given, it is prepended to the path to each file being compiled " +"for use in compilation time tracebacks, and is also compiled in to the byte-" +"code file, where it will be used in tracebacks and other messages in cases " +"where the source file does not exist at the time the byte-code file is " +"executed." +msgstr "" +"如果给出了 " +"*ddir*,它会被附加到每个被编译的文件的路径之前以便在编译时回溯中使用,同时还会被编译到字节码文件中,届时它将在字节码文件被执行而源文件已不存在的情况下被用于回溯和其他消息中。" + +#: ../../library/compileall.rst:176 +msgid "" +"If *force* is true, modules are re-compiled even if the timestamps are up to" +" date." +msgstr "如果 *force* 为真值,则即使时间戳为最新模块也会被重新编译。" + +#: ../../library/compileall.rst:179 +msgid "" +"If *rx* is given, its ``search`` method is called on the complete path to " +"each file considered for compilation, and if it returns a true value, the " +"file is skipped. This can be used to exclude files matching a regular " +"expression, given as a :ref:`re.Pattern ` object." +msgstr "" +"如果给出了 *rx*,则它的 ``search`` 方法会在准备编译的每个文件的完整路径上被调用,并且如果它返回真值,则该文件会被跳过。 " +"这可被用来排除与一个正则表达式相匹配的文件,正则表达式将以 :ref:`re.Pattern ` 对象的形式给出。" + +#: ../../library/compileall.rst:184 ../../library/compileall.rst:261 +msgid "" +"If *quiet* is ``False`` or ``0`` (the default), the filenames and other " +"information are printed to standard out. Set to ``1``, only errors are " +"printed. Set to ``2``, all output is suppressed." +msgstr "" +"如果 *quiet* 为 ``False`` 或 ``0`` (默认值),则文件名和其他信息将被打印到标准输出。 如果设为 ``1``,则只打印错误。 " +"如果设为 ``2``,则屏蔽所有输出。" + +#: ../../library/compileall.rst:188 ../../library/compileall.rst:265 +msgid "" +"If *legacy* is true, byte-code files are written to their legacy locations " +"and names, which may overwrite byte-code files created by another version of" +" Python. The default is to write files to their :pep:`3147` locations and " +"names, which allows byte-code files from multiple versions of Python to " +"coexist." +msgstr "" +"如果 *legacy* 为真值,则将字节码文件写入到它们的传统位置和名称,这可能会覆盖由另一版本的 Python 所创建的字节码文件。 " +"默认是将文件写入到它们的 :pep:`3147` 位置和名称,这允许来自多个版本的 Python 字节码文件共存。" + +#: ../../library/compileall.rst:194 ../../library/compileall.rst:271 +msgid "" +"*optimize* specifies the optimization level for the compiler. It is passed " +"to the built-in :func:`compile` function. Accepts also a sequence of " +"optimization levels which lead to multiple compilations of one :file:`.py` " +"file in one call." +msgstr "" +"*optimize* 指明编译器的优化级别。 它会被传给内置 :func:`compile` 函数。 " +"还接受一个优化级别列表,这将在单次调用中多次编译一个 :file:`.py` 文件。" + +#: ../../library/compileall.rst:198 +msgid "" +"The argument *workers* specifies how many workers are used to compile files " +"in parallel. The default is to not use multiple workers. If the platform " +"can't use multiple workers and *workers* argument is given, then sequential " +"compilation will be used as a fallback. If *workers* is 0, the number of " +"cores in the system is used. If *workers* is lower than ``0``, a " +":exc:`ValueError` will be raised." +msgstr "" +"参数 *workers* 指明要使用多少个工作进程来并行编译文件。 默认设置不使用多个工作进程。 如果平台不能使用多个工作进程而又给出了 " +"*workers* 参数,则将回退为使用顺序编译。 如果 *workers* 为 0,则会使用系统的核心数量。 如果 *workers* 小于 " +"``0``,则会引发 :exc:`ValueError`。" + +#: ../../library/compileall.rst:205 ../../library/compileall.rst:275 +msgid "" +"*invalidation_mode* should be a member of the " +":class:`py_compile.PycInvalidationMode` enum and controls how the generated " +"pycs are invalidated at runtime." +msgstr "" +"*invalidation_mode* 应为 :class:`py_compile.PycInvalidationMode` " +"枚举的成员之一并将控制所生成的 pyc 在运行时以何种方式验证是否失效。" + +#: ../../library/compileall.rst:209 ../../library/compileall.rst:279 +msgid "" +"The *stripdir*, *prependdir* and *limit_sl_dest* arguments correspond to the" +" ``-s``, ``-p`` and ``-e`` options described above. They may be specified as" +" ``str`` or :py:class:`os.PathLike`." +msgstr "" +"*stripdir*, *prependdir* 和 *limit_sl_dest* 参数分别对应上述的 ``-s``, ``-p`` 和 ``-e``" +" 选项。 它们可以被指定为 ``str`` 或 :py:class:`os.PathLike`。" + +#: ../../library/compileall.rst:213 ../../library/compileall.rst:283 +msgid "" +"If *hardlink_dupes* is true and two ``.pyc`` files with different " +"optimization level have the same content, use hard links to consolidate " +"duplicate files." +msgstr "" +"如果 *hardlink_dupes* 为真值且两个使用不同优化级别的 ``.pyc`` 文件具有相同的内容,则会使用硬链接来合并重复的文件。" + +#: ../../library/compileall.rst:216 ../../library/compileall.rst:314 +msgid "Added the *legacy* and *optimize* parameter." +msgstr "增加了 *legacy* 和 *optimize* 形参。" + +#: ../../library/compileall.rst:219 +msgid "Added the *workers* parameter." +msgstr "增加了 *workers* 形参。" + +#: ../../library/compileall.rst:222 ../../library/compileall.rst:288 +#: ../../library/compileall.rst:317 +msgid "*quiet* parameter was changed to a multilevel value." +msgstr "*quiet* 形参已改为多级别值。" + +#: ../../library/compileall.rst:225 ../../library/compileall.rst:291 +#: ../../library/compileall.rst:320 +msgid "" +"The *legacy* parameter only writes out ``.pyc`` files, not ``.pyo`` files no" +" matter what the value of *optimize* is." +msgstr "*legacy* 形参将只写入 ``.pyc`` 文件而非 ``.pyo`` 文件,无论 *optimize* 的值是什么。" + +#: ../../library/compileall.rst:229 +msgid "Accepts a :term:`path-like object`." +msgstr "接受一个 :term:`path-like object`。" + +#: ../../library/compileall.rst:232 ../../library/compileall.rst:295 +#: ../../library/compileall.rst:324 +msgid "The *invalidation_mode* parameter was added." +msgstr "增加了 *invalidation_mode* 形参。" + +#: ../../library/compileall.rst:235 ../../library/compileall.rst:298 +#: ../../library/compileall.rst:327 +msgid "" +"The *invalidation_mode* parameter's default value is updated to ``None``." +msgstr "*invalidation_mode* 形参的默认值已更新为 ``None``。" + +#: ../../library/compileall.rst:238 +msgid "Setting *workers* to 0 now chooses the optimal number of cores." +msgstr "将 *workers* 设为 0 现在将会选择最优核心数量。" + +#: ../../library/compileall.rst:241 +msgid "" +"Added *stripdir*, *prependdir*, *limit_sl_dest* and *hardlink_dupes* " +"arguments. Default value of *maxlevels* was changed from ``10`` to " +"``sys.getrecursionlimit()``" +msgstr "" +"增加了 *stripdir*, *prependdir*, *limit_sl_dest* 和 *hardlink_dupes* 参数。 " +"*maxlevels* 的默认值从 ``10`` 改为 ``sys.getrecursionlimit()``" + +#: ../../library/compileall.rst:247 +msgid "" +"Compile the file with path *fullname*. Return a true value if the file " +"compiled successfully, and a false value otherwise." +msgstr "编译路径为 *fullname* 的文件。 如果文件编译成功则返回真值,否则返回假值。" + +#: ../../library/compileall.rst:250 +msgid "" +"If *ddir* is given, it is prepended to the path to the file being compiled " +"for use in compilation time tracebacks, and is also compiled in to the byte-" +"code file, where it will be used in tracebacks and other messages in cases " +"where the source file does not exist at the time the byte-code file is " +"executed." +msgstr "" +"如果给出了 " +"*ddir*,它会被附加到被编译的文件的路径之前以便在编译时回溯中使用,同时还会被编译到字节码文件中,届时它将在字节码文件被执行而源文件已不存在的情况下被用于回溯和其他消息中。" + +#: ../../library/compileall.rst:256 +msgid "" +"If *rx* is given, its ``search`` method is passed the full path name to the " +"file being compiled, and if it returns a true value, the file is not " +"compiled and ``True`` is returned. This can be used to exclude files " +"matching a regular expression, given as a :ref:`re.Pattern ` " +"object." +msgstr "" +"如果给出了 *rx*,则会向它的 ``search`` 方法传入准备编译的文件的完整路径,并且如果它返回真值,则不编译该文件并返回 ``True``。 " +"这可被用来排除与一个正则表达式相匹配的文件,正则表达式将以 :ref:`re.Pattern ` 对象的形式给出。" + +#: ../../library/compileall.rst:301 +msgid "" +"Added *stripdir*, *prependdir*, *limit_sl_dest* and *hardlink_dupes* " +"arguments." +msgstr "增加了 *stripdir*, *prependdir*, *limit_sl_dest* 和 *hardlink_dupes* 参数。" + +#: ../../library/compileall.rst:306 +msgid "" +"Byte-compile all the :file:`.py` files found along ``sys.path``. Return a " +"true value if all the files compiled successfully, and a false value " +"otherwise." +msgstr "将在 ``sys.path`` 中找到的所有 :file:`.py` 文件编译为字节码。 如果所有文件编译成功则返回真值,否则返回假值。" + +#: ../../library/compileall.rst:309 +msgid "" +"If *skip_curdir* is true (the default), the current directory is not " +"included in the search. All other parameters are passed to the " +":func:`compile_dir` function. Note that unlike the other compile functions," +" ``maxlevels`` defaults to ``0``." +msgstr "" +"如果 *skip_curdir* 为真值(默认),则当前目录不会被包括在搜索中。 所有其他形参将被传递给 :func:`compile_dir` 函数。" +" 请注意不同于其他编译函数,``maxlevels`` 默认为 ``0``。" + +#: ../../library/compileall.rst:330 +msgid "" +"To force a recompile of all the :file:`.py` files in the :file:`Lib/` " +"subdirectory and all its subdirectories::" +msgstr "强制重新编译 :file:`Lib/` 子目录及其所有子目录下的全部 :file:`.py` 文件::" + +#: ../../library/compileall.rst:333 +msgid "" +"import compileall\n" +"\n" +"compileall.compile_dir('Lib/', force=True)\n" +"\n" +"# Perform same compilation, excluding files in .svn directories.\n" +"import re\n" +"compileall.compile_dir('Lib/', rx=re.compile(r'[/\\\\][.]svn'), force=True)\n" +"\n" +"# pathlib.Path objects can also be used.\n" +"import pathlib\n" +"compileall.compile_dir(pathlib.Path('Lib/'), force=True)" +msgstr "" +"import compileall\n" +"\n" +"compileall.compile_dir('Lib/', force=True)\n" +"\n" +"# 执行同样的编译,排除 .svn 目录中的文件。\n" +"import re\n" +"compileall.compile_dir('Lib/', rx=re.compile(r'[/\\\\][.]svn'), force=True)\n" +"\n" +"# 也可以使用 pathlib.Path 对象。\n" +"import pathlib\n" +"compileall.compile_dir(pathlib.Path('Lib/'), force=True)" + +#: ../../library/compileall.rst:347 +msgid "Module :mod:`py_compile`" +msgstr "模块 :mod:`py_compile`" + +#: ../../library/compileall.rst:348 +msgid "Byte-compile a single source file." +msgstr "将单个源文件编译为字节码。" diff --git a/library/compression.po b/library/compression.po new file mode 100644 index 0000000000..8dc415181c --- /dev/null +++ b/library/compression.po @@ -0,0 +1,60 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/compression.rst:2 +msgid "The :mod:`!compression` package" +msgstr ":mod:`!compression` 包" + +#: ../../library/compression.rst:8 +msgid "" +"The :mod:`!compression` package contains the canonical compression modules " +"containing interfaces to several different compression algorithms. Some of " +"these modules have historically been available as separate modules; those " +"will continue to be available under their original names for compatibility " +"reasons, and will not be removed without a deprecation cycle. The use of " +"modules in :mod:`!compression` is encouraged where practical." +msgstr "" +":mod:`!compression` " +"包包含规范的压缩模块,其中包含几种不同压缩算法的接口。其中一些模块在历史上是作为单独的模块提供的;出于兼容性原因,它们将继续以其原始名称提供,并且在没有弃用周期的情况下不会被删除。在可行的情况下,鼓励在" +" :mod:`!compression` 中使用模块。" + +#: ../../library/compression.rst:15 +msgid ":mod:`!compression.bz2` -- Re-exports :mod:`bz2`" +msgstr ":mod:`!compression.bz2` -- 重新导出 :mod:`bz2`" + +#: ../../library/compression.rst:16 +msgid ":mod:`!compression.gzip` -- Re-exports :mod:`gzip`" +msgstr ":mod:`!compression.gzip` -- 重新导出 :mod:`gzip`" + +#: ../../library/compression.rst:17 +msgid ":mod:`!compression.lzma` -- Re-exports :mod:`lzma`" +msgstr ":mod:`!compression.lzma` -- 重新导出 :mod:`lzma`" + +#: ../../library/compression.rst:18 +msgid ":mod:`!compression.zlib` -- Re-exports :mod:`zlib`" +msgstr ":mod:`!compression.zlib` -- 重新导出 :mod:`zlib`" + +#: ../../library/compression.rst:19 +msgid "" +":mod:`compression.zstd` -- Wrapper for the Zstandard compression library" +msgstr ":mod:`compression.zstd` -- Zstandard 压缩库的包装器" diff --git a/library/compression.zstd.po b/library/compression.zstd.po new file mode 100644 index 0000000000..76edc78a50 --- /dev/null +++ b/library/compression.zstd.po @@ -0,0 +1,1376 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-21 16:26+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/compression.zstd.rst:2 +msgid "" +":mod:`!compression.zstd` --- Compression compatible with the Zstandard " +"format" +msgstr ":mod:`!compression.zstd` --- 与 Zstandard 格式兼容的压缩" + +#: ../../library/compression.zstd.rst:10 +msgid "**Source code:** :source:`Lib/compression/zstd/__init__.py`" +msgstr "**源代码:** :source:`Lib/compression/zstd/__init__.py`" + +#: ../../library/compression.zstd.rst:14 +msgid "" +"This module provides classes and functions for compressing and decompressing" +" data using the Zstandard (or *zstd*) compression algorithm. The `zstd " +"manual `__ " +"describes Zstandard as \"a fast lossless compression algorithm, targeting " +"real-time compression scenarios at zlib-level and better compression " +"ratios.\" Also included is a file interface that supports reading and " +"writing the contents of ``.zst`` files created by the :program:`zstd` " +"utility, as well as raw zstd compressed streams." +msgstr "" +"本模块提供了有关使用 Zstandard (或称 *zstd*) 压缩算法压缩和解压缩数据的类和函数。 `zstd 指南 " +"`__ 将 Zstandard " +"描述为“一种快速的无损压缩算法,针对在 zlib 层级和更高压缩率的实时压缩应用场景。” 本模块还包括了一个支持读写由 :program:`zstd` " +"工具创建的 ``.zst`` 文件以及原始 zstd 压缩流内容的文件接口。" + +#: ../../library/compression.zstd.rst:23 +msgid "The :mod:`!compression.zstd` module contains:" +msgstr ":mod:`!compression.zstd` 模块包含:" + +#: ../../library/compression.zstd.rst:25 +msgid "" +"The :func:`.open` function and :class:`ZstdFile` class for reading and " +"writing compressed files." +msgstr ":func:`.open` 函数和 :class:`ZstdFile` 类用于读写压缩文件。" + +#: ../../library/compression.zstd.rst:27 +msgid "" +"The :class:`ZstdCompressor` and :class:`ZstdDecompressor` classes for " +"incremental (de)compression." +msgstr "用于增量(解)压缩的 :class:`ZstdCompressor` 和 :class:`ZstdDecompressor` 类。" + +#: ../../library/compression.zstd.rst:29 +msgid "" +"The :func:`compress` and :func:`decompress` functions for one-shot " +"(de)compression." +msgstr "用于一次性压缩和解压的 :func:`compress` 和 :func:`decompress` 函数。" + +#: ../../library/compression.zstd.rst:31 +msgid "" +"The :func:`train_dict` and :func:`finalize_dict` functions and the " +":class:`ZstdDict` class to train and manage Zstandard dictionaries." +msgstr "" +":func:`train_dict` 和 :func:`finalize_dict` 函数以及 :class:`ZstdDict` 类用于训练和管理 " +"Zstandard 字典。" + +#: ../../library/compression.zstd.rst:33 +msgid "" +"The :class:`CompressionParameter`, :class:`DecompressionParameter`, and " +":class:`Strategy` classes for setting advanced (de)compression parameters." +msgstr "" +":class:`CompressionParameter`, :class:`DecompressionParameter` 和 " +":class:`Strategy` 类用于设置高级的(解)压缩参数。" + +#: ../../includes/optional-module.rst:1 +msgid "" +"This is an :term:`optional module`. If it is missing from your copy of " +"CPython, look for documentation from your distributor (that is, whoever " +"provided Python to you). If you are the distributor, see :ref:`optional-" +"module-requirements`." +msgstr "" +"这是一个 :term:`optional module`。 如果它在你的 CPython 副本中缺失,请查看你的发行方(也就是说,向你提供 Python" +" 的人)的文档。 如果你就是发行方,请参阅 :ref:`optional-module-requirements`。" + +#: ../../library/compression.zstd.rst:40 +msgid "Exceptions" +msgstr "异常" + +#: ../../library/compression.zstd.rst:44 +msgid "" +"This exception is raised when an error occurs during compression or " +"decompression, or while initializing the (de)compressor state." +msgstr "当在压缩或解压缩期间或是在初始化(解)压缩器状态期间发生错误时此异常会被引发。" + +#: ../../library/compression.zstd.rst:49 +msgid "Reading and writing compressed files" +msgstr "读写压缩文件" + +#: ../../library/compression.zstd.rst:54 +msgid "" +"Open a Zstandard-compressed file in binary or text mode, returning a " +":term:`file object`." +msgstr "以二进制或文本模式打开一个 Zstandard 压缩文件,返回一个 :term:`file object`。" + +#: ../../library/compression.zstd.rst:57 +msgid "" +"The *file* argument can be either a file name (given as a :class:`str`, " +":class:`bytes` or :term:`path-like ` object), in which " +"case the named file is opened, or it can be an existing file object to read " +"from or write to." +msgstr "" +"*file* 参数可以是一个文件名(以 :class:`str`, :class:`bytes` 或 :term:`路径型 ` 对象的形式给出),在此情况下会打开指定名称的文件,或者可以是一个用于读写的现有文件对象。" + +#: ../../library/compression.zstd.rst:62 +msgid "" +"The mode argument can be either ``'rb'`` for reading (default), ``'wb'`` for" +" overwriting, ``'ab'`` for appending, or ``'xb'`` for exclusive creation. " +"These can equivalently be given as ``'r'``, ``'w'``, ``'a'``, and ``'x'`` " +"respectively. You may also open in text mode with ``'rt'``, ``'wt'``, " +"``'at'``, and ``'xt'`` respectively." +msgstr "" +"mode 参数可以是表示读取的 ``'rb'`` (默认值),表示覆写的 ``'wb'``,表示追加的 ``'ab'``,或者表示独占创建的 " +"``'xb'``。 这些模式还可分别以 ``'r'``, ``'w'``, ``'a'`` 和 ``'x'`` 的等价形式给出。 你还可以分别使用 " +"``'rt'``, ``'wt'``, ``'at'`` 和 ``'xt'`` 以文本模式打开。" + +#: ../../library/compression.zstd.rst:68 +#: ../../library/compression.zstd.rst:112 +msgid "" +"When reading, the *options* argument can be a dictionary providing advanced " +"decompression parameters; see :class:`DecompressionParameter` for detailed " +"information about supported parameters. The *zstd_dict* argument is a " +":class:`ZstdDict` instance to be used during decompression. When reading, if" +" the *level* argument is not None, a :exc:`!TypeError` will be raised." +msgstr "" +"在读取时,*options* 参数可以是一个提供高级解压缩参数的字典;请参阅 :class:`DecompressionParameter` " +"获取有关受支持参数的详情。 *zstd_dict* 参数是一个将在解压缩期间使用的 :class:`ZstdDict` 实例。 在读取时,如果 " +"*level* 参数不为 None,则会引发 :exc:`!TypeError`。" + +#: ../../library/compression.zstd.rst:75 +msgid "" +"When writing, the *options* argument can be a dictionary providing advanced " +"compression parameters; see :class:`CompressionParameter` for detailed " +"information about supported parameters. The *level* argument is the " +"compression level to use when writing compressed data. Only one of *level* " +"or *options* may be non-None. The *zstd_dict* argument is a " +":class:`ZstdDict` instance to be used during compression." +msgstr "" +"在写入时,*options* 参数可以是一个提供高级压缩参数的字典;请参阅 :class:`CompressionParameter` " +"获取有关受支持参数的详情。 *level* 参数是一个将在写入压缩数据时使用的压缩级别。 *level* 或 *options* 只能有一个不为 " +"None。 *zstd_dict* 参数是一个将在压缩期间使用的 :class:`ZstdDict` 实例。" + +#: ../../library/compression.zstd.rst:83 +msgid "" +"In binary mode, this function is equivalent to the :class:`ZstdFile` " +"constructor: ``ZstdFile(file, mode, ...)``. In this case, the *encoding*, " +"*errors*, and *newline* parameters must not be provided." +msgstr "" +"在二进制模式下,此函数等同于 :class:`ZstdFile` 构造器: ``ZstdFile(file, mode, " +"...)``。在这种情况下,不得提供 *encoding*、*errors* 和 *newline* 参数。" + +#: ../../library/compression.zstd.rst:87 +msgid "" +"In text mode, a :class:`ZstdFile` object is created, and wrapped in an " +":class:`io.TextIOWrapper` instance with the specified encoding, error " +"handling behavior, and line endings." +msgstr "" +"在文本模式下,创建一个 :class:`ZstdFile` 对象,并将其包装在一个 :class:`io.TextIOWrapper` " +"实例中,该实例具有指定的编码、错误处理行为和行结束符。" + +#: ../../library/compression.zstd.rst:95 +msgid "Open a Zstandard-compressed file in binary mode." +msgstr "以二进制模式打开一个 Zstandard 压缩文件。" + +#: ../../library/compression.zstd.rst:97 +msgid "" +"A :class:`ZstdFile` can wrap an already-open :term:`file object`, or operate" +" directly on a named file. The *file* argument specifies either the file " +"object to wrap, or the name of the file to open (as a :class:`str`, " +":class:`bytes` or :term:`path-like ` object). If wrapping " +"an existing file object, the wrapped file will not be closed when the " +":class:`ZstdFile` is closed." +msgstr "" +"一个 :class:`ZstdFile` 可以包装一个已经打开的 :term:`file object`,或者直接操作一个命名文件。*file* " +"参数指定要包装的文件对象,或者要打开的文件名(作为 :class:`str`、:class:`bytes` 或 :term:`路径类 ` 对象)。如果包装现有的文件对象,当 :class:`ZstdFile` 关闭时,包装的文件不会被关闭。" + +#: ../../library/compression.zstd.rst:104 +msgid "" +"The *mode* argument can be either ``'rb'`` for reading (default), ``'wb'`` " +"for overwriting, ``'xb'`` for exclusive creation, or ``'ab'`` for appending." +" These can equivalently be given as ``'r'``, ``'w'``, ``'x'`` and ``'a'`` " +"respectively." +msgstr "" +"*mode* 参数可以是 ``'rb'`` 用于读取(默认),``'wb'`` 用于覆盖,``'xb'`` 用于独占创建,或者 ``'ab'`` " +"用于追加。上述模式也可简写为对应的单字符形式: ``'r'``、``'w'``、``'x'`` 和 ``'a'`` (功能等价)。" + +#: ../../library/compression.zstd.rst:109 +msgid "" +"If *file* is a file object (rather than an actual file name), a mode of " +"``'w'`` does not truncate the file, and is instead equivalent to ``'a'``." +msgstr "如果 *file* 是文件对象(而不是实际的文件名),``'w'`` 模式不会截断文件,而是等同于 ``'a'``。" + +#: ../../library/compression.zstd.rst:119 +msgid "" +"When writing, the *options* argument can be a dictionary providing advanced " +"compression parameters; see :class:`CompressionParameter` for detailed " +"information about supported parameters. The *level* argument is the " +"compression level to use when writing compressed data. Only one of *level* " +"or *options* may be passed. The *zstd_dict* argument is a :class:`ZstdDict` " +"instance to be used during compression." +msgstr "" +"在写入时,*options* 参数可以是一个提供高级压缩参数的字典;请参阅 :class:`CompressionParameter` " +"获取有关受支持参数的详情。 *level* 参数是写入压缩数据时要使用的压缩级别。 只能传入 *level* 或 *options* 中的一个。 " +"*zstd_dict* 参数是一个将在压缩期间使用的 :class:`ZstdDict` 实例。" + +#: ../../library/compression.zstd.rst:127 +msgid "" +":class:`!ZstdFile` supports all the members specified by " +":class:`io.BufferedIOBase`, except for :meth:`~io.BufferedIOBase.detach` and" +" :meth:`~io.IOBase.truncate`. Iteration and the :keyword:`with` statement " +"are supported." +msgstr "" +":class:`!ZstdFile` 支持由 :class:`io.BufferedIOBase` 指定的所有成员,除了 " +":meth:`~io.BufferedIOBase.detach` 和 :meth:`~io.IOBase.truncate`。支持迭代和 " +":keyword:`with` 语句。" + +#: ../../library/compression.zstd.rst:132 +msgid "The following method and attributes are also provided:" +msgstr "还提供了下列方法和属性:" + +#: ../../library/compression.zstd.rst:136 +msgid "" +"Return buffered data without advancing the file position. At least one byte " +"of data will be returned, unless EOF has been reached. The exact number of " +"bytes returned is unspecified (the *size* argument is ignored)." +msgstr "返回缓冲的数据而不前移文件位置。 至少将返回一个字节的数据,除非已经到达 EOF。 实际返回的字节数不确定(会忽略 *size* 参数)。" + +#: ../../library/compression.zstd.rst:140 +msgid "" +"While calling :meth:`peek` does not change the file position of the " +":class:`ZstdFile`, it may change the position of the underlying file object " +"(for example, if the :class:`ZstdFile` was constructed by passing a file " +"object for *file*)." +msgstr "" +"调用 :meth:`peek` 不会改变 :class:`ZstdFile` 的文件位置,但它可能会改变底层文件对象的位置(例如,如果 " +":class:`ZstdFile` 是通过传递一个文件对象作为 *file* 参数来构造的)。" + +#: ../../library/compression.zstd.rst:147 +msgid "``'rb'`` for reading and ``'wb'`` for writing." +msgstr "``'rb'`` 用于读取而 ``'wb'`` 用于写入。" + +#: ../../library/compression.zstd.rst:151 +msgid "" +"The name of the Zstandard file. Equivalent to the :attr:`~io.FileIO.name` " +"attribute of the underlying :term:`file object`." +msgstr "" +"Zstandard 文件的名称。等同于底层 :term:`file object` 的 :attr:`~io.FileIO.name` 属性。" + +#: ../../library/compression.zstd.rst:156 +msgid "Compressing and decompressing data in memory" +msgstr "在内存中压缩和解压缩数据" + +#: ../../library/compression.zstd.rst:160 +msgid "" +"Compress *data* (a :term:`bytes-like object`), returning the compressed data" +" as a :class:`bytes` object." +msgstr "" +"压缩 *data* (一个 :term:`bytes-like object`),返回压缩后的数据作为一个 :class:`bytes` 对象。" + +#: ../../library/compression.zstd.rst:163 +#: ../../library/compression.zstd.rst:207 +msgid "" +"The *level* argument is an integer controlling the level of compression. " +"*level* is an alternative to setting " +":attr:`CompressionParameter.compression_level` in *options*. Use " +":meth:`~CompressionParameter.bounds` on " +":attr:`~CompressionParameter.compression_level` to get the values that can " +"be passed for *level*. If advanced compression options are needed, the " +"*level* argument must be omitted and in the *options* dictionary the " +":attr:`!CompressionParameter.compression_level` parameter should be set." +msgstr "" +"*level* 参数是一个控制压缩级别的整数。*level* 是设置 *options* 中 " +":attr:`CompressionParameter.compression_level` 的替代方案。使用 " +":attr:`~CompressionParameter.compression_level` 上的 " +":meth:`~CompressionParameter.bounds` 方法获取可以传递给 *level* 的值。如果需要高级压缩选项,必须省略 " +"*level* 参数,并在 *options* 字典中设置 " +":attr:`!CompressionParameter.compression_level` 参数。" + +#: ../../library/compression.zstd.rst:172 +#: ../../library/compression.zstd.rst:216 +msgid "" +"The *options* argument is a Python dictionary containing advanced " +"compression parameters. The valid keys and values for compression parameters" +" are documented as part of the :class:`CompressionParameter` documentation." +msgstr "" +"*options* 参数是一个包含高级压缩参数的 Python 字典。压缩参数的有效键和值在 :class:`CompressionParameter`" +" 文档中有说明。" + +#: ../../library/compression.zstd.rst:176 +msgid "" +"The *zstd_dict* argument is an instance of :class:`ZstdDict` containing " +"trained data to improve compression efficiency. The function " +":func:`train_dict` can be used to generate a Zstandard dictionary." +msgstr "" +"*zstd_dict* 参数是一个 :class:`ZstdDict` 实例,包含训练数据以提升压缩效率。可以使用 :func:`train_dict`" +" 函数生成一个 Zstandard 字典。" + +#: ../../library/compression.zstd.rst:183 +msgid "" +"Decompress *data* (a :term:`bytes-like object`), returning the uncompressed " +"data as a :class:`bytes` object." +msgstr "" +"解压缩 *data* (一个 :term:`bytes-like object`),返回解压缩后的数据作为一个 :class:`bytes` 对象。" + +#: ../../library/compression.zstd.rst:186 +#: ../../library/compression.zstd.rst:308 +msgid "" +"The *options* argument is a Python dictionary containing advanced " +"decompression parameters. The valid keys and values for compression " +"parameters are documented as part of the :class:`DecompressionParameter` " +"documentation." +msgstr "" +"*options* 参数是一个包含高级解压缩参数的 Python 字典。解压缩参数的有效键和值在 " +":class:`DecompressionParameter` 文档中有说明。" + +#: ../../library/compression.zstd.rst:191 +#: ../../library/compression.zstd.rst:313 +msgid "" +"The *zstd_dict* argument is an instance of :class:`ZstdDict` containing " +"trained data used during compression. This must be the same Zstandard " +"dictionary used during compression." +msgstr "" +"*zstd_dict* 参数是一个 :class:`ZstdDict` 实例,包含在压缩过程中使用的训练数据。这必须是与压缩时使用的相同的 " +"Zstandard 字典。" + +#: ../../library/compression.zstd.rst:195 +msgid "" +"If *data* is the concatenation of multiple distinct compressed frames, " +"decompress all of these frames, and return the concatenation of the results." +msgstr "如果 *data* 参数是由多个独立压缩帧拼接而成的数据,则会解压所有这些帧,并返回解压结果的拼接串。" + +#: ../../library/compression.zstd.rst:201 +msgid "" +"Create a compressor object, which can be used to compress data " +"incrementally." +msgstr "创建一个压缩器对象,此对象可被用来执行增量压缩。" + +#: ../../library/compression.zstd.rst:204 +msgid "" +"For a more convenient way of compressing a single chunk of data, see the " +"module-level function :func:`compress`." +msgstr "有关压缩单个数据块的更便捷方法,请参阅模块级函数 :func:`compress`。" + +#: ../../library/compression.zstd.rst:220 +msgid "" +"The *zstd_dict* argument is an optional instance of :class:`ZstdDict` " +"containing trained data to improve compression efficiency. The function " +":func:`train_dict` can be used to generate a Zstandard dictionary." +msgstr "" +"*zstd_dict* 参数是可选的 :class:`ZstdDict` 实例,包含训练数据以改进压缩效率。可以使用函数 " +":func:`train_dict` 生成 Zstandard 字典。" + +#: ../../library/compression.zstd.rst:227 +msgid "" +"Compress *data* (a :term:`bytes-like object`), returning a :class:`bytes` " +"object with compressed data if possible, or otherwise an empty " +":class:`!bytes` object. Some of *data* may be buffered internally, for use " +"in later calls to :meth:`!compress` and :meth:`~.flush`. The returned data " +"should be concatenated with the output of any previous calls to " +":meth:`~.compress`." +msgstr "" +"压缩 *data* (一个 :term:`bytes-like object`),如果可能,返回包含压缩数据的 :class:`bytes` " +"对象,否则返回一个空的 :class:`!bytes` 对象。*data* 的一部分可能会在内部缓冲,用于后续调用 :meth:`!compress` " +"和 :meth:`~.flush`。返回的数据应与之前任何对 :meth:`~.compress` 的调用的输出连接起来。" + +#: ../../library/compression.zstd.rst:234 +msgid "" +"The *mode* argument is a :class:`ZstdCompressor` attribute, either " +":attr:`~.CONTINUE`, :attr:`~.FLUSH_BLOCK`, or :attr:`~.FLUSH_FRAME`." +msgstr "" +"*mode* 参数是 :class:`ZstdCompressor` 属性,可以是 " +":attr:`~.CONTINUE`、:attr:`~.FLUSH_BLOCK` 或 :attr:`~.FLUSH_FRAME`。" + +#: ../../library/compression.zstd.rst:238 +msgid "" +"When all data has been provided to the compressor, call the :meth:`~.flush` " +"method to finish the compression process. If :meth:`~.compress` is called " +"with *mode* set to :attr:`~.FLUSH_FRAME`, :meth:`~.flush` should not be " +"called, as it would write out a new empty frame." +msgstr "" +"当所有数据都已提供给压缩器时,调用 :meth:`~.flush` 方法以完成压缩过程。如果 :meth:`~.compress` 被调用且 " +"*mode* 设置为 :attr:`~.FLUSH_FRAME`,则不应调用 :meth:`~.flush`,因为它会写入一个新的空帧。" + +#: ../../library/compression.zstd.rst:246 +msgid "" +"Finish the compression process, returning a :class:`bytes` object containing" +" any data stored in the compressor's internal buffers." +msgstr "结束压缩过程,返回包含压缩器内部缓冲区中剩余数据的 :class:`bytes` 对象。" + +#: ../../library/compression.zstd.rst:249 +msgid "" +"The *mode* argument is a :class:`ZstdCompressor` attribute, either " +":attr:`~.FLUSH_BLOCK`, or :attr:`~.FLUSH_FRAME`." +msgstr "" +"*mode* 参数是 :class:`ZstdCompressor` 属性,可以是 :attr:`~.FLUSH_BLOCK` 或 " +":attr:`~.FLUSH_FRAME`。" + +#: ../../library/compression.zstd.rst:254 +msgid "" +"Specify the amount of uncompressed data *size* that will be provided for the" +" next frame. *size* will be written into the frame header of the next frame " +"unless :attr:`CompressionParameter.content_size_flag` is ``False`` or ``0``." +" A size of ``0`` means that the frame is empty. If *size* is ``None``, the " +"frame header will omit the frame size. Frames that include the uncompressed " +"data size require less memory to decompress, especially at higher " +"compression levels." +msgstr "" +"指定将为下一个帧提供的未压缩数据 *size*。除非 :attr:`CompressionParameter.content_size_flag` 为 " +"``False`` 或 ``0``,否则 *size* 将写入下一个帧的帧头。大小为 ``0`` 表示帧为空。如果 *size* 为 " +"``None``,帧头将省略帧大小。包含未压缩数据大小的帧在解压缩时需要更少的内存,尤其是在更高的压缩级别下。" + +#: ../../library/compression.zstd.rst:262 +msgid "" +"If :attr:`last_mode` is not :attr:`FLUSH_FRAME`, a :exc:`ValueError` is " +"raised as the compressor is not at the start of a frame. If the pledged size" +" does not match the actual size of data provided to :meth:`.compress`, " +"future calls to :meth:`!compress` or :meth:`flush` may raise " +":exc:`ZstdError` and the last chunk of data may be lost." +msgstr "" +"如果 :attr:`last_mode` 不是 :attr:`FLUSH_FRAME`,则会引发 " +":exc:`ValueError`,因为压缩器未处于帧的开始位置。如果承诺的大小与提供给 :meth:`.compress` " +"的实际数据大小不匹配,未来的对 :meth:`!compress` 或 :meth:`flush` 的调用可能会引发 " +":exc:`ZstdError`,并且最后一个数据块可能会丢失。" + +#: ../../library/compression.zstd.rst:269 +msgid "" +"After :meth:`flush` or :meth:`.compress` are called with mode " +":attr:`FLUSH_FRAME`, the next frame will not include the frame size into the" +" header unless :meth:`!set_pledged_input_size` is called again." +msgstr "" +"在以 :attr:`FLUSH_FRAME` 模式调用 :meth:`flush` 或 :meth:`.compress` 后,除非再次调用 " +":meth:`!set_pledged_input_size`,否则下一个帧的头部将不包括帧大小。" + +#: ../../library/compression.zstd.rst:275 +msgid "" +"Collect more data for compression, which may or may not generate output " +"immediately. This mode optimizes the compression ratio by maximizing the " +"amount of data per block and frame." +msgstr "收集更多数据进行压缩,这可能立即生成输出,也可能不立即生成。此模式通过最大化每个块和帧的数据量来优化压缩率。" + +#: ../../library/compression.zstd.rst:281 +msgid "" +"Complete and write a block to the data stream. The data returned so far can " +"be immediately decompressed. Past data can still be referenced in future " +"blocks generated by calls to :meth:`~.compress`, improving compression." +msgstr "" +"完成并写入一个块到数据流。至此返回的数据可以立即解压缩。过去的数据仍然可以在通过调用 :meth:`~.compress` " +"生成的未来块中被引用,从而提高压缩效果。" + +#: ../../library/compression.zstd.rst:288 +msgid "" +"Complete and write out a frame. Future data provided to :meth:`~.compress` " +"will be written into a new frame and *cannot* reference past data." +msgstr "完成并写出帧。提供给 :meth:`~.compress` 的未来数据将被写入新帧,并且 *不能* 引用过去的数据。" + +#: ../../library/compression.zstd.rst:294 +msgid "" +"The last mode passed to either :meth:`~.compress` or :meth:`~.flush`. The " +"value can be one of :attr:`~.CONTINUE`, :attr:`~.FLUSH_BLOCK`, or " +":attr:`~.FLUSH_FRAME`. The initial value is :attr:`~.FLUSH_FRAME`, " +"signifying that the compressor is at the start of a new frame." +msgstr "" +"最后一个传递给 :meth:`~.compress` 或 :meth:`~.flush` 的模式。值可以是 " +":attr:`~.CONTINUE`、:attr:`~.FLUSH_BLOCK` 或 :attr:`~.FLUSH_FRAME`。初始值为 " +":attr:`~.FLUSH_FRAME`,表示压缩器处于新帧的开始位置。" + +#: ../../library/compression.zstd.rst:302 +msgid "" +"Create a decompressor object, which can be used to decompress data " +"incrementally." +msgstr "创建一个解压缩器对象,此对象可被用来执行增量解压缩。" + +#: ../../library/compression.zstd.rst:305 +msgid "" +"For a more convenient way of decompressing an entire compressed stream at " +"once, see the module-level function :func:`decompress`." +msgstr "要一次性解压缩整个压缩流,请参阅模块级函数 :func:`decompress`。" + +#: ../../library/compression.zstd.rst:318 +msgid "" +"This class does not transparently handle inputs containing multiple " +"compressed frames, unlike the :func:`decompress` function and " +":class:`ZstdFile` class. To decompress a multi-frame input, you should use " +":func:`decompress`, :class:`ZstdFile` if working with a :term:`file object`," +" or multiple :class:`!ZstdDecompressor` instances." +msgstr "" +"此类不会透明地处理包含多个压缩帧的输入,与 :func:`decompress` 函数和 :class:`ZstdFile` " +"类不同。要解压缩多帧输入,您应使用 :func:`decompress`,如果处理的是 :term:`file object`,则使用 " +":class:`ZstdFile` 类,或者使用多个 :class:`!ZstdDecompressor` 实例分别处理。" + +#: ../../library/compression.zstd.rst:326 +msgid "" +"Decompress *data* (a :term:`bytes-like object`), returning uncompressed data" +" as bytes. Some of *data* may be buffered internally, for use in later calls" +" to :meth:`!decompress`. The returned data should be concatenated with the " +"output of any previous calls to :meth:`!decompress`." +msgstr "" +"解压缩 *data* (一个 :term:`bytes-like object`),返回未压缩的数据作为字节。部分 *data* " +"可能会在内部缓冲,以便在后续调用 :meth:`!decompress` 时使用。返回的数据应与之前调用 :meth:`!decompress` " +"的输出连接起来。" + +#: ../../library/compression.zstd.rst:332 +msgid "" +"If *max_length* is non-negative, the method returns at most *max_length* " +"bytes of decompressed data. If this limit is reached and further output can " +"be produced, the :attr:`~.needs_input` attribute will be set to ``False``. " +"In this case, the next call to :meth:`~.decompress` may provide *data* as " +"``b''`` to obtain more of the output." +msgstr "" +"如果 *max_length* 参数为非负值,该方法最多返回 *max_length* " +"字节的解压数据。当达到此限制但仍有可输出数据时,:attr:`~.needs_input` 属性将被设为 ``False``。此时,下次调用 " +":meth:`~.decompress` 方法时可传入 *data* 为 ``b''`` 以获取更多输出数据。" + +#: ../../library/compression.zstd.rst:339 +msgid "" +"If all of the input data was decompressed and returned (either because this " +"was less than *max_length* bytes, or because *max_length* was negative), the" +" :attr:`~.needs_input` attribute will be set to ``True``." +msgstr "" +"如果所有输入数据都已被解压缩并返回(或是因为它少于 *max_length* 个字节,或是因为 *max_length* 为负数),则 " +":attr:`~.needs_input` 属性将被设为 ``True``。" + +#: ../../library/compression.zstd.rst:344 +msgid "" +"Attempting to decompress data after the end of a frame will raise a " +":exc:`ZstdError`. Any data found after the end of the frame is ignored and " +"saved in the :attr:`~.unused_data` attribute." +msgstr "" +"尝试在帧结束后解压缩数据将引发 :exc:`ZstdError`。帧结束后的任何数据将被忽略并保存在 :attr:`~.unused_data` " +"属性中。" + +#: ../../library/compression.zstd.rst:350 +msgid "``True`` if the end-of-stream marker has been reached." +msgstr "若达到了数据流的末尾标记则为 ``True``。" + +#: ../../library/compression.zstd.rst:354 +msgid "Data found after the end of the compressed stream." +msgstr "在压缩数据流的末尾之后获取的数据。" + +#: ../../library/compression.zstd.rst:356 +msgid "Before the end of the stream is reached, this will be ``b''``." +msgstr "在达到流的末尾之前,这将始终为 ``b''``。" + +#: ../../library/compression.zstd.rst:360 +msgid "" +"``False`` if the :meth:`.decompress` method can provide more decompressed " +"data before requiring new compressed input." +msgstr "如果 :meth:`.decompress` 方法在需要新的压缩输入之前可以提供更多解压缩数据,则为 ``False``。" + +#: ../../library/compression.zstd.rst:365 +msgid "Zstandard dictionaries" +msgstr "Zstandard 字典" + +#: ../../library/compression.zstd.rst:370 +msgid "" +"Train a Zstandard dictionary, returning a :class:`ZstdDict` instance. " +"Zstandard dictionaries enable more efficient compression of smaller sizes of" +" data, which is traditionally difficult to compress due to less repetition. " +"If you are compressing multiple similar groups of data (such as similar " +"files), Zstandard dictionaries can improve compression ratios and speed " +"significantly." +msgstr "" +"训练一个 Zstandard 字典,返回一个 :class:`ZstdDict` 实例。Zstandard " +"字典能够更有效地压缩较小规模的数据,这些数据由于重复较少而传统上难以压缩。如果您正在压缩多个相似的数据组(例如相似文件),Zstandard " +"字典可以显著提高压缩率和速度。" + +#: ../../library/compression.zstd.rst:377 +msgid "" +"The *samples* argument (an iterable of :class:`bytes` objects), is the " +"population of samples used to train the Zstandard dictionary." +msgstr "参数 *samples* (一个 :class:`bytes` 对象的可迭代对象)是用于训练 Zstandard 字典的样本集。" + +#: ../../library/compression.zstd.rst:380 +msgid "" +"The *dict_size* argument, an integer, is the maximum size (in bytes) the " +"Zstandard dictionary should be. The Zstandard documentation suggests an " +"absolute maximum of no more than 100 KB, but the maximum can often be " +"smaller depending on the data. Larger dictionaries generally slow down " +"compression, but improve compression ratios. Smaller dictionaries lead to " +"faster compression, but reduce the compression ratio." +msgstr "" +"参数 *dict_size*,一个整数,是 Zstandard 字典应达到的最大大小(以字节为单位)。Zstandard 文档建议绝对最大值不超过 " +"100 KB,但最大值通常取决于数据,可能会更小。较大的字典通常会减慢压缩速度,但提高压缩率。较小的字典导致更快的压缩,但降低压缩率。" + +#: ../../library/compression.zstd.rst:390 +msgid "" +"An advanced function for converting a \"raw content\" Zstandard dictionary " +"into a regular Zstandard dictionary. \"Raw content\" dictionaries are a " +"sequence of bytes that do not need to follow the structure of a normal " +"Zstandard dictionary." +msgstr "" +"一个高级函数,用于将\"原始内容\" Zstandard 字典转换为常规 Zstandard 字典。\"原始内容\"字典是一系列字节,不需要遵循正常 " +"Zstandard 字典的结构。" + +#: ../../library/compression.zstd.rst:395 +msgid "" +"The *zstd_dict* argument is a :class:`ZstdDict` instance with the " +":attr:`~ZstdDict.dict_content` containing the raw dictionary contents." +msgstr "" +"*zstd_dict* 参数是一个 :class:`ZstdDict` 实例,其 :attr:`~ZstdDict.dict_content` " +"包含原始字典内容。" + +#: ../../library/compression.zstd.rst:398 +msgid "" +"The *samples* argument (an iterable of :class:`bytes` objects), contains " +"sample data for generating the Zstandard dictionary." +msgstr "*samples* 参数(一个 :class:`bytes` 对象的可迭代集合),包含用于生成Zstandard字典的样本数据。" + +#: ../../library/compression.zstd.rst:401 +msgid "" +"The *dict_size* argument, an integer, is the maximum size (in bytes) the " +"Zstandard dictionary should be. See :func:`train_dict` for suggestions on " +"the maximum dictionary size." +msgstr "" +"*dict_size* 参数,一个整数,是Zstandard字典应达到的最大大小(以字节为单位)。参见 :func:`train_dict` " +"以获取关于最大字典大小的建议。" + +#: ../../library/compression.zstd.rst:405 +msgid "" +"The *level* argument (an integer) is the compression level expected to be " +"passed to the compressors using this dictionary. The dictionary information " +"varies for each compression level, so tuning for the proper compression " +"level can make compression more efficient." +msgstr "" +"*level* 参数(一个整数)是预期传递给使用此字典的压缩器的压缩级别。每个压缩级别的字典信息不同,因此针对适当的压缩级别进行调整可以使压缩更高效。" + +#: ../../library/compression.zstd.rst:413 +msgid "" +"A wrapper around Zstandard dictionaries. Dictionaries can be used to improve" +" the compression of many small chunks of data. Use :func:`train_dict` if you" +" need to train a new dictionary from sample data." +msgstr "" +"Zstandard字典的包装器。字典可用于提高许多小数据块的压缩效果。如果需要从样本数据训练新字典,请使用 :func:`train_dict`。" + +#: ../../library/compression.zstd.rst:417 +msgid "" +"The *dict_content* argument (a :term:`bytes-like object`), is the already " +"trained dictionary information." +msgstr "*dict_content* 参数 (一个 :term:`bytes-like object`),是已经训练好的字典信息。" + +#: ../../library/compression.zstd.rst:420 +msgid "" +"The *is_raw* argument, a boolean, is an advanced parameter controlling the " +"meaning of *dict_content*. ``True`` means *dict_content* is a \"raw " +"content\" dictionary, without any format restrictions. ``False`` means " +"*dict_content* is an ordinary Zstandard dictionary, created from Zstandard " +"functions, for example, :func:`train_dict` or the external :program:`zstd` " +"CLI." +msgstr "" +"*is_raw* 参数,一个布尔值,是一个高级参数,控制 *dict_content* 的含义。``True`` 表示 *dict_content* " +"是一个“原始内容”字典,没有任何格式限制。``False`` 表示 *dict_content* " +"是一个普通的Zstandard字典,由Zstandard函数例如 :func:`train_dict` ,或外部 :program:`zstd` " +"CLI创建。" + +#: ../../library/compression.zstd.rst:426 +msgid "" +"When passing a :class:`!ZstdDict` to a function, the " +":attr:`!as_digested_dict` and :attr:`!as_undigested_dict` attributes can " +"control how the dictionary is loaded by passing them as the ``zstd_dict`` " +"argument, for example, ``compress(data, zstd_dict=zd.as_digested_dict)``. " +"Digesting a dictionary is a costly operation that occurs when loading a " +"Zstandard dictionary. When making multiple calls to compression or " +"decompression, passing a digested dictionary will reduce the overhead of " +"loading the dictionary." +msgstr "" +"当将一个 :class:`!ZstdDict` 传递给函数时,可以通过传递 :attr:`!as_digested_dict` 和 " +":attr:`!as_undigested_dict` 属性作为 ``zstd_dict`` " +"参数来控制字典的加载方式,例如,``compress(data, zstd_dict=zd.as_digested_dict)``。 " +"消化字典是一个成本较高的操作,它在加载Zstandard字典时发生。 在进行多次压缩或解压缩调用时,传递已消化的字典将减少加载字典的开销。" + +#: ../../library/compression.zstd.rst:435 +msgid "Difference for compression" +msgstr "压缩差异" + +#: ../../library/compression.zstd.rst:440 +msgid "Digested dictionary" +msgstr "已消化字典" + +#: ../../library/compression.zstd.rst:441 +msgid "Undigested dictionary" +msgstr "未消化字典" + +#: ../../library/compression.zstd.rst:442 +msgid "" +"Advanced parameters of the compressor which may be overridden by the " +"dictionary's parameters" +msgstr "压缩器的高级参数,可能会被字典的参数覆盖" + +#: ../../library/compression.zstd.rst:444 +msgid "" +"``window_log``, ``hash_log``, ``chain_log``, ``search_log``, ``min_match``, " +"``target_length``, ``strategy``, ``enable_long_distance_matching``, " +"``ldm_hash_log``, ``ldm_min_match``, ``ldm_bucket_size_log``, " +"``ldm_hash_rate_log``, and some non-public parameters." +msgstr "" +"``window_log``, ``hash_log``, ``chain_log``, ``search_log``, ``min_match``, " +"``target_length``, ``strategy``, ``enable_long_distance_matching``, " +"``ldm_hash_log``, ``ldm_min_match``, ``ldm_bucket_size_log``, " +"``ldm_hash_rate_log``,以及一些非公开参数。" + +#: ../../library/compression.zstd.rst:449 +msgid "None" +msgstr "None" + +#: ../../library/compression.zstd.rst:450 +msgid ":class:`!ZstdDict` internally caches the dictionary" +msgstr ":class:`!ZstdDict` 类会在内部缓存字典数据。" + +#: ../../library/compression.zstd.rst:451 +msgid "" +"Yes. It's faster when loading a digested dictionary again with the same " +"compression level." +msgstr "是的。在再次加载相同压缩级别的已消化字典时,速度更快。" + +#: ../../library/compression.zstd.rst:453 +msgid "" +"No. If you wish to load an undigested dictionary multiple times, consider " +"reusing a compressor object." +msgstr "否。如果希望多次加载未消化字典,考虑重用压缩器对象。" + +#: ../../library/compression.zstd.rst:456 +msgid "" +"If passing a :class:`!ZstdDict` without any attribute, an undigested " +"dictionary is passed by default when compressing and a digested dictionary " +"is generated if necessary and passed by default when decompressing." +msgstr "" +"如果传递一个不带任何属性的 :class:`!ZstdDict`,则在压缩时默认传递未消化字典,在解压缩时如果需要会生成并默认传递已消化字典。" + +#: ../../library/compression.zstd.rst:462 +msgid "" +"The content of the Zstandard dictionary, a ``bytes`` object. It's the same " +"as the *dict_content* argument in the ``__init__`` method. It can be used " +"with other programs, such as the ``zstd`` CLI program." +msgstr "" +"Zstandard字典的内容,一个 ``bytes`` 对象。它与 ``__init__`` 方法中的 *dict_content* " +"参数相同。它可以与其他程序一起使用,例如 ``zstd`` CLI程序。" + +#: ../../library/compression.zstd.rst:468 +msgid "Identifier of the Zstandard dictionary, a non-negative int value." +msgstr "Zstandard字典的标识符,一个非负整数值。" + +#: ../../library/compression.zstd.rst:470 +msgid "" +"Non-zero means the dictionary is ordinary, created by Zstandard functions " +"and following the Zstandard format." +msgstr "非零表示字典是普通的,由Zstandard函数创建并遵循Zstandard格式。" + +#: ../../library/compression.zstd.rst:473 +msgid "" +"``0`` means a \"raw content\" dictionary, free of any format restriction, " +"used for advanced users." +msgstr "``0`` 表示一个“原始内容”字典,没有任何格式限制,供高级用户使用。" + +#: ../../library/compression.zstd.rst:478 +msgid "" +"The meaning of ``0`` for :attr:`!ZstdDict.dict_id` is different from the " +"``dictionary_id`` attribute to the :func:`get_frame_info` function." +msgstr "" +"对于 :attr:`!ZstdDict.dict_id`,``0`` 的含义与 :func:`get_frame_info` 函数的 " +"``dictionary_id`` 属性不同。" + +#: ../../library/compression.zstd.rst:484 +msgid "Load as a digested dictionary." +msgstr "作为已消化的字典加载。" + +#: ../../library/compression.zstd.rst:488 +msgid "Load as an undigested dictionary." +msgstr "作为未消化的字典加载。" + +#: ../../library/compression.zstd.rst:492 +msgid "Advanced parameter control" +msgstr "高级参数控制" + +#: ../../library/compression.zstd.rst:496 +msgid "" +"An :class:`~enum.IntEnum` containing the advanced compression parameter keys" +" that can be used when compressing data." +msgstr "一个 :class:`~enum.IntEnum`,包含在压缩数据时可以使用的高级压缩参数键。" + +#: ../../library/compression.zstd.rst:499 +#: ../../library/compression.zstd.rst:733 +msgid "" +"The :meth:`~.bounds` method can be used on any attribute to get the valid " +"values for that parameter." +msgstr "可以使用 :meth:`~.bounds` 方法在任何属性上获取该参数的有效值。" + +#: ../../library/compression.zstd.rst:502 +msgid "" +"Parameters are optional; any omitted parameter will have its value selected " +"automatically." +msgstr "" + +#: ../../library/compression.zstd.rst:505 +msgid "" +"Example getting the lower and upper bound of :attr:`~.compression_level`::" +msgstr "获取 :attr:`~.compression_level` 的下界和上界的示例::" + +#: ../../library/compression.zstd.rst:507 +msgid "lower, upper = CompressionParameter.compression_level.bounds()" +msgstr "lower, upper = CompressionParameter.compression_level.bounds()" + +#: ../../library/compression.zstd.rst:509 +msgid "Example setting the :attr:`~.window_log` to the maximum size::" +msgstr "将 :attr:`~.window_log` 设置为最大值的示例::" + +#: ../../library/compression.zstd.rst:511 +msgid "" +"_lower, upper = CompressionParameter.window_log.bounds()\n" +"options = {CompressionParameter.window_log: upper}\n" +"compress(b'venezuelan beaver cheese', options=options)" +msgstr "" +"_lower, upper = CompressionParameter.window_log.bounds()\n" +"options = {CompressionParameter.window_log: upper}\n" +"compress(b'venezuelan beaver cheese', options=options)" + +#: ../../library/compression.zstd.rst:517 +msgid "" +"Return the tuple of int bounds, ``(lower, upper)``, of a compression " +"parameter. This method should be called on the attribute you wish to " +"retrieve the bounds of. For example, to get the valid values for " +":attr:`~.compression_level`, one may check the result of " +"``CompressionParameter.compression_level.bounds()``." +msgstr "" +"返回压缩参数的整型边界元组 ``(lower, upper)``。此方法应调用在你希望获取边界的属性上。例如,要获取 " +":attr:`~.compression_level` 的有效值,可以检查 " +"``CompressionParameter.compression_level.bounds()`` 的结果。" + +#: ../../library/compression.zstd.rst:523 +#: ../../library/compression.zstd.rst:751 +msgid "Both the lower and upper bounds are inclusive." +msgstr "下界和上界都是包含在内的。" + +#: ../../library/compression.zstd.rst:527 +msgid "" +"A high-level means of setting other compression parameters that affect the " +"speed and ratio of compressing data." +msgstr "一种高级方法,用于设置其他影响数据压缩速度和比例的压缩参数。" + +#: ../../library/compression.zstd.rst:530 +msgid "" +"Regular compression levels are greater than ``0``. Values greater than " +"``20`` are considered \"ultra\" compression and require more memory than " +"other levels. Negative values can be used to trade off faster compression " +"for worse compression ratios." +msgstr "" +"常规压缩等级需大于 ``0``。当等级值超过 ``20`` " +"时,将被视为\"极致\"压缩级别,该级别需要比其他等级消耗更多内存。负数值可用于以牺牲压缩率为代价换取更快的压缩速度。" + +#: ../../library/compression.zstd.rst:535 +msgid "Setting the level to zero uses :attr:`COMPRESSION_LEVEL_DEFAULT`." +msgstr "将级别设置为零使用 :attr:`COMPRESSION_LEVEL_DEFAULT`。" + +#: ../../library/compression.zstd.rst:539 +msgid "" +"Maximum allowed back-reference distance the compressor can use when " +"compressing data, expressed as power of two, ``1 << window_log`` bytes. This" +" parameter greatly influences the memory usage of compression. Higher values" +" require more memory but gain better compression values." +msgstr "" +"压缩器在压缩数据时可以使用的最大允许后向引用距离,表示为二的幂,``1 << window_log`` " +"字节。此参数极大地影响压缩的内存使用。更高的值需要更多内存,但可以获得更好的压缩值。" + +#: ../../library/compression.zstd.rst:544 +#: ../../library/compression.zstd.rst:553 +#: ../../library/compression.zstd.rst:564 +#: ../../library/compression.zstd.rst:572 +#: ../../library/compression.zstd.rst:583 +#: ../../library/compression.zstd.rst:598 +#: ../../library/compression.zstd.rst:629 +#: ../../library/compression.zstd.rst:636 +#: ../../library/compression.zstd.rst:644 +#: ../../library/compression.zstd.rst:652 +#: ../../library/compression.zstd.rst:711 +#: ../../library/compression.zstd.rst:760 +msgid "A value of zero causes the value to be selected automatically." +msgstr "值为零会导致自动选择该值。" + +#: ../../library/compression.zstd.rst:548 +msgid "" +"Size of the initial probe table, as a power of two. The resulting memory " +"usage is ``1 << (hash_log+2)`` bytes. Larger tables improve compression " +"ratio of strategies <= :attr:`~Strategy.dfast`, and improve compression " +"speed of strategies > :attr:`~Strategy.dfast`." +msgstr "" +"初始探测表的大小为2的幂次方。实际内存占用为 ``1 << (hash_log+2)`` 字节。较大的探测表能提升 <= " +":attr:`~Strategy.dfast` 策略的压缩率,并加快 > :attr:`~Strategy.dfast` 策略的压缩速度。" + +#: ../../library/compression.zstd.rst:557 +msgid "" +"Size of the multi-probe search table, as a power of two. The resulting " +"memory usage is ``1 << (chain_log+2)`` bytes. Larger tables result in better" +" and slower compression. This parameter has no effect for the " +":attr:`~Strategy.fast` strategy. It's still useful when using " +":attr:`~Strategy.dfast` strategy, in which case it defines a secondary probe" +" table." +msgstr "" +"多探测搜索表的大小,以2的幂表示。由此产生的内存使用量为 ``1 << (chain_log+2)`` 字节。较大的表会导致更好的但更慢的压缩。此参数对" +" :attr:`~Strategy.fast` 策略无效。在使用 :attr:`~Strategy.dfast` " +"策略时仍然有用,在这种情况下,它定义了一个二级探测表。" + +#: ../../library/compression.zstd.rst:568 +msgid "" +"Number of search attempts, as a power of two. More attempts result in better" +" and slower compression. This parameter is useless for " +":attr:`~Strategy.fast` and :attr:`~Strategy.dfast` strategies." +msgstr "" +"搜索尝试的次数,以2的幂表示。更多的尝试会导致更好的但更慢的压缩。此参数对 :attr:`~Strategy.fast` 和 " +":attr:`~Strategy.dfast` 策略无用。" + +#: ../../library/compression.zstd.rst:576 +msgid "" +"Minimum size of searched matches. Larger values increase compression and " +"decompression speed, but decrease ratio. Note that Zstandard can still find " +"matches of smaller size, it just tweaks its search algorithm to look for " +"this size and larger. For all strategies < :attr:`~Strategy.btopt`, the " +"effective minimum is ``4``; for all strategies > :attr:`~Strategy.fast`, the" +" effective maximum is ``6``." +msgstr "" +"搜索匹配的最小大小。较大的值会增加压缩和解压速度,但会降低压缩率。请注意,Zstandard " +"仍然可以找到较小大小的匹配,它只是调整其搜索算法以查找此大小及更大的匹配。对于所有策略 < :attr:`~Strategy.btopt`,有效最小值为" +" ``4``;对于所有策略 > :attr:`~Strategy.fast`,有效最大值为 ``6``。" + +#: ../../library/compression.zstd.rst:587 +msgid "The impact of this field depends on the selected :class:`Strategy`." +msgstr "此字段的影响取决于所选的 :class:`Strategy`。" + +#: ../../library/compression.zstd.rst:589 +msgid "" +"For strategies :attr:`~Strategy.btopt`, :attr:`~Strategy.btultra` and " +":attr:`~Strategy.btultra2`, the value is the length of a match considered " +"\"good enough\" to stop searching. Larger values make compression ratios " +"better, but compresses slower." +msgstr "" +"对于策略 :attr:`~Strategy.btopt`、:attr:`~Strategy.btultra` 和 " +":attr:`~Strategy.btultra2`,该值被视为“足够好”的匹配长度以停止搜索。较大的值会提高压缩率,但压缩速度较慢。" + +#: ../../library/compression.zstd.rst:594 +msgid "" +"For strategy :attr:`~Strategy.fast`, it is the distance between match " +"sampling. Larger values make compression faster, but with a worse " +"compression ratio." +msgstr "对于策略 :attr:`~Strategy.fast`,它是匹配采样的间隔距离。较大的值会使压缩更快,但压缩率较差。" + +#: ../../library/compression.zstd.rst:602 +msgid "" +"The higher the value of selected strategy, the more complex the compression " +"technique used by zstd, resulting in higher compression ratios but slower " +"compression." +msgstr "所选策略的值越高,zstd 使用的压缩技术越复杂,导致压缩率更高但压缩速度更慢。" + +#: ../../library/compression.zstd.rst:606 +msgid ":class:`Strategy`" +msgstr ":class:`Strategy`" + +#: ../../library/compression.zstd.rst:610 +msgid "" +"Long distance matching can be used to improve compression for large inputs " +"by finding large matches at greater distances. It increases memory usage and" +" window size." +msgstr "长距离匹配可以通过在更远距离找到大匹配来提高大输入的压缩效果。这会增加内存使用和窗口大小。" + +#: ../../library/compression.zstd.rst:614 +msgid "" +"``True`` or ``1`` enable long distance matching while ``False`` or ``0`` " +"disable it." +msgstr "``True`` 或 ``1`` 启用长距离匹配,而 ``False`` 或 ``0`` 禁用长距离匹配。" + +#: ../../library/compression.zstd.rst:617 +msgid "" +"Enabling this parameter increases default " +":attr:`~CompressionParameter.window_log` to 128 MiB except when expressly " +"set to a different value. This setting is enabled by default if " +":attr:`!window_log` >= 128 MiB and the compression strategy >= " +":attr:`~Strategy.btopt` (compression level 16+)." +msgstr "" +"启用此参数会将默认的 :attr:`~CompressionParameter.window_log` 增加到 128 " +"MiB,除非明确设置为其他值。如果 :attr:`!window_log` >= 128 MiB 且压缩策略 >= " +":attr:`~Strategy.btopt` (压缩级别 16+),此设置默认启用。" + +#: ../../library/compression.zstd.rst:625 +msgid "" +"Size of the table for long distance matching, as a power of two. Larger " +"values increase memory usage and compression ratio, but decrease compression" +" speed." +msgstr "长距离匹配表的尺寸,以二的幂表示。较大的值会增加内存使用和压缩率,但会降低压缩速度。" + +#: ../../library/compression.zstd.rst:633 +msgid "" +"Minimum match size for long distance matcher. Larger or too small values can" +" often decrease the compression ratio." +msgstr "长距离匹配器的最小匹配大小。过大或过小的值通常会降低压缩率。" + +#: ../../library/compression.zstd.rst:640 +msgid "" +"Log size of each bucket in the long distance matcher hash table for " +"collision resolution. Larger values improve collision resolution but " +"decrease compression speed." +msgstr "长距离匹配器哈希表中每个桶大小的对数值,用于冲突解决。较大的值会改善冲突解决,但会降低压缩速度。" + +#: ../../library/compression.zstd.rst:648 +msgid "" +"Frequency of inserting/looking up entries into the long distance matcher " +"hash table. Larger values improve compression speed. Deviating far from the " +"default value will likely result in a compression ratio decrease." +msgstr "向长距离匹配器哈希表插入/查找条目的频率。较大的值会提高压缩速度。偏离默认值过远可能会降低压缩率。" + +#: ../../library/compression.zstd.rst:656 +msgid "" +"Write the size of the data to be compressed into the Zstandard frame header " +"when known prior to compressing." +msgstr "若在压缩前已知待压缩数据的大小,则将该数据大小写入Zstandard帧头。" + +#: ../../library/compression.zstd.rst:659 +msgid "This flag only takes effect under the following scenarios:" +msgstr "此标志仅在以下情况下生效:" + +#: ../../library/compression.zstd.rst:661 +msgid "Calling :func:`compress` for one-shot compression" +msgstr "调用 :func:`compress` 进行一次性压缩" + +#: ../../library/compression.zstd.rst:662 +msgid "" +"Providing all of the data to be compressed in the frame in a single " +":meth:`ZstdCompressor.compress` call, with the " +":attr:`ZstdCompressor.FLUSH_FRAME` mode." +msgstr "" +"在单次 :meth:`ZstdCompressor.compress` 调用中提供所有待压缩数据,并使用 " +":attr:`ZstdCompressor.FLUSH_FRAME` 模式。" + +#: ../../library/compression.zstd.rst:665 +msgid "" +"Calling :meth:`ZstdCompressor.set_pledged_input_size` with the exact amount " +"of data that will be provided to the compressor prior to any calls to " +":meth:`ZstdCompressor.compress` for the current frame. " +":meth:`!ZstdCompressor.set_pledged_input_size` must be called for each new " +"frame." +msgstr "" +"在调用 :meth:`ZstdCompressor.compress` 压缩当前帧的任何数据之前,使用 " +":meth:`ZstdCompressor.set_pledged_input_size` 设置将提供给压缩器的确切数据量。每个新帧都必须调用 " +":meth:`!ZstdCompressor.set_pledged_input_size`。" + +#: ../../library/compression.zstd.rst:671 +msgid "" +"All other compression calls may not write the size information into the " +"frame header." +msgstr "所有其他压缩调用可能不会将大小信息写入帧头。" + +#: ../../library/compression.zstd.rst:674 +msgid "" +"``True`` or ``1`` enable the content size flag while ``False`` or ``0`` " +"disable it." +msgstr "``True`` 或 ``1`` 启用内容大小标志,而 ``False`` 或 ``0`` 禁用它。" + +#: ../../library/compression.zstd.rst:679 +msgid "" +"A four-byte checksum using XXHash64 of the uncompressed content is written " +"at the end of each frame. Zstandard's decompression code verifies the " +"checksum. If there is a mismatch a :class:`ZstdError` exception is raised." +msgstr "" +"使用 XXHash64 的四字节校验和写入每个帧的末尾。Zstandard 的解压缩代码会验证校验和。如果校验和不匹配,则会引发 " +":class:`ZstdError` 异常。" + +#: ../../library/compression.zstd.rst:684 +msgid "" +"``True`` or ``1`` enable checksum generation while ``False`` or ``0`` " +"disable it." +msgstr "``True`` 或 ``1`` 启用校验和生成,而 ``False`` 或 ``0`` 禁用它。" + +#: ../../library/compression.zstd.rst:689 +msgid "" +"When compressing with a :class:`ZstdDict`, the dictionary's ID is written " +"into the frame header." +msgstr "使用 :class:`ZstdDict` 压缩时,字典的 ID 会被写入帧头部。" + +#: ../../library/compression.zstd.rst:692 +msgid "" +"``True`` or ``1`` enable storing the dictionary ID while ``False`` or ``0`` " +"disable it." +msgstr "``True`` 或 ``1`` 启用存储字典 ID,而 ``False`` 或 ``0`` 禁用它。" + +#: ../../library/compression.zstd.rst:697 +msgid "" +"Select how many threads will be spawned to compress in parallel. When " +":attr:`!nb_workers` > 0, enables multi-threaded compression, a value of " +"``1`` means \"one-thread multi-threaded mode\". More workers improve speed, " +"but also increase memory usage and slightly reduce compression ratio." +msgstr "" +"选择将启动多少线程以并行压缩。当 :attr:`!nb_workers` > 0 时,启用多线程压缩,值为 ``1`` " +"表示“单线程多线程模式”。更多工作线程可以提高速度,但也会增加内存使用并略微降低压缩率。" + +#: ../../library/compression.zstd.rst:702 +msgid "A value of zero disables multi-threading." +msgstr "值为零禁用多线程。" + +#: ../../library/compression.zstd.rst:706 +msgid "" +"Size of a compression job, in bytes. This value is enforced only when " +":attr:`~CompressionParameter.nb_workers` >= 1. Each compression job is " +"completed in parallel, so this value can indirectly impact the number of " +"active threads." +msgstr "" +"压缩任务的大小,以字节为单位。此值仅在 :attr:`~CompressionParameter.nb_workers` >= 1 " +"时生效。每个压缩任务并行完成,因此此值可以间接影响活动线程的数量。" + +#: ../../library/compression.zstd.rst:715 +msgid "" +"Sets how much data is reloaded from previous jobs (threads) for new jobs to " +"be used by the look behind window during compression. This value is only " +"used when :attr:`~CompressionParameter.nb_workers` >= 1. Acceptable values " +"vary from 0 to 9." +msgstr "" +"设置压缩过程中,新任务可从先前任务(线程)重新加载多少数据供后向参考窗口使用。该参数仅在 " +":attr:`~CompressionParameter.nb_workers` ≥ 1 时生效。有效取值范围为0到9。" + +#: ../../library/compression.zstd.rst:720 +msgid "0 means dynamically set the overlap amount" +msgstr "0 表示动态设置重叠量。" + +#: ../../library/compression.zstd.rst:721 +msgid "1 means no overlap" +msgstr "1 表示无重叠。" + +#: ../../library/compression.zstd.rst:722 +msgid "9 means use a full window size from the previous job" +msgstr "9 表示使用上一个任务的全窗口大小。" + +#: ../../library/compression.zstd.rst:724 +msgid "" +"Each increment halves/doubles the overlap size. \"8\" means an overlap of " +"``window_size/2``, \"7\" means an overlap of ``window_size/4``, etc." +msgstr "每个增量将重叠大小减半/加倍。\"8\"表示重叠 ``window_size/2``,\"7\"表示重叠 ``window_size/4``,等等。" + +#: ../../library/compression.zstd.rst:729 +msgid "" +"An :class:`~enum.IntEnum` containing the advanced decompression parameter " +"keys that can be used when decompressing data. Parameters are optional; any " +"omitted parameter will have its value selected automatically." +msgstr "" + +#: ../../library/compression.zstd.rst:736 +msgid "Example setting the :attr:`~.window_log_max` to the maximum size::" +msgstr "例如,将 :attr:`~.window_log_max` 设置为最大大小::" + +#: ../../library/compression.zstd.rst:738 +msgid "" +"data = compress(b'Some very long buffer of bytes...')\n" +"\n" +"_lower, upper = DecompressionParameter.window_log_max.bounds()\n" +"\n" +"options = {DecompressionParameter.window_log_max: upper}\n" +"decompress(data, options=options)" +msgstr "" +"data = compress(b'Some very long buffer of bytes...')\n" +"\n" +"_lower, upper = DecompressionParameter.window_log_max.bounds()\n" +"\n" +"options = {DecompressionParameter.window_log_max: upper}\n" +"decompress(data, options=options)" + +#: ../../library/compression.zstd.rst:747 +msgid "" +"Return the tuple of int bounds, ``(lower, upper)``, of a decompression " +"parameter. This method should be called on the attribute you wish to " +"retrieve the bounds of." +msgstr "返回解压缩参数的整型边界元组 ``(lower, upper)``。此方法应调用在您希望检索边界的属性上。" + +#: ../../library/compression.zstd.rst:755 +msgid "" +"The base-two logarithm of the maximum size of the window used during " +"decompression. This can be useful to limit the amount of memory used when " +"decompressing data. A larger maximum window size leads to faster " +"decompression." +msgstr "解压缩期间使用的最大窗口大小的以 2 为底的对数。这有助于限制解压缩数据时使用的内存量。较大的最大窗口大小会带来更快的解压缩速度。" + +#: ../../library/compression.zstd.rst:765 +msgid "" +"An :class:`~enum.IntEnum` containing strategies for compression. Higher-" +"numbered strategies correspond to more complex and slower compression." +msgstr "一个包含压缩策略的 :class:`~enum.IntEnum`。编号较高的策略对应更复杂和更慢的压缩。" + +#: ../../library/compression.zstd.rst:771 +msgid "" +"The values of attributes of :class:`!Strategy` are not necessarily stable " +"across zstd versions. Only the ordering of the attributes may be relied " +"upon. The attributes are listed below in order." +msgstr ":class:`!Strategy` 属性的值在不同版本的 zstd 中不一定稳定。只能依赖属性的顺序。以下按顺序列出属性。" + +#: ../../library/compression.zstd.rst:775 +msgid "The following strategies are available:" +msgstr "以下策略可用:" + +#: ../../library/compression.zstd.rst:797 +msgid "Miscellaneous" +msgstr "杂项" + +#: ../../library/compression.zstd.rst:801 +msgid "" +"Retrieve a :class:`FrameInfo` object containing metadata about a Zstandard " +"frame. Frames contain metadata related to the compressed data they hold." +msgstr "检索包含有关 Zstandard 帧元数据的 :class:`FrameInfo` 对象。帧包含与其持有的压缩数据相关的元数据。" + +#: ../../library/compression.zstd.rst:807 +msgid "Metadata related to a Zstandard frame." +msgstr "与 Zstandard 帧相关的元数据。" + +#: ../../library/compression.zstd.rst:811 +msgid "The size of the decompressed contents of the frame." +msgstr "帧中解压缩内容的大小。" + +#: ../../library/compression.zstd.rst:815 +msgid "" +"An integer representing the Zstandard dictionary ID needed for decompressing" +" the frame. ``0`` means the dictionary ID was not recorded in the frame " +"header. This may mean that a Zstandard dictionary is not needed, or that the" +" ID of a required dictionary was not recorded." +msgstr "" +"表示解压缩帧所需的 Zstandard 字典 ID 的整数。``0`` 表示字典 ID 未记录在帧头中。这可能意味着不需要 Zstandard " +"字典,或者所需的字典 ID 未记录。" + +#: ../../library/compression.zstd.rst:823 +msgid "The default compression level for Zstandard: ``3``." +msgstr "Zstandard 的默认压缩级别: ``3``。" + +#: ../../library/compression.zstd.rst:828 +msgid "" +"Version number of the runtime zstd library as a tuple of integers (major, " +"minor, release)." +msgstr "运行时 zstd 库的版本号,作为整数元组 (major, minor, release)。" + +#: ../../library/compression.zstd.rst:833 +msgid "Examples" +msgstr "示例" + +#: ../../library/compression.zstd.rst:835 +msgid "Reading in a compressed file:" +msgstr "读取压缩文件:" + +#: ../../library/compression.zstd.rst:837 +msgid "" +"from compression import zstd\n" +"\n" +"with zstd.open(\"file.zst\") as f:\n" +" file_content = f.read()" +msgstr "" +"from compression import zstd\n" +"\n" +"with zstd.open(\"file.zst\") as f:\n" +" file_content = f.read()" + +#: ../../library/compression.zstd.rst:844 +msgid "Creating a compressed file:" +msgstr "创建压缩文件:" + +#: ../../library/compression.zstd.rst:846 +msgid "" +"from compression import zstd\n" +"\n" +"data = b\"Insert Data Here\"\n" +"with zstd.open(\"file.zst\", \"w\") as f:\n" +" f.write(data)" +msgstr "" +"from compression import zstd\n" +"\n" +"data = b\"Insert Data Here\"\n" +"with zstd.open(\"file.zst\", \"w\") as f:\n" +" f.write(data)" + +#: ../../library/compression.zstd.rst:854 +msgid "Compressing data in memory:" +msgstr "在内存中压缩数据:" + +#: ../../library/compression.zstd.rst:856 +msgid "" +"from compression import zstd\n" +"\n" +"data_in = b\"Insert Data Here\"\n" +"data_out = zstd.compress(data_in)" +msgstr "" +"from compression import zstd\n" +"\n" +"data_in = b\"Insert Data Here\"\n" +"data_out = zstd.compress(data_in)" + +#: ../../library/compression.zstd.rst:863 +msgid "Incremental compression:" +msgstr "增量压缩:" + +#: ../../library/compression.zstd.rst:865 +msgid "" +"from compression import zstd\n" +"\n" +"comp = zstd.ZstdCompressor()\n" +"out1 = comp.compress(b\"Some data\\n\")\n" +"out2 = comp.compress(b\"Another piece of data\\n\")\n" +"out3 = comp.compress(b\"Even more data\\n\")\n" +"out4 = comp.flush()\n" +"# Concatenate all the partial results:\n" +"result = b\"\".join([out1, out2, out3, out4])" +msgstr "" +"from compression import zstd\n" +"\n" +"comp = zstd.ZstdCompressor()\n" +"out1 = comp.compress(b\"Some data\\n\")\n" +"out2 = comp.compress(b\"Another piece of data\\n\")\n" +"out3 = comp.compress(b\"Even more data\\n\")\n" +"out4 = comp.flush()\n" +"# 将所有部分结果拼接起来:\n" +"result = b\"\".join([out1, out2, out3, out4])" + +#: ../../library/compression.zstd.rst:877 +msgid "Writing compressed data to an already-open file:" +msgstr "写入已压缩数据到一个已打开的文件:" + +#: ../../library/compression.zstd.rst:879 +msgid "" +"from compression import zstd\n" +"\n" +"with open(\"myfile\", \"wb\") as f:\n" +" f.write(b\"This data will not be compressed\\n\")\n" +" with zstd.open(f, \"w\") as zstf:\n" +" zstf.write(b\"This *will* be compressed\\n\")\n" +" f.write(b\"Not compressed\\n\")" +msgstr "" +"from compression import zstd\n" +"\n" +"with open(\"myfile\", \"wb\") as f:\n" +" f.write(b\"This data will not be compressed\\n\")\n" +" with zstd.open(f, \"w\") as zstf:\n" +" zstf.write(b\"This *will* be compressed\\n\")\n" +" f.write(b\"Not compressed\\n\")" + +#: ../../library/compression.zstd.rst:889 +msgid "Creating a compressed file using compression parameters:" +msgstr "使用压缩参数创建压缩文件:" + +#: ../../library/compression.zstd.rst:891 +msgid "" +"from compression import zstd\n" +"\n" +"options = {\n" +" zstd.CompressionParameter.checksum_flag: 1\n" +"}\n" +"with zstd.open(\"file.zst\", \"w\", options=options) as f:\n" +" f.write(b\"Mind if I squeeze in?\")" +msgstr "" +"from compression import zstd\n" +"\n" +"options = {\n" +" zstd.CompressionParameter.checksum_flag: 1\n" +"}\n" +"with zstd.open(\"file.zst\", \"w\", options=options) as f:\n" +" f.write(b\"Mind if I squeeze in?\")" diff --git a/library/concurrency.po b/library/concurrency.po new file mode 100644 index 0000000000..721603e303 --- /dev/null +++ b/library/concurrency.po @@ -0,0 +1,41 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/concurrency.rst:5 +msgid "Concurrent Execution" +msgstr "并发执行" + +#: ../../library/concurrency.rst:7 +msgid "" +"The modules described in this chapter provide support for concurrent " +"execution of code. The appropriate choice of tool will depend on the task to" +" be executed (CPU bound vs IO bound) and preferred style of development " +"(event driven cooperative multitasking vs preemptive multitasking). Here's " +"an overview:" +msgstr "" +"本章中描述的模块支持并发执行代码。 " +"适当的工具选择取决于要执行的任务(CPU密集型或IO密集型)和偏好的开发风格(事件驱动的协作式多任务或抢占式多任务处理)。 这是一个概述:" + +#: ../../library/concurrency.rst:28 +msgid "The following are support modules for some of the above services:" +msgstr "以下是上述某些服务的支持模块:" diff --git a/library/concurrent.futures.po b/library/concurrent.futures.po new file mode 100644 index 0000000000..bc63ff2cc5 --- /dev/null +++ b/library/concurrent.futures.po @@ -0,0 +1,1187 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-03 16:39+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/concurrent.futures.rst:2 +msgid ":mod:`!concurrent.futures` --- Launching parallel tasks" +msgstr ":mod:`!concurrent.futures` --- 启动并行任务" + +#: ../../library/concurrent.futures.rst:9 +msgid "" +"**Source code:** :source:`Lib/concurrent/futures/thread.py`, " +":source:`Lib/concurrent/futures/process.py`, and " +":source:`Lib/concurrent/futures/interpreter.py`" +msgstr "" +"**源代码:** :source:`Lib/concurrent/futures/thread.py`, " +":source:`Lib/concurrent/futures/process.py` 和 " +":source:`Lib/concurrent/futures/interpreter.py`" + +#: ../../library/concurrent.futures.rst:15 +msgid "" +"The :mod:`!concurrent.futures` module provides a high-level interface for " +"asynchronously executing callables." +msgstr ":mod:`!concurrent.futures` 模块提供异步执行可调用对象的高层级接口。" + +#: ../../library/concurrent.futures.rst:18 +msgid "" +"The asynchronous execution can be performed with threads, using " +":class:`ThreadPoolExecutor` or :class:`InterpreterPoolExecutor`, or separate" +" processes, using :class:`ProcessPoolExecutor`. Each implements the same " +"interface, which is defined by the abstract :class:`Executor` class." +msgstr "" +"异步执行可以使用线程来实现,即使用 :class:`ThreadPoolExecutor` 或 " +":class:`InterpreterPoolExecutor` 或者使用进程,即使用 :class:`ProcessPoolExecutor`。 " +"每种方式实现了相同的接口,它是由抽象类 :class:`Executor` 来定义的。" + +#: ../../library/concurrent.futures.rst:24 +msgid "" +":class:`concurrent.futures.Future` must not be confused with " +":class:`asyncio.Future`, which is designed for use with :mod:`asyncio` tasks" +" and coroutines. See the :doc:`asyncio's Future ` " +"documentation for a detailed comparison of the two." +msgstr "" +":class:`concurrent.futures.Future` 不可与 :class:`asyncio.Future` 混淆,后者被设计用于 " +":mod:`asyncio` 任务和协程。 请参阅 :doc:`asyncio 的 Future ` " +"文档查看两者的详细比较。" + +#: ../../includes/wasm-notavail.rst:3 +msgid "Availability" +msgstr "可用性" + +#: ../../includes/wasm-notavail.rst:5 +msgid "" +"This module does not work or is not available on WebAssembly. See " +":ref:`wasm-availability` for more information." +msgstr "此模块在 WebAssembly 平台上无效或不可用。 请参阅 :ref:`wasm-availability` 了解详情。" + +#: ../../library/concurrent.futures.rst:32 +msgid "Executor Objects" +msgstr "Executor 对象" + +#: ../../library/concurrent.futures.rst:36 +msgid "" +"An abstract class that provides methods to execute calls asynchronously. It" +" should not be used directly, but through its concrete subclasses." +msgstr "抽象类提供异步执行调用方法。要通过它的子类调用,而不是直接调用。" + +#: ../../library/concurrent.futures.rst:41 +msgid "" +"Schedules the callable, *fn*, to be executed as ``fn(*args, **kwargs)`` and " +"returns a :class:`Future` object representing the execution of the callable." +" ::" +msgstr "" +"调度可调用对象 *fn*,以 ``fn(*args, **kwargs)`` 方式执行并返回一个代表该可调用对象的执行的 :class:`Future`" +" 对象。 ::" + +#: ../../library/concurrent.futures.rst:45 +msgid "" +"with ThreadPoolExecutor(max_workers=1) as executor:\n" +" future = executor.submit(pow, 323, 1235)\n" +" print(future.result())" +msgstr "" +"with ThreadPoolExecutor(max_workers=1) as executor:\n" +" future = executor.submit(pow, 323, 1235)\n" +" print(future.result())" + +#: ../../library/concurrent.futures.rst:51 +msgid "Similar to :func:`map(fn, *iterables) ` except:" +msgstr "类似于 :func:`map(fn, *iterables) ` 但有以下差异:" + +#: ../../library/concurrent.futures.rst:53 +msgid "" +"The *iterables* are collected immediately rather than lazily, unless a " +"*buffersize* is specified to limit the number of submitted tasks whose " +"results have not yet been yielded. If the buffer is full, iteration over the" +" *iterables* pauses until a result is yielded from the buffer." +msgstr "" +"*iterables* 的收集是立即而非惰性的,除非指定了 *buffersize* 来限制提交结果尚未产生的任务数量。 如果缓冲区已满,对 " +"*iterables* 的迭代将暂停直到缓冲区产生了一个结果。" + +#: ../../library/concurrent.futures.rst:58 +msgid "" +"*fn* is executed asynchronously and several calls to *fn* may be made " +"concurrently." +msgstr "*fn* 是异步执行的并且可以并发对 *fn* 的多个调用。" + +#: ../../library/concurrent.futures.rst:61 +msgid "" +"The returned iterator raises a :exc:`TimeoutError` if " +":meth:`~iterator.__next__` is called and the result isn't available after " +"*timeout* seconds from the original call to :meth:`Executor.map`. *timeout* " +"can be an int or a float. If *timeout* is not specified or ``None``, there " +"is no limit to the wait time." +msgstr "" +"如果 :meth:`~iterator.__next__` 被调用且从对 :meth:`Executor.map` 原始调用 *timeout* " +"秒之后其结果还不可用则已返回的迭代器将引发 :exc:`TimeoutError`。 *timeout* 可以是整数或浮点数。 如果 *timeout*" +" 未指定或为 ``None``,则不限制等待时间。" + +#: ../../library/concurrent.futures.rst:67 +msgid "" +"If a *fn* call raises an exception, then that exception will be raised when " +"its value is retrieved from the iterator." +msgstr "如果 *fn* 调用引发了异常,那么当从迭代器获取其值时该异常将被引发。" + +#: ../../library/concurrent.futures.rst:70 +msgid "" +"When using :class:`ProcessPoolExecutor`, this method chops *iterables* into " +"a number of chunks which it submits to the pool as separate tasks. The " +"(approximate) size of these chunks can be specified by setting *chunksize* " +"to a positive integer. For very long iterables, using a large value for " +"*chunksize* can significantly improve performance compared to the default " +"size of 1. With :class:`ThreadPoolExecutor` and " +":class:`InterpreterPoolExecutor`, *chunksize* has no effect." +msgstr "" +"当使用 :class:`ProcessPoolExecutor` 时,这个方法会将 *iterables* 分块并作为单独的任务提交到执行池中。 " +"这些分块的(近似)大小可通过将 *chunksize* 设为一个正整数来指定。 对于非常长的迭代器来说,使用较大的 *chunksize* " +"值相比默认大小 1 能显著地提升性能。 对于 :class:`ThreadPoolExecutor` 和 " +":class:`InterpreterPoolExecutor`,*chunksize* 将没有效果。" + +#: ../../library/concurrent.futures.rst:79 +msgid "Added the *chunksize* parameter." +msgstr "增加了 *chunksize* 形参。" + +#: ../../library/concurrent.futures.rst:82 +msgid "Added the *buffersize* parameter." +msgstr "增加了 *buffersize* 形参。" + +#: ../../library/concurrent.futures.rst:87 +msgid "" +"Signal the executor that it should free any resources that it is using when " +"the currently pending futures are done executing. Calls to " +":meth:`Executor.submit` and :meth:`Executor.map` made after shutdown will " +"raise :exc:`RuntimeError`." +msgstr "" +"当待执行的 future 对象完成执行后向执行者发送信号,它就会释放正在使用的任何资源。 在关闭后调用 :meth:`Executor.submit` " +"和 :meth:`Executor.map` 将会引发 :exc:`RuntimeError`。" + +#: ../../library/concurrent.futures.rst:92 +msgid "" +"If *wait* is ``True`` then this method will not return until all the pending" +" futures are done executing and the resources associated with the executor " +"have been freed. If *wait* is ``False`` then this method will return " +"immediately and the resources associated with the executor will be freed " +"when all pending futures are done executing. Regardless of the value of " +"*wait*, the entire Python program will not exit until all pending futures " +"are done executing." +msgstr "" +"如果 *wait* 为 ``True`` 则此方法只有在所有待执行的 future 对象完成执行且释放已分配的资源后才会返回。 如果 *wait* 为 " +"``False``,方法立即返回,所有待执行的 future 对象完成执行后会释放已分配的资源。 不管 *wait* 的值是什么,整个 Python " +"程序将等到所有待执行的 future 对象完成执行后才退出。" + +#: ../../library/concurrent.futures.rst:100 +msgid "" +"If *cancel_futures* is ``True``, this method will cancel all pending futures" +" that the executor has not started running. Any futures that are completed " +"or running won't be cancelled, regardless of the value of *cancel_futures*." +msgstr "" +"如果 *cancel_futures* 为 ``True``,此方法将取消所有执行器还未开始运行的挂起的 Future。无论 " +"*cancel_futures* 的值是什么,任何已完成或正在运行的 Future 都不会被取消。" + +#: ../../library/concurrent.futures.rst:105 +msgid "" +"If both *cancel_futures* and *wait* are ``True``, all futures that the " +"executor has started running will be completed prior to this method " +"returning. The remaining futures are cancelled." +msgstr "" +"如果 *cancel_futures* 和 *wait* 均为 ``True``,则执行器已开始运行的所有 Future 将在此方法返回之前完成。 " +"其余的 Future 会被取消。" + +#: ../../library/concurrent.futures.rst:109 +msgid "" +"You can avoid having to call this method explicitly if you use the executor " +"as a :term:`context manager` via the :keyword:`with` statement, which will " +"shutdown the :class:`Executor` (waiting as if :meth:`Executor.shutdown` were" +" called with *wait* set to ``True``)::" +msgstr "" +"若通过 :keyword:`with` 语句将执行器作为 :term:`context manager` " +"使用,则可避免显式调用此方法,因为该语句会自动关闭 :class:`Executor` (其等待行为等同于调用 " +":meth:`Executor.shutdown` 并将 *wait* 参数设为 ``True`` 的情况)::" + +#: ../../library/concurrent.futures.rst:114 +msgid "" +"import shutil\n" +"with ThreadPoolExecutor(max_workers=4) as e:\n" +" e.submit(shutil.copy, 'src1.txt', 'dest1.txt')\n" +" e.submit(shutil.copy, 'src2.txt', 'dest2.txt')\n" +" e.submit(shutil.copy, 'src3.txt', 'dest3.txt')\n" +" e.submit(shutil.copy, 'src4.txt', 'dest4.txt')" +msgstr "" +"import shutil\n" +"with ThreadPoolExecutor(max_workers=4) as e:\n" +" e.submit(shutil.copy, 'src1.txt', 'dest1.txt')\n" +" e.submit(shutil.copy, 'src2.txt', 'dest2.txt')\n" +" e.submit(shutil.copy, 'src3.txt', 'dest3.txt')\n" +" e.submit(shutil.copy, 'src4.txt', 'dest4.txt')" + +#: ../../library/concurrent.futures.rst:121 +msgid "Added *cancel_futures*." +msgstr "增加了 *cancel_futures*。" + +#: ../../library/concurrent.futures.rst:126 +msgid "ThreadPoolExecutor" +msgstr "ThreadPoolExecutor" + +#: ../../library/concurrent.futures.rst:128 +msgid "" +":class:`ThreadPoolExecutor` is an :class:`Executor` subclass that uses a " +"pool of threads to execute calls asynchronously." +msgstr ":class:`ThreadPoolExecutor` 是 :class:`Executor` 的子类,它使用线程池来异步执行调用。" + +#: ../../library/concurrent.futures.rst:131 +msgid "" +"Deadlocks can occur when the callable associated with a :class:`Future` " +"waits on the results of another :class:`Future`. For example::" +msgstr "" +"当可调用对象已关联了一个 :class:`Future` 然后在等待另一个 :class:`Future` 的结果时就会导致死锁情况。例如::" + +#: ../../library/concurrent.futures.rst:134 +msgid "" +"import time\n" +"def wait_on_b():\n" +" time.sleep(5)\n" +" print(b.result()) # b will never complete because it is waiting on a.\n" +" return 5\n" +"\n" +"def wait_on_a():\n" +" time.sleep(5)\n" +" print(a.result()) # a will never complete because it is waiting on b.\n" +" return 6\n" +"\n" +"\n" +"executor = ThreadPoolExecutor(max_workers=2)\n" +"a = executor.submit(wait_on_b)\n" +"b = executor.submit(wait_on_a)" +msgstr "" +"import time\n" +"def wait_on_b():\n" +" time.sleep(5)\n" +" print(b.result()) # b 永远不会结束因为它在等待 a。\n" +" return 5\n" +"\n" +"def wait_on_a():\n" +" time.sleep(5)\n" +" print(a.result()) # a 永远不会结束因为它在等待 b。\n" +" return 6\n" +"\n" +"\n" +"executor = ThreadPoolExecutor(max_workers=2)\n" +"a = executor.submit(wait_on_b)\n" +"b = executor.submit(wait_on_a)" + +#: ../../library/concurrent.futures.rst:150 +msgid "And::" +msgstr "以及::" + +#: ../../library/concurrent.futures.rst:152 +msgid "" +"def wait_on_future():\n" +" f = executor.submit(pow, 5, 2)\n" +" # This will never complete because there is only one worker thread and\n" +" # it is executing this function.\n" +" print(f.result())\n" +"\n" +"executor = ThreadPoolExecutor(max_workers=1)\n" +"future = executor.submit(wait_on_future)\n" +"# Note: calling future.result() would also cause a deadlock because\n" +"# the single worker thread is already waiting for wait_on_future()." +msgstr "" +"def wait_on_future():\n" +" f = executor.submit(pow, 5, 2)\n" +" # 这将永远不会完成因为只有一个工作线程\n" +" # 并且它正在执行此函数\n" +" print(f.result())\n" +"\n" +"executor = ThreadPoolExecutor(max_workers=1)\n" +"future = executor.submit(wait_on_future)\n" +"# 注意:调用 future.result() 也会导致死锁因为\n" +"# 这个工作线程已经在等待 wait_on_future()。" + +#: ../../library/concurrent.futures.rst:166 +msgid "" +"An :class:`Executor` subclass that uses a pool of at most *max_workers* " +"threads to execute calls asynchronously." +msgstr ":class:`Executor` 子类使用最多 *max_workers* 个线程的线程池来异步执行调用。" + +#: ../../library/concurrent.futures.rst:169 +msgid "" +"All threads enqueued to ``ThreadPoolExecutor`` will be joined before the " +"interpreter can exit. Note that the exit handler which does this is executed" +" *before* any exit handlers added using ``atexit``. This means exceptions in" +" the main thread must be caught and handled in order to signal threads to " +"exit gracefully. For this reason, it is recommended that " +"``ThreadPoolExecutor`` not be used for long-running tasks." +msgstr "" +"所有排入 ``ThreadPoolExecutor`` 的线程将在解释器退出之前被合并。 请注意执行此操作的退出处理器会在任何使用 ``atexit``" +" 添加的退出处理器 *之前* 被执行。 这意味着主线程中的异常必须被捕获和处理以便向线程发出信号使其能够优雅地退出。 由于这个原因,建议不要将 " +"``ThreadPoolExecutor`` 用于长期运行的任务。" + +#: ../../library/concurrent.futures.rst:176 +msgid "" +"*initializer* is an optional callable that is called at the start of each " +"worker thread; *initargs* is a tuple of arguments passed to the initializer." +" Should *initializer* raise an exception, all currently pending jobs will " +"raise a :exc:`~concurrent.futures.thread.BrokenThreadPool`, as well as any " +"attempt to submit more jobs to the pool." +msgstr "" +"*initializer* 是在每个工作者线程开始处调用的一个可选可调用对象。 *initargs* 是传递给初始化器的元组参数。如果 " +"*initializer* 引发了异常,所有当前等待的任务以及任何向池提交更多任务的尝试都将引发 " +":exc:`~concurrent.futures.thread.BrokenThreadPool`。" + +#: ../../library/concurrent.futures.rst:182 +msgid "" +"If *max_workers* is ``None`` or not given, it will default to the number of " +"processors on the machine, multiplied by ``5``, assuming that " +":class:`ThreadPoolExecutor` is often used to overlap I/O instead of CPU work" +" and the number of workers should be higher than the number of workers for " +":class:`ProcessPoolExecutor`." +msgstr "" +"如果 *max_workers* 为 ``None`` 或没有指定,将默认为机器处理器的个数乘以 ``5``,因为假定 " +":class:`ThreadPoolExecutor` 通常用来重叠 I/O 操作而非 CPU 运算,并且工作线程的数量应当高于 " +":class:`ProcessPoolExecutor` 的工作进程数量。" + +#: ../../library/concurrent.futures.rst:190 +msgid "" +"Added the *thread_name_prefix* parameter to allow users to control the " +":class:`threading.Thread` names for worker threads created by the pool for " +"easier debugging." +msgstr "" +"增加了 *thread_name_prefix* 形参来允许用户控制由线程池创建的 :class:`threading.Thread` " +"工作线程名称以方便调试。" + +#: ../../library/concurrent.futures.rst:195 +#: ../../library/concurrent.futures.rst:400 +msgid "Added the *initializer* and *initargs* arguments." +msgstr "加入 *initializer* 和 *initargs* 参数。" + +#: ../../library/concurrent.futures.rst:198 +msgid "" +"Default value of *max_workers* is changed to ``min(32, os.cpu_count() + " +"4)``. This default value preserves at least 5 workers for I/O bound tasks. " +"It utilizes at most 32 CPU cores for CPU bound tasks which release the GIL. " +"And it avoids using very large resources implicitly on many-core machines." +msgstr "" +"*max_workers* 的默认值已改为 ``min(32, os.cpu_count() + 4)``。 这个默认值会保留至少 5 个工作线程用于 " +"I/O 密集型任务。 对于那些释放了 GIL 的 CPU 密集型任务,它最多会使用 32 个 CPU " +"核心。这样能够避免在多核机器上不知不觉地使用大量资源。" + +#: ../../library/concurrent.futures.rst:204 +msgid "" +"ThreadPoolExecutor now reuses idle worker threads before starting " +"*max_workers* worker threads too." +msgstr "现在 ThreadPoolExecutor 在启动 *max_workers* 个工作线程之前也会重用空闲的工作线程。" + +#: ../../library/concurrent.futures.rst:207 +msgid "" +"Default value of *max_workers* is changed to ``min(32, " +"(os.process_cpu_count() or 1) + 4)``." +msgstr "*max_workers* 的默认值已改为 ``min(32, (os.process_cpu_count() or 1) + 4)``。" + +#: ../../library/concurrent.futures.rst:215 +msgid "ThreadPoolExecutor Example" +msgstr "ThreadPoolExecutor 例子" + +#: ../../library/concurrent.futures.rst:218 +msgid "" +"import concurrent.futures\n" +"import urllib.request\n" +"\n" +"URLS = ['http://www.foxnews.com/',\n" +" 'http://www.cnn.com/',\n" +" 'http://europe.wsj.com/',\n" +" 'http://www.bbc.co.uk/',\n" +" 'http://nonexistent-subdomain.python.org/']\n" +"\n" +"# Retrieve a single page and report the URL and contents\n" +"def load_url(url, timeout):\n" +" with urllib.request.urlopen(url, timeout=timeout) as conn:\n" +" return conn.read()\n" +"\n" +"# We can use a with statement to ensure threads are cleaned up promptly\n" +"with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:\n" +" # Start the load operations and mark each future with its URL\n" +" future_to_url = {executor.submit(load_url, url, 60): url for url in URLS}\n" +" for future in concurrent.futures.as_completed(future_to_url):\n" +" url = future_to_url[future]\n" +" try:\n" +" data = future.result()\n" +" except Exception as exc:\n" +" print('%r generated an exception: %s' % (url, exc))\n" +" else:\n" +" print('%r page is %d bytes' % (url, len(data)))" +msgstr "" +"import concurrent.futures\n" +"import urllib.request\n" +"\n" +"URLS = ['http://www.foxnews.com/',\n" +" 'http://www.cnn.com/',\n" +" 'http://europe.wsj.com/',\n" +" 'http://www.bbc.co.uk/',\n" +" 'http://nonexistent-subdomain.python.org/']\n" +"\n" +"# 获取一个页面并报告其 URL 和内容\n" +"def load_url(url, timeout):\n" +" with urllib.request.urlopen(url, timeout=timeout) as conn:\n" +" return conn.read()\n" +"\n" +"# 我们可以使用一个 with 语句来确保线程被迅速清理\n" +"with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:\n" +" # 开始加载操作并以每个 Future 对象的 URL 对其进行标记\n" +" future_to_url = {executor.submit(load_url, url, 60): url for url in URLS}\n" +" for future in concurrent.futures.as_completed(future_to_url):\n" +" url = future_to_url[future]\n" +" try:\n" +" data = future.result()\n" +" except Exception as exc:\n" +" print('%r generated an exception: %s' % (url, exc))\n" +" else:\n" +" print('%r page is %d bytes' % (url, len(data)))" + +#: ../../library/concurrent.futures.rst:247 +msgid "InterpreterPoolExecutor" +msgstr "InterpreterPoolExecutor" + +#: ../../library/concurrent.futures.rst:251 +msgid "" +"The :class:`InterpreterPoolExecutor` class uses a pool of interpreters to " +"execute calls asynchronously. It is a :class:`ThreadPoolExecutor` subclass," +" which means each worker is running in its own thread. The difference here " +"is that each worker has its own interpreter, and runs each task using that " +"interpreter." +msgstr "" +":class:`InterpreterPoolExecutor` 类使用一个解释器池来异步地执行调用。 它是 " +":class:`ThreadPoolExecutor` 的子类,这意味着每个工作解释器在它自己的线程中运行。 " +"它与其父类的区别在于每个工作线程都具有自己的解释器,并使用该解释器运行每个任务。" + +#: ../../library/concurrent.futures.rst:257 +msgid "" +"The biggest benefit to using interpreters instead of only threads is true " +"multi-core parallelism. Each interpreter has its own :term:`Global " +"Interpreter Lock `, so code running in one " +"interpreter can run on one CPU core, while code in another interpreter runs " +"unblocked on a different core." +msgstr "" +"使用解释器而非只用线程的最大好处是真正的多核心并行。 每个解释器都有自己的 :term:`全局解释器锁 `,因此在一个解释器中运行的代码可以在一个 CPU 核心上运行,而在另一个解释器中运行的代码可以在不同的核心上无阻塞地运行。" + +#: ../../library/concurrent.futures.rst:263 +msgid "" +"The tradeoff is that writing concurrent code for use with multiple " +"interpreters can take extra effort. However, this is because it forces you " +"to be deliberate about how and when interpreters interact, and to be " +"explicit about what data is shared between interpreters. This results in " +"several benefits that help balance the extra effort, including true multi-" +"core parallelism, For example, code written this way can make it easier to " +"reason about concurrency. Another major benefit is that you don't have to " +"deal with several of the big pain points of using threads, like race " +"conditions." +msgstr "" +"作为交换的是编写用于多解释器的并发代码需要额外的考量。 " +"不过,这是由于它会迫使你谨慎处理多解释器要怎样以及何时进行交互,并明确哪些数据要在解释器之间进行共享。 " +"这导致几项有助于对额外的考量进行平衡的好处,包括真正的多核心并行。 " +"例如,以这种方式编写的代码可以更容易地理顺并发过程。另一项重要的好处是你不必处理某些使用线程的关键痛点,比如竞争条件等。" + +#: ../../library/concurrent.futures.rst:273 +msgid "" +"Each worker's interpreter is isolated from all the other interpreters. " +"\"Isolated\" means each interpreter has its own runtime state and operates " +"completely independently. For example, if you redirect :data:`sys.stdout` " +"in one interpreter, it will not be automatically redirected to any other " +"interpreter. If you import a module in one interpreter, it is not " +"automatically imported in any other. You would need to import the module " +"separately in interpreter where you need it. In fact, each module imported " +"in an interpreter is a completely separate object from the same module in a " +"different interpreter, including :mod:`sys`, :mod:`builtins`, and even " +"``__main__``." +msgstr "" +"每个工作线程的解释器都是与其他所有解释器隔离的。“隔离”意味着每个解释器都有自己的运行时状态,并且完全独立地运行。例如,如果你在一个解释器中重定向 " +":data:`sys.stdout` " +",它不会自动重定向到任何其他解释器。如果你在一个解释器中导入了一个模块,它不会在其他解释器中自动导入。你需要在需要它的解释器中单独导入模块。事实上,在解释器中导入的每个模块都是与不同解释器中的相同模块完全独立的对象,包括" +" :mod:`sys`、:mod:`builtins` 甚至 ``__main__``。" + +#: ../../library/concurrent.futures.rst:285 +msgid "" +"Isolation means a mutable object, or other data, cannot be used by more than" +" one interpreter at the same time. That effectively means interpreters " +"cannot actually share such objects or data. Instead, each interpreter must " +"have its own copy, and you will have to synchronize any changes between the " +"copies manually. Immutable objects and data, like the builtin singletons, " +"strings, and tuples of immutable objects, don't have these limitations." +msgstr "" +"隔离意味着可变对象或其他数据不能同时被多个解释器使用。这实际上意味着解释器实际上不能共享这些对象或数据。相反,每个解释器必须有自己的副本,并且必须手动同步副本之间的任何更改。不可变对象和数据,如不可变对象的内置单例、字符串和元组,就没有这些限制。" + +#: ../../library/concurrent.futures.rst:293 +msgid "" +"Communicating and synchronizing between interpreters is most effectively " +"done using dedicated tools, like those proposed in :pep:`734`. One less " +"efficient alternative is to serialize with :mod:`pickle` and then send the " +"bytes over a shared :mod:`socket ` or :func:`pipe `." +msgstr "" +"解释器之间的通信和同步使用专用工具是最有效的,就像在 :pep:`734` 中建议的那样。 一种效率较低的替代方法是使用 :mod:`pickle` " +"进行序列化,然后通过共享的 :mod:`套接字 ` 或 :func:`管道 ` 发送字节。" + +#: ../../library/concurrent.futures.rst:301 +msgid "" +"A :class:`ThreadPoolExecutor` subclass that executes calls asynchronously " +"using a pool of at most *max_workers* threads. Each thread runs tasks in " +"its own interpreter. The worker interpreters are isolated from each other, " +"which means each has its own runtime state and that they can't share any " +"mutable objects or other data. Each interpreter has its own :term:`Global " +"Interpreter Lock `, which means code run with this " +"executor has true multi-core parallelism." +msgstr "" +"一个 :class:`ThreadPoolExecutor` 子类,使用最多 *max_workers* 线程的池异步执行调用。 " +"每个线程在自己的解释器中运行任务。 工作解释器彼此隔离,这意味着每个解释器都有自己的运行时状态,并且它们不能共享任何可变对象或其他数据。 " +"每个解释器都有自己的 :term:`全局解释器锁 `,这意味着使用该执行器运行的代码具有真正的多核并行性。" + +#: ../../library/concurrent.futures.rst:309 +msgid "" +"The optional *initializer* and *initargs* arguments have the same meaning as" +" for :class:`!ThreadPoolExecutor`: the initializer is run when each worker " +"is created, though in this case it is run in the worker's interpreter. The " +"executor serializes the *initializer* and *initargs* using :mod:`pickle` " +"when sending them to the worker's interpreter." +msgstr "" +"可选的 *initializer* 和 *initargs* 参数与 :class:`!ThreadPoolExecutor` " +"具有相同的含义:初始化器在每个工作线程被创建时运行,尽管在这种情况下它是在工作线程的解释器中运行的。 当执行器将 *initializer* 和 " +"*initargs* 发送给工作线程的解释器时,使用 :mod:`pickle` 对它们进行序列化。" + +#: ../../library/concurrent.futures.rst:317 +msgid "" +"The executor may replace uncaught exceptions from *initializer* with " +":class:`~concurrent.interpreters.ExecutionFailed`." +msgstr "" +"执行器可以将来自 *initializer* 的未捕获异常替换为 " +":class:`~concurrent.interpreters.ExecutionFailed`。" + +#: ../../library/concurrent.futures.rst:320 +msgid "Other caveats from parent :class:`ThreadPoolExecutor` apply here." +msgstr "来自 :class:`ThreadPoolExecutor` 的其他警告也适用于此。" + +#: ../../library/concurrent.futures.rst:322 +msgid "" +":meth:`~Executor.submit` and :meth:`~Executor.map` work like normal, except " +"the worker serializes the callable and arguments using :mod:`pickle` when " +"sending them to its interpreter. The worker likewise serializes the return " +"value when sending it back." +msgstr "" +":meth:`~Executor.submit` 和 :meth:`~Executor.map` " +"的工作方式与正常情况一样,只是工作线程在将可调用函数和参数发送到其解释器时使用 :mod:`pickle` 对其进行序列化。 " +"在发送返回值时,工作线程同样会对其进行序列化。" + +#: ../../library/concurrent.futures.rst:327 +msgid "" +"When a worker's current task raises an uncaught exception, the worker always" +" tries to preserve the exception as-is. If that is successful then it also " +"sets the ``__cause__`` to a corresponding " +":class:`~concurrent.interpreters.ExecutionFailed` instance, which contains a" +" summary of the original exception. In the uncommon case that the worker is " +"not able to preserve the original as-is then it directly preserves the " +"corresponding :class:`~concurrent.interpreters.ExecutionFailed` instance " +"instead." +msgstr "" +"当一个工作线程的当前任务引发未捕获的异常时,工作线程总是会尝试原样保留异常。 如果成功则它还会将 ``__cause__`` 设为对应的 " +":class:`~concurrent.interpreters.ExecutionFailed` 实例,该实例包含原始异常的概要信息。 " +"在工作线程不能原样保留异常的少数情况下它会改为直接保留对应的 " +":class:`~concurrent.interpreters.ExecutionFailed` 实例。" + +#: ../../library/concurrent.futures.rst:339 +msgid "ProcessPoolExecutor" +msgstr "ProcessPoolExecutor" + +#: ../../library/concurrent.futures.rst:341 +msgid "" +"The :class:`ProcessPoolExecutor` class is an :class:`Executor` subclass that" +" uses a pool of processes to execute calls asynchronously. " +":class:`ProcessPoolExecutor` uses the :mod:`multiprocessing` module, which " +"allows it to side-step the :term:`Global Interpreter Lock ` but also means that only picklable objects can be " +"executed and returned." +msgstr "" +":class:`ProcessPoolExecutor` 类是 :class:`Executor` 的子类,它使用进程池来异步地执行调用。 " +":class:`ProcessPoolExecutor` 会使用 :mod:`multiprocessing` 模块,这允许它绕过 " +":term:`全局解释器锁 ` 但也意味着只可以处理和返回可封存的对象。" + +#: ../../library/concurrent.futures.rst:348 +msgid "" +"The ``__main__`` module must be importable by worker subprocesses. This " +"means that :class:`ProcessPoolExecutor` will not work in the interactive " +"interpreter." +msgstr "" +"``__main__`` 模块必须可以被工作者子进程导入。这意味着 :class:`ProcessPoolExecutor` " +"不可以工作在交互式解释器中。" + +#: ../../library/concurrent.futures.rst:351 +msgid "" +"Calling :class:`Executor` or :class:`Future` methods from a callable " +"submitted to a :class:`ProcessPoolExecutor` will result in deadlock." +msgstr "" +"从已提交给 :class:`ProcessPoolExecutor` 的可调用对象中调用 :class:`Executor` 或 " +":class:`Future` 的方法会导致死锁。" + +#: ../../library/concurrent.futures.rst:354 +msgid "" +"Note that the restrictions on functions and arguments needing to picklable " +"as per :class:`multiprocessing.Process` apply when using " +":meth:`~Executor.submit` and :meth:`~Executor.map` on a " +":class:`ProcessPoolExecutor`. A function defined in a REPL or a lambda " +"should not be expected to work." +msgstr "" +"请注意,在 :class:`ProcessPoolExecutor` 上使用 :meth:`~Executor.submit` 和 " +":meth:`~Executor.map` 时函数和参数需要如 :class:`multiprocessing.Process` " +"那样应用必要的限制条件以支持 pickle 操作。 在 REPL 或 lambda 中定义的函数不应被期望能正确工作。" + +#: ../../library/concurrent.futures.rst:361 +msgid "" +"An :class:`Executor` subclass that executes calls asynchronously using a " +"pool of at most *max_workers* processes. If *max_workers* is ``None`` or " +"not given, it will default to :func:`os.process_cpu_count`. If *max_workers*" +" is less than or equal to ``0``, then a :exc:`ValueError` will be raised. On" +" Windows, *max_workers* must be less than or equal to ``61``. If it is not " +"then :exc:`ValueError` will be raised. If *max_workers* is ``None``, then " +"the default chosen will be at most ``61``, even if more processors are " +"available. *mp_context* can be a :mod:`multiprocessing` context or ``None``." +" It will be used to launch the workers. If *mp_context* is ``None`` or not " +"given, the default :mod:`multiprocessing` context is used. See " +":ref:`multiprocessing-start-methods`." +msgstr "" +"异步地执行调用的 :class:`Executor` 子类使用最多 *max_workers* 个进程的进程池。 如果 *max_workers* 为 " +"``None`` 或未给出,它将默认为 :func:`os.process_cpu_count`。 如果 *max_workers* 小于等于 " +"``0``,则将引发 :exc:`ValueError`。 在 Windows 上,*max_workers* 必须小于等于 ``61``。 " +"如果不是这样则将引发 :exc:`ValueError`。 如果 *max_workers* 为 ``None``,则选择的默认值最多为 " +"``61``,即使存在更多的处理器。 *mp_context* 可以是一个 :mod:`multiprocessing` 上下文或是 ``None``。" +" 它将被用来启动工作进程。 如果 *mp_context* 为 ``None`` 或未给出,则将使用默认的 :mod:`multiprocessing`" +" 上下文。 参见 :ref:`multiprocessing-start-methods`。" + +#: ../../library/concurrent.futures.rst:375 +msgid "" +"*initializer* is an optional callable that is called at the start of each " +"worker process; *initargs* is a tuple of arguments passed to the " +"initializer. Should *initializer* raise an exception, all currently pending" +" jobs will raise a :exc:`~concurrent.futures.process.BrokenProcessPool`, as " +"well as any attempt to submit more jobs to the pool." +msgstr "" +"*initializer* 是一个可选的可调用对象,它会在每个工作进程启动时被调用;*initargs* 是传给 initializer 的参数元组。 " +"如果 *initializer* 引发了异常,则所有当前在等待的任务以及任何向进程池提交更多任务的尝试都将引发 " +":exc:`~concurrent.futures.process.BrokenProcessPool`。" + +#: ../../library/concurrent.futures.rst:381 +msgid "" +"*max_tasks_per_child* is an optional argument that specifies the maximum " +"number of tasks a single process can execute before it will exit and be " +"replaced with a fresh worker process. By default *max_tasks_per_child* is " +"``None`` which means worker processes will live as long as the pool. When a " +"max is specified, the \"spawn\" multiprocessing start method will be used by" +" default in absence of a *mp_context* parameter. This feature is " +"incompatible with the \"fork\" start method." +msgstr "" +"*max_tasks_per_child* 是指定单个进程在其退出并替换为新工作进程之前可以执行的最大任务数量的可选参数。 在默认情况下 " +"*max_tasks_per_child* 为 ``None`` 表示工作进程将存活与进程池一样长的时间。 当指定了最大数量时,则如果不存在 " +"*mp_context* 形参则将默认使用 \"spawn\" 多进程启动方法。 此特性不能兼容 \"fork\" 启动方法。" + +#: ../../library/concurrent.futures.rst:389 +msgid "" +"When one of the worker processes terminates abruptly, a " +":exc:`~concurrent.futures.process.BrokenProcessPool` error is now raised. " +"Previously, behaviour was undefined but operations on the executor or its " +"futures would often freeze or deadlock." +msgstr "" +"当某个工作进程突然终止时,现在将引发 :exc:`~concurrent.futures.process.BrokenProcessPool`。 " +"在之前版本中,它的行为是未定义的但在执行器上的操作或它的 future 对象往往会被冻结或死锁。" + +#: ../../library/concurrent.futures.rst:396 +msgid "" +"The *mp_context* argument was added to allow users to control the " +"start_method for worker processes created by the pool." +msgstr "添加 *mp_context* 参数允许用户控制由进程池创建的工作者进程的启动方法。" + +#: ../../library/concurrent.futures.rst:402 +msgid "" +"The *max_tasks_per_child* argument was added to allow users to control the " +"lifetime of workers in the pool." +msgstr "增加了 *max_tasks_per_child* 参数以允许用户控制进程池中工作进程的生命期。" + +#: ../../library/concurrent.futures.rst:406 +msgid "" +"On POSIX systems, if your application has multiple threads and the " +":mod:`multiprocessing` context uses the ``\"fork\"`` start method: The " +":func:`os.fork` function called internally to spawn workers may raise a " +":exc:`DeprecationWarning`. Pass a *mp_context* configured to use a different" +" start method. See the :func:`os.fork` documentation for further " +"explanation." +msgstr "" +"在 POSIX 系统上,如果你的应用程序有多个线程而 :mod:`multiprocessing` 上下文使用了 ``\"fork\"`` " +"启动方法:内部调用的 :func:`os.fork` 函数来生成工作进程可能会引发 :exc:`DeprecationWarning`。 " +"请传递配置为使用不同启动方法的 *mp_context*。 进一步的解释请参阅 :func:`os.fork` 文档。" + +#: ../../library/concurrent.futures.rst:414 +msgid "" +"*max_workers* uses :func:`os.process_cpu_count` by default, instead of " +":func:`os.cpu_count`." +msgstr "" +"在默认情况下 *max_workers* 将使用 :func:`os.process_cpu_count`,而不是 " +":func:`os.cpu_count`。" + +#: ../../library/concurrent.futures.rst:418 +msgid "" +"The default process start method (see :ref:`multiprocessing-start-methods`) " +"changed away from *fork*. If you require the *fork* start method for " +":class:`ProcessPoolExecutor` you must explicitly pass " +"``mp_context=multiprocessing.get_context(\"fork\")``." +msgstr "" +"默认的进程启动方法 (参见 :ref:`multiprocessing-start-methods`) 已改为不再使用 *fork*。 如果你需要为 " +":class:`ProcessPoolExecutor` 使用 *fork* 启动方法你必须显式地传入 " +"``mp_context=multiprocessing.get_context(\"fork\")``。" + +#: ../../library/concurrent.futures.rst:424 +msgid "" +"Fixed a deadlock (:gh:`115634`) where the executor could hang after a worker" +" process exited upon reaching its *max_tasks_per_child* limit while tasks " +"remained queued." +msgstr "" + +#: ../../library/concurrent.futures.rst:431 +msgid "" +"Attempt to terminate all living worker processes immediately by calling " +":meth:`Process.terminate ` on each of " +"them. Internally, it will also call :meth:`Executor.shutdown` to ensure that" +" all other resources associated with the executor are freed." +msgstr "" +"尝试通过对每个存活的工作进程调用 :meth:`Process.terminate " +"` 来立即终止它们。 在内部,它还将调用 " +":meth:`Executor.shutdown` 以确保所有与执行器相关联的其他资源被释放。" + +#: ../../library/concurrent.futures.rst:436 +#: ../../library/concurrent.futures.rst:448 +msgid "" +"After calling this method the caller should no longer submit tasks to the " +"executor." +msgstr "在调用此方法之后调用方不应再向执行器提交任务。" + +#: ../../library/concurrent.futures.rst:443 +msgid "" +"Attempt to kill all living worker processes immediately by calling " +":meth:`Process.kill ` on each of them. " +"Internally, it will also call :meth:`Executor.shutdown` to ensure that all " +"other resources associated with the executor are freed." +msgstr "" +"尝试通过对每个进程调用 :meth:`Process.kill ` " +"来立即杀死所有存活的工作进程。 在内部,它还将调用 :meth:`Executor.shutdown` 来确保释放与执行器相关的所有其他资源。" + +#: ../../library/concurrent.futures.rst:456 +msgid "ProcessPoolExecutor Example" +msgstr "ProcessPoolExecutor 例子" + +#: ../../library/concurrent.futures.rst:459 +msgid "" +"import concurrent.futures\n" +"import math\n" +"\n" +"PRIMES = [\n" +" 112272535095293,\n" +" 112582705942171,\n" +" 112272535095293,\n" +" 115280095190773,\n" +" 115797848077099,\n" +" 1099726899285419]\n" +"\n" +"def is_prime(n):\n" +" if n < 2:\n" +" return False\n" +" if n == 2:\n" +" return True\n" +" if n % 2 == 0:\n" +" return False\n" +"\n" +" sqrt_n = int(math.floor(math.sqrt(n)))\n" +" for i in range(3, sqrt_n + 1, 2):\n" +" if n % i == 0:\n" +" return False\n" +" return True\n" +"\n" +"def main():\n" +" with concurrent.futures.ProcessPoolExecutor() as executor:\n" +" for number, prime in zip(PRIMES, executor.map(is_prime, PRIMES)):\n" +" print('%d is prime: %s' % (number, prime))\n" +"\n" +"if __name__ == '__main__':\n" +" main()" +msgstr "" +"import concurrent.futures\n" +"import math\n" +"\n" +"PRIMES = [\n" +" 112272535095293,\n" +" 112582705942171,\n" +" 112272535095293,\n" +" 115280095190773,\n" +" 115797848077099,\n" +" 1099726899285419]\n" +"\n" +"def is_prime(n):\n" +" if n < 2:\n" +" return False\n" +" if n == 2:\n" +" return True\n" +" if n % 2 == 0:\n" +" return False\n" +"\n" +" sqrt_n = int(math.floor(math.sqrt(n)))\n" +" for i in range(3, sqrt_n + 1, 2):\n" +" if n % i == 0:\n" +" return False\n" +" return True\n" +"\n" +"def main():\n" +" with concurrent.futures.ProcessPoolExecutor() as executor:\n" +" for number, prime in zip(PRIMES, executor.map(is_prime, PRIMES)):\n" +" print('%d is prime: %s' % (number, prime))\n" +"\n" +"if __name__ == '__main__':\n" +" main()" + +#: ../../library/concurrent.futures.rst:494 +msgid "Future Objects" +msgstr "Future 对象" + +#: ../../library/concurrent.futures.rst:496 +msgid "" +"The :class:`Future` class encapsulates the asynchronous execution of a " +"callable. :class:`Future` instances are created by :meth:`Executor.submit`." +msgstr "" +":class:`Future` 类将可调用对象封装为异步执行。:class:`Future` 实例由 :meth:`Executor.submit` " +"创建。" + +#: ../../library/concurrent.futures.rst:501 +msgid "" +"Encapsulates the asynchronous execution of a callable. :class:`Future` " +"instances are created by :meth:`Executor.submit` and should not be created " +"directly except for testing." +msgstr "" +"将可调用对象封装为异步执行。:class:`Future` 实例由 :meth:`Executor.submit` 创建,除非测试,不应直接创建。" + +#: ../../library/concurrent.futures.rst:507 +msgid "" +"Attempt to cancel the call. If the call is currently being executed or " +"finished running and cannot be cancelled then the method will return " +"``False``, otherwise the call will be cancelled and the method will return " +"``True``." +msgstr "" +"尝试取消调用。 如果调用正在执行或已结束运行不能被取消则该方法将返回 ``False``,否则调用会被取消并且该方法将返回 ``True``。" + +#: ../../library/concurrent.futures.rst:514 +msgid "Return ``True`` if the call was successfully cancelled." +msgstr "如果调用成功取消返回 ``True``。" + +#: ../../library/concurrent.futures.rst:518 +msgid "" +"Return ``True`` if the call is currently being executed and cannot be " +"cancelled." +msgstr "如果调用正在执行而且不能被取消那么返回 ``True`` 。" + +#: ../../library/concurrent.futures.rst:523 +msgid "" +"Return ``True`` if the call was successfully cancelled or finished running." +msgstr "如果调用已被取消或正常结束那么返回 ``True``。" + +#: ../../library/concurrent.futures.rst:528 +msgid "" +"Return the value returned by the call. If the call hasn't yet completed then" +" this method will wait up to *timeout* seconds. If the call hasn't " +"completed in *timeout* seconds, then a :exc:`TimeoutError` will be raised. " +"*timeout* can be an int or float. If *timeout* is not specified or " +"``None``, there is no limit to the wait time." +msgstr "" +"返回调用所返回的值。 如果调用尚未完成则此方法将等待至多 *timeout* 秒。 如果调用在 *timeout* 秒内仍未完成,则将引发 " +":exc:`TimeoutError`。 *timeout* 可以为整数或浮点数。 如果 *timeout* 未指定或为 " +"``None``,则不限制等待时间。" + +#: ../../library/concurrent.futures.rst:535 +#: ../../library/concurrent.futures.rst:549 +msgid "" +"If the future is cancelled before completing then :exc:`.CancelledError` " +"will be raised." +msgstr "如果 future 在完成前被取消则 :exc:`.CancelledError` 将被触发。" + +#: ../../library/concurrent.futures.rst:538 +msgid "" +"If the call raised an exception, this method will raise the same exception." +msgstr "如果调用引发了一个异常,这个方法也会引发同样的异常。" + +#: ../../library/concurrent.futures.rst:542 +msgid "" +"Return the exception raised by the call. If the call hasn't yet completed " +"then this method will wait up to *timeout* seconds. If the call hasn't " +"completed in *timeout* seconds, then a :exc:`TimeoutError` will be raised. " +"*timeout* can be an int or float. If *timeout* is not specified or " +"``None``, there is no limit to the wait time." +msgstr "" +"返回调用所引发的异常。 如果调用尚未完成则此方法将等待至多 *timeout* 秒。 如果调用在 *timeout* 秒内仍未完成,则将引发 " +":exc:`TimeoutError`。 *timeout* 可以为整数或浮点数。 如果 *timeout* 未指定或为 " +"``None``,则不限制等待时间。" + +#: ../../library/concurrent.futures.rst:552 +msgid "If the call completed without raising, ``None`` is returned." +msgstr "如果调用正常完成那么返回 ``None``。" + +#: ../../library/concurrent.futures.rst:556 +msgid "" +"Attaches the callable *fn* to the future. *fn* will be called, with the " +"future as its only argument, when the future is cancelled or finishes " +"running." +msgstr "" +"附加可调用 *fn* 到 future 对象。当 future 对象被取消或完成运行时,将会调用 *fn*,而这个 future " +"对象将作为它唯一的参数。" + +#: ../../library/concurrent.futures.rst:560 +msgid "" +"Added callables are called in the order that they were added and are always " +"called in a thread belonging to the process that added them. If the " +"callable raises an :exc:`Exception` subclass, it will be logged and ignored." +" If the callable raises a :exc:`BaseException` subclass, the behavior is " +"undefined." +msgstr "" +"加入的可调用对象总被属于添加它们的进程中的线程按加入的顺序调用。如果可调用对象引发一个 :exc:`Exception` " +"子类,它会被记录下来并被忽略掉。如果可调用对象引发一个 :exc:`BaseException` 子类,这个行为没有定义。" + +#: ../../library/concurrent.futures.rst:566 +msgid "" +"If the future has already completed or been cancelled, *fn* will be called " +"immediately." +msgstr "如果 future 对象已经完成或已取消,*fn* 会被立即调用。" + +#: ../../library/concurrent.futures.rst:569 +msgid "" +"The following :class:`Future` methods are meant for use in unit tests and " +":class:`Executor` implementations." +msgstr "下面这些 :class:`Future` 方法用于单元测试和 :class:`Executor` 实现。" + +#: ../../library/concurrent.futures.rst:574 +msgid "" +"This method should only be called by :class:`Executor` implementations " +"before executing the work associated with the :class:`Future` and by unit " +"tests." +msgstr "这个方法只可以在执行关联 :class:`Future` 工作之前由 :class:`Executor` 实现调用或由单元测试调用。" + +#: ../../library/concurrent.futures.rst:578 +msgid "" +"If the method returns ``False`` then the :class:`Future` was cancelled, i.e." +" :meth:`Future.cancel` was called and returned ``True``. Any threads " +"waiting on the :class:`Future` completing (i.e. through :func:`as_completed`" +" or :func:`wait`) will be woken up." +msgstr "" +"如果此方法返回 ``False`` 则 :class:`Future` 已被取消,即 :meth:`Future.cancel` 已被调用并返回 " +"``True``。 任何等待 :class:`Future` 完成 (即通过 :func:`as_completed` 或 :func:`wait`) " +"的线程将被唤醒。" + +#: ../../library/concurrent.futures.rst:583 +msgid "" +"If the method returns ``True`` then the :class:`Future` was not cancelled " +"and has been put in the running state, i.e. calls to :meth:`Future.running` " +"will return ``True``." +msgstr "" +"如果此方法返回 ``True`` 则 :class:`Future` 没有被取消并已被置为正在运行的状态,即对 " +":meth:`Future.running` 的调用将返回 ``True``。" + +#: ../../library/concurrent.futures.rst:587 +msgid "" +"This method can only be called once and cannot be called after " +":meth:`Future.set_result` or :meth:`Future.set_exception` have been called." +msgstr "" +"这个方法只可以被调用一次并且不能在调用 :meth:`Future.set_result` 或 :meth:`Future.set_exception`" +" 之后再调用。" + +#: ../../library/concurrent.futures.rst:593 +msgid "" +"Sets the result of the work associated with the :class:`Future` to *result*." +msgstr "将 :class:`Future` 关联工作的结果设为 *result*。" + +#: ../../library/concurrent.futures.rst:596 +#: ../../library/concurrent.futures.rst:609 +msgid "" +"This method should only be used by :class:`Executor` implementations and " +"unit tests." +msgstr "这个方法只可以由 :class:`Executor` 实现和单元测试使用。" + +#: ../../library/concurrent.futures.rst:599 +#: ../../library/concurrent.futures.rst:612 +msgid "" +"This method raises :exc:`concurrent.futures.InvalidStateError` if the " +":class:`Future` is already done." +msgstr "" +"如果 :class:`Future` 已经完成则此方法会引发 :exc:`concurrent.futures.InvalidStateError`。" + +#: ../../library/concurrent.futures.rst:606 +msgid "" +"Sets the result of the work associated with the :class:`Future` to the " +":class:`Exception` *exception*." +msgstr "将 :class:`Future` 关联工作的异常设为 :class:`Exception` *exception*。" + +#: ../../library/concurrent.futures.rst:618 +msgid "Module Functions" +msgstr "模块函数" + +#: ../../library/concurrent.futures.rst:622 +msgid "" +"Wait for the :class:`Future` instances (possibly created by different " +":class:`Executor` instances) given by *fs* to complete. Duplicate futures " +"given to *fs* are removed and will be returned only once. Returns a named " +"2-tuple of sets. The first set, named ``done``, contains the futures that " +"completed (finished or cancelled futures) before the wait completed. The " +"second set, named ``not_done``, contains the futures that did not complete " +"(pending or running futures)." +msgstr "" +"等待由 *fs* 指定的 :class:`Future` 实例(可能由不同的 :class:`Executor` 实例创建)完成。 重复传给 *fs* " +"的 future 会被移除并将只返回一次。 返回一个由集合组成的具名 2 元组。 第一个集合的名称为 ``done``,包含在等待完成之前已完成的 " +"future(包括正常结束或被取消的 future)。 第二个集合的名称为 ``not_done``,包含未完成的 future(包括挂起的或正在运行的" +" future)。" + +#: ../../library/concurrent.futures.rst:630 +msgid "" +"*timeout* can be used to control the maximum number of seconds to wait " +"before returning. *timeout* can be an int or float. If *timeout* is not " +"specified or ``None``, there is no limit to the wait time." +msgstr "" +"*timeout* 可以用来控制返回前最大的等待秒数。 *timeout* 可以为 int 或 float 类型。 如果 *timeout* 未指定或为" +" ``None`` ,则不限制等待时间。" + +#: ../../library/concurrent.futures.rst:634 +msgid "" +"*return_when* indicates when this function should return. It must be one of" +" the following constants:" +msgstr "*return_when* 指定此函数应在何时返回。它必须为以下常数之一:" + +#: ../../library/concurrent.futures.rst:640 +msgid "Constant" +msgstr "常量" + +#: ../../library/concurrent.futures.rst:641 +msgid "Description" +msgstr "描述" + +#: ../../library/concurrent.futures.rst:644 +msgid "The function will return when any future finishes or is cancelled." +msgstr "函数将在任意 future 对象结束或取消时返回。" + +#: ../../library/concurrent.futures.rst:647 +msgid "" +"The function will return when any future finishes by raising an exception. " +"If no future raises an exception then it is equivalent to " +":const:`ALL_COMPLETED`." +msgstr "" +"该函数将在任何 future 对象通过引发异常而结束时返回。 如果没有任何 future 对象引发异常那么它将等价于 " +":const:`ALL_COMPLETED`。" + +#: ../../library/concurrent.futures.rst:652 +msgid "The function will return when all futures finish or are cancelled." +msgstr "函数将在所有 future 对象结束或取消时返回。" + +#: ../../library/concurrent.futures.rst:656 +msgid "" +"Returns an iterator over the :class:`Future` instances (possibly created by " +"different :class:`Executor` instances) given by *fs* that yields futures as " +"they complete (finished or cancelled futures). Any futures given by *fs* " +"that are duplicated will be returned once. Any futures that completed before" +" :func:`as_completed` is called will be yielded first. The returned " +"iterator raises a :exc:`TimeoutError` if :meth:`~iterator.__next__` is " +"called and the result isn't available after *timeout* seconds from the " +"original call to :func:`as_completed`. *timeout* can be an int or float. If" +" *timeout* is not specified or ``None``, there is no limit to the wait time." +msgstr "" +"返回一个迭代器,每当 *fs* 所给出的 :class:`Future` 实例(可能由不同的 :class:`Executor` " +"实例创建)完成时这个迭代器会产生新的 future(包括正常结束或被取消的 future 对象)。 任何由 *fs* 给出的重复的 future " +"对象将只被返回一次。 任何在 :func:`as_completed` 被调用之前完成的 future 对象将优先被产生。 如果 " +":meth:`~iterator.__next__` 被调用并且在最初调用 :func:`as_completed` 之后的 *timeout* " +"秒内其结果仍不可用,这个迭代器将引发 :exc:`TimeoutError`。 *timeout* 可以为整数或浮点数。 如果 *timeout* " +"未指定或为 ``None``,则不限制等待时间。" + +#: ../../library/concurrent.futures.rst:669 +msgid ":pep:`3148` -- futures - execute computations asynchronously" +msgstr ":pep:`3148` -- future 对象 - 异步执行指令。" + +#: ../../library/concurrent.futures.rst:670 +msgid "" +"The proposal which described this feature for inclusion in the Python " +"standard library." +msgstr "该提案描述了将此特性纳入 Python 标准库。" + +#: ../../library/concurrent.futures.rst:675 +msgid "Exception classes" +msgstr "Exception 类" + +#: ../../library/concurrent.futures.rst:681 +msgid "Raised when a future is cancelled." +msgstr "future 对象被取消时会触发。" + +#: ../../library/concurrent.futures.rst:685 +msgid "" +"A deprecated alias of :exc:`TimeoutError`, raised when a future operation " +"exceeds the given timeout." +msgstr ":exc:`TimeoutError` 的一个已被弃用的别名,会在 future 操作超出了给定的时限时被引发。" + +#: ../../library/concurrent.futures.rst:690 +msgid "This class was made an alias of :exc:`TimeoutError`." +msgstr "这个类是 :exc:`TimeoutError` 的别名。" + +#: ../../library/concurrent.futures.rst:695 +msgid "" +"Derived from :exc:`RuntimeError`, this exception class is raised when an " +"executor is broken for some reason, and cannot be used to submit or execute " +"new tasks." +msgstr "派生自 :exc:`RuntimeError`,当执行器因某些原因而中断且不能用来提交或执行新任务时将被引发。" + +#: ../../library/concurrent.futures.rst:703 +msgid "" +"Raised when an operation is performed on a future that is not allowed in the" +" current state." +msgstr "当某个操作在一个当前状态所不允许的 future 上执行时将被引发。" + +#: ../../library/concurrent.futures.rst:712 +msgid "" +"Derived from :exc:`~concurrent.futures.BrokenExecutor`, this exception class" +" is raised when one of the workers of a " +":class:`~concurrent.futures.ThreadPoolExecutor` has failed initializing." +msgstr "" +"派生自 :exc:`~concurrent.futures.BrokenExecutor`,这个异常类会在 " +":class:`~concurrent.futures.ThreadPoolExecutor` 的某个工作线程初始化失败时被引发。" + +#: ../../library/concurrent.futures.rst:723 +msgid "" +"Derived from :exc:`~concurrent.futures.thread.BrokenThreadPool`, this " +"exception class is raised when one of the workers of a " +":class:`~concurrent.futures.InterpreterPoolExecutor` has failed " +"initializing." +msgstr "" +"派生自 :exc:`~concurrent.futures.thread.BrokenThreadPool`,这个异常类会在 " +":class:`~concurrent.futures.InterpreterPoolExecutor` 的某个工作线程初始化失败时被引发。" + +#: ../../library/concurrent.futures.rst:734 +msgid "" +"Derived from :exc:`~concurrent.futures.BrokenExecutor` (formerly " +":exc:`RuntimeError`), this exception class is raised when one of the workers" +" of a :class:`~concurrent.futures.ProcessPoolExecutor` has terminated in a " +"non-clean fashion (for example, if it was killed from the outside)." +msgstr "" +"派生自 :exc:`~concurrent.futures.BrokenExecutor` (原为 " +":exc:`RuntimeError`),这个异常类会在 " +":class:`~concurrent.futures.ProcessPoolExecutor` " +"的某个工作进程以不完整的方式终结(例如,从外部杀掉)时被引发。" diff --git a/library/concurrent.interpreters.po b/library/concurrent.interpreters.po new file mode 100644 index 0000000000..b3ee296b56 --- /dev/null +++ b/library/concurrent.interpreters.po @@ -0,0 +1,604 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-19 15:34+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/concurrent.interpreters.rst:2 +msgid "" +":mod:`!concurrent.interpreters` --- Multiple interpreters in the same " +"process" +msgstr ":mod:`!concurrent.interpreters` --- 同一进程中的多个解释器" + +#: ../../library/concurrent.interpreters.rst:12 +msgid "**Source code:** :source:`Lib/concurrent/interpreters`" +msgstr "**源代码:** :source:`Lib/concurrent/interpreters`" + +#: ../../library/concurrent.interpreters.rst:16 +msgid "" +"The :mod:`!concurrent.interpreters` module constructs higher-level " +"interfaces on top of the lower level :mod:`!_interpreters` module." +msgstr "" +":mod:`!concurrent.interpreters` 模块在低层级的 :mod:`!_interpreters` " +"模块之上构造了更高层级的接口。" + +#: ../../library/concurrent.interpreters.rst:19 +msgid "" +"The module is primarily meant to provide a basic API for managing " +"interpreters (AKA \"subinterpreters\") and running things in them. Running " +"mostly involves switching to an interpreter (in the current thread) and " +"calling a function in that execution context." +msgstr "" +"本模块的最初目标是提供一个基本 API 来管理解释器(也称“子解释器”)并在其中运行任务。 " +"运行过程涉及(在当前线程中)切换解释器并在执行上下文中调用函数。" + +#: ../../library/concurrent.interpreters.rst:24 +msgid "" +"For concurrency, interpreters themselves (and this module) don't provide " +"much more than isolation, which on its own isn't useful. Actual concurrency " +"is available separately through :mod:`threads ` -- see `below " +"`_." +msgstr "" + +#: ../../library/concurrent.interpreters.rst:31 +msgid ":class:`~concurrent.futures.InterpreterPoolExecutor`" +msgstr ":class:`~concurrent.futures.InterpreterPoolExecutor`" + +#: ../../library/concurrent.interpreters.rst:32 +msgid "Combines threads with interpreters in a familiar interface." +msgstr "通过熟悉的接口将线程与解释器相结合。" + +#: ../../library/concurrent.interpreters.rst:36 +msgid ":ref:`isolating-extensions-howto`" +msgstr ":ref:`isolating-extensions-howto`" + +#: ../../library/concurrent.interpreters.rst:37 +msgid "How to update an extension module to support multiple interpreters." +msgstr "如何将扩展模块更新为支持多解释器。" + +#: ../../library/concurrent.interpreters.rst:39 +msgid ":pep:`554`" +msgstr ":pep:`554`" + +#: ../../library/concurrent.interpreters.rst:41 +msgid ":pep:`734`" +msgstr ":pep:`734`" + +#: ../../library/concurrent.interpreters.rst:43 +msgid ":pep:`684`" +msgstr ":pep:`684`" + +#: ../../includes/wasm-notavail.rst:3 +msgid "Availability" +msgstr "可用性" + +#: ../../includes/wasm-notavail.rst:5 +msgid "" +"This module does not work or is not available on WebAssembly. See " +":ref:`wasm-availability` for more information." +msgstr "此模块在 WebAssembly 平台上无效或不可用。 请参阅 :ref:`wasm-availability` 了解详情。" + +#: ../../library/concurrent.interpreters.rst:51 +msgid "Key details" +msgstr "关键细节" + +#: ../../library/concurrent.interpreters.rst:53 +msgid "" +"Before we dive in further, there are a small number of details to keep in " +"mind about using multiple interpreters:" +msgstr "在进一步深入之前,关于多解释器的使用需要注意以下几个要点:" + +#: ../../library/concurrent.interpreters.rst:56 +msgid "`isolated `_, by default" +msgstr "默认情况下为 `解释器隔离 `_" + +#: ../../library/concurrent.interpreters.rst:57 +msgid "no implicit threads" +msgstr "没有隐式线程" + +#: ../../library/concurrent.interpreters.rst:58 +msgid "not all PyPI packages support use in multiple interpreters yet" +msgstr "并不是所有的PyPI包都支持在多个解释器中使用" + +#: ../../library/concurrent.interpreters.rst:66 +msgid "Introduction" +msgstr "概述" + +#: ../../library/concurrent.interpreters.rst:68 +msgid "" +"An \"interpreter\" is effectively the execution context of the Python " +"runtime. It contains all of the state the runtime needs to execute a " +"program. This includes things like the import state and builtins. (Each " +"thread, even if there's only the main thread, has some extra runtime state, " +"in addition to the current interpreter, related to the current exception and" +" the bytecode eval loop.)" +msgstr "" +"\"解释器\"本质上是 Python " +"运行时的执行上下文,它包含了运行时执行程序所需的所有状态,包括导入状态和内置对象等。(每个线程——即使只有主线程——除了当前解释器外,还拥有一些额外的运行时状态,这些状态与当前异常和字节码求值循环相关。)" + +#: ../../library/concurrent.interpreters.rst:75 +msgid "" +"The concept and functionality of the interpreter have been a part of Python " +"since version 2.2, but the feature was only available through the C-API and " +"not well known, and the `isolation `_ was relatively " +"incomplete until version 3.12." +msgstr "" +"解释器的概念和功能自 Python 2.2 版本起便已存在,但该特性此前仅能通过 C-API 使用且鲜为人知,同时 `隔离 `_ 功能在 3.12 版本前相对不够完善。" + +#: ../../library/concurrent.interpreters.rst:83 +msgid "Multiple Interpreters and Isolation" +msgstr "多解释器与隔离" + +#: ../../library/concurrent.interpreters.rst:85 +msgid "" +"A Python implementation may support using multiple interpreters in the same " +"process. CPython has this support. Each interpreter is effectively " +"isolated from the others (with a limited number of carefully managed " +"process-global exceptions to the rule)." +msgstr "" +"Python 实现方案可能支持在同一进程中使用多个解释器,CPython " +"就具备此功能。每个解释器实际上都是相互隔离的(仅有少量经过严格管控的进程级全局例外情况)。" + +#: ../../library/concurrent.interpreters.rst:90 +msgid "" +"That isolation is primarily useful as a strong separation between distinct " +"logical components of a program, where you want to have careful control of " +"how those components interact." +msgstr "这种隔离机制的主要价值在于为程序的不同逻辑组件提供严格隔离,使开发者能够精准控制这些组件之间的交互方式。" + +#: ../../library/concurrent.interpreters.rst:96 +msgid "" +"Interpreters in the same process can technically never be strictly isolated " +"from one another since there are few restrictions on memory access within " +"the same process. The Python runtime makes a best effort at isolation but " +"extension modules may easily violate that. Therefore, do not use multiple " +"interpreters in security-sensitive situations, where they shouldn't have " +"access to each other's data." +msgstr "" +"从技术上讲,同一进程中的解释器永远无法实现严格隔离,因为在同一进程内对内存访问几乎没有任何限制。Python " +"运行时会尽力确保隔离性,但扩展模块很容易破坏这种隔离。因此,在安全敏感场景下——当不同解释器之间本不应相互访问数据时——请勿使用多解释器模式。" + +#: ../../library/concurrent.interpreters.rst:104 +msgid "Running in an Interpreter" +msgstr "在一个解释器中运行" + +#: ../../library/concurrent.interpreters.rst:106 +msgid "" +"Running in a different interpreter involves switching to it in the current " +"thread and then calling some function. The runtime will execute the " +"function using the current interpreter's state. The " +":mod:`!concurrent.interpreters` module provides a basic API for creating and" +" managing interpreters, as well as the switch-and-call operation." +msgstr "" +"在另一个解释器中运行涉及两个步骤:首先在当前线程切换至目标解释器,然后调用目标函数。运行时将基于当前解释器的状态执行该函数。:mod:`!concurrent.interpreters`" +" 模块提供了一套基础API,用于创建和管理解释器,以及执行这种\"切换-调用\"操作。" + +#: ../../library/concurrent.interpreters.rst:113 +msgid "" +"No other threads are automatically started for the operation. There is `a " +"helper `_ for that though. There is another " +"dedicated helper for calling the builtin :func:`exec` in an interpreter." +msgstr "" +"该操作不会自动启动其他线程,但可通过 `一个辅助工具 `_ " +"实现此功能。此外还提供了专用辅助工具,用于在解释器中调用内置函数 :func:`exec`。" + +#: ../../library/concurrent.interpreters.rst:118 +msgid "" +"When :func:`exec` (or :func:`eval`) are called in an interpreter, they run " +"using the interpreter's :mod:`!__main__` module as the \"globals\" " +"namespace. The same is true for functions that aren't associated with any " +"module. This is the same as how scripts invoked from the command-line run " +"in the :mod:`!__main__` module." +msgstr "" +"当在解释器中调用 :func:`exec` (或 :func:`eval`) 时,它们会使用该解释器的 :mod:`!__main__` " +"模块作为\"全局\"命名空间来运行。对于未关联任何模块的函数也是如此。这与从命令行调用脚本时在 :mod:`!__main__` 模块中运行的方式相同。" + +#: ../../library/concurrent.interpreters.rst:128 +msgid "Concurrency and Parallelism" +msgstr "并发与并行" + +#: ../../library/concurrent.interpreters.rst:130 +msgid "" +"As noted earlier, interpreters do not provide any concurrency on their own." +" They strictly represent the isolated execution context the runtime will " +"use *in the current thread*. That isolation makes them similar to " +"processes, but they still enjoy in-process efficiency, like threads." +msgstr "" +"如前所述,解释器本身并不提供任何并发能力。它们严格代表了运行时 *在当前线程* " +"中将使用的隔离执行上下文。这种隔离特性使解释器与进程相似,但同时又能像线程一样享受进程内的高效性。" + +#: ../../library/concurrent.interpreters.rst:136 +msgid "" +"All that said, interpreters do naturally support certain flavors of " +"concurrency. There's a powerful side effect of that isolation. It enables a" +" different approach to concurrency than you can take with async or threads." +" It's a similar concurrency model to CSP or the actor model, a model which " +"is relatively easy to reason about." +msgstr "" +"尽管如此,解释器确实天然支持特定种类的并发。这是该隔离机制的强大附带效应。它启用了一种不同于异步或线程的并发方式。这是一种与 CSP 或 actor " +"模型类似的并发模型,该模型相对更容易理解。" + +#: ../../library/concurrent.interpreters.rst:143 +msgid "" +"You can take advantage of that concurrency model in a single thread, " +"switching back and forth between interpreters, Stackless-style. However, " +"this model is more useful when you combine interpreters with multiple " +"threads. This mostly involves starting a new thread, where you switch to " +"another interpreter and run what you want there." +msgstr "" +"开发者可以在单线程中利用这种并发模型,以无栈式风格在解释器之间来回切换。然而,当将多解释器与多线程结合使用时,该模型才更能体现其价值。这种结合主要涉及:启动新线程" +" → 切换至目标解释器 → 执行所需操作。" + +#: ../../library/concurrent.interpreters.rst:149 +msgid "" +"Each actual thread in Python, even if you're only running in the main " +"thread, has its own *current* execution context. Multiple threads can use " +"the same interpreter or different ones." +msgstr "" +"在Python中,每个实际线程(即使仅运行主线程)都拥有自己的 *当前* 执行上下文。多个线程可以共享同一个解释器,也可以使用不同的解释器。" + +#: ../../library/concurrent.interpreters.rst:153 +msgid "" +"At a high level, you can think of the combination of threads and " +"interpreters as threads with opt-in sharing." +msgstr "从高层次来看,可以将线程与解释器的组合理解为可选共享的线程模型。" + +#: ../../library/concurrent.interpreters.rst:156 +msgid "" +"As a significant bonus, interpreters are sufficiently isolated that they do " +"not share the :term:`GIL`, which means combining threads with multiple " +"interpreters enables full multi-core parallelism. (This has been the case " +"since Python 3.12.)" +msgstr "" +"一个重要优势是:解释器之间的隔离足够彻底,它们不共享 " +":term:`GIL`,这意味着将多线程与多解释器结合使用时,可以实现真正的多核并行处理。(该特性自 Python 3.12 起支持。)" + +#: ../../library/concurrent.interpreters.rst:162 +msgid "Communication Between Interpreters" +msgstr "解释器间通信" + +#: ../../library/concurrent.interpreters.rst:164 +msgid "" +"In practice, multiple interpreters are useful only if we have a way to " +"communicate between them. This usually involves some form of message " +"passing, but can even mean sharing data in some carefully managed way." +msgstr "在实际应用中,多解释器模式的价值取决于是否存在有效的通信机制。通常采用消息传递方式实现交互,但在严格管控条件下也可共享数据。" + +#: ../../library/concurrent.interpreters.rst:169 +msgid "" +"With this in mind, the :mod:`!concurrent.interpreters` module provides a " +":class:`queue.Queue` implementation, available through :func:`create_queue`." +msgstr "" +"基于此,:mod:`!concurrent.interpreters` 模块提供了通过 :func:`create_queue` 访问的 " +":class:`queue.Queue` 实现。" + +#: ../../library/concurrent.interpreters.rst:176 +msgid "\"Sharing\" Objects" +msgstr "\"共享\"对象" + +#: ../../library/concurrent.interpreters.rst:178 +msgid "" +"Any data actually shared between interpreters loses the thread-safety " +"provided by the :term:`GIL`. There are various options for dealing with " +"this in extension modules. However, from Python code the lack of thread-" +"safety means objects can't actually be shared, with a few exceptions. " +"Instead, a copy must be created, which means mutable objects won't stay in " +"sync." +msgstr "" +"在解释器间实际共享的任何数据都会丧失由 :term:`GIL` " +"提供的线程安全性。扩展模块可通过多种方案处理此问题,但在纯Python代码中,由于缺乏线程安全机制,对象实际上无法真正共享(仅有少数例外)。这种情况下必须创建对象副本,意味着可变对象无法保持同步状态。" + +#: ../../library/concurrent.interpreters.rst:185 +msgid "" +"By default, most objects are copied with :mod:`pickle` when they are passed " +"to another interpreter. Nearly all of the immutable builtin objects are " +"either directly shared or copied efficiently. For example:" +msgstr "" +"默认情况下,当对象传递给其他解释器时,多数对象会通过 :mod:`pickle` " +"模块进行复制。几乎所有不可变内置对象要么直接共享,要么会高效复制。例如:" + +#: ../../library/concurrent.interpreters.rst:189 +msgid ":const:`None`" +msgstr ":const:`None`" + +#: ../../library/concurrent.interpreters.rst:190 +msgid ":class:`bool` (:const:`True` and :const:`False`)" +msgstr ":class:`bool` (:const:`True` 和 :const:`False`)" + +#: ../../library/concurrent.interpreters.rst:191 +msgid ":class:`bytes`" +msgstr ":class:`bytes`" + +#: ../../library/concurrent.interpreters.rst:192 +msgid ":class:`str`" +msgstr ":class:`str`" + +#: ../../library/concurrent.interpreters.rst:193 +msgid ":class:`int`" +msgstr ":class:`int`" + +#: ../../library/concurrent.interpreters.rst:194 +msgid ":class:`float`" +msgstr ":class:`float`" + +#: ../../library/concurrent.interpreters.rst:195 +msgid ":class:`tuple` (of similarly supported objects)" +msgstr ":class:`tuple` (仅限包含同类可支持对象时)" + +#: ../../library/concurrent.interpreters.rst:197 +msgid "" +"There is a small number of Python types that actually share mutable data " +"between interpreters:" +msgstr "仅有少数Python类型能够真正在解释器间共享可变数据:" + +#: ../../library/concurrent.interpreters.rst:200 +msgid ":class:`memoryview`" +msgstr ":class:`memoryview`" + +#: ../../library/concurrent.interpreters.rst:201 +msgid ":class:`Queue`" +msgstr ":class:`Queue`" + +#: ../../library/concurrent.interpreters.rst:205 +msgid "Reference" +msgstr "参考" + +#: ../../library/concurrent.interpreters.rst:207 +msgid "This module defines the following functions:" +msgstr "这个模块定义了以下函数:" + +#: ../../library/concurrent.interpreters.rst:211 +msgid "" +"Return a :class:`list` of :class:`Interpreter` objects, one for each " +"existing interpreter." +msgstr "返回一个 :class:`Interpreter` 对象的 :class:`list`,每个对象对应一个现有的解释器。" + +#: ../../library/concurrent.interpreters.rst:216 +msgid "" +"Return an :class:`Interpreter` object for the currently running interpreter." +msgstr "为当前运行的解释器返回一个 :class:`Interpreter` 对象。" + +#: ../../library/concurrent.interpreters.rst:221 +msgid "" +"Return an :class:`Interpreter` object for the main interpreter. This is the " +"interpreter the runtime created to run the :term:`REPL` or the script given " +"at the command-line. It is usually the only one." +msgstr "" +"返回主解释器的 :class:`Interpreter` 对象。该解释器是运行时为执行 :term:`REPL` " +"或命令行脚本而创建的,通常也是唯一存在的解释器实例。" + +#: ../../library/concurrent.interpreters.rst:227 +msgid "" +"Initialize a new (idle) Python interpreter and return a :class:`Interpreter`" +" object for it." +msgstr "初始化一个新的(空闲的)Python解释器并为其返回一个 :class:`Interpreter` 对象。" + +#: ../../library/concurrent.interpreters.rst:232 +msgid "" +"Initialize a new cross-interpreter queue and return a :class:`Queue` object " +"for it." +msgstr "初始化一个新的跨解释器队列,并返回其对应的 :class:`Queue` 对象。" + +#: ../../library/concurrent.interpreters.rst:237 +msgid "Interpreter objects" +msgstr "解释器对象" + +#: ../../library/concurrent.interpreters.rst:241 +msgid "A single interpreter in the current process." +msgstr "当前进程中的单个解释器。" + +#: ../../library/concurrent.interpreters.rst:243 +msgid "" +"Generally, :class:`Interpreter` shouldn't be called directly. Instead, use " +":func:`create` or one of the other module functions." +msgstr "一般来说,不应该直接调用 :class:`Interpreter`。 相反,使用 :func:`create` 或其他模块函数之一。" + +#: ../../library/concurrent.interpreters.rst:248 +#: ../../library/concurrent.interpreters.rst:254 +#: ../../library/concurrent.interpreters.rst:333 +msgid "(read-only)" +msgstr "(只读)" + +#: ../../library/concurrent.interpreters.rst:250 +msgid "The underlying interpreter's ID." +msgstr "底层解释器的 ID。" + +#: ../../library/concurrent.interpreters.rst:256 +msgid "A string describing where the interpreter came from." +msgstr "描述解释器来源的字符串。" + +#: ../../library/concurrent.interpreters.rst:260 +msgid "" +"Return ``True`` if the interpreter is currently executing code in its " +":mod:`!__main__` module and ``False`` otherwise." +msgstr "如果解释器当前正在执行其 :mod:`!__main__` 模块中的代码,则返回 ``True``,否则返回 ``False``。" + +#: ../../library/concurrent.interpreters.rst:265 +msgid "Finalize and destroy the interpreter." +msgstr "完成和销毁解释器。" + +#: ../../library/concurrent.interpreters.rst:269 +msgid "Bind objects in the interpreter's :mod:`!__main__` module." +msgstr "将对象绑定到解释器的 :mod:`!__main__` 模块中。" + +#: ../../library/concurrent.interpreters.rst:271 +#: ../../library/concurrent.interpreters.rst:328 +msgid "" +"Some objects are actually shared and some are copied efficiently, but most " +"are copied via :mod:`pickle`. See :ref:`interp-object-sharing`." +msgstr "" +"部分对象会实际共享,部分对象可高效复制,但大多数对象仍需通过 :mod:`pickle` 模块进行复制。具体参见 :ref:`interp-" +"object-sharing` 。" + +#: ../../library/concurrent.interpreters.rst:276 +msgid "Run the given source code in the interpreter (in the current thread)." +msgstr "在解释器中运行给定的源代码(在当前线程中)。" + +#: ../../library/concurrent.interpreters.rst:280 +msgid "" +"Return the result of calling running the given function in the interpreter " +"(in the current thread)." +msgstr "返回在解释器中(在当前线程中)调用运行给定函数的结果。" + +#: ../../library/concurrent.interpreters.rst:287 +msgid "Run the given function in the interpreter (in a new thread)." +msgstr "在解释器中运行给定的函数(在一个新的线程中)。" + +#: ../../library/concurrent.interpreters.rst:290 +msgid "Exceptions" +msgstr "异常" + +#: ../../library/concurrent.interpreters.rst:294 +msgid "" +"This exception, a subclass of :exc:`Exception`, is raised when an " +"interpreter-related error happens." +msgstr "此异常是 :exc:`Exception` 的子类,在发生解释器相关错误时引发。" + +#: ../../library/concurrent.interpreters.rst:299 +msgid "" +"This exception, a subclass of :exc:`InterpreterError`, is raised when the " +"targeted interpreter no longer exists." +msgstr "此异常是 :exc:`InterpreterError` 的子类,当目标解释器不再存在时引发。" + +#: ../../library/concurrent.interpreters.rst:304 +msgid "" +"This exception, a subclass of :exc:`InterpreterError`, is raised when the " +"running code raised an uncaught exception." +msgstr "此异常是 :exc:`InterpreterError` 的子类,当运行的代码引发未捕获的异常时引发。" + +#: ../../library/concurrent.interpreters.rst:309 +msgid "A basic snapshot of the exception raised in the other interpreter." +msgstr "在其他解释器中引发的异常的基本快照。" + +#: ../../library/concurrent.interpreters.rst:315 +msgid "" +"This exception, a subclass of :exc:`TypeError`, is raised when an object " +"cannot be sent to another interpreter." +msgstr "此异常是 :exc:`TypeError` 的子类,当一个对象无法发送到另一个解释器时引发。" + +#: ../../library/concurrent.interpreters.rst:320 +msgid "Communicating Between Interpreters" +msgstr "解释器间通信" + +#: ../../library/concurrent.interpreters.rst:324 +msgid "" +"A wrapper around a low-level, cross-interpreter queue, which implements the " +":class:`queue.Queue` interface. The underlying queue can only be created " +"through :func:`create_queue`." +msgstr "" +"这是一个对底层跨解释器队列的封装,实现了标准的 :class:`queue.Queue` 接口。底层队列只能通过 " +":func:`create_queue` 函数创建。" + +#: ../../library/concurrent.interpreters.rst:335 +msgid "The queue's ID." +msgstr "队列的ID。" + +#: ../../library/concurrent.interpreters.rst:340 +msgid "" +"This exception, a subclass of :exc:`queue.Empty`, is raised from " +":meth:`!Queue.get` and :meth:`!Queue.get_nowait` when the queue is empty." +msgstr "" +"此异常继承自 :exc:`queue.Empty`,当队列为空时,会由 :meth:`!Queue.get` 和 " +":meth:`!Queue.get_nowait` 方法引发。" + +#: ../../library/concurrent.interpreters.rst:346 +msgid "" +"This exception, a subclass of :exc:`queue.Full`, is raised from " +":meth:`!Queue.put` and :meth:`!Queue.put_nowait` when the queue is full." +msgstr "" +"此异常继承自 :exc:`queue.Full`,当队列已满时,会由 :meth:`!Queue.put` 和 " +":meth:`!Queue.put_nowait` 方法引发。" + +#: ../../library/concurrent.interpreters.rst:352 +msgid "Basic usage" +msgstr "基本使用" + +#: ../../library/concurrent.interpreters.rst:354 +msgid "Creating an interpreter and running code in it::" +msgstr "创建一个解释器并在其中运行代码::" + +#: ../../library/concurrent.interpreters.rst:356 +msgid "" +"from concurrent import interpreters\n" +"\n" +"interp = interpreters.create()\n" +"\n" +"# Run in the current OS thread.\n" +"\n" +"interp.exec('print(\"spam!\")')\n" +"\n" +"interp.exec(\"\"\"if True:\n" +" print('spam!')\n" +" \"\"\")\n" +"\n" +"from textwrap import dedent\n" +"interp.exec(dedent(\"\"\"\n" +" print('spam!')\n" +" \"\"\"))\n" +"\n" +"def run(arg):\n" +" return arg\n" +"\n" +"res = interp.call(run, 'spam!')\n" +"print(res)\n" +"\n" +"def run():\n" +" print('spam!')\n" +"\n" +"interp.call(run)\n" +"\n" +"# Run in new OS thread.\n" +"\n" +"t = interp.call_in_thread(run)\n" +"t.join()" +msgstr "" +"from concurrent import interpreters\n" +"\n" +"interp = interpreters.create()\n" +"\n" +"# 在当前操作系统线程中运行。\n" +"\n" +"interp.exec('print(\"spam!\")')\n" +"\n" +"interp.exec(\"\"\"if True:\n" +" print('spam!')\n" +" \"\"\")\n" +"\n" +"from textwrap import dedent\n" +"interp.exec(dedent(\"\"\"\n" +" print('spam!')\n" +" \"\"\"))\n" +"\n" +"def run(arg):\n" +" return arg\n" +"\n" +"res = interp.call(run, 'spam!')\n" +"print(res)\n" +"\n" +"def run():\n" +" print('spam!')\n" +"\n" +"interp.call(run)\n" +"\n" +"# 在新的操作系统线程中运行\n" +"\n" +"t = interp.call_in_thread(run)\n" +"t.join()" diff --git a/library/concurrent.po b/library/concurrent.po new file mode 100644 index 0000000000..6e0b4aea6f --- /dev/null +++ b/library/concurrent.po @@ -0,0 +1,39 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/concurrent.rst:2 +msgid "The :mod:`!concurrent` package" +msgstr ":mod:`!concurrent` 包" + +#: ../../library/concurrent.rst:4 +msgid "This package contains the following modules:" +msgstr "这个包里包含了下列模块:" + +#: ../../library/concurrent.rst:6 +msgid ":mod:`concurrent.futures` -- Launching parallel tasks" +msgstr ":mod:`concurrent.futures` —— 启动并行任务" + +#: ../../library/concurrent.rst:7 +msgid "" +":mod:`concurrent.interpreters` -- Multiple interpreters in the same process" +msgstr ":mod:`concurrent.interpreters` —— 同一进程中的多个解释器" diff --git a/library/configparser.po b/library/configparser.po new file mode 100644 index 0000000000..809f7aa63a --- /dev/null +++ b/library/configparser.po @@ -0,0 +1,2401 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/configparser.rst:2 +msgid ":mod:`!configparser` --- Configuration file parser" +msgstr ":mod:`!configparser` --- 配置文件解析器" + +#: ../../library/configparser.rst:14 +msgid "**Source code:** :source:`Lib/configparser.py`" +msgstr "**源代码:** :source:`Lib/configparser.py`" + +#: ../../library/configparser.rst:24 +msgid "" +"This module provides the :class:`ConfigParser` class which implements a " +"basic configuration language which provides a structure similar to what's " +"found in Microsoft Windows INI files. You can use this to write Python " +"programs which can be customized by end users easily." +msgstr "" +"此模块提供了 :class:`ConfigParser` 类,它实现一种基本配置语言,这种语言所提供的结构与 Microsoft Windows INI" +" 文件的类似。 你可以使用此模块来编写能够由最终用户来自定义的 Python 程序。" + +#: ../../library/configparser.rst:31 +msgid "" +"This library does *not* interpret or write the value-type prefixes used in " +"the Windows Registry extended version of INI syntax." +msgstr "这个库 *并不* 能够解析或写入在 Windows Registry 扩展版本 INI 语法中所使用的值-类型前缀。" + +#: ../../library/configparser.rst:36 +msgid "Module :mod:`tomllib`" +msgstr "模块 :mod:`tomllib`" + +#: ../../library/configparser.rst:37 +msgid "" +"TOML is a well-specified format for application configuration files. It is " +"specifically designed to be an improved version of INI." +msgstr "TOML 是一种具有良好规范的针对应用程序配置文件的格式。 它被专门设计作为 INI 改进版本。" + +#: ../../library/configparser.rst:40 +msgid "Module :mod:`shlex`" +msgstr "模块 :mod:`shlex`" + +#: ../../library/configparser.rst:41 +msgid "" +"Support for creating Unix shell-like mini-languages which can also be used " +"for application configuration files." +msgstr "支持创建类似 Unix shell 的同样可被用于应用程序配置文件的迷你语言。" + +#: ../../library/configparser.rst:44 +msgid "Module :mod:`json`" +msgstr "模块 :mod:`json`" + +#: ../../library/configparser.rst:45 +msgid "" +"The ``json`` module implements a subset of JavaScript syntax which is " +"sometimes used for configuration, but does not support comments." +msgstr "``json`` 模块实现了 JavaScript 语法的一个子集,它有时被用于配置,但是不支持注释。" + +#: ../../library/configparser.rst:61 +msgid "Quick Start" +msgstr "快速起步" + +#: ../../library/configparser.rst:63 +msgid "Let's take a very basic configuration file that looks like this:" +msgstr "让我们准备一个非常基本的配置文件,它看起来是这样的:" + +#: ../../library/configparser.rst:65 +msgid "" +"[DEFAULT]\n" +"ServerAliveInterval = 45\n" +"Compression = yes\n" +"CompressionLevel = 9\n" +"ForwardX11 = yes\n" +"\n" +"[forge.example]\n" +"User = hg\n" +"\n" +"[topsecret.server.example]\n" +"Port = 50022\n" +"ForwardX11 = no" +msgstr "" +"[DEFAULT]\n" +"ServerAliveInterval = 45\n" +"Compression = yes\n" +"CompressionLevel = 9\n" +"ForwardX11 = yes\n" +"\n" +"[forge.example]\n" +"User = hg\n" +"\n" +"[topsecret.server.example]\n" +"Port = 50022\n" +"ForwardX11 = no" + +#: ../../library/configparser.rst:80 +msgid "" +"The structure of INI files is described `in the following section " +"<#supported-ini-file-structure>`_. Essentially, the file consists of " +"sections, each of which contains keys with values. :mod:`!configparser` " +"classes can read and write such files. Let's start by creating the above " +"configuration file programmatically." +msgstr "" + +#: ../../library/configparser.rst:86 +msgid "" +">>> import configparser\n" +">>> config = configparser.ConfigParser()\n" +">>> config['DEFAULT'] = {'ServerAliveInterval': '45',\n" +"... 'Compression': 'yes',\n" +"... 'CompressionLevel': '9'}\n" +">>> config['forge.example'] = {}\n" +">>> config['forge.example']['User'] = 'hg'\n" +">>> config['topsecret.server.example'] = {}\n" +">>> topsecret = config['topsecret.server.example']\n" +">>> topsecret['Port'] = '50022' # mutates the parser\n" +">>> topsecret['ForwardX11'] = 'no' # same here\n" +">>> config['DEFAULT']['ForwardX11'] = 'yes'\n" +">>> with open('example.ini', 'w') as configfile:\n" +"... config.write(configfile)\n" +"..." +msgstr "" +">>> import configparser\n" +">>> config = configparser.ConfigParser()\n" +">>> config['DEFAULT'] = {'ServerAliveInterval': '45',\n" +"... 'Compression': 'yes',\n" +"... 'CompressionLevel': '9'}\n" +">>> config['forge.example'] = {}\n" +">>> config['forge.example']['User'] = 'hg'\n" +">>> config['topsecret.server.example'] = {}\n" +">>> topsecret = config['topsecret.server.example']\n" +">>> topsecret['Port'] = '50022' # 更改解析器\n" +">>> topsecret['ForwardX11'] = 'no' # 这里也是\n" +">>> config['DEFAULT']['ForwardX11'] = 'yes'\n" +">>> with open('example.ini', 'w') as configfile:\n" +"... config.write(configfile)\n" +"..." + +#: ../../library/configparser.rst:104 +msgid "" +"As you can see, we can treat a config parser much like a dictionary. There " +"are differences, `outlined later <#mapping-protocol-access>`_, but the " +"behavior is very close to what you would expect from a dictionary." +msgstr "" +"如你所见,我们可以把配置解析器当作一个字典来处理。 两者确实存在差异,`将在后文说明 <#mapping-protocol-" +"access>`_,但是其行为非常接近于你对字典所期望的一般行为。" + +#: ../../library/configparser.rst:108 +msgid "" +"Now that we have created and saved a configuration file, let's read it back " +"and explore the data it holds." +msgstr "现在我们已经创建并保存了一个配置文件,让我们再将它读取出来并探究其中包含的数据。" + +#: ../../library/configparser.rst:111 +msgid "" +">>> config = configparser.ConfigParser()\n" +">>> config.sections()\n" +"[]\n" +">>> config.read('example.ini')\n" +"['example.ini']\n" +">>> config.sections()\n" +"['forge.example', 'topsecret.server.example']\n" +">>> 'forge.example' in config\n" +"True\n" +">>> 'python.org' in config\n" +"False\n" +">>> config['forge.example']['User']\n" +"'hg'\n" +">>> config['DEFAULT']['Compression']\n" +"'yes'\n" +">>> topsecret = config['topsecret.server.example']\n" +">>> topsecret['ForwardX11']\n" +"'no'\n" +">>> topsecret['Port']\n" +"'50022'\n" +">>> for key in config['forge.example']:\n" +"... print(key)\n" +"user\n" +"compressionlevel\n" +"serveraliveinterval\n" +"compression\n" +"forwardx11\n" +">>> config['forge.example']['ForwardX11']\n" +"'yes'" +msgstr "" +">>> config = configparser.ConfigParser()\n" +">>> config.sections()\n" +"[]\n" +">>> config.read('example.ini')\n" +"['example.ini']\n" +">>> config.sections()\n" +"['forge.example', 'topsecret.server.example']\n" +">>> 'forge.example' in config\n" +"True\n" +">>> 'python.org' in config\n" +"False\n" +">>> config['forge.example']['User']\n" +"'hg'\n" +">>> config['DEFAULT']['Compression']\n" +"'yes'\n" +">>> topsecret = config['topsecret.server.example']\n" +">>> topsecret['ForwardX11']\n" +"'no'\n" +">>> topsecret['Port']\n" +"'50022'\n" +">>> for key in config['forge.example']:\n" +"... print(key)\n" +"user\n" +"compressionlevel\n" +"serveraliveinterval\n" +"compression\n" +"forwardx11\n" +">>> config['forge.example']['ForwardX11']\n" +"'yes'" + +#: ../../library/configparser.rst:143 +msgid "" +"As we can see above, the API is pretty straightforward. The only bit of " +"magic involves the ``DEFAULT`` section which provides default values for all" +" other sections [1]_. Note also that keys in sections are case-insensitive " +"and stored in lowercase [1]_." +msgstr "" +"正如我们在上面所看到的,相关的 API 相当直观。 唯一有些神奇的地方是 ``DEFAULT`` 小节,它为所有其他小节提供了默认值 [1]_。 " +"还要注意小节中的键大小写不敏感并且会存储为小写形式 [1]_。" + +#: ../../library/configparser.rst:148 ../../library/configparser.rst:1003 +msgid "" +"It is possible to read several configurations into a single " +":class:`ConfigParser`, where the most recently added configuration has the " +"highest priority. Any conflicting keys are taken from the more recent " +"configuration while the previously existing keys are retained. The example " +"below reads in an ``override.ini`` file, which will override any conflicting" +" keys from the ``example.ini`` file." +msgstr "" +"将多个配置读入单个 :class:`ConfigParser` 是可能的,其中最近添加的配置具有最高优先级。 " +"任何冲突的键都会从更近的配置获取并且先前存在的键会被保留。 下面的例子读入一个 ``override.ini`` 文件,它将覆盖任何来自 " +"``example.ini`` 文件的冲突的键。" + +#: ../../library/configparser.rst:155 ../../library/configparser.rst:1010 +msgid "" +"[DEFAULT]\n" +"ServerAliveInterval = -1" +msgstr "" +"[DEFAULT]\n" +"ServerAliveInterval = -1" + +#: ../../library/configparser.rst:160 ../../library/configparser.rst:1015 +msgid "" +">>> config_override = configparser.ConfigParser()\n" +">>> config_override['DEFAULT'] = {'ServerAliveInterval': '-1'}\n" +">>> with open('override.ini', 'w') as configfile:\n" +"... config_override.write(configfile)\n" +"...\n" +">>> config_override = configparser.ConfigParser()\n" +">>> config_override.read(['example.ini', 'override.ini'])\n" +"['example.ini', 'override.ini']\n" +">>> print(config_override.get('DEFAULT', 'ServerAliveInterval'))\n" +"-1" +msgstr "" +">>> config_override = configparser.ConfigParser()\n" +">>> config_override['DEFAULT'] = {'ServerAliveInterval': '-1'}\n" +">>> with open('override.ini', 'w') as configfile:\n" +"... config_override.write(configfile)\n" +"...\n" +">>> config_override = configparser.ConfigParser()\n" +">>> config_override.read(['example.ini', 'override.ini'])\n" +"['example.ini', 'override.ini']\n" +">>> print(config_override.get('DEFAULT', 'ServerAliveInterval'))\n" +"-1" + +#: ../../library/configparser.rst:174 +msgid "" +"This behaviour is equivalent to a :meth:`ConfigParser.read` call with " +"several files passed to the *filenames* parameter." +msgstr "此行为等价于一次 :meth:`ConfigParser.read` 调用并向 *filenames* 形参传入多个文件。" + +#: ../../library/configparser.rst:179 +msgid "Supported Datatypes" +msgstr "支持的数据类型" + +#: ../../library/configparser.rst:181 +msgid "" +"Config parsers do not guess datatypes of values in configuration files, " +"always storing them internally as strings. This means that if you need " +"other datatypes, you should convert on your own:" +msgstr "配置解析器并不会猜测配置文件中值的类型,而总是将它们在内部存储为字符串。 这意味着如果你需要其他数据类型,你应当自己来转换:" + +#: ../../library/configparser.rst:185 +msgid "" +">>> int(topsecret['Port'])\n" +"50022\n" +">>> float(topsecret['CompressionLevel'])\n" +"9.0" +msgstr "" +">>> int(topsecret['Port'])\n" +"50022\n" +">>> float(topsecret['CompressionLevel'])\n" +"9.0" + +#: ../../library/configparser.rst:192 +msgid "" +"Since this task is so common, config parsers provide a range of handy getter" +" methods to handle integers, floats and booleans. The last one is the most " +"interesting because simply passing the value to ``bool()`` would do no good " +"since ``bool('False')`` is still ``True``. This is why config parsers also " +"provide :meth:`~ConfigParser.getboolean`. This method is case-insensitive " +"and recognizes Boolean values from ``'yes'``/``'no'``, ``'on'``/``'off'``, " +"``'true'``/``'false'`` and ``'1'``/``'0'`` [1]_. For example:" +msgstr "" +"由于这种任务十分常用,配置解析器提供了一系列便捷的获取方法来处理整数、浮点数和布尔值。 最后一个类型的处理最为有趣,因为简单地将值传给 " +"``bool()`` 是没有用的,``bool('False')`` 仍然会是 ``True``。 为解决这个问题配置解析器还提供了 " +":meth:`~ConfigParser.getboolean`。 这个方法对大小写不敏感并可识别 ``'yes'``/``'no'``, " +"``'on'``/``'off'``, ``'true'``/``'false'`` 和 ``'1'``/``'0'`` [1]_ 等布尔值。 例如:" + +#: ../../library/configparser.rst:200 +msgid "" +">>> topsecret.getboolean('ForwardX11')\n" +"False\n" +">>> config['forge.example'].getboolean('ForwardX11')\n" +"True\n" +">>> config.getboolean('forge.example', 'Compression')\n" +"True" +msgstr "" +">>> topsecret.getboolean('ForwardX11')\n" +"False\n" +">>> config['forge.example'].getboolean('ForwardX11')\n" +"True\n" +">>> config.getboolean('forge.example', 'Compression')\n" +"True" + +#: ../../library/configparser.rst:209 +msgid "" +"Apart from :meth:`~ConfigParser.getboolean`, config parsers also provide " +"equivalent :meth:`~ConfigParser.getint` and :meth:`~ConfigParser.getfloat` " +"methods. You can register your own converters and customize the provided " +"ones. [1]_" +msgstr "" +"除了 :meth:`~ConfigParser.getboolean`,配置解析器还提供了同类的 " +":meth:`~ConfigParser.getint` 和 :meth:`~ConfigParser.getfloat` 方法。 " +"你可以注册你自己的转换器或是定制已提供的转换器。 [1]_" + +#: ../../library/configparser.rst:215 +msgid "Fallback Values" +msgstr "回退值" + +#: ../../library/configparser.rst:217 +msgid "" +"As with a dictionary, you can use a section's :meth:`~ConfigParser.get` " +"method to provide fallback values:" +msgstr "与字典类似,你可以使用某一节的 :meth:`~ConfigParser.get` 方法来提供回退值:" + +#: ../../library/configparser.rst:220 +msgid "" +">>> topsecret.get('Port')\n" +"'50022'\n" +">>> topsecret.get('CompressionLevel')\n" +"'9'\n" +">>> topsecret.get('Cipher')\n" +">>> topsecret.get('Cipher', '3des-cbc')\n" +"'3des-cbc'" +msgstr "" +">>> topsecret.get('Port')\n" +"'50022'\n" +">>> topsecret.get('CompressionLevel')\n" +"'9'\n" +">>> topsecret.get('Cipher')\n" +">>> topsecret.get('Cipher', '3des-cbc')\n" +"'3des-cbc'" + +#: ../../library/configparser.rst:230 +msgid "" +"Please note that default values have precedence over fallback values. For " +"instance, in our example the ``'CompressionLevel'`` key was specified only " +"in the ``'DEFAULT'`` section. If we try to get it from the section " +"``'topsecret.server.example'``, we will always get the default, even if we " +"specify a fallback:" +msgstr "" +"请注意默认值会优先于回退值。 例如,在我们的示例中 ``'CompressionLevel'`` 键仅在 ``'DEFAULT'`` 小节中被指定。 " +"如果我们尝试从 ``'topsecret.server.example'`` 小节获取它,我们将总是会得到默认值,即使我们指定了一个回退值:" + +#: ../../library/configparser.rst:236 +msgid "" +">>> topsecret.get('CompressionLevel', '3')\n" +"'9'" +msgstr "" +">>> topsecret.get('CompressionLevel', '3')\n" +"'9'" + +#: ../../library/configparser.rst:241 +msgid "" +"One more thing to be aware of is that the parser-level " +":meth:`~ConfigParser.get` method provides a custom, more complex interface, " +"maintained for backwards compatibility. When using this method, a fallback " +"value can be provided via the ``fallback`` keyword-only argument:" +msgstr "" +"还需要注意的一点是解析器层级的 :meth:`~ConfigParser.get` 方法提供了自定义的更复杂接口,它被继续维护用于向下兼容。 " +"当使用此方法时,可以通过 ``fallback`` 仅限关键字参数提供一个回退值:" + +#: ../../library/configparser.rst:246 +msgid "" +">>> config.get('forge.example', 'monster',\n" +"... fallback='No such things as monsters')\n" +"'No such things as monsters'" +msgstr "" +">>> config.get('forge.example', 'monster',\n" +"... fallback='No such things as monsters')\n" +"'No such things as monsters'" + +#: ../../library/configparser.rst:252 +msgid "" +"The same ``fallback`` argument can be used with the " +":meth:`~ConfigParser.getint`, :meth:`~ConfigParser.getfloat` and " +":meth:`~ConfigParser.getboolean` methods, for example:" +msgstr "" +"同样的 ``fallback`` 参数也可在 :meth:`~ConfigParser.getint`, " +":meth:`~ConfigParser.getfloat` 和 :meth:`~ConfigParser.getboolean` 方法中使用,例如:" + +#: ../../library/configparser.rst:256 +msgid "" +">>> 'BatchMode' in topsecret\n" +"False\n" +">>> topsecret.getboolean('BatchMode', fallback=True)\n" +"True\n" +">>> config['DEFAULT']['BatchMode'] = 'no'\n" +">>> topsecret.getboolean('BatchMode', fallback=True)\n" +"False" +msgstr "" +">>> 'BatchMode' in topsecret\n" +"False\n" +">>> topsecret.getboolean('BatchMode', fallback=True)\n" +"True\n" +">>> config['DEFAULT']['BatchMode'] = 'no'\n" +">>> topsecret.getboolean('BatchMode', fallback=True)\n" +"False" + +#: ../../library/configparser.rst:268 +msgid "Supported INI File Structure" +msgstr "受支持的 INI 文件结构" + +#: ../../library/configparser.rst:270 +msgid "" +"A configuration file consists of sections, each led by a ``[section]`` " +"header, followed by key/value entries separated by a specific string (``=`` " +"or ``:`` by default [1]_). By default, section names are case sensitive but" +" keys are not [1]_. Leading and trailing whitespace is removed from keys " +"and values. Values can be omitted if the parser is configured to allow it " +"[1]_, in which case the key/value delimiter may also be left out. Values " +"can also span multiple lines, as long as they are indented deeper than the " +"first line of the value. Depending on the parser's mode, blank lines may be" +" treated as parts of multiline values or ignored." +msgstr "" +"配置文件是由小节组成的,每个小节都有一个 ``[section]`` 标头,加上多个由特定字符串 (默认为 ``=`` 或 ``:`` [1]_) " +"分隔的键/值条目。 在默认情况下,小节名对大小写敏感而键对大小写不敏感 [1]_。 键和值开头和末尾的空格会被移除。 在解析器配置允许时值可以被省略 " +"[1]_,在此情况下键/值分隔符也可以被省略。 值还可以跨越多行,只要值的其他行带有比第一行更深的缩进。 " +"依据解析器的具体模式,空白行可能会被视为多行值的组成部分或是被忽略。" + +#: ../../library/configparser.rst:280 +msgid "" +"By default, a valid section name can be any string that does not contain " +"'\\\\n'. To change this, see :attr:`ConfigParser.SECTCRE`." +msgstr "" +"在默认情况下,有效的节名称可以是不包含 '\\\\n' 的任意字符串。 要改变此设定,请参阅 :attr:`ConfigParser.SECTCRE`。" + +#: ../../library/configparser.rst:283 +msgid "" +"The first section name may be omitted if the parser is configured to allow " +"an unnamed top level section with ``allow_unnamed_section=True``. In this " +"case, the keys/values may be retrieved by :const:`UNNAMED_SECTION` as in " +"``config[UNNAMED_SECTION]``." +msgstr "" +"如果解析器通过 ``allow_unnamed_section=True`` 被配置为允许未命名的最高层级小节则第一个小节的名称可以省略。 " +"在这种情况下,键/值可以通过 :const:`UNNAMED_SECTION` 来获取例如 ``config[UNNAMED_SECTION]``。" + +#: ../../library/configparser.rst:288 +msgid "" +"Configuration files may include comments, prefixed by specific characters " +"(``#`` and ``;`` by default [1]_). Comments may appear on their own on an " +"otherwise empty line, possibly indented. [1]_" +msgstr "" +"配置文件可以包含注释,要带有指定字符前缀 (默认为 ``#`` 和 ``;`` [1]_)。 注释可以单独出现于原本的空白行,并可使用缩进。 [1]_" + +#: ../../library/configparser.rst:292 ../../library/configparser.rst:376 +msgid "For example:" +msgstr "例如:" + +#: ../../library/configparser.rst:294 +msgid "" +"[Simple Values]\n" +"key=value\n" +"spaces in keys=allowed\n" +"spaces in values=allowed as well\n" +"spaces around the delimiter = obviously\n" +"you can also use : to delimit keys from values\n" +"\n" +"[All Values Are Strings]\n" +"values like this: 1000000\n" +"or this: 3.14159265359\n" +"are they treated as numbers? : no\n" +"integers, floats and booleans are held as: strings\n" +"can use the API to get converted values directly: true\n" +"\n" +"[Multiline Values]\n" +"chorus: I'm a lumberjack, and I'm okay\n" +" I sleep all night and I work all day\n" +"\n" +"[No Values]\n" +"key_without_value\n" +"empty string value here =\n" +"\n" +"[You can use comments]\n" +"# like this\n" +"; or this\n" +"\n" +"# By default only in an empty line.\n" +"# Inline comments can be harmful because they prevent users\n" +"# from using the delimiting characters as parts of values.\n" +"# That being said, this can be customized.\n" +"\n" +" [Sections Can Be Indented]\n" +" can_values_be_as_well = True\n" +" does_that_mean_anything_special = False\n" +" purpose = formatting for readability\n" +" multiline_values = are\n" +" handled just fine as\n" +" long as they are indented\n" +" deeper than the first line\n" +" of a value\n" +" # Did I mention we can indent comments, too?" +msgstr "" +"[Simple Values]\n" +"key=value\n" +"spaces in keys=allowed\n" +"spaces in values=allowed as well\n" +"spaces around the delimiter = obviously\n" +"you can also use : to delimit keys from values\n" +"\n" +"[All Values Are Strings]\n" +"values like this: 1000000\n" +"or this: 3.14159265359\n" +"are they treated as numbers? : no\n" +"integers, floats and booleans are held as: strings\n" +"can use the API to get converted values directly: true\n" +"\n" +"[Multiline Values]\n" +"chorus: I'm a lumberjack, and I'm okay\n" +" I sleep all night and I work all day\n" +"\n" +"[No Values]\n" +"key_without_value\n" +"empty string value here =\n" +"\n" +"[You can use comments]\n" +"# like this\n" +"; or this\n" +"\n" +"# By default only in an empty line.\n" +"# Inline comments can be harmful because they prevent users\n" +"# from using the delimiting characters as parts of values.\n" +"# That being said, this can be customized.\n" +"\n" +" [Sections Can Be Indented]\n" +" can_values_be_as_well = True\n" +" does_that_mean_anything_special = False\n" +" purpose = formatting for readability\n" +" multiline_values = are\n" +" handled just fine as\n" +" long as they are indented\n" +" deeper than the first line\n" +" of a value\n" +" # Did I mention we can indent comments, too?" + +#: ../../library/configparser.rst:342 +msgid "Unnamed Sections" +msgstr "未命名小节" + +#: ../../library/configparser.rst:344 +msgid "" +"The name of the first section (or unique) may be omitted and values " +"retrieved by the :const:`UNNAMED_SECTION` attribute." +msgstr "第一(或唯一)小节的名称可以省略并且其值可通过 :const:`UNNAMED_SECTION` 属性来获取。" + +#: ../../library/configparser.rst:347 +msgid "" +">>> config = \"\"\"\n" +"... option = value\n" +"...\n" +"... [ Section 2 ]\n" +"... another = val\n" +"... \"\"\"\n" +">>> unnamed = configparser.ConfigParser(allow_unnamed_section=True)\n" +">>> unnamed.read_string(config)\n" +">>> unnamed.get(configparser.UNNAMED_SECTION, 'option')\n" +"'value'" +msgstr "" +">>> config = \"\"\"\n" +"... option = value\n" +"...\n" +"... [ Section 2 ]\n" +"... another = val\n" +"... \"\"\"\n" +">>> unnamed = configparser.ConfigParser(allow_unnamed_section=True)\n" +">>> unnamed.read_string(config)\n" +">>> unnamed.get(configparser.UNNAMED_SECTION, 'option')\n" +"'value'" + +#: ../../library/configparser.rst:361 +msgid "Interpolation of values" +msgstr "值的插值" + +#: ../../library/configparser.rst:363 +msgid "" +"On top of the core functionality, :class:`ConfigParser` supports " +"interpolation. This means values can be preprocessed before returning them " +"from ``get()`` calls." +msgstr "在核心功能之上,:class:`ConfigParser` 还支持插值。 这意味着值可以在被 ``get()`` 调用返回之前进行预处理。" + +#: ../../library/configparser.rst:371 +msgid "" +"The default implementation used by :class:`ConfigParser`. It enables values" +" to contain format strings which refer to other values in the same section, " +"or values in the special default section [1]_. Additional default values " +"can be provided on initialization." +msgstr "" +"默认实现由 :class:`ConfigParser` 来使用。 它允许值包含引用了相同小节中其他值或者特殊的默认小节中的值的格式字符串 [1]_。 " +"额外的默认值可以在初始化时提供。" + +#: ../../library/configparser.rst:378 +msgid "" +"[Paths]\n" +"home_dir: /Users\n" +"my_dir: %(home_dir)s/lumberjack\n" +"my_pictures: %(my_dir)s/Pictures\n" +"\n" +"[Escape]\n" +"# use a %% to escape the % sign (% is the only character that needs to be escaped):\n" +"gain: 80%%" +msgstr "" +"[Paths]\n" +"home_dir: /Users\n" +"my_dir: %(home_dir)s/lumberjack\n" +"my_pictures: %(my_dir)s/Pictures\n" +"\n" +"[Escape]\n" +"# use a %% to escape the % sign (% is the only character that needs to be escaped):\n" +"gain: 80%%" + +#: ../../library/configparser.rst:389 +msgid "" +"In the example above, :class:`ConfigParser` with *interpolation* set to " +"``BasicInterpolation()`` would resolve ``%(home_dir)s`` to the value of " +"``home_dir`` (``/Users`` in this case). ``%(my_dir)s`` in effect would " +"resolve to ``/Users/lumberjack``. All interpolations are done on demand so " +"keys used in the chain of references do not have to be specified in any " +"specific order in the configuration file." +msgstr "" +"在上面的例子里,:class:`ConfigParser` 的 *interpolation* 设为 " +"``BasicInterpolation()``,这会将 ``%(home_dir)s`` 求解为 ``home_dir`` 的值 (在这里是 " +"``/Users``)。 ``%(my_dir)s`` 将被实际求解为 ``/Users/lumberjack``。 " +"所有插值都是按需进行的,这样引用链中使用的键不必以任何特定顺序在配置文件中指明。" + +#: ../../library/configparser.rst:396 +msgid "" +"With ``interpolation`` set to ``None``, the parser would simply return " +"``%(my_dir)s/Pictures`` as the value of ``my_pictures`` and " +"``%(home_dir)s/lumberjack`` as the value of ``my_dir``." +msgstr "" +"当 ``interpolation`` 设为 ``None`` 时,解析器会简单地返回 ``%(my_dir)s/Pictures`` 作为 " +"``my_pictures`` 的值,并返回 ``%(home_dir)s/lumberjack`` 作为 ``my_dir`` 的值。" + +#: ../../library/configparser.rst:404 +msgid "" +"An alternative handler for interpolation which implements a more advanced " +"syntax, used for instance in ``zc.buildout``. Extended interpolation is " +"using ``${section:option}`` to denote a value from a foreign section. " +"Interpolation can span multiple levels. For convenience, if the " +"``section:`` part is omitted, interpolation defaults to the current section " +"(and possibly the default values from the special section)." +msgstr "" +"一个用于插值的替代处理程序,它实现了更高级的语法,例如在 ``zc.buildout`` 中使用的。 扩展插值使用 " +"``${section:option}`` 来表示来自外部小节的值。 插值可以跨越多个层级。 为了方便使用,``section:`` " +"部分可被省略,插值会默认作用于当前小节(可能会从特殊小节获取默认值)。" + +#: ../../library/configparser.rst:411 +msgid "" +"For example, the configuration specified above with basic interpolation, " +"would look like this with extended interpolation:" +msgstr "例如,上面使用基本插值描述的配置,使用扩展插值将是这个样子:" + +#: ../../library/configparser.rst:414 +msgid "" +"[Paths]\n" +"home_dir: /Users\n" +"my_dir: ${home_dir}/lumberjack\n" +"my_pictures: ${my_dir}/Pictures\n" +"\n" +"[Escape]\n" +"# use a $$ to escape the $ sign ($ is the only character that needs to be escaped):\n" +"cost: $$80" +msgstr "" +"[Paths]\n" +"home_dir: /Users\n" +"my_dir: ${home_dir}/lumberjack\n" +"my_pictures: ${my_dir}/Pictures\n" +"\n" +"[Escape]\n" +"# use a $$ to escape the $ sign ($ is the only character that needs to be escaped):\n" +"cost: $$80" + +#: ../../library/configparser.rst:425 +msgid "Values from other sections can be fetched as well:" +msgstr "来自其他小节的值也可以被获取:" + +#: ../../library/configparser.rst:427 +msgid "" +"[Common]\n" +"home_dir: /Users\n" +"library_dir: /Library\n" +"system_dir: /System\n" +"macports_dir: /opt/local\n" +"\n" +"[Frameworks]\n" +"Python: 3.2\n" +"path: ${Common:system_dir}/Library/Frameworks/\n" +"\n" +"[Arthur]\n" +"nickname: Two Sheds\n" +"last_name: Jackson\n" +"my_dir: ${Common:home_dir}/twosheds\n" +"my_pictures: ${my_dir}/Pictures\n" +"python_dir: ${Frameworks:path}/Python/Versions/${Frameworks:Python}" +msgstr "" +"[Common]\n" +"home_dir: /Users\n" +"library_dir: /Library\n" +"system_dir: /System\n" +"macports_dir: /opt/local\n" +"\n" +"[Frameworks]\n" +"Python: 3.2\n" +"path: ${Common:system_dir}/Library/Frameworks/\n" +"\n" +"[Arthur]\n" +"nickname: Two Sheds\n" +"last_name: Jackson\n" +"my_dir: ${Common:home_dir}/twosheds\n" +"my_pictures: ${my_dir}/Pictures\n" +"python_dir: ${Frameworks:path}/Python/Versions/${Frameworks:Python}" + +#: ../../library/configparser.rst:447 +msgid "Mapping Protocol Access" +msgstr "映射协议访问" + +#: ../../library/configparser.rst:451 +msgid "" +"Mapping protocol access is a generic name for functionality that enables " +"using custom objects as if they were dictionaries. In case of " +":mod:`!configparser`, the mapping interface implementation is using the " +"``parser['section']['option']`` notation." +msgstr "" + +#: ../../library/configparser.rst:456 +msgid "" +"``parser['section']`` in particular returns a proxy for the section's data " +"in the parser. This means that the values are not copied but they are taken" +" from the original parser on demand. What's even more important is that " +"when values are changed on a section proxy, they are actually mutated in the" +" original parser." +msgstr "" +"``parser['section']`` 专门为解析器中的小节数据返回一个代理。 这意味着其中的值不会被拷贝,而是在需要时从原始解析器中获取。 " +"更为重要的是,当值在小节代理上被修改时,它们其实是在原始解析器中发生了改变。" + +#: ../../library/configparser.rst:462 +msgid "" +":mod:`!configparser` objects behave as close to actual dictionaries as " +"possible. The mapping interface is complete and adheres to the " +":class:`~collections.abc.MutableMapping` ABC. However, there are a few " +"differences that should be taken into account:" +msgstr "" + +#: ../../library/configparser.rst:467 +msgid "" +"By default, all keys in sections are accessible in a case-insensitive manner" +" [1]_. E.g. ``for option in parser[\"section\"]`` yields only " +"``optionxform``'ed option key names. This means lowercased keys by default." +" At the same time, for a section that holds the key ``'a'``, both " +"expressions return ``True``::" +msgstr "" +"默认情况下,小节中的所有键是以大小写不敏感的方式来访问的 [1]_。 例如 ``for option in parser[\"section\"]`` " +"只会产生 ``optionxform`` 形式的选项键名称。 也就是说默认使用小写字母键名。 与此同时,对于一个包含键 ``'a'`` " +"的小节,以下两个表达式均将返回 ``True``::" + +#: ../../library/configparser.rst:472 +msgid "" +"\"a\" in parser[\"section\"]\n" +"\"A\" in parser[\"section\"]" +msgstr "" +"\"a\" in parser[\"section\"]\n" +"\"A\" in parser[\"section\"]" + +#: ../../library/configparser.rst:475 +msgid "" +"All sections include ``DEFAULTSECT`` values as well which means that " +"``.clear()`` on a section may not leave the section visibly empty. This is " +"because default values cannot be deleted from the section (because " +"technically they are not there). If they are overridden in the section, " +"deleting causes the default value to be visible again. Trying to delete a " +"default value causes a :exc:`KeyError`." +msgstr "" +"所有小节也包括 ``DEFAULTSECT``,这意味着对一个小节执行 ``.clear()`` 可能无法使得该小节显示为空。 " +"这是因为默认值是无法从小节中被删除的(因为从技术上说它们并不在那里)。 如果它们在小节中被覆盖,删除将导致默认值重新变为可见。 尝试删除默认值将会引发 " +":exc:`KeyError`。" + +#: ../../library/configparser.rst:482 +msgid "``DEFAULTSECT`` cannot be removed from the parser:" +msgstr "``DEFAULTSECT`` 无法从解析器中被移除:" + +#: ../../library/configparser.rst:484 +msgid "trying to delete it raises :exc:`ValueError`," +msgstr "尝试删除将引发 :exc:`ValueError`," + +#: ../../library/configparser.rst:486 +msgid "``parser.clear()`` leaves it intact," +msgstr "``parser.clear()`` 会保留其原状," + +#: ../../library/configparser.rst:488 +msgid "``parser.popitem()`` never returns it." +msgstr "``parser.popitem()`` 绝不会将其返回。" + +#: ../../library/configparser.rst:490 +msgid "" +"``parser.get(section, option, **kwargs)`` - the second argument is **not** a" +" fallback value. Note however that the section-level ``get()`` methods are " +"compatible both with the mapping protocol and the classic configparser API." +msgstr "" +"``parser.get(section, option, **kwargs)`` - 第二个参数 **并非** 回退值。 但是请注意小节层级的 " +"``get()`` 方法可同时兼容映射协议和经典配置解析器 API。" + +#: ../../library/configparser.rst:494 +msgid "" +"``parser.items()`` is compatible with the mapping protocol (returns a list " +"of *section_name*, *section_proxy* pairs including the DEFAULTSECT). " +"However, this method can also be invoked with arguments: " +"``parser.items(section, raw, vars)``. The latter call returns a list of " +"*option*, *value* pairs for a specified ``section``, with all interpolations" +" expanded (unless ``raw=True`` is provided)." +msgstr "" +"``parser.items()`` 兼容映射协议(返回 *section_name*, *section_proxy* 对的列表,包括 " +"DEFAULTSECT)。 但是,此方法也可以附带参数来调用: ``parser.items(section, raw, vars)``。 " +"这种调用形式返回指定 ``section`` 的 *option*, *value* 对的列表,将展开所有插值(除非提供了 ``raw=True`` " +"选项)。" + +#: ../../library/configparser.rst:501 +msgid "" +"The mapping protocol is implemented on top of the existing legacy API so " +"that subclasses overriding the original interface still should have mappings" +" working as expected." +msgstr "映射协议是在现有的传统 API 之上实现的,以便重写原始接口的子类仍然具有符合预期的有效映射。" + +#: ../../library/configparser.rst:507 +msgid "Customizing Parser Behaviour" +msgstr "定制解析器行为" + +#: ../../library/configparser.rst:509 +msgid "" +"There are nearly as many INI format variants as there are applications using" +" it. :mod:`!configparser` goes a long way to provide support for the largest" +" sensible set of INI styles available. The default functionality is mainly " +"dictated by historical background and it's very likely that you will want to" +" customize some of the features." +msgstr "" + +#: ../../library/configparser.rst:515 +msgid "" +"The most common way to change the way a specific config parser works is to " +"use the :meth:`!__init__` options:" +msgstr "改变特定配置解析器行为的最常见方式是使用 :meth:`!__init__` 选项:" + +#: ../../library/configparser.rst:518 +msgid "*defaults*, default value: ``None``" +msgstr "*defaults*,默认值: ``None``" + +#: ../../library/configparser.rst:520 +msgid "" +"This option accepts a dictionary of key-value pairs which will be initially " +"put in the ``DEFAULT`` section. This makes for an elegant way to support " +"concise configuration files that don't specify values which are the same as " +"the documented default." +msgstr "" +"此选项接受一个键值对的字典,它将被首先放入 ``DEFAULT`` 小节。 " +"这实现了一种优雅的方式来支持简洁的配置文件,它不必指定与已记录的默认值相同的值。" + +#: ../../library/configparser.rst:525 +msgid "" +"Hint: if you want to specify default values for a specific section, use " +":meth:`~ConfigParser.read_dict` before you read the actual file." +msgstr "提示:如果你想要为特定的节指定默认值,请在读取实际文件之前使用 :meth:`~ConfigParser.read_dict`。" + +#: ../../library/configparser.rst:528 +msgid "*dict_type*, default value: :class:`dict`" +msgstr "*dict_type*,默认值: :class:`dict`" + +#: ../../library/configparser.rst:530 +msgid "" +"This option has a major impact on how the mapping protocol will behave and " +"how the written configuration files look. With the standard dictionary, " +"every section is stored in the order they were added to the parser. Same " +"goes for options within sections." +msgstr "此选项主要影响映射协议的行为和写入配置文件的外观。 使用标准字典时,每个小节是按照它们被加入解析器的顺序保存的。 在小节内的选项也是如此。" + +#: ../../library/configparser.rst:535 +msgid "" +"An alternative dictionary type can be used for example to sort sections and " +"options on write-back." +msgstr "还有其他替换的字典类型可以使用,例如在写回数据时对小节和选项进行排序。" + +#: ../../library/configparser.rst:538 +msgid "" +"Please note: there are ways to add a set of key-value pairs in a single " +"operation. When you use a regular dictionary in those operations, the order" +" of the keys will be ordered. For example:" +msgstr "请注意:存在其他方式只用一次操作来添加键值对的集合。 当你在这些操作中使用一个常规字典时,键将按顺序进行排列。 例如:" + +#: ../../library/configparser.rst:542 +msgid "" +">>> parser = configparser.ConfigParser()\n" +">>> parser.read_dict({'section1': {'key1': 'value1',\n" +"... 'key2': 'value2',\n" +"... 'key3': 'value3'},\n" +"... 'section2': {'keyA': 'valueA',\n" +"... 'keyB': 'valueB',\n" +"... 'keyC': 'valueC'},\n" +"... 'section3': {'foo': 'x',\n" +"... 'bar': 'y',\n" +"... 'baz': 'z'}\n" +"... })\n" +">>> parser.sections()\n" +"['section1', 'section2', 'section3']\n" +">>> [option for option in parser['section3']]\n" +"['foo', 'bar', 'baz']" +msgstr "" +">>> parser = configparser.ConfigParser()\n" +">>> parser.read_dict({'section1': {'key1': 'value1',\n" +"... 'key2': 'value2',\n" +"... 'key3': 'value3'},\n" +"... 'section2': {'keyA': 'valueA',\n" +"... 'keyB': 'valueB',\n" +"... 'keyC': 'valueC'},\n" +"... 'section3': {'foo': 'x',\n" +"... 'bar': 'y',\n" +"... 'baz': 'z'}\n" +"... })\n" +">>> parser.sections()\n" +"['section1', 'section2', 'section3']\n" +">>> [option for option in parser['section3']]\n" +"['foo', 'bar', 'baz']" + +#: ../../library/configparser.rst:560 +msgid "*allow_no_value*, default value: ``False``" +msgstr "*allow_no_value*,默认值: ``False``" + +#: ../../library/configparser.rst:562 +msgid "" +"Some configuration files are known to include settings without values, but " +"which otherwise conform to the syntax supported by :mod:`!configparser`. " +"The *allow_no_value* parameter to the constructor can be used to indicate " +"that such values should be accepted:" +msgstr "" + +#: ../../library/configparser.rst:567 +msgid "" +">>> import configparser\n" +"\n" +">>> sample_config = \"\"\"\n" +"... [mysqld]\n" +"... user = mysql\n" +"... pid-file = /var/run/mysqld/mysqld.pid\n" +"... skip-external-locking\n" +"... old_passwords = 1\n" +"... skip-bdb\n" +"... # we don't need ACID today\n" +"... skip-innodb\n" +"... \"\"\"\n" +">>> config = configparser.ConfigParser(allow_no_value=True)\n" +">>> config.read_string(sample_config)\n" +"\n" +">>> # Settings with values are treated as before:\n" +">>> config[\"mysqld\"][\"user\"]\n" +"'mysql'\n" +"\n" +">>> # Settings without values provide None:\n" +">>> config[\"mysqld\"][\"skip-bdb\"]\n" +"\n" +">>> # Settings which aren't specified still raise an error:\n" +">>> config[\"mysqld\"][\"does-not-exist\"]\n" +"Traceback (most recent call last):\n" +" ...\n" +"KeyError: 'does-not-exist'" +msgstr "" +">>> import configparser\n" +"\n" +">>> sample_config = \"\"\"\n" +"... [mysqld]\n" +"... user = mysql\n" +"... pid-file = /var/run/mysqld/mysqld.pid\n" +"... skip-external-locking\n" +"... old_passwords = 1\n" +"... skip-bdb\n" +"... # we don't need ACID today\n" +"... skip-innodb\n" +"... \"\"\"\n" +">>> config = configparser.ConfigParser(allow_no_value=True)\n" +">>> config.read_string(sample_config)\n" +"\n" +">>> # 有值的设置像之前一样处理:\n" +">>> config[\"mysqld\"][\"user\"]\n" +"'mysql'\n" +"\n" +">>> # 没有值的设置将为 None:\n" +">>> config[\"mysqld\"][\"skip-bdb\"]\n" +"\n" +">>> # 未指定的设置仍将引发错误:\n" +">>> config[\"mysqld\"][\"does-not-exist\"]\n" +"Traceback (most recent call last):\n" +" ...\n" +"KeyError: 'does-not-exist'" + +#: ../../library/configparser.rst:597 +msgid "*delimiters*, default value: ``('=', ':')``" +msgstr "*delimiters*,默认值: ``('=', ':')``" + +#: ../../library/configparser.rst:599 +msgid "" +"Delimiters are substrings that delimit keys from values within a section. " +"The first occurrence of a delimiting substring on a line is considered a " +"delimiter. This means values (but not keys) can contain the delimiters." +msgstr "分隔符是用于在小节内分隔键和值的子字符串。 在一行中首次出现的分隔子字符串会被视为一个分隔符。 这意味着值可以包含分隔符(但键不可以)。" + +#: ../../library/configparser.rst:603 +msgid "" +"See also the *space_around_delimiters* argument to " +":meth:`ConfigParser.write`." +msgstr "另请参见 :meth:`ConfigParser.write` 的 *space_around_delimiters* 参数。" + +#: ../../library/configparser.rst:606 +msgid "*comment_prefixes*, default value: ``('#', ';')``" +msgstr "*comment_prefixes*,默认值: ``('#', ';')``" + +#: ../../library/configparser.rst:608 +msgid "*inline_comment_prefixes*, default value: ``None``" +msgstr "*inline_comment_prefixes*,默认值: ``None``" + +#: ../../library/configparser.rst:610 +msgid "" +"Comment prefixes are strings that indicate the start of a valid comment " +"within a config file. *comment_prefixes* are used only on otherwise empty " +"lines (optionally indented) whereas *inline_comment_prefixes* can be used " +"after every valid value (e.g. section names, options and empty lines as " +"well). By default inline comments are disabled and ``'#'`` and ``';'`` are " +"used as prefixes for whole line comments." +msgstr "" +"注释前缀是配置文件中用于标示一条有效注释的开头的字符串。 *comment_prefixes* 仅用在原本为空白的行(可以缩进)而 " +"*inline_comment_prefixes* 可用在每个有效值之后(例如小节名称、选项以及空白的行)。 默认情况下禁用行内注释,并且 " +"``'#'`` 和 ``';'`` 都被用作完整行注释的前缀。" + +#: ../../library/configparser.rst:617 +msgid "" +"In previous versions of :mod:`!configparser` behaviour matched " +"``comment_prefixes=('#',';')`` and ``inline_comment_prefixes=(';',)``." +msgstr "" + +#: ../../library/configparser.rst:621 +msgid "" +"Please note that config parsers don't support escaping of comment prefixes " +"so using *inline_comment_prefixes* may prevent users from specifying option " +"values with characters used as comment prefixes. When in doubt, avoid " +"setting *inline_comment_prefixes*. In any circumstances, the only way of " +"storing comment prefix characters at the beginning of a line in multiline " +"values is to interpolate the prefix, for example::" +msgstr "" +"请注意配置解析器不支持对注释前缀的转义,因此使用 *inline_comment_prefixes* 可能妨碍用户将被用作注释前缀的字符指定为选项值。 " +"当有疑问时,请避免设置 *inline_comment_prefixes*。 " +"在任何情况下,在多行值的一行开头存储注释前缀字符的唯一方式是进行前缀插值,例如::" + +#: ../../library/configparser.rst:628 +msgid "" +">>> from configparser import ConfigParser, ExtendedInterpolation\n" +">>> parser = ConfigParser(interpolation=ExtendedInterpolation())\n" +">>> # the default BasicInterpolation could be used as well\n" +">>> parser.read_string(\"\"\"\n" +"... [DEFAULT]\n" +"... hash = #\n" +"...\n" +"... [hashes]\n" +"... shebang =\n" +"... ${hash}!/usr/bin/env python\n" +"... ${hash} -*- coding: utf-8 -*-\n" +"...\n" +"... extensions =\n" +"... enabled_extension\n" +"... another_extension\n" +"... #disabled_by_comment\n" +"... yet_another_extension\n" +"...\n" +"... interpolation not necessary = if # is not at line start\n" +"... even in multiline values = line #1\n" +"... line #2\n" +"... line #3\n" +"... \"\"\")\n" +">>> print(parser['hashes']['shebang'])\n" +"\n" +"#!/usr/bin/env python\n" +"# -*- coding: utf-8 -*-\n" +">>> print(parser['hashes']['extensions'])\n" +"\n" +"enabled_extension\n" +"another_extension\n" +"yet_another_extension\n" +">>> print(parser['hashes']['interpolation not necessary'])\n" +"if # is not at line start\n" +">>> print(parser['hashes']['even in multiline values'])\n" +"line #1\n" +"line #2\n" +"line #3" +msgstr "" +">>> from configparser import ConfigParser, ExtendedInterpolation\n" +">>> parser = ConfigParser(interpolation=ExtendedInterpolation())\n" +">>> # 默认的 BasicInterpolation 也同样可用\n" +">>> parser.read_string(\"\"\"\n" +"... [DEFAULT]\n" +"... hash = #\n" +"...\n" +"... [hashes]\n" +"... shebang =\n" +"... ${hash}!/usr/bin/env python\n" +"... ${hash} -*- coding: utf-8 -*-\n" +"...\n" +"... extensions =\n" +"... enabled_extension\n" +"... another_extension\n" +"... #disabled_by_comment\n" +"... yet_another_extension\n" +"...\n" +"... interpolation not necessary = if # is not at line start\n" +"... even in multiline values = line #1\n" +"... line #2\n" +"... line #3\n" +"... \"\"\")\n" +">>> print(parser['hashes']['shebang'])\n" +"\n" +"#!/usr/bin/env python\n" +"# -*- coding: utf-8 -*-\n" +">>> print(parser['hashes']['extensions'])\n" +"\n" +"enabled_extension\n" +"another_extension\n" +"yet_another_extension\n" +">>> print(parser['hashes']['interpolation not necessary'])\n" +"if # is not at line start\n" +">>> print(parser['hashes']['even in multiline values'])\n" +"line #1\n" +"line #2\n" +"line #3" + +#: ../../library/configparser.rst:667 +msgid "*strict*, default value: ``True``" +msgstr "*strict*,默认值: ``True``" + +#: ../../library/configparser.rst:669 +msgid "" +"When set to ``True``, the parser will not allow for any section or option " +"duplicates while reading from a single source (using " +":meth:`~ConfigParser.read_file`, :meth:`~ConfigParser.read_string` or " +":meth:`~ConfigParser.read_dict`). It is recommended to use strict parsers " +"in new applications." +msgstr "" +"当设为 ``True`` 时,解析器在从单一源读取 (使用 :meth:`~ConfigParser.read_file`, " +":meth:`~ConfigParser.read_string` 或 :meth:`~ConfigParser.read_dict`) " +"期间将不允许任何节或选项出现重复。 推荐在新的应用中使用严格解析器。" + +#: ../../library/configparser.rst:674 +msgid "" +"In previous versions of :mod:`!configparser` behaviour matched " +"``strict=False``." +msgstr "" + +#: ../../library/configparser.rst:678 +msgid "*empty_lines_in_values*, default value: ``True``" +msgstr "*empty_lines_in_values*,默认值: ``True``" + +#: ../../library/configparser.rst:680 +msgid "" +"In config parsers, values can span multiple lines as long as they are " +"indented more than the key that holds them. By default parsers also let " +"empty lines to be parts of values. At the same time, keys can be " +"arbitrarily indented themselves to improve readability. In consequence, " +"when configuration files get big and complex, it is easy for the user to " +"lose track of the file structure. Take for instance:" +msgstr "" +"在配置解析器中,值可以包含多行,只要它们的缩进深于它们所对应的键。 默认情况下解析器还会将空行视为值的一部分。 " +"与此同时,键本身也可以任意缩进以提升可读性。 因此,当配置文件变得非常庞大而复杂时,用户很容易失去对文件结构的掌控。 例如:" + +#: ../../library/configparser.rst:687 +msgid "" +"[Section]\n" +"key = multiline\n" +" value with a gotcha\n" +"\n" +" this = is still a part of the multiline value of 'key'" +msgstr "" +"[Section]\n" +"key = multiline\n" +" value with a gotcha\n" +"\n" +" this = is still a part of the multiline value of 'key'" + +#: ../../library/configparser.rst:695 +msgid "" +"This can be especially problematic for the user to see if she's using a " +"proportional font to edit the file. That is why when your application does " +"not need values with empty lines, you should consider disallowing them. " +"This will make empty lines split keys every time. In the example above, it " +"would produce two keys, ``key`` and ``this``." +msgstr "" +"在用户查看时这可能会特别有问题,如果用户是使用比例字体来编辑文件的话。 这就是为什么当你的应用不需要带有空行的值时,你应该考虑禁用它们。 " +"这将使得空行每次都会作为键之间的分隔。 在上面的示例中,空行产生了两个键,``key`` 和 ``this``。" + +#: ../../library/configparser.rst:701 +msgid "" +"*default_section*, default value: ``configparser.DEFAULTSECT`` (that is: " +"``\"DEFAULT\"``)" +msgstr "*default_section*,默认值: ``configparser.DEFAULTSECT`` (即: ``\"DEFAULT\"``)" + +#: ../../library/configparser.rst:704 +msgid "" +"The convention of allowing a special section of default values for other " +"sections or interpolation purposes is a powerful concept of this library, " +"letting users create complex declarative configurations. This section is " +"normally called ``\"DEFAULT\"`` but this can be customized to point to any " +"other valid section name. Some typical values include: ``\"general\"`` or " +"``\"common\"``. The name provided is used for recognizing default sections " +"when reading from any source and is used when writing configuration back to " +"a file. Its current value can be retrieved using the " +"``parser_instance.default_section`` attribute and may be modified at runtime" +" (i.e. to convert files from one format to another)." +msgstr "" +"允许设置一个保存默认值的特殊节在其他节或插值等目的中使用的惯例是这个库所拥有的一个强大概念,使得用户能够创建复杂的声明性配置。 这种特殊节通常称为 " +"``\"DEFAULT\"`` 但也可以被定制为指向任何其他有效的节名称。 一些典型的值包括: ``\"general\"`` 或 " +"``\"common\"``。 所提供的名称在从任意节读取的时候被用于识别默认的节,而且也会在将配置写回文件时被使用。 它的当前值可以使用 " +"``parser_instance.default_section`` 属性来获取,并且可以在运行时被修改(即将文件从一种格式转换为另一种格式)。" + +#: ../../library/configparser.rst:715 +msgid "*interpolation*, default value: ``configparser.BasicInterpolation``" +msgstr "*interpolation*,默认值: ``configparser.BasicInterpolation``" + +#: ../../library/configparser.rst:717 +msgid "" +"Interpolation behaviour may be customized by providing a custom handler " +"through the *interpolation* argument. ``None`` can be used to turn off " +"interpolation completely, ``ExtendedInterpolation()`` provides a more " +"advanced variant inspired by ``zc.buildout``. More on the subject in the " +"`dedicated documentation section <#interpolation-of-values>`_. " +":class:`RawConfigParser` has a default value of ``None``." +msgstr "" +"插值行为可以通过 *interpolation* 参数提供自定义处理程序的方式来定制。 ``None`` " +"可用来完全禁用插值,``ExtendedInterpolation()`` 提供了一种更高级的变体形式,它的设计受到了 ``zc.buildout`` " +"的启发。 有关该主题的更多信息请参见 `专门的文档章节 <#interpolation-of-values>`_。 " +":class:`RawConfigParser` 具有默认的值 ``None``。" + +#: ../../library/configparser.rst:724 +msgid "*converters*, default value: not set" +msgstr "*converters*,默认值: 不设置" + +#: ../../library/configparser.rst:726 +msgid "" +"Config parsers provide option value getters that perform type conversion. " +"By default :meth:`~ConfigParser.getint`, :meth:`~ConfigParser.getfloat`, and" +" :meth:`~ConfigParser.getboolean` are implemented. Should other getters be " +"desirable, users may define them in a subclass or pass a dictionary where " +"each key is a name of the converter and each value is a callable " +"implementing said conversion. For instance, passing ``{'decimal': " +"decimal.Decimal}`` would add :meth:`!getdecimal` on both the parser object " +"and all section proxies. In other words, it will be possible to write both " +"``parser_instance.getdecimal('section', 'key', fallback=0)`` and " +"``parser_instance['section'].getdecimal('key', 0)``." +msgstr "" +"配置解析器提供了执行类型转换的选项值获取方法。 默认情况下实现了 :meth:`~ConfigParser.getint`, " +":meth:`~ConfigParser.getfloat` 和 :meth:`~ConfigParser.getboolean`。 " +"如果还需要其他获取方法,用户可以在子类中定义它们,或者传入一个字典,其中每个键都是一个转换器的名称而每个值都是一个实现了特定转换的可调用对象。 " +"例如,传入 ``{'decimal': decimal.Decimal}`` 将对解析器对象和所有节代理添加 :meth:`!getdecimal`。 " +"换句话说,可以同时编写 ``parser_instance.getdecimal('section', 'key', fallback=0)`` 和 " +"``parser_instance['section'].getdecimal('key', 0)``。" + +#: ../../library/configparser.rst:737 +msgid "" +"If the converter needs to access the state of the parser, it can be " +"implemented as a method on a config parser subclass. If the name of this " +"method starts with ``get``, it will be available on all section proxies, in " +"the dict-compatible form (see the ``getdecimal()`` example above)." +msgstr "" +"如果转换器需要访问解析器的状态,可以在配置解析器子类上作为一个方法来实现。 如果该方法的名称是以 ``get`` " +"打头的,它将在所有节代理上以兼容字典的形式提供(参见上面的 ``getdecimal()`` 示例)。" + +#: ../../library/configparser.rst:742 +msgid "" +"More advanced customization may be achieved by overriding default values of " +"these parser attributes. The defaults are defined on the classes, so they " +"may be overridden by subclasses or by attribute assignment." +msgstr "更多高级定制选项可通过重写这些解析器属性的默认值来达成。 默认值是在类中定义的,因此它们可以通过子类或属性赋值来重写。" + +#: ../../library/configparser.rst:748 +msgid "" +"By default when using :meth:`~ConfigParser.getboolean`, config parsers " +"consider the following values ``True``: ``'1'``, ``'yes'``, ``'true'``, " +"``'on'`` and the following values ``False``: ``'0'``, ``'no'``, ``'false'``," +" ``'off'``. You can override this by specifying a custom dictionary of " +"strings and their Boolean outcomes. For example:" +msgstr "" +"默认情况下当使用 :meth:`~ConfigParser.getboolean` 时,配置解析器会将下列值视为 ``True``: ``'1'``, " +"``'yes'``, ``'true'``, ``'on'`` 而将下列值视为 ``False``: ``'0'``, ``'no'``, " +"``'false'``, ``'off'``。 你可以通过指定一个自定义的字符串键及其对应的布尔值字典来覆盖此行为。 例如:" + +#: ../../library/configparser.rst:754 +msgid "" +">>> custom = configparser.ConfigParser()\n" +">>> custom['section1'] = {'funky': 'nope'}\n" +">>> custom['section1'].getboolean('funky')\n" +"Traceback (most recent call last):\n" +"...\n" +"ValueError: Not a boolean: nope\n" +">>> custom.BOOLEAN_STATES = {'sure': True, 'nope': False}\n" +">>> custom['section1'].getboolean('funky')\n" +"False" +msgstr "" +">>> custom = configparser.ConfigParser()\n" +">>> custom['section1'] = {'funky': 'nope'}\n" +">>> custom['section1'].getboolean('funky')\n" +"Traceback (most recent call last):\n" +"...\n" +"ValueError: Not a boolean: nope\n" +">>> custom.BOOLEAN_STATES = {'sure': True, 'nope': False}\n" +">>> custom['section1'].getboolean('funky')\n" +"False" + +#: ../../library/configparser.rst:766 +msgid "" +"Other typical Boolean pairs include ``accept``/``reject`` or " +"``enabled``/``disabled``." +msgstr "其他典型的布尔值对包括 ``accept``/``reject`` 或 ``enabled``/``disabled``。" + +#: ../../library/configparser.rst:772 +msgid "" +"This method transforms option names on every read, get, or set operation. " +"The default converts the name to lowercase. This also means that when a " +"configuration file gets written, all keys will be lowercase. Override this " +"method if that's unsuitable. For example:" +msgstr "" +"这个方法会转换每次 read, get, 或 set 操作的选项名称。 默认会将名称转换为小写形式。 " +"这也意味着当一个配置文件被写入时,所有键都将为小写形式。 如果此行为不合适则要重写此方法。 例如:" + +#: ../../library/configparser.rst:778 +msgid "" +">>> config = \"\"\"\n" +"... [Section1]\n" +"... Key = Value\n" +"...\n" +"... [Section2]\n" +"... AnotherKey = Value\n" +"... \"\"\"\n" +">>> typical = configparser.ConfigParser()\n" +">>> typical.read_string(config)\n" +">>> list(typical['Section1'].keys())\n" +"['key']\n" +">>> list(typical['Section2'].keys())\n" +"['anotherkey']\n" +">>> custom = configparser.RawConfigParser()\n" +">>> custom.optionxform = lambda option: option\n" +">>> custom.read_string(config)\n" +">>> list(custom['Section1'].keys())\n" +"['Key']\n" +">>> list(custom['Section2'].keys())\n" +"['AnotherKey']" +msgstr "" +">>> config = \"\"\"\n" +"... [Section1]\n" +"... Key = Value\n" +"...\n" +"... [Section2]\n" +"... AnotherKey = Value\n" +"... \"\"\"\n" +">>> typical = configparser.ConfigParser()\n" +">>> typical.read_string(config)\n" +">>> list(typical['Section1'].keys())\n" +"['key']\n" +">>> list(typical['Section2'].keys())\n" +"['anotherkey']\n" +">>> custom = configparser.RawConfigParser()\n" +">>> custom.optionxform = lambda option: option\n" +">>> custom.read_string(config)\n" +">>> list(custom['Section1'].keys())\n" +"['Key']\n" +">>> list(custom['Section2'].keys())\n" +"['AnotherKey']" + +#: ../../library/configparser.rst:802 +msgid "" +"The optionxform function transforms option names to a canonical form. This " +"should be an idempotent function: if the name is already in canonical form, " +"it should be returned unchanged." +msgstr "optionxform 函数会将选项名称转换为规范形式。 这应该是一个幂等函数:如果名称已经为规范形式,则应不加修改地将其返回。" + +#: ../../library/configparser.rst:809 +msgid "" +"A compiled regular expression used to parse section headers. The default " +"matches ``[section]`` to the name ``\"section\"``. Whitespace is considered" +" part of the section name, thus ``[ larch ]`` will be read as a section of" +" name ``\" larch \"``. Override this attribute if that's unsuitable. For" +" example:" +msgstr "" +"一个已编译正则表达式会被用来解析节标头。 默认将 ``[section]`` 匹配到名称 ``\"section\"``。 " +"空格会被视为节名称的一部分,因此 ``[ larch ]`` 将被读取为一个名称为 ``\" larch \"`` 的节。 " +"如果此行为不合适则要覆盖此属性。 例如:" + +#: ../../library/configparser.rst:815 +msgid "" +">>> import re\n" +">>> config = \"\"\"\n" +"... [Section 1]\n" +"... option = value\n" +"...\n" +"... [ Section 2 ]\n" +"... another = val\n" +"... \"\"\"\n" +">>> typical = configparser.ConfigParser()\n" +">>> typical.read_string(config)\n" +">>> typical.sections()\n" +"['Section 1', ' Section 2 ']\n" +">>> custom = configparser.ConfigParser()\n" +">>> custom.SECTCRE = re.compile(r\"\\[ *(?P
[^]]+?) *\\]\")\n" +">>> custom.read_string(config)\n" +">>> custom.sections()\n" +"['Section 1', 'Section 2']" +msgstr "" +">>> import re\n" +">>> config = \"\"\"\n" +"... [Section 1]\n" +"... option = value\n" +"...\n" +"... [ Section 2 ]\n" +"... another = val\n" +"... \"\"\"\n" +">>> typical = configparser.ConfigParser()\n" +">>> typical.read_string(config)\n" +">>> typical.sections()\n" +"['Section 1', ' Section 2 ']\n" +">>> custom = configparser.ConfigParser()\n" +">>> custom.SECTCRE = re.compile(r\"\\[ *(?P
[^]]+?) *\\]\")\n" +">>> custom.read_string(config)\n" +">>> custom.sections()\n" +"['Section 1', 'Section 2']" + +#: ../../library/configparser.rst:837 +msgid "" +"While ConfigParser objects also use an ``OPTCRE`` attribute for recognizing " +"option lines, it's not recommended to override it because that would " +"interfere with constructor options *allow_no_value* and *delimiters*." +msgstr "" +"虽然 ConfigParser 对象也使用 ``OPTCRE`` 属性来识别选项行,但并不推荐重写它,因为这会与构造器选项 " +"*allow_no_value* 和 *delimiters* 产生冲突。" + +#: ../../library/configparser.rst:843 +msgid "Legacy API Examples" +msgstr "旧式 API 示例" + +#: ../../library/configparser.rst:845 +msgid "" +"Mainly because of backwards compatibility concerns, :mod:`!configparser` " +"provides also a legacy API with explicit ``get``/``set`` methods. While " +"there are valid use cases for the methods outlined below, mapping protocol " +"access is preferred for new projects. The legacy API is at times more " +"advanced, low-level and downright counterintuitive." +msgstr "" + +#: ../../library/configparser.rst:851 +msgid "An example of writing to a configuration file::" +msgstr "一个写入配置文件的示例::" + +#: ../../library/configparser.rst:853 +msgid "" +"import configparser\n" +"\n" +"config = configparser.RawConfigParser()\n" +"\n" +"# Please note that using RawConfigParser's set functions, you can assign\n" +"# non-string values to keys internally, but will receive an error when\n" +"# attempting to write to a file or when you get it in non-raw mode. Setting\n" +"# values using the mapping protocol or ConfigParser's set() does not allow\n" +"# such assignments to take place.\n" +"config.add_section('Section1')\n" +"config.set('Section1', 'an_int', '15')\n" +"config.set('Section1', 'a_bool', 'true')\n" +"config.set('Section1', 'a_float', '3.1415')\n" +"config.set('Section1', 'baz', 'fun')\n" +"config.set('Section1', 'bar', 'Python')\n" +"config.set('Section1', 'foo', '%(bar)s is %(baz)s!')\n" +"\n" +"# Writing our configuration file to 'example.cfg'\n" +"with open('example.cfg', 'w') as configfile:\n" +" config.write(configfile)" +msgstr "" +"import configparser\n" +"\n" +"config = configparser.RawConfigParser()\n" +"\n" +"# 请注意在使用 RawConfigParser 的 set 函数时,\n" +"# 你可以在内部为键赋非字符串值,但当你试图\n" +"# 写入文件或在非原始模式下获取它时将会报错。\n" +"# 使用映射协议或 ConfigParser 的 set() 设置值时\n" +"# 不允许执行这样的赋值。\n" +"config.add_section('Section1')\n" +"config.set('Section1', 'an_int', '15')\n" +"config.set('Section1', 'a_bool', 'true')\n" +"config.set('Section1', 'a_float', '3.1415')\n" +"config.set('Section1', 'baz', 'fun')\n" +"config.set('Section1', 'bar', 'Python')\n" +"config.set('Section1', 'foo', '%(bar)s is %(baz)s!')\n" +"\n" +"# 将我们的配置文件写入 'example.cfg'\n" +"with open('example.cfg', 'w') as configfile:\n" +" config.write(configfile)" + +#: ../../library/configparser.rst:874 +msgid "An example of reading the configuration file again::" +msgstr "一个再次读取配置文件的示例::" + +#: ../../library/configparser.rst:876 +msgid "" +"import configparser\n" +"\n" +"config = configparser.RawConfigParser()\n" +"config.read('example.cfg')\n" +"\n" +"# getfloat() raises an exception if the value is not a float\n" +"# getint() and getboolean() also do this for their respective types\n" +"a_float = config.getfloat('Section1', 'a_float')\n" +"an_int = config.getint('Section1', 'an_int')\n" +"print(a_float + an_int)\n" +"\n" +"# Notice that the next output does not interpolate '%(bar)s' or '%(baz)s'.\n" +"# This is because we are using a RawConfigParser().\n" +"if config.getboolean('Section1', 'a_bool'):\n" +" print(config.get('Section1', 'foo'))" +msgstr "" +"import configparser\n" +"\n" +"config = configparser.RawConfigParser()\n" +"config.read('example.cfg')\n" +"\n" +"# getfloat() 在值不为浮点数时将引发异常\n" +"# getint() 和 getboolean() 对其相应类型也是如此\n" +"a_float = config.getfloat('Section1', 'a_float')\n" +"an_int = config.getint('Section1', 'an_int')\n" +"print(a_float + an_int)\n" +"\n" +"# 请注意下面的输出不会执行 '%(bar)s' 或 '%(baz)s' 插值。\n" +"# 这是因为我们是使用 RawConfigParser()。\n" +"if config.getboolean('Section1', 'a_bool'):\n" +" print(config.get('Section1', 'foo'))" + +#: ../../library/configparser.rst:892 +msgid "To get interpolation, use :class:`ConfigParser`::" +msgstr "要获取插值,请使用 :class:`ConfigParser`::" + +#: ../../library/configparser.rst:894 +msgid "" +"import configparser\n" +"\n" +"cfg = configparser.ConfigParser()\n" +"cfg.read('example.cfg')\n" +"\n" +"# Set the optional *raw* argument of get() to True if you wish to disable\n" +"# interpolation in a single get operation.\n" +"print(cfg.get('Section1', 'foo', raw=False)) # -> \"Python is fun!\"\n" +"print(cfg.get('Section1', 'foo', raw=True)) # -> \"%(bar)s is %(baz)s!\"\n" +"\n" +"# The optional *vars* argument is a dict with members that will take\n" +"# precedence in interpolation.\n" +"print(cfg.get('Section1', 'foo', vars={'bar': 'Documentation',\n" +" 'baz': 'evil'}))\n" +"\n" +"# The optional *fallback* argument can be used to provide a fallback value\n" +"print(cfg.get('Section1', 'foo'))\n" +" # -> \"Python is fun!\"\n" +"\n" +"print(cfg.get('Section1', 'foo', fallback='Monty is not.'))\n" +" # -> \"Python is fun!\"\n" +"\n" +"print(cfg.get('Section1', 'monster', fallback='No such things as monsters.'))\n" +" # -> \"No such things as monsters.\"\n" +"\n" +"# A bare print(cfg.get('Section1', 'monster')) would raise NoOptionError\n" +"# but we can also use:\n" +"\n" +"print(cfg.get('Section1', 'monster', fallback=None))\n" +" # -> None" +msgstr "" +"import configparser\n" +"\n" +"cfg = configparser.ConfigParser()\n" +"cfg.read('example.cfg')\n" +"\n" +"# 如果你想要在一个单独的 get 操作中禁用插值\n" +"# 可将 get() 的可选参数 *raw* 设为 True。\n" +"print(cfg.get('Section1', 'foo', raw=False)) # -> \"Python is fun!\"\n" +"print(cfg.get('Section1', 'foo', raw=True)) # -> \"%(bar)s is %(baz)s!\"\n" +"\n" +"# 可选参数 *vars* 是一个字典,其中的元素将在\n" +"# 插值中优先使用。\n" +"print(cfg.get('Section1', 'foo', vars={'bar': 'Documentation',\n" +" 'baz': 'evil'}))\n" +"\n" +"# 可选参数 *fallback* 可被用来提供一个回退值\n" +"print(cfg.get('Section1', 'foo'))\n" +" # -> \"Python is fun!\"\n" +"\n" +"print(cfg.get('Section1', 'foo', fallback='Monty is not.'))\n" +" # -> \"Python is fun!\"\n" +"\n" +"print(cfg.get('Section1', 'monster', fallback='No such things as monsters.'))\n" +" # -> \"No such things as monsters.\"\n" +"\n" +"# 直接使用 print(cfg.get('Section1', 'monster')) 将会引发 NoOptionError\n" +"# 但我们还可以使用:\n" +"\n" +"print(cfg.get('Section1', 'monster', fallback=None))\n" +" # -> None" + +#: ../../library/configparser.rst:925 +msgid "" +"Default values are available in both types of ConfigParsers. They are used " +"in interpolation if an option used is not defined elsewhere. ::" +msgstr "默认值在两种类型的 ConfigParser 中均可用。 它们将在当某个选项未在别处定义时被用于插值。 ::" + +#: ../../library/configparser.rst:928 +msgid "" +"import configparser\n" +"\n" +"# New instance with 'bar' and 'baz' defaulting to 'Life' and 'hard' each\n" +"config = configparser.ConfigParser({'bar': 'Life', 'baz': 'hard'})\n" +"config.read('example.cfg')\n" +"\n" +"print(config.get('Section1', 'foo')) # -> \"Python is fun!\"\n" +"config.remove_option('Section1', 'bar')\n" +"config.remove_option('Section1', 'baz')\n" +"print(config.get('Section1', 'foo')) # -> \"Life is hard!\"" +msgstr "" +"import configparser\n" +"\n" +"# 'bar' 和 'baz' 分别默认为 'Life' 和 'hard' 的新实例\n" +"config = configparser.ConfigParser({'bar': 'Life', 'baz': 'hard'})\n" +"config.read('example.cfg')\n" +"\n" +"print(config.get('Section1', 'foo')) # -> \"Python is fun!\"\n" +"config.remove_option('Section1', 'bar')\n" +"config.remove_option('Section1', 'baz')\n" +"print(config.get('Section1', 'foo')) # -> \"Life is hard!\"" + +#: ../../library/configparser.rst:943 +msgid "ConfigParser Objects" +msgstr "ConfigParser 对象" + +#: ../../library/configparser.rst:953 +msgid "" +"The main configuration parser. When *defaults* is given, it is initialized " +"into the dictionary of intrinsic defaults. When *dict_type* is given, it " +"will be used to create the dictionary objects for the list of sections, for " +"the options within a section, and for the default values." +msgstr "" +"主配置解析器。 当给定 *defaults* 时,它会被初始化为包含固有默认值的字典。 当给定 *dict_type* " +"时,它将被用来创建包含节、节中的选项以及默认值的字典。" + +#: ../../library/configparser.rst:958 +msgid "" +"When *delimiters* is given, it is used as the set of substrings that divide " +"keys from values. When *comment_prefixes* is given, it will be used as the " +"set of substrings that prefix comments in otherwise empty lines. Comments " +"can be indented. When *inline_comment_prefixes* is given, it will be used " +"as the set of substrings that prefix comments in non-empty lines." +msgstr "" +"当给定 *delimiters* 时,它会被用作分隔键与值的子字符串的集合。 当给定 *comment_prefixes* " +"时,它将被用作在否则为空行的注释的前缀子字符串的集合。 注释可以被缩进。 当给定 *inline_comment_prefixes* " +"时,它将被用作非空行的注释的前缀子字符串的集合。" + +#: ../../library/configparser.rst:964 +msgid "" +"When *strict* is ``True`` (the default), the parser won't allow for any " +"section or option duplicates while reading from a single source (file, " +"string or dictionary), raising :exc:`DuplicateSectionError` or " +":exc:`DuplicateOptionError`. When *empty_lines_in_values* is ``False`` " +"(default: ``True``), each empty line marks the end of an option. Otherwise," +" internal empty lines of a multiline option are kept as part of the value. " +"When *allow_no_value* is ``True`` (default: ``False``), options without " +"values are accepted; the value held for these is ``None`` and they are " +"serialized without the trailing delimiter." +msgstr "" +"当 *strict* 为 ``True`` (默认值) 时,解析器在从单个源(文件、字符串或字典)读取时将不允许任何节或选项出现重复,否则会引发 " +":exc:`DuplicateSectionError` 或 :exc:`DuplicateOptionError`。 当 " +"*empty_lines_in_values* 为 ``False`` (默认值: ``True``) 时,每个空行均表示一个选项的结束。 " +"在其他情况下,一个多行选项内部的空行会被保留为值的一部分。 当 *allow_no_value* 为 ``True`` (默认值: ``False``)" +" 时,将接受没有值的选项;此种选项的值将为 ``None`` 并且它们会以不带末尾分隔符的形式被序列化。" + +#: ../../library/configparser.rst:974 +msgid "" +"When *default_section* is given, it specifies the name for the special " +"section holding default values for other sections and interpolation purposes" +" (normally named ``\"DEFAULT\"``). This value can be retrieved and changed " +"at runtime using the ``default_section`` instance attribute. This won't re-" +"evaluate an already parsed config file, but will be used when writing parsed" +" settings to a new config file." +msgstr "" +"当给出 *default_section* 时,它指定了为其他部分和插值目的而保存默认值的特殊部分的名称 (通常命名为 " +"``\"DEFAULT\"``)。 该值可通过使用 ``default_section`` 实例属性在运行时被读取或修改值。 " +"这不会对已解析的配置文件进行重新求值,但会在将解析的设置写入新的配置文件时使用。" + +#: ../../library/configparser.rst:981 +msgid "" +"Interpolation behaviour may be customized by providing a custom handler " +"through the *interpolation* argument. ``None`` can be used to turn off " +"interpolation completely, ``ExtendedInterpolation()`` provides a more " +"advanced variant inspired by ``zc.buildout``. More on the subject in the " +"`dedicated documentation section <#interpolation-of-values>`_." +msgstr "" +"插值行为可通过给出 *interpolation* 参数提供自定义处理程序的方式来定制。 ``None`` " +"可用来完全禁用插值,``ExtendedInterpolation()`` 提供了一种更高级的变体形式,它的设计受到了 ``zc.buildout`` " +"的启发。 有关该主题的更多信息请参见 `专门的文档章节 <#interpolation-of-values>`_。" + +#: ../../library/configparser.rst:987 +msgid "" +"All option names used in interpolation will be passed through the " +":meth:`optionxform` method just like any other option name reference. For " +"example, using the default implementation of :meth:`optionxform` (which " +"converts option names to lower case), the values ``foo %(bar)s`` and ``foo " +"%(BAR)s`` are equivalent." +msgstr "" +"插值中使用的所有选项名称将像任何其他选项名称引用一样通过 :meth:`optionxform` 方法来传递。 例如,使用 " +":meth:`optionxform` 的默认实现(它会将选项名称转换为小写形式)时,值 ``foo %(bar)s`` 和 ``foo " +"%(BAR)s`` 是等价的。" + +#: ../../library/configparser.rst:993 +msgid "" +"When *converters* is given, it should be a dictionary where each key " +"represents the name of a type converter and each value is a callable " +"implementing the conversion from string to the desired datatype. Every " +"converter gets its own corresponding :meth:`!get*` method on the parser " +"object and section proxies." +msgstr "" +"当给出 *converters* 时,它应当是一个字典,其中每个键代表一个类型转换器的名称而每个值则为实现从字符串到目标数据类型的转换的可调用对象。 " +"每个转换器会获得其在解析器对象和节代理上对应的 :meth:`!get*` 方法。" + +#: ../../library/configparser.rst:999 +msgid "" +"When *allow_unnamed_section* is ``True`` (default: ``False``), the first " +"section name can be omitted. See the `\"Unnamed Sections\" section " +"<#unnamed-sections>`_." +msgstr "" +"当 *allow_unnamed_section* 为 ``True`` (默认值: ``False``) 时,第一个节名称可被省略。 参见 " +"`\"未命名节\" 一节 <#unnamed-sections>`_。" + +#: ../../library/configparser.rst:1028 +msgid "The default *dict_type* is :class:`collections.OrderedDict`." +msgstr "默认的 *dict_type* 为 :class:`collections.OrderedDict`。" + +#: ../../library/configparser.rst:1031 ../../library/configparser.rst:1324 +msgid "" +"*allow_no_value*, *delimiters*, *comment_prefixes*, *strict*, " +"*empty_lines_in_values*, *default_section* and *interpolation* were added." +msgstr "" +"添加了 *allow_no_value*, *delimiters*, *comment_prefixes*, *strict*, " +"*empty_lines_in_values*, *default_section* 以及 *interpolation*。" + +#: ../../library/configparser.rst:1036 ../../library/configparser.rst:1329 +msgid "The *converters* argument was added." +msgstr "添加了 *converters* 参数。" + +#: ../../library/configparser.rst:1039 +msgid "" +"The *defaults* argument is read with :meth:`read_dict`, providing consistent" +" behavior across the parser: non-string keys and values are implicitly " +"converted to strings." +msgstr "" +"*defaults* 参数将在 :meth:`read_dict` 时被读取,提供全解析器范围内一致的行为:非字符串类型的键和值会被隐式地转换为字符串。" + +#: ../../library/configparser.rst:1044 ../../library/configparser.rst:1332 +msgid "" +"The default *dict_type* is :class:`dict`, since it now preserves insertion " +"order." +msgstr "默认的 *dict_type* 为 :class:`dict`,因为它现在会保留插入顺序。" + +#: ../../library/configparser.rst:1048 +msgid "" +"Raise a :exc:`MultilineContinuationError` when *allow_no_value* is ``True``," +" and a key without a value is continued with an indented line." +msgstr "" +"当 *allow_no_value* 为 ``True`` 且没有值的键带有一个缩进的行时将会引发 " +":exc:`MultilineContinuationError`。" + +#: ../../library/configparser.rst:1052 ../../library/configparser.rst:1336 +msgid "The *allow_unnamed_section* argument was added." +msgstr "增加了 *allow_unnamed_section* 参数。" + +#: ../../library/configparser.rst:1057 +msgid "Return a dictionary containing the instance-wide defaults." +msgstr "返回包含实例范围内默认值的字典。" + +#: ../../library/configparser.rst:1062 +msgid "" +"Return a list of the sections available; the *default section* is not " +"included in the list." +msgstr "返回可用节的列表;*default section* 不包括在该列表中。" + +#: ../../library/configparser.rst:1068 +msgid "" +"Add a section named *section* to the instance. If a section by the given " +"name already exists, :exc:`DuplicateSectionError` is raised. If the " +"*default section* name is passed, :exc:`ValueError` is raised. The name of " +"the section must be a string; if not, :exc:`TypeError` is raised." +msgstr "" +"向实例添加一个名为 *section* 的节。 如果给定名称的节已存在,将会引发 :exc:`DuplicateSectionError`。 如果传入了" +" *default section* 名称,则会引发 :exc:`ValueError`。 节名称必须为字符串;如果不是则会引发 " +":exc:`TypeError`。" + +#: ../../library/configparser.rst:1073 +msgid "Non-string section names raise :exc:`TypeError`." +msgstr "非字符串的节名称将引发 :exc:`TypeError`。" + +#: ../../library/configparser.rst:1079 +msgid "" +"Indicates whether the named *section* is present in the configuration. The " +"*default section* is not acknowledged." +msgstr "指明相应名称的 *section* 是否存在于配置中。 *default section* 不包含在内。" + +#: ../../library/configparser.rst:1085 +msgid "Return a list of options available in the specified *section*." +msgstr "返回指定 *section* 中可用选项的列表。" + +#: ../../library/configparser.rst:1090 +msgid "" +"If the given *section* exists, and contains the given *option*, return " +":const:`True`; otherwise return :const:`False`. If the specified *section* " +"is :const:`None` or an empty string, DEFAULT is assumed." +msgstr "" +"如果给定的 *section* 存在并且包含给定的 *option* 则返回 :const:`True`;否则返回 :const:`False`。 " +"如果指定的 *section* 为 :const:`None` 或空字符串,则会使用 DEFAULT。" + +#: ../../library/configparser.rst:1097 +msgid "" +"Attempt to read and parse an iterable of filenames, returning a list of " +"filenames which were successfully parsed." +msgstr "尝试读取并解析一个包含文件名的可迭代对象,返回一个被成功解析的文件名列表。" + +#: ../../library/configparser.rst:1100 +msgid "" +"If *filenames* is a string, a :class:`bytes` object or a :term:`path-like " +"object`, it is treated as a single filename. If a file named in *filenames*" +" cannot be opened, that file will be ignored. This is designed so that you " +"can specify an iterable of potential configuration file locations (for " +"example, the current directory, the user's home directory, and some system-" +"wide directory), and all existing configuration files in the iterable will " +"be read." +msgstr "" +"如果 *filenames* 为字符串、:class:`bytes` 对象或 :term:`path-like " +"object`,它会被当作单个文件来处理。 如果 *filenames* 中名称对应的某个文件无法被打开,该文件将被忽略。 " +"这样的设计使得你可以指定包含多个潜在配置文件位置的可迭代对象(例如当前目录、用户家目录以及某个系统级目录),存在于该可迭代对象中的所有配置文件都将被读取。" + +#: ../../library/configparser.rst:1109 +msgid "" +"If none of the named files exist, the :class:`ConfigParser` instance will " +"contain an empty dataset. An application which requires initial values to " +"be loaded from a file should load the required file or files using " +":meth:`read_file` before calling :meth:`read` for any optional files::" +msgstr "" +"如果名称对应的文件全都不存在,则 :class:`ConfigParser` 实例将包含一个空数据集。 一个要求从文件加载初始值的应用应当在调用 " +":meth:`read` 来获取任何可选文件之前使用 :meth:`read_file` 来加载所要求的一个或多个文件::" + +#: ../../library/configparser.rst:1115 +msgid "" +"import configparser, os\n" +"\n" +"config = configparser.ConfigParser()\n" +"config.read_file(open('defaults.cfg'))\n" +"config.read(['site.cfg', os.path.expanduser('~/.myapp.cfg')],\n" +" encoding='cp1250')" +msgstr "" +"import configparser, os\n" +"\n" +"config = configparser.ConfigParser()\n" +"config.read_file(open('defaults.cfg'))\n" +"config.read(['site.cfg', os.path.expanduser('~/.myapp.cfg')],\n" +" encoding='cp1250')" + +#: ../../library/configparser.rst:1122 +msgid "" +"Added the *encoding* parameter. Previously, all files were read using the " +"default encoding for :func:`open`." +msgstr "增加了 *encoding* 形参。 在之前版本中,所有文件都将使用 :func:`open` 的默认编码格式来读取。" + +#: ../../library/configparser.rst:1126 +msgid "The *filenames* parameter accepts a :term:`path-like object`." +msgstr "*filenames* 形参接受一个 :term:`path-like object`。" + +#: ../../library/configparser.rst:1129 +msgid "The *filenames* parameter accepts a :class:`bytes` object." +msgstr "*filenames* 形参接受一个 :class:`bytes` 对象。" + +#: ../../library/configparser.rst:1135 +msgid "" +"Read and parse configuration data from *f* which must be an iterable " +"yielding Unicode strings (for example files opened in text mode)." +msgstr "从 *f* 读取并解析配置数据,它必须是一个产生 Unicode 字符串的可迭代对象(例如以文本模式打开的文件)。" + +#: ../../library/configparser.rst:1138 +msgid "" +"Optional argument *source* specifies the name of the file being read. If " +"not given and *f* has a :attr:`!name` attribute, that is used for *source*; " +"the default is ``''``." +msgstr "" +"可选参数 *source* 指定要读取的文件名称。 如果未给出并且 *f* 具有 :attr:`!name` 属性,则该属性会被用作 " +"*source*;默认值为 ``''``。" + +#: ../../library/configparser.rst:1142 +msgid "Replaces :meth:`!readfp`." +msgstr "替代 :meth:`!readfp`。" + +#: ../../library/configparser.rst:1147 +msgid "Parse configuration data from a string." +msgstr "从字符串中解析配置数据。" + +#: ../../library/configparser.rst:1149 +msgid "" +"Optional argument *source* specifies a context-specific name of the string " +"passed. If not given, ``''`` is used. This should commonly be a " +"filesystem path or a URL." +msgstr "" +"可选参数 *source* 指定一个所传入字符串的上下文专属名称。 如果未给出,则会使用 ``''``。 这通常应为一个文件系统路径或 " +"URL。" + +#: ../../library/configparser.rst:1158 +msgid "" +"Load configuration from any object that provides a dict-like ``items()`` " +"method. Keys are section names, values are dictionaries with keys and " +"values that should be present in the section. If the used dictionary type " +"preserves order, sections and their keys will be added in order. Values are " +"automatically converted to strings." +msgstr "" +"从任意一个提供了类似于字典的 ``items()`` 方法的对象加载配置。 键为节名称,值为包含节中所出现的键和值的字典。 " +"如果所用的字典类型会保留顺序,则节和其中的键将按顺序加入。 值会被自动转换为字符串。" + +#: ../../library/configparser.rst:1164 +msgid "" +"Optional argument *source* specifies a context-specific name of the " +"dictionary passed. If not given, ```` is used." +msgstr "可选参数 *source* 指定一个所传入字典的上下文专属名称。 如果未给出,则会使用 ````。" + +#: ../../library/configparser.rst:1167 +msgid "This method can be used to copy state between parsers." +msgstr "此方法可被用于在解析器之间拷贝状态。" + +#: ../../library/configparser.rst:1174 +msgid "" +"Get an *option* value for the named *section*. If *vars* is provided, it " +"must be a dictionary. The *option* is looked up in *vars* (if provided), " +"*section*, and in *DEFAULTSECT* in that order. If the key is not found and " +"*fallback* is provided, it is used as a fallback value. ``None`` can be " +"provided as a *fallback* value." +msgstr "" +"获取指定名称的 *section* 的一个 *option* 的值。 如果提供了 *vars*,则它必须为一个字典。 *option* 的查找顺序为 " +"*vars*(如果有提供)、*section* 以及 *DEFAULTSECT*。 如果未找到该键并且提供了 *fallback*,则它会被用作回退值。" +" 可以提供 ``None`` 作为 *fallback* 值。" + +#: ../../library/configparser.rst:1180 +msgid "" +"All the ``'%'`` interpolations are expanded in the return values, unless the" +" *raw* argument is true. Values for interpolation keys are looked up in the" +" same manner as the option." +msgstr "所有 ``'%'`` 插值会在返回值中被展开,除非 *raw* 参数为真值。 插值键所使用的值会按与选项相同的方式来查找。" + +#: ../../library/configparser.rst:1184 +msgid "" +"Arguments *raw*, *vars* and *fallback* are keyword only to protect users " +"from trying to use the third argument as the *fallback* fallback (especially" +" when using the mapping protocol)." +msgstr "" +"*raw*, *vars* 和 *fallback* 都是仅限关键字参数,以防止用户试图使用第三个参数作为 *fallback* " +"回退值(特别是在使用映射协议的时候)。" + +#: ../../library/configparser.rst:1192 +msgid "" +"A convenience method which coerces the *option* in the specified *section* " +"to an integer. See :meth:`get` for explanation of *raw*, *vars* and " +"*fallback*." +msgstr "" +"将在指定 *section* 中的 *option* 强制转换为整数的便捷方法。 参见 :meth:`get` 获取对于 *raw*, *vars* 和" +" *fallback* 的解释。" + +#: ../../library/configparser.rst:1199 +msgid "" +"A convenience method which coerces the *option* in the specified *section* " +"to a floating-point number. See :meth:`get` for explanation of *raw*, " +"*vars* and *fallback*." +msgstr "" +"将在指定 *section* 中的 *option* 强制转换为浮点数的便捷方法。 参见 :meth:`get` 获取对于 *raw*, *vars* " +"和 *fallback* 的解释。" + +#: ../../library/configparser.rst:1206 +msgid "" +"A convenience method which coerces the *option* in the specified *section* " +"to a Boolean value. Note that the accepted values for the option are " +"``'1'``, ``'yes'``, ``'true'``, and ``'on'``, which cause this method to " +"return ``True``, and ``'0'``, ``'no'``, ``'false'``, and ``'off'``, which " +"cause it to return ``False``. These string values are checked in a case-" +"insensitive manner. Any other value will cause it to raise " +":exc:`ValueError`. See :meth:`get` for explanation of *raw*, *vars* and " +"*fallback*." +msgstr "" +"将在指定 *section* 中的 *option* 强制转换为布尔值的便捷方法。 请注意选项所接受的值为 ``'1'``, ``'yes'``, " +"``'true'`` 和 ``'on'``,它们会使得此方法返回 ``True``,以及 ``'0'``, ``'no'``, ``'false'`` " +"和 ``'off'``,它们会使得此方法返回 ``False``。 这些字符串值会以对大小写不敏感的方式被检测。 任何其他值都将导致引发 " +":exc:`ValueError`。 参见 :meth:`get` 获取对于 *raw*, *vars* 和 *fallback* 的解释。" + +#: ../../library/configparser.rst:1219 +msgid "" +"When *section* is not given, return a list of *section_name*, " +"*section_proxy* pairs, including DEFAULTSECT." +msgstr "" +"当未给出 *section* 时,将返回由 *section_name*, *section_proxy* 对组成的列表,包括 DEFAULTSECT。" + +#: ../../library/configparser.rst:1222 +msgid "" +"Otherwise, return a list of *name*, *value* pairs for the options in the " +"given *section*. Optional arguments have the same meaning as for the " +":meth:`get` method." +msgstr "" +"在其他情况下,将返回给定的 *section* 中的 option 的 *name*, *value* 对组成的列表。 可选参数具有与 " +":meth:`get` 方法的参数相同的含义。" + +#: ../../library/configparser.rst:1226 +msgid "" +"Items present in *vars* no longer appear in the result. The previous " +"behaviour mixed actual parser options with variables provided for " +"interpolation." +msgstr "*vars* 中的条目将不在结果中出现。 之前的行为混淆了实际的解析器选项和为插值提供的变量。" + +#: ../../library/configparser.rst:1234 +msgid "" +"If the given section exists, set the given option to the specified value; " +"otherwise raise :exc:`NoSectionError`. *option* and *value* must be " +"strings; if not, :exc:`TypeError` is raised." +msgstr "" +"如果给定的节存在,则将所给出的选项设为指定的值;在其他情况下将引发 :exc:`NoSectionError`。 *option* 和 *value* " +"必须为字符串;如果不是则将引发 :exc:`TypeError`。" + +#: ../../library/configparser.rst:1241 +msgid "" +"Write a representation of the configuration to the specified :term:`file " +"object`, which must be opened in text mode (accepting strings). This " +"representation can be parsed by a future :meth:`read` call. If " +"*space_around_delimiters* is true, delimiters between keys and values are " +"surrounded by spaces." +msgstr "" +"将配置的表示形式写入指定的 :term:`file object`,该对象必须以文本模式打开(接受字符串)。 此表示形式可由将来的 " +":meth:`read` 调用进行解析。 如果 *space_around_delimiters* 为真值,键和值之间的分隔符两边将加上空格。" + +#: ../../library/configparser.rst:1247 +msgid "" +"Raises InvalidWriteError if this would write a representation which cannot " +"be accurately parsed by a future :meth:`read` call from this parser." +msgstr "如果这会写入一个无法被该解析器后续的 :meth:`read` 调用精确解析的表示形式则会引发 InvalidWriteError。" + +#: ../../library/configparser.rst:1253 +msgid "" +"Comments in the original configuration file are not preserved when writing " +"the configuration back. What is considered a comment, depends on the given " +"values for *comment_prefix* and *inline_comment_prefix*." +msgstr "" +"原始配置文件中的注释在写回配置时不会被保留。 具体哪些会被当作注释,取决于为 *comment_prefix* 和 " +"*inline_comment_prefix* 所指定的值。" + +#: ../../library/configparser.rst:1261 +msgid "" +"Remove the specified *option* from the specified *section*. If the section " +"does not exist, raise :exc:`NoSectionError`. If the option existed to be " +"removed, return :const:`True`; otherwise return :const:`False`." +msgstr "" +"将指定的 *option* 从指定的 *section* 中移除。 如果指定的节不存在则会引发 :exc:`NoSectionError`。 " +"如果要移除的选项存在则返回 :const:`True`;在其他情况下将返回 :const:`False`。" + +#: ../../library/configparser.rst:1269 +msgid "" +"Remove the specified *section* from the configuration. If the section in " +"fact existed, return ``True``. Otherwise return ``False``." +msgstr "从配置中移除指定的 *section*。 如果指定的节确实存在则返回 ``True``。 在其他情况下将返回 ``False``。" + +#: ../../library/configparser.rst:1275 +msgid "" +"Transforms the option name *option* as found in an input file or as passed " +"in by client code to the form that should be used in the internal " +"structures. The default implementation returns a lower-case version of " +"*option*; subclasses may override this or client code can set an attribute " +"of this name on instances to affect this behavior." +msgstr "" +"将在输入文件中获取到的或由客户端代码传入的选项名 *option* 转换为应当在内部结构中使用的形式。 默认实现将返回 *option* " +"的小写形式版本;子类可以重写此行为,或者客户端代码也可以在实例上设置一个具有此名称的属性来影响此行为。" + +#: ../../library/configparser.rst:1281 +msgid "" +"You don't need to subclass the parser to use this method, you can also set " +"it on an instance, to a function that takes a string argument and returns a " +"string. Setting it to ``str``, for example, would make option names case " +"sensitive::" +msgstr "" +"你不需要子类化解析器来使用此方法,你也可以在一个实例上将它设为一个接受字符串参数并返回字符串的函数。 例如将它设为 ``str`` " +"将使得选项名称变得大小写敏感::" + +#: ../../library/configparser.rst:1286 +msgid "" +"cfgparser = ConfigParser()\n" +"cfgparser.optionxform = str" +msgstr "" +"cfgparser = ConfigParser()\n" +"cfgparser.optionxform = str" + +#: ../../library/configparser.rst:1289 +msgid "" +"Note that when reading configuration files, whitespace around the option " +"names is stripped before :meth:`optionxform` is called." +msgstr "请注意当读取配置文件时,选项名称两边的空格将在调用 :meth:`optionxform` 之前被去除。" + +#: ../../library/configparser.rst:1295 +msgid "" +"A special object representing a section name used to reference the unnamed " +"section (see :ref:`unnamed-sections`)." +msgstr "一个代表用于引用未命名小节的小节名称的特殊对象 (参见 :ref:`unnamed-sections`)。" + +#: ../../library/configparser.rst:1300 +msgid "" +"The maximum depth for recursive interpolation for " +":meth:`~configparser.ConfigParser.get` when the *raw* parameter is false. " +"This is relevant only when the default *interpolation* is used." +msgstr "" +"当 *raw* 形参为假值时 :meth:`~configparser.ConfigParser.get` 所采用的递归插值的最大深度。 " +"这只在使用默认的 *interpolation* 时会起作用。" + +#: ../../library/configparser.rst:1308 +msgid "RawConfigParser Objects" +msgstr "RawConfigParser 对象" + +#: ../../library/configparser.rst:1319 +msgid "" +"Legacy variant of the :class:`ConfigParser`. It has interpolation disabled " +"by default and allows for non-string section names, option names, and values" +" via its unsafe ``add_section`` and ``set`` methods, as well as the legacy " +"``defaults=`` keyword argument handling." +msgstr "" +"旧式 :class:`ConfigParser`。 它默认禁用插值并且允许通过不安全的 ``add_section`` 和 ``set`` 方法以及旧式" +" ``defaults=`` 关键字参数处理来设置非字符串的节名、选项名和值。" + +#: ../../library/configparser.rst:1340 +msgid "" +"Consider using :class:`ConfigParser` instead which checks types of the " +"values to be stored internally. If you don't want interpolation, you can " +"use ``ConfigParser(interpolation=None)``." +msgstr "" +"考虑改用 :class:`ConfigParser`,它会检查内部保存的值的类型。 如果你不想要插值,你可以使用 " +"``ConfigParser(interpolation=None)``。" + +#: ../../library/configparser.rst:1347 +msgid "" +"Add a section named *section* or :const:`UNNAMED_SECTION` to the instance." +msgstr "为实例添加一个名为 *section* 或 :const:`UNNAMED_SECTION` 的小节。" + +#: ../../library/configparser.rst:1349 +msgid "" +"If the given section already exists, :exc:`DuplicateSectionError` is raised." +" If the *default section* name is passed, :exc:`ValueError` is raised. If " +":const:`UNNAMED_SECTION` is passed and support is disabled, " +":exc:`UnnamedSectionDisabledError` is raised." +msgstr "" +"如果给定名称的节已存在,会引发 :exc:`DuplicateSectionError`。 如果传入了 *default section* " +"名称,则会引发 :exc:`ValueError`。 如果传入了 :const:`UNNAMED_SECTION` 且其支持被禁用,则会引发 " +":exc:`UnnamedSectionDisabledError`。" + +#: ../../library/configparser.rst:1354 +msgid "" +"Type of *section* is not checked which lets users create non-string named " +"sections. This behaviour is unsupported and may cause internal errors." +msgstr "不检查 *section* 以允许用户创建以非字符串命名的节。 此行为已不受支持并可能导致内部错误。" + +#: ../../library/configparser.rst:1357 +msgid "Added support for :const:`UNNAMED_SECTION`." +msgstr "添加了对 :const:`UNNAMED_SECTION` 的支持。" + +#: ../../library/configparser.rst:1363 +msgid "" +"If the given section exists, set the given option to the specified value; " +"otherwise raise :exc:`NoSectionError`. While it is possible to use " +":class:`RawConfigParser` (or :class:`ConfigParser` with *raw* parameters set" +" to true) for *internal* storage of non-string values, full functionality " +"(including interpolation and output to files) can only be achieved using " +"string values." +msgstr "" +"如果给定的节存在,则将给定的选项设为指定的值;在其他情况下将引发 :exc:`NoSectionError`。 虽然可能使用 " +":class:`RawConfigParser` (或使用 :class:`ConfigParser` 并将 *raw* 形参设为真值) " +"以便实现非字符串值的 *internal* 存储,但是完整功能(包括插值和输出到文件)只能使用字符串值来实现。" + +#: ../../library/configparser.rst:1370 +msgid "" +"This method lets users assign non-string values to keys internally. This " +"behaviour is unsupported and will cause errors when attempting to write to a" +" file or get it in non-raw mode. **Use the mapping protocol API** which " +"does not allow such assignments to take place." +msgstr "" +"此方法允许用户在内部将非字符串值赋给键。 此行为已不受支持并会在尝试写入到文件或在非原始模式下获取数据时导致错误。 **请使用映射协议 " +"API**,它不允许出现这样的赋值。" + +#: ../../library/configparser.rst:1377 +msgid "Exceptions" +msgstr "异常" + +#: ../../library/configparser.rst:1381 +msgid "Base class for all other :mod:`!configparser` exceptions." +msgstr "所有其他 :mod:`!configparser` 异常的基类。" + +#: ../../library/configparser.rst:1386 +msgid "Exception raised when a specified section is not found." +msgstr "当找不到指定节时引发的异常。" + +#: ../../library/configparser.rst:1391 +msgid "" +"Exception raised if :meth:`~ConfigParser.add_section` is called with the " +"name of a section that is already present or in strict parsers when a " +"section if found more than once in a single input file, string or " +"dictionary." +msgstr "" +"当调用 :meth:`~ConfigParser.add_section` " +"时传入已存在的节名称,或者在严格解析器中当单个输入文件、字符串或字典内出现重复的节时引发的异常。" + +#: ../../library/configparser.rst:1395 +msgid "" +"Added the optional *source* and *lineno* attributes and parameters to " +":meth:`!__init__`." +msgstr "向 :meth:`!__init__` 添加了可选的 *source* 和 *lineno* 属性和形参。" + +#: ../../library/configparser.rst:1402 +msgid "" +"Exception raised by strict parsers if a single option appears twice during " +"reading from a single file, string or dictionary. This catches misspellings " +"and case sensitivity-related errors, e.g. a dictionary may have two keys " +"representing the same case-insensitive configuration key." +msgstr "" +"当单个选项在从单个文件、字符串或字典读取时出现两次时引发的异常。 " +"这会捕获拼写错误和大小写敏感相关的错误,例如一个字典可能包含两个键分别代表同一个大小写不敏感的配置键。" + +#: ../../library/configparser.rst:1410 +msgid "" +"Exception raised when a specified option is not found in the specified " +"section." +msgstr "当指定的选项未在指定的节中被找到时引发的异常。" + +#: ../../library/configparser.rst:1416 +msgid "" +"Base class for exceptions raised when problems occur performing string " +"interpolation." +msgstr "当执行字符串插值发生问题时所引发的异常的基类。" + +#: ../../library/configparser.rst:1422 +msgid "" +"Exception raised when string interpolation cannot be completed because the " +"number of iterations exceeds :const:`MAX_INTERPOLATION_DEPTH`. Subclass of " +":exc:`InterpolationError`." +msgstr "" +"当字符串插值由于迭代次数超出 :const:`MAX_INTERPOLATION_DEPTH` 而无法完成所引发的异常。 为 " +":exc:`InterpolationError` 的子类。" + +#: ../../library/configparser.rst:1429 +msgid "" +"Exception raised when an option referenced from a value does not exist. " +"Subclass of :exc:`InterpolationError`." +msgstr "当从某个值引用的选项并不存在时引发的异常。 为 :exc:`InterpolationError` 的子类。" + +#: ../../library/configparser.rst:1435 +msgid "" +"Exception raised when the source text into which substitutions are made does" +" not conform to the required syntax. Subclass of :exc:`InterpolationError`." +msgstr "当将要执行替换的源文本不符合要求的语法时引发的异常。 为 :exc:`InterpolationError` 的子类。" + +#: ../../library/configparser.rst:1441 +msgid "" +"Exception raised when attempting to parse a file which has no section " +"headers." +msgstr "当尝试解析一个不带节标头的文件时引发的异常。" + +#: ../../library/configparser.rst:1446 +msgid "Exception raised when errors occur attempting to parse a file." +msgstr "当尝试解析一个文件而发生错误时引发的异常。" + +#: ../../library/configparser.rst:1448 +msgid "" +"The ``filename`` attribute and :meth:`!__init__` constructor argument were " +"removed. They have been available using the name ``source`` since 3.2." +msgstr "" +"``filename`` 属性和 :meth:`!__init__` 构造器参数已被移除。 它们自 3.2 起可以使用名称 ``source`` " +"来访问。" + +#: ../../library/configparser.rst:1454 +msgid "" +"Exception raised when a key without a corresponding value is continued with " +"an indented line." +msgstr "当没有对应值的键带有一个缩进的行时将引发的异常。" + +#: ../../library/configparser.rst:1461 +msgid "" +"Exception raised when attempting to use the :const:`UNNAMED_SECTION` without" +" enabling it." +msgstr "在未启用 :const:`UNNAMED_SECTION` 的情况下尝试使用它时引发的异常。" + +#: ../../library/configparser.rst:1468 +msgid "" +"Exception raised when an attempted :meth:`ConfigParser.write` would not be " +"parsed accurately with a future :meth:`ConfigParser.read` call." +msgstr "" +"当尝试的 :meth:`ConfigParser.write` 写入的内容无法被将来的 :meth:`ConfigParser.read` " +"调用准确解析时引发的异常。" + +#: ../../library/configparser.rst:1471 +msgid "" +"Ex: Writing a key beginning with the :attr:`ConfigParser.SECTCRE` pattern " +"would parse as a section header when read. Attempting to write this will " +"raise this exception." +msgstr "" +"例如:写一个以 :attr:`ConfigParser.SECTCRE` 模式开头的键,它在读取时将被解析为节头。 尝试写入此内容将引发此异常。" + +#: ../../library/configparser.rst:1478 +msgid "Footnotes" +msgstr "备注" + +#: ../../library/configparser.rst:1479 +msgid "" +"Config parsers allow for heavy customization. If you are interested in " +"changing the behaviour outlined by the footnote reference, consult the " +"`Customizing Parser Behaviour`_ section." +msgstr "" +"配置解析器允许重度定制。 如果你有兴趣改变脚注说明中所介绍的行为,请参阅 `Customizing Parser Behaviour`_ 一节。" + +#: ../../library/configparser.rst:16 +msgid ".ini" +msgstr ".ini" + +#: ../../library/configparser.rst:16 +msgid "file" +msgstr "文件" + +#: ../../library/configparser.rst:16 +msgid "configuration" +msgstr "配置" + +#: ../../library/configparser.rst:16 +msgid "ini file" +msgstr "ini 文件" + +#: ../../library/configparser.rst:16 +msgid "Windows ini file" +msgstr "Windows ini 文件" + +#: ../../library/configparser.rst:367 +msgid "% (percent)" +msgstr "% (百分号)" + +#: ../../library/configparser.rst:367 ../../library/configparser.rst:400 +msgid "interpolation in configuration files" +msgstr "在配置文件中的插值" + +#: ../../library/configparser.rst:400 +msgid "$ (dollar)" +msgstr "$ (货币符号)" diff --git a/library/constants.po b/library/constants.po new file mode 100644 index 0000000000..24bf1aa3af --- /dev/null +++ b/library/constants.po @@ -0,0 +1,184 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-06-03 19:20+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/constants.rst:4 +msgid "Built-in Constants" +msgstr "内置常量" + +#: ../../library/constants.rst:6 +msgid "A small number of constants live in the built-in namespace. They are:" +msgstr "有少数的常量存在于内置命名空间中。 它们是:" + +#: ../../library/constants.rst:10 +msgid "" +"The false value of the :class:`bool` type. Assignments to ``False`` are " +"illegal and raise a :exc:`SyntaxError`." +msgstr ":class:`bool` 类型的假值。 给 ``False`` 赋值是非法的并会引发 :exc:`SyntaxError`。" + +#: ../../library/constants.rst:16 +msgid "" +"The true value of the :class:`bool` type. Assignments to ``True`` are " +"illegal and raise a :exc:`SyntaxError`." +msgstr ":class:`bool` 类型的真值。 给 ``True`` 赋值是非法的并会引发 :exc:`SyntaxError`。" + +#: ../../library/constants.rst:22 +msgid "" +"An object frequently used to represent the absence of a value, as when " +"default arguments are not passed to a function. Assignments to ``None`` are " +"illegal and raise a :exc:`SyntaxError`. ``None`` is the sole instance of the" +" :class:`~types.NoneType` type." +msgstr "" + +#: ../../library/constants.rst:30 +msgid "" +"A special value which should be returned by the binary special methods (e.g." +" :meth:`~object.__eq__`, :meth:`~object.__lt__`, :meth:`~object.__add__`, " +":meth:`~object.__rsub__`, etc.) to indicate that the operation is not " +"implemented with respect to the other type; may be returned by the in-place " +"binary special methods (e.g. :meth:`~object.__imul__`, " +":meth:`~object.__iand__`, etc.) for the same purpose. It should not be " +"evaluated in a boolean context. :data:`!NotImplemented` is the sole instance" +" of the :class:`types.NotImplementedType` type." +msgstr "" + +#: ../../library/constants.rst:40 +msgid "" +"When a binary (or in-place) method returns :data:`!NotImplemented` the " +"interpreter will try the reflected operation on the other type (or some " +"other fallback, depending on the operator). If all attempts return " +":data:`!NotImplemented`, the interpreter will raise an appropriate " +"exception. Incorrectly returning :data:`!NotImplemented` will result in a " +"misleading error message or the :data:`!NotImplemented` value being returned" +" to Python code." +msgstr "" +"当一个双目(或原地)方法返回 :data:`!NotImplemented` " +"时解释器将尝试对另一种类型(或其他回退操作,具体取决于所用的运算符)的反射操作。 如果所有尝试都返回 " +":data:`!NotImplemented`,解释器将引发适当的异常。 错误地返回 :data:`!NotImplemented` " +"将导致误导性的错误消息或 :data:`!NotImplemented` 值被返回给 Python 代码。" + +#: ../../library/constants.rst:47 +msgid "See :ref:`implementing-the-arithmetic-operations` for examples." +msgstr "参见 :ref:`implementing-the-arithmetic-operations` 了解相关示例。" + +#: ../../library/constants.rst:51 +msgid "" +":data:`!NotImplemented` and :exc:`!NotImplementedError` are not " +"interchangeable. This constant should only be used as described above; see " +":exc:`NotImplementedError` for details on correct usage of the exception." +msgstr "" +":data:`!NotImplemented` 和 :exc:`!NotImplementedError` 不能互相替代。 " +"此常量应当仅以上文所描述的方式使用;请参阅 :exc:`NotImplementedError` 了解正确使用该异常的相关细节。" + +#: ../../library/constants.rst:56 +msgid "" +"Evaluating :data:`!NotImplemented` in a boolean context was deprecated." +msgstr "在布尔运算上下文中对 :data:`!NotImplemented` 求值的做法已被弃用。" + +#: ../../library/constants.rst:59 +msgid "" +"Evaluating :data:`!NotImplemented` in a boolean context now raises a " +":exc:`TypeError`. It previously evaluated to :const:`True` and emitted a " +":exc:`DeprecationWarning` since Python 3.9." +msgstr "" +"在布尔运算上下文中对 :data:`!NotImplemented` 求值现在会引发 :exc:`TypeError`。 在之前版本中它会被求值为 " +":const:`True` 并将自 Python 3.9 起发出 :exc:`DeprecationWarning`。" + +#: ../../library/constants.rst:68 +msgid "" +"The same as the ellipsis literal \"``...``\", an object frequently used to " +"indicate that something is omitted. Assignment to ``Ellipsis`` is possible, " +"but assignment to ``...`` raises a :exc:`SyntaxError`. ``Ellipsis`` is the " +"sole instance of the :class:`types.EllipsisType` type." +msgstr "" + +#: ../../library/constants.rst:76 +msgid "" +"This constant is true if Python was not started with an :option:`-O` option." +" See also the :keyword:`assert` statement." +msgstr "如果 Python 没有以 :option:`-O` 选项启动,则此常量为真值。 另请参见 :keyword:`assert` 语句。" + +#: ../../library/constants.rst:82 +msgid "" +"The names :data:`None`, :data:`False`, :data:`True` and :data:`__debug__` " +"cannot be reassigned (assignments to them, even as an attribute name, raise " +":exc:`SyntaxError`), so they can be considered \"true\" constants." +msgstr "" +"名称 :data:`None`,:data:`False`,:data:`True` 和 :data:`__debug__` 无法被重新赋值 " +"(对它们赋值,即使是作为属性名,也会引发 :exc:`SyntaxError`),所以它们可以被认为是\"真正的\"常量。" + +#: ../../library/constants.rst:90 +msgid "Constants added by the :mod:`site` module" +msgstr "由 :mod:`site` 模块添加的常量" + +#: ../../library/constants.rst:92 +msgid "" +"The :mod:`site` module (which is imported automatically during startup, " +"except if the :option:`-S` command-line option is given) adds several " +"constants to the built-in namespace. They are useful for the interactive " +"interpreter shell and should not be used in programs." +msgstr "" +":mod:`site` 模块(在启动期间自动导入,除非给出 :option:`-S` 命令行选项)将几个常量添加到内置命名空间。 它们对交互式解释器 " +"shell 很有用,并且不应在程序中使用。" + +#: ../../library/constants.rst:100 +msgid "" +"Objects that when printed, print a message like \"Use quit() or Ctrl-D (i.e." +" EOF) to exit\", and when accessed directly in the interactive interpreter " +"or called as functions, raise :exc:`SystemExit` with the specified exit " +"code." +msgstr "" +"当对象被打印时,会打印一条消息如 \"Use quit() or Ctrl-D (i.e. EOF) to " +"exit\",当在交互解释器中直接访问或作为函数调用时,将引发 :exc:`SystemExit` 并附带指定的退出码。" + +#: ../../library/constants.rst:108 +msgid "" +"Object that when printed, prints the message \"Type help() for interactive " +"help, or help(object) for help about object.\", and when accessed directly " +"in the interactive interpreter, invokes the built-in help system (see " +":func:`help`)." +msgstr "" +"该对象在打印时会输出消息 \"Type help() for interactive help, or help(object) for help " +"about object.\",当在交互式解释器中直接访问该对象时,则会调用内置的帮助系统 (参见 :func:`help`)。" + +#: ../../library/constants.rst:116 +msgid "" +"Objects that when printed or called, print the text of copyright or credits," +" respectively." +msgstr "这些对象在被打印或调用时,将分别打印版权或致谢文本。" + +#: ../../library/constants.rst:121 +msgid "" +"Object that when printed, prints the message \"Type license() to see the " +"full license text\", and when called, displays the full license text in a " +"pager-like fashion (one screen at a time)." +msgstr "" +"当打印此对象时,会打印出一条消息“Type license() to see the full license " +"text”,当调用此对象时,将以分页形式显示完整的许可证文本(每次显示一屏)。" + +#: ../../library/constants.rst:65 +msgid "..." +msgstr "..." + +#: ../../library/constants.rst:65 +msgid "ellipsis literal" +msgstr "省略符字面值" diff --git a/library/contextlib.po b/library/contextlib.po new file mode 100644 index 0000000000..827c805334 --- /dev/null +++ b/library/contextlib.po @@ -0,0 +1,1974 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/contextlib.rst:2 +msgid "" +":mod:`!contextlib` --- Utilities for :keyword:`!with`\\ -statement contexts" +msgstr ":mod:`!contextlib` --- 为 :keyword:`!with`\\ 语句上下文提供的工具" + +#: ../../library/contextlib.rst:7 +msgid "**Source code:** :source:`Lib/contextlib.py`" +msgstr "**源代码** :source:`Lib/contextlib.py`" + +#: ../../library/contextlib.rst:11 +msgid "" +"This module provides utilities for common tasks involving the " +":keyword:`with` statement. For more information see also " +":ref:`typecontextmanager` and :ref:`context-managers`." +msgstr "" +"此模块为涉及 :keyword:`with` 语句的常见任务提供了实用的工具。更多信息请参见 :ref:`typecontextmanager` 和 " +":ref:`context-managers`。" + +#: ../../library/contextlib.rst:17 +msgid "Utilities" +msgstr "工具" + +#: ../../library/contextlib.rst:19 +msgid "Functions and classes provided:" +msgstr "提供的函数和类:" + +#: ../../library/contextlib.rst:23 +msgid "" +"An :term:`abstract base class` for classes that implement " +":meth:`~object.__enter__` and :meth:`~object.__exit__`. A default " +"implementation for :meth:`~object.__enter__` is provided which returns " +"``self`` while :meth:`~object.__exit__` is an abstract method which by " +"default returns ``None``. See also the definition of " +":ref:`typecontextmanager`." +msgstr "" + +#: ../../library/contextlib.rst:34 +msgid "" +"An :term:`abstract base class` for classes that implement " +":meth:`~object.__aenter__` and :meth:`~object.__aexit__`. A default " +"implementation for :meth:`~object.__aenter__` is provided which returns " +"``self`` while :meth:`~object.__aexit__` is an abstract method which by " +"default returns ``None``. See also the definition of :ref:`async-context-" +"managers`." +msgstr "" + +#: ../../library/contextlib.rst:46 +msgid "" +"This function is a :term:`decorator` that can be used to define a factory " +"function for :keyword:`with` statement context managers, without needing to " +"create a class or separate :meth:`~object.__enter__` and " +":meth:`~object.__exit__` methods." +msgstr "" +"此函数是一个 :term:`decorator`,它可被用来定义一个支持 :keyword:`with` " +"语句上下文管理器的工厂函数,而无需创建一个类或单独的 :meth:`~object.__enter__` 和 " +":meth:`~object.__exit__` 方法。" + +#: ../../library/contextlib.rst:50 +msgid "" +"While many objects natively support use in with statements, sometimes a " +"resource needs to be managed that isn't a context manager in its own right, " +"and doesn't implement a ``close()`` method for use with " +"``contextlib.closing``." +msgstr "" +"尽管许多对象都原生支持在 with 语句中使用,但有时需要被管理的资源本身并不是上下文管理器,并且没有实现 ``close()`` 方法以配合 " +"``contextlib.closing`` 使用。" + +#: ../../library/contextlib.rst:54 +msgid "" +"An abstract example would be the following to ensure correct resource " +"management::" +msgstr "下面是一个抽象的示例,展示如何确保正确的资源管理::" + +#: ../../library/contextlib.rst:57 +msgid "" +"from contextlib import contextmanager\n" +"\n" +"@contextmanager\n" +"def managed_resource(*args, **kwds):\n" +" # Code to acquire resource, e.g.:\n" +" resource = acquire_resource(*args, **kwds)\n" +" try:\n" +" yield resource\n" +" finally:\n" +" # Code to release resource, e.g.:\n" +" release_resource(resource)" +msgstr "" +"from contextlib import contextmanager\n" +"\n" +"@contextmanager\n" +"def managed_resource(*args, **kwds):\n" +" # 获取资源的代码,例如:\n" +" resource = acquire_resource(*args, **kwds)\n" +" try:\n" +" yield resource\n" +" finally:\n" +" # 释放资源的代码,例如:\n" +" release_resource(resource)" + +#: ../../library/contextlib.rst:69 +msgid "The function can then be used like this::" +msgstr "随后可以这样使用此函数::" + +#: ../../library/contextlib.rst:71 +msgid "" +">>> with managed_resource(timeout=3600) as resource:\n" +"... # Resource is released at the end of this block,\n" +"... # even if code in the block raises an exception" +msgstr "" +">>> with managed_resource(timeout=3600) as resource:\n" +"... # 资源将在此代码块的末尾被释放,\n" +"... # 即使代码块中的代码引发了异常" + +#: ../../library/contextlib.rst:75 +msgid "" +"The function being decorated must return a :term:`generator`-iterator when " +"called. This iterator must yield exactly one value, which will be bound to " +"the targets in the :keyword:`with` statement's :keyword:`!as` clause, if " +"any." +msgstr "" +"被装饰的函数在被调用时,必须返回一个 :term:`generator` 迭代器。 这个迭代器必须只 yield 一个值出来,这个值会被用在 " +":keyword:`with` 语句中,绑定到 :keyword:`!as` 后面的变量,如果给定了的话。" + +#: ../../library/contextlib.rst:79 +msgid "" +"At the point where the generator yields, the block nested in the " +":keyword:`with` statement is executed. The generator is then resumed after " +"the block is exited. If an unhandled exception occurs in the block, it is " +"reraised inside the generator at the point where the yield occurred. Thus, " +"you can use a :keyword:`try`...\\ :keyword:`except`...\\ :keyword:`finally` " +"statement to trap the error (if any), or ensure that some cleanup takes " +"place. If an exception is trapped merely in order to log it or to perform " +"some action (rather than to suppress it entirely), the generator must " +"reraise that exception. Otherwise the generator context manager will " +"indicate to the :keyword:`!with` statement that the exception has been " +"handled, and execution will resume with the statement immediately following " +"the :keyword:`!with` statement." +msgstr "" +"当生成器发生 yield 时,嵌套在 :keyword:`with` 语句中的语句体会被执行。 语句体执行完毕离开之后,该生成器将被恢复执行。 " +"如果在该语句体中发生了未处理的异常,则该异常会在生成器发生 yield 时重新被引发。 因此,你可以使用 :keyword:`try`...\\ " +":keyword:`except`...\\ :keyword:`finally` 语句来捕获该异常(如果有的话),或确保进行了一些清理。 " +"如果仅出于记录日志或执行某些操作(而非完全抑制异常)的目的捕获了异常,生成器必须重新引发该异常。 否则生成器的上下文管理器将向 " +":keyword:`!with` 语句指示该异常已经被处理,程序将立即在 :keyword:`!with` 语句之后恢复并继续执行。" + +#: ../../library/contextlib.rst:91 +msgid "" +":func:`contextmanager` uses :class:`ContextDecorator` so the context " +"managers it creates can be used as decorators as well as in :keyword:`with` " +"statements. When used as a decorator, a new generator instance is implicitly" +" created on each function call (this allows the otherwise \"one-shot\" " +"context managers created by :func:`contextmanager` to meet the requirement " +"that context managers support multiple invocations in order to be used as " +"decorators)." +msgstr "" +":func:`contextmanager` 使用 :class:`ContextDecorator` 因此它创建的上下文管理器不仅可以用在 " +":keyword:`with` 语句中,还可以用作一个装饰器。当它用作一个装饰器时,每一次函数调用时都会隐式创建一个新的生成器实例(这使得 " +":func:`contextmanager` 创建的上下文管理器满足了支持多次调用以用作装饰器的需求,而非“一次性”的上下文管理器)。" + +#: ../../library/contextlib.rst:98 +msgid "Use of :class:`ContextDecorator`." +msgstr ":class:`ContextDecorator` 的使用。" + +#: ../../library/contextlib.rst:104 +msgid "" +"Similar to :func:`~contextlib.contextmanager`, but creates an " +":ref:`asynchronous context manager `." +msgstr "" +"与 :func:`~contextlib.contextmanager` 类似,但创建的是 :ref:`asynchronous context " +"manager ` 。" + +#: ../../library/contextlib.rst:107 +msgid "" +"This function is a :term:`decorator` that can be used to define a factory " +"function for :keyword:`async with` statement asynchronous context managers, " +"without needing to create a class or separate :meth:`~object.__aenter__` and" +" :meth:`~object.__aexit__` methods. It must be applied to an " +":term:`asynchronous generator` function." +msgstr "" +"该函数是一个 :term:`decorator`,它可被用来定义一个使用 :keyword:`async with` " +"语句的异步上下文管理器的工厂函数,而不需要创建一个类或单独的 :meth:`~object.__aenter__` 和 " +":meth:`~object.__aexit__` 方法。 它必须应用在 :term:`asynchronous generator` 函数上。" + +#: ../../library/contextlib.rst:113 +msgid "A simple example::" +msgstr "一个简单的示例::" + +#: ../../library/contextlib.rst:115 +msgid "" +"from contextlib import asynccontextmanager\n" +"\n" +"@asynccontextmanager\n" +"async def get_connection():\n" +" conn = await acquire_db_connection()\n" +" try:\n" +" yield conn\n" +" finally:\n" +" await release_db_connection(conn)\n" +"\n" +"async def get_all_users():\n" +" async with get_connection() as conn:\n" +" return conn.query('SELECT ...')" +msgstr "" +"from contextlib import asynccontextmanager\n" +"\n" +"@asynccontextmanager\n" +"async def get_connection():\n" +" conn = await acquire_db_connection()\n" +" try:\n" +" yield conn\n" +" finally:\n" +" await release_db_connection(conn)\n" +"\n" +"async def get_all_users():\n" +" async with get_connection() as conn:\n" +" return conn.query('SELECT ...')" + +#: ../../library/contextlib.rst:131 +msgid "" +"Context managers defined with :func:`asynccontextmanager` can be used either" +" as decorators or with :keyword:`async with` statements::" +msgstr "" +"使用 :func:`asynccontextmanager` 定义的上下文管理器可以用作装饰器,也可以在 :keyword:`async with` " +"语句中使用::" + +#: ../../library/contextlib.rst:134 +msgid "" +"import time\n" +"from contextlib import asynccontextmanager\n" +"\n" +"@asynccontextmanager\n" +"async def timeit():\n" +" now = time.monotonic()\n" +" try:\n" +" yield\n" +" finally:\n" +" print(f'it took {time.monotonic() - now}s to run')\n" +"\n" +"@timeit()\n" +"async def main():\n" +" # ... async code ..." +msgstr "" +"import time\n" +"from contextlib import asynccontextmanager\n" +"\n" +"@asynccontextmanager\n" +"async def timeit():\n" +" now = time.monotonic()\n" +" try:\n" +" yield\n" +" finally:\n" +" print(f'it took {time.monotonic() - now}s to run')\n" +"\n" +"@timeit()\n" +"async def main():\n" +" # ... 异步代码 ..." + +#: ../../library/contextlib.rst:149 +msgid "" +"When used as a decorator, a new generator instance is implicitly created on " +"each function call. This allows the otherwise \"one-shot\" context managers " +"created by :func:`asynccontextmanager` to meet the requirement that context " +"managers support multiple invocations in order to be used as decorators." +msgstr "" +"用作装饰器时,每次函数调用都会隐式创建一个新的生成器实例。这使得由 :func:`asynccontextmanager` 创建的 “一次性” " +"上下文管理器能够满足作为装饰器所需要的支持多次调用的要求。" + +#: ../../library/contextlib.rst:154 +msgid "" +"Async context managers created with :func:`asynccontextmanager` can be used " +"as decorators." +msgstr "使用 :func:`asynccontextmanager` 创建的异步上下文管理器可以用作装饰器。" + +#: ../../library/contextlib.rst:161 +msgid "" +"Return a context manager that closes *thing* upon completion of the block. " +"This is basically equivalent to::" +msgstr "返回一个在语句块执行完成时关闭 *thing* 的上下文管理器。这基本上等价于::" + +#: ../../library/contextlib.rst:164 +msgid "" +"from contextlib import contextmanager\n" +"\n" +"@contextmanager\n" +"def closing(thing):\n" +" try:\n" +" yield thing\n" +" finally:\n" +" thing.close()" +msgstr "" +"from contextlib import contextmanager\n" +"\n" +"@contextmanager\n" +"def closing(thing):\n" +" try:\n" +" yield thing\n" +" finally:\n" +" thing.close()" + +#: ../../library/contextlib.rst:173 +msgid "And lets you write code like this::" +msgstr "并允许你编写这样的代码::" + +#: ../../library/contextlib.rst:175 +msgid "" +"from contextlib import closing\n" +"from urllib.request import urlopen\n" +"\n" +"with closing(urlopen('https://www.python.org')) as page:\n" +" for line in page:\n" +" print(line)" +msgstr "" +"from contextlib import closing\n" +"from urllib.request import urlopen\n" +"\n" +"with closing(urlopen('https://www.python.org')) as page:\n" +" for line in page:\n" +" print(line)" + +#: ../../library/contextlib.rst:182 +msgid "" +"without needing to explicitly close ``page``. Even if an error occurs, " +"``page.close()`` will be called when the :keyword:`with` block is exited." +msgstr "" +"而无需显式地关闭 ``page`` 。 即使发生错误,在退出 :keyword:`with` 语句块时, ``page.close()`` " +"也同样会被调用。" + +#: ../../library/contextlib.rst:187 +msgid "" +"Most types managing resources support the :term:`context manager` protocol, " +"which closes *thing* on leaving the :keyword:`with` statement. As such, " +":func:`!closing` is most useful for third party types that don't support " +"context managers. This example is purely for illustration purposes, as " +":func:`~urllib.request.urlopen` would normally be used in a context manager." +msgstr "" +"大多数管理资源的类型都支持 :term:`context manager` 协议,它在离开 :keyword:`with` 语句时将关闭 " +"*thing*。 因此,:func:`!closing` 对不支持上下文管理器的第三方类型是最有用的。 这个例子纯粹是为了说明问题,因为 " +":func:`~urllib.request.urlopen` 通常都会在上下文管理器中使用。" + +#: ../../library/contextlib.rst:196 +msgid "" +"Return an async context manager that calls the ``aclose()`` method of " +"*thing* upon completion of the block. This is basically equivalent to::" +msgstr "返回一个在语句块执行完成时调用 ``aclose()`` 方法来关闭 *thing* 的异步上下文管理器。这基本上等价于::" + +#: ../../library/contextlib.rst:199 +msgid "" +"from contextlib import asynccontextmanager\n" +"\n" +"@asynccontextmanager\n" +"async def aclosing(thing):\n" +" try:\n" +" yield thing\n" +" finally:\n" +" await thing.aclose()" +msgstr "" +"from contextlib import asynccontextmanager\n" +"\n" +"@asynccontextmanager\n" +"async def aclosing(thing):\n" +" try:\n" +" yield thing\n" +" finally:\n" +" await thing.aclose()" + +#: ../../library/contextlib.rst:208 +msgid "" +"Significantly, ``aclosing()`` supports deterministic cleanup of async " +"generators when they happen to exit early by :keyword:`break` or an " +"exception. For example::" +msgstr "" +"重要的是,``aclosing()`` 支持在异步生成器因遭遇 :keyword:`break` 或异常而提前退出时对其执行确定性的清理。 例如::" + +#: ../../library/contextlib.rst:212 +msgid "" +"from contextlib import aclosing\n" +"\n" +"async with aclosing(my_generator()) as values:\n" +" async for value in values:\n" +" if value == 42:\n" +" break" +msgstr "" +"from contextlib import aclosing\n" +"\n" +"async with aclosing(my_generator()) as values:\n" +" async for value in values:\n" +" if value == 42:\n" +" break" + +#: ../../library/contextlib.rst:219 +msgid "" +"This pattern ensures that the generator's async exit code is executed in the" +" same context as its iterations (so that exceptions and context variables " +"work as expected, and the exit code isn't run after the lifetime of some " +"task it depends on)." +msgstr "" +"此模式将确保生成器的异步退出代码在与其迭代相同的上下文中执行(这样异常和上下文变量将能按预期工作,并且退出代码不会在其所依赖的某些任务的生命期结束后继续运行)。" + +#: ../../library/contextlib.rst:231 +msgid "" +"Return a context manager that returns *enter_result* from " +":meth:`~object.__enter__`, but otherwise does nothing. It is intended to be " +"used as a stand-in for an optional context manager, for example::" +msgstr "" + +#: ../../library/contextlib.rst:235 +msgid "" +"def myfunction(arg, ignore_exceptions=False):\n" +" if ignore_exceptions:\n" +" # Use suppress to ignore all exceptions.\n" +" cm = contextlib.suppress(Exception)\n" +" else:\n" +" # Do not ignore any exceptions, cm has no effect.\n" +" cm = contextlib.nullcontext()\n" +" with cm:\n" +" # Do something" +msgstr "" +"def myfunction(arg, ignore_exceptions=False):\n" +" if ignore_exceptions:\n" +" # 使用 suppress 来忽略所有异常。\n" +" cm = contextlib.suppress(Exception)\n" +" else:\n" +" # 不忽略任何异常,cm 将没有影响。\n" +" cm = contextlib.nullcontext()\n" +" with cm:\n" +" # 执行某些操作" + +#: ../../library/contextlib.rst:245 +msgid "An example using *enter_result*::" +msgstr "一个使用 *enter_result* 的例子::" + +#: ../../library/contextlib.rst:247 +msgid "" +"def process_file(file_or_path):\n" +" if isinstance(file_or_path, str):\n" +" # If string, open file\n" +" cm = open(file_or_path)\n" +" else:\n" +" # Caller is responsible for closing file\n" +" cm = nullcontext(file_or_path)\n" +"\n" +" with cm as file:\n" +" # Perform processing on the file" +msgstr "" +"def process_file(file_or_path):\n" +" if isinstance(file_or_path, str):\n" +" # 如果是字符串,打开文件\n" +" cm = open(file_or_path)\n" +" else:\n" +" # 调用方要负责关闭文件\n" +" cm = nullcontext(file_or_path)\n" +"\n" +" with cm as file:\n" +" # 在文件上执行处理" + +#: ../../library/contextlib.rst:258 +msgid "" +"It can also be used as a stand-in for :ref:`asynchronous context managers " +"`::" +msgstr "" +"它也可以替代 :ref:`asynchronous context managers ` ::" + +#: ../../library/contextlib.rst:261 +msgid "" +"async def send_http(session=None):\n" +" if not session:\n" +" # If no http session, create it with aiohttp\n" +" cm = aiohttp.ClientSession()\n" +" else:\n" +" # Caller is responsible for closing the session\n" +" cm = nullcontext(session)\n" +"\n" +" async with cm as session:\n" +" # Send http requests with session" +msgstr "" +"async def send_http(session=None):\n" +" if not session:\n" +" # 如果没有 http 会话,则使用 aiohttp 创建它\n" +" cm = aiohttp.ClientSession()\n" +" else:\n" +" # 调用方要负责关闭会话\n" +" cm = nullcontext(session)\n" +"\n" +" async with cm as session:\n" +" # 使用会话发送 http 请求" + +#: ../../library/contextlib.rst:274 +msgid ":term:`asynchronous context manager` support was added." +msgstr "增加了对 :term:`asynchronous context manager` 的支持。" + +#: ../../library/contextlib.rst:281 +msgid "" +"Return a context manager that suppresses any of the specified exceptions if " +"they occur in the body of a :keyword:`!with` statement and then resumes " +"execution with the first statement following the end of the :keyword:`!with`" +" statement." +msgstr "" +"返回一个当指定的异常在 :keyword:`!with` 语句体中发生时会屏蔽它们然后从 :keyword:`!with` " +"语句结束后的第一条语句开始恢复执行的上下文管理器。" + +#: ../../library/contextlib.rst:286 +msgid "" +"As with any other mechanism that completely suppresses exceptions, this " +"context manager should be used only to cover very specific errors where " +"silently continuing with program execution is known to be the right thing to" +" do." +msgstr "与完全抑制异常的任何其他机制一样,该上下文管理器应当只用来抑制非常具体的错误,并确保该场景下静默地继续执行程序是通用的正确做法。" + +#: ../../library/contextlib.rst:291 +msgid "For example::" +msgstr "例如::" + +#: ../../library/contextlib.rst:293 +msgid "" +"from contextlib import suppress\n" +"\n" +"with suppress(FileNotFoundError):\n" +" os.remove('somefile.tmp')\n" +"\n" +"with suppress(FileNotFoundError):\n" +" os.remove('someotherfile.tmp')" +msgstr "" +"from contextlib import suppress\n" +"\n" +"with suppress(FileNotFoundError):\n" +" os.remove('somefile.tmp')\n" +"\n" +"with suppress(FileNotFoundError):\n" +" os.remove('someotherfile.tmp')" + +#: ../../library/contextlib.rst:301 +msgid "This code is equivalent to::" +msgstr "这段代码等价于::" + +#: ../../library/contextlib.rst:303 +msgid "" +"try:\n" +" os.remove('somefile.tmp')\n" +"except FileNotFoundError:\n" +" pass\n" +"\n" +"try:\n" +" os.remove('someotherfile.tmp')\n" +"except FileNotFoundError:\n" +" pass" +msgstr "" +"try:\n" +" os.remove('somefile.tmp')\n" +"except FileNotFoundError:\n" +" pass\n" +"\n" +"try:\n" +" os.remove('someotherfile.tmp')\n" +"except FileNotFoundError:\n" +" pass" + +#: ../../library/contextlib.rst:313 ../../library/contextlib.rst:362 +#: ../../library/contextlib.rst:372 ../../library/contextlib.rst:389 +msgid "This context manager is :ref:`reentrant `." +msgstr "该上下文管理器是 :ref:`reentrant ` 。" + +#: ../../library/contextlib.rst:315 +msgid "" +"If the code within the :keyword:`!with` block raises a " +":exc:`BaseExceptionGroup`, suppressed exceptions are removed from the group." +" Any exceptions of the group which are not suppressed are re-raised in a " +"new group which is created using the original group's " +":meth:`~BaseExceptionGroup.derive` method." +msgstr "" +"如果 :keyword:`!with` 语句块内的代码引发了 :exc:`BaseExceptionGroup`,将从分组中移除被抑制的异常。 " +"该分组中任何未被抑制的异常会在一个使用原分组的 :meth:`~BaseExceptionGroup.derive` 方法创建的新分组中被重新引发。" + +#: ../../library/contextlib.rst:323 +msgid "" +"``suppress`` now supports suppressing exceptions raised as part of a " +":exc:`BaseExceptionGroup`." +msgstr "``suppress`` 现在支持抑制作为 :exc:`BaseExceptionGroup` 的组成部分被引发的异常。" + +#: ../../library/contextlib.rst:329 +msgid "" +"Context manager for temporarily redirecting :data:`sys.stdout` to another " +":term:`file object`." +msgstr "" + +#: ../../library/contextlib.rst:332 +msgid "" +"This tool adds flexibility to existing functions or classes whose output is " +"hardwired to :data:`sys.stdout`." +msgstr "" + +#: ../../library/contextlib.rst:335 +msgid "" +"For example, the output of :func:`help` normally is sent to *sys.stdout*. " +"You can capture that output in a string by redirecting the output to an " +":class:`io.StringIO` object. The replacement stream is returned from the " +":meth:`~object.__enter__` method and so is available as the target of the " +":keyword:`with` statement::" +msgstr "" + +#: ../../library/contextlib.rst:341 +msgid "" +"with redirect_stdout(io.StringIO()) as f:\n" +" help(pow)\n" +"s = f.getvalue()" +msgstr "" +"with redirect_stdout(io.StringIO()) as f:\n" +" help(pow)\n" +"s = f.getvalue()" + +#: ../../library/contextlib.rst:345 +msgid "" +"To send the output of :func:`help` to a file on disk, redirect the output to" +" a regular file::" +msgstr "如果要把 :func:`help` 的输出写到磁盘上的一个文件,重定向该输出到一个常规文件::" + +#: ../../library/contextlib.rst:348 +msgid "" +"with open('help.txt', 'w') as f:\n" +" with redirect_stdout(f):\n" +" help(pow)" +msgstr "" +"with open('help.txt', 'w') as f:\n" +" with redirect_stdout(f):\n" +" help(pow)" + +#: ../../library/contextlib.rst:352 +msgid "To send the output of :func:`help` to *sys.stderr*::" +msgstr "如果要把 :func:`help` 的输出写到 *sys.stderr* ::" + +#: ../../library/contextlib.rst:354 +msgid "" +"with redirect_stdout(sys.stderr):\n" +" help(pow)" +msgstr "" +"with redirect_stdout(sys.stderr):\n" +" help(pow)" + +#: ../../library/contextlib.rst:357 +msgid "" +"Note that the global side effect on :data:`sys.stdout` means that this " +"context manager is not suitable for use in library code and most threaded " +"applications. It also has no effect on the output of subprocesses. However, " +"it is still a useful approach for many utility scripts." +msgstr "" +"需要注意的点在于, :data:`sys.stdout` " +"的全局副作用意味着此上下文管理器不适合在库代码和大多数多线程应用程序中使用。它对子进程的输出没有影响。不过对于许多工具脚本而言,它仍然是一个有用的方法。" + +#: ../../library/contextlib.rst:369 +msgid "" +"Similar to :func:`~contextlib.redirect_stdout` but redirecting the global " +":data:`sys.stderr` to another :term:`file object`." +msgstr "" + +#: ../../library/contextlib.rst:379 +msgid "" +"Non parallel-safe context manager to change the current working directory. " +"As this changes a global state, the working directory, it is not suitable " +"for use in most threaded or async contexts. It is also not suitable for most" +" non-linear code execution, like generators, where the program execution is " +"temporarily relinquished -- unless explicitly desired, you should not yield " +"when this context manager is active." +msgstr "" +"用于改变当前工作目录的非并行安全的上下文管理器。 由于这会改变一个全局状态,即工作目录,因此它不适合在大多数线程或异步上下文中使用。 " +"它也不适合大多数非线性的代码执行,比如生成器,在此类代码中程序的执行会被临时性挂起 -- 除非明确希望如此,当该上下文管理器被激活时你不应执行 " +"yield 语句。" + +#: ../../library/contextlib.rst:386 +msgid "" +"This is a simple wrapper around :func:`~os.chdir`, it changes the current " +"working directory upon entering and restores the old one on exit." +msgstr "这是一个对 :func:`~os.chdir` 的简单包装器,它会在进入时改变当前工作目录并在退出时恢复。" + +#: ../../library/contextlib.rst:396 +msgid "" +"A base class that enables a context manager to also be used as a decorator." +msgstr "一个使上下文管理器能用作装饰器的基类。" + +#: ../../library/contextlib.rst:398 +msgid "" +"Context managers inheriting from ``ContextDecorator`` have to implement " +":meth:`~object.__enter__` and :meth:`~object.__exit__` as normal. " +"``__exit__`` retains its optional exception handling even when used as a " +"decorator." +msgstr "" + +#: ../../library/contextlib.rst:403 +msgid "" +"``ContextDecorator`` is used by :func:`contextmanager`, so you get this " +"functionality automatically." +msgstr "``ContextDecorator`` 被用在 :func:`contextmanager` 中,因此你自然获得了这项功能。" + +#: ../../library/contextlib.rst:406 +msgid "Example of ``ContextDecorator``::" +msgstr "``ContextDecorator`` 的示例::" + +#: ../../library/contextlib.rst:408 +msgid "" +"from contextlib import ContextDecorator\n" +"\n" +"class mycontext(ContextDecorator):\n" +" def __enter__(self):\n" +" print('Starting')\n" +" return self\n" +"\n" +" def __exit__(self, *exc):\n" +" print('Finishing')\n" +" return False" +msgstr "" +"from contextlib import ContextDecorator\n" +"\n" +"class mycontext(ContextDecorator):\n" +" def __enter__(self):\n" +" print('Starting')\n" +" return self\n" +"\n" +" def __exit__(self, *exc):\n" +" print('Finishing')\n" +" return False" + +#: ../../library/contextlib.rst:419 ../../library/contextlib.rst:519 +msgid "The class can then be used like this::" +msgstr "随后可以这样使用该类::" + +#: ../../library/contextlib.rst:421 +msgid "" +">>> @mycontext()\n" +"... def function():\n" +"... print('The bit in the middle')\n" +"...\n" +">>> function()\n" +"Starting\n" +"The bit in the middle\n" +"Finishing\n" +"\n" +">>> with mycontext():\n" +"... print('The bit in the middle')\n" +"...\n" +"Starting\n" +"The bit in the middle\n" +"Finishing" +msgstr "" +">>> @mycontext()\n" +"... def function():\n" +"... print('The bit in the middle')\n" +"...\n" +">>> function()\n" +"Starting\n" +"The bit in the middle\n" +"Finishing\n" +"\n" +">>> with mycontext():\n" +"... print('The bit in the middle')\n" +"...\n" +"Starting\n" +"The bit in the middle\n" +"Finishing" + +#: ../../library/contextlib.rst:437 +msgid "" +"This change is just syntactic sugar for any construct of the following " +"form::" +msgstr "这个改动只是针对如下形式的一个语法糖::" + +#: ../../library/contextlib.rst:439 +msgid "" +"def f():\n" +" with cm():\n" +" # Do stuff" +msgstr "" +"def f():\n" +" with cm():\n" +" # 执行操作" + +#: ../../library/contextlib.rst:443 +msgid "``ContextDecorator`` lets you instead write::" +msgstr "``ContextDecorator`` 使得你可以这样改写::" + +#: ../../library/contextlib.rst:445 +msgid "" +"@cm()\n" +"def f():\n" +" # Do stuff" +msgstr "" +"@cm()\n" +"def f():\n" +" # 执行操作" + +#: ../../library/contextlib.rst:449 +msgid "" +"It makes it clear that the ``cm`` applies to the whole function, rather than" +" just a piece of it (and saving an indentation level is nice, too)." +msgstr "这能清楚地表明, ``cm`` 作用于整个函数,而不仅仅是函数的一部分(同时也能保持不错的缩进层级)。" + +#: ../../library/contextlib.rst:452 +msgid "" +"Existing context managers that already have a base class can be extended by " +"using ``ContextDecorator`` as a mixin class::" +msgstr "现有的上下文管理器即使已经有基类,也可以使用 ``ContextDecorator`` 作为混合类进行扩展::" + +#: ../../library/contextlib.rst:455 +msgid "" +"from contextlib import ContextDecorator\n" +"\n" +"class mycontext(ContextBaseClass, ContextDecorator):\n" +" def __enter__(self):\n" +" return self\n" +"\n" +" def __exit__(self, *exc):\n" +" return False" +msgstr "" +"from contextlib import ContextDecorator\n" +"\n" +"class mycontext(ContextBaseClass, ContextDecorator):\n" +" def __enter__(self):\n" +" return self\n" +"\n" +" def __exit__(self, *exc):\n" +" return False" + +#: ../../library/contextlib.rst:465 +msgid "" +"As the decorated function must be able to be called multiple times, the " +"underlying context manager must support use in multiple :keyword:`with` " +"statements. If this is not the case, then the original construct with the " +"explicit :keyword:`!with` statement inside the function should be used." +msgstr "" +"由于被装饰的函数必须能够被多次调用,因此对应的上下文管理器必须支持在多个 :keyword:`with` " +"语句中使用。如果不是这样,则应当使用原来的具有显式 :keyword:`!with` 语句的形式使用该上下文管理器。" + +#: ../../library/contextlib.rst:470 +msgid "" +"When the decorated callable is a generator function, coroutine function, or " +"asynchronous generator function, the returned wrapper is of the same kind " +"and keeps the context manager open for the lifetime of the iteration or " +"await rather than only for the call that creates the generator or coroutine " +"object. Wrapped generators and asynchronous generators are explicitly " +"closed when iteration ends, as if by :func:`closing` or :func:`aclosing`." +msgstr "" + +#: ../../library/contextlib.rst:478 +msgid "" +"For asynchronous generators the wrapper re-yields each value with ``async " +"for``; values sent with :meth:`~agen.asend` and exceptions thrown with " +":meth:`~agen.athrow` are not forwarded to the wrapped generator." +msgstr "" + +#: ../../library/contextlib.rst:485 +msgid "" +"Decorating a generator function, coroutine function, or asynchronous " +"generator function now keeps the context manager open across iteration or " +"await. Previously the context manager exited as soon as the generator or " +"coroutine object was created." +msgstr "" + +#: ../../library/contextlib.rst:494 +msgid "" +"Similar to :class:`ContextDecorator`, but the context manager is entered and" +" exited with :keyword:`async with`. Decorate coroutine functions and " +"asynchronous generator functions with this class; the returned wrapper is of" +" the same kind." +msgstr "" + +#: ../../library/contextlib.rst:500 +msgid "" +"Synchronous functions and generators are accepted, but the wrapper is always" +" asynchronous, so the decorated callable must then be awaited or iterated " +"with ``async for``. If that change of calling convention is not intended, " +"use :class:`ContextDecorator` instead." +msgstr "" + +#: ../../library/contextlib.rst:505 +msgid "Example of ``AsyncContextDecorator``::" +msgstr "``AsyncContextDecorator`` 的示例::" + +#: ../../library/contextlib.rst:507 +msgid "" +"from asyncio import run\n" +"from contextlib import AsyncContextDecorator\n" +"\n" +"class mycontext(AsyncContextDecorator):\n" +" async def __aenter__(self):\n" +" print('Starting')\n" +" return self\n" +"\n" +" async def __aexit__(self, *exc):\n" +" print('Finishing')\n" +" return False" +msgstr "" +"from asyncio import run\n" +"from contextlib import AsyncContextDecorator\n" +"\n" +"class mycontext(AsyncContextDecorator):\n" +" async def __aenter__(self):\n" +" print('Starting')\n" +" return self\n" +"\n" +" async def __aexit__(self, *exc):\n" +" print('Finishing')\n" +" return False" + +#: ../../library/contextlib.rst:521 +msgid "" +">>> @mycontext()\n" +"... async def function():\n" +"... print('The bit in the middle')\n" +"...\n" +">>> run(function())\n" +"Starting\n" +"The bit in the middle\n" +"Finishing\n" +"\n" +">>> async def function():\n" +"... async with mycontext():\n" +"... print('The bit in the middle')\n" +"...\n" +">>> run(function())\n" +"Starting\n" +"The bit in the middle\n" +"Finishing" +msgstr "" +">>> @mycontext()\n" +"... async def function():\n" +"... print('The bit in the middle')\n" +"...\n" +">>> run(function())\n" +"Starting\n" +"The bit in the middle\n" +"Finishing\n" +"\n" +">>> async def function():\n" +"... async with mycontext():\n" +"... print('The bit in the middle')\n" +"...\n" +">>> run(function())\n" +"Starting\n" +"The bit in the middle\n" +"Finishing" + +#: ../../library/contextlib.rst:541 +msgid "" +"Decorating an asynchronous generator function now keeps the context manager " +"open across iteration. Previously the context manager exited as soon as the" +" generator object was created. Synchronous functions and synchronous " +"generator functions are also now accepted, with an asynchronous wrapper " +"returned." +msgstr "" + +#: ../../library/contextlib.rst:551 +msgid "" +"A context manager that is designed to make it easy to programmatically " +"combine other context managers and cleanup functions, especially those that " +"are optional or otherwise driven by input data." +msgstr "该上下文管理器的设计目标是使得在编码中组合其他上下文管理器和清理函数更加容易,尤其是那些可选的或由输入数据驱动的上下文管理器。" + +#: ../../library/contextlib.rst:555 +msgid "" +"For example, a set of files may easily be handled in a single with statement" +" as follows::" +msgstr "例如,通过一个如下的 with 语句可以很容易处理一组文件::" + +#: ../../library/contextlib.rst:558 +msgid "" +"with ExitStack() as stack:\n" +" files = [stack.enter_context(open(fname)) for fname in filenames]\n" +" # All opened files will automatically be closed at the end of\n" +" # the with statement, even if attempts to open files later\n" +" # in the list raise an exception" +msgstr "" +"with ExitStack() as stack:\n" +" files = [stack.enter_context(open(fname)) for fname in filenames]\n" +" # 所有已打开的文件都将在 with 语句结束时\n" +" # 自动被关闭,即使此后打开列表中文件的\n" +" # 尝试引发了异常" + +#: ../../library/contextlib.rst:564 +msgid "" +"The :meth:`~object.__enter__` method returns the :class:`ExitStack` " +"instance, and performs no additional operations." +msgstr ":meth:`~object.__enter__` 方法返回 :class:`ExitStack` 的实例,并且不会执行额外的操作。" + +#: ../../library/contextlib.rst:567 +msgid "" +"Each instance maintains a stack of registered callbacks that are called in " +"reverse order when the instance is closed (either explicitly or implicitly " +"at the end of a :keyword:`with` statement). Note that callbacks are *not* " +"invoked implicitly when the context stack instance is garbage collected." +msgstr "" +"每个实例维护一个注册了一组回调的栈,这些回调在实例关闭时以相反的顺序被调用(显式或隐式地在 :keyword:`with` " +"语句的末尾)。请注意,当一个栈实例被垃圾回收时,这些回调将 *不会* 被隐式调用。" + +#: ../../library/contextlib.rst:572 +msgid "" +"This stack model is used so that context managers that acquire their " +"resources in their ``__init__`` method (such as file objects) can be handled" +" correctly." +msgstr "通过使用这个基于栈的模型,那些通过 ``__init__`` 方法获取资源的上下文管理器(如文件对象)能够被正确处理。" + +#: ../../library/contextlib.rst:576 +msgid "" +"Since registered callbacks are invoked in the reverse order of registration," +" this ends up behaving as if multiple nested :keyword:`with` statements had " +"been used with the registered set of callbacks. This even extends to " +"exception handling - if an inner callback suppresses or replaces an " +"exception, then outer callbacks will be passed arguments based on that " +"updated state." +msgstr "" +"由于注册的回调函数是按照与注册相反的顺序调用的,因此最终的行为就像多个嵌套的 :keyword:`with` " +"语句用在这些注册的回调函数上。这个行为甚至扩展到了异常处理:如果内部的回调函数抑制或替换了异常,则外部回调收到的参数是基于该更新后的状态得到的。" + +#: ../../library/contextlib.rst:583 +msgid "" +"This is a relatively low level API that takes care of the details of " +"correctly unwinding the stack of exit callbacks. It provides a suitable " +"foundation for higher level context managers that manipulate the exit stack " +"in application specific ways." +msgstr "" +"这是一个相对底层的 " +"API,它负责正确处理栈里回调退出时依次展开的细节。它为相对高层的上下文管理器提供了一个合适的基础,使得它能根据应用程序的需求使用特定方式操作栈。" + +#: ../../library/contextlib.rst:592 +msgid "" +"Enters a new context manager and adds its :meth:`~object.__exit__` method to" +" the callback stack. The return value is the result of the context manager's" +" own :meth:`~object.__enter__` method." +msgstr "" +"进入一个新的上下文管理器并将其 :meth:`~object.__exit__` 方法添加到回调栈中。 返回值是该上下文管理器自己的 " +":meth:`~object.__enter__` 方法的输出结果。" + +#: ../../library/contextlib.rst:596 +msgid "" +"These context managers may suppress exceptions just as they normally would " +"if used directly as part of a :keyword:`with` statement." +msgstr "这些上下文管理器可能会屏蔽异常就如当它们作为 :keyword:`with` 语句的一部分直接使用时通常表现的行为一样。" + +#: ../../library/contextlib.rst:599 +msgid "" +"Raises :exc:`TypeError` instead of :exc:`AttributeError` if *cm* is not a " +"context manager." +msgstr "如果 *cm* 不是上下文管理器则会引发 :exc:`TypeError` 而不是 :exc:`AttributeError`。" + +#: ../../library/contextlib.rst:603 +msgid "" +"Added support for arbitrary descriptors :meth:`!__enter__` and " +":meth:`!__exit__`." +msgstr "" + +#: ../../library/contextlib.rst:609 +msgid "" +"Adds a context manager's :meth:`~object.__exit__` method to the callback " +"stack." +msgstr "将一个上下文管理器的 :meth:`~object.__exit__` 方法添加到回调栈。" + +#: ../../library/contextlib.rst:611 +msgid "" +"As ``__enter__`` is *not* invoked, this method can be used to cover part of " +"an :meth:`~object.__enter__` implementation with a context manager's own " +":meth:`~object.__exit__` method." +msgstr "" +"由于 ``__enter__`` *没有* 被唤起,此方法可以被用来通过一个上下文管理器自己的 :meth:`~object.__exit__` " +"方法覆盖一部分 :meth:`~object.__enter__` 的实现。" + +#: ../../library/contextlib.rst:615 +msgid "" +"If passed an object that is not a context manager, this method assumes it is" +" a callback with the same signature as a context manager's " +":meth:`~object.__exit__` method and adds it directly to the callback stack." +msgstr "" +"如果传入了一个不是上下文管理器的对象,此方法将假定它是一个具有与上下文管理器的 :meth:`~object.__exit__` " +"方法相同的签名的回调并会直接将其添加到回调栈中。" + +#: ../../library/contextlib.rst:619 +msgid "" +"By returning true values, these callbacks can suppress exceptions the same " +"way context manager :meth:`~object.__exit__` methods can." +msgstr "通过返回真值,这些回调可以通过与上下文管理器的 :meth:`~object.__exit__` 方法相同的方式抑制异常。" + +#: ../../library/contextlib.rst:622 +msgid "" +"The passed in object is returned from the function, allowing this method to " +"be used as a function decorator." +msgstr "传入的对象将被该函数返回,允许此方法作为函数装饰器使用。" + +#: ../../library/contextlib.rst:625 +msgid "Added support for arbitrary descriptors :meth:`!__exit__`." +msgstr "" + +#: ../../library/contextlib.rst:630 +msgid "" +"Accepts an arbitrary callback function and arguments and adds it to the " +"callback stack." +msgstr "接受一个任意的回调函数和参数并将其添加到回调栈。" + +#: ../../library/contextlib.rst:633 +msgid "" +"Unlike the other methods, callbacks added this way cannot suppress " +"exceptions (as they are never passed the exception details)." +msgstr "与其他方法不同,通过此方式添加的回调无法屏蔽异常(因为异常的细节不会被传递给它们)。" + +#: ../../library/contextlib.rst:636 +msgid "" +"The passed in callback is returned from the function, allowing this method " +"to be used as a function decorator." +msgstr "传入的回调将被该函数返回,允许此方法作为函数装饰器使用。" + +#: ../../library/contextlib.rst:641 +msgid "" +"Transfers the callback stack to a fresh :class:`ExitStack` instance and " +"returns it. No callbacks are invoked by this operation - instead, they will " +"now be invoked when the new stack is closed (either explicitly or implicitly" +" at the end of a :keyword:`with` statement)." +msgstr "" +"将回调栈传输到一个新的 :class:`ExitStack` 实例并返回它。 此操作不会唤起任何回调 —— " +"作为替代,现在当新栈被关闭时它们将(显式地或是在一条 :keyword:`with` 语句结束时隐式地)被唤起。" + +#: ../../library/contextlib.rst:646 +msgid "" +"For example, a group of files can be opened as an \"all or nothing\" " +"operation as follows::" +msgstr "例如,一组文件可以像下面这样以“全有或全无”的操作方式被打开::" + +#: ../../library/contextlib.rst:649 +msgid "" +"with ExitStack() as stack:\n" +" files = [stack.enter_context(open(fname)) for fname in filenames]\n" +" # Hold onto the close method, but don't call it yet.\n" +" close_files = stack.pop_all().close\n" +" # If opening any file fails, all previously opened files will be\n" +" # closed automatically. If all files are opened successfully,\n" +" # they will remain open even after the with statement ends.\n" +" # close_files() can then be invoked explicitly to close them all." +msgstr "" +"with ExitStack() as stack:\n" +" files = [stack.enter_context(open(fname)) for fname in filenames]\n" +" # 持有 close 方法,但暂时不调用它。\n" +" close_files = stack.pop_all().close\n" +" # 如果任何文件打开失败,则所有之前打开的文件\n" +" # 将自动被关闭。 如果所有文件都被成功地打开,\n" +" # 即使在 with 语句结束后它们仍将保持打开状态。\n" +" # 随后可以显式唤起 close_files() 来全部关闭它们。" + +#: ../../library/contextlib.rst:660 +msgid "" +"Immediately unwinds the callback stack, invoking callbacks in the reverse " +"order of registration. For any context managers and exit callbacks " +"registered, the arguments passed in will indicate that no exception " +"occurred." +msgstr "立即展开回调栈,按注册时的相反顺序唤起其中的回调。 对于任何已注册的上下文管理器和退出回调,传入的参数将表明没有发生异常。" + +#: ../../library/contextlib.rst:667 +msgid "" +"An :ref:`asynchronous context manager `, similar to " +":class:`ExitStack`, that supports combining both synchronous and " +"asynchronous context managers, as well as having coroutines for cleanup " +"logic." +msgstr "" +"一个 :ref:`异步上下文管理器 `,类似于 " +":class:`ExitStack`,它支持组合同步和异步上下文管理器,并拥有针对清理逻辑的协程。" + +#: ../../library/contextlib.rst:672 +msgid "" +"The :meth:`~ExitStack.close` method is not implemented; :meth:`aclose` must " +"be used instead." +msgstr ":meth:`~ExitStack.close` 方法未实现,必须改用 :meth:`aclose`。" + +#: ../../library/contextlib.rst:678 +msgid "" +"Similar to :meth:`ExitStack.enter_context` but expects an asynchronous " +"context manager." +msgstr "类似于 :meth:`ExitStack.enter_context` 但是需要一个异步上下文管理器。" + +#: ../../library/contextlib.rst:681 +msgid "" +"Raises :exc:`TypeError` instead of :exc:`AttributeError` if *cm* is not an " +"asynchronous context manager." +msgstr "如果 *cm* 不是异步上下文管理器则会引发 :exc:`TypeError` 而不是 :exc:`AttributeError`。" + +#: ../../library/contextlib.rst:685 +msgid "" +"Added support for arbitrary descriptors :meth:`!__aenter__` and " +":meth:`!__aexit__`." +msgstr "" + +#: ../../library/contextlib.rst:690 +msgid "" +"Similar to :meth:`ExitStack.push` but expects either an asynchronous context" +" manager or a coroutine function." +msgstr "类似于 :meth:`ExitStack.push` 但是需要一个异步上下文管理器或协程函数。" + +#: ../../library/contextlib.rst:693 +msgid "Added support for arbitrary descriptors :meth:`!__aexit__`." +msgstr "" + +#: ../../library/contextlib.rst:698 +msgid "" +"Similar to :meth:`ExitStack.callback` but expects a coroutine function." +msgstr "类似于 :meth:`ExitStack.callback` 但是需要一个协程函数。" + +#: ../../library/contextlib.rst:703 +msgid "Similar to :meth:`ExitStack.close` but properly handles awaitables." +msgstr "类似于 :meth:`ExitStack.close` 但是能正确处理可等待对象。" + +#: ../../library/contextlib.rst:705 +msgid "Continuing the example for :func:`asynccontextmanager`::" +msgstr "从 :func:`asynccontextmanager` 的例子继续::" + +#: ../../library/contextlib.rst:707 +msgid "" +"async with AsyncExitStack() as stack:\n" +" connections = [await stack.enter_async_context(get_connection())\n" +" for i in range(5)]\n" +" # All opened connections will automatically be released at the end of\n" +" # the async with statement, even if attempts to open a connection\n" +" # later in the list raise an exception." +msgstr "" +"async with AsyncExitStack() as stack:\n" +" connections = [await stack.enter_async_context(get_connection())\n" +" for i in range(5)]\n" +" # 所有已打开连接都将在 async with 语句结束时\n" +" # 自动被关闭,即使此后打开列表中连接的尝试\n" +" # 引发了异常。" + +#: ../../library/contextlib.rst:717 +msgid "Examples and Recipes" +msgstr "例子和配方" + +#: ../../library/contextlib.rst:719 +msgid "" +"This section describes some examples and recipes for making effective use of" +" the tools provided by :mod:`!contextlib`." +msgstr "本节描述了一些用于有效利用 :mod:`!contextlib` 所提供的工具的示例和步骤说明。" + +#: ../../library/contextlib.rst:724 +msgid "Supporting a variable number of context managers" +msgstr "支持可变数量的上下文管理器" + +#: ../../library/contextlib.rst:726 +msgid "" +"The primary use case for :class:`ExitStack` is the one given in the class " +"documentation: supporting a variable number of context managers and other " +"cleanup operations in a single :keyword:`with` statement. The variability " +"may come from the number of context managers needed being driven by user " +"input (such as opening a user specified collection of files), or from some " +"of the context managers being optional::" +msgstr "" +":class:`ExitStack` 的主要应用场景已在该类的文档中给出:在单个 :keyword:`with` " +"语句中支持可变数量的上下文管理器和其他清理操作。 " +"这个可变性可以来自通过用户输入驱动所需的上下文管理器数量(例如打开用户所指定的文件集),或者来自将某些上下文管理器作为可选项::" + +#: ../../library/contextlib.rst:733 +msgid "" +"with ExitStack() as stack:\n" +" for resource in resources:\n" +" stack.enter_context(resource)\n" +" if need_special_resource():\n" +" special = acquire_special_resource()\n" +" stack.callback(release_special_resource, special)\n" +" # Perform operations that use the acquired resources" +msgstr "" +"with ExitStack() as stack:\n" +" for resource in resources:\n" +" stack.enter_context(resource)\n" +" if need_special_resource():\n" +" special = acquire_special_resource()\n" +" stack.callback(release_special_resource, special)\n" +" # 执行使用了所获取资源的操作" + +#: ../../library/contextlib.rst:741 +msgid "" +"As shown, :class:`ExitStack` also makes it quite easy to use :keyword:`with`" +" statements to manage arbitrary resources that don't natively support the " +"context management protocol." +msgstr "" +"如上所示,:class:`ExitStack` 还让使用 :keyword:`with` 语句来管理任意非原生支持上下文管理协议的资源变得相当容易。" + +#: ../../library/contextlib.rst:747 +msgid "Catching exceptions from ``__enter__`` methods" +msgstr "捕获 ``__enter__`` 方法产生的异常" + +#: ../../library/contextlib.rst:749 +msgid "" +"It is occasionally desirable to catch exceptions from an " +":meth:`~object.__enter__` method implementation, *without* inadvertently " +"catching exceptions from the :keyword:`with` statement body or the context " +"manager's :meth:`~object.__exit__` method. By using :class:`ExitStack` the " +"steps in the context management protocol can be separated slightly in order " +"to allow this::" +msgstr "" + +#: ../../library/contextlib.rst:755 +msgid "" +"stack = ExitStack()\n" +"try:\n" +" x = stack.enter_context(cm)\n" +"except Exception:\n" +" # handle __enter__ exception\n" +"else:\n" +" with stack:\n" +" # Handle normal case" +msgstr "" +"stack = ExitStack()\n" +"try:\n" +" x = stack.enter_context(cm)\n" +"except Exception:\n" +" # 处理 __enter__ 异常\n" +"else:\n" +" with stack:\n" +" # 处理正常情况" + +#: ../../library/contextlib.rst:764 +msgid "" +"Actually needing to do this is likely to indicate that the underlying API " +"should be providing a direct resource management interface for use with " +":keyword:`try`/:keyword:`except`/:keyword:`finally` statements, but not all " +"APIs are well designed in that regard. When a context manager is the only " +"resource management API provided, then :class:`ExitStack` can make it easier" +" to handle various situations that can't be handled directly in a " +":keyword:`with` statement." +msgstr "" +"实际上需要这样做很可能表明下层的 API 应该提供一个直接的资源管理接口以便与 " +":keyword:`try`/:keyword:`except`/:keyword:`finally` 语句配合使用,但并不是所有的 API " +"在这方面都设计得很好。 当上下文管理器是所提供的唯一资源管理 API 时,则 :class:`ExitStack` 可以让处理各种无法在 " +":keyword:`with` 语句中直接处理的情况变得更为容易。" + +#: ../../library/contextlib.rst:774 +msgid "Cleaning up in an ``__enter__`` implementation" +msgstr "在一个 ``__enter__`` 方法的实现中进行清理" + +#: ../../library/contextlib.rst:776 +msgid "" +"As noted in the documentation of :meth:`ExitStack.push`, this method can be " +"useful in cleaning up an already allocated resource if later steps in the " +":meth:`~object.__enter__` implementation fail." +msgstr "" +"正如 :meth:`ExitStack.push` 的文档中指出的,如果在 :meth:`~object.__enter__` " +"实现中的后续步骤失败则此方法将可被用于清理已分配的资源。" + +#: ../../library/contextlib.rst:780 +msgid "" +"Here's an example of doing this for a context manager that accepts resource " +"acquisition and release functions, along with an optional validation " +"function, and maps them to the context management protocol::" +msgstr "下面是为一个上下文管理器做这件事的例子,该上下文管理器可接受资源获取和释放函数,以及可选的验证函数,并将它们映射到上下文管理协议::" + +#: ../../library/contextlib.rst:784 +msgid "" +"from contextlib import contextmanager, AbstractContextManager, ExitStack\n" +"\n" +"class ResourceManager(AbstractContextManager):\n" +"\n" +" def __init__(self, acquire_resource, release_resource, check_resource_ok=None):\n" +" self.acquire_resource = acquire_resource\n" +" self.release_resource = release_resource\n" +" if check_resource_ok is None:\n" +" def check_resource_ok(resource):\n" +" return True\n" +" self.check_resource_ok = check_resource_ok\n" +"\n" +" @contextmanager\n" +" def _cleanup_on_error(self):\n" +" with ExitStack() as stack:\n" +" stack.push(self)\n" +" yield\n" +" # The validation check passed and didn't raise an exception\n" +" # Accordingly, we want to keep the resource, and pass it\n" +" # back to our caller\n" +" stack.pop_all()\n" +"\n" +" def __enter__(self):\n" +" resource = self.acquire_resource()\n" +" with self._cleanup_on_error():\n" +" if not self.check_resource_ok(resource):\n" +" msg = \"Failed validation for {!r}\"\n" +" raise RuntimeError(msg.format(resource))\n" +" return resource\n" +"\n" +" def __exit__(self, *exc_details):\n" +" # We don't need to duplicate any of our resource release logic\n" +" self.release_resource()" +msgstr "" +"from contextlib import contextmanager, AbstractContextManager, ExitStack\n" +"\n" +"class ResourceManager(AbstractContextManager):\n" +"\n" +" def __init__(self, acquire_resource, release_resource, check_resource_ok=None):\n" +" self.acquire_resource = acquire_resource\n" +" self.release_resource = release_resource\n" +" if check_resource_ok is None:\n" +" def check_resource_ok(resource):\n" +" return True\n" +" self.check_resource_ok = check_resource_ok\n" +"\n" +" @contextmanager\n" +" def _cleanup_on_error(self):\n" +" with ExitStack() as stack:\n" +" stack.push(self)\n" +" yield\n" +" # 验证检测通过且没有引发异常\n" +" # 相应地,我们想要保留资源,并将其\n" +" # 回传给调用方\n" +" stack.pop_all()\n" +"\n" +" def __enter__(self):\n" +" resource = self.acquire_resource()\n" +" with self._cleanup_on_error():\n" +" if not self.check_resource_ok(resource):\n" +" msg = \"Failed validation for {!r}\"\n" +" raise RuntimeError(msg.format(resource))\n" +" return resource\n" +"\n" +" def __exit__(self, *exc_details):\n" +" # 我们不需要复制任何的资源释放逻辑\n" +" self.release_resource()" + +#: ../../library/contextlib.rst:820 +msgid "Replacing any use of ``try-finally`` and flag variables" +msgstr "替换任何对 ``try-finally`` 和旗标变量的使用" + +#: ../../library/contextlib.rst:822 +msgid "" +"A pattern you will sometimes see is a ``try-finally`` statement with a flag " +"variable to indicate whether or not the body of the ``finally`` clause " +"should be executed. In its simplest form (that can't already be handled just" +" by using an ``except`` clause instead), it looks something like this::" +msgstr "" +"一种你有时将看到的模式是 ``try-finally`` 语句附带一个旗标变量来指明 ``finally`` 子句体是否要被执行。 " +"在其最简单的形式中(它无法仅仅通过改用一条 ``except`` 子句来预先处理),看起来会是这样::" + +#: ../../library/contextlib.rst:827 +msgid "" +"cleanup_needed = True\n" +"try:\n" +" result = perform_operation()\n" +" if result:\n" +" cleanup_needed = False\n" +"finally:\n" +" if cleanup_needed:\n" +" cleanup_resources()" +msgstr "" +"cleanup_needed = True\n" +"try:\n" +" result = perform_operation()\n" +" if result:\n" +" cleanup_needed = False\n" +"finally:\n" +" if cleanup_needed:\n" +" cleanup_resources()" + +#: ../../library/contextlib.rst:836 +msgid "" +"As with any ``try`` statement based code, this can cause problems for " +"development and review, because the setup code and the cleanup code can end " +"up being separated by arbitrarily long sections of code." +msgstr "就如任何基于 ``try`` 语句的代码一样,这可能会导致开发和审查方面的问题,因为设置代码和清理代码最终可能会被任意长的代码部分所分隔。" + +#: ../../library/contextlib.rst:840 +msgid "" +":class:`ExitStack` makes it possible to instead register a callback for " +"execution at the end of a ``with`` statement, and then later decide to skip " +"executing that callback::" +msgstr "" +":class:`ExitStack` 将允许选择在一条 ``with`` 语句末尾注册一个用于执行的回调的替代方式,等以后再决定是否跳过该回调的执行::" + +#: ../../library/contextlib.rst:844 +msgid "" +"from contextlib import ExitStack\n" +"\n" +"with ExitStack() as stack:\n" +" stack.callback(cleanup_resources)\n" +" result = perform_operation()\n" +" if result:\n" +" stack.pop_all()" +msgstr "" +"from contextlib import ExitStack\n" +"\n" +"with ExitStack() as stack:\n" +" stack.callback(cleanup_resources)\n" +" result = perform_operation()\n" +" if result:\n" +" stack.pop_all()" + +#: ../../library/contextlib.rst:852 +msgid "" +"This allows the intended cleanup behaviour to be made explicit up front, " +"rather than requiring a separate flag variable." +msgstr "这允许在事先显式地指明预期的清理行为,而不需要一个单独的旗标变量。" + +#: ../../library/contextlib.rst:855 +msgid "" +"If a particular application uses this pattern a lot, it can be simplified " +"even further by means of a small helper class::" +msgstr "如果某个应用程序大量使用此模式,则可以通过使用一个较小的辅助类来进一步地简化它::" + +#: ../../library/contextlib.rst:858 +msgid "" +"from contextlib import ExitStack\n" +"\n" +"class Callback(ExitStack):\n" +" def __init__(self, callback, /, *args, **kwds):\n" +" super().__init__()\n" +" self.callback(callback, *args, **kwds)\n" +"\n" +" def cancel(self):\n" +" self.pop_all()\n" +"\n" +"with Callback(cleanup_resources) as cb:\n" +" result = perform_operation()\n" +" if result:\n" +" cb.cancel()" +msgstr "" +"from contextlib import ExitStack\n" +"\n" +"class Callback(ExitStack):\n" +" def __init__(self, callback, /, *args, **kwds):\n" +" super().__init__()\n" +" self.callback(callback, *args, **kwds)\n" +"\n" +" def cancel(self):\n" +" self.pop_all()\n" +"\n" +"with Callback(cleanup_resources) as cb:\n" +" result = perform_operation()\n" +" if result:\n" +" cb.cancel()" + +#: ../../library/contextlib.rst:873 +msgid "" +"If the resource cleanup isn't already neatly bundled into a standalone " +"function, then it is still possible to use the decorator form of " +":meth:`ExitStack.callback` to declare the resource cleanup in advance::" +msgstr "" +"如果资源清理操作尚未完善地捆绑到一个独立的函数中,则仍然可以使用 :meth:`ExitStack.callback` " +"的装饰器形式来提前声明资源清理::" + +#: ../../library/contextlib.rst:878 +msgid "" +"from contextlib import ExitStack\n" +"\n" +"with ExitStack() as stack:\n" +" @stack.callback\n" +" def cleanup_resources():\n" +" ...\n" +" result = perform_operation()\n" +" if result:\n" +" stack.pop_all()" +msgstr "" +"from contextlib import ExitStack\n" +"\n" +"with ExitStack() as stack:\n" +" @stack.callback\n" +" def cleanup_resources():\n" +" ...\n" +" result = perform_operation()\n" +" if result:\n" +" stack.pop_all()" + +#: ../../library/contextlib.rst:888 +msgid "" +"Due to the way the decorator protocol works, a callback function declared " +"this way cannot take any parameters. Instead, any resources to be released " +"must be accessed as closure variables." +msgstr "受装饰器协议工作方式的影响,以此方式声明的回调函数无法接受任何形参。 作为替代,任何要释放的资源必须作为闭包变量来访问。" + +#: ../../library/contextlib.rst:894 +msgid "Using a context manager as a function decorator" +msgstr "将上下文管理器作为函数装饰器使用" + +#: ../../library/contextlib.rst:896 +msgid "" +":class:`ContextDecorator` makes it possible to use a context manager in both" +" an ordinary ``with`` statement and also as a function decorator." +msgstr ":class:`ContextDecorator` 类允许将上下文管理器作为函数装饰器使用,而不仅在 ``with`` 语句块中使用。" + +#: ../../library/contextlib.rst:899 +msgid "" +"For example, it is sometimes useful to wrap functions or groups of " +"statements with a logger that can track the time of entry and time of exit." +" Rather than writing both a function decorator and a context manager for " +"the task, inheriting from :class:`ContextDecorator` provides both " +"capabilities in a single definition::" +msgstr "" +"例如,有时将函数或语句组包装在一个可以跟踪进入和退出时间的记录器中是很有用的。 与其为任务同时编写函数装饰器和上下文管理器,不如继承 " +":class:`ContextDecorator` 在一个定义中同时提供这两种能力::" + +#: ../../library/contextlib.rst:905 +msgid "" +"from contextlib import ContextDecorator\n" +"import logging\n" +"\n" +"logging.basicConfig(level=logging.INFO)\n" +"\n" +"class track_entry_and_exit(ContextDecorator):\n" +" def __init__(self, name):\n" +" self.name = name\n" +"\n" +" def __enter__(self):\n" +" logging.info('Entering: %s', self.name)\n" +"\n" +" def __exit__(self, exc_type, exc, exc_tb):\n" +" logging.info('Exiting: %s', self.name)" +msgstr "" +"from contextlib import ContextDecorator\n" +"import logging\n" +"\n" +"logging.basicConfig(level=logging.INFO)\n" +"\n" +"class track_entry_and_exit(ContextDecorator):\n" +" def __init__(self, name):\n" +" self.name = name\n" +"\n" +" def __enter__(self):\n" +" logging.info('Entering: %s', self.name)\n" +"\n" +" def __exit__(self, exc_type, exc, exc_tb):\n" +" logging.info('Exiting: %s', self.name)" + +#: ../../library/contextlib.rst:920 +msgid "Instances of this class can be used as both a context manager::" +msgstr "这个类的实例既可以被用作上下文管理器::" + +#: ../../library/contextlib.rst:922 +msgid "" +"with track_entry_and_exit('widget loader'):\n" +" print('Some time consuming activity goes here')\n" +" load_widget()" +msgstr "" +"with track_entry_and_exit('widget loader'):\n" +" print('Some time consuming activity goes here')\n" +" load_widget()" + +#: ../../library/contextlib.rst:926 +msgid "And also as a function decorator::" +msgstr "也可以被用作函数装饰器::" + +#: ../../library/contextlib.rst:928 +msgid "" +"@track_entry_and_exit('widget loader')\n" +"def activity():\n" +" print('Some time consuming activity goes here')\n" +" load_widget()" +msgstr "" +"@track_entry_and_exit('widget loader')\n" +"def activity():\n" +" print('Some time consuming activity goes here')\n" +" load_widget()" + +#: ../../library/contextlib.rst:933 +msgid "" +"Note that there is one additional limitation when using context managers as " +"function decorators: there's no way to access the return value of " +":meth:`~object.__enter__`. If that value is needed, then it is still " +"necessary to use an explicit ``with`` statement." +msgstr "" +"请注意当使用上下文管理器作为函数装饰器时有一个额外的限制:没有任何办法可以访问 :meth:`~object.__enter__` 的返回值。 " +"如果需要该值,那么你仍然需要使用显式的 ``with`` 语句。" + +#: ../../library/contextlib.rst:940 +msgid ":pep:`343` - The \"with\" statement" +msgstr ":pep:`343` - \"with\" 语句" + +#: ../../library/contextlib.rst:941 +msgid "" +"The specification, background, and examples for the Python :keyword:`with` " +"statement." +msgstr "Python :keyword:`with` 语句的规范描述、背景和示例。" + +#: ../../library/contextlib.rst:947 +msgid "Single use, reusable and reentrant context managers" +msgstr "单独使用,可重用并可重进入的上下文管理器" + +#: ../../library/contextlib.rst:949 +msgid "" +"Most context managers are written in a way that means they can only be used " +"effectively in a :keyword:`with` statement once. These single use context " +"managers must be created afresh each time they're used - attempting to use " +"them a second time will trigger an exception or otherwise not work " +"correctly." +msgstr "" +"大多数上下文管理器的编写方式意味着它们只能在一个 :keyword:`with` 语句中被有效使用一次。 " +"这些一次性使用的上下文管理器必须在每次被使用时重新创建 —— 试图第二次使用它们将会触发异常或是不能正确工作。" + +#: ../../library/contextlib.rst:955 +msgid "" +"This common limitation means that it is generally advisable to create " +"context managers directly in the header of the :keyword:`with` statement " +"where they are used (as shown in all of the usage examples above)." +msgstr "" +"这个常见的限制意味着通常来说都建议在 :keyword:`with` 语句开头上下文管理器被使用的位置直接创建它们(如上面所有的使用示例所显示的)。" + +#: ../../library/contextlib.rst:959 +msgid "" +"Files are an example of effectively single use context managers, since the " +"first :keyword:`with` statement will close the file, preventing any further " +"IO operations using that file object." +msgstr "" +"文件是一个高效的单次使用上下文管理器的例子,因为第一个 :keyword:`with` 语句将关闭文件,防止任何后续的使用该文件对象的 IO 操作。" + +#: ../../library/contextlib.rst:963 +msgid "" +"Context managers created using :func:`contextmanager` are also single use " +"context managers, and will complain about the underlying generator failing " +"to yield if an attempt is made to use them a second time::" +msgstr "" +"使用 :func:`contextmanager` " +"创建的上下文管理器也是单次使用的上下文管理器,并会在试图第二次使用它们时报告下层生成器无法执行产生操作::" + +#: ../../library/contextlib.rst:967 +msgid "" +">>> from contextlib import contextmanager\n" +">>> @contextmanager\n" +"... def singleuse():\n" +"... print(\"Before\")\n" +"... yield\n" +"... print(\"After\")\n" +"...\n" +">>> cm = singleuse()\n" +">>> with cm:\n" +"... pass\n" +"...\n" +"Before\n" +"After\n" +">>> with cm:\n" +"... pass\n" +"...\n" +"Traceback (most recent call last):\n" +" ...\n" +"RuntimeError: generator didn't yield" +msgstr "" +">>> from contextlib import contextmanager\n" +">>> @contextmanager\n" +"... def singleuse():\n" +"... print(\"Before\")\n" +"... yield\n" +"... print(\"After\")\n" +"...\n" +">>> cm = singleuse()\n" +">>> with cm:\n" +"... pass\n" +"...\n" +"Before\n" +"After\n" +">>> with cm:\n" +"... pass\n" +"...\n" +"Traceback (most recent call last):\n" +" ...\n" +"RuntimeError: generator didn't yield" + +#: ../../library/contextlib.rst:991 +msgid "Reentrant context managers" +msgstr "重进入上下文管理器" + +#: ../../library/contextlib.rst:993 +msgid "" +"More sophisticated context managers may be \"reentrant\". These context " +"managers can not only be used in multiple :keyword:`with` statements, but " +"may also be used *inside* a :keyword:`!with` statement that is already using" +" the same context manager." +msgstr "" +"更复杂的上下文管理器可以“重进入”。 这些上下文管理器不但可以被用于多个 :keyword:`with` " +"语句中,还可以被用于已经在使用同一个上下文管理器的 :keyword:`!with` 语句 *内部*。" + +#: ../../library/contextlib.rst:998 +msgid "" +":class:`threading.RLock` is an example of a reentrant context manager, as " +"are :func:`suppress`, :func:`redirect_stdout`, and :func:`chdir`. Here's a " +"very simple example of reentrant use::" +msgstr "" +":class:`threading.RLock` 是一个可重入上下文管理器的例子,:func:`suppress`, " +":func:`redirect_stdout` 和 :func:`chdir` 也是。 下面是一个非常简单的使用重入的示例::" + +#: ../../library/contextlib.rst:1002 +msgid "" +">>> from contextlib import redirect_stdout\n" +">>> from io import StringIO\n" +">>> stream = StringIO()\n" +">>> write_to_stream = redirect_stdout(stream)\n" +">>> with write_to_stream:\n" +"... print(\"This is written to the stream rather than stdout\")\n" +"... with write_to_stream:\n" +"... print(\"This is also written to the stream\")\n" +"...\n" +">>> print(\"This is written directly to stdout\")\n" +"This is written directly to stdout\n" +">>> print(stream.getvalue())\n" +"This is written to the stream rather than stdout\n" +"This is also written to the stream" +msgstr "" +">>> from contextlib import redirect_stdout\n" +">>> from io import StringIO\n" +">>> stream = StringIO()\n" +">>> write_to_stream = redirect_stdout(stream)\n" +">>> with write_to_stream:\n" +"... print(\"This is written to the stream rather than stdout\")\n" +"... with write_to_stream:\n" +"... print(\"This is also written to the stream\")\n" +"...\n" +">>> print(\"This is written directly to stdout\")\n" +"This is written directly to stdout\n" +">>> print(stream.getvalue())\n" +"This is written to the stream rather than stdout\n" +"This is also written to the stream" + +#: ../../library/contextlib.rst:1017 +msgid "" +"Real world examples of reentrancy are more likely to involve multiple " +"functions calling each other and hence be far more complicated than this " +"example." +msgstr "现实世界的可重入例子更可能涉及到多个函数的相互调用因此会比这个例子要复杂得多。" + +#: ../../library/contextlib.rst:1021 +msgid "" +"Note also that being reentrant is *not* the same thing as being thread safe." +" :func:`redirect_stdout`, for example, is definitely not thread safe, as it " +"makes a global modification to the system state by binding " +":data:`sys.stdout` to a different stream." +msgstr "" +"还要注意可重入与线程安全 *不是* 一回事。 举例来说,:func:`redirect_stdout` 肯定不是线程安全的,因为它会通过将 " +":data:`sys.stdout` 绑定到一个不同的流对系统状态做了全局性的修改。" + +#: ../../library/contextlib.rst:1030 +msgid "Reusable context managers" +msgstr "可重用的上下文管理器" + +#: ../../library/contextlib.rst:1032 +msgid "" +"Distinct from both single use and reentrant context managers are " +"\"reusable\" context managers (or, to be completely explicit, \"reusable, " +"but not reentrant\" context managers, since reentrant context managers are " +"also reusable). These context managers support being used multiple times, " +"but will fail (or otherwise not work correctly) if the specific context " +"manager instance has already been used in a containing with statement." +msgstr "" +"与单次使用和可重入上下文管理器都不同的还有“可重用”上下文管理器(或者,使用完全显式的表达应为“可重用,但不可重入”上下文管理器,因为可重入上下文管理器也会是可重用的)。" +" 这些上下文管理器支持多次使用,但如果特定的上下文管理器实例已经在包含它的 with 语句中被使用过则将失败(或者不能正确工作)。" + +#: ../../library/contextlib.rst:1039 +msgid "" +":class:`threading.Lock` is an example of a reusable, but not reentrant, " +"context manager (for a reentrant lock, it is necessary to use " +":class:`threading.RLock` instead)." +msgstr "" +":class:`threading.Lock` 是一个可重用,但是不可重入的上下文管理器的例子(对于可重入锁,则有必要使用 " +":class:`threading.RLock` 来代替)。" + +#: ../../library/contextlib.rst:1043 +msgid "" +"Another example of a reusable, but not reentrant, context manager is " +":class:`ExitStack`, as it invokes *all* currently registered callbacks when " +"leaving any with statement, regardless of where those callbacks were added::" +msgstr "" +"另一个可重用,但不可重入的上下文管理器的例子是 :class:`ExitStack`,因为它在离开任何 with 语句时会唤起 *所有* " +"当前已注册的回调,不论回调是在哪里添加的::" + +#: ../../library/contextlib.rst:1048 +msgid "" +">>> from contextlib import ExitStack\n" +">>> stack = ExitStack()\n" +">>> with stack:\n" +"... stack.callback(print, \"Callback: from first context\")\n" +"... print(\"Leaving first context\")\n" +"...\n" +"Leaving first context\n" +"Callback: from first context\n" +">>> with stack:\n" +"... stack.callback(print, \"Callback: from second context\")\n" +"... print(\"Leaving second context\")\n" +"...\n" +"Leaving second context\n" +"Callback: from second context\n" +">>> with stack:\n" +"... stack.callback(print, \"Callback: from outer context\")\n" +"... with stack:\n" +"... stack.callback(print, \"Callback: from inner context\")\n" +"... print(\"Leaving inner context\")\n" +"... print(\"Leaving outer context\")\n" +"...\n" +"Leaving inner context\n" +"Callback: from inner context\n" +"Callback: from outer context\n" +"Leaving outer context" +msgstr "" +">>> from contextlib import ExitStack\n" +">>> stack = ExitStack()\n" +">>> with stack:\n" +"... stack.callback(print, \"Callback: from first context\")\n" +"... print(\"Leaving first context\")\n" +"...\n" +"Leaving first context\n" +"Callback: from first context\n" +">>> with stack:\n" +"... stack.callback(print, \"Callback: from second context\")\n" +"... print(\"Leaving second context\")\n" +"...\n" +"Leaving second context\n" +"Callback: from second context\n" +">>> with stack:\n" +"... stack.callback(print, \"Callback: from outer context\")\n" +"... with stack:\n" +"... stack.callback(print, \"Callback: from inner context\")\n" +"... print(\"Leaving inner context\")\n" +"... print(\"Leaving outer context\")\n" +"...\n" +"Leaving inner context\n" +"Callback: from inner context\n" +"Callback: from outer context\n" +"Leaving outer context" + +#: ../../library/contextlib.rst:1074 +msgid "" +"As the output from the example shows, reusing a single stack object across " +"multiple with statements works correctly, but attempting to nest them will " +"cause the stack to be cleared at the end of the innermost with statement, " +"which is unlikely to be desirable behaviour." +msgstr "" +"正如这个例子的输出所显示的,在多个 with 语句中重用一个单独的栈对象可以正确工作,但尝试嵌套它们就将导致栈在最内层的 with " +"语句结束时被清空,这不大可能是符合期望的行为。" + +#: ../../library/contextlib.rst:1079 +msgid "" +"Using separate :class:`ExitStack` instances instead of reusing a single " +"instance avoids that problem::" +msgstr "使用单独的 :class:`ExitStack` 实例而不是重复使用一个实例可以避免此问题::" + +#: ../../library/contextlib.rst:1082 +msgid "" +">>> from contextlib import ExitStack\n" +">>> with ExitStack() as outer_stack:\n" +"... outer_stack.callback(print, \"Callback: from outer context\")\n" +"... with ExitStack() as inner_stack:\n" +"... inner_stack.callback(print, \"Callback: from inner context\")\n" +"... print(\"Leaving inner context\")\n" +"... print(\"Leaving outer context\")\n" +"...\n" +"Leaving inner context\n" +"Callback: from inner context\n" +"Leaving outer context\n" +"Callback: from outer context" +msgstr "" +">>> from contextlib import ExitStack\n" +">>> with ExitStack() as outer_stack:\n" +"... outer_stack.callback(print, \"Callback: from outer context\")\n" +"... with ExitStack() as inner_stack:\n" +"... inner_stack.callback(print, \"Callback: from inner context\")\n" +"... print(\"Leaving inner context\")\n" +"... print(\"Leaving outer context\")\n" +"...\n" +"Leaving inner context\n" +"Callback: from inner context\n" +"Leaving outer context\n" +"Callback: from outer context" diff --git a/library/contextvars.po b/library/contextvars.po new file mode 100644 index 0000000000..e04d63c526 --- /dev/null +++ b/library/contextvars.po @@ -0,0 +1,551 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# Freesand Leo , 2026 +# 99 , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: 99 , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/contextvars.rst:2 +msgid ":mod:`!contextvars` --- Context Variables" +msgstr ":mod:`!contextvars` --- 上下文变量" + +#: ../../library/contextvars.rst:9 +msgid "" +"This module provides APIs to manage, store, and access context-local state." +" The :class:`~contextvars.ContextVar` class is used to declare and work " +"with *Context Variables*. The :func:`~contextvars.copy_context` function " +"and the :class:`~contextvars.Context` class should be used to manage the " +"current context in asynchronous frameworks." +msgstr "" +"本模块提供了相关API用于管理、存储和访问上下文相关的状态。 :class:`~contextvars.ContextVar` 类用于声明 " +"*上下文变量* 并与其一起使用。函数 :func:`~contextvars.copy_context` 和类 " +":class:`~contextvars.Context` 用于管理异步框架中的当前上下文。" + +#: ../../library/contextvars.rst:15 +msgid "" +"Context managers that have state should use Context Variables instead of " +":func:`threading.local` to prevent their state from bleeding to other code " +"unexpectedly, when used in concurrent code." +msgstr "" +"当在并发代码中使用时,有状态的上下文管理器应当使用上下文变量而不是 :func:`threading.local` " +"以防止它们的状态意外地泄露到其他代码中。" + +#: ../../library/contextvars.rst:19 +msgid "See also :pep:`567` for additional details." +msgstr "更多信息参见 :pep:`567` 。" + +#: ../../library/contextvars.rst:25 +msgid "Context Variables" +msgstr "上下文变量" + +#: ../../library/contextvars.rst:29 +msgid "This class is used to declare a new Context Variable, e.g.::" +msgstr "此类用于声明一个新的上下文变量,如::" + +#: ../../library/contextvars.rst:31 +msgid "var: ContextVar[int] = ContextVar('var', default=42)" +msgstr "var: ContextVar[int] = ContextVar('var', default=42)" + +#: ../../library/contextvars.rst:33 +msgid "" +"The required *name* parameter is used for introspection and debug purposes." +msgstr "*name* 参数用于内省和调试,必需。" + +#: ../../library/contextvars.rst:36 +msgid "" +"The optional keyword-only *default* parameter is returned by " +":meth:`ContextVar.get` when no value for the variable is found in the " +"current context." +msgstr "" +"调用 :meth:`ContextVar.get` 时,如果上下文中没有找到此变量的值,则返回可选的仅限关键字参数 *default* 。" + +#: ../../library/contextvars.rst:40 +msgid "" +"**Important:** Context Variables should be created at the top module level " +"and never in closures. :class:`Context` objects hold strong references to " +"context variables which prevents context variables from being properly " +"garbage collected." +msgstr "" +"**重要:** 上下文变量应该在顶级模块中创建,且永远不要在闭包中创建。 :class:`Context` " +"对象拥有对上下文变量的强引用,这会阻止上下文变量被垃圾收集器正确回收。" + +#: ../../library/contextvars.rst:47 +msgid "The name of the variable. This is a read-only property." +msgstr "上下文变量的名称,只读属性。" + +#: ../../library/contextvars.rst:53 +msgid "Return a value for the context variable for the current context." +msgstr "返回当前上下文中此上下文变量的值。" + +#: ../../library/contextvars.rst:55 +msgid "" +"If there is no value for the variable in the current context, the method " +"will:" +msgstr "如果当前上下文中此变量没有值,则此方法会:" + +#: ../../library/contextvars.rst:58 +msgid "" +"return the value of the *default* argument of the method, if provided; or" +msgstr "如果提供了 *default*,返回其值;或者" + +#: ../../library/contextvars.rst:61 +msgid "" +"return the default value for the context variable, if it was created with " +"one; or" +msgstr "返回上下文变量本身的默认值, 如果创建此上下文变量时提供了默认值;或者" + +#: ../../library/contextvars.rst:64 +msgid "raise a :exc:`LookupError`." +msgstr "抛出 :exc:`LookupError` 异常。" + +#: ../../library/contextvars.rst:68 +msgid "" +"Call to set a new value for the context variable in the current context." +msgstr "调用此方法设置上下文变量在当前上下文中的值。" + +#: ../../library/contextvars.rst:71 +msgid "" +"The required *value* argument is the new value for the context variable." +msgstr "必选参数 *value* 是上下文变量的新值。" + +#: ../../library/contextvars.rst:74 +msgid "" +"Returns a :class:`~contextvars.Token` object that can be used to restore the" +" variable to its previous value via the :meth:`ContextVar.reset` method." +msgstr "" +"返回一个 :class:`~contextvars.Token` 对象,可通过 :meth:`ContextVar.reset` " +"方法将上下文变量还原为之前某个状态。" + +#: ../../library/contextvars.rst:78 +msgid "" +"For convenience, the token object can be used as a context manager to avoid " +"calling :meth:`ContextVar.reset` manually::" +msgstr "出于方便考虑,token 对象可被用作上下文管理器以避免手动调用 :meth:`ContextVar.reset`::" + +#: ../../library/contextvars.rst:81 +msgid "" +"var = ContextVar('var', default='default value')\n" +"\n" +"with var.set('new value'):\n" +" assert var.get() == 'new value'\n" +"\n" +"assert var.get() == 'default value'" +msgstr "" +"var = ContextVar('var', default='default value')\n" +"\n" +"with var.set('new value'):\n" +" assert var.get() == 'new value'\n" +"\n" +"assert var.get() == 'default value'" + +#: ../../library/contextvars.rst:88 +msgid "It is a shorthand for::" +msgstr "这是以下代码的快捷写法::" + +#: ../../library/contextvars.rst:90 +msgid "" +"var = ContextVar('var', default='default value')\n" +"\n" +"token = var.set('new value')\n" +"try:\n" +" assert var.get() == 'new value'\n" +"finally:\n" +" var.reset(token)\n" +"\n" +"assert var.get() == 'default value'" +msgstr "" +"var = ContextVar('var', default='default value')\n" +"\n" +"token = var.set('new value')\n" +"try:\n" +" assert var.get() == 'new value'\n" +"finally:\n" +" var.reset(token)\n" +"\n" +"assert var.get() == 'default value'" + +#: ../../library/contextvars.rst:102 +msgid "Added support for using tokens as context managers." +msgstr "增加对使用 token 作为上下文管理器的支持。" + +#: ../../library/contextvars.rst:106 +msgid "" +"Reset the context variable to the value it had before the " +":meth:`ContextVar.set` that created the *token* was used." +msgstr "将上下文变量重置为调用 :meth:`ContextVar.set` 之前、创建 *token* 时候的状态。" + +#: ../../library/contextvars.rst:109 +msgid "For example::" +msgstr "例如::" + +#: ../../library/contextvars.rst:111 +msgid "" +"var = ContextVar('var')\n" +"\n" +"token = var.set('new value')\n" +"# code that uses 'var'; var.get() returns 'new value'.\n" +"var.reset(token)\n" +"\n" +"# After the reset call the var has no value again, so\n" +"# var.get() would raise a LookupError." +msgstr "" +"var = ContextVar('var')\n" +"\n" +"token = var.set('new value')\n" +"# 使用 'var' 的代码;var.get() 将返回 'new value'。\n" +"var.reset(token)\n" +"\n" +"# 在重置调用之后 var 将不再有值,\n" +"# 因此 var.get() 将引发一个 LookupError。" + +#: ../../library/contextvars.rst:120 +msgid "The same *token* cannot be used twice." +msgstr "同一个 *token* 不能被重复使用。" + +#: ../../library/contextvars.rst:125 +msgid "" +"*Token* objects are returned by the :meth:`ContextVar.set` method. They can " +"be passed to the :meth:`ContextVar.reset` method to revert the value of the " +"variable to what it was before the corresponding *set*. A single token " +"cannot reset a context variable more than once." +msgstr "" +"*Token* 对象是由 :meth:`ContextVar.set` 方法返回的。 它们可以被传入 :meth:`ContextVar.reset` " +"方法来恢复在对应的 *set* 之前状态的变量值。 同一个 token 不能多次重置上下文变量。" + +#: ../../library/contextvars.rst:130 +msgid "" +"Tokens support the :ref:`context manager protocol ` to " +"automatically reset context variables. See :meth:`ContextVar.set`." +msgstr "" +"Token 支持 :ref:`上下文管理器协议 ` 以自动重置上下文变量。 参见 " +":meth:`ContextVar.set`。" + +#: ../../library/contextvars.rst:135 +msgid "Added support for usage as a context manager." +msgstr "增加对用作上下文管理器的支持。" + +#: ../../library/contextvars.rst:139 +msgid "" +"A read-only property. Points to the :class:`ContextVar` object that created" +" the token." +msgstr "只读属性。指向创建此 token 的 :class:`ContextVar` 对象。" + +#: ../../library/contextvars.rst:144 +msgid "" +"A read-only property. Set to the value the variable had before the " +":meth:`ContextVar.set` method call that created the token. It points to " +":attr:`Token.MISSING` if the variable was not set before the call." +msgstr "" +"一个只读属性。 会被设为在创建此令牌的 :meth:`ContextVar.set` 方法调用之前该变量所具有的值。 " +"如果调用之前变量没有设置值则它会指向 :attr:`Token.MISSING`。" + +#: ../../library/contextvars.rst:151 +msgid "A marker object used by :attr:`Token.old_value`." +msgstr ":attr:`Token.old_value` 会用到的一个标记对象。" + +#: ../../library/contextvars.rst:155 +msgid "Manual Context Management" +msgstr "手动上下文管理" + +#: ../../library/contextvars.rst:159 +msgid "Returns a copy of the current :class:`~contextvars.Context` object." +msgstr "返回当前 :class:`~contextvars.Context` 对象的拷贝。" + +#: ../../library/contextvars.rst:161 +msgid "" +"The following snippet gets a copy of the current context and prints all " +"variables and their values that are set in it::" +msgstr "以下代码片段会获取当前上下文的拷贝并打印设置到其中的所有变量及其值::" + +#: ../../library/contextvars.rst:164 +msgid "" +"ctx: Context = copy_context()\n" +"print(list(ctx.items()))" +msgstr "" +"ctx: Context = copy_context()\n" +"print(list(ctx.items()))" + +#: ../../library/contextvars.rst:167 +msgid "" +"The function has an *O*\\ (1) complexity, i.e. works equally fast for " +"contexts with a few context variables and for contexts that have a lot of " +"them." +msgstr "此函数具有 *O*\\ (1) 复杂度,也就是说对于只包含几个上下文变量和很多上下文变量的情况运行速度是相同的。" + +#: ../../library/contextvars.rst:174 +msgid "A mapping of :class:`ContextVars ` to their values." +msgstr ":class:`ContextVars ` 与其值的映射。" + +#: ../../library/contextvars.rst:176 +msgid "" +"``Context()`` creates an empty context with no values in it. To get a copy " +"of the current context use the :func:`~contextvars.copy_context` function." +msgstr "" +"``Context()`` 创建一个不包含任何值的空上下文。如果要获取当前上下文的拷贝,使用 " +":func:`~contextvars.copy_context` 函数。" + +#: ../../library/contextvars.rst:180 +msgid "" +"Each thread has its own effective stack of :class:`!Context` objects. The " +":term:`current context` is the :class:`!Context` object at the top of the " +"current thread's stack. All :class:`!Context` objects in the stacks are " +"considered to be *entered*." +msgstr "" +"每个线程有它自己在用的 :class:`!Context` 对象栈。 :term:`current context` 是位于当前线程的栈的顶部的 " +":class:`!Context` 对象。 栈中所有的 :class:`!Context` 对象都被视为是 *进入过的*。" + +#: ../../library/contextvars.rst:185 +msgid "" +"*Entering* a context, which can be done by calling its :meth:`~Context.run` " +"method, makes the context the current context by pushing it onto the top of " +"the current thread's context stack." +msgstr "" +"*进入* 一个上下文,这可以通过调用其 :meth:`~Context.run` 方法来完成,将把该上下文推入当前线程的栈的顶部使它成为当前上下文。" + +#: ../../library/contextvars.rst:189 +msgid "" +"*Exiting* from the current context, which can be done by returning from the " +"callback passed to the :meth:`~Context.run` method, restores the current " +"context to what it was before the context was entered by popping the context" +" off the top of the context stack." +msgstr "" +"*退出* 当前上下文,这可以通过从传给 :meth:`~Context.run` " +"方法的回调退出,通过将该上下文弹出上下文栈的顶部将当前上下文恢复至该上下文被进入之前的上下文来完成。" + +#: ../../library/contextvars.rst:194 +msgid "" +"Since each thread has its own context stack, :class:`ContextVar` objects " +"behave in a similar fashion to :func:`threading.local` when values are " +"assigned in different threads." +msgstr "" +"由于每个线程都有它自己的上下文栈,:class:`ContextVar` 对象的行为类似于 :func:`threading.local` " +"在不同线程中赋值时的行为。" + +#: ../../library/contextvars.rst:198 +msgid "" +"Attempting to enter an already entered context, including contexts entered " +"in other threads, raises a :exc:`RuntimeError`." +msgstr "尝试进入一个已被进入的上下文,包括在其他线程中被进入的上下文,将会引发 :exc:`RuntimeError`。" + +#: ../../library/contextvars.rst:201 +msgid "After exiting a context, it can later be re-entered (from any thread)." +msgstr "在退出一个上下文之后,它可以在稍后被重新进入(从任何线程)。" + +#: ../../library/contextvars.rst:203 +msgid "" +"Any changes to :class:`ContextVar` values via the :meth:`ContextVar.set` " +"method are recorded in the current context. The :meth:`ContextVar.get` " +"method returns the value associated with the current context. Exiting a " +"context effectively reverts any changes made to context variables while the " +"context was entered (if needed, the values can be restored by re-entering " +"the context)." +msgstr "" +"任何通过 :meth:`ContextVar.set` 方法对 :class:`ContextVar` 值的修改都将在当前上下文中被记录。 " +":meth:`ContextVar.get` 方法将返回关联到当前上下文的值。 " +"退出一个上下文将有效地撤销在进入该上下文期间对上下文变量的任何修改(如有必要,这些值可通过重新进入相应的上下文来恢复)。" + +#: ../../library/contextvars.rst:210 +msgid "Context implements the :class:`collections.abc.Mapping` interface." +msgstr "Context 实现了 :class:`collections.abc.Mapping` 接口。" + +#: ../../library/contextvars.rst:214 +msgid "" +"Enters the Context, executes ``callable(*args, **kwargs)``, then exits the " +"Context. Returns *callable*'s return value, or propagates an exception if " +"one occurred." +msgstr "" +"进入 Context,执行 ``callable(*args, **kwargs)``,然后退出 Context。 返回 *callable* " +"的返回值,或者如果发生了异常则传播该异常。" + +#: ../../library/contextvars.rst:218 +msgid "Example:" +msgstr "示例:" + +#: ../../library/contextvars.rst:220 +msgid "" +"import contextvars\n" +"\n" +"var = contextvars.ContextVar('var')\n" +"var.set('spam')\n" +"print(var.get()) # 'spam'\n" +"\n" +"ctx = contextvars.copy_context()\n" +"\n" +"def main():\n" +" # 'var' was set to 'spam' before\n" +" # calling 'copy_context()' and 'ctx.run(main)', so:\n" +" print(var.get()) # 'spam'\n" +" print(ctx[var]) # 'spam'\n" +"\n" +" var.set('ham')\n" +"\n" +" # Now, after setting 'var' to 'ham':\n" +" print(var.get()) # 'ham'\n" +" print(ctx[var]) # 'ham'\n" +"\n" +"# Any changes that the 'main' function makes to 'var'\n" +"# will be contained in 'ctx'.\n" +"ctx.run(main)\n" +"\n" +"# The 'main()' function was run in the 'ctx' context,\n" +"# so changes to 'var' are contained in it:\n" +"print(ctx[var]) # 'ham'\n" +"\n" +"# However, outside of 'ctx', 'var' is still set to 'spam':\n" +"print(var.get()) # 'spam'" +msgstr "" +"import contextvars\n" +"\n" +"var = contextvars.ContextVar('var')\n" +"var.set('spam')\n" +"print(var.get()) # 'spam'\n" +"\n" +"ctx = contextvars.copy_context()\n" +"\n" +"def main():\n" +" # 在调用 'copy_context()' 和 'ctx.run(main)' 之前\n" +" # 'var' 被设为 'spam',因此:\n" +" print(var.get()) # 'spam'\n" +" print(ctx[var]) # 'spam'\n" +"\n" +" var.set('ham')\n" +"\n" +" # 在将 'var' 设为 'ham' 之后:\n" +" print(var.get()) # 'ham'\n" +" print(ctx[var]) # 'ham'\n" +"\n" +"# 'main' 函数对 'var' 的任何修改\n" +"# 都将包含在 'ctx' 中。\n" +"ctx.run(main)\n" +"\n" +"# 'main()' 函数是在 'ctx' 上下文中运行的,\n" +"# 因此对 'var' 的修改将包含在其中:\n" +"print(ctx[var]) # 'ham'\n" +"\n" +"# 不过,在 'ctx' 之外,'var' 仍为 'spam':\n" +"print(var.get()) # 'spam'" + +#: ../../library/contextvars.rst:266 +msgid "Return a shallow copy of the context object." +msgstr "返回此上下文对象的浅拷贝。" + +#: ../../library/contextvars.rst:270 +msgid "" +"Return ``True`` if the *context* has a value for *var* set; return ``False``" +" otherwise." +msgstr "如果 *context* 中设置了 *var* 的值,返回 ``True``,否则返回 ``False``。" + +#: ../../library/contextvars.rst:275 +msgid "" +"Return the value of the *var* :class:`ContextVar` variable. If the variable " +"is not set in the context object, a :exc:`KeyError` is raised." +msgstr "" +"返回 *var* :class:`ContextVar` 变量的值。如果上下文对象中未设置该变量,则抛出 :exc:`KeyError` 异常。" + +#: ../../library/contextvars.rst:281 +msgid "" +"Return the value for *var* if *var* has the value in the context object. " +"Return *default* otherwise. If *default* is not given, return ``None``." +msgstr "" +"如果 *var* 在上下文对象中具有值则返回 *var* 的值。 在其他情况下返回 *default*。 如果未给出 *default* 则返回 " +"``None``。" + +#: ../../library/contextvars.rst:287 +msgid "Return an iterator over the variables stored in the context object." +msgstr "返回一个存储在上下文对象中的变量的迭代器。" + +#: ../../library/contextvars.rst:292 +msgid "Return the number of variables set in the context object." +msgstr "返回上下文对象中所设的变量的数量。" + +#: ../../library/contextvars.rst:296 +msgid "Return a list of all variables in the context object." +msgstr "返回上下文对象中的所有变量的列表。" + +#: ../../library/contextvars.rst:300 +msgid "Return a list of all variables' values in the context object." +msgstr "返回上下文对象中所有变量值的列表。" + +#: ../../library/contextvars.rst:305 +msgid "" +"Return a list of 2-tuples containing all variables and their values in the " +"context object." +msgstr "返回包含上下文对象中所有变量及其值的 2 元组的列表。" + +#: ../../library/contextvars.rst:310 +msgid "asyncio support" +msgstr "asyncio 支持" + +#: ../../library/contextvars.rst:312 +msgid "" +"Context variables are natively supported in :mod:`asyncio` and are ready to " +"be used without any extra configuration. For example, here is a simple echo" +" server, that uses a context variable to make the address of a remote client" +" available in the Task that handles that client::" +msgstr "" +"上下文变量在 :mod:`asyncio` 中有原生的支持并且无需任何额外配置即可被使用。 " +"例如,以下是一个简单的回显服务器,它使用上下文变量来让远程客户端的地址在处理该客户端的 Task 中可用::" + +#: ../../library/contextvars.rst:318 +msgid "" +"import asyncio\n" +"import contextvars\n" +"\n" +"client_addr_var = contextvars.ContextVar('client_addr')\n" +"\n" +"def render_goodbye():\n" +" # The address of the currently handled client can be accessed\n" +" # without passing it explicitly to this function.\n" +"\n" +" client_addr = client_addr_var.get()\n" +" return f'Good bye, client @ {client_addr}\\r\\n'.encode()\n" +"\n" +"async def handle_request(reader, writer):\n" +" addr = writer.transport.get_extra_info('socket').getpeername()\n" +" client_addr_var.set(addr)\n" +"\n" +" # In any code that we call, it is now possible to get the\n" +" # client's address by calling 'client_addr_var.get()'.\n" +"\n" +" while True:\n" +" line = await reader.readline()\n" +" print(line)\n" +" if not line.strip():\n" +" break\n" +"\n" +" writer.write(b'HTTP/1.1 200 OK\\r\\n') # status line\n" +" writer.write(b'\\r\\n') # headers\n" +" writer.write(render_goodbye()) # body\n" +" writer.close()\n" +"\n" +"async def main():\n" +" srv = await asyncio.start_server(\n" +" handle_request, '127.0.0.1', 8081)\n" +"\n" +" async with srv:\n" +" await srv.serve_forever()\n" +"\n" +"asyncio.run(main())\n" +"\n" +"# To test it you can use telnet or curl:\n" +"# telnet 127.0.0.1 8081\n" +"# curl 127.0.0.1:8081" +msgstr "" diff --git a/library/copy.po b/library/copy.po new file mode 100644 index 0000000000..e9404ce5b5 --- /dev/null +++ b/library/copy.po @@ -0,0 +1,221 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-31 16:04+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/copy.rst:2 +msgid ":mod:`!copy` --- Shallow and deep copy operations" +msgstr ":mod:`!copy` --- 浅层及深层拷贝操作" + +#: ../../library/copy.rst:7 +msgid "**Source code:** :source:`Lib/copy.py`" +msgstr "**源代码:** :source:`Lib/copy.py`" + +#: ../../library/copy.rst:11 +msgid "" +"Assignment statements in Python do not copy objects, they create bindings " +"between a target and an object. For collections that are mutable or contain " +"mutable items, a copy is sometimes needed so one can change one copy without" +" changing the other. This module provides generic shallow and deep copy " +"operations (explained below)." +msgstr "" +"Python " +"的赋值语句不复制对象,而是创建目标和对象的绑定关系。对于自身可变,或包含可变项的集合,有时要生成副本用于改变操作,而不必改变原始对象。本模块提供了通用的浅层复制和深层复制操作,(如下所述)。" + +#: ../../library/copy.rst:18 +msgid "Interface summary:" +msgstr "接口摘要:" + +#: ../../library/copy.rst:22 +msgid "Return a shallow copy of *obj*." +msgstr "返回 *obj* 的浅拷贝。" + +#: ../../library/copy.rst:27 +msgid "Return a deep copy of *obj*." +msgstr "返回 *obj* 的深拷贝。" + +#: ../../library/copy.rst:32 +msgid "" +"Creates a new object of the same type as *obj*, replacing fields with values" +" from *changes*." +msgstr "新建一个与 *obj* 类型相同的对象,使用来自 *changes* 的值替换字段。" + +#: ../../library/copy.rst:40 +msgid "Raised for module specific errors." +msgstr "针对模块特定错误引发。" + +#: ../../library/copy.rst:44 +msgid "" +"The difference between shallow and deep copying is only relevant for " +"compound objects (objects that contain other objects, like lists or class " +"instances):" +msgstr "浅层与深层复制的区别仅与复合对象(即包含列表或类的实例等其他对象的对象)相关:" + +#: ../../library/copy.rst:47 +msgid "" +"A *shallow copy* constructs a new compound object and then (to the extent " +"possible) inserts *references* into it to the objects found in the original." +msgstr "*浅层复制* 构造一个新的复合对象,然后(在尽可能的范围内)将原始对象中找到的对象的 *引用* 插入其中。" + +#: ../../library/copy.rst:50 +msgid "" +"A *deep copy* constructs a new compound object and then, recursively, " +"inserts *copies* into it of the objects found in the original." +msgstr "*深层复制* 构造一个新的复合对象,然后,递归地将在原始对象里找到的对象的 *副本* 插入其中。" + +#: ../../library/copy.rst:53 +msgid "" +"Two problems often exist with deep copy operations that don't exist with " +"shallow copy operations:" +msgstr "深层复制操作通常存在两个问题, 而浅层复制操作并不存在这些问题:" + +#: ../../library/copy.rst:56 +msgid "" +"Recursive objects (compound objects that, directly or indirectly, contain a " +"reference to themselves) may cause a recursive loop." +msgstr "递归对象 (直接或间接包含对自身引用的复合对象) 可能会导致递归循环。" + +#: ../../library/copy.rst:59 +msgid "" +"Because deep copy copies everything it may copy too much, such as data which" +" is intended to be shared between copies." +msgstr "由于深层复制会复制所有内容,因此可能会过多复制(例如本应该在副本之间共享的数据)。" + +#: ../../library/copy.rst:62 +msgid "The :func:`deepcopy` function avoids these problems by:" +msgstr ":func:`deepcopy` 函数用以下方式避免了这些问题:" + +#: ../../library/copy.rst:64 +msgid "" +"keeping a ``memo`` dictionary of objects already copied during the current " +"copying pass; and" +msgstr "保留在当前复制过程中已复制的对象的 \"备忘录\" (``memo``) 字典;以及" + +#: ../../library/copy.rst:67 +msgid "" +"letting user-defined classes override the copying operation or the set of " +"components copied." +msgstr "允许用户定义的类重写复制操作或复制的组件集合。" + +#: ../../library/copy.rst:70 +msgid "" +"This module does not copy types like module, method, stack trace, stack " +"frame, file, socket, window, or any similar types. It does \"copy\" " +"functions and classes (shallow and deeply), by returning the original object" +" unchanged; this is compatible with the way these are treated by the " +":mod:`pickle` module." +msgstr "" +"此模块不会复制模块、方法、栈追踪、栈帧、文件、套接字、窗口以及任何相似的类型。 它会通过不加修改地返回原始对象来(浅层或深层地)“复制”函数和类;这与 " +":mod:`pickle` 模块处理这类问题的方式是兼容的。" + +#: ../../library/copy.rst:75 +msgid "" +"Shallow copies of many collections can be made using the corresponding " +":meth:`!copy` method (such as :meth:`list.copy`, :meth:`dict.copy` or " +":meth:`set.copy`), and of sequences (such as lists or bytearrays) by making " +"a slice of the entire sequence (``sequence[:]``). However, these methods and" +" slicing can create an instance of the base type when copying an instance of" +" a subclass, whereas :func:`copy.copy` normally returns an instance of the " +"same type." +msgstr "" + +#: ../../library/copy.rst:85 +msgid "" +"Classes can use the same interfaces to control copying that they use to " +"control pickling. See the description of module :mod:`pickle` for " +"information on these methods. In fact, the :mod:`!copy` module uses the " +"registered pickle functions from the :mod:`copyreg` module." +msgstr "" +"类可以使用与控制 pickle 操作相同的接口来控制拷贝操作。 关于这些方法的描述信息请参考 :mod:`pickle` 模块。 " +"实际上,:mod:`!copy` 模块就是使用从 :mod:`copyreg` 模块中注册的 pickle 函数。" + +#: ../../library/copy.rst:96 +msgid "" +"In order for a class to define its own copy implementation, it can define " +"special methods :meth:`~object.__copy__` and :meth:`~object.__deepcopy__`." +msgstr "" +"为了让一个类能够定义它自己的拷贝实现,它可以定义特殊方法 :meth:`~object.__copy__` 和 " +":meth:`~object.__deepcopy__`。" + +#: ../../library/copy.rst:102 +msgid "" +"Called to implement the shallow copy operation; no additional arguments are " +"passed." +msgstr "调用以实现浅拷贝操作;无须传入任何额外参数。" + +#: ../../library/copy.rst:108 +msgid "" +"Called to implement the deep copy operation; it is passed one argument, the " +"*memo* dictionary. If the ``__deepcopy__`` implementation needs to make a " +"deep copy of a component, it should call the :func:`~copy.deepcopy` function" +" with the component as first argument and the *memo* dictionary as second " +"argument. The *memo* dictionary should be treated as an opaque object." +msgstr "" +"调用以实现深拷贝操作;它将传入一个参数,即 *memo* 字典。 如果 ``__deepcopy__`` 实现需要创建一个组件的深拷贝,它应当调用 " +":func:`~copy.deepcopy` 函数并将该组件作为第一个参数而将 *memo* 字典作为第二个参数。 *memo* " +"字典应当被当作不透明对象来处理。" + +#: ../../library/copy.rst:118 +msgid "" +"Function :func:`!copy.replace` is more limited than :func:`~copy.copy` and " +":func:`~copy.deepcopy`, and only supports named tuples created by " +":func:`~collections.namedtuple`, :mod:`dataclasses`, and other classes which" +" define method :meth:`~object.__replace__`." +msgstr "" +"函数 :func:`!copy.replace` 相比 :func:`~copy.copy` 和 :func:`~copy.deepcopy` " +"受到更多的限制,并且仅支持由 :func:`~collections.namedtuple` 创建的命名元组, :mod:`dataclasses` " +"及其他定义了 :meth:`~object.__replace__` 方法的类。" + +#: ../../library/copy.rst:126 +msgid "" +"This method should create a new object of the same type, replacing fields " +"with values from *changes*." +msgstr "此方法应当新建一个具有相同类型的对象,使用来自 *changes* 的值替换字段。" + +#: ../../library/copy.rst:134 +msgid "Module :mod:`pickle`" +msgstr "模块 :mod:`pickle`" + +#: ../../library/copy.rst:135 +msgid "" +"Discussion of the special methods used to support object state retrieval and" +" restoration." +msgstr "讨论了支持对象状态检索和恢复的特殊方法。" + +#: ../../library/copy.rst:83 +msgid "module" +msgstr "module" + +#: ../../library/copy.rst:83 +msgid "pickle" +msgstr "pickle" + +#: ../../library/copy.rst:90 +msgid "__copy__() (copy protocol)" +msgstr "__copy__() (拷贝协议)" + +#: ../../library/copy.rst:90 +msgid "__deepcopy__() (copy protocol)" +msgstr "__deepcopy__() (拷贝协议)" + +#: ../../library/copy.rst:115 +msgid "__replace__() (replace protocol)" +msgstr "__replace__() (replace 协议)" diff --git a/library/copyreg.po b/library/copyreg.po new file mode 100644 index 0000000000..5552667cf7 --- /dev/null +++ b/library/copyreg.po @@ -0,0 +1,97 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/copyreg.rst:2 +msgid ":mod:`!copyreg` --- Register :mod:`!pickle` support functions" +msgstr ":mod:`!copyreg` --- 注册 :mod:`!pickle` 支持函数" + +#: ../../library/copyreg.rst:7 +msgid "**Source code:** :source:`Lib/copyreg.py`" +msgstr "**源代码:** :source:`Lib/copyreg.py`" + +#: ../../library/copyreg.rst:15 +msgid "" +"The :mod:`!copyreg` module offers a way to define functions used while " +"pickling specific objects. The :mod:`pickle` and :mod:`copy` modules use " +"those functions when pickling/copying those objects. The module provides " +"configuration information about object constructors which are not classes. " +"Such constructors may be factory functions or class instances." +msgstr "" +":mod:`!copyreg` 模块提供了一种可在封存特定对象时使用的定义函数方式。 :mod:`pickle` 和 :mod:`copy` " +"模块会在封存/拷贝特定对象时使用这些函数。 此模块提供了非类对象构造器的相关配置信息。 这样的构造器可以是工厂函数或类实例。" + +#: ../../library/copyreg.rst:24 +msgid "" +"Declares *object* to be a valid constructor. If *object* is not callable " +"(and hence not valid as a constructor), raises :exc:`TypeError`." +msgstr "" +"将 *object* 声明为一个有效的构造器。 如果 *object* 是不可调用的(因而不是一个有效的构造器)则会引发 " +":exc:`TypeError`。" + +#: ../../library/copyreg.rst:30 +msgid "" +"Declares that *function* should be used as a \"reduction\" function for " +"objects of type *type*. *function* must return either a string or a tuple " +"containing between two and six elements. See the " +":attr:`~pickle.Pickler.dispatch_table` for more details on the interface of " +"*function*." +msgstr "" +"声明 *function* 应当被用作 *type* 类型的对象的“归约”函数。 *function* 必须返回一个字符串或包含二至六个元素的元组。 " +"请参阅 :attr:`~pickle.Pickler.dispatch_table` 了解有关 *function* 的接口的更多细节。" + +#: ../../library/copyreg.rst:35 +msgid "" +"The *constructor_ob* parameter is a legacy feature and is now ignored, but " +"if passed it must be a callable." +msgstr "*constructor_ob* 形参是一个旧式特性并且现在会被忽略,但如果传入则它必须为一个可调用对象。" + +#: ../../library/copyreg.rst:38 +msgid "" +"Note that the :attr:`~pickle.Pickler.dispatch_table` attribute of a pickler " +"object or subclass of :class:`pickle.Pickler` can also be used for declaring" +" reduction functions." +msgstr "" +"请注意一个 pickler 或 :class:`pickle.Pickler` 的子类的 " +":attr:`~pickle.Pickler.dispatch_table` 属性也可以被用来声明归约函数。" + +#: ../../library/copyreg.rst:43 +msgid "Example" +msgstr "示例" + +#: ../../library/copyreg.rst:45 +msgid "" +"The example below would like to show how to register a pickle function and " +"how it will be used:" +msgstr "以下示例将会显示如何注册一个封存函数,以及如何来使用它:" + +#: ../../library/copyreg.rst:9 +msgid "module" +msgstr "module" + +#: ../../library/copyreg.rst:9 +msgid "pickle" +msgstr "pickle" + +#: ../../library/copyreg.rst:9 +msgid "copy" +msgstr "copy" diff --git a/library/crypt.po b/library/crypt.po new file mode 100644 index 0000000000..ab0a7f9779 --- /dev/null +++ b/library/crypt.po @@ -0,0 +1,53 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/crypt.rst:2 +msgid ":mod:`!crypt` --- Function to check Unix passwords" +msgstr ":mod:`!crypt` --- 验证 Unix 口令的函数" + +#: ../../library/crypt.rst:10 +msgid "" +"This module is no longer part of the Python standard library. It was " +":ref:`removed in Python 3.13 ` after being deprecated in" +" Python 3.11. The removal was decided in :pep:`594`." +msgstr "" +"此模块已不再是 Python 标准库的一部分。 它在 Python 3.11 中被弃用后又在 :ref:`Python 3.13 中被移除 " +"`。 移除计划是在 :pep:`594` 确定的。" + +#: ../../library/crypt.rst:14 +msgid "" +"Applications can use the :mod:`hashlib` module from the standard library. " +"Other possible replacements are third-party libraries from PyPI: " +":pypi:`legacycrypt`, :pypi:`bcrypt`, or :pypi:`argon2-cffi`. These are not " +"supported or maintained by the Python core team." +msgstr "" +"应用程序可以使用标准库的 :mod:`hashlib` 模块。 其他可能的替代是来自 PyPI 的第三方库: :pypi:`legacycrypt`, " +":pypi:`bcrypt` 或 :pypi:`argon2-cffi`。 它们不被 Python 核心团队所支持或维护。" + +#: ../../library/crypt.rst:19 +msgid "" +"The last version of Python that provided the :mod:`!crypt` module was " +"`Python 3.12 `_." +msgstr "" +"提供 :mod:`!crypt` 模块的最后一个 Python 版本是 `Python 3.12 " +"`_。" diff --git a/library/crypto.po b/library/crypto.po new file mode 100644 index 0000000000..d108eef2c8 --- /dev/null +++ b/library/crypto.po @@ -0,0 +1,37 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/crypto.rst:5 +msgid "Cryptographic Services" +msgstr "加密服务" + +#: ../../library/crypto.rst:9 +msgid "" +"The modules described in this chapter implement various algorithms of a " +"cryptographic nature. They are available at the discretion of the " +"installation. Here's an overview:" +msgstr "本章中介绍的模块实现了多种加密性质的算法。 它们可在安装时选择使用。 以下是内容概要:" + +#: ../../library/crypto.rst:7 +msgid "cryptography" +msgstr "密码学" diff --git a/library/csv.po b/library/csv.po new file mode 100644 index 0000000000..bde9623158 --- /dev/null +++ b/library/csv.po @@ -0,0 +1,1011 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/csv.rst:2 +msgid ":mod:`!csv` --- CSV File Reading and Writing" +msgstr ":mod:`!csv` --- CSV 文件读写" + +#: ../../library/csv.rst:9 +msgid "**Source code:** :source:`Lib/csv.py`" +msgstr "**源代码:** :source:`Lib/csv.py`" + +#: ../../library/csv.rst:17 +msgid "" +"The so-called CSV (Comma Separated Values) format is the most common import " +"and export format for spreadsheets and databases. CSV format was used for " +"many years prior to attempts to describe the format in a standardized way in" +" :rfc:`4180`. The lack of a well-defined standard means that subtle " +"differences often exist in the data produced and consumed by different " +"applications. These differences can make it annoying to process CSV files " +"from multiple sources. Still, while the delimiters and quoting characters " +"vary, the overall format is similar enough that it is possible to write a " +"single module which can efficiently manipulate such data, hiding the details" +" of reading and writing the data from the programmer." +msgstr "" +"CSV (Comma Separated Values) 格式是电子表格和数据库中最常见的输入、输出文件格式。在 :rfc:`4180` " +"规范推出的很多年前,CSV 格式就已经被开始使用了,由于当时并没有合理的标准,不同应用程序读写的数据会存在细微的差别。这种差别让处理多个来源的 CSV " +"文件变得困难。但尽管分隔符会变化,此类文件的大致格式是相似的,所以编写一个单独的模块以高效处理此类数据,将程序员从读写数据的繁琐细节中解放出来是有可能的。" + +#: ../../library/csv.rst:28 +msgid "" +"The :mod:`!csv` module implements classes to read and write tabular data in " +"CSV format. It allows programmers to say, \"write this data in the format " +"preferred by Excel,\" or \"read data from this file which was generated by " +"Excel,\" without knowing the precise details of the CSV format used by " +"Excel. Programmers can also describe the CSV formats understood by other " +"applications or define their own special-purpose CSV formats." +msgstr "" + +#: ../../library/csv.rst:35 +msgid "" +"The :mod:`!csv` module's :class:`reader` and :class:`writer` objects read " +"and write sequences. Programmers can also read and write data in dictionary" +" form using the :class:`DictReader` and :class:`DictWriter` classes." +msgstr "" + +#: ../../library/csv.rst:41 +msgid ":pep:`305` - CSV File API" +msgstr ":pep:`305` - CSV 文件 API" + +#: ../../library/csv.rst:42 +msgid "" +"The Python Enhancement Proposal which proposed this addition to Python." +msgstr "《Python 增强提议》提出了对 Python 的这一补充。" + +#: ../../library/csv.rst:48 +msgid "Module Contents" +msgstr "模块内容" + +#: ../../library/csv.rst:50 +msgid "The :mod:`!csv` module defines the following functions:" +msgstr "" + +#: ../../library/csv.rst:58 +msgid "" +"Return a :ref:`reader object ` that will process lines from " +"the given *csvfile*. A csvfile must be an iterable of strings, each in the " +"reader's defined csv format. A csvfile is most commonly a file-like object " +"or list. If *csvfile* is a file object, it should be opened with " +"``newline=''``. [1]_ An optional *dialect* parameter can be given which is " +"used to define a set of parameters specific to a particular CSV dialect. It" +" may be an instance of a subclass of the :class:`Dialect` class or one of " +"the strings returned by the :func:`list_dialects` function. The other " +"optional *fmtparams* keyword arguments can be given to override individual " +"formatting parameters in the current dialect. For full details about the " +"dialect and formatting parameters, see section :ref:`csv-fmt-params`." +msgstr "" +"返回一个 :ref:`reader 对象 `,该对象将处理给定 *csvfile* 中的行。 csvfile " +"必须是一个包含字符串的可迭代对象,使用 reader 所定义的 csv 格式。 csvfile 通常是一个文件型对象或列表。 如果 *csvfile* " +"是一个文件对象,则打开它时应设置 ``newline=''``. [1]_ 给定可选 *dialect* 形参将被用于定义一组专属于特定 CSV " +"变种的形参。 它可以是 :class:`Dialect` 类的子类的实例,或是 :func:`list_dialects` 函数所返回的字符串之一。 " +"另一个可选关键字形参 *fmtparams* 可被用来覆盖当前变种中的单个格式形参。 有关变种和格式设置形参的完整细节,请参阅 :ref:`csv-" +"fmt-params` 一节。" + +#: ../../library/csv.rst:72 +msgid "" +"Each row read from the csv file is returned as a list of strings. No " +"automatic data type conversion is performed unless the " +":data:`QUOTE_NONNUMERIC` format option is specified (in which case unquoted " +"fields are transformed into floats)." +msgstr "" +"从 csv 文件读取的每一行都将返回为一个字符串列表。 除非指定了 :data:`QUOTE_NONNUMERIC` " +"格式选项(在这种情况下未加引号的字段会被转换为浮点数),否则不会执行自动数据类型转换。" + +#: ../../library/csv.rst:76 ../../library/csv.rst:106 +#: ../../library/csv.rst:182 ../../library/csv.rst:220 +msgid "A short usage example::" +msgstr "一个简短的用法示例::" + +#: ../../library/csv.rst:78 +msgid "" +">>> import csv\n" +">>> with open('eggs.csv', newline='') as csvfile:\n" +"... spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')\n" +"... for row in spamreader:\n" +"... print(', '.join(row))\n" +"Spam, Spam, Spam, Spam, Spam, Baked Beans\n" +"Spam, Lovely Spam, Wonderful Spam" +msgstr "" +">>> import csv\n" +">>> with open('eggs.csv', newline='') as csvfile:\n" +"... spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')\n" +"... for row in spamreader:\n" +"... print(', '.join(row))\n" +"Spam, Spam, Spam, Spam, Spam, Baked Beans\n" +"Spam, Lovely Spam, Wonderful Spam" + +#: ../../library/csv.rst:89 +msgid "" +"Return a writer object responsible for converting the user's data into " +"delimited strings on the given file-like object. *csvfile* can be any " +"object with a :meth:`~io.TextIOBase.write` method. If *csvfile* is a file " +"object, it should be opened with ``newline=''`` [1]_. An optional *dialect*" +" parameter can be given which is used to define a set of parameters specific" +" to a particular CSV dialect. It may be an instance of a subclass of the " +":class:`Dialect` class or one of the strings returned by the " +":func:`list_dialects` function. The other optional *fmtparams* keyword " +"arguments can be given to override individual formatting parameters in the " +"current dialect. For full details about dialects and formatting parameters," +" see the :ref:`csv-fmt-params` section. To make it as easy as possible to " +"interface with modules which implement the DB API, the value :const:`None` " +"is written as the empty string. While this isn't a reversible " +"transformation, it makes it easier to dump SQL NULL data values to CSV files" +" without preprocessing the data returned from a ``cursor.fetch*`` call. All " +"other non-string data are stringified with :func:`str` before being written." +msgstr "" +"返回一个 writer 对象,该对象负责将用户的数据在给定的文件型对象上转换为带分隔符的字符串。 *csvfile* 可以是任何具有 " +":meth:`~io.TextIOBase.write` 方法的对象。 如果 *csvfile* 是一个文件对象,则打开它时应使用 " +"``newline=''`` [1]_。 可以给出可选的 *dialect* 形参用来定义一组特定 CSV 变种专属的形参。 它可以是 " +":class:`Dialect` 类的某个子类的实例或是 :func:`list_dialects` 函数所返回的字符串之一。 还可以给出另一个可选的 " +"*fmtparams* 关键字参数来覆盖当前变种中的单个格式化形参。 有关各个变种和格式化形参的完整细节,请参阅 :ref:`csv-fmt-" +"params` 部分。 为了尽量简化与实现 DB API 的模块之间的接口,可以将 :const:`None` 作为空字符串写入。 " +"虽然这个转换是不可逆的,但它可以简化 SQL NULL 数据值到 CSV 文件的转储而无需预处理从 ``cursor.fetch*`` 调用返回的数据。" +" 在被写入之前所有其他非字符串数据都会先用 :func:`str` 来转换为字符串。" + +#: ../../library/csv.rst:108 +msgid "" +"import csv\n" +"with open('eggs.csv', 'w', newline='') as csvfile:\n" +" spamwriter = csv.writer(csvfile, delimiter=' ',\n" +" quotechar='|', quoting=csv.QUOTE_MINIMAL)\n" +" spamwriter.writerow(['Spam'] * 5 + ['Baked Beans'])\n" +" spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])" +msgstr "" +"import csv\n" +"with open('eggs.csv', 'w', newline='') as csvfile:\n" +" spamwriter = csv.writer(csvfile, delimiter=' ',\n" +" quotechar='|', quoting=csv.QUOTE_MINIMAL)\n" +" spamwriter.writerow(['Spam'] * 5 + ['Baked Beans'])\n" +" spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])" + +#: ../../library/csv.rst:118 +msgid "" +"Associate *dialect* with *name*. *name* must be a string. The dialect can " +"be specified either by passing a sub-class of :class:`Dialect`, or by " +"*fmtparams* keyword arguments, or both, with keyword arguments overriding " +"parameters of the dialect. For full details about dialects and formatting " +"parameters, see section :ref:`csv-fmt-params`." +msgstr "" +"将 *dialect* 与 *name* 关联起来。 *name* 必须是字符串。 变种的指定可以通过传入一个 :class:`Dialect` " +"的子类,或通过 *fmtparams* 关键字参数,或是两者同时传入,此时关键字参数会覆盖 dialect 形参。 " +"有关变种和格式化形参的完整细节,请参阅 :ref:`csv-fmt-params` 部分。" + +#: ../../library/csv.rst:127 +msgid "" +"Delete the dialect associated with *name* from the dialect registry. An " +":exc:`Error` is raised if *name* is not a registered dialect name." +msgstr "从变种注册表中删除 *name* 对应的变种。如果 *name* 不是已注册的变种名称,则抛出 :exc:`Error` 异常。" + +#: ../../library/csv.rst:133 +msgid "" +"Return the dialect associated with *name*. An :exc:`Error` is raised if " +"*name* is not a registered dialect name. This function returns an immutable" +" :class:`Dialect`." +msgstr "" +"返回 *name* 对应的变种。如果 *name* 不是已注册的变种名称,则抛出 :exc:`Error` 异常。该函数返回的是不可变的 " +":class:`Dialect` 对象。" + +#: ../../library/csv.rst:139 +msgid "Return the names of all registered dialects." +msgstr "返回所有已注册变种的名称。" + +#: ../../library/csv.rst:145 +msgid "" +"Returns the current maximum field size allowed by the parser. If *new_limit*" +" is given, this becomes the new limit." +msgstr "返回解析器当前允许的最大字段大小。如果指定了 *new_limit*,则它将成为新的最大字段大小。" + +#: ../../library/csv.rst:149 +msgid "The :mod:`!csv` module defines the following classes:" +msgstr "" + +#: ../../library/csv.rst:154 +msgid "" +"Create an object that operates like a regular reader but maps the " +"information in each row to a :class:`dict` whose keys are given by the " +"optional *fieldnames* parameter." +msgstr "" +"创建一个对象,该对象在操作上类似于常规 reader,但是将每行中的信息映射到一个 :class:`dict`,该 dict 的键由 " +"*fieldnames* 可选参数给出。" + +#: ../../library/csv.rst:158 +msgid "" +"The *fieldnames* parameter is a :term:`sequence`. If *fieldnames* is " +"omitted, the values in the first row of file *f* will be used as the " +"fieldnames and will be omitted from the results. If *fieldnames* is " +"provided, they will be used and the first row will be included in the " +"results. Regardless of how the fieldnames are determined, the dictionary " +"preserves their original ordering." +msgstr "" +"*fieldnames* 形参是一个 :term:`sequence`。 如果省略 *fieldnames*,则文件 *f* " +"第一行中的值将用作字段名并将从结果中去除。 如果提供了 *fieldnames*,它们将被使用而第一行将包括在结果中。 " +"无论字段名是如何确定的,字典都将保留其原始顺序。" + +#: ../../library/csv.rst:165 +msgid "" +"If a row has more fields than fieldnames, the remaining data is put in a " +"list and stored with the fieldname specified by *restkey* (which defaults to" +" ``None``). If a non-blank row has fewer fields than fieldnames, the " +"missing values are filled-in with the value of *restval* (which defaults to " +"``None``)." +msgstr "" +"如果某一行中的字段多于字段名,则剩余数据会被放入一个列表,并与 *restkey* 所指定的字段名 (默认为 ``None``) 一起保存。 " +"如果某个非空白行的字段少于字段名,则缺失的值会使用 *restval* 的值来填充 (默认为 ``None``)。" + +#: ../../library/csv.rst:171 +msgid "" +"All other optional or keyword arguments are passed to the underlying " +":class:`reader` instance." +msgstr "所有其他可选或关键字参数都传递给底层的 :class:`reader` 实例。" + +#: ../../library/csv.rst:174 ../../library/csv.rst:218 +msgid "" +"If the argument passed to *fieldnames* is an iterator, it will be coerced to" +" a :class:`list`." +msgstr "如果传给 *fieldnames* 的参数是一个迭代器,它将被强制转换为 :class:`list`。" + +#: ../../library/csv.rst:176 +msgid "Returned rows are now of type :class:`OrderedDict`." +msgstr "返回的行现在的类型是 :class:`OrderedDict`。" + +#: ../../library/csv.rst:179 +msgid "Returned rows are now of type :class:`dict`." +msgstr "现在,返回的行是 :class:`dict` 类型。" + +#: ../../library/csv.rst:184 +msgid "" +">>> import csv\n" +">>> with open('names.csv', newline='') as csvfile:\n" +"... reader = csv.DictReader(csvfile)\n" +"... for row in reader:\n" +"... print(row['first_name'], row['last_name'])\n" +"...\n" +"Eric Idle\n" +"John Cleese\n" +"\n" +">>> print(row)\n" +"{'first_name': 'John', 'last_name': 'Cleese'}" +msgstr "" +">>> import csv\n" +">>> with open('names.csv', newline='') as csvfile:\n" +"... reader = csv.DictReader(csvfile)\n" +"... for row in reader:\n" +"... print(row['first_name'], row['last_name'])\n" +"...\n" +"Eric Idle\n" +"John Cleese\n" +"\n" +">>> print(row)\n" +"{'first_name': 'John', 'last_name': 'Cleese'}" + +#: ../../library/csv.rst:200 +msgid "" +"Create an object which operates like a regular writer but maps dictionaries " +"onto output rows. The *fieldnames* parameter is a :mod:`sequence " +"` of keys that identify the order in which values in the " +"dictionary passed to the :meth:`~csvwriter.writerow` method are written to " +"file *f*. The optional *restval* parameter specifies the value to be " +"written if the dictionary is missing a key in *fieldnames*. If the " +"dictionary passed to the :meth:`~csvwriter.writerow` method contains a key " +"not found in *fieldnames*, the optional *extrasaction* parameter indicates " +"what action to take. If it is set to ``'raise'``, the default value, a " +":exc:`ValueError` is raised. If it is set to ``'ignore'``, extra values in " +"the dictionary are ignored. Any other optional or keyword arguments are " +"passed to the underlying :class:`writer` instance." +msgstr "" +"创建一个对象,该对象在操作上类似常规 writer,但会将字典映射到输出行。 *fieldnames* 形参是一个由键组成的 :mod:`序列 " +"`,它指定字典中要传给 :meth:`~csvwriter.writerow` 方法并写入文件 *f* 的值的顺序。 " +"如果字典没有 *fieldnames* 中的键,则可选的 *restval* 形参将指明要写入的值。 如果传递给 " +":meth:`~csvwriter.writerow` 方法包含的键在 *fieldnames* 中找不到,则可选的 *extrasaction* " +"形参将指明要执行的操作。 如果将其设为默认值 ``'raise'``,则会引发 :exc:`ValueError`。 如果将其设为 " +"``'ignore'``,则字典中额外的值将被忽略。 任何其他可选或关键字参数都将被传递给下层的 :class:`writer` 实例。" + +#: ../../library/csv.rst:215 +msgid "" +"Note that unlike the :class:`DictReader` class, the *fieldnames* parameter " +"of the :class:`DictWriter` class is not optional." +msgstr "" +"注意,与 :class:`DictReader` 类不同,:class:`DictWriter` 类的 *fieldnames* 参数不是可选参数。" + +#: ../../library/csv.rst:222 +msgid "" +"import csv\n" +"\n" +"with open('names.csv', 'w', newline='') as csvfile:\n" +" fieldnames = ['first_name', 'last_name']\n" +" writer = csv.DictWriter(csvfile, fieldnames=fieldnames)\n" +"\n" +" writer.writeheader()\n" +" writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})\n" +" writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'})\n" +" writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})" +msgstr "" +"import csv\n" +"\n" +"with open('names.csv', 'w', newline='') as csvfile:\n" +" fieldnames = ['first_name', 'last_name']\n" +" writer = csv.DictWriter(csvfile, fieldnames=fieldnames)\n" +"\n" +" writer.writeheader()\n" +" writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})\n" +" writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'})\n" +" writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})" + +#: ../../library/csv.rst:236 +msgid "" +"The :class:`Dialect` class is a container class whose attributes contain " +"information for how to handle doublequotes, whitespace, delimiters, etc. Due" +" to the lack of a strict CSV specification, different applications produce " +"subtly different CSV data. :class:`Dialect` instances define how " +":class:`reader` and :class:`writer` instances behave." +msgstr "" +":class:`Dialect` 类是一个容器类,其属性包含有如何处理双引号、空白符、分隔符等的信息。 由于缺少严格的 CSV " +"规格描述,不同的应用程序会产生略有差别的 CSV 数据。 :class:`Dialect` 实例定义了 :class:`reader` 和 " +":class:`writer` 实例将具有怎样的行为。" + +#: ../../library/csv.rst:242 +msgid "" +"All available :class:`Dialect` names are returned by :func:`list_dialects`, " +"and they can be registered with specific :class:`reader` and :class:`writer`" +" classes through their initializer (``__init__``) functions like this::" +msgstr "" +"所有可用的 :class:`Dialect` 名称会由 :func:`list_dialects` 返回,并且它们可由特定的 " +":class:`reader` 和 :class:`writer` 类通过它们的初始化函数 (``__init__``) 来注册,例如::" + +#: ../../library/csv.rst:246 +msgid "" +"import csv\n" +"\n" +"with open('students.csv', 'w', newline='') as csvfile:\n" +" writer = csv.writer(csvfile, dialect='unix')" +msgstr "" +"import csv\n" +"\n" +"with open('students.csv', 'w', newline='') as csvfile:\n" +" writer = csv.writer(csvfile, dialect='unix')" + +#: ../../library/csv.rst:254 +msgid "" +"The :class:`excel` class defines the usual properties of an Excel-generated " +"CSV file. It is registered with the dialect name ``'excel'``." +msgstr ":class:`excel` 类定义了 Excel 生成的 CSV 文件的常规属性。它在变种注册表中的名称是 ``'excel'``。" + +#: ../../library/csv.rst:260 +msgid "" +"The :class:`excel_tab` class defines the usual properties of an Excel-" +"generated TAB-delimited file. It is registered with the dialect name " +"``'excel-tab'``." +msgstr "" +":class:`excel_tab` 类定义了 Excel 生成的、制表符分隔的 CSV 文件的常规属性。它在变种注册表中的名称是 ``'excel-" +"tab'``。" + +#: ../../library/csv.rst:266 +msgid "" +"The :class:`unix_dialect` class defines the usual properties of a CSV file " +"generated on UNIX systems, i.e. using ``'\\n'`` as line terminator and " +"quoting all fields. It is registered with the dialect name ``'unix'``." +msgstr "" +":class:`unix_dialect` 类定义了在 UNIX 系统上生成的 CSV 文件的常规属性,即使用 ``'\\n'`` " +"作为换行符,且所有字段都有引号包围。它在变种注册表中的名称是 ``'unix'``。" + +#: ../../library/csv.rst:275 +msgid "The :class:`Sniffer` class is used to deduce the format of a CSV file." +msgstr ":class:`Sniffer` 类用于推断 CSV 文件的格式。" + +#: ../../library/csv.rst:277 +msgid "The :class:`Sniffer` class provides two methods:" +msgstr ":class:`Sniffer` 类提供了两个方法:" + +#: ../../library/csv.rst:281 +msgid "" +"Analyze the given *sample* and return a :class:`Dialect` subclass reflecting" +" the parameters found. If the optional *delimiters* parameter is given, it " +"is interpreted as a string containing possible valid delimiter characters." +msgstr "" +"分析给定的 *sample* 并返回一个 :class:`Dialect` 子类,该子类中包含了分析出的格式参数。如果给出可选的 " +"*delimiters* 参数,则该参数会被解释为字符串,该字符串包含了可能的有效定界符。" + +#: ../../library/csv.rst:289 +msgid "" +"Analyze the sample text (presumed to be in CSV format) and return " +":const:`True` if the first row appears to be a series of column headers. " +"Inspecting each column, one of two key criteria will be considered to " +"estimate if the sample contains a header:" +msgstr "" +"分析 sample 文本(假定为 CSV 格式),如果发现其首行为一组列标题则返回 :const:`True`。 " +"在检查每一列时,将考虑是否满足两个关键标准之一来估计 sample 是否包含标题:" + +#: ../../library/csv.rst:294 +msgid "the second through n-th rows contain numeric values" +msgstr "第二至第 n 行包含数字值" + +#: ../../library/csv.rst:295 +msgid "" +"the second through n-th rows contain strings where at least one value's " +"length differs from that of the putative header of that column." +msgstr "第二至第 n 行包含字符串值,其中至少有一个值的长度与该列预期标题的长度不同。" + +#: ../../library/csv.rst:298 +msgid "" +"Twenty-one rows after the header are sampled; if more than half of the " +"columns + rows meet the criteria, :const:`True` is returned." +msgstr "对标题行之后的 21 行进行采样;如果超过半数的列和行满足条件,则返回 :const:`True`。" + +#: ../../library/csv.rst:303 +msgid "" +"This method is a rough heuristic and may produce both false positives and " +"negatives." +msgstr "此方法是一个粗略的启发式方式,有可能产生假正例和假反例。" + +#: ../../library/csv.rst:306 +msgid "An example for :class:`Sniffer` use::" +msgstr "使用 :class:`Sniffer` 的示例::" + +#: ../../library/csv.rst:308 +msgid "" +"with open('example.csv', newline='') as csvfile:\n" +" dialect = csv.Sniffer().sniff(csvfile.read(1024))\n" +" csvfile.seek(0)\n" +" reader = csv.reader(csvfile, dialect)\n" +" # ... process CSV file contents here ..." +msgstr "" +"with open('example.csv', newline='') as csvfile:\n" +" dialect = csv.Sniffer().sniff(csvfile.read(1024))\n" +" csvfile.seek(0)\n" +" reader = csv.reader(csvfile, dialect)\n" +" # ... 在此处理 CSV 文件内容 ..." + +#: ../../library/csv.rst:317 +msgid "The :mod:`!csv` module defines the following constants:" +msgstr "" + +#: ../../library/csv.rst:321 +msgid "Instructs :class:`writer` objects to quote all fields." +msgstr "指示 :class:`writer` 对象给所有字段加上引号。" + +#: ../../library/csv.rst:326 +msgid "" +"Instructs :class:`writer` objects to only quote those fields which contain " +"special characters such as *delimiter*, *quotechar*, ``'\\r'``, ``'\\n'`` or" +" any of the characters in *lineterminator*." +msgstr "" +"指示 :class:`writer` 对象仅对包含特殊字符如 *delimiter*, *quotechar*, ``'\\r'``, " +"``'\\n'`` 或 *lineterminator* 中的任何字符的字段加引号。" + +#: ../../library/csv.rst:333 +msgid "Instructs :class:`writer` objects to quote all non-numeric fields." +msgstr "指示 :class:`writer` 对象为所有非数字字段加上引号。" + +#: ../../library/csv.rst:335 +msgid "" +"Instructs :class:`reader` objects to convert all non-quoted fields to type " +":class:`float`." +msgstr "指示 :class:`reader` 对象将所有未加引号的字段转换为 :class:`float` 类型。" + +#: ../../library/csv.rst:338 +msgid "" +"Some numeric types, such as :class:`bool`, :class:`~fractions.Fraction`, or " +":class:`~enum.IntEnum`, have a string representation that cannot be " +"converted to :class:`float`. They cannot be read in the " +":data:`QUOTE_NONNUMERIC` and :data:`QUOTE_STRINGS` modes." +msgstr "" +"某些数字类型,如 :class:`bool`, :class:`~fractions.Fraction` 或 " +":class:`~enum.IntEnum`,具有不可被转换为 :class:`float` 的字符串表示形式。 它们无法在 " +":data:`QUOTE_NONNUMERIC` 和 :data:`QUOTE_STRINGS` 模式下被读取。" + +#: ../../library/csv.rst:346 +msgid "" +"Instructs :class:`writer` objects to never quote fields. When the current " +"*delimiter*, *quotechar*, *escapechar*, ``'\\r'``, ``'\\n'`` or any of the " +"characters in *lineterminator* occurs in output data it is preceded by the " +"current *escapechar* character. If *escapechar* is not set, the writer will " +"raise :exc:`Error` if any characters that require escaping are encountered. " +"Set *quotechar* to ``None`` to prevent its escaping." +msgstr "" +"指示 :class:`writer` 对象不对字段加引号。 在现有的 *delimiter*, *quotechar*, *escapechar*, " +"``'\\r'``, ``'\\n'`` 或 *lineterminator* 中的任何字符出现在输出数据中的时候它前面会添加当前的 " +"*escapechar*。 如果未设置*escapechar*,则在遇到任何需要转义的字符时 writer 都会引发 :exc:`Error`。 将 " +"*quotechar* 设为 ``None`` 以避免进行转义。" + +#: ../../library/csv.rst:354 +msgid "" +"Instructs :class:`reader` objects to perform no special processing of quote " +"characters." +msgstr "指示 :class:`reader` 对象不对引号字符执行特殊处理。" + +#: ../../library/csv.rst:358 +msgid "" +"Instructs :class:`writer` objects to quote all fields which are not " +"``None``. This is similar to :data:`QUOTE_ALL`, except that if a field " +"value is ``None`` an empty (unquoted) string is written." +msgstr "" +"指示 :class:`writer` 对象为所有不为 ``None`` 的字段加引号。 这类似于 " +":data:`QUOTE_ALL`,区别是如果一个字段值为 ``None`` 则会写入一个(不带引号的)空字符串。" + +#: ../../library/csv.rst:362 +msgid "" +"Instructs :class:`reader` objects to interpret an empty (unquoted) field as " +"``None`` and to otherwise behave as :data:`QUOTE_ALL`." +msgstr "" +"指示 :class:`reader` 对象将(不带引号的)空字段解读为 ``None`` 并在其他情况下采取与 :data:`QUOTE_ALL` " +"相同的行为。" + +#: ../../library/csv.rst:369 +msgid "" +"Instructs :class:`writer` objects to always place quotes around fields which" +" are strings. This is similar to :data:`QUOTE_NONNUMERIC`, except that if a" +" field value is ``None`` an empty (unquoted) string is written." +msgstr "" +"指示 :class:`writer` 对象总是为字符串字段加引号。 这类似于 :data:`QUOTE_NONNUMERIC`,区别是如果一个字段值为 " +"``None`` 则会写入一个(不带引号的)空字符串。" + +#: ../../library/csv.rst:373 +msgid "" +"Instructs :class:`reader` objects to interpret an empty (unquoted) string as" +" ``None`` and to otherwise behave as :data:`QUOTE_NONNUMERIC`." +msgstr "" +"指示 :class:`reader` 对象将(不带引号的)空字符串解读为 ``None`` 并在其他情况下采取与 " +":data:`QUOTE_NONNUMERIC` 相同的行为。" + +#: ../../library/csv.rst:378 +msgid "The :mod:`!csv` module defines the following exception:" +msgstr ":mod:`!csv` 模块定义了以下异常:" + +#: ../../library/csv.rst:383 +msgid "Raised by any of the functions when an error is detected." +msgstr "该异常可能由任何发生错误的函数抛出。" + +#: ../../library/csv.rst:388 +msgid "Dialects and Formatting Parameters" +msgstr "变种与格式参数" + +#: ../../library/csv.rst:390 +msgid "" +"To make it easier to specify the format of input and output records, " +"specific formatting parameters are grouped together into dialects. A " +"dialect is a subclass of the :class:`Dialect` class containing various " +"attributes describing the format of the CSV file. When creating " +":class:`reader` or :class:`writer` objects, the programmer can specify a " +"string or a subclass of the :class:`Dialect` class as the dialect parameter." +" In addition to, or instead of, the *dialect* parameter, the programmer can" +" also specify individual formatting parameters, which have the same names as" +" the attributes defined below for the :class:`Dialect` class." +msgstr "" +"为了更容易地指定输入和输出记录的格式,特定的多个格式化形参将组合成为不同的 dialect。 特定的 dialect 是 " +":class:`Dialect` 类的一个子类,它包含多个用于描述 CSV 文件的格式的属性。 当创建 :class:`reader` 或 " +":class:`writer` 对象时,程序员可以指定一个字符串或 :class:`Dialect` 类的子类作为 dialect 形参。 作为对 " +"*dialect* 形参的补充或替代,程序员还可以指定单独的格式化形参,它们的名称与 :class:`Dialect` 类所定义的以下属性相同。" + +#: ../../library/csv.rst:400 +msgid "Dialects support the following attributes:" +msgstr "Dialect 类支持以下属性:" + +#: ../../library/csv.rst:405 +msgid "" +"A one-character string used to separate fields. It defaults to ``','``." +msgstr "一个用于分隔字段的单字符,默认为 ``','``。" + +#: ../../library/csv.rst:410 +msgid "" +"Controls how instances of *quotechar* appearing inside a field should " +"themselves be quoted. When :const:`True`, the character is doubled. When " +":const:`False`, the *escapechar* is used as a prefix to the *quotechar*. It" +" defaults to :const:`True`." +msgstr "" +"控制出现在字段中的 *引号字符* 本身应如何被引出。当该属性为 :const:`True` 时,双写引号字符。如果该属性为 " +":const:`False`,则在 *引号字符* 的前面放置 *转义符*。默认值为 :const:`True`。" + +#: ../../library/csv.rst:415 +msgid "" +"On output, if *doublequote* is :const:`False` and no *escapechar* is set, " +":exc:`Error` is raised if a *quotechar* is found in a field." +msgstr "" +"在输出时,如果 *doublequote* 是 :const:`False`,且 *转义符* 未指定,且在字段中发现 *引号字符* 时,会抛出 " +":exc:`Error` 异常。" + +#: ../../library/csv.rst:421 +msgid "" +"A one-character string used by the writer to escape characters that require " +"escaping:" +msgstr "被 writer 用来对需要转义的字符进行转义的单字符字符串:" + +#: ../../library/csv.rst:424 +msgid "" +"the *delimiter*, the *quotechar*, ``'\\r'``, ``'\\n'`` and any of the " +"characters in *lineterminator* are escaped if *quoting* is set to " +":const:`QUOTE_NONE`;" +msgstr "" +"如果 *quoting* 被设为 :const:`QUOTE_NONE` 则 *delimiter*, *quotechar*, ``'\\r'``, " +"``'\\n'`` 以及 *lineterminator* 中的任何字符都会被转义;" + +#: ../../library/csv.rst:427 +msgid "the *quotechar* is escaped if *doublequote* is :const:`False`;" +msgstr "如果 *doublequote* 为 :const:`False` 则 *quotechar* 会被转义;" + +#: ../../library/csv.rst:428 +msgid "the *escapechar* itself." +msgstr "*escapechar* 本身。" + +#: ../../library/csv.rst:430 +msgid "" +"On reading, the *escapechar* removes any special meaning from the following " +"character. It defaults to :const:`None`, which disables escaping." +msgstr "在读取时,*escapechar* 将从以下字符中去除任何特殊含义。 它默认为 :const:`None`,表示禁用转义。" + +#: ../../library/csv.rst:433 +msgid "An empty *escapechar* is not allowed." +msgstr "不允许空的 *escapechar*。" + +#: ../../library/csv.rst:438 +msgid "" +"The string used to terminate lines produced by the :class:`writer`. It " +"defaults to ``'\\r\\n'``." +msgstr "放在 :class:`writer` 产生的行的结尾,默认为 ``'\\r\\n'``。" + +#: ../../library/csv.rst:443 +msgid "" +"The :class:`reader` is hard-coded to recognise either ``'\\r'`` or ``'\\n'``" +" as end-of-line, and ignores *lineterminator*. This behavior may change in " +"the future." +msgstr "" +":class:`reader` 经过硬编码,会识别 ``'\\r'`` 或 ``'\\n'`` 作为行尾,并忽略 " +"*lineterminator*。未来可能会更改这一行为。" + +#: ../../library/csv.rst:450 +msgid "" +"A one-character string used to quote fields containing special characters, " +"such as the *delimiter* or the *quotechar*, or which contain new-line " +"characters (``'\\r'``, ``'\\n'`` or any of the characters in " +"*lineterminator*). It defaults to ``'\"'``. Can be set to ``None`` to " +"prevent escaping ``'\"'`` if *quoting* is set to :const:`QUOTE_NONE`." +msgstr "" +"一个单字符,用于对包含特殊字符的字段加引号,这样的特殊字符有 *delimiter* 或 *quotechar*,或者包含换行符 (``'\\r'``," +" ``'\\n'`` 或 *lineterminator* 中的任意字符)。 默认值为 ``'\"'``。 当 *quoting* 设为 " +":const:`QUOTE_NONE` 时可被设为 ``None`` 以防止转义 ``'\"'``。" + +#: ../../library/csv.rst:457 +msgid "An empty *quotechar* is not allowed." +msgstr "不允许空的 *quotechar*。" + +#: ../../library/csv.rst:462 +msgid "" +"Controls when quotes should be generated by the writer and recognised by the" +" reader. It can take on any of the :ref:`QUOTE_\\* constants ` and defaults to :const:`QUOTE_MINIMAL` if *quotechar* is not " +"``None``, and :const:`QUOTE_NONE` otherwise." +msgstr "" +"控制引号何时应由 writer 生成并由 reader 识别。 它可以接受任意 :ref:`QUOTE_\\* 常量 ` " +"并且如果 *quotechar* 不为 ``None`` 则默认为 :const:`QUOTE_MINIMAL`,否则为 " +":const:`QUOTE_NONE`。" + +#: ../../library/csv.rst:470 +msgid "" +"When :const:`True`, spaces immediately following the *delimiter* are " +"ignored. The default is :const:`False`. When combining ``delimiter=' '`` " +"with ``skipinitialspace=True``, unquoted empty fields are not allowed." +msgstr "" +"当 :const:`True` 时,紧跟在 *delimiter* 后的空格将被忽略。默认值为 :const:`False`。当同时使用 " +"``delimiter=' '`` 和 ``skipinitialspace=True`` 时,不允许出现未加引号的空字段。" + +#: ../../library/csv.rst:477 +msgid "" +"When ``True``, raise exception :exc:`Error` on bad CSV input. The default is" +" ``False``." +msgstr "如果为 ``True``,则在输入错误的 CSV 时抛出 :exc:`Error` 异常。默认值为 ``False``。" + +#: ../../library/csv.rst:483 +msgid "Reader Objects" +msgstr "Reader 对象" + +#: ../../library/csv.rst:485 +msgid "" +"Reader objects (:class:`DictReader` instances and objects returned by the " +":func:`reader` function) have the following public methods:" +msgstr "Reader 对象(:class:`DictReader` 实例和 :func:`reader` 函数返回的对象)具有以下公开方法:" + +#: ../../library/csv.rst:490 +msgid "" +"Return the next row of the reader's iterable object as a list (if the object" +" was returned from :func:`reader`) or a dict (if it is a :class:`DictReader`" +" instance), parsed according to the current :class:`Dialect`. Usually you " +"should call this as ``next(reader)``." +msgstr "" +"返回 reader 的可迭代对象的下一行,它可以是一个列表(如果对象是由 :func:`reader` 返回)或字典(如果是一个 " +":class:`DictReader` 实例),根据当前 :class:`Dialect` 来解析。 通常你应当以 ``next(reader)`` " +"的形式来调用它。" + +#: ../../library/csv.rst:496 +msgid "Reader objects have the following public attributes:" +msgstr "Reader 对象具有以下公开属性:" + +#: ../../library/csv.rst:500 +msgid "A read-only description of the dialect in use by the parser." +msgstr "变种描述,只读,供解析器使用。" + +#: ../../library/csv.rst:505 +msgid "" +"The number of lines read from the source iterator. This is not the same as " +"the number of records returned, as records can span multiple lines." +msgstr "源迭代器已经读取了的行数。它与返回的记录数不同,因为记录可能跨越多行。" + +#: ../../library/csv.rst:509 +msgid "DictReader objects have the following public attribute:" +msgstr "DictReader 对象具有以下公开属性:" + +#: ../../library/csv.rst:513 +msgid "" +"If not passed as a parameter when creating the object, this attribute is " +"initialized upon first access or when the first record is read from the " +"file." +msgstr "字段名称。如果在创建对象时未传入字段名称,则首次访问时或从文件中读取第一条记录时会初始化此属性。" + +#: ../../library/csv.rst:520 +msgid "Writer Objects" +msgstr "Writer 对象" + +#: ../../library/csv.rst:522 +msgid "" +":class:`writer` objects (:class:`DictWriter` instances and objects returned " +"by the :func:`writer` function) have the following public methods. A *row* " +"must be an iterable of strings or numbers for :class:`writer` objects and a " +"dictionary mapping fieldnames to strings or numbers (by passing them through" +" :func:`str` first) for :class:`DictWriter` objects. Note that complex " +"numbers are written out surrounded by parens. This may cause some problems " +"for other programs which read CSV files (assuming they support complex " +"numbers at all)." +msgstr "" +":class:`writer` 对象 (:class:`DictWriter` 实例和 :func:`writer` 函数所返回的对象 ) " +"具有以下公共方法。 对于 :class:`writer` 对象,*row* 必须是字符串或数字的可迭代对象,而对于 " +":class:`DictWriter` 对象则是一个将字段名映射到字符串或数字 (会先将其传给 :func:`str`) 的字典。 " +"请注意在写入复数时会用圆括号括起来。 这可能会给其他读取 CSV 文件的程序带来一些问题 (假定它们确实支持复数)。" + +#: ../../library/csv.rst:533 +msgid "" +"Write the *row* parameter to the writer's file object, formatted according " +"to the current :class:`Dialect`. Return the return value of the call to the " +"*write* method of the underlying file object." +msgstr "" +"将 *row* 形参写入到 writer 的文件对象,根据当前 :class:`Dialect` 进行格式化。 返回对下层文件对象的 *write* " +"方法的调用的返回值。" + +#: ../../library/csv.rst:537 +msgid "Added support of arbitrary iterables." +msgstr "开始支持任意类型的迭代器。" + +#: ../../library/csv.rst:542 +msgid "" +"Write all elements in *rows* (an iterable of *row* objects as described " +"above) to the writer's file object, formatted according to the current " +"dialect." +msgstr "" +"将 *rows*(即能迭代出多个上述 *row* 对象的迭代器)中的所有元素写入 writer 的文件对象,并根据当前设置的变种进行格式化。" + +#: ../../library/csv.rst:546 +msgid "Writer objects have the following public attribute:" +msgstr "Writer 对象具有以下公开属性:" + +#: ../../library/csv.rst:551 +msgid "A read-only description of the dialect in use by the writer." +msgstr "变种描述,只读,供 writer 使用。" + +#: ../../library/csv.rst:554 +msgid "DictWriter objects have the following public method:" +msgstr "DictWriter 对象具有以下公开方法:" + +#: ../../library/csv.rst:559 +msgid "" +"Write a row with the field names (as specified in the constructor) to the " +"writer's file object, formatted according to the current dialect. Return the" +" return value of the :meth:`csvwriter.writerow` call used internally." +msgstr "" +"在 writer 的文件对象中,写入一行字段名称(字段名称在构造函数中指定),并根据当前设置的变种进行格式化。本方法的返回值就是内部使用的 " +":meth:`csvwriter.writerow` 方法的返回值。" + +#: ../../library/csv.rst:564 +msgid "" +":meth:`writeheader` now also returns the value returned by the " +":meth:`csvwriter.writerow` method it uses internally." +msgstr "现在 :meth:`writeheader` 也返回其内部使用的 :meth:`csvwriter.writerow` 方法的返回值。" + +#: ../../library/csv.rst:572 +msgid "Examples" +msgstr "例子" + +#: ../../library/csv.rst:574 +msgid "The simplest example of reading a CSV file::" +msgstr "读取 CSV 文件最简单的一个例子::" + +#: ../../library/csv.rst:576 +msgid "" +"import csv\n" +"with open('some.csv', newline='') as f:\n" +" reader = csv.reader(f)\n" +" for row in reader:\n" +" print(row)" +msgstr "" +"import csv\n" +"with open('some.csv', newline='') as f:\n" +" reader = csv.reader(f)\n" +" for row in reader:\n" +" print(row)" + +#: ../../library/csv.rst:582 +msgid "Reading a file with an alternate format::" +msgstr "读取其他格式的文件::" + +#: ../../library/csv.rst:584 +msgid "" +"import csv\n" +"with open('passwd', newline='') as f:\n" +" reader = csv.reader(f, delimiter=':', quoting=csv.QUOTE_NONE)\n" +" for row in reader:\n" +" print(row)" +msgstr "" +"import csv\n" +"with open('passwd', newline='') as f:\n" +" reader = csv.reader(f, delimiter=':', quoting=csv.QUOTE_NONE)\n" +" for row in reader:\n" +" print(row)" + +#: ../../library/csv.rst:590 +msgid "The corresponding simplest possible writing example is::" +msgstr "相应最简单的写入示例是::" + +#: ../../library/csv.rst:592 +msgid "" +"import csv\n" +"with open('some.csv', 'w', newline='') as f:\n" +" writer = csv.writer(f)\n" +" writer.writerows(someiterable)" +msgstr "" +"import csv\n" +"with open('some.csv', 'w', newline='') as f:\n" +" writer = csv.writer(f)\n" +" writer.writerows(someiterable)" + +#: ../../library/csv.rst:597 +msgid "" +"Since :func:`open` is used to open a CSV file for reading, the file will by " +"default be decoded into unicode using the system default encoding (see " +":func:`locale.getencoding`). To decode a file using a different encoding, " +"use the ``encoding`` argument of open::" +msgstr "" +"由于 :func:`open` 被用来打开 CSV 文件供读取,因此在默认情况下将使用系统默认编码格式 (参见 " +":func:`locale.getencoding`) 把文件解码至 unicode。 要使用其他编码格式来解码文件,请使用 open 的 " +"``encoding`` 参数::" + +#: ../../library/csv.rst:602 +msgid "" +"import csv\n" +"with open('some.csv', newline='', encoding='utf-8') as f:\n" +" reader = csv.reader(f)\n" +" for row in reader:\n" +" print(row)" +msgstr "" +"import csv\n" +"with open('some.csv', newline='', encoding='utf-8') as f:\n" +" reader = csv.reader(f)\n" +" for row in reader:\n" +" print(row)" + +#: ../../library/csv.rst:608 +msgid "" +"The same applies to writing in something other than the system default " +"encoding: specify the encoding argument when opening the output file." +msgstr "这同样适用于写入非系统默认编码的内容:打开输出文件时,指定 encoding 参数。" + +#: ../../library/csv.rst:611 +msgid "Registering a new dialect::" +msgstr "注册一个新的变种::" + +#: ../../library/csv.rst:613 +msgid "" +"import csv\n" +"csv.register_dialect('unixpwd', delimiter=':', quoting=csv.QUOTE_NONE)\n" +"with open('passwd', newline='') as f:\n" +" reader = csv.reader(f, 'unixpwd')" +msgstr "" +"import csv\n" +"csv.register_dialect('unixpwd', delimiter=':', quoting=csv.QUOTE_NONE)\n" +"with open('passwd', newline='') as f:\n" +" reader = csv.reader(f, 'unixpwd')" + +#: ../../library/csv.rst:618 +msgid "" +"A slightly more advanced use of the reader --- catching and reporting " +"errors::" +msgstr "Reader 的更高级用法——捕获并报告错误::" + +#: ../../library/csv.rst:620 +msgid "" +"import csv, sys\n" +"filename = 'some.csv'\n" +"with open(filename, newline='') as f:\n" +" reader = csv.reader(f)\n" +" try:\n" +" for row in reader:\n" +" print(row)\n" +" except csv.Error as e:\n" +" sys.exit(f'file {filename}, line {reader.line_num}: {e}')" +msgstr "" +"import csv, sys\n" +"filename = 'some.csv'\n" +"with open(filename, newline='') as f:\n" +" reader = csv.reader(f)\n" +" try:\n" +" for row in reader:\n" +" print(row)\n" +" except csv.Error as e:\n" +" sys.exit(f'file {filename}, line {reader.line_num}: {e}')" + +#: ../../library/csv.rst:630 +msgid "" +"And while the module doesn't directly support parsing strings, it can easily" +" be done::" +msgstr "尽管该模块不直接支持解析字符串,但仍可如下轻松完成::" + +#: ../../library/csv.rst:633 +msgid "" +"import csv\n" +"for row in csv.reader(['one,two,three']):\n" +" print(row)" +msgstr "" +"import csv\n" +"for row in csv.reader(['one,two,three']):\n" +" print(row)" + +#: ../../library/csv.rst:639 +msgid "Footnotes" +msgstr "备注" + +#: ../../library/csv.rst:640 +msgid "" +"If ``newline=''`` is not specified, newlines embedded inside quoted fields " +"will not be interpreted correctly, and on platforms that use ``\\r\\n`` line" +" endings on write an extra ``\\r`` will be added. It should always be safe " +"to specify ``newline=''``, since the csv module does its own " +"(:term:`universal `) newline handling." +msgstr "" +"若未指定 ``newline=''``,则引号字段内包含的换行符将无法被正确解析,且在写入时使用 ``\\r\\n`` 换行符的平台上会额外添加一个 " +"``\\r``。指定 ``newline=''`` 始终是安全的做法,因为 csv 模块会自行进行 (:term:`通用换行处理 `)。" + +#: ../../library/csv.rst:11 +msgid "csv" +msgstr "csv" + +#: ../../library/csv.rst:11 +msgid "data" +msgstr "数据" + +#: ../../library/csv.rst:11 +msgid "tabular" +msgstr "tabular" + +#: ../../library/csv.rst:53 +msgid "universal newlines" +msgstr "universal newlines -- 通用换行" + +#: ../../library/csv.rst:53 +msgid "csv.reader function" +msgstr "csv.reader 函数" diff --git a/library/ctypes.po b/library/ctypes.po new file mode 100644 index 0000000000..dd8a7b1ea1 --- /dev/null +++ b/library/ctypes.po @@ -0,0 +1,5599 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-07 17:18+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/ctypes.rst:2 +msgid ":mod:`!ctypes` --- A foreign function library for Python" +msgstr ":mod:`!ctypes` --- Python 的外部函数库" + +#: ../../library/ctypes.rst:9 +msgid "**Source code:** :source:`Lib/ctypes`" +msgstr "**源代码:** :source:`Lib/ctypes`" + +#: ../../library/ctypes.rst:13 +msgid "" +":mod:`!ctypes` is a foreign function library for Python. It provides C " +"compatible data types, and allows calling functions in DLLs or shared " +"libraries. It can be used to wrap these libraries in pure Python." +msgstr "" +":mod:`!ctypes` 是 Python 的外部函数库。 它提供了与 C 兼容的数据类型,并允许调用 DLL 或共享库中的函数。 可使用该模块以纯" +" Python 形式对这些库进行封装。" + +#: ../../includes/optional-module.rst:1 +msgid "" +"This is an :term:`optional module`. If it is missing from your copy of " +"CPython, look for documentation from your distributor (that is, whoever " +"provided Python to you). If you are the distributor, see :ref:`optional-" +"module-requirements`." +msgstr "" +"这是一个 :term:`optional module`。 如果它在你的 CPython 副本中缺失,请查看你的发行方(也就是说,向你提供 Python" +" 的人)的文档。 如果你就是发行方,请参阅 :ref:`optional-module-requirements`。" + +#: ../../library/ctypes.rst:21 +msgid "" +":mod:`!ctypes` provides low-level access to native libraries and the " +"process's memory, bypassing Python's safety mechanisms and allowing " +"execution of arbitrary native code. Incorrect use can corrupt data and " +"objects, reveal sensitive information, cause crashes, or otherwise " +"compromise the running process." +msgstr "" + +#: ../../library/ctypes.rst:31 +msgid "ctypes tutorial" +msgstr "ctypes 教程" + +#: ../../library/ctypes.rst:33 +msgid "" +"Note: Some code samples reference the ctypes :class:`c_int` type. On " +"platforms where ``sizeof(long) == sizeof(int)`` it is an alias to " +":class:`c_long`. So, you should not be confused if :class:`c_long` is " +"printed if you would expect :class:`c_int` --- they are actually the same " +"type." +msgstr "" +"注意:部分示例代码引用了 ctypes :class:`c_int` 类型。在 ``sizeof(long) == sizeof(int)`` " +"的平台上此类型是 :class:`c_long` 的一个别名。所以,在程序输出 :class:`c_long` 而不是你期望的 " +":class:`c_int` 时不必感到迷惑 --- 它们实际上是同一种类型。" + +#: ../../library/ctypes.rst:41 +msgid "Loading dynamic link libraries" +msgstr "载入动态连接库" + +#: ../../library/ctypes.rst:43 +msgid "" +":mod:`!ctypes` exports the :py:data:`~ctypes.cdll`, and on Windows " +":py:data:`~ctypes.windll` and :py:data:`~ctypes.oledll` objects, for loading" +" dynamic link libraries." +msgstr "" +":mod:`!ctypes` 导出了 :py:data:`~ctypes.cdll`,在 Windows 上还有 " +":py:data:`~ctypes.windll` 和 :py:data:`~ctypes.oledll` 对象,用于载入动态链接库。" + +#: ../../library/ctypes.rst:47 +msgid "" +"You load libraries by accessing them as attributes of these objects. " +":py:data:`!cdll` loads libraries which export functions using the standard " +"``cdecl`` calling convention, while :py:data:`!windll` libraries call " +"functions using the ``stdcall`` calling convention. :py:data:`~oledll` also " +"uses the ``stdcall`` calling convention, and assumes the functions return a " +"Windows :c:type:`!HRESULT` error code. The error code is used to " +"automatically raise an :class:`OSError` exception when the function call " +"fails." +msgstr "" +"你可以通过访问对象属性的方式来加载共享库。 :py:data:`!cdll` 可加载使用标准 ``cdecl`` 调用规范导出函数的共享库,而 " +":py:data:`!windll` 库则使用 ``stdcall`` 调用规范来调用函数。 :py:data:`~oledll` 也使用 " +"``stdcall`` 调用规范,并会假定库函数会返回 Windows :c:type:`!HRESULT` 错误代码。 " +"这种错误代码被用于在函数调用失败时自动引发 :class:`OSError` 异常。" + +#: ../../library/ctypes.rst:57 +msgid "" +"Windows errors used to raise :exc:`WindowsError`, which is now an alias of " +":exc:`OSError`." +msgstr "原来在 Windows 下抛出的异常类型 :exc:`WindowsError` 现在是 :exc:`OSError` 的一个别名。" + +#: ../../library/ctypes.rst:62 +msgid "" +"Here are some examples for Windows. Note that ``msvcrt`` is the MS standard " +"C library containing most standard C functions, and uses the ``cdecl`` " +"calling convention::" +msgstr "" +"这是一些 Windows 下的例子。 请注意 ``msvcrt`` 是包含大部分 C 函数的 MS 标准 C 库,并会使用 ``cdecl`` " +"调用惯例::" + +#: ../../library/ctypes.rst:66 +msgid "" +">>> from ctypes import *\n" +">>> print(windll.kernel32)\n" +"\n" +">>> print(cdll.msvcrt)\n" +"\n" +">>> libc = cdll.msvcrt\n" +">>>" +msgstr "" +">>> from ctypes import *\n" +">>> print(windll.kernel32)\n" +"\n" +">>> print(cdll.msvcrt)\n" +"\n" +">>> libc = cdll.msvcrt\n" +">>>" + +#: ../../library/ctypes.rst:74 +msgid "Windows appends the usual ``.dll`` file suffix automatically." +msgstr "Windows 会自动添加通常的 ``.dll`` 文件扩展名。" + +#: ../../library/ctypes.rst:77 +msgid "" +"Accessing the standard C library through ``cdll.msvcrt`` will use an " +"outdated version of the library that may be incompatible with the one being " +"used by Python. Where possible, use native Python functionality, or else " +"import and use the ``msvcrt`` module." +msgstr "" +"通过 ``cdll.msvcrt`` 调用的标准 C 函数,可能会导致调用一个过时的,与当前 Python 所不兼容的函数。因此,请尽量使用标准的 " +"Python 函数,而不要使用 ``msvcrt`` 模块。" + +#: ../../library/ctypes.rst:82 +msgid "" +"Other systems require the filename *including* the extension to load a " +"library, so attribute access can not be used to load libraries. Either the " +":meth:`~LibraryLoader.LoadLibrary` method of the dll loaders should be used," +" or you should load the library by creating an instance of :py:class:`CDLL` " +"by calling the constructor." +msgstr "" +"其他系统要求文件名 *包括* 扩展名才能加载共享库,因此不能使用属性访问来加载库。 你或者应使用 dll 加载器的 " +":meth:`~LibraryLoader.LoadLibrary` 方法,或者应通过调用构造器创建 :py:class:`CDLL` 的实例来加载库。" + +#: ../../library/ctypes.rst:88 +msgid "For example, on Linux::" +msgstr "例如,在 Linux 上::" + +#: ../../library/ctypes.rst:90 +msgid "" +">>> cdll.LoadLibrary(\"libc.so.6\")\n" +"\n" +">>> libc = CDLL(\"libc.so.6\")\n" +">>> libc\n" +"\n" +">>>" +msgstr "" +">>> cdll.LoadLibrary(\"libc.so.6\")\n" +"\n" +">>> libc = CDLL(\"libc.so.6\")\n" +">>> libc\n" +"\n" +">>>" + +#: ../../library/ctypes.rst:97 +msgid "On macOS::" +msgstr "在 macOS 上::" + +#: ../../library/ctypes.rst:99 +msgid "" +">>> cdll.LoadLibrary(\"libc.dylib\")\n" +"\n" +">>> libc = CDLL(\"libc.dylib\")\n" +">>> libc\n" +"" +msgstr "" +">>> cdll.LoadLibrary(\"libc.dylib\")\n" +"\n" +">>> libc = CDLL(\"libc.dylib\")\n" +">>> libc\n" +"" + +#: ../../library/ctypes.rst:110 +msgid "Accessing functions from loaded dlls" +msgstr "操作导入的动态链接库中的函数" + +#: ../../library/ctypes.rst:112 +msgid "Functions are accessed as attributes of dll objects::" +msgstr "通过操作 dll 对象的属性来操作这些函数::" + +#: ../../library/ctypes.rst:114 +msgid "" +">>> libc.printf\n" +"<_FuncPtr object at 0x...>\n" +">>> print(windll.kernel32.GetModuleHandleA)\n" +"<_FuncPtr object at 0x...>\n" +">>> print(windll.kernel32.MyOwnFunction)\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +" File \"ctypes.py\", line 239, in __getattr__\n" +" func = _StdcallFuncPtr(name, self)\n" +"AttributeError: function 'MyOwnFunction' not found\n" +">>>" +msgstr "" +">>> libc.printf\n" +"<_FuncPtr object at 0x...>\n" +">>> print(windll.kernel32.GetModuleHandleA)\n" +"<_FuncPtr object at 0x...>\n" +">>> print(windll.kernel32.MyOwnFunction)\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +" File \"ctypes.py\", line 239, in __getattr__\n" +" func = _StdcallFuncPtr(name, self)\n" +"AttributeError: function 'MyOwnFunction' not found\n" +">>>" + +#: ../../library/ctypes.rst:126 +msgid "" +"Note that win32 system dlls like ``kernel32`` and ``user32`` often export " +"ANSI as well as UNICODE versions of a function. The UNICODE version is " +"exported with a ``W`` appended to the name, while the ANSI version is " +"exported with an ``A`` appended to the name. The win32 ``GetModuleHandle`` " +"function, which returns a *module handle* for a given module name, has the " +"following C prototype, and a macro is used to expose one of them as " +"``GetModuleHandle`` depending on whether UNICODE is defined or not::" +msgstr "" +"请注意 win32 系统的动态库如 ``kernel32`` 和 ``user32`` 通常会同时导出一个函数的 ANSI 版本和 UNICODE " +"版本。 UNICODE 版本导出时会在名称后加上 ``W``,而 ANSI 版本导出时会在名称后加上 ``A``。 win32 " +"``GetModuleHandle`` 函数会为给定的模块名称返回一个 *模块句柄*,它具有以下的 C 原型,以及一个被用来根据是否定义了 " +"UNICODE 将其中之一暴露为 ``GetModuleHandle`` 的宏::" + +#: ../../library/ctypes.rst:134 +msgid "" +"/* ANSI version */\n" +"HMODULE GetModuleHandleA(LPCSTR lpModuleName);\n" +"/* UNICODE version */\n" +"HMODULE GetModuleHandleW(LPCWSTR lpModuleName);" +msgstr "" +"/* ANSI version */\n" +"HMODULE GetModuleHandleA(LPCSTR lpModuleName);\n" +"/* UNICODE version */\n" +"HMODULE GetModuleHandleW(LPCWSTR lpModuleName);" + +#: ../../library/ctypes.rst:139 +msgid "" +"*windll* does not try to select one of them by magic, you must access the " +"version you need by specifying ``GetModuleHandleA`` or ``GetModuleHandleW`` " +"explicitly, and then call it with bytes or string objects respectively." +msgstr "" +"*windll* 不会通过这样的魔法手段来帮你决定选择哪一种函数,你必须显式的调用 ``GetModuleHandleA`` 或 " +"``GetModuleHandleW``,并分别使用字节对象或字符串对象作参数。" + +#: ../../library/ctypes.rst:143 +msgid "" +"Sometimes, dlls export functions with names which aren't valid Python " +"identifiers, like ``\"??2@YAPAXI@Z\"``. In this case you have to use " +":func:`getattr` to retrieve the function::" +msgstr "" +"有时候,dll 导出的函数名不符合 Python 的标识符规范,比如 ``\"??2@YAPAXI@Z\"``。此时,你必须使用 " +":func:`getattr` 来获得该函数::" + +#: ../../library/ctypes.rst:147 +msgid "" +">>> getattr(cdll.msvcrt, \"??2@YAPAXI@Z\")\n" +"<_FuncPtr object at 0x...>\n" +">>>" +msgstr "" +">>> getattr(cdll.msvcrt, \"??2@YAPAXI@Z\")\n" +"<_FuncPtr object at 0x...>\n" +">>>" + +#: ../../library/ctypes.rst:151 +msgid "" +"On Windows, some dlls export functions not by name but by ordinal. These " +"functions can be accessed by indexing the dll object with the ordinal " +"number::" +msgstr "" +"Windows 下,有些 dll 导出的函数没有函数名,而是通过其顺序号调用。对此类函数,你也可以通过 dll 对象的数值索引来操作这些函数::" + +#: ../../library/ctypes.rst:154 +msgid "" +">>> cdll.kernel32[1]\n" +"<_FuncPtr object at 0x...>\n" +">>> cdll.kernel32[0]\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +" File \"ctypes.py\", line 310, in __getitem__\n" +" func = _StdcallFuncPtr(name, self)\n" +"AttributeError: function ordinal 0 not found\n" +">>>" +msgstr "" +">>> cdll.kernel32[1]\n" +"<_FuncPtr object at 0x...>\n" +">>> cdll.kernel32[0]\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +" File \"ctypes.py\", line 310, in __getitem__\n" +" func = _StdcallFuncPtr(name, self)\n" +"AttributeError: function ordinal 0 not found\n" +">>>" + +#: ../../library/ctypes.rst:168 +msgid "Calling functions" +msgstr "调用函数" + +#: ../../library/ctypes.rst:170 +msgid "" +"You can call these functions like any other Python callable. This example " +"uses the ``rand()`` function, which takes no arguments and returns a pseudo-" +"random integer::" +msgstr "" +"你可以像任何其它 Python 可调用对象一样调用这些函数。 这个例子使用了 ``rand()`` 函数,它不接收任何参数并返回一个伪随机整数::" + +#: ../../library/ctypes.rst:173 +msgid "" +">>> print(libc.rand())\n" +"1804289383" +msgstr "" +">>> print(libc.rand())\n" +"1804289383" + +#: ../../library/ctypes.rst:176 +msgid "" +"On Windows, you can call the ``GetModuleHandleA()`` function, which returns " +"a win32 module handle (passing ``None`` as single argument to call it with a" +" ``NULL`` pointer)::" +msgstr "" +"在 Windows 上,你可以调用 ``GetModuleHandleA()`` 函数,它返回一个 win32 模块句柄 (将 ``None`` " +"作为唯一参数传入以使用 ``NULL`` 指针来调用它)::" + +#: ../../library/ctypes.rst:179 +msgid "" +">>> print(hex(windll.kernel32.GetModuleHandleA(None)))\n" +"0x1d000000\n" +">>>" +msgstr "" +">>> print(hex(windll.kernel32.GetModuleHandleA(None)))\n" +"0x1d000000\n" +">>>" + +#: ../../library/ctypes.rst:183 +msgid "" +":exc:`ValueError` is raised when you call an ``stdcall`` function with the " +"``cdecl`` calling convention, or vice versa::" +msgstr "" +"如果你用 ``cdecl`` 调用方式调用 ``stdcall`` 约定的函数,则会引发 :exc:`ValueError` 异常,反之亦然::" + +#: ../../library/ctypes.rst:186 +msgid "" +">>> cdll.kernel32.GetModuleHandleA(None)\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"ValueError: Procedure probably called with not enough arguments (4 bytes missing)\n" +">>>\n" +"\n" +">>> windll.msvcrt.printf(b\"spam\")\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"ValueError: Procedure probably called with too many arguments (4 bytes in excess)\n" +">>>" +msgstr "" +">>> cdll.kernel32.GetModuleHandleA(None)\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"ValueError: Procedure probably called with not enough arguments (4 bytes missing)\n" +">>>\n" +"\n" +">>> windll.msvcrt.printf(b\"spam\")\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"ValueError: Procedure probably called with too many arguments (4 bytes in excess)\n" +">>>" + +#: ../../library/ctypes.rst:198 +msgid "" +"To find out the correct calling convention you have to look into the C " +"header file or the documentation for the function you want to call." +msgstr "你必须阅读这些库的头文件或说明文档来确定它们的正确的调用协议。" + +#: ../../library/ctypes.rst:201 +msgid "" +"On Windows, :mod:`!ctypes` uses win32 structured exception handling to " +"prevent crashes from general protection faults when functions are called " +"with invalid argument values::" +msgstr "在 Windows 上,:mod:`!ctypes` 使用 win32 结构化异常处理来防止由于在调用函数时使用无效参数导致的程序崩溃::" + +#: ../../library/ctypes.rst:205 +msgid "" +">>> windll.kernel32.GetModuleHandleA(32)\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"OSError: exception: access violation reading 0x00000020\n" +">>>" +msgstr "" +">>> windll.kernel32.GetModuleHandleA(32)\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"OSError: exception: access violation reading 0x00000020\n" +">>>" + +#: ../../library/ctypes.rst:211 +msgid "" +"The :mod:`faulthandler` module can help debug crashes, such as segmentation " +"faults produced by erroneous C library calls." +msgstr "" + +#: ../../library/ctypes.rst:214 +msgid "" +"``None``, integers, bytes objects and (unicode) strings are the only native " +"Python objects that can directly be used as parameters in these function " +"calls. ``None`` is passed as a C ``NULL`` pointer, bytes objects and strings" +" are passed as pointer to the memory block that contains their data " +"(:c:expr:`char *` or :c:expr:`wchar_t *`). Python integers are passed as " +"the platform's default C :c:expr:`int` type, their value is masked to fit " +"into the C type." +msgstr "" +"``None``、整数、字节串对象和(Unicode)字符串是仅有的可以直接作为这些函数调用的形参的原生 Python 对象。 ``None`` 将作为" +" C ``NULL`` 指针传入,字节串对象和字符串将作为指向包含其数据 (:c:expr:`char *` 或 :c:expr:`wchar_t " +"*`) 的内存块的指针传入。 Python 整数将作为平台默认的 C :c:expr:`int` 类型传入,它们的值会被截断以适应 C 类型的长度。" + +#: ../../library/ctypes.rst:221 +msgid "" +"Before we move on calling functions with other parameter types, we have to " +"learn more about :mod:`!ctypes` data types." +msgstr "在我们开始附带其他形参类型调用函数之前,我们必须仔细了解 :mod:`!ctypes` 的数据类型。" + +#: ../../library/ctypes.rst:228 ../../library/ctypes.rst:2542 +msgid "Fundamental data types" +msgstr "基础数据类型" + +#: ../../library/ctypes.rst:230 +msgid ":mod:`!ctypes` defines a number of primitive C compatible data types:" +msgstr ":mod:`!ctypes` 定义了一些基本的 C 兼容数据类型:compatible data types:" + +#: ../../library/ctypes.rst:235 ../../library/ctypes.rst:374 +msgid "ctypes type" +msgstr "ctypes 类型" + +#: ../../library/ctypes.rst:236 ../../library/ctypes.rst:375 +msgid "C type" +msgstr "C 类型" + +#: ../../library/ctypes.rst:237 ../../library/ctypes.rst:376 +msgid "Python type" +msgstr "Python 类型" + +#: ../../library/ctypes.rst:238 ../../library/ctypes.rst:377 +msgid ":py:attr:`~_SimpleCData._type_`" +msgstr ":py:attr:`~_SimpleCData._type_`" + +#: ../../library/ctypes.rst:239 +msgid ":class:`c_bool`" +msgstr ":class:`c_bool`" + +#: ../../library/ctypes.rst:240 +msgid ":c:expr:`_Bool`" +msgstr ":c:expr:`_Bool`" + +#: ../../library/ctypes.rst:241 ../../library/ctypes.rst:365 +msgid ":py:class:`bool`" +msgstr ":py:class:`bool`" + +#: ../../library/ctypes.rst:242 +msgid "``'?'``" +msgstr "``'?'``" + +#: ../../library/ctypes.rst:243 +msgid ":class:`c_char`" +msgstr ":class:`c_char`" + +#: ../../library/ctypes.rst:244 ../../library/ctypes.rst:252 +msgid ":c:expr:`char`" +msgstr ":c:expr:`char`" + +#: ../../library/ctypes.rst:245 +msgid "1-character :py:class:`bytes`" +msgstr "单字符 :py:class:`bytes`" + +#: ../../library/ctypes.rst:246 +msgid "``'c'``" +msgstr "``'c'``" + +#: ../../library/ctypes.rst:247 +msgid ":class:`c_wchar`" +msgstr ":class:`c_wchar`" + +#: ../../library/ctypes.rst:248 +msgid ":c:type:`wchar_t`" +msgstr ":c:type:`wchar_t`" + +#: ../../library/ctypes.rst:249 +msgid "1-character :py:class:`str`" +msgstr "单字符 :py:class:`str`" + +#: ../../library/ctypes.rst:250 +msgid "``'u'``" +msgstr "``'u'``" + +#: ../../library/ctypes.rst:251 +msgid ":class:`c_byte`" +msgstr ":class:`c_byte`" + +#: ../../library/ctypes.rst:253 ../../library/ctypes.rst:257 +#: ../../library/ctypes.rst:261 ../../library/ctypes.rst:265 +#: ../../library/ctypes.rst:269 ../../library/ctypes.rst:273 +#: ../../library/ctypes.rst:277 ../../library/ctypes.rst:281 +#: ../../library/ctypes.rst:285 ../../library/ctypes.rst:289 +#: ../../library/ctypes.rst:293 ../../library/ctypes.rst:297 +#: ../../library/ctypes.rst:301 ../../library/ctypes.rst:305 +#: ../../library/ctypes.rst:309 ../../library/ctypes.rst:313 +#: ../../library/ctypes.rst:317 ../../library/ctypes.rst:321 +#: ../../library/ctypes.rst:325 ../../library/ctypes.rst:329 +#: ../../library/ctypes.rst:333 +msgid ":py:class:`int`" +msgstr ":py:class:`int`" + +#: ../../library/ctypes.rst:254 +msgid "``'b'``" +msgstr "``'b'``" + +#: ../../library/ctypes.rst:255 +msgid ":class:`c_ubyte`" +msgstr ":class:`c_ubyte`" + +#: ../../library/ctypes.rst:256 +msgid ":c:expr:`unsigned char`" +msgstr ":c:expr:`unsigned char`" + +#: ../../library/ctypes.rst:258 +msgid "``'B'``" +msgstr "``'B'``" + +#: ../../library/ctypes.rst:259 +msgid ":class:`c_short`" +msgstr ":class:`c_short`" + +#: ../../library/ctypes.rst:260 +msgid ":c:expr:`short`" +msgstr ":c:expr:`short`" + +#: ../../library/ctypes.rst:262 +msgid "``'h'``" +msgstr "``'h'``" + +#: ../../library/ctypes.rst:263 +msgid ":class:`c_ushort`" +msgstr ":class:`c_ushort`" + +#: ../../library/ctypes.rst:264 +msgid ":c:expr:`unsigned short`" +msgstr ":c:expr:`unsigned short`" + +#: ../../library/ctypes.rst:266 +msgid "``'H'``" +msgstr "``'H'``" + +#: ../../library/ctypes.rst:267 +msgid ":class:`c_int`" +msgstr ":class:`c_int`" + +#: ../../library/ctypes.rst:268 +msgid ":c:expr:`int`" +msgstr ":c:expr:`int`" + +#: ../../library/ctypes.rst:270 +msgid "``'i'`` \\*" +msgstr "``'i'`` \\*" + +#: ../../library/ctypes.rst:271 +msgid ":class:`c_int8`" +msgstr ":class:`c_int8`" + +#: ../../library/ctypes.rst:272 +msgid ":c:type:`int8_t`" +msgstr ":c:type:`int8_t`" + +#: ../../library/ctypes.rst:274 ../../library/ctypes.rst:278 +#: ../../library/ctypes.rst:282 ../../library/ctypes.rst:286 +#: ../../library/ctypes.rst:294 ../../library/ctypes.rst:298 +#: ../../library/ctypes.rst:302 ../../library/ctypes.rst:306 +#: ../../library/ctypes.rst:326 ../../library/ctypes.rst:330 +#: ../../library/ctypes.rst:334 +msgid "\\*" +msgstr "\\*" + +#: ../../library/ctypes.rst:275 +msgid ":class:`c_int16`" +msgstr ":class:`c_int16`" + +#: ../../library/ctypes.rst:276 +msgid ":c:type:`int16_t`" +msgstr ":c:type:`int16_t`" + +#: ../../library/ctypes.rst:279 +msgid ":class:`c_int32`" +msgstr ":class:`c_int32`" + +#: ../../library/ctypes.rst:280 +msgid ":c:type:`int32_t`" +msgstr ":c:type:`int32_t`" + +#: ../../library/ctypes.rst:283 +msgid ":class:`c_int64`" +msgstr ":class:`c_int64`" + +#: ../../library/ctypes.rst:284 +msgid ":c:type:`int64_t`" +msgstr ":c:type:`int64_t`" + +#: ../../library/ctypes.rst:287 +msgid ":class:`c_uint`" +msgstr ":class:`c_uint`" + +#: ../../library/ctypes.rst:288 +msgid ":c:expr:`unsigned int`" +msgstr ":c:expr:`unsigned int`" + +#: ../../library/ctypes.rst:290 +msgid "``'I'`` \\*" +msgstr "``'I'`` \\*" + +#: ../../library/ctypes.rst:291 +msgid ":class:`c_uint8`" +msgstr ":class:`c_uint8`" + +#: ../../library/ctypes.rst:292 +msgid ":c:type:`uint8_t`" +msgstr ":c:type:`uint8_t`" + +#: ../../library/ctypes.rst:295 +msgid ":class:`c_uint16`" +msgstr ":class:`c_uint16`" + +#: ../../library/ctypes.rst:296 +msgid ":c:type:`uint16_t`" +msgstr ":c:type:`uint16_t`" + +#: ../../library/ctypes.rst:299 +msgid ":class:`c_uint32`" +msgstr ":class:`c_uint32`" + +#: ../../library/ctypes.rst:300 +msgid ":c:type:`uint32_t`" +msgstr ":c:type:`uint32_t`" + +#: ../../library/ctypes.rst:303 +msgid ":class:`c_uint64`" +msgstr ":class:`c_uint64`" + +#: ../../library/ctypes.rst:304 +msgid ":c:type:`uint64_t`" +msgstr ":c:type:`uint64_t`" + +#: ../../library/ctypes.rst:307 +msgid ":class:`c_long`" +msgstr ":class:`c_long`" + +#: ../../library/ctypes.rst:308 +msgid ":c:expr:`long`" +msgstr ":c:expr:`long`" + +#: ../../library/ctypes.rst:310 +msgid "``'l'``" +msgstr "``'l'``" + +#: ../../library/ctypes.rst:311 +msgid ":class:`c_ulong`" +msgstr ":class:`c_ulong`" + +#: ../../library/ctypes.rst:312 +msgid ":c:expr:`unsigned long`" +msgstr ":c:expr:`unsigned long`" + +#: ../../library/ctypes.rst:314 +msgid "``'L'``" +msgstr "``'L'``" + +#: ../../library/ctypes.rst:315 +msgid ":class:`c_longlong`" +msgstr ":class:`c_longlong`" + +#: ../../library/ctypes.rst:316 +msgid ":c:expr:`long long`" +msgstr ":c:expr:`long long`" + +#: ../../library/ctypes.rst:318 +msgid "``'q'`` \\*" +msgstr "``'q'`` \\*" + +#: ../../library/ctypes.rst:319 +msgid ":class:`c_ulonglong`" +msgstr ":class:`c_ulonglong`" + +#: ../../library/ctypes.rst:320 +msgid ":c:expr:`unsigned long long`" +msgstr ":c:expr:`unsigned long long`" + +#: ../../library/ctypes.rst:322 +msgid "``'Q'`` \\*" +msgstr "``'Q'`` \\*" + +#: ../../library/ctypes.rst:323 +msgid ":class:`c_size_t`" +msgstr ":class:`c_size_t`" + +#: ../../library/ctypes.rst:324 +msgid ":c:type:`size_t`" +msgstr ":c:type:`size_t`" + +#: ../../library/ctypes.rst:327 +msgid ":class:`c_ssize_t`" +msgstr ":class:`c_ssize_t`" + +#: ../../library/ctypes.rst:328 +msgid ":c:type:`Py_ssize_t`" +msgstr ":c:type:`Py_ssize_t`" + +#: ../../library/ctypes.rst:331 +msgid ":class:`c_time_t`" +msgstr ":class:`c_time_t`" + +#: ../../library/ctypes.rst:332 +msgid ":c:type:`time_t`" +msgstr ":c:type:`time_t`" + +#: ../../library/ctypes.rst:335 +msgid ":class:`c_float`" +msgstr ":class:`c_float`" + +#: ../../library/ctypes.rst:336 +msgid ":c:expr:`float`" +msgstr ":c:expr:`float`" + +#: ../../library/ctypes.rst:337 ../../library/ctypes.rst:341 +#: ../../library/ctypes.rst:345 +msgid ":py:class:`float`" +msgstr ":py:class:`float`" + +#: ../../library/ctypes.rst:338 +msgid "``'f'``" +msgstr "``'f'``" + +#: ../../library/ctypes.rst:339 +msgid ":class:`c_double`" +msgstr ":class:`c_double`" + +#: ../../library/ctypes.rst:340 +msgid ":c:expr:`double`" +msgstr ":c:expr:`double`" + +#: ../../library/ctypes.rst:342 +msgid "``'d'``" +msgstr "``'d'``" + +#: ../../library/ctypes.rst:343 +msgid ":class:`c_longdouble`" +msgstr ":class:`c_longdouble`" + +#: ../../library/ctypes.rst:344 +msgid ":c:expr:`long double`" +msgstr ":c:expr:`long double`" + +#: ../../library/ctypes.rst:346 +msgid "``'g'`` \\*" +msgstr "``'g'`` \\*" + +#: ../../library/ctypes.rst:347 +msgid ":class:`c_char_p`" +msgstr ":class:`c_char_p`" + +#: ../../library/ctypes.rst:348 +msgid ":c:expr:`char *` (NUL terminated)" +msgstr ":c:expr:`char *` (以 NUL 结尾)" + +#: ../../library/ctypes.rst:349 +msgid ":py:class:`bytes` or ``None``" +msgstr ":py:class:`bytes` 或 ``None``" + +#: ../../library/ctypes.rst:350 +msgid "``'z'``" +msgstr "``'z'``" + +#: ../../library/ctypes.rst:351 +msgid ":class:`c_wchar_p`" +msgstr ":class:`c_wchar_p`" + +#: ../../library/ctypes.rst:352 +msgid ":c:expr:`wchar_t *` (NUL terminated)" +msgstr ":c:expr:`wchar_t *` (以 NUL 结尾)" + +#: ../../library/ctypes.rst:353 +msgid ":py:class:`str` or ``None``" +msgstr ":py:class:`str` 或 ``None``" + +#: ../../library/ctypes.rst:354 +msgid "``'Z'``" +msgstr "``'Z'``" + +#: ../../library/ctypes.rst:355 +msgid ":class:`c_void_p`" +msgstr ":class:`c_void_p`" + +#: ../../library/ctypes.rst:356 +msgid ":c:expr:`void *`" +msgstr ":c:expr:`void *`" + +#: ../../library/ctypes.rst:357 +msgid ":py:class:`int` or ``None``" +msgstr ":py:class:`int` 或 ``None``" + +#: ../../library/ctypes.rst:358 +msgid "``'P'``" +msgstr "``'P'``" + +#: ../../library/ctypes.rst:359 +msgid ":class:`py_object`" +msgstr ":class:`py_object`" + +#: ../../library/ctypes.rst:360 +msgid ":c:expr:`PyObject *`" +msgstr ":c:expr:`PyObject *`" + +#: ../../library/ctypes.rst:361 +msgid ":py:class:`object`" +msgstr ":py:class:`object`" + +#: ../../library/ctypes.rst:362 +msgid "``'O'``" +msgstr "``'O'``" + +#: ../../library/ctypes.rst:363 +msgid ":ref:`VARIANT_BOOL `" +msgstr ":ref:`VARIANT_BOOL `" + +#: ../../library/ctypes.rst:364 +msgid ":c:expr:`short int`" +msgstr ":c:expr:`short int`" + +#: ../../library/ctypes.rst:366 +msgid "``'v'``" +msgstr "``'v'``" + +#: ../../library/ctypes.rst:368 +msgid "" +"Additionally, if IEC 60559 compatible complex arithmetic (Annex G) is " +"supported in both C and ``libffi``, the following complex types are " +"available:" +msgstr "此外,如果 IEC 60559 兼容的复数计算 (附件 G) 在 C 和 ``libffi`` 中都受到支持,则下列复数类型将可用:" + +#: ../../library/ctypes.rst:378 +msgid ":class:`c_float_complex`" +msgstr ":class:`c_float_complex`" + +#: ../../library/ctypes.rst:379 +msgid ":c:expr:`float complex`" +msgstr ":c:expr:`float complex`" + +#: ../../library/ctypes.rst:380 ../../library/ctypes.rst:384 +#: ../../library/ctypes.rst:388 +msgid ":py:class:`complex`" +msgstr ":py:class:`complex`" + +#: ../../library/ctypes.rst:381 +msgid "``'F'``" +msgstr "``'F'``" + +#: ../../library/ctypes.rst:382 +msgid ":class:`c_double_complex`" +msgstr ":class:`c_double_complex`" + +#: ../../library/ctypes.rst:383 +msgid ":c:expr:`double complex`" +msgstr ":c:expr:`double complex`" + +#: ../../library/ctypes.rst:385 +msgid "``'D'``" +msgstr "``'D'``" + +#: ../../library/ctypes.rst:386 +msgid ":class:`c_longdouble_complex`" +msgstr ":class:`c_longdouble_complex`" + +#: ../../library/ctypes.rst:387 +msgid ":c:expr:`long double complex`" +msgstr ":c:expr:`long double complex`" + +#: ../../library/ctypes.rst:389 +msgid "``'G'``" +msgstr "``'G'``" + +#: ../../library/ctypes.rst:392 +msgid "" +"All these types can be created by calling them with an optional initializer " +"of the correct type and value::" +msgstr "所有这些类型都可以通过使用正确类型和值的可选初始值调用它们来创建::" + +#: ../../library/ctypes.rst:395 +msgid "" +">>> c_int()\n" +"c_long(0)\n" +">>> c_wchar_p(\"Hello, World\")\n" +"c_wchar_p(140018365411392)\n" +">>> c_ushort(-3)\n" +"c_ushort(65533)\n" +">>>" +msgstr "" +">>> c_int()\n" +"c_long(0)\n" +">>> c_wchar_p(\"Hello, World\")\n" +"c_wchar_p(140018365411392)\n" +">>> c_ushort(-3)\n" +"c_ushort(65533)\n" +">>>" + +#: ../../library/ctypes.rst:403 +msgid "" +"The constructors for numeric types will convert input using " +":py:meth:`~object.__bool__`, :py:meth:`~object.__index__` (for ``int``), " +":py:meth:`~object.__float__` or :py:meth:`~object.__complex__`. This means " +":py:class:`~ctypes.c_bool` accepts any object with a truth value::" +msgstr "" +"数字类型的构造器将使用 :py:meth:`~object.__bool__`, :py:meth:`~object.__index__` (for " +"``int``), :py:meth:`~object.__float__` 或 :py:meth:`~object.__complex__` " +"对输入进行转换。 这意味着 :py:class:`~ctypes.c_bool` 可接受任何具有逻辑值的对象::" + +#: ../../library/ctypes.rst:409 +msgid "" +">>> empty_list = []\n" +">>> c_bool(empty_list)\n" +"c_bool(False)" +msgstr "" +">>> empty_list = []\n" +">>> c_bool(empty_list)\n" +"c_bool(False)" + +#: ../../library/ctypes.rst:413 +msgid "" +"Since these types are mutable, their value can also be changed afterwards::" +msgstr "由于这些类型是可变的,它们的值也可以在以后更改::" + +#: ../../library/ctypes.rst:415 +msgid "" +">>> i = c_int(42)\n" +">>> print(i)\n" +"c_long(42)\n" +">>> print(i.value)\n" +"42\n" +">>> i.value = -99\n" +">>> print(i.value)\n" +"-99\n" +">>>" +msgstr "" +">>> i = c_int(42)\n" +">>> print(i)\n" +"c_long(42)\n" +">>> print(i.value)\n" +"42\n" +">>> i.value = -99\n" +">>> print(i.value)\n" +"-99\n" +">>>" + +#: ../../library/ctypes.rst:425 +msgid "" +"Assigning a new value to instances of the pointer types :class:`c_char_p`, " +":class:`c_wchar_p`, and :class:`c_void_p` changes the *memory location* they" +" point to, *not the contents* of the memory block (of course not, because " +"Python string objects are immutable)::" +msgstr "" +"给指针类型 :class:`c_char_p`, :class:`c_wchar_p` 和 :class:`c_void_p` " +"的实例赋新值会改变它们所指向的 *内存位置*,而不是内存块的 *内容* (当然不是,因为 Python 字符串对象是不可变的)::" + +#: ../../library/ctypes.rst:430 +msgid "" +">>> s = \"Hello, World\"\n" +">>> c_s = c_wchar_p(s)\n" +">>> print(c_s)\n" +"c_wchar_p(139966785747344)\n" +">>> print(c_s.value)\n" +"Hello World\n" +">>> c_s.value = \"Hi, there\"\n" +">>> print(c_s) # the memory location has changed\n" +"c_wchar_p(139966783348904)\n" +">>> print(c_s.value)\n" +"Hi, there\n" +">>> print(s) # first object is unchanged\n" +"Hello, World\n" +">>>" +msgstr "" +">>> s = \"Hello, World\"\n" +">>> c_s = c_wchar_p(s)\n" +">>> print(c_s)\n" +"c_wchar_p(139966785747344)\n" +">>> print(c_s.value)\n" +"Hello World\n" +">>> c_s.value = \"Hi, there\"\n" +">>> print(c_s) # 内存分配已改变\n" +"c_wchar_p(139966783348904)\n" +">>> print(c_s.value)\n" +"Hi, there\n" +">>> print(s) # 第一个对象未改变\n" +"Hello, World\n" +">>>" + +#: ../../library/ctypes.rst:445 +msgid "" +"You should be careful, however, not to pass them to functions expecting " +"pointers to mutable memory. If you need mutable memory blocks, ctypes has a " +":func:`create_string_buffer` function which creates these in various ways. " +"The current memory block contents can be accessed (or changed) with the " +"``raw`` property; if you want to access it as NUL terminated string, use the" +" ``value`` property::" +msgstr "" +"但你要注意不能将它们传递给会改变指针所指内存的函数。如果你需要可改变的内存块,ctypes 提供了 " +":func:`create_string_buffer` 函数,它提供多种方式创建这种内存块。当前的内存块内容可以通过 ``raw`` " +"属性存取,如果你希望将它作为NUL结束的字符串,请使用 ``value`` 属性::" + +#: ../../library/ctypes.rst:452 +msgid "" +">>> from ctypes import *\n" +">>> p = create_string_buffer(3) # create a 3 byte buffer, initialized to NUL bytes\n" +">>> print(sizeof(p), repr(p.raw))\n" +"3 b'\\x00\\x00\\x00'\n" +">>> p = create_string_buffer(b\"Hello\") # create a buffer containing a NUL terminated string\n" +">>> print(sizeof(p), repr(p.raw))\n" +"6 b'Hello\\x00'\n" +">>> print(repr(p.value))\n" +"b'Hello'\n" +">>> p = create_string_buffer(b\"Hello\", 10) # create a 10 byte buffer\n" +">>> print(sizeof(p), repr(p.raw))\n" +"10 b'Hello\\x00\\x00\\x00\\x00\\x00'\n" +">>> p.value = b\"Hi\"\n" +">>> print(sizeof(p), repr(p.raw))\n" +"10 b'Hi\\x00lo\\x00\\x00\\x00\\x00\\x00'\n" +">>>" +msgstr "" +">>> from ctypes import *\n" +">>> p = create_string_buffer(3) # 创建一个 3 字节的缓冲区,初始化为 NUL 字节\n" +">>> print(sizeof(p), repr(p.raw))\n" +"3 b'\\x00\\x00\\x00'\n" +">>> p = create_string_buffer(b\"Hello\") # 创建一个包含以 NUL 结束的字符串的缓冲区\n" +">>> print(sizeof(p), repr(p.raw))\n" +"6 b'Hello\\x00'\n" +">>> print(repr(p.value))\n" +"b'Hello'\n" +">>> p = create_string_buffer(b\"Hello\", 10) # 创建一个 10 字节的缓冲区\n" +">>> print(sizeof(p), repr(p.raw))\n" +"10 b'Hello\\x00\\x00\\x00\\x00\\x00'\n" +">>> p.value = b\"Hi\"\n" +">>> print(sizeof(p), repr(p.raw))\n" +"10 b'Hi\\x00lo\\x00\\x00\\x00\\x00\\x00'\n" +">>>" + +#: ../../library/ctypes.rst:469 +msgid "" +"The :func:`create_string_buffer` function replaces the old :func:`!c_buffer`" +" function (which is still available as an alias). To create a mutable " +"memory block containing unicode characters of the C type :c:type:`wchar_t`, " +"use the :func:`create_unicode_buffer` function." +msgstr "" +":func:`create_string_buffer` 函数取代了旧的 :func:`!c_buffer` 函数(后者仍可作为别名使用)。 " +"要创建一个包含 C 类型 :c:type:`wchar_t` 的 unicode 字符的可变内存块,请使用 " +":func:`create_unicode_buffer` 函数。" + +#: ../../library/ctypes.rst:478 +msgid "Calling functions, continued" +msgstr "调用函数,继续" + +#: ../../library/ctypes.rst:480 +msgid "" +"Note that printf prints to the real standard output channel, *not* to " +":data:`sys.stdout`, so these examples will only work at the console prompt, " +"not from within *IDLE* or *PythonWin*::" +msgstr "" +"注意 printf 将打印到真正标准输出设备,而 *不是* :data:`sys.stdout`,因此这些实例只能在控制台提示符下工作,而不能在 " +"*IDLE* 或 *PythonWin* 中运行::" + +#: ../../library/ctypes.rst:484 +msgid "" +">>> printf = libc.printf\n" +">>> printf(b\"Hello, %s\\n\", b\"World!\")\n" +"Hello, World!\n" +"14\n" +">>> printf(b\"Hello, %S\\n\", \"World!\")\n" +"Hello, World!\n" +"14\n" +">>> printf(b\"%d bottles of beer\\n\", 42)\n" +"42 bottles of beer\n" +"19\n" +">>> printf(b\"%f bottles of beer\\n\", 42.5)\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"ctypes.ArgumentError: argument 2: TypeError: Don't know how to convert parameter 2\n" +">>>" +msgstr "" +">>> printf = libc.printf\n" +">>> printf(b\"Hello, %s\\n\", b\"World!\")\n" +"Hello, World!\n" +"14\n" +">>> printf(b\"Hello, %S\\n\", \"World!\")\n" +"Hello, World!\n" +"14\n" +">>> printf(b\"%d bottles of beer\\n\", 42)\n" +"42 bottles of beer\n" +"19\n" +">>> printf(b\"%f bottles of beer\\n\", 42.5)\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"ctypes.ArgumentError: argument 2: TypeError: Don't know how to convert parameter 2\n" +">>>" + +#: ../../library/ctypes.rst:500 +msgid "" +"As has been mentioned before, all Python types except integers, strings, and" +" bytes objects have to be wrapped in their corresponding :mod:`!ctypes` " +"type, so that they can be converted to the required C data type::" +msgstr "" +"正如前面所提到的,除整数、字符串和字节串外的所有 Python 类型都必须包装在其对应的 :mod:`!ctypes` " +"类型中,这样它们才能被转换为所需的 C 数据类型::" + +#: ../../library/ctypes.rst:504 +msgid "" +">>> printf(b\"An int %d, a double %f\\n\", 1234, c_double(3.14))\n" +"An int 1234, a double 3.140000\n" +"31\n" +">>>" +msgstr "" +">>> printf(b\"An int %d, a double %f\\n\", 1234, c_double(3.14))\n" +"An int 1234, a double 3.140000\n" +"31\n" +">>>" + +#: ../../library/ctypes.rst:512 +msgid "Calling variadic functions" +msgstr "调用可变函数" + +#: ../../library/ctypes.rst:514 +msgid "" +"On a lot of platforms calling variadic functions through ctypes is exactly " +"the same as calling functions with a fixed number of parameters. On some " +"platforms, and in particular ARM64 for Apple Platforms, the calling " +"convention for variadic functions is different than that for regular " +"functions." +msgstr "" +"在许多平台上通过 ctypes 调用可变函数与调用带有固定数量形参的函数是完全一样的。 在某些平台,特别是针对 Apple 平台的 ARM64 " +"上,可变函数的调用约定与常规函数则是不同的。" + +#: ../../library/ctypes.rst:519 +msgid "" +"On those platforms it is required to specify the :attr:`~_CFuncPtr.argtypes`" +" attribute for the regular, non-variadic, function arguments:" +msgstr "在这些平台上要求为常规、非可变函数参数指定 :attr:`~_CFuncPtr.argtypes` 属性:" + +#: ../../library/ctypes.rst:522 +msgid "libc.printf.argtypes = [ctypes.c_char_p]" +msgstr "libc.printf.argtypes = [ctypes.c_char_p]" + +#: ../../library/ctypes.rst:526 +msgid "" +"Because specifying the attribute does not inhibit portability it is advised " +"to always specify :attr:`~_CFuncPtr.argtypes` for all variadic functions." +msgstr "因为指定该属性不会影响可移植性所以建议总是为所有可变函数指定 :attr:`~_CFuncPtr.argtypes`。" + +#: ../../library/ctypes.rst:533 +msgid "Calling functions with your own custom data types" +msgstr "使用自定义的数据类型调用函数" + +#: ../../library/ctypes.rst:535 +msgid "" +"You can also customize :mod:`!ctypes` argument conversion to allow instances" +" of your own classes be used as function arguments. :mod:`!ctypes` looks for" +" an :attr:`!_as_parameter_` attribute and uses this as the function " +"argument. The attribute must be an integer, string, bytes, a :mod:`!ctypes` " +"instance, or an object with an :attr:`!_as_parameter_` attribute::" +msgstr "" +"你也可以通过自定义 :mod:`!ctypes` 参数转换方式来允许你自己的类实例被用作函数参数。 :mod:`!ctypes` 会寻找 " +":attr:`!_as_parameter_` 属性并使用它作为函数参数。 属性必须为整数、字符串、:mod:`!ctypes` 实例,或者具有 " +":attr:`!_as_parameter_` 属性的对象::" + +#: ../../library/ctypes.rst:541 +msgid "" +">>> class Bottles:\n" +"... def __init__(self, number):\n" +"... self._as_parameter_ = number\n" +"...\n" +">>> bottles = Bottles(42)\n" +">>> printf(b\"%d bottles of beer\\n\", bottles)\n" +"42 bottles of beer\n" +"19\n" +">>>" +msgstr "" +">>> class Bottles:\n" +"... def __init__(self, number):\n" +"... self._as_parameter_ = number\n" +"...\n" +">>> bottles = Bottles(42)\n" +">>> printf(b\"%d bottles of beer\\n\", bottles)\n" +"42 bottles of beer\n" +"19\n" +">>>" + +#: ../../library/ctypes.rst:551 +msgid "" +"If you don't want to store the instance's data in the " +":attr:`!_as_parameter_` instance variable, you could define a " +":class:`property` which makes the attribute available on request." +msgstr "" +"如果你不想将实例数据存储在 :attr:`!_as_parameter_` 实例变量中,可以定义一个根据请求提供属性的 " +":class:`property`。" + +#: ../../library/ctypes.rst:559 +msgid "Specifying the required argument types (function prototypes)" +msgstr "指定必选参数的类型(函数原型)" + +#: ../../library/ctypes.rst:561 +msgid "" +"It is possible to specify the required argument types of functions exported " +"from DLLs by setting the :attr:`~_CFuncPtr.argtypes` attribute." +msgstr "可以通过设置 :attr:`~_CFuncPtr.argtypes` 属性来指定从 DLL 导出函数的必选参数类型。" + +#: ../../library/ctypes.rst:564 +msgid "" +":attr:`~_CFuncPtr.argtypes` must be a sequence of C data types (the " +":func:`!printf` function is probably not a good example here, because it " +"takes a variable number and different types of parameters depending on the " +"format string, on the other hand this is quite handy to experiment with this" +" feature)::" +msgstr "" +":attr:`~_CFuncPtr.argtypes` 必须是一个 C 数据类型的序列(这里 :func:`!printf` " +"函数可能不是一个好例子,因为它会根据格式字符串的不同接受可变数量和不同类型的形参,但另一方面这对尝试此功能来说也很方便)::" + +#: ../../library/ctypes.rst:569 +msgid "" +">>> printf.argtypes = [c_char_p, c_char_p, c_int, c_double]\n" +">>> printf(b\"String '%s', Int %d, Double %f\\n\", b\"Hi\", 10, 2.2)\n" +"String 'Hi', Int 10, Double 2.200000\n" +"37\n" +">>>" +msgstr "" +">>> printf.argtypes = [c_char_p, c_char_p, c_int, c_double]\n" +">>> printf(b\"String '%s', Int %d, Double %f\\n\", b\"Hi\", 10, 2.2)\n" +"String 'Hi', Int 10, Double 2.200000\n" +"37\n" +">>>" + +#: ../../library/ctypes.rst:575 +msgid "" +"Specifying a format protects against incompatible argument types (just as a " +"prototype for a C function), and tries to convert the arguments to valid " +"types::" +msgstr "指定数据类型可以防止不合理的参数传递(就像 C 函数的原型),并且会自动尝试将参数转换为需要的类型::" + +#: ../../library/ctypes.rst:578 +msgid "" +">>> printf(b\"%d %d %d\", 1, 2, 3)\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"ctypes.ArgumentError: argument 2: TypeError: 'int' object cannot be interpreted as ctypes.c_char_p\n" +">>> printf(b\"%s %d %f\\n\", b\"X\", 2, 3)\n" +"X 2 3.000000\n" +"13\n" +">>>" +msgstr "" +">>> printf(b\"%d %d %d\", 1, 2, 3)\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"ctypes.ArgumentError: argument 2: TypeError: 'int' object cannot be interpreted as ctypes.c_char_p\n" +">>> printf(b\"%s %d %f\\n\", b\"X\", 2, 3)\n" +"X 2 3.000000\n" +"13\n" +">>>" + +#: ../../library/ctypes.rst:587 +msgid "" +"If you have defined your own classes which you pass to function calls, you " +"have to implement a :meth:`~_CData.from_param` class method for them to be " +"able to use them in the :attr:`~_CFuncPtr.argtypes` sequence. The " +":meth:`~_CData.from_param` class method receives the Python object passed to" +" the function call, it should do a typecheck or whatever is needed to make " +"sure this object is acceptable, and then return the object itself, its " +":attr:`!_as_parameter_` attribute, or whatever you want to pass as the C " +"function argument in this case. Again, the result should be an integer, " +"string, bytes, a :mod:`!ctypes` instance, or an object with an " +":attr:`!_as_parameter_` attribute." +msgstr "" +"如果你定义了自己的类并将其传递给函数调用,则你必须为它们实现 :meth:`~_CData.from_param` 类方法才能够在 " +":attr:`~_CFuncPtr.argtypes` 序列中使用它们。 :meth:`~_CData.from_param` " +"类方法接受传递给函数调用的 Python 对象,它应该进行类型检查或者其他必要的操作以确保这个对象是可接受的,然后返回对象本身、它的 " +":attr:`!_as_parameter_` 属性,或在此情况下作为 C 函数参数传入的任何东西。 " +"同样,结果应该是整数、字符串、字节串、:mod:`!ctypes` 实例或是具有 :attr:`!_as_parameter_` 属性的对象。" + +#: ../../library/ctypes.rst:601 +msgid "Return types" +msgstr "返回类型" + +#: ../../library/ctypes.rst:611 +msgid "" +"By default functions are assumed to return the C :c:expr:`int` type. Other " +"return types can be specified by setting the :attr:`~_CFuncPtr.restype` " +"attribute of the function object." +msgstr "" +"在默认情况下都会假定函数返回 C :c:expr:`int` 类型。 其他返回类型可通过设置函数对象的 " +":attr:`~_CFuncPtr.restype` 属性来指定。" + +#: ../../library/ctypes.rst:615 +msgid "" +"The C prototype of :c:func:`time` is ``time_t time(time_t *)``. Because " +":c:type:`time_t` might be of a different type than the default return type " +":c:expr:`int`, you should specify the :attr:`!restype` attribute::" +msgstr "" +":c:func:`time` 的 C 原型是 ``time_t time(time_t *)``。 由于 :c:type:`time_t` " +"的类型可能不同于默认返回类型 :c:expr:`int`,你应当指定 :attr:`!restype` 属性::" + +#: ../../library/ctypes.rst:619 +msgid ">>> libc.time.restype = c_time_t" +msgstr ">>> libc.time.restype = c_time_t" + +#: ../../library/ctypes.rst:621 +msgid "" +"The argument types can be specified using :attr:`~_CFuncPtr.argtypes`::" +msgstr "参数类型可以使用 :attr:`~_CFuncPtr.argtypes` 来指定::" + +#: ../../library/ctypes.rst:623 +msgid ">>> libc.time.argtypes = (POINTER(c_time_t),)" +msgstr ">>> libc.time.argtypes = (POINTER(c_time_t),)" + +#: ../../library/ctypes.rst:625 +msgid "" +"To call the function with a ``NULL`` pointer as first argument, use " +"``None``::" +msgstr "调用该函数时如果要将 ``NULL`` 指针作为第一个参数,请使用 ``None``::" + +#: ../../library/ctypes.rst:627 +msgid "" +">>> print(libc.time(None))\n" +"1150640792" +msgstr "" +">>> print(libc.time(None))\n" +"1150640792" + +#: ../../library/ctypes.rst:630 +msgid "" +"Here is a more advanced example, it uses the :func:`!strchr` function, which" +" expects a string pointer and a char, and returns a pointer to a string::" +msgstr "下面是一个更高级的示例,它使用了 :func:`!strchr` 函数,该函数接收一个字符串指针和一个字符,并返回一个字符串指针::" + +#: ../../library/ctypes.rst:633 +msgid "" +">>> strchr = libc.strchr\n" +">>> strchr(b\"abcdef\", ord(\"d\"))\n" +"8059983\n" +">>> strchr.restype = c_char_p # c_char_p is a pointer to a string\n" +">>> strchr(b\"abcdef\", ord(\"d\"))\n" +"b'def'\n" +">>> print(strchr(b\"abcdef\", ord(\"x\")))\n" +"None\n" +">>>" +msgstr "" +">>> strchr = libc.strchr\n" +">>> strchr(b\"abcdef\", ord(\"d\"))\n" +"8059983\n" +">>> strchr.restype = c_char_p # c_char_p 是一个指向字符串的指针\n" +">>> strchr(b\"abcdef\", ord(\"d\"))\n" +"b'def'\n" +">>> print(strchr(b\"abcdef\", ord(\"x\")))\n" +"None\n" +">>>" + +#: ../../library/ctypes.rst:643 +msgid "" +"If you want to avoid the :func:`ord(\"x\") ` calls above, you can set " +"the :attr:`~_CFuncPtr.argtypes` attribute, and the second argument will be " +"converted from a single character Python bytes object into a C char:" +msgstr "" +"如果你想要避免上面的 :func:`ord(\"x\") ` 调用,你可以设置 :attr:`~_CFuncPtr.argtypes` " +"属性,第二个参数将从单字符 Python 字节串对象转换为 C char:" + +#: ../../library/ctypes.rst:647 +msgid "" +">>> strchr.restype = c_char_p\n" +">>> strchr.argtypes = [c_char_p, c_char]\n" +">>> strchr(b\"abcdef\", b\"d\")\n" +"b'def'\n" +">>> strchr(b\"abcdef\", b\"def\")\n" +"Traceback (most recent call last):\n" +"ctypes.ArgumentError: argument 2: TypeError: one character bytes, bytearray or integer expected\n" +">>> print(strchr(b\"abcdef\", b\"x\"))\n" +"None\n" +">>> strchr(b\"abcdef\", b\"d\")\n" +"b'def'\n" +">>>" +msgstr "" +">>> strchr.restype = c_char_p\n" +">>> strchr.argtypes = [c_char_p, c_char]\n" +">>> strchr(b\"abcdef\", b\"d\")\n" +"b'def'\n" +">>> strchr(b\"abcdef\", b\"def\")\n" +"Traceback (most recent call last):\n" +"ctypes.ArgumentError: argument 2: TypeError: one character bytes, bytearray or integer expected\n" +">>> print(strchr(b\"abcdef\", b\"x\"))\n" +"None\n" +">>> strchr(b\"abcdef\", b\"d\")\n" +"b'def'\n" +">>>" + +#: ../../library/ctypes.rst:662 +msgid "" +"You can also use a callable Python object (a function or a class for " +"example) as the :attr:`~_CFuncPtr.restype` attribute, if the foreign " +"function returns an integer. The callable will be called with the *integer*" +" the C function returns, and the result of this call will be used as the " +"result of your function call. This is useful to check for error return " +"values and automatically raise an exception::" +msgstr "" +"如果外部函数返回一个整数,你也可以使用一个 Python 可调用对象(例如函数或类)作为 :attr:`~_CFuncPtr.restype` 属性。 " +"该可调用对象被调用时将附带 C 函数返回的 *整数*,其调用结果将被用作函数调用的结果值。 这对于检查错误返回值并自动引发异常来说很有用处::" + +#: ../../library/ctypes.rst:668 +msgid "" +">>> GetModuleHandle = windll.kernel32.GetModuleHandleA\n" +">>> def ValidHandle(value):\n" +"... if value == 0:\n" +"... raise WinError()\n" +"... return value\n" +"...\n" +">>>\n" +">>> GetModuleHandle.restype = ValidHandle\n" +">>> GetModuleHandle(None)\n" +"486539264\n" +">>> GetModuleHandle(\"something silly\")\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +" File \"\", line 3, in ValidHandle\n" +"OSError: [Errno 126] The specified module could not be found.\n" +">>>" +msgstr "" +">>> GetModuleHandle = windll.kernel32.GetModuleHandleA\n" +">>> def ValidHandle(value):\n" +"... if value == 0:\n" +"... raise WinError()\n" +"... return value\n" +"...\n" +">>>\n" +">>> GetModuleHandle.restype = ValidHandle\n" +">>> GetModuleHandle(None)\n" +"486539264\n" +">>> GetModuleHandle(\"something silly\")\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +" File \"\", line 3, in ValidHandle\n" +"OSError: [Errno 126] The specified module could not be found.\n" +">>>" + +#: ../../library/ctypes.rst:685 +msgid "" +"``WinError`` is a function which will call Windows ``FormatMessage()`` api " +"to get the string representation of an error code, and *returns* an " +"exception. ``WinError`` takes an optional error code parameter, if no one is" +" used, it calls :func:`GetLastError` to retrieve it." +msgstr "" +"``WinError`` 函数可以调用 Windows 的 ``FormatMessage()`` API 获取错误码的字符串说明,然后 *返回* " +"一个异常。 ``WinError`` 接收一个可选的错误码作为参数,如果没有的话,它将调用 :func:`GetLastError` 获取错误码。" + +#: ../../library/ctypes.rst:690 +msgid "" +"Please note that a much more powerful error checking mechanism is available " +"through the :attr:`~_CFuncPtr.errcheck` attribute; see the reference manual " +"for details." +msgstr "请注意通过 :attr:`~_CFuncPtr.errcheck` 属性可提供更强大的错误检查机制;详情见参考手册。" + +#: ../../library/ctypes.rst:698 +msgid "Passing pointers (or: passing parameters by reference)" +msgstr "传递指针(或以引用方式传递形参)" + +#: ../../library/ctypes.rst:700 +msgid "" +"Sometimes a C api function expects a *pointer* to a data type as parameter, " +"probably to write into the corresponding location, or if the data is too " +"large to be passed by value. This is also known as *passing parameters by " +"reference*." +msgstr "" +"有时候 C 函数接口可能由于要往某个地址写入值,或者数据太大不适合作为值传递,从而希望接收一个 *指针* 作为数据参数类型。这和 *传递参数引用* " +"类似。" + +#: ../../library/ctypes.rst:704 +msgid "" +":mod:`!ctypes` exports the :func:`byref` function which is used to pass " +"parameters by reference. The same effect can be achieved with the " +":func:`pointer` function, although :func:`pointer` does a lot more work " +"since it constructs a real pointer object, so it is faster to use " +":func:`byref` if you don't need the pointer object in Python itself::" +msgstr "" +":mod:`!ctypes` 导出了 :func:`byref` 函数用于通过引用传递参数,使用 :func:`pointer` " +"函数也能达到同样的效果,只不过 :func:`pointer` 需要更多步骤,因为它要先构造一个真实指针对象。所以在 Python " +"代码本身不需要使用这个指针对象的情况下,使用 :func:`byref` 效率更高::" + +#: ../../library/ctypes.rst:710 +msgid "" +">>> i = c_int()\n" +">>> f = c_float()\n" +">>> s = create_string_buffer(b'\\000' * 32)\n" +">>> print(i.value, f.value, repr(s.value))\n" +"0 0.0 b''\n" +">>> libc.sscanf(b\"1 3.14 Hello\", b\"%d %f %s\",\n" +"... byref(i), byref(f), s)\n" +"3\n" +">>> print(i.value, f.value, repr(s.value))\n" +"1 3.1400001049 b'Hello'\n" +">>>" +msgstr "" +">>> i = c_int()\n" +">>> f = c_float()\n" +">>> s = create_string_buffer(b'\\000' * 32)\n" +">>> print(i.value, f.value, repr(s.value))\n" +"0 0.0 b''\n" +">>> libc.sscanf(b\"1 3.14 Hello\", b\"%d %f %s\",\n" +"... byref(i), byref(f), s)\n" +"3\n" +">>> print(i.value, f.value, repr(s.value))\n" +"1 3.1400001049 b'Hello'\n" +">>>" + +#: ../../library/ctypes.rst:726 +msgid "Structures and unions" +msgstr "结构体和联合" + +#: ../../library/ctypes.rst:728 +msgid "" +"Structures and unions must derive from the :class:`Structure` and " +":class:`Union` base classes which are defined in the :mod:`!ctypes` module. " +"Each subclass must define a :attr:`~Structure._fields_` attribute. " +":attr:`!_fields_` must be a list of *2-tuples*, containing a *field name* " +"and a *field type*." +msgstr "" +"结构体和联合必须派生自 :class:`Structure` 和 :class:`Union` 基类,这两个基类是在 :mod:`!ctypes` " +"模块中定义的。 每个子类都必须定义 :attr:`~Structure._fields_` 属性。 :attr:`!_fields_` 必须是一个 " +"*2元组* 的列表,其中包含一个 *字段名称* 和一个 *字段类型*。" + +#: ../../library/ctypes.rst:733 +msgid "" +"The field type must be a :mod:`!ctypes` type like :class:`c_int`, or any " +"other derived :mod:`!ctypes` type: structure, union, array, pointer." +msgstr "" +"type 字段必须是一个 :mod:`!ctypes` 类型,比如 :class:`c_int`,或者任何其他派生 :mod:`!ctypes` " +"类型:结构、联合、数组、指针。" + +#: ../../library/ctypes.rst:736 +msgid "" +"Here is a simple example of a POINT structure, which contains two integers " +"named *x* and *y*, and also shows how to initialize a structure in the " +"constructor::" +msgstr "这是一个简单的 POINT 结构体,它包含名称为 *x* 和 *y* 的两个变量,还展示了如何通过构造函数初始化结构体::" + +#: ../../library/ctypes.rst:739 +msgid "" +">>> from ctypes import *\n" +">>> class POINT(Structure):\n" +"... _fields_ = [(\"x\", c_int),\n" +"... (\"y\", c_int)]\n" +"...\n" +">>> point = POINT(10, 20)\n" +">>> print(point.x, point.y)\n" +"10 20\n" +">>> point = POINT(y=5)\n" +">>> print(point.x, point.y)\n" +"0 5\n" +">>> POINT(1, 2, 3)\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"TypeError: too many initializers\n" +">>>" +msgstr "" +">>> from ctypes import *\n" +">>> class POINT(Structure):\n" +"... _fields_ = [(\"x\", c_int),\n" +"... (\"y\", c_int)]\n" +"...\n" +">>> point = POINT(10, 20)\n" +">>> print(point.x, point.y)\n" +"10 20\n" +">>> point = POINT(y=5)\n" +">>> print(point.x, point.y)\n" +"0 5\n" +">>> POINT(1, 2, 3)\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"TypeError: too many initializers\n" +">>>" + +#: ../../library/ctypes.rst:756 +msgid "" +"You can, however, build much more complicated structures. A structure can " +"itself contain other structures by using a structure as a field type." +msgstr "当然,你可以构造更复杂的结构体。一个结构体可以通过设置 type 字段包含其他结构体或者自身。" + +#: ../../library/ctypes.rst:759 +msgid "" +"Here is a RECT structure which contains two POINTs named *upperleft* and " +"*lowerright*::" +msgstr "这是一个 RECT 结构体,它包含了两个 POINT ,分别叫 *upperleft* 和 *lowerright*::" + +#: ../../library/ctypes.rst:762 +msgid "" +">>> class RECT(Structure):\n" +"... _fields_ = [(\"upperleft\", POINT),\n" +"... (\"lowerright\", POINT)]\n" +"...\n" +">>> rc = RECT(point)\n" +">>> print(rc.upperleft.x, rc.upperleft.y)\n" +"0 5\n" +">>> print(rc.lowerright.x, rc.lowerright.y)\n" +"0 0\n" +">>>" +msgstr "" +">>> class RECT(Structure):\n" +"... _fields_ = [(\"upperleft\", POINT),\n" +"... (\"lowerright\", POINT)]\n" +"...\n" +">>> rc = RECT(point)\n" +">>> print(rc.upperleft.x, rc.upperleft.y)\n" +"0 5\n" +">>> print(rc.lowerright.x, rc.lowerright.y)\n" +"0 0\n" +">>>" + +#: ../../library/ctypes.rst:773 +msgid "" +"Nested structures can also be initialized in the constructor in several " +"ways::" +msgstr "嵌套结构体可以通过几种方式构造初始化::" + +#: ../../library/ctypes.rst:775 +msgid "" +">>> r = RECT(POINT(1, 2), POINT(3, 4))\n" +">>> r = RECT((1, 2), (3, 4))" +msgstr "" +">>> r = RECT(POINT(1, 2), POINT(3, 4))\n" +">>> r = RECT((1, 2), (3, 4))" + +#: ../../library/ctypes.rst:778 +msgid "" +"Field :term:`descriptor`\\s can be retrieved from the *class*, they are " +"useful for debugging because they can provide useful information. See " +":class:`CField`::" +msgstr "" +"字段 :term:`descriptor` 可以从 *class* 提取,它们在调试时很有用处因为它们能提供有用的信息。 参见 " +":class:`CField`::" + +#: ../../library/ctypes.rst:782 +msgid "" +">>> POINT.x\n" +"\n" +">>> POINT.y\n" +"\n" +">>>" +msgstr "" +">>> POINT.x\n" +"\n" +">>> POINT.y\n" +"\n" +">>>" + +#: ../../library/ctypes.rst:793 +msgid "" +":mod:`!ctypes` does not support passing unions or structures with bit-fields" +" to functions by value. While this may work on 32-bit x86, it's not " +"guaranteed by the library to work in the general case. Unions and " +"structures with bit-fields should always be passed to functions by pointer." +msgstr "" +":mod:`!ctypes` 不支持带位域的结构体、联合以值的方式传给函数。 这可能在 32 位 x86 " +"平台上可以正常工作,但是对于一般情况,这种行为是未定义的。 带位域的结构体、联合应该总是通过指针传递给函数。" + +#: ../../library/ctypes.rst:799 +msgid "Structure/union layout, alignment and byte order" +msgstr "结构/联合布局、对齐和字节顺序" + +#: ../../library/ctypes.rst:801 +msgid "" +"By default, Structure and Union fields are laid out in the same way the C " +"compiler does it. It is possible to override this behavior entirely by " +"specifying a :attr:`~Structure._layout_` class attribute in the subclass " +"definition; see the attribute documentation for details." +msgstr "" +"默认情况下,结构体和联合的字段布局方式与 C 编译器的处理方式相同。可以通过在子类定义中指定 :attr:`~Structure._layout_` " +"类属性来完全覆盖此行为;有关详细信息,请参阅该属性的文档。" + +#: ../../library/ctypes.rst:806 +msgid "" +"It is possible to specify the maximum alignment for the fields and/or for " +"the structure itself by setting the class attributes " +":attr:`~Structure._pack_` and/or :attr:`~Structure._align_`, respectively. " +"See the attribute documentation for details." +msgstr "" +"通过分别设置类属性 :attr:`~Structure._pack_` 和/或 :attr:`~Structure._align_` " +"可以为字段和/或为结构体本身指定最大对齐值。 请参阅相应属性文档了解详情。" + +#: ../../library/ctypes.rst:811 +msgid "" +":mod:`!ctypes` uses the native byte order for Structures and Unions. To " +"build structures with non-native byte order, you can use one of the " +":class:`BigEndianStructure`, :class:`LittleEndianStructure`, " +":class:`BigEndianUnion`, and :class:`LittleEndianUnion` base classes. These" +" classes cannot contain pointer fields." +msgstr "" +":mod:`!ctypes` 中的结构体和联合使用的是本地字节序。要使用非本地字节序,可以使用 :class:`BigEndianStructure`," +" :class:`LittleEndianStructure`, :class:`BigEndianUnion` 和 " +":class:`LittleEndianUnion` 基类中的一个。 这些类不能包含指针字段。" + +#: ../../library/ctypes.rst:821 +msgid "Bit fields in structures and unions" +msgstr "结构体和联合中的位域" + +#: ../../library/ctypes.rst:823 +msgid "" +"It is possible to create structures and unions containing bit fields. Bit " +"fields are only possible for integer fields, the bit width is specified as " +"the third item in the :attr:`~Structure._fields_` tuples::" +msgstr "" +"可以创建包含位字段的结构体和联合。 位字段只适用于整数字段,位宽度是由 :attr:`~Structure._fields_` " +"元组中的第三项来指定的::" + +#: ../../library/ctypes.rst:827 +msgid "" +">>> class Int(Structure):\n" +"... _fields_ = [(\"first_16\", c_int, 16),\n" +"... (\"second_16\", c_int, 16)]\n" +"...\n" +">>> print(Int.first_16)\n" +"\n" +">>> print(Int.second_16)\n" +"" +msgstr "" +">>> class Int(Structure):\n" +"... _fields_ = [(\"first_16\", c_int, 16),\n" +"... (\"second_16\", c_int, 16)]\n" +"...\n" +">>> print(Int.first_16)\n" +"\n" +">>> print(Int.second_16)\n" +"" + +#: ../../library/ctypes.rst:836 +msgid "" +"It is important to note that bit field allocation and layout in memory are " +"not defined as a C standard; their implementation is compiler-specific. By " +"default, Python will attempt to match the behavior of a \"native\" compiler " +"for the current platform. See the :attr:`~Structure._layout_` attribute for " +"details on the default behavior and how to change it." +msgstr "" +"需要注意的是,位域在内存中的分配和布局并非 C 标准所定义;其实现取决于具体的编译器。默认情况下,Python " +"会尝试匹配当前平台上“原生”编译器的行为。有关默认行为以及如何修改它的详细信息,请参阅 :attr:`~Structure._layout_` 属性。" + +#: ../../library/ctypes.rst:847 +msgid "Arrays" +msgstr "数组" + +#: ../../library/ctypes.rst:849 +msgid "" +"Arrays are sequences, containing a fixed number of instances of the same " +"type." +msgstr "数组是一个序列,包含指定个数元素,且必须类型相同。" + +#: ../../library/ctypes.rst:851 +msgid "" +"The recommended way to create array types is by multiplying a data type with" +" a positive integer::" +msgstr "创建数组类型的推荐方式是使用一个类型乘以一个正数::" + +#: ../../library/ctypes.rst:854 +msgid "TenPointsArrayType = POINT * 10" +msgstr "TenPointsArrayType = POINT * 10" + +#: ../../library/ctypes.rst:856 +msgid "" +"Here is an example of a somewhat artificial data type, a structure " +"containing 4 POINTs among other stuff::" +msgstr "下面是一个构造的数据案例,结构体中包含了 4 个 POINT 和一些其他东西::" + +#: ../../library/ctypes.rst:859 +msgid "" +">>> from ctypes import *\n" +">>> class POINT(Structure):\n" +"... _fields_ = (\"x\", c_int), (\"y\", c_int)\n" +"...\n" +">>> class MyStruct(Structure):\n" +"... _fields_ = [(\"a\", c_int),\n" +"... (\"b\", c_float),\n" +"... (\"point_array\", POINT * 4)]\n" +">>>\n" +">>> print(len(MyStruct().point_array))\n" +"4\n" +">>>" +msgstr "" +">>> from ctypes import *\n" +">>> class POINT(Structure):\n" +"... _fields_ = (\"x\", c_int), (\"y\", c_int)\n" +"...\n" +">>> class MyStruct(Structure):\n" +"... _fields_ = [(\"a\", c_int),\n" +"... (\"b\", c_float),\n" +"... (\"point_array\", POINT * 4)]\n" +">>>\n" +">>> print(len(MyStruct().point_array))\n" +"4\n" +">>>" + +#: ../../library/ctypes.rst:872 +msgid "Instances are created in the usual way, by calling the class::" +msgstr "和平常一样,通过调用它创建实例::" + +#: ../../library/ctypes.rst:874 +msgid "" +"arr = TenPointsArrayType()\n" +"for pt in arr:\n" +" print(pt.x, pt.y)" +msgstr "" +"arr = TenPointsArrayType()\n" +"for pt in arr:\n" +" print(pt.x, pt.y)" + +#: ../../library/ctypes.rst:878 +msgid "" +"The above code print a series of ``0 0`` lines, because the array contents " +"is initialized to zeros." +msgstr "以上代码会打印几行 ``0 0`` ,因为数组内容被初始化为 0." + +#: ../../library/ctypes.rst:881 +msgid "Initializers of the correct type can also be specified::" +msgstr "也能通过指定正确类型的数据来初始化::" + +#: ../../library/ctypes.rst:883 +msgid "" +">>> from ctypes import *\n" +">>> TenIntegers = c_int * 10\n" +">>> ii = TenIntegers(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)\n" +">>> print(ii)\n" +"\n" +">>> for i in ii: print(i, end=\" \")\n" +"...\n" +"1 2 3 4 5 6 7 8 9 10\n" +">>>" +msgstr "" +">>> from ctypes import *\n" +">>> TenIntegers = c_int * 10\n" +">>> ii = TenIntegers(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)\n" +">>> print(ii)\n" +"\n" +">>> for i in ii: print(i, end=\" \")\n" +"...\n" +"1 2 3 4 5 6 7 8 9 10\n" +">>>" + +#: ../../library/ctypes.rst:897 +msgid "Pointers" +msgstr "指针" + +#: ../../library/ctypes.rst:899 +msgid "" +"Pointer instances are created by calling the :func:`pointer` function on a " +":mod:`!ctypes` type::" +msgstr "指针实例是通过在 :mod:`!ctypes` 类型上调用 :func:`pointer` 函数来创建的::" + +#: ../../library/ctypes.rst:902 +msgid "" +">>> from ctypes import *\n" +">>> i = c_int(42)\n" +">>> pi = pointer(i)\n" +">>>" +msgstr "" +">>> from ctypes import *\n" +">>> i = c_int(42)\n" +">>> pi = pointer(i)\n" +">>>" + +#: ../../library/ctypes.rst:907 +msgid "" +"Pointer instances have a :attr:`~_Pointer.contents` attribute which returns " +"the object to which the pointer points, the ``i`` object above::" +msgstr "指针实例拥有 :attr:`~_Pointer.contents` 属性,它返回指针指向的真实对象,如上面的 ``i`` 对象::" + +#: ../../library/ctypes.rst:910 +msgid "" +">>> pi.contents\n" +"c_long(42)\n" +">>>" +msgstr "" +">>> pi.contents\n" +"c_long(42)\n" +">>>" + +#: ../../library/ctypes.rst:914 +msgid "" +"Note that :mod:`!ctypes` does not have OOR (original object return), it " +"constructs a new, equivalent object each time you retrieve an attribute::" +msgstr "" +"请注意 :mod:`!ctypes` 没有 OOR (original object " +"return),在你每次提取属性时它都会构造一个新的、等价的对象::" + +#: ../../library/ctypes.rst:917 +msgid "" +">>> pi.contents is i\n" +"False\n" +">>> pi.contents is pi.contents\n" +"False\n" +">>>" +msgstr "" +">>> pi.contents is i\n" +"False\n" +">>> pi.contents is pi.contents\n" +"False\n" +">>>" + +#: ../../library/ctypes.rst:923 +msgid "" +"Assigning another :class:`c_int` instance to the pointer's contents " +"attribute would cause the pointer to point to the memory location where this" +" is stored::" +msgstr "将这个指针的 contents 属性赋值为另一个 :class:`c_int` 实例将会导致该指针指向该实例的内存地址::" + +#: ../../library/ctypes.rst:926 +msgid "" +">>> i = c_int(99)\n" +">>> pi.contents = i\n" +">>> pi.contents\n" +"c_long(99)\n" +">>>" +msgstr "" +">>> i = c_int(99)\n" +">>> pi.contents = i\n" +">>> pi.contents\n" +"c_long(99)\n" +">>>" + +#: ../../library/ctypes.rst:935 +msgid "Pointer instances can also be indexed with integers::" +msgstr "指针对象也可以通过整数下标进行访问::" + +#: ../../library/ctypes.rst:937 +msgid "" +">>> pi[0]\n" +"99\n" +">>>" +msgstr "" +">>> pi[0]\n" +"99\n" +">>>" + +#: ../../library/ctypes.rst:941 +msgid "Assigning to an integer index changes the pointed to value::" +msgstr "通过整数下标赋值可以改变指针所指向的真实内容::" + +#: ../../library/ctypes.rst:943 +msgid "" +">>> print(i)\n" +"c_long(99)\n" +">>> pi[0] = 22\n" +">>> print(i)\n" +"c_long(22)\n" +">>>" +msgstr "" +">>> print(i)\n" +"c_long(99)\n" +">>> pi[0] = 22\n" +">>> print(i)\n" +"c_long(22)\n" +">>>" + +#: ../../library/ctypes.rst:950 +msgid "" +"It is also possible to use indexes different from 0, but you must know what " +"you're doing, just as in C: You can access or change arbitrary memory " +"locations. Generally you only use this feature if you receive a pointer from" +" a C function, and you *know* that the pointer actually points to an array " +"instead of a single item." +msgstr "" +"使用 0 以外的索引也是合法的,但是你必须确保知道自己为什么这么做,就像 C 语言中: 你可以访问或者修改任意内存内容。 " +"通常只会在函数接收指针是才会使用这种特性,而且你 *知道* 这个指针指向的是一个数组而不是单个值。" + +#: ../../library/ctypes.rst:956 +msgid "" +"Behind the scenes, the :func:`pointer` function does more than simply create" +" pointer instances, it has to create pointer *types* first. This is done " +"with the :func:`POINTER` function, which accepts any :mod:`!ctypes` type, " +"and returns a new type::" +msgstr "" +"在内部,:func:`pointer` 函数不只是创建了一个指针实例,它首先创建了一个指针 *类型*。 这是通过 :func:`POINTER` " +"函数完成的,它接收任意 :mod:`!ctypes` 类型,并返回一个新类型::" + +#: ../../library/ctypes.rst:961 +msgid "" +">>> PI = POINTER(c_int)\n" +">>> PI\n" +"\n" +">>> PI(42)\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"TypeError: expected c_long instead of int\n" +">>> PI(c_int(42))\n" +"\n" +">>>" +msgstr "" +">>> PI = POINTER(c_int)\n" +">>> PI\n" +"\n" +">>> PI(42)\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"TypeError: expected c_long instead of int\n" +">>> PI(c_int(42))\n" +"\n" +">>>" + +#: ../../library/ctypes.rst:972 +msgid "" +"Calling the pointer type without an argument creates a ``NULL`` pointer. " +"``NULL`` pointers have a ``False`` boolean value::" +msgstr "无参调用指针类型可以创建一个 ``NULL`` 指针。 ``NULL`` 指针的布尔值是 ``False`` ::" + +#: ../../library/ctypes.rst:975 +msgid "" +">>> null_ptr = POINTER(c_int)()\n" +">>> print(bool(null_ptr))\n" +"False\n" +">>>" +msgstr "" +">>> null_ptr = POINTER(c_int)()\n" +">>> print(bool(null_ptr))\n" +"False\n" +">>>" + +#: ../../library/ctypes.rst:980 +msgid "" +":mod:`!ctypes` checks for ``NULL`` when dereferencing pointers (but " +"dereferencing invalid non-\\ ``NULL`` pointers would crash Python)::" +msgstr "" +":mod:`!ctypes` 会在解引用指针时检测 ``NULL`` 值 (但解引用无效的非 ``NULL`` 指针仍会导致 Python 崩溃)::" + +#: ../../library/ctypes.rst:983 +msgid "" +">>> null_ptr[0]\n" +"Traceback (most recent call last):\n" +" ....\n" +"ValueError: NULL pointer access\n" +">>>\n" +"\n" +">>> null_ptr[0] = 1234\n" +"Traceback (most recent call last):\n" +" ....\n" +"ValueError: NULL pointer access\n" +">>>" +msgstr "" +">>> null_ptr[0]\n" +"Traceback (most recent call last):\n" +" ....\n" +"ValueError: NULL pointer access\n" +">>>\n" +"\n" +">>> null_ptr[0] = 1234\n" +"Traceback (most recent call last):\n" +" ....\n" +"ValueError: NULL pointer access\n" +">>>" + +#: ../../library/ctypes.rst:998 +msgid "Thread safety without the GIL" +msgstr "没有 GIL 时的线程安全性" + +#: ../../library/ctypes.rst:1000 +msgid "" +"From Python 3.13 onward, the :term:`GIL` can be disabled on the :term:`free-" +"threaded build`. In ctypes, reads and writes to a single object concurrently" +" is safe, but not across multiple objects:" +msgstr "" +"从 Python 3.13 开始,:term:`GIL` 在 :term:`free-threaded build` 中可被禁用。 在 ctypes " +"中,对单个对象的并发读写是安全的,但跨多个对象则是不安全的:" + +#: ../../library/ctypes.rst:1003 +msgid "" +">>> number = c_int(42)\n" +">>> pointer_a = pointer(number)\n" +">>> pointer_b = pointer(number)" +msgstr "" +">>> number = c_int(42)\n" +">>> pointer_a = pointer(number)\n" +">>> pointer_b = pointer(number)" + +#: ../../library/ctypes.rst:1009 +msgid "" +"In the above, it's only safe for one object to read and write to the address" +" at once if the GIL is disabled. So, ``pointer_a`` can be shared and written" +" to across multiple threads, but only if ``pointer_b`` is not also " +"attempting to do the same. If this is an issue, consider using a " +":class:`threading.Lock` to synchronize access to memory:" +msgstr "" +"在上述情况下,如果 GIL 已禁用,只有当一个对象对地址进行读写时才是安全的。因此,``pointer_a`` 可以在多个线程之间共享和写入,但前提是 " +"``pointer_b`` 不同时尝试执行相同操作。如果这是个问题,可以考虑使用 :class:`threading.Lock` 来同步对内存的访问:" + +#: ../../library/ctypes.rst:1014 +msgid "" +">>> import threading\n" +">>> lock = threading.Lock()\n" +">>> # Thread 1\n" +">>> with lock:\n" +"... pointer_a.contents = 24\n" +">>> # Thread 2\n" +">>> with lock:\n" +"... pointer_b.contents = 42" +msgstr "" +">>> import threading\n" +">>> lock = threading.Lock()\n" +">>> # Thread 1\n" +">>> with lock:\n" +"... pointer_a.contents = 24\n" +">>> # Thread 2\n" +">>> with lock:\n" +"... pointer_b.contents = 42" + +#: ../../library/ctypes.rst:1029 +msgid "Type conversions" +msgstr "类型转换" + +#: ../../library/ctypes.rst:1031 +msgid "" +"Usually, ctypes does strict type checking. This means, if you have " +"``POINTER(c_int)`` in the :attr:`~_CFuncPtr.argtypes` list of a function or " +"as the type of a member field in a structure definition, only instances of " +"exactly the same type are accepted. There are some exceptions to this rule," +" where ctypes accepts other objects. For example, you can pass compatible " +"array instances instead of pointer types. So, for ``POINTER(c_int)``, " +"ctypes accepts an array of c_int::" +msgstr "" +"通常,ctypes 会进行严格的类型检查。 这意味着,如果在某个函数的 :attr:`~_CFuncPtr.argtypes` 列表中有 " +"``POINTER(c_int)`` 或在结构体定义中将其用作成员字段的类型,则只接受完全相同类型的实例。 此规则也有一些例外情况,在这些情况下 " +"ctypes 可以接受其他对象。 例如,你可以传入兼容的数组实例而不是指针类型。 因此,对于 ``POINTER(c_int)``,ctypes " +"接受一个 c_int 数组::" + +#: ../../library/ctypes.rst:1038 +msgid "" +">>> class Bar(Structure):\n" +"... _fields_ = [(\"count\", c_int), (\"values\", POINTER(c_int))]\n" +"...\n" +">>> bar = Bar()\n" +">>> bar.values = (c_int * 3)(1, 2, 3)\n" +">>> bar.count = 3\n" +">>> for i in range(bar.count):\n" +"... print(bar.values[i])\n" +"...\n" +"1\n" +"2\n" +"3\n" +">>>" +msgstr "" +">>> class Bar(Structure):\n" +"... _fields_ = [(\"count\", c_int), (\"values\", POINTER(c_int))]\n" +"...\n" +">>> bar = Bar()\n" +">>> bar.values = (c_int * 3)(1, 2, 3)\n" +">>> bar.count = 3\n" +">>> for i in range(bar.count):\n" +"... print(bar.values[i])\n" +"...\n" +"1\n" +"2\n" +"3\n" +">>>" + +#: ../../library/ctypes.rst:1052 +msgid "" +"In addition, if a function argument is explicitly declared to be a pointer " +"type (such as ``POINTER(c_int)``) in :attr:`~_CFuncPtr.argtypes`, an object " +"of the pointed type (``c_int`` in this case) can be passed to the function." +" ctypes will apply the required :func:`byref` conversion in this case " +"automatically." +msgstr "" +"此外,如果一个函数参数在 :attr:`~_CFuncPtr.argtypes` 中显式地声明为指针类型 (如 " +"``POINTER(c_int)``),则可以向该函数传递所指向的类型的对象 (在本例中为 ``c_int``)。 在这种情况下,ctypes " +"将自动应用所需的 :func:`byref` 转换。" + +#: ../../library/ctypes.rst:1057 +msgid "To set a POINTER type field to ``NULL``, you can assign ``None``::" +msgstr "可以给指针内容赋值为 ``None`` 将其设置为 ``NULL`` ::" + +#: ../../library/ctypes.rst:1059 +msgid "" +">>> bar.values = None\n" +">>>" +msgstr "" +">>> bar.values = None\n" +">>>" + +#: ../../library/ctypes.rst:1064 +msgid "" +"Sometimes you have instances of incompatible types. In C, you can cast one " +"type into another type. :mod:`!ctypes` provides a :func:`cast` function " +"which can be used in the same way. The ``Bar`` structure defined above " +"accepts ``POINTER(c_int)`` pointers or :class:`c_int` arrays for its " +"``values`` field, but not instances of other types::" +msgstr "" +"有时你会遇到不兼容类型的实例。 在 C 中,你可以将一个类型强制转换为另一个类型。 :mod:`!ctypes` 提供了可通过相同方式使用的 " +":func:`cast` 函数。 上面定义的 ``Bar`` 结构体接受 ``POINTER(c_int)`` 指针或 :class:`c_int` " +"数组作为其 ``values`` 字段,但不能是其他类型的实例::" + +#: ../../library/ctypes.rst:1070 +msgid "" +">>> bar.values = (c_byte * 4)()\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"TypeError: incompatible types, c_byte_Array_4 instance instead of LP_c_long instance\n" +">>>" +msgstr "" +">>> bar.values = (c_byte * 4)()\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"TypeError: incompatible types, c_byte_Array_4 instance instead of LP_c_long instance\n" +">>>" + +#: ../../library/ctypes.rst:1076 +msgid "For these cases, the :func:`cast` function is handy." +msgstr "这种情况下, 需要手动使用 :func:`cast` 函数。" + +#: ../../library/ctypes.rst:1078 +msgid "" +"The :func:`cast` function can be used to cast a ctypes instance into a " +"pointer to a different ctypes data type. :func:`cast` takes two parameters," +" a ctypes object that is or can be converted to a pointer of some kind, and " +"a ctypes pointer type. It returns an instance of the second argument, which" +" references the same memory block as the first argument::" +msgstr "" +":func:`cast` 函数可以将一个指针实例强制转换为另一种 ctypes 类型。 :func:`cast` 接收两个参数,一个 ctypes " +"指针对象或者可以被转换为指针的其他类型对象,和一个 ctypes 指针类型。 返回第二个类型的一个实例,该返回实例和第一个参数指向同一片内存空间::" + +#: ../../library/ctypes.rst:1084 +msgid "" +">>> a = (c_byte * 4)()\n" +">>> cast(a, POINTER(c_int))\n" +"\n" +">>>" +msgstr "" +">>> a = (c_byte * 4)()\n" +">>> cast(a, POINTER(c_int))\n" +"\n" +">>>" + +#: ../../library/ctypes.rst:1089 +msgid "" +"So, :func:`cast` can be used to assign to the ``values`` field of ``Bar`` " +"the structure::" +msgstr "所以 :func:`cast` 可以用来给结构体 ``Bar`` 的 ``values`` 字段赋值::" + +#: ../../library/ctypes.rst:1092 +msgid "" +">>> bar = Bar()\n" +">>> bar.values = cast((c_byte * 4)(), POINTER(c_int))\n" +">>> print(bar.values[0])\n" +"0\n" +">>>" +msgstr "" +">>> bar = Bar()\n" +">>> bar.values = cast((c_byte * 4)(), POINTER(c_int))\n" +">>> print(bar.values[0])\n" +"0\n" +">>>" + +#: ../../library/ctypes.rst:1102 +msgid "Incomplete Types" +msgstr "不完整类型" + +#: ../../library/ctypes.rst:1104 +msgid "" +"*Incomplete Types* are structures, unions or arrays whose members are not " +"yet specified. In C, they are specified by forward declarations, which are " +"defined later::" +msgstr "*不完整类型* 即还没有定义成员的结构体、联合或者数组。在 C 中,它们通常用于前置声明,然后在后面定义::" + +#: ../../library/ctypes.rst:1108 +msgid "" +"struct cell; /* forward declaration */\n" +"\n" +"struct cell {\n" +" char *name;\n" +" struct cell *next;\n" +"};" +msgstr "" +"struct cell; /* 前向声明 */\n" +"\n" +"struct cell {\n" +" char *name;\n" +" struct cell *next;\n" +"};" + +#: ../../library/ctypes.rst:1115 +msgid "" +"The straightforward translation into ctypes code would be this, but it does " +"not work::" +msgstr "直接翻译成 ctypes 的代码如下,但是这行不通::" + +#: ../../library/ctypes.rst:1118 +msgid "" +">>> class cell(Structure):\n" +"... _fields_ = [(\"name\", c_char_p),\n" +"... (\"next\", POINTER(cell))]\n" +"...\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +" File \"\", line 2, in cell\n" +"NameError: name 'cell' is not defined\n" +">>>" +msgstr "" +">>> class cell(Structure):\n" +"... _fields_ = [(\"name\", c_char_p),\n" +"... (\"next\", POINTER(cell))]\n" +"...\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +" File \"\", line 2, in cell\n" +"NameError: name 'cell' is not defined\n" +">>>" + +#: ../../library/ctypes.rst:1128 +msgid "" +"because the new ``class cell`` is not available in the class statement " +"itself. In :mod:`!ctypes`, we can define the ``cell`` class and set the " +":attr:`~Structure._fields_` attribute later, after the class statement::" +msgstr "" +"因为新的 ``class cell`` 在 class 语句本身中是不可用的。 在 :mod:`!ctypes` 中,我们可以先定义 ``cell`` " +"类,在 class 语句之后设置 :attr:`~Structure._fields_` 属性::" + +#: ../../library/ctypes.rst:1132 +msgid "" +">>> from ctypes import *\n" +">>> class cell(Structure):\n" +"... pass\n" +"...\n" +">>> cell._fields_ = [(\"name\", c_char_p),\n" +"... (\"next\", POINTER(cell))]\n" +">>>" +msgstr "" +">>> from ctypes import *\n" +">>> class cell(Structure):\n" +"... pass\n" +"...\n" +">>> cell._fields_ = [(\"name\", c_char_p),\n" +"... (\"next\", POINTER(cell))]\n" +">>>" + +#: ../../library/ctypes.rst:1140 +msgid "" +"Let's try it. We create two instances of ``cell``, and let them point to " +"each other, and finally follow the pointer chain a few times::" +msgstr "让我们试试。我们定义两个 ``cell`` 实例,让它们互相指向对方,然后通过指针链式访问几次::" + +#: ../../library/ctypes.rst:1143 +msgid "" +">>> c1 = cell()\n" +">>> c1.name = b\"foo\"\n" +">>> c2 = cell()\n" +">>> c2.name = b\"bar\"\n" +">>> c1.next = pointer(c2)\n" +">>> c2.next = pointer(c1)\n" +">>> p = c1\n" +">>> for i in range(8):\n" +"... print(p.name, end=\" \")\n" +"... p = p.next[0]\n" +"...\n" +"foo bar foo bar foo bar foo bar\n" +">>>" +msgstr "" +">>> c1 = cell()\n" +">>> c1.name = b\"foo\"\n" +">>> c2 = cell()\n" +">>> c2.name = b\"bar\"\n" +">>> c1.next = pointer(c2)\n" +">>> c2.next = pointer(c1)\n" +">>> p = c1\n" +">>> for i in range(8):\n" +"... print(p.name, end=\" \")\n" +"... p = p.next[0]\n" +"...\n" +"foo bar foo bar foo bar foo bar\n" +">>>" + +#: ../../library/ctypes.rst:1161 +msgid "Callback functions" +msgstr "回调函数" + +#: ../../library/ctypes.rst:1163 +msgid "" +":mod:`!ctypes` allows creating C callable function pointers from Python " +"callables. These are sometimes called *callback functions*." +msgstr ":mod:`!ctypes` 允许根据 Python 可调用对象创建 C 可调用函数指针。 它们有时被称为 *回调函数*。" + +#: ../../library/ctypes.rst:1166 +msgid "" +"First, you must create a class for the callback function. The class knows " +"the calling convention, the return type, and the number and types of " +"arguments this function will receive." +msgstr "首先,你必须为回调函数创建一个类,这个类知道调用约定,包括返回值类型以及函数接收的参数类型及个数。" + +#: ../../library/ctypes.rst:1170 +msgid "" +"The :func:`CFUNCTYPE` factory function creates types for callback functions " +"using the ``cdecl`` calling convention. On Windows, the :func:`WINFUNCTYPE` " +"factory function creates types for callback functions using the ``stdcall`` " +"calling convention." +msgstr "" +":func:`CFUNCTYPE` 工厂函数使用 ``cdecl`` 调用约定创建回调函数类型。在 Windows 上, " +":func:`WINFUNCTYPE` 工厂函数使用 ``stdcall`` 调用约定为回调函数创建类型。" + +#: ../../library/ctypes.rst:1175 +msgid "" +"Both of these factory functions are called with the result type as first " +"argument, and the callback functions expected argument types as the " +"remaining arguments." +msgstr "这些工厂函数的第一个参数是返回值类型,回调函数的参数类型作为剩余参数。" + +#: ../../library/ctypes.rst:1179 +msgid "" +"I will present an example here which uses the standard C library's " +":c:func:`!qsort` function, that is used to sort items with the help of a " +"callback function. :c:func:`!qsort` will be used to sort an array of " +"integers::" +msgstr "" +"这里展示一个使用标准 C 库的 :c:func:`!qsort` 函数例子,使用它在一个回调函数的协助下对条目进行排序。 " +":c:func:`!qsort` 将被用来给一个整数的数组排序::" + +#: ../../library/ctypes.rst:1183 +msgid "" +">>> IntArray5 = c_int * 5\n" +">>> ia = IntArray5(5, 1, 7, 33, 99)\n" +">>> qsort = libc.qsort\n" +">>> qsort.restype = None\n" +">>>" +msgstr "" +">>> IntArray5 = c_int * 5\n" +">>> ia = IntArray5(5, 1, 7, 33, 99)\n" +">>> qsort = libc.qsort\n" +">>> qsort.restype = None\n" +">>>" + +#: ../../library/ctypes.rst:1189 +msgid "" +":func:`!qsort` must be called with a pointer to the data to sort, the number" +" of items in the data array, the size of one item, and a pointer to the " +"comparison function, the callback. The callback will then be called with two" +" pointers to items, and it must return a negative integer if the first item " +"is smaller than the second, a zero if they are equal, and a positive integer" +" otherwise." +msgstr "" +":func:`!qsort` 被调用时必须传入一个指向要排序的数据的指针、数据数组中的条目数、每条目的大小以及一个指向比较函数即回调函数的指针。 " +"回调函数将附带两个指向条目的指针进行调用,如果第一个条目小于第二个条目则它必须返回一个负整数,如果两者相等则返回零,在其他情况下则返回一个正整数。" + +#: ../../library/ctypes.rst:1195 +msgid "" +"So our callback function receives pointers to integers, and must return an " +"integer. First we create the ``type`` for the callback function::" +msgstr "所以,我们的回调函数要接收两个整数指针,返回一个整数。首先我们创建回调函数的 ``类型`` ::" + +#: ../../library/ctypes.rst:1198 +msgid "" +">>> CMPFUNC = CFUNCTYPE(c_int, POINTER(c_int), POINTER(c_int))\n" +">>>" +msgstr "" +">>> CMPFUNC = CFUNCTYPE(c_int, POINTER(c_int), POINTER(c_int))\n" +">>>" + +#: ../../library/ctypes.rst:1201 +msgid "" +"To get started, here is a simple callback that shows the values it gets " +"passed::" +msgstr "首先,这是一个简单的回调,它会显示传入的值::" + +#: ../../library/ctypes.rst:1204 +msgid "" +">>> def py_cmp_func(a, b):\n" +"... print(\"py_cmp_func\", a[0], b[0])\n" +"... return 0\n" +"...\n" +">>> cmp_func = CMPFUNC(py_cmp_func)\n" +">>>" +msgstr "" +">>> def py_cmp_func(a, b):\n" +"... print(\"py_cmp_func\", a[0], b[0])\n" +"... return 0\n" +"...\n" +">>> cmp_func = CMPFUNC(py_cmp_func)\n" +">>>" + +#: ../../library/ctypes.rst:1211 +msgid "The result::" +msgstr "结果::" + +#: ../../library/ctypes.rst:1213 +msgid "" +">>> qsort(ia, len(ia), sizeof(c_int), cmp_func)\n" +"py_cmp_func 5 1\n" +"py_cmp_func 33 99\n" +"py_cmp_func 7 33\n" +"py_cmp_func 5 7\n" +"py_cmp_func 1 7\n" +">>>" +msgstr "" +">>> qsort(ia, len(ia), sizeof(c_int), cmp_func)\n" +"py_cmp_func 5 1\n" +"py_cmp_func 33 99\n" +"py_cmp_func 7 33\n" +"py_cmp_func 5 7\n" +"py_cmp_func 1 7\n" +">>>" + +#: ../../library/ctypes.rst:1221 +msgid "Now we can actually compare the two items and return a useful result::" +msgstr "现在我们可以比较两个元素并返回有用的结果了::" + +#: ../../library/ctypes.rst:1223 +msgid "" +">>> def py_cmp_func(a, b):\n" +"... print(\"py_cmp_func\", a[0], b[0])\n" +"... return a[0] - b[0]\n" +"...\n" +">>>\n" +">>> qsort(ia, len(ia), sizeof(c_int), CMPFUNC(py_cmp_func))\n" +"py_cmp_func 5 1\n" +"py_cmp_func 33 99\n" +"py_cmp_func 7 33\n" +"py_cmp_func 1 7\n" +"py_cmp_func 5 7\n" +">>>" +msgstr "" +">>> def py_cmp_func(a, b):\n" +"... print(\"py_cmp_func\", a[0], b[0])\n" +"... return a[0] - b[0]\n" +"...\n" +">>>\n" +">>> qsort(ia, len(ia), sizeof(c_int), CMPFUNC(py_cmp_func))\n" +"py_cmp_func 5 1\n" +"py_cmp_func 33 99\n" +"py_cmp_func 7 33\n" +"py_cmp_func 1 7\n" +"py_cmp_func 5 7\n" +">>>" + +#: ../../library/ctypes.rst:1236 +msgid "As we can easily check, our array is sorted now::" +msgstr "我们可以轻易地验证,现在数组是有序的了::" + +#: ../../library/ctypes.rst:1238 +msgid "" +">>> for i in ia: print(i, end=\" \")\n" +"...\n" +"1 5 7 33 99\n" +">>>" +msgstr "" +">>> for i in ia: print(i, end=\" \")\n" +"...\n" +"1 5 7 33 99\n" +">>>" + +#: ../../library/ctypes.rst:1243 +msgid "" +"The function factories can be used as decorator factories, so we may as well" +" write::" +msgstr "这些工厂函数可以当作装饰器工厂,所以可以这样写::" + +#: ../../library/ctypes.rst:1246 +msgid "" +">>> @CFUNCTYPE(c_int, POINTER(c_int), POINTER(c_int))\n" +"... def py_cmp_func(a, b):\n" +"... print(\"py_cmp_func\", a[0], b[0])\n" +"... return a[0] - b[0]\n" +"...\n" +">>> qsort(ia, len(ia), sizeof(c_int), py_cmp_func)\n" +"py_cmp_func 5 1\n" +"py_cmp_func 33 99\n" +"py_cmp_func 7 33\n" +"py_cmp_func 1 7\n" +"py_cmp_func 5 7\n" +">>>" +msgstr "" +">>> @CFUNCTYPE(c_int, POINTER(c_int), POINTER(c_int))\n" +"... def py_cmp_func(a, b):\n" +"... print(\"py_cmp_func\", a[0], b[0])\n" +"... return a[0] - b[0]\n" +"...\n" +">>> qsort(ia, len(ia), sizeof(c_int), py_cmp_func)\n" +"py_cmp_func 5 1\n" +"py_cmp_func 33 99\n" +"py_cmp_func 7 33\n" +"py_cmp_func 1 7\n" +"py_cmp_func 5 7\n" +">>>" + +#: ../../library/ctypes.rst:1261 +msgid "" +"Make sure you keep references to :func:`CFUNCTYPE` objects as long as they " +"are used from C code. :mod:`!ctypes` doesn't, and if you don't, they may be " +"garbage collected, crashing your program when a callback is made." +msgstr "" +"请确保你在 C 代码使用 :func:`CFUNCTYPE` 对象期间一直持有指向它们的引用。 :mod:`!ctypes` " +"不会确保这一点,而如果没有这样做,它们可能被垃圾回收,并在你的程序执行回调时发生崩溃。" + +#: ../../library/ctypes.rst:1265 +msgid "" +"Also, note that if the callback function is called in a thread created " +"outside of Python's control (e.g. by the foreign code that calls the " +"callback), ctypes creates a new dummy Python thread on every invocation. " +"This behavior is correct for most purposes, but it means that values stored " +"with :class:`threading.local` will *not* survive across different callbacks," +" even when those calls are made from the same C thread." +msgstr "" +"注意,如果回调函数在Python之外的另外一个线程使用(比如,外部代码调用这个回调函数), ctypes 会在每一次调用上创建一个虚拟 Python " +"线程。这个行为在大多数情况下是合理的,但也意味着如果有数据使用 :class:`threading.local` " +"方式存储,将无法访问,就算它们是在同一个 C 线程中调用的 。" + +#: ../../library/ctypes.rst:1275 +msgid "Accessing values exported from dlls" +msgstr "访问 dll 的导出变量" + +#: ../../library/ctypes.rst:1277 +msgid "" +"Some shared libraries not only export functions, they also export variables." +" An example in the Python library itself is the :c:data:`Py_Version`, Python" +" runtime version number encoded in a single constant integer." +msgstr "" +"某些共享库不仅会导出函数,还会导出变量。 一个例子就是 Python 库本身的 :c:data:`Py_Version`,Python " +"运行时版本号被编码为单个整数常量。" + +#: ../../library/ctypes.rst:1281 +msgid "" +":mod:`!ctypes` can access values like this with the :meth:`~_CData.in_dll` " +"class methods of the type. *pythonapi* is a predefined symbol giving access" +" to the Python C api::" +msgstr "" +":mod:`!ctypes` 可以通过类型的 :meth:`~_CData.in_dll` 类方法访问这样的值。 *pythonapi* 是一个用于访问" +" Python C api 的预定义符号::" + +#: ../../library/ctypes.rst:1285 +msgid "" +">>> version = ctypes.c_int.in_dll(ctypes.pythonapi, \"Py_Version\")\n" +">>> print(hex(version.value))\n" +"0x30c00a0" +msgstr "" +">>> version = ctypes.c_int.in_dll(ctypes.pythonapi, \"Py_Version\")\n" +">>> print(hex(version.value))\n" +"0x30c00a0" + +#: ../../library/ctypes.rst:1289 +msgid "" +"An extended example which also demonstrates the use of pointers accesses the" +" :c:data:`PyImport_FrozenModules` pointer exported by Python." +msgstr "" +"一个扩展例子, 同时也展示了使用指针访问 Python 导出的 :c:data:`PyImport_FrozenModules` 指针对象。" + +#: ../../library/ctypes.rst:1292 +msgid "Quoting the docs for that value:" +msgstr "对文档中这个值的解释说明" + +#: ../../library/ctypes.rst:1294 +msgid "" +"This pointer is initialized to point to an array of :c:struct:`_frozen` " +"records, terminated by one whose members are all ``NULL`` or zero. When a " +"frozen module is imported, it is searched in this table. Third-party code " +"could play tricks with this to provide a dynamically created collection of " +"frozen modules." +msgstr "" +"该指针被初始化为指向一个 :c:struct:`_frozen` 记录的数组,以一个所有成员均为 ``NULL`` 或零的记录表示结束。 " +"当一个冻结模块被导入时,它将在此表中被搜索。 第三方代码可以利用此方式来提供动态创建的冻结模块集。" + +#: ../../library/ctypes.rst:1299 +msgid "" +"So manipulating this pointer could even prove useful. To restrict the " +"example size, we show only how this table can be read with :mod:`!ctypes`::" +msgstr "因此可以证明操纵这个指针是有用的。 为了限制样例的大小,我们只展示如何使用 :mod:`!ctypes` 读取这个表::" + +#: ../../library/ctypes.rst:1302 +msgid "" +">>> from ctypes import *\n" +">>>\n" +">>> class struct_frozen(Structure):\n" +"... _fields_ = [(\"name\", c_char_p),\n" +"... (\"code\", POINTER(c_ubyte)),\n" +"... (\"size\", c_int),\n" +"... (\"get_code\", POINTER(c_ubyte)), # Function pointer\n" +"... ]\n" +"...\n" +">>>" +msgstr "" +">>> from ctypes import *\n" +">>>\n" +">>> class struct_frozen(Structure):\n" +"... _fields_ = [(\"name\", c_char_p),\n" +"... (\"code\", POINTER(c_ubyte)),\n" +"... (\"size\", c_int),\n" +"... (\"get_code\", POINTER(c_ubyte)), # 函数指针\n" +"... ]\n" +"...\n" +">>>" + +#: ../../library/ctypes.rst:1313 +msgid "" +"We have defined the :c:struct:`_frozen` data type, so we can get the pointer" +" to the table::" +msgstr "我们定义了 :c:struct:`_frozen` 数据类型,所以我们可以获取表的指针::" + +#: ../../library/ctypes.rst:1316 +msgid "" +">>> FrozenTable = POINTER(struct_frozen)\n" +">>> table = FrozenTable.in_dll(pythonapi, \"_PyImport_FrozenBootstrap\")\n" +">>>" +msgstr "" +">>> FrozenTable = POINTER(struct_frozen)\n" +">>> table = FrozenTable.in_dll(pythonapi, \"_PyImport_FrozenBootstrap\")\n" +">>>" + +#: ../../library/ctypes.rst:1320 +msgid "" +"Since ``table`` is a ``pointer`` to the array of ``struct_frozen`` records, " +"we can iterate over it, but we just have to make sure that our loop " +"terminates, because pointers have no size. Sooner or later it would probably" +" crash with an access violation or whatever, so it's better to break out of " +"the loop when we hit the ``NULL`` entry::" +msgstr "" +"由于 ``table`` 是一个指向 ``struct_frozen`` 数组的 " +"``指针``,我们可以遍历它,只不过需要自己判断循环是否结束,因为指针本身并不包含长度。 " +"它早晚会因为访问到野指针或者什么的把自己搞崩溃,所以我们最好在遇到 ``NULL`` 后就让它退出循环::" + +#: ../../library/ctypes.rst:1326 +msgid "" +">>> for item in table:\n" +"... if item.name is None:\n" +"... break\n" +"... print(item.name.decode(\"ascii\"), item.size)\n" +"...\n" +"_frozen_importlib 31764\n" +"_frozen_importlib_external 41499\n" +"zipimport 12345\n" +">>>" +msgstr "" +">>> for item in table:\n" +"... if item.name is None:\n" +"... break\n" +"... print(item.name.decode(\"ascii\"), item.size)\n" +"...\n" +"_frozen_importlib 31764\n" +"_frozen_importlib_external 41499\n" +"zipimport 12345\n" +">>>" + +#: ../../library/ctypes.rst:1336 +msgid "" +"The fact that standard Python has a frozen module and a frozen package " +"(indicated by the negative ``size`` member) is not well known, it is only " +"used for testing. Try it out with ``import __hello__`` for example." +msgstr "" +"Python 的冻结模块和冻结包(由负 ``size`` 成员表示)并不是广为人知的事情,它们仅仅用于实验。例如,可以使用 ``import " +"__hello__`` 尝试一下这个功能。" + +#: ../../library/ctypes.rst:1344 +msgid "Surprises" +msgstr "意外" + +#: ../../library/ctypes.rst:1346 +msgid "" +"There are some edges in :mod:`!ctypes` where you might expect something " +"other than what actually happens." +msgstr "在 :mod:`!ctypes` 存在一些边界情况会使你的预期与实际发生的事情有所不同。" + +#: ../../library/ctypes.rst:1349 +msgid "Consider the following example::" +msgstr "比如下面的例子::" + +#: ../../library/ctypes.rst:1351 +msgid "" +">>> from ctypes import *\n" +">>> class POINT(Structure):\n" +"... _fields_ = (\"x\", c_int), (\"y\", c_int)\n" +"...\n" +">>> class RECT(Structure):\n" +"... _fields_ = (\"a\", POINT), (\"b\", POINT)\n" +"...\n" +">>> p1 = POINT(1, 2)\n" +">>> p2 = POINT(3, 4)\n" +">>> rc = RECT(p1, p2)\n" +">>> print(rc.a.x, rc.a.y, rc.b.x, rc.b.y)\n" +"1 2 3 4\n" +">>> # now swap the two points\n" +">>> rc.a, rc.b = rc.b, rc.a\n" +">>> print(rc.a.x, rc.a.y, rc.b.x, rc.b.y)\n" +"3 4 3 4\n" +">>>" +msgstr "" +">>> from ctypes import *\n" +">>> class POINT(Structure):\n" +"... _fields_ = (\"x\", c_int), (\"y\", c_int)\n" +"...\n" +">>> class RECT(Structure):\n" +"... _fields_ = (\"a\", POINT), (\"b\", POINT)\n" +"...\n" +">>> p1 = POINT(1, 2)\n" +">>> p2 = POINT(3, 4)\n" +">>> rc = RECT(p1, p2)\n" +">>> print(rc.a.x, rc.a.y, rc.b.x, rc.b.y)\n" +"1 2 3 4\n" +">>> # 现在交换这两个\n" +">>> rc.a, rc.b = rc.b, rc.a\n" +">>> print(rc.a.x, rc.a.y, rc.b.x, rc.b.y)\n" +"3 4 3 4\n" +">>>" + +#: ../../library/ctypes.rst:1369 +msgid "" +"Hm. We certainly expected the last statement to print ``3 4 1 2``. What " +"happened? Here are the steps of the ``rc.a, rc.b = rc.b, rc.a`` line above::" +msgstr "" +"嗯。我们预想应该打印 ``3 4 1 2`` 。但是为什么呢? 这是 ``rc.a, rc.b = rc.b, rc.a`` 这行代码展开后的步骤::" + +#: ../../library/ctypes.rst:1372 +msgid "" +">>> temp0, temp1 = rc.b, rc.a\n" +">>> rc.a = temp0\n" +">>> rc.b = temp1\n" +">>>" +msgstr "" +">>> temp0, temp1 = rc.b, rc.a\n" +">>> rc.a = temp0\n" +">>> rc.b = temp1\n" +">>>" + +#: ../../library/ctypes.rst:1377 +msgid "" +"Note that ``temp0`` and ``temp1`` are objects still using the internal " +"buffer of the ``rc`` object above. So executing ``rc.a = temp0`` copies the " +"buffer contents of ``temp0`` into ``rc`` 's buffer. This, in turn, changes " +"the contents of ``temp1``. So, the last assignment ``rc.b = temp1``, doesn't" +" have the expected effect." +msgstr "" +"注意 ``temp0`` 和 ``temp1`` 对象始终引用了对象 ``rc`` 的内容。然后执行 ``rc.a = temp0`` 会把 " +"``temp0`` 的内容拷贝到 ``rc`` 的空间。这也改变了 ``temp1`` 的内容。最终导致赋值语句 ``rc.b = temp1`` " +"没有产生预想的效果。" + +#: ../../library/ctypes.rst:1383 +msgid "" +"Keep in mind that retrieving sub-objects from Structure, Unions, and Arrays " +"doesn't *copy* the sub-object, instead it retrieves a wrapper object " +"accessing the root-object's underlying buffer." +msgstr "记住,访问被包含在结构体、联合、数组中的对象并不会将其 *复制* 出来,而是得到了一个代理对象,它是对根对象的内部内容的一层包装。" + +#: ../../library/ctypes.rst:1387 +msgid "" +"Another example that may behave differently from what one would expect is " +"this::" +msgstr "下面是另一个可能和预期有偏差的例子::" + +#: ../../library/ctypes.rst:1389 +msgid "" +">>> s = c_char_p()\n" +">>> s.value = b\"abc def ghi\"\n" +">>> s.value\n" +"b'abc def ghi'\n" +">>> s.value is s.value\n" +"False\n" +">>>" +msgstr "" +">>> s = c_char_p()\n" +">>> s.value = b\"abc def ghi\"\n" +">>> s.value\n" +"b'abc def ghi'\n" +">>> s.value is s.value\n" +"False\n" +">>>" + +#: ../../library/ctypes.rst:1399 +msgid "" +"Objects instantiated from :class:`c_char_p` can only have their value set to" +" bytes or integers." +msgstr "使用 :class:`c_char_p`  实例化的对象只能将其值设置为 bytes 或者整数。" + +#: ../../library/ctypes.rst:1402 +msgid "" +"Why is it printing ``False``? ctypes instances are objects containing a " +"memory block plus some :term:`descriptor`\\s accessing the contents of the " +"memory. Storing a Python object in the memory block does not store the " +"object itself, instead the ``contents`` of the object is stored. Accessing " +"the contents again constructs a new Python object each time!" +msgstr "" +"为什么这里打印了 ``False`` ? ctypes 实例是一些内存块加上一些用于访问这些内存块的 :term:`descriptor` 组成。将 " +"Python 对象存储在内存块并不会存储对象本身,而是存储了对象的 ``内容`` 。每次访问对象的内容都会构造一个新的 Python 对象。" + +#: ../../library/ctypes.rst:1412 +msgid "Variable-sized data types" +msgstr "变长数据类型" + +#: ../../library/ctypes.rst:1414 +msgid "" +":mod:`!ctypes` provides some support for variable-sized arrays and " +"structures." +msgstr ":mod:`!ctypes` 对变长数据和结构体提供了一些支持。" + +#: ../../library/ctypes.rst:1416 +msgid "" +"The :func:`resize` function can be used to resize the memory buffer of an " +"existing ctypes object. The function takes the object as first argument, " +"and the requested size in bytes as the second argument. The memory block " +"cannot be made smaller than the natural memory block specified by the " +"objects type, a :exc:`ValueError` is raised if this is tried::" +msgstr "" +" :func:`resize` 函数可以用于改变已有的 ctypes " +"对象内存缓冲区大小。此函数第一个参数是ctypes对象,第二个参数是要求调整后的大小,单位是字节。不能使存储块小于对象的原有大小,否则抛出 " +":exc:`ValueError` 异常。" + +#: ../../library/ctypes.rst:1422 +msgid "" +">>> short_array = (c_short * 4)()\n" +">>> print(sizeof(short_array))\n" +"8\n" +">>> resize(short_array, 4)\n" +"Traceback (most recent call last):\n" +" ...\n" +"ValueError: minimum size is 8\n" +">>> resize(short_array, 32)\n" +">>> sizeof(short_array)\n" +"32\n" +">>> sizeof(type(short_array))\n" +"8\n" +">>>" +msgstr "" +">>> short_array = (c_short * 4)()\n" +">>> print(sizeof(short_array))\n" +"8\n" +">>> resize(short_array, 4)\n" +"Traceback (most recent call last):\n" +" ...\n" +"ValueError: minimum size is 8\n" +">>> resize(short_array, 32)\n" +">>> sizeof(short_array)\n" +"32\n" +">>> sizeof(type(short_array))\n" +"8\n" +">>>" + +#: ../../library/ctypes.rst:1436 +msgid "" +"This is nice and fine, but how would one access the additional elements " +"contained in this array? Since the type still only knows about 4 elements, " +"we get errors accessing other elements::" +msgstr "这非常好,但是要怎么访问数组中额外的元素呢?因为数组类型已经定义包含4个元素,导致我们访问新增元素时会产生以下错误::" + +#: ../../library/ctypes.rst:1440 +msgid "" +">>> short_array[:]\n" +"[0, 0, 0, 0]\n" +">>> short_array[7]\n" +"Traceback (most recent call last):\n" +" ...\n" +"IndexError: invalid index\n" +">>>" +msgstr "" +">>> short_array[:]\n" +"[0, 0, 0, 0]\n" +">>> short_array[7]\n" +"Traceback (most recent call last):\n" +" ...\n" +"IndexError: invalid index\n" +">>>" + +#: ../../library/ctypes.rst:1448 +msgid "" +"Another way to use variable-sized data types with :mod:`!ctypes` is to use " +"the dynamic nature of Python, and (re-)define the data type after the " +"required size is already known, on a case by case basis." +msgstr "" +"通过 :mod:`!ctypes` 使用变长数据类型的另一种方式是使用 Python " +"的动态特性,并在已获知所需的大小之后,根据具体情况(重新)定义数据类型。" + +#: ../../library/ctypes.rst:1456 +msgid "ctypes reference" +msgstr "ctypes 参考手册" + +#: ../../library/ctypes.rst:1462 +msgid "Finding shared libraries" +msgstr "寻找动态链接库" + +#: ../../library/ctypes.rst:1464 +msgid "" +"When programming in a compiled language, shared libraries are accessed when " +"compiling/linking a program, and when the program is run." +msgstr "在编译型语言中,动态链接库会在编译、链接或者程序运行时访问。" + +#: ../../library/ctypes.rst:1467 +msgid "" +"The purpose of the :func:`~ctypes.util.find_library` function is to locate a" +" library in a way similar to what the compiler or runtime loader does (on " +"platforms with several versions of a shared library the most recent should " +"be loaded), while the ctypes library loaders act like when a program is run," +" and call the runtime loader directly." +msgstr "" +":func:`~ctypes.util.find_library` " +"函数的目的是以类似于编译器或运行时加载器的方式来定位库(在有多个共享库版本的平台上应当加载最新的版本),而 ctypes " +"库加载器的行为类似于程序已经运行时直接调用运行时加载器。" + +#: ../../library/ctypes.rst:1473 +msgid "" +"The :mod:`!ctypes.util` module provides a function which can help to " +"determine the library to load." +msgstr ":mod:`!ctypes.util` 模块提供了一个函数,可以帮助确定要加载的库。" + +#: ../../library/ctypes.rst:1481 +msgid "" +"Try to find a library and return a pathname. *name* is the library name " +"without any prefix like *lib*, suffix like ``.so``, ``.dylib`` or version " +"number (this is the form used for the posix linker option :option:`!-l`). " +"If no library can be found, returns ``None``." +msgstr "" +"尝试寻找一个库然后返回其路径名, *name* 是库名称, 且去除了 *lib* 等前缀和 ``.so`` 、 ``.dylib`` " +"、版本号等后缀(这是 posix 连接器 :option:`!-l` 选项使用的格式)。如果没有找到对应的库,则返回 ``None`` 。" + +#: ../../library/ctypes.rst:1486 ../../library/ctypes.rst:2245 +msgid "The exact functionality is system dependent." +msgstr "确切的功能取决于系统。" + +#: ../../library/ctypes.rst:1488 +msgid "" +"On Linux, :func:`~ctypes.util.find_library` tries to run external programs " +"(``/sbin/ldconfig``, ``gcc``, ``objdump`` and ``ld``) to find the library " +"file. It returns the filename of the library file." +msgstr "" +"在 Linux 中,:func:`~ctypes.util.find_library` 会尝试运行外部程序 (``/sbin/ldconfig``, " +"``gcc``, ``objdump`` 和 ``ld``) 来查找库文件。 它会返回库文件的文件名。" + +#: ../../library/ctypes.rst:1492 +msgid "" +"Note that if the output of these programs does not correspond to the dynamic" +" linker used by Python, the result of this function may be misleading." +msgstr "请注意如果这些程序的输出不与 Python 所使用的动态链接器相对应,此函数的结果可能会造成误导。" + +#: ../../library/ctypes.rst:1495 +msgid "" +"On Linux, the value of the environment variable ``LD_LIBRARY_PATH`` is used " +"when searching for libraries, if a library cannot be found by any other " +"means." +msgstr "在Linux 上,如果其他方式找不到的话,会使用环境变量 ``LD_LIBRARY_PATH`` 搜索动态链接库。" + +#: ../../library/ctypes.rst:1499 +msgid "Here are some examples::" +msgstr "这是一些例子::" + +#: ../../library/ctypes.rst:1501 +msgid "" +">>> from ctypes.util import find_library\n" +">>> find_library(\"m\")\n" +"'libm.so.6'\n" +">>> find_library(\"c\")\n" +"'libc.so.6'\n" +">>> find_library(\"bz2\")\n" +"'libbz2.so.1.0'\n" +">>>" +msgstr "" +">>> from ctypes.util import find_library\n" +">>> find_library(\"m\")\n" +"'libm.so.6'\n" +">>> find_library(\"c\")\n" +"'libc.so.6'\n" +">>> find_library(\"bz2\")\n" +"'libbz2.so.1.0'\n" +">>>" + +#: ../../library/ctypes.rst:1510 +msgid "" +"On macOS and Android, :func:`~ctypes.util.find_library` uses the system's " +"standard naming schemes and paths to locate the library, and returns a full " +"pathname if successful::" +msgstr "" +"在 macOS 和 Android 上,:func:`~ctypes.util.find_library` " +"使用系统的标准命名方案和路径来定位库,并在成功时返回完整的路径名::" + +#: ../../library/ctypes.rst:1514 +msgid "" +">>> from ctypes.util import find_library\n" +">>> find_library(\"c\")\n" +"'/usr/lib/libc.dylib'\n" +">>> find_library(\"m\")\n" +"'/usr/lib/libm.dylib'\n" +">>> find_library(\"bz2\")\n" +"'/usr/lib/libbz2.dylib'\n" +">>> find_library(\"AGL\")\n" +"'/System/Library/Frameworks/AGL.framework/AGL'\n" +">>>" +msgstr "" +">>> from ctypes.util import find_library\n" +">>> find_library(\"c\")\n" +"'/usr/lib/libc.dylib'\n" +">>> find_library(\"m\")\n" +"'/usr/lib/libm.dylib'\n" +">>> find_library(\"bz2\")\n" +"'/usr/lib/libbz2.dylib'\n" +">>> find_library(\"AGL\")\n" +"'/System/Library/Frameworks/AGL.framework/AGL'\n" +">>>" + +#: ../../library/ctypes.rst:1525 +msgid "" +"On Windows, :func:`~ctypes.util.find_library` searches along the system " +"search path, and returns the full pathname, but since there is no predefined" +" naming scheme a call like ``find_library(\"c\")`` will fail and return " +"``None``." +msgstr "" +"在 Windows 中,:func:`~ctypes.util.find_library` " +"会沿着系统搜索路径进行搜索,并返回完整的路径名称,但由于没有预定义的命名方案因此像 ``find_library(\"c\")`` " +"这样的调用会失败并返回 ``None``。" + +#: ../../library/ctypes.rst:1529 +msgid "" +"If wrapping a shared library with :mod:`!ctypes`, it *may* be better to " +"determine the shared library name at development time, and hardcode that " +"into the wrapper module instead of using :func:`~ctypes.util.find_library` " +"to locate the library at runtime." +msgstr "" +"如果使用 :mod:`!ctypes` 包装一个共享库,更好的做法 *可能* 是在开发时确定好共享库的名称,并将其硬编码到包装器模块中而不是在运行时使用" +" :func:`~ctypes.util.find_library` 来定位库。" + +#: ../../library/ctypes.rst:1537 +msgid "Listing loaded shared libraries" +msgstr "列出已加载的共享库" + +#: ../../library/ctypes.rst:1539 +msgid "" +"When writing code that relies on code loaded from shared libraries, it can " +"be useful to know which shared libraries have already been loaded into the " +"current process." +msgstr "在编写依赖于从共享库加载的代码时,了解当前进程中已加载哪些共享库可能会很有用。" + +#: ../../library/ctypes.rst:1543 +msgid "" +"The :mod:`!ctypes.util` module provides the :func:`~ctypes.util.dllist` " +"function, which calls the different APIs provided by the various platforms " +"to help determine which shared libraries have already been loaded into the " +"current process." +msgstr "" +":mod:`!ctypes.util` 模块提供了 :func:`~ctypes.util.dllist` 函数,该函数会调用各种平台提供的不同 " +"API,以帮助确定当前进程中已加载了哪些共享库。" + +#: ../../library/ctypes.rst:1547 +msgid "" +"The exact output of this function will be system dependent. On most " +"platforms, the first entry of this list represents the current process " +"itself, which may be an empty string. For example, on glibc-based Linux, the" +" return may look like::" +msgstr "" +"此函数的确切输出取决于系统。在大多数平台上,该列表的第一个条目代表当前进程本身,可能是空字符串。例如,在基于 glibc 的 Linux " +"上,返回结果可能如下:" + +#: ../../library/ctypes.rst:1552 +msgid "" +">>> from ctypes.util import dllist\n" +">>> dllist()\n" +"['', 'linux-vdso.so.1', '/lib/x86_64-linux-gnu/libm.so.6', '/lib/x86_64-linux-gnu/libc.so.6', ... ]" +msgstr "" +">>> from ctypes.util import dllist\n" +">>> dllist()\n" +"['', 'linux-vdso.so.1', '/lib/x86_64-linux-gnu/libm.so.6', '/lib/x86_64-linux-gnu/libc.so.6', ... ]" + +#: ../../library/ctypes.rst:1559 +msgid "Loading shared libraries" +msgstr "加载共享库" + +#: ../../library/ctypes.rst:1561 +msgid "" +"There are several ways to load shared libraries into the Python process. " +"One way is to instantiate :py:class:`CDLL` or one of its subclasses:" +msgstr "将共享库加载至 Python 进程有多种方式。 其中之一是实例化 :py:class:`CDLL` 或它的某个子类:" + +#: ../../library/ctypes.rst:1567 +msgid "Represents a loaded shared library." +msgstr "代表已加载的共享库。" + +#: ../../library/ctypes.rst:1569 +msgid "" +"Functions in this library use the standard C calling convention, and are " +"assumed to return :c:expr:`int`. The Python :term:`global interpreter lock` " +"is released before calling any function exported by these libraries, and " +"reacquired afterwards. For different function behavior, use a subclass: " +":py:class:`~ctypes.OleDLL`, :py:class:`~ctypes.WinDLL`, or " +":py:class:`~ctypes.PyDLL`." +msgstr "" +"这个库中的函数使用标准的 C 调用惯例,并将返回 :c:expr:`int`。 Python :term:`global interpreter " +"lock` 会在调用任何从这些库导出的函数之前被释放,并在调用之后重新获取。 如需要不同的函数行为,应使用某个子类: " +":py:class:`~ctypes.OleDLL`, :py:class:`~ctypes.WinDLL` 或 " +":py:class:`~ctypes.PyDLL`。" + +#: ../../library/ctypes.rst:1576 +msgid "" +"If you have an existing :py:attr:`handle ` to an " +"already loaded shared library, it can be passed as the *handle* argument to " +"wrap the opened library in a new :py:class:`!CDLL` object. In this case, " +"*name* is only used to set the :py:attr:`~ctypes.CDLL._name` attribute, but " +"it may be adjusted and/or validated." +msgstr "" +"如果你持有对某个已加载共享库的 :py:attr:`句柄 `,可将其作为 *handle* " +"参数传入以使用一个新的 :py:class:`!CDLL` 对象来包装打开的库。 在此情况下,*name* 仅被用于设置 " +":py:attr:`~ctypes.CDLL._name` 属性,但它可能会被调整和/或验证。" + +#: ../../library/ctypes.rst:1582 +msgid "" +"If *handle* is ``None``, the underlying platform's :manpage:`dlopen(3)` or " +":c:func:`!LoadLibrary` function is used to load the library into the " +"process, and to get a handle to it." +msgstr "" +"如果 *handle* 为 ``None``,则会使用下层系统平台的 :manpage:`dlopen(3)` 或 " +":c:func:`!LoadLibrary` 函数将库加载到进程中,并获取其句柄。" + +#: ../../library/ctypes.rst:1586 +msgid "" +"*name* is the pathname of the shared library to open. If *name* does not " +"contain a path separator, the library is found in a platform-specific way." +msgstr "*name* 是要打开的共享库的路径名。 如果 *name* 未包含路径分隔符,则会以平台专属的方式查找库。" + +#: ../../library/ctypes.rst:1590 +msgid "" +"On non-Windows systems, *name* can be ``None``. In this case, " +":c:func:`!dlopen` is called with ``NULL``, which opens the main program as a" +" \"library\". (Some systems do the same is *name* is empty; " +"``None``/``NULL`` is more portable.)" +msgstr "" +"在非 Windows 系统中,*name* 可以为 ``None``。 在此情况下,调用 :c:func:`!dlopen` 时将传入 " +"``NULL``,这会将主程序作为“库”打开。 (有些系统在 *name* 为空时也会这样做;``None``/``NULL`` 更具可移植性。)" + +#: ../../library/ctypes.rst:1596 +msgid "CPython implementation detail" +msgstr "CPython 实现细节" + +#: ../../library/ctypes.rst:1598 +msgid "" +"Since CPython is linked to ``libc``, a ``None`` *name* is often used to " +"access the C standard library::" +msgstr "由于 CPython 链接了 ``libc``,以 ``None`` 作为 *name* 值往往被用于访问 C 标准库::" + +#: ../../library/ctypes.rst:1601 +msgid "" +">>> printf = ctypes.CDLL(None).printf\n" +">>> printf.argtypes = [ctypes.c_char_p]\n" +">>> printf(b\"hello\\n\")\n" +"hello\n" +"6" +msgstr "" +">>> printf = ctypes.CDLL(None).printf\n" +">>> printf.argtypes = [ctypes.c_char_p]\n" +">>> printf(b\"hello\\n\")\n" +"hello\n" +"6" + +#: ../../library/ctypes.rst:1607 +msgid "" +"To access the Python C API, prefer :py:data:`ctypes.pythonapi` which works " +"across platforms." +msgstr "要访问 Python C API,首选可跨平台的 :py:data:`ctypes.pythonapi`。" + +#: ../../library/ctypes.rst:1610 +msgid "" +"The *mode* parameter can be used to specify how the library is loaded. For " +"details, consult the :manpage:`dlopen(3)` manpage. On Windows, *mode* is " +"ignored. On posix systems, RTLD_NOW is always added, and is not " +"configurable." +msgstr "" +"*mode* 可以指定库加载方式。详情请参见 :manpage:`dlopen(3)` 手册页。 在 Windows 上, 会忽略 *mode* ,在" +" posix 系统上, 总是会加上 RTLD_NOW ,且无法配置。" + +#: ../../library/ctypes.rst:1615 +msgid "" +"The *use_errno* parameter, when set to true, enables a ctypes mechanism that" +" allows accessing the system :data:`errno` error number in a safe way. " +":mod:`!ctypes` maintains a thread-local copy of the system's :data:`errno` " +"variable; if you call foreign functions created with ``use_errno=True`` then" +" the :data:`errno` value before the function call is swapped with the ctypes" +" private copy, the same happens immediately after the function call." +msgstr "" +"对于 *use_errno* 形参,如果设为真值,ctypes 将启用一种允许以安全方式访问系统 :data:`errno` 错误号的机制。 " +":mod:`!ctypes` 会维护一份系统 :data:`errno` 变量的线程级局部副本;如果你调用附带 ``use_errno=True`` " +"创建的外部函数那么在函数调用之前的 :data:`errno` 值将与 ctypes 的私有副本进行交换,在函数调用之后也会立即进行同样的交换。" + +#: ../../library/ctypes.rst:1622 +msgid "" +"The function :func:`ctypes.get_errno` returns the value of the ctypes " +"private copy, and the function :func:`ctypes.set_errno` changes the ctypes " +"private copy to a new value and returns the former value." +msgstr "" +" :func:`ctypes.get_errno` 返回 ctypes 自己维护的那份拷贝的值, :func:`ctypes.set_errno` " +"函数可以修改它并返回之前的值。" + +#: ../../library/ctypes.rst:1626 +msgid "" +"The *use_last_error* parameter, when set to true, enables the same mechanism" +" for the Windows error code which is managed by the :func:`GetLastError` and" +" :func:`!SetLastError` Windows API functions; :func:`ctypes.get_last_error` " +"and :func:`ctypes.set_last_error` are used to request and change the ctypes " +"private copy of the windows error code." +msgstr "" +"当 *use_last_error* 形参设为真值时,为 Windows 错误代码也启用与由 :func:`GetLastError` 和 " +":func:`!SetLastError` Windows API 函数管理相同的机制;:func:`ctypes.get_last_error` 和 " +":func:`ctypes.set_last_error` 会被用于请求和更改 Windows 错误代码的 ctypes 私有副本。" + +#: ../../library/ctypes.rst:1632 +msgid "" +"The *winmode* parameter is used on Windows to specify how the library is " +"loaded (since *mode* is ignored). It takes any value that is valid for the " +"Win32 API ``LoadLibraryEx`` flags parameter. When omitted, the default is to" +" use the flags that result in the most secure DLL load, which avoids issues " +"such as DLL hijacking. Passing the full path to the DLL is the safest way to" +" ensure the correct library and dependencies are loaded." +msgstr "" +"*winmode* 形参用于在 Windows 上指定库的加载方式(因为 *mode* 会被忽略)。 它接受任何对 Win32 API " +"``LoadLibraryEx`` 旗标形参来说合法的值。 当被省略时,默认使用表示最安全的 DLL 加载的旗标,这将避免 DLL 劫持等问题。 传入 " +"DLL 的完整路径是确保正确加载库及其依赖的最安全的方式。" + +#: ../../library/ctypes.rst:1639 +msgid "" +"On Windows creating a :class:`CDLL` instance may fail even if the DLL name " +"exists. When a dependent DLL of the loaded DLL is not found, a " +":exc:`OSError` error is raised with the message *\"[WinError 126] The " +"specified module could not be found\".* This error message does not contain " +"the name of the missing DLL because the Windows API does not return this " +"information making this error hard to diagnose. To resolve this error and " +"determine which DLL is not found, you need to find the list of dependent " +"DLLs and determine which one is not found using Windows debugging and " +"tracing tools." +msgstr "" +"在 Windows 上创建 :class:`CDLL` 实例可能会失败,即使 DLL 名称确实存在。 当某个被加载 DLL 所依赖的 DLL " +"未找到时,将引发 :exc:`OSError` 错误并附带消息 *\"[WinError 126] The specified module could" +" not be found\".* 此错误消息不包含缺失 DLL 的名称,因为 Windows API 并不会返回此类信息,这使得此错误难以诊断。 " +"要解决此错误并确定是哪一个 DLL 未找到,你需要找出所依赖的 DLL 列表并使用 Windows 调试与跟踪工具确定是哪一个未找到。" + +#: ../../library/ctypes.rst:1651 +msgid "" +"`Microsoft DUMPBIN tool `_ -- A tool to find " +"DLL dependents." +msgstr "" +"`Microsoft DUMPBIN 工具 `_ -- 一个用于查找 DLL " +"依赖的工具。" + +#: ../../library/ctypes.rst:1654 +msgid "Added *winmode* parameter." +msgstr "增加了 *winmode* 参数。" + +#: ../../library/ctypes.rst:1659 +msgid "The *name* parameter can now be a :term:`path-like object`." +msgstr "现在 *name* 形参可以是一个 :term:`path-like object`。" + +#: ../../library/ctypes.rst:1661 +msgid "" +"Instances of this class have no public methods. Functions exported by the " +"shared library can be accessed as attributes or by index. Please note that " +"accessing the function through an attribute caches the result and therefore " +"accessing it repeatedly returns the same object each time. On the other " +"hand, accessing it through an index returns a new object each time::" +msgstr "" +"该类的实例没有公有方法。 由共享库导出的函数可以通过属性或索引来访问。 请注意通过属性访问函数会对结果进行缓存因而在重复访问时每次都将返回同一个对象。 " +"另一方面,通过索引访问函数时每次都将返回一个新对象::" + +#: ../../library/ctypes.rst:1667 +msgid "" +">>> from ctypes import CDLL\n" +">>> libc = CDLL(\"libc.so.6\") # On Linux\n" +">>> libc.time == libc.time\n" +"True\n" +">>> libc['time'] == libc['time']\n" +"False" +msgstr "" +">>> from ctypes import CDLL\n" +">>> libc = CDLL(\"libc.so.6\") # 在 Linux\n" +">>> libc.time == libc.time\n" +"True\n" +">>> libc['time'] == libc['time']\n" +"False" + +#: ../../library/ctypes.rst:1674 +msgid "" +"The following public attributes are available. Their name starts with an " +"underscore to not clash with exported function names:" +msgstr "可使用的公有属性如下所示。 它们的名称以下划线开头以免与导出的函数名称冲突:" + +#: ../../library/ctypes.rst:1679 +msgid "The system handle used to access the library." +msgstr "用于访问库的系统句柄。" + +#: ../../library/ctypes.rst:1683 +msgid "The name of the library passed in the constructor." +msgstr "传入构造函数的库名称。" + +#: ../../library/ctypes.rst:1687 ../../library/ctypes.rst:1704 +#: ../../library/ctypes.rst:1713 +msgid "See :py:class:`~ctypes.CDLL`, the superclass, for common information." +msgstr "请参阅超类 :py:class:`~ctypes.CDLL` 获取通用信息。" + +#: ../../library/ctypes.rst:1689 +msgid "" +"Functions in this library use the ``stdcall`` calling convention, and are " +"assumed to return the windows specific :class:`HRESULT` code. " +":class:`HRESULT` values contain information specifying whether the function " +"call failed or succeeded, together with additional error code. If the " +"return value signals a failure, an :class:`OSError` is automatically raised." +msgstr "" +"这个库中的函数使用 ``stdcall`` 调用约定,并且预期返回 Windows 专属的 :class:`HRESULT` 代码。 " +":class:`HRESULT` 值包含指明函数调用是失败还是成功的信息,并带有附加错误码。 如果返回值提示失败信号,则会自动引发 " +":class:`OSError`。" + +#: ../../library/ctypes.rst:1695 ../../library/ctypes.rst:1709 +#: ../../library/ctypes.rst:1772 ../../library/ctypes.rst:1779 +#: ../../library/ctypes.rst:1949 ../../library/ctypes.rst:2001 +#: ../../library/ctypes.rst:2153 ../../library/ctypes.rst:2225 +#: ../../library/ctypes.rst:2234 ../../library/ctypes.rst:2261 +#: ../../library/ctypes.rst:2275 ../../library/ctypes.rst:2284 +#: ../../library/ctypes.rst:2293 ../../library/ctypes.rst:2308 +#: ../../library/ctypes.rst:2375 ../../library/ctypes.rst:2402 +#: ../../library/ctypes.rst:2834 ../../library/ctypes.rst:3257 +msgid "Availability" +msgstr "Availability" + +#: ../../library/ctypes.rst:1697 +msgid "" +":exc:`WindowsError` used to be raised, which is now an alias of " +":exc:`OSError`." +msgstr "过去会引发 :exc:`WindowsError`,现在它是 :exc:`OSError` 的别名。" + +#: ../../library/ctypes.rst:1706 +msgid "" +"Functions in these libraries use the ``stdcall`` calling convention, and are" +" assumed to return :c:expr:`int` by default." +msgstr "这些库中的函数使用 ``stdcall`` 调用约定,并且预期默认返回 :c:expr:`int`。" + +#: ../../library/ctypes.rst:1715 +msgid "" +"When functions in this library are called, the Python GIL is *not* released " +"during the function call, and after the function execution the Python error " +"flag is checked. If the error flag is set, a Python exception is raised." +msgstr "" +"当这个库中的函数被调用时,Python GIL *不会* 在函数调用期间被释放,并且在函数执行之后会检查 Python 错误旗标。 " +"如果设置了错误旗标,则会引发 Python 异常。" + +#: ../../library/ctypes.rst:1720 +msgid "Thus, this is only useful to call Python C API functions directly." +msgstr "因此,这只在直接调用 Python C API 函数时有用处。" + +#: ../../library/ctypes.rst:1725 +msgid "" +"Flag to use as *mode* parameter. On platforms where this flag is not " +"available, it is defined as the integer zero." +msgstr "用于 *mode* 参数的标识值。在此标识不可用的系统上,它被定义为整数0。" + +#: ../../library/ctypes.rst:1731 +msgid "" +"Flag to use as *mode* parameter. On platforms where this is not available, " +"it is the same as *RTLD_GLOBAL*." +msgstr " 用于 *mode* 参数的标识值。在此标识不可用的系统上,它和 *RTLD_GLOBAL* 一样。" + +#: ../../library/ctypes.rst:1737 +msgid "" +"The default mode which is used to load shared libraries. On OSX 10.3, this " +"is *RTLD_GLOBAL*, otherwise it is the same as *RTLD_LOCAL*." +msgstr "加载动态链接库的默认模式。在 OSX 10.3 上,它是 *RTLD_GLOBAL* ,其余系统上是 *RTLD_LOCAL* 。" + +#: ../../library/ctypes.rst:1741 +msgid "" +"Shared libraries can also be loaded by using one of the prefabricated " +"objects, which are instances of the :class:`LibraryLoader` class, either by " +"calling the :meth:`~LibraryLoader.LoadLibrary` method, or by retrieving the " +"library as attribute of the loader instance." +msgstr "" +"共享库也可以通过使用一个预制对象来加载,这种对象是 :class:`LibraryLoader` 类的实例,具体做法是调用 " +":meth:`~LibraryLoader.LoadLibrary` 方法,或是将库作为加载器实例的属性来提取。" + +#: ../../library/ctypes.rst:1748 +msgid "" +"Class which loads shared libraries. *dlltype* should be one of the " +":class:`CDLL`, :class:`PyDLL`, :class:`WinDLL`, or :class:`OleDLL` types." +msgstr "" +"加载共享库的类。 *dlltype* 应当为 :class:`CDLL`, :class:`PyDLL`, :class:`WinDLL` 或 " +":class:`OleDLL` 类型之一。" + +#: ../../library/ctypes.rst:1751 +msgid "" +":meth:`!__getattr__` has special behavior: It allows loading a shared " +"library by accessing it as attribute of a library loader instance. The " +"result is cached, so repeated attribute accesses return the same library " +"each time." +msgstr "" +":meth:`!__getattr__` 具有特殊的行为:它允许通过一个作为库加载器实例的属性访问共享库来加载它。 " +"访问结果会被缓存,因此每次重复的属性访问都会返回相同的库。" + +#: ../../library/ctypes.rst:1757 +msgid "" +"Load a shared library into the process and return it. This method always " +"returns a new instance of the library." +msgstr "加载一个共享库到进程中并将其返回。 此方法总是返回一个新的库实例。" + +#: ../../library/ctypes.rst:1761 +msgid "These prefabricated library loaders are available:" +msgstr "可用的预制库加载器有如下这些:" + +#: ../../library/ctypes.rst:1765 +msgid "Creates :class:`CDLL` instances." +msgstr "创建 :class:`CDLL` 实例。" + +#: ../../library/ctypes.rst:1770 +msgid "Creates :class:`WinDLL` instances." +msgstr "创建 :class:`WinDLL` 实例。" + +#: ../../library/ctypes.rst:1777 +msgid "Creates :class:`OleDLL` instances." +msgstr "创建 :class:`OleDLL` 实例。" + +#: ../../library/ctypes.rst:1784 +msgid "Creates :class:`PyDLL` instances." +msgstr "创建 :class:`PyDLL` 实例。" + +#: ../../library/ctypes.rst:1787 +msgid "" +"For accessing the C Python api directly, a ready-to-use Python shared " +"library object is available:" +msgstr "要直接访问 C Python api,可以使用一个现成的 Python 共享库对象:" + +#: ../../library/ctypes.rst:1792 +msgid "" +"An instance of :class:`PyDLL` that exposes Python C API functions as " +"attributes. Note that all these functions are assumed to return C " +":c:expr:`int`, which is of course not always the truth, so you have to " +"assign the correct :attr:`!restype` attribute to use these functions." +msgstr "" +"一个将 Python C API 函数作为属性公开出来的 :class:`PyDLL` 实例。 请注意所有这些函数都应返回 C " +":c:expr:`int`,当然也并非总是如此,因此您必须分配正确的 :attr:`!restype` 属性才能使用这些函数。" + +#: ../../library/ctypes.rst:1797 ../../library/ctypes.rst:1799 +msgid "" +"Loading a library through any of these objects raises an :ref:`auditing " +"event ` ``ctypes.dlopen`` with string argument ``name``, the name " +"used to load the library." +msgstr "" +"通过这些对象中的任何一个加载库都将引发一个 :ref:`审计事件 ` ``ctypes.dlopen`` 并附带字符串参数 " +"``name``,即用于加载库的名称。" + +#: ../../library/ctypes.rst:1803 ../../library/ctypes.rst:1805 +msgid "" +"Accessing a function on a loaded library raises an auditing event " +"``ctypes.dlsym`` with arguments ``library`` (the library object) and " +"``name`` (the symbol's name as a string or integer)." +msgstr "" +"在加载的库上访问一个函数将引发一个审计事件 ``ctypes.dlsym`` 并附带参数 ``library`` (库对象) 和 ``name`` " +"(以字符串或整数表示的符号名称)." + +#: ../../library/ctypes.rst:1809 ../../library/ctypes.rst:1811 +msgid "" +"In cases when only the library handle is available rather than the object, " +"accessing a function raises an auditing event ``ctypes.dlsym/handle`` with " +"arguments ``handle`` (the raw library handle) and ``name``." +msgstr "" +"在只有库句柄而非对象可用的情况下,访问函数会引发一个审计事件 ``ctypes.dlsym/handle`` 并附带参数 ``handle`` " +"(原始库句柄) 和 ``name``。" + +#: ../../library/ctypes.rst:1818 +msgid "Foreign functions" +msgstr "外部函数" + +#: ../../library/ctypes.rst:1820 +msgid "" +"As explained in the previous section, foreign functions can be accessed as " +"attributes of loaded shared libraries. The function objects created in this" +" way by default accept any number of arguments, accept any ctypes data " +"instances as arguments, and return the default result type specified by the " +"library loader." +msgstr "" +"正如前一节的说明,外部函数可作为已加载共享库的属性来访问。 用此方式创建的函数对象默认接受任意数量的参数,接受任意 ctypes " +"数据实例作为参数,并且返回库加载器所指定的默认结果类型。" + +#: ../../library/ctypes.rst:1825 +msgid "" +"They are instances of a private local class :class:`!_FuncPtr` (not exposed " +"in :mod:`!ctypes`) which inherits from the private :class:`_CFuncPtr` class:" +msgstr "" +"它们是私有局部类 :class:`!_FuncPtr` 的实例(未在 :mod:`!ctypes` 中暴露),该类继承自私有的 " +":class:`_CFuncPtr` 类:" + +#: ../../library/ctypes.rst:1828 +msgid "" +">>> import ctypes\n" +">>> lib = ctypes.CDLL(None)\n" +">>> issubclass(lib._FuncPtr, ctypes._CFuncPtr)\n" +"True\n" +">>> lib._FuncPtr is ctypes._CFuncPtr\n" +"False" +msgstr "" +">>> import ctypes\n" +">>> lib = ctypes.CDLL(None)\n" +">>> issubclass(lib._FuncPtr, ctypes._CFuncPtr)\n" +"True\n" +">>> lib._FuncPtr is ctypes._CFuncPtr\n" +"False" + +#: ../../library/ctypes.rst:1839 +msgid "Base class for C callable foreign functions." +msgstr "C 可调用外部函数的基类。" + +#: ../../library/ctypes.rst:1841 +msgid "" +"Instances of foreign functions are also C compatible data types; they " +"represent C function pointers." +msgstr "外部函数的实例也是兼容 C 的数据类型;它们代表 C 函数指针。" + +#: ../../library/ctypes.rst:1844 +msgid "" +"This behavior can be customized by assigning to special attributes of the " +"foreign function object." +msgstr "此行为可通过对外部函数对象的特殊属性赋值来自定义。" + +#: ../../library/ctypes.rst:1849 +msgid "" +"Assign a ctypes type to specify the result type of the foreign function. Use" +" ``None`` for :c:expr:`void`, a function not returning anything." +msgstr "" +"分配一个 ctypes 类型来指定外部函数的结果类型。 使用 ``None`` 来表示 :c:expr:`void`,即不返回任何结果的函数。" + +#: ../../library/ctypes.rst:1852 +msgid "" +"It is possible to assign a callable Python object that is not a ctypes type," +" in this case the function is assumed to return a C :c:expr:`int`, and the " +"callable will be called with this integer, allowing further processing or " +"error checking. Using this is deprecated, for more flexible post processing" +" or error checking use a ctypes data type as :attr:`!restype` and assign a " +"callable to the :attr:`errcheck` attribute." +msgstr "" +"赋值为一个非 ctypes 类型的可调用 Python 对象也是可以的,在这种情况下函数应返回 C " +":c:expr:`int`,并且该可调用对象将附带此整数被调用,以允许进一步的处理或错误检查。 " +"这种用法已被弃用,为了更灵活地进行后续处理或错误检查请使用 ctypes 数据类型作为 :attr:`!restype` 并将 " +":attr:`errcheck` 属性赋值为一个可调用对象。" + +#: ../../library/ctypes.rst:1861 +msgid "" +"Assign a tuple of ctypes types to specify the argument types that the " +"function accepts. Functions using the ``stdcall`` calling convention can " +"only be called with the same number of arguments as the length of this " +"tuple; functions using the C calling convention accept additional, " +"unspecified arguments as well." +msgstr "" +"赋值为一个 ctypes 类型的元组来指定函数所接受的参数类型。 使用 ``stdcall`` " +"调用规范的函数只能附带与此元组长度相同数量的参数进行调用;使用 C 调用规范的函数还可接受额外的未指明参数。" + +#: ../../library/ctypes.rst:1867 +msgid "" +"When a foreign function is called, each actual argument is passed to the " +":meth:`~_CData.from_param` class method of the items in the :attr:`argtypes`" +" tuple, this method allows adapting the actual argument to an object that " +"the foreign function accepts. For example, a :class:`c_char_p` item in the " +":attr:`argtypes` tuple will convert a string passed as argument into a bytes" +" object using ctypes conversion rules." +msgstr "" +"当调用外部函数时,每个实际参数都会被传给 :attr:`argtypes` 元组中条目的 :meth:`~_CData.from_param` " +"类方法,该方法允许将实际参数适配为此外部函数所接受的对象。 例如,:attr:`argtypes` 元组中的 :class:`c_char_p` " +"条目将使用 ctypes 转换规则把作为参数传入的字符串转换为字节串对象。" + +#: ../../library/ctypes.rst:1874 +msgid "" +"New: It is now possible to put items in argtypes which are not ctypes types," +" but each item must have a :meth:`~_CData.from_param` method which returns a" +" value usable as argument (integer, string, ctypes instance). This allows " +"defining adapters that can adapt custom objects as function parameters." +msgstr "" +"新特性:现在可以在 argtypes 中放入非 ctypes 类型的条目,但每个条目必须具有 :meth:`~_CData.from_param` " +"方法用于返回一个可作为参数的值(整数、字符串、ctypes 实例)。 这样就允许定义可将将自定义对象适配为函数参数的适配器。" + +#: ../../library/ctypes.rst:1881 +msgid "" +"Assign a Python function or another callable to this attribute. The callable" +" will be called with three or more arguments:" +msgstr "将一个 Python 函数或其他可调用对象赋值给此属性。 该可调用对象将附带三个及以上的参数被调用。" + +#: ../../library/ctypes.rst:1888 +msgid "" +"*result* is what the foreign function returns, as specified by the " +":attr:`!restype` attribute." +msgstr "*result* 是外部函数返回的结果,由 :attr:`!restype` 属性指明。" + +#: ../../library/ctypes.rst:1891 +msgid "" +"*func* is the foreign function object itself, this allows reusing the same " +"callable object to check or post process the results of several functions." +msgstr "*func* 是外部函数对象本身,这样就允许重新使用相同的可调用对象来对多个函数进行检查或后续处理。" + +#: ../../library/ctypes.rst:1895 +msgid "" +"*arguments* is a tuple containing the parameters originally passed to the " +"function call, this allows specializing the behavior on the arguments used." +msgstr "*arguments* 是一个包含最初传递给函数调用的形参的元组,这样就允许对所用参数的行为进行特别处理。" + +#: ../../library/ctypes.rst:1899 +msgid "" +"The object that this function returns will be returned from the foreign " +"function call, but it can also check the result value and raise an exception" +" if the foreign function call failed." +msgstr "此函数所返回的对象将会由外部函数调用返回,但它还可以在外部函数调用失败时检查结果并引发异常。" + +#: ../../library/ctypes.rst:1904 ../../library/ctypes.rst:1906 +msgid "" +"On Windows, when a foreign function call raises a system exception (for " +"example, due to an access violation), it will be captured and replaced with " +"a suitable Python exception. Further, an auditing event " +"``ctypes.set_exception`` with argument ``code`` will be raised, allowing an " +"audit hook to replace the exception with its own." +msgstr "" +"在 Windows 上,当外部函数调用引发一个系统异常时(例如由于访问冲突),它将被捕获并被替换为适当的 Python 异常。 " +"此外,还将引发一个审计事件 ``ctypes.set_exception`` 并附带参数 ``code``,以允许审计钩子将原异常替换为它自己的异常。" + +#: ../../library/ctypes.rst:1912 ../../library/ctypes.rst:1914 +msgid "" +"Some ways to invoke foreign function calls as well as some of the functions " +"in this module may raise an auditing event ``ctypes.call_function`` with " +"arguments ``function pointer`` and ``arguments``." +msgstr "" +"调用外部函数的某些方式以及本模块中的部分函数可能会引发一个审计事件 ``ctypes.call_function``,并附带参数 ``function " +"pointer`` 和 ``arguments``。" + +#: ../../library/ctypes.rst:1921 +msgid "Function prototypes" +msgstr "函数原型" + +#: ../../library/ctypes.rst:1923 +msgid "" +"Foreign functions can also be created by instantiating function prototypes. " +"Function prototypes are similar to function prototypes in C; they describe a" +" function (return type, argument types, calling convention) without defining" +" an implementation. The factory functions must be called with the desired " +"result type and the argument types of the function, and can be used as " +"decorator factories, and as such, be applied to functions through the " +"``@wrapper`` syntax. See :ref:`ctypes-callback-functions` for examples." +msgstr "" +"外部函数也可通过实例化函数原型来创建。 函数原型类似于 C 中的函数原型;它们在不定义具体实现的情况下描述了一个函数(返回类型、参数类型、调用约定)。 " +"工厂函数必须使用函数所需要的结果类型和参数类型来调用,并可被用作装饰器工厂函数,在此情况下可以通过 ``@wrapper`` 语法应用于函数。 请参阅 " +":ref:`ctypes-callback-functions` 了解有关示例。" + +#: ../../library/ctypes.rst:1934 +msgid "" +"The returned function prototype creates functions that use the standard C " +"calling convention. The function will release the GIL during the call. If " +"*use_errno* is set to true, the ctypes private copy of the system " +":data:`errno` variable is exchanged with the real :data:`errno` value before" +" and after the call; *use_last_error* does the same for the Windows error " +"code." +msgstr "" +"返回的函数原型会创建使用标准 C 调用约定的函数。 该函数在调用过程中将释放 GIL。 如果 *use_errno* 设为真值,则在调用之前和之后系统 " +":data:`errno` 变量的 ctypes 私有副本会与真正的 :data:`errno` 值进行交换;*use_last_error* 会为 " +"Windows 错误码执行同样的操作。" + +#: ../../library/ctypes.rst:1944 +msgid "" +"The returned function prototype creates functions that use the ``stdcall`` " +"calling convention. The function will release the GIL during the call. " +"*use_errno* and *use_last_error* have the same meaning as above." +msgstr "" +"返回的函数原型会创建使用 ``stdcall`` 调用约定的函数。 该函数在调用过程中将会释放 GIL。 *use_errno* 和 " +"*use_last_error* 具有与上文相同的含义。" + +#: ../../library/ctypes.rst:1954 +msgid "" +"The returned function prototype creates functions that use the Python " +"calling convention. The function will *not* release the GIL during the " +"call." +msgstr "返回的函数原型会创建使用 Python 调用约定的函数。 该函数在调用过程中将 *不会* 释放 GIL。" + +#: ../../library/ctypes.rst:1957 +msgid "" +"Function prototypes created by these factory functions can be instantiated " +"in different ways, depending on the type and number of the parameters in the" +" call:" +msgstr "这些工厂函数所创建的函数原型可通过不同的方式来实例化,具体取决于调用中的类型与数量:" + +#: ../../library/ctypes.rst:1964 +msgid "" +"Returns a foreign function at the specified address which must be an " +"integer." +msgstr "在指定地址上返回一个外部函数,地址值必须为整数。" + +#: ../../library/ctypes.rst:1971 +msgid "" +"Create a C callable function (a callback function) from a Python *callable*." +msgstr "基于 Python *callable* 创建一个 C 可调用函数(回调函数)。" + +#: ../../library/ctypes.rst:1978 +msgid "" +"Returns a foreign function exported by a shared library. *func_spec* must be" +" a 2-tuple ``(name_or_ordinal, library)``. The first item is the name of the" +" exported function as string, or the ordinal of the exported function as " +"small integer. The second item is the shared library instance." +msgstr "" +"返回由一个共享库导出的外部函数。 *func_spec* 必须为一个 2 元组 ``(name_or_ordinal, library)``。 " +"第一项是字符串形式的所导出函数名称,或小整数形式的所导出函数序号。 第二项是该共享库实例。" + +#: ../../library/ctypes.rst:1988 +msgid "" +"Returns a foreign function that will call a COM method. *vtbl_index* is the " +"index into the virtual function table, a small non-negative integer. *name* " +"is name of the COM method. *iid* is an optional pointer to the interface " +"identifier which is used in extended error reporting." +msgstr "" +"返回将调用一个 COM 方法的外部函数。 *vtbl_index* 虚拟函数表中的索引。 *name* 是 COM 方法的名称。 *iid* " +"是可选的指向接口标识符的指针,它被用于扩展的错误报告。" + +#: ../../library/ctypes.rst:1993 +msgid "" +"If *iid* is not specified, an :exc:`OSError` is raised if the COM method " +"call fails. If *iid* is specified, a :exc:`~ctypes.COMError` is raised " +"instead." +msgstr "" +"如果未指定 *iid*,则当 COM 方法调用失败时会引发 :exc:`OSError`。如果指定了 *iid*,则会改为引发 " +":exc:`~ctypes.COMError`。" + +#: ../../library/ctypes.rst:1997 +msgid "" +"COM methods use a special calling convention: They require a pointer to the " +"COM interface as first argument, in addition to those parameters that are " +"specified in the :attr:`!argtypes` tuple." +msgstr "" +"COM 方法使用特殊的调用约定:除了在 :attr:`!argtypes` 元组中指定的形参,它们还要求一个指向 COM 接口的指针作为第一个参数。" + +#: ../../library/ctypes.rst:2004 +msgid "" +"The optional *paramflags* parameter creates foreign function wrappers with " +"much more functionality than the features described above." +msgstr "可选的 *paramflags* 形参会创建相比上述特性具有更多功能的外部函数包装器。" + +#: ../../library/ctypes.rst:2007 +msgid "" +"*paramflags* must be a tuple of the same length as " +":attr:`~_CFuncPtr.argtypes`." +msgstr "*paramflags* 必须为一个与 :attr:`~_CFuncPtr.argtypes` 长度相同的元组。" + +#: ../../library/ctypes.rst:2009 +msgid "" +"Each item in this tuple contains further information about a parameter, it " +"must be a tuple containing one, two, or three items." +msgstr "此元组中的每一项都包含有关形参的更多信息,它必须为包含一个、两个或更多条目的元组。" + +#: ../../library/ctypes.rst:2012 +msgid "" +"The first item is an integer containing a combination of direction flags for" +" the parameter:" +msgstr "第一项是包含形参指令旗标组合的整数。" + +#: ../../library/ctypes.rst:2015 +msgid "1" +msgstr "1" + +#: ../../library/ctypes.rst:2016 +msgid "Specifies an input parameter to the function." +msgstr "指定函数的一个输入形参。" + +#: ../../library/ctypes.rst:2018 +msgid "2" +msgstr "2" + +#: ../../library/ctypes.rst:2019 +msgid "Output parameter. The foreign function fills in a value." +msgstr "输出形参。 外部函数会填入一个值。" + +#: ../../library/ctypes.rst:2021 +msgid "4" +msgstr "4" + +#: ../../library/ctypes.rst:2022 +msgid "Input parameter which defaults to the integer zero." +msgstr "默认为整数零值的输入形参。" + +#: ../../library/ctypes.rst:2024 +msgid "" +"The optional second item is the parameter name as string. If this is " +"specified, the foreign function can be called with named parameters." +msgstr "可选的第二项是字符串形式的形参名称。 如果指定此项,则可以使用该形参名称来调用外部函数。" + +#: ../../library/ctypes.rst:2027 +msgid "The optional third item is the default value for this parameter." +msgstr "可选的第三项是该形参的默认值。" + +#: ../../library/ctypes.rst:2030 +msgid "" +"The following example demonstrates how to wrap the Windows ``MessageBoxW`` " +"function so that it supports default parameters and named arguments. The C " +"declaration from the windows header file is this::" +msgstr "" +"下面的例子演示了如何包装 Windows 的 ``MessageBoxW`` 函数以使其支持默认形参和命名参数。 相应的 Windows 头文件的 C " +"声明是这样的::" + +#: ../../library/ctypes.rst:2034 +msgid "" +"WINUSERAPI int WINAPI\n" +"MessageBoxW(\n" +" HWND hWnd,\n" +" LPCWSTR lpText,\n" +" LPCWSTR lpCaption,\n" +" UINT uType);" +msgstr "" +"WINUSERAPI int WINAPI\n" +"MessageBoxW(\n" +" HWND hWnd,\n" +" LPCWSTR lpText,\n" +" LPCWSTR lpCaption,\n" +" UINT uType);" + +#: ../../library/ctypes.rst:2041 ../../library/ctypes.rst:2064 +msgid "Here is the wrapping with :mod:`!ctypes`::" +msgstr "这是使用 :mod:`!ctypes` 的包装::" + +#: ../../library/ctypes.rst:2043 +msgid "" +">>> from ctypes import c_int, WINFUNCTYPE, windll\n" +">>> from ctypes.wintypes import HWND, LPCWSTR, UINT\n" +">>> prototype = WINFUNCTYPE(c_int, HWND, LPCWSTR, LPCWSTR, UINT)\n" +">>> paramflags = (1, \"hwnd\", 0), (1, \"text\", \"Hi\"), (1, \"caption\", \"Hello from ctypes\"), (1, \"flags\", 0)\n" +">>> MessageBox = prototype((\"MessageBoxW\", windll.user32), paramflags)" +msgstr "" +">>> from ctypes import c_int, WINFUNCTYPE, windll\n" +">>> from ctypes.wintypes import HWND, LPCWSTR, UINT\n" +">>> prototype = WINFUNCTYPE(c_int, HWND, LPCWSTR, LPCWSTR, UINT)\n" +">>> paramflags = (1, \"hwnd\", 0), (1, \"text\", \"Hi\"), (1, \"caption\", \"Hello from ctypes\"), (1, \"flags\", 0)\n" +">>> MessageBox = prototype((\"MessageBoxW\", windll.user32), paramflags)" + +#: ../../library/ctypes.rst:2049 +msgid "The ``MessageBox`` foreign function can now be called in these ways::" +msgstr "现在 ``MessageBox`` 外部函数可以通过以下方式来调用::" + +#: ../../library/ctypes.rst:2051 +msgid "" +">>> MessageBox()\n" +">>> MessageBox(text=\"Spam, spam, spam\")\n" +">>> MessageBox(flags=2, text=\"foo bar\")" +msgstr "" +">>> MessageBox()\n" +">>> MessageBox(text=\"Spam, spam, spam\")\n" +">>> MessageBox(flags=2, text=\"foo bar\")" + +#: ../../library/ctypes.rst:2055 +msgid "" +"A second example demonstrates output parameters. The win32 " +"``GetWindowRect`` function retrieves the dimensions of a specified window by" +" copying them into ``RECT`` structure that the caller has to supply. Here " +"is the C declaration::" +msgstr "" +"第二个例子演示了输出形参。 这个 win32 ``GetWindowRect`` 函数通过将指定窗口的维度拷贝至调用者必须提供的 ``RECT`` " +"结构体来提取这些值。 这是相应的 C 声明::" + +#: ../../library/ctypes.rst:2059 +msgid "" +"WINUSERAPI BOOL WINAPI\n" +"GetWindowRect(\n" +" HWND hWnd,\n" +" LPRECT lpRect);" +msgstr "" +"WINUSERAPI BOOL WINAPI\n" +"GetWindowRect(\n" +" HWND hWnd,\n" +" LPRECT lpRect);" + +#: ../../library/ctypes.rst:2066 +msgid "" +">>> from ctypes import POINTER, WINFUNCTYPE, windll, WinError\n" +">>> from ctypes.wintypes import BOOL, HWND, RECT\n" +">>> prototype = WINFUNCTYPE(BOOL, HWND, POINTER(RECT))\n" +">>> paramflags = (1, \"hwnd\"), (2, \"lprect\")\n" +">>> GetWindowRect = prototype((\"GetWindowRect\", windll.user32), paramflags)\n" +">>>" +msgstr "" +">>> from ctypes import POINTER, WINFUNCTYPE, windll, WinError\n" +">>> from ctypes.wintypes import BOOL, HWND, RECT\n" +">>> prototype = WINFUNCTYPE(BOOL, HWND, POINTER(RECT))\n" +">>> paramflags = (1, \"hwnd\"), (2, \"lprect\")\n" +">>> GetWindowRect = prototype((\"GetWindowRect\", windll.user32), paramflags)\n" +">>>" + +#: ../../library/ctypes.rst:2073 +msgid "" +"Functions with output parameters will automatically return the output " +"parameter value if there is a single one, or a tuple containing the output " +"parameter values when there are more than one, so the GetWindowRect function" +" now returns a RECT instance, when called." +msgstr "" +"带有输出形参的函数如果输出形参存在单一值则会自动返回该值,或是当输出形参存在多个值时返回包含这些值的元组,因此当 GetWindowRect " +"被调用时现在将返回一个 RECT 实例。" + +#: ../../library/ctypes.rst:2078 +msgid "" +"Output parameters can be combined with the :attr:`~_CFuncPtr.errcheck` " +"protocol to do further output processing and error checking. The win32 " +"``GetWindowRect`` api function returns a ``BOOL`` to signal success or " +"failure, so this function could do the error checking, and raises an " +"exception when the api call failed::" +msgstr "" +"输出形参可以与 :attr:`~_CFuncPtr.errcheck` 协议相结合以执行进一步的输出处理和错误检查。 Win32 " +"``GetWindowRect`` API 函数返回一个 ``BOOL`` 来表示成功或失败,因此该函数可以执行错误检查,并在 API " +"调用失败时引发异常::" + +#: ../../library/ctypes.rst:2083 +msgid "" +">>> def errcheck(result, func, args):\n" +"... if not result:\n" +"... raise WinError()\n" +"... return args\n" +"...\n" +">>> GetWindowRect.errcheck = errcheck\n" +">>>" +msgstr "" +">>> def errcheck(result, func, args):\n" +"... if not result:\n" +"... raise WinError()\n" +"... return args\n" +"...\n" +">>> GetWindowRect.errcheck = errcheck\n" +">>>" + +#: ../../library/ctypes.rst:2091 +msgid "" +"If the :attr:`~_CFuncPtr.errcheck` function returns the argument tuple it " +"receives unchanged, :mod:`!ctypes` continues the normal processing it does " +"on the output parameters. If you want to return a tuple of window " +"coordinates instead of a ``RECT`` instance, you can retrieve the fields in " +"the function and return them instead, the normal processing will no longer " +"take place::" +msgstr "" + +#: ../../library/ctypes.rst:2097 +msgid "" +">>> def errcheck(result, func, args):\n" +"... if not result:\n" +"... raise WinError()\n" +"... rc = args[1]\n" +"... return rc.left, rc.top, rc.bottom, rc.right\n" +"...\n" +">>> GetWindowRect.errcheck = errcheck\n" +">>>" +msgstr "" +">>> def errcheck(result, func, args):\n" +"... if not result:\n" +"... raise WinError()\n" +"... rc = args[1]\n" +"... return rc.left, rc.top, rc.bottom, rc.right\n" +"...\n" +">>> GetWindowRect.errcheck = errcheck\n" +">>>" + +#: ../../library/ctypes.rst:2110 +msgid "Utility functions" +msgstr "工具函数" + +#: ../../library/ctypes.rst:2114 +msgid "" +"Returns the address of the memory buffer as integer. *obj* must be an " +"instance of a ctypes type." +msgstr "以整数形式返回内存缓冲区地址。 *obj* 必须为一个 ctypes 类型的实例。" + +#: ../../library/ctypes.rst:2117 +msgid "" +"Raises an :ref:`auditing event ` ``ctypes.addressof`` with " +"argument ``obj``." +msgstr "引发一个 :ref:`审计事件 ` ``ctypes.addressof`` 并附带参数 ``obj``。" + +#: ../../library/ctypes.rst:2122 +msgid "" +"Returns the alignment requirements of a ctypes type. *obj_or_type* must be a" +" ctypes type or instance." +msgstr "返回一个 ctypes 类型的对齐要求。 *obj_or_type* 必须为一个 ctypes 类型或实例。" + +#: ../../library/ctypes.rst:2128 +msgid "" +"Returns a light-weight pointer to *obj*, which must be an instance of a " +"ctypes type. *offset* defaults to zero, and must be an integer that will be" +" added to the internal pointer value." +msgstr "" +"返回指向 *obj* 的轻量指针,该对象必须为一个 ctypes 类型的实例。 *offset* 默认值为零,且必须为一个将被添加到内部指针值的整数。" + +#: ../../library/ctypes.rst:2132 +msgid "``byref(obj, offset)`` corresponds to this C code::" +msgstr "``byref(obj, offset)`` 对应于这段 C 代码::" + +#: ../../library/ctypes.rst:2134 +msgid "(((char *)&obj) + offset)" +msgstr "(((char *)&obj) + offset)" + +#: ../../library/ctypes.rst:2136 +msgid "" +"The returned object can only be used as a foreign function call parameter. " +"It behaves similar to ``pointer(obj)``, but the construction is a lot " +"faster." +msgstr "返回的对象只能被用作外部函数调用形参。 它的行为类似于 ``pointer(obj)``,但构造起来要快很多。" + +#: ../../library/ctypes.rst:2142 +msgid "" +"Copies a COM pointer from *src* to *dst* and returns the Windows specific " +":c:type:`!HRESULT` value." +msgstr "将 COM 指针从 *src* 复制到 *dst*,并返回 Windows 特定的 :c:type:`!HRESULT` 值。" + +#: ../../library/ctypes.rst:2145 +msgid "" +"If *src* is not ``NULL``, its ``AddRef`` method is called, incrementing the " +"reference count." +msgstr "如果 *src* 不为 ``NULL``,则会调用其 ``AddRef`` 方法,从而增加引用计数。" + +#: ../../library/ctypes.rst:2148 +msgid "" +"In contrast, the reference count of *dst* will not be decremented before " +"assigning the new value. Unless *dst* is ``NULL``, the caller is responsible" +" for decrementing the reference count by calling its ``Release`` method when" +" necessary." +msgstr "" +"相反,在赋值新值之前,*dst* 的引用计数不会被递减。除非 *dst* 为 ``NULL``,否则调用者有责任在必要时通过调用其 " +"``Release`` 方法来递减引用计数。" + +#: ../../library/ctypes.rst:2160 +msgid "" +"This function is similar to the cast operator in C. It returns a new " +"instance of *type* which points to the same memory block as *obj*. *type* " +"must be a pointer type, and *obj* must be an object that can be interpreted " +"as a pointer." +msgstr "" +"此函数类似于 C 的强制转换运算符。 它返回一个 *type* 的新实例,该实例指向与 *obj* 相同的内存块。 *type* 必须为指针类型,而 " +"*obj* 必须为可以被作为指针来解读的对象。" + +#: ../../library/ctypes.rst:2169 +msgid "" +"This function creates a mutable character buffer. The returned object is a " +"ctypes array of :class:`c_char`." +msgstr "此函数会创建一个可变的字符缓冲区。 返回的对象是一个 :class:`c_char` 的 ctypes 数组。" + +#: ../../library/ctypes.rst:2172 +msgid "" +"If *size* is given (and not ``None``), it must be an :class:`int`. It " +"specifies the size of the returned array." +msgstr "如果给出了 *size* (并且不为 ``None``),则它必须是一个 :class:`int`。 它指明所返回数组的大小。" + +#: ../../library/ctypes.rst:2175 +msgid "" +"If the *init* argument is given, it must be :class:`bytes`. It is used to " +"initialize the array items. Bytes not initialized this way are set to zero " +"(NUL)." +msgstr "" +"如果给出了 *init* 参数,则它必须为 :class:`bytes`。 它会被用于初始化数组项。 不按此方式初始化的字节串将被设为零 (NUL)。" + +#: ../../library/ctypes.rst:2179 +msgid "" +"If *size* is not given (or if it is ``None``), the buffer is made one " +"element larger than *init*, effectively adding a NUL terminator." +msgstr "如果未给出 *size* (或者为 ``None``),缓冲区将设为比 *init* 大一个元素,实际就是增加一个 NUL 结束符。" + +#: ../../library/ctypes.rst:2182 +msgid "" +"If both arguments are given, *size* must not be less than ``len(init)``." +msgstr "如果同时给出两个参数,则 *size* 必须不小于 ``len(init)``。" + +#: ../../library/ctypes.rst:2186 +msgid "" +"If *size* is equal to ``len(init)``, a NUL terminator is not added. Do not " +"treat such a buffer as a C string." +msgstr "如果 *size* 等于 ``len(init)``,则不会增加一个 NUL 结束符。 不可将这样的缓冲区视为 C 字符串。" + +#: ../../library/ctypes.rst:2189 +msgid "For example::" +msgstr "例如:" + +#: ../../library/ctypes.rst:2191 +msgid "" +">>> bytes(create_string_buffer(2))\n" +"b'\\x00\\x00'\n" +">>> bytes(create_string_buffer(b'ab'))\n" +"b'ab\\x00'\n" +">>> bytes(create_string_buffer(b'ab', 2))\n" +"b'ab'\n" +">>> bytes(create_string_buffer(b'ab', 4))\n" +"b'ab\\x00\\x00'\n" +">>> bytes(create_string_buffer(b'abcdef', 2))\n" +"Traceback (most recent call last):\n" +" ...\n" +"ValueError: byte string too long" +msgstr "" +">>> bytes(create_string_buffer(2))\n" +"b'\\x00\\x00'\n" +">>> bytes(create_string_buffer(b'ab'))\n" +"b'ab\\x00'\n" +">>> bytes(create_string_buffer(b'ab', 2))\n" +"b'ab'\n" +">>> bytes(create_string_buffer(b'ab', 4))\n" +"b'ab\\x00\\x00'\n" +">>> bytes(create_string_buffer(b'abcdef', 2))\n" +"Traceback (most recent call last):\n" +" ...\n" +"ValueError: byte string too long" + +#: ../../library/ctypes.rst:2204 +msgid "" +"Raises an :ref:`auditing event ` ``ctypes.create_string_buffer`` " +"with arguments ``init``, ``size``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``ctypes.create_string_buffer`` 并附带参数 ``init``, " +"``size``。" + +#: ../../library/ctypes.rst:2210 +msgid "" +"This function creates a mutable unicode character buffer. The returned " +"object is a ctypes array of :class:`c_wchar`." +msgstr "此函数会创建一个可变的 unicode 字符缓冲区。 返回的对象是一个 :class:`c_wchar` 的 ctypes 数组。" + +#: ../../library/ctypes.rst:2213 +msgid "" +"The function takes the same arguments as :func:`~create_string_buffer` " +"except *init* must be a string and *size* counts :class:`c_wchar`." +msgstr "" +"此函数接受与 :func:`~create_string_buffer` 相同的参数但是 *init* 必须是一个字符串而 *size* 是对 " +":class:`c_wchar` 计数。" + +#: ../../library/ctypes.rst:2216 +msgid "" +"Raises an :ref:`auditing event ` ``ctypes.create_unicode_buffer`` " +"with arguments ``init``, ``size``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``ctypes.create_unicode_buffer`` 并附带参数 ``init``," +" ``size``。" + +#: ../../library/ctypes.rst:2221 +msgid "" +"This function is a hook which allows implementing in-process COM servers " +"with ctypes. It is called from the DllCanUnloadNow function that the " +"_ctypes extension dll exports." +msgstr "" +"此函数是一个允许使用 ctypes 实现进程内 COM 服务器的钩子。 它将由 _ctypes 扩展所导出的 DllCanUnloadNow " +"函数来调用。" + +#: ../../library/ctypes.rst:2230 +msgid "" +"This function is a hook which allows implementing in-process COM servers " +"with ctypes. It is called from the DllGetClassObject function that the " +"``_ctypes`` extension dll exports." +msgstr "" +"此函数是一个允许使用 ctypes 实现进程内 COM 服务器的钩子。 它将由 ``_ctypes`` 扩展 DLL 所导出的 " +"DllGetClassObject 函数来调用。" + +#: ../../library/ctypes.rst:2240 +msgid "" +"Try to find a library and return a pathname. *name* is the library name " +"without any prefix like ``lib``, suffix like ``.so``, ``.dylib`` or version " +"number (this is the form used for the posix linker option :option:`!-l`). " +"If no library can be found, returns ``None``." +msgstr "" +"尝试寻找一个库并返回路径名称。 *name* 是库名称并且不带任何前缀如 ``lib`` 以及后缀如 ``.so``,``.dylib`` " +"或版本号(形式与 posix 链接器选项 :option:`!-l` 所用的一致)。 如果找不到库,则返回 ``None``。" + +#: ../../library/ctypes.rst:2247 +msgid "See :ref:`ctypes-finding-shared-libraries` for complete documentation." +msgstr "完整文档见 :ref:`ctypes-finding-shared-libraries`。" + +#: ../../library/ctypes.rst:2253 +msgid "" +"Returns the filename of the VC runtime library used by Python, and by the " +"extension modules. If the name of the library cannot be determined, " +"``None`` is returned." +msgstr "返回 Python 以及扩展模块所使用的 VC 运行时库的文件名。 如果库名称无法确定,则返回 ``None``。" + +#: ../../library/ctypes.rst:2257 +msgid "" +"If you need to free memory, for example, allocated by an extension module " +"with a call to the ``free(void *)``, it is important that you use the " +"function in the same library that allocated the memory." +msgstr "" +"如果你需要通过调用 ``free(void *)`` 来释放内存,例如某个扩展模块所分配的内存,重要的一点是你应当使用分配内存的库中的函数。" + +#: ../../library/ctypes.rst:2267 +msgid "" +"Try to provide a list of paths of the shared libraries loaded into the " +"current process. These paths are not normalized or processed in any way. " +"The function can raise :exc:`OSError` if the underlying platform APIs fail. " +"The exact functionality is system dependent." +msgstr "" +"尝试提供当前进程中已加载的共享库的路径列表。这些路径未经过任何形式的标准化或处理。如果底层平台 API 失败,该函数可能会引发 " +":exc:`OSError`。确切功能因系统而异。" + +#: ../../library/ctypes.rst:2272 +msgid "" +"On most platforms, the first element of the list represents the current " +"executable file. It may be an empty string." +msgstr "在大多数平台上,列表的第一个元素代表当前的可执行文件。它可能是空字符串。" + +#: ../../library/ctypes.rst:2280 +msgid "" +"Returns a textual description of the error code *code*. If no error code is" +" specified, the last error code is used by calling the Windows API function " +":func:`GetLastError`." +msgstr "" +"返回错误代码 *code* 的文本描述。如果未指定错误代码,则通过调用 Windows API 函数 :func:`GetLastError` " +"使用最后一个错误代码。" + +#: ../../library/ctypes.rst:2289 +msgid "" +"Returns the last error code set by Windows in the calling thread. This " +"function calls the Windows ``GetLastError()`` function directly, it does not" +" return the ctypes-private copy of the error code." +msgstr "" +"返回 Windows 在调用线程中设置的最近的错误码。 此函数会直接调用 Windows ``GetLastError()`` 函数,它并不返回错误码的" +" ctypes 私有副本。" + +#: ../../library/ctypes.rst:2298 +msgid "" +"Returns the current value of the ctypes-private copy of the system " +":data:`errno` variable in the calling thread." +msgstr "返回调用线程中系统 :data:`errno` 变量的 ctypes 私有副本的当前值。" + +#: ../../library/ctypes.rst:2301 +msgid "" +"Raises an :ref:`auditing event ` ``ctypes.get_errno`` with no " +"arguments." +msgstr "引发一个不带参数的 :ref:`审计事件 ` ``ctypes.get_errno``。" + +#: ../../library/ctypes.rst:2305 +msgid "" +"Returns the current value of the ctypes-private copy of the system " +":data:`!LastError` variable in the calling thread." +msgstr "返回调用线程中系统 :data:`!LastError` 变量的 ctypes 私有副本的当前值。" + +#: ../../library/ctypes.rst:2310 +msgid "" +"Raises an :ref:`auditing event ` ``ctypes.get_last_error`` with no" +" arguments." +msgstr "引发一个不带参数的 :ref:`审计事件 ` ``ctypes.get_last_error``。" + +#: ../../library/ctypes.rst:2315 +msgid "" +"Same as the standard C memmove library function: copies *count* bytes from " +"*src* to *dst*. *dst* and *src* must be integers or ctypes instances that " +"can be converted to pointers." +msgstr "" +"与标准 C memmove 库函数相同:将 *count* 个字节从 *src* 拷贝到 *dst*。 *dst* 和 *src* " +"必须为整数或可被转换为指针的 ctypes 实例。" + +#: ../../library/ctypes.rst:2322 +msgid "" +"Same as the standard C memset library function: fills the memory block at " +"address *dst* with *count* bytes of value *c*. *dst* must be an integer " +"specifying an address, or a ctypes instance." +msgstr "" +"与标准 C memset 库函数相同:将位于地址 *dst* 的内存块用 *count* 个字节的 *c* 值填充。 *dst* 必须为指定地址的整数或" +" ctypes 实例。" + +#: ../../library/ctypes.rst:2329 +msgid "" +"Create or return a ctypes pointer type. Pointer types are cached and reused " +"internally, so calling this function repeatedly is cheap. *type* must be a " +"ctypes type." +msgstr "" +"创建或返回一个 ctypes 指针类型。指针类型会在内部进行缓存和重用,因此重复调用此函数的成本较低。*type* 必须是一个 ctypes 类型。" + +#: ../../library/ctypes.rst:2335 +msgid "" +"The resulting pointer type is cached in the ``__pointer_type__`` attribute " +"of *type*. It is possible to set this attribute before the first call to " +"``POINTER`` in order to set a custom pointer type. However, doing this is " +"discouraged: manually creating a suitable pointer type is difficult without " +"relying on implementation details that may change in future Python versions." +msgstr "" +"生成的指针类型会缓存到 *type* 的 ``__pointer_type__`` 属性中。可以在首次调用 ``POINTER`` " +"之前设置该属性,以指定自定义指针类型。但不建议这样做:在不依赖可能在未来 Python " +"版本中发生变化的实现细节的情况下,手动创建合适的指针类型非常困难。" + +#: ../../library/ctypes.rst:2346 +msgid "" +"Create a new pointer instance, pointing to *obj*. The returned object is of " +"the type ``POINTER(type(obj))``." +msgstr "创建一个新的指针实例,指向 *obj*。 返回的对象类型为 ``POINTER(type(obj))``。" + +#: ../../library/ctypes.rst:2349 +msgid "" +"Note: If you just want to pass a pointer to an object to a foreign function " +"call, you should use ``byref(obj)`` which is much faster." +msgstr "注意:如果你只是想向外部函数调用传递一个对象指针,你应当使用更为快速的 ``byref(obj)``。" + +#: ../../library/ctypes.rst:2355 +msgid "" +"This function resizes the internal memory buffer of *obj*, which must be an " +"instance of a ctypes type. It is not possible to make the buffer smaller " +"than the native size of the objects type, as given by ``sizeof(type(obj))``," +" but it is possible to enlarge the buffer." +msgstr "" +"此函数可改变 *obj* 的内部内存缓冲区大小,其参数必须为 ctypes 类型的实例。 没有可能将缓冲区设为小于对象类型的本机大小值,该值由 " +"``sizeof(type(obj))`` 给出,但将缓冲区加大则是可能的。" + +#: ../../library/ctypes.rst:2363 +msgid "" +"Set the current value of the ctypes-private copy of the system :data:`errno`" +" variable in the calling thread to *value* and return the previous value." +msgstr "设置调用线程中系统 :data:`errno` 变量的 ctypes 私有副本的当前值为 *value* 并返回原来的值。" + +#: ../../library/ctypes.rst:2366 +msgid "" +"Raises an :ref:`auditing event ` ``ctypes.set_errno`` with " +"argument ``errno``." +msgstr "引发一个 :ref:`审计事件 ` ``ctypes.set_errno`` 并附带参数 ``errno``。" + +#: ../../library/ctypes.rst:2371 +msgid "" +"Sets the current value of the ctypes-private copy of the system " +":data:`!LastError` variable in the calling thread to *value* and return the " +"previous value." +msgstr "在调用线程中将系统 :data:`!LastError` 变量的 ctypes 私有副本的当前值设为 *value* 并返回之前的值。" + +#: ../../library/ctypes.rst:2377 +msgid "" +"Raises an :ref:`auditing event ` ``ctypes.set_last_error`` with " +"argument ``error``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``ctypes.set_last_error`` 并附带参数 ``error``。" + +#: ../../library/ctypes.rst:2382 +msgid "" +"Returns the size in bytes of a ctypes type or instance memory buffer. Does " +"the same as the C ``sizeof`` operator." +msgstr "返回 ctypes 类型或实例的内存缓冲区以字节表示的大小。 其功能与 C ``sizeof`` 运算符相同。" + +#: ../../library/ctypes.rst:2388 +msgid "" +"Return the byte string at *void \\*ptr*. If *size* is specified, it is used " +"as size, otherwise the string is assumed to be zero-terminated." +msgstr "返回位于 *void \\*ptr* 的字节串。 如果指定了 *size*,它将被用作字节串的大小,否则将假定字节串以零值结尾。" + +#: ../../library/ctypes.rst:2392 +msgid "" +"Raises an :ref:`auditing event ` ``ctypes.string_at`` with " +"arguments ``ptr``, ``size``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``ctypes.string_at`` 并附带参数 ``ptr``, ``size``。" + +#: ../../library/ctypes.rst:2397 +msgid "" +"Creates an instance of :exc:`OSError`. If *code* is not specified, " +":func:`GetLastError` is called to determine the error code. If *descr* is " +"not specified, :func:`FormatError` is called to get a textual description of" +" the error." +msgstr "" +"创建一个 :exc:`OSError` 的实例。如果未指定 *code*,则会调用 :func:`GetLastError` 来确定错误代码。如果未指定" +" *descr*,则会调用 :func:`FormatError` 来获取错误的文本描述。" + +#: ../../library/ctypes.rst:2404 +msgid "" +"An instance of :exc:`WindowsError` used to be created, which is now an alias" +" of :exc:`OSError`." +msgstr "过去会创建 :exc:`WindowsError` 的实例,现在它是 :exc:`OSError` 的别名。" + +#: ../../library/ctypes.rst:2411 +msgid "" +"Return the wide-character string at *void \\*ptr*. If *size* is specified, " +"it is used as the number of characters of the string, otherwise the string " +"is assumed to be zero-terminated." +msgstr "返回位于 *void \\*ptr* 的宽字符串。 如果指定了 *size*,它将被用作字符串的字符数量,否则将假定字符串以零值结尾。" + +#: ../../library/ctypes.rst:2416 +msgid "" +"Raises an :ref:`auditing event ` ``ctypes.wstring_at`` with " +"arguments ``ptr``, ``size``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``ctypes.wstring_at`` 并附带参数 ``ptr``, ``size``。" + +#: ../../library/ctypes.rst:2421 +msgid "" +"Return a :class:`memoryview` object of length *size* that references memory " +"starting at *void \\*ptr*." +msgstr "返回一个长度为 *size* 的 :class:`memoryview` 对象,该对象引用从 *void \\*ptr* 开始的内存。" + +#: ../../library/ctypes.rst:2424 +msgid "" +"If *readonly* is true, the returned :class:`!memoryview` object can not be " +"used to modify the underlying memory. (Changes made by other means will " +"still be reflected in the returned object.)" +msgstr "" +"如果 *readonly* 为 True,返回的 :class:`!memoryview` " +"对象将无法用于修改底层内存。(通过其他方式所做的更改仍会反映在返回的对象中。)" + +#: ../../library/ctypes.rst:2429 +msgid "" +"This function is similar to :func:`string_at` with the key difference of not" +" making a copy of the specified memory. It is a semantically equivalent (but" +" more efficient) alternative to ``memoryview((c_byte * " +"size).from_address(ptr))``. (While :meth:`~_CData.from_address` only takes " +"integers, *ptr* can also be given as a :class:`ctypes.POINTER` or a " +":func:`~ctypes.byref` object.)" +msgstr "" +"此函数与 :func:`string_at` 类似,主要区别在于它不会对指定内存进行复制。它是 ``memoryview((c_byte * " +"size).from_address(ptr))`` 的语义等效替代方案,但效率更高。(虽然 :meth:`~_CData.from_address` " +"只接受整数,但 *ptr* 也可以是 :class:`ctypes.POINTER` 或 :func:`~ctypes.byref` 对象。)" + +#: ../../library/ctypes.rst:2436 +msgid "" +"Raises an :ref:`auditing event ` ``ctypes.memoryview_at`` with " +"arguments ``address``, ``size``, ``readonly``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``ctypes.memoryview_at``,附带参数 " +"``address``、``size``、``readonly``。" + +#: ../../library/ctypes.rst:2444 +msgid "Data types" +msgstr "数据类型" + +#: ../../library/ctypes.rst:2449 +msgid "" +"This non-public class is the common base class of all ctypes data types. " +"Among other things, all ctypes type instances contain a memory block that " +"hold C compatible data; the address of the memory block is returned by the " +":func:`addressof` helper function. Another instance variable is exposed as " +":attr:`_objects`; this contains other Python objects that need to be kept " +"alive in case the memory block contains pointers." +msgstr "" +"这个非公有类是所有 ctypes 数据类型的共同基类。 另外,所有 ctypes 类型的实例都包含一个存放 C 兼容数据的内存块;该内存块的地址可由 " +":func:`addressof` 辅助函数返回。 还有一个实例变量被公开为 " +":attr:`_objects`;此变量包含其他在内存块包含指针的情况下需要保持存活的 Python 对象。" + +#: ../../library/ctypes.rst:2456 +msgid "" +"Common methods of ctypes data types, these are all class methods (to be " +"exact, they are methods of the :term:`metaclass`):" +msgstr "ctypes 数据类型的通用方法,它们都是类方法(严谨地说,它们是 :term:`metaclass` 的方法):" + +#: ../../library/ctypes.rst:2461 +msgid "" +"This method returns a ctypes instance that shares the buffer of the *source*" +" object. The *source* object must support the writeable buffer interface. " +"The optional *offset* parameter specifies an offset into the source buffer " +"in bytes; the default is zero. If the source buffer is not large enough a " +":exc:`ValueError` is raised." +msgstr "" +"此方法返回一个共享 *source* 对象缓冲区的 ctypes 实例。 *source* 对象必须支持可写缓冲区接口。 可选的 *offset* " +"形参指定以字节表示的源缓冲区内偏移量;默认值为零。 如果源缓冲区不够大则会引发 :exc:`ValueError`。" + +#: ../../library/ctypes.rst:2467 ../../library/ctypes.rst:2477 +msgid "" +"Raises an :ref:`auditing event ` ``ctypes.cdata/buffer`` with " +"arguments ``pointer``, ``size``, ``offset``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``ctypes.cdata/buffer`` 并附带参数 ``pointer``, " +"``size``, ``offset``。" + +#: ../../library/ctypes.rst:2471 +msgid "" +"This method creates a ctypes instance, copying the buffer from the *source* " +"object buffer which must be readable. The optional *offset* parameter " +"specifies an offset into the source buffer in bytes; the default is zero. " +"If the source buffer is not large enough a :exc:`ValueError` is raised." +msgstr "" +"此方法创建一个 ctypes 实例,从 *source* 对象缓冲区拷贝缓冲区,该对象必须是可读的。 可选的 *offset* " +"形参指定以字节表示的源缓冲区内偏移量;默认值为零。 如果源缓冲区不够大则会引发 :exc:`ValueError`。" + +#: ../../library/ctypes.rst:2481 +msgid "" +"This method returns a ctypes type instance using the memory specified by " +"*address* which must be an integer." +msgstr "此方法会使用 *address* 所指定的内存返回一个 ctypes 类型的实例,该参数必须为一个整数。" + +#: ../../library/ctypes.rst:2484 ../../library/ctypes.rst:2486 +msgid "" +"This method, and others that indirectly call this method, raises an " +":ref:`auditing event ` ``ctypes.cdata`` with argument ``address``." +msgstr "" +"这个方法以及其他间接调用了它的方法会引发一个 :ref:`审计事件 ` ``ctypes.cdata``,附带参数 " +"``address``。" + +#: ../../library/ctypes.rst:2492 +msgid "" +"This method adapts *obj* to a ctypes type. It is called with the actual " +"object used in a foreign function call when the type is present in the " +"foreign function's :attr:`~_CFuncPtr.argtypes` tuple; it must return an " +"object that can be used as a function call parameter." +msgstr "" +"此方法会将 *obj* 适配为一个 ctypes 类型。 当该类型出现在外部函数的 :attr:`~_CFuncPtr.argtypes` " +"元组中时它将会被调用并传入在外部函数中使用的实际对象;它必须返回一个可被用作函数调用形参的对象。" + +#: ../../library/ctypes.rst:2497 +msgid "" +"All ctypes data types have a default implementation of this classmethod that" +" normally returns *obj* if that is an instance of the type. Some types " +"accept other objects as well." +msgstr "" +"所有 ctypes 数据类型都带有这个类方法的默认实现,它通常会返回 *obj*,如果该对象是此类型的实例的话。 某些类型也能接受其他对象。" + +#: ../../library/ctypes.rst:2503 +msgid "" +"This method returns a ctypes type instance exported by a shared library. " +"*name* is the name of the symbol that exports the data, *library* is the " +"loaded shared library." +msgstr "此方法返回一个由共享库导出的 ctypes 类型。 *name* 为导出数据的符号名称,*library* 为所加载的共享库。" + +#: ../../library/ctypes.rst:2507 +msgid "Common class variables of ctypes data types:" +msgstr "ctypes 数据类型的常见类变量:" + +#: ../../library/ctypes.rst:2511 +msgid "" +"The pointer type that was created by calling :func:`POINTER` for " +"corresponding ctypes data type. If a pointer type was not yet created, the " +"attribute is missing." +msgstr "通过为相应的 ctypes 数据类型调用 :func:`POINTER` 所创建的指针类型。如果尚未创建指针类型,则该属性不存在。" + +#: ../../library/ctypes.rst:2517 +msgid "Common instance variables of ctypes data types:" +msgstr "ctypes 数据类型的常见实例变量:" + +#: ../../library/ctypes.rst:2521 +msgid "" +"Sometimes ctypes data instances do not own the memory block they contain, " +"instead they share part of the memory block of a base object. The " +":attr:`_b_base_` read-only member is the root ctypes object that owns the " +"memory block." +msgstr "" +"有时 ctypes 数据实例并不拥有它们所包含的内存块,它们只是共享了某个基对象的部分内存块。 :attr:`_b_base_` " +"只读成员是拥有内存块的根 ctypes 对象。" + +#: ../../library/ctypes.rst:2528 +msgid "" +"This read-only variable is true when the ctypes data instance has allocated " +"the memory block itself, false otherwise." +msgstr "这个只读变量在 ctypes 数据实例自身已分配了内存块时为真值,否则为假值。" + +#: ../../library/ctypes.rst:2533 +msgid "" +"This member is either ``None`` or a dictionary containing Python objects " +"that need to be kept alive so that the memory block contents is kept valid." +" This object is only exposed for debugging; never modify the contents of " +"this dictionary." +msgstr "" +"这个成员或者为 ``None``,或者为一个包含需要保持存活以使内存块的内存保持有效的 Python 对象的字典。 " +"这个对象只是出于调试目的而对外公开;绝对不要修改此字典的内容。" + +#: ../../library/ctypes.rst:2546 +msgid "" +"This non-public class is the base class of all fundamental ctypes data " +"types. It is mentioned here because it contains the common attributes of the" +" fundamental ctypes data types. :class:`_SimpleCData` is a subclass of " +":class:`_CData`, so it inherits their methods and attributes. ctypes data " +"types that are not and do not contain pointers can now be pickled." +msgstr "" +"这个非公有类是所有基本 ctypes 数据类型的基类。 它在这里被提及是因为它包含基本 ctypes 数据类型共有的属性。 " +":class:`_SimpleCData` 是 :class:`_CData` 的子类,因此继承了其方法和属性。 非指针及不包含指针的 ctypes " +"数据类型现在将可以被封存。" + +#: ../../library/ctypes.rst:2552 +msgid "Instances have a single attribute:" +msgstr "实例拥有一个属性:" + +#: ../../library/ctypes.rst:2556 +msgid "" +"This attribute contains the actual value of the instance. For integer and " +"pointer types, it is an integer, for character types, it is a single " +"character bytes object or string, for character pointer types it is a Python" +" bytes object or string." +msgstr "" +"这个属性包含实例的实际值。 对于整数和指针类型,它是一个整数,对于字符类型,它是一个单字符字符串对象或字符串,对于字符指针类型,它是一个 Python " +"字节串对象或字符串。" + +#: ../../library/ctypes.rst:2561 +msgid "" +"When the ``value`` attribute is retrieved from a ctypes instance, usually a " +"new object is returned each time. :mod:`!ctypes` does *not* implement " +"original object return, always a new object is constructed. The same is " +"true for all other ctypes object instances." +msgstr "" + +#: ../../library/ctypes.rst:2566 +msgid "Each subclass has a class attribute:" +msgstr "" + +#: ../../library/ctypes.rst:2570 +msgid "" +"Class attribute that contains an internal type code, as a single-character " +"string. See :ref:`ctypes-fundamental-data-types` for a summary." +msgstr "" + +#: ../../library/ctypes.rst:2574 +msgid "" +"Types marked \\* in the summary may be (or always are) aliases of a " +"different :class:`_SimpleCData` subclass, and will not necessarily use the " +"listed type code. For example, if the platform's :c:expr:`long`, " +":c:expr:`long long` and :c:expr:`time_t` C types are the same, then " +":class:`c_long`, :class:`c_longlong` and :class:`c_time_t` all refer to a " +"single class, :class:`c_long`, whose :attr:`_type_` code is ``'l'``. The " +"``'L'`` code will be unused." +msgstr "" + +#: ../../library/ctypes.rst:2585 +msgid "" +"The :mod:`array` and :ref:`struct ` modules, as well as " +"third-party modules like `numpy " +"`__," +" use similar -- but slightly different -- type codes." +msgstr "" + +#: ../../library/ctypes.rst:2590 +msgid "" +"Fundamental data types, when returned as foreign function call results, or, " +"for example, by retrieving structure field members or array items, are " +"transparently converted to native Python types. In other words, if a " +"foreign function has a :attr:`~_CFuncPtr.restype` of :class:`c_char_p`, you " +"will always receive a Python bytes object, *not* a :class:`c_char_p` " +"instance." +msgstr "" +"当作为外部函数调用结果,或者举例来说,作为结构字段成员或数组条目被提取时,基本数据类型会被透明地转换为原生 Python 类型。 " +"换句话说,如果某个外部函数的 :attr:`~_CFuncPtr.restype` 是 :class:`c_char_p`,那么你将总是得到一个 " +"Python 字节串对象,而 *不是* 一个 :class:`c_char_p` 实例。" + +#: ../../library/ctypes.rst:2598 +msgid "" +"Subclasses of fundamental data types do *not* inherit this behavior. So, if " +"a foreign functions :attr:`!restype` is a subclass of :class:`c_void_p`, you" +" will receive an instance of this subclass from the function call. Of " +"course, you can get the value of the pointer by accessing the ``value`` " +"attribute." +msgstr "" +"基本数据类型的子类 *不会* 继承这种行为。 因此,如果一个外部函数的 :attr:`!restype` 是 :class:`c_void_p` " +"的子类,则你将从函数调用得到一个该子类的实例。 当然,你可以通过访问 ``value`` 属性来获取指针的值。" + +#: ../../library/ctypes.rst:2603 +msgid "These are the fundamental ctypes data types:" +msgstr "这些是基本 ctypes 数据类型:" + +#: ../../library/ctypes.rst:2607 +msgid "" +"Represents the C :c:expr:`signed char` datatype, and interprets the value as" +" small integer. The constructor accepts an optional integer initializer; no" +" overflow checking is done." +msgstr "" +"代表 C :c:expr:`signed char` 数据类型,并将值解读为一个小整数。 该构造器接受一个可选的整数初始值;不会执行溢出检查。" + +#: ../../library/ctypes.rst:2614 +msgid "" +"Represents the C :c:expr:`char` datatype, and interprets the value as a " +"single character. The constructor accepts an optional string initializer, " +"the length of the string must be exactly one character." +msgstr "" +"代表 C :c:expr:`char` 数据类型,并将值解读为单个字符。 该构造器接受一个可选的字符串初始值,字符串的长度必须恰好为一个字符。" + +#: ../../library/ctypes.rst:2621 +msgid "" +"Represents the C :c:expr:`char *` datatype when it points to a zero-" +"terminated string. For a general character pointer that may also point to " +"binary data, ``POINTER(c_char)`` must be used. The constructor accepts an " +"integer address, or a bytes object." +msgstr "" +"当指向一个以零为结束符的字符串时代表 C :c:expr:`char *` 数据类型。 对于通用字符指针来说也可能指向二进制数据,必须要使用 " +"``POINTER(c_char)``。 该构造器接受一个整数地址,或者一个字节串对象。" + +#: ../../library/ctypes.rst:2629 +msgid "" +"Represents the C :c:expr:`double` datatype. The constructor accepts an " +"optional float initializer." +msgstr "代表 C :c:expr:`double` 数据类型。 该构造器接受一个可选的浮点数初始值。" + +#: ../../library/ctypes.rst:2635 +msgid "" +"Represents the C :c:expr:`long double` datatype. The constructor accepts an" +" optional float initializer. On platforms where ``sizeof(long double) == " +"sizeof(double)`` it is an alias to :class:`c_double`." +msgstr "" +"代表 C :c:expr:`long double` 数据类型。 该构造器接受一个可选的浮点数初始值。 在 ``sizeof(long double) " +"== sizeof(double)`` 的平台上它是 :class:`c_double` 的一个别名。" + +#: ../../library/ctypes.rst:2641 +msgid "" +"Represents the C :c:expr:`float` datatype. The constructor accepts an " +"optional float initializer." +msgstr "代表 C :c:expr:`float` 数据类型。 该构造器接受一个可选的浮点数初始值。" + +#: ../../library/ctypes.rst:2647 +msgid "" +"Represents the C :c:expr:`double complex` datatype, if available. The " +"constructor accepts an optional :class:`complex` initializer." +msgstr "" +"代表 C 语言中的 :c:expr:`double complex` 数据类型(如果可用)。该构造器接受一个可选的 :class:`complex` " +"初始化器。" + +#: ../../library/ctypes.rst:2655 +msgid "" +"Represents the C :c:expr:`float complex` datatype, if available. The " +"constructor accepts an optional :class:`complex` initializer." +msgstr "" +"代表 C 语言中的 :c:expr:`float complex` 数据类型(如果可用)。该构造器接受一个可选的 :class:`complex` " +"初始化器。" + +#: ../../library/ctypes.rst:2663 +msgid "" +"Represents the C :c:expr:`long double complex` datatype, if available. The " +"constructor accepts an optional :class:`complex` initializer." +msgstr "" +"代表 C 语言中的 :c:expr:`long double complex` 数据类型(如果可用)。该构造器接受一个可选的 " +":class:`complex` 初始化器。" + +#: ../../library/ctypes.rst:2671 +msgid "" +"Represents the C :c:expr:`signed int` datatype. The constructor accepts an " +"optional integer initializer; no overflow checking is done. On platforms " +"where ``sizeof(int) == sizeof(long)`` it is an alias to :class:`c_long`." +msgstr "" +"代表 C :c:expr:`signed int` 数据类型。 该构造器接受一个可选的整数初始值;不会执行溢出检查。 在 ``sizeof(int) " +"== sizeof(long)`` 的平台上它是 :class:`c_long` 的一个别名。" + +#: ../../library/ctypes.rst:2678 +msgid "" +"Represents the C 8-bit :c:expr:`signed int` datatype. It is an alias for " +":class:`c_byte`." +msgstr "代表 C 8 位 :c:expr:`signed int` 数据类型。 它是 :class:`c_byte` 的一个别名。" + +#: ../../library/ctypes.rst:2684 +msgid "" +"Represents the C 16-bit :c:expr:`signed int` datatype. Usually an alias for" +" :class:`c_short`." +msgstr "代表 C 16 位 :c:expr:`signed int` 数据类型。 通常是 :class:`c_short` 的一个别名。" + +#: ../../library/ctypes.rst:2690 +msgid "" +"Represents the C 32-bit :c:expr:`signed int` datatype. Usually an alias for" +" :class:`c_int`." +msgstr "代表 C 32 位 :c:expr:`signed int` 数据类型。 通常是 :class:`c_int` 的一个别名。" + +#: ../../library/ctypes.rst:2696 +msgid "" +"Represents the C 64-bit :c:expr:`signed int` datatype. Usually an alias for" +" :class:`c_longlong`." +msgstr "代表 C 64 位 :c:expr:`signed int` 数据类型。 通常是 :class:`c_longlong` 的一个别名。" + +#: ../../library/ctypes.rst:2702 +msgid "" +"Represents the C :c:expr:`signed long` datatype. The constructor accepts an" +" optional integer initializer; no overflow checking is done." +msgstr "代表 C :c:expr:`signed long` 数据类型。 该构造器接受一个可选的整数初始值;不会执行溢出检查。" + +#: ../../library/ctypes.rst:2708 +msgid "" +"Represents the C :c:expr:`signed long long` datatype. The constructor " +"accepts an optional integer initializer; no overflow checking is done. On " +"platforms where ``sizeof(long long) == sizeof(long)`` it is an alias to " +":class:`c_long`." +msgstr "" +"代表 C :c:expr:`signed long long` 数据类型。 该构造器接受一个可选的整数初始值;不会执行溢出检查。 在 " +"``sizeof(long long) == sizeof(long)`` 的平台上它是 :class:`c_long` 的一个别名。" + +#: ../../library/ctypes.rst:2716 +msgid "" +"Represents the C :c:expr:`signed short` datatype. The constructor accepts " +"an optional integer initializer; no overflow checking is done." +msgstr "代表 C :c:expr:`signed short` 数据类型。 该构造器接受一个可选的整数初始值;不会执行溢出检查。" + +#: ../../library/ctypes.rst:2722 +msgid "" +"Represents the C :c:type:`size_t` datatype. Usually an alias for another " +"unsigned integer type." +msgstr "代表 C :c:type:`size_t` 数据类型。 通常是另一个无符号整数类型的别名。" + +#: ../../library/ctypes.rst:2728 +msgid "" +"Represents the :c:type:`Py_ssize_t` datatype. This is a signed version of " +":c:type:`size_t`; that is, the POSIX :c:type:`ssize_t` type. Usually an " +"alias for another integer type." +msgstr "" +"代表 :c:type:`Py_ssize_t` 数据类型。 这是 :c:type:`size_t` 的有符号版本;即 POSIX " +":c:type:`ssize_t` 类型。 通常是某个整数类型的别名。" + +#: ../../library/ctypes.rst:2738 +msgid "" +"Represents the C :c:type:`time_t` datatype. Usually an alias for another " +"integer type." +msgstr "代表 C :c:type:`time_t` 数据类型。 通常是某个整数类型的别名。" + +#: ../../library/ctypes.rst:2746 +msgid "" +"Represents the C :c:expr:`unsigned char` datatype, it interprets the value " +"as small integer. The constructor accepts an optional integer initializer; " +"no overflow checking is done." +msgstr "" +"代表 C :c:expr:`unsigned char` 数据类型,它将值解读为一个小整数。 该构造器接受一个可选的整数初始值;不会执行溢出检查。" + +#: ../../library/ctypes.rst:2753 +msgid "" +"Represents the C :c:expr:`unsigned int` datatype. The constructor accepts " +"an optional integer initializer; no overflow checking is done. On platforms" +" where ``sizeof(int) == sizeof(long)`` it is an alias for :class:`c_ulong`." +msgstr "" +"代表 C :c:expr:`unsigned int` 数据类型。 该构造器接受一个可选的整数初始值;不会执行溢出检查。 在 ``sizeof(int)" +" == sizeof(long)`` 的平台上它是 :class:`c_ulong` 的一个别名。" + +#: ../../library/ctypes.rst:2760 +msgid "" +"Represents the C 8-bit :c:expr:`unsigned int` datatype. It is an alias for " +":class:`c_ubyte`." +msgstr "代表 C 8 位 :c:expr:`unsigned int` 数据类型。 它是 :class:`c_ubyte` 的一个别名。" + +#: ../../library/ctypes.rst:2766 +msgid "" +"Represents the C 16-bit :c:expr:`unsigned int` datatype. Usually an alias " +"for :class:`c_ushort`." +msgstr "代表 C 16 位 :c:expr:`unsigned int` 数据类型。 通常是 :class:`c_ushort` 的一个别名。" + +#: ../../library/ctypes.rst:2772 +msgid "" +"Represents the C 32-bit :c:expr:`unsigned int` datatype. Usually an alias " +"for :class:`c_uint`." +msgstr "代表 C 32 位 :c:expr:`unsigned int` 数据类型。 通常是 :class:`c_uint` 的一个别名。" + +#: ../../library/ctypes.rst:2778 +msgid "" +"Represents the C 64-bit :c:expr:`unsigned int` datatype. Usually an alias " +"for :class:`c_ulonglong`." +msgstr "" +"代表 C 64 位 :c:expr:`unsigned int` 数据类型。 通常是 :class:`c_ulonglong` 的一个别名。" + +#: ../../library/ctypes.rst:2784 +msgid "" +"Represents the C :c:expr:`unsigned long` datatype. The constructor accepts " +"an optional integer initializer; no overflow checking is done." +msgstr "代表 C :c:expr:`unsigned long` 数据类型。 该构造器接受一个可选的整数初始值;不会执行溢出检查。" + +#: ../../library/ctypes.rst:2790 +msgid "" +"Represents the C :c:expr:`unsigned long long` datatype. The constructor " +"accepts an optional integer initializer; no overflow checking is done. On " +"platforms where ``sizeof(long long) == sizeof(long)`` it is an alias to " +":class:`c_long`." +msgstr "" +"代表 C :c:expr:`unsigned long long` 数据类型。 该构造器接受一个可选的整数初始值;不会执行溢出检查。 在 " +"``sizeof(long long) == sizeof(long)`` 的平台上它是 :class:`c_long` 的一个别名。" + +#: ../../library/ctypes.rst:2798 +msgid "" +"Represents the C :c:expr:`unsigned short` datatype. The constructor accepts" +" an optional integer initializer; no overflow checking is done." +msgstr "代表 C :c:expr:`unsigned short` 数据类型。 该构造器接受一个可选的整数初始值;不会执行溢出检查。" + +#: ../../library/ctypes.rst:2804 +msgid "" +"Represents the C :c:expr:`void *` type. The value is represented as " +"integer. The constructor accepts an optional integer initializer." +msgstr "代表 C :c:expr:`void *` 类型。 该值被表示为整数形式。 该构造器接受一个可选的整数初始值。" + +#: ../../library/ctypes.rst:2810 +msgid "" +"Represents the C :c:type:`wchar_t` datatype, and interprets the value as a " +"single character unicode string. The constructor accepts an optional string" +" initializer, the length of the string must be exactly one character." +msgstr "" +"代表 C :c:type:`wchar_t` 数据类型,并将值解读为单个字符的 unicode 字符串。 " +"该构造器接受一个可选的字符串初始值,字符串的长度必须恰好为一个字符。" + +#: ../../library/ctypes.rst:2817 +msgid "" +"Represents the C :c:expr:`wchar_t *` datatype, which must be a pointer to a " +"zero-terminated wide character string. The constructor accepts an integer " +"address, or a string." +msgstr "" +"代表 C :c:expr:`wchar_t *` 数据类型,它必须为指向以零为结束符的宽字符串的指针。 该构造器接受一个整数地址,或一个字符串。" + +#: ../../library/ctypes.rst:2824 +msgid "" +"Represent the C :c:expr:`bool` datatype (more accurately, :c:expr:`_Bool` " +"from C99). Its value can be ``True`` or ``False``, and the constructor " +"accepts any object that has a truth value." +msgstr "" +"代表 C :c:expr:`bool` 数据类型 (更准确地说,是 C99 :c:expr:`_Bool`)。 它的值可以为 ``True`` 或 " +"``False``,并且该构造器接受任何具有逻辑值的对象。" + +#: ../../library/ctypes.rst:2831 +msgid "" +"Represents a :c:type:`!HRESULT` value, which contains success or error " +"information for a function or method call." +msgstr "代表一个 :c:type:`!HRESULT` 值,它包含某个函数或方法调用的成功或错误信息。" + +#: ../../library/ctypes.rst:2839 +msgid "" +"Represents the C :c:expr:`PyObject *` datatype. Calling this without an " +"argument creates a ``NULL`` :c:expr:`PyObject *` pointer." +msgstr "" +"代表 C :c:expr:`PyObject *` 数据类型。 不带参数地调用此构造器将创建一个 ``NULL`` :c:expr:`PyObject " +"*` 指针。" + +#: ../../library/ctypes.rst:2842 +msgid ":class:`!py_object` is now a :term:`generic type`." +msgstr ":class:`!py_object` 现在是一种 :term:`generic type`。" + +#: ../../library/ctypes.rst:2847 +msgid "" +"The :mod:`!ctypes.wintypes` module provides quite some other Windows " +"specific data types, for example :c:type:`!HWND`, :c:type:`!WPARAM`, " +":c:type:`!VARIANT_BOOL` or :c:type:`!DWORD`. Some useful structures like " +":c:type:`!MSG` or :c:type:`!RECT` are also defined." +msgstr "" +":mod:`!ctypes.wintypes` 模块提供了不少其他 Windows 专属的数据类型,例如 :c:type:`!HWND`, " +":c:type:`!WPARAM`, :c:type:`!VARIANT_BOOL` 或 :c:type:`!DWORD`。 还定义了一些有用的结构体如" +" :c:type:`!MSG` 或 :c:type:`!RECT`。" + +#: ../../library/ctypes.rst:2856 +msgid "Structured data types" +msgstr "结构化数据类型" + +#: ../../library/ctypes.rst:2861 +msgid "Abstract base class for unions in native byte order." +msgstr "本机字节序的联合所对应的抽象基类。" + +#: ../../library/ctypes.rst:2863 +msgid "" +"Unions share common attributes and behavior with structures; see " +":class:`Structure` documentation for details." +msgstr "联合与结构体共享共同的属性和行为;详情请参见 :class:`Structure` 的文档。" + +#: ../../library/ctypes.rst:2868 +msgid "Abstract base class for unions in *big endian* byte order." +msgstr "*大端* 字节序的联合所对应的抽象基类。" + +#: ../../library/ctypes.rst:2874 +msgid "Abstract base class for unions in *little endian* byte order." +msgstr "*小端* 字节序的联合所对应的抽象基类。" + +#: ../../library/ctypes.rst:2880 +msgid "Abstract base class for structures in *big endian* byte order." +msgstr "*大端* 字节序的结构体所对应的抽象基类。" + +#: ../../library/ctypes.rst:2885 +msgid "Abstract base class for structures in *little endian* byte order." +msgstr "*小端* 字节序的结构体所对应的抽象基类。" + +#: ../../library/ctypes.rst:2887 +msgid "" +"Structures and unions with non-native byte order cannot contain pointer type" +" fields, or any other data types containing pointer type fields." +msgstr "非本机字节序的结构体和联合不能包含指针类型字段,或任何其他包含指针类型字段的数据类型。" + +#: ../../library/ctypes.rst:2893 +msgid "Abstract base class for structures in *native* byte order." +msgstr "*本机* 字节序的结构体所对应的抽象基类。" + +#: ../../library/ctypes.rst:2895 +msgid "" +"Concrete structure and union types must be created by subclassing one of " +"these types, and at least define a :attr:`_fields_` class variable. " +":mod:`!ctypes` will create :term:`descriptor`\\s which allow reading and " +"writing the fields by direct attribute accesses. These are the" +msgstr "" +"具体的结构和联合类型必须通过子类化这些类型之一来创建,并且至少要定义一个 :attr:`_fields_` 类变量。 :mod:`!ctypes` " +"将创建允许通过直接属性访问读写这些字段的 :term:`descriptor`。 它们是" + +#: ../../library/ctypes.rst:2903 +msgid "" +"A sequence defining the structure fields. The items must be 2-tuples or " +"3-tuples. The first item is the name of the field, the second item " +"specifies the type of the field; it can be any ctypes data type." +msgstr "" +"一个定义结构体字段的序列。 其中的条目必须为 2 元组或 3 元组。 元组的第一项是字段名称,第二项指明字段类型;它可以是任何 ctypes 数据类型。" + +#: ../../library/ctypes.rst:2907 +msgid "" +"For integer type fields like :class:`c_int`, a third optional item can be " +"given. It must be a small positive integer defining the bit width of the " +"field." +msgstr "对于整数类型字段例如 :class:`c_int`,可以给定第三个可选项。 它必须是一个定义字段比特位宽度的小正整数。" + +#: ../../library/ctypes.rst:2911 +msgid "" +"Field names must be unique within one structure or union. This is not " +"checked, only one field can be accessed when names are repeated." +msgstr "字段名称在一个结构体或联合中必须唯一。 不会检查这个唯一性,但当名称出现重复时将只有一个字段可被访问。" + +#: ../../library/ctypes.rst:2914 +msgid "" +"It is possible to define the :attr:`_fields_` class variable *after* the " +"class statement that defines the Structure subclass, this allows creating " +"data types that directly or indirectly reference themselves::" +msgstr "" +"可以在定义 Structure 子类的类语句 *之后* 再定义 :attr:`_fields_` 类变量,这将允许创建直接或间接引用其自身的数据类型::" + +#: ../../library/ctypes.rst:2918 +msgid "" +"class List(Structure):\n" +" pass\n" +"List._fields_ = [(\"pnext\", POINTER(List)),\n" +" ...\n" +" ]" +msgstr "" +"class List(Structure):\n" +" pass\n" +"List._fields_ = [(\"pnext\", POINTER(List)),\n" +" ...\n" +" ]" + +#: ../../library/ctypes.rst:2924 +msgid "" +"The :attr:`!_fields_` class variable can only be set once. Later assignments" +" will raise an :exc:`AttributeError`." +msgstr "类变量 :attr:`!_fields_` 只能设置一次。后续的赋值操作将会引发 :exc:`AttributeError`。" + +#: ../../library/ctypes.rst:2927 +msgid "" +"Additionally, the :attr:`!_fields_` class variable must be defined before " +"the structure or union type is first used: an instance or subclass is " +"created, :func:`sizeof` is called on it, and so on. Later assignments to " +":attr:`!_fields_` will raise an :exc:`AttributeError`. If :attr:`!_fields_` " +"has not been set before such use, the structure or union will have no own " +"fields, as if :attr:`!_fields_` was empty." +msgstr "" +"此外,类变量 :attr:`!_fields_` 必须在结构体或联合类型首次使用前定义:包括创建实例或子类、对其调用 :func:`sizeof` " +"等情况。后续对 :attr:`!_fields_` 的赋值会引发 :exc:`AttributeError`。如果在上述使用场景前未设置 " +":attr:`!_fields_`,则该结构体或联合将没有自身的字段,就如同 :attr:`!_fields_` 为空一样。" + +#: ../../library/ctypes.rst:2935 +msgid "" +"Sub-subclasses of structure types inherit the fields of the base class plus " +"the :attr:`_fields_` defined in the sub-subclass, if any." +msgstr "结构体类型的子子类会继承基类的字段,再加上子子类中定义的 :attr:`_fields_`,如果有的话。" + +#: ../../library/ctypes.rst:2941 +msgid "" +"An optional small integer that allows overriding the alignment of structure " +"fields in the instance." +msgstr "一个可选的小整数,它允许重写实例中结构体字段的对齐值。" + +#: ../../library/ctypes.rst:2944 +msgid "" +"This is only implemented for the MSVC-compatible memory layout (see " +":attr:`_layout_`)." +msgstr "这仅针对与 MSVC 兼容的内存布局实现 (参见 :attr:`_layout_`)。" + +#: ../../library/ctypes.rst:2947 +msgid "" +"Setting :attr:`!_pack_` to 0 is the same as not setting it at all. " +"Otherwise, the value must be a positive power of two. The effect is " +"equivalent to ``#pragma pack(N)`` in C, except :mod:`!ctypes` may allow " +"larger *n* than what the compiler accepts." +msgstr "" + +#: ../../library/ctypes.rst:2952 +msgid "" +":attr:`!_pack_` must already be defined when :attr:`_fields_` is assigned, " +"otherwise it will have no effect." +msgstr "当为 :attr:`_fields_` 赋值时,:attr:`!_pack_` 必须已被定义,否则它将不起作用。" + +#: ../../library/ctypes.rst:2957 +msgid "" +"For historical reasons, if :attr:`!_pack_` is non-zero, the MSVC-compatible " +"layout will be used by default. On non-Windows platforms, this default is " +"deprecated and is slated to become an error in Python 3.19. If it is " +"intended, set :attr:`~Structure._layout_` to ``'ms'`` explicitly." +msgstr "" +"由于历史原因,如果 :attr:`!_pack_` 为非零值,默认情况下将使用与 MSVC 兼容的布局。在非 Windows " +"平台上,这一默认行为已被弃用,并计划在 Python 3.19 中变为错误。如果确实需要此行为,请显式将 " +":attr:`~Structure._layout_` 设置为 ``'ms'``。" + +#: ../../library/ctypes.rst:2966 +msgid "" +"An optional small integer that allows increasing the alignment of the " +"structure when being packed or unpacked to/from memory." +msgstr "一个可选的小整数,它允许增加针对内存执行打包或解包时的对齐值。" + +#: ../../library/ctypes.rst:2969 +msgid "" +"The value must not be negative. The effect is equivalent to " +"``__attribute__((aligned(N)))`` on GCC or ``#pragma align(N)`` on MSVC, " +"except :mod:`!ctypes` may allow values that the compiler would reject." +msgstr "" + +#: ../../library/ctypes.rst:2974 +msgid "" +":attr:`!_align_` can only *increase* a structure's alignment requirements. " +"Setting it to 0 or 1 has no effect." +msgstr ":attr:`!_align_` 只能 *增加* 一个结构体要求的对齐值。 将其设为 0 或 1 将没有任何效果。" + +#: ../../library/ctypes.rst:2977 +msgid "" +"Using values that are not powers of two is discouraged and may lead to " +"surprising behavior." +msgstr "不建议使用不为二的乘方的值,这可能导致意外的行为。" + +#: ../../library/ctypes.rst:2980 +msgid "" +":attr:`!_align_` must already be defined when :attr:`_fields_` is assigned, " +"otherwise it will have no effect." +msgstr "当为 :attr:`_fields_` 赋值时 :attr:`!_align_` 必须已被定义,否则它将不起作用。" + +#: ../../library/ctypes.rst:2987 +msgid "" +"An optional string naming the struct/union layout. It can currently be set " +"to:" +msgstr "一个可选字符串,用于指定结构体/联合的布局。目前它可以设置为:" + +#: ../../library/ctypes.rst:2990 +msgid "" +"``\"ms\"``: the layout used by the Microsoft compiler (MSVC). On GCC and " +"Clang, this layout can be selected with ``__attribute__((ms_struct))``." +msgstr "" +"``\"ms\"``:微软编译器(MSVC)所使用的布局。在 GCC 和 Clang 上,可以通过 " +"``__attribute__((ms_struct))`` 来选择此布局。" + +#: ../../library/ctypes.rst:2993 +msgid "" +"``\"gcc-sysv\"``: the layout used by GCC with the System V or “SysV-like” " +"data model, as used on Linux and macOS. With this layout, " +":attr:`~Structure._pack_` must be unset or zero." +msgstr "" +"``\"gcc-sysv\"``:GCC 在 System V 或“类 SysV”数据模型中使用的布局,适用于 Linux 和 macOS " +"系统。采用此布局时,:attr:`~Structure._pack_` 必须保持未设置状态或设为零。" + +#: ../../library/ctypes.rst:2997 +msgid "" +"If not set explicitly, ``ctypes`` will use a default that matches the " +"platform conventions. This default may change in future Python releases (for" +" example, when a new platform gains official support, or when a difference " +"between similar platforms is found). Currently the default will be:" +msgstr "" +"如果未显式设置,``ctypes`` 将使用与平台约定相匹配的默认值。此默认值可能会在未来的 Python " +"版本中发生变化(例如,当新平台获得官方支持时,或者当发现相似平台之间存在差异时)。目前,默认值如下:" + +#: ../../library/ctypes.rst:3003 +msgid "On Windows: ``\"ms\"``" +msgstr "在Windows平台上: ``\"ms\"``" + +#: ../../library/ctypes.rst:3004 +msgid "" +"When :attr:`~Structure._pack_` is specified: ``\"ms\"``. (This is " +"deprecated; see :attr:`~Structure._pack_` documentation.)" +msgstr "" +"当指定了 :attr:`~Structure._pack_` 时: ``\"ms\"``。(此行为已弃用,详见 " +":attr:`~Structure._pack_` 的文档。)" + +#: ../../library/ctypes.rst:3006 +msgid "Otherwise: ``\"gcc-sysv\"``" +msgstr "在非Windows平台上: ``\"gcc-sysv\"``" + +#: ../../library/ctypes.rst:3008 +msgid "" +":attr:`!_layout_` must already be defined when :attr:`~Structure._fields_` " +"is assigned, otherwise it will have no effect." +msgstr "在为 :attr:`~Structure._fields_` 赋值时,:attr:`!_layout_` 必须已被定义,否则它将不起作用。" + +#: ../../library/ctypes.rst:3015 +msgid "" +"An optional sequence that lists the names of unnamed (anonymous) fields. " +":attr:`_anonymous_` must be already defined when :attr:`_fields_` is " +"assigned, otherwise it will have no effect." +msgstr "" +"一个可选的序列,它会列出未命名(匿名)字段的名称。 当 :attr:`_fields_` 被赋值时必须已经定义了 " +":attr:`_anonymous_`,否则它将没有效果。" + +#: ../../library/ctypes.rst:3019 +msgid "" +"The fields listed in this variable must be structure or union type fields. " +":mod:`!ctypes` will create descriptors in the structure type that allows " +"accessing the nested fields directly, without the need to create the " +"structure or union field." +msgstr "" + +#: ../../library/ctypes.rst:3024 +msgid "Here is an example type (Windows)::" +msgstr "以下是一个示例类型(Windows)::" + +#: ../../library/ctypes.rst:3026 +msgid "" +"class _U(Union):\n" +" _fields_ = [(\"lptdesc\", POINTER(TYPEDESC)),\n" +" (\"lpadesc\", POINTER(ARRAYDESC)),\n" +" (\"hreftype\", HREFTYPE)]\n" +"\n" +"class TYPEDESC(Structure):\n" +" _anonymous_ = (\"u\",)\n" +" _fields_ = [(\"u\", _U),\n" +" (\"vt\", VARTYPE)]" +msgstr "" +"class _U(Union):\n" +" _fields_ = [(\"lptdesc\", POINTER(TYPEDESC)),\n" +" (\"lpadesc\", POINTER(ARRAYDESC)),\n" +" (\"hreftype\", HREFTYPE)]\n" +"\n" +"class TYPEDESC(Structure):\n" +" _anonymous_ = (\"u\",)\n" +" _fields_ = [(\"u\", _U),\n" +" (\"vt\", VARTYPE)]" + +#: ../../library/ctypes.rst:3037 +msgid "" +"The ``TYPEDESC`` structure describes a COM data type, the ``vt`` field " +"specifies which one of the union fields is valid. Since the ``u`` field is " +"defined as anonymous field, it is now possible to access the members " +"directly off the TYPEDESC instance. ``td.lptdesc`` and ``td.u.lptdesc`` are " +"equivalent, but the former is faster since it does not need to create a " +"temporary union instance::" +msgstr "" +"``TYPEDESC`` 结构体描述了一个 COM 数据类型,``vt`` 字段指明哪个联合字段是有效的。 由于 ``u`` " +"字段被定义为匿名字段,现在可以直接从 TYPEDESC 实例访问成员。 ``td.lptdesc`` 和 ``td.u.lptdesc`` " +"是等价的,但前者速度更快,因为它不需要创建临时的联合实例::" + +#: ../../library/ctypes.rst:3044 +msgid "" +"td = TYPEDESC()\n" +"td.vt = VT_PTR\n" +"td.lptdesc = POINTER(some_type)\n" +"td.u.lptdesc = POINTER(some_type)" +msgstr "" +"td = TYPEDESC()\n" +"td.vt = VT_PTR\n" +"td.lptdesc = POINTER(some_type)\n" +"td.u.lptdesc = POINTER(some_type)" + +#: ../../library/ctypes.rst:3049 +msgid "" +"It is possible to define sub-subclasses of structures, they inherit the " +"fields of the base class. If the subclass definition has a separate " +":attr:`_fields_` variable, the fields specified in this are appended to the " +"fields of the base class." +msgstr "" +"可以定义结构体的子类,它们会继承基类的字段。 如果子类定义具有单独的 :attr:`_fields_` 变量,在其中指定的字段会被添加到基类的字段中。" + +#: ../../library/ctypes.rst:3054 +msgid "" +"Structure and union constructors accept both positional and keyword " +"arguments. Positional arguments are used to initialize member fields in the" +" same order as they are appear in :attr:`_fields_`. Keyword arguments in " +"the constructor are interpreted as attribute assignments, so they will " +"initialize :attr:`_fields_` with the same name, or create new attributes for" +" names not present in :attr:`_fields_`." +msgstr "" +"结构体和联合的构造器均可接受位置和关键字参数。 位置参数用于按照 :attr:`_fields_` 中的出现顺序来初始化成员字段。 " +"构造器中的关键字参数会被解读为属性赋值,因此它们将以相应的名称来初始化 :attr:`_fields_`,或为不存在于 :attr:`_fields_`" +" 中的名称创建新的属性。" + +#: ../../library/ctypes.rst:3064 +msgid "" +"Descriptor for fields of a :class:`Structure` and :class:`Union`. For " +"example::" +msgstr "结构 (:class:`Structure`) 和联合 (:class:`Union`) 字段的描述符。 例如::" + +#: ../../library/ctypes.rst:3067 +msgid "" +">>> class Color(Structure):\n" +"... _fields_ = (\n" +"... ('red', c_uint8),\n" +"... ('green', c_uint8),\n" +"... ('blue', c_uint8),\n" +"... ('intense', c_bool, 1),\n" +"... ('blinking', c_bool, 1),\n" +"... )\n" +"...\n" +">>> Color.red\n" +"\n" +">>> Color.green.type\n" +"\n" +">>> Color.blue.byte_offset\n" +"2\n" +">>> Color.intense\n" +"\n" +">>> Color.blinking.bit_offset\n" +"1" +msgstr "" +">>> class Color(Structure):\n" +"... _fields_ = (\n" +"... ('red', c_uint8),\n" +"... ('green', c_uint8),\n" +"... ('blue', c_uint8),\n" +"... ('intense', c_bool, 1),\n" +"... ('blinking', c_bool, 1),\n" +"... )\n" +"...\n" +">>> Color.red\n" +"\n" +">>> Color.green.type\n" +"\n" +">>> Color.blue.byte_offset\n" +"2\n" +">>> Color.intense\n" +"\n" +">>> Color.blinking.bit_offset\n" +"1" + +#: ../../library/ctypes.rst:3087 +msgid "All attributes are read-only." +msgstr "所有属性均为只读。" + +#: ../../library/ctypes.rst:3089 +msgid "" +":class:`!CField` objects are created via :attr:`~Structure._fields_`; do not" +" instantiate the class directly." +msgstr ":class:`!CField` 对象通过 :attr:`~Structure._fields_` 创建;请勿直接实例化该类。" + +#: ../../library/ctypes.rst:3094 +msgid "" +"Previously, descriptors only had ``offset`` and ``size`` attributes and a " +"readable string representation; the :class:`!CField` class was not available" +" directly." +msgstr "" +"以前,描述符只有 ``offset`` 和 ``size`` 属性以及一个可读的字符串表示形式;:class:`!CField` 类无法直接使用。" + +#: ../../library/ctypes.rst:3100 +msgid "Name of the field, as a string." +msgstr "字段的名称,为字符串形式。" + +#: ../../library/ctypes.rst:3104 +msgid "Type of the field, as a :ref:`ctypes class `." +msgstr "字段的类型,为一个 :ref:`ctypes 类 `。" + +#: ../../library/ctypes.rst:3109 +msgid "Offset of the field, in bytes." +msgstr "字段的偏移量,以字节为单位。" + +#: ../../library/ctypes.rst:3111 +msgid "" +"For bitfields, this is the offset of the underlying byte-aligned *storage " +"unit*; see :attr:`~CField.bit_offset`." +msgstr "对于位域,这是基础字节对齐的 *存储单元* 的偏移量;详见 :attr:`~CField.bit_offset`。" + +#: ../../library/ctypes.rst:3116 +msgid "Size of the field, in bytes." +msgstr "字段的大小,以字节为单位。" + +#: ../../library/ctypes.rst:3118 +msgid "" +"For bitfields, this is the size of the underlying *storage unit*. Typically," +" it has the same size as the bitfield's type." +msgstr "对于位域,这是基础 *存储单元* 的大小。通常,它与位域类型的大小相同。" + +#: ../../library/ctypes.rst:3123 +msgid "For non-bitfields, equivalent to :attr:`~CField.byte_size`." +msgstr "对于非位域,与 :attr:`~CField.byte_size` 等效。" + +#: ../../library/ctypes.rst:3125 +msgid "" +"For bitfields, this contains a backwards-compatible bit-packed value that " +"combines :attr:`~CField.bit_size` and :attr:`~CField.bit_offset`. Prefer " +"using the explicit attributes instead." +msgstr "" +"对于位域,该属性包含一个向后兼容的位打包值,它结合了 :attr:`~CField.bit_size` 和 " +":attr:`~CField.bit_offset`。建议优先使用这两个显式属性。" + +#: ../../library/ctypes.rst:3132 +msgid "True if this is a bitfield." +msgstr "如果这是位域,则为 True。" + +#: ../../library/ctypes.rst:3137 +msgid "" +"The location of a bitfield within its *storage unit*, that is, within " +":attr:`~CField.byte_size` bytes of memory starting at " +":attr:`~CField.byte_offset`." +msgstr "" +"位域在其 *存储单元* 内的位置,即位于从 :attr:`~CField.byte_offset` 开始的 " +":attr:`~CField.byte_size` 字节内存范围内。" + +#: ../../library/ctypes.rst:3141 +msgid "" +"To get the field's value, read the storage unit as an integer, :ref:`shift " +"left ` by :attr:`!bit_offset` and take the :attr:`!bit_size` least" +" significant bits." +msgstr "" +"要获取位域的值,请先将存储单元作为整数读取,然后按 :attr:`!bit_offset` 进行 :ref:`左移 ` " +"操作,并取结果的最低 :attr:`!bit_size` 位。" + +#: ../../library/ctypes.rst:3145 +msgid "" +"For non-bitfields, :attr:`!bit_offset` is zero and :attr:`!bit_size` is " +"equal to ``byte_size * 8``." +msgstr "" +"对于非位域,:attr:`!bit_offset` 为零,且 :attr:`!bit_size` 等于 ``byte_size * 8``。" + +#: ../../library/ctypes.rst:3150 +msgid "" +"True if this field is anonymous, that is, it contains nested sub-fields that" +" should be merged into a containing structure or union." +msgstr "如果此字段是匿名的(即它包含应合并到所属结构体或联合中的嵌套子字段),则为 True。" + +#: ../../library/ctypes.rst:3157 +msgid "Arrays and pointers" +msgstr "数组与指针" + +#: ../../library/ctypes.rst:3161 +msgid "Abstract base class for arrays." +msgstr "数组的抽象基类。" + +#: ../../library/ctypes.rst:3163 +msgid "" +"The recommended way to create concrete array types is by multiplying any " +":mod:`!ctypes` data type with a non-negative integer. Alternatively, you " +"can subclass this type and define :attr:`_length_` and :attr:`_type_` class " +"variables. Array elements can be read and written using standard subscript " +"and slice accesses; for slice reads, the resulting object is *not* itself an" +" :class:`Array`." +msgstr "" + +#: ../../library/ctypes.rst:3170 +msgid "Arrays are :ref:`generic ` over the type of their elements." +msgstr "" + +#: ../../library/ctypes.rst:3175 +msgid "" +"A positive integer specifying the number of elements in the array. Out-of-" +"range subscripts result in an :exc:`IndexError`. Will be returned by " +":func:`len`." +msgstr "一个指明数组中元素数量的正整数。 超出范围的抽取会导致 :exc:`IndexError`。 该值将由 :func:`len` 返回。" + +#: ../../library/ctypes.rst:3182 +msgid "Specifies the type of each element in the array." +msgstr "指明数组中每个元素的类型。" + +#: ../../library/ctypes.rst:3185 +msgid "" +"Array subclass constructors accept positional arguments, used to initialize " +"the elements in order." +msgstr "Array 子类构造器可接受位置参数,用来按顺序初始化元素。" + +#: ../../library/ctypes.rst:3190 +msgid "" +"Create an array. Equivalent to ``type * length``, where *type* is a " +":mod:`!ctypes` data type and *length* an integer." +msgstr "" +"创建一个数组。 等价于 ``type * length``,其中 *type* 是一个 :mod:`!ctypes` 数据类型而 *length* " +"是一个整数。" + +#: ../../library/ctypes.rst:3194 +msgid "In favor of multiplication." +msgstr "" + +#: ../../library/ctypes.rst:3200 +msgid "Private, abstract base class for pointers." +msgstr "私有对象,指针的抽象基类。" + +#: ../../library/ctypes.rst:3202 +msgid "" +"Concrete pointer types are created by calling :func:`POINTER` with the type " +"that will be pointed to; this is done automatically by :func:`pointer`." +msgstr "实际的指针类型是通过调用 :func:`POINTER` 并附带其将指向的类型来创建的;这会由 :func:`pointer` 自动完成。" + +#: ../../library/ctypes.rst:3206 +msgid "" +"If a pointer points to an array, its elements can be read and written using " +"standard subscript and slice accesses. Pointer objects have no size, so " +":func:`len` will raise :exc:`TypeError`. Negative subscripts will read from" +" the memory *before* the pointer (as in C), and out-of-range subscripts will" +" probably crash with an access violation (if you're lucky)." +msgstr "" +"如果一个指针指向的是数组,则其元素可使用标准的抽取和切片方式来读写。 指针对象没有长度,因此 :func:`len` 将引发 " +":exc:`TypeError`。 抽取负值将会从指针 *之前* 的内存中读取(与 C " +"一样),并且超出范围的抽取将可能因非法访问而导致崩溃(视你的运气而定)。" + +#: ../../library/ctypes.rst:3216 +msgid "Specifies the type pointed to." +msgstr "指明所指向的类型。" + +#: ../../library/ctypes.rst:3220 +msgid "" +"Returns the object to which to pointer points. Assigning to this attribute " +"changes the pointer to point to the assigned object." +msgstr "返回指针所指向的对象。 对此属性赋值会使指针改为指向所赋值的对象。" + +#: ../../library/ctypes.rst:3227 +msgid "Exceptions" +msgstr "异常" + +#: ../../library/ctypes.rst:3231 +msgid "" +"This exception is raised when a foreign function call cannot convert one of " +"the passed arguments." +msgstr "此异常会在外部函数无法对某个传入参数执行转换时被引发。" + +#: ../../library/ctypes.rst:3237 +msgid "This exception is raised when a COM method call failed." +msgstr "当 COM 方法调用失败时,会引发此异常。" + +#: ../../library/ctypes.rst:3241 +msgid "The integer value representing the error code." +msgstr "表示错误代码的整数值。" + +#: ../../library/ctypes.rst:3245 +msgid "The error message." +msgstr "错误消息。" + +#: ../../library/ctypes.rst:3249 +msgid "The 5-tuple ``(descr, source, helpfile, helpcontext, progid)``." +msgstr "5 元组 ``(descr, source, helpfile, helpcontext, progid)``。" + +#: ../../library/ctypes.rst:3251 +msgid "" +"*descr* is the textual description. *source* is the language-dependent " +"``ProgID`` for the class or application that raised the error. *helpfile* " +"is the path of the help file. *helpcontext* is the help context identifier." +" *progid* is the ``ProgID`` of the interface that defined the error." +msgstr "" +"*descr* 是文本描述。*source* 是引发错误的类或应用程序所对应的依赖于语言的 ``ProgID``。*helpfile* " +"是帮助文件的路径。*helpcontext* 是帮助上下文标识符。*progid* 是定义该错误的接口的 ``ProgID``。" diff --git a/library/curses.ascii.po b/library/curses.ascii.po new file mode 100644 index 0000000000..23e6287b06 --- /dev/null +++ b/library/curses.ascii.po @@ -0,0 +1,352 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-06-19 17:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/curses.ascii.rst:2 +msgid ":mod:`!curses.ascii` --- Utilities for ASCII characters" +msgstr ":mod:`!curses.ascii` --- 用于 ASCII 字符的工具" + +#: ../../library/curses.ascii.rst:10 +msgid "**Source code:** :source:`Lib/curses/ascii.py`" +msgstr "**源代码:** :source:`Lib/curses/ascii.py`" + +#: ../../library/curses.ascii.rst:14 +msgid "" +"The :mod:`!curses.ascii` module supplies name constants for ASCII characters" +" and functions to test membership in various ASCII character classes. The " +"constants supplied are names for control characters as follows:" +msgstr "" +":mod:`!curses.ascii` 模块提供了一些 ASCII 字符的名称常量以及在各种 ASCII 字符类中执行成员检测的函数。 " +"所提供的表示控制字符名称的常量如下:" + +#: ../../library/curses.ascii.rst:19 +msgid "Name" +msgstr "名称" + +#: ../../library/curses.ascii.rst:19 +msgid "Meaning" +msgstr "含意" + +#: ../../library/curses.ascii.rst:23 +msgid "Start of heading, console interrupt" +msgstr "标题开始,控制台中断" + +#: ../../library/curses.ascii.rst:25 +msgid "Start of text" +msgstr "文本开始" + +#: ../../library/curses.ascii.rst:27 +msgid "End of text" +msgstr "文本结束" + +#: ../../library/curses.ascii.rst:29 +msgid "End of transmission" +msgstr "传输结束" + +#: ../../library/curses.ascii.rst:31 +msgid "Enquiry, goes with :const:`ACK` flow control" +msgstr "查询,附带 :const:`ACK` 流量控制" + +#: ../../library/curses.ascii.rst:33 +msgid "Acknowledgement" +msgstr "确认" + +#: ../../library/curses.ascii.rst:35 +msgid "Bell" +msgstr "蜂鸣器" + +#: ../../library/curses.ascii.rst:37 +msgid "Backspace" +msgstr "退格" + +#: ../../library/curses.ascii.rst:39 +msgid "Tab" +msgstr "制表符" + +#: ../../library/curses.ascii.rst:41 +msgid "Alias for :const:`TAB`: \"Horizontal tab\"" +msgstr ":const:`TAB` 的别名:\"水平制表符\"" + +#: ../../library/curses.ascii.rst:43 +msgid "Line feed" +msgstr "换行" + +#: ../../library/curses.ascii.rst:45 +msgid "Alias for :const:`LF`: \"New line\"" +msgstr ":const:`LF` 的别名: \"新行\"" + +#: ../../library/curses.ascii.rst:47 +msgid "Vertical tab" +msgstr "垂直制表符" + +#: ../../library/curses.ascii.rst:49 +msgid "Form feed" +msgstr "换页" + +#: ../../library/curses.ascii.rst:51 +msgid "Carriage return" +msgstr "回车" + +#: ../../library/curses.ascii.rst:53 +msgid "Shift-out, begin alternate character set" +msgstr "Shift-out,开始替换字符集" + +#: ../../library/curses.ascii.rst:55 +msgid "Shift-in, resume default character set" +msgstr "Shift-in,恢复默认字符集" + +#: ../../library/curses.ascii.rst:57 +msgid "Data-link escape" +msgstr "Data-link escape,数据链接转义" + +#: ../../library/curses.ascii.rst:59 +msgid "XON, for flow control" +msgstr "XON,用于流控制" + +#: ../../library/curses.ascii.rst:61 +msgid "Device control 2, block-mode flow control" +msgstr "Device control 2,块模式流控制" + +#: ../../library/curses.ascii.rst:63 +msgid "XOFF, for flow control" +msgstr "XOFF,用于流控制" + +#: ../../library/curses.ascii.rst:65 +msgid "Device control 4" +msgstr "设备控制4" + +#: ../../library/curses.ascii.rst:67 +msgid "Negative acknowledgement" +msgstr "否定确认" + +#: ../../library/curses.ascii.rst:69 +msgid "Synchronous idle" +msgstr "同步空闲" + +#: ../../library/curses.ascii.rst:71 +msgid "End transmission block" +msgstr "传输块结束" + +#: ../../library/curses.ascii.rst:73 +msgid "Cancel" +msgstr "取消" + +#: ../../library/curses.ascii.rst:75 +msgid "End of medium" +msgstr "媒体结束" + +#: ../../library/curses.ascii.rst:77 +msgid "Substitute" +msgstr "替换" + +#: ../../library/curses.ascii.rst:79 +msgid "Escape" +msgstr "退出" + +#: ../../library/curses.ascii.rst:81 +msgid "File separator" +msgstr "文件分隔符" + +#: ../../library/curses.ascii.rst:83 +msgid "Group separator" +msgstr "组分隔符" + +#: ../../library/curses.ascii.rst:85 +msgid "Record separator, block-mode terminator" +msgstr "记录分隔符,块模式终止符" + +#: ../../library/curses.ascii.rst:87 +msgid "Unit separator" +msgstr "单位分隔符" + +#: ../../library/curses.ascii.rst:89 +msgid "Space" +msgstr "空格" + +#: ../../library/curses.ascii.rst:91 +msgid "Delete" +msgstr "删除" + +#: ../../library/curses.ascii.rst:94 +msgid "" +"Note that many of these have little practical significance in modern usage." +" The mnemonics derive from teleprinter conventions that predate digital " +"computers." +msgstr "请注意其中有许多在现今已经没有实际作用。 这些助记符是来源于数字计算机之前的电传打印机规范。" + +#: ../../library/curses.ascii.rst:97 +msgid "" +"The module supplies the following functions, patterned on those in the " +"standard C library:" +msgstr "此模块提供了下列函数,对应于标准 C 库中的函数:" + +#: ../../library/curses.ascii.rst:103 +msgid "" +"Checks for an ASCII alphanumeric character; it is equivalent to ``isalpha(c)" +" or isdigit(c)``." +msgstr "检测 ASCII 字母数字类字符;它等价于 ``isalpha(c) or isdigit(c)``。" + +#: ../../library/curses.ascii.rst:109 +msgid "" +"Checks for an ASCII alphabetic character; it is equivalent to ``isupper(c) " +"or islower(c)``." +msgstr "检测 ASCII 字母类字符;它等价于 ``isupper(c) or islower(c)``。" + +#: ../../library/curses.ascii.rst:115 +msgid "Checks for a character value that fits in the 7-bit ASCII set." +msgstr "检测字符值是否在 7 位 ASCII 集范围内。" + +#: ../../library/curses.ascii.rst:120 +msgid "Checks for an ASCII blank character; space or horizontal tab." +msgstr "" + +#: ../../library/curses.ascii.rst:125 +msgid "" +"Checks for an ASCII control character (in the range 0x00 to 0x1f or 0x7f)." +msgstr "检测 ASCII 控制字符(在 0x00 到 0x1f 或 0x7f 范围内)。" + +#: ../../library/curses.ascii.rst:130 +msgid "" +"Checks for an ASCII decimal digit, ``'0'`` through ``'9'``. This is " +"equivalent to ``c in string.digits``." +msgstr "检测 ASCII 十进制数码,即 ``'0'`` 至 ``'9'``。 它等价于 ``c in string.digits``。" + +#: ../../library/curses.ascii.rst:136 +msgid "Checks for any ASCII printable character except space." +msgstr "" + +#: ../../library/curses.ascii.rst:141 +msgid "Checks for an ASCII lower-case character." +msgstr "检测 ASCII 小写字母字符。" + +#: ../../library/curses.ascii.rst:146 +msgid "Checks for any ASCII printable character including space." +msgstr "检测任意 ASCII 可打印字符,包括空格。" + +#: ../../library/curses.ascii.rst:151 +msgid "" +"Checks for any ASCII printable character which is not a space or an " +"alphanumeric character." +msgstr "" + +#: ../../library/curses.ascii.rst:157 +msgid "" +"Checks for ASCII white-space characters; space, line feed, carriage return, " +"form feed, horizontal tab, vertical tab." +msgstr "检测 ASCII 空白字符;包括空格,换行,回车,进纸,水平制表和垂直制表。" + +#: ../../library/curses.ascii.rst:163 +msgid "Checks for an ASCII uppercase letter." +msgstr "检测 ASCII 大写字母字符。" + +#: ../../library/curses.ascii.rst:168 +msgid "" +"Checks for an ASCII hexadecimal digit. This is equivalent to ``c in " +"string.hexdigits``." +msgstr "检测 ASCII 十六进制数码。 这等价于 ``c in string.hexdigits``。" + +#: ../../library/curses.ascii.rst:174 +msgid "" +"Checks for an ASCII control character (ordinal values 0 to 31). Unlike " +":func:`iscntrl`, this does not include the delete character (0x7f)." +msgstr "" + +#: ../../library/curses.ascii.rst:180 +msgid "Checks for a non-ASCII character (ordinal values 0x80 and above)." +msgstr "检测非 ASCII 字符(码位值 0x80 及以上)。" + +#: ../../library/curses.ascii.rst:182 +msgid "" +"These functions accept either integers or single-character strings; when the" +" argument is a string, it is first converted using the built-in function " +":func:`ord`." +msgstr "这些函数接受整数或单字符字符串;当参数为字符串时,会先使用内置函数 :func:`ord` 进行转换。" + +#: ../../library/curses.ascii.rst:185 +msgid "" +"Note that all these functions check ordinal bit values derived from the " +"character of the string you pass in; they do not actually know anything " +"about the host machine's character encoding." +msgstr "请注意所有这些函数都是检测根据你传入的字符串的字符所生成的码位值;它们实际上完全不会知晓本机的字符编码格式。" + +#: ../../library/curses.ascii.rst:189 +msgid "" +"The following two functions take either a single-character string or integer" +" byte value; they return a value of the same type." +msgstr "以下两个函数接受单字符字符串或整数形式的字节值;它们会返回相同类型的值。" + +#: ../../library/curses.ascii.rst:195 +msgid "Return the ASCII value corresponding to the low 7 bits of *c*." +msgstr "返回对应于 *c* 的低 7 比特位的 ASCII 值。" + +#: ../../library/curses.ascii.rst:200 +msgid "" +"Return the control character corresponding to the given character (the " +"character bit value is bitwise-anded with 0x1f)." +msgstr "返回对应于给定字符的控制字符(字符比特值会与 0x1f 进行按位与运算)。" + +#: ../../library/curses.ascii.rst:206 +msgid "" +"Return the 8-bit character corresponding to the given ASCII character (the " +"character bit value is bitwise-ored with 0x80)." +msgstr "返回对应于给定 ASCII 字符的 8 比特位字符(字符比特值会与 0x80 进行按位或运算)。" + +#: ../../library/curses.ascii.rst:209 +msgid "" +"The following function takes either a single-character string or integer " +"value; it returns a string." +msgstr "以下函数接受单字符字符串或整数值;它会返回一个字符串。" + +#: ../../library/curses.ascii.rst:219 +msgid "" +"Return a string representation of the ASCII character *c*. If *c* is " +"printable, this string is the character itself. If the character is a " +"control character (0x00--0x1f) the string consists of a caret (``'^'``) " +"followed by the corresponding uppercase letter. If the character is an ASCII" +" delete (0x7f) the string is ``'^?'``. If the character has its meta bit " +"(0x80) set, the meta bit is stripped, the preceding rules applied, and " +"``'!'`` prepended to the result." +msgstr "" +"返回 ASCII 字符 *c* 的字符串表示形式。 如果 *c* 是可打印字符,则字符串为字符本身。 如果该字符是控制字符 (0x00--0x1f) " +"则字符串由一个插入符 (``'^'``) 加相应的大写字母组成。 如果该字符是 ASCII 删除符 (0x7f) 则字符串为 ``'^?'``。 " +"如果该字符设置了元比特位 (0x80),元比特位会被去除,应用以上规则后将在结果之前添加 ``'!'``。" + +#: ../../library/curses.ascii.rst:229 +msgid "" +"A 33-element string array that contains the ASCII mnemonics for the thirty-" +"two ASCII control characters from 0 (NUL) to 0x1f (US), in order, plus the " +"mnemonic ``SP`` for the space character." +msgstr "" +"一个 33 元素的字符串数组,其中按从 0 (NUL) 到 0x1f (US) 的顺序包含了三十二个 ASCII 控制字符的 ASCII " +"助记符,另加空格符的助记符 ``SP``。" + +#: ../../library/curses.ascii.rst:213 +msgid "^ (caret)" +msgstr "^ (脱字号)" + +#: ../../library/curses.ascii.rst:213 +msgid "in curses module" +msgstr "在 curses 模块中" + +#: ../../library/curses.ascii.rst:213 +msgid "! (exclamation)" +msgstr "! (感叹号)" diff --git a/library/curses.panel.po b/library/curses.panel.po new file mode 100644 index 0000000000..71bd7ffe74 --- /dev/null +++ b/library/curses.panel.po @@ -0,0 +1,145 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-15 16:14+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/curses.panel.rst:2 +msgid ":mod:`!curses.panel` --- A panel stack extension for curses" +msgstr ":mod:`!curses.panel` --- 针对 curses 的面板栈扩展" + +#: ../../library/curses.panel.rst:11 +msgid "" +"Panels are windows with the added feature of depth, so they can be stacked " +"on top of each other, and only the visible portions of each window will be " +"displayed. Panels can be added, moved up or down in the stack, and removed." +msgstr "" +"面板是具有添加深度功能的窗口,因此它们可以从上至下堆叠为栈,只有显示每个窗口的可见部分会显示出来。 面板可以在栈中被添加、上移或下移,也可以被移除。" + +#: ../../library/curses.panel.rst:19 +msgid "Functions" +msgstr "函数" + +#: ../../library/curses.panel.rst:21 +msgid "The module :mod:`!curses.panel` defines the following exception:" +msgstr "" + +#: ../../library/curses.panel.rst:26 +msgid "" +"Exception raised when a curses panel library function returns an error." +msgstr "" + +#: ../../library/curses.panel.rst:29 +msgid "The module :mod:`!curses.panel` defines the following functions:" +msgstr ":mod:`!curses.panel` 模块定义了下列函数:" + +#: ../../library/curses.panel.rst:34 +msgid "Returns the bottom panel in the panel stack." +msgstr "返回面板栈中的底部面板。" + +#: ../../library/curses.panel.rst:39 +msgid "" +"Returns a panel object, associating it with the given window *win* and " +"placing the new panel on top of the panel stack. Be aware that you need to " +"keep the returned panel object referenced explicitly. If you don't, the " +"panel object is garbage collected and removed from the panel stack." +msgstr "" + +#: ../../library/curses.panel.rst:47 +msgid "Returns the top panel in the panel stack." +msgstr "返回面板栈中的顶部面板。" + +#: ../../library/curses.panel.rst:52 +msgid "" +"Updates the virtual screen after changes in the panel stack. This does not " +"call :func:`curses.doupdate`, so you'll have to do this yourself." +msgstr "在面板栈发生改变后更新虚拟屏幕。 这不会调用 :func:`curses.doupdate`,因此你必须自己来调用。" + +#: ../../library/curses.panel.rst:59 +msgid "Panel objects" +msgstr "" + +#: ../../library/curses.panel.rst:79 +msgid "" +"Panel objects, as returned by :func:`new_panel` above, are windows with a " +"stacking order. There's always a window associated with a panel which " +"determines the content, while the panel methods are responsible for the " +"window's depth in the panel stack." +msgstr "" + +#: ../../library/curses.panel.rst:84 +msgid "Panel objects have the following methods:" +msgstr "Panel 对象具有以下方法:" + +#: ../../library/curses.panel.rst:89 +msgid "Returns the panel above the current panel." +msgstr "返回当前面板之上的面板。" + +#: ../../library/curses.panel.rst:94 +msgid "Returns the panel below the current panel." +msgstr "返回当前面板之下的面板。" + +#: ../../library/curses.panel.rst:99 +msgid "Push the panel to the bottom of the stack." +msgstr "将面板推至栈底部。" + +#: ../../library/curses.panel.rst:104 +msgid "" +"Returns ``True`` if the panel is hidden (not visible), ``False`` otherwise." +msgstr "如果面板被隐藏(不可见)则返回 ``True``,否则返回 ``False``。" + +#: ../../library/curses.panel.rst:109 +msgid "" +"Hide the panel. This does not delete the object, it just makes the window on" +" screen invisible." +msgstr "隐藏面板。 这不会删除对象,它只是让窗口在屏幕上不可见。" + +#: ../../library/curses.panel.rst:115 +msgid "Move the panel to the screen coordinates ``(y, x)``." +msgstr "将面板移至屏幕坐标 ``(y, x)``。" + +#: ../../library/curses.panel.rst:120 +msgid "Change the window associated with the panel to the window *win*." +msgstr "将与面板相关联的窗口改为窗口 *win*。" + +#: ../../library/curses.panel.rst:125 +msgid "" +"Set the panel's user pointer to *obj*. This is used to associate an " +"arbitrary piece of data with the panel, and can be any Python object." +msgstr "将面板的用户指针设为 *obj*。 这被用来将任意数据与面板相关联,数据可以是任何 Python 对象。" + +#: ../../library/curses.panel.rst:131 +msgid "" +"Display the panel (which might have been hidden), placing it on top of the " +"panel stack." +msgstr "" + +#: ../../library/curses.panel.rst:137 +msgid "Push panel to the top of the stack." +msgstr "将面板推至栈顶部。" + +#: ../../library/curses.panel.rst:142 +msgid "" +"Returns the user pointer for the panel. This might be any Python object." +msgstr "返回面板的用户指针。 这可以是任何 Python 对象。" + +#: ../../library/curses.panel.rst:147 +msgid "Returns the window object associated with the panel." +msgstr "返回与面板相关联的窗口对象。" diff --git a/library/curses.po b/library/curses.po new file mode 100644 index 0000000000..a01387de9a --- /dev/null +++ b/library/curses.po @@ -0,0 +1,2867 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-06-29 17:42+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/curses.rst:2 +msgid ":mod:`!curses` --- Terminal handling for character-cell displays" +msgstr ":mod:`!curses` --- 字符单元显示的终端处理" + +#: ../../library/curses.rst:11 +msgid "**Source code:** :source:`Lib/curses`" +msgstr "**源代码:** :source:`Lib/curses`" + +#: ../../library/curses.rst:15 +msgid "" +"The :mod:`!curses` module provides an interface to the curses library, the " +"de-facto standard for portable advanced terminal handling." +msgstr "" + +#: ../../library/curses.rst:18 +msgid "" +"While curses is most widely used in the Unix environment, versions are " +"available for Windows, DOS, and possibly other systems as well. This " +"extension module is designed to match the API of ncurses, an open-source " +"curses library hosted on Linux and the BSD variants of Unix." +msgstr "" +"虽然 curses 在 Unix 环境中使用最为广泛,但也有适用于 Windows,DOS 以及其他可能的系统的版本。此扩展模块旨在匹配 ncurses" +" 的 API,这是一个部署在 Linux 和 Unix 的 BSD 变体上的开源 curses 库。" + +#: ../../library/curses.rst:27 ../../includes/wasm-mobile-notavail.rst:3 +msgid "Availability" +msgstr "可用性" + +#: ../../includes/wasm-mobile-notavail.rst:5 +msgid "" +"This module is not supported on :ref:`mobile platforms ` or :ref:`WebAssembly platforms `." +msgstr "" +"此模块在 :ref:`移动平台 ` 或 :ref:`WebAssembly 平台 ` 上不受支持。" + +#: ../../includes/optional-module.rst:1 +msgid "" +"This is an :term:`optional module`. If it is missing from your copy of " +"CPython, look for documentation from your distributor (that is, whoever " +"provided Python to you). If you are the distributor, see :ref:`optional-" +"module-requirements`." +msgstr "" +"这是一个 :term:`optional module`。 如果它在你的 CPython 副本中缺失,请查看你的发行方(也就是说,向你提供 Python" +" 的人)的文档。 如果你就是发行方,请参阅 :ref:`optional-module-requirements`。" + +#: ../../library/curses.rst:31 +msgid "" +"Whenever the documentation mentions a *character* it can be specified as an " +"integer, a one-character Unicode string or a one-byte byte string." +msgstr "每当文档提到 **字符** 时,它可以被指定为一个整数,一个单字符 Unicode 字符串或者一个单字节的字节字符串。" + +#: ../../library/curses.rst:34 +msgid "" +"Whenever the documentation mentions a *character string* it can be specified" +" as a Unicode string or a byte string." +msgstr "每当此文档提到 **字符串** 时,它可以被指定为一个 Unicode 字符串或者一个字节字符串。" + +#: ../../library/curses.rst:39 +msgid "Module :mod:`curses.ascii`" +msgstr "模块 :mod:`curses.ascii`" + +#: ../../library/curses.rst:40 +msgid "" +"Utilities for working with ASCII characters, regardless of your locale " +"settings." +msgstr "在 ASCII 字符上工作的工具,无论你的区域设置是什么。" + +#: ../../library/curses.rst:42 +msgid "Module :mod:`curses.panel`" +msgstr "模块 :mod:`curses.panel`" + +#: ../../library/curses.rst:43 +msgid "A panel stack extension that adds depth to curses windows." +msgstr "为 curses 窗口添加深度的面板栈扩展。" + +#: ../../library/curses.rst:45 +msgid "Module :mod:`curses.textpad`" +msgstr "模块 :mod:`curses.textpad`" + +#: ../../library/curses.rst:46 +msgid "" +"Editable text widget for curses supporting :program:`Emacs`\\ -like " +"bindings." +msgstr "用于使 curses 支持 :program:`Emacs` 式绑定的可编辑文本部件。" + +#: ../../library/curses.rst:48 +msgid ":ref:`curses-howto`" +msgstr ":ref:`curses-howto`" + +#: ../../library/curses.rst:49 +msgid "" +"Tutorial material on using curses with Python, by Andrew Kuchling and Eric " +"Raymond." +msgstr "关于配合 Python 使用 curses 的教学材料,由 Andrew Kuchling 和 Eric Raymond 撰写。" + +#: ../../library/curses.rst:56 +msgid "Functions" +msgstr "函数" + +#: ../../library/curses.rst:58 +msgid "The module :mod:`!curses` defines the following exception:" +msgstr "" + +#: ../../library/curses.rst:63 +msgid "Exception raised when a curses library function returns an error." +msgstr "当 curses 库中函数返回一个错误时引发的异常。" + +#: ../../library/curses.rst:67 +msgid "" +"Whenever *x* or *y* arguments to a function or a method are optional, they " +"default to the current cursor location. Whenever *attr* is optional, it " +"defaults to :const:`A_NORMAL`." +msgstr "" +"只要一个函数或方法的 *x* 或 *y* 参数是可选项,它们会默认为当前光标位置。 而当 *attr* 是可选项时,它会默认为 " +":const:`A_NORMAL`。" + +#: ../../library/curses.rst:71 +msgid "The module :mod:`!curses` defines the following functions:" +msgstr "" + +#: ../../library/curses.rst:76 +msgid "" +"Allow use of default values for colors on terminals supporting this feature." +" Use this to support transparency in your application." +msgstr "允许在支持此特性的终端上使用颜色的默认值。使用此功能可在您的应用程序中支持透明度。" + +#: ../../library/curses.rst:79 +msgid "" +"Assign terminal default foreground/background colors to color number ``-1``." +" So ``init_pair(x, COLOR_RED, -1)`` will initialize pair *x* as red on " +"default background and ``init_pair(x, -1, COLOR_BLUE)`` will initialize pair" +" *x* as default foreground on blue." +msgstr "" +"将终端默认的前景色/背景色分配为颜色编号 ``-1``。 因此,``init_pair(x, COLOR_RED, -1)`` 将初始化颜色对 *x* " +"为红色前景色和默认背景色,而 ``init_pair(x, -1, COLOR_BLUE)`` 将初始化颜色对 *x* 为默认前景色和蓝色背景色。" + +#: ../../library/curses.rst:84 +msgid "Change the definition of the color-pair ``0`` to ``(fg, bg)``." +msgstr "将颜色对 ``0`` 的定义更改为 ``(fg, bg)``。" + +#: ../../library/curses.rst:86 +msgid "This is an ncurses extension." +msgstr "" + +#: ../../library/curses.rst:93 +msgid "" +"Return the output speed of the terminal in bits per second. On software " +"terminal emulators it will have a fixed high value. Included for historical " +"reasons; in former times, it was used to write output loops for time delays" +" and occasionally to change interfaces depending on the line speed." +msgstr "" +"以每秒比特数为单位返回终端输出速度。 在软件终端模拟器上它将具有一个固定的最高值。 " +"此函数出于历史原因被包括;在以前,它被用于写输出循环以提供时间延迟,并偶尔根据线路速度来改变接口。" + +#: ../../library/curses.rst:101 +msgid "Emit a short attention sound." +msgstr "发出短促的提醒声音。" + +#: ../../library/curses.rst:106 +msgid "" +"Return ``True`` or ``False``, depending on whether the programmer can change" +" the colors displayed by the terminal." +msgstr "根据程序员能否改变终端显示的颜色返回 ``True`` 或 ``False``。" + +#: ../../library/curses.rst:112 +msgid "" +"Enter cbreak mode. In cbreak mode (sometimes called \"rare\" mode) normal " +"tty line buffering is turned off and characters are available to be read one" +" by one. However, unlike raw mode, special characters (interrupt, quit, " +"suspend, and flow control) retain their effects on the tty driver and " +"calling program. Calling first :func:`raw` then :func:`cbreak` leaves the " +"terminal in cbreak mode." +msgstr "" +"进入 cbreak 模式。 在 cbreak 模式(有时也称为“稀有”模式)通常的 tty 行缓冲会被关闭并且字符可以被一个一个地读取。 " +"但是,与原始模式不同,特殊字符(中断、退出、挂起和流程控制)会在 tty 驱动和调用程序上保留其效果。 首先调用 :func:`raw` 然后调用 " +":func:`cbreak` 会将终端置于 cbreak 模式。" + +#: ../../library/curses.rst:121 +msgid "" +"Return the intensity of the red, green, and blue (RGB) components in the " +"color *color_number*, which must be between ``0`` and ``COLORS - 1``. " +"Return a 3-tuple, containing the R,G,B values for the given color, which " +"will be between ``0`` (no component) and ``1000`` (maximum amount of " +"component). Raise an exception if the color is not supported." +msgstr "" + +#: ../../library/curses.rst:130 +msgid "" +"Return the attribute value for displaying text in the specified color pair. " +"Only the first 256 color pairs are supported. This attribute value can be " +"combined with :const:`A_STANDOUT`, :const:`A_REVERSE`, and the other " +":const:`!A_\\*` attributes. :func:`pair_number` is the counterpart to this " +"function." +msgstr "" +"返回用于以指定颜色对显示文本的属性值。 仅支持前 256 个颜色对。 该属性值可与 :const:`A_STANDOUT`, " +":const:`A_REVERSE` 以及其他 :const:`!A_\\*` 属性组合使用。 :func:`pair_number` " +"是此函数的对应操作。" + +#: ../../library/curses.rst:139 +msgid "" +"Set the cursor state. *visibility* can be set to ``0``, ``1``, or ``2``, " +"for invisible, normal, or very visible. If the terminal supports the " +"visibility requested, return the previous cursor state; otherwise raise an " +"exception. On many terminals, the \"visible\" mode is an underline cursor " +"and the \"very visible\" mode is a block cursor." +msgstr "" +"设置光标状态。 *visibility* 可设为 ``0``, ``1`` 或 ``2`` 表示不可见、正常与高度可见。 " +"如果终端支持所请求的可见性,则返回之前的光标状态;否则会引发异常。 在许多终端上,“正常可见”模式为下划线光标而“高度可见”模式为方块形光标。" + +#: ../../library/curses.rst:148 +msgid "" +"Save the current terminal mode as the \"program\" mode, the mode when the " +"running program is using curses. (Its counterpart is the \"shell\" mode, " +"for when the program is not in curses.) Subsequent calls to " +":func:`reset_prog_mode` will restore this mode." +msgstr "" +"将当前终端模式保存为 \"program\" 模式,即正在运行的程序使用 curses 的模式。 (与其相对的是 \"shell\" 模式,即程序不使用" +" curses。) 对 :func:`reset_prog_mode` 的后续调用将恢复此模式。" + +#: ../../library/curses.rst:156 +msgid "" +"Save the current terminal mode as the \"shell\" mode, the mode when the " +"running program is not using curses. (Its counterpart is the \"program\" " +"mode, when the program is using curses capabilities.) Subsequent calls to " +":func:`reset_shell_mode` will restore this mode." +msgstr "" +"将当前终端模式保存为 \"shell\" 模式,即正在运行的程序不使用 curses 的模式。 (与其相对的是 \"program\" 模式,即程序使用" +" 功能。) 对 :func:`reset_shell_mode` 的后续调用将恢复此模式。" + +#: ../../library/curses.rst:164 +msgid "Insert an *ms* millisecond pause in output." +msgstr "在输出中插入 *ms* 毫秒的暂停。" + +#: ../../library/curses.rst:169 +msgid "" +"Update the physical screen. The curses library keeps two data structures, " +"one representing the current physical screen contents and a virtual screen " +"representing the desired next state. The :func:`doupdate` function updates " +"the physical screen to match the virtual screen." +msgstr "" + +#: ../../library/curses.rst:174 +msgid "" +"The virtual screen may be updated by a :meth:`~window.noutrefresh` call " +"after write operations such as :meth:`~window.addstr` have been performed on" +" a window. The normal :meth:`~window.refresh` call is simply " +":meth:`!noutrefresh` followed by :func:`!doupdate`; if you have to update " +"multiple windows, you can speed performance and perhaps reduce screen " +"flicker by issuing :meth:`!noutrefresh` calls on all windows, followed by a " +"single :func:`!doupdate`." +msgstr "" +"虚拟屏幕可以通过在写入操作例如在一个窗口上执行 :meth:`~window.addstr` 之后调用 " +":meth:`~window.noutrefresh` 来刷新。 普通的 :meth:`~window.refresh` 调用只是简单的 " +":meth:`!noutrefresh` 加 :func:`!doupdate`;如果你需要更新多个窗口,你可以通过在所有窗口上发出 " +":meth:`!noutrefresh` 调用再加单次 :func:`!doupdate` 来提升性能并可减少屏幕闪烁。" + +#: ../../library/curses.rst:184 +msgid "" +"Enter echo mode. In echo mode, each character input is echoed to the screen" +" as it is entered." +msgstr "进入 echo 模式。 在 echo 模式下,输入的每个字符都会在输入后回显到屏幕上。" + +#: ../../library/curses.rst:190 +msgid "De-initialize the library, and return terminal to normal status." +msgstr "撤销库的初始化,使终端返回正常状态。" + +#: ../../library/curses.rst:195 +msgid "" +"Return the user's current erase character as a one-byte bytes object. Under" +" Unix operating systems this is a property of the controlling tty of the " +"curses program, and is not set by the curses library itself." +msgstr "" +"将用户的当前擦除字符以单字节字节串对象的形式返回。 在 Unix 操作系统下这是 curses 程序用来控制 tty 的属性,而不是由 curses " +"库本身来设置的。" + +#: ../../library/curses.rst:202 +msgid "" +"The :func:`.filter` routine, if used, must be called before :func:`initscr` " +"is called. The effect is that, during the initialization, :envvar:`LINES` " +"is set to ``1``; the capabilities ``clear``, ``cup``, ``cud``, ``cud1``, " +"``cuu1``, ``cuu``, ``vpa`` are disabled; and the ``home`` string is set to " +"the value of ``cr``. The effect is that the cursor is confined to the " +"current line, and so are screen updates. This may be used for enabling " +"character-at-a-time line editing without touching the rest of the screen." +msgstr "" + +#: ../../library/curses.rst:212 +msgid "" +"Flash the screen. That is, change it to reverse-video and then change it " +"back in a short interval. Some people prefer such as 'visible bell' to the " +"audible attention signal produced by :func:`beep`." +msgstr "" +"闪烁屏幕。 也就是将其改为反显并在很短的时间内将其改回原状。 有些人更喜欢这样的‘视觉响铃’而非 :func:`beep` 所产生的听觉提醒信号。" + +#: ../../library/curses.rst:219 +msgid "" +"Flush all input buffers. This throws away any typeahead that has been " +"typed by the user and has not yet been processed by the program." +msgstr "刷新所有输入缓冲区。 这会丢弃任何已被用户输入但尚未被程序处理的预输入内容。" + +#: ../../library/curses.rst:225 +msgid "" +"After :meth:`~window.getch` returns :const:`KEY_MOUSE` to signal a mouse " +"event, this method should be called to retrieve the queued mouse event, " +"represented as a 5-tuple ``(id, x, y, z, bstate)``. *id* is an ID value used" +" to distinguish multiple devices, and *x*, *y*, *z* are the event's " +"coordinates. (*z* is currently unused.) *bstate* is an integer value whose" +" bits will be set to indicate the type of event, and will be the bitwise OR " +"of one or more of the following constants, where *n* is the button number " +"from 1 to 5: :const:`BUTTONn_PRESSED`, :const:`BUTTONn_RELEASED`, " +":const:`BUTTONn_CLICKED`, :const:`BUTTONn_DOUBLE_CLICKED`, " +":const:`BUTTONn_TRIPLE_CLICKED`, :const:`BUTTON_SHIFT`, " +":const:`BUTTON_CTRL`, :const:`BUTTON_ALT`." +msgstr "" +"在 :meth:`~window.getch` 返回 :const:`KEY_MOUSE` " +"以发出鼠标事件信号之后,应当调用此方法来获取加入队列的鼠标事件,事件以一个 5 元组 ``(id, x, y, z, bstate)`` 来表示。 其中" +" *id* 为用于区分多个设备的 ID 值,而 *x*, *y*, *z* 为事件的坐标。 (*z* 目前未被使用。) *bstate* " +"为一个整数值,其各个比特位将被设置用来表示事件的类型,并将为下列常量中的一个或多个按位 OR 的结果,其中 *n* 是以 1 到 5 表示的键号: " +":const:`BUTTONn_PRESSED`, :const:`BUTTONn_RELEASED`, " +":const:`BUTTONn_CLICKED`, :const:`BUTTONn_DOUBLE_CLICKED`, " +":const:`BUTTONn_TRIPLE_CLICKED`, :const:`BUTTON_SHIFT`, " +":const:`BUTTON_CTRL`, :const:`BUTTON_ALT`。" + +#: ../../library/curses.rst:236 ../../library/curses.rst:1850 +msgid "" +"The ``BUTTON5_*`` constants are now exposed if they are provided by the " +"underlying curses library." +msgstr "现在 ``BUTTON5_*`` 常量如果是由下层 curses 库提供的则会对外公开。" + +#: ../../library/curses.rst:243 +msgid "" +"Return the current coordinates of the virtual screen cursor as a tuple ``(y," +" x)``. If :meth:`leaveok ` is currently ``True``, then " +"return ``(-1, -1)``." +msgstr "" +"将当前虚拟屏幕光标的坐标作为元组 ``(y, x)`` 返回。 如果 :meth:`leaveok ` 当前为 " +"``True``,则返回 ``(-1, -1)``。" + +#: ../../library/curses.rst:249 +msgid "" +"Read window-related data stored in the file by an earlier " +":meth:`window.putwin` call. The routine then creates and initializes a new " +"window using that data, returning the new window object. The *file* " +"argument must be a file object opened for reading in binary mode." +msgstr "" + +#: ../../library/curses.rst:257 +msgid "" +"Return ``True`` if the terminal can display colors; otherwise, return " +"``False``." +msgstr "如果终端能显示彩色则返回 ``True``;否则返回 ``False``。" + +#: ../../library/curses.rst:261 +msgid "" +"Return ``True`` if the module supports extended colors; otherwise, return " +"``False``. Extended color support allows more than 256 color pairs for " +"terminals that support more than 16 colors (for example, xterm-256color)." +msgstr "" + +#: ../../library/curses.rst:265 +msgid "Extended color support requires ncurses version 6.1 or later." +msgstr "扩展颜色支持要求 ncurses 版本为 6.1 或更新。" + +#: ../../library/curses.rst:271 +msgid "" +"Return ``True`` if the terminal has insert- and delete-character " +"capabilities. This function is included for historical reasons only, as all " +"modern software terminal emulators have such capabilities." +msgstr "如果终端具有插入和删除字符的功能则返回 ``True``。 此函数仅是出于历史原因而被包括的,因为所有现代软件终端模拟器都具有这些功能。" + +#: ../../library/curses.rst:278 +msgid "" +"Return ``True`` if the terminal has insert- and delete-line capabilities, or" +" can simulate them using scrolling regions. This function is included for " +"historical reasons only, as all modern software terminal emulators have such" +" capabilities." +msgstr "" +"如果终端具有插入和删除行功能,或者能够使用滚动区域来模拟这些功能则返回 ``True``。 " +"此函数仅是出于历史原因而被包括的,因为所有现代软件终端模拟器都具有这些功能。" + +#: ../../library/curses.rst:286 +msgid "" +"Take a key value *ch*, and return ``True`` if the current terminal type " +"recognizes a key with that value." +msgstr "接受一个键值 *ch*,并在当前终端类型能识别出具有该值的键时返回 ``True``。" + +#: ../../library/curses.rst:292 +msgid "" +"Used for half-delay mode, which is similar to cbreak mode in that characters" +" typed by the user are immediately available to the program. However, after " +"blocking for *tenths* tenths of seconds, raise an exception if nothing has " +"been typed. The value of *tenths* must be a number between ``1`` and " +"``255``. Use :func:`nocbreak` to leave half-delay mode." +msgstr "" +"用于半延迟模式,与 cbreak 模式的类似之处是用户所键入的字符会立即对程序可用。 但是,在阻塞 *tenths* " +"个十分之一秒之后,如果还未输入任何内容则将引发异常。 *tenths* 值必须为 ``1`` 和 ``255`` 之间的数字。 使用 " +":func:`nocbreak` 可退出半延迟模式。" + +#: ../../library/curses.rst:301 +msgid "" +"Change the definition of a color, taking the number of the color to be " +"changed followed by three RGB values (for the amounts of red, green, and " +"blue components). The value of *color_number* must be between ``0`` and " +"``COLORS - 1``. Each of *r*, *g*, *b*, must be a value between ``0`` and " +"``1000``. When :func:`init_color` is used, all occurrences of that color on" +" the screen immediately change to the new definition. This function is a " +"no-op on most terminals; it is active only if :func:`can_change_color` " +"returns ``True``." +msgstr "" +"更改某个颜色的定义,接受要更改的颜色编号以及三个 RGB 值(表示红绿蓝三个分量的强度)。 *color_number* 的值必须为 ``0`` 和 " +"``COLORS - 1`` 之间的数字。 每个 *r*, *g*, *b* 值必须为 ``0`` 和 ``1000`` 之间的数字。 当使用 " +":func:`init_color` 时,出现在屏幕上的对应颜色会立即按照新定义来更改。 此函数在大多数终端上都是无操作的;它仅会在 " +":func:`can_change_color` 返回 ``True`` 时生效。" + +#: ../../library/curses.rst:312 +msgid "" +"Change the definition of a color-pair. It takes three arguments: the number" +" of the color-pair to be changed, the foreground color number, and the " +"background color number. The value of *pair_number* must be between ``1`` " +"and ``COLOR_PAIRS - 1`` (the ``0`` color pair can only be changed by " +":func:`use_default_colors` and :func:`assume_default_colors`). The value of " +"*fg* and *bg* arguments must be between ``0`` and ``COLORS - 1``, or, after " +"calling :func:`!use_default_colors` or :func:`!assume_default_colors`, " +"``-1``. If the color-pair was previously initialized, the screen is " +"refreshed and all occurrences of that color-pair are changed to the new " +"definition." +msgstr "" +"更改颜色对的定义。 它需要三个参数:要更改的颜色对的编号、前景色编号和背景色编号。 *pair_number* 的值必须介于 ``1`` 和 " +"``COLOR_PAIRS - 1`` 之间 (``0`` 颜色对只能由 :func:`use_default_colors` 和 " +":func:`assume_default_colors` 更改)。 *fg* 和 *bg* 参数的值必须介于 ``0`` 和 ``COLORS - " +"1`` 之间,或者在调用 :func:`!use_default_colors` 或 :func:`!assume_default_colors` " +"时使用 ``-1``。 如果该颜色对之前已被初始化,则屏幕将被刷新,该颜色对的所有出现都将更改为新定义。" + +#: ../../library/curses.rst:327 +msgid "" +"Initialize the library. Return a :ref:`window ` " +"object which represents the whole screen." +msgstr "初始化库。 返回代表整个屏幕的 :ref:`窗口 ` 对象。" + +#: ../../library/curses.rst:332 +msgid "" +"If there is an error opening the terminal, the underlying curses library may" +" cause the interpreter to exit." +msgstr "如果打开终端时发生错误,则下层的 curses 库可能会导致解释器退出。" + +#: ../../library/curses.rst:338 +msgid "" +"If *flag* is ``True``, pressing an interrupt key (interrupt, break, or quit)" +" will flush all output in the terminal driver queue. If *flag* is " +"``False``, no flushing is done." +msgstr "" + +#: ../../library/curses.rst:345 +msgid "" +"Return ``True`` if :func:`resize_term` would modify the window structure, " +"``False`` otherwise." +msgstr "如果 :func:`resize_term` 会修改窗口结构则返回 ``True``,否则返回 ``False``。" + +#: ../../library/curses.rst:351 +msgid "" +"Return ``True`` if :func:`endwin` has been called (that is, the curses " +"library has been deinitialized)." +msgstr "如果 :func:`endwin` 已经被调用(即 curses 库已经被撤销初始化)则返回 ``True``。" + +#: ../../library/curses.rst:357 +msgid "" +"Return the name of the key numbered *k* as a bytes object. The name of a " +"key generating printable ASCII character is the key's character. The name " +"of a control-key combination is a two-byte bytes object consisting of a " +"caret (``b'^'``) followed by the corresponding printable ASCII character. " +"The name of an alt-key combination (128--255) is a bytes object consisting " +"of the prefix ``b'M-'`` followed by the name of the corresponding ASCII " +"character." +msgstr "" +"将编号为 *k* 的键名称作为字节串对象返回。 生成可打印 ASCII 字符的键名称就是键所对应的字符。 Ctrl-" +"键组合的键名称则是一个两字节的字节串对象,它由插入符 (``b'^'``) 加对应的可打印 ASCII 字符组成。 Alt-键组合 (128--255)" +" 的键名称则是由前缀 ``b'M-'`` 加对应的可打印 ASCII 字符组成的字节串对象。" + +#: ../../library/curses.rst:364 +msgid "Raise a :exc:`ValueError` if *k* is negative." +msgstr "" + +#: ../../library/curses.rst:369 +msgid "" +"Return the user's current line kill character as a one-byte bytes object. " +"Under Unix operating systems this is a property of the controlling tty of " +"the curses program, and is not set by the curses library itself." +msgstr "" +"将用户的当前行删除字符以单字节字节串对象的形式返回。 在 Unix 操作系统下这是 curses 程序用来控制 tty 的属性,而不是由 curses " +"库本身来设置的。" + +#: ../../library/curses.rst:376 +msgid "" +"Return a bytes object containing the terminfo long name field describing the" +" current terminal. The maximum length of a verbose description is 128 " +"characters. It is defined only after the call to :func:`initscr`." +msgstr "" +"返回一个字节串对象,其中包含描述当前终端的 terminfo 长名称字段。 详细描述的最大长度为 128 个字符。 它仅在调用 " +":func:`initscr` 之后才会被定义。" + +#: ../../library/curses.rst:383 +msgid "" +"If *flag* is ``True``, allow 8-bit characters to be input. If *flag* is " +"``False``, allow only 7-bit chars." +msgstr "" +"如果 *flag* 为 ``True``,则允许输入 8 比特位的字符。 如果 *flag* 为 ``False``,则只允许 7 比特位的字符。" + +#: ../../library/curses.rst:389 +msgid "" +"Set the maximum time in milliseconds that can elapse between press and " +"release events in order for them to be recognized as a click, and return the" +" previous interval value. The default value is 166 milliseconds, or one " +"sixth of a second. Use a negative *interval* to obtain the interval value " +"without changing it." +msgstr "" + +#: ../../library/curses.rst:397 +msgid "" +"Set the mouse events to be reported, and return a tuple ``(availmask, " +"oldmask)``. *availmask* indicates which of the specified mouse events can " +"be reported; on complete failure it returns ``0``. *oldmask* is the " +"previous value of the mouse event mask. If this function is never called, " +"no mouse events are ever reported." +msgstr "" + +#: ../../library/curses.rst:406 +msgid "Sleep for *ms* milliseconds." +msgstr "休眠 *ms* 毫秒。" + +#: ../../library/curses.rst:411 +msgid "" +"Create and return a pointer to a new pad data structure with the given " +"number of lines and columns. Return a pad as a window object." +msgstr "创建并返回一个指向具有给定行数和列数新的面板数据结构的指针。 将面板作为窗口对象返回。" + +#: ../../library/curses.rst:414 +msgid "" +"A pad is like a window, except that it is not restricted by the screen size," +" and is not necessarily associated with a particular part of the screen. " +"Pads can be used when a large window is needed, and only a part of the " +"window will be on the screen at one time. Automatic refreshes of pads (such" +" as from scrolling or echoing of input) do not occur. The " +":meth:`~window.refresh` and :meth:`~window.noutrefresh` methods of a pad " +"require 6 arguments to specify the part of the pad to be displayed and the " +"location on the screen to be used for the display. The arguments are " +"*pminrow*, *pmincol*, *sminrow*, *smincol*, *smaxrow*, *smaxcol*; the *p* " +"arguments refer to the upper-left corner of the pad region to be displayed " +"and the *s* arguments define a clipping box on the screen within which the " +"pad region is to be displayed." +msgstr "" + +#: ../../library/curses.rst:430 +msgid "" +"Return a new :ref:`window `, whose left-upper corner " +"is at ``(begin_y, begin_x)``, and whose height/width is *nlines*/*ncols*." +msgstr "" +"返回一个新的 :ref:`窗口 `,其左上角位于 ``(begin_y, " +"begin_x)``,并且其高度/宽度为 *nlines*/*ncols*。" + +#: ../../library/curses.rst:433 +msgid "" +"By default, the window will extend from the specified position to the lower" +" right corner of the screen." +msgstr "默认情况下,窗口将从指定位置扩展到屏幕的右下角。" + +#: ../../library/curses.rst:439 +msgid "" +"Enter newline mode. This mode translates the return key into newline on " +"input, and translates newline into return and line-feed on output. Newline " +"mode is initially on." +msgstr "" +"进入 newline 模式。 此模式会在输入时将回车转换为换行符,并在输出时将换行符转换为回车加换行。 newline 模式会在初始时启用。" + +#: ../../library/curses.rst:443 +msgid "" +"If *flag* is ``False``, the effect is the same as calling :func:`nonl`." +msgstr "" + +#: ../../library/curses.rst:448 +msgid "Leave cbreak mode. Return to normal \"cooked\" mode with line buffering." +msgstr "退出 cbreak 模式。 返回具有行缓冲的正常 \"cooked\" 模式。" + +#: ../../library/curses.rst:453 +msgid "Leave echo mode. Echoing of input characters is turned off." +msgstr "退出 echo 模式。 关闭输入字符的回显。" + +#: ../../library/curses.rst:458 +msgid "" +"Leave newline mode. Disable translation of return into newline on input, " +"and disable low-level translation of newline into newline/return on output " +"(but this does not change the behavior of ``addch('\\n')``, which always " +"does the equivalent of return and line feed on the virtual screen). With " +"translation off, curses can sometimes speed up vertical motion a little; " +"also, it will be able to detect the return key on input." +msgstr "" +"退出 newline 模式。 停止在输入时将回车转换为换行,并停止在输出时从换行到换行/回车的底层转换(但这不会改变 ``addch('\\n')`` " +"的行为,此行为总是在虚拟屏幕上执行相当于回车加换行的操作)。 当停止转换时,curses 有时能使纵向移动加快一些;并且,它将能够在输入时检测回车键。" + +#: ../../library/curses.rst:468 +msgid "" +"When the :func:`!noqiflush` routine is used, normal flush of input and " +"output queues associated with the ``INTR``, ``QUIT`` and ``SUSP`` characters" +" will not be done. You may want to call :func:`!noqiflush` in a signal " +"handler if you want output to continue as though the interrupt had not " +"occurred, after the handler exits." +msgstr "" +"当使用 :func:`!noqiflush` 例程时,与 ``INTR``, ``QUIT`` 和 ``SUSP`` " +"字符相关联的输入和输出队列的正常刷新将不会被执行。 如果你希望在处理程序退出后还能继续输出,就像没有发生过中断一样,你可能会想要在信号处理程序中调用 " +":func:`!noqiflush`。" + +#: ../../library/curses.rst:476 +msgid "Leave raw mode. Return to normal \"cooked\" mode with line buffering." +msgstr "退出 raw 模式。 返回具有行缓冲的正常 \"cooked\" 模式。" + +#: ../../library/curses.rst:481 +msgid "" +"Return a tuple ``(fg, bg)`` containing the colors for the requested color " +"pair. The value of *pair_number* must be between ``0`` and ``COLOR_PAIRS - " +"1``." +msgstr "" +"返回包含对应于所请求颜色对的元组 ``(fg, bg)``。 *pair_number* 的值必须在 ``0`` 和 ``COLOR_PAIRS - " +"1`` 之间。" + +#: ../../library/curses.rst:487 +msgid "" +"Return the number of the color-pair set by the attribute value *attr*. " +":func:`color_pair` is the counterpart to this function." +msgstr "返回通过属性值 *attr* 所设置的颜色对的编号。 :func:`color_pair` 是此函数的对应操作。" + +#: ../../library/curses.rst:493 +msgid "" +"Equivalent to ``tputs(str, 1, putchar)``; emit the value of a specified " +"terminfo capability for the current terminal. Note that the output of " +":func:`putp` always goes to standard output." +msgstr "" +"等价于 ``tputs(str, 1, putchar)``;为当前终端发出指定 terminfo 功能的值。 请注意 :func:`putp` " +"的输出总是前往标准输出。" + +#: ../../library/curses.rst:497 ../../library/curses.rst:633 +#: ../../library/curses.rst:643 ../../library/curses.rst:653 +#: ../../library/curses.rst:663 +msgid ":func:`setupterm` (or :func:`initscr`) must be called first." +msgstr "" + +#: ../../library/curses.rst:502 +msgid "" +"If *flag* is ``False``, the effect is the same as calling :func:`noqiflush`." +" If *flag* is ``True``, or no argument is provided, the queues will be " +"flushed when these control characters are read." +msgstr "" +"如果 *flag* 为 ``False``,则效果与调用 :func:`noqiflush` 相同。 如果 *flag* 为 ``True`` " +"或未提供参数,则在读取这些控制字符时队列将被刷新。" + +#: ../../library/curses.rst:509 +msgid "" +"Enter raw mode. In raw mode, normal line buffering and processing of " +"interrupt, quit, suspend, and flow control keys are turned off; characters " +"are presented to curses input functions one by one." +msgstr "" +"进入 raw 模式。 在 raw 模式下,正常的行缓冲和对中断、退出、挂起和流程控制键的处理会被关闭;字符会被逐个地提交给 curses 输入函数。" + +#: ../../library/curses.rst:516 +msgid "" +"Restore the terminal to \"program\" mode, as previously saved by " +":func:`def_prog_mode`." +msgstr "将终端恢复到 \"program\" 模式,如之前由 :func:`def_prog_mode` 所保存的一样。" + +#: ../../library/curses.rst:522 +msgid "" +"Restore the terminal to \"shell\" mode, as previously saved by " +":func:`def_shell_mode`." +msgstr "将终端恢复到 \"shell\" 模式,如之前由 :func:`def_shell_mode` 所保存的一样。" + +#: ../../library/curses.rst:528 +msgid "" +"Restore the state of the terminal modes to what it was at the last call to " +":func:`savetty`." +msgstr "将终端模式恢复到最后一次调用 :func:`savetty` 时的状态。" + +#: ../../library/curses.rst:534 +msgid "" +"Backend function used by :func:`resizeterm`, performing most of the work; " +"when resizing the windows, :func:`resize_term` blank-fills the areas that " +"are extended. The calling application should fill in these areas with " +"appropriate data. The :func:`!resize_term` function attempts to resize all " +"windows. However, due to the calling convention of pads, it is not possible" +" to resize these without additional interaction with the application." +msgstr "" +"由 :func:`resizeterm` 用来执行大部分工作的后端函数;当调整窗口大小时,:func:`resize_term` 会以空白填充扩展区域。" +" 调用方应用程序应当以适当的数据填充这些区域。 :func:`!resize_term` 函数会尝试调整所有窗口的大小。 " +"但是,由于面板的调用约定,在不与应用程序进行额外交互的情况下是无法调整其大小的。" + +#: ../../library/curses.rst:544 +msgid "" +"Resize the standard and current windows to the specified dimensions, and " +"adjusts other bookkeeping data used by the curses library that record the " +"window dimensions (in particular the SIGWINCH handler)." +msgstr "" +"将标准窗口和当前窗口的大小调整为指定的尺寸,并调整由 curses 库所使用的记录窗口尺寸的其他记录数据(特别是 SIGWINCH 处理程序)。" + +#: ../../library/curses.rst:551 +msgid "" +"Save the current state of the terminal modes in a buffer, usable by " +":func:`resetty`." +msgstr "将终端模式的当前状态保存在缓冲区中,可供 :func:`resetty` 使用。" + +#: ../../library/curses.rst:556 +msgid "Retrieves the value set by :func:`set_escdelay`." +msgstr "提取通过 :func:`set_escdelay` 设置的值。" + +#: ../../library/curses.rst:562 +msgid "" +"Sets the number of milliseconds to wait after reading an escape character, " +"to distinguish between an individual escape character entered on the " +"keyboard from escape sequences sent by cursor and function keys." +msgstr "设置读取一个转义字符后要等待的毫秒数,以区分在键盘上输入的单个转义字符与通过光标和功能键发送的转义序列。" + +#: ../../library/curses.rst:570 +msgid "Retrieves the value set by :func:`set_tabsize`." +msgstr "提取通过 :func:`set_tabsize` 设置的值。" + +#: ../../library/curses.rst:576 +msgid "" +"Sets the number of columns used by the curses library when converting a tab " +"character to spaces as it adds the tab to a window." +msgstr "设置 curses 库在将制表符添加到窗口时将制表符转换为空格所使用的列数。" + +#: ../../library/curses.rst:583 +msgid "" +"Set the virtual screen cursor to *y*, *x*. If *y* and *x* are both ``-1``, " +"then :meth:`leaveok ` is set ``True``." +msgstr "" +"将虚拟屏幕光标设置到 *y*, *x*。 如果 *y* 和 *x* 均为 ``-1``,则 :meth:`leaveok " +"` 将设为 ``True``。" + +#: ../../library/curses.rst:589 +msgid "" +"Initialize the terminal. *term* is a string giving the terminal name, or " +"``None``; if omitted or ``None``, the value of the :envvar:`TERM` " +"environment variable will be used. *fd* is the file descriptor to which any" +" initialization sequences will be sent; if not supplied or ``-1``, the file " +"descriptor for ``sys.stdout`` will be used." +msgstr "" +"初始化终端。 *term* 为给出终端名称的字符串或为 ``None``;如果省略或为 ``None``,则将使用 :envvar:`TERM` " +"环境变量的值。 *fd* 是任何初始化序列将被发送到的文件描述符;如未指定或为 ``-1``,则将使用 ``sys.stdout`` 的文件描述符。" + +#: ../../library/curses.rst:595 +msgid "" +"Raise a :exc:`curses.error` if the terminal could not be found or its " +"terminfo database entry could not be read. If the terminal has already been" +" initialized, this function has no effect." +msgstr "" + +#: ../../library/curses.rst:602 +msgid "" +"Must be called if the programmer wants to use colors, and before any other " +"color manipulation routine is called. It is good practice to call this " +"routine right after :func:`initscr`." +msgstr "" +"如果程序员想要使用颜色,则必须在任何其他颜色操作例程被调用之前调用它。 在 :func:`initscr` 之后立即调用此例程是一个很好的做法。" + +#: ../../library/curses.rst:606 +msgid "" +":func:`start_color` initializes eight basic colors (black, red, green, " +"yellow, blue, magenta, cyan, and white), and two global variables in the " +":mod:`!curses` module, :const:`COLORS` and :const:`COLOR_PAIRS`, containing " +"the maximum number of colors and color-pairs the terminal can support. It " +"also restores the colors on the terminal to the values they had when the " +"terminal was just turned on." +msgstr "" + +#: ../../library/curses.rst:615 +msgid "" +"Return a logical OR of all video attributes supported by the terminal. This" +" information is useful when a curses program needs complete control over the" +" appearance of the screen." +msgstr "返回终端所支持的所有视频属性逻辑 OR 的值。 此信息适用于当 curses 程序需要对屏幕外观进行完全控制的情况。" + +#: ../../library/curses.rst:622 +msgid "" +"Return the value of the environment variable :envvar:`TERM`, as a bytes " +"object, truncated to 14 characters." +msgstr "将环境变量 :envvar:`TERM` 的值截短至 14 个字节,作为字节串对象返回。" + +#: ../../library/curses.rst:628 +msgid "" +"Return the value of the Boolean capability corresponding to the terminfo " +"capability name *capname* as an integer. Return the value ``-1`` if " +"*capname* is not a Boolean capability, or ``0`` if it is canceled or absent " +"from the terminal description." +msgstr "" +"将与 terminfo 功能名称 *capname* 相对应的布尔功能值以整数形式返回。 如果 *capname* 不是一个布尔功能则返回 " +"``-1``,如果其被取消或不存在于终端描述中则返回 ``0``。" + +#: ../../library/curses.rst:638 +msgid "" +"Return the value of the numeric capability corresponding to the terminfo " +"capability name *capname* as an integer. Return the value ``-2`` if " +"*capname* is not a numeric capability, or ``-1`` if it is canceled or absent" +" from the terminal description." +msgstr "" +"将与 terminfo 功能名称 *capname* 相对应的数字功能值以整数形式返回。 如果 *capname* 不是一个数字功能则返回 " +"``-2``,如果其被取消或不存在于终端描述中则返回 ``-1``。" + +#: ../../library/curses.rst:648 +msgid "" +"Return the value of the string capability corresponding to the terminfo " +"capability name *capname* as a bytes object. Return ``None`` if *capname* " +"is not a terminfo \"string capability\", or is canceled or absent from the " +"terminal description." +msgstr "" +"将与 terminfo 功能名称 *capname* 相对应的字符串功能值以字节串对象形式返回。 如果 *capname* 不是一个 terminfo " +"\"字符串功能\" 或者如果其被取消或不存在于终端描述中则返回 ``None``。" + +#: ../../library/curses.rst:658 +msgid "" +"Instantiate the bytes object *str* with the supplied parameters, where *str*" +" should be a parameterized string obtained from the terminfo database. For " +"example, ``tparm(tigetstr(\"cup\"), 5, 3)`` could result in " +"``b'\\033[6;4H'``, the exact result depending on terminal type. Up to nine " +"integer parameters may be supplied." +msgstr "" + +#: ../../library/curses.rst:668 +msgid "" +"Specify that the file descriptor *fd* be used for typeahead checking. If " +"*fd* is ``-1``, then no typeahead checking is done." +msgstr "指定将被用于预输入检查的文件描述符 *fd*。 如果 *fd* 为 ``-1``,则不执行预输入检查。" + +#: ../../library/curses.rst:671 +msgid "" +"The curses library does \"line-breakout optimization\" by looking for " +"typeahead periodically while updating the screen. If input is found, and it" +" is coming from a tty, the current update is postponed until refresh or " +"doupdate is called again, allowing faster response to commands typed in " +"advance. This function allows specifying a different file descriptor for " +"typeahead checking." +msgstr "" +"curses 库会在更新屏幕时通过定期查找预输入来执行 \"断行优化\"。 如果找到了输入,并且输入是来自于 tty,则会将当前更新推迟至 " +"refresh 或 doupdate 再次被调用的时候,以便允许更快地响应预先输入的命令。 此函数允许为预输入检查指定其他的文件描述符。" + +#: ../../library/curses.rst:680 +msgid "" +"Return a bytes object which is a printable representation of the character " +"*ch*. Control characters are represented as a caret followed by the " +"character, for example as ``b'^C'``. Printing characters are left as they " +"are." +msgstr "" +"返回一个字节串对象作为字符 *ch* 的可打印表示形式。 控制字符会表示为一个插入符加相应的字符,例如 ``b'^C'``。 可打印字符则会保持原样。" + +#: ../../library/curses.rst:687 +msgid "Push *ch* so the next :meth:`~window.getch` will return it." +msgstr "推送 *ch* 以便让下一个 :meth:`~window.getch` 返回该字符。" + +#: ../../library/curses.rst:691 +msgid "Only one *ch* can be pushed before :meth:`!getch` is called." +msgstr "在 :meth:`!getch` 被调用之前只能推送一个 *ch*。" + +#: ../../library/curses.rst:696 +msgid "" +"Update the :const:`LINES` and :const:`COLS` module variables. Useful for " +"detecting manual screen resize." +msgstr "更新 :const:`LINES` 和 :const:`COLS` 模块变量。 适用于检测手动调整屏幕大小。" + +#: ../../library/curses.rst:704 +msgid "Push *ch* so the next :meth:`~window.get_wch` will return it." +msgstr "推送 *ch* 以便让下一个 :meth:`~window.get_wch` 返回该字符。" + +#: ../../library/curses.rst:708 +msgid "Only one *ch* can be pushed before :meth:`!get_wch` is called." +msgstr "在 :meth:`!get_wch` 被调用之前只能推送一个 *ch*。" + +#: ../../library/curses.rst:715 +msgid "" +"Push a :const:`KEY_MOUSE` event onto the input queue, associating the given " +"state data with it." +msgstr "将 :const:`KEY_MOUSE` 事件推送到输入队列,将其与给定的状态数据进行关联。" + +#: ../../library/curses.rst:721 +msgid "" +"If used, this function should be called before :func:`initscr` or newterm " +"are called. When *flag* is ``False``, the values of lines and columns " +"specified in the terminfo database will be used, even if environment " +"variables :envvar:`LINES` and :envvar:`COLUMNS` (used by default) are set, " +"or if curses is running in a window (in which case default behavior would be" +" to use the window size if :envvar:`LINES` and :envvar:`COLUMNS` are not " +"set)." +msgstr "" +"如果使用此函数,则应当在调用 :func:`initscr` 或 newterm 之前调用它。 当 *flag* 为 ``False`` 时,将会使用在" +" terminfo 数据库中指定的行和列的值,即使设置了环境变量 :envvar:`LINES` 和 :envvar:`COLUMNS` " +"(默认使用),或者如果 curses 是在窗口中运行(在此情况下如果未设置 :envvar:`LINES` 和 :envvar:`COLUMNS` " +"则默认行为将是使用窗口大小)。" + +#: ../../library/curses.rst:731 +msgid "Equivalent to ``assume_default_colors(-1, -1)``." +msgstr "相当于 ``assume_default_colors(-1, -1)``。" + +#: ../../library/curses.rst:736 +msgid "" +"Initialize curses and call another callable object, *func*, which should be " +"the rest of your curses-using application. If the application raises an " +"exception, this function will restore the terminal to a sane state before " +"re-raising the exception and generating a traceback. The callable object " +"*func* is then passed the main window 'stdscr' as its first argument, " +"followed by any other arguments passed to :func:`!wrapper`. Before calling " +"*func*, :func:`!wrapper` turns on cbreak mode, turns off echo, enables the " +"terminal keypad, and initializes colors if the terminal has color support. " +"On exit (whether normally or by exception) it restores cooked mode, turns on" +" echo, and disables the terminal keypad." +msgstr "" +"初始化 curses 并调用另一个可调用对象 *func*,该对象应当为你的使用 curses 的应用程序的其余部分。 " +"如果应用程序引发了异常,此函数将在重新引发异常并生成回溯信息之前将终端恢复到正常状态。 随后可调用对象 *func* 会被传入主窗口 'stdscr' " +"作为其第一个参数,再带上其他所有传给 :func:`!wrapper` 的参数。 在调用 *func* 之前,:func:`!wrapper` 会启用 " +"cbreak 模式,关闭回显,启用终端键盘,并在终端具有颜色支持的情况下初始化颜色。 在退出时(无论是正常退出还是异常退出)它会恢复 cooked " +"模式,打开回显,并禁用终端键盘。" + +#: ../../library/curses.rst:750 +msgid "Window objects" +msgstr "" + +#: ../../library/curses.rst:754 +msgid "" +"Window objects, as returned by :func:`initscr` and :func:`newwin` above, " +"have the following methods and attributes:" +msgstr "Window 对象会由上面的 :func:`initscr` 和 :func:`newwin` 返回,它具有以下方法和属性:" + +#: ../../library/curses.rst:761 +msgid "" +"Paint character *ch* at ``(y, x)`` with attributes *attr*, overwriting any " +"character previously painted at that location. By default, the character " +"position and attributes are the current settings for the window object." +msgstr "" +"将带有属性 *attr* 的字符 *ch* 绘制到 ``(y, x)``,覆盖之前在该位置上绘制的任何字符。 " +"默认情况下,字符的位置和属性均为窗口对象的当前设置。" + +#: ../../library/curses.rst:767 +msgid "" +"Writing outside the window, subwindow, or pad raises a :exc:`curses.error`. " +"Attempting to write to the lower-right corner of a window, subwindow, or pad" +" will cause an exception to be raised after the character is printed." +msgstr "" + +#: ../../library/curses.rst:775 +msgid "" +"Paint at most *n* characters of the character string *str* at ``(y, x)`` " +"with attributes *attr*, overwriting anything previously on the display." +msgstr "将带有属性 *attr* 的字符串 *str* 中的至多 *n* 个字符绘制到 ``(y, x)``,覆盖之前在屏幕上的任何内容。" + +#: ../../library/curses.rst:783 +msgid "" +"Paint the character string *str* at ``(y, x)`` with attributes *attr*, " +"overwriting anything previously on the display." +msgstr "将带有属性 *attr* 的字符串 *str* 绘制到 ``(y, x)``,覆盖之前在屏幕上的任何内容。" + +#: ../../library/curses.rst:788 +msgid "" +"Writing outside the window, subwindow, or pad raises :exc:`curses.error`. " +"Attempting to write to the lower-right corner of a window, subwindow, or pad" +" will cause an exception to be raised after the string is printed." +msgstr "" + +#: ../../library/curses.rst:792 +msgid "" +"A bug in ncurses, the backend for this Python module, could cause segfaults " +"when resizing windows. This was fixed in ncurses-6.1-20190511. If you are " +"stuck with an earlier ncurses, you can avoid triggering it by not calling " +":meth:`!addstr` with a *str* that has embedded newlines; instead, call " +":meth:`!addstr` separately for each line." +msgstr "" + +#: ../../library/curses.rst:801 +msgid "" +"Remove attribute *attr* from the \"background\" set applied to all writes to" +" the current window." +msgstr "从应用于写入到当前窗口的 \"background\" 集中移除属性 *attr*。" + +#: ../../library/curses.rst:807 +msgid "" +"Add attribute *attr* to the \"background\" set applied to all writes to the " +"current window." +msgstr "将属性 *attr* 添加到应用于对当前窗口的所有写入的 \"background\" 集合。" + +#: ../../library/curses.rst:813 +msgid "" +"Set the \"background\" set of attributes to *attr*. This set is initially " +"``0`` (no attributes)." +msgstr "将 \"background\" 属性集设为 *attr*。 该集合初始时为 ``0`` (无属性)。" + +#: ../../library/curses.rst:819 +msgid "" +"Set the background property of the window to the character *ch*, with " +"attributes *attr*. The change is then applied to every character position " +"in that window:" +msgstr "将窗口 background 特征属性设为带有属性 *attr* 的字符 *ch*。 随后此修改将应用于放置到该窗口中的每个字符。" + +#: ../../library/curses.rst:823 +msgid "" +"The attribute of every character in the window is changed to the new " +"background attribute." +msgstr "窗口中每个字符的属性会被修改为新的 background 属性。" + +#: ../../library/curses.rst:826 +msgid "" +"Wherever the former background character appears, it is changed to the new" +" background character." +msgstr "不论之前的 background 字符出现在哪里,它都会被修改为新的 background 字符。" + +#: ../../library/curses.rst:832 +msgid "" +"Set the window's background. A window's background consists of a character " +"and any combination of attributes. The attribute part of the background is " +"combined (OR'ed) with all non-blank characters that are written into the " +"window. Both the character and attribute parts of the background are " +"combined with the blank characters. The background becomes a property of " +"the character and moves with the character through any scrolling and " +"insert/delete line/character operations." +msgstr "" +"设置窗口的背景。 窗口的背景由字符和属性的任意组合构成。 背景的属性部分会与写入窗口的所有非空白字符合并(即 OR 运算)。 " +"背景的字符和属性部分均会与空白字符合并。 背景将成为字符的特征属性并在任何滚动与插入/删除行/字符操作中与字符一起移动。" + +#: ../../library/curses.rst:842 +msgid "" +"Draw a border around the edges of the window. Each parameter specifies the " +"character to use for a specific part of the border; see the table below for " +"more details." +msgstr "在窗口边缘绘制边框。每个参数指定用于边界特定部分的字符;请参阅下表了解更多详情。" + +#: ../../library/curses.rst:848 +msgid "" +"A ``0`` value for any parameter will cause the default character to be used " +"for that parameter. Keyword parameters can *not* be used. The defaults are" +" listed in this table:" +msgstr "任何形参的值为 ``0`` 都将导致该形参使用默认字符。 关键字形参 *不可* 被使用。 默认字符在下表中列出:" + +#: ../../library/curses.rst:853 +msgid "Parameter" +msgstr "参数" + +#: ../../library/curses.rst:853 +msgid "Description" +msgstr "描述" + +#: ../../library/curses.rst:853 +msgid "Default value" +msgstr "默认值" + +#: ../../library/curses.rst:855 +msgid "*ls*" +msgstr "*ls*" + +#: ../../library/curses.rst:855 +msgid "Left side" +msgstr "左侧" + +#: ../../library/curses.rst:855 ../../library/curses.rst:857 +msgid ":const:`ACS_VLINE`" +msgstr ":const:`ACS_VLINE`" + +#: ../../library/curses.rst:857 +msgid "*rs*" +msgstr "*rs*" + +#: ../../library/curses.rst:857 +msgid "Right side" +msgstr "右侧" + +#: ../../library/curses.rst:859 +msgid "*ts*" +msgstr "*ts*" + +#: ../../library/curses.rst:859 +msgid "Top" +msgstr "顶部" + +#: ../../library/curses.rst:859 ../../library/curses.rst:861 +msgid ":const:`ACS_HLINE`" +msgstr ":const:`ACS_HLINE`" + +#: ../../library/curses.rst:861 +msgid "*bs*" +msgstr "*bs*" + +#: ../../library/curses.rst:861 +msgid "Bottom" +msgstr "底部" + +#: ../../library/curses.rst:863 +msgid "*tl*" +msgstr "*tl*" + +#: ../../library/curses.rst:863 +msgid "Upper-left corner" +msgstr "左上角" + +#: ../../library/curses.rst:863 +msgid ":const:`ACS_ULCORNER`" +msgstr ":const:`ACS_ULCORNER`" + +#: ../../library/curses.rst:865 +msgid "*tr*" +msgstr "*tr*" + +#: ../../library/curses.rst:865 +msgid "Upper-right corner" +msgstr "右上角" + +#: ../../library/curses.rst:865 +msgid ":const:`ACS_URCORNER`" +msgstr ":const:`ACS_URCORNER`" + +#: ../../library/curses.rst:867 +msgid "*bl*" +msgstr "*bl*" + +#: ../../library/curses.rst:867 +msgid "Bottom-left corner" +msgstr "左下角" + +#: ../../library/curses.rst:867 +msgid ":const:`ACS_LLCORNER`" +msgstr ":const:`ACS_LLCORNER`" + +#: ../../library/curses.rst:869 +msgid "*br*" +msgstr "*br*" + +#: ../../library/curses.rst:869 +msgid "Bottom-right corner" +msgstr "右下角" + +#: ../../library/curses.rst:869 +msgid ":const:`ACS_LRCORNER`" +msgstr ":const:`ACS_LRCORNER`" + +#: ../../library/curses.rst:875 +msgid "" +"Similar to :meth:`border`, but both *ls* and *rs* are *vertch* and both *ts*" +" and *bs* are *horch*. The default corner characters are always used by " +"this function." +msgstr "" +"类似于 :meth:`border`,但 *ls* 和 *rs* 均为 *vertch* 而 *ts* 和 *bs* 均为 *horch*。 " +"此函数总是会使用默认的转角字符。" + +#: ../../library/curses.rst:884 +msgid "" +"Set the attributes of *num* characters at the current cursor position, or at" +" position ``(y, x)`` if supplied. If *num* is not given or is ``-1``, the " +"attribute will be set on all the characters to the end of the line. This " +"function moves cursor to position ``(y, x)`` if supplied. The changed line " +"will be touched using the :meth:`touchline` method so that the contents will" +" be redisplayed by the next window refresh." +msgstr "" +"在当前光标位置或是在所提供的位置 ``(y, x)`` 设置 *num* 个字符的属性。 如果 *num* 未给出或为 " +"``-1``,则将属性设置到所有字符上直至行尾。 如果提供了位置 ``(y, x)`` 则此函数会将光标移至该位置。 修改过的行将使用 " +":meth:`touchline` 方法处理以便下次窗口刷新时内容会重新显示。" + +#: ../../library/curses.rst:894 +msgid "" +"Like :meth:`erase`, but also cause the whole window to be repainted upon " +"next call to :meth:`refresh`." +msgstr "类似于 :meth:`erase`,但还会导致在下次调用 :meth:`refresh` 时整个窗口被重新绘制。" + +#: ../../library/curses.rst:900 +msgid "" +"If *flag* is ``True``, the next call to :meth:`refresh` will clear the " +"window completely." +msgstr "如果 *flag* 为 ``True``,则在下次调用 :meth:`refresh` 时将完全清除窗口。" + +#: ../../library/curses.rst:906 +msgid "" +"Erase from cursor to the end of the window: all lines below the cursor are " +"deleted, and then the equivalent of :meth:`clrtoeol` is performed." +msgstr "从光标位置开始擦除直至窗口末端:光标以下的所有行都会被删除,然后会执行 :meth:`clrtoeol` 的等效操作。" + +#: ../../library/curses.rst:912 +msgid "Erase from cursor to the end of the line." +msgstr "从光标位置开始擦除直至行尾。" + +#: ../../library/curses.rst:917 +msgid "" +"Update the current cursor position of all the ancestors of the window to " +"reflect the current cursor position of the window." +msgstr "更新窗口所有上级窗口的当前光标位置以反映窗口的当前光标位置。" + +#: ../../library/curses.rst:923 +msgid "" +"Delete the character under the cursor, or at ``(y, x)`` if specified. All " +"characters to the right on the same line are shifted one position left." +msgstr "" + +#: ../../library/curses.rst:929 +msgid "" +"Delete the line under the cursor. All following lines are moved up by one " +"line." +msgstr "删除在光标之下的行。 所有后续的行都会上移一行。" + +#: ../../library/curses.rst:935 +msgid "" +"An abbreviation for \"derive window\", :meth:`derwin` is the same as calling" +" :meth:`subwin`, except that *begin_y* and *begin_x* are relative to the " +"origin of the window, rather than relative to the entire screen. Return a " +"window object for the derived window." +msgstr "" +"\"derive window\" 的缩写,:meth:`derwin` 与调用 :meth:`subwin` 等效,不同之处在于 *begin_y* " +"和 *begin_x* 是相对于窗口的初始位置,而不是相对于整个屏幕。 返回代表所派生窗口的窗口对象。" + +#: ../../library/curses.rst:943 +msgid "" +"Add character *ch* with attribute *attr*, and immediately call " +":meth:`refresh` on the window." +msgstr "使用属性 *attr* 添加字符 *ch*,并立即在窗口上调用 :meth:`refresh`。" + +#: ../../library/curses.rst:949 +msgid "" +"Test whether the given pair of screen-relative character-cell coordinates " +"are enclosed by the given window, returning ``True`` or ``False``. It is " +"useful for determining what subset of the screen windows enclose the " +"location of a mouse event." +msgstr "" +"检测给定的相对屏幕的字符-单元格坐标是否被给定的窗口所包围,返回 ``True`` 或 ``False``。 " +"它适用于确定是哪个屏幕窗口子集包围着某个鼠标事件的位置。" + +#: ../../library/curses.rst:954 +msgid "" +"Previously it returned ``1`` or ``0`` instead of ``True`` or ``False``." +msgstr "在之前版本中它会返回 ``1`` 或 ``0`` 而不是 ``True`` 或 ``False``。" + +#: ../../library/curses.rst:960 +msgid "" +"Encoding used to encode method arguments (Unicode strings and characters). " +"The encoding attribute is inherited from the parent window when a subwindow " +"is created, for example with :meth:`window.subwin`. By default, current " +"locale encoding is used (see :func:`locale.getencoding`)." +msgstr "" +"用于编码方法参数(Unicode 字符串和字符)的编码格式。 encoding 属性是在创建子窗口时从父窗口继承的,例如通过 " +":meth:`window.subwin`。 在默认情况下,会使用当前语言区域的编码格式(参见 :func:`locale.getencoding` " +"文档)。" + +#: ../../library/curses.rst:970 +msgid "Clear the window." +msgstr "清空窗口。" + +#: ../../library/curses.rst:975 +msgid "Return a tuple ``(y, x)`` of coordinates of upper-left corner." +msgstr "返回以左上角为原点的坐标元组 ``(y, x)``。" + +#: ../../library/curses.rst:980 +msgid "" +"Return the given window's current background character/attribute pair. Its " +"components can be extracted like those of :meth:`inch`." +msgstr "" + +#: ../../library/curses.rst:986 +msgid "" +"Get a character. Note that the integer returned does *not* have to be in " +"ASCII range: function keys, keypad keys and so on are represented by numbers" +" higher than 255. In no-delay mode, return ``-1`` if there is no input, " +"otherwise wait until a key is pressed." +msgstr "" +"获取一个字符。 请注意所返回的整数 *不一定* 要在 ASCII 范围以内:功能键、小键盘键等等是由大于 255 的数字表示的。 " +"在无延迟模式下,如果没有输入则返回 ``-1``,在其他情况下都会等待直至有键被按下。" + +#: ../../library/curses.rst:994 +msgid "" +"Get a wide character. Return a character for most keys, or an integer for " +"function keys, keypad keys, and other special keys. In no-delay mode, raise " +"an exception if there is no input." +msgstr "" +"获取一个宽字符。 对于大多数键都是返回一个字符,对于功能键、小键盘键和其他特殊键则是返回一个整数。 在无延迟模式下,如果没有输入则引发一个异常。" + +#: ../../library/curses.rst:1003 +msgid "" +"Get a character, returning a string instead of an integer, as :meth:`getch` " +"does. Function keys, keypad keys and other special keys return a multibyte " +"string containing the key name. In no-delay mode, raise an exception if " +"there is no input." +msgstr "" +"获取一个字符,返回一个字符串而不是像 :meth:`getch` 那样返回一个整数。 功能键、小键盘键和其他特殊键则是返回一个包含键名的多字节字符串。 " +"在无延迟模式下,如果没有输入则引发一个异常。" + +#: ../../library/curses.rst:1011 +msgid "Return a tuple ``(y, x)`` of the height and width of the window." +msgstr "返回窗口高度和宽度的元组 ``(y, x)``。" + +#: ../../library/curses.rst:1016 +msgid "" +"Return the beginning coordinates of this window relative to its parent " +"window as a tuple ``(y, x)``. Return ``(-1, -1)`` if this window has no " +"parent." +msgstr "将此窗口相对于父窗口的起始坐标作为元组 ``(y, x)`` 返回。 如果此窗口没有父窗口则返回 ``(-1, -1)``。" + +#: ../../library/curses.rst:1026 +msgid "" +"Read a bytes object from the user, with primitive line editing capacity. At " +"most *n* characters are read; *n* defaults to and cannot exceed 2047." +msgstr "" + +#: ../../library/curses.rst:1030 ../../library/curses.rst:1131 +msgid "The maximum value for *n* was increased from 1023 to 2047." +msgstr " *n* 的最大值从 1023 增加到 2047。" + +#: ../../library/curses.rst:1036 +msgid "" +"Return a tuple ``(y, x)`` of current cursor position relative to the " +"window's upper-left corner." +msgstr "返回当前光标相对于窗口左上角的位置的元组 ``(y, x)``。" + +#: ../../library/curses.rst:1043 +msgid "" +"Display a horizontal line starting at ``(y, x)`` with length *n* consisting " +"of the character *ch* with attributes *attr*. The line stops at the right " +"edge of the window if fewer than *n* cells are available." +msgstr "" + +#: ../../library/curses.rst:1050 +msgid "" +"If *flag* is ``False``, curses no longer considers using the hardware " +"insert/delete character feature of the terminal; if *flag* is ``True``, use " +"of character insertion and deletion is enabled. When curses is first " +"initialized, use of character insert/delete is enabled by default." +msgstr "" +"如果 *flag* 为 ``False``,curses 将不再考虑使用终端的硬件插入/删除字符功能;如果 *flag* 为 " +"``True``,则会启用字符插入和删除。 当 curses 首次初始化时,默认会启用字符插入/删除。" + +#: ../../library/curses.rst:1058 +msgid "" +"If *flag* is ``True``, :mod:`!curses` will try to use hardware line editing " +"facilities. Otherwise, curses will not use them." +msgstr "" + +#: ../../library/curses.rst:1064 +msgid "" +"If *flag* is ``True``, any change in the window image automatically causes " +"the window to be refreshed; you no longer have to call :meth:`refresh` " +"yourself. However, it may degrade performance considerably, due to repeated " +"calls to wrefresh. This option is disabled by default." +msgstr "" +"如果 *flag* 为 ``True``,窗口图像中的任何改变都会自动导致窗口被刷新;你不必再自己调用 :meth:`refresh`。 " +"但是,这可能会由于重复调用 wrefresh 而显著降低性能。 此选项默认被禁用。" + +#: ../../library/curses.rst:1072 +msgid "" +"Return the character at the given position in the window. The bottom 8 bits " +"are the character proper and the upper bits are the attributes; extract them" +" with the :data:`A_CHARTEXT` and :data:`A_ATTRIBUTES` bit-masks, and the " +"color pair with :func:`pair_number`." +msgstr "" + +#: ../../library/curses.rst:1081 +msgid "" +"Insert character *ch* with attributes *attr* before the character under the " +"cursor, or at ``(y, x)`` if specified. All characters to the right of the " +"cursor are shifted one position right, with the rightmost character on the " +"line being lost. The cursor position does not change." +msgstr "" + +#: ../../library/curses.rst:1089 +msgid "" +"Insert *nlines* lines into the specified window above the current line. The" +" *nlines* bottom lines are lost. For negative *nlines*, delete *nlines* " +"lines starting with the one under the cursor, and move the remaining lines " +"up. The bottom *nlines* lines are cleared. The current cursor position " +"remains the same." +msgstr "" +"在指定窗口的当前行上方插入 *nlines* 行。 下面的 *nlines* 行将丢失。 对于 *nlines* 为负值的情况,则从光标下方的行开始删除" +" *nlines* 行,并将其余的行向上移动。 下面的 *nlines* 行会被清空。 当前光标位置将保持不变。" + +#: ../../library/curses.rst:1098 +msgid "" +"Insert a blank line under the cursor. All following lines are moved down by " +"one line." +msgstr "在光标下方插入一个空行。 所有后续的行都会下移一行。" + +#: ../../library/curses.rst:1105 +msgid "" +"Insert a character string (as many characters as will fit on the line) " +"before the character under the cursor, up to *n* characters. If *n* is " +"zero or negative, the entire string is inserted. All characters to the right" +" of the cursor are shifted right, with the rightmost characters on the line " +"being lost. The cursor position does not change (after moving to *y*, *x*, " +"if specified)." +msgstr "" +"在光标下方的字符之前插入一个至多为 *n* 个字符的字符串(字符数量将与该行相匹配)。 如果 *n* 为零或负数,则插入整个字符串。 " +"光标右边的所有字符将被右移,该行右端的字符将丢失。 光标位置将保持不变(在移到可能指定的 *y*, *x* 之后)。" + +#: ../../library/curses.rst:1115 +msgid "" +"Insert a character string (as many characters as will fit on the line) " +"before the character under the cursor. All characters to the right of the " +"cursor are shifted right, with the rightmost characters on the line being " +"lost. The cursor position does not change (after moving to *y*, *x*, if " +"specified)." +msgstr "" +"在光标下方的字符之前插入一个字符串(字符数量将与该行相匹配)。 光标右边的所有字符将被右移,该行右端的字符将丢失。 光标位置将保持不变(在移到可能指定的" +" *y*, *x* 之后)。" + +#: ../../library/curses.rst:1124 +msgid "" +"Return a bytes object of characters, extracted from the window starting at " +"the current cursor position, or at *y*, *x* if specified, and stopping at " +"the end of the line. Attributes and color information are stripped from the " +"characters. If *n* is specified, :meth:`instr` returns a string at most *n*" +" characters long (exclusive of the trailing NUL). The maximum value for *n* " +"is 2047." +msgstr "" + +#: ../../library/curses.rst:1137 +msgid "" +"Return ``True`` if the specified line was modified since the last call to " +":meth:`refresh`; otherwise return ``False``. Raise a :exc:`curses.error` " +"exception if *line* is not valid for the given window." +msgstr "" +"如果指定的行自上次调用 :meth:`refresh` 后发生了改变则返回 ``True``;否则返回 ``False``。 如果 *line* " +"对于给定的窗口不可用则会引发 :exc:`curses.error` 异常。" + +#: ../../library/curses.rst:1144 +msgid "" +"Return ``True`` if the specified window was modified since the last call to " +":meth:`refresh`; otherwise return ``False``." +msgstr "如果指定的窗口自上次调用 :meth:`refresh` 后发生了改变则返回 ``True``;否则返回 ``False``。" + +#: ../../library/curses.rst:1150 +msgid "" +"If *flag* is ``True``, escape sequences generated by some keys (keypad, " +"function keys) will be interpreted by :mod:`!curses`. If *flag* is " +"``False``, escape sequences will be left as is in the input stream." +msgstr "" + +#: ../../library/curses.rst:1157 +msgid "" +"If *flag* is ``True``, cursor is left where it is on update, instead of " +"being at \"cursor position.\" This reduces cursor movement where possible." +msgstr "" + +#: ../../library/curses.rst:1160 +msgid "" +"If *flag* is ``False``, cursor will always be at \"cursor position\" after " +"an update." +msgstr "如果 *flag* 为 ``False``,光标在更新后将总是位于“光标位置”。" + +#: ../../library/curses.rst:1165 +msgid "Move cursor to ``(new_y, new_x)``." +msgstr "将光标移至 ``(new_y, new_x)``。" + +#: ../../library/curses.rst:1170 +msgid "" +"Move the window inside its parent window. The screen-relative parameters of" +" the window are not changed. This routine is used to display different " +"parts of the parent window at the same physical position on the screen." +msgstr "让窗口在其父窗口内移动。 窗口相对于屏幕的参数不会被更改。 此例程用于在屏幕的相同物理位置显示父窗口的不同部分。" + +#: ../../library/curses.rst:1177 +msgid "Move the window so its upper-left corner is at ``(new_y, new_x)``." +msgstr "移动窗口以使其左上角位于 ``(new_y, new_x)``。" + +#: ../../library/curses.rst:1179 +msgid "" +"Moving the window so that any part of it would be off the screen is an " +"error: the window is not moved and :exc:`curses.error` is raised." +msgstr "" + +#: ../../library/curses.rst:1185 +msgid "If *flag* is ``True``, :meth:`getch` will be non-blocking." +msgstr "如果 *flag* 为 ``True``,则 :meth:`getch` 将为非阻塞的。" + +#: ../../library/curses.rst:1190 +msgid "If *flag* is ``True``, escape sequences will not be timed out." +msgstr "如果 *flag* 为 ``True``,则转义序列将不会发生超时。" + +#: ../../library/curses.rst:1192 +msgid "" +"If *flag* is ``False``, after a few milliseconds, an escape sequence will " +"not be interpreted, and will be left in the input stream as is." +msgstr "如果 *flag* 为 ``False``,则在几毫秒之后,转义序列将不会被解析,并将保持在输入流中的原样。" + +#: ../../library/curses.rst:1199 +msgid "" +"Mark for refresh but wait. This function updates the data structure " +"representing the desired state of the window, but does not force an update " +"of the physical screen. To accomplish that, call :func:`doupdate`." +msgstr "" +"标记为刷新但保持等待。 此函数会更新代表预期窗口状态的数据结构,但并不强制更新物理屏幕。 要完成后者,请调用 :func:`doupdate`。" + +#: ../../library/curses.rst:1203 +msgid "" +"The 6 arguments can only be specified, and are then required, when the " +"window is a pad created with :func:`newpad`; they have the same meaning as " +"for :meth:`refresh`." +msgstr "" + +#: ../../library/curses.rst:1210 +msgid "" +"Overlay the window on top of *destwin*. The windows need not be the same " +"size, only the overlapping region is copied. This copy is non-destructive, " +"which means that the current background character does not overwrite the old" +" contents of *destwin*." +msgstr "" +"将窗口覆盖在 *destwin* 上方。 窗口的大小不必相同,只有重叠的区域会被复制。 此复制是非破坏性的,这意味着当前背景字符不会覆盖掉 " +"*destwin* 的旧内容。" + +#: ../../library/curses.rst:1215 +msgid "" +"To get fine-grained control over the copied region, the second form of " +":meth:`overlay` can be used. *sminrow* and *smincol* are the upper-left " +"coordinates of the source window, and the other variables mark a rectangle " +"in the destination window." +msgstr "" +"为了获得对被复制区域的细粒度控制,可以使用 :meth:`overlay` 的第二种形式。 *sminrow* 和 *smincol* " +"是源窗口的左上角坐标,而其他变量则在目标窗口中标记出一个矩形。" + +#: ../../library/curses.rst:1223 +msgid "" +"Overwrite the window on top of *destwin*. The windows need not be the same " +"size, in which case only the overlapping region is copied. This copy is " +"destructive, which means that the current background character overwrites " +"the old contents of *destwin*." +msgstr "" +"将窗口覆盖在 *destwin* 上方。 窗口的大小不必相同,此时只有重叠的区域会被复制。 此复制是破坏性的,这意味着当前背景字符会覆盖掉 " +"*destwin* 的旧内容。" + +#: ../../library/curses.rst:1228 +msgid "" +"To get fine-grained control over the copied region, the second form of " +":meth:`overwrite` can be used. *sminrow* and *smincol* are the upper-left " +"coordinates of the source window, the other variables mark a rectangle in " +"the destination window." +msgstr "" +"为了获得对被复制区域的细粒度控制,可以使用 :meth:`overwrite` 的第二种形式。 *sminrow* 和 *smincol* " +"是源窗口的左上角坐标,而其他变量则在目标窗口中标记出一个矩形。" + +#: ../../library/curses.rst:1236 +msgid "" +"Write all data associated with the window into the provided file object. " +"This information can be later retrieved using the :func:`getwin` function." +msgstr "将关联到窗口的所有数据写入到所提供的文件对象。 此信息可在以后使用 :func:`getwin` 函数来提取。" + +#: ../../library/curses.rst:1242 +msgid "" +"Indicate that the *num* screen lines, starting at line *beg*, are corrupted " +"and should be completely redrawn on the next :meth:`refresh` call." +msgstr "指明从 *beg* 行开始的 *num* 个屏幕行已被破坏并且应当在下次 :meth:`refresh` 调用时完全重绘。" + +#: ../../library/curses.rst:1248 +msgid "" +"Touch the entire window, causing it to be completely redrawn on the next " +":meth:`refresh` call." +msgstr "触碰整个窗口,以使其在下次 :meth:`refresh` 调用时完全重绘。" + +#: ../../library/curses.rst:1254 +msgid "" +"Update the display immediately (sync actual screen with previous " +"drawing/deleting methods)." +msgstr "立即更新显示(将实际屏幕与之前的绘制/删除方法进行同步)。" + +#: ../../library/curses.rst:1257 +msgid "" +"The 6 arguments can only be specified, and are then required, when the " +"window is a pad created with :func:`newpad`. The additional parameters are " +"needed to indicate what part of the pad and screen are involved. *pminrow* " +"and *pmincol* specify the upper-left corner of the rectangle to be displayed" +" in the pad. *sminrow*, *smincol*, *smaxrow*, and *smaxcol* specify the " +"edges of the rectangle to be displayed on the screen. The lower-right " +"corner of the rectangle to be displayed in the pad is calculated from the " +"screen coordinates, since the rectangles must be the same size. Both " +"rectangles must be entirely contained within their respective structures. " +"Negative values of *pminrow*, *pmincol*, *sminrow*, or *smincol* are treated" +" as if they were zero." +msgstr "" + +#: ../../library/curses.rst:1271 +msgid "" +"Reallocate storage for a curses window to adjust its dimensions to the " +"specified values. If either dimension is larger than the current values, " +"the window's data is filled with blanks that have the current background " +"rendition (as set by :meth:`bkgdset`) merged into them." +msgstr "" +"为 curses 窗口重新分配存储空间以将其尺寸调整为指定的值。 如果任一维度的尺寸大于当前值,则窗口的数据将以具有合并了当前背景渲染(由 " +":meth:`bkgdset` 设置)的空白来填充。" + +#: ../../library/curses.rst:1279 +msgid "" +"Scroll the screen or scrolling region. Scroll upward by *lines* lines if " +"*lines* is positive, or downward if it is negative. Scrolling has no effect" +" unless it has been enabled for the window with :meth:`scrollok`." +msgstr "" + +#: ../../library/curses.rst:1286 +msgid "" +"Control what happens when the cursor of a window is moved off the edge of " +"the window or scrolling region, either as a result of a newline action on " +"the bottom line, or typing the last character of the last line. If *flag* " +"is ``False``, the cursor is left on the bottom line. If *flag* is ``True``," +" the window is scrolled up one line. Note that in order to get the physical" +" scrolling effect on the terminal, it is also necessary to call " +":meth:`idlok`." +msgstr "" +"控制当一个窗口的光标移出窗口或滚动区域边缘时会发生什么,这可能是在底端行执行换行操作,或者在最后一行输入最后一个字符导致的结果。 如果 *flag* 为" +" ``False``,光标会留在底端行。 如果 *flag* 为 ``True``,窗口会向上滚动一行。 " +"请注意为了在终端上获得实际的滚动效果,还需要调用 :meth:`idlok`。" + +#: ../../library/curses.rst:1296 +msgid "" +"Set the scrolling region from line *top* to line *bottom*. All scrolling " +"actions will take place in this region." +msgstr "设置从 *top* 行至 *bottom* 行的滚动区域。 所有滚动操作将在此区域中进行。" + +#: ../../library/curses.rst:1302 +msgid "" +"Turn off the standout attribute. On some terminals this has the side effect" +" of turning off all attributes." +msgstr "关闭 standout 属性。 在某些终端上此操作会有关闭所有属性的副作用。" + +#: ../../library/curses.rst:1308 +msgid "Turn on attribute *A_STANDOUT*." +msgstr "启用属性 *A_STANDOUT*。" + +#: ../../library/curses.rst:1314 +msgid "" +"Return a sub-pad, whose upper-left corner is at ``(begin_y, begin_x)``, and " +"whose width/height is *ncols*/*nlines*. The coordinates are relative to the" +" parent pad (unlike :meth:`subwin`, which uses screen coordinates). This " +"method is only available for pads created with :func:`newpad`." +msgstr "" + +#: ../../library/curses.rst:1323 +msgid "" +"Return a sub-window, whose upper-left corner is at the screen-relative " +"coordinates ``(begin_y, begin_x)``, and whose width/height is " +"*ncols*/*nlines*." +msgstr "" + +#: ../../library/curses.rst:1326 +msgid "" +"By default, the sub-window will extend from the specified position to the " +"lower right corner of the window." +msgstr "默认情况下,子窗口将从指定位置扩展到窗口的右下角。" + +#: ../../library/curses.rst:1332 +msgid "" +"Touch each location in the window that has been touched in any of its " +"ancestor windows. This routine is called by :meth:`refresh`, so it should " +"almost never be necessary to call it manually." +msgstr "触碰已在上级窗口上被触碰的每个位置。 此例程由 :meth:`refresh` 调用,因此几乎从不需要手动调用。" + +#: ../../library/curses.rst:1339 +msgid "" +"If *flag* is ``True``, then :meth:`syncup` is called automatically whenever " +"there is a change in the window." +msgstr "如果 *flag* 为 ``True``,则 :meth:`syncup` 会在窗口发生改变的任何时候自动被调用。" + +#: ../../library/curses.rst:1345 +msgid "" +"Touch all locations in ancestors of the window that have been changed in " +"the window." +msgstr "触碰已在窗口中被改变的此窗口的各个上级窗口中的所有位置。" + +#: ../../library/curses.rst:1351 +msgid "" +"Set blocking or non-blocking read behavior for the window. If *delay* is " +"negative, blocking read is used (which will wait indefinitely for input). " +"If *delay* is zero, then non-blocking read is used, and :meth:`getch` will " +"return ``-1`` if no input is waiting. If *delay* is positive, then " +":meth:`getch` will block for *delay* milliseconds, and return ``-1`` if " +"there is still no input at the end of that time." +msgstr "" +"为窗口设置阻塞或非阻塞读取行为。 如果 *delay* 为负值,则会使用阻塞读取(这将无限期地等待输入)。 如果 *delay* " +"为零,则会使用非阻塞读取,并且当没有输入在等待时 :meth:`getch` 将返回 ``-1``。 如果 *delay* 为正值,则 " +":meth:`getch` 将阻塞 *delay* 毫秒,并且当此延时结束时仍无输入将返回 ``-1``。" + +#: ../../library/curses.rst:1361 +msgid "" +"Pretend *count* lines have been changed, starting with line *start*. If " +"*changed* is supplied, it specifies whether the affected lines are marked as" +" having been changed (*changed*\\ ``=True``) or unchanged (*changed*\\ " +"``=False``)." +msgstr "" +"假定从行 *start* 开始的 *count* 行已被更改。 如果提供了 *changed*,它将指明是将受影响的行标记为已更改 " +"(*changed*\\ ``=True``) 还是未更改 (*changed*\\ ``=False``)。" + +#: ../../library/curses.rst:1368 +msgid "" +"Pretend the whole window has been changed, for purposes of drawing " +"optimizations." +msgstr "假定整个窗口已被更改,其目的是用于绘制优化。" + +#: ../../library/curses.rst:1374 +msgid "" +"Mark all lines in the window as unchanged since the last call to " +":meth:`refresh`." +msgstr "将自上次调用 :meth:`refresh` 以来窗口中的所有行标记为未改变。" + +#: ../../library/curses.rst:1381 +msgid "" +"Display a vertical line starting at ``(y, x)`` with length *n* consisting of" +" the character *ch* with attributes *attr*." +msgstr "显示一行起始于 ``(y, x)`` 长度为 *n* 的由具有属性 *attr* 的字符 *ch* 组成的垂直线。" + +#: ../../library/curses.rst:1386 +msgid "Constants" +msgstr "常量" + +#: ../../library/curses.rst:1388 +msgid "The :mod:`!curses` module defines the following data members:" +msgstr "" + +#: ../../library/curses.rst:1393 +msgid "" +"Some curses routines that return an integer, such as " +":meth:`~window.getch`, return :const:`ERR` upon failure." +msgstr "一些返回整数的 curses 例程,例如 :meth:`~window.getch`,在失败时将返回 :const:`ERR`。" + +#: ../../library/curses.rst:1399 +msgid "" +"Some curses routines that return an integer, such as :func:`napms`, " +"return :const:`OK` upon success." +msgstr "一些返回整数的 curses 例程,例如 :func:`napms`,在成功时将返回 :const:`OK`。" + +#: ../../library/curses.rst:1405 +msgid "A bytes object representing the current version of the module." +msgstr "一个代表模块当前版本的字节串对象。" + +#: ../../library/curses.rst:1410 +msgid "" +"A named tuple containing the three components of the ncurses library " +"version: *major*, *minor*, and *patch*. All values are integers. The " +"components can also be accessed by name, so ``curses.ncurses_version[0]`` " +"is equivalent to ``curses.ncurses_version.major`` and so on." +msgstr "" +"一个具名元组,它包含构成 ncurses 库版本号的三个数字: *major*, *minor* 和 *patch*。 三个值均为整数。 " +"三个值也可通过名称来访问,因此 ``curses.ncurses_version[0]`` 等价于 " +"``curses.ncurses_version.major``,依此类推。" + +#: ../../library/curses.rst:1415 +msgid "Availability: if the ncurses library is used." +msgstr "可用性:如果使用了 ncurses 库。" + +#: ../../library/curses.rst:1421 +msgid "" +"The maximum number of colors the terminal can support. It is defined only " +"after the call to :func:`start_color`." +msgstr "终端可支持的最大颜色数。 它只有在调用 :func:`start_color` 之后才会被定义。" + +#: ../../library/curses.rst:1426 +msgid "" +"The maximum number of color pairs the terminal can support. It is defined " +"only after the call to :func:`start_color`." +msgstr "终端可支持的最大颜色对数。 它只有在调用 :func:`start_color` 之后才会被定义。" + +#: ../../library/curses.rst:1431 +msgid "" +"The width of the screen, that is, the number of columns. It is defined only " +"after the call to :func:`initscr`. Updated by :func:`update_lines_cols`, " +":func:`resizeterm` and :func:`resize_term`." +msgstr "" + +#: ../../library/curses.rst:1438 +msgid "" +"The height of the screen, that is, the number of lines. It is defined only " +"after the call to :func:`initscr`. Updated by :func:`update_lines_cols`, " +":func:`resizeterm` and :func:`resize_term`." +msgstr "" + +#: ../../library/curses.rst:1444 +msgid "" +"Some constants are available to specify character cell attributes. The exact" +" constants available are system dependent." +msgstr "有些常量可用于指定字符单元属性。 实际可用的常量取决于具体的系统。" + +#: ../../library/curses.rst:1448 +msgid "Attribute" +msgstr "属性" + +#: ../../library/curses.rst:1448 ../../library/curses.rst:1493 +#: ../../library/curses.rst:1739 ../../library/curses.rst:1831 +msgid "Meaning" +msgstr "含意" + +#: ../../library/curses.rst:1450 +msgid "Alternate character set mode" +msgstr "备用字符集模式" + +#: ../../library/curses.rst:1452 +msgid "Blink mode" +msgstr "闪烁模式" + +#: ../../library/curses.rst:1454 +msgid "Bold mode" +msgstr "粗体模式" + +#: ../../library/curses.rst:1456 +msgid "Dim mode" +msgstr "暗淡模式" + +#: ../../library/curses.rst:1458 +msgid "Invisible or blank mode" +msgstr "不可见或空白模式" + +#: ../../library/curses.rst:1460 +msgid "Italic mode" +msgstr "斜体模式" + +#: ../../library/curses.rst:1462 +msgid "Normal attribute" +msgstr "正常属性" + +#: ../../library/curses.rst:1464 +msgid "Protected mode" +msgstr "保护模式" + +#: ../../library/curses.rst:1466 +msgid "Reverse background and foreground colors" +msgstr "反转背景色和前景色" + +#: ../../library/curses.rst:1469 +msgid "Standout mode" +msgstr "突出模式" + +#: ../../library/curses.rst:1471 +msgid "Underline mode" +msgstr "下划线模式" + +#: ../../library/curses.rst:1473 +msgid "Horizontal highlight" +msgstr "水平突出显示" + +#: ../../library/curses.rst:1475 +msgid "Left highlight" +msgstr "左高亮" + +#: ../../library/curses.rst:1477 +msgid "Low highlight" +msgstr "底部高亮" + +#: ../../library/curses.rst:1479 +msgid "Right highlight" +msgstr "右高亮" + +#: ../../library/curses.rst:1481 +msgid "Top highlight" +msgstr "顶部高亮" + +#: ../../library/curses.rst:1483 +msgid "Vertical highlight" +msgstr "垂直突出显示" + +#: ../../library/curses.rst:1486 +msgid "``A_ITALIC`` was added." +msgstr "新增 ``A_ITALIC``。" + +#: ../../library/curses.rst:1489 +msgid "" +"Several constants are available to extract corresponding attributes returned" +" by some methods." +msgstr "有几个常量可用于提取某些方法返回的相应属性。" + +#: ../../library/curses.rst:1493 +msgid "Bit-mask" +msgstr "位掩码" + +#: ../../library/curses.rst:1495 +msgid "Bit-mask to extract attributes" +msgstr "用于提取属性的位掩码" + +#: ../../library/curses.rst:1498 +msgid "Bit-mask to extract a character" +msgstr "用于提取字符的位掩码" + +#: ../../library/curses.rst:1501 +msgid "Bit-mask to extract color-pair field information" +msgstr "用于提取颜色对字段信息的位掩码" + +#: ../../library/curses.rst:1505 +msgid "" +"Keys are referred to by integer constants with names starting with " +"``KEY_``. The exact keycaps available are system dependent." +msgstr "键由名称以 ``KEY_`` 开头的整数常量引用。确切的可用键取决于系统。" + +#: ../../library/curses.rst:1511 +msgid "Key constant" +msgstr "键常量" + +#: ../../library/curses.rst:1511 +msgid "Key" +msgstr "键" + +#: ../../library/curses.rst:1513 +msgid "Minimum key value" +msgstr "最小键值" + +#: ../../library/curses.rst:1515 +msgid "Break key (unreliable)" +msgstr "中断键(不可靠)" + +#: ../../library/curses.rst:1517 +msgid "Down-arrow" +msgstr "向下箭头" + +#: ../../library/curses.rst:1519 +msgid "Up-arrow" +msgstr "向上箭头" + +#: ../../library/curses.rst:1521 +msgid "Left-arrow" +msgstr "向左箭头" + +#: ../../library/curses.rst:1523 +msgid "Right-arrow" +msgstr "向右箭头" + +#: ../../library/curses.rst:1525 +msgid "Home key (upward+left arrow)" +msgstr "Home 键 (上+左箭头)" + +#: ../../library/curses.rst:1527 +msgid "Backspace (unreliable)" +msgstr "退格(不可靠)" + +#: ../../library/curses.rst:1529 +msgid "Function keys. Up to 64 function keys are supported." +msgstr "功能键。 支持至多 64 个功能键。" + +#: ../../library/curses.rst:1532 +msgid "Value of function key *n*" +msgstr "功能键 *n* 的值" + +#: ../../library/curses.rst:1534 +msgid "Delete line" +msgstr "删除行" + +#: ../../library/curses.rst:1536 +msgid "Insert line" +msgstr "插入行" + +#: ../../library/curses.rst:1538 +msgid "Delete character" +msgstr "删除字符" + +#: ../../library/curses.rst:1540 +msgid "Insert char or enter insert mode" +msgstr "插入字符或进入插入模式" + +#: ../../library/curses.rst:1542 +msgid "Exit insert char mode" +msgstr "退出插入字符模式" + +#: ../../library/curses.rst:1544 +msgid "Clear screen" +msgstr "清空屏幕" + +#: ../../library/curses.rst:1546 +msgid "Clear to end of screen" +msgstr "清空至屏幕底部" + +#: ../../library/curses.rst:1548 +msgid "Clear to end of line" +msgstr "清空至行尾" + +#: ../../library/curses.rst:1550 +msgid "Scroll 1 line forward" +msgstr "向前滚动 1 行" + +#: ../../library/curses.rst:1552 +msgid "Scroll 1 line backward (reverse)" +msgstr "向后滚动 1 行 (反转)" + +#: ../../library/curses.rst:1554 +msgid "Next page" +msgstr "下一页" + +#: ../../library/curses.rst:1556 +msgid "Previous page" +msgstr "上一页" + +#: ../../library/curses.rst:1558 +msgid "Set tab" +msgstr "设置制表符" + +#: ../../library/curses.rst:1560 +msgid "Clear tab" +msgstr "清除制表符" + +#: ../../library/curses.rst:1562 +msgid "Clear all tabs" +msgstr "清除所有制表符" + +#: ../../library/curses.rst:1564 +msgid "Enter or send (unreliable)" +msgstr "回车或发送 (不可靠)" + +#: ../../library/curses.rst:1566 +msgid "Soft (partial) reset (unreliable)" +msgstr "软 (部分) 重置 (不可靠)" + +#: ../../library/curses.rst:1568 +msgid "Reset or hard reset (unreliable)" +msgstr "重置或硬重置 (不可靠)" + +#: ../../library/curses.rst:1570 +msgid "Print" +msgstr "打印" + +#: ../../library/curses.rst:1572 +msgid "Home down or bottom (lower left)" +msgstr "Home 向下或到底 (左下)" + +#: ../../library/curses.rst:1574 +msgid "Upper left of keypad" +msgstr "键盘的左上角" + +#: ../../library/curses.rst:1576 +msgid "Upper right of keypad" +msgstr "键盘的右上角" + +#: ../../library/curses.rst:1578 +msgid "Center of keypad" +msgstr "键盘的中心" + +#: ../../library/curses.rst:1580 +msgid "Lower left of keypad" +msgstr "键盘左下方" + +#: ../../library/curses.rst:1582 +msgid "Lower right of keypad" +msgstr "键盘右下方" + +#: ../../library/curses.rst:1584 +msgid "Back tab" +msgstr "回退制表符" + +#: ../../library/curses.rst:1586 +msgid "Beg (beginning)" +msgstr "Beg (开始)" + +#: ../../library/curses.rst:1588 +msgid "Cancel" +msgstr "取消" + +#: ../../library/curses.rst:1590 +msgid "Close" +msgstr "关闭" + +#: ../../library/curses.rst:1592 +msgid "Cmd (command)" +msgstr "Cmd (命令行)" + +#: ../../library/curses.rst:1594 +msgid "Copy" +msgstr "复制" + +#: ../../library/curses.rst:1596 +msgid "Create" +msgstr "创建" + +#: ../../library/curses.rst:1598 +msgid "End" +msgstr "End" + +#: ../../library/curses.rst:1600 +msgid "Exit" +msgstr "退出" + +#: ../../library/curses.rst:1602 +msgid "Find" +msgstr "查找" + +#: ../../library/curses.rst:1604 +msgid "Help" +msgstr "帮助" + +#: ../../library/curses.rst:1606 +msgid "Mark" +msgstr "标记" + +#: ../../library/curses.rst:1608 +msgid "Message" +msgstr "消息" + +#: ../../library/curses.rst:1610 +msgid "Move" +msgstr "移动" + +#: ../../library/curses.rst:1612 +msgid "Next" +msgstr "下一个" + +#: ../../library/curses.rst:1614 +msgid "Open" +msgstr "打开" + +#: ../../library/curses.rst:1616 +msgid "Options" +msgstr "选项" + +#: ../../library/curses.rst:1618 +msgid "Prev (previous)" +msgstr "Prev (上一个)" + +#: ../../library/curses.rst:1620 +msgid "Redo" +msgstr "重做" + +#: ../../library/curses.rst:1622 +msgid "Ref (reference)" +msgstr "Ref (引用)" + +#: ../../library/curses.rst:1624 +msgid "Refresh" +msgstr "刷新" + +#: ../../library/curses.rst:1626 +msgid "Replace" +msgstr "替换" + +#: ../../library/curses.rst:1628 +msgid "Restart" +msgstr "重启" + +#: ../../library/curses.rst:1630 +msgid "Resume" +msgstr "恢复" + +#: ../../library/curses.rst:1632 +msgid "Save" +msgstr "保存" + +#: ../../library/curses.rst:1634 +msgid "Shifted Beg (beginning)" +msgstr "Shift + Beg (开始)" + +#: ../../library/curses.rst:1636 +msgid "Shifted Cancel" +msgstr "Shift + Cancel" + +#: ../../library/curses.rst:1638 +msgid "Shifted Command" +msgstr "Shift + Command" + +#: ../../library/curses.rst:1640 +msgid "Shifted Copy" +msgstr "Shift + Copy" + +#: ../../library/curses.rst:1642 +msgid "Shifted Create" +msgstr "Shift + Create" + +#: ../../library/curses.rst:1644 +msgid "Shifted Delete char" +msgstr "Shift + 删除字符" + +#: ../../library/curses.rst:1646 +msgid "Shifted Delete line" +msgstr "Shift + 删除行" + +#: ../../library/curses.rst:1648 +msgid "Select" +msgstr "选择" + +#: ../../library/curses.rst:1650 +msgid "Shifted End" +msgstr "Shift + End" + +#: ../../library/curses.rst:1652 +msgid "Shifted Clear line" +msgstr "Shift + 清空行" + +#: ../../library/curses.rst:1654 +msgid "Shifted Exit" +msgstr "Shift + 退出" + +#: ../../library/curses.rst:1656 +msgid "Shifted Find" +msgstr "Shift + 查找" + +#: ../../library/curses.rst:1658 +msgid "Shifted Help" +msgstr "Shift + 帮助" + +#: ../../library/curses.rst:1660 +msgid "Shifted Home" +msgstr "Shift + Home" + +#: ../../library/curses.rst:1662 +msgid "Shifted Input" +msgstr "Shift + 输入" + +#: ../../library/curses.rst:1664 +msgid "Shifted Left arrow" +msgstr "Shift + 向左箭头" + +#: ../../library/curses.rst:1666 +msgid "Shifted Message" +msgstr "Shift + 消息" + +#: ../../library/curses.rst:1668 +msgid "Shifted Move" +msgstr "Shift + 移动" + +#: ../../library/curses.rst:1670 +msgid "Shifted Next" +msgstr "Shift + 下一个" + +#: ../../library/curses.rst:1672 +msgid "Shifted Options" +msgstr "Shift + 选项" + +#: ../../library/curses.rst:1674 +msgid "Shifted Prev" +msgstr "Shift + 上一个" + +#: ../../library/curses.rst:1676 +msgid "Shifted Print" +msgstr "Shift + 打印" + +#: ../../library/curses.rst:1678 +msgid "Shifted Redo" +msgstr "Shift + 重做" + +#: ../../library/curses.rst:1680 +msgid "Shifted Replace" +msgstr "Shift + 替换" + +#: ../../library/curses.rst:1682 +msgid "Shifted Right arrow" +msgstr "Shift + 向右箭头" + +#: ../../library/curses.rst:1684 +msgid "Shifted Resume" +msgstr "Shift + 恢复" + +#: ../../library/curses.rst:1686 +msgid "Shifted Save" +msgstr "Shift + 保存" + +#: ../../library/curses.rst:1688 +msgid "Shifted Suspend" +msgstr "Shift + 挂起" + +#: ../../library/curses.rst:1690 +msgid "Shifted Undo" +msgstr "Shift + 撤销" + +#: ../../library/curses.rst:1692 +msgid "Suspend" +msgstr "挂起" + +#: ../../library/curses.rst:1694 +msgid "Undo" +msgstr "撤销操作" + +#: ../../library/curses.rst:1696 +msgid "Mouse event has occurred" +msgstr "鼠标事件已发生" + +#: ../../library/curses.rst:1698 +msgid "Terminal resize event" +msgstr "终端大小改变事件" + +#: ../../library/curses.rst:1700 +msgid "Maximum key value" +msgstr "最大键值" + +#: ../../library/curses.rst:1703 +msgid "" +"On VT100s and their software emulations, such as X terminal emulators, there" +" are normally at least four function keys (:const:`KEY_F1 `, " +":const:`KEY_F2 `, :const:`KEY_F3 `, :const:`KEY_F4 " +"`) available, and the arrow keys mapped to :const:`KEY_UP`, " +":const:`KEY_DOWN`, :const:`KEY_LEFT` and :const:`KEY_RIGHT` in the obvious " +"way. If your machine has a PC keyboard, it is safe to expect arrow keys and" +" twelve function keys (older PC keyboards may have only ten function keys); " +"also, the following keypad mappings are standard:" +msgstr "" +"在 VT100s 及其软件模拟器,如 X 终端模拟器上,通常至少有四个功能键 (:const:`KEY_F1 `, " +":const:`KEY_F2 `, :const:`KEY_F3 `, :const:`KEY_F4 " +"`) 可用,并且方向键将明确地映射到 :const:`KEY_UP`, :const:`KEY_DOWN`, " +":const:`KEY_LEFT` 和 :const:`KEY_RIGHT`。 如果你的机器有一个 PC 键盘,则保证能使用方向键和十二个功能键 " +"(老式的 PC 键盘可能只有十个功能键);此外,还有以下的标准小键盘映射:" + +#: ../../library/curses.rst:1712 +msgid "Keycap" +msgstr "键帽" + +#: ../../library/curses.rst:1712 ../../library/curses.rst:1857 +#: ../../library/curses.rst:1986 +msgid "Constant" +msgstr "常量" + +#: ../../library/curses.rst:1714 +msgid ":kbd:`Insert`" +msgstr ":kbd:`Insert`" + +#: ../../library/curses.rst:1714 +msgid "KEY_IC" +msgstr "KEY_IC" + +#: ../../library/curses.rst:1716 +msgid ":kbd:`Delete`" +msgstr ":kbd:`Delete`" + +#: ../../library/curses.rst:1716 +msgid "KEY_DC" +msgstr "KEY_DC" + +#: ../../library/curses.rst:1718 +msgid ":kbd:`Home`" +msgstr ":kbd:`Home`" + +#: ../../library/curses.rst:1718 +msgid "KEY_HOME" +msgstr "KEY_HOME" + +#: ../../library/curses.rst:1720 +msgid ":kbd:`End`" +msgstr ":kbd:`End`" + +#: ../../library/curses.rst:1720 +msgid "KEY_END" +msgstr "KEY_END" + +#: ../../library/curses.rst:1722 +msgid ":kbd:`Page Up`" +msgstr ":kbd:`Page Up`" + +#: ../../library/curses.rst:1722 +msgid "KEY_PPAGE" +msgstr "KEY_PPAGE" + +#: ../../library/curses.rst:1724 +msgid ":kbd:`Page Down`" +msgstr ":kbd:`Page Down`" + +#: ../../library/curses.rst:1724 +msgid "KEY_NPAGE" +msgstr "KEY_NPAGE" + +#: ../../library/curses.rst:1729 +msgid "" +"The following table lists characters from the alternate character set. These" +" are inherited from the VT100 terminal, and will generally be available on " +"software emulations such as X terminals. When there is no graphic " +"available, curses falls back on a crude printable ASCII approximation." +msgstr "" +"下表列出了替代字符集中的字符。 这些字符继承自 VT100 终端,在 X 终端等软件模拟器上通常均为可用。 当没有可用的图形时,curses " +"会回退为粗糙的可打印 ASCII 近似符号。" + +#: ../../library/curses.rst:1736 +msgid "These are available only after :func:`initscr` has been called." +msgstr "只有在调用 :func:`initscr` 之后才能使用它们" + +#: ../../library/curses.rst:1739 +msgid "ACS code" +msgstr "ACS代码" + +#: ../../library/curses.rst:1741 +msgid "alternate name for upper-right corner" +msgstr "" + +#: ../../library/curses.rst:1743 +msgid "solid square block" +msgstr "实心方块" + +#: ../../library/curses.rst:1745 +msgid "board of squares" +msgstr "正方形" + +#: ../../library/curses.rst:1747 +msgid "alternate name for horizontal line" +msgstr "水平线的别名" + +#: ../../library/curses.rst:1749 +msgid "alternate name for upper-left corner" +msgstr "" + +#: ../../library/curses.rst:1751 +msgid "alternate name for top tee" +msgstr "顶部 T 型的别名" + +#: ../../library/curses.rst:1753 +msgid "bottom tee" +msgstr "底部 T 型" + +#: ../../library/curses.rst:1755 +msgid "bullet" +msgstr "正方形" + +#: ../../library/curses.rst:1757 +msgid "checker board (stipple)" +msgstr "棋盘(点刻)" + +#: ../../library/curses.rst:1759 +msgid "arrow pointing down" +msgstr "向下箭头" + +#: ../../library/curses.rst:1761 +msgid "degree symbol" +msgstr "度数符号" + +#: ../../library/curses.rst:1763 +msgid "diamond" +msgstr "菱形" + +#: ../../library/curses.rst:1765 +msgid "greater-than-or-equal-to" +msgstr "大于或等于" + +#: ../../library/curses.rst:1767 +msgid "horizontal line" +msgstr "水平线" + +#: ../../library/curses.rst:1769 +msgid "lantern symbol" +msgstr "灯形符号" + +#: ../../library/curses.rst:1771 +msgid "left arrow" +msgstr "向左箭头" + +#: ../../library/curses.rst:1773 +msgid "less-than-or-equal-to" +msgstr "小于或等于" + +#: ../../library/curses.rst:1775 +msgid "lower-left corner" +msgstr "" + +#: ../../library/curses.rst:1777 +msgid "lower-right corner" +msgstr "" + +#: ../../library/curses.rst:1779 +msgid "left tee" +msgstr "左侧 T 型" + +#: ../../library/curses.rst:1781 +msgid "not-equal sign" +msgstr "不等号" + +#: ../../library/curses.rst:1783 +msgid "letter pi" +msgstr "字母π" + +#: ../../library/curses.rst:1785 +msgid "plus-or-minus sign" +msgstr "正负号" + +#: ../../library/curses.rst:1787 +msgid "big plus sign" +msgstr "加号" + +#: ../../library/curses.rst:1789 +msgid "right arrow" +msgstr "向右箭头" + +#: ../../library/curses.rst:1791 +msgid "right tee" +msgstr "右侧 T 型" + +#: ../../library/curses.rst:1793 +msgid "scan line 1" +msgstr "扫描线 1" + +#: ../../library/curses.rst:1795 +msgid "scan line 3" +msgstr "扫描线3" + +#: ../../library/curses.rst:1797 +msgid "scan line 7" +msgstr "扫描线7" + +#: ../../library/curses.rst:1799 +msgid "scan line 9" +msgstr "扫描线 9" + +#: ../../library/curses.rst:1801 +msgid "alternate name for lower-right corner" +msgstr "" + +#: ../../library/curses.rst:1803 +msgid "alternate name for vertical line" +msgstr "垂直线的别名" + +#: ../../library/curses.rst:1805 +msgid "alternate name for right tee" +msgstr "右侧 T 型的别名" + +#: ../../library/curses.rst:1807 +msgid "alternate name for lower-left corner" +msgstr "" + +#: ../../library/curses.rst:1809 +msgid "alternate name for bottom tee" +msgstr "底部 T 型的别名" + +#: ../../library/curses.rst:1811 +msgid "alternate name for left tee" +msgstr "左侧 T 型的别名" + +#: ../../library/curses.rst:1813 +msgid "alternate name for crossover or big plus" +msgstr "交叉或大加号的替代名称" + +#: ../../library/curses.rst:1815 +msgid "pound sterling" +msgstr "英镑" + +#: ../../library/curses.rst:1817 +msgid "top tee" +msgstr "顶部 T 型" + +#: ../../library/curses.rst:1819 +msgid "up arrow" +msgstr "向上箭头" + +#: ../../library/curses.rst:1821 +msgid "upper-left corner" +msgstr "" + +#: ../../library/curses.rst:1823 +msgid "upper-right corner" +msgstr "" + +#: ../../library/curses.rst:1825 +msgid "vertical line" +msgstr "垂线" + +#: ../../library/curses.rst:1828 +msgid "" +"The following table lists mouse button constants used by :meth:`getmouse`:" +msgstr "下面列出了 :meth:`getmouse` 所使用的鼠标按键常量:" + +#: ../../library/curses.rst:1831 +msgid "Mouse button constant" +msgstr "鼠标按键常量" + +#: ../../library/curses.rst:1833 +msgid "Mouse button *n* pressed" +msgstr "鼠标按键 *n* 被按下" + +#: ../../library/curses.rst:1835 +msgid "Mouse button *n* released" +msgstr "鼠标按键 *n* 被释放" + +#: ../../library/curses.rst:1837 +msgid "Mouse button *n* clicked" +msgstr "鼠标按键 *n* 被点击" + +#: ../../library/curses.rst:1839 +msgid "Mouse button *n* double clicked" +msgstr "鼠标按键 *n* 被双击" + +#: ../../library/curses.rst:1841 +msgid "Mouse button *n* triple clicked" +msgstr "鼠标按键 *n* 被三击" + +#: ../../library/curses.rst:1843 +msgid "Shift was down during button state change" +msgstr "当按键状态改变时 Shift 被按下" + +#: ../../library/curses.rst:1845 +msgid "Control was down during button state change" +msgstr "当按键状态改变时 Control 被按下" + +#: ../../library/curses.rst:1847 +msgid "Alt was down during button state change" +msgstr "" + +#: ../../library/curses.rst:1854 +msgid "The following table lists the predefined colors:" +msgstr "下表列出了预定义的颜色:" + +#: ../../library/curses.rst:1857 +msgid "Color" +msgstr "颜色" + +#: ../../library/curses.rst:1859 +msgid "Black" +msgstr "黑色" + +#: ../../library/curses.rst:1861 +msgid "Blue" +msgstr "蓝色" + +#: ../../library/curses.rst:1863 +msgid "Cyan (light greenish blue)" +msgstr "青色(浅绿蓝色)" + +#: ../../library/curses.rst:1865 +msgid "Green" +msgstr "绿色" + +#: ../../library/curses.rst:1867 +msgid "Magenta (purplish red)" +msgstr "洋红色(紫红色)" + +#: ../../library/curses.rst:1869 +msgid "Red" +msgstr "红色" + +#: ../../library/curses.rst:1871 +msgid "White" +msgstr "白色" + +#: ../../library/curses.rst:1873 +msgid "Yellow" +msgstr "黄色" + +#: ../../library/curses.rst:1878 +msgid ":mod:`!curses.textpad` --- Text input widget for curses programs" +msgstr "" + +#: ../../library/curses.rst:1886 +msgid "" +"The :mod:`!curses.textpad` module provides a :class:`Textbox` class that " +"handles elementary text editing in a curses window, supporting a set of " +"keybindings resembling those of Emacs (thus, also of Netscape Navigator, " +"BBedit 6.x, FrameMaker, and many other programs). The module also provides " +"a rectangle-drawing function useful for framing text boxes or for other " +"purposes." +msgstr "" + +#: ../../library/curses.rst:1892 +msgid "The module :mod:`!curses.textpad` defines the following function:" +msgstr "" + +#: ../../library/curses.rst:1897 +msgid "" +"Draw a rectangle. The first argument must be a window object; the remaining" +" arguments are coordinates relative to that window. The second and third " +"arguments are the y and x coordinates of the upper-left corner of the " +"rectangle to be drawn; the fourth and fifth arguments are the y and x " +"coordinates of the lower-right corner. The rectangle will be drawn using " +"VT100/IBM PC forms characters on terminals that make this possible " +"(including xterm and most other software terminal emulators). Otherwise it " +"will be drawn with ASCII dashes, vertical bars, and plus signs." +msgstr "" + +#: ../../library/curses.rst:1910 +msgid "Textbox objects" +msgstr "文本框对象" + +#: ../../library/curses.rst:1912 +msgid "You can instantiate a :class:`Textbox` object as follows:" +msgstr "你可以通过如下方式实例化一个 :class:`Textbox`:" + +#: ../../library/curses.rst:1917 +msgid "" +"Return a textbox widget object. The *win* argument should be a curses " +":ref:`window ` object in which the textbox is to be " +"contained. If *insert_mode* is true, the textbox inserts typed characters, " +"shifting existing text to the right, rather than overwriting it. The edit " +"cursor of the textbox is initially located at the upper-left corner of the " +"containing window, with coordinates ``(0, 0)``. The instance's " +":attr:`stripspaces` flag is initially on." +msgstr "" + +#: ../../library/curses.rst:1925 +msgid ":class:`Textbox` objects have the following methods:" +msgstr ":class:`Textbox` 对象具有以下方法:" + +#: ../../library/curses.rst:1930 +msgid "" +"This is the entry point you will normally use. It accepts editing " +"keystrokes until one of the termination keystrokes is entered. If " +"*validate* is supplied, it must be a function. It will be called for each " +"keystroke entered with the keystroke as a parameter; command dispatch is " +"done on the result. If it returns a false value, the keystroke is ignored." +" This method returns the window contents as a string; whether blanks in the" +" window are included is affected by the :attr:`stripspaces` attribute." +msgstr "" + +#: ../../library/curses.rst:1942 +msgid "" +"Process a single command keystroke. Returns ``1`` to continue editing, or " +"``0`` if a termination keystroke was processed. Here are the supported " +"special keystrokes:" +msgstr "" + +#: ../../library/curses.rst:1947 ../../library/curses.rst:1986 +msgid "Keystroke" +msgstr "按键" + +#: ../../library/curses.rst:1947 +msgid "Action" +msgstr "动作" + +#: ../../library/curses.rst:1949 +msgid ":kbd:`Control-A`" +msgstr ":kbd:`Control-A`" + +#: ../../library/curses.rst:1949 +msgid "Go to left edge of window." +msgstr "转到窗口的左边缘。" + +#: ../../library/curses.rst:1951 ../../library/curses.rst:1988 +msgid ":kbd:`Control-B`" +msgstr ":kbd:`Control-B`" + +#: ../../library/curses.rst:1951 +msgid "Cursor left, wrapping to previous line if appropriate." +msgstr "光标向左,如果可能,包含前一行。" + +#: ../../library/curses.rst:1954 +msgid ":kbd:`Control-D`" +msgstr ":kbd:`Control-D`" + +#: ../../library/curses.rst:1954 +msgid "Delete character under cursor." +msgstr "删除光标下的字符。" + +#: ../../library/curses.rst:1956 +msgid ":kbd:`Control-E`" +msgstr ":kbd:`Control-E`" + +#: ../../library/curses.rst:1956 +msgid "Go to right edge (stripspaces off) or end of line (stripspaces on)." +msgstr "前往右边缘(stripspaces 关闭时)或者行尾(stripspaces 启用时)。" + +#: ../../library/curses.rst:1959 ../../library/curses.rst:1990 +msgid ":kbd:`Control-F`" +msgstr ":kbd:`Control-F`" + +#: ../../library/curses.rst:1959 +msgid "Cursor right, wrapping to next line when appropriate." +msgstr "向右移动光标,适当时换行到下一行。" + +#: ../../library/curses.rst:1962 +msgid ":kbd:`Control-G`" +msgstr ":kbd:`Control-G`" + +#: ../../library/curses.rst:1962 +msgid "Terminate, returning the window contents." +msgstr "终止,返回窗口内容。" + +#: ../../library/curses.rst:1964 +msgid ":kbd:`Control-H`" +msgstr ":kbd:`Control-H`" + +#: ../../library/curses.rst:1964 +msgid "Delete character backward." +msgstr "向后删除字符。" + +#: ../../library/curses.rst:1966 +msgid ":kbd:`Control-J`" +msgstr ":kbd:`Control-J`" + +#: ../../library/curses.rst:1966 +msgid "" +"Terminate if the window is 1 line, otherwise move to the start of the next " +"line." +msgstr "" + +#: ../../library/curses.rst:1970 +msgid ":kbd:`Control-K`" +msgstr ":kbd:`Control-K`" + +#: ../../library/curses.rst:1970 +msgid "If line is blank, delete it, otherwise clear to end of line." +msgstr "如果行为空,则删除它,否则清除到行尾。" + +#: ../../library/curses.rst:1973 +msgid ":kbd:`Control-L`" +msgstr ":kbd:`Control-L`" + +#: ../../library/curses.rst:1973 +msgid "Refresh screen." +msgstr "刷新屏幕。" + +#: ../../library/curses.rst:1975 ../../library/curses.rst:1994 +msgid ":kbd:`Control-N`" +msgstr ":kbd:`Control-N`" + +#: ../../library/curses.rst:1975 +msgid "Cursor down; move down one line." +msgstr "光标向下;向下移动一行。" + +#: ../../library/curses.rst:1977 +msgid ":kbd:`Control-O`" +msgstr ":kbd:`Control-O`" + +#: ../../library/curses.rst:1977 +msgid "Insert a blank line at cursor location." +msgstr "在光标位置插入一个空行。" + +#: ../../library/curses.rst:1979 ../../library/curses.rst:1992 +msgid ":kbd:`Control-P`" +msgstr ":kbd:`Control-P`" + +#: ../../library/curses.rst:1979 +msgid "Cursor up; move up one line." +msgstr "光标向上;向上移动一行。" + +#: ../../library/curses.rst:1982 +msgid "" +"Move operations do nothing if the cursor is at an edge where the movement is" +" not possible. The following synonyms are supported where possible:" +msgstr "如果光标位于无法移动的边缘,则移动操作不执行任何操作。在可能的情况下,支持以下同义词:" + +#: ../../library/curses.rst:1988 +msgid ":const:`~curses.KEY_LEFT`" +msgstr ":const:`~curses.KEY_LEFT`" + +#: ../../library/curses.rst:1990 +msgid ":const:`~curses.KEY_RIGHT`" +msgstr ":const:`~curses.KEY_RIGHT`" + +#: ../../library/curses.rst:1992 +msgid ":const:`~curses.KEY_UP`" +msgstr ":const:`~curses.KEY_UP`" + +#: ../../library/curses.rst:1994 +msgid ":const:`~curses.KEY_DOWN`" +msgstr ":const:`~curses.KEY_DOWN`" + +#: ../../library/curses.rst:1996 +msgid ":const:`~curses.KEY_BACKSPACE`" +msgstr ":const:`~curses.KEY_BACKSPACE`" + +#: ../../library/curses.rst:1996 +msgid ":kbd:`Control-h`" +msgstr ":kbd:`Control-h`" + +#: ../../library/curses.rst:1999 +msgid "" +"All other keystrokes are treated as a command to insert the given character " +"and move right (with line wrapping)." +msgstr "所有其他按键将被视为插入给定字符并右移的命令(带有自动折行)。" + +#: ../../library/curses.rst:2005 +msgid "" +"Return the window contents as a string; whether blanks in the window are " +"included is affected by the :attr:`stripspaces` member." +msgstr "以字符串形式返回窗口内容;是否包括窗口中的空白将受到 :attr:`stripspaces` 成员的影响。" + +#: ../../library/curses.rst:2011 +msgid "" +"This attribute is a flag which controls the interpretation of blanks in the " +"window. When it is on, trailing blanks on each line are ignored; any cursor" +" motion that would land the cursor on a trailing blank goes to the end of " +"that line instead, and trailing blanks are stripped when the window contents" +" are gathered." +msgstr "" +"此属性是控制窗口中空白解读方式的旗标。 " +"当启用时,每一行的末尾空白会被忽略;任何将光标定位至末尾空白的光标动作都将改为前往该行末尾,并且在收集窗口内容时将去除末尾空白。" diff --git a/library/custominterp.po b/library/custominterp.po new file mode 100644 index 0000000000..46d2da6ce3 --- /dev/null +++ b/library/custominterp.po @@ -0,0 +1,41 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/custominterp.rst:5 +msgid "Custom Python Interpreters" +msgstr "自定义 Python 解释器" + +#: ../../library/custominterp.rst:7 +msgid "" +"The modules described in this chapter allow writing interfaces similar to " +"Python's interactive interpreter. If you want a Python interpreter that " +"supports some special feature in addition to the Python language, you should" +" look at the :mod:`code` module. (The :mod:`codeop` module is lower-level, " +"used to support compiling a possibly incomplete chunk of Python code.)" +msgstr "" +"本章中描述的模块允许编写类似于 Python 的交互式解释器的接口。 如果你想要一个除 Python 语言之外还支持某些特殊功能的 Python " +"解释器,你应当看一下 :mod:`code` 模块。 (:mod:`codeop` 模块是低层级的,用于支持编译可能不完整的 Python 代码块。)" + +#: ../../library/custominterp.rst:13 +msgid "The full list of modules described in this chapter is:" +msgstr "本章描述的完整模块列表如下:" diff --git a/library/dataclasses.po b/library/dataclasses.po new file mode 100644 index 0000000000..8497d28b08 --- /dev/null +++ b/library/dataclasses.po @@ -0,0 +1,1621 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-06-11 18:32+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/dataclasses.rst:2 +msgid ":mod:`!dataclasses` --- Data Classes" +msgstr ":mod:`!dataclasses` --- 数据类" + +#: ../../library/dataclasses.rst:10 +msgid "**Source code:** :source:`Lib/dataclasses.py`" +msgstr "**源码:** :source:`Lib/dataclasses.py`" + +#: ../../library/dataclasses.rst:14 +msgid "" +"This module provides a decorator and functions for automatically adding " +"generated :term:`special methods ` such as " +":meth:`~object.__init__` and :meth:`~object.__repr__` to user-defined " +"classes. It was originally described in :pep:`557`." +msgstr "" +"这个模块提供了一个装饰器和一些函数,用于自动为用户自定义的类添加生成的 :term:`特殊方法 ` 例如 " +":meth:`~object.__init__` 和 :meth:`~object.__repr__`。 它的初始描述见 :pep:`557`。" + +#: ../../library/dataclasses.rst:19 +msgid "" +"The member variables to use in these generated methods are defined using " +":pep:`526` type annotations. For example, this code::" +msgstr "在这些生成的方法中使用的成员变量是使用 :pep:`526` 类型标注来定义的。例如以下代码:" + +#: ../../library/dataclasses.rst:22 +msgid "" +"from dataclasses import dataclass\n" +"\n" +"@dataclass\n" +"class InventoryItem:\n" +" \"\"\"Class for keeping track of an item in inventory.\"\"\"\n" +" name: str\n" +" unit_price: float\n" +" quantity_on_hand: int = 0\n" +"\n" +" def total_cost(self) -> float:\n" +" return self.unit_price * self.quantity_on_hand" +msgstr "" +"from dataclasses import dataclass\n" +"\n" +"@dataclass\n" +"class InventoryItem:\n" +" \"\"\"Class for keeping track of an item in inventory.\"\"\"\n" +" name: str\n" +" unit_price: float\n" +" quantity_on_hand: int = 0\n" +"\n" +" def total_cost(self) -> float:\n" +" return self.unit_price * self.quantity_on_hand" + +#: ../../library/dataclasses.rst:34 +msgid "will add, among other things, a :meth:`!__init__` that looks like::" +msgstr "将添加多项内容,包括如下所示的 :meth:`!__init__`::" + +#: ../../library/dataclasses.rst:36 +msgid "" +"def __init__(self, name: str, unit_price: float, quantity_on_hand: int = 0):\n" +" self.name = name\n" +" self.unit_price = unit_price\n" +" self.quantity_on_hand = quantity_on_hand" +msgstr "" +"def __init__(self, name: str, unit_price: float, quantity_on_hand: int = 0):\n" +" self.name = name\n" +" self.unit_price = unit_price\n" +" self.quantity_on_hand = quantity_on_hand" + +#: ../../library/dataclasses.rst:41 +msgid "" +"Note that this method is automatically added to the class: it is not " +"directly specified in the :class:`!InventoryItem` definition shown above." +msgstr "请注意此方法会自动添加到类中:它不是在如上所示的 :class:`!InventoryItem` 定义中直接指定的。" + +#: ../../library/dataclasses.rst:47 +msgid "Module contents" +msgstr "模块内容" + +#: ../../library/dataclasses.rst:51 +msgid "" +"This function is a :term:`decorator` that is used to add generated " +":term:`special methods ` to classes, as described below." +msgstr "" +"此函数是一个 :term:`decorator`,它被用于将生成的 :term:`特殊方法 ` 添加到类中,如下所述。" + +#: ../../library/dataclasses.rst:54 +msgid "" +"The ``@dataclass`` decorator examines the class to find ``field``\\s. A " +"``field`` is defined as a class variable that has a :term:`type annotation " +"`. With two exceptions described below, nothing in " +"``@dataclass`` examines the type specified in the variable annotation." +msgstr "" +"``@dataclass`` 装饰器会检查类以找到其中的 ``field``。 ``field`` 被定义为具有 :term:`类型标注 " +"` 的类变量。 除了下面所述的两个例外,在 ``@dataclass`` " +"中没有任何东西会去检查变量标注中指定的类型。" + +#: ../../library/dataclasses.rst:60 +msgid "" +"The order of the fields in all of the generated methods is the order in " +"which they appear in the class definition." +msgstr "这些字段在所有生成的方法中的顺序,都是它们在类定义中出现的顺序。" + +#: ../../library/dataclasses.rst:63 +msgid "" +"The ``@dataclass`` decorator will add various \"dunder\" methods to the " +"class, described below. If any of the added methods already exist in the " +"class, the behavior depends on the parameter, as documented below. The " +"decorator returns the same class that it is called on; no new class is " +"created." +msgstr "" +"``@dataclass`` 装饰器将把各种“双下线”方法添加到类,具体如下所述。 " +"如果所添加的任何方法在类中已存在,其行为将取决于形参的值,具体如下所述。 该装饰器将返回执行其调用的类而不会创建新类。" + +#: ../../library/dataclasses.rst:69 +msgid "" +"If ``@dataclass`` is used just as a simple decorator with no parameters, it " +"acts as if it has the default values documented in this signature. That is," +" these three uses of ``@dataclass`` are equivalent::" +msgstr "" +"如果 ``@dataclass`` 仅被用作不带形参的简单装饰器,其行为相当于使用在此签名中记录的默认值。 也就是说,这三种 " +"``@dataclass`` 的用法是等价的::" + +#: ../../library/dataclasses.rst:74 +msgid "" +"@dataclass\n" +"class C:\n" +" ...\n" +"\n" +"@dataclass()\n" +"class C:\n" +" ...\n" +"\n" +"@dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False,\n" +" match_args=True, kw_only=False, slots=False, weakref_slot=False)\n" +"class C:\n" +" ..." +msgstr "" +"@dataclass\n" +"class C:\n" +" ...\n" +"\n" +"@dataclass()\n" +"class C:\n" +" ...\n" +"\n" +"@dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False,\n" +" match_args=True, kw_only=False, slots=False, weakref_slot=False)\n" +"class C:\n" +" ..." + +#: ../../library/dataclasses.rst:87 +msgid "The parameters to ``@dataclass`` are:" +msgstr "``@dataclass`` 的形参有:" + +#: ../../library/dataclasses.rst:89 +msgid "" +"*init*: If true (the default), a :meth:`~object.__init__` method will be " +"generated." +msgstr "*init*: 如为真值(默认),将生成 :meth:`~object.__init__` 方法。" + +#: ../../library/dataclasses.rst:92 +msgid "" +"If the class already defines :meth:`!__init__`, this parameter is ignored." +msgstr "如果类已经定义了 :meth:`!__init__`,此形参将被忽略。" + +#: ../../library/dataclasses.rst:95 +msgid "" +"*repr*: If true (the default), a :meth:`~object.__repr__` method will be " +"generated. The generated repr string will have the class name and the name " +"and repr of each field, in the order they are defined in the class. Fields " +"that are marked as being excluded from the repr are not included. For " +"example: ``InventoryItem(name='widget', unit_price=3.0, " +"quantity_on_hand=10)``." +msgstr "" +"*repr*: 如为真值(默认),将生成 :meth:`~object.__repr__` 方法。 生成的 repr 字符串将带有类名及每个字段的名称和" +" repr,并按它们在类中定义的顺序排列。 不包括被标记为从 repr 排除的字段。 例如: " +"``InventoryItem(name='widget', unit_price=3.0, quantity_on_hand=10)``。" + +#: ../../library/dataclasses.rst:102 +msgid "" +"If the class already defines :meth:`!__repr__`, this parameter is ignored." +msgstr "如果类已经定义了 :meth:`!__repr__`,此形参将被忽略。" + +#: ../../library/dataclasses.rst:105 +msgid "" +"*eq*: If true (the default), an :meth:`~object.__eq__` method will be " +"generated." +msgstr "" + +#: ../../library/dataclasses.rst:108 +msgid "" +"This method compares the class by comparing each field in order. Both " +"instances in the comparison must be of the identical type." +msgstr "" + +#: ../../library/dataclasses.rst:111 +msgid "" +"If the class already defines :meth:`!__eq__`, this parameter is ignored." +msgstr "如果类已经定义了 :meth:`!__eq__`,此形参将被忽略。" + +#: ../../library/dataclasses.rst:113 +msgid "" +"The generated ``__eq__`` method now compares each field individually (for " +"example, ``self.a == other.a and self.b == other.b``), rather than comparing" +" tuples of fields as in previous versions." +msgstr "" + +#: ../../library/dataclasses.rst:118 +msgid "" +"This change makes the comparison faster but it may alter results in cases " +"where attributes compare equal by identity but not by value (such as " +"``float('nan')``)." +msgstr "" + +#: ../../library/dataclasses.rst:122 +msgid "" +"In Python 3.12 and earlier, the comparison was performed by creating tuples " +"of the fields and comparing them (for example, ``(self.a, self.b) == " +"(other.a, other.b)``)." +msgstr "" + +#: ../../library/dataclasses.rst:126 +msgid "" +"*order*: If true (the default is ``False``), :meth:`~object.__lt__`, " +":meth:`~object.__le__`, :meth:`~object.__gt__`, and :meth:`~object.__ge__` " +"methods will be generated. These compare the class as if it were a tuple of" +" its fields, in order. Both instances in the comparison must be of the " +"identical type. If *order* is true and *eq* is false, a :exc:`ValueError` " +"is raised." +msgstr "" +"*order*: 如为真值 (默认为 ``False``),将生成 :meth:`~object.__lt__`, " +":meth:`~object.__le__`, :meth:`~object.__gt__` 和 :meth:`~object.__ge__` 方法。 " +"这些方法将把类当作由其字段组成的元组那样按顺序进行比较。 要比较的两个实例必须是相同的类型。 如果 *order* 为真值且 *eq* 为假值,则会引发" +" :exc:`ValueError`。" + +#: ../../library/dataclasses.rst:133 +msgid "" +"If the class already defines any of :meth:`!__lt__`, :meth:`!__le__`, " +":meth:`!__gt__`, or :meth:`!__ge__`, then :exc:`TypeError` is raised." +msgstr "" +"如果类已经定义了 :meth:`!__lt__`, :meth:`!__le__`, :meth:`!__gt__` 或者 " +":meth:`!__ge__` 中的任意一个,将引发 :exc:`TypeError`。" + +#: ../../library/dataclasses.rst:137 +msgid "" +"*unsafe_hash*: If true, force ``dataclasses`` to create a " +":meth:`~object.__hash__` method, even though it may not be safe to do so. " +"Otherwise, generate a :meth:`~object.__hash__` method according to how *eq* " +"and *frozen* are set. The default value is ``False``." +msgstr "" +"*unsafe_hash*: 如为真值,则强制 ``dataclasses`` 创建 :meth:`~object.__hash__` " +"方法,即使这样做可能是不安全的。 在其他情况下,将根据 *eq* 和 *frozen* 的设置方式来生成 " +":meth:`~object.__hash__` 方法。 默认值为 ``False``。" + +#: ../../library/dataclasses.rst:143 +msgid "" +":meth:`!__hash__` is used by built-in :meth:`hash`, and when objects are " +"added to hashed collections such as dictionaries and sets. Having a " +":meth:`!__hash__` implies that instances of the class are immutable. " +"Mutability is a complicated property that depends on the programmer's " +"intent, the existence and behavior of :meth:`!__eq__`, and the values of the" +" *eq* and *frozen* flags in the ``@dataclass`` decorator." +msgstr "" +":meth:`!__hash__` 会在对象被添加到哈希多项集如字典和集合时由内置的 :meth:`hash` 使用。 具有 " +":meth:`!__hash__` 就意味着类的实例是不可变的。 可变性是一个依赖于程序员的实际意图、:meth:`!__eq__` " +"是否存在及其具体行为,以及 ``@dataclass`` 装饰器中 *eq* 和 *frozen* 旗标的值的复杂特征属性。" + +#: ../../library/dataclasses.rst:150 +msgid "" +"By default, ``@dataclass`` will not implicitly add a " +":meth:`~object.__hash__` method unless it is safe to do so. Neither will it" +" add or change an existing explicitly defined :meth:`!__hash__` method. " +"Setting the class attribute ``__hash__ = None`` has a specific meaning to " +"Python, as described in the :meth:`!__hash__` documentation." +msgstr "" +"在默认情况下,``@dataclass`` 不会隐式地添加 :meth:`~object.__hash__` 方法,除非这样做是安全的。 " +"它也不会添加或更改现有的显式定义的 :meth:`!__hash__` 方法。 设置类属性 ``__hash__ = None`` 对 Python " +"具有特定含义,如 :meth:`!__hash__` 文档中所述。" + +#: ../../library/dataclasses.rst:156 +msgid "" +"If :meth:`!__hash__` is not explicitly defined, or if it is set to ``None``," +" then ``@dataclass`` *may* add an implicit :meth:`!__hash__` method. " +"Although not recommended, you can force ``@dataclass`` to create a " +":meth:`!__hash__` method with ``unsafe_hash=True``. This might be the case " +"if your class is logically immutable but can still be mutated. This is a " +"specialized use case and should be considered carefully." +msgstr "" +"如果 :meth:`!__hash__` 没有被显式定义,或者它被设为 ``None``,则 ``@dataclass`` *可能* 会添加一个隐式 " +":meth:`!__hash__` 方法。 虽然并不推荐,但你可以用 ``unsafe_hash=True`` 来强制让 ``@dataclass`` " +"创建一个 :meth:`!__hash__` 方法。 如果你的类在逻辑上不可变但却仍然可被修改那么可能就是这种情况。 " +"这是一个特殊用例并且应当被小心地处理。" + +#: ../../library/dataclasses.rst:163 +msgid "" +"Here are the rules governing implicit creation of a :meth:`!__hash__` " +"method. Note that you cannot both have an explicit :meth:`!__hash__` method" +" in your dataclass and set ``unsafe_hash=True``; this will result in a " +":exc:`TypeError`." +msgstr "" +"以下是针对隐式创建 :meth:`!__hash__` 方法的规则。 请注意你的数据类中不能既有显式的 :meth:`!__hash__` 方法又设置 " +"``unsafe_hash=True``;这将导致 :exc:`TypeError`。" + +#: ../../library/dataclasses.rst:168 +msgid "" +"If *eq* and *frozen* are both true, by default ``@dataclass`` will generate " +"a :meth:`!__hash__` method for you. If *eq* is true and *frozen* is false, " +":meth:`!__hash__` will be set to ``None``, marking it unhashable (which it " +"is, since it is mutable). If *eq* is false, :meth:`!__hash__` will be left " +"untouched meaning the :meth:`!__hash__` method of the superclass will be " +"used (if the superclass is :class:`object`, this means it will fall back to " +"id-based hashing)." +msgstr "" +"如果 *eq* 和 *frozen* 均为真值,则默认 ``@dataclass`` 将为你生成 :meth:`!__hash__` 方法。 如果 " +"*eq* 为真值而 *frozen* 为假值,则 :meth:`!__hash__` 将被设为 " +"``None``,即将其标记为不可哈希(因为它属于可变对象)。 如果 *eq* 为假值,则 :meth:`!__hash__` " +"将保持不变,这意味着将使用超类的 :meth:`!__hash__` 方法(如果超类是 :class:`object`,这意味着它将回退为基于 id " +"的哈希)。" + +#: ../../library/dataclasses.rst:176 +msgid "" +"*frozen*: If true (the default is ``False``), assigning to fields will " +"generate an exception. This emulates read-only frozen instances. See the " +":ref:`discussion ` below." +msgstr "" +"*frozen*: 如为真值 (默认为 ``False``),则对字段赋值将引发异常。 这模拟了只读的冻结实例。 详见下方的 :ref:`讨论 " +"`。" + +#: ../../library/dataclasses.rst:180 +msgid "" +"If :meth:`~object.__setattr__` or :meth:`~object.__delattr__` is defined in " +"the class and *frozen* is true, then :exc:`TypeError` is raised." +msgstr "" +"如果类中定义了 :meth:`~object.__setattr__` 或 :meth:`~object.__delattr__` 方法,并且 " +"*frozen* 参数为 True,则会引发 :exc:`TypeError` 异常。" + +#: ../../library/dataclasses.rst:183 +msgid "" +"*match_args*: If true (the default is ``True``), the " +":attr:`~object.__match_args__` tuple will be created from the list of non " +"keyword-only parameters to the generated :meth:`~object.__init__` method " +"(even if :meth:`!__init__` is not generated, see above). If false, or if " +":attr:`!__match_args__` is already defined in the class, then " +":attr:`!__match_args__` will not be generated." +msgstr "" +"*match_args*: 如为真值 (默认为 ``True``),则将根据传给生成的 :meth:`~object.__init__` " +"方法的非关键字形参列表来创建 :attr:`~object.__match_args__` 元组(即使没有生成 " +":meth:`!__init__`,见上文)。 如为假值,或者如果 :attr:`!__match_args__` 已在类中定义,则不会生成 " +":attr:`!__match_args__`。" + +#: ../../library/dataclasses.rst:192 +msgid "" +"*kw_only*: If true (the default value is ``False``), then all fields will be" +" marked as keyword-only. If a field is marked as keyword-only, then the " +"only effect is that the :meth:`~object.__init__` parameter generated from a " +"keyword-only field must be specified with a keyword when :meth:`!__init__` " +"is called. See the :term:`parameter` glossary entry for details. Also see " +"the :const:`KW_ONLY` section." +msgstr "" +"*kw_only*: 如为真值 (默认值为 ``False``),则所有字段都将被标记为仅限关键字的。 " +"如果一个字段被标记为仅限关键字的,则唯一的影响是由仅限关键字的字段生成的 :meth:`~object.__init__` 形参在 " +":meth:`!__init__` 被调用时必须以关键字形式来指定。 详情参见 :term:`parameter` 术语表条目。 另请参阅 " +":const:`KW_ONLY` 一节。" + +#: ../../library/dataclasses.rst:200 +msgid "Keyword-only fields are not included in :attr:`!__match_args__`." +msgstr "仅限关键字字段不会被包括在 :attr:`!__match_args__` 中。" + +#: ../../library/dataclasses.rst:204 +msgid "" +"*slots*: If true (the default is ``False``), :attr:`~object.__slots__` " +"attribute will be generated and new class will be returned instead of the " +"original one. If :attr:`!__slots__` is already defined in the class, then " +":exc:`TypeError` is raised." +msgstr "" +"*slots*: 如为真值 (默认为 ``False``),则将生成 :attr:`~object.__slots__` " +"属性并返回一个新类而非原本的类。 如果 :attr:`!__slots__` 已在类中定义,则会引发 :exc:`TypeError`。" + +#: ../../library/dataclasses.rst:210 +msgid "" +"Passing parameters to a base class :meth:`~object.__init_subclass__` when " +"using ``slots=True`` will result in a :exc:`TypeError`. Either use " +"``__init_subclass__`` with no parameters or use default values as a " +"workaround. See :gh:`91126` for full details." +msgstr "" +"在使用 ``slots=True`` 时向基类 :meth:`~object.__init_subclass__` 传入形参将导致 " +":exc:`TypeError`。 应使用不带参数的 ``__init_subclass__`` 或使用默认值的绕过方式。 请参阅 " +":gh:`91126` 了解完整细节。" + +#: ../../library/dataclasses.rst:218 +msgid "" +"If a field name is already included in the :attr:`!__slots__` of a base " +"class, it will not be included in the generated :attr:`!__slots__` to " +"prevent :ref:`overriding them `. Therefore, do not use" +" :attr:`!__slots__` to retrieve the field names of a dataclass. Use " +":func:`fields` instead. To be able to determine inherited slots, base class " +":attr:`!__slots__` may be any iterable, but *not* an iterator." +msgstr "" +"如果某个字段名称已经包括在基类的 :attr:`!__slots__` 中,它将不会被包括在生成的 :attr:`!__slots__` 中以防止 " +":ref:`重写它们 `。 因此,请不要使用 :attr:`!__slots__` 来获取数据类的字段名称。" +" 而应改用 :func:`fields`。 为了能够确定所继承的槽位,基类 :attr:`!__slots__` 可以是任意可迭代对象,但是 *不可以*" +" 是迭代器。" + +#: ../../library/dataclasses.rst:228 +msgid "" +"*weakref_slot*: If true (the default is ``False``), add a slot named " +"\"__weakref__\", which is required to make an instance :func:`weakref-able " +"`. It is an error to specify ``weakref_slot=True`` without also" +" specifying ``slots=True``." +msgstr "" +"*weakref_slot*: 如为真值 (默认为 ``False``),则添加一个名为 \"__weakref__\" 的槽位,这是使得一个实例 " +":func:`可以弱引用 ` 所必需的。 指定 ``weakref_slot=True`` 而不同时指定 " +"``slots=True`` 将会导致错误。" + +#: ../../library/dataclasses.rst:236 +msgid "" +"``field``\\s may optionally specify a default value, using normal Python " +"syntax::" +msgstr "可以用普通的 Python 语法为各个 ``field`` 指定默认值:" + +#: ../../library/dataclasses.rst:239 +msgid "" +"@dataclass\n" +"class C:\n" +" a: int # 'a' has no default value\n" +" b: int = 0 # assign a default value for 'b'" +msgstr "" +"@dataclass\n" +"class C:\n" +" a: int # 'a' 没有默认值\n" +" b: int = 0 # 为 'b' 赋默认值" + +#: ../../library/dataclasses.rst:244 +msgid "" +"In this example, both :attr:`!a` and :attr:`!b` will be included in the " +"added :meth:`~object.__init__` method, which will be defined as::" +msgstr "" +"在这个例子中,:attr:`!a` 和 :attr:`!b` 都将被包括在所添加的 :meth:`~object.__init__` " +"方法中,该方法将被定义为::" + +#: ../../library/dataclasses.rst:247 +msgid "def __init__(self, a: int, b: int = 0):" +msgstr "def __init__(self, a: int, b: int = 0):" + +#: ../../library/dataclasses.rst:249 +msgid "" +":exc:`TypeError` will be raised if a field without a default value follows a" +" field with a default value. This is true whether this occurs in a single " +"class, or as a result of class inheritance." +msgstr "" +"如果在具有默认值的字段之后存在没有默认值的字段,将会引发 :exc:`TypeError`。无论此情况是发生在单个类中还是作为类继承的结果,都是如此。" + +#: ../../library/dataclasses.rst:255 +msgid "" +"For common and simple use cases, no other functionality is required. There " +"are, however, some dataclass features that require additional per-field " +"information. To satisfy this need for additional information, you can " +"replace the default field value with a call to the provided :func:`!field` " +"function. For example::" +msgstr "" +"对于常见和简单的用例,不需要其他的功能。 但是,有些数据类的特性需要额外的每字段信息。 为了满足这种对额外信息的需求,你可以通过调用所提供的 " +":func:`!field` 函数来替换默认的字段值。 例如::" + +#: ../../library/dataclasses.rst:261 +msgid "" +"@dataclass\n" +"class C:\n" +" mylist: list[int] = field(default_factory=list)\n" +"\n" +"c = C()\n" +"c.mylist += [1, 2, 3]" +msgstr "" +"@dataclass\n" +"class C:\n" +" mylist: list[int] = field(default_factory=list)\n" +"\n" +"c = C()\n" +"c.mylist += [1, 2, 3]" + +#: ../../library/dataclasses.rst:268 +msgid "" +"As shown above, the :const:`MISSING` value is a sentinel object used to " +"detect if some parameters are provided by the user. This sentinel is used " +"because ``None`` is a valid value for some parameters with a distinct " +"meaning. No code should directly use the :const:`MISSING` value." +msgstr "" +"如上所示,:const:`MISSING` 值是一个哨兵对象,用于检测一些形参是否由用户提供。使用它是因为 ``None`` " +"对于一些形参来说是有效的用户值。任何代码都不应该直接使用 :const:`MISSING` 值。" + +#: ../../library/dataclasses.rst:273 +msgid "The parameters to :func:`!field` are:" +msgstr "传给 :func:`!field` 的形参有:" + +#: ../../library/dataclasses.rst:275 +msgid "" +"*default*: If provided, this will be the default value for this field. This" +" is needed because the :func:`!field` call itself replaces the normal " +"position of the default value." +msgstr "" +"*default*: 如果提供,这将为该字段的默认值。 设置此形参是因为 :func:`!field` 调用本身会替换通常的默认值所在位置。" + +#: ../../library/dataclasses.rst:279 +msgid "" +"*default_factory*: If provided, it must be a zero-argument callable that " +"will be called when a default value is needed for this field. Among other " +"purposes, this can be used to specify fields with mutable default values, as" +" discussed below. It is an error to specify both *default* and " +"*default_factory*." +msgstr "" +"*default_factory*: 如果提供,它必须是一个零参数的可调用对象,它将在该字段需要一个默认值时被调用。 " +"在其他目的以外,它还可被用于指定具有可变默认值的字段,如下所述。 同时指定 *default* 和 *default_factory* 将会导致错误。" + +#: ../../library/dataclasses.rst:285 +msgid "" +"*init*: If true (the default), this field is included as a parameter to the " +"generated :meth:`~object.__init__` method." +msgstr "*init*: 如为真值(默认),则该字段将作为一个形参被包括在生成的 :meth:`~object.__init__` 方法中。" + +#: ../../library/dataclasses.rst:288 +msgid "" +"*repr*: If true (the default), this field is included in the string returned" +" by the generated :meth:`~object.__repr__` method." +msgstr "*repr*: 如为真值(默认值),则该字段将被包括在生成的 :meth:`~object.__repr__` 方法所返回的字符串中。" + +#: ../../library/dataclasses.rst:291 +msgid "" +"*hash*: This can be a bool or ``None``. If true, this field is included in " +"the generated :meth:`~object.__hash__` method. If false, this field is " +"excluded from the generated :meth:`~object.__hash__`. If ``None`` (the " +"default), use the value of *compare*: this would normally be the expected " +"behavior, since a field should be included in the hash if it's used for " +"comparisons. Setting this value to anything other than ``None`` is " +"discouraged." +msgstr "" +"*hash*: 这可以是一个布尔值或 ``None``。 如为真值,则此字段将被包括在所生成的 :meth:`~object.__hash__` " +"方法中。 如为假值,则此字段将被排除在所生成的 :meth:`~object.__hash__` 之外。 如为 ``None`` (默认值),则使用 " +"*compare* 的值:这通常是预期的行为,因为一个字段如果被用于比较那么就应当被包括在哈希运算中。 不建议将该值设为 ``None`` " +"以外的任何值。" + +#: ../../library/dataclasses.rst:299 +msgid "" +"One possible reason to set ``hash=False`` but ``compare=True`` would be if a" +" field is expensive to compute a hash value for, that field is needed for " +"equality testing, and there are other fields that contribute to the type's " +"hash value. Even if a field is excluded from the hash, it will still be " +"used for comparisons." +msgstr "" +"设置 ``hash=False`` 但 ``compare=True`` " +"的一个合理情况是,一个计算哈希值的代价很高的字段是检验等价性需要的,且还有其他字段可以用于计算类型的哈希值。可以从哈希值中排除该字段,但仍令它用于比较。" + +#: ../../library/dataclasses.rst:305 +msgid "" +"*compare*: If true (the default), this field is included in the generated " +"equality and comparison methods (:meth:`~object.__eq__`, " +":meth:`~object.__gt__`, et al.)." +msgstr "" +"*compare*: 如为真值(默认),则该字段将被包括在生成的相等和比较方法中 (:meth:`~object.__eq__`, " +":meth:`~object.__gt__` 等等)。" + +#: ../../library/dataclasses.rst:309 +msgid "" +"*metadata*: This can be a mapping or ``None``. ``None`` is treated as an " +"empty dict. This value is wrapped in :func:`~types.MappingProxyType` to " +"make it read-only, and exposed on the :class:`Field` object. It is not used " +"at all by Data Classes, and is provided as a third-party extension " +"mechanism. Multiple third-parties can each have their own key, to use as a " +"namespace in the metadata." +msgstr "" +"*metadata*: 这可以是一个映射或为 ``None``。 ``None`` 将被当作空字典来处理。 这个值将被包装在 " +":func:`~types.MappingProxyType` 以便其为只读,并暴露在 :class:`Field` 对象上。 " +"它完全不被数据类所使用,并且是作为第三方扩展机制提供的。 多个第三方可以各自拥有其本身的键,以用作元数据的命名空间。" + +#: ../../library/dataclasses.rst:317 +msgid "" +"*kw_only*: If true, this field will be marked as keyword-only. This is used " +"when the generated :meth:`~object.__init__` method's parameters are " +"computed." +msgstr "" +"*kw_only*: 如为真值,则该字段将被标记为仅限关键字的。 这将在计算所生成的 :meth:`~object.__init__` " +"方法的形参时被使用。" + +#: ../../library/dataclasses.rst:321 +msgid "Keyword-only fields are also not included in :attr:`!__match_args__`." +msgstr "仅限关键字字段也不会被包括在 :attr:`!__match_args__` 中。" + +#: ../../library/dataclasses.rst:325 +msgid "*doc*: optional docstring for this field." +msgstr "*doc*: 针对该字段的可选的文档字符串。" + +#: ../../library/dataclasses.rst:329 +msgid "" +"If the default value of a field is specified by a call to :func:`!field`, " +"then the class attribute for this field will be replaced by the specified " +"*default* value. If *default* is not provided, then the class attribute " +"will be deleted. The intent is that after the :deco:`dataclass` decorator " +"runs, the class attributes will all contain the default values for the " +"fields, just as if the default value itself were specified. For example, " +"after::" +msgstr "" +"如果一个字段的默认值是通过调用 :func:`!field` 来指定的,那么该字段对应的类属性将被替换为指定的 *default* 值。 如果没有提供 " +"*default*,那么该类属性将被删除。 其目的是在 :deco:`dataclass` " +"装饰器运行之后,这些类属性全都将包含字段默认值,就像直接指定了默认值本身一样。例如,在执行以下代码之后::" + +#: ../../library/dataclasses.rst:338 +msgid "" +"@dataclass\n" +"class C:\n" +" x: int\n" +" y: int = field(repr=False)\n" +" z: int = field(repr=False, default=10)\n" +" t: int = 20" +msgstr "" +"@dataclass\n" +"class C:\n" +" x: int\n" +" y: int = field(repr=False)\n" +" z: int = field(repr=False, default=10)\n" +" t: int = 20" + +#: ../../library/dataclasses.rst:345 +msgid "" +"The class attribute :attr:`!C.z` will be ``10``, the class attribute " +":attr:`!C.t` will be ``20``, and the class attributes :attr:`!C.x` and " +":attr:`!C.y` will not be set." +msgstr "" +"类属性 :attr:`!C.z` 将为 ``10``,类属性 :attr:`!C.t` 将为 ``20``,类属性 :attr:`!C.x` 和 " +":attr:`!C.y` 将不被设置。" + +#: ../../library/dataclasses.rst:351 +msgid "" +":class:`!Field` objects describe each defined field. These objects are " +"created internally, and are returned by the :func:`fields` module-level " +"method (see below). Users should never instantiate a :class:`!Field` object" +" directly. Its documented attributes are:" +msgstr "" +":class:`!Field` 对象描述每个已定义的字段。 这些对象是在内部创建的,并会由 :func:`fields` 模块级方法返回(见下文)。 " +"用户绝不应直接实例化 :class:`!Field` 对象。 已写入文档的属性如下:" + +#: ../../library/dataclasses.rst:356 +msgid ":attr:`!name`: The name of the field." +msgstr ":attr:`!name`: 字段的名称。" + +#: ../../library/dataclasses.rst:357 +msgid ":attr:`!type`: The type of the field." +msgstr ":attr:`!type`: 字段的类型。" + +#: ../../library/dataclasses.rst:358 +msgid "" +":attr:`!default`, :attr:`!default_factory`, :attr:`!init`, :attr:`!repr`, " +":attr:`!hash`, :attr:`!compare`, :attr:`!metadata`, and :attr:`!kw_only` " +"have the identical meaning and values as they do in the :func:`field` " +"function." +msgstr "" +":attr:`!default`, :attr:`!default_factory`, :attr:`!init`, :attr:`!repr`, " +":attr:`!hash`, :attr:`!compare`, :attr:`!metadata` 和 :attr:`!kw_only` 具有与 " +":func:`field` 函数中对应参数相同的含义和值。" + +#: ../../library/dataclasses.rst:362 +msgid "" +"Other attributes may exist, but they are private and must not be inspected " +"or relied on." +msgstr "可能存在其他属性,但它们是私有的。用户不应检查或依赖于这些属性。" + +#: ../../library/dataclasses.rst:367 +msgid "" +"``InitVar[T]`` type annotations describe variables that are :ref:`init-only " +"`. Fields annotated with :class:`!InitVar` " +"are considered pseudo-fields, and thus are neither returned by the " +":func:`fields` function nor used in any way except adding them as parameters" +" to :meth:`~object.__init__` and an optional :meth:`__post_init__`." +msgstr "" +"``InitVar[T]`` 类型标注用于描述 :ref:`仅限初始化 ` 变量。 " +"使用 :class:`!InitVar` 标注的字段将被视作伪字段,因此既不会被 :func:`fields` 函数返回也不会在除了作为传给 " +":meth:`~object.__init__` 的和可选的 :meth:`__post_init__` 的形参添加之外以任何方式被使用。" + +#: ../../library/dataclasses.rst:376 +msgid "" +"Returns a tuple of :class:`Field` objects that define the fields for this " +"dataclass. Accepts either a dataclass, or an instance of a dataclass. " +"Raises :exc:`TypeError` if not passed a dataclass or instance of one. Does " +"not return pseudo-fields which are ``ClassVar`` or ``InitVar``." +msgstr "" +"返回一个能描述此数据类所包含的字段的元组,元组的每一项都是 :class:`Field` " +"对象。接受数据类或数据类的实例。如果没有传递一个数据类或实例将引发 :exc:`TypeError`。不返回 ``ClassVar`` 或 " +"``InitVar`` 等伪字段。" + +#: ../../library/dataclasses.rst:383 +msgid "" +"Converts the dataclass *obj* to a dict (by using the factory function " +"*dict_factory*). Each dataclass is converted to a dict of its fields, as " +"``name: value`` pairs. dataclasses, dicts, lists, and tuples are recursed " +"into. Other objects are copied with :func:`copy.deepcopy`." +msgstr "" +"将数据类 *obj* 转换为一个字典 (使用工厂函数 *dict_factory*)。 每个数据类会被转换为以 ``name: value`` " +"键值对来存储其字段的字典。 数据类、字典、列表和元组会被递归地处理。 其他对象会通过 :func:`copy.deepcopy` 来拷贝。" + +#: ../../library/dataclasses.rst:389 +msgid "Example of using :func:`!asdict` on nested dataclasses::" +msgstr "在嵌套的数据类上使用 :func:`!asdict` 的例子::" + +#: ../../library/dataclasses.rst:391 +msgid "" +"@dataclass\n" +"class Point:\n" +" x: int\n" +" y: int\n" +"\n" +"@dataclass\n" +"class C:\n" +" mylist: list[Point]\n" +"\n" +"p = Point(10, 20)\n" +"assert asdict(p) == {'x': 10, 'y': 20}\n" +"\n" +"c = C([Point(0, 0), Point(10, 4)])\n" +"assert asdict(c) == {'mylist': [{'x': 0, 'y': 0}, {'x': 10, 'y': 4}]}" +msgstr "" +"@dataclass\n" +"class Point:\n" +" x: int\n" +" y: int\n" +"\n" +"@dataclass\n" +"class C:\n" +" mylist: list[Point]\n" +"\n" +"p = Point(10, 20)\n" +"assert asdict(p) == {'x': 10, 'y': 20}\n" +"\n" +"c = C([Point(0, 0), Point(10, 4)])\n" +"assert asdict(c) == {'mylist': [{'x': 0, 'y': 0}, {'x': 10, 'y': 4}]}" + +#: ../../library/dataclasses.rst:406 ../../library/dataclasses.rst:426 +msgid "To create a shallow copy, the following workaround may be used::" +msgstr "要创建一个浅拷贝,可以使用以下的变通方法:" + +#: ../../library/dataclasses.rst:408 +msgid "{field.name: getattr(obj, field.name) for field in fields(obj)}" +msgstr "{field.name: getattr(obj, field.name) for field in fields(obj)}" + +#: ../../library/dataclasses.rst:410 +msgid "" +":func:`!asdict` raises :exc:`TypeError` if *obj* is not a dataclass " +"instance." +msgstr "如果 *obj* 不是一个数据类实例则 :func:`!asdict` 将引发 :exc:`TypeError` 。" + +#: ../../library/dataclasses.rst:415 +msgid "" +"Converts the dataclass *obj* to a tuple (by using the factory function " +"*tuple_factory*). Each dataclass is converted to a tuple of its field " +"values. dataclasses, dicts, lists, and tuples are recursed into. Other " +"objects are copied with :func:`copy.deepcopy`." +msgstr "" +"将数据类 *obj* 转换为元组 (使用工厂函数 *tuple_factory*)。 每个数据类将被转换为由其字段值组成的元组。 " +"数据类、字典、列表和元组会被递归地处理。 其他对象会通过 :func:`copy.deepcopy` 来拷贝。" + +#: ../../library/dataclasses.rst:421 +msgid "Continuing from the previous example::" +msgstr "继续前一个例子:" + +#: ../../library/dataclasses.rst:423 +msgid "" +"assert astuple(p) == (10, 20)\n" +"assert astuple(c) == ([(0, 0), (10, 4)],)" +msgstr "" +"assert astuple(p) == (10, 20)\n" +"assert astuple(c) == ([(0, 0), (10, 4)],)" + +#: ../../library/dataclasses.rst:428 +msgid "tuple(getattr(obj, field.name) for field in dataclasses.fields(obj))" +msgstr "tuple(getattr(obj, field.name) for field in dataclasses.fields(obj))" + +#: ../../library/dataclasses.rst:430 +msgid "" +":func:`!astuple` raises :exc:`TypeError` if *obj* is not a dataclass " +"instance." +msgstr "如果 *obj* 不是一个数据类实例则 :func:`!astuple` 将引发 :exc:`TypeError`。" + +#: ../../library/dataclasses.rst:435 +msgid "" +"Creates a new dataclass with name *cls_name*, fields as defined in *fields*," +" base classes as given in *bases*, and initialized with a namespace as given" +" in *namespace*. *fields* is an iterable whose elements are each either " +"``name``, ``(name, type)``, or ``(name, type, Field)``. If just ``name`` is" +" supplied, :data:`typing.Any` is used for ``type``. The values of *init*, " +"*repr*, *eq*, *order*, *unsafe_hash*, *frozen*, *match_args*, *kw_only*, " +"*slots*, and *weakref_slot* have the same meaning as they do in " +":deco:`dataclass`." +msgstr "" +"新建一个名为 *cls_name* 的数据类,其字段在 *fields* 中定义,其基类在 *bases* 中给出,并使用在 *namespace* " +"中给定的命名空间来初始化。 *fields* 是一个可迭代对象,其中每个元素均为 ``name``, ``(name, type)`` 或 " +"``(name, type, Field)`` 的形式。 如果只提供了 ``name``,则使用 :data:`typing.Any` 作为 " +"``type``。 *init*, *repr*, *eq*, *order*, *unsafe_hash*, *frozen*, " +"*match_args*, *kw_only*, *slots* 和 *weakref_slot* 等值与其在 :deco:`dataclass` " +"中具有相同的含义。" + +#: ../../library/dataclasses.rst:445 +msgid "" +"If *module* is defined, the :attr:`!__module__` attribute of the dataclass " +"is set to that value. By default, it is set to the module name of the " +"caller." +msgstr "" +"如果定义了 *module*,则该数据类的 :attr:`!__module__` 属性将被设为该值。 在默认情况下,它将被设为调用方的模块名。" + +#: ../../library/dataclasses.rst:449 +msgid "" +"The *decorator* parameter is a callable that will be used to create the " +"dataclass. It should take the class object as a first argument and the same " +"keyword arguments as :deco:`dataclass`. By default, the :deco:`dataclass` " +"function is used." +msgstr "" +"*decorator* 形参是将被用于创建数据类的可调用对象。 它应当接受该类对象作为第一个参数以及与 :deco:`dataclass` " +"相同的关键字参数。 在默认情况下,将会使用 :deco:`dataclass` 函数。" + +#: ../../library/dataclasses.rst:454 +msgid "" +"This function is not strictly required, because any Python mechanism for " +"creating a new class with :attr:`~object.__annotations__` can then apply the" +" :deco:`dataclass` function to convert that class to a dataclass. This " +"function is provided as a convenience. For example::" +msgstr "" +"此函数不是严格必需的,因为任何用于创建带有 :attr:`~object.__annotations__` 的新类的 Python 机制都可以在稍后应用" +" :deco:`dataclass` 函数将类转换为数据类。 提供此函数是为了更方便。 例如::" + +#: ../../library/dataclasses.rst:460 +msgid "" +"C = make_dataclass('C',\n" +" [('x', int),\n" +" 'y',\n" +" ('z', int, field(default=5))],\n" +" namespace={'add_one': lambda self: self.x + 1})" +msgstr "" +"C = make_dataclass('C',\n" +" [('x', int),\n" +" 'y',\n" +" ('z', int, field(default=5))],\n" +" namespace={'add_one': lambda self: self.x + 1})" + +#: ../../library/dataclasses.rst:466 +msgid "Is equivalent to::" +msgstr "等价于:" + +#: ../../library/dataclasses.rst:468 +msgid "" +"@dataclass\n" +"class C:\n" +" x: int\n" +" y: 'typing.Any'\n" +" z: int = 5\n" +"\n" +" def add_one(self):\n" +" return self.x + 1" +msgstr "" +"@dataclass\n" +"class C:\n" +" x: int\n" +" y: 'typing.Any'\n" +" z: int = 5\n" +"\n" +" def add_one(self):\n" +" return self.x + 1" + +#: ../../library/dataclasses.rst:477 +msgid "Added the *decorator* parameter." +msgstr "增加了 *decorator* 形参。" + +#: ../../library/dataclasses.rst:482 +msgid "" +"Creates a new object of the same type as *obj*, replacing fields with values" +" from *changes*. If *obj* is not a Data Class, raises :exc:`TypeError`. If" +" keys in *changes* are not field names of the given dataclass, raises " +":exc:`TypeError`." +msgstr "" +"创建一个与 *obj* 类型相同的新对象,将字段替换为 *changes* 的值。 如果 *obj* 不是数据类,则会引发 " +":exc:`TypeError`。 如果 *changes* 中的键不是给定数据类的字段名,则会引发 :exc:`TypeError`。" + +#: ../../library/dataclasses.rst:487 +msgid "" +"The newly returned object is created by calling the :meth:`~object.__init__`" +" method of the dataclass. This ensures that :meth:`__post_init__`, if " +"present, is also called." +msgstr "" +"新返回的对象是通过调用数据类的 :meth:`~object.__init__` 方法来创建的。 这确保了如果存在 " +":meth:`__post_init__`,则它也会被调用。" + +#: ../../library/dataclasses.rst:491 +msgid "" +"Init-only variables without default values, if any exist, must be specified " +"on the call to :func:`!replace` so that they can be passed to " +":meth:`!__init__` and :meth:`__post_init__`." +msgstr "" +"如果存在任何没有默认值的仅初始化变量,那么必须在调用 :func:`!replace` 时指定它们的值,以便它们可以被传递给 " +":meth:`!__init__` 和 :meth:`__post_init__`。" + +#: ../../library/dataclasses.rst:495 +msgid "" +"It is an error for *changes* to contain any fields that are defined as " +"having ``init=False``. A :exc:`ValueError` will be raised in this case." +msgstr "" +"如果 *changes* 包含任何定义为 ``init=False`` 的字段都会导致错误。 在此情况下将引发 :exc:`ValueError`。" + +#: ../../library/dataclasses.rst:499 +msgid "" +"Be forewarned about how ``init=False`` fields work during a call to " +":func:`!replace`. They are not copied from the source object, but rather " +"are initialized in :meth:`__post_init__`, if they're initialized at all. It" +" is expected that ``init=False`` fields will be rarely and judiciously used." +" If they are used, it might be wise to have alternate class constructors, " +"or perhaps a custom :func:`!replace` (or similarly named) method which " +"handles instance copying." +msgstr "" +"需要预先注意 ``init=False`` 字段在对 :func:`!replace` 的调用期间的行为。 " +"如果它们会被初始化,它们就不会从源对象拷贝,而是在 :meth:`__post_init__` 中初始化。 通常预期 ``init=False`` " +"字段将很少能被正确地使用。 如果要使用它们,那么更明智的做法是使用另外的类构造器,或者自定义的 :func:`!replace` (或类似名称) " +"方法来处理实例的拷贝。" + +#: ../../library/dataclasses.rst:508 +msgid "" +"Dataclass instances are also supported by generic function " +":func:`copy.replace`." +msgstr "数据类实例也被泛型函数 :func:`copy.replace` 所支持。" + +#: ../../library/dataclasses.rst:512 +msgid "" +"Return ``True`` if its parameter is a dataclass (including subclasses of a " +"dataclass, but not including :ref:`generic aliases `) or" +" an instance of one, otherwise return ``False``." +msgstr "" + +#: ../../library/dataclasses.rst:516 +msgid "" +"If you need to know if a class is an instance of a dataclass (and not a " +"dataclass itself), then add a further check for ``not isinstance(obj, " +"type)``::" +msgstr "" +"如果你需要知道一个类是否是一个数据类的实例(而不是一个数据类本身),那么再添加一个 ``not isinstance(obj, type)`` 检查:" + +#: ../../library/dataclasses.rst:520 +msgid "" +"def is_dataclass_instance(obj):\n" +" return is_dataclass(obj) and not isinstance(obj, type)" +msgstr "" +"def is_dataclass_instance(obj):\n" +" return is_dataclass(obj) and not isinstance(obj, type)" + +#: ../../library/dataclasses.rst:525 +msgid "A sentinel value signifying a missing default or default_factory." +msgstr "一个指明“没有提供 default 或 default_factory”的哨兵值。" + +#: ../../library/dataclasses.rst:529 +msgid "" +"A sentinel value used as a type annotation. Any fields after a pseudo-field" +" with the type of :const:`!KW_ONLY` are marked as keyword-only fields. Note" +" that a pseudo-field of type :const:`!KW_ONLY` is otherwise completely " +"ignored. This includes the name of such a field. By convention, a name of " +"``_`` is used for a :const:`!KW_ONLY` field. Keyword-only fields signify " +":meth:`~object.__init__` parameters that must be specified as keywords when " +"the class is instantiated." +msgstr "" +"一个用作类型标注的哨兵值。 任何在类型为 :const:`!KW_ONLY` 的伪字段之后的字段会被标记为仅限关键字的字段。 请注意在其他情况下 " +":const:`!KW_ONLY` 类型的伪字段会被完全忽略。 这包括此类字段的名称。 根据惯例,名称 ``_`` 会被用作 " +":const:`!KW_ONLY` 字段。 仅限关键字字段指明当类被实例化时 :meth:`~object.__init__` " +"形参必须以关键字形式来指定。" + +#: ../../library/dataclasses.rst:538 +msgid "" +"In this example, the fields ``y`` and ``z`` will be marked as keyword-only " +"fields::" +msgstr "在这个例子中,字段 ``y`` 和 ``z`` 将被标记为仅限关键字字段::" + +#: ../../library/dataclasses.rst:540 +msgid "" +"@dataclass\n" +"class Point:\n" +" x: float\n" +" _: KW_ONLY\n" +" y: float\n" +" z: float\n" +"\n" +"p = Point(0, y=1.5, z=2.0)" +msgstr "" +"@dataclass\n" +"class Point:\n" +" x: float\n" +" _: KW_ONLY\n" +" y: float\n" +" z: float\n" +"\n" +"p = Point(0, y=1.5, z=2.0)" + +#: ../../library/dataclasses.rst:549 +msgid "" +"In a single dataclass, it is an error to specify more than one field whose " +"type is :const:`!KW_ONLY`." +msgstr "在单个数据类中,指定一个以上 :const:`!KW_ONLY` 类型的字段将导致错误。" + +#: ../../library/dataclasses.rst:556 +msgid "" +"Raised when an implicitly defined :meth:`~object.__setattr__` or " +":meth:`~object.__delattr__` is called on a dataclass which was defined with " +"``frozen=True``. It is a subclass of :exc:`AttributeError`." +msgstr "" +"在定义时设置了 ``frozen=True`` 的类上调用隐式定义的 :meth:`~object.__setattr__` 或 " +":meth:`~object.__delattr__` 时引发。 这是 :exc:`AttributeError` 的一个子类。" + +#: ../../library/dataclasses.rst:563 +msgid "Post-init processing" +msgstr "初始化后处理" + +#: ../../library/dataclasses.rst:567 +msgid "" +"When defined on the class, it will be called by the generated " +":meth:`~object.__init__`, normally as :meth:`!self.__post_init__`. However, " +"if any ``InitVar`` fields are defined, they will also be passed to " +":meth:`!__post_init__` in the order they were defined in the class. If no " +":meth:`!__init__` method is generated, then :meth:`!__post_init__` will not " +"automatically be called." +msgstr "" +"当在类上定义时,它将被所生成的 :meth:`~object.__init__` 调用,通常是以 :meth:`!self.__post_init__`" +" 的形式。 但是,如果定义了任何 ``InitVar`` 字段,它们也将按照它们在类中定义的顺序被传递给 :meth:`!__post_init__`。" +" 如果没有生成 :meth:`!__init__` 方法,那么 :meth:`!__post_init__` 将不会被自动调用。" + +#: ../../library/dataclasses.rst:574 +msgid "" +"Among other uses, this allows for initializing field values that depend on " +"one or more other fields. For example::" +msgstr "在其他用途中,这允许初始化依赖于一个或多个其他字段的字段值。例如::" + +#: ../../library/dataclasses.rst:577 +msgid "" +"@dataclass\n" +"class C:\n" +" a: float\n" +" b: float\n" +" c: float = field(init=False)\n" +"\n" +" def __post_init__(self):\n" +" self.c = self.a + self.b" +msgstr "" +"@dataclass\n" +"class C:\n" +" a: float\n" +" b: float\n" +" c: float = field(init=False)\n" +"\n" +" def __post_init__(self):\n" +" self.c = self.a + self.b" + +#: ../../library/dataclasses.rst:586 +msgid "" +"The :meth:`~object.__init__` method generated by :deco:`dataclass` does not " +"call base class :meth:`!__init__` methods. If the base class has an " +":meth:`!__init__` method that has to be called, it is common to call this " +"method in a :meth:`__post_init__` method::" +msgstr "" +"由 :deco:`dataclass` 生成的 :meth:`~object.__init__` 方法不会调用基类的 :meth:`!__init__`" +" 方法。 如果基类有需要被调用的 :meth:`!__init__` 方法,通常是在 :meth:`__post_init__` 方法中调用此方法::" + +#: ../../library/dataclasses.rst:591 +msgid "" +"class Rectangle:\n" +" def __init__(self, height, width):\n" +" self.height = height\n" +" self.width = width\n" +"\n" +"@dataclass\n" +"class Square(Rectangle):\n" +" side: float\n" +"\n" +" def __post_init__(self):\n" +" super().__init__(self.side, self.side)" +msgstr "" +"class Rectangle:\n" +" def __init__(self, height, width):\n" +" self.height = height\n" +" self.width = width\n" +"\n" +"@dataclass\n" +"class Square(Rectangle):\n" +" side: float\n" +"\n" +" def __post_init__(self):\n" +" super().__init__(self.side, self.side)" + +#: ../../library/dataclasses.rst:603 +msgid "" +"Note, however, that in general the dataclass-generated :meth:`!__init__` " +"methods don't need to be called, since the derived dataclass will take care " +"of initializing all fields of any base class that is a dataclass itself." +msgstr "" +"但是,请注意一般来说数据类生成的 :meth:`!__init__` 方法不需要被调用,因为派生的数据类将负责初始化任何本身为数据类的基类的所有字段。" + +#: ../../library/dataclasses.rst:607 +msgid "" +"See the section below on init-only variables for ways to pass parameters to " +":meth:`!__post_init__`. Also see the warning about how :func:`replace` " +"handles ``init=False`` fields." +msgstr "" +"请参阅下面有关仅初始化变量的小节来了解如何将形参传递给 :meth:`!__post_init__`。 另请参阅关于 :func:`replace` " +"如何处理 ``init=False`` 字段的警告。" + +#: ../../library/dataclasses.rst:614 +msgid "Class variables" +msgstr "类变量" + +#: ../../library/dataclasses.rst:616 +msgid "" +"One of the few places where :deco:`dataclass` actually inspects the type of " +"a field is to determine if a field is a class variable as defined in " +":pep:`526`. It does this by checking if the type of the field is " +":data:`typing.ClassVar`. If a field is a ``ClassVar``, it is excluded from " +"consideration as a field and is ignored by the dataclass mechanisms. Such " +"``ClassVar`` pseudo-fields are not returned by the module-level " +":func:`fields` function." +msgstr "" +":deco:`dataclass` 会实际检查字段类型的少数几个地方是确定字段是否是在 :pep:`526` 中定义的类变量。 " +"它通过检查字段的类型是否为 :data:`typing.ClassVar` 来做到这一点。 如果一个字段是 " +"``ClassVar``,它将被排除在字段范围之外并会被数据类机制所忽略。 这样的 ``ClassVar`` 伪字段将不会被模块层级的 " +":func:`fields` 函数返回。" + +#: ../../library/dataclasses.rst:627 +msgid "Init-only variables" +msgstr "仅初始化变量" + +#: ../../library/dataclasses.rst:629 +msgid "" +"Another place where :deco:`dataclass` inspects a type annotation is to " +"determine if a field is an init-only variable. It does this by seeing if " +"the type of a field is of type :class:`InitVar`. If a field is an " +":class:`InitVar`, it is considered a pseudo-field called an init-only field." +" As it is not a true field, it is not returned by the module-level " +":func:`fields` function. Init-only fields are added as parameters to the " +"generated :meth:`~object.__init__` method, and are passed to the optional " +":meth:`__post_init__` method. They are not otherwise used by dataclasses." +msgstr "" +"另一个 :deco:`dataclass` 会检查类型标注的地方是为了确定一个字段是否为仅限初始化的变量。 它通过检查字段的类型是否为 " +":class:`InitVar` 类型来做到这一点。 如果一个字段是 :class:`InitVar`,它会被当作是一个名为仅限初始化字段的伪字段。 " +"因为它不是一个真正的字段,所以它不会被模块层级的 :func:`fields` 函数返回。 仅限初始化字段会作为形参被添加到所生成的 " +":meth:`~object.__init__` 方法中,并会被传递给可选的 :meth:`__post_init__` 方法。 " +"在其他情况下它们将不会被数据类所使用。" + +#: ../../library/dataclasses.rst:639 +msgid "" +"For example, suppose a field will be initialized from a database, if a value" +" is not provided when creating the class::" +msgstr "例如,假设在创建类时没有为某个字段提供值,初始化时将从数据库中取值::" + +#: ../../library/dataclasses.rst:642 +msgid "" +"@dataclass\n" +"class C:\n" +" i: int\n" +" j: int | None = None\n" +" database: InitVar[DatabaseType | None] = None\n" +"\n" +" def __post_init__(self, database):\n" +" if self.j is None and database is not None:\n" +" self.j = database.lookup('j')\n" +"\n" +"c = C(10, database=my_database)" +msgstr "" +"@dataclass\n" +"class C:\n" +" i: int\n" +" j: int | None = None\n" +" database: InitVar[DatabaseType | None] = None\n" +"\n" +" def __post_init__(self, database):\n" +" if self.j is None and database is not None:\n" +" self.j = database.lookup('j')\n" +"\n" +"c = C(10, database=my_database)" + +#: ../../library/dataclasses.rst:654 +msgid "" +"In this case, :func:`fields` will return :class:`Field` objects for " +":attr:`!i` and :attr:`!j`, but not for :attr:`!database`." +msgstr "" +"在这种情况下,:func:`fields` 将返回 :attr:`!i` 和 :attr:`!j` 的 :class:`Field` 对象,但不包括 " +":attr:`!database`。" + +#: ../../library/dataclasses.rst:660 +msgid "Frozen instances" +msgstr "冻结的实例" + +#: ../../library/dataclasses.rst:662 +msgid "" +"It is not possible to create truly immutable Python objects. However, by " +"passing ``frozen=True`` to the :deco:`dataclass` decorator you can emulate " +"immutability. In that case, dataclasses will add " +":meth:`~object.__setattr__` and :meth:`~object.__delattr__` methods to the " +"class. These methods will raise a :exc:`FrozenInstanceError` when invoked." +msgstr "" +"创建真正不可变的 Python 对象是不可能的。 不过,你可以通过将 ``frozen=True`` 传递给 :deco:`dataclass` " +"装饰器来模拟出不可变性。 在这种情况下,数据类将向类添加 :meth:`~object.__setattr__` 和 " +":meth:`~object.__delattr__` 方法。 当被调用时这些方法将会引发 :exc:`FrozenInstanceError`。" + +#: ../../library/dataclasses.rst:668 +msgid "" +"There is a tiny performance penalty when using ``frozen=True``: " +":meth:`~object.__init__` cannot use simple assignment to initialize fields, " +"and must use :meth:`!object.__setattr__`." +msgstr "" +"在使用 ``frozen=True`` 时会有微小的性能损失: :meth:`~object.__init__` " +"不能使用简单赋值来初始化字段,而必须使用 :meth:`!object.__setattr__`。" + +#: ../../library/dataclasses.rst:677 +msgid "Inheritance" +msgstr "继承" + +#: ../../library/dataclasses.rst:679 +msgid "" +"When the dataclass is being created by the :deco:`dataclass` decorator, it " +"looks through all of the class's base classes in reverse MRO (that is, " +"starting at :class:`object`) and, for each dataclass that it finds, adds the" +" fields from that base class to an ordered mapping of fields. After all of " +"the base class fields are added, it adds its own fields to the ordered " +"mapping. All of the generated methods will use this combined, calculated " +"ordered mapping of fields. Because the fields are in insertion order, " +"derived classes override base classes. An example::" +msgstr "" +"当数据类由 :deco:`dataclass` 装饰器创建时,它会按 MRO 的反序(也就是说,从 :class:`object` " +"开始)查看它的所有基类,然后,对于它找到的每个数据类,将基类中的字段添加到一个有序映射中。 " +"在添加完所有基类字段后,它会将它自己的字段添加到这个有序映射中。 所有被生成的方法都将使用这个包含合并后的、计算好的字段的有序映射。 " +"因为这些字段会保持插入顺序,所以派生的类会重写其基类。 一个例子::" + +#: ../../library/dataclasses.rst:689 +msgid "" +"@dataclass\n" +"class Base:\n" +" x: Any = 15.0\n" +" y: int = 0\n" +"\n" +"@dataclass\n" +"class C(Base):\n" +" z: int = 10\n" +" x: int = 15" +msgstr "" +"@dataclass\n" +"class Base:\n" +" x: Any = 15.0\n" +" y: int = 0\n" +"\n" +"@dataclass\n" +"class C(Base):\n" +" z: int = 10\n" +" x: int = 15" + +#: ../../library/dataclasses.rst:699 +msgid "" +"The final list of fields is, in order, :attr:`!x`, :attr:`!y`, :attr:`!z`. " +"The final type of :attr:`!x` is :class:`int`, as specified in class " +":class:`!C`." +msgstr "" +"最终的字段列表依次是 :attr:`!x`, :attr:`!y`, :attr:`!z`。 最终的 :attr:`!x` 类型是 " +":class:`int`,正如类 :class:`!C` 中所指定的。" + +#: ../../library/dataclasses.rst:702 +msgid "" +"The generated :meth:`~object.__init__` method for :class:`!C` will look " +"like::" +msgstr "为 :class:`!C` 生成的 :meth:`~object.__init__` 方法看起来像是这样::" + +#: ../../library/dataclasses.rst:704 +msgid "def __init__(self, x: int = 15, y: int = 0, z: int = 10):" +msgstr "def __init__(self, x: int = 15, y: int = 0, z: int = 10):" + +#: ../../library/dataclasses.rst:707 +msgid "Re-ordering of keyword-only parameters in :meth:`!__init__`" +msgstr ":meth:`!__init__` 中仅限关键字形参的重新排序" + +#: ../../library/dataclasses.rst:709 +msgid "" +"After the parameters needed for :meth:`~object.__init__` are computed, any " +"keyword-only parameters are moved to come after all regular (non-keyword-" +"only) parameters. This is a requirement of how keyword-only parameters are " +"implemented in Python: they must come after non-keyword-only parameters." +msgstr "" +"在计算出 :meth:`~object.__init__` 所需要的形参之后,任何仅限关键字形参会被移至所有常规(非仅限关键字)形参的后面。 这是 " +"Python 中实现仅限关键字形参所要求的:它们必须位于非仅限关键字形参之后。" + +#: ../../library/dataclasses.rst:715 +msgid "" +"In this example, :attr:`!Base.y`, :attr:`!Base.w`, and :attr:`!D.t` are " +"keyword-only fields, and :attr:`!Base.x` and :attr:`!D.z` are regular " +"fields::" +msgstr "" +"在这个例子中,:attr:`!Base.y`, :attr:`!Base.w` 和 :attr:`!D.t` 是仅限关键字字段,而 " +":attr:`!Base.x` 和 :attr:`!D.z` 是常规字段::" + +#: ../../library/dataclasses.rst:718 +msgid "" +"@dataclass\n" +"class Base:\n" +" x: Any = 15.0\n" +" _: KW_ONLY\n" +" y: int = 0\n" +" w: int = 1\n" +"\n" +"@dataclass\n" +"class D(Base):\n" +" z: int = 10\n" +" t: int = field(kw_only=True, default=0)" +msgstr "" +"@dataclass\n" +"class Base:\n" +" x: Any = 15.0\n" +" _: KW_ONLY\n" +" y: int = 0\n" +" w: int = 1\n" +"\n" +"@dataclass\n" +"class D(Base):\n" +" z: int = 10\n" +" t: int = field(kw_only=True, default=0)" + +#: ../../library/dataclasses.rst:730 +msgid "" +"The generated :meth:`!__init__` method for :class:`!D` will look like::" +msgstr "为 :class:`!D` 生成的 :meth:`!__init__` 方法看起来像是这样::" + +#: ../../library/dataclasses.rst:732 +msgid "" +"def __init__(self, x: Any = 15.0, z: int = 10, *, y: int = 0, w: int = 1, t:" +" int = 0):" +msgstr "" +"def __init__(self, x: Any = 15.0, z: int = 10, *, y: int = 0, w: int = 1, t:" +" int = 0):" + +#: ../../library/dataclasses.rst:734 +msgid "" +"Note that the parameters have been re-ordered from how they appear in the " +"list of fields: parameters derived from regular fields are followed by " +"parameters derived from keyword-only fields." +msgstr "请注意形参原来在字段列表中出现的位置已被重新排序:前面是来自常规字段的形参而后面是来自仅限关键字字段的形参。" + +#: ../../library/dataclasses.rst:738 +msgid "" +"The relative ordering of keyword-only parameters is maintained in the re-" +"ordered :meth:`!__init__` parameter list." +msgstr "仅限关键字形参的相对顺序会在重新排序的 :meth:`!__init__` 列表中保持不变。" + +#: ../../library/dataclasses.rst:743 +msgid "Default factory functions" +msgstr "默认工厂函数" + +#: ../../library/dataclasses.rst:745 +msgid "" +"If a :func:`field` specifies a *default_factory*, it is called with zero " +"arguments when a default value for the field is needed. For example, to " +"create a new instance of a list, use::" +msgstr "" +"如果一个 :func:`field` 指定了 *default_factory*,它将在该字段需要默认值时不带参数地被调用。 " +"例如,要创建一个列表的新实例,则使用::" + +#: ../../library/dataclasses.rst:749 +msgid "mylist: list = field(default_factory=list)" +msgstr "mylist: list = field(default_factory=list)" + +#: ../../library/dataclasses.rst:751 +msgid "" +"If a field is excluded from :meth:`~object.__init__` (using ``init=False``) " +"and the field also specifies *default_factory*, then the default factory " +"function will always be called from the generated :meth:`!__init__` " +"function. This happens because there is no other way to give the field an " +"initial value." +msgstr "" +"如果一个字段被排除在 :meth:`~object.__init__` 之外 (使用 ``init=False``) 并且该字段还指定了 " +"*default_factory*,则默认的工厂函数将总是会从生成的 :meth:`!__init__` 函数中被调用。 " +"发生这种情况是因为没有其他方式能为字段提供初始值。" + +#: ../../library/dataclasses.rst:758 +msgid "Mutable default values" +msgstr "可变的默认值" + +#: ../../library/dataclasses.rst:760 +msgid "" +"Python stores default member variable values in class attributes. Consider " +"this example, not using dataclasses::" +msgstr "Python 在类属性中存储默认成员变量值。思考这个例子,不使用数据类::" + +#: ../../library/dataclasses.rst:763 +msgid "" +"class C:\n" +" x = []\n" +" def add(self, element):\n" +" self.x.append(element)\n" +"\n" +"o1 = C()\n" +"o2 = C()\n" +"o1.add(1)\n" +"o2.add(2)\n" +"assert o1.x == [1, 2]\n" +"assert o1.x is o2.x" +msgstr "" +"class C:\n" +" x = []\n" +" def add(self, element):\n" +" self.x.append(element)\n" +"\n" +"o1 = C()\n" +"o2 = C()\n" +"o1.add(1)\n" +"o2.add(2)\n" +"assert o1.x == [1, 2]\n" +"assert o1.x is o2.x" + +#: ../../library/dataclasses.rst:775 +msgid "" +"Note that the two instances of class :class:`!C` share the same class " +"variable :attr:`!x`, as expected." +msgstr "请注意类 :class:`!C` 的两个实例将共享同一个类变量 :attr:`!x`,正如预期的那样。" + +#: ../../library/dataclasses.rst:778 +msgid "Using dataclasses, *if* this code was valid::" +msgstr "使用数据类,*如果* 此代码有效:" + +#: ../../library/dataclasses.rst:780 +msgid "" +"@dataclass\n" +"class D:\n" +" x: list = [] # This code raises ValueError\n" +" def add(self, element):\n" +" self.x.append(element)" +msgstr "" +"@dataclass\n" +"class D:\n" +" x: list = [] # 此代码将引发 ValueError\n" +" def add(self, element):\n" +" self.x.append(element)" + +#: ../../library/dataclasses.rst:786 +msgid "it would generate code similar to::" +msgstr "它生成的代码类似于::" + +#: ../../library/dataclasses.rst:788 +msgid "" +"class D:\n" +" x = []\n" +" def __init__(self, x=x):\n" +" self.x = x\n" +" def add(self, element):\n" +" self.x.append(element)\n" +"\n" +"assert D().x is D().x" +msgstr "" +"class D:\n" +" x = []\n" +" def __init__(self, x=x):\n" +" self.x = x\n" +" def add(self, element):\n" +" self.x.append(element)\n" +"\n" +"assert D().x is D().x" + +#: ../../library/dataclasses.rst:797 +msgid "" +"This has the same issue as the original example using class :class:`!C`. " +"That is, two instances of class :class:`!D` that do not specify a value for " +":attr:`!x` when creating a class instance will share the same copy of " +":attr:`!x`. Because dataclasses just use normal Python class creation they " +"also share this behavior. There is no general way for Data Classes to " +"detect this condition. Instead, the :deco:`dataclass` decorator will raise " +"a :exc:`ValueError` if it detects an unhashable default parameter. The " +"assumption is that if a value is unhashable, it is mutable. This is a " +"partial solution, but it does protect against many common errors." +msgstr "" +"这具有与使用 :class:`!C` 类的原始示例相同的问题。 也就是说,当创建类实例时如果 :class:`!D` 类的两个实例没有为 " +":attr:`!x` 指定值则将共享同一个 :attr:`!x` 的副本。 因为数据类只是使用普通的 Python 类创建机制所以它们也会共享此行为。 " +"数据类没有任何通用方式来检测这种情况。 相反地,:deco:`dataclass` 装饰器在检测到不可哈希的默认形参时将会引发 " +":exc:`ValueError`。 这一行为假定如果一个值是不可哈希的,那么它就是可变对象。 这是一个部分解决方案,但它确实能防止许多常见错误。" + +#: ../../library/dataclasses.rst:808 +msgid "" +"Using default factory functions is a way to create new instances of mutable " +"types as default values for fields::" +msgstr "使用默认工厂函数是一种创建可变类型新实例的方法,并将其作为字段的默认值::" + +#: ../../library/dataclasses.rst:811 +msgid "" +"@dataclass\n" +"class D:\n" +" x: list = field(default_factory=list)\n" +"\n" +"assert D().x is not D().x" +msgstr "" +"@dataclass\n" +"class D:\n" +" x: list = field(default_factory=list)\n" +"\n" +"assert D().x is not D().x" + +#: ../../library/dataclasses.rst:817 +msgid "" +"Instead of looking for and disallowing objects of type :class:`list`, " +":class:`dict`, or :class:`set`, unhashable objects are now not allowed as " +"default values. Unhashability is used to approximate mutability." +msgstr "" +"现在不再是寻找并阻止使用类型为 :class:`list`, :class:`dict` 或 :class:`set` " +"的对象,而是不允许将不可哈希的对象用作默认值。 不可哈希性被用作可变性的近似判断。" + +#: ../../library/dataclasses.rst:824 +msgid "Descriptor-typed fields" +msgstr "描述器类型的字段" + +#: ../../library/dataclasses.rst:826 +msgid "" +"Fields that are assigned :ref:`descriptor objects ` as their " +"default value have the following special behaviors:" +msgstr "当字段被 :ref:`描述器对象 ` 赋值为默认值时会遵循以下行为:" + +#: ../../library/dataclasses.rst:829 +msgid "" +"The value for the field passed to the dataclass's :meth:`~object.__init__` " +"method is passed to the descriptor's :meth:`~object.__set__` method rather " +"than overwriting the descriptor object." +msgstr "" +"传递给数据类的 :meth:`~object.__init__` 方法的字段值会被传递给描述器的 :meth:`~object.__set__` " +"方法而不会覆盖描述器对象。" + +#: ../../library/dataclasses.rst:833 +msgid "" +"Similarly, when getting or setting the field, the descriptor's " +":meth:`~object.__get__` or :meth:`!__set__` method is called rather than " +"returning or overwriting the descriptor object." +msgstr "" +"类似地,当获取或设置字段值时,将调用描述器的 :meth:`~object.__get__` 或 :meth:`!__set__` " +"方法而不是返回或重写描述器对象。" + +#: ../../library/dataclasses.rst:837 +msgid "" +"To determine whether a field contains a default value, :deco:`dataclass` " +"will call the descriptor's :meth:`!__get__` method using its class access " +"form: ``descriptor.__get__(obj=None, type=cls)``. If the descriptor returns" +" a value in this case, it will be used as the field's default. On the other " +"hand, if the descriptor raises :exc:`AttributeError` in this situation, no " +"default value will be provided for the field." +msgstr "" +"为了确定一个字段是否包含默认值 ,:deco:`dataclass` 会使用类访问形式调用描述器的 :meth:`!__get__` 方法: " +"``descriptor.__get__(obj=None, type=cls)``。 如果在此情况下描述器返回了一个值,它将被用作字段的默认值。 " +"另一方面,如果在此情况下描述器引发了 :exc:`AttributeError`,则不会为字段提供默认值。" + +#: ../../library/dataclasses.rst:847 +msgid "" +"class IntConversionDescriptor:\n" +" def __init__(self, *, default):\n" +" self._default = default\n" +"\n" +" def __set_name__(self, owner, name):\n" +" self._name = \"_\" + name\n" +"\n" +" def __get__(self, obj, type):\n" +" if obj is None:\n" +" return self._default\n" +"\n" +" return getattr(obj, self._name, self._default)\n" +"\n" +" def __set__(self, obj, value):\n" +" setattr(obj, self._name, int(value))\n" +"\n" +"@dataclass\n" +"class InventoryItem:\n" +" quantity_on_hand: IntConversionDescriptor = IntConversionDescriptor(default=100)\n" +"\n" +"i = InventoryItem()\n" +"print(i.quantity_on_hand) # 100\n" +"i.quantity_on_hand = 2.5 # calls __set__ with 2.5\n" +"print(i.quantity_on_hand) # 2" +msgstr "" +"class IntConversionDescriptor:\n" +" def __init__(self, *, default):\n" +" self._default = default\n" +"\n" +" def __set_name__(self, owner, name):\n" +" self._name = \"_\" + name\n" +"\n" +" def __get__(self, obj, type):\n" +" if obj is None:\n" +" return self._default\n" +"\n" +" return getattr(obj, self._name, self._default)\n" +"\n" +" def __set__(self, obj, value):\n" +" setattr(obj, self._name, int(value))\n" +"\n" +"@dataclass\n" +"class InventoryItem:\n" +" quantity_on_hand: IntConversionDescriptor = IntConversionDescriptor(default=100)\n" +"\n" +"i = InventoryItem()\n" +"print(i.quantity_on_hand) # 100\n" +"i.quantity_on_hand = 2.5 # 调用 __set__ 并传入 2.5\n" +"print(i.quantity_on_hand) # 2" + +#: ../../library/dataclasses.rst:872 +msgid "" +"Note that if a field is annotated with a descriptor type, but is not " +"assigned a descriptor object as its default value, the field will act like a" +" normal field." +msgstr "若一个字段的类型是描述器,但其默认值并不是描述器对象,那么该字段只会像普通的字段一样工作。" diff --git a/library/datatypes.po b/library/datatypes.po new file mode 100644 index 0000000000..51fa28aa76 --- /dev/null +++ b/library/datatypes.po @@ -0,0 +1,48 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/datatypes.rst:5 +msgid "Data Types" +msgstr "数据类型" + +#: ../../library/datatypes.rst:7 +msgid "" +"The modules described in this chapter provide a variety of specialized data " +"types such as dates and times, fixed-type arrays, heap queues, double-ended " +"queues, and enumerations." +msgstr "本章所描述的模块提供了许多专门的数据类型,如日期和时间、固定类型的数组、堆队列、双端队列、以及枚举。" + +#: ../../library/datatypes.rst:11 +msgid "" +"Python also provides some built-in data types, in particular, :class:`dict`," +" :class:`list`, :class:`set` and :class:`frozenset`, and :class:`tuple`. " +"The :class:`str` class is used to hold Unicode strings, and the " +":class:`bytes` and :class:`bytearray` classes are used to hold binary data." +msgstr "" +"Python也提供一些内置数据类型,特别是,:class:`dict`、 " +":class:`list`、:class:`set`、:class:`frozenset`、以及 :class:`tuple`。:class:`str`" +" 这个类是用来存储Unicode字符串的,而 :class:`bytes` 和 :class:`bytearray` 这两个类是用来存储二进制数据的。" + +#: ../../library/datatypes.rst:17 +msgid "The following modules are documented in this chapter:" +msgstr "本章包含以下模块的文档:" diff --git a/library/datetime.po b/library/datetime.po new file mode 100644 index 0000000000..c2c5029fca --- /dev/null +++ b/library/datetime.po @@ -0,0 +1,5242 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# 99 , 2026 +# python-doc bot, 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/datetime.rst:2 +msgid ":mod:`!datetime` --- Basic date and time types" +msgstr ":mod:`!datetime` --- 基本日期和时间类型" + +#: ../../library/datetime.rst:7 +msgid "**Source code:** :source:`Lib/datetime.py`" +msgstr "**源代码:** :source:`Lib/datetime.py`" + +#: ../../library/datetime.rst:11 +msgid "" +"The :mod:`!datetime` module supplies classes for manipulating dates and " +"times." +msgstr ":mod:`!datetime` 模块提供了用于操作日期和时间的类。" + +#: ../../library/datetime.rst:13 +msgid "" +"While date and time arithmetic is supported, the focus of the implementation" +" is on efficient attribute extraction for output formatting and " +"manipulation." +msgstr "在支持日期时间数学运算的同时,实现的关注点更着重于如何能够更有效地解析其属性用于格式化输出和数据操作。" + +#: ../../library/datetime.rst:18 +msgid "Skip to :ref:`the format codes `." +msgstr "跳到 :ref:`格式代码 `。" + +#: ../../library/datetime.rst:22 +msgid "Module :mod:`calendar`" +msgstr "模块 :mod:`calendar`" + +#: ../../library/datetime.rst:23 +msgid "General calendar related functions." +msgstr "通用日历相关函数" + +#: ../../library/datetime.rst:25 +msgid "Module :mod:`time`" +msgstr "模块 :mod:`time`" + +#: ../../library/datetime.rst:26 +msgid "Time access and conversions." +msgstr "时间的访问和转换" + +#: ../../library/datetime.rst:28 +msgid "Module :mod:`zoneinfo`" +msgstr ":mod:`zoneinfo` 模块" + +#: ../../library/datetime.rst:29 +msgid "Concrete time zones representing the IANA time zone database." +msgstr "代表 IANA 时区数据库的具体时区。" + +#: ../../library/datetime.rst:31 +msgid "Package `dateutil `_" +msgstr "`dateutil `_ 包" + +#: ../../library/datetime.rst:32 +msgid "Third-party library with expanded time zone and parsing support." +msgstr "具有扩展时区和解析支持的第三方库。" + +#: ../../library/datetime.rst:34 +msgid "Package :pypi:`DateType`" +msgstr "包 :pypi:`DateType`" + +#: ../../library/datetime.rst:35 +msgid "" +"Third-party library that introduces distinct static types to for example, " +"allow :term:`static type checkers ` to differentiate " +"between naive and aware datetimes." +msgstr "" +"引入了独特静态类型的第三方库,例如允许 :term:`静态类型检查器 ` 区分简单型和感知型日期时间。" + +#: ../../library/datetime.rst:43 +msgid "Aware and naive objects" +msgstr "感知型对象和简单型对象" + +#: ../../library/datetime.rst:45 +msgid "" +"Date and time objects may be categorized as \"aware\" or \"naive\" depending" +" on whether or not they include time zone information." +msgstr "日期和时间对象可以根据它们是否包含时区信息而分为“感知型”和“简单型”两类。" + +#: ../../library/datetime.rst:48 +msgid "" +"With sufficient knowledge of applicable algorithmic and political time " +"adjustments, such as time zone and daylight saving time information, an " +"**aware** object can locate itself relative to other aware objects. An aware" +" object represents a specific moment in time that is not open to " +"interpretation. [#]_" +msgstr "" +"充分掌握应用性算法和政治性时间调整信息例如时区和夏令时的情况下,一个 **感知型** 对象就能相对于其他感知型对象来精确定位自身时间点。 " +"感知型对象是用来表示一个没有解释空间的固定时间点。 [#]_" + +#: ../../library/datetime.rst:54 +msgid "" +"A **naive** object does not contain enough information to unambiguously " +"locate itself relative to other date/time objects. Whether a naive object " +"represents Coordinated Universal Time (UTC), local time, or time in some " +"other time zone is purely up to the program, just like it is up to the " +"program whether a particular number represents metres, miles, or mass. Naive" +" objects are easy to understand and to work with, at the cost of ignoring " +"some aspects of reality." +msgstr "" +"**简单型** 对象没有包含足够多的信息来无歧义地相对于其他 date/time 对象来定位自身时间点。 " +"不论一个简单型对象所代表的是世界标准时间(UTC)、当地时间还是某个其他时区的时间完全取决于具体程序,就像一个特定数字所代表的是米、英里还是质量完全取决于具体程序一样。" +" 简单型对象更易于理解和使用,代价则是忽略了某些现实性考量。" + +#: ../../library/datetime.rst:61 +msgid "" +"For applications requiring aware objects, :class:`.datetime` and " +":class:`.time` objects have an optional time zone information attribute, " +":attr:`!tzinfo`, that can be set to an instance of a subclass of the " +"abstract :class:`!tzinfo` class. These :class:`tzinfo` objects capture " +"information about the offset from UTC time, the time zone name, and whether " +"daylight saving time is in effect." +msgstr "" +"对于要求感知型对象的应用程序,:class:`.datetime` 和 :class:`.time` 对象具有一个可选的时区信息属性 " +":attr:`!tzinfo`,它可被设为抽象类 :class:`!tzinfo` 的子类的一个实例。 这些 :class:`tzinfo` " +"对象会捕获与 UTC 时间的差值、时区名称以及夏令时是否生效等信息。" + +#: ../../library/datetime.rst:67 +msgid "" +"Only one concrete :class:`tzinfo` class, the :class:`timezone` class, is " +"supplied by the :mod:`!datetime` module. The :class:`!timezone` class can " +"represent simple time zones with fixed offsets from UTC, such as UTC itself " +"or North American EST and EDT time zones. Supporting time zones at deeper " +"levels of detail is up to the application. The rules for time adjustment " +"across the world are more political than rational, change frequently, and " +"there is no standard suitable for every application aside from UTC." +msgstr "" +":mod:`!datetime` 模块只提供了一个具体的 :class:`tzinfo` 类,即 :class:`timezone` 类。 " +":class:`!timezone` 类可以表示具有相对于 UTC 的固定时差的简单时区,例如 UTC 本身或北美 EST 和 EDT 时区等。 " +"支持时区的详细程度取决于具体的应用。 世界各地的时间调整规则往往是政治性多于合理性,经常会发生变化,除了 UTC 之外并没有一个能适合所有应用的标准。" + +#: ../../library/datetime.rst:77 +msgid "Constants" +msgstr "常量" + +#: ../../library/datetime.rst:79 +msgid "The :mod:`!datetime` module exports the following constants:" +msgstr ":mod:`!datetime` 模块导出了以下常量:" + +#: ../../library/datetime.rst:83 +msgid "" +"The smallest year number allowed in a :class:`date` or :class:`.datetime` " +"object. :const:`MINYEAR` is 1." +msgstr ":class:`date` 或 :class:`.datetime` 对象允许的最小年份数值。 :const:`MINYEAR` 为 1。" + +#: ../../library/datetime.rst:89 +msgid "" +"The largest year number allowed in a :class:`date` or :class:`.datetime` " +"object. :const:`MAXYEAR` is 9999." +msgstr "" +":class:`date` 或 :class:`.datetime` 对象允许的最大年份数值。 :const:`MAXYEAR` 为 9999。" + +#: ../../library/datetime.rst:95 +msgid "Alias for the UTC time zone singleton :attr:`datetime.timezone.utc`." +msgstr "UTC 时区单例 :attr:`datetime.timezone.utc` 的别名。" + +#: ../../library/datetime.rst:101 +msgid "Available types" +msgstr "可用的类型" + +#: ../../library/datetime.rst:106 +msgid "" +"An idealized naive date, assuming the current Gregorian calendar always was," +" and always will be, in effect. Attributes: :attr:`year`, :attr:`month`, and" +" :attr:`day`." +msgstr "" +"一个理想化的简单型日期,它假设当今的公历在过去和未来永远有效。 属性: :attr:`year`, :attr:`month`, and " +":attr:`day`。" + +#: ../../library/datetime.rst:114 +msgid "" +"An idealized time, independent of any particular day, assuming that every " +"day has exactly 24\\*60\\*60 seconds. (There is no notion of \"leap " +"seconds\" here.) Attributes: :attr:`hour`, :attr:`minute`, :attr:`second`, " +":attr:`microsecond`, and :attr:`.tzinfo`." +msgstr "" +"一个独立于任何特定日期的理想化时间,它假设每一天都恰好等于 24\\*60\\*60 秒。 (这里没有“闰秒”的概念。) 包含属性: " +":attr:`hour`, :attr:`minute`, :attr:`second`, :attr:`microsecond` 和 " +":attr:`.tzinfo`。" + +#: ../../library/datetime.rst:123 +msgid "" +"A combination of a date and a time. Attributes: :attr:`year`, :attr:`month`," +" :attr:`day`, :attr:`hour`, :attr:`minute`, :attr:`second`, " +":attr:`microsecond`, and :attr:`.tzinfo`." +msgstr "" +"日期和时间的结合。属性::attr:`year`, :attr:`month`, :attr:`day`, :attr:`hour`, " +":attr:`minute`, :attr:`second`, :attr:`microsecond`, and :attr:`.tzinfo`." + +#: ../../library/datetime.rst:131 +msgid "" +"A duration expressing the difference between two :class:`.datetime` or " +":class:`date` instances to microsecond resolution." +msgstr "将两个 :class:`.datetime` 或 :class:`date` 实例之间的差值表示为微秒级精度的持续时间。" + +#: ../../library/datetime.rst:138 +msgid "" +"An abstract base class for time zone information objects. These are used by " +"the :class:`.datetime` and :class:`.time` classes to provide a customizable " +"notion of time adjustment (for example, to account for time zone and/or " +"daylight saving time)." +msgstr "" +"一个描述时区信息对象的抽象基类。 用来给 :class:`.datetime` 和 :class:`.time` " +"类提供自定义的时间调整概念(例如处理时区和/或夏令时)。" + +#: ../../library/datetime.rst:147 +msgid "" +"A class that implements the :class:`tzinfo` abstract base class as a fixed " +"offset from the UTC." +msgstr "一个实现了 :class:`tzinfo` 抽象基类的子类,用于表示相对于 世界标准时间(UTC)的偏移量。" + +#: ../../library/datetime.rst:153 ../../library/datetime.rst:170 +msgid "Objects of these types are immutable." +msgstr "这些类型的对象都是不可变的。" + +#: ../../library/datetime.rst:155 +msgid "Subclass relationships:" +msgstr "子类关系:" + +#: ../../library/datetime.rst:157 +msgid "" +"timedelta, tzinfo, time, and date inherit from object; timezone inherits\n" +"from tzinfo; and datetime inherits from date." +msgstr "" +"timedelta, tzinfo, time 和 date 继承自 object; timezone 继承自\n" +"from tzinfo; 而 datetime 继承自 date。" + +#: ../../library/datetime.rst:165 +msgid "Common properties" +msgstr "通用特征属性" + +#: ../../library/datetime.rst:167 +msgid "" +"The :class:`date`, :class:`.datetime`, :class:`.time`, and :class:`timezone`" +" types share these common features:" +msgstr "" +":class:`date`, :class:`.datetime`, :class:`.time` 和 :class:`timezone` " +"类型共享这些通用特性:" + +#: ../../library/datetime.rst:171 +msgid "" +"Objects of these types are :term:`hashable`, meaning that they can be used " +"as dictionary keys." +msgstr "这些类型的对象是 :term:`hashable`,意味着它们可以被用作字典的键。" + +#: ../../library/datetime.rst:173 +msgid "" +"Objects of these types support efficient pickling via the :mod:`pickle` " +"module." +msgstr "这些类型的对象支持通过 :mod:`pickle` 模块进行高效的封存。" + +#: ../../library/datetime.rst:177 +msgid "Determining if an object is aware or naive" +msgstr "确定一个对象是感知型还是简单型" + +#: ../../library/datetime.rst:179 +msgid "Objects of the :class:`date` type are always naive." +msgstr ":class:`date` 类型的对象都是简单型的。" + +#: ../../library/datetime.rst:181 +msgid "" +"An object of type :class:`.time` or :class:`.datetime` may be aware or " +"naive." +msgstr ":class:`.time` 或 :class:`.datetime` 类型的对象可以是感知型或者简单型。" + +#: ../../library/datetime.rst:183 +msgid "" +"A :class:`.datetime` object ``d`` is aware if both of the following hold:" +msgstr "一个 :class:`.datetime` 对象 ``d`` 在以下条件同时成立时将是感知型的:" + +#: ../../library/datetime.rst:185 +msgid "``d.tzinfo`` is not ``None``" +msgstr "``d.tzinfo`` 不为 ``None``" + +#: ../../library/datetime.rst:186 +msgid "``d.tzinfo.utcoffset(d)`` does not return ``None``" +msgstr "``d.tzinfo.utcoffset(d)`` 不返回 ``None``" + +#: ../../library/datetime.rst:188 +msgid "Otherwise, ``d`` is naive." +msgstr "在其他情况下,``d`` 将是简单型的。" + +#: ../../library/datetime.rst:190 +msgid "A :class:`.time` object ``t`` is aware if both of the following hold:" +msgstr "一个 :class:`.time` 对象 ``t`` 在以下条件同时成立时将是感知型的:" + +#: ../../library/datetime.rst:192 +msgid "``t.tzinfo`` is not ``None``" +msgstr "``t.tzinfo`` 不为 ``None``" + +#: ../../library/datetime.rst:193 +msgid "``t.tzinfo.utcoffset(None)`` does not return ``None``." +msgstr "``t.tzinfo.utcoffset(None)`` 不返回 ``None``。" + +#: ../../library/datetime.rst:195 +msgid "Otherwise, ``t`` is naive." +msgstr "在其他情况下,``t`` 将是简单型的。" + +#: ../../library/datetime.rst:197 +msgid "" +"The distinction between aware and naive doesn't apply to :class:`timedelta` " +"objects." +msgstr "感知型和简单型之间的区别不适用于 :class:`timedelta` 对象。" + +#: ../../library/datetime.rst:204 +msgid ":class:`!timedelta` objects" +msgstr ":class:`!timedelta` 对象" + +#: ../../library/datetime.rst:206 +msgid "" +"A :class:`timedelta` object represents a duration, the difference between " +"two :class:`.datetime` or :class:`date` instances." +msgstr "" +":class:`timedelta` 对象表示一段持续的时间,即两个 :class:`.datetime` 或 :class:`date` " +"实例之间的差值。" + +#: ../../library/datetime.rst:211 +msgid "" +"All arguments are optional and default to 0. Arguments may be integers or " +"floats, and may be positive or negative." +msgstr "所有参数都是可选的并且默认为 0。 这些参数可以是整数或者浮点数,并可以为正值或者负值。" + +#: ../../library/datetime.rst:214 +msgid "" +"Only *days*, *seconds* and *microseconds* are stored internally. Arguments " +"are converted to those units:" +msgstr "只有 *days*, *seconds* 和 *microseconds* 会存储在内部。 参数单位的换算规则如下:" + +#: ../../library/datetime.rst:217 +msgid "A millisecond is converted to 1000 microseconds." +msgstr "1毫秒会转换成1000微秒。" + +#: ../../library/datetime.rst:218 +msgid "A minute is converted to 60 seconds." +msgstr "1分钟会转换成60秒。" + +#: ../../library/datetime.rst:219 +msgid "An hour is converted to 3600 seconds." +msgstr "1小时会转换成3600秒。" + +#: ../../library/datetime.rst:220 +msgid "A week is converted to 7 days." +msgstr "1星期会转换成7天。" + +#: ../../library/datetime.rst:222 +msgid "" +"and days, seconds and microseconds are then normalized so that the " +"representation is unique, with" +msgstr "日期、秒、微秒都是标准化的,所以它们的表达方式也是唯一的,例:" + +#: ../../library/datetime.rst:225 +msgid "``0 <= microseconds < 1000000``" +msgstr "``0 <= microseconds < 1000000``" + +#: ../../library/datetime.rst:226 +msgid "``0 <= seconds < 3600*24`` (the number of seconds in one day)" +msgstr "``0 <= seconds < 3600*24`` (一天的秒数)" + +#: ../../library/datetime.rst:227 +msgid "``-999999999 <= days <= 999999999``" +msgstr "``-999999999 <= days <= 999999999``" + +#: ../../library/datetime.rst:229 +msgid "" +"The following example illustrates how any arguments besides *days*, " +"*seconds* and *microseconds* are \"merged\" and normalized into those three " +"resulting attributes::" +msgstr "" +"下面的例子演示了如何对 *days*, *seconds* 和 *microseconds* " +"以外的任意参数执行“合并”操作并标准化为以上三个结果属性::" + +#: ../../library/datetime.rst:233 +msgid "" +">>> import datetime as dt\n" +">>> delta = dt.timedelta(\n" +"... days=50,\n" +"... seconds=27,\n" +"... microseconds=10,\n" +"... milliseconds=29000,\n" +"... minutes=5,\n" +"... hours=8,\n" +"... weeks=2\n" +"... )\n" +">>> # Only days, seconds, and microseconds remain\n" +">>> delta\n" +"datetime.timedelta(days=64, seconds=29156, microseconds=10)" +msgstr "" +">>> import datetime as dt\n" +">>> delta = dt.timedelta(\n" +"... days=50,\n" +"... seconds=27,\n" +"... microseconds=10,\n" +"... milliseconds=29000,\n" +"... minutes=5,\n" +"... hours=8,\n" +"... weeks=2\n" +"... )\n" +">>> # Only days, seconds, and microseconds remain\n" +">>> delta\n" +"datetime.timedelta(days=64, seconds=29156, microseconds=10)" + +#: ../../library/datetime.rst:248 +msgid "" +"``import datetime as dt`` instead of ``import datetime`` or ``from datetime " +"import datetime`` to avoid confusion between the module and the class. See " +"`How I Import Python’s datetime Module " +"`__." +msgstr "" +"使用 ``import datetime as dt`` 而不是 ``import datetime`` 或 ``from datetime " +"import datetime`` 以避免模块和类之间的混淆。 参见 `How I Import Python’s datetime Module " +"`__。" + +#: ../../library/datetime.rst:253 +msgid "" +"If any argument is a float and there are fractional microseconds, the " +"fractional microseconds left over from all arguments are combined and their " +"sum is rounded to the nearest microsecond using round-half-to-even " +"tiebreaker. If no argument is a float, the conversion and normalization " +"processes are exact (no information is lost)." +msgstr "" +"在有任何参数为浮点型并且 microseconds " +"值为小数的情况下,从所有参数中余下的微秒数将被合并,并使用四舍五入偶不入奇的规则将总计值舍入到最接近的整数微秒值。 " +"如果没有任何参数为浮点型的情况下,则转换和标准化过程将是完全精确的(不会丢失信息)。" + +#: ../../library/datetime.rst:260 +msgid "" +"If the normalized value of days lies outside the indicated range, " +":exc:`OverflowError` is raised." +msgstr "如果标准化后的 days 数值超过了指定范围,将会抛出 :exc:`OverflowError` 异常。" + +#: ../../library/datetime.rst:263 +msgid "" +"Note that normalization of negative values may be surprising at first. For " +"example::" +msgstr "请注意对负数值进行标准化的结果可能会令人感到惊讶。 例如::" + +#: ../../library/datetime.rst:266 +msgid "" +">>> import datetime as dt\n" +">>> d = dt.timedelta(microseconds=-1)\n" +">>> (d.days, d.seconds, d.microseconds)\n" +"(-1, 86399, 999999)" +msgstr "" +">>> import datetime as dt\n" +">>> d = dt.timedelta(microseconds=-1)\n" +">>> (d.days, d.seconds, d.microseconds)\n" +"(-1, 86399, 999999)" + +#: ../../library/datetime.rst:271 +msgid "" +"Since the string representation of :class:`!timedelta` objects can be " +"confusing, use the following recipe to produce a more readable format:" +msgstr "由于 :class:`!timedelta` 对象的字符串表示形式可能难以理解,请使用下面的方式来产生更具可读性的格式:" + +#: ../../library/datetime.rst:274 +msgid "" +">>> def pretty_timedelta(td):\n" +"... if td.days >= 0:\n" +"... return str(td)\n" +"... return f'-({-td!s})'\n" +"...\n" +">>> d = timedelta(hours=-1)\n" +">>> str(d) # not human-friendly\n" +"'-1 day, 23:00:00'\n" +">>> pretty_timedelta(d)\n" +"'-(1:00:00)'" +msgstr "" +">>> def pretty_timedelta(td):\n" +"... if td.days >= 0:\n" +"... return str(td)\n" +"... return f'-({-td!s})'\n" +"...\n" +">>> d = timedelta(hours=-1)\n" +">>> str(d) # 对人类不够友好\n" +"'-1 day, 23:00:00'\n" +">>> pretty_timedelta(d)\n" +"'-(1:00:00)'" + +#: ../../library/datetime.rst:288 ../../library/datetime.rst:628 +#: ../../library/datetime.rst:1201 ../../library/datetime.rst:1850 +#: ../../library/datetime.rst:2486 +msgid "Class attributes:" +msgstr "类属性:" + +#: ../../library/datetime.rst:292 +msgid "" +"The most negative :class:`timedelta` object, ``timedelta(-999999999)``." +msgstr " :class:`timedelta` 类对象的最小值为 ``timedelta(-999999999)``。" + +#: ../../library/datetime.rst:297 +msgid "" +"The most positive :class:`timedelta` object, ``timedelta(days=999999999, " +"hours=23, minutes=59, seconds=59, microseconds=999999)``." +msgstr "" +" :class:`timedelta` 类对象的最大值为 ``timedelta(days=999999999, hours=23, " +"minutes=59, seconds=59, microseconds=999999)``。" + +#: ../../library/datetime.rst:303 +msgid "" +"The smallest possible difference between non-equal :class:`timedelta` " +"objects, ``timedelta(microseconds=1)``." +msgstr "两个不相等的 :class:`timedelta` 类对象最小的间隔为 ``timedelta(microseconds=1)``。" + +#: ../../library/datetime.rst:307 +msgid "" +"Note that, because of normalization, ``timedelta.max`` is greater than " +"``-timedelta.min``. ``-timedelta.max`` is not representable as a " +":class:`timedelta` object." +msgstr "" +"请注意,因为标准化的缘故,``timedelta.max`` 大于 ``-timedelta.min``。 ``-timedelta.max`` " +"不可以表示为一个 :class:`timedelta` 对象。" + +#: ../../library/datetime.rst:311 ../../library/datetime.rst:646 +#: ../../library/datetime.rst:1221 ../../library/datetime.rst:1870 +msgid "Instance attributes (read-only):" +msgstr "实例属性(只读):" + +#: ../../library/datetime.rst:315 +msgid "Between -999,999,999 and 999,999,999 inclusive." +msgstr "-999,999,999 至 999,999,999 闭区间。" + +#: ../../library/datetime.rst:320 +msgid "Between 0 and 86,399 inclusive." +msgstr "0 至 86,399 闭区间。" + +#: ../../library/datetime.rst:324 +msgid "" +"It is a somewhat common bug for code to unintentionally use this attribute " +"when it is actually intended to get a :meth:`~timedelta.total_seconds` value" +" instead:" +msgstr "一个有点常见的代码错误是当实际是要获取 :meth:`~timedelta.total_seconds` 值时无意中使用了这个属性:" + +#: ../../library/datetime.rst:328 +msgid "" +">>> import datetime as dt\n" +">>> duration = dt.timedelta(seconds=11235813)\n" +">>> duration.days, duration.seconds\n" +"(130, 3813)\n" +">>> duration.total_seconds()\n" +"11235813.0" +msgstr "" +">>> import datetime as dt\n" +">>> duration = dt.timedelta(seconds=11235813)\n" +">>> duration.days, duration.seconds\n" +"(130, 3813)\n" +">>> duration.total_seconds()\n" +"11235813.0" + +#: ../../library/datetime.rst:340 +msgid "Between 0 and 999,999 inclusive." +msgstr "0 至 999,999 闭区间。" + +#: ../../library/datetime.rst:343 ../../library/datetime.rst:663 +#: ../../library/datetime.rst:1275 +msgid "Supported operations:" +msgstr "支持的运算:" + +#: ../../library/datetime.rst:346 ../../library/datetime.rst:666 +#: ../../library/datetime.rst:1278 +msgid "Operation" +msgstr "运算" + +#: ../../library/datetime.rst:346 ../../library/datetime.rst:666 +#: ../../library/datetime.rst:1278 +msgid "Result" +msgstr "结果:" + +#: ../../library/datetime.rst:348 +msgid "``t1 = t2 + t3``" +msgstr "``t1 = t2 + t3``" + +#: ../../library/datetime.rst:348 +msgid "" +"Sum of ``t2`` and ``t3``. Afterwards ``t1 - t2 == t3`` and ``t1 - t3 == t2``" +" are true. (1)" +msgstr "" +"``t2`` 和 ``t3`` 之和。 运算后 ``t1 - t2 == t3`` 且 ``t1 - t3 == t2`` 为真值。 (1)" + +#: ../../library/datetime.rst:352 +msgid "``t1 = t2 - t3``" +msgstr "``t1 = t2 - t3``" + +#: ../../library/datetime.rst:352 +msgid "" +"Difference of ``t2`` and ``t3``. Afterwards ``t1 == t2 - t3`` and ``t2 == " +"t1 + t3`` are true. (1)(6)" +msgstr "" +"``t2`` 和 ``t3`` 之差。 运算后 ``t1 == t2 - t3`` 且 ``t2 == t1 + t3`` 为真值。 (1)(6)" + +#: ../../library/datetime.rst:356 +msgid "``t1 = t2 * i or t1 = i * t2``" +msgstr "``t1 = t2 * i or t1 = i * t2``" + +#: ../../library/datetime.rst:356 +msgid "" +"Delta multiplied by an integer. Afterwards ``t1 // i == t2`` is true, " +"provided ``i != 0``." +msgstr "时差乘以一个整数。 运算后如果 ``i != 0`` 则 ``t1 // i == t2`` 为真值。" + +#: ../../library/datetime.rst:360 +msgid "In general, ``t1 * i == t1 * (i-1) + t1`` is true. (1)" +msgstr "通常情况下,``t1 * i == t1 * (i-1) + t1`` 为真值。 (1)" + +#: ../../library/datetime.rst:363 +msgid "``t1 = t2 * f or t1 = f * t2``" +msgstr "``t1 = t2 * f or t1 = f * t2``" + +#: ../../library/datetime.rst:363 +msgid "" +"Delta multiplied by a float. The result is rounded to the nearest multiple " +"of timedelta.resolution using round-half-to-even." +msgstr "乘以一个浮点数,结果会被舍入到 timedelta 最接近的整数倍。 精度使用四舍五偶入奇不入规则。" + +#: ../../library/datetime.rst:367 +msgid "``f = t2 / t3``" +msgstr "``f = t2 / t3``" + +#: ../../library/datetime.rst:367 +msgid "" +"Division (3) of overall duration ``t2`` by interval unit ``t3``. Returns a " +":class:`float` object." +msgstr "总时长 ``t2`` 除以间隔单位 ``t3`` (3)。 返回一个 :class:`float` 对象。" + +#: ../../library/datetime.rst:371 +msgid "``t1 = t2 / f or t1 = t2 / i``" +msgstr "``t1 = t2 / f or t1 = t2 / i``" + +#: ../../library/datetime.rst:371 +msgid "" +"Delta divided by a float or an int. The result is rounded to the nearest " +"multiple of timedelta.resolution using round-half-to-even." +msgstr "除以一个浮点数或整数。 结果会被舍入到 timedelta 最接近的整数倍。 精度使用四舍五偶入奇不入规则。" + +#: ../../library/datetime.rst:375 +msgid "``t1 = t2 // i`` or ``t1 = t2 // t3``" +msgstr "``t1 = t2 // i`` or ``t1 = t2 // t3``" + +#: ../../library/datetime.rst:375 +msgid "" +"The floor is computed and the remainder (if any) is thrown away. In the " +"second case, an integer is returned. (3)" +msgstr "计算底数,其余部分(如果有)将被丢弃。在第二种情况下,将返回整数。 (3)" + +#: ../../library/datetime.rst:379 +msgid "``t1 = t2 % t3``" +msgstr "``t1 = t2 % t3``" + +#: ../../library/datetime.rst:379 +msgid "The remainder is computed as a :class:`timedelta` object. (3)" +msgstr "余数为一个 :class:`timedelta` 对象。(3)" + +#: ../../library/datetime.rst:382 +msgid "``q, r = divmod(t1, t2)``" +msgstr "``q, r = divmod(t1, t2)``" + +#: ../../library/datetime.rst:382 +msgid "" +"Computes the quotient and the remainder: ``q = t1 // t2`` (3) and ``r = t1 %" +" t2``. ``q`` is an integer and ``r`` is a :class:`timedelta` object." +msgstr "" +"计算商和余数: ``q = t1 // t2`` (3) 和 ``r = t1 % t2``。 ``q`` 是一个整数而 ``r`` 是一个 " +":class:`timedelta` 对象。" + +#: ../../library/datetime.rst:387 +msgid "``+t1``" +msgstr "``+t1``" + +#: ../../library/datetime.rst:387 +msgid "Returns a :class:`timedelta` object with the same value. (2)" +msgstr "返回一个相同数值的 :class:`timedelta` 对象。" + +#: ../../library/datetime.rst:390 +msgid "``-t1``" +msgstr "``-t1``" + +#: ../../library/datetime.rst:390 +msgid "" +"Equivalent to ``timedelta(-t1.days, -t1.seconds, -t1.microseconds)``, and to" +" ``t1 * -1``. (1)(4)" +msgstr "" +"等价于 ``timedelta(-t1.days, -t1.seconds, -t1.microseconds)``,以及 ``t1 * -1``。 " +"(1)(4)" + +#: ../../library/datetime.rst:394 +msgid "``abs(t)``" +msgstr "``abs(t)``" + +#: ../../library/datetime.rst:394 +msgid "" +"Equivalent to ``+t`` when ``t.days >= 0``, and to ``-t`` when ``t.days < " +"0``. (2)" +msgstr "当 ``t.days >= 0`` 时等于 ``+t``,而当 ``t.days < 0`` 时等于 ``-t``。 (2)" + +#: ../../library/datetime.rst:397 +msgid "``str(t)``" +msgstr "``str(t)``" + +#: ../../library/datetime.rst:397 +msgid "" +"Returns a string in the form ``[D day[s], ][H]H:MM:SS[.UUUUUU]``, where D is" +" negative for negative ``t``. (5)" +msgstr "" +"返回一个形如 ``[D day[s], ][H]H:MM:SS[.UUUUUU]`` 的字符串,当 ``t`` 为负数的时候, D 也为负数。 (5)" + +#: ../../library/datetime.rst:401 +msgid "``repr(t)``" +msgstr "``repr(t)``" + +#: ../../library/datetime.rst:401 +msgid "" +"Returns a string representation of the :class:`timedelta` object as a " +"constructor call with canonical attribute values." +msgstr "返回一个 :class:`timedelta` 对象的字符串表示形式,作为附带正规属性值的构造器调用。" + +#: ../../library/datetime.rst:406 ../../library/datetime.rst:685 +#: ../../library/datetime.rst:2796 +msgid "Notes:" +msgstr "注释:" + +#: ../../library/datetime.rst:409 +msgid "This is exact but may overflow." +msgstr "结果正确,但可能会溢出。" + +#: ../../library/datetime.rst:412 +msgid "This is exact and cannot overflow." +msgstr "结果正确,不会溢出。" + +#: ../../library/datetime.rst:415 +msgid "Division by zero raises :exc:`ZeroDivisionError`." +msgstr "除以零将会引发 :exc:`ZeroDivisionError`。" + +#: ../../library/datetime.rst:418 +msgid "" +"``-timedelta.max`` is not representable as a :class:`timedelta` object." +msgstr "``-timedelta.max`` 不可以表示为一个 :class:`timedelta` 对象。" + +#: ../../library/datetime.rst:421 +msgid "" +"String representations of :class:`timedelta` objects are normalized " +"similarly to their internal representation. This leads to somewhat unusual " +"results for negative timedeltas. For example::" +msgstr ":class:`timedelta` 对象的字符串表示形式类似于其内部表示形式被规范化。对于负时间增量,这会导致一些不寻常的结果。例如::" + +#: ../../library/datetime.rst:425 +msgid "" +">>> timedelta(hours=-5)\n" +"datetime.timedelta(days=-1, seconds=68400)\n" +">>> print(_)\n" +"-1 day, 19:00:00" +msgstr "" +">>> timedelta(hours=-5)\n" +"datetime.timedelta(days=-1, seconds=68400)\n" +">>> print(_)\n" +"-1 day, 19:00:00" + +#: ../../library/datetime.rst:431 +msgid "" +"The expression ``t2 - t3`` will always be equal to the expression ``t2 + " +"(-t3)`` except when t3 is equal to ``timedelta.max``; in that case the " +"former will produce a result while the latter will overflow." +msgstr "" +"表达式 ``t2 - t3`` 通常与 ``t2 + (-t3)`` 是等价的,除非 t3 等于 ``timedelta.max``; " +"在这种情况下前者会返回结果,而后者则会溢出。" + +#: ../../library/datetime.rst:435 +msgid "" +"In addition to the operations listed above, :class:`timedelta` objects " +"support certain additions and subtractions with :class:`date` and " +":class:`.datetime` objects (see below)." +msgstr "" +"除了上面列举的操作以外,:class:`timedelta` 对象还支持与 :class:`date` 和 :class:`.datetime` " +"对象进行特定的相加和相减运算(见下文)。" + +#: ../../library/datetime.rst:439 +msgid "" +"Floor division and true division of a :class:`timedelta` object by another " +":class:`!timedelta` object are now supported, as are remainder operations " +"and the :func:`divmod` function. True division and multiplication of a " +":class:`!timedelta` object by a :class:`float` object are now supported." +msgstr "" +"现已支持 :class:`timedelta` 对象与另一个 :class:`!timedelta` 对象间的向下取整除法或真除法,包括求余运算和 " +":func:`divmod` 函数。 :class:`!timedelta` 对象与 :class:`float` " +"对象间的真除法和乘法现在也已受到支持。" + +#: ../../library/datetime.rst:445 +msgid ":class:`timedelta` objects support equality and order comparisons." +msgstr ":class:`timedelta` 对象支持相等性和顺序比较。" + +#: ../../library/datetime.rst:447 +msgid "" +"In Boolean contexts, a :class:`timedelta` object is considered to be true if" +" and only if it isn't equal to ``timedelta(0)``." +msgstr "在布尔运算中,:class:`timedelta` 对象当且仅当其不等于 ``timedelta(0)`` 时则会被视为真值。" + +#: ../../library/datetime.rst:450 ../../library/datetime.rst:727 +#: ../../library/datetime.rst:1366 ../../library/datetime.rst:1995 +msgid "Instance methods:" +msgstr "实例方法:" + +#: ../../library/datetime.rst:454 +msgid "" +"Return the total number of seconds contained in the duration. Equivalent to " +"``td / timedelta(seconds=1)``. For interval units other than seconds, use " +"the division form directly (for example, ``td / " +"timedelta(microseconds=1)``)." +msgstr "" +"返回时间区间包含的总秒数。 等价于 ``td / timedelta(seconds=1)``。 对于秒以外的间隔单位,可直接使用除法形式 " +"(例如,``td / timedelta(microseconds=1)``)。" + +#: ../../library/datetime.rst:458 +msgid "" +"Note that for very large time intervals (greater than 270 years on most " +"platforms) this method will lose microsecond accuracy." +msgstr "需要注意的是,时间间隔较大时,这个方法的结果中的微秒将会失真(大多数平台上大于270年视为一个较大的时间间隔)。" + +#: ../../library/datetime.rst:465 +msgid "Examples of usage: :class:`!timedelta`" +msgstr "用法示例: :class:`!timedelta`" + +#: ../../library/datetime.rst:467 +msgid "An additional example of normalization::" +msgstr "一个标准化的附加示例::" + +#: ../../library/datetime.rst:469 +msgid "" +">>> # Components of another_year add up to exactly 365 days\n" +">>> import datetime as dt\n" +">>> year = dt.timedelta(days=365)\n" +">>> another_year = dt.timedelta(weeks=40, days=84, hours=23,\n" +"... minutes=50, seconds=600)\n" +">>> year == another_year\n" +"True\n" +">>> year.total_seconds()\n" +"31536000.0" +msgstr "" +">>> # another_year 的部分增加恰好 365 天\n" +">>> import datetime as dt\n" +">>> year = dt.timedelta(days=365)\n" +">>> another_year = dt.timedelta(weeks=40, days=84, hours=23,\n" +"... minutes=50, seconds=600)\n" +">>> year == another_year\n" +"True\n" +">>> year.total_seconds()\n" +"31536000.0" + +#: ../../library/datetime.rst:479 +msgid "Examples of :class:`timedelta` arithmetic::" +msgstr ":class:`timedelta` 算术运算的示例::" + +#: ../../library/datetime.rst:481 +msgid "" +">>> import datetime as dt\n" +">>> year = dt.timedelta(days=365)\n" +">>> ten_years = 10 * year\n" +">>> ten_years\n" +"datetime.timedelta(days=3650)\n" +">>> ten_years.days // 365\n" +"10\n" +">>> nine_years = ten_years - year\n" +">>> nine_years\n" +"datetime.timedelta(days=3285)\n" +">>> three_years = nine_years // 3\n" +">>> three_years, three_years.days // 365\n" +"(datetime.timedelta(days=1095), 3)" +msgstr "" +">>> import datetime as dt\n" +">>> year = dt.timedelta(days=365)\n" +">>> ten_years = 10 * year\n" +">>> ten_years\n" +"datetime.timedelta(days=3650)\n" +">>> ten_years.days // 365\n" +"10\n" +">>> nine_years = ten_years - year\n" +">>> nine_years\n" +"datetime.timedelta(days=3285)\n" +">>> three_years = nine_years // 3\n" +">>> three_years, three_years.days // 365\n" +"(datetime.timedelta(days=1095), 3)" + +#: ../../library/datetime.rst:499 +msgid ":class:`!date` objects" +msgstr ":class:`!date` 对象" + +#: ../../library/datetime.rst:501 +msgid "" +"A :class:`date` object represents a date (year, month and day) in an " +"idealized calendar, the current Gregorian calendar indefinitely extended in " +"both directions." +msgstr ":class:`date` 对象代表一个理想化历法中的日期(年、月和日),即当今的格列高利历向前后两个方向无限延伸。" + +#: ../../library/datetime.rst:505 +msgid "" +"January 1 of year 1 is called day number 1, January 2 of year 1 is called " +"day number 2, and so on. [#]_" +msgstr "公元 1 年 1 月 1日是第 1 日,公元 1 年 1 月 2 日是第 2 日,依此类推。 [#]_" + +#: ../../library/datetime.rst:510 +msgid "" +"All arguments are required. Arguments must be integers, in the following " +"ranges:" +msgstr "所有参数都是必要的。 参数必须是在下面范围内的整数:" + +#: ../../library/datetime.rst:513 +msgid "``MINYEAR <= year <= MAXYEAR``" +msgstr "``MINYEAR <= year <= MAXYEAR``" + +#: ../../library/datetime.rst:514 +msgid "``1 <= month <= 12``" +msgstr "``1 <= month <= 12``" + +#: ../../library/datetime.rst:515 +msgid "``1 <= day <= number of days in the given month and year``" +msgstr "``1 <= 日期 <= 给定年月对应的天数``" + +#: ../../library/datetime.rst:517 ../../library/datetime.rst:948 +msgid "" +"If an argument outside those ranges is given, :exc:`ValueError` is raised." +msgstr "如果参数不在这些范围内,则抛出 :exc:`ValueError` 异常。" + +#: ../../library/datetime.rst:520 ../../library/datetime.rst:954 +msgid "Other constructors, all class methods:" +msgstr "其它构造器,所有的类方法:" + +#: ../../library/datetime.rst:524 +msgid "Return the current local date." +msgstr "返回当前的本地日期。" + +#: ../../library/datetime.rst:526 +msgid "This is equivalent to ``date.fromtimestamp(time.time())``." +msgstr "这等价于 ``date.fromtimestamp(time.time())``。" + +#: ../../library/datetime.rst:531 +msgid "" +"Return the local date corresponding to the POSIX *timestamp*, such as is " +"returned by :func:`time.time`." +msgstr "返回对应于 POSIX *时间戳* 的本地时间,例如 :func:`time.time` 所返回的值。" + +#: ../../library/datetime.rst:534 +msgid "" +"This may raise :exc:`OverflowError`, if the timestamp is out of the range of" +" values supported by the platform C :c:func:`localtime` function, and " +":exc:`OSError` on :c:func:`localtime` failure. It's common for this to be " +"restricted to years from 1970 through 2038. Note that on non-POSIX systems " +"that include leap seconds in their notion of a timestamp, leap seconds are " +"ignored by :meth:`fromtimestamp`." +msgstr "" +"这可能引发 :exc:`OverflowError`,如果时间戳数值超出所在平台 C :c:func:`localtime` " +"函数的支持范围的话,并且会在 :c:func:`localtime` 出错时引发 :exc:`OSError`。 通常该数值会被限制在 1970 年至 " +"2038 年之间。 请注意在时间戳概念包含闰秒的非 POSIX 系统上,闰秒会被 :meth:`fromtimestamp` 所忽略。" + +#: ../../library/datetime.rst:541 +msgid "" +"Raise :exc:`OverflowError` instead of :exc:`ValueError` if the timestamp is " +"out of the range of values supported by the platform C :c:func:`localtime` " +"function. Raise :exc:`OSError` instead of :exc:`ValueError` on " +":c:func:`localtime` failure." +msgstr "" +"引发 :exc:`OverflowError` 而不是 :exc:`ValueError`,如果时间戳数值超出所在平台 C " +":c:func:`localtime` 函数的支持范围的话,并会在 :c:func:`localtime` 出错时引发 :exc:`OSError` " +"而不是 :exc:`ValueError`。" + +#: ../../library/datetime.rst:547 ../../library/datetime.rst:1042 +#: ../../library/datetime.rst:1082 +msgid "Accepts any real number as *timestamp*, not only integer or float." +msgstr "接受任何实数作为 *timestamp*,而不是只接受整数或浮点数。" + +#: ../../library/datetime.rst:553 +msgid "" +"Return the date corresponding to the proleptic Gregorian *ordinal*, where " +"January 1 of year 1 has ordinal 1." +msgstr "返回对应于格列高利历 *序号* 的日期,其中公元 1 年 1 月 1 日的序号为 1。" + +#: ../../library/datetime.rst:556 +msgid "" +":exc:`ValueError` is raised unless ``1 <= ordinal <= date.max.toordinal()``." +" For any date ``d``, ``date.fromordinal(d.toordinal()) == d``." +msgstr "" +"除非 ``1 <= ordinal <= date.max.toordinal()`` 否则会引发 :exc:`ValueError`。 对于任意的日期" +" ``d``,均有 ``date.fromordinal(d.toordinal()) == d``。" + +#: ../../library/datetime.rst:563 +msgid "" +"Return a :class:`date` corresponding to a *date_string* given in any valid " +"ISO 8601 format, with the following exceptions:" +msgstr "返回一个对应于以任何有效 ISO 8601 格式给出的 *date_string* 的 :class:`date`,下列格式除外:" + +#: ../../library/datetime.rst:566 ../../library/datetime.rst:1123 +msgid "" +"Reduced precision dates are not currently supported (``YYYY-MM``, ``YYYY``)." +msgstr "目前不支持降低精度的日期 (``YYYY-MM``, ``YYYY``)。" + +#: ../../library/datetime.rst:568 ../../library/datetime.rst:1125 +msgid "" +"Extended date representations are not currently supported (``±YYYYYY-MM-" +"DD``)." +msgstr "目前不支持扩展日期表示形式 (``±YYYYYY-MM-DD``)。" + +#: ../../library/datetime.rst:570 ../../library/datetime.rst:1127 +msgid "Ordinal dates are not currently supported (``YYYY-OOO``)." +msgstr "目前不支持序数日期 (``YYYY-OOO``)。" + +#: ../../library/datetime.rst:572 ../../library/datetime.rst:1129 +#: ../../library/datetime.rst:1604 +msgid "Examples::" +msgstr "示例::" + +#: ../../library/datetime.rst:574 +msgid "" +">>> import datetime as dt\n" +">>> dt.date.fromisoformat('2019-12-04')\n" +"datetime.date(2019, 12, 4)\n" +">>> dt.date.fromisoformat('20191204')\n" +"datetime.date(2019, 12, 4)\n" +">>> dt.date.fromisoformat('2021-W01-1')\n" +"datetime.date(2021, 1, 4)" +msgstr "" +">>> import datetime as dt\n" +">>> dt.date.fromisoformat('2019-12-04')\n" +"datetime.date(2019, 12, 4)\n" +">>> dt.date.fromisoformat('20191204')\n" +"datetime.date(2019, 12, 4)\n" +">>> dt.date.fromisoformat('2021-W01-1')\n" +"datetime.date(2021, 1, 4)" + +#: ../../library/datetime.rst:583 +msgid "Previously, this method only supported the format ``YYYY-MM-DD``." +msgstr "在之前版本中,此方法仅支持一种格式 ``YYYY-MM-DD``。" + +#: ../../library/datetime.rst:589 +msgid "" +"Return a :class:`date` corresponding to the ISO calendar date specified by " +"*year*, *week* and *day*. This is the inverse of the function " +":meth:`date.isocalendar`." +msgstr "" +"返回对应于由 *year*, *week* 和 *day* 指定的 ISO 历法日期的 :class:`date`。 这是函数 " +":meth:`date.isocalendar` 的逆操作。" + +#: ../../library/datetime.rst:597 +msgid "" +"Return a :class:`.date` corresponding to *date_string*, parsed according to " +"*format*. This is equivalent to::" +msgstr "返回一个对应于 *date_string*,根据 *format* 进行解析得到的 :class:`.date`。 这等价于::" + +#: ../../library/datetime.rst:600 +msgid "date(*(time.strptime(date_string, format)[0:3]))" +msgstr "date(*(time.strptime(date_string, format)[0:3]))" + +#: ../../library/datetime.rst:602 +msgid "" +":exc:`ValueError` is raised if the date_string and format can't be parsed by" +" :func:`time.strptime` or if it returns a value which isn't a time tuple. " +"See also :ref:`strftime-strptime-behavior` and :meth:`date.fromisoformat`." +msgstr "" +"如果 date_string 和 format 无法被 :func:`time.strptime` 解析或它返回一个不是时间元组的值则将引发 " +":exc:`ValueError`。 另请参阅 :ref:`strftime-strptime-behavior` 和 " +":meth:`date.fromisoformat`。" + +#: ../../library/datetime.rst:609 ../../library/datetime.rst:1184 +msgid "" +"If *format* specifies a day of month (``%d``) without a year, " +":exc:`ValueError` is raised. This is to avoid a quadrennial leap year bug " +"in code seeking to parse only a month and day as the default year used in " +"absence of one in the format is not a leap year. The workaround is to always" +" include a year in your *format*. If parsing *date_string* values that do " +"not have a year, explicitly add a year that is a leap year before parsing:" +msgstr "" + +#: ../../library/datetime.rst:617 +msgid "" +">>> import datetime as dt\n" +">>> date_string = \"02/29\"\n" +">>> when = dt.date.strptime(f\"{date_string};1984\", \"%m/%d;%Y\") # Avoids leap year bug.\n" +">>> when.strftime(\"%B %d\")\n" +"'February 29'" +msgstr "" +">>> import datetime as dt\n" +">>> date_string = \"02/29\"\n" +">>> when = dt.date.strptime(f\"{date_string};1984\", \"%m/%d;%Y\") # 避免闰年 BUG。\n" +">>> when.strftime(\"%B %d\")\n" +"'February 29'" + +#: ../../library/datetime.rst:632 +msgid "The earliest representable date, ``date(MINYEAR, 1, 1)``." +msgstr "最小的日期 ``date(MINYEAR, 1, 1)`` 。" + +#: ../../library/datetime.rst:637 +msgid "The latest representable date, ``date(MAXYEAR, 12, 31)``." +msgstr "最大的日期 ,``date(MAXYEAR, 12, 31)``。" + +#: ../../library/datetime.rst:642 +msgid "" +"The smallest possible difference between non-equal date objects, " +"``timedelta(days=1)``." +msgstr "两个日期对象的最小间隔,``timedelta(days=1)``。" + +#: ../../library/datetime.rst:650 ../../library/datetime.rst:1225 +msgid "Between :const:`MINYEAR` and :const:`MAXYEAR` inclusive." +msgstr "在 :const:`MINYEAR` 和 :const:`MAXYEAR` 之间,包含边界。" + +#: ../../library/datetime.rst:655 ../../library/datetime.rst:1230 +msgid "Between 1 and 12 inclusive." +msgstr "1 至 12(含)" + +#: ../../library/datetime.rst:660 ../../library/datetime.rst:1235 +msgid "Between 1 and the number of days in the given month of the given year." +msgstr "返回1到指定年月的天数间的数字。" + +#: ../../library/datetime.rst:668 +msgid "``date2 = date1 + timedelta``" +msgstr "``date2 = date1 + timedelta``" + +#: ../../library/datetime.rst:668 +msgid "``date2`` will be ``timedelta.days`` days after ``date1``. (1)" +msgstr "``date2`` 将为 ``date1`` 之后的 ``timedelta.days`` 日。 (1)" + +#: ../../library/datetime.rst:671 +msgid "``date2 = date1 - timedelta``" +msgstr "``date2 = date1 - timedelta``" + +#: ../../library/datetime.rst:671 +msgid "Computes ``date2`` such that ``date2 + timedelta == date1``. (2)" +msgstr "计算 ``date2`` 使得 ``date2 + timedelta == date1``。 (2)" + +#: ../../library/datetime.rst:674 +msgid "``timedelta = date1 - date2``" +msgstr "``timedelta = date1 - date2``" + +#: ../../library/datetime.rst:674 ../../library/datetime.rst:1284 +msgid "\\(3)" +msgstr "\\(3)" + +#: ../../library/datetime.rst:0 +msgid "``date1 == date2``" +msgstr "``date1 == date2``" + +#: ../../library/datetime.rst:0 +msgid "``date1 != date2``" +msgstr "``date1 != date2``" + +#: ../../library/datetime.rst:676 ../../library/datetime.rst:1286 +msgid "Equality comparison. (4)" +msgstr "相等性比较。 (4)" + +#: ../../library/datetime.rst:0 +msgid "``date1 < date2``" +msgstr "``date1 < date2``" + +#: ../../library/datetime.rst:0 +msgid "``date1 > date2``" +msgstr "``date1 > date2``" + +#: ../../library/datetime.rst:0 +msgid "``date1 <= date2``" +msgstr "``date1 <= date2``" + +#: ../../library/datetime.rst:0 +msgid "``date1 >= date2``" +msgstr "``date1 >= date2``" + +#: ../../library/datetime.rst:679 ../../library/datetime.rst:1289 +msgid "Order comparison. (5)" +msgstr "顺序比较。 (5)" + +#: ../../library/datetime.rst:688 +msgid "" +"*date2* is moved forward in time if ``timedelta.days > 0``, or backward if " +"``timedelta.days < 0``. Afterward ``date2 - date1 == timedelta.days``. " +"``timedelta.seconds`` and ``timedelta.microseconds`` are ignored. " +":exc:`OverflowError` is raised if ``date2.year`` would be smaller than " +":const:`MINYEAR` or larger than :const:`MAXYEAR`." +msgstr "" +"如果 ``timedelta.days > 0`` 则 *date2* 将在时间线上前进,如果 ``timedelta.days < 0`` 则将后退。" +" 操作完成后 ``date2 - date1 == timedelta.days``。 ``timedelta.seconds`` 和 " +"``timedelta.microseconds`` 会被忽略。 如果 ``date2.year`` 将小于 :const:`MINYEAR` 或大于 " +":const:`MAXYEAR` 则会引发 :exc:`OverflowError`。" + +#: ../../library/datetime.rst:695 +msgid "``timedelta.seconds`` and ``timedelta.microseconds`` are ignored." +msgstr "``timedelta.seconds`` 和 ``timedelta.microseconds`` 会被忽略。" + +#: ../../library/datetime.rst:698 +msgid "" +"This is exact, and cannot overflow. ``timedelta.seconds`` and " +"``timedelta.microseconds`` are 0, and ``date2 + timedelta == date1`` after." +msgstr "" +"该值是精确的,且不会溢出。 运算后 ``timedelta.seconds`` 和 ``timedelta.microseconds`` 均为 0,且 " +"``date2 + timedelta == date1``。" + +#: ../../library/datetime.rst:702 +msgid ":class:`date` objects are equal if they represent the same date." +msgstr ":class:`date` 对象在表示相同的日期时相等。" + +#: ../../library/datetime.rst:704 +msgid "" +":class:`!date` objects that are not also :class:`.datetime` instances are " +"never equal to :class:`!datetime` objects, even if they represent the same " +"date." +msgstr "" +"不属于 :class:`.datetime` 实例的 :class:`!date` 对象永远不会与 :class:`!datetime` " +"对象相等,即使它们表示相同的日期。" + +#: ../../library/datetime.rst:709 +msgid "" +"*date1* is considered less than *date2* when *date1* precedes *date2* in " +"time. In other words, ``date1 < date2`` if and only if ``date1.toordinal() <" +" date2.toordinal()``." +msgstr "" +"当 *date1* 的时间在 *date2* 之前则认为 *date1* 小于 *date2*。 换句话说,当且仅当 " +"``date1.toordinal() < date2.toordinal()`` 时 ``date1 < date2``。" + +#: ../../library/datetime.rst:713 +msgid "" +"Order comparison between a :class:`date` object that is not also a " +":class:`.datetime` instance and a :class:`!datetime` object raises " +":exc:`TypeError`." +msgstr "" +"不同时为 :class:`.datetime` 实例的 :class:`date` 对象和 :class:`!datetime` " +"对象之间的顺序比较将会引发 :exc:`TypeError`。" + +#: ../../library/datetime.rst:717 ../../library/datetime.rst:1357 +msgid "" +"Comparison between :class:`.datetime` object and an instance of the " +":class:`date` subclass that is not a :class:`!datetime` subclass no longer " +"converts the latter to :class:`!date`, ignoring the time part and the time " +"zone. The default behavior can be changed by overriding the special " +"comparison methods in subclasses." +msgstr "" +"在 :class:`.datetime` 对象和不属于 :class:`!datetime` 子类的 :class:`date` " +"子类的实例之间进行比较时不会再将后者转换为 :class:`!date`,并忽略时间部分和时区信息。 此默认行为可以通过在子类中重写特殊比较方法来更改。" + +#: ../../library/datetime.rst:725 +msgid "" +"In Boolean contexts, all :class:`date` objects are considered to be true." +msgstr "在布尔运算中,所有 :class:`date` 对象都会被视为真值。" + +#: ../../library/datetime.rst:731 +msgid "" +"Return a new :class:`date` object with the same values, but with specified " +"parameters updated." +msgstr "返回一个具有同样的值,但更新了指定形参的新的 :class:`date` 对象。" + +#: ../../library/datetime.rst:734 ../../library/datetime.rst:2041 +msgid "Example::" +msgstr "示例::" + +#: ../../library/datetime.rst:736 +msgid "" +">>> import datetime as dt\n" +">>> d = dt.date(2002, 12, 31)\n" +">>> d.replace(day=26)\n" +"datetime.date(2002, 12, 26)" +msgstr "" +">>> import datetime as dt\n" +">>> d = dt.date(2002, 12, 31)\n" +">>> d.replace(day=26)\n" +"datetime.date(2002, 12, 26)" + +#: ../../library/datetime.rst:741 +msgid "" +"The generic function :func:`copy.replace` also supports :class:`date` " +"objects." +msgstr "泛型函数 :func:`copy.replace` 也支持 :class:`date` 对象。" + +#: ../../library/datetime.rst:747 ../../library/datetime.rst:1482 +msgid "" +"Return a :class:`time.struct_time` such as returned by " +":func:`time.localtime`." +msgstr "返回一个 :class:`time.struct_time`,即 :func:`time.localtime` 所返回的类型。" + +#: ../../library/datetime.rst:749 +msgid "The hours, minutes and seconds are 0, and the DST flag is -1." +msgstr "hours, minutes 和 seconds 值均为 0,且 DST 旗标值为 -1。" + +#: ../../library/datetime.rst:751 ../../library/datetime.rst:1484 +msgid "``d.timetuple()`` is equivalent to::" +msgstr "``d.timetuple()`` 等价于::" + +#: ../../library/datetime.rst:753 +msgid "" +"time.struct_time((d.year, d.month, d.day, 0, 0, 0, d.weekday(), yday, -1))" +msgstr "" +"time.struct_time((d.year, d.month, d.day, 0, 0, 0, d.weekday(), yday, -1))" + +#: ../../library/datetime.rst:755 +msgid "" +"where ``yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1`` is the " +"day number within the current year starting with 1 for January 1st." +msgstr "" +"其中 ``yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1`` " +"是当前年份中的日期序号,起始值 1 表示 1 月 1 日。" + +#: ../../library/datetime.rst:761 +msgid "" +"Return the proleptic Gregorian ordinal of the date, where January 1 of year " +"1 has ordinal 1. For any :class:`date` object ``d``, " +"``date.fromordinal(d.toordinal()) == d``." +msgstr "" +"返回日期的预期格列高利历序号,其中公元 1 年 1 月 1 日的序号为 1. 对于任意的 :class:`date` 对象 ``d``,均有 " +"``date.fromordinal(d.toordinal()) == d``。" + +#: ../../library/datetime.rst:768 +msgid "" +"Return the day of the week as an integer, where Monday is 0 and Sunday is 6." +" For example, ``date(2002, 12, 4).weekday() == 2``, a Wednesday. See also " +":meth:`isoweekday`." +msgstr "" +"返回一个整数代表星期几,星期一为0,星期天为6。例如, ``date(2002, 12, 4).weekday() == 2``,表示的是星期三。参阅 " +":meth:`isoweekday`。" + +#: ../../library/datetime.rst:775 +msgid "" +"Return the day of the week as an integer, where Monday is 1 and Sunday is 7." +" For example, ``date(2002, 12, 4).isoweekday() == 3``, a Wednesday. See also" +" :meth:`weekday`, :meth:`isocalendar`." +msgstr "" +"返回一个整数代表星期几,星期一为 1,星期天为 7。 例如: ``date(2002, 12, 4).isoweekday() == 3`` " +"表示星期三。 参见 :meth:`weekday`, :meth:`isocalendar`。" + +#: ../../library/datetime.rst:782 +msgid "" +"Return a :term:`named tuple` object with three components: ``year``, " +"``week`` and ``weekday``." +msgstr "返回一个由三部分组成的 :term:`named tuple` 对象: ``year``, ``week`` 和 ``weekday``。" + +#: ../../library/datetime.rst:785 +msgid "" +"The ISO calendar is a widely used variant of the Gregorian calendar. [#]_" +msgstr "ISO 历法是一种被广泛使用的格列高利历。 [#]_" + +#: ../../library/datetime.rst:787 +msgid "" +"The ISO year consists of 52 or 53 full weeks, and where a week starts on a " +"Monday and ends on a Sunday. The first week of an ISO year is the first " +"(Gregorian) calendar week of a year containing a Thursday. This is called " +"week number 1, and the ISO year of that Thursday is the same as its " +"Gregorian year." +msgstr "" +"ISO 年由 52 或 53 个完整星期构成,每个星期开始于星期一结束于星期日。 一个 ISO " +"年的第一个星期就是(格列高利)历法的一年中第一个包含星期四的星期。 这被称为 1 号星期,这个星期四所在的 ISO 年与其所在的格列高利年相同。" + +#: ../../library/datetime.rst:792 +msgid "" +"For example, 2004 begins on a Thursday, so the first week of ISO year 2004 " +"begins on Monday, 29 Dec 2003 and ends on Sunday, 4 Jan 2004::" +msgstr "" +"例如,2004 年的第一天是星期四,因此 ISO 2004 年的第一个星期开始于 2003 年 12 月 29 日星期一,结束于 2004 年 1 月 " +"4 日星期日::" + +#: ../../library/datetime.rst:795 +msgid "" +">>> import datetime as dt\n" +">>> dt.date(2003, 12, 29).isocalendar()\n" +"datetime.IsoCalendarDate(year=2004, week=1, weekday=1)\n" +">>> dt.date(2004, 1, 4).isocalendar()\n" +"datetime.IsoCalendarDate(year=2004, week=1, weekday=7)" +msgstr "" +">>> import datetime as dt\n" +">>> dt.date(2003, 12, 29).isocalendar()\n" +"datetime.IsoCalendarDate(year=2004, week=1, weekday=1)\n" +">>> dt.date(2004, 1, 4).isocalendar()\n" +"datetime.IsoCalendarDate(year=2004, week=1, weekday=7)" + +#: ../../library/datetime.rst:801 +msgid "Result changed from a tuple to a :term:`named tuple`." +msgstr "结果由元组改为 :term:`named tuple`。" + +#: ../../library/datetime.rst:807 +msgid "" +"Return a string representing the date in ISO 8601 format, ``YYYY-MM-DD``::" +msgstr "返回一个以 ISO 8601 格式 ``YYYY-MM-DD`` 来表示日期的字符串::" + +#: ../../library/datetime.rst:809 +msgid "" +">>> import datetime as dt\n" +">>> dt.date(2002, 12, 4).isoformat()\n" +"'2002-12-04'" +msgstr "" +">>> import datetime as dt\n" +">>> dt.date(2002, 12, 4).isoformat()\n" +"'2002-12-04'" + +#: ../../library/datetime.rst:816 +msgid "For a date ``d``, ``str(d)`` is equivalent to ``d.isoformat()``." +msgstr "对于日期 ``d``,``str(d)`` 等价于 ``d.isoformat()``。" + +#: ../../library/datetime.rst:821 +msgid "Return a string representing the date::" +msgstr "返回一个表示日期的字符串::" + +#: ../../library/datetime.rst:823 +msgid "" +">>> import datetime as dt\n" +">>> dt.date(2002, 12, 4).ctime()\n" +"'Wed Dec 4 00:00:00 2002'" +msgstr "" +">>> import datetime as dt\n" +">>> dt.date(2002, 12, 4).ctime()\n" +"'Wed Dec 4 00:00:00 2002'" + +#: ../../library/datetime.rst:827 ../../library/datetime.rst:1675 +msgid "``d.ctime()`` is equivalent to::" +msgstr "``d.ctime()`` 等效于::" + +#: ../../library/datetime.rst:829 ../../library/datetime.rst:1677 +msgid "time.ctime(time.mktime(d.timetuple()))" +msgstr "time.ctime(time.mktime(d.timetuple()))" + +#: ../../library/datetime.rst:831 +msgid "" +"on platforms where the native C :c:func:`ctime` function (which " +":func:`time.ctime` invokes, but which :meth:`date.ctime` does not invoke) " +"conforms to the C standard." +msgstr "" +"在原生 C :c:func:`ctime` 函数遵循 C 标准的平台上 (:func:`time.ctime` 会发起对该函数的调用,但 " +":meth:`date.ctime` 并不会) 。" + +#: ../../library/datetime.rst:838 +msgid "" +"Return a string representing the date, controlled by an explicit format " +"string. Format codes referring to hours, minutes or seconds will see 0 " +"values. See also :ref:`strftime-strptime-behavior` and " +":meth:`date.isoformat`." +msgstr "" +"返回一个由显式格式字符串所控制的,代表日期的字符串。 表示时、分或秒的格式代码值将为 0。 另请参阅 :ref:`strftime-strptime-" +"behavior` 和 :meth:`date.isoformat`。" + +#: ../../library/datetime.rst:845 +msgid "" +"Same as :meth:`.date.strftime`. This makes it possible to specify a format " +"string for a :class:`.date` object in :ref:`formatted string literals " +"` and when using :meth:`str.format`. See also :ref:`strftime-" +"strptime-behavior` and :meth:`date.isoformat`." +msgstr "" +"与 :meth:`.date.strftime` 相同。 此方法使得在 :ref:`格式化字符串字面值 ` 中以及使用 " +":meth:`str.format` 时为 :class:`.date` 对象指定格式字符串成为可能。 另请参阅 :ref:`strftime-" +"strptime-behavior` 和 :meth:`date.isoformat`。" + +#: ../../library/datetime.rst:852 +msgid "Examples of usage: :class:`!date`" +msgstr "用法示例: :class:`!date`" + +#: ../../library/datetime.rst:854 +msgid "Example of counting days to an event::" +msgstr "计算距离特定事件天数的例子::" + +#: ../../library/datetime.rst:856 +msgid "" +">>> import time\n" +">>> import datetime as dt\n" +">>> today = dt.date.today()\n" +">>> today\n" +"datetime.date(2007, 12, 5)\n" +">>> today == dt.date.fromtimestamp(time.time())\n" +"True\n" +">>> my_birthday = dt.date(today.year, 6, 24)\n" +">>> if my_birthday < today:\n" +"... my_birthday = my_birthday.replace(year=today.year + 1)\n" +"...\n" +">>> my_birthday\n" +"datetime.date(2008, 6, 24)\n" +">>> time_to_birthday = abs(my_birthday - today)\n" +">>> time_to_birthday.days\n" +"202" +msgstr "" +">>> import time\n" +">>> import datetime as dt\n" +">>> today = dt.date.today()\n" +">>> today\n" +"datetime.date(2007, 12, 5)\n" +">>> today == dt.date.fromtimestamp(time.time())\n" +"True\n" +">>> my_birthday = dt.date(today.year, 6, 24)\n" +">>> if my_birthday < today:\n" +"... my_birthday = my_birthday.replace(year=today.year + 1)\n" +"...\n" +">>> my_birthday\n" +"datetime.date(2008, 6, 24)\n" +">>> time_to_birthday = abs(my_birthday - today)\n" +">>> time_to_birthday.days\n" +"202" + +#: ../../library/datetime.rst:873 +msgid "More examples of working with :class:`date`:" +msgstr "使用 :class:`date` 的更多例子:" + +#: ../../library/datetime.rst:875 +msgid "" +">>> import datetime as dt\n" +">>> d = dt.date.fromordinal(730920) # 730920th day after 1. 1. 0001\n" +">>> d\n" +"datetime.date(2002, 3, 11)\n" +"\n" +">>> # Methods related to formatting string output\n" +">>> d.isoformat()\n" +"'2002-03-11'\n" +">>> d.strftime(\"%d/%m/%y\")\n" +"'11/03/02'\n" +">>> d.strftime(\"%A %d. %B %Y\")\n" +"'Monday 11. March 2002'\n" +">>> d.ctime()\n" +"'Mon Mar 11 00:00:00 2002'\n" +">>> 'The {1} is {0:%d}, the {2} is {0:%B}.'.format(d, \"day\", \"month\")\n" +"'The day is 11, the month is March.'\n" +"\n" +">>> # Methods for extracting 'components' under different calendars\n" +">>> t = d.timetuple()\n" +">>> for i in t:\n" +"... print(i)\n" +"2002 # year\n" +"3 # month\n" +"11 # day\n" +"0\n" +"0\n" +"0\n" +"0 # weekday (0 = Monday)\n" +"70 # 70th day in the year\n" +"-1\n" +">>> ic = d.isocalendar()\n" +">>> for i in ic:\n" +"... print(i)\n" +"2002 # ISO year\n" +"11 # ISO week number\n" +"1 # ISO day number ( 1 = Monday )\n" +"\n" +">>> # A date object is immutable; all operations produce a new object\n" +">>> d.replace(year=2005)\n" +"datetime.date(2005, 3, 11)" +msgstr "" +">>> import datetime as dt\n" +">>> d = dt.date.fromordinal(730920) # # 1. 1. 0001 之后的第 730920 天\n" +">>> d\n" +"datetime.date(2002, 3, 11)\n" +"\n" +">>> # 有关格式化字符串输出的方法\n" +">>> d.isoformat()\n" +"'2002-03-11'\n" +">>> d.strftime(\"%d/%m/%y\")\n" +"'11/03/02'\n" +">>> d.strftime(\"%A %d. %B %Y\")\n" +"'Monday 11. March 2002'\n" +">>> d.ctime()\n" +"'Mon Mar 11 00:00:00 2002'\n" +">>> 'The {1} is {0:%d}, the {2} is {0:%B}.'.format(d, \"day\", \"month\")\n" +"'The day is 11, the month is March.'\n" +"\n" +">>> # 用于提取不同历法中的‘部分’的方法\n" +">>> t = d.timetuple()\n" +">>> for i in t:\n" +"... print(i)\n" +"2002 # 年\n" +"3 # 月\n" +"11 # 日\n" +"0\n" +"0\n" +"0\n" +"0 # 周序号 (0 = 星期一)\n" +"70 # 当年的第 70 天\n" +"-1\n" +">>> ic = d.isocalendar()\n" +">>> for i in ic:\n" +"... print(i)\n" +"2002 # ISO 年\n" +"11 # ISO 第几周\n" +"1 # ISO 周序号 ( 1 = 星期一 )\n" +"\n" +">>> # 日期对象是不可变的;所有操作都将产生一个新对象\n" +">>> d.replace(year=2005)\n" +"datetime.date(2005, 3, 11)" + +#: ../../library/datetime.rst:922 +msgid ":class:`!datetime` objects" +msgstr ":class:`!datetime` 对象" + +#: ../../library/datetime.rst:924 +msgid "" +"A :class:`.datetime` object is a single object containing all the " +"information from a :class:`date` object and a :class:`.time` object." +msgstr "" +":class:`.datetime` 对象是包含来自 :class:`date` 对象和 :class:`.time` 对象的所有信息的单一对象。" + +#: ../../library/datetime.rst:927 +msgid "" +"Like a :class:`date` object, :class:`.datetime` assumes the current " +"Gregorian calendar extended in both directions; like a :class:`.time` " +"object, :class:`!datetime` assumes there are exactly 3600\\*24 seconds in " +"every day." +msgstr "" +"与 :class:`date` 对象类似,:class:`.datetime` 假定当前的格列高利历向前后两个方向无限延伸;与 " +":class:`.time` 对象类似,:class:`!datetime` 假定每一天恰好有 3600\\*24 秒。" + +#: ../../library/datetime.rst:931 +msgid "Constructor:" +msgstr "构造器 :" + +#: ../../library/datetime.rst:935 +msgid "" +"The *year*, *month* and *day* arguments are required. *tzinfo* may be " +"``None``, or an instance of a :class:`tzinfo` subclass. The remaining " +"arguments must be integers in the following ranges:" +msgstr "" +"*year*, *month* 和 *day* 参数是必须的。 *tzinfo* 可以是 ``None`` 或者是一个 :class:`tzinfo` " +"子类的实例。 其余的参数必须是在下面范围内的整数:" + +#: ../../library/datetime.rst:939 +msgid "``MINYEAR <= year <= MAXYEAR``," +msgstr "``MINYEAR <= year <= MAXYEAR``," + +#: ../../library/datetime.rst:940 +msgid "``1 <= month <= 12``," +msgstr "``1 <= month <= 12``," + +#: ../../library/datetime.rst:941 +msgid "``1 <= day <= number of days in the given month and year``," +msgstr "``1 <= day <= 指定年月的天数``," + +#: ../../library/datetime.rst:942 ../../library/datetime.rst:1840 +msgid "``0 <= hour < 24``," +msgstr "``0 <= hour < 24``," + +#: ../../library/datetime.rst:943 ../../library/datetime.rst:1841 +msgid "``0 <= minute < 60``," +msgstr "``0 <= minute < 60``," + +#: ../../library/datetime.rst:944 ../../library/datetime.rst:1842 +msgid "``0 <= second < 60``," +msgstr "``0 <= second < 60``," + +#: ../../library/datetime.rst:945 ../../library/datetime.rst:1843 +msgid "``0 <= microsecond < 1000000``," +msgstr "``0 <= microsecond < 1000000``," + +#: ../../library/datetime.rst:946 ../../library/datetime.rst:1844 +msgid "``fold in [0, 1]``." +msgstr "``fold in [0, 1]``." + +#: ../../library/datetime.rst:950 ../../library/datetime.rst:1403 +#: ../../library/datetime.rst:2008 +msgid "Added the *fold* parameter." +msgstr "增加了 *fold* 形参。" + +#: ../../library/datetime.rst:958 +msgid "Return the current local date and time, with :attr:`.tzinfo` ``None``." +msgstr "返回表示当前地方时的 date 和 time,其中 :attr:`.tzinfo` 为 ``None``。" + +#: ../../library/datetime.rst:960 +msgid "Equivalent to::" +msgstr "等价于::" + +#: ../../library/datetime.rst:962 +msgid "datetime.fromtimestamp(time.time())" +msgstr "datetime.fromtimestamp(time.time())" + +#: ../../library/datetime.rst:964 +msgid "See also :meth:`now`, :meth:`fromtimestamp`." +msgstr "另请参阅 :meth:`now`, :meth:`fromtimestamp`。" + +#: ../../library/datetime.rst:966 +msgid "" +"This method is functionally equivalent to :meth:`now`, but without a ``tz`` " +"parameter." +msgstr "此方法的功能等价于 :meth:`now`,但是不带 ``tz`` 形参。" + +#: ../../library/datetime.rst:972 +msgid "Return the current local date and time." +msgstr "返回表示当前地方时的 date 和 time 对象。" + +#: ../../library/datetime.rst:974 +msgid "" +"If optional argument *tz* is ``None`` or not specified, this is like " +":meth:`today`, but, if possible, supplies more precision than can be gotten " +"from going through a :func:`time.time` timestamp (for example, this may be " +"possible on platforms supplying the C :c:func:`gettimeofday` function)." +msgstr "" +"如果可选参数 *tz* 为 ``None`` 或未指定,这就类似于 :meth:`today`,但该方法会在可能的情况下提供比通过 " +":func:`time.time` 时间戳所获时间值更高的精度(例如,在提供了 C :c:func:`gettimeofday` " +"函数的平台上就可以做到这一点)。" + +#: ../../library/datetime.rst:980 +msgid "" +"If *tz* is not ``None``, it must be an instance of a :class:`tzinfo` " +"subclass, and the current date and time are converted to *tz*’s time zone." +msgstr "" +"如果 *tz* 不为 ``None``,它必须是 :class:`tzinfo` 子类的一个实例,并且当前日期和时间将被转换到 *tz* 时区。" + +#: ../../library/datetime.rst:983 +msgid "This function is preferred over :meth:`today` and :meth:`utcnow`." +msgstr "此函数可以替代 :meth:`today` 和 :meth:`utcnow`。" + +#: ../../library/datetime.rst:987 +msgid "" +"Subsequent calls to :meth:`!datetime.now` may return the same instant " +"depending on the precision of the underlying clock." +msgstr "对 :meth:`!datetime.now` 的后续调用可能由于下层时钟的精度返回相同的时刻。" + +#: ../../library/datetime.rst:993 +msgid "Return the current UTC date and time, with :attr:`.tzinfo` ``None``." +msgstr "返回表示当前 UTC 时间的 date 和 time,其中 :attr:`.tzinfo` 为 ``None``。" + +#: ../../library/datetime.rst:995 +msgid "" +"This is like :meth:`now`, but returns the current UTC date and time, as a " +"naive :class:`.datetime` object. An aware current UTC datetime can be " +"obtained by calling ``datetime.now(timezone.utc)``. See also :meth:`now`." +msgstr "" +"这类似于 :meth:`now`,但返回的是当前 UTC 日期和时间,类型为简单型 :class:`.datetime` 对象。 感知型的当前 UTC " +"日期时间可通过调用 ``datetime.now(timezone.utc)`` 来获得。 另请参阅 :meth:`now`。" + +#: ../../library/datetime.rst:1001 +msgid "" +"Because naive ``datetime`` objects are treated by many ``datetime`` methods " +"as local times, it is preferred to use aware datetimes to represent times in" +" UTC. As such, the recommended way to create an object representing the " +"current time in UTC is by calling ``datetime.now(timezone.utc)``." +msgstr "" +"由于简单型 ``datetime`` 对象会被许多 ``datetime`` 方法当作本地时间来处理,最好是使用感知型日期时间对象来表示 UTC 时间。" +" 因此,创建表示当前 UTC 时间的对象的推荐方式是通过调用 ``datetime.now(timezone.utc)``。" + +#: ../../library/datetime.rst:1008 +msgid "Use :meth:`datetime.now` with :const:`UTC` instead." +msgstr "改用带 :const:`UTC` 的 :meth:`datetime.now`。" + +#: ../../library/datetime.rst:1013 +msgid "" +"Return the local date and time corresponding to the POSIX timestamp, such as" +" is returned by :func:`time.time`. If optional argument *tz* is ``None`` or " +"not specified, the timestamp is converted to the platform's local date and " +"time, and the returned :class:`.datetime` object is naive." +msgstr "" +"返回 POSIX 时间戳对应的本地日期和时间,如 :func:`time.time` 返回的。 如果可选参数 *tz* 指定为 ``None`` " +"或未指定,时间戳将转换为平台的本地日期和时间,并且返回的 :class:`.datetime` 对象将为简单型。" + +#: ../../library/datetime.rst:1018 +msgid "" +"If *tz* is not ``None``, it must be an instance of a :class:`tzinfo` " +"subclass, and the timestamp is converted to *tz*’s time zone." +msgstr "" +"如果 *tz* 不为 ``None``,它必须是 :class:`tzinfo` 子类的一个实例,并且时间戳将被转换到 *tz* 指定的时区。" + +#: ../../library/datetime.rst:1021 +msgid "" +":meth:`fromtimestamp` may raise :exc:`OverflowError`, if the timestamp is " +"out of the range of values supported by the platform C :c:func:`localtime` " +"or :c:func:`gmtime` functions, and :exc:`OSError` on :c:func:`localtime` or " +":c:func:`gmtime` failure. It's common for this to be restricted to years in " +"1970 through 2038. Note that on non-POSIX systems that include leap seconds " +"in their notion of a timestamp, leap seconds are ignored by " +":meth:`fromtimestamp`, and then it's possible to have two timestamps " +"differing by a second that yield identical :class:`.datetime` objects. This " +"method is preferred over :meth:`utcfromtimestamp`." +msgstr "" +":meth:`fromtimestamp` 可能会引发 :exc:`OverflowError`,如果时间戳数值超出所在平台 C " +":c:func:`localtime` 或 :c:func:`gmtime` 函数的支持范围的话,并会在 :c:func:`localtime` 或 " +":c:func:`gmtime` 报错时引发 :exc:`OSError`。 通常该数值会被限制在 1970 年至 2038 年之间。 " +"请注意在时间戳概念包含闰秒的非 POSIX 系统上,闰秒会被 :meth:`fromtimestamp` " +"所忽略,结果可能导致两个相差一秒的时间戳产生相同的 :class:`.datetime` 对象。 相比 :meth:`utcfromtimestamp`" +" 更推荐使用此方法。" + +#: ../../library/datetime.rst:1032 +msgid "" +"Raise :exc:`OverflowError` instead of :exc:`ValueError` if the timestamp is " +"out of the range of values supported by the platform C :c:func:`localtime` " +"or :c:func:`gmtime` functions. Raise :exc:`OSError` instead of " +":exc:`ValueError` on :c:func:`localtime` or :c:func:`gmtime` failure." +msgstr "" +"引发 :exc:`OverflowError` 而不是 :exc:`ValueError`,如果时间戳数值超出所在平台 C " +":c:func:`localtime` 或 :c:func:`gmtime` 函数的支持范围的话。 并会在 :c:func:`localtime` 或 " +":c:func:`gmtime` 出错时引发 :exc:`OSError` 而不是 :exc:`ValueError`。" + +#: ../../library/datetime.rst:1039 +msgid "" +":meth:`fromtimestamp` may return instances with :attr:`.fold` set to 1." +msgstr ":meth:`fromtimestamp` 可能返回 :attr:`.fold` 值设为 1 的实例。" + +#: ../../library/datetime.rst:1048 +msgid "" +"Return the UTC :class:`.datetime` corresponding to the POSIX timestamp, with" +" :attr:`.tzinfo` ``None``. (The resulting object is naive.)" +msgstr "" +"返回对应于 POSIX 时间戳的 UTC :class:`.datetime`,其中 :attr:`.tzinfo` 值为 ``None``。 " +"(结果为简单型对象。)" + +#: ../../library/datetime.rst:1051 +msgid "" +"This may raise :exc:`OverflowError`, if the timestamp is out of the range of" +" values supported by the platform C :c:func:`gmtime` function, and " +":exc:`OSError` on :c:func:`gmtime` failure. It's common for this to be " +"restricted to years in 1970 through 2038." +msgstr "" +"这可能引发 :exc:`OverflowError`,如果时间戳数值超出所在平台 C :c:func:`gmtime` 函数的支持范围的话,并会在 " +":c:func:`gmtime` 报错时引发 :exc:`OSError`。 通常该数值会被限制在 1970 至 2038 年之间。" + +#: ../../library/datetime.rst:1056 +msgid "" +"To get an aware :class:`.datetime` object, call :meth:`fromtimestamp`::" +msgstr "要得到一个感知型 :class:`.datetime` 对象,应调用 :meth:`fromtimestamp`::" + +#: ../../library/datetime.rst:1058 +msgid "datetime.fromtimestamp(timestamp, timezone.utc)" +msgstr "datetime.fromtimestamp(timestamp, timezone.utc)" + +#: ../../library/datetime.rst:1060 +msgid "" +"On the POSIX compliant platforms, it is equivalent to the following " +"expression::" +msgstr "在 POSIX 兼容的平台上,它等价于以下表达式::" + +#: ../../library/datetime.rst:1063 +msgid "" +"datetime(1970, 1, 1, tzinfo=timezone.utc) + timedelta(seconds=timestamp)" +msgstr "" +"datetime(1970, 1, 1, tzinfo=timezone.utc) + timedelta(seconds=timestamp)" + +#: ../../library/datetime.rst:1065 +msgid "" +"except the latter formula always supports the full years range: between " +":const:`MINYEAR` and :const:`MAXYEAR` inclusive." +msgstr "不同之处在于后一种形式总是支持完整年份范围:从 :const:`MINYEAR` 到 :const:`MAXYEAR` 的闭区间。" + +#: ../../library/datetime.rst:1070 +msgid "" +"Because naive ``datetime`` objects are treated by many ``datetime`` methods " +"as local times, it is preferred to use aware datetimes to represent times in" +" UTC. As such, the recommended way to create an object representing a " +"specific timestamp in UTC is by calling ``datetime.fromtimestamp(timestamp, " +"tz=timezone.utc)``." +msgstr "" +"由于简单型 ``datetime`` 对象会被许多 ``datetime`` 方法当作本地时间来处理,最好是使用感知型日期时间对象来表示 UTC 时间。" +" 因此,创建表示特定 UTC 时间戳的日期时间对象的推荐方式是通过调用 ``datetime.fromtimestamp(timestamp, " +"tz=timezone.utc)``。" + +#: ../../library/datetime.rst:1076 +msgid "" +"Raise :exc:`OverflowError` instead of :exc:`ValueError` if the timestamp is " +"out of the range of values supported by the platform C :c:func:`gmtime` " +"function. Raise :exc:`OSError` instead of :exc:`ValueError` on " +":c:func:`gmtime` failure." +msgstr "" +"引发 :exc:`OverflowError` 而不是 :exc:`ValueError`,如果时间戳数值超出所在平台 C " +":c:func:`gmtime` 函数的支持范围的话。 并会在 :c:func:`gmtime` 出错时引发 :exc:`OSError` 而不是 " +":exc:`ValueError`。" + +#: ../../library/datetime.rst:1087 +msgid "Use :meth:`datetime.fromtimestamp` with :const:`UTC` instead." +msgstr "改用带 :const:`UTC` 的 :meth:`datetime.fromtimestamp`。" + +#: ../../library/datetime.rst:1092 +msgid "" +"Return the :class:`.datetime` corresponding to the proleptic Gregorian " +"ordinal, where January 1 of year 1 has ordinal 1. :exc:`ValueError` is " +"raised unless ``1 <= ordinal <= datetime.max.toordinal()``. The hour, " +"minute, second and microsecond of the result are all 0, and :attr:`.tzinfo` " +"is ``None``." +msgstr "" +"返回对应于预期格列高利历序号的 :class:`.datetime`,其中公元 1 年 1 月 1 日的序号为 1。 除非 ``1 <= ordinal" +" <= datetime.max.toordinal()`` 否则会引发 :exc:`ValueError`。 结果的 hour, minute, " +"second 和 microsecond 值均为 0,并且 :attr:`.tzinfo` 值为 ``None``。" + +#: ../../library/datetime.rst:1100 +msgid "" +"Return a new :class:`.datetime` object whose date components are equal to " +"the given :class:`date` object's, and whose time components are equal to the" +" given :class:`.time` object's. If the *tzinfo* argument is provided, its " +"value is used to set the :attr:`.tzinfo` attribute of the result, otherwise " +"the :attr:`~.time.tzinfo` attribute of the *time* argument is used. If the " +"*date* argument is a :class:`!datetime` object, its time components and " +":attr:`.tzinfo` attributes are ignored." +msgstr "" +"返回一个新的 :class:`.datetime` 对象,其日期部分等于给定的 :class:`date` 对象的值,而其时间部分等于给定的 " +":class:`.time` 对象的值。 如果提供了 *tzinfo* 参数,其值会被用来设置结果的 :attr:`.tzinfo` 属性,否则将使用 " +"*time* 参数的 :attr:`~.time.tzinfo` 属性。 如果 *date* 参数是一个 :class:`!datetime` " +"对象,其时间部分和 :attr:`.tzinfo` 属性将被忽略。" + +#: ../../library/datetime.rst:1108 +msgid "" +"For any :class:`.datetime` object ``d``, ``d == datetime.combine(d.date(), " +"d.time(), d.tzinfo)``." +msgstr "" +"对于任意 :class:`.datetime` 对象 ``d``,``d == datetime.combine(d.date(), d.time()," +" d.tzinfo)``。" + +#: ../../library/datetime.rst:1111 +msgid "Added the *tzinfo* argument." +msgstr "增加了 *tzinfo* 参数。" + +#: ../../library/datetime.rst:1117 +msgid "" +"Return a :class:`.datetime` corresponding to a *date_string* in any valid " +"ISO 8601 format, with the following exceptions:" +msgstr "" +"返回一个对应于以任何有效的 ISO 8601 格式给出的 *date_string* 的 :class:`.datetime`,下列格式除外:" + +#: ../../library/datetime.rst:1120 ../../library/datetime.rst:1942 +msgid "Time zone offsets may have fractional seconds." +msgstr "时区时差可能会有带小数的秒值。" + +#: ../../library/datetime.rst:1121 +msgid "The ``T`` separator may be replaced by any single unicode character." +msgstr "``T`` 分隔符可以用任何单个 unicode 字符来替换。" + +#: ../../library/datetime.rst:1122 ../../library/datetime.rst:1947 +msgid "Fractional hours and minutes are not supported." +msgstr "带小数的时和分是不受支持的。" + +#: ../../library/datetime.rst:1131 +msgid "" +">>> import datetime as dt\n" +">>> dt.datetime.fromisoformat('2011-11-04')\n" +"datetime.datetime(2011, 11, 4, 0, 0)\n" +">>> dt.datetime.fromisoformat('20111104')\n" +"datetime.datetime(2011, 11, 4, 0, 0)\n" +">>> dt.datetime.fromisoformat('2011-11-04T00:05:23')\n" +"datetime.datetime(2011, 11, 4, 0, 5, 23)\n" +">>> dt.datetime.fromisoformat('2011-11-04T00:05:23Z')\n" +"datetime.datetime(2011, 11, 4, 0, 5, 23, tzinfo=datetime.timezone.utc)\n" +">>> dt.datetime.fromisoformat('20111104T000523')\n" +"datetime.datetime(2011, 11, 4, 0, 5, 23)\n" +">>> dt.datetime.fromisoformat('2011-W01-2T00:05:23.283')\n" +"datetime.datetime(2011, 1, 4, 0, 5, 23, 283000)\n" +">>> dt.datetime.fromisoformat('2011-11-04 00:05:23.283')\n" +"datetime.datetime(2011, 11, 4, 0, 5, 23, 283000)\n" +">>> dt.datetime.fromisoformat('2011-11-04 00:05:23.283+00:00')\n" +"datetime.datetime(2011, 11, 4, 0, 5, 23, 283000, tzinfo=datetime.timezone.utc)\n" +">>> dt.datetime.fromisoformat('2011-11-04T00:05:23+04:00')\n" +"datetime.datetime(2011, 11, 4, 0, 5, 23,\n" +" tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))" +msgstr "" +">>> import datetime as dt\n" +">>> dt.datetime.fromisoformat('2011-11-04')\n" +"datetime.datetime(2011, 11, 4, 0, 0)\n" +">>> dt.datetime.fromisoformat('20111104')\n" +"datetime.datetime(2011, 11, 4, 0, 0)\n" +">>> dt.datetime.fromisoformat('2011-11-04T00:05:23')\n" +"datetime.datetime(2011, 11, 4, 0, 5, 23)\n" +">>> dt.datetime.fromisoformat('2011-11-04T00:05:23Z')\n" +"datetime.datetime(2011, 11, 4, 0, 5, 23, tzinfo=datetime.timezone.utc)\n" +">>> dt.datetime.fromisoformat('20111104T000523')\n" +"datetime.datetime(2011, 11, 4, 0, 5, 23)\n" +">>> dt.datetime.fromisoformat('2011-W01-2T00:05:23.283')\n" +"datetime.datetime(2011, 1, 4, 0, 5, 23, 283000)\n" +">>> dt.datetime.fromisoformat('2011-11-04 00:05:23.283')\n" +"datetime.datetime(2011, 11, 4, 0, 5, 23, 283000)\n" +">>> dt.datetime.fromisoformat('2011-11-04 00:05:23.283+00:00')\n" +"datetime.datetime(2011, 11, 4, 0, 5, 23, 283000, tzinfo=datetime.timezone.utc)\n" +">>> dt.datetime.fromisoformat('2011-11-04T00:05:23+04:00')\n" +"datetime.datetime(2011, 11, 4, 0, 5, 23,\n" +" tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))" + +#: ../../library/datetime.rst:1153 +msgid "" +"Previously, this method only supported formats that could be emitted by " +":meth:`date.isoformat` or :meth:`datetime.isoformat`." +msgstr "" +"在之前版本中,此方法仅支持可以由 :meth:`date.isoformat` 或 :meth:`datetime.isoformat` 发出的格式。" + +#: ../../library/datetime.rst:1160 +msgid "" +"Return a :class:`.datetime` corresponding to the ISO calendar date specified" +" by *year*, *week* and *day*. The non-date components of the datetime are " +"populated with their normal default values. This is the inverse of the " +"function :meth:`datetime.isocalendar`." +msgstr "" +"返回一个 :class:`.datetime`,其值对应于由 *year*, *week* 和 *day* 指明的 ISO 历法日期。 该 " +"datetime 对象的非日期部分将使用其标准默认值来填充。 这是函数 :meth:`datetime.isocalendar` 的逆操作。" + +#: ../../library/datetime.rst:1170 +msgid "" +"Return a :class:`.datetime` corresponding to *date_string*, parsed according" +" to *format*." +msgstr "返回一个对应于 *date_string*,根据 *format* 进行解析得到的 :class:`.datetime` 对象。" + +#: ../../library/datetime.rst:1173 +msgid "" +"If *format* does not contain microseconds or time zone information, this is " +"equivalent to::" +msgstr "如果 *format* 不包含微秒或时区信息,这将等价于::" + +#: ../../library/datetime.rst:1175 ../../library/datetime.rst:2776 +msgid "datetime(*(time.strptime(date_string, format)[0:6]))" +msgstr "datetime(*(time.strptime(date_string, format)[0:6]))" + +#: ../../library/datetime.rst:1177 +msgid "" +":exc:`ValueError` is raised if the date_string and format can't be parsed by" +" :func:`time.strptime` or if it returns a value which isn't a time tuple. " +"See also :ref:`strftime-strptime-behavior` and " +":meth:`datetime.fromisoformat`." +msgstr "" +"如果 date_string 和 format 无法被 :func:`time.strptime` 解析或它返回一个不是时间元组的值则将引发 " +":exc:`ValueError`。 另请参阅 :ref:`strftime-strptime-behavior` 和 " +":meth:`datetime.fromisoformat`。" + +#: ../../library/datetime.rst:1192 +msgid "" +">>> import datetime as dt\n" +">>> date_string = \"02/29\"\n" +">>> when = dt.datetime.strptime(f\"{date_string};1984\", \"%m/%d;%Y\") # Avoids leap year bug.\n" +">>> when.strftime(\"%B %d\")\n" +"'February 29'" +msgstr "" +">>> import datetime as dt\n" +">>> date_string = \"02/29\"\n" +">>> when = dt.datetime.strptime(f\"{date_string};1984\", \"%m/%d;%Y\") # 避免闰年 BUG。\n" +">>> when.strftime(\"%B %d\")\n" +"'February 29'" + +#: ../../library/datetime.rst:1205 +msgid "" +"The earliest representable :class:`.datetime`, ``datetime(MINYEAR, 1, 1, " +"tzinfo=None)``." +msgstr "最早的可表示 :class:`.datetime`,``datetime(MINYEAR, 1, 1, tzinfo=None)``。" + +#: ../../library/datetime.rst:1211 +msgid "" +"The latest representable :class:`.datetime`, ``datetime(MAXYEAR, 12, 31, 23," +" 59, 59, 999999, tzinfo=None)``." +msgstr "" +"最晚的可表示 :class:`.datetime`,``datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, " +"tzinfo=None)``。" + +#: ../../library/datetime.rst:1217 +msgid "" +"The smallest possible difference between non-equal :class:`.datetime` " +"objects, ``timedelta(microseconds=1)``." +msgstr "两个不相等的 :class:`.datetime` 对象之间可能的最小间隔,``timedelta(microseconds=1)``。" + +#: ../../library/datetime.rst:1240 ../../library/datetime.rst:1874 +msgid "In ``range(24)``." +msgstr "取值范围是 ``range(24)``。" + +#: ../../library/datetime.rst:1245 ../../library/datetime.rst:1250 +#: ../../library/datetime.rst:1879 ../../library/datetime.rst:1884 +msgid "In ``range(60)``." +msgstr "取值范围是 ``range(60)``。" + +#: ../../library/datetime.rst:1255 ../../library/datetime.rst:1889 +msgid "In ``range(1000000)``." +msgstr "取值范围是 ``range(1000000)``。" + +#: ../../library/datetime.rst:1260 +msgid "" +"The object passed as the *tzinfo* argument to the :class:`.datetime` " +"constructor, or ``None`` if none was passed." +msgstr "作为 *tzinfo* 参数被传给 :class:`.datetime` 构造器的对象,如果没有传入值则为 ``None``。" + +#: ../../library/datetime.rst:1266 ../../library/datetime.rst:1900 +msgid "" +"In ``[0, 1]``. Used to disambiguate wall times during a repeated interval. " +"(A repeated interval occurs when clocks are rolled back at the end of " +"daylight saving time or when the UTC offset for the current zone is " +"decreased for political reasons.) The values 0 and 1 represent, " +"respectively, the earlier and later of the two moments with the same wall " +"time representation." +msgstr "" +"取值范围是 ``[0, 1]``。 用于在重复的时间段中消除边界时间的歧义。 (当夏令时结束时回拨时钟或由于政治原因导致当前时区的 UTC " +"时差减少就会出现重复时间段。) 取值 0 和 1 分别表示两个相同边界时间表示形式的前一个和后一个时间。" + +#: ../../library/datetime.rst:1280 +msgid "``datetime2 = datetime1 + timedelta``" +msgstr "``datetime2 = datetime1 + timedelta``" + +#: ../../library/datetime.rst:1280 ../../library/datetime.rst:2544 +#: ../../library/datetime.rst:2549 ../../library/datetime.rst:2554 +#: ../../library/datetime.rst:2559 ../../library/datetime.rst:2564 +#: ../../library/datetime.rst:2664 ../../library/datetime.rst:2668 +msgid "\\(1)" +msgstr "\\(1)" + +#: ../../library/datetime.rst:1282 +msgid "``datetime2 = datetime1 - timedelta``" +msgstr "``datetime2 = datetime1 - timedelta``" + +#: ../../library/datetime.rst:1282 ../../library/datetime.rst:2674 +msgid "\\(2)" +msgstr "\\(2)" + +#: ../../library/datetime.rst:1284 +msgid "``timedelta = datetime1 - datetime2``" +msgstr "``timedelta = datetime1 - datetime2``" + +#: ../../library/datetime.rst:0 +msgid "``datetime1 == datetime2``" +msgstr "``datetime1 == datetime2``" + +#: ../../library/datetime.rst:0 +msgid "``datetime1 != datetime2``" +msgstr "``datetime1 != datetime2``" + +#: ../../library/datetime.rst:0 +msgid "``datetime1 < datetime2``" +msgstr "``datetime1 < datetime2``" + +#: ../../library/datetime.rst:0 +msgid "``datetime1 > datetime2``" +msgstr "``datetime1 > datetime2``" + +#: ../../library/datetime.rst:0 +msgid "``datetime1 <= datetime2``" +msgstr "``datetime1 <= datetime2``" + +#: ../../library/datetime.rst:0 +msgid "``datetime1 >= datetime2``" +msgstr "``datetime1 >= datetime2``" + +#: ../../library/datetime.rst:1296 +msgid "" +"``datetime2`` is a duration of ``timedelta`` removed from ``datetime1``, " +"moving forward in time if ``timedelta.days > 0``, or backward if " +"``timedelta.days < 0``. The result has the same :attr:`~.datetime.tzinfo` " +"attribute as the input datetime, and ``datetime2 - datetime1 == timedelta`` " +"after. :exc:`OverflowError` is raised if ``datetime2.year`` would be smaller" +" than :const:`MINYEAR` or larger than :const:`MAXYEAR`. Note that no time " +"zone adjustments are done even if the input is an aware object." +msgstr "" +"``datetime2`` 是 ``datetime1`` 去掉 ``timedelta`` 时间段的结果,如果 ``timedelta.days > " +"0`` 则是在时间线上前进,如果 ``timedelta.days < 0`` 则时在时间线上后退。 该结果具有与输入的 datetime 相同的 " +":attr:`~.datetime.tzinfo` 属性,并且运算后 ``datetime2 - datetime1 == timedelta``。 " +"如果 ``datetime2.year`` 将要小于 :const:`MINYEAR` 或大于 :const:`MAXYEAR` 则会引发 " +":exc:`OverflowError`。 请注意即使输入的是一个感知型对象该方法也不会进行时区调整。" + +#: ../../library/datetime.rst:1305 +msgid "" +"Computes the ``datetime2`` such that ``datetime2 + timedelta == datetime1``." +" As for addition, the result has the same :attr:`~.datetime.tzinfo` " +"attribute as the input datetime, and no time zone adjustments are done even " +"if the input is aware." +msgstr "" +"计算 ``datetime2`` 使得 ``datetime2 + timedelta == datetime1``。 与相加操作一样,结果具有与输入的" +" datetime 相同的 :attr:`~.datetime.tzinfo` 属性,即使输入的是一个感知型对象该方法也不会进行时区调整。" + +#: ../../library/datetime.rst:1310 +msgid "" +"Subtraction of a :class:`.datetime` from a :class:`!datetime` is defined " +"only if both operands are naive, or if both are aware. If one is aware and " +"the other is naive, :exc:`TypeError` is raised." +msgstr "" +"从一个 :class:`.datetime` 减去一个 :class:`!datetime` 仅在两个操作数均为简单型,或是均为感知型时有定义。 " +"如果一个是感知型而另一个是简单型,则会引发 :exc:`TypeError`。" + +#: ../../library/datetime.rst:1314 +msgid "" +"If both are naive, or both are aware and have the same " +":attr:`~.datetime.tzinfo` attribute, the :attr:`~.datetime.tzinfo` " +"attributes are ignored, and the result is a :class:`timedelta` object ``t`` " +"such that ``datetime2 + t == datetime1``. No time zone adjustments are done " +"in this case." +msgstr "" +"如果两个操作数都是简单型,或都是感知型并且具有相同的 :attr:`~.datetime.tzinfo` 属性,则 " +":attr:`~.datetime.tzinfo` 属性会被忽略,并且结果会是一个使得 ``datetime2 + t == datetime1`` 的" +" :class:`timedelta` 对象 ``t``。 在此情况下不会进行时区调整。" + +#: ../../library/datetime.rst:1319 +msgid "" +"If both are aware and have different :attr:`~.datetime.tzinfo` attributes, " +"``a-b`` acts as if ``a`` and ``b`` were first converted to naive UTC " +"datetimes. The result is ``(a.replace(tzinfo=None) - a.utcoffset()) - " +"(b.replace(tzinfo=None) - b.utcoffset())`` except that the implementation " +"never overflows." +msgstr "" +"如果两者均为感知型且具有不同的 :attr:`~.datetime.tzinfo` 属性,``a-b`` 的效果就如同 ``a`` 和 ``b`` " +"首先被转换为简单型 UTC 日期时间。 结果将为 ``(a.replace(tzinfo=None) - a.utcoffset()) - " +"(b.replace(tzinfo=None) - b.utcoffset())``,不同之处在于具体实现绝对不会溢出。" + +#: ../../library/datetime.rst:1325 +msgid "" +":class:`.datetime` objects are equal if they represent the same date and " +"time, taking into account the time zone." +msgstr ":class:`.datetime` 对象如果在考虑时区的情况下表示相同的日期和时间那么就是相等的。" + +#: ../../library/datetime.rst:1328 +msgid "Naive and aware :class:`.datetime` objects are never equal." +msgstr "简单型和感知型 :class:`.datetime` 对象绝不会相等。" + +#: ../../library/datetime.rst:1330 +msgid "" +"If both comparands are aware, and have the same :attr:`!tzinfo` attribute, " +"the :attr:`!tzinfo` and :attr:`~.datetime.fold` attributes are ignored and " +"the base datetimes are compared. If both comparands are aware and have " +"different :attr:`~.datetime.tzinfo` attributes, the comparison acts as " +"comparands were first converted to UTC datetimes except that the " +"implementation never overflows. :class:`.datetime` instances in a repeated " +"interval are never equal to :class:`!datetime` instances in other time zone." +msgstr "" +"如果两个比较操作数均为感知型,且具有相同的 :attr:`!tzinfo` 属性,则 :attr:`!tzinfo` 和 " +":attr:`~.datetime.fold` 属性将被忽略并对基本日期时间值进行比较。 如果两个比较操作数均为感知型且具有不同的 " +":attr:`~.datetime.tzinfo` 属性,则比较行为将如同两个操作数首先被转换为 UTC,不同之处是具体实现绝对不会溢出。 " +"具有重复间隔的 :class:`.datetime` 实例绝对不会等于属于其他时区的 :class:`!datetime` 实例。" + +#: ../../library/datetime.rst:1340 +msgid "" +"*datetime1* is considered less than *datetime2* when *datetime1* precedes " +"*datetime2* in time, taking into account the time zone." +msgstr "" +"在考虑时区的情况下,当 *datetime1* 的时间在 *datetime2* 之前则认为 *datetime1* 小于 *datetime2*。" + +#: ../../library/datetime.rst:1343 +msgid "" +"Order comparison between naive and aware :class:`.datetime` objects raises " +":exc:`TypeError`." +msgstr "简单型和感知型 :class:`.datetime` 对象之间的顺序比较将会引发 :exc:`TypeError`。" + +#: ../../library/datetime.rst:1346 +msgid "" +"If both comparands are aware, and have the same :attr:`!tzinfo` attribute, " +"the :attr:`!tzinfo` and :attr:`~.datetime.fold` attributes are ignored and " +"the base datetimes are compared. If both comparands are aware and have " +"different :attr:`~.datetime.tzinfo` attributes, the comparison acts as " +"comparands were first converted to UTC datetimes except that the " +"implementation never overflows." +msgstr "" +"如果两个操作数均为感知型,且具有相同的 :attr:`!tzinfo` 属性,则 :attr:`!tzinfo` 和 " +":attr:`~.datetime.fold` 属性将被忽略并对基本日期时间值进行比较。 如果两个操作数均为感知型且具有不同的 " +":attr:`~.datetime.tzinfo` 属性,则比较行为将如同两个操作数首先被转换为 UTC 日期时间,不同之处是具体实现绝对不会溢出。" + +#: ../../library/datetime.rst:1353 +msgid "" +"Equality comparisons between aware and naive :class:`.datetime` instances " +"don't raise :exc:`TypeError`." +msgstr "感知型和简单型 :class:`.datetime` 实例之间的相等比较不会引发 :exc:`TypeError`。" + +#: ../../library/datetime.rst:1370 +msgid "Return :class:`date` object with same year, month and day." +msgstr "返回具有同样 year, month 和 day 值的 :class:`date` 对象。" + +#: ../../library/datetime.rst:1375 +msgid "" +"Return :class:`.time` object with same hour, minute, second, microsecond and" +" fold. :attr:`.tzinfo` is ``None``. See also method :meth:`timetz`." +msgstr "" +"返回具有同样 hour, minute, second, microsecond 和 fold 值的 :class:`.time` 对象。 " +":attr:`.tzinfo` 值为 ``None``。 另请参见 :meth:`timetz` 方法。" + +#: ../../library/datetime.rst:1378 ../../library/datetime.rst:1387 +msgid "The fold value is copied to the returned :class:`.time` object." +msgstr "fold 值会被复制给返回的 :class:`.time` 对象。" + +#: ../../library/datetime.rst:1384 +msgid "" +"Return :class:`.time` object with same hour, minute, second, microsecond, " +"fold, and tzinfo attributes. See also method :meth:`time`." +msgstr "" +"返回具有同样 hour, minute, second, microsecond, fold 和 tzinfo 属性的 :class:`.time` " +"对象。 另请参见 :meth:`time` 方法。" + +#: ../../library/datetime.rst:1395 +msgid "" +"Return a new :class:`datetime` object with the same attributes, but with " +"specified parameters updated. Note that ``tzinfo=None`` can be specified to " +"create a naive datetime from an aware datetime with no conversion of date " +"and time data." +msgstr "" +"返回一个具有同样属性的新的 :class:`datetime` 对象,但更新指定的形参。 请注意可以通过指定 ``tzinfo=None`` " +"基于一个感知型 datetime 创建一个简单型 datetime 而不必转换日期和时间数据。" + +#: ../../library/datetime.rst:1400 +msgid "" +":class:`.datetime` objects are also supported by generic function " +":func:`copy.replace`." +msgstr ":class:`.datetime` 对象也被泛型函数 :func:`copy.replace` 所支持。" + +#: ../../library/datetime.rst:1409 +msgid "" +"Return a :class:`.datetime` object with new :attr:`.tzinfo` attribute *tz*, " +"adjusting the date and time data so the result is the same UTC time as " +"*self*, but in *tz*'s local time." +msgstr "" +"返回一个具有新的 :attr:`.tzinfo` 属性 *tz* 的 :class:`.datetime` 对象,并会调整日期和时间数据使得结果对应的 " +"UTC 时间与 *self* 相同,但为 *tz* 时区的本地时间。" + +#: ../../library/datetime.rst:1413 +msgid "" +"If provided, *tz* must be an instance of a :class:`tzinfo` subclass, and its" +" :meth:`utcoffset` and :meth:`dst` methods must not return ``None``. If " +"*self* is naive, it is presumed to represent time in the system time zone." +msgstr "" +"如果给出了 *tz*,则它必须是一个 :class:`tzinfo` 子类的实例,并且其 :meth:`utcoffset` 和 :meth:`dst`" +" 方法不可返回 ``None``。 如果 *self* 为简单型,它会被假定为基于系统时区表示的时间。" + +#: ../../library/datetime.rst:1417 +msgid "" +"If called without arguments (or with ``tz=None``) the system local time zone" +" is assumed for the target time zone. The ``.tzinfo`` attribute of the " +"converted datetime instance will be set to an instance of :class:`timezone` " +"with the zone name and offset obtained from the OS." +msgstr "" +"如果调用时不传入参数 (或传入 ``tz=None``) 则将假定目标时区为系统的本地时区。 转换后 datetime 实例的 ``.tzinfo`` " +"属性将被设为一个 :class:`timezone` 实例,时区名称和时差值将从 OS 获取。" + +#: ../../library/datetime.rst:1422 +msgid "" +"If ``self.tzinfo`` is *tz*, ``self.astimezone(tz)`` is equal to *self*: no " +"adjustment of date or time data is performed. Else the result is local time " +"in the time zone *tz*, representing the same UTC time as *self*: after " +"``astz = dt.astimezone(tz)``, ``astz - astz.utcoffset()`` will have the same" +" date and time data as ``dt - dt.utcoffset()``." +msgstr "" +"如果 ``self.tzinfo`` 为 *tz*,``self.astimezone(tz)`` 等于 *self*: 不会对日期或时间数据进行调整。" +" 否则结果为 *tz* 时区的本地时间,代表的 UTC 时间与 *self* 相同:在 ``astz = dt.astimezone(tz)`` " +"之后,``astz - astz.utcoffset()`` 将具有与 ``dt - dt.utcoffset()`` 相同的日期和时间数据。" + +#: ../../library/datetime.rst:1428 +msgid "" +"If you merely want to attach a :class:`timezone` object *tz* to a datetime " +"*dt* without adjustment of date and time data, use " +"``dt.replace(tzinfo=tz)``. If you merely want to remove the " +":class:`!timezone` object from an aware datetime *dt* without conversion of " +"date and time data, use ``dt.replace(tzinfo=None)``." +msgstr "" +"如果你只是想要附加一个 :class:`timezone` 对象 *tz* 到一个 datetime 对象 *dt* 而不调整日期和时间数据,请使用 " +"``dt.replace(tzinfo=tz)``。 如果你只是想要从一个感知型 datetime 对象 *dt* 移除 " +":class:`!timezone` 对象,请使用 ``dt.replace(tzinfo=None)``。" + +#: ../../library/datetime.rst:1433 +msgid "" +"Note that the default :meth:`tzinfo.fromutc` method can be overridden in a " +":class:`tzinfo` subclass to affect the result returned by " +":meth:`astimezone`. Ignoring error cases, :meth:`astimezone` acts like::" +msgstr "" +"请注意默认的 :meth:`tzinfo.fromutc` 方法在 :class:`tzinfo` 的子类中可以被重写,从而影响 " +":meth:`astimezone` 的返回结果。 如果忽略出错的情况,:meth:`astimezone` 的行为就类似于::" + +#: ../../library/datetime.rst:1437 +msgid "" +"def astimezone(self, tz):\n" +" if self.tzinfo is tz:\n" +" return self\n" +" # Convert self to UTC, and attach the new timezone object.\n" +" utc = (self - self.utcoffset()).replace(tzinfo=tz)\n" +" # Convert from UTC to tz's local time.\n" +" return tz.fromutc(utc)" +msgstr "" +"def astimezone(self, tz):\n" +" if self.tzinfo is tz:\n" +" return self\n" +" # 将 self 转换为 UTC,并附加新的时区对象\n" +" utc = (self - self.utcoffset()).replace(tzinfo=tz)\n" +" # 从 UTC 转换为 tz 的地方时。\n" +" return tz.fromutc(utc)" + +#: ../../library/datetime.rst:1445 +msgid "*tz* now can be omitted." +msgstr "*tz* 现在可以被省略。" + +#: ../../library/datetime.rst:1448 +msgid "" +"The :meth:`astimezone` method can now be called on naive instances that are " +"presumed to represent system local time." +msgstr ":meth:`astimezone` 方法可以由简单型实例调用,这将假定其表示本地时间。" + +#: ../../library/datetime.rst:1455 +msgid "" +"If :attr:`.tzinfo` is ``None``, returns ``None``, else returns " +"``self.tzinfo.utcoffset(self)``, and raises an exception if the latter " +"doesn't return ``None`` or a :class:`timedelta` object with magnitude less " +"than one day." +msgstr "" +"如果 :attr:`.tzinfo` 为 ``None``,则返回 ``None``,否则返回 " +"``self.tzinfo.utcoffset(self)``,并且在后者不返回 ``None`` 或者一个幅度小于一天的 " +":class:`timedelta` 对象时将引发异常。" + +#: ../../library/datetime.rst:1459 ../../library/datetime.rst:2081 +#: ../../library/datetime.rst:2190 ../../library/datetime.rst:2443 +#: ../../library/datetime.rst:2455 ../../library/datetime.rst:2852 +msgid "The UTC offset is not restricted to a whole number of minutes." +msgstr "UTC 时差不再限制为一个整数分钟值。" + +#: ../../library/datetime.rst:1465 +msgid "" +"If :attr:`.tzinfo` is ``None``, returns ``None``, else returns " +"``self.tzinfo.dst(self)``, and raises an exception if the latter doesn't " +"return ``None`` or a :class:`timedelta` object with magnitude less than one " +"day." +msgstr "" +"如果 :attr:`.tzinfo` 为 ``None``,则返回 ``None``,否则返回 " +"``self.tzinfo.dst(self)``,并且在后者不返回 ``None`` 或者一个幅度小于一天的 :class:`timedelta` " +"对象时将引发异常。" + +#: ../../library/datetime.rst:1469 ../../library/datetime.rst:2091 +#: ../../library/datetime.rst:2248 +msgid "The DST offset is not restricted to a whole number of minutes." +msgstr "DST 差值不再限制为一个整数分钟值。" + +#: ../../library/datetime.rst:1475 +msgid "" +"If :attr:`.tzinfo` is ``None``, returns ``None``, else returns " +"``self.tzinfo.tzname(self)``, raises an exception if the latter doesn't " +"return ``None`` or a string object," +msgstr "" +"如果 :attr:`.tzinfo` 为 ``None``,则返回 ``None``,否则返回 " +"``self.tzinfo.tzname(self)``,如果后者不返回 ``None`` 或者一个字符串对象则将引发异常。" + +#: ../../library/datetime.rst:1486 +msgid "" +"time.struct_time((d.year, d.month, d.day,\n" +" d.hour, d.minute, d.second,\n" +" d.weekday(), yday, dst))" +msgstr "" +"time.struct_time((d.year, d.month, d.day,\n" +" d.hour, d.minute, d.second,\n" +" d.weekday(), yday, dst))" + +#: ../../library/datetime.rst:1490 +msgid "" +"where ``yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1`` is the " +"day number within the current year starting with 1 for January 1st. The " +":attr:`~time.struct_time.tm_isdst` flag of the result is set according to " +"the :meth:`dst` method: :attr:`.tzinfo` is ``None`` or :meth:`dst` returns " +"``None``, :attr:`!tm_isdst` is set to ``-1``; else if :meth:`dst` returns a " +"non-zero value, :attr:`!tm_isdst` is set to 1; else :attr:`!tm_isdst` is set" +" to 0." +msgstr "" +"其中 ``yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1`` " +"是日期在当前年份中的序号,起始值 1 表示 1 月 1 日。 结果的 :attr:`~time.struct_time.tm_isdst` 旗标会根据 " +":meth:`dst` 方法来设定:如果 :attr:`.tzinfo` 为 ``None`` 或 :meth:`dst` 返回 ``None``,则 " +":attr:`!tm_isdst` 将设为 ``-1``;否则如果 :meth:`dst` 返回非零值,则 :attr:`!tm_isdst` 将设为 " +"1;在其他情况下 :attr:`!tm_isdst` 将设为 0。" + +#: ../../library/datetime.rst:1501 +msgid "" +"If :class:`.datetime` instance ``d`` is naive, this is the same as " +"``d.timetuple()`` except that :attr:`~.time.struct_time.tm_isdst` is forced " +"to 0 regardless of what ``d.dst()`` returns. DST is never in effect for a " +"UTC time." +msgstr "" +"如果 :class:`.datetime` 实例 ``d`` 为简单型,这将与 ``d.timetuple()`` 相当,区别在于 " +":attr:`~.time.struct_time.tm_isdst` 会被强制设为 0 而无视 ``d.dst()`` 返回值。 DST 对于 UTC" +" 时间必定无效。" + +#: ../../library/datetime.rst:1505 +msgid "" +"If ``d`` is aware, ``d`` is normalized to UTC time, by subtracting " +"``d.utcoffset()``, and a :class:`time.struct_time` for the normalized time " +"is returned. :attr:`!tm_isdst` is forced to 0. Note that an " +":exc:`OverflowError` may be raised if ``d.year`` was ``MINYEAR`` or " +"``MAXYEAR`` and UTC adjustment spills over a year boundary." +msgstr "" +"如果 ``d`` 为感知型,则 ``d`` 会通过减去 ``d.utcoffset()`` 来标准化为 UTC 时间,并返回表示该标准化时间的 " +":class:`time.struct_time`。 :attr:`!tm_isdst` 将被强制设为 0。 请注意如果 ``d.year`` 为 " +"``MINYEAR`` 或 ``MAXYEAR`` 且 UTC 调整超出一年的边界则可能引发 :exc:`OverflowError`。" + +#: ../../library/datetime.rst:1514 +msgid "" +"Because naive ``datetime`` objects are treated by many ``datetime`` methods " +"as local times, it is preferred to use aware datetimes to represent times in" +" UTC; as a result, using :meth:`datetime.utctimetuple` may give misleading " +"results. If you have a naive ``datetime`` representing UTC, use " +"``datetime.replace(tzinfo=timezone.utc)`` to make it aware, at which point " +"you can use :meth:`.datetime.timetuple`." +msgstr "" +"由于简单型 ``datetime`` 对象会被许多 ``datetime`` 方法当作本地时间来处理,最好是使用感知型日期时间来表示 UTC " +"时间;因此,使用 :meth:`datetime.utctimetuple` 可能会给出误导性的结果。 如果你有一个表示 UTC 的简单型 " +"``datetime``,请使用 ``datetime.replace(tzinfo=timezone.utc)`` 将其改为感知型,这样你才能使用 " +":meth:`.datetime.timetuple`。" + +#: ../../library/datetime.rst:1524 +msgid "" +"Return the proleptic Gregorian ordinal of the date. The same as " +"``self.date().toordinal()``." +msgstr "返回日期的预期格列高利历序号。 与 ``self.date().toordinal()`` 相同。" + +#: ../../library/datetime.rst:1530 +msgid "" +"Return POSIX timestamp corresponding to the :class:`.datetime` instance. The" +" return value is a :class:`float` similar to that returned by " +":func:`time.time`." +msgstr "" +"返回对应于 :class:`.datetime` 实例的 POSIX 时间戳。 此返回值是与 :func:`time.time` 返回值类似的 " +":class:`float` 对象。" + +#: ../../library/datetime.rst:1534 +msgid "" +"Naive :class:`.datetime` instances are assumed to represent local time and " +"this method relies on platform C functions to perform the conversion. Since " +":class:`!datetime` supports a wider range of values than the platform C " +"functions on many platforms, this method may raise :exc:`OverflowError` or " +":exc:`OSError` for times far in the past or far in the future." +msgstr "" + +#: ../../library/datetime.rst:1541 +msgid "" +"For aware :class:`.datetime` instances, the return value is computed as::" +msgstr "对于感知型 :class:`.datetime` 实例,返回值的计算方式为::" + +#: ../../library/datetime.rst:1544 +msgid "(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()" +msgstr "(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()" + +#: ../../library/datetime.rst:1548 +msgid "" +"There is no method to obtain the POSIX timestamp directly from a naive " +":class:`.datetime` instance representing UTC time. If your application uses " +"this convention and your system time zone is not set to UTC, you can obtain " +"the POSIX timestamp by supplying ``tzinfo=timezone.utc``::" +msgstr "" +"没有一个方法能直接从表示 UTC 时间的简单型 :class:`.datetime` 实例获取 POSIX 时间戳。 " +"如果你的应用程序使用此惯例并且你的系统时区不是设为 UTC,你可以通过提供 ``tzinfo=timezone.utc`` 来获取 POSIX " +"时间戳::" + +#: ../../library/datetime.rst:1554 +msgid "timestamp = dt.replace(tzinfo=timezone.utc).timestamp()" +msgstr "timestamp = dt.replace(tzinfo=timezone.utc).timestamp()" + +#: ../../library/datetime.rst:1556 +msgid "or by calculating the timestamp directly::" +msgstr "或者通过直接计算时间戳::" + +#: ../../library/datetime.rst:1558 +msgid "timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)" +msgstr "timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)" + +#: ../../library/datetime.rst:1562 +msgid "" +"The :meth:`timestamp` method uses the :attr:`.fold` attribute to " +"disambiguate the times during a repeated interval." +msgstr ":meth:`timestamp` 方法使用 :attr:`.fold` 属性来消除重复间隔中的时间歧义。" + +#: ../../library/datetime.rst:1566 +msgid "" +"This method no longer relies on the platform C :c:func:`mktime` function to " +"perform conversions." +msgstr "" + +#: ../../library/datetime.rst:1573 +msgid "" +"Return the day of the week as an integer, where Monday is 0 and Sunday is 6." +" The same as ``self.date().weekday()``. See also :meth:`isoweekday`." +msgstr "" +"返回一个整数代表星期几,星期一为 0,星期天为 6。 相当于 ``self.date().weekday()``。 另请参阅 " +":meth:`isoweekday`。" + +#: ../../library/datetime.rst:1579 +msgid "" +"Return the day of the week as an integer, where Monday is 1 and Sunday is 7." +" The same as ``self.date().isoweekday()``. See also :meth:`weekday`, " +":meth:`isocalendar`." +msgstr "" +"返回一个整数代表星期几,星期一为 1,星期天为 7。 相当于 ``self.date().isoweekday()``。 另请参阅 " +":meth:`weekday`, :meth:`isocalendar`。" + +#: ../../library/datetime.rst:1586 +msgid "" +"Return a :term:`named tuple` with three components: ``year``, ``week`` and " +"``weekday``. The same as ``self.date().isocalendar()``." +msgstr "" +"返回一个由三部分组成的 :term:`named tuple`: ``year``, ``week`` 和 ``weekday``。 等同于 " +"``self.date().isocalendar()``。" + +#: ../../library/datetime.rst:1592 +msgid "Return a string representing the date and time in ISO 8601 format:" +msgstr "返回一个以 ISO 8601 格式表示的日期和时间字符串:" + +#: ../../library/datetime.rst:1594 +msgid "``YYYY-MM-DDTHH:MM:SS.ffffff``, if :attr:`microsecond` is not 0" +msgstr "``YYYY-MM-DDTHH:MM:SS.ffffff``,如果 :attr:`microsecond` 不为 0" + +#: ../../library/datetime.rst:1595 +msgid "``YYYY-MM-DDTHH:MM:SS``, if :attr:`microsecond` is 0" +msgstr "``YYYY-MM-DDTHH:MM:SS``,如果 :attr:`microsecond` 为 0" + +#: ../../library/datetime.rst:1597 +msgid "" +"If :meth:`utcoffset` does not return ``None``, a string is appended, giving " +"the UTC offset:" +msgstr "如果 :meth:`utcoffset` 返回值不为 ``None``,则添加一个字符串来给出 UTC 时差:" + +#: ../../library/datetime.rst:1600 +msgid "" +"``YYYY-MM-DDTHH:MM:SS.ffffff+HH:MM[:SS[.ffffff]]``, if :attr:`microsecond` " +"is not 0" +msgstr "" +"``YYYY-MM-DDTHH:MM:SS.ffffff+HH:MM[:SS[.ffffff]]``,如果 :attr:`microsecond` 不为" +" 0" + +#: ../../library/datetime.rst:1602 +msgid "" +"``YYYY-MM-DDTHH:MM:SS+HH:MM[:SS[.ffffff]]``, if :attr:`microsecond` is 0" +msgstr "" +"``YYYY-MM-DDTHH:MM:SS+HH:MM[:SS[.ffffff]]``,如果 :attr:`microsecond` 为 0" + +#: ../../library/datetime.rst:1606 +msgid "" +">>> import datetime as dt\n" +">>> dt.datetime(2019, 5, 18, 15, 17, 8, 132263).isoformat()\n" +"'2019-05-18T15:17:08.132263'\n" +">>> dt.datetime(2019, 5, 18, 15, 17, tzinfo=dt.timezone.utc).isoformat()\n" +"'2019-05-18T15:17:00+00:00'" +msgstr "" +">>> import datetime as dt\n" +">>> dt.datetime(2019, 5, 18, 15, 17, 8, 132263).isoformat()\n" +"'2019-05-18T15:17:08.132263'\n" +">>> dt.datetime(2019, 5, 18, 15, 17, tzinfo=dt.timezone.utc).isoformat()\n" +"'2019-05-18T15:17:00+00:00'" + +#: ../../library/datetime.rst:1612 +msgid "" +"The optional argument *sep* (default ``'T'``) is a one-character separator, " +"placed between the date and time portions of the result. For example::" +msgstr "可选参数 *sep* (默认为 ``'T'``) 为单个分隔字符,会被放在结果的日期和时间两部分之间。 例如::" + +#: ../../library/datetime.rst:1615 +msgid "" +">>> import datetime as dt\n" +">>> class TZ(dt.tzinfo):\n" +"... \"\"\"A time zone with an arbitrary, constant -06:39 offset.\"\"\"\n" +"... def utcoffset(self, when):\n" +"... return dt.timedelta(hours=-6, minutes=-39)\n" +"...\n" +">>> dt.datetime(2002, 12, 25, tzinfo=TZ()).isoformat(' ')\n" +"'2002-12-25 00:00:00-06:39'\n" +">>> dt.datetime(2009, 11, 27, microsecond=100, tzinfo=TZ()).isoformat()\n" +"'2009-11-27T00:00:00.000100-06:39'" +msgstr "" +">>> import datetime as dt\n" +">>> class TZ(dt.tzinfo):\n" +"... \"\"\"A time zone with an arbitrary, constant -06:39 offset.\"\"\"\n" +"... def utcoffset(self, when):\n" +"... return dt.timedelta(hours=-6, minutes=-39)\n" +"...\n" +">>> dt.datetime(2002, 12, 25, tzinfo=TZ()).isoformat(' ')\n" +"'2002-12-25 00:00:00-06:39'\n" +">>> dt.datetime(2009, 11, 27, microsecond=100, tzinfo=TZ()).isoformat()\n" +"'2009-11-27T00:00:00.000100-06:39'" + +#: ../../library/datetime.rst:1626 ../../library/datetime.rst:2021 +msgid "" +"The optional argument *timespec* specifies the number of additional " +"components of the time to include (the default is ``'auto'``). It can be one" +" of the following:" +msgstr "可选参数 *timespec* 要包含的额外时间组件值 (默认为 ``'auto'``)。它可以是以下值之一:" + +#: ../../library/datetime.rst:1630 ../../library/datetime.rst:2025 +msgid "" +"``'auto'``: Same as ``'seconds'`` if :attr:`microsecond` is 0, same as " +"``'microseconds'`` otherwise." +msgstr "" +"``'auto'``: 如果 :attr:`microsecond` 为 0 则与 ``'seconds'`` 相同,否则与 " +"``'microseconds'`` 相同。" + +#: ../../library/datetime.rst:1632 ../../library/datetime.rst:2027 +msgid "``'hours'``: Include the :attr:`hour` in the two-digit ``HH`` format." +msgstr "``'hours'``: 以两个数码的 ``HH`` 格式 包含 :attr:`hour`。" + +#: ../../library/datetime.rst:1633 ../../library/datetime.rst:2028 +msgid "" +"``'minutes'``: Include :attr:`hour` and :attr:`minute` in ``HH:MM`` format." +msgstr "``'minutes'``: 以 ``HH:MM`` 格式包含 :attr:`hour` 和 :attr:`minute`。" + +#: ../../library/datetime.rst:1634 ../../library/datetime.rst:2029 +msgid "" +"``'seconds'``: Include :attr:`hour`, :attr:`minute`, and :attr:`second` in " +"``HH:MM:SS`` format." +msgstr "" +"``'seconds'``: 以 ``HH:MM:SS`` 格式包含 :attr:`hour`, :attr:`minute` 和 " +":attr:`second`。" + +#: ../../library/datetime.rst:1636 ../../library/datetime.rst:2031 +msgid "" +"``'milliseconds'``: Include full time, but truncate fractional second part " +"to milliseconds. ``HH:MM:SS.sss`` format." +msgstr "``'milliseconds'``: 包含完整时间,但将秒值的小数部分截断至毫秒。 格式为 ``HH:MM:SS.sss``。" + +#: ../../library/datetime.rst:1638 ../../library/datetime.rst:2033 +msgid "``'microseconds'``: Include full time in ``HH:MM:SS.ffffff`` format." +msgstr "``'microseconds'``: 以 ``HH:MM:SS.ffffff`` 格式包含完整时间。" + +#: ../../library/datetime.rst:1642 ../../library/datetime.rst:2037 +msgid "Excluded time components are truncated, not rounded." +msgstr "排除掉的时间部分将被截断,而不是被舍入。" + +#: ../../library/datetime.rst:1644 +msgid ":exc:`ValueError` will be raised on an invalid *timespec* argument::" +msgstr "对于无效的 *timespec* 参数将引发 :exc:`ValueError`::" + +#: ../../library/datetime.rst:1647 +msgid "" +">>> import datetime as dt\n" +">>> dt.datetime.now().isoformat(timespec='minutes')\n" +"'2002-12-25T00:00'\n" +">>> my_datetime = dt.datetime(2015, 1, 1, 12, 30, 59, 0)\n" +">>> my_datetime.isoformat(timespec='microseconds')\n" +"'2015-01-01T12:30:59.000000'" +msgstr "" +">>> import datetime as dt\n" +">>> dt.datetime.now().isoformat(timespec='minutes')\n" +"'2002-12-25T00:00'\n" +">>> my_datetime = dt.datetime(2015, 1, 1, 12, 30, 59, 0)\n" +">>> my_datetime.isoformat(timespec='microseconds')\n" +"'2015-01-01T12:30:59.000000'" + +#: ../../library/datetime.rst:1654 ../../library/datetime.rst:2052 +msgid "Added the *timespec* parameter." +msgstr "增加了 *timespec* 形参。" + +#: ../../library/datetime.rst:1660 +msgid "" +"For a :class:`.datetime` instance ``d``, ``str(d)`` is equivalent to " +"``d.isoformat(' ')``." +msgstr "对于 :class:`.datetime` 实例 ``d``,``str(d)`` 等价于 ``d.isoformat(' ')``。" + +#: ../../library/datetime.rst:1666 +msgid "Return a string representing the date and time::" +msgstr "返回一个表示日期和时间的字符串::" + +#: ../../library/datetime.rst:1668 +msgid "" +">>> import datetime as dt\n" +">>> dt.datetime(2002, 12, 4, 20, 30, 40).ctime()\n" +"'Wed Dec 4 20:30:40 2002'" +msgstr "" +">>> import datetime as dt\n" +">>> dt.datetime(2002, 12, 4, 20, 30, 40).ctime()\n" +"'Wed Dec 4 20:30:40 2002'" + +#: ../../library/datetime.rst:1672 +msgid "" +"The output string will *not* include time zone information, regardless of " +"whether the input is aware or naive." +msgstr "输出字符串将 *并不* 包括时区信息,无论输入的是感知型还是简单型。" + +#: ../../library/datetime.rst:1679 +msgid "" +"on platforms where the native C :c:func:`ctime` function (which " +":func:`time.ctime` invokes, but which :meth:`datetime.ctime` does not " +"invoke) conforms to the C standard." +msgstr "" +"在原生 C :c:func:`ctime` 函数遵循 C 标准的平台上 (:func:`time.ctime` 会发起对该函数的调用,但 " +":meth:`datetime.ctime` 并不会) 。" + +#: ../../library/datetime.rst:1686 +msgid "" +"Return a string representing the date and time, controlled by an explicit " +"format string. See also :ref:`strftime-strptime-behavior` and " +":meth:`datetime.isoformat`." +msgstr "" +"返回一个由显式格式字符串所控制的,代表日期和时间的字符串。 另请参阅 :ref:`strftime-strptime-behavior` 和 " +":meth:`datetime.isoformat`。" + +#: ../../library/datetime.rst:1693 +msgid "" +"Same as :meth:`.datetime.strftime`. This makes it possible to specify a " +"format string for a :class:`.datetime` object in :ref:`formatted string " +"literals ` and when using :meth:`str.format`. See also " +":ref:`strftime-strptime-behavior` and :meth:`datetime.isoformat`." +msgstr "" +"与 :meth:`.datetime.strftime` 相同。 此方法使得在 :ref:`格式化字符串字面值 ` 中以及使用 " +":meth:`str.format` 时为 :class:`.datetime` 对象指定格式字符串成为可能。 另请参阅 :ref:`strftime-" +"strptime-behavior` 和 :meth:`datetime.isoformat`。" + +#: ../../library/datetime.rst:1700 +msgid "Examples of usage: :class:`!datetime`" +msgstr "用法示例: :class:`!datetime`" + +#: ../../library/datetime.rst:1702 +msgid "Examples of working with :class:`.datetime` objects:" +msgstr "使用 :class:`.datetime` 对象的例子:" + +#: ../../library/datetime.rst:1704 +msgid "" +">>> import datetime as dt\n" +"\n" +">>> # Using datetime.combine()\n" +">>> d = dt.date(2005, 7, 14)\n" +">>> t = dt.time(12, 30)\n" +">>> dt.datetime.combine(d, t)\n" +"datetime.datetime(2005, 7, 14, 12, 30)\n" +"\n" +">>> # Using datetime.now()\n" +">>> dt.datetime.now()\n" +"datetime.datetime(2007, 12, 6, 16, 29, 43, 79043) # GMT +1\n" +">>> dt.datetime.now(dt.timezone.utc)\n" +"datetime.datetime(2007, 12, 6, 15, 29, 43, 79060, tzinfo=datetime.timezone.utc)\n" +"\n" +">>> # Using datetime.strptime()\n" +">>> my_datetime = dt.datetime.strptime(\"21/11/06 16:30\", \"%d/%m/%y %H:%M\")\n" +">>> my_datetime\n" +"datetime.datetime(2006, 11, 21, 16, 30)\n" +"\n" +">>> # Using datetime.timetuple() to get tuple of all attributes\n" +">>> tt = my_datetime.timetuple()\n" +">>> for it in tt:\n" +"... print(it)\n" +"...\n" +"2006 # year\n" +"11 # month\n" +"21 # day\n" +"16 # hour\n" +"30 # minute\n" +"0 # second\n" +"1 # weekday (0 = Monday)\n" +"325 # number of days since 1st January\n" +"-1 # dst - method tzinfo.dst() returned None\n" +"\n" +">>> # Date in ISO format\n" +">>> ic = my_datetime.isocalendar()\n" +">>> for it in ic:\n" +"... print(it)\n" +"...\n" +"2006 # ISO year\n" +"47 # ISO week\n" +"2 # ISO weekday\n" +"\n" +">>> # Formatting a datetime\n" +">>> my_datetime.strftime(\"%A, %d. %B %Y %I:%M%p\")\n" +"'Tuesday, 21. November 2006 04:30PM'\n" +">>> 'The {1} is {0:%d}, the {2} is {0:%B}, the {3} is {0:%I:%M%p}.'.format(my_datetime, \"day\", \"month\", \"time\")\n" +"'The day is 21, the month is November, the time is 04:30PM.'" +msgstr "" +">>> import datetime as dt\n" +"\n" +">>> # 使用 datetime.combine()\n" +">>> d = dt.date(2005, 7, 14)\n" +">>> t = dt.time(12, 30)\n" +">>> dt.datetime.combine(d, t)\n" +"datetime.datetime(2005, 7, 14, 12, 30)\n" +"\n" +">>> # 使用 datetime.now()\n" +">>> dt.datetime.now()\n" +"datetime.datetime(2007, 12, 6, 16, 29, 43, 79043) # GMT +1\n" +">>> dt.datetime.now(dt.timezone.utc)\n" +"datetime.datetime(2007, 12, 6, 15, 29, 43, 79060, tzinfo=datetime.timezone.utc)\n" +"\n" +">>> # 使用 datetime.strptime()\n" +">>> my_datetime = dt.datetime.strptime(\"21/11/06 16:30\", \"%d/%m/%y %H:%M\")\n" +">>> my_datetime\n" +"datetime.datetime(2006, 11, 21, 16, 30)\n" +"\n" +">>> # 使用 datetime.timetuple() 获取由所有属性组成的元组\n" +">>> tt = my_datetime.timetuple()\n" +">>> for it in tt:\n" +"... print(it)\n" +"...\n" +"2006 # 年\n" +"11 # 月\n" +"21 # 日\n" +"16 # 时\n" +"30 # 分\n" +"0 # 秒\n" +"1 # 周序号 (0 = 星期一)\n" +"325 # 自 1 月 1 日开始的天数\n" +"-1 # dst - 方法 tzinfo.dst() 返回 None\n" +"\n" +">>> # ISO 格式的日期\n" +">>> ic = my_datetime.isocalendar()\n" +">>> for it in ic:\n" +"... print(it)\n" +"...\n" +"2006 # ISO 年\n" +"47 # ISO 第几周\n" +"2 # ISO 周序号\n" +"\n" +">>> # 格式化 datetime 对象\n" +">>> my_datetime.strftime(\"%A, %d. %B %Y %I:%M%p\")\n" +"'Tuesday, 21. November 2006 04:30PM'\n" +">>> 'The {1} is {0:%d}, the {2} is {0:%B}, the {3} is {0:%I:%M%p}.'.format(my_datetime, \"day\", \"month\", \"time\")\n" +"'The day is 21, the month is November, the time is 04:30PM.'" + +#: ../../library/datetime.rst:1755 +msgid "" +"The example below defines a :class:`tzinfo` subclass capturing time zone " +"information for Kabul, Afghanistan, which used +4 UTC until 1945 and then " +"+4:30 UTC thereafter::" +msgstr "" +"以下示例定义了一个 :class:`tzinfo` 子类,它捕获 Kabul, Afghanistan 时区的信息,该时区使用 +4 UTC 直到 " +"1945 年,之后则使用 +4:30 UTC::" + +#: ../../library/datetime.rst:1759 +msgid "" +"import datetime as dt\n" +"\n" +"class KabulTz(dt.tzinfo):\n" +" # Kabul used +4 until 1945, when they moved to +4:30\n" +" UTC_MOVE_DATE = dt.datetime(1944, 12, 31, 20, tzinfo=dt.timezone.utc)\n" +"\n" +" def utcoffset(self, when):\n" +" if when.year < 1945:\n" +" return dt.timedelta(hours=4)\n" +" elif (1945, 1, 1, 0, 0) <= when.timetuple()[:5] < (1945, 1, 1, 0, 30):\n" +" # An ambiguous (\"imaginary\") half-hour range representing\n" +" # a 'fold' in time due to the shift from +4 to +4:30.\n" +" # If when falls in the imaginary range, use fold to decide how\n" +" # to resolve. See PEP 495.\n" +" return dt.timedelta(hours=4, minutes=(30 if when.fold else 0))\n" +" else:\n" +" return dt.timedelta(hours=4, minutes=30)\n" +"\n" +" def fromutc(self, when):\n" +" # Follow same validations as in datetime.tzinfo\n" +" if not isinstance(when, dt.datetime):\n" +" raise TypeError(\"fromutc() requires a datetime argument\")\n" +" if when.tzinfo is not self:\n" +" raise ValueError(\"when.tzinfo is not self\")\n" +"\n" +" # A custom implementation is required for fromutc as\n" +" # the input to this function is a datetime with utc values\n" +" # but with a tzinfo set to self.\n" +" # See datetime.astimezone or fromtimestamp.\n" +" if when.replace(tzinfo=dt.timezone.utc) >= self.UTC_MOVE_DATE:\n" +" return when + dt.timedelta(hours=4, minutes=30)\n" +" else:\n" +" return when + dt.timedelta(hours=4)\n" +"\n" +" def dst(self, when):\n" +" # Kabul does not observe daylight saving time.\n" +" return dt.timedelta(0)\n" +"\n" +" def tzname(self, when):\n" +" if when >= self.UTC_MOVE_DATE:\n" +" return \"+04:30\"\n" +" return \"+04\"" +msgstr "" +"import datetime as dt\n" +"\n" +"class KabulTz(dt.tzinfo):\n" +" # 喀布尔曾使用 +4 直到 1945 年,后改为 +4:30\n" +" UTC_MOVE_DATE = dt.datetime(1944, 12, 31, 20, tzinfo=dt.timezone.utc)\n" +"\n" +" def utcoffset(self, when):\n" +" if when.year < 1945:\n" +" return dt.timedelta(hours=4)\n" +" elif (1945, 1, 1, 0, 0) <= when.timetuple()[:5] < (1945, 1, 1, 0, 30):\n" +" # 带有歧义(“虚幻”)的半小时区间代表\n" +" # 由于从 +4 改为 +4:30 导致的时间‘折叠’。\n" +" # 如果 dt 落在此虚幻区间,则使用该折叠\n" +" # 确定如何计算。 参见 PEP 495。\n" +" return dt.timedelta(hours=4, minutes=(30 if when.fold else 0))\n" +" else:\n" +" return dt.timedelta(hours=4, minutes=30)\n" +"\n" +" def fromutc(self, when):\n" +" # 遵循与在 datetime.tzinfo 中相同的验证\n" +" if not isinstance(when, dt.datetime):\n" +" raise TypeError(\"fromutc() requires a datetime argument\")\n" +" if when.tzinfo is not self:\n" +" raise ValueError(\"when.tzinfo is not self\")\n" +"\n" +" # 需要一个针对 fromutc 的自定义实现\n" +" # 因为此函数的输入是 utc 日期时间值\n" +" # 但其 tzinfo 设为 self。\n" +" # 参见 datetime.astimezone 或 fromtimestamp。\n" +" if when.replace(tzinfo=dt.timezone.utc) >= self.UTC_MOVE_DATE:\n" +" return when + dt.timedelta(hours=4, minutes=30)\n" +" else:\n" +" return when + dt.timedelta(hours=4)\n" +"\n" +" def dst(self, when):\n" +" # 喀布尔不实行夏令时。\n" +" return dt.timedelta(0)\n" +"\n" +" def tzname(self, when):\n" +" if when >= self.UTC_MOVE_DATE:\n" +" return \"+04:30\"\n" +" return \"+04\"" + +#: ../../library/datetime.rst:1802 +msgid "Usage of ``KabulTz`` from above::" +msgstr "上述 ``KabulTz`` 的用法::" + +#: ../../library/datetime.rst:1804 +msgid "" +">>> tz1 = KabulTz()\n" +"\n" +">>> # Datetime before the change\n" +">>> dt1 = dt.datetime(1900, 11, 21, 16, 30, tzinfo=tz1)\n" +">>> print(dt1.utcoffset())\n" +"4:00:00\n" +"\n" +">>> # Datetime after the change\n" +">>> dt2 = dt.datetime(2006, 6, 14, 13, 0, tzinfo=tz1)\n" +">>> print(dt2.utcoffset())\n" +"4:30:00\n" +"\n" +">>> # Convert datetime to another time zone\n" +">>> dt3 = dt2.astimezone(dt.timezone.utc)\n" +">>> dt3\n" +"datetime.datetime(2006, 6, 14, 8, 30, tzinfo=datetime.timezone.utc)\n" +">>> dt2\n" +"datetime.datetime(2006, 6, 14, 13, 0, tzinfo=KabulTz())\n" +">>> dt2 == dt3\n" +"True" +msgstr "" +">>> tz1 = KabulTz()\n" +"\n" +">>> # 修改前日期时间\n" +">>> dt1 = dt.datetime(1900, 11, 21, 16, 30, tzinfo=tz1)\n" +">>> print(dt1.utcoffset())\n" +"4:00:00\n" +"\n" +">>> # 修改后日期时间\n" +">>> dt2 = dt.datetime(2006, 6, 14, 13, 0, tzinfo=tz1)\n" +">>> print(dt2.utcoffset())\n" +"4:30:00\n" +"\n" +">>> # 将日期时间转换至另一个时区\n" +">>> dt3 = dt2.astimezone(dt.timezone.utc)\n" +">>> dt3\n" +"datetime.datetime(2006, 6, 14, 8, 30, tzinfo=datetime.timezone.utc)\n" +">>> dt2\n" +"datetime.datetime(2006, 6, 14, 13, 0, tzinfo=KabulTz())\n" +">>> dt2 == dt3\n" +"True" + +#: ../../library/datetime.rst:1829 +msgid ":class:`!time` objects" +msgstr ":class:`!time` 对象" + +#: ../../library/datetime.rst:1831 +msgid "" +"A :class:`.time` object represents a (local) time of day, independent of any" +" particular day, and subject to adjustment via a :class:`tzinfo` object." +msgstr "" +"一个 :class:`.time` 对象代表某日的(本地)时间,它独立于任何特定日期,并可通过 :class:`tzinfo` 对象来调整。" + +#: ../../library/datetime.rst:1836 +msgid "" +"All arguments are optional. *tzinfo* may be ``None``, or an instance of a " +":class:`tzinfo` subclass. The remaining arguments must be integers in the " +"following ranges:" +msgstr "" +"所有参数都是可选的。 *tzinfo* 可以是 ``None``,或者是一个 :class:`tzinfo` 子类的实例。 " +"其余的参数必须是在下面范围内的整数:" + +#: ../../library/datetime.rst:1846 +msgid "" +"If an argument outside those ranges is given, :exc:`ValueError` is raised. " +"All default to 0 except *tzinfo*, which defaults to ``None``." +msgstr "" +"如果给出一个此范围以外的参数,则会引发 :exc:`ValueError`。 所有参数默认值均为 0 但 *tzinfo* 除外,其默认值为 " +"``None``。" + +#: ../../library/datetime.rst:1855 +msgid "The earliest representable :class:`.time`, ``time(0, 0, 0, 0)``." +msgstr "最早的可表示 :class:`.time`, ``time(0, 0, 0, 0)``。" + +#: ../../library/datetime.rst:1860 +msgid "The latest representable :class:`.time`, ``time(23, 59, 59, 999999)``." +msgstr "最晚的可表示 :class:`.time`, ``time(23, 59, 59, 999999)``。" + +#: ../../library/datetime.rst:1865 +msgid "" +"The smallest possible difference between non-equal :class:`.time` objects, " +"``timedelta(microseconds=1)``, although note that arithmetic on " +":class:`.time` objects is not supported." +msgstr "" +"两个不相等的 :class:`.time` 对象之间可能的最小间隔,``timedelta(microseconds=1)``,但是请注意 " +":class:`.time` 对象并不支持算术运算。" + +#: ../../library/datetime.rst:1894 +msgid "" +"The object passed as the tzinfo argument to the :class:`.time` constructor, " +"or ``None`` if none was passed." +msgstr "作为 tzinfo 参数被传给 :class:`.time` 构造器的对象,如果没有传入值则为 ``None``。" + +#: ../../library/datetime.rst:1909 +msgid "" +":class:`.time` objects support equality and order comparisons, where ``a`` " +"is considered less than ``b`` when ``a`` precedes ``b`` in time." +msgstr ":class:`.time` 对象支持相等和顺序比较,当 ``a`` 的时间在 ``b`` 之前则认为 ``a`` 小于 ``b``。" + +#: ../../library/datetime.rst:1912 +msgid "" +"Naive and aware :class:`!time` objects are never equal. Order comparison " +"between naive and aware :class:`!time` objects raises :exc:`TypeError`." +msgstr "" +"简单型和感知型 :class:`!time` 对象绝对不会相等。 简单型和感知型 :class:`!time` 对象之间的顺序比较将会引发 " +":exc:`TypeError`。" + +#: ../../library/datetime.rst:1916 +msgid "" +"If both comparands are aware, and have the same :attr:`~.time.tzinfo` " +"attribute, the :attr:`!tzinfo` and :attr:`!fold` attributes are ignored and " +"the base times are compared. If both comparands are aware and have different" +" :attr:`!tzinfo` attributes, the comparands are first adjusted by " +"subtracting their UTC offsets (obtained from ``self.utcoffset()``)." +msgstr "" +"如果两个操作数均为感知型,且具有相同的 :attr:`~.time.tzinfo` 属性,则 :attr:`!tzinfo` 和 " +":attr:`!fold` 属性会被忽略并对基本时间值进行比较。 如果两个操作数均为感知型且具有不同的 :attr:`!tzinfo` " +"属性,则两个操作数将首先通过减去它们的 UTC 时差(从 ``self.utcoffset()`` 获取)来进行调整。" + +#: ../../library/datetime.rst:1922 +msgid "" +"Equality comparisons between aware and naive :class:`.time` instances don't " +"raise :exc:`TypeError`." +msgstr "感知型和简单型 :class:`.time` 实例之间的相等性比较不会引发 :exc:`TypeError`。" + +#: ../../library/datetime.rst:1926 +msgid "" +"In Boolean contexts, a :class:`.time` object is always considered to be " +"true." +msgstr "在布尔运算时,:class:`.time` 对象总是被视为真值。" + +#: ../../library/datetime.rst:1928 +msgid "" +"Before Python 3.5, a :class:`.time` object was considered to be false if it " +"represented midnight in UTC. This behavior was considered obscure and error-" +"prone and has been removed in Python 3.5. See :issue:`13936` for more " +"information." +msgstr "" +"在 Python 3.5 之前,如果一个 :class:`.time` 对象代表 UTC 午夜零时则会被视为假值。 " +"此行为被认为容易引发困惑和错误,因此从 Python 3.5 起已被去除。 详情参见 :issue:`13936` for more " +"information。" + +#: ../../library/datetime.rst:1935 +msgid "Other constructors:" +msgstr "其他构造器:" + +#: ../../library/datetime.rst:1939 +msgid "" +"Return a :class:`.time` corresponding to a *time_string* in any valid ISO " +"8601 format, with the following exceptions:" +msgstr "返回一个对应于以任何有效的 ISO 8601 格式给出的 *time_string* 的 :class:`.time`,下列格式除外:" + +#: ../../library/datetime.rst:1943 +msgid "" +"The leading ``T``, normally required in cases where there may be ambiguity " +"between a date and a time, is not required." +msgstr "打头的 ``T``,通常在当日期和时间之间可能存在歧义时才有必要,不是必需的。" + +#: ../../library/datetime.rst:1945 +msgid "" +"Fractional seconds may have any number of digits (anything beyond 6 will be " +"truncated)." +msgstr "带小数的秒值可以有任意多位数码(超过 6 位将被截断)。" + +#: ../../library/datetime.rst:1949 +msgid "Examples:" +msgstr "示例:" + +#: ../../library/datetime.rst:1951 +msgid "" +">>> import datetime as dt\n" +">>> dt.time.fromisoformat('04:23:01')\n" +"datetime.time(4, 23, 1)\n" +">>> dt.time.fromisoformat('T04:23:01')\n" +"datetime.time(4, 23, 1)\n" +">>> dt.time.fromisoformat('T042301')\n" +"datetime.time(4, 23, 1)\n" +">>> dt.time.fromisoformat('04:23:01.000384')\n" +"datetime.time(4, 23, 1, 384)\n" +">>> dt.time.fromisoformat('04:23:01,000384')\n" +"datetime.time(4, 23, 1, 384)\n" +">>> dt.time.fromisoformat('04:23:01+04:00')\n" +"datetime.time(4, 23, 1, tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))\n" +">>> dt.time.fromisoformat('04:23:01Z')\n" +"datetime.time(4, 23, 1, tzinfo=datetime.timezone.utc)\n" +">>> dt.time.fromisoformat('04:23:01+00:00')\n" +"datetime.time(4, 23, 1, tzinfo=datetime.timezone.utc)" +msgstr "" +">>> import datetime as dt\n" +">>> dt.time.fromisoformat('04:23:01')\n" +"datetime.time(4, 23, 1)\n" +">>> dt.time.fromisoformat('T04:23:01')\n" +"datetime.time(4, 23, 1)\n" +">>> dt.time.fromisoformat('T042301')\n" +"datetime.time(4, 23, 1)\n" +">>> dt.time.fromisoformat('04:23:01.000384')\n" +"datetime.time(4, 23, 1, 384)\n" +">>> dt.time.fromisoformat('04:23:01,000384')\n" +"datetime.time(4, 23, 1, 384)\n" +">>> dt.time.fromisoformat('04:23:01+04:00')\n" +"datetime.time(4, 23, 1, tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))\n" +">>> dt.time.fromisoformat('04:23:01Z')\n" +"datetime.time(4, 23, 1, tzinfo=datetime.timezone.utc)\n" +">>> dt.time.fromisoformat('04:23:01+00:00')\n" +"datetime.time(4, 23, 1, tzinfo=datetime.timezone.utc)" + +#: ../../library/datetime.rst:1973 +msgid "" +"Previously, this method only supported formats that could be emitted by " +":meth:`time.isoformat`." +msgstr "在之前版本中,此方法仅支持可由 :meth:`time.isoformat` 发出的格式。" + +#: ../../library/datetime.rst:1980 +msgid "" +"Return a :class:`.time` corresponding to *date_string*, parsed according to " +"*format*." +msgstr "返回一个对应于 *date_string*,根据 *format* 进行解析得到的 :class:`.time` 对象。" + +#: ../../library/datetime.rst:1983 +msgid "" +"If *format* does not contain microseconds or timezone information, this is " +"equivalent to::" +msgstr "如果 *format* 不包含微秒或时区信息,这将等价于::" + +#: ../../library/datetime.rst:1985 +msgid "time(*(time.strptime(date_string, format)[3:6]))" +msgstr "time(*(time.strptime(date_string, format)[3:6]))" + +#: ../../library/datetime.rst:1987 +msgid "" +":exc:`ValueError` is raised if the *date_string* and *format* cannot be " +"parsed by :func:`time.strptime` or if it returns a value which is not a time" +" tuple. See also :ref:`strftime-strptime-behavior` and " +":meth:`time.fromisoformat`." +msgstr "" +"如果 *date_string* 和 *format* 无法被 :func:`time.strptime` 解析或它返回一个不是时间元组的值则将引发 " +":exc:`ValueError`。 另请参阅 :ref:`strftime-strptime-behavior` 和 " +":meth:`time.fromisoformat`。" + +#: ../../library/datetime.rst:2000 +msgid "" +"Return a new :class:`.time` with the same values, but with specified " +"parameters updated. Note that ``tzinfo=None`` can be specified to create a " +"naive :class:`!time` from an aware :class:`!time`, without conversion of the" +" time data." +msgstr "" +"返回一个具有同样属性的新的 :class:`.time` ,但更新指定的形参。 请注意可以通过指定 ``tzinfo=None`` 基于一个感知型 " +":class:`!time` 创建一个简单型 :class:`!time`,而不必转换时间数据。" + +#: ../../library/datetime.rst:2005 +msgid "" +":class:`.time` objects are also supported by generic function " +":func:`copy.replace`." +msgstr ":class:`.time` 对象也被泛型函数 :func:`copy.replace` 所支持。" + +#: ../../library/datetime.rst:2014 +msgid "Return a string representing the time in ISO 8601 format, one of:" +msgstr "返回表示为下列 ISO 8601 格式之一的时间字符串:" + +#: ../../library/datetime.rst:2016 +msgid "``HH:MM:SS.ffffff``, if :attr:`microsecond` is not 0" +msgstr "``HH:MM:SS.ffffff``,如果 :attr:`microsecond` 不为 0" + +#: ../../library/datetime.rst:2017 +msgid "``HH:MM:SS``, if :attr:`microsecond` is 0" +msgstr "``HH:MM:SS``,如果 :attr:`microsecond` 为 0" + +#: ../../library/datetime.rst:2018 +msgid "" +"``HH:MM:SS.ffffff+HH:MM[:SS[.ffffff]]``, if :meth:`utcoffset` does not " +"return ``None``" +msgstr "" +"``HH:MM:SS.ffffff+HH:MM[:SS[.ffffff]]``,如果 :meth:`utcoffset` 不返回 ``None``" + +#: ../../library/datetime.rst:2019 +msgid "" +"``HH:MM:SS+HH:MM[:SS[.ffffff]]``, if :attr:`microsecond` is 0 and " +":meth:`utcoffset` does not return ``None``" +msgstr "" +"``HH:MM:SS+HH:MM[:SS[.ffffff]]``,如果 :attr:`microsecond` 为 0 并且 " +":meth:`utcoffset` 不返回 ``None``" + +#: ../../library/datetime.rst:2039 +msgid ":exc:`ValueError` will be raised on an invalid *timespec* argument." +msgstr "对于无效的 *timespec* 参数将引发 :exc:`ValueError`。" + +#: ../../library/datetime.rst:2043 +msgid "" +">>> import datetime as dt\n" +">>> dt.time(hour=12, minute=34, second=56, microsecond=123456).isoformat(timespec='minutes')\n" +"'12:34'\n" +">>> my_time = dt.time(hour=12, minute=34, second=56, microsecond=0)\n" +">>> my_time.isoformat(timespec='microseconds')\n" +"'12:34:56.000000'\n" +">>> my_time.isoformat(timespec='auto')\n" +"'12:34:56'" +msgstr "" +">>> import datetime as dt\n" +">>> dt.time(hour=12, minute=34, second=56, microsecond=123456).isoformat(timespec='minutes')\n" +"'12:34'\n" +">>> my_time = dt.time(hour=12, minute=34, second=56, microsecond=0)\n" +">>> my_time.isoformat(timespec='microseconds')\n" +"'12:34:56.000000'\n" +">>> my_time.isoformat(timespec='auto')\n" +"'12:34:56'" + +#: ../../library/datetime.rst:2058 +msgid "For a time ``t``, ``str(t)`` is equivalent to ``t.isoformat()``." +msgstr "对于时间对象 ``t``,``str(t)`` 等价于 ``t.isoformat()``。" + +#: ../../library/datetime.rst:2063 +msgid "" +"Return a string representing the time, controlled by an explicit format " +"string. See also :ref:`strftime-strptime-behavior` and " +":meth:`time.isoformat`." +msgstr "" +"返回一个由显式格式字符串所控制的,代表时间的字符串。 另请参阅 :ref:`strftime-strptime-behavior` 和 " +":meth:`time.isoformat`。" + +#: ../../library/datetime.rst:2069 +msgid "" +"Same as :meth:`.time.strftime`. This makes it possible to specify a format " +"string for a :class:`.time` object in :ref:`formatted string literals " +"` and when using :meth:`str.format`. See also :ref:`strftime-" +"strptime-behavior` and :meth:`time.isoformat`." +msgstr "" +"与 :meth:`.time.strftime` 相同。 此方法使得在 :ref:`格式化字符串字面值 ` 中以及使用 " +":meth:`str.format` 时为 :class:`.time` 对象指定格式字符串成为可能。 另请参阅 :ref:`strftime-" +"strptime-behavior` 和 :meth:`time.isoformat`。" + +#: ../../library/datetime.rst:2077 +msgid "" +"If :attr:`.tzinfo` is ``None``, returns ``None``, else returns " +"``self.tzinfo.utcoffset(None)``, and raises an exception if the latter " +"doesn't return ``None`` or a :class:`timedelta` object with magnitude less " +"than one day." +msgstr "" +"如果 :attr:`.tzinfo` 为 ``None``,则返回 ``None``,否则返回 " +"``self.tzinfo.utcoffset(None)``,并且在后者不返回 ``None`` 或一个幅度小于一天的 " +":class:`timedelta` 对象时将引发异常。" + +#: ../../library/datetime.rst:2087 +msgid "" +"If :attr:`.tzinfo` is ``None``, returns ``None``, else returns " +"``self.tzinfo.dst(None)``, and raises an exception if the latter doesn't " +"return ``None``, or a :class:`timedelta` object with magnitude less than one" +" day." +msgstr "" +"如果 :attr:`.tzinfo` 为 ``None``,则返回 ``None``,否则返回 " +"``self.tzinfo.dst(None)``,并且在后者不返回 ``None`` 或者一个幅度小于一天的 :class:`timedelta` " +"对象时将引发异常。" + +#: ../../library/datetime.rst:2097 +msgid "" +"If :attr:`.tzinfo` is ``None``, returns ``None``, else returns " +"``self.tzinfo.tzname(None)``, or raises an exception if the latter doesn't " +"return ``None`` or a string object." +msgstr "" +"如果 :attr:`.tzinfo` 为 ``None``,则返回 ``None``,否则返回 " +"``self.tzinfo.tzname(None)``,如果后者不返回 ``None`` 或者一个字符串对象则将引发异常。" + +#: ../../library/datetime.rst:2103 +msgid "Examples of usage: :class:`!time`" +msgstr "用法示例: :class:`!time`" + +#: ../../library/datetime.rst:2105 +msgid "Examples of working with a :class:`.time` object::" +msgstr "使用 :class:`.time` 对象的例子::" + +#: ../../library/datetime.rst:2107 +msgid "" +">>> import datetime as dt\n" +">>> class TZ1(dt.tzinfo):\n" +"... def utcoffset(self, when):\n" +"... return dt.timedelta(hours=1)\n" +"... def dst(self, when):\n" +"... return dt.timedelta(0)\n" +"... def tzname(self, when):\n" +"... return \"+01:00\"\n" +"... def __repr__(self):\n" +"... return f\"{self.__class__.__name__}()\"\n" +"...\n" +">>> t = dt.time(12, 10, 30, tzinfo=TZ1())\n" +">>> t\n" +"datetime.time(12, 10, 30, tzinfo=TZ1())\n" +">>> t.isoformat()\n" +"'12:10:30+01:00'\n" +">>> t.dst()\n" +"datetime.timedelta(0)\n" +">>> t.tzname()\n" +"'+01:00'\n" +">>> t.strftime(\"%H:%M:%S %Z\")\n" +"'12:10:30 +01:00'\n" +">>> 'The {} is {:%H:%M}.'.format(\"time\", t)\n" +"'The time is 12:10.'" +msgstr "" +">>> import datetime as dt\n" +">>> class TZ1(dt.tzinfo):\n" +"... def utcoffset(self, when):\n" +"... return dt.timedelta(hours=1)\n" +"... def dst(self, when):\n" +"... return dt.timedelta(0)\n" +"... def tzname(self, when):\n" +"... return \"+01:00\"\n" +"... def __repr__(self):\n" +"... return f\"{self.__class__.__name__}()\"\n" +"...\n" +">>> t = dt.time(12, 10, 30, tzinfo=TZ1())\n" +">>> t\n" +"datetime.time(12, 10, 30, tzinfo=TZ1())\n" +">>> t.isoformat()\n" +"'12:10:30+01:00'\n" +">>> t.dst()\n" +"datetime.timedelta(0)\n" +">>> t.tzname()\n" +"'+01:00'\n" +">>> t.strftime(\"%H:%M:%S %Z\")\n" +"'12:10:30 +01:00'\n" +">>> 'The {} is {:%H:%M}.'.format(\"time\", t)\n" +"'The time is 12:10.'" + +#: ../../library/datetime.rst:2136 +msgid ":class:`!tzinfo` objects" +msgstr ":class:`!tzinfo` 对象" + +#: ../../library/datetime.rst:2140 +msgid "" +"This is an :term:`abstract base class`, meaning that this class should not " +"be instantiated directly. Define a subclass of :class:`tzinfo` to capture " +"information about a particular time zone." +msgstr "" +"这是一个 :term:`abstract base class`,也就是说该类不应被直接实例化。 请定义 :class:`tzinfo` " +"的子类来捕获有关特定时区的信息。to capture information about a particular time zone." + +#: ../../library/datetime.rst:2144 +msgid "" +"An instance of (a concrete subclass of) :class:`tzinfo` can be passed to the" +" constructors for :class:`.datetime` and :class:`.time` objects. The latter " +"objects view their attributes as being in local time, and the " +":class:`!tzinfo` object supports methods revealing offset of local time from" +" UTC, the name of the time zone, and DST offset, all relative to a date or " +"time object passed to them." +msgstr "" +":class:`tzinfo` 的(某个实体子类)的实例可以被传给 :class:`.datetime` 和 :class:`.time` " +"对象的构造器。 这些对象会将它们的属性视为对应于本地时间,并且 :class:`!tzinfo` 对象支持展示本地时间与 UTC 的差值、时区名称以及 " +"DST 差值的方法,都是与传给它们的日期或时间对象的相对值。" + +#: ../../library/datetime.rst:2150 +msgid "" +"You need to derive a concrete subclass, and (at least) supply " +"implementations of the standard :class:`tzinfo` methods needed by the " +":class:`.datetime` methods you use. The :mod:`!datetime` module provides " +":class:`timezone`, a simple concrete subclass of :class:`!tzinfo` which can " +"represent time zones with fixed offset from UTC such as UTC itself or North " +"American EST and EDT." +msgstr "" + +#: ../../library/datetime.rst:2157 +msgid "" +"Special requirement for pickling: A :class:`tzinfo` subclass must have an " +":meth:`~object.__init__` method that can be called with no arguments, " +"otherwise it can be pickled but possibly not unpickled again. This is a " +"technical requirement that may be relaxed in the future." +msgstr "" +"对于封存操作的特殊要求:一个 :class:`tzinfo` 子类必须具有可不带参数调用的 :meth:`~object.__init__` " +"方法,否则它虽然可以被封存,但可能无法再次解封。 这是个技术性要求,在未来可能会被取消。" + +#: ../../library/datetime.rst:2163 +msgid "" +"A concrete subclass of :class:`tzinfo` may need to implement the following " +"methods. Exactly which methods are needed depends on the uses made of aware " +":mod:`!datetime` objects. If in doubt, simply implement all of them." +msgstr "" +"一个 :class:`tzinfo` 的实体子类可能需要实现以下方法。 具体需要实现的方法取决于感知型 :mod:`!datetime` " +"对象如何使用它。 如果有疑问,可以简单地全部实现它们。" + +#: ../../library/datetime.rst:2170 +msgid "" +"Return offset of local time from UTC, as a :class:`timedelta` object that is" +" positive east of UTC. If local time is west of UTC, this should be " +"negative." +msgstr "" +"将本地时间与 UTC 时差返回为一个 :class:`timedelta` 对象,如果本地时区在 UTC 以东则为正值。 如果本地时区在 UTC " +"以西则为负值。" + +#: ../../library/datetime.rst:2173 +msgid "" +"This represents the *total* offset from UTC; for example, if a " +":class:`tzinfo` object represents both time zone and DST adjustments, " +":meth:`utcoffset` should return their sum. If the UTC offset isn't known, " +"return ``None``. Else the value returned must be a :class:`timedelta` object" +" strictly between ``-timedelta(hours=24)`` and ``timedelta(hours=24)`` (the " +"magnitude of the offset must be less than one day). Most implementations of " +":meth:`utcoffset` will probably look like one of these two::" +msgstr "" +"这表示与 UTC 的 *总计* 时差;举例来说,如果一个 :class:`tzinfo` 对象同时代表时区和 DST 调整,则 " +":meth:`utcoffset` 应当返回两者的和。 如果 UTC 时差不确定则返回 ``None``。 在其他情况下返回值必须为一个 " +":class:`timedelta` 对象,其取值严格限制于 ``-timedelta(hours=24)`` 和 " +"``timedelta(hours=24)`` 之间(差值的幅度必须小于一天)。 大多数 :meth:`utcoffset` " +"的实现看起来可能像是以下两者之一::" + +#: ../../library/datetime.rst:2181 +msgid "" +"return CONSTANT # fixed-offset class\n" +"return CONSTANT + self.dst(dt) # daylight-aware class" +msgstr "" +"return CONSTANT # 固定偏移类\n" +"return CONSTANT + self.dst(dt) # 夏令时感知类" + +#: ../../library/datetime.rst:2184 +msgid "" +"If :meth:`utcoffset` does not return ``None``, :meth:`dst` should not return" +" ``None`` either." +msgstr "如果 :meth:`utcoffset` 返回值不为 ``None``,则 :meth:`dst` 也不应返回 ``None``。" + +#: ../../library/datetime.rst:2187 +msgid "" +"The default implementation of :meth:`utcoffset` raises " +":exc:`NotImplementedError`." +msgstr "默认的 :meth:`utcoffset` 实现会引发 :exc:`NotImplementedError`。" + +#: ../../library/datetime.rst:2196 +msgid "" +"Return the daylight saving time (DST) adjustment, as a :class:`timedelta` " +"object or ``None`` if DST information isn't known." +msgstr "将夏令时(DST)调整返回为一个 :class:`timedelta` 对象,如果 DST 信息未知则返回 ``None``。" + +#: ../../library/datetime.rst:2200 +msgid "" +"Return ``timedelta(0)`` if DST is not in effect. If DST is in effect, return" +" the offset as a :class:`timedelta` object (see :meth:`utcoffset` for " +"details). Note that DST offset, if applicable, has already been added to the" +" UTC offset returned by :meth:`utcoffset`, so there's no need to consult " +":meth:`dst` unless you're interested in obtaining DST info separately. For " +"example, :meth:`datetime.timetuple` calls its :attr:`~.datetime.tzinfo` " +"attribute's :meth:`dst` method to determine how the " +":attr:`~time.struct_time.tm_isdst` flag should be set, and " +":meth:`tzinfo.fromutc` calls :meth:`dst` to account for DST changes when " +"crossing time zones." +msgstr "" +"如果 DST 未启用则返回 ``timedelta(0)``。 如果 DST 已启用,则将差值作为一个 :class:`timedelta` " +"对象返回(请参阅 :meth:`utcoffset` 了解详情)。 请注意 DST 差值如果可用,就会直接被加入 :meth:`utcoffset` " +"所返回的 UTC 时差,因此无需额外查询 :meth:`dst`,除非你希望单独获取 DST 信息。 " +"例如,:meth:`datetime.timetuple` 会调用其 :attr:`~.datetime.tzinfo` 属性的 :meth:`dst`" +" 方法来确定应该如何设置 :attr:`~time.struct_time.tm_isdst` 旗标,而 :meth:`tzinfo.fromutc` " +"会调用 :meth:`dst` 来在跨越时区时处理 DST 的改变。" + +#: ../../library/datetime.rst:2210 +msgid "" +"An instance *tz* of a :class:`tzinfo` subclass that models both standard and" +" daylight times must be consistent in this sense:" +msgstr "一个可以同时处理标准时和夏令时的 :class:`tzinfo` 子类的实例 *tz* 必须在此情形中保持一致:" + +#: ../../library/datetime.rst:2213 +msgid "``tz.utcoffset(dt) - tz.dst(dt)``" +msgstr "``tz.utcoffset(dt) - tz.dst(dt)``" + +#: ../../library/datetime.rst:2215 +msgid "" +"must return the same result for every :class:`.datetime` *dt* with " +"``dt.tzinfo == tz``. For sane :class:`!tzinfo` subclasses, this expression " +"yields the time zone's \"standard offset\", which should not depend on the " +"date or the time, but only on geographic location. The implementation of " +":meth:`datetime.astimezone` relies on this, but cannot detect violations; " +"it's the programmer's responsibility to ensure it. If a :class:`!tzinfo` " +"subclass cannot guarantee this, it may be able to override the default " +"implementation of :meth:`tzinfo.fromutc` to work correctly with " +":meth:`~.datetime.astimezone` regardless." +msgstr "" + +#: ../../library/datetime.rst:2224 +msgid "" +"Most implementations of :meth:`dst` will probably look like one of these " +"two::" +msgstr "大多数 :meth:`dst` 的实现可能会如以下两者之一::" + +#: ../../library/datetime.rst:2226 +msgid "" +"import datetime as dt\n" +"\n" +"def dst(self, when):\n" +" # a fixed-offset class: doesn't account for DST\n" +" return dt.timedelta(0)" +msgstr "" +"import datetime as dt\n" +"\n" +"def dst(self, when):\n" +" # 固定偏移类:不考虑夏令时\n" +" return dt.timedelta(0)" + +#: ../../library/datetime.rst:2232 +msgid "or::" +msgstr "或者::" + +#: ../../library/datetime.rst:2234 +msgid "" +"import datetime as dt\n" +"\n" +"def dst(self, when):\n" +" # Code to set dston and dstoff to the time zone's DST\n" +" # transition times based on the input when.year, and expressed\n" +" # in standard local time.\n" +"\n" +" if dston <= when.replace(tzinfo=None) < dstoff:\n" +" return dt.timedelta(hours=1)\n" +" else:\n" +" return dt.timedelta(0)" +msgstr "" +"import datetime as dt\n" +"\n" +"def dst(self, when):\n" +" # 此代码根据输入的 dt.year 设置时区的夏令时\n" +" # 切换的开始和结束时刻 dston 和 dstoff,并以\n" +" # 标准地方时表示。\n" +"\n" +" if dston <= when.replace(tzinfo=None) < dstoff:\n" +" return dt.timedelta(hours=1)\n" +" else:\n" +" return dt.timedelta(0)" + +#: ../../library/datetime.rst:2246 +msgid "" +"The default implementation of :meth:`dst` raises :exc:`NotImplementedError`." +msgstr "默认的 :meth:`dst` 实现会引发 :exc:`NotImplementedError`。" + +#: ../../library/datetime.rst:2254 +msgid "" +"Return the time zone name corresponding to the :class:`.datetime` object " +"*dt*, as a string. Nothing about string names is defined by the " +":mod:`!datetime` module, and there's no requirement that it mean anything in" +" particular. For example, ``\"GMT\"``, ``\"UTC\"``, ``\"-500\"``, " +"``\"-5:00\"``, ``\"EDT\"``, ``\"US/Eastern\"``, ``\"America/New York\"`` are" +" all valid replies. Return ``None`` if a string name isn't known. Note that " +"this is a method rather than a fixed string primarily because some " +":class:`tzinfo` subclasses will wish to return different names depending on " +"the specific value of *dt* passed, especially if the :class:`!tzinfo` class " +"is accounting for daylight time." +msgstr "" + +#: ../../library/datetime.rst:2264 +msgid "" +"The default implementation of :meth:`tzname` raises " +":exc:`NotImplementedError`." +msgstr "默认的 :meth:`tzname` 实现会引发 :exc:`NotImplementedError`。" + +#: ../../library/datetime.rst:2267 +msgid "" +"These methods are called by a :class:`.datetime` or :class:`.time` object, " +"in response to their methods of the same names. A :class:`!datetime` object " +"passes itself as the argument, and a :class:`!time` object passes ``None`` " +"as the argument. A :class:`tzinfo` subclass's methods should therefore be " +"prepared to accept a *dt* argument of ``None``, or of class " +":class:`!datetime`." +msgstr "" + +#: ../../library/datetime.rst:2273 +msgid "" +"When ``None`` is passed, it's up to the class designer to decide the best " +"response. For example, returning ``None`` is appropriate if the class wishes" +" to say that time objects don't participate in the :class:`tzinfo` " +"protocols. It may be more useful for ``utcoffset(None)`` to return the " +"standard UTC offset, as there is no other convention for discovering the " +"standard offset." +msgstr "" +"当传入 ``None`` 时,应当由类的设计者来决定最佳回应方式。 例如,返回 ``None`` 适用于希望该类提示时间对象不参与 " +":class:`tzinfo` 协议处理。 让 ``utcoffset(None)`` 返回标准 UTC " +"时差也许会更有用处,因为并没有其他可用于发现标准时差的约定惯例。" + +#: ../../library/datetime.rst:2279 +msgid "" +"When a :class:`.datetime` object is passed in response to a " +":class:`!datetime` method, ``dt.tzinfo`` is the same object as *self*. " +":class:`tzinfo` methods can rely on this, unless user code calls " +":class:`!tzinfo` methods directly. The intent is that the :class:`!tzinfo` " +"methods interpret *dt* as being in local time, and not need worry about " +"objects in other time zones." +msgstr "" + +#: ../../library/datetime.rst:2285 +msgid "" +"There is one more :class:`tzinfo` method that a subclass may wish to " +"override:" +msgstr "还有一个额外的 :class:`tzinfo` 方法,某个子类可能会希望重写它:" + +#: ../../library/datetime.rst:2290 +msgid "" +"This is called from the default :meth:`datetime.astimezone` implementation. " +"When called from that, ``dt.tzinfo`` is *self*, and *dt*'s date and time " +"data are to be viewed as expressing a UTC time. The purpose of " +":meth:`fromutc` is to adjust the date and time data, returning an equivalent" +" datetime in *self*'s local time." +msgstr "" +"此方法会由默认的 :meth:`datetime.astimezone` 实现来调用。 当被其调用时,``dt.tzinfo`` 为 *self*,并且" +" *dt* 的日期和时间数据会被视为表示 UTC 时间。 :meth:`fromutc` 的目标是调整日期和时间数据,返回一个等价的表示 *self* " +"的本地时间的 datetime。" + +#: ../../library/datetime.rst:2296 +msgid "" +"Most :class:`tzinfo` subclasses should be able to inherit the default " +":meth:`fromutc` implementation without problems. It's strong enough to " +"handle fixed-offset time zones, and time zones accounting for both standard " +"and daylight time, and the latter even if the DST transition times differ in" +" different years. An example of a time zone the default :meth:`fromutc` " +"implementation may not handle correctly in all cases is one where the " +"standard offset (from UTC) depends on the specific date and time passed, " +"which can happen for political reasons. The default implementations of " +":meth:`~.datetime.astimezone` and :meth:`fromutc` may not produce the result" +" you want if the result is one of the hours straddling the moment the " +"standard offset changes." +msgstr "" +"大多数 :class:`tzinfo` 子类应该能够毫无问题地继承默认的 :meth:`fromutc` 实现。 " +"它的健壮性足以处理固定差值的时区以及同时负责标准时和夏令时的时区,对于后者甚至还能处理 DST 转换时间在各个年份有变化的情况。 一个默认 " +":meth:`fromutc` 实现可能无法在所有情况下正确处理的例子是(与 UTC " +"的)标准时差取决于所经过的特定日期和时间,这种情况可能由于政治原因而出现。 默认的 :meth:`~.datetime.astimezone` 和 " +":meth:`fromutc` 实现可能无法生成你希望的结果,如果这个结果恰好是跨越了标准时差发生改变的时刻当中的某个小时值的话。" + +#: ../../library/datetime.rst:2307 +msgid "" +"Skipping code for error cases, the default :meth:`fromutc` implementation " +"acts like::" +msgstr "忽略针对错误情况的代码,默认 :meth:`fromutc` 实现的行为方式如下::" + +#: ../../library/datetime.rst:2310 +msgid "" +"import datetime as dt\n" +"\n" +"def fromutc(self, when):\n" +" # raise ValueError error if when.tzinfo is not self\n" +" dtoff = when.utcoffset()\n" +" dtdst = when.dst()\n" +" # raise ValueError if dtoff is None or dtdst is None\n" +" delta = dtoff - dtdst # this is self's standard offset\n" +" if delta:\n" +" when += delta # convert to standard local time\n" +" dtdst = when.dst()\n" +" # raise ValueError if dtdst is None\n" +" if dtdst:\n" +" return when + dtdst\n" +" else:\n" +" return when" +msgstr "" + +#: ../../library/datetime.rst:2327 +msgid "" +"In the following :download:`tzinfo_examples.py " +"<../includes/tzinfo_examples.py>` file there are some examples of " +":class:`tzinfo` classes:" +msgstr "" +"在以下 :download:`tzinfo_examples.py <../includes/tzinfo_examples.py>` 文件中有一些 " +":class:`tzinfo` 类的例子:" + +#: ../../library/datetime.rst:2331 +msgid "" +"import datetime as dt\n" +"\n" +"# A class capturing the platform's idea of local time.\n" +"# (May result in wrong values on historical times in\n" +"# timezones where UTC offset and/or the DST rules had\n" +"# changed in the past.)\n" +"import time\n" +"\n" +"ZERO = dt.timedelta(0)\n" +"HOUR = dt.timedelta(hours=1)\n" +"SECOND = dt.timedelta(seconds=1)\n" +"\n" +"STDOFFSET = dt.timedelta(seconds=-time.timezone)\n" +"if time.daylight:\n" +" DSTOFFSET = dt.timedelta(seconds=-time.altzone)\n" +"else:\n" +" DSTOFFSET = STDOFFSET\n" +"\n" +"DSTDIFF = DSTOFFSET - STDOFFSET\n" +"\n" +"\n" +"class LocalTimezone(dt.tzinfo):\n" +"\n" +" def fromutc(self, when):\n" +" assert when.tzinfo is self\n" +" stamp = (when - dt.datetime(1970, 1, 1, tzinfo=self)) // SECOND\n" +" args = time.localtime(stamp)[:6]\n" +" dst_diff = DSTDIFF // SECOND\n" +" # Detect fold\n" +" fold = (args == time.localtime(stamp - dst_diff))\n" +" return dt.datetime(*args, microsecond=when.microsecond,\n" +" tzinfo=self, fold=fold)\n" +"\n" +" def utcoffset(self, when):\n" +" if self._isdst(when):\n" +" return DSTOFFSET\n" +" else:\n" +" return STDOFFSET\n" +"\n" +" def dst(self, when):\n" +" if self._isdst(when):\n" +" return DSTDIFF\n" +" else:\n" +" return ZERO\n" +"\n" +" def tzname(self, when):\n" +" return time.tzname[self._isdst(when)]\n" +"\n" +" def _isdst(self, when):\n" +" tt = (when.year, when.month, when.day,\n" +" when.hour, when.minute, when.second,\n" +" when.weekday(), 0, 0)\n" +" stamp = time.mktime(tt)\n" +" tt = time.localtime(stamp)\n" +" return tt.tm_isdst > 0\n" +"\n" +"\n" +"Local = LocalTimezone()\n" +"\n" +"\n" +"# A complete implementation of current DST rules for major US time zones.\n" +"\n" +"def first_sunday_on_or_after(when):\n" +" days_to_go = 6 - when.weekday()\n" +" if days_to_go:\n" +" when += dt.timedelta(days_to_go)\n" +" return when\n" +"\n" +"\n" +"# US DST Rules\n" +"#\n" +"# This is a simplified (i.e., wrong for a few cases) set of rules for US\n" +"# DST start and end times. For a complete and up-to-date set of DST rules\n" +"# and timezone definitions, visit the Olson Database (or try pytz):\n" +"# http://www.twinsun.com/tz/tz-link.htm\n" +"# https://sourceforge.net/projects/pytz/ (might not be up-to-date)\n" +"#\n" +"# In the US, since 2007, DST starts at 2am (standard time) on the second\n" +"# Sunday in March, which is the first Sunday on or after Mar 8.\n" +"DSTSTART_2007 = dt.datetime(1, 3, 8, 2)\n" +"# and ends at 2am (DST time) on the first Sunday of Nov.\n" +"DSTEND_2007 = dt.datetime(1, 11, 1, 2)\n" +"# From 1987 to 2006, DST used to start at 2am (standard time) on the first\n" +"# Sunday in April and to end at 2am (DST time) on the last\n" +"# Sunday of October, which is the first Sunday on or after Oct 25.\n" +"DSTSTART_1987_2006 = dt.datetime(1, 4, 1, 2)\n" +"DSTEND_1987_2006 = dt.datetime(1, 10, 25, 2)\n" +"# From 1967 to 1986, DST used to start at 2am (standard time) on the last\n" +"# Sunday in April (the one on or after April 24) and to end at 2am (DST time)\n" +"# on the last Sunday of October, which is the first Sunday\n" +"# on or after Oct 25.\n" +"DSTSTART_1967_1986 = dt.datetime(1, 4, 24, 2)\n" +"DSTEND_1967_1986 = DSTEND_1987_2006\n" +"\n" +"\n" +"def us_dst_range(year):\n" +" # Find start and end times for US DST. For years before 1967, return\n" +" # start = end for no DST.\n" +" if 2006 < year:\n" +" dststart, dstend = DSTSTART_2007, DSTEND_2007\n" +" elif 1986 < year < 2007:\n" +" dststart, dstend = DSTSTART_1987_2006, DSTEND_1987_2006\n" +" elif 1966 < year < 1987:\n" +" dststart, dstend = DSTSTART_1967_1986, DSTEND_1967_1986\n" +" else:\n" +" return (dt.datetime(year, 1, 1), ) * 2\n" +"\n" +" start = first_sunday_on_or_after(dststart.replace(year=year))\n" +" end = first_sunday_on_or_after(dstend.replace(year=year))\n" +" return start, end\n" +"\n" +"\n" +"class USTimeZone(dt.tzinfo):\n" +"\n" +" def __init__(self, hours, reprname, stdname, dstname):\n" +" self.stdoffset = dt.timedelta(hours=hours)\n" +" self.reprname = reprname\n" +" self.stdname = stdname\n" +" self.dstname = dstname\n" +"\n" +" def __repr__(self):\n" +" return self.reprname\n" +"\n" +" def tzname(self, when):\n" +" if self.dst(when):\n" +" return self.dstname\n" +" else:\n" +" return self.stdname\n" +"\n" +" def utcoffset(self, when):\n" +" return self.stdoffset + self.dst(when)\n" +"\n" +" def dst(self, when):\n" +" if when is None or when.tzinfo is None:\n" +" # An exception may be sensible here, in one or both cases.\n" +" # It depends on how you want to treat them. The default\n" +" # fromutc() implementation (called by the default astimezone()\n" +" # implementation) passes a datetime with when.tzinfo is self.\n" +" return ZERO\n" +" assert when.tzinfo is self\n" +" start, end = us_dst_range(when.year)\n" +" # Can't compare naive to aware objects, so strip the timezone from\n" +" # when first.\n" +" when = when.replace(tzinfo=None)\n" +" if start + HOUR <= when < end - HOUR:\n" +" # DST is in effect.\n" +" return HOUR\n" +" if end - HOUR <= when < end:\n" +" # Fold (an ambiguous hour): use when.fold to disambiguate.\n" +" return ZERO if when.fold else HOUR\n" +" if start <= when < start + HOUR:\n" +" # Gap (a non-existent hour): reverse the fold rule.\n" +" return HOUR if when.fold else ZERO\n" +" # DST is off.\n" +" return ZERO\n" +"\n" +" def fromutc(self, when):\n" +" assert when.tzinfo is self\n" +" start, end = us_dst_range(when.year)\n" +" start = start.replace(tzinfo=self)\n" +" end = end.replace(tzinfo=self)\n" +" std_time = when + self.stdoffset\n" +" dst_time = std_time + HOUR\n" +" if end <= dst_time < end + HOUR:\n" +" # Repeated hour\n" +" return std_time.replace(fold=1)\n" +" if std_time < start or dst_time >= end:\n" +" # Standard time\n" +" return std_time\n" +" if start <= std_time < end - HOUR:\n" +" # Daylight saving time\n" +" return dst_time\n" +"\n" +"\n" +"Eastern = USTimeZone(-5, \"Eastern\", \"EST\", \"EDT\")\n" +"Central = USTimeZone(-6, \"Central\", \"CST\", \"CDT\")\n" +"Mountain = USTimeZone(-7, \"Mountain\", \"MST\", \"MDT\")\n" +"Pacific = USTimeZone(-8, \"Pacific\", \"PST\", \"PDT\")\n" +msgstr "" + +#: ../../library/datetime.rst:2333 +msgid "" +"Note that there are unavoidable subtleties twice per year in a " +":class:`tzinfo` subclass accounting for both standard and daylight time, at " +"the DST transition points. For concreteness, consider US Eastern (UTC " +"-0500), where EDT begins the minute after 1:59 (EST) on the second Sunday in" +" March, and ends the minute after 1:59 (EDT) on the first Sunday in " +"November::" +msgstr "" +"请注意同时负责标准时和夏令时的 :class:`tzinfo` 子类在每年两次的 DST 转换点上会出现不可避免的微妙问题。具体而言,考虑美国东部时区 " +"(UTC -0500),它的 EDT 从三月的第二个星期天 1:59 (EST) 之后一分钟开始,并在十一月的第一天星期天 1:59 (EDT) " +"之后一分钟结束::" + +#: ../../library/datetime.rst:2339 +msgid "" +" UTC 3:MM 4:MM 5:MM 6:MM 7:MM 8:MM\n" +" EST 22:MM 23:MM 0:MM 1:MM 2:MM 3:MM\n" +" EDT 23:MM 0:MM 1:MM 2:MM 3:MM 4:MM\n" +"\n" +"start 22:MM 23:MM 0:MM 1:MM 3:MM 4:MM\n" +"\n" +" end 23:MM 0:MM 1:MM 1:MM 2:MM 3:MM" +msgstr "" +" UTC 3:MM 4:MM 5:MM 6:MM 7:MM 8:MM\n" +" EST 22:MM 23:MM 0:MM 1:MM 2:MM 3:MM\n" +" EDT 23:MM 0:MM 1:MM 2:MM 3:MM 4:MM\n" +"\n" +"start 22:MM 23:MM 0:MM 1:MM 3:MM 4:MM\n" +"\n" +" end 23:MM 0:MM 1:MM 1:MM 2:MM 3:MM" + +#: ../../library/datetime.rst:2347 +msgid "" +"When DST starts (the \"start\" line), the local wall clock leaps from 1:59 " +"to 3:00. A wall time of the form 2:MM doesn't really make sense on that day," +" so ``astimezone(Eastern)`` won't deliver a result with ``hour == 2`` on the" +" day DST begins. For example, at the Spring forward transition of 2016, we " +"get::" +msgstr "" +"当 DST 开始时(即 \"start\" 行),本地时钟从 1:59 跳到 3:00。 形式为 2:MM 的时间值在那一天是没有意义的,因此在 DST" +" 开始那一天 ``astimezone(Eastern)`` 不会输出包含 ``hour == 2`` 的结果。 例如,在 2016 " +"年春季时钟向前调整时,我们得到::" + +#: ../../library/datetime.rst:2352 +msgid "" +">>> import datetime as dt\n" +">>> from tzinfo_examples import HOUR, Eastern\n" +">>> u0 = dt.datetime(2016, 3, 13, 5, tzinfo=dt.timezone.utc)\n" +">>> for i in range(4):\n" +"... u = u0 + i*HOUR\n" +"... t = u.astimezone(Eastern)\n" +"... print(u.time(), 'UTC =', t.time(), t.tzname())\n" +"...\n" +"05:00:00 UTC = 00:00:00 EST\n" +"06:00:00 UTC = 01:00:00 EST\n" +"07:00:00 UTC = 03:00:00 EDT\n" +"08:00:00 UTC = 04:00:00 EDT" +msgstr "" +">>> import datetime as dt\n" +">>> from tzinfo_examples import HOUR, Eastern\n" +">>> u0 = dt.datetime(2016, 3, 13, 5, tzinfo=dt.timezone.utc)\n" +">>> for i in range(4):\n" +"... u = u0 + i*HOUR\n" +"... t = u.astimezone(Eastern)\n" +"... print(u.time(), 'UTC =', t.time(), t.tzname())\n" +"...\n" +"05:00:00 UTC = 00:00:00 EST\n" +"06:00:00 UTC = 01:00:00 EST\n" +"07:00:00 UTC = 03:00:00 EDT\n" +"08:00:00 UTC = 04:00:00 EDT" + +#: ../../library/datetime.rst:2366 +msgid "" +"When DST ends (the \"end\" line), there's a potentially worse problem: " +"there's an hour that can't be spelled unambiguously in local wall time: the " +"last hour of daylight time. In Eastern, that's times of the form 5:MM UTC on" +" the day daylight time ends. The local wall clock leaps from 1:59 (daylight " +"time) back to 1:00 (standard time) again. Local times of the form 1:MM are " +"ambiguous. :meth:`~.datetime.astimezone` mimics the local clock's behavior " +"by mapping two adjacent UTC hours into the same local hour then. In the " +"Eastern example, UTC times of the form 5:MM and 6:MM both map to 1:MM when " +"converted to Eastern, but earlier times have the :attr:`~.datetime.fold` " +"attribute set to 0 and the later times have it set to 1. For example, at the" +" Fall back transition of 2016, we get::" +msgstr "" +"当 DST 结束时(见 \"end\" 行),会有更糟糕的潜在问题:本地时间值中有一个小时是不可能没有歧义的:夏令时的最后一小时。 " +"即以北美东部时间表示当天夏令时结束时的形式为 5:MM UTC 的时间。 本地时钟从 1:59(夏令时)再次跳回到 1:00(标准时)。 形式为 " +"1:MM 的本地时间就是有歧义的。 此时 :meth:`~.datetime.astimezone` 是通过将两个相邻的 UTC " +"小时映射到两个相同的本地小时来模仿本地时钟的行为。 在这个北美东部时间的示例中,形式为 5:MM 和 6:MM 的 UTC " +"时间在转换为北美东部时间时都将被映射到 1:MM,但前一个时间会将 :attr:`~.datetime.fold` 属性设为 0 而后一个时间会将其设为" +" 1。 例如,在 2016 年秋季时钟往回调整时,我们得到::" + +#: ../../library/datetime.rst:2377 +msgid "" +">>> import datetime as dt\n" +">>> from tzinfo_examples import HOUR, Eastern\n" +">>> u0 = dt.datetime(2016, 11, 6, 4, tzinfo=dt.timezone.utc)\n" +">>> for i in range(4):\n" +"... u = u0 + i*HOUR\n" +"... t = u.astimezone(Eastern)\n" +"... print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold)\n" +"...\n" +"04:00:00 UTC = 00:00:00 EDT 0\n" +"05:00:00 UTC = 01:00:00 EDT 0\n" +"06:00:00 UTC = 01:00:00 EST 1\n" +"07:00:00 UTC = 02:00:00 EST 0" +msgstr "" +">>> import datetime as dt\n" +">>> from tzinfo_examples import HOUR, Eastern\n" +">>> u0 = dt.datetime(2016, 11, 6, 4, tzinfo=dt.timezone.utc)\n" +">>> for i in range(4):\n" +"... u = u0 + i*HOUR\n" +"... t = u.astimezone(Eastern)\n" +"... print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold)\n" +"...\n" +"04:00:00 UTC = 00:00:00 EDT 0\n" +"05:00:00 UTC = 01:00:00 EDT 0\n" +"06:00:00 UTC = 01:00:00 EST 1\n" +"07:00:00 UTC = 02:00:00 EST 0" + +#: ../../library/datetime.rst:2390 +msgid "" +"Note that the :class:`.datetime` instances that differ only by the value of " +"the :attr:`~.datetime.fold` attribute are considered equal in comparisons." +msgstr "" +"请注意不同的 :class:`.datetime` 实例仅通过 :attr:`~.datetime.fold` " +"属性值来加以区分,它们在比较时会被视为相等。" + +#: ../../library/datetime.rst:2393 +msgid "" +"Applications that can't bear wall-time ambiguities should explicitly check " +"the value of the :attr:`~.datetime.fold` attribute or avoid using hybrid " +":class:`tzinfo` subclasses; there are no ambiguities when using " +":class:`timezone`, or any other fixed-offset :class:`!tzinfo` subclass (such" +" as a class representing only EST (fixed offset -5 hours), or only EDT " +"(fixed offset -4 hours))." +msgstr "" + +#: ../../library/datetime.rst:2401 +msgid ":mod:`zoneinfo`" +msgstr ":mod:`zoneinfo`" + +#: ../../library/datetime.rst:2402 +msgid "" +"The :mod:`!datetime` module has a basic :class:`timezone` class (for " +"handling arbitrary fixed offsets from UTC) and its :attr:`timezone.utc` " +"attribute (a UTC :class:`!timezone` instance)." +msgstr "" +":mod:`!datetime` 模块有一个基本 :class:`timezone` 类(用来处理任意与 UTC 的固定时差)及其 " +":attr:`timezone.utc` 属性(UTC :class:`!timezone` 实例)。" + +#: ../../library/datetime.rst:2406 +msgid "" +"``zoneinfo`` brings the *IANA time zone database* (also known as the Olson " +"database) to Python, and its usage is recommended." +msgstr "``zoneinfo`` 为 Python 带来了 *IANA时区数据库* (也被称为 Olson 数据库),推荐使用它。" + +#: ../../library/datetime.rst:2409 +msgid "`IANA time zone database `_" +msgstr "`IANA 时区数据库 `_" + +#: ../../library/datetime.rst:2410 +msgid "" +"The Time Zone Database (often called tz, tzdata or zoneinfo) contains code " +"and data that represent the history of local time for many representative " +"locations around the globe. It is updated periodically to reflect changes " +"made by political bodies to time zone boundaries, UTC offsets, and daylight-" +"saving rules." +msgstr "" +"该时区数据库 (通常称为 tz, tzdata 或 zoneinfo) 包含大量代码和数据用来表示全球许多有代表性的地点的本地时间的历史信息。 " +"它会定期进行更新以反映各政治实体对时区边界、UTC 差值和夏令时规则的更改。" + +#: ../../library/datetime.rst:2420 +msgid ":class:`!timezone` objects" +msgstr ":class:`!timezone` 对象" + +#: ../../library/datetime.rst:2422 +msgid "" +"The :class:`timezone` class is a subclass of :class:`tzinfo`, each instance " +"of which represents a time zone defined by a fixed offset from UTC." +msgstr "" +":class:`timezone` 类是 :class:`tzinfo` 的子类,它的每个实例都代表一个以与 UTC 的固定时差来定义的时区。" + +#: ../../library/datetime.rst:2426 +msgid "" +"Objects of this class cannot be used to represent time zone information in " +"the locations where different offsets are used in different days of the year" +" or where historical changes have been made to civil time." +msgstr "此类的对象不可被用于代表某些特殊地点的时区信息,这些地点在一年的不同日期会使用不同的时差,或是在历史上对民用时间进行过调整。" + +#: ../../library/datetime.rst:2433 +msgid "" +"The *offset* argument must be specified as a :class:`timedelta` object " +"representing the difference between the local time and UTC. It must be " +"strictly between ``-timedelta(hours=24)`` and ``timedelta(hours=24)``, " +"otherwise :exc:`ValueError` is raised." +msgstr "" +"*offset* 参数必须指定为一个 :class:`timedelta` 对象,表示本地时间与 UTC 的时差。 它必须严格限制于 " +"``-timedelta(hours=24)`` 和 ``timedelta(hours=24)`` 之间,否则会引发 " +":exc:`ValueError`。" + +#: ../../library/datetime.rst:2438 +msgid "" +"The *name* argument is optional. If specified it must be a string that will " +"be used as the value returned by the :meth:`datetime.tzname` method." +msgstr "*name* 参数是可选的。 如果指定则必须为一个字符串,它将被用作 :meth:`datetime.tzname` 方法的返回值。" + +#: ../../library/datetime.rst:2449 ../../library/datetime.rst:2461 +msgid "" +"Return the fixed value specified when the :class:`timezone` instance is " +"constructed." +msgstr "返回当 :class:`timezone` 实例被构造时指定的固定值。" + +#: ../../library/datetime.rst:2452 +msgid "" +"The *dt* argument is ignored. The return value is a :class:`timedelta` " +"instance equal to the difference between the local time and UTC." +msgstr "*dt* 参数会被忽略。 返回值是一个 :class:`timedelta` 实例,其值等于本地时间与 UTC 之间的时差。" + +#: ../../library/datetime.rst:2464 +msgid "" +"If *name* is not provided in the constructor, the name returned by " +"``tzname(dt)`` is generated from the value of the ``offset`` as follows. If " +"*offset* is ``timedelta(0)``, the name is \"UTC\", otherwise it is a string " +"in the format ``UTC±HH:MM``, where ± is the sign of ``offset``, HH and MM " +"are two digits of ``offset.hours`` and ``offset.minutes`` respectively." +msgstr "" +"如果没有在构造器中提供 *name*,则 ``tzname(dt)`` 所返回的名称将根据 ``offset`` 值按以下规则生成。 如果 " +"*offset* 为 ``timedelta(0)``,则名称为“UTC”,否则为字符串 ``UTC±HH:MM``,其中 ± 为 ``offset``" +" 的正负符号,HH 和 MM 分别为表示 ``offset.hours`` 和 ``offset.minutes`` 的两个数码。" + +#: ../../library/datetime.rst:2470 +msgid "" +"Name generated from ``offset=timedelta(0)`` is now plain ``'UTC'``, not " +"``'UTC+00:00'``." +msgstr "由 ``offset=timedelta(0)`` 生成的名称现在是简单的 ``'UTC'``,而不是 ``'UTC+00:00'``。" + +#: ../../library/datetime.rst:2477 +msgid "Always returns ``None``." +msgstr "总是返回 ``None``。" + +#: ../../library/datetime.rst:2482 +msgid "" +"Return ``dt + offset``. The *dt* argument must be an aware " +":class:`.datetime` instance, with ``tzinfo`` set to ``self``." +msgstr "" +"返回 ``dt + offset``。 *dt* 参数必须为一个感知型 :class:`.datetime` 实例,其中 ``tzinfo`` 值设为 " +"``self``。" + +#: ../../library/datetime.rst:2490 +msgid "The UTC time zone, ``timezone(timedelta(0))``." +msgstr "UTC 时区,``timezone(timedelta(0))``。" + +#: ../../library/datetime.rst:2499 +msgid ":meth:`!strftime` and :meth:`!strptime` behavior" +msgstr ":meth:`!strftime` 和 :meth:`!strptime` 的行为" + +#: ../../library/datetime.rst:2501 +msgid "" +":class:`date`, :class:`.datetime`, and :class:`.time` objects all support a " +"``strftime(format)`` method, to create a string representing the time under " +"the control of an explicit format string." +msgstr "" +":class:`date`, :class:`.datetime` 和 :class:`.time` 对象都支持 " +"``strftime(format)`` 方法,可用来创建由一个显式格式字符串所控制的表示时间的字符串。" + +#: ../../library/datetime.rst:2505 +msgid "" +"Conversely, the :meth:`date.strptime`, :meth:`datetime.strptime` and " +":meth:`time.strptime` class methods create an object from a string " +"representing the time and a corresponding format string." +msgstr "" +"相反,:meth:`date.strptime`、:meth:`datetime.strptime` 和 :meth:`time.strptime` " +"类方法从表示时间的字符串和相应的格式字符串创建对象。" + +#: ../../library/datetime.rst:2509 +msgid "" +"The table below provides a high-level comparison of " +":meth:`~.datetime.strftime` versus :meth:`~.datetime.strptime`:" +msgstr "" +"下表提供了 :meth:`~.datetime.strftime` 与 :meth:`~.datetime.strptime` 的高层级比较:" + +#: ../../library/datetime.rst:2513 +msgid "``strftime``" +msgstr "``strftime``" + +#: ../../library/datetime.rst:2513 +msgid "``strptime``" +msgstr "``strptime``" + +#: ../../library/datetime.rst:2515 +msgid "Usage" +msgstr "用法" + +#: ../../library/datetime.rst:2515 +msgid "Convert object to a string according to a given format" +msgstr "根据给定的格式将对象转换为字符串" + +#: ../../library/datetime.rst:2515 +msgid "Parse a string into an object given a corresponding format" +msgstr "将字符串解析为给定相应格式的对象" + +#: ../../library/datetime.rst:2517 +msgid "Type of method" +msgstr "方法类型" + +#: ../../library/datetime.rst:2517 +msgid "Instance method" +msgstr "实例方法" + +#: ../../library/datetime.rst:2517 +msgid "Class method" +msgstr "类方法" + +#: ../../library/datetime.rst:2519 +msgid "Signature" +msgstr "签名" + +#: ../../library/datetime.rst:2519 +msgid "``strftime(format)``" +msgstr "``strftime(format)``" + +#: ../../library/datetime.rst:2519 +msgid "``strptime(date_string, format)``" +msgstr "``strptime(date_string, format)``" + +#: ../../library/datetime.rst:2526 +msgid ":meth:`!strftime` and :meth:`!strptime` format codes" +msgstr ":meth:`!strftime` 和 :meth:`!strptime` 格式代码" + +#: ../../library/datetime.rst:2528 +msgid "" +"These methods accept format codes that can be used to parse and format " +"dates::" +msgstr "这些方法接受可被用于解析和格式化日期的格式代码::" + +#: ../../library/datetime.rst:2530 +msgid "" +">>> import datetime as dt\n" +">>> dt.datetime.strptime('31/01/22 23:59:59.999999',\n" +"... '%d/%m/%y %H:%M:%S.%f')\n" +"datetime.datetime(2022, 1, 31, 23, 59, 59, 999999)\n" +">>> _.strftime('%a %d %b %Y, %I:%M%p')\n" +"'Mon 31 Jan 2022, 11:59PM'" +msgstr "" +">>> import datetime as dt\n" +">>> dt.datetime.strptime('31/01/22 23:59:59.999999',\n" +"... '%d/%m/%y %H:%M:%S.%f')\n" +"datetime.datetime(2022, 1, 31, 23, 59, 59, 999999)\n" +">>> _.strftime('%a %d %b %Y, %I:%M%p')\n" +"'Mon 31 Jan 2022, 11:59PM'" + +#: ../../library/datetime.rst:2537 +msgid "" +"The following is a list of all the format codes that the 2011 C standard " +"requires, and these work on all supported platforms." +msgstr "" + +#: ../../library/datetime.rst:2541 ../../library/datetime.rst:2696 +msgid "Directive" +msgstr "指示符" + +#: ../../library/datetime.rst:2541 ../../library/datetime.rst:2696 +msgid "Meaning" +msgstr "含意" + +#: ../../library/datetime.rst:2541 ../../library/datetime.rst:2696 +msgid "Example" +msgstr "示例" + +#: ../../library/datetime.rst:2541 ../../library/datetime.rst:2696 +msgid "Notes" +msgstr "备注" + +#: ../../library/datetime.rst:2544 +msgid "``%a``" +msgstr "``%a``" + +#: ../../library/datetime.rst:2544 +msgid "Weekday as locale's abbreviated name." +msgstr "当地工作日的缩写。" + +#: ../../library/datetime.rst:0 +msgid "Sun, Mon, ..., Sat (en_US);" +msgstr "Sun, Mon, ..., Sat (en_US);" + +#: ../../library/datetime.rst:0 +msgid "So, Mo, ..., Sa (de_DE)" +msgstr "So, Mo, ..., Sa (de_DE)" + +#: ../../library/datetime.rst:2549 +msgid "``%A``" +msgstr "``%A``" + +#: ../../library/datetime.rst:2549 +msgid "Weekday as locale's full name." +msgstr "本地化的星期中每日的完整名称。" + +#: ../../library/datetime.rst:0 +msgid "Sunday, Monday, ..., Saturday (en_US);" +msgstr "Sunday, Monday, ..., Saturday (en_US);" + +#: ../../library/datetime.rst:0 +msgid "Sonntag, Montag, ..., Samstag (de_DE)" +msgstr "Sonntag, Montag, ..., Samstag (de_DE)" + +#: ../../library/datetime.rst:2554 +msgid "``%b``" +msgstr "``%b``" + +#: ../../library/datetime.rst:2554 +msgid "Month as locale's abbreviated name." +msgstr "当地月份的缩写。" + +#: ../../library/datetime.rst:0 +msgid "Jan, Feb, ..., Dec (en_US);" +msgstr "Jan, Feb, ..., Dec (en_US);" + +#: ../../library/datetime.rst:0 +msgid "Jan, Feb, ..., Dez (de_DE)" +msgstr "Jan, Feb, ..., Dez (de_DE)" + +#: ../../library/datetime.rst:2559 +msgid "``%B``" +msgstr "``%B``" + +#: ../../library/datetime.rst:2559 +msgid "Month as locale's full name." +msgstr "本地化的月份全名。" + +#: ../../library/datetime.rst:0 +msgid "January, February, ..., December (en_US);" +msgstr "January, February, ..., December (en_US);" + +#: ../../library/datetime.rst:0 +msgid "Januar, Februar, ..., Dezember (de_DE)" +msgstr "Januar, Februar, ..., Dezember (de_DE)" + +#: ../../library/datetime.rst:2564 +msgid "``%c``" +msgstr "``%c``" + +#: ../../library/datetime.rst:2564 +msgid "Locale's appropriate date and time representation." +msgstr "本地化的适当日期和时间表示。" + +#: ../../library/datetime.rst:0 +msgid "Tue Aug 16 21:30:00 1988 (en_US);" +msgstr "Tue Aug 16 21:30:00 1988 (en_US);" + +#: ../../library/datetime.rst:0 +msgid "Di 16 Aug 21:30:00 1988 (de_DE)" +msgstr "Di 16 Aug 21:30:00 1988 (de_DE)" + +#: ../../library/datetime.rst:2569 +msgid "``%C``" +msgstr "" + +#: ../../library/datetime.rst:2569 +msgid "" +"The year divided by 100 and truncated to an integer as a zero-padded decimal" +" number." +msgstr "" + +#: ../../library/datetime.rst:2569 +msgid "01, 02, ..., 99" +msgstr "01, 02, ..., 99" + +#: ../../library/datetime.rst:2569 ../../library/datetime.rst:2585 +#: ../../library/datetime.rst:2595 +msgid "\\(0)" +msgstr "\\(0)" + +#: ../../library/datetime.rst:2573 +msgid "``%d``" +msgstr "``%d``" + +#: ../../library/datetime.rst:2573 +msgid "Day of the month as a zero-padded decimal number." +msgstr "补零后,以十进制数显示的月份中的一天。" + +#: ../../library/datetime.rst:2573 +msgid "01, 02, ..., 31" +msgstr "01, 02, ..., 31" + +#: ../../library/datetime.rst:2573 +msgid "\\(9), \\(10)" +msgstr "\\(9), \\(10)" + +#: ../../library/datetime.rst:2576 +msgid "``%D``" +msgstr "``%D``" + +#: ../../library/datetime.rst:2576 +msgid "Equivalent to ``%m/%d/%y``." +msgstr "等价于 ``%m/%d/%y``。" + +#: ../../library/datetime.rst:2576 +msgid "11/28/25" +msgstr "11/28/25" + +#: ../../library/datetime.rst:2576 ../../library/datetime.rst:2597 +#: ../../library/datetime.rst:2600 ../../library/datetime.rst:2603 +#: ../../library/datetime.rst:2606 ../../library/datetime.rst:2609 +#: ../../library/datetime.rst:2671 +msgid "\\(9)" +msgstr "\\(9)" + +#: ../../library/datetime.rst:2579 +msgid "``%e``" +msgstr "``%e``" + +#: ../../library/datetime.rst:2579 +msgid "The day of the month as a space-padded decimal number." +msgstr "" + +#: ../../library/datetime.rst:2579 +msgid "␣1, ␣2, ..., 31" +msgstr "" + +#: ../../library/datetime.rst:2579 +msgid "\\(10)" +msgstr "\\(10)" + +#: ../../library/datetime.rst:2582 +msgid "``%F``" +msgstr "" + +#: ../../library/datetime.rst:2582 +msgid "Equivalent to ``%Y-%m-%d``, the ISO 8601 format." +msgstr "" + +#: ../../library/datetime.rst:2582 +msgid "2025-10-11, 1001-12-30" +msgstr "" + +#: ../../library/datetime.rst:2585 +msgid "``%g``" +msgstr "" + +#: ../../library/datetime.rst:2585 +msgid "" +"Last 2 digits of ISO 8601 year representing the year that contains the " +"greater part of the ISO week (``%V``)." +msgstr "" + +#: ../../library/datetime.rst:2585 ../../library/datetime.rst:2671 +msgid "00, 01, ..., 99" +msgstr "00, 01, ..., 99" + +#: ../../library/datetime.rst:2590 +msgid "``%G``" +msgstr "``%G``" + +#: ../../library/datetime.rst:2590 +msgid "" +"ISO 8601 year with century representing the year that contains the greater " +"part of the ISO week (``%V``)." +msgstr "带有世纪的 ISO 8601 年份,表示包含大部分 ISO 星期 (``%V``) 的年份。" + +#: ../../library/datetime.rst:2590 ../../library/datetime.rst:2674 +msgid "0001, 0002, ..., 2013, 2014, ..., 9998, 9999" +msgstr "0001, 0002, ..., 2013, 2014, ..., 9998, 9999" + +#: ../../library/datetime.rst:2590 +msgid "\\(8)" +msgstr "\\(8)" + +#: ../../library/datetime.rst:2595 +msgid "``%h``" +msgstr "" + +#: ../../library/datetime.rst:2595 +msgid "Equivalent to ``%b``." +msgstr "" + +#: ../../library/datetime.rst:2595 +msgid "See ``%b``." +msgstr "" + +#: ../../library/datetime.rst:2597 +msgid "``%H``" +msgstr "``%H``" + +#: ../../library/datetime.rst:2597 +msgid "Hour (24-hour clock) as a zero-padded decimal number." +msgstr "以补零后的十进制数表示的小时(24 小时制)。" + +#: ../../library/datetime.rst:2597 +msgid "00, 01, ..., 23" +msgstr "00, 01, ..., 23" + +#: ../../library/datetime.rst:2600 +msgid "``%I``" +msgstr "``%I``" + +#: ../../library/datetime.rst:2600 +msgid "Hour (12-hour clock) as a zero-padded decimal number." +msgstr "以补零后的十进制数表示的小时(12 小时制)。" + +#: ../../library/datetime.rst:2600 ../../library/datetime.rst:2606 +msgid "01, 02, ..., 12" +msgstr "01, 02, ..., 12" + +#: ../../library/datetime.rst:2603 +msgid "``%j``" +msgstr "``%j``" + +#: ../../library/datetime.rst:2603 +msgid "Day of the year as a zero-padded decimal number." +msgstr "以补零后的十进制数表示的一年中的日序号。" + +#: ../../library/datetime.rst:2603 +msgid "001, 002, ..., 366" +msgstr "001, 002, ..., 366" + +#: ../../library/datetime.rst:2606 +msgid "``%m``" +msgstr "``%m``" + +#: ../../library/datetime.rst:2606 +msgid "Month as a zero-padded decimal number." +msgstr "补零后,以十进制数显示的月份。" + +#: ../../library/datetime.rst:2609 +msgid "``%M``" +msgstr "``%M``" + +#: ../../library/datetime.rst:2609 +msgid "Minute as a zero-padded decimal number." +msgstr "补零后,以十进制数显示的分钟。" + +#: ../../library/datetime.rst:2609 ../../library/datetime.rst:2625 +msgid "00, 01, ..., 59" +msgstr "00, 01, ..., 59" + +#: ../../library/datetime.rst:2612 +msgid "``%n``" +msgstr "" + +#: ../../library/datetime.rst:2612 +msgid "" +"The newline character (``'\\n'``). For :meth:`!strptime`, zero or more " +"whitespace." +msgstr "" + +#: ../../library/datetime.rst:2612 +msgid "``\\n``" +msgstr "``\\n``" + +#: ../../library/datetime.rst:2617 +msgid "``%p``" +msgstr "``%p``" + +#: ../../library/datetime.rst:2617 +msgid "Locale's equivalent of either AM or PM." +msgstr "本地化的 AM 或 PM 。" + +#: ../../library/datetime.rst:0 +msgid "AM, PM (en_US);" +msgstr "AM, PM (en_US);" + +#: ../../library/datetime.rst:0 +msgid "am, pm (de_DE)" +msgstr "am, pm (de_DE)" + +#: ../../library/datetime.rst:2617 +msgid "\\(1), \\(3)" +msgstr "\\(1), \\(3)" + +#: ../../library/datetime.rst:2620 +msgid "``%r``" +msgstr "" + +#: ../../library/datetime.rst:2620 +msgid "Locale's 12-hour clock time." +msgstr "" + +#: ../../library/datetime.rst:2620 +msgid "12:00:00 AM" +msgstr "" + +#: ../../library/datetime.rst:2620 +msgid "\\(1), \\(0)" +msgstr "" + +#: ../../library/datetime.rst:2623 +msgid "``%R``" +msgstr "" + +#: ../../library/datetime.rst:2623 +msgid "Equivalent to ``%H:%M``." +msgstr "" + +#: ../../library/datetime.rst:2623 +msgid "10:01" +msgstr "" + +#: ../../library/datetime.rst:2625 +msgid "``%S``" +msgstr "``%S``" + +#: ../../library/datetime.rst:2625 +msgid "Second as a zero-padded decimal number." +msgstr "补零后,以十进制数显示的秒。" + +#: ../../library/datetime.rst:2625 +msgid "\\(4), \\(9)" +msgstr "\\(4), \\(9)" + +#: ../../library/datetime.rst:2628 +msgid "``%t``" +msgstr "" + +#: ../../library/datetime.rst:2628 +msgid "" +"The tab character (``'\\t'``). For :meth:`!strptime`, zero or more " +"whitespace." +msgstr "" + +#: ../../library/datetime.rst:2628 +msgid "``\\t``" +msgstr "``\\t``" + +#: ../../library/datetime.rst:2632 +msgid "``%T``" +msgstr "" + +#: ../../library/datetime.rst:2632 +msgid "ISO 8601 time format, equivalent to ``%H:%M:%S``." +msgstr "" + +#: ../../library/datetime.rst:2632 +msgid "10:01:59" +msgstr "" + +#: ../../library/datetime.rst:2635 +msgid "``%u``" +msgstr "``%u``" + +#: ../../library/datetime.rst:2635 +msgid "ISO 8601 weekday as a decimal number where 1 is Monday." +msgstr "以十进制数显示的 ISO 8601 星期中的日序号,其中 1 表示星期一。" + +#: ../../library/datetime.rst:2635 +msgid "1, 2, ..., 7" +msgstr "1, 2, ..., 7" + +#: ../../library/datetime.rst:2638 +msgid "``%U``" +msgstr "``%U``" + +#: ../../library/datetime.rst:2638 +msgid "" +"Week number of the year (Sunday as the first day of the week) as a zero-" +"padded decimal number. All days in a new year preceding the first Sunday are" +" considered to be in week 0." +msgstr "以补零后的十进制数表示的一年中的周序号(星期日作为每周的第一天)。 在新的一年中第一个星期日之前的所有日子都被视为是在第 0 周。" + +#: ../../library/datetime.rst:2638 ../../library/datetime.rst:2656 +msgid "00, 01, ..., 53" +msgstr "00, 01, ..., 53" + +#: ../../library/datetime.rst:2638 ../../library/datetime.rst:2656 +msgid "\\(7), \\(9)" +msgstr "\\(7), \\(9)" + +#: ../../library/datetime.rst:2646 +msgid "``%V``" +msgstr "``%V``" + +#: ../../library/datetime.rst:2646 +msgid "" +"ISO 8601 week as a decimal number with Monday as the first day of the week. " +"Week 01 is the week containing Jan 4." +msgstr "以十进制数显示的 ISO 8601 星期,以星期一作为每周的第一天。 第 01 周为包含 1 月 4 日的星期。" + +#: ../../library/datetime.rst:2646 +msgid "01, 02, ..., 53" +msgstr "01, 02, ..., 53" + +#: ../../library/datetime.rst:2646 +msgid "\\(8), \\(9)" +msgstr "\\(8), \\(9)" + +#: ../../library/datetime.rst:2652 +msgid "``%w``" +msgstr "``%w``" + +#: ../../library/datetime.rst:2652 +msgid "Weekday as a decimal number, where 0 is Sunday and 6 is Saturday." +msgstr "以十进制数显示的工作日,其中0表示星期日,6表示星期六。" + +#: ../../library/datetime.rst:2652 +msgid "0, 1, ..., 6" +msgstr "0, 1, ..., 6" + +#: ../../library/datetime.rst:2656 +msgid "``%W``" +msgstr "``%W``" + +#: ../../library/datetime.rst:2656 +msgid "" +"Week number of the year (Monday as the first day of the week) as a zero-" +"padded decimal number. All days in a new year preceding the first Monday are" +" considered to be in week 0." +msgstr "以补零后的十进制数表示的一年中的周序号(星期一作为每周的第一天)。 在新的一年中第一个星期一之前的所有日子都被视为是在第 0 周。" + +#: ../../library/datetime.rst:2664 +msgid "``%x``" +msgstr "``%x``" + +#: ../../library/datetime.rst:2664 +msgid "Locale's appropriate date representation." +msgstr "本地化的适当日期表示。" + +#: ../../library/datetime.rst:0 +msgid "08/16/88 (None);" +msgstr "08/16/88 (None);" + +#: ../../library/datetime.rst:0 +msgid "08/16/1988 (en_US);" +msgstr "08/16/1988 (en_US);" + +#: ../../library/datetime.rst:0 +msgid "16.08.1988 (de_DE)" +msgstr "16.08.1988 (de_DE)" + +#: ../../library/datetime.rst:2668 +msgid "``%X``" +msgstr "``%X``" + +#: ../../library/datetime.rst:2668 +msgid "Locale's appropriate time representation." +msgstr "本地化的适当时间表示。" + +#: ../../library/datetime.rst:0 +msgid "21:30:00 (en_US);" +msgstr "21:30:00 (en_US);" + +#: ../../library/datetime.rst:0 +msgid "21:30:00 (de_DE)" +msgstr "21:30:00 (de_DE)" + +#: ../../library/datetime.rst:2671 +msgid "``%y``" +msgstr "``%y``" + +#: ../../library/datetime.rst:2671 +msgid "Year without century as a zero-padded decimal number." +msgstr "补零后,以十进制数表示的,不带世纪的年份。" + +#: ../../library/datetime.rst:2674 +msgid "``%Y``" +msgstr "``%Y``" + +#: ../../library/datetime.rst:2674 +msgid "Year with century as a decimal number." +msgstr "十进制数表示的带世纪的年份。" + +#: ../../library/datetime.rst:2677 ../../library/datetime.rst:2840 +msgid "``%z``" +msgstr "``%z``" + +#: ../../library/datetime.rst:2677 +msgid "" +"UTC offset in the form ``±HHMM[SS[.ffffff]]`` (empty string if the object is" +" naive)." +msgstr "UTC 偏移量,格式为 ``±HHMM[SS[.ffffff]]`` (如果是简单型对象则为空字符串)。" + +#: ../../library/datetime.rst:2677 +msgid "(empty), +0000, -0400, +1030, +063415, -030712.345216" +msgstr "(空), +0000, -0400, +1030, +063415, -030712.345216" + +#: ../../library/datetime.rst:2677 ../../library/datetime.rst:2682 +#: ../../library/datetime.rst:2702 +msgid "\\(6)" +msgstr "\\(6)" + +#: ../../library/datetime.rst:2682 ../../library/datetime.rst:2872 +msgid "``%Z``" +msgstr "``%Z``" + +#: ../../library/datetime.rst:2682 +msgid "Time zone name (empty string if the object is naive)." +msgstr "时区名称(如果对象为简单型则为空字符串)。" + +#: ../../library/datetime.rst:2682 +msgid "(empty), UTC, GMT" +msgstr "(空), UTC, GMT" + +#: ../../library/datetime.rst:2685 +msgid "``%%``" +msgstr "``%%``" + +#: ../../library/datetime.rst:2685 +msgid "A literal ``'%'`` character." +msgstr "字面的 ``'%'`` 字符。" + +#: ../../library/datetime.rst:2685 +msgid "%" +msgstr "%" + +#: ../../library/datetime.rst:2688 +msgid "" +"The ISO 8601 year and ISO 8601 week directives are not interchangeable with " +"the year and week number directives above. Calling " +":meth:`~.datetime.strptime` with incomplete or ambiguous ISO 8601 directives" +" will raise a :exc:`ValueError`." +msgstr "" + +#: ../../library/datetime.rst:2692 +msgid "" +"Several additional directives not required by the C11 standard are included " +"for convenience." +msgstr "" + +#: ../../library/datetime.rst:2698 +msgid "``%f``" +msgstr "``%f``" + +#: ../../library/datetime.rst:2698 +msgid "Microsecond as a decimal number, zero-padded to 6 digits." +msgstr "微秒作为一个十进制数,零填充到 6 位。" + +#: ../../library/datetime.rst:2698 +msgid "000000, 000001, ..., 999999" +msgstr "000000, 000001, ..., 999999" + +#: ../../library/datetime.rst:2698 +msgid "\\(5)" +msgstr "\\(5)" + +#: ../../library/datetime.rst:2702 ../../library/datetime.rst:2862 +msgid "``%:z``" +msgstr "``%:z``" + +#: ../../library/datetime.rst:2702 +msgid "" +"UTC offset in the form ``±HH:MM[:SS[.ffffff]]`` (empty string if the object " +"is naive)." +msgstr "``±HH:MM[:SS[.ffffff]]`` 形式的 UTC 偏移量(如果是简单型对象则为空字符串)。" + +#: ../../library/datetime.rst:2702 +msgid "(empty), +00:00, -04:00, +10:30, +06:34:15, -03:07:12.345216" +msgstr "(空), +00:00, -04:00, +10:30, +06:34:15, -03:07:12.345216" + +#: ../../library/datetime.rst:2708 +msgid "" +"The full set of format codes supported varies across platforms, because " +"Python calls the platform C library's :c:func:`strftime` function, and " +"platform variations are common. To see the full set of format codes " +"supported on your platform, consult the :manpage:`strftime(3)` " +"documentation. There are also differences between platforms in handling of " +"unsupported format specifiers." +msgstr "" +"对完整格式代码集的支持在不同平台上有所差异,因为 Python 要调用所在平台的 C 库的 :c:func:`strftime` " +"函数,而不同平台的差异是很常见的。 要查看你所用平台所支持的完整格式代码集,请参阅 :manpage:`strftime(3)` 文档。 " +"不同的平台在处理不支持的格式说明符方面也有差异。" + +#: ../../library/datetime.rst:2714 +msgid "``%G``, ``%u`` and ``%V`` were added." +msgstr "增加了 ``%G``, ``%u`` 和 ``%V``。" + +#: ../../library/datetime.rst:2717 +msgid "``%:z`` was added for :meth:`~.datetime.strftime`." +msgstr "" + +#: ../../library/datetime.rst:2720 +msgid "" +"``%D``, ``%F``, ``%n``, ``%t``, and ``%:z`` were added for " +":meth:`~.datetime.strptime`." +msgstr "" + +#: ../../library/datetime.rst:2726 +msgid "Technical detail" +msgstr "技术细节" + +#: ../../library/datetime.rst:2728 +msgid "" +"Broadly speaking, ``d.strftime(fmt)`` acts like the :mod:`time` module's " +"``time.strftime(fmt, d.timetuple())`` although not all objects support a " +":meth:`~date.timetuple` method." +msgstr "" +"总体而言,``d.strftime(fmt)`` 类似于 :mod:`time` 模块的 ``time.strftime(fmt, " +"d.timetuple())`` 但是并非所有对象都支持 :meth:`~date.timetuple` 方法。" + +#: ../../library/datetime.rst:2732 +msgid "" +"For the :meth:`.datetime.strptime` and :meth:`.date.strptime` class methods," +" the default value is ``1900-01-01T00:00:00.000``: any components not " +"specified in the format string will be pulled from the default value." +msgstr "" +"对于 :meth:`.datetime.strptime` 和 :meth:`.date.strptime` 类方法,默认值为 " +"``1900-01-01T00:00:00.000``: 任何未在格式字符串中指明的部分都将从默认值中提取。" + +#: ../../library/datetime.rst:2737 +msgid "" +"Format strings without separators can be ambiguous for parsing. For example," +" with ``%Y%m%d``, the string ``2026111`` may be parsed either as " +"``2026-11-01`` or as ``2026-01-11``. Use separators to ensure the input is " +"parsed as intended." +msgstr "" +"没有分隔符的格式字符串解析时可能会有歧义。 例如,对于 ``%Y%m%d``,字符串 ``2026111`` 可以被解析为 ``2026-11-01``" +" 或 ``2026-01-11``。 请使用分隔符来确保输入的解析符合意图。" + +#: ../../library/datetime.rst:2743 +msgid "" +"When used to parse partial dates lacking a year, :meth:`.datetime.strptime` " +"and :meth:`.date.strptime` will raise when encountering February 29 because " +"the default year of 1900 is *not* a leap year. Always add a default leap " +"year to partial date strings before parsing." +msgstr "" +"当被用于解析缺少年份的日期时,:meth:`.datetime.strptime` 和 :meth:`.date.strptime` 会在遇到 2 月 " +"29 日时引发异常因为默认年份 1900 *不是* 闰年。 请总是在解析之前向不完整的日期字符串添加一个默认的闰年。" + +#: ../../library/datetime.rst:2763 +msgid "" +">>> import datetime as dt\n" +">>> value = \"2/29\"\n" +">>> dt.datetime.strptime(value, \"%m/%d\")\n" +"Traceback (most recent call last):\n" +"...\n" +"ValueError: day 29 must be in range 1..28 for month 2 in year 1900\n" +">>> dt.datetime.strptime(f\"1904 {value}\", \"%Y %m/%d\")\n" +"datetime.datetime(1904, 2, 29, 0, 0)" +msgstr "" +">>> import datetime as dt\n" +">>> value = \"2/29\"\n" +">>> dt.datetime.strptime(value, \"%m/%d\")\n" +"Traceback (most recent call last):\n" +"...\n" +"ValueError: day 29 must be in range 1..28 for month 2 in year 1900\n" +">>> dt.datetime.strptime(f\"1904 {value}\", \"%Y %m/%d\")\n" +"datetime.datetime(1904, 2, 29, 0, 0)" + +#: ../../library/datetime.rst:2774 +msgid "Using ``datetime.strptime(date_string, format)`` is equivalent to::" +msgstr "使用 ``datetime.strptime(date_string, format)`` 等价于::" + +#: ../../library/datetime.rst:2778 +msgid "" +"except when the format includes sub-second components or time zone offset " +"information, which are supported in ``datetime.strptime`` but are discarded " +"by ``time.strptime``." +msgstr "" +"除非格式中包含秒以下的部分或时区差值信息,它们在 ``datetime.strptime`` 中受支持但会被 ``time.strptime`` " +"所丢弃。" + +#: ../../library/datetime.rst:2782 +msgid "" +"For :class:`.time` objects, the format codes for year, month, and day should" +" not be used, as :class:`!time` objects have no such values. If they're used" +" anyway, 1900 is substituted for the year, and 1 for the month and day." +msgstr "" +"对于 :class:`.time` 对象,年、月、日的格式代码不应被使用,因为 :class:`!time` 对象没有这些值。 " +"如果它们仍被使用,则年份将被替换为 1900 而月和日将被替换为 1。" + +#: ../../library/datetime.rst:2786 +msgid "" +"For :class:`date` objects, the format codes for hours, minutes, seconds, and" +" microseconds should not be used, as :class:`date` objects have no such " +"values. If they're used anyway, 0 is substituted for them." +msgstr "" +"对于 :class:`date` 对象,时、分、秒和微秒的格式代码不应被使用,因为 :class:`date` 对象没有这些值。 " +"如果它们仍被使用,则都将被替换为 0。" + +#: ../../library/datetime.rst:2790 +msgid "" +"For the same reason, handling of format strings containing Unicode code " +"points that can't be represented in the charset of the current locale is " +"also platform-dependent. On some platforms such code points are preserved " +"intact in the output, while on others ``strftime`` may raise " +":exc:`UnicodeError` or return an empty string instead." +msgstr "" +"出于相同的原因,对于包含当前区域设置字符集所无法表示的 Unicode 码位的格式字符串的处理方式也取决于具体平台。 " +"在某些平台上这样的码位会不加修改地原样输出,而在其他平台上 ``strftime`` 则可能引发 :exc:`UnicodeError` " +"或只返回一个空字符串。" + +#: ../../library/datetime.rst:2799 +msgid "" +"This format code is currently unsupported by :meth:`~.datetime.strptime`." +msgstr "" + +#: ../../library/datetime.rst:2802 +msgid "" +"Because the format depends on the current locale, care should be taken when " +"making assumptions about the output value. Field orderings will vary (for " +"example, \"month/day/year\" versus \"day/month/year\"), and the output may " +"contain non-ASCII characters." +msgstr "" +"因为该格式依赖于当前语言区域,所以在假定输出值时应当仔细考虑。 字段顺序可能会有变化(例如 \"month/day/year\" 和 " +"\"day/month/year\"),并且输出还可能包含非 ASCII 字符。" + +#: ../../library/datetime.rst:2808 +msgid "" +"The :meth:`~.datetime.strptime` method can parse years in the full [1, 9999]" +" range, but years < 1000 must be zero-filled to 4-digit width." +msgstr "" +":meth:`~.datetime.strptime` 方法能够解析整个 [1, 9999] 范围内的年份,但 < 1000 的年份必须加零填充为 4 " +"位数字宽度。" + +#: ../../library/datetime.rst:2811 +msgid "" +"In previous versions, :meth:`~.datetime.strftime` method was restricted to " +"years >= 1900." +msgstr "在之前的版本中,:meth:`~.datetime.strftime` 方法只限用于 >= 1900 的年份。" + +#: ../../library/datetime.rst:2815 +msgid "" +"In version 3.2, :meth:`~.datetime.strftime` method was restricted to years " +">= 1000." +msgstr "在 3.2 版中,:meth:`~.datetime.strftime` 方法只限用于 >= 1000 的年份。" + +#: ../../library/datetime.rst:2820 +msgid "" +"When used with the :meth:`~.datetime.strptime` method, the ``%p`` directive " +"only affects the output hour field if the ``%I`` directive is used to parse " +"the hour." +msgstr "" +"当与 :meth:`~.datetime.strptime` 方法一起使用时,如果使用 ``%I`` 指示符来解析时,则 ``%p`` " +"指示符只会影响输出时字段。" + +#: ../../library/datetime.rst:2824 +msgid "" +"Unlike the :mod:`time` module, the :mod:`!datetime` module does not support " +"leap seconds." +msgstr "与 :mod:`time` 模块不同的是,:mod:`!datetime` 模块不支持闰秒。" + +#: ../../library/datetime.rst:2828 +msgid "" +"When used with the :meth:`~.datetime.strptime` method, the ``%f`` directive " +"accepts from one to six digits and zero pads on the right. ``%f`` is an " +"extension to the set of format characters in the C standard (but implemented" +" separately in datetime objects, and therefore always available)." +msgstr "" +"当与 :meth:`~.datetime.strptime` 方法一起使用时,``%f`` 指示符可接受一至六个数码及左边的零填充。 ``%f`` 是对" +" C 标准中格式字符集的扩展(但单独在 datetime 对象中实现,因此它总是可用)。" + +#: ../../library/datetime.rst:2835 +msgid "" +"For a naive object, the ``%z``, ``%:z`` and ``%Z`` format codes are replaced" +" by empty strings." +msgstr "对于简单型对象,``%z``, ``%:z`` 和 ``%Z`` 格式代码会被替换为空字符串。" + +#: ../../library/datetime.rst:2838 +msgid "For an aware object:" +msgstr "对于一个感知型对象而言:" + +#: ../../library/datetime.rst:2841 +msgid "" +":meth:`~.datetime.utcoffset` is transformed into a string of the form " +"``±HHMM[SS[.ffffff]]``, where ``HH`` is a 2-digit string giving the number " +"of UTC offset hours, ``MM`` is a 2-digit string giving the number of UTC " +"offset minutes, ``SS`` is a 2-digit string giving the number of UTC offset " +"seconds and ``ffffff`` is a 6-digit string giving the number of UTC offset " +"microseconds. The ``ffffff`` part is omitted when the offset is a whole " +"number of seconds and both the ``ffffff`` and the ``SS`` part is omitted " +"when the offset is a whole number of minutes. For example, if " +":meth:`~.datetime.utcoffset` returns ``timedelta(hours=-3, minutes=-30)``, " +"``%z`` is replaced with the string ``'-0330'``." +msgstr "" +":meth:`~.datetime.utcoffset` 会被转换为 ``±HHMM[SS[.ffffff]]`` 形式的字符串,其中 ``HH`` " +"为给出 UTC 时差的小时部分的 2 位数码字符串,``MM`` 为给出 UTC 时差的分钟部分的 2 位数码字符串,``SS`` 为给出 UTC " +"时差的秒部分的 2 位数码字符串,而 ``ffffff`` 则为给出 UTC 时差的微秒部分的 6 位数码字符串。 当时差为整数秒时 " +"``ffffff`` 部分将被省略,而当时差为整数分钟时 ``ffffff`` 和 ``SS`` 部分都将被省略。 举例来说,如果 " +":meth:`~.datetime.utcoffset` 返回 ``timedelta(hours=-3, minutes=-30)``,则 " +"``%z`` 会被替换为字符串 ``'-0330'``。" + +#: ../../library/datetime.rst:2855 +msgid "" +"When the ``%z`` directive is provided to the :meth:`~.datetime.strptime` " +"method, the UTC offsets can have a colon as a separator between hours, " +"minutes and seconds. For example, both ``'+010000'`` and ``'+01:00:00'`` " +"will be parsed as an offset of one hour. In addition, providing ``'Z'`` is " +"identical to ``'+00:00'``." +msgstr "" + +#: ../../library/datetime.rst:2863 +msgid "" +"When used with :meth:`~.datetime.strftime`, behaves exactly as ``%z``, " +"except that a colon separator is added between hours, minutes and seconds." +msgstr "" + +#: ../../library/datetime.rst:2866 +msgid "" +"When used with :meth:`~.datetime.strptime`, the UTC offset is *required* to " +"have a colon as a separator between hours, minutes and seconds. For example," +" ``'+01:00:00'`` (but *not* ``'+010000'``) will be parsed as an offset of " +"one hour. In addition, providing ``'Z'`` is identical to ``'+00:00'``." +msgstr "" + +#: ../../library/datetime.rst:2873 +msgid "" +"In :meth:`~.datetime.strftime`, ``%Z`` is replaced by an empty string if " +":meth:`~.datetime.tzname` returns ``None``; otherwise ``%Z`` is replaced by " +"the returned value, which must be a string." +msgstr "" +"在 :meth:`~.datetime.strftime` 中,如果 :meth:`~.datetime.tzname` 返回 ``None`` 则 " +"``%Z`` 会被替换为一个空字符串;在其他情况下 ``%Z`` 会被替换为该返回值,它必须为一个字符串。" + +#: ../../library/datetime.rst:2877 +msgid ":meth:`~.datetime.strptime` only accepts certain values for ``%Z``:" +msgstr ":meth:`~.datetime.strptime` 仅接受特定的 ``%Z`` 值:" + +#: ../../library/datetime.rst:2879 +msgid "any value in ``time.tzname`` for your machine's locale" +msgstr "你的机器的区域设置可以是 ``time.tzname`` 中的任何值" + +#: ../../library/datetime.rst:2880 +msgid "the hard-coded values ``UTC`` and ``GMT``" +msgstr "硬编码的值 ``UTC`` 和 ``GMT``" + +#: ../../library/datetime.rst:2882 +msgid "" +"So someone living in Japan may have ``JST``, ``UTC``, and ``GMT`` as valid " +"values, but probably not ``EST``. It will raise ``ValueError`` for invalid " +"values." +msgstr "" +"这样生活在日本的人可用的值为 ``JST``, ``UTC`` 和 ``GMT``,但可能没有 ``EST``。 它将引发 ``ValueError``" +" 表示无效的值。" + +#: ../../library/datetime.rst:2886 +msgid "" +"When the ``%z`` directive is provided to the :meth:`~.datetime.strptime` " +"method, an aware :class:`.datetime` object will be produced. The ``tzinfo`` " +"of the result will be set to a :class:`timezone` instance." +msgstr "" +"当提供 ``%z`` 指示符给 :meth:`~.datetime.strptime` 方法时,将产生一个感知型 :class:`.datetime` " +"对象。 结果的 ``tzinfo`` 将被设为一个 :class:`timezone` 实例。" + +#: ../../library/datetime.rst:2892 +msgid "" +"When used with the :meth:`~.datetime.strptime` method, ``%U`` and ``%W`` are" +" only used in calculations when the day of the week and the calendar year " +"(``%Y``) are specified." +msgstr "" +"当与 :meth:`~.datetime.strptime` 方法一起使用时,``%U`` 和 ``%W`` 仅用于指定了星期值和日历年份 " +"(``%Y``) 的计算。" + +#: ../../library/datetime.rst:2897 +msgid "" +"Similar to ``%U`` and ``%W``, ``%V`` is only used in calculations when the " +"day of the week and the ISO year (``%G``) are specified in a " +":meth:`~.datetime.strptime` format string. Also note that ``%G`` and ``%Y`` " +"are not interchangeable." +msgstr "" +"类似于 ``%U`` 和 ``%W``,``%V`` 仅用于在 :meth:`~.datetime.strptime` 格式字符串中指定了星期值和 " +"ISO 年份 (``%G``) 的计算。 还要注意 ``%G`` 和 ``%Y`` 是不可互换的。" + +#: ../../library/datetime.rst:2903 +msgid "" +"When used with the :meth:`~.datetime.strptime` method, the leading zero is " +"optional for formats ``%d``, ``%m``, ``%H``, ``%I``, ``%M``, ``%S``, " +"``%j``, ``%U``, ``%W``, and ``%V``. Format ``%y`` does require a leading " +"zero." +msgstr "" +"当与 :meth:`~.datetime.strptime` 方法一起使用时,前导的零在格式 ``%d``, ``%m``, ``%H``, " +"``%I``, ``%M``, ``%S``, ``%j``, ``%U``, ``%W`` 和 ``%V`` 中是可选的。 格式 ``%y`` " +"则要求有前导的零。" + +#: ../../library/datetime.rst:2908 +msgid "" +"When parsing a month and day using :meth:`~.datetime.strptime`, always " +"include a year in the format. If the value you need to parse lacks a year, " +"append an explicit dummy leap year. Otherwise your code will raise an " +"exception when it encounters leap day because the default year used by the " +"parser (1900) is not a leap year. Users run into that bug every leap year." +msgstr "" +"当使用 :meth:`~.datetime.strptime` 解析月份和日期时,始终在格式中包括年份。 " +"如果你需要解析的值缺少年份,则添加一个显式的占位闰年。 否则当你的代码遇到一个闰日时将引发异常因为解析器所使用的默认年份 (1900) 不是闰年。 " +"用户会在每个闰年碰到这个程序错误。" + +#: ../../library/datetime.rst:2914 +msgid "" +">>> month_day = \"02/29\"\n" +">>> dt.datetime.strptime(f\"{month_day};1984\", \"%m/%d;%Y\") # No leap year bug.\n" +"datetime.datetime(1984, 2, 29, 0, 0)" +msgstr "" + +#: ../../library/datetime.rst:2920 +msgid "Using ``%d`` without a year now raises :exc:`ValueError`." +msgstr "" + +#: ../../library/datetime.rst:2923 +msgid "" +":meth:`~.datetime.strptime` calls using a format string containing ``%e`` " +"without a year now emit a :exc:`DeprecationWarning`." +msgstr "" + +#: ../../library/datetime.rst:2928 +msgid "Footnotes" +msgstr "备注" + +#: ../../library/datetime.rst:2929 +msgid "If, that is, we ignore the effects of relativity." +msgstr "" + +#: ../../library/datetime.rst:2931 +msgid "" +"This matches the definition of the \"proleptic Gregorian\" calendar in " +"Dershowitz and Reingold's book *Calendrical Calculations*, where it's the " +"base calendar for all computations. See the book for algorithms for " +"converting between proleptic Gregorian ordinals and many other calendar " +"systems." +msgstr "" +"这与 Dershowitz 和 Reingold 所著 *Calendrical Calculations* " +"中“预期格列高利”历法的定义一致,它是适用于该书中所有运算的基础历法。 请参阅该书了解在预期格利高利历序列与许多其他历法系统之间进行转换的算法。" + +#: ../../library/datetime.rst:2937 +msgid "" +"See R. H. van Gent's `guide to the mathematics of the ISO 8601 calendar " +"`_" +" for a good explanation." +msgstr "" +"请参阅 R. H. van Gent 所著 `ISO 8601 历法的数学指南 " +"`_" +" 以获取更完整的说明。" + +#: ../../library/datetime.rst:2493 +msgid "% (percent)" +msgstr "% (百分号)" + +#: ../../library/datetime.rst:2493 +msgid "datetime format" +msgstr "日期时间格式" diff --git a/library/dbm.po b/library/dbm.po new file mode 100644 index 0000000000..69c40fe76c --- /dev/null +++ b/library/dbm.po @@ -0,0 +1,771 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/dbm.rst:2 +msgid ":mod:`!dbm` --- Interfaces to Unix \"databases\"" +msgstr ":mod:`!dbm` --- Unix \"数据库\" 接口" + +#: ../../library/dbm.rst:7 +msgid "**Source code:** :source:`Lib/dbm/__init__.py`" +msgstr "**源代码:** :source:`Lib/dbm/__init__.py`" + +#: ../../library/dbm.rst:11 +msgid ":mod:`!dbm` is a generic interface to variants of the DBM database:" +msgstr ":mod:`!dbm` 是一个针对多种 DBM 数据库的泛用接口:" + +#: ../../library/dbm.rst:13 +msgid ":mod:`dbm.sqlite3`" +msgstr ":mod:`dbm.sqlite3`" + +#: ../../library/dbm.rst:14 +msgid ":mod:`dbm.gnu`" +msgstr ":mod:`dbm.gnu`" + +#: ../../library/dbm.rst:15 +msgid ":mod:`dbm.ndbm`" +msgstr ":mod:`dbm.ndbm`" + +#: ../../library/dbm.rst:17 +msgid "" +"If none of these modules are installed, the slow-but-simple implementation " +"in module :mod:`dbm.dumb` will be used. There is a `third party interface " +"`_ to the Oracle Berkeley DB." +msgstr "" + +#: ../../library/dbm.rst:23 +msgid "" +"None of the underlying modules will automatically shrink the disk space used" +" by the database file. However, :mod:`dbm.sqlite3`, :mod:`dbm.gnu` and " +":mod:`dbm.dumb` provide a :meth:`!reorganize` method that can be used for " +"this purpose." +msgstr "" + +#: ../../library/dbm.rst:30 +msgid "" +"A tuple containing the exceptions that can be raised by each of the " +"supported modules, with a unique exception also named :exc:`dbm.error` as " +"the first item --- the latter is used when :exc:`dbm.error` is raised." +msgstr "" +"一个元组,其中包含每个受支持的模块可引发的异常,另外还有一个名为 :exc:`dbm.error` 的特殊异常作为第一项 --- 后者会在引发 " +":exc:`dbm.error` 时被使用。" + +#: ../../library/dbm.rst:37 +msgid "" +"This function attempts to guess which of the several simple database modules" +" available --- :mod:`dbm.sqlite3`, :mod:`dbm.gnu`, :mod:`dbm.ndbm`, or " +":mod:`dbm.dumb` --- should be used to open a given file." +msgstr "" +"此函数会尝试猜测几种简单数据库模块中哪一个是可用的 --- :mod:`dbm.sqlite3`, :mod:`dbm.gnu`, " +":mod:`dbm.ndbm` 或 :mod:`dbm.dumb` --- 并应当被用来打开给定的文件。" + +#: ../../library/dbm.rst:41 +msgid "Return one of the following values:" +msgstr "返回下列值中的一个:" + +#: ../../library/dbm.rst:43 +msgid "" +"``None`` if the file can't be opened because it's unreadable or doesn't " +"exist" +msgstr "如果文件因其不可读或不存在而无法打开则返回 ``None``" + +#: ../../library/dbm.rst:44 +msgid "the empty string (``''``) if the file's format can't be guessed" +msgstr "如果文件格式无法猜测则返回空字符串 (``''``)" + +#: ../../library/dbm.rst:45 +msgid "" +"a string containing the required module name, such as ``'dbm.ndbm'`` or " +"``'dbm.gnu'``" +msgstr "包含所需模块名称的字符串,如 ``'dbm.ndbm'`` 或 ``'dbm.gnu'``" + +#: ../../library/dbm.rst:47 ../../library/dbm.rst:288 +#: ../../library/dbm.rst:499 +msgid "*filename* accepts a :term:`path-like object`." +msgstr "*filename* 接受一个 :term:`path-like object`。" + +#: ../../library/dbm.rst:71 +msgid "Open a database and return the corresponding database object." +msgstr "打开一个数据库并返回相应的数据库对象。" + +#: ../../library/dbm.rst:0 +msgid "Parameters" +msgstr "参数" + +#: ../../library/dbm.rst:73 +msgid "" +"The database file to open. If the database file already exists, the " +":func:`whichdb` function is used to determine its type and the appropriate " +"module is used; if it does not exist, the first submodule listed above that " +"can be imported is used." +msgstr "" +"要打开的数据库文件。 如果数据库文件已存在,则使用 :func:`whichdb` " +"来确定其类型和要使用的适当模块;如果文件不存在,则会使用上述可导入子模块中的第一个。" + +#: ../../library/dbm.rst:74 ../../library/dbm.rst:260 +msgid "The database file to open." +msgstr "要打开的数据库文件。" + +#: ../../library/dbm.rst:76 +msgid "" +"If the database file already exists, the :func:`whichdb` function is used to" +" determine its type and the appropriate module is used; if it does not " +"exist, the first submodule listed above that can be imported is used." +msgstr "" +"如果数据库文件已存在,则使用 :func:`whichdb` 函数来确定其类型和要使用的适当模块;如果文件不存在,则会使用上述可导入子模块中的第一个。" + +#: ../../library/dbm.rst:81 ../../library/dbm.rst:187 +#: ../../library/dbm.rst:397 +msgid "" +"* ``'r'`` (default): |flag_r| * ``'w'``: |flag_w| * ``'c'``: |flag_c| * " +"``'n'``: |flag_n|" +msgstr "" +"* ``'r'`` (默认): |flag_r| * ``'w'``: |flag_w| * ``'c'``: |flag_c| * ``'n'``: " +"|flag_n|" + +#: ../../library/dbm.rst:82 ../../library/dbm.rst:189 +#: ../../library/dbm.rst:265 ../../library/dbm.rst:398 +msgid "``'r'`` (default): |flag_r|" +msgstr "``'r'`` (默认): |flag_r|" + +#: ../../library/dbm.rst:83 ../../library/dbm.rst:190 +#: ../../library/dbm.rst:266 ../../library/dbm.rst:399 +#: ../../library/dbm.rst:475 +msgid "``'w'``: |flag_w|" +msgstr "``'w'``: |flag_w|" + +#: ../../library/dbm.rst:84 ../../library/dbm.rst:191 +#: ../../library/dbm.rst:267 ../../library/dbm.rst:400 +msgid "``'c'``: |flag_c|" +msgstr "``'c'``: |flag_c|" + +#: ../../library/dbm.rst:85 ../../library/dbm.rst:192 +#: ../../library/dbm.rst:268 ../../library/dbm.rst:401 +#: ../../library/dbm.rst:477 +msgid "``'n'``: |flag_n|" +msgstr "``'n'``: |flag_n|" + +#: ../../library/dbm.rst:87 ../../library/dbm.rst:282 +#: ../../library/dbm.rst:403 ../../library/dbm.rst:479 +msgid "|mode_param_doc|" +msgstr "|mode_param_doc|" + +#: ../../library/dbm.rst:90 +msgid "*file* accepts a :term:`path-like object`." +msgstr "*file* 接受一个 :term:`path-like object`。" + +#: ../../library/dbm.rst:93 +msgid "" +"The object returned by :func:`~dbm.open` supports the basic functionality of" +" mutable :term:`mappings `; keys and their corresponding values can" +" be stored, retrieved, and deleted, and iteration, the :keyword:`in` " +"operator and methods :meth:`!keys`, :meth:`!get`, :meth:`!setdefault` and " +":meth:`!clear` are available. The :meth:`!keys` method returns a list " +"instead of a view object. The :meth:`!setdefault` method requires two " +"arguments." +msgstr "" +"由 :func:`~dbm.open` 返回的对象支持可变 :term:`映射 ` " +"的基本功能;键与其对应的值可以被存储、获取、删除以及迭代,还可使用 :keyword:`in` 运算符以及 :meth:`!keys`, " +":meth:`!get`, :meth:`!setdefault` 和 :meth:`!clear` 等方法。 :meth:`!keys` " +"方法将返回一个列表而不是视图对象。 :meth:`!setdefault` 方法需要两个参数。" + +#: ../../library/dbm.rst:101 +msgid "" +"Key and values are always stored as :class:`bytes`. This means that when " +"strings are used they are implicitly converted to the default encoding " +"before being stored." +msgstr "键和值总是被存储为 :class:`bytes`。 这意味着当使用字符串时它们会在被存储之前隐式地转换至默认编码格式。" + +#: ../../library/dbm.rst:105 +msgid "" +"These objects also support being used in a :keyword:`with` statement, which " +"will automatically close them when done." +msgstr "这些对象也支持在 :keyword:`with` 语句中使用,当语句结束时将自动关闭它们。" + +#: ../../library/dbm.rst:108 +msgid "" +":meth:`!get` and :meth:`!setdefault` methods are now available for all " +":mod:`!dbm` backends." +msgstr "现在 :meth:`!get` 和 :meth:`!setdefault` 方法对所有 :mod:`!dbm` 后端均可用。" + +#: ../../library/dbm.rst:112 +msgid "" +"Added native support for the context management protocol to the objects " +"returned by :func:`~dbm.open`." +msgstr "向 :func:`~dbm.open` 所返回的对象添加了对上下文管理协议的原生支持。" + +#: ../../library/dbm.rst:116 +msgid "" +"Deleting a key from a read-only database raises a database module specific " +"exception instead of :exc:`KeyError`." +msgstr "从只读数据库中删除键将引发数据库模块专属的异常而不是 :exc:`KeyError`。" + +#: ../../library/dbm.rst:120 +msgid ":meth:`!clear` methods are now available for all :mod:`!dbm` backends." +msgstr "现在 :meth:`!clear` 方法对所有 :mod:`!dbm` 后端均可用。" + +#: ../../library/dbm.rst:124 +msgid "" +"The following example records some hostnames and a corresponding title, and" +" then prints out the contents of the database::" +msgstr "以下示例记录了一些主机名和对应的标题,随后将数据库的内容打印出来。::" + +#: ../../library/dbm.rst:127 +msgid "" +"import dbm\n" +"\n" +"# Open database, creating it if necessary.\n" +"with dbm.open('cache', 'c') as db:\n" +"\n" +" # Record some values\n" +" db[b'hello'] = b'there'\n" +" db['www.python.org'] = 'Python Website'\n" +" db['www.cnn.com'] = 'Cable News Network'\n" +"\n" +" # Note that the keys are considered bytes now.\n" +" assert db[b'www.python.org'] == b'Python Website'\n" +" # Notice how the value is now in bytes.\n" +" assert db['www.cnn.com'] == b'Cable News Network'\n" +"\n" +" # Often-used methods of the dict interface work too.\n" +" print(db.get('python.org', b'not present'))\n" +"\n" +" # Storing a non-string key or value will raise an exception (most\n" +" # likely a TypeError).\n" +" db['www.yahoo.com'] = 4\n" +"\n" +"# db is automatically closed when leaving the with statement." +msgstr "" +"import dbm\n" +"\n" +"# 打开数据库,如有必要则创建它。\n" +"with dbm.open('cache', 'c') as db:\n" +"\n" +" # 记录一些值\n" +" db[b'hello'] = b'there'\n" +" db['www.python.org'] = 'Python Website'\n" +" db['www.cnn.com'] = 'Cable News Network'\n" +"\n" +" # 请注意现在键被作为字节串。\n" +" assert db[b'www.python.org'] == b'Python Website'\n" +" # 可以看到值现在被作为字节串。\n" +" assert db['www.cnn.com'] == b'Cable News Network'\n" +"\n" +" # 常用的字典接口方法同样可用。\n" +" print(db.get('python.org', b'not present'))\n" +"\n" +" # 存储非字符串的键或值将引发异常\n" +" # (通常为 TypeError)。\n" +" db['www.yahoo.com'] = 4\n" +"\n" +"# 当离开 with 语句时 db 将被自动关闭。" + +#: ../../library/dbm.rst:154 +msgid "Module :mod:`shelve`" +msgstr "模块 :mod:`shelve`" + +#: ../../library/dbm.rst:155 +msgid "Persistence module which stores non-string data." +msgstr "存储非字符串数据的持久化模块。" + +#: ../../library/dbm.rst:158 +msgid "The individual submodules are described in the following sections." +msgstr "以下部分描述了各个单独的子模块。" + +#: ../../library/dbm.rst:161 +msgid ":mod:`!dbm.sqlite3` --- SQLite backend for dbm" +msgstr ":mod:`!dbm.sqlite3` --- 针对 dbm 的 SQLite 后端" + +#: ../../library/dbm.rst:168 +msgid "**Source code:** :source:`Lib/dbm/sqlite3.py`" +msgstr "**源代码:** :source:`Lib/dbm/sqlite3.py`" + +#: ../../library/dbm.rst:172 +msgid "" +"This module uses the standard library :mod:`sqlite3` module to provide an " +"SQLite backend for the :mod:`!dbm` module. The files created by " +":mod:`!dbm.sqlite3` can thus be opened by :mod:`sqlite3`, or any other " +"SQLite browser, including the SQLite CLI." +msgstr "" +"此模块使用标准库 :mod:`sqlite3` 模块来提供针对 :mod:`!dbm` 模块的 SQLite 后端。 这样由 " +":mod:`!dbm.sqlite3` 创建的文件将可通过 :mod:`sqlite3` 或任何其他 SQLite 浏览器包括 SQLite CLI " +"来打开。" + +#: ../../library/dbm.rst:243 ../../library/dbm.rst:375 +#: ../../includes/wasm-mobile-notavail.rst:3 +#: ../../includes/wasm-notavail.rst:3 +msgid "Availability" +msgstr "可用性" + +#: ../../includes/wasm-notavail.rst:5 +msgid "" +"This module does not work or is not available on WebAssembly. See " +":ref:`wasm-availability` for more information." +msgstr "此模块在 WebAssembly 平台上无效或不可用。 请参阅 :ref:`wasm-availability` 了解详情。" + +#: ../../library/dbm.rst:181 +msgid "Open an SQLite database." +msgstr "打开 SQLite 数据库。" + +#: ../../library/dbm.rst:183 +msgid "The path to the database to be opened." +msgstr "要打开的数据库的路径。" + +#: ../../library/dbm.rst:194 +msgid "" +"The Unix file access mode of the file (default: octal ``0o666``), used only " +"when the database has to be created." +msgstr "文件的 Unix 文件访问模式 (默认值: 八进制数 ``0o666``),仅在需要创建数据库时使用。" + +#: ../../library/dbm.rst:198 +msgid "" +"The returned database object behaves similar to a mutable :term:`mapping`, " +"but the :meth:`!keys` method returns a list, and the :meth:`!setdefault` " +"method requires two arguments. It also supports a \"closing\" context " +"manager via the :keyword:`with` keyword." +msgstr "" +"返回的数据库对象行为类似于可变 :term:`mapping`,但其 :meth:`!keys` 方法将返回一个列表,而 " +":meth:`!setdefault` 方法需要两个参数。 它还通过 :keyword:`with` 关键字来支持“关闭”上下文管理器。" + +#: ../../library/dbm.rst:203 ../../library/dbm.rst:304 +#: ../../library/dbm.rst:507 +msgid "The following methods are also provided:" +msgstr "还提供了以下方法:" + +#: ../../library/dbm.rst:207 +msgid "Close the SQLite database." +msgstr "关闭 SQLite 数据库。" + +#: ../../library/dbm.rst:211 +msgid "" +"If you have carried out a lot of deletions and would like to shrink the " +"space used on disk, this method will reorganize the database; otherwise, " +"deleted file space will be kept and reused as new (key, value) pairs are " +"added." +msgstr "" + +#: ../../library/dbm.rst:216 +msgid "" +"While reorganizing, as much as two times the size of the original database " +"is required in free disk space. However, be aware that this factor changes " +"for each :mod:`!dbm` submodule." +msgstr "" + +#: ../../library/dbm.rst:223 +msgid ":mod:`!dbm.gnu` --- GNU database manager" +msgstr ":mod:`!dbm.gnu` --- GNU 数据库管理器 manager" + +#: ../../library/dbm.rst:228 +msgid "**Source code:** :source:`Lib/dbm/gnu.py`" +msgstr "**源代码:** :source:`Lib/dbm/gnu.py`" + +#: ../../library/dbm.rst:232 +msgid "" +"The :mod:`!dbm.gnu` module provides an interface to the :abbr:`GDBM (GNU " +"dbm)` library, similar to the :mod:`dbm.ndbm` module, but with additional " +"functionality like crash tolerance." +msgstr "" +":mod:`!dbm.gnu` 模块提供了针对 :abbr:`GDBM (GNU dbm)` 库的接口,类似于 :mod:`dbm.ndbm` " +"模块,但带有额外的功能如对崩溃的耐受性。" + +#: ../../library/dbm.rst:238 +msgid "" +"The file formats created by :mod:`!dbm.gnu` and :mod:`dbm.ndbm` are " +"incompatible and can not be used interchangeably." +msgstr "" + +#: ../../includes/wasm-mobile-notavail.rst:5 +msgid "" +"This module is not supported on :ref:`mobile platforms ` or :ref:`WebAssembly platforms `." +msgstr "" +"此模块在 :ref:`移动平台 ` 或 :ref:`WebAssembly 平台 ` 上不受支持。" + +#: ../../library/dbm.rst:247 +msgid "" +"Raised on :mod:`!dbm.gnu`-specific errors, such as I/O errors. " +":exc:`KeyError` is raised for general mapping errors like specifying an " +"incorrect key." +msgstr "" + +#: ../../library/dbm.rst:253 +msgid "" +"A string of characters the *flag* parameter of :meth:`~dbm.gnu.open` " +"supports." +msgstr "由 :meth:`~dbm.gnu.open` 的 *flag* 形参所支持的字符组成的字符串。" + +#: ../../library/dbm.rst:258 +msgid "Open a GDBM database and return a :class:`!gdbm` object." +msgstr "打开 GDBM 数据库并返回一个 :class:`!gdbm` 对象。" + +#: ../../library/dbm.rst:264 +msgid "" +"* ``'r'`` (default): |flag_r| * ``'w'``: |flag_w| * ``'c'``: |flag_c| * " +"``'n'``: |flag_n| The following additional characters may be appended to " +"control how the database is opened: * ``'f'``: Open the database in fast " +"mode. Writes to the database will not be synchronized. * ``'s'``: " +"Synchronized mode. Changes to the database will be written immediately to " +"the file. * ``'u'``: Do not lock database. Not all flags are valid for all " +"versions of GDBM. See the :data:`open_flags` member for a list of supported " +"flag characters." +msgstr "" +"* ``'r'`` (默认值): |flag_r| * ``'w'``: |flag_w| * ``'c'``: |flag_c| * ``'n'``:" +" |flag_n| 可以添加下列额外字符来控制数据库的打开方式: * ``'f'``: 以快速模式打开数据库。 对数据库的写入将不是同步的。 * " +"``'s'``: 同步模式。 对数据库的修改将立即写入到文件。 * ``'u'``: 不锁定数据库。 并非所有旗标都对所有 GDBM 版本可用。 " +"要获取受支持的旗标字符列表请参阅 :data:`open_flags` 成员。" + +#: ../../library/dbm.rst:270 +msgid "" +"The following additional characters may be appended to control how the " +"database is opened:" +msgstr "可以添加下列额外字符来控制数据库的打开方式:" + +#: ../../library/dbm.rst:273 +msgid "" +"``'f'``: Open the database in fast mode. Writes to the database will not be " +"synchronized." +msgstr "``'f'``: 以快速模式打开数据库。 对数据库的写入将不是同步的。" + +#: ../../library/dbm.rst:275 +msgid "" +"``'s'``: Synchronized mode. Changes to the database will be written " +"immediately to the file." +msgstr "``'s'``: 同步模式。 对数据库的修改将立即写入到文件。" + +#: ../../library/dbm.rst:277 +msgid "``'u'``: Do not lock database." +msgstr "``'u'``: 不锁定数据库。" + +#: ../../library/dbm.rst:279 +msgid "" +"Not all flags are valid for all versions of GDBM. See the :data:`open_flags`" +" member for a list of supported flag characters." +msgstr "并非所有旗标都对所有 GDBM 版本可用。 请参阅 :data:`open_flags` 成员获取受支持旗标字符的列表。" + +#: ../../library/dbm.rst:0 +msgid "Raises" +msgstr "引发" + +#: ../../library/dbm.rst:285 +msgid "If an invalid *flag* argument is passed." +msgstr "如果传入了不可用的 *flag* 参数。" + +#: ../../library/dbm.rst:291 +msgid "" +":class:`!gdbm` objects behave similar to mutable :term:`mappings `," +" but methods :meth:`!items`, :meth:`!values`, :meth:`!pop`, " +":meth:`!popitem`, and :meth:`!update` are not supported, the :meth:`!keys` " +"method returns a list, and the :meth:`!setdefault` method requires two " +"arguments. It also supports a \"closing\" context manager via the " +":keyword:`with` keyword." +msgstr "" +":class:`!gdbm` 对象行为类似于可变 :term:`映射 `,但不支持 :meth:`!items`, " +":meth:`!values`, :meth:`!pop`, :meth:`!popitem` 和 :meth:`!update` " +"等方法,:meth:`!keys` 方法将返回一个列表,而 :meth:`!setdefault` 方法需要两个参数。 它还通过 " +":keyword:`with` 关键字来支持“关闭”上下文管理器。" + +#: ../../library/dbm.rst:298 ../../library/dbm.rst:416 +msgid "Added the :meth:`!get` and :meth:`!setdefault` methods." +msgstr "增加了 :meth:`!get` 和 :meth:`!setdefault` 方法。" + +#: ../../library/dbm.rst:301 ../../library/dbm.rst:419 +msgid "Added the :meth:`!clear` method." +msgstr "增加了 :meth:`!clear` 方法。" + +#: ../../library/dbm.rst:308 +msgid "Close the GDBM database." +msgstr "关闭 GDBM 数据库。" + +#: ../../library/dbm.rst:312 +msgid "" +"It's possible to loop over every key in the database using this method and " +"the :meth:`nextkey` method. The traversal is ordered by GDBM's internal " +"hash values, and won't be sorted by the key values. This method returns the" +" starting key." +msgstr "" +"可以使用此方法和 :meth:`nextkey` 方法循环遍历数据库中的每个键。 遍历的顺序是按照 GDBM 的内部哈希值,而不会根据键的值排序。 " +"此方法将返回起始的键。" + +#: ../../library/dbm.rst:319 +msgid "" +"Returns the key that follows *key* in the traversal. The following code " +"prints every key in the database ``db``, without having to create a list in " +"memory that contains them all::" +msgstr "在遍历中返回 *key* 之后的下一个键。 以下代码将打印数据库 ``db`` 中的每个键,而不会在内存中创建一个包含所有键的列表::" + +#: ../../library/dbm.rst:323 +msgid "" +"k = db.firstkey()\n" +"while k is not None:\n" +" print(k)\n" +" k = db.nextkey(k)" +msgstr "" +"k = db.firstkey()\n" +"while k is not None:\n" +" print(k)\n" +" k = db.nextkey(k)" + +#: ../../library/dbm.rst:330 +msgid "" +"If you have carried out a lot of deletions and would like to shrink the " +"space used by the GDBM file, this routine will reorganize the database. " +":class:`!gdbm` objects will not shorten the length of a database file except" +" by using this reorganization; otherwise, deleted file space will be kept " +"and reused as new (key, value) pairs are added." +msgstr "" +"如果你进行了大量删除操作并且想要缩减 GDBM 文件所使用的空间,此例程可以重新组织数据库。 除非使用此重组功能否则 :class:`!gdbm` " +"对象不会缩减数据库文件大小;在其他情况下,被删除的文件空间将会保留并在添加新的 (键, 值) 对时被重用。" + +#: ../../library/dbm.rst:337 +msgid "" +"While reorganizing, as much as one time the size of the original database is" +" required in free disk space. However, be aware that this factor changes for" +" each :mod:`!dbm` submodule." +msgstr "" + +#: ../../library/dbm.rst:342 +msgid "" +"When the database has been opened in fast mode, this method forces any " +"unwritten data to be written to the disk." +msgstr "当以快速模式打开数据库时,此方法会将任何未写入数据强制写入磁盘。" + +#: ../../library/dbm.rst:347 +msgid ":mod:`!dbm.ndbm` --- New Database Manager" +msgstr "" + +#: ../../library/dbm.rst:352 +msgid "**Source code:** :source:`Lib/dbm/ndbm.py`" +msgstr "**源代码:** :source:`Lib/dbm/ndbm.py`" + +#: ../../library/dbm.rst:356 +msgid "" +"The :mod:`!dbm.ndbm` module provides an interface to the :abbr:`NDBM (New " +"Database Manager)` library. This module can be used with the \"classic\" " +"NDBM interface or the :abbr:`GDBM (GNU dbm)` compatibility interface." +msgstr "" + +#: ../../library/dbm.rst:363 +msgid "" +"The file formats created by :mod:`dbm.gnu` and :mod:`!dbm.ndbm` are " +"incompatible and can not be used interchangeably." +msgstr "" + +#: ../../library/dbm.rst:368 +msgid "" +"The NDBM library shipped as part of macOS has an undocumented limitation on " +"the size of values, which can result in corrupted database files when " +"storing values larger than this limit. Reading such corrupted files can " +"result in a hard crash (segmentation fault)." +msgstr "" +"作为 macOS 的组成部分提供的 NDBM 库对值的大小有一个未写入文档的限制,当存储的值大于此限制时可能会导致数据库文件损坏。 " +"读取这种已损坏的文件可能会导致硬崩溃(段错误)。" + +#: ../../library/dbm.rst:379 +msgid "" +"Raised on :mod:`!dbm.ndbm`-specific errors, such as I/O errors. " +":exc:`KeyError` is raised for general mapping errors like specifying an " +"incorrect key." +msgstr "" + +#: ../../library/dbm.rst:385 +msgid "Name of the NDBM implementation library used." +msgstr "所使用的 NDBM 实现库的名称。" + +#: ../../library/dbm.rst:390 +msgid "Open an NDBM database and return an :class:`!ndbm` object." +msgstr "打开 NDBM 数据库并返回一个 :class:`!ndbm` 对象。" + +#: ../../library/dbm.rst:392 +msgid "" +"The basename of the database file (without the :file:`.dir` or :file:`.pag` " +"extensions)." +msgstr "数据库文件的基本名(不带 :file:`.dir` 或 :file:`.pag` 扩展名)。" + +#: ../../library/dbm.rst:406 +msgid "Accepts :term:`path-like object` for filename." +msgstr "接受 :term:`path-like object` 作为文件名。" + +#: ../../library/dbm.rst:409 +msgid "" +":class:`!ndbm` objects behave similar to mutable :term:`mappings `," +" but methods :meth:`!items`, :meth:`!values`, :meth:`!pop`, " +":meth:`!popitem`, and :meth:`!update` are not supported, the :meth:`!keys` " +"method returns a list, and the :meth:`!setdefault` method requires two " +"arguments. It also supports a \"closing\" context manager via the " +":keyword:`with` keyword." +msgstr "" +":class:`!ndbm` 对象行为类似于可变 :term:`映射 `,但不支持 :meth:`!items`, " +":meth:`!values`, :meth:`!pop`, :meth:`!popitem` 和 :meth:`!update` " +"等方法,:meth:`!keys` 方法将返回一个列表,而 :meth:`!setdefault` 方法需要两个参数。 它还通过 " +":keyword:`with` 关键字来支持“关闭”上下文管理器。" + +#: ../../library/dbm.rst:422 +msgid "The following method is also provided:" +msgstr "还提供了以下方法:" + +#: ../../library/dbm.rst:426 +msgid "Close the NDBM database." +msgstr "关闭 NDBM 数据库。" + +#: ../../library/dbm.rst:430 +msgid ":mod:`!dbm.dumb` --- Portable DBM implementation" +msgstr "" + +#: ../../library/dbm.rst:435 +msgid "**Source code:** :source:`Lib/dbm/dumb.py`" +msgstr "**源代码:** :source:`Lib/dbm/dumb.py`" + +#: ../../library/dbm.rst:441 +msgid "" +"The :mod:`!dbm.dumb` module is intended as a last resort fallback for the " +":mod:`!dbm` module when a more robust module is not available. The " +":mod:`!dbm.dumb` module is not written for speed and is not nearly as " +"heavily used as the other database modules." +msgstr "" + +#: ../../library/dbm.rst:448 +msgid "" +"The :mod:`!dbm.dumb` module provides a persistent :class:`dict`-like " +"interface which is written entirely in Python. Unlike other :mod:`!dbm` " +"backends, such as :mod:`dbm.gnu`, no external library is required." +msgstr "" + +#: ../../library/dbm.rst:453 +msgid "The :mod:`!dbm.dumb` module defines the following:" +msgstr ":mod:`!dbm.dumb` 模块定义了以下对象:" + +#: ../../library/dbm.rst:457 +msgid "" +"Raised on :mod:`!dbm.dumb`-specific errors, such as I/O errors. " +":exc:`KeyError` is raised for general mapping errors like specifying an " +"incorrect key." +msgstr "" + +#: ../../library/dbm.rst:463 +msgid "Open a :mod:`!dbm.dumb` database." +msgstr "打开 :mod:`!dbm.dumb` 数据库。" + +#: ../../library/dbm.rst:465 +msgid "" +"The basename of the database file (without extensions). A new database " +"creates the following files: - :file:`{filename}.dat` - " +":file:`{filename}.dir`" +msgstr "" +"数据库文件的基本名(不带扩展名)。 新数据库将会创建以下文件: - :file:`{filename}.dat` - " +":file:`{filename}.dir`" + +#: ../../library/dbm.rst:466 +msgid "" +"The basename of the database file (without extensions). A new database " +"creates the following files:" +msgstr "数据库文件的基本名(不带扩展名)。 新数据库将会创建以下文件:" + +#: ../../library/dbm.rst:469 +msgid ":file:`{filename}.dat`" +msgstr ":file:`{filename}.dat`" + +#: ../../library/dbm.rst:470 +msgid ":file:`{filename}.dir`" +msgstr ":file:`{filename}.dir`" + +#: ../../library/dbm.rst:473 +msgid "" +"* ``'r'``: |flag_r| * ``'w'``: |flag_w| * ``'c'`` (default): |flag_c| * " +"``'n'``: |flag_n|" +msgstr "" +"* ``'r'``: |flag_r| * ``'w'``: |flag_w| * ``'c'`` (默认): |flag_c| * ``'n'``: " +"|flag_n|" + +#: ../../library/dbm.rst:474 +msgid "``'r'``: |flag_r|" +msgstr "``'r'``: |flag_r|" + +#: ../../library/dbm.rst:476 +msgid "``'c'`` (default): |flag_c|" +msgstr "``'c'`` (默认): |flag_c|" + +#: ../../library/dbm.rst:483 +msgid "" +"It is possible to crash the Python interpreter when loading a database with " +"a sufficiently large/complex entry due to stack depth limitations in " +"Python's AST compiler." +msgstr "当载入包含足够巨大/复杂条目的数据库时有可能导致 Python 解释器的崩溃,这是由于 Python AST 编译器有栈深度限制。" + +#: ../../library/dbm.rst:488 +msgid "" +":mod:`!dbm.dumb` does not support concurrent read/write access. (Multiple " +"simultaneous read accesses are safe.) When a program has the database open " +"for writing, no other program should have it open for reading or writing." +msgstr "" + +#: ../../library/dbm.rst:492 +msgid "" +":func:`~dbm.dumb.open` always creates a new database when *flag* is ``'n'``." +msgstr ":func:`~dbm.dumb.open` 在 *flag* 为 ``'n'`` 时将总是创建一个新数据库。" + +#: ../../library/dbm.rst:495 +msgid "" +"A database opened read-only if *flag* is ``'r'``. A database is not created " +"if it does not exist if *flag* is ``'r'`` or ``'w'``." +msgstr "" +"如果 *flag* 为 ``'r'`` 则打开的数据库将为只读的。 如果 *flag* 为 ``'r'`` 或 ``'w'`` " +"则当数据库不存在时不会自动创建它。" + +#: ../../library/dbm.rst:502 +msgid "" +"The returned database object behaves similar to a mutable :term:`mapping`, " +"but the :meth:`!keys` and :meth:`!items` methods return lists, and the " +":meth:`!setdefault` method requires two arguments. It also supports a " +"\"closing\" context manager via the :keyword:`with` keyword." +msgstr "" +"返回的数据库对象行为类似于可变 :term:`mapping`,但 :meth:`!keys` 和 :meth:`!items` 将返回列表,而 " +":meth:`!setdefault` 方法需要两个参数。 它还通过 :keyword:`with` 关键字支持“关闭”上下文管理器。" + +#: ../../library/dbm.rst:511 +msgid "Close the database." +msgstr "关闭数据库。" + +#: ../../library/dbm.rst:515 +msgid "" +"If you have carried out a lot of deletions and would like to shrink the " +"space used on disk, this method will reorganize the database; otherwise, " +"deleted file space will not be reused." +msgstr "" + +#: ../../library/dbm.rst:520 +msgid "" +"While reorganizing, no additional free disk space is required. However, be " +"aware that this factor changes for each :mod:`!dbm` submodule." +msgstr "" + +#: ../../library/dbm.rst:527 +msgid "" +"Synchronize the on-disk directory and data files. This method is called by " +"the :meth:`shelve.Shelf.sync` method." +msgstr "同步磁盘上的目录和数据文件。 此方法将被 :meth:`shelve.Shelf.sync` 方法调用。" + +#: ../../library/dbm.rst:437 +msgid "databases" +msgstr "数据库" diff --git a/library/debug.po b/library/debug.po new file mode 100644 index 0000000000..0507ab3678 --- /dev/null +++ b/library/debug.po @@ -0,0 +1,39 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# 99 , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: 99 , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/debug.rst:3 +msgid "Debugging and profiling" +msgstr "" + +#: ../../library/debug.rst:5 +msgid "" +"These libraries help you with Python development: the debugger enables you " +"to step through code, analyze stack frames and set breakpoints etc., and the" +" profilers run code and give you a detailed breakdown of execution times, " +"allowing you to identify bottlenecks in your programs. Auditing events " +"provide visibility into runtime behaviors that would otherwise require " +"intrusive debugging or patching." +msgstr "" +"这些库可以帮助你进行 Python " +"开发:调试器使你能够逐步执行代码,分析堆栈帧并设置断点等等,性能分析器可以运行代码并为你提供执行时间的详细数据,使你能够找出你的程序中的瓶颈。 " +"审计事件提供运行时行为的可见性,如果没有此工具则需要进行侵入式调试或修补。" diff --git a/library/decimal.po b/library/decimal.po new file mode 100644 index 0000000000..2af04a8ab0 --- /dev/null +++ b/library/decimal.po @@ -0,0 +1,3493 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/decimal.rst:2 +msgid ":mod:`!decimal` --- Decimal fixed-point and floating-point arithmetic" +msgstr ":mod:`!decimal` --- 十进制定点和浮点算术" + +#: ../../library/decimal.rst:7 +msgid "**Source code:** :source:`Lib/decimal.py`" +msgstr "**源码:** :source:`Lib/decimal.py`" + +#: ../../library/decimal.rst:25 +msgid "" +"The :mod:`!decimal` module provides support for fast correctly rounded " +"decimal floating-point arithmetic. It offers several advantages over the " +":class:`float` datatype:" +msgstr "" +":mod:`!decimal` 模块提供了对快速且正确舍入的十进制浮点运算的支持。 与 :class:`float` 数据类型相比它具有以下优势:" + +#: ../../library/decimal.rst:29 +msgid "" +"Decimal \"is based on a `floating-point model " +"`__ which was " +"designed with people in mind, and necessarily has a paramount guiding " +"principle -- computers must provide an arithmetic that works in the same way" +" as the arithmetic that people learn at school.\" -- excerpt from the " +"decimal arithmetic specification." +msgstr "" +"Decimal 类型“基于考虑人类习惯的 `浮点数模型 " +"`__ " +"进行设计,并因此具有以下最高指导原则 -- 计算机必须提供与人们在学校所学习的相同的算术法则。” -- 摘自 Decimal 算术规范描述。" + +#: ../../library/decimal.rst:36 +msgid "" +"Decimal numbers can be represented exactly. In contrast, numbers like " +"``1.1`` and ``2.2`` do not have exact representations in binary floating " +"point. End users typically would not expect ``1.1 + 2.2`` to display as " +"``3.3000000000000003`` as it does with binary floating point." +msgstr "" +"Decimal 数字可以完全精确地表示。相比之下,``1.1`` 和 ``2.2`` 这样的数字在二进制浮点形式下没有精确的表示。最终用户通常不希望 " +"``1.1 + 2.2`` 像在二进制浮点形式下那样被显示为 ``3.3000000000000003``。" + +#: ../../library/decimal.rst:41 +msgid "" +"The exactness carries over into arithmetic. In decimal floating point, " +"``0.1 + 0.1 + 0.1 - 0.3`` is exactly equal to zero. In binary floating " +"point, the result is ``5.5511151231257827e-017``. While near to zero, the " +"differences prevent reliable equality testing and differences can " +"accumulate. For this reason, decimal is preferred in accounting applications" +" which have strict equality invariants." +msgstr "" +"这样的精确性会延续到算术运算中。对于 decimal 浮点数,``0.1 + 0.1 + 0.1 - 0.3`` 会精确地等于零。 " +"而对于二进制浮点数,结果则为 ``5.5511151231257827e-017``。 " +"虽然接近于零,但其中的误差将妨碍到可靠的相等性检测并且这样的误差还会不断累积。因此,decimal 更适合具有严格相等不变性要求的会计类应用。" + +#: ../../library/decimal.rst:48 +msgid "" +"The decimal module incorporates a notion of significant places so that " +"``1.30 + 1.20`` is ``2.50``. The trailing zero is kept to indicate " +"significance. This is the customary presentation for monetary applications. " +"For multiplication, the \"schoolbook\" approach uses all the figures in the " +"multiplicands. For instance, ``1.3 * 1.2`` gives ``1.56`` while ``1.30 * " +"1.20`` gives ``1.5600``." +msgstr "" +"decimal 模块包含有效位的概念因而使得 ``1.30 + 1.20`` 等于 ``2.50``。末尾的零会被保留以表明有效位。 " +"这是货币相关应用的惯例表示方式。对于乘法,则按“教科书”方式来使用被乘数中的所有数位。例如,``1.3 * 1.2`` 结果为 ``1.56`` 而 " +"``1.30 * 1.20`` 结果为 ``1.5600``。" + +#: ../../library/decimal.rst:55 +msgid "" +"Unlike hardware based binary floating point, the decimal module has a user " +"alterable precision (defaulting to 28 places) which can be as large as " +"needed for a given problem:" +msgstr "与基于硬件的二进制浮点不同,十进制模块具有用户可更改的精度(默认为 28 位),可以与给定问题所需的一样大:" + +#: ../../library/decimal.rst:67 +msgid "" +"Both binary and decimal floating point are implemented in terms of published" +" standards. While the built-in float type exposes only a modest portion of " +"its capabilities, the decimal module exposes all required parts of the " +"standard. When needed, the programmer has full control over rounding and " +"signal handling. This includes an option to enforce exact arithmetic by " +"using exceptions to block any inexact operations." +msgstr "" +"二进制和 decimal 浮点数都是根据已发布的标准实现的。虽然内置浮点类型只公开其功能的一小部分,但 decimal 模块公开了标准的所有必需部分。 " +"在需要时,程序员可以完全控制舍入和信号处理。这包括通过使用异常来阻止任何不精确操作来强制执行精确算术的选项。" + +#: ../../library/decimal.rst:74 +msgid "" +"The decimal module was designed to support \"without prejudice, both exact " +"unrounded decimal arithmetic (sometimes called fixed-point arithmetic) and " +"rounded floating-point arithmetic.\" -- excerpt from the decimal arithmetic" +" specification." +msgstr "" +"decimal 模块旨在支持“无偏差,精确无舍入的十进制算术(有时称为定点数算术)和有舍入的浮点数算术”。 —— 摘自 decimal 算术规范说明。" + +#: ../../library/decimal.rst:79 +msgid "" +"The module design is centered around three concepts: the decimal number, " +"the context for arithmetic, and signals." +msgstr "该模块的设计以三个概念为中心:decimal 数值,算术上下文和信号。" + +#: ../../library/decimal.rst:82 +msgid "" +"A decimal number is immutable. It has a sign, coefficient digits, and an " +"exponent. To preserve significance, the coefficient digits do not truncate " +"trailing zeros. Decimals also include special values such as ``Infinity``, " +"``-Infinity``, and ``NaN``. The standard also differentiates ``-0`` from " +"``+0``." +msgstr "" +"decimal 数值属于不可变对象。它由一个符号、一个系数值及一个指数值组成。为了保留有效位,系数值不会截去末尾的零。decimal 数值还包括特殊值如" +" ``Infinity``, ``-Infinity`` 和 ``NaN``。该标准还会区分 ``-0`` 和 ``+0``。" + +#: ../../library/decimal.rst:88 +msgid "" +"The context for arithmetic is an environment specifying precision, rounding " +"rules, limits on exponents, flags indicating the results of operations, and " +"trap enablers which determine whether signals are treated as exceptions. " +"Rounding options include :const:`ROUND_CEILING`, :const:`ROUND_DOWN`, " +":const:`ROUND_FLOOR`, :const:`ROUND_HALF_DOWN`, :const:`ROUND_HALF_EVEN`, " +":const:`ROUND_HALF_UP`, :const:`ROUND_UP`, and :const:`ROUND_05UP`." +msgstr "" +"算术的上下文是指定精度、舍入规则、指数限制、指示操作结果的标志以及确定符号是否被视为异常的陷阱启用器的环境。舍入选项包括 " +":const:`ROUND_CEILING` , :const:`ROUND_DOWN` , :const:`ROUND_FLOOR` , " +":const:`ROUND_HALF_DOWN`, :const:`ROUND_HALF_EVEN` , :const:`ROUND_HALF_UP` " +"、 :const:`ROUND_UP` 以及 :const:`ROUND_05UP`." + +#: ../../library/decimal.rst:95 +msgid "" +"Signals are groups of exceptional conditions arising during the course of " +"computation. Depending on the needs of the application, signals may be " +"ignored, considered as informational, or treated as exceptions. The signals " +"in the decimal module are: :const:`Clamped`, :const:`InvalidOperation`, " +":const:`DivisionByZero`, :const:`Inexact`, :const:`Rounded`, " +":const:`Subnormal`, :const:`Overflow`, :const:`Underflow` and " +":const:`FloatOperation`." +msgstr "" +"信号是在计算过程中出现的异常条件组。根据应用程序的需要,信号可能会被忽略,被视为信息,或被视为异常。 " +"十进制模块中的信号有::const:`Clamped`、 :const:`InvalidOperation`、 " +":const:`DivisionByZero` , :const:`Inexact` , :const:`Rounded` , " +":const:`Subnormal`、 :const:`Overflow`、 :const:`Underflow` 以及 " +":const:`FloatOperation` ." + +#: ../../library/decimal.rst:102 +msgid "" +"For each signal there is a flag and a trap enabler. When a signal is " +"encountered, its flag is set to one, then, if the trap enabler is set to " +"one, an exception is raised. Flags are sticky, so the user needs to reset " +"them before monitoring a calculation." +msgstr "" +"对于每个信号,都有一个标志和一个陷阱启动器。遇到信号时,其标志设置为 1,然后,如果陷阱启用器设置为 1,则引发异常。 " +"标志是粘性的,因此用户需要在监控计算之前重置它们。" + +#: ../../library/decimal.rst:110 +msgid "" +"IBM's General Decimal Arithmetic Specification, `The General Decimal " +"Arithmetic Specification `_." +msgstr "" +"IBM 的通用十进制算术规范描述,`The General Decimal Arithmetic Specification " +"`_." + +#: ../../library/decimal.rst:119 +msgid "Quick-start tutorial" +msgstr "快速入门教程" + +#: ../../library/decimal.rst:121 +msgid "" +"The usual start to using decimals is importing the module, viewing the " +"current context with :func:`getcontext` and, if necessary, setting new " +"values for precision, rounding, or enabled traps::" +msgstr "" +"通常使用 decimal 的方式是先导入该模块,通过 :func:`getcontext` " +"查看当前上下文,并在必要时为精度、舍入或启用的陷阱设置新值::" + +#: ../../library/decimal.rst:125 +msgid "" +">>> from decimal import *\n" +">>> getcontext()\n" +"Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,\n" +" capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,\n" +" InvalidOperation])\n" +"\n" +">>> getcontext().prec = 7 # Set a new precision" +msgstr "" +">>> from decimal import *\n" +">>> getcontext()\n" +"Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,\n" +" capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,\n" +" InvalidOperation])\n" +"\n" +">>> getcontext().prec = 7 # 设置新的精度" + +#: ../../library/decimal.rst:133 +msgid "" +"Decimal instances can be constructed from integers, strings, floats, or " +"tuples. Construction from an integer or a float performs an exact conversion" +" of the value of that integer or float. Decimal numbers include special " +"values such as ``NaN`` which stands for \"Not a number\", positive and " +"negative ``Infinity``, and ``-0``::" +msgstr "" +"Decimal 实例可以基于整数、字符串、浮点数或元组来构建。基于整数或浮点数进行构建将执行该整数或浮点数值的精确转换。Decimal " +"数字包括特殊值如代表“非数字”的 ``NaN``,正的和负的 ``Infinity`` 以及 ``-0``::" + +#: ../../library/decimal.rst:139 +msgid "" +">>> getcontext().prec = 28\n" +">>> Decimal(10)\n" +"Decimal('10')\n" +">>> Decimal('3.14')\n" +"Decimal('3.14')\n" +">>> Decimal(3.14)\n" +"Decimal('3.140000000000000124344978758017532527446746826171875')\n" +">>> Decimal((0, (3, 1, 4), -2))\n" +"Decimal('3.14')\n" +">>> Decimal(str(2.0 ** 0.5))\n" +"Decimal('1.4142135623730951')\n" +">>> Decimal(2) ** Decimal('0.5')\n" +"Decimal('1.414213562373095048801688724')\n" +">>> Decimal('NaN')\n" +"Decimal('NaN')\n" +">>> Decimal('-Infinity')\n" +"Decimal('-Infinity')" +msgstr "" +">>> getcontext().prec = 28\n" +">>> Decimal(10)\n" +"Decimal('10')\n" +">>> Decimal('3.14')\n" +"Decimal('3.14')\n" +">>> Decimal(3.14)\n" +"Decimal('3.140000000000000124344978758017532527446746826171875')\n" +">>> Decimal((0, (3, 1, 4), -2))\n" +"Decimal('3.14')\n" +">>> Decimal(str(2.0 ** 0.5))\n" +"Decimal('1.4142135623730951')\n" +">>> Decimal(2) ** Decimal('0.5')\n" +"Decimal('1.414213562373095048801688724')\n" +">>> Decimal('NaN')\n" +"Decimal('NaN')\n" +">>> Decimal('-Infinity')\n" +"Decimal('-Infinity')" + +#: ../../library/decimal.rst:157 +msgid "" +"If the :exc:`FloatOperation` signal is trapped, accidental mixing of " +"decimals and floats in constructors or ordering comparisons raises an " +"exception::" +msgstr "如果 :exc:`FloatOperation` 信号被捕获,构造函数中的小数和浮点数的意外混合或排序比较会引发异常::" + +#: ../../library/decimal.rst:161 +msgid "" +">>> c = getcontext()\n" +">>> c.traps[FloatOperation] = True\n" +">>> Decimal(3.14)\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"decimal.FloatOperation: []\n" +">>> Decimal('3.5') < 3.7\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"decimal.FloatOperation: []\n" +">>> Decimal('3.5') == 3.5\n" +"True" +msgstr "" +">>> c = getcontext()\n" +">>> c.traps[FloatOperation] = True\n" +">>> Decimal(3.14)\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"decimal.FloatOperation: []\n" +">>> Decimal('3.5') < 3.7\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"decimal.FloatOperation: []\n" +">>> Decimal('3.5') == 3.5\n" +"True" + +#: ../../library/decimal.rst:176 +msgid "" +"The significance of a new Decimal is determined solely by the number of " +"digits input. Context precision and rounding only come into play during " +"arithmetic operations." +msgstr "新 Decimal 的有效位数仅由输入的位数决定。上下文精度和舍入仅在算术运算期间发挥作用。" + +#: ../../library/decimal.rst:180 +msgid "" +">>> getcontext().prec = 6\n" +">>> Decimal('3.0')\n" +"Decimal('3.0')\n" +">>> Decimal('3.1415926535')\n" +"Decimal('3.1415926535')\n" +">>> Decimal('3.1415926535') + Decimal('2.7182818285')\n" +"Decimal('5.85987')\n" +">>> getcontext().rounding = ROUND_UP\n" +">>> Decimal('3.1415926535') + Decimal('2.7182818285')\n" +"Decimal('5.85988')" +msgstr "" +">>> getcontext().prec = 6\n" +">>> Decimal('3.0')\n" +"Decimal('3.0')\n" +">>> Decimal('3.1415926535')\n" +"Decimal('3.1415926535')\n" +">>> Decimal('3.1415926535') + Decimal('2.7182818285')\n" +"Decimal('5.85987')\n" +">>> getcontext().rounding = ROUND_UP\n" +">>> Decimal('3.1415926535') + Decimal('2.7182818285')\n" +"Decimal('5.85988')" + +#: ../../library/decimal.rst:193 +msgid "" +"If the internal limits of the C version are exceeded, constructing a decimal" +" raises :class:`InvalidOperation`::" +msgstr "如果超出了 C 版本的内部限制,则构造一个 decimal 将引发 :class:`InvalidOperation` ::" + +#: ../../library/decimal.rst:196 +msgid "" +">>> Decimal(\"1e9999999999999999999\")\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"decimal.InvalidOperation: []" +msgstr "" +">>> Decimal(\"1e9999999999999999999\")\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"decimal.InvalidOperation: []" + +#: ../../library/decimal.rst:203 +msgid "" +"Decimals interact well with much of the rest of Python. Here is a small " +"decimal floating-point flying circus:" +msgstr "Decimal 能很好地与 Python 的其余部分交互。以下是一个小小的 decimal 浮点数飞行马戏团:" + +#: ../../library/decimal.rst:206 +msgid "" +">>> data = list(map(Decimal, '1.34 1.87 3.45 2.35 1.00 0.03 9.25'.split()))\n" +">>> max(data)\n" +"Decimal('9.25')\n" +">>> min(data)\n" +"Decimal('0.03')\n" +">>> sorted(data)\n" +"[Decimal('0.03'), Decimal('1.00'), Decimal('1.34'), Decimal('1.87'),\n" +" Decimal('2.35'), Decimal('3.45'), Decimal('9.25')]\n" +">>> sum(data)\n" +"Decimal('19.29')\n" +">>> a,b,c = data[:3]\n" +">>> str(a)\n" +"'1.34'\n" +">>> float(a)\n" +"1.34\n" +">>> round(a, 1)\n" +"Decimal('1.3')\n" +">>> int(a)\n" +"1\n" +">>> a * 5\n" +"Decimal('6.70')\n" +">>> a * b\n" +"Decimal('2.5058')\n" +">>> c % a\n" +"Decimal('0.77')" +msgstr "" +">>> data = list(map(Decimal, '1.34 1.87 3.45 2.35 1.00 0.03 9.25'.split()))\n" +">>> max(data)\n" +"Decimal('9.25')\n" +">>> min(data)\n" +"Decimal('0.03')\n" +">>> sorted(data)\n" +"[Decimal('0.03'), Decimal('1.00'), Decimal('1.34'), Decimal('1.87'),\n" +" Decimal('2.35'), Decimal('3.45'), Decimal('9.25')]\n" +">>> sum(data)\n" +"Decimal('19.29')\n" +">>> a,b,c = data[:3]\n" +">>> str(a)\n" +"'1.34'\n" +">>> float(a)\n" +"1.34\n" +">>> round(a, 1)\n" +"Decimal('1.3')\n" +">>> int(a)\n" +"1\n" +">>> a * 5\n" +"Decimal('6.70')\n" +">>> a * b\n" +"Decimal('2.5058')\n" +">>> c % a\n" +"Decimal('0.77')" + +#: ../../library/decimal.rst:235 +msgid "" +"Decimals can be formatted (with :func:`format` built-in or :ref:`f-strings`)" +" in fixed-point or scientific notation, using the same formatting syntax " +"(see :ref:`formatspec`) as builtin :class:`float` type:" +msgstr "" +"Decimal 对象可 (通过 :func:`format` 内置函数或 :ref:`f-strings`) 格式化为定点数或科学计数法形式,使用与内置" +" :class:`float` 类型相同的格式化语法 (见 :ref:`formatspec`):" + +#: ../../library/decimal.rst:239 +msgid "" +">>> format(Decimal('2.675'), \"f\")\n" +"'2.675'\n" +">>> format(Decimal('2.675'), \".2f\")\n" +"'2.68'\n" +">>> f\"{Decimal('2.675'):.2f}\"\n" +"'2.68'\n" +">>> format(Decimal('2.675'), \".2e\")\n" +"'2.68e+0'\n" +">>> with localcontext() as ctx:\n" +"... ctx.rounding = ROUND_DOWN\n" +"... print(format(Decimal('2.675'), \".2f\"))\n" +"...\n" +"2.67" +msgstr "" +">>> format(Decimal('2.675'), \"f\")\n" +"'2.675'\n" +">>> format(Decimal('2.675'), \".2f\")\n" +"'2.68'\n" +">>> f\"{Decimal('2.675'):.2f}\"\n" +"'2.68'\n" +">>> format(Decimal('2.675'), \".2e\")\n" +"'2.68e+0'\n" +">>> with localcontext() as ctx:\n" +"... ctx.rounding = ROUND_DOWN\n" +"... print(format(Decimal('2.675'), \".2f\"))\n" +"...\n" +"2.67" + +#: ../../library/decimal.rst:255 +msgid "And some mathematical functions are also available to Decimal:" +msgstr "Decimal 也可以使用一些数学函数:" + +#: ../../library/decimal.rst:267 +msgid "" +"The :meth:`~Decimal.quantize` method rounds a number to a fixed exponent. " +"This method is useful for monetary applications that often round results to " +"a fixed number of places:" +msgstr ":meth:`~Decimal.quantize` 方法将舍入为固定的指数。此方法对于将结果舍入到固定位置的货币应用程序来说很有用处:" + +#: ../../library/decimal.rst:276 +msgid "" +"As shown above, the :func:`getcontext` function accesses the current context" +" and allows the settings to be changed. This approach meets the needs of " +"most applications." +msgstr "如上所示,:func:`getcontext` 函数访问当前上下文并允许更改设置。这种方法满足大多数应用程序的需求。" + +#: ../../library/decimal.rst:280 +msgid "" +"For more advanced work, it may be useful to create alternate contexts using " +"the :meth:`Context` constructor. To make an alternate active, use the " +":func:`setcontext` function." +msgstr "" +"对于更高级的工作,创建使用 :meth:`Context` 构造器的替代上下文可能会很有用处。要激活一个替代上下文,请使用 " +":func:`setcontext` 函数。" + +#: ../../library/decimal.rst:284 +msgid "" +"In accordance with the standard, the :mod:`!decimal` module provides two " +"ready to use standard contexts, :const:`BasicContext` and " +":const:`ExtendedContext`. The former is especially useful for debugging " +"because many of the traps are enabled:" +msgstr "" +"根据标准,:mod:`!decimal` 模块提供了两个现成的标准上下文 :const:`BasicContext` 和 " +":const:`ExtendedContext`。 前者特别适用于调试因为它启用了许多陷阱:" + +#: ../../library/decimal.rst:289 +msgid "" +">>> myothercontext = Context(prec=60, rounding=ROUND_HALF_DOWN)\n" +">>> setcontext(myothercontext)\n" +">>> Decimal(1) / Decimal(7)\n" +"Decimal('0.142857142857142857142857142857142857142857142857142857142857')\n" +"\n" +">>> ExtendedContext\n" +"Context(prec=9, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,\n" +" capitals=1, clamp=0, flags=[], traps=[])\n" +">>> setcontext(ExtendedContext)\n" +">>> Decimal(1) / Decimal(7)\n" +"Decimal('0.142857143')\n" +">>> Decimal(42) / Decimal(0)\n" +"Decimal('Infinity')\n" +"\n" +">>> setcontext(BasicContext)\n" +">>> Decimal(42) / Decimal(0)\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in -toplevel-\n" +" Decimal(42) / Decimal(0)\n" +"DivisionByZero: x / 0" +msgstr "" +">>> myothercontext = Context(prec=60, rounding=ROUND_HALF_DOWN)\n" +">>> setcontext(myothercontext)\n" +">>> Decimal(1) / Decimal(7)\n" +"Decimal('0.142857142857142857142857142857142857142857142857142857142857')\n" +"\n" +">>> ExtendedContext\n" +"Context(prec=9, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,\n" +" capitals=1, clamp=0, flags=[], traps=[])\n" +">>> setcontext(ExtendedContext)\n" +">>> Decimal(1) / Decimal(7)\n" +"Decimal('0.142857143')\n" +">>> Decimal(42) / Decimal(0)\n" +"Decimal('Infinity')\n" +"\n" +">>> setcontext(BasicContext)\n" +">>> Decimal(42) / Decimal(0)\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in -toplevel-\n" +" Decimal(42) / Decimal(0)\n" +"DivisionByZero: x / 0" + +#: ../../library/decimal.rst:313 +msgid "" +"Contexts also have signal flags for monitoring exceptional conditions " +"encountered during computations. The flags remain set until explicitly " +"cleared, so it is best to clear the flags before each set of monitored " +"computations by using the :meth:`~Context.clear_flags` method. ::" +msgstr "" +"上下文还具有用于监视计算期间遇到的异常情况的信号旗标。这些旗标将保持设置直到被显式地清除,因此最好是通过使用 " +":meth:`~Context.clear_flags` 方法来清除每组受监控的计算之前的旗标。 ::" + +#: ../../library/decimal.rst:318 +msgid "" +">>> setcontext(ExtendedContext)\n" +">>> getcontext().clear_flags()\n" +">>> Decimal(355) / Decimal(113)\n" +"Decimal('3.14159292')\n" +">>> getcontext()\n" +"Context(prec=9, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,\n" +" capitals=1, clamp=0, flags=[Inexact, Rounded], traps=[])" +msgstr "" +">>> setcontext(ExtendedContext)\n" +">>> getcontext().clear_flags()\n" +">>> Decimal(355) / Decimal(113)\n" +"Decimal('3.14159292')\n" +">>> getcontext()\n" +"Context(prec=9, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,\n" +" capitals=1, clamp=0, flags=[Inexact, Rounded], traps=[])" + +#: ../../library/decimal.rst:326 +msgid "" +"The *flags* entry shows that the rational approximation to pi was rounded " +"(digits beyond the context precision were thrown away) and that the result " +"is inexact (some of the discarded digits were non-zero)." +msgstr "*flags* 条目显示对 pi 的有理逼近被舍入(超出上下文精度的数字会被丢弃)并且结果是不精确的(某些被丢弃的数字为非零值)。" + +#: ../../library/decimal.rst:330 +msgid "" +"Individual traps are set using the dictionary in the :attr:`~Context.traps` " +"attribute of a context:" +msgstr "单个陷阱是使用上下文的 :attr:`~Context.traps` 属性中的字典来设置的:" + +#: ../../library/decimal.rst:333 +msgid "" +">>> setcontext(ExtendedContext)\n" +">>> Decimal(1) / Decimal(0)\n" +"Decimal('Infinity')\n" +">>> getcontext().traps[DivisionByZero] = 1\n" +">>> Decimal(1) / Decimal(0)\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in -toplevel-\n" +" Decimal(1) / Decimal(0)\n" +"DivisionByZero: x / 0" +msgstr "" +">>> setcontext(ExtendedContext)\n" +">>> Decimal(1) / Decimal(0)\n" +"Decimal('Infinity')\n" +">>> getcontext().traps[DivisionByZero] = 1\n" +">>> Decimal(1) / Decimal(0)\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in -toplevel-\n" +" Decimal(1) / Decimal(0)\n" +"DivisionByZero: x / 0" + +#: ../../library/decimal.rst:345 +msgid "" +"Most programs adjust the current context only once, at the beginning of the " +"program. And, in many applications, data is converted to :class:`Decimal` " +"with a single cast inside a loop. With context set and decimals created, " +"the bulk of the program manipulates the data no differently than with other " +"Python numeric types." +msgstr "" +"大多数程序仅在程序开始时调整当前上下文一次。并且,在许多应用程序中,数据在循环内单个强制转换为 :class:`Decimal`。 " +"通过创建上下文集和小数,程序的大部分操作数据与其他 Python 数字类型没有区别。" + +#: ../../library/decimal.rst:357 +msgid "Decimal objects" +msgstr "Decimal 对象" + +#: ../../library/decimal.rst:362 +msgid "Construct a new :class:`Decimal` object based from *value*." +msgstr "根据 *value* 构造一个新的 :class:`Decimal` 对象。" + +#: ../../library/decimal.rst:364 +msgid "" +"*value* can be an integer, string, tuple, :class:`float`, or another " +":class:`Decimal` object. If no *value* is given, returns ``Decimal('0')``. " +"If *value* is a string, it should conform to the decimal numeric string " +"syntax after leading and trailing whitespace characters, as well as " +"underscores throughout, are removed::" +msgstr "" +"*value* 可以是整数,字符串,元组,:class:`float`,或另一个 :class:`Decimal` 对象。如果没有给出 " +"*value*,则返回 ``Decimal('0')``。如果 *value* " +"是一个字符串,它应该在前导和尾随空格字符以及下划线被删除之后符合十进制数字字符串语法::" + +#: ../../library/decimal.rst:369 +msgid "" +"sign ::= '+' | '-'\n" +"digit ::= '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'\n" +"indicator ::= 'e' | 'E'\n" +"digits ::= digit [digit]...\n" +"decimal-part ::= digits '.' [digits] | ['.'] digits\n" +"exponent-part ::= indicator [sign] digits\n" +"infinity ::= 'Infinity' | 'Inf'\n" +"nan ::= 'NaN' [digits] | 'sNaN' [digits]\n" +"numeric-value ::= decimal-part [exponent-part] | infinity\n" +"numeric-string ::= [sign] numeric-value | [sign] nan" +msgstr "" +"sign ::= '+' | '-'\n" +"digit ::= '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'\n" +"indicator ::= 'e' | 'E'\n" +"digits ::= digit [digit]...\n" +"decimal-part ::= digits '.' [digits] | ['.'] digits\n" +"exponent-part ::= indicator [sign] digits\n" +"infinity ::= 'Infinity' | 'Inf'\n" +"nan ::= 'NaN' [digits] | 'sNaN' [digits]\n" +"numeric-value ::= decimal-part [exponent-part] | infinity\n" +"numeric-string ::= [sign] numeric-value | [sign] nan" + +#: ../../library/decimal.rst:380 +msgid "" +"Other Unicode decimal digits are also permitted where ``digit`` appears " +"above. These include decimal digits from various other alphabets (for " +"example, Arabic-Indic and Devanāgarī digits) along with the fullwidth digits" +" ``'\\uff10'`` through ``'\\uff19'``. Case is not significant, so, for " +"example, ``inf``, ``Inf``, ``INFINITY``, and ``iNfINity`` are all acceptable" +" spellings for positive infinity." +msgstr "" +"上面 ``digit`` 出现的地方也允许其他的 Unicode 十进制数码。这包括来自各种其他语言字母表的十进制数码(例如,Arabic-Indic " +"和 Devanāgarī 数码)以及全宽数码 ``'\\uff10'`` 至 ``'\\uff19'``。对大小写不敏感,因此,例如 ``inf``, " +"``Inf``, ``INFINITY`` 和 ``iNfINity`` 都是可接受的正无穷大拼写形式。" + +#: ../../library/decimal.rst:387 +msgid "" +"If *value* is a :class:`tuple`, it should have three components, a sign " +"(``0`` for positive or ``1`` for negative), a :class:`tuple` of digits, and " +"an integer exponent. For example, ``Decimal((0, (1, 4, 1, 4), -3))`` returns" +" ``Decimal('1.414')``." +msgstr "" +"如果 *value* 是一个 :class:`tuple`,它应当有三个组成部分,一个符号 (``0`` 表示正数 ``1`` " +"表示负数),一个由数字组成的 :class:`tuple`,以及一个整数指数值。例如,``Decimal((0, (1, 4, 1, 4), " +"-3))`` 将返回 ``Decimal('1.414')``。" + +#: ../../library/decimal.rst:392 +msgid "" +"If *value* is a :class:`float`, the binary floating-point value is " +"losslessly converted to its exact decimal equivalent. This conversion can " +"often require 53 or more digits of precision. For example, " +"``Decimal(float('1.1'))`` converts to " +"``Decimal('1.100000000000000088817841970012523233890533447265625')``." +msgstr "" +"如果 *value* 是 :class:`float`,则二进制浮点值将无损地转换为其精确的十进制等效值。此转换通常需要 53 位或更多位数的精度。 " +"例如,``Decimal(float('1.1'))`` 转换为 " +"``Decimal('1.100000000000000088817841970012523233890533447265625')``." + +#: ../../library/decimal.rst:398 +msgid "" +"The *context* precision does not affect how many digits are stored. That is " +"determined exclusively by the number of digits in *value*. For example, " +"``Decimal('3.00000')`` records all five zeros even if the context precision " +"is only three." +msgstr "" +"*context* 精度不会影响存储的位数。这完全由 *value* 中的位数决定。例如,``Decimal('3.00000')`` " +"记录所有五个零,即使上下文精度只有三。" + +#: ../../library/decimal.rst:403 +msgid "" +"The purpose of the *context* argument is determining what to do if *value* " +"is a malformed string. If the context traps :const:`InvalidOperation`, an " +"exception is raised; otherwise, the constructor returns a new Decimal with " +"the value of ``NaN``." +msgstr "" +"*context* 参数的目的是确定当 *value* 为错误格式的字符串时要怎么做。如果上下文捕获了 " +":const:`InvalidOperation`,将会引发异常;在其他情况下,构造器将返回一个值为 ``NaN`` 的新 Decimal。" + +#: ../../library/decimal.rst:408 +msgid "Once constructed, :class:`Decimal` objects are immutable." +msgstr "构造完成后, :class:`Decimal` 对象是不可变的。" + +#: ../../library/decimal.rst:410 +msgid "" +"The argument to the constructor is now permitted to be a :class:`float` " +"instance." +msgstr "现在允许构造函数的参数为 :class:`float` 实例。" + +#: ../../library/decimal.rst:414 +msgid "" +":class:`float` arguments raise an exception if the :exc:`FloatOperation` " +"trap is set. By default the trap is off." +msgstr ":class:`float` 参数在设置 :exc:`FloatOperation` 陷阱时引发异常。默认情况下,陷阱已关闭。" + +#: ../../library/decimal.rst:418 +msgid "" +"Underscores are allowed for grouping, as with integral and floating-point " +"literals in code." +msgstr "允许下划线进行分组,就像代码中的整数和浮点文字一样。" + +#: ../../library/decimal.rst:422 +msgid "" +"Decimal floating-point objects share many properties with the other built-in" +" numeric types such as :class:`float` and :class:`int`. All of the usual " +"math operations and special methods apply. Likewise, decimal objects can be" +" copied, pickled, printed, used as dictionary keys, used as set elements, " +"compared, sorted, and coerced to another type (such as :class:`float` or " +":class:`int`)." +msgstr "" +"十进制浮点对象与其他内置数值类型共享许多属性,例如 :class:`float` 和 :class:`int`。所有常用的数学运算和特殊方法都适用。 " +"同样,十进制对象可以复制、pickle、打印、用作字典键、用作集合元素、比较、排序和强制转换为另一种类型(例如 :class:`float` 或 " +":class:`int` 等)。" + +#: ../../library/decimal.rst:429 +msgid "" +"There are some small differences between arithmetic on Decimal objects and " +"arithmetic on integers and floats. When the remainder operator ``%`` is " +"applied to Decimal objects, the sign of the result is the sign of the " +"*dividend* rather than the sign of the divisor::" +msgstr "" +"Decimal 对象上的算术运算与整数和浮点数上的算术运算有一些小的差别。当余数运算符 ``%`` 应用于 Decimal 对象时,结果的符号是 " +"*被除数* 的符号,而不是除数的符号::" + +#: ../../library/decimal.rst:434 +msgid "" +">>> (-7) % 4\n" +"1\n" +">>> Decimal(-7) % Decimal(4)\n" +"Decimal('-3')" +msgstr "" +">>> (-7) % 4\n" +"1\n" +">>> Decimal(-7) % Decimal(4)\n" +"Decimal('-3')" + +#: ../../library/decimal.rst:439 +msgid "" +"The integer division operator ``//`` behaves analogously, returning the " +"integer part of the true quotient (truncating towards zero) rather than its " +"floor, so as to preserve the usual identity ``x == (x // y) * y + x % y``::" +msgstr "" +"整数除法运算符 ``//`` 的行为类似,返回真商的整数部分(截断为零)而不是它的向下取整,以便保留通常的标识 ``x == (x // y) * y " +"+ x % y``::" + +#: ../../library/decimal.rst:443 +msgid "" +">>> -7 // 4\n" +"-2\n" +">>> Decimal(-7) // Decimal(4)\n" +"Decimal('-1')" +msgstr "" +">>> -7 // 4\n" +"-2\n" +">>> Decimal(-7) // Decimal(4)\n" +"Decimal('-1')" + +#: ../../library/decimal.rst:448 +msgid "" +"The ``%`` and ``//`` operators implement the ``remainder`` and ``divide-" +"integer`` operations (respectively) as described in the specification." +msgstr "" +"``%`` 和 ``//`` 运算符实现了 ``remainder`` 和 ``divide-integer`` 操作(分别),如规范中所述。" + +#: ../../library/decimal.rst:452 +msgid "" +"Decimal objects cannot generally be combined with floats or instances of " +":class:`fractions.Fraction` in arithmetic operations: an attempt to add a " +":class:`Decimal` to a :class:`float`, for example, will raise a " +":exc:`TypeError`. However, it is possible to use Python's comparison " +"operators to compare a :class:`Decimal` instance ``x`` with another number " +"``y``. This avoids confusing results when doing equality comparisons " +"between numbers of different types." +msgstr "" +"十进制对象通常不能与浮点数或 :class:`fractions.Fraction` 实例在算术运算中结合使用:例如,尝试将 " +":class:`Decimal` 加到 :class:`float`,将引发 :exc:`TypeError`。但是,可以使用 Python " +"的比较运算符来比较 :class:`Decimal` 实例 ``x`` 和另一个数字 ``y``。 " +"这样可以避免在对不同类型的数字进行相等比较时混淆结果。" + +#: ../../library/decimal.rst:460 +msgid "" +"Mixed-type comparisons between :class:`Decimal` instances and other numeric " +"types are now fully supported." +msgstr "现在完全支持 :class:`Decimal` 实例和其他数字类型之间的混合类型比较。" + +#: ../../library/decimal.rst:464 +msgid "" +"In addition to the standard numeric properties, decimal floating-point " +"objects also have a number of specialized methods:" +msgstr "除了标准的数字属性,十进制浮点对象还有许多专门的方法:" + +#: ../../library/decimal.rst:470 +msgid "" +"Return the adjusted exponent after shifting out the coefficient's rightmost " +"digits until only the lead digit remains: ``Decimal('321e+5').adjusted()`` " +"returns seven. Used for determining the position of the most significant " +"digit with respect to the decimal point." +msgstr "" +"在移出系数最右边的数字之后返回调整后的指数,直到只剩下前导数字: ``Decimal('321e+5').adjusted()`` 返回 7。 " +"用于确定最高有效位相对于小数点的位置。" + +#: ../../library/decimal.rst:477 +msgid "" +"Return a pair ``(n, d)`` of integers that represent the given " +":class:`Decimal` instance as a fraction, in lowest terms and with a positive" +" denominator::" +msgstr "返回一对 ``(n, d)`` 整数,表示给定的 :class:`Decimal` 实例作为分数、最简形式项并带有正分母::" + +#: ../../library/decimal.rst:481 +msgid "" +">>> Decimal('-3.14').as_integer_ratio()\n" +"(-157, 50)" +msgstr "" +">>> Decimal('-3.14').as_integer_ratio()\n" +"(-157, 50)" + +#: ../../library/decimal.rst:484 +msgid "" +"The conversion is exact. Raise OverflowError on infinities and ValueError " +"on NaNs." +msgstr "转换是精确的。在 Infinity 上引发 OverflowError,在 NaN 上引起 ValueError。" + +#: ../../library/decimal.rst:491 +msgid "" +"Return a :term:`named tuple` representation of the number: " +"``DecimalTuple(sign, digits, exponent)``." +msgstr "" +"返回一个 :term:`named tuple` 表示的数字: ``DecimalTuple(sign, digits, exponent)``。" + +#: ../../library/decimal.rst:497 +msgid "" +"Return the canonical encoding of the argument. Currently, the encoding of a" +" :class:`Decimal` instance is always canonical, so this operation returns " +"its argument unchanged." +msgstr "返回参数的规范编码。目前,一个 :class:`Decimal` 实例的编码始终是规范的,因此该操作返回其参数不变。" + +#: ../../library/decimal.rst:503 +msgid "" +"Compare the values of two Decimal instances. :meth:`compare` returns a " +"Decimal instance, and if either operand is a NaN then the result is a NaN::" +msgstr "" +"比较两个 Decimal 实例的值。 :meth:`compare` 返回一个 Decimal 实例,如果任一操作数是 NaN,那么结果是 NaN ::" + +#: ../../library/decimal.rst:507 +msgid "" +"a or b is a NaN ==> Decimal('NaN')\n" +"a < b ==> Decimal('-1')\n" +"a == b ==> Decimal('0')\n" +"a > b ==> Decimal('1')" +msgstr "" +"a or b is a NaN ==> Decimal('NaN')\n" +"a < b ==> Decimal('-1')\n" +"a == b ==> Decimal('0')\n" +"a > b ==> Decimal('1')" + +#: ../../library/decimal.rst:514 +msgid "" +"This operation is identical to the :meth:`compare` method, except that all " +"NaNs signal. That is, if neither operand is a signaling NaN then any quiet " +"NaN operand is treated as though it were a signaling NaN." +msgstr "" +"除了所有 NaN 信号之外,此操作与 :meth:`compare` 方法相同。也就是说,如果两个操作数都不是信令 NaN,那么任何静默的 NaN " +"操作数都被视为信令 NaN。" + +#: ../../library/decimal.rst:520 +msgid "" +"Compare two operands using their abstract representation rather than their " +"numerical value. Similar to the :meth:`compare` method, but the result " +"gives a total ordering on :class:`Decimal` instances. Two :class:`Decimal` " +"instances with the same numeric value but different representations compare " +"unequal in this ordering:" +msgstr "" +"使用它们的抽象表示而不是它们的数值来比较两个操作数。类似于 :meth:`compare` 方法,但结果给出了一个总排序 " +":class:`Decimal` 实例。两个 :class:`Decimal` 实例具有相同的数值但不同的表示形式在此排序中比较不相等:" + +#: ../../library/decimal.rst:529 +msgid "" +"Quiet and signaling NaNs are also included in the total ordering. The " +"result of this function is ``Decimal('0')`` if both operands have the same " +"representation, ``Decimal('-1')`` if the first operand is lower in the total" +" order than the second, and ``Decimal('1')`` if the first operand is higher " +"in the total order than the second operand. See the specification for " +"details of the total order." +msgstr "" +"静默和发出信号的 NaN 也包括在总排序中。这个函数的结果是 ``Decimal('0')`` 如果两个操作数具有相同的表示,或是 " +"``Decimal('-1')`` 如果第一个操作数的总顺序低于第二个操作数,或是 ``Decimal('1')`` " +"如果第一个操作数在总顺序中高于第二个操作数。有关总排序的详细信息,请参阅规范。" + +#: ../../library/decimal.rst:536 ../../library/decimal.rst:547 +#: ../../library/decimal.rst:575 ../../library/decimal.rst:879 +msgid "" +"This operation is unaffected by context and is quiet: no flags are changed " +"and no rounding is performed. As an exception, the C version may raise " +"InvalidOperation if the second operand cannot be converted exactly." +msgstr "" +"此操作不受上下文影响且静默:不更改任何标志且不执行舍入。作为例外,如果无法准确转换第二个操作数,则 C 版本可能会引发 " +"InvalidOperation。" + +#: ../../library/decimal.rst:542 +msgid "" +"Compare two operands using their abstract representation rather than their " +"value as in :meth:`compare_total`, but ignoring the sign of each operand. " +"``x.compare_total_mag(y)`` is equivalent to " +"``x.copy_abs().compare_total(y.copy_abs())``." +msgstr "" +"比较两个操作数使用它们的抽象表示而不是它们的值,如 :meth:`compare_total`,但忽略每个操作数的符号。 " +"``x.compare_total_mag(y)`` 相当于 ``x.copy_abs().compare_total(y.copy_abs())``。" + +#: ../../library/decimal.rst:553 +msgid "" +"Just returns self, this method is only to comply with the Decimal " +"Specification." +msgstr "仅返回 self,此方法仅用于符合 Decimal 规范。" + +#: ../../library/decimal.rst:558 +msgid "" +"Return the absolute value of the argument. This operation is unaffected by " +"the context and is quiet: no flags are changed and no rounding is performed." +msgstr "返回参数的绝对值。此操作不受上下文影响并且是静默的:没有更改标志且不执行舍入。" + +#: ../../library/decimal.rst:564 +msgid "" +"Return the negation of the argument. This operation is unaffected by the " +"context and is quiet: no flags are changed and no rounding is performed." +msgstr "返回参数的取反结果。此操作不受上下文影响并且是静默的:没有标志更改且不执行舍入。" + +#: ../../library/decimal.rst:569 +msgid "" +"Return a copy of the first operand with the sign set to be the same as the " +"sign of the second operand. For example:" +msgstr "返回第一个操作数的副本,其符号设置为与第二个操作数的符号相同。例如:" + +#: ../../library/decimal.rst:581 +msgid "" +"Return the value of the (natural) exponential function ``e**x`` at the given" +" number. The result is correctly rounded using the :const:`ROUND_HALF_EVEN`" +" rounding mode." +msgstr "返回给定数字的(自然)指数函数 ``e**x`` 的值。结果使用 :const:`ROUND_HALF_EVEN` 舍入模式正确舍入。" + +#: ../../library/decimal.rst:592 +msgid "" +"Alternative constructor that only accepts instances of :class:`float` or " +":class:`int`." +msgstr "另一个构造函数,只接受 :class:`float` 或 :class:`int` 的实例。" + +#: ../../library/decimal.rst:595 +msgid "" +"Note ``Decimal.from_float(0.1)`` is not the same as ``Decimal('0.1')``. " +"Since 0.1 is not exactly representable in binary floating point, the value " +"is stored as the nearest representable value which is " +"``0x1.999999999999ap-4``. That equivalent value in decimal is " +"``0.1000000000000000055511151231257827021181583404541015625``." +msgstr "" +"请注意 ``Decimal.from_float(0.1)`` 与 ``Decimal('0.1')`` 是不同的。由于 0.1 " +"不能以二进制浮点数精确表示,该值将被存储为最接近的可表示值 ``0x1.999999999999ap-4``。与其等价的十进制值为 " +"``0.1000000000000000055511151231257827021181583404541015625``。" + +#: ../../library/decimal.rst:601 +msgid "" +"From Python 3.2 onwards, a :class:`Decimal` instance can also be constructed" +" directly from a :class:`float`." +msgstr "从 Python 3.2 开始,:class:`Decimal` 实例也可以直接从 :class:`float` 构造。" + +#: ../../library/decimal.rst:604 +msgid "" +">>> Decimal.from_float(0.1)\n" +"Decimal('0.1000000000000000055511151231257827021181583404541015625')\n" +">>> Decimal.from_float(float('nan'))\n" +"Decimal('NaN')\n" +">>> Decimal.from_float(float('inf'))\n" +"Decimal('Infinity')\n" +">>> Decimal.from_float(float('-inf'))\n" +"Decimal('-Infinity')" +msgstr "" +">>> Decimal.from_float(0.1)\n" +"Decimal('0.1000000000000000055511151231257827021181583404541015625')\n" +">>> Decimal.from_float(float('nan'))\n" +"Decimal('NaN')\n" +">>> Decimal.from_float(float('inf'))\n" +"Decimal('Infinity')\n" +">>> Decimal.from_float(float('-inf'))\n" +"Decimal('-Infinity')" + +#: ../../library/decimal.rst:619 +msgid "" +"Alternative constructor that only accepts instances of :class:`float`, " +":class:`int` or :class:`Decimal`, but not strings or tuples." +msgstr "" +"另一个构造器,它只接受 :class:`float`, :class:`int` 或 :class:`Decimal` 的实例,但不接受字符串或元组。" + +#: ../../library/decimal.rst:623 +msgid "" +">>> Decimal.from_number(314)\n" +"Decimal('314')\n" +">>> Decimal.from_number(0.1)\n" +"Decimal('0.1000000000000000055511151231257827021181583404541015625')\n" +">>> Decimal.from_number(Decimal('3.14'))\n" +"Decimal('3.14')" +msgstr "" +">>> Decimal.from_number(314)\n" +"Decimal('314')\n" +">>> Decimal.from_number(0.1)\n" +"Decimal('0.1000000000000000055511151231257827021181583404541015625')\n" +">>> Decimal.from_number(Decimal('3.14'))\n" +"Decimal('3.14')" + +#: ../../library/decimal.rst:636 +msgid "" +"Fused multiply-add. Return self*other+third with no rounding of the " +"intermediate product self*other." +msgstr "混合乘法加法。返回 self*other+third,中间乘积 self*other 没有舍入。" + +#: ../../library/decimal.rst:644 +msgid "" +"Return :const:`True` if the argument is canonical and :const:`False` " +"otherwise. Currently, a :class:`Decimal` instance is always canonical, so " +"this operation always returns :const:`True`." +msgstr "" +"如果参数是规范的则返回 :const:`True`,否则返回 :const:`False`。目前,:class:`Decimal` " +"实例总是规范的,所以这个操作总是返回 :const:`True`。" + +#: ../../library/decimal.rst:650 +msgid "" +"Return :const:`True` if the argument is a finite number, and :const:`False` " +"if the argument is an infinity or a NaN." +msgstr "如果参数是一个有限的数,则返回为 :const:`True`;如果参数为无穷大或 NaN,则返回为 :const:`False`。" + +#: ../../library/decimal.rst:655 +msgid "" +"Return :const:`True` if the argument is either positive or negative infinity" +" and :const:`False` otherwise." +msgstr "如果参数为正负无穷大,则返回为 :const:`True`,否则为 :const:`False`。" + +#: ../../library/decimal.rst:660 +msgid "" +"Return :const:`True` if the argument is a (quiet or signaling) NaN and " +":const:`False` otherwise." +msgstr "如果参数为 NaN(无论是否静默),则返回为 :const:`True`,否则为 :const:`False`。" + +#: ../../library/decimal.rst:665 +msgid "" +"Return :const:`True` if the argument is a *normal* finite number. Return " +":const:`False` if the argument is zero, subnormal, infinite or a NaN." +msgstr "" +"如果参数是一个 *标准的* 有限数则返回 :const:`True`。如果参数为零、次标准数、无穷大或 NaN 则返回 :const:`False`。" + +#: ../../library/decimal.rst:670 +msgid "" +"Return :const:`True` if the argument is a quiet NaN, and :const:`False` " +"otherwise." +msgstr "如果参数为静默 NaN,返回 :const:`True`,否则返回 :const:`False`。" + +#: ../../library/decimal.rst:675 +msgid "" +"Return :const:`True` if the argument has a negative sign and :const:`False` " +"otherwise. Note that zeros and NaNs can both carry signs." +msgstr "如果参数带有负号,则返回为 :const:`True`,否则返回 :const:`False`。注意,0 和 NaN 都可带有符号。" + +#: ../../library/decimal.rst:680 +msgid "" +"Return :const:`True` if the argument is a signaling NaN and :const:`False` " +"otherwise." +msgstr "如果参数为显式 NaN,则返回 :const:`True`,否则返回 :const:`False`。" + +#: ../../library/decimal.rst:685 +msgid "" +"Return :const:`True` if the argument is subnormal, and :const:`False` " +"otherwise." +msgstr "如果参数为次标准数,则返回 :const:`True`,否则返回 :const:`False`。" + +#: ../../library/decimal.rst:690 +msgid "" +"Return :const:`True` if the argument is a (positive or negative) zero and " +":const:`False` otherwise." +msgstr "如果参数是 0(正负皆可),则返回 :const:`True`,否则返回 :const:`False`。" + +#: ../../library/decimal.rst:695 +msgid "" +"Return the natural (base e) logarithm of the operand. The result is " +"correctly rounded using the :const:`ROUND_HALF_EVEN` rounding mode." +msgstr "返回操作数的自然对数(以 e 为底)。结果是使用 :const:`ROUND_HALF_EVEN` 舍入模式正确舍入的。" + +#: ../../library/decimal.rst:700 +msgid "" +"Return the base ten logarithm of the operand. The result is correctly " +"rounded using the :const:`ROUND_HALF_EVEN` rounding mode." +msgstr "返回操作数的以十为底的对数。结果是使用 :const:`ROUND_HALF_EVEN` 舍入模式正确舍入的。" + +#: ../../library/decimal.rst:705 +msgid "" +"For a nonzero number, return the adjusted exponent of its operand as a " +":class:`Decimal` instance. If the operand is a zero then " +"``Decimal('-Infinity')`` is returned and the :const:`DivisionByZero` flag is" +" raised. If the operand is an infinity then ``Decimal('Infinity')`` is " +"returned." +msgstr "" +"对于一个非零数,返回其运算数的调整后指数作为一个 :class:`Decimal` 实例。如果运算数为零将返回 " +"``Decimal('-Infinity')`` 并且产生 :const:`DivisionByZero` 标志。如果运算数是无限大则返回 " +"``Decimal('Infinity')``." + +#: ../../library/decimal.rst:713 +msgid "" +":meth:`logical_and` is a logical operation which takes two *logical " +"operands* (see :ref:`logical_operands_label`). The result is the digit-wise" +" ``and`` of the two operands." +msgstr "" +":meth:`logical_and` 是需要两个 *逻辑运算数* 的逻辑运算(参考 :ref:`logical_operands_label` " +")。按位输出两运算数的 ``and`` 运算的结果。" + +#: ../../library/decimal.rst:719 +msgid "" +":meth:`logical_invert` is a logical operation. The result is the digit-wise" +" inversion of the operand." +msgstr ":meth:`logical_invert` 是一个逻辑运算。结果是操作数的按位求反。" + +#: ../../library/decimal.rst:724 +msgid "" +":meth:`logical_or` is a logical operation which takes two *logical operands*" +" (see :ref:`logical_operands_label`). The result is the digit-wise ``or`` " +"of the two operands." +msgstr "" +":meth:`logical_or` 是需要两个 *逻辑运算数* 的逻辑运算(请参阅 :ref:`logical_operands_label` " +")。结果是两个运算数的按位的 ``or`` 运算。" + +#: ../../library/decimal.rst:730 +msgid "" +":meth:`logical_xor` is a logical operation which takes two *logical " +"operands* (see :ref:`logical_operands_label`). The result is the digit-wise" +" exclusive or of the two operands." +msgstr "" +":meth:`logical_xor` 是需要两个 *逻辑运算数* 的逻辑运算(参考 :ref:`logical_operands_label` " +")。结果是按位输出的两运算数的异或运算。" + +#: ../../library/decimal.rst:736 +msgid "" +"Like ``max(self, other)`` except that the context rounding rule is applied " +"before returning and that ``NaN`` values are either signaled or ignored " +"(depending on the context and whether they are signaling or quiet)." +msgstr "" +"类似于 ``max(self, other)`` 只是上下文舍入规则是在返回之前被应用并且对于 ``NaN`` " +"值会发出信号或忽略(依赖于上下文以及它们是否要发送信号或保持静默)。" + +#: ../../library/decimal.rst:743 +msgid "" +"Similar to the :meth:`.max` method, but the comparison is done using the " +"absolute values of the operands." +msgstr "与 :meth:`.max` 方法相似,但是操作数使用绝对值完成比较。" + +#: ../../library/decimal.rst:748 +msgid "" +"Like ``min(self, other)`` except that the context rounding rule is applied " +"before returning and that ``NaN`` values are either signaled or ignored " +"(depending on the context and whether they are signaling or quiet)." +msgstr "" +"类似于 ``min(self, other)`` 只是上下文舍入规则是在返回之前被应用并且对于 ``NaN`` " +"值会发出信号或忽略(依赖于上下文以及它们是发出了信号还是保持静默)。" + +#: ../../library/decimal.rst:755 +msgid "" +"Similar to the :meth:`.min` method, but the comparison is done using the " +"absolute values of the operands." +msgstr "与 :meth:`.min` 方法相似,但是操作数使用绝对值完成比较。" + +#: ../../library/decimal.rst:760 +msgid "" +"Return the largest number representable in the given context (or in the " +"current thread's context if no context is given) that is smaller than the " +"given operand." +msgstr "返回小于给定操作数的上下文中可表示的最大数字(或者当前线程的上下文中的可表示的最大数字如果没有给定上下文)。" + +#: ../../library/decimal.rst:766 +msgid "" +"Return the smallest number representable in the given context (or in the " +"current thread's context if no context is given) that is larger than the " +"given operand." +msgstr "返回大于给定操作数的上下文中可表示的最小数字(或者当前线程的上下文中的可表示的最小数字如果没有给定上下文)。" + +#: ../../library/decimal.rst:772 +msgid "" +"If the two operands are unequal, return the number closest to the first " +"operand in the direction of the second operand. If both operands are " +"numerically equal, return a copy of the first operand with the sign set to " +"be the same as the sign of the second operand." +msgstr "" +"如果两运算数不相等,返回在第二个操作数的方向上最接近第一个操作数的数。如果两操作数数值上相等,返回将符号设置为与第二个运算数相同的第一个运算数的拷贝。" + +#: ../../library/decimal.rst:779 +msgid "" +"Used for producing canonical values of an equivalence class within either " +"the current context or the specified context." +msgstr "用于在当前上下文或指定上下文中产生等价的类的规范值。" + +#: ../../library/decimal.rst:782 +msgid "" +"This has the same semantics as the unary plus operation, except that if the " +"final result is finite it is reduced to its simplest form, with all trailing" +" zeros removed and its sign preserved. That is, while the coefficient is " +"non-zero and a multiple of ten the coefficient is divided by ten and the " +"exponent is incremented by 1. Otherwise (the coefficient is zero) the " +"exponent is set to 0. In all cases the sign is unchanged." +msgstr "" +"该操作具有与单目取正值运算相同的语义,区别在于如果最终结果为有限值则将缩减到最简形式,即移除所有末尾的零并保留正负号。 " +"也就是说,当系数为非零值且为十的倍数时则将该系数除以十并将指数加 1。否则(当系数为零)则将指数设为 0。在任何情况下正负号都将保持不变。" + +#: ../../library/decimal.rst:789 +msgid "" +"For example, ``Decimal('32.100')`` and ``Decimal('0.321000e+2')`` both " +"normalize to the equivalent value ``Decimal('32.1')``." +msgstr "" +"例如,``Decimal('32.100')`` 和 ``Decimal('0.321000e+2')`` 均将标准化为等价的值 " +"``Decimal('32.1')``." + +#: ../../library/decimal.rst:792 +msgid "Note that rounding is applied *before* reducing to simplest form." +msgstr "请注意舍入的应用将在缩减到最简形式 *之前* 执行。" + +#: ../../library/decimal.rst:794 +msgid "" +"In the latest versions of the specification, this operation is also known as" +" ``reduce``." +msgstr "在此规范的最新版本中,该操作也被称为 ``reduce``。" + +#: ../../library/decimal.rst:799 +msgid "" +"Return a string describing the *class* of the operand. The returned value " +"is one of the following ten strings." +msgstr "返回一个字符串描述运算数的 *class* 。返回值是以下十个字符串中的一个。" + +#: ../../library/decimal.rst:802 +msgid "``\"-Infinity\"``, indicating that the operand is negative infinity." +msgstr "``\"-Infinity\"``,指示运算数为负无穷大。" + +#: ../../library/decimal.rst:803 +msgid "``\"-Normal\"``, indicating that the operand is a negative normal number." +msgstr "``\"-Normal\"``,指示该运算数是负正常数字。" + +#: ../../library/decimal.rst:804 +msgid "``\"-Subnormal\"``, indicating that the operand is negative and subnormal." +msgstr "``\"-Subnormal\"``,指示该运算数是负的次标准数。" + +#: ../../library/decimal.rst:805 +msgid "``\"-Zero\"``, indicating that the operand is a negative zero." +msgstr "``\"-Zero\"``,指示该运算数是负零。" + +#: ../../library/decimal.rst:806 +msgid "``\"+Zero\"``, indicating that the operand is a positive zero." +msgstr "``\"+Zero\"``,指示该运算数是正零。" + +#: ../../library/decimal.rst:807 +msgid "``\"+Subnormal\"``, indicating that the operand is positive and subnormal." +msgstr "``\"+Subnormal\"``,指示该运算数是正的次标准数。" + +#: ../../library/decimal.rst:808 +msgid "``\"+Normal\"``, indicating that the operand is a positive normal number." +msgstr "``\"+Normal\"``,指示该运算数是正的标准数。" + +#: ../../library/decimal.rst:809 +msgid "``\"+Infinity\"``, indicating that the operand is positive infinity." +msgstr "``\"+Infinity\"``,指示该运算数是正无穷。" + +#: ../../library/decimal.rst:810 +msgid "``\"NaN\"``, indicating that the operand is a quiet NaN (Not a Number)." +msgstr "``\"NaN\"``,指示该运算数是静默 NaN(非数字)。" + +#: ../../library/decimal.rst:811 +msgid "``\"sNaN\"``, indicating that the operand is a signaling NaN." +msgstr "``\"sNaN\"``,指示该运算数是信号 NaN。" + +#: ../../library/decimal.rst:815 +msgid "" +"Return a value equal to the first operand after rounding and having the " +"exponent of the second operand." +msgstr "返回的值等于舍入后的第一个运算数并且具有第二个操作数的指数。" + +#: ../../library/decimal.rst:821 +msgid "" +"Unlike other operations, if the length of the coefficient after the quantize" +" operation would be greater than precision, then an " +":const:`InvalidOperation` is signaled. This guarantees that, unless there is" +" an error condition, the quantized exponent is always equal to that of the " +"right-hand operand." +msgstr "" +"与其他运算不同,如果量化运算后的系数长度大于精度,那么会发出一个 :const:`InvalidOperation` " +"信号。这保证了除非有一个错误情况,量化指数恒等于右手运算数的指数。" + +#: ../../library/decimal.rst:827 +msgid "" +"Also unlike other operations, quantize never signals Underflow, even if the " +"result is subnormal and inexact." +msgstr "与其他运算不同,quantize 永远不会发出 Underflow 信号,即使结果是次标准数且不精确。" + +#: ../../library/decimal.rst:830 +msgid "" +"If the exponent of the second operand is larger than that of the first then " +"rounding may be necessary. In this case, the rounding mode is determined by" +" the ``rounding`` argument if given, else by the given ``context`` argument;" +" if neither argument is given the rounding mode of the current thread's " +"context is used." +msgstr "" +"如果第二个运算数的指数大于第一个运算数的指数那或许需要舍入。在这种情况下,舍入模式由给定 ``rounding`` 参数决定,其余的由给定 " +"``context`` 参数决定;如果参数都未给定,使用当前线程上下文的舍入模式。" + +#: ../../library/decimal.rst:836 +msgid "" +"An error is returned whenever the resulting exponent is greater than " +":attr:`~Context.Emax` or less than :meth:`~Context.Etiny`." +msgstr "每当结果的指数大于 :attr:`~Context.Emax` 或小于 :meth:`~Context.Etiny` 就将返回一个错误。" + +#: ../../library/decimal.rst:841 +msgid "" +"Return ``Decimal(10)``, the radix (base) in which the :class:`Decimal` class" +" does all its arithmetic. Included for compatibility with the " +"specification." +msgstr "" +"返回 ``Decimal(10)``,即 :class:`Decimal` 类进行所有算术运算所用的数制(基数)。 " +"这是为保持与规范描述的兼容性而加入的。" + +#: ../../library/decimal.rst:847 +msgid "" +"Return the remainder from dividing *self* by *other*. This differs from " +"``self % other`` in that the sign of the remainder is chosen so as to " +"minimize its absolute value. More precisely, the return value is ``self - n" +" * other`` where ``n`` is the integer nearest to the exact value of ``self /" +" other``, and if two integers are equally near then the even one is chosen." +msgstr "" +"返回 *self* 除以 *other* 的余数。这与 ``self % other`` 的区别在于所选择的余数要使其绝对值最小化。 " +"更准确地说,返回值为 ``self - n * other`` 其中 ``n`` 是最接近 ``self / other`` " +"的实际值的整数,并且如果两个整数与实际值的差相等则会选择其中的偶数。" + +#: ../../library/decimal.rst:854 +msgid "If the result is zero then its sign will be the sign of *self*." +msgstr "如果结果为零则其符号将为 *self* 的符号。" + +#: ../../library/decimal.rst:865 +msgid "" +"Return the result of rotating the digits of the first operand by an amount " +"specified by the second operand. The second operand must be an integer in " +"the range -precision through precision. The absolute value of the second " +"operand gives the number of places to rotate. If the second operand is " +"positive then rotation is to the left; otherwise rotation is to the right. " +"The coefficient of the first operand is padded on the left with zeros to " +"length precision if necessary. The sign and exponent of the first operand " +"are unchanged." +msgstr "" +"返回对第一个操作数的数码按第二个操作数所指定的数量进行轮转的结果。第二个操作数必须为 -precision 至 precision 精度范围内的整数。 " +"第二个操作数的绝对值给出要轮转的位数。如果第二个操作数为正值则向左轮转;否则向右轮转。如有必要第一个操作数的系数会在左侧填充零以达到 precision" +" 所指定的长度。第一个操作数的符号和指数保持不变。" + +#: ../../library/decimal.rst:876 +msgid "" +"Test whether self and other have the same exponent or whether both are " +"``NaN``." +msgstr "检测自身与 other 是否具有相同的指数或是否均为 ``NaN``。" + +#: ../../library/decimal.rst:885 +msgid "" +"Return the first operand with exponent adjusted by the second. Equivalently," +" return the first operand multiplied by ``10**other``. The second operand " +"must be an integer." +msgstr "" +"返回第一个操作数使用第二个操作数对指数进行调整的结果。等价于返回第一个操作数乘以 ``10**other`` 的结果。第二个操作数必须为整数。" + +#: ../../library/decimal.rst:891 +msgid "" +"Return the result of shifting the digits of the first operand by an amount " +"specified by the second operand. The second operand must be an integer in " +"the range -precision through precision. The absolute value of the second " +"operand gives the number of places to shift. If the second operand is " +"positive then the shift is to the left; otherwise the shift is to the right." +" Digits shifted into the coefficient are zeros. The sign and exponent of " +"the first operand are unchanged." +msgstr "" +"返回第一个操作数的数码按第二个操作数所指定的数量进行移位的结果。第二个操作数必须为 -precision 至 precision 范围内的整数。 " +"第二个操作数的绝对值给出要移动的位数。如果第二个操作数为正值则向左移位;否则向右移位。移入系数的数码为零。第一个操作数的符号和指数保持不变。" + +#: ../../library/decimal.rst:901 +msgid "Return the square root of the argument to full precision." +msgstr "返回参数的平方根精确到完整精度。" + +#: ../../library/decimal.rst:906 ../../library/decimal.rst:1563 +msgid "" +"Convert to a string, using engineering notation if an exponent is needed." +msgstr "转换为字符串,如果需要指数则会使用工程标注法。" + +#: ../../library/decimal.rst:908 ../../library/decimal.rst:1565 +msgid "" +"Engineering notation has an exponent which is a multiple of 3. This can " +"leave up to 3 digits to the left of the decimal place and may require the " +"addition of either one or two trailing zeros." +msgstr "工程标注法的指数是 3 的倍数。这会在十进制位的左边保留至多 3 个数码,并可能要求添加一至两个末尾零。" + +#: ../../library/decimal.rst:912 +msgid "" +"For example, this converts ``Decimal('123E+1')`` to ``Decimal('1.23E+3')``." +msgstr "例如,此方法会将 ``Decimal('123E+1')`` 转换为 ``Decimal('1.23E+3')``。" + +#: ../../library/decimal.rst:916 +msgid "" +"Identical to the :meth:`to_integral_value` method. The ``to_integral`` name" +" has been kept for compatibility with older versions." +msgstr "与 :meth:`to_integral_value` 方法相同。保留 ``to_integral`` 名称是为了与旧版本兼容。" + +#: ../../library/decimal.rst:921 +msgid "" +"Round to the nearest integer, signaling :const:`Inexact` or :const:`Rounded`" +" as appropriate if rounding occurs. The rounding mode is determined by the " +"``rounding`` parameter if given, else by the given ``context``. If neither " +"parameter is given then the rounding mode of the current context is used." +msgstr "" +"舍入到最接近的整数,发出信号 :const:`Inexact` 或者如果发生舍入则相应地发出信号 :const:`Rounded`。如果给出 " +"``rounding`` 形参则由其确定舍入模式,否则由给定的 ``context`` 来确定。如果没有给定任何形参则会使用当前上下文的舍入模式。" + +#: ../../library/decimal.rst:929 +msgid "" +"Round to the nearest integer without signaling :const:`Inexact` or " +":const:`Rounded`. If given, applies *rounding*; otherwise, uses the " +"rounding method in either the supplied *context* or the current context." +msgstr "" +"舍入到最接近的整数而不发出 :const:`Inexact` 或 :const:`Rounded` 信号。如果给出 *rounding* " +"则会应用其所指定的舍入模式;否则使用所提供的 *context* 或当前上下文的舍入方法。" + +#: ../../library/decimal.rst:933 +msgid "Decimal numbers can be rounded using the :func:`.round` function:" +msgstr "可以使用 :func:`.round` 函数对 Decimal 数字执行舍入:" + +#: ../../library/decimal.rst:938 +msgid "" +"If *ndigits* is not given or ``None``, returns the nearest :class:`int` to " +"*number*, rounding ties to even, and ignoring the rounding mode of the " +":class:`Decimal` context. Raises :exc:`OverflowError` if *number* is an " +"infinity or :exc:`ValueError` if it is a (quiet or signaling) NaN." +msgstr "" +"如果 *ndigits* 未给出或为 ``None``,则返回最接近 *number* 的 :class:`int`,同样接近时向偶数舍入,并忽略 " +":class:`Decimal` 上下文的舍入模式。如果 *number* 为无穷大则引发 :exc:`OverflowError` " +"或者如果为(静默或有信号)NaN 则引发 :exc:`ValueError`。" + +#: ../../library/decimal.rst:944 +msgid "" +"If *ndigits* is an :class:`int`, the context's rounding mode is respected " +"and a :class:`Decimal` representing *number* rounded to the nearest multiple" +" of ``Decimal('1E-ndigits')`` is returned; in this case, ``round(number, " +"ndigits)`` is equivalent to ``self.quantize(Decimal('1E-ndigits'))``. " +"Returns ``Decimal('NaN')`` if *number* is a quiet NaN. Raises " +":class:`InvalidOperation` if *number* is an infinity, a signaling NaN, or if" +" the length of the coefficient after the quantize operation would be greater" +" than the current context's precision. In other words, for the non-corner " +"cases:" +msgstr "" +"如果 *ndigits* 是一个 :class:`int`,则将遵循上下文的舍入模式并返回代表 *number* 的舍入到最接近 " +"``Decimal('1E-ndigits')`` 的倍数的 :class:`Decimal`;在此情况下,``round(number, " +"ndigits)`` 等价于 ``self.quantize(Decimal('1E-ndigits'))``。如果 *number* 是一个静默 " +"NaN 则返回 ``Decimal('NaN')``。如果 *number* 为无穷大、有信号 " +"NaN,或者如果量化操作后的系数长度大于当前上下文的精度则会引发 :class:`InvalidOperation`。换句话说,对于非边际情况:" + +#: ../../library/decimal.rst:954 +msgid "" +"if *ndigits* is positive, return *number* rounded to *ndigits* decimal " +"places;" +msgstr "如果 *ndigits* 为正值,则返回 *number* 舍入到 *ndigits* 个十进制数位的结果;" + +#: ../../library/decimal.rst:956 +msgid "if *ndigits* is zero, return *number* rounded to the nearest integer;" +msgstr "如果 *ndigits* 为零,则返回 *number* 舍入到最接近整数的结果;" + +#: ../../library/decimal.rst:957 +msgid "" +"if *ndigits* is negative, return *number* rounded to the nearest multiple of" +" ``10**abs(ndigits)``." +msgstr "如果 *ndigits* 为负值,则返回 *number* 舍入到最接近 ``10**abs(ndigits)`` 的倍数的结果。" + +#: ../../library/decimal.rst:960 +msgid "For example::" +msgstr "例如::" + +#: ../../library/decimal.rst:962 +msgid "" +">>> from decimal import Decimal, getcontext, ROUND_DOWN\n" +">>> getcontext().rounding = ROUND_DOWN\n" +">>> round(Decimal('3.75')) # context rounding ignored\n" +"4\n" +">>> round(Decimal('3.5')) # round-ties-to-even\n" +"4\n" +">>> round(Decimal('3.75'), 0) # uses the context rounding\n" +"Decimal('3')\n" +">>> round(Decimal('3.75'), 1)\n" +"Decimal('3.7')\n" +">>> round(Decimal('3.75'), -1)\n" +"Decimal('0E+1')" +msgstr "" +">>> from decimal import Decimal, getcontext, ROUND_DOWN\n" +">>> getcontext().rounding = ROUND_DOWN\n" +">>> round(Decimal('3.75')) # 上下文舍入设置将被忽略\n" +"4\n" +">>> round(Decimal('3.5')) # 两边相等则舍入到偶数\n" +"4\n" +">>> round(Decimal('3.75'), 0) # 使用上下文舍入设置\n" +"Decimal('3')\n" +">>> round(Decimal('3.75'), 1)\n" +"Decimal('3.7')\n" +">>> round(Decimal('3.75'), -1)\n" +"Decimal('0E+1')" + +#: ../../library/decimal.rst:979 +msgid "Logical operands" +msgstr "逻辑操作数" + +#: ../../library/decimal.rst:981 +msgid "" +"The :meth:`~Decimal.logical_and`, :meth:`~Decimal.logical_invert`, " +":meth:`~Decimal.logical_or`, and :meth:`~Decimal.logical_xor` methods expect" +" their arguments to be *logical operands*. A *logical operand* is a " +":class:`Decimal` instance whose exponent and sign are both zero, and whose " +"digits are all either ``0`` or ``1``." +msgstr "" +":meth:`~Decimal.logical_and`, :meth:`~Decimal.logical_invert`, " +":meth:`~Decimal.logical_or` 和 :meth:`~Decimal.logical_xor` 方法均期望其参数为 " +"*逻辑操作数*。 *逻辑操作数* 即指数位和符号位均为零,且其数字位均为 ``0`` 或 ``1`` 的 :class:`Decimal` 实例。" + +#: ../../library/decimal.rst:993 +msgid "Context objects" +msgstr "上下文对象" + +#: ../../library/decimal.rst:995 +msgid "" +"Contexts are environments for arithmetic operations. They govern precision," +" set rules for rounding, determine which signals are treated as exceptions, " +"and limit the range for exponents." +msgstr "上下文是算术运算所在的环境。它们管理精度、设置舍入规则、确定将哪些信号视为异常,并限制指数的范围。" + +#: ../../library/decimal.rst:999 +msgid "" +"Each thread has its own current context which is accessed or changed using " +"the :func:`getcontext` and :func:`setcontext` functions:" +msgstr "每个线程都有自己的当前上下文,可使用 :func:`getcontext` 和 :func:`setcontext` 函数来读取或修改:" + +#: ../../library/decimal.rst:1005 +msgid "Return the current context for the active thread." +msgstr "返回活动线程的当前上下文。" + +#: ../../library/decimal.rst:1010 +msgid "Set the current context for the active thread to *c*." +msgstr "将活动线程的当前上下文设为 *c*。" + +#: ../../library/decimal.rst:1012 +msgid "" +"You can also use the :keyword:`with` statement and the :func:`localcontext` " +"function to temporarily change the active context." +msgstr "你也可以使用 :keyword:`with` 语句和 :func:`localcontext` 函数来临时改变活动上下文。" + +#: ../../library/decimal.rst:1017 +msgid "" +"Return a context manager that will set the current context for the active " +"thread to a copy of *ctx* on entry to the with-statement and restore the " +"previous context when exiting the with-statement. If no context is " +"specified, a copy of the current context is used. The *kwargs* argument is " +"used to set the attributes of the new context." +msgstr "" +"返回一个将在进入 with 语句时将活动线程的上下文设为 *ctx* 的一个副本并在退出该 with 语句时恢复之前上下文的上下文管理器。 " +"如果未指定上下文,则会使用当前上下文的一个副本。 *kwargs* 参数将被用来设置新上下文的属性。" + +#: ../../library/decimal.rst:1023 +msgid "" +"For example, the following code sets the current decimal precision to 42 " +"places, performs a calculation, and then automatically restores the previous" +" context::" +msgstr "例如,以下代码会将当前 decimal 精度设为 42 位,执行一个运算,然后自动恢复之前的上下文::" + +#: ../../library/decimal.rst:1026 +msgid "" +"from decimal import localcontext\n" +"\n" +"with localcontext() as ctx:\n" +" ctx.prec = 42 # Perform a high precision calculation\n" +" s = calculate_something()\n" +"s = +s # Round the final result back to the default precision" +msgstr "" +"from decimal import localcontext\n" +"\n" +"with localcontext() as ctx:\n" +" ctx.prec = 42 # 执行高精度的运算\n" +" s = calculate_something()\n" +"s = +s # 将最终结果舍入到默认精度" + +#: ../../library/decimal.rst:1033 +msgid "Using keyword arguments, the code would be the following::" +msgstr "使用关键字参数,代码将如下所示::" + +#: ../../library/decimal.rst:1035 +msgid "" +"from decimal import localcontext\n" +"\n" +"with localcontext(prec=42) as ctx:\n" +" s = calculate_something()\n" +"s = +s" +msgstr "" +"from decimal import localcontext\n" +"\n" +"with localcontext(prec=42) as ctx:\n" +" s = calculate_something()\n" +"s = +s" + +#: ../../library/decimal.rst:1041 +msgid "" +"Raises :exc:`TypeError` if *kwargs* supplies an attribute that " +":class:`Context` doesn't support. Raises either :exc:`TypeError` or " +":exc:`ValueError` if *kwargs* supplies an invalid value for an attribute." +msgstr "" +"如果 *kwargs* 提供了 :class:`Context` 所不支持的属性则会引发 :exc:`TypeError`。如果 *kwargs* " +"提供了无效的属性值则会引发 :exc:`TypeError` 或 :exc:`ValueError`。" + +#: ../../library/decimal.rst:1045 +msgid "" +":meth:`localcontext` now supports setting context attributes through the use" +" of keyword arguments." +msgstr ":meth:`localcontext` 现在支持通过使用关键字参数来设置上下文属性。" + +#: ../../library/decimal.rst:1050 +msgid "" +"Return a context object initialized to the proper values for one of the IEEE" +" interchange formats. The argument must be a multiple of 32 and less than " +":const:`IEEE_CONTEXT_MAX_BITS`." +msgstr "" +"返回一个初始化为 IEEE 交换格式之一的正确值的上下文对象。参数必须是 32 的倍数且小于 " +":const:`IEEE_CONTEXT_MAX_BITS`." + +#: ../../library/decimal.rst:1056 +msgid "" +"New contexts can also be created using the :class:`Context` constructor " +"described below. In addition, the module provides three pre-made contexts:" +msgstr "新的上下文也可使用下述的 :class:`Context` 构造器来创建。此外,模块还提供了三种预设的上下文:" + +#: ../../library/decimal.rst:1062 +msgid "" +"This is a standard context defined by the General Decimal Arithmetic " +"Specification. Precision is set to nine. Rounding is set to " +":const:`ROUND_HALF_UP`. All flags are cleared. All traps are enabled " +"(treated as exceptions) except :const:`Inexact`, :const:`Rounded`, and " +":const:`Subnormal`." +msgstr "" +"这是由通用十进制算术规范描述所定义的标准上下文。精度设为九。舍入设为 :const:`ROUND_HALF_UP`。清除所有旗标。 " +"启用所有陷阱(视为异常),但 :const:`Inexact`, :const:`Rounded` 和 :const:`Subnormal` 除外。" + +#: ../../library/decimal.rst:1068 +msgid "" +"Because many of the traps are enabled, this context is useful for debugging." +msgstr "由于启用了许多陷阱,此上下文适用于进行调试。" + +#: ../../library/decimal.rst:1073 +msgid "" +"This is a standard context defined by the General Decimal Arithmetic " +"Specification. Precision is set to nine. Rounding is set to " +":const:`ROUND_HALF_EVEN`. All flags are cleared. No traps are enabled (so " +"that exceptions are not raised during computations)." +msgstr "" +"这是由通用十进制算术规范描述所定义的标准上下文。精度设为九。舍入设为 :const:`ROUND_HALF_EVEN`。清除所有旗标。 " +"不启用任何陷阱(因此在计算期间不会引发异常)。" + +#: ../../library/decimal.rst:1078 +msgid "" +"Because the traps are disabled, this context is useful for applications that" +" prefer to have result value of ``NaN`` or ``Infinity`` instead of raising " +"exceptions. This allows an application to complete a run in the presence of" +" conditions that would otherwise halt the program." +msgstr "" +"由于禁用了陷阱,此上下文适用于希望结果值为 ``NaN`` 或 ``Infinity`` 而不是引发异常的应用程序。 " +"这允许应用程序在出现当其他情况下会中止程序的条件时仍能完成运行。" + +#: ../../library/decimal.rst:1086 +msgid "" +"This context is used by the :class:`Context` constructor as a prototype for " +"new contexts. Changing a field (such a precision) has the effect of " +"changing the default for new contexts created by the :class:`Context` " +"constructor." +msgstr "" +"此上下文被 :class:`Context` 构造器用作新上下文的原型。改变一个字段(例如精度)的效果将是改变 :class:`Context` " +"构造器所创建的新上下文的默认值。" + +#: ../../library/decimal.rst:1090 +msgid "" +"This context is most useful in multi-threaded environments. Changing one of" +" the fields before threads are started has the effect of setting system-wide" +" defaults. Changing the fields after threads have started is not " +"recommended as it would require thread synchronization to prevent race " +"conditions." +msgstr "" +"此上下文最适用于多线程环境。在线程开始前改变一个字段具有设置全系统默认值的效果。不推荐在线程开始后改变字段,因为这会要求线程同步避免竞争条件。" + +#: ../../library/decimal.rst:1095 +msgid "" +"In single threaded environments, it is preferable to not use this context at" +" all. Instead, simply create contexts explicitly as described below." +msgstr "在单线程环境中,最好完全不使用此上下文。而是简单地显式创建上下文,具体如下所述。" + +#: ../../library/decimal.rst:1098 +msgid "" +"The default values are :attr:`Context.prec`\\ =\\ ``28``, " +":attr:`Context.rounding`\\ =\\ :const:`ROUND_HALF_EVEN`, and enabled traps " +"for :class:`Overflow`, :class:`InvalidOperation`, and " +":class:`DivisionByZero`." +msgstr "" +"默认值为 :attr:`Context.prec`\\ =\\ ``28``, :attr:`Context.rounding`\\ =\\ " +":const:`ROUND_HALF_EVEN`,并为 :class:`Overflow`, :class:`InvalidOperation` 和 " +":class:`DivisionByZero` 启用陷阱。" + +#: ../../library/decimal.rst:1103 +msgid "" +"In addition to the three supplied contexts, new contexts can be created with" +" the :class:`Context` constructor." +msgstr "在已提供的三种上下文之外,还可以使用 :class:`Context` 构造器创建新的上下文。" + +#: ../../library/decimal.rst:1109 +msgid "" +"Creates a new context. If a field is not specified or is :const:`None`, the" +" default values are copied from the :const:`DefaultContext`. If the *flags*" +" field is not specified or is :const:`None`, all flags are cleared." +msgstr "" +"创建一个新上下文。如果某个字段未指定或为 :const:`None`,则从 :const:`DefaultContext` 拷贝默认值。如果 " +"*flags* 字段未指定或为 :const:`None`,则清空所有旗标。" + +#: ../../library/decimal.rst:1115 +msgid "" +"An integer in the range [``1``, :const:`MAX_PREC`] that sets the precision " +"for arithmetic operations in the context." +msgstr "一个 [``1``, :const:`MAX_PREC`] 范围内的整数,用于设置上下文中算术运算符的精度。" + +#: ../../library/decimal.rst:1120 +msgid "One of the constants listed in the section `Rounding Modes`_." +msgstr "在 `Rounding Modes`_ 小节中列出的常量之一。" + +#: ../../library/decimal.rst:1125 +msgid "" +"Lists of any signals to be set. Generally, new contexts should only set " +"traps and leave the flags clear." +msgstr "由要设置的任何信号组成的列表。通常,新上下文应当只设置 traps 而让 flags 为空。" + +#: ../../library/decimal.rst:1131 +msgid "" +"Integers specifying the outer limits allowable for exponents. *Emin* must be" +" in the range [:const:`MIN_EMIN`, ``0``], *Emax* in the range [``0``, " +":const:`MAX_EMAX`]." +msgstr "" +"指明指数所允许的外部上限的整数。 *Emin* 必须在 [:const:`MIN_EMIN`, ``0``] 范围内,*Emax* 必须在 " +"[``0``, :const:`MAX_EMAX`] 范围内。" + +#: ../../library/decimal.rst:1137 +msgid "" +"Either ``0`` or ``1`` (the default). If set to ``1``, exponents are printed " +"with a capital ``E``; otherwise, a lowercase ``e`` is used: " +"``Decimal('6.02e+23')``." +msgstr "" +"值为 ``0`` 或 ``1`` (默认值)。 如果设为 ``1``,打印指数时将附带一个大写的 ``E``;在其他情况下,将使用小写的 ``e``: " +"``Decimal('6.02e+23')``." + +#: ../../library/decimal.rst:1143 +msgid "" +"Either ``0`` (the default) or ``1``. If set to ``1``, the exponent ``e`` of" +" a :class:`Decimal` instance representable in this context is strictly " +"limited to the range ``Emin - prec + 1 <= e <= Emax - prec + 1``. If *clamp*" +" is ``0`` then a weaker condition holds: the adjusted exponent of the " +":class:`Decimal` instance is at most :attr:`~Context.Emax`. When *clamp* is" +" ``1``, a large normal number will, where possible, have its exponent " +"reduced and a corresponding number of zeros added to its coefficient, in " +"order to fit the exponent constraints; this preserves the value of the " +"number but loses information about significant trailing zeros. For " +"example::" +msgstr "" +"值为 ``0`` (默认值) 或 ``1``。 如果设为 ``1``,则 :class:`Decimal` 实例的指数 ``e`` " +"在此上下文中将严格限制表示范围在 ``Emin - prec + 1 <= e <= Emax - prec + 1`` 之内。如果 *clamp* 为" +" ``0`` 则将适用较弱的条件:调整后的 :class:`Decimal` 实例指数最大值为 :attr:`~Context.Emax`。当 " +"*clamp* 为 ``1`` " +"时,一个很大的普通数值将在可能的情况下减小其指数并为其系数添加相应数量的零,以便符合指数值范围的限制;这可以保持数字值但会丢失有效末尾零的信息。 " +"例如::" + +#: ../../library/decimal.rst:1154 +msgid "" +">>> Context(prec=6, Emax=999, clamp=1).create_decimal('1.23e999')\n" +"Decimal('1.23000E+999')" +msgstr "" +">>> Context(prec=6, Emax=999, clamp=1).create_decimal('1.23e999')\n" +"Decimal('1.23000E+999')" + +#: ../../library/decimal.rst:1157 +msgid "" +"A *clamp* value of ``1`` allows compatibility with the fixed-width decimal " +"interchange formats specified in IEEE 754." +msgstr "将 *clamp* 值设为 ``1`` 即允许与 IEEE 754 所描述的固定宽度十进制交换格式保持兼容性。" + +#: ../../library/decimal.rst:1160 +msgid "" +"The :class:`Context` class defines several general purpose methods as well " +"as a large number of methods for doing arithmetic directly in a given " +"context. In addition, for each of the :class:`Decimal` methods described " +"above (with the exception of the :meth:`~Decimal.adjusted` and " +":meth:`~Decimal.as_tuple` methods) there is a corresponding :class:`Context`" +" method. For example, for a :class:`Context` instance ``C`` and " +":class:`Decimal` instance ``x``, ``C.exp(x)`` is equivalent to " +"``x.exp(context=C)``. Each :class:`Context` method accepts a Python integer" +" (an instance of :class:`int`) anywhere that a Decimal instance is accepted." +msgstr "" +":class:`Context` 类定义了几种通用方法以及大量直接在给定上下文中进行算术运算的方法。此外,对于上述的每种 " +":class:`Decimal` 方法(除了 :meth:`~Decimal.adjusted` 和 :meth:`~Decimal.as_tuple`" +" 方法)都有一个对应的 :class:`Context` 方法。例如,对于一个 :class:`Context` 的实例 ``C`` 和 " +":class:`Decimal` 的实例 ``x``,``C.exp(x)`` 就等价于 ``x.exp(context=C)``。每个 " +":class:`Context` 方法都接受一个 Python 整数(即 :class:`int` 的实例)在任何接受 Decimal 实例的地方使用。" + +#: ../../library/decimal.rst:1173 +msgid "Resets all of the flags to ``0``." +msgstr "将所有旗标重置为 ``0``。" + +#: ../../library/decimal.rst:1177 +msgid "Resets all of the traps to ``0``." +msgstr "将所有陷阱重置为 ``0``。" + +#: ../../library/decimal.rst:1183 +msgid "Return a duplicate of the context." +msgstr "返回上下文的一个副本。" + +#: ../../library/decimal.rst:1187 +msgid "Return a copy of the Decimal instance num." +msgstr "返回 Decimal 实例 num 的一个副本。" + +#: ../../library/decimal.rst:1191 +msgid "" +"Creates a new Decimal instance from *num* but using *self* as context. " +"Unlike the :class:`Decimal` constructor, the context precision, rounding " +"method, flags, and traps are applied to the conversion." +msgstr "" +"基于 *num* 创建一个新 Decimal 实例但使用 *self* 作为上下文。与 :class:`Decimal` " +"构造器不同,该上下文的精度、舍入方法、旗标和陷阱会被应用于转换过程。" + +#: ../../library/decimal.rst:1195 +msgid "" +"This is useful because constants are often given to a greater precision than" +" is needed by the application. Another benefit is that rounding immediately" +" eliminates unintended effects from digits beyond the current precision. In " +"the following example, using unrounded inputs means that adding zero to a " +"sum can change the result:" +msgstr "" +"此方法很有用处,因为常量往往被给予高于应用所需的精度。另一个好处在于立即执行舍入可以消除超出当前精度的数位所导致的意外效果。 " +"在下面的示例中,使用未舍入的输入意味着在总和中添加零会改变结果:" + +#: ../../library/decimal.rst:1201 +msgid "" +">>> getcontext().prec = 3\n" +">>> Decimal('3.4445') + Decimal('1.0023')\n" +"Decimal('4.45')\n" +">>> Decimal('3.4445') + Decimal(0) + Decimal('1.0023')\n" +"Decimal('4.44')" +msgstr "" +">>> getcontext().prec = 3\n" +">>> Decimal('3.4445') + Decimal('1.0023')\n" +"Decimal('4.45')\n" +">>> Decimal('3.4445') + Decimal(0) + Decimal('1.0023')\n" +"Decimal('4.44')" + +#: ../../library/decimal.rst:1209 +msgid "" +"This method implements the to-number operation of the IBM specification. If " +"the argument is a string, no leading or trailing whitespace or underscores " +"are permitted." +msgstr "此方法实现了 IBM 规格描述中的转换为数字操作。如果参数为字符串,则不允许有开头或末尾的空格或下划线。" + +#: ../../library/decimal.rst:1215 +msgid "" +"Creates a new Decimal instance from a float *f* but rounding using *self* as" +" the context. Unlike the :meth:`Decimal.from_float` class method, the " +"context precision, rounding method, flags, and traps are applied to the " +"conversion." +msgstr "" +"基于浮点数 *f* 创建一个新的 Decimal 实例,但会使用 *self* 作为上下文来执行舍入。与 " +":meth:`Decimal.from_float` 类方法不同,上下文的精度、舍入方法、旗标和陷阱会应用到转换中。" + +#: ../../library/decimal.rst:1220 +msgid "" +">>> context = Context(prec=5, rounding=ROUND_DOWN)\n" +">>> context.create_decimal_from_float(math.pi)\n" +"Decimal('3.1415')\n" +">>> context = Context(prec=5, traps=[Inexact])\n" +">>> context.create_decimal_from_float(math.pi)\n" +"Traceback (most recent call last):\n" +" ...\n" +"decimal.Inexact: None" +msgstr "" +">>> context = Context(prec=5, rounding=ROUND_DOWN)\n" +">>> context.create_decimal_from_float(math.pi)\n" +"Decimal('3.1415')\n" +">>> context = Context(prec=5, traps=[Inexact])\n" +">>> context.create_decimal_from_float(math.pi)\n" +"Traceback (most recent call last):\n" +" ...\n" +"decimal.Inexact: None" + +#: ../../library/decimal.rst:1235 +msgid "" +"Returns a value equal to ``Emin - prec + 1`` which is the minimum exponent " +"value for subnormal results. When underflow occurs, the exponent is set to " +":const:`Etiny`." +msgstr "" +"返回一个等于 ``Emin - prec + 1`` 的值即次标准化结果中的最小指数值。当发生向下溢出时,指数会设为 :const:`Etiny`。" + +#: ../../library/decimal.rst:1241 +msgid "Returns a value equal to ``Emax - prec + 1``." +msgstr "返回一个等于 ``Emax - prec + 1`` 的值。" + +#: ../../library/decimal.rst:1243 +msgid "" +"The usual approach to working with decimals is to create :class:`Decimal` " +"instances and then apply arithmetic operations which take place within the " +"current context for the active thread. An alternative approach is to use " +"context methods for calculating within a specific context. The methods are " +"similar to those for the :class:`Decimal` class and are only briefly " +"recounted here." +msgstr "" +"使用 decimal 的通常方式是创建 :class:`Decimal` 实例然后对其应用算术运算,这些运算发生在活动线程的当前上下文中。 " +"一种替代方式则是使用上下文的方法在特定上下文中进行计算。这些方法类似于 :class:`Decimal` 类的方法,在此仅简单地重新列出。" + +#: ../../library/decimal.rst:1253 +msgid "Returns the absolute value of *x*." +msgstr "返回 *x* 的绝对值。" + +#: ../../library/decimal.rst:1258 +msgid "Return the sum of *x* and *y*." +msgstr "返回 *x* 与 *y* 的和。" + +#: ../../library/decimal.rst:1263 +msgid "Returns the same Decimal object *x*." +msgstr "返回相同的 Decimal 对象 *x*。" + +#: ../../library/decimal.rst:1268 +msgid "Compares *x* and *y* numerically." +msgstr "对 *x* 与 *y* 进行数值比较。" + +#: ../../library/decimal.rst:1273 +msgid "Compares the values of the two operands numerically." +msgstr "对两个操作数进行数值比较。" + +#: ../../library/decimal.rst:1278 +msgid "Compares two operands using their abstract representation." +msgstr "对两个操作数使用其抽象表示进行比较。" + +#: ../../library/decimal.rst:1283 +msgid "" +"Compares two operands using their abstract representation, ignoring sign." +msgstr "对两个操作数使用其抽象表示进行比较,忽略符号。" + +#: ../../library/decimal.rst:1288 +msgid "Returns a copy of *x* with the sign set to 0." +msgstr "返回 *x* 的副本,符号设为 0。" + +#: ../../library/decimal.rst:1293 +msgid "Returns a copy of *x* with the sign inverted." +msgstr "返回 *x* 的副本,符号取反。" + +#: ../../library/decimal.rst:1298 +msgid "Copies the sign from *y* to *x*." +msgstr "从 *y* 拷贝符号至 *x*。" + +#: ../../library/decimal.rst:1303 +msgid "Return *x* divided by *y*." +msgstr "返回 *x* 除以 *y* 的结果。" + +#: ../../library/decimal.rst:1308 +msgid "Return *x* divided by *y*, truncated to an integer." +msgstr "返回 *x* 除以 *y* 的结果,截短为整数。" + +#: ../../library/decimal.rst:1313 +msgid "Divides two numbers and returns the integer part of the result." +msgstr "两个数字相除并返回结果的整数部分。" + +#: ../../library/decimal.rst:1318 +msgid "Returns ``e ** x``." +msgstr "返回 ``e ** x``。" + +#: ../../library/decimal.rst:1323 +msgid "Returns *x* multiplied by *y*, plus *z*." +msgstr "返回 *x* 乘以 *y* 再加 *z* 的结果。" + +#: ../../library/decimal.rst:1328 +msgid "Returns ``True`` if *x* is canonical; otherwise returns ``False``." +msgstr "如果 *x* 是规范的则返回 ``True``;否则返回 ``False``。" + +#: ../../library/decimal.rst:1333 +msgid "Returns ``True`` if *x* is finite; otherwise returns ``False``." +msgstr "如果 *x* 为有限的则返回 ``True``;否则返回 ``False``。" + +#: ../../library/decimal.rst:1338 +msgid "Returns ``True`` if *x* is infinite; otherwise returns ``False``." +msgstr "如果 *x* 是无限的则返回 ``True``;否则返回 ``False``。" + +#: ../../library/decimal.rst:1343 +msgid "" +"Returns ``True`` if *x* is a qNaN or sNaN; otherwise returns ``False``." +msgstr "如果 *x* 是 qNaN 或 sNaN 则返回 ``True``;否则返回 ``False``。" + +#: ../../library/decimal.rst:1348 +msgid "" +"Returns ``True`` if *x* is a normal number; otherwise returns ``False``." +msgstr "如果 *x* 是标准数则返回 ``True``;否则返回 ``False``。" + +#: ../../library/decimal.rst:1353 +msgid "Returns ``True`` if *x* is a quiet NaN; otherwise returns ``False``." +msgstr "如果 *x* 是静默 NaN 则返回 ``True``;否则返回 ``False``。" + +#: ../../library/decimal.rst:1358 +msgid "Returns ``True`` if *x* is negative; otherwise returns ``False``." +msgstr "如果 *x* 是负数则返回 ``True``;否则返回 ``False``。" + +#: ../../library/decimal.rst:1363 +msgid "" +"Returns ``True`` if *x* is a signaling NaN; otherwise returns ``False``." +msgstr "如果 *x* 是显式 NaN 则返回 ``True``;否则返回 ``False``。" + +#: ../../library/decimal.rst:1368 +msgid "Returns ``True`` if *x* is subnormal; otherwise returns ``False``." +msgstr "如果 *x* 是次标准数则返回 ``True``;否则返回 ``False``。" + +#: ../../library/decimal.rst:1373 +msgid "Returns ``True`` if *x* is a zero; otherwise returns ``False``." +msgstr "如果 *x* 为零则返回 ``True``;否则返回 ``False``。" + +#: ../../library/decimal.rst:1378 +msgid "Returns the natural (base e) logarithm of *x*." +msgstr "返回 *x* 的自然对数(以 e 为底)。" + +#: ../../library/decimal.rst:1383 +msgid "Returns the base 10 logarithm of *x*." +msgstr "返回 *x* 的以 10 为底的对数。" + +#: ../../library/decimal.rst:1388 +msgid "Returns the exponent of the magnitude of the operand's MSD." +msgstr "返回操作数的 MSD 等级的指数。" + +#: ../../library/decimal.rst:1393 +msgid "Applies the logical operation *and* between each operand's digits." +msgstr "在操作数的每个数位间应用逻辑运算 *and*。" + +#: ../../library/decimal.rst:1398 +msgid "Invert all the digits in *x*." +msgstr "反转 *x* 中的所有数位。" + +#: ../../library/decimal.rst:1403 +msgid "Applies the logical operation *or* between each operand's digits." +msgstr "在操作数的每个数位间应用逻辑运算 *or*。" + +#: ../../library/decimal.rst:1408 +msgid "Applies the logical operation *xor* between each operand's digits." +msgstr "在操作数的每个数位间应用逻辑运算 *xor*。" + +#: ../../library/decimal.rst:1413 +msgid "Compares two values numerically and returns the maximum." +msgstr "对两个值执行数字比较并返回其中的最大值。" + +#: ../../library/decimal.rst:1418 ../../library/decimal.rst:1428 +msgid "Compares the values numerically with their sign ignored." +msgstr "对两个值执行忽略正负号的数字比较。" + +#: ../../library/decimal.rst:1423 +msgid "Compares two values numerically and returns the minimum." +msgstr "对两个值执行数字比较并返回其中的最小值。" + +#: ../../library/decimal.rst:1433 +msgid "Minus corresponds to the unary prefix minus operator in Python." +msgstr "对应于 Python 中的单目前缀取负运算符执行取负操作。" + +#: ../../library/decimal.rst:1438 +msgid "Return the product of *x* and *y*." +msgstr "返回 *x* 和 *y* 的积。" + +#: ../../library/decimal.rst:1443 +msgid "Returns the largest representable number smaller than *x*." +msgstr "返回小于 *x* 的最大数字表示形式。" + +#: ../../library/decimal.rst:1448 +msgid "Returns the smallest representable number larger than *x*." +msgstr "返回大于 *x* 的最小数字表示形式。" + +#: ../../library/decimal.rst:1453 +msgid "Returns the number closest to *x*, in direction towards *y*." +msgstr "返回 *x* 趋向于 *y* 的最接近的数字。" + +#: ../../library/decimal.rst:1458 +msgid "Reduces *x* to its simplest form." +msgstr "将 *x* 改写为最简形式。" + +#: ../../library/decimal.rst:1463 +msgid "Returns an indication of the class of *x*." +msgstr "返回 *x* 的类的表示。" + +#: ../../library/decimal.rst:1468 +msgid "" +"Plus corresponds to the unary prefix plus operator in Python. This " +"operation applies the context precision and rounding, so it is *not* an " +"identity operation." +msgstr "对应于 Python 中的单目前缀取正运算符执行取正操作。此操作将应用上下文精度和舍入,因此它 *不是* 标识运算。" + +#: ../../library/decimal.rst:1475 +msgid "" +"Return ``x`` to the power of ``y``, reduced modulo ``modulo`` if given." +msgstr "返回 ``x`` 的 ``y`` 次方,如果给出了模数 ``modulo`` 则取其余数。" + +#: ../../library/decimal.rst:1477 +msgid "" +"With two arguments, compute ``x**y``. If ``x`` is negative then ``y`` must " +"be integral. The result will be inexact unless ``y`` is integral and the " +"result is finite and can be expressed exactly in 'precision' digits. The " +"rounding mode of the context is used. Results are always correctly rounded " +"in the Python version." +msgstr "" +"传入两个参数时,计算 ``x**y``。如果 ``x`` 为负值则 ``y`` 必须为整数。除非 ``y`` 为整数且结果为有限值并可在 " +"'precision' 位内精确表示否则结果将是不精确的。所在上下文的舍入模式将被使用。结果在 Python 版中总是会被正确地舍入。" + +#: ../../library/decimal.rst:1483 +msgid "" +"``Decimal(0) ** Decimal(0)`` results in ``InvalidOperation``, and if " +"``InvalidOperation`` is not trapped, then results in ``Decimal('NaN')``." +msgstr "" +"``Decimal(0) ** Decimal(0)`` 结果为 ``InvalidOperation``,而如果 " +"``InvalidOperation`` 未被捕获,则结果为 ``Decimal('NaN')``。" + +#: ../../library/decimal.rst:1486 +msgid "" +"The C module computes :meth:`power` in terms of the correctly rounded " +":meth:`exp` and :meth:`ln` functions. The result is well-defined but only " +"\"almost always correctly rounded\"." +msgstr "" +"C 模块计算 :meth:`power` 时会使用已正确舍入的 :meth:`exp` 和 :meth:`ln` 函数。 " +"结果是有良好定义的但仅限于“几乎总是正确舍入”。" + +#: ../../library/decimal.rst:1491 +msgid "" +"With three arguments, compute ``(x**y) % modulo``. For the three argument " +"form, the following restrictions on the arguments hold:" +msgstr "带有三个参数时,计算 ``(x**y) % modulo``。对于三个参数的形式,参数将会应用以下限制:" + +#: ../../library/decimal.rst:1494 +msgid "all three arguments must be integral" +msgstr "三个参数必须都是整数" + +#: ../../library/decimal.rst:1495 +msgid "``y`` must be nonnegative" +msgstr "``y`` 必须是非负数" + +#: ../../library/decimal.rst:1496 +msgid "at least one of ``x`` or ``y`` must be nonzero" +msgstr "``x`` 或 ``y`` 至少有一个不为零" + +#: ../../library/decimal.rst:1497 +msgid "``modulo`` must be nonzero and have at most 'precision' digits" +msgstr "``modulo`` 必须不为零且至多有 'precision' 位" + +#: ../../library/decimal.rst:1499 +msgid "" +"The value resulting from ``Context.power(x, y, modulo)`` is equal to the " +"value that would be obtained by computing ``(x**y) % modulo`` with unbounded" +" precision, but is computed more efficiently. The exponent of the result is" +" zero, regardless of the exponents of ``x``, ``y`` and ``modulo``. The " +"result is always exact." +msgstr "" +"来自 ``Context.power(x, y, modulo)`` 的结果值等于使用无限精度计算 ``(x**y) % modulo`` " +"所得到的值,但其计算过程更高效。结果的指数为零,无论 ``x``, ``y`` 和 ``modulo`` 的指数是多少。结果值总是完全精确的。" + +#: ../../library/decimal.rst:1509 +msgid "Returns a value equal to *x* (rounded), having the exponent of *y*." +msgstr "返回的值等于 *x* (舍入后),并且指数为 *y*。" + +#: ../../library/decimal.rst:1514 +msgid "Just returns 10, as this is Decimal, :)" +msgstr "恰好返回 10,因为这是 Decimal 对象 :)" + +#: ../../library/decimal.rst:1519 +msgid "Returns the remainder from integer division." +msgstr "返回整除所得到的余数。" + +#: ../../library/decimal.rst:1521 +msgid "" +"The sign of the result, if non-zero, is the same as that of the original " +"dividend." +msgstr "结果的符号,如果不为零,则与原始被除数的符号相同。" + +#: ../../library/decimal.rst:1527 +msgid "" +"Returns ``x - y * n``, where *n* is the integer nearest the exact value of " +"``x / y`` (if the result is 0 then its sign will be the sign of *x*)." +msgstr "" +"返回 ``x - y * n``,其中 *n* 为最接近 ``x / y`` 实际值的整数(如结果为 0 则其符号将与 *x* 的符号相同)。" + +#: ../../library/decimal.rst:1533 +msgid "Returns a rotated copy of *x*, *y* times." +msgstr "返回 *x* 翻转 *y* 次的副本。" + +#: ../../library/decimal.rst:1538 +msgid "Returns ``True`` if the two operands have the same exponent." +msgstr "如果两个操作数具有相同的指数则返回 ``True``。" + +#: ../../library/decimal.rst:1543 +msgid "Returns the first operand after adding the second value its exp." +msgstr "返回第一个操作数添加第二个值的指数后的结果。" + +#: ../../library/decimal.rst:1548 +msgid "Returns a shifted copy of *x*, *y* times." +msgstr "返回 *x* 变换 *y* 次的副本。" + +#: ../../library/decimal.rst:1553 +msgid "Square root of a non-negative number to context precision." +msgstr "非负数基于上下文精度的平方根。" + +#: ../../library/decimal.rst:1558 +msgid "Return the difference between *x* and *y*." +msgstr "返回 *x* 和 *y* 的差。" + +#: ../../library/decimal.rst:1572 +msgid "Rounds to an integer." +msgstr "舍入到一个整数。" + +#: ../../library/decimal.rst:1577 +msgid "Converts a number to a string using scientific notation." +msgstr "使用科学计数法将一个数字转换为字符串。" + +#: ../../library/decimal.rst:1584 +msgid "Constants" +msgstr "常量" + +#: ../../library/decimal.rst:1588 +msgid "" +"The highest version of the General Decimal Arithmetic Specification that " +"this implementation complies with. See " +"https://speleotrove.com/decimal/decarith.html for the specification." +msgstr "" + +#: ../../library/decimal.rst:1595 +msgid "" +"The following constants are only relevant for the C module. They are also " +"included in the pure Python version for compatibility." +msgstr "" + +#: ../../library/decimal.rst:1599 +msgid "32-bit" +msgstr "32 位" + +#: ../../library/decimal.rst:1599 +msgid "64-bit" +msgstr "64 位" + +#: ../../library/decimal.rst:1601 ../../library/decimal.rst:1603 +msgid "``425000000``" +msgstr "``425000000``" + +#: ../../library/decimal.rst:1601 ../../library/decimal.rst:1603 +msgid "``999999999999999999``" +msgstr "``999999999999999999``" + +#: ../../library/decimal.rst:1605 +msgid "``-425000000``" +msgstr "``-425000000``" + +#: ../../library/decimal.rst:1605 +msgid "``-999999999999999999``" +msgstr "``-999999999999999999``" + +#: ../../library/decimal.rst:1607 +msgid "``-849999999``" +msgstr "``-849999999``" + +#: ../../library/decimal.rst:1607 +msgid "``-1999999999999999997``" +msgstr "``-1999999999999999997``" + +#: ../../library/decimal.rst:1609 +msgid "``256``" +msgstr "``256``" + +#: ../../library/decimal.rst:1609 +msgid "``512``" +msgstr "``512``" + +#: ../../library/decimal.rst:1614 +msgid "" +"The value is ``True``. Deprecated, because Python now always has threads." +msgstr "该值为 ``True``。已弃用,因为 Python 现在总是启用线程。" + +#: ../../library/decimal.rst:1620 +msgid "" +"The default value is ``True``. If Python is :option:`configured using the " +"--without-decimal-contextvar option <--without-decimal-contextvar>`, the C " +"version uses a thread-local rather than a coroutine-local context and the " +"value is ``False``. This is slightly faster in some nested context " +"scenarios." +msgstr "" +"默认值为 ``True``。如果 Python 编译版本 :option:`使用了 --without-decimal-contextvar 选项来配置" +" <--without-decimal-contextvar>`,则 C 版本会使用线程局部而非协程局部上下文并且该值为 ``False``。 " +"这在某些嵌套上下文场景中将会稍快一些。" + +#: ../../library/decimal.rst:1629 +msgid "Rounding modes" +msgstr "舍入模式" + +#: ../../library/decimal.rst:1633 +msgid "Round towards ``Infinity``." +msgstr "舍入方向为 ``Infinity``。" + +#: ../../library/decimal.rst:1637 +msgid "Round towards zero." +msgstr "舍入方向为零。" + +#: ../../library/decimal.rst:1641 +msgid "Round towards ``-Infinity``." +msgstr "舍入方向为 ``-Infinity``。" + +#: ../../library/decimal.rst:1645 +msgid "Round to nearest with ties going towards zero." +msgstr "舍入到最接近的数,同样接近则舍入方向为零。" + +#: ../../library/decimal.rst:1649 +msgid "Round to nearest with ties going to nearest even integer." +msgstr "舍入到最接近的数,同样接近则舍入到最接近的偶数。" + +#: ../../library/decimal.rst:1653 +msgid "Round to nearest with ties going away from zero." +msgstr "舍入到最接近的数,同样接近则舍入到零的反方向。" + +#: ../../library/decimal.rst:1657 +msgid "Round away from zero." +msgstr "舍入到零的反方向。" + +#: ../../library/decimal.rst:1661 +msgid "" +"Round away from zero if last digit after rounding towards zero would have " +"been 0 or 5; otherwise round towards zero." +msgstr "如果最后一位朝零的方向舍入后为 0 或 5 则舍入到零的反方向;否则舍入方向为零。" + +#: ../../library/decimal.rst:1668 +msgid "Signals" +msgstr "信号" + +#: ../../library/decimal.rst:1670 +msgid "" +"Signals represent conditions that arise during computation. Each corresponds" +" to one context flag and one context trap enabler." +msgstr "信号代表在计算期间引发的条件。每个信号对应于一个上下文旗标和一个上下文陷阱启用器。" + +#: ../../library/decimal.rst:1673 +msgid "" +"The context flag is set whenever the condition is encountered. After the " +"computation, flags may be checked for informational purposes (for instance, " +"to determine whether a computation was exact). After checking the flags, be " +"sure to clear all flags before starting the next computation." +msgstr "" +"上下文旗标将在遇到特定条件时被设定。在完成计算之后,将为了获得信息而检测旗标(例如确定计算是否精确)。 " +"在检测旗标后,请确保在开始下一次计算之前清除所有旗标。" + +#: ../../library/decimal.rst:1678 +msgid "" +"If the context's trap enabler is set for the signal, then the condition " +"causes a Python exception to be raised. For example, if the " +":class:`DivisionByZero` trap is set, then a :exc:`DivisionByZero` exception " +"is raised upon encountering the condition." +msgstr "" +"如果为信号设定了上下文的陷阱启用器,则条件会导致特定的 Python 异常被引发。举例来说,如果设定了 :class:`DivisionByZero` " +"陷阱,则当遇到此条件时就将引发 :exc:`DivisionByZero` 异常。" + +#: ../../library/decimal.rst:1686 +msgid "Altered an exponent to fit representation constraints." +msgstr "修改一个指数以符合表示限制。" + +#: ../../library/decimal.rst:1688 +msgid "" +"Typically, clamping occurs when an exponent falls outside the context's " +":attr:`~Context.Emin` and :attr:`~Context.Emax` limits. If possible, the " +"exponent is reduced to fit by adding zeros to the coefficient." +msgstr "" +"通常,限位将在一个指数值超出上下文的 :attr:`~Context.Emin` 和 :attr:`~Context.Emax` 限制时发生。 " +"在可能的情况下,会通过向系数添加零来将指数缩减至符合限制。" + +#: ../../library/decimal.rst:1695 +msgid "Base class for other signals and a subclass of :exc:`ArithmeticError`." +msgstr "其他信号的基类,并且也是 :exc:`ArithmeticError` 的一个子类。" + +#: ../../library/decimal.rst:1700 +msgid "Signals the division of a non-infinite number by zero." +msgstr "非无限数被零除的信号。" + +#: ../../library/decimal.rst:1702 +msgid "" +"Can occur with division, modulo division, or when raising a number to a " +"negative power. If this signal is not trapped, returns ``Infinity`` or " +"``-Infinity`` with the sign determined by the inputs to the calculation." +msgstr "" +"可在除法、取余除法或对一个数执行负数次幂运算时发生。如果此信号未被陷阱捕获,则返回 ``Infinity`` 或 ``-Infinity`` " +"并由对计算的输入来确定正负符号。" + +#: ../../library/decimal.rst:1709 +msgid "Indicates that rounding occurred and the result is not exact." +msgstr "表明发生了舍入且结果是不精确的。" + +#: ../../library/decimal.rst:1711 +msgid "" +"Signals when non-zero digits were discarded during rounding. The rounded " +"result is returned. The signal flag or trap is used to detect when results " +"are inexact." +msgstr "有非零数位在舍入期间被丢弃的信号。舍入结果将被返回。此信号旗标或陷阱被用于检测结果不精确的情况。" + +#: ../../library/decimal.rst:1718 +msgid "An invalid operation was performed." +msgstr "执行了一个无效的操作。" + +#: ../../library/decimal.rst:1720 +msgid "" +"Indicates that an operation was requested that does not make sense. If not " +"trapped, returns ``NaN``. Possible causes include::" +msgstr "表明请求了一个无意义的运算。如果未被捕获,则返回 ``NaN``。可能的原因包括::" + +#: ../../library/decimal.rst:1723 +msgid "" +"Infinity - Infinity\n" +"0 * Infinity\n" +"Infinity / Infinity\n" +"x % 0\n" +"Infinity % x\n" +"sqrt(-x) and x > 0\n" +"0 ** 0\n" +"x ** (non-integer)\n" +"x ** Infinity" +msgstr "" +"Infinity - Infinity\n" +"0 * Infinity\n" +"Infinity / Infinity\n" +"x % 0\n" +"Infinity % x\n" +"sqrt(-x) and x > 0\n" +"0 ** 0\n" +"x ** (non-integer)\n" +"x ** Infinity" + +#: ../../library/decimal.rst:1736 +msgid "Numerical overflow." +msgstr "数值的溢出。" + +#: ../../library/decimal.rst:1738 +msgid "" +"Indicates the exponent is larger than :attr:`Context.Emax` after rounding " +"has occurred. If not trapped, the result depends on the rounding mode, " +"either pulling inward to the largest representable finite number or rounding" +" outward to ``Infinity``. In either case, :class:`Inexact` and " +":class:`Rounded` are also signaled." +msgstr "" +"表明在发生舍入之后指数值大于 :attr:`Context.Emax`。 " +"如果未被捕获,则结果将取决于舍入模式,或是向下舍入为最大的可表示有限数值,或是向上舍入为 ``Infinity``。无论是哪种情况,都将发出 " +":class:`Inexact` 和 :class:`Rounded` 信号。" + +#: ../../library/decimal.rst:1747 +msgid "Rounding occurred though possibly no information was lost." +msgstr "发生了舍入,但或许并没有信息丢失。" + +#: ../../library/decimal.rst:1749 +msgid "" +"Signaled whenever rounding discards digits; even if those digits are zero " +"(such as rounding ``5.00`` to ``5.0``). If not trapped, returns the result " +"unchanged. This signal is used to detect loss of significant digits." +msgstr "" +"一旦舍入操作丢弃了数位就会发出此信号;即使被丢弃的数位是零(如将 ``5.00`` 舍入到 ``5.0`` 的情况)。 " +"如果未被捕获,则不加修改地返回结果。此信号用于检测有效位数的丢弃。" + +#: ../../library/decimal.rst:1757 +msgid "Exponent was lower than :attr:`~Context.Emin` prior to rounding." +msgstr "在舍入之前指数值低于 :attr:`~Context.Emin`。" + +#: ../../library/decimal.rst:1759 +msgid "" +"Occurs when an operation result is subnormal (the exponent is too small). If" +" not trapped, returns the result unchanged." +msgstr "当操作结果是次标准数(即指数过小)时就会发出此信号。如果未被陷阱捕获,则不经修改过返回结果。" + +#: ../../library/decimal.rst:1765 +msgid "Numerical underflow with result rounded to zero." +msgstr "数字向下溢出导致结果舍入到零。" + +#: ../../library/decimal.rst:1767 +msgid "" +"Occurs when a subnormal result is pushed to zero by rounding. " +":class:`Inexact` and :class:`Subnormal` are also signaled." +msgstr "" +"当一个次标准数结果通过舍入转为零时就会发出此信号。同时还将引发 :class:`Inexact` 和 :class:`Subnormal` 信号。" + +#: ../../library/decimal.rst:1773 +msgid "Enable stricter semantics for mixing floats and Decimals." +msgstr "为 float 和 Decimal 的混合启用更严格的语义。" + +#: ../../library/decimal.rst:1775 +msgid "" +"If the signal is not trapped (default), mixing floats and Decimals is " +"permitted in the :class:`~decimal.Decimal` constructor, " +":meth:`~decimal.Context.create_decimal` and all comparison operators. Both " +"conversion and comparisons are exact. Any occurrence of a mixed operation is" +" silently recorded by setting :exc:`FloatOperation` in the context flags. " +"Explicit conversions with :meth:`~decimal.Decimal.from_float` or " +":meth:`~decimal.Context.create_decimal_from_float` do not set the flag." +msgstr "" +"如果信号未被捕获(默认),则在 :class:`~decimal.Decimal` " +"构造器、:meth:`~decimal.Context.create_decimal` 和所有比较运算中允许 float 和 Decimal 的混合。 " +"转换和比较都是完全精确的。发生的任何混合运算都将通过在上下文旗标中设置 :exc:`FloatOperation` 来静默地记录。通过 " +":meth:`~decimal.Decimal.from_float` 或 " +":meth:`~decimal.Context.create_decimal_from_float` 进行显式转换则不会设置旗标。" + +#: ../../library/decimal.rst:1783 +msgid "" +"Otherwise (the signal is trapped), only equality comparisons and explicit " +"conversions are silent. All other mixed operations raise " +":exc:`FloatOperation`." +msgstr "在其他情况下(即信号被捕获),则只静默执行相等性比较和显式转换。所有其他混合运算都将引发 :exc:`FloatOperation`。" + +#: ../../library/decimal.rst:1787 +msgid "The following table summarizes the hierarchy of signals::" +msgstr "以下表格总结了信号的层级结构::" + +#: ../../library/decimal.rst:1789 +msgid "" +"exceptions.ArithmeticError(exceptions.Exception)\n" +" DecimalException\n" +" Clamped\n" +" DivisionByZero(DecimalException, exceptions.ZeroDivisionError)\n" +" Inexact\n" +" Overflow(Inexact, Rounded)\n" +" Underflow(Inexact, Rounded, Subnormal)\n" +" InvalidOperation\n" +" Rounded\n" +" Subnormal\n" +" FloatOperation(DecimalException, exceptions.TypeError)" +msgstr "" +"exceptions.ArithmeticError(exceptions.Exception)\n" +" DecimalException\n" +" Clamped\n" +" DivisionByZero(DecimalException, exceptions.ZeroDivisionError)\n" +" Inexact\n" +" Overflow(Inexact, Rounded)\n" +" Underflow(Inexact, Rounded, Subnormal)\n" +" InvalidOperation\n" +" Rounded\n" +" Subnormal\n" +" FloatOperation(DecimalException, exceptions.TypeError)" + +#: ../../library/decimal.rst:1808 +msgid "Floating-point notes" +msgstr "浮点数说明" + +#: ../../library/decimal.rst:1812 +msgid "Mitigating round-off error with increased precision" +msgstr "通过提升精度来解决舍入错误" + +#: ../../library/decimal.rst:1814 +msgid "" +"The use of decimal floating point eliminates decimal representation error " +"(making it possible to represent ``0.1`` exactly); however, some operations " +"can still incur round-off error when non-zero digits exceed the fixed " +"precision." +msgstr "" +"使用 decimal 浮点数可以消除十进制表示错误(即能够精确地表示 ``0.1`` " +"这样的数);然而,某些运算在非零数位超出了给定的精度时仍然可能导致舍入错误。" + +#: ../../library/decimal.rst:1818 +msgid "" +"The effects of round-off error can be amplified by the addition or " +"subtraction of nearly offsetting quantities resulting in loss of " +"significance. Knuth provides two instructive examples where rounded " +"floating-point arithmetic with insufficient precision causes the breakdown " +"of the associative and distributive properties of addition:" +msgstr "" +"舍入错误的影响可能因接近相互抵销的加减运算被放大从而导致丢失有效位。Knuth " +"提供了两个指导性示例,其中出现了精度不足的浮点算术舍入,导致加法的结合律和分配律被打破:" + +#: ../../library/decimal.rst:1824 +msgid "" +"# Examples from Seminumerical Algorithms, Section 4.2.2.\n" +">>> from decimal import Decimal, getcontext\n" +">>> getcontext().prec = 8\n" +"\n" +">>> u, v, w = Decimal(11111113), Decimal(-11111111), Decimal('7.51111111')\n" +">>> (u + v) + w\n" +"Decimal('9.5111111')\n" +">>> u + (v + w)\n" +"Decimal('10')\n" +"\n" +">>> u, v, w = Decimal(20000), Decimal(-6), Decimal('6.0000003')\n" +">>> (u*v) + (u*w)\n" +"Decimal('0.01')\n" +">>> u * (v+w)\n" +"Decimal('0.0060000')" +msgstr "" +"# 来自 Seminumerical Algorithms, Section 4.2.2 的示例。\n" +">>> from decimal import Decimal, getcontext\n" +">>> getcontext().prec = 8\n" +"\n" +">>> u, v, w = Decimal(11111113), Decimal(-11111111), Decimal('7.51111111')\n" +">>> (u + v) + w\n" +"Decimal('9.5111111')\n" +">>> u + (v + w)\n" +"Decimal('10')\n" +"\n" +">>> u, v, w = Decimal(20000), Decimal(-6), Decimal('6.0000003')\n" +">>> (u*v) + (u*w)\n" +"Decimal('0.01')\n" +">>> u * (v+w)\n" +"Decimal('0.0060000')" + +#: ../../library/decimal.rst:1842 +msgid "" +"The :mod:`!decimal` module makes it possible to restore the identities by " +"expanding the precision sufficiently to avoid loss of significance:" +msgstr ":mod:`!decimal` 模块可通过充分扩展精度来避免损失有效位使得一致性的恢复成为可能:" + +#: ../../library/decimal.rst:1845 +msgid "" +">>> getcontext().prec = 20\n" +">>> u, v, w = Decimal(11111113), Decimal(-11111111), Decimal('7.51111111')\n" +">>> (u + v) + w\n" +"Decimal('9.51111111')\n" +">>> u + (v + w)\n" +"Decimal('9.51111111')\n" +">>>\n" +">>> u, v, w = Decimal(20000), Decimal(-6), Decimal('6.0000003')\n" +">>> (u*v) + (u*w)\n" +"Decimal('0.0060000')\n" +">>> u * (v+w)\n" +"Decimal('0.0060000')" +msgstr "" +">>> getcontext().prec = 20\n" +">>> u, v, w = Decimal(11111113), Decimal(-11111111), Decimal('7.51111111')\n" +">>> (u + v) + w\n" +"Decimal('9.51111111')\n" +">>> u + (v + w)\n" +"Decimal('9.51111111')\n" +">>>\n" +">>> u, v, w = Decimal(20000), Decimal(-6), Decimal('6.0000003')\n" +">>> (u*v) + (u*w)\n" +"Decimal('0.0060000')\n" +">>> u * (v+w)\n" +"Decimal('0.0060000')" + +#: ../../library/decimal.rst:1862 +msgid "Special values" +msgstr "特殊的值" + +#: ../../library/decimal.rst:1864 +msgid "" +"The number system for the :mod:`!decimal` module provides special values " +"including ``NaN``, ``sNaN``, ``-Infinity``, ``Infinity``, and two zeros, " +"``+0`` and ``-0``." +msgstr "" +"The number system for the :mod:`!decimal` 模块的数字系统提供了一些特殊的值包括 ``NaN``, " +"``sNaN``, ``-Infinity``, ``Infinity`` 以及两种零值,即 ``+0`` 和 ``-0``。" + +#: ../../library/decimal.rst:1868 +msgid "" +"Infinities can be constructed directly with: ``Decimal('Infinity')``. Also," +" they can arise from dividing by zero when the :exc:`DivisionByZero` signal " +"is not trapped. Likewise, when the :exc:`Overflow` signal is not trapped, " +"infinity can result from rounding beyond the limits of the largest " +"representable number." +msgstr "" +"无穷大可以使用 ``Decimal('Infinity')`` 来构建。它们也可以在不捕获 :exc:`DivisionByZero` " +"信号捕获时通过除以零来产生。类似地,当不捕获 :exc:`Overflow` 信号时,也可以通过舍入到超出最大可表示数字限制的方式产生无穷大的结果。" + +#: ../../library/decimal.rst:1873 +msgid "" +"The infinities are signed (affine) and can be used in arithmetic operations " +"where they get treated as very large, indeterminate numbers. For instance, " +"adding a constant to infinity gives another infinite result." +msgstr "无穷大是有符号的(仿射)并可用于算术运算,它们会被当作极其巨大的不确定数字来处理。例如,无穷大加一个常量结果也将为无穷大。" + +#: ../../library/decimal.rst:1877 +msgid "" +"Some operations are indeterminate and return ``NaN``, or if the " +":exc:`InvalidOperation` signal is trapped, raise an exception. For example," +" ``0/0`` returns ``NaN`` which means \"not a number\". This variety of " +"``NaN`` is quiet and, once created, will flow through other computations " +"always resulting in another ``NaN``. This behavior can be useful for a " +"series of computations that occasionally have missing inputs --- it allows " +"the calculation to proceed while flagging specific results as invalid." +msgstr "" +"某些运算没有确定的结果并将返回 ``NaN``,或者如果捕获了 :exc:`InvalidOperation` 信号,则会引发一个异常。 。这样的 " +"``NaN`` 将静默产生,并且一旦产生就将在参与其他运算时始终得到 ``NaN`` 的结果。这种行为对于偶尔缺少输入的各类计算都很有用处 --- " +"它允许在将特定结果标记为无效的同时让计算继续进行。" + +#: ../../library/decimal.rst:1885 +msgid "" +"A variant is ``sNaN`` which signals rather than remaining quiet after every " +"operation. This is a useful return value when an invalid result needs to " +"interrupt a calculation for special handling." +msgstr "一种变体形式是 ``sNaN``,它在每次运算后会发出信号而不是保持静默。当对于无效结果需要中断计算进行特别处理时这是一个很有用的返回值。" + +#: ../../library/decimal.rst:1889 +msgid "" +"The behavior of Python's comparison operators can be a little surprising " +"where a ``NaN`` is involved. A test for equality where one of the operands " +"is a quiet or signaling ``NaN`` always returns :const:`False` (even when " +"doing ``Decimal('NaN')==Decimal('NaN')``), while a test for inequality " +"always returns :const:`True`. An attempt to compare two Decimals using any " +"of the ``<``, ``<=``, ``>`` or ``>=`` operators will raise the " +":exc:`InvalidOperation` signal if either operand is a ``NaN``, and return " +":const:`False` if this signal is not trapped. Note that the General Decimal" +" Arithmetic specification does not specify the behavior of direct " +"comparisons; these rules for comparisons involving a ``NaN`` were taken from" +" the IEEE 854 standard (see Table 3 in section 5.7). To ensure strict " +"standards-compliance, use the :meth:`~Decimal.compare` and " +":meth:`~Decimal.compare_signal` methods instead." +msgstr "" +"Python 中比较运算符的行为在涉及 ``NaN`` 时可能会令人有点惊讶。相等性检测在操作数中有静默型或信号型 ``NaN`` 时总是会返回 " +":const:`False` (即使是执行 ``Decimal('NaN')==Decimal('NaN')``),而不等性检测总是会返回 " +":const:`True`。当尝试使用 ``<``, ``<=``, ``>`` 或 ``>=`` 运算符中的任何一个来比较两个 Decimal " +"值时,如果运算数中有 ``NaN`` 则将引发 :exc:`InvalidOperation` 信号,如果此信号未被捕获则将返回 " +":const:`False`。请注意通用十进制算术规范并未规定直接比较行为;这些涉及 ``NaN`` 的比较规则来自于 IEEE 854 标准 (见第 " +"5.7 节表 3)。要确保严格符合标准,请改用 :meth:`~Decimal.compare` 和 " +":meth:`~Decimal.compare_signal` 方法。" + +#: ../../library/decimal.rst:1902 +msgid "" +"The signed zeros can result from calculations that underflow. They keep the " +"sign that would have resulted if the calculation had been carried out to " +"greater precision. Since their magnitude is zero, both positive and " +"negative zeros are treated as equal and their sign is informational." +msgstr "" +"有符号零值可以由向下溢出的运算产生。它们保留符号是为了让运算结果能以更高的精度传递。 由于它们的大小为零,正零和负零会被视为相等,且它们的符号具有信息。" + +#: ../../library/decimal.rst:1907 +msgid "" +"In addition to the two signed zeros which are distinct yet equal, there are " +"various representations of zero with differing precisions yet equivalent in " +"value. This takes a bit of getting used to. For an eye accustomed to " +"normalized floating-point representations, it is not immediately obvious " +"that the following calculation returns a value equal to zero:" +msgstr "" +"在这两个不相同但却相等的有符号零之外,还存在几种零的不同表示形式,它们的精度不同但值也都相等。这需要一些时间来逐渐适应。 " +"对于习惯了标准浮点表示形式的眼睛来说,以下运算返回等于零的值并不是显而易见的:" + +#: ../../library/decimal.rst:1922 +msgid "Working with threads" +msgstr "使用线程" + +#: ../../library/decimal.rst:1924 +msgid "" +"The :func:`getcontext` function accesses a different :class:`Context` object" +" for each thread. Having separate thread contexts means that threads may " +"make changes (such as ``getcontext().prec=10``) without interfering with " +"other threads." +msgstr "" +":func:`getcontext` 函数会为每个线程访问不同的 :class:`Context` 对象。具有单独线程上下文意味着线程可以修改上下文 " +"(例如 ``getcontext().prec=10``) 而不影响其他线程。" + +#: ../../library/decimal.rst:1928 +msgid "" +"Likewise, the :func:`setcontext` function automatically assigns its target " +"to the current thread." +msgstr "类似的 :func:`setcontext` 会为当前上下文的目标自动赋值。" + +#: ../../library/decimal.rst:1931 +msgid "" +"If :func:`setcontext` has not been called before :func:`getcontext`, then " +":func:`getcontext` will automatically create a new context for use in the " +"current thread. New context objects have default values set from the " +":data:`decimal.DefaultContext` object." +msgstr "" +"如果在调用 :func:`setcontext` 之前调用了 :func:`getcontext`,则 :func:`getcontext` " +"将自动创建一个新的上下文在当前线程中使用。新的上下文对象具有从 :data:`decimal.DefaultContext` 对象设置的默认值。" + +#: ../../library/decimal.rst:1936 +msgid "" +"The :data:`sys.flags.thread_inherit_context` flag affects the context for " +"new threads. If the flag is false, new threads will start with an empty " +"context. In this case, :func:`getcontext` will create a new context object " +"when called and use the default values from *DefaultContext*. If the flag " +"is true, new threads will start with a copy of context from the caller of " +":meth:`threading.Thread.start`." +msgstr "" +":data:`sys.flags.thread_inherit_context` 标志影响新线程的上下文。如果该标志为 " +"false,则新线程将以空上下文启动。在这种情况下,:func:`getcontext` 将在调用时创建一个新的上下文对象,并使用 " +"*DefaultContext* 中的默认值。如果该标志为 true,则新线程将从 :meth:`threading.Thread.start` " +"调用者的上下文副本启动。" + +#: ../../library/decimal.rst:1943 +msgid "" +"To control the defaults so that each thread will use the same values " +"throughout the application, directly modify the *DefaultContext* object. " +"This should be done *before* any threads are started so that there won't be " +"a race condition between threads calling :func:`getcontext`. For example::" +msgstr "" +"要控制默认值以便每个线程在应用运行期间都使用相同的值,可以直接修改 *DefaultContext* 对象。这应当在任何线程启动 *之前* " +"完成以使得调用 :func:`getcontext` 的线程之间不会产生竞争条件。例如::" + +#: ../../library/decimal.rst:1948 +msgid "" +"# Set applicationwide defaults for all threads about to be launched\n" +"DefaultContext.prec = 12\n" +"DefaultContext.rounding = ROUND_DOWN\n" +"DefaultContext.traps = ExtendedContext.traps.copy()\n" +"DefaultContext.traps[InvalidOperation] = 1\n" +"setcontext(DefaultContext)\n" +"\n" +"# Afterwards, the threads can be started\n" +"t1.start()\n" +"t2.start()\n" +"t3.start()\n" +" . . ." +msgstr "" +"# 为所有将要启动的线程设置应用程序级默认值\n" +"DefaultContext.prec = 12\n" +"DefaultContext.rounding = ROUND_DOWN\n" +"DefaultContext.traps = ExtendedContext.traps.copy()\n" +"DefaultContext.traps[InvalidOperation] = 1\n" +"setcontext(DefaultContext)\n" +"\n" +"# 在此之后,即可启动线程\n" +"t1.start()\n" +"t2.start()\n" +"t3.start()\n" +" . . ." + +#: ../../library/decimal.rst:1967 +msgid "Recipes" +msgstr "例程" + +#: ../../library/decimal.rst:1969 +msgid "" +"Here are a few recipes that serve as utility functions and that demonstrate " +"ways to work with the :class:`Decimal` class::" +msgstr "以下是一些用作工具函数的例程,它们演示了使用 :class:`Decimal` 类的各种方式::" + +#: ../../library/decimal.rst:1972 +msgid "" +"def moneyfmt(value, places=2, curr='', sep=',', dp='.',\n" +" pos='', neg='-', trailneg=''):\n" +" \"\"\"Convert Decimal to a money formatted string.\n" +"\n" +" places: required number of places after the decimal point\n" +" curr: optional currency symbol before the sign (may be blank)\n" +" sep: optional grouping separator (comma, period, space, or blank)\n" +" dp: decimal point indicator (comma or period)\n" +" only specify as blank when places is zero\n" +" pos: optional sign for positive numbers: '+', space or blank\n" +" neg: optional sign for negative numbers: '-', '(', space or blank\n" +" trailneg:optional trailing minus indicator: '-', ')', space or blank\n" +"\n" +" >>> d = Decimal('-1234567.8901')\n" +" >>> moneyfmt(d, curr='$')\n" +" '-$1,234,567.89'\n" +" >>> moneyfmt(d, places=0, sep='.', dp='', neg='', trailneg='-')\n" +" '1.234.568-'\n" +" >>> moneyfmt(d, curr='$', neg='(', trailneg=')')\n" +" '($1,234,567.89)'\n" +" >>> moneyfmt(Decimal(123456789), sep=' ')\n" +" '123 456 789.00'\n" +" >>> moneyfmt(Decimal('-0.02'), neg='<', trailneg='>')\n" +" '<0.02>'\n" +"\n" +" \"\"\"\n" +" q = Decimal(10) ** -places # 2 places --> '0.01'\n" +" sign, digits, exp = value.quantize(q).as_tuple()\n" +" result = []\n" +" digits = list(map(str, digits))\n" +" build, next = result.append, digits.pop\n" +" if sign:\n" +" build(trailneg)\n" +" for i in range(places):\n" +" build(next() if digits else '0')\n" +" if places:\n" +" build(dp)\n" +" if not digits:\n" +" build('0')\n" +" i = 0\n" +" while digits:\n" +" build(next())\n" +" i += 1\n" +" if i == 3 and digits:\n" +" i = 0\n" +" build(sep)\n" +" build(curr)\n" +" build(neg if sign else pos)\n" +" return ''.join(reversed(result))\n" +"\n" +"def pi():\n" +" \"\"\"Compute Pi to the current precision.\n" +"\n" +" >>> print(pi())\n" +" 3.141592653589793238462643383\n" +"\n" +" \"\"\"\n" +" getcontext().prec += 2 # extra digits for intermediate steps\n" +" three = Decimal(3) # substitute \"three=3.0\" for regular floats\n" +" lasts, t, s, n, na, d, da = 0, three, 3, 1, 0, 0, 24\n" +" while s != lasts:\n" +" lasts = s\n" +" n, na = n+na, na+8\n" +" d, da = d+da, da+32\n" +" t = (t * n) / d\n" +" s += t\n" +" getcontext().prec -= 2\n" +" return +s # unary plus applies the new precision\n" +"\n" +"def exp(x):\n" +" \"\"\"Return e raised to the power of x. Result type matches input type.\n" +"\n" +" >>> print(exp(Decimal(1)))\n" +" 2.718281828459045235360287471\n" +" >>> print(exp(Decimal(2)))\n" +" 7.389056098930650227230427461\n" +" >>> print(exp(2.0))\n" +" 7.38905609893\n" +" >>> print(exp(2+0j))\n" +" (7.38905609893+0j)\n" +"\n" +" \"\"\"\n" +" getcontext().prec += 2\n" +" i, lasts, s, fact, num = 0, 0, 1, 1, 1\n" +" while s != lasts:\n" +" lasts = s\n" +" i += 1\n" +" fact *= i\n" +" num *= x\n" +" s += num / fact\n" +" getcontext().prec -= 2\n" +" return +s\n" +"\n" +"def cos(x):\n" +" \"\"\"Return the cosine of x as measured in radians.\n" +"\n" +" The Taylor series approximation works best for a small value of x.\n" +" For larger values, first compute x = x % (2 * pi).\n" +"\n" +" >>> print(cos(Decimal('0.5')))\n" +" 0.8775825618903727161162815826\n" +" >>> print(cos(0.5))\n" +" 0.87758256189\n" +" >>> print(cos(0.5+0j))\n" +" (0.87758256189+0j)\n" +"\n" +" \"\"\"\n" +" getcontext().prec += 2\n" +" i, lasts, s, fact, num, sign = 0, 0, 1, 1, 1, 1\n" +" while s != lasts:\n" +" lasts = s\n" +" i += 2\n" +" fact *= i * (i-1)\n" +" num *= x * x\n" +" sign *= -1\n" +" s += num / fact * sign\n" +" getcontext().prec -= 2\n" +" return +s\n" +"\n" +"def sin(x):\n" +" \"\"\"Return the sine of x as measured in radians.\n" +"\n" +" The Taylor series approximation works best for a small value of x.\n" +" For larger values, first compute x = x % (2 * pi).\n" +"\n" +" >>> print(sin(Decimal('0.5')))\n" +" 0.4794255386042030002732879352\n" +" >>> print(sin(0.5))\n" +" 0.479425538604\n" +" >>> print(sin(0.5+0j))\n" +" (0.479425538604+0j)\n" +"\n" +" \"\"\"\n" +" getcontext().prec += 2\n" +" i, lasts, s, fact, num, sign = 1, 0, x, 1, x, 1\n" +" while s != lasts:\n" +" lasts = s\n" +" i += 2\n" +" fact *= i * (i-1)\n" +" num *= x * x\n" +" sign *= -1\n" +" s += num / fact * sign\n" +" getcontext().prec -= 2\n" +" return +s" +msgstr "" +"def moneyfmt(value, places=2, curr='', sep=',', dp='.',\n" +" pos='', neg='-', trailneg=''):\n" +" \"\"\"将 Decimal 值转换为以货币形式格式化的字符串。\n" +"\n" +" places: 小数点之后要保留的位数\n" +" curr: 正负号之前可选的货币符号 (可以为空)\n" +" sep: 可选的千位分隔符 (逗点,句点,空格或为空)\n" +" dp: 小数点符号 (逗点或句点)\n" +" 仅在保留零位小数时设为空\n" +" pos: 可选的正值符号:'+', 空格或为空\n" +" neg: 可选的负值符号:'-', '(', 空格或为空\n" +" trailneg:可选的末尾负值符号: '-', ')', 空格或为空\n" +"\n" +" >>> d = Decimal('-1234567.8901')\n" +" >>> moneyfmt(d, curr='$')\n" +" '-$1,234,567.89'\n" +" >>> moneyfmt(d, places=0, sep='.', dp='', neg='', trailneg='-')\n" +" '1.234.568-'\n" +" >>> moneyfmt(d, curr='$', neg='(', trailneg=')')\n" +" '($1,234,567.89)'\n" +" >>> moneyfmt(Decimal(123456789), sep=' ')\n" +" '123 456 789.00'\n" +" >>> moneyfmt(Decimal('-0.02'), neg='<', trailneg='>')\n" +" '<0.02>'\n" +"\n" +" \"\"\"\n" +" q = Decimal(10) ** -places # 2 个小数位 --> '0.01'\n" +" sign, digits, exp = value.quantize(q).as_tuple()\n" +" result = []\n" +" digits = list(map(str, digits))\n" +" build, next = result.append, digits.pop\n" +" if sign:\n" +" build(trailneg)\n" +" for i in range(places):\n" +" build(next() if digits else '0')\n" +" if places:\n" +" build(dp)\n" +" if not digits:\n" +" build('0')\n" +" i = 0\n" +" while digits:\n" +" build(next())\n" +" i += 1\n" +" if i == 3 and digits:\n" +" i = 0\n" +" build(sep)\n" +" build(curr)\n" +" build(neg if sign else pos)\n" +" return ''.join(reversed(result))\n" +"\n" +"def pi():\n" +" \"\"\"计算 Pi 到当前精度。\n" +"\n" +" >>> print(pi())\n" +" 3.141592653589793238462643383\n" +"\n" +" \"\"\"\n" +" getcontext().prec += 2 # 用于中间步骤的额外位数\n" +" three = Decimal(3) # 替换常规浮点数的 \"three=3.0\"\n" +" lasts, t, s, n, na, d, da = 0, three, 3, 1, 0, 0, 24\n" +" while s != lasts:\n" +" lasts = s\n" +" n, na = n+na, na+8\n" +" d, da = d+da, da+32\n" +" t = (t * n) / d\n" +" s += t\n" +" getcontext().prec -= 2\n" +" return +s # 单目取正值运算将应用新的精度\n" +"\n" +"def exp(x):\n" +" \"\"\"返回 e 的 x 次方。 结果类型将与输入类型相匹配。\n" +"\n" +" >>> print(exp(Decimal(1)))\n" +" 2.718281828459045235360287471\n" +" >>> print(exp(Decimal(2)))\n" +" 7.389056098930650227230427461\n" +" >>> print(exp(2.0))\n" +" 7.38905609893\n" +" >>> print(exp(2+0j))\n" +" (7.38905609893+0j)\n" +"\n" +" \"\"\"\n" +" getcontext().prec += 2\n" +" i, lasts, s, fact, num = 0, 0, 1, 1, 1\n" +" while s != lasts:\n" +" lasts = s\n" +" i += 1\n" +" fact *= i\n" +" num *= x\n" +" s += num / fact\n" +" getcontext().prec -= 2\n" +" return +s\n" +"\n" +"def cos(x):\n" +" \"\"\"返回以弧度衡量的 x 的余弦。\n" +"\n" +" 泰勒级数近似算法对较小的 x 值效果最好。\n" +" 对于较大的值,则先计算 x = x % (2 * pi)。\n" +"\n" +" >>> print(cos(Decimal('0.5')))\n" +" 0.8775825618903727161162815826\n" +" >>> print(cos(0.5))\n" +" 0.87758256189\n" +" >>> print(cos(0.5+0j))\n" +" (0.87758256189+0j)\n" +"\n" +" \"\"\"\n" +" getcontext().prec += 2\n" +" i, lasts, s, fact, num, sign = 0, 0, 1, 1, 1, 1\n" +" while s != lasts:\n" +" lasts = s\n" +" i += 2\n" +" fact *= i * (i-1)\n" +" num *= x * x\n" +" sign *= -1\n" +" s += num / fact * sign\n" +" getcontext().prec -= 2\n" +" return +s\n" +"\n" +"def sin(x):\n" +" \"\"\"返回以弧度衡量的 x 的正弦。\n" +"\n" +" 泰勒级数近似算法对较小的 x 值效果最好。\n" +" 对于较大的值,则先计算 x = x % (2 * pi)。\n" +"\n" +" >>> print(sin(Decimal('0.5')))\n" +" 0.4794255386042030002732879352\n" +" >>> print(sin(0.5))\n" +" 0.479425538604\n" +" >>> print(sin(0.5+0j))\n" +" (0.479425538604+0j)\n" +"\n" +" \"\"\"\n" +" getcontext().prec += 2\n" +" i, lasts, s, fact, num, sign = 1, 0, x, 1, x, 1\n" +" while s != lasts:\n" +" lasts = s\n" +" i += 2\n" +" fact *= i * (i-1)\n" +" num *= x * x\n" +" sign *= -1\n" +" s += num / fact * sign\n" +" getcontext().prec -= 2\n" +" return +s" + +#: ../../library/decimal.rst:2124 +msgid "Decimal FAQ" +msgstr "Decimal 常见问题" + +#: ../../library/decimal.rst:2126 +msgid "" +"Q: It is cumbersome to type ``decimal.Decimal('1234.5')``. Is there a way " +"to minimize typing when using the interactive interpreter?" +msgstr "Q: 输入 ``decimal.Decimal('1234.5')`` 有点笨拙。在使用交互式解释器时有没有最小化输入负担的方式?" + +#: ../../library/decimal.rst:2129 +msgid "A: Some users abbreviate the constructor to just a single letter:" +msgstr "A: 有些用户会将构造器简写为单个字母:" + +#: ../../library/decimal.rst:2135 +msgid "" +"Q: In a fixed-point application with two decimal places, some inputs have " +"many places and need to be rounded. Others are not supposed to have excess " +"digits and need to be validated. What methods should be used?" +msgstr "" +"Q: 在带有两个十进制位的定点数应用中,有些输入值具有许多位需要被舍入。另一些数则不应具有多余的位并需要验证有效性。这种情况应该使用什么方法?" + +#: ../../library/decimal.rst:2139 +msgid "" +"A: The :meth:`~Decimal.quantize` method rounds to a fixed number of decimal " +"places. If the :const:`Inexact` trap is set, it is also useful for " +"validation:" +msgstr "" +"A: 用 :meth:`~Decimal.quantize` 方法舍入到固定数目的十进制位。如果设置了 :const:`Inexact` " +"陷阱,它也适用于验证有效性:" + +#: ../../library/decimal.rst:2157 +msgid "" +"Q: Once I have valid two place inputs, how do I maintain that invariant " +"throughout an application?" +msgstr "Q: 当有使用带两个有效位的输入时,我要如何在一个应用中保持有效位不变?" + +#: ../../library/decimal.rst:2160 +msgid "" +"A: Some operations like addition, subtraction, and multiplication by an " +"integer will automatically preserve fixed point. Others operations, like " +"division and non-integer multiplication, will change the number of decimal " +"places and need to be followed-up with a :meth:`~Decimal.quantize` step:" +msgstr "" +"A: 某些运算如与整数相加、相减和相乘会自动保留固定的数位。其他运算,如相除和非整数相乘则会改变小数位数因而需要加一个 " +":meth:`~Decimal.quantize` 处理步骤:" + +#: ../../library/decimal.rst:2178 +msgid "" +"In developing fixed-point applications, it is convenient to define functions" +" to handle the :meth:`~Decimal.quantize` step:" +msgstr "在开发定点数应用时,更方便的做法是定义处理 :meth:`~Decimal.quantize` 步骤的函数:" + +#: ../../library/decimal.rst:2192 +msgid "" +"Q: There are many ways to express the same value. The numbers ``200``, " +"``200.000``, ``2E2``, and ``.02E+4`` all have the same value at various " +"precisions. Is there a way to transform them to a single recognizable " +"canonical value?" +msgstr "" +"Q: 有许多不同方式来表示同一个值。数字 ``200``, ``200.000``, ``2E2`` 和 ``.02E+4`` " +"所具有相同的值但其精度不同。是否有办法将它们转换为一个可识别的规范值?" + +#: ../../library/decimal.rst:2197 +msgid "" +"A: The :meth:`~Decimal.normalize` method maps all equivalent values to a " +"single representative:" +msgstr "A: :meth:`~Decimal.normalize` 方法可将所有相等的值映射为单一表示形式:" + +#: ../../library/decimal.rst:2204 +msgid "Q: When does rounding occur in a computation?" +msgstr "Q: 计算中的舍入是在什么时候发生的?" + +#: ../../library/decimal.rst:2206 +msgid "" +"A: It occurs *after* the computation. The philosophy of the decimal " +"specification is that numbers are considered exact and are created " +"independent of the current context. They can even have greater precision " +"than current context. Computations process with those exact inputs and then" +" rounding (or other context operations) is applied to the *result* of the " +"computation::" +msgstr "" +"A: 舍入是在计算 *之后* 发生的。decimal 的设计规范认为数字应当被视为是精确的并且是独立于当前上下文而创建的。 " +"它们甚至可以具有比当前上下文更高的精确度。计算过程将使用精确的输入然后再对计算的 *结果* 应用舍入(或其他上下文操作)::" + +#: ../../library/decimal.rst:2213 +msgid "" +">>> getcontext().prec = 5\n" +">>> pi = Decimal('3.1415926535') # More than 5 digits\n" +">>> pi # All digits are retained\n" +"Decimal('3.1415926535')\n" +">>> pi + 0 # Rounded after an addition\n" +"Decimal('3.1416')\n" +">>> pi - Decimal('0.00005') # Subtract unrounded numbers, then round\n" +"Decimal('3.1415')\n" +">>> pi + 0 - Decimal('0.00005'). # Intermediate values are rounded\n" +"Decimal('3.1416')" +msgstr "" +">>> getcontext().prec = 5\n" +">>> pi = Decimal('3.1415926535') # 超过 5 个数位\n" +">>> pi # 所有数位都将保留\n" +"Decimal('3.1415926535')\n" +">>> pi + 0 # 加法运算后将执行舍入\n" +"Decimal('3.1416')\n" +">>> pi - Decimal('0.00005') # 减去未舍入的数值,然后执行舍入\n" +"Decimal('3.1415')\n" +">>> pi + 0 - Decimal('0.00005'). # 中间值将执行舍入\n" +"Decimal('3.1416')" + +#: ../../library/decimal.rst:2224 +msgid "" +"Q: Some decimal values always print with exponential notation. Is there a " +"way to get a non-exponential representation?" +msgstr "Q: 有些十进制值总是以指数表示法打印。是否有办法得到一个非指数表示形式?" + +#: ../../library/decimal.rst:2227 +msgid "" +"A: For some values, exponential notation is the only way to express the " +"number of significant places in the coefficient. For example, expressing " +"``5.0E+3`` as ``5000`` keeps the value constant but cannot show the " +"original's two-place significance." +msgstr "" +"A: 对某些值来说,指数表示法是表示系数中有效位的唯一方式。例如,将 ``5.0E+3`` 表示为 ``5000`` " +"可让值保持恒定但是无法显示原本的两位有效位。" + +#: ../../library/decimal.rst:2232 +msgid "" +"If an application does not care about tracking significance, it is easy to " +"remove the exponent and trailing zeroes, losing significance, but keeping " +"the value unchanged:" +msgstr "如果一个应用不必关心追踪有效位,则可以很容易地移除指数和末尾的零,丢弃有效位但让值保持不变:" + +#: ../../library/decimal.rst:2242 +msgid "Q: Is there a way to convert a regular float to a :class:`Decimal`?" +msgstr "Q: 是否有办法将一个常规浮点数转换为 :class:`Decimal`?" + +#: ../../library/decimal.rst:2244 +msgid "" +"A: Yes, any binary floating-point number can be exactly expressed as a " +"Decimal though an exact conversion may take more precision than intuition " +"would suggest:" +msgstr "A: 是的,任何二进制浮点数都可被精确表示为 Decimal 不过精确的转换可能需要比直观感觉更高的精度:" + +#: ../../library/decimal.rst:2248 +msgid "" +">>> Decimal(math.pi)\n" +"Decimal('3.141592653589793115997963468544185161590576171875')" +msgstr "" +">>> Decimal(math.pi)\n" +"Decimal('3.141592653589793115997963468544185161590576171875')" + +#: ../../library/decimal.rst:2253 +msgid "" +"Q: Within a complex calculation, how can I make sure that I haven't gotten a" +" spurious result because of insufficient precision or rounding anomalies." +msgstr "Q: 在一个复杂的计算中,我怎样才能确保不会得到由于精度不足或舍入异常导致的虚假结果。" + +#: ../../library/decimal.rst:2256 +msgid "" +"A: The decimal module makes it easy to test results. A best practice is to " +"re-run calculations using greater precision and with various rounding modes." +" Widely differing results indicate insufficient precision, rounding mode " +"issues, ill-conditioned inputs, or a numerically unstable algorithm." +msgstr "" +"A: 使用 decimal 模块可以很容易地检测结果。最佳实践是使用更高的精度和不同的舍入模式重新进行计算。 " +"明显不同的结果表明存在精度不足、舍入模式问题、不符合条件的输入或者数值不稳定的算法。" + +#: ../../library/decimal.rst:2261 +msgid "" +"Q: I noticed that context precision is applied to the results of operations " +"but not to the inputs. Is there anything to watch out for when mixing " +"values of different precisions?" +msgstr "Q: 我发现上下文精度的应用只针对运算结果而不针对输入。在混合使用不同精度的值时有什么需要注意的吗?" + +#: ../../library/decimal.rst:2265 +msgid "" +"A: Yes. The principle is that all values are considered to be exact and so " +"is the arithmetic on those values. Only the results are rounded. The " +"advantage for inputs is that \"what you type is what you get\". A " +"disadvantage is that the results can look odd if you forget that the inputs " +"haven't been rounded:" +msgstr "" +"A: 是的。原则上所有值都会被视为是精确的而在这些值是进行的算术运算也是如此。只有结果会被舍入。对于输入来说其好处是“所输入即所得”。 " +"而其缺点则是如果你忘记了输入并未被舍入那么结果看起来可能会有点奇怪:" + +#: ../../library/decimal.rst:2270 +msgid "" +">>> getcontext().prec = 3\n" +">>> Decimal('3.104') + Decimal('2.104')\n" +"Decimal('5.21')\n" +">>> Decimal('3.104') + Decimal('0.000') + Decimal('2.104')\n" +"Decimal('5.20')" +msgstr "" +">>> getcontext().prec = 3\n" +">>> Decimal('3.104') + Decimal('2.104')\n" +"Decimal('5.21')\n" +">>> Decimal('3.104') + Decimal('0.000') + Decimal('2.104')\n" +"Decimal('5.20')" + +#: ../../library/decimal.rst:2278 +msgid "" +"The solution is either to increase precision or to force rounding of inputs " +"using the unary plus operation:" +msgstr "解决办法是提高精度或使用单目加法运算对输入执行强制舍入:" + +#: ../../library/decimal.rst:2281 +msgid "" +">>> getcontext().prec = 3\n" +">>> +Decimal('1.23456789') # unary plus triggers rounding\n" +"Decimal('1.23')" +msgstr "" +">>> getcontext().prec = 3\n" +">>> +Decimal('1.23456789') # 单目取正运算符将触发舍入\n" +"Decimal('1.23')" + +#: ../../library/decimal.rst:2287 +msgid "" +"Alternatively, inputs can be rounded upon creation using the " +":meth:`Context.create_decimal` method:" +msgstr "此外,还可以使用 :meth:`Context.create_decimal` 方法在创建输入时执行舍入:" + +#: ../../library/decimal.rst:2293 +msgid "Q: Is the CPython implementation fast for large numbers?" +msgstr "Q: CPython 实现对于超大数字来说是否足够快速?" + +#: ../../library/decimal.rst:2295 +msgid "" +"A: Yes. In the CPython and PyPy3 implementations, the C/CFFI versions of " +"the decimal module integrate the high speed `libmpdec " +"`_ library for " +"arbitrary precision correctly rounded decimal floating-point arithmetic " +"[#]_. ``libmpdec`` uses `Karatsuba multiplication " +"`_ for medium-sized " +"numbers and the `Number Theoretic Transform " +"`_ for very large numbers." +msgstr "" +"A: 是的。在 CPython 和 PyPy3 实现中,decimal 模块的 C/CFFI 版本集成了高速的 `libmpdec " +"`_ " +"库用于实现任意精度正确舍入的十进制浮点算术 [#]_。``libmpdec`` 会对中等大小的数字使用 `Karatsuba 乘法 " +"`_ 而对非常巨大的数字使用 `数字原理变换 " +"`_." + +#: ../../library/decimal.rst:2305 +msgid "" +"The context must be adapted for exact arbitrary precision arithmetic. " +":attr:`~Context.Emin` and :attr:`~Context.Emax` should always be set to the " +"maximum values, :attr:`~Context.clamp` should always be 0 (the default). " +"Setting :attr:`~Context.prec` requires some care." +msgstr "" +"上下文必须针对任意精度算术进行适配。 :attr:`~Context.Emin` 和 :attr:`~Context.Emax` " +"应当总是被设为最大值,:attr:`~Context.clamp` 应当总是为 0(默认值)。设置 :attr:`~Context.prec` " +"需要十分谨慎。" + +#: ../../library/decimal.rst:2309 +msgid "" +"The easiest approach for trying out bignum arithmetic is to use the maximum " +"value for :attr:`~Context.prec` as well [#]_::" +msgstr "进行大数字算术的最便捷方式同样是使用 :attr:`~Context.prec` 的最大值 [#]_::" + +#: ../../library/decimal.rst:2312 +msgid "" +">>> setcontext(Context(prec=MAX_PREC, Emax=MAX_EMAX, Emin=MIN_EMIN))\n" +">>> x = Decimal(2) ** 256\n" +">>> x / 128\n" +"Decimal('904625697166532776746648320380374280103671755200316906558262375061821325312')" +msgstr "" +">>> setcontext(Context(prec=MAX_PREC, Emax=MAX_EMAX, Emin=MIN_EMIN))\n" +">>> x = Decimal(2) ** 256\n" +">>> x / 128\n" +"Decimal('904625697166532776746648320380374280103671755200316906558262375061821325312')" + +#: ../../library/decimal.rst:2318 +msgid "" +"For inexact results, :const:`MAX_PREC` is far too large on 64-bit platforms " +"and the available memory will be insufficient::" +msgstr "对于不精确的结果,在 64 位平台上 :const:`MAX_PREC` 的值太大因而会导致可用内存不足::" + +#: ../../library/decimal.rst:2321 +msgid "" +">>> Decimal(1) / 3\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"MemoryError" +msgstr "" +">>> Decimal(1) / 3\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"MemoryError" + +#: ../../library/decimal.rst:2326 +msgid "" +"On systems with overallocation (e.g. Linux), a more sophisticated approach " +"is to adjust :attr:`~Context.prec` to the amount of available RAM. Suppose " +"that you have 8GB of RAM and expect 10 simultaneous operands using a maximum" +" of 500MB each::" +msgstr "" +"在具有超量分配的系统上(如 Linux),一种更复杂的方式是根据可用的 RAM 大小来调整 :attr:`~Context.prec`。假设你有 8GB" +" 的 RAM 并期望同时有 10 个操作数,每个最多使用 500MB::" + +#: ../../library/decimal.rst:2330 +msgid "" +">>> import sys\n" +">>>\n" +">>> # Maximum number of digits for a single operand using 500MB in 8-byte words\n" +">>> # with 19 digits per word (4-byte and 9 digits for the 32-bit build):\n" +">>> maxdigits = 19 * ((500 * 1024**2) // 8)\n" +">>>\n" +">>> # Check that this works:\n" +">>> c = Context(prec=maxdigits, Emax=MAX_EMAX, Emin=MIN_EMIN)\n" +">>> c.traps[Inexact] = True\n" +">>> setcontext(c)\n" +">>>\n" +">>> # Fill the available precision with nines:\n" +">>> x = Decimal(0).logical_invert() * 9\n" +">>> sys.getsizeof(x)\n" +"524288112\n" +">>> x + 2\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +" decimal.Inexact: []" +msgstr "" +">>> import sys\n" +">>>\n" +">>> # 字长 8 字节使用 500MB 的单个操作数的最大位数\n" +">>> # 每字 19 个数位(32 位构建版则为字长 4 字节每字 9 个数位):\n" +">>> maxdigits = 19 * ((500 * 1024**2) // 8)\n" +">>>\n" +">>> # 检测此代码有效。\n" +">>> c = Context(prec=maxdigits, Emax=MAX_EMAX, Emin=MIN_EMIN)\n" +">>> c.traps[Inexact] = True\n" +">>> setcontext(c)\n" +">>>\n" +">>> # 以数字九填满可用的精度:\n" +">>> x = Decimal(0).logical_invert() * 9\n" +">>> sys.getsizeof(x)\n" +"524288112\n" +">>> x + 2\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +" decimal.Inexact: []" + +#: ../../library/decimal.rst:2350 +msgid "" +"In general (and especially on systems without overallocation), it is " +"recommended to estimate even tighter bounds and set the :attr:`Inexact` trap" +" if all calculations are expected to be exact." +msgstr "总体而言(特别是在没有超量分配的系统上),如果期望所有计算都是精确的则推荐预估更严格的边界并设置 :attr:`Inexact` 陷阱。" + +#: ../../library/decimal.rst:2359 +msgid "" +"This approach now works for all exact results except for non-integer powers." +msgstr "此方式现在适用于除了非整数乘方以外的所有精确结果。" diff --git a/library/development.po b/library/development.po new file mode 100644 index 0000000000..7f372dbf2c --- /dev/null +++ b/library/development.po @@ -0,0 +1,41 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/development.rst:5 +msgid "Development Tools" +msgstr "开发工具" + +#: ../../library/development.rst:7 +msgid "" +"The modules described in this chapter help you write software. For example," +" the :mod:`pydoc` module takes a module and generates documentation based on" +" the module's contents. The :mod:`doctest` and :mod:`unittest` modules " +"contains frameworks for writing unit tests that automatically exercise code " +"and verify that the expected output is produced." +msgstr "" +"本章中介绍的模块可帮助你编写软件。例如,:mod:`pydoc` 模块接受一个模块并根据该模块的内容来生成文档。 :mod:`doctest` 和 " +":mod:`unittest` 模块包含用于编写自动执行代码并验证是否产生预期的输出的单元测试的框架。" + +#: ../../library/development.rst:13 +msgid "The list of modules described in this chapter is:" +msgstr "本章中描述的模块列表是:" diff --git a/library/devmode.po b/library/devmode.po new file mode 100644 index 0000000000..85e34b01a3 --- /dev/null +++ b/library/devmode.po @@ -0,0 +1,470 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/devmode.rst:4 +msgid "Python Development Mode" +msgstr "Python 开发模式" + +#: ../../library/devmode.rst:8 +msgid "" +"The Python Development Mode introduces additional runtime checks that are " +"too expensive to be enabled by default. It should not be more verbose than " +"the default if the code is correct; new warnings are only emitted when an " +"issue is detected." +msgstr "" +"Python " +"开发模式引入了额外的运行时检查,由于开销太大,并非默认启用的。如果代码是正确的,它不会比默认模式产生更多输出;仅当检测到问题时才会发出新的警告。" + +#: ../../library/devmode.rst:13 +msgid "" +"It can be enabled using the :option:`-X dev <-X>` command line option or by " +"setting the :envvar:`PYTHONDEVMODE` environment variable to ``1``." +msgstr "" +"使用 :option:`-X dev <-X>` 命令行参数或将环境变量 :envvar:`PYTHONDEVMODE` 置为 ``1`` " +",可以启用开发模式。" + +#: ../../library/devmode.rst:16 +msgid "See also :ref:`Python debug build `." +msgstr "另请参考 :ref:`Python debug build `。" + +#: ../../library/devmode.rst:19 +msgid "Effects of the Python Development Mode" +msgstr "Python 开发模式的效果" + +#: ../../library/devmode.rst:21 +msgid "" +"Enabling the Python Development Mode is similar to the following command, " +"but with additional effects described below::" +msgstr "启用 Python 开发模式后的效果,与以下命令类似,不过还有下面的额外效果:" + +#: ../../library/devmode.rst:24 +msgid "" +"PYTHONMALLOC=debug PYTHONASYNCIODEBUG=1 python -W default -X faulthandler" +msgstr "" +"PYTHONMALLOC=debug PYTHONASYNCIODEBUG=1 python -W default -X faulthandler" + +#: ../../library/devmode.rst:26 +msgid "Effects of the Python Development Mode:" +msgstr "Python 开发模式的效果:" + +#: ../../library/devmode.rst:28 +msgid "" +"Add ``default`` :ref:`warning filter `. The " +"following warnings are shown:" +msgstr "" +"加入 ``default`` :ref:`warning filter ` " +"。下述警告信息将会显示出来:" + +#: ../../library/devmode.rst:31 +msgid ":exc:`DeprecationWarning`" +msgstr ":exc:`DeprecationWarning`" + +#: ../../library/devmode.rst:32 +msgid ":exc:`ImportWarning`" +msgstr ":exc:`ImportWarning`" + +#: ../../library/devmode.rst:33 +msgid ":exc:`PendingDeprecationWarning`" +msgstr ":exc:`PendingDeprecationWarning`" + +#: ../../library/devmode.rst:34 +msgid ":exc:`ResourceWarning`" +msgstr ":exc:`ResourceWarning`" + +#: ../../library/devmode.rst:36 +msgid "" +"Normally, the above warnings are filtered by the default :ref:`warning " +"filters `." +msgstr "" +"通常上述警告是由默认的 :ref:`warning filters ` 负责处理的。" + +#: ../../library/devmode.rst:39 +msgid "" +"It behaves as if the :option:`-W default <-W>` command line option is used." +msgstr "效果类似于采用了 :option:`-W default <-W>` 命令行参数。" + +#: ../../library/devmode.rst:41 +msgid "" +"Use the :option:`-W error <-W>` command line option or set the " +":envvar:`PYTHONWARNINGS` environment variable to ``error`` to treat warnings" +" as errors." +msgstr "" +"使用命令行参数 :option:`-W error <-W>` 或将环境变量 :envvar:`PYTHONWARNINGS` 设为 " +"``error``,可将警告视为错误。" + +#: ../../library/devmode.rst:45 +msgid "Install debug hooks on memory allocators to check for:" +msgstr "在内存分配程序中安装调试钩子,用以检查:" + +#: ../../library/devmode.rst:47 +msgid "Buffer underflow" +msgstr "缓冲区下溢" + +#: ../../library/devmode.rst:48 +msgid "Buffer overflow" +msgstr "缓冲区上溢" + +#: ../../library/devmode.rst:49 +msgid "Memory allocator API violation" +msgstr "内存分配 API 违规" + +#: ../../library/devmode.rst:50 +msgid "Unsafe usage of the GIL" +msgstr "不安全的 GIL 使用" + +#: ../../library/devmode.rst:52 +msgid "See the :c:func:`PyMem_SetupDebugHooks` C function." +msgstr "参见 C 函数 :c:func:`PyMem_SetupDebugHooks`。" + +#: ../../library/devmode.rst:54 +msgid "" +"It behaves as if the :envvar:`PYTHONMALLOC` environment variable is set to " +"``debug``." +msgstr "效果如同将环境变量 :envvar:`PYTHONMALLOC` 设为 ``debug``。" + +#: ../../library/devmode.rst:57 +msgid "" +"To enable the Python Development Mode without installing debug hooks on " +"memory allocators, set the :envvar:`PYTHONMALLOC` environment variable to " +"``default``." +msgstr "" +"若要启用 Python 开发模式,却又不要在内存分配程序中安装调试钩子,请将 环境变量 :envvar:`PYTHONMALLOC` 设为 " +"``default``." + +#: ../../library/devmode.rst:61 +msgid "" +"Call :func:`faulthandler.enable` at Python startup to install handlers for " +"the :const:`~signal.SIGSEGV`, :const:`~signal.SIGFPE`, " +":const:`~signal.SIGABRT`, :const:`~signal.SIGBUS` and " +":const:`~signal.SIGILL` signals to dump the Python traceback on a crash." +msgstr "" +"在 Python 启动时调用 :func:`faulthandler.enable` 来为 :const:`~signal.SIGSEGV`, " +":const:`~signal.SIGFPE`, :const:`~signal.SIGABRT`, :const:`~signal.SIGBUS` 和" +" :const:`~signal.SIGILL` 信号安装处理器以便在程序崩溃时转储 Python 回溯信息。" + +#: ../../library/devmode.rst:66 +msgid "" +"It behaves as if the :option:`-X faulthandler <-X>` command line option is " +"used or if the :envvar:`PYTHONFAULTHANDLER` environment variable is set to " +"``1``." +msgstr "" +"其行为如同使用了 :option:`-X faulthandler <-X>` 命令行选项或将 :envvar:`PYTHONFAULTHANDLER`" +" 环境变量设为 ``1``。" + +#: ../../library/devmode.rst:70 +msgid "" +"Enable :ref:`asyncio debug mode `. For example, " +":mod:`asyncio` checks for coroutines that were not awaited and logs them." +msgstr "" +"启用 :ref:`asyncio debug mode `。比如 :mod:`asyncio` " +"会检查没有等待的协程并记录下来。" + +#: ../../library/devmode.rst:73 +msgid "" +"It behaves as if the :envvar:`PYTHONASYNCIODEBUG` environment variable is " +"set to ``1``." +msgstr "效果如同将环境变量 :envvar:`PYTHONASYNCIODEBUG` 设为 ``1``。" + +#: ../../library/devmode.rst:76 +msgid "" +"Check the *encoding* and *errors* arguments for string encoding and decoding" +" operations. Examples: :func:`open`, :meth:`str.encode` and " +":meth:`bytes.decode`." +msgstr "" +"检查字符串编码和解码函数的 *encoding* 和 *errors* 参数。例如: :func:`open`、 :meth:`str.encode` " +"和 :meth:`bytes.decode`。" + +#: ../../library/devmode.rst:80 +msgid "" +"By default, for best performance, the *errors* argument is only checked at " +"the first encoding/decoding error and the *encoding* argument is sometimes " +"ignored for empty strings." +msgstr "为了获得最佳性能,默认只会在第一次编码/解码错误时才会检查 *errors* 参数,有时对于空字符串还会忽略 *encoding* 参数。" + +#: ../../library/devmode.rst:84 +msgid "The :class:`io.IOBase` destructor logs ``close()`` exceptions." +msgstr ":class:`io.IOBase` 的析构函数会记录 ``close()`` 触发的异常。" + +#: ../../library/devmode.rst:85 +msgid "" +"Set the :attr:`~sys.flags.dev_mode` attribute of :data:`sys.flags` to " +"``True``." +msgstr "将 :data:`sys.flags` 的 :attr:`~sys.flags.dev_mode` 属性设为 ``True``。" + +#: ../../library/devmode.rst:88 +msgid "" +"The Python Development Mode does not enable the :mod:`tracemalloc` module by" +" default, because the overhead cost (to performance and memory) would be too" +" large. Enabling the :mod:`tracemalloc` module provides additional " +"information on the origin of some errors. For example, " +":exc:`ResourceWarning` logs the traceback where the resource was allocated, " +"and a buffer overflow error logs the traceback where the memory block was " +"allocated." +msgstr "" +"Python 开发模式下,默认不会启用 :mod:`tracemalloc` 模块,因为其性能和内存开销太大。启用 :mod:`tracemalloc`" +" 模块后,能够提供有关错误来源的一些额外信息。例如,:exc:`ResourceWarning` " +"记录了资源分配的跟踪信息,而缓冲区溢出错误记录了内存块分配的跟踪信息。" + +#: ../../library/devmode.rst:95 +msgid "" +"The Python Development Mode does not prevent the :option:`-O` command line " +"option from removing :keyword:`assert` statements nor from setting " +":const:`__debug__` to ``False``." +msgstr "" +"Python 开发模式不会阻止命令行参数 :option:`-O` 删除 :keyword:`assert` 语句,也不会阻止将 " +":const:`__debug__` 设为 ``False``。" + +#: ../../library/devmode.rst:99 +msgid "" +"The Python Development Mode can only be enabled at the Python startup. Its " +"value can be read from :data:`sys.flags.dev_mode `." +msgstr "" +"Python 开发模式只能在 Python 启动时启用。其值可从 :data:`sys.flags.dev_mode ` 读取。" + +#: ../../library/devmode.rst:102 +msgid "The :class:`io.IOBase` destructor now logs ``close()`` exceptions." +msgstr "现在, :class:`io.IOBase` 的析构函数会记录 ``close()`` 触发的异常。" + +#: ../../library/devmode.rst:105 +msgid "" +"The *encoding* and *errors* arguments are now checked for string encoding " +"and decoding operations." +msgstr "现在,字符串编码和解码操作时会检查 *encoding* 和 *errors* 参数。" + +#: ../../library/devmode.rst:111 +msgid "ResourceWarning Example" +msgstr "ResourceWarning 示例" + +#: ../../library/devmode.rst:113 +msgid "" +"Example of a script counting the number of lines of the text file specified " +"in the command line::" +msgstr "以下示例将统计由命令行指定的文本文件的行数:" + +#: ../../library/devmode.rst:116 +msgid "" +"import sys\n" +"\n" +"def main():\n" +" fp = open(sys.argv[1])\n" +" nlines = len(fp.readlines())\n" +" print(nlines)\n" +" # The file is closed implicitly\n" +"\n" +"if __name__ == \"__main__\":\n" +" main()" +msgstr "" +"import sys\n" +"\n" +"def main():\n" +" fp = open(sys.argv[1])\n" +" nlines = len(fp.readlines())\n" +" print(nlines)\n" +" # 文件将隐式地关闭\n" +"\n" +"if __name__ == \"__main__\":\n" +" main()" + +#: ../../library/devmode.rst:127 +msgid "" +"The script does not close the file explicitly. By default, Python does not " +"emit any warning. Example using README.txt, which has 269 lines:" +msgstr "上述代码没有显式关闭文件。默认情况下,Python 不会触发任何警告。下面用 README.txt 文件测试下,有 269 行:" + +#: ../../library/devmode.rst:130 +msgid "" +"$ python script.py README.txt\n" +"269" +msgstr "" +"$ python script.py README.txt\n" +"269" + +#: ../../library/devmode.rst:135 +msgid "" +"Enabling the Python Development Mode displays a :exc:`ResourceWarning` " +"warning:" +msgstr "启用 Python 开发模式后,则会显示一条 :exc:`ResourceWarning` 警告:" + +#: ../../library/devmode.rst:137 +msgid "" +"$ python -X dev script.py README.txt\n" +"269\n" +"script.py:10: ResourceWarning: unclosed file <_io.TextIOWrapper name='README.rst' mode='r' encoding='UTF-8'>\n" +" main()\n" +"ResourceWarning: Enable tracemalloc to get the object allocation traceback" +msgstr "" +"$ python -X dev script.py README.txt\n" +"269\n" +"script.py:10: ResourceWarning: unclosed file <_io.TextIOWrapper name='README.rst' mode='r' encoding='UTF-8'>\n" +" main()\n" +"ResourceWarning: Enable tracemalloc to get the object allocation traceback" + +#: ../../library/devmode.rst:145 +msgid "" +"In addition, enabling :mod:`tracemalloc` shows the line where the file was " +"opened:" +msgstr "启用 :mod:`tracemalloc` 后,则还会显示打开文件的那行代码:" + +#: ../../library/devmode.rst:148 +msgid "" +"$ python -X dev -X tracemalloc=5 script.py README.rst\n" +"269\n" +"script.py:10: ResourceWarning: unclosed file <_io.TextIOWrapper name='README.rst' mode='r' encoding='UTF-8'>\n" +" main()\n" +"Object allocated at (most recent call last):\n" +" File \"script.py\", lineno 10\n" +" main()\n" +" File \"script.py\", lineno 4\n" +" fp = open(sys.argv[1])" +msgstr "" +"$ python -X dev -X tracemalloc=5 script.py README.rst\n" +"269\n" +"script.py:10: ResourceWarning: unclosed file <_io.TextIOWrapper name='README.rst' mode='r' encoding='UTF-8'>\n" +" main()\n" +"Object allocated at (most recent call last):\n" +" File \"script.py\", lineno 10\n" +" main()\n" +" File \"script.py\", lineno 4\n" +" fp = open(sys.argv[1])" + +#: ../../library/devmode.rst:160 +msgid "" +"The fix is to close explicitly the file. Example using a context manager::" +msgstr "修正方案就是显式关闭文件。下面用上下文管理器作为示例:" + +#: ../../library/devmode.rst:162 +msgid "" +"def main():\n" +" # Close the file explicitly when exiting the with block\n" +" with open(sys.argv[1]) as fp:\n" +" nlines = len(fp.readlines())\n" +" print(nlines)" +msgstr "" +"def main():\n" +" # 在退出 with 语句块时显式地关闭文件\n" +" with open(sys.argv[1]) as fp:\n" +" nlines = len(fp.readlines())\n" +" print(nlines)" + +#: ../../library/devmode.rst:168 +msgid "" +"Not closing a resource explicitly can leave a resource open for way longer " +"than expected; it can cause severe issues upon exiting Python. It is bad in " +"CPython, but it is even worse in PyPy. Closing resources explicitly makes an" +" application more deterministic and more reliable." +msgstr "" +"未能显式关闭资源,会让资源打开时长远超预期;在退出 Python 时可能会导致严重问题。这在 CPython 中比较糟糕,但在 PyPy " +"中会更糟。显式关闭资源能让应用程序更加稳定可靠。" + +#: ../../library/devmode.rst:175 +msgid "Bad file descriptor error example" +msgstr "文件描述符错误示例" + +#: ../../library/devmode.rst:177 +msgid "Script displaying the first line of itself::" +msgstr "显示自身的第一行代码:" + +#: ../../library/devmode.rst:179 +msgid "" +"import os\n" +"\n" +"def main():\n" +" fp = open(__file__)\n" +" firstline = fp.readline()\n" +" print(firstline.rstrip())\n" +" os.close(fp.fileno())\n" +" # The file is closed implicitly\n" +"\n" +"main()" +msgstr "" +"import os\n" +"\n" +"def main():\n" +" fp = open(__file__)\n" +" firstline = fp.readline()\n" +" print(firstline.rstrip())\n" +" os.close(fp.fileno())\n" +" # 文件被隐式地关闭\n" +"\n" +"main()" + +#: ../../library/devmode.rst:190 +msgid "By default, Python does not emit any warning:" +msgstr "默认情况下,Python 不会触发任何警告:" + +#: ../../library/devmode.rst:192 +msgid "" +"$ python script.py\n" +"import os" +msgstr "" +"$ python script.py\n" +"import os" + +#: ../../library/devmode.rst:197 +msgid "" +"The Python Development Mode shows a :exc:`ResourceWarning` and logs a \"Bad " +"file descriptor\" error when finalizing the file object:" +msgstr "" +"在 Python 开发模式下,会在析构文件对象时显示 :exc:`ResourceWarning` 并记录“Bad file descriptor” " +"错误。" + +#: ../../library/devmode.rst:200 +msgid "" +"$ python -X dev script.py\n" +"import os\n" +"script.py:10: ResourceWarning: unclosed file <_io.TextIOWrapper name='script.py' mode='r' encoding='UTF-8'>\n" +" main()\n" +"ResourceWarning: Enable tracemalloc to get the object allocation traceback\n" +"Exception ignored in: <_io.TextIOWrapper name='script.py' mode='r' encoding='UTF-8'>\n" +"Traceback (most recent call last):\n" +" File \"script.py\", line 10, in \n" +" main()\n" +"OSError: [Errno 9] Bad file descriptor" +msgstr "" +"$ python -X dev script.py\n" +"import os\n" +"script.py:10: ResourceWarning: unclosed file <_io.TextIOWrapper name='script.py' mode='r' encoding='UTF-8'>\n" +" main()\n" +"ResourceWarning: Enable tracemalloc to get the object allocation traceback\n" +"Exception ignored in: <_io.TextIOWrapper name='script.py' mode='r' encoding='UTF-8'>\n" +"Traceback (most recent call last):\n" +" File \"script.py\", line 10, in \n" +" main()\n" +"OSError: [Errno 9] Bad file descriptor" + +#: ../../library/devmode.rst:213 +msgid "" +"``os.close(fp.fileno())`` closes the file descriptor. When the file object " +"finalizer tries to close the file descriptor again, it fails with the ``Bad " +"file descriptor`` error. A file descriptor must be closed only once. In the " +"worst case scenario, closing it twice can lead to a crash (see " +":issue:`18748` for an example)." +msgstr "" +"``os.close(fp.fileno())`` 会关闭文件描述符。当文件对象析构函数试图再次关闭文件描述符时会失败,并触发 ``Bad file " +"descriptor`` 错误。 每个文件描述符只允许关闭一次。在最坏的情况下,关闭两次会导致程序崩溃 (示例可参见 :issue:`18748`)。" + +#: ../../library/devmode.rst:219 +msgid "" +"The fix is to remove the ``os.close(fp.fileno())`` line, or open the file " +"with ``closefd=False``." +msgstr "修正方案是删除 ``os.close(fp.fileno())`` 这一行,或者打开文件时带上 ``closefd=False`` 参数。" diff --git a/library/dialog.po b/library/dialog.po new file mode 100644 index 0000000000..414e822c0d --- /dev/null +++ b/library/dialog.po @@ -0,0 +1,394 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-11 15:33+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/dialog.rst:2 +msgid "Tkinter dialogs" +msgstr "" + +#: ../../library/dialog.rst:5 +msgid ":mod:`!tkinter.simpledialog` --- Standard Tkinter input dialogs" +msgstr ":mod:`!tkinter.simpledialog` --- 标准 Tkinter 输入对话框" + +#: ../../library/dialog.rst:10 +msgid "**Source code:** :source:`Lib/tkinter/simpledialog.py`" +msgstr "**源码:** :source:`Lib/tkinter/simpledialog.py`" + +#: ../../library/dialog.rst:14 +msgid "" +"The :mod:`!tkinter.simpledialog` module contains convenience classes and " +"functions for creating simple modal dialogs to get a value from the user." +msgstr "" + +#: ../../library/dialog.rst:22 +msgid "" +"Prompt the user to enter a value of the desired type and return it, or " +"``None`` if the dialog is cancelled." +msgstr "" + +#: ../../library/dialog.rst:25 +msgid "" +"*title* is the dialog title and *prompt* the message shown above the entry. " +"*initialvalue* is the value initially placed in the entry. *parent* is the " +"window over which the dialog is shown. :func:`askinteger` and " +":func:`askfloat` also accept *minvalue* and *maxvalue*, which bound the " +"accepted value. :func:`askstring` also accepts *show*, a character used to " +"mask the entered text, for example ``'*'`` to hide a password." +msgstr "" + +#: ../../library/dialog.rst:35 +msgid "" +"The base class for custom dialogs. Instantiating it shows the dialog modally" +" and returns once the user closes it; the entered value is then available in" +" the :attr:`!result` attribute." +msgstr "" + +#: ../../library/dialog.rst:41 +msgid "" +"The value produced by :meth:`apply`, or ``None`` if the dialog was " +"cancelled." +msgstr "" + +#: ../../library/dialog.rst:46 +msgid "" +"Override to construct the dialog's interface and return the widget that " +"should have initial focus." +msgstr "可以覆盖,用于构建对话框的界面,并返回初始焦点所在的部件。" + +#: ../../library/dialog.rst:51 +msgid "" +"Default behaviour adds OK and Cancel buttons. Override for custom button " +"layouts." +msgstr "加入 OK 和 Cancel 按钮的默认行为。重写自定义按钮布局。" + +#: ../../library/dialog.rst:56 +msgid "" +"Validate the data entered by the user. Return true if it is valid, in which " +"case the dialog proceeds to :meth:`apply`; return false to keep the dialog " +"open. The default implementation always returns true; override it to check " +"the input." +msgstr "" + +#: ../../library/dialog.rst:64 +msgid "" +"Process the data entered by the user, for example by storing it in the " +":attr:`!result` attribute. Called after :meth:`validate` succeeds and just " +"before the dialog is destroyed. The default implementation does nothing; " +"override it to act on or store the result." +msgstr "" + +#: ../../library/dialog.rst:73 +msgid "" +"Destroy the dialog window, clearing the reference to the widget that had the" +" initial focus." +msgstr "" + +#: ../../library/dialog.rst:79 +msgid "" +"A simple modal dialog that displays the message *text* above a row of push " +"buttons whose labels are given by *buttons*, and returns the index of the " +"button the user presses. *default* is the index of the button activated by " +"the Return key, *cancel* the index returned when the window is closed " +"through the window manager, *title* the window title, and *class_* the Tk " +"class name of the window." +msgstr "" + +#: ../../library/dialog.rst:88 +msgid "" +"Display the dialog, wait until the user presses a button or closes the " +"window, and return the index of the chosen button." +msgstr "" + +#: ../../library/dialog.rst:94 +msgid ":mod:`!tkinter.filedialog` --- File selection dialogs" +msgstr "" + +#: ../../library/dialog.rst:99 +msgid "**Source code:** :source:`Lib/tkinter/filedialog.py`" +msgstr "**源码:** :source:`Lib/tkinter/filedialog.py`" + +#: ../../library/dialog.rst:103 +msgid "" +"The :mod:`!tkinter.filedialog` module provides classes and factory functions" +" for creating file/directory selection windows." +msgstr "" + +#: ../../library/dialog.rst:107 +msgid "Native load/save dialogs" +msgstr "" + +#: ../../library/dialog.rst:109 +msgid "" +"The following classes and functions provide file dialog windows that combine" +" a native look-and-feel with configuration options to customize behaviour. " +"The following keyword arguments are applicable to the classes and functions " +"listed below:" +msgstr "以下类和函数提供了文件对话窗口,这些窗口带有原生外观,具备可定制行为的配置项。这些关键字参数适用于下列类和函数:" + +#: ../../library/dialog.rst:0 +msgid "*parent* - the window to place the dialog on top of" +msgstr "*parent* —— 将对话框置于其上方的窗口" + +#: ../../library/dialog.rst:0 +msgid "*title* - the title of the window" +msgstr "*title* —— 窗口的标题" + +#: ../../library/dialog.rst:0 +msgid "*initialdir* - the directory that the dialog starts in" +msgstr "*initialdir* —— 对话框的启动目录" + +#: ../../library/dialog.rst:0 +msgid "*initialfile* - the file selected upon opening of the dialog" +msgstr "*initialfile* —— 打开对话框时选中的文件" + +#: ../../library/dialog.rst:0 +msgid "" +"*filetypes* - a sequence of (label, pattern) tuples, '*' wildcard is allowed" +msgstr "*filetypes* —— (标签,匹配模式)元组构成的列表,允许使用“*”通配符" + +#: ../../library/dialog.rst:0 +msgid "" +"*defaultextension* - default extension to append to file (save dialogs)" +msgstr "*defaultextension* —— 默认的扩展名,用于加到文件名后面(保存对话框)。" + +#: ../../library/dialog.rst:0 +msgid "*multiple* - when true, selection of multiple items is allowed" +msgstr "*multiple* —— 为 True 则允许多选" + +#: ../../library/dialog.rst:129 +msgid "**Static factory functions**" +msgstr "**静态工厂函数**" + +#: ../../library/dialog.rst:131 +msgid "" +"The below functions when called create a modal, native look-and-feel dialog," +" wait for the user's selection, and return it. The exact return value " +"depends on the function (see below); when the dialog is cancelled it is an " +"empty string, an empty tuple or ``None``. The precise type of this empty " +"value may vary between platforms and Tk versions, so test the result for " +"truth rather than comparing it with a specific value." +msgstr "" + +#: ../../library/dialog.rst:142 +msgid "" +"Create an :class:`Open` dialog. :func:`askopenfile` returns the opened file " +"object, or ``None`` if the dialog is cancelled. :func:`askopenfiles` returns" +" a list of the opened file objects, or an empty tuple if cancelled. The " +"files are opened in mode *mode* (read-only ``'r'`` by default)." +msgstr "" + +#: ../../library/dialog.rst:151 +msgid "" +"Create a :class:`SaveAs` dialog and return the opened file object, or " +"``None`` if the dialog is cancelled. The file is opened in mode *mode* " +"(``'w'`` by default)." +msgstr "" + +#: ../../library/dialog.rst:158 +msgid "" +"Create an :class:`Open` dialog. :func:`askopenfilename` returns the selected" +" filename as a string, or an empty string if the dialog is cancelled. " +":func:`askopenfilenames` returns a tuple of the selected filenames, or an " +"empty tuple if cancelled." +msgstr "" + +#: ../../library/dialog.rst:166 +msgid "" +"Create a :class:`SaveAs` dialog and return the selected filename as a " +"string, or an empty string if the dialog is cancelled." +msgstr "" + +#: ../../library/dialog.rst:171 +msgid "" +"Prompt the user to select a directory, and return its path as a string, or " +"an empty string if the dialog is cancelled. Additional keyword option: " +"*mustexist* - if true, the user may only select an existing directory (false" +" by default)." +msgstr "" + +#: ../../library/dialog.rst:180 +msgid "" +"The above three classes provide native dialog windows for loading and saving" +" files and for selecting a directory." +msgstr "" + +#: ../../library/dialog.rst:183 +msgid "**Convenience classes**" +msgstr "**便捷类**" + +#: ../../library/dialog.rst:185 +msgid "" +"The below classes are used for creating file/directory windows from scratch." +" These do not emulate the native look-and-feel of the platform." +msgstr "以下类用于从头开始创建文件/目录窗口。不会模仿当前系统的原生外观。" + +#: ../../library/dialog.rst:188 +msgid "" +"The *FileDialog* class should be subclassed for custom event handling and " +"behaviour." +msgstr "为了实现自定义的事件处理和行为,应继承 *FileDialog* 类。" + +#: ../../library/dialog.rst:193 +msgid "Create a basic file selection dialog." +msgstr "创建一个简单的文件选择对话框。" + +#: ../../library/dialog.rst:197 +msgid "Trigger the termination of the dialog window." +msgstr "触发对话窗口的终止。" + +#: ../../library/dialog.rst:201 +msgid "Event handler for double-click event on directory." +msgstr "目录双击事件的处理程序。" + +#: ../../library/dialog.rst:205 +msgid "Event handler for click event on directory." +msgstr "目录单击事件的处理程序。" + +#: ../../library/dialog.rst:209 +msgid "Event handler for double-click event on file." +msgstr "文件双击事件的处理程序。" + +#: ../../library/dialog.rst:213 +msgid "Event handler for single-click event on file." +msgstr "文件单击事件的处理程序。" + +#: ../../library/dialog.rst:217 +msgid "Filter the files by directory." +msgstr "按目录筛选文件。" + +#: ../../library/dialog.rst:221 +msgid "Retrieve the file filter currently in use." +msgstr "获取当前使用的文件筛选器。" + +#: ../../library/dialog.rst:225 +msgid "Retrieve the currently selected item." +msgstr "获取当前选中项。" + +#: ../../library/dialog.rst:229 +msgid "Render dialog and start event loop." +msgstr "显示对话框并启动事件循环。" + +#: ../../library/dialog.rst:233 +msgid "Exit dialog returning current selection." +msgstr "退出对话框并返回当前选中项。" + +#: ../../library/dialog.rst:237 +msgid "" +"Called when the user confirms the current selection. The base implementation" +" accepts the selection and closes the dialog; :class:`LoadFileDialog` and " +":class:`SaveFileDialog` override it to check the selection first." +msgstr "" + +#: ../../library/dialog.rst:244 +msgid "Exit dialog returning filename, if any." +msgstr "退出对话框并返回文件名。" + +#: ../../library/dialog.rst:248 +msgid "Set the file filter." +msgstr "设置文件筛选器。" + +#: ../../library/dialog.rst:252 +msgid "Update the current file selection to *file*." +msgstr "将当前选中文件更新为 *file*。" + +#: ../../library/dialog.rst:257 +msgid "" +"A subclass of FileDialog that creates a dialog window for selecting an " +"existing file." +msgstr "FileDialog 的一个子类,创建用于选取已有文件的对话窗口。" + +#: ../../library/dialog.rst:262 +msgid "" +"Test that a file is provided and that the selection indicates an already " +"existing file." +msgstr "检测有否给出文件,以及选中的文件是否存在。" + +#: ../../library/dialog.rst:267 +msgid "" +"A subclass of FileDialog that creates a dialog window for selecting a " +"destination file." +msgstr "FileDialog 的一个子类,创建用于选择目标文件的对话窗口。" + +#: ../../library/dialog.rst:272 +msgid "" +"Test whether or not the selection points to a valid file that is not a " +"directory. Confirmation is required if an already existing file is selected." +msgstr "检测选中项是否指向一个非目录的有效文件。如果选中了已存在的文件,则需要用户进行确认。" + +#: ../../library/dialog.rst:277 +msgid ":mod:`!tkinter.commondialog` --- Dialog window templates" +msgstr "" + +#: ../../library/dialog.rst:282 +msgid "**Source code:** :source:`Lib/tkinter/commondialog.py`" +msgstr "**源码:** :source:`Lib/tkinter/commondialog.py`" + +#: ../../library/dialog.rst:286 +msgid "" +"The :mod:`!tkinter.commondialog` module provides the :class:`Dialog` class " +"that is the base class for dialogs defined in other supporting modules." +msgstr "" + +#: ../../library/dialog.rst:293 +msgid "Render the Dialog window." +msgstr "显示对话窗口。" + +#: ../../library/dialog.rst:297 +msgid ":mod:`!tkinter.dialog` --- Classic Tk dialog boxes" +msgstr "" + +#: ../../library/dialog.rst:302 +msgid "**Source code:** :source:`Lib/tkinter/dialog.py`" +msgstr "" + +#: ../../library/dialog.rst:306 +msgid "" +"The :mod:`!tkinter.dialog` module provides a simple modal dialog box built " +"on the classic (non-themed) Tk widgets." +msgstr "" + +#: ../../library/dialog.rst:311 +msgid "" +"The name of a bitmap (``'questhead'``) suitable for use as the *bitmap* of a" +" :class:`Dialog`." +msgstr "" + +#: ../../library/dialog.rst:316 +msgid "" +"Display a modal dialog box built from the classic (non-themed) Tk widgets " +"and wait for the user to press one of its buttons. The options, given " +"through *cnf* or as keyword arguments, are all required: *title* (the window" +" title), *text* (the message), *bitmap* (the name of a bitmap icon, such as " +":data:`DIALOG_ICON`), *default* (the index of the default button) and " +"*strings* (the sequence of button labels). After construction, the " +":attr:`!num` attribute holds the index of the button the user pressed." +msgstr "" + +#: ../../library/dialog.rst:327 +msgid "" +"Do nothing. The dialog window is destroyed automatically before the " +"constructor returns, so there is nothing left for this method to do." +msgstr "" + +#: ../../library/dialog.rst:334 +msgid "Modules :mod:`tkinter.messagebox`, :ref:`tut-files`" +msgstr "模块 :mod:`tkinter.messagebox`, :ref:`tut-files`" diff --git a/library/difflib.po b/library/difflib.po new file mode 100644 index 0000000000..a5e08112fc --- /dev/null +++ b/library/difflib.po @@ -0,0 +1,1302 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/difflib.rst:2 +msgid ":mod:`!difflib` --- Helpers for computing deltas" +msgstr ":mod:`!difflib` --- 计算差异的辅助工具" + +#: ../../library/difflib.rst:11 +msgid "**Source code:** :source:`Lib/difflib.py`" +msgstr "**源代码:** :source:`Lib/difflib.py`" + +#: ../../library/difflib.rst:20 +msgid "" +"This module provides classes and functions for comparing sequences. It can " +"be used for example, for comparing files, and can produce information about " +"file differences in various formats, including HTML and context and unified " +"diffs. For comparing directories and files, see also, the :mod:`filecmp` " +"module." +msgstr "" +"此模块提供用于比较序列的类和函数。例如,它可被用于比较文件,并可产生多种格式的不同文件差异信息,包括 HTML 和上下文以及统一的 diff 数据。 " +"有关比较目录和文件,另请参阅 :mod:`filecmp` 模块。" + +#: ../../library/difflib.rst:29 +msgid "" +"This is a flexible class for comparing pairs of sequences of any type, so " +"long as the sequence elements are :term:`hashable`. The basic algorithm " +"predates, and is a little fancier than, an algorithm published in the late " +"1980's by Ratcliff and Obershelp under the hyperbolic name \"gestalt pattern" +" matching.\" The idea is to find the longest contiguous matching " +"subsequence that contains no \"junk\" elements; these \"junk\" elements are " +"ones that are uninteresting in some sense, such as blank lines or " +"whitespace. (Handling junk is an extension to the Ratcliff and Obershelp " +"algorithm.) The same idea is then applied recursively to the pieces of the " +"sequences to the left and to the right of the matching subsequence. This " +"does not yield minimal edit sequences, but does tend to yield matches that " +"\"look right\" to people." +msgstr "" +"这是一个灵活的类,可用于比较任何类型的序列对,只要序列元素为 :term:`hashable` 对象。其基本算法要早于由 Ratcliff 和 " +"Obershelp 于 1980 年代末期发表并以“格式塔模式匹配”的夸张名称命名的算法,并且更加有趣一些。 " +"其思路是找到不包含“垃圾”元素的最长连续匹配子序列;所谓“垃圾”元素是指其在某种意义上没有价值,例如空白行或空白符。 (处理垃圾元素是对 " +"Ratcliff 和 Obershelp 算法的一个扩展。)然后同样的思路将递归地应用于匹配序列的左右序列片段。 " +"这并不能产生最小编辑序列,但确实能产生在人们看来“正确”的匹配。" + +#: ../../library/difflib.rst:41 +msgid "" +"**Timing:** The basic Ratcliff-Obershelp algorithm is cubic time in the " +"worst case and quadratic time in the expected case. :class:`SequenceMatcher`" +" is quadratic time for the worst case and has expected-case behavior " +"dependent in a complicated way on how many elements the sequences have in " +"common; best case time is linear." +msgstr "" +"**耗时:** 基本 Ratcliff-Obershelp 算法在最坏情况下为立方时间而在一般情况下为平方时间。 " +":class:`SequenceMatcher` " +"在最坏情况下为平方时间而在一般情况下的行为受到序列中有多少相同元素这一因素的微妙影响;在最佳情况下则为线性时间。" + +#: ../../library/difflib.rst:47 +msgid "" +"**Automatic junk heuristic:** :class:`SequenceMatcher` supports a heuristic " +"that automatically treats certain sequence items as junk. The heuristic " +"counts how many times each individual item appears in the sequence. If an " +"item's duplicates (after the first one) account for more than 1% of the " +"sequence and the sequence is at least 200 items long, this item is marked as" +" \"popular\" and is treated as junk for the purpose of sequence matching. " +"This heuristic can be turned off by setting the ``autojunk`` argument to " +"``False`` when creating the :class:`SequenceMatcher`." +msgstr "" +"**自动垃圾启发式计算:** :class:`SequenceMatcher` 支持使用启发式计算来自动将特定序列项视为垃圾。 " +"这种启发式计算会统计每个单独项在序列中出现的次数。如果某一项(在第一项之后)的重复次数超过序列长度的 1% 并且序列长度至少有 200 " +"项,该项会被标记为“热门”并被视为序列匹配中的垃圾。这种启发式计算可以通过在创建 :class:`SequenceMatcher` 时将 " +"``autojunk`` 参数设为 ``False`` 来关闭。" + +#: ../../library/difflib.rst:55 ../../library/difflib.rst:386 +msgid "Added the *autojunk* parameter." +msgstr "增加了 *autojunk* 形参。" + +#: ../../library/difflib.rst:61 +msgid "" +"This is a class for comparing sequences of lines of text, and producing " +"human-readable differences or deltas. Differ uses :class:`SequenceMatcher` " +"both to compare sequences of lines, and to compare sequences of characters " +"within similar (near-matching) lines." +msgstr "" +"这个类的作用是比较由文本行组成的序列,并产生可供人阅读的差异或增量信息。Differ 统一使用 :class:`SequenceMatcher` " +"来完成行序列的比较以及相似(接近匹配)行内部字符序列的比较。" + +#: ../../library/difflib.rst:66 +msgid "Each line of a :class:`Differ` delta begins with a two-letter code:" +msgstr ":class:`Differ` 增量的每一行均以双字母代码打头:" + +#: ../../library/difflib.rst:69 +msgid "Code" +msgstr "双字母代码" + +#: ../../library/difflib.rst:69 ../../library/difflib.rst:496 +msgid "Meaning" +msgstr "含意" + +#: ../../library/difflib.rst:71 +msgid "``'- '``" +msgstr "``'- '``" + +#: ../../library/difflib.rst:71 +msgid "line unique to sequence 1" +msgstr "行为序列 1 所独有" + +#: ../../library/difflib.rst:73 +msgid "``'+ '``" +msgstr "``'+ '``" + +#: ../../library/difflib.rst:73 +msgid "line unique to sequence 2" +msgstr "行为序列 2 所独有" + +#: ../../library/difflib.rst:75 +msgid "``' '``" +msgstr "``' '``" + +#: ../../library/difflib.rst:75 +msgid "line common to both sequences" +msgstr "行在两序列中相同" + +#: ../../library/difflib.rst:77 +msgid "``'? '``" +msgstr "``'? '``" + +#: ../../library/difflib.rst:77 +msgid "line not present in either input sequence" +msgstr "行不存在于任一输入序列" + +#: ../../library/difflib.rst:80 +msgid "" +"Lines beginning with '``?``' attempt to guide the eye to intraline " +"differences, and were not present in either input sequence. These lines can " +"be confusing if the sequences contain whitespace characters, such as spaces," +" tabs or line breaks." +msgstr "" +"以 '``?``' 打头的行尝试将视线引导至行内差异,这些行不存在于任一输入序列中。 " +"如果序列包含空白符,例如空格、制表或换行则这些行可能会令人感到迷惑。" + +#: ../../library/difflib.rst:87 +msgid "" +"This class can be used to create an HTML table (or a complete HTML file " +"containing the table) showing a side by side, line by line comparison of " +"text with inter-line and intra-line change highlights. The table can be " +"generated in either full or contextual difference mode." +msgstr "" +"这个类可用于创建 HTML 表格(或包含表格的完整 HTML 文件)以并排地逐行显示文本比较,行间与行内的更改将突出显示。 " +"此表格可以基于完全或上下文差异模式来生成。" + +#: ../../library/difflib.rst:92 +msgid "The constructor for this class is:" +msgstr "这个类的构造函数:" + +#: ../../library/difflib.rst:97 +msgid "Initializes instance of :class:`HtmlDiff`." +msgstr "初始化 :class:`HtmlDiff` 的实例。" + +#: ../../library/difflib.rst:99 +msgid "" +"*tabsize* is an optional keyword argument to specify tab stop spacing and " +"defaults to ``8``." +msgstr "*tabsize* 是一个可选关键字参数,指定制表位的间隔,默认值为 ``8``。" + +#: ../../library/difflib.rst:102 +msgid "" +"*wrapcolumn* is an optional keyword to specify column number where lines are" +" broken and wrapped, defaults to ``None`` where lines are not wrapped." +msgstr "*wrapcolumn* 是一个可选关键字参数,指定行文本自动打断并换行的列位置,默认值为 ``None`` 表示不自动换行。" + +#: ../../library/difflib.rst:105 +msgid "" +"*linejunk* and *charjunk* are optional keyword arguments passed into " +":func:`ndiff` (used by :class:`HtmlDiff` to generate the side by side HTML " +"differences). See :func:`ndiff` documentation for argument default values " +"and descriptions." +msgstr "" +"*linejunk* 和 *charjunk* 均是可选关键字参数,会传入 :func:`ndiff` (被 :class:`HtmlDiff` " +"用来生成并排显示的 HTML 差异)。 请参阅 :func:`ndiff` 文档了解参数默认值及其说明。" + +#: ../../library/difflib.rst:109 +msgid "The following methods are public:" +msgstr "下列是公开的方法" + +#: ../../library/difflib.rst:114 +msgid "" +"Compares *fromlines* and *tolines* (lists of strings) and returns a string " +"which is a complete HTML file containing a table showing line by line " +"differences with inter-line and intra-line changes highlighted." +msgstr "" +"比较 *fromlines* 和 *tolines* (字符串列表) 并返回一个字符串,表示一个完整 HTML " +"文件,其中包含各行差异的表格,行间与行内的更改将突出显示。" + +#: ../../library/difflib.rst:118 +msgid "" +"*fromdesc* and *todesc* are optional keyword arguments to specify from/to " +"file column header strings (both default to an empty string)." +msgstr "*fromdesc* 和 *todesc* 均是可选关键字参数,指定来源/目标文件的列标题字符串(默认均为空白字符串)。" + +#: ../../library/difflib.rst:121 +msgid "" +"*context* and *numlines* are both optional keyword arguments. Set *context* " +"to ``True`` when contextual differences are to be shown, else the default is" +" ``False`` to show the full files. *numlines* defaults to ``5``. When " +"*context* is ``True`` *numlines* controls the number of context lines which " +"surround the difference highlights. When *context* is ``False`` *numlines* " +"controls the number of lines which are shown before a difference highlight " +"when using the \"next\" hyperlinks (setting to zero would cause the \"next\"" +" hyperlinks to place the next difference highlight at the top of the browser" +" without any leading context)." +msgstr "" +"*context* 和 *numlines* 均是可选关键字参数。当只要显示上下文差异时就将 *context* 设为 ``True``,否则默认值 " +"``False`` 为显示完整文件。 *numlines* 默认为 ``5``。当 *context* 为 ``True`` 时 *numlines* " +"将控制围绕突出显示差异部分的上下文行数。当 *context* 为 ``False`` 时 *numlines* 将控制在使用 \"next\" " +"超链接时突出显示差异部分之前所显示的行数(设为零则会导致 \"next\" 超链接将下一个突出显示差异部分放在浏览器顶端,不添加任何前导上下文)。" + +#: ../../library/difflib.rst:132 +msgid "" +"*fromdesc* and *todesc* are interpreted as unescaped HTML and should be " +"properly escaped while receiving input from untrusted sources." +msgstr "*fromdesc* 和 *todesc* 会被当作未转义的 HTML 来解读,当接收不可信来源的输入时应该适当地进行转义。" + +#: ../../library/difflib.rst:135 +msgid "" +"*charset* keyword-only argument was added. The default charset of HTML " +"document changed from ``'ISO-8859-1'`` to ``'utf-8'``." +msgstr "增加了 *charset* 关键字参数。HTML 文档的默认字符集从 ``'ISO-8859-1'`` 更改为 ``'utf-8'``。" + +#: ../../library/difflib.rst:141 +msgid "" +"Compares *fromlines* and *tolines* (lists of strings) and returns a string " +"which is a complete HTML table showing line by line differences with inter-" +"line and intra-line changes highlighted." +msgstr "" +"比较 *fromlines* 和 *tolines* (字符串列表) 并返回一个字符串,表示一个包含各行差异的完整 HTML " +"表格,行间与行内的更改将突出显示。" + +#: ../../library/difflib.rst:145 +msgid "" +"The arguments for this method are the same as those for the " +":meth:`make_file` method." +msgstr "此方法的参数与 :meth:`make_file` 方法的相同。" + +#: ../../library/difflib.rst:152 +msgid "" +"Compare *a* and *b* (lists of strings); return a delta (a :term:`generator` " +"generating the delta lines) in context diff format." +msgstr "比较 *a* 和 *b* (字符串列表);返回上下文差异格式的增量信息 (一个产生增量行的 :term:`generator`)。" + +#: ../../library/difflib.rst:155 +msgid "" +"Context diffs are a compact way of showing just the lines that have changed " +"plus a few lines of context. The changes are shown in a before/after style." +" The number of context lines is set by *n* which defaults to three." +msgstr "所谓上下文差异是一种只显示有更改的行再加几个上下文行的紧凑形式。更改被显示为之前/之后的样式。上下文行数由 *n* 设定,默认为三行。" + +#: ../../library/difflib.rst:159 +msgid "" +"By default, the diff control lines (those with ``***`` or ``---``) are " +"created with a trailing newline. This is helpful so that inputs created " +"from :func:`io.IOBase.readlines` result in diffs that are suitable for use " +"with :func:`io.IOBase.writelines` since both the inputs and outputs have " +"trailing newlines." +msgstr "" +"默认情况下,差异控制行(以 ``***`` 或 ``---`` 表示)是通过末尾换行符来创建的。这样做的好处是从 " +":func:`io.IOBase.readlines` 创建的输入将得到适用于 :func:`io.IOBase.writelines` " +"的差异信息,因为输入和输出都带有末尾换行符。" + +#: ../../library/difflib.rst:165 ../../library/difflib.rst:297 +msgid "" +"For inputs that do not have trailing newlines, set the *lineterm* argument " +"to ``\"\"`` so that the output will be uniformly newline free." +msgstr "对于没有末尾换行符的输入,应将 *lineterm* 参数设为 ``\"\"``,这样输出内容将统一不带换行符。" + +#: ../../library/difflib.rst:168 +msgid "" +"The context diff format normally has a header for filenames and modification" +" times. Any or all of these may be specified using strings for *fromfile*, " +"*tofile*, *fromfiledate*, and *tofiledate*. The modification times are " +"normally expressed in the ISO 8601 format. If not specified, the strings " +"default to blanks." +msgstr "" +"上下文差异格式通常带有一个记录文件名和修改时间的标头。这些信息的部分或全部可以使用字符串 *fromfile*, *tofile*, " +"*fromfiledate* 和 *tofiledate* 来指定。修改时间通常以 ISO 8601 格式表示。如果未指定,这些字符串默认为空。" + +#: ../../library/difflib.rst:194 ../../library/difflib.rst:320 +msgid "See :ref:`difflib-interface` for a more detailed example." +msgstr "请参阅 :ref:`difflib-interface` 获取更详细的示例。" + +#: ../../library/difflib.rst:199 +msgid "" +"Return a list of the best \"good enough\" matches. *word* is a sequence for" +" which close matches are desired (typically a string), and *possibilities* " +"is a list of sequences against which to match *word* (typically a list of " +"strings)." +msgstr "" +"返回由最佳“近似”匹配构成的列表。 *word* 为一个指定目标近似匹配的序列(通常为字符串),*possibilities* 为一个由用于匹配 " +"*word* 的序列构成的列表(通常为字符串列表)。" + +#: ../../library/difflib.rst:203 +msgid "" +"Optional argument *n* (default ``3``) is the maximum number of close matches" +" to return; *n* must be greater than ``0``." +msgstr "可选参数 *n* (默认为 ``3``) 指定最多返回多少个近似匹配; *n* 必须大于 ``0``." + +#: ../../library/difflib.rst:206 +msgid "" +"Optional argument *cutoff* (default ``0.6``) is a float in the range [0, 1]." +" Possibilities that don't score at least that similar to *word* are ignored." +msgstr "" +"可选参数 *cutoff* (默认为 ``0.6``) 是一个 [0, 1] 范围内的浮点数。与 *word* 相似度得分未达到该值的候选匹配将被忽略。" + +#: ../../library/difflib.rst:209 +msgid "" +"The best (no more than *n*) matches among the possibilities are returned in " +"a list, sorted by similarity score, most similar first." +msgstr "候选匹配中(不超过 *n* 个)的最佳匹配将以列表形式返回,按相似度得分排序,最相似的排在最前面。" + +#: ../../library/difflib.rst:225 +msgid "" +"Compare *a* and *b* (lists of strings); return a :class:`Differ`\\ -style " +"delta (a :term:`generator` generating the delta lines)." +msgstr "" +"比较 *a* 和 *b* (字符串列表);返回 :class:`Differ` 形式的增量信息 (一个产生增量行的 " +":term:`generator`)." + +#: ../../library/difflib.rst:228 +msgid "" +"Optional keyword parameters *linejunk* and *charjunk* are filtering " +"functions (or ``None``):" +msgstr "可选关键字形参 *linejunk* 和 *charjunk* 均为过滤函数 (或为 ``None``):" + +#: ../../library/difflib.rst:231 +msgid "" +"*linejunk*: A function that accepts a single string argument, and returns " +"true if the string is junk, or false if not. The default is ``None``. There " +"is also a module-level function :func:`IS_LINE_JUNK`, which filters out " +"lines without visible characters, except for at most one hash character " +"(``'#'``) -- however the underlying :class:`SequenceMatcher` class does a " +"dynamic analysis of which lines are so frequent as to constitute noise, and " +"this usually works better than using this function." +msgstr "" +"*linejunk*: 此函数接受单个字符串参数,如果其为垃圾字符串则返回真值,否则返回假值。默认值为 ``None``。此外还有一个模块层级的函数 " +":func:`IS_LINE_JUNK`,它会过滤掉没有可见字符的行,除非该行添加了至多一个井号符 (``'#'``) -- 不过下层的 " +":class:`SequenceMatcher` 类会动态分析哪些行的重复频繁到足以形成噪音,这通常会比使用此函数效果更好。" + +#: ../../library/difflib.rst:239 +msgid "" +"*charjunk*: A function that accepts a character (a string of length 1), and " +"returns if the character is junk, or false if not. The default is module-" +"level function :func:`IS_CHARACTER_JUNK`, which filters out whitespace " +"characters (a blank or tab; it's a bad idea to include newline in this!)." +msgstr "" +"*charjunk*: 此函数接受一个字符(长度为 1 的字符串),如果其为垃圾字符则返回真值,否则返回假值。默认为模块层级的函数 " +":func:`IS_CHARACTER_JUNK`,它会过滤掉空白字符(空格符或制表符;但包含换行符可不是个好主意!)。" + +#: ../../library/difflib.rst:260 +msgid "Return one of the two sequences that generated a delta." +msgstr "返回两个序列中产生增量的那一个。" + +#: ../../library/difflib.rst:262 +msgid "" +"Given a *sequence* produced by :meth:`Differ.compare` or :func:`ndiff`, " +"extract lines originating from file 1 or 2 (parameter *which*), stripping " +"off line prefixes." +msgstr "" +"给出一个由 :meth:`Differ.compare` 或 :func:`ndiff` 产生的 *序列*,提取出来自文件 1 或 2 (*which*" +" 形参) 的行,去除行前缀。" + +#: ../../library/difflib.rst:266 +msgid "Example:" +msgstr "示例:" + +#: ../../library/difflib.rst:283 +msgid "" +"Compare *a* and *b* (lists of strings); return a delta (a :term:`generator` " +"generating the delta lines) in unified diff format." +msgstr "比较 *a* 和 *b* (字符串列表);返回统一差异格式的增量信息 (一个产生增量行的 :term:`generator`)。" + +#: ../../library/difflib.rst:286 +msgid "" +"Unified diffs are a compact way of showing just the lines that have changed " +"plus a few lines of context. The changes are shown in an inline style " +"(instead of separate before/after blocks). The number of context lines is " +"set by *n* which defaults to three." +msgstr "" +"所谓统一差异是一种只显示有更改的行再加几个上下文行的紧凑形式。更改被显示为内联的样式(而不是分开的之前/之后文本块)。上下文行数由 *n* " +"设定,默认为三行。" + +#: ../../library/difflib.rst:291 +msgid "" +"By default, the diff control lines (those with ``---``, ``+++``, or ``@@``) " +"are created with a trailing newline. This is helpful so that inputs created" +" from :func:`io.IOBase.readlines` result in diffs that are suitable for use " +"with :func:`io.IOBase.writelines` since both the inputs and outputs have " +"trailing newlines." +msgstr "" +"默认情况下,差异控制行 (以 ``---``, ``+++`` 或 ``@@`` 表示) 是通过末尾换行符来创建的。这样做的好处是从 " +":func:`io.IOBase.readlines` 创建的输入将得到适用于 :func:`io.IOBase.writelines` " +"的差异信息,因为输入和输出都带有末尾换行符。" + +#: ../../library/difflib.rst:300 +msgid "" +"The unified diff format normally has a header for filenames and modification" +" times. Any or all of these may be specified using strings for *fromfile*, " +"*tofile*, *fromfiledate*, and *tofiledate*. The modification times are " +"normally expressed in the ISO 8601 format. If not specified, the strings " +"default to blanks." +msgstr "" +"统一的差异格式通常带有一个记录文件名和修改时间的标头。这些信息的部分或全部可以使用字符串 *fromfile*, *tofile*, " +"*fromfiledate* 和 *tofiledate* 来指定。修改时间通常以 ISO 8601 格式表示。如果未指定,这些字符串将默认为空。" + +#: ../../library/difflib.rst:324 +msgid "" +"Compare *a* and *b* (lists of bytes objects) using *dfunc*; yield a sequence" +" of delta lines (also bytes) in the format returned by *dfunc*. *dfunc* must" +" be a callable, typically either :func:`unified_diff` or " +":func:`context_diff`." +msgstr "" +"使用 *dfunc* 比较 *a* 和 *b* (字节串对象列表);产生以 *dfunc* 所返回格式表示的差异行列表(也是字节串)。 *dfunc* " +"必须是可调用对象,通常为 :func:`unified_diff` 或 :func:`context_diff`。" + +#: ../../library/difflib.rst:329 +msgid "" +"Allows you to compare data with unknown or inconsistent encoding. All inputs" +" except *n* must be bytes objects, not str. Works by losslessly converting " +"all inputs (except *n*) to str, and calling ``dfunc(a, b, fromfile, tofile, " +"fromfiledate, tofiledate, n, lineterm)``. The output of *dfunc* is then " +"converted back to bytes, so the delta lines that you receive have the same " +"unknown/inconsistent encodings as *a* and *b*." +msgstr "" +"允许你比较编码未知或不一致的数据。除 *n* 之外的所有输入都必须为字节串对象而非字符串。作用方式为无损地将所有输入 (除 *n* 之外) " +"转换为字符串,并调用 ``dfunc(a, b, fromfile, tofile, fromfiledate, tofiledate, n, " +"lineterm)``。 *dfunc* 的输出会被随即转换回字节串,这样你所得到的增量行将具有与 *a* 和 *b* 相同的未知/不一致编码。" + +#: ../../library/difflib.rst:340 +msgid "" +"Return ``True`` for ignorable lines. The line *line* is ignorable if *line*" +" is blank or contains a single ``'#'``, otherwise it is not ignorable. Used" +" as a default for parameter *linejunk* in :func:`ndiff` in older versions." +msgstr "" +"对于可忽略的行返回 ``True``。如果 *line* 为空行或只包含单个 ``'#'`` 则 *line* 行就是可忽略的,否则就是不可忽略的。 " +"此函数被用作较旧版本 :func:`ndiff` 中 *linejunk* 形参的默认值。" + +#: ../../library/difflib.rst:347 +msgid "" +"Return ``True`` for ignorable characters. The character *ch* is ignorable " +"if *ch* is a space or tab, otherwise it is not ignorable. Used as a default" +" for parameter *charjunk* in :func:`ndiff`." +msgstr "" +"对于可忽略的字符返回 ``True``。字符 *ch* 如果为空格符或制表符则 *ch* 就是可忽略的,否则就是不可忽略的。此函数被用作 " +":func:`ndiff` 中 *charjunk* 形参的默认值。" + +#: ../../library/difflib.rst:354 +msgid "" +"`Pattern Matching: The Gestalt Approach " +"`_" +msgstr "" +"`模式匹配:格式塔方法 " +"`_" + +#: ../../library/difflib.rst:355 +msgid "" +"Discussion of a similar algorithm by John W. Ratcliff and D. E. Metzener. " +"This was published in Dr. Dobb's Journal in July, 1988." +msgstr "" +"John W. Ratcliff 和 D. E. Metzener 对一种类似算法的讨论,该文章发表于 1988 年 7 月的《Dr. Dobb's " +"Journal》杂志。" + +#: ../../library/difflib.rst:362 +msgid "SequenceMatcher objects" +msgstr "" + +#: ../../library/difflib.rst:364 +msgid "The :class:`SequenceMatcher` class has this constructor:" +msgstr ":class:`SequenceMatcher` 类具有这样的构造器:" + +#: ../../library/difflib.rst:369 +msgid "" +"Optional argument *isjunk* must be ``None`` (the default) or a one-argument " +"function that takes a sequence element and returns true if and only if the " +"element is \"junk\" and should be ignored. Passing ``None`` for *isjunk* is " +"equivalent to passing ``lambda x: False``; in other words, no elements are " +"ignored. For example, pass::" +msgstr "" +"可选参数 *isjunk* 必须为 ``None`` (默认值) 或为接受一个序列元素并当且仅当其为应忽略的“垃圾”元素时返回真值的单参数函数。传入 " +"``None`` 作为 *isjunk* 的值就相当于传入 ``lambda x: False``;也就是说不忽略任何值。 例如,传入::" + +#: ../../library/difflib.rst:375 +msgid "lambda x: x in \" \\t\"" +msgstr "lambda x: x in \" \\t\"" + +#: ../../library/difflib.rst:377 +msgid "" +"if you're comparing lines as sequences of characters, and don't want to " +"synch up on blanks or hard tabs." +msgstr "如果你以字符序列的形式对行进行比较,并且不希望在空格符或硬制表符上进行同步。" + +#: ../../library/difflib.rst:380 +msgid "" +"The optional arguments *a* and *b* are sequences to be compared; both " +"default to empty strings. The elements of both sequences must be " +":term:`hashable`." +msgstr "可选参数 *a* 和 *b* 为要比较的序列;两者默认为空字符串。两个序列的元素都必须为 :term:`hashable`。" + +#: ../../library/difflib.rst:383 +msgid "" +"The optional argument *autojunk* can be used to disable the automatic junk " +"heuristic." +msgstr "可选参数 *autojunk* 可用于禁用自动垃圾启发式计算。" + +#: ../../library/difflib.rst:389 +msgid "" +"SequenceMatcher objects get three data attributes: *bjunk* is the set of " +"elements of *b* for which *isjunk* is ``True``; *bpopular* is the set of " +"non-junk elements considered popular by the heuristic (if it is not " +"disabled); *b2j* is a dict mapping the remaining elements of *b* to a list " +"of positions where they occur. All three are reset whenever *b* is reset " +"with :meth:`set_seqs` or :meth:`set_seq2`." +msgstr "" +"SequenceMatcher 对象接受三个数据属性:*bjunk* 是 *b* 当中 *isjunk* 为 ``True`` " +"的元素集合;*bpopular* 是被启发式计算(如果其未被禁用)视为热门候选的非垃圾元素集合;*b2j* 是将 *b* " +"当中剩余元素映射到一个它们出现位置列表的字典。所有三个数据属性将在 *b* 通过 :meth:`set_seqs` 或 :meth:`set_seq2`" +" 重置时被重置。" + +#: ../../library/difflib.rst:396 +msgid "The *bjunk* and *bpopular* attributes." +msgstr "*bjunk* 和 *bpopular* 属性。" + +#: ../../library/difflib.rst:399 +msgid ":class:`SequenceMatcher` objects have the following methods:" +msgstr ":class:`SequenceMatcher` 对象具有以下方法:" + +#: ../../library/difflib.rst:403 +msgid "Set the two sequences to be compared." +msgstr "设置要比较的两个序列。" + +#: ../../library/difflib.rst:405 +msgid "" +":class:`SequenceMatcher` computes and caches detailed information about the " +"second sequence, so if you want to compare one sequence against many " +"sequences, use :meth:`set_seq2` to set the commonly used sequence once and " +"call :meth:`set_seq1` repeatedly, once for each of the other sequences." +msgstr "" +":class:`SequenceMatcher` 计算并缓存有关第二个序列的详细信息,这样如果你想要将一个序列与多个序列进行比较,可使用 " +":meth:`set_seq2` 一次性地设置该常用序列并重复地对每个其他序列各调用一次 :meth:`set_seq1`。" + +#: ../../library/difflib.rst:413 +msgid "" +"Set the first sequence to be compared. The second sequence to be compared " +"is not changed." +msgstr "设置要比较的第一个序列。要比较的第二个序列不会改变。" + +#: ../../library/difflib.rst:419 +msgid "" +"Set the second sequence to be compared. The first sequence to be compared " +"is not changed." +msgstr "设置要比较的第二个序列。要比较的第一个序列不会改变。" + +#: ../../library/difflib.rst:425 +msgid "Find longest matching block in ``a[alo:ahi]`` and ``b[blo:bhi]``." +msgstr "找出 ``a[alo:ahi]`` 和 ``b[blo:bhi]`` 中的最长匹配块。" + +#: ../../library/difflib.rst:427 +msgid "" +"If *isjunk* was omitted or ``None``, :meth:`find_longest_match` returns " +"``(i, j, k)`` such that ``a[i:i+k]`` is equal to ``b[j:j+k]``, where ``alo " +"<= i <= i+k <= ahi`` and ``blo <= j <= j+k <= bhi``. For all ``(i', j', " +"k')`` meeting those conditions, the additional conditions ``k >= k'``, ``i " +"<= i'``, and if ``i == i'``, ``j <= j'`` are also met. In other words, of " +"all maximal matching blocks, return one that starts earliest in *a*, and of " +"all those maximal matching blocks that start earliest in *a*, return the one" +" that starts earliest in *b*." +msgstr "" +"如果 *isjunk* 被省略或为 ``None``,:meth:`find_longest_match` 将返回 ``(i, j, k)`` 使得 " +"``a[i:i+k]`` 等于 ``b[j:j+k]``,其中 ``alo <= i <= i+k <= ahi`` 并且 ``blo <= j <= " +"j+k <= bhi``。对于所有满足这些条件的 ``(i', j', k')``,如果 ``i == i'``, ``j <= j'`` " +"也被满足,则附加条件 ``k >= k'``, ``i <= i'``。换句话说,对于所有最长匹配块,返回在 *a* 当中最先出现的一个,而对于在 " +"*a* 当中最先出现的所有最长匹配块,则返回在 *b* 当中最先出现的一个。" + +#: ../../library/difflib.rst:440 +msgid "" +"If *isjunk* was provided, first the longest matching block is determined as " +"above, but with the additional restriction that no junk element appears in " +"the block. Then that block is extended as far as possible by matching " +"(only) junk elements on both sides. So the resulting block never matches on " +"junk except as identical junk happens to be adjacent to an interesting " +"match." +msgstr "" +"如果提供了 *isjunk*,将按上述规则确定第一个最长匹配块,但额外附加不允许块内出现垃圾元素的限制。 " +"然后将通过(仅)匹配两边的垃圾元素来尽可能地扩展该块。这样结果块绝对不会匹配垃圾元素,除非同样的垃圾元素正好与有意义的匹配相邻。" + +#: ../../library/difflib.rst:447 +msgid "" +"Here's the same example as before, but considering blanks to be junk. That " +"prevents ``' abcd'`` from matching the ``' abcd'`` at the tail end of the " +"second sequence directly. Instead only the ``'abcd'`` can match, and " +"matches the leftmost ``'abcd'`` in the second sequence:" +msgstr "" +"这是与之前相同的例子,但是将空格符视为垃圾。这将防止 ``' abcd'`` 直接与第二个序列末尾的 ``' abcd'`` 相匹配。而只可以匹配 " +"``'abcd'``,并且是匹配第二个序列最左边的 ``'abcd'``:" + +#: ../../library/difflib.rst:456 +msgid "If no blocks match, this returns ``(alo, blo, 0)``." +msgstr "如果未找到匹配块,此方法将返回 ``(alo, blo, 0)``。" + +#: ../../library/difflib.rst:458 +msgid "This method returns a :term:`named tuple` ``Match(a, b, size)``." +msgstr "此方法将返回一个 :term:`named tuple` ``Match(a, b, size)``。" + +#: ../../library/difflib.rst:460 +msgid "Added default arguments." +msgstr "加入默认参数。" + +#: ../../library/difflib.rst:466 +msgid "" +"Return list of triples describing non-overlapping matching subsequences. " +"Each triple is of the form ``(i, j, n)``, and means that ``a[i:i+n] == " +"b[j:j+n]``. The triples are monotonically increasing in *i* and *j*." +msgstr "" +"返回描述非重叠匹配子序列的三元组列表。每个三元组的形式为 ``(i, j, n)``,其含义为 ``a[i:i+n] == b[j:j+n]``。 " +"这些三元组按 *i* 和 *j* 单调递增排列。" + +#: ../../library/difflib.rst:471 +msgid "" +"The last triple is a dummy, and has the value ``(len(a), len(b), 0)``. It " +"is the only triple with ``n == 0``. If ``(i, j, n)`` and ``(i', j', n')`` " +"are adjacent triples in the list, and the second is not the last triple in " +"the list, then ``i+n < i'`` or ``j+n < j'``; in other words, adjacent " +"triples always describe non-adjacent equal blocks." +msgstr "" +"最后一个三元组用于占位,其值为 ``(len(a), len(b), 0)``。它是唯一 ``n == 0`` 的三元组。如果 ``(i, j, " +"n)`` 和 ``(i', j', n')`` 是在列表中相邻的三元组,且后者不是列表中的最后一个三元组,则 ``i+n < i'`` 或 ``j+n " +"< j'``;换句话说,相邻的三元组总是描述非相邻的相等块。" + +#: ../../library/difflib.rst:479 +msgid "" +">>> s = SequenceMatcher(None, \"abxcd\", \"abcd\")\n" +">>> s.get_matching_blocks()\n" +"[Match(a=0, b=0, size=2), Match(a=3, b=2, size=2), Match(a=5, b=4, size=0)]" +msgstr "" +">>> s = SequenceMatcher(None, \"abxcd\", \"abcd\")\n" +">>> s.get_matching_blocks()\n" +"[Match(a=0, b=0, size=2), Match(a=3, b=2, size=2), Match(a=5, b=4, size=0)]" + +#: ../../library/difflib.rst:488 +msgid "" +"Return list of 5-tuples describing how to turn *a* into *b*. Each tuple is " +"of the form ``(tag, i1, i2, j1, j2)``. The first tuple has ``i1 == j1 == " +"0``, and remaining tuples have *i1* equal to the *i2* from the preceding " +"tuple, and, likewise, *j1* equal to the previous *j2*." +msgstr "" +"返回描述如何将 *a* 变为 *b* 的 5 元组列表,每个元组的形式为 ``(tag, i1, i2, j1, j2)``。在第一个元组中 ``i1 " +"== j1 == 0``,而在其余的元组中 *i1* 等于前一个元组的 *i2*,并且 *j1* 也等于前一个元组的 *j2*。" + +#: ../../library/difflib.rst:493 +msgid "The *tag* values are strings, with these meanings:" +msgstr "*tag* 值为字符串,其含义如下:" + +#: ../../library/difflib.rst:496 +msgid "Value" +msgstr "值" + +#: ../../library/difflib.rst:498 +msgid "``'replace'``" +msgstr "``'replace'``" + +#: ../../library/difflib.rst:498 +msgid "``a[i1:i2]`` should be replaced by ``b[j1:j2]``." +msgstr "``a[i1:i2]`` 应由 ``b[j1:j2]`` 替换。" + +#: ../../library/difflib.rst:501 +msgid "``'delete'``" +msgstr "``'delete'``" + +#: ../../library/difflib.rst:501 +msgid "``a[i1:i2]`` should be deleted. Note that ``j1 == j2`` in this case." +msgstr "``a[i1:i2]`` 应被删除。请注意在此情况下 ``j1 == j2``。" + +#: ../../library/difflib.rst:504 +msgid "``'insert'``" +msgstr "``'insert'``" + +#: ../../library/difflib.rst:504 +msgid "" +"``b[j1:j2]`` should be inserted at ``a[i1:i1]``. Note that ``i1 == i2`` in " +"this case." +msgstr "``b[j1:j2]`` 应插入到 ``a[i1:i1]``。请注意在此情况下 ``i1 == i2``。" + +#: ../../library/difflib.rst:508 +msgid "``'equal'``" +msgstr "``'equal'``" + +#: ../../library/difflib.rst:508 +msgid "``a[i1:i2] == b[j1:j2]`` (the sub-sequences are equal)." +msgstr "``a[i1:i2] == b[j1:j2]`` (两个子序列相同)。" + +#: ../../library/difflib.rst:512 +msgid "For example::" +msgstr "例如:" + +#: ../../library/difflib.rst:514 +msgid "" +">>> a = \"qabxcd\"\n" +">>> b = \"abycdf\"\n" +">>> s = SequenceMatcher(None, a, b)\n" +">>> for tag, i1, i2, j1, j2 in s.get_opcodes():\n" +"... print('{:7} a[{}:{}] --> b[{}:{}] {!r:>8} --> {!r}'.format(\n" +"... tag, i1, i2, j1, j2, a[i1:i2], b[j1:j2]))\n" +"delete a[0:1] --> b[0:0] 'q' --> ''\n" +"equal a[1:3] --> b[0:2] 'ab' --> 'ab'\n" +"replace a[3:4] --> b[2:3] 'x' --> 'y'\n" +"equal a[4:6] --> b[3:5] 'cd' --> 'cd'\n" +"insert a[6:6] --> b[5:6] '' --> 'f'" +msgstr "" +">>> a = \"qabxcd\"\n" +">>> b = \"abycdf\"\n" +">>> s = SequenceMatcher(None, a, b)\n" +">>> for tag, i1, i2, j1, j2 in s.get_opcodes():\n" +"... print('{:7} a[{}:{}] --> b[{}:{}] {!r:>8} --> {!r}'.format(\n" +"... tag, i1, i2, j1, j2, a[i1:i2], b[j1:j2]))\n" +"delete a[0:1] --> b[0:0] 'q' --> ''\n" +"equal a[1:3] --> b[0:2] 'ab' --> 'ab'\n" +"replace a[3:4] --> b[2:3] 'x' --> 'y'\n" +"equal a[4:6] --> b[3:5] 'cd' --> 'cd'\n" +"insert a[6:6] --> b[5:6] '' --> 'f'" + +#: ../../library/difflib.rst:529 +msgid "Return a :term:`generator` of groups with up to *n* lines of context." +msgstr "返回一个带有最多 *n* 行上下文的分组的 :term:`generator`。" + +#: ../../library/difflib.rst:531 +msgid "" +"Starting with the groups returned by :meth:`get_opcodes`, this method splits" +" out smaller change clusters and eliminates intervening ranges which have no" +" changes." +msgstr "从 :meth:`get_opcodes` 所返回的组开始,此方法会拆分出较小的更改簇并消除没有更改的间隔区域。" + +#: ../../library/difflib.rst:535 +msgid "The groups are returned in the same format as :meth:`get_opcodes`." +msgstr "这些分组以与 :meth:`get_opcodes` 相同的格式返回。" + +#: ../../library/difflib.rst:540 +msgid "" +"Return a measure of the sequences' similarity as a float in the range [0, " +"1]." +msgstr "返回一个取值范围 [0, 1] 的浮点数作为序列相似性度量。" + +#: ../../library/difflib.rst:543 +msgid "" +"Where T is the total number of elements in both sequences, and M is the " +"number of matches, this is 2.0\\*M / T. Note that this is ``1.0`` if the " +"sequences are identical, and ``0.0`` if they have nothing in common." +msgstr "" +"其中 T 是两个序列中元素的总数量,M 是匹配的数量,即 2.0\\*M / T。请注意如果两个序列完全相同则该值为 " +"``1.0``,如果两者完全不同则为 ``0.0``。" + +#: ../../library/difflib.rst:547 +msgid "" +"This is expensive to compute if :meth:`get_matching_blocks` or " +":meth:`get_opcodes` hasn't already been called, in which case you may want " +"to try :meth:`quick_ratio` or :meth:`real_quick_ratio` first to get an upper" +" bound." +msgstr "" +"如果 :meth:`get_matching_blocks` 或 :meth:`get_opcodes` " +"尚未被调用则此方法运算消耗较大,在此情况下你可能需要先调用 :meth:`quick_ratio` 或 :meth:`real_quick_ratio`" +" 来获取一个上界。" + +#: ../../library/difflib.rst:554 +msgid "" +"Caution: The result of a :meth:`ratio` call may depend on the order of the " +"arguments. For instance::" +msgstr "注意::meth:`ratio` 调用的结果可能会取决于参数的顺序。例如::" + +#: ../../library/difflib.rst:557 +msgid "" +">>> SequenceMatcher(None, 'tide', 'diet').ratio()\n" +"0.25\n" +">>> SequenceMatcher(None, 'diet', 'tide').ratio()\n" +"0.5" +msgstr "" +">>> SequenceMatcher(None, 'tide', 'diet').ratio()\n" +"0.25\n" +">>> SequenceMatcher(None, 'diet', 'tide').ratio()\n" +"0.5" + +#: ../../library/difflib.rst:565 +msgid "Return an upper bound on :meth:`ratio` relatively quickly." +msgstr "相对快速地返回一个 :meth:`ratio` 的上界。" + +#: ../../library/difflib.rst:570 +msgid "Return an upper bound on :meth:`ratio` very quickly." +msgstr "非常快速地返回一个 :meth:`ratio` 的上界。" + +#: ../../library/difflib.rst:573 +msgid "" +"The three methods that return the ratio of matching to total characters can " +"give different results due to differing levels of approximation, although " +":meth:`~SequenceMatcher.quick_ratio` and " +":meth:`~SequenceMatcher.real_quick_ratio` are always at least as large as " +":meth:`~SequenceMatcher.ratio`:" +msgstr "" +"这三个返回匹配部分占总字符数之比的方法可能由于不同的近似级别而给出不同的结果,但是 " +":meth:`~SequenceMatcher.quick_ratio` 和 " +":meth:`~SequenceMatcher.real_quick_ratio` 总是会至少与 " +":meth:`~SequenceMatcher.ratio` 一样大:" + +#: ../../library/difflib.rst:590 +msgid "SequenceMatcher examples" +msgstr "" + +#: ../../library/difflib.rst:592 +msgid "This example compares two strings, considering blanks to be \"junk\":" +msgstr "以下示例比较两个字符串,并将空格视为“垃圾”:" + +#: ../../library/difflib.rst:598 +msgid "" +":meth:`~SequenceMatcher.ratio` returns a float in [0, 1], measuring the " +"similarity of the sequences. As a rule of thumb, a " +":meth:`~SequenceMatcher.ratio` value over 0.6 means the sequences are close " +"matches:" +msgstr "" +":meth:`~SequenceMatcher.ratio` 返回一个 [0, 1] 范围内的浮点数,用来衡量序列的相似度。 " +"根据经验,:meth:`~SequenceMatcher.ratio` 值超过 0.6 就意味着两个序列非常接近匹配:" + +#: ../../library/difflib.rst:605 +msgid "" +"If you're only interested in where the sequences match, " +":meth:`~SequenceMatcher.get_matching_blocks` is handy:" +msgstr "如果您只对序列的匹配的位置感兴趣,则 :meth:`~SequenceMatcher.get_matching_blocks` 就很方便:" + +#: ../../library/difflib.rst:614 +msgid "" +"Note that the last tuple returned by " +":meth:`~SequenceMatcher.get_matching_blocks` is always a dummy, ``(len(a), " +"len(b), 0)``, and this is the only case in which the last tuple element " +"(number of elements matched) is ``0``." +msgstr "" +"请注意 :meth:`~SequenceMatcher.get_matching_blocks` 返回的最后一个元组 ``(len(a), " +"len(b), 0)`` 始终只用于占位,这也是元组的末尾元素(匹配的元素个数)为 ``0`` 的唯一情况。" + +#: ../../library/difflib.rst:618 +msgid "" +"If you want to know how to change the first sequence into the second, use " +":meth:`~SequenceMatcher.get_opcodes`:" +msgstr "如果你想要知道如何将第一个序列转成第二个序列,可以使用 :meth:`~SequenceMatcher.get_opcodes`:" + +#: ../../library/difflib.rst:629 +msgid "" +"The :func:`get_close_matches` function in this module which shows how simple" +" code building on :class:`SequenceMatcher` can be used to do useful work." +msgstr "" +"此模块中的 :func:`get_close_matches` 函数显示了如何基于 :class:`SequenceMatcher` " +"构建简单的代码来执行有用的功能。" + +#: ../../library/difflib.rst:633 +msgid "" +"`Simple version control recipe " +"`_ for " +"a small application built with :class:`SequenceMatcher`." +msgstr "" +"针对使用 :class:`SequenceMatcher` 构建的小型应用程序的 `简易版本控制方案 " +"`_." + +#: ../../library/difflib.rst:641 +msgid "Differ objects" +msgstr "" + +#: ../../library/difflib.rst:643 +msgid "" +"Note that :class:`Differ`\\ -generated deltas make no claim to be " +"**minimal** diffs. To the contrary, minimal diffs are often counter-" +"intuitive, because they synch up anywhere possible, sometimes accidental " +"matches 100 pages apart. Restricting synch points to contiguous matches " +"preserves some notion of locality, at the occasional cost of producing a " +"longer diff." +msgstr "" +"请注意 :class:`Differ` 所生成的增量并不保证是 **最小** 差异。 " +"相反,最小差异往往是违反直觉的,因为它们会同步任何可能的地方,有时甚至意外产生相距 100 页的匹配。 " +"将同步点限制为连续匹配保留了一些局部性概念,这偶尔会带来产生更长差异的代价。" + +#: ../../library/difflib.rst:649 +msgid "The :class:`Differ` class has this constructor:" +msgstr ":class:`Differ` 类具有这样的构造器:" + +#: ../../library/difflib.rst:655 +msgid "" +"Optional keyword parameters *linejunk* and *charjunk* are for filter " +"functions (or ``None``):" +msgstr "可选关键字形参 *linejunk* 和 *charjunk* 均为过滤函数 (或为 ``None``):" + +#: ../../library/difflib.rst:658 +msgid "" +"*linejunk*: A function that accepts a single string argument, and returns " +"true if the string is junk. The default is ``None``, meaning that no line " +"is considered junk." +msgstr "" +"*linejunk*: 接受单个字符串作为参数的函数,如果其为垃圾字符串则返回真值。默认值为 ``None``,意味着没有任何行会被视为垃圾行。" + +#: ../../library/difflib.rst:662 +msgid "" +"*charjunk*: A function that accepts a single character argument (a string of" +" length 1), and returns true if the character is junk. The default is " +"``None``, meaning that no character is considered junk." +msgstr "" +"*charjunk*: 接受单个字符(长度为 1 的字符串)作为参数的函数,如果其为垃圾字符则返回真值。默认值为 " +"``None``,意味着没有任何字符会被视为垃圾字符。" + +#: ../../library/difflib.rst:666 +msgid "" +"These junk-filtering functions speed up matching to find differences and do " +"not cause any differing lines or characters to be ignored. Read the " +"description of the :meth:`~SequenceMatcher.find_longest_match` method's " +"*isjunk* parameter for an explanation." +msgstr "" +"这些垃圾过滤函数可加快查找差异的匹配速度,并且不会导致任何差异行或字符被忽略。请阅读 " +":meth:`~SequenceMatcher.find_longest_match` 方法的 *isjunk* 形参的描述了解详情。" + +#: ../../library/difflib.rst:672 +msgid "" +":class:`Differ` objects are used (deltas generated) via a single method:" +msgstr ":class:`Differ` 对象是通过一个单独方法来使用(生成增量)的:" + +#: ../../library/difflib.rst:677 +msgid "" +"Compare two sequences of lines, and generate the delta (a sequence of " +"lines)." +msgstr "比较两个由行组成的序列,并生成增量(一个由行组成的序列)。" + +#: ../../library/difflib.rst:679 +msgid "" +"Each sequence must contain individual single-line strings ending with " +"newlines. Such sequences can be obtained from the " +":meth:`~io.IOBase.readlines` method of file-like objects. The delta " +"generated also consists of newline-terminated strings, ready to be printed " +"as-is via the :meth:`~io.IOBase.writelines` method of a file-like object." +msgstr "" +"每个序列必须包含一个以换行符结尾的单行字符串。这样的序列可以通过文件型对象的 :meth:`~io.IOBase.readlines` 方法来获取。 " +"所生成的增量同样由以换行符结尾的字符串构成,可以通过文件型对象的 :meth:`~io.IOBase.writelines` 方法原样打印出来。" + +#: ../../library/difflib.rst:690 +msgid "Differ example" +msgstr "" + +#: ../../library/difflib.rst:692 +msgid "" +"This example compares two texts. First we set up the texts, sequences of " +"individual single-line strings ending with newlines (such sequences can also" +" be obtained from the :meth:`~io.IOBase.readlines` method of file-like " +"objects):" +msgstr "" +"此示例比较两段文本。首先我们设置文本为以换行符结尾的单行字符串组成的序列(这样的序列也可以通过文件型对象的 " +":meth:`~io.IOBase.readlines` 方法来获取):" + +#: ../../library/difflib.rst:711 +msgid "Next we instantiate a Differ object:" +msgstr "接下来我们实例化一个 Differ 对象:" + +#: ../../library/difflib.rst:715 +msgid "" +"Note that when instantiating a :class:`Differ` object we may pass functions " +"to filter out line and character \"junk.\" See the :meth:`Differ` " +"constructor for details." +msgstr "" +"请注意在实例化 :class:`Differ` 对象时我们可以传入函数来过滤掉“垃圾”行和字符。详情参见 :meth:`Differ` 构造器说明。" + +#: ../../library/difflib.rst:719 +msgid "Finally, we compare the two:" +msgstr "最后,我们比较两个序列:" + +#: ../../library/difflib.rst:723 +msgid "``result`` is a list of strings, so let's pretty-print it:" +msgstr "``result`` 是一个字符串列表,让我们将其美化打印出来:" + +#: ../../library/difflib.rst:738 +msgid "As a single multi-line string it looks like this:" +msgstr "作为单独的多行字符串显示出来则是这样:" + +#: ../../library/difflib.rst:757 +msgid "A command-line interface to difflib" +msgstr "difflib 的命令行接口" + +#: ../../library/difflib.rst:759 +msgid "" +"This example shows how to use difflib to create a ``diff``-like utility." +msgstr "这个例子演示了如何使用 difflib 来创建类似 ``diff`` 的工具。" + +#: ../../library/difflib.rst:761 +msgid "" +"\"\"\" Command-line interface to difflib.py providing diffs in four formats:\n" +"\n" +"* ndiff: lists every line and highlights interline changes.\n" +"* context: highlights clusters of changes in a before/after format.\n" +"* unified: highlights clusters of changes in an inline format.\n" +"* html: generates side by side comparison with change highlights.\n" +"\n" +"\"\"\"\n" +"\n" +"import sys, os, difflib, argparse\n" +"import datetime as dt\n" +"\n" +"def file_mtime(path):\n" +" t = dt.datetime.fromtimestamp(os.stat(path).st_mtime,\n" +" dt.timezone.utc)\n" +" return t.astimezone().isoformat()\n" +"\n" +"def main():\n" +"\n" +" parser = argparse.ArgumentParser()\n" +" parser.add_argument('-c', action='store_true', default=False,\n" +" help='Produce a context format diff (default)')\n" +" parser.add_argument('-u', action='store_true', default=False,\n" +" help='Produce a unified format diff')\n" +" parser.add_argument('-m', action='store_true', default=False,\n" +" help='Produce HTML side by side diff '\n" +" '(can use -c and -l in conjunction)')\n" +" parser.add_argument('-n', action='store_true', default=False,\n" +" help='Produce a ndiff format diff')\n" +" parser.add_argument('-l', '--lines', type=int, default=3,\n" +" help='Set number of context lines (default 3)')\n" +" parser.add_argument('fromfile')\n" +" parser.add_argument('tofile')\n" +" options = parser.parse_args()\n" +"\n" +" n = options.lines\n" +" fromfile = options.fromfile\n" +" tofile = options.tofile\n" +"\n" +" fromdate = file_mtime(fromfile)\n" +" todate = file_mtime(tofile)\n" +" with open(fromfile) as ff:\n" +" fromlines = ff.readlines()\n" +" with open(tofile) as tf:\n" +" tolines = tf.readlines()\n" +"\n" +" if options.u:\n" +" diff = difflib.unified_diff(fromlines, tolines, fromfile, tofile, fromdate, todate, n=n)\n" +" elif options.n:\n" +" diff = difflib.ndiff(fromlines, tolines)\n" +" elif options.m:\n" +" diff = difflib.HtmlDiff().make_file(fromlines,tolines,fromfile,tofile,context=options.c,numlines=n)\n" +" else:\n" +" diff = difflib.context_diff(fromlines, tolines, fromfile, tofile, fromdate, todate, n=n)\n" +"\n" +" sys.stdout.writelines(diff)\n" +"\n" +"if __name__ == '__main__':\n" +" main()\n" +msgstr "" + +#: ../../library/difflib.rst:764 +msgid "ndiff example" +msgstr "ndiff 示例" + +#: ../../library/difflib.rst:766 +msgid "This example shows how to use :func:`difflib.ndiff`." +msgstr "这个例子演示了如何使用 :func:`difflib.ndiff`。" + +#: ../../library/difflib.rst:768 +msgid "" +"\"\"\"ndiff [-q] file1 file2\n" +" or\n" +"ndiff (-r1 | -r2) < ndiff_output > file1_or_file2\n" +"\n" +"Print a human-friendly file difference report to stdout. Both inter-\n" +"and intra-line differences are noted. In the second form, recreate file1\n" +"(-r1) or file2 (-r2) on stdout, from an ndiff report on stdin.\n" +"\n" +"In the first form, if -q (\"quiet\") is not specified, the first two lines\n" +"of output are\n" +"\n" +"-: file1\n" +"+: file2\n" +"\n" +"Each remaining line begins with a two-letter code:\n" +"\n" +" \"- \" line unique to file1\n" +" \"+ \" line unique to file2\n" +" \" \" line common to both files\n" +" \"? \" line not present in either input file\n" +"\n" +"Lines beginning with \"? \" attempt to guide the eye to intraline\n" +"differences, and were not present in either input file. These lines can be\n" +"confusing if the source files contain tab characters.\n" +"\n" +"The first file can be recovered by retaining only lines that begin with\n" +"\" \" or \"- \", and deleting those 2-character prefixes; use ndiff with -r1.\n" +"\n" +"The second file can be recovered similarly, but by retaining only \" \" and\n" +"\"+ \" lines; use ndiff with -r2; or, on Unix, the second file can be\n" +"recovered by piping the output through\n" +"\n" +" sed -n '/^[+ ] /s/^..//p'\n" +"\"\"\"\n" +"\n" +"__version__ = 1, 7, 0\n" +"\n" +"import difflib, sys\n" +"\n" +"def fail(msg):\n" +" out = sys.stderr.write\n" +" out(msg + \"\\n\\n\")\n" +" out(__doc__)\n" +" return 0\n" +"\n" +"# open a file & return the file object; gripe and return 0 if it\n" +"# couldn't be opened\n" +"def fopen(fname):\n" +" try:\n" +" return open(fname)\n" +" except IOError as detail:\n" +" return fail(\"couldn't open \" + fname + \": \" + str(detail))\n" +"\n" +"# open two files & spray the diff to stdout; return false iff a problem\n" +"def fcompare(f1name, f2name):\n" +" f1 = fopen(f1name)\n" +" f2 = fopen(f2name)\n" +" if not f1 or not f2:\n" +" return 0\n" +"\n" +" a = f1.readlines(); f1.close()\n" +" b = f2.readlines(); f2.close()\n" +" for line in difflib.ndiff(a, b):\n" +" print(line, end=' ')\n" +"\n" +" return 1\n" +"\n" +"# crack args (sys.argv[1:] is normal) & compare;\n" +"# return false iff a problem\n" +"\n" +"def main(args):\n" +" import getopt\n" +" try:\n" +" opts, args = getopt.getopt(args, \"qr:\")\n" +" except getopt.error as detail:\n" +" return fail(str(detail))\n" +" noisy = 1\n" +" qseen = rseen = 0\n" +" for opt, val in opts:\n" +" if opt == \"-q\":\n" +" qseen = 1\n" +" noisy = 0\n" +" elif opt == \"-r\":\n" +" rseen = 1\n" +" whichfile = val\n" +" if qseen and rseen:\n" +" return fail(\"can't specify both -q and -r\")\n" +" if rseen:\n" +" if args:\n" +" return fail(\"no args allowed with -r option\")\n" +" if whichfile in (\"1\", \"2\"):\n" +" restore(whichfile)\n" +" return 1\n" +" return fail(\"-r value must be 1 or 2\")\n" +" if len(args) != 2:\n" +" return fail(\"need 2 filename args\")\n" +" f1name, f2name = args\n" +" if noisy:\n" +" print('-:', f1name)\n" +" print('+:', f2name)\n" +" return fcompare(f1name, f2name)\n" +"\n" +"# read ndiff output from stdin, and print file1 (which=='1') or\n" +"# file2 (which=='2') to stdout\n" +"\n" +"def restore(which):\n" +" restored = difflib.restore(sys.stdin.readlines(), which)\n" +" sys.stdout.writelines(restored)\n" +"\n" +"if __name__ == '__main__':\n" +" main(sys.argv[1:])\n" +msgstr "" +"\"\"\"ndiff [-q] file1 file2\n" +" 或\n" +"ndiff (-r1 | -r2) < ndiff_output > file1_or_file2\n" +"\n" +"打印对人类友好的文件差异报告至标准输出。将会标明\n" +"行间与行内差异。在第二种形式下,会根据标准输入上的\n" +"ndiff 报告在标准输出上重建 file1 (-r1) 或 file2 (-r2)。\n" +"\n" +"在第一种形式下,如果未指明 -q (\"quiet\"),则输出的\n" +"前两行为\n" +"\n" +"-: file1\n" +"+: file2\n" +"\n" +"其余的每一行将以两个字符的代码打头:\n" +"\n" +" \"- \" 行为 file1 所独有\n" +" \"+ \" 行为 file2 所独有\n" +" \" \" 行在两个文件中相同\n" +" \"? \" 行不存在于某一个输入文件\n" +"\n" +"以 \"? \" 打头的行会尝试关注行内差异,并且\n" +"不存在于某一个输入文件中。当源文件包含\n" +"制表符时这些行可能会令人迷惑。\n" +"\n" +"第一个文件可通过只保留以\" \" 或 \"- \" 打头的行,\n" +"并删除那些 2 字符前缀来恢复;使用 ndiff 时传入 -r1。\n" +"\n" +"第二个文件可通过类似方式来恢复,即只保留\n" +"\" \" 和 \"+ \" 打头的行;使用 ndiff 并传入 -r2;或者\n" +"在 Unix 上,第二个文件可通过管道操作来恢复\n" +"\n" +" sed -n '/^[+ ] /s/^..//p'\n" +"\"\"\"\n" +"\n" +"__version__ = 1, 7, 0\n" +"\n" +"import difflib, sys\n" +"\n" +"def fail(msg):\n" +" out = sys.stderr.write\n" +" out(msg + \"\\n\\n\")\n" +" out(__doc__)\n" +" return 0\n" +"\n" +"# 打开一个文件并返回文件对象;如无法打开文件\n" +"# 则返回 0\n" +"def fopen(fname):\n" +" try:\n" +" return open(fname)\n" +" except IOError as detail:\n" +" return fail(\"couldn't open \" + fname + \": \" + str(detail))\n" +"\n" +"# 打开两个文件并报告差异至标准输出;如有问题则返回假值\n" +"def fcompare(f1name, f2name):\n" +" f1 = fopen(f1name)\n" +" f2 = fopen(f2name)\n" +" if not f1 or not f2:\n" +" return 0\n" +"\n" +" a = f1.readlines(); f1.close()\n" +" b = f2.readlines(); f2.close()\n" +" for line in difflib.ndiff(a, b):\n" +" print(line, end=' ')\n" +"\n" +" return 1\n" +"\n" +"# 解析参数 (sys.argv[1:] 正常) 并进行比较;\n" +"# 如有问题则返回假值\n" +"\n" +"def main(args):\n" +" import getopt\n" +" try:\n" +" opts, args = getopt.getopt(args, \"qr:\")\n" +" except getopt.error as detail:\n" +" return fail(str(detail))\n" +" noisy = 1\n" +" qseen = rseen = 0\n" +" for opt, val in opts:\n" +" if opt == \"-q\":\n" +" qseen = 1\n" +" noisy = 0\n" +" elif opt == \"-r\":\n" +" rseen = 1\n" +" whichfile = val\n" +" if qseen and rseen:\n" +" return fail(\"can't specify both -q and -r\")\n" +" if rseen:\n" +" if args:\n" +" return fail(\"no args allowed with -r option\")\n" +" if whichfile in (\"1\", \"2\"):\n" +" restore(whichfile)\n" +" return 1\n" +" return fail(\"-r value must be 1 or 2\")\n" +" if len(args) != 2:\n" +" return fail(\"need 2 filename args\")\n" +" f1name, f2name = args\n" +" if noisy:\n" +" print('-:', f1name)\n" +" print('+:', f2name)\n" +" return fcompare(f1name, f2name)\n" +"\n" +"# 从标准输入读取 ndiff 输出,并打印 file1 (which=='1') 或\n" +"# file2 (which=='2') 到标准输出\n" +"\n" +"def restore(which):\n" +" restored = difflib.restore(sys.stdin.readlines(), which)\n" +" sys.stdout.writelines(restored)\n" +"\n" +"if __name__ == '__main__':\n" +" main(sys.argv[1:])\n" diff --git a/library/dis.po b/library/dis.po new file mode 100644 index 0000000000..ae3cf140a8 --- /dev/null +++ b/library/dis.po @@ -0,0 +1,2608 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/dis.rst:2 +msgid ":mod:`!dis` --- Disassembler for Python bytecode" +msgstr ":mod:`!dis` --- Python 字节码反汇编器" + +#: ../../library/dis.rst:7 +msgid "**Source code:** :source:`Lib/dis.py`" +msgstr "**源代码:** :source:`Lib/dis.py`" + +#: ../../library/dis.rst:17 +msgid "" +"The :mod:`!dis` module supports the analysis of CPython :term:`bytecode` by " +"disassembling it. The CPython bytecode which this module takes as an input " +"is defined in the file :file:`Include/opcode.h` and used by the compiler and" +" the interpreter." +msgstr "" + +#: ../../library/dis.rst:24 +msgid "" +"Bytecode is an implementation detail of the CPython interpreter. No " +"guarantees are made that bytecode will not be added, removed, or changed " +"between versions of Python. Use of this module should not be considered to " +"work across Python VMs or Python releases." +msgstr "" +"字节码是 CPython 解释器的实现细节。不保证不会在 Python 版本之间添加、删除或更改字节码。不应认为此模块可以跨 Python VM 或 " +"Python 版本使用。" + +#: ../../library/dis.rst:29 +msgid "" +"Use 2 bytes for each instruction. Previously the number of bytes varied by " +"instruction." +msgstr "每条指令使用 2 个字节。以前字节数因指令而异。" + +#: ../../library/dis.rst:33 +msgid "" +"The argument of jump, exception handling and loop instructions is now the " +"instruction offset rather than the byte offset." +msgstr "跳转、异常处理和循环指令的参数现在将为指令偏移量而不是字节偏移量。" + +#: ../../library/dis.rst:37 +msgid "" +"Some instructions are accompanied by one or more inline cache entries, which" +" take the form of :opcode:`CACHE` instructions. These instructions are " +"hidden by default, but can be shown by passing ``show_caches=True`` to any " +":mod:`!dis` utility. Furthermore, the interpreter now adapts the bytecode to" +" specialize it for different runtime conditions. The adaptive bytecode can " +"be shown by passing ``adaptive=True``." +msgstr "" + +#: ../../library/dis.rst:45 +msgid "" +"The argument of a jump is the offset of the target instruction relative to " +"the instruction that appears immediately after the jump instruction's " +":opcode:`CACHE` entries." +msgstr "跳转的参数是目标指令相对于紧接在跳转指令的 :opcode:`CACHE` 条目之后的指令的偏移量。" + +#: ../../library/dis.rst:50 +msgid "" +"As a consequence, the presence of the :opcode:`CACHE` instructions is " +"transparent for forward jumps but needs to be taken into account when " +"reasoning about backward jumps." +msgstr "因此,:opcode:`CACHE` 指令的存在对前向跳转是透明的但在处理后向跳转时则需要将其纳入考虑。" + +#: ../../library/dis.rst:54 +msgid "" +"The output shows logical labels rather than instruction offsets for jump " +"targets and exception handlers. The ``-O`` command line option and the " +"``show_offsets`` argument were added." +msgstr "对于跳转目标和异常处理器输出将显示逻辑标签而不是指令偏移量。增加了 ``-O`` 命令行选项和 ``show_offsets`` 参数。" + +#: ../../library/dis.rst:59 +msgid "" +"The :option:`-P ` command-line option and the " +"``show_positions`` argument were added." +msgstr "增加了 :option:`-P ` 命令行选项和 ``show_positions`` 参数。" + +#: ../../library/dis.rst:63 +msgid "The :option:`-S ` command-line option is added." +msgstr "增加了 :option:`-S ` 命令行选项。" + +#: ../../library/dis.rst:65 +msgid "Example: Given the function :func:`!myfunc`::" +msgstr "示例:给定函数 :func:`!myfunc`::" + +#: ../../library/dis.rst:67 +msgid "" +"def myfunc(alist):\n" +" return len(alist)" +msgstr "" +"def myfunc(alist):\n" +" return len(alist)" + +#: ../../library/dis.rst:70 +msgid "" +"the following command can be used to display the disassembly of " +":func:`!myfunc`:" +msgstr "可以使用以下命令显示 :func:`!myfunc` 的反汇编:" + +#: ../../library/dis.rst:73 +msgid "" +">>> dis.dis(myfunc)\n" +" 2 RESUME 0\n" +"\n" +" 3 LOAD_GLOBAL 1 (len + NULL)\n" +" LOAD_FAST_BORROW 0 (alist)\n" +" CALL 1\n" +" RETURN_VALUE" +msgstr "" +">>> dis.dis(myfunc)\n" +" 2 RESUME 0\n" +"\n" +" 3 LOAD_GLOBAL 1 (len + NULL)\n" +" LOAD_FAST_BORROW 0 (alist)\n" +" CALL 1\n" +" RETURN_VALUE" + +#: ../../library/dis.rst:83 +msgid "(The \"2\" is a line number)." +msgstr "(\"2\" 是行号)。" + +#: ../../library/dis.rst:88 +msgid "Command-line interface" +msgstr "命令行接口" + +#: ../../library/dis.rst:90 +msgid "" +"The :mod:`!dis` module can be invoked as a script from the command line:" +msgstr "" + +#: ../../library/dis.rst:92 +msgid "python -m dis [-h] [-C] [-O] [-P] [-S] [infile]" +msgstr "python -m dis [-h] [-C] [-O] [-P] [-S] [infile]" + +#: ../../library/dis.rst:96 +msgid "The following options are accepted:" +msgstr "可以接受以下选项:" + +#: ../../library/dis.rst:102 +msgid "Display usage and exit." +msgstr "显示用法并退出。" + +#: ../../library/dis.rst:106 +msgid "Show inline caches." +msgstr "显示内联缓存。" + +#: ../../library/dis.rst:112 +msgid "Show offsets of instructions." +msgstr "显示指令偏移量。" + +#: ../../library/dis.rst:118 +msgid "Show positions of instructions in the source code." +msgstr "在源代码中显示指令的位置。" + +#: ../../library/dis.rst:124 +msgid "Show specialized bytecode." +msgstr "显示专门化的字节码。" + +#: ../../library/dis.rst:128 +msgid "" +"If :file:`infile` is specified, its disassembled code will be written to " +"stdout. Otherwise, disassembly is performed on compiled source code received" +" from stdin." +msgstr "如果指定了 :file:`infile`,其反汇编代码将被写入到标准输出。在其他情况下,反汇编将在从标准输入接收的已编译源代码上进行。" + +#: ../../library/dis.rst:132 +msgid "Bytecode analysis" +msgstr "字节码分析" + +#: ../../library/dis.rst:136 +msgid "" +"The bytecode analysis API allows pieces of Python code to be wrapped in a " +":class:`Bytecode` object that provides easy access to details of the " +"compiled code." +msgstr "字节码分析 API 允许将 Python 代码片段包装在 :class:`Bytecode` 对象中,以便轻松访问已编译代码的详细信息。" + +#: ../../library/dis.rst:144 +msgid "" +"Analyse the bytecode corresponding to a function, generator, asynchronous " +"generator, coroutine, method, string of source code, or a code object (as " +"returned by :func:`compile`)." +msgstr "分析与函数、生成器、异步生成器、协程、方法、源代码字符串或代码对象(由 :func:`compile` 返回)相对应的字节码。" + +#: ../../library/dis.rst:148 +msgid "" +"This is a convenience wrapper around many of the functions listed below, " +"most notably :func:`get_instructions`, as iterating over a :class:`Bytecode`" +" instance yields the bytecode operations as :class:`Instruction` instances." +msgstr "" +"这是下面列出的许多函数的便利包装,最值得注意的是 :func:`get_instructions`,迭代于 :class:`Bytecode` " +"的实例产生字节码操作 :class:`Instruction` 的实例。" + +#: ../../library/dis.rst:152 ../../library/dis.rst:373 +msgid "" +"If *first_line* is not ``None``, it indicates the line number that should be" +" reported for the first source line in the disassembled code. Otherwise, " +"the source line information (if any) is taken directly from the disassembled" +" code object." +msgstr "" +"如果 *first_line* 不是 ``None`` " +",则表示应该为反汇编代码中的第一个源代码行报告的行号。否则,源行信息(如果有的话)直接来自反汇编的代码对象。" + +#: ../../library/dis.rst:157 +msgid "" +"If *current_offset* is not ``None``, it refers to an instruction offset in " +"the disassembled code. Setting this means :meth:`.dis` will display a " +"\"current instruction\" marker against the specified opcode." +msgstr "" +"如果 *current_offset* 不是 ``None``,它指的就是反汇编代码中的指令偏移量。设置它意味着 :meth:`.dis` " +"将针对指定的操作码显示“当前指令”标记。" + +#: ../../library/dis.rst:161 +msgid "" +"If *show_caches* is ``True``, :meth:`.dis` will display inline cache entries" +" used by the interpreter to specialize the bytecode." +msgstr "如果 *show_caches* 为 ``True``,:meth:`.dis` 将显示解释器用来专门化字节码的内联缓存条目。" + +#: ../../library/dis.rst:164 +msgid "" +"If *adaptive* is ``True``, :meth:`.dis` will display specialized bytecode " +"that may be different from the original bytecode." +msgstr "如果 *adaptive* 为 ``True``,:meth:`.dis` 将显示可能不同于原始字节码的专门化字节码。" + +#: ../../library/dis.rst:167 +msgid "" +"If *show_offsets* is ``True``, :meth:`.dis` will include instruction offsets" +" in the output." +msgstr "若 *show_offsets* 是 ``True``,:meth:`.dis` 的输出将会显示指令偏移量。" + +#: ../../library/dis.rst:170 +msgid "" +"If *show_positions* is ``True``, :meth:`.dis` will include instruction " +"source code positions in the output." +msgstr "如果 *show_positions* 为 ``True``,:meth:`.dis` 将在输出中包括指令源代码位置。" + +#: ../../library/dis.rst:175 +msgid "" +"Construct a :class:`Bytecode` instance from the given traceback, setting " +"*current_offset* to the instruction responsible for the exception." +msgstr "从给定回溯构造一个 :class:`Bytecode` 实例,将 *current_offset* 设为导致异常的指令。" + +#: ../../library/dis.rst:180 +msgid "The compiled code object." +msgstr "已编译的代码对象。" + +#: ../../library/dis.rst:184 +msgid "The first source line of the code object (if available)" +msgstr "代码对象的第一个源代码行(如果可用)" + +#: ../../library/dis.rst:188 +msgid "" +"Return a formatted view of the bytecode operations (the same as printed by " +":func:`dis.dis`, but returned as a multi-line string)." +msgstr "返回字节码操作的格式化视图(与 :func:`dis.dis` 打印相同,但作为多行字符串返回)。" + +#: ../../library/dis.rst:193 +msgid "" +"Return a formatted multi-line string with detailed information about the " +"code object, like :func:`code_info`." +msgstr "返回带有关于代码对象的详细信息的格式化多行字符串,如 :func:`code_info`。" + +#: ../../library/dis.rst:196 ../../library/dis.rst:242 +#: ../../library/dis.rst:295 +msgid "This can now handle coroutine and asynchronous generator objects." +msgstr "现在可以处理协程和异步生成器对象。" + +#: ../../library/dis.rst:199 ../../library/dis.rst:298 +#: ../../library/dis.rst:320 ../../library/dis.rst:356 +#: ../../library/dis.rst:382 +msgid "Added the *show_caches* and *adaptive* parameters." +msgstr "增加了 *show_caches* 和 *adaptive* 形参。" + +#: ../../library/dis.rst:202 +msgid "Added the *show_offsets* parameter" +msgstr "增加了 *show_offsets* 形参" + +#: ../../library/dis.rst:205 ../../library/dis.rst:304 +#: ../../library/dis.rst:326 ../../library/dis.rst:362 +msgid "Added the *show_positions* parameter." +msgstr "增加了 *show_positions* 形参。" + +#: ../../library/dis.rst:208 +msgid "Example:" +msgstr "示例:" + +#: ../../library/dis.rst:210 +msgid "" +">>> bytecode = dis.Bytecode(myfunc)\n" +">>> for instr in bytecode:\n" +"... print(instr.opname)\n" +"...\n" +"RESUME\n" +"LOAD_GLOBAL\n" +"LOAD_FAST_BORROW\n" +"CALL\n" +"RETURN_VALUE" +msgstr "" +">>> bytecode = dis.Bytecode(myfunc)\n" +">>> for instr in bytecode:\n" +"... print(instr.opname)\n" +"...\n" +"RESUME\n" +"LOAD_GLOBAL\n" +"LOAD_FAST_BORROW\n" +"CALL\n" +"RETURN_VALUE" + +#: ../../library/dis.rst:224 +msgid "Analysis functions" +msgstr "分析函数" + +#: ../../library/dis.rst:226 +msgid "" +"The :mod:`!dis` module also defines the following analysis functions that " +"convert the input directly to the desired output. They can be useful if only" +" a single operation is being performed, so the intermediate analysis object " +"isn't useful:" +msgstr "" + +#: ../../library/dis.rst:232 +msgid "" +"Return a formatted multi-line string with detailed code object information " +"for the supplied function, generator, asynchronous generator, coroutine, " +"method, source code string or code object." +msgstr "返回格式化的多行字符串,其中包含所提供的函数、生成器、异步生成器、协程、方法、源代码字符串或代码对象的详细代码对象信息。" + +#: ../../library/dis.rst:236 +msgid "" +"Note that the exact contents of code info strings are highly implementation " +"dependent and they may change arbitrarily across Python VMs or Python " +"releases." +msgstr "请注意,代码信息字符串的确切内容是高度依赖于实现的,它们可能会在 Python VM 或 Python 版本中任意更改。" + +#: ../../library/dis.rst:248 +msgid "" +"Print detailed code object information for the supplied function, method, " +"source code string or code object to *file* (or ``sys.stdout`` if *file* is " +"not specified)." +msgstr "" +"将提供的函数、方法、源代码字符串或代码对象的详细代码对象信息打印到 *file* (如果未指定 *file* ,则为 ``sys.stdout``)。" + +#: ../../library/dis.rst:252 +msgid "" +"This is a convenient shorthand for ``print(code_info(x), file=file)``, " +"intended for interactive exploration at the interpreter prompt." +msgstr "这是 ``print(code_info(x), file=file)`` 的便捷简写,用于在解释器提示符下进行交互式探索。" + +#: ../../library/dis.rst:257 ../../library/dis.rst:289 +#: ../../library/dis.rst:317 ../../library/dis.rst:353 +msgid "Added *file* parameter." +msgstr "添加 *file* 形参。" + +#: ../../library/dis.rst:264 +msgid "" +"Disassemble the *x* object. *x* can denote either a module, a class, a " +"method, a function, a generator, an asynchronous generator, a coroutine, a " +"code object, a string of source code or a byte sequence of raw bytecode. For" +" a module, it disassembles all functions. For a class, it disassembles all " +"methods (including class and static methods). For a code object or sequence " +"of raw bytecode, it prints one line per bytecode instruction. It also " +"recursively disassembles nested code objects. These can include generator " +"expressions, nested functions, the bodies of nested classes, and the code " +"objects used for :ref:`annotation scopes `. Strings are " +"first compiled to code objects with the :func:`compile` built-in function " +"before being disassembled. If no object is provided, this function " +"disassembles the last traceback." +msgstr "" +"反汇编 *x* 对象。 *x* 可以表示模块、类、方法、函数、生成器、异步生成器、协程、代码对象、源代码字符串或原始字节码的字节序列。 " +"对于模块,它会反汇编所有函数。对于一个类,它会反汇编所有方法(包括类方法和静态方法)。对于代码对象或原始字节码序列,它会为每条字节码指令打印一行。 " +"它还会递归地反汇编嵌套代码对象。这些对象包括生成器表达式、嵌套函数、嵌套类的语句体以及用于 :ref:`标注作用域 ` 的代码对象。在反汇编之前,首先使用 :func:`compile` 内置函数将字符串编译为代码对象。 " +"如果未提供任何对象,则该函数将反汇编最后一次回溯。" + +#: ../../library/dis.rst:277 ../../library/dis.rst:314 +#: ../../library/dis.rst:350 +msgid "" +"The disassembly is written as text to the supplied *file* argument if " +"provided and to ``sys.stdout`` otherwise." +msgstr "如果提供的话,反汇编将作为文本写入提供的 *file* 参数,否则写入 ``sys.stdout``。" + +#: ../../library/dis.rst:280 +msgid "" +"The maximal depth of recursion is limited by *depth* unless it is ``None``. " +"``depth=0`` means no recursion." +msgstr "递归的最大深度受 *depth* 限制,除非它是 ``None``。``depth=0`` 表示没有递归。" + +#: ../../library/dis.rst:283 +msgid "" +"If *show_caches* is ``True``, this function will display inline cache " +"entries used by the interpreter to specialize the bytecode." +msgstr "如果 *show_caches* 为 ``True``,此函数将显示解释器用来专门化字节码的内联缓存条目。" + +#: ../../library/dis.rst:286 +msgid "" +"If *adaptive* is ``True``, this function will display specialized bytecode " +"that may be different from the original bytecode." +msgstr "如果 *adaptive* 为 ``True``,此函数将显示可能不同于原始字节码的专门化字节码。" + +#: ../../library/dis.rst:292 +msgid "Implemented recursive disassembling and added *depth* parameter." +msgstr "实现了递归反汇编并添加了 *depth* 参数。" + +#: ../../library/dis.rst:301 ../../library/dis.rst:323 +#: ../../library/dis.rst:359 +msgid "Added the *show_offsets* parameter." +msgstr "添加了*show_offsets*参数。" + +#: ../../library/dis.rst:310 +msgid "" +"Disassemble the top-of-stack function of a traceback, using the last " +"traceback if none was passed. The instruction causing the exception is " +"indicated." +msgstr "如果没有传递,则使用最后一个回溯来反汇编回溯的堆栈顶部函数。指示了导致异常的指令。" + +#: ../../library/dis.rst:334 +msgid "" +"Disassemble a code object, indicating the last instruction if *lasti* was " +"provided. The output is divided in the following columns:" +msgstr "反汇编代码对象,如果提供了 *lasti* ,则指示最后一条指令。输出分为以下几列:" + +#: ../../library/dis.rst:337 +msgid "" +"the source code location of the instruction. Complete location information " +"is shown if *show_positions* is true. Otherwise (the default) only the line " +"number is displayed." +msgstr "该指令的源代码位置。如果 *show_positions* 为真值则会显示完整位置信息。否则(默认)只显示行号。" + +#: ../../library/dis.rst:340 +msgid "the current instruction, indicated as ``-->``," +msgstr "当前指令,表示为 ``-->``," + +#: ../../library/dis.rst:341 +msgid "a labelled instruction, indicated with ``>>``," +msgstr "一个标记的指令,用 ``>>`` 表示," + +#: ../../library/dis.rst:342 +msgid "the address of the instruction," +msgstr "指令的地址," + +#: ../../library/dis.rst:343 +msgid "the operation code name," +msgstr "操作码名称," + +#: ../../library/dis.rst:344 +msgid "operation parameters, and" +msgstr "操作参数,和" + +#: ../../library/dis.rst:345 +msgid "interpretation of the parameters in parentheses." +msgstr "括号中参数的解释。" + +#: ../../library/dis.rst:347 +msgid "" +"The parameter interpretation recognizes local and global variable names, " +"constant values, branch targets, and compare operators." +msgstr "参数解释识别本地和全局变量名称、常量值、分支目标和比较运算符。" + +#: ../../library/dis.rst:367 +msgid "" +"Return an iterator over the instructions in the supplied function, method, " +"source code string or code object." +msgstr "在所提供的函数、方法、源代码字符串或代码对象中的指令上返回一个迭代器。" + +#: ../../library/dis.rst:370 +msgid "" +"The iterator generates a series of :class:`Instruction` named tuples giving " +"the details of each operation in the supplied code." +msgstr "迭代器生成一系列 :class:`Instruction` 命名元组,提供所提供代码中每个操作的详细信息。" + +#: ../../library/dis.rst:378 +msgid "The *adaptive* parameter works as it does in :func:`dis`." +msgstr "参数 *adaptive* 和其在 :func:`dis` 中的工作方式一样。" + +#: ../../library/dis.rst:385 +msgid "" +"The *show_caches* parameter is deprecated and has no effect. The iterator " +"generates the :class:`Instruction` instances with the *cache_info* field " +"populated (regardless of the value of *show_caches*) and it no longer " +"generates separate items for the cache entries." +msgstr "" +"*show_caches* 参数被弃用并且失效。迭代器保证 :class:`Instruction` 实例一定有 *cache_info* 字段(无论 " +"*show_caches* 传入什么),不再生成单独的缓存项。" + +#: ../../library/dis.rst:393 +msgid "" +"This generator function uses the :meth:`~codeobject.co_lines` method of the " +":ref:`code object ` *code* to find the offsets which are " +"starts of lines in the source code. They are generated as ``(offset, " +"lineno)`` pairs." +msgstr "" +"这个生成器函数使用 :ref:`代码对象 ` *code* 的 :meth:`~codeobject.co_lines` " +"方法来查找源代码中行开头的偏移量。它们将作为 ``(offset, lineno)`` 对被生成。" + +#: ../../library/dis.rst:398 +msgid "Line numbers can be decreasing. Before, they were always increasing." +msgstr "行号可能会减少。以前,它们总是在增加。" + +#: ../../library/dis.rst:401 +msgid "" +"The :pep:`626` :meth:`~codeobject.co_lines` method is used instead of the " +":attr:`~codeobject.co_firstlineno` and :attr:`!codeobject.co_lnotab` " +"attributes of the :ref:`code object `." +msgstr "" + +#: ../../library/dis.rst:406 +msgid "" +"Line numbers can be ``None`` for bytecode that does not map to source lines." +msgstr "若字节码不对应任何一行,行号可以是 ``None``。" + +#: ../../library/dis.rst:412 +msgid "" +"Detect all offsets in the raw compiled bytecode string *code* which are jump" +" targets, and return a list of these offsets." +msgstr "检测作为跳转目标的原始编译后字节码字符串 *code* 中的所有偏移量,并返回这些偏移量的列表。" + +#: ../../library/dis.rst:418 +msgid "Compute the stack effect of *opcode* with argument *oparg*." +msgstr "使用参数 *oparg* 计算 *opcode* 的堆栈效果。" + +#: ../../library/dis.rst:420 +msgid "" +"If the code has a jump target and *jump* is ``True``, :func:`~stack_effect` " +"will return the stack effect of jumping. If *jump* is ``False``, it will " +"return the stack effect of not jumping. And if *jump* is ``None`` (default)," +" it will return the maximal stack effect of both cases." +msgstr "" +"如果代码有一个跳转目标并且 *jump* 是 ``True``,则 :func:`~stack_effect` 将返回跳转的堆栈效果。 如果 " +"*jump* 是 ``False``,它将返回不跳转的堆栈效果。 如果 *jump* 是 ``None`` (默认值),它将返回两种情况的最大堆栈效果。" + +#: ../../library/dis.rst:427 +msgid "Added *jump* parameter." +msgstr "添加 *jump* 参数。" + +#: ../../library/dis.rst:430 +msgid "" +"If ``oparg`` is omitted (or ``None``), the stack effect is now returned for " +"``oparg=0``. Previously this was an error for opcodes that use their arg. It" +" is also no longer an error to pass an integer ``oparg`` when the ``opcode``" +" does not use it; the ``oparg`` in this case is ignored." +msgstr "" +"如果 ``oparg`` 被省略 (或为 ``None``),过去如果字节码使用参数,此时会抛出错误,而现在会返回 ``oparg=0`` 时的结果 " +"。当 ``opcode`` 不使用整数 ``oparg`` 时,传入的 ``oparg`` 将被忽略,不会抛出错误。" + +#: ../../library/dis.rst:440 +msgid "Python Bytecode Instructions" +msgstr "Python 字节码指令" + +#: ../../library/dis.rst:442 +msgid "" +"The :func:`get_instructions` function and :class:`Bytecode` class provide " +"details of bytecode instructions as :class:`Instruction` instances:" +msgstr "" +":func:`get_instructions` 函数和 :class:`Bytecode` 类提供字节码指令的详细信息的 " +":class:`Instruction` 实例:" + +#: ../../library/dis.rst:447 +msgid "Details for a bytecode operation" +msgstr "字节码操作的详细信息" + +#: ../../library/dis.rst:451 +msgid "" +"numeric code for operation, corresponding to the opcode values listed below " +"and the bytecode values in the :ref:`opcode_collections`." +msgstr "操作的数字代码,对应于下面列出的操作码值和 :ref:`opcode_collections` 中的字节码值。" + +#: ../../library/dis.rst:457 +msgid "human readable name for operation" +msgstr "人类可读的操作名称" + +#: ../../library/dis.rst:462 +msgid "" +"numeric code for the base operation if operation is specialized; otherwise " +"equal to :data:`opcode`" +msgstr "如果操作是专用的则为基本操作的数字码;否则等于 :data:`opcode`" + +#: ../../library/dis.rst:468 +msgid "" +"human readable name for the base operation if operation is specialized; " +"otherwise equal to :data:`opname`" +msgstr "如果操作是专用的则为基本操作的人类易读的名称;否则等于 :data:`opname`" + +#: ../../library/dis.rst:474 +msgid "numeric argument to operation (if any), otherwise ``None``" +msgstr "操作的数字参数(如果有的话),否则为 ``None``" + +#: ../../library/dis.rst:478 +msgid "alias for :data:`arg`" +msgstr ":data:`arg` 的别名" + +#: ../../library/dis.rst:482 +msgid "resolved arg value (if any), otherwise ``None``" +msgstr "已解析的 arg 值(如果有的话),否则为 ``None``" + +#: ../../library/dis.rst:487 +msgid "" +"human readable description of operation argument (if any), otherwise an " +"empty string." +msgstr "人类可读的操作参数(如果存在)的描述,否则为空字符串。" + +#: ../../library/dis.rst:493 +msgid "start index of operation within bytecode sequence" +msgstr "在字节码序列中的起始操作索引" + +#: ../../library/dis.rst:498 +msgid "" +"start index of operation within bytecode sequence, including prefixed " +"``EXTENDED_ARG`` operations if present; otherwise equal to :data:`offset`" +msgstr "在字节码序列中的起始索引,包括前面的 ``EXTENDED_ARG`` 操作(如有),否则和 :data:`offset` 相等。" + +#: ../../library/dis.rst:504 +msgid "start index of the cache entries following the operation" +msgstr "在操作后面的缓存条目的起始索引" + +#: ../../library/dis.rst:509 +msgid "end index of the cache entries following the operation" +msgstr "操作后面的缓存条目的结束索引" + +#: ../../library/dis.rst:514 +msgid "``True`` if this opcode starts a source line, otherwise ``False``" +msgstr "如果这个操作在源代码行的开始,为 ``True``,否则为 ``False``。" + +#: ../../library/dis.rst:519 +msgid "" +"source line number associated with this opcode (if any), otherwise ``None``" +msgstr "操作码对应的源代码行号(如有),否则为 ``None``" + +#: ../../library/dis.rst:524 +msgid "``True`` if other code jumps to here, otherwise ``False``" +msgstr "如果其他代码跳到这里,则为 ``True``,否则为 ``False``" + +#: ../../library/dis.rst:529 +msgid "" +"bytecode index of the jump target if this is a jump operation, otherwise " +"``None``" +msgstr "跳转的目标的字节码索引,如果有跳转操作,否则为 ``None``" + +#: ../../library/dis.rst:535 +msgid "" +":class:`dis.Positions` object holding the start and end locations that are " +"covered by this instruction." +msgstr ":class:`dis.Positions` 对象保存了这条指令所涵盖的起始和结束位置。" + +#: ../../library/dis.rst:540 +msgid "" +"Information about the cache entries of this instruction, as triplets of the " +"form ``(name, size, data)``, where the ``name`` and ``size`` describe the " +"cache format and data is the contents of the cache. ``cache_info`` is " +"``None`` if the instruction does not have caches." +msgstr "" +"有关该指令的缓存条目的信息,为 ``(name, size, data)`` 形式的三元组,其中 ``name`` 和 ``size`` " +"描述缓存的格式而 data 为缓存的内容。如果指令没有缓存则 ``cache_info`` 为 ``None``。" + +#: ../../library/dis.rst:550 +msgid "Field ``positions`` is added." +msgstr "增加了 ``positions`` 字段。" + +#: ../../library/dis.rst:554 +msgid "Changed field ``starts_line``." +msgstr "更改了字段 ``starts_line``。" + +#: ../../library/dis.rst:556 +msgid "" +"Added fields ``start_offset``, ``cache_offset``, ``end_offset``, " +"``baseopname``, ``baseopcode``, ``jump_target``, ``oparg``, ``line_number`` " +"and ``cache_info``." +msgstr "" +"添加了字段 " +"``start_offset``,``cache_offset``,``end_offset``,``baseopname``,``baseopcode``,``jump_target``,``oparg``,``line_number``" +" 和 ``cache_info``。" + +#: ../../library/dis.rst:563 +msgid "" +"In case the information is not available, some fields might be ``None``." +msgstr "考虑到此信息不可用的情况,某些字段可能为 ``None``。" + +#: ../../library/dis.rst:573 +msgid "" +"The Python compiler currently generates the following bytecode instructions." +msgstr "Python 编译器当前生成以下字节码指令。" + +#: ../../library/dis.rst:576 +msgid "**General instructions**" +msgstr "**一般指令**" + +#: ../../library/dis.rst:578 +msgid "" +"In the following, We will refer to the interpreter stack as ``STACK`` and " +"describe operations on it as if it was a Python list. The top of the stack " +"corresponds to ``STACK[-1]`` in this language." +msgstr "" +"在下文中,我们将把解释器栈称为 ``STACK`` 并像描述 Python 列表一样描述对它的操作。栈顶对应于该语言中的 ``STACK[-1]``。" + +#: ../../library/dis.rst:584 +msgid "" +"Do nothing code. Used as a placeholder by the bytecode optimizer, and to " +"generate line tracing events." +msgstr "无操作代码。被字节码优化器用作占位符,以及生成行追踪事件。" + +#: ../../library/dis.rst:590 +msgid "" +"Do nothing code. Used by the interpreter to record :monitoring-" +"event:`BRANCH_LEFT` and :monitoring-event:`BRANCH_RIGHT` events for " +":mod:`sys.monitoring`." +msgstr "" +"不做任何事的代码。被解释器用来记录针对 :mod:`sys.monitoring` 的 :monitoring-event:`BRANCH_LEFT` " +"和 :monitoring-event:`BRANCH_RIGHT` 事件。" + +#: ../../library/dis.rst:599 +msgid "Removes the iterator from the top of the stack." +msgstr "从栈顶移除迭代器。" + +#: ../../library/dis.rst:606 +msgid "Removes the top-of-stack item::" +msgstr "移除栈顶的项::" + +#: ../../library/dis.rst:608 +msgid "STACK.pop()" +msgstr "STACK.pop()" + +#: ../../library/dis.rst:613 +msgid "" +"Removes the top-of-stack item. Equivalent to ``POP_TOP``. Used to clean up " +"at the end of loops, hence the name." +msgstr "移除栈顶。等价于 ``POP_TOP``。用于循环结束时的清理,因此而得名。" + +#: ../../library/dis.rst:622 +msgid "Implements ``del STACK[-2]``. Used to clean up when a generator exits." +msgstr "实现 ``del STACK[-2]``。用于在生成器退出时进行清理。" + +#: ../../library/dis.rst:630 +msgid "" +"Push the i-th item to the top of the stack without removing it from its " +"original location::" +msgstr "将第 *i* 项推入栈顶,并不移除原项:" + +#: ../../library/dis.rst:633 +msgid "" +"assert i > 0\n" +"STACK.append(STACK[-i])" +msgstr "" +"assert i > 0\n" +"STACK.append(STACK[-i])" + +#: ../../library/dis.rst:641 +msgid "Swap the top of the stack with the i-th element::" +msgstr "将栈顶的项与栈中第 *i* 项互换:" + +#: ../../library/dis.rst:643 +msgid "STACK[-i], STACK[-1] = STACK[-1], STACK[-i]" +msgstr "STACK[-i], STACK[-1] = STACK[-1], STACK[-i]" + +#: ../../library/dis.rst:650 +msgid "" +"Rather than being an actual instruction, this opcode is used to mark extra " +"space for the interpreter to cache useful data directly in the bytecode " +"itself. It is automatically hidden by all ``dis`` utilities, but can be " +"viewed with ``show_caches=True``." +msgstr "" +"此操作码不是真正的指令,它被用来为解释器标记额外空间以便在字节码中直接缓存有用的数据。它会被所有 ``dis`` 工具自动隐藏,但可以通过 " +"``show_caches=True`` 来查看。" + +#: ../../library/dis.rst:655 +msgid "" +"Logically, this space is part of the preceding instruction. Many opcodes " +"expect to be followed by an exact number of caches, and will instruct the " +"interpreter to skip over them at runtime." +msgstr "从逻辑上说,此空间是之前的指令的组成部分。许多操作码都预期带有固定数量的缓存,并会指示解释器在运行时跳过它们。" + +#: ../../library/dis.rst:659 +msgid "" +"Populated caches can look like arbitrary instructions, so great care should " +"be taken when reading or modifying raw, adaptive bytecode containing " +"quickened data." +msgstr "被填充的缓存看起来可以像是任意的指令,因此在读取或修改包含快取数据的原始自适应字节码时应当非常小心。" + +#: ../../library/dis.rst:666 +msgid "**Unary operations**" +msgstr "**一元操作**" + +#: ../../library/dis.rst:668 +msgid "" +"Unary operations take the top of the stack, apply the operation, and push " +"the result back on the stack." +msgstr "一元操作获取堆栈顶部元素,应用操作,并将结果推回堆栈。" + +#: ../../library/dis.rst:674 +msgid "Implements ``STACK[-1] = -STACK[-1]``." +msgstr "实现 ``STACK[-1] = -STACK[-1]``。" + +#: ../../library/dis.rst:679 +msgid "Implements ``STACK[-1] = not STACK[-1]``." +msgstr "实现 ``STACK[-1] = not STACK[-1]``。" + +#: ../../library/dis.rst:681 ../../library/dis.rst:1383 +#: ../../library/dis.rst:1399 +msgid "This instruction now requires an exact :class:`bool` operand." +msgstr "现在,操作对象需要是 :class:`bool` 类型。" + +#: ../../library/dis.rst:687 +msgid "Implements ``STACK[-1] = ~STACK[-1]``." +msgstr "实现 ``STACK[-1] = ~STACK[-1]``。" + +#: ../../library/dis.rst:692 +msgid "Implements ``STACK[-1] = iter(STACK[-1])``." +msgstr "实现 ``STACK[-1] = iter(STACK[-1])``。" + +#: ../../library/dis.rst:697 +msgid "" +"If ``STACK[-1]`` is a :term:`generator iterator` or :term:`coroutine` object" +" it is left as is. Otherwise, implements ``STACK[-1] = iter(STACK[-1])``." +msgstr "" +"如果 ``STACK[-1]`` 是一个 :term:`generator iterator` 或 :term:`coroutine` " +"对象则它将保持原样。否则,将实现 ``STACK[-1] = iter(STACK[-1])``。" + +#: ../../library/dis.rst:705 +msgid "Implements ``STACK[-1] = bool(STACK[-1])``." +msgstr "实现 ``STACK[-1] = bool(STACK[-1])``。" + +#: ../../library/dis.rst:710 +msgid "**Binary and in-place operations**" +msgstr "**双目和原地操作**" + +#: ../../library/dis.rst:712 +msgid "" +"Binary operations remove the top two items from the stack (``STACK[-1]`` and" +" ``STACK[-2]``). They perform the operation, then put the result back on the" +" stack." +msgstr "双目操作移除栈顶的两项 (``STACK[-1]`` 和 ``STACK[-2]``),执行其运算操作,并将结果放回栈中。" + +#: ../../library/dis.rst:715 +msgid "" +"In-place operations are like binary operations, but the operation is done " +"in-place when ``STACK[-2]`` supports it, and the resulting ``STACK[-1]`` may" +" be (but does not have to be) the original ``STACK[-2]``." +msgstr "" +"原地操作类似于双目操作,但当 ``STACK[-2]`` 支持时,操作将在原地进行。结果 ``STACK[-1]`` 可能(但不一定)是原先 " +"``STACK[-2]`` 的值。" + +#: ../../library/dis.rst:722 +msgid "" +"Implements the binary and in-place operators (depending on the value of " +"*op*)::" +msgstr "实现双目和原地操作运算符(取决于 *op* 的值):" + +#: ../../library/dis.rst:725 +msgid "" +"rhs = STACK.pop()\n" +"lhs = STACK.pop()\n" +"STACK.append(lhs op rhs)" +msgstr "" +"rhs = STACK.pop()\n" +"lhs = STACK.pop()\n" +"STACK.append(lhs op rhs)" + +#: ../../library/dis.rst:730 +msgid "" +"With oparg :``NB_SUBSCR``, implements binary subscript (replaces opcode " +"``BINARY_SUBSCR``)" +msgstr "使用操作数 :``NB_SUBSCR``,实现二元下标 (代替操作码 ``BINARY_SUBSCR``)" + +#: ../../library/dis.rst:736 ../../library/dis.rst:746 +#: ../../library/dis.rst:754 ../../library/dis.rst:766 +#: ../../library/dis.rst:844 ../../library/dis.rst:854 +#: ../../library/dis.rst:864 ../../library/dis.rst:1070 +#: ../../library/dis.rst:1081 ../../library/dis.rst:1226 +#: ../../library/dis.rst:1238 ../../library/dis.rst:1250 +msgid "Implements::" +msgstr "实现:" + +#: ../../library/dis.rst:738 +msgid "" +"key = STACK.pop()\n" +"container = STACK.pop()\n" +"value = STACK.pop()\n" +"container[key] = value" +msgstr "" +"key = STACK.pop()\n" +"container = STACK.pop()\n" +"value = STACK.pop()\n" +"container[key] = value" + +#: ../../library/dis.rst:748 +msgid "" +"key = STACK.pop()\n" +"container = STACK.pop()\n" +"del container[key]" +msgstr "" +"key = STACK.pop()\n" +"container = STACK.pop()\n" +"del container[key]" + +#: ../../library/dis.rst:756 +msgid "" +"end = STACK.pop()\n" +"start = STACK.pop()\n" +"container = STACK.pop()\n" +"STACK.append(container[start:end])" +msgstr "" +"end = STACK.pop()\n" +"start = STACK.pop()\n" +"container = STACK.pop()\n" +"STACK.append(container[start:end])" + +#: ../../library/dis.rst:768 +msgid "" +"end = STACK.pop()\n" +"start = STACK.pop()\n" +"container = STACK.pop()\n" +"value = STACK.pop()\n" +"container[start:end] = value" +msgstr "" +"end = STACK.pop()\n" +"start = STACK.pop()\n" +"container = STACK.pop()\n" +"value = STACK.pop()\n" +"container[start:end] = value" + +#: ../../library/dis.rst:777 +msgid "**Coroutine opcodes**" +msgstr "**协程操作码**" + +#: ../../library/dis.rst:781 +msgid "" +"Implements ``STACK[-1] = get_awaitable(STACK[-1])``, where " +"``get_awaitable(o)`` returns ``o`` if ``o`` is a coroutine object or a " +"generator object with the :data:`~inspect.CO_ITERABLE_COROUTINE` flag, or " +"resolves ``o.__await__``." +msgstr "" +"实现 ``STACK[-1] = get_awaitable(STACK[-1])``。其中对于 ``get_awaitable(o)``,当 " +"``o`` 是一个有 :data:`~inspect.CO_ITERABLE_COROUTINE` 旗标的协程对象或生成器对象时,返回 " +"``o``,否则解析 ``o.__await__``。" + +#: ../../library/dis.rst:786 +msgid "" +"If the ``where`` operand is nonzero, it indicates where the instruction " +"occurs:" +msgstr "如果 ``where`` 操作数为非零值,则表示指令所在的位置:" + +#: ../../library/dis.rst:789 +msgid "``1``: After a call to ``__aenter__``" +msgstr "``1``: 在调用 ``__aenter__`` 之后" + +#: ../../library/dis.rst:790 +msgid "``2``: After a call to ``__aexit__``" +msgstr "``2``: 在调用 ``__aexit__`` 之后" + +#: ../../library/dis.rst:794 +msgid "Previously, this instruction did not have an oparg." +msgstr "在之前版本中,该指令没有 oparg。" + +#: ../../library/dis.rst:800 +msgid "Implements ``STACK[-1] = STACK[-1].__aiter__()``." +msgstr "实现 ``STACK[-1] = STACK[-1].__aiter__()``。" + +#: ../../library/dis.rst:803 +msgid "Returning awaitable objects from ``__aiter__`` is no longer supported." +msgstr "已经不再支持从 ``__aiter__`` 返回可等待对象。" + +#: ../../library/dis.rst:810 +msgid "" +"Implement ``STACK.append(get_awaitable(STACK[-1].__anext__()))`` to the " +"stack. See ``GET_AWAITABLE`` for details about ``get_awaitable``." +msgstr "" +"对堆栈实现 ``STACK.append(get_awaitable(STACK[-1].__anext__()))``。关于 " +"``get_awaitable`` 的细节,见 ``GET_AWAITABLE``。" + +#: ../../library/dis.rst:818 +msgid "" +"Terminates an :keyword:`async for` loop. Handles an exception raised when " +"awaiting a next item. The stack contains the async iterable in ``STACK[-2]``" +" and the raised exception in ``STACK[-1]``. Both are popped. If the " +"exception is not :exc:`StopAsyncIteration`, it is re-raised." +msgstr "" +"终结一个 :keyword:`async for` 循环。在等待下一项时处理被引发的异常。栈包含了 ``STACK[-2]`` 中的异步可迭代对象和 " +"``STACK[-1]`` 中的已引发异常。两者都将被弹出。如果异常不是 :exc:`StopAsyncIteration`,它会被重新引发。" + +#: ../../library/dis.rst:825 ../../library/dis.rst:916 +#: ../../library/dis.rst:927 +msgid "" +"Exception representation on the stack now consist of one, not three, items." +msgstr "栈中的异常表示形式现在将由一个而不是三个条目组成。" + +#: ../../library/dis.rst:831 +msgid "" +"Handles an exception raised during a :meth:`~generator.throw` or " +":meth:`~generator.close` call through the current frame. If ``STACK[-1]`` " +"is an instance of :exc:`StopIteration`, pop three values from the stack and " +"push its ``value`` member. Otherwise, re-raise ``STACK[-1]``." +msgstr "" +"处理当前帧中由调用 :meth:`~generator.throw` 或 :meth:`~generator.close` 引发的异常。如果 " +"``STACK[-1]`` 是 :exc:`StopIteration` 的实例,则从栈中弹出三个值,并将其成员 ``value`` " +"的值推入栈中,否则重新引发 ``STACK[-1]`` 异常。" + +#: ../../library/dis.rst:840 +msgid "**Miscellaneous opcodes**" +msgstr "**其他操作码**" + +#: ../../library/dis.rst:846 +msgid "" +"item = STACK.pop()\n" +"set.add(STACK[-i], item)" +msgstr "" +"item = STACK.pop()\n" +"set.add(STACK[-i], item)" + +#: ../../library/dis.rst:849 +msgid "Used to implement set comprehensions." +msgstr "用于实现集合推导式。" + +#: ../../library/dis.rst:856 +msgid "" +"item = STACK.pop()\n" +"list.append(STACK[-i], item)" +msgstr "" +"item = STACK.pop()\n" +"list.append(STACK[-i], item)" + +#: ../../library/dis.rst:859 +msgid "Used to implement list comprehensions." +msgstr "用于实现列表推导式。" + +#: ../../library/dis.rst:866 +msgid "" +"value = STACK.pop()\n" +"key = STACK.pop()\n" +"dict.__setitem__(STACK[-i], key, value)" +msgstr "" +"value = STACK.pop()\n" +"key = STACK.pop()\n" +"dict.__setitem__(STACK[-i], key, value)" + +#: ../../library/dis.rst:870 +msgid "Used to implement dict comprehensions." +msgstr "用于实现字典推导式。" + +#: ../../library/dis.rst:873 +msgid "" +"Map value is ``STACK[-1]`` and map key is ``STACK[-2]``. Before, those were " +"reversed." +msgstr "映射的值为 ``STACK[-1]``,映射的键为 ``STACK[-2]``。之前它们是反过来的。" + +#: ../../library/dis.rst:877 +msgid "" +"For all of the :opcode:`SET_ADD`, :opcode:`LIST_APPEND` and " +":opcode:`MAP_ADD` instructions, while the added value or key/value pair is " +"popped off, the container object remains on the stack so that it is " +"available for further iterations of the loop." +msgstr "" +"对于所有 :opcode:`SET_ADD`、 :opcode:`LIST_APPEND` 和 :opcode:`MAP_ADD` " +"指令,当弹出添加的值或键值对时,容器对象保留在堆栈上,以便它可用于循环的进一步迭代。" + +#: ../../library/dis.rst:885 +msgid "Returns with ``STACK[-1]`` to the caller of the function." +msgstr "返回 ``STACK[-1]`` 给函数的调用者。" + +#: ../../library/dis.rst:890 +msgid "Yields ``STACK.pop()`` from a :term:`generator`." +msgstr "从 :term:`generator` 产生 ``STACK.pop()``。" + +#: ../../library/dis.rst:892 +msgid "oparg set to be the stack depth." +msgstr "oparg 被设为堆栈深度。" + +#: ../../library/dis.rst:895 +msgid "" +"oparg set to be the exception block depth, for efficient closing of " +"generators." +msgstr "oparg 被设为异常块的深度,以确保关闭生成器的效率。" + +#: ../../library/dis.rst:898 +msgid "" +"oparg is ``1`` if this instruction is part of a yield-from or await, and " +"``0`` otherwise." +msgstr "如果该指令是 yield-from 或 await 的一部分则 oparg 为 ``1``,否则为 ``0``。" + +#: ../../library/dis.rst:904 +msgid "" +"Checks whether ``__annotations__`` is defined in ``locals()``, if not it is " +"set up to an empty ``dict``. This opcode is only emitted if a class or " +"module body contains :term:`variable annotations ` " +"statically." +msgstr "" +"检查 ``__annotations__`` 是否在 ``locals()`` 中定义,如果没有,它被设置为空 ``dict`` " +"。只有在类或模块体静态地包含 :term:`variable annotations ` 时才会发出此操作码。" + +#: ../../library/dis.rst:914 +msgid "" +"Pops a value from the stack, which is used to restore the exception state." +msgstr "从栈中弹出一个值,它将被用来恢复异常状态。" + +#: ../../library/dis.rst:921 +msgid "" +"Re-raises the exception currently on top of the stack. If oparg is non-zero," +" pops an additional value from the stack which is used to set " +":attr:`~frame.f_lasti` of the current frame." +msgstr "" +"重新引发当前位于栈顶的异常。如果 oparg 为非零值,则从栈顶额外弹出一个值用来设置当前帧的 :attr:`~frame.f_lasti`。" + +#: ../../library/dis.rst:932 +msgid "" +"Pops a value from the stack. Pushes the current exception to the top of the " +"stack. Pushes the value originally popped back to the stack. Used in " +"exception handlers." +msgstr "从栈中弹出一个值。将当前异常推入栈顶。将原先被弹出的值推回栈。在异常处理器中使用。" + +#: ../../library/dis.rst:940 +msgid "" +"Performs exception matching for ``except``. Tests whether the ``STACK[-2]`` " +"is an exception matching ``STACK[-1]``. Pops ``STACK[-1]`` and pushes the " +"boolean result of the test." +msgstr "" +"为 ``except`` 执行异常匹配。检测 ``STACK[-2]`` 是否为匹配 ``STACK[-1]`` 的异常。弹出 " +"``STACK[-1]`` 并将测试的布尔值结果推入栈。" + +#: ../../library/dis.rst:948 +msgid "" +"Performs exception matching for ``except*``. Applies ``split(STACK[-1])`` on" +" the exception group representing ``STACK[-2]``." +msgstr "为 ``except*`` 执行异常匹配。在代表 ``STACK[-2]`` 的异常组上应用 ``split(STACK[-1])``。" + +#: ../../library/dis.rst:951 +msgid "" +"In case of a match, pops two items from the stack and pushes the non-" +"matching subgroup (``None`` in case of full match) followed by the matching " +"subgroup. When there is no match, pops one item (the match type) and pushes " +"``None``." +msgstr "" +"在匹配的情况下,从栈中弹出两项并推入不匹配的子分组 (如完全匹配则为 ``None``) 以及匹配的子分组。当没有任何匹配时,则弹出一项(匹配类型) " +"并推入 ``None``。" + +#: ../../library/dis.rst:960 +msgid "" +"Calls the function in position 4 on the stack with arguments (type, val, tb)" +" representing the exception at the top of the stack. Used to implement the " +"call ``context_manager.__exit__(*exc_info())`` when an exception has " +"occurred in a :keyword:`with` statement." +msgstr "" +"调用栈中 4 号位置上的函数并附带代表位于栈顶的异常的参数 (type, val, tb)。用于在 :keyword:`with` " +"语句内发生异常时实现调用 ``context_manager.__exit__(*exc_info())``。" + +#: ../../library/dis.rst:967 +msgid "" +"The ``__exit__`` function is in position 4 of the stack rather than 7. " +"Exception representation on the stack now consist of one, not three, items." +msgstr "``__exit__`` 函数位于栈的 4 号位而不是 7 号位。栈中的异常表示形式现在由一项而不是三项组成。" + +#: ../../library/dis.rst:974 +msgid "" +"Pushes a common constant onto the stack. The interpreter contains a " +"hardcoded list of constants supported by this instruction. Used by the " +":keyword:`assert` statement to load :exc:`AssertionError`." +msgstr "" +"将一个常用常量推入栈顶。解释器包含一个硬编码的被该指令所支持的常量列表。由 :keyword:`assert` 语句用来加载 " +":exc:`AssertionError`." + +#: ../../library/dis.rst:983 +msgid "" +"Pushes :func:`!builtins.__build_class__` onto the stack. It is later called" +" to construct a class." +msgstr "将 :func:`!builtins.__build_class__` 推入栈中。之后它将会被调用来构造一个类。" + +#: ../../library/dis.rst:988 +msgid "" +"Perform ``STACK.append(len(STACK[-1]))``. Used in :keyword:`match` " +"statements where comparison with structure of pattern is needed." +msgstr "" +"执行 ``STACK.append(len(STACK[-1]))``。当需要与模式结构体进行比较时在 :keyword:`match` 语句中使用。" + +#: ../../library/dis.rst:996 +msgid "" +"If ``STACK[-1]`` is an instance of :class:`collections.abc.Mapping` (or, " +"more technically: if it has the :c:macro:`Py_TPFLAGS_MAPPING` flag set in " +"its :c:member:`~PyTypeObject.tp_flags`), push ``True`` onto the stack. " +"Otherwise, push ``False``." +msgstr "" +"如果 ``STACK[-1]`` 是 :class:`collections.abc.Mapping` 的实例(或者更准确地说:如果在它的 " +":c:member:`~PyTypeObject.tp_flags` 中设置了 :c:macro:`Py_TPFLAGS_MAPPING` 旗标),则将" +" ``True`` 推入栈顶。否则,推入 ``False``。" + +#: ../../library/dis.rst:1006 +msgid "" +"If ``STACK[-1]`` is an instance of :class:`collections.abc.Sequence` and is " +"*not* an instance of :class:`str`/:class:`bytes`/:class:`bytearray` (or, " +"more technically: if it has the :c:macro:`Py_TPFLAGS_SEQUENCE` flag set in " +"its :c:member:`~PyTypeObject.tp_flags`), push ``True`` onto the stack. " +"Otherwise, push ``False``." +msgstr "" +"如果 ``STACK[-1]`` 是 :class:`collections.abc.Sequence` 的实例而 *不是* " +":class:`str`/:class:`bytes`/:class:`bytearray` 的实例(或者更准确地说:如果在它的 " +":c:member:`~PyTypeObject.tp_flags` 中设置了 :c:macro:`Py_TPFLAGS_SEQUENCE` " +"旗标),则将 ``True`` 推入栈顶。否则,推入 ``False``。" + +#: ../../library/dis.rst:1016 +msgid "" +"``STACK[-1]`` is a tuple of mapping keys, and ``STACK[-2]`` is the match " +"subject. If ``STACK[-2]`` contains all of the keys in ``STACK[-1]``, push a " +":class:`tuple` containing the corresponding values. Otherwise, push " +"``None``." +msgstr "" +"``STACK[-1]`` 是一个映射键的元组,而 ``STACK[-2]`` 是匹配目标。如果 ``STACK[-2]`` 包含 " +"``STACK[-1]`` 中的所有键,则推入一个包含对应值的 :class:`tuple`。在其他情况下,推入 ``None``。" + +#: ../../library/dis.rst:1022 ../../library/dis.rst:1768 +msgid "" +"Previously, this instruction also pushed a boolean value indicating success " +"(``True``) or failure (``False``)." +msgstr "在之前的版本中,该指令还会推入一个表示成功 (``True``) 或失败 (``False``) 的布尔值。" + +#: ../../library/dis.rst:1029 +msgid "" +"Implements ``name = STACK.pop()``. *namei* is the index of *name* in the " +"attribute :attr:`~codeobject.co_names` of the :ref:`code object `. The compiler tries to use :opcode:`STORE_FAST` or " +":opcode:`STORE_GLOBAL` if possible." +msgstr "" +"实现 ``name = STACK.pop()``。 *namei* 是 *name* 在 :ref:`代码对象 ` 的 " +":attr:`~codeobject.co_names` 属性中的索引。在可能的情况下编译器会尝试使用 :opcode:`STORE_FAST` 或 " +":opcode:`STORE_GLOBAL`." + +#: ../../library/dis.rst:1036 +msgid "" +"Implements ``del name``, where *namei* is the index into " +":attr:`~codeobject.co_names` attribute of the :ref:`code object `." +msgstr "" +"实现 ``del name``,其中 *namei* 是 :ref:`代码对象 ` 的 " +":attr:`~codeobject.co_names` 属性的索引。" + +#: ../../library/dis.rst:1042 +msgid "" +"Unpacks ``STACK[-1]`` into *count* individual values, which are put onto the" +" stack right-to-left. Require there to be exactly *count* values.::" +msgstr "将 ``STACK[-1]`` 解包为 *count* 个单独的值,然后自右向左放入栈中。要求有确切的 *count* 值:" + +#: ../../library/dis.rst:1045 +msgid "" +"assert(len(STACK[-1]) == count)\n" +"STACK.extend(STACK.pop()[:-count-1:-1])" +msgstr "" +"assert(len(STACK[-1]) == count)\n" +"STACK.extend(STACK.pop()[:-count-1:-1])" + +#: ../../library/dis.rst:1051 +msgid "" +"Implements assignment with a starred target: Unpacks an iterable in " +"``STACK[-1]`` into individual values, where the total number of values can " +"be smaller than the number of items in the iterable: one of the new values " +"will be a list of all leftover items." +msgstr "" +"实现带星号目标的赋值:将 ``STACK[-1]`` 中的可迭代对象解包为各个单独的值。 " +"值的总数可以小于可迭代对象的项数:其中会有一个值是存放剩下的项的列表。" + +#: ../../library/dis.rst:1056 +msgid "" +"The number of values before and after the list value is limited to 255." +msgstr "在列表前后的值的数量被限制在 255。" + +#: ../../library/dis.rst:1058 +msgid "" +"The number of values before the list value is encoded in the argument of the" +" opcode. The number of values after the list if any is encoded using an " +"``EXTENDED_ARG``. As a consequence, the argument can be seen as a two bytes " +"values where the low byte of *counts* is the number of values before the " +"list value, the high byte of *counts* the number of values after it." +msgstr "" +"列表前的值的数量被编码在操作码的参数之中。 如果列表后有值,则其数量会被用 ``EXTENDED_ARG`` 编码。 " +"因此参数可以被认为是一个双字节值,其中低位字节代表列表前的值的数量,高位字节代表其后的值的数量。" + +#: ../../library/dis.rst:1064 +msgid "" +"The extracted values are put onto the stack right-to-left, i.e. ``a, *b, c =" +" d`` will be stored after execution as ``STACK.extend((a, b, c))``." +msgstr "" +"提取出来的值被自右向左放入栈中,也就是说 ``a, *b, c = d`` 在执行完成之后会被这样储存: ``STACK.extend((a, b, " +"c))``。 " + +#: ../../library/dis.rst:1072 +msgid "" +"obj = STACK.pop()\n" +"value = STACK.pop()\n" +"obj.name = value" +msgstr "" +"obj = STACK.pop()\n" +"value = STACK.pop()\n" +"obj.name = value" + +#: ../../library/dis.rst:1076 +msgid "" +"where *namei* is the index of name in :attr:`~codeobject.co_names` of the " +":ref:`code object `." +msgstr "" +"其中 *namei* 是 name 在 :ref:`代码对象 ` 的 " +":attr:`~codeobject.co_names` 中的索引。" + +#: ../../library/dis.rst:1083 +msgid "" +"obj = STACK.pop()\n" +"del obj.name" +msgstr "" +"obj = STACK.pop()\n" +"del obj.name" + +#: ../../library/dis.rst:1086 +msgid "" +"where *namei* is the index of name into :attr:`~codeobject.co_names` of the " +":ref:`code object `." +msgstr "" +"其中 *namei* 是 name 在 :ref:`代码对象 ` 的 " +":attr:`~codeobject.co_names` 中的索引。" + +#: ../../library/dis.rst:1092 +msgid "Works as :opcode:`STORE_NAME`, but stores the name as a global." +msgstr "类似于 :opcode:`STORE_NAME` 但会将 name 存储为全局变量。" + +#: ../../library/dis.rst:1097 +msgid "Works as :opcode:`DELETE_NAME`, but deletes a global name." +msgstr "类似于 :opcode:`DELETE_NAME` 但会删除一个全局变量。" + +#: ../../library/dis.rst:1102 +msgid "Pushes ``co_consts[consti]`` onto the stack." +msgstr "将 ``co_consts[consti]`` 推入栈顶。" + +#: ../../library/dis.rst:1107 +msgid "" +"Pushes the integer ``i`` onto the stack. ``i`` must be in ``range(256)``" +msgstr "将整数 ``i`` 推入栈顶。``i`` 必须在 ``range(256)`` 范围内" + +#: ../../library/dis.rst:1115 +msgid "" +"Pushes the value associated with ``co_names[namei]`` onto the stack. The " +"name is looked up within the locals, then the globals, then the builtins." +msgstr "将 ``co_names[namei]`` 关联的值压入栈中。名称的查找范围包括局部变量,然后是全局变量,然后是内置量。" + +#: ../../library/dis.rst:1121 +msgid "" +"Pushes a reference to the locals dictionary onto the stack. This is used to" +" prepare namespace dictionaries for :opcode:`LOAD_FROM_DICT_OR_DEREF` and " +":opcode:`LOAD_FROM_DICT_OR_GLOBALS`." +msgstr "" +"将一个局部变量字典的引用压入栈中。被用于为 :opcode:`LOAD_FROM_DICT_OR_DEREF` 和 " +":opcode:`LOAD_FROM_DICT_OR_GLOBALS` 准备命名空间字典。" + +#: ../../library/dis.rst:1130 +msgid "" +"Pops a mapping off the stack and looks up the value for ``co_names[namei]``." +" If the name is not found there, looks it up in the globals and then the " +"builtins, similar to :opcode:`LOAD_GLOBAL`. This is used for loading global " +"variables in :ref:`annotation scopes ` within class " +"bodies." +msgstr "" +"从栈中弹出一个映射,在其中查找 ``co_names[namei]``。如果在此没有找到相应的名称,则在全局变量和内置量中查找,类似 " +":opcode:`LOAD_GLOBAL`。被用于在类定义中的 :ref:`标注作用域 ` 中加载全局变量。" + +#: ../../library/dis.rst:1141 +msgid "" +"Constructs a new :class:`~string.templatelib.Template` instance from a tuple" +" of strings and a tuple of interpolations and pushes the resulting object " +"onto the stack::" +msgstr "" +"根据一个字符串元组和一个插值元组构造一个新的 :class:`~string.templatelib.Template` 实例并将结果对象推至栈顶::" + +#: ../../library/dis.rst:1145 +msgid "" +"interpolations = STACK.pop()\n" +"strings = STACK.pop()\n" +"STACK.append(_build_template(strings, interpolations))" +msgstr "" +"interpolations = STACK.pop()\n" +"strings = STACK.pop()\n" +"STACK.append(_build_template(strings, interpolations))" + +#: ../../library/dis.rst:1154 +msgid "" +"Constructs a new :class:`~string.templatelib.Interpolation` instance from a " +"value and its source expression and pushes the resulting object onto the " +"stack." +msgstr "" +"根据给定的值及其源表达式构造一个新的 :class:`~string.templatelib.Interpolation` " +"实例,并将生成的对象压入栈中。" + +#: ../../library/dis.rst:1158 +msgid "" +"If no conversion or format specification is present, ``format`` is set to " +"``2``." +msgstr "如果未指定转换规则或格式说明符,则 ``format`` 参数的值将被设为 ``2``。" + +#: ../../library/dis.rst:1161 +msgid "" +"If the low bit of ``format`` is set, it indicates that the interpolation " +"contains a format specification." +msgstr "如果 ``format`` 的最低位被置位,则表示该插值包含格式说明符。" + +#: ../../library/dis.rst:1164 +msgid "" +"If ``format >> 2`` is non-zero, it indicates that the interpolation contains" +" a conversion. The value of ``format >> 2`` is the conversion type (``0`` " +"for no conversion, ``1`` for ``!s``, ``2`` for ``!r``, and ``3`` for " +"``!a``)::" +msgstr "" +"如果 ``format >> 2`` 的结果非零,则表示该插值包含转换操作。其中,``format >> 2`` 的值即为转换类型 (``0`` " +"表示无转换,``1`` 表示 ``!s``,``2`` 表示 ``!r``,``3`` 表示 ``!a``)::" + +#: ../../library/dis.rst:1169 +msgid "" +"conversion = format >> 2\n" +"if format & 1:\n" +" format_spec = STACK.pop()\n" +"else:\n" +" format_spec = None\n" +"expression = STACK.pop()\n" +"value = STACK.pop()\n" +"STACK.append(_build_interpolation(value, expression, conversion, format_spec))" +msgstr "" +"conversion = format >> 2\n" +"if format & 1:\n" +" format_spec = STACK.pop()\n" +"else:\n" +" format_spec = None\n" +"expression = STACK.pop()\n" +"value = STACK.pop()\n" +"STACK.append(_build_interpolation(value, expression, conversion, format_spec))" + +#: ../../library/dis.rst:1183 +msgid "" +"Creates a tuple consuming *count* items from the stack, and pushes the " +"resulting tuple onto the stack::" +msgstr "创建一个使用来自栈的 *count* 个条目的元组,并将结果元组推入栈顶::" + +#: ../../library/dis.rst:1186 +msgid "" +"if count == 0:\n" +" value = ()\n" +"else:\n" +" value = tuple(STACK[-count:])\n" +" STACK = STACK[:-count]\n" +"\n" +"STACK.append(value)" +msgstr "" +"if count == 0:\n" +" value = ()\n" +"else:\n" +" value = tuple(STACK[-count:])\n" +" STACK = STACK[:-count]\n" +"\n" +"STACK.append(value)" + +#: ../../library/dis.rst:1197 +msgid "Works as :opcode:`BUILD_TUPLE`, but creates a list." +msgstr "类似于 :opcode:`BUILD_TUPLE` 但会创建一个列表。" + +#: ../../library/dis.rst:1202 +msgid "Works as :opcode:`BUILD_TUPLE`, but creates a set." +msgstr "类似于 :opcode:`BUILD_TUPLE` 但会创建一个集合。" + +#: ../../library/dis.rst:1207 +msgid "" +"Pushes a new dictionary object onto the stack. Pops ``2 * count`` items so " +"that the dictionary holds *count* entries: ``{..., STACK[-4]: STACK[-3], " +"STACK[-2]: STACK[-1]}``." +msgstr "" +"将一个新字典对象推入栈顶。弹出 ``2 * count`` 项使得字典包含 *count* 个条目: ``{..., STACK[-4]: " +"STACK[-3], STACK[-2]: STACK[-1]}``。" + +#: ../../library/dis.rst:1211 +msgid "" +"The dictionary is created from stack items instead of creating an empty " +"dictionary pre-sized to hold *count* items." +msgstr "字典是根据栈中的项创建而不是创建一个预设大小包含 *count* 项的空字典。" + +#: ../../library/dis.rst:1218 +msgid "" +"Concatenates *count* strings from the stack and pushes the resulting string " +"onto the stack." +msgstr "拼接 *count* 个来自栈的字符串并将结果字符串推入栈顶。" + +#: ../../library/dis.rst:1228 +msgid "" +"seq = STACK.pop()\n" +"list.extend(STACK[-i], seq)" +msgstr "" +"seq = STACK.pop()\n" +"list.extend(STACK[-i], seq)" + +#: ../../library/dis.rst:1231 +msgid "Used to build lists." +msgstr "用于构建列表。" + +#: ../../library/dis.rst:1240 +msgid "" +"seq = STACK.pop()\n" +"set.update(STACK[-i], seq)" +msgstr "" +"seq = STACK.pop()\n" +"set.update(STACK[-i], seq)" + +#: ../../library/dis.rst:1243 +msgid "Used to build sets." +msgstr "用于构建集合。" + +#: ../../library/dis.rst:1252 +msgid "" +"map = STACK.pop()\n" +"dict.update(STACK[-i], map)" +msgstr "" +"map = STACK.pop()\n" +"dict.update(STACK[-i], map)" + +#: ../../library/dis.rst:1255 +msgid "Used to build dicts." +msgstr "用于构建字典。" + +#: ../../library/dis.rst:1262 +msgid "Like :opcode:`DICT_UPDATE` but raises an exception for duplicate keys." +msgstr "类似于 :opcode:`DICT_UPDATE` 但对于重复的键会引发异常。" + +#: ../../library/dis.rst:1269 +msgid "" +"If the low bit of ``namei`` is not set, this replaces ``STACK[-1]`` with " +"``getattr(STACK[-1], co_names[namei>>1])``." +msgstr "" +"如果 ``namei`` 的低位未设置,则将 ``STACK[-1]`` 替换为 ``getattr(STACK[-1], " +"co_names[namei>>1])``." + +#: ../../library/dis.rst:1272 +msgid "" +"If the low bit of ``namei`` is set, this will attempt to load a method named" +" ``co_names[namei>>1]`` from the ``STACK[-1]`` object. ``STACK[-1]`` is " +"popped. This bytecode distinguishes two cases: if ``STACK[-1]`` has a method" +" with the correct name, the bytecode pushes the unbound method and " +"``STACK[-1]``. ``STACK[-1]`` will be used as the first argument (``self``) " +"by :opcode:`CALL` or :opcode:`CALL_KW` when calling the unbound method. " +"Otherwise, ``NULL`` and the object returned by the attribute lookup are " +"pushed." +msgstr "" +"如果 ``namei`` 的低位已设置,则会尝试从 ``STACK[-1]`` 对象加载名为 ``co_names[namei>>1]`` 的方法。 " +"``STACK[-1]`` 会被弹出。此字节码会区分两种情况:如果 ``STACK[-1]`` 具有一个名称正确的方法,字节码会推入未绑定的方法和 " +"``STACK[-1]``。``STACK[-1]`` 将被 :opcode:`CALL` 或者 :opcode:`CALL_KW` " +"用作调用未绑定方法时的第一个参数 (``self``)。否则,将推入 ``NULL`` 和属性查询所返回的对象。" + +#: ../../library/dis.rst:1281 +msgid "" +"If the low bit of ``namei`` is set, then a ``NULL`` or ``self`` is pushed to" +" the stack before the attribute or unbound method respectively." +msgstr "如果 ``namei`` 的低位已置,则会在属性或未绑定方法之前分别将 ``NULL`` 或 ``self`` 推入栈。" + +#: ../../library/dis.rst:1288 +msgid "" +"This opcode implements :func:`super`, both in its zero-argument and two-" +"argument forms (e.g. ``super().method()``, ``super().attr`` and ``super(cls," +" self).method()``, ``super(cls, self).attr``)." +msgstr "" +"该操作码实现了 :func:`super`,包括零参数和双参数形式 (例如 ``super().method()``, ``super().attr``" +" 和 ``super(cls, self).method()``, ``super(cls, self).attr``)。" + +#: ../../library/dis.rst:1292 +msgid "It pops three values from the stack (from top of stack down):" +msgstr "它从栈弹出三个值(栈顶在前):" + +#: ../../library/dis.rst:1294 +msgid "``self``: the first argument to the current method" +msgstr "``self``: 当前方法的第一个参数" + +#: ../../library/dis.rst:1295 +msgid "``cls``: the class within which the current method was defined" +msgstr "``cls``: 当前方法被定义的类" + +#: ../../library/dis.rst:1296 +msgid "the global ``super``" +msgstr "全局的 ``super``" + +#: ../../library/dis.rst:1298 +msgid "" +"With respect to its argument, it works similarly to :opcode:`LOAD_ATTR`, " +"except that ``namei`` is shifted left by 2 bits instead of 1." +msgstr "对应于其参数,它的操作类似于 :opcode:`LOAD_ATTR`,区别在于 ``namei`` 左移了 2 位而不是 1 位。" + +#: ../../library/dis.rst:1301 +msgid "" +"The low bit of ``namei`` signals to attempt a method load, as with " +":opcode:`LOAD_ATTR`, which results in pushing ``NULL`` and the loaded " +"method. When it is unset a single value is pushed to the stack." +msgstr "" +"``namei`` 的低位发出尝试加载方法的信号,与 :opcode:`LOAD_ATTR` 一样,其结果是推入 ``NULL`` 和所加载的方法。 " +"当其被取消设置时会将单个值推入栈。" + +#: ../../library/dis.rst:1305 +msgid "" +"The second-low bit of ``namei``, if set, means that this was a two-argument " +"call to :func:`super` (unset means zero-argument)." +msgstr "``namei`` 的次低比特位如果被设置,表示这是对 :func:`super` 附带两个参数的调用(未设置则表示附带零个参数)。" + +#: ../../library/dis.rst:1313 +msgid "" +"Performs a Boolean operation. The operation name can be found in " +"``cmp_op[opname >> 5]``. If the fifth-lowest bit of ``opname`` is set " +"(``opname & 16``), the result should be coerced to ``bool``." +msgstr "" +"执行布尔操作。操作名可以在 ``cmp_op[opname >> 5]`` 中找到。如果 ``opname`` 的第五低位是 1 (``opname &" +" 16``),则结果将被强制转换为 ``bool``。" + +#: ../../library/dis.rst:1317 +msgid "" +"The fifth-lowest bit of the oparg now indicates a forced conversion to " +":class:`bool`." +msgstr "现在参数的第五低位表示强制将结果转换为 :class:`bool`。" + +#: ../../library/dis.rst:1324 +msgid "Performs ``is`` comparison, or ``is not`` if ``invert`` is 1." +msgstr "执行 ``is`` 比较,或者如果 ``invert`` 为 1 则执行 ``is not``。" + +#: ../../library/dis.rst:1331 +msgid "Performs ``in`` comparison, or ``not in`` if ``invert`` is 1." +msgstr "执行 ``in`` 比较,或者如果 ``invert`` 为 1 则执行 ``not in``。" + +#: ../../library/dis.rst:1338 +msgid "" +"Imports the module ``co_names[namei]``. ``STACK[-1]`` and ``STACK[-2]`` are" +" popped and provide the *fromlist* and *level* arguments of " +":func:`__import__`. The module object is pushed onto the stack. The current" +" namespace is not affected: for a proper import statement, a subsequent " +":opcode:`STORE_FAST` instruction modifies the namespace." +msgstr "" +"导入模块 ``co_names[namei]``。会弹出 ``STACK[-1]`` 和 ``STACK[-2]`` 以提供 *fromlist* 和 " +"*level* 参数给 :func:`__import__`。模块对象会被推入栈顶。当前命名空间不受影响:对于一条标准 import 语句,会执行后续的" +" :opcode:`STORE_FAST` 指令来修改命名空间。" + +#: ../../library/dis.rst:1346 +msgid "" +"Loads the attribute ``co_names[namei]`` from the module found in " +"``STACK[-1]``. The resulting object is pushed onto the stack, to be " +"subsequently stored by a :opcode:`STORE_FAST` instruction." +msgstr "" +"从在 ``STACK[-1]`` 内找到的模块中加载属性 ``co_names[namei]``。结果对象会被推入栈顶,以便由后续的 " +":opcode:`STORE_FAST` 指令来保存。" + +#: ../../library/dis.rst:1353 +msgid "Increments bytecode counter by *delta*." +msgstr "将字节码计数器的值增加 *delta*。" + +#: ../../library/dis.rst:1358 +msgid "Decrements bytecode counter by *delta*. Checks for interrupts." +msgstr "将字节码计数器减少 *delta*。检查中断。" + +#: ../../library/dis.rst:1365 +msgid "Decrements bytecode counter by *delta*. Does not check for interrupts." +msgstr "将字节码计数器减少 *delta*。不检查中断。" + +#: ../../library/dis.rst:1372 +msgid "" +"If ``STACK[-1]`` is true, increments the bytecode counter by *delta*. " +"``STACK[-1]`` is popped." +msgstr "如果 ``STACK[-1]`` 为真值,则将字节码计数器增加 *delta*。``STACK[-1]`` 将被弹出。" + +#: ../../library/dis.rst:1375 ../../library/dis.rst:1391 +msgid "" +"The oparg is now a relative delta rather than an absolute target. This " +"opcode is a pseudo-instruction, replaced in final bytecode by the directed " +"versions (forward/backward)." +msgstr "" +"操作符的参数现在是一个相对的差值而不是一个绝对的目标量。此操作码是一个伪指令,在最终的字节码里被定向的版本(forward/backward )取代。" + +#: ../../library/dis.rst:1380 ../../library/dis.rst:1396 +#: ../../library/dis.rst:1409 ../../library/dis.rst:1420 +msgid "This is no longer a pseudo-instruction." +msgstr "该操作码现在不再是伪指令。" + +#: ../../library/dis.rst:1388 +msgid "" +"If ``STACK[-1]`` is false, increments the bytecode counter by *delta*. " +"``STACK[-1]`` is popped." +msgstr "如果 ``STACK[-1]`` 为假值,则将字节码计数器增加 *delta*。``STACK[-1]`` 将被弹出。" + +#: ../../library/dis.rst:1404 +msgid "" +"If ``STACK[-1]`` is not ``None``, increments the bytecode counter by " +"*delta*. ``STACK[-1]`` is popped." +msgstr "如果 ``STACK[-1]`` 不为 ``None``,则将字节码计数器增加 *delta*。``STACK[-1]`` 将被弹出。" + +#: ../../library/dis.rst:1415 +msgid "" +"If ``STACK[-1]`` is ``None``, increments the bytecode counter by *delta*. " +"``STACK[-1]`` is popped." +msgstr "如果 ``STACK[-1]`` 为 ``None``,则将字节码计数器增加 *delta*。``STACK[-1]`` 将被弹出。" + +#: ../../library/dis.rst:1425 +msgid "" +"``STACK[-1]`` is an :term:`iterator`. Call its :meth:`~iterator.__next__` " +"method. If this yields a new value, push it on the stack (leaving the " +"iterator below it). If the iterator indicates it is exhausted then the byte" +" code counter is incremented by *delta*." +msgstr "" +"``STACK[-1]`` 是一个 :term:`iterator`。调用其 :meth:`~iterator.__next__` 方法。 " +"如果产生一个新的值则压入栈中(把迭代器压下去)。如果迭代器已耗尽,则将字节码计数器增加 *delta* 。" + +#: ../../library/dis.rst:1430 +msgid "Up until 3.11 the iterator was popped when it was exhausted." +msgstr "直到 3.11,当迭代器耗尽时,它会被从栈中弹出。" + +#: ../../library/dis.rst:1435 +msgid "Loads the global named ``co_names[namei>>1]`` onto the stack." +msgstr "将名为 ``co_names[namei>>1]`` 的全局对象加载到栈顶。" + +#: ../../library/dis.rst:1437 +msgid "" +"If the low bit of ``namei`` is set, then a ``NULL`` is pushed to the stack " +"before the global variable." +msgstr "如果设置了 ``namei`` 的低比特位,则会在全局变量前将一个 ``NULL`` 推入栈。" + +#: ../../library/dis.rst:1443 +msgid "" +"Pushes a reference to the local ``co_varnames[var_num]`` onto the stack." +msgstr "将指向局部对象 ``co_varnames[var_num]`` 的引用推入栈顶。" + +#: ../../library/dis.rst:1445 +msgid "" +"This opcode is now only used in situations where the local variable is " +"guaranteed to be initialized. It cannot raise :exc:`UnboundLocalError`." +msgstr "这个操作码目前只用在保证局部变量被初始化的情况下使用。它不能引发 :exc:`UnboundLocalError`。" + +#: ../../library/dis.rst:1451 +msgid "" +"Pushes a borrowed reference to the local ``co_varnames[var_num]`` onto the " +"stack." +msgstr "将一个指向局部对象 ``co_varnames[var_num]`` 的借入引用推入栈顶。" + +#: ../../library/dis.rst:1458 +msgid "" +"Pushes references to ``co_varnames[var_nums >> 4]`` and " +"``co_varnames[var_nums & 15]`` onto the stack." +msgstr "" +"将指向 ``co_varnames[var_nums >> 4]`` 和 ``co_varnames[var_nums & 15]`` 的引用推入栈顶。" + +#: ../../library/dis.rst:1466 +msgid "" +"Pushes borrowed references to ``co_varnames[var_nums >> 4]`` and " +"``co_varnames[var_nums & 15]`` onto the stack." +msgstr "" +"将指向 ``co_varnames[var_nums >> 4]`` 和 ``co_varnames[var_nums & 15]`` " +"的借入引用推入栈顶。" + +#: ../../library/dis.rst:1473 +msgid "" +"Pushes a reference to the local ``co_varnames[var_num]`` onto the stack, " +"raising an :exc:`UnboundLocalError` if the local variable has not been " +"initialized." +msgstr "" +"将一个指向局部变量 ``co_varnames[var_num]`` 的引用推入栈中,如果该局部变量未被初始化,引发一个 " +":exc:`UnboundLocalError` ." + +#: ../../library/dis.rst:1481 +msgid "" +"Pushes a reference to the local ``co_varnames[var_num]`` onto the stack (or " +"pushes ``NULL`` onto the stack if the local variable has not been " +"initialized) and sets ``co_varnames[var_num]`` to ``NULL``." +msgstr "" +"将一个指向局部变量 ``co_varnames[var_num]`` 的引用推入栈中 (如果该局部变量未被初始化,则推入一个 ``NULL``) 然后将" +" ``co_varnames[var_num]`` 设为 ``NULL``。" + +#: ../../library/dis.rst:1489 +msgid "Stores ``STACK.pop()`` into the local ``co_varnames[var_num]``." +msgstr "将 ``STACK.pop()`` 存放到局部变量 ``co_varnames[var_num]``。" + +#: ../../library/dis.rst:1493 +msgid "" +"Stores ``STACK[-1]`` into ``co_varnames[var_nums >> 4]`` and ``STACK[-2]`` " +"into ``co_varnames[var_nums & 15]``." +msgstr "" +"将 ``STACK[-1]`` 存入 ``co_varnames[var_nums >> 4]`` 并将 ``STACK[-2]`` 存入 " +"``co_varnames[var_nums & 15]``." + +#: ../../library/dis.rst:1500 +msgid "" +"Stores ``STACK.pop()`` into the local ``co_varnames[var_nums >> 4]`` and " +"pushes a reference to the local ``co_varnames[var_nums & 15]`` onto the " +"stack." +msgstr "" +"将 ``STACK.pop()`` 存入本地 ``co_varnames[var_nums >> 4]`` 并将指向本地 " +"``co_varnames[var_nums & 15]`` 的引用推入栈顶。" + +#: ../../library/dis.rst:1508 +msgid "Deletes local ``co_varnames[var_num]``." +msgstr "移除局部对象 ``co_varnames[var_num]``。" + +#: ../../library/dis.rst:1513 +msgid "" +"Creates a new cell in slot ``i``. If that slot is nonempty then that value " +"is stored into the new cell." +msgstr "在槽位 ``i`` 中创建一个新单元。如果该槽位为非空则该值将存储到新单元中。" + +#: ../../library/dis.rst:1521 +msgid "" +"Loads the cell contained in slot ``i`` of the \"fast locals\" storage. " +"Pushes a reference to the object the cell contains on the stack." +msgstr " 存储的 ``i`` 号槽位中的单元。将一个指向该单元所包含对象的引用推入栈。" + +#: ../../library/dis.rst:1524 ../../library/dis.rst:1546 +#: ../../library/dis.rst:1557 +msgid "" +"``i`` is no longer offset by the length of :attr:`~codeobject.co_varnames`." +msgstr "``i`` 不再是 :attr:`~codeobject.co_varnames` 的长度的偏移量。" + +#: ../../library/dis.rst:1530 +msgid "" +"Pops a mapping off the stack and looks up the name associated with slot " +"``i`` of the \"fast locals\" storage in this mapping. If the name is not " +"found there, loads it from the cell contained in slot ``i``, similar to " +":opcode:`LOAD_DEREF`. This is used for loading :term:`closure variables " +"` in class bodies (which previously used " +":opcode:`!LOAD_CLASSDEREF`) and in :ref:`annotation scopes ` within class bodies." +msgstr "" +" 存储的槽位 ``i`` 相关联的名称。如果未在其中找到此名称,则从包含在槽位 ``i`` 中的单元加载它,与 :opcode:`LOAD_DEREF`" +" 类似。这被用于加载类语句体中的 :term:`闭包变量 ` (在此之前是使用 " +":opcode:`!LOAD_CLASSDEREF`) 和类语句体中的 :ref:`标注作用域 `." + +#: ../../library/dis.rst:1543 +msgid "" +"Stores ``STACK.pop()`` into the cell contained in slot ``i`` of the \"fast " +"locals\" storage." +msgstr "将 ``STACK.pop()`` 存放到 \"fast locals\" 存储中包含在 ``i`` 号槽位的单元内。" + +#: ../../library/dis.rst:1552 +msgid "" +"Empties the cell contained in slot ``i`` of the \"fast locals\" storage. " +"Used by the :keyword:`del` statement." +msgstr " 存储中包含在 ``i`` 号槽位的单元。被用于 :keyword:`del` 语句。" + +#: ../../library/dis.rst:1563 +msgid "" +"Copies the ``n`` :term:`free (closure) variables ` from " +"the closure into the frame. Removes the need for special code on the " +"caller's side when calling closures." +msgstr "" +"将 ``n`` 个 :term:`自由(闭包)变量 ` 从闭包拷贝到帧中。 " +"当调用闭包时不再需要调用方添加特殊的代码。" + +#: ../../library/dis.rst:1572 +msgid "" +"Raises an exception using one of the 3 forms of the ``raise`` statement, " +"depending on the value of *argc*:" +msgstr "使用 ``raise`` 语句的 3 种形式之一引发异常,具体形式取决于 *argc* 的值:" + +#: ../../library/dis.rst:1575 +msgid "0: ``raise`` (re-raise previous exception)" +msgstr "0: ``raise`` (重新引发之前的异常)" + +#: ../../library/dis.rst:1576 +msgid "" +"1: ``raise STACK[-1]`` (raise exception instance or type at ``STACK[-1]``)" +msgstr "1: ``raise STACK[-1]`` (在 ``STACK[-1]`` 上引发异常实例或类型)" + +#: ../../library/dis.rst:1577 +msgid "" +"2: ``raise STACK[-2] from STACK[-1]`` (raise exception instance or type at " +"``STACK[-2]`` with ``__cause__`` set to ``STACK[-1]``)" +msgstr "" +"2: ``raise STACK[-2] from STACK[-1]`` (在 ``STACK[-2]`` 上引发异常实例或类型并将 " +"``__cause__`` 设为 ``STACK[-1]``)" + +#: ../../library/dis.rst:1583 +msgid "" +"Calls a callable object with the number of arguments specified by ``argc``. " +"On the stack are (in ascending order):" +msgstr "调用一个可调用对象并传入以 ``argc`` 指定的参数个数。在栈上为(升序):" + +#: ../../library/dis.rst:1586 ../../library/dis.rst:1610 +msgid "The callable" +msgstr "可调用对象" + +#: ../../library/dis.rst:1587 ../../library/dis.rst:1611 +msgid "``self`` or ``NULL``" +msgstr "``self`` 或者 ``NULL``" + +#: ../../library/dis.rst:1588 ../../library/dis.rst:1612 +msgid "The remaining positional arguments" +msgstr "其余的位置参数" + +#: ../../library/dis.rst:1590 +msgid "``argc`` is the total of the positional arguments, excluding ``self``." +msgstr "``argc`` 是位置参数的数量,不包括 ``self``。" + +#: ../../library/dis.rst:1592 +msgid "" +"``CALL`` pops all arguments and the callable object off the stack, calls the" +" callable object with those arguments, and pushes the return value returned " +"by the callable object." +msgstr "``CALL`` 将把所有参数和可调用对象弹出栈,附带这些参数调用该可调用对象,并将该可调用对象的返回值推入栈。" + +#: ../../library/dis.rst:1598 +msgid "The callable now always appears at the same position on the stack." +msgstr "可调用对象现在总是出现在栈的同一位置。" + +#: ../../library/dis.rst:1601 +msgid "Calls with keyword arguments are now handled by :opcode:`CALL_KW`." +msgstr "有关键字参数的调用现在由 :opcode:`CALL_KW` 处理。" + +#: ../../library/dis.rst:1607 +msgid "" +"Calls a callable object with the number of arguments specified by ``argc``, " +"including one or more named arguments. On the stack are (in ascending " +"order):" +msgstr "调用一个可调用对象并传入由 ``argc`` 指定数量的参数。在栈上为(升序):" + +#: ../../library/dis.rst:1613 +msgid "The named arguments" +msgstr "关键字参数" + +#: ../../library/dis.rst:1614 +msgid "A :class:`tuple` of keyword argument names" +msgstr "由关键字参数名称组成的 :class:`tuple`" + +#: ../../library/dis.rst:1616 +msgid "" +"``argc`` is the total of the positional and named arguments, excluding " +"``self``. The length of the tuple of keyword argument names is the number of" +" named arguments." +msgstr "``argc`` 是位置参数和关键字参数的总数,不包括 ``self``。关键字参数名称元组的长度为关键字参数的数量。" + +#: ../../library/dis.rst:1619 +msgid "" +"``CALL_KW`` pops all arguments, the keyword names, and the callable object " +"off the stack, calls the callable object with those arguments, and pushes " +"the return value returned by the callable object." +msgstr "``CALL_KW`` 会将所有参数、关键字名称和可调用对象从栈中弹出,用这些参数调用可调用对象,并将返回值推入栈。" + +#: ../../library/dis.rst:1628 +msgid "" +"Calls a callable object with variable set of positional and keyword " +"arguments. If the lowest bit of *flags* is set, the top of the stack " +"contains a mapping object containing additional keyword arguments. Before " +"the callable is called, the mapping object and iterable object are each " +"\"unpacked\" and their contents passed in as keyword and positional " +"arguments respectively. ``CALL_FUNCTION_EX`` pops all arguments and the " +"callable object off the stack, calls the callable object with those " +"arguments, and pushes the return value returned by the callable object." +msgstr "" +"调用一个可调用对象并附带位置参数和关键字参数变量集合。如果设置了 *flags* 的最低位,则栈顶包含一个由额外关键字参数组成的映射对象。 " +"在调用该可调用对象之前,映射对象和可迭代对象会被分别“解包”并将它们的内容分别作为关键字参数和位置参数传入。``CALL_FUNCTION_EX`` " +"会从栈中弹出所有参数及可调用对象,附带这些参数调用该可调用对象,并将可调用对象所返回的返回值推入栈顶。" + +#: ../../library/dis.rst:1643 +msgid "" +"Pushes a ``NULL`` to the stack. Used in the call sequence to match the " +"``NULL`` pushed by :opcode:`LOAD_ATTR` for non-method calls." +msgstr "" + +#: ../../library/dis.rst:1652 +msgid "" +"Pushes a new function object on the stack built from the code object at " +"``STACK[-1]``." +msgstr "将根据 ``STACK[-1]`` 处的代码对象构建的新函数对象推入栈顶。" + +#: ../../library/dis.rst:1654 +msgid "Flag value ``0x04`` is a tuple of strings instead of dictionary" +msgstr "旗标值 ``0x04`` 是一个字符串元组而非字典。" + +#: ../../library/dis.rst:1657 +msgid "Qualified name at ``STACK[-1]`` was removed." +msgstr "位于 ``STACK[-1]`` 的限定名称已被移除。" + +#: ../../library/dis.rst:1660 +msgid "" +"Extra function attributes on the stack, signaled by oparg flags, were " +"removed. They now use :opcode:`SET_FUNCTION_ATTRIBUTE`." +msgstr "操作参数曾指示额外的函数属性,现已被移除。现在使用 :opcode:`SET_FUNCTION_ATTRIBUTE`。" + +#: ../../library/dis.rst:1667 +msgid "" +"Sets an attribute on a function object. Expects the function at " +"``STACK[-1]`` and the attribute value to set at ``STACK[-2]``; consumes both" +" and leaves the function at ``STACK[-1]``. The flag determines which " +"attribute to set:" +msgstr "" +"在函数对象上设置一个属性。将 ``STACK[-1]`` 的元素作为函数对象,``STACK[-2]`` " +"作为要设置的属性值,消耗这两个元素,将函数对象留在 ``STACK[-1]``。参数 flag 决定了要设置哪个属性:" + +#: ../../library/dis.rst:1671 +msgid "" +"``0x01`` a tuple of default values for positional-only and positional-or-" +"keyword parameters in positional order" +msgstr "``0x01`` 一个默认值的元组,用于按位置排序的仅限位置形参以及位置或关键字形参" + +#: ../../library/dis.rst:1673 +msgid "``0x02`` a dictionary of keyword-only parameters' default values" +msgstr "``0x02`` 一个仅限关键字形参的默认值的字典" + +#: ../../library/dis.rst:1674 +msgid "``0x04`` a tuple of strings containing parameters' annotations" +msgstr "``0x04`` 一个包含形参标注的字符串元组。" + +#: ../../library/dis.rst:1675 +msgid "``0x08`` a tuple containing cells for free variables, making a closure" +msgstr "``0x08`` 一个包含用于自由变量的单元的元组,生成一个闭包" + +#: ../../library/dis.rst:1676 +msgid "``0x10`` the :term:`annotate function` for the function object" +msgstr "``0x10`` 函数对象的 :term:`annotate function`" + +#: ../../library/dis.rst:1680 +msgid "" +"Added ``0x10`` to indicate the annotate function for the function object." +msgstr "增加 ``0x10`` 来表示函数对象的标注函数。" + +#: ../../library/dis.rst:1688 +msgid "" +"Pushes a slice object on the stack. *argc* must be 2 or 3. If it is 2, " +"implements::" +msgstr "将一个切片对象推入栈中, *argc* 必须为 2 或 3。如果其为 2,则实现:" + +#: ../../library/dis.rst:1690 +msgid "" +"end = STACK.pop()\n" +"start = STACK.pop()\n" +"STACK.append(slice(start, end))" +msgstr "" +"end = STACK.pop()\n" +"start = STACK.pop()\n" +"STACK.append(slice(start, end))" + +#: ../../library/dis.rst:1694 +msgid "if it is 3, implements::" +msgstr "如果其为 3,则实现:" + +#: ../../library/dis.rst:1696 +msgid "" +"step = STACK.pop()\n" +"end = STACK.pop()\n" +"start = STACK.pop()\n" +"STACK.append(slice(start, end, step))" +msgstr "" +"step = STACK.pop()\n" +"end = STACK.pop()\n" +"start = STACK.pop()\n" +"STACK.append(slice(start, end, step))" + +#: ../../library/dis.rst:1701 +msgid "See the :func:`slice` built-in function for more information." +msgstr "详见内置函数 :func:`slice`。" + +#: ../../library/dis.rst:1706 +msgid "" +"Prefixes any opcode which has an argument too big to fit into the default " +"one byte. *ext* holds an additional byte which act as higher bits in the " +"argument. For each opcode, at most three prefixal ``EXTENDED_ARG`` are " +"allowed, forming an argument from two-byte to four-byte." +msgstr "" +"为任意带有大到无法放入默认的单字节的参数的操作码添加前缀。 *ext* 存放一个附加字节作为参数中的高比特位。对于每个操作码,最多允许三个 " +"``EXTENDED_ARG`` 前缀,构成两字节到四字节的参数。" + +#: ../../library/dis.rst:1714 +msgid "Convert value to a string, depending on ``oparg``::" +msgstr "将值转化为字符串,以 ``oparg`` 指定的方式::" + +#: ../../library/dis.rst:1716 +msgid "" +"value = STACK.pop()\n" +"result = func(value)\n" +"STACK.append(result)" +msgstr "" +"value = STACK.pop()\n" +"result = func(value)\n" +"STACK.append(result)" + +#: ../../library/dis.rst:1720 +msgid "``oparg == 1``: call :func:`str` on *value*" +msgstr "``oparg == 1``: 在 *value* 上调用 :func:`str`" + +#: ../../library/dis.rst:1721 +msgid "``oparg == 2``: call :func:`repr` on *value*" +msgstr "``oparg == 2``: 在 *value* 上调用 :func:`repr`" + +#: ../../library/dis.rst:1722 +msgid "``oparg == 3``: call :func:`ascii` on *value*" +msgstr "``oparg == 3``: 在 *value* 上调用 :func:`ascii`" + +#: ../../library/dis.rst:1724 ../../library/dis.rst:1737 +#: ../../library/dis.rst:1750 +msgid "Used for implementing formatted string literals (f-strings)." +msgstr "用于实现格式字符串字面值(f-字符串)。" + +#: ../../library/dis.rst:1731 +msgid "Formats the value on top of stack::" +msgstr "格式化栈顶的值::" + +#: ../../library/dis.rst:1733 +msgid "" +"value = STACK.pop()\n" +"result = value.__format__(\"\")\n" +"STACK.append(result)" +msgstr "" +"value = STACK.pop()\n" +"result = value.__format__(\"\")\n" +"STACK.append(result)" + +#: ../../library/dis.rst:1743 +msgid "Formats the given value with the given format spec::" +msgstr "使用给定的格式说明来格式化给定的值::" + +#: ../../library/dis.rst:1745 +msgid "" +"spec = STACK.pop()\n" +"value = STACK.pop()\n" +"result = value.__format__(spec)\n" +"STACK.append(result)" +msgstr "" +"spec = STACK.pop()\n" +"value = STACK.pop()\n" +"result = value.__format__(spec)\n" +"STACK.append(result)" + +#: ../../library/dis.rst:1757 +msgid "" +"``STACK[-1]`` is a tuple of keyword attribute names, ``STACK[-2]`` is the " +"class being matched against, and ``STACK[-3]`` is the match subject. " +"*count* is the number of positional sub-patterns." +msgstr "" +"``STACK[-1]`` 是一个由关键字属性名称组成的元组,``STACK[-2]`` 是要匹配的类,而 ``STACK[-3]`` " +"是匹配的目标主题。 *count* 是位置子模式的数量。" + +#: ../../library/dis.rst:1761 +msgid "" +"Pop ``STACK[-1]``, ``STACK[-2]``, and ``STACK[-3]``. If ``STACK[-3]`` is an " +"instance of ``STACK[-2]`` and has the positional and keyword attributes " +"required by *count* and ``STACK[-1]``, push a tuple of extracted attributes." +" Otherwise, push ``None``." +msgstr "" +"弹出 ``STACK[-1]``、``STACK[-2]`` 和 ``STACK[-3]``。如果 ``STACK[-3]`` 是 " +"``STACK[-2]`` 的实例并且具有 *count* 和 ``STACK[-1]`` 所要求的位置和关键字属性,则推入一个由已提取属性组成的元组。" +" 在其他情况下,则推入 ``None``。" + +#: ../../library/dis.rst:1775 +msgid "A no-op. Performs internal tracing, debugging and optimization checks." +msgstr "空操作。执行内部追踪、调试和优化检查。" + +#: ../../library/dis.rst:1777 +msgid "" +"The ``context`` operand consists of two parts. The lowest two bits indicate " +"where the ``RESUME`` occurs:" +msgstr "``context`` 操作数由两部分组成。最低的两个比特位指明 ``RESUME`` 在何处发生:" + +#: ../../library/dis.rst:1780 +msgid "" +"``0`` The start of a function, which is neither a generator, coroutine nor " +"an async generator" +msgstr "``0`` 在函数的开头。函数不能是生成器、协程或者异步生成器。" + +#: ../../library/dis.rst:1782 +msgid "``1`` After a ``yield`` expression" +msgstr "``1`` 在 ``yield`` 表达式之后" + +#: ../../library/dis.rst:1783 +msgid "``2`` After a ``yield from`` expression" +msgstr "``2`` 在 ``yield from`` 表达式之后" + +#: ../../library/dis.rst:1784 +msgid "``3`` After an ``await`` expression" +msgstr "``3`` 在 ``await`` 表达式之后" + +#: ../../library/dis.rst:1786 +msgid "" +"The next bit is ``1`` if the RESUME is at except-depth ``1``, and ``0`` " +"otherwise." +msgstr "如果 RESUME 在 except 深度 ``1`` 上发生则下一个比特位值为 ``1``,否则为 ``0``。" + +#: ../../library/dis.rst:1791 +msgid "The oparg value changed to include information about except-depth" +msgstr "oparg 值已被修改以包括有关 except 深度的信息" + +#: ../../library/dis.rst:1797 +msgid "" +"Create a generator, coroutine, or async generator from the current frame. " +"Used as first opcode of in code object for the above mentioned callables. " +"Clear the current frame and return the newly created generator." +msgstr "从当前帧中创建一个生成器,协程,或者异步生成器。被用作上述可调用对象的代码对象第一个操作码。清除当前帧,返回新创建的生成器。" + +#: ../../library/dis.rst:1806 +msgid "" +"Equivalent to ``STACK[-1] = STACK[-2].send(STACK[-1])``. Used in ``yield " +"from`` and ``await`` statements." +msgstr "" +"等价于 ``STACK[-1] = STACK[-2].send(STACK[-1])``。被用于 ``yield from`` 和 ``await``" +" 语句。" + +#: ../../library/dis.rst:1809 +msgid "" +"If the call raises :exc:`StopIteration`, pop the top value from the stack, " +"push the exception's ``value`` attribute, and increment the bytecode counter" +" by *delta*." +msgstr "" +"如果调用引发了 :exc:`StopIteration`,则从栈中弹出最上面的值,推入异常的 ``value`` 属性,并将字节码计数器值递增 " +"*delta*." + +#: ../../library/dis.rst:1818 +msgid "" +"This is not really an opcode. It identifies the dividing line between " +"opcodes in the range [0,255] which don't use their argument and those that " +"do (``< HAVE_ARGUMENT`` and ``>= HAVE_ARGUMENT``, respectively)." +msgstr "" +"这不是一个真正的操作码。它是 [0,255] 范围内不使用参数和使用参数的操作码 (分别是 ``< HAVE_ARGUMENT`` 和 ``>= " +"HAVE_ARGUMENT``) 的分界线。" + +#: ../../library/dis.rst:1822 +msgid "" +"If your application uses pseudo instructions or specialized instructions, " +"use the :data:`hasarg` collection instead." +msgstr "如果你的应用程序使用了伪指令或专用指令,请改用 :data:`hasarg` 多项集。" + +#: ../../library/dis.rst:1825 +msgid "" +"Now every instruction has an argument, but opcodes ``< HAVE_ARGUMENT`` " +"ignore it. Before, only opcodes ``>= HAVE_ARGUMENT`` had an argument." +msgstr "" +"现在每条指令都带有参数,但操作码 ``< HAVE_ARGUMENT`` 会忽略它。之前仅限操作码 ``>= HAVE_ARGUMENT`` 带有参数。" + +#: ../../library/dis.rst:1829 +msgid "" +"Pseudo instructions were added to the :mod:`!dis` module, and for them it is" +" not true that comparison with ``HAVE_ARGUMENT`` indicates whether they use " +"their arg." +msgstr "" + +#: ../../library/dis.rst:1834 +msgid "Use :data:`hasarg` instead." +msgstr "使用 :data:`hasarg` 来代替。" + +#: ../../library/dis.rst:1839 +msgid "" +"Calls an intrinsic function with one argument. Passes ``STACK[-1]`` as the " +"argument and sets ``STACK[-1]`` to the result. Used to implement " +"functionality that is not performance critical." +msgstr "" +"调用内在函数并附带一个参数。传入 ``STACK[-1]`` 作为参数并将 ``STACK[-1]`` 设为结果。用于实现对性能不敏感的功能。" + +#: ../../library/dis.rst:1843 ../../library/dis.rst:1897 +msgid "The operand determines which intrinsic function is called:" +msgstr "调用哪个内在函数取决于操作数:" + +#: ../../library/dis.rst:1846 ../../library/dis.rst:1900 +msgid "Operand" +msgstr "操作数" + +#: ../../library/dis.rst:1846 ../../library/dis.rst:1900 +msgid "Description" +msgstr "描述" + +#: ../../library/dis.rst:1848 +msgid "``INTRINSIC_1_INVALID``" +msgstr "``INTRINSIC_1_INVALID``" + +#: ../../library/dis.rst:1848 ../../library/dis.rst:1902 +msgid "Not valid" +msgstr "无效" + +#: ../../library/dis.rst:1850 +msgid "``INTRINSIC_PRINT``" +msgstr "``INTRINSIC_PRINT``" + +#: ../../library/dis.rst:1850 +msgid "Prints the argument to standard out. Used in the REPL." +msgstr "将参数打印到标准输出。被用于 REPL。" + +#: ../../library/dis.rst:1853 +msgid "``INTRINSIC_IMPORT_STAR``" +msgstr "``INTRINSIC_IMPORT_STAR``" + +#: ../../library/dis.rst:1853 +msgid "Performs ``import *`` for the named module." +msgstr "为指定模块执行 ``import *``。" + +#: ../../library/dis.rst:1856 +msgid "``INTRINSIC_STOPITERATION_ERROR``" +msgstr "``INTRINSIC_STOPITERATION_ERROR``" + +#: ../../library/dis.rst:1856 +msgid "Extracts the return value from a ``StopIteration`` exception." +msgstr "从 ``StopIteration`` 异常中提取返回值。" + +#: ../../library/dis.rst:1859 +msgid "``INTRINSIC_ASYNC_GEN_WRAP``" +msgstr "``INTRINSIC_ASYNC_GEN_WRAP``" + +#: ../../library/dis.rst:1859 +msgid "Wraps an async generator value" +msgstr "包裹一个异步生成器值" + +#: ../../library/dis.rst:1861 +msgid "``INTRINSIC_UNARY_POSITIVE``" +msgstr "``INTRINSIC_UNARY_POSITIVE``" + +#: ../../library/dis.rst:1861 +msgid "Performs the unary ``+`` operation" +msgstr "执行单目运算符 ``+``" + +#: ../../library/dis.rst:1864 +msgid "``INTRINSIC_LIST_TO_TUPLE``" +msgstr "``INTRINSIC_LIST_TO_TUPLE``" + +#: ../../library/dis.rst:1864 +msgid "Converts a list to a tuple" +msgstr "将一个列表转换为元组" + +#: ../../library/dis.rst:1866 +msgid "``INTRINSIC_TYPEVAR``" +msgstr "``INTRINSIC_TYPEVAR``" + +#: ../../library/dis.rst:1866 +msgid "Creates a :class:`typing.TypeVar`" +msgstr "创建一个 :class:`typing.TypeVar`" + +#: ../../library/dis.rst:1868 +msgid "``INTRINSIC_PARAMSPEC``" +msgstr "``INTRINSIC_PARAMSPEC``" + +#: ../../library/dis.rst:1868 +msgid "Creates a :class:`typing.ParamSpec`" +msgstr "创建一个 :class:`typing.ParamSpec`" + +#: ../../library/dis.rst:1871 +msgid "``INTRINSIC_TYPEVARTUPLE``" +msgstr "``INTRINSIC_TYPEVARTUPLE``" + +#: ../../library/dis.rst:1871 +msgid "Creates a :class:`typing.TypeVarTuple`" +msgstr "创建一个 :class:`typing.TypeVarTuple`" + +#: ../../library/dis.rst:1874 +msgid "``INTRINSIC_SUBSCRIPT_GENERIC``" +msgstr "``INTRINSIC_SUBSCRIPT_GENERIC``" + +#: ../../library/dis.rst:1874 +msgid "Returns :class:`typing.Generic` subscripted with the argument" +msgstr "返回 :class:`typing.Generic` 取参数下标。" + +#: ../../library/dis.rst:1877 +msgid "``INTRINSIC_TYPEALIAS``" +msgstr "``INTRINSIC_TYPEALIAS``" + +#: ../../library/dis.rst:1877 +msgid "" +"Creates a :class:`typing.TypeAliasType`; used in the :keyword:`type` " +"statement. The argument is a tuple of the type alias's name, type " +"parameters, and value." +msgstr "" +"创建一个 :class:`typing.TypeAliasType`;被用于 :keyword:`type` 语句。 " +"参数是一个由类型别名的名称、类型形参和值组成的元组。" + +#: ../../library/dis.rst:1889 +msgid "" +"Calls an intrinsic function with two arguments. Used to implement " +"functionality that is not performance critical::" +msgstr "调用内在函数并附带两个参数。用于实现对性能不敏感的功能::" + +#: ../../library/dis.rst:1892 +msgid "" +"arg2 = STACK.pop()\n" +"arg1 = STACK.pop()\n" +"result = intrinsic2(arg1, arg2)\n" +"STACK.append(result)" +msgstr "" +"arg2 = STACK.pop()\n" +"arg1 = STACK.pop()\n" +"result = intrinsic2(arg1, arg2)\n" +"STACK.append(result)" + +#: ../../library/dis.rst:1902 +msgid "``INTRINSIC_2_INVALID``" +msgstr "``INTRINSIC_2_INVALID``" + +#: ../../library/dis.rst:1904 +msgid "``INTRINSIC_PREP_RERAISE_STAR``" +msgstr "``INTRINSIC_PREP_RERAISE_STAR``" + +#: ../../library/dis.rst:1904 +msgid "Calculates the :exc:`ExceptionGroup` to raise from a ``try-except*``." +msgstr "计算 :exc:`ExceptionGroup` 以从 ``try-except*`` 中引发异常。" + +#: ../../library/dis.rst:1908 +msgid "``INTRINSIC_TYPEVAR_WITH_BOUND``" +msgstr "``INTRINSIC_TYPEVAR_WITH_BOUND``" + +#: ../../library/dis.rst:1908 +msgid "Creates a :class:`typing.TypeVar` with a bound." +msgstr "创建一个带范围的 :class:`typing.TypeVar`。" + +#: ../../library/dis.rst:1911 +msgid "``INTRINSIC_TYPEVAR_WITH_CONSTRAINTS``" +msgstr "``INTRINSIC_TYPEVAR_WITH_CONSTRAINTS``" + +#: ../../library/dis.rst:1911 +msgid "Creates a :class:`typing.TypeVar` with constraints." +msgstr "创建一个带约束的 :class:`typing.TypeVar`。" + +#: ../../library/dis.rst:1915 +msgid "``INTRINSIC_SET_FUNCTION_TYPE_PARAMS``" +msgstr "``INTRINSIC_SET_FUNCTION_TYPE_PARAMS``" + +#: ../../library/dis.rst:1915 +msgid "Sets the ``__type_params__`` attribute of a function." +msgstr "为一个函数设置 ``__type_params__`` 属性。" + +#: ../../library/dis.rst:1924 +msgid "" +"Performs special method lookup on ``STACK[-1]``. If " +"``type(STACK[-1]).__xxx__`` is a method, leave ``type(STACK[-1]).__xxx__; " +"STACK[-1]`` on the stack. If ``type(STACK[-1]).__xxx__`` is not a method, " +"leave ``STACK[-1].__xxx__; NULL`` on the stack." +msgstr "" +"在 ``STACK[-1]`` 上执行特殊方法查找。如果 ``type(STACK[-1]).__xxx__`` 是一个方法,则将 " +"``type(STACK[-1]).__xxx__; STACK[-1]`` 留在栈中。如果 ``type(STACK[-1]).__xxx__`` " +"不是一个方法,则将 ``STACK[-1].__xxx__; NULL`` 留在栈中。" + +#: ../../library/dis.rst:1933 +msgid "**Pseudo-instructions**" +msgstr "**伪指令**" + +#: ../../library/dis.rst:1935 +msgid "" +"These opcodes do not appear in Python bytecode. They are used by the " +"compiler but are replaced by real opcodes or removed before bytecode is " +"generated." +msgstr "这些操作码并不出现在 Python 的字节码之中。它们被编译器所使用,但在生成字节码之前会被替代成真正的操作码。" + +#: ../../library/dis.rst:1940 +msgid "" +"Set up an exception handler for the following code block. If an exception " +"occurs, the value stack level is restored to its current state and control " +"is transferred to the exception handler at ``target``." +msgstr "为下面的代码块设置一个异常处理器。如果发生异常,值栈的级别将恢复到当前状态并将控制权移交给位于 ``target`` 的异常处理器。" + +#: ../../library/dis.rst:1947 +msgid "" +"Like ``SETUP_FINALLY``, but in case of an exception also pushes the last " +"instruction (``lasti``) to the stack so that ``RERAISE`` can restore it. If " +"an exception occurs, the value stack level and the last instruction on the " +"frame are restored to their current state, and control is transferred to the" +" exception handler at ``target``." +msgstr "" +"与 ``SETUP_FINALLY`` 类似,但在出现异常的情况下也会将最后一条指令 (``lasti``) 推入栈以便 ``RERAISE`` " +"能恢复它。如果出现异常,栈级别值和帧上的最后一条指令将恢复为其当前状态,控制权将转移到 ``target`` 上的异常处理器。" + +#: ../../library/dis.rst:1956 +msgid "" +"Like ``SETUP_CLEANUP``, but in case of an exception one more item is popped " +"from the stack before control is transferred to the exception handler at " +"``target``." +msgstr "" +"与 ``SETUP_CLEANUP`` 类似,但在出现异常的情况下会从栈中再弹出一项然后将控制权转移到 ``target`` 上的异常处理器。" + +#: ../../library/dis.rst:1960 +msgid "" +"This variant is used in :keyword:`with` and :keyword:`async with` " +"constructs, which push the return value of the context manager's " +":meth:`~object.__enter__` or :meth:`~object.__aenter__` to the stack." +msgstr "" +"该变体形式用于 :keyword:`with` 和 :keyword:`async with` 结构,它们会将上下文管理器的 " +":meth:`~object.__enter__` 或 :meth:`~object.__aenter__` 的返回值推入栈。" + +#: ../../library/dis.rst:1967 +msgid "" +"Marks the end of the code block associated with the last ``SETUP_FINALLY``, " +"``SETUP_CLEANUP`` or ``SETUP_WITH``." +msgstr "" +"标记与最后一个 ``SETUP_FINALLY``、``SETUP_CLEANUP`` 或 ``SETUP_WITH`` 相关联的代码块的结束。" + +#: ../../library/dis.rst:1974 +msgid "" +"Undirected relative jump instructions which are replaced by their directed " +"(forward/backward) counterparts by the assembler." +msgstr "非定向相对跳转指令会被汇编器转换为它们定向版本(forward/backward)" + +#: ../../library/dis.rst:1980 +msgid "" +"Conditional jumps which do not impact the stack. Replaced by the sequence " +"``COPY 1``, ``TO_BOOL``, ``POP_JUMP_IF_TRUE/FALSE``." +msgstr "" +"不会对栈造成影响的有条件跳转。由序列 ``COPY 1``, ``TO_BOOL``, ``POP_JUMP_IF_TRUE/FALSE`` 代替。" + +#: ../../library/dis.rst:1985 +msgid "" +"Pushes a reference to the cell contained in slot ``i`` of the \"fast " +"locals\" storage." +msgstr "将一个引用推入到 \"fast locals\" 存储包含在 ``i`` 号槽位的单元内。" + +#: ../../library/dis.rst:1988 +msgid "" +"Note that ``LOAD_CLOSURE`` is replaced with ``LOAD_FAST`` in the assembler." +msgstr "请注意在汇编程序中 ``LOAD_CLOSURE`` 将被替换为 ``LOAD_FAST``。" + +#: ../../library/dis.rst:1990 +msgid "This opcode is now a pseudo-instruction." +msgstr "该操作码现在是一个伪指令。" + +#: ../../library/dis.rst:1997 +msgid "Opcode collections" +msgstr "操作码集合" + +#: ../../library/dis.rst:1999 +msgid "" +"These collections are provided for automatic introspection of bytecode " +"instructions:" +msgstr "提供这些集合用于字节码指令的自动内省:" + +#: ../../library/dis.rst:2002 +msgid "" +"The collections now contain pseudo instructions and instrumented " +"instructions as well. These are opcodes with values ``>= MIN_PSEUDO_OPCODE``" +" and ``>= MIN_INSTRUMENTED_OPCODE``." +msgstr "" +"现在此集合还包含伪指令和工具化指令。这些操作码的值分别 ``>= MIN_PSEUDO_OPCODE`` 和 ``>= " +"MIN_INSTRUMENTED_OPCODE``." + +#: ../../library/dis.rst:2009 +msgid "Sequence of operation names, indexable using the bytecode." +msgstr "操作名称的序列,可使用字节码来索引。" + +#: ../../library/dis.rst:2014 +msgid "Dictionary mapping operation names to bytecodes." +msgstr "映射操作名称到字节码的字典" + +#: ../../library/dis.rst:2019 +msgid "Sequence of all compare operation names." +msgstr "所有比较操作名称的序列。" + +#: ../../library/dis.rst:2024 +msgid "Sequence of bytecodes that use their argument." +msgstr "所有使用参数的字节码的序列" + +#: ../../library/dis.rst:2031 +msgid "Sequence of bytecodes that access a constant." +msgstr "访问常量的字节码序列。" + +#: ../../library/dis.rst:2036 +msgid "" +"Sequence of bytecodes that access a :term:`free (closure) variable `. 'free' in this context refers to names in the current scope that" +" are referenced by inner scopes or names in outer scopes that are referenced" +" from this scope. It does *not* include references to global or builtin " +"scopes." +msgstr "" +"访问 :term:`自由(闭包)变量 ` 的字节码序列。 " +"这里所说的‘自由’是指在当前作用域中被内层作用域所引用的名称,或在外层作用域中被此作用域所引用的名称。它 *并不* 包括对全局或内置作用域的引用。" + +#: ../../library/dis.rst:2044 +msgid "Sequence of bytecodes that access an attribute by name." +msgstr "按名称访问属性的字节码序列。" + +#: ../../library/dis.rst:2049 +msgid "Sequence of bytecodes that have a jump target. All jumps are relative." +msgstr "具有一个跳转目标的字节码序列。所有跳转都是相对的。" + +#: ../../library/dis.rst:2056 +msgid "Sequence of bytecodes that access a local variable." +msgstr "访问局部变量的字节码序列。" + +#: ../../library/dis.rst:2061 +msgid "Sequence of bytecodes of Boolean operations." +msgstr "布尔运算的字节码序列。" + +#: ../../library/dis.rst:2065 +msgid "Sequence of bytecodes that set an exception handler." +msgstr "设置一个异常处理器的字节码序列。" + +#: ../../library/dis.rst:2072 +msgid "Sequence of bytecodes that have a relative jump target." +msgstr "具有相对跳转目标的字节码序列。" + +#: ../../library/dis.rst:2074 +msgid "All jumps are now relative. Use :data:`hasjump`." +msgstr "所有跳转现在都是相对的。使用 :data:`hasjump`。" + +#: ../../library/dis.rst:2080 +msgid "Sequence of bytecodes that have an absolute jump target." +msgstr "具有绝对跳转目标的字节码序列。" + +#: ../../library/dis.rst:2082 +msgid "All jumps are now relative. This list is empty." +msgstr "所有跳转现在都是相对的。该列表将为空。" + +#: ../../library/dis.rst:1686 +msgid "built-in function" +msgstr "内置函数" + +#: ../../library/dis.rst:1686 +msgid "slice" +msgstr "slice -- 切片" diff --git a/library/distribution.po b/library/distribution.po new file mode 100644 index 0000000000..5e8bad8603 --- /dev/null +++ b/library/distribution.po @@ -0,0 +1,36 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/distribution.rst:3 +msgid "Software Packaging and Distribution" +msgstr "软件打包和分发" + +#: ../../library/distribution.rst:5 +msgid "" +"These libraries help you with publishing and installing Python software. " +"While these modules are designed to work in conjunction with the `Python " +"Package Index `__, they can also be used with a local " +"index server, or without any index server at all." +msgstr "" +"这些库可帮助你发布和安装 Python 软件。虽然这些模块设计为与 `Python 包索引 `__ " +"结合使用,但它们也可以与本地索引服务器一起使用,或者根本不使用任何索引服务器。" diff --git a/library/distutils.po b/library/distutils.po new file mode 100644 index 0000000000..9eeb105b66 --- /dev/null +++ b/library/distutils.po @@ -0,0 +1,45 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/distutils.rst:2 +msgid ":mod:`!distutils` --- Building and installing Python modules" +msgstr ":mod:`!distutils` --- 构建和安装 Python 模块" + +#: ../../library/distutils.rst:10 +msgid "" +"This module is no longer part of the Python standard library. It was " +":ref:`removed in Python 3.12 ` after being " +"deprecated in Python 3.10. The removal was decided in :pep:`632`, which has" +" `migration advice `_." +msgstr "" +"此模块已不再是 Python 标准库的一部分。它在 Python 3.10 中被弃用后又在 :ref:`Python 3.12 中被移除 " +"`。移除是在 :pep:`632` 中决定的,并提供 `迁移建议 " +"`_." + +#: ../../library/distutils.rst:16 +msgid "" +"The last version of Python that provided the :mod:`!distutils` module was " +"`Python 3.11 `_." +msgstr "" +"提供 :mod:`!distutils` 模块的最后一个 Python 版本是 `Python 3.11 " +"`_." diff --git a/library/doctest.po b/library/doctest.po new file mode 100644 index 0000000000..e6346b379c --- /dev/null +++ b/library/doctest.po @@ -0,0 +1,3322 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/doctest.rst:2 +msgid ":mod:`!doctest` --- Test interactive Python examples" +msgstr ":mod:`!doctest` --- 测试交互式的 Python 示例" + +#: ../../library/doctest.rst:7 +msgid "**Source code:** :source:`Lib/doctest.py`" +msgstr "**源代码:** :source:`Lib/doctest.py`" + +#: ../../library/doctest.rst:11 +msgid "" +"The :mod:`!doctest` module searches for pieces of text that look like " +"interactive Python sessions, and then executes those sessions to verify that" +" they work exactly as shown. There are several common ways to use doctest:" +msgstr "" +":mod:`!doctest` 模块会搜索看起来像是交互式 Python 会话的文本片段,然后执行这些会话来验证它们如展示的那样工作。 有几种常见的 " +"doctest 使用方式:" + +#: ../../library/doctest.rst:15 +msgid "" +"To check that a module's docstrings are up-to-date by verifying that all " +"interactive examples still work as documented." +msgstr "通过验证所有交互式示例仍然按照记录的方式工作,以此来检查模块的文档字符串是否是最新的。" + +#: ../../library/doctest.rst:18 +msgid "" +"To perform regression testing by verifying that interactive examples from a " +"test file or a test object work as expected." +msgstr "通过验证来自一个测试文件或一个测试对象的交互式示例按预期工作,来进行回归测试。" + +#: ../../library/doctest.rst:21 +msgid "" +"To write tutorial documentation for a package, liberally illustrated with " +"input-output examples. Depending on whether the examples or the expository " +"text are emphasized, this has the flavor of \"literate testing\" or " +"\"executable documentation\"." +msgstr "为一个包写指导性的文档,用输入输出的例子来说明。取决于是强调例子还是说明性的文字,这有一种 \"文本测试 \"或 \"可执行文档 \"的风格。" + +#: ../../library/doctest.rst:26 +msgid "Here's a complete but small example module::" +msgstr "下面是一个小却完整的示例模块::" + +#: ../../library/doctest.rst:28 +msgid "" +"\"\"\"\n" +"This is the \"example\" module.\n" +"\n" +"The example module supplies one function, factorial(). For example,\n" +"\n" +">>> factorial(5)\n" +"120\n" +"\"\"\"\n" +"\n" +"def factorial(n):\n" +" \"\"\"Return the factorial of n, an exact integer >= 0.\n" +"\n" +" >>> [factorial(n) for n in range(6)]\n" +" [1, 1, 2, 6, 24, 120]\n" +" >>> factorial(30)\n" +" 265252859812191058636308480000000\n" +" >>> factorial(-1)\n" +" Traceback (most recent call last):\n" +" ...\n" +" ValueError: n must be >= 0\n" +"\n" +" Factorials of floats are OK, but the float must be an exact integer:\n" +" >>> factorial(30.1)\n" +" Traceback (most recent call last):\n" +" ...\n" +" ValueError: n must be exact integer\n" +" >>> factorial(30.0)\n" +" 265252859812191058636308480000000\n" +"\n" +" It must also not be ridiculously large:\n" +" >>> factorial(1e100)\n" +" Traceback (most recent call last):\n" +" ...\n" +" OverflowError: n too large\n" +" \"\"\"\n" +"\n" +" import math\n" +" if not n >= 0:\n" +" raise ValueError(\"n must be >= 0\")\n" +" if math.floor(n) != n:\n" +" raise ValueError(\"n must be exact integer\")\n" +" if n+1 == n: # catch a value like 1e300\n" +" raise OverflowError(\"n too large\")\n" +" result = 1\n" +" factor = 2\n" +" while factor <= n:\n" +" result *= factor\n" +" factor += 1\n" +" return result\n" +"\n" +"\n" +"if __name__ == \"__main__\":\n" +" import doctest\n" +" doctest.testmod()" +msgstr "" +"\"\"\"\n" +"This is the \"example\" module.\n" +"\n" +"The example module supplies one function, factorial(). For example,\n" +"\n" +">>> factorial(5)\n" +"120\n" +"\"\"\"\n" +"\n" +"def factorial(n):\n" +" \"\"\"Return the factorial of n, an exact integer >= 0.\n" +"\n" +" >>> [factorial(n) for n in range(6)]\n" +" [1, 1, 2, 6, 24, 120]\n" +" >>> factorial(30)\n" +" 265252859812191058636308480000000\n" +" >>> factorial(-1)\n" +" Traceback (most recent call last):\n" +" ...\n" +" ValueError: n must be >= 0\n" +"\n" +" Factorials of floats are OK, but the float must be an exact integer:\n" +" >>> factorial(30.1)\n" +" Traceback (most recent call last):\n" +" ...\n" +" ValueError: n must be exact integer\n" +" >>> factorial(30.0)\n" +" 265252859812191058636308480000000\n" +"\n" +" It must also not be ridiculously large:\n" +" >>> factorial(1e100)\n" +" Traceback (most recent call last):\n" +" ...\n" +" OverflowError: n too large\n" +" \"\"\"\n" +"\n" +" import math\n" +" if not n >= 0:\n" +" raise ValueError(\"n must be >= 0\")\n" +" if math.floor(n) != n:\n" +" raise ValueError(\"n must be exact integer\")\n" +" if n+1 == n: # 捕获像 1e300 这样的值\n" +" raise OverflowError(\"n too large\")\n" +" result = 1\n" +" factor = 2\n" +" while factor <= n:\n" +" result *= factor\n" +" factor += 1\n" +" return result\n" +"\n" +"\n" +"if __name__ == \"__main__\":\n" +" import doctest\n" +" doctest.testmod()" + +#: ../../library/doctest.rst:83 +msgid "" +"If you run :file:`example.py` directly from the command line, " +":mod:`!doctest` works its magic:" +msgstr "" + +#: ../../library/doctest.rst:86 +msgid "" +"$ python example.py\n" +"$" +msgstr "" +"$ python example.py\n" +"$" + +#: ../../library/doctest.rst:91 +msgid "" +"There's no output! That's normal, and it means all the examples worked. " +"Pass ``-v`` to the script, and :mod:`!doctest` prints a detailed log of what" +" it's trying, and prints a summary at the end:" +msgstr "" + +#: ../../library/doctest.rst:95 +msgid "" +"$ python example.py -v\n" +"Trying:\n" +" factorial(5)\n" +"Expecting:\n" +" 120\n" +"ok\n" +"Trying:\n" +" [factorial(n) for n in range(6)]\n" +"Expecting:\n" +" [1, 1, 2, 6, 24, 120]\n" +"ok" +msgstr "" +"$ python example.py -v\n" +"Trying:\n" +" factorial(5)\n" +"Expecting:\n" +" 120\n" +"ok\n" +"Trying:\n" +" [factorial(n) for n in range(6)]\n" +"Expecting:\n" +" [1, 1, 2, 6, 24, 120]\n" +"ok" + +#: ../../library/doctest.rst:109 +msgid "And so on, eventually ending with:" +msgstr "以此类推,最终以:" + +#: ../../library/doctest.rst:111 +msgid "" +"Trying:\n" +" factorial(1e100)\n" +"Expecting:\n" +" Traceback (most recent call last):\n" +" ...\n" +" OverflowError: n too large\n" +"ok\n" +"2 items passed all tests:\n" +" 1 test in __main__\n" +" 6 tests in __main__.factorial\n" +"7 tests in 2 items.\n" +"7 passed.\n" +"Test passed.\n" +"$" +msgstr "" +"Trying:\n" +" factorial(1e100)\n" +"Expecting:\n" +" Traceback (most recent call last):\n" +" ...\n" +" OverflowError: n too large\n" +"ok\n" +"2 items passed all tests:\n" +" 1 test in __main__\n" +" 6 tests in __main__.factorial\n" +"7 tests in 2 items.\n" +"7 passed.\n" +"Test passed.\n" +"$" + +#: ../../library/doctest.rst:128 +msgid "" +"That's all you need to know to start making productive use of " +":mod:`!doctest`! Jump in. The following sections provide full details. " +"Note that there are many examples of doctests in the standard Python test " +"suite and libraries. Especially useful examples can be found in the standard" +" test file :file:`Lib/test/test_doctest/test_doctest.py`." +msgstr "" + +#: ../../library/doctest.rst:134 +msgid "" +"Output is colorized by default and can be :ref:`controlled using environment" +" variables `." +msgstr "输出在默认情况下是彩色的并且可以 :ref:`使用环境变量控制 `。" + +#: ../../library/doctest.rst:142 +msgid "Simple Usage: Checking Examples in Docstrings" +msgstr "简单用法:检查 Docstrings 中的示例" + +#: ../../library/doctest.rst:144 +msgid "" +"The simplest way to start using doctest (but not necessarily the way you'll " +"continue to do it) is to end each module :mod:`!M` with::" +msgstr "开始使用 doctest 的最简单方式(但不一定是你今后沿用的方式)是这样结束每个模块 :mod:`!M`::" + +#: ../../library/doctest.rst:147 +msgid "" +"if __name__ == \"__main__\":\n" +" import doctest\n" +" doctest.testmod()" +msgstr "" +"if __name__ == \"__main__\":\n" +" import doctest\n" +" doctest.testmod()" + +#: ../../library/doctest.rst:151 +msgid ":mod:`!doctest` then examines docstrings in module :mod:`!M`." +msgstr ":mod:`!doctest` 会随后检查模块 :mod:`!M` 中的文档字符串。" + +#: ../../library/doctest.rst:153 +msgid "" +"Running the module as a script causes the examples in the docstrings to get " +"executed and verified::" +msgstr "以脚本形式运行该模块会使文档中的例子得到执行和验证::" + +#: ../../library/doctest.rst:156 +msgid "python M.py" +msgstr "python M.py" + +#: ../../library/doctest.rst:158 +msgid "" +"This won't display anything unless an example fails, in which case the " +"failing example(s) and the cause(s) of the failure(s) are printed to stdout," +" and the final line of output is ``***Test Failed*** N failures.``, where " +"*N* is the number of examples that failed." +msgstr "" +"这不会显示任何东西,除非一个例子失败了,在这种情况下,失败的例子和失败的原因会被打印到 stdout,最后一行的输出是 ``***Test " +"Failed*** N failures.``,其中 *N* 是失败的例子的数量。" + +#: ../../library/doctest.rst:163 +msgid "Run it with the ``-v`` switch instead::" +msgstr "改用 ``-v`` 开关来运行它::" + +#: ../../library/doctest.rst:165 +msgid "python M.py -v" +msgstr "python M.py -v" + +#: ../../library/doctest.rst:167 +msgid "" +"and a detailed report of all examples tried is printed to standard output, " +"along with assorted summaries at the end." +msgstr "并将所有尝试过的例子的详细报告打印到标准输出,最后还有各种总结。" + +#: ../../library/doctest.rst:170 +msgid "" +"You can force verbose mode by passing ``verbose=True`` to :func:`testmod`, " +"or prohibit it by passing ``verbose=False``. In either of those cases, " +":data:`sys.argv` is not examined by :func:`testmod` (so passing ``-v`` or " +"not has no effect)." +msgstr "" +"你可以通过将 ``verbose=True`` 传给 :func:`testmod` 来强制应用详细模式,或者通过传入 " +"``verbose=False`` 来禁止它。在这两种情况下,:data:`sys.argv` 都不会被 :func:`testmod` " +"检查(所以是否传递 ``-v`` 都不会有影响)。" + +#: ../../library/doctest.rst:175 +msgid "" +"There is also a command line shortcut for running :func:`testmod`, see " +"section :ref:`doctest-cli`." +msgstr "另外还有一个运行 :func:`testmod` 的命令行快捷方式,参见 :ref:`doctest-cli` 一节。" + +#: ../../library/doctest.rst:178 +msgid "" +"For more information on :func:`testmod`, see section :ref:`doctest-basic-" +"api`." +msgstr "关于 :func:`testmod` 的更多信息,请参见 :ref:`doctest-basic-api` 部分。" + +#: ../../library/doctest.rst:184 +msgid "Simple Usage: Checking Examples in a Text File" +msgstr "简单的用法:检查文本文件中的例子" + +#: ../../library/doctest.rst:186 +msgid "" +"Another simple application of doctest is testing interactive examples in a " +"text file. This can be done with the :func:`testfile` function::" +msgstr "doctest 的另一个简单应用是测试文本文件中的交互式例子。这可以用 :func:`testfile` 函数来完成::" + +#: ../../library/doctest.rst:189 +msgid "" +"import doctest\n" +"doctest.testfile(\"example.txt\")" +msgstr "" +"import doctest\n" +"doctest.testfile(\"example.txt\")" + +#: ../../library/doctest.rst:192 +msgid "" +"That short script executes and verifies any interactive Python examples " +"contained in the file :file:`example.txt`. The file content is treated as " +"if it were a single giant docstring; the file doesn't need to contain a " +"Python program! For example, perhaps :file:`example.txt` contains this:" +msgstr "" +"这个简短的脚本执行并验证文件 :file:`example.txt` 中包含的任何交互式 Python " +"示例。该文件的内容被当作一个巨大的文档串来处理;该文件不需要包含一个 Python 程序!例如,也许 :file:`example.txt` " +"包含以下内容:" + +#: ../../library/doctest.rst:197 +msgid "" +"The ``example`` module\n" +"======================\n" +"\n" +"Using ``factorial``\n" +"-------------------\n" +"\n" +"This is an example text file in reStructuredText format. First import\n" +"``factorial`` from the ``example`` module:\n" +"\n" +" >>> from example import factorial\n" +"\n" +"Now use it:\n" +"\n" +" >>> factorial(6)\n" +" 120" +msgstr "" +"The ``example`` module\n" +"======================\n" +"\n" +"Using ``factorial``\n" +"-------------------\n" +"\n" +"This is an example text file in reStructuredText format. First import\n" +"``factorial`` from the ``example`` module:\n" +"\n" +" >>> from example import factorial\n" +"\n" +"Now use it:\n" +"\n" +" >>> factorial(6)\n" +" 120" + +#: ../../library/doctest.rst:215 +msgid "" +"Running ``doctest.testfile(\"example.txt\")`` then finds the error in this " +"documentation::" +msgstr "运行 ``doctest.testfile(\"example.txt\")``,然后发现这个文档中的错误::" + +#: ../../library/doctest.rst:218 +msgid "" +"File \"./example.txt\", line 14, in example.txt\n" +"Failed example:\n" +" factorial(6)\n" +"Expected:\n" +" 120\n" +"Got:\n" +" 720" +msgstr "" +"File \"./example.txt\", line 14, in example.txt\n" +"Failed example:\n" +" factorial(6)\n" +"Expected:\n" +" 120\n" +"Got:\n" +" 720" + +#: ../../library/doctest.rst:226 +msgid "" +"As with :func:`testmod`, :func:`testfile` won't display anything unless an " +"example fails. If an example does fail, then the failing example(s) and the" +" cause(s) of the failure(s) are printed to stdout, using the same format as " +":func:`!testmod`." +msgstr "" +"与 :func:`testmod` 一样,:func:`testfile` 不会显示任何东西除非一个例子失败。 " +"如果一个例子确实失败了,那么失败的例子和失败的原因将被打印到标准输出,使用的格式与 :func:`!testmod` 相同。" + +#: ../../library/doctest.rst:231 +msgid "" +"By default, :func:`testfile` looks for files in the calling module's " +"directory. See section :ref:`doctest-basic-api` for a description of the " +"optional arguments that can be used to tell it to look for files in other " +"locations." +msgstr "" +"默认情况下,:func:`testfile` 在调用模块的目录中寻找文件。参见章节 :ref:`doctest-basic-" +"api`,了解可用于告诉它在其他位置寻找文件的可选参数的描述。" + +#: ../../library/doctest.rst:235 +msgid "" +"Like :func:`testmod`, :func:`testfile`'s verbosity can be set with the " +"``-v`` command-line switch or with the optional keyword argument *verbose*." +msgstr "" +"像 :func:`testmod` 一样,:func:`testfile` 的详细程度可以通过命令行 ``-v`` 切换或可选的关键字参数 " +"*verbose* 来设置。" + +#: ../../library/doctest.rst:239 +msgid "" +"There is also a command line shortcut for running :func:`testfile`, see " +"section :ref:`doctest-cli`." +msgstr "另外还有一个运行 :func:`testfile` 的命令行快捷方式,参见 :ref:`doctest-cli` 一节。" + +#: ../../library/doctest.rst:242 +msgid "" +"For more information on :func:`testfile`, see section :ref:`doctest-basic-" +"api`." +msgstr "关于 :func:`testfile` 的更多信息,请参见 :ref:`doctest-basic-api` 一节。" + +#: ../../library/doctest.rst:248 +msgid "Command-line Usage" +msgstr "命令行用法" + +#: ../../library/doctest.rst:250 +msgid "" +"The :mod:`!doctest` module can be invoked as a script from the command line:" +msgstr "" + +#: ../../library/doctest.rst:252 +msgid "python -m doctest [-v] [-o OPTION] [-f] file [file ...]" +msgstr "python -m doctest [-v] [-o OPTION] [-f] file [file ...]" + +#: ../../library/doctest.rst:260 +msgid "" +"Detailed report of all examples tried is printed to standard output, along " +"with assorted summaries at the end::" +msgstr "所有尝试过的例子的详细报告将被打印到标准输出,最后还会带上各种总结::" + +#: ../../library/doctest.rst:263 +msgid "python -m doctest -v example.py" +msgstr "python -m doctest -v example.py" + +#: ../../library/doctest.rst:265 +msgid "" +"This will import :file:`example.py` as a standalone module and run " +":func:`testmod` on it. Note that this may not work correctly if the file is " +"part of a package and imports other submodules from that package." +msgstr "" +"这会将 :file:`example.py` 作为独立模块导入并对其运行 :func:`testmod`。 " +"请注意如果文件是某个包的一部分并且从那个包导入了其他子模块则此命令可能无法正确工作。" + +#: ../../library/doctest.rst:269 +msgid "" +"If the file name does not end with :file:`.py`, :mod:`!doctest` infers that " +"it must be run with :func:`testfile` instead::" +msgstr "" +"如果文件名不是以 :file:`.py` 结尾,:mod:`!doctest` 将推断它必须改用 :func:`testfile` 来运行::" + +#: ../../library/doctest.rst:272 +msgid "python -m doctest -v example.txt" +msgstr "python -m doctest -v example.txt" + +#: ../../library/doctest.rst:276 +msgid "" +"Option flags control various aspects of doctest's behavior, see section " +":ref:`doctest-options`." +msgstr "选项标记控制 doctest 行为的各种不同方面,参见 :ref:`doctest-options` 一节。" + +#: ../../library/doctest.rst:283 +msgid "This is shorthand for ``-o FAIL_FAST``." +msgstr "这是 ``-o FAIL_FAST`` 的简写形式。" + +#: ../../library/doctest.rst:291 +msgid "How It Works" +msgstr "它是如何工作的" + +#: ../../library/doctest.rst:293 +msgid "" +"This section examines in detail how doctest works: which docstrings it looks" +" at, how it finds interactive examples, what execution context it uses, how " +"it handles exceptions, and how option flags can be used to control its " +"behavior. This is the information that you need to know to write doctest " +"examples; for information about actually running doctest on these examples, " +"see the following sections." +msgstr "" +"这一节详细研究了 doctest " +"的工作原理:它查看哪些文档串,它如何找到交互式的用例,它使用什么执行环境,它如何处理异常,以及如何用选项标志来控制其行为。这是你写 doctest " +"例子所需要知道的信息;关于在这些例子上实际运行 doctest 的信息,请看下面的章节。" + +#: ../../library/doctest.rst:304 +msgid "Which Docstrings Are Examined?" +msgstr "哪些文档串被检查了?" + +#: ../../library/doctest.rst:306 +msgid "" +"The module docstring, and all function, class and method docstrings are " +"searched. Objects imported into the module are not searched." +msgstr "模块的文档串以及所有函数、类和方法的文档串都将被搜索。导入到模块中的对象不被搜索。" + +#: ../../library/doctest.rst:316 +msgid "" +"In addition, there are cases when you want tests to be part of a module but " +"not part of the help text, which requires that the tests not be included in " +"the docstring. Doctest looks for a module-level variable called ``__test__``" +" and uses it to locate other tests. If ``M.__test__`` exists, it must be a " +"dict, and each entry maps a (string) name to a function object, class " +"object, or string. Function and class object docstrings found from " +"``M.__test__`` are searched, and strings are treated as if they were " +"docstrings. In output, a key ``K`` in ``M.__test__`` appears with name " +"``M.__test__.K``." +msgstr "" +"此外,有时你会希望测试成为模块的一部分但不是帮助文本的一部分,这就要求测试不包括在文档字符串中。在此情况下 doctest 会查找一个名为 " +"``__test__`` 的模块级变量并用它来定位其他测试。如果 ``M.__test__`` " +"存在,则它必须是一个字典,其中每个条目都是将(字符串)名称映射到函数对象、类对象或字符串。从 ``M.__test__`` " +"找到的函数和类对象的文档字符串将会被搜索,字符串会被当作文档字符串来处理。在输出中,``M.__test__`` 中的键 ``K`` 将作为名称 " +"``M.__test__.K`` 出现。" + +#: ../../library/doctest.rst:325 +msgid "" +"For example, place this block of code at the top of :file:`example.py`:" +msgstr "例如,将这段代码放在 :file:`example.py` 的开头:" + +#: ../../library/doctest.rst:327 +msgid "" +"__test__ = {\n" +" 'numbers': \"\"\"\n" +">>> factorial(6)\n" +"720\n" +"\n" +">>> [factorial(n) for n in range(6)]\n" +"[1, 1, 2, 6, 24, 120]\n" +"\"\"\"\n" +"}" +msgstr "" +"__test__ = {\n" +" 'numbers': \"\"\"\n" +">>> factorial(6)\n" +"720\n" +"\n" +">>> [factorial(n) for n in range(6)]\n" +"[1, 1, 2, 6, 24, 120]\n" +"\"\"\"\n" +"}" + +#: ../../library/doctest.rst:339 +msgid "" +"The value of ``example.__test__[\"numbers\"]`` will be treated as a " +"docstring and all the tests inside it will be run. It is important to note " +"that the value can be mapped to a function, class object, or module; if so, " +":mod:`!doctest` searches them recursively for docstrings, which are then " +"scanned for tests." +msgstr "" +"``example.__test__[\"numbers\"]`` 的值将被视为一个文档字符串并且其中的所有测试将被运行。 " +"重要的注意事项是该值可以被映射到一个函数、类对象或模块;如果是这样的话,:mod:`!doctest` " +"会递归地搜索它们的文档字符串,然后扫描其中的测试。" + +#: ../../library/doctest.rst:345 +msgid "" +"Any classes found are recursively searched similarly, to test docstrings in " +"their contained methods and nested classes." +msgstr "任何发现的类都会以类似的方式进行递归搜索,以测试其包含的方法和嵌套类中的文档串。" + +#: ../../library/doctest.rst:350 +msgid "" +"``doctest`` can only automatically discover classes and functions that are " +"defined at the module level or inside other classes." +msgstr "``doctest`` 仅能自动发现在模块层级上或在其他类内部定义的类和函数。" + +#: ../../library/doctest.rst:353 +msgid "" +"Since nested classes and functions only exist when an outer function is " +"called, they cannot be discovered. Define them outside to make them visible." +msgstr "由于嵌套的类和函数仅在外部函数被调用时才会存在,它们是无法被发现的。请在外部定义它们以使它们可见。" + +#: ../../library/doctest.rst:359 +msgid "How are Docstring Examples Recognized?" +msgstr "文档串的例子是如何被识别的?" + +#: ../../library/doctest.rst:361 +msgid "" +"In most cases a copy-and-paste of an interactive console session works fine," +" but doctest isn't trying to do an exact emulation of any specific Python " +"shell." +msgstr "" +"在大多数情况下,对交互式控制台会话的复制和粘贴功能工作得很好,但是 doctest 并不试图对任何特定的 Python shell 进行精确的模拟。" + +#: ../../library/doctest.rst:366 +msgid "" +">>> # comments are ignored\n" +">>> x = 12\n" +">>> x\n" +"12\n" +">>> if x == 13:\n" +"... print(\"yes\")\n" +"... else:\n" +"... print(\"no\")\n" +"... print(\"NO\")\n" +"... print(\"NO!!!\")\n" +"...\n" +"no\n" +"NO\n" +"NO!!!\n" +">>>" +msgstr "" +">>> # 注释将被忽略\n" +">>> x = 12\n" +">>> x\n" +"12\n" +">>> if x == 13:\n" +"... print(\"yes\")\n" +"... else:\n" +"... print(\"no\")\n" +"... print(\"NO\")\n" +"... print(\"NO!!!\")\n" +"...\n" +"no\n" +"NO\n" +"NO!!!\n" +">>>" + +#: ../../library/doctest.rst:386 +msgid "" +"Any expected output must immediately follow the final ``'>>> '`` or ``'... " +"'`` line containing the code, and the expected output (if any) extends to " +"the next ``'>>> '`` or all-whitespace line." +msgstr "" +"任何预期的输出必须紧随包含代码的最后 ``'>>> '`` 或 ``'... '`` 行,预期的输出(如果有的话)延伸到下一 ``'>>> '`` " +"行或全空白行。" + +#: ../../library/doctest.rst:390 +msgid "The fine print:" +msgstr "细则:" + +#: ../../library/doctest.rst:392 +msgid "" +"Expected output cannot contain an all-whitespace line, since such a line is " +"taken to signal the end of expected output. If expected output does contain" +" a blank line, put ```` in your doctest example each place a " +"blank line is expected." +msgstr "" +"预期输出不能包含一个全白的行,因为这样的行被认为是预期输出的结束信号。如果预期的输出包含一个空行,在你的测试例子中,在每一个预期有空行的地方加上 " +"````." + +#: ../../library/doctest.rst:397 +msgid "" +"All hard tab characters are expanded to spaces, using 8-column tab stops. " +"Tabs in output generated by the tested code are not modified. Because any " +"hard tabs in the sample output *are* expanded, this means that if the code " +"output includes hard tabs, the only way the doctest can pass is if the " +":const:`NORMALIZE_WHITESPACE` option or :ref:`directive ` is in effect. Alternatively, the test can be rewritten to " +"capture the output and compare it to an expected value as part of the test." +" This handling of tabs in the source was arrived at through trial and " +"error, and has proven to be the least error prone way of handling them. It " +"is possible to use a different algorithm for handling tabs by writing a " +"custom :class:`DocTestParser` class." +msgstr "" +"所有硬制表符都被扩展为空格,使用 8 列的制表符。由测试代码生成的输出中的制表符不会被修改。 " +"因为样本输出中的任何硬制表符都会被扩展,这意味着如果代码输出包括硬制表符,文档测试通过的唯一方法是 " +":const:`NORMALIZE_WHITESPACE` 选项或者 :ref:`指令 ` 是有效的。 " +"另外,测试可以被重写,以捕获输出并将其与预期值进行比较,作为测试的一部分。这种对源码中标签的处理是通过试错得出的,并被证明是最不容易出错的处理方式。通过编写一个自定义的" +" :class:`DocTestParser` 类,可以使用一个不同的算法来处理标签。" + +#: ../../library/doctest.rst:409 +msgid "" +"Output to stdout is captured, but not output to stderr (exception tracebacks" +" are captured via a different means)." +msgstr "stdout 的输出会被捕获,但 stderr 的输出不会被捕获(异常回溯通过不同的方式被捕获)。" + +#: ../../library/doctest.rst:412 +msgid "" +"If you continue a line via backslashing in an interactive session, or for " +"any other reason use a backslash, you should use a raw docstring, which will" +" preserve your backslashes exactly as you type them::" +msgstr "如果你在交互式会话中通过反斜线续行,或出于任何其他原因使用反斜线,你应该使用原始文档串,它将完全保留你输入的反斜线::" + +#: ../../library/doctest.rst:416 +msgid "" +">>> def f(x):\n" +"... r'''Backslashes in a raw docstring: m\\n'''\n" +"...\n" +">>> print(f.__doc__)\n" +"Backslashes in a raw docstring: m\\n" +msgstr "" +">>> def f(x):\n" +"... r'''Backslashes in a raw docstring: m\\n'''\n" +"...\n" +">>> print(f.__doc__)\n" +"Backslashes in a raw docstring: m\\n" + +#: ../../library/doctest.rst:422 +msgid "" +"Otherwise, the backslash will be interpreted as part of the string. For " +"example, the ``\\n`` above would be interpreted as a newline character. " +"Alternatively, you can double each backslash in the doctest version (and not" +" use a raw string)::" +msgstr "" +"否则,反斜杠将被解释为字符串的一部分。例如,上面的 ``\\n`` 会被解释为一个换行符。 另外,你可以在 doctest " +"版本中把每个反斜杠加倍(而不使用原始字符串)::" + +#: ../../library/doctest.rst:426 +msgid "" +">>> def f(x):\n" +"... '''Backslashes in a raw docstring: m\\\\n'''\n" +"...\n" +">>> print(f.__doc__)\n" +"Backslashes in a raw docstring: m\\n" +msgstr "" +">>> def f(x):\n" +"... '''Backslashes in a raw docstring: m\\\\n'''\n" +"...\n" +">>> print(f.__doc__)\n" +"Backslashes in a raw docstring: m\\n" + +#: ../../library/doctest.rst:432 +msgid "The starting column doesn't matter::" +msgstr "起始列并不重要::" + +#: ../../library/doctest.rst:434 +msgid "" +">>> assert \"Easy!\"\n" +" >>> import math\n" +" >>> math.floor(1.9)\n" +" 1" +msgstr "" +">>> assert \"Easy!\"\n" +" >>> import math\n" +" >>> math.floor(1.9)\n" +" 1" + +#: ../../library/doctest.rst:439 +msgid "" +"and as many leading whitespace characters are stripped from the expected " +"output as appeared in the initial ``'>>> '`` line that started the example." +msgstr "并从预期的输出中剥离出与开始该例子的初始 ``'>>> '`` 行中出现的同样多的前导空白字符。" + +#: ../../library/doctest.rst:446 +msgid "What's the Execution Context?" +msgstr "什么是执行上下文?" + +#: ../../library/doctest.rst:448 +msgid "" +"By default, each time :mod:`!doctest` finds a docstring to test, it uses a " +"*shallow copy* of :mod:`!M`'s globals, so that running tests doesn't change " +"the module's real globals, and so that one test in :mod:`!M` can't leave " +"behind crumbs that accidentally allow another test to work. This means " +"examples can freely use any names defined at top-level in :mod:`!M`, and " +"names defined earlier in the docstring being run. Examples cannot see names " +"defined in other docstrings." +msgstr "" + +#: ../../library/doctest.rst:456 +msgid "" +"You can force use of your own dict as the execution context by passing " +"``globs=your_dict`` to :func:`testmod` or :func:`testfile` instead." +msgstr "" +"你可以通过将 ``globs=your_dict`` 传递给 :func:`testmod` 或 :func:`testfile` 来强制使用你自己的 " +"dict 作为执行环境。" + +#: ../../library/doctest.rst:463 +msgid "What About Exceptions?" +msgstr "异常如何处理?" + +#: ../../library/doctest.rst:465 +msgid "" +"No problem, provided that the traceback is the only output produced by the " +"example: just paste in the traceback. [#]_ Since tracebacks contain details" +" that are likely to change rapidly (for example, exact file paths and line " +"numbers), this is one case where doctest works hard to be flexible in what " +"it accepts." +msgstr "" +"没问题,只要回溯是这个例子产生的唯一输出:只要粘贴回溯即可。[#]_ 由于回溯所包含的细节可能会迅速变化(例如,确切的文件路径和行号),这是 " +"doctest 努力使其接受的内容具有灵活性的一种情况。" + +#: ../../library/doctest.rst:471 +msgid "Simple example::" +msgstr "简单实例::" + +#: ../../library/doctest.rst:473 +msgid "" +">>> [1, 2, 3].remove(42)\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"ValueError: list.remove(x): x not in list" +msgstr "" +">>> [1, 2, 3].remove(42)\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"ValueError: list.remove(x): x not in list" + +#: ../../library/doctest.rst:478 +msgid "" +"That doctest succeeds if :exc:`ValueError` is raised, with the " +"``list.remove(x): x not in list`` detail as shown." +msgstr "" +"如果 :exc:`ValueError` 被触发,该测试就会成功,``list.remove(x): x not in list`` 的细节如图所示。" + +#: ../../library/doctest.rst:481 +msgid "" +"The expected output for an exception must start with a traceback header, " +"which may be either of the following two lines, indented the same as the " +"first line of the example::" +msgstr "异常的预期输出必须以回溯头开始,可以是以下两行中的任何一行,缩进程度与例子中的第一行相同::" + +#: ../../library/doctest.rst:485 +msgid "" +"Traceback (most recent call last):\n" +"Traceback (innermost last):" +msgstr "" +"Traceback (most recent call last):\n" +"Traceback (innermost last):" + +#: ../../library/doctest.rst:488 +msgid "" +"The traceback header is followed by an optional traceback stack, whose " +"contents are ignored by doctest. The traceback stack is typically omitted, " +"or copied verbatim from an interactive session." +msgstr "回溯头的后面是一个可选的回溯堆栈,其内容被 doctest 忽略。回溯堆栈通常是省略的,或者从交互式会话中逐字复制的。" + +#: ../../library/doctest.rst:492 +msgid "" +"The traceback stack is followed by the most interesting part: the line(s) " +"containing the exception type and detail. This is usually the last line of " +"a traceback, but can extend across multiple lines if the exception has a " +"multi-line detail::" +msgstr "回溯堆栈的后面是最有用的部分:包含异常类型和细节的一行(几行)。这通常是回溯的最后一行,但如果异常有多行细节,则可以延伸到多行::" + +#: ../../library/doctest.rst:497 +msgid "" +">>> raise ValueError('multi\\n line\\ndetail')\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"ValueError: multi\n" +" line\n" +"detail" +msgstr "" +">>> raise ValueError('multi\\n line\\ndetail')\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"ValueError: multi\n" +" line\n" +"detail" + +#: ../../library/doctest.rst:504 +msgid "" +"The last three lines (starting with :exc:`ValueError`) are compared against " +"the exception's type and detail, and the rest are ignored." +msgstr "最后三行(以 :exc:`ValueError` 开头)将与异常的类型和细节进行比较,其余的被忽略。" + +#: ../../library/doctest.rst:507 +msgid "" +"Best practice is to omit the traceback stack, unless it adds significant " +"documentation value to the example. So the last example is probably better " +"as::" +msgstr "最佳实践是省略回溯栈,除非它为这个例子增加了重要的文档价值。因此,最后一个例子最好写成::" + +#: ../../library/doctest.rst:510 +msgid "" +">>> raise ValueError('multi\\n line\\ndetail')\n" +"Traceback (most recent call last):\n" +" ...\n" +"ValueError: multi\n" +" line\n" +"detail" +msgstr "" +">>> raise ValueError('multi\\n line\\ndetail')\n" +"Traceback (most recent call last):\n" +" ...\n" +"ValueError: multi\n" +" line\n" +"detail" + +#: ../../library/doctest.rst:517 +msgid "" +"Note that tracebacks are treated very specially. In particular, in the " +"rewritten example, the use of ``...`` is independent of doctest's " +":const:`ELLIPSIS` option. The ellipsis in that example could be left out, " +"or could just as well be three (or three hundred) commas or digits, or an " +"indented transcript of a Monty Python skit." +msgstr "" +"请注意,回溯的处理方式非常特别。特别是,在重写的例子中,``...`` 的使用与 doctest 的 :const:`ELLIPSIS` 选项无关。 " +"该例子中的省略号可以不写,也可以是三个(或三百个)逗号或数字,或者是一个缩进的 Monty Python 短剧的剧本。" + +#: ../../library/doctest.rst:523 +msgid "Some details you should read once, but won't need to remember:" +msgstr "有些细节你应该读一遍,但不需要记住:" + +#: ../../library/doctest.rst:525 +msgid "" +"Doctest can't guess whether your expected output came from an exception " +"traceback or from ordinary printing. So, e.g., an example that expects " +"``ValueError: 42 is prime`` will pass whether :exc:`ValueError` is actually " +"raised or if the example merely prints that traceback text. In practice, " +"ordinary output rarely begins with a traceback header line, so this doesn't " +"create real problems." +msgstr "" +"Doctest 不能猜测你的预期输出是来自异常回溯还是来自普通打印。因此,例如,一个期望 ``ValueError: 42 is prime`` " +"的用例将通过测试,无论 :exc:`ValueError` 是真的被触发,或者该用例只是打印了该回溯文本。 " +"在实践中,普通输出很少以回溯标题行开始,所以这不会产生真正的问题。" + +#: ../../library/doctest.rst:532 +msgid "" +"Each line of the traceback stack (if present) must be indented further than " +"the first line of the example, *or* start with a non-alphanumeric character." +" The first line following the traceback header indented the same and " +"starting with an alphanumeric is taken to be the start of the exception " +"detail. Of course this does the right thing for genuine tracebacks." +msgstr "" +"回溯堆栈的每一行(如果有的话)必须比例子的第一行缩进, *或者* " +"以一个非字母数字的字符开始。回溯头之后的第一行缩进程度相同,并且以字母数字开始,被认为是异常细节的开始。当然,这对真正的回溯来说是正确的事情。" + +#: ../../library/doctest.rst:538 +msgid "" +"When the :const:`IGNORE_EXCEPTION_DETAIL` doctest option is specified, " +"everything following the leftmost colon and any module information in the " +"exception name is ignored." +msgstr "" +"当 :const:`IGNORE_EXCEPTION_DETAIL` doctest " +"选项被指定时,最左边的冒号后面的所有内容以及异常名称中的任何模块信息都被忽略。" + +#: ../../library/doctest.rst:542 +msgid "" +"The interactive shell omits the traceback header line for some " +":exc:`SyntaxError`\\ s. But doctest uses the traceback header line to " +"distinguish exceptions from non-exceptions. So in the rare case where you " +"need to test a :exc:`!SyntaxError` that omits the traceback header, you will" +" need to manually add the traceback header line to your test example." +msgstr "" +"交互式 shell 省略了某些 :exc:`SyntaxError` 的回溯的标头行。但 doctest 使用回溯标头行来区分异常和非异常。 " +"所以在你需要测试一个省略了回溯标头的 :exc:`!SyntaxError` 的罕见情况下,你将需要手动添加回溯标头行到你的测试用例中。" + +#: ../../library/doctest.rst:550 +msgid "" +"For some exceptions, Python displays the position of the error using ``^`` " +"markers and tildes::" +msgstr "对于某些异常,Python 会使用 ``^`` 标记和波浪号来显示错误位置::" + +#: ../../library/doctest.rst:553 +msgid "" +">>> 1 + None\n" +" File \"\", line 1\n" +" 1 + None\n" +" ~~^~~~~~\n" +"TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'" +msgstr "" +">>> 1 + None\n" +" File \"\", line 1\n" +" 1 + None\n" +" ~~^~~~~~\n" +"TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'" + +#: ../../library/doctest.rst:559 +msgid "" +"Since the lines showing the position of the error come before the exception " +"type and detail, they are not checked by doctest. For example, the " +"following test would pass, even though it puts the ``^`` marker in the wrong" +" location::" +msgstr "" +"由于显示错误位置的行在异常类型和细节之前,它们不被 doctest 检查。例如,下面的测试会通过,尽管它把 ``^`` 标记放在了错误的位置::" + +#: ../../library/doctest.rst:563 +msgid "" +">>> 1 + None\n" +" File \"\", line 1\n" +" 1 + None\n" +" ^~~~~~~~\n" +"TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'" +msgstr "" +">>> 1 + None\n" +" File \"\", line 1\n" +" 1 + None\n" +" ^~~~~~~~\n" +"TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'" + +#: ../../library/doctest.rst:574 +msgid "Option Flags" +msgstr "选项标记" + +#: ../../library/doctest.rst:576 +msgid "" +"A number of option flags control various aspects of doctest's behavior. " +"Symbolic names for the flags are supplied as module constants, which can be " +":ref:`bitwise ORed ` together and passed to various functions. The " +"names can also be used in :ref:`doctest directives `, " +"and may be passed to the doctest command line interface via the ``-o`` " +"option." +msgstr "" +"一系列选项旗标控制着 doctest 的各方面行为。旗标的符号名称以模块常量的形式提供,可以 :ref:`按位或 ` " +"在一起并传递给各种函数。这些名称也可以在 :ref:`doctest 指令 ` 中使用,并且可以通过 " +"``-o`` 选项传递给 doctest 命令行接口。" + +#: ../../library/doctest.rst:582 +msgid "" +"The first group of options define test semantics, controlling aspects of how" +" doctest decides whether actual output matches an example's expected output:" +msgstr "第一组选项定义了测试语义,控制 doctest 如何决定实际输出是否与用例的预期输出相匹配方面的问题。" + +#: ../../library/doctest.rst:588 +msgid "" +"By default, if an expected output block contains just ``1``, an actual " +"output block containing just ``1`` or just ``True`` is considered to be a " +"match, and similarly for ``0`` versus ``False``. When " +":const:`DONT_ACCEPT_TRUE_FOR_1` is specified, neither substitution is " +"allowed. The default behavior caters to that Python changed the return type" +" of many functions from integer to boolean; doctests expecting \"little " +"integer\" output still work in these cases. This option will probably go " +"away, but not for several years." +msgstr "" +"默认情况下,如果一个预期的输出块只包含 ``1``,那么实际的输出块只包含 ``1`` 或只包含 ``True`` 就被认为是匹配的,同样,``0`` " +"与 ``False`` 也是如此。当 :const:`DONT_ACCEPT_TRUE_FOR_1` 被指定时,两种替换都不允许。 默认行为是为了适应" +" Python 将许多函数的返回类型从整数改为布尔值;期望 \"小整数\" 输出的测试在这些情况下仍然有效。 这个选项可能会消失,但不会在几年内消失。" + +#: ../../library/doctest.rst:600 +msgid "" +"By default, if an expected output block contains a line containing only the " +"string ````, then that line will match a blank line in the actual" +" output. Because a genuinely blank line delimits the expected output, this " +"is the only way to communicate that a blank line is expected. When " +":const:`DONT_ACCEPT_BLANKLINE` is specified, this substitution is not " +"allowed." +msgstr "" +"默认情况下,如果一个预期输出块包含一个只包含字符串 ```` 的行,那么该行将与实际输出中的一个空行相匹配。 " +"因为一个真正的空行是对预期输出的限定,这是传达预期空行的唯一方法。当 :const:`DONT_ACCEPT_BLANKLINE` " +"被指定时,这种替换是不允许的。" + +#: ../../library/doctest.rst:609 +msgid "" +"When specified, all sequences of whitespace (blanks and newlines) are " +"treated as equal. Any sequence of whitespace within the expected output " +"will match any sequence of whitespace within the actual output. By default, " +"whitespace must match exactly. :const:`NORMALIZE_WHITESPACE` is especially " +"useful when a line of expected output is very long, and you want to wrap it " +"across multiple lines in your source." +msgstr "" +"当指定时,所有的空白序列(空白和换行)都被视为相等。预期输出中的任何空白序列将与实际输出中的任何空白序列匹配。默认情况下,空白必须完全匹配。 " +":const:`NORMALIZE_WHITESPACE` 在预期输出非常长的一行,而你想把它包在源代码的多行中时特别有用。" + +#: ../../library/doctest.rst:620 +msgid "" +"When specified, an ellipsis marker (``...``) in the expected output can " +"match any substring in the actual output. This includes substrings that " +"span line boundaries, and empty substrings, so it's best to keep usage of " +"this simple. Complicated uses can lead to the same kinds of \"oops, it " +"matched too much!\" surprises that ``.*`` is prone to in regular " +"expressions." +msgstr "" +"当指定时,预期输出中的省略号 (``...``) 可以匹配实际输出中的任何子串。 这包括跨行的子串和空子串,所以最好保持简单的用法。 复杂的用法会导致与" +" ``.*`` 在正则表达式中容易出现的 \"oops, it matched too much!\" 相同的意外情况。" + +#: ../../library/doctest.rst:629 +msgid "" +"When specified, doctests expecting exceptions pass so long as an exception " +"of the expected type is raised, even if the details (message and fully " +"qualified exception name) don't match." +msgstr "当被指定时,只要有预期类型的异常被引发 doctests 就会预期异常测试通过,即使细节(消息和完整限定名称)并不匹配。" + +#: ../../library/doctest.rst:633 +msgid "" +"For example, an example expecting ``ValueError: 42`` will pass if the actual" +" exception raised is ``ValueError: 3*14``, but will fail if, say, a " +":exc:`TypeError` is raised instead. It will also ignore any fully qualified " +"name included before the exception class, which can vary between " +"implementations and versions of Python and the code/libraries in use. Hence," +" all three of these variations will work with the flag specified:" +msgstr "" +"举例来说,一个预期 ``ValueError: 42`` 的用例在实际引发的异常为 ``ValueError: 3*14`` 将会通过,但是如果是引发 " +":exc:`TypeError` 则将会失败。它也将忽略任何包括在异常类前面的完整限定名称,该名称在所使用的不同 Python " +"版本和代码/库中可能会不同。因此,以下三种形式对于指定的旗标均有效:" + +#: ../../library/doctest.rst:641 +msgid "" +">>> raise Exception('message')\n" +"Traceback (most recent call last):\n" +"Exception: message\n" +"\n" +">>> raise Exception('message')\n" +"Traceback (most recent call last):\n" +"builtins.Exception: message\n" +"\n" +">>> raise Exception('message')\n" +"Traceback (most recent call last):\n" +"__main__.Exception: message" +msgstr "" +">>> raise Exception('message')\n" +"Traceback (most recent call last):\n" +"Exception: message\n" +"\n" +">>> raise Exception('message')\n" +"Traceback (most recent call last):\n" +"builtins.Exception: message\n" +"\n" +">>> raise Exception('message')\n" +"Traceback (most recent call last):\n" +"__main__.Exception: message" + +#: ../../library/doctest.rst:655 +msgid "" +"Note that :const:`ELLIPSIS` can also be used to ignore the details of the " +"exception message, but such a test may still fail based on whether the " +"module name is present or matches exactly." +msgstr "" +"请注意 :const:`ELLIPSIS` 也可以被用来忽略异常消息中的细节,但这样的测试仍然可能根据特定模块名称是否存在或是否完全匹配而失败。" + +#: ../../library/doctest.rst:659 +msgid "" +":const:`IGNORE_EXCEPTION_DETAIL` now also ignores any information relating " +"to the module containing the exception under test." +msgstr ":const:`IGNORE_EXCEPTION_DETAIL` 现在也忽略了与包含被测异常的模块有关的任何信息。" + +#: ../../library/doctest.rst:666 +msgid "" +"When specified, do not run the example at all. This can be useful in " +"contexts where doctest examples serve as both documentation and test cases, " +"and an example should be included for documentation purposes, but should not" +" be checked. E.g., the example's output might be random; or the example " +"might depend on resources which would be unavailable to the test driver." +msgstr "" +"当指定时,完全不运行这个用例。 这在 doctest " +"用例既是文档又是测试案例的情况下很有用,一个例子应该包括在文档中,但不应该被检查。例如,这个例子的输出可能是随机的;或者这个例子可能依赖于测试驱动程序所不能使用的资源。" + +#: ../../library/doctest.rst:672 +msgid "" +"The SKIP flag can also be used for temporarily \"commenting out\" examples." +msgstr "SKIP 标志也可用于临时 \"注释\" 用例。" + +#: ../../library/doctest.rst:677 +msgid "A bitmask or'ing together all the comparison flags above." +msgstr "一个比特或运算将上述所有的比较标志放在一起。" + +#: ../../library/doctest.rst:679 +msgid "The second group of options controls how test failures are reported:" +msgstr "第二组选项控制测试失败的报告方式:" + +#: ../../library/doctest.rst:684 +msgid "" +"When specified, failures that involve multi-line expected and actual outputs" +" are displayed using a unified diff." +msgstr "当指定时,涉及多行预期和实际输出的故障将使用统一的差异来显示。" + +#: ../../library/doctest.rst:690 +msgid "" +"When specified, failures that involve multi-line expected and actual outputs" +" will be displayed using a context diff." +msgstr "当指定时,涉及多行预期和实际输出的故障将使用上下文差异来显示。" + +#: ../../library/doctest.rst:696 +msgid "" +"When specified, differences are computed by ``difflib.Differ``, using the " +"same algorithm as the popular :file:`ndiff.py` utility. This is the only " +"method that marks differences within lines as well as across lines. For " +"example, if a line of expected output contains digit ``1`` where actual " +"output contains letter ``l``, a line is inserted with a caret marking the " +"mismatching column positions." +msgstr "" +"当指定时,差异由 ``difflib.Differ`` 来计算,使用与流行的 :file:`ndiff.py` 工具相同的算法。 " +"这是唯一一种标记行内和行间差异的方法。例如,如果一行预期输出包含数字 ``1``,而实际输出包含字母 ``l`` " +",那么就会插入一行,用圆点标记不匹配的列位置。" + +#: ../../library/doctest.rst:705 +msgid "" +"When specified, display the first failing example in each doctest, but " +"suppress output for all remaining examples. This will prevent doctest from " +"reporting correct examples that break because of earlier failures; but it " +"might also hide incorrect examples that fail independently of the first " +"failure. When :const:`REPORT_ONLY_FIRST_FAILURE` is specified, the " +"remaining examples are still run, and still count towards the total number " +"of failures reported; only the output is suppressed." +msgstr "" +"当指定时,在每个 doctest 中显示第一个失败的用例,但隐藏所有其余用例的输出。这将防止 doctest " +"报告由于先前的失败而中断的正确用例;但也可能隐藏独立于第一个失败的不正确用例。当 :const:`REPORT_ONLY_FIRST_FAILURE` " +"被指定时,其余的用例仍然被运行,并且仍然计入报告的失败总数;只是输出被隐藏了。" + +#: ../../library/doctest.rst:716 +msgid "" +"When specified, exit after the first failing example and don't attempt to " +"run the remaining examples. Thus, the number of failures reported will be at" +" most 1. This flag may be useful during debugging, since examples after the" +" first failure won't even produce debugging output." +msgstr "" +"当指定时,在第一个失败的用例后退出,不尝试运行其余的用例。因此,报告的失败次数最多为 " +"1。这个标志在调试时可能很有用,因为第一个失败后的用例甚至不会产生调试输出。" + +#: ../../library/doctest.rst:724 +msgid "A bitmask or'ing together all the reporting flags above." +msgstr "一个比特或操作将上述所有的报告标志组合在一起。" + +#: ../../library/doctest.rst:727 +msgid "" +"There is also a way to register new option flag names, though this isn't " +"useful unless you intend to extend :mod:`!doctest` internals via " +"subclassing:" +msgstr "" + +#: ../../library/doctest.rst:733 +msgid "" +"Create a new option flag with a given name, and return the new flag's " +"integer value. :func:`register_optionflag` can be used when subclassing " +":class:`OutputChecker` or :class:`DocTestRunner` to create new options that " +"are supported by your subclasses. :func:`register_optionflag` should always" +" be called using the following idiom::" +msgstr "" +"用给定的名称创建一个新的选项标志,并返回新标志的整数值。 :func:`register_optionflag` 可以在继承 " +":class:`OutputChecker` 或 :class:`DocTestRunner` 时使用,以创建子类支持的新选项。 " +":func:`register_optionflag` 应始终使用以下方式调用::" + +#: ../../library/doctest.rst:739 +msgid "MY_FLAG = register_optionflag('MY_FLAG')" +msgstr "MY_FLAG = register_optionflag('MY_FLAG')" + +#: ../../library/doctest.rst:749 +msgid "Directives" +msgstr "指令" + +#: ../../library/doctest.rst:751 +msgid "" +"Doctest directives may be used to modify the :ref:`option flags ` for an individual example. Doctest directives are special Python " +"comments following an example's source code:" +msgstr "" +"Doctest 指令可以用来修改单个例子的 :ref:`option flags `。 Doctest " +"指令是在一个用例的源代码后面的特殊 Python 注释。" + +#: ../../library/doctest.rst:762 +msgid "" +"Whitespace is not allowed between the ``+`` or ``-`` and the directive " +"option name. The directive option name can be any of the option flag names " +"explained above." +msgstr "``+`` 或 ``-`` 与指令选项名称之间不允许有空格。指令选项名称可以是上面解释的任何一个选项标志名称。" + +#: ../../library/doctest.rst:766 +msgid "" +"An example's doctest directives modify doctest's behavior for that single " +"example. Use ``+`` to enable the named behavior, or ``-`` to disable it." +msgstr "" +"一个用例的 doctest 指令可以修改 doctest 对该用例的行为。使用 ``+`` 来启用指定的行为,或者使用 ``-`` 来禁用它。" + +#: ../../library/doctest.rst:769 +msgid "For example, this test passes:" +msgstr "例如,这个测试将会通过:" + +#: ../../library/doctest.rst:771 +msgid "" +">>> print(list(range(20))) # doctest: +NORMALIZE_WHITESPACE\n" +"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9,\n" +"10, 11, 12, 13, 14, 15, 16, 17, 18, 19]" +msgstr "" +">>> print(list(range(20))) # doctest: +NORMALIZE_WHITESPACE\n" +"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9,\n" +"10, 11, 12, 13, 14, 15, 16, 17, 18, 19]" + +#: ../../library/doctest.rst:778 +msgid "" +"Without the directive it would fail, both because the actual output doesn't " +"have two blanks before the single-digit list elements, and because the " +"actual output is on a single line. This test also passes, and also requires" +" a directive to do so:" +msgstr "" +"如果没有这个指令则它将失败,因为实际的输出在只有个位数的列表元素前没有两个空格,也因为实际的输出是单行的。这个测试也会通过,并且也需要一个指令来完成:" + +#: ../../library/doctest.rst:783 +msgid "" +">>> print(list(range(20))) # doctest: +ELLIPSIS\n" +"[0, 1, ..., 18, 19]" +msgstr "" +">>> print(list(range(20))) # doctest: +ELLIPSIS\n" +"[0, 1, ..., 18, 19]" + +#: ../../library/doctest.rst:789 +msgid "" +"Multiple directives can be used on a single physical line, separated by " +"commas:" +msgstr "在单个物理行中可以使用多条指令,以逗号分隔:" + +#: ../../library/doctest.rst:792 +msgid "" +">>> print(list(range(20))) # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE\n" +"[0, 1, ..., 18, 19]" +msgstr "" +">>> print(list(range(20))) # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE\n" +"[0, 1, ..., 18, 19]" + +#: ../../library/doctest.rst:798 +msgid "" +"If multiple directive comments are used for a single example, then they are " +"combined:" +msgstr "如果在单个用例中使用了多条指令注释,则它们会被合并:" + +#: ../../library/doctest.rst:801 +msgid "" +">>> print(list(range(20))) # doctest: +ELLIPSIS\n" +"... # doctest: +NORMALIZE_WHITESPACE\n" +"[0, 1, ..., 18, 19]" +msgstr "" +">>> print(list(range(20))) # doctest: +ELLIPSIS\n" +"... # doctest: +NORMALIZE_WHITESPACE\n" +"[0, 1, ..., 18, 19]" + +#: ../../library/doctest.rst:808 +msgid "" +"As the previous example shows, you can add ``...`` lines to your example " +"containing only directives. This can be useful when an example is too long " +"for a directive to comfortably fit on the same line:" +msgstr "正如前面的例子所示,你可以在你的用例中添加只包含指令的行 ``...``。当一个用例太长以至于不能方便地放到同一行时这将会很有用:" + +#: ../../library/doctest.rst:812 +msgid "" +">>> print(list(range(5)) + list(range(10, 20)) + list(range(30, 40)))\n" +"... # doctest: +ELLIPSIS\n" +"[0, ..., 4, 10, ..., 19, 30, ..., 39]" +msgstr "" +">>> print(list(range(5)) + list(range(10, 20)) + list(range(30, 40)))\n" +"... # doctest: +ELLIPSIS\n" +"[0, ..., 4, 10, ..., 19, 30, ..., 39]" + +#: ../../library/doctest.rst:819 +msgid "" +"Note that since all options are disabled by default, and directives apply " +"only to the example they appear in, enabling options (via ``+`` in a " +"directive) is usually the only meaningful choice. However, option flags can" +" also be passed to functions that run doctests, establishing different " +"defaults. In such cases, disabling an option via ``-`` in a directive can " +"be useful." +msgstr "" +"请注意,由于所有的选项都是默认禁用的,而指令只适用于它们出现的用例,所以启用选项 (通过指令中的 ``+``) 通常是唯一有意义的选择。 " +"然而,选项标志也可以被传递给运行测试的函数,建立不同的默认值。在这种情况下,通过指令中的 ``-`` 来禁用一个选项可能是有用的。" + +#: ../../library/doctest.rst:829 +msgid "Warnings" +msgstr "警告" + +#: ../../library/doctest.rst:831 +msgid "" +":mod:`!doctest` is serious about requiring exact matches in expected output." +" If even a single character doesn't match, the test fails. This will " +"probably surprise you a few times, as you learn exactly what Python does and" +" doesn't guarantee about output. For example, when printing a set, Python " +"doesn't guarantee that the element is printed in any particular order, so a " +"test like ::" +msgstr "" + +#: ../../library/doctest.rst:837 +msgid "" +">>> foo()\n" +"{\"spam\", \"eggs\"}" +msgstr "" +">>> foo()\n" +"{\"spam\", \"eggs\"}" + +#: ../../library/doctest.rst:840 +msgid "is vulnerable! One workaround is to do ::" +msgstr "是不可靠的!一个变通方法是用::" + +#: ../../library/doctest.rst:842 +msgid "" +">>> foo() == {\"spam\", \"eggs\"}\n" +"True" +msgstr "" +">>> foo() == {\"spam\", \"eggs\"}\n" +"True" + +#: ../../library/doctest.rst:845 +msgid "instead. Another is to do ::" +msgstr "来取代。另一个是使用::" + +#: ../../library/doctest.rst:847 +msgid "" +">>> d = sorted(foo())\n" +">>> d\n" +"['eggs', 'spam']" +msgstr "" +">>> d = sorted(foo())\n" +">>> d\n" +"['eggs', 'spam']" + +#: ../../library/doctest.rst:851 +msgid "There are others, but you get the idea." +msgstr "还有其他的问题,但你会明白的。" + +#: ../../library/doctest.rst:853 +msgid "Another bad idea is to print things that embed an object address, like" +msgstr "另一个不好的做法是打印嵌入了对象地址的值,例如" + +#: ../../library/doctest.rst:855 +msgid "" +">>> id(1.0) # certain to fail some of the time\n" +"7948648\n" +">>> class C: pass\n" +">>> C() # the default repr() for instances embeds an address\n" +"" +msgstr "" +">>> id(1.0) # 确定有时会失败\n" +"7948648\n" +">>> class C: pass\n" +">>> C() # 实例的默认 repr() 嵌入了一个地址\n" +"" + +#: ../../library/doctest.rst:863 +msgid "" +"The :const:`ELLIPSIS` directive gives a nice approach for the last example:" +msgstr ":const:`ELLIPSIS` 指令为之前的例子提供了一个不错的方案:" + +#: ../../library/doctest.rst:865 +msgid "" +">>> C() # doctest: +ELLIPSIS\n" +"" +msgstr "" +">>> C() # doctest: +ELLIPSIS\n" +"" + +#: ../../library/doctest.rst:871 +msgid "" +"Floating-point numbers are also subject to small output variations across " +"platforms, because Python defers to the platform C library for some " +"floating-point calculations, and C libraries vary widely in quality here. ::" +msgstr "" +"浮点数在不同平台上也会有小幅度的输出变化,因为 Python 的某些浮点计算依赖于平台的 C 库,而各种 C 库在此方面的质量有很大的差异。 ::" + +#: ../../library/doctest.rst:875 +msgid "" +">>> 1000**0.1 # risky\n" +"1.9952623149688797\n" +">>> round(1000**0.1, 9) # safer\n" +"1.995262315\n" +">>> print(f'{1000**0.1:.4f}') # much safer\n" +"1.9953" +msgstr "" +">>> 1000**0.1 # 危险\n" +"1.9952623149688797\n" +">>> round(1000**0.1, 9) # 更安全\n" +"1.995262315\n" +">>> print(f'{1000**0.1:.4f}') # 非常安全\n" +"1.9953" + +#: ../../library/doctest.rst:882 +msgid "" +"Numbers of the form ``I/2.**J`` are safe across all platforms, and I often " +"contrive doctest examples to produce numbers of that form::" +msgstr "形式 ``I/2.**J`` 的数字在所有的平台上都是安全的,我经常设计一些测试的用例来产生该形式的数::" + +#: ../../library/doctest.rst:885 +msgid "" +">>> 3./4 # utterly safe\n" +"0.75" +msgstr "" +">>> 3./4 # 绝对安全\n" +"0.75" + +#: ../../library/doctest.rst:888 +msgid "" +"Simple fractions are also easier for people to understand, and that makes " +"for better documentation." +msgstr "简单的分数也更容易让人理解,这也使得文档更加完善。" + +#: ../../library/doctest.rst:895 +msgid "Basic API" +msgstr "基本 API" + +#: ../../library/doctest.rst:897 +msgid "" +"The functions :func:`testmod` and :func:`testfile` provide a simple " +"interface to doctest that should be sufficient for most basic uses. For a " +"less formal introduction to these two functions, see sections :ref:`doctest-" +"simple-testmod` and :ref:`doctest-simple-testfile`." +msgstr "" +"函数 :func:`testmod` 和 :func:`testfile` 为 doctest " +"提供了一个简单的接口,应该足以满足大多数基本用途。关于这两个函数的不太正式的介绍,请参见 :ref:`doctest-simple-testmod` 和" +" :ref:`doctest-simple-testfile` 部分。" + +#: ../../library/doctest.rst:905 +msgid "" +"All arguments except *filename* are optional, and should be specified in " +"keyword form." +msgstr "除了*filename*,所有的参数都是可选的,而且应该以关键字的形式指定。" + +#: ../../library/doctest.rst:908 +msgid "" +"Test examples in the file named *filename*. Return ``(failure_count, " +"test_count)``." +msgstr "测试名为 *filename* 的文件中的用例。返回 ``(failure_count, test_count)``。" + +#: ../../library/doctest.rst:911 +msgid "" +"Optional argument *module_relative* specifies how the filename should be " +"interpreted:" +msgstr "可选参数 *module_relative* 指定了文件名的解释方式。" + +#: ../../library/doctest.rst:914 +msgid "" +"If *module_relative* is ``True`` (the default), then *filename* specifies an" +" OS-independent module-relative path. By default, this path is relative to " +"the calling module's directory; but if the *package* argument is specified, " +"then it is relative to that package. To ensure OS-independence, *filename* " +"should use ``/`` characters to separate path segments, and may not be an " +"absolute path (i.e., it may not begin with ``/``)." +msgstr "" +"如果 *module_relative* 是 ``True`` (默认),那么 *filename* 指定一个独立于操作系统的模块相对路径。 " +"默认情况下,这个路径是相对于调用模块的目录的;但是如果指定了 *package* 参数,那么它就是相对于该包的。为了保证操作系统的独立性, " +"*filename* 应该使用字符来分隔路径段,并且不能是一个绝对路径 (即不能以 ``/`` 开始)。" + +#: ../../library/doctest.rst:921 +msgid "" +"If *module_relative* is ``False``, then *filename* specifies an OS-specific " +"path. The path may be absolute or relative; relative paths are resolved " +"with respect to the current working directory." +msgstr "" +"如果 *module_relative* 是 ``False``,那么 *filename* " +"指定了一个操作系统特定的路径。路径可以是绝对的,也可以是相对的;相对路径是相对于当前工作目录而言的。" + +#: ../../library/doctest.rst:925 +msgid "" +"Optional argument *name* gives the name of the test; by default, or if " +"``None``, ``os.path.basename(filename)`` is used." +msgstr "" +"可选参数 *name* 给出了测试的名称;默认情况下,或者如果是 ``None``,那么使用 " +"``os.path.basename(filename)``。" + +#: ../../library/doctest.rst:928 +msgid "" +"Optional argument *package* is a Python package or the name of a Python " +"package whose directory should be used as the base directory for a module-" +"relative filename. If no package is specified, then the calling module's " +"directory is used as the base directory for module-relative filenames. It " +"is an error to specify *package* if *module_relative* is ``False``." +msgstr "" +"可选参数 *package* 是一个 Python 包或一个 Python 包的名字,其目录应被用作模块相关文件名的基础目录。 " +"如果没有指定包,那么调用模块的目录将作为模块相关文件名的基础目录。如果 *module_relative* 是 ``False``,那么指定 " +"*package* 是错误的。" + +#: ../../library/doctest.rst:934 +msgid "" +"Optional argument *globs* gives a dict to be used as the globals when " +"executing examples. A new shallow copy of this dict is created for the " +"doctest, so its examples start with a clean slate. By default, or if " +"``None``, a new empty dict is used." +msgstr "" +"可选参数 *globs* 给出了一个在执行示例时用作全局变量的 dict。 这个 dict 的一个新的浅层副本将为 doctest " +"创建,因此它的用例将从一个干净的地方开始。默认情况下,或者如果为 ``None``,使用一个新的空 dict。" + +#: ../../library/doctest.rst:939 +msgid "" +"Optional argument *extraglobs* gives a dict merged into the globals used to " +"execute examples. This works like :meth:`dict.update`: if *globs* and " +"*extraglobs* have a common key, the associated value in *extraglobs* appears" +" in the combined dict. By default, or if ``None``, no extra globals are " +"used. This is an advanced feature that allows parameterization of doctests." +" For example, a doctest can be written for a base class, using a generic " +"name for the class, then reused to test any number of subclasses by passing " +"an *extraglobs* dict mapping the generic name to the subclass to be tested." +msgstr "" +"可选参数 *extraglobs* 给出了一个合并到用于执行用例全局变量中的 dict。这就像 :meth:`dict.update` 一样:如果 " +"*globs* 和 *extraglobs* 有一个共同的键,那么 *extraglobs* 中的相关值会出现在合并的 dict 中。默认情况下,或者为" +" ``None``,则不使用额外的全局变量。这是一个高级功能,允许对 doctest " +"进行参数化。例如,可以为一个基类写一个测试,使用该类的通用名称,然后通过传递一个 *extraglobs* " +"dict,将通用名称映射到要测试的子类,从而重复用于测试任何数量的子类。" + +#: ../../library/doctest.rst:948 +msgid "" +"Optional argument *verbose* prints lots of stuff if true, and prints only " +"failures if false; by default, or if ``None``, it's true if and only if " +"``'-v'`` is in :data:`sys.argv`." +msgstr "" +"可选参数 *verbose* 如果为真值则会打印很多内容,如果为假值则只打印失败信息;在默认情况下,或者在为 ``None`` 时,则当且仅当 " +"``'-v'`` 在 :data:`sys.argv` 中时才会为真值。" + +#: ../../library/doctest.rst:952 +msgid "" +"Optional argument *report* prints a summary at the end when true, else " +"prints nothing at the end. In verbose mode, the summary is detailed, else " +"the summary is very brief (in fact, empty if all tests passed)." +msgstr "" +"可选参数 *report* 为 True 时,在结尾处打印一个总结,否则在结尾处什么都不打印。 在 verbose " +"模式下,总结是详细的,否则总结是非常简短的(事实上,如果所有的测试都通过了,总结就是空的)。" + +#: ../../library/doctest.rst:956 +msgid "" +"Optional argument *optionflags* (default value ``0``) takes the " +":ref:`bitwise OR ` of option flags. See section :ref:`doctest-" +"options`." +msgstr "" +"可选参数 *optionflags* (默认值为 ``0``) 接受选项旗标 :ref:`按位或 ` 的结果。 参见 " +":ref:`doctest-options` 一节。" + +#: ../../library/doctest.rst:960 +msgid "" +"Optional argument *raise_on_error* defaults to false. If true, an exception" +" is raised upon the first failure or unexpected exception in an example. " +"This allows failures to be post-mortem debugged. Default behavior is to " +"continue running examples." +msgstr "" +"可选参数 *raise_on_error* 默认为 False。 如果是 " +"True,在一个用例中第一次出现失败或意外的异常时,会触发一个异常。这允许对失败进行事后调试。默认行为是继续运行例子。" + +#: ../../library/doctest.rst:965 ../../library/doctest.rst:1111 +msgid "" +"Optional argument *parser* specifies a :class:`DocTestParser` (or subclass) " +"that should be used to extract tests from the files. It defaults to a " +"normal parser (i.e., ``DocTestParser()``)." +msgstr "" +"可选参数 *parser* 指定一个 :class:`DocTestParser` (或子类),它应该被用来从文件中提取测试。它默认为一个普通的解析器 " +"(即 ``DocTestParser()``)。" + +#: ../../library/doctest.rst:969 ../../library/doctest.rst:1115 +msgid "" +"Optional argument *encoding* specifies an encoding that should be used to " +"convert the file to unicode." +msgstr "可选参数 *encoding* 指定了一个编码,应该用来将文件转换为 unicode。" + +#: ../../library/doctest.rst:975 +msgid "" +"All arguments are optional, and all except for *m* should be specified in " +"keyword form." +msgstr "所有的参数都是可选的,除了 *m* 之外,都应该以关键字的形式指定。" + +#: ../../library/doctest.rst:978 +msgid "" +"Test examples in docstrings in functions and classes reachable from module " +"*m* (or module :mod:`__main__` if *m* is not supplied or is ``None``), " +"starting with ``m.__doc__``." +msgstr "" +"测试从模块 *m* (或模块 :mod:`__main__`,如果 *m* 没有被提供或为 ``None``) 可达到的函数和类的文档串中的用例,从 " +"``m.__doc__`` 开始。" + +#: ../../library/doctest.rst:982 +msgid "" +"Also test examples reachable from dict ``m.__test__``, if it exists. " +"``m.__test__`` maps names (strings) to functions, classes and strings; " +"function and class docstrings are searched for examples; strings are " +"searched directly, as if they were docstrings." +msgstr "" +"还会测试从 dict ``m.__test__`` 可达到的用例,如果存在的话。``m.__test__`` " +"将名称(字符串)映射到函数、类和字符串;将在函数和类的文档字符串中搜索用例;字符串将被直接搜索,就像它们是文档字符串一样。" + +#: ../../library/doctest.rst:987 +msgid "" +"Only docstrings attached to objects belonging to module *m* are searched." +msgstr "只搜索附属于模块 *m* 中的对象的文档串。" + +#: ../../library/doctest.rst:989 +msgid "Return ``(failure_count, test_count)``." +msgstr "返回 ``(failure_count, test_count)``。" + +#: ../../library/doctest.rst:991 +msgid "" +"Optional argument *name* gives the name of the module; by default, or if " +"``None``, ``m.__name__`` is used." +msgstr "可选参数 *name* 给出了模块的名称;默认情况下,或者如果为 ``None``,则为 ``m.__name__``。" + +#: ../../library/doctest.rst:994 +msgid "" +"Optional argument *exclude_empty* defaults to false. If true, objects for " +"which no doctests are found are excluded from consideration. The default is " +"a backward compatibility hack, so that code still using " +":meth:`doctest.master.summarize ` in conjunction " +"with :func:`testmod` continues to get output for objects with no tests. The " +"*exclude_empty* argument to the newer :class:`DocTestFinder` constructor " +"defaults to true." +msgstr "" +"可选参数 *exclude_empty* 默认为假值。如果为真值,则未找到任何 doctests 的对象将被排除在考虑范围之外。 " +"默认情况下将做向下兼容处理,因而仍然使用 :meth:`doctest.master.summarize " +"` 来配合 :func:`testmod` 的代码会继续得到没有测试的对象的输出。转给较新的 " +":class:`DocTestFinder` 构造器的 *exclude_empty* 参数默认为真值。" + +#: ../../library/doctest.rst:1002 +msgid "" +"Optional arguments *extraglobs*, *verbose*, *report*, *optionflags*, " +"*raise_on_error*, and *globs* are the same as for function :func:`testfile` " +"above, except that *globs* defaults to ``m.__dict__``." +msgstr "" +"可选参数 *extraglobs* 、 *verbose* 、 *report* 、 *optionflags* 、 *raise_on_error* " +"和 *globs* 与上述函数 :func:`testfile` 的参数相同,只是 *globs* 默认为 ``m.__dict__``。" + +#: ../../library/doctest.rst:1009 +msgid "" +"Test examples associated with object *f*; for example, *f* may be a string, " +"a module, a function, or a class object." +msgstr "与对象 *f* 相关的测试用例;例如, *f* 可以是一个字符串、一个模块、一个函数或一个类对象。" + +#: ../../library/doctest.rst:1012 +msgid "" +"A shallow copy of dictionary argument *globs* is used for the execution " +"context." +msgstr "dict 参数 *globs* 的浅层拷贝被用于执行环境。" + +#: ../../library/doctest.rst:1014 +msgid "" +"Optional argument *name* is used in failure messages, and defaults to " +"``\"NoName\"``." +msgstr "可选参数 *name* 在失败信息中使用,默认为 ``\"NoName\"`` 。" + +#: ../../library/doctest.rst:1017 +msgid "" +"If optional argument *verbose* is true, output is generated even if there " +"are no failures. By default, output is generated only in case of an example" +" failure." +msgstr "如果可选参数 *verbose* 为真,即使没有失败也会产生输出。默认情况下,只有在用例失败的情况下才会产生输出。" + +#: ../../library/doctest.rst:1020 +msgid "" +"Optional argument *compileflags* gives the set of flags that should be used " +"by the Python compiler when running the examples. By default, or if " +"``None``, flags are deduced corresponding to the set of future features " +"found in *globs*." +msgstr "" +"可选参数 *compileflags* 给出了 Python 编译器在运行例子时应该使用的标志集。默认情况下,或者如果为 ``None``,标志是根据 " +"*globs* 中发现的未来特征集推导出来的。" + +#: ../../library/doctest.rst:1024 +msgid "" +"Optional argument *optionflags* works as for function :func:`testfile` " +"above." +msgstr "可选参数 *optionflags* 的作用与上述 :func:`testfile` 函数中的相同。" + +#: ../../library/doctest.rst:1030 +msgid "Unittest API" +msgstr "Unittest API" + +#: ../../library/doctest.rst:1032 +msgid "" +"As your collection of doctest'ed modules grows, you'll want a way to run all" +" their doctests systematically. :mod:`!doctest` provides two functions that" +" can be used to create :mod:`unittest` test suites from modules and text " +"files containing doctests. To integrate with :mod:`unittest` test " +"discovery, include a :ref:`load_tests ` function in " +"your test module::" +msgstr "" + +#: ../../library/doctest.rst:1038 +msgid "" +"import unittest\n" +"import doctest\n" +"import my_module_with_doctests\n" +"\n" +"def load_tests(loader, tests, ignore):\n" +" tests.addTests(doctest.DocTestSuite(my_module_with_doctests))\n" +" return tests" +msgstr "" +"import unittest\n" +"import doctest\n" +"import my_module_with_doctests\n" +"\n" +"def load_tests(loader, tests, ignore):\n" +" tests.addTests(doctest.DocTestSuite(my_module_with_doctests))\n" +" return tests" + +#: ../../library/doctest.rst:1046 +msgid "" +"There are two main functions for creating :class:`unittest.TestSuite` " +"instances from text files and modules with doctests:" +msgstr "有两个主要函数用于从文本文件和带 doctest 的模块中创建 :class:`unittest.TestSuite` 实例。" + +#: ../../library/doctest.rst:1052 +msgid "" +"Convert doctest tests from one or more text files to a " +":class:`unittest.TestSuite`." +msgstr "将一个或多个文本文件中的 doctest 测试转换为一个 :class:`unittest.TestSuite`。" + +#: ../../library/doctest.rst:1055 +msgid "" +"The returned :class:`unittest.TestSuite` is to be run by the unittest " +"framework and runs the interactive examples in each file. Each file is run " +"as a separate unit test, and each example in a file is run as a " +":ref:`subtest `. If any example in a file fails, then the " +"synthesized unit test fails. The traceback for failure or error contains the" +" name of the file containing the test and a (sometimes approximate) line " +"number. If all the examples in a file are skipped, then the synthesized unit" +" test is also marked as skipped." +msgstr "" + +#: ../../library/doctest.rst:1065 +msgid "Pass one or more paths (as strings) to text files to be examined." +msgstr "传递一个或多个要检查的文本文件的路径(作为字符串)。" + +#: ../../library/doctest.rst:1067 +msgid "Options may be provided as keyword arguments:" +msgstr "选项可以作为关键字参数提供:" + +#: ../../library/doctest.rst:1069 +msgid "" +"Optional argument *module_relative* specifies how the filenames in *paths* " +"should be interpreted:" +msgstr "可选参数 *module_relative* 指定了 *paths* 中的文件名应该如何解释。" + +#: ../../library/doctest.rst:1072 +msgid "" +"If *module_relative* is ``True`` (the default), then each filename in " +"*paths* specifies an OS-independent module-relative path. By default, this " +"path is relative to the calling module's directory; but if the *package* " +"argument is specified, then it is relative to that package. To ensure OS-" +"independence, each filename should use ``/`` characters to separate path " +"segments, and may not be an absolute path (i.e., it may not begin with " +"``/``)." +msgstr "" +"如果 *module_relative* 是 ``True`` (默认值),那么 *paths* " +"中的每个文件名都指定了一个独立于操作系统的模块相对路径。 默认情况下,这个路径是相对于调用模块的目录的;但是如果指定了 *package* " +"参数,那么它就是相对于该包的。 为了保证操作系统的独立性,每个文件名都应该使用字符来分隔路径段,并且不能是绝对路径(即不能以 ``/`` 开始)。" + +#: ../../library/doctest.rst:1080 +msgid "" +"If *module_relative* is ``False``, then each filename in *paths* specifies " +"an OS-specific path. The path may be absolute or relative; relative paths " +"are resolved with respect to the current working directory." +msgstr "" +"如果 *module_relative* 是 ``False``,那么 *paths* 中的每个文件名都指定了一个操作系统特定的路径。 " +"路径可以是绝对的,也可以是相对的;相对路径是关于当前工作目录的解析。" + +#: ../../library/doctest.rst:1084 +msgid "" +"Optional argument *package* is a Python package or the name of a Python " +"package whose directory should be used as the base directory for module-" +"relative filenames in *paths*. If no package is specified, then the calling" +" module's directory is used as the base directory for module-relative " +"filenames. It is an error to specify *package* if *module_relative* is " +"``False``." +msgstr "" +"可选参数 *package* 是一个 Python 包或一个 Python 包的名字,其目录应该被用作 *paths* 中模块相关文件名的基本目录。 " +"如果没有指定包,那么调用模块的目录将作为模块相关文件名的基础目录。如果 *module_relative* 是 ``False``,那么指定 " +"*package* 是错误的。" + +#: ../../library/doctest.rst:1091 +msgid "" +"Optional argument *setUp* specifies a set-up function for the test suite. " +"This is called before running the tests in each file. The *setUp* function " +"will be passed a :class:`DocTest` object. The *setUp* function can access " +"the test globals as the :attr:`~DocTest.globs` attribute of the test passed." +msgstr "" +"可选参数 *setUp* 为测试套件指定一个设置函数。此函数会在运行每个文件中的测试之前被调用。 *setUp* 函数将被传入一个 " +":class:`DocTest` 对象。 *setUp* 函数可以通过所传入测试的 :attr:`~DocTest.globs` " +"属性来访问测试的全局变量。" + +#: ../../library/doctest.rst:1096 +msgid "" +"Optional argument *tearDown* specifies a tear-down function for the test " +"suite. This is called after running the tests in each file. The *tearDown*" +" function will be passed a :class:`DocTest` object. The *tearDown* function" +" can access the test globals as the :attr:`~DocTest.globs` attribute of the " +"test passed." +msgstr "" +"可选参数 *tearDown* 为测试套件指定一个拆卸函数。此函数会在运行每个文件中的测试之后被调用。 *tearDown* 函数将被传入一个 " +":class:`DocTest` 对象。 *tearDown* 函数可以通过所传入测试的 :attr:`~DocTest.globs` " +"属性来访问测试的全局变量。" + +#: ../../library/doctest.rst:1102 +msgid "" +"Optional argument *globs* is a dictionary containing the initial global " +"variables for the tests. A new copy of this dictionary is created for each " +"test. By default, *globs* is a new empty dictionary." +msgstr "" +"可选参数 *globs* 是一个包含测试的初始全局变量的字典。这个字典的一个新副本为每个测试创建。默认情况下, *globs* 是一个新的空字典。" + +#: ../../library/doctest.rst:1106 +msgid "" +"Optional argument *optionflags* specifies the default doctest options for " +"the tests, created by or-ing together individual option flags. See section " +":ref:`doctest-options`. See function :func:`set_unittest_reportflags` below " +"for a better way to set reporting options." +msgstr "" +"可选参数 *optionflags* 为测试指定默认的 doctest 选项,通过将各个选项的标志连接在一起创建。参见章节 :ref:`doctest-" +"options`。参见下面的函数 :func:`set_unittest_reportflags`,以了解设置报告选项的更好方法。" + +#: ../../library/doctest.rst:1118 +msgid "" +"The global ``__file__`` is added to the globals provided to doctests loaded " +"from a text file using :func:`DocFileSuite`." +msgstr "" +"该全局 ``__file__`` 被添加到提供给用 :func:`DocFileSuite` 从文本文件加载的 doctest 的全局变量中。" + +#: ../../library/doctest.rst:1121 ../../library/doctest.rst:1162 +msgid "Run each example as a :ref:`subtest `." +msgstr "" + +#: ../../library/doctest.rst:1127 +msgid "Convert doctest tests for a module to a :class:`unittest.TestSuite`." +msgstr "将一个模块的 doctest 测试转换为 :class:`unittest.TestSuite`。" + +#: ../../library/doctest.rst:1129 +msgid "" +"The returned :class:`unittest.TestSuite` is to be run by the unittest " +"framework and runs each doctest in the module. Each docstring is run as a " +"separate unit test, and each example in a docstring is run as a " +":ref:`subtest `. If any of the doctests fail, then the synthesized" +" unit test fails. The traceback for failure or error contains the name of " +"the file containing the test and a (sometimes approximate) line number. If " +"all the examples in a docstring are skipped, then the synthesized unit test " +"is also marked as skipped." +msgstr "" + +#: ../../library/doctest.rst:1139 +msgid "" +"Optional argument *module* provides the module to be tested. It can be a " +"module object or a (possibly dotted) module name. If not specified, the " +"module calling this function is used." +msgstr "可选参数 *module* 提供了要测试的模块。它可以是一个模块对象或一个(可能是带点的)模块名称。如果没有指定,则使用调用此函数的模块。" + +#: ../../library/doctest.rst:1143 +msgid "" +"Optional argument *globs* is a dictionary containing the initial global " +"variables for the tests. A new copy of this dictionary is created for each " +"test. By default, *globs* is the module's :attr:`~module.__dict__`." +msgstr "" +"可选参数 *globs* 是一个包含用于测试的初始全局变量的字典。针对每个测试都将创建一个该字典的新副本。在默认情况下,*globs* 就是模块的 " +":attr:`~module.__dict__`." + +#: ../../library/doctest.rst:1147 +msgid "" +"Optional argument *extraglobs* specifies an extra set of global variables, " +"which is merged into *globs*. By default, no extra globals are used." +msgstr "可选参数 *extraglobs* 指定了一组额外的全局变量,这些变量被合并到 *globs* 中。默认情况下,不使用额外的全局变量。" + +#: ../../library/doctest.rst:1150 +msgid "" +"Optional argument *test_finder* is the :class:`DocTestFinder` object (or a " +"drop-in replacement) that is used to extract doctests from the module." +msgstr "可选参数 *test_finder* 是 :class:`DocTestFinder` 对象(或一个可替换的对象),用于从模块中提取测试。" + +#: ../../library/doctest.rst:1153 +msgid "" +"Optional arguments *setUp*, *tearDown*, and *optionflags* are the same as " +"for function :func:`DocFileSuite` above, but they are called for each " +"docstring." +msgstr "" +"可选参数 *setUp*, *tearDown* 和 *optionflags* 与上述函数 :func:`DocFileSuite` " +"的相同,但它们会针对每个文档字符串来调用。" + +#: ../../library/doctest.rst:1156 +msgid "This function uses the same search technique as :func:`testmod`." +msgstr "这个函数使用与 :func:`testmod` 相同的搜索技术。" + +#: ../../library/doctest.rst:1158 +msgid "" +":func:`DocTestSuite` returns an empty :class:`unittest.TestSuite` if " +"*module* contains no docstrings instead of raising :exc:`ValueError`." +msgstr "" +"如果 *module* 不包含任何文档串,则 :func:`DocTestSuite` 返回一个空的 " +":class:`unittest.TestSuite`,而不是触发 :exc:`ValueError`。" + +#: ../../library/doctest.rst:1165 +msgid "" +"Under the covers, :func:`DocTestSuite` creates a :class:`unittest.TestSuite`" +" out of :class:`!doctest.DocTestCase` instances, and :class:`!DocTestCase` " +"is a subclass of :class:`unittest.TestCase`. :class:`!DocTestCase` isn't " +"documented here (it's an internal detail), but studying its code can answer " +"questions about the exact details of :mod:`unittest` integration." +msgstr "" +"在内部,:func:`DocTestSuite` 将根据 :class:`!doctest.DocTestCase` 实例创建 " +":class:`unittest.TestSuite`,而 :class:`!DocTestCase` 是 " +":class:`unittest.TestCase` 的子类。 :class:`!DocTestCase` " +"没有记入本文档(它属于内部细节),但研究其代码可以回答有关 :mod:`unittest` 集成的准确细节的问题。" + +#: ../../library/doctest.rst:1171 +msgid "" +"Similarly, :func:`DocFileSuite` creates a :class:`unittest.TestSuite` out of" +" :class:`!doctest.DocFileCase` instances, and :class:`!DocFileCase` is a " +"subclass of :class:`!DocTestCase`." +msgstr "" +"类似地,:func:`DocFileSuite` 将根据 :class:`!doctest.DocFileCase` 实例创建 " +":class:`unittest.TestSuite`,而 :class:`!DocFileCase` 是 :class:`!DocTestCase` " +"的子类。" + +#: ../../library/doctest.rst:1175 +msgid "" +"So both ways of creating a :class:`unittest.TestSuite` run instances of " +":class:`!DocTestCase`. This is important for a subtle reason: when you run " +":mod:`!doctest` functions yourself, you can control the :mod:`!doctest` " +"options in use directly, by passing option flags to :mod:`!doctest` " +"functions. However, if you're writing a :mod:`unittest` framework, " +":mod:`!unittest` ultimately controls when and how tests get run. The " +"framework author typically wants to control :mod:`!doctest` reporting " +"options (perhaps, e.g., specified by command line options), but there's no " +"way to pass options through :mod:`!unittest` to :mod:`!doctest` test " +"runners." +msgstr "" + +#: ../../library/doctest.rst:1185 +msgid "" +"For this reason, :mod:`!doctest` also supports a notion of :mod:`!doctest` " +"reporting flags specific to :mod:`unittest` support, via this function:" +msgstr "" + +#: ../../library/doctest.rst:1191 +msgid "Set the :mod:`!doctest` reporting flags to use." +msgstr "设置要使用的 :mod:`!doctest` 报告旗标。reporting flags to use." + +#: ../../library/doctest.rst:1193 +msgid "" +"Argument *flags* takes the :ref:`bitwise OR ` of option flags. See" +" section :ref:`doctest-options`. Only \"reporting flags\" can be used." +msgstr "" +"参数 *flags* 接受选项标志的 :ref:`按位或 ` 结果。参见 :ref:`doctest-options` 一节。只有 " +"\"报告标志\" 可以被使用。" + +#: ../../library/doctest.rst:1196 +msgid "" +"This is a module-global setting, and affects all future doctests run by " +"module :mod:`unittest`: the :meth:`!runTest` method of " +":class:`!DocTestCase` looks at the option flags specified for the test case " +"when the :class:`!DocTestCase` instance was constructed. If no reporting " +"flags were specified (which is the typical and expected case), " +":mod:`!doctest`'s :mod:`!unittest` reporting flags are :ref:`bitwise ORed " +"` into the option flags, and the option flags so augmented are " +"passed to the :class:`DocTestRunner` instance created to run the doctest. " +"If any reporting flags were specified when the :class:`!DocTestCase` " +"instance was constructed, :mod:`!doctest`'s :mod:`!unittest` reporting flags" +" are ignored." +msgstr "" +"这是模块全局的设置,并会影响 :mod:`unittest` 模块未来运行的所有文档测试::class:`!DocTestCase` 的 " +":meth:`!runTest` 方法会查看 :class:`!DocTestCase` 实例构建时为测试用例指定的选项旗标。 " +"如果没有指定报告旗标(这是典型且符合预期的情况),则 :mod:`!doctest` 的 :mod:`!unittest` 报告旗标将与选项旗标进行 " +":ref:`按位或运算 `,经过增强的选项旗标将被传递给为运行文档测试而创建的 :class:`DocTestRunner` 实例。 " +"如果在构造 :class:`!DocTestCase` 实例时指定了任何报告旗标,则 :mod:`!doctest` 的 " +":mod:`!unittest` 报告旗标将被忽略。" + +#: ../../library/doctest.rst:1207 +msgid "" +"The value of the :mod:`unittest` reporting flags in effect before the " +"function was called is returned by the function." +msgstr "该函数返回调用之前有效的 :mod:`unittest` 报告标志的值。" + +#: ../../library/doctest.rst:1214 +msgid "Advanced API" +msgstr "高级 API" + +#: ../../library/doctest.rst:1216 +msgid "" +"The basic API is a simple wrapper that's intended to make doctest easy to " +"use. It is fairly flexible, and should meet most users' needs; however, if " +"you require more fine-grained control over testing, or wish to extend " +"doctest's capabilities, then you should use the advanced API." +msgstr "" +"基本 API 是一个简单的封装,旨在使 doctest " +"易于使用。它相当灵活,应该能满足大多数用户的需求;但是,如果你需要对测试进行更精细的控制,或者希望扩展 doctest 的功能,那么你应该使用高级 " +"API ." + +#: ../../library/doctest.rst:1221 +msgid "" +"The advanced API revolves around two container classes, which are used to " +"store the interactive examples extracted from doctest cases:" +msgstr "高级 API 围绕着两个容器类,用于存储从 doctest 案例中提取的交互式用例:" + +#: ../../library/doctest.rst:1224 +msgid "" +":class:`Example`: A single Python :term:`statement`, paired with its " +"expected output." +msgstr ":class:`Example`: 一个单一的 Python :term:`statement`,与它的预期输出配对。" + +#: ../../library/doctest.rst:1227 +msgid "" +":class:`DocTest`: A collection of :class:`Example`\\ s, typically extracted " +"from a single docstring or text file." +msgstr ":class:`DocTest`: 一组 :class:`Example`\\ s 的集合,通常从一个文档字符串或文本文件中提取。" + +#: ../../library/doctest.rst:1230 +msgid "" +"Additional processing classes are defined to find, parse, and run, and check" +" doctest examples:" +msgstr "定义了额外的处理类来寻找、解析和运行,并检查 doctest 的用例。" + +#: ../../library/doctest.rst:1233 +msgid "" +":class:`DocTestFinder`: Finds all docstrings in a given module, and uses a " +":class:`DocTestParser` to create a :class:`DocTest` from every docstring " +"that contains interactive examples." +msgstr "" +":class:`DocTestFinder` : 查找给定模块中的所有文档串,并使用 :class:`DocTestParser` " +"从每个包含交互式用例的文档串中创建一个 :class:`DocTest`。" + +#: ../../library/doctest.rst:1237 +msgid "" +":class:`DocTestParser`: Creates a :class:`DocTest` object from a string " +"(such as an object's docstring)." +msgstr ":class:`DocTestParser` : 从一个字符串(如一个对象的文档串)创建一个 :class:`DocTest` 对象。" + +#: ../../library/doctest.rst:1240 +msgid "" +":class:`DocTestRunner`: Executes the examples in a :class:`DocTest`, and " +"uses an :class:`OutputChecker` to verify their output." +msgstr "" +":class:`DocTestRunner` : 执行 :class:`DocTest` 中的用例,并使用 :class:`OutputChecker`" +" 来验证其输出。" + +#: ../../library/doctest.rst:1243 +msgid "" +":class:`OutputChecker`: Compares the actual output from a doctest example " +"with the expected output, and decides whether they match." +msgstr ":class:`OutputChecker` : 将一个测试用例的实际输出与预期输出进行比较,并决定它们是否匹配。" + +#: ../../library/doctest.rst:1246 +msgid "" +"The relationships among these processing classes are summarized in the " +"following diagram::" +msgstr "这些处理类之间的关系总结在下图中::" + +#: ../../library/doctest.rst:1249 +msgid "" +" list of:\n" +"+------+ +---------+\n" +"|module| --DocTestFinder-> | DocTest | --DocTestRunner-> results\n" +"+------+ | ^ +---------+ | ^ (printed)\n" +" | | | Example | | |\n" +" v | | ... | v |\n" +" DocTestParser | Example | OutputChecker\n" +" +---------+" +msgstr "" +" list of:\n" +"+------+ +---------+\n" +"|module| --DocTestFinder-> | DocTest | --DocTestRunner-> results\n" +"+------+ | ^ +---------+ | ^ (printed)\n" +" | | | Example | | |\n" +" v | | ... | v |\n" +" DocTestParser | Example | OutputChecker\n" +" +---------+" + +#: ../../library/doctest.rst:1262 +msgid "DocTest Objects" +msgstr "DocTest 对象" + +#: ../../library/doctest.rst:1267 +msgid "" +"A collection of doctest examples that should be run in a single namespace. " +"The constructor arguments are used to initialize the attributes of the same " +"names." +msgstr "应该在单一命名空间中运行的 doctest 用例的集合。构造函数参数被用来初始化相同名称的属性。" + +#: ../../library/doctest.rst:1271 +msgid "" +":class:`DocTest` defines the following attributes. They are initialized by " +"the constructor, and should not be modified directly." +msgstr ":class:`DocTest` 定义了以下属性。它们由构造函数初始化,不应该被直接修改。" + +#: ../../library/doctest.rst:1277 +msgid "" +"A list of :class:`Example` objects encoding the individual interactive " +"Python examples that should be run by this test." +msgstr "一个 :class:`Example` 对象的列表,它编码了应该由该测试运行的单个交互式 Python 用例。" + +#: ../../library/doctest.rst:1283 +msgid "" +"The namespace (aka globals) that the examples should be run in. This is a " +"dictionary mapping names to values. Any changes to the namespace made by " +"the examples (such as binding new variables) will be reflected in " +":attr:`globs` after the test is run." +msgstr "" +"例子应该运行的命名空间(又称 globals)。这是一个将名字映射到数值的字典。例子对名字空间的任何改变(比如绑定新的变量)将在测试运行后反映在 " +":attr:`globs` 中。" + +#: ../../library/doctest.rst:1291 +msgid "" +"A string name identifying the :class:`DocTest`. Typically, this is the name" +" of the object or file that the test was extracted from." +msgstr "识别 :class:`DocTest` 的字符串名称。通常情况下,这是从测试中提取的对象或文件的名称。" + +#: ../../library/doctest.rst:1297 +msgid "" +"The name of the file that this :class:`DocTest` was extracted from; or " +"``None`` if the filename is unknown, or if the :class:`!DocTest` was not " +"extracted from a file." +msgstr "" +"该 :class:`DocTest` 所属文件的名称;或者如果文件名未知、或 :class:`!DocTest` 不是从文件中提取的则为 " +"``None``." + +#: ../../library/doctest.rst:1304 +msgid "" +"The line number within :attr:`filename` where this :class:`DocTest` begins, " +"or ``None`` if the line number is unavailable. This line number is zero-" +"based with respect to the beginning of the file." +msgstr "" +":attr:`filename` 中该 :class:`DocTest` 开始位置的行号,如果行号不可用则为 ``None``。 " +"这个行号相对于文件开头从零开始计数。" + +#: ../../library/doctest.rst:1311 +msgid "" +"The string that the test was extracted from, or ``None`` if the string is " +"unavailable, or if the test was not extracted from a string." +msgstr "提取测试的原始字符串,如果字符串不可用或者测试不是从字符串中提取的则为 ``None``。" + +#: ../../library/doctest.rst:1318 +msgid "Example Objects" +msgstr "Example 对象" + +#: ../../library/doctest.rst:1323 +msgid "" +"A single interactive example, consisting of a Python statement and its " +"expected output. The constructor arguments are used to initialize the " +"attributes of the same names." +msgstr "单个交互式用例,由一个 Python 语句及其预期输出组成。构造函数参数被用来初始化相同名称的属性。" + +#: ../../library/doctest.rst:1328 +msgid "" +":class:`Example` defines the following attributes. They are initialized by " +"the constructor, and should not be modified directly." +msgstr ":class:`Example` 定义了以下属性。它们由构造函数初始化,不应该被直接修改。" + +#: ../../library/doctest.rst:1334 +msgid "" +"A string containing the example's source code. This source code consists of" +" a single Python statement, and always ends with a newline; the constructor " +"adds a newline when necessary." +msgstr "一个包含该用例源码的字符串。源码由一个 Python 语句组成,并且总是以换行结束;构造函数在必要时添加一个换行。" + +#: ../../library/doctest.rst:1341 +msgid "" +"The expected output from running the example's source code (either from " +"stdout, or a traceback in case of exception). :attr:`want` ends with a " +"newline unless no output is expected, in which case it's an empty string. " +"The constructor adds a newline when necessary." +msgstr "" +"运行这个用例的源码的预期输出(可以是 stdout,也可以是异常情况下的回溯)。 :attr:`want` " +"以一个换行符结束,除非没有预期的输出,在这种情况下它是一个空字符串。构造函数在必要时添加一个换行。" + +#: ../../library/doctest.rst:1349 +msgid "" +"The exception message generated by the example, if the example is expected " +"to generate an exception; or ``None`` if it is not expected to generate an " +"exception. This exception message is compared against the return value of " +":func:`traceback.format_exception_only`. :attr:`exc_msg` ends with a " +"newline unless it's ``None``. The constructor adds a newline if needed." +msgstr "" +"用例产生的异常信息,如果这个例子被期望产生一个异常;或者为 ``None``,如果它不被期望产生一个异常。这个异常信息与 " +":func:`traceback.format_exception_only` 的返回值进行比较。 :attr:`exc_msg` 以换行结束,除非是 " +"``None`` ." + +#: ../../library/doctest.rst:1358 +msgid "" +"The line number within the string containing this example where the example " +"begins. This line number is zero-based with respect to the beginning of the" +" containing string." +msgstr "包含本例的字符串中的行号,即本例的开始。这个行号相对于包含字符串的开头来说是以零开始的。" + +#: ../../library/doctest.rst:1365 +msgid "" +"The example's indentation in the containing string, i.e., the number of " +"space characters that precede the example's first prompt." +msgstr "用例在包含字符串中的缩进,即在用例的第一个提示前有多少个空格字符。" + +#: ../../library/doctest.rst:1371 +msgid "" +"A dictionary mapping from option flags to ``True`` or ``False``, which is " +"used to override default options for this example. Any option flags not " +"contained in this dictionary are left at their default value (as specified " +"by the :class:`DocTestRunner`'s :ref:`optionflags `). By " +"default, no options are set." +msgstr "" +"一个将选项旗标映射到 ``True`` 或 ``False`` 的字典,用于覆盖这个例子的默认选项。 " +"任何不包含在这个字典中的选项旗标都将保持其默认值(由 :class:`DocTestRunner` 的 :ref:`optionflags " +"` 指定)。默认情况下,将不设置任何选项。" + +#: ../../library/doctest.rst:1381 +msgid "DocTestFinder objects" +msgstr "DocTestFinder 对象" + +#: ../../library/doctest.rst:1386 +msgid "" +"A processing class used to extract the :class:`DocTest`\\ s that are " +"relevant to a given object, from its docstring and the docstrings of its " +"contained objects. :class:`DocTest`\\ s can be extracted from modules, " +"classes, functions, methods, staticmethods, classmethods, and properties." +msgstr "" +"一个处理类,用于从一个给定的对象的 docstring 和其包含的对象的 docstring 中提取与之相关的 :class:`DocTest`。 " +":class:`DocTest` 可以从模块、类、函数、方法、静态方法、类方法和属性中提取。" + +#: ../../library/doctest.rst:1391 +msgid "" +"The optional argument *verbose* can be used to display the objects searched " +"by the finder. It defaults to ``False`` (no output)." +msgstr "可选的参数 *verbose* 可以用来显示查找器搜索到的对象。它的默认值是 ``False`` (无输出)。" + +#: ../../library/doctest.rst:1394 +msgid "" +"The optional argument *parser* specifies the :class:`DocTestParser` object " +"(or a drop-in replacement) that is used to extract doctests from docstrings." +msgstr "" +"可选的参数 *parser* 指定了 :class:`DocTestParser` 对象(或一个可替换的对象),用于从文档串中提取 doctest。" + +#: ../../library/doctest.rst:1397 +msgid "" +"If the optional argument *recurse* is false, then :meth:`DocTestFinder.find`" +" will only examine the given object, and not any contained objects." +msgstr "" +"如果可选的参数 *recurse* 是 False,那么 :meth:`DocTestFinder.find` " +"将只检查给定的对象,而不是任何包含的对象。" + +#: ../../library/doctest.rst:1400 +msgid "" +"If the optional argument *exclude_empty* is false, then " +":meth:`DocTestFinder.find` will include tests for objects with empty " +"docstrings." +msgstr "" +"如果可选参数 *exclude_empty* 为 False,那么 :meth:`DocTestFinder.find` " +"将包括对文档字符串为空的对象的测试。" + +#: ../../library/doctest.rst:1404 +msgid ":class:`DocTestFinder` defines the following method:" +msgstr ":class:`DocTestFinder` 定义了以下方法:" + +#: ../../library/doctest.rst:1409 +msgid "" +"Return a list of the :class:`DocTest`\\ s that are defined by *obj*'s " +"docstring, or by any of its contained objects' docstrings." +msgstr "返回 :class:`DocTest` 的列表,该列表由 *obj* 的文档串或其包含的任何对象的文档串定义。" + +#: ../../library/doctest.rst:1412 +msgid "" +"The optional argument *name* specifies the object's name; this name will be " +"used to construct names for the returned :class:`DocTest`\\ s. If *name* is" +" not specified, then ``obj.__name__`` is used." +msgstr "" +"可选参数 *name* 指定了对象的名称;这个名称将被用来为返回的 :class:`DocTest` 构建名称。如果没有指定 *name* ,则使用 " +"``obj.__name__`` ." + +#: ../../library/doctest.rst:1416 +msgid "" +"The optional parameter *module* is the module that contains the given " +"object. If the module is not specified or is ``None``, then the test finder " +"will attempt to automatically determine the correct module. The object's " +"module is used:" +msgstr "" +"可选参数 *module* 是包含给定对象的模块。如果没有指定模块或者是 ``None``,那么测试查找器将试图自动确定正确的模块。 " +"该对象被使用的模块:" + +#: ../../library/doctest.rst:1420 +msgid "As a default namespace, if *globs* is not specified." +msgstr "作为一个默认的命名空间,如果没有指定 *globs* 。" + +#: ../../library/doctest.rst:1422 +msgid "" +"To prevent the DocTestFinder from extracting DocTests from objects that are " +"imported from other modules. (Contained objects with modules other than " +"*module* are ignored.)" +msgstr "" +"为了防止 DocTestFinder 从其他模块导入的对象中提取 DocTest。(包含有除 *module* 以外的模块的对象会被忽略。)" + +#: ../../library/doctest.rst:1426 +msgid "To find the name of the file containing the object." +msgstr "找到包含该对象的文件名。" + +#: ../../library/doctest.rst:1428 +msgid "To help find the line number of the object within its file." +msgstr "找到该对象在其文件中的行号。" + +#: ../../library/doctest.rst:1430 +msgid "" +"If *module* is ``False``, no attempt to find the module will be made. This " +"is obscure, of use mostly in testing doctest itself: if *module* is " +"``False``, or is ``None`` but cannot be found automatically, then all " +"objects are considered to belong to the (non-existent) module, so all " +"contained objects will (recursively) be searched for doctests." +msgstr "" +"如果 *module* 是 ``False``,将不会试图找到这个模块。这是不明确的,主要用于测试 doctest 本身:如果 *module* 是 " +"``False``,或者是 ``None`` 但不能自动找到,那么所有对象都被认为属于(不存在的)模块,所以所有包含的对象将(递归地)被搜索到 " +"doctest ." + +#: ../../library/doctest.rst:1436 +msgid "" +"The globals for each :class:`DocTest` is formed by combining *globs* and " +"*extraglobs* (bindings in *extraglobs* override bindings in *globs*). A new" +" shallow copy of the globals dictionary is created for each " +":class:`!DocTest`. If *globs* is not specified, then it defaults to the " +"module's :attr:`~module.__dict__`, if specified, or ``{}`` otherwise. If " +"*extraglobs* is not specified, then it defaults to ``{}``." +msgstr "" +"每个 :class:`DocTest` 的全局变量是由 *globs* 和 *extraglobs* 合并组成的(在 *extraglobs* " +"中的绑定会覆盖 *globs* 中的绑定)。 针对每个 :class:`!DocTest` 将会新建一个全局字典的浅拷贝。如果未指定 " +"*globs*,则它默认为模块的 :attr:`~module.__dict__` (如果指定了模块),否则为 ``{}``。如果未指定 " +"*extraglobs*,则它默认为 ``{}``。" + +#: ../../library/doctest.rst:1447 +msgid "DocTestParser objects" +msgstr "DocTestParser 对象" + +#: ../../library/doctest.rst:1452 +msgid "" +"A processing class used to extract interactive examples from a string, and " +"use them to create a :class:`DocTest` object." +msgstr "一个处理类,用于从一个字符串中提取交互式的用例,并使用它们来创建一个 :class:`DocTest` 对象。" + +#: ../../library/doctest.rst:1456 +msgid ":class:`DocTestParser` defines the following methods:" +msgstr ":class:`DocTestParser` 定义了以下方法:" + +#: ../../library/doctest.rst:1461 +msgid "" +"Extract all doctest examples from the given string, and collect them into a " +":class:`DocTest` object." +msgstr "从给定的字符串中提取所有的测试用例,并将它们收集到一个 :class:`DocTest` 对象中。" + +#: ../../library/doctest.rst:1464 +msgid "" +"*globs*, *name*, *filename*, and *lineno* are attributes for the new " +":class:`!DocTest` object. See the documentation for :class:`DocTest` for " +"more information." +msgstr "" +"*globs*, *name*, *filename* 和 *lineno* 是新的 :class:`!DocTest` 对象的属性。请参阅 " +":class:`DocTest` 的文档了解详情。" + +#: ../../library/doctest.rst:1471 +msgid "" +"Extract all doctest examples from the given string, and return them as a " +"list of :class:`Example` objects. Line numbers are 0-based. The optional " +"argument *name* is a name identifying this string, and is only used for " +"error messages." +msgstr "" +"从给定的字符串中提取所有的测试用例,并以 :class:`Example` 对象列表的形式返回。行数以 0 为基数。可选参数 *name* " +"用于识别这个字符串的名称,只用于错误信息。" + +#: ../../library/doctest.rst:1478 +msgid "" +"Divide the given string into examples and intervening text, and return them " +"as a list of alternating :class:`Example`\\ s and strings. Line numbers for " +"the :class:`!Example`\\ s are 0-based. The optional argument *name* is a " +"name identifying this string, and is only used for error messages." +msgstr "" +"将给定的字符串划分为样例和中间文本,并以 :class:`Example` 和字符串交替的列表形式返回。 :class:`!Example` 的行号是从" +" 0 开始的。可选参数 *name* 是标识该字符串的名称,它仅用于错误消息。" + +#: ../../library/doctest.rst:1485 +msgid "TestResults objects" +msgstr "TestResults 对象" + +#: ../../library/doctest.rst:1492 +msgid "Number of failed tests." +msgstr "失败的测试数量。" + +#: ../../library/doctest.rst:1496 +msgid "Number of attempted tests." +msgstr "执行的测试数量。" + +#: ../../library/doctest.rst:1500 +msgid "Number of skipped tests." +msgstr "跳过的测试数量。" + +#: ../../library/doctest.rst:1508 +msgid "DocTestRunner objects" +msgstr "DocTestRunner 对象" + +#: ../../library/doctest.rst:1513 +msgid "" +"A processing class used to execute and verify the interactive examples in a " +":class:`DocTest`." +msgstr "一个处理类,用于执行和验证 :class:`DocTest` 中的交互式用例。" + +#: ../../library/doctest.rst:1516 +msgid "" +"The comparison between expected outputs and actual outputs is done by an " +":class:`OutputChecker`. This comparison may be customized with a number of " +"option flags; see section :ref:`doctest-options` for more information. If " +"the option flags are insufficient, then the comparison may also be " +"customized by passing a subclass of :class:`!OutputChecker` to the " +"constructor." +msgstr "" +"预期的输出和实际的输出之间的比较是由 :class:`OutputChecker` 来完成的。这种比较可以通过一些选项旗标来自定义;请参阅 " +":ref:`doctest-options` 小节了解详情。如果这些选项旗标不够用,那么也可以通过向构造器传入一个 " +":class:`!OutputChecker` 的子类来自定义比较操作。" + +#: ../../library/doctest.rst:1522 +msgid "" +"The test runner's display output can be controlled in two ways. First, an " +"output function can be passed to :meth:`run`; this function will be called " +"with strings that should be displayed. It defaults to ``sys.stdout.write``." +" If capturing the output is not sufficient, then the display output can be " +"also customized by subclassing DocTestRunner, and overriding the methods " +":meth:`report_skip`, :meth:`report_start`, :meth:`report_success`, " +":meth:`report_unexpected_exception`, and :meth:`report_failure`." +msgstr "" + +#: ../../library/doctest.rst:1530 +msgid "" +"The optional keyword argument *checker* specifies the :class:`OutputChecker`" +" object (or drop-in replacement) that should be used to compare the expected" +" outputs to the actual outputs of doctest examples." +msgstr "" +"可选的关键字参数 *checker* 指定了 :class:`OutputChecker` 对象(或其相似替换),它应该被用来比较预期输出和 " +"doctest 用例的实际输出。" + +#: ../../library/doctest.rst:1534 +msgid "" +"The optional keyword argument *verbose* controls the " +":class:`DocTestRunner`'s verbosity. If *verbose* is ``True``, then " +"information is printed about each example, as it is run. If *verbose* is " +"``False``, then only failures are printed. If *verbose* is unspecified, or " +"``None``, then verbose output is used iff the command-line switch ``-v`` is " +"used." +msgstr "" +"可选的关键字参数 *verbose* 控制 :class:`DocTestRunner` 的详细程度。如果 *verbose* 是 ``True`` " +",那么每个用例的信息都会被打印出来,当它正在运行时。如果 *verbose* 是 ``False``,则只打印失败的信息。当 *verbose* " +"没有指定,或者为 ``None``,如果使用了命令行开关 ``-v``,则使用 verbose 输出。" + +#: ../../library/doctest.rst:1540 +msgid "" +"The optional keyword argument *optionflags* can be used to control how the " +"test runner compares expected output to actual output, and how it displays " +"failures. For more information, see section :ref:`doctest-options`." +msgstr "" +"可选的关键字参数 *optionflags* 可以用来控制测试运行器如何比较预期输出和实际输出,以及如何显示失败。更多信息,请参见章节 " +":ref:`doctest-options` ." + +#: ../../library/doctest.rst:1544 +msgid "" +"The test runner accumulates statistics. The aggregated number of attempted, " +"failed and skipped examples is also available via the :attr:`tries`, " +":attr:`failures` and :attr:`skips` attributes. The :meth:`run` and " +":meth:`summarize` methods return a :class:`TestResults` instance." +msgstr "" +"测试运行将累积统计数据。已尝试、已失败和已跳过的示例的聚合计数也可通过 :attr:`tries`, :attr:`failures` 和 " +":attr:`skips` 属性来获取。 :meth:`run` 和 :meth:`summarize` 方法将返回一个 " +":class:`TestResults` 实例。" + +#: ../../library/doctest.rst:1549 +msgid ":class:`DocTestRunner` defines the following methods:" +msgstr ":class:`DocTestRunner` 定义了以下方法:" + +#: ../../library/doctest.rst:1554 +msgid "" +"Report that the given example was skipped. This method is provided to allow" +" subclasses of :class:`DocTestRunner` to customize their output; it should " +"not be called directly." +msgstr "" + +#: ../../library/doctest.rst:1558 ../../library/doctest.rst:1571 +msgid "" +"*example* is the example about to be processed. *test* is the test " +"containing *example*. *out* is the output function that was passed to " +":meth:`DocTestRunner.run`." +msgstr "" +"*example* 是即将被处理的例子。 *test* 是包含 *example* 的测试。 *out* 是传给 " +":meth:`DocTestRunner.run` 的输出函数。" + +#: ../../library/doctest.rst:1567 +msgid "" +"Report that the test runner is about to process the given example. This " +"method is provided to allow subclasses of :class:`DocTestRunner` to " +"customize their output; it should not be called directly." +msgstr "" +"报告测试运行器即将处理给定的用例。提供这个方法是为了让 :class:`DocTestRunner` 的子类能够定制它们的输出;它不应该被直接调用。" + +#: ../../library/doctest.rst:1578 +msgid "" +"Report that the given example ran successfully. This method is provided to " +"allow subclasses of :class:`DocTestRunner` to customize their output; it " +"should not be called directly." +msgstr "报告给定的用例运行成功。提供这个方法是为了让 :class:`DocTestRunner` 的子类能够定制它们的输出;它不应该被直接调用。" + +#: ../../library/doctest.rst:1582 ../../library/doctest.rst:1593 +msgid "" +"*example* is the example about to be processed. *got* is the actual output " +"from the example. *test* is the test containing *example*. *out* is the " +"output function that was passed to :meth:`DocTestRunner.run`." +msgstr "" +"*example* 是即将被处理的用例。 *got* 是这个例子的实际输出。 *test* 是包含 *example* 的测试。 *out* 是传递给 " +":meth:`DocTestRunner.run` 的输出函数。" + +#: ../../library/doctest.rst:1589 +msgid "" +"Report that the given example failed. This method is provided to allow " +"subclasses of :class:`DocTestRunner` to customize their output; it should " +"not be called directly." +msgstr "报告给定的用例运行失败。提供这个方法是为了让 :class:`DocTestRunner` 的子类能够定制它们的输出;它不应该被直接调用。" + +#: ../../library/doctest.rst:1600 +msgid "" +"Report that the given example raised an unexpected exception. This method is" +" provided to allow subclasses of :class:`DocTestRunner` to customize their " +"output; it should not be called directly." +msgstr "" +"报告给定的用例触发了一个意外异常。提供这个方法是为了让 :class:`DocTestRunner` 的子类能够定制它们的输出;它不应该被直接调用。" + +#: ../../library/doctest.rst:1604 +msgid "" +"*example* is the example about to be processed. *exc_info* is a tuple " +"containing information about the unexpected exception (as returned by " +":func:`sys.exc_info`). *test* is the test containing *example*. *out* is " +"the output function that was passed to :meth:`DocTestRunner.run`." +msgstr "" +"*example* 是将要被处理的用例。 *exc_info* 是一个元组,包含关于异常的信息(如由 :func:`sys.exc_info` 返回)。" +" *test* 是包含 *example* 的测试。 *out* 是传递给 :meth:`DocTestRunner.run` 的输出函数。" + +#: ../../library/doctest.rst:1612 +msgid "" +"Run the examples in *test* (a :class:`DocTest` object), and display the " +"results using the writer function *out*. Return a :class:`TestResults` " +"instance." +msgstr "" +"运行 *test* (一个 :class:`DocTest` 对象) 中的示例,并使用写入函数 *out* 显示结果。返回一个 " +":class:`TestResults` 实例。" + +#: ../../library/doctest.rst:1616 +msgid "" +"The examples are run in the namespace ``test.globs``. If *clear_globs* is " +"true (the default), then this namespace will be cleared after the test runs," +" to help with garbage collection. If you would like to examine the namespace" +" after the test completes, then use *clear_globs=False*." +msgstr "" +"这些用例都是在命名空间 ``test.globs`` 中运行的。如果 *clear_globs* 为 True " +"(默认),那么这个命名空间将在测试运行后被清除,以帮助进行垃圾回收。如果你想在测试完成后检查命名空间,那么使用 *clear_globs=False* " +"。" + +#: ../../library/doctest.rst:1621 +msgid "" +"*compileflags* gives the set of flags that should be used by the Python " +"compiler when running the examples. If not specified, then it will default " +"to the set of future-import flags that apply to *globs*." +msgstr "" +"*compileflags* 给出了 Python 编译器在运行例子时应该使用的标志集。如果没有指定,那么它将默认为适用于 *globs* 的 " +"future-import 标志集。" + +#: ../../library/doctest.rst:1625 +msgid "" +"The output of each example is checked using the :class:`DocTestRunner`'s " +"output checker, and the results are formatted by the " +":meth:`!DocTestRunner.report_\\*` methods." +msgstr "" +"每个用例的输出都使用 :class:`DocTestRunner` 的输出检查器进行检查,并且结果将由 " +":meth:`!DocTestRunner.report_\\*` 方法来格式化。" + +#: ../../library/doctest.rst:1632 +msgid "" +"Print a summary of all the test cases that have been run by this " +"DocTestRunner, and return a :class:`TestResults` instance." +msgstr "打印这个 DocTestRunner 运行过的所有测试用例的概要,并返回一个 :class:`TestResults` 实例。" + +#: ../../library/doctest.rst:1635 +msgid "" +"The optional *verbose* argument controls how detailed the summary is. If " +"the verbosity is not specified, then the :class:`DocTestRunner`'s verbosity " +"is used." +msgstr "" +"可选的 *verbose* 参数控制摘要的详细程度。如果没有指定 verbose,那么将使用 :class:`DocTestRunner` 的 " +"verbose ." + +#: ../../library/doctest.rst:1639 +msgid ":class:`DocTestParser` has the following attributes:" +msgstr ":class:`DocTestParser` 具有下列属性:" + +#: ../../library/doctest.rst:1643 +msgid "Number of attempted examples." +msgstr "尝试的示例数量。" + +#: ../../library/doctest.rst:1647 +msgid "Number of failed examples." +msgstr "失败的示例数量。" + +#: ../../library/doctest.rst:1651 +msgid "Number of skipped examples." +msgstr "跳过的示例数量。" + +#: ../../library/doctest.rst:1659 +msgid "OutputChecker objects" +msgstr "OutputChecker 对象" + +#: ../../library/doctest.rst:1664 +msgid "" +"A class used to check the whether the actual output from a doctest example " +"matches the expected output. :class:`OutputChecker` defines two methods: " +":meth:`check_output`, which compares a given pair of outputs, and returns " +"``True`` if they match; and :meth:`output_difference`, which returns a " +"string describing the differences between two outputs." +msgstr "" +"一个用于检查测试用例的实际输出是否与预期输出相匹配的类。 :class:`OutputChecker` 定义了两个方法: " +":meth:`check_output`,比较给定的一对输出,如果它们匹配则返回 ``True``; " +":meth:`output_difference`,返回一个描述两个输出之间差异的字符串。" + +#: ../../library/doctest.rst:1671 +msgid ":class:`OutputChecker` defines the following methods:" +msgstr ":class:`OutputChecker` 定义了以下方法:" + +#: ../../library/doctest.rst:1675 +msgid "" +"Return ``True`` iff the actual output from an example (*got*) matches the " +"expected output (*want*). These strings are always considered to match if " +"they are identical; but depending on what option flags the test runner is " +"using, several non-exact match types are also possible. See section " +":ref:`doctest-options` for more information about option flags." +msgstr "" +"如果一个用例的实际输出( *got* )与预期输出( *want* )匹配,则返回 ``True``。 " +"如果这些字符串是相同的,总是被认为是匹配的;但是根据测试运行器使用的选项标志,也可能有几种非精确的匹配类型。参见章节 :ref:`doctest-" +"options` 了解更多关于选项标志的信息。" + +#: ../../library/doctest.rst:1684 +msgid "" +"Return a string describing the differences between the expected output for a" +" given example (*example*) and the actual output (*got*). *optionflags* is " +"the set of option flags used to compare *want* and *got*." +msgstr "" +"返回一个字符串,描述给定用例( *example* )的预期输出和实际输出( *got* )之间的差异。 *optionflags* 是用于比较 " +"*want* 和 *got* 的选项标志集。" + +#: ../../library/doctest.rst:1692 +msgid "Debugging" +msgstr "调试" + +#: ../../library/doctest.rst:1694 +msgid "Doctest provides several mechanisms for debugging doctest examples:" +msgstr "Doctest 提供了几种调试 doctest 用例的机制:" + +#: ../../library/doctest.rst:1696 +msgid "" +"Several functions convert doctests to executable Python programs, which can " +"be run under the Python debugger, :mod:`pdb`." +msgstr "有几个函数将测试转换为可执行的 Python 程序,这些程序可以在 Python 调试器, :mod:`pdb` 下运行。" + +#: ../../library/doctest.rst:1699 +msgid "" +"The :class:`DebugRunner` class is a subclass of :class:`DocTestRunner` that " +"raises an exception for the first failing example, containing information " +"about that example. This information can be used to perform post-mortem " +"debugging on the example." +msgstr "" +":class:`DebugRunner` 类是 :class:`DocTestRunner` " +"的一个子类,它为第一个失败的用例触发一个异常,包含关于这个用例的信息。这些信息可以用来对这个用例进行事后调试。" + +#: ../../library/doctest.rst:1704 +msgid "" +"The :mod:`unittest` cases generated by :func:`DocTestSuite` support the " +":meth:`debug` method defined by :class:`unittest.TestCase`." +msgstr "" +"由 :func:`DocTestSuite` 生成的 :mod:`unittest` 用例支持由 :class:`unittest.TestCase` " +"定义的 :meth:`debug` 方法,。" + +#: ../../library/doctest.rst:1707 +msgid "" +"You can add a call to :func:`pdb.set_trace` in a doctest example, and you'll" +" drop into the Python debugger when that line is executed. Then you can " +"inspect current values of variables, and so on. For example, suppose " +":file:`a.py` contains just this module docstring::" +msgstr "" +"你可以在 doctest 的用例中加入对 :func:`pdb.set_trace` 的调用,当这一行被执行时,你会进入 Python 调试器。 " +"然后你可以检查变量的当前值,等等。例如,假设 :file:`a.py` 只包含这个模块 docstring ::" + +#: ../../library/doctest.rst:1712 +msgid "" +"\"\"\"\n" +">>> def f(x):\n" +"... g(x*2)\n" +">>> def g(x):\n" +"... print(x+3)\n" +"... import pdb; pdb.set_trace()\n" +">>> f(3)\n" +"9\n" +"\"\"\"" +msgstr "" +"\"\"\"\n" +">>> def f(x):\n" +"... g(x*2)\n" +">>> def g(x):\n" +"... print(x+3)\n" +"... import pdb; pdb.set_trace()\n" +">>> f(3)\n" +"9\n" +"\"\"\"" + +#: ../../library/doctest.rst:1722 +msgid "Then an interactive Python session may look like this::" +msgstr "那么一个交互式 Python 会话可能是这样的::" + +#: ../../library/doctest.rst:1724 +msgid "" +">>> import a, doctest\n" +">>> doctest.testmod(a)\n" +"--Return--\n" +"> (3)g()->None\n" +"-> import pdb; pdb.set_trace()\n" +"(Pdb) list\n" +" 1 def g(x):\n" +" 2 print(x+3)\n" +" 3 -> import pdb; pdb.set_trace()\n" +"[EOF]\n" +"(Pdb) p x\n" +"6\n" +"(Pdb) step\n" +"--Return--\n" +"> (2)f()->None\n" +"-> g(x*2)\n" +"(Pdb) list\n" +" 1 def f(x):\n" +" 2 -> g(x*2)\n" +"[EOF]\n" +"(Pdb) p x\n" +"3\n" +"(Pdb) step\n" +"--Return--\n" +"> (1)?()->None\n" +"-> f(3)\n" +"(Pdb) cont\n" +"(0, 3)\n" +">>>" +msgstr "" +">>> import a, doctest\n" +">>> doctest.testmod(a)\n" +"--Return--\n" +"> (3)g()->None\n" +"-> import pdb; pdb.set_trace()\n" +"(Pdb) list\n" +" 1 def g(x):\n" +" 2 print(x+3)\n" +" 3 -> import pdb; pdb.set_trace()\n" +"[EOF]\n" +"(Pdb) p x\n" +"6\n" +"(Pdb) step\n" +"--Return--\n" +"> (2)f()->None\n" +"-> g(x*2)\n" +"(Pdb) list\n" +" 1 def f(x):\n" +" 2 -> g(x*2)\n" +"[EOF]\n" +"(Pdb) p x\n" +"3\n" +"(Pdb) step\n" +"--Return--\n" +"> (1)?()->None\n" +"-> f(3)\n" +"(Pdb) cont\n" +"(0, 3)\n" +">>>" + +#: ../../library/doctest.rst:1755 +msgid "" +"Functions that convert doctests to Python code, and possibly run the " +"synthesized code under the debugger:" +msgstr "将测试转换为 Python 代码的函数,并可能在调试器下运行合成的代码:" + +#: ../../library/doctest.rst:1761 +msgid "Convert text with examples to a script." +msgstr "将带有用例的文本转换为脚本。" + +#: ../../library/doctest.rst:1763 +msgid "" +"Argument *s* is a string containing doctest examples. The string is " +"converted to a Python script, where doctest examples in *s* are converted to" +" regular code, and everything else is converted to Python comments. The " +"generated script is returned as a string. For example, ::" +msgstr "" +"参数 *s* 是一个包含测试用例的字符串。该字符串被转换为 Python 脚本,其中 *s* 中的 doctest " +"用例被转换为常规代码,其他的都被转换为 Python 注释。生成的脚本将以字符串的形式返回。例如, ::" + +#: ../../library/doctest.rst:1768 +msgid "" +"import doctest\n" +"print(doctest.script_from_examples(r\"\"\"\n" +" Set x and y to 1 and 2.\n" +" >>> x, y = 1, 2\n" +"\n" +" Print their sum:\n" +" >>> print(x+y)\n" +" 3\n" +"\"\"\"))" +msgstr "" +"import doctest\n" +"print(doctest.script_from_examples(r\"\"\"\n" +" Set x and y to 1 and 2.\n" +" >>> x, y = 1, 2\n" +"\n" +" Print their sum:\n" +" >>> print(x+y)\n" +" 3\n" +"\"\"\"))" + +#: ../../library/doctest.rst:1778 +msgid "displays::" +msgstr "显示::" + +#: ../../library/doctest.rst:1780 +msgid "" +"# Set x and y to 1 and 2.\n" +"x, y = 1, 2\n" +"#\n" +"# Print their sum:\n" +"print(x+y)\n" +"# Expected:\n" +"## 3" +msgstr "" +"# 将 x 和 y 设为 1 和 2。\n" +"x, y = 1, 2\n" +"#\n" +"# 打印两者之和:\n" +"print(x+y)\n" +"# 预期:\n" +"## 3" + +#: ../../library/doctest.rst:1788 +msgid "" +"This function is used internally by other functions (see below), but can " +"also be useful when you want to transform an interactive Python session into" +" a Python script." +msgstr "这个函数在内部被其他函数使用(见下文),但当你想把一个交互式 Python 会话转化为 Python 脚本时,也会很有用。" + +#: ../../library/doctest.rst:1795 +msgid "Convert the doctest for an object to a script." +msgstr "将一个对象的 doctest 转换为一个脚本。" + +#: ../../library/doctest.rst:1797 +msgid "" +"Argument *module* is a module object, or dotted name of a module, containing" +" the object whose doctests are of interest. Argument *name* is the name " +"(within the module) of the object with the doctests of interest. The result" +" is a string, containing the object's docstring converted to a Python " +"script, as described for :func:`script_from_examples` above. For example, " +"if module :file:`a.py` contains a top-level function :func:`!f`, then ::" +msgstr "" +"参数 *module* 是一个模块对象,或是一个带点号的模块名称,其中包含文档测试需要的对象。参数 *name* " +"是文档测试需要的对象(在模块中)的名称。结果是一个字符串,包含该对象的文档字符串转换成的 Python 脚本,如上面 " +":func:`script_from_examples` 所描述的。举例来说,如果模块 :file:`a.py` 包含一个最高层级的函数 " +":func:`!f`,那么 ::" + +#: ../../library/doctest.rst:1804 +msgid "" +"import a, doctest\n" +"print(doctest.testsource(a, \"a.f\"))" +msgstr "" +"import a, doctest\n" +"print(doctest.testsource(a, \"a.f\"))" + +#: ../../library/doctest.rst:1807 +msgid "" +"prints a script version of function :func:`!f`'s docstring, with doctests " +"converted to code, and the rest placed in comments." +msgstr "打印函数 :func:`!f` 的文档字符串的脚本版本,将文档测试转换为代码,而将其余内容放在注释中。" + +#: ../../library/doctest.rst:1813 +msgid "Debug the doctests for an object." +msgstr "对一个对象的 doctest 进行调试。" + +#: ../../library/doctest.rst:1815 +msgid "" +"The *module* and *name* arguments are the same as for function " +":func:`testsource` above. The synthesized Python script for the named " +"object's docstring is written to a temporary file, and then that file is run" +" under the control of the Python debugger, :mod:`pdb`." +msgstr "" +"*module* 和 *name* 参数与上面函数 :func:`testsource` 的参数相同。被命名对象的文档串的合成 Python " +"脚本被写入一个临时文件,然后该文件在 Python 调试器 :mod:`pdb` 的控制下运行。" + +#: ../../library/doctest.rst:1820 +msgid "" +"A shallow copy of ``module.__dict__`` is used for both local and global " +"execution context." +msgstr "``module.__dict__`` 的一个浅层拷贝被用于本地和全局的执行环境。" + +#: ../../library/doctest.rst:1823 +msgid "" +"Optional argument *pm* controls whether post-mortem debugging is used. If " +"*pm* has a true value, the script file is run directly, and the debugger " +"gets involved only if the script terminates via raising an unhandled " +"exception. If it does, then post-mortem debugging is invoked, via " +":func:`pdb.post_mortem`, passing the traceback object from the unhandled " +"exception. If *pm* is not specified, or is false, the script is run under " +"the debugger from the start, via passing an appropriate :func:`exec` call to" +" :func:`pdb.run`." +msgstr "" +"可选参数 *pm* 控制是否使用事后调试。如果 *pm* 为 True " +",则直接运行脚本文件,只有当脚本通过引发一个未处理的异常而终止时,调试器才会介入。如果是这样,就会通过 :func:`pdb.post_mortem` " +"调用事后调试,并传递未处理异常的跟踪对象。如果没有指定 *pm* ,或者是 False,脚本将从一开始就在调试器下运行,通过传递一个适当的 " +":func:`exec` 调用给 :func:`pdb.run`。" + +#: ../../library/doctest.rst:1834 +msgid "Debug the doctests in a string." +msgstr "在一个字符串中调试 doctest。" + +#: ../../library/doctest.rst:1836 +msgid "" +"This is like function :func:`debug` above, except that a string containing " +"doctest examples is specified directly, via the *src* argument." +msgstr "这就像上面的函数 :func:`debug`,只是通过 *src* 参数,直接指定一个包含测试用例的字符串。" + +#: ../../library/doctest.rst:1839 +msgid "" +"Optional argument *pm* has the same meaning as in function :func:`debug` " +"above." +msgstr "可选参数 *pm* 的含义与上述函数 :func:`debug` 的含义相同。" + +#: ../../library/doctest.rst:1841 +msgid "" +"Optional argument *globs* gives a dictionary to use as both local and global" +" execution context. If not specified, or ``None``, an empty dictionary is " +"used. If specified, a shallow copy of the dictionary is used." +msgstr "" +"可选的参数 *globs* 给出了一个字典,作为本地和全局的执行环境。如果没有指定,或者为 ``None`` " +",则使用一个空的字典。如果指定,则使用字典的浅层拷贝。" + +#: ../../library/doctest.rst:1846 +msgid "" +"The :class:`DebugRunner` class, and the special exceptions it may raise, are" +" of most interest to testing framework authors, and will only be sketched " +"here. See the source code, and especially :class:`DebugRunner`'s docstring " +"(which is a doctest!) for more details:" +msgstr "" +":class:`DebugRunner` 类,以及它可能触发的特殊异常,是测试框架作者最感兴趣的,在此仅作简要介绍。请看源代码,特别是 " +":class:`DebugRunner` 的文档串(这是一个测试!)以了解更多细节。" + +#: ../../library/doctest.rst:1854 +msgid "" +"A subclass of :class:`DocTestRunner` that raises an exception as soon as a " +"failure is encountered. If an unexpected exception occurs, an " +":exc:`UnexpectedException` exception is raised, containing the test, the " +"example, and the original exception. If the output doesn't match, then a " +":exc:`DocTestFailure` exception is raised, containing the test, the example," +" and the actual output." +msgstr "" +":class:`DocTestRunner` 的一个子类,一旦遇到失败,就会触发一个异常。如果一个意外的异常发生,就会引发一个 " +":exc:`UnexpectedException` 异常,包含测试、用例和原始异常。如果输出不匹配,那么就会引发一个 " +":exc:`DocTestFailure` 异常,包含测试、用例和实际输出。" + +#: ../../library/doctest.rst:1861 +msgid "" +"For information about the constructor parameters and methods, see the " +"documentation for :class:`DocTestRunner` in section :ref:`doctest-advanced-" +"api`." +msgstr "" +"关于构造函数参数和方法的信息,请参见 :class:`DocTestRunner` 部分的文档 :ref:`doctest-advanced-api` " +"。" + +#: ../../library/doctest.rst:1864 +msgid "" +"There are two exceptions that may be raised by :class:`DebugRunner` " +"instances:" +msgstr ":class:`DebugRunner` 实例可能会触发两种异常。" + +#: ../../library/doctest.rst:1869 +msgid "" +"An exception raised by :class:`DocTestRunner` to signal that a doctest " +"example's actual output did not match its expected output. The constructor " +"arguments are used to initialize the attributes of the same names." +msgstr "" +":class:`DocTestRunner` 触发的异常,表示一个 doctest " +"用例的实际输出与预期输出不一致。构造函数参数被用来初始化相同名称的属性。" + +#: ../../library/doctest.rst:1873 +msgid ":exc:`DocTestFailure` defines the following attributes:" +msgstr ":exc:`DocTestFailure` 定义了以下属性:" + +#: ../../library/doctest.rst:1878 ../../library/doctest.rst:1902 +msgid "" +"The :class:`DocTest` object that was being run when the example failed." +msgstr "当该用例失败时正在运行的 :class:`DocTest` 对象。" + +#: ../../library/doctest.rst:1883 ../../library/doctest.rst:1907 +msgid "The :class:`Example` that failed." +msgstr "失败的 :class:`Example`。" + +#: ../../library/doctest.rst:1888 +msgid "The example's actual output." +msgstr "用例的实际输出。" + +#: ../../library/doctest.rst:1893 +msgid "" +"An exception raised by :class:`DocTestRunner` to signal that a doctest " +"example raised an unexpected exception. The constructor arguments are used " +"to initialize the attributes of the same names." +msgstr "" +"一个由 :class:`DocTestRunner` 触发的异常,以提示一个 doctest 用例引发了一个意外的异常。 " +"构造函数参数被用来初始化相同名称的属性。" + +#: ../../library/doctest.rst:1897 +msgid ":exc:`UnexpectedException` defines the following attributes:" +msgstr ":exc:`UnexpectedException` 定义了以下属性:" + +#: ../../library/doctest.rst:1912 +msgid "" +"A tuple containing information about the unexpected exception, as returned " +"by :func:`sys.exc_info`." +msgstr "一个包含意外异常信息的元组,由 :func:`sys.exc_info` 返回。" + +#: ../../library/doctest.rst:1919 +msgid "Soapbox" +msgstr "肥皂盒" + +#: ../../library/doctest.rst:1921 +msgid "" +"As mentioned in the introduction, :mod:`!doctest` has grown to have three " +"primary uses:" +msgstr "正如介绍中所说,:mod:`!doctest` 已发展出三个主要用途:" + +#: ../../library/doctest.rst:1924 +msgid "Checking examples in docstrings." +msgstr "检查 docstring 中的用例。" + +#: ../../library/doctest.rst:1926 +msgid "Regression testing." +msgstr "回归测试。" + +#: ../../library/doctest.rst:1928 +msgid "Executable documentation / literate testing." +msgstr "可执行的文档/文字测试。" + +#: ../../library/doctest.rst:1930 +msgid "" +"These uses have different requirements, and it is important to distinguish " +"them. In particular, filling your docstrings with obscure test cases makes " +"for bad documentation." +msgstr "这些用途有不同的要求,区分它们是很重要的。特别是,用晦涩难懂的测试用例来填充你的文档字符串会使文档变得很糟糕。" + +#: ../../library/doctest.rst:1934 +msgid "" +"When writing a docstring, choose docstring examples with care. There's an " +"art to this that needs to be learned---it may not be natural at first. " +"Examples should add genuine value to the documentation. A good example can " +"often be worth many words. If done with care, the examples will be " +"invaluable for your users, and will pay back the time it takes to collect " +"them many times over as the years go by and things change. I'm still amazed" +" at how often one of my :mod:`!doctest` examples stops working after a " +"\"harmless\" change." +msgstr "" +"在编写文档字符串时,要谨慎选择文档串字符的示例。 这是一门需要学习的艺术 —— 一开始可能不太自然。 示例应该为文档增加真正的价值。 " +"一个好的示例往往可以抵得上许多文字。 " +"如果用心去做,这些示例对你的用户来说将是无价的,而且随着时间的推移和事情的变化收集这些示例所花费的时间也会得到很多倍的回报。 我至今仍会惊讶于我的 " +":mod:`!doctest` 示例在某个“无害”的修改之后不再有效。" + +#: ../../library/doctest.rst:1942 +msgid "" +"Doctest also makes an excellent tool for regression testing, especially if " +"you don't skimp on explanatory text. By interleaving prose and examples, it" +" becomes much easier to keep track of what's actually being tested, and why." +" When a test fails, good prose can make it much easier to figure out what " +"the problem is, and how it should be fixed. It's true that you could write " +"extensive comments in code-based testing, but few programmers do. Many have " +"found that using doctest approaches instead leads to much clearer tests. " +"Perhaps this is simply because doctest makes writing prose a little easier " +"than writing code, while writing comments in code is a little harder. I " +"think it goes deeper than just that: the natural attitude when writing a " +"doctest-based test is that you want to explain the fine points of your " +"software, and illustrate them with examples. This in turn naturally leads to" +" test files that start with the simplest features, and logically progress to" +" complications and edge cases. A coherent narrative is the result, instead " +"of a collection of isolated functions that test isolated bits of " +"functionality seemingly at random. It's a different attitude, and produces " +"different results, blurring the distinction between testing and explaining." +msgstr "" +"Doctest 也是回归测试的一个很好的工具,特别是如果你不吝啬解释的文字。 " +"通过交错的文本和用例,可以更容易地跟踪真正的测试,以及为什么。当测试失败时,好的文本可以使你更容易弄清问题所在,以及如何解决。 " +"的确,你可以在基于代码的测试中写大量的注释,但很少有程序员这样做。许多人发现,使用 doctest 方法反而能使测试更加清晰。也许这只是因为 " +"doctest 使写散文比写代码容易一些,而在代码中写注释则有点困难。我认为它比这更深入:当写一个基于 doctest " +"的测试时,自然的态度是你想解释你的软件的细微之处,并用例子来说明它们。这反过来又自然地导致了测试文件从最简单的功能开始,然后逻辑地发展到复杂和边缘案例。" +" 一个连贯的叙述是结果,而不是一个孤立的函数集合,似乎是随机的测试孤立的功能位。这是一种不同的态度,产生不同的结果,模糊了测试和解释之间的区别。" + +#: ../../library/doctest.rst:1960 +msgid "" +"Regression testing is best confined to dedicated objects or files. There " +"are several options for organizing tests:" +msgstr "回归测试最好限制在专用对象或文件中。有几种组织测试的选择:" + +#: ../../library/doctest.rst:1963 +msgid "" +"Write text files containing test cases as interactive examples, and test the" +" files using :func:`testfile` or :func:`DocFileSuite`. This is recommended," +" although is easiest to do for new projects, designed from the start to use " +"doctest." +msgstr "" +"编写包含测试案例的文本文件作为交互式例子,并使用 :func:`testfile` 或 :func:`DocFileSuite` 来测试这些文件。 " +"建议这样做,尽管对于新的项目来说是最容易做到的,从一开始就设计成使用 doctest。" + +#: ../../library/doctest.rst:1968 +msgid "" +"Define functions named ``_regrtest_topic`` that consist of single " +"docstrings, containing test cases for the named topics. These functions can" +" be included in the same file as the module, or separated out into a " +"separate test file." +msgstr "" +"定义命名为 ``_regrtest_topic`` 的函数,由单个文档串组成,包含命名主题的测试用例。 " +"这些函数可以包含在与模块相同的文件中,或分离出来成为一个单独的测试文件。" + +#: ../../library/doctest.rst:1972 +msgid "" +"Define a :attr:`~module.__test__` dictionary mapping from regression test " +"topics to docstrings containing test cases." +msgstr "定义一个将回归测试主题映射到包含测试用例的文档字符串的 :attr:`~module.__test__` 字典。" + +#: ../../library/doctest.rst:1975 +msgid "" +"When you have placed your tests in a module, the module can itself be the " +"test runner. When a test fails, you can arrange for your test runner to re-" +"run only the failing doctest while you debug the problem. Here is a minimal" +" example of such a test runner::" +msgstr "" +"当你把你的测试放在一个模块中时,这个模块本身就可以成为测试运行器。当一个测试失败时,你可以安排你的测试运行器只重新运行失败的测试,同时调试问题。 " +"下面是这样一个测试运行器的最小例子::" + +#: ../../library/doctest.rst:1980 +msgid "" +"if __name__ == '__main__':\n" +" import doctest\n" +" flags = doctest.REPORT_NDIFF|doctest.FAIL_FAST\n" +" if len(sys.argv) > 1:\n" +" name = sys.argv[1]\n" +" if name in globals():\n" +" obj = globals()[name]\n" +" else:\n" +" obj = __test__[name]\n" +" doctest.run_docstring_examples(obj, globals(), name=name,\n" +" optionflags=flags)\n" +" else:\n" +" fail, total = doctest.testmod(optionflags=flags)\n" +" print(f\"{fail} failures out of {total} tests\")" +msgstr "" +"if __name__ == '__main__':\n" +" import doctest\n" +" flags = doctest.REPORT_NDIFF|doctest.FAIL_FAST\n" +" if len(sys.argv) > 1:\n" +" name = sys.argv[1]\n" +" if name in globals():\n" +" obj = globals()[name]\n" +" else:\n" +" obj = __test__[name]\n" +" doctest.run_docstring_examples(obj, globals(), name=name,\n" +" optionflags=flags)\n" +" else:\n" +" fail, total = doctest.testmod(optionflags=flags)\n" +" print(f\"{fail} failures out of {total} tests\")" + +#: ../../library/doctest.rst:1997 +msgid "Footnotes" +msgstr "备注" + +#: ../../library/doctest.rst:1998 +msgid "" +"Examples containing both expected output and an exception are not supported." +" Trying to guess where one ends and the other begins is too error-prone, and" +" that also makes for a confusing test." +msgstr "不支持同时包含预期输出和异常的用例。试图猜测一个在哪里结束,另一个在哪里开始,太容易出错了,而且这也会使测试变得混乱。" + +#: ../../library/doctest.rst:382 +msgid ">>>" +msgstr ">>>" + +#: ../../library/doctest.rst:382 +msgid "interpreter prompt" +msgstr "解释器提示符" + +#: ../../library/doctest.rst:382 ../../library/doctest.rst:617 +msgid "..." +msgstr "..." + +#: ../../library/doctest.rst:548 +msgid "^ (caret)" +msgstr "^ (脱字号)" + +#: ../../library/doctest.rst:548 +msgid "marker" +msgstr "标记" + +#: ../../library/doctest.rst:597 +msgid "" +msgstr "" + +#: ../../library/doctest.rst:617 ../../library/doctest.rst:742 +msgid "in doctests" +msgstr "在 doctests 中" + +#: ../../library/doctest.rst:742 +msgid "# (hash)" +msgstr "# (hash)" + +#: ../../library/doctest.rst:742 +msgid "+ (plus)" +msgstr "+ (加号)" + +#: ../../library/doctest.rst:742 +msgid "- (minus)" +msgstr "- (减号)" diff --git a/library/email.charset.po b/library/email.charset.po new file mode 100644 index 0000000000..4eca5cc0c4 --- /dev/null +++ b/library/email.charset.po @@ -0,0 +1,343 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/email.charset.rst:2 +msgid ":mod:`!email.charset`: Representing character sets" +msgstr ":mod:`!email.charset`: 表示字符集" + +#: ../../library/email.charset.rst:7 +msgid "**Source code:** :source:`Lib/email/charset.py`" +msgstr "**源代码:** :source:`Lib/email/charset.py`" + +#: ../../library/email.charset.rst:11 +msgid "" +"This module is part of the legacy (``Compat32``) email API. In the new API " +"only the aliases table is used." +msgstr "此模块是旧版 (``Compat32``) email API 的组成部分。 在新版 API 中只会使用其中的别名表。" + +#: ../../library/email.charset.rst:14 +msgid "" +"The remaining text in this section is the original documentation of the " +"module." +msgstr "本节中的其余文本是此模块的原始文档。" + +#: ../../library/email.charset.rst:16 +msgid "" +"This module provides a class :class:`Charset` for representing character " +"sets and character set conversions in email messages, as well as a character" +" set registry and several convenience methods for manipulating this " +"registry. Instances of :class:`Charset` are used in several other modules " +"within the :mod:`email` package." +msgstr "" +"此模块提供了一个 :class:`Charset` " +"类用来表示电子邮件消息中的字符集和字符集转换操作,以及一个字符集注册表和几个用于操作此注册表的便捷方法。 :class:`Charset` 的实例在 " +":mod:`email` 包的其他几个模块中也有使用。" + +#: ../../library/email.charset.rst:22 +msgid "Import this class from the :mod:`!email.charset` module." +msgstr "请从 :mod:`!email.charset` 模块导入这个类。" + +#: ../../library/email.charset.rst:27 +msgid "Map character sets to their email properties." +msgstr "将字符集映射到其 email 特征属性。" + +#: ../../library/email.charset.rst:29 +msgid "" +"This class provides information about the requirements imposed on email for " +"a specific character set. It also provides convenience routines for " +"converting between character sets, given the availability of the applicable " +"codecs. Given a character set, it will do its best to provide information " +"on how to use that character set in an email message in an RFC-compliant " +"way." +msgstr "" +"这个类提供了特定字符集对于电子邮件的要求的相关信息。考虑到适用编解码器的可用性,它还为字符集之间的转换提供了一些便捷例程。 " +"在给定字符集的情况下,它将尽可能地以符合 RFC 的方式在电子邮件消息中提供有关如何使用该字符集的信息。" + +#: ../../library/email.charset.rst:35 +msgid "" +"Certain character sets must be encoded with quoted-printable or base64 when " +"used in email headers or bodies. Certain character sets must be converted " +"outright, and are not allowed in email." +msgstr "" +"特定字符集当在电子邮件标头或消息体中使用时必须以 quoted-printable 或 base64 来编码。 " +"某些字符集则必须被立即转换,不允许在电子邮件中使用。" + +#: ../../library/email.charset.rst:39 +msgid "" +"Optional *input_charset* is as described below; it is always coerced to " +"lower case. After being alias normalized it is also used as a lookup into " +"the registry of character sets to find out the header encoding, body " +"encoding, and output conversion codec to be used for the character set. For" +" example, if *input_charset* is ``iso-8859-1``, then headers and bodies will" +" be encoded using quoted-printable and no output conversion codec is " +"necessary. If *input_charset* is ``euc-jp``, then headers will be encoded " +"with base64, bodies will not be encoded, but output text will be converted " +"from the ``euc-jp`` character set to the ``iso-2022-jp`` character set." +msgstr "" +"可选的 *input_charset* 说明如下;它总是会被强制转为小写。 " +"在进行别名正规化后它还会被用来查询字符集注册表以找出用于该字符集的标头编码格式、消息体编码格式和输出转换编解码器。举例来说,如果 " +"*input_charset* 为 ``iso-8859-1``,则标头和消息体将会使用 quoted-printable " +"来编码并且不需要输出转换编解码器。如果 *input_charset* 为 ``euc-jp``,则标头将使用 base64 " +"来编码,消息体将不会被编码,但输出文本将从 ``euc-jp`` 字符集转换为 ``iso-2022-jp`` 字符集。" + +#: ../../library/email.charset.rst:49 +msgid ":class:`Charset` instances have the following data attributes:" +msgstr ":class:`Charset` 实例具有下列数据属性:" + +#: ../../library/email.charset.rst:53 +msgid "" +"The initial character set specified. Common aliases are converted to their " +"*official* email names (e.g. ``latin_1`` is converted to ``iso-8859-1``). " +"Defaults to 7-bit ``us-ascii``." +msgstr "" +"指定的初始字符集。通用别名会被转换为它们的 *官方* 电子邮件名称 (例如 ``latin_1`` 会被转换为 ``iso-8859-1``)。 " +"默认值为 7 位 ``us-ascii``。" + +#: ../../library/email.charset.rst:60 +msgid "" +"If the character set must be encoded before it can be used in an email " +"header, this attribute will be set to ``charset.QP`` (for quoted-printable)," +" ``charset.BASE64`` (for base64 encoding), or ``charset.SHORTEST`` for the " +"shortest of QP or BASE64 encoding. Otherwise, it will be ``None``." +msgstr "" +"如果字符集在用于电子邮件标头之前必须被编码,此属性将被设为 ``charset.QP`` (表示 quoted-printable 编码格式), " +"``charset.BASE64`` (表示 base64 编码格式) 或 ``charset.SHORTEST`` 表示 QP 或 BASE64 " +"编码格式中最简短的一个。在其他情况下,该属性将为 ``None``。" + +#: ../../library/email.charset.rst:69 +msgid "" +"Same as *header_encoding*, but describes the encoding for the mail message's" +" body, which indeed may be different than the header encoding. " +"``charset.SHORTEST`` is not allowed for *body_encoding*." +msgstr "" +"与 *header_encoding* 一样,但是用来描述电子邮件消息体的编码格式,它实际上可以与标头编码格式不同。 " +"``charset.SHORTEST`` 不允许被用作 *body_encoding*。" + +#: ../../library/email.charset.rst:76 +msgid "" +"Some character sets must be converted before they can be used in email " +"headers or bodies. If the *input_charset* is one of them, this attribute " +"will contain the name of the character set output will be converted to. " +"Otherwise, it will be ``None``." +msgstr "" +"某些字符集在用于电子邮件标头或消息体之前必须被转换。如果 *input_charset* 是这些字符集之一,该属性将包含输出将要转换的字符集名称。 " +"在其他情况下,该属性将为 ``None``。" + +#: ../../library/email.charset.rst:84 +msgid "" +"The name of the Python codec used to convert the *input_charset* to Unicode." +" If no conversion codec is necessary, this attribute will be ``None``." +msgstr "" +"用于将 *input_charset* 转换为 Unicode 的 Python 编解码器名称。如果不需要任何转换编解码器,该属性将为 " +"``None``." + +#: ../../library/email.charset.rst:91 +msgid "" +"The name of the Python codec used to convert Unicode to the " +"*output_charset*. If no conversion codec is necessary, this attribute will " +"have the same value as the *input_codec*." +msgstr "" +"用于将 Unicode 转换为 *output_charset* 的 Python 编解码器名称。如果不需要任何转换编解码器,该属性将具有与 " +"*input_codec* 相同的值。" + +#: ../../library/email.charset.rst:96 +msgid ":class:`Charset` instances also have the following methods:" +msgstr ":class:`Charset` 实例还有下列方法:" + +#: ../../library/email.charset.rst:100 +msgid "Return the content transfer encoding used for body encoding." +msgstr "返回用于消息体编码的内容转换编码格式。" + +#: ../../library/email.charset.rst:102 +msgid "" +"This is either the string ``quoted-printable`` or ``base64`` depending on " +"the encoding used, or it is a function, in which case you should call the " +"function with a single argument, the Message object being encoded. The " +"function should then set the :mailheader:`Content-Transfer-Encoding` header " +"itself to whatever is appropriate." +msgstr "" +"根据所使用的编码格式返回 ``quoted-printable`` 或 " +"``base64``,或是返回一个函数,在这种情况下你应当调用该函数并附带一个参数,即被编码的消息对象。该函数应当自行将 " +":mailheader:`Content-Transfer-Encoding` 标头设为适当的值。" + +#: ../../library/email.charset.rst:108 +msgid "" +"Returns the string ``quoted-printable`` if *body_encoding* is ``QP``, " +"returns the string ``base64`` if *body_encoding* is ``BASE64``, and returns " +"the string ``7bit`` otherwise." +msgstr "" +"如果 *body_encoding* 为 ``QP`` 则返回字符串 ``quoted-printable``,如果 *body_encoding* 为" +" ``BASE64`` 则返回字符串 ``base64``,并在其他情况下返回字符串 ``7bit``。" + +#: ../../library/email.charset.rst:115 +msgid "Return the output character set." +msgstr "返回输出字符集。" + +#: ../../library/email.charset.rst:117 +msgid "" +"This is the *output_charset* attribute if that is not ``None``, otherwise it" +" is *input_charset*." +msgstr "如果 *output_charset* 属性不为 ``None`` 则返回该属性,否则返回 *input_charset*。" + +#: ../../library/email.charset.rst:123 +msgid "Header-encode the string *string*." +msgstr "对字符串 *string* 执行标头编码。" + +#: ../../library/email.charset.rst:125 +msgid "" +"The type of encoding (base64 or quoted-printable) will be based on the " +"*header_encoding* attribute." +msgstr "编码格式的类型 (base64 或 quoted-printable) 将取决于 *header_encoding* 属性。" + +#: ../../library/email.charset.rst:131 +msgid "Header-encode a *string* by converting it first to bytes." +msgstr "通过先将 *string* 转换为字节串来对其执行标头编码。" + +#: ../../library/email.charset.rst:133 +msgid "" +"This is similar to :meth:`header_encode` except that the string is fit into " +"maximum line lengths as given by the argument *maxlengths*, which must be an" +" iterator: each element returned from this iterator will provide the next " +"maximum line length." +msgstr "" +"这类似于 :meth:`header_encode`,区别是字符串会被调整至参数 *maxlengths* " +"所给出的最大行长度,它应当是一个迭代器:该迭代器返回的每个元素将提供下一个最大行长度。" + +#: ../../library/email.charset.rst:141 +msgid "Body-encode the string *string*." +msgstr "对字符串 *string* 执行消息体编码。" + +#: ../../library/email.charset.rst:143 +msgid "" +"The type of encoding (base64 or quoted-printable) will be based on the " +"*body_encoding* attribute." +msgstr "编码格式的类型 (base64 或 quoted-printable) 将取决于 *body_encoding* 属性。" + +#: ../../library/email.charset.rst:146 +msgid "" +"The :class:`Charset` class also provides a number of methods to support " +"standard operations and built-in functions." +msgstr ":class:`Charset` 类还提供了一些方法以支持标准运算和内置函数。" + +#: ../../library/email.charset.rst:152 +msgid "" +"Returns *input_charset* as a string coerced to lower case. :meth:`!__repr__`" +" is an alias for :meth:`!__str__`." +msgstr "" +"将 *input_charset* 以转为小写的字符串形式返回。 :meth:`!__repr__` 是 :meth:`!__str__` 的别名。" + +#: ../../library/email.charset.rst:158 +msgid "" +"This method allows you to compare two :class:`Charset` instances for " +"equality." +msgstr "这个方法允许你对两个 :class:`Charset` 实例进行相等比较。" + +#: ../../library/email.charset.rst:164 +msgid "" +"This method allows you to compare two :class:`Charset` instances for " +"inequality." +msgstr "这个方法允许你对两个 :class:`Charset` 实例进行不等比较。" + +#: ../../library/email.charset.rst:167 +msgid "" +"The :mod:`!email.charset` module also provides the following functions for " +"adding new entries to the global character set, alias, and codec registries:" +msgstr ":mod:`!email.charset` 模块还提供了下列函数用于向全局字典集、别名和编解码器注册表添加新条目:" + +#: ../../library/email.charset.rst:173 +msgid "Add character properties to the global registry." +msgstr "向全局注册表添加字符特征属性。" + +#: ../../library/email.charset.rst:175 +msgid "" +"*charset* is the input character set, and must be the canonical name of a " +"character set." +msgstr "*charset* 是输入字符集,它必须为某个字符集的正规名称。" + +#: ../../library/email.charset.rst:178 +msgid "" +"Optional *header_enc* and *body_enc* is either ``charset.QP`` for quoted-" +"printable, ``charset.BASE64`` for base64 encoding, ``charset.SHORTEST`` for " +"the shortest of quoted-printable or base64 encoding, or ``None`` for no " +"encoding. ``SHORTEST`` is only valid for *header_enc*. The default is " +"``None`` for no encoding." +msgstr "" +"可选的 *header_enc* 和 *body_enc* 可以是 ``charset.QP`` 表示 quoted-printable " +"编码格式,``charset.BASE64`` 表示 base64 编码格式,``charset.SHORTEST`` 表示 quoted-" +"printable 或 base64 编码格式中较短的一个,或者为 ``None`` 表示没有编码格式。``SHORTEST`` 仅对 " +"*header_enc* 有效。 默认值为 ``None`` 表示没有编码格式。" + +#: ../../library/email.charset.rst:184 +msgid "" +"Optional *output_charset* is the character set that the output should be in." +" Conversions will proceed from input charset, to Unicode, to the output " +"charset when the method :meth:`Charset.convert` is called. The default is " +"to output in the same character set as the input." +msgstr "" +"可选的 *output_charset* 是输出所应当采用的字符集。当 :meth:`Charset.convert` " +"方法被调用时将会执行从输入字符集到输出字符集的转换。默认情况下输出字符集将与输入字符集相同。" + +#: ../../library/email.charset.rst:189 +msgid "" +"Both *input_charset* and *output_charset* must have Unicode codec entries in" +" the module's character set-to-codec mapping; use :func:`add_codec` to add " +"codecs the module does not know about. See the :mod:`codecs` module's " +"documentation for more information." +msgstr "" +"*input_charset* 和 *output_charset* 都必须在模块的字符集 - 编解码器映射中具有 Unicode 编解码器条目;使用 " +":func:`add_codec` 可添加本模块还不知道的编解码器。请参阅 :mod:`codecs` 模块的文档来了解更多信息。" + +#: ../../library/email.charset.rst:194 +msgid "" +"The global character set registry is kept in the module global dictionary " +"``CHARSETS``." +msgstr "全局字符集注册表保存在模块全局字典 ``CHARSETS`` 中。" + +#: ../../library/email.charset.rst:200 +msgid "" +"Add a character set alias. *alias* is the alias name, e.g. ``latin-1``. " +"*canonical* is the character set's canonical name, e.g. ``iso-8859-1``." +msgstr "" +"添加一个字符集别名。 *alias* 为特定的别名,例如 ``latin-1``。 *canonical* 是字符集的正规名称,例如 " +"``iso-8859-1``." + +#: ../../library/email.charset.rst:203 +msgid "" +"The global charset alias registry is kept in the module global dictionary " +"``ALIASES``." +msgstr "全局字符集别名注册表保存在模块全局字典 ``ALIASES`` 中。" + +#: ../../library/email.charset.rst:209 +msgid "" +"Add a codec that map characters in the given character set to and from " +"Unicode." +msgstr "添加在给定字符集的字符和 Unicode 之间建立映射的编解码器。" + +#: ../../library/email.charset.rst:211 +msgid "" +"*charset* is the canonical name of a character set. *codecname* is the name " +"of a Python codec, as appropriate for the second argument to the " +":class:`str`'s :meth:`~str.encode` method." +msgstr "" +"*charset* 是某个字符集的正规名称。 *codecname* 是某个 Python 编解码器的名称,可以被用来作为 :class:`str` 的" +" :meth:`~str.encode` 方法的第二个参数。" diff --git a/library/email.compat32-message.po b/library/email.compat32-message.po new file mode 100644 index 0000000000..694174fa11 --- /dev/null +++ b/library/email.compat32-message.po @@ -0,0 +1,1193 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/email.compat32-message.rst:4 +msgid "" +":mod:`email.message.Message`: Representing an email message using the " +":data:`~email.policy.compat32` API" +msgstr "" +":mod:`email.message.Message`: 使用 :data:`~email.policy.compat32` API " +"来表示电子邮件消息" + +#: ../../library/email.compat32-message.rst:13 +msgid "" +"The :class:`Message` class is very similar to the " +":class:`~email.message.EmailMessage` class, without the methods added by " +"that class, and with the default behavior of certain other methods being " +"slightly different. We also document here some methods that, while " +"supported by the :class:`~email.message.EmailMessage` class, are not " +"recommended unless you are dealing with legacy code." +msgstr "" +":class:`Message` 类与 :class:`~email.message.EmailMessage` " +"类非常相似,但没有该类所添加的方法,并且某些方法的默认行为也略有不同。我们还在这里记录了一些虽然被 " +":class:`~email.message.EmailMessage` 类所支持但并不推荐的方法,除非你是在处理旧有代码。" + +#: ../../library/email.compat32-message.rst:20 +msgid "The philosophy and structure of the two classes is otherwise the same." +msgstr "在其他情况下这两个类的理念和结构都是相同的。" + +#: ../../library/email.compat32-message.rst:22 +msgid "" +"This document describes the behavior under the default (for " +":class:`Message`) policy :attr:`~email.policy.Compat32`. If you are going " +"to use another policy, you should be using the " +":class:`~email.message.EmailMessage` class instead." +msgstr "" +"本文档描述了默认 (对于 :class:`Message`) 策略 :attr:`~email.policy.Compat32` 之下的行为。 " +"如果你要使用其他策略,你应当改用 :class:`~email.message.EmailMessage` 类。" + +#: ../../library/email.compat32-message.rst:26 +msgid "" +"An email message consists of *headers* and a *payload*. Headers must be " +":rfc:`5322` style names and values, where the field name and value are " +"separated by a colon. The colon is not part of either the field name or the" +" field value. The payload may be a simple text message, or a binary object," +" or a structured sequence of sub-messages each with their own set of headers" +" and their own payload. The latter type of payload is indicated by the " +"message having a MIME type such as :mimetype:`multipart/\\*` or " +":mimetype:`message/rfc822`." +msgstr "" +"电子邮件消息由多个 *标头* 和一个 *载荷* 组成。标头必须为 :rfc:`5322` 风格的名称和值,其中字段名和值由冒号分隔。 " +"冒号不是字段名或字段值的组成部分。载荷可以是简单的文本消息,或是二进制对象,或是多个子消息的结构化序列,每个子消息都有自己的标头集合和自己的载荷。 " +"后一种类型的载荷是由具有 :mimetype:`multipart/\\*` 或 :mimetype:`message/rfc822` 等 MIME " +"类型的消息来指明的。" + +#: ../../library/email.compat32-message.rst:35 +msgid "" +"The conceptual model provided by a :class:`Message` object is that of an " +"ordered dictionary of headers with additional methods for accessing both " +"specialized information from the headers, for accessing the payload, for " +"generating a serialized version of the message, and for recursively walking " +"over the object tree. Note that duplicate headers are supported but special" +" methods must be used to access them." +msgstr "" +":class:`Message` " +"对象所提供的概念化模型是由标头组成的有序字典,加上用于访问标头中的特殊信息以及访问载荷的额外方法,以便能生成消息的序列化版本,并递归地遍历对象树。 " +"请注意重复的标头是受支持的,但必须使用特殊的方法来访问它们。" + +#: ../../library/email.compat32-message.rst:42 +msgid "" +"The :class:`Message` pseudo-dictionary is indexed by the header names, which" +" must be ASCII values. The values of the dictionary are strings that are " +"supposed to contain only ASCII characters; there is some special handling " +"for non-ASCII input, but it doesn't always produce the correct results. " +"Headers are stored and returned in case-preserving form, but field names are" +" matched case-insensitively. There may also be a single envelope header, " +"also known as the *Unix-From* header or the ``From_`` header. The *payload*" +" is either a string or bytes, in the case of simple message objects, or a " +"list of :class:`Message` objects, for MIME container documents (e.g. " +":mimetype:`multipart/\\*` and :mimetype:`message/rfc822`)." +msgstr "" +":class:`Message` 伪字典以标头名作为索引,标头名必须为 ASCII 值。字典的值为应当只包含 ASCII 字符的字符串;对于非 " +"ASCII 输入有一些特殊处理,但这并不总能产生正确的结果。标头以保留原大小写的形式存储和返回,但字段名称匹配对大小写不敏感。 " +"还可能会有一个单独的封包标头,也称 *Unix-From* 标头或 ``From_`` 标头。 *载荷* " +"对于简单消息对象的情况是一个字符串或字节串,对于 MIME 容器文档的情况 (例如 :mimetype:`multipart/\\*` 和 " +":mimetype:`message/rfc822`) 则是一个 :class:`Message` 对象列表。" + +#: ../../library/email.compat32-message.rst:53 +msgid "Here are the methods of the :class:`Message` class:" +msgstr "以下是 :class:`Message` 类的方法:" + +#: ../../library/email.compat32-message.rst:58 +msgid "" +"If *policy* is specified (it must be an instance of a :mod:`~email.policy` " +"class) use the rules it specifies to update and serialize the representation" +" of the message. If *policy* is not set, use the :class:`compat32 " +"` policy, which maintains backward compatibility with" +" the Python 3.2 version of the email package. For more information see the " +":mod:`~email.policy` documentation." +msgstr "" +"如果指定了 *policy* (它必须为 :mod:`~email.policy` 类的实例) 则使用它所设置的规则来更新和序列化消息的表示形式。 " +"如果未设置 *policy*,则使用 :class:`compat32 ` 策略,该策略会保持对 " +"Python 3.2 版 email 包的向下兼容性。 更多信息请参阅 :mod:`~email.policy` 文档。" + +#: ../../library/email.compat32-message.rst:65 +msgid "The *policy* keyword argument was added." +msgstr "增加了 *policy* 关键字参数。" + +#: ../../library/email.compat32-message.rst:70 +msgid "" +"Return the entire message flattened as a string. When optional *unixfrom* " +"is true, the envelope header is included in the returned string. *unixfrom* " +"defaults to ``False``. For backward compatibility reasons, *maxheaderlen* " +"defaults to ``0``, so if you want a different value you must override it " +"explicitly (the value specified for *max_line_length* in the policy will be " +"ignored by this method). The *policy* argument may be used to override the " +"default policy obtained from the message instance. This can be used to " +"control some of the formatting produced by the method, since the specified " +"*policy* will be passed to the ``Generator``." +msgstr "" +"以展平的字符串形式返回整个消息对象。当可选的 *unixfrom* 为真值时,返回的字符串会包括封包标头。 *unixfrom* 的默认值是 " +"``False``。出于保持向下兼容性的原因,*maxheaderlen* 的默认值是 ``0``,因此如果你想要不同的值你必须显式地重写它(在策略中为" +" *max_line_length* 指定的值将被此方法忽略)。 *policy* " +"参数可被用于覆盖从消息实例获取的默认策略。这可以用来对该方法所输出的格式进行一些控制,因为指定的 *policy* 将被传递给 " +"``Generator``." + +#: ../../library/email.compat32-message.rst:80 +#: ../../library/email.compat32-message.rst:122 +msgid "" +"Flattening the message may trigger changes to the :class:`Message` if " +"defaults need to be filled in to complete the transformation to a string " +"(for example, MIME boundaries may be generated or modified)." +msgstr "" +"如果需要填充默认值以完成对字符串的转换则展平消息可能触发对 :class:`Message` 的修改(例如,MIME 边界可能会被生成或被修改)。" + +#: ../../library/email.compat32-message.rst:84 +msgid "" +"Note that this method is provided as a convenience and may not always format" +" the message the way you want. For example, by default it does not do the " +"mangling of lines that begin with ``From`` that is required by the Unix mbox" +" format. For more flexibility, instantiate a " +":class:`~email.generator.Generator` instance and use its " +":meth:`~email.generator.Generator.flatten` method directly. For example::" +msgstr "" +"请注意此方法是出于便捷原因提供的,并可能无法总是以你想要的方式来格式化消息。例如,在默认情况下它不会按 Unix mbox 格式的要求对以 " +"``From`` 打头的行执行调整。为了获得更高灵活性,请实例化一个 :class:`~email.generator.Generator` " +"实例并直接使用其 :meth:`~email.generator.Generator.flatten` 方法。例如::" + +#: ../../library/email.compat32-message.rst:91 +msgid "" +"from io import StringIO\n" +"from email.generator import Generator\n" +"fp = StringIO()\n" +"g = Generator(fp, mangle_from_=True, maxheaderlen=60)\n" +"g.flatten(msg)\n" +"text = fp.getvalue()" +msgstr "" +"from io import StringIO\n" +"from email.generator import Generator\n" +"fp = StringIO()\n" +"g = Generator(fp, mangle_from_=True, maxheaderlen=60)\n" +"g.flatten(msg)\n" +"text = fp.getvalue()" + +#: ../../library/email.compat32-message.rst:98 +msgid "" +"If the message object contains binary data that is not encoded according to " +"RFC standards, the non-compliant data will be replaced by unicode \"unknown " +"character\" code points. (See also :meth:`.as_bytes` and " +":class:`~email.generator.BytesGenerator`.)" +msgstr "" +"如果消息对象包含未按照 RFC 标准进行编码的二进制数据,则这些不合规数据将被 unicode \"unknown character\" " +"码位值所替代。 (另请参阅 :meth:`.as_bytes` 和 :class:`~email.generator.BytesGenerator`。)" + +#: ../../library/email.compat32-message.rst:103 +msgid "the *policy* keyword argument was added." +msgstr "增加了 *policy* 关键字参数。" + +#: ../../library/email.compat32-message.rst:108 +msgid "" +"Equivalent to :meth:`.as_string`. Allows ``str(msg)`` to produce a string " +"containing the formatted message." +msgstr "等价于 :meth:`.as_string`。让 ``str(msg)`` 产生一个包含已格式化消息的字符串。" + +#: ../../library/email.compat32-message.rst:114 +msgid "" +"Return the entire message flattened as a bytes object. When optional " +"*unixfrom* is true, the envelope header is included in the returned string." +" *unixfrom* defaults to ``False``. The *policy* argument may be used to " +"override the default policy obtained from the message instance. This can be " +"used to control some of the formatting produced by the method, since the " +"specified *policy* will be passed to the ``BytesGenerator``." +msgstr "" +"以字节串对象的形式返回整个扁平化后的消息。当可选的 *unixfrom* 为真值时,返回的字符串会包括封包标头。 *unixfrom* 的默认值为 " +"``False``。 *policy* 参数可被用于覆盖从消息实例获取的默认策略。这可被用来控制该方法所产生的部分格式化效果,因为指定的 " +"*policy* 将被传递给 ``BytesGenerator``。" + +#: ../../library/email.compat32-message.rst:126 +msgid "" +"Note that this method is provided as a convenience and may not always format" +" the message the way you want. For example, by default it does not do the " +"mangling of lines that begin with ``From`` that is required by the Unix mbox" +" format. For more flexibility, instantiate a " +":class:`~email.generator.BytesGenerator` instance and use its " +":meth:`~email.generator.BytesGenerator.flatten` method directly. For " +"example::" +msgstr "" +"请注意此方法是出于便捷原因提供的,并可能无法总是以你想要的方式来格式化消息。例如,在默认情况下它不会按 Unix mbox 格式的要求对以 " +"``From`` 打头的行执行调整。为了获得更高灵活性,请实例化一个 :class:`~email.generator.BytesGenerator` " +"实例并直接使用其 :meth:`~email.generator.BytesGenerator.flatten` 方法。例如::" + +#: ../../library/email.compat32-message.rst:134 +msgid "" +"from io import BytesIO\n" +"from email.generator import BytesGenerator\n" +"fp = BytesIO()\n" +"g = BytesGenerator(fp, mangle_from_=True, maxheaderlen=60)\n" +"g.flatten(msg)\n" +"text = fp.getvalue()" +msgstr "" +"from io import BytesIO\n" +"from email.generator import BytesGenerator\n" +"fp = BytesIO()\n" +"g = BytesGenerator(fp, mangle_from_=True, maxheaderlen=60)\n" +"g.flatten(msg)\n" +"text = fp.getvalue()" + +#: ../../library/email.compat32-message.rst:146 +msgid "" +"Equivalent to :meth:`.as_bytes`. Allows ``bytes(msg)`` to produce a bytes " +"object containing the formatted message." +msgstr "等价于 :meth:`.as_bytes`。让 ``bytes(msg)`` 产生一个包含已格式化消息的字节串对象。" + +#: ../../library/email.compat32-message.rst:154 +msgid "" +"Return ``True`` if the message's payload is a list of sub-\\ " +":class:`Message` objects, otherwise return ``False``. When " +":meth:`is_multipart` returns ``False``, the payload should be a string " +"object (which might be a CTE encoded binary payload). (Note that " +":meth:`is_multipart` returning ``True`` does not necessarily mean that " +"\"msg.get_content_maintype() == 'multipart'\" will return the ``True``. For " +"example, ``is_multipart`` will return ``True`` when the :class:`Message` is " +"of type ``message/rfc822``.)" +msgstr "" +"如果该消息的载荷是一个子 :class:`Message` 对象列表则返回 ``True``,否则返回 ``False``。当 " +":meth:`is_multipart` 返回 ``False`` 时,载荷应当是一个字符串对象(有可能是一个 CTE 编码的二进制载荷)。 (请注意 " +":meth:`is_multipart` 返回 ``True`` 并不意味着 \"msg.get_content_maintype() == " +"'multipart'\" 将返回 ``True``。 例如,``is_multipart`` 在 :class:`Message` 类型为 " +"``message/rfc822`` 时也将返回 ``True``。)" + +#: ../../library/email.compat32-message.rst:166 +msgid "" +"Set the message's envelope header to *unixfrom*, which should be a string." +msgstr "将消息的封包标头设为 *unixfrom*,这应当是一个字符串。" + +#: ../../library/email.compat32-message.rst:171 +msgid "" +"Return the message's envelope header. Defaults to ``None`` if the envelope " +"header was never set." +msgstr "返回消息的封包标头。如果封包标头从未被设置过,默认返回 ``None``。" + +#: ../../library/email.compat32-message.rst:177 +msgid "" +"Add the given *payload* to the current payload, which must be ``None`` or a " +"list of :class:`Message` objects before the call. After the call, the " +"payload will always be a list of :class:`Message` objects. If you want to " +"set the payload to a scalar object (e.g. a string), use :meth:`set_payload` " +"instead." +msgstr "" +"将给定的 *payload* 添加到当前载荷中,当前载荷在该调用之前必须为 ``None`` 或是一个 :class:`Message` 对象列表。 " +"在调用之后,此载荷将总是一个 :class:`Message` 对象列表。如果你想将此载荷设为一个标量对象(如字符串),请改用 " +":meth:`set_payload`." + +#: ../../library/email.compat32-message.rst:183 +msgid "" +"This is a legacy method. On the :class:`~email.message.EmailMessage` class " +"its functionality is replaced by " +":meth:`~email.message.EmailMessage.set_content` and the related ``make`` and" +" ``add`` methods." +msgstr "" +"这是一个遗留方法。在 :class:`~email.message.EmailMessage` 类上它的功能已被 " +":meth:`~email.message.EmailMessage.set_content` 及相关的 ``make`` 和 ``add`` " +"方法所替代。" + +#: ../../library/email.compat32-message.rst:191 +msgid "" +"Return the current payload, which will be a list of :class:`Message` objects" +" when :meth:`is_multipart` is ``True``, or a string when " +":meth:`is_multipart` is ``False``. If the payload is a list and you mutate " +"the list object, you modify the message's payload in place." +msgstr "" +"返回当前的载荷,它在 :meth:`is_multipart` 为 ``True`` 时将是一个 :class:`Message` 对象列表,在 " +":meth:`is_multipart` 为 ``False`` 时则是一个字符串。 " +"如果该载荷是一个列表且你修改了这个列表对象,那么你就是原地修改了消息的载荷。" + +#: ../../library/email.compat32-message.rst:196 +msgid "" +"With optional argument *i*, :meth:`get_payload` will return the *i*-th " +"element of the payload, counting from zero, if :meth:`is_multipart` is " +"``True``. An :exc:`IndexError` will be raised if *i* is less than 0 or " +"greater than or equal to the number of items in the payload. If the payload" +" is a string (i.e. :meth:`is_multipart` is ``False``) and *i* is given, a " +":exc:`TypeError` is raised." +msgstr "" +"传入可选参数 *i* 时,如果 :meth:`is_multipart` 为 ``True``,:meth:`get_payload` " +"将返回载荷从零开始计数的第 *i* 个元素。如果 *i* 小于 0 或大于等于载荷中的条目数则将引发 :exc:`IndexError`。 " +"如果载荷是一个字符串 (即 :meth:`is_multipart` 为 ``False``) 且给出了 *i*,则会引发 " +":exc:`TypeError`。" + +#: ../../library/email.compat32-message.rst:203 +msgid "" +"Optional *decode* is a flag indicating whether the payload should be decoded" +" or not, according to the :mailheader:`Content-Transfer-Encoding` header. " +"When ``True`` and the message is not a multipart, the payload will be " +"decoded if this header's value is ``quoted-printable`` or ``base64``. If " +"some other encoding is used, or :mailheader:`Content-Transfer-Encoding` " +"header is missing, the payload is returned as-is (undecoded). In all cases " +"the returned value is binary data. If the message is a multipart and the " +"*decode* flag is ``True``, then ``None`` is returned. If the payload is " +"base64 and it was not perfectly formed (missing padding, characters outside " +"the base64 alphabet), then an appropriate defect will be added to the " +"message's defect property (:class:`~email.errors.InvalidBase64PaddingDefect`" +" or :class:`~email.errors.InvalidBase64CharactersDefect`, respectively)." +msgstr "" +"可选的 *decode* 是一个指明载荷是否应根据 :mailheader:`Content-Transfer-Encoding` 标头被解码的旗标。 " +"当其值为 ``True`` 且消息没有多个部分时,如果此标头值为 ``quoted-printable`` 或 ``base64`` 则载荷将被解码。 " +"如果使用了其他编码格式,或者找不到 :mailheader:`Content-Transfer-Encoding` 标头时,载荷将被原样返回(不解码)。" +" 在所有情况下返回值都是二进制数据。如果消息有多个部分且 *decode* 旗标为 ``True``,则将返回 ``None``。如果载荷为 " +"base64 但内容不完全正确(如缺少填充符、存在 base64 字母表以外的字符等),则将在消息的缺陷属性中添加适当的缺陷值 (分别为 " +":class:`~email.errors.InvalidBase64PaddingDefect` 或 " +":class:`~email.errors.InvalidBase64CharactersDefect`)." + +#: ../../library/email.compat32-message.rst:217 +msgid "" +"When *decode* is ``False`` (the default) the body is returned as a string " +"without decoding the :mailheader:`Content-Transfer-Encoding`. However, for " +"a :mailheader:`Content-Transfer-Encoding` of 8bit, an attempt is made to " +"decode the original bytes using the ``charset`` specified by the " +":mailheader:`Content-Type` header, using the ``replace`` error handler. If " +"no ``charset`` is specified, or if the ``charset`` given is not recognized " +"by the email package, the body is decoded using the default ASCII charset." +msgstr "" +"当 *decode* 为 ``False`` (默认值) 时消息体会作为字符串返回而不解码 :mailheader:`Content-Transfer-" +"Encoding`。 但是,对于 :mailheader:`Content-Transfer-Encoding` 为 8bit 的情况,会尝试使用 " +":mailheader:`Content-Type` 标头指定的 ``charset`` 来解码原始字节串,并使用 ``replace`` " +"错误处理程序。如果未指定 ``charset``,或者如果指定的 ``charset`` 未被 email 包所识别,则会使用默认的 ASCII " +"字符集来解码消息体。" + +#: ../../library/email.compat32-message.rst:226 +msgid "" +"This is a legacy method. On the :class:`~email.message.EmailMessage` class " +"its functionality is replaced by " +":meth:`~email.message.EmailMessage.get_content` and " +":meth:`~email.message.EmailMessage.iter_parts`." +msgstr "" +"这是一个遗留方法。在 :class:`~email.message.EmailMessage` 类上它的功能已被 " +":meth:`~email.message.EmailMessage.get_content` 和 " +":meth:`~email.message.EmailMessage.iter_parts` 所替代。" + +#: ../../library/email.compat32-message.rst:234 +msgid "" +"Set the entire message object's payload to *payload*. It is the client's " +"responsibility to ensure the payload invariants. Optional *charset* sets " +"the message's default character set; see :meth:`set_charset` for details." +msgstr "" +"将整个消息对象的载荷设为 *payload*。客户端要负责确保载荷的不变性。可选的 *charset* 用于设置消息的默认字符集;详情请参阅 " +":meth:`set_charset`." + +#: ../../library/email.compat32-message.rst:238 +msgid "" +"This is a legacy method. On the :class:`~email.message.EmailMessage` class " +"its functionality is replaced by " +":meth:`~email.message.EmailMessage.set_content`." +msgstr "" +"这是一个遗留方法。在 :class:`~email.message.EmailMessage` 类上它的功能已被 " +":meth:`~email.message.EmailMessage.set_content` 所替代。" + +#: ../../library/email.compat32-message.rst:245 +msgid "" +"Set the character set of the payload to *charset*, which can either be a " +":class:`~email.charset.Charset` instance (see :mod:`email.charset`), a " +"string naming a character set, or ``None``. If it is a string, it will be " +"converted to a :class:`~email.charset.Charset` instance. If *charset* is " +"``None``, the ``charset`` parameter will be removed from the " +":mailheader:`Content-Type` header (the message will not be otherwise " +"modified). Anything else will generate a :exc:`TypeError`." +msgstr "" +"将载荷的字符集设为 *charset*,它可以是 :class:`~email.charset.Charset` 实例 (参见 " +":mod:`email.charset`)、字符集名称字符串或 ``None``。 如果是字符串,它将被转换为一个 " +":class:`~email.charset.Charset` 实例。 如果 *charset* 是 ``None``,``charset`` 形参将从" +" :mailheader:`Content-Type` 标头中被删除(消息将不会进行其他修改)。 任何其他值都将导致 :exc:`TypeError`。" + +#: ../../library/email.compat32-message.rst:253 +msgid "" +"If there is no existing :mailheader:`MIME-Version` header one will be added." +" If there is no existing :mailheader:`Content-Type` header, one will be " +"added with a value of :mimetype:`text/plain`. Whether the " +":mailheader:`Content-Type` header already exists or not, its ``charset`` " +"parameter will be set to *charset.output_charset*. If " +"*charset.input_charset* and *charset.output_charset* differ, the payload " +"will be re-encoded to the *output_charset*. If there is no existing " +":mailheader:`Content-Transfer-Encoding` header, then the payload will be " +"transfer-encoded, if needed, using the specified " +":class:`~email.charset.Charset`, and a header with the appropriate value " +"will be added. If a :mailheader:`Content-Transfer-Encoding` header already " +"exists, the payload is assumed to already be correctly encoded using that " +":mailheader:`Content-Transfer-Encoding` and is not modified." +msgstr "" +"如果 :mailheader:`MIME-Version` 标头不存在则将被添加。如果 :mailheader:`Content-Type` " +"标头不存在,则将添加一个值为 :mimetype:`text/plain` 的该标头。无论 :mailheader:`Content-Type` " +"标头是否已存在,其 ``charset`` 形参都将被设为 *charset.output_charset*。如果 " +"*charset.input_charset* 和 *charset.output_charset* 不同,则载荷将被重编码为 " +"*output_charset*。如果 :mailheader:`Content-Transfer-Encoding` " +"标头不存在,则载荷将在必要时使用指定的 :class:`~email.charset.Charset` 来转换编码,并将添加一个具有相应值的标头。如果 " +":mailheader:`Content-Transfer-Encoding` 标头已存在,则会假定载荷已使用该 " +":mailheader:`Content-Transfer-Encoding` 进行正确编码并不会再被修改。" + +#: ../../library/email.compat32-message.rst:267 +msgid "" +"This is a legacy method. On the :class:`~email.message.EmailMessage` class " +"its functionality is replaced by the *charset* parameter of the " +":meth:`email.message.EmailMessage.set_content` method." +msgstr "" +"这是一个遗留方法。在 :class:`~email.message.EmailMessage` 类上它的功能已被 " +":meth:`email.message.EmailMessage.set_content` 方法的 *charset* 形参所替代。" + +#: ../../library/email.compat32-message.rst:275 +msgid "" +"Return the :class:`~email.charset.Charset` instance associated with the " +"message's payload." +msgstr "返回与消息的载荷相关联的 :class:`~email.charset.Charset` 实例。" + +#: ../../library/email.compat32-message.rst:278 +msgid "" +"This is a legacy method. On the :class:`~email.message.EmailMessage` class " +"it always returns ``None``." +msgstr "这是一个遗留方法。在 :class:`~email.message.EmailMessage` 类上它将总是返回 ``None``。" + +#: ../../library/email.compat32-message.rst:283 +msgid "" +"The following methods implement a mapping-like interface for accessing the " +"message's :rfc:`2822` headers. Note that there are some semantic " +"differences between these methods and a normal mapping (i.e. dictionary) " +"interface. For example, in a dictionary there are no duplicate keys, but " +"here there may be duplicate message headers. Also, in dictionaries there is" +" no guaranteed order to the keys returned by :meth:`keys`, but in a " +":class:`Message` object, headers are always returned in the order they " +"appeared in the original message, or were added to the message later. Any " +"header deleted and then re-added are always appended to the end of the " +"header list." +msgstr "" +"以下方法实现了用于访问消息的 :rfc:`2822` 标头的类映射接口。请注意这些方法和普通映射(例如字典)接口之间存在一些语义上的不同。 " +"举例来说,在一个字典中不能有重复的键,但消息标头则可能有重复。并且,在字典中由 :meth:`keys` 返回的键的顺序是没有保证的,但在 " +":class:`Message` 对象中,标头总是会按它们在原始消息中的出现或后继加入顺序返回。任何已删除再重新加入的标头总是会添加到标头列表的末尾。" + +#: ../../library/email.compat32-message.rst:293 +msgid "" +"These semantic differences are intentional and are biased toward maximal " +"convenience." +msgstr "这些语义上的差异是有意为之且其目的是为了提供最大的便利性。" + +#: ../../library/email.compat32-message.rst:296 +msgid "" +"Note that in all cases, any envelope header present in the message is not " +"included in the mapping interface." +msgstr "请注意在任何情况下,消息当中的任何封包标头都不会包含在映射接口当中。" + +#: ../../library/email.compat32-message.rst:299 +msgid "" +"In a model generated from bytes, any header values that (in contravention of" +" the RFCs) contain non-ASCII bytes will, when retrieved through this " +"interface, be represented as :class:`~email.header.Header` objects with a " +"charset of ``unknown-8bit``." +msgstr "" +"在由字节串生成的模型中,任何包含非 ASCII 字节数据(违反 RFC)的标头值在通过此接口来获取时,将被表示为使用 ``unknown-8bit`` " +"字符集的 :class:`~email.header.Header` 对象。" + +#: ../../library/email.compat32-message.rst:307 +msgid "Return the total number of headers, including duplicates." +msgstr "返回标头的总数,包括重复项。" + +#: ../../library/email.compat32-message.rst:312 +msgid "" +"Return ``True`` if the message object has a field named *name*. Matching is " +"done case-insensitively and *name* should not include the trailing colon. " +"Used for the ``in`` operator, e.g.::" +msgstr "" +"如果消息对象中有一个名为 *name* 的字段则返回 ``True``。匹配操作对大小写不敏感并且 *name* 不应包括末尾的冒号。用于 ``in``" +" 运算符,例如::" + +#: ../../library/email.compat32-message.rst:316 +msgid "" +"if 'message-id' in myMessage:\n" +" print('Message-ID:', myMessage['message-id'])" +msgstr "" +"if 'message-id' in myMessage:\n" +" print('Message-ID:', myMessage['message-id'])" + +#: ../../library/email.compat32-message.rst:322 +msgid "" +"Return the value of the named header field. *name* should not include the " +"colon field separator. If the header is missing, ``None`` is returned; a " +":exc:`KeyError` is never raised." +msgstr "" +"返回指定名称标头字段的值。 *name* 不应包括作为字段分隔符的冒号。如果标头未找到,则返回 ``None``;:exc:`KeyError` " +"永远不会被引发。" + +#: ../../library/email.compat32-message.rst:326 +msgid "" +"Note that if the named field appears more than once in the message's " +"headers, exactly which of those field values will be returned is undefined." +" Use the :meth:`get_all` method to get the values of all the extant named " +"headers." +msgstr "" +"请注意如果指定名称的字段在消息标头中多次出现,具体将返回哪个字段值是未定义的。请使用 :meth:`get_all` 方法来获取所有指定名称标头的值。" + +#: ../../library/email.compat32-message.rst:334 +msgid "" +"Add a header to the message with field name *name* and value *val*. The " +"field is appended to the end of the message's existing fields." +msgstr "将具有字段名 *name* 和值 *val* 的标头添加到消息中。字段会被添加到消息的现有字段的末尾。" + +#: ../../library/email.compat32-message.rst:337 +msgid "" +"Note that this does *not* overwrite or delete any existing header with the " +"same name. If you want to ensure that the new header is the only one " +"present in the message with field name *name*, delete the field first, " +"e.g.::" +msgstr "" +"请注意,这个方法 *既不会* 覆盖 *也不会* 删除任何字段名重名的已有字段。如果你确实想保证新字段是整个信息头当中唯一拥有 *name* " +"字段名的字段,你需要先把旧字段删除,例如::" + +#: ../../library/email.compat32-message.rst:341 +msgid "" +"del msg['subject']\n" +"msg['subject'] = 'Python roolz!'" +msgstr "" +"del msg['subject']\n" +"msg['subject'] = 'Python roolz!'" + +#: ../../library/email.compat32-message.rst:347 +msgid "" +"Delete all occurrences of the field with name *name* from the message's " +"headers. No exception is raised if the named field isn't present in the " +"headers." +msgstr "删除信息头当中字段名匹配 *name* 的所有字段。如果匹配指定名称的字段没有找到,也不会抛出任何异常。" + +#: ../../library/email.compat32-message.rst:354 +msgid "Return a list of all the message's header field names." +msgstr "以列表形式返回消息头中所有的字段名。" + +#: ../../library/email.compat32-message.rst:359 +msgid "Return a list of all the message's field values." +msgstr "以列表形式返回消息头中所有的字段值。" + +#: ../../library/email.compat32-message.rst:364 +msgid "" +"Return a list of 2-tuples containing all the message's field headers and " +"values." +msgstr "以二元元组的列表形式返回消息头中所有的字段名和字段值。" + +#: ../../library/email.compat32-message.rst:370 +msgid "" +"Return the value of the named header field. This is identical to " +":meth:`~object.__getitem__` except that optional *failobj* is returned if " +"the named header is missing (defaults to ``None``)." +msgstr "" +"返回对应标头字段名的值。这个方法与 :meth:`~object.__getitem__` 是一样的,只是如果对应标头不存在则返回可选的 " +"*failobj* (默认为 ``None``)。" + +#: ../../library/email.compat32-message.rst:374 +msgid "Here are some additional useful methods:" +msgstr "以下是一些有用的附加方法:" + +#: ../../library/email.compat32-message.rst:379 +msgid "" +"Return a list of all the values for the field named *name*. If there are no " +"such named headers in the message, *failobj* is returned (defaults to " +"``None``)." +msgstr "返回字段名为 *name* 的所有字段值的列表。 如果信息内不存在匹配的字段,返回 *failobj* (其默认值为 ``None``)。" + +#: ../../library/email.compat32-message.rst:386 +msgid "" +"Extended header setting. This method is similar to :meth:`__setitem__` " +"except that additional header parameters can be provided as keyword " +"arguments. *_name* is the header field to add and *_value* is the *primary*" +" value for the header." +msgstr "" +"高级头字段设定。这个方法与 :meth:`__setitem__` 类似,不过你可以使用关键字参数为字段提供附加参数。 *_name* 是字段名, " +"*_value* 是字段 *主* 值。" + +#: ../../library/email.compat32-message.rst:391 +msgid "" +"For each item in the keyword argument dictionary *_params*, the key is taken" +" as the parameter name, with underscores converted to dashes (since dashes " +"are illegal in Python identifiers). Normally, the parameter will be added " +"as ``key=\"value\"`` unless the value is ``None``, in which case only the " +"key will be added. If the value contains non-ASCII characters, it can be " +"specified as a three tuple in the format ``(CHARSET, LANGUAGE, VALUE)``, " +"where ``CHARSET`` is a string naming the charset to be used to encode the " +"value, ``LANGUAGE`` can usually be set to ``None`` or the empty string (see " +":rfc:`2231` for other possibilities), and ``VALUE`` is the string value " +"containing non-ASCII code points. If a three tuple is not passed and the " +"value contains non-ASCII characters, it is automatically encoded in " +":rfc:`2231` format using a ``CHARSET`` of ``utf-8`` and a ``LANGUAGE`` of " +"``None``." +msgstr "" +"对于关键字参数字典 *_params* 中的每一项,其键会被当作形参名,并执行下划线和连字符间的转换(因为连字符不是合法的 Python 标识符)。 " +"通常,形参将以 ``key=\"value\"`` 形式添加除非值为 ``None``,在这种情况下将只添加键。 如果值包含非 ASCII " +"字符,可将其以 ``(CHARSET, LANGUAGE, VALUE)`` 格式的三元组形式指定,其中 ``CHARSET`` " +"是要用于对值进行编码的字符集名称字符串,``LANGUAGE`` 通常可设为 ``None`` 或空字符串(请参阅 :rfc:`2231` " +"了解其他可能的取值),而 ``VALUE`` 是包含非 ASCII 码位点的字符串值。 如果不是传入一个三元组且值包含非 ASCII 字符,则会自动以 " +":rfc:`2231` 格式使用 ``CHARSET`` 为 ``utf-8`` 且 ``LANGUAGE`` 为 ``None`` 对其进行编码。" + +#: ../../library/email.compat32-message.rst:405 +msgid "Here's an example::" +msgstr "以下是示例代码::" + +#: ../../library/email.compat32-message.rst:407 +msgid "" +"msg.add_header('Content-Disposition', 'attachment', filename='bud.gif')" +msgstr "" +"msg.add_header('Content-Disposition', 'attachment', filename='bud.gif')" + +#: ../../library/email.compat32-message.rst:409 +msgid "This will add a header that looks like ::" +msgstr "会添加一个形如下文的头字段 ::" + +#: ../../library/email.compat32-message.rst:411 +msgid "Content-Disposition: attachment; filename=\"bud.gif\"" +msgstr "Content-Disposition: attachment; filename=\"bud.gif\"" + +#: ../../library/email.compat32-message.rst:413 +msgid "An example with non-ASCII characters::" +msgstr "使用非 ASCII 字符的示例代码::" + +#: ../../library/email.compat32-message.rst:415 +msgid "" +"msg.add_header('Content-Disposition', 'attachment',\n" +" filename=('iso-8859-1', '', 'Fußballer.ppt'))" +msgstr "" +"msg.add_header('Content-Disposition', 'attachment',\n" +" filename=('iso-8859-1', '', 'Fußballer.ppt'))" + +#: ../../library/email.compat32-message.rst:418 +msgid "Which produces ::" +msgstr "它的输出结果为 ::" + +#: ../../library/email.compat32-message.rst:420 +msgid "Content-Disposition: attachment; filename*=\"iso-8859-1''Fu%DFballer.ppt\"" +msgstr "" +"Content-Disposition: attachment; filename*=\"iso-8859-1''Fu%DFballer.ppt\"" + +#: ../../library/email.compat32-message.rst:425 +msgid "" +"Replace a header. Replace the first header found in the message that " +"matches *_name*, retaining header order and field name case. If no matching" +" header was found, a :exc:`KeyError` is raised." +msgstr "" +"替换一个标头。将替换在匹配 *_name* 的消息中找到的第一个标头,标头顺序和字段名大小写保持不变。如果未找到匹配的标头,则会引发 " +":exc:`KeyError`." + +#: ../../library/email.compat32-message.rst:432 +msgid "" +"Return the message's content type. The returned string is coerced to lower " +"case of the form :mimetype:`maintype/subtype`. If there was no " +":mailheader:`Content-Type` header in the message the default type as given " +"by :meth:`get_default_type` will be returned. Since according to " +":rfc:`2045`, messages always have a default type, :meth:`get_content_type` " +"will always return a value." +msgstr "" +"返回消息的内容类型。返回的字符串会强制转换为 :mimetype:`maintype/subtype` 的全小写形式。如果消息中没有 " +":mailheader:`Content-Type` 标头则将返回由 :meth:`get_default_type` 给出的默认类型。因为根据 " +":rfc:`2045`,消息总是要有一个默认类型,所以 :meth:`get_content_type` 将总是返回一个值。" + +#: ../../library/email.compat32-message.rst:439 +msgid "" +":rfc:`2045` defines a message's default type to be :mimetype:`text/plain` " +"unless it appears inside a :mimetype:`multipart/digest` container, in which " +"case it would be :mimetype:`message/rfc822`. If the :mailheader:`Content-" +"Type` header has an invalid type specification, :rfc:`2045` mandates that " +"the default type be :mimetype:`text/plain`." +msgstr "" +":rfc:`2045` 将消息的默认类型定义为 :mimetype:`text/plain`,除非它是出现在 " +":mimetype:`multipart/digest` 容器内,在这种情况下其类型应为 :mimetype:`message/rfc822`。如果 " +":mailheader:`Content-Type` 标头指定了无效的类型,:rfc:`2045` 规定其默认类型应为 " +":mimetype:`text/plain`." + +#: ../../library/email.compat32-message.rst:448 +msgid "" +"Return the message's main content type. This is the :mimetype:`maintype` " +"part of the string returned by :meth:`get_content_type`." +msgstr "" +"返回信息的主要内容类型。准确来说,此方法返回的是 :meth:`get_content_type` 方法所返回的形如 " +":mimetype:`maintype/subtype` 的字符串当中的 :mimetype:`maintype` 部分。" + +#: ../../library/email.compat32-message.rst:454 +msgid "" +"Return the message's sub-content type. This is the :mimetype:`subtype` part" +" of the string returned by :meth:`get_content_type`." +msgstr "" +"返回信息的子内容类型。准确来说,此方法返回的是 :meth:`get_content_type` 方法所返回的形如 " +":mimetype:`maintype/subtype` 的字符串当中的 :mimetype:`subtype` 部分。" + +#: ../../library/email.compat32-message.rst:460 +msgid "" +"Return the default content type. Most messages have a default content type " +"of :mimetype:`text/plain`, except for messages that are subparts of " +":mimetype:`multipart/digest` containers. Such subparts have a default " +"content type of :mimetype:`message/rfc822`." +msgstr "" +"返回默认的内容类型。绝大多数的信息,其默认内容类型都是 :mimetype:`text/plain`。作为 " +":mimetype:`multipart/digest` 容器内子部分的信息除外,它们的默认内容类型是 " +":mimetype:`message/rfc822` ." + +#: ../../library/email.compat32-message.rst:468 +msgid "" +"Set the default content type. *ctype* should either be " +":mimetype:`text/plain` or :mimetype:`message/rfc822`, although this is not " +"enforced. The default content type is not stored in the " +":mailheader:`Content-Type` header." +msgstr "" +"设置默认的内容类型。 *ctype* 应当为 :mimetype:`text/plain` 或者 " +":mimetype:`message/rfc822`,尽管这并非强制。默认的内容类型不会存储在 :mailheader:`Content-Type` " +"标头中。" + +#: ../../library/email.compat32-message.rst:476 +msgid "" +"Return the message's :mailheader:`Content-Type` parameters, as a list. The " +"elements of the returned list are 2-tuples of key/value pairs, as split on " +"the ``'='`` sign. The left hand side of the ``'='`` is the key, while the " +"right hand side is the value. If there is no ``'='`` sign in the parameter " +"the value is the empty string, otherwise the value is as described in " +":meth:`get_param` and is unquoted if optional *unquote* is ``True`` (the " +"default)." +msgstr "" +"将消息的 :mailheader:`Content-Type` 形参作为列表返回。所返回列表的元素为以 ``'='`` 号拆分出的键/值对 2 元组。 " +"``'='`` 左侧的为键,右侧的为值。如果形参中没有 ``'='`` 号,则值为空字符串,否则值如 :meth:`get_param` " +"中描述并且在可选的 *unquote* 为 ``True`` (默认值) 时会被取消转义。" + +#: ../../library/email.compat32-message.rst:484 +msgid "" +"Optional *failobj* is the object to return if there is no " +":mailheader:`Content-Type` header. Optional *header* is the header to " +"search instead of :mailheader:`Content-Type`." +msgstr "" +"可选的 *failobj* 是在没有 :mailheader:`Content-Type` 标头时要返回的对象。可选的 *header* 是要替代 " +":mailheader:`Content-Type` 被搜索的标头。" + +#: ../../library/email.compat32-message.rst:488 +#: ../../library/email.compat32-message.rst:526 +msgid "" +"This is a legacy method. On the :class:`~email.message.EmailMessage` class " +"its functionality is replaced by the *params* property of the individual " +"header objects returned by the header access methods." +msgstr "" +"这是一个遗留方法。在 :class:`~email.message.EmailMessage` 类上它的功能已被标头访问方法所返回的单独标头对象的 " +"*params* 特征属性所替代。" + +#: ../../library/email.compat32-message.rst:496 +msgid "" +"Return the value of the :mailheader:`Content-Type` header's parameter " +"*param* as a string. If the message has no :mailheader:`Content-Type` " +"header or if there is no such parameter, then *failobj* is returned " +"(defaults to ``None``)." +msgstr "" +"将 :mailheader:`Content-Type` 标头的形参 *param* 作为字符串返回。 如果消息没有 " +":mailheader:`Content-Type` 标头或者没有这样的形参,则返回 *failobj* (默认为 ``None``)。" + +#: ../../library/email.compat32-message.rst:501 +msgid "" +"Optional *header* if given, specifies the message header to use instead of " +":mailheader:`Content-Type`." +msgstr "如果给出可选的 *header*,它会指定要替代 :mailheader:`Content-Type` 来使用的消息标头。" + +#: ../../library/email.compat32-message.rst:504 +msgid "" +"Parameter keys are always compared case insensitively. The return value can" +" either be a string, or a 3-tuple if the parameter was :rfc:`2231` encoded." +" When it's a 3-tuple, the elements of the value are of the form ``(CHARSET," +" LANGUAGE, VALUE)``. Note that both ``CHARSET`` and ``LANGUAGE`` can be " +"``None``, in which case you should consider ``VALUE`` to be encoded in the " +"``us-ascii`` charset. You can usually ignore ``LANGUAGE``." +msgstr "" +"形参的键总是以大小写不敏感的方式来比较的。返回值可以是一个字符串,或者如果形参以 :rfc:`2231` 编码则是一个 3 元组。当为 3 " +"元组时,值中的元素采用 ``(CHARSET, LANGUAGE, VALUE)`` 的形式。请注意 ``CHARSET`` 和 " +"``LANGUAGE`` 都可以为 ``None``,在此情况下你应当将 ``VALUE`` 当作以 ``us-ascii`` 字符集来编码。 " +"你通常可以忽略 ``LANGUAGE``。" + +#: ../../library/email.compat32-message.rst:512 +msgid "" +"If your application doesn't care whether the parameter was encoded as in " +":rfc:`2231`, you can collapse the parameter value by calling " +":func:`email.utils.collapse_rfc2231_value`, passing in the return value from" +" :meth:`get_param`. This will return a suitably decoded Unicode string when" +" the value is a tuple, or the original string unquoted if it isn't. For " +"example::" +msgstr "" +"如果你的应用不关心形参是否以 :rfc:`2231` 来编码,你可以通过调用 " +":func:`email.utils.collapse_rfc2231_value` 来展平形参值,传入来自 :meth:`get_param` " +"的返回值。当值为元组时这将返回一个经适当编码的 Unicode 字符串,否则返回未经转换的原字符串。例如::" + +#: ../../library/email.compat32-message.rst:519 +msgid "" +"rawparam = msg.get_param('foo')\n" +"param = email.utils.collapse_rfc2231_value(rawparam)" +msgstr "" +"rawparam = msg.get_param('foo')\n" +"param = email.utils.collapse_rfc2231_value(rawparam)" + +#: ../../library/email.compat32-message.rst:522 +msgid "" +"In any case, the parameter value (either the returned string, or the " +"``VALUE`` item in the 3-tuple) is always unquoted, unless *unquote* is set " +"to ``False``." +msgstr "" +"无论在哪种情况下,形参值(或为返回的字符串,或为 3 元组形式的 ``VALUE`` 条目)总是未经转换的,除非 *unquote* 被设为 " +"``False``." + +#: ../../library/email.compat32-message.rst:535 +msgid "" +"Set a parameter in the :mailheader:`Content-Type` header. If the parameter " +"already exists in the header, its value will be replaced with *value*. If " +"the :mailheader:`Content-Type` header as not yet been defined for this " +"message, it will be set to :mimetype:`text/plain` and the new parameter " +"value will be appended as per :rfc:`2045`." +msgstr "" +"在 :mailheader:`Content-Type` 标头中设置一个形参。如果该形参已存在于标头中,它的值将被替换为 *value*。 " +"如果此消息还未定义 :mailheader:`Content-Type` 标头,它将被设为 :mimetype:`text/plain` " +"且新的形参值将按 :rfc:`2045` 的要求添加。" + +#: ../../library/email.compat32-message.rst:541 +msgid "" +"Optional *header* specifies an alternative header to :mailheader:`Content-" +"Type`, and all parameters will be quoted as necessary unless optional " +"*requote* is ``False`` (the default is ``True``)." +msgstr "" +"可选的 *header* 指定一个 :mailheader:`Content-Type` 的替代标头,并且所有形参将根据需要被转换,除非可选的 " +"*requote* 为 ``False`` (默认为 ``True``)。" + +#: ../../library/email.compat32-message.rst:545 +msgid "" +"If optional *charset* is specified, the parameter will be encoded according " +"to :rfc:`2231`. Optional *language* specifies the RFC 2231 language, " +"defaulting to the empty string. Both *charset* and *language* should be " +"strings." +msgstr "" +"如果指定了可选的 *charset*,形参将按照 :rfc:`2231` 来编码。可选的 *language* 指定了 RFC 2231 " +"的语言,默认为空字符串。 *charset* 和 *language* 都应为字符串。" + +#: ../../library/email.compat32-message.rst:550 +msgid "" +"If *replace* is ``False`` (the default) the header is moved to the end of " +"the list of headers. If *replace* is ``True``, the header will be updated " +"in place." +msgstr "" +"如果 *replace* 为 ``False`` (默认值),该头字段会被移动到所有头字段列表的末尾。如果 *replace* 为 ``True`` " +",字段会被原地更新。" + +#: ../../library/email.compat32-message.rst:554 +msgid "``replace`` keyword was added." +msgstr "添加了 ``replace`` 关键字。" + +#: ../../library/email.compat32-message.rst:559 +msgid "" +"Remove the given parameter completely from the :mailheader:`Content-Type` " +"header. The header will be re-written in place without the parameter or its" +" value. All values will be quoted as necessary unless *requote* is " +"``False`` (the default is ``True``). Optional *header* specifies an " +"alternative to :mailheader:`Content-Type`." +msgstr "" +"从 :mailheader:`Content-Type` 标头中完全移除给定的形参。标头将被原地重写并不带该形参或它的值。 " +"所有的值将根据需要被转换,除非 *requote* 为 ``False`` (默认为 ``True``)。 可选的 *header* 指定 " +":mailheader:`Content-Type` 的一个替代项。" + +#: ../../library/email.compat32-message.rst:568 +msgid "" +"Set the main type and subtype for the :mailheader:`Content-Type` header. " +"*type* must be a string in the form :mimetype:`maintype/subtype`, otherwise " +"a :exc:`ValueError` is raised." +msgstr "" +"设置 :mailheader:`Content-Type` 标头的主类型和子类型。 *type* 必须为 " +":mimetype:`maintype/subtype` 形式的字符串,否则会引发 :exc:`ValueError`。" + +#: ../../library/email.compat32-message.rst:572 +msgid "" +"This method replaces the :mailheader:`Content-Type` header, keeping all the " +"parameters in place. If *requote* is ``False``, this leaves the existing " +"header's quoting as is, otherwise the parameters will be quoted (the " +"default)." +msgstr "" +"此方法可替换 :mailheader:`Content-Type` 标头,并保持所有形参不变。如果 *requote* 为 " +"``False``,这会保持原有标头引用转换不变,否则形参将被引用转换(默认行为)。" + +#: ../../library/email.compat32-message.rst:577 +msgid "" +"An alternative header can be specified in the *header* argument. When the " +":mailheader:`Content-Type` header is set a :mailheader:`MIME-Version` header" +" is also added." +msgstr "" +"可以在 *header* 参数中指定一个替代标头。当 :mailheader:`Content-Type` 标头被设置时也会添加一个 " +":mailheader:`MIME-Version` 标头。" + +#: ../../library/email.compat32-message.rst:581 +msgid "" +"This is a legacy method. On the :class:`~email.message.EmailMessage` class " +"its functionality is replaced by the ``make_`` and ``add_`` methods." +msgstr "" +"这是一个遗留方法。在 :class:`~email.message.EmailMessage` 类上它的功能已被 ``make_`` 和 " +"``add_`` 方法所替代。" + +#: ../../library/email.compat32-message.rst:588 +msgid "" +"Return the value of the ``filename`` parameter of the :mailheader:`Content-" +"Disposition` header of the message. If the header does not have a " +"``filename`` parameter, this method falls back to looking for the ``name`` " +"parameter on the :mailheader:`Content-Type` header. If neither is found, or" +" the header is missing, then *failobj* is returned. The returned string will" +" always be unquoted as per :func:`email.utils.unquote`." +msgstr "" +"返回信息头当中 :mailheader:`Content-Disposition` 字段当中名为 ``filename`` " +"的参数值。如果该字段当中没有此参数,该方法会退而寻找 :mailheader:`Content-Type` 字段当中的 ``name`` " +"参数值。如果这个也没有找到,或者这些个字段压根就不存在,返回 *failobj* 。返回的字符串永远按照 " +":func:`email.utils.unquote` 方法去除引号。" + +#: ../../library/email.compat32-message.rst:599 +msgid "" +"Return the value of the ``boundary`` parameter of the :mailheader:`Content-" +"Type` header of the message, or *failobj* if either the header is missing, " +"or has no ``boundary`` parameter. The returned string will always be " +"unquoted as per :func:`email.utils.unquote`." +msgstr "" +"返回信息头当中 :mailheader:`Content-Type` 字段当中名为 ``boundary`` " +"的参数值。如果字段当中没有此参数,或者这些个字段压根就不存在,返回 *failobj* 。返回的字符串永远按照 " +":func:`email.utils.unquote` 方法去除引号。" + +#: ../../library/email.compat32-message.rst:607 +msgid "" +"Set the ``boundary`` parameter of the :mailheader:`Content-Type` header to " +"*boundary*. :meth:`set_boundary` will always quote *boundary* if necessary." +" A :exc:`~email.errors.HeaderParseError` is raised if the message object " +"has no :mailheader:`Content-Type` header." +msgstr "" +"将 :mailheader:`Content-Type` 头字段的 ``boundary`` 参数设置为 *boundary* 。 " +":meth:`set_boundary` 方法永远都会在必要的时候为 *boundary* 添加引号。如果信息对象中没有 " +":mailheader:`Content-Type` 头字段,抛出 :exc:`~email.errors.HeaderParseError` 异常。" + +#: ../../library/email.compat32-message.rst:612 +msgid "" +"Note that using this method is subtly different than deleting the old " +":mailheader:`Content-Type` header and adding a new one with the new boundary" +" via :meth:`add_header`, because :meth:`set_boundary` preserves the order of" +" the :mailheader:`Content-Type` header in the list of headers. However, it " +"does *not* preserve any continuation lines which may have been present in " +"the original :mailheader:`Content-Type` header." +msgstr "" +"请注意使用这个方法与删除旧的 :mailheader:`Content-Type` 标头并通过 :meth:`add_header` " +"添加一个带有新边界的新标头有细微的差异,因为 :meth:`set_boundary` 会保留 :mailheader:`Content-Type` " +"标头在原标头列表中的顺序。但是,它 *不会* 保留原 :mailheader:`Content-Type` 标头中可能存在的任何连续的行。" + +#: ../../library/email.compat32-message.rst:622 +msgid "" +"Return the ``charset`` parameter of the :mailheader:`Content-Type` header, " +"coerced to lower case. If there is no :mailheader:`Content-Type` header, or" +" if that header has no ``charset`` parameter, *failobj* is returned." +msgstr "" +"返回 :mailheader:`Content-Type` 头字段中的 ``charset`` " +"参数,强制小写。如果字段当中没有此参数,或者这个字段压根不存在,返回 *failobj* 。" + +#: ../../library/email.compat32-message.rst:626 +msgid "" +"Note that this method differs from :meth:`get_charset` which returns the " +":class:`~email.charset.Charset` instance for the default encoding of the " +"message body." +msgstr "" +"请注意此方法不同于 :meth:`get_charset`,后者会返回 :class:`~email.charset.Charset` " +"实例作为消息体的默认编码格式。" + +#: ../../library/email.compat32-message.rst:632 +msgid "" +"Return a list containing the character set names in the message. If the " +"message is a :mimetype:`multipart`, then the list will contain one element " +"for each subpart in the payload, otherwise, it will be a list of length 1." +msgstr "" +"返回一个包含了信息内所有字符集名字的列表。如果信息是 :mimetype:`multipart` " +"类型的,那么列表当中的每一项都对应其载荷的子部分的字符集名字。否则,该列表是一个长度为 1 的列表。" + +#: ../../library/email.compat32-message.rst:636 +msgid "" +"Each item in the list will be a string which is the value of the ``charset``" +" parameter in the :mailheader:`Content-Type` header for the represented " +"subpart. However, if the subpart has no :mailheader:`Content-Type` header, " +"no ``charset`` parameter, or is not of the :mimetype:`text` main MIME type, " +"then that item in the returned list will be *failobj*." +msgstr "" +"列表中的每一项都是字符串,它们是其所表示的子部分的 :mailheader:`Content-Type` 标头中 ``charset`` 形参的值。 " +"但是,如果该子部分没有 :mailheader:`Content-Type` 标头,或没有 ``charset`` 形参,或者主 MIME 类型不是 " +":mimetype:`text`,则所返回列表中的对应项将为 *failobj*。" + +#: ../../library/email.compat32-message.rst:646 +msgid "" +"Return the lowercased value (without parameters) of the message's " +":mailheader:`Content-Disposition` header if it has one, or ``None``. The " +"possible values for this method are *inline*, *attachment* or ``None`` if " +"the message follows :rfc:`2183`." +msgstr "" +"如果信息的 :mailheader:`Content-Disposition` 头字段存在,返回其字段值;否则返回 ``None`` " +"。返回的值均为小写,不包含参数。如果信息遵循 :rfc:`2183` 标准,则此方法的返回值只可能在 *inline* 、 *attachment* 和" +" ``None`` 之间选择。" + +#: ../../library/email.compat32-message.rst:655 +msgid "" +"The :meth:`walk` method is an all-purpose generator which can be used to " +"iterate over all the parts and subparts of a message object tree, in depth-" +"first traversal order. You will typically use :meth:`walk` as the iterator " +"in a ``for`` loop; each iteration returns the next subpart." +msgstr "" +":meth:`walk` 方法是一个多功能生成器。它可以被用来以深度优先顺序遍历信息对象树的所有部分和子部分。一般而言, :meth:`walk` " +"会被用作 ``for`` 循环的迭代器,每一次迭代都返回其下一个子部分。" + +#: ../../library/email.compat32-message.rst:660 +msgid "" +"Here's an example that prints the MIME type of every part of a multipart " +"message structure:" +msgstr "以下例子会打印出一封具有多部分结构之信息的每个部分的 MIME 类型。" + +#: ../../library/email.compat32-message.rst:674 +msgid "" +">>> for part in msg.walk():\n" +"... print(part.get_content_type())\n" +"multipart/report\n" +"text/plain\n" +"message/delivery-status\n" +"text/plain\n" +"text/plain\n" +"message/rfc822\n" +"text/plain" +msgstr "" +">>> for part in msg.walk():\n" +"... print(part.get_content_type())\n" +"multipart/report\n" +"text/plain\n" +"message/delivery-status\n" +"text/plain\n" +"text/plain\n" +"message/rfc822\n" +"text/plain" + +#: ../../library/email.compat32-message.rst:686 +msgid "" +"``walk`` iterates over the subparts of any part where :meth:`is_multipart` " +"returns ``True``, even though ``msg.get_content_maintype() == 'multipart'`` " +"may return ``False``. We can see this in our example by making use of the " +"``_structure`` debug helper function:" +msgstr "" +"``walk`` 会遍历所有 :meth:`is_multipart` 方法返回 ``True`` 的部分之子部分,哪怕 " +"``msg.get_content_maintype() == 'multipart'`` 返回的是 ``False``。使用 " +"``_structure`` 除错帮助函数可以帮助我们在下面这个例子当中看清楚这一点:" + +#: ../../library/email.compat32-message.rst:692 +msgid "" +">>> for part in msg.walk():\n" +"... print(part.get_content_maintype() == 'multipart',\n" +"... part.is_multipart())\n" +"True True\n" +"False False\n" +"False True\n" +"False False\n" +"False False\n" +"False True\n" +"False False\n" +">>> _structure(msg)\n" +"multipart/report\n" +" text/plain\n" +" message/delivery-status\n" +" text/plain\n" +" text/plain\n" +" message/rfc822\n" +" text/plain" +msgstr "" +">>> for part in msg.walk():\n" +"... print(part.get_content_maintype() == 'multipart',\n" +"... part.is_multipart())\n" +"True True\n" +"False False\n" +"False True\n" +"False False\n" +"False False\n" +"False True\n" +"False False\n" +">>> _structure(msg)\n" +"multipart/report\n" +" text/plain\n" +" message/delivery-status\n" +" text/plain\n" +" text/plain\n" +" message/rfc822\n" +" text/plain" + +#: ../../library/email.compat32-message.rst:713 +msgid "" +"Here the ``message`` parts are not ``multiparts``, but they do contain " +"subparts. ``is_multipart()`` returns ``True`` and ``walk`` descends into the" +" subparts." +msgstr "" +"在这里,``message`` 的部分并非 ``multiparts``,但是它们真的包含子部分!``is_multipart()`` 返回 " +"``True``,``walk`` 也深入进这些子部分中。" + +#: ../../library/email.compat32-message.rst:718 +msgid "" +":class:`Message` objects can also optionally contain two instance " +"attributes, which can be used when generating the plain text of a MIME " +"message." +msgstr ":class:`Message` 对象也可以包含两个可选的实例属性,它们可被用于生成纯文本的 MIME 消息。" + +#: ../../library/email.compat32-message.rst:724 +msgid "" +"The format of a MIME document allows for some text between the blank line " +"following the headers, and the first multipart boundary string. Normally, " +"this text is never visible in a MIME-aware mail reader because it falls " +"outside the standard MIME armor. However, when viewing the raw text of the " +"message, or when viewing the message in a non-MIME aware reader, this text " +"can become visible." +msgstr "" +"MIME 文档格式在标头之后的空白行以及第一个多部分的分界字符串之间允许添加一些文本,通常,此文本在支持 MIME " +"的邮件阅读器中永远不可见,因为它处在标准 MIME 保护范围之外。但是,当查看消息的原始文本,或当在不支持 MIME " +"的阅读器中查看消息时,此文本会变得可见。" + +#: ../../library/email.compat32-message.rst:731 +msgid "" +"The *preamble* attribute contains this leading extra-armor text for MIME " +"documents. When the :class:`~email.parser.Parser` discovers some text after" +" the headers but before the first boundary string, it assigns this text to " +"the message's *preamble* attribute. When the " +":class:`~email.generator.Generator` is writing out the plain text " +"representation of a MIME message, and it finds the message has a *preamble* " +"attribute, it will write this text in the area between the headers and the " +"first boundary. See :mod:`email.parser` and :mod:`email.generator` for " +"details." +msgstr "" +"*preamble* 属性包含 MIME 文档开头部分的这些处于保护范围之外的文本。当 :class:`~email.parser.Parser` " +"在标头之后及第一个分界字符串之前发现一些文本时,它会将这些文本赋值给消息的 *preamble* 属性。当 " +":class:`~email.generator.Generator` 写出 MIME 消息的纯文本表示形式时,如果它发现消息具有 *preamble*" +" 属性,它将在标头及第一个分界之间区域写出这些文本。请参阅 :mod:`email.parser` 和 :mod:`email.generator` " +"了解更多细节。" + +#: ../../library/email.compat32-message.rst:741 +msgid "" +"Note that if the message object has no preamble, the *preamble* attribute " +"will be ``None``." +msgstr "请注意如果消息对象没有前导文本,则 *preamble* 属性将为 ``None``。" + +#: ../../library/email.compat32-message.rst:747 +msgid "" +"The *epilogue* attribute acts the same way as the *preamble* attribute, " +"except that it contains text that appears between the last boundary and the " +"end of the message." +msgstr "*epilogue* 属性的作用方式与 *preamble* 属性相同,区别在于它包含出现于最后一个分界与消息结尾之间的文本。" + +#: ../../library/email.compat32-message.rst:751 +msgid "" +"You do not need to set the epilogue to the empty string in order for the " +":class:`~email.generator.Generator` to print a newline at the end of the " +"file." +msgstr "" +"你不需要将 epilogue 设为空字符串以便让 :class:`~email.generator.Generator` 在文件末尾打印一个换行符。" + +#: ../../library/email.compat32-message.rst:758 +msgid "" +"The *defects* attribute contains a list of all the problems found when " +"parsing this message. See :mod:`email.errors` for a detailed description of" +" the possible parsing defects." +msgstr "" +"*defects* 属性包含在解析消息时发现的所有问题的列表。请参阅 :mod:`email.errors` 了解可能的解析缺陷的详细描述。" diff --git a/library/email.contentmanager.po b/library/email.contentmanager.po new file mode 100644 index 0000000000..b6c41a7ed5 --- /dev/null +++ b/library/email.contentmanager.po @@ -0,0 +1,353 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/email.contentmanager.rst:2 +msgid ":mod:`!email.contentmanager`: Managing MIME Content" +msgstr ":mod:`!email.contentmanager`: 管理 MIME 内容" + +#: ../../library/email.contentmanager.rst:10 +msgid "**Source code:** :source:`Lib/email/contentmanager.py`" +msgstr "**源代码:** :source:`Lib/email/contentmanager.py`" + +#: ../../library/email.contentmanager.rst:14 +msgid "[1]_" +msgstr "[1]_" + +#: ../../library/email.contentmanager.rst:19 +msgid "" +"Base class for content managers. Provides the standard registry mechanisms " +"to register converters between MIME content and other representations, as " +"well as the ``get_content`` and ``set_content`` dispatch methods." +msgstr "" +"内容管理器的基类。提供注册 MIME 内容和其他表示形式间转换器的标准注册机制,以及 ``get_content`` 和 ``set_content``" +" 分派方法。" + +#: ../../library/email.contentmanager.rst:26 +msgid "" +"Look up a handler function based on the ``mimetype`` of *msg* (see next " +"paragraph), call it, passing through all arguments, and return the result of" +" the call. The expectation is that the handler will extract the payload " +"from *msg* and return an object that encodes information about the extracted" +" data." +msgstr "" +"基于 *msg* 的 ``mimetype`` 查找处理函数(参见下一段),调用该函数,传递所有参数,并返回调用的结果。预期的效果是处理程序将从 " +"*msg* 中提取有效载荷并返回编码了有关被提取数据信息的对象。" + +#: ../../library/email.contentmanager.rst:32 +msgid "" +"To find the handler, look for the following keys in the registry, stopping " +"with the first one found:" +msgstr "要找到处理程序,将在注册表中查找以下键,找到第一个键即停止:" + +#: ../../library/email.contentmanager.rst:35 +msgid "the string representing the full MIME type (``maintype/subtype``)" +msgstr "表示完整 MIME 类型的字符串 (``maintype/subtype``)" + +#: ../../library/email.contentmanager.rst:36 +msgid "the string representing the ``maintype``" +msgstr "表示 ``maintype`` 的字符串" + +#: ../../library/email.contentmanager.rst:37 +msgid "the empty string" +msgstr "空字符串" + +#: ../../library/email.contentmanager.rst:39 +msgid "" +"If none of these keys produce a handler, raise a :exc:`KeyError` for the " +"full MIME type." +msgstr "如果这些键都没有产生处理程序,则为完整 MIME 类型引发一个 :exc:`KeyError`。" + +#: ../../library/email.contentmanager.rst:45 +msgid "" +"If the ``maintype`` is ``multipart``, raise a :exc:`TypeError`; otherwise " +"look up a handler function based on the type of *obj* (see next paragraph), " +"call :meth:`~email.message.EmailMessage.clear_content` on the *msg*, and " +"call the handler function, passing through all arguments. The expectation " +"is that the handler will transform and store *obj* into *msg*, possibly " +"making other changes to *msg* as well, such as adding various MIME headers " +"to encode information needed to interpret the stored data." +msgstr "" +"如果 ``maintype`` 为 ``multipart``,则引发 :exc:`TypeError`;否则基于 *obj* " +"的类型(参见下一段)查找处理函数,在 *msg* 上调用 " +":meth:`~email.message.EmailMessage.clear_content`,并调用处理函数,传递所有参数。 " +"预期的效果是处理程序将转换 *obj* 并存入 *msg*,并可能对 *msg* 进行其他更改,例如添加各种 MIME " +"标头来编码需要用来解释所存储数据的信息。" + +#: ../../library/email.contentmanager.rst:54 +msgid "" +"To find the handler, obtain the type of *obj* (``typ = type(obj)``), and " +"look for the following keys in the registry, stopping with the first one " +"found:" +msgstr "要找到处理程序,将获取 *obj* 的类型 (``typ = type(obj)``),并在注册表中查找以下键,找到第一个键即停止:" + +#: ../../library/email.contentmanager.rst:58 +msgid "the type itself (``typ``)" +msgstr "类型本身 (``typ``)" + +#: ../../library/email.contentmanager.rst:59 +msgid "" +"the type's fully qualified name (``typ.__module__ + '.' + " +"typ.__qualname__``)." +msgstr "类型的完整限定名称 (``typ.__module__ + '.' + typ.__qualname__``)。" + +#: ../../library/email.contentmanager.rst:61 +msgid "the type's :attr:`qualname ` (``typ.__qualname__``)" +msgstr "类型的 :attr:`qualname ` (``typ.__qualname__``)" + +#: ../../library/email.contentmanager.rst:62 +msgid "the type's :attr:`name ` (``typ.__name__``)." +msgstr "类型的 :attr:`name ` (``typ.__name__``)。" + +#: ../../library/email.contentmanager.rst:64 +msgid "" +"If none of the above match, repeat all of the checks above for each of the " +"types in the :term:`MRO` (:attr:`typ.__mro__ `). Finally, if " +"no other key yields a handler, check for a handler for the key ``None``. If" +" there is no handler for ``None``, raise a :exc:`KeyError` for the fully " +"qualified name of the type." +msgstr "" +"如果未匹配到上述任何一项,则为 :term:`MRO` (:attr:`typ.__mro__ `) " +"中的每个类型重复上述所有检测。最后,如果没有其他键产生处理器,则为 ``None`` 键检测处理器。如果没有 ``None`` " +"的处理器,则为该类型的完整限定名称引发 :exc:`KeyError`。" + +#: ../../library/email.contentmanager.rst:71 +msgid "" +"Also add a :mailheader:`MIME-Version` header if one is not present (see also" +" :class:`.MIMEPart`)." +msgstr "" +"并会添加一个 :mailheader:`MIME-Version` 标头,如果没有的话 (另请参见 :class:`.MIMEPart`)。" + +#: ../../library/email.contentmanager.rst:77 +msgid "" +"Record the function *handler* as the handler for *key*. For the possible " +"values of *key*, see :meth:`get_content`." +msgstr "将 *handler* 函数记录为 *key* 的处理程序。对于可能的 *key* 键,请参阅 :meth:`get_content`。" + +#: ../../library/email.contentmanager.rst:83 +msgid "" +"Record *handler* as the function to call when an object of a type matching " +"*typekey* is passed to :meth:`set_content`. For the possible values of " +"*typekey*, see :meth:`set_content`." +msgstr "" +"将 *handler* 记录为当一个匹配 *typekey* 的类型对象被传递给 :meth:`set_content` 时所要调用的函数。对于可能的 " +"*typekey* 值,请参阅 :meth:`set_content`。" + +#: ../../library/email.contentmanager.rst:89 +msgid "Content Manager Instances" +msgstr "内容管理器实例" + +#: ../../library/email.contentmanager.rst:91 +msgid "" +"Currently the email package provides only one concrete content manager, " +":data:`raw_data_manager`, although more may be added in the future. " +":data:`raw_data_manager` is the " +":attr:`~email.policy.EmailPolicy.content_manager` provided by " +":attr:`~email.policy.EmailPolicy` and its derivatives." +msgstr "" +"目前 email 包只提供了一个具体内容管理器 :data:`raw_data_manager`,不过在未来可能会添加更多。 " +":data:`raw_data_manager` 是由 :attr:`~email.policy.EmailPolicy` 及其派生类所提供的 " +":attr:`~email.policy.EmailPolicy.content_manager`." + +#: ../../library/email.contentmanager.rst:100 +msgid "" +"This content manager provides only a minimum interface beyond that provided " +"by :class:`~email.message.Message` itself: it deals only with text, raw " +"byte strings, and :class:`~email.message.Message` objects. Nevertheless, it" +" provides significant advantages compared to the base API: ``get_content`` " +"on a text part will return a unicode string without the application needing " +"to manually decode it, ``set_content`` provides a rich set of options for " +"controlling the headers added to a part and controlling the content transfer" +" encoding, and it enables the use of the various ``add_`` methods, thereby " +"simplifying the creation of multipart messages." +msgstr "" +"这个内容管理器仅提供了超出 :class:`~email.message.Message` 本身提供内容的最小接口:它只处理文本、原始字节串和 " +":class:`~email.message.Message` 对象。不过相比基础 API,它具有显著的优势:在文本部分上执行 " +"``get_content`` 将返回一个 unicode 字符串而无需由应用程序来手动解码,``set_content`` " +"为控制添加到一个部分的标头和控制内容传输编码格式提供了丰富的选项集合,并且它还启用了多种 ``add_`` 方法,从而简化了多部分消息的创建过程。" + +#: ../../library/email.contentmanager.rst:112 +msgid "" +"Return the payload of the part as either a string (for ``text`` parts), an " +":class:`~email.message.EmailMessage` object (for ``message/rfc822`` parts), " +"or a ``bytes`` object (for all other non-multipart types). Raise a " +":exc:`KeyError` if called on a ``multipart``. If the part is a ``text`` " +"part and *errors* is specified, use it as the error handler when decoding " +"the payload to unicode. The default error handler is ``replace``." +msgstr "" +"将指定部分的有效载荷作为字符串(对于 ``text`` 部分), :class:`~email.message.EmailMessage` 对象(对于 " +"``message/rfc822`` 部分)或 ``bytes`` 对象(对于所有其他非多部分类型)返回。如果是在 ``multipart`` " +"上调用则会引发 :exc:`KeyError`。如果指定部分是一个 ``text`` 部分并且指明了 *errors*,则会在将载荷解码为 " +"unicode 时将其用作错误处理程序。默认的错误处理程序是 ``replace``。" + +#: ../../library/email.contentmanager.rst:131 +msgid "Add headers and payload to *msg*:" +msgstr "向 *msg* 添加标头和有效载荷:" + +#: ../../library/email.contentmanager.rst:133 +msgid "" +"Add a :mailheader:`Content-Type` header with a ``maintype/subtype`` value." +msgstr "添加一个带有 ``maintype/subtype`` 值的 :mailheader:`Content-Type` 标头。" + +#: ../../library/email.contentmanager.rst:136 +msgid "" +"For ``str``, set the MIME ``maintype`` to ``text``, and set the subtype to " +"*subtype* if it is specified, or ``plain`` if it is not." +msgstr "" +"对于 ``str``,将 MIME ``maintype`` 设为 ``text``,如果指定了子类型 *subtype* 则设为指定值,否则设为 " +"``plain``." + +#: ../../library/email.contentmanager.rst:138 +msgid "" +"For ``bytes``, use the specified *maintype* and *subtype*, or raise a " +":exc:`TypeError` if they are not specified." +msgstr "" +"对于 ``bytes``,将使用指定的 *maintype* 和 *subtype*,如果未指定则会引发 :exc:`TypeError`。" + +#: ../../library/email.contentmanager.rst:140 +msgid "" +"For :class:`~email.message.EmailMessage` objects, set the maintype to " +"``message``, and set the subtype to *subtype* if it is specified or " +"``rfc822`` if it is not. If *subtype* is ``partial``, raise an error " +"(``bytes`` objects must be used to construct ``message/partial`` parts)." +msgstr "" +"对于 :class:`~email.message.EmailMessage` 对象,将 maintype 设为 ``message``,如果指定了 " +"*subtype* 则将 subtype 设为该值,否则设为 ``rfc822``。如果 *subtype* 为 " +"``partial``,则引发一个错误(必须使用 ``bytes`` 对象来构造 ``message/partial`` 部分)。" + +#: ../../library/email.contentmanager.rst:146 +msgid "" +"If *charset* is provided (which is valid only for ``str``), encode the " +"string to bytes using the specified character set. The default is " +"``utf-8``. If the specified *charset* is a known alias for a standard MIME " +"charset name, use the standard charset instead." +msgstr "" +"如果提供了 *charset*(这只对 ``str`` 适用),则使用指定的字符集将字符串编码为字节串。默认值为 ``utf-8``。如果指定的 " +"*charset* 是某个标准 MIME 字符集名称的已知别名,则会改用该标准字符集。" + +#: ../../library/email.contentmanager.rst:151 +msgid "" +"If *cte* is set, encode the payload using the specified content transfer " +"encoding, and set the :mailheader:`Content-Transfer-Encoding` header to that" +" value. Possible values for *cte* are ``quoted-printable``, ``base64``, " +"``7bit``, ``8bit``, and ``binary``. If the input cannot be encoded in the " +"specified encoding (for example, specifying a *cte* of ``7bit`` for an input" +" that contains non-ASCII values), raise a :exc:`ValueError`." +msgstr "" +"如果设置了 *cte*,则使用指定的内容传输编码格式对有效载荷进行编码,并将 :mailheader:`Content-Transfer-" +"Encoding` 标头设为该值。可能的 *cte* 值有 ``quoted-printable``, ``base64``, ``7bit``, " +"``8bit`` 和 ``binary``。如果输入无法以指定的编码格式被编码(例如,对于包含非 ASCII 值的输入指定 *cte* 值为 " +"``7bit``),则会引发 :exc:`ValueError`。" + +#: ../../library/email.contentmanager.rst:159 +msgid "" +"For ``str`` objects, if *cte* is not set use heuristics to determine the " +"most compact encoding. Prior to encoding, :meth:`str.splitlines` is used to" +" normalize all line boundaries, ensuring that each line of the payload is " +"terminated by the current policy's :data:`~email.policy.Policy.linesep` " +"property (even if the original string did not end with one)." +msgstr "" +"对于 ``str`` 对象,如果未设置 *cte* 则使用启发式方法来确定最紧凑的编码格式。在编码之前,将使用 " +":meth:`str.splitlines` 来正规化所有行边界,确保载荷的每一行是以当前策略的 " +":data:`~email.policy.Policy.linesep` 属性来结束的(即使原始字符串不是以它结束)。" + +#: ../../library/email.contentmanager.rst:165 +msgid "" +"For ``bytes`` objects, *cte* is taken to be base64 if not set, and the " +"aforementioned newline translation is not performed." +msgstr "对于 ``bytes`` 对象,如果未设置 *cte* 则使用 base64,并且不会执行之前提及的换行符转写。" + +#: ../../library/email.contentmanager.rst:167 +msgid "" +"For :class:`~email.message.EmailMessage`, per :rfc:`2046`, raise an error if" +" a *cte* of ``quoted-printable`` or ``base64`` is requested for *subtype* " +"``rfc822``, and for any *cte* other than ``7bit`` for *subtype* ``external-" +"body``. For ``message/rfc822``, use ``8bit`` if *cte* is not specified. " +"For all other values of *subtype*, use ``7bit``." +msgstr "" +"对于 :class:`~email.message.EmailMessage`,按照 :rfc:`2046`,如果为 *subtype* " +"``rfc822`` 请求的 *cte* 为 ``quoted-printable`` 或 ``base64``,或为 *subtype* " +"``external-body`` 请求 ``7bit`` 以外的任何 *cte*,则会引发一个错误。对于 ``message/rfc822``,如果 " +"*cte* 未指定则会使用 ``8bit``。对于所有其他 *subtype* 值,都会使用 ``7bit``。" + +#: ../../library/email.contentmanager.rst:174 +msgid "" +"A *cte* of ``binary`` does not actually work correctly yet. The " +"``EmailMessage`` object as modified by ``set_content`` is correct, but " +":class:`~email.generator.BytesGenerator` does not serialize it correctly." +msgstr "" +"*cte* 值为 ``binary`` 实际上还不能正确工作。由 ``set_content`` 所修改的 ``EmailMessage`` " +"对象是正确的,但 :class:`~email.generator.BytesGenerator` 不会正确地将其序列化。" + +#: ../../library/email.contentmanager.rst:179 +msgid "" +"If *disposition* is set, use it as the value of the :mailheader:`Content-" +"Disposition` header. If not specified, and *filename* is specified, add the" +" header with the value ``attachment``. If *disposition* is not specified and" +" *filename* is also not specified, do not add the header. The only valid " +"values for *disposition* are ``attachment`` and ``inline``." +msgstr "" +"如果设置了 *disposition*,它会被用作 :mailheader:`Content-Disposition` 标头的值。 " +"如果未设置,并且指定了 *filename*,则添加值为 ``attachment`` 的标头。如果未设置 *disposition* 并且也未指定 " +"*filename*,则不添加标头。 *disposition* 的有效值仅有 ``attachment`` 和 ``inline``。" + +#: ../../library/email.contentmanager.rst:186 +msgid "" +"If *filename* is specified, use it as the value of the ``filename`` " +"parameter of the :mailheader:`Content-Disposition` header." +msgstr "" +"如果设置了 *filename*,则将其用作 :mailheader:`Content-Disposition` 标头的 ``filename`` " +"参数的值。" + +#: ../../library/email.contentmanager.rst:189 +msgid "" +"If *cid* is specified, add a :mailheader:`Content-ID` header with *cid* as " +"its value." +msgstr "如果设置了 *cid*,则添加一个 :mailheader:`Content-ID` 标头并将其值设为 *cid*。" + +#: ../../library/email.contentmanager.rst:192 +msgid "" +"If *params* is specified, iterate its ``items`` method and use the resulting" +" ``(key, value)`` pairs to set additional parameters on the " +":mailheader:`Content-Type` header." +msgstr "" +"如果设置了 *params*,则迭代其 ``items`` 方法并使用输出的 ``(key, value)`` 结果对在 " +":mailheader:`Content-Type` 标头上设置附加参数。" + +#: ../../library/email.contentmanager.rst:196 +msgid "" +"If *headers* is specified and is a list of strings of the form ``headername:" +" headervalue`` or a list of ``header`` objects (distinguished from strings " +"by having a ``name`` attribute), add the headers to *msg*." +msgstr "" +"如果设置了 *headers* 并且为 ``headername: headervalue`` 形式的字符串的列表或为 ``header`` " +"对象的列表(通过一个 ``name`` 属性与字符串相区分),则将标头添加到 *msg*。" + +#: ../../library/email.contentmanager.rst:203 +msgid "Footnotes" +msgstr "脚注" + +#: ../../library/email.contentmanager.rst:204 +msgid "" +"Originally added in 3.4 as a :term:`provisional module `" +msgstr "最初在 3.4 中作为 :term:`暂定模块 ` 添加" diff --git a/library/email.encoders.po b/library/email.encoders.po new file mode 100644 index 0000000000..348610bfac --- /dev/null +++ b/library/email.encoders.po @@ -0,0 +1,142 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/email.encoders.rst:2 +msgid ":mod:`!email.encoders`: Encoders" +msgstr ":mod:`!email.encoders`: 编码器" + +#: ../../library/email.encoders.rst:7 +msgid "**Source code:** :source:`Lib/email/encoders.py`" +msgstr "**源代码:** :source:`Lib/email/encoders.py`" + +#: ../../library/email.encoders.rst:11 +msgid "" +"This module is part of the legacy (``Compat32``) email API. In the new API " +"the functionality is provided by the *cte* parameter of the " +":meth:`~email.message.EmailMessage.set_content` method." +msgstr "" +"此模块是旧版 (``Compat32``) email API 的组成部分。在新版 API 中将由 " +":meth:`~email.message.EmailMessage.set_content` 方法的 *cte* 形参提供该功能。" + +#: ../../library/email.encoders.rst:15 +msgid "" +"This module is deprecated in Python 3. The functions provided here should " +"not be called explicitly since the :class:`~email.mime.text.MIMEText` class " +"sets the content type and CTE header using the *_subtype* and *_charset* " +"values passed during the instantiation of that class." +msgstr "" +"此模块在 Python 3 中已弃用。这里提供的函数不应被显式地调用,因为 :class:`~email.mime.text.MIMEText` " +"类会在类实例化期间使用 *_subtype* 和 *_charset* 值来设置内容类型和 CTE 标头。" + +#: ../../library/email.encoders.rst:20 +msgid "" +"The remaining text in this section is the original documentation of the " +"module." +msgstr "本节中的其余文本是此模块的原始文档。" + +#: ../../library/email.encoders.rst:22 +msgid "" +"When creating :class:`~email.message.Message` objects from scratch, you " +"often need to encode the payloads for transport through compliant mail " +"servers. This is especially true for :mimetype:`image/\\*` and " +":mimetype:`text/\\*` type messages containing binary data." +msgstr "" +"当创建全新的 :class:`~email.message.Message` 对象时,你经常需要对载荷编码以便通过兼容的邮件服务器进行传输。 " +"对于包含二进制数据的 :mimetype:`image/\\*` 和 :mimetype:`text/\\*` 类型的消息来说尤其如此。" + +#: ../../library/email.encoders.rst:27 +msgid "" +"The :mod:`email` package provides some convenient encoders in its " +":mod:`!encoders` module. These encoders are actually used by the " +":class:`~email.mime.audio.MIMEAudio` and " +":class:`~email.mime.image.MIMEImage` class constructors to provide default " +"encodings. All encoder functions take exactly one argument, the message " +"object to encode. They usually extract the payload, encode it, and reset " +"the payload to this newly encoded value. They should also set the " +":mailheader:`Content-Transfer-Encoding` header as appropriate." +msgstr "" +":mod:`email` 包在其 :mod:`!encoders` 模块中提供了一些方便的编码器。 这些编码器实际上由 " +":class:`~email.mime.audio.MIMEAudio` 和 :class:`~email.mime.image.MIMEImage` " +"类构造器所使用以提供默认编码格式。 所有编码器函数都只接受一个参数,即要编码的消息对象。 " +"它们通常会提取有效载荷,对其进行编码,并将载荷重置为这种新编码的值。 它们还应当相应地设置 :mailheader:`Content-Transfer-" +"Encoding` 标头。" + +#: ../../library/email.encoders.rst:35 +msgid "" +"Note that these functions are not meaningful for a multipart message. They " +"must be applied to individual subparts instead, and will raise a " +":exc:`TypeError` if passed a message whose type is multipart." +msgstr "" +"请注意,这些函数对于多段消息没有意义。它们必须应用到各个单独的段上面,而不是整体。如果直接传递一个多段类型的消息,会产生一个 " +":exc:`TypeError` 错误。" + +#: ../../library/email.encoders.rst:39 +msgid "Here are the encoding functions provided:" +msgstr "下面是提供的编码函数:" + +#: ../../library/email.encoders.rst:44 +msgid "" +"Encodes the payload into quoted-printable form and sets the " +":mailheader:`Content-Transfer-Encoding` header to ``quoted-printable`` [#]_." +" This is a good encoding to use when most of your payload is normal " +"printable data, but contains a few unprintable characters." +msgstr "" +"将有效数据编码为经转换的可打印形式,并将 :mailheader:`Content-Transfer-Encoding` 标头设置为 ``quoted-" +"printable`` [#]_。当大多数实际的数据是普通的可打印数据但包含少量不可打印的字符时,这是一个很好的编码。" + +#: ../../library/email.encoders.rst:52 +msgid "" +"Encodes the payload into base64 form and sets the :mailheader:`Content-" +"Transfer-Encoding` header to ``base64``. This is a good encoding to use " +"when most of your payload is unprintable data since it is a more compact " +"form than quoted-printable. The drawback of base64 encoding is that it " +"renders the text non-human readable." +msgstr "" +"将有效载荷编码为 base64 形式,并将 :mailheader:`Content-Transfer-Encoding` 标头设为 " +"``base64``。当你的载荷主要包含不可打印数据时这是一种很好用的编码格式,因为它比 quoted-printable 更紧凑。base64 " +"编码格式的缺点是它会使文本变成人类不可读的形式。" + +#: ../../library/email.encoders.rst:61 +msgid "" +"This doesn't actually modify the message's payload, but it does set the " +":mailheader:`Content-Transfer-Encoding` header to either ``7bit`` or " +"``8bit`` as appropriate, based on the payload data." +msgstr "" +"此函数并不实际改变消息的有效载荷,但它会基于载荷数据将 :mailheader:`Content-Transfer-Encoding` 标头相应地设为 " +"``7bit`` 或 ``8bit``。" + +#: ../../library/email.encoders.rst:68 +msgid "" +"This does nothing; it doesn't even set the :mailheader:`Content-Transfer-" +"Encoding` header." +msgstr "此函数什么都不会做;它甚至不会设置 :mailheader:`Content-Transfer-Encoding` 标头。" + +#: ../../library/email.encoders.rst:72 +msgid "Footnotes" +msgstr "脚注" + +#: ../../library/email.encoders.rst:73 +msgid "" +"Note that encoding with :meth:`encode_quopri` also encodes all tabs and " +"space characters in the data." +msgstr "请注意使用 :meth:`encode_quopri` 编码格式还会对数据中的所有制表符和空格符进行编码。" diff --git a/library/email.errors.po b/library/email.errors.po new file mode 100644 index 0000000000..9c22e2bb46 --- /dev/null +++ b/library/email.errors.po @@ -0,0 +1,204 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/email.errors.rst:2 +msgid ":mod:`!email.errors`: Exception and Defect classes" +msgstr ":mod:`!email.errors`: 异常和缺陷类" + +#: ../../library/email.errors.rst:7 +msgid "**Source code:** :source:`Lib/email/errors.py`" +msgstr "**源代码:** :source:`Lib/email/errors.py`" + +#: ../../library/email.errors.rst:11 +msgid "" +"The following exception classes are defined in the :mod:`!email.errors` " +"module:" +msgstr "下列异常类是在 :mod:`!email.errors` 模块中定义的:" + +#: ../../library/email.errors.rst:16 +msgid "" +"This is the base class for all exceptions that the :mod:`email` package can " +"raise. It is derived from the standard :exc:`Exception` class and defines " +"no additional methods." +msgstr "这是 :mod:`email` 包可以引发的所有异常的基类。它源自标准异常 :exc:`Exception` 类,这个类没有定义其他方法。" + +#: ../../library/email.errors.rst:23 +msgid "" +"This is the base class for exceptions raised by the " +":class:`~email.parser.Parser` class. It is derived from " +":exc:`MessageError`. This class is also used internally by the parser used " +"by :mod:`~email.headerregistry`." +msgstr "" +"这是由 :class:`~email.parser.Parser` 类引发的异常的基类。它派生自 :exc:`MessageError`。 " +":mod:`~email.headerregistry` 使用的解析器也在内部使用这个类。" + +#: ../../library/email.errors.rst:31 +msgid "" +"Raised under some error conditions when parsing the :rfc:`5322` headers of a" +" message, this class is derived from :exc:`MessageParseError`. The " +":meth:`~email.message.EmailMessage.set_boundary` method will raise this " +"error if the content type is unknown when the method is called. " +":class:`~email.header.Header` may raise this error for certain base64 " +"decoding errors, and when an attempt is made to create a header that appears" +" to contain an embedded header (that is, there is what is supposed to be a " +"continuation line that has no leading whitespace and looks like a header)." +msgstr "" +"在解析消息的 :rfc:`5322` 标头时,某些错误条件下会触发,此类派生自 :exc:`MessageParseError`。 " +"如果在调用方法时内容类型未知,则 :meth:`~email.message.EmailMessage.set_boundary` 方法将引发此错误。 " +":class:`~email.header.Header` 可能会针对某些 base64 " +"解码错误引发此错误,以及当尝试创建一个看起来包含嵌入式标头的标头时也会引发此错误(也就是说,存在一个没有前导空格并且看起来像标头的延续行)。" + +#: ../../library/email.errors.rst:43 +msgid "Deprecated and no longer used." +msgstr "已弃用和不再使用的。" + +#: ../../library/email.errors.rst:48 +msgid "" +"Raised if the :meth:`~email.message.Message.attach` method is called on an " +"instance of a class derived from " +":class:`~email.mime.nonmultipart.MIMENonMultipart` (e.g. " +":class:`~email.mime.image.MIMEImage`). :exc:`MultipartConversionError` " +"multiply inherits from :exc:`MessageError` and the built-in " +":exc:`TypeError`." +msgstr "" +"当在派生自 :class:`~email.mime.nonmultipart.MIMENonMultipart` 的类 (例如 " +":class:`~email.mime.image.MIMEImage`) 的实例上调用 " +":meth:`~email.message.Message.attach` 方法时将被引发。 " +":exc:`MultipartConversionError` 多重继承自 :exc:`MessageError` 和内置的 " +":exc:`TypeError`。" + +#: ../../library/email.errors.rst:58 +msgid "" +"Raised when an error occurs when the :mod:`~email.generator` outputs " +"headers." +msgstr "当 :mod:`~email.generator` 输出标头发生错误时将被引发。" + +#: ../../library/email.errors.rst:64 +msgid "" +"This is the base class for all defects found when parsing email messages. It" +" is derived from :exc:`ValueError`." +msgstr "这是表示在解析邮件消息时出现的所有错误的基类。它派生自 :exc:`ValueError`。" + +#: ../../library/email.errors.rst:69 +msgid "" +"This is the base class for all defects found when parsing email headers. It " +"is derived from :exc:`MessageDefect`." +msgstr "这是表示在解析邮件标头时出现的所有错误的基类。它派生自 :exc:`MessageDefect`。" + +#: ../../library/email.errors.rst:72 +msgid "" +"Here is the list of the defects that the :class:`~email.parser.FeedParser` " +"can find while parsing messages. Note that the defects are added to the " +"message where the problem was found, so for example, if a message nested " +"inside a :mimetype:`multipart/alternative` had a malformed header, that " +"nested message object would have a defect, but the containing messages would" +" not." +msgstr "" +"以下是 :class:`~email.parser.FeedParser` 在解析消息时可发现的缺陷列表。 " +"请注意这些缺陷会在问题被发现时加入到消息中,因此举例来说,如果某条嵌套在 :mimetype:`multipart/alternative` " +"中的消息具有错误的标头,该嵌套消息对象就会有一条缺陷,但外层消息对象则没有。" + +#: ../../library/email.errors.rst:78 +msgid "" +"All defect classes are subclassed from :class:`email.errors.MessageDefect`." +msgstr "所有缺陷类都是 :class:`email.errors.MessageDefect` 的子类。" + +#: ../../library/email.errors.rst:82 +msgid "" +"A message claimed to be a multipart, but had no :mimetype:`boundary` " +"parameter." +msgstr "一条消息宣称为多部分,但却没有 :mimetype:`boundary` 参数。" + +#: ../../library/email.errors.rst:87 +msgid "" +"The start boundary claimed in the :mailheader:`Content-Type` header was " +"never found." +msgstr "在 :mailheader:`Content-Type` 标头中宣称的开始边界无法找到。" + +#: ../../library/email.errors.rst:92 +msgid "" +"A start boundary was found, but no corresponding close boundary was ever " +"found." +msgstr "找到了开始边界,但找不到对应的结束边界。" + +#: ../../library/email.errors.rst:99 +msgid "The message had a continuation line as its first header line." +msgstr "消息以一个后续行作为其第一个标头行。" + +#: ../../library/email.errors.rst:103 +msgid "A \"Unix From\" header was found in the middle of a header block." +msgstr "在标头块中间发现了一个 \"Unix From\" 标头。" + +#: ../../library/email.errors.rst:107 +msgid "" +"A line was found while parsing headers that had no leading white space but " +"contained no ':'. Parsing continues assuming that the line represents the " +"first line of the body." +msgstr "在解析没有前缀空格但又不包含 ':' 的标头期间发现一行内容。解析将假定该行代表消息体的第一行以继续执行。" + +#: ../../library/email.errors.rst:115 +msgid "" +"A header was found that was missing a colon, or was otherwise malformed." +msgstr "找到一个缺失了冒号,或者是格式错误的标头。" + +#: ../../library/email.errors.rst:117 +msgid "This defect has not been used for several Python versions." +msgstr "此缺陷在近几个 Python 版本中已不再使用。" + +#: ../../library/email.errors.rst:122 +msgid "" +"A message claimed to be a :mimetype:`multipart`, but no subparts were found." +" Note that when a message has this defect, its " +":meth:`~email.message.Message.is_multipart` method may return ``False`` even" +" though its content type claims to be :mimetype:`multipart`." +msgstr "" +"一条消息宣称为 :mimetype:`multipart`,但找不到任何子部分。请注意当一条消息有此缺陷时,其 " +":meth:`~email.message.Message.is_multipart` 方法可能返回 ``False``,即使其内容类型宣称为 " +":mimetype:`multipart`." + +#: ../../library/email.errors.rst:129 +msgid "" +"When decoding a block of base64 encoded bytes, the padding was not correct. " +"Enough padding is added to perform the decode, but the resulting decoded " +"bytes may be invalid." +msgstr "当解码一个 base64 编码的字节块时,填充的数据不正确。虽然添加了足够的填充数据以执行解码,但作为结果的已解码字节串可能无效。" + +#: ../../library/email.errors.rst:135 +msgid "" +"When decoding a block of base64 encoded bytes, characters outside the base64" +" alphabet were encountered. The characters are ignored, but the resulting " +"decoded bytes may be invalid." +msgstr "当解码一个 base64 编码的字节分块时,遇到了 base64 字符表以外的字符。这些字符会被忽略,但作为结果的已解码字节串可能无效。" + +#: ../../library/email.errors.rst:141 +msgid "" +"When decoding a block of base64 encoded bytes, the number of non-padding " +"base64 characters was invalid (1 more than a multiple of 4). The encoded " +"block was kept as-is." +msgstr "当解码一个 base64 编码的字节分块时,非填充 base64 字符的数量无效(比 4 的倍数多 1)。已编码分块会保持原样。" + +#: ../../library/email.errors.rst:147 +msgid "" +"When decoding an invalid or unparsable date field. The original value is " +"kept as-is." +msgstr "当解码一个无效或不可解析的日期字段时引发。原始值会被保持原样。" diff --git a/library/email.examples.po b/library/email.examples.po new file mode 100644 index 0000000000..9a1dfac1c1 --- /dev/null +++ b/library/email.examples.po @@ -0,0 +1,813 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/email.examples.rst:4 +msgid ":mod:`email`: Examples" +msgstr ":mod:`email`: 示例" + +#: ../../library/email.examples.rst:6 +msgid "" +"Here are a few examples of how to use the :mod:`email` package to read, " +"write, and send simple email messages, as well as more complex MIME " +"messages." +msgstr "以下是一些如何使用 :mod:`email` 包来读取、写入和发送简单电子邮件以及更复杂的 MIME 邮件的示例。" + +#: ../../library/email.examples.rst:9 +msgid "" +"First, let's see how to create and send a simple text message (both the text" +" content and the addresses may contain unicode characters):" +msgstr "首先,让我们看看如何创建和发送简单的文本消息(文本内容和地址都可能包含 unicode 字符):" + +#: ../../library/email.examples.rst:12 +msgid "" +"# Import smtplib for the actual sending function\n" +"import smtplib\n" +"\n" +"# Import the email modules we'll need\n" +"from email.message import EmailMessage\n" +"\n" +"# Open the plain text file whose name is in textfile for reading.\n" +"with open(textfile) as fp:\n" +" # Create a text/plain message\n" +" msg = EmailMessage()\n" +" msg.set_content(fp.read())\n" +"\n" +"# me == the sender's email address\n" +"# you == the recipient's email address\n" +"msg['Subject'] = f'The contents of {textfile}'\n" +"msg['From'] = me\n" +"msg['To'] = you\n" +"\n" +"# Send the message via our own SMTP server.\n" +"s = smtplib.SMTP('localhost')\n" +"s.send_message(msg)\n" +"s.quit()\n" +msgstr "" +"# 导入 smtplib 以使用实际的发送函数\n" +"import smtplib\n" +"\n" +"# 导入我们需要的 email 模块\n" +"from email.message import EmailMessage\n" +"\n" +"# 打开 textfile 中相应名称的纯文本文件供读取。\n" +"with open(textfile) as fp:\n" +" # 创建纯文本消息\n" +" msg = EmailMessage()\n" +" msg.set_content(fp.read())\n" +"\n" +"# me == 发送方 email 地址\n" +"# you == 接收方 email 地址\n" +"msg['Subject'] = f'The contents of {textfile}'\n" +"msg['From'] = me\n" +"msg['To'] = you\n" +"\n" +"# 通过我们使用的 SMTP 服务器发送消息。\n" +"s = smtplib.SMTP('localhost')\n" +"s.send_message(msg)\n" +"s.quit()\n" + +#: ../../library/email.examples.rst:15 +msgid "" +"Parsing :rfc:`822` headers can easily be done by the using the classes from " +"the :mod:`~email.parser` module:" +msgstr "解析 :rfc:`822` 标头可以通过使用 :mod:`~email.parser` 模块中的类来轻松完成:" + +#: ../../library/email.examples.rst:18 +msgid "" +"# Import the email modules we'll need\n" +"#from email.parser import BytesParser\n" +"from email.parser import Parser\n" +"from email.policy import default\n" +"\n" +"# If the e-mail headers are in a file, uncomment these two lines:\n" +"# with open(messagefile, 'rb') as fp:\n" +"# headers = BytesParser(policy=default).parse(fp)\n" +"\n" +"# Or for parsing headers in a string (this is an uncommon operation), use:\n" +"headers = Parser(policy=default).parsestr(\n" +" 'From: Foo Bar \\n'\n" +" 'To: \\n'\n" +" 'Subject: Test message\\n'\n" +" '\\n'\n" +" 'Body would go here\\n')\n" +"\n" +"# Now the header items can be accessed as a dictionary:\n" +"print('To: {}'.format(headers['to']))\n" +"print('From: {}'.format(headers['from']))\n" +"print('Subject: {}'.format(headers['subject']))\n" +"\n" +"# You can also access the parts of the addresses:\n" +"print('Recipient username: {}'.format(headers['to'].addresses[0].username))\n" +"print('Sender name: {}'.format(headers['from'].addresses[0].display_name))\n" +msgstr "" +"# 导入我们需要的 email 模块\n" +"#from email.parser import BytesParser\n" +"from email.parser import Parser\n" +"from email.policy import default\n" +"\n" +"# 如果 email 标头保存在文件中,则取消注释这两行:\n" +"# with open(messagefile, 'rb') as fp:\n" +"# headers = BytesParser(policy=default).parse(fp)\n" +"\n" +"# 或者如果要从字符串中解析标头(这是不太常见的操作),使用:\n" +"headers = Parser(policy=default).parsestr(\n" +" 'From: Foo Bar \\n'\n" +" 'To: \\n'\n" +" 'Subject: Test message\\n'\n" +" '\\n'\n" +" 'Body would go here\\n')\n" +"\n" +"# 现在标头条目将可作为字典访问:\n" +"print('To: {}'.format(headers['to']))\n" +"print('From: {}'.format(headers['from']))\n" +"print('Subject: {}'.format(headers['subject']))\n" +"\n" +"# 你也可以访问地址的各个部分:\n" +"print('Recipient username: {}'.format(headers['to'].addresses[0].username))\n" +"print('Sender name: {}'.format(headers['from'].addresses[0].display_name))\n" + +#: ../../library/email.examples.rst:21 +msgid "" +"Here's an example of how to send a MIME message containing a bunch of family" +" pictures that may be residing in a directory:" +msgstr "以下是如何发送包含可能在目录中的一系列家庭照片的 MIME 消息示例:" + +#: ../../library/email.examples.rst:24 +msgid "" +"# Import smtplib for the actual sending function.\n" +"import smtplib\n" +"\n" +"# Here are the email package modules we'll need.\n" +"from email.message import EmailMessage\n" +"\n" +"# Create the container email message.\n" +"msg = EmailMessage()\n" +"msg['Subject'] = 'Our family reunion'\n" +"# me == the sender's email address\n" +"# family = the list of all recipients' email addresses\n" +"msg['From'] = me\n" +"msg['To'] = ', '.join(family)\n" +"msg.preamble = 'You will not see this in a MIME-aware mail reader.\\n'\n" +"\n" +"# Open the files in binary mode. You can also omit the subtype\n" +"# if you want MIMEImage to guess it.\n" +"for file in pngfiles:\n" +" with open(file, 'rb') as fp:\n" +" img_data = fp.read()\n" +" msg.add_attachment(img_data, maintype='image',\n" +" subtype='png')\n" +"\n" +"# Send the email via our own SMTP server.\n" +"with smtplib.SMTP('localhost') as s:\n" +" s.send_message(msg)\n" +msgstr "" +"# 导入 smtplib 以使用实际的发送函数。\n" +"import smtplib\n" +"\n" +"# 以下是我们要用到的 email 包模块。\n" +"from email.message import EmailMessage\n" +"\n" +"# 创建容器 email 消息。\n" +"msg = EmailMessage()\n" +"msg['Subject'] = 'Our family reunion'\n" +"# me == 发送方 email 地址\n" +"# family = 所有接收方的 email 地址列表\n" +"msg['From'] = me\n" +"msg['To'] = ', '.join(family)\n" +"msg.preamble = 'You will not see this in a MIME-aware mail reader.\\n'\n" +"\n" +"# 以二进制模式打开文件。你也可以忽略子类型\n" +"# 如果你想要 MIMEImage 自动猜测的话。\n" +"for file in pngfiles:\n" +" with open(file, 'rb') as fp:\n" +" img_data = fp.read()\n" +" msg.add_attachment(img_data, maintype='image',\n" +" subtype='png')\n" +"\n" +"# 通过我们自己的 SMTP 服务器发送 email。\n" +"with smtplib.SMTP('localhost') as s:\n" +" s.send_message(msg)\n" + +#: ../../library/email.examples.rst:27 +msgid "" +"Here's an example of how to send the entire contents of a directory as an " +"email message: [1]_" +msgstr "以下是如何将目录的全部内容作为电子邮件消息发送的示例: [1]_" + +#: ../../library/email.examples.rst:30 +msgid "" +"#!/usr/bin/env python3\n" +"\n" +"\"\"\"Send the contents of a directory as a MIME message.\"\"\"\n" +"\n" +"import os\n" +"import smtplib\n" +"# For guessing MIME type based on file name extension\n" +"import mimetypes\n" +"\n" +"from argparse import ArgumentParser\n" +"\n" +"from email.message import EmailMessage\n" +"from email.policy import SMTP\n" +"\n" +"\n" +"def main():\n" +" parser = ArgumentParser(description=\"\"\"\\\n" +"Send the contents of a directory as a MIME message.\n" +"Unless the -o option is given, the email is sent by forwarding to your local\n" +"SMTP server, which then does the normal delivery process. Your local machine\n" +"must be running an SMTP server.\n" +"\"\"\")\n" +" parser.add_argument('-d', '--directory',\n" +" help=\"\"\"Mail the contents of the specified directory,\n" +" otherwise use the current directory. Only the regular\n" +" files in the directory are sent, and we don't recurse to\n" +" subdirectories.\"\"\")\n" +" parser.add_argument('-o', '--output',\n" +" metavar='FILE',\n" +" help=\"\"\"Print the composed message to FILE instead of\n" +" sending the message to the SMTP server.\"\"\")\n" +" parser.add_argument('-s', '--sender', required=True,\n" +" help='The value of the From: header (required)')\n" +" parser.add_argument('-r', '--recipient', required=True,\n" +" action='append', metavar='RECIPIENT',\n" +" default=[], dest='recipients',\n" +" help='A To: header value (at least one required)')\n" +" args = parser.parse_args()\n" +" directory = args.directory\n" +" if not directory:\n" +" directory = '.'\n" +" # Create the message\n" +" msg = EmailMessage()\n" +" msg['Subject'] = f'Contents of directory {os.path.abspath(directory)}'\n" +" msg['To'] = ', '.join(args.recipients)\n" +" msg['From'] = args.sender\n" +" msg.preamble = 'You will not see this in a MIME-aware mail reader.\\n'\n" +"\n" +" for filename in os.listdir(directory):\n" +" path = os.path.join(directory, filename)\n" +" if not os.path.isfile(path):\n" +" continue\n" +" # Guess the content type based on the file's extension. Encoding\n" +" # will be ignored, although we should check for simple things like\n" +" # gzip'd or compressed files.\n" +" ctype, encoding = mimetypes.guess_file_type(path)\n" +" if ctype is None or encoding is not None:\n" +" # No guess could be made, or the file is encoded (compressed), so\n" +" # use a generic bag-of-bits type.\n" +" ctype = 'application/octet-stream'\n" +" maintype, subtype = ctype.split('/', 1)\n" +" with open(path, 'rb') as fp:\n" +" msg.add_attachment(fp.read(),\n" +" maintype=maintype,\n" +" subtype=subtype,\n" +" filename=filename)\n" +" # Now send or store the message\n" +" if args.output:\n" +" with open(args.output, 'wb') as fp:\n" +" fp.write(msg.as_bytes(policy=SMTP))\n" +" else:\n" +" with smtplib.SMTP('localhost') as s:\n" +" s.send_message(msg)\n" +"\n" +"\n" +"if __name__ == '__main__':\n" +" main()\n" +msgstr "" +"#!/usr/bin/env python3\n" +"\n" +"\"\"\"将目录的内容作为 MIME 消息来发送。\"\"\"\n" +"\n" +"import os\n" +"import smtplib\n" +"# 用于根据文件扩展名来猜测 MIME 类型\n" +"import mimetypes\n" +"\n" +"from argparse import ArgumentParser\n" +"\n" +"from email.message import EmailMessage\n" +"from email.policy import SMTP\n" +"\n" +"\n" +"def main():\n" +" parser = ArgumentParser(description=\"\"\"\\\n" +"Send the contents of a directory as a MIME message.\n" +"Unless the -o option is given, the email is sent by forwarding to your local\n" +"SMTP server, which then does the normal delivery process. Your local machine\n" +"must be running an SMTP server.\n" +"\"\"\")\n" +" parser.add_argument('-d', '--directory',\n" +" help=\"\"\"Mail the contents of the specified directory,\n" +" otherwise use the current directory. Only the regular\n" +" files in the directory are sent, and we don't recurse to\n" +" subdirectories.\"\"\")\n" +" parser.add_argument('-o', '--output',\n" +" metavar='FILE',\n" +" help=\"\"\"Print the composed message to FILE instead of\n" +" sending the message to the SMTP server.\"\"\")\n" +" parser.add_argument('-s', '--sender', required=True,\n" +" help='The value of the From: header (required)')\n" +" parser.add_argument('-r', '--recipient', required=True,\n" +" action='append', metavar='RECIPIENT',\n" +" default=[], dest='recipients',\n" +" help='A To: header value (at least one required)')\n" +" args = parser.parse_args()\n" +" directory = args.directory\n" +" if not directory:\n" +" directory = '.'\n" +" # 创建消息\n" +" msg = EmailMessage()\n" +" msg['Subject'] = f'Contents of directory {os.path.abspath(directory)}'\n" +" msg['To'] = ', '.join(args.recipients)\n" +" msg['From'] = args.sender\n" +" msg.preamble = 'You will not see this in a MIME-aware mail reader.\\n'\n" +"\n" +" for filename in os.listdir(directory):\n" +" path = os.path.join(directory, filename)\n" +" if not os.path.isfile(path):\n" +" continue\n" +" # 根据文件扩展名来猜测内容类型。\n" +" # 编码格式将被忽略,不过我们应当检查某些简单事务\n" +" # 例如是否为 gzip 或压缩文件。\n" +" ctype, encoding = mimetypes.guess_file_type(path)\n" +" if ctype is None or encoding is not None:\n" +" # 无法猜测,或者文件已被编码(压缩),\n" +" # 因此我们使用基本的比特位数据类型。\n" +" ctype = 'application/octet-stream'\n" +" maintype, subtype = ctype.split('/', 1)\n" +" with open(path, 'rb') as fp:\n" +" msg.add_attachment(fp.read(),\n" +" maintype=maintype,\n" +" subtype=subtype,\n" +" filename=filename)\n" +" # 现在执行消息发送或存储\n" +" if args.output:\n" +" with open(args.output, 'wb') as fp:\n" +" fp.write(msg.as_bytes(policy=SMTP))\n" +" else:\n" +" with smtplib.SMTP('localhost') as s:\n" +" s.send_message(msg)\n" +"\n" +"\n" +"if __name__ == '__main__':\n" +" main()\n" + +#: ../../library/email.examples.rst:33 +msgid "" +"Here's an example of how to unpack a MIME message like the one above, into a" +" directory of files:" +msgstr "以下是如何将上述 MIME 消息解压缩到文件目录中的示例:" + +#: ../../library/email.examples.rst:36 +msgid "" +"#!/usr/bin/env python3\n" +"\n" +"\"\"\"Unpack a MIME message into a directory of files.\"\"\"\n" +"\n" +"import os\n" +"import email\n" +"import mimetypes\n" +"\n" +"from email.policy import default\n" +"\n" +"from argparse import ArgumentParser\n" +"\n" +"\n" +"def main():\n" +" parser = ArgumentParser(description=\"\"\"\\\n" +"Unpack a MIME message into a directory of files.\n" +"\"\"\")\n" +" parser.add_argument('-d', '--directory', required=True,\n" +" help=\"\"\"Unpack the MIME message into the named\n" +" directory, which will be created if it doesn't already\n" +" exist.\"\"\")\n" +" parser.add_argument('msgfile')\n" +" args = parser.parse_args()\n" +"\n" +" with open(args.msgfile, 'rb') as fp:\n" +" msg = email.message_from_binary_file(fp, policy=default)\n" +"\n" +" try:\n" +" os.mkdir(args.directory)\n" +" except FileExistsError:\n" +" pass\n" +"\n" +" counter = 1\n" +" for part in msg.walk():\n" +" # multipart/* are just containers\n" +" if part.get_content_maintype() == 'multipart':\n" +" continue\n" +" # Applications should really sanitize the given filename so that an\n" +" # email message can't be used to overwrite important files\n" +" filename = part.get_filename()\n" +" if not filename:\n" +" ext = mimetypes.guess_extension(part.get_content_type())\n" +" if not ext:\n" +" # Use a generic bag-of-bits extension\n" +" ext = '.bin'\n" +" filename = f'part-{counter:03d}{ext}'\n" +" counter += 1\n" +" with open(os.path.join(args.directory, filename), 'wb') as fp:\n" +" fp.write(part.get_payload(decode=True))\n" +"\n" +"\n" +"if __name__ == '__main__':\n" +" main()\n" +msgstr "" +"#!/usr/bin/env python3\n" +"\n" +"\"\"\"将 MIME 消息解包到一个文件目录中。\"\"\"\n" +"\n" +"import os\n" +"import email\n" +"import mimetypes\n" +"\n" +"from email.policy import default\n" +"\n" +"from argparse import ArgumentParser\n" +"\n" +"\n" +"def main():\n" +" parser = ArgumentParser(description=\"\"\"\\\n" +"Unpack a MIME message into a directory of files.\n" +"\"\"\")\n" +" parser.add_argument('-d', '--directory', required=True,\n" +" help=\"\"\"Unpack the MIME message into the named\n" +" directory, which will be created if it doesn't already\n" +" exist.\"\"\")\n" +" parser.add_argument('msgfile')\n" +" args = parser.parse_args()\n" +"\n" +" with open(args.msgfile, 'rb') as fp:\n" +" msg = email.message_from_binary_file(fp, policy=default)\n" +"\n" +" try:\n" +" os.mkdir(args.directory)\n" +" except FileExistsError:\n" +" pass\n" +"\n" +" counter = 1\n" +" for part in msg.walk():\n" +" # multipart/* 只是一些容器\n" +" if part.get_content_maintype() == 'multipart':\n" +" continue\n" +" # 应用程序真的应该对所给文件名做无害化处理\n" +" # 以保证 email 消息不能被用来覆盖重要的文件\n" +" filename = part.get_filename()\n" +" if not filename:\n" +" ext = mimetypes.guess_extension(part.get_content_type())\n" +" if not ext:\n" +" # 使用通用的比特位数据扩展名\n" +" ext = '.bin'\n" +" filename = f'part-{counter:03d}{ext}'\n" +" counter += 1\n" +" with open(os.path.join(args.directory, filename), 'wb') as fp:\n" +" fp.write(part.get_payload(decode=True))\n" +"\n" +"\n" +"if __name__ == '__main__':\n" +" main()\n" + +#: ../../library/email.examples.rst:39 +msgid "" +"Here's an example of how to create an HTML message with an alternative plain" +" text version. To make things a bit more interesting, we include a related " +"image in the html part, and we save a copy of what we are going to send to " +"disk, as well as sending it." +msgstr "" +"以下是如何使用备用纯文本版本创建 HTML 消息的示例。为了让事情变得更有趣,我们在 html " +"部分中包含了一个相关的图像,我们保存了一份我们要发送的内容到硬盘中,然后发送它。" + +#: ../../library/email.examples.rst:44 +msgid "" +"#!/usr/bin/env python3\n" +"\n" +"import smtplib\n" +"\n" +"from email.message import EmailMessage\n" +"from email.headerregistry import Address\n" +"from email.utils import make_msgid\n" +"\n" +"# Create the base text message.\n" +"msg = EmailMessage()\n" +"msg['Subject'] = \"Pourquoi pas des asperges pour ce midi ?\"\n" +"msg['From'] = Address(\"Pepé Le Pew\", \"pepe\", \"example.com\")\n" +"msg['To'] = (Address(\"Penelope Pussycat\", \"penelope\", \"example.com\"),\n" +" Address(\"Fabrette Pussycat\", \"fabrette\", \"example.com\"))\n" +"msg.set_content(\"\"\"\\\n" +"Salut!\n" +"\n" +"Cette recette [1] sera sûrement un très bon repas.\n" +"\n" +"[1] http://www.yummly.com/recipe/Roasted-Asparagus-Epicurious-203718\n" +"\n" +"--Pepé\n" +"\"\"\")\n" +"\n" +"# Add the html version. This converts the message into a multipart/alternative\n" +"# container, with the original text message as the first part and the new html\n" +"# message as the second part.\n" +"asparagus_cid = make_msgid()\n" +"msg.add_alternative(\"\"\"\\\n" +"\n" +" \n" +" \n" +"

Salut!

\n" +"

Cette\n" +" \n" +" recette\n" +" sera sûrement un très bon repas.\n" +"

\n" +" \n" +" \n" +"\n" +"\"\"\".format(asparagus_cid=asparagus_cid[1:-1]), subtype='html')\n" +"# note that we needed to peel the <> off the msgid for use in the html.\n" +"\n" +"# Now add the related image to the html part.\n" +"with open(\"roasted-asparagus.jpg\", 'rb') as img:\n" +" msg.get_payload()[1].add_related(img.read(), 'image', 'jpeg',\n" +" cid=asparagus_cid)\n" +"\n" +"# Make a local copy of what we are going to send.\n" +"with open('outgoing.msg', 'wb') as f:\n" +" f.write(bytes(msg))\n" +"\n" +"# Send the message via local SMTP server.\n" +"with smtplib.SMTP('localhost') as s:\n" +" s.send_message(msg)\n" +msgstr "" +"#!/usr/bin/env python3\n" +"\n" +"import smtplib\n" +"\n" +"from email.message import EmailMessage\n" +"from email.headerregistry import Address\n" +"from email.utils import make_msgid\n" +"\n" +"# 创建基本的文本消息。\n" +"msg = EmailMessage()\n" +"msg['Subject'] = \"Pourquoi pas des asperges pour ce midi ?\"\n" +"msg['From'] = Address(\"Pepé Le Pew\", \"pepe\", \"example.com\")\n" +"msg['To'] = (Address(\"Penelope Pussycat\", \"penelope\", \"example.com\"),\n" +" Address(\"Fabrette Pussycat\", \"fabrette\", \"example.com\"))\n" +"msg.set_content(\"\"\"\\\n" +"Salut!\n" +"\n" +"Cette recette [1] sera sûrement un très bon repas.\n" +"\n" +"[1] http://www.yummly.com/recipe/Roasted-Asparagus-Epicurious-203718\n" +"\n" +"--Pepé\n" +"\"\"\")\n" +"\n" +"# 增加 html 版本。这会将消息转换为一个 multipart/alternative 容器,\n" +"# 原始文本消息作为第一部分而新的 html 消息作为第二部分。\n" +"asparagus_cid = make_msgid()\n" +"msg.add_alternative(\"\"\"\\\n" +"\n" +" \n" +" \n" +"

Salut!

\n" +"

Cette\n" +" \n" +" recette\n" +" sera sûrement un très bon repas.\n" +"

\n" +" \n" +" \n" +"\n" +"\"\"\".format(asparagus_cid=asparagus_cid[1:-1]), subtype='html')\n" +"# 请注意我们需要将 <> 从 msgid 中去掉以便在 html 中使用。\n" +"\n" +"# 现在添加相关图像到 html 部分中。\n" +"with open(\"roasted-asparagus.jpg\", 'rb') as img:\n" +" msg.get_payload()[1].add_related(img.read(), 'image', 'jpeg',\n" +" cid=asparagus_cid)\n" +"\n" +"# 创建我们将要发送的内容的本地副本。\n" +"with open('outgoing.msg', 'wb') as f:\n" +" f.write(bytes(msg))\n" +"\n" +"# 通过本地 SMTP 服务器发送消息。\n" +"with smtplib.SMTP('localhost') as s:\n" +" s.send_message(msg)\n" + +#: ../../library/email.examples.rst:47 +msgid "" +"If we were sent the message from the last example, here is one way we could " +"process it:" +msgstr "如果我们收到了上一个示例中的消息,以下是一种处理它的方法:" + +#: ../../library/email.examples.rst:50 +msgid "" +"import os\n" +"import sys\n" +"import tempfile\n" +"import mimetypes\n" +"import webbrowser\n" +"\n" +"# Import the email modules we'll need\n" +"from email import policy\n" +"from email.parser import BytesParser\n" +"\n" +"\n" +"def magic_html_parser(html_text, partfiles):\n" +" \"\"\"Return safety-sanitized html linked to partfiles.\n" +"\n" +" Rewrite the href=\"cid:....\" attributes to point to the filenames in partfiles.\n" +" Though not trivial, this should be possible using html.parser.\n" +" \"\"\"\n" +" raise NotImplementedError(\"Add the magic needed\")\n" +"\n" +"\n" +"# In a real program you'd get the filename from the arguments.\n" +"with open('outgoing.msg', 'rb') as fp:\n" +" msg = BytesParser(policy=policy.default).parse(fp)\n" +"\n" +"# Now the header items can be accessed as a dictionary, and any non-ASCII will\n" +"# be converted to unicode:\n" +"print('To:', msg['to'])\n" +"print('From:', msg['from'])\n" +"print('Subject:', msg['subject'])\n" +"\n" +"# If we want to print a preview of the message content, we can extract whatever\n" +"# the least formatted payload is and print the first three lines. Of course,\n" +"# if the message has no plain text part printing the first three lines of html\n" +"# is probably useless, but this is just a conceptual example.\n" +"simplest = msg.get_body(preferencelist=('plain', 'html'))\n" +"print()\n" +"print(''.join(simplest.get_content().splitlines(keepends=True)[:3]))\n" +"\n" +"ans = input(\"View full message?\")\n" +"if ans.lower()[0] == 'n':\n" +" sys.exit()\n" +"\n" +"# We can extract the richest alternative in order to display it:\n" +"richest = msg.get_body()\n" +"partfiles = {}\n" +"if richest['content-type'].maintype == 'text':\n" +" if richest['content-type'].subtype == 'plain':\n" +" for line in richest.get_content().splitlines():\n" +" print(line)\n" +" sys.exit()\n" +" elif richest['content-type'].subtype == 'html':\n" +" body = richest\n" +" else:\n" +" print(\"Don't know how to display {}\".format(richest.get_content_type()))\n" +" sys.exit()\n" +"elif richest['content-type'].content_type == 'multipart/related':\n" +" body = richest.get_body(preferencelist=('html'))\n" +" for part in richest.iter_attachments():\n" +" fn = part.get_filename()\n" +" if fn:\n" +" extension = os.path.splitext(part.get_filename())[1]\n" +" else:\n" +" extension = mimetypes.guess_extension(part.get_content_type())\n" +" with tempfile.NamedTemporaryFile(suffix=extension, delete=False) as f:\n" +" f.write(part.get_content())\n" +" # again strip the <> to go from email form of cid to html form.\n" +" partfiles[part['content-id'][1:-1]] = f.name\n" +"else:\n" +" print(\"Don't know how to display {}\".format(richest.get_content_type()))\n" +" sys.exit()\n" +"with tempfile.NamedTemporaryFile(mode='w', delete=False) as f:\n" +" f.write(magic_html_parser(body.get_content(), partfiles))\n" +"webbrowser.open(f.name)\n" +"os.remove(f.name)\n" +"for fn in partfiles.values():\n" +" os.remove(fn)\n" +"\n" +"# Of course, there are lots of email messages that could break this simple\n" +"# minded program, but it will handle the most common ones.\n" +msgstr "" +"import os\n" +"import sys\n" +"import tempfile\n" +"import mimetypes\n" +"import webbrowser\n" +"\n" +"# 导入我们需要的 email 模块\n" +"from email import policy\n" +"from email.parser import BytesParser\n" +"\n" +"\n" +"def magic_html_parser(html_text, partfiles):\n" +" \"\"\"返回链接到 partfiles 的经安全性处理的 html。\n" +"\n" +" 重写 href=\"cid:....\" 属性以指向 partfiles 中的文件名。\n" +" 虽然并非琐碎,这应可使用 html.parser 来实现。\n" +" \"\"\"\n" +" raise NotImplementedError(\"Add the magic needed\")\n" +"\n" +"\n" +"# 在真正的程序中你将从参数中获得文件名。\n" +"with open('outgoing.msg', 'rb') as fp:\n" +" msg = BytesParser(policy=policy.default).parse(fp)\n" +"\n" +"# 现在可通过字典形式访问标头条目,并且任何非 ASCII 内容\n" +"# 都将被转换为 unicode:\n" +"print('To:', msg['to'])\n" +"print('From:', msg['from'])\n" +"print('Subject:', msg['subject'])\n" +"\n" +"# 如果我们想要打印消息内容的预览,可以提取\n" +"# 未经格式化的载荷并打印其中前三行。当然,\n" +"# 如果消息没有纯文本部分则打印 html 的前三行\n" +"# 可能是无用的,但这只是个概念性的示例。\n" +"simplest = msg.get_body(preferencelist=('plain', 'html'))\n" +"print()\n" +"print(''.join(simplest.get_content().splitlines(keepends=True)[:3]))\n" +"\n" +"ans = input(\"View full message?\")\n" +"if ans.lower()[0] == 'n':\n" +" sys.exit()\n" +"\n" +"# 我们可以提取最丰富的替代项用于显示:\n" +"richest = msg.get_body()\n" +"partfiles = {}\n" +"if richest['content-type'].maintype == 'text':\n" +" if richest['content-type'].subtype == 'plain':\n" +" for line in richest.get_content().splitlines():\n" +" print(line)\n" +" sys.exit()\n" +" elif richest['content-type'].subtype == 'html':\n" +" body = richest\n" +" else:\n" +" print(\"Don't know how to display {}\".format(richest.get_content_type()))\n" +" sys.exit()\n" +"elif richest['content-type'].content_type == 'multipart/related':\n" +" body = richest.get_body(preferencelist=('html'))\n" +" for part in richest.iter_attachments():\n" +" fn = part.get_filename()\n" +" if fn:\n" +" extension = os.path.splitext(part.get_filename())[1]\n" +" else:\n" +" extension = mimetypes.guess_extension(part.get_content_type())\n" +" with tempfile.NamedTemporaryFile(suffix=extension, delete=False) as f:\n" +" f.write(part.get_content())\n" +" # 再次去除 <> 以将 cid 的 email 形式转为 html 形式。\n" +" partfiles[part['content-id'][1:-1]] = f.name\n" +"else:\n" +" print(\"Don't know how to display {}\".format(richest.get_content_type()))\n" +" sys.exit()\n" +"with tempfile.NamedTemporaryFile(mode='w', delete=False) as f:\n" +" f.write(magic_html_parser(body.get_content(), partfiles))\n" +"webbrowser.open(f.name)\n" +"os.remove(f.name)\n" +"for fn in partfiles.values():\n" +" os.remove(fn)\n" +"\n" +"# 当然,许多 email 消息都有可能破坏这个简单的程序,\n" +"# 但它将能处理最普通的消息。\n" + +#: ../../library/email.examples.rst:52 +msgid "Up to the prompt, the output from the above is:" +msgstr "在提示符之前,以上代码的输出为:" + +#: ../../library/email.examples.rst:54 +msgid "" +"To: Penelope Pussycat , Fabrette Pussycat \n" +"From: Pepé Le Pew \n" +"Subject: Pourquoi pas des asperges pour ce midi ?\n" +"\n" +"Salut!\n" +"\n" +"Cette recette [1] sera sûrement un très bon repas." +msgstr "" +"To: Penelope Pussycat , Fabrette Pussycat \n" +"From: Pepé Le Pew \n" +"Subject: Pourquoi pas des asperges pour ce midi ?\n" +"\n" +"Salut!\n" +"\n" +"Cette recette [1] sera sûrement un très bon repas." + +#: ../../library/email.examples.rst:66 +msgid "Footnotes" +msgstr "脚注" + +#: ../../library/email.examples.rst:67 +msgid "" +"Thanks to Matthew Dixon Cowles for the original inspiration and examples." +msgstr "感谢 Matthew Dixon Cowles 提供最初的灵感和示例。" diff --git a/library/email.generator.po b/library/email.generator.po new file mode 100644 index 0000000000..25031ca55e --- /dev/null +++ b/library/email.generator.po @@ -0,0 +1,413 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/email.generator.rst:2 +msgid ":mod:`!email.generator`: Generating MIME documents" +msgstr ":mod:`!email.generator`: 生成 MIME 文档" + +#: ../../library/email.generator.rst:7 +msgid "**Source code:** :source:`Lib/email/generator.py`" +msgstr "**源代码:** :source:`Lib/email/generator.py`" + +#: ../../library/email.generator.rst:11 +msgid "" +"One of the most common tasks is to generate the flat (serialized) version of" +" the email message represented by a message object structure. You will need" +" to do this if you want to send your message via " +":meth:`smtplib.SMTP.sendmail`, or print the message on the console. Taking " +"a message object structure and producing a serialized representation is the " +"job of the generator classes." +msgstr "" +"最常见的任务之一是生成由消息对象结构体表示的电子邮件消息的展平(序列化)版本。如果你想通过 :meth:`smtplib.SMTP.sendmail` " +"来发送你的消息或是将消息打印到控制台就会需要这样做。接受一个消息对象结构体并生成其序列化表示就是这些生成器类的工作。" + +#: ../../library/email.generator.rst:18 +msgid "" +"As with the :mod:`email.parser` module, you aren't limited to the " +"functionality of the bundled generator; you could write one from scratch " +"yourself. However the bundled generator knows how to generate most email in" +" a standards-compliant way, should handle MIME and non-MIME email messages " +"just fine, and is designed so that the bytes-oriented parsing and generation" +" operations are inverses, assuming the same non-transforming " +":mod:`~email.policy` is used for both. That is, parsing the serialized byte" +" stream via the :class:`~email.parser.BytesParser` class and then " +"regenerating the serialized byte stream using :class:`BytesGenerator` should" +" produce output identical to the input [#]_. (On the other hand, using the " +"generator on an :class:`~email.message.EmailMessage` constructed by program " +"may result in changes to the :class:`~email.message.EmailMessage` object as " +"defaults are filled in.)" +msgstr "" +"与 :mod:`email.parser` 模块一样,你并不会受限于已捆绑生成器的功能;你可以自己从头写一个。 " +"不过,已捆绑生成器知道如何以符合标准的方式来生成大多数电子邮件,应该能够很好地处理 MIME 和非 MIME " +"电子邮件消息,并且被设计为面向字节的解析和生成操作是互逆的,它假定两者都使用同样的非转换型 :mod:`~email.policy`。也就是说,通过 " +":class:`~email.parser.BytesParser` 类来解析序列化字节流然后再使用 :class:`BytesGenerator` " +"来重新生成序列化字节流应当得到与输入相同的结果 [#]_。 (而另一方面,在由程序所构造的 " +":class:`~email.message.EmailMessage` 上使用生成器可能导致对默认填入的 " +":class:`~email.message.EmailMessage` 对象的改变。)" + +#: ../../library/email.generator.rst:32 +msgid "" +"The :class:`Generator` class can be used to flatten a message into a text " +"(as opposed to binary) serialized representation, but since Unicode cannot " +"represent binary data directly, the message is of necessity transformed into" +" something that contains only ASCII characters, using the standard email RFC" +" Content Transfer Encoding techniques for encoding email messages for " +"transport over channels that are not \"8 bit clean\"." +msgstr "" +"可以使用 :class:`Generator` 类将消息扁平化为文本(而非二进制数据)的序列化表示形式,但是由于 Unicode " +"无法直接表示二进制数据,因此消息有必要被转换为仅包含 ASCII 字符的数据,这将使用标准电子邮件 RFC " +"内容传输编码格式技术来编码电子邮件消息以便通过非“8 比特位兼容”的信道来传输。" + +#: ../../library/email.generator.rst:39 +msgid "" +"To accommodate reproducible processing of SMIME-signed messages " +":class:`Generator` disables header folding for message parts of type " +"``multipart/signed`` and all subparts." +msgstr "" +"为了适应 SMIME 签名消息的可重现处理过程,:class:`Generator` 禁用了针对 ``multipart/signed`` " +"类型的消息部分及所有子部分的标头折叠。" + +#: ../../library/email.generator.rst:47 +msgid "" +"Return a :class:`BytesGenerator` object that will write any message provided" +" to the :meth:`flatten` method, or any surrogateescape encoded text provided" +" to the :meth:`write` method, to the :term:`file-like object` *outfp*. " +"*outfp* must support a ``write`` method that accepts binary data." +msgstr "" +"返回一个 :class:`BytesGenerator` 对象,该对象将把提供给 :meth:`flatten` 方法的任何消息或者提供给 " +":meth:`write` 方法的任何经过代理转义编码的文本写入到 :term:`file-like object` *outfp*。 *outfp* " +"必须支持接受二进制数据的 ``write`` 方法。" + +#: ../../library/email.generator.rst:52 ../../library/email.generator.rst:153 +msgid "" +"If optional *mangle_from_* is ``True``, put a ``>`` character in front of " +"any line in the body that starts with the exact string ``\"From \"``, that " +"is ``From`` followed by a space at the beginning of a line. *mangle_from_* " +"defaults to the value of the :attr:`~email.policy.Policy.mangle_from_` " +"setting of the *policy* (which is ``True`` for the " +":data:`~email.policy.compat32` policy and ``False`` for all others). " +"*mangle_from_* is intended for use when messages are stored in Unix mbox " +"format (see :mod:`mailbox` and `WHY THE CONTENT-LENGTH FORMAT IS BAD " +"`_)." +msgstr "" +"如果可选的 *mangle_from_* 为 ``True``,则会将一个 ``>`` 字符放到消息体中恰好以字符串 ``\"From \"`` " +"打头,即开头文本为 ``From`` 加一个空格的任何行的前面。 *mangle_from_* 默认为 *policy* 的 " +":attr:`~email.policy.Policy.mangle_from_` 设置值 (对于 " +":data:`~email.policy.compat32` 策略为 ``True`` 而对于所有其他策略则为 ``False``)。 " +"*mangle_from_* 被设计为在当消息以 Unix mbox 格式存储时使用 (参见 :mod:`mailbox` 和 `WHY THE " +"CONTENT-LENGTH FORMAT IS BAD `_)." + +#: ../../library/email.generator.rst:62 ../../library/email.generator.rst:163 +msgid "" +"If *maxheaderlen* is not ``None``, refold any header lines that are longer " +"than *maxheaderlen*, or if ``0``, do not rewrap any headers. If " +"*manheaderlen* is ``None`` (the default), wrap headers and other message " +"lines according to the *policy* settings." +msgstr "" +"如果 *maxheaderlen* 不为 ``None``,则重新折叠任何长于 *maxheaderlen* 的标头行,或者如果为 " +"``0``,则不重新包装任何标头。 如果 *manheaderlen* 为 ``None`` (默认值),则根据 *policy* " +"设置包装标头和其他消息行。" + +#: ../../library/email.generator.rst:67 ../../library/email.generator.rst:168 +msgid "" +"If *policy* is specified, use that policy to control message generation. If" +" *policy* is ``None`` (the default), use the policy associated with the " +":class:`~email.message.Message` or :class:`~email.message.EmailMessage` " +"object passed to ``flatten`` to control the message generation. See " +":mod:`email.policy` for details on what *policy* controls." +msgstr "" +"如果指定了 *policy*,则使用该策略来控制消息的生成。如果 *policy* 为 ``None`` (默认值),则使用与传递给 " +"``flatten`` 的 :class:`~email.message.Message` 或 " +":class:`~email.message.EmailMessage` 对象相关联的策略来控制消息的生成。 请参阅 " +":mod:`email.policy` 了解有关 *policy* 所控制内容的详情。" + +#: ../../library/email.generator.rst:75 ../../library/email.generator.rst:174 +msgid "Added the *policy* keyword." +msgstr "添加了 *policy* 关键字。" + +#: ../../library/email.generator.rst:77 ../../library/email.generator.rst:176 +msgid "" +"The default behavior of the *mangle_from_* and *maxheaderlen* parameters is " +"to follow the policy." +msgstr "*mangle_from_* 和 *maxheaderlen* 形参的默认行为是遵循策略。" + +#: ../../library/email.generator.rst:83 +msgid "" +"Print the textual representation of the message object structure rooted at " +"*msg* to the output file specified when the :class:`BytesGenerator` instance" +" was created." +msgstr "将以 *msg* 为根的消息对象结构体的文本表示形式打印到创建 :class:`BytesGenerator` 实例时指定的输出文件。" + +#: ../../library/email.generator.rst:87 +msgid "" +"If the :mod:`~email.policy` option :attr:`~email.policy.Policy.cte_type` is " +"``8bit`` (the default), copy any headers in the original parsed message that" +" have not been modified to the output with any bytes with the high bit set " +"reproduced as in the original, and preserve the non-ASCII " +":mailheader:`Content-Transfer-Encoding` of any body parts that have them. If" +" ``cte_type`` is ``7bit``, convert the bytes with the high bit set as needed" +" using an ASCII-compatible :mailheader:`Content-Transfer-Encoding`. That is," +" transform parts with non-ASCII :mailheader:`Content-Transfer-Encoding` " +"(:mailheader:`Content-Transfer-Encoding: 8bit`) to an ASCII compatible " +":mailheader:`Content-Transfer-Encoding`, and encode RFC-invalid non-ASCII " +"bytes in headers using the MIME ``unknown-8bit`` character set, thus " +"rendering them RFC-compliant." +msgstr "" +"如果 :mod:`~email.policy` 选项 :attr:`~email.policy.Policy.cte_type` 为 ``8bit`` " +"(默认值),则会将未被修改的原始已解析消息中的任何标头拷贝到输出,其中会重新生成与原始数据相同的高比特位组字节数据,并保留具有它们的任何消息体部分的非 " +"ASCII :mailheader:`Content-Transfer-Encoding`。如果 ``cte_type`` 为 " +"``7bit``,则会根据需要使用兼容 ASCII 的 :mailheader:`Content-Transfer-Encoding` " +"来转换高比特位组字节数据。也就是说,将具有非 ASCII :mailheader:`Content-Transfer-Encoding` " +"(:mailheader:`Content-Transfer-Encoding: 8bit`) 的部分转换为兼容 ASCII 的 " +":mailheader:`Content-Transfer-Encoding`,并使用 MIME ``unknown-8bit`` " +"字符集来编码标头中不符合 RFC 的非 ASCII 字节数据,以使其符合 RFC。" + +#: ../../library/email.generator.rst:104 ../../library/email.generator.rst:197 +msgid "" +"If *unixfrom* is ``True``, print the envelope header delimiter used by the " +"Unix mailbox format (see :mod:`mailbox`) before the first of the :rfc:`5322`" +" headers of the root message object. If the root object has no envelope " +"header, craft a standard one. The default is ``False``. Note that for " +"subparts, no envelope header is ever printed." +msgstr "" +"如果 *unixfrom* 为 ``True``,则会在根消息对象的第一个 :rfc:`5322` 标头之前打印 Unix mailbox 格式 (参见" +" :mod:`mailbox`) 所使用的封包标头分隔符。 如果根对象没有封包标头,则会创建一个标准标头。 默认值为 ``False``。 " +"请注意对于子部分来说,不会打印任何封包标头。" + +#: ../../library/email.generator.rst:110 ../../library/email.generator.rst:203 +msgid "" +"If *linesep* is not ``None``, use it as the separator character between all " +"the lines of the flattened message. If *linesep* is ``None`` (the default)," +" use the value specified in the *policy*." +msgstr "" +"如果 *linesep* 不为 ``None``,则会将其用作扁平化消息的所有行之间的分隔符。如果 *linesep* 为 ``None`` " +"(默认值),则使用在 *policy* 中指定的值。" + +#: ../../library/email.generator.rst:119 +msgid "" +"Return an independent clone of this :class:`BytesGenerator` instance with " +"the exact same option settings, and *fp* as the new *outfp*." +msgstr "返回此 :class:`BytesGenerator` 实例的独立克隆,具有完全相同的选项设置,而 *fp* 为新的 *outfp*。" + +#: ../../library/email.generator.rst:125 +msgid "" +"Encode *s* using the ``ASCII`` codec and the ``surrogateescape`` error " +"handler, and pass it to the *write* method of the *outfp* passed to the " +":class:`BytesGenerator`'s constructor." +msgstr "" +"使用 ``ASCII`` 编解码器和 ``surrogateescape`` 错误处理程序编码 *s*,并将其传递给传入到 " +":class:`BytesGenerator` 的构造器的 *outfp* 的 *write* 方法。" + +#: ../../library/email.generator.rst:130 +msgid "" +"As a convenience, :class:`~email.message.EmailMessage` provides the methods " +":meth:`~email.message.EmailMessage.as_bytes` and ``bytes(aMessage)`` (a.k.a." +" :meth:`~email.message.EmailMessage.__bytes__`), which simplify the " +"generation of a serialized binary representation of a message object. For " +"more detail, see :mod:`email.message`." +msgstr "" +"作为一个便捷工具,:class:`~email.message.EmailMessage` 提供了 " +":meth:`~email.message.EmailMessage.as_bytes` 和 ``bytes(aMessage)`` (即 " +":meth:`~email.message.EmailMessage.__bytes__`) 等方法,它们简化了消息对象的序列化二进制表示形式的生成。 " +"更多细节请参阅 :mod:`email.message`。" + +#: ../../library/email.generator.rst:137 +msgid "" +"Because strings cannot represent binary data, the :class:`Generator` class " +"must convert any binary data in any message it flattens to an ASCII " +"compatible format, by converting them to an ASCII compatible " +":mailheader:`Content-Transfer_Encoding`. Using the terminology of the email" +" RFCs, you can think of this as :class:`Generator` serializing to an I/O " +"stream that is not \"8 bit clean\". In other words, most applications will " +"want to be using :class:`BytesGenerator`, and not :class:`Generator`." +msgstr "" +"因为字符串无法表示二进制数据,:class:`Generator` 类必须将任何消息中扁平化的任何二进制数据转换为兼容 ASCII " +"的格式,具体将其转换为兼容 ASCII 的 :mailheader:`Content-Transfer_Encoding`。 使用电子邮件 RFC " +"的术语,你可以将其视作 :class:`Generator` 序列化为不 \"支持 8 比特\" 的 I/O 流。 换句话说,大部分应用程序将需要使用 " +":class:`BytesGenerator`,而非 :class:`Generator`。" + +#: ../../library/email.generator.rst:148 +msgid "" +"Return a :class:`Generator` object that will write any message provided to " +"the :meth:`flatten` method, or any text provided to the :meth:`write` " +"method, to the :term:`file-like object` *outfp*. *outfp* must support a " +"``write`` method that accepts string data." +msgstr "" +"返回一个 :class:`Generator`,它将把提供给 :meth:`flatten` 方法的任何消息,或者提供给 :meth:`write` " +"方法的任何文本写入到 :term:`file-like object` *outfp*。 *outfp* 必须支持接受字符串数据的 ``write`` " +"方法。" + +#: ../../library/email.generator.rst:182 +msgid "" +"Print the textual representation of the message object structure rooted at " +"*msg* to the output file specified when the :class:`Generator` instance was " +"created." +msgstr "将以 *msg* 为根的消息对象结构体的文本表示形式打印到当 :class:`Generator` 实例被创建时所指定的输出文件。" + +#: ../../library/email.generator.rst:186 +msgid "" +"If the :mod:`~email.policy` option :attr:`~email.policy.Policy.cte_type` is " +"``8bit``, generate the message as if the option were set to ``7bit``. (This " +"is required because strings cannot represent non-ASCII bytes.) Convert any " +"bytes with the high bit set as needed using an ASCII-compatible " +":mailheader:`Content-Transfer-Encoding`. That is, transform parts with non-" +"ASCII :mailheader:`Content-Transfer-Encoding` (:mailheader:`Content-" +"Transfer-Encoding: 8bit`) to an ASCII compatible :mailheader:`Content-" +"Transfer-Encoding`, and encode RFC-invalid non-ASCII bytes in headers using " +"the MIME ``unknown-8bit`` character set, thus rendering them RFC-compliant." +msgstr "" +"如果 :mod:`~email.policy` 选项 :attr:`~email.policy.Policy.cte_type` 为 " +"``8bit``,则视同选项被设为 ``7bit`` 来生成消息。 (这是必需的,因为字符串无法表示非 ASCII 字节数据。)将使用兼容 ASCII " +"的 :mailheader:`Content-Transfer-Encoding` 按需转换任何具有高比特位组的字节数据。也就是说,将具有非 ASCII" +" :mailheader:`Content-Transfer-Encoding` (:mailheader:`Content-Transfer-" +"Encoding: 8bit`) 的部分转换为兼容 ASCII 的 :mailheader:`Content-Transfer-" +"Encoding`,并使用 MIME ``unknown-8bit`` 字符集来编码标头中不符合 RFC 的非 ASCII 字节数据,以使其符合 " +"RFC." + +#: ../../library/email.generator.rst:209 +msgid "" +"Added support for re-encoding ``8bit`` message bodies, and the *linesep* " +"argument." +msgstr "添加了对重编码 ``8bit`` 消息体的支持,以及 *linesep* 参数。" + +#: ../../library/email.generator.rst:216 +msgid "" +"Return an independent clone of this :class:`Generator` instance with the " +"exact same options, and *fp* as the new *outfp*." +msgstr "返回此 :class:`Generator` 实例的独立克隆,具有完全相同的选项设置,而 *fp* 为新的 *outfp*。" + +#: ../../library/email.generator.rst:222 +msgid "" +"Write *s* to the *write* method of the *outfp* passed to the " +":class:`Generator`'s constructor. This provides just enough file-like API " +"for :class:`Generator` instances to be used in the :func:`print` function." +msgstr "" +"将 *s* 写入到传给 :class:`Generator` 的构造器的 *outfp* 的 *write* 方法。这为 " +":class:`Generator` 实例提供了刚好足够可用于 :func:`print` 函数的文件类 API。" + +#: ../../library/email.generator.rst:228 +msgid "" +"As a convenience, :class:`~email.message.EmailMessage` provides the methods " +":meth:`~email.message.EmailMessage.as_string` and ``str(aMessage)`` (a.k.a. " +":meth:`~email.message.EmailMessage.__str__`), which simplify the generation " +"of a formatted string representation of a message object. For more detail, " +"see :mod:`email.message`." +msgstr "" +"作为一个便捷工具,:class:`~email.message.EmailMessage` 提供了 " +":meth:`~email.message.EmailMessage.as_string` 和 ``str(aMessage)`` (即 " +":meth:`~email.message.EmailMessage.__str__`) 等方法,它们简化了消息对象的已格式化字符串表示形式的生成。 " +"更多细节请参阅 :mod:`email.message`。" + +#: ../../library/email.generator.rst:235 +msgid "" +"The :mod:`!email.generator` module also provides a derived class, " +":class:`DecodedGenerator`, which is like the :class:`Generator` base class, " +"except that non-\\ :mimetype:`text` parts are not serialized, but are " +"instead represented in the output stream by a string derived from a template" +" filled in with information about the part." +msgstr "" +":mod:`!email.generator` 模块还提供了一个派生类 :class:`DecodedGenerator`,它类似于 " +":class:`Generator` 基类,不同之处在于非 :mimetype:`text` 部分不会被序列化,而是被表示为 " +"基于模板并填写了有关该部分的信息的字符串输出流的形式。" + +#: ../../library/email.generator.rst:244 +msgid "" +"Act like :class:`Generator`, except that for any subpart of the message " +"passed to :meth:`Generator.flatten`, if the subpart is of main type " +":mimetype:`text`, print the decoded payload of the subpart, and if the main " +"type is not :mimetype:`text`, instead of printing it fill in the string " +"*fmt* using information from the part and print the resulting filled-in " +"string." +msgstr "" +"行为类似于 :class:`Generator`,不同之处在于对传给 :meth:`Generator.flatten` " +"的消息的任何子部分,如果该子部分的主类型为 :mimetype:`text`,则打印该子部分的已解码载荷,而如果其主类型不为 " +":mimetype:`text`,则不直接打印它而是使用来自该部分的信息填入字符串 *fmt* 并将填写完成的字符串打印出来。" + +#: ../../library/email.generator.rst:251 +msgid "" +"To fill in *fmt*, execute ``fmt % part_info``, where ``part_info`` is a " +"dictionary composed of the following keys and values:" +msgstr "要填入 *fmt*,则执行 ``fmt % part_info``,其中 ``part_info`` 是由下列键和值组成的字典:" + +#: ../../library/email.generator.rst:254 +msgid "``type`` -- Full MIME type of the non-\\ :mimetype:`text` part" +msgstr "``type`` -- 非 :mimetype:`text` 部分的完整 MIME 类型" + +#: ../../library/email.generator.rst:256 +msgid "``maintype`` -- Main MIME type of the non-\\ :mimetype:`text` part" +msgstr "``maintype`` -- 非 :mimetype:`text` 部分的主 MIME 类型" + +#: ../../library/email.generator.rst:258 +msgid "``subtype`` -- Sub-MIME type of the non-\\ :mimetype:`text` part" +msgstr "``subtype`` -- 非 :mimetype:`text` 部分的子 MIME 类型" + +#: ../../library/email.generator.rst:260 +msgid "``filename`` -- Filename of the non-\\ :mimetype:`text` part" +msgstr "``filename`` -- 非 :mimetype:`text` 部分的文件名" + +#: ../../library/email.generator.rst:262 +msgid "" +"``description`` -- Description associated with the non-\\ :mimetype:`text` " +"part" +msgstr "``description`` -- 与非 :mimetype:`text` 部分相关联的描述" + +#: ../../library/email.generator.rst:264 +msgid "" +"``encoding`` -- Content transfer encoding of the non-\\ :mimetype:`text` " +"part" +msgstr "``encoding`` -- 非 :mimetype:`text` 部分的内容转换编码格式" + +#: ../../library/email.generator.rst:266 +msgid "If *fmt* is ``None``, use the following default *fmt*:" +msgstr "如果 *fmt* 为 ``None``,则使用下列默认 *fmt*:" + +#: ../../library/email.generator.rst:268 +msgid "\"[Non-text (%(type)s) part of message omitted, filename %(filename)s]\"" +msgstr "\"[忽略消息的非文本 (%(type)s) 部分,文件名 %(filename)s]\"" + +#: ../../library/email.generator.rst:270 +msgid "" +"Optional *_mangle_from_* and *maxheaderlen* are as with the " +":class:`Generator` base class." +msgstr "可选的 *_mangle_from_* 和 *maxheaderlen* 与 :class:`Generator` 基类的相同。" + +#: ../../library/email.generator.rst:275 +msgid "Footnotes" +msgstr "备注" + +#: ../../library/email.generator.rst:276 +msgid "" +"This statement assumes that you use the appropriate setting for " +"``unixfrom``, and that there are no :mod:`email.policy` settings calling for" +" automatic adjustments (for example, " +":attr:`~email.policy.EmailPolicy.refold_source` must be ``none``, which is " +"*not* the default). It is also not 100% true, since if the message does not" +" conform to the RFC standards occasionally information about the exact " +"original text is lost during parsing error recovery. It is a goal to fix " +"these latter edge cases when possible." +msgstr "" +"此语句假定你使用了正确的 ``unixfrom`` 设置,并且没有针对自动调整的 :mod:`email.policy` " +"设置调用(例如,:attr:`~email.policy.EmailPolicy.refold_source` 必须为 ``none``,这 *不是* " +"默认值)。这也不是 100% 为真的,因为如果消息不遵循 RFC 标准则有时实际原始文本的信息会在解析错误恢复时丢失。 " +"目标是在可能的情况下修复这些后续的边缘情况。" diff --git a/library/email.header.po b/library/email.header.po new file mode 100644 index 0000000000..f576b4164d --- /dev/null +++ b/library/email.header.po @@ -0,0 +1,392 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/email.header.rst:2 +msgid ":mod:`!email.header`: Internationalized headers" +msgstr ":mod:`!email.header`: 国际化标头" + +#: ../../library/email.header.rst:7 +msgid "**Source code:** :source:`Lib/email/header.py`" +msgstr "**源代码:** :source:`Lib/email/header.py`" + +#: ../../library/email.header.rst:11 +msgid "" +"This module is part of the legacy (``Compat32``) email API. In the current " +"API encoding and decoding of headers is handled transparently by the " +"dictionary-like API of the :class:`~email.message.EmailMessage` class. In " +"addition to uses in legacy code, this module can be useful in applications " +"that need to completely control the character sets used when encoding " +"headers." +msgstr "" +"此模块是旧式 (``Compat32``) email API 的一部分。在当前的 API 中标头的编码和解码是由 " +":class:`~email.message.EmailMessage` 类的字典型 API 来透明地处理的。 " +"除了在旧有代码中使用,此模块在需要完全控制当编码标头时所使用的字符集时也很有用处。" + +#: ../../library/email.header.rst:17 +msgid "" +"The remaining text in this section is the original documentation of the " +"module." +msgstr "本节中的其余文本是此模块的原始文档。" + +#: ../../library/email.header.rst:19 +msgid "" +":rfc:`2822` is the base standard that describes the format of email " +"messages. It derives from the older :rfc:`822` standard which came into " +"widespread use at a time when most email was composed of ASCII characters " +"only. :rfc:`2822` is a specification written assuming email contains only " +"7-bit ASCII characters." +msgstr "" +":rfc:`2822` 是描述电子邮件消息格式的基础标准。它派生自更早的 :rfc:`822` 标准,该标准在大多数电子邮件仅由 ASCII " +"字符组成时已被广泛使用。 :rfc:`2822` 所描述的规范假定电子邮件都只包含 7 位 ASCII 字符。" + +#: ../../library/email.header.rst:24 +msgid "" +"Of course, as email has been deployed worldwide, it has become " +"internationalized, such that language specific character sets can now be " +"used in email messages. The base standard still requires email messages to " +"be transferred using only 7-bit ASCII characters, so a slew of RFCs have " +"been written describing how to encode email containing non-ASCII characters " +"into :rfc:`2822`\\ -compliant format. These RFCs include :rfc:`2045`, " +":rfc:`2046`, :rfc:`2047`, and :rfc:`2231`. The :mod:`email` package supports" +" these standards in its :mod:`!email.header` and :mod:`email.charset` " +"modules." +msgstr "" + +#: ../../library/email.header.rst:33 +msgid "" +"If you want to include non-ASCII characters in your email headers, say in " +"the :mailheader:`Subject` or :mailheader:`To` fields, you should use the " +":class:`Header` class and assign the field in the " +":class:`~email.message.Message` object to an instance of :class:`Header` " +"instead of using a string for the header value. Import the :class:`Header` " +"class from the :mod:`!email.header` module. For example::" +msgstr "" + +#: ../../library/email.header.rst:40 +msgid "" +">>> from email.message import Message\n" +">>> from email.header import Header\n" +">>> msg = Message()\n" +">>> h = Header('p\\xf6stal', 'iso-8859-1')\n" +">>> msg['Subject'] = h\n" +">>> msg.as_string()\n" +"'Subject: =?iso-8859-1?q?p=F6stal?=\\n\\n'" +msgstr "" +">>> from email.message import Message\n" +">>> from email.header import Header\n" +">>> msg = Message()\n" +">>> h = Header('p\\xf6stal', 'iso-8859-1')\n" +">>> msg['Subject'] = h\n" +">>> msg.as_string()\n" +"'Subject: =?iso-8859-1?q?p=F6stal?=\\n\\n'" + +#: ../../library/email.header.rst:50 +msgid "" +"Notice here how we wanted the :mailheader:`Subject` field to contain a non-" +"ASCII character? We did this by creating a :class:`Header` instance and " +"passing in the character set that the byte string was encoded in. When the " +"subsequent :class:`~email.message.Message` instance was flattened, the " +":mailheader:`Subject` field was properly :rfc:`2047` encoded. MIME-aware " +"mail readers would show this header using the embedded ISO-8859-1 character." +msgstr "" +"是否注意到这里我们是如何希望 :mailheader:`Subject` 字段包含非 ASCII 字符的?我们通过创建一个 " +":class:`Header` 实例并传入字节串编码所用的字符集来做到这一点。当后续的 :class:`~email.message.Message` " +"实例被展平时,:mailheader:`Subject` 字段会正确地按 :rfc:`2047` 来编码。可感知 MIME " +"的电子邮件阅读器将会使用嵌入的 ISO-8859-1 字符来显示此标头。" + +#: ../../library/email.header.rst:57 +msgid "Here is the :class:`Header` class description:" +msgstr "以下是 :class:`Header` 类描述:" + +#: ../../library/email.header.rst:62 +msgid "" +"Create a MIME-compliant header that can contain strings in different " +"character sets." +msgstr "创建符合 MIME 要求的标头,其中可包含不同字符集的字符串。" + +#: ../../library/email.header.rst:65 +msgid "" +"Optional *s* is the initial header value. If ``None`` (the default), the " +"initial header value is not set. You can later append to the header with " +":meth:`append` method calls. *s* may be an instance of :class:`bytes` or " +":class:`str`, but see the :meth:`append` documentation for semantics." +msgstr "" +"可选的 *s* 是初始标头值。 如果为 ``None`` (默认值),则表示初始标头值未设置。 你可以在稍后使用 :meth:`append` " +"方法调用向标头添加新值。 *s* 可以是 :class:`bytes` 或 :class:`str` 的实例,注意参阅 :meth:`append` " +"文档了解相关语义。" + +#: ../../library/email.header.rst:70 +msgid "" +"Optional *charset* serves two purposes: it has the same meaning as the " +"*charset* argument to the :meth:`append` method. It also sets the default " +"character set for all subsequent :meth:`append` calls that omit the " +"*charset* argument. If *charset* is not provided in the constructor (the " +"default), the ``us-ascii`` character set is used both as *s*'s initial " +"charset and as the default for subsequent :meth:`append` calls." +msgstr "" +"可选的 *charset* 用于两种目的:它的含义与 :meth:`append` 方法的 *charset* 参数相同。它还会为所有省略了 " +"*charset* 参数的后续 :meth:`append` 调用设置默认字符集。如果 *charset* 在构造器中未提供(默认设置),则会将 " +"``us-ascii`` 字符集用作 *s* 的初始字符集以及后续 :meth:`append` 调用的默认字符集。" + +#: ../../library/email.header.rst:77 +msgid "" +"The maximum line length can be specified explicitly via *maxlinelen*. For " +"splitting the first line to a shorter value (to account for the field header" +" which isn't included in *s*, e.g. :mailheader:`Subject`) pass in the name " +"of the field in *header_name*. The default *maxlinelen* is 78, and the " +"default value for *header_name* is ``None``, meaning it is not taken into " +"account for the first line of a long, split header." +msgstr "" +"通过 *maxlinelen* 可以显式地指定行长度的最大值。要将第一行拆分为更短的值(以适应未被包括在 *s* 中的字段标头,例如 " +":mailheader:`Subject` 等)则将字段名称作为 *header_name* 传入。默认的 *maxlinelen* 为 78,而 " +"*header_name* 的默认值为 ``None``,表示不考虑拆分超长标头的第一行。" + +#: ../../library/email.header.rst:84 +msgid "" +"Optional *continuation_ws* must be :rfc:`2822`\\ -compliant folding " +"whitespace, and is usually either a space or a hard tab character. This " +"character will be prepended to continuation lines. *continuation_ws* " +"defaults to a single space character." +msgstr "" +"可选的 *continuation_ws* 必须为符合 :rfc:`2822` 的折叠用空白符,通常是空格符或硬制表符。 " +"这个字符将被加缀至连续行的开头。 *continuation_ws* 默认为一个空格符。" + +#: ../../library/email.header.rst:89 +msgid "" +"Optional *errors* is passed straight through to the :meth:`append` method." +msgstr "可选的 *errors* 会被直接传递给 :meth:`append` 方法。" + +#: ../../library/email.header.rst:94 +msgid "Append the string *s* to the MIME header." +msgstr "将字符串 *s* 添加到 MIME 标头。" + +#: ../../library/email.header.rst:96 +msgid "" +"Optional *charset*, if given, should be a :class:`~email.charset.Charset` " +"instance (see :mod:`email.charset`) or the name of a character set, which " +"will be converted to a :class:`~email.charset.Charset` instance. A value of" +" ``None`` (the default) means that the *charset* given in the constructor is" +" used." +msgstr "" +"如果给出可选的 *charset*,它应当是一个 :class:`~email.charset.Charset` 实例 (参见 " +":mod:`email.charset`) 或字符集名称,该参数将被转换为一个 :class:`~email.charset.Charset` 实例。" +" 如果为 ``None`` (默认值) 则表示会使用构造器中给出的 *charset*。" + +#: ../../library/email.header.rst:102 +msgid "" +"*s* may be an instance of :class:`bytes` or :class:`str`. If it is an " +"instance of :class:`bytes`, then *charset* is the encoding of that byte " +"string, and a :exc:`UnicodeError` will be raised if the string cannot be " +"decoded with that character set." +msgstr "" +"*s* 可以是 :class:`bytes` 或 :class:`str` 的实例。如果它是 :class:`bytes` 的实例,则 " +"*charset* 为该字节串的编码格式,如果字节串无法用该字符集来解码则将引发 :exc:`UnicodeError`。" + +#: ../../library/email.header.rst:107 +msgid "" +"If *s* is an instance of :class:`str`, then *charset* is a hint specifying " +"the character set of the characters in the string." +msgstr "如果 *s* 是 :class:`str` 的实例,则 *charset* 是用来指定字符串中字符字符集的提示。" + +#: ../../library/email.header.rst:110 +msgid "" +"In either case, when producing an :rfc:`2822`\\ -compliant header using " +":rfc:`2047` rules, the string will be encoded using the output codec of the " +"charset. If the string cannot be encoded using the output codec, a " +"UnicodeError will be raised." +msgstr "" +"在这两种情况下,当使用 :rfc:`2047` 规则产生符合 :rfc:`2822` 的标头时,将使用指定字符集的输出编解码器来编码字符串。 " +"如果字符串无法使用该输出编解码器来编码,则将引发 UnicodeError。" + +#: ../../library/email.header.rst:115 +msgid "" +"Optional *errors* is passed as the errors argument to the decode call if *s*" +" is a byte string." +msgstr "可选的 *errors* 会在 *s* 为字节串时被作为 errors 参数传递给 decode 调用。" + +#: ../../library/email.header.rst:121 +msgid "" +"Encode a message header into an RFC-compliant format, possibly wrapping long" +" lines and encapsulating non-ASCII parts in base64 or quoted-printable " +"encodings." +msgstr "" +"将消息标头编码为符合 RFC 的格式,可能会对过长的行采取折行并将非 ASCII 部分以 base64 或 quoted-printable " +"编码格式进行封装。" + +#: ../../library/email.header.rst:125 +msgid "" +"Optional *splitchars* is a string containing characters which should be " +"given extra weight by the splitting algorithm during normal header wrapping." +" This is in very rough support of :RFC:`2822`\\'s 'higher level syntactic " +"breaks': split points preceded by a splitchar are preferred during line " +"splitting, with the characters preferred in the order in which they appear " +"in the string. Space and tab may be included in the string to indicate " +"whether preference should be given to one over the other as a split point " +"when other split chars do not appear in the line being split. Splitchars " +"does not affect :RFC:`2047` encoded lines." +msgstr "" +"可选的 *splitchars* 是一个字符串,其中包含应在正常的标头折行处理期间由拆分算法赋予额外权重的字符。这是对于 :RFC:`2822` 中 " +"'更高层级语法拆分' 的很粗略的支持:在拆分期间会首选在 splitchar 之前的拆分点,字符的优先级是基于它们在字符串中的出现顺序。 " +"字符串中可包含空格和制表符以指明当其他拆分字符未在被拆分行中出现时是否要将某个字符作为优先于另一个字符的首选拆分点。拆分字符不会影响以 " +":RFC:`2047` 编码的行。" + +#: ../../library/email.header.rst:135 +msgid "" +"*maxlinelen*, if given, overrides the instance's value for the maximum line " +"length." +msgstr "如果给出 *maxlinelen*,它将覆盖实例的最大行长度值。" + +#: ../../library/email.header.rst:138 +msgid "" +"*linesep* specifies the characters used to separate the lines of the folded " +"header. It defaults to the most useful value for Python application code " +"(``\\n``), but ``\\r\\n`` can be specified in order to produce headers with " +"RFC-compliant line separators." +msgstr "" +"*linesep* 指定用来分隔已折叠标头行的字符。它默认为 Python 应用程序代码中最常用的值 (``\\n``),但也可以指定为 " +"``\\r\\n`` 以便产生带有符合 RFC 的行分隔符的标头。" + +#: ../../library/email.header.rst:143 +msgid "Added the *linesep* argument." +msgstr "增加了 *linesep* 参数。" + +#: ../../library/email.header.rst:147 +msgid "" +"The :class:`Header` class also provides a number of methods to support " +"standard operators and built-in functions." +msgstr ":class:`Header` 类还提供了一些方法以支持标准运算符和内置函数。" + +#: ../../library/email.header.rst:152 +msgid "" +"Returns an approximation of the :class:`Header` as a string, using an " +"unlimited line length. All pieces are converted to unicode using the " +"specified encoding and joined together appropriately. Any pieces with a " +"charset of ``'unknown-8bit'`` are decoded as ASCII using the ``'replace'`` " +"error handler." +msgstr "" +"以字符串形式返回 :class:`Header` 的近似表示,使用不受限制的行长度。所有部分都会使用指定编码格式转换为 unicode " +"并适当地连接起来。任何带有 ``'unknown-8bit'`` 字符集的部分都会使用 ``'replace'`` 错误处理程序解码为 ASCII。" + +#: ../../library/email.header.rst:158 +msgid "Added handling for the ``'unknown-8bit'`` charset." +msgstr "增加对 ``'unknown-8bit'`` 字符集的处理。" + +#: ../../library/email.header.rst:164 +msgid "" +"This method allows you to compare two :class:`Header` instances for " +"equality." +msgstr "这个方法允许你对两个 :class:`Header` 实例进行相等比较。" + +#: ../../library/email.header.rst:170 +msgid "" +"This method allows you to compare two :class:`Header` instances for " +"inequality." +msgstr "这个方法允许你对两个 :class:`Header` 实例进行不等比较。" + +#: ../../library/email.header.rst:173 +msgid "" +"The :mod:`!email.header` module also provides the following convenient " +"functions." +msgstr "" + +#: ../../library/email.header.rst:178 +msgid "" +"Decode a message header value without converting the character set. The " +"header value is in *header*." +msgstr "在不转换字符集的情况下对消息标头值进行解码。 *header* 为标头值。" + +#: ../../library/email.header.rst:181 +msgid "For historical reasons, this function may return either:" +msgstr "出于历史原因,此函数可能返回:" + +#: ../../library/email.header.rst:183 +msgid "" +"A list of pairs containing each of the decoded parts of the header, " +"``(decoded_bytes, charset)``, where *decoded_bytes* is always an instance of" +" :class:`bytes`, and *charset* is either:" +msgstr "" +"一个由包含标头的每个已解码部件对 ``(decoded_bytes, charset)`` 组成的列表,其中 *decoded_bytes* 总是 " +":class:`bytes` 的实例,而 *charset* 可能为:" + +#: ../../library/email.header.rst:187 +msgid "" +"A lower case string containing the name of the character set specified." +msgstr "一个包含指定字符集名称的小写形式字符串。" + +#: ../../library/email.header.rst:189 +msgid "``None`` for non-encoded parts of the header." +msgstr "``None`` 表示标头的未编码部件。" + +#: ../../library/email.header.rst:191 +msgid "" +"A list of length 1 containing a pair ``(string, None)``, where *string* is " +"always an instance of :class:`str`." +msgstr "" +"长度为 1 的包含一个 ``(string, None)`` 对的列表,其中 *string* 总是一个 :class:`str` 的实例。" + +#: ../../library/email.header.rst:194 +msgid "" +"An :exc:`email.errors.HeaderParseError` may be raised when certain decoding " +"errors occur (e.g. a base64 decoding exception)." +msgstr "当特定解码错误发生时(例如 base64 解码异常)可能会引发 :exc:`email.errors.HeaderParseError`。" + +#: ../../library/email.header.rst:197 +msgid "Here are examples:" +msgstr "这里有一些示例:" + +#: ../../library/email.header.rst:209 +msgid "" +"This function exists for backwards compatibility only. For new code, we " +"recommend using :class:`email.headerregistry.HeaderRegistry`." +msgstr "" +"此函数仅为向下兼容而存在。对于新的代码,我们推荐使用 :class:`email.headerregistry.HeaderRegistry`。" + +#: ../../library/email.header.rst:215 +msgid "" +"Create a :class:`Header` instance from a sequence of pairs as returned by " +":func:`decode_header`." +msgstr "基于 :func:`decode_header` 所返回的数据对序列创建一个 :class:`Header` 实例。" + +#: ../../library/email.header.rst:218 +msgid "" +":func:`decode_header` takes a header value string and returns a sequence of " +"pairs of the format ``(decoded_string, charset)`` where *charset* is the " +"name of the character set." +msgstr "" +":func:`decode_header` 接受一个标头值字符串并返回格式为 ``(decoded_string, charset)`` " +"的数据对序列,其中 *charset* 是字符集名称。" + +#: ../../library/email.header.rst:222 +msgid "" +"This function takes one of those sequence of pairs and returns a " +":class:`Header` instance. Optional *maxlinelen*, *header_name*, and " +"*continuation_ws* are as in the :class:`Header` constructor." +msgstr "" +"这个函数接受这样的数据对序列并返回一个 :class:`Header` 实例。可选的 *maxlinelen*, *header_name* 和 " +"*continuation_ws* 与 :class:`Header` 构造器中的含义相同。" + +#: ../../library/email.header.rst:228 +msgid "" +"This function exists for backwards compatibility only, and is not " +"recommended for use in new code." +msgstr "此函数仅为向下兼容而存在,而不推荐在新的代码中使用。" diff --git a/library/email.headerregistry.po b/library/email.headerregistry.po new file mode 100644 index 0000000000..6840848e3d --- /dev/null +++ b/library/email.headerregistry.po @@ -0,0 +1,787 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-06-03 19:20+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/email.headerregistry.rst:2 +msgid ":mod:`!email.headerregistry`: Custom Header Objects" +msgstr ":mod:`!email.headerregistry`: 自定义标头对象" + +#: ../../library/email.headerregistry.rst:10 +msgid "**Source code:** :source:`Lib/email/headerregistry.py`" +msgstr "**源代码:** :source:`Lib/email/headerregistry.py`" + +#: ../../library/email.headerregistry.rst:14 +msgid "[1]_" +msgstr "[1]_" + +#: ../../library/email.headerregistry.rst:16 +msgid "" +"Headers are represented by customized subclasses of :class:`str`. The " +"particular class used to represent a given header is determined by the " +":attr:`~email.policy.EmailPolicy.header_factory` of the :mod:`~email.policy`" +" in effect when the headers are created. This section documents the " +"particular ``header_factory`` implemented by the email package for handling " +":RFC:`5322` compliant email messages, which not only provides customized " +"header objects for various header types, but also provides an extension " +"mechanism for applications to add their own custom header types." +msgstr "" +"标头是由 :class:`str` 的自定义子类来表示的。用于表示给定标头的特定类则由创建标头时生效的 :mod:`~email.policy` 的 " +":attr:`~email.policy.EmailPolicy.header_factory` 确定。这一节记录了 email 包为处理兼容 " +":RFC:`5322` 的电子邮件消息所实现的特定 " +"``header_factory``,它不仅为各种标头类型提供了自定义的标头对象,还为应用程序提供了添加其自定义标头类型的扩展机制。" + +#: ../../library/email.headerregistry.rst:25 +msgid "" +"When using any of the policy objects derived from " +":data:`~email.policy.EmailPolicy`, all headers are produced by " +":class:`.HeaderRegistry` and have :class:`.BaseHeader` as their last base " +"class. Each header class has an additional base class that is determined by" +" the type of the header. For example, many headers have the class " +":class:`.UnstructuredHeader` as their other base class. The specialized " +"second class for a header is determined by the name of the header, using a " +"lookup table stored in the :class:`.HeaderRegistry`. All of this is managed" +" transparently for the typical application program, but interfaces are " +"provided for modifying the default behavior for use by more complex " +"applications." +msgstr "" +"当使用派生自 :data:`~email.policy.EmailPolicy` 的任何策略对象时,所有标头都通过 " +":class:`.HeaderRegistry` 产生并且以 :class:`.BaseHeader` 作为其最后一个基类。 " +"每个标头类都有一个由该标头类型确定的附加基类。例如,许多标头都以 :class:`.UnstructuredHeader` 类作为其另一个基类。 " +"一个标头专用的第二个类是由标头名称使用存储在 :class:`.HeaderRegistry` 中的查找表来确定的。 " +"所有这些都针对典型应用程序进行透明的管理,但也为修改默认行为提供了接口,以便由更复杂的应用使用。" + +#: ../../library/email.headerregistry.rst:36 +msgid "" +"The sections below first document the header base classes and their " +"attributes, followed by the API for modifying the behavior of " +":class:`.HeaderRegistry`, and finally the support classes used to represent " +"the data parsed from structured headers." +msgstr "" +"以下各节首先记录了标头基类及其属性,然后是用于修改 :class:`.HeaderRegistry` 行为的 " +"API,最后是用于表示从结构化标头解析的数据的支持类。" + +#: ../../library/email.headerregistry.rst:44 +msgid "" +"*name* and *value* are passed to ``BaseHeader`` from the " +":attr:`~email.policy.EmailPolicy.header_factory` call. The string value of " +"any header object is the *value* fully decoded to unicode." +msgstr "" +"*name* 和 *value* 会从 :attr:`~email.policy.EmailPolicy.header_factory` 调用传递给 " +"``BaseHeader``。任何标头对象的字符串值都是完成解码为 unicode 的 *value*。" + +#: ../../library/email.headerregistry.rst:48 +msgid "This base class defines the following read-only properties:" +msgstr "这个基类定义了下列只读属性:" + +#: ../../library/email.headerregistry.rst:53 +msgid "" +"The name of the header (the portion of the field before the ':'). This is " +"exactly the value passed in the " +":attr:`~email.policy.EmailPolicy.header_factory` call for *name*; that is, " +"case is preserved." +msgstr "" +"标头的名称(字段在 ':' 之前的部分)。这就是 *name* 的 " +":attr:`~email.policy.EmailPolicy.header_factory` 调用所传递的值;也就是说会保持大小写形式。" + +#: ../../library/email.headerregistry.rst:61 +msgid "" +"A tuple of :exc:`~email.errors.HeaderDefect` instances reporting any RFC " +"compliance problems found during parsing. The email package tries to be " +"complete about detecting compliance issues. See the :mod:`~email.errors` " +"module for a discussion of the types of defects that may be reported." +msgstr "" +"一个包含 :exc:`~email.errors.HeaderDefect` 实例的元组,这些实例报告了在解析期间发现的任何 RFC 合规性问题。 " +"email 包会尝试尽可能地检测合规性问题。请参阅 :mod:`~email.errors` 模块了解可能被报告的缺陷类型的相关讨论。" + +#: ../../library/email.headerregistry.rst:69 +msgid "" +"The maximum number of headers of this type that can have the same ``name``." +" A value of ``None`` means unlimited. The ``BaseHeader`` value for this " +"attribute is ``None``; it is expected that specialized header classes will " +"override this value as needed." +msgstr "" +"此类型标头可具有相同 ``name`` 的最大数量。``None`` 值表示无限制。此属性的 ``BaseHeader`` 值为 " +"``None``;专用的标头类预期将根据需要覆盖这个值。" + +#: ../../library/email.headerregistry.rst:74 +msgid "" +"``BaseHeader`` also provides the following method, which is called by the " +"email library code and should not in general be called by application " +"programs:" +msgstr "``BaseHeader`` 还提供了以下方法,它由 email 库代码调用,通常不应当由应用程序来调用。" + +#: ../../library/email.headerregistry.rst:80 +msgid "" +"Return a string containing :attr:`~email.policy.Policy.linesep` characters " +"as required to correctly fold the header according to *policy*. A " +":attr:`~email.policy.Policy.cte_type` of ``8bit`` will be treated as if it " +"were ``7bit``, since headers may not contain arbitrary binary data. If " +":attr:`~email.policy.EmailPolicy.utf8` is ``False``, non-ASCII data will be " +":rfc:`2047` encoded." +msgstr "" +"返回一个字符串,其中包含用来根据 *policy* 正确地折叠标头的 :attr:`~email.policy.Policy.linesep` 字符。" +" :attr:`~email.policy.Policy.cte_type` 为 ``8bit`` 时将被作为 ``7bit`` " +"来处理,因为标头不能包含任意二进制数据。如果 :attr:`~email.policy.EmailPolicy.utf8` 为 ``False``,则非" +" ASCII 数据将根据 :rfc:`2047` 来编码。" + +#: ../../library/email.headerregistry.rst:88 +msgid "" +"``BaseHeader`` by itself cannot be used to create a header object. It " +"defines a protocol that each specialized header cooperates with in order to " +"produce the header object. Specifically, ``BaseHeader`` requires that the " +"specialized class provide a :func:`classmethod` named ``parse``. This " +"method is called as follows::" +msgstr "" +"``BaseHeader`` 本身不能被用于创建标头对象。它定义了一个与每个专用标头相配合的协议以便生成标头对象。 " +"具体来说,``BaseHeader`` 要求专用类提供一个名为 ``parse`` 的 :func:`classmethod`。 " +"此方法的调用形式如下::" + +#: ../../library/email.headerregistry.rst:94 +msgid "parse(string, kwds)" +msgstr "parse(string, kwds)" + +#: ../../library/email.headerregistry.rst:96 +msgid "" +"``kwds`` is a dictionary containing one pre-initialized key, ``defects``. " +"``defects`` is an empty list. The parse method should append any detected " +"defects to this list. On return, the ``kwds`` dictionary *must* contain " +"values for at least the keys ``decoded``, ``defects`` and ``parse_tree``. " +"``decoded`` should be the string value for the header (that is, the header " +"value fully decoded to unicode). ``parse_tree`` is set to the parse tree " +"obtained from parsing the header. The parse method should assume that " +"*string* may contain content-transfer-encoded parts, but should correctly " +"handle all valid unicode characters as well so that it can parse un-encoded " +"header values." +msgstr "" + +#: ../../library/email.headerregistry.rst:106 +msgid "" +"``BaseHeader``'s ``__new__`` then creates the header instance, and calls its" +" ``init`` method. The specialized class only needs to provide an ``init`` " +"method if it wishes to set additional attributes beyond those provided by " +"``BaseHeader`` itself. Such an ``init`` method should look like this::" +msgstr "" +"随后 ``BaseHeader`` 的 ``__new__`` 会创建标头实例,并调用其 ``init`` 方法。专属类如果想要设置 " +"``BaseHeader`` 自身所提供的属性之外的附加属性,只需提供一个 ``init`` 方法。这样的 ``init`` 看起来应该是这样::" + +#: ../../library/email.headerregistry.rst:111 +msgid "" +"def init(self, /, *args, **kw):\n" +" self._myattr = kw.pop('myattr')\n" +" super().init(*args, **kw)" +msgstr "" +"def init(self, /, *args, **kw):\n" +" self._myattr = kw.pop('myattr')\n" +" super().init(*args, **kw)" + +#: ../../library/email.headerregistry.rst:115 +msgid "" +"That is, anything extra that the specialized class puts in to the ``kwds`` " +"dictionary should be removed and handled, and the remaining contents of " +"``kw`` (and ``args``) passed to the ``BaseHeader`` ``init`` method." +msgstr "" +"也就是说,专属类放入 ``kwds`` 字典的任何额外内容都应当被移除和处理,并且 ``kw`` (和 ``args``) 的剩余内容会被传递给 " +"``BaseHeader`` ``init`` 方法。" + +#: ../../library/email.headerregistry.rst:122 +msgid "" +"An \"unstructured\" header is the default type of header in :rfc:`5322`. Any" +" header that does not have a specified syntax is treated as unstructured. " +"The classic example of an unstructured header is the :mailheader:`Subject` " +"header." +msgstr "" +" 标头是 :rfc:`5322` 中默认的标头类型。任何没有指定语法的标头都会被视为是非结构化的。非结构化标头的经典例子是 " +":mailheader:`Subject` 标头。" + +#: ../../library/email.headerregistry.rst:127 +msgid "" +"In :rfc:`5322`, an unstructured header is a run of arbitrary text in the " +"ASCII character set. :rfc:`2047`, however, has an :rfc:`5322` compatible " +"mechanism for encoding non-ASCII text as ASCII characters within a header " +"value. When a *value* containing encoded words is passed to the " +"constructor, the ``UnstructuredHeader`` parser converts such encoded words " +"into unicode, following the :rfc:`2047` rules for unstructured text. The " +"parser uses heuristics to attempt to decode certain non-compliant encoded " +"words. Defects are registered in such cases, as well as defects for issues " +"such as invalid characters within the encoded words or the non-encoded text." +msgstr "" +"在 :rfc:`5322` 中,非结构化标头是指一段以 ASCII 字符集表示的任意文本。但是 :rfc:`2047` 具有一个 :rfc:`5322`" +" 兼容机制用来将标头值中的非 ASCII 文本编码为 ASCII 字符。当包含已编码字的 *value* " +"被传递给构造器时,``UnstructuredHeader`` 解析器会按照非结构化文本的 :rfc:`2047` 规则将此类已编码字转换为 " +"unicode。解析器会使用启发式机制来尝试解码一些不合规的已编码字。 在此种情况下各类缺陷,例如已编码字或未编码文本中的无效字符问题等缺陷将会被注册。" + +#: ../../library/email.headerregistry.rst:137 +msgid "This header type provides no additional attributes." +msgstr "此标头类型未提供附加属性。" + +#: ../../library/email.headerregistry.rst:142 +msgid "" +":rfc:`5322` specifies a very specific format for dates within email headers." +" The ``DateHeader`` parser recognizes that date format, as well as " +"recognizing a number of variant forms that are sometimes found \"in the " +"wild\"." +msgstr "" +":rfc:`5322` 为电子邮件标头内的日期指定了非常明确的格式。``DateHeader`` " +"解析器会识别该日期格式,并且也能识别间或出现的一些“不规范”变种形式。" + +#: ../../library/email.headerregistry.rst:147 +#: ../../library/email.headerregistry.rst:189 +msgid "This header type provides the following additional attributes:" +msgstr "这个标头类型提供了以下附加属性。" + +#: ../../library/email.headerregistry.rst:151 +msgid "" +"If the header value can be recognized as a valid date of one form or " +"another, this attribute will contain a :class:`~datetime.datetime` instance " +"representing that date. If the timezone of the input date is specified as " +"``-0000`` (indicating it is in UTC but contains no information about the " +"source timezone), then :attr:`.datetime` will be a naive " +":class:`~datetime.datetime`. If a specific timezone offset is found " +"(including ``+0000``), then :attr:`.datetime` will contain an aware " +"``datetime`` that uses :class:`datetime.timezone` to record the timezone " +"offset." +msgstr "" +"如果标头值能被识别为某一种有效的日期形式,此属性将包含一个代表该日期的 :class:`~datetime.datetime` 实例。 " +"如果输入日期的时区被指定为 ``-0000`` (表示它是 UTC 但不包含源时区的相关信息),则 :attr:`.datetime` 将为简单型 " +":class:`~datetime.datetime`。如果找到了特定的时区时差值 (包括 ``+0000``),则 :attr:`.datetime`" +" 将包含一个使用 :class:`datetime.timezone` 来记录时区时差的感知型 ``datetime``." + +#: ../../library/email.headerregistry.rst:161 +msgid "" +"The ``decoded`` value of the header is determined by formatting the " +"``datetime`` according to the :rfc:`5322` rules; that is, it is set to::" +msgstr "" +"标头的 ``decoded`` 值是由按照 :rfc:`5322` 对 ``datetime`` 进行格式化来确定的;也就是说,它会被设为::" + +#: ../../library/email.headerregistry.rst:164 +msgid "email.utils.format_datetime(self.datetime)" +msgstr "email.utils.format_datetime(self.datetime)" + +#: ../../library/email.headerregistry.rst:166 +msgid "" +"When creating a ``DateHeader``, *value* may be :class:`~datetime.datetime` " +"instance. This means, for example, that the following code is valid and " +"does what one would expect::" +msgstr "" +"当创建 ``DateHeader`` 时,*value* 可以为 :class:`~datetime.datetime` 实例。 " +"例如这意味着以下代码是有效的并能实现人们预期的行为::" + +#: ../../library/email.headerregistry.rst:170 +msgid "msg['Date'] = datetime(2011, 7, 15, 21)" +msgstr "msg['Date'] = datetime(2011, 7, 15, 21)" + +#: ../../library/email.headerregistry.rst:172 +msgid "" +"Because this is a naive ``datetime`` it will be interpreted as a UTC " +"timestamp, and the resulting value will have a timezone of ``-0000``. Much " +"more useful is to use the :func:`~email.utils.localtime` function from the " +":mod:`~email.utils` module::" +msgstr "" +"因为这是个简单型 ``datetime`` 它将被解读为 UTC 时间戳,并且结果值的时区将为 ``-0000``。使用来自 " +":mod:`~email.utils` 模块的 :func:`~email.utils.localtime` 函数会更有用::" + +#: ../../library/email.headerregistry.rst:177 +msgid "msg['Date'] = utils.localtime()" +msgstr "msg['Date'] = utils.localtime()" + +#: ../../library/email.headerregistry.rst:179 +msgid "" +"This example sets the date header to the current time and date using the " +"current timezone offset." +msgstr "这个例子将日期标头设为使用当前时区时差值的当前时间和日期。" + +#: ../../library/email.headerregistry.rst:185 +msgid "" +"Address headers are one of the most complex structured header types. The " +"``AddressHeader`` class provides a generic interface to any address header." +msgstr "地址标头是最复杂的结构化标头类型之一。``AddressHeader`` 类提供了适合任何地址标头的泛用型接口。" + +#: ../../library/email.headerregistry.rst:194 +msgid "" +"A tuple of :class:`.Group` objects encoding the addresses and groups found " +"in the header value. Addresses that are not part of a group are represented" +" in this list as single-address ``Groups`` whose " +":attr:`~.Group.display_name` is ``None``." +msgstr "" +"编码了在标头值中找到的地址和分组的 :class:`.Group` 对象的元组。非分组成员的地址在此列表中表示为 " +":attr:`~.Group.display_name` 为 ``None`` 的单地址 ``Groups``。" + +#: ../../library/email.headerregistry.rst:202 +msgid "" +"A tuple of :class:`.Address` objects encoding all of the individual " +"addresses from the header value. If the header value contains any groups, " +"the individual addresses from the group are included in the list at the " +"point where the group occurs in the value (that is, the list of addresses is" +" \"flattened\" into a one dimensional list)." +msgstr "" +"编码了来自标头值的所有单独地址的 :class:`.Address` 对象的元组。 " +"如果标头值包含任何分组,则来自分组的单个地址将包含在该分组出现在值中的点上列出(也就是说,地址列表会被“展平”为一维列表)。" + +#: ../../library/email.headerregistry.rst:208 +msgid "" +"The ``decoded`` value of the header will have all encoded words decoded to " +"unicode. :class:`~encodings.idna` encoded domain names are also decoded to " +"unicode. The ``decoded`` value is set by :ref:`joining ` the" +" :class:`str` value of the elements of the ``groups`` attribute with ``', " +"'``." +msgstr "" +"标头的 ``decoded`` 值将把所有已编码字解码为 unicode。 :class:`~encodings.idna` 编码的域名也会被解码为 " +"unicode。``decoded`` 值是通过对 ``groups`` 属性的元素的 :class:`str` 值使用 ``', '`` 进行 " +":ref:`合并 ` 来设置的。" + +#: ../../library/email.headerregistry.rst:214 +msgid "" +"A list of :class:`.Address` and :class:`.Group` objects in any combination " +"may be used to set the value of an address header. ``Group`` objects whose " +"``display_name`` is ``None`` will be interpreted as single addresses, which " +"allows an address list to be copied with groups intact by using the list " +"obtained from the ``groups`` attribute of the source header." +msgstr "" +"可以使用 :class:`.Address` 与 :class:`.Group` 对象的任意组合的列表来设置一个地址标头的值。 " +"``display_name`` 为 ``None`` 的 ``Group`` 对象将被解读为单独地址,这允许一个地址列表可以附带通过使用从源标头的 " +"``groups`` 属性获取的列表而保留原分组。" + +#: ../../library/email.headerregistry.rst:223 +msgid "" +"A subclass of :class:`.AddressHeader` that adds one additional attribute:" +msgstr ":class:`.AddressHeader` 的子类,添加了一个额外的属性:" + +#: ../../library/email.headerregistry.rst:229 +msgid "" +"The single address encoded by the header value. If the header value " +"actually contains more than one address (which would be a violation of the " +"RFC under the default :mod:`~email.policy`), accessing this attribute will " +"result in a :exc:`ValueError`." +msgstr "" +"由标头值编码的单个地址。如果标头值实际上包含一个以上的地址(这在默认 :mod:`~email.policy` 下将违反 RFC),则访问此属性将导致 " +":exc:`ValueError`." + +#: ../../library/email.headerregistry.rst:235 +msgid "" +"Many of the above classes also have a ``Unique`` variant (for example, " +"``UniqueUnstructuredHeader``). The only difference is that in the " +"``Unique`` variant, :attr:`~.BaseHeader.max_count` is set to 1." +msgstr "" +"上述类中许多还具有一个 ``Unique`` 变体 (例如 ``UniqueUnstructuredHeader``)。 其唯一差别是在 " +"``Unique`` 变体中 :attr:`~.BaseHeader.max_count` 被设为 1。" + +#: ../../library/email.headerregistry.rst:242 +msgid "" +"There is really only one valid value for the :mailheader:`MIME-Version` " +"header, and that is ``1.0``. For future proofing, this header class " +"supports other valid version numbers. If a version number has a valid value" +" per :rfc:`2045`, then the header object will have non-``None`` values for " +"the following attributes:" +msgstr "" +"实际上 :mailheader:`MIME-Version` 标头只有一个有效的值,即 ``1.0``。 " +"为了将来的扩展,这个标头类还支持其他的有效版本号。如果一个版本号是 :rfc:`2045` 的有效值,则标头对象的以下属性将具有不为 ``None`` " +"的值:" + +#: ../../library/email.headerregistry.rst:250 +msgid "" +"The version number as a string, with any whitespace and/or comments removed." +msgstr "字符串形式的版本号。任何空格和/或注释都会被移除。" + +#: ../../library/email.headerregistry.rst:255 +msgid "The major version number as an integer" +msgstr "整数形式的主版本号" + +#: ../../library/email.headerregistry.rst:259 +msgid "The minor version number as an integer" +msgstr "整数形式的次版本号" + +#: ../../library/email.headerregistry.rst:264 +msgid "" +"MIME headers all start with the prefix 'Content-'. Each specific header has" +" a certain value, described under the class for that header. Some can also " +"take a list of supplemental parameters, which have a common format. This " +"class serves as a base for all the MIME headers that take parameters." +msgstr "" +"MIME 标头都以前缀 'Content-' 打头。每个特定标头都具有特定的值,其描述在该标头的类之中。 " +"有些也可以接受一个具有通用格式的补充参数列表。这个类被用作所有接受参数的 MIME 标头的基类。" + +#: ../../library/email.headerregistry.rst:271 +msgid "A dictionary mapping parameter names to parameter values." +msgstr "一个将参数名映射到参数值的字典。" + +#: ../../library/email.headerregistry.rst:276 +msgid "" +"A :class:`ParameterizedMIMEHeader` class that handles the " +":mailheader:`Content-Type` header." +msgstr "" +"处理 :mailheader:`Content-Type` 标头的 :class:`ParameterizedMIMEHeader` 类。" + +#: ../../library/email.headerregistry.rst:281 +msgid "The content type string, in the form ``maintype/subtype``." +msgstr "``maintype/subtype`` 形式的内容类型字符串。" + +#: ../../library/email.headerregistry.rst:290 +msgid "" +"A :class:`ParameterizedMIMEHeader` class that handles the " +":mailheader:`Content-Disposition` header." +msgstr "" +"处理 :mailheader:`Content-Disposition` 标头的 :class:`ParameterizedMIMEHeader` 类。" + +#: ../../library/email.headerregistry.rst:295 +msgid "``inline`` and ``attachment`` are the only valid values in common use." +msgstr "``inline`` 和 ``attachment`` 是仅有的常用有效值。" + +#: ../../library/email.headerregistry.rst:300 +msgid "Handles the :mailheader:`Content-Transfer-Encoding` header." +msgstr "处理 :mailheader:`Content-Transfer-Encoding` 标头。" + +#: ../../library/email.headerregistry.rst:304 +msgid "" +"Valid values are ``7bit``, ``8bit``, ``base64``, and ``quoted-printable``. " +"See :rfc:`2045` for more information." +msgstr "" +"可用的有效值为 ``7bit``, ``8bit``, ``base64`` 和 ``quoted-printable``。更多信息请参阅 " +":rfc:`2045`." + +#: ../../library/email.headerregistry.rst:313 +msgid "" +"This is the factory used by :class:`~email.policy.EmailPolicy` by default. " +"``HeaderRegistry`` builds the class used to create a header instance " +"dynamically, using *base_class* and a specialized class retrieved from a " +"registry that it holds. When a given header name does not appear in the " +"registry, the class specified by *default_class* is used as the specialized " +"class. When *use_default_map* is ``True`` (the default), the standard " +"mapping of header names to classes is copied in to the registry during " +"initialization. *base_class* is always the last class in the generated " +"class's :class:`~type.__bases__` list." +msgstr "" +"这是由 :class:`~email.policy.EmailPolicy` 在默认情况下使用的工厂函数。 ``HeaderRegistry`` 会使用" +" *base_class* 和从它所保存的注册表中获取的专用类来构建用于动态地创建标头实例的类。 当给定的标头名称未在注册表中出现时,则会使用由 " +"*default_class* 所指定的类作为专用类。 当 *use_default_map* 为 ``True`` (默认值) " +"时,则会在初始化期间把从标头名称到类的标准映射拷贝到注册表中。 *base_class* 始终会是所生成的类的 " +":class:`~type.__bases__` 列表中的最后一个类。" + +#: ../../library/email.headerregistry.rst:323 +msgid "The default mappings are:" +msgstr "默认的映射有:" + +#: ../../library/email.headerregistry.rst:0 +msgid "subject" +msgstr "subject" + +#: ../../library/email.headerregistry.rst:325 +msgid "UniqueUnstructuredHeader" +msgstr "UniqueUnstructuredHeader" + +#: ../../library/email.headerregistry.rst:0 +msgid "date" +msgstr "date" + +#: ../../library/email.headerregistry.rst:326 +#: ../../library/email.headerregistry.rst:328 +msgid "UniqueDateHeader" +msgstr "UniqueDateHeader" + +#: ../../library/email.headerregistry.rst:0 +msgid "resent-date" +msgstr "resent-date" + +#: ../../library/email.headerregistry.rst:327 +msgid "DateHeader" +msgstr "DateHeader" + +#: ../../library/email.headerregistry.rst:0 +msgid "orig-date" +msgstr "orig-date" + +#: ../../library/email.headerregistry.rst:0 +msgid "sender" +msgstr "sender" + +#: ../../library/email.headerregistry.rst:329 +msgid "UniqueSingleAddressHeader" +msgstr "UniqueSingleAddressHeader" + +#: ../../library/email.headerregistry.rst:0 +msgid "resent-sender" +msgstr "resent-sender" + +#: ../../library/email.headerregistry.rst:330 +msgid "SingleAddressHeader" +msgstr "SingleAddressHeader" + +#: ../../library/email.headerregistry.rst:0 +msgid "to" +msgstr "to" + +#: ../../library/email.headerregistry.rst:331 +#: ../../library/email.headerregistry.rst:333 +#: ../../library/email.headerregistry.rst:335 +#: ../../library/email.headerregistry.rst:337 +#: ../../library/email.headerregistry.rst:339 +msgid "UniqueAddressHeader" +msgstr "UniqueAddressHeader" + +#: ../../library/email.headerregistry.rst:0 +msgid "resent-to" +msgstr "resent-to" + +#: ../../library/email.headerregistry.rst:332 +#: ../../library/email.headerregistry.rst:334 +#: ../../library/email.headerregistry.rst:336 +#: ../../library/email.headerregistry.rst:338 +msgid "AddressHeader" +msgstr "AddressHeader" + +#: ../../library/email.headerregistry.rst:0 +msgid "cc" +msgstr "cc" + +#: ../../library/email.headerregistry.rst:0 +msgid "resent-cc" +msgstr "resent-cc" + +#: ../../library/email.headerregistry.rst:0 +msgid "bcc" +msgstr "bcc" + +#: ../../library/email.headerregistry.rst:0 +msgid "resent-bcc" +msgstr "resent-bcc" + +#: ../../library/email.headerregistry.rst:0 +msgid "from" +msgstr "from" + +#: ../../library/email.headerregistry.rst:0 +msgid "resent-from" +msgstr "resent-from" + +#: ../../library/email.headerregistry.rst:0 +msgid "reply-to" +msgstr "reply-to" + +#: ../../library/email.headerregistry.rst:0 +msgid "mime-version" +msgstr "mime-version" + +#: ../../library/email.headerregistry.rst:340 +msgid "MIMEVersionHeader" +msgstr "MIMEVersionHeader" + +#: ../../library/email.headerregistry.rst:0 +msgid "content-type" +msgstr "content-type" + +#: ../../library/email.headerregistry.rst:341 +msgid "ContentTypeHeader" +msgstr "ContentTypeHeader" + +#: ../../library/email.headerregistry.rst:0 +msgid "content-disposition" +msgstr "content-disposition" + +#: ../../library/email.headerregistry.rst:342 +msgid "ContentDispositionHeader" +msgstr "ContentDispositionHeader" + +#: ../../library/email.headerregistry.rst:0 +msgid "content-transfer-encoding" +msgstr "content-transfer-encoding" + +#: ../../library/email.headerregistry.rst:343 +msgid "ContentTransferEncodingHeader" +msgstr "ContentTransferEncodingHeader" + +#: ../../library/email.headerregistry.rst:0 +msgid "message-id" +msgstr "message-id" + +#: ../../library/email.headerregistry.rst:344 +msgid "MessageIDHeader" +msgstr "MessageIDHeader" + +#: ../../library/email.headerregistry.rst:346 +msgid "``HeaderRegistry`` has the following methods:" +msgstr "``HeaderRegistry`` 具有下列方法:" + +#: ../../library/email.headerregistry.rst:351 +msgid "" +"*name* is the name of the header to be mapped. It will be converted to " +"lower case in the registry. *cls* is the specialized class to be used, " +"along with *base_class*, to create the class used to instantiate headers " +"that match *name*." +msgstr "" +"*name* 是要映射的标头名称。它将在注册表中被转换为小写形式。 *cls* 是要与 *base_class* 一起被用来创建用于实例化与 " +"*name* 相匹配的标头的类的专用类。" + +#: ../../library/email.headerregistry.rst:359 +msgid "Construct and return a class to handle creating a *name* header." +msgstr "构造并返回一个类来处理 *name* 标头的创建。" + +#: ../../library/email.headerregistry.rst:364 +msgid "" +"Retrieves the specialized header associated with *name* from the registry " +"(using *default_class* if *name* does not appear in the registry) and " +"composes it with *base_class* to produce a class, calls the constructed " +"class's constructor, passing it the same argument list, and finally returns " +"the class instance created thereby." +msgstr "" +"从注册表获得与 *name* 相关联的专用标头 (如果 *name* 未在注册表中出现则使用 *default_class*) 并将其与 " +"*base_class* 相组合以产生类,调用被构造类的构造器,传入相同的参数列表,并最终返回由此创建的类实例。" + +#: ../../library/email.headerregistry.rst:371 +msgid "" +"The following classes are the classes used to represent data parsed from " +"structured headers and can, in general, be used by an application program to" +" construct structured values to assign to specific headers." +msgstr "以下的类是用于表示从结构化标头解析的数据的类,并且通常会由应用程序使用以构造结构化的值并赋给特定的标头。" + +#: ../../library/email.headerregistry.rst:378 +msgid "" +"The class used to represent an email address. The general form of an " +"address is::" +msgstr "用于表示电子邮件地址的类。地址的一般形式为::" + +#: ../../library/email.headerregistry.rst:381 +msgid "[display_name] " +msgstr "[display_name] " + +#: ../../library/email.headerregistry.rst:383 +msgid "or::" +msgstr "或者::" + +#: ../../library/email.headerregistry.rst:385 +msgid "username@domain" +msgstr "username@domain" + +#: ../../library/email.headerregistry.rst:387 +msgid "" +"where each part must conform to specific syntax rules spelled out in " +":rfc:`5322`." +msgstr "其中每个部分都必须符合在 :rfc:`5322` 中阐述的特定语法规则。" + +#: ../../library/email.headerregistry.rst:390 +msgid "" +"As a convenience *addr_spec* can be specified instead of *username* and " +"*domain*, in which case *username* and *domain* will be parsed from the " +"*addr_spec*. An *addr_spec* must be a properly RFC quoted string; if it is " +"not ``Address`` will raise an error. Unicode characters are allowed and " +"will be property encoded when serialized. However, per the RFCs, unicode is" +" *not* allowed in the username portion of the address." +msgstr "" +"为了方便起见可以指定 *addr_spec* 来替代 *username* 和 *domain*,在此情况下 *username* 和 *domain*" +" 将从 *addr_spec* 中解析。 *addr_spec* 应当是一个正确地引用了 RFC 的字符串;如果它不是 ``Address`` " +"则将引发错误。Unicode 字符也允许使用并将在序列化时被正确地编码。但是,根据 RFC,地址的 username 部分 *不允许* 有 " +"unicode." + +#: ../../library/email.headerregistry.rst:399 +msgid "" +"The display name portion of the address, if any, with all quoting removed. " +"If the address does not have a display name, this attribute will be an empty" +" string." +msgstr "地址的显示名称部分(如果有的话)并去除所有引用项。如果地址没有显示名称,则此属性将为空字符串。" + +#: ../../library/email.headerregistry.rst:405 +msgid "The ``username`` portion of the address, with all quoting removed." +msgstr "地址的 ``username`` 部分,去除所有引用项。" + +#: ../../library/email.headerregistry.rst:409 +msgid "The ``domain`` portion of the address." +msgstr "地址的 ``domain`` 部分。" + +#: ../../library/email.headerregistry.rst:413 +msgid "" +"The ``username@domain`` portion of the address, correctly quoted for use as " +"a bare address (the second form shown above). This attribute is not " +"mutable." +msgstr "地址的 ``username@domain`` 部分,经过正确引用处理以作为纯地址使用(上面显示的第二种形式)。此属性不可变。" + +#: ../../library/email.headerregistry.rst:419 +msgid "" +"The ``str`` value of the object is the address quoted according to " +":rfc:`5322` rules, but with no Content Transfer Encoding of any non-ASCII " +"characters." +msgstr "" +"对象的 ``str`` 值是根据 :rfc:`5322` 规则进行引用处理的地址,但不带任何非 ASCII 字符的 Content Transfer " +"Encoding." + +#: ../../library/email.headerregistry.rst:423 +msgid "" +"To support SMTP (:rfc:`5321`), ``Address`` handles one special case: if " +"``username`` and ``domain`` are both the empty string (or ``None``), then " +"the string value of the ``Address`` is ``<>``." +msgstr "" +"为了支持 SMTP (:rfc:`5321`),``Address`` 会处理一种特殊情况:如果 ``username`` 和 ``domain`` " +"均为空字符串 (或为 ``None``),则 ``Address`` 的字符串值为 ``<>``。" + +#: ../../library/email.headerregistry.rst:430 +msgid "" +"The class used to represent an address group. The general form of an " +"address group is::" +msgstr "用于表示地址组的类。地址组的一般形式为::" + +#: ../../library/email.headerregistry.rst:433 +msgid "display_name: [address-list];" +msgstr "display_name: [address-list];" + +#: ../../library/email.headerregistry.rst:435 +msgid "" +"As a convenience for processing lists of addresses that consist of a mixture" +" of groups and single addresses, a ``Group`` may also be used to represent " +"single addresses that are not part of a group by setting *display_name* to " +"``None`` and providing a list of the single address as *addresses*." +msgstr "" +"作为处理由组和单个地址混合构成的列表的便捷方式,``Group`` 也可以通过将 *display_name* 设为 ``None`` " +"以用来表示不是某个组的一部分的单独地址并提供单独地址的列表作为 *addresses*。" + +#: ../../library/email.headerregistry.rst:442 +msgid "" +"The ``display_name`` of the group. If it is ``None`` and there is exactly " +"one ``Address`` in ``addresses``, then the ``Group`` represents a single " +"address that is not in a group." +msgstr "" +"组的 ``display_name``。如果其为 ``None`` 并且恰好有一个 ``Address`` 在 ``addresses`` 中,则 " +"``Group`` 表示一个不在某个组中的单独地址。" + +#: ../../library/email.headerregistry.rst:448 +msgid "" +"A possibly empty tuple of :class:`.Address` objects representing the " +"addresses in the group." +msgstr "一个可能为空的表示组中地址的包含 :class:`.Address` 对象的元组。" + +#: ../../library/email.headerregistry.rst:453 +msgid "" +"The ``str`` value of a ``Group`` is formatted according to :rfc:`5322`, but " +"with no Content Transfer Encoding of any non-ASCII characters. If " +"``display_name`` is none and there is a single ``Address`` in the " +"``addresses`` list, the ``str`` value will be the same as the ``str`` of " +"that single ``Address``." +msgstr "" +"``Group`` 的 ``str`` 值会根据 :rfc:`5322` 进行格式化,但不带任何非 ASCII 字符的 Content Transfer" +" Encoding。如果 ``display_name`` 为空值且只有一个单独 ``Address`` 在 ``addresses`` 列表中,则 " +"``str`` 值将与该单独 ``Address`` 的 ``str`` 相同。" + +#: ../../library/email.headerregistry.rst:461 +msgid "Footnotes" +msgstr "脚注" + +#: ../../library/email.headerregistry.rst:462 +msgid "" +"Originally added in 3.3 as a :term:`provisional module `" +msgstr "最初在 3.3 中作为 :term:`暂定模块 ` 添加" diff --git a/library/email.iterators.po b/library/email.iterators.po new file mode 100644 index 0000000000..c5e99ddef9 --- /dev/null +++ b/library/email.iterators.po @@ -0,0 +1,144 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/email.iterators.rst:2 +msgid ":mod:`!email.iterators`: Iterators" +msgstr ":mod:`!email.iterators`: 迭代器" + +#: ../../library/email.iterators.rst:7 +msgid "**Source code:** :source:`Lib/email/iterators.py`" +msgstr "**源代码:** :source:`Lib/email/iterators.py`" + +#: ../../library/email.iterators.rst:11 +msgid "" +"Iterating over a message object tree is fairly easy with the " +":meth:`Message.walk ` method. The " +":mod:`!email.iterators` module provides some useful higher level iterations " +"over message object trees." +msgstr "" +"通过 :meth:`Message.walk ` 来迭代消息对象树是相当容易的。 " +":mod:`!email.iterators` 模块提供了一些适用于消息对象树的高层级迭代器。" + +#: ../../library/email.iterators.rst:19 +msgid "" +"This iterates over all the payloads in all the subparts of *msg*, returning " +"the string payloads line-by-line. It skips over all the subpart headers, " +"and it skips over any subpart with a payload that isn't a Python string. " +"This is somewhat equivalent to reading the flat text representation of the " +"message from a file using :meth:`~io.TextIOBase.readline`, skipping over all" +" the intervening headers." +msgstr "" +"此函数会迭代 *msg* 的所有子部分中的所有载荷,逐行返回字符串载荷。它会跳过所有子部分的标头,并且它也会跳过任何包含不为 Python " +"字符串的载荷的子部分。这基本上等价于使用 :meth:`~io.TextIOBase.readline` " +"从一个文件读取消息的纯文本表示形式,并跳过所有中间的标头。" + +#: ../../library/email.iterators.rst:26 +msgid "" +"Optional *decode* is passed through to :meth:`Message.get_payload " +"`." +msgstr "" +"可选的 *decode* 会被传递给 :meth:`Message.get_payload " +"`." + +#: ../../library/email.iterators.rst:32 +msgid "" +"This iterates over all the subparts of *msg*, returning only those subparts " +"that match the MIME type specified by *maintype* and *subtype*." +msgstr "" +"此函数会迭代 *msg* 的所有子部分,只返回其中与 *maintype* 和 *subtype* 所指定的 MIME 类型相匹配的子部分。" + +#: ../../library/email.iterators.rst:35 +msgid "" +"Note that *subtype* is optional; if omitted, then subpart MIME type matching" +" is done only with the main type. *maintype* is optional too; it defaults " +"to :mimetype:`text`." +msgstr "" +"请注意 *subtype* 是可选项;如果省略,则仅使用主类型来进行子部分 MIME 类型的匹配。 *maintype* 也是可选项;它的默认值为 " +":mimetype:`text`." + +#: ../../library/email.iterators.rst:39 +msgid "" +"Thus, by default :func:`typed_subpart_iterator` returns each subpart that " +"has a MIME type of :mimetype:`text/\\*`." +msgstr "" +"因此,在默认情况下 :func:`typed_subpart_iterator` 会返回每一个 MIME 类型为 " +":mimetype:`text/\\*` 的子部分。" + +#: ../../library/email.iterators.rst:43 +msgid "" +"The following function has been added as a useful debugging tool. It should" +" *not* be considered part of the supported public interface for the package." +msgstr "增加了以下函数作为有用的调试工具。它 *不应当* 被视为该包所支持的公共接口的组成部分。" + +#: ../../library/email.iterators.rst:48 +msgid "" +"Prints an indented representation of the content types of the message object" +" structure. For example:" +msgstr "打印消息对象结构的内容类型的缩进表示形式。例如:" + +#: ../../library/email.iterators.rst:57 +msgid "" +">>> msg = email.message_from_file(somefile)\n" +">>> _structure(msg)\n" +"multipart/mixed\n" +" text/plain\n" +" text/plain\n" +" multipart/digest\n" +" message/rfc822\n" +" text/plain\n" +" message/rfc822\n" +" text/plain\n" +" message/rfc822\n" +" text/plain\n" +" message/rfc822\n" +" text/plain\n" +" message/rfc822\n" +" text/plain\n" +" text/plain" +msgstr "" +">>> msg = email.message_from_file(somefile)\n" +">>> _structure(msg)\n" +"multipart/mixed\n" +" text/plain\n" +" text/plain\n" +" multipart/digest\n" +" message/rfc822\n" +" text/plain\n" +" message/rfc822\n" +" text/plain\n" +" message/rfc822\n" +" text/plain\n" +" message/rfc822\n" +" text/plain\n" +" message/rfc822\n" +" text/plain\n" +" text/plain" + +#: ../../library/email.iterators.rst:81 +msgid "" +"Optional *fp* is a file-like object to print the output to. It must be " +"suitable for Python's :func:`print` function. *level* is used internally. " +"*include_default*, if true, prints the default type as well." +msgstr "" +"可选项 *fp* 是一个作为打印输出目标的文件型对象。它必须适用于 Python 的 :func:`print` 函数。 *level* " +"是供内部使用的。 *include_default* 如果为真值,则会同时打印默认类型。" diff --git a/library/email.message.po b/library/email.message.po new file mode 100644 index 0000000000..2f2255a47c --- /dev/null +++ b/library/email.message.po @@ -0,0 +1,1155 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/email.message.rst:2 +msgid ":mod:`!email.message`: Representing an email message" +msgstr ":mod:`!email.message`: 表示电子邮件消息" + +#: ../../library/email.message.rst:10 +msgid "**Source code:** :source:`Lib/email/message.py`" +msgstr "**源代码:** :source:`Lib/email/message.py`" + +#: ../../library/email.message.rst:14 +msgid "[1]_" +msgstr "[1]_" + +#: ../../library/email.message.rst:16 +msgid "" +"The central class in the :mod:`email` package is the :class:`EmailMessage` " +"class, imported from the :mod:`!email.message` module. It is the base class" +" for the :mod:`email` object model. :class:`EmailMessage` provides the core" +" functionality for setting and querying header fields, for accessing message" +" bodies, and for creating or modifying structured messages." +msgstr "" +"处于 :mod:`email` 包的中心地位的类是 :class:`EmailMessage` 类,它导入自 :mod:`!email.message`" +" 模块。 它是 :mod:`email` 对象模型的基类。 :class:`EmailMessage` " +"为设置和查询标头字符、访问消息体,以及创建和修改结构化消息提供了核心功能。" + +#: ../../library/email.message.rst:22 +msgid "" +"An email message consists of *headers* and a *payload* (which is also " +"referred to as the *content*). Headers are :rfc:`5322` or :rfc:`6532` style" +" field names and values, where the field name and value are separated by a " +"colon. The colon is not part of either the field name or the field value. " +"The payload may be a simple text message, or a binary object, or a " +"structured sequence of sub-messages each with their own set of headers and " +"their own payload. The latter type of payload is indicated by the message " +"having a MIME type such as :mimetype:`multipart/\\*` or " +":mimetype:`message/rfc822`." +msgstr "" +"一份电子邮件信息由 *标头* 和 *载荷* (又被称为 *内容* )组成。标头遵循 :rfc:`5322` 或者 :rfc:`6532` " +"风格的字段名和值,字段名和字段值之间由一个冒号隔开。 " +"这个冒号既不属于字段名,也不属于字段值。信息的载荷可能是一段简单的文字消息,也可能是一个二进制的对象,更可能是由多个拥有各自标头和载荷的子信息组成的结构化子信息序列。" +" 对于后者类型的载荷,信息的 MIME 类型将会被指明为诸如 :mimetype:`multipart/\\*` 或 " +":mimetype:`message/rfc822` 的类型。" + +#: ../../library/email.message.rst:31 +msgid "" +"The conceptual model provided by an :class:`EmailMessage` object is that of " +"an ordered dictionary of headers coupled with a *payload* that represents " +"the :rfc:`5322` body of the message, which might be a list of " +"sub-``EmailMessage`` objects. In addition to the normal dictionary methods " +"for accessing the header names and values, there are methods for accessing " +"specialized information from the headers (for example the MIME content " +"type), for operating on the payload, for generating a serialized version of " +"the message, and for recursively walking over the object tree." +msgstr "" +":class:`EmailMessage` 对象所提供的抽象概念模型是一个头字段组成的有序字典加一个代表 :rfc:`5322` 标准的信息体的 " +"*载荷* 。载荷有可能是一系列子 ``EmailMessage`` " +"对象的列表。你除了可以通过一般的字典方法来访问头字段名和值,还可以使用特制方法来访问头的特定字段(比如说 MIME " +"内容类型字段)、操纵载荷、生成信息的序列化版本、递归遍历对象树。" + +#: ../../library/email.message.rst:40 +msgid "" +"The :class:`EmailMessage` dictionary-like interface is indexed by the header" +" names, which must be ASCII values. The values of the dictionary are " +"strings with some extra methods. Headers are stored and returned in case-" +"preserving form, but field names are matched case-insensitively. The keys " +"are ordered, but unlike a real dict, there can be duplicates. Additional " +"methods are provided for working with headers that have duplicate keys." +msgstr "" +":class:`EmailMessage` 字典型接口使用标头名称作为索引,它必须是 ASCII 值。字典的值是包含一些附加方法的字符串。 " +"标头是以保留大小写的形式存储和返回的,但字段名的匹配则是大小写不敏感的。键是保留顺序的,但与真正字典不同的是键可以重复。 " +"提供了一些额外的方法来处理包含重复键的标头。" + +#: ../../library/email.message.rst:47 +msgid "" +"The *payload* is either a string or bytes object, in the case of simple " +"message objects, or a list of :class:`EmailMessage` objects, for MIME " +"container documents such as :mimetype:`multipart/\\*` and " +":mimetype:`message/rfc822` message objects." +msgstr "" +"*载荷* 是多样的。对于简单的信息对象,它是字符串或字节对象;对于诸如 :mimetype:`multipart/\\*` 和 " +":mimetype:`message/rfc822` 信息对象的 MIME 容器文档,它是一个 :class:`EmailMessage` 对象列表。" + +#: ../../library/email.message.rst:55 +msgid "" +"If *policy* is specified use the rules it specifies to update and serialize " +"the representation of the message. If *policy* is not set, use the " +":class:`~email.policy.default` policy, which follows the rules of the email " +"RFCs except for line endings (instead of the RFC mandated ``\\r\\n``, it " +"uses the Python standard ``\\n`` line endings). For more information see " +"the :mod:`~email.policy` documentation. [2]_" +msgstr "" +"如果指定了 *policy* 则使用它所指定的规则来更新和序列化消息的表示形式。如果没有设置 *policy*,则使用 " +":class:`~email.policy.default` 策略,它将遵循电子邮件 RFC 但行结束符除外(不像 RFC 要求用 " +"``\\r\\n``,它将使用 Python 标准的 ``\\n`` 行结束符)。详情参见 :mod:`~email.policy` 文档。 [2]_" + +#: ../../library/email.message.rst:64 +msgid "" +"Return the entire message flattened as a string. When optional *unixfrom* " +"is true, the envelope header is included in the returned string. *unixfrom*" +" defaults to ``False``. For backward compatibility with the base " +":class:`~email.message.Message` class *maxheaderlen* is accepted, but " +"defaults to ``None``, which means that by default the line length is " +"controlled by the :attr:`~email.policy.Policy.max_line_length` of the " +"policy. The *policy* argument may be used to override the default policy " +"obtained from the message instance. This can be used to control some of the" +" formatting produced by the method, since the specified *policy* will be " +"passed to the :class:`~email.generator.Generator`." +msgstr "" +"以一段字符串的形式返回整个消息对象。若可选的 *unixfrom* 为真值,信封头将包括在返回的字符串中。 *unixfrom* 默认为 " +"``False``。为了保持向下兼容基类 :class:`~email.message.Message` 还接受 " +"*maxheaderlen*,但其默认为 ``None``,这意味着在默认情况下行长度将由策略的 " +":attr:`~email.policy.Policy.max_line_length` 来控制。 *policy* " +"参数可以被用于覆盖从消息实例获取到的默认策略。这可以被用来控制该方法所产生的某些格式,因为指定的 *policy* 将被传给 " +":class:`~email.generator.Generator`." + +#: ../../library/email.message.rst:76 ../../library/email.message.rst:114 +msgid "" +"Flattening the message may trigger changes to the :class:`EmailMessage` if " +"defaults need to be filled in to complete the transformation to a string " +"(for example, MIME boundaries may be generated or modified)." +msgstr "" +"扁平化信息可能会对 :class:`EmailMessage` 做出修改。这是因为为了完成向字符串的转换,一些内容需要使用默认值填入(举个例子,MIME" +" 边界字段可能会被生成或被修改)。" + +#: ../../library/email.message.rst:80 +msgid "" +"Note that this method is provided as a convenience and may not be the most " +"useful way to serialize messages in your application, especially if you are " +"dealing with multiple messages. See :class:`email.generator.Generator` for " +"a more flexible API for serializing messages. Note also that this method is" +" restricted to producing messages serialized as \"7 bit clean\" when " +":attr:`~email.policy.EmailPolicy.utf8` is ``False``, which is the default." +msgstr "" +"请注意,这个方法是为了便利而提供,不一定是适合你的应用程序的最理想的序列化信息的方法。这在你处理多封信息的时候尤甚。如果你需要使用更加灵活的 API " +"来序列化信息,请参见 :class:`email.generator.Generator`。同时请注意,当 " +":attr:`~email.policy.EmailPolicy.utf8` 属性为其默认值 ``False`` 的时候,本方法将限制其行为为生成以“7" +" bit clean”方式序列化的信息。" + +#: ../../library/email.message.rst:88 +msgid "" +"the default behavior when *maxheaderlen* is not specified was changed from " +"defaulting to 0 to defaulting to the value of *max_line_length* from the " +"policy." +msgstr "*maxheaderlen* 没有被指定时的默认行为从默认为 0 修改为默认为策略的 *max_line_length* 值。" + +#: ../../library/email.message.rst:95 +msgid "" +"Equivalent to ``as_string(policy=self.policy.clone(utf8=True))``. Allows " +"``str(msg)`` to produce a string containing the serialized message in a " +"readable format." +msgstr "" +"与 ``as_string(policy=self.policy.clone(utf8=True))`` 等价。这将让 ``str(msg)`` " +"产生的字符串包含人类可读的序列化信息内容。" + +#: ../../library/email.message.rst:99 +msgid "" +"the method was changed to use ``utf8=True``, thus producing an " +":rfc:`6531`-like message representation, instead of being a direct alias for" +" :meth:`as_string`." +msgstr "" +"本方法开始使用 ``utf8=True``,而非 :meth:`as_string` 的直接替身。使用 ``utf8=True`` 会产生类似于 " +":rfc:`6531` 的信息表达。" + +#: ../../library/email.message.rst:106 +msgid "" +"Return the entire message flattened as a bytes object. When optional " +"*unixfrom* is true, the envelope header is included in the returned string." +" *unixfrom* defaults to ``False``. The *policy* argument may be used to " +"override the default policy obtained from the message instance. This can be " +"used to control some of the formatting produced by the method, since the " +"specified *policy* will be passed to the " +":class:`~email.generator.BytesGenerator`." +msgstr "" +"以字节串对象的形式返回整个扁平化后的消息。当可选的 *unixfrom* 为真值时,返回的字符串会包含信封标头。 *unixfrom* 的默认值为 " +"``False``。 *policy* 参数可被用于覆盖从消息实例获取的默认 policy。这可被用来控制该方法所产生的部分格式效果,因为指定的 " +"*policy* 将被传递给 :class:`~email.generator.BytesGenerator`。" + +#: ../../library/email.message.rst:118 +msgid "" +"Note that this method is provided as a convenience and may not be the most " +"useful way to serialize messages in your application, especially if you are " +"dealing with multiple messages. See :class:`email.generator.BytesGenerator`" +" for a more flexible API for serializing messages." +msgstr "" +"请注意,这个方法是为了便利而提供,不一定是适合你的应用程序的最理想的序列化信息的方法。这在你处理多封信息的时候尤甚。如果你需要使用更加灵活的 API " +"来序列化信息,请参见 :class:`email.generator.BytesGenerator` ." + +#: ../../library/email.message.rst:127 +msgid "" +"Equivalent to :meth:`.as_bytes`. Allows ``bytes(msg)`` to produce a bytes " +"object containing the serialized message." +msgstr "等价于 :meth:`.as_bytes`。让 ``bytes(msg)`` 产生一个包含已序列化消息的字节串对象。" + +#: ../../library/email.message.rst:133 +msgid "" +"Return ``True`` if the message's payload is a list of sub-\\ " +":class:`EmailMessage` objects, otherwise return ``False``. When " +":meth:`is_multipart` returns ``False``, the payload should be a string " +"object (which might be a CTE encoded binary payload). Note that " +":meth:`is_multipart` returning ``True`` does not necessarily mean that " +"\"msg.get_content_maintype() == 'multipart'\" will return the ``True``. For " +"example, ``is_multipart`` will return ``True`` when the " +":class:`EmailMessage` is of type ``message/rfc822``." +msgstr "" +"如果该信息的载荷是一个子 :class:`EmailMessage` 对象列表,返回 ``True``;否则返回 ``False``。在 " +":meth:`is_multipart` 返回 ``False`` " +"的场合下,载荷应当是一个字符串对象(有可能是一个使用了内容传输编码进行编码的二进制载荷)。请注意, :meth:`is_multipart` 返回 " +"``True`` 不意味着 ``msg.get_content_maintype() == 'multipart'`` 也会返回 ``True`` " +"。举个例子,``is_multipart`` 在 :class:`EmailMessage` 是 ``message/rfc822`` " +"类型的信息的情况下,其返回值也是 ``True``。" + +#: ../../library/email.message.rst:145 +msgid "" +"Set the message's envelope header to *unixfrom*, which should be a string. " +"(See :class:`~mailbox.mboxMessage` for a brief description of this header.)" +msgstr "" +"将信息的信封头设置为 *unixfrom* ,这应当是一个字符串。(在 :class:`~mailbox.mboxMessage` " +"中有关于这个头的一段简短介绍。)" + +#: ../../library/email.message.rst:152 +msgid "" +"Return the message's envelope header. Defaults to ``None`` if the envelope " +"header was never set." +msgstr "返回消息的信封头。如果信封头从未被设置过,默认返回 ``None``。" + +#: ../../library/email.message.rst:156 +msgid "" +"The following methods implement the mapping-like interface for accessing the" +" message's headers. Note that there are some semantic differences between " +"these methods and a normal mapping (i.e. dictionary) interface. For " +"example, in a dictionary there are no duplicate keys, but here there may be " +"duplicate message headers. Also, in dictionaries there is no guaranteed " +"order to the keys returned by :meth:`keys`, but in an :class:`EmailMessage` " +"object, headers are always returned in the order they appeared in the " +"original message, or in which they were added to the message later. Any " +"header deleted and then re-added is always appended to the end of the header" +" list." +msgstr "" +"以下方法实现了对信息的头字段进行访问的类映射接口。请留意,只是类映射接口,这与平常的映射接口(比如说字典映射)有一些语义上的不同。举个例子,在一个字典当中,键之间不可重复,但是信息头字段是可以重复的。不光如此,在字典当中调用" +" :meth:`keys` 方法返回的结果,其顺序没有保证;但是在一个 :class:`EmailMessage` " +"对象当中,返回的头字段永远以其在原信息当中出现的顺序,或以其加入信息的顺序为序。任何删了后又重新加回去的头字段总是添加在当时列表的末尾。" + +#: ../../library/email.message.rst:167 +msgid "" +"These semantic differences are intentional and are biased toward convenience" +" in the most common use cases." +msgstr "这些语义上的不同是刻意而为之的,是出于在绝大多数常见使用情景中都方便的初衷下设计的。" + +#: ../../library/email.message.rst:170 +msgid "" +"Note that in all cases, any envelope header present in the message is not " +"included in the mapping interface." +msgstr "请注意在任何情况下,消息当中的任何封包标头都不会包含在映射接口当中。" + +#: ../../library/email.message.rst:176 +msgid "Return the total number of headers, including duplicates." +msgstr "返回标头的总数,包括重复项。" + +#: ../../library/email.message.rst:181 +msgid "" +"Return ``True`` if the message object has a field named *name*. Matching is " +"done without regard to case and *name* does not include the trailing colon." +" Used for the ``in`` operator. For example::" +msgstr "" +"如果消息对象中有一个名为 *name* 的字段,其返回值为 ``True``。匹配无视大小写差异, *name* 也不包含末尾的冒号。``in`` " +"操作符的实现中用到了这个方法,比如说::" + +#: ../../library/email.message.rst:185 +msgid "" +"if 'message-id' in myMessage:\n" +" print('Message-ID:', myMessage['message-id'])" +msgstr "" +"if 'message-id' in myMessage:\n" +" print('Message-ID:', myMessage['message-id'])" + +#: ../../library/email.message.rst:191 +msgid "" +"Return the value of the named header field. *name* does not include the " +"colon field separator. If the header is missing, ``None`` is returned; a " +":exc:`KeyError` is never raised." +msgstr "" +"返回头字段名对应的字段值。 *name* 不含冒号分隔符。如果字段未找到,返回 ``None``。 :exc:`KeyError` 异常永不抛出。" + +#: ../../library/email.message.rst:195 +msgid "" +"Note that if the named field appears more than once in the message's " +"headers, exactly which of those field values will be returned is undefined." +" Use the :meth:`get_all` method to get the values of all the extant headers" +" named *name*." +msgstr "" +"请注意,如果对应名字的字段找到了多个,具体返回哪个字段值是未定义的。请使用 :meth:`get_all` 方法获取当前匹配字段名的所有字段值。" + +#: ../../library/email.message.rst:200 +msgid "" +"Using the standard (non-``compat32``) policies, the returned value is an " +"instance of a subclass of :class:`email.headerregistry.BaseHeader`." +msgstr "" +"使用标准策略 (非 ``compat32``) 时,返回值是 :class:`email.headerregistry.BaseHeader` " +"的某个子类的一个实例。" + +#: ../../library/email.message.rst:206 +msgid "" +"Add a header to the message with field name *name* and value *val*. The " +"field is appended to the end of the message's existing headers." +msgstr "在信息头中添加名为 *name* 值为 *val* 的字段。这个字段会被添加在已有字段列表的结尾处。" + +#: ../../library/email.message.rst:209 +msgid "" +"Note that this does *not* overwrite or delete any existing header with the " +"same name. If you want to ensure that the new header is the only one " +"present in the message with field name *name*, delete the field first, " +"e.g.::" +msgstr "" +"请注意,这个方法 *既不会* 覆盖 *也不会* 删除任何字段名重名的已有字段。如果你确实想保证新字段是整个信息头当中唯一拥有 *name* " +"字段名的字段,你需要先把旧字段删除。例如::" + +#: ../../library/email.message.rst:213 +msgid "" +"del msg['subject']\n" +"msg['subject'] = 'Python roolz!'" +msgstr "" +"del msg['subject']\n" +"msg['subject'] = 'Python roolz!'" + +#: ../../library/email.message.rst:216 +msgid "" +"If the :mod:`policy ` defines certain headers to be unique (as" +" the standard policies do), this method may raise a :exc:`ValueError` when " +"an attempt is made to assign a value to such a header when one already " +"exists. This behavior is intentional for consistency's sake, but do not " +"depend on it as we may choose to make such assignments do an automatic " +"deletion of the existing header in the future." +msgstr "" +"如果 :mod:`policy ` " +"将特定标头定义为唯一的(就像标准策略所做的一样),则当这样的标头已存在时试图为其赋值此方法会引发 :exc:`ValueError`。 " +"采取此种行为是出于保持一致性的考量,但不能依赖它因为在未来我们可能会选择让这样的赋值操作自动删除现有的标头。" + +#: ../../library/email.message.rst:226 +msgid "" +"Delete all occurrences of the field with name *name* from the message's " +"headers. No exception is raised if the named field isn't present in the " +"headers." +msgstr "删除信息头当中字段名匹配 *name* 的所有字段。如果匹配指定名称的字段没有找到,也不会抛出任何异常。" + +#: ../../library/email.message.rst:233 +msgid "Return a list of all the message's header field names." +msgstr "以列表形式返回消息头中所有的字段名。" + +#: ../../library/email.message.rst:238 +msgid "Return a list of all the message's field values." +msgstr "以列表形式返回消息头中所有的字段值。" + +#: ../../library/email.message.rst:243 +msgid "" +"Return a list of 2-tuples containing all the message's field headers and " +"values." +msgstr "以二元元组的列表形式返回消息头中所有的字段名和字段值。" + +#: ../../library/email.message.rst:249 +msgid "" +"Return the value of the named header field. This is identical to " +":meth:`~object.__getitem__` except that optional *failobj* is returned if " +"the named header is missing (*failobj* defaults to ``None``)." +msgstr "" +"返回对应标头字段名的值。这个方法与 :meth:`~object.__getitem__` 是一样的,只是如果对应标头不存在则返回可选的 " +"*failobj* (*failobj* 默认为 ``None``)。" + +#: ../../library/email.message.rst:254 +msgid "Here are some additional useful header related methods:" +msgstr "以下是一些与头有关的更多有用方法:" + +#: ../../library/email.message.rst:259 +msgid "" +"Return a list of all the values for the field named *name*. If there are no " +"such named headers in the message, *failobj* is returned (defaults to " +"``None``)." +msgstr "返回字段名为 *name* 的所有字段值的列表。如果信息内不存在匹配的字段,返回 *failobj* (其默认值为 ``None``)。" + +#: ../../library/email.message.rst:266 +msgid "" +"Extended header setting. This method is similar to :meth:`__setitem__` " +"except that additional header parameters can be provided as keyword " +"arguments. *_name* is the header field to add and *_value* is the *primary*" +" value for the header." +msgstr "" +"高级头字段设定。这个方法与 :meth:`__setitem__` 类似,不过你可以使用关键字参数为字段提供附加参数。 *_name* 是字段名, " +"*_value* 是字段 *主* 值。" + +#: ../../library/email.message.rst:271 +msgid "" +"For each item in the keyword argument dictionary *_params*, the key is taken" +" as the parameter name, with underscores converted to dashes (since dashes " +"are illegal in Python identifiers). Normally, the parameter will be added " +"as ``key=\"value\"`` unless the value is ``None``, in which case only the " +"key will be added." +msgstr "" +"对于关键字参数字典 *_params* 的每个键值对而言,它的键被用作参数的名字,其中下划线被替换为短横杠(毕竟短横杠不是合法的 Python " +"标识符)。一般来讲,参数以 ``键=\"值\"`` 的方式添加,除非值是 ``None``。要真的是这样的话,只有键会被添加。" + +#: ../../library/email.message.rst:277 +msgid "" +"If the value contains non-ASCII characters, the charset and language may be " +"explicitly controlled by specifying the value as a three tuple in the format" +" ``(CHARSET, LANGUAGE, VALUE)``, where ``CHARSET`` is a string naming the " +"charset to be used to encode the value, ``LANGUAGE`` can usually be set to " +"``None`` or the empty string (see :rfc:`2231` for other possibilities), and " +"``VALUE`` is the string value containing non-ASCII code points. If a three " +"tuple is not passed and the value contains non-ASCII characters, it is " +"automatically encoded in :rfc:`2231` format using a ``CHARSET`` of ``utf-8``" +" and a ``LANGUAGE`` of ``None``." +msgstr "" +"如果值含有非 ASCII 字符,你可以将值写成 ``(CHARSET, LANGUAGE, VALUE)`` " +"形式的三元组,这样你可以人为控制字符的字符集和语言。``CHARSET`` 是一个字符串,它为你的值的编码命名;``LANGUAGE`` " +"一般可以直接设为 ``None``,也可以直接设为空字符串 (其他可能取值参见 :rfc:`2231`);``VALUE`` 是一个字符串值,其包含非 " +"ASCII 的码点。如果你没有使用三元组,你的字符串又含有非 ASCII 字符,那么它就会使用 :rfc:`2231` 中, ``CHARSET`` 为" +" ``utf-8``,``LANGUAGE`` 为 ``None`` 的格式编码。" + +#: ../../library/email.message.rst:287 +msgid "Here is an example::" +msgstr "例如::" + +#: ../../library/email.message.rst:289 +msgid "" +"msg.add_header('Content-Disposition', 'attachment', filename='bud.gif')" +msgstr "" +"msg.add_header('Content-Disposition', 'attachment', filename='bud.gif')" + +#: ../../library/email.message.rst:291 +msgid "This will add a header that looks like ::" +msgstr "会添加一个形如下文的头字段::" + +#: ../../library/email.message.rst:293 +msgid "Content-Disposition: attachment; filename=\"bud.gif\"" +msgstr "Content-Disposition: attachment; filename=\"bud.gif\"" + +#: ../../library/email.message.rst:295 +msgid "An example of the extended interface with non-ASCII characters::" +msgstr "带有非 ASCII 字符的扩展接口::" + +#: ../../library/email.message.rst:297 +msgid "" +"msg.add_header('Content-Disposition', 'attachment',\n" +" filename=('iso-8859-1', '', 'Fußballer.ppt'))" +msgstr "" +"msg.add_header('Content-Disposition', 'attachment',\n" +" filename=('iso-8859-1', '', 'Fußballer.ppt'))" + +#: ../../library/email.message.rst:303 +msgid "" +"Replace a header. Replace the first header found in the message that " +"matches *_name*, retaining header order and field name case of the original " +"header. If no matching header is found, raise a :exc:`KeyError`." +msgstr "" +"替换头字段。只会替换掉信息内找到的第一个字段名匹配 *_name* 的字段值。字段的顺序不变,原字段名的大小写也不变。如果没有找到匹配的字段,抛出 " +":exc:`KeyError` 异常。" + +#: ../../library/email.message.rst:311 +msgid "" +"Return the message's content type, coerced to lower case of the form " +":mimetype:`maintype/subtype`. If there is no :mailheader:`Content-Type` " +"header in the message return the value returned by :meth:`get_default_type`." +" If the :mailheader:`Content-Type` header is invalid, return " +"``text/plain``." +msgstr "" +"返回信息的内容类型,其形如 :mimetype:`maintype/subtype`,强制全小写。如果信息的 :mailheader:`Content-" +"Type` 头字段不存在则返回 :meth:`get_default_type` 的返回值;如果信息的 :mailheader:`Content-" +"Type` 头字段无效则返回 ``text/plain``。" + +#: ../../library/email.message.rst:317 +msgid "" +"(According to :rfc:`2045`, messages always have a default type, " +":meth:`get_content_type` will always return a value. :rfc:`2045` defines a " +"message's default type to be :mimetype:`text/plain` unless it appears inside" +" a :mimetype:`multipart/digest` container, in which case it would be " +":mimetype:`message/rfc822`. If the :mailheader:`Content-Type` header has an" +" invalid type specification, :rfc:`2045` mandates that the default type be " +":mimetype:`text/plain`.)" +msgstr "" +"(根据 :rfc:`2045` 所述,信息永远都有一个默认类型,所以 :meth:`get_content_type` 一定会返回一个值。 " +":rfc:`2045` 定义信息的默认类型为 :mimetype:`text/plain` 或 :mimetype:`message/rfc822` " +",其中后者仅出现在消息头位于一个 :mimetype:`multipart/digest` 容器中的场合中。如果消息头的 " +":mailheader:`Content-Type` 字段所指定的类型是无效的, :rfc:`2045` 令其默认类型为 " +":mimetype:`text/plain` .)" + +#: ../../library/email.message.rst:328 +msgid "" +"Return the message's main content type. This is the :mimetype:`maintype` " +"part of the string returned by :meth:`get_content_type`." +msgstr "" +"返回信息的主要内容类型。准确来说,此方法返回的是 :meth:`get_content_type` 方法所返回的形如 " +":mimetype:`maintype/subtype` 的字符串当中的 :mimetype:`maintype` 部分。" + +#: ../../library/email.message.rst:334 +msgid "" +"Return the message's sub-content type. This is the :mimetype:`subtype` part" +" of the string returned by :meth:`get_content_type`." +msgstr "" +"返回信息的子内容类型。准确来说,此方法返回的是 :meth:`get_content_type` 方法所返回的形如 " +":mimetype:`maintype/subtype` 的字符串当中的 :mimetype:`subtype` 部分。" + +#: ../../library/email.message.rst:340 +msgid "" +"Return the default content type. Most messages have a default content type " +"of :mimetype:`text/plain`, except for messages that are subparts of " +":mimetype:`multipart/digest` containers. Such subparts have a default " +"content type of :mimetype:`message/rfc822`." +msgstr "" +"返回默认的内容类型。绝大多数的信息,其默认内容类型都是 :mimetype:`text/plain`。作为 " +":mimetype:`multipart/digest` 容器内子部分的信息除外,它们的默认内容类型是 " +":mimetype:`message/rfc822` ." + +#: ../../library/email.message.rst:348 +msgid "" +"Set the default content type. *ctype* should either be " +":mimetype:`text/plain` or :mimetype:`message/rfc822`, although this is not " +"enforced. The default content type is not stored in the " +":mailheader:`Content-Type` header, so it only affects the return value of " +"the ``get_content_type`` methods when no :mailheader:`Content-Type` header " +"is present in the message." +msgstr "" +"设置默认的内容类型。尽管并非强制,但是 *ctype* 仍应当是 :mimetype:`text/plain` 或 " +":mimetype:`message/rfc822` 二者取一。默认内容类型并不存储在 :mailheader:`Content-Type` " +"头字段当中,所以设置此项的唯一作用就是决定当 :mailheader:`Content-Type` " +"头字段在信息中不存在时,``get_content_type`` 方法的返回值。" + +#: ../../library/email.message.rst:359 +msgid "" +"Set a parameter in the :mailheader:`Content-Type` header. If the parameter " +"already exists in the header, replace its value with *value*. When *header* " +"is ``Content-Type`` (the default) and the header does not yet exist in the " +"message, add it, set its value to :mimetype:`text/plain`, and append the new" +" parameter value. Optional *header* specifies an alternative header to " +":mailheader:`Content-Type`." +msgstr "" +"在 :mailheader:`Content-Type` 头字段当中设置一个参数。 如果该参数已于字段中存在,将其旧值替换为 *value* 。 如果 " +"*header* 是 ``Content-Type`` (默认值),并且该头字段于信息中尚未存在,则会先添加该字段,将其值设置为 " +":mimetype:`text/plain`,并附加参数值。 可选的 *header* 可以让你指定 :mailheader:`Content-" +"Type` 之外的另一个头字段。" + +#: ../../library/email.message.rst:366 +msgid "" +"If the value contains non-ASCII characters, the charset and language may be " +"explicitly specified using the optional *charset* and *language* parameters." +" Optional *language* specifies the :rfc:`2231` language, defaulting to the " +"empty string. Both *charset* and *language* should be strings. The default" +" is to use the ``utf8`` *charset* and ``None`` for the *language*." +msgstr "" +"如果值包含非 ASCII 字符,其字符集和语言可以通过可选参数 *charset* 和 *language* 显式指定。可选参数 *language* " +"指定 :rfc:`2231` 当中的语言,其默认值是空字符串。 *charset* 和 *language* 都应当是字符串。默认使用的是 " +"``utf8`` *charset* ,*language* 为 ``None``。" + +#: ../../library/email.message.rst:373 +msgid "" +"If *replace* is ``False`` (the default) the header is moved to the end of " +"the list of headers. If *replace* is ``True``, the header will be updated " +"in place." +msgstr "" +"如果 *replace* 为 ``False`` (默认值),该头字段会被移动到所有头字段列表的末尾。如果 *replace* 为 ``True`` " +",字段会被原地更新。" + +#: ../../library/email.message.rst:377 ../../library/email.message.rst:394 +msgid "" +"Use of the *requote* parameter with :class:`EmailMessage` objects is " +"deprecated." +msgstr "于 :class:`EmailMessage` 对象而言, *requote* 参数已被弃用。" + +#: ../../library/email.message.rst:380 +msgid "" +"Note that existing parameter values of headers may be accessed through the " +":attr:`~email.headerregistry.ParameterizedMIMEHeader.params` attribute of " +"the header value (for example, ``msg['Content-Type'].params['charset']``)." +msgstr "" +"请注意标头现有的参数值可以通过标头值的 " +":attr:`~email.headerregistry.ParameterizedMIMEHeader.params` 属性来访问 (例如 " +"``msg['Content-Type'].params['charset']``)." + +#: ../../library/email.message.rst:384 +msgid "``replace`` keyword was added." +msgstr "添加了 ``replace`` 关键字。" + +#: ../../library/email.message.rst:389 +msgid "" +"Remove the given parameter completely from the :mailheader:`Content-Type` " +"header. The header will be re-written in place without the parameter or its" +" value. Optional *header* specifies an alternative to :mailheader:`Content-" +"Type`." +msgstr "" +"从 :mailheader:`Content-Type` 头字段中完全移去给定的参数。头字段会被原地重写,重写后的字段不含参数和值。可选的 " +"*header* 可以让你指定 :mailheader:`Content-Type` 之外的另一个字段。" + +#: ../../library/email.message.rst:400 +msgid "" +"Return the value of the ``filename`` parameter of the :mailheader:`Content-" +"Disposition` header of the message. If the header does not have a " +"``filename`` parameter, this method falls back to looking for the ``name`` " +"parameter on the :mailheader:`Content-Type` header. If neither is found, or" +" the header is missing, then *failobj* is returned. The returned string will" +" always be unquoted as per :func:`email.utils.unquote`." +msgstr "" +"返回信息头当中 :mailheader:`Content-Disposition` 字段当中名为 ``filename`` " +"的参数值。如果该字段当中没有此参数,该方法会退而寻找 :mailheader:`Content-Type` 字段当中的 ``name`` " +"参数值。如果这个也没有找到,或者这些个字段压根就不存在,返回 *failobj* 。返回的字符串永远按照 " +":func:`email.utils.unquote` 方法去除引号。" + +#: ../../library/email.message.rst:411 +msgid "" +"Return the value of the ``boundary`` parameter of the :mailheader:`Content-" +"Type` header of the message, or *failobj* if either the header is missing, " +"or has no ``boundary`` parameter. The returned string will always be " +"unquoted as per :func:`email.utils.unquote`." +msgstr "" +"返回信息头当中 :mailheader:`Content-Type` 字段当中名为 ``boundary`` " +"的参数值。如果字段当中没有此参数,或者这些个字段压根就不存在,返回 *failobj* 。返回的字符串永远按照 " +":func:`email.utils.unquote` 方法去除引号。" + +#: ../../library/email.message.rst:419 +msgid "" +"Set the ``boundary`` parameter of the :mailheader:`Content-Type` header to " +"*boundary*. :meth:`set_boundary` will always quote *boundary* if necessary." +" A :exc:`~email.errors.HeaderParseError` is raised if the message object " +"has no :mailheader:`Content-Type` header." +msgstr "" +"将 :mailheader:`Content-Type` 头字段的 ``boundary`` 参数设置为 *boundary* 。 " +":meth:`set_boundary` 方法永远都会在必要的时候为 *boundary* 添加引号。如果信息对象中没有 " +":mailheader:`Content-Type` 头字段,抛出 :exc:`~email.errors.HeaderParseError` 异常。" + +#: ../../library/email.message.rst:424 +msgid "" +"Note that using this method is subtly different from deleting the old " +":mailheader:`Content-Type` header and adding a new one with the new boundary" +" via :meth:`add_header`, because :meth:`set_boundary` preserves the order of" +" the :mailheader:`Content-Type` header in the list of headers." +msgstr "" +"请注意使用这个方法与直接删除旧的 :mailheader:`Content-Type` 头字段然后使用 :meth:`add_header` " +"方法添加一个带有新边界值参数的 :mailheader:`Content-Type` 头字段有细微差距。 :meth:`set_boundary` " +"方法会保留 :mailheader:`Content-Type` 头字段在原信息头当中的位置。" + +#: ../../library/email.message.rst:433 +msgid "" +"Return the ``charset`` parameter of the :mailheader:`Content-Type` header, " +"coerced to lower case. If there is no :mailheader:`Content-Type` header, or" +" if that header has no ``charset`` parameter, *failobj* is returned." +msgstr "" +"返回 :mailheader:`Content-Type` 头字段中的 ``charset`` " +"参数,强制小写。如果字段当中没有此参数,或者这个字段压根不存在,返回 *failobj* 。" + +#: ../../library/email.message.rst:440 +msgid "" +"Return a list containing the character set names in the message. If the " +"message is a :mimetype:`multipart`, then the list will contain one element " +"for each subpart in the payload, otherwise, it will be a list of length 1." +msgstr "" +"返回一个包含了信息内所有字符集名字的列表。如果信息是 :mimetype:`multipart` " +"类型的,那么列表当中的每一项都对应其载荷的子部分的字符集名字。否则,该列表是一个长度为 1 的列表。" + +#: ../../library/email.message.rst:444 +msgid "" +"Each item in the list will be a string which is the value of the ``charset``" +" parameter in the :mailheader:`Content-Type` header for the represented " +"subpart. If the subpart has no :mailheader:`Content-Type` header, no " +"``charset`` parameter, or is not of the :mimetype:`text` main MIME type, " +"then that item in the returned list will be *failobj*." +msgstr "" +"列表当中的每一项都是一个字符串,其值为对应子部分的 :mailheader:`Content-Type` 头字段的 ``charset`` " +"参数值。如果该子部分没有此头字段,或者没有此参数,或者其主要 MIME 类型并非 :mimetype:`text`,那么列表中的那一项即为 " +"*failobj* ." + +#: ../../library/email.message.rst:453 +msgid "" +"Return ``True`` if there is a :mailheader:`Content-Disposition` header and " +"its (case insensitive) value is ``attachment``, ``False`` otherwise." +msgstr "" +"如果信息头当中存在一个名为 :mailheader:`Content-Disposition` 的字段,且该字段的值为 ``attachment`` " +"(大小写无关),返回 ``True``。否则,返回 ``False``。" + +#: ../../library/email.message.rst:456 +msgid "" +"is_attachment is now a method instead of a property, for consistency with " +":meth:`~email.message.Message.is_multipart`." +msgstr "" +"为了与 :meth:`~email.message.Message.is_multipart` 方法一致,is_attachment " +"现在是一个方法,不再是属性了。" + +#: ../../library/email.message.rst:463 +msgid "" +"Return the lowercased value (without parameters) of the message's " +":mailheader:`Content-Disposition` header if it has one, or ``None``. The " +"possible values for this method are *inline*, *attachment* or ``None`` if " +"the message follows :rfc:`2183`." +msgstr "" +"如果信息的 :mailheader:`Content-Disposition` 头字段存在,返回其字段值;否则返回 ``None`` " +"。返回的值均为小写,不包含参数。如果信息遵循 :rfc:`2183` 标准,则此方法的返回值只可能在 *inline* 、 *attachment* 和" +" ``None`` 之间选择。" + +#: ../../library/email.message.rst:471 +msgid "" +"The following methods relate to interrogating and manipulating the content " +"(payload) of the message." +msgstr "下列方法与信息内容(载荷)之访问与操控有关。" + +#: ../../library/email.message.rst:477 +msgid "" +"The :meth:`walk` method is an all-purpose generator which can be used to " +"iterate over all the parts and subparts of a message object tree, in depth-" +"first traversal order. You will typically use :meth:`walk` as the iterator " +"in a ``for`` loop; each iteration returns the next subpart." +msgstr "" +":meth:`walk` 方法是一个多功能生成器。它可以被用来以深度优先顺序遍历信息对象树的所有部分和子部分。一般而言, :meth:`walk` " +"会被用作 ``for`` 循环的迭代器,每一次迭代都返回其下一个子部分。" + +#: ../../library/email.message.rst:482 +msgid "" +"Here's an example that prints the MIME type of every part of a multipart " +"message structure:" +msgstr "以下例子会打印出一封具有多部分结构之信息的每个部分的 MIME 类型。" + +#: ../../library/email.message.rst:491 +msgid "" +">>> for part in msg.walk():\n" +"... print(part.get_content_type())\n" +"multipart/report\n" +"text/plain\n" +"message/delivery-status\n" +"text/plain\n" +"text/plain\n" +"message/rfc822\n" +"text/plain" +msgstr "" +">>> for part in msg.walk():\n" +"... print(part.get_content_type())\n" +"multipart/report\n" +"text/plain\n" +"message/delivery-status\n" +"text/plain\n" +"text/plain\n" +"message/rfc822\n" +"text/plain" + +#: ../../library/email.message.rst:503 +msgid "" +"``walk`` iterates over the subparts of any part where :meth:`is_multipart` " +"returns ``True``, even though ``msg.get_content_maintype() == 'multipart'`` " +"may return ``False``. We can see this in our example by making use of the " +"``_structure`` debug helper function:" +msgstr "" +"``walk`` 会遍历所有 :meth:`is_multipart` 方法返回 ``True`` 的部分之子部分,哪怕 " +"``msg.get_content_maintype() == 'multipart'`` 返回的是 ``False``。使用 " +"``_structure`` 除错帮助函数可以帮助我们在下面这个例子当中看清楚这一点:" + +#: ../../library/email.message.rst:509 +msgid "" +">>> from email.iterators import _structure\n" +">>> for part in msg.walk():\n" +"... print(part.get_content_maintype() == 'multipart',\n" +"... part.is_multipart())\n" +"True True\n" +"False False\n" +"False True\n" +"False False\n" +"False False\n" +"False True\n" +"False False\n" +">>> _structure(msg)\n" +"multipart/report\n" +" text/plain\n" +" message/delivery-status\n" +" text/plain\n" +" text/plain\n" +" message/rfc822\n" +" text/plain" +msgstr "" +">>> from email.iterators import _structure\n" +">>> for part in msg.walk():\n" +"... print(part.get_content_maintype() == 'multipart',\n" +"... part.is_multipart())\n" +"True True\n" +"False False\n" +"False True\n" +"False False\n" +"False False\n" +"False True\n" +"False False\n" +">>> _structure(msg)\n" +"multipart/report\n" +" text/plain\n" +" message/delivery-status\n" +" text/plain\n" +" text/plain\n" +" message/rfc822\n" +" text/plain" + +#: ../../library/email.message.rst:531 +msgid "" +"Here the ``message`` parts are not ``multiparts``, but they do contain " +"subparts. ``is_multipart()`` returns ``True`` and ``walk`` descends into the" +" subparts." +msgstr "" +"在这里,``message`` 的部分并非 ``multiparts``,但是它们真的包含子部分!``is_multipart()`` 返回 " +"``True``,``walk`` 也深入进这些子部分中。" + +#: ../../library/email.message.rst:538 +msgid "" +"Return the MIME part that is the best candidate to be the \"body\" of the " +"message." +msgstr "返回信息的 MIME 部分。这个部分是最可能成为信息体的部分。" + +#: ../../library/email.message.rst:541 +msgid "" +"*preferencelist* must be a sequence of strings from the set ``related``, " +"``html``, and ``plain``, and indicates the order of preference for the " +"content type of the part returned." +msgstr "" +"*preferencelist* 必须是一个字符串序列,其内容从 ``related``、``html`` 和 ``plain`` " +"这三者组成的集合中选取。这个序列代表着返回的部分的内容类型之偏好。" + +#: ../../library/email.message.rst:545 +msgid "" +"Start looking for candidate matches with the object on which the " +"``get_body`` method is called." +msgstr "在 ``get_body`` 方法被调用的对象上寻找匹配的候选者。" + +#: ../../library/email.message.rst:548 +msgid "" +"If ``related`` is not included in *preferencelist*, consider the root part " +"(or subpart of the root part) of any related encountered as a candidate if " +"the (sub-)part matches a preference." +msgstr "" +"如果 ``related`` 未包括在 *preferencelist* " +"中,可考虑将所遇到的任意相关的根部分(或根部分的子部分)在该(子)部分与一个首选项相匹配时作为候选项。" + +#: ../../library/email.message.rst:552 +msgid "" +"When encountering a ``multipart/related``, check the ``start`` parameter and" +" if a part with a matching :mailheader:`Content-ID` is found, consider only " +"it when looking for candidate matches. Otherwise consider only the first " +"(default root) part of the ``multipart/related``." +msgstr "" +"当遇到一个 ``multipart/related`` 时,将检查 ``start`` 参数并且如果找到了一个匹配 " +":mailheader:`Content-ID` 的部分,在查找候选匹配时只考虑它。在其他情况下则只考虑 ``multipart/related`` " +"的第一个(默认的根)部分。" + +#: ../../library/email.message.rst:557 +msgid "" +"If a part has a :mailheader:`Content-Disposition` header, only consider the " +"part a candidate match if the value of the header is ``inline``." +msgstr "" +"如果一个部分具有 :mailheader:`Content-Disposition` 标头,则当标头值为 ``inline`` " +"时将只考虑将该部分作为候选匹配。" + +#: ../../library/email.message.rst:560 +msgid "" +"If none of the candidates matches any of the preferences in " +"*preferencelist*, return ``None``." +msgstr "如果没有任何候选部分匹配 *preferencelist* 中的任何首选项,则返回 ``None``。" + +#: ../../library/email.message.rst:563 +msgid "" +"Notes: (1) For most applications the only *preferencelist* combinations that" +" really make sense are ``('plain',)``, ``('html', 'plain')``, and the " +"default ``('related', 'html', 'plain')``. (2) Because matching starts with " +"the object on which ``get_body`` is called, calling ``get_body`` on a " +"``multipart/related`` will return the object itself unless *preferencelist* " +"has a non-default value. (3) Messages (or message parts) that do not specify" +" a :mailheader:`Content-Type` or whose :mailheader:`Content-Type` header is " +"invalid will be treated as if they are of type ``text/plain``, which may " +"occasionally cause ``get_body`` to return unexpected results." +msgstr "" +"注:(1)对于大多数应用来说有意义的 *preferencelist* 组合仅有 ``('plain',)``, ``('html', " +"'plain')`` 以及默认的 ``('related', 'html', 'plain')``。(2)由于匹配是从调用 ``get_body`` " +"的对象开始的,因此在 ``multipart/related`` 上调用 ``get_body`` 将返回对象本身,除非 " +"*preferencelist* 具有非默认值。(3)未指定 :mailheader:`Content-Type` 或者 " +":mailheader:`Content-Type` 标头无效的消息(或消息部分)将被当作具有 ``text/plain`` 类型来处理,这有时可能导致" +" ``get_body`` 返回非预期的结果。" + +#: ../../library/email.message.rst:577 +msgid "" +"Return an iterator over all of the immediate sub-parts of the message that " +"are not candidate \"body\" parts. That is, skip the first occurrence of " +"each of ``text/plain``, ``text/html``, ``multipart/related``, or " +"``multipart/alternative`` (unless they are explicitly marked as attachments " +"via :mailheader:`Content-Disposition: attachment`), and return all remaining" +" parts. When applied directly to a ``multipart/related``, return an " +"iterator over the all the related parts except the root part (ie: the part " +"pointed to by the ``start`` parameter, or the first part if there is no " +"``start`` parameter or the ``start`` parameter doesn't match the " +":mailheader:`Content-ID` of any of the parts). When applied directly to a " +"``multipart/alternative`` or a non-``multipart``, return an empty iterator." +msgstr "" +" 部分的消息的直接子部分的迭代器。也就是说,跳过首次出现的每个 ``text/plain``, ``text/html``, " +"``multipart/related`` 或 ``multipart/alternative`` (除非通过 " +":mailheader:`Content-Disposition: attachment` 将它们显式地标记为附件),并返回所有的其余部分。 " +"当直接应用于 ``multipart/related`` 时,将返回包含除根部分之外所有相关部分的迭代器(即由 ``start`` " +"参数所指向的部分,或者当没有 ``start`` 参数或 ``start`` 参数不能匹配任何部分的 :mailheader:`Content-ID` " +"时则为第一部分)。当直接应用于 ``multipart/alternative`` 或非 ``multipart`` 时,将返回一个空迭代器。" + +#: ../../library/email.message.rst:593 +msgid "" +"Return an iterator over all of the immediate sub-parts of the message, which" +" will be empty for a non-``multipart``. (See also " +":meth:`~email.message.EmailMessage.walk`.)" +msgstr "" +"返回包含消息的所有直接子部分的迭代器,对于非 ``multipart`` 将为空对象。 (另请参阅 " +":meth:`~email.message.EmailMessage.walk`.)" + +#: ../../library/email.message.rst:600 +msgid "" +"Call the :meth:`~email.contentmanager.ContentManager.get_content` method of " +"the *content_manager*, passing self as the message object, and passing along" +" any other arguments or keywords as additional arguments. If " +"*content_manager* is not specified, use the ``content_manager`` specified by" +" the current :mod:`~email.policy`." +msgstr "" +"调用 *content_manager* 的 " +":meth:`~email.contentmanager.ContentManager.get_content` " +"方法,将自身作为消息对象传入,并将其他参数或关键字作为额外参数传入。如果未指定 *content_manager*,则会使用当前 " +":mod:`~email.policy` 所指定的 ``content_manager``。" + +#: ../../library/email.message.rst:609 +msgid "" +"Call the :meth:`~email.contentmanager.ContentManager.set_content` method of " +"the *content_manager*, passing self as the message object, and passing along" +" any other arguments or keywords as additional arguments. If " +"*content_manager* is not specified, use the ``content_manager`` specified by" +" the current :mod:`~email.policy`." +msgstr "" +"调用 *content_manager* 的 " +":meth:`~email.contentmanager.ContentManager.set_content` " +"方法,将自身作为消息传入,并将其他参数或关键字作为额外参数传入。如果未指定 *content_manager*,则会使用当前 " +":mod:`~email.policy` 所指定的 ``content_manager``。" + +#: ../../library/email.message.rst:618 +msgid "" +"Convert a non-``multipart`` message into a ``multipart/related`` message, " +"moving any existing :mailheader:`Content-` headers and payload into a (new) " +"first part of the ``multipart``. If *boundary* is specified, use it as the " +"boundary string in the multipart, otherwise leave the boundary to be " +"automatically created when it is needed (for example, when the message is " +"serialized)." +msgstr "" +"将非 ``multipart`` 消息转换为 ``multipart/related`` 消息,将任何现有的 " +":mailheader:`Content-` 标头和载荷移入 ``multipart`` 的(新加)首部分。如果指定了 *boundary*,会用它作为" +" multipart 中的分界字符串,否则会在必要时自动创建分界(例如当消息被序列化时)。" + +#: ../../library/email.message.rst:628 +msgid "" +"Convert a non-``multipart`` or a ``multipart/related`` into a " +"``multipart/alternative``, moving any existing :mailheader:`Content-` " +"headers and payload into a (new) first part of the ``multipart``. If " +"*boundary* is specified, use it as the boundary string in the multipart, " +"otherwise leave the boundary to be automatically created when it is needed " +"(for example, when the message is serialized)." +msgstr "" +"将非 ``multipart`` 或 ``multipart/related`` 转换为 " +"``multipart/alternative``,将任何现有的 :mailheader:`Content-` 标头和载荷移入 " +"``multipart`` 的(新加)首部分。如果指定了 *boundary*,会用它作为 multipart " +"中的分界字符串,否则会在必要时自动创建分界(例如当消息被序列化时)。" + +#: ../../library/email.message.rst:638 +msgid "" +"Convert a non-``multipart``, a ``multipart/related``, or a ``multipart-" +"alternative`` into a ``multipart/mixed``, moving any existing " +":mailheader:`Content-` headers and payload into a (new) first part of the " +"``multipart``. If *boundary* is specified, use it as the boundary string in" +" the multipart, otherwise leave the boundary to be automatically created " +"when it is needed (for example, when the message is serialized)." +msgstr "" +"将非 ``multipart``, ``multipart/related`` 或 ``multipart-alternative`` 转换为 " +"``multipart/mixed``,将任何现有的 :mailheader:`Content-` 标头和载荷移入 ``multipart`` " +"的(新加)首部分。如果指定了 *boundary*,会用它作为 multipart 中的分界字符串,否则会在必要时自动创建分界(例如当消息被序列化时)。" + +#: ../../library/email.message.rst:648 +msgid "" +"If the message is a ``multipart/related``, create a new message object, pass" +" all of the arguments to its :meth:`set_content` method, and " +":meth:`~email.message.Message.attach` it to the ``multipart``. If the " +"message is a non-``multipart``, call :meth:`make_related` and then proceed " +"as above. If the message is any other type of ``multipart``, raise a " +":exc:`TypeError`. If *content_manager* is not specified, use the " +"``content_manager`` specified by the current :mod:`~email.policy`. If the " +"added part has no :mailheader:`Content-Disposition` header, add one with the" +" value ``inline``." +msgstr "" +"如果消息为 ``multipart/related``,则创建一个新的消息对象,将所有参数传给其 :meth:`set_content` 方法,并将其 " +":meth:`~email.message.Message.attach` 到 ``multipart``。如果消息为非 " +"``multipart``,则先调用 :meth:`make_related` 然后再继续上述步骤。如果消息为任何其他类型的 " +"``multipart``,则会引发 :exc:`TypeError`。如果未指定 *content_manager*,则使用当前 " +":mod:`~email.policy` 所指定的 ``content_manager``。如果添加的部分没有 " +":mailheader:`Content-Disposition` 标头,则会添加一个值为 ``inline`` 的标头。" + +#: ../../library/email.message.rst:661 +msgid "" +"If the message is a ``multipart/alternative``, create a new message object, " +"pass all of the arguments to its :meth:`set_content` method, and " +":meth:`~email.message.Message.attach` it to the ``multipart``. If the " +"message is a non-``multipart`` or ``multipart/related``, call " +":meth:`make_alternative` and then proceed as above. If the message is any " +"other type of ``multipart``, raise a :exc:`TypeError`. If *content_manager* " +"is not specified, use the ``content_manager`` specified by the current " +":mod:`~email.policy`." +msgstr "" +"如果消息为 ``multipart/alternative``,则创建一个新的消息对象,将所有参数传给其 :meth:`set_content` " +"方法,并将其 :meth:`~email.message.Message.attach` 到 ``multipart``。如果消息为非 " +"``multipart`` 或 ``multipart/related``,则先调用 :meth:`make_alternative` " +"然后再继续上述步骤。如果消息为任何其他类型的 ``multipart``,则会引发 :exc:`TypeError`。如果未指定 " +"*content_manager*,则会使用当前 :mod:`~email.policy` 所指定的 ``content_manager``。" + +#: ../../library/email.message.rst:673 +msgid "" +"If the message is a ``multipart/mixed``, create a new message object, pass " +"all of the arguments to its :meth:`set_content` method, and " +":meth:`~email.message.Message.attach` it to the ``multipart``. If the " +"message is a non-``multipart``, ``multipart/related``, or " +"``multipart/alternative``, call :meth:`make_mixed` and then proceed as " +"above. If *content_manager* is not specified, use the ``content_manager`` " +"specified by the current :mod:`~email.policy`. If the added part has no " +":mailheader:`Content-Disposition` header, add one with the value " +"``attachment``. This method can be used both for explicit attachments " +"(:mailheader:`Content-Disposition: attachment`) and ``inline`` attachments " +"(:mailheader:`Content-Disposition: inline`), by passing appropriate options " +"to the ``content_manager``." +msgstr "" +"如果消息为 ``multipart/mixed``,则创建一个新的消息对象,将所有参数传给其 :meth:`set_content` 方法,并将其 " +":meth:`~email.message.Message.attach` 到 ``multipart``。如果消息为非 ``multipart``, " +"``multipart/related`` 或 ``multipart/alternative``,则先调用 :meth:`make_mixed` " +"然后再继续上述步骤。如果未指定 *content_manager*,则使用当前 :mod:`~email.policy` 所指定的 " +"``content_manager``。如果添加的部分没有 :mailheader:`Content-Disposition` 标头,则会添加一个值为 " +"``attachment`` 的标头。此方法对于显式附件 (:mailheader:`Content-Disposition: attachment`)" +" 和 ``inline`` 附件 (:mailheader:`Content-Disposition: inline`) 均可使用,只须向 " +"``content_manager`` 传入适当的选项即可。" + +#: ../../library/email.message.rst:689 +msgid "Remove the payload and all of the headers." +msgstr "移除载荷和所有标头。" + +#: ../../library/email.message.rst:694 +msgid "" +"Remove the payload and all of the :mailheader:`!Content-` headers, leaving " +"all other headers intact and in their original order." +msgstr "移除载荷以及所有 :mailheader:`!Content-` 标头,保持所有其他标头不变并保留其原始顺序。" + +#: ../../library/email.message.rst:698 +msgid ":class:`EmailMessage` objects have the following instance attributes:" +msgstr ":class:`EmailMessage` 对象具有下列实例属性:" + +#: ../../library/email.message.rst:703 +msgid "" +"The format of a MIME document allows for some text between the blank line " +"following the headers, and the first multipart boundary string. Normally, " +"this text is never visible in a MIME-aware mail reader because it falls " +"outside the standard MIME armor. However, when viewing the raw text of the " +"message, or when viewing the message in a non-MIME aware reader, this text " +"can become visible." +msgstr "" +"MIME 文档格式在标头之后的空白行以及第一个多部分的分界字符串之间允许添加一些文本,通常,此文本在支持 MIME " +"的邮件阅读器中永远不可见,因为它处在标准 MIME 保护范围之外。但是,当查看消息的原始文本,或当在不支持 MIME " +"的阅读器中查看消息时,此文本会变得可见。" + +#: ../../library/email.message.rst:710 +msgid "" +"The *preamble* attribute contains this leading extra-armor text for MIME " +"documents. When the :class:`~email.parser.Parser` discovers some text after" +" the headers but before the first boundary string, it assigns this text to " +"the message's *preamble* attribute. When the " +":class:`~email.generator.Generator` is writing out the plain text " +"representation of a MIME message, and it finds the message has a *preamble* " +"attribute, it will write this text in the area between the headers and the " +"first boundary. See :mod:`email.parser` and :mod:`email.generator` for " +"details." +msgstr "" +"*preamble* 属性包含 MIME 文档开头部分的这些处于保护范围之外的文本。当 :class:`~email.parser.Parser` " +"在标头之后及第一个分界字符串之前发现一些文本时,它会将这些文本赋值给消息的 *preamble* 属性。当 " +":class:`~email.generator.Generator` 写出 MIME 消息的纯文本表示形式时,如果它发现消息具有 *preamble*" +" 属性,它将在标头及第一个分界之间区域写出这些文本。请参阅 :mod:`email.parser` 和 :mod:`email.generator` " +"了解更多细节。" + +#: ../../library/email.message.rst:720 +msgid "" +"Note that if the message object has no preamble, the *preamble* attribute " +"will be ``None``." +msgstr "请注意如果消息对象没有前导文本,则 *preamble* 属性将为 ``None``。" + +#: ../../library/email.message.rst:726 +msgid "" +"The *epilogue* attribute acts the same way as the *preamble* attribute, " +"except that it contains text that appears between the last boundary and the " +"end of the message. As with the :attr:`~EmailMessage.preamble`, if there is" +" no epilog text this attribute will be ``None``." +msgstr "" +"*epilogue* 属性的作用方式与 *preamble* 相同,区别在于它包含在最后一个分界及消息结尾之间出现的文本。与 " +":attr:`~EmailMessage.preamble` 类似,如果没有附加文本,则此属性将为 ``None``。" + +#: ../../library/email.message.rst:734 +msgid "" +"The *defects* attribute contains a list of all the problems found when " +"parsing this message. See :mod:`email.errors` for a detailed description of" +" the possible parsing defects." +msgstr "" +"*defects* 属性包含在解析消息时发现的所有问题的列表。请参阅 :mod:`email.errors` 了解可能的解析缺陷的详细描述。" + +#: ../../library/email.message.rst:741 +msgid "" +"This class represents a subpart of a MIME message. It is identical to " +":class:`EmailMessage`, except that no :mailheader:`MIME-Version` headers are" +" added when :meth:`~EmailMessage.set_content` is called, since sub-parts do " +"not need their own :mailheader:`MIME-Version` headers." +msgstr "" +"这个类代表 MIME 消息的子部分。它与 :class:`EmailMessage` 相同,不同之处在于当 " +":meth:`~EmailMessage.set_content` 被调用时不会添加 :mailheader:`MIME-Version` " +"标头,因为子部分不需要有它们自己的 :mailheader:`MIME-Version` 标头。" + +#: ../../library/email.message.rst:748 +msgid "Footnotes" +msgstr "脚注" + +#: ../../library/email.message.rst:749 +msgid "" +"Originally added in 3.4 as a :term:`provisional module `. Docs for legacy message class moved to :ref:`compat32_message`." +msgstr "" +"原先在 3.4 版本中以 :term:`provisional module ` " +"添加。旧版消息类的文档被移动至 :ref:`compat32_message` ." + +#: ../../library/email.message.rst:753 +msgid "" +"The :class:`EmailMessage` class requires a policy that provides a " +"``content_manager`` attribute for content management methods like " +"``set_content()`` and ``get_content()`` to work. The legacy " +":const:`~email.policy.compat32` policy does not support these methods and " +"should not be used with :class:`EmailMessage`." +msgstr "" +":class:`EmailMessage` 类需要一个提供 ``content_manager`` 属性的策略以使 ``set_content()`` " +"和 ``get_content()`` 等内容管理方法正常工作。旧式的 :const:`~email.policy.compat32` " +"策略不支持这些方法因此不应被用于 :class:`EmailMessage`。" diff --git a/library/email.mime.po b/library/email.mime.po new file mode 100644 index 0000000000..d7779c7ca8 --- /dev/null +++ b/library/email.mime.po @@ -0,0 +1,387 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/email.mime.rst:2 +msgid ":mod:`!email.mime`: Creating email and MIME objects from scratch" +msgstr ":mod:`!email.mime`: 从头创建电子邮件和 MIME 对象" + +#: ../../library/email.mime.rst:7 +msgid "**Source code:** :source:`Lib/email/mime/`" +msgstr "**源代码:** :source:`Lib/email/mime/`" + +#: ../../library/email.mime.rst:11 +msgid "" +"This module is part of the legacy (``Compat32``) email API. Its " +"functionality is partially replaced by the :mod:`~email.contentmanager` in " +"the new API, but in certain applications these classes may still be useful, " +"even in non-legacy code." +msgstr "" +"此模块是旧版 (``Compat32``) 电子邮件 API 的组成部分。 它的功能在新版 API 中被 " +":mod:`~email.contentmanager` 部分替代,但在某些应用中这些类仍可能有用,即使是在非旧版代码中。" + +#: ../../library/email.mime.rst:16 +msgid "" +"Ordinarily, you get a message object structure by passing a file or some " +"text to a parser, which parses the text and returns the root message object." +" However you can also build a complete message structure from scratch, or " +"even individual :class:`~email.message.Message` objects by hand. In fact, " +"you can also take an existing structure and add new " +":class:`~email.message.Message` objects, move them around, etc. This makes " +"a very convenient interface for slicing-and-dicing MIME messages." +msgstr "" +"通常,你是通过传递一个文件或一些文本到解析器来获得消息对象结构体的,解析器会解析文本并返回根消息对象。 " +"不过你也可以从头开始构建一个完整的消息结构体,甚至是手动构建单独的 :class:`~email.message.Message` 对象。 " +"实际上,你也可以接受一个现有的结构体并添加新的 :class:`~email.message.Message` 对象并移动它们。这为切片和分割 MIME" +" 消息提供了非常方便的接口。" + +#: ../../library/email.mime.rst:24 +msgid "" +"You can create a new object structure by creating " +":class:`~email.message.Message` instances, adding attachments and all the " +"appropriate headers manually. For MIME messages though, the :mod:`email` " +"package provides some convenient subclasses to make things easier." +msgstr "" +"你可以通过创建 :class:`~email.message.Message` 实例并手动添加附件和所有适当的标头来创建一个新的对象结构体。不过对于 " +"MIME 消息来说,:mod:`email` 包提供了一些便捷子类来让事情变得更容易。" + +#: ../../library/email.mime.rst:29 +msgid "Here are the classes:" +msgstr "这些类列示如下:" + +#: ../../library/email.mime.rst:35 +msgid "Module: :mod:`email.mime.base`" +msgstr "模块::mod:`email.mime.base`" + +#: ../../library/email.mime.rst:37 +msgid "" +"This is the base class for all the MIME-specific subclasses of " +":class:`~email.message.Message`. Ordinarily you won't create instances " +"specifically of :class:`MIMEBase`, although you could. :class:`MIMEBase` is" +" provided primarily as a convenient base class for more specific MIME-aware " +"subclasses." +msgstr "" +"这是 :class:`~email.message.Message` 所有 MIME 专属子类的基类。通常你不会创建专门的 " +":class:`MIMEBase` 实例,尽管你可以这样做。 :class:`MIMEBase` 主要被提供用来作为更具体的 MIME " +"感知子类的便捷基类。" + +#: ../../library/email.mime.rst:43 +msgid "" +"*_maintype* is the :mailheader:`Content-Type` major type (e.g. " +":mimetype:`text` or :mimetype:`image`), and *_subtype* is the " +":mailheader:`Content-Type` minor type (e.g. :mimetype:`plain` or " +":mimetype:`gif`). *_params* is a parameter key/value dictionary and is " +"passed directly to :meth:`Message.add_header " +"`." +msgstr "" +"*_maintype* 是 :mailheader:`Content-Type` 的主类型 (例如 :mimetype:`text` 或 " +":mimetype:`image`),而 *_subtype* 是 :mailheader:`Content-Type` 的次类型 (例如 " +":mimetype:`plain` 或 :mimetype:`gif`)。 *_params* 是一个参数键/值字典并会被直接传递给 " +":meth:`Message.add_header `." + +#: ../../library/email.mime.rst:49 +msgid "" +"If *policy* is specified, (defaults to the :class:`compat32 " +"` policy) it will be passed to " +":class:`~email.message.Message`." +msgstr "" +"如果指定了 *policy* (默认为 :class:`compat32 ` 策略),它将被传递给 " +":class:`~email.message.Message`." + +#: ../../library/email.mime.rst:53 +msgid "" +"The :class:`MIMEBase` class always adds a :mailheader:`Content-Type` header " +"(based on *_maintype*, *_subtype*, and *_params*), and a :mailheader:`MIME-" +"Version` header (always set to ``1.0``)." +msgstr "" +":class:`MIMEBase` 类总是会添加一个 :mailheader:`Content-Type` 标头 (基于 *_maintype*, " +"*_subtype* 和 *_params*),以及一个 :mailheader:`MIME-Version` 标头 (总是设为 ``1.0``)。" + +#: ../../library/email.mime.rst:57 ../../library/email.mime.rst:104 +#: ../../library/email.mime.rst:135 ../../library/email.mime.rst:169 +#: ../../library/email.mime.rst:205 ../../library/email.mime.rst:225 +#: ../../library/email.mime.rst:259 +msgid "Added *policy* keyword-only parameter." +msgstr "添加了 *policy* 仅限关键字形参。" + +#: ../../library/email.mime.rst:65 +msgid "Module: :mod:`email.mime.nonmultipart`" +msgstr "模块::mod:`email.mime.nonmultipart`" + +#: ../../library/email.mime.rst:67 +msgid "" +"A subclass of :class:`~email.mime.base.MIMEBase`, this is an intermediate " +"base class for MIME messages that are not :mimetype:`multipart`. The " +"primary purpose of this class is to prevent the use of the " +":meth:`~email.message.Message.attach` method, which only makes sense for " +":mimetype:`multipart` messages. If :meth:`~email.message.Message.attach` is" +" called, a :exc:`~email.errors.MultipartConversionError` exception is " +"raised." +msgstr "" +":class:`~email.mime.base.MIMEBase` 的子类,这是用于非 :mimetype:`multipart` MIME " +"消息的中间基类。这个类的主要目的是防止使用 :meth:`~email.message.Message.attach` 方法,该方法仅对 " +":mimetype:`multipart` 消息有意义。如果 :meth:`~email.message.Message.attach` " +"被调用,则会引发 :exc:`~email.errors.MultipartConversionError` 异常。" + +#: ../../library/email.mime.rst:80 +msgid "Module: :mod:`email.mime.multipart`" +msgstr "模块::mod:`email.mime.multipart`" + +#: ../../library/email.mime.rst:82 +msgid "" +"A subclass of :class:`~email.mime.base.MIMEBase`, this is an intermediate " +"base class for MIME messages that are :mimetype:`multipart`. Optional " +"*_subtype* defaults to :mimetype:`mixed`, but can be used to specify the " +"subtype of the message. A :mailheader:`Content-Type` header of " +":mimetype:`multipart/_subtype` will be added to the message object. A " +":mailheader:`MIME-Version` header will also be added." +msgstr "" +":class:`~email.mime.base.MIMEBase` 的子类,这是用于 :mimetype:`multipart` MIME " +"消息的中间基类。可选的 *_subtype* 默认为 :mimetype:`mixed`,但可被用来指定消息的子类型。将会在消息对象中添加一个 " +":mimetype:`multipart/_subtype` 的 :mailheader:`Content-Type` 标头。并还将添加一个 " +":mailheader:`MIME-Version` 标头。" + +#: ../../library/email.mime.rst:89 +msgid "" +"Optional *boundary* is the multipart boundary string. When ``None`` (the " +"default), the boundary is calculated when needed (for example, when the " +"message is serialized)." +msgstr "可选的 *boundary* 是多部分边界字符串。当为 ``None`` (默认值) 时,则会在必要时(例如当消息被序列化时)计算边界。" + +#: ../../library/email.mime.rst:93 +msgid "" +"*_subparts* is a sequence of initial subparts for the payload. It must be " +"possible to convert this sequence to a list. You can always attach new " +"subparts to the message by using the :meth:`Message.attach " +"` method." +msgstr "" +"*_subparts* 是载荷初始子部分的序列。此序列必须可以被转换为列表。你总是可以使用 :meth:`Message.attach " +"` 方法将新的子部分附加到消息中。" + +#: ../../library/email.mime.rst:98 ../../library/email.mime.rst:131 +#: ../../library/email.mime.rst:165 ../../library/email.mime.rst:200 +#: ../../library/email.mime.rst:223 ../../library/email.mime.rst:254 +msgid "" +"Optional *policy* argument defaults to :class:`compat32 " +"`." +msgstr "可选的 *policy* 参数默认为 :class:`compat32 `。" + +#: ../../library/email.mime.rst:100 +msgid "" +"Additional parameters for the :mailheader:`Content-Type` header are taken " +"from the keyword arguments, or passed into the *_params* argument, which is " +"a keyword dictionary." +msgstr "" +"用于 :mailheader:`Content-Type` 标头的附加参数会从关键字参数中获取,或者传入到 *_params* " +"参数,该参数是一个关键字的字典。" + +#: ../../library/email.mime.rst:113 +msgid "Module: :mod:`email.mime.application`" +msgstr "模块::mod:`email.mime.application`" + +#: ../../library/email.mime.rst:115 +msgid "" +"A subclass of :class:`~email.mime.nonmultipart.MIMENonMultipart`, the " +":class:`MIMEApplication` class is used to represent MIME message objects of " +"major type :mimetype:`application`. *_data* contains the bytes for the raw " +"application data. Optional *_subtype* specifies the MIME subtype and " +"defaults to :mimetype:`octet-stream`." +msgstr "" +":class:`~email.mime.nonmultipart.MIMENonMultipart` " +"的子类,:class:`MIMEApplication` 类被用来表示主类型为 :mimetype:`application` 的 MIME 消息。 " +"*_data* 为包含原始应用程序数据的字节串。可选的 *_subtype* 指定 MIME 子类型并默认为 :mimetype:`octet-" +"stream`." + +#: ../../library/email.mime.rst:121 +msgid "" +"Optional *_encoder* is a callable (i.e. function) which will perform the " +"actual encoding of the data for transport. This callable takes one " +"argument, which is the :class:`MIMEApplication` instance. It should use " +":meth:`~email.message.Message.get_payload` and " +":meth:`~email.message.Message.set_payload` to change the payload to encoded " +"form. It should also add any :mailheader:`Content-Transfer-Encoding` or " +"other headers to the message object as necessary. The default encoding is " +"base64. See the :mod:`email.encoders` module for a list of the built-in " +"encoders." +msgstr "" +"可选的 *_encoder* 是一个可调用对象(即函数),它将执行实际的数据编码以便传输。这个可调用对象接受一个参数,该参数是 " +":class:`MIMEApplication` 的实例。它应当使用 " +":meth:`~email.message.Message.get_payload` 和 " +":meth:`~email.message.Message.set_payload` 来将载荷改为已编码形式。它还应根据需要将任何 " +":mailheader:`Content-Transfer-Encoding` 或其他标头添加到消息对象中。默认编码格式为 base64。请参阅 " +":mod:`email.encoders` 模块来查看内置编码器列表。" + +#: ../../library/email.mime.rst:133 ../../library/email.mime.rst:167 +msgid "*_params* are passed straight through to the base class constructor." +msgstr "*_params* 会被直接传递给基类的构造器。" + +#: ../../library/email.mime.rst:144 +msgid "Module: :mod:`email.mime.audio`" +msgstr "模块::mod:`email.mime.audio`" + +#: ../../library/email.mime.rst:146 +msgid "" +"A subclass of :class:`~email.mime.nonmultipart.MIMENonMultipart`, the " +":class:`MIMEAudio` class is used to create MIME message objects of major " +"type :mimetype:`audio`. *_audiodata* contains the bytes for the raw audio " +"data. If this data can be decoded as au, wav, aiff, or aifc, then the " +"subtype will be automatically included in the :mailheader:`Content-Type` " +"header. Otherwise you can explicitly specify the audio subtype via the " +"*_subtype* argument. If the minor type could not be guessed and *_subtype* " +"was not given, then :exc:`TypeError` is raised." +msgstr "" +":class:`~email.mime.nonmultipart.MIMENonMultipart` 的子类,:class:`MIMEAudio` " +"类被用来创建主类型为 :mimetype:`audio` 的 MIME 消息。 *_audiodata* 是包含原始音频数据的字节串。如果此数据可作为 " +"au, wav, aiff 或 aifc 来解码,则其子类型将被自动包括在 :mailheader:`Content-Type` 标头中。 " +"在其他情况下你可以通过 *_subtype* 参数显式地指定音频子类型。如果无法猜测出次类型并且未给出 *_subtype*,则会引发 " +":exc:`TypeError`." + +#: ../../library/email.mime.rst:155 +msgid "" +"Optional *_encoder* is a callable (i.e. function) which will perform the " +"actual encoding of the audio data for transport. This callable takes one " +"argument, which is the :class:`MIMEAudio` instance. It should use " +":meth:`~email.message.Message.get_payload` and " +":meth:`~email.message.Message.set_payload` to change the payload to encoded " +"form. It should also add any :mailheader:`Content-Transfer-Encoding` or " +"other headers to the message object as necessary. The default encoding is " +"base64. See the :mod:`email.encoders` module for a list of the built-in " +"encoders." +msgstr "" +"可选的 *_encoder* 是一个可调用对象(即函数),它将执行实际的音频数据编码以便传输。这个可调用对象接受一个参数,该参数是 " +":class:`MIMEAudio` 的实例。它应当使用 :meth:`~email.message.Message.get_payload` 和 " +":meth:`~email.message.Message.set_payload` 来将载荷改为已编码形式。它还应根据需要将任何 " +":mailheader:`Content-Transfer-Encoding` 或其他标头添加到消息对象中。默认编码格式为 base64。请参阅 " +":mod:`email.encoders` 模块来查看内置编码器列表。" + +#: ../../library/email.mime.rst:178 +msgid "Module: :mod:`email.mime.image`" +msgstr "模块::mod:`email.mime.image`" + +#: ../../library/email.mime.rst:180 +msgid "" +"A subclass of :class:`~email.mime.nonmultipart.MIMENonMultipart`, the " +":class:`MIMEImage` class is used to create MIME message objects of major " +"type :mimetype:`image`. *_imagedata* contains the bytes for the raw image " +"data. If this data type can be detected (jpeg, png, gif, tiff, rgb, pbm, " +"pgm, ppm, rast, xbm, bmp, webp, and exr attempted), then the subtype will be" +" automatically included in the :mailheader:`Content-Type` header. Otherwise " +"you can explicitly specify the image subtype via the *_subtype* argument. If" +" the minor type could not be guessed and *_subtype* was not given, then " +":exc:`TypeError` is raised." +msgstr "" +":class:`~email.mime.nonmultipart.MIMENonMultipart` 的子类,:class:`MIMEImage` " +"类被用来创建主类型为 :mimetype:`image` 的 MIME 消息对象。 *_imagedata* 是包含原始图像数据的字节串。 " +"如果此数据类型可以被检测(将尝试 jpeg, png, gif, tiff, rgb, pbm, pgm, ppm, rast, xbm, bmp, " +"webp 和 exr 类型),则其子类型将被自动包括在 :mailheader:`Content-Type` 标头中。在其他情况下你可以通过 " +"*_subtype* 参数显式地指定图像子类型。如果无法猜测出次类型并且未给出 *_subtype*,则会引发 :exc:`TypeError`。" + +#: ../../library/email.mime.rst:190 +msgid "" +"Optional *_encoder* is a callable (i.e. function) which will perform the " +"actual encoding of the image data for transport. This callable takes one " +"argument, which is the :class:`MIMEImage` instance. It should use " +":meth:`~email.message.Message.get_payload` and " +":meth:`~email.message.Message.set_payload` to change the payload to encoded " +"form. It should also add any :mailheader:`Content-Transfer-Encoding` or " +"other headers to the message object as necessary. The default encoding is " +"base64. See the :mod:`email.encoders` module for a list of the built-in " +"encoders." +msgstr "" +"可选的 *_encoder* 是一个可调用对象(即函数),它将执行实际的图像数据编码以便传输。这个可调用对象接受一个参数,该参数是 " +":class:`MIMEImage` 的实例。它应当使用 :meth:`~email.message.Message.get_payload` 和 " +":meth:`~email.message.Message.set_payload` 来将载荷改为已编码形式。它还应根据需要将任何 " +":mailheader:`Content-Transfer-Encoding` 或其他标头添加到消息对象中。默认编码格式为 base64。请参阅 " +":mod:`email.encoders` 模块来查看内置编码器列表。" + +#: ../../library/email.mime.rst:202 +msgid "" +"*_params* are passed straight through to the " +":class:`~email.mime.base.MIMEBase` constructor." +msgstr "*_params* 会被直接传递给 :class:`~email.mime.base.MIMEBase` 构造器。" + +#: ../../library/email.mime.rst:212 +msgid "Module: :mod:`email.mime.message`" +msgstr "模块::mod:`email.mime.message`" + +#: ../../library/email.mime.rst:214 +msgid "" +"A subclass of :class:`~email.mime.nonmultipart.MIMENonMultipart`, the " +":class:`MIMEMessage` class is used to create MIME objects of main type " +":mimetype:`message`. *_msg* is used as the payload, and must be an instance " +"of class :class:`~email.message.Message` (or a subclass thereof), otherwise " +"a :exc:`TypeError` is raised." +msgstr "" +":class:`~email.mime.nonmultipart.MIMENonMultipart` 的子类,:class:`MIMEMessage` " +"类被用来创建主类型为 :mimetype:`message` 的 MIME 对象。 *_msg* 将被用作载荷,并且必须为 " +":class:`~email.message.Message` 类(或其子类)的实例,否则会引发 :exc:`TypeError`。" + +#: ../../library/email.mime.rst:220 +msgid "" +"Optional *_subtype* sets the subtype of the message; it defaults to " +":mimetype:`rfc822`." +msgstr "可选的 *_subtype* 设置消息的子类型;它的默认值为 :mimetype:`rfc822`。" + +#: ../../library/email.mime.rst:232 +msgid "Module: :mod:`email.mime.text`" +msgstr "模块::mod:`email.mime.text`" + +#: ../../library/email.mime.rst:234 +msgid "" +"A subclass of :class:`~email.mime.nonmultipart.MIMENonMultipart`, the " +":class:`MIMEText` class is used to create MIME objects of major type " +":mimetype:`text`. *_text* is the string for the payload. *_subtype* is the " +"minor type and defaults to :mimetype:`plain`. *_charset* is the character " +"set of the text and is passed as an argument to the " +":class:`~email.mime.nonmultipart.MIMENonMultipart` constructor; it defaults " +"to ``us-ascii`` if the string contains only ``ascii`` code points, and " +"``utf-8`` otherwise. The *_charset* parameter accepts either a string or a " +":class:`~email.charset.Charset` instance." +msgstr "" +":class:`~email.mime.nonmultipart.MIMENonMultipart` 的子类,:class:`MIMEText` " +"类被用来创建主类型为 :mimetype:`text` 的 MIME 对象。 *_text* 是用作载荷的字符串。 *_subtype* " +"指定子类型并且默认为 :mimetype:`plain`。 *_charset* 是文本的字符集并会作为参数传递给 " +":class:`~email.mime.nonmultipart.MIMENonMultipart` 构造器;如果该字符串仅包含 ``ascii`` " +"码位则其默认值为 ``us-ascii``,否则为 ``utf-8``。 *_charset* 形参接受一个字符串或是一个 " +":class:`~email.charset.Charset` 实例。" + +#: ../../library/email.mime.rst:244 +msgid "" +"Unless the *_charset* argument is explicitly set to ``None``, the MIMEText " +"object created will have both a :mailheader:`Content-Type` header with a " +"``charset`` parameter, and a :mailheader:`Content-Transfer-Encoding` header." +" This means that a subsequent ``set_payload`` call will not result in an " +"encoded payload, even if a charset is passed in the ``set_payload`` command." +" You can \"reset\" this behavior by deleting the ``Content-Transfer-" +"Encoding`` header, after which a ``set_payload`` call will automatically " +"encode the new payload (and add a new :mailheader:`Content-Transfer-" +"Encoding` header)." +msgstr "" +"除非 *_charset* 参数被显式地设为 ``None``,否则所创建的 MIMEText 对象将同时具有附带 ``charset`` 参数的 " +":mailheader:`Content-Type` 标头,以及 :mailheader:`Content-Transfer-Encoding` 标头。" +" 这意味着后续的 ``set_payload`` 调用将不会产生已编码的载荷,即使在 ``set_payload`` 命令中传入了 charset。 " +"你可以通过删除 ``Content-Transfer-Encoding`` 标头来“重置”此行为,在此之后的 ``set_payload`` " +"调用将自动编码新的载荷(并添加新的 :mailheader:`Content-Transfer-Encoding` 标头)。" + +#: ../../library/email.mime.rst:256 +msgid "*_charset* also accepts :class:`~email.charset.Charset` instances." +msgstr "*_charset* 也可接受 :class:`~email.charset.Charset` 实例。" diff --git a/library/email.parser.po b/library/email.parser.po new file mode 100644 index 0000000000..fd6f4d9aeb --- /dev/null +++ b/library/email.parser.po @@ -0,0 +1,478 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/email.parser.rst:2 +msgid ":mod:`!email.parser`: Parsing email messages" +msgstr ":mod:`!email.parser`: 解析电子邮件消息" + +#: ../../library/email.parser.rst:7 +msgid "**Source code:** :source:`Lib/email/parser.py`" +msgstr "**源代码:** :source:`Lib/email/parser.py`" + +#: ../../library/email.parser.rst:11 +msgid "" +"Message object structures can be created in one of two ways: they can be " +"created from whole cloth by creating an :class:`~email.message.EmailMessage`" +" object, adding headers using the dictionary interface, and adding " +"payload(s) using :meth:`~email.message.EmailMessage.set_content` and related" +" methods, or they can be created by parsing a serialized representation of " +"the email message." +msgstr "" +"使用以下两种方法的其中一种以创建消息对象结构:直接创建一个 :class:`~email.message.EmailMessage` " +"对象,使用字典接口添加消息头,并且使用 :meth:`~email.message.EmailMessage.set_content` " +"和其他相关方法添加消息负载;或者通过解析一个电子邮件消息的序列化表达来创建消息对象结构。" + +#: ../../library/email.parser.rst:18 +msgid "" +"The :mod:`email` package provides a standard parser that understands most " +"email document structures, including MIME documents. You can pass the " +"parser a bytes, string or file object, and the parser will return to you the" +" root :class:`~email.message.EmailMessage` instance of the object structure." +" For simple, non-MIME messages the payload of this root object will likely " +"be a string containing the text of the message. For MIME messages, the root" +" object will return ``True`` from its " +":meth:`~email.message.EmailMessage.is_multipart` method, and the subparts " +"can be accessed via the payload manipulation methods, such as " +":meth:`~email.message.EmailMessage.get_body`, " +":meth:`~email.message.EmailMessage.iter_parts`, and " +":meth:`~email.message.EmailMessage.walk`." +msgstr "" +":mod:`email` 包提供了一个可以理解包含 MIME 文档在内的绝大多数电子邮件文档结构的标准语法分析程序。 " +"你可以传递给语法分析程序一个字节串、字符串或者文件对象,语法分析程序会返回给你对应于该对象结构的根 " +":class:`~email.message.EmailMessage` 实例。 对于简单的、非 MIME " +"的消息,这个根对象的负载很可能就是一个包含了该消息文字内容的字符串。 对于 MIME 消息,调用根对象的 " +":meth:`~email.message.EmailMessage.is_multipart` 方法会返回 " +"``True``,其子项可以通过负载操纵方法来进行访问,例如 " +":meth:`~email.message.EmailMessage.get_body`、:meth:`~email.message.EmailMessage.iter_parts`" +" 还有 :meth:`~email.message.EmailMessage.walk`。" + +#: ../../library/email.parser.rst:30 +msgid "" +"There are actually two parser interfaces available for use, the " +":class:`Parser` API and the incremental :class:`FeedParser` API. The " +":class:`Parser` API is most useful if you have the entire text of the " +"message in memory, or if the entire message lives in a file on the file " +"system. :class:`FeedParser` is more appropriate when you are reading the " +"message from a stream which might block waiting for more input (such as " +"reading an email message from a socket). The :class:`FeedParser` can " +"consume and parse the message incrementally, and only returns the root " +"object when you close the parser." +msgstr "" +"事实上你可以使用的语法分析程序接口有两种::class:`Parser` API 和增量式的 :class:`FeedParser` " +"API。当你的全部消息内容都在内存当中,或者整个消息都保存在文件系统内的一个文件当中的时候,:class:`Parser` API " +"非常有用。当你从可能会为了等待更多输入而阻塞的数据流当中读取消息(比如从套接字当中读取电子邮件消息)的时候,:class:`FeedParser` " +"会更合适。 :class:`FeedParser` 会增量读取并解析消息,并且只有在你关闭语法分析程序的时候才会返回根对象。" + +#: ../../library/email.parser.rst:39 +msgid "" +"Note that the parser can be extended in limited ways, and of course you can " +"implement your own parser completely from scratch. All of the logic that " +"connects the :mod:`email` package's bundled parser and the " +":class:`~email.message.EmailMessage` class is embodied in the " +":class:`~email.policy.Policy` class, so a custom parser can create message " +"object trees any way it finds necessary by implementing custom versions of " +"the appropriate :class:`!Policy` methods." +msgstr "" +"请注意解析器可以进行有限的扩展,当然你也可以完全从零开始实现你自己的解析器。将 :mod:`email` 包的内置解析器和 " +":class:`~email.message.EmailMessage` 类连接起来的所有逻辑都保存在 " +":class:`~email.policy.Policy` 类中。因此自定义解析器可以根据其需要通过实现合适的 :class:`!Policy` " +"方法的自定义版本以任意方式创建消息对象树。" + +#: ../../library/email.parser.rst:49 +msgid "FeedParser API" +msgstr "FeedParser API" + +#: ../../library/email.parser.rst:51 +msgid "" +"The :class:`BytesFeedParser`, imported from the :mod:`email.feedparser` " +"module, provides an API that is conducive to incremental parsing of email " +"messages, such as would be necessary when reading the text of an email " +"message from a source that can block (such as a socket). The " +":class:`BytesFeedParser` can of course be used to parse an email message " +"fully contained in a :term:`bytes-like object`, string, or file, but the " +":class:`BytesParser` API may be more convenient for such use cases. The " +"semantics and results of the two parser APIs are identical." +msgstr "" +":class:`BytesFeedParser` 是从 :mod:`email.feedparser` 模块导入的,它提供了有助于进行邮件消息增量解析的" +" API,这在从可能发生阻塞的源(如套接字)读取邮件消息文本时将是必要的。 :class:`BytesFeedParser` 当然可被用于解析完全包含在" +" :term:`字节型对象 `, 字符串或文件中的邮件消息,但 :class:`BytesParser` API " +"对于这种使用场景可能更为方便。两种解析器 API 的语义和结果是相同的。" + +#: ../../library/email.parser.rst:60 +msgid "" +"The :class:`BytesFeedParser`'s API is simple; you create an instance, feed " +"it a bunch of bytes until there's no more to feed it, then close the parser " +"to retrieve the root message object. The :class:`BytesFeedParser` is " +"extremely accurate when parsing standards-compliant messages, and it does a " +"very good job of parsing non-compliant messages, providing information about" +" how a message was deemed broken. It will populate a message object's " +":attr:`~email.message.EmailMessage.defects` attribute with a list of any " +"problems it found in a message. See the :mod:`email.errors` module for the " +"list of defects that it can find." +msgstr "" +":class:`BytesFeedParser` 的 API " +"十分简洁易懂:你创建一个语法分析程序的实例,向它不断输入大量的字节直到尽头,然后关闭这个语法分析程序就可以拿到根消息对象了。在处理符合标准的消息的时候 " +":class:`BytesFeedParser` 非常准确;在处理不符合标准的消息的时候它也做得很好,会提供有关消息被认定为损坏的信息。它会向消息对象的" +" :attr:`~email.message.EmailMessage.defects` " +"属性中写入它从消息中找到的问题列表。关于它能找到的所有问题类型的列表,详见 :mod:`email.errors` 模块。" + +#: ../../library/email.parser.rst:70 +msgid "Here is the API for the :class:`BytesFeedParser`:" +msgstr "这里是 :class:`BytesFeedParser` 的 API:" + +#: ../../library/email.parser.rst:75 +msgid "" +"Create a :class:`BytesFeedParser` instance. Optional *_factory* is a no-" +"argument callable; if not specified use the " +":attr:`~email.policy.Policy.message_factory` from the *policy*. Call " +"*_factory* whenever a new message object is needed." +msgstr "" +"创建一个 :class:`BytesFeedParser` 实例。可选的 *_factory* 参数是一个不带参数的可调用对象;如果没有被指定,就会使用" +" *policy* 参数的 :attr:`~email.policy.Policy.message_factory` 属性。 " +"每当需要一个新的消息对象的时候,*_factory* 都会被调用。" + +#: ../../library/email.parser.rst:80 +msgid "" +"If *policy* is specified use the rules it specifies to update the " +"representation of the message. If *policy* is not set, use the " +":class:`compat32 ` policy, which maintains backward " +"compatibility with the Python 3.2 version of the email package and provides " +":class:`~email.message.Message` as the default factory. All other policies " +"provide :class:`~email.message.EmailMessage` as the default *_factory*. For " +"more information on what else *policy* controls, see the " +":mod:`~email.policy` documentation." +msgstr "" +"如果指定了 *policy* 参数,它就会使用这个参数所指定的规则来更新消息的表达方式。如果没有设定 *policy* 参数,它就会使用 " +":class:`compat32 ` 策略。这个策略维持了对 Python 3.2 版本的 email " +"包的后向兼容性,并且使用 :class:`~email.message.Message` 作为默认的工厂。其他策略使用 " +":class:`~email.message.EmailMessage` 作为默认的 *_factory*。关于 *policy* 还会控制什么,参见 " +":mod:`~email.policy` 的文档。" + +#: ../../library/email.parser.rst:89 ../../library/email.parser.rst:145 +msgid "" +"Note: **The policy keyword should always be specified**; The default will " +"change to :data:`email.policy.default` in a future version of Python." +msgstr "" +"注:**一定要指定 policy 关键字**。在未来版本的 Python 当中,它的默认值会变成 " +":data:`email.policy.default`." + +#: ../../library/email.parser.rst:94 ../../library/email.parser.rst:122 +msgid "Added the *policy* keyword." +msgstr "添加了 *policy* 关键字。" + +#: ../../library/email.parser.rst:95 +msgid "*_factory* defaults to the policy ``message_factory``." +msgstr "*_factory* 默认为策略 ``message_factory``。" + +#: ../../library/email.parser.rst:100 +msgid "" +"Feed the parser some more data. *data* should be a :term:`bytes-like " +"object` containing one or more lines. The lines can be partial and the " +"parser will stitch such partial lines together properly. The lines can have" +" any of the three common line endings: carriage return, newline, or carriage" +" return and newline (they can even be mixed)." +msgstr "" +"向语法分析程序输入更多数据。*data* 应当是一个包含一行或多行内容的 :term:`字节型对象 `。 " +"行内容可以是不完整的,语法分析程序会妥善地将这些不完整的行缝合在一起。每一行可以使用以下三种常见的终止符号的其中一种:回车符、换行符或回车符加换行符(三者甚至可以混合使用)。" + +#: ../../library/email.parser.rst:109 +msgid "" +"Complete the parsing of all previously fed data and return the root message " +"object. It is undefined what happens if :meth:`~feed` is called after this " +"method has been called." +msgstr "完成之前输入的所有数据的解析并返回根消息对象。如果在这个方法被调用之后仍然调用 :meth:`~feed` 方法,结果是未定义的。" + +#: ../../library/email.parser.rst:116 +msgid "" +"Works like :class:`BytesFeedParser` except that the input to the " +":meth:`~BytesFeedParser.feed` method must be a string. This is of limited " +"utility, since the only way for such a message to be valid is for it to " +"contain only ASCII text or, if :attr:`~email.policy.EmailPolicy.utf8` is " +"``True``, no binary attachments." +msgstr "" +"行为跟 :class:`BytesFeedParser` 类一致,只不过向 :meth:`~BytesFeedParser.feed` " +"方法输入的内容必须是字符串。它的实用性有限,因为这种消息只有在其只含有 ASCII 文字,或者 " +":attr:`~email.policy.EmailPolicy.utf8` 被设置为 ``True`` 且没有二进制格式的附件的时候,才会有效。" + +#: ../../library/email.parser.rst:126 +msgid "Parser API" +msgstr "Parser API" + +#: ../../library/email.parser.rst:128 +msgid "" +"The :class:`BytesParser` class, imported from the :mod:`!email.parser` " +"module, provides an API that can be used to parse a message when the " +"complete contents of the message are available in a :term:`bytes-like " +"object` or file. The :mod:`!email.parser` module also provides " +":class:`Parser` for parsing strings, and header-only parsers, " +":class:`BytesHeaderParser` and :class:`HeaderParser`, which can be used if " +"you're only interested in the headers of the message. " +":class:`BytesHeaderParser` and :class:`HeaderParser` can be much faster in " +"these situations, since they do not attempt to parse the message body, " +"instead setting the payload to the raw body." +msgstr "" +":class:`BytesParser` 类自 :mod:`!email.parser` 模块导入,它提供了当消息的完整内容可从 " +":term:`bytes-like object` 或文件中获取时可被用于解析消息的 API。 :mod:`!email.parser` 模块还提供了 " +":class:`Parser` 用来解析字符串,以及仅用于标头的解析器 :class:`BytesHeaderParser` 和 " +":class:`HeaderParser`,它们可在你只对消息标头感兴趣时被使用。 :class:`BytesHeaderParser` 和 " +":class:`HeaderParser` 在这些场合中速度更快,因为它们不会尝试解析消息体,而是将载荷设为原始消息体。" + +#: ../../library/email.parser.rst:141 +msgid "" +"Create a :class:`BytesParser` instance. The *_class* and *policy* arguments" +" have the same meaning and semantics as the *_factory* and *policy* " +"arguments of :class:`BytesFeedParser`." +msgstr "" +"创建一个 :class:`BytesParser` 实例。 *_class* 和 *policy* 参数在含义和语义上与 " +":class:`BytesFeedParser` 的 *_factory* 和 *policy* 参数一致。" + +#: ../../library/email.parser.rst:148 +msgid "" +"Removed the *strict* argument that was deprecated in 2.4. Added the " +"*policy* keyword." +msgstr "移除了在 2.4 版本中被弃用的 *strict* 参数。新增了 *policy* 关键字。" + +#: ../../library/email.parser.rst:151 ../../library/email.parser.rst:200 +#: ../../library/email.parser.rst:280 +msgid "*_class* defaults to the policy ``message_factory``." +msgstr "*_class* 默认为策略 ``message_factory``。" + +#: ../../library/email.parser.rst:156 +msgid "" +"Read all the data from the binary file-like object *fp*, parse the resulting" +" bytes, and return the message object. *fp* must support both the " +":meth:`~io.IOBase.readline` and the :meth:`~io.BufferedIOBase.read` methods." +msgstr "" +"从二进制文件型对象 *fp* 中读取全部数据,解析其字节内容,并返回消息对象。 *fp* 必须同时支持 " +":meth:`~io.IOBase.readline` 和 :meth:`~io.BufferedIOBase.read` 方法。" + +#: ../../library/email.parser.rst:161 +msgid "" +"The bytes contained in *fp* must be formatted as a block of :rfc:`5322` (or," +" if :attr:`~email.policy.EmailPolicy.utf8` is ``True``, :rfc:`6532`) style " +"headers and header continuation lines, optionally preceded by an envelope " +"header. The header block is terminated either by the end of the data or by " +"a blank line. Following the header block is the body of the message (which " +"may contain MIME-encoded subparts, including subparts with a " +":mailheader:`Content-Transfer-Encoding` of ``8bit``)." +msgstr "" +"包含在 *fp* 中的字节串必须是一块以 :rfc:`5322` (或者如果 " +":attr:`~email.policy.EmailPolicy.utf8` 为 ``True``,则为 :rfc:`6532`) " +"风格标头和标头延续行进行格式化的消息块,并可能附加一个信封标头。标头块或者以数据末尾或者以一个空行作为终结。跟在标头块之后的是消息体(它可能包含以 " +"MIME 编码的子部分,包括带有 ``8bit`` 的 :mailheader:`Content-Transfer-Encoding` 的子部分。)" + +#: ../../library/email.parser.rst:169 +msgid "" +"Optional *headersonly* is a flag specifying whether to stop parsing after " +"reading the headers or not. The default is ``False``, meaning it parses the" +" entire contents of the file." +msgstr "可选的 *headersonly* 指示了是否应当在读取完消息头后就终止。默认值为 ``False``,意味着它会解析整个文件的全部内容。" + +#: ../../library/email.parser.rst:176 +msgid "" +"Similar to the :meth:`parse` method, except it takes a :term:`bytes-like " +"object` instead of a file-like object. Calling this method on a " +":term:`bytes-like object` is equivalent to wrapping *bytes* in a " +":class:`~io.BytesIO` instance first and calling :meth:`parse`." +msgstr "" +"与 :meth:`parse` 方法类似,只不过它要求输入为一个 :term:`bytes-like object` 而不是类文件对象。对一个 " +":term:`bytes-like object` 调用此方法相当于先将这些字节包装于一个 :class:`~io.BytesIO` 实例中,然后调用 " +":meth:`parse` 方法。" + +#: ../../library/email.parser.rst:181 ../../library/email.parser.rst:221 +msgid "Optional *headersonly* is as with the :meth:`parse` method." +msgstr "可选的 *headersonly* 与 :meth:`parse` 方法中的 *headersonly* 是一致的。" + +#: ../../library/email.parser.rst:188 +msgid "" +"Exactly like :class:`BytesParser`, except that *headersonly* defaults to " +"``True``." +msgstr "除了 *headersonly* 默认为 ``True``,其他与 :class:`BytesParser` 类完全一样。" + +#: ../../library/email.parser.rst:196 +msgid "" +"This class is parallel to :class:`BytesParser`, but handles string input." +msgstr "这个类与 :class:`BytesParser` 一样,但是处理字符串输入。" + +#: ../../library/email.parser.rst:198 ../../library/email.parser.rst:245 +#: ../../library/email.parser.rst:258 ../../library/email.parser.rst:268 +#: ../../library/email.parser.rst:278 +msgid "Removed the *strict* argument. Added the *policy* keyword." +msgstr "移除了 *strict* 参数。添加了 *policy* 关键字。" + +#: ../../library/email.parser.rst:205 +msgid "" +"Read all the data from the text-mode file-like object *fp*, parse the " +"resulting text, and return the root message object. *fp* must support both " +"the :meth:`~io.TextIOBase.readline` and the :meth:`~io.TextIOBase.read` " +"methods on file-like objects." +msgstr "" +"从文本模式的文件型对象 *fp* 读取所有数据,解析所读取的文本,并返回根消息对象。 *fp* 必须同时支持文件型对象上的 " +":meth:`~io.TextIOBase.readline` 和 :meth:`~io.TextIOBase.read` 方法。" + +#: ../../library/email.parser.rst:210 +msgid "" +"Other than the text mode requirement, this method operates like " +":meth:`BytesParser.parse`." +msgstr "除了文本模式的要求外,这个方法跟 :meth:`BytesParser.parse` 的运行方式一致。" + +#: ../../library/email.parser.rst:216 +msgid "" +"Similar to the :meth:`parse` method, except it takes a string object instead" +" of a file-like object. Calling this method on a string is equivalent to " +"wrapping *text* in a :class:`~io.StringIO` instance first and calling " +":meth:`parse`." +msgstr "" +"与 :meth:`parse` 方法类似,只不过它要求输入为一个字符串而不是类文件对象。对一个字符串对象调用此方法相当于先将 *text* 包装于一个 " +":class:`~io.StringIO` 实例中,然后调用 :meth:`parse` 方法。" + +#: ../../library/email.parser.rst:226 +msgid "" +"Exactly like :class:`Parser`, except that *headersonly* defaults to " +"``True``." +msgstr "除了 *headersonly* 默认为 ``True``,其他与 :class:`Parser` 类完全一样。" + +#: ../../library/email.parser.rst:230 +msgid "" +"Since creating a message object structure from a string or a file object is " +"such a common task, four functions are provided as a convenience. They are " +"available in the top-level :mod:`email` package namespace." +msgstr "" +"考虑到从一个字符串或一个文件对象中创建一个消息对象是非常常见的任务,我们提供了四个方便的函数。它们于顶层 :mod:`email` 包命名空间内可用。" + +#: ../../library/email.parser.rst:239 +msgid "" +"Return a message object structure from a :term:`bytes-like object`. This is" +" equivalent to ``BytesParser().parsebytes(s)``. Optional *_class* and " +"*policy* are interpreted as with the :class:`~email.parser.BytesParser` " +"class constructor." +msgstr "" +"从一个 :term:`bytes-like object` 中返回消息对象。这与 ``BytesParser().parsebytes(s)`` " +"等价。可选的 *_class* 和 *policy* 参数与 :class:`~email.parser.BytesParser` " +"类的构造函数的参数含义一致。" + +#: ../../library/email.parser.rst:252 +msgid "" +"Return a message object structure tree from an open binary :term:`file " +"object`. This is equivalent to ``BytesParser().parse(fp)``. *_class* and " +"*policy* are interpreted as with the :class:`~email.parser.BytesParser` " +"class constructor." +msgstr "" +"从打开的二进制 :term:`file object` 中返回消息对象。这与 ``BytesParser().parse(fp)`` 等价。 " +"*_class* 和 *policy* 参数与 :class:`~email.parser.BytesParser` 类的构造函数的参数含义一致。" + +#: ../../library/email.parser.rst:264 +msgid "" +"Return a message object structure from a string. This is equivalent to " +"``Parser().parsestr(s)``. *_class* and *policy* are interpreted as with the" +" :class:`~email.parser.Parser` class constructor." +msgstr "" +"从一个字符串中返回消息对象。这与 ``Parser().parsestr(s)`` 等价。 *_class* 和 *policy* 参数与 " +":class:`~email.parser.Parser` 类的构造函数的参数含义一致。" + +#: ../../library/email.parser.rst:274 +msgid "" +"Return a message object structure tree from an open :term:`file object`. " +"This is equivalent to ``Parser().parse(fp)``. *_class* and *policy* are " +"interpreted as with the :class:`~email.parser.Parser` class constructor." +msgstr "" +"从一个打开的 :term:`file object` 中返回消息对象。这与 ``Parser().parse(fp)`` 等价。 *_class* 和 " +"*policy* 参数与 :class:`~email.parser.Parser` 类的构造函数的参数含义一致。" + +#: ../../library/email.parser.rst:283 +msgid "" +"Here's an example of how you might use :func:`message_from_bytes` at an " +"interactive Python prompt::" +msgstr "这里是一个展示了你如何在 Python 交互式命令行中使用 :func:`message_from_bytes` 的例子::" + +#: ../../library/email.parser.rst:286 +msgid "" +">>> import email\n" +">>> msg = email.message_from_bytes(myBytes)" +msgstr "" +">>> import email\n" +">>> msg = email.message_from_bytes(myBytes)" + +#: ../../library/email.parser.rst:291 +msgid "Additional notes" +msgstr "附加说明" + +#: ../../library/email.parser.rst:293 +msgid "Here are some notes on the parsing semantics:" +msgstr "以下是关于解析语义的一些说明:" + +#: ../../library/email.parser.rst:295 +msgid "" +"Most non-\\ :mimetype:`multipart` type messages are parsed as a single " +"message object with a string payload. These objects will return ``False`` " +"for :meth:`~email.message.EmailMessage.is_multipart`, and " +":meth:`~email.message.EmailMessage.iter_parts` will yield an empty list." +msgstr "" +"大多数非 :mimetype:`multipart` 类型的消息都会被解析为一个带有字符串负载的消息对象。这些对象在调用 " +":meth:`~email.message.EmailMessage.is_multipart` 的时候会返回 ``False``,调用 " +":meth:`~email.message.EmailMessage.iter_parts` 的时候会产生一个空列表。" + +#: ../../library/email.parser.rst:300 +msgid "" +"All :mimetype:`multipart` type messages will be parsed as a container " +"message object with a list of sub-message objects for their payload. The " +"outer container message will return ``True`` for " +":meth:`~email.message.EmailMessage.is_multipart`, and " +":meth:`~email.message.EmailMessage.iter_parts` will yield a list of " +"subparts." +msgstr "" +"所有 :mimetype:`multipart` 类型的消息都会被解析成一个容器消息对象。该对象的负载是一个子消息对象列表。外层的容器消息在调用 " +":meth:`~email.message.EmailMessage.is_multipart` 的时候会返回 ``True``,在调用 " +":meth:`~email.message.EmailMessage.iter_parts` 的时候会产生一个子部分列表。" + +#: ../../library/email.parser.rst:306 +msgid "" +"Most messages with a content type of :mimetype:`message/\\*` (such as " +":mimetype:`message/delivery-status` and :mimetype:`message/rfc822`) will " +"also be parsed as container object containing a list payload of length 1. " +"Their :meth:`~email.message.EmailMessage.is_multipart` method will return " +"``True``. The single element yielded by " +":meth:`~email.message.EmailMessage.iter_parts` will be a sub-message object." +msgstr "" +"大多数内容类型为 :mimetype:`message/\\*` (例如 :mimetype:`message/delivery-status` 和 " +":mimetype:`message/rfc822`) 的消息也会被解析为一个负载是长度为 1 的列表的容器对象。在它们身上调用 " +":meth:`~email.message.EmailMessage.is_multipart` 方法会返回 ``True``,调用 " +":meth:`~email.message.EmailMessage.iter_parts` 所产生的单个元素会是一个子消息对象。" + +#: ../../library/email.parser.rst:313 +msgid "" +"Some non-standards-compliant messages may not be internally consistent about" +" their :mimetype:`multipart`\\ -edness. Such messages may have a " +":mailheader:`Content-Type` header of type :mimetype:`multipart`, but their " +":meth:`~email.message.EmailMessage.is_multipart` method may return " +"``False``. If such messages were parsed with the " +":class:`~email.parser.FeedParser`, they will have an instance of the " +":class:`~email.errors.MultipartInvariantViolationDefect` class in their " +"*defects* attribute list. See :mod:`email.errors` for details." +msgstr "" +"一些不遵循标准的消息在其内部关于它是否为 :mimetype:`multipart` 类型前后不一。这些消息可能在消息头的 " +":mailheader:`Content-Type` 字段中写明为 :mimetype:`multipart`,但它们的 " +":meth:`~email.message.EmailMessage.is_multipart` 方法的返回值可能是 ``False`` " +"。如果这种消息被 :class:`~email.parser.FeedParser` 类解析,它们的 *defects* 属性列表当中会有一个 " +":class:`~email.errors.MultipartInvariantViolationDefect` 类的实例。关于更多信息,详见 " +":mod:`email.errors` ." diff --git a/library/email.po b/library/email.po new file mode 100644 index 0000000000..f122e7bd93 --- /dev/null +++ b/library/email.po @@ -0,0 +1,226 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/email.rst:2 +msgid ":mod:`!email` --- An email and MIME handling package" +msgstr ":mod:`!email` --- 电子邮件与 MIME 处理包" + +#: ../../library/email.rst:11 +msgid "**Source code:** :source:`Lib/email/__init__.py`" +msgstr "**源代码:** :source:`Lib/email/__init__.py`" + +#: ../../library/email.rst:15 +msgid "" +"The :mod:`!email` package is a library for managing email messages. It is " +"specifically *not* designed to do any sending of email messages to SMTP " +"(:rfc:`2821`), NNTP, or other servers; those are functions of modules such " +"as :mod:`smtplib`. The :mod:`!email` package attempts to be as RFC-" +"compliant as possible, supporting :rfc:`5322` and :rfc:`6532`, as well as " +"such MIME-related RFCs as :rfc:`2045`, :rfc:`2046`, :rfc:`2047`, " +":rfc:`2183`, and :rfc:`2231`." +msgstr "" + +#: ../../library/email.rst:23 +msgid "" +"The overall structure of the email package can be divided into three major " +"components, plus a fourth component that controls the behavior of the other " +"components." +msgstr "email 包的总体结构可以分为三个主要组件,另外还有第四个组件用于控制其他组件的行为。" + +#: ../../library/email.rst:27 +msgid "" +"The central component of the package is an \"object model\" that represents " +"email messages. An application interacts with the package primarily through" +" the object model interface defined in the :mod:`~email.message` sub-module." +" The application can use this API to ask questions about an existing email," +" to construct a new email, or to add or remove email subcomponents that " +"themselves use the same object model interface. That is, following the " +"nature of email messages and their MIME subcomponents, the email object " +"model is a tree structure of objects that all provide the " +":class:`~email.message.EmailMessage` API." +msgstr "" +"这个包的中心组件是代表电子邮件消息的“对象模型”。应用程序主要通过在 :mod:`~email.message` " +"子模块中定义的对象模型接口与这个包进行交互。应用程序可以使用此 API " +"来询问有关现有电子邮件的问题、构造新的电子邮件,或者添加或移除自身也使用相同对象模型接口的电子邮件子组件。也就是说,遵循电子邮件消息及其 MIME " +"子组件的性质,电子邮件对象模型是所有提供 :class:`~email.message.EmailMessage` API 的对象所构成的树状结构。" + +#: ../../library/email.rst:37 +msgid "" +"The other two major components of the package are the :mod:`~email.parser` " +"and the :mod:`~email.generator`. The parser takes the serialized version of" +" an email message (a stream of bytes) and converts it into a tree of " +":class:`~email.message.EmailMessage` objects. The generator takes an " +":class:`~email.message.EmailMessage` and turns it back into a serialized " +"byte stream. (The parser and generator also handle streams of text " +"characters, but this usage is discouraged as it is too easy to end up with " +"messages that are not valid in one way or another.)" +msgstr "" +"这个包的另外两个主要组件是 :mod:`~email.parser` 和 :mod:`~email.generator`。parser " +"接受电子邮件消息的序列化版本(字节流)并将其转换为 :class:`~email.message.EmailMessage` 对象树。 " +"generator 接受 :class:`~email.message.EmailMessage` 并将其转回序列化的字节流。 (parser 和 " +"generator 还能处理文本字符流,但不建议这种用法,因为这很容易导致某种形式的无效消息。)" + +#: ../../library/email.rst:46 +msgid "" +"The control component is the :mod:`~email.policy` module. Every " +":class:`~email.message.EmailMessage`, every :mod:`~email.generator`, and " +"every :mod:`~email.parser` has an associated :mod:`~email.policy` object " +"that controls its behavior. Usually an application only needs to specify " +"the policy when an :class:`~email.message.EmailMessage` is created, either " +"by directly instantiating an :class:`~email.message.EmailMessage` to create" +" a new email, or by parsing an input stream using a :mod:`~email.parser`. " +"But the policy can be changed when the message is serialized using a " +":mod:`~email.generator`. This allows, for example, a generic email message " +"to be parsed from disk, but to serialize it using standard SMTP settings " +"when sending it to an email server." +msgstr "" +"控制组件是 :mod:`~email.policy` 模块。每一个 :class:`~email.message.EmailMessage`、每一个 " +":mod:`~email.generator` 和每一个 :mod:`~email.parser` 都有一个相关联的 " +":mod:`~email.policy` 对象来控制其行为。通常应用程序只有在 :class:`~email.message.EmailMessage`" +" 被创建时才需要指明控制策略,或者通过直接实例化 :class:`~email.message.EmailMessage` " +"来新建电子邮件,或者通过使用 :mod:`~email.parser` 来解析输入流。但是策略也可以在使用 " +":mod:`~email.generator` 序列化消息时被更改。 例如,这允许从磁盘解析通用电子邮件消息,而在将消息发送到电子邮件服务器时使用标准 " +"SMTP 设置对其进行序列化。" + +#: ../../library/email.rst:58 +msgid "" +"The email package does its best to hide the details of the various governing" +" RFCs from the application. Conceptually the application should be able to " +"treat the email message as a structured tree of unicode text and binary " +"attachments, without having to worry about how these are represented when " +"serialized. In practice, however, it is often necessary to be aware of at " +"least some of the rules governing MIME messages and their structure, " +"specifically the names and nature of the MIME \"content types\" and how they" +" identify multipart documents. For the most part this knowledge should only" +" be required for more complex applications, and even then it should only be " +"the high level structure in question, and not the details of how those " +"structures are represented. Since MIME content types are used widely in " +"modern internet software (not just email), this will be a familiar concept " +"to many programmers." +msgstr "" +"email 包会尽量地对应用程序隐藏各种控制类 RFC 的细节。从概念上讲应用程序应当能够将电子邮件消息视为 Unicode " +"文本和二进制附件的结构化树,而不必担心在序列化时要如何表示它们。但在实际中,经常有必要至少了解一部分控制类 MIME 消息及其结构的规则,特别是 " +"MIME \"内容类型\" 的名称和性质以及它们是如何标识多部分文档的。 " +"在大多数情况下这些知识应当仅对于更复杂的应用程序来说才是必需的,并且即便在那时它也应当仅是特定的高层级结构,而不是如何表示这些结构的细节信息。由于 " +"MIME 内容类型被广泛应用于现代因特网软件(而非只是电子邮件),因此这对许多程序员来说将是很熟悉的概念。" + +#: ../../library/email.rst:71 +msgid "" +"The following sections describe the functionality of the :mod:`!email` " +"package. We start with the :mod:`~email.message` object model, which is the " +"primary interface an application will use, and follow that with the " +":mod:`~email.parser` and :mod:`~email.generator` components. Then we cover " +"the :mod:`~email.policy` controls, which completes the treatment of the main" +" components of the library." +msgstr "" + +#: ../../library/email.rst:78 +msgid "" +"The next three sections cover the exceptions the package may raise and the " +"defects (non-compliance with the RFCs) that the :mod:`~email.parser` may " +"detect. Then we cover the :mod:`~email.headerregistry` and the " +":mod:`~email.contentmanager` sub-components, which provide tools for doing " +"more detailed manipulation of headers and payloads, respectively. Both of " +"these components contain features relevant to consuming and producing non-" +"trivial messages, but also document their extensibility APIs, which will be " +"of interest to advanced applications." +msgstr "" +"接下来的三个小节会介绍这个包可能引发的异常以及 :mod:`~email.parser` 可能检测到的缺陷(即与 RFC 不相符)。然后我们会介绍 " +":mod:`~email.headerregistry` 和 :mod:`~email.contentmanager` " +"子组件,它们分别提供了用于更精细地操纵标题和载荷的工具。这两个组件除了包含使用与生成非简单消息的相关特性,还记录了它们的可扩展性 " +"API,这将是高级应用程序所感兴趣的内容。" + +#: ../../library/email.rst:87 +msgid "" +"Following those is a set of examples of using the fundamental parts of the " +"APIs covered in the preceding sections." +msgstr "在此之后是一组使用之前小节所介绍的 API 的基本部分的示例。" + +#: ../../library/email.rst:90 +msgid "" +"The foregoing represent the modern (unicode friendly) API of the email " +"package. The remaining sections, starting with the " +":class:`~email.message.Message` class, cover the legacy " +":data:`~email.policy.compat32` API that deals much more directly with the " +"details of how email messages are represented. The " +":data:`~email.policy.compat32` API does *not* hide the details of the RFCs " +"from the application, but for applications that need to operate at that " +"level, they can be useful tools. This documentation is also relevant for " +"applications that are still using the :mod:`~email.policy.compat32` API for " +"backward compatibility reasons." +msgstr "" +"前面的内容是 email 包的现代(对 Unicode 支持良好)API。从 :class:`~email.message.Message` " +"类开始的其余小节则介绍了旧式 :data:`~email.policy.compat32` API,它会更直接地处理如何表示电子邮件消息的细节。 " +":data:`~email.policy.compat32` API *不会* 向应用程序隐藏 RFC " +"的相关细节,但对于需要进行此种层级操作的应用程序来说将是很有用的工具。此文档对于因向下兼容理由而仍然使用 " +":mod:`~email.policy.compat32` API 的应用程序也是很适合的。" + +#: ../../library/email.rst:100 +msgid "" +"Docs reorganized and rewritten to promote the new " +":class:`~email.message.EmailMessage`/:class:`~email.policy.EmailPolicy` API." +msgstr "" +"文档经过重新组织和撰写以鼓励使用新的 " +":class:`~email.message.EmailMessage`/:class:`~email.policy.EmailPolicy` API." + +#: ../../library/email.rst:105 +msgid "Contents of the :mod:`!email` package documentation:" +msgstr "" + +#: ../../library/email.rst:120 +msgid "Legacy API:" +msgstr "旧式 API:" + +#: ../../library/email.rst:135 +msgid "Module :mod:`smtplib`" +msgstr ":mod:`smtplib` 模块" + +#: ../../library/email.rst:136 +msgid "SMTP (Simple Mail Transport Protocol) client" +msgstr "SMTP (简单邮件传输协议) 客户端" + +#: ../../library/email.rst:138 +msgid "Module :mod:`poplib`" +msgstr ":mod:`poplib` 模块" + +#: ../../library/email.rst:139 +msgid "POP (Post Office Protocol) client" +msgstr "POP (邮局协议) 客户端" + +#: ../../library/email.rst:141 +msgid "Module :mod:`imaplib`" +msgstr ":mod:`imaplib` 模块" + +#: ../../library/email.rst:142 +msgid "IMAP (Internet Message Access Protocol) client" +msgstr "IMAP (互联网消息访问协议) 客户端" + +#: ../../library/email.rst:144 +msgid "Module :mod:`mailbox`" +msgstr ":mod:`mailbox` 模块" + +#: ../../library/email.rst:145 +msgid "" +"Tools for creating, reading, and managing collections of messages on disk " +"using a variety standard formats." +msgstr "使用多种标准格式来创建、读取和管理磁盘上的消息集的工具。" diff --git a/library/email.policy.po b/library/email.policy.po new file mode 100644 index 0000000000..e45c2fde29 --- /dev/null +++ b/library/email.policy.po @@ -0,0 +1,1014 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/email.policy.rst:2 +msgid ":mod:`!email.policy`: Policy Objects" +msgstr ":mod:`!email.policy`: 策略对象" + +#: ../../library/email.policy.rst:9 +msgid "**Source code:** :source:`Lib/email/policy.py`" +msgstr "**源代码:** :source:`Lib/email/policy.py`" + +#: ../../library/email.policy.rst:13 +msgid "" +"The :mod:`email` package's prime focus is the handling of email messages as " +"described by the various email and MIME RFCs. However, the general format " +"of email messages (a block of header fields each consisting of a name " +"followed by a colon followed by a value, the whole block followed by a blank" +" line and an arbitrary 'body'), is a format that has found utility outside " +"of the realm of email. Some of these uses conform fairly closely to the " +"main email RFCs, some do not. Even when working with email, there are times" +" when it is desirable to break strict compliance with the RFCs, such as " +"generating emails that interoperate with email servers that do not " +"themselves follow the standards, or that implement extensions you want to " +"use in ways that violate the standards." +msgstr "" +":mod:`email` 的主要焦点是按照各种电子邮件和 MIME RFC 的描述来处理电子邮件消息。 " +"但是电子邮件消息的基本格式(一个由名称加冒号加值的标头字段构成的区块,后面再加一个空白行和任意的‘消息体’)是在电子邮件领域以外也获得应用的格式。 " +"这些应用的规则有些与主要电子邮件 RFC 十分接近,有些则很不相同。即使是操作电子邮件,有时也可能需要打破严格的 RFC " +"规则,例如生成可与某些并不遵循标准的电子邮件服务器互联的电子邮件,或者是实现希望应用某些破坏标准的操作方式的扩展。" + +#: ../../library/email.policy.rst:25 +msgid "" +"Policy objects give the email package the flexibility to handle all these " +"disparate use cases." +msgstr "Policy 对象给予 email 包处理这些不同用例的灵活性。" + +#: ../../library/email.policy.rst:28 +msgid "" +"A :class:`Policy` object encapsulates a set of attributes and methods that " +"control the behavior of various components of the email package during use. " +":class:`Policy` instances can be passed to various classes and methods in " +"the email package to alter the default behavior. The settable values and " +"their defaults are described below." +msgstr "" +":class:`Policy` 对象封装了一组属性和方法用来在使用期间控制 email 包中各个组件的行为。 :class:`Policy` " +"实例可以被传给 email 包中的多个类和方法以更改它们的默认行为。可设置的值及其默认值如下所述。" + +#: ../../library/email.policy.rst:34 +msgid "" +"There is a default policy used by all classes in the email package. For all" +" of the :mod:`~email.parser` classes and the related convenience functions, " +"and for the :class:`~email.message.Message` class, this is the " +":class:`Compat32` policy, via its corresponding pre-defined instance " +":const:`compat32`. This policy provides for complete backward compatibility" +" (in some cases, including bug compatibility) with the pre-Python3.3 version" +" of the email package." +msgstr "" +"在 email 包中的所有类会使用一个默认的策略。对于所有 :mod:`~email.parser` 类及相关的便捷函数,还有对于 " +":class:`~email.message.Message` 类来说,它是 :class:`Compat32` 策略,通过其对应的预定义实例 " +":const:`compat32` 来使用。这个策略提供了与 Python3.3 版之前的 email " +"包的完全向下兼容性(在某些情况下,也包括对缺陷的兼容性)。" + +#: ../../library/email.policy.rst:41 +msgid "" +"This default value for the *policy* keyword to " +":class:`~email.message.EmailMessage` is the :class:`EmailPolicy` policy, via" +" its pre-defined instance :data:`~default`." +msgstr "" +"传给 :class:`~email.message.EmailMessage` 的 *policy* 关键字的默认值是 " +":class:`EmailPolicy` 策略,表示为其预定义的实例 :data:`~default`。" + +#: ../../library/email.policy.rst:45 +msgid "" +"When a :class:`~email.message.Message` or " +":class:`~email.message.EmailMessage` object is created, it acquires a " +"policy. If the message is created by a :mod:`~email.parser`, a policy " +"passed to the parser will be the policy used by the message it creates. If " +"the message is created by the program, then the policy can be specified when" +" it is created. When a message is passed to a :mod:`~email.generator`, the " +"generator uses the policy from the message by default, but you can also pass" +" a specific policy to the generator that will override the one stored on the" +" message object." +msgstr "" +"在创建 :class:`~email.message.Message` 或 :class:`~email.message.EmailMessage` " +"对象时,它需要一个策略。如果消息是由 :mod:`~email.parser` 创建的,则传给该解析器的策略将是它所创建的消息所使用的策略。 " +"如果消息是由程序创建的,则该策略可以在创建它的时候指定。当消息被传递给 :mod:`~email.generator` " +"时,生成器默认会使用来自该消息的策略,但你也可以将指定的策略传递给生成器,这将覆盖存储在消息对象上的策略。" + +#: ../../library/email.policy.rst:54 +msgid "" +"The default value for the *policy* keyword for the :mod:`email.parser` " +"classes and the parser convenience functions **will be changing** in a " +"future version of Python. Therefore you should **always specify explicitly " +"which policy you want to use** when calling any of the classes and functions" +" described in the :mod:`~email.parser` module." +msgstr "" +":mod:`email.parser` 类和解析器便捷函数的 *policy* 关键字的默认值在未来的 Python 版本中 **将会改变**。 " +"因此在调用任何 :mod:`~email.parser` 模块所描述的类和函数时你应当 **总是显式地指定你想要使用的策略**。" + +#: ../../library/email.policy.rst:60 +msgid "" +"The first part of this documentation covers the features of :class:`Policy`," +" an :term:`abstract base class` that defines the features that are common to" +" all policy objects, including :const:`compat32`. This includes certain " +"hook methods that are called internally by the email package, which a custom" +" policy could override to obtain different behavior. The second part " +"describes the concrete classes :class:`EmailPolicy` and :class:`Compat32`, " +"which implement the hooks that provide the standard behavior and the " +"backward compatible behavior and features, respectively." +msgstr "" +"本文档的第一部分介绍了 :class:`Policy` 的特性,它是一个 :term:`abstract base class`,定义了所有策略对象包括" +" :const:`compat32` 的共有特性。这些特性包括一些由 email 包内部调用的特定钩子方法,自定义策略可以重写这些方法以获得不同行为。 " +"第二部分描述了具体类 :class:`EmailPolicy` 和 " +":class:`Compat32`,它们分别实现了提供标准行为和向下兼容行为与特性的钩子。" + +#: ../../library/email.policy.rst:69 +msgid "" +":class:`Policy` instances are immutable, but they can be cloned, accepting " +"the same keyword arguments as the class constructor and returning a new " +":class:`Policy` instance that is a copy of the original but with the " +"specified attributes values changed." +msgstr "" +":class:`Policy` 实例是不可变的,但它们可以被克隆,接受与类构造器一致的关键字参数并返回一个新的 :class:`Policy` " +"实例,新实例是原实例的副本,但具有被改变的指定属性。" + +#: ../../library/email.policy.rst:74 +msgid "" +"As an example, the following code could be used to read an email message " +"from a file on disk and pass it to the system ``sendmail`` program on a Unix" +" system:" +msgstr "例如,以下代码可以被用来从一个 Unix 系统的磁盘文件中读取电子邮件消息并将其传递给系统的 ``sendmail`` 程序:" + +#: ../../library/email.policy.rst:89 +msgid "" +">>> from email import message_from_binary_file\n" +">>> from email.generator import BytesGenerator\n" +">>> from email import policy\n" +">>> from subprocess import Popen, PIPE\n" +">>> with open('mymsg.txt', 'rb') as f:\n" +"... msg = message_from_binary_file(f, policy=policy.default)\n" +"...\n" +">>> p = Popen(['sendmail', msg['To'].addresses[0]], stdin=PIPE)\n" +">>> g = BytesGenerator(p.stdin, policy=msg.policy.clone(linesep='\\r\\n'))\n" +">>> g.flatten(msg)\n" +">>> p.stdin.close()\n" +">>> rc = p.wait()" +msgstr "" +">>> from email import message_from_binary_file\n" +">>> from email.generator import BytesGenerator\n" +">>> from email import policy\n" +">>> from subprocess import Popen, PIPE\n" +">>> with open('mymsg.txt', 'rb') as f:\n" +"... msg = message_from_binary_file(f, policy=policy.default)\n" +"...\n" +">>> p = Popen(['sendmail', msg['To'].addresses[0]], stdin=PIPE)\n" +">>> g = BytesGenerator(p.stdin, policy=msg.policy.clone(linesep='\\r\\n'))\n" +">>> g.flatten(msg)\n" +">>> p.stdin.close()\n" +">>> rc = p.wait()" + +#: ../../library/email.policy.rst:111 +msgid "" +"Here we are telling :class:`~email.generator.BytesGenerator` to use the RFC " +"correct line separator characters when creating the binary string to feed " +"into ``sendmail's`` ``stdin``, where the default policy would use ``\\n`` " +"line separators." +msgstr "" +"这里我们让 :class:`~email.generator.BytesGenerator` 在创建要送入 ``sendmail's`` " +"``stdin`` 的二进制字串时使用符合 RFC 的行分隔字符,默认的策略将会使用 ``\\n`` 行分隔符。" + +#: ../../library/email.policy.rst:116 +msgid "" +"Some email package methods accept a *policy* keyword argument, allowing the " +"policy to be overridden for that method. For example, the following code " +"uses the :meth:`~email.message.Message.as_bytes` method of the *msg* object " +"from the previous example and writes the message to a file using the native " +"line separators for the platform on which it is running::" +msgstr "" +"某些 email 包的方法接受一个 *policy* 关键字参数,允许为该方法覆盖原有策略。例如,以下代码使用了来自之前示例的 *msg* 对象的 " +":meth:`~email.message.Message.as_bytes` 方法并使用其运行所在平台的本机行分隔符将消息写入一个文件::" + +#: ../../library/email.policy.rst:122 +msgid "" +">>> import os\n" +">>> with open('converted.txt', 'wb') as f:\n" +"... f.write(msg.as_bytes(policy=msg.policy.clone(linesep=os.linesep)))\n" +"17" +msgstr "" +">>> import os\n" +">>> with open('converted.txt', 'wb') as f:\n" +"... f.write(msg.as_bytes(policy=msg.policy.clone(linesep=os.linesep)))\n" +"17" + +#: ../../library/email.policy.rst:127 +msgid "" +"Policy objects can also be combined using the addition operator, producing a" +" policy object whose settings are a combination of the non-default values of" +" the summed objects::" +msgstr "Policy 对象也可使用加法运算符进行组合来产生一个新策略对象,其设置是被加总对象的非默认值的组合::" + +#: ../../library/email.policy.rst:131 +msgid "" +">>> compat_SMTP = policy.compat32.clone(linesep='\\r\\n')\n" +">>> compat_strict = policy.compat32.clone(raise_on_defect=True)\n" +">>> compat_strict_SMTP = compat_SMTP + compat_strict" +msgstr "" +">>> compat_SMTP = policy.compat32.clone(linesep='\\r\\n')\n" +">>> compat_strict = policy.compat32.clone(raise_on_defect=True)\n" +">>> compat_strict_SMTP = compat_SMTP + compat_strict" + +#: ../../library/email.policy.rst:135 +msgid "" +"This operation is not commutative; that is, the order in which the objects " +"are added matters. To illustrate::" +msgstr "此运算不满足交换律;也就是说对象的添加顺序很重要。见以下演示::" + +#: ../../library/email.policy.rst:138 +msgid "" +">>> policy100 = policy.compat32.clone(max_line_length=100)\n" +">>> policy80 = policy.compat32.clone(max_line_length=80)\n" +">>> apolicy = policy100 + policy80\n" +">>> apolicy.max_line_length\n" +"80\n" +">>> apolicy = policy80 + policy100\n" +">>> apolicy.max_line_length\n" +"100" +msgstr "" +">>> policy100 = policy.compat32.clone(max_line_length=100)\n" +">>> policy80 = policy.compat32.clone(max_line_length=80)\n" +">>> apolicy = policy100 + policy80\n" +">>> apolicy.max_line_length\n" +"80\n" +">>> apolicy = policy80 + policy100\n" +">>> apolicy.max_line_length\n" +"100" + +#: ../../library/email.policy.rst:150 +msgid "" +"This is the :term:`abstract base class` for all policy classes. It provides" +" default implementations for a couple of trivial methods, as well as the " +"implementation of the immutability property, the :meth:`clone` method, and " +"the constructor semantics." +msgstr "" +"这是所有策略类的 :term:`abstract base class`。 " +"它提供了一些简单方法的默认实现,以及不可变特征属性,:meth:`clone` 方法以及构造器语义的实现。" + +#: ../../library/email.policy.rst:155 +msgid "" +"The constructor of a policy class can be passed various keyword arguments. " +"The arguments that may be specified are any non-method properties on this " +"class, plus any additional non-method properties on the concrete class. A " +"value specified in the constructor will override the default value for the " +"corresponding attribute." +msgstr "" +"可以向策略类的构造器传入各种关键字参数。可以指定的参数是该类的任何非方法特征属性,以及具体类的任何额外非方法特征属性。 " +"在构造器中指定的值将覆盖相应属性的默认值。" + +#: ../../library/email.policy.rst:161 +msgid "" +"This class defines the following properties, and thus values for the " +"following may be passed in the constructor of any policy class:" +msgstr "这个类定义了下列特征属性,因此下列值可以被传给任何策略类的构造器:" + +#: ../../library/email.policy.rst:167 +msgid "" +"The maximum length of any line in the serialized output, not counting the " +"end of line character(s). Default is 78, per :rfc:`5322`. A value of ``0``" +" or :const:`None` indicates that no line wrapping should be done at all." +msgstr "" +"序列化输出中任何行的最大长度,不计入末尾的行结束字符。默认值为 78,基于 :rfc:`5322`。值为 ``0`` 或 :const:`None` " +"表示不进行任何换行处理。" + +#: ../../library/email.policy.rst:175 +msgid "" +"The string to be used to terminate lines in serialized output. The default " +"is ``\\n`` because that's the internal end-of-line discipline used by " +"Python, though ``\\r\\n`` is required by the RFCs." +msgstr "" +"用来在序列化输出中终止行的字符串。默认值为 ``\\n`` 因为这是 Python 所使用的内部行结束符规范,但 RFC 的要求是 " +"``\\r\\n``。" + +#: ../../library/email.policy.rst:182 +msgid "" +"Controls the type of Content Transfer Encodings that may be or are required " +"to be used. The possible values are:" +msgstr "控制可能要求使用的内容传输编码格式类型。可能的值包括:" + +#: ../../library/email.policy.rst:188 +msgid "``7bit``" +msgstr "``7bit``" + +#: ../../library/email.policy.rst:188 +msgid "" +"all data must be \"7 bit clean\" (ASCII-only). This means that where " +"necessary data will be encoded using either quoted-printable or base64 " +"encoding." +msgstr "所有数据必须为“纯 7 比特位”(仅 ASCII)。这意味着在必要情况下数据将使用可打印引用形式或 base64 编码格式进行编码。" + +#: ../../library/email.policy.rst:192 +msgid "``8bit``" +msgstr "``8bit``" + +#: ../../library/email.policy.rst:192 +msgid "" +"data is not constrained to be 7 bit clean. Data in headers is still " +"required to be ASCII-only and so will be encoded (see :meth:`fold_binary` " +"and :attr:`~EmailPolicy.utf8` below for exceptions), but body parts may use " +"the ``8bit`` CTE." +msgstr "" +"数据不会被限制为纯 7 比特位。标头中的数据仍要求仅 ASCII 因此将被编码(参阅下文的 :meth:`fold_binary` 和 " +":attr:`~EmailPolicy.utf8` 了解例外情况),但消息体部分可能使用 ``8bit`` CTE。" + +#: ../../library/email.policy.rst:198 +msgid "" +"A ``cte_type`` value of ``8bit`` only works with ``BytesGenerator``, not " +"``Generator``, because strings cannot contain binary data. If a " +"``Generator`` is operating under a policy that specifies ``cte_type=8bit``, " +"it will act as if ``cte_type`` is ``7bit``." +msgstr "" +"``cte_type`` 值为 ``8bit`` 仅适用于 ``BytesGenerator`` 而非 " +"``Generator``,因为字符串不能包含二进制数据。如果 ``Generator`` 运行于指定了 ``cte_type=8bit`` " +"的策略,它的行为将与 ``cte_type`` 为 ``7bit`` 相同。" + +#: ../../library/email.policy.rst:206 +msgid "" +"If :const:`True`, any defects encountered will be raised as errors. If " +":const:`False` (the default), defects will be passed to the " +":meth:`register_defect` method." +msgstr "" +"如为 :const:`True`,则遇到的任何缺陷都将引发错误。 如为 :const:`False` (默认值),则缺陷将被传递给 " +":meth:`register_defect` 方法。" + +#: ../../library/email.policy.rst:213 +msgid "" +"If :const:`True`, lines starting with *\"From \"* in the body are escaped by" +" putting a ``>`` in front of them. This parameter is used when the message " +"is being serialized by a generator. Default: :const:`False`." +msgstr "" +"如为 :const:`True`,则消息体中以 *\"From \"* 开头的行会通过在其前面放一个 ``>`` 来进行转义。 " +"当消息被生成器执行序列化时会使用此形参。默认值::const:`False`。" + +#: ../../library/email.policy.rst:223 +msgid "" +"A factory function for constructing a new empty message object. Used by the" +" parser when building messages. Defaults to ``None``, in which case " +":class:`~email.message.Message` is used." +msgstr "" +"用来构造新的空消息对象的工厂函数。在构建消息时由解析器使用。默认为 ``None``,在此情况下会使用 " +":class:`~email.message.Message`." + +#: ../../library/email.policy.rst:232 +msgid "" +"If ``True`` (the default), the generator will raise " +":exc:`~email.errors.HeaderWriteError` instead of writing a header that is " +"improperly folded or delimited, such that it would be parsed as multiple " +"headers or joined with adjacent data. Such headers can be generated by " +"custom header classes or bugs in the ``email`` module." +msgstr "" +"如为 ``True`` (默认值),则生成器会引发 :exc:`~email.errors.HeaderWriteError` " +"而不是写入一个不正确地折叠或分隔的标头,即那些会被解析为多个标头或与相邻数据合并的标头。 这样的标头可能由自定义标头类或 ``email`` " +"模块中的程序错误所产生。" + +#: ../../library/email.policy.rst:239 +msgid "" +"As it's a security feature, this defaults to ``True`` even in the " +":class:`~email.policy.Compat32` policy. For backwards compatible, but " +"unsafe, behavior, it must be set to ``False`` explicitly." +msgstr "" +"由于它是一个安全特性,即使是在 :class:`~email.policy.Compat32` 策略中该值也默认为 ``True``。 " +"为了保持向下兼容但是不安全的行为,它必须显式地被设为 ``False``。" + +#: ../../library/email.policy.rst:247 +msgid "" +"The following :class:`Policy` method is intended to be called by code using " +"the email library to create policy instances with custom settings:" +msgstr "下列 :class:`Policy` 方法是由使用 email 库的代码来调用以创建具有自定义设置的策略实例:" + +#: ../../library/email.policy.rst:253 +msgid "" +"Return a new :class:`Policy` instance whose attributes have the same values " +"as the current instance, except where those attributes are given new values " +"by the keyword arguments." +msgstr "返回一个新的 :class:`Policy` 实例,其属性与当前实例具有相同的值,除非是那些由关键字参数给出了新值的属性。" + +#: ../../library/email.policy.rst:258 +msgid "" +"The remaining :class:`Policy` methods are called by the email package code, " +"and are not intended to be called by an application using the email package." +" A custom policy must implement all of these methods." +msgstr "" +"其余的 :class:`Policy` 方法是由 email 包代码来调用的,而不应当被使用 email 包的应用程序所调用。 " +"自定义的策略必须实现所有这些方法。" + +#: ../../library/email.policy.rst:265 +msgid "" +"Handle a *defect* found on *obj*. When the email package calls this method," +" *defect* will always be a subclass of :class:`~email.errors.MessageDefect`." +msgstr "" +"处理在 *obj* 上发现的 *defect*。当 email 包调用此方法时,*defect* 将总是为 " +":class:`~email.errors.MessageDefect` 的一个子类。" + +#: ../../library/email.policy.rst:269 +msgid "" +"The default implementation checks the :attr:`raise_on_defect` flag. If it " +"is ``True``, *defect* is raised as an exception. If it is ``False`` (the " +"default), *obj* and *defect* are passed to :meth:`register_defect`." +msgstr "" +"默认实现会检查 :attr:`raise_on_defect` 旗标。 如果其为 ``True``,则 *defect* 会被作为异常来引发。 如果其为" +" ``False`` (默认值),则 *obj* 和 *defect* 会被传递给 :meth:`register_defect`。" + +#: ../../library/email.policy.rst:276 +msgid "" +"Register a *defect* on *obj*. In the email package, *defect* will always be" +" a subclass of :class:`~email.errors.MessageDefect`." +msgstr "" +"在 *obj* 上注册一个 *defect*。在 email 包中,*defect* 将总是为 " +":class:`~email.errors.MessageDefect` 的一个子类。" + +#: ../../library/email.policy.rst:279 +msgid "" +"The default implementation calls the ``append`` method of the ``defects`` " +"attribute of *obj*. When the email package calls :attr:`handle_defect`, " +"*obj* will normally have a ``defects`` attribute that has an ``append`` " +"method. Custom object types used with the email package (for example, " +"custom ``Message`` objects) should also provide such an attribute, otherwise" +" defects in parsed messages will raise unexpected errors." +msgstr "" +"默认实现会调用 *obj* 的 ``defects`` 属性的 ``append`` 方法。当 email 包调用 " +":attr:`handle_defect` 时,*obj* 通常将具有一个带 ``append`` 方法的 ``defects`` 属性。配合 " +"email 包使用的自定义对象类型(例如自定义的 ``Message`` 对象)也应当提供这样的属性,否则在被解析消息中的缺陷将引发非预期的错误。" + +#: ../../library/email.policy.rst:289 +msgid "Return the maximum allowed number of headers named *name*." +msgstr "返回名为 *name* 的标头的最大允许数量。" + +#: ../../library/email.policy.rst:291 +msgid "" +"Called when a header is added to an :class:`~email.message.EmailMessage` or " +":class:`~email.message.Message` object. If the returned value is not ``0`` " +"or ``None``, and there are already a number of headers with the name *name* " +"greater than or equal to the value returned, a :exc:`ValueError` is raised." +msgstr "" +"当添加一个标头到 :class:`~email.message.EmailMessage` 或 " +":class:`~email.message.Message` 对象时被调用。如果返回值不为 ``0`` 或 ``None``,并且已有的名称为 " +"*name* 的标头数量大于等于所返回的值,则会引发 :exc:`ValueError`。" + +#: ../../library/email.policy.rst:297 +msgid "" +"Because the default behavior of ``Message.__setitem__`` is to append the " +"value to the list of headers, it is easy to create duplicate headers without" +" realizing it. This method allows certain headers to be limited in the " +"number of instances of that header that may be added to a ``Message`` " +"programmatically. (The limit is not observed by the parser, which will " +"faithfully produce as many headers as exist in the message being parsed.)" +msgstr "" +"由于 ``Message.__setitem__`` 的默认行为是将值添加到标头列表,因此很容易不知情地创建重复的标头。 " +"此方法允许在程序中限制可以被添加到 ``Message`` 中的特定标头的实例数量。 " +"(解析器不会考虑此限制,它将忠实地产生被解析消息中存在的任意数量的标头。)" + +#: ../../library/email.policy.rst:305 +msgid "The default implementation returns ``None`` for all header names." +msgstr "默认实现对于所有标头名称都返回 ``None``。" + +#: ../../library/email.policy.rst:310 +msgid "" +"The email package calls this method with a list of strings, each string " +"ending with the line separation characters found in the source being parsed." +" The first line includes the field header name and separator. All " +"whitespace in the source is preserved. The method should return the " +"``(name, value)`` tuple that is to be stored in the ``Message`` to represent" +" the parsed header." +msgstr "" +"email 包调用此方法时将传入一个字符串列表,其中每个字符串以在被解析源中找到的行分隔符结束。第一行包括字段标头名称和分隔符。 " +"源中的所有空白符都会被保留。此方法应当返回 ``(name, value)`` 元组以保存至 ``Message`` 中来代表被解析的标头。" + +#: ../../library/email.policy.rst:317 +msgid "" +"If an implementation wishes to retain compatibility with the existing email " +"package policies, *name* should be the case preserved name (all characters " +"up to the '``:``' separator), while *value* should be the unfolded value " +"(all line separator characters removed, but whitespace kept intact), " +"stripped of leading whitespace." +msgstr "" +"如果一个实现希望保持与现有 email 包策略的兼容性,则 *name* 应当为保留大小写形式的名称(所有字符直至 '``:``' 分隔符),而 " +"*value* 应当为展开后的值(移除所有行分隔符,但空白符保持不变),并移除开头的空白符。" + +#: ../../library/email.policy.rst:323 +msgid "*sourcelines* may contain surrogateescaped binary data." +msgstr "*sourcelines* 可以包含经替代转义的二进制数据。" + +#: ../../library/email.policy.rst:325 ../../library/email.policy.rst:341 +#: ../../library/email.policy.rst:357 +msgid "There is no default implementation" +msgstr "此方法没有默认实现" + +#: ../../library/email.policy.rst:330 +msgid "" +"The email package calls this method with the name and value provided by the " +"application program when the application program is modifying a ``Message`` " +"programmatically (as opposed to a ``Message`` created by a parser). The " +"method should return the ``(name, value)`` tuple that is to be stored in the" +" ``Message`` to represent the header." +msgstr "" +"当一个应用通过程序代码修改 ``Message`` (而不是由解析器创建 ``Message``) 时,email " +"包会调用此方法并附带应用程序所提供的名称和值。此方法应当返回 ``(name, value)`` 元组以保存至 ``Message`` 中用来表示标头。" + +#: ../../library/email.policy.rst:336 +msgid "" +"If an implementation wishes to retain compatibility with the existing email " +"package policies, the *name* and *value* should be strings or string " +"subclasses that do not change the content of the passed in arguments." +msgstr "" +"如果一个实现希望保持与现有 email 包策略的兼容性,则 *name* 和 *value* " +"应当为字符串或字符串的子类,它们不会修改在参数中传入的内容。" + +#: ../../library/email.policy.rst:346 +msgid "" +"The email package calls this method with the *name* and *value* currently " +"stored in the ``Message`` when that header is requested by the application " +"program, and whatever the method returns is what is passed back to the " +"application as the value of the header being retrieved. Note that there may " +"be more than one header with the same name stored in the ``Message``; the " +"method is passed the specific name and value of the header destined to be " +"returned to the application." +msgstr "" +"当标头被应用程序所请求时,email 包会调用此方法并附带当前保存在 ``Message`` 中的 *name* 和 " +"*value*,并且无论此方法返回什么它都会被回传给应用程序作为被提取标头的值。请注意可能会有多个相同名称的标头被保存在 ``Message`` " +"中;此方法会接收到要返回给应用程序的特定标头的名称和值。" + +#: ../../library/email.policy.rst:354 +msgid "" +"*value* may contain surrogateescaped binary data. There should be no " +"surrogateescaped binary data in the value returned by the method." +msgstr "*value* 可能包含经替代转义的二进制数据。此方法所返回的值应当没有经替代转义的二进制数据。" + +#: ../../library/email.policy.rst:362 +msgid "" +"The email package calls this method with the *name* and *value* currently " +"stored in the ``Message`` for a given header. The method should return a " +"string that represents that header \"folded\" correctly (according to the " +"policy settings) by composing the *name* with the *value* and inserting " +":attr:`linesep` characters at the appropriate places. See :rfc:`5322` for a" +" discussion of the rules for folding email headers." +msgstr "" +"email 包调用此方法时会附带当前保存在 ``Message`` 中的给定标头的 *name* 和 *value*。 " +"此方法应当返回一个代表该标头的(根据策略设置)通过处理 *name* 和 *value* 并在适当位置插入 :attr:`linesep` " +"字符来正确地“折叠”的字符串。请参阅 :rfc:`5322` 了解有关折叠电子邮件标头的规则的讨论。" + +#: ../../library/email.policy.rst:369 +msgid "" +"*value* may contain surrogateescaped binary data. There should be no " +"surrogateescaped binary data in the string returned by the method." +msgstr "*value* 可能包含经替代转义的二进制数据。此方法所返回的字符串应当没有经替代转义的二进制数据。" + +#: ../../library/email.policy.rst:375 +msgid "" +"The same as :meth:`fold`, except that the returned value should be a bytes " +"object rather than a string." +msgstr "与 :meth:`fold` 类似,不同之处在于返回的值应当为字节串对象而非字符串。" + +#: ../../library/email.policy.rst:378 +msgid "" +"*value* may contain surrogateescaped binary data. These could be converted " +"back into binary data in the returned bytes object." +msgstr "*value* 可能包含经替代转义的二进制数据。这些数据可以在被返回的字节串对象中被转换回二进制数据。" + +#: ../../library/email.policy.rst:385 +msgid "" +"This concrete :class:`Policy` provides behavior that is intended to be fully" +" compliant with the current email RFCs. These include (but are not limited " +"to) :rfc:`5322`, :rfc:`2047`, and the current MIME RFCs." +msgstr "" +"这个具体 :class:`Policy` 提供了完全遵循当前电子邮件 RFC 的行为。这包括(但不限于):rfc:`5322`, :rfc:`2047`" +" 以及当前的各种 MIME RFC。" + +#: ../../library/email.policy.rst:389 +msgid "" +"This policy adds new header parsing and folding algorithms. Instead of " +"simple strings, headers are ``str`` subclasses with attributes that depend " +"on the type of the field. The parsing and folding algorithm fully implement" +" :rfc:`2047` and :rfc:`5322`." +msgstr "" +"此策略添加了新的标头解析和折叠算法。标头不是简单的字符串,而是带有依赖于字段类型的属性的 ``str`` 的子类。这个解析和折叠算法完整实现了 " +":rfc:`2047` 和 :rfc:`5322`。" + +#: ../../library/email.policy.rst:394 +msgid "" +"The default value for the :attr:`~email.policy.Policy.message_factory` " +"attribute is :class:`~email.message.EmailMessage`." +msgstr "" +":attr:`~email.policy.Policy.message_factory` 属性的默认值为 " +":class:`~email.message.EmailMessage`." + +#: ../../library/email.policy.rst:397 +msgid "" +"In addition to the settable attributes listed above that apply to all " +"policies, this policy adds the following additional attributes:" +msgstr "除了上面列出的适用于所有策略的可设置属性,此策略还添加了下列额外属性:" + +#: ../../library/email.policy.rst:400 +msgid "[1]_" +msgstr "[1]_" + +#: ../../library/email.policy.rst:405 +msgid "" +"If ``False``, follow :rfc:`5322`, supporting non-ASCII characters in headers" +" by encoding them as :rfc:`2047` \"encoded words\". If ``True``, follow " +":rfc:`6532` and use ``utf-8`` encoding for headers. Messages formatted in " +"this way may be passed to SMTP servers that support the ``SMTPUTF8`` " +"extension (:rfc:`6531`)." +msgstr "" + +#: ../../library/email.policy.rst:411 +msgid "" +"When ``False``, the generator will raise " +":exc:`~email.errors.HeaderWriteError` if any header includes non-ASCII " +"characters in a context where :rfc:`2047` does not permit encoded words. " +"This particularly applies to mailboxes (\"addr-spec\") with non-ASCII " +"characters, which can be created via :class:`~email.headerregistry.Address`." +" To use a mailbox with a non-ASCII domain name with ``utf8=False``, first " +"encode the domain using the third-party :pypi:`idna` or :pypi:`uts46` module" +" or with :mod:`encodings.idna`. It is not possible to use a non-ASCII " +"username (\"local-part\") in a mailbox when ``utf8=False``." +msgstr "" + +#: ../../library/email.policy.rst:422 +msgid "" +"Can trigger the raising of :exc:`~email.errors.HeaderWriteError`. (Earlier " +"versions incorrectly applied :rfc:`2047` in certain contexts, mostly notably" +" in addr-specs.)" +msgstr "" + +#: ../../library/email.policy.rst:429 +msgid "" +"If the value for a header in the ``Message`` object originated from a " +":mod:`~email.parser` (as opposed to being set by a program), this attribute " +"indicates whether or not a generator should refold that value when " +"transforming the message back into serialized form. The possible values " +"are:" +msgstr "" +"如果 ``Message`` 对象中标头的值源自 :mod:`~email.parser` " +"(而非由程序设置),此属性会表明当将消息转换回序列化形式时是否应当由生成器来重新折叠该值。可能的值如下:" + +#: ../../library/email.policy.rst:436 +msgid "``none``" +msgstr "``none``" + +#: ../../library/email.policy.rst:436 +msgid "all source values use original folding" +msgstr "所有源值使用原始折叠" + +#: ../../library/email.policy.rst:438 +msgid "``long``" +msgstr "``long``" + +#: ../../library/email.policy.rst:438 +msgid "" +"source values that have any line that is longer than ``max_line_length`` " +"will be refolded" +msgstr "具有任何长度超过 ``max_line_length`` 的行的源值将被重新折叠" + +#: ../../library/email.policy.rst:441 +msgid "``all``" +msgstr "``all``" + +#: ../../library/email.policy.rst:441 +msgid "all values are refolded." +msgstr "所有值会被重新折叠。" + +#: ../../library/email.policy.rst:444 +msgid "The default is ``long``." +msgstr "默认值为 ``long``。" + +#: ../../library/email.policy.rst:449 +msgid "" +"A callable that takes two arguments, ``name`` and ``value``, where ``name`` " +"is a header field name and ``value`` is an unfolded header field value, and " +"returns a string subclass that represents that header. A default " +"``header_factory`` (see :mod:`~email.headerregistry`) is provided that " +"supports custom parsing for the various address and date :RFC:`5322` header " +"field types, and the major MIME header field stypes. Support for additional" +" custom parsing will be added in the future." +msgstr "" +"该可调用对象接受两个参数,``name`` 和 ``value``,其中 ``name`` 为标头字段名而 ``value`` " +"为展开后的标头字段值,并返回一个表示该标头的字符串子类。已提供的默认 ``header_factory`` (参见 " +":mod:`~email.headerregistry`) 支持对各种地址和日期 :RFC:`5322` 标头字段类型及主要 MIME " +"标头字段类型的自定义解析。未来还将添加对其他自定义解析的支持。" + +#: ../../library/email.policy.rst:460 +msgid "" +"An object with at least two methods: get_content and set_content. When the " +":meth:`~email.message.EmailMessage.get_content` or " +":meth:`~email.message.EmailMessage.set_content` method of an " +":class:`~email.message.EmailMessage` object is called, it calls the " +"corresponding method of this object, passing it the message object as its " +"first argument, and any arguments or keywords that were passed to it as " +"additional arguments. By default ``content_manager`` is set to " +":data:`~email.contentmanager.raw_data_manager`." +msgstr "" +"此对象至少有两个方法:get_content 和 set_content。当一个 " +":class:`~email.message.EmailMessage` 对象的 " +":meth:`~email.message.EmailMessage.get_content` 或 " +":meth:`~email.message.EmailMessage.set_content` " +"方法被调用时,它会调用此对象的相应方法,将消息对象作为其第一个参数,并将传给它的任何参数或关键字作为附加参数传入。默认情况下 " +"``content_manager`` 会被设为 :data:`~email.contentmanager.raw_data_manager`。" + +#: ../../library/email.policy.rst:472 ../../library/email.policy.rst:630 +msgid "" +"The class provides the following concrete implementations of the abstract " +"methods of :class:`Policy`:" +msgstr "这个类提供了下列对 :class:`Policy` 的抽象方法的具体实现:" + +#: ../../library/email.policy.rst:478 +msgid "" +"Returns the value of the :attr:`~email.headerregistry.BaseHeader.max_count` " +"attribute of the specialized class used to represent the header with the " +"given name." +msgstr "" +"返回用来表示具有给定名称的标头的专用类的 :attr:`~email.headerregistry.BaseHeader.max_count` " +"属性的值。" + +#: ../../library/email.policy.rst:486 ../../library/email.policy.rst:636 +msgid "" +"The name is parsed as everything up to the '``:``' and returned unmodified." +" The value is determined by stripping leading whitespace off the remainder " +"of the first line, joining all subsequent lines together, and stripping any " +"trailing carriage return or linefeed characters." +msgstr "" +"此名称会被作为到 '``:``' 止的所有内容来解析。 " +"该值是通过从第一行的剩余部分去除前导空格,再将所有后续行连接到一起,并去除所有末尾回车符或换行符来确定的。" + +#: ../../library/email.policy.rst:494 +msgid "" +"The name is returned unchanged. If the input value has a ``name`` attribute" +" and it matches *name* ignoring case, the value is returned unchanged. " +"Otherwise the *name* and *value* are passed to ``header_factory``, and the " +"resulting header object is returned as the value. In this case a " +"``ValueError`` is raised if the input value contains CR or LF characters." +msgstr "" +"name 将会被原样返回。如果输入值具有 ``name`` 属性并可在忽略大小写的情况下匹配 *name*,则 value 也会被原样返回。 " +"在其他情况下 *name* 和 *value* 会被传递给 ``header_factory``,并将结果标头对象作为值返回。在此情况下如果输入值包含 " +"CR 或 LF 字符则会引发 ``ValueError``。" + +#: ../../library/email.policy.rst:504 +msgid "" +"If the value has a ``name`` attribute, it is returned to unmodified. " +"Otherwise the *name*, and the *value* with any CR or LF characters removed, " +"are passed to the ``header_factory``, and the resulting header object is " +"returned. Any surrogateescaped bytes get turned into the unicode unknown-" +"character glyph." +msgstr "" +"如果值具有 ``name`` 属性,它会被原样返回。在其他情况下 *name* 和移除了所有 CR 和 LF 字符的 *value* 会被传递给 " +"``header_factory``,并返回结果标头对象。任何经替代转义的字节串会被转换为 unicode 未知字符字形。" + +#: ../../library/email.policy.rst:513 +msgid "" +"Header folding is controlled by the :attr:`refold_source` policy setting. A " +"value is considered to be a 'source value' if and only if it does not have a" +" ``name`` attribute (having a ``name`` attribute means it is a header object" +" of some sort). If a source value needs to be refolded according to the " +"policy, it is converted into a header object by passing the *name* and the " +"*value* with any CR and LF characters removed to the ``header_factory``. " +"Folding of a header object is done by calling its ``fold`` method with the " +"current policy." +msgstr "" +"标头折叠是由 :attr:`refold_source` 策略设置来控制的。当且仅当一个值没有 ``name`` 属性(具有 ``name`` " +"属性就意味着它是某种标头对象)它才会被当作是“源值”。如果一个源值需要按照策略来重新折叠,则会通过将 *name* 和去除了所有 CR 和 LF 字符的" +" *value* 传递给 ``header_factory`` 来将其转换为标头对象。标头对象的折叠是通过调用其 ``fold`` " +"方法并附带当前策略来完成的。" + +#: ../../library/email.policy.rst:522 +msgid "" +"Source values are split into lines using :meth:`~str.splitlines`. If the " +"value is not to be refolded, the lines are rejoined using the ``linesep`` " +"from the policy and returned. The exception is lines containing non-ascii " +"binary data. In that case the value is refolded regardless of the " +"``refold_source`` setting, which causes the binary data to be CTE encoded " +"using the ``unknown-8bit`` charset." +msgstr "" +"源值会使用 :meth:`~str.splitlines` 来拆分成多行。如果该值不被重新折叠,则会使用策略中的 ``linesep`` " +"重新合并这些行并将其返回。例外的是包含非 ascii 二进制数据的行。在此情况下无论 ``refold_source`` " +"如何设置该值都会被重新折叠,这会导致二进制数据使用 ``unknown-8bit`` 字符集进行 CTE 编码。" + +#: ../../library/email.policy.rst:532 +msgid "" +"The same as :meth:`fold` if :attr:`~Policy.cte_type` is ``7bit``, except " +"that the returned value is bytes." +msgstr "" +"如果 :attr:`~Policy.cte_type` 为 ``7bit`` 则与 :meth:`fold` 类似,不同之处在于返回的值是字节串。" + +#: ../../library/email.policy.rst:535 +msgid "" +"If :attr:`~Policy.cte_type` is ``8bit``, non-ASCII binary data is converted " +"back into bytes. Headers with binary data are not refolded, regardless of " +"the ``refold_header`` setting, since there is no way to know whether the " +"binary data consists of single byte characters or multibyte characters." +msgstr "" +"如果 :attr:`~Policy.cte_type` 为 ``8bit``,则将非 ASCII 二进制数据转换回字节串。 " +"带有二进制数据的标头不会被重新折叠,无论 ``refold_header`` 设置如何,因为无法知晓该二进制数据是由单字节字符还是多字节字符组成的。" + +#: ../../library/email.policy.rst:542 +msgid "" +"The following instances of :class:`EmailPolicy` provide defaults suitable " +"for specific application domains. Note that in the future the behavior of " +"these instances (in particular the ``HTTP`` instance) may be adjusted to " +"conform even more closely to the RFCs relevant to their domains." +msgstr "" +"以下 :class:`EmailPolicy` 的实例提供了适用于特定应用领域的默认值。请注意在未来这些实例(特别是 ``HTTP`` " +"实例)的行为可能会被调整以便更严格地遵循与其领域相关的 RFC。" + +#: ../../library/email.policy.rst:550 +msgid "" +"An instance of ``EmailPolicy`` with all defaults unchanged. This policy " +"uses the standard Python ``\\n`` line endings rather than the RFC-correct " +"``\\r\\n``." +msgstr "" +"一个未改变任何默认值的 ``EmailPolicy`` 实例。此策略使用标准的 Python ``\\n`` 行结束符而非遵循 RFC 的 " +"``\\r\\n``。" + +#: ../../library/email.policy.rst:557 +msgid "" +"Suitable for serializing messages in conformance with the email RFCs. Like " +"``default``, but with ``linesep`` set to ``\\r\\n``, which is RFC compliant." +msgstr "" +"适用于按照符合电子邮件 RFC 的方式来序列化消息。与 ``default`` 类似,但 ``linesep`` 被设为遵循 RFC 的 " +"``\\r\\n``。" + +#: ../../library/email.policy.rst:564 +msgid "" +"The same as ``SMTP`` except that :attr:`~EmailPolicy.utf8` is ``True``. " +"Useful for serializing messages to a message store without using encoded " +"words in the headers. Should only be used for SMTP transmission if the " +"sender or recipient addresses have non-ASCII characters (the " +":meth:`smtplib.SMTP.send_message` method handles this automatically)." +msgstr "" +"与 ``SMTP`` 类似但是 :attr:`~EmailPolicy.utf8` 为 ``True``。 " +"适用于在不使用标头内已编码字的情况下对消息进行序列化。如果发送方或接收方地址具有非 ASCII 字符则应当只被用于 SMTP 传输 " +"(:meth:`smtplib.SMTP.send_message` 方法会自动如此处理)。" + +#: ../../library/email.policy.rst:573 +msgid "" +"Suitable for serializing headers with for use in HTTP traffic. Like " +"``SMTP`` except that ``max_line_length`` is set to ``None`` (unlimited)." +msgstr "" +"适用于序列化标头以在 HTTP 通信中使用。与 ``SMTP`` 类似但是 ``max_line_length`` 被设为 ``None`` " +"(无限制)。" + +#: ../../library/email.policy.rst:579 +msgid "" +"Convenience instance. The same as ``default`` except that " +"``raise_on_defect`` is set to ``True``. This allows any policy to be made " +"strict by writing::" +msgstr "" +"便捷实例。与 ``default`` 类似但是 ``raise_on_defect`` 被设为 ``True``。 " +"这样可以允许通过以下写法来严格地设置任何策略::" + +#: ../../library/email.policy.rst:583 +msgid "somepolicy + policy.strict" +msgstr "somepolicy + policy.strict" + +#: ../../library/email.policy.rst:586 +msgid "" +"With all of these :class:`EmailPolicies <.EmailPolicy>`, the effective API " +"of the email package is changed from the Python 3.2 API in the following " +"ways:" +msgstr "" +"在使用所有这些 :class:`EmailPolicies <.EmailPolicy>` 时,email 包的实际 API 相比 Python 3.2" +" API 发生了以下几方面变化:" + +#: ../../library/email.policy.rst:589 +msgid "" +"Setting a header on a :class:`~email.message.Message` results in that header" +" being parsed and a header object created." +msgstr "在 :class:`~email.message.Message` 中设置标头将使得该标头被解析并创建一个标头对象。" + +#: ../../library/email.policy.rst:592 +msgid "" +"Fetching a header value from a :class:`~email.message.Message` results in " +"that header being parsed and a header object created and returned." +msgstr "从 :class:`~email.message.Message` 提取标头将使得该标头被解析并创建和返回一个标头对象。" + +#: ../../library/email.policy.rst:596 +msgid "" +"Any header object, or any header that is refolded due to the policy " +"settings, is folded using an algorithm that fully implements the RFC folding" +" algorithms, including knowing where encoded words are required and allowed." +msgstr "" +"任何标头对象或任何由于策略设置而被重新折叠的标头都会使用一种完全实现了 RFC 折叠算法的算法来进行折叠,包括知道在哪里需要并允许已编码字。" + +#: ../../library/email.policy.rst:601 +msgid "" +"From the application view, this means that any header obtained through the " +":class:`~email.message.EmailMessage` is a header object with extra " +"attributes, whose string value is the fully decoded unicode value of the " +"header. Likewise, a header may be assigned a new value, or a new header " +"created, using a unicode string, and the policy will take care of converting" +" the unicode string into the correct RFC encoded form." +msgstr "" +"从应用程序的视角来看,这意味着任何通过 :class:`~email.message.EmailMessage` " +"获得的标头都是具有附加属性的标头对象,其字符串值都是该标头的完全解码后的 unicode 值。类似地,可以使用 unicode " +"对象为一个标头赋予新的值,或创建一个新的标头对象,并且该策略将负责把该 unicode 字符串转换为正确的 RFC 已编码形式。" + +#: ../../library/email.policy.rst:608 +msgid "" +"The header objects and their attributes are described in " +":mod:`~email.headerregistry`." +msgstr "标头对象及其属性的描述见 :mod:`~email.headerregistry`。" + +#: ../../library/email.policy.rst:615 +msgid "" +"This concrete :class:`Policy` is the backward compatibility policy. It " +"replicates the behavior of the email package in Python 3.2. The " +":mod:`!policy` module also defines an instance of this class, " +":const:`compat32`, that is used as the default policy. Thus the default " +"behavior of the email package is to maintain compatibility with Python 3.2." +msgstr "" +"这个具体 :class:`Policy` 向下兼容策略。它复制了 Python 3.2 中 email 包的行为。 :mod:`!policy` " +"模块还定义了该类的一个实例 :const:`compat32`,用来作为默认策略。因此 email 包的默认行为会保持与 Python 3.2 " +"的兼容性。" + +#: ../../library/email.policy.rst:621 +msgid "" +"The following attributes have values that are different from the " +":class:`Policy` default:" +msgstr "下列属性具有与 :class:`Policy` 默认值不同的值:" + +#: ../../library/email.policy.rst:627 +msgid "The default is ``True``." +msgstr "默认值为 ``True``。" + +#: ../../library/email.policy.rst:644 +msgid "The name and value are returned unmodified." +msgstr "name 和 value 会被原样返回。" + +#: ../../library/email.policy.rst:649 +msgid "" +"If the value contains binary data, it is converted into a " +":class:`~email.header.Header` object using the ``unknown-8bit`` charset. " +"Otherwise it is returned unmodified." +msgstr "" +"如果 value 包含二进制数据,则会使用 ``unknown-8bit`` 字符集来将其转换为 " +":class:`~email.header.Header` 对象。在其他情况下它会被原样返回。" + +#: ../../library/email.policy.rst:656 +msgid "" +"Headers are folded using the :class:`~email.header.Header` folding " +"algorithm, which preserves existing line breaks in the value, and wraps each" +" resulting line to the ``max_line_length``. Non-ASCII binary data are CTE " +"encoded using the ``unknown-8bit`` charset." +msgstr "" +"标头会使用 :class:`~email.header.Header` 折叠算法进行折叠,该算法保留 value " +"中现有的换行,并将每个结果行的长度折叠至 ``max_line_length``。非 ASCII 二进制数据会使用 ``unknown-8bit`` " +"字符集进行 CTE 编码。" + +#: ../../library/email.policy.rst:664 +msgid "" +"Headers are folded using the :class:`~email.header.Header` folding " +"algorithm, which preserves existing line breaks in the value, and wraps each" +" resulting line to the ``max_line_length``. If ``cte_type`` is ``7bit``, " +"non-ascii binary data is CTE encoded using the ``unknown-8bit`` charset. " +"Otherwise the original source header is used, with its existing line breaks " +"and any (RFC invalid) binary data it may contain." +msgstr "" +"标头会使用 :class:`~email.header.Header` 折叠算法进行折叠,该算法保留 value " +"中现有的换行,并将每个结果行的长度折叠至 ``max_line_length``。如果 ``cte_type`` 为 ``7bit``,则非 ascii" +" 二进制数据会使用 ``unknown-8bit`` 字符集进行 CTE 编码。 " +"在其他情况下则会使用原始的源标头,这将保留其现有的换行和所包含的任何(不符合 RFC 的)二进制数据。" + +#: ../../library/email.policy.rst:674 +msgid "" +"An instance of :class:`Compat32`, providing backward compatibility with the" +" behavior of the email package in Python 3.2." +msgstr ":class:`Compat32` 的实例,提供与 Python 3.2 中的 email 包行为的向下兼容性。" + +#: ../../library/email.policy.rst:679 +msgid "" +"The :const:`compat32` policy should not be used as a policy for " +":class:`~email.message.EmailMessage` objects, and should only be used to " +"serialize messages that were created using the :const:`compat32` policy." +msgstr "" +":const:`compat32` 策略不应被用作针对 :class:`~email.message.EmailMessage` " +"对象的策略,而只应被用来序列化使用 :const:`compat32` 策略创建的消息。" + +#: ../../library/email.policy.rst:686 +msgid "Footnotes" +msgstr "脚注" + +#: ../../library/email.policy.rst:687 +msgid "" +"Originally added in 3.3 as a :term:`provisional feature `." +msgstr "最初在 3.3 中作为 :term:`暂定特性 ` 添加。" diff --git a/library/email.utils.po b/library/email.utils.po new file mode 100644 index 0000000000..8b6ba6c711 --- /dev/null +++ b/library/email.utils.po @@ -0,0 +1,345 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/email.utils.rst:2 +msgid ":mod:`!email.utils`: Miscellaneous utilities" +msgstr ":mod:`!email.utils`: 杂项工具" + +#: ../../library/email.utils.rst:7 +msgid "**Source code:** :source:`Lib/email/utils.py`" +msgstr "**源代码:** :source:`Lib/email/utils.py`" + +#: ../../library/email.utils.rst:11 +msgid "" +"There are a couple of useful utilities provided in the :mod:`!email.utils` " +"module:" +msgstr "在 :mod:`!email.utils` 模块中提供了多个有用的工具:" + +#: ../../library/email.utils.rst:16 +msgid "" +"Return local time as an aware datetime object. If called without arguments," +" return current time. Otherwise *dt* argument should be a " +":class:`~datetime.datetime` instance, and it is converted to the local time " +"zone according to the system time zone database. If *dt* is naive (that is," +" ``dt.tzinfo`` is ``None``), it is assumed to be in local time." +msgstr "" +"将当地时间作为一个感知型 datetime 对象返回。如果不带参数地调用,则返回当前时间。在其他情况下 *dt* 参数应为 " +":class:`~datetime.datetime` 的实例,并将根据系统时区数据库将其转换为当地时区。如果 *dt* 为简单型 (即 " +"``dt.tzinfo`` 为 ``None``),它将被视为当地时间。" + +#: ../../library/email.utils.rst:24 +msgid "The *isdst* parameter." +msgstr "*isdst* 形参。" + +#: ../../library/email.utils.rst:29 +msgid "" +"Returns a string suitable for an :rfc:`2822`\\ -compliant " +":mailheader:`Message-ID` header. Optional *idstring* if given, is a string " +"used to strengthen the uniqueness of the message id. Optional *domain* if " +"given provides the portion of the msgid after the '@'. The default is the " +"local hostname. It is not normally necessary to override this default, but " +"may be useful certain cases, such as a constructing distributed system that " +"uses a consistent domain name across multiple hosts." +msgstr "" +"返回一个适合作为兼容 :rfc:`2822` 的 :mailheader:`Message-ID` 标头的字符串。可选参数 *idstring* " +"可传入一字符串以增强该消息 ID 的唯一性。可选参数 *domain* 可用于提供消息 ID 中字符 '@' " +"之后的部分,其默认值是本机的主机名。正常情况下无需覆盖此默认值,但在特定情况下覆盖默认值可能会有用,比如构建一个分布式系统,在多台主机上采用一致的域名。" + +#: ../../library/email.utils.rst:37 +msgid "Added the *domain* keyword." +msgstr "增加了关键字 *domain*" + +#: ../../library/email.utils.rst:41 +msgid "" +"The remaining functions are part of the legacy (``Compat32``) email API. " +"There is no need to directly use these with the new API, since the parsing " +"and formatting they provide is done automatically by the header parsing " +"machinery of the new API." +msgstr "" +"下列函数是旧 (``Compat32``) 电子邮件 API 的一部分。新 API 提供的解析和格式化在标头解析机制中已经被自动完成,故在使用新 API" +" 时没有必要直接使用这些函数。" + +#: ../../library/email.utils.rst:49 +msgid "" +"Return a new string with backslashes in *str* replaced by two backslashes, " +"and double quotes replaced by backslash-double quote." +msgstr "返回一个新的字符串, *str* 中的反斜杠被替换为两个反斜杠,并且双引号被替换为反斜杠加双引号。" + +#: ../../library/email.utils.rst:55 +msgid "" +"Return a new string which is an *unquoted* version of *str*. If *str* ends " +"and begins with double quotes, they are stripped off. Likewise if *str* " +"ends and begins with angle brackets, they are stripped off." +msgstr "" +"返回 *str* 被去除引用版本的字符串。如果 *str* 开头和结尾均是双引号,则这对双引号被去除。类似地,如果 *str* " +"开头和结尾都是尖角括号,这对尖角括号会被去除。" + +#: ../../library/email.utils.rst:62 +msgid "" +"Parse address -- which should be the value of some address-containing field " +"such as :mailheader:`To` or :mailheader:`Cc` -- into its constituent " +"*realname* and *email address* parts. Returns a tuple of that information, " +"unless the parse fails, in which case a 2-tuple of ``('', '')`` is returned." +msgstr "" +"将地址(应为诸如 :mailheader:`To` 或者 :mailheader:`Cc` 之类包含地址的字段值)解析为其构成部分:*真实名字* 和 " +"*电子邮件地址* 部分。返回包含这两个信息的一个元组;如若解析失败,则返回一个二元组 ``('', '')``。" + +#: ../../library/email.utils.rst:67 ../../library/email.utils.rst:95 +msgid "" +"If *strict* is true, use a strict parser which rejects malformed inputs." +msgstr "如果 *strict* 为真值,将使用拒绝错误形式输入的严格解析器。" + +#: ../../library/email.utils.rst:69 ../../library/email.utils.rst:107 +msgid "" +"Add *strict* optional parameter and reject malformed inputs by default." +msgstr "增加了 *strict* 可选形参并将默认拒绝错误形式输入。" + +#: ../../library/email.utils.rst:75 +msgid "" +"The inverse of :meth:`parseaddr`, this takes a 2-tuple of the form " +"``(realname, email_address)`` and returns the string value suitable for a " +":mailheader:`To` or :mailheader:`Cc` header. If the first element of *pair*" +" is false, then the second element is returned unmodified." +msgstr "" +"是 :meth:`parseaddr` 的逆操作,接受一个 ``(真实名字,电子邮件地址)`` 的二元组,并返回适合于 :mailheader:`To`" +" 或 :mailheader:`Cc` 标头的字符串。如果第一个元素为假值,则第二个元素将被原样返回。" + +#: ../../library/email.utils.rst:80 +msgid "" +"Optional *charset* is the character set that will be used in the :rfc:`2047`" +" encoding of the ``realname`` if the ``realname`` contains non-ASCII " +"characters. Can be an instance of :class:`str` or a " +":class:`~email.charset.Charset`. Defaults to ``utf-8``." +msgstr "" +"可选地,如果指定 *charset*,则被视为一个符合 :rfc:`2047` 的编码字符集,用于编码 ``realname`` 中的非 ASCII " +"字符。可以是一个 :class:`str` 类的实例,或者一个 :class:`~email.charset.Charset` 类。默认为 " +"``utf-8`` ." + +#: ../../library/email.utils.rst:85 +msgid "Added the *charset* option." +msgstr "添加了 *charset* 选项。" + +#: ../../library/email.utils.rst:91 +msgid "" +"This method returns a list of 2-tuples of the form returned by " +"``parseaddr()``. *fieldvalues* is a sequence of header field values as might" +" be returned by :meth:`Message.get_all `." +msgstr "" +"该方法返回一个形式与 ``parseaddr()`` 返回值相同的 2 元组的列表。 *fieldvalues* 是与 " +":meth:`Message.get_all ` 返回值形式相同的由标头字段值组成的序列。" + +#: ../../library/email.utils.rst:97 +msgid "Here's a simple example that gets all the recipients of a message::" +msgstr "下面简单示例可获取一条消息的所有接收方::" + +#: ../../library/email.utils.rst:99 +msgid "" +"from email.utils import getaddresses\n" +"\n" +"tos = msg.get_all('to', [])\n" +"ccs = msg.get_all('cc', [])\n" +"resent_tos = msg.get_all('resent-to', [])\n" +"resent_ccs = msg.get_all('resent-cc', [])\n" +"all_recipients = getaddresses(tos + ccs + resent_tos + resent_ccs)" +msgstr "" +"from email.utils import getaddresses\n" +"\n" +"tos = msg.get_all('to', [])\n" +"ccs = msg.get_all('cc', [])\n" +"resent_tos = msg.get_all('resent-to', [])\n" +"resent_ccs = msg.get_all('resent-cc', [])\n" +"all_recipients = getaddresses(tos + ccs + resent_tos + resent_ccs)" + +#: ../../library/email.utils.rst:113 +msgid "" +"Attempts to parse a date according to the rules in :rfc:`2822`. however, " +"some mailers don't follow that format as specified, so :func:`parsedate` " +"tries to guess correctly in such cases. *date* is a string containing an " +":rfc:`2822` date, such as ``\"Mon, 20 Nov 1995 19:12:08 -0500\"``. If it " +"succeeds in parsing the date, :func:`parsedate` returns a 9-tuple that can " +"be passed directly to :func:`time.mktime`; otherwise ``None`` will be " +"returned. Note that indexes 6, 7, and 8 of the result tuple are not usable." +msgstr "" +"尝试根据 :rfc:`2822` 的规则解析一个日期。然而,有些寄信人不严格遵守这一格式,所以这种情况下 :func:`parsedate` " +"会尝试猜测其形式。*date* 是一个字符串包含了一个形如 ``\"Mon, 20 Nov 1995 19:12:08 -0500\"`` 的 " +":rfc:`2822` 格式日期。如果日期解析成功, :func:`parsedate` 将返回一个九元组,可直接传递给 " +":func:`time.mktime`;否则返回 ``None``。注意返回的元组中下标为 6、7、8 的部分是无用的。" + +#: ../../library/email.utils.rst:124 +msgid "" +"Performs the same function as :func:`parsedate`, but returns either ``None``" +" or a 10-tuple; the first 9 elements make up a tuple that can be passed " +"directly to :func:`time.mktime`, and the tenth is the offset of the date's " +"timezone from UTC (which is the official term for Greenwich Mean Time) [#]_." +" If the input string has no timezone, the last element of the tuple " +"returned is ``0``, which represents UTC. Note that indexes 6, 7, and 8 of " +"the result tuple are not usable." +msgstr "" +"执行与 :func:`parsedate` 相同的功能,但会返回 ``None`` 或是一个 10 元组;前 9 个元素构成一个可以直接传给 " +":func:`time.mktime` 的元组,而第十个元素则是该日期的时区与 UTC (格林威治平均时 GMT 的正式名称) [#]_ 的时差。 " +"如果输入字符串不带时区,则所返回元组的最后一个元素将为 ``0``,这表示 UTC。请注意结果元组的索引号 6, 7 和 8 是不可用的。" + +#: ../../library/email.utils.rst:134 +msgid "" +"The inverse of :func:`format_datetime`. Performs the same function as " +":func:`parsedate`, but on success returns a :mod:`~datetime.datetime`; " +"otherwise ``ValueError`` is raised if *date* contains an invalid value such " +"as an hour greater than 23 or a timezone offset not between -24 and 24 " +"hours. If the input date has a timezone of ``-0000``, the ``datetime`` will " +"be a naive ``datetime``, and if the date is conforming to the RFCs it will " +"represent a time in UTC but with no indication of the actual source timezone" +" of the message the date comes from. If the input date has any other valid " +"timezone offset, the ``datetime`` will be an aware ``datetime`` with the " +"corresponding a :class:`~datetime.timezone` :class:`~datetime.tzinfo`." +msgstr "" +":func:`format_datetime` 的逆操作。执行与 :func:`parsedate` 相同的功能,但会在成功时返回一个 " +":mod:`~datetime.datetime`;否则如果 *date* 包含无效的值例如小时值大于 23 或时区偏移量不在 -24 和 24 " +"时范围之内则会引发 ``ValueError``。如果输入日期的时区值为 ``-0000``,则 ``datetime`` 将为一个简单形 " +"``datetime``,而如果日期符合 RFC 标准则它将代表一个 UTC 时间,但是并不指明日期所在消息的实际源时区。 " +"如果输入日期具有任何其他有效的时区偏移量,则 ``datetime`` 将是一个感知型 ``datetime`` 并与 " +":class:`~datetime.timezone` :class:`~datetime.tzinfo` 相对应。" + +#: ../../library/email.utils.rst:150 +msgid "" +"Turn a 10-tuple as returned by :func:`parsedate_tz` into a UTC timestamp " +"(seconds since the Epoch). If the timezone item in the tuple is ``None``, " +"assume local time." +msgstr "" +"将 :func:`parsedate_tz` 所返回的 10 元组转换为一个 UTC 时间戳(相距 Epoch 纪元初始的秒数)。如果元组中的时区项为 " +"``None``,则视为当地时间。" + +#: ../../library/email.utils.rst:157 +msgid "Returns a date string as per :rfc:`2822`, e.g.::" +msgstr "返回 :rfc:`2822` 标准的日期字符串,例如::" + +#: ../../library/email.utils.rst:159 +msgid "Fri, 09 Nov 2001 01:08:47 -0000" +msgstr "Fri, 09 Nov 2001 01:08:47 -0000" + +#: ../../library/email.utils.rst:161 +msgid "" +"Optional *timeval* if given is a floating-point time value as accepted by " +":func:`time.gmtime` and :func:`time.localtime`, otherwise the current time " +"is used." +msgstr "" +"可选的 *timeval* 如果给出,则是一个可被 :func:`time.gmtime` 和 :func:`time.localtime` " +"接受的浮点数时间值,否则会使用当前时间。" + +#: ../../library/email.utils.rst:165 +msgid "" +"Optional *localtime* is a flag that when ``True``, interprets *timeval*, and" +" returns a date relative to the local timezone instead of UTC, properly " +"taking daylight savings time into account. The default is ``False`` meaning " +"UTC is used." +msgstr "" +"可选的 *localtime* 是一个旗标,当为 ``True`` 时,将会解析 *timeval*,并返回一个相对于当地时区而非 UTC " +"的日期值,并会适当地考虑夏令时。默认值 ``False`` 表示使用 UTC。" + +#: ../../library/email.utils.rst:170 +msgid "" +"Optional *usegmt* is a flag that when ``True``, outputs a date string with " +"the timezone as an ascii string ``GMT``, rather than a numeric ``-0000``. " +"This is needed for some protocols (such as HTTP). This only applies when " +"*localtime* is ``False``. The default is ``False``." +msgstr "" +"可选的 *usegmt* 是一个旗标,当为 ``True`` 时,将会输出一个日期字符串,其中时区表示为 ascii 字符串 ``GMT`` " +"而非数字形式的 ``-0000``。这对某些协议(例如 HTTP)来说是必要的。这仅在 *localtime* 为 ``False`` 时应用。 " +"默认值为 ``False``。" + +#: ../../library/email.utils.rst:178 +msgid "" +"Like ``formatdate``, but the input is a :mod:`datetime` instance. If it is " +"a naive datetime, it is assumed to be \"UTC with no information about the " +"source timezone\", and the conventional ``-0000`` is used for the timezone. " +"If it is an aware ``datetime``, then the numeric timezone offset is used. If" +" it is an aware timezone with offset zero, then *usegmt* may be set to " +"``True``, in which case the string ``GMT`` is used instead of the numeric " +"timezone offset. This provides a way to generate standards conformant HTTP " +"date headers." +msgstr "" +"类似于 ``formatdate``,但输入的是一个 :mod:`datetime` 实例。如果实例是一个简单型 datetime,它会被视为 " +",并且使用传统的 ``-0000`` 作为时区。如果实例是一个感知型 " +"``datetime``,则会使用数字形式的时区时差。如果实例是感知型且时区时差为零,则 *usegmt* 可能会被设为 " +"``True``,在这种情况下将使用字符串 ``GMT`` 而非数字形式的时区时差。这提供了一种生成符合标准 HTTP 日期标头的方式。" + +#: ../../library/email.utils.rst:192 +msgid "Decode the string *s* according to :rfc:`2231`." +msgstr "根据 :rfc:`2231` 解码字符串 *s*。" + +#: ../../library/email.utils.rst:197 +msgid "" +"Encode the string *s* according to :rfc:`2231`. Optional *charset* and " +"*language*, if given is the character set name and language name to use. If" +" neither is given, *s* is returned as-is. If *charset* is given but " +"*language* is not, the string is encoded using the empty string for " +"*language*." +msgstr "" +"根据 :rfc:`2231` 对字符串 *s* 进行编码。可选的 *charset* 和 *language* " +"如果给出,则为指明要使用的字符集名称和语言名称。如果两者均未给出,则会原样返回 *s*。如果给出 *charset* 但未给出 " +"*language*,则会使用空字符串作为 *language* 值来对字符串进行编码。" + +#: ../../library/email.utils.rst:205 +msgid "" +"When a header parameter is encoded in :rfc:`2231` format, " +":meth:`Message.get_param ` may return a " +"3-tuple containing the character set, language, and value. " +":func:`collapse_rfc2231_value` turns this into a unicode string. Optional " +"*errors* is passed to the *errors* argument of :class:`str`'s " +":func:`~str.encode` method; it defaults to ``'replace'``. Optional " +"*fallback_charset* specifies the character set to use if the one in the " +":rfc:`2231` header is not known by Python; it defaults to ``'us-ascii'``." +msgstr "" +"当以 :rfc:`2231` 格式来编码标头参数时,:meth:`Message.get_param " +"` 可能返回一个包含字符集、语言和值的 3 元组。 " +":func:`collapse_rfc2231_value` 会将此返回为一个 unicode 字符串。可选的 *errors* 会被传递给 " +":class:`str` 的 :func:`~str.encode` 方法的 *errors* 参数;它的默认值为 ``'replace'``。可选的 " +"*fallback_charset* 指定当 :rfc:`2231` 标头中的字符集无法被 Python 识别时要使用的字符集;它的默认值为 " +"``'us-ascii'``." + +#: ../../library/email.utils.rst:214 +msgid "" +"For convenience, if the *value* passed to :func:`collapse_rfc2231_value` is " +"not a tuple, it should be a string and it is returned unquoted." +msgstr "" +"为方便起见,如果传给 :func:`collapse_rfc2231_value` 的 *value* " +"不是一个元组,则应为一个字符串并会将其去除引号后返回。" + +#: ../../library/email.utils.rst:220 +msgid "" +"Decode parameters list according to :rfc:`2231`. *params* is a sequence of " +"2-tuples containing elements of the form ``(content-type, string-value)``." +msgstr "" +"根据 :rfc:`2231` 解码参数列表。 *params* 是一个包含 ``(content-type, string-value)`` " +"形式的元素的 2 元组的序列。" + +#: ../../library/email.utils.rst:225 +msgid "Footnotes" +msgstr "脚注" + +#: ../../library/email.utils.rst:226 +msgid "" +"Note that the sign of the timezone offset is the opposite of the sign of the" +" ``time.timezone`` variable for the same timezone; the latter variable " +"follows the POSIX standard while this module follows :rfc:`2822`." +msgstr "" +"请注意时区时差的符号与同一时区的 ``time.timezone`` 变量的符号相反;后者遵循 POSIX 标准而此模块遵循 :rfc:`2822`。" diff --git a/library/ensurepip.po b/library/ensurepip.po new file mode 100644 index 0000000000..6fbbf3b0b4 --- /dev/null +++ b/library/ensurepip.po @@ -0,0 +1,266 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/ensurepip.rst:2 +msgid ":mod:`!ensurepip` --- Bootstrapping the ``pip`` installer" +msgstr ":mod:`!ensurepip` --- 初始设置 ``pip`` 安装器" + +#: ../../library/ensurepip.rst:10 +msgid "**Source code:** :source:`Lib/ensurepip`" +msgstr "**源代码:** :source:`Lib/ensurepip`" + +#: ../../library/ensurepip.rst:14 +msgid "" +"The :mod:`!ensurepip` package provides support for bootstrapping the ``pip``" +" installer into an existing Python installation or virtual environment. This" +" bootstrapping approach reflects the fact that ``pip`` is an independent " +"project with its own release cycle, and the latest available stable version " +"is bundled with maintenance and feature releases of the CPython reference " +"interpreter." +msgstr "" +":mod:`!ensurepip` 包为将 ``pip`` 安装程序引导至现有 Python 安装版或虚拟环境提供支持。 " +"需要使用此引导方式这一事实反映出 ``pip`` 是一个具有自己的发布周期的独立项目,并且其最新可用稳定版本将捆绑至相应 CPython " +"解释器的维护版本和新增特性版本。" + +#: ../../library/ensurepip.rst:21 +msgid "" +"In most cases, end users of Python shouldn't need to invoke this module " +"directly (as ``pip`` should be bootstrapped by default), but it may be " +"needed if installing ``pip`` was skipped when installing Python (or when " +"creating a virtual environment) or after explicitly uninstalling ``pip``." +msgstr "" +"在大多数情况下,Python 的终端使用者不需要直接调用这个模块 (``pip`` 默认应该已被引导),不过,如果在安装 " +"Python(或创建虚拟环境)之时跳过了安装 ``pip`` 步骤,或者日后特意卸载了 ``pip``,则需要使用这个模块。" + +#: ../../library/ensurepip.rst:29 +msgid "" +"This module *does not* access the internet. All of the components needed to " +"bootstrap ``pip`` are included as internal parts of the package." +msgstr "这个模块 *无需* 访问互联网。引导启动 ``pip`` 所需的全部组件均包含在包的内部。" + +#: ../../includes/optional-module.rst:1 +msgid "" +"This is an :term:`optional module`. If it is missing from your copy of " +"CPython, look for documentation from your distributor (that is, whoever " +"provided Python to you). If you are the distributor, see :ref:`optional-" +"module-requirements`." +msgstr "" +"这是一个 :term:`optional module`。如果它在你的 CPython 副本中缺失,请查看你的发行方(也就是说,向你提供 Python " +"的人)的文档。如果你就是发行方,请参阅 :ref:`optional-module-requirements`。" + +#: ../../library/ensurepip.rst:37 +msgid ":ref:`installing-index`" +msgstr ":ref:`installing-index`" + +#: ../../library/ensurepip.rst:38 +msgid "The end user guide for installing Python packages" +msgstr "安装 Python 包的终端使用者教程" + +#: ../../library/ensurepip.rst:40 +msgid ":pep:`453`: Explicit bootstrapping of pip in Python installations" +msgstr ":pep:`453`: 在 Python 安装实例中显式引导启动 pip" + +#: ../../library/ensurepip.rst:41 +msgid "The original rationale and specification for this module." +msgstr "这个模块的原始缘由以及规范文档" + +#: ../../includes/wasm-mobile-notavail.rst:3 +msgid "Availability" +msgstr "可用性" + +#: ../../includes/wasm-mobile-notavail.rst:5 +msgid "" +"This module is not supported on :ref:`mobile platforms ` or :ref:`WebAssembly platforms `." +msgstr "" +"此模块在 :ref:`移动平台 ` 或 :ref:`WebAssembly 平台 ` 上不受支持。" + +#: ../../library/ensurepip.rst:48 +msgid "Command-line interface" +msgstr "命令行接口" + +#: ../../library/ensurepip.rst:52 +msgid "" +"The command line interface is invoked using the interpreter's ``-m`` switch." +msgstr "使用解释器的 ``-m`` 参数调用命令行接口。" + +#: ../../library/ensurepip.rst:54 +msgid "The simplest possible invocation is::" +msgstr "最简单的调用方式为::" + +#: ../../library/ensurepip.rst:56 +msgid "python -m ensurepip" +msgstr "python -m ensurepip" + +#: ../../library/ensurepip.rst:58 +msgid "" +"This invocation will install ``pip`` if it is not already installed, but " +"otherwise does nothing. To ensure the installed version of ``pip`` is at " +"least as recent as the one available in ``ensurepip``, pass the " +"``--upgrade`` option::" +msgstr "" +"该调用会在当前未安装 ``pip`` 的情况下安装 ``pip``,如已安装则无事发生。如要确保安装的 ``pip`` 版本至少为 " +"``ensurepip`` 所提供的最新版本,传入 ``--upgrade`` 参数::" + +#: ../../library/ensurepip.rst:63 +msgid "python -m ensurepip --upgrade" +msgstr "python -m ensurepip --upgrade" + +#: ../../library/ensurepip.rst:65 +msgid "" +"By default, ``pip`` is installed into the current virtual environment (if " +"one is active) or into the system site packages (if there is no active " +"virtual environment). The installation location can be controlled through " +"two additional command line options:" +msgstr "" +"在默认情况下,``pip`` 会被安装到当前虚拟环境(如果激活了虚拟环境)或系统的包目录(如果未激活虚拟环境)。 " +"安装位置可通过两个额外的命令行选项来控制:" + +#: ../../library/ensurepip.rst:72 +msgid "" +"Installs ``pip`` relative to the given root directory rather than the root " +"of the currently active virtual environment (if any) or the default root for" +" the current Python installation." +msgstr "相对于给定的根目录而不是当前已激活虚拟环境(如果存在)的根目录或当前 Python 安装版的默认根目录来安装 ``pip``。" + +#: ../../library/ensurepip.rst:78 +msgid "" +"Installs ``pip`` into the user site packages directory rather than globally " +"for the current Python installation (this option is not permitted inside an " +"active virtual environment)." +msgstr "将 ``pip`` 安装到用户的站点包目录而不是针对当前 Python 安装版的全局安装(此选项在激活的虚拟环境内部是不被允许的)。" + +#: ../../library/ensurepip.rst:82 +msgid "" +"By default, the scripts ``pipX`` and ``pipX.Y`` will be installed (where X.Y" +" stands for the version of Python used to invoke ``ensurepip``). The scripts" +" installed can be controlled through two additional command line options:" +msgstr "" +"在默认情况下,脚本 ``pipX`` 和 ``pipX.Y`` 将被安装(其中 X.Y 表示被用来调用 ``ensurepip`` 的 Python " +"的版本)。所安装的脚本可通过两个额外的命令行选项来控制:" + +#: ../../library/ensurepip.rst:89 +msgid "" +"If an alternate installation is requested, the ``pipX`` script will *not* be" +" installed." +msgstr "如果请求了一个替代安装版,则 ``pipX`` 脚本将 *不会* 被安装。" + +#: ../../library/ensurepip.rst:94 +msgid "" +"If a \"default pip\" installation is requested, the ``pip`` script will be " +"installed in addition to the two regular scripts." +msgstr "如果请求了一个 \"默认的 pip\" 安装版,则将在两个常规脚本的基础上额外安装 ``pip`` 脚本。" + +#: ../../library/ensurepip.rst:97 +msgid "" +"Providing both of the script selection options will trigger an exception." +msgstr "同时提供这两个脚本选择选项将会触发异常。" + +#: ../../library/ensurepip.rst:100 +msgid "Module API" +msgstr "模块 API" + +#: ../../library/ensurepip.rst:102 +msgid ":mod:`!ensurepip` exposes two functions for programmatic use:" +msgstr ":mod:`!ensurepip` 对外暴露了两个函数供编程使用:" + +#: ../../library/ensurepip.rst:106 +msgid "" +"Returns a string specifying the available version of pip that will be " +"installed when bootstrapping an environment." +msgstr "返回一个指明在初始创建环境时将被安装的可用 pip 版本的字符串。" + +#: ../../library/ensurepip.rst:113 +msgid "Bootstraps ``pip`` into the current or designated environment." +msgstr "初始创建 ``pip`` 到当前的或指定的环境中。" + +#: ../../library/ensurepip.rst:115 +msgid "" +"*root* specifies an alternative root directory to install relative to. If " +"*root* is ``None``, then installation uses the default install location for " +"the current environment." +msgstr "*root* 指明要作为相对安装路径的替代根目录。如果 *root* 为 ``None``,则安装会使用当前环境的默认安装位置。" + +#: ../../library/ensurepip.rst:119 +msgid "" +"*upgrade* indicates whether or not to upgrade an existing installation of an" +" earlier version of ``pip`` to the available version." +msgstr "*upgrade* 指明是否要将一个现有的较早版本的 ``pip`` 的安装版升级到可用的新版本。" + +#: ../../library/ensurepip.rst:122 +msgid "" +"*user* indicates whether to use the user scheme rather than installing " +"globally." +msgstr "*user* 指明是否使用针对用户的安装方案而不是全局安装。" + +#: ../../library/ensurepip.rst:125 +msgid "" +"By default, the scripts ``pipX`` and ``pipX.Y`` will be installed (where X.Y" +" stands for the current version of Python)." +msgstr "在默认情况下,将会安装 ``pipX`` 和 ``pipX.Y`` 脚本(其中 X.Y 表示 Python 的当前版本)。" + +#: ../../library/ensurepip.rst:128 +msgid "If *altinstall* is set, then ``pipX`` will *not* be installed." +msgstr "如果设置了 *altinstall*,则 ``pipX`` 将 *不会* 被安装。" + +#: ../../library/ensurepip.rst:130 +msgid "" +"If *default_pip* is set, then ``pip`` will be installed in addition to the " +"two regular scripts." +msgstr "如果设置了 *default_pip*,则除了两个常规脚本外还将安装 ``pip``。" + +#: ../../library/ensurepip.rst:133 +msgid "" +"Setting both *altinstall* and *default_pip* will trigger :exc:`ValueError`." +msgstr "同时设置 *altinstall* 和 *default_pip* 将触发 :exc:`ValueError`。" + +#: ../../library/ensurepip.rst:136 +msgid "" +"*verbosity* controls the level of output to :data:`sys.stdout` from the " +"bootstrapping operation." +msgstr "*verbosity* 控制初始创建操作对 :data:`sys.stdout` 的输出信息级别。" + +#: ../../library/ensurepip.rst:139 +msgid "" +"Raises an :ref:`auditing event ` ``ensurepip.bootstrap`` with " +"argument ``root``." +msgstr "引发一个 :ref:`审计事件 ` ``ensurepip.bootstrap`` 并附带参数 ``root``。" + +#: ../../library/ensurepip.rst:143 +msgid "" +"The bootstrapping process has side effects on both ``sys.path`` and " +"``os.environ``. Invoking the command line interface in a subprocess instead " +"allows these side effects to be avoided." +msgstr "" +"初始创建过程对于 ``sys.path`` 和 ``os.environ`` 都会有附带影响。改为在子进程中调用命令行接口可以避免这些附带影响。" + +#: ../../library/ensurepip.rst:149 +msgid "" +"The bootstrapping process may install additional modules required by " +"``pip``, but other software should not assume those dependencies will always" +" be present by default (as the dependencies may be removed in a future " +"version of ``pip``)." +msgstr "" +"初始创建过程可能会安装 ``pip`` 所需的额外模块,但其他软件不应假定这些依赖将总是会默认存在(因为这些依赖可能会在未来的 ``pip`` " +"版本中被移除)。" diff --git a/library/enum.po b/library/enum.po new file mode 100644 index 0000000000..cd28056c45 --- /dev/null +++ b/library/enum.po @@ -0,0 +1,1875 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# 99 , 2026 +# python-doc bot, 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/enum.rst:2 +msgid ":mod:`!enum` --- Support for enumerations" +msgstr ":mod:`!enum` --- 对枚举的支持" + +#: ../../library/enum.rst:9 +msgid "**Source code:** :source:`Lib/enum.py`" +msgstr "**源代码:** :source:`Lib/enum.py`" + +#: ../../library/enum.rst:13 +msgid "" +"This page contains the API reference information. For tutorial information " +"and discussion of more advanced topics, see" +msgstr "此页面仅包含 API 参考信息。教程信息和更多高级用法的讨论,请参阅" + +#: ../../library/enum.rst:16 +msgid ":ref:`Basic Tutorial `" +msgstr ":ref:`基础教程 `" + +#: ../../library/enum.rst:17 +msgid ":ref:`Advanced Tutorial `" +msgstr ":ref:`进阶教程 `" + +#: ../../library/enum.rst:18 +msgid ":ref:`Enum Cookbook `" +msgstr ":ref:`枚举指南 `" + +#: ../../library/enum.rst:22 +msgid "An enumeration:" +msgstr "一个枚举:" + +#: ../../library/enum.rst:24 +msgid "is a set of symbolic names (members) bound to unique values" +msgstr "是绑定到唯一值的符号名称(成员)集合" + +#: ../../library/enum.rst:25 +msgid "" +"can be iterated over to return its canonical (i.e. non-alias) members in " +"definition order" +msgstr "可以被执行迭代以按定义顺序返回其规范的(即非别名的)成员" + +#: ../../library/enum.rst:27 +msgid "uses *call* syntax to return members by value" +msgstr "使用 *调用* 语法按值返回成员" + +#: ../../library/enum.rst:28 +msgid "uses *index* syntax to return members by name" +msgstr "使用 *索引* 语法按名称返回成员" + +#: ../../library/enum.rst:30 +msgid "" +"Enumerations are created either by using :keyword:`class` syntax, or by " +"using function-call syntax::" +msgstr "枚举是通过使用 :keyword:`class` 语法或是通过使用函数调用语法来创建的::" + +#: ../../library/enum.rst:33 +msgid "" +">>> from enum import Enum\n" +"\n" +">>> # class syntax\n" +">>> class Color(Enum):\n" +"... RED = 1\n" +"... GREEN = 2\n" +"... BLUE = 3\n" +"\n" +">>> # functional syntax\n" +">>> Color = Enum('Color', [('RED', 1), ('GREEN', 2), ('BLUE', 3)])" +msgstr "" +">>> from enum import Enum\n" +"\n" +">>> # 类语法\n" +">>> class Color(Enum):\n" +"... RED = 1\n" +"... GREEN = 2\n" +"... BLUE = 3\n" +"\n" +">>> # 函数语法\n" +">>> Color = Enum('Color', [('RED', 1), ('GREEN', 2), ('BLUE', 3)])" + +#: ../../library/enum.rst:44 +msgid "" +"Even though we can use :keyword:`class` syntax to create Enums, Enums are " +"not normal Python classes. See :ref:`How are Enums different? ` for more details." +msgstr "" +"虽然我们可以使用 :keyword:`class` 语法来创建枚举,但枚举并不是常规的 Python 类。请参阅 :ref:`枚举有什么不同? " +"` 了解更多细节。" + +#: ../../library/enum.rst:48 +msgid "Nomenclature" +msgstr "命名法" + +#: ../../library/enum.rst:50 +msgid "The class :class:`!Color` is an *enumeration* (or *enum*)" +msgstr "类 :class:`!Color` 是一个 *枚举* (或 *enum* )" + +#: ../../library/enum.rst:51 +msgid "" +"The attributes :attr:`!Color.RED`, :attr:`!Color.GREEN`, etc., are " +"*enumeration members* (or *members*) and are functionally constants." +msgstr "" +"属性 :attr:`!Color.RED`、 :attr:`!Color.GREEN` 等是 *枚举成员* (或 *members* " +")并且在功能上是常量。" + +#: ../../library/enum.rst:53 +msgid "" +"The enum members have *names* and *values* (the name of :attr:`!Color.RED` " +"is ``RED``, the value of :attr:`!Color.BLUE` is ``3``, etc.)" +msgstr "" +"枚举成员有 *名称* 和 *值* (:attr:`!Color.RED` 的名称是 ``RED``,:attr:`!Color.BLUE` 的值是 " +"``3``,等等)" + +#: ../../library/enum.rst:60 +msgid "Module contents" +msgstr "模块内容" + +#: ../../library/enum.rst:62 +msgid ":class:`EnumType`" +msgstr ":class:`EnumType`" + +#: ../../library/enum.rst:64 +msgid "The ``type`` for Enum and its subclasses." +msgstr "Enum 及其子类的 ``type``。" + +#: ../../library/enum.rst:66 +msgid ":class:`Enum`" +msgstr ":class:`Enum`" + +#: ../../library/enum.rst:68 +msgid "Base class for creating enumerated constants." +msgstr "用于创建枚举常量的基类。" + +#: ../../library/enum.rst:70 +msgid ":class:`IntEnum`" +msgstr ":class:`IntEnum`" + +#: ../../library/enum.rst:72 +msgid "" +"Base class for creating enumerated constants that are also subclasses of " +":class:`int`. (`Notes`_)" +msgstr "用于创建枚举常量的基类,这些常量也是 :class:`int` 的子类。 (`Notes`_)" + +#: ../../library/enum.rst:75 +msgid ":class:`StrEnum`" +msgstr ":class:`StrEnum`" + +#: ../../library/enum.rst:77 +msgid "" +"Base class for creating enumerated constants that are also subclasses of " +":class:`str`. (`Notes`_)" +msgstr "用于创建枚举常量的基类,这些常量也是 :class:`str` 的子类。 (`Notes`_)" + +#: ../../library/enum.rst:80 +msgid ":class:`Flag`" +msgstr ":class:`Flag`" + +#: ../../library/enum.rst:82 +msgid "" +"Base class for creating enumerated constants that can be combined using the " +"bitwise operations without losing their :class:`Flag` membership." +msgstr "创建可与位运算符搭配使用,又不会失去 :class:`Flag` 成员资格的枚举常量的基类。" + +#: ../../library/enum.rst:85 +msgid ":class:`IntFlag`" +msgstr ":class:`IntFlag`" + +#: ../../library/enum.rst:87 +msgid "" +"Base class for creating enumerated constants that can be combined using the " +"bitwise operators without losing their :class:`IntFlag` membership. " +":class:`IntFlag` members are also subclasses of :class:`int`. (`Notes`_)" +msgstr "" +"创建可与位运算符搭配使用,又不失去 :class:`IntFlag` 成员资格的枚举常量的基类。:class:`IntFlag` 成员也是 " +":class:`int` 的子类。 (`Notes`_)" + +#: ../../library/enum.rst:91 +msgid ":class:`ReprEnum`" +msgstr ":class:`ReprEnum`" + +#: ../../library/enum.rst:93 +msgid "" +"Used by :class:`IntEnum`, :class:`StrEnum`, and :class:`IntFlag` to keep the" +" :class:`str() ` of the mixed-in type." +msgstr "" +"由 :class:`IntEnum`、:class:`StrEnum` 和 :class:`IntFlag` 用来保持混合类型的 " +":class:`str() ` ." + +#: ../../library/enum.rst:96 +msgid ":class:`EnumCheck`" +msgstr ":class:`EnumCheck`" + +#: ../../library/enum.rst:98 +msgid "" +"An enumeration with the values ``CONTINUOUS``, ``NAMED_FLAGS``, and " +"``UNIQUE``, for use with :func:`verify` to ensure various constraints are " +"met by a given enumeration." +msgstr "" +"具有值 ``CONTINUOUS``、``NAMED_FLAGS`` 和 ``UNIQUE`` 的枚举,用于 :func:`verify` " +"以确保给定枚举满足各种约束。" + +#: ../../library/enum.rst:102 +msgid ":class:`FlagBoundary`" +msgstr ":class:`FlagBoundary`" + +#: ../../library/enum.rst:104 +msgid "" +"An enumeration with the values ``STRICT``, ``CONFORM``, ``EJECT``, and " +"``KEEP`` which allows for more fine-grained control over how invalid values " +"are dealt with in an enumeration." +msgstr "" +"具有值 ``STRICT``、``CONFORM``、``EJECT`` 和 ``KEEP`` 的枚举,允许对枚举中无效值的处理方式进行更细粒度的控制。" + +#: ../../library/enum.rst:108 +msgid ":class:`EnumDict`" +msgstr ":class:`EnumDict`" + +#: ../../library/enum.rst:110 +msgid "" +"A subclass of :class:`dict` for use when subclassing :class:`EnumType`." +msgstr "一个被用于子类化 :class:`EnumType` 的 :class:`dict` 子类。" + +#: ../../library/enum.rst:112 +msgid ":class:`auto`" +msgstr ":class:`auto`" + +#: ../../library/enum.rst:114 +msgid "" +"Instances are replaced with an appropriate value for Enum members. " +":class:`StrEnum` defaults to the lower-cased version of the member name, " +"while other Enums default to 1 and increase from there." +msgstr "实例被替换为枚举成员的适当值。 :class:`StrEnum` 默认为成员名称的小写版本,而其他枚举默认为 1 并由此递增。" + +#: ../../library/enum.rst:118 +msgid ":func:`~enum.property`" +msgstr ":func:`~enum.property`" + +#: ../../library/enum.rst:120 +msgid "" +"Allows :class:`Enum` members to have attributes without conflicting with " +"member names. The ``value`` and ``name`` attributes are implemented this " +"way." +msgstr "" +"允许 :class:`Enum` 成员拥有属性而不会与成员名称相冲突。``value`` 和 ``name`` 属性都是以这样的方式实现的。" + +#: ../../library/enum.rst:124 +msgid ":func:`unique`" +msgstr ":func:`unique`" + +#: ../../library/enum.rst:126 +msgid "" +"Enum class decorator that ensures only one name is bound to any one value." +msgstr "确保一个名称只绑定一个值的 Enum 类装饰器。" + +#: ../../library/enum.rst:128 +msgid ":func:`verify`" +msgstr ":func:`verify`" + +#: ../../library/enum.rst:130 +msgid "" +"Enum class decorator that checks user-selectable constraints on an " +"enumeration." +msgstr "检查枚举的用户可选择约束的枚举类装饰器。" + +#: ../../library/enum.rst:133 +msgid ":func:`member`" +msgstr ":func:`member`" + +#: ../../library/enum.rst:135 +msgid "Make ``obj`` a member. Can be used as a decorator." +msgstr "使 ``obj`` 成为成员。可以用作装饰器。" + +#: ../../library/enum.rst:137 +msgid ":func:`nonmember`" +msgstr ":func:`nonmember`" + +#: ../../library/enum.rst:139 +msgid "Do not make ``obj`` a member. Can be used as a decorator." +msgstr "使 ``obj`` 不为成员。可以用作装饰器。" + +#: ../../library/enum.rst:141 +msgid ":func:`global_enum`" +msgstr ":func:`global_enum`" + +#: ../../library/enum.rst:143 +msgid "" +"Modify the :class:`str() ` and :func:`repr` of an enum to show its " +"members as belonging to the module instead of its class, and export the enum" +" members to the global namespace." +msgstr "" +"修改枚举的 :class:`str() ` 和 :func:`repr` 以将其成员显示为属于模块而不是其类,并将枚举成员导出到全局命名空间。" + +#: ../../library/enum.rst:147 +msgid ":func:`show_flag_values`" +msgstr ":func:`show_flag_values`" + +#: ../../library/enum.rst:149 +msgid "Return a list of all power-of-two integers contained in a flag." +msgstr "返回标志中包含的所有二次幂整数的列表。" + +#: ../../library/enum.rst:151 +msgid ":func:`enum.bin`" +msgstr ":func:`enum.bin`" + +#: ../../library/enum.rst:153 ../../library/enum.rst:1076 +msgid "" +"Like built-in :func:`bin`, except negative values are represented in two's " +"complement, and the leading bit always indicates sign (``0`` implies " +"positive, ``1`` implies negative)." +msgstr "" +"与内置的 :func:`bin` 类似,区别在于负值将以补码表示,并且打头的比特位总是指明正负性 (``0`` 表示正值,``1`` 表示负值)。" + +#: ../../library/enum.rst:158 +msgid "``Flag``, ``IntFlag``, ``auto``" +msgstr "``Flag``, ``IntFlag``, ``auto``" + +#: ../../library/enum.rst:159 +msgid "" +"``StrEnum``, ``EnumCheck``, ``ReprEnum``, ``FlagBoundary``, ``property``, " +"``member``, ``nonmember``, ``global_enum``, ``show_flag_values``" +msgstr "" +"``StrEnum``, ``EnumCheck``, ``ReprEnum``, ``FlagBoundary``, ``property``, " +"``member``, ``nonmember``, ``global_enum``, ``show_flag_values``" + +#: ../../library/enum.rst:160 +msgid "``EnumDict``" +msgstr "``EnumDict``" + +#: ../../library/enum.rst:165 +msgid "Data types" +msgstr "数据类型" + +#: ../../library/enum.rst:170 +msgid "" +"*EnumType* is the :term:`metaclass` for *enum* enumerations. It is possible" +" to subclass *EnumType* -- see :ref:`Subclassing EnumType ` for details." +msgstr "" +"*EnumType* 是 *enum* 枚举的 :term:`metaclass`。可以对 *EnumType* 进行子类化——有关详细信息,请参阅 " +":ref:`Subclassing EnumType `." + +#: ../../library/enum.rst:174 +msgid "" +"``EnumType`` is responsible for setting the correct :meth:`!__repr__`, " +":meth:`!__str__`, :meth:`!__format__`, and :meth:`!__reduce__` methods on " +"the final *enum*, as well as creating the enum members, properly handling " +"duplicates, providing iteration over the enum class, etc." +msgstr "" +"``EnumType`` 负责在最终的 *enum* 上设置正确的 :meth:`!__repr__`, :meth:`!__str__`, " +":meth:`!__format__` 和 :meth:`!__reduce__` 方法,以及创建枚举成员,正确处理重复项,提供对枚举类的迭代等。" + +#: ../../library/enum.rst:181 +msgid "" +"Before 3.11 ``EnumType`` was called ``EnumMeta``, which is still available " +"as an alias." +msgstr "在 3.11 之前 ``EnumType`` 被称为 ``EnumMeta``,该名称作为别名仍然可用。" + +#: ../../library/enum.rst:185 +msgid "This method is called in two different ways:" +msgstr "此方法以两种不同的方式调用:" + +#: ../../library/enum.rst:187 +msgid "to look up an existing member:" +msgstr "查找现有成员:" + +#: ../../library/enum.rst:0 +msgid "cls" +msgstr "cls" + +#: ../../library/enum.rst:189 ../../library/enum.rst:195 +msgid "The enum class being called." +msgstr "被调用的枚举类。" + +#: ../../library/enum.rst:0 +msgid "value" +msgstr "value" + +#: ../../library/enum.rst:190 +msgid "The value to lookup." +msgstr "要查找的值。" + +#: ../../library/enum.rst:192 +msgid "" +"to use the ``cls`` enum to create a new enum (only if the existing enum does" +" not have any members):" +msgstr "使用 ``cls`` 枚举创建新枚举(仅当现有枚举没有任何成员时):" + +#: ../../library/enum.rst:196 +msgid "The name of the new Enum to create." +msgstr "要创建的新枚举的名称。" + +#: ../../library/enum.rst:0 +msgid "names" +msgstr "names" + +#: ../../library/enum.rst:197 +msgid "The names/values of the members for the new Enum." +msgstr "新枚举成员的名称/值。" + +#: ../../library/enum.rst:0 +msgid "module" +msgstr "module -- 模块" + +#: ../../library/enum.rst:198 +msgid "The name of the module the new Enum is created in." +msgstr "在其中创建新枚举的模块的名称。" + +#: ../../library/enum.rst:0 +msgid "qualname" +msgstr "qualname" + +#: ../../library/enum.rst:199 +msgid "The actual location in the module where this Enum can be found." +msgstr "可以找到此枚举的模块中的实际位置。" + +#: ../../library/enum.rst:0 +msgid "type" +msgstr "type -- 类型" + +#: ../../library/enum.rst:200 +msgid "A mix-in type for the new Enum." +msgstr "新枚举的混合类型。" + +#: ../../library/enum.rst:0 +msgid "start" +msgstr "start" + +#: ../../library/enum.rst:201 +msgid "The first integer value for the Enum (used by :class:`auto`)." +msgstr "枚举的第一个整数值(由 :class:`auto` 使用)。" + +#: ../../library/enum.rst:0 +msgid "boundary" +msgstr "边界" + +#: ../../library/enum.rst:202 +msgid "" +"How to handle out-of-range values from bit operations (:class:`Flag` only)." +msgstr "如何处理来自位操作的超出范围的值 (仅限 :class:`Flag`)。" + +#: ../../library/enum.rst:206 +msgid "Returns ``True`` if member belongs to the ``cls``::" +msgstr "如果成员属于 ``cls`` 则返回 ``True``::" + +#: ../../library/enum.rst:208 +msgid "" +">>> some_var = Color.RED\n" +">>> some_var in Color\n" +"True\n" +">>> Color.RED.value in Color\n" +"True" +msgstr "" +">>> some_var = Color.RED\n" +">>> some_var in Color\n" +"True\n" +">>> Color.RED.value in Color\n" +"True" + +#: ../../library/enum.rst:216 +msgid "" +"Before Python 3.12, a ``TypeError`` is raised if a non-Enum-member is used " +"in a containment check." +msgstr "在 Python 3.12 之前,如果在包含检测中使用了非枚举成员则会引发 ``TypeError``。" + +#: ../../library/enum.rst:221 +msgid "" +"Returns ``['__class__', '__doc__', '__members__', '__module__']`` and the " +"names of the members in *cls*::" +msgstr "" +"返回 ``['__class__', '__doc__', '__members__', '__module__']`` 和 *cls* 中的成员名称 " +"::" + +#: ../../library/enum.rst:224 +msgid "" +">>> dir(Color)\n" +"['BLUE', 'GREEN', 'RED', '__class__', '__contains__', '__doc__', '__getitem__', '__init_subclass__', '__iter__', '__len__', '__members__', '__module__', '__name__', '__qualname__']" +msgstr "" +">>> dir(Color)\n" +"['BLUE', 'GREEN', 'RED', '__class__', '__contains__', '__doc__', '__getitem__', '__init_subclass__', '__iter__', '__len__', '__members__', '__module__', '__name__', '__qualname__']" + +#: ../../library/enum.rst:229 +msgid "" +"Returns the Enum member in *cls* matching *name*, or raises a " +":exc:`KeyError`::" +msgstr "返回 *cls* 中匹配 *name* 的 Enum 成员,或者引发 :exc:`KeyError`::" + +#: ../../library/enum.rst:231 +msgid "" +">>> Color['BLUE']\n" +"" +msgstr "" +">>> Color['BLUE']\n" +"" + +#: ../../library/enum.rst:236 +msgid "Returns each member in *cls* in definition order::" +msgstr "按定义顺序返回 *cls* 中的每个成员::" + +#: ../../library/enum.rst:238 +msgid "" +">>> list(Color)\n" +"[, , ]" +msgstr "" +">>> list(Color)\n" +"[, , ]" + +#: ../../library/enum.rst:243 +msgid "Returns the number of members in *cls*::" +msgstr "返回 *cls* 中成员的数量::" + +#: ../../library/enum.rst:245 +msgid "" +">>> len(Color)\n" +"3" +msgstr "" +">>> len(Color)\n" +"3" + +#: ../../library/enum.rst:250 +msgid "Returns a mapping of every enum name to its member, including aliases" +msgstr "返回一个从每个枚举名称到其成员的映射,包括别名" + +#: ../../library/enum.rst:254 +msgid "Returns each member in *cls* in reverse definition order::" +msgstr "按定义的逆序返回 *cls* 中的每个成员::" + +#: ../../library/enum.rst:256 +msgid "" +">>> list(reversed(Color))\n" +"[, , ]" +msgstr "" +">>> list(reversed(Color))\n" +"[, , ]" + +#: ../../library/enum.rst:262 +msgid "*Enum* is the base class for all *enum* enumerations." +msgstr "*Enum* 是所有 *enum* 枚举的基类。" + +#: ../../library/enum.rst:266 +msgid "The name used to define the ``Enum`` member::" +msgstr "用于定义 ``Enum`` 成员的名称::" + +#: ../../library/enum.rst:268 +msgid "" +">>> Color.BLUE.name\n" +"'BLUE'" +msgstr "" +">>> Color.BLUE.name\n" +"'BLUE'" + +#: ../../library/enum.rst:273 +msgid "The value given to the ``Enum`` member::" +msgstr "赋给 ``Enum`` 成员的值::" + +#: ../../library/enum.rst:275 +msgid "" +">>> Color.RED.value\n" +"1" +msgstr "" +">>> Color.RED.value\n" +"1" + +#: ../../library/enum.rst:278 ../../library/enum.rst:298 +msgid "Value of the member, can be set in :meth:`~Enum.__new__`." +msgstr "成员的值,可在 :meth:`~Enum.__new__` 中设置。" + +#: ../../library/enum.rst:280 +msgid "Enum member values" +msgstr "Enum 成员值" + +#: ../../library/enum.rst:282 +msgid "" +"Member values can be anything: :class:`int`, :class:`str`, etc. If the " +"exact value is unimportant you may use :class:`auto` instances and an " +"appropriate value will be chosen for you. See :class:`auto` for the " +"details." +msgstr "" +"成员值可以为任意类型::class:`int`, :class:`str` 等等。如果具体的值不重要则你可以使用 :class:`auto` " +"实例这将为你选择一个适当的值。详情参见 :class:`auto`。" + +#: ../../library/enum.rst:287 +msgid "" +"While mutable/unhashable values, such as :class:`dict`, :class:`list` or a " +"mutable :class:`~dataclasses.dataclass`, can be used, they will have a " +"quadratic performance impact during creation relative to the total number of" +" mutable/unhashable values in the enum." +msgstr "" +"虽然可以使用可变/不可哈希的值,比如 :class:`dict`, :class:`list` 或是可变的 " +":class:`~dataclasses.dataclass`,但它们在创建期间会产生基于枚举中可变/不可哈希的值总数量的二次方级性能影响。" + +#: ../../library/enum.rst:294 +msgid "Name of the member." +msgstr "成员的名称。" + +#: ../../library/enum.rst:302 +msgid "" +"No longer used, kept for backward compatibility. (class attribute, removed " +"during class creation)." +msgstr "已不再使用,保留以便向下兼容。 (类属性,在类创建期间移除)。" + +#: ../../library/enum.rst:305 +msgid "" +"The :attr:`~Enum._order_` attribute can be provided to help keep Python 2 / " +"Python 3 code in sync. It will be checked against the actual order of the " +"enumeration and raise an error if the two do not match::" +msgstr "" + +#: ../../library/enum.rst:308 +msgid "" +">>> class Color(Enum):\n" +"... _order_ = 'RED GREEN BLUE'\n" +"... RED = 1\n" +"... BLUE = 3\n" +"... GREEN = 2\n" +"...\n" +"Traceback (most recent call last):\n" +"...\n" +"TypeError: member order does not match _order_:\n" +" ['RED', 'BLUE', 'GREEN']\n" +" ['RED', 'GREEN', 'BLUE']" +msgstr "" + +#: ../../library/enum.rst:322 +msgid "" +"In Python 2 code the :attr:`~Enum._order_` attribute is necessary as " +"definition order is lost before it can be recorded." +msgstr "在 Python 2 代码中 :attr:`~Enum._order_` 属性是必须的,因为定义顺序在被记录之前就已丢失。" + +#: ../../library/enum.rst:329 +msgid "" +"``_ignore_`` is only used during creation and is removed from the " +"enumeration once creation is complete." +msgstr "``_ignore_`` 仅在创建期间使用并会在创建完成后立即从枚举中移除。" + +#: ../../library/enum.rst:332 +msgid "" +"``_ignore_`` is a list of names that will not become members, and whose " +"names will also be removed from the completed enumeration. See " +":ref:`TimePeriod ` for an example." +msgstr "" +"``_ignore_`` 是由不会被作为成员的名称组成的列表,并且这些名称还将从完成的枚举中移除。请参阅 :ref:`TimePeriod ` 获取示例。" + +#: ../../library/enum.rst:340 +msgid "" +"Returns ``['__class__', '__doc__', '__module__', 'name', 'value']`` and any " +"public methods defined on *self.__class__*::" +msgstr "" +"返回 ``['__class__', '__doc__', '__module__', 'name', 'value']`` 以及在 " +"*self.__class__* 上定义的任何公有方法::" + +#: ../../library/enum.rst:343 +msgid "" +">>> from enum import Enum\n" +">>> import datetime as dt\n" +">>> class Weekday(Enum):\n" +"... MONDAY = 1\n" +"... TUESDAY = 2\n" +"... WEDNESDAY = 3\n" +"... THURSDAY = 4\n" +"... FRIDAY = 5\n" +"... SATURDAY = 6\n" +"... SUNDAY = 7\n" +"... @classmethod\n" +"... def today(cls):\n" +"... print(f'today is {cls(dt.date.today().isoweekday()).name}')\n" +"...\n" +">>> dir(Weekday.SATURDAY)\n" +"['__class__', '__doc__', '__eq__', '__hash__', '__module__', 'name', 'today', 'value']" +msgstr "" +">>> from enum import Enum\n" +">>> import datetime as dt\n" +">>> class Weekday(Enum):\n" +"... MONDAY = 1\n" +"... TUESDAY = 2\n" +"... WEDNESDAY = 3\n" +"... THURSDAY = 4\n" +"... FRIDAY = 5\n" +"... SATURDAY = 6\n" +"... SUNDAY = 7\n" +"... @classmethod\n" +"... def today(cls):\n" +"... print(f'today is {cls(dt.date.today().isoweekday()).name}')\n" +"...\n" +">>> dir(Weekday.SATURDAY)\n" +"['__class__', '__doc__', '__eq__', '__hash__', '__module__', 'name', 'today', 'value']" + +#: ../../library/enum.rst:0 +msgid "name" +msgstr "name" + +#: ../../library/enum.rst:362 +msgid "The name of the member being defined (e.g. 'RED')." +msgstr "定义的成员名称(例如 'RED')。" + +#: ../../library/enum.rst:363 +msgid "The start value for the Enum; the default is 1." +msgstr "Enum 的起始值;默认为 1。" + +#: ../../library/enum.rst:0 +msgid "count" +msgstr "count" + +#: ../../library/enum.rst:364 +msgid "The number of members currently defined, not including this one." +msgstr "当前定义的成员数量,不包括这一个。" + +#: ../../library/enum.rst:0 +msgid "last_values" +msgstr "last_values" + +#: ../../library/enum.rst:365 +msgid "A list of the previous values." +msgstr "由前面的值组成的列表。" + +#: ../../library/enum.rst:367 +msgid "" +"A *staticmethod* that is used to determine the next value returned by " +":class:`auto`." +msgstr "" + +#: ../../library/enum.rst:371 +msgid "" +"For standard :class:`Enum` classes the next value chosen is the highest " +"value seen incremented by one." +msgstr "对于标准的 :class:`Enum` 类来说下一个被选择的值将是已有的最高值加一。" + +#: ../../library/enum.rst:374 +msgid "" +"For :class:`Flag` classes the next value chosen will be the next highest " +"power-of-two." +msgstr "对于 :class:`Flag` 类来说下一个选择的值将是下一个最高的二的幂数。" + +#: ../../library/enum.rst:377 +msgid "This method may be overridden, e.g.::" +msgstr "此函数可以被重写,例如::" + +#: ../../library/enum.rst:379 +msgid "" +">>> from enum import auto, Enum\n" +">>> class PowersOfThree(Enum):\n" +"... @staticmethod\n" +"... def _generate_next_value_(name, start, count, last_values):\n" +"... return 3 ** (count + 1)\n" +"... FIRST = auto()\n" +"... SECOND = auto()\n" +"...\n" +">>> PowersOfThree.SECOND.value\n" +"9" +msgstr "" +">>> from enum import auto, Enum\n" +">>> class PowersOfThree(Enum):\n" +"... @staticmethod\n" +"... def _generate_next_value_(name, start, count, last_values):\n" +"... return 3 ** (count + 1)\n" +"... FIRST = auto()\n" +"... SECOND = auto()\n" +"...\n" +">>> PowersOfThree.SECOND.value\n" +"9" + +#: ../../library/enum.rst:391 +msgid "" +"Prior versions would use the last seen value instead of the highest value." +msgstr "在之前版本中将会使用最近的值而不是最高的值。" + +#: ../../library/enum.rst:396 +msgid "" +"By default, does nothing. If multiple values are given in the member " +"assignment, those values become separate arguments to ``__init__``; e.g." +msgstr "在默认情况下,将不做任何事。如果在成员赋值时给出了多个值,这些值将成为传给 ``__init__`` 的单独参数;例如" + +#: ../../library/enum.rst:403 +msgid "" +"``Weekday.__init__()`` would be called as ``Weekday.__init__(self, 1, " +"'Mon')``" +msgstr "``Weekday.__init__()`` 将以 ``Weekday.__init__(self, 1, 'Mon')`` 的形式被调用" + +#: ../../library/enum.rst:407 +msgid "" +"A *classmethod* that is used to further configure subsequent subclasses. By " +"default, does nothing." +msgstr "一个用来进一步配置后续子类的 *类方法*。在默认情况下,将不做任何事。" + +#: ../../library/enum.rst:412 +msgid "" +"A *classmethod* for looking up values not found in *cls*. By default it " +"does nothing, but can be overridden to implement custom search behavior::" +msgstr "一个用来查找不存在于 *cls* 中的值的 *类方法*。在默认情况下它将不做任何事,但可以被重写以实现自定义的搜索行为::" + +#: ../../library/enum.rst:415 +msgid "" +">>> from enum import auto, StrEnum\n" +">>> class Build(StrEnum):\n" +"... DEBUG = auto()\n" +"... OPTIMIZED = auto()\n" +"... @classmethod\n" +"... def _missing_(cls, value):\n" +"... value = value.lower()\n" +"... for member in cls:\n" +"... if member.value == value:\n" +"... return member\n" +"... return None\n" +"...\n" +">>> Build.DEBUG.value\n" +"'debug'\n" +">>> Build('deBUG')\n" +"" +msgstr "" +">>> from enum import auto, StrEnum\n" +">>> class Build(StrEnum):\n" +"... DEBUG = auto()\n" +"... OPTIMIZED = auto()\n" +"... @classmethod\n" +"... def _missing_(cls, value):\n" +"... value = value.lower()\n" +"... for member in cls:\n" +"... if member.value == value:\n" +"... return member\n" +"... return None\n" +"...\n" +">>> Build.DEBUG.value\n" +"'debug'\n" +">>> Build('deBUG')\n" +"" + +#: ../../library/enum.rst:436 +msgid "" +"By default, doesn't exist. If specified, either in the enum class " +"definition or in a mixin class (such as ``int``), all values given in the " +"member assignment will be passed; e.g." +msgstr "" +"在默认情况下,将不会存在。如果指定,则或是在枚举类定义中或是在混入类定义中 (比如 ``int``),在成员赋值时给出的所有值都将被传递;例如" + +#: ../../library/enum.rst:444 +msgid "" +"results in the call ``int('1a', 16)`` and a value of ``26`` for the member." +msgstr "将导致调用 ``int('1a', 16)`` 并使该成员的值为 ``26``。" + +#: ../../library/enum.rst:448 +msgid "" +"When writing a custom ``__new__``, do not use ``super().__new__`` -- call " +"the appropriate ``__new__`` instead." +msgstr "" +"当编写自定义的 ``__new__`` 时,不要使用 ``super().__new__`` -- 而要调用适当的 ``__new__``。" + +#: ../../library/enum.rst:453 +msgid "" +"Returns the string used for *repr()* calls. By default, returns the *Enum* " +"name, member name, and value, but can be overridden::" +msgstr "返回用于 *repr()* 调用的字符串。在默认情况下,将返回 *Enum* 名称、成员名称和值,但也可以被重写::" + +#: ../../library/enum.rst:456 +msgid "" +">>> from enum import auto, Enum\n" +">>> class OtherStyle(Enum):\n" +"... ALTERNATE = auto()\n" +"... OTHER = auto()\n" +"... SOMETHING_ELSE = auto()\n" +"... def __repr__(self):\n" +"... cls_name = self.__class__.__name__\n" +"... return f'{cls_name}.{self.name}'\n" +"...\n" +">>> OtherStyle.ALTERNATE, str(OtherStyle.ALTERNATE), f\"{OtherStyle.ALTERNATE}\"\n" +"(OtherStyle.ALTERNATE, 'OtherStyle.ALTERNATE', 'OtherStyle.ALTERNATE')" +msgstr "" +">>> from enum import auto, Enum\n" +">>> class OtherStyle(Enum):\n" +"... ALTERNATE = auto()\n" +"... OTHER = auto()\n" +"... SOMETHING_ELSE = auto()\n" +"... def __repr__(self):\n" +"... cls_name = self.__class__.__name__\n" +"... return f'{cls_name}.{self.name}'\n" +"...\n" +">>> OtherStyle.ALTERNATE, str(OtherStyle.ALTERNATE), f\"{OtherStyle.ALTERNATE}\"\n" +"(OtherStyle.ALTERNATE, 'OtherStyle.ALTERNATE', 'OtherStyle.ALTERNATE')" + +#: ../../library/enum.rst:470 +msgid "" +"Returns the string used for *str()* calls. By default, returns the *Enum* " +"name and member name, but can be overridden::" +msgstr "返回用于 *str()* 调用的字符串。在默认情况下,返回 *Enum* 名称和成员名称,但也可以被重写::" + +#: ../../library/enum.rst:473 +msgid "" +">>> from enum import auto, Enum\n" +">>> class OtherStyle(Enum):\n" +"... ALTERNATE = auto()\n" +"... OTHER = auto()\n" +"... SOMETHING_ELSE = auto()\n" +"... def __str__(self):\n" +"... return f'{self.name}'\n" +"...\n" +">>> OtherStyle.ALTERNATE, str(OtherStyle.ALTERNATE), f\"{OtherStyle.ALTERNATE}\"\n" +"(, 'ALTERNATE', 'ALTERNATE')" +msgstr "" +">>> from enum import auto, Enum\n" +">>> class OtherStyle(Enum):\n" +"... ALTERNATE = auto()\n" +"... OTHER = auto()\n" +"... SOMETHING_ELSE = auto()\n" +"... def __str__(self):\n" +"... return f'{self.name}'\n" +"...\n" +">>> OtherStyle.ALTERNATE, str(OtherStyle.ALTERNATE), f\"{OtherStyle.ALTERNATE}\"\n" +"(, 'ALTERNATE', 'ALTERNATE')" + +#: ../../library/enum.rst:486 +msgid "" +"Returns the string used for *format()* and *f-string* calls. By default, " +"returns :meth:`__str__` return value, but can be overridden::" +msgstr "" +"返回用于 *format()* 和 *f-string* 调用的字符串。在默认情况下,将返回 :meth:`__str__` " +"的返回值,但也可以被重写::" + +#: ../../library/enum.rst:489 +msgid "" +">>> from enum import auto, Enum\n" +">>> class OtherStyle(Enum):\n" +"... ALTERNATE = auto()\n" +"... OTHER = auto()\n" +"... SOMETHING_ELSE = auto()\n" +"... def __format__(self, spec):\n" +"... return f'{self.name}'\n" +"...\n" +">>> OtherStyle.ALTERNATE, str(OtherStyle.ALTERNATE), f\"{OtherStyle.ALTERNATE}\"\n" +"(, 'OtherStyle.ALTERNATE', 'ALTERNATE')" +msgstr "" +">>> from enum import auto, Enum\n" +">>> class OtherStyle(Enum):\n" +"... ALTERNATE = auto()\n" +"... OTHER = auto()\n" +"... SOMETHING_ELSE = auto()\n" +"... def __format__(self, spec):\n" +"... return f'{self.name}'\n" +"...\n" +">>> OtherStyle.ALTERNATE, str(OtherStyle.ALTERNATE), f\"{OtherStyle.ALTERNATE}\"\n" +"(, 'OtherStyle.ALTERNATE', 'ALTERNATE')" + +#: ../../library/enum.rst:502 +msgid "" +"Using :class:`auto` with :class:`Enum` results in integers of increasing " +"value, starting with ``1``." +msgstr "将 :class:`auto` 用于 :class:`Enum` 将得到递增的整数值,从 ``1`` 开始。" + +#: ../../library/enum.rst:505 +msgid "Added :ref:`enum-dataclass-support`." +msgstr "" + +#: ../../library/enum.rst:509 +msgid "Adds a new name as an alias to an existing member::" +msgstr "添加一个新名称作为现有成员的别名::" + +#: ../../library/enum.rst:511 +msgid "" +">>> Color.RED._add_alias_(\"ERROR\")\n" +">>> Color.ERROR\n" +"" +msgstr "" +">>> Color.RED._add_alias_(\"ERROR\")\n" +">>> Color.ERROR\n" +"" + +#: ../../library/enum.rst:515 +msgid "" +"Raises a :exc:`NameError` if the name is already assigned to a different " +"member." +msgstr "如果该名称已被分配给另一个成员则会引发 :exc:`NameError`。" + +#: ../../library/enum.rst:521 +msgid "Adds a new value as an alias to an existing member::" +msgstr "添加一个新值作为现有成员的别名::" + +#: ../../library/enum.rst:523 +msgid "" +">>> Color.RED._add_value_alias_(42)\n" +">>> Color(42)\n" +"" +msgstr "" +">>> Color.RED._add_value_alias_(42)\n" +">>> Color(42)\n" +"" + +#: ../../library/enum.rst:527 +msgid "" +"Raises a :exc:`ValueError` if the value is already linked with a different " +"member." +msgstr "如果该值已被链接到另一个成员则会引发 :exc:`ValueError`。" + +#: ../../library/enum.rst:528 +msgid "See :ref:`multi-value-enum` for an example." +msgstr "参阅 :ref:`multi-value-enum` 的示例。" + +#: ../../library/enum.rst:535 +msgid "" +"*IntEnum* is the same as :class:`Enum`, but its members are also integers " +"and can be used anywhere that an integer can be used. If any integer " +"operation is performed with an *IntEnum* member, the resulting value loses " +"its enumeration status." +msgstr "" +"*IntEnum* 和 :class:`Enum` 是一样的,但其成员还属于整数并可被用在任何可以使用整数的地方。如果对一个 *IntEnum* " +"成员执行整数运算,结果值将失去其枚举状态。" + +#: ../../library/enum.rst:556 +msgid "" +"Using :class:`auto` with :class:`IntEnum` results in integers of increasing " +"value, starting with ``1``." +msgstr "将 :class:`auto` 用于 :class:`IntEnum` 将得到递增的整数值,从 ``1`` 开始。" + +#: ../../library/enum.rst:559 +msgid "" +":meth:`~object.__str__` is now :meth:`!int.__str__` to better support the " +"*replacement of existing constants* use-case. :meth:`~object.__format__` was" +" already :meth:`!int.__format__` for that same reason." +msgstr "" +":meth:`~object.__str__` 现在是 :meth:`!int.__str__` 以更好地支持 *现有常量的替换* 应用场景。 " +"出于同样的原因 :meth:`~object.__format__` 也已经是 :meth:`!int.__format__`。" + +#: ../../library/enum.rst:566 +msgid "" +"*StrEnum* is the same as :class:`Enum`, but its members are also strings and" +" can be used in most of the same places that a string can be used. The " +"result of any string operation performed on or with a *StrEnum* member is " +"not part of the enumeration." +msgstr "" +"*StrEnum* 和 :class:`Enum` 是一样的,但其成员还属于字符串并可被用在任何可以使用字符串的地方。如果对一个 *StrEnum* " +"成员执行字符串操作其结果值将不再是该枚举的一部分。" + +#: ../../library/enum.rst:587 +msgid "" +"There are places in the stdlib that check for an exact :class:`str` instead " +"of a :class:`str` subclass (i.e. ``type(unknown) == str`` instead of " +"``isinstance(unknown, str)``), and in those locations you will need to use " +"``str(MyStrEnum.MY_MEMBER)``." +msgstr "" +"在标准库中有些地方会检查是否是真正的 :class:`str` 而不是 :class:`str` 的子类 (例如使用 ``type(unknown) " +"== str`` 而不是 ``isinstance(unknown, str)``),在这些地方你将需要使用 " +"``str(MyStrEnum.MY_MEMBER)``." + +#: ../../library/enum.rst:594 +msgid "" +"Using :class:`auto` with :class:`StrEnum` results in the lower-cased member " +"name as the value." +msgstr "将 :class:`auto` 用于 :class:`StrEnum` 将得到小写形式的成员名称字符串值。" + +#: ../../library/enum.rst:599 +msgid "" +":meth:`~object.__str__` is :meth:`!str.__str__` to better support the " +"*replacement of existing constants* use-case. :meth:`~object.__format__` is" +" likewise :meth:`!str.__format__` for that same reason." +msgstr "" +":meth:`~object.__str__` 是 :meth:`!str.__str__` 以更好地支持 *现有常量的替换* 应用场景。 " +"出于同样的原因 :meth:`~object.__format__` 也是 :meth:`!str.__format__`。" + +#: ../../library/enum.rst:607 +msgid "" +"``Flag`` is the same as :class:`Enum`, but its members support the bitwise " +"operators ``&`` (*AND*), ``|`` (*OR*), ``^`` (*XOR*), and ``~`` (*INVERT*); " +"the results of those operations are (aliases of) members of the enumeration." +msgstr "" +"``Flag`` 与 :class:`Enum` 的相同,但其成员支持按位运算符 ``&`` (*AND*), ``|`` (*OR*), ``^`` " +"(*XOR*) 和 ``~`` (*INVERT*);这些运算的结果都是枚举成员(的别名)。" + +#: ../../library/enum.rst:613 +msgid "Returns *True* if value is in self::" +msgstr "如果 value 在 self 之中则返回 *True*::" + +#: ../../library/enum.rst:615 +msgid "" +">>> from enum import Flag, auto\n" +">>> class Color(Flag):\n" +"... RED = auto()\n" +"... GREEN = auto()\n" +"... BLUE = auto()\n" +"...\n" +">>> purple = Color.RED | Color.BLUE\n" +">>> white = Color.RED | Color.GREEN | Color.BLUE\n" +">>> Color.GREEN in purple\n" +"False\n" +">>> Color.GREEN in white\n" +"True\n" +">>> purple in white\n" +"True\n" +">>> white in purple\n" +"False" +msgstr "" +">>> from enum import Flag, auto\n" +">>> class Color(Flag):\n" +"... RED = auto()\n" +"... GREEN = auto()\n" +"... BLUE = auto()\n" +"...\n" +">>> purple = Color.RED | Color.BLUE\n" +">>> white = Color.RED | Color.GREEN | Color.BLUE\n" +">>> Color.GREEN in purple\n" +"False\n" +">>> Color.GREEN in white\n" +"True\n" +">>> purple in white\n" +"True\n" +">>> white in purple\n" +"False" + +#: ../../library/enum.rst:634 +msgid "Returns all contained non-alias members::" +msgstr "返回所有包含的非别名成员::" + +#: ../../library/enum.rst:636 +msgid "" +">>> list(Color.RED)\n" +"[]\n" +">>> list(purple)\n" +"[, ]" +msgstr "" +">>> list(Color.RED)\n" +"[]\n" +">>> list(purple)\n" +"[, ]" + +#: ../../library/enum.rst:645 +msgid "Returns number of members in flag::" +msgstr "返回旗标中成员的数量::" + +#: ../../library/enum.rst:647 +msgid "" +">>> len(Color.GREEN)\n" +"1\n" +">>> len(white)\n" +"3" +msgstr "" +">>> len(Color.GREEN)\n" +"1\n" +">>> len(white)\n" +"3" + +#: ../../library/enum.rst:656 +msgid "Returns *True* if any members in flag, *False* otherwise::" +msgstr "如果旗标中有成员则返回 *True*,否则返回 *False*::" + +#: ../../library/enum.rst:658 +msgid "" +">>> bool(Color.GREEN)\n" +"True\n" +">>> bool(white)\n" +"True\n" +">>> black = Color(0)\n" +">>> bool(black)\n" +"False" +msgstr "" +">>> bool(Color.GREEN)\n" +"True\n" +">>> bool(white)\n" +"True\n" +">>> black = Color(0)\n" +">>> bool(black)\n" +"False" + +#: ../../library/enum.rst:668 +msgid "Returns current flag binary or'ed with other::" +msgstr "返回当前旗标与另一个旗标执行二进制或运算的结果::" + +#: ../../library/enum.rst:670 +msgid "" +">>> Color.RED | Color.GREEN\n" +"" +msgstr "" +">>> Color.RED | Color.GREEN\n" +"" + +#: ../../library/enum.rst:675 +msgid "Returns current flag binary and'ed with other::" +msgstr "返回当前旗标与另一个旗标执行二进制与运算的结果::" + +#: ../../library/enum.rst:677 +msgid "" +">>> purple & white\n" +"\n" +">>> purple & Color.GREEN\n" +"" +msgstr "" +">>> purple & white\n" +"\n" +">>> purple & Color.GREEN\n" +"" + +#: ../../library/enum.rst:684 +msgid "Returns current flag binary xor'ed with other::" +msgstr "返回当前旗标与另一个旗标执行二进制异或运算的结果::" + +#: ../../library/enum.rst:686 +msgid "" +">>> purple ^ white\n" +"\n" +">>> purple ^ Color.GREEN\n" +"" +msgstr "" +">>> purple ^ white\n" +"\n" +">>> purple ^ Color.GREEN\n" +"" + +#: ../../library/enum.rst:693 +msgid "Returns all the flags in *type(self)* that are not in *self*::" +msgstr "返回 *type(self)* 中所有不在 *self* 中的旗标::" + +#: ../../library/enum.rst:695 +msgid "" +">>> ~white\n" +"\n" +">>> ~purple\n" +"\n" +">>> ~Color.RED\n" +"" +msgstr "" +">>> ~white\n" +"\n" +">>> ~purple\n" +"\n" +">>> ~Color.RED\n" +"" + +#: ../../library/enum.rst:704 +msgid "" +"Function used to format any remaining unnamed numeric values. Default is " +"the value's repr; common choices are :func:`hex` and :func:`oct`." +msgstr "用于格式化任何其他未命名数字值的函数。默认为数字值的 repr;常见的选择有 :func:`hex` 和 :func:`oct`。" + +#: ../../library/enum.rst:709 +msgid "" +"Using :class:`auto` with :class:`Flag` results in integers that are powers " +"of two, starting with ``1``." +msgstr "将 :class:`auto` 用于 :class:`Flag` 将得到二的整数次方,从 ``1`` 开始。" + +#: ../../library/enum.rst:712 +msgid "The *repr()* of zero-valued flags has changed. It is now:" +msgstr "零值旗标的 *repr()* 已被修改。现在将是:" + +#: ../../library/enum.rst:720 +msgid "" +"``IntFlag`` is the same as :class:`Flag`, but its members are also integers " +"and can be used anywhere that an integer can be used." +msgstr "``IntFlag`` 与 :class:`Flag` 相同,但其成员还属于整数类型并能被用于任何可以使用整数的地方。" + +#: ../../library/enum.rst:734 +msgid "" +"If any integer operation is performed with an *IntFlag* member, the result " +"is not an *IntFlag*::" +msgstr "如果对一个 *IntFlag* 成员执行任何整数运算,结果将不再是一个 *IntFlag*::" + +#: ../../library/enum.rst:737 +msgid "" +">>> Color.RED + 2\n" +"3" +msgstr "" +">>> Color.RED + 2\n" +"3" + +#: ../../library/enum.rst:740 +msgid "" +"If a :class:`Flag` operation is performed with an *IntFlag* member and:" +msgstr "如果对一个 *IntFlag* 成员执行 :class:`Flag` 操作并且:" + +#: ../../library/enum.rst:742 +msgid "the result is a valid *IntFlag*: an *IntFlag* is returned" +msgstr "结果是一个合法的 *IntFlag*: 将返回一个 *IntFlag*" + +#: ../../library/enum.rst:743 +msgid "" +"the result is not a valid *IntFlag*: the result depends on the " +":class:`FlagBoundary` setting" +msgstr "其结果将不是合法的 *IntFlag*: 具体结果将取决于 :class:`FlagBoundary` 设置" + +#: ../../library/enum.rst:745 +msgid "" +"The :func:`repr` of unnamed zero-valued flags has changed. It is now::" +msgstr "未命名旗标的 :func:`repr` 已被修改。现在将是::" + +#: ../../library/enum.rst:747 +msgid "" +">>> Color(0)\n" +"" +msgstr "" +">>> Color(0)\n" +"" + +#: ../../library/enum.rst:752 +msgid "" +"Using :class:`auto` with :class:`IntFlag` results in integers that are " +"powers of two, starting with ``1``." +msgstr "将 :class:`auto` 用于 :class:`IntFlag` 将得到二的整数次方,从 ``1`` 开始。" + +#: ../../library/enum.rst:757 +msgid "" +":meth:`~object.__str__` is now :meth:`!int.__str__` to better support the " +"*replacement of existing constants* use-case. :meth:`~object.__format__` " +"was already :meth:`!int.__format__` for that same reason." +msgstr "" +":meth:`~object.__str__` 现在是 :meth:`!int.__str__` 以更好地支持 *现有常量的替换* 应用场景。 " +"出于同样的原因 :meth:`~object.__format__` 也已经是 :meth:`!int.__format__`。" + +#: ../../library/enum.rst:761 +msgid "" +"Inversion of an :class:`!IntFlag` now returns a positive value that is the " +"union of all flags not in the given flag, rather than a negative value. This" +" matches the existing :class:`Flag` behavior." +msgstr "" +"对一个 :class:`!IntFlag` 的反转现在将返回一个等于不在给定旗标中的所有旗标的并集的正值,而非一个负值。这与现有 " +":class:`Flag` 的行为相匹配。" + +#: ../../library/enum.rst:767 +msgid "" +":class:`!ReprEnum` uses the :meth:`repr() ` of :class:`Enum`," +" but the :class:`str() ` of the mixed-in data type:" +msgstr "" +":class:`!ReprEnum` 将使用 :class:`Enum` 的 :meth:`repr() " +"`,但使用混入数据类型的 :class:`str() `:" + +#: ../../library/enum.rst:770 +msgid ":meth:`!int.__str__` for :class:`IntEnum` and :class:`IntFlag`" +msgstr ":meth:`!int.__str__` 用于 :class:`IntEnum` 和 :class:`IntFlag`" + +#: ../../library/enum.rst:771 +msgid ":meth:`!str.__str__` for :class:`StrEnum`" +msgstr ":meth:`!str.__str__` 用于 :class:`StrEnum`" + +#: ../../library/enum.rst:773 +msgid "" +"Inherit from :class:`!ReprEnum` to keep the :class:`str() ` / " +":func:`format` of the mixed-in data type instead of using the " +":class:`Enum`-default :meth:`str() `." +msgstr "" +"从 :class:`!ReprEnum` 继承以保留混入数据类型的 :class:`str() ` / :func:`format` " +"而不是使用 :class:`Enum` 默认的 :meth:`str() `。" + +#: ../../library/enum.rst:782 +msgid "" +"*EnumCheck* contains the options used by the :func:`verify` decorator to " +"ensure various constraints; failed constraints result in a " +":exc:`ValueError`." +msgstr "" +"*EnumCheck* 包含由 :func:`verify` 装饰器用来确保各种约束的选项;失败的约束将导致 :exc:`ValueError`。" + +#: ../../library/enum.rst:787 +msgid "Ensure that each value has only one name::" +msgstr "确保每个值只有一个名称::" + +#: ../../library/enum.rst:789 +msgid "" +">>> from enum import Enum, verify, UNIQUE\n" +">>> @verify(UNIQUE)\n" +"... class Color(Enum):\n" +"... RED = 1\n" +"... GREEN = 2\n" +"... BLUE = 3\n" +"... CRIMSON = 1\n" +"Traceback (most recent call last):\n" +"...\n" +"ValueError: aliases found in : CRIMSON -> RED" +msgstr "" +">>> from enum import Enum, verify, UNIQUE\n" +">>> @verify(UNIQUE)\n" +"... class Color(Enum):\n" +"... RED = 1\n" +"... GREEN = 2\n" +"... BLUE = 3\n" +"... CRIMSON = 1\n" +"Traceback (most recent call last):\n" +"...\n" +"ValueError: aliases found in : CRIMSON -> RED" + +#: ../../library/enum.rst:803 +msgid "" +"Ensure that there are no missing values between the lowest-valued member and" +" the highest-valued member::" +msgstr "确保在最低值成员和最高值成员之间没有缺失的值::" + +#: ../../library/enum.rst:806 +msgid "" +">>> from enum import Enum, verify, CONTINUOUS\n" +">>> @verify(CONTINUOUS)\n" +"... class Color(Enum):\n" +"... RED = 1\n" +"... GREEN = 2\n" +"... BLUE = 5\n" +"Traceback (most recent call last):\n" +"...\n" +"ValueError: invalid enum 'Color': missing values 3, 4" +msgstr "" +">>> from enum import Enum, verify, CONTINUOUS\n" +">>> @verify(CONTINUOUS)\n" +"... class Color(Enum):\n" +"... RED = 1\n" +"... GREEN = 2\n" +"... BLUE = 5\n" +"Traceback (most recent call last):\n" +"...\n" +"ValueError: invalid enum 'Color': missing values 3, 4" + +#: ../../library/enum.rst:818 +msgid "" +"Ensure that any flag groups/masks contain only named flags -- useful when " +"values are specified instead of being generated by :func:`auto`::" +msgstr "确保任何旗标分组/掩码只包含已命名的旗标 -- 在值是明确指定而不是由 :func:`auto` 生成时将很有用处::" + +#: ../../library/enum.rst:821 +msgid "" +">>> from enum import Flag, verify, NAMED_FLAGS\n" +">>> @verify(NAMED_FLAGS)\n" +"... class Color(Flag):\n" +"... RED = 1\n" +"... GREEN = 2\n" +"... BLUE = 4\n" +"... WHITE = 15\n" +"... NEON = 31\n" +"Traceback (most recent call last):\n" +"...\n" +"ValueError: invalid Flag 'Color': aliases WHITE and NEON are missing combined values of 0x18 [use enum.show_flag_values(value) for details]" +msgstr "" +">>> from enum import Flag, verify, NAMED_FLAGS\n" +">>> @verify(NAMED_FLAGS)\n" +"... class Color(Flag):\n" +"... RED = 1\n" +"... GREEN = 2\n" +"... BLUE = 4\n" +"... WHITE = 15\n" +"... NEON = 31\n" +"Traceback (most recent call last):\n" +"...\n" +"ValueError: invalid Flag 'Color': aliases WHITE and NEON are missing combined values of 0x18 [use enum.show_flag_values(value) for details]" + +#: ../../library/enum.rst:835 +msgid "" +"CONTINUOUS and NAMED_FLAGS are designed to work with integer-valued members." +msgstr "CONTINUOUS 和 NAMED_FLAGS 被设计用于配合整数值成员。" + +#: ../../library/enum.rst:841 +msgid "" +"``FlagBoundary`` controls how out-of-range values are handled in " +":class:`Flag` and its subclasses." +msgstr "``FlagBoundary`` 控制在 :class:`Flag` 及其子类中如何处理超出范围的值。" + +#: ../../library/enum.rst:846 +msgid "" +"Out-of-range values cause a :exc:`ValueError` to be raised. This is the " +"default for :class:`Flag`::" +msgstr "超出范围的值将导致引发 :exc:`ValueError`。这是 :class:`Flag` 的默认设置::" + +#: ../../library/enum.rst:849 +msgid "" +">>> from enum import Flag, STRICT, auto\n" +">>> class StrictFlag(Flag, boundary=STRICT):\n" +"... RED = auto()\n" +"... GREEN = auto()\n" +"... BLUE = auto()\n" +"...\n" +">>> StrictFlag(2**2 + 2**4)\n" +"Traceback (most recent call last):\n" +"...\n" +"ValueError: invalid value 20\n" +" given 0b0 10100\n" +" allowed 0b0 00111" +msgstr "" +">>> from enum import Flag, STRICT, auto\n" +">>> class StrictFlag(Flag, boundary=STRICT):\n" +"... RED = auto()\n" +"... GREEN = auto()\n" +"... BLUE = auto()\n" +"...\n" +">>> StrictFlag(2**2 + 2**4)\n" +"Traceback (most recent call last):\n" +"...\n" +"ValueError: invalid value 20\n" +" given 0b0 10100\n" +" allowed 0b0 00111" + +#: ../../library/enum.rst:864 +msgid "" +"Out-of-range values have invalid values removed, leaving a valid " +":class:`Flag` value::" +msgstr "超出范围的值将导致无效的值被移除,保留有效的 :class:`Flag` 值::" + +#: ../../library/enum.rst:867 +msgid "" +">>> from enum import Flag, CONFORM, auto\n" +">>> class ConformFlag(Flag, boundary=CONFORM):\n" +"... RED = auto()\n" +"... GREEN = auto()\n" +"... BLUE = auto()\n" +"...\n" +">>> ConformFlag(2**2 + 2**4)\n" +"" +msgstr "" +">>> from enum import Flag, CONFORM, auto\n" +">>> class ConformFlag(Flag, boundary=CONFORM):\n" +"... RED = auto()\n" +"... GREEN = auto()\n" +"... BLUE = auto()\n" +"...\n" +">>> ConformFlag(2**2 + 2**4)\n" +"" + +#: ../../library/enum.rst:878 +msgid "" +"Out-of-range values lose their :class:`Flag` membership and revert to " +":class:`int`." +msgstr "超出范围的值将失去其 :class:`Flag` 成员资格并转换为 :class:`int`。" + +#: ../../library/enum.rst:891 +msgid "" +"Out-of-range values are kept, and the :class:`Flag` membership is kept. This" +" is the default for :class:`IntFlag`::" +msgstr "超出范围的值将被保留,:class:`Flag` 成员资格也将被保留。这是 :class:`IntFlag` 的默认设置::" + +#: ../../library/enum.rst:894 +msgid "" +">>> from enum import Flag, KEEP, auto\n" +">>> class KeepFlag(Flag, boundary=KEEP):\n" +"... RED = auto()\n" +"... GREEN = auto()\n" +"... BLUE = auto()\n" +"...\n" +">>> KeepFlag(2**2 + 2**4)\n" +"" +msgstr "" +">>> from enum import Flag, KEEP, auto\n" +">>> class KeepFlag(Flag, boundary=KEEP):\n" +"... RED = auto()\n" +"... GREEN = auto()\n" +"... BLUE = auto()\n" +"...\n" +">>> KeepFlag(2**2 + 2**4)\n" +"" + +#: ../../library/enum.rst:907 +msgid "" +"*EnumDict* is a subclass of :class:`dict` that is used as the namespace for " +"defining enum classes (see :ref:`prepare`). It is exposed to allow " +"subclasses of :class:`EnumType` with advanced behavior like having multiple " +"values per member. It should be called with the name of the enum class being" +" created, otherwise private names and internal classes will not be handled " +"correctly." +msgstr "" +"*EnumDict* 是一个用作定义枚举类的命名空间的 :class:`dict` 子类 (参见 :ref:`prepare`)。 它被对外公开以允许 " +":class:`EnumType` 的子类具有高级行为如每个成员可包含多个值。 " +"它在调用时应当传入被创建的枚举类的名称,否则私有名称和内部类将无法被正确地处理。" + +#: ../../library/enum.rst:914 +msgid "" +"Note that only the :class:`~collections.abc.MutableMapping` interface " +"(:meth:`~object.__setitem__` and :meth:`~dict.update`) is overridden. It may" +" be possible to bypass the checks using other :class:`!dict` operations like" +" :meth:`|= `." +msgstr "" +"请注意只有 :class:`~collections.abc.MutableMapping` 接口 " +"(:meth:`~object.__setitem__` 和 :meth:`~dict.update`) 会被重写。有可能使用其他 " +":class:`!dict` 操作如 :meth:`|= ` 来绕过此项检查。" + +#: ../../library/enum.rst:921 +msgid "A list of member names." +msgstr "由成员名称组成的列表。" + +#: ../../library/enum.rst:930 +msgid "Supported ``__dunder__`` names" +msgstr "支持的 ``__dunder__`` 名称" + +#: ../../library/enum.rst:932 +msgid "" +":attr:`~EnumType.__members__` is a read-only ordered mapping of " +"``member_name``:``member`` items. It is only available on the class." +msgstr "" +":attr:`~EnumType.__members__` 是由 ``member_name``:``member`` 条目组成的只读有序映射。 " +"它只在类上可用。" + +#: ../../library/enum.rst:935 +msgid "" +":meth:`~Enum.__new__`, if specified, must create and return the enum " +"members; it is also a very good idea to set the member's " +":attr:`~Enum._value_` appropriately. Once all the members are created it is " +"no longer used." +msgstr "" + +#: ../../library/enum.rst:941 +msgid "Supported ``_sunder_`` names" +msgstr "支持的 ``_sunder_`` 名称" + +#: ../../library/enum.rst:943 +msgid ":attr:`~Enum._name_` -- name of the member" +msgstr ":attr:`~Enum._name_` -- 成员的名称" + +#: ../../library/enum.rst:944 +msgid "" +":attr:`~Enum._value_` -- value of the member; can be set in ``__new__``" +msgstr ":attr:`~Enum._value_` -- 成员的值;可在 ``__new__`` 中设置" + +#: ../../library/enum.rst:945 +msgid "" +":meth:`~Enum._missing_` -- a lookup function used when a value is not found;" +" may be overridden" +msgstr ":meth:`~Enum._missing_` -- 当未找到某个值时所使用的查找函数;可被重写" + +#: ../../library/enum.rst:947 +msgid "" +":attr:`~Enum._ignore_` -- a list of names, either as a :class:`list` or a " +":class:`str`, that will not be transformed into members, and will be removed" +" from the final class" +msgstr "" +":attr:`~Enum._ignore_` -- 一个名称列表,可以为 :class:`list` 或 " +":class:`str`,它不会被转化为成员,并将从最终类中移除" + +#: ../../library/enum.rst:950 +msgid "" +":attr:`~Enum._order_` -- no longer used, kept for backward compatibility " +"(class attribute, removed during class creation)" +msgstr ":attr:`~Enum._order_` -- 已不再使用,保留以便向下兼容(类属性,在类创建期间移除)" + +#: ../../library/enum.rst:953 +msgid "" +":meth:`~Enum._generate_next_value_` -- used to get an appropriate value for " +"an enum member; may be overridden" +msgstr ":meth:`~Enum._generate_next_value_` -- 用于为枚举成员获取适当的值;可被重写" + +#: ../../library/enum.rst:956 +msgid "" +":meth:`~Enum._add_alias_` -- adds a new name as an alias to an existing " +"member." +msgstr ":meth:`~Enum._add_alias_` -- 添加一个新名称作为现有成员的别名。" + +#: ../../library/enum.rst:958 +msgid "" +":meth:`~Enum._add_value_alias_` -- adds a new value as an alias to an " +"existing member." +msgstr ":meth:`~Enum._add_value_alias_` -- 添加一个新值作为现有成员的别名。" + +#: ../../library/enum.rst:961 +msgid "" +"While ``_sunder_`` names are generally reserved for the further development " +"of the :class:`Enum` class and can not be used, some are explicitly allowed:" +msgstr "虽然 ``_sunder_`` 名称通常被保留用于 :class:`Enum` 类的后续开发因而不可被使用,但有一些则被显式地允许:" + +#: ../../library/enum.rst:964 +msgid "" +"``_repr_*`` (e.g. ``_repr_html_``), as used in `IPython's rich display`_" +msgstr "``_repr_*`` (例如 ``_repr_html_``),用于 `IPython's rich display`_" + +#: ../../library/enum.rst:966 +msgid "``_missing_``, ``_order_``, ``_generate_next_value_``" +msgstr "``_missing_``, ``_order_``, ``_generate_next_value_``" + +#: ../../library/enum.rst:967 +msgid "``_ignore_``" +msgstr "``_ignore_``" + +#: ../../library/enum.rst:968 +msgid "``_add_alias_``, ``_add_value_alias_``, ``_repr_*``" +msgstr "``_add_alias_``, ``_add_value_alias_``, ``_repr_*``" + +#: ../../library/enum.rst:974 +msgid "Utilities and decorators" +msgstr "" + +#: ../../library/enum.rst:978 +msgid "" +"*auto* can be used in place of a value. If used, the *Enum* machinery will " +"call an :class:`Enum`'s :meth:`~Enum._generate_next_value_` to get an " +"appropriate value. For :class:`Enum` and :class:`IntEnum` that appropriate " +"value will be the highest value seen plus one; for :class:`Flag` and " +":class:`IntFlag` it will be the first power-of-two greater than the highest " +"value seen; for :class:`StrEnum` it will be the lower-cased version of the " +"member's name. Care must be taken if mixing *auto()* with manually " +"specified values." +msgstr "" + +#: ../../library/enum.rst:986 +msgid "" +"*auto* instances are only resolved when at the top level of an assignment, " +"either by itself or as part of a tuple:" +msgstr "*auto* 实例仅会在赋值操作的最高层级上作为本身或元组的一部分被解析。" + +#: ../../library/enum.rst:989 +msgid "``FIRST = auto()`` will work (auto() is replaced with ``1``);" +msgstr "``FIRST = auto()`` 将是可用的 (auto() 会被替换为 ``1``);" + +#: ../../library/enum.rst:990 +msgid "" +"``SECOND = auto(), -2`` will work (auto is replaced with ``2``, so ``2, -2``" +" is used to create the ``SECOND`` enum member;" +msgstr "" +"``SECOND = auto(), -2`` 将是可用的 (auto 会被替换为 ``2``,因此将使用 ``2, -2`` 来创建 " +"``SECOND`` 枚举成员;" + +#: ../../library/enum.rst:992 +msgid "" +"``THIRD = [auto(), -3]`` will *not* work (``[, -3]`` is used " +"to create the ``THIRD`` enum member)" +msgstr "" + +#: ../../library/enum.rst:997 +msgid "" +"In prior versions, ``auto()`` had to be the only thing on the assignment " +"line to work properly." +msgstr "在之前的版本中,``auto()`` 必须为赋值行中唯一的内容才是可用的。" + +#: ../../library/enum.rst:1000 +msgid "" +"``_generate_next_value_`` can be overridden to customize the values used by " +"*auto*." +msgstr "``_generate_next_value_`` 可以被重写以便自定义 *auto* 所使用的值。" + +#: ../../library/enum.rst:1003 +msgid "" +"In version 3.13 the default ``_generate_next_value_`` will always return the" +" highest member value incremented by 1, and will fail if any member is an " +"incompatible type." +msgstr "" + +#: ../../library/enum.rst:1009 +msgid "" +"A decorator similar to the built-in *property*, but specifically for " +"enumerations. It allows member attributes to have the same names as members" +" themselves." +msgstr "一个类似于内置 *property* 的装饰器,但是专用于枚举。它允许成员属性具有与成员自身相同的名称。" + +#: ../../library/enum.rst:1013 +msgid "" +"The *property* and the member must be defined in separate classes; for " +"example, the *value* and *name* attributes are defined in the *Enum* class, " +"and *Enum* subclasses can define members with the names ``value`` and " +"``name``." +msgstr "" + +#: ../../library/enum.rst:1022 +msgid "" +"A :keyword:`class` decorator specifically for enumerations. It searches an " +"enumeration's :attr:`~EnumType.__members__`, gathering any aliases it finds;" +" if any are found :exc:`ValueError` is raised with the details::" +msgstr "" +"一个专用于枚举的 :keyword:`class` 装饰器。它将搜索一个枚举的 " +":attr:`~EnumType.__members__`,收集它所找到的任何别名;如果找到了任何别名则会引发 :exc:`ValueError` " +"并附带详情::" + +#: ../../library/enum.rst:1026 +msgid "" +">>> from enum import Enum, unique\n" +">>> @unique\n" +"... class Mistake(Enum):\n" +"... ONE = 1\n" +"... TWO = 2\n" +"... THREE = 3\n" +"... FOUR = 3\n" +"...\n" +"Traceback (most recent call last):\n" +"...\n" +"ValueError: duplicate values found in : FOUR -> THREE" +msgstr "" +">>> from enum import Enum, unique\n" +">>> @unique\n" +"... class Mistake(Enum):\n" +"... ONE = 1\n" +"... TWO = 2\n" +"... THREE = 3\n" +"... FOUR = 3\n" +"...\n" +"Traceback (most recent call last):\n" +"...\n" +"ValueError: duplicate values found in : FOUR -> THREE" + +#: ../../library/enum.rst:1040 +msgid "" +"A :keyword:`class` decorator specifically for enumerations. Members from " +":class:`EnumCheck` are used to specify which constraints should be checked " +"on the decorated enumeration." +msgstr "" +"一个专用于枚举的 :keyword:`class` 装饰器。将使用来自 :class:`EnumCheck` " +"的成员指明应当在被装饰的枚举上检查哪些约束。" + +#: ../../library/enum.rst:1048 +msgid "A decorator for use in enums: its target will become a member." +msgstr "一个在枚举中使用的装饰器:它的目标将成为一个成员。" + +#: ../../library/enum.rst:1054 +msgid "A decorator for use in enums: its target will not become a member." +msgstr "一个在枚举中使用的装饰器:它的目标将不会成为一个成员。" + +#: ../../library/enum.rst:1060 +msgid "" +"A decorator to change the :class:`str() ` and :func:`repr` of an enum " +"to show its members as belonging to the module instead of its class. Should " +"only be used when the enum members are exported to the module global " +"namespace (see :class:`re.RegexFlag` for an example)." +msgstr "" +"一个修改枚举的 :class:`str() ` 和 :func:`repr` 来将其成员显示为属于模块而不是类的装饰器。 " +"应当仅在枚举成员被导出到模块全局命名空间时(请参看 :class:`re.RegexFlag` 获取示例)使用。" + +#: ../../library/enum.rst:1070 +msgid "" +"Return a list of all power-of-two integers contained in a flag *value*." +msgstr "返回旗标 *value* 中包含的所有二的整数次幂的列表。" + +#: ../../library/enum.rst:1091 +msgid "Notes" +msgstr "备注" + +#: ../../library/enum.rst:1093 +msgid ":class:`IntEnum`, :class:`StrEnum`, and :class:`IntFlag`" +msgstr ":class:`IntEnum`, :class:`StrEnum` 和 :class:`IntFlag`" + +#: ../../library/enum.rst:1095 +msgid "" +"These three enum types are designed to be drop-in replacements for existing " +"integer- and string-based values; as such, they have extra limitations:" +msgstr "这三个枚举类型被设计用来快速替代现有的基于整数和字符串的值;为此,它们都有额外的限制:" + +#: ../../library/enum.rst:1098 +msgid "``__str__`` uses the value and not the name of the enum member" +msgstr "``__str__`` 使用枚举成员的值而不是名称" + +#: ../../library/enum.rst:1100 +msgid "" +"``__format__``, because it uses ``__str__``, will also use the value of the " +"enum member instead of its name" +msgstr "``__format__``,因为它使用了 ``__str__``,也将使用枚举成员的值而不是其名称" + +#: ../../library/enum.rst:1103 +msgid "" +"If you do not need/want those limitations, you can either create your own " +"base class by mixing in the ``int`` or ``str`` type yourself::" +msgstr "如果你不需要/希望有这些限制,你可以通过自行混入 ``int`` 或 ``str`` 类型来创建你自己的基类::" + +#: ../../library/enum.rst:1106 +msgid "" +">>> from enum import Enum\n" +">>> class MyIntEnum(int, Enum):\n" +"... pass" +msgstr "" +">>> from enum import Enum\n" +">>> class MyIntEnum(int, Enum):\n" +"... pass" + +#: ../../library/enum.rst:1110 +msgid "or you can reassign the appropriate :meth:`str`, etc., in your enum::" +msgstr "或者你也可以在你的枚举中重新赋值适当的 :meth:`str` 等::" + +#: ../../library/enum.rst:1112 +msgid "" +">>> from enum import Enum, IntEnum\n" +">>> class MyIntEnum(IntEnum):\n" +"... __str__ = Enum.__str__" +msgstr "" +">>> from enum import Enum, IntEnum\n" +">>> class MyIntEnum(IntEnum):\n" +"... __str__ = Enum.__str__" diff --git a/library/errno.po b/library/errno.po new file mode 100644 index 0000000000..16e0bab846 --- /dev/null +++ b/library/errno.po @@ -0,0 +1,721 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/errno.rst:2 +msgid ":mod:`!errno` --- Standard errno system symbols" +msgstr ":mod:`!errno` --- 标准 errno 系统符号" + +#: ../../library/errno.rst:9 +msgid "" +"This module makes available standard ``errno`` system symbols. The value of " +"each symbol is the corresponding integer value. The names and descriptions " +"are borrowed from :file:`linux/include/errno.h`, which should be all-" +"inclusive." +msgstr "" +"该模块提供了标准的 ``errno`` 系统符号。每个符号的值都是相应的整数值。名称和描述借用自 " +":file:`linux/include/errno.h`,它应该是全包含的。" + +#: ../../library/errno.rst:17 +msgid "" +"Dictionary providing a mapping from the errno value to the string name in " +"the underlying system. For instance, ``errno.errorcode[errno.EPERM]`` maps " +"to ``'EPERM'``." +msgstr "" +"提供从 errno 值到底层系统中字符串名称的映射的字典。例如,``errno.errorcode[errno.EPERM]`` 映射为 " +"``'EPERM'`` ." + +#: ../../library/errno.rst:21 +msgid "" +"To translate a numeric error code to an error message, use " +":func:`os.strerror`." +msgstr "如果要将数字的错误代码转换为错误信息,请使用 :func:`os.strerror`。" + +#: ../../library/errno.rst:23 +msgid "" +"Of the following list, symbols that are not used on the current platform are" +" not defined by the module. The specific list of defined symbols is " +"available as ``errno.errorcode.keys()``. Symbols available can include:" +msgstr "" +"在下面的列表中,当前平台上没有使用的符号没有被本模块定义。已定义的符号的具体列表可参见 ``errno.errorcode.keys()``。 " +"可用的符号包括:" + +#: ../../library/errno.rst:30 +msgid "" +"Operation not permitted. This error is mapped to the exception " +":exc:`PermissionError`." +msgstr "操作不允许。这个错误被映射到异常 :exc:`PermissionError`。" + +#: ../../library/errno.rst:36 +msgid "" +"No such file or directory. This error is mapped to the exception " +":exc:`FileNotFoundError`." +msgstr "没有这样的文件或目录。这个错误被映射到异常 :exc:`FileNotFoundError`。" + +#: ../../library/errno.rst:42 +msgid "" +"No such process. This error is mapped to the exception " +":exc:`ProcessLookupError`." +msgstr "没有这样的进程。这个错误被映射到异常 :exc:`ProcessLookupError`。" + +#: ../../library/errno.rst:48 +msgid "" +"Interrupted system call. This error is mapped to the exception " +":exc:`InterruptedError`." +msgstr "系统调用中断。这个错误被映射到异常 :exc:`InterruptedError`。" + +#: ../../library/errno.rst:54 +msgid "I/O error" +msgstr "I/O 错误" + +#: ../../library/errno.rst:59 +msgid "No such device or address" +msgstr "无此设备或地址" + +#: ../../library/errno.rst:64 +msgid "Arg list too long" +msgstr "参数列表过长" + +#: ../../library/errno.rst:69 +msgid "Exec format error" +msgstr "执行格式错误" + +#: ../../library/errno.rst:74 +msgid "Bad file number" +msgstr "错误的文件号" + +#: ../../library/errno.rst:79 +msgid "" +"No child processes. This error is mapped to the exception " +":exc:`ChildProcessError`." +msgstr "没有子进程。这个错误被映射到异常 :exc:`ChildProcessError`。" + +#: ../../library/errno.rst:85 +msgid "" +"Try again. This error is mapped to the exception :exc:`BlockingIOError`." +msgstr "再试一次。这个错误被映射到异常 :exc:`BlockingIOError`。" + +#: ../../library/errno.rst:90 +msgid "Out of memory" +msgstr "内存不足" + +#: ../../library/errno.rst:95 +msgid "" +"Permission denied. This error is mapped to the exception " +":exc:`PermissionError`." +msgstr "权限被拒绝。这个错误被映射到异常 :exc:`PermissionError`。" + +#: ../../library/errno.rst:101 +msgid "Bad address" +msgstr "错误的地址" + +#: ../../library/errno.rst:106 +msgid "Block device required" +msgstr "需要块设备" + +#: ../../library/errno.rst:111 +msgid "Device or resource busy" +msgstr "设备或资源忙" + +#: ../../library/errno.rst:116 +msgid "" +"File exists. This error is mapped to the exception :exc:`FileExistsError`." +msgstr "文件存在。这个错误被映射到异常 :exc:`FileExistsError`。" + +#: ../../library/errno.rst:122 +msgid "Cross-device link" +msgstr "跨设备链接" + +#: ../../library/errno.rst:127 +msgid "No such device" +msgstr "无此设备" + +#: ../../library/errno.rst:132 +msgid "" +"Not a directory. This error is mapped to the exception " +":exc:`NotADirectoryError`." +msgstr "不是一个目录。这个错误被映射到异常 :exc:`NotADirectoryError`。" + +#: ../../library/errno.rst:138 +msgid "" +"Is a directory. This error is mapped to the exception " +":exc:`IsADirectoryError`." +msgstr "是一个目录。这个错误被映射到异常 :exc:`IsADirectoryError`。" + +#: ../../library/errno.rst:144 +msgid "Invalid argument" +msgstr "无效的参数" + +#: ../../library/errno.rst:149 +msgid "File table overflow" +msgstr "文件表溢出" + +#: ../../library/errno.rst:154 +msgid "Too many open files" +msgstr "打开的文件过多" + +#: ../../library/errno.rst:159 +msgid "Not a typewriter" +msgstr "不是打字机" + +#: ../../library/errno.rst:164 +msgid "Text file busy" +msgstr "文本文件忙" + +#: ../../library/errno.rst:169 +msgid "File too large" +msgstr "文件过大" + +#: ../../library/errno.rst:174 +msgid "No space left on device" +msgstr "设备已无可用空间" + +#: ../../library/errno.rst:179 +msgid "Illegal seek" +msgstr "非法查找" + +#: ../../library/errno.rst:184 +msgid "Read-only file system" +msgstr "只读文件系统" + +#: ../../library/errno.rst:189 +msgid "Too many links" +msgstr "链接过多" + +#: ../../library/errno.rst:194 +msgid "" +"Broken pipe. This error is mapped to the exception :exc:`BrokenPipeError`." +msgstr "管道中断。这个错误被映射到异常 :exc:`BrokenPipeError`。" + +#: ../../library/errno.rst:200 +msgid "Math argument out of domain of func" +msgstr "数学参数超出函数范围" + +#: ../../library/errno.rst:205 +msgid "Math result not representable" +msgstr "数学运算结果无法表示" + +#: ../../library/errno.rst:210 +msgid "Resource deadlock would occur" +msgstr "将发生资源死锁" + +#: ../../library/errno.rst:215 +msgid "File name too long" +msgstr "文件名过长" + +#: ../../library/errno.rst:220 +msgid "No record locks available" +msgstr "没有可用的记录锁" + +#: ../../library/errno.rst:225 +msgid "Function not implemented" +msgstr "功能未实现" + +#: ../../library/errno.rst:230 +msgid "Directory not empty" +msgstr "目录非空" + +#: ../../library/errno.rst:235 +msgid "Too many symbolic links encountered" +msgstr "遇到过多的符号链接" + +#: ../../library/errno.rst:240 +msgid "" +"Operation would block. This error is mapped to the exception " +":exc:`BlockingIOError`." +msgstr "操作会阻塞。这个错误被映射到异常 :exc:`BlockingIOError`。" + +#: ../../library/errno.rst:246 +msgid "No message of desired type" +msgstr "没有所需类型的消息" + +#: ../../library/errno.rst:251 +msgid "Identifier removed" +msgstr "标识符被移除" + +#: ../../library/errno.rst:256 +msgid "Channel number out of range" +msgstr "信道编号超出范围" + +#: ../../library/errno.rst:261 +msgid "Level 2 not synchronized" +msgstr "级别 2 未同步" + +#: ../../library/errno.rst:266 +msgid "Level 3 halted" +msgstr "级别 3 已停止" + +#: ../../library/errno.rst:271 +msgid "Level 3 reset" +msgstr "级别 3 重置" + +#: ../../library/errno.rst:276 +msgid "Link number out of range" +msgstr "链接编号超出范围" + +#: ../../library/errno.rst:281 +msgid "Protocol driver not attached" +msgstr "未附加协议驱动" + +#: ../../library/errno.rst:286 +msgid "No CSI structure available" +msgstr "没有可用的 CSI 结构" + +#: ../../library/errno.rst:291 +msgid "Level 2 halted" +msgstr "级别 2 已停止" + +#: ../../library/errno.rst:296 +msgid "Invalid exchange" +msgstr "无效的交换" + +#: ../../library/errno.rst:301 +msgid "Invalid request descriptor" +msgstr "无效的请求描述符" + +#: ../../library/errno.rst:306 +msgid "Exchange full" +msgstr "交换已满" + +#: ../../library/errno.rst:311 +msgid "No anode" +msgstr "没有阳极" + +#: ../../library/errno.rst:316 +msgid "Invalid request code" +msgstr "无效的请求码" + +#: ../../library/errno.rst:321 +msgid "Invalid slot" +msgstr "无效的槽位" + +#: ../../library/errno.rst:326 +msgid "File locking deadlock error" +msgstr "文件锁定死锁错误" + +#: ../../library/errno.rst:331 +msgid "Bad font file format" +msgstr "错误的字体文件格式" + +#: ../../library/errno.rst:336 +msgid "Device not a stream" +msgstr "设备不是流" + +#: ../../library/errno.rst:341 +msgid "No data available" +msgstr "没有可用的数据" + +#: ../../library/errno.rst:346 +msgid "Timer expired" +msgstr "计时器已到期" + +#: ../../library/errno.rst:351 +msgid "Out of streams resources" +msgstr "流资源不足" + +#: ../../library/errno.rst:356 +msgid "Machine is not on the network" +msgstr "机器不在网络上" + +#: ../../library/errno.rst:361 +msgid "Package not installed" +msgstr "包未安装" + +#: ../../library/errno.rst:366 +msgid "Object is remote" +msgstr "对象是远程的" + +#: ../../library/errno.rst:371 +msgid "Link has been severed" +msgstr "链接已被切断" + +#: ../../library/errno.rst:376 +msgid "Advertise error" +msgstr "广告错误" + +#: ../../library/errno.rst:381 +msgid "Srmount error" +msgstr "挂载错误" + +#: ../../library/errno.rst:386 +msgid "Communication error on send" +msgstr "发送时通讯错误" + +#: ../../library/errno.rst:391 +msgid "Protocol error" +msgstr "协议错误" + +#: ../../library/errno.rst:396 +msgid "Multihop attempted" +msgstr "已尝试多跳" + +#: ../../library/errno.rst:401 +msgid "RFS specific error" +msgstr "RFS 专属错误" + +#: ../../library/errno.rst:406 +msgid "Not a data message" +msgstr "非数据消息" + +#: ../../library/errno.rst:411 +msgid "Value too large for defined data type" +msgstr "值相对于已定义数据类型过大" + +#: ../../library/errno.rst:416 +msgid "Name not unique on network" +msgstr "名称在网络上不唯一" + +#: ../../library/errno.rst:421 +msgid "File descriptor in bad state" +msgstr "文件描述符处于错误状态" + +#: ../../library/errno.rst:426 +msgid "Remote address changed" +msgstr "远端地址已改变" + +#: ../../library/errno.rst:431 +msgid "Can not access a needed shared library" +msgstr "无法访问所需的共享库" + +#: ../../library/errno.rst:436 +msgid "Accessing a corrupted shared library" +msgstr "访问已损坏的共享库" + +#: ../../library/errno.rst:441 +msgid ".lib section in a.out corrupted" +msgstr "a.out 中的 .lib 部分已损坏" + +#: ../../library/errno.rst:446 +msgid "Attempting to link in too many shared libraries" +msgstr "尝试链接过多的共享库" + +#: ../../library/errno.rst:451 +msgid "Cannot exec a shared library directly" +msgstr "无法直接执行共享库" + +#: ../../library/errno.rst:456 +msgid "Illegal byte sequence" +msgstr "非法字节序列" + +#: ../../library/errno.rst:461 +msgid "Interrupted system call should be restarted" +msgstr "已中断系统调用需要重启" + +#: ../../library/errno.rst:466 +msgid "Streams pipe error" +msgstr "流管道错误" + +#: ../../library/errno.rst:471 +msgid "Too many users" +msgstr "用户过多" + +#: ../../library/errno.rst:476 +msgid "Socket operation on non-socket" +msgstr "在非套接字上执行套接字操作" + +#: ../../library/errno.rst:481 +msgid "Destination address required" +msgstr "需要目标地址" + +#: ../../library/errno.rst:486 +msgid "Message too long" +msgstr "消息过长" + +#: ../../library/errno.rst:491 +msgid "Protocol wrong type for socket" +msgstr "套接字的协议类型错误" + +#: ../../library/errno.rst:496 +msgid "Protocol not available" +msgstr "协议不可用" + +#: ../../library/errno.rst:501 +msgid "Protocol not supported" +msgstr "协议不受支持" + +#: ../../library/errno.rst:506 +msgid "Socket type not supported" +msgstr "套接字类型不受支持" + +#: ../../library/errno.rst:511 +msgid "Operation not supported on transport endpoint" +msgstr "操作在传输端点上不受支持" + +#: ../../library/errno.rst:516 +msgid "Operation not supported" +msgstr "操作不受支持" + +#: ../../library/errno.rst:523 +msgid "Protocol family not supported" +msgstr "协议族不受支持" + +#: ../../library/errno.rst:528 +msgid "Address family not supported by protocol" +msgstr "地址族不受协议支持" + +#: ../../library/errno.rst:533 +msgid "Address already in use" +msgstr "地址已被使用" + +#: ../../library/errno.rst:538 +msgid "Cannot assign requested address" +msgstr "无法分配要求的地址" + +#: ../../library/errno.rst:543 +msgid "Network is down" +msgstr "网络已断开" + +#: ../../library/errno.rst:548 +msgid "Network is unreachable" +msgstr "网络不可达" + +#: ../../library/errno.rst:553 +msgid "Network dropped connection because of reset" +msgstr "网络因重置而断开连接" + +#: ../../library/errno.rst:558 +msgid "" +"Software caused connection abort. This error is mapped to the exception " +":exc:`ConnectionAbortedError`." +msgstr "软件导致连接中止。这个错误被映射到异常 :exc:`ConnectionAbortedError`。" + +#: ../../library/errno.rst:564 +msgid "" +"Connection reset by peer. This error is mapped to the exception " +":exc:`ConnectionResetError`." +msgstr "连接被对方重置。这个错误被映射到异常 :exc:`ConnectionResetError`。" + +#: ../../library/errno.rst:570 +msgid "No buffer space available" +msgstr "没有可用的缓冲区空间" + +#: ../../library/errno.rst:575 +msgid "Transport endpoint is already connected" +msgstr "传输端点已连接" + +#: ../../library/errno.rst:580 +msgid "Transport endpoint is not connected" +msgstr "传输端点未连接" + +#: ../../library/errno.rst:585 +msgid "" +"Cannot send after transport endpoint shutdown. This error is mapped to the " +"exception :exc:`BrokenPipeError`." +msgstr "在传输端点关闭后无法发送。这个错误被映射到异常 :exc:`BrokenPipeError`。" + +#: ../../library/errno.rst:591 +msgid "Too many references: cannot splice" +msgstr "引用过多:无法拼接" + +#: ../../library/errno.rst:596 +msgid "" +"Connection timed out. This error is mapped to the exception " +":exc:`TimeoutError`." +msgstr "连接超时。这个错误被映射到异常 :exc:`TimeoutError`。" + +#: ../../library/errno.rst:602 +msgid "" +"Connection refused. This error is mapped to the exception " +":exc:`ConnectionRefusedError`." +msgstr "连接被拒绝。这个错误被映射到异常 :exc:`ConnectionRefusedError`。" + +#: ../../library/errno.rst:608 +msgid "Host is down" +msgstr "主机已关闭" + +#: ../../library/errno.rst:613 +msgid "No route to host" +msgstr "没有到主机的路由" + +#: ../../library/errno.rst:618 +msgid "Memory page has hardware error." +msgstr "内存页存在硬件错误。" + +#: ../../library/errno.rst:625 +msgid "" +"Operation already in progress. This error is mapped to the exception " +":exc:`BlockingIOError`." +msgstr "操作已经在进行中。这个错误被映射到异常 :exc:`BlockingIOError`。" + +#: ../../library/errno.rst:631 +msgid "" +"Operation now in progress. This error is mapped to the exception " +":exc:`BlockingIOError`." +msgstr "操作现在正在进行中。这个错误被映射到异常 :exc:`BlockingIOError`。" + +#: ../../library/errno.rst:637 +msgid "Stale NFS file handle" +msgstr "过期的 NFS 文件句柄" + +#: ../../library/errno.rst:642 +msgid "Structure needs cleaning" +msgstr "结构需要清理" + +#: ../../library/errno.rst:647 +msgid "Not a XENIX named type file" +msgstr "不是 XENIX 命名类型文件" + +#: ../../library/errno.rst:652 +msgid "No XENIX semaphores available" +msgstr "没有可用的 XENIX 信号量" + +#: ../../library/errno.rst:657 +msgid "Is a named type file" +msgstr "是命名类型文件" + +#: ../../library/errno.rst:662 +msgid "Remote I/O error" +msgstr "远程 I/O 错误" + +#: ../../library/errno.rst:667 +msgid "Quota exceeded" +msgstr "超出配额" + +#: ../../library/errno.rst:671 +msgid "Interface output queue is full" +msgstr "接口输出队列已满" + +#: ../../library/errno.rst:678 +msgid "No medium found" +msgstr "未找到媒介" + +#: ../../library/errno.rst:683 +msgid "Wrong medium type" +msgstr "错误的媒介类型" + +#: ../../library/errno.rst:688 +msgid "Required key not available" +msgstr "需要的密钥不可用" + +#: ../../library/errno.rst:693 +msgid "Key has expired" +msgstr "密钥已到期" + +#: ../../library/errno.rst:698 +msgid "Key has been revoked" +msgstr "密钥已被撤销" + +#: ../../library/errno.rst:703 +msgid "Key was rejected by service" +msgstr "密钥被服务拒绝" + +#: ../../library/errno.rst:708 +msgid "Operation not possible due to RF-kill" +msgstr "操作因 RF-kill 而无法执行" + +#: ../../library/errno.rst:713 +msgid "Locked lock was unmapped" +msgstr "锁定的锁未被映射" + +#: ../../library/errno.rst:718 +msgid "Facility is not active" +msgstr "功能未被激活" + +#: ../../library/errno.rst:723 +msgid "Authentication error" +msgstr "认证错误" + +#: ../../library/errno.rst:730 +msgid "Bad CPU type in executable" +msgstr "可执行文件中有错误的 CPU 类型" + +#: ../../library/errno.rst:737 +msgid "Bad executable (or shared library)" +msgstr "错误的可执行文件(或共享库)" + +#: ../../library/errno.rst:744 +msgid "Malformed Mach-o file" +msgstr "畸形的 Mach-o 文件" + +#: ../../library/errno.rst:751 +msgid "Device error" +msgstr "设备错误" + +#: ../../library/errno.rst:758 +msgid "Inappropriate file type or format" +msgstr "不正确的文件类型或格式" + +#: ../../library/errno.rst:765 +msgid "Need authenticator" +msgstr "需要认证" + +#: ../../library/errno.rst:772 +msgid "Attribute not found" +msgstr "属性未找到" + +#: ../../library/errno.rst:779 +msgid "Policy not found" +msgstr "策略未找到" + +#: ../../library/errno.rst:786 +msgid "Too many processes" +msgstr "进程过多" + +#: ../../library/errno.rst:793 +msgid "Bad procedure for program" +msgstr "错误的程序步骤" + +#: ../../library/errno.rst:800 +msgid "Program version wrong" +msgstr "程序版本错误" + +#: ../../library/errno.rst:807 +msgid "RPC prog. not avail" +msgstr "RPC 程序不可用" + +#: ../../library/errno.rst:814 +msgid "Device power is off" +msgstr "设备电源关闭" + +#: ../../library/errno.rst:821 +msgid "RPC struct is bad" +msgstr "RPC 结构错误" + +#: ../../library/errno.rst:828 +msgid "RPC version wrong" +msgstr "RPC 版本错误" + +#: ../../library/errno.rst:835 +msgid "Shared library version mismatch" +msgstr "共享库版本不匹配" + +#: ../../library/errno.rst:842 +msgid "" +"Capabilities insufficient. This error is mapped to the exception " +":exc:`PermissionError`." +msgstr "功能不足。此错误被映射到异常 :exc:`PermissionError`。" + +#: ../../library/errno.rst:845 +msgid "Availability" +msgstr "可用性" + +#: ../../library/errno.rst:852 +msgid "Operation canceled" +msgstr "操作已被取消" + +#: ../../library/errno.rst:859 +msgid "Owner died" +msgstr "所有者已不存在" + +#: ../../library/errno.rst:866 +msgid "State not recoverable" +msgstr "状态无法恢复" diff --git a/library/exceptions.po b/library/exceptions.po new file mode 100644 index 0000000000..074aa80a03 --- /dev/null +++ b/library/exceptions.po @@ -0,0 +1,1629 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/exceptions.rst:4 +msgid "Built-in Exceptions" +msgstr "内置异常" + +#: ../../library/exceptions.rst:10 +msgid "" +"In Python, all exceptions must be instances of a class that derives from " +":class:`BaseException`. In a :keyword:`try` statement with an " +":keyword:`except` clause that mentions a particular class, that clause also " +"handles any exception classes derived from that class (but not exception " +"classes from which *it* is derived). Two exception classes that are not " +"related via subclassing are never equivalent, even if they have the same " +"name." +msgstr "" +"在 Python 中,所有异常必须为一个派生自 :class:`BaseException` 的类的实例。在带有提及一个特定类的 " +":keyword:`except` 子句的 :keyword:`try` 语句中,该子句也会处理任何派生自该类的异常类(但不处理 *它* " +"所派生出的异常类)。通过子类化创建的两个不相关异常类永远是不等效的,即使它们具有相同的名称。" + +#: ../../library/exceptions.rst:19 +msgid "" +"The built-in exceptions listed in this chapter can be generated by the " +"interpreter or built-in functions. Except where mentioned, they have an " +"\"associated value\" indicating the detailed cause of the error. This may " +"be a string or a tuple of several items of information (e.g., an error code " +"and a string explaining the code). The associated value is usually passed " +"as arguments to the exception class's constructor." +msgstr "" +"本章中列出的内置异常可由解释器或内置函数来生成。除非另有说明,它们都会具有一个提示导致错误详细原因的“关联值”。 " +"这可以是一个字符串或由多个信息项(例如一个错误码和一个解释该错误码的字符串)组成的元组。关联值通常会作为参数被传给异常类的构造器。" + +#: ../../library/exceptions.rst:26 +msgid "" +"User code can raise built-in exceptions. This can be used to test an " +"exception handler or to report an error condition \"just like\" the " +"situation in which the interpreter raises the same exception; but beware " +"that there is nothing to prevent user code from raising an inappropriate " +"error." +msgstr "" +"用户代码可以引发内置异常。这可被用于测试异常处理程序或报告错误条件,“就像” " +"在解释器引发了相同异常的情况时一样;但是请注意,没有任何机制能防止用户代码引发不适当的错误。" + +#: ../../library/exceptions.rst:31 +msgid "" +"The built-in exception classes can be subclassed to define new exceptions; " +"programmers are encouraged to derive new exceptions from the " +":exc:`Exception` class or one of its subclasses, and not from " +":exc:`BaseException`. More information on defining exceptions is available " +"in the Python Tutorial under :ref:`tut-userexceptions`." +msgstr "" +"内置异常类可以被子类化以定义新的异常;鼓励程序员从 :exc:`Exception` 类或它的某个子类而不是从 :exc:`BaseException`" +" 来派生新的异常。关于定义异常的更多信息可以在 Python 教程的 :ref:`tut-userexceptions` 部分查看。" + +#: ../../library/exceptions.rst:39 +msgid "Exception context" +msgstr "异常上下文" + +#: ../../library/exceptions.rst:46 +msgid "" +"Three attributes on exception objects provide information about the context " +"in which the exception was raised:" +msgstr "异常对象上的三个属性提供了有关引发异常所在上下文的信息:" + +#: ../../library/exceptions.rst:53 +msgid "" +"When raising a new exception while another exception is already being " +"handled, the new exception's :attr:`!__context__` attribute is automatically" +" set to the handled exception. An exception may be handled when an " +":keyword:`except` or :keyword:`finally` clause, or a :keyword:`with` " +"statement, is used." +msgstr "" +"当有其他异常已经被处理的情况下又引发一个新异常的时候,新异常的 :attr:`!__context__` 属性会被自动设为已经被处理的异常。 " +"异常可以在使用了 :keyword:`except` 或 :keyword:`finally` 子句,或者 :keyword:`with` " +"语句的时候被处理。" + +#: ../../library/exceptions.rst:59 +msgid "" +"This implicit exception context can be supplemented with an explicit cause " +"by using :keyword:`!from` with :keyword:`raise`::" +msgstr "这个隐式异常上下文可以通过使用 :keyword:`!from` 配合 :keyword:`raise` 来补充一个显式的原因::" + +#: ../../library/exceptions.rst:63 +msgid "raise new_exc from original_exc" +msgstr "raise new_exc from original_exc" + +#: ../../library/exceptions.rst:65 +msgid "" +"The expression following :keyword:`from` must be an exception or " +"``None``. It will be set as :attr:`!__cause__` on the raised exception. " +"Setting :attr:`!__cause__` also implicitly sets the " +":attr:`!__suppress_context__` attribute to ``True``, so that using ``raise " +"new_exc from None`` effectively replaces the old exception with the new one " +"for display purposes (e.g. converting :exc:`KeyError` to " +":exc:`AttributeError`), while leaving the old exception available in " +":attr:`!__context__` for introspection when debugging." +msgstr "" +"跟在 :keyword:`from` 之后的表达式必须为一个异常或 ``None``。它将在所引发的异常上被设为 " +":attr:`!__cause__`。设置 :attr:`!__cause__` 还会隐式地将 " +":attr:`!__suppress_context__` 属性设为 ``True``,这样使用 ``raise new_exc from None``" +" 可以有效地将旧异常替换为新异常来用于显示目的 (例如将 :exc:`KeyError` 转换为 " +":exc:`AttributeError`),同时让旧异常在 :attr:`!__context__` 中保持可用以便在调试时执行内省。" + +#: ../../library/exceptions.rst:74 +msgid "" +"The default traceback display code shows these chained exceptions in " +"addition to the traceback for the exception itself. An explicitly chained " +"exception in :attr:`!__cause__` is always shown when present. An implicitly " +"chained exception in :attr:`!__context__` is shown only if " +":attr:`!__cause__` is :const:`None` and :attr:`!__suppress_context__` is " +"false." +msgstr "" +"除了异常本身的回溯以外,默认的回溯还会显示这些串连的异常。 :attr:`!__cause__` 中的显式串连异常如果存在将总是显示。 " +":attr:`!__context__` 中的隐式串连异常仅在 :attr:`!__cause__` 为 :const:`None` 且 " +":attr:`!__suppress_context__` 为假值时显示。" + +#: ../../library/exceptions.rst:80 +msgid "" +"In either case, the exception itself is always shown after any chained " +"exceptions so that the final line of the traceback always shows the last " +"exception that was raised." +msgstr "不论在哪种情况下,异常本身总会在任何串连异常之后显示,以便回溯的最后一行总是显示所引发的最后一个异常。" + +#: ../../library/exceptions.rst:86 +msgid "Inheriting from built-in exceptions" +msgstr "从内置异常继承" + +#: ../../library/exceptions.rst:88 +msgid "" +"User code can create subclasses that inherit from an exception type. It's " +"recommended to only subclass one exception type at a time to avoid any " +"possible conflicts between how the bases handle the ``args`` attribute, as " +"well as due to possible memory layout incompatibilities." +msgstr "" +"用户代码可以创建继承自某个异常类型的子类。建议每次仅子类化一个异常类型以避免多个基类处理 ``args`` " +"属性的不同方式,以及内存布局不兼容可能导致的冲突。" + +#: ../../library/exceptions.rst:95 +msgid "" +"Most built-in exceptions are implemented in C for efficiency, see: " +":source:`Objects/exceptions.c`. Some have custom memory layouts which makes" +" it impossible to create a subclass that inherits from multiple exception " +"types. The memory layout of a type is an implementation detail and might " +"change between Python versions, leading to new conflicts in the future. " +"Therefore, it's recommended to avoid subclassing multiple exception types " +"altogether." +msgstr "" +"大多数内置异常都用 C 实现以保证运行效率,参见::source:`Objects/exceptions.c`。 " +"其中一些具有自定义内存布局,这使得创建继承自多个异常类型的子类成为不可能。一个类型的内存布局属于实现细节并可能随着 Python " +"版本升级而改变,导致在未来可能产生新的冲突。因此,建议完全避免子类化多个异常类型。" + +#: ../../library/exceptions.rst:105 +msgid "Base classes" +msgstr "基类" + +#: ../../library/exceptions.rst:107 +msgid "" +"The following exceptions are used mostly as base classes for other " +"exceptions." +msgstr "下列异常主要被用作其他异常的基类。" + +#: ../../library/exceptions.rst:111 +msgid "" +"The base class for all built-in exceptions. It is not meant to be directly " +"inherited by user-defined classes (for that, use :exc:`Exception`). If " +":func:`str` is called on an instance of this class, the representation of " +"the argument(s) to the instance are returned, or the empty string when there" +" were no arguments." +msgstr "" +"所有内置异常的基类。它不应该被用户自定义类直接继承 (这种情况请使用 :exc:`Exception`)。 如果在此类的实例上调用 " +":func:`str`,则会返回实例的参数表示,或者当没有参数时返回空字符串。" + +#: ../../library/exceptions.rst:119 +msgid "" +"The tuple of arguments given to the exception constructor. Some built-in " +"exceptions (like :exc:`OSError`) expect a certain number of arguments and " +"assign a special meaning to the elements of this tuple, while others are " +"usually called only with a single string giving an error message." +msgstr "" +"传给异常构造器的参数元组。某些内置异常 (例如 :exc:`OSError`) " +"接受特定数量的参数并赋予此元组中的元素特殊的含义,而其他异常通常只接受一个给出错误信息的单独字符串。" + +#: ../../library/exceptions.rst:126 +msgid "" +"This method sets *tb* as the new traceback for the exception and returns the" +" exception object. It was more commonly used before the exception chaining " +"features of :pep:`3134` became available. The following example shows how " +"we can convert an instance of ``SomeException`` into an instance of " +"``OtherException`` while preserving the traceback. Once raised, the current" +" frame is pushed onto the traceback of the ``OtherException``, as would have" +" happened to the traceback of the original ``SomeException`` had we allowed " +"it to propagate to the caller. ::" +msgstr "" +"此方法会将 *tb* 设为新的异常回溯信息并返回异常对象。它在 :pep:`3134` 的异常链特性可用之前更为常用。下面的例子演示了我们如何将一个 " +"``SomeException`` 实例转换为 ``OtherException`` 实例而保留回溯信息。异常一旦被引发,当前帧会被推至 " +"``OtherException`` 的回溯栈顶端,就像当我们允许原始 ``SomeException`` " +"被传播给调用方时它的回溯栈将会发生的情形一样。::" + +#: ../../library/exceptions.rst:135 +msgid "" +"try:\n" +" ...\n" +"except SomeException:\n" +" tb = sys.exception().__traceback__\n" +" raise OtherException(...).with_traceback(tb)" +msgstr "" +"try:\n" +" ...\n" +"except SomeException:\n" +" tb = sys.exception().__traceback__\n" +" raise OtherException(...).with_traceback(tb)" + +#: ../../library/exceptions.rst:143 +msgid "" +"A writable field that holds the :ref:`traceback object ` " +"associated with this exception. See also: :ref:`raise`." +msgstr "保存关联到该异常的 :ref:`回溯对象 ` 的可写字段。另请参阅::ref:`raise`。" + +#: ../../library/exceptions.rst:149 +msgid "" +"Add the string ``note`` to the exception's notes which appear in the " +"standard traceback after the exception string. A :exc:`TypeError` is raised " +"if ``note`` is not a string." +msgstr "" +"将字符串 ``note`` 添加到在异常字符串之后的标准回溯中显示的注释中。如果 ``note`` 不是一个字符串则会引发 " +":exc:`TypeError`." + +#: ../../library/exceptions.rst:157 +msgid "" +"A list of the notes of this exception, which were added with " +":meth:`add_note`. This attribute is created when :meth:`add_note` is called." +msgstr "由此异常的注释组成的列表,它是通过 :meth:`add_note` 添加的。该属性是在调用 :meth:`add_note` 时创建的。" + +#: ../../library/exceptions.rst:165 +msgid "" +"All built-in, non-system-exiting exceptions are derived from this class. " +"All user-defined exceptions should also be derived from this class." +msgstr "所有内置的非系统退出类异常都派生自此类。所有用户自定义异常也应当派生自此类。" + +#: ../../library/exceptions.rst:171 +msgid "" +"The base class for those built-in exceptions that are raised for various " +"arithmetic errors: :exc:`OverflowError`, :exc:`ZeroDivisionError`, " +":exc:`FloatingPointError`." +msgstr "" +"此基类用于派生针对各种算术类错误而引发的内置异常::exc:`OverflowError`, :exc:`ZeroDivisionError`, " +":exc:`FloatingPointError`." + +#: ../../library/exceptions.rst:178 +msgid "" +"Raised when a :ref:`buffer ` related operation cannot be " +"performed." +msgstr "当与 :ref:`缓冲区 ` 相关的操作无法执行时将被引发。" + +#: ../../library/exceptions.rst:184 +msgid "" +"The base class for the exceptions that are raised when a key or index used " +"on a mapping or sequence is invalid: :exc:`IndexError`, :exc:`KeyError`. " +"This can be raised directly by :func:`codecs.lookup`." +msgstr "" +"此基类用于派生当映射或序列所使用的键或索引无效时引发的异常::exc:`IndexError`, :exc:`KeyError`。这可以通过 " +":func:`codecs.lookup` 来直接引发。" + +#: ../../library/exceptions.rst:190 +msgid "Concrete exceptions" +msgstr "具体异常" + +#: ../../library/exceptions.rst:192 +msgid "The following exceptions are the exceptions that are usually raised." +msgstr "以下异常属于经常被引发的异常。" + +#: ../../library/exceptions.rst:198 +msgid "Raised when an :keyword:`assert` statement fails." +msgstr "当 :keyword:`assert` 语句失败时将被引发。" + +#: ../../library/exceptions.rst:203 +msgid "" +"Raised when an attribute reference (see :ref:`attribute-references`) or " +"assignment fails. (When an object does not support attribute references or " +"attribute assignments at all, :exc:`TypeError` is raised.)" +msgstr "" +"当属性引用 (参见 :ref:`attribute-references`) 或赋值失败时将被引发。 (当一个对象根本不支持属性引用或属性赋值时则将引发" +" :exc:`TypeError`.)" + +#: ../../library/exceptions.rst:207 +msgid "" +"The optional *name* and *obj* keyword-only arguments set the corresponding " +"attributes:" +msgstr "可选的 *name* 和 *obj* 仅限关键字参数设置相应的属性:" + +#: ../../library/exceptions.rst:212 +msgid "The name of the attribute that was attempted to be accessed." +msgstr "尝试访问的属性的名称。" + +#: ../../library/exceptions.rst:216 +msgid "The object that was accessed for the named attribute." +msgstr "针对指定属性被访问的对象。" + +#: ../../library/exceptions.rst:218 +msgid "Added the :attr:`name` and :attr:`obj` attributes." +msgstr "增加了 :attr:`name` 和 :attr:`obj` 属性。" + +#: ../../library/exceptions.rst:223 +msgid "" +"Raised when the :func:`input` function hits an end-of-file condition (EOF) " +"without reading any data. (Note: the :meth:`io.TextIOBase.read` and " +":meth:`io.IOBase.readline` methods return an empty string when they hit " +"EOF.)" +msgstr "" +"当 :func:`input` 函数未读取任何数据即达到文件结束条件(EOF)时被引发。 (注意: :meth:`io.TextIOBase.read`" +" 和 :meth:`io.IOBase.readline` 方法在遇到 EOF 时将返回一个空字符串。)" + +#: ../../library/exceptions.rst:230 +msgid "Not currently used." +msgstr "目前未被使用。" + +#: ../../library/exceptions.rst:235 +msgid "" +"Raised when a :term:`generator` or :term:`coroutine` is closed; see " +":meth:`generator.close` and :meth:`coroutine.close`. It directly inherits " +"from :exc:`BaseException` instead of :exc:`Exception` since it is " +"technically not an error." +msgstr "" +"当一个 :term:`generator` 或 :term:`coroutine` 被关闭时将被引发;参见 " +":meth:`generator.close` 和 :meth:`coroutine.close`。它直接继承自 " +":exc:`BaseException` 而不是 :exc:`Exception`,因为从技术上来说它并不是一个错误。" + +#: ../../library/exceptions.rst:243 +msgid "" +"Raised when the :keyword:`import` statement has troubles trying to load a " +"module. Also raised when the \"from list\" in ``from ... import`` has a " +"name that cannot be found." +msgstr "" +"当 :keyword:`import` 语句尝试加载模块遇到麻烦时将被引发。并且当 ``from ... import`` 中的 \"from " +"list\" 存在无法找到的名称时也会被引发。" + +#: ../../library/exceptions.rst:247 +msgid "" +"The optional *name* and *path* keyword-only arguments set the corresponding " +"attributes:" +msgstr "可选的 *name* 和 *path* 仅限关键字参数设置相应的属性:" + +#: ../../library/exceptions.rst:252 +msgid "The name of the module that was attempted to be imported." +msgstr "尝试导入的模块的名称。" + +#: ../../library/exceptions.rst:256 +msgid "The path to any file which triggered the exception." +msgstr "指向任何触发异常的文件的路径。" + +#: ../../library/exceptions.rst:258 +msgid "Added the :attr:`name` and :attr:`path` attributes." +msgstr "添加了 :attr:`name` 与 :attr:`path` 属性。" + +#: ../../library/exceptions.rst:263 +msgid "" +"A subclass of :exc:`ImportError` which is raised by :keyword:`import` when a" +" module could not be located. It is also raised when ``None`` is found in " +":data:`sys.modules`." +msgstr "" +":exc:`ImportError` 的子类,当一个模块无法被定位时将由 :keyword:`import` 引发。当在 " +":data:`sys.modules` 中找到 ``None`` 时也会被引发。" + +#: ../../library/exceptions.rst:271 +msgid "" +"A subclass of :exc:`ImportError` which is raised when a lazy import fails " +"because it (directly or indirectly) tries to import itself." +msgstr "" + +#: ../../library/exceptions.rst:278 +msgid "" +"Raised when a sequence subscript is out of range. (Slice indices are " +"silently truncated to fall in the allowed range; if an index is not an " +"integer, :exc:`TypeError` is raised.)" +msgstr "当序列抽取超出范围时将被引发。 (切片索引会被静默截短到允许的范围;如果指定索引不是整数则 :exc:`TypeError` 会被引发。)" + +#: ../../library/exceptions.rst:287 +msgid "" +"Raised when a mapping (dictionary) key is not found in the set of existing " +"keys." +msgstr "当在现有键集合中找不到指定的映射(字典)键时将被引发。" + +#: ../../library/exceptions.rst:294 +msgid "" +"Raised when the user hits the interrupt key (normally :kbd:`Control-C` or " +":kbd:`Delete`). During execution, a check for interrupts is made regularly." +" The exception inherits from :exc:`BaseException` so as to not be " +"accidentally caught by code that catches :exc:`Exception` and thus prevent " +"the interpreter from exiting." +msgstr "" +"当用户按下中断键 (通常为 :kbd:`Control-C` 或 :kbd:`Delete`) 时将被引发。在执行期间,会定期检测中断信号。 " +"该异常继承自 :exc:`BaseException` 以确保不会被处理 :exc:`Exception` 的代码意外捕获,这样可以避免退出解释器。" + +#: ../../library/exceptions.rst:302 +msgid "" +"Catching a :exc:`KeyboardInterrupt` requires special consideration. Because " +"it can be raised at unpredictable points, it may, in some circumstances, " +"leave the running program in an inconsistent state. It is generally best to " +"allow :exc:`KeyboardInterrupt` to end the program as quickly as possible or " +"avoid raising it entirely. (See :ref:`handlers-and-exceptions`.)" +msgstr "" +"捕获 :exc:`KeyboardInterrupt` 需要特别考虑。 " +"因为它可能会在不可预知的点位被引发,在某些情况下,它可能使运行中的程序陷入不一致的状态。通常最好是让 :exc:`KeyboardInterrupt` " +"尽快结束程序或者完全避免引发它。(参见 :ref:`handlers-and-exceptions`。)" + +#: ../../library/exceptions.rst:312 +msgid "" +"Raised when an operation runs out of memory but the situation may still be " +"rescued (by deleting some objects). The associated value is a string " +"indicating what kind of (internal) operation ran out of memory. Note that " +"because of the underlying memory management architecture (C's " +":c:func:`malloc` function), the interpreter may not always be able to " +"completely recover from this situation; it nevertheless raises an exception " +"so that a stack traceback can be printed, in case a run-away program was the" +" cause." +msgstr "" +"当一个操作耗尽内存但情况仍可(通过删除一些对象)进行挽救时将被引发。关联的值是一个字符串,指明是哪种(内部)操作耗尽了内存。 " +"请注意由于底层的内存管理架构(C 的 :c:func:`malloc` " +"函数),解释器也许并不总是能够从这种情况下完全恢复;但它毕竟可以引发一个异常,这样就能打印出栈回溯信息,以便找出导致问题的失控程序。" + +#: ../../library/exceptions.rst:323 +msgid "" +"Raised when a local or global name is not found. This applies only to " +"unqualified names. The associated value is an error message that includes " +"the name that could not be found." +msgstr "当某个局部或全局名称未找到时将被引发。此异常仅用于非限定名称。关联的值是一条错误信息,其中包含未找到的名称。" + +#: ../../library/exceptions.rst:327 +msgid "The optional *name* keyword-only argument sets the attribute:" +msgstr "可选的 *name* 仅限关键字参数设置该属性:" + +#: ../../library/exceptions.rst:331 +msgid "The name of the variable that was attempted to be accessed." +msgstr "尝试访问的变量的名称。" + +#: ../../library/exceptions.rst:333 +msgid "Added the :attr:`name` attribute." +msgstr "增加了 :attr:`name` 属性。" + +#: ../../library/exceptions.rst:339 +msgid "" +"This exception is derived from :exc:`RuntimeError`. In user defined base " +"classes, abstract methods should raise this exception when they require " +"derived classes to override the method, or while the class is being " +"developed to indicate that the real implementation still needs to be added." +msgstr "" +"此异常派生自 :exc:`RuntimeError`。 " +"在用户自定义的基类中,抽象方法应当在其要求所派生类重写该方法,或是在其要求所开发的类提示具体实现尚待添加时引发此异常。" + +#: ../../library/exceptions.rst:346 +msgid "" +"It should not be used to indicate that an operator or method is not meant to" +" be supported at all -- in that case either leave the operator / method " +"undefined or, if a subclass, set it to :data:`None`." +msgstr "" +"它不应当用来表示一个运算符或方法根本不能被支持 -- 在此情况下应当让特定运算符 / 方法保持未定义,或者在子类中将其设为 :data:`None`。" + +#: ../../library/exceptions.rst:352 +msgid "" +":exc:`!NotImplementedError` and :data:`!NotImplemented` are not " +"interchangeable. This exception should only be used as described above; see " +":data:`NotImplemented` for details on correct usage of the built-in " +"constant." +msgstr "" +":exc:`!NotImplementedError` 和 :data:`!NotImplemented` 不能互相替代。 " +"此异常应当仅以上文所描述的方式使用;请参阅 :data:`NotImplemented` 了解正确使用该内置常量的相关细节。" + +#: ../../library/exceptions.rst:363 +msgid "" +"This exception is raised when a system function returns a system-related " +"error, including I/O failures such as \"file not found\" or \"disk full\" " +"(not for illegal argument types or other incidental errors)." +msgstr "" +"此异常在一个系统函数返回系统相关的错误时将被引发,此类错误包括 I/O 操作失败例如 “文件未找到” 或 “磁盘已满” " +"等(不包括非法参数类型或其他偶然性错误)。" + +#: ../../library/exceptions.rst:367 +msgid "" +"The second form of the constructor sets the corresponding attributes, " +"described below. The attributes default to :const:`None` if not specified." +" For backwards compatibility, if three arguments are passed, the " +":attr:`~BaseException.args` attribute contains only a 2-tuple of the first " +"two constructor arguments." +msgstr "" +"构造器的第二种形式可设置如下所述的相应属性。如果未指定这些属性则默认为 :const:`None`。为了能向下兼容,如果传入了三个参数,则 " +":attr:`~BaseException.args` 属性将仅包含由前两个构造器参数组成的 2 元组。" + +#: ../../library/exceptions.rst:373 +msgid "" +"The constructor often actually returns a subclass of :exc:`OSError`, as " +"described in `OS exceptions`_ below. The particular subclass depends on the" +" final :attr:`.errno` value. This behaviour only occurs when constructing " +":exc:`OSError` directly or via an alias, and is not inherited when " +"subclassing." +msgstr "" +"构造器实际返回的往往是 :exc:`OSError` 的某个子类,如下文 `OS exceptions`_ 中所描述的。具体的子类取决于最终的 " +":attr:`.errno` 值。此行为仅在直接或通过别名来构造 :exc:`OSError` 时发生,并且在子类化时不会被继承。" + +#: ../../library/exceptions.rst:381 +msgid "A numeric error code from the C variable :c:data:`errno`." +msgstr "来自于 C 变量 :c:data:`errno` 的数字错误码。" + +#: ../../library/exceptions.rst:385 +msgid "" +"Under Windows, this gives you the native Windows error code. The " +":attr:`.errno` attribute is then an approximate translation, in POSIX terms," +" of that native error code." +msgstr "" +"在 Windows 下,此参数将给出原生的 Windows 错误码。而 :attr:`.errno` 属性将是该原生错误码在 POSIX " +"平台下的近似转换形式。" + +#: ../../library/exceptions.rst:389 +msgid "" +"Under Windows, if the *winerror* constructor argument is an integer, the " +":attr:`.errno` attribute is determined from the Windows error code, and the " +"*errno* argument is ignored. On other platforms, the *winerror* argument is" +" ignored, and the :attr:`winerror` attribute does not exist." +msgstr "" +"在 Windows 下,如果 *winerror* 构造器参数是一个整数,则 :attr:`.errno` 属性会根据 Windows 错误码来确定,而" +" *errno* 参数会被忽略。在其他平台上,*winerror* 参数会被忽略,并且 :attr:`winerror` 属性将不存在。" + +#: ../../library/exceptions.rst:397 +msgid "" +"The corresponding error message, as provided by the operating system. It is" +" formatted by the C functions :c:func:`!perror` under POSIX, and " +":c:func:`!FormatMessage` under Windows." +msgstr "" +"由操作系统提供的相应错误消息。它在 POSIX 平台上由 C 函数 :c:func:`!perror` 进行格式化,而在 Windows 下则是由 " +":c:func:`!FormatMessage` 进行。" + +#: ../../library/exceptions.rst:405 +msgid "" +"For exceptions that involve a file system path (such as :func:`open` or " +":func:`os.unlink`), :attr:`filename` is the file name passed to the " +"function. For functions that involve two file system paths (such as " +":func:`os.rename`), :attr:`filename2` corresponds to the second file name " +"passed to the function." +msgstr "" +"对于与文件系统路径有关 (例如 :func:`open` 或 :func:`os.unlink`) 的异常,:attr:`filename` " +"是传给函数的文件名。对于涉及两个文件系统路径的函数 (例如 :func:`os.rename`),:attr:`filename2` " +"将是传给函数的第二个文件名。" + +#: ../../library/exceptions.rst:412 +msgid "" +":exc:`EnvironmentError`, :exc:`IOError`, :exc:`WindowsError`, " +":exc:`socket.error`, :exc:`select.error` and :exc:`!mmap.error` have been " +"merged into :exc:`OSError`, and the constructor may return a subclass." +msgstr "" +":exc:`EnvironmentError`, :exc:`IOError`, :exc:`WindowsError`, " +":exc:`socket.error`, :exc:`select.error` 和 :exc:`!mmap.error` 已合并到 " +":exc:`OSError`,而构造器可能返回一个子类。" + +#: ../../library/exceptions.rst:418 +msgid "" +"The :attr:`filename` attribute is now the original file name passed to the " +"function, instead of the name encoded to or decoded from the " +":term:`filesystem encoding and error handler`. Also, the *filename2* " +"constructor argument and attribute was added." +msgstr "" +":attr:`filename` 属性现在是传给函数的原始文件名,而不是基于 :term:`filesystem encoding and error " +"handler` 进行编码或解码之后的名称。此外,还添加了 *filename2* 构造器参数和属性。" + +#: ../../library/exceptions.rst:427 +msgid "" +"Raised when the result of an arithmetic operation is too large to be " +"represented. This cannot occur for integers (which would rather raise " +":exc:`MemoryError` than give up). However, for historical reasons, " +"OverflowError is sometimes raised for integers that are outside a required " +"range. Because of the lack of standardization of floating-point exception " +"handling in C, most floating-point operations are not checked." +msgstr "" +"当算术运算的结果大到无法表示时将被引发。这对整数来说不可能发生(宁可引发 :exc:`MemoryError` 也不会放弃尝试)。 " +"但是出于历史原因,有时也会在整数超出要求范围的情况下引发 OverflowError。因为在 C " +"中缺少对浮点异常处理的标准化,大多数浮点运算都不会做检查。" + +#: ../../library/exceptions.rst:437 +msgid "" +"This exception is derived from :exc:`RuntimeError`. It is raised when an " +"operation is blocked during interpreter shutdown also known as :term:`Python" +" finalization `." +msgstr "" +"该异常派生自 :exc:`RuntimeError`。它会在解释器关闭或称 :term:`Python 终结化 ` 期间当有操作被阻止时被引发。" + +#: ../../library/exceptions.rst:441 +msgid "" +"Examples of operations which can be blocked with a " +":exc:`PythonFinalizationError` during the Python finalization:" +msgstr "在 Python 终结化期间操作被阻止并引发 :exc:`PythonFinalizationError` 的例子:" + +#: ../../library/exceptions.rst:444 +msgid "Creating a new Python thread." +msgstr "新建一个 Python 线程。" + +#: ../../library/exceptions.rst:445 +msgid ":meth:`Joining ` a running daemon thread." +msgstr ":meth:`并入 ` 一个正在运行的守护线程。" + +#: ../../library/exceptions.rst:446 +msgid ":func:`os.fork`," +msgstr "" + +#: ../../library/exceptions.rst:447 +msgid "" +"acquiring a lock such as :class:`threading.Lock`, when it is known that the " +"operation would otherwise deadlock." +msgstr "" + +#: ../../library/exceptions.rst:450 +msgid "See also the :func:`sys.is_finalizing` function." +msgstr "另请参阅 :func:`sys.is_finalizing` 函数。" + +#: ../../library/exceptions.rst:452 ../../library/exceptions.rst:470 +msgid "Previously, a plain :exc:`RuntimeError` was raised." +msgstr "在此之前将只引发 :exc:`RuntimeError`。" + +#: ../../library/exceptions.rst:457 +msgid ":meth:`threading.Thread.join` can now raise this exception." +msgstr "现在 :meth:`threading.Thread.join` 可以引发该异常。" + +#: ../../library/exceptions.rst:461 +msgid "" +"This exception may be raised when acquiring :meth:`threading.Lock` or " +":meth:`threading.RLock`." +msgstr "" + +#: ../../library/exceptions.rst:466 +msgid "" +"This exception is derived from :exc:`RuntimeError`. It is raised when the " +"interpreter detects that the maximum recursion depth (see " +":func:`sys.getrecursionlimit`) is exceeded." +msgstr "" +"此异常派生自 :exc:`RuntimeError`。它会在解释器检测发现超过最大递归深度 (参见 " +":func:`sys.getrecursionlimit`) 时被引发。" + +#: ../../library/exceptions.rst:476 +msgid "" +"This exception is raised when a weak reference proxy, created by the " +":func:`weakref.proxy` function, is used to access an attribute of the " +"referent after it has been garbage collected. For more information on weak " +"references, see the :mod:`weakref` module." +msgstr "" +"此异常将在使用 :func:`weakref.proxy` 函数所创建的弱引用代理来访问已被垃圾回收的引用目标的属性时被引发。 " +"有关弱引用的更多信息请参阅 :mod:`weakref` 模块。" + +#: ../../library/exceptions.rst:484 +msgid "" +"Raised when an error is detected that doesn't fall in any of the other " +"categories. The associated value is a string indicating what precisely went" +" wrong." +msgstr "当检测到一个不归属于任何其他类别的错误时将被引发。关联的值是一个指明究竟发生了什么问题的字符串。" + +#: ../../library/exceptions.rst:491 +msgid "" +"Raised by built-in function :func:`next` and an :term:`iterator`\\'s " +":meth:`~iterator.__next__` method to signal that there are no further items " +"produced by the iterator." +msgstr "" +"由内置函数 :func:`next` 和 :term:`iterator` 的 :meth:`~iterator.__next__` " +"方法所引发,用来表示该迭代器不能产生下一项。" + +#: ../../library/exceptions.rst:497 +msgid "" +"The exception object has a single attribute :attr:`!value`, which is given " +"as an argument when constructing the exception, and defaults to " +":const:`None`." +msgstr "该异常对象只有一个属性 :attr:`!value`,它在构造该异常时作为参数给出,默认值为 :const:`None`。" + +#: ../../library/exceptions.rst:501 +msgid "" +"When a :term:`generator` or :term:`coroutine` function returns, a new " +":exc:`StopIteration` instance is raised, and the value returned by the " +"function is used as the :attr:`value` parameter to the constructor of the " +"exception." +msgstr "" +"当一个 :term:`generator` 或 :term:`coroutine` 函数返回时,将引发一个新的 :exc:`StopIteration`" +" 实例,函数返回的值将被用作异常构造器的 :attr:`value` 形参。" + +#: ../../library/exceptions.rst:506 +msgid "" +"If a generator code directly or indirectly raises :exc:`StopIteration`, it " +"is converted into a :exc:`RuntimeError` (retaining the :exc:`StopIteration` " +"as the new exception's cause)." +msgstr "" +"如果某个生成器代码直接或间接地引发了 :exc:`StopIteration`,它会被转换为 :exc:`RuntimeError` (并将 " +":exc:`StopIteration` 保留为导致新异常的原因)。" + +#: ../../library/exceptions.rst:510 +msgid "" +"Added ``value`` attribute and the ability for generator functions to use it " +"to return a value." +msgstr "添加了 ``value`` 属性及其被生成器函数用作返回值的功能。" + +#: ../../library/exceptions.rst:514 +msgid "" +"Introduced the RuntimeError transformation via ``from __future__ import " +"generator_stop``, see :pep:`479`." +msgstr "" +"引入了通过 ``from __future__ import generator_stop`` 来实现 RuntimeError 转换,参见 " +":pep:`479`." + +#: ../../library/exceptions.rst:518 +msgid "" +"Enable :pep:`479` for all code by default: a :exc:`StopIteration` error " +"raised in a generator is transformed into a :exc:`RuntimeError`." +msgstr "" +"默认对所有代码启用 :pep:`479`: 在生成器中引发的 :exc:`StopIteration` 错误将被转换为 " +":exc:`RuntimeError`." + +#: ../../library/exceptions.rst:524 +msgid "" +"Must be raised by :meth:`~object.__anext__` method of an :term:`asynchronous" +" iterator` object to stop the iteration." +msgstr "" +"必须由一个 :term:`asynchronous iterator` 对象的 :meth:`~object.__anext__` " +"方法来引发以停止迭代操作。" + +#: ../../library/exceptions.rst:531 +msgid "" +"Raised when the parser encounters a syntax error. This may occur in an " +":keyword:`import` statement, in a call to the built-in functions " +":func:`compile`, :func:`exec`, or :func:`eval`, or when reading the initial " +"script or standard input (also interactively)." +msgstr "" +"当解析器遇到语法错误时引发。这可以发生在 :keyword:`import` 语句,对内置函数 :func:`compile`, " +":func:`exec` 或 :func:`eval` 的调用,或是读取原始脚本或标准输入(也包括交互模式)的时候。" + +#: ../../library/exceptions.rst:537 +msgid "" +"The :func:`str` of the exception instance returns only the error message. " +"Details is a tuple whose members are also available as separate attributes." +msgstr "异常实例的 :func:`str` 只返回错误消息。错误详情为一个元组,其成员也可在单独的属性中分别获取。" + +#: ../../library/exceptions.rst:542 +msgid "The name of the file the syntax error occurred in." +msgstr "发生语法错误所在文件的名称。" + +#: ../../library/exceptions.rst:546 +msgid "" +"Which line number in the file the error occurred in. This is 1-indexed: the " +"first line in the file has a ``lineno`` of 1." +msgstr "发生错误所在文件中的行号。行号索引从 1 开始:文件中首行的 ``lineno`` 为 1。" + +#: ../../library/exceptions.rst:551 +msgid "" +"The column in the line where the error occurred. This is 1-indexed: the " +"first character in the line has an ``offset`` of 1." +msgstr "发生错误所在文件中的列号。列号索引从 1 开始:行中首个字符的 ``offset`` 为 1。" + +#: ../../library/exceptions.rst:556 +msgid "The source code text involved in the error." +msgstr "错误所涉及的源代码文本。" + +#: ../../library/exceptions.rst:560 +msgid "" +"Which line number in the file the error occurred ends in. This is 1-indexed:" +" the first line in the file has a ``lineno`` of 1." +msgstr "发生的错误在文件中的末尾行号。这个索引是从 1 开始的:文件中首行的 ``lineno`` 为 1。" + +#: ../../library/exceptions.rst:565 +msgid "" +"The column in the end line where the error occurred finishes. This is " +"1-indexed: the first character in the line has an ``offset`` of 1." +msgstr "发生的错误在文件中的末尾列号。这个索引是从 1 开始:行中首个字符的 ``offset`` 为 1。" + +#: ../../library/exceptions.rst:568 +msgid "" +"For errors in f-string fields, the message is prefixed by \"f-string: \" and" +" the offsets are offsets in a text constructed from the replacement " +"expression. For example, compiling f'Bad {a b} field' results in this args " +"attribute: ('f-string: ...', ('', 1, 2, '(a b)\\n', 1, 5))." +msgstr "" +" 前缀并且其位置是基于替换表达式构建的文本中的位置。例如,编译 f'Bad {a b} field' 将产生这样的 args " +"属性:('f-string: ...', ('', 1, 2, '(a b)\\n', 1, 5))。" + +#: ../../library/exceptions.rst:573 +msgid "Added the :attr:`end_lineno` and :attr:`end_offset` attributes." +msgstr "增加了 :attr:`end_lineno` 和 :attr:`end_offset` 属性。" + +#: ../../library/exceptions.rst:578 +msgid "" +"Base class for syntax errors related to incorrect indentation. This is a " +"subclass of :exc:`SyntaxError`." +msgstr "与不正确的缩进相关的语法错误的基类。这是 :exc:`SyntaxError` 的一个子类。" + +#: ../../library/exceptions.rst:584 +msgid "" +"Raised when indentation contains an inconsistent use of tabs and spaces. " +"This is a subclass of :exc:`IndentationError`." +msgstr "当缩进包含对制表符和空格符不一致的使用时将被引发。这是 :exc:`IndentationError` 的一个子类。" + +#: ../../library/exceptions.rst:590 +msgid "" +"Raised when the interpreter finds an internal error, but the situation does " +"not look so serious to cause it to abandon all hope. The associated value is" +" a string indicating what went wrong (in low-level terms). In " +":term:`CPython`, this could be raised by incorrectly using Python's C API, " +"such as returning a ``NULL`` value without an exception set." +msgstr "" +"当解释器发现内部错误,但情况看起来尚未严重到要放弃所有希望时将被引发。关联的值是一个指明发生了什么问题的字符串(使用低层级的表示形式)。在 " +":term:`CPython` 中,这可能会因不正确地使用 Python 的 C API 而引发,例如返回 ``NULL`` 值而不设置一个异常。" + +#: ../../library/exceptions.rst:596 +msgid "" +"If you're confident that this exception wasn't your fault, or the fault of a" +" package you're using, you should report this to the author or maintainer of" +" your Python interpreter. Be sure to report the version of the Python " +"interpreter (``sys.version``; it is also printed at the start of an " +"interactive Python session), the exact error message (the exception's " +"associated value) and if possible the source of the program that triggered " +"the error." +msgstr "" +"如果你确信此异常不是你的问题,或你所使用的软件包的问题,你应当将此问题报告给你所用 Python 解释器的作者或维护者。请确保报告 Python " +"解释器的版本 (``sys.version``;它也会在交互式 Python 会话开始时被打印出来),具体的错误消息 (异常所关联的值) " +"以及可能触发该错误的程序的源代码。" + +#: ../../library/exceptions.rst:607 +msgid "" +"This exception is raised by the :func:`sys.exit` function. It inherits from" +" :exc:`BaseException` instead of :exc:`Exception` so that it is not " +"accidentally caught by code that catches :exc:`Exception`. This allows the " +"exception to properly propagate up and cause the interpreter to exit. When " +"it is not handled, the Python interpreter exits; no stack traceback is " +"printed. The constructor accepts the same optional argument passed to " +":func:`sys.exit`. If the value is an integer, it specifies the system exit " +"status (passed to C's :c:func:`!exit` function); if it is ``None``, the exit" +" status is zero; if it has another type (such as a string), the object's " +"value is printed and the exit status is one." +msgstr "" +"此异常由 :func:`sys.exit` 函数引发。它继承自 :exc:`BaseException` 而不是 :exc:`Exception` " +"这样它就不会被捕获 :exc:`Exception` 的代码所意外捕获。这允许此异常正确地向上传播并导致解释器退出。当它未被处理时,Python " +"解释器将会退出;不会有栈回溯信息被打印。构造器接受与传给 :func:`sys.exit` 的相同的参数。 " +"如果参数值是一个整数,它表示系统退出状态(将被传给 C 的 :c:func:`!exit` 函数);如果是 " +"``None``,则退出状态值为零;如果它具有其他类型(如字符串),对象的值将被打印而退出状态值为一。" + +#: ../../library/exceptions.rst:618 +msgid "" +"A call to :func:`sys.exit` is translated into an exception so that clean-up " +"handlers (:keyword:`finally` clauses of :keyword:`try` statements) can be " +"executed, and so that a debugger can execute a script without running the " +"risk of losing control. The :func:`os._exit` function can be used if it is " +"absolutely positively necessary to exit immediately (for example, in the " +"child process after a call to :func:`os.fork`)." +msgstr "" +"对 :func:`sys.exit` 的调用会被转换为一个异常以便能执行清理处理程序 (:keyword:`try` 语句的 " +":keyword:`finally` 子句),并且使得调试器可以执行一段脚本而不必冒失去控制的风险。如果绝对确实地需要立即退出(例如在调用 " +":func:`os.fork` 之后的子进程中)则可使用 :func:`os._exit`。" + +#: ../../library/exceptions.rst:627 +msgid "" +"The exit status or error message that is passed to the constructor. " +"(Defaults to ``None``.)" +msgstr "传给构造器的退出状态码或错误信息(默认为 ``None``。)" + +#: ../../library/exceptions.rst:633 +msgid "" +"Raised when an operation or function is applied to an object of " +"inappropriate type. The associated value is a string giving details about " +"the type mismatch." +msgstr "当一个操作或函数被应用于类型不适当的对象时将被引发。关联的值是一个字符串,给出有关类型不匹配的详情。" + +#: ../../library/exceptions.rst:636 +msgid "" +"This exception may be raised by user code to indicate that an attempted " +"operation on an object is not supported, and is not meant to be. If an " +"object is meant to support a given operation but has not yet provided an " +"implementation, :exc:`NotImplementedError` is the proper exception to raise." +msgstr "" +"此异常可以由用户代码引发,以表明尝试对某个对象进行的操作不受支持也不应当受支持。 " +"如果某个对象应当支持给定的操作但尚未提供相应的实现,所要引发的适当异常应为 :exc:`NotImplementedError`。" + +#: ../../library/exceptions.rst:641 +msgid "" +"Passing arguments of the wrong type (e.g. passing a :class:`list` when an " +":class:`int` is expected) should result in a :exc:`TypeError`, but passing " +"arguments with the wrong value (e.g. a number outside expected boundaries) " +"should result in a :exc:`ValueError`." +msgstr "" +"传入参数的类型错误 (例如在要求 :class:`int` 时却传入了 :class:`list`) 应当导致 " +":exc:`TypeError`,但传入参数的值错误 (例如传入要求范围之外的数值) 则应当导致 :exc:`ValueError`。" + +#: ../../library/exceptions.rst:648 +msgid "" +"Raised when a reference is made to a local variable in a function or method," +" but no value has been bound to that variable. This is a subclass of " +":exc:`NameError`." +msgstr "当在函数或方法中对某个局部变量进行引用,但该变量并未绑定任何值时将被引发。此异常是 :exc:`NameError` 的一个子类。" + +#: ../../library/exceptions.rst:655 +msgid "" +"Raised when a Unicode-related encoding or decoding error occurs. It is a " +"subclass of :exc:`ValueError`." +msgstr "当发生与 Unicode 相关的编码或解码错误时将被引发。此异常是 :exc:`ValueError` 的一个子类。" + +#: ../../library/exceptions.rst:658 +msgid "" +":exc:`UnicodeError` has attributes that describe the encoding or decoding " +"error. For example, ``err.object[err.start:err.end]`` gives the particular " +"invalid input that the codec failed on." +msgstr "" +":exc:`UnicodeError` 具有一些描述编码或解码错误的属性。例如 ``err.object[err.start:err.end]`` " +"会给出导致编解码器失败的特定无效输入。" + +#: ../../library/exceptions.rst:664 +msgid "The name of the encoding that raised the error." +msgstr "引发错误的编码名称。" + +#: ../../library/exceptions.rst:668 +msgid "A string describing the specific codec error." +msgstr "描述特定编解码器错误的字符串。" + +#: ../../library/exceptions.rst:672 +msgid "The object the codec was attempting to encode or decode." +msgstr "编解码器试图要编码或解码的对象。" + +#: ../../library/exceptions.rst:676 +msgid "The first index of invalid data in :attr:`object`." +msgstr ":attr:`object` 中无效数据的开始位置索引。" + +#: ../../library/exceptions.rst:678 ../../library/exceptions.rst:685 +msgid "" +"This value should not be negative as it is interpreted as an absolute offset" +" but this constraint is not enforced at runtime." +msgstr "该值将被解读为绝对偏移量,所以它不应为负数,但是该项约束不会在运行时强制执行。" + +#: ../../library/exceptions.rst:683 +msgid "The index after the last invalid data in :attr:`object`." +msgstr ":attr:`object` 中无效数据的末尾位置索引(不含)。" + +#: ../../library/exceptions.rst:691 +msgid "" +"Raised when a Unicode-related error occurs during encoding. It is a " +"subclass of :exc:`UnicodeError`." +msgstr "当在编码过程中发生与 Unicode 相关的错误时将被引发。此异常是 :exc:`UnicodeError` 的一个子类。" + +#: ../../library/exceptions.rst:697 +msgid "" +"Raised when a Unicode-related error occurs during decoding. It is a " +"subclass of :exc:`UnicodeError`." +msgstr "当在解码过程中发生与 Unicode 相关的错误时将被引发。此异常是 :exc:`UnicodeError` 的一个子类。" + +#: ../../library/exceptions.rst:703 +msgid "" +"Raised when a Unicode-related error occurs during translating. It is a " +"subclass of :exc:`UnicodeError`." +msgstr "在转写过程中发生与 Unicode 相关的错误时将被引发。此异常是 :exc:`UnicodeError` 的一个子类。" + +#: ../../library/exceptions.rst:709 +msgid "" +"Raised when an operation or function receives an argument that has the right" +" type but an inappropriate value, and the situation is not described by a " +"more precise exception such as :exc:`IndexError`." +msgstr "当操作或函数接收到具有正确类型但值不适合的参数,并且情况不能用更精确的异常例如 :exc:`IndexError` 来描述时将被引发。" + +#: ../../library/exceptions.rst:716 +msgid "" +"Raised when the second argument of a division or modulo operation is zero. " +"The associated value is a string indicating the type of the operands and the" +" operation." +msgstr "当除法或取余运算的第二个参数为零时将被引发。关联的值是一个字符串,指明操作数和运算的类型。" + +#: ../../library/exceptions.rst:721 +msgid "" +"The following exceptions are kept for compatibility with previous versions; " +"starting from Python 3.3, they are aliases of :exc:`OSError`." +msgstr "下列异常被保留以与之前的版本相兼容;从 Python 3.3 开始,它们都是 :exc:`OSError` 的别名。" + +#: ../../library/exceptions.rst:730 +msgid "Only available on Windows." +msgstr "仅在 Windows 中可用。" + +#: ../../library/exceptions.rst:734 +msgid "OS exceptions" +msgstr "OS 异常" + +#: ../../library/exceptions.rst:736 +msgid "" +"The following exceptions are subclasses of :exc:`OSError`, they get raised " +"depending on the system error code." +msgstr "下列异常均为 :exc:`OSError` 的子类,它们将根据系统错误代码被引发。" + +#: ../../library/exceptions.rst:741 +msgid "" +"Raised when an operation would block on an object (e.g. socket) set for non-" +"blocking operation. Corresponds to :c:data:`errno` " +":py:const:`~errno.EAGAIN`, :py:const:`~errno.EALREADY`, " +":py:const:`~errno.EWOULDBLOCK` and :py:const:`~errno.EINPROGRESS`." +msgstr "" +"当一个操作将在设置为非阻塞操作的对象(例如套接字)上发生阻塞时将被引发。对应于 :c:data:`errno` " +":py:const:`~errno.EAGAIN`, :py:const:`~errno.EALREADY`, " +":py:const:`~errno.EWOULDBLOCK` 和 :py:const:`~errno.EINPROGRESS`。" + +#: ../../library/exceptions.rst:746 +msgid "" +"In addition to those of :exc:`OSError`, :exc:`BlockingIOError` can have one " +"more attribute:" +msgstr "除了 :exc:`OSError` 已有的属性,:exc:`BlockingIOError` 还有一个额外属性:" + +#: ../../library/exceptions.rst:751 +msgid "" +"An integer containing the number of **bytes** written to the stream before " +"it blocked. This attribute is available when using the buffered I/O classes " +"from the :mod:`io` module." +msgstr "表示在被阻塞之前已写入到流的 **字节** 数量的整数。此属性在使用来自 :mod:`io` 模块的带缓冲类时可被访问。" + +#: ../../library/exceptions.rst:757 +msgid "" +"Raised when an operation on a child process failed. Corresponds to " +":c:data:`errno` :py:const:`~errno.ECHILD`." +msgstr "当一个子进程上的操作失败时将被引发。对应于 :c:data:`errno` :py:const:`~errno.ECHILD`。" + +#: ../../library/exceptions.rst:762 +msgid "A base class for connection-related issues." +msgstr "与连接相关问题的基类。" + +#: ../../library/exceptions.rst:764 +msgid "" +"Subclasses are :exc:`BrokenPipeError`, :exc:`ConnectionAbortedError`, " +":exc:`ConnectionRefusedError` and :exc:`ConnectionResetError`." +msgstr "" +"其子类有 :exc:`BrokenPipeError`, :exc:`ConnectionAbortedError`, " +":exc:`ConnectionRefusedError` 和 :exc:`ConnectionResetError`。" + +#: ../../library/exceptions.rst:769 +msgid "" +"A subclass of :exc:`ConnectionError`, raised when trying to write on a pipe " +"while the other end has been closed, or trying to write on a socket which " +"has been shutdown for writing. Corresponds to :c:data:`errno` " +":py:const:`~errno.EPIPE` and :py:const:`~errno.ESHUTDOWN`." +msgstr "" +":exc:`ConnectionError` 的子类,当试图写入一个管道而其另一端已关闭,或者试图写入一个套接字而其已关闭写入时将被引发。对应于 " +":c:data:`errno` :py:const:`~errno.EPIPE` 和 :py:const:`~errno.ESHUTDOWN`。" + +#: ../../library/exceptions.rst:776 +msgid "" +"A subclass of :exc:`ConnectionError`, raised when a connection attempt is " +"aborted by the peer. Corresponds to :c:data:`errno` " +":py:const:`~errno.ECONNABORTED`." +msgstr "" +":exc:`ConnectionError` 的子类,当一个连接尝试被对端中止时将被引发。对应于 :c:data:`errno` " +":py:const:`~errno.ECONNABORTED`." + +#: ../../library/exceptions.rst:782 +msgid "" +"A subclass of :exc:`ConnectionError`, raised when a connection attempt is " +"refused by the peer. Corresponds to :c:data:`errno` " +":py:const:`~errno.ECONNREFUSED`." +msgstr "" +":exc:`ConnectionError` 的子类,当一个连接尝试被对端拒绝时将被引发。对应于 :c:data:`errno` " +":py:const:`~errno.ECONNREFUSED`." + +#: ../../library/exceptions.rst:788 +msgid "" +"A subclass of :exc:`ConnectionError`, raised when a connection is reset by " +"the peer. Corresponds to :c:data:`errno` :py:const:`~errno.ECONNRESET`." +msgstr "" +":exc:`ConnectionError` 的子类,当一个连接尝试被对端重置时将被引发。对应于 :c:data:`errno` " +":py:const:`~errno.ECONNRESET`." + +#: ../../library/exceptions.rst:794 +msgid "" +"Raised when trying to create a file or directory which already exists. " +"Corresponds to :c:data:`errno` :py:const:`~errno.EEXIST`." +msgstr "当试图创建一个已存在的文件或目录时将被引发。对应于 :c:data:`errno` :py:const:`~errno.EEXIST`。" + +#: ../../library/exceptions.rst:799 +msgid "" +"Raised when a file or directory is requested but doesn't exist. Corresponds " +"to :c:data:`errno` :py:const:`~errno.ENOENT`." +msgstr "当所请求的文件或目录不存在时将被引发。对应于 :c:data:`errno` :py:const:`~errno.ENOENT`。" + +#: ../../library/exceptions.rst:804 +msgid "" +"Raised when a system call is interrupted by an incoming signal. Corresponds " +"to :c:data:`errno` :py:const:`~errno.EINTR`." +msgstr "当一个系统调用被传入的信号中断时将被引发。对应于 :c:data:`errno` :py:const:`~errno.EINTR`。" + +#: ../../library/exceptions.rst:807 +msgid "" +"Python now retries system calls when a syscall is interrupted by a signal, " +"except if the signal handler raises an exception (see :pep:`475` for the " +"rationale), instead of raising :exc:`InterruptedError`." +msgstr "" +"当系统调用被某个信号中断时,Python 现在会重试系统调用,除非该信号的处理程序引发了其它异常 (原理参见 :pep:`475`) 而不是引发 " +":exc:`InterruptedError`." + +#: ../../library/exceptions.rst:814 +msgid "" +"Raised when a file operation (such as :func:`os.remove`) is requested on a " +"directory. Corresponds to :c:data:`errno` :py:const:`~errno.EISDIR`." +msgstr "" +"当请求对一个目录执行文件操作 (如 :func:`os.remove`) 时将被引发。对应于 :c:data:`errno` " +":py:const:`~errno.EISDIR`。" + +#: ../../library/exceptions.rst:820 +msgid "" +"Raised when a directory operation (such as :func:`os.listdir`) is requested " +"on something which is not a directory. On most POSIX platforms, it may also" +" be raised if an operation attempts to open or traverse a non-directory file" +" as if it were a directory. Corresponds to :c:data:`errno` " +":py:const:`~errno.ENOTDIR`." +msgstr "" +"当请求对一个非目录执行目录操作 (如 :func:`os.listdir`) 时将被引发。在大多数 POSIX " +"平台上,它还可能在某个操作试图将一个非目录作为目录打开或遍历时被引发。对应于 :c:data:`errno` " +":py:const:`~errno.ENOTDIR`。" + +#: ../../library/exceptions.rst:828 +msgid "" +"Raised when trying to run an operation without the adequate access rights - " +"for example filesystem permissions. Corresponds to :c:data:`errno` " +":py:const:`~errno.EACCES`, :py:const:`~errno.EPERM`, and " +":py:const:`~errno.ENOTCAPABLE`." +msgstr "" +"当在没有足够访问权限的情况下试图运行某个操作时将被引发 —— 例如文件系统权限。对应于 :c:data:`errno` " +":py:const:`~errno.EACCES`, :py:const:`~errno.EPERM` 和 " +":py:const:`~errno.ENOTCAPABLE`." + +#: ../../library/exceptions.rst:833 +msgid "" +"WASI's :py:const:`~errno.ENOTCAPABLE` is now mapped to " +":exc:`PermissionError`." +msgstr "WASI 的 :py:const:`~errno.ENOTCAPABLE` 现在被映射至 :exc:`PermissionError`。" + +#: ../../library/exceptions.rst:839 +msgid "" +"Raised when a given process doesn't exist. Corresponds to :c:data:`errno` " +":py:const:`~errno.ESRCH`." +msgstr "当给定的进程不存在时将被引发。对应于 :c:data:`errno` :py:const:`~errno.ESRCH`。" + +#: ../../library/exceptions.rst:844 +msgid "" +"Raised when a system function timed out at the system level. Corresponds to " +":c:data:`errno` :py:const:`~errno.ETIMEDOUT`." +msgstr "" +"当一个系统函数在系统层级发生超时的情况下将被引发。对应于 :c:data:`errno` :py:const:`~errno.ETIMEDOUT`。" + +#: ../../library/exceptions.rst:847 +msgid "All the above :exc:`OSError` subclasses were added." +msgstr "添加了以上所有 :exc:`OSError` 的子类。" + +#: ../../library/exceptions.rst:853 +msgid ":pep:`3151` - Reworking the OS and IO exception hierarchy" +msgstr ":pep:`3151` - 重写 OS 和 IO 异常的层次结构" + +#: ../../library/exceptions.rst:859 +msgid "Warnings" +msgstr "警告" + +#: ../../library/exceptions.rst:861 +msgid "" +"The following exceptions are used as warning categories; see the " +":ref:`warning-categories` documentation for more details." +msgstr "下列异常被用作警告类别;请参阅 :ref:`warning-categories` 文档了解详情。" + +#: ../../library/exceptions.rst:866 +msgid "Base class for warning categories." +msgstr "警告类别的基类。" + +#: ../../library/exceptions.rst:871 +msgid "Base class for warnings generated by user code." +msgstr "用户代码所产生警告的基类。" + +#: ../../library/exceptions.rst:876 +msgid "" +"Base class for warnings about deprecated features when those warnings are " +"intended for other Python developers." +msgstr "如果所发出的警告是针对其他 Python 开发者的,则以此作为与已弃用特性相关警告的基类。" + +#: ../../library/exceptions.rst:879 +msgid "" +"Ignored by the default warning filters, except in the ``__main__`` module " +"(:pep:`565`). Enabling the :ref:`Python Development Mode ` shows " +"this warning." +msgstr "" +"会被默认警告过滤器忽略,在 ``__main__`` 模块中的情况除外 (:pep:`565`)。启用 :ref:`Python 开发模式 " +"` 时会显示此警告。" + +#: ../../library/exceptions.rst:883 ../../library/exceptions.rst:899 +msgid "The deprecation policy is described in :pep:`387`." +msgstr "这个弃用政策是在 :pep:`387` 中描述的。" + +#: ../../library/exceptions.rst:888 +msgid "" +"Base class for warnings about features which are obsolete and expected to be" +" deprecated in the future, but are not deprecated at the moment." +msgstr "对于已过时并预计在未来弃用,但目前尚未弃用的特性相关警告的基类。" + +#: ../../library/exceptions.rst:892 +msgid "" +"This class is rarely used as emitting a warning about a possible upcoming " +"deprecation is unusual, and :exc:`DeprecationWarning` is preferred for " +"already active deprecations." +msgstr "" +"这个类很少被使用,因为针对未来可能的弃用发出警告的做法并不常见,而针对当前已有的弃用则推荐使用 :exc:`DeprecationWarning`。" + +#: ../../library/exceptions.rst:896 ../../library/exceptions.rst:925 +#: ../../library/exceptions.rst:952 +msgid "" +"Ignored by the default warning filters. Enabling the :ref:`Python " +"Development Mode ` shows this warning." +msgstr "会被默认警告过滤器忽略。启用 :ref:`Python 开发模式 ` 时会显示此警告。" + +#: ../../library/exceptions.rst:904 +msgid "Base class for warnings about dubious syntax." +msgstr "与模糊的语法相关的警告的基类。" + +#: ../../library/exceptions.rst:906 +msgid "" +"This warning is typically emitted when compiling Python source code, and " +"usually won't be reported when running already compiled code." +msgstr "该警告通常会在编译 Python 源代码时发出,而在运行已编译的代码时通常不会报告。" + +#: ../../library/exceptions.rst:912 +msgid "Base class for warnings about dubious runtime behavior." +msgstr "与模糊的运行时行为相关的警告的基类。" + +#: ../../library/exceptions.rst:917 +msgid "" +"Base class for warnings about deprecated features when those warnings are " +"intended for end users of applications that are written in Python." +msgstr "如果所发出的警告是针对以 Python 所编写应用的最终用户的,则以此作为与已弃用特性相关警告的基类。" + +#: ../../library/exceptions.rst:923 +msgid "Base class for warnings about probable mistakes in module imports." +msgstr "与在模块导入中可能的错误相关的警告的基类。" + +#: ../../library/exceptions.rst:931 +msgid "Base class for warnings related to Unicode." +msgstr "与 Unicode 相关的警告的基类。" + +#: ../../library/exceptions.rst:936 +msgid "Base class for warnings related to encodings." +msgstr "与编码格式相关的警告的基类。" + +#: ../../library/exceptions.rst:938 +msgid "See :ref:`io-encoding-warning` for details." +msgstr "请参阅 :ref:`io-encoding-warning` 来了解详情。" + +#: ../../library/exceptions.rst:945 +msgid "" +"Base class for warnings related to :class:`bytes` and :class:`bytearray`." +msgstr "与 :class:`bytes` 和 :class:`bytearray` 相关的警告的基类。" + +#: ../../library/exceptions.rst:950 +msgid "Base class for warnings related to resource usage." +msgstr "资源使用相关警告的基类。" + +#: ../../library/exceptions.rst:961 +msgid "Exception groups" +msgstr "异常组" + +#: ../../library/exceptions.rst:963 +msgid "" +"The following are used when it is necessary to raise multiple unrelated " +"exceptions. They are part of the exception hierarchy so they can be handled " +"with :keyword:`except` like all other exceptions. In addition, they are " +"recognised by :keyword:`except*`, which matches their subgroups" +" based on the types of the contained exceptions." +msgstr "" +"下列异常是在有必要引发多个不相关联的异常时使用的。它们是异常层级结构的一部分因此它们可以像所有其他异常一样通过 :keyword:`except` " +"来处理。此外,它们还可被 :keyword:`except*` 所识别,此语法将基于所包含异常的类型来匹配其子分组。" + +#: ../../library/exceptions.rst:972 +msgid "" +"Both of these exception types wrap the exceptions in the sequence ``excs``. " +"The ``msg`` parameter must be a string. The difference between the two " +"classes is that :exc:`BaseExceptionGroup` extends :exc:`BaseException` and " +"it can wrap any exception, while :exc:`ExceptionGroup` extends " +":exc:`Exception` and it can only wrap subclasses of :exc:`Exception`. This " +"design is so that ``except Exception`` catches an :exc:`ExceptionGroup` but " +"not :exc:`BaseExceptionGroup`." +msgstr "" +"这两个异常类型都将多个异常包装在序列 ``excs`` 中。``msg`` 形参必须为一个字符串。这两个类之间的区别在于 " +":exc:`BaseExceptionGroup` 扩展了 :exc:`BaseException` 并且它可以包装任何异常,而 " +":exc:`ExceptionGroup` 则扩展了 :exc:`Exception` 并且它只能包装 :exc:`Exception` 的子类。 " +"这样的设计是为了使得 ``except Exception`` 只捕获 :exc:`ExceptionGroup` 而不捕获 " +":exc:`BaseExceptionGroup`." + +#: ../../library/exceptions.rst:980 +msgid "" +"The :exc:`BaseExceptionGroup` constructor returns an :exc:`ExceptionGroup` " +"rather than a :exc:`BaseExceptionGroup` if all contained exceptions are " +":exc:`Exception` instances, so it can be used to make the selection " +"automatic. The :exc:`ExceptionGroup` constructor, on the other hand, raises " +"a :exc:`TypeError` if any contained exception is not an :exc:`Exception` " +"subclass." +msgstr "" +":exc:`BaseExceptionGroup` 构造器返回一个 :exc:`ExceptionGroup` 而不是 " +":exc:`BaseExceptionGroup`,如果所包含的全部异常都是 :exc:`Exception` " +"的实例的话,因此它可以被用来使该选择过程自动化。另一方面,:exc:`ExceptionGroup` 构造器则会引发 " +":exc:`TypeError`,如果所包含的任何异常不是 :exc:`Exception` 的子类的话。" + +#: ../../library/exceptions.rst:989 +msgid "" +"The ``excs`` parameter may be any sequence, but lists and tuples are " +"specifically processed more efficiently here. For optimal performance, pass " +"a tuple as ``excs``." +msgstr "``excs`` 形参可以为任意序列,但列表和元组在此会得到更高效的处理。 为了优化性能,请传入元组作为 ``excs``。" + +#: ../../library/exceptions.rst:995 +msgid "" +"The ``msg`` argument to the constructor. This is a read-only attribute." +msgstr "传给构造器的 ``msg`` 参数。这是一个只读属性。" + +#: ../../library/exceptions.rst:999 +msgid "" +"A tuple of the exceptions in the ``excs`` sequence given to the constructor." +" This is a read-only attribute." +msgstr "传给构造器的 ``excs`` 序列中的由异常组成的元组。这是一个只读属性。" + +#: ../../library/exceptions.rst:1004 +msgid "" +"Returns an exception group that contains only the exceptions from the " +"current group that match *condition*, or ``None`` if the result is empty." +msgstr "返回一个只包含来自当前组的匹配 *condition* 的异常的异常组,或者如果结果为空则返回 ``None``。" + +#: ../../library/exceptions.rst:1007 +msgid "" +"The condition can be an exception type or tuple of exception types, in which" +" case each exception is checked for a match using the same check that is " +"used in an ``except`` clause. The condition can also be a callable (other " +"than a type object) that accepts an exception as its single argument and " +"returns true for the exceptions that should be in the subgroup." +msgstr "" +"该条件可以是一个异常类型或由异常类型组成的元组,在后一种情况中将对每个异常使用在 ``except`` 子句中所使用的相同检测方式来检测是否匹配。 " +"该条件也可以是一个可调用对象(而非类型对象),它接受一个异常作为其唯一参数并会针对应当属于特定子分组的异常返回真值。" + +#: ../../library/exceptions.rst:1013 +msgid "" +"The nesting structure of the current exception is preserved in the result, " +"as are the values of its :attr:`message`, " +":attr:`~BaseException.__traceback__`, :attr:`~BaseException.__cause__`, " +":attr:`~BaseException.__context__` and :attr:`~BaseException.__notes__` " +"fields. Empty nested groups are omitted from the result." +msgstr "" +"当前异常的嵌套结构会在结果中保留,就如其 :attr:`message`, :attr:`~BaseException.__traceback__`, " +":attr:`~BaseException.__cause__`, :attr:`~BaseException.__context__` 和 " +":attr:`~BaseException.__notes__` 字段的值一样。空的嵌套组会在结果中被略去。" + +#: ../../library/exceptions.rst:1020 +msgid "" +"The condition is checked for all exceptions in the nested exception group, " +"including the top-level and any nested exception groups. If the condition is" +" true for such an exception group, it is included in the result in full." +msgstr "条件检测会针对嵌套异常组中的所有异常执行,包括最高层级的和任何嵌套的异常组。如果针对此类异常组的条件为真值,它将被完整包括在结果中。" + +#: ../../library/exceptions.rst:1024 +msgid "``condition`` can be any callable which is not a type object." +msgstr "``condition`` 可以是任意不为类型对象的可调用对象。" + +#: ../../library/exceptions.rst:1029 +msgid "" +"Like :meth:`subgroup`, but returns the pair ``(match, rest)`` where " +"``match`` is ``subgroup(condition)`` and ``rest`` is the remaining non-" +"matching part." +msgstr "" +"类似于 :meth:`subgroup`,但将返回 ``(match, rest)`` 对,其中 ``match`` 为 " +"``subgroup(condition)`` 而 ``rest`` 为剩余的非匹配部分。" + +#: ../../library/exceptions.rst:1035 +msgid "" +"Returns an exception group with the same :attr:`message`, but which wraps " +"the exceptions in ``excs``." +msgstr "返回一个具有相同 :attr:`message` 的异常组,但会将异常包装在 ``excs`` 中。" + +#: ../../library/exceptions.rst:1038 +msgid "" +"This method is used by :meth:`subgroup` and :meth:`split`, which are used in" +" various contexts to break up an exception group. A subclass needs to " +"override it in order to make :meth:`subgroup` and :meth:`split` return " +"instances of the subclass rather than :exc:`ExceptionGroup`." +msgstr "" +"此方法是由 :meth:`subgroup` 和 :meth:`split` 使用的,它们被用于在各种上下文中拆分异常组。子类需要重写它以便让 " +":meth:`subgroup` 和 :meth:`split` 返回子类的实例而不是 :exc:`ExceptionGroup`。" + +#: ../../library/exceptions.rst:1044 +msgid "" +":meth:`subgroup` and :meth:`split` copy the " +":attr:`~BaseException.__traceback__`, :attr:`~BaseException.__cause__`, " +":attr:`~BaseException.__context__` and :attr:`~BaseException.__notes__` " +"fields from the original exception group to the one returned by " +":meth:`derive`, so these fields do not need to be updated by :meth:`derive`." +msgstr "" +":meth:`subgroup` 和 :meth:`split` 会从原始异常组拷贝 " +":attr:`~BaseException.__traceback__`, :attr:`~BaseException.__cause__`, " +":attr:`~BaseException.__context__` 和 :attr:`~BaseException.__notes__` 字段到 " +":meth:`derive` 所返回的异常组,这样这些字段就不需要被 :meth:`derive` 更新。" + +#: ../../library/exceptions.rst:1051 +msgid "" +">>> class MyGroup(ExceptionGroup):\n" +"... def derive(self, excs):\n" +"... return MyGroup(self.message, excs)\n" +"...\n" +">>> e = MyGroup(\"eg\", [ValueError(1), TypeError(2)])\n" +">>> e.add_note(\"a note\")\n" +">>> e.__context__ = Exception(\"context\")\n" +">>> e.__cause__ = Exception(\"cause\")\n" +">>> try:\n" +"... raise e\n" +"... except Exception as e:\n" +"... exc = e\n" +"...\n" +">>> match, rest = exc.split(ValueError)\n" +">>> exc, exc.__context__, exc.__cause__, exc.__notes__\n" +"(MyGroup('eg', [ValueError(1), TypeError(2)]), Exception('context'), Exception('cause'), ['a note'])\n" +">>> match, match.__context__, match.__cause__, match.__notes__\n" +"(MyGroup('eg', [ValueError(1)]), Exception('context'), Exception('cause'), ['a note'])\n" +">>> rest, rest.__context__, rest.__cause__, rest.__notes__\n" +"(MyGroup('eg', [TypeError(2)]), Exception('context'), Exception('cause'), ['a note'])\n" +">>> exc.__traceback__ is match.__traceback__ is rest.__traceback__\n" +"True" +msgstr "" +">>> class MyGroup(ExceptionGroup):\n" +"... def derive(self, excs):\n" +"... return MyGroup(self.message, excs)\n" +"...\n" +">>> e = MyGroup(\"eg\", [ValueError(1), TypeError(2)])\n" +">>> e.add_note(\"a note\")\n" +">>> e.__context__ = Exception(\"context\")\n" +">>> e.__cause__ = Exception(\"cause\")\n" +">>> try:\n" +"... raise e\n" +"... except Exception as e:\n" +"... exc = e\n" +"...\n" +">>> match, rest = exc.split(ValueError)\n" +">>> exc, exc.__context__, exc.__cause__, exc.__notes__\n" +"(MyGroup('eg', [ValueError(1), TypeError(2)]), Exception('context'), Exception('cause'), ['a note'])\n" +">>> match, match.__context__, match.__cause__, match.__notes__\n" +"(MyGroup('eg', [ValueError(1)]), Exception('context'), Exception('cause'), ['a note'])\n" +">>> rest, rest.__context__, rest.__cause__, rest.__notes__\n" +"(MyGroup('eg', [TypeError(2)]), Exception('context'), Exception('cause'), ['a note'])\n" +">>> exc.__traceback__ is match.__traceback__ is rest.__traceback__\n" +"True" + +#: ../../library/exceptions.rst:1077 +msgid "" +"Note that :exc:`BaseExceptionGroup` defines :meth:`~object.__new__`, so " +"subclasses that need a different constructor signature need to override that" +" rather than :meth:`~object.__init__`. For example, the following defines an" +" exception group subclass which accepts an exit_code and constructs the " +"group's message from it. ::" +msgstr "" +"请注意 :exc:`BaseExceptionGroup` 定义了 " +":meth:`~object.__new__`,因此需要不同构造器签名的子类必须重写该方法而不是 :meth:`~object.__init__`。 " +"例如,下面定义了一个接受 exit_code 并根据它来构造分组消息的异常组子类。 ::" + +#: ../../library/exceptions.rst:1083 +msgid "" +"class Errors(ExceptionGroup):\n" +" def __new__(cls, errors, exit_code):\n" +" self = super().__new__(Errors, f\"exit code: {exit_code}\", errors)\n" +" self.exit_code = exit_code\n" +" return self\n" +"\n" +" def derive(self, excs):\n" +" return Errors(excs, self.exit_code)" +msgstr "" +"class Errors(ExceptionGroup):\n" +" def __new__(cls, errors, exit_code):\n" +" self = super().__new__(Errors, f\"exit code: {exit_code}\", errors)\n" +" self.exit_code = exit_code\n" +" return self\n" +"\n" +" def derive(self, excs):\n" +" return Errors(excs, self.exit_code)" + +#: ../../library/exceptions.rst:1092 +msgid "" +"Like :exc:`ExceptionGroup`, any subclass of :exc:`BaseExceptionGroup` which " +"is also a subclass of :exc:`Exception` can only wrap instances of " +":exc:`Exception`." +msgstr "" +"类似于 :exc:`ExceptionGroup`,任何同时也是 :exc:`Exception` 子类的 " +":exc:`BaseExceptionGroup` 子类只能包装 :exc:`Exception` 的实例。" + +#: ../../library/exceptions.rst:1100 +msgid "Exception hierarchy" +msgstr "异常层次结构" + +#: ../../library/exceptions.rst:1102 +msgid "The class hierarchy for built-in exceptions is:" +msgstr "内置异常的类层级结构如下:" + +#: ../../library/exceptions.rst:1104 +msgid "" +"BaseException\n" +" ├── BaseExceptionGroup\n" +" ├── GeneratorExit\n" +" ├── KeyboardInterrupt\n" +" ├── SystemExit\n" +" └── Exception\n" +" ├── ArithmeticError\n" +" │ ├── FloatingPointError\n" +" │ ├── OverflowError\n" +" │ └── ZeroDivisionError\n" +" ├── AssertionError\n" +" ├── AttributeError\n" +" ├── BufferError\n" +" ├── EOFError\n" +" ├── ExceptionGroup [BaseExceptionGroup]\n" +" ├── ImportError\n" +" │ └── ImportCycleError\n" +" │ └── ModuleNotFoundError\n" +" ├── LookupError\n" +" │ ├── IndexError\n" +" │ └── KeyError\n" +" ├── MemoryError\n" +" ├── NameError\n" +" │ └── UnboundLocalError\n" +" ├── OSError\n" +" │ ├── BlockingIOError\n" +" │ ├── ChildProcessError\n" +" │ ├── ConnectionError\n" +" │ │ ├── BrokenPipeError\n" +" │ │ ├── ConnectionAbortedError\n" +" │ │ ├── ConnectionRefusedError\n" +" │ │ └── ConnectionResetError\n" +" │ ├── FileExistsError\n" +" │ ├── FileNotFoundError\n" +" │ ├── InterruptedError\n" +" │ ├── IsADirectoryError\n" +" │ ├── NotADirectoryError\n" +" │ ├── PermissionError\n" +" │ ├── ProcessLookupError\n" +" │ └── TimeoutError\n" +" ├── ReferenceError\n" +" ├── RuntimeError\n" +" │ ├── NotImplementedError\n" +" │ ├── PythonFinalizationError\n" +" │ └── RecursionError\n" +" ├── StopAsyncIteration\n" +" ├── StopIteration\n" +" ├── SyntaxError\n" +" │ └── IndentationError\n" +" │ └── TabError\n" +" ├── SystemError\n" +" ├── TypeError\n" +" ├── ValueError\n" +" │ └── UnicodeError\n" +" │ ├── UnicodeDecodeError\n" +" │ ├── UnicodeEncodeError\n" +" │ └── UnicodeTranslateError\n" +" └── Warning\n" +" ├── BytesWarning\n" +" ├── DeprecationWarning\n" +" ├── EncodingWarning\n" +" ├── FutureWarning\n" +" ├── ImportWarning\n" +" ├── PendingDeprecationWarning\n" +" ├── ResourceWarning\n" +" ├── RuntimeWarning\n" +" ├── SyntaxWarning\n" +" ├── UnicodeWarning\n" +" └── UserWarning\n" +msgstr "" + +#: ../../library/exceptions.rst:6 ../../library/exceptions.rst:17 +#: ../../library/exceptions.rst:196 +msgid "statement" +msgstr "statement -- 语句" + +#: ../../library/exceptions.rst:6 +msgid "try" +msgstr "try" + +#: ../../library/exceptions.rst:6 +msgid "except" +msgstr "except" + +#: ../../library/exceptions.rst:17 +msgid "raise" +msgstr "raise" + +#: ../../library/exceptions.rst:41 +msgid "exception" +msgstr "异常" + +#: ../../library/exceptions.rst:41 +msgid "chaining" +msgstr "chaining" + +#: ../../library/exceptions.rst:41 +msgid "__cause__ (exception attribute)" +msgstr "__cause__ (异常属性)" + +#: ../../library/exceptions.rst:41 +msgid "__context__ (exception attribute)" +msgstr "__context__ (异常属性)" + +#: ../../library/exceptions.rst:41 +msgid "__suppress_context__ (exception attribute)" +msgstr "__suppress_context__ (异常属性)" + +#: ../../library/exceptions.rst:196 +msgid "assert" +msgstr "assert" + +#: ../../library/exceptions.rst:361 +msgid "module" +msgstr "module" + +#: ../../library/exceptions.rst:361 +msgid "errno" +msgstr "errno" diff --git a/library/faulthandler.po b/library/faulthandler.po new file mode 100644 index 0000000000..abb26241ee --- /dev/null +++ b/library/faulthandler.po @@ -0,0 +1,415 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/faulthandler.rst:2 +msgid ":mod:`!faulthandler` --- Dump the Python traceback" +msgstr ":mod:`!faulthandler` --- 转储 Python 回溯信息" + +#: ../../library/faulthandler.rst:11 +msgid "" +"This module contains functions to dump Python tracebacks explicitly, on a " +"fault, after a timeout, or on a user signal. Call " +":func:`faulthandler.enable` to install fault handlers for the " +":const:`~signal.SIGSEGV`, :const:`~signal.SIGFPE`, :const:`~signal.SIGABRT`," +" :const:`~signal.SIGBUS`, and :const:`~signal.SIGILL` signals. You can also " +"enable them at startup by setting the :envvar:`PYTHONFAULTHANDLER` " +"environment variable or by using the :option:`-X` ``faulthandler`` command " +"line option." +msgstr "" +"本模块包含当发生故障、超时或收到用户信号时可转储 Python 回溯信息的函数。调用 :func:`faulthandler.enable` 可安装针对" +" :const:`~signal.SIGSEGV`, :const:`~signal.SIGFPE`, " +":const:`~signal.SIGABRT`, :const:`~signal.SIGBUS` 和 :const:`~signal.SIGILL` " +"信号的故障处理器。你还可以在启动时通过设置 :envvar:`PYTHONFAULTHANDLER` 环境变量或使用 :option:`-X` " +"``faulthandler`` 命令行选项来启用它们。" + +#: ../../library/faulthandler.rst:19 +msgid "" +"The fault handler is compatible with system fault handlers like Apport or " +"the Windows fault handler. The module uses an alternative stack for signal " +"handlers if the :c:func:`!sigaltstack` function is available. This allows it" +" to dump the traceback even on a stack overflow." +msgstr "" +"故障处理器可兼容系统故障处理器如 Apport 或 Windows 故障处理器。本模块会在 :c:func:`!sigaltstack` " +"函数可用时为信号处理器使用备用栈。这允许它即使在栈溢出的情况下也能转储回溯信息。" + +#: ../../library/faulthandler.rst:24 +msgid "" +"The fault handler is called on catastrophic cases and therefore can only use" +" signal-safe functions (e.g. it cannot allocate memory on the heap). Because" +" of this limitation traceback dumping is minimal compared to normal Python " +"tracebacks:" +msgstr "" +"故障处理程序将在灾难性场合调用,因此只能使用信号安全的函数(比如不能在堆上分配内存)。由于这一限制,与正常的 Python 回溯相比,转储量是最小的:" + +#: ../../library/faulthandler.rst:29 +msgid "" +"Only ASCII is supported. The ``backslashreplace`` error handler is used on " +"encoding." +msgstr "只支持 ASCII 码。编码时会用到 ``backslashreplace`` 错误处理程序。" + +#: ../../library/faulthandler.rst:31 +msgid "Each string is limited to 500 characters." +msgstr "每个字符串限制在 500 个字符以内。" + +#: ../../library/faulthandler.rst:32 +msgid "" +"Only the filename, the function name and the line number are displayed. (no " +"source code)" +msgstr "只会显示文件名、函数名和行号。(不显示源代码)" + +#: ../../library/faulthandler.rst:34 +msgid "" +"It is limited to 100 frames per thread, and 100 threads (configurable via " +"*max_threads*)." +msgstr "" + +#: ../../library/faulthandler.rst:36 +msgid "The order is reversed: the most recent call is shown first." +msgstr "反序排列:最近的调用最先显示。" + +#: ../../library/faulthandler.rst:38 +msgid "" +"By default, the Python traceback is written to :data:`sys.stderr`. To see " +"tracebacks, applications must be run in the terminal. A log file can " +"alternatively be passed to :func:`faulthandler.enable`." +msgstr "" +"默认情况下,Python 的跟踪信息会写入 :data:`sys.stderr`。为了能看到跟踪信息,应用程序必须运行于终端中。日志文件也可以传给 " +":func:`faulthandler.enable`." + +#: ../../library/faulthandler.rst:42 +msgid "" +"The module is implemented in C, so tracebacks can be dumped on a crash or " +"when Python is deadlocked." +msgstr "本模块是用 C 语言实现的,所以才能在崩溃或 Python 死锁时转储跟踪信息。" + +#: ../../library/faulthandler.rst:45 +msgid "" +"The :ref:`Python Development Mode ` calls " +":func:`faulthandler.enable` at Python startup." +msgstr "" +"在 Python 启动时, :ref:`Python 开发模式 ` 会调用 :func:`faulthandler.enable`。" + +#: ../../library/faulthandler.rst:50 +msgid "Module :mod:`pdb`" +msgstr "模块 :mod:`pdb`" + +#: ../../library/faulthandler.rst:51 +msgid "Interactive source code debugger for Python programs." +msgstr "用于 Python 程序的交互式源代码调试器。" + +#: ../../library/faulthandler.rst:53 +msgid "Module :mod:`traceback`" +msgstr "模块 :mod:`traceback`" + +#: ../../library/faulthandler.rst:54 +msgid "" +"Standard interface to extract, format and print stack traces of Python " +"programs." +msgstr "提取、格式化和打印 Python 程序的栈回溯信息的标准接口。" + +#: ../../library/faulthandler.rst:57 +msgid "Dumping the traceback" +msgstr "转储跟踪信息" + +#: ../../library/faulthandler.rst:61 +msgid "" +"Dump the tracebacks of all threads into *file*. If *all_threads* is " +"``False``, dump only the current thread. *max_threads* caps the number of " +"threads dumped." +msgstr "" + +#: ../../library/faulthandler.rst:65 +msgid "" +":func:`traceback.print_tb`, which can be used to print a traceback object." +msgstr ":func:`traceback.print_tb`,可被用于打印回溯对象。" + +#: ../../library/faulthandler.rst:67 ../../library/faulthandler.rst:126 +#: ../../library/faulthandler.rst:175 ../../library/faulthandler.rst:204 +msgid "Added support for passing file descriptor to this function." +msgstr "增加了向本函数传入文件描述符的支持。" + +#: ../../library/faulthandler.rst:70 ../../library/faulthandler.rst:143 +#: ../../library/faulthandler.rst:181 ../../library/faulthandler.rst:207 +msgid "Added the *max_threads* keyword argument." +msgstr "" + +#: ../../library/faulthandler.rst:75 +msgid "Dumping the C stack" +msgstr "对 C 栈进行转储" + +#: ../../library/faulthandler.rst:81 +msgid "Dump the C stack trace of the current thread into *file*." +msgstr "将当前线程的 C 栈追踪转储到 *file* 中。" + +#: ../../library/faulthandler.rst:83 +msgid "" +"If the Python build does not support it or the operating system does not " +"provide a stack trace, then this prints an error in place of a dumped C " +"stack." +msgstr "如果 Python 构建版不支持或者操作系统没有提供栈追踪,那么此函数将打印一条错误消息而不是已转储的 C 栈。" + +#: ../../library/faulthandler.rst:90 +msgid "C Stack Compatibility" +msgstr "C 栈兼容性" + +#: ../../library/faulthandler.rst:92 +msgid "" +"If the system does not support the C-level :manpage:`backtrace(3)` or " +":manpage:`dladdr1(3)`, then C stack dumps will not work. An error will be " +"printed instead of the stack." +msgstr "" +"如果系统不支持 C 层级的 :manpage:`backtrace(3)` 或 :manpage:`dladdr1(3)`,则 C 栈转储将不会执行。 " +"将打印一条错误消息而不是打印栈。" + +#: ../../library/faulthandler.rst:96 +msgid "" +"Additionally, some compilers do not support :term:`CPython's ` " +"implementation of C stack dumps. As a result, a different error may be " +"printed instead of the stack, even if the operating system supports dumping " +"stacks." +msgstr "" +"此外,某些编译器不支持 :term:`CPython ` 的 C 栈转储实现。 " +"因此,可能会打印不同的错误消息而不是打印栈,即使操作系统支持转储栈。" + +#: ../../library/faulthandler.rst:102 +msgid "" +"Dumping C stacks can be arbitrarily slow, depending on the DWARF level of " +"the binaries in the call stack." +msgstr "转储 C 栈可能会相当慢,具体取决于调用栈中的二进制数据的 DWARF 级别。" + +#: ../../library/faulthandler.rst:106 +msgid "Fault handler state" +msgstr "故障处理程序的状态" + +#: ../../library/faulthandler.rst:110 +msgid "" +"Enable the fault handler: install handlers for the :const:`~signal.SIGSEGV`," +" :const:`~signal.SIGFPE`, :const:`~signal.SIGABRT`, :const:`~signal.SIGBUS` " +"and :const:`~signal.SIGILL` signals to dump the Python traceback. If " +"*all_threads* is ``True``, produce tracebacks for every running thread. " +"Otherwise, dump only the current thread." +msgstr "" +"启用默认的处理器:为 :const:`~signal.SIGSEGV`, :const:`~signal.SIGFPE`, " +":const:`~signal.SIGABRT`, :const:`~signal.SIGBUS` 和 :const:`~signal.SIGILL` " +"信号安装处理器来转储 Python 回溯信息。如果 *all_threads* 为 ``True``,则会为每个运行中的线程产生回溯信息。 " +"在其他情况下,将只转储当前线程。" + +#: ../../library/faulthandler.rst:117 +msgid "" +"The *file* must be kept open until the fault handler is disabled: see " +":ref:`issue with file descriptors `." +msgstr "*file* 必须保持打开状态,直至停用故障处理程序为止:参见 :ref:`文件描述符相关话题 `。" + +#: ../../library/faulthandler.rst:120 +msgid "" +"If *c_stack* is ``True``, then the C stack trace is printed after the Python" +" traceback, unless the system does not support it. See :func:`dump_c_stack` " +"for more information on compatibility." +msgstr "" +"如果 *c_stack* 为 ``True``,则 C 栈追踪将在 Python 回溯之后打印,除非系统不支持它。请参阅 " +":func:`dump_c_stack` 了解有关兼容性的更多信息。" + +#: ../../library/faulthandler.rst:124 +msgid "" +"*max_threads* caps the number of threads dumped when a fatal signal fires." +msgstr "" + +#: ../../library/faulthandler.rst:129 +msgid "On Windows, a handler for Windows exception is also installed." +msgstr "在 Windows 系统中,同时会安装一个 Windows 异常处理程序。" + +#: ../../library/faulthandler.rst:132 +msgid "" +"The dump now mentions if a garbage collector collection is running if " +"*all_threads* is true." +msgstr "现在如果 *all_threads* 为 True,则转储信息会包含垃圾收集器是否正在运行。" + +#: ../../library/faulthandler.rst:136 +msgid "" +"Only the current thread is dumped if the :term:`GIL` is disabled to prevent " +"the risk of data races." +msgstr "如果禁用了 :term:`GIL`,则只有当前线程会被转储,以防止数据竞争风险。" + +#: ../../library/faulthandler.rst:140 +msgid "The dump now displays the C stack trace if *c_stack* is true." +msgstr "现在如果 *c_stack* 为真值,则转储将显示 C 栈追踪。" + +#: ../../library/faulthandler.rst:148 +msgid "" +"Disable the fault handler: uninstall the signal handlers installed by " +":func:`enable`." +msgstr "停用故障处理程序:卸载由 :func:`enable` 安装的信号处理程序。" + +#: ../../library/faulthandler.rst:153 +msgid "Check if the fault handler is enabled." +msgstr "检查故障处理程序是否被启用。" + +#: ../../library/faulthandler.rst:157 +msgid "Dumping the tracebacks after a timeout" +msgstr "一定时间后转储跟踪数据" + +#: ../../library/faulthandler.rst:161 +msgid "" +"Dump the tracebacks of all threads, after a timeout of *timeout* seconds, or" +" every *timeout* seconds if *repeat* is ``True``. If *exit* is ``True``, " +"call :c:func:`!_exit` with status=1 after dumping the tracebacks. (Note " +":c:func:`!_exit` exits the process immediately, which means it doesn't do " +"any cleanup like flushing file buffers.) If the function is called twice, " +"the new call replaces previous parameters and resets the timeout. The timer " +"has a sub-second resolution. *max_threads* caps the number of threads " +"dumped." +msgstr "" + +#: ../../library/faulthandler.rst:169 +msgid "" +"The *file* must be kept open until the traceback is dumped or " +":func:`cancel_dump_traceback_later` is called: see :ref:`issue with file " +"descriptors `." +msgstr "" +"*file* 必须保持打开状态,直至跟踪信息转储完毕,或调用了 :func:`cancel_dump_traceback_later`: 参见 " +":ref:`文件描述符相关话题 `。" + +#: ../../library/faulthandler.rst:173 +msgid "This function is implemented using a watchdog thread." +msgstr "本函数用一个看门狗线程实现。" + +#: ../../library/faulthandler.rst:178 +msgid "This function is now always available." +msgstr "该函数现在总是可用。" + +#: ../../library/faulthandler.rst:186 +msgid "Cancel the last call to :func:`dump_traceback_later`." +msgstr "取消 :func:`dump_traceback_later` 的最后一次调用。" + +#: ../../library/faulthandler.rst:190 +msgid "Dumping the traceback on a user signal" +msgstr "转储用户信号的跟踪信息" + +#: ../../library/faulthandler.rst:194 +msgid "" +"Register a user signal: install a handler for the *signum* signal to dump " +"the traceback of all threads, or of the current thread if *all_threads* is " +"``False``, into *file*. Call the previous handler if chain is ``True``. " +"*max_threads* caps the number of threads dumped." +msgstr "" + +#: ../../library/faulthandler.rst:199 +msgid "" +"The *file* must be kept open until the signal is unregistered by " +":func:`unregister`: see :ref:`issue with file descriptors `." +msgstr "" +"*file* 必须保持打开状态,直至该信号被 :func:`unregister` 注销:参见 :ref:`文件描述符相关话题 " +"`." + +#: ../../library/faulthandler.rst:202 ../../library/faulthandler.rst:216 +msgid "Not available on Windows." +msgstr "Windows 中不可用。" + +#: ../../library/faulthandler.rst:212 +msgid "" +"Unregister a user signal: uninstall the handler of the *signum* signal " +"installed by :func:`register`. Return ``True`` if the signal was registered," +" ``False`` otherwise." +msgstr "" +"注销一个用户信号:卸载由 :func:`register` 安装的 *signum* 信号处理程序。如果信号已注册,返回 ``True``,否则返回 " +"``False``." + +#: ../../library/faulthandler.rst:222 +msgid "Issue with file descriptors" +msgstr "文件描述符相关话题" + +#: ../../library/faulthandler.rst:224 +msgid "" +":func:`enable`, :func:`dump_traceback_later` and :func:`register` keep the " +"file descriptor of their *file* argument. If the file is closed and its file" +" descriptor is reused by a new file, or if :func:`os.dup2` is used to " +"replace the file descriptor, the traceback will be written into a different " +"file. Call these functions again each time that the file is replaced." +msgstr "" +":func:`enable`、:func:`dump_traceback_later` 和 :func:`register` 保留其 *file* " +"参数给出的文件描述符。如果文件关闭,文件描述符将被一个新文件重新使用;或者用 :func:`os.dup2` " +"替换了文件描述符,则跟踪信息将被写入另一个文件。每次文件被替换时,请再次调用这些函数。" + +#: ../../library/faulthandler.rst:232 +msgid "Example" +msgstr "示例" + +#: ../../library/faulthandler.rst:234 +msgid "" +"Example of a segmentation fault on Linux with and without enabling the fault" +" handler:" +msgstr "在 Linux 中启用和停用内存段故障的默认处理程序:" + +#: ../../library/faulthandler.rst:237 +msgid "" +"$ python -c \"import ctypes; ctypes.string_at(0)\"\n" +"Segmentation fault\n" +"\n" +"$ python -q -X faulthandler\n" +">>> import ctypes\n" +">>> ctypes.string_at(0)\n" +"Fatal Python error: Segmentation fault\n" +"\n" +"Current thread 0x00007fb899f39700 (most recent call first):\n" +" File \"/opt/python/Lib/ctypes/__init__.py\", line 486 in string_at\n" +" File \"\", line 1 in \n" +"\n" +"Current thread's C stack trace (most recent call first):\n" +" Binary file \"/opt/python/python\", at _Py_DumpStack+0x42 [0x5b27f7d7147e]\n" +" Binary file \"/opt/python/python\", at +0x32dcbd [0x5b27f7d85cbd]\n" +" Binary file \"/opt/python/python\", at +0x32df8a [0x5b27f7d85f8a]\n" +" Binary file \"/usr/lib/libc.so.6\", at +0x3def0 [0x77b73226bef0]\n" +" Binary file \"/usr/lib/libc.so.6\", at +0x17ef9c [0x77b7323acf9c]\n" +" Binary file \"/opt/python/build/lib.linux-x86_64-3.15/_ctypes.cpython-315d-x86_64-linux-gnu.so\", at +0xcdf6 [0x77b7315dddf6]\n" +" Binary file \"/usr/lib/libffi.so.8\", at +0x7976 [0x77b73158f976]\n" +" Binary file \"/usr/lib/libffi.so.8\", at +0x413c [0x77b73158c13c]\n" +" Binary file \"/usr/lib/libffi.so.8\", at ffi_call+0x12e [0x77b73158ef0e]\n" +" Binary file \"/opt/python/build/lib.linux-x86_64-3.15/_ctypes.cpython-315d-x86_64-linux-gnu.so\", at +0x15a33 [0x77b7315e6a33]\n" +" Binary file \"/opt/python/build/lib.linux-x86_64-3.15/_ctypes.cpython-315d-x86_64-linux-gnu.so\", at +0x164fa [0x77b7315e74fa]\n" +" Binary file \"/opt/python/build/lib.linux-x86_64-3.15/_ctypes.cpython-315d-x86_64-linux-gnu.so\", at +0xc624 [0x77b7315dd624]\n" +" Binary file \"/opt/python/python\", at _PyObject_MakeTpCall+0xce [0x5b27f7b73883]\n" +" Binary file \"/opt/python/python\", at +0x11bab6 [0x5b27f7b73ab6]\n" +" Binary file \"/opt/python/python\", at PyObject_Vectorcall+0x23 [0x5b27f7b73b04]\n" +" Binary file \"/opt/python/python\", at _PyEval_EvalFrameDefault+0x490c [0x5b27f7cbb302]\n" +" Binary file \"/opt/python/python\", at +0x2818e6 [0x5b27f7cd98e6]\n" +" Binary file \"/opt/python/python\", at +0x281aab [0x5b27f7cd9aab]\n" +" Binary file \"/opt/python/python\", at PyEval_EvalCode+0xc5 [0x5b27f7cd9ba3]\n" +" Binary file \"/opt/python/python\", at +0x255957 [0x5b27f7cad957]\n" +" Binary file \"/opt/python/python\", at +0x255ab4 [0x5b27f7cadab4]\n" +" Binary file \"/opt/python/python\", at _PyEval_EvalFrameDefault+0x6c3e [0x5b27f7cbd634]\n" +" Binary file \"/opt/python/python\", at +0x2818e6 [0x5b27f7cd98e6]\n" +" Binary file \"/opt/python/python\", at +0x281aab [0x5b27f7cd9aab]\n" +" Binary file \"/opt/python/python\", at +0x11b6e1 [0x5b27f7b736e1]\n" +" Binary file \"/opt/python/python\", at +0x11d348 [0x5b27f7b75348]\n" +" Binary file \"/opt/python/python\", at +0x11d626 [0x5b27f7b75626]\n" +" Binary file \"/opt/python/python\", at PyObject_Call+0x20 [0x5b27f7b7565e]\n" +" Binary file \"/opt/python/python\", at +0x32a67a [0x5b27f7d8267a]\n" +" Binary file \"/opt/python/python\", at +0x32a7f8 [0x5b27f7d827f8]\n" +" Binary file \"/opt/python/python\", at +0x32ac1b [0x5b27f7d82c1b]\n" +" Binary file \"/opt/python/python\", at Py_RunMain+0x31 [0x5b27f7d82ebe]\n" +" \n" +"Segmentation fault" +msgstr "" diff --git a/library/fcntl.po b/library/fcntl.po new file mode 100644 index 0000000000..7843ab002f --- /dev/null +++ b/library/fcntl.po @@ -0,0 +1,476 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/fcntl.rst:2 +msgid ":mod:`!fcntl` --- The ``fcntl`` and ``ioctl`` system calls" +msgstr ":mod:`!fcntl` --- ``fcntl`` 和 ``ioctl`` 系统调用" + +#: ../../library/fcntl.rst:13 +msgid "" +"This module performs file and I/O control on file descriptors. It is an " +"interface to the :c:func:`fcntl` and :c:func:`ioctl` Unix routines. See the " +":manpage:`fcntl(2)` and :manpage:`ioctl(2)` Unix manual pages for full " +"details." +msgstr "" +"本模块基于文件描述符来执行文件和 I/O 控制。它是 :c:func:`fcntl` 和 :c:func:`ioctl` Unix 例程的接口。 请参阅" +" :manpage:`fcntl(2)` 和 :manpage:`ioctl(2)` Unix 手册页了解详情。" + +#: ../../library/fcntl.rst:18 +msgid "Availability" +msgstr "适用范围" + +#: ../../library/fcntl.rst:20 +msgid "" +"All functions in this module take a file descriptor *fd* as their first " +"argument. This can be an integer file descriptor, such as returned by " +"``sys.stdin.fileno()``, or an :class:`io.IOBase` object, such as " +"``sys.stdin`` itself, which provides a :meth:`~io.IOBase.fileno` that " +"returns a genuine file descriptor." +msgstr "" +"本模块的所有函数都接受文件描述符 *fd* 作为第一个参数。可以是一个整数形式的文件描述符,比如 ``sys.stdin.fileno()`` " +"的返回结果,或为 :class:`io.IOBase` 对象,比如 ``sys.stdin`` 提供一个 " +":meth:`~io.IOBase.fileno`,可返回一个真正的文件描述符。" + +#: ../../library/fcntl.rst:26 +msgid "" +"Operations in this module used to raise an :exc:`IOError` where they now " +"raise an :exc:`OSError`." +msgstr "本模块的操作以前触发的是 :exc:`IOError`,现在则会触发 :exc:`OSError`。" + +#: ../../library/fcntl.rst:30 +msgid "" +"The :mod:`!fcntl` module now contains ``F_ADD_SEALS``, ``F_GET_SEALS``, and " +"``F_SEAL_*`` constants for sealing of :func:`os.memfd_create` file " +"descriptors." +msgstr "" +":mod:`!fcntl` 模块现在包含 ``F_ADD_SEALS``, ``F_GET_SEALS`` 和 ``F_SEAL_*`` 常量用于 " +":func:`os.memfd_create` 文件描述符的封包。" + +#: ../../library/fcntl.rst:35 +msgid "" +"On macOS, the :mod:`!fcntl` module exposes the ``F_GETPATH`` constant, which" +" obtains the path of a file from a file descriptor. On Linux(>=3.15), the " +":mod:`!fcntl` module exposes the ``F_OFD_GETLK``, ``F_OFD_SETLK`` and " +"``F_OFD_SETLKW`` constants, which are used when working with open file " +"description locks." +msgstr "" +"在 macOS 上,:mod:`!fcntl` 模块暴露了 ``F_GETPATH`` 常量,它可从文件描述符获取文件的路径。在 " +"Linux(>=3.15) 上,:mod:`!fcntl` 模块暴露了 ``F_OFD_GETLK``, ``F_OFD_SETLK`` 和 " +"``F_OFD_SETLKW`` 常量,它们将在处理打开文件描述锁时被使用。" + +#: ../../library/fcntl.rst:42 +msgid "" +"On Linux >= 2.6.11, the :mod:`!fcntl` module exposes the ``F_GETPIPE_SZ`` " +"and ``F_SETPIPE_SZ`` constants, which allow to check and modify a pipe's " +"size respectively." +msgstr "" +"在 Linux >= 2.6.11 中,:mod:`!fcntl` 模块暴露了 ``F_GETPIPE_SZ`` 和 ``F_SETPIPE_SZ`` " +"常量,它们分别允许检查和修改管道的大小。" + +#: ../../library/fcntl.rst:47 +msgid "" +"On FreeBSD, the :mod:`!fcntl` module exposes the ``F_DUP2FD`` and " +"``F_DUP2FD_CLOEXEC`` constants, which allow to duplicate a file descriptor, " +"the latter setting ``FD_CLOEXEC`` flag in addition." +msgstr "" +"在 FreeBSD 上,:mod:`!fcntl` 模块会暴露 ``F_DUP2FD`` 和 ``F_DUP2FD_CLOEXEC`` " +"常量,它们允许复制文件描述符,后者还额外设置了 ``FD_CLOEXEC`` 旗标。" + +#: ../../library/fcntl.rst:52 +msgid "" +"On Linux >= 4.5, the :mod:`!fcntl` module exposes the ``FICLONE`` and " +"``FICLONERANGE`` constants, which allow to share some data of one file with " +"another file by reflinking on some filesystems (e.g., btrfs, OCFS2, and " +"XFS). This behavior is commonly referred to as \"copy-on-write\"." +msgstr "" +"在 Linux >= 4.5 上,:mod:`!fcntl` 模块将对外暴露 ``FICLONE`` 和 ``FICLONERANGE`` " +"常量,这允许在某些文件系统(例如 btrfs, OCFS2 和 XFS)上通过引用链接让一个文件与另一个文件共享某些数据。 " +"此行为通常被称为“写入时拷贝”。" + +#: ../../library/fcntl.rst:58 +msgid "" +"On Linux >= 2.6.32, the :mod:`!fcntl` module exposes the ``F_GETOWN_EX``, " +"``F_SETOWN_EX``, ``F_OWNER_TID``, ``F_OWNER_PID``, ``F_OWNER_PGRP`` " +"constants, which allow to direct I/O availability signals to a specific " +"thread, process, or process group. On Linux >= 4.13, the :mod:`!fcntl` " +"module exposes the ``F_GET_RW_HINT``, ``F_SET_RW_HINT``, " +"``F_GET_FILE_RW_HINT``, ``F_SET_FILE_RW_HINT``, and ``RWH_WRITE_LIFE_*`` " +"constants, which allow to inform the kernel about the relative expected " +"lifetime of writes on a given inode or via a particular open file " +"description. On Linux >= 5.1 and NetBSD, the :mod:`!fcntl` module exposes " +"the ``F_SEAL_FUTURE_WRITE`` constant for use with ``F_ADD_SEALS`` and " +"``F_GET_SEALS`` operations. On FreeBSD, the :mod:`!fcntl` module exposes the" +" ``F_READAHEAD``, ``F_ISUNIONSTACK``, and ``F_KINFO`` constants. On macOS " +"and FreeBSD, the :mod:`!fcntl` module exposes the ``F_RDAHEAD`` constant. On" +" NetBSD and AIX, the :mod:`!fcntl` module exposes the ``F_CLOSEM`` constant." +" On NetBSD, the :mod:`!fcntl` module exposes the ``F_MAXFD`` constant. On " +"macOS and NetBSD, the :mod:`!fcntl` module exposes the ``F_GETNOSIGPIPE`` " +"and ``F_SETNOSIGPIPE`` constant." +msgstr "" +"在 Linux >= 2.6.32 上,:mod:`!fcntl` 模块会暴露 ``F_GETOWN_EX``, ``F_SETOWN_EX``, " +"``F_OWNER_TID``, ``F_OWNER_PID``, ``F_OWNER_PGRP`` 常量,它们允许针对特定线程、进程或进程组的直接 " +"I/O 可用性信号。在 Linux >= 4.13 上,:mod:`!fcntl` 模块会暴露 ``F_GET_RW_HINT``, " +"``F_SET_RW_HINT``, ``F_GET_FILE_RW_HINT``, ``F_SET_FILE_RW_HINT`` 和 " +"``RWH_WRITE_LIFE_*`` 常量,它们允许向内核通知有关在给定 inode 上或通过特定的打开文件描述符写入的相对预计生命期。在 " +"Linux >= 5.1 和 NetBSD 上,:mod:`!fcntl` 模块会暴露 ``F_SEAL_FUTURE_WRITE`` 常量供 " +"``F_ADD_SEALS`` 和 ``F_GET_SEALS`` 操作使用。在 FreeBSD 上,:mod:`!fcntl` 模块会暴露 " +"``F_READAHEAD``, ``F_ISUNIONSTACK`` 和 ``F_KINFO`` 常量。在 macOS 和 FreeBSD " +"上,:mod:`!fcntl` 模块会暴露 ``F_RDAHEAD`` 常量。在 NetBSD 和 AIX 上,:mod:`!fcntl` 模块会暴露 " +"``F_CLOSEM`` 常量。在 NetBSD 上,:mod:`!fcntl` 模块会暴露 ``F_MAXFD`` 常量。在 macOS 和 " +"NetBSD 上,:mod:`!fcntl` 模块会暴露 ``F_GETNOSIGPIPE`` 和 ``F_SETNOSIGPIPE`` 常量。" + +#: ../../library/fcntl.rst:79 +msgid "" +"On Linux >= 6.1, the :mod:`!fcntl` module exposes the ``F_DUPFD_QUERY`` to " +"query a file descriptor pointing to the same file." +msgstr "" +"在 Linux >= 6.1 上,:mod:`!fcntl` 模块暴露了 ``F_DUPFD_QUERY`` 以查询指向同一文件的文件描述符。" + +#: ../../library/fcntl.rst:83 +msgid "The module defines the following functions:" +msgstr "这个模块定义了以下函数:" + +#: ../../library/fcntl.rst:88 +msgid "" +"Perform the operation *cmd* on file descriptor *fd* (file objects providing " +"a :meth:`~io.IOBase.fileno` method are accepted as well). The values used " +"for *cmd* are operating system dependent, and are available as constants in " +"the :mod:`!fcntl` module, using the same names as used in the relevant C " +"header files. The argument *arg* can either be an integer value, a " +":term:`bytes-like object`, or a string. The type and size of *arg* must " +"match the type and size of the argument of the operation as specified in the" +" relevant C documentation." +msgstr "" +"在文件描述符 *fd* (也接受提供 :meth:`~io.IOBase.fileno` 方法的文件对象) 上执行操作 *cmd*。 用作 *cmd* " +"的值取决于具体操作系统,并可在 :mod:`!fcntl` 模块中作为常量访问,并且使用的名称与相应 C 头文件中所使用的相同。 参数 *arg* " +"可以是整数值、:term:`bytes-like object` 或字符串。 *arg* 的类型和大小必须与相应 C " +"文件中指定的操作的参数类型和大小相匹配。" + +#: ../../library/fcntl.rst:97 +msgid "" +"When *arg* is an integer, the function returns the integer return value of " +"the C :c:func:`fcntl` call." +msgstr "当 *arg* 是一个整数时,该函数将返回 C :c:func:`fcntl` 调用的整数返回值。" + +#: ../../library/fcntl.rst:100 +msgid "" +"When the argument is bytes-like object, it represents a binary structure, " +"for example, created by :func:`struct.pack`. A string value is encoded to " +"binary using the UTF-8 encoding. The binary data is copied to a buffer whose" +" address is passed to the C :c:func:`fcntl` call. The return value after a " +"successful call is the contents of the buffer, converted to a :class:`bytes`" +" object. The length of the returned object will be the same as the length of" +" the *arg* argument." +msgstr "" + +#: ../../library/fcntl.rst:109 +msgid "If the :c:func:`fcntl` call fails, an :exc:`OSError` is raised." +msgstr "如果 :c:func:`fcntl` 调用失败,将引发 :exc:`OSError`。" + +#: ../../library/fcntl.rst:112 ../../library/fcntl.rst:161 +msgid "" +"If the type or size of *arg* does not match the type or size of the " +"operation's argument (for example, if an integer is passed when a pointer is" +" expected, or the information returned in the buffer by the operating system" +" is larger than the size of *arg*), this is most likely to result in a " +"segmentation violation or a more subtle data corruption." +msgstr "" + +#: ../../library/fcntl.rst:119 +msgid "" +"Raises an :ref:`auditing event ` ``fcntl.fcntl`` with arguments " +"``fd``, ``cmd``, ``arg``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``fcntl.fcntl`` 并附带参数 ``fd``, ``cmd``, ``arg``。" + +#: ../../library/fcntl.rst:121 +msgid "" +"Add support of arbitrary :term:`bytes-like objects `, not" +" only :class:`bytes`." +msgstr "添加对任意 :term:`字节型对象 ` 的支持,而不仅是 :class:`bytes`。" + +#: ../../library/fcntl.rst:125 +msgid "The size of bytes-like objects is no longer limited to 1024 bytes." +msgstr "" + +#: ../../library/fcntl.rst:131 +msgid "" +"This function is identical to the :func:`~fcntl.fcntl` function, except that" +" the argument handling is even more complicated." +msgstr "本函数与 :func:`~fcntl.fcntl` 函数相同,只是参数的处理更加复杂。" + +#: ../../library/fcntl.rst:134 +msgid "" +"The *request* parameter is limited to values that can fit in 32-bits or " +"64-bits, depending on the platform. Additional constants of interest for use" +" as the *request* argument can be found in the :mod:`termios` module, under " +"the same names as used in the relevant C header files." +msgstr "" +"*request* 形参被限制为能被放入 32 或 64 个比特位的值,具体取决于所在的平台。在 :mod:`termios` 模块中还包含一些可被用作" +" *request* 参数的额外常量,其名称与相关 C 语言头文件中所使用的相同。" + +#: ../../library/fcntl.rst:140 +msgid "" +"The parameter *arg* can be an integer, a :term:`bytes-like object`, or a " +"string. The type and size of *arg* must match the type and size of the " +"argument of the operation as specified in the relevant C documentation." +msgstr "" +"形参 *arg* 可以是一个整数,:term:`bytes-like object` 或者字符串。 *arg* 的类型和大小必须与对应 C " +"文档中规定的参数的类型和大小相匹配。" + +#: ../../library/fcntl.rst:145 +msgid "" +"If *arg* does not support the read-write buffer interface or the " +"*mutate_flag* is false, behavior is as for the :func:`~fcntl.fcntl` " +"function." +msgstr "" +"如果 *arg* 不支持读写缓冲区接口或者 *mutate_flag* 为假值,则其行为与 :func:`~fcntl.fcntl` 函数一样。" + +#: ../../library/fcntl.rst:149 +msgid "" +"If *arg* supports the read-write buffer interface (like :class:`bytearray`) " +"and *mutate_flag* is true (the default), then the buffer is (in effect) " +"passed to the underlying :c:func:`!ioctl` system call, the latter's return " +"code is passed back to the calling Python, and the buffer's new contents " +"reflect the action of the :c:func:`ioctl`. This is a slight simplification," +" because if the supplied buffer is less than 1024 bytes long it is first " +"copied into a static buffer 1024 bytes long which is then passed to " +":func:`ioctl` and copied back into the supplied buffer." +msgstr "" +"如果 *arg* 支持读写缓冲区接口 (就像 :class:`bytearray`) 并且 *mutate_flag* " +"为(默认的)真值,那么缓冲区(实际上)会被传给下层的 :c:func:`!ioctl` 系统调用,后者的返回代码则会回传给调用方 Python " +"对象,而缓冲区的新内容将反映 :c:func:`ioctl` 的动作。这里做了一点简化,因为如果给出的缓冲区长度小于 1024 " +"字节则它会先被拷贝到一个长度为 1024 字节的静态缓冲区然后再传给 :func:`ioctl` 并把结果拷贝回给出的缓冲区。" + +#: ../../library/fcntl.rst:158 +msgid "" +"If the :c:func:`ioctl` call fails, an :exc:`OSError` exception is raised." +msgstr "如果 :c:func:`ioctl` 调用失败,将引发 :exc:`OSError` 异常。" + +#: ../../library/fcntl.rst:168 +msgid "An example::" +msgstr "举个例子::" + +#: ../../library/fcntl.rst:170 +msgid "" +">>> import array, fcntl, struct, termios, os\n" +">>> os.getpgrp()\n" +"13341\n" +">>> struct.unpack('h', fcntl.ioctl(0, termios.TIOCGPGRP, \" \"))[0]\n" +"13341\n" +">>> buf = array.array('h', [0])\n" +">>> fcntl.ioctl(0, termios.TIOCGPGRP, buf, 1)\n" +"0\n" +">>> buf\n" +"array('h', [13341])" +msgstr "" +">>> import array, fcntl, struct, termios, os\n" +">>> os.getpgrp()\n" +"13341\n" +">>> struct.unpack('h', fcntl.ioctl(0, termios.TIOCGPGRP, \" \"))[0]\n" +"13341\n" +">>> buf = array.array('h', [0])\n" +">>> fcntl.ioctl(0, termios.TIOCGPGRP, buf, 1)\n" +"0\n" +">>> buf\n" +"array('h', [13341])" + +#: ../../library/fcntl.rst:181 +msgid "" +"Raises an :ref:`auditing event ` ``fcntl.ioctl`` with arguments " +"``fd``, ``request``, ``arg``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``fcntl.ioctl`` 并附带参数 ``fd``, ``request``, " +"``arg``." + +#: ../../library/fcntl.rst:183 +msgid "" +"The GIL is always released during a system call. System calls failing with " +"EINTR are automatically retried." +msgstr "GIL 总是在系统调用期间被释放。以 EINTR 失败的系统调用会自动重试。" + +#: ../../library/fcntl.rst:187 +msgid "" +"The size of not mutated bytes-like objects is no longer limited to 1024 " +"bytes." +msgstr "" + +#: ../../library/fcntl.rst:193 +msgid "" +"Perform the lock operation *operation* on file descriptor *fd* (file objects" +" providing a :meth:`~io.IOBase.fileno` method are accepted as well). See the" +" Unix manual :manpage:`flock(2)` for details. (On some systems, this " +"function is emulated using :c:func:`fcntl`.)" +msgstr "" +"在文件描述符 *fd* 上执行加锁操作 *operation* (也接受能提供 :meth:`~io.IOBase.fileno` 方法的文件对象)。 " +"详见 Unix 手册 :manpage:`flock(2)`。 (在某些系统中,此函数是用 :c:func:`fcntl` 模拟出来的。)" + +#: ../../library/fcntl.rst:198 +msgid "" +"If the :c:func:`flock` call fails, an :exc:`OSError` exception is raised." +msgstr "如果 :c:func:`flock` 调用失败,将引发 :exc:`OSError` 异常。" + +#: ../../library/fcntl.rst:200 +msgid "" +"Raises an :ref:`auditing event ` ``fcntl.flock`` with arguments " +"``fd``, ``operation``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``fcntl.flock`` 并附带参数 ``fd``, ``operation``。" + +#: ../../library/fcntl.rst:205 +msgid "" +"This is essentially a wrapper around the :func:`~fcntl.fcntl` locking calls." +" *fd* is the file descriptor (file objects providing a " +":meth:`~io.IOBase.fileno` method are accepted as well) of the file to lock " +"or unlock, and *cmd* is one of the following values:" +msgstr "" +"本质上是对 :func:`~fcntl.fcntl` 加锁调用的封装。*fd* 是要加解锁的文件描述符(也接受能提供 " +":meth:`~io.IOBase.fileno` 方法的文件对象),*cmd* 是以下值之一:" + +#: ../../library/fcntl.rst:212 +msgid "Release an existing lock." +msgstr "释放一个已存在的锁。" + +#: ../../library/fcntl.rst:216 +msgid "Acquire a shared lock." +msgstr "获取一个共享的锁。" + +#: ../../library/fcntl.rst:220 +msgid "Acquire an exclusive lock." +msgstr "获得一个独占的锁。" + +#: ../../library/fcntl.rst:224 +msgid "" +"Bitwise OR with any of the other three ``LOCK_*`` constants to make the " +"request non-blocking." +msgstr "与其他三个 ``LOCK_*`` 常量中的任何一个进行位或操作,使请求不阻塞。" + +#: ../../library/fcntl.rst:227 +msgid "" +"If :const:`!LOCK_NB` is used and the lock cannot be acquired, an " +":exc:`OSError` will be raised and the exception will have an *errno* " +"attribute set to :const:`~errno.EACCES` or :const:`~errno.EAGAIN` (depending" +" on the operating system; for portability, check for both values). On at " +"least some systems, :const:`!LOCK_EX` can only be used if the file " +"descriptor refers to a file opened for writing." +msgstr "" +"如果使用了 :const:`!LOCK_NB` 但无法获取锁,则会引发 :exc:`OSError`,异常的 *errno* 属性会被设置为 " +":const:`~errno.EACCES` 或 :const:`~errno.EAGAIN` (取决于操作系统;为便于移植,请检查这两个值)。 " +"至少在某些系统中,只有当文件描述符指向一个已打开供写入的文件时,才能使用 :const:`!LOCK_EX`。" + +#: ../../library/fcntl.rst:234 +msgid "" +"*len* is the number of bytes to lock, *start* is the byte offset at which " +"the lock starts, relative to *whence*, and *whence* is as with " +":func:`io.IOBase.seek`, specifically:" +msgstr "" +"*len* 是要锁定的字节数,*start* 是自 *whence* 开始锁定的字节偏移量,*whence* 与 " +":func:`io.IOBase.seek` 的定义一样,具体来说:" + +#: ../../library/fcntl.rst:238 +msgid "``0`` -- relative to the start of the file (:const:`os.SEEK_SET`)" +msgstr "``0`` -- 相对于文件开头 (:const:`os.SEEK_SET`)" + +#: ../../library/fcntl.rst:239 +msgid "" +"``1`` -- relative to the current buffer position (:const:`os.SEEK_CUR`)" +msgstr "``1`` -- 相对于当前缓冲区位置 (:const:`os.SEEK_CUR`)" + +#: ../../library/fcntl.rst:240 +msgid "``2`` -- relative to the end of the file (:const:`os.SEEK_END`)" +msgstr "``2`` -- 相对于文件末尾 (:const:`os.SEEK_END`)" + +#: ../../library/fcntl.rst:242 +msgid "" +"The default for *start* is 0, which means to start at the beginning of the " +"file. The default for *len* is 0 which means to lock to the end of the file." +" The default for *whence* is also 0." +msgstr "" +"*start* 的默认值为 0,表示从文件起始位置开始。*len* 的默认值是 0,表示加锁至文件末尾。 *whence* 的默认值也是 0。" + +#: ../../library/fcntl.rst:246 +msgid "" +"Raises an :ref:`auditing event ` ``fcntl.lockf`` with arguments " +"``fd``, ``cmd``, ``len``, ``start``, ``whence``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``fcntl.lockf`` 并附带参数 ``fd``, ``cmd``, ``len``, " +"``start``, ``whence``." + +#: ../../library/fcntl.rst:248 +msgid "Examples (all on a SVR4 compliant system)::" +msgstr "示例(都是运行于符合 SVR4 的系统)::" + +#: ../../library/fcntl.rst:250 +msgid "" +"import struct, fcntl, os\n" +"\n" +"f = open(...)\n" +"rv = fcntl.fcntl(f, fcntl.F_SETFL, os.O_NDELAY)\n" +"\n" +"lockdata = struct.pack('hhllhh', fcntl.F_WRLCK, 0, 0, 0, 0, 0)\n" +"rv = fcntl.fcntl(f, fcntl.F_SETLKW, lockdata)" +msgstr "" +"import struct, fcntl, os\n" +"\n" +"f = open(...)\n" +"rv = fcntl.fcntl(f, fcntl.F_SETFL, os.O_NDELAY)\n" +"\n" +"lockdata = struct.pack('hhllhh', fcntl.F_WRLCK, 0, 0, 0, 0, 0)\n" +"rv = fcntl.fcntl(f, fcntl.F_SETLKW, lockdata)" + +#: ../../library/fcntl.rst:258 +msgid "" +"Note that in the first example the return value variable *rv* will hold an " +"integer value; in the second example it will hold a :class:`bytes` object. " +"The structure lay-out for the *lockdata* variable is system dependent --- " +"therefore using the :func:`flock` call may be better." +msgstr "" +"注意,在第一个例子中,返回值变量 *rv* 将存有整数;在第二个例子中,该变量中将存有一个 :class:`bytes` 对象。*lockdata* " +"变量的结构布局视系统而定——因此采用 :func:`flock` 调用可能会更好。" + +#: ../../library/fcntl.rst:266 +msgid "Module :mod:`os`" +msgstr "模块 :mod:`os`" + +#: ../../library/fcntl.rst:267 +msgid "" +"If the locking flags :const:`~os.O_SHLOCK` and :const:`~os.O_EXLOCK` are " +"present in the :mod:`os` module (on BSD only), the :func:`os.open` function " +"provides an alternative to the :func:`lockf` and :func:`flock` functions." +msgstr "" +"如果加锁旗标 :const:`~os.O_SHLOCK` 和 :const:`~os.O_EXLOCK` 存在于 :mod:`os` 模块中(仅 BSD" +" 专属),则 :func:`os.open` 函数提供了对 :func:`lockf` 和 :func:`flock` 函数的替代。" + +#: ../../library/fcntl.rst:7 +msgid "UNIX" +msgstr "UNIX" + +#: ../../library/fcntl.rst:7 +msgid "file control" +msgstr "文件控制" + +#: ../../library/fcntl.rst:7 +msgid "I/O control" +msgstr "I/O 控制" diff --git a/library/filecmp.po b/library/filecmp.po new file mode 100644 index 0000000000..8f6fdd227b --- /dev/null +++ b/library/filecmp.po @@ -0,0 +1,291 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-19 15:34+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/filecmp.rst:2 +msgid ":mod:`!filecmp` --- File and Directory Comparisons" +msgstr ":mod:`!filecmp` --- 文件和目录比较" + +#: ../../library/filecmp.rst:9 +msgid "**Source code:** :source:`Lib/filecmp.py`" +msgstr "**源代码:** :source:`Lib/filecmp.py`" + +#: ../../library/filecmp.rst:13 +msgid "" +"The :mod:`!filecmp` module defines functions to compare files and " +"directories, with various optional time/correctness trade-offs. For " +"comparing files, see also the :mod:`difflib` module." +msgstr "" +":mod:`!filecmp` 模块定义了用于比较文件及目录的函数,并且可以选取多种关于时间和准确性的折衷方案。 对于文件的比较,另见 " +":mod:`difflib` 模块。" + +#: ../../library/filecmp.rst:17 +msgid "The :mod:`!filecmp` module defines the following functions:" +msgstr ":mod:`!filecmp` 模块定义了下列函数:" + +#: ../../library/filecmp.rst:22 +msgid "" +"Compare the files named *f1* and *f2*, returning ``True`` if they seem " +"equal, ``False`` otherwise." +msgstr "比较名为 *f1* 和 *f2* 的文件,如果它们似乎相等则返回 ``True``,否则返回 ``False``。" + +#: ../../library/filecmp.rst:25 +msgid "" +"If *shallow* is true and the :func:`os.stat` signatures (file type, size, " +"and modification time) of both files are identical, the files are taken to " +"be equal." +msgstr "" +"如果 *shallow* 为真值且两个文件的 :func:`os.stat` 签名信息(文件类型、大小和修改时间)一致,则文件会被视为相同。" + +#: ../../library/filecmp.rst:29 +msgid "" +"Otherwise, the files are treated as different if their sizes or contents " +"differ." +msgstr "在其他情况下,如果文件大小或内容不同则它们会被视为不同。" + +#: ../../library/filecmp.rst:31 +msgid "" +"Note that no external programs are called from this function, giving it " +"portability and efficiency." +msgstr "需要注意,没有外部程序被该函数调用,这赋予了该函数可移植性与效率。" + +#: ../../library/filecmp.rst:34 +msgid "" +"This function uses a cache for past comparisons and the results, with cache " +"entries invalidated if the :func:`os.stat` information for the file changes." +" The entire cache may be cleared using :func:`clear_cache`." +msgstr "" +"该函数会缓存过去的比较及其结果,且在文件的 :func:`os.stat` 信息变化后缓存条目失效。所有的缓存可以通过使用 " +":func:`clear_cache` 来清除。" + +#: ../../library/filecmp.rst:41 +msgid "" +"Compare the files in the two directories *a* and *b* whose names are given " +"by *common*." +msgstr "" + +#: ../../library/filecmp.rst:44 +msgid "" +"Returns three lists of file names: *match*, *mismatch*, *errors*. *match* " +"contains the list of files that match, *mismatch* contains the names of " +"those that don't, and *errors* lists the names of files which could not be " +"compared. Files are listed in *errors* if they don't exist in one of the " +"directories, the user lacks permission to read them or if the comparison " +"could not be done for some other reason." +msgstr "" +"返回三组文件名列表: *match*, *mismatch*, *errors* 。 *match* 含有相匹配的文件, *mismatch* " +"含有那些不匹配的,然后 *errors* " +"列出那些未被比较文件的名称。如果文件不存在于两目录中的任一个,或者用户缺少读取它们的权限,又或者因为其他的一些原因而无法比较,那么这些文件将会被列在 " +"*errors* 中。" + +#: ../../library/filecmp.rst:51 +msgid "" +"The *shallow* parameter has the same meaning and default value as for " +":func:`filecmp.cmp`." +msgstr "参数 *shallow* 具有同 :func:`filecmp.cmp` 一致的含义与默认值。" + +#: ../../library/filecmp.rst:54 +msgid "" +"For example, ``cmpfiles('a', 'b', ['c', 'd/e'])`` will compare ``a/c`` with " +"``b/c`` and ``a/d/e`` with ``b/d/e``. ``'c'`` and ``'d/e'`` will each be in" +" one of the three returned lists." +msgstr "" +"例如,``cmpfiles('a', 'b', ['c', 'd/e'])`` 将会比较 ``a/c`` 与 ``b/c`` 以及 ``a/d/e`` " +"与 ``b/d/e``。``'c'`` 和 ``'d/e'`` 将会各自出现在返回的三个列表里的某一个列表中。" + +#: ../../library/filecmp.rst:61 +msgid "" +"Clear the filecmp cache. This may be useful if a file is compared so quickly" +" after it is modified that it is within the mtime resolution of the " +"underlying filesystem." +msgstr "清除 filecmp 缓存。当文件在修改后被过快地比较,以至于处于底层文件系统的 mtime 精度范围之内时,该函数可能会很有用。" + +#: ../../library/filecmp.rst:71 +msgid "The :class:`dircmp` class" +msgstr ":class:`dircmp` 类" + +#: ../../library/filecmp.rst:75 +msgid "" +"Construct a new directory comparison object, to compare the directories *a* " +"and *b*. *ignore* is a list of names to ignore, and defaults to " +":const:`filecmp.DEFAULT_IGNORES`. *hide* is a list of names to hide, and " +"defaults to ``[os.curdir, os.pardir]``." +msgstr "" +"构造一个新的目录比较对象,用来比较目录 *a* 和 *b*。 *ignore* 是要忽略的名称列表,且默认为 " +":const:`filecmp.DEFAULT_IGNORES`。 *hide* 是要隐藏的名称列表,且默认为 ``[os.curdir, " +"os.pardir]``." + +#: ../../library/filecmp.rst:80 +msgid "" +"The :class:`dircmp` class compares files by doing *shallow* comparisons as " +"described for :func:`filecmp.cmp` by default using the *shallow* parameter." +msgstr "" +":class:`dircmp` 类如 :func:`filecmp.cmp` 所描述的那样默认使用 *shallow* 形参通过执行 *shallow*" +" 比较来比较文件。" + +#: ../../library/filecmp.rst:86 +msgid "Added the *shallow* parameter." +msgstr "增加了 *shallow* 形参。" + +#: ../../library/filecmp.rst:88 +msgid "The :class:`dircmp` class provides the following methods:" +msgstr ":class:`dircmp` 类提供以下方法:" + +#: ../../library/filecmp.rst:92 +msgid "Print (to :data:`sys.stdout`) a comparison between *a* and *b*." +msgstr "将 *a* 与 *b* 之间的比较结果打印 (到 :data:`sys.stdout`)。" + +#: ../../library/filecmp.rst:96 +msgid "" +"Print a comparison between *a* and *b* and common immediate subdirectories." +msgstr "打印 *a* 与 *b* 及共同直接子目录的比较结果。" + +#: ../../library/filecmp.rst:101 +msgid "" +"Print a comparison between *a* and *b* and common subdirectories " +"(recursively)." +msgstr "打印 *a* 与 *b* 及共同子目录比较结果(递归地)。" + +#: ../../library/filecmp.rst:104 +msgid "" +"The :class:`dircmp` class offers a number of interesting attributes that may" +" be used to get various bits of information about the directory trees being " +"compared." +msgstr ":class:`dircmp` 类提供了一些有趣的属性,用以得到关于参与比较的目录树的各种信息。" + +#: ../../library/filecmp.rst:108 +msgid "" +"Note that via :meth:`~object.__getattr__` hooks, all attributes are computed" +" lazily, so there is no speed penalty if only those attributes which are " +"lightweight to compute are used." +msgstr "" +"请注意通过 :meth:`~object.__getattr__` " +"钩子,所有的属性都将被惰性求值,因此如果只需使用那些计算简便的属性就不会有速度上的损失。" + +#: ../../library/filecmp.rst:115 +msgid "The directory *a*." +msgstr "目录 *a* 。" + +#: ../../library/filecmp.rst:120 +msgid "The directory *b*." +msgstr "目录 *b* 。" + +#: ../../library/filecmp.rst:125 +msgid "Files and subdirectories in *a*, filtered by *hide* and *ignore*." +msgstr "经 *hide* 和 *ignore* 过滤,目录 *a* 中的文件与子目录。" + +#: ../../library/filecmp.rst:130 +msgid "Files and subdirectories in *b*, filtered by *hide* and *ignore*." +msgstr "经 *hide* 和 *ignore* 过滤,目录 *b* 中的文件与子目录。" + +#: ../../library/filecmp.rst:135 +msgid "Files and subdirectories in both *a* and *b*." +msgstr "同时存在于目录 *a* 和 *b* 中的文件和子目录。" + +#: ../../library/filecmp.rst:140 +msgid "Files and subdirectories only in *a*." +msgstr "仅在目录 *a* 中的文件和子目录。" + +#: ../../library/filecmp.rst:145 +msgid "Files and subdirectories only in *b*." +msgstr "仅在目录 *b* 中的文件和子目录。" + +#: ../../library/filecmp.rst:150 +msgid "Subdirectories in both *a* and *b*." +msgstr "同时存在于目录 *a* 和 *b* 中的子目录。" + +#: ../../library/filecmp.rst:155 +msgid "Files in both *a* and *b*." +msgstr "同时存在于目录 *a* 和 *b* 中的文件。" + +#: ../../library/filecmp.rst:160 +msgid "" +"Names in both *a* and *b*, such that the type differs between the " +"directories, or names for which :func:`os.stat` reports an error." +msgstr "在目录 *a* 和 *b* 中类型不同的名字,或者那些 :func:`os.stat` 报告错误的名字。" + +#: ../../library/filecmp.rst:166 +msgid "" +"Files which are identical in both *a* and *b*, using the class's file " +"comparison operator." +msgstr "在目录 *a* 和 *b* 中,使用类的文件比较操作符判定相等的文件。" + +#: ../../library/filecmp.rst:172 +msgid "" +"Files which are in both *a* and *b*, whose contents differ according to the " +"class's file comparison operator." +msgstr "在目录 *a* 和 *b* 中,根据类的文件比较操作符判定内容不等的文件。" + +#: ../../library/filecmp.rst:178 +msgid "Files which are in both *a* and *b*, but could not be compared." +msgstr "在目录 *a* 和 *b* 中无法比较的文件。" + +#: ../../library/filecmp.rst:183 +msgid "" +"A dictionary mapping names in :attr:`common_dirs` to :class:`dircmp` " +"instances (or MyDirCmp instances if this instance is of type MyDirCmp, a " +"subclass of :class:`dircmp`)." +msgstr "" +"一个将 :attr:`common_dirs` 中的名称映射到 :class:`dircmp` 实例(或者 MyDirCmp 实例,如果该实例类型为 " +":class:`dircmp` 的子类 MyDirCmp 的话)的字典。" + +#: ../../library/filecmp.rst:187 +msgid "" +"Previously entries were always :class:`dircmp` instances. Now entries are " +"the same type as *self*, if *self* is a subclass of :class:`dircmp`." +msgstr "" +"在之前版本中字典条目总是为 :class:`dircmp` 实例。现在条目将与 *self* 的类型相同,如果 *self* 为 " +":class:`dircmp` 的子类的话。" + +#: ../../library/filecmp.rst:196 +msgid "List of directories ignored by :class:`dircmp` by default." +msgstr "默认被 :class:`dircmp` 忽略的目录列表。" + +#: ../../library/filecmp.rst:199 +msgid "" +"Here is a simplified example of using the ``subdirs`` attribute to search " +"recursively through two directories to show common different files::" +msgstr "下面是一个简单的例子,使用 ``subdirs`` 属性递归搜索两个目录以显示公共差异文件:" + +#: ../../library/filecmp.rst:202 +msgid "" +">>> from filecmp import dircmp\n" +">>> def print_diff_files(dcmp):\n" +"... for name in dcmp.diff_files:\n" +"... print(\"diff_file %s found in %s and %s\" % (name, dcmp.left,\n" +"... dcmp.right))\n" +"... for sub_dcmp in dcmp.subdirs.values():\n" +"... print_diff_files(sub_dcmp)\n" +"...\n" +">>> dcmp = dircmp('dir1', 'dir2')\n" +">>> print_diff_files(dcmp)" +msgstr "" +">>> from filecmp import dircmp\n" +">>> def print_diff_files(dcmp):\n" +"... for name in dcmp.diff_files:\n" +"... print(\"diff_file %s found in %s and %s\" % (name, dcmp.left,\n" +"... dcmp.right))\n" +"... for sub_dcmp in dcmp.subdirs.values():\n" +"... print_diff_files(sub_dcmp)\n" +"...\n" +">>> dcmp = dircmp('dir1', 'dir2')\n" +">>> print_diff_files(dcmp)" diff --git a/library/fileformats.po b/library/fileformats.po new file mode 100644 index 0000000000..c158f451c7 --- /dev/null +++ b/library/fileformats.po @@ -0,0 +1,32 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/fileformats.rst:5 +msgid "File Formats" +msgstr "文件格式" + +#: ../../library/fileformats.rst:7 +msgid "" +"The modules described in this chapter parse various miscellaneous file " +"formats that aren't markup languages and are not related to e-mail." +msgstr "本章中描述的模块解析各种不是标记语言且与电子邮件无关的杂项文件格式。" diff --git a/library/fileinput.po b/library/fileinput.po new file mode 100644 index 0000000000..ad79f262ed --- /dev/null +++ b/library/fileinput.po @@ -0,0 +1,373 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/fileinput.rst:2 +msgid ":mod:`!fileinput` --- Iterate over lines from multiple input streams" +msgstr ":mod:`!fileinput` --- 迭代来自多个输入流的行" + +#: ../../library/fileinput.rst:10 +msgid "**Source code:** :source:`Lib/fileinput.py`" +msgstr "**源代码:** :source:`Lib/fileinput.py`" + +#: ../../library/fileinput.rst:14 +msgid "" +"This module implements a helper class and functions to quickly write a loop " +"over standard input or a list of files. If you just want to read or write " +"one file see :func:`open`." +msgstr "此模块实现了一个辅助类和一些函数用来快速编写访问标准输入或文件列表的循环。如果你只想要读写一个文件请参阅 :func:`open`。" + +#: ../../library/fileinput.rst:18 +msgid "The typical use is::" +msgstr "典型用法为::" + +#: ../../library/fileinput.rst:20 +msgid "" +"import fileinput\n" +"for line in fileinput.input(encoding=\"utf-8\"):\n" +" process(line)" +msgstr "" +"import fileinput\n" +"for line in fileinput.input(encoding=\"utf-8\"):\n" +" process(line)" + +#: ../../library/fileinput.rst:24 +msgid "" +"This iterates over the lines of all files listed in ``sys.argv[1:]``, " +"defaulting to ``sys.stdin`` if the list is empty. If a filename is ``'-'``," +" it is also replaced by ``sys.stdin`` and the optional arguments *mode* and " +"*openhook* are ignored. To specify an alternative list of filenames, pass " +"it as the first argument to :func:`.input`. A single file name is also " +"allowed." +msgstr "" +"此程序会迭代 ``sys.argv[1:]`` 中列出的所有文件内的行,如果列表为空则会使用 ``sys.stdin``。如果有一个文件名为 " +"``'-'``,它也会被替换为 ``sys.stdin`` 并且可选参数 *mode* 和 *openhook* 会被忽略。 " +"要指定替代文件列表,请将其作为第一个参数传给 :func:`.input`。也允许使用单个文件。" + +#: ../../library/fileinput.rst:30 +msgid "" +"All files are opened in text mode by default, but you can override this by " +"specifying the *mode* parameter in the call to :func:`.input` or " +":class:`FileInput`. If an I/O error occurs during opening or reading a " +"file, :exc:`OSError` is raised." +msgstr "" +"所有文件都默认以文本模式打开,但你可以通过在调用 :func:`.input` 或 :class:`FileInput` 时指定 *mode* " +"形参来覆盖此行为。如果在打开或读取文件时发生了 I/O 错误,将会引发 :exc:`OSError`。" + +#: ../../library/fileinput.rst:35 +msgid "" +":exc:`IOError` used to be raised; it is now an alias of :exc:`OSError`." +msgstr "原来会引发 :exc:`IOError`;现在它是 :exc:`OSError` 的别名。" + +#: ../../library/fileinput.rst:38 +msgid "" +"If ``sys.stdin`` is used more than once, the second and further use will " +"return no lines, except perhaps for interactive use, or if it has been " +"explicitly reset (e.g. using ``sys.stdin.seek(0)``)." +msgstr "" +"如果 ``sys.stdin`` 被使用超过一次,则第二次之后的使用将不返回任何行,除非是以交互方式使用,或者是被显式地重置 (例如使用 " +"``sys.stdin.seek(0)``)。" + +#: ../../library/fileinput.rst:42 +msgid "" +"Empty files are opened and immediately closed; the only time their presence " +"in the list of filenames is noticeable at all is when the last file opened " +"is empty." +msgstr "空文件打开后将立即被关闭;它们在文件列表中会被注意到的唯一情况只有当最后打开的文件为空的时候。" + +#: ../../library/fileinput.rst:46 +msgid "" +"Lines are returned with any newlines intact, which means that the last line " +"in a file may not have one." +msgstr "返回的行不会对换行符做任何处理,这意味着文件中的最后一行可能不带换行符。" + +#: ../../library/fileinput.rst:49 +msgid "" +"You can control how files are opened by providing an opening hook via the " +"*openhook* parameter to :func:`fileinput.input` or :func:`FileInput`. The " +"hook must be a function that takes two arguments, *filename* and *mode*, and" +" returns an accordingly opened file-like object. If *encoding* and/or " +"*errors* are specified, they will be passed to the hook as additional " +"keyword arguments. This module provides a :func:`hook_compressed` to support" +" compressed files." +msgstr "" +"你可以通过将 *openhook* 形参传给 :func:`fileinput.input` 或 :func:`FileInput` " +"来提供一个打开钩子以控制文件的打开方式。此钩子必须为一个函数,它接受两个参数,*filename* 和 " +"*mode*,并返回一个以相应模式打开的文件型对象。如果指定了 *encoding* 和/或 " +"*errors*,它们将作为额外的关键字参数被传给这个钩子。此模块提供了一个 :func:`hook_compressed` 来支持压缩文件。" + +#: ../../library/fileinput.rst:56 +msgid "The following function is the primary interface of this module:" +msgstr "以下函数是此模块的主要接口:" + +#: ../../library/fileinput.rst:61 +msgid "" +"Create an instance of the :class:`FileInput` class. The instance will be " +"used as global state for the functions of this module, and is also returned " +"to use during iteration. The parameters to this function will be passed " +"along to the constructor of the :class:`FileInput` class." +msgstr "" +"创建一个 :class:`FileInput` 类的实例。该实例将被用作此模块中函数的全局状态,并且还将在迭代期间被返回使用。 " +"此函数的形参将被继续传递给 :class:`FileInput` 类的构造器。" + +#: ../../library/fileinput.rst:66 +msgid "" +"The :class:`FileInput` instance can be used as a context manager in the " +":keyword:`with` statement. In this example, *input* is closed after the " +":keyword:`!with` statement is exited, even if an exception occurs::" +msgstr "" +":class:`FileInput` 实例可以在 :keyword:`with` 语句中被用作上下文管理器。在这个例子中,*input* 在 " +":keyword:`!with` 语句结束后将会被关闭,即使发生了异常也是如此::" + +#: ../../library/fileinput.rst:70 +msgid "" +"with fileinput.input(files=('spam.txt', 'eggs.txt'), encoding=\"utf-8\") as f:\n" +" for line in f:\n" +" process(line)" +msgstr "" +"with fileinput.input(files=('spam.txt', 'eggs.txt'), encoding=\"utf-8\") as f:\n" +" for line in f:\n" +" process(line)" + +#: ../../library/fileinput.rst:74 ../../library/fileinput.rst:170 +msgid "Can be used as a context manager." +msgstr "可以被用作上下文管理器。" + +#: ../../library/fileinput.rst:77 +msgid "The keyword parameters *mode* and *openhook* are now keyword-only." +msgstr "关键字形参 *mode* 和 *openhook* 现在是仅限关键字形参。" + +#: ../../library/fileinput.rst:80 ../../library/fileinput.rst:176 +#: ../../library/fileinput.rst:210 +msgid "The keyword-only parameter *encoding* and *errors* are added." +msgstr "增加了仅限关键字形参 *encoding* 和 *errors*。" + +#: ../../library/fileinput.rst:84 +msgid "" +"The following functions use the global state created by " +":func:`fileinput.input`; if there is no active state, :exc:`RuntimeError` is" +" raised." +msgstr "" +"下列函数会使用 :func:`fileinput.input` 所创建的全局状态;如果没有活动的状态,则会引发 :exc:`RuntimeError`。" + +#: ../../library/fileinput.rst:90 +msgid "" +"Return the name of the file currently being read. Before the first line has" +" been read, returns ``None``." +msgstr "返回当前被读取的文件名。在第一行被读取之前,返回 ``None``。" + +#: ../../library/fileinput.rst:96 +msgid "" +"Return the integer \"file descriptor\" for the current file. When no file is" +" opened (before the first line and between files), returns ``-1``." +msgstr "返回以整数表示的当前文件“文件描述符”。当未打开文件时(处在第一行和文件之间),返回 ``-1``。" + +#: ../../library/fileinput.rst:102 +msgid "" +"Return the cumulative line number of the line that has just been read. " +"Before the first line has been read, returns ``0``. After the last line of " +"the last file has been read, returns the line number of that line." +msgstr "返回已被读取的累计行号。在第一行被读取之前,返回 ``0``。在最后一个文件的最后一行被读取之后,返回该行的行号。" + +#: ../../library/fileinput.rst:109 +msgid "" +"Return the line number in the current file. Before the first line has been " +"read, returns ``0``. After the last line of the last file has been read, " +"returns the line number of that line within the file." +msgstr "返回当前文件中的行号。在第一行被读取之前,返回 ``0``。在最后一个文件的最后一行被读取之后,返回此文件中该行的行号。" + +#: ../../library/fileinput.rst:116 +msgid "" +"Return ``True`` if the line just read is the first line of its file, " +"otherwise return ``False``." +msgstr "如果刚读取的行是其所在文件的第一行则返回 ``True``,否则返回 ``False``。" + +#: ../../library/fileinput.rst:122 +msgid "" +"Return ``True`` if the last line was read from ``sys.stdin``, otherwise " +"return ``False``." +msgstr "如果最后读取的行来自 ``sys.stdin`` 则返回 ``True``,否则返回 ``False``。" + +#: ../../library/fileinput.rst:128 +msgid "" +"Close the current file so that the next iteration will read the first line " +"from the next file (if any); lines not read from the file will not count " +"towards the cumulative line count. The filename is not changed until after " +"the first line of the next file has been read. Before the first line has " +"been read, this function has no effect; it cannot be used to skip the first " +"file. After the last line of the last file has been read, this function has" +" no effect." +msgstr "" +"关闭当前文件以使下次迭代将从下一个文件(如果存在)读取第一行;不是从该文件读取的行将不会被计入累计行数。 " +"直到下一个文件的第一行被读取之后文件名才会改变。在第一行被读取之前,此函数将不会生效;它不能被用来跳过第一个文件。 " +"在最后一个文件的最后一行被读取之后,此函数将不再生效。" + +#: ../../library/fileinput.rst:138 +msgid "Close the sequence." +msgstr "关闭序列。" + +#: ../../library/fileinput.rst:140 +msgid "" +"The class which implements the sequence behavior provided by the module is " +"available for subclassing as well:" +msgstr "此模块所提供的实现了序列行为的类同样也可用于子类化:" + +#: ../../library/fileinput.rst:146 +msgid "" +"Class :class:`FileInput` is the implementation; its methods " +":meth:`filename`, :meth:`fileno`, :meth:`lineno`, :meth:`filelineno`, " +":meth:`isfirstline`, :meth:`isstdin`, :meth:`nextfile` and :meth:`close` " +"correspond to the functions of the same name in the module. In addition it " +"is :term:`iterable` and has a :meth:`~io.TextIOBase.readline` method which " +"returns the next input line. The sequence must be accessed in strictly " +"sequential order; random access and :meth:`~io.TextIOBase.readline` cannot " +"be mixed." +msgstr "" +"类 :class:`FileInput` 是具体的实现;它的方法 :meth:`filename`, :meth:`fileno`, " +":meth:`lineno`, :meth:`filelineno`, :meth:`isfirstline`, :meth:`isstdin`, " +":meth:`nextfile` 和 :meth:`close` 对应于此模块具有相同名称的函数。此外它还是一个 :term:`iterable` " +"并且具有可返回下一个输入行的 :meth:`~io.TextIOBase.readline` 方法。此序列必须以严格的序列顺序来访问;随机访问和 " +":meth:`~io.TextIOBase.readline` 不可被混用。" + +#: ../../library/fileinput.rst:154 +msgid "" +"With *mode* you can specify which file mode will be passed to :func:`open`. " +"It must be one of ``'r'`` and ``'rb'``." +msgstr "通过 *mode* 你可以指定要传给 :func:`open` 的文件模式。它必须为 ``'r'`` 和 ``'rb'`` 中的一个。" + +#: ../../library/fileinput.rst:157 +msgid "" +"The *openhook*, when given, must be a function that takes two arguments, " +"*filename* and *mode*, and returns an accordingly opened file-like object. " +"You cannot use *inplace* and *openhook* together." +msgstr "" +"*openhook* 如果给出则必须为一个函数,它接受两个参数 *filename* 和 *mode*,并相应地返回一个打开的文件型对象。 " +"你不能同时使用 *inplace* 和 *openhook*。" + +#: ../../library/fileinput.rst:161 +msgid "" +"You can specify *encoding* and *errors* that is passed to :func:`open` or " +"*openhook*." +msgstr "你可以指定 *encoding* 和 *errors* 来将其传给 :func:`open` 或 *openhook*。" + +#: ../../library/fileinput.rst:163 +msgid "" +"A :class:`FileInput` instance can be used as a context manager in the " +":keyword:`with` statement. In this example, *input* is closed after the " +":keyword:`!with` statement is exited, even if an exception occurs::" +msgstr "" +":class:`FileInput` 实例可以在 :keyword:`with` 语句中被用作上下文管理器。在这个例子中,*input* 在 " +":keyword:`!with` 语句结束后将会被关闭,即使发生了异常也是如此::" + +#: ../../library/fileinput.rst:167 +msgid "" +"with FileInput(files=('spam.txt', 'eggs.txt')) as input:\n" +" process(input)" +msgstr "" +"with FileInput(files=('spam.txt', 'eggs.txt')) as input:\n" +" process(input)" + +#: ../../library/fileinput.rst:173 +msgid "The keyword parameter *mode* and *openhook* are now keyword-only." +msgstr "关键字形参 *mode* 和 *openhook* 现在是仅限关键字形参。" + +#: ../../library/fileinput.rst:179 +msgid "" +"The ``'rU'`` and ``'U'`` modes and the :meth:`!__getitem__` method have been" +" removed." +msgstr "``'rU'`` 和 ``'U'`` 模式以及 :meth:`!__getitem__` 方法已被移除。" + +#: ../../library/fileinput.rst:184 +msgid "" +"**Optional in-place filtering:** if the keyword argument ``inplace=True`` is" +" passed to :func:`fileinput.input` or to the :class:`FileInput` constructor," +" the file is moved to a backup file and standard output is directed to the " +"input file (if a file of the same name as the backup file already exists, it" +" will be replaced silently). This makes it possible to write a filter that " +"rewrites its input file in place. If the *backup* parameter is given " +"(typically as ``backup='.'``), it specifies the extension " +"for the backup file, and the backup file remains around; by default, the " +"extension is ``'.bak'`` and it is deleted when the output file is closed. " +"In-place filtering is disabled when standard input is read." +msgstr "" +"**可选的原地过滤:** 如果传递了关键字参数 ``inplace=True`` 给 :func:`fileinput.input` 或 " +":class:`FileInput` 构造器,则文件会被移至备份文件并将标准输出定向到输入文件(如果已存在与备份文件同名的文件,它将被静默地替换)。 " +"这使得编写一个能够原地重写其输入文件的过滤器成为可能。如果给出了 *backup* 形参 (通常形式为 ``backup='.'``),它将指定备份文件的扩展名,并且备份文件会被保留;默认情况下扩展名为 ``'.bak'`` 并且它会在输出文件关闭时被删除。" +" 在读取标准输入时原地过滤会被禁用。" + +#: ../../library/fileinput.rst:196 +msgid "The two following opening hooks are provided by this module:" +msgstr "此模块提供了以下两种打开文件钩子:" + +#: ../../library/fileinput.rst:200 +msgid "" +"Transparently opens files compressed with gzip and bzip2 (recognized by the " +"extensions ``'.gz'`` and ``'.bz2'``) using the :mod:`gzip` and :mod:`bz2` " +"modules. If the filename extension is not ``'.gz'`` or ``'.bz2'``, the file" +" is opened normally (ie, using :func:`open` without any decompression)." +msgstr "" +"使用 :mod:`gzip` 和 :mod:`bz2` 模块透明地打开 gzip 和 bzip2 压缩的文件(通过扩展名 ``'.gz'`` 和 " +"``'.bz2'`` 来识别)。如果文件扩展名不是 ``'.gz'`` 或 ``'.bz2'``,文件会以正常方式打开(即使用 :func:`open`" +" 并且不带任何解压操作)。" + +#: ../../library/fileinput.rst:205 +msgid "" +"The *encoding* and *errors* values are passed to :class:`io.TextIOWrapper` " +"for compressed files and open for normal files." +msgstr "*encoding* 和 *errors* 值会被传给 :class:`io.TextIOWrapper` 用于压缩文件以及打开普通文件。" + +#: ../../library/fileinput.rst:208 +msgid "" +"Usage example: ``fi = " +"fileinput.FileInput(openhook=fileinput.hook_compressed, " +"encoding=\"utf-8\")``" +msgstr "" +"用法示例: ``fi = fileinput.FileInput(openhook=fileinput.hook_compressed, " +"encoding=\"utf-8\")``" + +#: ../../library/fileinput.rst:216 +msgid "" +"Returns a hook which opens each file with :func:`open`, using the given " +"*encoding* and *errors* to read the file." +msgstr "返回一个通过 :func:`open` 打开每个文件的钩子,使用给定的 *encoding* 和 *errors* 来读取文件。" + +#: ../../library/fileinput.rst:219 +msgid "" +"Usage example: ``fi = " +"fileinput.FileInput(openhook=fileinput.hook_encoded(\"utf-8\", " +"\"surrogateescape\"))``" +msgstr "" +"使用示例: ``fi = fileinput.FileInput(openhook=fileinput.hook_encoded(\"utf-8\", " +"\"surrogateescape\"))``" + +#: ../../library/fileinput.rst:223 +msgid "Added the optional *errors* parameter." +msgstr "添加了可选的 *errors* 形参。" + +#: ../../library/fileinput.rst:226 +msgid "" +"This function is deprecated since :func:`fileinput.input` and " +":class:`FileInput` now have *encoding* and *errors* parameters." +msgstr "" +"此函数已被弃用,因为 :func:`fileinput.input` 和 :class:`FileInput` 现在有了 *encoding* 和 " +"*errors* 形参。" diff --git a/library/filesys.po b/library/filesys.po new file mode 100644 index 0000000000..86a6d4e0c2 --- /dev/null +++ b/library/filesys.po @@ -0,0 +1,62 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/filesys.rst:5 +msgid "File and Directory Access" +msgstr "文件和目录访问" + +#: ../../library/filesys.rst:7 +msgid "" +"The modules described in this chapter deal with disk files and directories." +" For example, there are modules for reading the properties of files, " +"manipulating paths in a portable way, and creating temporary files. The " +"full list of modules in this chapter is:" +msgstr "本章中描述的模块处理磁盘文件和目录。例如,有一些模块用于读取文件的属性,以可移植的方式操作路径以及创建临时文件。本章的完整模块列表如下:" + +#: ../../library/filesys.rst:28 +msgid "Module :mod:`os`" +msgstr "模块 :mod:`os`" + +#: ../../library/filesys.rst:29 +msgid "" +"Operating system interfaces, including functions to work with files at a " +"lower level than Python :term:`file objects `." +msgstr "操作系统接口,包括处理比 Python :term:`文件对象 ` 更低级别文件的函数。" + +#: ../../library/filesys.rst:32 +msgid "Module :mod:`io`" +msgstr "模块 :mod:`io`" + +#: ../../library/filesys.rst:33 +msgid "" +"Python's built-in I/O library, including both abstract classes and some " +"concrete classes such as file I/O." +msgstr "Python 的内置 I/O 库,包括抽象类和一些具体的类,如文件 I/O。" + +#: ../../library/filesys.rst:36 +msgid "Built-in function :func:`open`" +msgstr "内置函数 :func:`open`" + +#: ../../library/filesys.rst:37 +msgid "The standard way to open files for reading and writing with Python." +msgstr "使用 Python 打开文件进行读写的标准方法。" diff --git a/library/fnmatch.po b/library/fnmatch.po new file mode 100644 index 0000000000..d4d621c00b --- /dev/null +++ b/library/fnmatch.po @@ -0,0 +1,246 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/fnmatch.rst:2 +msgid ":mod:`!fnmatch` --- Unix filename pattern matching" +msgstr ":mod:`!fnmatch` --- Unix 文件名模式匹配" + +#: ../../library/fnmatch.rst:7 +msgid "**Source code:** :source:`Lib/fnmatch.py`" +msgstr "**源代码:** :source:`Lib/fnmatch.py`" + +#: ../../library/fnmatch.rst:15 +msgid "" +"This module provides support for Unix shell-style wildcards, which are *not*" +" the same as regular expressions (which are documented in the :mod:`re` " +"module). The special characters used in shell-style wildcards are:" +msgstr "" +"此模块提供了 Unix shell 风格的通配符,它们 *并不* 等同于正则表达式(关于后者的文档参见 :mod:`re` 模块)。shell " +"风格通配符所使用的特殊字符如下:" + +#: ../../library/fnmatch.rst:27 +msgid "Pattern" +msgstr "模式" + +#: ../../library/fnmatch.rst:27 +msgid "Meaning" +msgstr "含义" + +#: ../../library/fnmatch.rst:29 +msgid "``*``" +msgstr "``*``" + +#: ../../library/fnmatch.rst:29 +msgid "matches everything" +msgstr "匹配所有" + +#: ../../library/fnmatch.rst:31 +msgid "``?``" +msgstr "``?``" + +#: ../../library/fnmatch.rst:31 +msgid "matches any single character" +msgstr "匹配任何单个字符" + +#: ../../library/fnmatch.rst:33 +msgid "``[seq]``" +msgstr "``[seq]``" + +#: ../../library/fnmatch.rst:33 +msgid "matches any character in *seq*" +msgstr "匹配 *seq* 中的任何字符" + +#: ../../library/fnmatch.rst:35 +msgid "``[!seq]``" +msgstr "``[!seq]``" + +#: ../../library/fnmatch.rst:35 +msgid "matches any character not in *seq*" +msgstr "匹配任何不在 *seq* 中的字符" + +#: ../../library/fnmatch.rst:38 +msgid "" +"For a literal match, wrap the meta-characters in brackets. For example, " +"``'[?]'`` matches the character ``'?'``." +msgstr "对于字面值匹配,请将原字符用方括号括起来。例如,``'[?]'`` 将匹配字符 ``'?'``。" + +#: ../../library/fnmatch.rst:43 +msgid "" +"Note that the filename separator (``'/'`` on Unix) is *not* special to this " +"module. See module :mod:`glob` for pathname expansion (:mod:`glob` uses " +":func:`.filter` to match pathname segments). Similarly, filenames starting " +"with a period are not special for this module, and are matched by the ``*`` " +"and ``?`` patterns." +msgstr "" +"注意文件名分隔符 (Unix 上为 ``'/'``) *不会* 被此模块特别对待。请参见 :mod:`glob` 模块了解文件名扩展 " +"(:mod:`glob` 使用 :func:`.filter` 来匹配文件名的各个部分)。 " +"类似地,以一个句点打头的文件名也不会被此模块特别对待,可以通过 ``*`` 和 ``?`` 模式来匹配。" + +#: ../../library/fnmatch.rst:49 +msgid "" +"Unless stated otherwise, \"filename string\" and \"pattern string\" either " +"refer to :class:`str` or ``ISO-8859-1`` encoded :class:`bytes` objects. Note" +" that the functions documented below do not allow to mix a :class:`!bytes` " +"pattern with a :class:`!str` filename, and vice-versa." +msgstr "" +"除非另有说明,\"文件名字符串\" 和 \"模式字符串\" 是指使用 :class:`str` 或 ``ISO-8859-1`` 编码的 " +":class:`bytes` 对象。请注意下面记录的函数不允许将 :class:`!bytes` 模式与 :class:`!str` " +"文件名混用,反之亦然。" + +#: ../../library/fnmatch.rst:54 +msgid "" +"Finally, note that :func:`functools.lru_cache` with a *maxsize* of 32768 is " +"used to cache the (typed) compiled regex patterns in the following " +"functions: :func:`fnmatch`, :func:`fnmatchcase`, :func:`.filter`, " +":func:`.filterfalse`." +msgstr "" +"最后,请注意 *maxsize* 为 32768 的 :func:`functools.lru_cache` " +"将被用于缓存下列函数中(标注类型的)已编译正则表达式: " +":func:`fnmatch`、:func:`fnmatchcase`、:func:`.filter`、:func:`.filterfalse`。" + +#: ../../library/fnmatch.rst:61 +msgid "" +"Test whether the filename string *name* matches the pattern string *pat*, " +"returning ``True`` or ``False``. Both parameters are case-normalized using " +":func:`os.path.normcase`. :func:`fnmatchcase` can be used to perform a case-" +"sensitive comparison, regardless of whether that's standard for the " +"operating system." +msgstr "" +"检测文件名字符串 *name* 是否匹配模式字符串 *pat*,返回 ``True`` 或 ``False``。两个形参都会使用 " +":func:`os.path.normcase` 进行大小写正规化。 :func:`fnmatchcase` " +"可被用于执行大小写敏感的比较,无论这是否为所在操作系统的标准。" + +#: ../../library/fnmatch.rst:67 +msgid "" +"This example will print all file names in the current directory with the " +"extension ``.txt``::" +msgstr "这个例子将打印当前目录下带有扩展名 ``.txt`` 的所有文件名::" + +#: ../../library/fnmatch.rst:70 +msgid "" +"import fnmatch\n" +"import os\n" +"\n" +"for file in os.listdir('.'):\n" +" if fnmatch.fnmatch(file, '*.txt'):\n" +" print(file)" +msgstr "" +"import fnmatch\n" +"import os\n" +"\n" +"for file in os.listdir('.'):\n" +" if fnmatch.fnmatch(file, '*.txt'):\n" +" print(file)" + +#: ../../library/fnmatch.rst:80 +msgid "" +"Test whether the filename string *name* matches the pattern string *pat*, " +"returning ``True`` or ``False``; the comparison is case-sensitive and does " +"not apply :func:`os.path.normcase`." +msgstr "" +"检测文件名字符串 *name* 是否匹配模式字符串 *pat*,返回 ``True`` 或 ``False``;此比较是大小写敏感的并且不会应用 " +":func:`os.path.normcase`." + +#: ../../library/fnmatch.rst:87 +msgid "" +"Construct a list from those elements of the :term:`iterable` of filename " +"strings *names* that match the pattern string *pat*. It is the same as ``[n " +"for n in names if fnmatch(n, pat)]``, but implemented more efficiently." +msgstr "" +"基于包含匹配模式字符串 *pat* 的文件名字符串 *names* 的 :term:`iterable` 构造一个列表。它等价于 ``[n for n " +"in names if fnmatch(n, pat)]``,但实现得更为高效。" + +#: ../../library/fnmatch.rst:95 +msgid "" +"Construct a list from those elements of the :term:`iterable` of filename " +"strings *names* that do not match the pattern string *pat*. It is the same " +"as ``[n for n in names if not fnmatch(n, pat)]``, but implemented more " +"efficiently." +msgstr "" +"根据不能匹配模式字符串 *pat* 的文件名字符串 *names* 的 :term:`iterable` 中的元素构造一个列表。它相当于 ``[n " +"for n in names if not fnmatch(n, pat)]``,但实现得更为高效。" + +#: ../../library/fnmatch.rst:105 +msgid "" +"Return the shell-style pattern *pat* converted to a regular expression for " +"using with :func:`re.prefixmatch`. The pattern is expected to be a " +":class:`str`." +msgstr "" + +#: ../../library/fnmatch.rst:109 +msgid "Example:" +msgstr "示例:" + +#: ../../library/fnmatch.rst:123 +msgid "Module :mod:`glob`" +msgstr "模块 :mod:`glob`" + +#: ../../library/fnmatch.rst:124 +msgid "Unix shell-style path expansion." +msgstr "Unix shell 风格路径扩展。" + +#: ../../library/fnmatch.rst:9 +msgid "filenames" +msgstr "文件名" + +#: ../../library/fnmatch.rst:9 +msgid "wildcard expansion" +msgstr "通配符扩展" + +#: ../../library/fnmatch.rst:11 ../../library/fnmatch.rst:41 +msgid "module" +msgstr "module" + +#: ../../library/fnmatch.rst:11 +msgid "re" +msgstr "re" + +#: ../../library/fnmatch.rst:19 +msgid "* (asterisk)" +msgstr "* (星号)" + +#: ../../library/fnmatch.rst:19 +msgid "in glob-style wildcards" +msgstr "使用 glob 风格的通配符" + +#: ../../library/fnmatch.rst:19 +msgid "? (question mark)" +msgstr "? (问号)" + +#: ../../library/fnmatch.rst:19 +msgid "[] (square brackets)" +msgstr "[] (方括号)" + +#: ../../library/fnmatch.rst:19 +msgid "! (exclamation)" +msgstr "! (感叹号)" + +#: ../../library/fnmatch.rst:19 +msgid "- (minus)" +msgstr "- (减号)" + +#: ../../library/fnmatch.rst:41 +msgid "glob" +msgstr "glob" diff --git a/library/fractions.po b/library/fractions.po new file mode 100644 index 0000000000..e0f85e8e1b --- /dev/null +++ b/library/fractions.po @@ -0,0 +1,404 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/fractions.rst:2 +msgid ":mod:`!fractions` --- Rational numbers" +msgstr ":mod:`!fractions` --- 有理数" + +#: ../../library/fractions.rst:10 +msgid "**Source code:** :source:`Lib/fractions.py`" +msgstr "**源代码:** :source:`Lib/fractions.py`" + +#: ../../library/fractions.rst:14 +msgid "" +"The :mod:`!fractions` module provides support for rational number " +"arithmetic." +msgstr ":mod:`!fractions` 模块提供了对有理数算术的支持。" + +#: ../../library/fractions.rst:17 +msgid "" +"A Fraction instance can be constructed from a pair of rational numbers, from" +" a single number, or from a string." +msgstr "Fraction 实例可以由一对有理数、一个单独数字或一个字符串构建而成。" + +#: ../../library/fractions.rst:26 +msgid "" +"The first version requires that *numerator* and *denominator* are instances " +"of :class:`numbers.Rational` and returns a new :class:`Fraction` instance " +"with a value equal to ``numerator/denominator``. If *denominator* is zero, " +"it raises a :exc:`ZeroDivisionError`." +msgstr "" +"第一个版本要求 *numerator* 和 *denominator* 是 :class:`numbers.Rational` 的实例并返回一个新的 " +":class:`Fraction` 实例且其值等于 ``numerator/denominator``。如果 *denominator* 为零,则会引发" +" :exc:`ZeroDivisionError`。" + +#: ../../library/fractions.rst:31 +msgid "" +"The second version requires that *number* is an instance of " +":class:`numbers.Rational` or has the :meth:`!as_integer_ratio` method (this " +"includes :class:`float` and :class:`decimal.Decimal`). It returns a " +":class:`Fraction` instance with exactly the same value. Assumed, that the " +":meth:`!as_integer_ratio` method returns a pair of coprime integers and last" +" one is positive. Note that due to the usual issues with binary point (see " +":ref:`tut-fp-issues`), the argument to ``Fraction(1.1)`` is not exactly " +"equal to 11/10, and so ``Fraction(1.1)`` does *not* return ``Fraction(11, " +"10)`` as one might expect. (But see the documentation for the " +":meth:`limit_denominator` method below.)" +msgstr "" +"第二个版本要求 *number* 是 :class:`numbers.Rational` 的实例,或有 " +":meth:`!as_integer_ratio` 方法 (这包括 :class:`float` 和 " +":class:`decimal.Decimal`)。它返回一个具有完全相同值的 :class:`Fraction` 实例。假设 " +":meth:`!as_integer_ratio` 方法返回一对互质整数,后一个是正整数。请注意,由于二进制浮点数的常见问题 (参见 " +":ref:`tut-fp-issues`),``Fraction(1.1)`` 的参数并不完全等于 11/10,因此 ``Fraction(1.1)``" +" 不会像人们所期望的那样返回 ``Fraction(11, 10)``。 (但请参阅下面的 :meth:`limit_denominator` " +"方法的文档。)" + +#: ../../library/fractions.rst:43 +msgid "" +"The last version of the constructor expects a string. The usual form for " +"this instance is::" +msgstr "构造器的最后一个版本需要一个字符串。此实例的常见形式是::" + +#: ../../library/fractions.rst:46 +msgid "[sign] numerator ['/' denominator]" +msgstr "[sign] numerator ['/' denominator]" + +#: ../../library/fractions.rst:48 +msgid "" +"where the optional ``sign`` may be either '+' or '-' and ``numerator`` and " +"``denominator`` (if present) are strings of decimal digits (underscores may " +"be used to delimit digits as with integral literals in code). In addition, " +"any string that represents a finite value and is accepted by the " +":class:`float` constructor is also accepted by the :class:`Fraction` " +"constructor. In either form the input string may also have leading and/or " +"trailing whitespace. Here are some examples::" +msgstr "" +"其中的可选项 ``sign`` 可能为 '+' 或 '-' 且 ``numerator`` 和 ``denominator`` (如果存在) " +"是十进制数码的字符串 (可以如代码中的整数字面值一样使用下划线来分隔数码)。此外,:class:`float` " +"构造器所接受的任何代表一个有限值的字符串也都为 :class:`Fraction` 构造器所接受。不论哪 " +"种形式的输入字符串也都可以带有开头和/或末尾空格符。这里是一些示例::" + +#: ../../library/fractions.rst:57 +msgid "" +">>> from fractions import Fraction\n" +">>> Fraction(16, -10)\n" +"Fraction(-8, 5)\n" +">>> Fraction(123)\n" +"Fraction(123, 1)\n" +">>> Fraction()\n" +"Fraction(0, 1)\n" +">>> Fraction('3/7')\n" +"Fraction(3, 7)\n" +">>> Fraction(' -3/7 ')\n" +"Fraction(-3, 7)\n" +">>> Fraction('1.414213 \\t\\n')\n" +"Fraction(1414213, 1000000)\n" +">>> Fraction('-.125')\n" +"Fraction(-1, 8)\n" +">>> Fraction('7e-6')\n" +"Fraction(7, 1000000)\n" +">>> Fraction(2.25)\n" +"Fraction(9, 4)\n" +">>> Fraction(1.1)\n" +"Fraction(2476979795053773, 2251799813685248)\n" +">>> from decimal import Decimal\n" +">>> Fraction(Decimal('1.1'))\n" +"Fraction(11, 10)" +msgstr "" +">>> from fractions import Fraction\n" +">>> Fraction(16, -10)\n" +"Fraction(-8, 5)\n" +">>> Fraction(123)\n" +"Fraction(123, 1)\n" +">>> Fraction()\n" +"Fraction(0, 1)\n" +">>> Fraction('3/7')\n" +"Fraction(3, 7)\n" +">>> Fraction(' -3/7 ')\n" +"Fraction(-3, 7)\n" +">>> Fraction('1.414213 \\t\\n')\n" +"Fraction(1414213, 1000000)\n" +">>> Fraction('-.125')\n" +"Fraction(-1, 8)\n" +">>> Fraction('7e-6')\n" +"Fraction(7, 1000000)\n" +">>> Fraction(2.25)\n" +"Fraction(9, 4)\n" +">>> Fraction(1.1)\n" +"Fraction(2476979795053773, 2251799813685248)\n" +">>> from decimal import Decimal\n" +">>> Fraction(Decimal('1.1'))\n" +"Fraction(11, 10)" + +#: ../../library/fractions.rst:83 +msgid "" +"The :class:`Fraction` class inherits from the abstract base class " +":class:`numbers.Rational`, and implements all of the methods and operations " +"from that class. :class:`Fraction` instances are :term:`hashable`, and " +"should be treated as immutable. In addition, :class:`Fraction` has the " +"following properties and methods:" +msgstr "" +":class:`Fraction` 类继承自抽象基类 :class:`numbers.Rational`,并实现了该类的所有方法和操作。 " +":class:`Fraction` 实例是 :term:`hashable` 对象,并应当被视为不可变对象。此外,:class:`Fraction` " +"还具有以下特征属性和方法:" + +#: ../../library/fractions.rst:89 +msgid "" +"The :class:`Fraction` constructor now accepts :class:`float` and " +":class:`decimal.Decimal` instances." +msgstr "" +":class:`Fraction` 构造器现在接受 :class:`float` 和 :class:`decimal.Decimal` 实例。" + +#: ../../library/fractions.rst:93 +msgid "" +"The :func:`math.gcd` function is now used to normalize the *numerator* and " +"*denominator*. :func:`math.gcd` always returns an :class:`int` type. " +"Previously, the GCD type depended on *numerator* and *denominator*." +msgstr "" +"现在会使用 :func:`math.gcd` 函数来正规化 *numerator* 和 *denominator*。 :func:`math.gcd` " +"总是返回 :class:`int` 类型。在之前版本中,GCD 的类型取决于 *numerator* 和 *denominator* 的类型。" + +#: ../../library/fractions.rst:98 +msgid "" +"Underscores are now permitted when creating a :class:`Fraction` instance " +"from a string, following :PEP:`515` rules." +msgstr "现在当使用字符串创建 :class:`Fraction` 实例时已允许使用下划线,遵循 :PEP:`515` 规则。" + +#: ../../library/fractions.rst:102 +msgid "" +":class:`Fraction` implements ``__int__`` now to satisfy " +"``typing.SupportsInt`` instance checks." +msgstr ":class:`Fraction` 现在实现了 ``__int__`` 以满足 ``typing.SupportsInt`` 实例检测。" + +#: ../../library/fractions.rst:106 +msgid "" +"Space is allowed around the slash for string inputs: ``Fraction('2 / 3')``." +msgstr "允许字符串输入在斜杠两边添加空格: ``Fraction('2 / 3')``。" + +#: ../../library/fractions.rst:109 +msgid "" +":class:`Fraction` instances now support float-style formatting, with " +"presentation types ``\"e\"``, ``\"E\"``, ``\"f\"``, ``\"F\"``, ``\"g\"``, " +"``\"G\"`` and ``\"%\"\"``." +msgstr "" +":class:`Fraction` 实例现在支持浮点风格的格式化,使用 ``\"e\"``, ``\"E\"``, ``\"f\"``, " +"``\"F\"``, ``\"g\"``, ``\"G\"`` 和 ``\"%\"\"`` 等表示类型。" + +#: ../../library/fractions.rst:114 +msgid "" +"Formatting of :class:`Fraction` instances without a presentation type now " +"supports fill, alignment, sign handling, minimum width and grouping." +msgstr "没有表示类型的 :class:`Fraction` 实例的格式化现在支持填充、对齐、正负号处理、最小宽度和分组。" + +#: ../../library/fractions.rst:118 +msgid "" +"The :class:`Fraction` constructor now accepts any objects with the " +":meth:`!as_integer_ratio` method." +msgstr ":class:`Fraction` 构造器现在接受任何有 :meth:`!as_integer_ratio` 方法的对象。" + +#: ../../library/fractions.rst:124 +msgid "Numerator of the Fraction in lowest term." +msgstr "最简分数形式的分子。" + +#: ../../library/fractions.rst:128 +msgid "" +"Denominator of the Fraction in lowest terms. Guaranteed to be positive." +msgstr "最简分数形式的分母。保证为正数。" + +#: ../../library/fractions.rst:134 +msgid "" +"Return a tuple of two integers, whose ratio is equal to the original " +"Fraction. The ratio is in lowest terms and has a positive denominator." +msgstr "返回由两个整数组成的元组,两数之比等于原 Fraction 的值,为最简形式且其分母为正数。" + +#: ../../library/fractions.rst:142 +msgid "Return ``True`` if the Fraction is an integer." +msgstr "如果 Fraction 为整数则返回 ``True``。" + +#: ../../library/fractions.rst:148 +msgid "" +"Alternative constructor which only accepts instances of :class:`float` or " +":class:`numbers.Integral`. Beware that ``Fraction.from_float(0.3)`` is not " +"the same value as ``Fraction(3, 10)``." +msgstr "" +"只接受 :class:`float` 或 :class:`numbers.Integral` 实例的替代性构造器。请注意 " +"``Fraction.from_float(0.3)`` 与 ``Fraction(3, 10)`` 的值是不同的。" + +#: ../../library/fractions.rst:154 +msgid "" +"From Python 3.2 onwards, you can also construct a :class:`Fraction` instance" +" directly from a :class:`float`." +msgstr "从 Python 3.2 开始,在构造 :class:`Fraction` 实例时可以直接使用 :class:`float`。" + +#: ../../library/fractions.rst:160 +msgid "" +"Alternative constructor which only accepts instances of " +":class:`decimal.Decimal` or :class:`numbers.Integral`." +msgstr "只接受 :class:`decimal.Decimal` 或 :class:`numbers.Integral` 实例的替代性构造器。" + +#: ../../library/fractions.rst:165 +msgid "" +"From Python 3.2 onwards, you can also construct a :class:`Fraction` instance" +" directly from a :class:`decimal.Decimal` instance." +msgstr "" +"从 Python 3.2 开始,在构造 :class:`Fraction` 实例时可以直接使用 :class:`decimal.Decimal` 实例。" + +#: ../../library/fractions.rst:172 +msgid "" +"Alternative constructor which only accepts instances of " +":class:`numbers.Integral`, :class:`numbers.Rational`, :class:`float` or " +":class:`decimal.Decimal`, and objects with the :meth:`!as_integer_ratio` " +"method, but not strings." +msgstr "" +"另一种构造器,只接受 " +":class:`numbers.Integral`、:class:`numbers.Rational`、:class:`float` 或 " +":class:`decimal.Decimal` 的实例,以及带有 :meth:`!as_integer_ratio` 方法但不是字符串的对象。" + +#: ../../library/fractions.rst:182 +msgid "" +"Finds and returns the closest :class:`Fraction` to ``self`` that has " +"denominator at most max_denominator. This method is useful for finding " +"rational approximations to a given floating-point number:" +msgstr "" +"找到并返回一个 :class:`Fraction` 使得其值最接近 ``self`` 并且分母不大于 max_denominator。 " +"此方法适用于找出给定浮点数的有理数近似值:" + +#: ../../library/fractions.rst:190 +msgid "or for recovering a rational number that's represented as a float:" +msgstr "或是用来恢复被表示为一个浮点数的有理数:" + +#: ../../library/fractions.rst:203 +msgid "" +"Returns the greatest :class:`int` ``<= self``. This method can also be " +"accessed through the :func:`math.floor` function:" +msgstr "返回最大的 :class:`int` ``<= self``。此方法也可通过 :func:`math.floor` 函数来使用:" + +#: ../../library/fractions.rst:213 +msgid "" +"Returns the least :class:`int` ``>= self``. This method can also be " +"accessed through the :func:`math.ceil` function." +msgstr "返回最小的 :class:`int` ``>= self``。此方法也可通过 :func:`math.ceil` 函数来使用。" + +#: ../../library/fractions.rst:220 +msgid "" +"The first version returns the nearest :class:`int` to ``self``, rounding " +"half to even. The second version rounds ``self`` to the nearest multiple of " +"``Fraction(1, 10**ndigits)`` (logically, if ``ndigits`` is negative), again " +"rounding half toward even. This method can also be accessed through the " +":func:`round` function." +msgstr "" +"第一个版本返回一个 :class:`int` 使得其值最接近 ``self``,位值为二分之一时只对偶数舍入。第二个版本会将 ``self`` " +"舍入到最接近 ``Fraction(1, 10**ndigits)`` 的倍数(逻辑上,如果 ``ndigits`` " +"为负值),位值为二分之一时同样只对偶数舍入。此方法也可通过 :func:`round` 函数来使用。" + +#: ../../library/fractions.rst:228 +msgid "" +"Provides support for formatting of :class:`Fraction` instances via the " +":meth:`str.format` method, the :func:`format` built-in function, or " +":ref:`Formatted string literals `." +msgstr "" +"通过 :meth:`str.format` 方法、:func:`format` 内置函数或 :ref:`格式化字符串字面值 ` " +"提供对 :class:`Fraction` 实例格式化的支持。" + +#: ../../library/fractions.rst:232 +msgid "" +"If the ``format_spec`` format specification string does not end with one of " +"the presentation types ``'e'``, ``'E'``, ``'f'``, ``'F'``, ``'g'``, ``'G'`` " +"or ``'%'`` then formatting follows the general rules for fill, alignment, " +"sign handling, minimum width, and grouping as described in the :ref:`format " +"specification mini-language `. The \"alternate form\" flag " +"``'#'`` is supported: if present, it forces the output string to always " +"include an explicit denominator, even when the value being formatted is an " +"exact integer. The zero-fill flag ``'0'`` is not supported." +msgstr "" +"如果 ``format_spec`` 格式说明字符串末尾不带表示类型 ``'e'``, ``'E'``, ``'f'``, ``'F'``, " +"``'g'``, ``'G'`` 或 ``'%'`` 之一则格式化操作将遵循在 :ref:`格式说明微语言 ` " +"中描述的有关填充、对齐、正负号处理、最小宽度和分组的一般规则。 “替代形式”旗标 ``'#'`` " +"也是受支持的:如果提供,将强制输出字符串始终包括一个显式的分母,即使被格式化的值恰好为整数也是如此。表示填充零值的旗标 ``'0'`` 是不被支持的。" + +#: ../../library/fractions.rst:242 +msgid "" +"If the ``format_spec`` format specification string ends with one of the " +"presentation types ``'e'``, ``'E'``, ``'f'``, ``'F'``, ``'g'``, ``'G'`` or " +"``'%'`` then formatting follows the rules outlined for the :class:`float` " +"type in the :ref:`formatspec` section." +msgstr "" +"如果 ``format_spec`` 格式说明字符串末尾带有表示类型 ``'e'``, ``'E'``, ``'f'``, ``'F'``, " +"``'g'``, ``'G'`` 或 ``'%'`` 之一那么格式化操作将遵循在 :ref:`formatspec` 小节中针对 " +":class:`float` 类型所描述的规则。" + +#: ../../library/fractions.rst:247 +msgid "Here are some examples::" +msgstr "这是一些例子::" + +#: ../../library/fractions.rst:249 +msgid "" +">>> from fractions import Fraction\n" +">>> format(Fraction(103993, 33102), '_')\n" +"'103_993/33_102'\n" +">>> format(Fraction(1, 7), '.^+10')\n" +"'...+1/7...'\n" +">>> format(Fraction(3, 1), '')\n" +"'3'\n" +">>> format(Fraction(3, 1), '#')\n" +"'3/1'\n" +">>> format(Fraction(1, 7), '.40g')\n" +"'0.1428571428571428571428571428571428571429'\n" +">>> format(Fraction('1234567.855'), '_.2f')\n" +"'1_234_567.86'\n" +">>> f\"{Fraction(355, 113):*>20.6e}\"\n" +"'********3.141593e+00'\n" +">>> old_price, new_price = 499, 672\n" +">>> \"{:.2%} price increase\".format(Fraction(new_price, old_price) - 1)\n" +"'34.67% price increase'" +msgstr "" +">>> from fractions import Fraction\n" +">>> format(Fraction(103993, 33102), '_')\n" +"'103_993/33_102'\n" +">>> format(Fraction(1, 7), '.^+10')\n" +"'...+1/7...'\n" +">>> format(Fraction(3, 1), '')\n" +"'3'\n" +">>> format(Fraction(3, 1), '#')\n" +"'3/1'\n" +">>> format(Fraction(1, 7), '.40g')\n" +"'0.1428571428571428571428571428571428571429'\n" +">>> format(Fraction('1234567.855'), '_.2f')\n" +"'1_234_567.86'\n" +">>> f\"{Fraction(355, 113):*>20.6e}\"\n" +"'********3.141593e+00'\n" +">>> old_price, new_price = 499, 672\n" +">>> \"{:.2%} price increase\".format(Fraction(new_price, old_price) - 1)\n" +"'34.67% price increase'" + +#: ../../library/fractions.rst:271 +msgid "Module :mod:`numbers`" +msgstr ":mod:`numbers` 模块" + +#: ../../library/fractions.rst:272 +msgid "The abstract base classes making up the numeric tower." +msgstr "构成数字塔的所有抽象基类。" + +#: ../../library/fractions.rst:20 +msgid "as_integer_ratio()" +msgstr "as_integer_ratio()" diff --git a/library/frameworks.po b/library/frameworks.po new file mode 100644 index 0000000000..d6e90b6608 --- /dev/null +++ b/library/frameworks.po @@ -0,0 +1,44 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/frameworks.rst:7 +msgid "Program frameworks" +msgstr "程序框架" + +#: ../../library/frameworks.rst:9 +msgid "" +"This chapter is no longer maintained, and the modules it contained have been" +" moved to their respective topical documentation." +msgstr "本章内容已不再维护,其中包含的模块已迁移至各自对应的专题文档中。" + +#: ../../library/frameworks.rst:11 +msgid ":mod:`cmd` — :doc:`Command Line Interface Libraries <./cmdlinelibs>`" +msgstr ":mod:`cmd` — :doc:`命令行接口库 <./cmdlinelibs>`" + +#: ../../library/frameworks.rst:12 +msgid ":mod:`shlex` — :doc:`Unix Specific Services <./unix>`" +msgstr ":mod:`shlex` — :doc:`Unix 特定服务 <./unix>`" + +#: ../../library/frameworks.rst:13 +msgid ":mod:`turtle` — :doc:`Graphical User Interfaces with Tk <./tk>`" +msgstr ":mod:`turtle` — :doc:`使用 Tk 创建图形用户界面 <./tk>`" diff --git a/library/ftplib.po b/library/ftplib.po new file mode 100644 index 0000000000..7a87f9f78d --- /dev/null +++ b/library/ftplib.po @@ -0,0 +1,709 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/ftplib.rst:2 +msgid ":mod:`!ftplib` --- FTP protocol client" +msgstr ":mod:`!ftplib` --- FTP 协议客户端" + +#: ../../library/ftplib.rst:7 +msgid "**Source code:** :source:`Lib/ftplib.py`" +msgstr "**源代码:** :source:`Lib/ftplib.py`" + +#: ../../library/ftplib.rst:15 +msgid "" +"This module defines the class :class:`FTP` and a few related items. The " +":class:`FTP` class implements the client side of the FTP protocol. You can " +"use this to write Python programs that perform a variety of automated FTP " +"jobs, such as mirroring other FTP servers. It is also used by the module " +":mod:`urllib.request` to handle URLs that use FTP. For more information on " +"FTP (File Transfer Protocol), see internet :rfc:`959`." +msgstr "" +"本模块定义了 :class:`FTP` 类和一些相关项目。 :class:`FTP` 类实现了 FTP 协议的客户端。 " +"你可以用这个类来编写执行各种自动化 FTP 任务的 Python 程序,例如镜像其他 FTP 服务器等。它还被 " +":mod:`urllib.request` 模块用来处理使用 FTP 的 URL。有关 FTP (文件传输协议) 的更多信息,请参阅 " +":rfc:`959`." + +#: ../../library/ftplib.rst:22 +msgid "The default encoding is UTF-8, following :rfc:`2640`." +msgstr "默认编码为 UTF-8,遵循 :rfc:`2640`。" + +#: ../../includes/wasm-notavail.rst:3 +msgid "Availability" +msgstr "可用性" + +#: ../../includes/wasm-notavail.rst:5 +msgid "" +"This module does not work or is not available on WebAssembly. See " +":ref:`wasm-availability` for more information." +msgstr "此模块在 WebAssembly 平台上无效或不可用。请参阅 :ref:`wasm-availability` 了解详情。" + +#: ../../library/ftplib.rst:26 +msgid "Here's a sample session using the :mod:`!ftplib` module::" +msgstr "以下是使用 :mod:`!ftplib` 模拟的会话样例::" + +#: ../../library/ftplib.rst:28 +msgid "" +">>> from ftplib import FTP\n" +">>> ftp = FTP('ftp.us.debian.org') # connect to host, default port\n" +">>> ftp.login() # user anonymous, passwd anonymous@\n" +"'230 Login successful.'\n" +">>> ftp.cwd('debian') # change into \"debian\" directory\n" +"'250 Directory successfully changed.'\n" +">>> ftp.retrlines('LIST') # list directory contents\n" +"-rw-rw-r-- 1 1176 1176 1063 Jun 15 10:18 README\n" +"...\n" +"drwxr-sr-x 5 1176 1176 4096 Dec 19 2000 pool\n" +"drwxr-sr-x 4 1176 1176 4096 Nov 17 2008 project\n" +"drwxr-xr-x 3 1176 1176 4096 Oct 10 2012 tools\n" +"'226 Directory send OK.'\n" +">>> with open('README', 'wb') as fp:\n" +">>> ftp.retrbinary('RETR README', fp.write)\n" +"'226 Transfer complete.'\n" +">>> ftp.quit()\n" +"'221 Goodbye.'" +msgstr "" +">>> from ftplib import FTP\n" +">>> ftp = FTP('ftp.us.debian.org') # 连接到主机,默认端口\n" +">>> ftp.login() # 用户 anonymous,密码 anonymous@\n" +"'230 Login successful.'\n" +">>> ftp.cwd('debian') # 更改为 \"debian\" 目录\n" +"'250 Directory successfully changed.'\n" +">>> ftp.retrlines('LIST') # 列出目录内容\n" +"-rw-rw-r-- 1 1176 1176 1063 Jun 15 10:18 README\n" +"...\n" +"drwxr-sr-x 5 1176 1176 4096 Dec 19 2000 pool\n" +"drwxr-sr-x 4 1176 1176 4096 Nov 17 2008 project\n" +"drwxr-xr-x 3 1176 1176 4096 Oct 10 2012 tools\n" +"'226 Directory send OK.'\n" +">>> with open('README', 'wb') as fp:\n" +">>> ftp.retrbinary('RETR README', fp.write)\n" +"'226 Transfer complete.'\n" +">>> ftp.quit()\n" +"'221 Goodbye.'" + +#: ../../library/ftplib.rst:51 +msgid "Reference" +msgstr "参考" + +#: ../../library/ftplib.rst:56 +msgid "FTP objects" +msgstr "FTP 对象" + +#: ../../library/ftplib.rst:87 +msgid "Return a new instance of the :class:`FTP` class." +msgstr "返回一个 :class:`FTP` 类的新实例。" + +#: ../../library/ftplib.rst:0 +msgid "Parameters" +msgstr "参数" + +#: ../../library/ftplib.rst:89 ../../library/ftplib.rst:461 +msgid "" +"The hostname to connect to. If given, :code:`connect(host)` is implicitly " +"called by the constructor." +msgstr "要连接的主机名。如果给出,则将由构造器隐式地调用 :code:`connect(host)`。" + +#: ../../library/ftplib.rst:93 ../../library/ftplib.rst:465 +msgid "" +"|param_doc_user| If given, :code:`login(host, passwd, acct)` is implicitly " +"called by the constructor." +msgstr "|param_doc_user| 如果给出,则将由构造器隐式地调用 :code:`login(host, passwd, acct)`。" + +#: ../../library/ftplib.rst:98 ../../library/ftplib.rst:212 +#: ../../library/ftplib.rst:470 +msgid "|param_doc_passwd|" +msgstr "|param_doc_passwd|" + +#: ../../library/ftplib.rst:101 ../../library/ftplib.rst:215 +#: ../../library/ftplib.rst:473 +msgid "|param_doc_acct|" +msgstr "|param_doc_acct|" + +#: ../../library/ftplib.rst:104 +msgid "" +"A timeout in seconds for blocking operations like :meth:`connect` (default: " +"the global default timeout setting)." +msgstr "用于阻塞操作如 :meth:`connect` 的以秒数表示的超时值(默认:全局默认超时设置值)。" + +#: ../../library/ftplib.rst:109 ../../library/ftplib.rst:183 +#: ../../library/ftplib.rst:488 +msgid "|param_doc_source_address|" +msgstr "|param_doc_source_address|" + +#: ../../library/ftplib.rst:113 ../../library/ftplib.rst:492 +msgid "|param_doc_encoding|" +msgstr "|param_doc_encoding|" + +#: ../../library/ftplib.rst:116 +msgid "The :class:`FTP` class supports the :keyword:`with` statement, e.g.:" +msgstr ":class:`FTP` 类支持 :keyword:`with` 语句,例如:" + +#: ../../library/ftplib.rst:130 +msgid "Support for the :keyword:`with` statement was added." +msgstr "添加了对 :keyword:`with` 语句的支持。" + +#: ../../library/ftplib.rst:133 ../../library/ftplib.rst:189 +msgid "*source_address* parameter was added." +msgstr "添加了 *source_address* 参数。" + +#: ../../library/ftplib.rst:136 ../../library/ftplib.rst:505 +msgid "" +"If the *timeout* parameter is set to be zero, it will raise a " +":class:`ValueError` to prevent the creation of a non-blocking socket. The " +"*encoding* parameter was added, and the default was changed from Latin-1 to " +"UTF-8 to follow :rfc:`2640`." +msgstr "" +"如果 *timeout* 参数设置为 0,创建非阻塞套接字时,它将引发 :class:`ValueError` 来阻止该操作。添加了 " +"*encoding* 参数,且为了遵循 :rfc:`2640`,该参数默认值从 Latin-1 改为了 UTF-8。" + +#: ../../library/ftplib.rst:142 +msgid "" +"Several :class:`!FTP` methods are available in two flavors: one for handling" +" text files and another for binary files. The methods are named for the " +"command which is used followed by ``lines`` for the text version or " +"``binary`` for the binary version." +msgstr "" +"某些 :class:`!FTP` 方法有两种形式:一种用于处理文本文件而另一种用于二进制文件。这些方法的名称与所用的命令相对应,文本版之后跟 " +"``lines`` 而二进制版之后跟 ``binary``。" + +#: ../../library/ftplib.rst:147 +msgid ":class:`FTP` instances have the following methods:" +msgstr ":class:`FTP` 实例具有下列方法:" + +#: ../../library/ftplib.rst:151 +msgid "" +"Set the instance's debugging level as an :class:`int`. This controls the " +"amount of debugging output printed. The debug levels are:" +msgstr "将实例的调试级别设为一个 :class:`int` 值。这将控制所打印的调试输出数据量。调试级别包括:" + +#: ../../library/ftplib.rst:155 +msgid "``0`` (default): No debug output." +msgstr "``0`` (默认): 无调试输出。" + +#: ../../library/ftplib.rst:156 +msgid "" +"``1``: Produce a moderate amount of debug output, generally a single line " +"per request." +msgstr "``1``: 产生中等的调试输出数据量,通常为每个请求一行。" + +#: ../../library/ftplib.rst:158 +msgid "" +"``2`` or higher: Produce the maximum amount of debugging output, logging " +"each line sent and received on the control connection." +msgstr "``2`` 或更高:产生最大的调试输出数据量,记录在控制连接中发送和接收的每一行。" + +#: ../../library/ftplib.rst:163 +msgid "" +"Connect to the given host and port. This function should be called only once" +" for each instance; it should not be called if a *host* argument was given " +"when the :class:`FTP` instance was created. All other :class:`!FTP` methods " +"can only be called after a connection has successfully been made." +msgstr "" +"连接到给定的主机和端口。此函数应当只为每个实例调用一次;如果在创建 :class:`FTP` 实例时给出了 *host* 参数则不应调用此函数。 " +"所有其他 :class:`!FTP` 方法只能在连接成功建立之后被调用。" + +#: ../../library/ftplib.rst:170 +msgid "The host to connect to." +msgstr "要连接的主机。" + +#: ../../library/ftplib.rst:173 +msgid "" +"The TCP port to connect to (default: ``21``, as specified by the FTP " +"protocol specification). It is rarely needed to specify a different port " +"number." +msgstr "要连接的 TCP 端口 (默认值: ``21``,如 FTP 协议规范所指明的)。 很少有必要指定不同的端口号。" + +#: ../../library/ftplib.rst:178 +msgid "" +"A timeout in seconds for the connection attempt (default: the global default" +" timeout setting)." +msgstr "针对连接尝试的以秒数表示的超时值(默认值:全局默认超时设置值)。" + +#: ../../library/ftplib.rst:187 +msgid "" +"Raises an :ref:`auditing event ` ``ftplib.connect`` with arguments" +" ``self``, ``host``, ``port``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``ftplib.connect`` 并附带参数 ``self``, ``host``, " +"``port``." + +#: ../../library/ftplib.rst:195 +msgid "" +"Return the welcome message sent by the server in reply to the initial " +"connection. (This message sometimes contains disclaimers or help " +"information that may be relevant to the user.)" +msgstr "返回服务器发送的欢迎消息,作为连接开始的回复。(该消息有时包含与用户有关的免责声明或帮助信息。)" + +#: ../../library/ftplib.rst:202 +msgid "" +"Log on to the connected FTP server. This function should be called only once" +" for each instance, after a connection has been established; it should not " +"be called if the *host* and *user* arguments were given when the " +":class:`FTP` instance was created. Most FTP commands are only allowed after " +"the client has logged in." +msgstr "" +"登录到已连接的 FTP 服务器。在建立连接后,此函数应当只为每个实例调用一次;如果在创建 :class:`FTP` 实例时给出了 *host* 和 " +"*user* 参数则不应调用该函数。大多数 FTP 命令只有在客户端已登录后才允许使用。" + +#: ../../library/ftplib.rst:209 +msgid "|param_doc_user|" +msgstr "|param_doc_user|" + +#: ../../library/ftplib.rst:221 +msgid "" +"Abort a file transfer that is in progress. Using this does not always work," +" but it's worth a try." +msgstr "中止正在进行的文件传输。本方法并不总是有效,但值得一试。" + +#: ../../library/ftplib.rst:227 +msgid "" +"Send a simple command string to the server and return the response string." +msgstr "将一条简单的命令字符串发送到服务器,返回响应的字符串。" + +#: ../../library/ftplib.rst:229 ../../library/ftplib.rst:238 +msgid "" +"Raises an :ref:`auditing event ` ``ftplib.sendcmd`` with arguments" +" ``self``, ``cmd``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``ftplib.sendcmd`` 并附带参数 ``self``, ``cmd``。" + +#: ../../library/ftplib.rst:234 +msgid "" +"Send a simple command string to the server and handle the response. Return " +"the response string if the response code corresponds to success (codes in " +"the range 200--299). Raise :exc:`error_reply` otherwise." +msgstr "" +"将一条简单的命令字符串发送到服务器并对响应进行处理。如果响应代码对应执行成功(代码在 200--299 范围内)则返回响应字符串。在其他情况下则引发 " +":exc:`error_reply`." + +#: ../../library/ftplib.rst:243 +msgid "Retrieve a file in binary transfer mode." +msgstr "以二进制传输模式获取一个文件。" + +#: ../../library/ftplib.rst:245 +msgid "An appropriate ``RETR`` command: :samp:`\"RETR {filename}\"`." +msgstr "一个正确的 ``RETR`` 命令::samp:`\"RETR {filename}\"`。" + +#: ../../library/ftplib.rst:248 +msgid "" +"A single parameter callable that is called for each block of data received, " +"with its single argument being the data as :class:`bytes`." +msgstr "一个针对所接收的每个数据块被调用的单形参可调用对象,其唯一参数即 :class:`bytes` 类型的数据。" + +#: ../../library/ftplib.rst:254 +msgid "" +"The maximum chunk size to read on the low-level :class:`~socket.socket` " +"object created to do the actual transfer. This also corresponds to the " +"largest size of data that will be passed to *callback*. Defaults to " +"``8192``." +msgstr "" +"在为进行实际传输而创建的底层 :class:`~socket.socket` 对象上读取的块尺寸最大值。这也对应于将要传给 *callback* " +"的数据尺寸最大值。默认为 ``8192``。" + +#: ../../library/ftplib.rst:261 ../../library/ftplib.rst:308 +msgid "" +"A ``REST`` command to be sent to the server. See the documentation for the " +"*rest* parameter of the :meth:`transfercmd` method." +msgstr "要发送给服务器的 ``REST`` 命令。参见 :meth:`transfercmd` 方法的 *rest* 形参的文档。" + +#: ../../library/ftplib.rst:268 +msgid "" +"Retrieve a file or directory listing in the encoding specified by the " +"*encoding* parameter at initialization. *cmd* should be an appropriate " +"``RETR`` command (see :meth:`retrbinary`) or a command such as ``LIST`` or " +"``NLST`` (usually just the string ``'LIST'``). ``LIST`` retrieves a list of " +"files and information about those files. ``NLST`` retrieves a list of file " +"names. The *callback* function is called for each line with a string " +"argument containing the line with the trailing CRLF stripped. The default " +"*callback* prints the line to :data:`sys.stdout`." +msgstr "" +"以在初始化时由 *encoding* 形参指定的编码格式获取文件或目录列表。 *cmd* 应为一个适当的 ``RETR`` 命令 (参见 " +":meth:`retrbinary`) 或是像 ``LIST`` 或 ``NLST`` 这样的命令 (通常即字符串 ``'LIST'``)。 " +"``LIST`` 将获取一个包含文件名及文件相关信息的列表。``NLST`` 将获取一个文件名的列表。 *callback* " +"函数将针对每一行被调用并附带一个包含去除了末尾 CRLF 的行的字符串参数。默认的 *callback* 会将行内容打印到 " +":data:`sys.stdout`." + +#: ../../library/ftplib.rst:281 +msgid "" +"Enable \"passive\" mode if *val* is true, otherwise disable passive mode. " +"Passive mode is on by default." +msgstr "如果 *val* 为 true,则打开“被动”模式,否则禁用被动模式。默认下被动模式是打开的。" + +#: ../../library/ftplib.rst:287 +msgid "Store a file in binary transfer mode." +msgstr "以二进制传输模式存储一个文件。" + +#: ../../library/ftplib.rst:289 +msgid "An appropriate ``STOR`` command: :samp:`\"STOR {filename}\"`." +msgstr "一个正确的 ``STOR`` 命令::samp:`\"STOR {filename}\"`。" + +#: ../../library/ftplib.rst:292 +msgid "" +"A file object (opened in binary mode) which is read until EOF, using its " +":meth:`~io.RawIOBase.read` method in blocks of size *blocksize* to provide " +"the data to be stored." +msgstr "" +"一个被读取直至 EOF 的文件对象(以二进制模式打开),使用其 :meth:`~io.RawIOBase.read` 方法以大小为 " +"*blocksize* 的块来提供要存储的数据。" + +#: ../../library/ftplib.rst:298 +msgid "The read block size. Defaults to ``8192``." +msgstr "读取块的大小。默认为 ``8192``。" + +#: ../../library/ftplib.rst:302 +msgid "" +"A single parameter callable that is called for each block of data sent, with" +" its single argument being the data as :class:`bytes`." +msgstr "一个针对所发送的每个数据块被调用的单形参可调用对象,其唯一参数即 :class:`bytes` 类型的数据。" + +#: ../../library/ftplib.rst:312 +msgid "The *rest* parameter was added." +msgstr "增加了 *rest* 形参。" + +#: ../../library/ftplib.rst:318 +msgid "" +"Store a file in line mode. *cmd* should be an appropriate ``STOR`` command " +"(see :meth:`storbinary`). Lines are read until EOF from the :term:`file " +"object` *fp* (opened in binary mode) using its :meth:`~io.IOBase.readline` " +"method to provide the data to be stored. *callback* is an optional single " +"parameter callable that is called on each line after it is sent." +msgstr "" +"以文本行模式存储文件。*cmd* 应为恰当的 ``STOR`` 命令 (请参阅 :meth:`storbinary`)。 *fp* 是一个 " +":term:`文件对象 ` (以二进制模式打开),将使用它的 :meth:`~io.IOBase.readline` " +"方法读取它的每一行,用于提供要存储的数据,直到遇到 EOF。可选参数 *callback* 是单参数函数,在每行发送后都会以该行作为参数来调用它。" + +#: ../../library/ftplib.rst:327 +msgid "" +"Initiate a transfer over the data connection. If the transfer is active, " +"send an ``EPRT`` or ``PORT`` command and the transfer command specified by " +"*cmd*, and accept the connection. If the server is passive, send an " +"``EPSV`` or ``PASV`` command, connect to it, and start the transfer command." +" Either way, return the socket for the connection." +msgstr "" +"在 FTP 数据连接上开始传输数据。如果传输处于活动状态,传输命令由 *cmd* 指定,需发送 ``EPRT`` 或 ``PORT`` " +"命令,然后接受连接 (accept)。如果服务器是被动服务器,需发送 ``EPSV`` 或 ``PASV`` 命令,连接到服务器 " +"(connect),然后启动传输命令。两种方式都将返回用于连接的套接字。" + +#: ../../library/ftplib.rst:333 +msgid "" +"If optional *rest* is given, a ``REST`` command is sent to the server, " +"passing *rest* as an argument. *rest* is usually a byte offset into the " +"requested file, telling the server to restart sending the file's bytes at " +"the requested offset, skipping over the initial bytes. Note however that " +"the :meth:`transfercmd` method converts *rest* to a string with the " +"*encoding* parameter specified at initialization, but no check is performed " +"on the string's contents. If the server does not recognize the ``REST`` " +"command, an :exc:`error_reply` exception will be raised. If this happens, " +"simply call :meth:`transfercmd` without a *rest* argument." +msgstr "" +"如果传入了可选参数 *rest*,则一条 ``REST`` 命令会被发送到服务器,并以 *rest* 作为参数。*rest* " +"通常表示请求文件中的字节偏移量,它告诉服务器重新开始发送文件的字节,从请求的偏移量处开始,跳过起始字节。但是请注意,:meth:`transfercmd`" +" 方法会将 *rest* 转换为字符串,但是不检查字符串的内容,转换用的编码是在初始化时指定的 *encoding* 参数。如果服务器无法识别 " +"``REST`` 命令,将引发 :exc:`error_reply` 异常。如果发生这种情况,只需不带 *rest* 参数调用 " +":meth:`transfercmd`." + +#: ../../library/ftplib.rst:346 +msgid "" +"Like :meth:`transfercmd`, but returns a tuple of the data connection and the" +" expected size of the data. If the expected size could not be computed, " +"``None`` will be returned as the expected size. *cmd* and *rest* means the " +"same thing as in :meth:`transfercmd`." +msgstr "" +"类似于 :meth:`transfercmd`,但返回一个元组,包括数据连接和数据的预计大小。如果预计大小无法计算,则返回的预计大小为 " +"``None``。*cmd* 和 *rest* 的含义与 :meth:`transfercmd` 中的相同。" + +#: ../../library/ftplib.rst:354 +msgid "" +"List a directory in a standardized format by using ``MLSD`` command " +"(:rfc:`3659`). If *path* is omitted the current directory is assumed. " +"*facts* is a list of strings representing the type of information desired " +"(e.g. ``[\"type\", \"size\", \"perm\"]``). Return a generator object " +"yielding a tuple of two elements for every file found in path. First " +"element is the file name, the second one is a dictionary containing facts " +"about the file name. Content of this dictionary might be limited by the " +"*facts* argument but server is not guaranteed to return all requested facts." +msgstr "" +"使用 ``MLSD`` 命令以标准格式列出目录内容 (:rfc:`3659`)。如果省略 *path* 则使用当前目录。*facts* " +"是字符串列表,表示所需的信息类型 (如 ``[\"type\", \"size\", \"perm\"]``)。 返回一个生成器对象,每个在 path " +"中找到的文件都将在该对象中生成两个元素的元组。 第一个元素是文件名,第二个元素是该文件的 facts 的字典。该字典的内容受 *facts* " +"参数限制,但不能保证服务器会返回所有请求的 facts。" + +#: ../../library/ftplib.rst:368 +msgid "" +"Return a list of file names as returned by the ``NLST`` command. The " +"optional *argument* is a directory to list (default is the current server " +"directory). Multiple arguments can be used to pass non-standard options to " +"the ``NLST`` command." +msgstr "" +"返回一个文件名列表,文件名由 ``NLST`` 命令返回。可选参数 *argument* " +"是待列出的目录(默认为当前服务器目录)。可以使用多个参数,将非标准选项传递给 ``NLST`` 命令。" + +#: ../../library/ftplib.rst:373 ../../library/ftplib.rst:385 +msgid "If your server supports the command, :meth:`mlsd` offers a better API." +msgstr "如果目标服务器支持相关命令,那么 :meth:`mlsd` 提供的 API 更好。" + +#: ../../library/ftplib.rst:378 +msgid "" +"Produce a directory listing as returned by the ``LIST`` command, printing it" +" to standard output. The optional *argument* is a directory to list " +"(default is the current server directory). Multiple arguments can be used " +"to pass non-standard options to the ``LIST`` command. If the last argument " +"is a function, it is used as a *callback* function as for :meth:`retrlines`;" +" the default prints to :data:`sys.stdout`. This method returns ``None``." +msgstr "" +"生成一个目录列表即 ``LIST`` 命令所返回的结果,将其打印到标准输出。可选的 *argument* 是要列出的目录(默认为当前服务器目录)。 " +"可以使用多个参数将非标准选项传给 ``LIST`` 命令。如果最后一个参数是个函数,它将被用作 *callback* 函数,与 " +":meth:`retrlines` 的类似;默认将打印到 :data:`sys.stdout`。此方法将返回 ``None``。" + +#: ../../library/ftplib.rst:390 +msgid "Rename file *fromname* on the server to *toname*." +msgstr "将服务器上的文件 *fromname* 重命名为 *toname*。" + +#: ../../library/ftplib.rst:395 +msgid "" +"Remove the file named *filename* from the server. If successful, returns " +"the text of the response, otherwise raises :exc:`error_perm` on permission " +"errors or :exc:`error_reply` on other errors." +msgstr "" +"将服务器上名为 *filename* 的文件删除。如果删除成功,返回响应文本,如果删除失败,在权限错误时引发 " +":exc:`error_perm`,在其他错误时引发 :exc:`error_reply`。" + +#: ../../library/ftplib.rst:402 +msgid "Set the current directory on the server." +msgstr "设置服务器端的当前目录。" + +#: ../../library/ftplib.rst:407 +msgid "Create a new directory on the server." +msgstr "在服务器上创建一个新目录。" + +#: ../../library/ftplib.rst:412 +msgid "Return the pathname of the current directory on the server." +msgstr "返回服务器上当前目录的路径。" + +#: ../../library/ftplib.rst:417 +msgid "Remove the directory named *dirname* on the server." +msgstr "将服务器上名为 *dirname* 的目录删除。" + +#: ../../library/ftplib.rst:422 +msgid "" +"Request the size of the file named *filename* on the server. On success, " +"the size of the file is returned as an integer, otherwise ``None`` is " +"returned. Note that the ``SIZE`` command is not standardized, but is " +"supported by many common server implementations." +msgstr "" +"请求服务器上名为 *filename* 的文件大小。成功后以整数返回文件大小,未成功则返回 ``None``。注意,``SIZE`` " +"不是标准命令,但通常许多服务器的实现都支持该命令。" + +#: ../../library/ftplib.rst:430 +msgid "" +"Send a ``QUIT`` command to the server and close the connection. This is the " +"\"polite\" way to close a connection, but it may raise an exception if the " +"server responds with an error to the ``QUIT`` command. This implies a call " +"to the :meth:`close` method which renders the :class:`FTP` instance useless " +"for subsequent calls (see below)." +msgstr "" +"向服务器发送 ``QUIT`` 命令并关闭连接。这是关闭一个连接的“礼貌”方式,但是如果服务器对 ``QUIT`` " +"命令的响应带有错误消息则这会引发一个异常。这意味着对 :meth:`close` 方法的调用,它将使得 :class:`FTP` " +"实例对后继调用无效(见下文)。" + +#: ../../library/ftplib.rst:439 +msgid "" +"Close the connection unilaterally. This should not be applied to an already" +" closed connection such as after a successful call to :meth:`~FTP.quit`. " +"After this call the :class:`FTP` instance should not be used any more (after" +" a call to :meth:`close` or :meth:`~FTP.quit` you cannot reopen the " +"connection by issuing another :meth:`login` method)." +msgstr "" +"单方面关闭连接。这不该被应用于已经关闭的连接,例如成功调用 :meth:`~FTP.quit` 之后的连接。在此调用之后 :class:`FTP` " +"实例不应被继续使用(在调用 :meth:`close` 或 :meth:`~FTP.quit` 之后你不能通过再次唤起 :meth:`login` " +"方法重新打开连接)。" + +#: ../../library/ftplib.rst:447 +msgid "FTP_TLS objects" +msgstr "FTP_TLS 对象" + +#: ../../library/ftplib.rst:452 +msgid "" +"An :class:`FTP` subclass which adds TLS support to FTP as described in " +":rfc:`4217`. Connect to port 21 implicitly securing the FTP control " +"connection before authenticating." +msgstr "" +"一个为 FTP 添加如 :rfc:`4217` 所描述的 TLS 支持的 :class:`FTP` 的子类。连接到 21 端口在身份验证之前隐式地确保 " +"FTP 控制连接的安全。" + +#: ../../library/ftplib.rst:458 +msgid "" +"The user must explicitly secure the data connection by calling the " +":meth:`prot_p` method." +msgstr "用户必须通过调用 :meth:`prot_p` 方法显式地确保数据连接的安全。" + +#: ../../library/ftplib.rst:476 +msgid "" +"An SSL context object which allows bundling SSL configuration options, " +"certificates and private keys into a single, potentially long-lived, " +"structure. Please read :ref:`ssl-security` for best practices." +msgstr "" +"一个允许将 SSL 配置选项、证书和私钥打包至一个单独的、可以长久存在的结构体中的 SSL 上下文对象。请参阅 :ref:`ssl-security` " +"了解相关的最佳实践。" + +#: ../../library/ftplib.rst:483 +msgid "" +"A timeout in seconds for blocking operations like :meth:`~FTP.connect` " +"(default: the global default timeout setting)." +msgstr "一个用于阻塞操作如 :meth:`~FTP.connect` 的以秒数表示的超时值(默认值:全局默认超时设置)。" + +#: ../../library/ftplib.rst:497 +msgid "Added the *source_address* parameter." +msgstr "增加了 *source_address* 形参。" + +#: ../../library/ftplib.rst:500 +msgid "" +"The class now supports hostname check with " +":attr:`ssl.SSLContext.check_hostname` and *Server Name Indication* (see " +":const:`ssl.HAS_SNI`)." +msgstr "" +"该类现在支持使用 :attr:`ssl.SSLContext.check_hostname` 和 *服务器名称提示* (参见 " +":const:`ssl.HAS_SNI`) 进行主机名检测。" + +#: ../../library/ftplib.rst:511 +msgid "The deprecated *keyfile* and *certfile* parameters have been removed." +msgstr "已弃用的 *keyfile* 和 *certfile* 形参已被移除。" + +#: ../../library/ftplib.rst:514 +msgid "Here's a sample session using the :class:`FTP_TLS` class::" +msgstr "以下是使用 :class:`FTP_TLS` 类的会话示例::" + +#: ../../library/ftplib.rst:516 +msgid "" +">>> ftps = FTP_TLS('ftp.pureftpd.org')\n" +">>> ftps.login()\n" +"'230 Anonymous user logged in'\n" +">>> ftps.prot_p()\n" +"'200 Data protection level set to \"private\"'\n" +">>> ftps.nlst()\n" +"['6jack', 'OpenBSD', 'antilink', 'blogbench', 'bsdcam', 'clockspeed', 'djbdns-jedi', 'docs', 'eaccelerator-jedi', 'favicon.ico', 'francotone', 'fugu', 'ignore', 'libpuzzle', 'metalog', 'minidentd', 'misc', 'mysql-udf-global-user-variables', 'php-jenkins-hash', 'php-skein-hash', 'php-webdav', 'phpaudit', 'phpbench', 'pincaster', 'ping', 'posto', 'pub', 'public', 'public_keys', 'pure-ftpd', 'qscan', 'qtc', 'sharedance', 'skycache', 'sound', 'tmp', 'ucarp']" +msgstr "" +">>> ftps = FTP_TLS('ftp.pureftpd.org')\n" +">>> ftps.login()\n" +"'230 Anonymous user logged in'\n" +">>> ftps.prot_p()\n" +"'200 Data protection level set to \"private\"'\n" +">>> ftps.nlst()\n" +"['6jack', 'OpenBSD', 'antilink', 'blogbench', 'bsdcam', 'clockspeed', 'djbdns-jedi', 'docs', 'eaccelerator-jedi', 'favicon.ico', 'francotone', 'fugu', 'ignore', 'libpuzzle', 'metalog', 'minidentd', 'misc', 'mysql-udf-global-user-variables', 'php-jenkins-hash', 'php-skein-hash', 'php-webdav', 'phpaudit', 'phpbench', 'pincaster', 'ping', 'posto', 'pub', 'public', 'public_keys', 'pure-ftpd', 'qscan', 'qtc', 'sharedance', 'skycache', 'sound', 'tmp', 'ucarp']" + +#: ../../library/ftplib.rst:524 +msgid "" +":class:`!FTP_TLS` class inherits from :class:`FTP`, defining these " +"additional methods and attributes:" +msgstr ":class:`!FTP_TLS` 类继承自 :class:`FTP`,它定义了下列额外方法和属性:" + +#: ../../library/ftplib.rst:529 +msgid "Set up a secure control connection by using TLS." +msgstr "" + +#: ../../library/ftplib.rst:531 +msgid "" +"The method now supports hostname check with " +":attr:`ssl.SSLContext.check_hostname` and *Server Name Indication* (see " +":const:`ssl.HAS_SNI`)." +msgstr "" +"该方法现在支持使用 :attr:`ssl.SSLContext.check_hostname` 和 *服务器名称提示* (参见 " +":const:`ssl.HAS_SNI`) 进行主机名称检测。" + +#: ../../library/ftplib.rst:538 +msgid "" +"Revert control channel back to plaintext. This can be useful to take " +"advantage of firewalls that know how to handle NAT with non-secure FTP " +"without opening fixed ports." +msgstr "将控制通道恢复为纯文本。这在利用知道如何以非安全 FTP 处理 NAT 而无需打开固定端口的防火墙时会很有用。" + +#: ../../library/ftplib.rst:546 +msgid "Set up secure data connection by using TLS." +msgstr "" + +#: ../../library/ftplib.rst:550 +msgid "Set up clear text data connection." +msgstr "设置明文数据连接。" + +#: ../../library/ftplib.rst:554 +msgid "Module variables" +msgstr "模块变量" + +#: ../../library/ftplib.rst:558 +msgid "Exception raised when an unexpected reply is received from the server." +msgstr "从服务器收到意外答复时,将引发本异常。" + +#: ../../library/ftplib.rst:563 +msgid "" +"Exception raised when an error code signifying a temporary error (response " +"codes in the range 400--499) is received." +msgstr "收到表示临时错误的错误代码(响应代码在 400--499 范围内)时,将引发本异常。" + +#: ../../library/ftplib.rst:569 +msgid "" +"Exception raised when an error code signifying a permanent error (response " +"codes in the range 500--599) is received." +msgstr "收到表示永久性错误的错误代码(响应代码在 500--599 范围内)时,将引发本异常。" + +#: ../../library/ftplib.rst:575 +msgid "" +"Exception raised when a reply is received from the server that does not fit " +"the response specifications of the File Transfer Protocol, i.e. begin with a" +" digit in the range 1--5." +msgstr "从服务器收到不符合文件传输协议响应规范(即回复应以 1--5 范围内的数字开头)的答复时,将引发本异常。" + +#: ../../library/ftplib.rst:582 +msgid "" +"The set of all exceptions (as a tuple) that methods of :class:`FTP` " +"instances may raise as a result of problems with the FTP connection (as " +"opposed to programming errors made by the caller). This set includes the " +"four exceptions listed above as well as :exc:`OSError` and :exc:`EOFError`." +msgstr "" +"所有异常的集合(一个元组),由于 FTP 连接出现问题(并非调用者的编码错误),:class:`FTP` " +"实例的方法可能会引发这些异常。该集合包括上面列出的四个异常以及 :exc:`OSError` 和 :exc:`EOFError`。" + +#: ../../library/ftplib.rst:590 +msgid "Module :mod:`netrc`" +msgstr ":mod:`netrc` 模块" + +#: ../../library/ftplib.rst:591 +msgid "" +"Parser for the :file:`.netrc` file format. The file :file:`.netrc` is " +"typically used by FTP clients to load user authentication information before" +" prompting the user." +msgstr "" +":file:`.netrc` 文件格式解析器。FTP 客户端通常在提示用户输入之前,使用 :file:`.netrc` 文件来加载用户认证信息。" + +#: ../../library/ftplib.rst:9 +msgid "FTP" +msgstr "FTP" + +#: ../../library/ftplib.rst:9 +msgid "protocol" +msgstr "协议" + +#: ../../library/ftplib.rst:9 +msgid "ftplib (standard module)" +msgstr "ftplib (标准模块)" diff --git a/library/functional.po b/library/functional.po new file mode 100644 index 0000000000..14954cbe81 --- /dev/null +++ b/library/functional.po @@ -0,0 +1,36 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/functional.rst:3 +msgid "Functional Programming Modules" +msgstr "函数式编程模块" + +#: ../../library/functional.rst:5 +msgid "" +"The modules described in this chapter provide functions and classes that " +"support a functional programming style, and general operations on callables." +msgstr "本章里描述的模块提供了函数和类,以支持函数式编程风格和在可调用对象上的通用操作。" + +#: ../../library/functional.rst:8 +msgid "The following modules are documented in this chapter:" +msgstr "本章包含以下模块的文档:" diff --git a/library/functions.po b/library/functions.po new file mode 100644 index 0000000000..502ac56c87 --- /dev/null +++ b/library/functions.po @@ -0,0 +1,3952 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-19 15:34+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/functions.rst:5 ../../library/functions.rst:11 +msgid "Built-in Functions" +msgstr "内置函数" + +#: ../../library/functions.rst:7 +msgid "" +"The Python interpreter has a number of functions and types built into it " +"that are always available. They are listed here in alphabetical order." +msgstr "Python 解释器内置了很多函数和类型,任何时候都能使用。以下按字母顺序给出列表。" + +#: ../../library/functions.rst:0 +msgid "**A**" +msgstr "**A**" + +#: ../../library/functions.rst:0 +msgid ":func:`abs`" +msgstr ":func:`abs`" + +#: ../../library/functions.rst:0 +msgid ":func:`aiter`" +msgstr ":func:`aiter`" + +#: ../../library/functions.rst:0 +msgid ":func:`all`" +msgstr ":func:`all`" + +#: ../../library/functions.rst:0 +msgid ":func:`anext`" +msgstr ":func:`anext`" + +#: ../../library/functions.rst:0 +msgid ":func:`any`" +msgstr ":func:`any`" + +#: ../../library/functions.rst:0 +msgid ":func:`ascii`" +msgstr ":func:`ascii`" + +#: ../../library/functions.rst:0 +msgid "**B**" +msgstr "**B**" + +#: ../../library/functions.rst:0 +msgid ":func:`bin`" +msgstr ":func:`bin`" + +#: ../../library/functions.rst:0 +msgid ":func:`bool`" +msgstr ":func:`bool`" + +#: ../../library/functions.rst:0 +msgid ":func:`breakpoint`" +msgstr ":func:`breakpoint`" + +#: ../../library/functions.rst:0 +msgid "|func-bytearray|_" +msgstr "|func-bytearray|_" + +#: ../../library/functions.rst:0 +msgid "|func-bytes|_" +msgstr "|func-bytes|_" + +#: ../../library/functions.rst:0 +msgid "**C**" +msgstr "**C**" + +#: ../../library/functions.rst:0 +msgid ":func:`callable`" +msgstr ":func:`callable`" + +#: ../../library/functions.rst:0 +msgid ":func:`chr`" +msgstr ":func:`chr`" + +#: ../../library/functions.rst:0 +msgid ":func:`classmethod`" +msgstr ":func:`classmethod`" + +#: ../../library/functions.rst:0 +msgid ":func:`compile`" +msgstr ":func:`compile`" + +#: ../../library/functions.rst:0 +msgid ":func:`complex`" +msgstr ":func:`complex`" + +#: ../../library/functions.rst:0 +msgid "**D**" +msgstr "**D**" + +#: ../../library/functions.rst:0 +msgid ":func:`delattr`" +msgstr ":func:`delattr`" + +#: ../../library/functions.rst:0 +msgid "|func-dict|_" +msgstr "|func-dict|_" + +#: ../../library/functions.rst:0 +msgid ":func:`dir`" +msgstr ":func:`dir`" + +#: ../../library/functions.rst:0 +msgid ":func:`divmod`" +msgstr ":func:`divmod`" + +#: ../../library/functions.rst:0 +msgid "**E**" +msgstr "**E**" + +#: ../../library/functions.rst:0 +msgid ":func:`enumerate`" +msgstr ":func:`enumerate`" + +#: ../../library/functions.rst:0 +msgid ":func:`eval`" +msgstr ":func:`eval`" + +#: ../../library/functions.rst:0 +msgid ":func:`exec`" +msgstr ":func:`exec`" + +#: ../../library/functions.rst:0 +msgid "**F**" +msgstr "**F**" + +#: ../../library/functions.rst:0 +msgid ":func:`filter`" +msgstr ":func:`filter`" + +#: ../../library/functions.rst:0 +msgid ":func:`float`" +msgstr ":func:`float`" + +#: ../../library/functions.rst:0 +msgid ":func:`format`" +msgstr ":func:`format`" + +#: ../../library/functions.rst:0 +msgid "|func-frozenset|_" +msgstr "|func-frozenset|_" + +#: ../../library/functions.rst:0 +msgid "**G**" +msgstr "**G**" + +#: ../../library/functions.rst:0 +msgid ":func:`getattr`" +msgstr ":func:`getattr`" + +#: ../../library/functions.rst:0 +msgid ":func:`globals`" +msgstr ":func:`globals`" + +#: ../../library/functions.rst:0 +msgid "**H**" +msgstr "**H**" + +#: ../../library/functions.rst:0 +msgid ":func:`hasattr`" +msgstr ":func:`hasattr`" + +#: ../../library/functions.rst:0 +msgid ":func:`hash`" +msgstr ":func:`hash`" + +#: ../../library/functions.rst:0 +msgid ":func:`help`" +msgstr ":func:`help`" + +#: ../../library/functions.rst:0 +msgid ":func:`hex`" +msgstr ":func:`hex`" + +#: ../../library/functions.rst:0 +msgid "**I**" +msgstr "**I**" + +#: ../../library/functions.rst:0 +msgid ":func:`id`" +msgstr ":func:`id`" + +#: ../../library/functions.rst:0 +msgid ":func:`input`" +msgstr ":func:`input`" + +#: ../../library/functions.rst:0 +msgid ":func:`int`" +msgstr ":func:`int`" + +#: ../../library/functions.rst:0 +msgid ":func:`isinstance`" +msgstr ":func:`isinstance`" + +#: ../../library/functions.rst:0 +msgid ":func:`issubclass`" +msgstr ":func:`issubclass`" + +#: ../../library/functions.rst:0 +msgid ":func:`iter`" +msgstr ":func:`iter`" + +#: ../../library/functions.rst:0 +msgid "**L**" +msgstr "**L**" + +#: ../../library/functions.rst:0 +msgid ":func:`len`" +msgstr ":func:`len`" + +#: ../../library/functions.rst:0 +msgid "|func-list|_" +msgstr "|func-list|_" + +#: ../../library/functions.rst:0 +msgid ":func:`locals`" +msgstr ":func:`locals`" + +#: ../../library/functions.rst:0 +msgid "**M**" +msgstr "**M**" + +#: ../../library/functions.rst:0 +msgid ":func:`map`" +msgstr ":func:`map`" + +#: ../../library/functions.rst:0 +msgid ":func:`max`" +msgstr ":func:`max`" + +#: ../../library/functions.rst:0 +msgid "|func-memoryview|_" +msgstr "|func-memoryview|_" + +#: ../../library/functions.rst:0 +msgid ":func:`min`" +msgstr ":func:`min`" + +#: ../../library/functions.rst:0 +msgid "**N**" +msgstr "**N**" + +#: ../../library/functions.rst:0 +msgid ":func:`next`" +msgstr ":func:`next`" + +#: ../../library/functions.rst:0 +msgid "**O**" +msgstr "**O**" + +#: ../../library/functions.rst:0 +msgid ":func:`object`" +msgstr ":func:`object`" + +#: ../../library/functions.rst:0 +msgid ":func:`oct`" +msgstr ":func:`oct`" + +#: ../../library/functions.rst:0 +msgid ":func:`open`" +msgstr ":func:`open`" + +#: ../../library/functions.rst:0 +msgid ":func:`ord`" +msgstr ":func:`ord`" + +#: ../../library/functions.rst:0 +msgid "**P**" +msgstr "**P**" + +#: ../../library/functions.rst:0 +msgid ":func:`pow`" +msgstr ":func:`pow`" + +#: ../../library/functions.rst:0 +msgid ":func:`print`" +msgstr ":func:`print`" + +#: ../../library/functions.rst:0 +msgid ":func:`property`" +msgstr ":func:`property`" + +#: ../../library/functions.rst:0 +msgid "**R**" +msgstr "**R**" + +#: ../../library/functions.rst:0 +msgid "|func-range|_" +msgstr "|func-range|_" + +#: ../../library/functions.rst:0 +msgid ":func:`repr`" +msgstr ":func:`repr`" + +#: ../../library/functions.rst:0 +msgid ":func:`reversed`" +msgstr ":func:`reversed`" + +#: ../../library/functions.rst:0 +msgid ":func:`round`" +msgstr ":func:`round`" + +#: ../../library/functions.rst:0 +msgid "**S**" +msgstr "**S**" + +#: ../../library/functions.rst:0 +msgid "|func-set|_" +msgstr "|func-set|_" + +#: ../../library/functions.rst:0 +msgid ":func:`setattr`" +msgstr ":func:`setattr`" + +#: ../../library/functions.rst:0 +msgid ":func:`slice`" +msgstr ":func:`slice`" + +#: ../../library/functions.rst:0 +msgid ":func:`sorted`" +msgstr ":func:`sorted`" + +#: ../../library/functions.rst:0 +msgid ":func:`staticmethod`" +msgstr ":func:`staticmethod`" + +#: ../../library/functions.rst:0 +msgid "|func-str|_" +msgstr "|func-str|_" + +#: ../../library/functions.rst:0 +msgid ":func:`sum`" +msgstr ":func:`sum`" + +#: ../../library/functions.rst:0 +msgid ":func:`super`" +msgstr ":func:`super`" + +#: ../../library/functions.rst:0 +msgid "**T**" +msgstr "**T**" + +#: ../../library/functions.rst:0 +msgid "|func-tuple|_" +msgstr "|func-tuple|_" + +#: ../../library/functions.rst:0 +msgid ":func:`type`" +msgstr ":func:`type`" + +#: ../../library/functions.rst:0 +msgid "**V**" +msgstr "**V**" + +#: ../../library/functions.rst:0 +msgid ":func:`vars`" +msgstr ":func:`vars`" + +#: ../../library/functions.rst:0 +msgid "**Z**" +msgstr "**Z**" + +#: ../../library/functions.rst:0 +msgid ":func:`zip`" +msgstr ":func:`zip`" + +#: ../../library/functions.rst:0 +msgid "**_**" +msgstr "**_**" + +#: ../../library/functions.rst:0 +msgid ":func:`__import__`" +msgstr ":func:`__import__`" + +#: ../../library/functions.rst:59 +msgid "" +"Return the absolute value of a number. The argument may be an integer, a " +"floating-point number, or an object implementing :meth:`~object.__abs__`. If" +" the argument is a complex number, its magnitude is returned." +msgstr "" +"返回一个数字的绝对值。参数可以是整数、浮点数或任何实现了 :meth:`~object.__abs__` 的对象。如果参数是一个复数,则返回它的模。" + +#: ../../library/functions.rst:67 +msgid "" +"Return an :term:`asynchronous iterator` for an :term:`asynchronous " +"iterable`. Equivalent to calling ``x.__aiter__()``." +msgstr "" +"返回 :term:`asynchronous iterable` 的 :term:`asynchronous iterator`。相当于调用 " +"``x.__aiter__()``。" + +#: ../../library/functions.rst:70 +msgid "Note: Unlike :func:`iter`, :func:`aiter` has no 2-argument variant." +msgstr "注意:与 :func:`iter` 不同,:func:`aiter` 没有两个参数的版本。" + +#: ../../library/functions.rst:76 +msgid "" +"Return ``True`` if all elements of the *iterable* are true (or if the " +"iterable is empty). Equivalent to::" +msgstr "如果 *iterable* 的所有元素均为真值(或可迭代对象为空)则返回 ``True``。等价于::" + +#: ../../library/functions.rst:79 +msgid "" +"def all(iterable):\n" +" for element in iterable:\n" +" if not element:\n" +" return False\n" +" return True" +msgstr "" +"def all(iterable):\n" +" for element in iterable:\n" +" if not element:\n" +" return False\n" +" return True" + +#: ../../library/functions.rst:89 +msgid "" +"When awaited, return the next item from the given :term:`asynchronous " +"iterator`, or *default* if given and the iterator is exhausted." +msgstr "" +"当进入 await 状态时,从给定 :term:`asynchronous iterator` 返回下一数据项,迭代完毕则返回 *default*。" + +#: ../../library/functions.rst:92 +msgid "" +"This is the async variant of the :func:`next` builtin, and behaves " +"similarly." +msgstr "这是内置函数 :func:`next` 的异步版本,行为类似。" + +#: ../../library/functions.rst:95 +msgid "" +"This calls the :meth:`~object.__anext__` method of *async_iterator*, " +"returning an :term:`awaitable`. Awaiting this returns the next value of the " +"iterator. If *default* is given, it is returned if the iterator is " +"exhausted, otherwise :exc:`StopAsyncIteration` is raised." +msgstr "" +"调用 *async_iterator* 的 :meth:`~object.__anext__` 方法,返回一个 " +":term:`awaitable`。等待返回迭代器的下一个值。若有给出 *default*,则在迭代完毕后会返回给出的值,否则会触发 " +":exc:`StopAsyncIteration`." + +#: ../../library/functions.rst:104 +msgid "" +"Return ``True`` if any element of the *iterable* is true. If the iterable " +"is empty, return ``False``. Equivalent to::" +msgstr "如果 *iterable* 的任一元素为真值则返回 ``True``。如果可迭代对象为空,返回 ``False``。等价于::" + +#: ../../library/functions.rst:107 +msgid "" +"def any(iterable):\n" +" for element in iterable:\n" +" if element:\n" +" return True\n" +" return False" +msgstr "" +"def any(iterable):\n" +" for element in iterable:\n" +" if element:\n" +" return True\n" +" return False" + +#: ../../library/functions.rst:116 +msgid "" +"As :func:`repr`, return a string containing a printable representation of an" +" object, but escape the non-ASCII characters in the string returned by " +":func:`repr` using ``\\x``, ``\\u``, or ``\\U`` escapes. This generates a " +"string similar to that returned by :func:`repr` in Python 2." +msgstr "" +"与 :func:`repr` 类似,返回一个包含对象的可打印表示形式的字符串,但是使用 ``\\x``、``\\u`` 和 ``\\U`` 对 " +":func:`repr` 返回的字符串中非 ASCII 编码的字符进行转义。生成的字符串和 Python 2 的 :func:`repr` " +"返回的结果相似。" + +#: ../../library/functions.rst:124 +msgid "" +"Convert an integer number to a binary string prefixed with \"0b\". The " +"result is a valid Python expression. If *integer* is not a Python " +":class:`int` object, it has to define an :meth:`~object.__index__` method " +"that returns an integer. Some examples:" +msgstr "" +" 的二进制数字符串。结果是一个合法的 Python 表达式。如果 *integer* 不是一个 Python :class:`int` " +"对象,则它必须定义返回一个整数的 :meth:`~object.__index__` 方法。下面是一些例子:" + +#: ../../library/functions.rst:134 +msgid "" +"If the prefix \"0b\" is desired or not, you can use either of the following " +"ways." +msgstr "若要控制是否显示前缀“0b”,可以采用以下两种方案:" + +#: ../../library/functions.rst:141 +msgid "" +"See also :func:`enum.bin` to represent negative values as twos-complement." +msgstr "另请参见以补码表示负值的 :func:`enum.bin`。" + +#: ../../library/functions.rst:143 ../../library/functions.rst:956 +#: ../../library/functions.rst:1340 +msgid "See also :func:`format` for more information." +msgstr "另见 :func:`format` 获取更多信息。" + +#: ../../library/functions.rst:148 +msgid "" +"Return a Boolean value, i.e. one of ``True`` or ``False``. The argument is " +"converted using the standard :ref:`truth testing procedure `. If the " +"argument is false or omitted, this returns ``False``; otherwise, it returns " +"``True``. The :class:`bool` class is a subclass of :class:`int` (see " +":ref:`typesnumeric`). It cannot be subclassed further. Its only instances " +"are ``False`` and ``True`` (see :ref:`typebool`)." +msgstr "" +"返回布尔值,即 ``True`` 或 ``False`` 中的一个。其参数将使用标准的 :ref:`真值测试过程 ` 来转换。 " +"如果该参数为假值或被省略,则返回 ``False``;在其他情况下,将返回 ``True``。 :class:`bool` 类是 " +":class:`int` 的子类 (参见 :ref:`typesnumeric`)。它不能被继续子类化。它只有 ``False`` 和 ``True``" +" 这两个实例 (参见 :ref:`typebool`)。" + +#: ../../library/functions.rst:158 ../../library/functions.rst:821 +msgid "The parameter is now positional-only." +msgstr "该形参现在为仅限位置形参。" + +#: ../../library/functions.rst:163 +msgid "" +"This function drops you into the debugger at the call site. Specifically, " +"it calls :func:`sys.breakpointhook`, passing ``args`` and ``kws`` straight " +"through. By default, ``sys.breakpointhook()`` calls :func:`pdb.set_trace` " +"expecting no arguments. In this case, it is purely a convenience function " +"so you don't have to explicitly import :mod:`pdb` or type as much code to " +"enter the debugger. However, :func:`sys.breakpointhook` can be set to some " +"other function and :func:`breakpoint` will automatically call that, allowing" +" you to drop into the debugger of choice. If :func:`sys.breakpointhook` is " +"not accessible, this function will raise :exc:`RuntimeError`." +msgstr "" +"此函数会在调用位置进入调试器。具体来说,它将调用 :func:`sys.breakpointhook`,直接传递 ``args`` 和 " +"``kws``。在默认情况下,``sys.breakpointhook()`` 将不带参数地调用 :func:`pdb.set_trace`。 " +"在此情况下,它纯粹是一个便捷函数让你不必显式地导入 :mod:`pdb` 或键入过多代码即可进入调试器。 " +"不过,:func:`sys.breakpointhook` 也可被设置为某些其他函数并被 :func:`breakpoint` " +"自动调用,允许你进入选定的调试器。如果 :func:`sys.breakpointhook` 不可用,此函数将引发 " +":exc:`RuntimeError`." + +#: ../../library/functions.rst:175 +msgid "" +"By default, the behavior of :func:`breakpoint` can be changed with the " +":envvar:`PYTHONBREAKPOINT` environment variable. See " +":func:`sys.breakpointhook` for usage details." +msgstr "" +"在默认情况下,:func:`breakpoint` 的行为可使用 :envvar:`PYTHONBREAKPOINT` 环境变量来改变。请参阅 " +":func:`sys.breakpointhook` 了解详细用法。" + +#: ../../library/functions.rst:179 +msgid "" +"Note that this is not guaranteed if :func:`sys.breakpointhook` has been " +"replaced." +msgstr "请注意如果 :func:`sys.breakpointhook` 已被替换,则上述行为不一定有效。" + +#: ../../library/functions.rst:182 +msgid "" +"Raises an :ref:`auditing event ` ``builtins.breakpoint`` with " +"argument ``breakpointhook``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``builtins.breakpoint`` 并附带参数 " +"``breakpointhook``." + +#: ../../library/functions.rst:191 +msgid "" +"Return a new array of bytes. The :class:`bytearray` class is a mutable " +"sequence of integers in the range 0 <= x < 256. It has most of the usual " +"methods of mutable sequences, described in :ref:`typesseq-mutable`, as well " +"as most methods that the :class:`bytes` type has, see :ref:`bytes-methods`." +msgstr "" +"返回一个新的 bytes 数组。 :class:`bytearray` 类是一个可变序列,包含范围为 0 <= x < 256 " +"的整数。它有可变序列大部分常见的方法,见 :ref:`typesseq-mutable` 的描述;同时有 :class:`bytes` " +"类型的大部分方法,参见 :ref:`bytes-methods`。" + +#: ../../library/functions.rst:196 +msgid "" +"The optional *source* parameter can be used to initialize the array in a few" +" different ways:" +msgstr "可选形参 *source* 可以用不同的方式来初始化数组:" + +#: ../../library/functions.rst:199 +msgid "" +"If it is a *string*, you must also give the *encoding* (and optionally, " +"*errors*) parameters; :func:`bytearray` then converts the string to bytes " +"using :meth:`str.encode`." +msgstr "" +"如果是一个 *string*,您必须提供 *encoding* 参数(*errors* 参数仍是可选的);:func:`bytearray` 会使用 " +":meth:`str.encode` 方法来将 string 转变成 bytes。" + +#: ../../library/functions.rst:203 +msgid "" +"If it is an *integer*, the array will have that size and will be initialized" +" with null bytes." +msgstr "如果是一个 *integer*,会初始化大小为该数字的数组,并使用 null 字节填充。" + +#: ../../library/functions.rst:206 +msgid "" +"If it is an object conforming to the :ref:`buffer interface " +"`, a read-only buffer of the object will be used to " +"initialize the bytes array." +msgstr "如果是一个遵循 :ref:`缓冲区接口 ` 的对象,该对象的只读缓冲区将被用来初始化字节数组。" + +#: ../../library/functions.rst:209 +msgid "" +"If it is an *iterable*, it must be an iterable of integers in the range ``0 " +"<= x < 256``, which are used as the initial contents of the array." +msgstr "如果是一个 *iterable* 可迭代对象,它的元素的范围必须是 ``0 <= x < 256`` 的整数,它会被用作数组的初始内容。" + +#: ../../library/functions.rst:212 +msgid "Without an argument, an array of size 0 is created." +msgstr "如果没有实参,则创建大小为 0 的数组。" + +#: ../../library/functions.rst:214 +msgid "See also :ref:`binaryseq` and :ref:`typebytearray`." +msgstr "另见 :ref:`binaryseq` 和 :ref:`typebytearray`。" + +#: ../../library/functions.rst:222 +msgid "" +"Return a new \"bytes\" object which is an immutable sequence of integers in " +"the range ``0 <= x < 256``. :class:`bytes` is an immutable version of " +":class:`bytearray` -- it has the same non-mutating methods and the same " +"indexing and slicing behavior." +msgstr "" +"返回一个新的“bytes”对象,这是一个不可变序列,包含范围为 ``0 <= x < 256`` 的整数。:class:`bytes` 是 " +":class:`bytearray` 的不可变版本——带有同样不改变序列的方法,支持同样的索引、切片操作。" + +#: ../../library/functions.rst:227 +msgid "" +"Accordingly, constructor arguments are interpreted as for :func:`bytearray`." +msgstr "因此,构造函数的实参和 :func:`bytearray` 相同。" + +#: ../../library/functions.rst:229 +msgid "Bytes objects can also be created with literals, see :ref:`strings`." +msgstr "字节对象还可以用字面值创建,参见 :ref:`strings`。" + +#: ../../library/functions.rst:231 +msgid "See also :ref:`binaryseq`, :ref:`typebytes`, and :ref:`bytes-methods`." +msgstr "另见 :ref:`binaryseq`,:ref:`typebytes` 和 :ref:`bytes-methods`。" + +#: ../../library/functions.rst:236 +msgid "" +"Return :const:`True` if the *object* argument appears callable, " +":const:`False` if not. If this returns ``True``, it is still possible that " +"a call fails, but if it is ``False``, calling *object* will never succeed. " +"Note that classes are callable (calling a class returns a new instance); " +"instances are callable if their class has a :meth:`~object.__call__` method." +msgstr "" +"如果 *object* 参数是可调用的则返回 :const:`True`,否则返回 :const:`False`。如果返回 " +"``True``,调用仍可能失败,但如果返回 ``False``,则调用 *object* 肯定不会成功。 " +"请注意类是可调用的(调用类将返回一个新的实例);如果实例所属的类有 :meth:`~object.__call__` 方法则它就是可调用的。" + +#: ../../library/functions.rst:242 +msgid "" +"This function was first removed in Python 3.0 and then brought back in " +"Python 3.2." +msgstr "这个函数一开始在 Python 3.0 被移除了,但在 Python 3.2 被重新加入。" + +#: ../../library/functions.rst:249 +msgid "" +"Return the string representing a character with the specified Unicode code " +"point. For example, ``chr(97)`` returns the string ``'a'``, while " +"``chr(8364)`` returns the string ``'€'``. This is the inverse of " +":func:`ord`." +msgstr "" +"返回表示指定 Unicode 码位对应字符的字符串。例如,``chr(97)`` 返回字符串 ``'a'``,而 ``chr(8364)`` 返回字符串" +" ``'€'``。此函数是 :func:`ord` 的逆操作。" + +#: ../../library/functions.rst:253 +msgid "" +"The valid range for the argument is from 0 through 1,114,111 (0x10FFFF in " +"base 16). :exc:`ValueError` will be raised if it is outside that range." +msgstr "" +"该参数的有效范围是 0 到 1,114,111(16 进制表示是 0x10FFFF)。如果超过这个范围,会引发 :exc:`ValueError` " +"异常。" + +#: ../../library/functions.rst:259 +msgid "Transform a method into a class method." +msgstr "把一个方法封装成类方法。" + +#: ../../library/functions.rst:261 +msgid "" +"A class method receives the class as an implicit first argument, just like " +"an instance method receives the instance. To declare a class method, use " +"this idiom::" +msgstr "类方法隐含的第一个参数就是类,就像实例方法接收实例作为参数一样。要声明一个类方法,按惯例请使用以下方案:" + +#: ../../library/functions.rst:265 +msgid "" +"class C:\n" +" @classmethod\n" +" def f(cls, arg1, arg2): ..." +msgstr "" +"class C:\n" +" @classmethod\n" +" def f(cls, arg1, arg2): ..." + +#: ../../library/functions.rst:269 +msgid "" +"The ``@classmethod`` form is a function :term:`decorator` -- see " +":ref:`function` for details." +msgstr "" +"``@classmethod`` 这样的形式称为函数的 :term:`decorator` -- 详情参阅 :ref:`function`。" + +#: ../../library/functions.rst:272 +msgid "" +"A class method can be called either on the class (such as ``C.f()``) or on " +"an instance (such as ``C().f()``). The instance is ignored except for its " +"class. If a class method is called for a derived class, the derived class " +"object is passed as the implied first argument." +msgstr "" +"类方法的调用可以在类上进行 (例如 ``C.f()``) 也可以在实例上进行 (例如 ``C().f()``)。其所属类以外的类实例会被忽略。 " +"如果类方法在其所属类的派生类上调用,则该派生类对象会被作为隐含的第一个参数被传入。" + +#: ../../library/functions.rst:277 +msgid "" +"Class methods are different than C++ or Java static methods. If you want " +"those, see :func:`staticmethod` in this section. For more information on " +"class methods, see :ref:`types`." +msgstr "" +"类方法与 C++ 或 Java 中的静态方法不同。如果你需要后者,请参阅本节中的 :func:`staticmethod`。 " +"有关类方法的更多信息,请参阅 :ref:`types`。" + +#: ../../library/functions.rst:281 +msgid "" +"Class methods can now wrap other :term:`descriptors ` such as " +":func:`property`." +msgstr "类方法现在可以包装其他 :term:`描述器 ` 例如 :func:`property`。" + +#: ../../library/functions.rst:285 +msgid "" +"Class methods now inherit the method attributes " +"(:attr:`~function.__module__`, :attr:`~function.__name__`, " +":attr:`~function.__qualname__`, :attr:`~function.__doc__` and " +":attr:`~function.__annotations__`) and have a new ``__wrapped__`` attribute." +msgstr "" +"类方法现在继承了方法的属性 (:attr:`~function.__module__`, :attr:`~function.__name__`, " +":attr:`~function.__qualname__`, :attr:`~function.__doc__` 和 " +":attr:`~function.__annotations__`) 并具有新的 ``__wrapped__`` 属性。" + +#: ../../library/functions.rst:292 +msgid "" +"Class methods can no longer wrap other :term:`descriptors ` such" +" as :func:`property`." +msgstr "类方法不再可以包装其他 :term:`描述器 ` 例如 :func:`property`。" + +#: ../../library/functions.rst:299 +msgid "" +"Compile the *source* into a code or AST object. Code objects can be " +"executed by :func:`exec` or :func:`eval`. *source* can either be a normal " +"string, a byte string, or an AST object. Refer to the :mod:`ast` module " +"documentation for information on how to work with AST objects." +msgstr "" +"将 *source* 编译成代码或 AST 对象。代码对象可以被 :func:`exec` 或 :func:`eval` 执行。*source* " +"可以是常规的字符串、字节字符串,或者 AST 对象。参见 :mod:`ast` 模块的文档了解如何使用 AST 对象。" + +#: ../../library/functions.rst:304 +msgid "" +"The *filename* argument should give the file from which the code was read; " +"pass some recognizable value if it wasn't read from a file (``''`` " +"is commonly used)." +msgstr "" +"*filename* 实参需要是代码读取的文件名;如果代码不需要从文件中读取,可以传入一些可辨识的值 (经常会使用 ``''``)。" + +#: ../../library/functions.rst:308 +msgid "" +"The *mode* argument specifies what kind of code must be compiled; it can be " +"``'exec'`` if *source* consists of a sequence of statements, ``'eval'`` if " +"it consists of a single expression, or ``'single'`` if it consists of a " +"single interactive statement (in the latter case, expression statements that" +" evaluate to something other than ``None`` will be printed)." +msgstr "" +"*mode* 实参指定了编译代码必须用的模式。如果 *source* 是语句序列,可以是 ``'exec'``;如果是单一表达式,可以是 " +"``'eval'``;如果是单个交互式语句,可以是 ``'single'``。(在最后一种情况下,如果表达式执行结果不是 ``None`` " +"将会被打印出来。)" + +#: ../../library/functions.rst:314 +msgid "" +"The optional arguments *flags* and *dont_inherit* control which " +":ref:`compiler options ` should be activated and which " +":ref:`future features ` should be allowed. If neither is present (or" +" both are zero) the code is compiled with the same flags that affect the " +"code that is calling :func:`compile`. If the *flags* argument is given and " +"*dont_inherit* is not (or is zero) then the compiler options and the future " +"statements specified by the *flags* argument are used in addition to those " +"that would be used anyway. If *dont_inherit* is a non-zero integer then the " +"*flags* argument is it -- the flags (future features and compiler options) " +"in the surrounding code are ignored." +msgstr "" +"可选参数 *flags* 和 *dont_inherit* 控制应当激活哪个 :ref:`编译器选项 ` " +"以及应当允许哪个 :ref:`future 特性 `。如果两者都未提供 (或都为零) 则代码会应用与调用 :func:`compile`" +" 的代码相同的旗标来编译。如果给出了 *flags* 参数而未给出 *dont_inherit* (或者为零) " +"则会在无论如何都将被使用的旗标之外还会额外使用 *flags* 参数所指定的编译器选项和 future 语句。如果 *dont_inherit* " +"为非零整数,则只使用 *flags* 参数 -- 外围代码中的旗标 (future 特性和编译器选项) 会被忽略。" + +#: ../../library/functions.rst:325 +msgid "" +"Compiler options and future statements are specified by bits which can be " +"bitwise ORed together to specify multiple options. The bitfield required to " +"specify a given future feature can be found as the " +":attr:`~__future__._Feature.compiler_flag` attribute on the " +":class:`~__future__._Feature` instance in the :mod:`__future__` module. " +":ref:`Compiler flags ` can be found in :mod:`ast` " +"module, with ``PyCF_`` prefix." +msgstr "" +"编译器选项和 future 语句是由比特位来指明的。比特位可以通过一起按位 OR 来指明多个选项。指明特定 future 特性所需的比特位可以在 " +":mod:`__future__` 模块的 :class:`~__future__._Feature` 实例的 " +":attr:`~__future__._Feature.compiler_flag` 属性中找到。 :ref:`编译器旗标 ` 可以在 :mod:`ast` 模块中查找带有 ``PyCF_`` 前缀的名称。" + +#: ../../library/functions.rst:333 +msgid "" +"The argument *optimize* specifies the optimization level of the compiler; " +"the default value of ``-1`` selects the optimization level of the " +"interpreter as given by :option:`-O` options. Explicit levels are ``0`` (no" +" optimization; ``__debug__`` is true), ``1`` (asserts are removed, " +"``__debug__`` is false) or ``2`` (docstrings are removed too)." +msgstr "" +"*optimize* 实参指定编译器的优化级别;默认值 ``-1`` 选择与解释器的 :option:`-O` 选项相同的优化级别。显式级别为 " +"``0`` (没有优化;``__debug__`` 为真)、``1`` (断言被删除,``__debug__`` 为假) 或 ``2`` " +"(文档字符串也被删除)。" + +#: ../../library/functions.rst:339 +msgid "" +"This function raises :exc:`SyntaxError` or :exc:`ValueError` if the compiled" +" source is invalid." +msgstr "如果编译的源码不可用则此函数将引发 :exc:`SyntaxError` 或 :exc:`ValueError`。" + +#: ../../library/functions.rst:342 +msgid "" +"If you want to parse Python code into its AST representation, see " +":func:`ast.parse`." +msgstr "如果您想分析 Python 代码的 AST 表示,请参阅 :func:`ast.parse`。" + +#: ../../library/functions.rst:345 ../../library/functions.rst:347 +msgid "" +"Raises an :ref:`auditing event ` ``compile`` with arguments " +"``source`` and ``filename``. This event may also be raised by implicit " +"compilation." +msgstr "" +"引发一个 :ref:`审计事件 ` ``compile`` 附带参数 ``source`` 和 ``filename``。 " +"此事件也可通过隐式编译来引发。" + +#: ../../library/functions.rst:353 +msgid "" +"When compiling a string with multi-line code in ``'single'`` or ``'eval'`` " +"mode, input must be terminated by at least one newline character. This is " +"to facilitate detection of incomplete and complete statements in the " +":mod:`code` module." +msgstr "" +"在 ``'single'`` 或 ``'eval'`` 模式编译多行代码字符串时,输入必须以至少一个换行符结尾。这使 :mod:`code` " +"模块更容易检测语句的完整性。" + +#: ../../library/functions.rst:360 +msgid "" +"It is possible to crash the Python interpreter with a sufficiently " +"large/complex string when compiling to an AST object due to stack depth " +"limitations in Python's AST compiler." +msgstr "在将足够大或者足够复杂的字符串编译成 AST 对象时,Python 解释器有可能因为 Python AST 编译器的栈深度限制而崩溃。" + +#: ../../library/functions.rst:364 +msgid "" +"Allowed use of Windows and Mac newlines. Also, input in ``'exec'`` mode " +"does not have to end in a newline anymore. Added the *optimize* parameter." +msgstr "" +"Windows 和 Mac 的换行符均可使用。而且在 ``'exec'`` 模式下的输入不必再以换行符结尾了。另增加了 *optimize* 参数。" + +#: ../../library/functions.rst:368 +msgid "" +"Previously, :exc:`TypeError` was raised when null bytes were encountered in " +"*source*." +msgstr "之前 *source* 中包含 null 字节的话会触发 :exc:`TypeError` 异常。" + +#: ../../library/functions.rst:372 +msgid "" +"``ast.PyCF_ALLOW_TOP_LEVEL_AWAIT`` can now be passed in flags to enable " +"support for top-level ``await``, ``async for``, and ``async with``." +msgstr "" +"``ast.PyCF_ALLOW_TOP_LEVEL_AWAIT`` 现在可在旗标中传入以启用对最高层级 ``await``, ``async " +"for`` 和 ``async with`` 的支持。" + +#: ../../library/functions.rst:381 +msgid "" +"Convert a single string or number to a complex number, or create a complex " +"number from real and imaginary parts." +msgstr "将特定的字符串或数字转换为一个复数,或基于特定的实部和虚部创建一个复数。" + +#: ../../library/functions.rst:384 ../../library/functions.rst:764 +#: ../../library/functions.rst:1012 +msgid "Examples:" +msgstr "示例:" + +#: ../../library/functions.rst:386 +msgid "" +">>> complex('+1.23')\n" +"(1.23+0j)\n" +">>> complex('-4.5j')\n" +"-4.5j\n" +">>> complex('-1.23+4.5j')\n" +"(-1.23+4.5j)\n" +">>> complex('\\t( -1.23+4.5J )\\n')\n" +"(-1.23+4.5j)\n" +">>> complex('-Infinity+NaNj')\n" +"(-inf+nanj)\n" +">>> complex(1.23)\n" +"(1.23+0j)\n" +">>> complex(imag=-4.5)\n" +"-4.5j\n" +">>> complex(-1.23, 4.5)\n" +"(-1.23+4.5j)" +msgstr "" +">>> complex('+1.23')\n" +"(1.23+0j)\n" +">>> complex('-4.5j')\n" +"-4.5j\n" +">>> complex('-1.23+4.5j')\n" +"(-1.23+4.5j)\n" +">>> complex('\\t( -1.23+4.5J )\\n')\n" +"(-1.23+4.5j)\n" +">>> complex('-Infinity+NaNj')\n" +"(-inf+nanj)\n" +">>> complex(1.23)\n" +"(1.23+0j)\n" +">>> complex(imag=-4.5)\n" +"-4.5j\n" +">>> complex(-1.23, 4.5)\n" +"(-1.23+4.5j)" + +#: ../../library/functions.rst:405 +msgid "" +"If the argument is a string, it must contain either a real part (in the same" +" format as for :func:`float`) or an imaginary part (in the same format but " +"with a ``'j'`` or ``'J'`` suffix), or both real and imaginary parts (the " +"sign of the imaginary part is mandatory in this case). The string can " +"optionally be surrounded by whitespaces and the round parentheses ``'('`` " +"and ``')'``, which are ignored. The string must not contain whitespace " +"between ``'+'``, ``'-'``, the ``'j'`` or ``'J'`` suffix, and the decimal " +"number. For example, ``complex('1+2j')`` is fine, but ``complex('1 + 2j')`` " +"raises :exc:`ValueError`. More precisely, the input must conform to the " +":token:`~float:complexvalue` production rule in the following grammar, after" +" parentheses and leading and trailing whitespace characters are removed:" +msgstr "" +"如果该参数为字符串,则它必须包含一个实部(格式与 :func:`float` 接受格式相同)或一个虚部(与实部格式相同但带有 ``'j'`` 或 " +"``'J'`` 后缀),或者同时包含实部和虚部(在此情况下虚部必须加上正负号)。该字符串首尾可以被空白字符和圆括号 ``'('`` 及 ``')'`` " +"包裹,但它们会被忽略。该字符串中的 ``'+'``, ``'-'``, ``'j'`` 或 ``'J'`` 后缀以及十进制数字之间不可存在空格。 " +"例如,``complex('1+2j')`` 是可以的,但 ``complex('1 + 2j')`` 则会引发 :exc:`ValueError`。 " +"更准确地说,输入在移除圆括号以及开头和末尾的空白字符之后,必须符合以下 :token:`~float:complexvalue` 产生式规则:" + +#: ../../library/functions.rst:424 +msgid "" +"If the argument is a number, the constructor serves as a numeric conversion " +"like :class:`int` and :class:`float`. For a general Python object ``x``, " +"``complex(x)`` delegates to ``x.__complex__()``. If " +":meth:`~object.__complex__` is not defined then it falls back to " +":meth:`~object.__float__`. If :meth:`!__float__` is not defined then it " +"falls back to :meth:`~object.__index__`." +msgstr "" +"如果该参数为数字,则此构造器将进行与 :class:`int` 和 :class:`float` 类似的数值转换。对于一个普通的 Python 对象 " +"``x``,``complex(x)`` 会委托给 ``x.__complex__()``。如果未定义 " +":meth:`~object.__complex__` 则它将回退至 :meth:`~object.__float__`。如果未定义 " +":meth:`!__float__` 则它将回退至 :meth:`~object.__index__`。" + +#: ../../library/functions.rst:433 +msgid "" +"If two arguments are provided or keyword arguments are used, each argument " +"may be any numeric type (including complex). If both arguments are real " +"numbers, return a complex number with the real component *real* and the " +"imaginary component *imag*. If both arguments are complex numbers, return a " +"complex number with the real component ``real.real-imag.imag`` and the " +"imaginary component ``real.imag+imag.real``. If one of arguments is a real " +"number, only its real component is used in the above expressions." +msgstr "" +"如果提供了两个参数或是使用了关键字参数,则每个参数可以为任意数字类型(包括复数)。如果两个参数均为实数值,则会返回一个实部为 *real* 而虚部为 " +"*imag* 的复数。如果两个参数均为复数值,则会返回一个实部为 ``real.real-imag.imag`` 而虚部为 " +"``real.imag+imag.real`` 的复数。如果有一个参数为实数值,则上面的表达式中将只用到实部。" + +#: ../../library/functions.rst:443 +msgid "" +"See also :meth:`complex.from_number` which only accepts a single numeric " +"argument." +msgstr "另请参阅仅接受单个数字参数的 :meth:`complex.from_number`。" + +#: ../../library/functions.rst:445 +msgid "If all arguments are omitted, returns ``0j``." +msgstr "如果省略所有参数,则返回 ``0j``。" + +#: ../../library/functions.rst:447 +msgid "The complex type is described in :ref:`typesnumeric`." +msgstr ":ref:`typesnumeric` 描述了复数类型。" + +#: ../../library/functions.rst:449 ../../library/functions.rst:818 +#: ../../library/functions.rst:1060 +msgid "Grouping digits with underscores as in code literals is allowed." +msgstr "您可以使用下划线将代码文字中的数字进行分组。" + +#: ../../library/functions.rst:452 +msgid "" +"Falls back to :meth:`~object.__index__` if :meth:`~object.__complex__` and " +":meth:`~object.__float__` are not defined." +msgstr "" +"如果 :meth:`~object.__complex__` 和 :meth:`~object.__float__` 均未定义则回退至 " +":meth:`~object.__index__`." + +#: ../../library/functions.rst:456 +msgid "" +"Passing a complex number as the *real* or *imag* argument is now deprecated;" +" it should only be passed as a single positional argument." +msgstr "以 *real* 或 *imag* 参数的形式传递复数现在已弃用;只能以单个位置参数传递。" + +#: ../../library/functions.rst:463 +msgid "" +"This is a relative of :func:`setattr`. The arguments are an object and a " +"string. The string must be the name of one of the object's attributes. The" +" function deletes the named attribute, provided the object allows it. For " +"example, ``delattr(x, 'foobar')`` is equivalent to ``del x.foobar``. *name* " +"need not be a Python identifier (see :func:`setattr`)." +msgstr "" +"这是 :func:`setattr` 的相关函数。其参数是一个对象和一个字符串。其中字符串必须是对象的某个属性的名称。 " +"该函数会删除指定的属性,如果对象允许这样做的话。例如,``delattr(x, 'foobar')`` 等价于 ``del x.foobar``。 " +"*name* 不要求必须是 Python 标识符 (参见 :func:`setattr`)。" + +#: ../../library/functions.rst:476 +msgid "" +"Create a new dictionary. The :class:`dict` object is the dictionary class. " +"See also :ref:`typesmapping` for documentation about this class." +msgstr "" + +#: ../../library/functions.rst:479 +msgid "" +"For other containers see the built-in :class:`list`, :class:`set`, and " +":class:`tuple` classes, as well as the :mod:`collections` module." +msgstr "" +"其他容器类型,请参见内置的 :class:`list`、:class:`set` 和 :class:`tuple` 类,以及 " +":mod:`collections` 模块。" + +#: ../../library/functions.rst:486 +msgid "" +"Without arguments, return the list of names in the current local scope. " +"With an argument, attempt to return a list of valid attributes for that " +"object." +msgstr "如果没有实参,则返回当前本地作用域中的名称列表。如果有实参,它会尝试返回该对象的有效属性列表。" + +#: ../../library/functions.rst:489 +msgid "" +"If the object has a method named :meth:`~object.__dir__`, this method will " +"be called and must return the list of attributes. This allows objects that " +"implement a custom :func:`~object.__getattr__` or " +":func:`~object.__getattribute__` function to customize the way :func:`dir` " +"reports their attributes." +msgstr "" +"如果对象有一个名为 :meth:`~object.__dir__` 的方法,则该方法将被调用并且必须返回由属性组成的列表。这允许实现自定义 " +":func:`~object.__getattr__` 或 :func:`~object.__getattribute__` 函数的对象能够定制 " +":func:`dir` 报告其属性的方式。" + +#: ../../library/functions.rst:496 +msgid "" +"If the object does not provide :meth:`~object.__dir__`, the function tries " +"its best to gather information from the object's :attr:`~object.__dict__` " +"attribute, if defined, and from its type object. The resulting list is not " +"necessarily complete and may be inaccurate when the object has a custom " +":func:`~object.__getattr__`." +msgstr "" +"如果对象未提供 :meth:`~object.__dir__`,该函数会尽量从对象所定义的 :attr:`~object.__dict__` " +"属性和其类型对象中收集信息。结果列表不一定是完整的,并且当对象具有自定义的 :func:`~object.__getattr__` 时还可能是不准确的。" + +#: ../../library/functions.rst:502 +msgid "" +"The default :func:`dir` mechanism behaves differently with different types " +"of objects, as it attempts to produce the most relevant, rather than " +"complete, information:" +msgstr "默认的 :func:`dir` 机制对不同类型的对象行为不同,它会试图返回最相关而不是最全的信息:" + +#: ../../library/functions.rst:506 +msgid "" +"If the object is a module object, the list contains the names of the " +"module's attributes." +msgstr "如果对象是模块对象,则列表包含模块的属性名称。" + +#: ../../library/functions.rst:509 +msgid "" +"If the object is a type or class object, the list contains the names of its " +"attributes, and recursively of the attributes of its bases." +msgstr "如果对象是类型或类对象,则列表包含它们的属性名称,并且递归查找所有基类的属性。" + +#: ../../library/functions.rst:512 +msgid "" +"Otherwise, the list contains the object's attributes' names, the names of " +"its class's attributes, and recursively of the attributes of its class's " +"base classes." +msgstr "否则,列表包含对象的属性名称,它的类属性名称,并且递归查找它的类的所有基类的属性。" + +#: ../../library/functions.rst:516 +msgid "The resulting list is sorted alphabetically. For example:" +msgstr "返回的列表按字母表排序。例如:" + +#: ../../library/functions.rst:536 +msgid "" +"Because :func:`dir` is supplied primarily as a convenience for use at an " +"interactive prompt, it tries to supply an interesting set of names more than" +" it tries to supply a rigorously or consistently defined set of names, and " +"its detailed behavior may change across releases. For example, metaclass " +"attributes are not in the result list when the argument is a class." +msgstr "" +"因为 :func:`dir` " +"主要是为了便于在交互式时使用,所以它会试图返回人们感兴趣的名字集合,而不是试图保证结果的严格性或一致性,它具体的行为也可能在不同版本之间改变。例如,当实参是一个类时,metaclass" +" 的属性不包含在结果列表中。" + +#: ../../library/functions.rst:546 +msgid "" +"Take two (non-complex) numbers as arguments and return a pair of numbers " +"consisting of their quotient and remainder when using integer division. " +"With mixed operand types, the rules for binary arithmetic operators apply. " +"For integers, the result is the same as ``(a // b, a % b)``. For floating-" +"point numbers the result is ``(q, a % b)``, where *q* is usually " +"``math.floor(a / b)`` but may be 1 less than that. In any case ``q * b + a " +"% b`` is very close to *a*, if ``a % b`` is non-zero it has the same sign as" +" *b*, and ``0 <= abs(a % b) < abs(b)``." +msgstr "" +"接受两个(非复数)数字作为参数并返回由当对其使用整数除法时的商和余数组成的数字对。在混用不同的操作数类型时,则会应用二元算术运算符的规则。 " +"对于整数来说,结果与 ``(a // b, a % b)`` 相同。对于浮点数来说则结果为 ``(q, a % b)``,其中 *q* 通常为 " +"``math.floor(a / b)`` 但可能会比它小 1。在任何情况下 ``q * b + a % b`` 都非常接近 *a*,如果 ``a % " +"b`` 为非零值则它将具有与 *b* 相同的正负号,并且 ``0 <= abs(a % b) < abs(b)``。" + +#: ../../library/functions.rst:558 +msgid "" +"Return an enumerate object. *iterable* must be a sequence, an " +":term:`iterator`, or some other object which supports iteration. The " +":meth:`~iterator.__next__` method of the iterator returned by " +":func:`enumerate` returns a tuple containing a count (from *start* which " +"defaults to 0) and the values obtained from iterating over *iterable*." +msgstr "" +"返回一个枚举对象。*iterable* 必须是一个序列,或 :term:`iterator`,或其他支持迭代的对象。 :func:`enumerate`" +" 返回的迭代器的 :meth:`~iterator.__next__` 方法返回一个元组,里面包含一个计数值(从 *start* 开始,默认为 " +"0)和通过迭代 *iterable* 获得的值。" + +#: ../../library/functions.rst:570 +msgid "Equivalent to::" +msgstr "等价于::" + +#: ../../library/functions.rst:572 +msgid "" +"def enumerate(iterable, start=0):\n" +" n = start\n" +" for elem in iterable:\n" +" yield n, elem\n" +" n += 1" +msgstr "" +"def enumerate(iterable, start=0):\n" +" n = start\n" +" for elem in iterable:\n" +" yield n, elem\n" +" n += 1" + +#: ../../library/functions.rst:0 +msgid "Parameters" +msgstr "参数" + +#: ../../library/functions.rst:582 +msgid "A Python expression." +msgstr "一个 Python 表达式。" + +#: ../../library/functions.rst:586 +msgid "The global namespace (default: ``None``)." +msgstr "全局命名空间 (默认值: ``None``)。" + +#: ../../library/functions.rst:590 +msgid "The local namespace (default: ``None``)." +msgstr "局部命名空间 (默认值: ``None``)。" + +#: ../../library/functions.rst:0 +msgid "Returns" +msgstr "返回" + +#: ../../library/functions.rst:594 +msgid "The result of the evaluated expression." +msgstr "被求值表达式的求值结果。" + +#: ../../library/functions.rst:0 +msgid "raises" +msgstr "引发" + +#: ../../library/functions.rst:595 +msgid "Syntax errors are reported as exceptions." +msgstr "语法错误将作为异常被报告。" + +#: ../../library/functions.rst:599 ../../library/functions.rst:665 +msgid "" +"This function executes arbitrary code. Calling it with untrusted user-" +"supplied input will lead to security vulnerabilities." +msgstr "此函数可执行任意代码。 调用它时附带用户提供的输入会导致安全弱点。" + +#: ../../library/functions.rst:602 +msgid "" +"The *source* argument is parsed and evaluated as a Python expression " +"(technically speaking, an :ref:`expression list `) using the " +"*globals* and *locals* mappings as global and local namespace. If the " +"*globals* dictionary is present and does not contain a value for the key " +"``__builtins__``, a reference to the dictionary of the built-in module " +":mod:`builtins` is inserted under that key before *source* is parsed. " +"Overriding ``__builtins__`` can be used to restrict or change the available " +"names, but this is **not** a security mechanism: the executed code can still" +" access all builtins. If the *locals* mapping is omitted it defaults to the " +"*globals* dictionary. If both mappings are omitted, the source is executed " +"with the *globals* and *locals* in the environment where :func:`eval` is " +"called. Note, *eval()* will only have access to the :term:`nested scopes " +"` (non-locals) in the enclosing environment if they are " +"already referenced in the scope that is calling :func:`eval` (e.g. via a " +":keyword:`nonlocal` statement)." +msgstr "" + +#: ../../library/functions.rst:620 +msgid "Example:" +msgstr "示例:" + +#: ../../library/functions.rst:629 +msgid "" +"This function can also be used to execute arbitrary code objects (such as " +"those created by :func:`compile`). In this case, pass a code object instead" +" of a string. If the code object has been compiled with ``'exec'`` as the " +"*mode* argument, :func:`eval`\\'s return value will be ``None``." +msgstr "" +"该函数还可用于执行任意代码对象(比如由 :func:`compile` 创建的对象)。这时传入的是代码对象,而非一个字符串了。如果代码对象已用参数为 " +"*mode* 的 ``'exec'`` 进行了编译,那么 :func:`eval` 的返回值将为 ``None``。" + +#: ../../library/functions.rst:634 +msgid "" +"Hints: dynamic execution of statements is supported by the :func:`exec` " +"function. The :func:`globals` and :func:`locals` functions return the " +"current global and local dictionary, respectively, which may be useful to " +"pass around for use by :func:`eval` or :func:`exec`." +msgstr "" +"提示: :func:`exec` 函数支持语句的动态执行。 :func:`globals` 和 :func:`locals` " +"函数分别返回当前的全局和本地字典,可供传给 :func:`eval` 或 :func:`exec` 使用。" + +#: ../../library/functions.rst:639 +msgid "" +"If the given source is a string, then leading and trailing spaces and tabs " +"are stripped." +msgstr "如果给出的源数据是个字符串,那么其前后的空格和制表符将被剔除。" + +#: ../../library/functions.rst:642 +msgid "" +"See :func:`ast.literal_eval` for a function to evaluate strings with " +"expressions containing only literals." +msgstr "用于执行仅包含字面值的表达式的函数参见 :func:`ast.literal_eval`。" + +#: ../../library/functions.rst:645 ../../library/functions.rst:647 +#: ../../library/functions.rst:708 ../../library/functions.rst:710 +msgid "" +"Raises an :ref:`auditing event ` ``exec`` with the code object as " +"the argument. Code compilation events may also be raised." +msgstr "引发一个 :ref:`审计事件 ` ``exec`` 附带代码对象作为参数。代码编译事件也可能被引发。" + +#: ../../library/functions.rst:652 ../../library/functions.rst:730 +msgid "The *globals* and *locals* arguments can now be passed as keywords." +msgstr "现在可以将 *globals* 和 *locals* 作为关键字参数传入。" + +#: ../../library/functions.rst:656 ../../library/functions.rst:734 +msgid "" +"The semantics of the default *locals* namespace have been adjusted as " +"described for the :func:`locals` builtin." +msgstr "默认 *locals* 命名空间的语义已被调整为与 :func:`locals` 内置函数的描述一致。" + +#: ../../library/functions.rst:668 +msgid "" +"This function supports dynamic execution of Python code. *source* must be " +"either a string or a code object. If it is a string, the string is parsed " +"as a suite of Python statements which is then executed (unless a syntax " +"error occurs). [#]_ If it is a code object, it is simply executed. In all " +"cases, the code that's executed is expected to be valid as file input (see " +"the section :ref:`file-input` in the Reference Manual). Be aware that the " +":keyword:`nonlocal`, :keyword:`yield`, and :keyword:`return` statements may" +" not be used outside of function definitions even within the context of code" +" passed to the :func:`exec` function. The return value is ``None``." +msgstr "" +"这个函数支持动态执行 Python 代码。 *source* 必须是字符串或代码对象。如果是字符串,那么该字符串将被解析为一组 Python " +"语句并随即被执行(除非发生语法错误)。 [#]_ 如果是代码对象,那么它将被直接执行。在所有情况下,被执行的代码都应当是有效的文件输入(见参考手册中的 " +":ref:`file-input` 一节)。请注意即使是在传递给 :func:`exec` 函数的代码的上下文中 " +":keyword:`nonlocal`, :keyword:`yield` 和 :keyword:`return` 语句也不可在函数定义以外使用。 " +"函数的返回值为 ``None``。" + +#: ../../library/functions.rst:679 +msgid "" +"In all cases, if the optional parts are omitted, the code is executed in the" +" current scope. If only *globals* is provided, it must be a dictionary (and" +" not a subclass of dictionary), which will be used for both the global and " +"the local variables. If *globals* and *locals* are given, they are used for" +" the global and local variables, respectively. If provided, *locals* can be" +" any mapping object. Remember that at the module level, globals and locals " +"are the same dictionary." +msgstr "" +"在所有情况下,如果省略了可选部分,代码将在当前作用域中执行。如果只提供了 " +"*globals*,则它必须是一个字典(并且不能是字典的子类),它将被同时用于全局和局部变量。如果给出了 *globals* 和 " +"*locals*,它们将被分别用于全局和局部变量。如果提供了 *locals*,它可以是任何映射对象。请记住在模块层级上,globals 和 " +"locals 是同一个字典。" + +#: ../../library/functions.rst:689 +msgid "" +"When ``exec`` gets two separate objects as *globals* and *locals*, the code " +"will be executed as if it were embedded in a class definition. This means " +"functions and classes defined in the executed code will not be able to " +"access variables assigned at the top level (as the \"top level\" variables " +"are treated as class variables in a class definition)." +msgstr "" +"当 ``exec`` 获得两个不同的对象作为 *globals* 和 *locals* 时,代码被执行时就会像是嵌套在一个类定义中那样。 " +"这意味着在被执行代码中定义的函数和类将无法访问在最高层级上赋值的变量(因为“最高层级”变量会被当作是类定义中的类变量来对待)。" + +#: ../../library/functions.rst:695 +msgid "" +"If the *globals* dictionary does not contain a value for the key " +"``__builtins__``, a reference to the dictionary of the built-in module " +":mod:`builtins` is inserted under that key. Overriding ``__builtins__`` can " +"be used to restrict or change the available names, but this is **not** a " +"security mechanism: the executed code can still access all builtins." +msgstr "" +"如果 *globals* 字典不包含 ``__builtins__`` 键值,则会为该键插入对内置模块 :mod:`builtins` 的字典的引用。 " +"可以使用重写 ``__builtins__`` 来限制或修改可用名称,但这 **不是** 一种安全的机制:被执行的代码仍然可以访问所有内置对象。" + +#: ../../library/functions.rst:702 +msgid "" +"The *closure* argument specifies a closure--a tuple of cellvars. It's only " +"valid when the *object* is a code object containing :term:`free (closure) " +"variables `. The length of the tuple must exactly match " +"the length of the code object's :attr:`~codeobject.co_freevars` attribute." +msgstr "" +"*closure* 参数指定了一个闭包 —— 一个单元变量的元组。它只有在 *object* 是一个包含 :term:`自由(闭包)变量 " +"` 的代码对象时才有效。元组的长度必须与代码对象的 :attr:`~codeobject.co_freevars` " +"属性的长度完全匹配。" + +#: ../../library/functions.rst:715 +msgid "" +"The built-in functions :func:`globals` and :func:`locals` return the current" +" global and local namespace, respectively, which may be useful to pass " +"around for use as the second and third argument to :func:`exec`." +msgstr "" +"内置函数 :func:`globals` 和 :func:`locals` 分别返回当前的全局和局部字典,这在用作 :func:`exec` " +"的第二个和第三个参数进行传递时会很有用处。" + +#: ../../library/functions.rst:721 +msgid "" +"The default *locals* act as described for function :func:`locals` below. " +"Pass an explicit *locals* dictionary if you need to see effects of the code " +"on *locals* after function :func:`exec` returns." +msgstr "" +"默认的 *locals* 行为与下面 :func:`locals` 函数所描述的一样。如果你需要在 :func:`exec` 返回之后查看代码对 " +"*locals* 的影响可以显式地传入一个 *locals* 字典。" + +#: ../../library/functions.rst:725 +msgid "Added the *closure* parameter." +msgstr "添加了 *closure* 参数。" + +#: ../../library/functions.rst:740 +msgid "" +"Construct an iterator from those elements of *iterable* for which *function*" +" is true. *iterable* may be either a sequence, a container which supports " +"iteration, or an iterator. If *function* is ``None``, the identity function" +" is assumed, that is, all elements of *iterable* that are false are removed." +msgstr "" +"使用 *iterable* 中 *function* 返回真值的元素构造一个迭代器。 *iterable* " +"可以是一个序列,一个支持迭代的容器或者一个迭代器。如果 *function* 为 ``None``,则会使用标识函数,也就是说,*iterable* " +"中所有具有假值的元素都将被移除。" + +#: ../../library/functions.rst:746 +msgid "" +"Note that ``filter(function, iterable)`` is equivalent to the generator " +"expression ``(item for item in iterable if function(item))`` if function is " +"not ``None`` and ``(item for item in iterable if item)`` if function is " +"``None``." +msgstr "" +"请注意,``filter(function, iterable)`` 相当于一个生成器表达式,当 function 不是 ``None`` 的时候为 " +"``(item for item in iterable if function(item))``;function 是 ``None`` 的时候为 " +"``(item for item in iterable if item)``." + +#: ../../library/functions.rst:751 +msgid "" +"See :func:`itertools.filterfalse` for the complementary function that " +"returns elements of *iterable* for which *function* is false." +msgstr "" +"请参阅 :func:`itertools.filterfalse` 来了解返回 *iterable* 中 *function* " +"返回假值的元素的补充函数。" + +#: ../../library/functions.rst:762 +msgid "Return a floating-point number constructed from a number or a string." +msgstr "返回基于一个数字或字符串构建的浮点数。" + +#: ../../library/functions.rst:766 +msgid "" +">>> float('+1.23')\n" +"1.23\n" +">>> float(' -12345\\n')\n" +"-12345.0\n" +">>> float('1e-003')\n" +"0.001\n" +">>> float('+1E6')\n" +"1000000.0\n" +">>> float('-Infinity')\n" +"-inf" +msgstr "" +">>> float('+1.23')\n" +"1.23\n" +">>> float(' -12345\\n')\n" +"-12345.0\n" +">>> float('1e-003')\n" +"0.001\n" +">>> float('+1E6')\n" +"1000000.0\n" +">>> float('-Infinity')\n" +"-inf" + +#: ../../library/functions.rst:779 +msgid "" +"If the argument is a string, it should contain a decimal number, optionally " +"preceded by a sign, and optionally embedded in whitespace. The optional " +"sign may be ``'+'`` or ``'-'``; a ``'+'`` sign has no effect on the value " +"produced. The argument may also be a string representing a NaN (not-a-" +"number), or positive or negative infinity. More precisely, the input must " +"conform to the :token:`~float:floatvalue` production rule in the following " +"grammar, after leading and trailing whitespace characters are removed:" +msgstr "" +"如果该参数是一个字符串,则它应当包含一个十进制数字,前面可以选择带一个符号,也可以选择嵌入空格。可选的符号有 ``'+'`` 或 " +"``'-'``;``'+'`` 符号对所产生的值没有影响。该参数还可以是一个代表 NaN (not-a-number) 或者正负无穷大的字符串。 " +"更确切地说,在移除前导和尾随的空格之后,输入必须为符合以下语法的 :token:`~float:floatvalue` 产生规则:" + +#: ../../library/functions.rst:800 +msgid "" +"Case is not significant, so, for example, \"inf\", \"Inf\", \"INFINITY\", " +"and \"iNfINity\" are all acceptable spellings for positive infinity." +msgstr "大小写是无影响的,因此举例来说,\"inf\", \"Inf\", \"INFINITY\" 和 \"iNfINity\" 都是正无穷可接受的拼写形式。" + +#: ../../library/functions.rst:803 +msgid "" +"Otherwise, if the argument is an integer or a floating-point number, a " +"floating-point number with the same value (within Python's floating-point " +"precision) is returned. If the argument is outside the range of a Python " +"float, an :exc:`OverflowError` will be raised." +msgstr "" +"另一方面,如果参数是整数或浮点数,则返回一个具有相同值(在 Python 浮点精度范围内)的浮点数。如果参数超出了 Python " +"浮点数的取值范围,则会引发 :exc:`OverflowError`。" + +#: ../../library/functions.rst:808 +msgid "" +"For a general Python object ``x``, ``float(x)`` delegates to " +"``x.__float__()``. If :meth:`~object.__float__` is not defined then it " +"falls back to :meth:`~object.__index__`." +msgstr "" +"对于一个普通 Python 对象 ``x``,``float(x)`` 会委托给 ``x.__float__()``。如果 " +":meth:`~object.__float__` 未定义则将回退至 :meth:`~object.__index__`。" + +#: ../../library/functions.rst:812 +msgid "" +"See also :meth:`float.from_number` which only accepts a numeric argument." +msgstr "另请参见 :meth:`float.from_number`,它只接受数字参数。" + +#: ../../library/functions.rst:814 +msgid "If no argument is given, ``0.0`` is returned." +msgstr "如果没有实参,则返回 ``0.0``。" + +#: ../../library/functions.rst:816 +msgid "The float type is described in :ref:`typesnumeric`." +msgstr ":ref:`typesnumeric` 描述了浮点类型。" + +#: ../../library/functions.rst:824 +msgid "" +"Falls back to :meth:`~object.__index__` if :meth:`~object.__float__` is not " +"defined." +msgstr "如果 :meth:`~object.__float__` 未定义则回退至 :meth:`~object.__index__`。" + +#: ../../library/functions.rst:834 +msgid "" +"Convert a *value* to a \"formatted\" representation, as controlled by " +"*format_spec*. The interpretation of *format_spec* will depend on the type " +"of the *value* argument; however, there is a standard formatting syntax that" +" is used by most built-in types: :ref:`formatspec`." +msgstr "" +"将 *value* 转换为“格式化后”的形式,格式由 *format_spec* 进行控制。*format_spec* 的解释方式取决于 *value*" +" 参数的类型;但大多数内置类型使用一种标准的格式化语法: :ref:`formatspec`。" + +#: ../../library/functions.rst:839 +msgid "" +"The default *format_spec* is an empty string which usually gives the same " +"effect as calling :func:`str(value) `." +msgstr "默认的 *format_spec* 是一个空字符串,它通常给出与调用 :func:`str(value)` 相同的结果。" + +#: ../../library/functions.rst:842 +msgid "" +"A call to ``format(value, format_spec)`` is translated to " +"``type(value).__format__(value, format_spec)`` which bypasses the instance " +"dictionary when searching for the value's :meth:`~object.__format__` method." +" A :exc:`TypeError` exception is raised if the method search reaches " +":mod:`object` and the *format_spec* is non-empty, or if either the " +"*format_spec* or the return value are not strings." +msgstr "" +"对 ``format(value, format_spec)`` 的调用会转写为 ``type(value).__format__(value, " +"format_spec)``,这样在搜索值的 :meth:`~object.__format__` 方法时将绕过实例字典。如果方法搜索到达 " +":mod:`object` 并且 *format_spec* 不为空,或者如果 *format_spec* 或返回值不为字符串则会引发 " +":exc:`TypeError` 异常。" + +#: ../../library/functions.rst:849 +msgid "" +"``object().__format__(format_spec)`` raises :exc:`TypeError` if " +"*format_spec* is not an empty string." +msgstr "" +"当 *format_spec* 不是空字符串时,``object().__format__(format_spec)`` 会触发 " +":exc:`TypeError`." + +#: ../../library/functions.rst:858 +msgid "" +"Return a new :class:`frozenset` object, optionally with elements taken from " +"*iterable*. :class:`frozenset` is a built-in class. See also :ref:`types-" +"set` for documentation about this class." +msgstr "" + +#: ../../library/functions.rst:862 +msgid "" +"For other containers see the built-in :class:`set`, :class:`list`, " +":class:`tuple`, and :class:`dict` classes, as well as the :mod:`collections`" +" module." +msgstr "" +"请参阅内建的 :class:`set`、:class:`list`、:class:`tuple` 和 :class:`dict` 类,以及 " +":mod:`collections` 模块来了解其它的容器。" + +#: ../../library/functions.rst:870 +msgid "" +"Return the value of the named attribute of *object*. *name* must be a " +"string. If the string is the name of one of the object's attributes, the " +"result is the value of that attribute. For example, ``getattr(x, " +"'foobar')`` is equivalent to ``x.foobar``. If the named attribute does not " +"exist, *default* is returned if provided, otherwise :exc:`AttributeError` is" +" raised. *name* need not be a Python identifier (see :func:`setattr`)." +msgstr "" +"返回 *object* 中指定名称的属性的值。 *name* 必须是字符串。如果该字符串是对象的某一属性的名称,则结果将为该属性的值。 " +"例如,``getattr(x, 'foobar')`` 等同于 ``x.foobar``。如果指定名称的属性不存在,则如果提供了 *default* " +"则返回该值,否则将引发 :exc:`AttributeError`。 *name* 不必是一个 Python 标识符 (参见 " +":func:`setattr`)." + +#: ../../library/functions.rst:879 +msgid "" +"Since :ref:`private name mangling ` happens at " +"compilation time, one must manually mangle a private attribute's (attributes" +" with two leading underscores) name in order to retrieve it with " +":func:`getattr`." +msgstr "" +"由于 :ref:`私有名称混合 ` " +"发生在编译时,因此必须手动混合私有属性(以两个下划线打头的属性)名称以使用 :func:`getattr` 来提取它。" + +#: ../../library/functions.rst:887 +msgid "" +"Return the dictionary implementing the current module namespace. For code " +"within functions, this is set when the function is defined and remains the " +"same regardless of where the function is called." +msgstr "返回实现当前模块命名空间的字典。对于函数内的代码,这是在定义函数时设置的,无论函数在哪里被调用都保持不变。" + +#: ../../library/functions.rst:894 +msgid "" +"The arguments are an object and a string. The result is ``True`` if the " +"string is the name of one of the object's attributes, ``False`` if not. " +"(This is implemented by calling ``getattr(object, name)`` and seeing whether" +" it raises an :exc:`AttributeError` or not.)" +msgstr "" +"该实参是一个对象和一个字符串。如果字符串是对象的属性之一的名称,则返回 ``True``,否则返回 ``False``。(此功能是通过调用 " +"``getattr(object, name)`` 看是否有 :exc:`AttributeError` 异常来实现的。)" + +#: ../../library/functions.rst:902 +msgid "" +"Return the hash value of the object (if it has one). Hash values are " +"integers. They are used to quickly compare dictionary keys during a " +"dictionary lookup. Numeric values that compare equal have the same hash " +"value (even if they are of different types, as is the case for 1 and 1.0)." +msgstr "" +"返回该对象的哈希值(如果它有的话)。哈希值是整数。它们在字典查找元素时用来快速比较字典的键。相同大小的数字变量有相同的哈希值(即使它们类型不同,如 1 " +"和 1.0)。" + +#: ../../library/functions.rst:909 +msgid "" +"For objects with custom :meth:`~object.__hash__` methods, note that " +":func:`hash` truncates the return value based on the bit width of the host " +"machine." +msgstr "" +"对于具有自定义 :meth:`~object.__hash__` 方法的对象,请注意 :func:`hash` 会根据宿主机的字长来截断返回值。" + +#: ../../library/functions.rst:916 +msgid "" +"Invoke the built-in help system. (This function is intended for interactive" +" use.) If no argument is given, the interactive help system starts on the " +"interpreter console. If the argument is a string, then the string is looked" +" up as the name of a module, function, class, method, keyword, or " +"documentation topic, and a help page is printed on the console. If the " +"argument is any other kind of object, a help page on the object is " +"generated." +msgstr "" +"启动内置的帮助系统(此函数主要在交互式中使用)。如果没有实参,解释器控制台里会启动交互式帮助系统。如果实参是一个字符串,则在模块、函数、类、方法、关键字或文档主题中搜索该字符串,并在控制台上打印帮助信息。如果实参是其他任意对象,则会生成该对象的帮助页。" + +#: ../../library/functions.rst:923 +msgid "" +"Note that if a slash(/) appears in the parameter list of a function when " +"invoking :func:`help`, it means that the parameters prior to the slash are " +"positional-only. For more info, see :ref:`the FAQ entry on positional-only " +"parameters `." +msgstr "" +"请注意,如果在调用 :func:`help` 时,目标函数的形参列表中存在斜杠(/),则意味着斜杠之前的参数只能是位置参数。详情请参阅 " +":ref:`有关仅限位置形参的 FAQ 条目 `。" + +#: ../../library/functions.rst:928 +msgid "" +"This function is added to the built-in namespace by the :mod:`site` module." +msgstr "该函数通过 :mod:`site` 模块加入到内置命名空间。" + +#: ../../library/functions.rst:930 +msgid "" +"Changes to :mod:`pydoc` and :mod:`inspect` mean that the reported signatures" +" for callables are now more comprehensive and consistent." +msgstr ":mod:`pydoc` 和 :mod:`inspect` 的变更使得可调用对象的签名信息更加全面和一致。" + +#: ../../library/functions.rst:937 +msgid "" +"Convert an integer number to a lowercase hexadecimal string prefixed with " +"\"0x\". If *integer* is not a Python :class:`int` object, it has to define " +"an :meth:`~object.__index__` method that returns an integer. Some examples:" +msgstr "" +" 前缀的小写十六进制数字符串。如果 *integer* 不是一个 Python :class:`int` 对象,则它必须定义返回一个整数的 " +":meth:`~object.__index__` 方法。下面是一些例子:" + +#: ../../library/functions.rst:946 +msgid "" +"If you want to convert an integer number to an uppercase or lower " +"hexadecimal string with prefix or not, you can use either of the following " +"ways:" +msgstr "如果要将整数转换为大写或小写的十六进制字符串,并可选择有无“0x”前缀,则可以使用如下方法:" + +#: ../../library/functions.rst:958 +msgid "" +"See also :func:`int` for converting a hexadecimal string to an integer using" +" a base of 16." +msgstr "另请参阅 :func:`int` 将十六进制字符串转换为以 16 为基数的整数。" + +#: ../../library/functions.rst:963 +msgid "" +"To obtain a hexadecimal string representation for a float, use the " +":meth:`float.hex` method." +msgstr "如果要获取浮点数的十六进制字符串形式,请使用 :meth:`float.hex` 方法。" + +#: ../../library/functions.rst:969 +msgid "" +"Return the \"identity\" of an object. This is an integer which is " +"guaranteed to be unique and constant for this object during its lifetime. " +"Two objects with non-overlapping lifetimes may have the same :func:`id` " +"value." +msgstr "" +"返回对象的“标识值”。该值是一个整数,在此对象的生命周期中保证是唯一且恒定的。两个生命期不重叠的对象可能具有相同的 :func:`id` 值。" + +#: ../../library/functions.rst:974 +msgid "This is the address of the object in memory." +msgstr "这是对象在内存中的地址。" + +#: ../../library/functions.rst:976 +msgid "" +"Raises an :ref:`auditing event ` ``builtins.id`` with argument " +"``id``." +msgstr "引发一个 :ref:`审计事件 ` ``builtins.id`` 并附带参数 ``id``。" + +#: ../../library/functions.rst:982 +msgid "" +"If the *prompt* argument is present, it is written to standard output " +"without a trailing newline. The function then reads a line from input, " +"converts it to a string (stripping a trailing newline), and returns that. " +"When EOF is read, :exc:`EOFError` is raised. Example::" +msgstr "" +"如果存在 *prompt* " +"实参,则将其写入标准输出,末尾不带换行符。接下来,该函数从输入中读取一行,将其转换为字符串(除了末尾的换行符)并返回。当读取到 EOF 时,则触发 " +":exc:`EOFError`。例如::" + +#: ../../library/functions.rst:987 +msgid "" +">>> s = input('--> ')\n" +"--> Monty Python's Flying Circus\n" +">>> s\n" +"\"Monty Python's Flying Circus\"" +msgstr "" +">>> s = input('--> ')\n" +"--> Monty Python's Flying Circus\n" +">>> s\n" +"\"Monty Python's Flying Circus\"" + +#: ../../library/functions.rst:992 +msgid "" +"If the :mod:`readline` module was loaded, then :func:`input` will use it to " +"provide elaborate line editing and history features." +msgstr "如果加载了 :mod:`readline` 模块,:func:`input` 将使用它来提供复杂的行编辑和历史记录功能。" + +#: ../../library/functions.rst:995 ../../library/functions.rst:997 +msgid "" +"Raises an :ref:`auditing event ` ``builtins.input`` with argument " +"``prompt`` before reading input" +msgstr "在读取输入前引发一个 :ref:`审计事件 ` ``builtins.input`` 附带参数 ``prompt``" + +#: ../../library/functions.rst:1000 ../../library/functions.rst:1002 +msgid "" +"Raises an :ref:`auditing event ` ``builtins.input/result`` with " +"the result after successfully reading input." +msgstr "在成功读取输入之后引发一个 :ref:`审计事件 ` ``builtins.input/result`` 附带结果。" + +#: ../../library/functions.rst:1009 +msgid "" +"Return an integer object constructed from a number or a string, or return " +"``0`` if no arguments are given." +msgstr "返回从一个数字或字符串构建的整数对象,或者如果未给出参数则返回 ``0``。" + +#: ../../library/functions.rst:1014 +msgid "" +">>> int(123.45)\n" +"123\n" +">>> int('123')\n" +"123\n" +">>> int(' -12_345\\n')\n" +"-12345\n" +">>> int('FACE', 16)\n" +"64206\n" +">>> int('0xface', 0)\n" +"64206\n" +">>> int('01110011', base=2)\n" +"115" +msgstr "" +">>> int(123.45)\n" +"123\n" +">>> int('123')\n" +"123\n" +">>> int(' -12_345\\n')\n" +"-12345\n" +">>> int('FACE', 16)\n" +"64206\n" +">>> int('0xface', 0)\n" +"64206\n" +">>> int('01110011', base=2)\n" +"115" + +#: ../../library/functions.rst:1029 +msgid "" +"If the argument defines :meth:`~object.__int__`, ``int(x)`` returns " +"``x.__int__()``. If the argument defines :meth:`~object.__index__`, it " +"returns ``x.__index__()``. For floating-point numbers, this truncates " +"towards zero." +msgstr "" +"如果参数定义了 :meth:`~object.__int__` , ``int(x)`` 返回 ``x.__int__()``。如果参数定义了 " +":meth:`~object.__index__`,则返回 ``x.__index__()``。对于浮点数,则向零截断。" + +#: ../../library/functions.rst:1034 +msgid "" +"If the argument is not a number or if *base* is given, then it must be a " +"string, :class:`bytes`, or :class:`bytearray` instance representing an " +"integer in radix *base*. Optionally, the string can be preceded by ``+`` or" +" ``-`` (with no space in between), have leading zeros, be surrounded by " +"whitespace, and have single underscores interspersed between digits." +msgstr "" +"如果参数不是数字或者如果给定了 *base*,则它必须是表示一个以 *base* 为基数的整数的字符串、:class:`bytes` 或 " +":class:`bytearray` 实例。字符串前面还可选择加上 ``+`` 或 ``-`` " +"(中间没有空格),带有前导的零,带有两侧的空格,以及带有数位之间的单个下划线。" + +#: ../../library/functions.rst:1040 +msgid "" +"A base-n integer string contains digits, each representing a value from 0 to" +" n-1. The values 0--9 can be represented by any Unicode decimal digit. The " +"values 10--35 can be represented by ``a`` to ``z`` (or ``A`` to ``Z``). The " +"default *base* is 10. The allowed bases are 0 and 2--36. Base-2, -8, and -16" +" strings can be optionally prefixed with ``0b``/``0B``, ``0o``/``0O``, or " +"``0x``/``0X``, as with integer literals in code. For base 0, the string is " +"interpreted in a similar way to an :ref:`integer literal in code " +"`, in that the actual base is 2, 8, 10, or 16 as determined by the" +" prefix. Base 0 also disallows leading zeros: ``int('010', 0)`` is not " +"legal, while ``int('010')`` and ``int('010', 8)`` are." +msgstr "" +"一个以 n 为基数的整数字符串包含多个数位,每个数位代表从 0 到 n-1 范围内的值。0--9 的值可以用任何 Unicode 十进制数码来表示。 " +"10--35 的值可以用 ``a`` 到 ``z`` (或 ``A`` 到 ``Z``) 来表示。默认的 *base* 为 10。允许的基数为 0 和 " +"2--36。对于基数 2, -8 和 -16 来说字符串前面还能加上可选的 ``0b``/``0B``, ``0o``/``0O`` 或 " +"``0x``/``0X`` 前缀,就像代码中的整数字面值那样。对于基数 0 来说,字符串会以与 :ref:`代码中的整数字面值 ` " +"类似的方式来解读,即实际的基数将由前缀确定为 2, 8, 10 或 16。基数为 0 还会禁用前导的零: ``int('010', 0)`` " +"将是无效的,而 ``int('010')`` 和 ``int('010', 8)`` 则是有效的。" + +#: ../../library/functions.rst:1051 +msgid "The integer type is described in :ref:`typesnumeric`." +msgstr "整数类型定义请参阅 :ref:`typesnumeric`。" + +#: ../../library/functions.rst:1053 +msgid "" +"If *base* is not an instance of :class:`int` and the *base* object has a " +":meth:`base.__index__ ` method, that method is called to " +"obtain an integer for the base. Previous versions used :meth:`base.__int__ " +"` instead of :meth:`base.__index__ `." +msgstr "" +"如果 *base* 不是 :class:`int` 的实例,但 *base* 对象有 :meth:`base.__index__ " +"` 方法,则会调用该方法来获取进制数。以前的版本使用 :meth:`base.__int__ " +"` 而不是 :meth:`base.__index__ `。" + +#: ../../library/functions.rst:1063 +msgid "The first parameter is now positional-only." +msgstr "第一个形参现在是仅限位置形参。" + +#: ../../library/functions.rst:1066 +msgid "" +"Falls back to :meth:`~object.__index__` if :meth:`~object.__int__` is not " +"defined." +msgstr "如果 :meth:`~object.__int__` 未定义则回退至 :meth:`~object.__index__`。" + +#: ../../library/functions.rst:1069 +msgid "" +":class:`int` string inputs and string representations can be limited to help" +" avoid denial of service attacks. A :exc:`ValueError` is raised when the " +"limit is exceeded while converting a string to an :class:`int` or when " +"converting an :class:`int` into a string would exceed the limit. See the " +":ref:`integer string conversion length limitation ` " +"documentation." +msgstr "" +":class:`int` 字符串输入和字符串表示形式可受到限制以帮助避免拒绝服务攻击。当将一个字符串转换为 :class:`int` 或者将一个 " +":class:`int` 转换为字符串的操作超出限制时会引发 :exc:`ValueError`。请参阅 :ref:`整数字符串转换长度限制 " +"` 文档。" + +#: ../../library/functions.rst:1077 +msgid "" +":func:`int` no longer delegates to the :meth:`~object.__trunc__` method." +msgstr ":func:`int` 不再委托给 :meth:`~object.__trunc__` 方法。" + +#: ../../library/functions.rst:1082 +msgid "" +"Return ``True`` if the *object* argument is an instance of the *classinfo* " +"argument, or of a (direct, indirect, or :term:`virtual `) subclass thereof. If *object* is not an object of the given type, " +"the function always returns ``False``. If *classinfo* is a tuple of type " +"objects (or recursively, other such tuples) or a :ref:`types-union` of " +"multiple types, return ``True`` if *object* is an instance of any of the " +"types. If *classinfo* is not a type or tuple of types and such tuples, a " +":exc:`TypeError` exception is raised. :exc:`TypeError` may not be raised for" +" an invalid type if an earlier check succeeds." +msgstr "" +"如果 *object* 参数是 *classinfo* 参数的实例,或者是其 (直接、间接或 :term:`虚拟 `) 子类的实例则返回 ``True``。如果 *object* 不是给定类型的对象,则该函数总是返回 ``False``。如果 " +"*classinfo* 是由类型对象结成的元组 (或是由其他此类元组递归生成) 或者是多个类型的 :ref:`types-union`,则如果 " +"*object* 是其中任一类型的实例时将会返回 ``True``。如果 *classinfo* 不是一个类型或类型元组及此类元组,则会引发 " +":exc:`TypeError` 异常。如果之前的检查成功执行则可能不会为无效的类型引发 :exc:`TypeError`。" + +#: ../../library/functions.rst:1093 ../../library/functions.rst:1107 +msgid "*classinfo* can be a :ref:`types-union`." +msgstr "*classinfo* 可以是一个 :ref:`types-union`。" + +#: ../../library/functions.rst:1099 +msgid "" +"Return ``True`` if *class* is a subclass (direct, indirect, or " +":term:`virtual `) of *classinfo*. A class is " +"considered a subclass of itself. *classinfo* may be a tuple of class objects" +" (or recursively, other such tuples) or a :ref:`types-union`, in which case " +"return ``True`` if *class* is a subclass of any entry in *classinfo*. In " +"any other case, a :exc:`TypeError` exception is raised." +msgstr "" +"如果 *class* 是 *classinfo* 的子类 (直接、间接或 :term:`虚的 `),则返回 " +"``True``。 类将视为自己的子类。*classinfo* 可为类对象的元组(或递归地,其他这样的元组)或 :ref:`types-" +"union`,这时如果 *class* 是 *classinfo* 中任何条目的子类,则返回 ``True``。任何其他情况都会触发 " +":exc:`TypeError` 异常。" + +#: ../../library/functions.rst:1114 +msgid "" +"Return an :term:`iterator` object. The first argument is interpreted very " +"differently depending on the presence of the second argument. Without a " +"second argument, the single argument must be a collection object which " +"supports the :term:`iterable` protocol (the :meth:`~object.__iter__` " +"method), or it must support the sequence protocol (the " +":meth:`~object.__getitem__` method with integer arguments starting at " +"``0``). If it does not support either of those protocols, :exc:`TypeError` " +"is raised. If the second argument, *sentinel*, is given, then the first " +"argument must be a callable object. The iterator created in this case will " +"call *callable* with no arguments for each call to its " +":meth:`~iterator.__next__` method; if the value returned is equal to " +"*sentinel*, :exc:`StopIteration` will be raised, otherwise the value will be" +" returned." +msgstr "" +"返回一个 :term:`iterator` " +"对象。第一个参数的解释方式会根据第二个参数是否存在而完全不同:若没有提供第二个参数,则该单一参数必须是一个支持 :term:`iterable` " +"协议(即实现了 :meth:`~object.__iter__` 方法)的多项集对象,或者必须支持序列协议(即实现了以从 ``0`` " +"开始的整数参数调用的 :meth:`~object.__getitem__` 方法)。如果该参数既不支持可迭代协议也不支持序列协议,将会引发 " +":exc:`TypeError` 异常。如果提供了第二个参数 *sentinel*,则第一个参数必须是一个可调用对象。 " +"在这种情况下创建的迭代器会在每次调用其 :meth:`~iterator.__next__` 方法时,无参数地调用该 *可调用对象*;如果返回的值等于 " +"*sentinel*,则会引发 :exc:`StopIteration` 异常,否则将返回该值。" + +#: ../../library/functions.rst:1128 +msgid "See also :ref:`typeiter`." +msgstr "另请参阅 :ref:`typeiter`。" + +#: ../../library/functions.rst:1130 +msgid "" +"One useful application of the second form of :func:`iter` is to build a " +"block-reader. For example, reading fixed-width blocks from a binary database" +" file until the end of file is reached::" +msgstr "适合 :func:`iter` 的第二种形式的应用之一是构建块读取器。例如,从二进制数据库文件中读取固定宽度的块,直至到达文件的末尾::" + +#: ../../library/functions.rst:1134 +msgid "" +"from functools import partial\n" +"with open('mydata.db', 'rb') as f:\n" +" for block in iter(partial(f.read, 64), b''):\n" +" process_block(block)" +msgstr "" +"from functools import partial\n" +"with open('mydata.db', 'rb') as f:\n" +" for block in iter(partial(f.read, 64), b''):\n" +" process_block(block)" + +#: ../../library/functions.rst:1142 +msgid "" +"Return the length (the number of items) of an object. The argument may be a" +" sequence (such as a string, bytes, tuple, list, or range) or a collection " +"(such as a dictionary, set, or frozen set)." +msgstr "" +"返回对象的长度(元素个数)。实参可以是序列(如 string、bytes、tuple、list 或 range 等)或集合(如 " +"dictionary、set 或 frozen set 等)。" + +#: ../../library/functions.rst:1148 +msgid "" +"``len`` raises :exc:`OverflowError` on lengths larger than " +":data:`sys.maxsize`, such as :class:`range(2 ** 100) `." +msgstr "" +"``len`` 对于大于 :data:`sys.maxsize` 的长度如 :class:`range(2 ** 100) ` 会引发 " +":exc:`OverflowError`." + +#: ../../library/functions.rst:1156 +msgid "" +"Rather than being a function, :class:`list` is actually a mutable sequence " +"type, as documented in :ref:`typesseq-list` and :ref:`typesseq`." +msgstr "" +"虽然被称为函数,:class:`list` 实际上是一种可变序列类型,详情请参阅 :ref:`typesseq-list` 和 " +":ref:`typesseq`." + +#: ../../library/functions.rst:1162 +msgid "" +"Return a mapping object representing the current local symbol table, with " +"variable names as the keys, and their currently bound references as the " +"values." +msgstr "返回一个代表当前局部符号表的映射对象,以变量名称作为键,而以其当前绑定的引用作为值。" + +#: ../../library/functions.rst:1166 +msgid "" +"At module scope, as well as when using :func:`exec` or :func:`eval` with a " +"single namespace, this function returns the same namespace as " +":func:`globals`." +msgstr "" +"在模块作用域上,以及当附带单个命名空间使用 :func:`exec` 或 :func:`eval` 时,此函数将返回与 :func:`globals` " +"相同的命名空间。" + +#: ../../library/functions.rst:1170 +msgid "" +"At class scope, it returns the namespace that will be passed to the " +"metaclass constructor." +msgstr "在类作用域上,它会返回将被传给元类构造器的命名空间。" + +#: ../../library/functions.rst:1173 +msgid "" +"When using ``exec()`` or ``eval()`` with separate local and global " +"arguments, it returns the local namespace passed in to the function call." +msgstr "" +"当附带不同的 local 和 global 参数使用 ``exec()`` 或 ``eval()`` 时,它将返回传入函数调用的 local 命名空间。" + +#: ../../library/functions.rst:1176 +msgid "" +"In all of the above cases, each call to ``locals()`` in a given frame of " +"execution will return the *same* mapping object. Changes made through the " +"mapping object returned from ``locals()`` will be visible as assigned, " +"reassigned, or deleted local variables, and assigning, reassigning, or " +"deleting local variables will immediately affect the contents of the " +"returned mapping object." +msgstr "" +"在上述所有情况下,在一个给定的执行帧中对 ``locals()`` 的每次调用都将返回 *同一个* 映射对象。通过从 ``locals()`` " +"返回的映射对象所做的修改都将如局部变量的赋值、重新赋值或删除一样可见,而局部变量的赋值、重新赋值或删除都将立即影响所返回映射对象的内容。" + +#: ../../library/functions.rst:1183 +msgid "" +"In an :term:`optimized scope` (including functions, generators, and " +"coroutines), each call to ``locals()`` instead returns a fresh dictionary " +"containing the current bindings of the function's local variables and any " +"nonlocal cell references. In this case, name binding changes made via the " +"returned dict are *not* written back to the corresponding local variables or" +" nonlocal cell references, and assigning, reassigning, or deleting local " +"variables and nonlocal cell references does *not* affect the contents of " +"previously returned dictionaries." +msgstr "" +"在一个 :term:`optimized scope` 中(包括函数、生成器和协程),每个对 ``locals()`` " +"的调用将改为返回一个新字典,其中包含函数的局部变量及任何非局部单元引用的当前绑定。在此情况下,通过所返回字典对名称绑定的改变将 *不会* " +"写回到对应的局部变量或非局部单元引用,并且赋值、重新赋值或删除局部变量和非局部单元引用也 *不会* 影响之前返回的字典的内容。" + +#: ../../library/functions.rst:1192 +msgid "" +"Calling ``locals()`` as part of a comprehension in a function, generator, or" +" coroutine is equivalent to calling it in the containing scope, except that " +"the comprehension's initialised iteration variables will be included. In " +"other scopes, it behaves as if the comprehension were running as a nested " +"function." +msgstr "" +"将 ``locals()`` " +"作为函数、生成器或协程中的一个推导式的组成部分来调用相当于在外层作用域中调用它,不同之处在于推导式所初始化的迭代变量将被包括在内。 " +"在其他作用域下,其行为与将推导式作为嵌套函数来运行类似。" + +#: ../../library/functions.rst:1198 +msgid "" +"Calling ``locals()`` as part of a generator expression is equivalent to " +"calling it in a nested generator function." +msgstr "将 ``locals()`` 作为生成器表达式的组成部分来调用相当于在嵌套的生成器函数中调用它。" + +#: ../../library/functions.rst:1201 +msgid "" +"The behaviour of ``locals()`` in a comprehension has been updated as " +"described in :pep:`709`." +msgstr "在推导式中的 ``locals()`` 的行为已被更新为符合 :pep:`709` 中的描述。" + +#: ../../library/functions.rst:1205 +msgid "" +"As part of :pep:`667`, the semantics of mutating the mapping objects " +"returned from this function are now defined. The behavior in " +":term:`optimized scopes ` is now as described above. Aside " +"from being defined, the behaviour in other scopes remains unchanged from " +"previous versions." +msgstr "" +"作为 :pep:`667` 的组成部分,改变从此函数返回的映射对象的语义现在已获得定义。在 :term:`已优化作用域 ` 中的行为现在如上所述。除了已获得定义,在其他作用域中的行为相比之前的版本仍然保持不变。" + +#: ../../library/functions.rst:1215 +msgid "" +"Return an iterator that applies *function* to every item of *iterable*, " +"yielding the results. If additional *iterables* arguments are passed, " +"*function* must take that many arguments and is applied to the items from " +"all iterables in parallel. With multiple iterables, the iterator stops when" +" the shortest iterable is exhausted. If *strict* is ``True`` and one of the" +" iterables is exhausted before the others, a :exc:`ValueError` is raised. " +"For cases where the function inputs are already arranged into argument " +"tuples, see :func:`itertools.starmap`." +msgstr "" +"返回一个将 *function* 应用于 *iterable* 的每个项目并产生其结果的迭代器。如果传递了额外的 *iterables* 参数,则 " +"*function* 必须接受相同数量的参数,并将并行应用于所有可迭代对象中的项目。在有多个可迭代对象的情况下,迭代器会在最短的可迭代对象用尽后停止。 " +"如果 *strict* 为 ``True``,且其中一个可迭代对象在其他之前耗尽,则引发 " +":exc:`ValueError`。对于函数输入已排列成参数元组的情况,请参阅 :func:`itertools.starmap`。" + +#: ../../library/functions.rst:1224 +msgid "Added the *strict* parameter." +msgstr "增加了 *strict* 形参。" + +#: ../../library/functions.rst:1232 +msgid "" +"Return the largest item in an iterable or the largest of two or more " +"arguments." +msgstr "返回可迭代对象中最大的元素,或者返回两个及以上实参中最大的。" + +#: ../../library/functions.rst:1235 +msgid "" +"If one positional argument is provided, it should be an :term:`iterable`. " +"The largest item in the iterable is returned. If two or more positional " +"arguments are provided, the largest of the positional arguments is returned." +msgstr "" +"如果只提供了一个位置参数,它必须是非空 " +":term:`iterable`,返回可迭代对象中最大的元素;如果提供了两个及以上的位置参数,则返回最大的位置参数。" + +#: ../../library/functions.rst:1240 ../../library/functions.rst:1278 +msgid "" +"There are two optional keyword-only arguments. The *key* argument specifies " +"a one-argument ordering function like that used for :meth:`list.sort`. The " +"*default* argument specifies an object to return if the provided iterable is" +" empty. If the iterable is empty and *default* is not provided, a " +":exc:`ValueError` is raised." +msgstr "" +"有两个可选只能用关键字的实参。*key* 实参指定排序函数用的参数,如传给 :meth:`list.sort` 的。*default* " +"实参是当可迭代对象为空时返回的值。如果可迭代对象为空,并且没有给 *default* ,则会触发 :exc:`ValueError`。" + +#: ../../library/functions.rst:1246 +msgid "" +"If multiple items are maximal, the function returns the first one " +"encountered. This is consistent with other sort-stability preserving tools " +"such as ``sorted(iterable, key=keyfunc, reverse=True)[0]`` and " +"``heapq.nlargest(1, iterable, key=keyfunc)``." +msgstr "" +"如果有多个最大元素,则此函数将返回第一个找到的。这和其他稳定排序工具如 ``sorted(iterable, key=keyfunc, " +"reverse=True)[0]`` 和 ``heapq.nlargest(1, iterable, key=keyfunc)`` 保持一致。" + +#: ../../library/functions.rst:1251 ../../library/functions.rst:1289 +msgid "Added the *default* keyword-only parameter." +msgstr "增加了 *default* 仅限关键字形参。" + +#: ../../library/functions.rst:1254 ../../library/functions.rst:1292 +msgid "The *key* can be ``None``." +msgstr "*key* 可以为 ``None``。" + +#: ../../library/functions.rst:1262 +msgid "" +"Return a \"memory view\" object created from the given argument. See " +":ref:`typememoryview` for more information." +msgstr "返回由给定实参创建的“内存视图”对象。有关详细信息,请参阅 :ref:`typememoryview`。" + +#: ../../library/functions.rst:1270 +msgid "" +"Return the smallest item in an iterable or the smallest of two or more " +"arguments." +msgstr "返回可迭代对象中最小的元素,或者返回两个及以上实参中最小的。" + +#: ../../library/functions.rst:1273 +msgid "" +"If one positional argument is provided, it should be an :term:`iterable`. " +"The smallest item in the iterable is returned. If two or more positional " +"arguments are provided, the smallest of the positional arguments is " +"returned." +msgstr "" +"如果只提供了一个位置参数,它必须是 :term:`iterable`,返回可迭代对象中最小的元素;如果提供了两个及以上的位置参数,则返回最小的位置参数。" + +#: ../../library/functions.rst:1284 +msgid "" +"If multiple items are minimal, the function returns the first one " +"encountered. This is consistent with other sort-stability preserving tools " +"such as ``sorted(iterable, key=keyfunc)[0]`` and ``heapq.nsmallest(1, " +"iterable, key=keyfunc)``." +msgstr "" +"如果有多个最小元素,则此函数将返回第一个找到的。这和其他稳定排序工具如 ``sorted(iterable, key=keyfunc)[0]`` 和 " +"``heapq.nsmallest(1, iterable, key=keyfunc)`` 保持一致。" + +#: ../../library/functions.rst:1299 +msgid "" +"Retrieve the next item from the :term:`iterator` by calling its " +":meth:`~iterator.__next__` method. If *default* is given, it is returned if" +" the iterator is exhausted, otherwise :exc:`StopIteration` is raised." +msgstr "" +"通过调用 :term:`iterator` 的 :meth:`~iterator.__next__` 方法获取下一个元素。如果迭代器耗尽,则返回给定的 " +"*default*,如果没有默认值则触发 :exc:`StopIteration`。" + +#: ../../library/functions.rst:1306 +msgid "" +"This is the ultimate base class of all other classes. It has methods that " +"are common to all instances of Python classes. When the constructor is " +"called, it returns a new featureless object. The constructor does not accept" +" any arguments." +msgstr "" +"这是所有其他类的终极基类。它提供了所有 Python 类实例均具有的方法。当其构造器被调用时,它将返回一个新的基本对象。该构造器不接受任何参数。" + +#: ../../library/functions.rst:1313 +msgid "" +":class:`object` instances do *not* have :attr:`~object.__dict__` attributes," +" so you can't assign arbitrary attributes to an instance of :class:`object`." +msgstr "" +":class:`object` 实例 *没有* :attr:`~object.__dict__` 属性,因此你无法将任意属性赋给 " +":class:`object` 的实例。" + +#: ../../library/functions.rst:1320 +msgid "" +"Convert an integer number to an octal string prefixed with \"0o\". The " +"result is a valid Python expression. If *integer* is not a Python " +":class:`int` object, it has to define an :meth:`~object.__index__` method " +"that returns an integer. For example:" +msgstr "" +" 的八进制数字符串。结果是一个合法的 Python 表达式。如果 *integer* 不是一个 Python :class:`int` " +"对象,则它必须定义返回一个整数的 :meth:`~object.__index__` 方法。例如:" + +#: ../../library/functions.rst:1330 +msgid "" +"If you want to convert an integer number to an octal string either with the " +"prefix \"0o\" or not, you can use either of the following ways." +msgstr "若要将整数转换为八进制字符串,并可选择是否带有“0o”前缀,可采用如下方法:" + +#: ../../library/functions.rst:1347 +msgid "" +"Open *file* and return a corresponding :term:`file object`. If the file " +"cannot be opened, an :exc:`OSError` is raised. See :ref:`tut-files` for more" +" examples of how to use this function." +msgstr "" +"打开 *file* 并返回对应的 :term:`file object`。如果该文件不能被打开,则引发 :exc:`OSError`。请参阅 " +":ref:`tut-files` 获取此函数的更多用法示例。" + +#: ../../library/functions.rst:1351 +msgid "" +"*file* is a :term:`path-like object` giving the pathname (absolute or " +"relative to the current working directory) of the file to be opened or an " +"integer file descriptor of the file to be wrapped. (If a file descriptor is" +" given, it is closed when the returned I/O object is closed unless *closefd*" +" is set to ``False``.)" +msgstr "" +"*file* 是一个 :term:`path-like " +"object`,表示将要打开的文件的路径(绝对路径或者相对当前工作目录的路径),也可以是要封装文件对应的整数类型文件描述符。(如果给出的是文件描述符,则当返回的" +" I/O 对象关闭时它也会关闭,除非将 *closefd* 设为 ``False``。)" + +#: ../../library/functions.rst:1357 +msgid "" +"*mode* is an optional string that specifies the mode in which the file is " +"opened. It defaults to ``'r'`` which means open for reading in text mode. " +"Other common values are ``'w'`` for writing (truncating the file if it " +"already exists), ``'x'`` for exclusive creation, and ``'a'`` for appending " +"(which on *some* Unix systems, means that *all* writes append to the end of " +"the file regardless of the current seek position). In text mode, if " +"*encoding* is not specified the encoding used is platform-dependent: " +":func:`locale.getencoding` is called to get the current locale encoding. " +"(For reading and writing raw bytes use binary mode and leave *encoding* " +"unspecified.) The available modes are:" +msgstr "" +"*mode* 是一个指明文件打开模式的可选字符串。它默认为 ``'r'`` 表示以文本模式读取。其他常见模式有表示写入的 ``'w'`` " +"(若文件已存在则将其清空),表示独占创建的 ``'x'``,以及表示追加写入的 ``'a'`` (在 *某些* Unix " +"系统上,这意味着无论当前查找位置在哪里 *所有* 写入操作都将追加到文件末尾)。在文本模式下,如果未指定 *encoding* " +"则所使用的编码格式将依赖于具体平台::func:`locale.getencoding` 会被调用以获取当前语言区域的编码格式。 " +"(对于读取和写入原始字节数据请使用二进制模式并且不要指定 *encoding*。) 可用的模式有:" + +#: ../../library/functions.rst:1374 +msgid "Character" +msgstr "字符" + +#: ../../library/functions.rst:1374 +msgid "Meaning" +msgstr "含意" + +#: ../../library/functions.rst:1376 +msgid "``'r'``" +msgstr "``'r'``" + +#: ../../library/functions.rst:1376 +msgid "open for reading (default)" +msgstr "读取(默认)" + +#: ../../library/functions.rst:1377 +msgid "``'w'``" +msgstr "``'w'``" + +#: ../../library/functions.rst:1377 +msgid "open for writing, truncating the file first" +msgstr "写入,并先截断文件" + +#: ../../library/functions.rst:1378 +msgid "``'x'``" +msgstr "``'x'``" + +#: ../../library/functions.rst:1378 +msgid "open for exclusive creation, failing if the file already exists" +msgstr "排它性创建,如果文件已存在则失败" + +#: ../../library/functions.rst:1379 +msgid "``'a'``" +msgstr "``'a'``" + +#: ../../library/functions.rst:1379 +msgid "open for writing, appending to the end of file if it exists" +msgstr "打开文件用于写入,如果文件存在则在末尾追加" + +#: ../../library/functions.rst:1380 +msgid "``'b'``" +msgstr "``'b'``" + +#: ../../library/functions.rst:1380 ../../library/functions.rst:1524 +msgid "binary mode" +msgstr "二进制模式" + +#: ../../library/functions.rst:1381 +msgid "``'t'``" +msgstr "``'t'``" + +#: ../../library/functions.rst:1381 +msgid "text mode (default)" +msgstr "文本模式(默认)" + +#: ../../library/functions.rst:1382 +msgid "``'+'``" +msgstr "``'+'``" + +#: ../../library/functions.rst:1382 +msgid "open for updating (reading and writing)" +msgstr "打开用于更新(读取与写入)" + +#: ../../library/functions.rst:1385 +msgid "" +"The default mode is ``'r'`` (open for reading text, a synonym of ``'rt'``). " +"Modes ``'w+'`` and ``'w+b'`` open and truncate the file. Modes ``'r+'`` and" +" ``'r+b'`` open the file with no truncation." +msgstr "" +"默认模式为 ``'r'`` (打开文件用于读取文本,与 ``'rt'`` 同义)。 ``'w+'`` 和 ``'w+b'`` " +"模式将打开文件并清空内容。而 ``'r+'`` 和 ``'r+b'`` 模式将打开文件但不清空内容。" + +#: ../../library/functions.rst:1389 +msgid "" +"As mentioned in the :ref:`io-overview`, Python distinguishes between binary " +"and text I/O. Files opened in binary mode (including ``'b'`` in the *mode* " +"argument) return contents as :class:`bytes` objects without any decoding. " +"In text mode (the default, or when ``'t'`` is included in the *mode* " +"argument), the contents of the file are returned as :class:`str`, the bytes " +"having been first decoded using a platform-dependent encoding or using the " +"specified *encoding* if given." +msgstr "" +"正如在 :ref:`io-overview` 中提到的,Python 区分二进制和文本 I/O。以二进制模式打开的文件 (包括 *mode* 参数中的 " +"``'b'``) 返回的内容为 :class:`bytes` 对象,不进行任何解码。在文本模式下 (默认情况下,或者在 *mode* 参数中包含 " +"``'t'``) 时,文件内容返回为 :class:`str`,在有给定时使用给定的 *encoding* 或者使用平台默认的的编码格式进行解码。" + +#: ../../library/functions.rst:1399 +msgid "" +"Python doesn't depend on the underlying operating system's notion of text " +"files; all the processing is done by Python itself, and is therefore " +"platform-independent." +msgstr "Python 不依赖于底层操作系统的文本文件概念;所有处理都由 Python 本身完成,因此与平台无关。" + +#: ../../library/functions.rst:1403 +msgid "" +"*buffering* is an optional integer used to set the buffering policy. Pass 0" +" to switch buffering off (only allowed in binary mode), 1 to select line " +"buffering (only usable when writing in text mode), and an integer > 1 to " +"indicate the size in bytes of a fixed-size chunk buffer. Note that " +"specifying a buffer size this way applies for binary buffered I/O, but " +"``TextIOWrapper`` (i.e., files opened with ``mode='r+'``) would have another" +" buffering. To disable buffering in ``TextIOWrapper``, consider using the " +"``write_through`` flag for :func:`io.TextIOWrapper.reconfigure`. When no " +"*buffering* argument is given, the default buffering policy works as " +"follows:" +msgstr "" +"*buffering* 是一个可选的整数,用于设置缓冲策略。传入 0 来关闭缓冲(仅在二进制模式下允许),传入 1 " +"来选择行缓冲(仅在文本模式下写入时可用),传一个整数 > 1 来表示固定大小的块缓冲区的字节大小。注意这样指定缓冲区的大小适用于二进制缓冲的 I/O,但" +" ``TextIOWrapper`` (即用 ``mode='r+'`` 打开的文件) 会有另一种缓冲。要禁用 ``TextIOWrapper`` " +"中的缓冲,请考虑为 :func:`io.TextIOWrapper.reconfigure` 使用 ``write_through`` 旗标。当没有给出" +" *buffering* 参数时,默认的缓冲策略规则如下:" + +#: ../../library/functions.rst:1413 +msgid "" +"Binary files are buffered in fixed-size chunks; the size of the buffer is " +"``max(min(blocksize, 8 MiB), DEFAULT_BUFFER_SIZE)`` when the device block " +"size is available. On most systems, the buffer will typically be 128 " +"kilobytes long." +msgstr "" +"二进制文件以固定大小的块缓冲;当设备块大小可用时,缓冲区的大小就是 ``max(min(blocksize, 8 MiB), " +"DEFAULT_BUFFER_SIZE)``。在大多数系统中,缓冲区的长度通常为 128KB。" + +#: ../../library/functions.rst:1418 +msgid "" +"\"Interactive\" text files (files for which :meth:`~io.IOBase.isatty` " +"returns ``True``) use line buffering. Other text files use the policy " +"described above for binary files." +msgstr "" +"“交互式”文本文件( :meth:`~io.IOBase.isatty` 返回 ``True`` " +"的文件)使用行缓冲。其他文本文件使用上述策略用于二进制文件。" + +#: ../../library/functions.rst:1422 +msgid "" +"*encoding* is the name of the encoding used to decode or encode the file. " +"This should only be used in text mode. The default encoding is platform " +"dependent (whatever :func:`locale.getencoding` returns), but any :term:`text" +" encoding` supported by Python can be used. See the :mod:`codecs` module for" +" the list of supported encodings." +msgstr "" +"*encoding* 是用于编码或解码文件的编码格式名称。这应当只有文本模式下使用。默认的编码格式依赖于具体平台 (即 " +":func:`locale.getencoding` 所返回的值),但是任何 Python 支持的 :term:`text encoding` " +"都可以被使用。请参阅 :mod:`codecs` 模块获取受支持的编码格式列表。" + +#: ../../library/functions.rst:1428 +msgid "" +"*errors* is an optional string that specifies how encoding and decoding " +"errors are to be handled—this cannot be used in binary mode. A variety of " +"standard error handlers are available (listed under :ref:`error-handlers`), " +"though any error handling name that has been registered with " +":func:`codecs.register_error` is also valid. The standard names include:" +msgstr "" +"*errors* 是一个可选的字符串参数,用于指定如何处理编码和解码错误 —— 这不能在二进制模式下使用。可以使用各种标准错误处理程序(在 " +":ref:`error-handlers` 中列出),但是使用 :func:`codecs.register_error` " +"注册的任何错误处理名称也是有效的。 标准名称包括:" + +#: ../../library/functions.rst:1436 +msgid "" +"``'strict'`` to raise a :exc:`ValueError` exception if there is an encoding " +"error. The default value of ``None`` has the same effect." +msgstr "如果存在编码错误,``'strict'`` 会引发 :exc:`ValueError` 异常。默认值 ``None`` 具有相同的效果。" + +#: ../../library/functions.rst:1440 +msgid "" +"``'ignore'`` ignores errors. Note that ignoring encoding errors can lead to" +" data loss." +msgstr "``'ignore'`` 忽略错误。请注意,忽略编码错误可能会导致数据丢失。" + +#: ../../library/functions.rst:1443 +msgid "" +"``'replace'`` causes a replacement marker (such as ``'?'``) to be inserted " +"where there is malformed data." +msgstr "``'replace'`` 会将替换标记 (例如 ``'?'``) 插入有错误数据的地方。" + +#: ../../library/functions.rst:1446 +msgid "" +"``'surrogateescape'`` will represent any incorrect bytes as low surrogate " +"code units ranging from U+DC80 to U+DCFF. These surrogate code units will " +"then be turned back into the same bytes when the ``surrogateescape`` error " +"handler is used when writing data. This is useful for processing files in " +"an unknown encoding." +msgstr "" +"``'surrogateescape'`` 将把任何不正确的字节表示为 U+DC80 至 U+DCFF 范围内的下方替代码位。当在写入数据时使用 " +"``surrogateescape`` 错误处理器时这些替代码位会被转回到相同的字节。这适用于处理具有未知编码格式的文件。" + +#: ../../library/functions.rst:1453 +msgid "" +"``'xmlcharrefreplace'`` is only supported when writing to a file. Characters" +" not supported by the encoding are replaced with the appropriate XML " +"character reference :samp:`&#{nnn};`." +msgstr "" +"``'xmlcharrefreplace'`` 仅在写入文件时才受到支持。编码格式不支持的字符将被替换为相应的 XML 字符引用 " +":samp:`&#{nnn};`。" + +#: ../../library/functions.rst:1457 +msgid "" +"``'backslashreplace'`` replaces malformed data by Python's backslashed " +"escape sequences." +msgstr "``'backslashreplace'`` 用 Python 的反斜杠转义序列替换格式错误的数据。" + +#: ../../library/functions.rst:1460 +msgid "" +"``'namereplace'`` (also only supported when writing) replaces unsupported " +"characters with ``\\N{...}`` escape sequences." +msgstr "``'namereplace'`` (也只在写入时支持) 用 ``\\N{...}`` 转义序列替换不支持的字符。" + +#: ../../library/functions.rst:1468 +msgid "" +"*newline* determines how to parse newline characters from the stream. It can" +" be ``None``, ``''``, ``'\\n'``, ``'\\r'``, and ``'\\r\\n'``. It works as " +"follows:" +msgstr "" +"*newline* 决定如何解析来自流的换行符。它可以为 ``None``, ``''``, ``'\\n'``, ``'\\r'`` 和 " +"``'\\r\\n'``。它的工作原理如下:" + +#: ../../library/functions.rst:1472 +msgid "" +"When reading input from the stream, if *newline* is ``None``, universal " +"newlines mode is enabled. Lines in the input can end in ``'\\n'``, " +"``'\\r'``, or ``'\\r\\n'``, and these are translated into ``'\\n'`` before " +"being returned to the caller. If it is ``''``, universal newlines mode is " +"enabled, but line endings are returned to the caller untranslated. If it " +"has any of the other legal values, input lines are only terminated by the " +"given string, and the line ending is returned to the caller untranslated." +msgstr "" +"从流中读取输入时,如果 *newline* 为 ``None``,则启用通用换行模式。输入中的行可以以 ``'\\n'``、``'\\r'`` 或 " +"``'\\r\\n'`` 结尾,这些行在返回给调用者之前会被转换为 ``'\\n'``。如果它是 " +"``''``,则启用通用换行模式,但行结尾将原样返回给调用者而不做转换。如果它具有任何其他合法值,则输入行仅由给定字符串终止,并且返回给调用者时行结尾不会被转换。" + +#: ../../library/functions.rst:1480 +msgid "" +"When writing output to the stream, if *newline* is ``None``, any ``'\\n'`` " +"characters written are translated to the system default line separator, " +":data:`os.linesep`. If *newline* is ``''`` or ``'\\n'``, no translation " +"takes place. If *newline* is any of the other legal values, any ``'\\n'`` " +"characters written are translated to the given string." +msgstr "" +"将输出写入流时,如果 *newline* 为 ``None``,则写入的任何 ``'\\n'`` 字符都将转换为系统默认行分隔符 " +":data:`os.linesep`。如果 *newline* 是 ``''`` 或 ``'\\n'``,则不进行转换。如果 *newline* " +"是任何其他合法值,则写入的任何 ``'\\n'`` 字符将被转换为给定的字符串。" + +#: ../../library/functions.rst:1486 +msgid "" +"If *closefd* is ``False`` and a file descriptor rather than a filename was " +"given, the underlying file descriptor will be kept open when the file is " +"closed. If a filename is given *closefd* must be ``True`` (the default); " +"otherwise, an error will be raised." +msgstr "" +"如果 *closefd* 为 ``False`` " +"且给出的不是文件名而是文件描述符,那么当文件关闭时,底层文件描述符将保持打开状态。如果给出的是文件名,则 *closefd* 必须为 ``True`` " +"(默认值),否则将触发错误。" + +#: ../../library/functions.rst:1491 +msgid "" +"A custom opener can be used by passing a callable as *opener*. The " +"underlying file descriptor for the file object is then obtained by calling " +"*opener* with (*file*, *flags*). *opener* must return an open file " +"descriptor (passing :mod:`os.open` as *opener* results in functionality " +"similar to passing ``None``)." +msgstr "" +"可以通过传递可调用的 *opener* 来使用自定义开启器。然后通过使用参数( *file*,*flags* )调用 *opener* " +"获得文件对象的基础文件描述符。 *opener* 必须返回一个打开的文件描述符(使用 :mod:`os.open` as *opener* 时与传递 " +"``None`` 的效果相同)。" + +#: ../../library/functions.rst:1497 +msgid "The newly created file is :ref:`non-inheritable `." +msgstr "新创建的文件是 :ref:`不可继承的 `。" + +#: ../../library/functions.rst:1499 +msgid "" +"The following example uses the :ref:`dir_fd ` parameter of the " +":func:`os.open` function to open a file relative to a given directory::" +msgstr "" +"下面的示例使用 :func:`os.open` 函数的 :ref:`dir_fd ` 的形参,从给定的目录中用相对路径打开文件::" + +#: ../../library/functions.rst:1502 +msgid "" +">>> import os\n" +">>> dir_fd = os.open('somedir', os.O_RDONLY)\n" +">>> def opener(path, flags):\n" +"... return os.open(path, flags, dir_fd=dir_fd)\n" +"...\n" +">>> with open('spamspam.txt', 'w', opener=opener) as f:\n" +"... print('This will be written to somedir/spamspam.txt', file=f)\n" +"...\n" +">>> os.close(dir_fd) # don't leak a file descriptor" +msgstr "" +">>> import os\n" +">>> dir_fd = os.open('somedir', os.O_RDONLY)\n" +">>> def opener(path, flags):\n" +"... return os.open(path, flags, dir_fd=dir_fd)\n" +"...\n" +">>> with open('spamspam.txt', 'w', opener=opener) as f:\n" +"... print('This will be written to somedir/spamspam.txt', file=f)\n" +"...\n" +">>> os.close(dir_fd) # 不要泄漏文件描述符" + +#: ../../library/functions.rst:1512 +msgid "" +"The type of :term:`file object` returned by the :func:`open` function " +"depends on the mode. When :func:`open` is used to open a file in a text " +"mode (``'w'``, ``'r'``, ``'wt'``, ``'rt'``, etc.), it returns a subclass of " +":class:`io.TextIOBase` (specifically :class:`io.TextIOWrapper`). When used " +"to open a file in a binary mode with buffering, the returned class is a " +"subclass of :class:`io.BufferedIOBase`. The exact class varies: in read " +"binary mode, it returns an :class:`io.BufferedReader`; in write binary and " +"append binary modes, it returns an :class:`io.BufferedWriter`, and in " +"read/write mode, it returns an :class:`io.BufferedRandom`. When buffering " +"is disabled, the raw stream, a subclass of :class:`io.RawIOBase`, " +":class:`io.FileIO`, is returned." +msgstr "" +":func:`open` 函数所返回的 :term:`file object` 类型取决于所用模式。当使用 :func:`open` 以文本模式 " +"(``'w'``, ``'r'``, ``'wt'``, ``'rt'`` 等) 打开文件时,它将返回 :class:`io.TextIOBase` " +"(具体为 :class:`io.TextIOWrapper`) 的一个子类。当使用缓冲以二进制模式打开文件时,返回的类是 " +":class:`io.BufferedIOBase` 的一个子类。具体的类会有多种:在只读的二进制模式下,它将返回 " +":class:`io.BufferedReader`;在写入二进制和追加二进制模式下,它将返回 " +":class:`io.BufferedWriter`,而在读/写模式下,它将返回 :class:`io.BufferedRandom`。 " +"当禁用缓冲时,则会返回原始流,即 :class:`io.RawIOBase` 的一个子类 :class:`io.FileIO`。" + +#: ../../library/functions.rst:1533 +msgid "" +"See also the file handling modules, such as :mod:`fileinput`, :mod:`io` " +"(where :func:`open` is declared), :mod:`os`, :mod:`os.path`, " +":mod:`tempfile`, and :mod:`shutil`." +msgstr "" +"另请参阅文件操作模块,如 :mod:`fileinput`、:mod:`io` (其中声明了 " +":func:`open`)、:mod:`os`、:mod:`os.path`、:mod:`tempfile` 和 :mod:`shutil`。" + +#: ../../library/functions.rst:1537 +msgid "" +"Raises an :ref:`auditing event ` ``open`` with arguments ``path``," +" ``mode``, ``flags``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``open`` 并附带参数 ``path``, ``mode``, ``flags``。" + +#: ../../library/functions.rst:1539 +msgid "" +"The ``mode`` and ``flags`` arguments may have been modified or inferred from" +" the original call." +msgstr "``mode`` 与 ``flags`` 参数可以在原始调用的基础上被修改或传递。" + +#: ../../library/functions.rst:1544 +msgid "The *opener* parameter was added." +msgstr "增加了 *opener* 形参。" + +#: ../../library/functions.rst:1545 +msgid "The ``'x'`` mode was added." +msgstr "增加了 ``'x'`` 模式。" + +#: ../../library/functions.rst:1546 +msgid "" +":exc:`IOError` used to be raised, it is now an alias of :exc:`OSError`." +msgstr "过去触发的 :exc:`IOError`,现在是 :exc:`OSError` 的别名。" + +#: ../../library/functions.rst:1547 +msgid "" +":exc:`FileExistsError` is now raised if the file opened in exclusive " +"creation mode (``'x'``) already exists." +msgstr "如果文件已存在但使用了排它性创建模式 (``'x'``),现在会触发 :exc:`FileExistsError`。" + +#: ../../library/functions.rst:1552 +msgid "The file is now non-inheritable." +msgstr "文件现在禁止继承。" + +#: ../../library/functions.rst:1556 +msgid "" +"If the system call is interrupted and the signal handler does not raise an " +"exception, the function now retries the system call instead of raising an " +":exc:`InterruptedError` exception (see :pep:`475` for the rationale)." +msgstr "" +"如果系统调用被中断,但信号处理程序没有触发异常,此函数现在会重试系统调用,而不是触发 :exc:`InterruptedError` 异常 (原因详见 " +":pep:`475`)." + +#: ../../library/functions.rst:1559 +msgid "The ``'namereplace'`` error handler was added." +msgstr "增加了 ``'namereplace'`` 错误处理接口。" + +#: ../../library/functions.rst:1563 +msgid "Support added to accept objects implementing :class:`os.PathLike`." +msgstr "增加对实现了 :class:`os.PathLike` 对象的支持。" + +#: ../../library/functions.rst:1564 +msgid "" +"On Windows, opening a console buffer may return a subclass of " +":class:`io.RawIOBase` other than :class:`io.FileIO`." +msgstr "" +"在 Windows 上,打开一个控制台缓冲区将返回 :class:`io.RawIOBase` 的子类,而不是 :class:`io.FileIO`。" + +#: ../../library/functions.rst:1567 +msgid "The ``'U'`` mode has been removed." +msgstr "``'U'`` 模式已被移除。" + +#: ../../library/functions.rst:1572 +msgid "Return the ordinal value of a character." +msgstr "返回字符的码序值。" + +#: ../../library/functions.rst:1574 +msgid "" +"If the argument is a one-character string, return the Unicode code point of " +"that character. For example, ``ord('a')`` returns the integer ``97`` and " +"``ord('€')`` (Euro sign) returns ``8364``. This is the inverse of " +":func:`chr`." +msgstr "" +"如果参数是单字符字符串,则返回该字符的 Unicode 码位。例如,``ord('a')`` 返回整数 ``97``,``ord('€')`` " +"(欧元符号) 返回 ``8364``。 此函数是 :func:`chr` 的逆操作。" + +#: ../../library/functions.rst:1579 +msgid "" +"If the argument is a :class:`bytes` or :class:`bytearray` object of length " +"1, return its single byte value. For example, ``ord(b'a')`` returns the " +"integer ``97``." +msgstr "" +"如果参数是长度为 1 的 :class:`bytes` 或 :class:`bytearray` " +"对象,则返回其单个字节值。例如,``ord(b'a')`` 返回整数 ``97``。" + +#: ../../library/functions.rst:1586 +msgid "" +"Return *base* to the power *exp*; if *mod* is present, return *base* to the " +"power *exp*, modulo *mod* (computed more efficiently than ``pow(base, exp) %" +" mod``). The two-argument form ``pow(base, exp)`` is equivalent to using the" +" power operator: ``base**exp``." +msgstr "" +"返回 *base* 的 *exp* 次幂;如果 *mod* 存在,则返回 *base* 的 *exp* 次幂对 *mod* 取余(比 " +"``pow(base, exp) % mod`` 更高效)。两参数形式 ``pow(base, exp)`` 等价于乘方运算符: " +"``base**exp``。" + +#: ../../library/functions.rst:1591 +msgid "" +"When arguments are builtin numeric types with mixed operand types, the " +"coercion rules for binary arithmetic operators apply. For :class:`int` " +"operands, the result has the same type as the operands (after coercion) " +"unless the second argument is negative; in that case, all arguments are " +"converted to float and a float result is delivered. For example, ``pow(10, " +"2)`` returns ``100``, but ``pow(10, -2)`` returns ``0.01``. For a negative " +"base of type :class:`int` or :class:`float` and a non-integral exponent, a " +"complex result is delivered. For example, ``pow(-9, 0.5)`` returns a value " +"close to ``3j``. Whereas, for a negative base of type :class:`int` or " +":class:`float` with an integral exponent, a float result is delivered. For " +"example, ``pow(-9, 2.0)`` returns ``81.0``." +msgstr "" +"当参数为具有混用操作数类型的内置数字类型时,将应用针对二元算术运算符的强制转换规则。对于 :class:`int` " +"操作数,结果具有与操作数相同的类型(转换之后)除非第二个参数为负值;在那种情况下,所有参数将被转换为浮点数并输出浮点数形式的结果。 " +"例如,``pow(10, 2)`` 返回 ``100``,而 ``pow(10, -2)`` 返回 ``0.01``。对于 :class:`int` 或" +" :class:`float` 的基数为负值而幂为非整数的情况,将产生一个复数形式的结果。例如,``pow(-9, 0.5)`` 将返回一个接近 " +"``3j`` 的值。最后,对于 :class:`int` 或 :class:`float` 的基数为负值而幂为整数的情况,将产生一个浮点数形式的结果。 " +"例如,``pow(-9, 2.0)`` 将返回 ``81.0``。" + +#: ../../library/functions.rst:1603 +msgid "" +"For :class:`int` operands *base* and *exp*, if *mod* is present, *mod* must " +"also be of integer type and *mod* must be nonzero. If *mod* is present and " +"*exp* is negative, *base* must be relatively prime to *mod*. In that case, " +"``pow(inv_base, -exp, mod)`` is returned, where *inv_base* is an inverse to " +"*base* modulo *mod*." +msgstr "" +"对于 :class:`int` 操作数 *base* 和 *exp*,如果给出 *mod*,则 *mod* 必须为整数类型并且 *mod* 必须不为零。" +" 如果给出 *mod* 并且 *exp* 为负值,则 *base* 必须与 *mod* 互素。在这种情况下,将会返回 ``pow(inv_base, " +"-exp, mod)``,其中 *inv_base* 为 *base* 对 *mod* 的模逆元。" + +#: ../../library/functions.rst:1609 +msgid "Here's an example of computing an inverse for ``38`` modulo ``97``::" +msgstr "下面的例子是 ``38`` 的倒数对 ``97`` 取余::" + +#: ../../library/functions.rst:1611 +msgid "" +">>> pow(38, -1, mod=97)\n" +"23\n" +">>> 23 * 38 % 97 == 1\n" +"True" +msgstr "" +">>> pow(38, -1, mod=97)\n" +"23\n" +">>> 23 * 38 % 97 == 1\n" +"True" + +#: ../../library/functions.rst:1616 +msgid "" +"For :class:`int` operands, the three-argument form of ``pow`` now allows the" +" second argument to be negative, permitting computation of modular inverses." +msgstr "对于 :class:`int` 操作数,三参数形式的 ``pow`` 现在允许第二个参数为负值,即可以计算倒数的余数。" + +#: ../../library/functions.rst:1621 +msgid "" +"Allow keyword arguments. Formerly, only positional arguments were " +"supported." +msgstr "允许关键字参数。之前只支持位置参数。" + +#: ../../library/functions.rst:1628 +msgid "" +"Print *objects* to the text stream *file*, separated by *sep* and followed " +"by *end*. *sep*, *end*, *file*, and *flush*, if present, must be given as " +"keyword arguments." +msgstr "" +"将 *objects* 打印输出至 *file* 指定的文本流,以 *sep* 分隔并在末尾加上 *end*。 *sep* 、 *end* 、 " +"*file* 和 *flush* 必须以关键字参数的形式给出。" + +#: ../../library/functions.rst:1632 +msgid "" +"All non-keyword arguments are converted to strings like :func:`str` does and" +" written to the stream, separated by *sep* and followed by *end*. Both " +"*sep* and *end* must be strings; they can also be ``None``, which means to " +"use the default values. If no *objects* are given, :func:`print` will just " +"write *end*." +msgstr "" +"所有非关键字参数都会被转换为字符串,就像是执行了 :func:`str` 一样,并会被写入到流,以 *sep* 分隔并在末尾加上 *end*。 " +"*sep* 和 *end* 都必须为字符串;它们也可以为 ``None``,这意味着使用默认值。如果没有给出 *objects*,则 " +":func:`print` 将只写入 *end*。" + +#: ../../library/functions.rst:1638 +msgid "" +"The *file* argument must be an object with a ``write(string)`` method; if it" +" is not present or ``None``, :data:`sys.stdout` will be used. Since printed" +" arguments are converted to text strings, :func:`print` cannot be used with " +"binary mode file objects. For these, use ``file.write(...)`` instead." +msgstr "" +"*file* 参数必须是一个具有 ``write(string)`` 方法的对象;如果参数不存在或为 ``None``,则将使用 " +":data:`sys.stdout`。由于要打印的参数会被转换为文本字符串,因此 :func:`print` 不能用于二进制模式的文件对象。 " +"对于这些对象,应改用 ``file.write(...)``。" + +#: ../../library/functions.rst:1643 +msgid "" +"Output buffering is usually determined by *file*. However, if *flush* is " +"true, the stream is forcibly flushed." +msgstr "输出缓冲通常由 *file* 确定。但是,如果 *flush* 为真值,流将被强制刷新。" + +#: ../../library/functions.rst:1647 +msgid "Added the *flush* keyword argument." +msgstr "增加了 *flush* 关键字参数。" + +#: ../../library/functions.rst:1653 +msgid "Return a property attribute." +msgstr "返回 property 属性。" + +#: ../../library/functions.rst:1655 +msgid "" +"*fget* is a function for getting an attribute value. *fset* is a function " +"for setting an attribute value. *fdel* is a function for deleting an " +"attribute value. And *doc* creates a docstring for the attribute." +msgstr "" +"*fget* 是获取属性值的函数。 *fset* 是用于设置属性值的函数。 *fdel* 是用于删除属性值的函数。并且 *doc* " +"为属性对象创建文档字符串。" + +#: ../../library/functions.rst:1659 +msgid "A typical use is to define a managed attribute ``x``::" +msgstr "一个典型的用法是定义一个托管属性 ``x``::" + +#: ../../library/functions.rst:1661 +msgid "" +"class C:\n" +" def __init__(self):\n" +" self._x = None\n" +"\n" +" def getx(self):\n" +" return self._x\n" +"\n" +" def setx(self, value):\n" +" self._x = value\n" +"\n" +" def delx(self):\n" +" del self._x\n" +"\n" +" x = property(getx, setx, delx, \"I'm the 'x' property.\")" +msgstr "" +"class C:\n" +" def __init__(self):\n" +" self._x = None\n" +"\n" +" def getx(self):\n" +" return self._x\n" +"\n" +" def setx(self, value):\n" +" self._x = value\n" +"\n" +" def delx(self):\n" +" del self._x\n" +"\n" +" x = property(getx, setx, delx, \"I'm the 'x' property.\")" + +#: ../../library/functions.rst:1676 +msgid "" +"If *c* is an instance of *C*, ``c.x`` will invoke the getter, ``c.x = " +"value`` will invoke the setter, and ``del c.x`` the deleter." +msgstr "" +"如果 *c* 为 *C* 的实例,``c.x`` 将调用 getter,``c.x = value`` 将调用 setter,``del c.x`` " +"将调用 deleter。" + +#: ../../library/functions.rst:1679 +msgid "" +"If given, *doc* will be the docstring of the property attribute. Otherwise, " +"the property will copy *fget*'s docstring (if it exists). This makes it " +"possible to create read-only properties easily using :func:`property` as a " +":term:`decorator`::" +msgstr "" +"如果给出,*doc* 将成为该 property 属性的文档字符串。否则该 property 将拷贝 *fget* 的文档字符串(如果存在)。 这令使用" +" :func:`property` 作为 :term:`decorator` 来创建只读的特征属性可以很容易地实现::" + +#: ../../library/functions.rst:1683 +msgid "" +"class Parrot:\n" +" def __init__(self):\n" +" self._voltage = 100000\n" +"\n" +" @property\n" +" def voltage(self):\n" +" \"\"\"Get the current voltage.\"\"\"\n" +" return self._voltage" +msgstr "" +"class Parrot:\n" +" def __init__(self):\n" +" self._voltage = 100000\n" +"\n" +" @property\n" +" def voltage(self):\n" +" \"\"\"Get the current voltage.\"\"\"\n" +" return self._voltage" + +#: ../../library/functions.rst:1692 +msgid "" +"The ``@property`` decorator turns the :meth:`!voltage` method into a " +"\"getter\" for a read-only attribute with the same name, and it sets the " +"docstring for *voltage* to \"Get the current voltage.\"" +msgstr "" +"``@property`` 装饰器会将 :meth:`!voltage` 方法转化为一个具有相同名称的只读属性 \"getter\",并将 " +"*voltage* 的文档字符串设为 \"Get the current voltage.\"" + +#: ../../library/functions.rst:1700 +msgid "" +"A property object has ``getter``, ``setter``, and ``deleter`` methods usable" +" as decorators that create a copy of the property with the corresponding " +"accessor function set to the decorated function. This is best explained " +"with an example:" +msgstr "" +"特征属性对象具有 ``getter``, ``setter`` 和 ``deleter`` " +"方法,它们可用作装饰器来创建该特征属性的副本,并将相应的访问函数设为所装饰的函数。这最好是用一个例子来说明:" + +#: ../../library/functions.rst:1705 +msgid "" +"class C:\n" +" def __init__(self):\n" +" self._x = None\n" +"\n" +" @property\n" +" def x(self):\n" +" \"\"\"I'm the 'x' property.\"\"\"\n" +" return self._x\n" +"\n" +" @x.setter\n" +" def x(self, value):\n" +" self._x = value\n" +"\n" +" @x.deleter\n" +" def x(self):\n" +" del self._x" +msgstr "" +"class C:\n" +" def __init__(self):\n" +" self._x = None\n" +"\n" +" @property\n" +" def x(self):\n" +" \"\"\"I'm the 'x' property.\"\"\"\n" +" return self._x\n" +"\n" +" @x.setter\n" +" def x(self, value):\n" +" self._x = value\n" +"\n" +" @x.deleter\n" +" def x(self):\n" +" del self._x" + +#: ../../library/functions.rst:1724 +msgid "" +"This code is exactly equivalent to the first example. Be sure to give the " +"additional functions the same name as the original property (``x`` in this " +"case.)" +msgstr "上述代码与第一个例子完全等价。注意一定要给附加函数与原始的特征属性相同的名称 (在本例中为 ``x``。)" + +#: ../../library/functions.rst:1728 +msgid "" +"The returned property object also has the attributes ``fget``, ``fset``, and" +" ``fdel`` corresponding to the constructor arguments." +msgstr "返回的特征属性对象同样具有与构造器参数相对应的属性 ``fget``, ``fset`` 和 ``fdel``。" + +#: ../../library/functions.rst:1731 +msgid "The docstrings of property objects are now writeable." +msgstr "特征属性对象的文档字符串现在是可写的。" + +#: ../../library/functions.rst:1736 +msgid "" +"Attribute holding the name of the property. The name of the property can be " +"changed at runtime." +msgstr "保存特征属性名称的属性。特性属性名称可在运行时被修改。" + +#: ../../library/functions.rst:1747 +msgid "" +"Rather than being a function, :class:`range` is actually an immutable " +"sequence type, as documented in :ref:`typesseq-range` and :ref:`typesseq`." +msgstr "" +"虽然被称为函数,但 :class:`range` 实际上是一个不可变的序列类型,参见在 :ref:`typesseq-range` 与 " +":ref:`typesseq` 中的文档说明。" + +#: ../../library/functions.rst:1753 +msgid "" +"Return a string containing a printable representation of an object. For " +"many types, this function makes an attempt to return a string that would " +"yield an object with the same value when passed to :func:`eval`; otherwise, " +"the representation is a string enclosed in angle brackets that contains the " +"name of the type of the object together with additional information often " +"including the name and address of the object. A class can control what this" +" function returns for its instances by defining a :meth:`~object.__repr__` " +"method. If :func:`sys.displayhook` is not accessible, this function will " +"raise :exc:`RuntimeError`." +msgstr "" +"返回包含一个对象的可打印表示形式的字符串。对于许多类型而言,此函数会尝试返回一个具有与传给 :func:`eval` " +"时相同的值的字符串;在其他情况下,其表示形式将为一个包含对象类型名称和通常包括对象名称和地址的额外信息的用尖括号括起来的字符串。一个类可以通过定义 " +":meth:`~object.__repr__` 方法来控制此函数为其实例所返回的内容。如果 :func:`sys.displayhook` " +"不可访问,则此函数将会引发 :exc:`RuntimeError`。" + +#: ../../library/functions.rst:1764 +msgid "This class has a custom representation that can be evaluated::" +msgstr "该类具有自定义的表示形式,它可被求值为::" + +#: ../../library/functions.rst:1766 +msgid "" +"class Person:\n" +" def __init__(self, name, age):\n" +" self.name = name\n" +" self.age = age\n" +"\n" +" def __repr__(self):\n" +" return f\"Person('{self.name}', {self.age})\"" +msgstr "" +"class Person:\n" +" def __init__(self, name, age):\n" +" self.name = name\n" +" self.age = age\n" +"\n" +" def __repr__(self):\n" +" return f\"Person('{self.name}', {self.age})\"" + +#: ../../library/functions.rst:1777 +msgid "" +"Return a reverse :term:`iterator`. The argument must be an object which has" +" a :meth:`~object.__reversed__` method or supports the sequence protocol " +"(the :meth:`~object.__len__` method and the :meth:`~object.__getitem__` " +"method with integer arguments starting at ``0``)." +msgstr "" +"返回一个反向的 :term:`iterator`。该参数必须是一个具有 :meth:`~object.__reversed__` " +"方法或是支持序列协议(具有 :meth:`~object.__len__` 方法和从 ``0`` 开始的整数参数的 " +":meth:`~object.__getitem__` 方法)的对象。" + +#: ../../library/functions.rst:1785 +msgid "" +"Return *number* rounded to *ndigits* precision after the decimal point. If " +"*ndigits* is omitted or is ``None``, it returns the nearest integer to its " +"input." +msgstr "" +"返回 *number* 舍入到小数点后 *ndigits* 位精度的值。如果 *ndigits* 被省略或为 " +"``None``,则返回最接近输入值的整数。" + +#: ../../library/functions.rst:1789 +msgid "" +"For the built-in types supporting :func:`round`, values are rounded to the " +"closest multiple of 10 to the power minus *ndigits*; if two multiples are " +"equally close, rounding is done toward the even choice (so, for example, " +"both ``round(0.5)`` and ``round(-0.5)`` are ``0``, and ``round(1.5)`` is " +"``2``). Any integer value is valid for *ndigits* (positive, zero, or " +"negative). The return value is an integer if *ndigits* is omitted or " +"``None``. Otherwise, the return value has the same type as *number*." +msgstr "" +"对于支持 :func:`round` 方法的内置类型,结果值会舍入至最接近的 10 的负 *ndigits* " +"次幂的倍数;如果与两个倍数同样接近,则选用偶数。因此,``round(0.5)`` 和 ``round(-0.5)`` 均得出 ``0`` 而 " +"``round(1.5)`` 则为 ``2``。*ndigits* 可为任意整数值(正数、零或负数)。如果省略了 *ndigits* 或为 " +"``None``,则返回值将为整数。否则返回值与 *number* 的类型相同。" + +#: ../../library/functions.rst:1798 +msgid "" +"For a general Python object ``number``, ``round`` delegates to " +"``number.__round__``." +msgstr "对于一般的 Python 对象 ``number``, ``round`` 将委托给 ``number.__round__``。" + +#: ../../library/functions.rst:1803 +msgid "" +"The behavior of :func:`round` for floats can be surprising: for example, " +"``round(2.675, 2)`` gives ``2.67`` instead of the expected ``2.68``. This is" +" not a bug: it's a result of the fact that most decimal fractions can't be " +"represented exactly as a float. See :ref:`tut-fp-issues` for more " +"information." +msgstr "" +"对浮点数执行 :func:`round` 的行为可能会令人惊讶:例如,``round(2.675, 2)`` 将给出 ``2.67`` 而不是期望的 " +"``2.68``。这不算是程序错误:这一结果是由于大多数十进制小数实际上都不能以浮点数精确地表示。请参阅 :ref:`tut-fp-issues` " +"了解更多信息。" + +#: ../../library/functions.rst:1814 +msgid "" +"Return a new :class:`set` object, optionally with elements taken from " +"*iterable*. :class:`set` is a built-in class. See also :ref:`types-set` " +"for documentation about this class." +msgstr "" + +#: ../../library/functions.rst:1818 +msgid "" +"For other containers see the built-in :class:`frozenset`, :class:`list`, " +":class:`tuple`, and :class:`dict` classes, as well as the :mod:`collections`" +" module." +msgstr "" +"有关其他容器请参看内置的 :class:`frozenset`, :class:`list`, :class:`tuple` 和 " +":class:`dict` 类,以及 :mod:`collections` 模块。" + +#: ../../library/functions.rst:1825 +msgid "" +"This is the counterpart of :func:`getattr`. The arguments are an object, a " +"string, and an arbitrary value. The string may name an existing attribute " +"or a new attribute. The function assigns the value to the attribute, " +"provided the object allows it. For example, ``setattr(x, 'foobar', 123)`` " +"is equivalent to ``x.foobar = 123``." +msgstr "" +"本函数与 :func:`getattr` " +"相对应。其参数为一个对象、一个字符串和一个任意值。字符串可以为某现有属性的名称,或为新属性。只要对象允许,函数会将值赋给属性。如 " +"``setattr(x, 'foobar', 123)`` 等价于 ``x.foobar = 123``。" + +#: ../../library/functions.rst:1831 +msgid "" +"*name* need not be a Python identifier as defined in :ref:`identifiers` " +"unless the object chooses to enforce that, for example in a custom " +":meth:`~object.__getattribute__` or via :attr:`~object.__slots__`. An " +"attribute whose name is not an identifier will not be accessible using the " +"dot notation, but is accessible through :func:`getattr` etc.." +msgstr "" +"*name* 无需为在 :ref:`identifiers` 中定义的 Python 标识符除非对象选择强制这样做,例如在一个自定义的 " +":meth:`~object.__getattribute__` 中或是通过 :attr:`~object.__slots__`。 " +"一个名称不为标识符的属性将不可使用点号标记来访问,但是可以通过 :func:`getattr` 等来访问。" + +#: ../../library/functions.rst:1839 +msgid "" +"Since :ref:`private name mangling ` happens at " +"compilation time, one must manually mangle a private attribute's (attributes" +" with two leading underscores) name in order to set it with :func:`setattr`." +msgstr "" +"由于 :ref:`私有名称混合 ` " +"发生在编译时,因此必须手动混合私有属性(以两个下划线打头的属性)名称以便使用 :func:`setattr` 来设置它。" + +#: ../../library/functions.rst:1848 +msgid "" +"Return a :term:`slice` object representing the set of indices specified by " +"``range(start, stop, step)``. The *start* and *step* arguments default to " +"``None``." +msgstr "" +"返回一个表示由 ``range(start, stop, step)`` 指定的索引集的 :term:`slice` 对象。 *start* 和 " +"*step* 参数默认为 ``None``。" + +#: ../../library/functions.rst:1852 +msgid "" +"Slice objects are also generated when :ref:`slicing syntax ` is " +"used. For example: ``a[start:stop:step]`` or ``a[start:stop, i]``." +msgstr "" +"当使用 :ref:`切片语法 ` 时也会生成切片对象。 例如: ``a[start:stop:step]`` 或 " +"``a[start:stop, i]``。" + +#: ../../library/functions.rst:1855 +msgid "" +"See :func:`itertools.islice` for an alternate version that returns an " +":term:`iterator`." +msgstr "请参阅 :func:`itertools.islice` 了解另一种可返回 :term:`iterator` 的版本。" + +#: ../../library/functions.rst:1862 +msgid "" +"These read-only attributes are set to the argument values (or their " +"default). They have no other explicit functionality; however, they are used" +" by NumPy and other third-party packages." +msgstr "这些只读属性会被设为相应的参数值(或其默认值)。它们没有其他显式的功能;不过,它们会被 NumPy 和其他第三方包所使用。" + +#: ../../library/functions.rst:1866 +msgid "" +"Slice objects are now :term:`hashable` (provided :attr:`~slice.start`, " +":attr:`~slice.stop`, and :attr:`~slice.step` are hashable)." +msgstr "" +"Slice 对象现在将为 :term:`hashable` (如果 :attr:`~slice.start`, :attr:`~slice.stop` " +"和 :attr:`~slice.step` 均为可哈希对象)。" + +#: ../../library/functions.rst:1872 +msgid "Return a new sorted list from the items in *iterable*." +msgstr "根据 *iterable* 中的项返回一个新的已排序列表。" + +#: ../../library/functions.rst:1874 +msgid "" +"Has two optional arguments which must be specified as keyword arguments." +msgstr "具有两个可选参数,它们都必须指定为关键字参数。" + +#: ../../library/functions.rst:1876 +msgid "" +"*key* specifies a function of one argument that is used to extract a " +"comparison key from each element in *iterable* (for example, " +"``key=str.lower``). The default value is ``None`` (compare the elements " +"directly)." +msgstr "" +"*key* 指定带有单个参数的函数,用于从 *iterable* 的每个元素中提取用于比较的键 (例如 ``key=str.lower``)。默认值为 " +"``None`` (直接比较元素)。" + +#: ../../library/functions.rst:1880 +msgid "" +"*reverse* is a boolean value. If set to ``True``, then the list elements " +"are sorted as if each comparison were reversed." +msgstr "*reverse* 为一个布尔值。如果设为 ``True``,则每个列表元素将按反向顺序比较进行排序。" + +#: ../../library/functions.rst:1883 +msgid "" +"Use :func:`functools.cmp_to_key` to convert an old-style *cmp* function to a" +" *key* function." +msgstr "使用 :func:`functools.cmp_to_key` 可将老式的 *cmp* 函数转换为 *key* 函数。" + +#: ../../library/functions.rst:1886 +msgid "" +"The built-in :func:`sorted` function is guaranteed to be stable. A sort is " +"stable if it guarantees not to change the relative order of elements that " +"compare equal --- this is helpful for sorting in multiple passes (for " +"example, sort by department, then by salary grade)." +msgstr "" +"内置的 :func:`sorted` 确保是稳定的。如果一个排序确保不会改变比较结果相等的元素的相对顺序就称其为稳定的 --- " +"这有利于进行多重排序(例如先按部门、再按薪级排序)。" + +#: ../../library/functions.rst:1891 +msgid "" +"The sort algorithm uses only ``<`` comparisons between items. While " +"defining an :meth:`~object.__lt__` method will suffice for sorting, :PEP:`8`" +" recommends that all six :ref:`rich comparisons ` be " +"implemented. This will help avoid bugs when using the same data with other " +"ordering tools such as :func:`max` that rely on a different underlying " +"method. Implementing all six comparisons also helps avoid confusion for " +"mixed type comparisons which can call the reflected :meth:`~object.__gt__` " +"method." +msgstr "" +"排序算法只使用 ``<`` 在条目间进行比较。虽然定义一个 :meth:`~object.__lt__` 方法就足以完成排序,但 :PEP:`8` " +"建议实现所有六个 :ref:`富比较操作 `。这将有助于避免在与其他排序工具如 :func:`max` " +"使用相同的数据时出现程序缺陷,这些工具依赖于不同的底层方法。实现所有六个比较操作也有助于避免混合类型比较的混乱,因为混合类型比较可以调用反射的 " +":meth:`~object.__gt__` 方法。" + +#: ../../library/functions.rst:1900 +msgid "" +"For sorting examples and a brief sorting tutorial, see :ref:`sortinghowto`." +msgstr "有关排序示例和简要排序教程,请参阅 :ref:`sortinghowto`。" + +#: ../../library/functions.rst:1904 +msgid "Transform a method into a static method." +msgstr "将方法转换为静态方法。" + +#: ../../library/functions.rst:1906 +msgid "" +"A static method does not receive an implicit first argument. To declare a " +"static method, use this idiom::" +msgstr "静态方法不会接收隐式的第一个参数。要声明一个静态方法,请使用此语法 ::" + +#: ../../library/functions.rst:1909 +msgid "" +"class C:\n" +" @staticmethod\n" +" def f(arg1, arg2, argN): ..." +msgstr "" +"class C:\n" +" @staticmethod\n" +" def f(arg1, arg2, argN): ..." + +#: ../../library/functions.rst:1913 +msgid "" +"The ``@staticmethod`` form is a function :term:`decorator` -- see " +":ref:`function` for details." +msgstr "" +"``@staticmethod`` 这样的形式称为函数的 :term:`decorator` -- 详情参阅 :ref:`function`。" + +#: ../../library/functions.rst:1916 +msgid "" +"A static method can be called either on the class (such as ``C.f()``) or on " +"an instance (such as ``C().f()``). Moreover, the static method " +":term:`descriptor` is also callable, so it can be used in the class " +"definition (such as ``f()``)." +msgstr "" +"静态方法既可以在类上调用 (如 ``C.f()``),也可以在实例上调用 (如 ``C().f()``)。此外,静态方法 " +":term:`descriptor` 也属于可调用对象,因而它们可以在类定义中使用 (如 ``f()``)。" + +#: ../../library/functions.rst:1921 +msgid "" +"Static methods in Python are similar to those found in Java or C++. Also, " +"see :func:`classmethod` for a variant that is useful for creating alternate " +"class constructors." +msgstr "Python 的静态方法与 Java 或 C++ 类似。另请参阅 :func:`classmethod`,可用于创建另一种类构造函数。" + +#: ../../library/functions.rst:1925 +msgid "" +"Like all decorators, it is also possible to call ``staticmethod`` as a " +"regular function and do something with its result. This is needed in some " +"cases where you need a reference to a function from a class body and you " +"want to avoid the automatic transformation to instance method. For these " +"cases, use this idiom::" +msgstr "" +"像所有装饰器一样,也可以像常规函数一样调用 ``staticmethod`` " +",并对其结果执行某些操作。比如某些情况下需要从类主体引用函数并且您希望避免自动转换为实例方法。对于这些情况,请使用此语法::" + +#: ../../library/functions.rst:1931 +msgid "" +"def regular_function():\n" +" ...\n" +"\n" +"class C:\n" +" method = staticmethod(regular_function)" +msgstr "" +"def regular_function():\n" +" ...\n" +"\n" +"class C:\n" +" method = staticmethod(regular_function)" + +#: ../../library/functions.rst:1937 +msgid "For more information on static methods, see :ref:`types`." +msgstr "想了解更多有关静态方法的信息,请参阅 :ref:`types`。" + +#: ../../library/functions.rst:1939 +msgid "" +"Static methods now inherit the method attributes " +"(:attr:`~function.__module__`, :attr:`~function.__name__`, " +":attr:`~function.__qualname__`, :attr:`~function.__doc__` and " +":attr:`~function.__annotations__`), have a new ``__wrapped__`` attribute, " +"and are now callable as regular functions." +msgstr "" +"静态方法现在继承了方法的属性 (:attr:`~function.__module__`, :attr:`~function.__name__`, " +":attr:`~function.__qualname__`, :attr:`~function.__doc__` 和 " +":attr:`~function.__annotations__`),并具有新的 ``__wrapped__`` " +"属性,现在是属于与常规函数类似的可调用对象。" + +#: ../../library/functions.rst:1957 +msgid "" +"Return a :class:`str` version of *object*. See :func:`str` for details." +msgstr "返回一个 :class:`str` 版本的 *object* 。有关详细信息,请参阅 :func:`str`。" + +#: ../../library/functions.rst:1959 +msgid "" +"``str`` is the built-in string :term:`class`. For general information about" +" strings, see :ref:`textseq`." +msgstr "``str`` 是内置字符串 :term:`class`。更多关于字符串的信息查看 :ref:`textseq`。" + +#: ../../library/functions.rst:1965 +msgid "" +"Sums *start* and the items of an *iterable* from left to right and returns " +"the total. The *iterable*'s items are normally numbers, and the start value" +" is not allowed to be a string." +msgstr "" +"从 *start* 开始自左向右对 *iterable* 的项求和并返回总计值。 *iterable* 的项通常为数字,而 start " +"值则不允许为字符串。" + +#: ../../library/functions.rst:1969 +msgid "" +"For some use cases, there are good alternatives to :func:`sum`. The " +"preferred, fast way to concatenate a sequence of strings is by calling " +"``''.join(sequence)``. To add floating-point values with extended " +"precision, see :func:`math.fsum`\\. To concatenate a series of iterables, " +"consider using :func:`itertools.chain`." +msgstr "" +"对于某些用例,存在 :func:`sum` 的更好替代。拼接字符串序列的更好、更快的方式是调用 ``''.join(sequence)``。 " +"要以扩展的精度执行浮点数值的求和,请参阅 :func:`math.fsum`。要拼接一系列可迭代对象,请考虑使用 " +":func:`itertools.chain`." + +#: ../../library/functions.rst:1975 +msgid "The *start* parameter can be specified as a keyword argument." +msgstr "*start* 形参可用关键字参数形式来指定。" + +#: ../../library/functions.rst:1978 +msgid "" +"Summation of floats switched to an algorithm that gives higher accuracy and " +"better commutativity on most builds." +msgstr "浮点数的求和已切换为一种可在大多数构建版本中给出更高精确度和更好适应性的算法。" + +#: ../../library/functions.rst:1981 +msgid "" +"Added specialization for summation of complexes, using same algorithm as for" +" summation of floats." +msgstr "添加了复数求和的特殊化,使用与浮点数求和相同的算法。" + +#: ../../library/functions.rst:1989 +msgid "" +"Return a proxy object that delegates method calls to a parent or sibling " +"class of *type*. This is useful for accessing inherited methods that have " +"been overridden in a class." +msgstr "返回一个代理对象,它会将方法调用委托给 *type* 的父类或兄弟类。这对于访问已在类中被重写的继承方法很有用。" + +#: ../../library/functions.rst:1993 +msgid "" +"The *object_or_type* determines the :term:`method resolution order` to be " +"searched. The search starts from the class right after the *type*." +msgstr "" +"*object_or_type* 确定要用于搜索的 :term:`method resolution order`。搜索会从 *type* " +"之后的类开始。" + +#: ../../library/functions.rst:1997 +msgid "" +"For example, if :attr:`~type.__mro__` of *object_or_type* is ``D -> B -> C " +"-> A -> object`` and the value of *type* is ``B``, then :func:`super` " +"searches ``C -> A -> object``." +msgstr "" +"举例来说,如果 *object_or_type* 的 :attr:`~type.__mro__` 为 ``D -> B -> C -> A -> " +"object`` 并且 *type* 的值为 ``B``,则 :func:`super` 将会搜索 ``C -> A -> object``。" + +#: ../../library/functions.rst:2001 +msgid "" +"The :attr:`~type.__mro__` attribute of the class corresponding to " +"*object_or_type* lists the method resolution search order used by both " +":func:`getattr` and :func:`super`. The attribute is dynamic and can change " +"whenever the inheritance hierarchy is updated." +msgstr "" +"对应于 *object_or_type* 的类的 :attr:`~type.__mro__` 属性列出了 :func:`getattr` 和 " +":func:`super` 所共同使用的方法解析搜索顺序。该属性是动态的并可在任何继承层级结构更新时被改变。" + +#: ../../library/functions.rst:2006 +msgid "" +"If the second argument is omitted, the super object returned is unbound. If" +" the second argument is an object, ``isinstance(obj, type)`` must be true. " +"If the second argument is a type, ``issubclass(type2, type)`` must be true " +"(this is useful for classmethods)." +msgstr "" +"如果省略第二个参数,则返回的超类对象是未绑定的。如果第二个参数为一个对象,则 ``isinstance(obj, type)`` 必须为真值。 " +"如果第二个参数为一个类型,则 ``issubclass(type2, type)`` 必须为真值(这适用于类方法)。" + +#: ../../library/functions.rst:2011 +msgid "" +"When called directly within an ordinary method of a class, both arguments " +"may be omitted (\"zero-argument :func:`!super`\"). In this case, *type* will" +" be the enclosing class, and *obj* will be the first argument of the " +"immediately enclosing function (typically ``self``). (This means that zero-" +"argument :func:`!super` will not work as expected within nested functions, " +"including generator expressions, which implicitly create nested functions.)" +msgstr "" +"当在类的某个普通方法中被直接调用时,这两个参数均可被省略 (即 \"零参数 :func:`!super`\")。 在此情况下,*type* " +"将为其外层的类,而 *obj* 将为其所在函数的第一个参数 (通常为 ``self``)。 (这意味着零参数 :func:`!super` " +"在嵌套的函数内的行为将不会如预期那样,这也包括生成器表达式,因为它会隐式地创建嵌套的函数。)" + +#: ../../library/functions.rst:2018 +msgid "" +"There are two typical use cases for *super*. In a class hierarchy with " +"single inheritance, *super* can be used to refer to parent classes without " +"naming them explicitly, thus making the code more maintainable. This use " +"closely parallels the use of *super* in other programming languages." +msgstr "" +"*super* 有两个典型用例。在具有单继承的类层级结构中,*super* 可用来引用父类而不必显式地指定它们的名称,从而令代码更易维护。 " +"这种用法与其他编程语言中 *super* 的用法非常相似。" + +#: ../../library/functions.rst:2023 +msgid "" +"The second use case is to support cooperative multiple inheritance in a " +"dynamic execution environment. This use case is unique to Python and is not" +" found in statically compiled languages or languages that only support " +"single inheritance. This makes it possible to implement \"diamond " +"diagrams\" where multiple base classes implement the same method. Good " +"design dictates that such implementations have the same calling signature in" +" every case (because the order of calls is determined at runtime, because " +"that order adapts to changes in the class hierarchy, and because that order " +"can include sibling classes that are unknown prior to runtime)." +msgstr "" +"第二个用例是在动态执行环境中支持协作多重继承。此用例为 Python 所独有而不存在于静态编码语言或仅支持单继承的语言当中。 " +"这使用实现“菱形图”成为可能,即有多个基类实现相同的方法。 " +"好的设计强制要求这样的方法在每个情况下都具有相同的调用签名(因为调用顺序是在运行时确定的,也因为这个顺序要适应类层级结构的更改,还因为这个顺序可能包括在运行时之前未知的兄弟类)。" + +#: ../../library/functions.rst:2033 +msgid "For both use cases, a typical superclass call looks like this::" +msgstr "对于以上两个用例,典型的超类调用看起来是这样的::" + +#: ../../library/functions.rst:2035 +msgid "" +"class C(B):\n" +" def method(self, arg):\n" +" super().method(arg) # This does the same thing as:\n" +" # super(C, self).method(arg)" +msgstr "" +"class C(B):\n" +" def method(self, arg):\n" +" super().method(arg) # 它的作用像:\n" +" # super(C, self).method(arg)" + +#: ../../library/functions.rst:2040 +msgid "" +"In addition to method lookups, :func:`super` also works for attribute " +"lookups. One possible use case for this is calling :term:`descriptors " +"` in a parent or sibling class." +msgstr "" +"除了方法查找之外,:func:`super` 也可用于属性查找。一个可能的应用场合是在上级或同级类中调用 :term:`描述器 " +"`." + +#: ../../library/functions.rst:2044 +msgid "" +"Note that :func:`super` is implemented as part of the binding process for " +"explicit dotted attribute lookups such as ``super().__getitem__(name)``. It " +"does so by implementing its own :meth:`~object.__getattribute__` method for " +"searching classes in a predictable order that supports cooperative multiple " +"inheritance. Accordingly, :func:`super` is undefined for implicit lookups " +"using statements or operators such as ``super()[name]``." +msgstr "" +"请注意 :func:`super` 被实现为为显式的带点号属性查找的绑定过程的组成部分,例如 " +"``super().__getitem__(name)``。它做到这一点是通过实现自己的 " +":meth:`~object.__getattribute__` 方法以便能够按支持协作多重继承的可预测的顺序来搜索类。 " +"相应地,:func:`super` 在像 ``super()[name]`` 这样使用语句或运算符进行隐式查找时则是未定义的。" + +#: ../../library/functions.rst:2052 +msgid "" +"Also note that, aside from the zero argument form, :func:`super` is not " +"limited to use inside methods. The two argument form specifies the " +"arguments exactly and makes the appropriate references. The zero argument " +"form only works inside a class definition, as the compiler fills in the " +"necessary details to correctly retrieve the class being defined, as well as " +"accessing the current instance for ordinary methods." +msgstr "" +"还要注意的是,除了零个参数的形式以外,:func:`super` 并不限于在方法内部使用。两个参数的形式明确指定参数并进行相应的引用。 " +"零个参数的形式仅适用于类定义内部,因为编译器需要填入必要的细节以正确地检索到被定义的类,还需要让普通方法访问当前实例。" + +#: ../../library/functions.rst:2059 +msgid "" +"For practical suggestions on how to design cooperative classes using " +":func:`super`, see `guide to using super() " +"`_." +msgstr "" +"对于有关如何使用 :func:`super` 来如何设计协作类的实用建议,请参阅 `使用 super() 的指南 " +"`_." + +#: ../../library/functions.rst:2063 +msgid "" +":class:`super` objects are now :mod:`pickleable ` and " +":mod:`copyable `." +msgstr "" +":class:`super` 对象现在是 :mod:`pickleable ` 和 :mod:`copyable `。" + +#: ../../library/functions.rst:2072 +msgid "" +"Rather than being a function, :class:`tuple` is actually an immutable " +"sequence type, as documented in :ref:`typesseq-tuple` and :ref:`typesseq`." +msgstr "" +"虽然被称为函数,但 :class:`tuple` 实际上是一个不可变的序列类型,参见在 :ref:`typesseq-tuple` 与 " +":ref:`typesseq` 中的文档说明。" + +#: ../../library/functions.rst:2081 +msgid "" +"With one argument, return the type of an *object*. The return value is a " +"type object and generally the same object as returned by " +":attr:`object.__class__`." +msgstr "" +"传入一个参数时,返回 *object* 的类型。返回值是一个 type 对象并且通常与 :attr:`object.__class__` " +"所返回的对象相同。" + +#: ../../library/functions.rst:2085 +msgid "" +"The :func:`isinstance` built-in function is recommended for testing the type" +" of an object, because it takes subclasses into account." +msgstr "推荐使用 :func:`isinstance` 内置函数来检测对象的类型,因为它会考虑子类的情况。" + +#: ../../library/functions.rst:2088 +msgid "" +"With three arguments, return a new type object. This is essentially a " +"dynamic form of the :keyword:`class` statement. The *name* string is the " +"class name and becomes the :attr:`~type.__name__` attribute. The *bases* " +"tuple contains the base classes and becomes the :attr:`~type.__bases__` " +"attribute; if empty, :class:`object`, the ultimate base of all classes, is " +"added. The *dict* dictionary contains attribute and method definitions for " +"the class body; it may be copied or wrapped before becoming the " +":attr:`~type.__dict__` attribute. The following two statements create " +"identical :class:`!type` objects:" +msgstr "" +"传入三个参数时,返回一个新的 type 对象。这在本质上是 :keyword:`class` 语句的一种动态形式。 *name* 字符串即类名并会成为 " +":attr:`~type.__name__` 属性;*bases* 元组包含基类并会成为 :attr:`~type.__bases__` " +"属性;如果为空,则会添加所有类的终极基类,即 :class:`object`。 *dict* 字典包含类体的属性和方法定义;它在成为 " +":attr:`~type.__dict__` 属性之前可能会被拷贝或包装。下面两条语句会创建同样的 :class:`!type` 对象:" + +#: ../../library/functions.rst:2103 +msgid "See also:" +msgstr "另请参阅:" + +#: ../../library/functions.rst:2105 +msgid "" +":ref:`Documentation on attributes and methods on classes `." +msgstr ":ref:`有关类的属性和方法的文档 `。" + +#: ../../library/functions.rst:2106 +msgid ":ref:`bltin-type-objects`" +msgstr ":ref:`bltin-type-objects`" + +#: ../../library/functions.rst:2108 +msgid "" +"Keyword arguments provided to the three argument form are passed to the " +"appropriate metaclass machinery (usually :meth:`~object.__init_subclass__`) " +"in the same way that keywords in a class definition (besides *metaclass*) " +"would." +msgstr "" +"提供给三参数形式的关键字参数会被传递给适当的元类机制 (通常为 " +":meth:`~object.__init_subclass__`),相当于类定义中关键字 (除了 *metaclass*) 的行为方式。" + +#: ../../library/functions.rst:2113 +msgid "See also :ref:`class-customization`." +msgstr "另请参阅 :ref:`class-customization`。" + +#: ../../library/functions.rst:2115 +msgid "" +"Subclasses of :class:`!type` which don't override ``type.__new__`` may no " +"longer use the one-argument form to get the type of an object." +msgstr ":class:`!type` 的子类如果未重写 ``type.__new__`` 将不再能使用一个参数的形式来获取对象的类型。" + +#: ../../library/functions.rst:2122 +msgid "" +"Return the :attr:`~object.__dict__` attribute for a module, class, instance," +" or any other object with a :attr:`!__dict__` attribute." +msgstr "" +"返回模块、类、实例或任何其他具有 :attr:`!__dict__` 属性的对象的 :attr:`~object.__dict__` 属性。" + +#: ../../library/functions.rst:2125 +msgid "" +"Objects such as modules and instances have an updateable " +":attr:`~object.__dict__` attribute; however, other objects may have write " +"restrictions on their :attr:`!__dict__` attributes (for example, classes use" +" a :class:`types.MappingProxyType` to prevent direct dictionary updates)." +msgstr "" +"模块和实例这样的对象具有可更新的 :attr:`~object.__dict__` 属性;但是,其他对象的 :attr:`!__dict__` " +"属性可能会设置写入限制(例如,类会使用 :class:`types.MappingProxyType` 来防止直接更新字典)。" + +#: ../../library/functions.rst:2130 +msgid "Without an argument, :func:`vars` acts like :func:`locals`." +msgstr "不带参数时,:func:`vars` 的行为将类似于 :func:`locals`。" + +#: ../../library/functions.rst:2132 +msgid "" +"A :exc:`TypeError` exception is raised if an object is specified but it " +"doesn't have a :attr:`~object.__dict__` attribute (for example, if its class" +" defines the :attr:`~object.__slots__` attribute)." +msgstr "" +"如果指定了一个对象但它没有 :attr:`~object.__dict__` 属性(例如,当它所属的类定义了 " +":attr:`~object.__slots__` 属性时)则会引发 :exc:`TypeError` 异常。" + +#: ../../library/functions.rst:2138 +msgid "" +"The result of calling this function without an argument has been updated as " +"described for the :func:`locals` builtin." +msgstr "不带参数调用此函数的结果已被更新为与 :func:`locals` 内置函数的描述类似。" + +#: ../../library/functions.rst:2144 +msgid "" +"Iterate over several iterables in parallel, producing tuples with an item " +"from each one." +msgstr "在多个迭代器上并行迭代,从每个迭代器返回一个数据项组成元组。" + +#: ../../library/functions.rst:2147 +msgid "Example::" +msgstr "示例::" + +#: ../../library/functions.rst:2149 +msgid "" +">>> for item in zip([1, 2, 3], ['sugar', 'spice', 'everything nice']):\n" +"... print(item)\n" +"...\n" +"(1, 'sugar')\n" +"(2, 'spice')\n" +"(3, 'everything nice')" +msgstr "" +">>> for item in zip([1, 2, 3], ['sugar', 'spice', 'everything nice']):\n" +"... print(item)\n" +"...\n" +"(1, 'sugar')\n" +"(2, 'spice')\n" +"(3, 'everything nice')" + +#: ../../library/functions.rst:2156 +msgid "" +"More formally: :func:`zip` returns an iterator of tuples, where the *i*-th " +"tuple contains the *i*-th element from each of the argument iterables." +msgstr "更正式的说法: :func:`zip` 返回元组的迭代器,其中第 *i* 个元组包含的是每个参数迭代器的第 *i* 个元素。" + +#: ../../library/functions.rst:2159 +msgid "" +"Another way to think of :func:`zip` is that it turns rows into columns, and " +"columns into rows. This is similar to `transposing a matrix " +"`_." +msgstr "" +"不妨换一种方式认识 :func:`zip`:它会把行变成列,把列变成行。这类似于 `矩阵转置 " +"`_." + +#: ../../library/functions.rst:2163 +msgid "" +":func:`zip` is lazy: The elements won't be processed until the iterable is " +"iterated on, e.g. by a :keyword:`!for` loop or by wrapping in a " +":class:`list`." +msgstr "" +":func:`zip` 是延迟执行的:直至迭代时才会对元素进行处理,比如 :keyword:`!for` 循环或放入 :class:`list` 中。" + +#: ../../library/functions.rst:2167 +msgid "" +"One thing to consider is that the iterables passed to :func:`zip` could have" +" different lengths; sometimes by design, and sometimes because of a bug in " +"the code that prepared these iterables. Python offers three different " +"approaches to dealing with this issue:" +msgstr "" +"值得考虑的是,传给 :func:`zip` 的可迭代对象可能长度不同;有时是有意为之,有时是因为准备这些对象的代码存在错误。Python " +"提供了三种不同的处理方案:" + +#: ../../library/functions.rst:2172 +msgid "" +"By default, :func:`zip` stops when the shortest iterable is exhausted. It " +"will ignore the remaining items in the longer iterables, cutting off the " +"result to the length of the shortest iterable::" +msgstr "默认情况下,:func:`zip` 在最短的迭代完成后停止。较长可迭代对象中的剩余项将被忽略,结果会裁切至最短可迭代对象的长度:" + +#: ../../library/functions.rst:2176 +msgid "" +">>> list(zip(range(3), ['fee', 'fi', 'fo', 'fum']))\n" +"[(0, 'fee'), (1, 'fi'), (2, 'fo')]" +msgstr "" +">>> list(zip(range(3), ['fee', 'fi', 'fo', 'fum']))\n" +"[(0, 'fee'), (1, 'fi'), (2, 'fo')]" + +#: ../../library/functions.rst:2179 +msgid "" +":func:`zip` is often used in cases where the iterables are assumed to be of " +"equal length. In such cases, it's recommended to use the ``strict=True`` " +"option. Its output is the same as regular :func:`zip`::" +msgstr "" +"通常 :func:`zip` 用于可迭代对象等长的情况下。这时建议用 ``strict=True`` 的选项。输出与普通的 :func:`zip` " +"相同::" + +#: ../../library/functions.rst:2183 +msgid "" +">>> list(zip(('a', 'b', 'c'), (1, 2, 3), strict=True))\n" +"[('a', 1), ('b', 2), ('c', 3)]" +msgstr "" +">>> list(zip(('a', 'b', 'c'), (1, 2, 3), strict=True))\n" +"[('a', 1), ('b', 2), ('c', 3)]" + +#: ../../library/functions.rst:2186 +msgid "" +"Unlike the default behavior, it raises a :exc:`ValueError` if one iterable " +"is exhausted before the others:" +msgstr "与默认行为不同,如果一个可迭代对象在其他几个之前被耗尽则会引发 :exc:`ValueError`:" + +#: ../../library/functions.rst:2204 +msgid "" +"Without the ``strict=True`` argument, any bug that results in iterables of " +"different lengths will be silenced, possibly manifesting as a hard-to-find " +"bug in another part of the program." +msgstr "" +"如果未指定 ``strict=True`` 参数,所有导致可迭代对象长度不同的错误都会被抑制,这可能会在程序的其他地方表现为难以发现的错误。" + +#: ../../library/functions.rst:2208 +msgid "" +"Shorter iterables can be padded with a constant value to make all the " +"iterables have the same length. This is done by " +":func:`itertools.zip_longest`." +msgstr "" +"为了让所有的可迭代对象具有相同的长度,长度较短的可用常量进行填充。这可由 :func:`itertools.zip_longest` 来完成。" + +#: ../../library/functions.rst:2212 +msgid "" +"Edge cases: With a single iterable argument, :func:`zip` returns an iterator" +" of 1-tuples. With no arguments, it returns an empty iterator." +msgstr "极端例子是只有一个可迭代对象参数,:func:`zip` 会返回一个一元组的迭代器。如果未给出参数,则返回一个空的迭代器。" + +#: ../../library/functions.rst:2215 +msgid "Tips and tricks:" +msgstr "小技巧:" + +#: ../../library/functions.rst:2217 +msgid "" +"The left-to-right evaluation order of the iterables is guaranteed. This " +"makes possible an idiom for clustering a data series into n-length groups " +"using ``zip(*[iter(s)]*n, strict=True)``. This repeats the *same* iterator " +"``n`` times so that each output tuple has the result of ``n`` calls to the " +"iterator. This has the effect of dividing the input into n-length chunks." +msgstr "" +"可确保迭代器的求值顺序是从左到右的。这样就能用 ``zip(*[iter(s)]*n, strict=True)`` 将数据列表按长度 n " +"进行分组。这将重复 *相同* 的迭代器 ``n`` 次,输出的每个元组都包含 ``n`` 次调用迭代器的结果。这样做的效果是把输入拆分为长度为 n " +"的块。" + +#: ../../library/functions.rst:2223 +msgid "" +":func:`zip` in conjunction with the ``*`` operator can be used to unzip a " +"list::" +msgstr ":func:`zip` 与 ``*`` 运算符相结合可以用来拆解一个列表::" + +#: ../../library/functions.rst:2226 +msgid "" +">>> x = [1, 2, 3]\n" +">>> y = [4, 5, 6]\n" +">>> list(zip(x, y))\n" +"[(1, 4), (2, 5), (3, 6)]\n" +">>> x2, y2 = zip(*zip(x, y))\n" +">>> x == list(x2) and y == list(y2)\n" +"True" +msgstr "" +">>> x = [1, 2, 3]\n" +">>> y = [4, 5, 6]\n" +">>> list(zip(x, y))\n" +"[(1, 4), (2, 5), (3, 6)]\n" +">>> x2, y2 = zip(*zip(x, y))\n" +">>> x == list(x2) and y == list(y2)\n" +"True" + +#: ../../library/functions.rst:2234 +msgid "Added the ``strict`` argument." +msgstr "增加了 ``strict`` 参数。" + +#: ../../library/functions.rst:2246 +msgid "" +"This is an advanced function that is not needed in everyday Python " +"programming, unlike :func:`importlib.import_module`." +msgstr "与 :func:`importlib.import_module` 不同,这是一个日常 Python 编程中不需要用到的高级函数。" + +#: ../../library/functions.rst:2249 +msgid "" +"This function is invoked by the :keyword:`import` statement. It can be " +"replaced (by importing the :mod:`builtins` module and assigning to " +"``builtins.__import__``) in order to change semantics of the " +":keyword:`!import` statement, but doing so is **strongly** discouraged as it" +" is usually simpler to use import hooks (see :pep:`302`) to attain the same " +"goals and does not cause issues with code which assumes the default import " +"implementation is in use. Direct use of :func:`__import__` is also " +"discouraged in favor of :func:`importlib.import_module`." +msgstr "" +"此函数会由 :keyword:`import` 语句唤起。它可以被替换 (通过导入 :mod:`builtins` 模块并赋值给 " +"``builtins.__import__``) 以便修改 :keyword:`!import` 语句的语义,但是 **强烈** " +"不建议这样做,因为使用导入钩子 (参见 :pep:`302`) 通常更容易实现同样的目标,并且不会导致代码问题,因为许多代码都会假定所用的是默认实现。 " +"同样也不建议直接使用 :func:`__import__` 而应该用 :func:`importlib.import_module`。" + +#: ../../library/functions.rst:2258 +msgid "" +"The function imports the module *name*, potentially using the given " +"*globals* and *locals* to determine how to interpret the name in a package " +"context. The *fromlist* gives the names of objects or submodules that should" +" be imported from the module given by *name*. The standard implementation " +"does not use its *locals* argument at all and uses its *globals* only to " +"determine the package context of the :keyword:`import` statement." +msgstr "" +"本函数会导入模块 *name*,利用 *globals* 和 *locals* 来决定如何在包的上下文中解释该名称。*fromlist* 给出了应从 " +"*name* 模块中导入的对象或子模块的名称。标准的实现代码完全不会用到 *locals* 参数,只用到了 *globals* 用于确定 " +":keyword:`import` 语句所在的包上下文。" + +#: ../../library/functions.rst:2265 +msgid "" +"*level* specifies whether to use absolute or relative imports. ``0`` (the " +"default) means only perform absolute imports. Positive values for *level* " +"indicate the number of parent directories to search relative to the " +"directory of the module calling :func:`__import__` (see :pep:`328` for the " +"details)." +msgstr "" +"*level* 指定是使用绝对还是相对导入。``0`` (默认值) 意味着仅执行绝对导入。 *level* 为正数值表示相对于模块调用 " +":func:`__import__` 的目录,将要搜索的父目录层数 (详情参见 :pep:`328`)。" + +#: ../../library/functions.rst:2271 +msgid "" +"When the *name* variable is of the form ``package.module``, normally, the " +"top-level package (the name up till the first dot) is returned, *not* the " +"module named by *name*. However, when a non-empty *fromlist* argument is " +"given, the module named by *name* is returned." +msgstr "" +"当 *name* 变量的形式为 ``package.module`` 时,通常将会返回最高层级的包(第一个点号之前的名称),而 *不是* 以 " +"*name* 命名的模块。但是,当给出了非空的 *fromlist* 参数时,则将返回以 *name* 命名的模块。" + +#: ../../library/functions.rst:2276 +msgid "" +"For example, the statement ``import spam`` results in bytecode resembling " +"the following code::" +msgstr "例如,语句 ``import spam`` 的结果将为与以下代码作用相同的字节码::" + +#: ../../library/functions.rst:2279 +msgid "spam = __import__('spam', globals(), locals(), [], 0)" +msgstr "spam = __import__('spam', globals(), locals(), [], 0)" + +#: ../../library/functions.rst:2281 +msgid "The statement ``import spam.ham`` results in this call::" +msgstr "语句 ``import spam.ham`` 的结果将为以下调用::" + +#: ../../library/functions.rst:2283 +msgid "spam = __import__('spam.ham', globals(), locals(), [], 0)" +msgstr "spam = __import__('spam.ham', globals(), locals(), [], 0)" + +#: ../../library/functions.rst:2285 +msgid "" +"Note how :func:`__import__` returns the toplevel module here because this is" +" the object that is bound to a name by the :keyword:`import` statement." +msgstr "" +"请注意在这里 :func:`__import__` 是如何返回顶层模块的,因为这是通过 :keyword:`import` 语句被绑定到特定名称的对象。" + +#: ../../library/functions.rst:2288 +msgid "" +"On the other hand, the statement ``from spam.ham import eggs, sausage as " +"saus`` results in ::" +msgstr "另一方面,语句 ``from spam.ham import eggs, sausage as saus`` 的结果将为 ::" + +#: ../../library/functions.rst:2291 +msgid "" +"_temp = __import__('spam.ham', globals(), locals(), ['eggs', 'sausage'], 0)\n" +"eggs = _temp.eggs\n" +"saus = _temp.sausage" +msgstr "" +"_temp = __import__('spam.ham', globals(), locals(), ['eggs', 'sausage'], 0)\n" +"eggs = _temp.eggs\n" +"saus = _temp.sausage" + +#: ../../library/functions.rst:2295 +msgid "" +"Here, the ``spam.ham`` module is returned from :func:`__import__`. From " +"this object, the names to import are retrieved and assigned to their " +"respective names." +msgstr "" +"在这里,``spam.ham`` 模块会由 :func:`__import__` 返回。要导入的对象将从此对象中提取并赋值给它们对应的名称。" + +#: ../../library/functions.rst:2299 +msgid "" +"If you simply want to import a module (potentially within a package) by " +"name, use :func:`importlib.import_module`." +msgstr "如果您只想按名称导入模块(可能在包中),请使用 :func:`importlib.import_module`" + +#: ../../library/functions.rst:2302 +msgid "" +"Negative values for *level* are no longer supported (which also changes the " +"default value to 0)." +msgstr "*level* 的值不再支持负数(默认值也修改为 0)。" + +#: ../../library/functions.rst:2306 +msgid "" +"When the command line options :option:`-E` or :option:`-I` are being used, " +"the environment variable :envvar:`PYTHONCASEOK` is now ignored." +msgstr "" +"当使用了命令行参数 :option:`-E` 或 :option:`-I` 时,环境变量 :envvar:`PYTHONCASEOK` 现在将被忽略。" + +#: ../../library/functions.rst:2311 +msgid "Footnotes" +msgstr "备注" + +#: ../../library/functions.rst:2312 +msgid "" +"Note that the parser only accepts the Unix-style end of line convention. If " +"you are reading the code from a file, make sure to use newline conversion " +"mode to convert Windows or Mac-style newlines." +msgstr "解析器只接受 Unix 风格的行结束符。如果您从文件中读取代码,请确保用换行符转换模式转换 Windows 或 Mac 风格的换行符。" + +#: ../../library/functions.rst:156 +msgid "Boolean" +msgstr "布尔值" + +#: ../../library/functions.rst:156 ../../library/functions.rst:2079 +msgid "type" +msgstr "type" + +#: ../../library/functions.rst:659 +msgid "built-in function" +msgstr "内置函数" + +#: ../../library/functions.rst:659 +msgid "exec" +msgstr "exec" + +#: ../../library/functions.rst:758 +msgid "NaN" +msgstr "NaN" + +#: ../../library/functions.rst:758 +msgid "Infinity" +msgstr "Infinity" + +#: ../../library/functions.rst:828 +msgid "__format__" +msgstr "__format__" + +#: ../../library/functions.rst:828 ../../library/functions.rst:1947 +msgid "string" +msgstr "string" + +#: ../../library/functions.rst:828 +msgid "format() (built-in function)" +msgstr "format() (内置函数)" + +#: ../../library/functions.rst:1342 +msgid "file object" +msgstr "file object -- 文件对象" + +#: ../../library/functions.rst:1342 ../../library/functions.rst:1463 +msgid "open() built-in function" +msgstr "open() 内置函数" + +#: ../../library/functions.rst:1370 +msgid "file" +msgstr "文件" + +#: ../../library/functions.rst:1370 +msgid "modes" +msgstr "模式" + +#: ../../library/functions.rst:1463 +msgid "universal newlines" +msgstr "universal newlines -- 通用换行" + +#: ../../library/functions.rst:1524 +msgid "line-buffered I/O" +msgstr "带行缓冲的 I/O" + +#: ../../library/functions.rst:1524 +msgid "unbuffered I/O" +msgstr "不带缓冲的 I/O" + +#: ../../library/functions.rst:1524 +msgid "buffer size, I/O" +msgstr "缓冲区大小,I/O" + +#: ../../library/functions.rst:1524 +msgid "I/O control" +msgstr "I/O 控制" + +#: ../../library/functions.rst:1524 +msgid "buffering" +msgstr "缓冲" + +#: ../../library/functions.rst:1524 +msgid "text mode" +msgstr "文本模式" + +#: ../../library/functions.rst:1524 ../../library/functions.rst:2240 +msgid "module" +msgstr "module" + +#: ../../library/functions.rst:1524 +msgid "sys" +msgstr "sys" + +#: ../../library/functions.rst:1947 +msgid "str() (built-in function)" +msgstr "str() (内置函数)" + +#: ../../library/functions.rst:2079 +msgid "object" +msgstr "object -- 对象" + +#: ../../library/functions.rst:2240 +msgid "statement" +msgstr "statement -- 语句" + +#: ../../library/functions.rst:2240 +msgid "import" +msgstr "import" + +#: ../../library/functions.rst:2240 +msgid "builtins" +msgstr "builtins" diff --git a/library/functools.po b/library/functools.po new file mode 100644 index 0000000000..f3fe959c80 --- /dev/null +++ b/library/functools.po @@ -0,0 +1,1478 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/functools.rst:2 +msgid "" +":mod:`!functools` --- Higher-order functions and operations on callable " +"objects" +msgstr ":mod:`!functools` —— 高阶函数,以及可调用对象上的操作" + +#: ../../library/functools.rst:7 +msgid "**Source code:** :source:`Lib/functools.py`" +msgstr "**源代码:** :source:`Lib/functools.py`" + +#: ../../library/functools.rst:16 +msgid "" +"The :mod:`!functools` module is for higher-order functions: functions that " +"act on or return other functions. In general, any callable object can be " +"treated as a function for the purposes of this module." +msgstr ":mod:`!functools` 模块针对高阶函数:即处理或返回其他函数的函数。 总的来说,任何可调用对象均可被作为此模块所处理的函数。" + +#: ../../library/functools.rst:20 +msgid "The :mod:`!functools` module defines the following functions:" +msgstr ":mod:`!functools` 模块定义了下列函数:module defines the following functions:" + +#: ../../library/functools.rst:24 +msgid "" +"Simple lightweight unbounded function cache. Sometimes called `\"memoize\" " +"`_." +msgstr "" +"简单轻量级未绑定函数缓存。有时称为 `\"memoize\" " +"`_." + +#: ../../library/functools.rst:27 +msgid "" +"Returns the same as ``lru_cache(maxsize=None)``, creating a thin wrapper " +"around a dictionary lookup for the function arguments. Because it never " +"needs to evict old values, this is smaller and faster than :func:`lru_cache`" +" with a size limit." +msgstr "" +"返回值与 ``lru_cache(maxsize=None)`` 相同,创建一个查找函数参数的字典的简单包装器。 " +"因为它不需要清除旧值,所以比带有大小限制的 :func:`lru_cache` 更小更快。" + +#: ../../library/functools.rst:32 ../../library/functools.rst:294 +msgid "For example::" +msgstr "例如::" + +#: ../../library/functools.rst:34 +msgid "" +"@cache\n" +"def factorial(n):\n" +" return n * factorial(n-1) if n else 1\n" +"\n" +">>> factorial(10) # no previously cached result, makes 11 recursive calls\n" +"3628800\n" +">>> factorial(5) # no new calls, just returns the cached result\n" +"120\n" +">>> factorial(12) # two new recursive calls, factorial(10) is cached\n" +"479001600" +msgstr "" +"@cache\n" +"def factorial(n):\n" +" return n * factorial(n-1) if n else 1\n" +"\n" +">>> factorial(10) # 不预先缓存结果,执行 11 次递归调用\n" +"3628800\n" +">>> factorial(5) # 不执行新的调用,只返回缓存的结果\n" +"120\n" +">>> factorial(12) # 执行两次新的递归调用,factorial(10) 已被缓存\n" +"479001600" + +#: ../../library/functools.rst:45 ../../library/functools.rst:155 +msgid "" +"The cache is threadsafe so that the wrapped function can be used in multiple" +" threads. This means that the underlying data structure will remain " +"coherent during concurrent updates." +msgstr "该缓存是线程安全的,因此被包装的函数可在多线程中使用。这意味着下层的数据结构将在并发更新期间保持一致性。" + +#: ../../library/functools.rst:49 ../../library/functools.rst:159 +msgid "" +"It is possible for the wrapped function to be called more than once if " +"another thread makes an additional call before the initial call has been " +"completed and cached." +msgstr "如果另一个线程在初始调用完成并被缓存之前执行了额外的调用,则被包装的函数可能会被多次调用。" + +#: ../../library/functools.rst:53 +msgid "" +"Call-once behavior is not guaranteed because locks are not held during the " +"function call. Potentially another call with the same arguments could occur " +"while the first call is still running." +msgstr "" + +#: ../../library/functools.rst:62 +msgid "" +"Transform a method of a class into a property whose value is computed once " +"and then cached as a normal attribute for the life of the instance. Similar " +"to :func:`property`, with the addition of caching. Useful for expensive " +"computed properties of instances that are otherwise effectively immutable." +msgstr "" +"将一个类方法转换为特征属性,一次性计算该特征属性的值,然后将其缓存为实例生命周期内的普通属性。类似于 :func:`property` " +"但增加了缓存功能。对于在其他情况下实际不可变的高计算资源消耗的实例特征属性来说,该函数非常有用。" + +#: ../../library/functools.rst:67 ../../library/functools.rst:139 +#: ../../library/functools.rst:435 +msgid "Example::" +msgstr "示例::" + +#: ../../library/functools.rst:69 +msgid "" +"class DataSet:\n" +"\n" +" def __init__(self, sequence_of_numbers):\n" +" self._data = tuple(sequence_of_numbers)\n" +"\n" +" @cached_property\n" +" def stdev(self):\n" +" return statistics.stdev(self._data)" +msgstr "" +"class DataSet:\n" +"\n" +" def __init__(self, sequence_of_numbers):\n" +" self._data = tuple(sequence_of_numbers)\n" +"\n" +" @cached_property\n" +" def stdev(self):\n" +" return statistics.stdev(self._data)" + +#: ../../library/functools.rst:78 +msgid "" +"The mechanics of :func:`cached_property` are somewhat different from " +":func:`property`. A regular property blocks attribute writes unless a " +"setter is defined. In contrast, a *cached_property* allows writes." +msgstr "" +":func:`cached_property` 的设定与 :func:`property` 有所不同。常规的 property " +"会阻止属性写入,除非定义了 setter。与之相反,*cached_property* 则允许写入。" + +#: ../../library/functools.rst:82 +msgid "" +"The *cached_property* decorator only runs on lookups and only when an " +"attribute of the same name doesn't exist. When it does run, the " +"*cached_property* writes to the attribute with the same name. Subsequent " +"attribute reads and writes take precedence over the *cached_property* method" +" and it works like a normal attribute." +msgstr "" +"*cached_property* 装饰器仅在执行查找且不存在同名属性时才会运行。当运行时,*cached_property* 会写入同名的属性。 " +"后续的属性读取和写入操作会优先于 *cached_property* 方法,其行为就像普通的属性一样。" + +#: ../../library/functools.rst:88 +msgid "" +"The cached value can be cleared by deleting the attribute. This allows the " +"*cached_property* method to run again." +msgstr "缓存的值可通过删除该属性来清空。这允许 *cached_property* 方法再次运行。" + +#: ../../library/functools.rst:91 +msgid "" +"The *cached_property* does not prevent a possible race condition in multi-" +"threaded usage. The getter function could run more than once on the same " +"instance, with the latest run setting the cached value. If the cached " +"property is idempotent or otherwise not harmful to run more than once on an " +"instance, this is fine. If synchronization is needed, implement the " +"necessary locking inside the decorated getter function or around the cached " +"property access." +msgstr "" +"*cached_property* 不能防止在多线程使用中可能出现的竞争条件。getter 函数可以在同一实例上多次运行,最后一次运行将设置缓存值。 " +"如果缓存的特征属性是幂等的或者对于在同一实例上多次运行是无害的,那就没有问题。如果需要进行同步,请在被装饰的 getter " +"函数内部或在缓存的特征属性访问外部实现必要的锁定操作。" + +#: ../../library/functools.rst:99 +msgid "" +"Note, this decorator interferes with the operation of :pep:`412` key-sharing" +" dictionaries. This means that instance dictionaries can take more space " +"than usual." +msgstr "注意,这个装饰器会影响 :pep:`412` 键共享字典的操作。这意味着相应的字典实例可能占用比通常时更多的空间。" + +#: ../../library/functools.rst:103 +msgid "" +"Also, this decorator requires that the ``__dict__`` attribute on each " +"instance be a mutable mapping. This means it will not work with some types, " +"such as metaclasses (since the ``__dict__`` attributes on type instances are" +" read-only proxies for the class namespace), and those that specify " +"``__slots__`` without including ``__dict__`` as one of the defined slots (as" +" such classes don't provide a ``__dict__`` attribute at all)." +msgstr "" +"而且,这个装饰器要求每个实例上的 ``__dict__`` 是可变的映射。这意味着它将不适用于某些类型,例如元类(因为类型实例上的 " +"``__dict__`` 属性是类命名空间的只读代理),以及那些指定了 ``__slots__`` 但未包括 ``__dict__`` " +"作为所定义的空位之一的类(因为这样的类根本没有提供 ``__dict__`` 属性)。" + +#: ../../library/functools.rst:110 +msgid "" +"If a mutable mapping is not available or if space-efficient key sharing is " +"desired, an effect similar to :func:`cached_property` can also be achieved " +"by stacking :func:`property` on top of :func:`lru_cache`. See :ref:`faq-" +"cache-method-calls` for more details on how this differs from " +":func:`cached_property`." +msgstr "" +"如果可变的映射不可用或者如果想要节省空间的键共享,可以通过在 :func:`lru_cache` 上堆叠 :func:`property` 来实现类似 " +":func:`cached_property` 的效果。请参阅 :ref:`faq-cache-method-calls` 了解这与 " +":func:`cached_property` 之间区别的详情。" + +#: ../../library/functools.rst:117 +msgid "" +"Prior to Python 3.12, ``cached_property`` included an undocumented lock to " +"ensure that in multi-threaded usage the getter function was guaranteed to " +"run only once per instance. However, the lock was per-property, not per-" +"instance, which could result in unacceptably high lock contention. In Python" +" 3.12+ this locking is removed." +msgstr "" +"在 Python 3.12 之前,``cached_property`` 包括了一个未写入文档的锁用来确保在多线程使用中 getter " +"函数对于每个实例保证只运行一次。但是,这个锁是针对特征属性的,不是针对实例的,这可能导致不可接受的高强度锁争用。在 Python 3.12+ " +"中这个锁已被移除。" + +#: ../../library/functools.rst:127 +msgid "" +"Transform an old-style comparison function to a :term:`key function`. Used " +"with tools that accept key functions (such as :func:`sorted`, :func:`min`, " +":func:`max`, :func:`heapq.nlargest`, :func:`heapq.nsmallest`, " +":func:`itertools.groupby`). This function is primarily used as a transition" +" tool for programs being converted from Python 2 which supported the use of " +"comparison functions." +msgstr "" +"将旧式的比较函数转换为新式的 :term:`key function`。在类似于 :func:`sorted`, :func:`min`, " +":func:`max`, :func:`heapq.nlargest`, :func:`heapq.nsmallest`, " +":func:`itertools.groupby` 等函数的 `key` 参数中使用。 此函数主要用作将 Python 2 " +"程序转换至新版的转换工具,以保持对比较函数的兼容。" + +#: ../../library/functools.rst:134 +msgid "" +"A comparison function is any callable that accepts two arguments, compares " +"them, and returns a negative number for less-than, zero for equality, or a " +"positive number for greater-than. A key function is a callable that accepts" +" one argument and returns another value to be used as the sort key." +msgstr "" +"比较函数是任何接受两个参数,比较它们,并在结果为小于时返回负数,等于时返回零,大于时返回正数的可调用对象。键函数是接受一个参数并返回另一值的可调用对象,返回值在排序时被用作键。" + +#: ../../library/functools.rst:141 +msgid "" +"sorted(iterable, key=cmp_to_key(locale.strcoll)) # locale-aware sort order" +msgstr "sorted(iterable, key=cmp_to_key(locale.strcoll)) # 感知语言区域的排序设置" + +#: ../../library/functools.rst:143 +msgid "" +"For sorting examples and a brief sorting tutorial, see :ref:`sortinghowto`." +msgstr "有关排序示例和简要排序教程,请参阅 :ref:`sortinghowto`。" + +#: ../../library/functools.rst:151 +msgid "" +"Decorator to wrap a function with a memoizing callable that saves up to the " +"*maxsize* most recent calls. It can save time when an expensive or I/O " +"bound function is periodically called with the same arguments." +msgstr "" +"一个为函数提供缓存功能的装饰器,缓存 *maxsize* 组传入参数,在下次以相同参数调用时直接返回上一次的结果。用以节约高开销或 I/O " +"函数的调用时间。" + +#: ../../library/functools.rst:163 +msgid "" +"Since a dictionary is used to cache results, the positional and keyword " +"arguments to the function must be :term:`hashable`." +msgstr "由于使用字典来缓存结果,因此传给该函数的位置和关键字参数必须为 :term:`hashable`。" + +#: ../../library/functools.rst:166 +msgid "" +"Distinct argument patterns may be considered to be distinct calls with " +"separate cache entries. For example, ``f(a=1, b=2)`` and ``f(b=2, a=1)`` " +"differ in their keyword argument order and may have two separate cache " +"entries." +msgstr "" +"不同的参数模式可能会被视为具有单独缓存项的不同调用。例如,``f(a=1, b=2)`` 和 ``f(b=2, a=1)`` " +"因其关键字参数顺序不同而可能会具有两个单独的缓存项。" + +#: ../../library/functools.rst:171 +msgid "" +"If *user_function* is specified, it must be a callable. This allows the " +"*lru_cache* decorator to be applied directly to a user function, leaving the" +" *maxsize* at its default value of 128::" +msgstr "" +"如果指定了 *user_function*,它必须是一个可调用对象。这允许 *lru_cache* 装饰器被直接应用于一个用户自定义函数,让 " +"*maxsize* 保持其默认值 128::" + +#: ../../library/functools.rst:175 +msgid "" +"@lru_cache\n" +"def count_vowels(word):\n" +" return sum(word.count(vowel) for vowel in 'AEIOUaeiou')" +msgstr "" + +#: ../../library/functools.rst:179 +msgid "" +"If *maxsize* is set to ``None``, the LRU feature is disabled and the cache " +"can grow without bound." +msgstr "如果 *maxsize* 设为 ``None``,LRU 特性将被禁用且缓存可无限增长。" + +#: ../../library/functools.rst:182 +msgid "" +"If *typed* is set to true, function arguments of different types will be " +"cached separately. If *typed* is false, the implementation will usually " +"regard them as equivalent calls and only cache a single result. (Some types " +"such as *str* and *int* may be cached separately even when *typed* is " +"false.)" +msgstr "" +"如果 *typed* 被设置为 true,不同类型的函数参数将被分别缓存。如果 *typed* 为 false " +",实现通常会将它们视为等价的调用,只缓存一个结果。(有些类型,如 *str* 和 *int*,即使 *typed* 为 false,也可能被分开缓存。)" + +#: ../../library/functools.rst:188 +msgid "" +"Note, type specificity applies only to the function's immediate arguments " +"rather than their contents. The scalar arguments, ``Decimal(42)`` and " +"``Fraction(42)`` are treated as distinct calls with distinct results. In " +"contrast, the tuple arguments ``('answer', Decimal(42))`` and ``('answer', " +"Fraction(42))`` are treated as equivalent." +msgstr "" +"请注意,类型的特殊性只适用于函数的直接参数而不是它们的内容。 标量参数 ``Decimal(42)`` 和 ``Fraction(42)`` " +"会被视为具有不同结果的不同调用。 相比之下,元组参数 ``('answer', Decimal(42))`` 和 ``('answer', " +"Fraction(42))`` 则会被视为是等同的。" + +#: ../../library/functools.rst:194 +msgid "" +"The wrapped function is instrumented with a :func:`!cache_parameters` " +"function that returns a new :class:`dict` showing the values for *maxsize* " +"and *typed*. This is for information purposes only. Mutating the values " +"has no effect." +msgstr "" +"被包装的函数配有一个 :func:`!cache_parameters` 函数,它返回一个新的 :class:`dict` 用来显示 *maxsize*" +" 和 *typed* 的值。这只是出于显示信息的目的。改变这些值没有任何效果。" + +#: ../../library/functools.rst:202 +msgid "" +"To help measure the effectiveness of the cache and tune the *maxsize* " +"parameter, the wrapped function is instrumented with a :func:`!cache_info` " +"function that returns a :term:`named tuple` showing *hits*, *misses*, " +"*maxsize* and *currsize*." +msgstr "" +"为了帮助衡量缓存的有效性以及调整 *maxsize* 形参,被包装的函数会带有一个 :func:`!cache_info` 函数,它返回一个 " +":term:`named tuple` 以显示 *hits*、 *misses*、 *maxsize* 和 *currsize*。" + +#: ../../library/functools.rst:210 +msgid "" +"The decorator also provides a :func:`!cache_clear` function for clearing or " +"invalidating the cache." +msgstr "该装饰器也提供了一个用于清理/使缓存失效的函数 :func:`!cache_clear`。" + +#: ../../library/functools.rst:213 +msgid "" +"The original underlying function is accessible through the " +":attr:`__wrapped__` attribute. This is useful for introspection, for " +"bypassing the cache, or for rewrapping the function with a different cache." +msgstr "" +"原始的未经装饰的函数可以通过 :attr:`__wrapped__` 属性访问。它可以用于检查、绕过缓存,或使用不同的缓存再次装饰原始函数。" + +#: ../../library/functools.rst:217 +msgid "" +"The cache keeps references to the arguments and return values until they age" +" out of the cache or until the cache is cleared." +msgstr "缓存会保持对参数和返回值的引用,直到它们结束生命期退出缓存或者直到缓存被清空。" + +#: ../../library/functools.rst:220 +msgid "" +"If a method is cached, the ``self`` instance argument is included in the " +"cache. See :ref:`faq-cache-method-calls`" +msgstr "如果一个方法被缓存,则 ``self`` 实例参数会被包括在缓存中。请参阅 :ref:`faq-cache-method-calls`" + +#: ../../library/functools.rst:223 +msgid "" +"An `LRU (least recently used) cache " +"`_" +" works best when the most recent calls are the best predictors of upcoming " +"calls (for example, the most popular articles on a news server tend to " +"change each day). The cache's size limit assures that the cache does not " +"grow without bound on long-running processes such as web servers." +msgstr "" +"`LRU (least recently used) 缓存 " +"`_" +" 在最近的调用是即将到来的调用的最佳预测值时性能最好 (例如,新闻服务器上的最热门文章倾向于每天发生变化)。 " +"缓存的大小限制可确保缓存不会在长期运行的进程如 web 服务器上无限制地增长。" + +#: ../../library/functools.rst:230 +msgid "" +"In general, the LRU cache should only be used when you want to reuse " +"previously computed values. Accordingly, it doesn't make sense to cache " +"functions with side-effects, functions that need to create distinct mutable " +"objects on each call (such as generators and async functions), or impure " +"functions such as time() or random()." +msgstr "" +"一般来说,LRU 缓存只应在你需要重复使用先前计算的值时使用。 " +"因此,缓存有附带影响的函数、每次调用都需要创建不同的可变对象的函数(如生成器和异步函数)或不纯的函数如 time() 或 random() " +"等是没有意义的。" + +#: ../../library/functools.rst:236 +msgid "Example of an LRU cache for static web content::" +msgstr "静态 Web 内容的 LRU 缓存示例::" + +#: ../../library/functools.rst:238 +msgid "" +"@lru_cache(maxsize=32)\n" +"def get_pep(num):\n" +" 'Retrieve text of a Python Enhancement Proposal'\n" +" resource = f'https://peps.python.org/pep-{num:04d}'\n" +" try:\n" +" with urllib.request.urlopen(resource) as s:\n" +" return s.read()\n" +" except urllib.error.HTTPError:\n" +" return 'Not Found'\n" +"\n" +">>> for n in 8, 290, 308, 320, 8, 218, 320, 279, 289, 320, 9991:\n" +"... pep = get_pep(n)\n" +"... print(n, len(pep))\n" +"\n" +">>> get_pep.cache_info()\n" +"CacheInfo(hits=3, misses=8, maxsize=32, currsize=8)" +msgstr "" +"@lru_cache(maxsize=32)\n" +"def get_pep(num):\n" +" 'Retrieve text of a Python Enhancement Proposal'\n" +" resource = f'https://peps.python.org/pep-{num:04d}'\n" +" try:\n" +" with urllib.request.urlopen(resource) as s:\n" +" return s.read()\n" +" except urllib.error.HTTPError:\n" +" return 'Not Found'\n" +"\n" +">>> for n in 8, 290, 308, 320, 8, 218, 320, 279, 289, 320, 9991:\n" +"... pep = get_pep(n)\n" +"... print(n, len(pep))\n" +"\n" +">>> get_pep.cache_info()\n" +"CacheInfo(hits=3, misses=8, maxsize=32, currsize=8)" + +#: ../../library/functools.rst:255 +msgid "" +"Example of efficiently computing `Fibonacci numbers " +"`_ using a cache to " +"implement a `dynamic programming " +"`_ technique::" +msgstr "" +"以下是使用缓存通过 `动态规划 `_ 计算 `斐波那契数列 " +"`_ 的例子::" + +#: ../../library/functools.rst:261 +msgid "" +"@lru_cache(maxsize=None)\n" +"def fib(n):\n" +" if n < 2:\n" +" return n\n" +" return fib(n-1) + fib(n-2)\n" +"\n" +">>> [fib(n) for n in range(16)]\n" +"[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]\n" +"\n" +">>> fib.cache_info()\n" +"CacheInfo(hits=28, misses=16, maxsize=None, currsize=16)" +msgstr "" +"@lru_cache(maxsize=None)\n" +"def fib(n):\n" +" if n < 2:\n" +" return n\n" +" return fib(n-1) + fib(n-2)\n" +"\n" +">>> [fib(n) for n in range(16)]\n" +"[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]\n" +"\n" +">>> fib.cache_info()\n" +"CacheInfo(hits=28, misses=16, maxsize=None, currsize=16)" + +#: ../../library/functools.rst:275 +msgid "Added the *typed* option." +msgstr "添加 *typed* 选项。" + +#: ../../library/functools.rst:278 +msgid "Added the *user_function* option." +msgstr "添加了 *user_function* 选项。" + +#: ../../library/functools.rst:281 +msgid "Added the function :func:`!cache_parameters`" +msgstr "增加了 :func:`!cache_parameters` 函数" + +#: ../../library/functools.rst:286 +msgid "" +"Given a class defining one or more rich comparison ordering methods, this " +"class decorator supplies the rest. This simplifies the effort involved in " +"specifying all of the possible rich comparison operations:" +msgstr "给定一个声明一个或多个全比较排序方法的类,这个类装饰器实现剩余的方法。这减轻了指定所有可能的全比较操作的工作。" + +#: ../../library/functools.rst:290 +msgid "" +"The class must define one of :meth:`~object.__lt__`, :meth:`~object.__le__`," +" :meth:`~object.__gt__`, or :meth:`~object.__ge__`. In addition, the class " +"should supply an :meth:`~object.__eq__` method." +msgstr "" +"该类必须定义以下比较方法之一::meth:`~object.__lt__` (小于) 、:meth:`~object.__le__` " +"(小于等于)、:meth:`~object.__gt__` (大于) 或 :meth:`~object.__ge__` (大于等于)。此外,该类还应提供" +" :meth:`~object.__eq__` (等于) 方法。" + +#: ../../library/functools.rst:296 +msgid "" +"@total_ordering\n" +"class Student:\n" +" def _is_valid_operand(self, other):\n" +" return (hasattr(other, \"lastname\") and\n" +" hasattr(other, \"firstname\"))\n" +" def __eq__(self, other):\n" +" if not self._is_valid_operand(other):\n" +" return NotImplemented\n" +" return ((self.lastname.lower(), self.firstname.lower()) ==\n" +" (other.lastname.lower(), other.firstname.lower()))\n" +" def __lt__(self, other):\n" +" if not self._is_valid_operand(other):\n" +" return NotImplemented\n" +" return ((self.lastname.lower(), self.firstname.lower()) <\n" +" (other.lastname.lower(), other.firstname.lower()))" +msgstr "" +"@total_ordering\n" +"class Student:\n" +" def _is_valid_operand(self, other):\n" +" return (hasattr(other, \"lastname\") and\n" +" hasattr(other, \"firstname\"))\n" +" def __eq__(self, other):\n" +" if not self._is_valid_operand(other):\n" +" return NotImplemented\n" +" return ((self.lastname.lower(), self.firstname.lower()) ==\n" +" (other.lastname.lower(), other.firstname.lower()))\n" +" def __lt__(self, other):\n" +" if not self._is_valid_operand(other):\n" +" return NotImplemented\n" +" return ((self.lastname.lower(), self.firstname.lower()) <\n" +" (other.lastname.lower(), other.firstname.lower()))" + +#: ../../library/functools.rst:314 +msgid "" +"While this decorator makes it easy to create well behaved totally ordered " +"types, it *does* come at the cost of slower execution and more complex stack" +" traces for the derived comparison methods. If performance benchmarking " +"indicates this is a bottleneck for a given application, implementing all six" +" rich comparison methods instead is likely to provide an easy speed boost." +msgstr "" +"虽然此装饰器使得创建具有良好行为的完全有序类型变得非常容易,但它 *确实* 是以执行速度更缓慢和派生比较方法的堆栈回溯更复杂为代价的。 " +"如果性能基准测试表明这是特定应用的瓶颈所在,则改为实现全部六个富比较方法应该会轻松提升速度。" + +#: ../../library/functools.rst:323 +msgid "" +"This decorator makes no attempt to override methods that have been declared " +"in the class *or its superclasses*. Meaning that if a superclass defines a " +"comparison operator, *total_ordering* will not implement it again, even if " +"the original method is abstract." +msgstr "" +"这个装饰器不会尝试重写类 *或其上级类* 中已经被声明的方法。这意味着如果某个上级类定义了比较运算符,则 *total_ordering* " +"将不会再次实现它,即使原方法是抽象方法。" + +#: ../../library/functools.rst:330 +msgid "" +"Returning ``NotImplemented`` from the underlying comparison function for " +"unrecognised types is now supported." +msgstr "现在已支持从未识别类型的下层比较函数返回 ``NotImplemented``。" + +#: ../../library/functools.rst:336 +msgid "" +"A singleton object used as a sentinel to reserve a place for positional " +"arguments when calling :func:`partial` and :func:`partialmethod`." +msgstr "一个单例对象,在调用 :func:`partial` 和 :func:`partialmethod` 时被用作给位置参数保留位置的哨兵值。" + +#: ../../library/functools.rst:344 +msgid "" +"Return a new :ref:`partial object` which when called will " +"behave like *func* called with the positional arguments *args* and keyword " +"arguments *keywords*. If more arguments are supplied to the call, they are " +"appended to *args*. If additional keyword arguments are supplied, they " +"extend and override *keywords*. Roughly equivalent to::" +msgstr "" +"返回一个新的 :ref:`部分对象`,当被调用时其行为类似于 *func* 附带位置参数 *args* 和关键字参数 " +"*keywords* 被调用。如果为调用提供了更多的参数,它们会被附加到 *args*。如果提供了额外的关键字参数,它们会扩展并重写 " +"*keywords*。大致等价于::" + +#: ../../library/functools.rst:351 +msgid "" +"def partial(func, /, *args, **keywords):\n" +" def newfunc(*more_args, **more_keywords):\n" +" return func(*args, *more_args, **(keywords | more_keywords))\n" +" newfunc.func = func\n" +" newfunc.args = args\n" +" newfunc.keywords = keywords\n" +" return newfunc" +msgstr "" +"def partial(func, /, *args, **keywords):\n" +" def newfunc(*more_args, **more_keywords):\n" +" return func(*args, *more_args, **(keywords | more_keywords))\n" +" newfunc.func = func\n" +" newfunc.args = args\n" +" newfunc.keywords = keywords\n" +" return newfunc" + +#: ../../library/functools.rst:359 +msgid "" +"The :func:`!partial` function is used for partial function application which" +" \"freezes\" some portion of a function's arguments and/or keywords " +"resulting in a new object with a simplified signature. For example, " +":func:`partial` can be used to create a callable that behaves like the " +":func:`int` function where the *base* argument defaults to ``2``:" +msgstr "" +":func:`!partial` 被用于部分函数应用,它“冻结”一部分函数的参数和/或关键字从而得到一个具有简化签名的新对象。 " +"例如,:func:`partial` 可被用来创建一个行为类似于 :func:`int` 函数的可调用对象,其中 *base* 参数默认值为 " +"``2``:" + +#: ../../library/functools.rst:365 +msgid "" +">>> basetwo = partial(int, base=2)\n" +">>> basetwo.__doc__ = 'Convert base 2 string to an int.'\n" +">>> basetwo('10010')\n" +"18" +msgstr "" +">>> basetwo = partial(int, base=2)\n" +">>> basetwo.__doc__ = 'Convert base 2 string to an int.'\n" +">>> basetwo('10010')\n" +"18" + +#: ../../library/functools.rst:372 +msgid "" +"If :data:`Placeholder` sentinels are present in *args*, they will be filled " +"first when :func:`!partial` is called. This makes it possible to pre-fill " +"any positional argument with a call to :func:`!partial`; without " +":data:`!Placeholder`, only the chosen number of leading positional arguments" +" can be pre-filled." +msgstr "" +"如果 :data:`Placeholder` 哨兵出现在 *args* 中,它们将在调用 :func:`!partial` 时首先被填充。 " +"这使得通过调用 :func:`!partial` 来预先填充任何位置参数成为可能;如果没有 " +":data:`!Placeholder`,则只能预填充选定数量的前导位置参数。" + +#: ../../library/functools.rst:377 +msgid "" +"If any :data:`!Placeholder` sentinels are present, all must be filled at " +"call time:" +msgstr "如果有任何 :data:`!Placeholder` 哨兵存在,则必须在调用时填充所有哨兵:" + +#: ../../library/functools.rst:379 +msgid "" +">>> say_to_world = partial(print, Placeholder, Placeholder, \"world!\")\n" +">>> say_to_world('Hello', 'dear')\n" +"Hello dear world!" +msgstr "" +">>> say_to_world = partial(print, Placeholder, Placeholder, \"world!\")\n" +">>> say_to_world('Hello', 'dear')\n" +"Hello dear world!" + +#: ../../library/functools.rst:385 +msgid "" +"Calling ``say_to_world('Hello')`` raises a :exc:`TypeError`, because only " +"one positional argument is provided, but there are two placeholders that " +"must be filled in." +msgstr "" +"调用 ``say_to_world('Hello')`` 会引发 :exc:`TypeError`,因为只提供了一个位置参数,但有两个必须填充的占位符。" + +#: ../../library/functools.rst:389 +msgid "" +"If :func:`!partial` is applied to an existing :func:`!partial` object, " +":data:`!Placeholder` sentinels of the input object are filled in with new " +"positional arguments. A placeholder can be retained by inserting a new " +":data:`!Placeholder` sentinel to the place held by a previous " +":data:`!Placeholder`:" +msgstr "" +"如果 :func:`!partial` 应用于现有的 :func:`!partial` 对象,则输入对象的 :data:`!Placeholder` " +"哨兵将使用新的位置参数填充。通过在前一个 :data:`!Placeholder` 所占的位置插入一个新的 :data:`!Placeholder` " +"哨兵,可以保留占位符:" + +#: ../../library/functools.rst:395 +msgid "" +">>> from functools import partial, Placeholder as _\n" +">>> remove = partial(str.replace, _, _, '')\n" +">>> message = 'Hello, dear dear world!'\n" +">>> remove(message, ' dear')\n" +"'Hello, world!'\n" +">>> remove_dear = partial(remove, _, ' dear')\n" +">>> remove_dear(message)\n" +"'Hello, world!'\n" +">>> remove_first_dear = partial(remove_dear, _, 1)\n" +">>> remove_first_dear(message)\n" +"'Hello, dear world!'" +msgstr "" +">>> from functools import partial, Placeholder as _\n" +">>> remove = partial(str.replace, _, _, '')\n" +">>> message = 'Hello, dear dear world!'\n" +">>> remove(message, ' dear')\n" +"'Hello, world!'\n" +">>> remove_dear = partial(remove, _, ' dear')\n" +">>> remove_dear(message)\n" +"'Hello, world!'\n" +">>> remove_first_dear = partial(remove_dear, _, 1)\n" +">>> remove_first_dear(message)\n" +"'Hello, dear world!'" + +#: ../../library/functools.rst:409 +msgid "" +":data:`!Placeholder` cannot be passed to :func:`!partial` as a keyword " +"argument." +msgstr ":data:`!Placeholder` 不能作为关键字参数传递给 :func:`!partial`。" + +#: ../../library/functools.rst:411 +msgid "Added support for :data:`Placeholder` in positional arguments." +msgstr "增加了对位置参数 :data:`Placeholder` 的支持。" + +#: ../../library/functools.rst:416 +msgid "" +"Return a new :class:`partialmethod` descriptor which behaves like " +":class:`partial` except that it is designed to be used as a method " +"definition rather than being directly callable." +msgstr "" +"返回一个新的 :class:`partialmethod` 描述器,其行为类似 :class:`partial` " +"但它被设计用作方法定义而非直接用作可调用对象。" + +#: ../../library/functools.rst:420 +msgid "" +"*func* must be a :term:`descriptor` or a callable (objects which are both, " +"like normal functions, are handled as descriptors)." +msgstr "*func* 必须是一个 :term:`descriptor` 或可调用对象(同属两者的对象例如普通函数会被当作描述器来处理)。" + +#: ../../library/functools.rst:423 +msgid "" +"When *func* is a descriptor (such as a normal Python function, " +":func:`classmethod`, :func:`staticmethod`, :func:`~abc.abstractmethod` or " +"another instance of :class:`partialmethod`), calls to ``__get__`` are " +"delegated to the underlying descriptor, and an appropriate :ref:`partial " +"object` returned as the result." +msgstr "" +"当 *func* 是一个描述器(例如普通 Python 函数,:func:`classmethod`、 :func:`staticmethod`、 " +":func:`~abc.abstractmethod` 或其他 :class:`partialmethod` 的实例)时,对 ``__get__`` " +"的调用会被委托给底层的描述器,并会返回一个适当的 :ref:`部分对象 ` 作为结果。" + +#: ../../library/functools.rst:429 +msgid "" +"When *func* is a non-descriptor callable, an appropriate bound method is " +"created dynamically. This behaves like a normal Python function when used as" +" a method: the *self* argument will be inserted as the first positional " +"argument, even before the *args* and *keywords* supplied to the " +":class:`partialmethod` constructor." +msgstr "" +"当 *func* 是一个非描述器类可调用对象时,则会动态创建一个适当的绑定方法。当用作方法时其行为类似普通 Python 函数:将会插入 *self* " +"参数作为第一个位置参数,其位置甚至会处于提供给 :class:`partialmethod` 构造器的 *args* 和 *keywords* 之前。" + +#: ../../library/functools.rst:437 +msgid "" +">>> class Cell:\n" +"... def __init__(self):\n" +"... self._alive = False\n" +"... @property\n" +"... def alive(self):\n" +"... return self._alive\n" +"... def set_state(self, state):\n" +"... self._alive = bool(state)\n" +"... set_alive = partialmethod(set_state, True)\n" +"... set_dead = partialmethod(set_state, False)\n" +"...\n" +">>> c = Cell()\n" +">>> c.alive\n" +"False\n" +">>> c.set_alive()\n" +">>> c.alive\n" +"True" +msgstr "" +">>> class Cell:\n" +"... def __init__(self):\n" +"... self._alive = False\n" +"... @property\n" +"... def alive(self):\n" +"... return self._alive\n" +"... def set_state(self, state):\n" +"... self._alive = bool(state)\n" +"... set_alive = partialmethod(set_state, True)\n" +"... set_dead = partialmethod(set_state, False)\n" +"...\n" +">>> c = Cell()\n" +">>> c.alive\n" +"False\n" +">>> c.set_alive()\n" +">>> c.alive\n" +"True" + +#: ../../library/functools.rst:460 +msgid "" +"Apply *function* of two arguments cumulatively to the items of *iterable*, " +"from left to right, so as to reduce the iterable to a single value. For " +"example, ``reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])`` calculates " +"``((((1+2)+3)+4)+5)``. The left argument, *x*, is the accumulated value and " +"the right argument, *y*, is the update value from the *iterable*. If the " +"optional *initial* is present, it is placed before the items of the iterable" +" in the calculation, and serves as a default when the iterable is empty. If" +" *initial* is not given and *iterable* contains only one item, the first " +"item is returned." +msgstr "" +"将两个参数的 *function* 从左至右累积地应用到 *iterable* 的条目,以便将该可迭代对象缩减为单个值。 " +"例如,``reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])`` 就是计算 ``((((1+2)+3)+4)+5)``。" +" 左边的参数 *x* 是累积的值而右边的参数 *y* 则是来自 *iterable* 的更新值。如果存在可选项 " +"*initial*,它会被放在参与计算的可迭代对象的条目之前,并在可迭代对象为空时作为默认值。如果未给出 *initial* 并且 *iterable*" +" 仅包含一个条目,则将返回第一项。" + +#: ../../library/functools.rst:469 +msgid "Roughly equivalent to::" +msgstr "大致相当于::" + +#: ../../library/functools.rst:471 +msgid "" +"initial_missing = sentinel('initial_missing')\n" +"\n" +"def reduce(function, iterable, /, initial=initial_missing):\n" +" it = iter(iterable)\n" +" if initial is initial_missing:\n" +" value = next(it)\n" +" else:\n" +" value = initial\n" +" for element in it:\n" +" value = function(value, element)\n" +" return value" +msgstr "" + +#: ../../library/functools.rst:483 +msgid "" +"See :func:`itertools.accumulate` for an iterator that yields all " +"intermediate values." +msgstr "请参阅 :func:`itertools.accumulate` 了解有关可产生所有中间值的迭代器。" + +#: ../../library/functools.rst:486 +msgid "*initial* is now supported as a keyword argument." +msgstr "现在支持 *initial* 作为关键字参数。" + +#: ../../library/functools.rst:491 +msgid "" +"Transform a function into a :term:`single-dispatch ` " +":term:`generic function`." +msgstr "将一个函数转换为 :term:`单分派 ` :term:`generic function`。" + +#: ../../library/functools.rst:494 +msgid "" +"To define a generic function, decorate it with the ``@singledispatch`` " +"decorator. When defining a function using ``@singledispatch``, note that the" +" dispatch happens on the type of the first argument::" +msgstr "" +"要定义一个泛型函数,用装饰器 ``@singledispatch`` 来装饰它。当使用 ``@singledispatch`` " +"定义一个函数时,请注意调度发生在第一个参数的类型上::" + +#: ../../library/functools.rst:498 +msgid "" +">>> from functools import singledispatch\n" +">>> @singledispatch\n" +"... def fun(arg, verbose=False):\n" +"... if verbose:\n" +"... print(\"Let me just say,\", end=\" \")\n" +"... print(arg)" +msgstr "" +">>> from functools import singledispatch\n" +">>> @singledispatch\n" +"... def fun(arg, verbose=False):\n" +"... if verbose:\n" +"... print(\"Let me just say,\", end=\" \")\n" +"... print(arg)" + +#: ../../library/functools.rst:508 +msgid "" +"To add overloaded implementations to the function, use the :func:`!register`" +" attribute of the generic function, which can be used as a decorator. For " +"functions annotated with types, the decorator will infer the type of the " +"first argument automatically::" +msgstr "" +"要将重载的实现添加到函数中,请使用泛型函数的 :func:`!register` 属性,它可以被用作装饰器。 " +"对于带有类型标注的函数,该装饰器将自动推断第一个参数的类型::" + +#: ../../library/functools.rst:513 +msgid "" +">>> @fun.register\n" +"... def _(arg: int, verbose=False):\n" +"... if verbose:\n" +"... print(\"Strength in numbers, eh?\", end=\" \")\n" +"... print(arg)\n" +"...\n" +">>> @fun.register\n" +"... def _(arg: list, verbose=False):\n" +"... if verbose:\n" +"... print(\"Enumerate this:\")\n" +"... for i, elem in enumerate(arg):\n" +"... print(i, elem)" +msgstr "" +">>> @fun.register\n" +"... def _(arg: int, verbose=False):\n" +"... if verbose:\n" +"... print(\"Strength in numbers, eh?\", end=\" \")\n" +"... print(arg)\n" +"...\n" +">>> @fun.register\n" +"... def _(arg: list, verbose=False):\n" +"... if verbose:\n" +"... print(\"Enumerate this:\")\n" +"... for i, elem in enumerate(arg):\n" +"... print(i, elem)" + +#: ../../library/functools.rst:526 +msgid ":class:`typing.Union` can also be used::" +msgstr "还可以使用 :class:`typing.Union`::" + +#: ../../library/functools.rst:528 +msgid "" +">>> @fun.register\n" +"... def _(arg: int | float, verbose=False):\n" +"... if verbose:\n" +"... print(\"Strength in numbers, eh?\", end=\" \")\n" +"... print(arg)\n" +"...\n" +">>> from typing import Union\n" +">>> @fun.register\n" +"... def _(arg: Union[list, set], verbose=False):\n" +"... if verbose:\n" +"... print(\"Enumerate this:\")\n" +"... for i, elem in enumerate(arg):\n" +"... print(i, elem)\n" +"..." +msgstr "" +">>> @fun.register\n" +"... def _(arg: int | float, verbose=False):\n" +"... if verbose:\n" +"... print(\"Strength in numbers, eh?\", end=\" \")\n" +"... print(arg)\n" +"...\n" +">>> from typing import Union\n" +">>> @fun.register\n" +"... def _(arg: Union[list, set], verbose=False):\n" +"... if verbose:\n" +"... print(\"Enumerate this:\")\n" +"... for i, elem in enumerate(arg):\n" +"... print(i, elem)\n" +"..." + +#: ../../library/functools.rst:543 +msgid "" +"For code which doesn't use type annotations, the appropriate type argument " +"can be passed explicitly to the decorator itself::" +msgstr "对于不使用类型标注的代码,可以将适当的类型参数显式地传给装饰器本身::" + +#: ../../library/functools.rst:546 +msgid "" +">>> @fun.register(complex)\n" +"... def _(arg, verbose=False):\n" +"... if verbose:\n" +"... print(\"Better than complicated.\", end=\" \")\n" +"... print(arg.real, arg.imag)\n" +"..." +msgstr "" +">>> @fun.register(complex)\n" +"... def _(arg, verbose=False):\n" +"... if verbose:\n" +"... print(\"Better than complicated.\", end=\" \")\n" +"... print(arg.real, arg.imag)\n" +"..." + +#: ../../library/functools.rst:553 +msgid "" +"For code that dispatches on a collections type (e.g., ``list``), but wants " +"to typehint the items of the collection (e.g., ``list[int]``), the dispatch " +"type should be passed explicitly to the decorator itself with the typehint " +"going into the function definition::" +msgstr "" +"对于在多项集类型 (例如 ``list``) 上分派,但希望对多项集中的项设置类型提示 (例如 ``list[int]``) " +"的代码,分派类型应当被显式地传给装饰器本身并将类型提示放在函数定义中::" + +#: ../../library/functools.rst:558 +msgid "" +">>> @fun.register(list)\n" +"... def _(arg: list[int], verbose=False):\n" +"... if verbose:\n" +"... print(\"Enumerate this:\")\n" +"... for i, elem in enumerate(arg):\n" +"... print(i, elem)" +msgstr "" +">>> @fun.register(list)\n" +"... def _(arg: list[int], verbose=False):\n" +"... if verbose:\n" +"... print(\"Enumerate this:\")\n" +"... for i, elem in enumerate(arg):\n" +"... print(i, elem)" + +#: ../../library/functools.rst:567 +msgid "" +"At runtime the function will dispatch on an instance of a list regardless of" +" the type contained within the list i.e. ``[1,2,3]`` will be dispatched the " +"same as ``[\"foo\", \"bar\", \"baz\"]``. The annotation provided in this " +"example is for static type checkers only and has no runtime impact." +msgstr "" +"当运行时函数将在一个列表的实例上分派而不管列表中包含的类型是什么,也就是说 ``[1,2,3]`` 将以与 ``[\"foo\", \"bar\", " +"]`` 相同的方式分派。在本例中提供的标注仅针对静态类型检查器而在运行时没有影响。" + +#: ../../library/functools.rst:573 +msgid "" +"To enable registering :term:`lambdas` and pre-existing functions, " +"the :func:`~singledispatch.register` attribute can also be used in a " +"functional form::" +msgstr "" +"要启用注册 :term:`lambda ` 和现有的函数,也可以使用 :func:`~singledispatch.register` " +"属性的函数形式::" + +#: ../../library/functools.rst:576 +msgid "" +">>> def nothing(arg, verbose=False):\n" +"... print(\"Nothing.\")\n" +"...\n" +">>> fun.register(type(None), nothing)" +msgstr "" +">>> def nothing(arg, verbose=False):\n" +"... print(\"Nothing.\")\n" +"...\n" +">>> fun.register(type(None), nothing)" + +#: ../../library/functools.rst:581 +msgid "" +"The :func:`~singledispatch.register` attribute returns the undecorated " +"function. This enables decorator stacking, :mod:`pickling`, and the " +"creation of unit tests for each variant independently::" +msgstr "" +":func:`~singledispatch.register` 属性会返回未被装饰的函数。 " +"这将启用装饰器栈、:mod:`pickling`,并为每个变体单独创建单元测试::" + +#: ../../library/functools.rst:585 +msgid "" +">>> @fun.register(float)\n" +"... @fun.register(Decimal)\n" +"... def fun_num(arg, verbose=False):\n" +"... if verbose:\n" +"... print(\"Half of your number:\", end=\" \")\n" +"... print(arg / 2)\n" +"...\n" +">>> fun_num is fun\n" +"False" +msgstr "" +">>> @fun.register(float)\n" +"... @fun.register(Decimal)\n" +"... def fun_num(arg, verbose=False):\n" +"... if verbose:\n" +"... print(\"Half of your number:\", end=\" \")\n" +"... print(arg / 2)\n" +"...\n" +">>> fun_num is fun\n" +"False" + +#: ../../library/functools.rst:595 +msgid "" +"When called, the generic function dispatches on the type of the first " +"argument::" +msgstr "在调用时,泛型函数会根据第一个参数的类型进行分派::" + +#: ../../library/functools.rst:598 +msgid "" +">>> fun(\"Hello, world.\")\n" +"Hello, world.\n" +">>> fun(\"test.\", verbose=True)\n" +"Let me just say, test.\n" +">>> fun(42, verbose=True)\n" +"Strength in numbers, eh? 42\n" +">>> fun(['spam', 'spam', 'eggs', 'spam'], verbose=True)\n" +"Enumerate this:\n" +"0 spam\n" +"1 spam\n" +"2 eggs\n" +"3 spam\n" +">>> fun(None)\n" +"Nothing.\n" +">>> fun(1.23)\n" +"0.615" +msgstr "" +">>> fun(\"Hello, world.\")\n" +"Hello, world.\n" +">>> fun(\"test.\", verbose=True)\n" +"Let me just say, test.\n" +">>> fun(42, verbose=True)\n" +"Strength in numbers, eh? 42\n" +">>> fun(['spam', 'spam', 'eggs', 'spam'], verbose=True)\n" +"Enumerate this:\n" +"0 spam\n" +"1 spam\n" +"2 eggs\n" +"3 spam\n" +">>> fun(None)\n" +"Nothing.\n" +">>> fun(1.23)\n" +"0.615" + +#: ../../library/functools.rst:615 +msgid "" +"Where there is no registered implementation for a specific type, its method " +"resolution order is used to find a more generic implementation. The original" +" function decorated with ``@singledispatch`` is registered for the base " +":class:`object` type, which means it is used if no better implementation is " +"found." +msgstr "" +"在没有针对特定类型的已注册实现的情况下,会使用其方法解析顺序来查找更通用的实现。使用 ``@singledispatch`` 装饰的原始函数将为基本的 " +":class:`object` 类型进行注册,这意味着它将在找不到更好的实现时被使用。" + +#: ../../library/functools.rst:621 +msgid "" +"If an implementation is registered to an :term:`abstract base class`, " +"virtual subclasses of the base class will be dispatched to that " +"implementation::" +msgstr "如果一个实现被注册到 :term:`abstract base class`,则基类的虚拟子类将被分派到该实现::" + +#: ../../library/functools.rst:625 +msgid "" +">>> from collections.abc import Mapping\n" +">>> @fun.register\n" +"... def _(arg: Mapping, verbose=False):\n" +"... if verbose:\n" +"... print(\"Keys & Values\")\n" +"... for key, value in arg.items():\n" +"... print(key, \"=>\", value)\n" +"...\n" +">>> fun({\"a\": \"b\"})\n" +"a => b" +msgstr "" +">>> from collections.abc import Mapping\n" +">>> @fun.register\n" +"... def _(arg: Mapping, verbose=False):\n" +"... if verbose:\n" +"... print(\"Keys & Values\")\n" +"... for key, value in arg.items():\n" +"... print(key, \"=>\", value)\n" +"...\n" +">>> fun({\"a\": \"b\"})\n" +"a => b" + +#: ../../library/functools.rst:636 +msgid "" +"To check which implementation the generic function will choose for a given " +"type, use the ``dispatch()`` attribute::" +msgstr "要检查泛型函数将为给定的类型选择哪个实现,请使用 ``dispatch()`` 属性::" + +#: ../../library/functools.rst:639 +msgid "" +">>> fun.dispatch(float)\n" +"\n" +">>> fun.dispatch(dict) # note: default implementation\n" +"" +msgstr "" +">>> fun.dispatch(float)\n" +"\n" +">>> fun.dispatch(dict) # 注:默认实现\n" +"" + +#: ../../library/functools.rst:644 +msgid "" +"To access all registered implementations, use the read-only ``registry`` " +"attribute::" +msgstr "要访问所有已注册实现,请使用只读的 ``registry`` 属性::" + +#: ../../library/functools.rst:647 +msgid "" +">>> fun.registry.keys()\n" +"dict_keys([, , ,\n" +" , ,\n" +" ])\n" +">>> fun.registry[float]\n" +"\n" +">>> fun.registry[object]\n" +"" +msgstr "" +">>> fun.registry.keys()\n" +"dict_keys([, , ,\n" +" , ,\n" +" ])\n" +">>> fun.registry[float]\n" +"\n" +">>> fun.registry[object]\n" +"" + +#: ../../library/functools.rst:658 +msgid "" +"The :func:`~singledispatch.register` attribute now supports using type " +"annotations." +msgstr ":func:`~singledispatch.register` 属性现在支持使用类型注解。" + +#: ../../library/functools.rst:661 +msgid "" +"The :func:`~singledispatch.register` attribute now supports " +":class:`typing.Union` as a type annotation." +msgstr ":func:`~singledispatch.register` 属性现在支持 :class:`typing.Union` 作为类型注解。" + +#: ../../library/functools.rst:668 +msgid "" +"Transform a method into a :term:`single-dispatch ` " +":term:`generic function`." +msgstr "将一个方法转换为 :term:`单分派 ` :term:`generic function`。" + +#: ../../library/functools.rst:671 +msgid "" +"To define a generic method, decorate it with the ``@singledispatchmethod`` " +"decorator. When defining a method using ``@singledispatchmethod``, note that" +" the dispatch happens on the type of the first non-*self* or non-*cls* " +"argument::" +msgstr "" +"要定义一个泛型方法,请用 ``@singledispatchmethod`` 装饰器来装饰它。当定义使用 " +"``@singledispatchmethod`` 的方法时,请注意操作将针对第一个非 *self* 或非 *cls* 参数的类型::" + +#: ../../library/functools.rst:676 +msgid "" +"class Negator:\n" +" @singledispatchmethod\n" +" def neg(self, arg):\n" +" raise NotImplementedError(\"Cannot negate a\")\n" +"\n" +" @neg.register\n" +" def _(self, arg: int):\n" +" return -arg\n" +"\n" +" @neg.register\n" +" def _(self, arg: bool):\n" +" return not arg" +msgstr "" +"class Negator:\n" +" @singledispatchmethod\n" +" def neg(self, arg):\n" +" raise NotImplementedError(\"Cannot negate a\")\n" +"\n" +" @neg.register\n" +" def _(self, arg: int):\n" +" return -arg\n" +"\n" +" @neg.register\n" +" def _(self, arg: bool):\n" +" return not arg" + +#: ../../library/functools.rst:689 +msgid "" +"``@singledispatchmethod`` supports nesting with other decorators such as " +":deco:`classmethod`. Note that to allow for ``dispatcher.register``, " +"``singledispatchmethod`` must be the *outer most* decorator. Here is the " +"``Negator`` class with the ``neg`` methods bound to the class, rather than " +"an instance of the class::" +msgstr "" +"``@singledispatchmethod`` 支持与其他装饰器如 :deco:`classmethod` 相嵌套。请注意为了允许 " +"``dispatcher.register``,``singledispatchmethod`` 必须是 *最外层的* 装饰器。下面的 " +"``Negator`` 类具有绑定到类的 ``neg`` 方法,而不是绑定到类的实例::" + +#: ../../library/functools.rst:695 +msgid "" +"class Negator:\n" +" @singledispatchmethod\n" +" @classmethod\n" +" def neg(cls, arg):\n" +" raise NotImplementedError(\"Cannot negate a\")\n" +"\n" +" @neg.register\n" +" @classmethod\n" +" def _(cls, arg: int):\n" +" return -arg\n" +"\n" +" @neg.register\n" +" @classmethod\n" +" def _(cls, arg: bool):\n" +" return not arg" +msgstr "" +"class Negator:\n" +" @singledispatchmethod\n" +" @classmethod\n" +" def neg(cls, arg):\n" +" raise NotImplementedError(\"Cannot negate a\")\n" +"\n" +" @neg.register\n" +" @classmethod\n" +" def _(cls, arg: int):\n" +" return -arg\n" +"\n" +" @neg.register\n" +" @classmethod\n" +" def _(cls, arg: bool):\n" +" return not arg" + +#: ../../library/functools.rst:711 +msgid "" +"The same pattern can be used for other similar decorators: " +":deco:`staticmethod`, :deco:`~abc.abstractmethod`, and others." +msgstr "" +"同样的模式也可被用于其他类似的装饰器::deco:`staticmethod`, :deco:`~abc.abstractmethod` 等等。" + +#: ../../library/functools.rst:716 +msgid "Added support of non-:term:`descriptor` callables." +msgstr "" + +#: ../../library/functools.rst:722 +msgid "" +"Update a *wrapper* function to look like the *wrapped* function. The " +"optional arguments are tuples to specify which attributes of the original " +"function are assigned directly to the matching attributes on the wrapper " +"function and which attributes of the wrapper function are updated with the " +"corresponding attributes from the original function. The default values for " +"these arguments are the module level constants ``WRAPPER_ASSIGNMENTS`` " +"(which assigns to the wrapper function's :attr:`~function.__module__`, " +":attr:`~function.__name__`, :attr:`~function.__qualname__`, " +":attr:`~function.__annotations__`, :attr:`~function.__type_params__`, and " +":attr:`~function.__doc__`, the documentation string) and ``WRAPPER_UPDATES``" +" (which updates the wrapper function's :attr:`~function.__dict__`, i.e. the " +"instance dictionary)." +msgstr "" +"更新一个 *包装器* 函数以使其与 *被包装的* 函数相似。 " +"可选参数为指明原函数的哪些属性要被直接赋值给包装器函数的相匹配属性的元组以及包装器的哪些属性要使用原函数的相应属性来更新。这些参数的默认值是模块级常量 " +"``WRAPPER_ASSIGNMENTS`` (它将被赋值给包装器函数的 :attr:`~function.__module__`, " +":attr:`~function.__name__`, :attr:`~function.__qualname__`, " +":attr:`~function.__annotations__`, :attr:`~function.__type_params__` 和 " +":attr:`~function.__doc__`,即文档字符串) 以及 ``WRAPPER_UPDATES`` (它将更新包装器函数的 " +":attr:`~function.__dict__`,即实例字典)。" + +#: ../../library/functools.rst:734 +msgid "" +"To allow access to the original function for introspection and other " +"purposes (e.g. bypassing a caching decorator such as :func:`lru_cache`), " +"this function automatically adds a ``__wrapped__`` attribute to the wrapper " +"that refers to the function being wrapped." +msgstr "" +"为了允许出于内省和其他目的访问原始函数(例如绕过 :func:`lru_cache` 之类的缓存装饰器),此函数会自动为 wrapper " +"添加一个指向被包装函数的 ``__wrapped__`` 属性。" + +#: ../../library/functools.rst:739 +msgid "" +"The main intended use for this function is in :term:`decorator` functions " +"which wrap the decorated function and return the wrapper. If the wrapper " +"function is not updated, the metadata of the returned function will reflect " +"the wrapper definition rather than the original function definition, which " +"is typically less than helpful." +msgstr "" +"此函数的主要目的是在 :term:`decorator` 函数中用来包装被装饰的函数并返回包装器。 " +"如果包装器函数未被更新,则被返回函数的元数据将反映包装器定义而不是原始函数定义,这通常没有什么用处。" + +#: ../../library/functools.rst:745 +msgid "" +":func:`update_wrapper` may be used with callables other than functions. Any " +"attributes named in *assigned* or *updated* that are missing from the object" +" being wrapped are ignored (i.e. this function will not attempt to set them " +"on the wrapper function). :exc:`AttributeError` is still raised if the " +"wrapper function itself is missing any attributes named in *updated*." +msgstr "" +":func:`update_wrapper` 可以与函数之外的可调用对象一同使用。在 *assigned* 或 *updated* " +"中命名的任何属性如果不存在于被包装对象则会被忽略(即该函数将不会尝试在包装器函数上设置它们)。如果包装器函数自身缺少在 *updated* " +"中命名的任何属性则仍将引发 :exc:`AttributeError`。" + +#: ../../library/functools.rst:751 +msgid "" +"The ``__wrapped__`` attribute is now automatically added. The " +":attr:`~function.__annotations__` attribute is now copied by default. " +"Missing attributes no longer trigger an :exc:`AttributeError`." +msgstr "" +"现在 ``__wrapped__`` 属性会被自动添加。现在 :attr:`~function.__annotations__` 属性默认会被拷贝。 " +"缺失的属性不会再触发 :exc:`AttributeError`。" + +#: ../../library/functools.rst:756 +msgid "" +"The ``__wrapped__`` attribute now always refers to the wrapped function, " +"even if that function defined a ``__wrapped__`` attribute. (see " +":issue:`17482`)" +msgstr "" +"``__wrapped__`` 属性现在总是指向被包装的函数,即使该函数定义了 ``__wrapped__`` 属性。 (参见 " +":issue:`17482`)" + +#: ../../library/functools.rst:761 +msgid "" +"The :attr:`~function.__type_params__` attribute is now copied by default." +msgstr "现在 :attr:`~function.__type_params__` 属性默认会被拷贝。" + +#: ../../library/functools.rst:767 +msgid "" +"This is a convenience function for invoking :func:`update_wrapper` as a " +"function decorator when defining a wrapper function. It is equivalent to " +"``partial(update_wrapper, wrapped=wrapped, assigned=assigned, " +"updated=updated)``. For example::" +msgstr "" +"这是一个便捷函数,用于在定义包装器函数时调用 :func:`update_wrapper` 作为函数装饰器。它等价于 " +"``partial(update_wrapper, wrapped=wrapped, assigned=assigned, " +"updated=updated)``。例如::" + +#: ../../library/functools.rst:772 +msgid "" +">>> from functools import wraps\n" +">>> def my_decorator(f):\n" +"... @wraps(f)\n" +"... def wrapper(*args, **kwds):\n" +"... print('Calling decorated function')\n" +"... return f(*args, **kwds)\n" +"... return wrapper\n" +"...\n" +">>> @my_decorator\n" +"... def example():\n" +"... \"\"\"Docstring\"\"\"\n" +"... print('Called example function')\n" +"...\n" +">>> example()\n" +"Calling decorated function\n" +"Called example function\n" +">>> example.__name__\n" +"'example'\n" +">>> example.__doc__\n" +"'Docstring'" +msgstr "" +">>> from functools import wraps\n" +">>> def my_decorator(f):\n" +"... @wraps(f)\n" +"... def wrapper(*args, **kwds):\n" +"... print('Calling decorated function')\n" +"... return f(*args, **kwds)\n" +"... return wrapper\n" +"...\n" +">>> @my_decorator\n" +"... def example():\n" +"... \"\"\"Docstring\"\"\"\n" +"... print('Called example function')\n" +"...\n" +">>> example()\n" +"Calling decorated function\n" +"Called example function\n" +">>> example.__name__\n" +"'example'\n" +">>> example.__doc__\n" +"'Docstring'" + +#: ../../library/functools.rst:793 +msgid "" +"Without the use of this decorator factory, the name of the example function " +"would have been ``'wrapper'``, and the docstring of the original " +":func:`!example` would have been lost." +msgstr "" +"如果不使用这个装饰器工厂函数,则 example 函数的名称将变为 ``'wrapper'``,并且 :func:`!example` " +"原本的文档字符串将会丢失。" + +#: ../../library/functools.rst:801 +msgid ":class:`partial` Objects" +msgstr ":class:`partial` 对象" + +#: ../../library/functools.rst:803 +msgid "" +":class:`partial` objects are callable objects created by :func:`partial`. " +"They have three read-only attributes:" +msgstr ":class:`partial` 对象是由 :func:`partial` 创建的可调用对象。它们具有三个只读属性:" + +#: ../../library/functools.rst:809 +msgid "" +"A callable object or function. Calls to the :class:`partial` object will be" +" forwarded to :attr:`func` with new arguments and keywords." +msgstr "一个可调用对象或函数。对 :class:`partial` 对象的调用将被转发给 :attr:`func` 并附带新的参数和关键字。" + +#: ../../library/functools.rst:815 +msgid "" +"The leftmost positional arguments that will be prepended to the positional " +"arguments provided to a :class:`partial` object call." +msgstr "最左边的位置参数将放置在提供给 :class:`partial` 对象调用的位置参数之前。" + +#: ../../library/functools.rst:821 +msgid "" +"The keyword arguments that will be supplied when the :class:`partial` object" +" is called." +msgstr "当调用 :class:`partial` 对象时将要提供的关键字参数。" + +#: ../../library/functools.rst:824 +msgid "" +":class:`partial` objects are like :ref:`function objects ` in that they are callable, weak referenceable, and can have " +"attributes. There are some important differences. For instance, the " +":attr:`~definition.__name__` and :attr:`~definition.__doc__` attributes are " +"not created automatically." +msgstr "" +":class:`partial` 对象与 :ref:`函数对象 ` " +"的类似之处在于它们都是可调用、可弱引用并可具有属性的。 但两者也存在一些重要的区别。 例如,:attr:`~definition.__name__` 和" +" :attr:`~definition.__doc__` 属性不会被自动创建。" diff --git a/library/gc.po b/library/gc.po new file mode 100644 index 0000000000..e0c5276e48 --- /dev/null +++ b/library/gc.po @@ -0,0 +1,556 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# 99 , 2026 +# python-doc bot, 2026 +# 汇民 王 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/gc.rst:2 +msgid ":mod:`!gc` --- Garbage Collector interface" +msgstr ":mod:`!gc` --- 垃圾回收器接口" + +#: ../../library/gc.rst:9 +msgid "" +"This module provides an interface to the optional garbage collector. It " +"provides the ability to disable the collector, tune the collection " +"frequency, and set debugging options. It also provides access to " +"unreachable objects that the collector found but cannot free. Since the " +"collector supplements the reference counting already used in Python, you can" +" disable the collector if you are sure your program does not create " +"reference cycles. Automatic collection can be disabled by calling " +"``gc.disable()``. To debug a leaking program call " +"``gc.set_debug(gc.DEBUG_LEAK)``. Notice that this includes " +"``gc.DEBUG_SAVEALL``, causing garbage-collected objects to be saved in " +"gc.garbage for inspection." +msgstr "" +"此模块提供可选的垃圾回收器的接口,提供的功能包括:关闭收集器、调整收集频率、设置调试选项。它同时提供对回收器找到但是无法释放的不可达对象的访问。由于 " +"Python 使用了带有引用计数的回收器,如果你确定你的程序不会产生循环引用,你可以关闭回收器。可以通过调用 ``gc.disable()`` " +"关闭自动垃圾回收。若要调试一个存在内存泄漏的程序,调用 ``gc.set_debug(gc.DEBUG_LEAK)``;需要注意的是,它包含 " +"``gc.DEBUG_SAVEALL``,使得被垃圾回收的对象会被存放在 gc.garbage 中以待检查。" + +#: ../../library/gc.rst:20 +msgid "The :mod:`!gc` module provides the following functions:" +msgstr ":mod:`!gc` 模块提供了下列函数:" + +#: ../../library/gc.rst:25 +msgid "Enable automatic garbage collection." +msgstr "启用自动垃圾回收" + +#: ../../library/gc.rst:30 +msgid "Disable automatic garbage collection." +msgstr "停用自动垃圾回收" + +#: ../../library/gc.rst:35 +msgid "Return ``True`` if automatic collection is enabled." +msgstr "如果启用了自动回收则返回 ``True``。" + +#: ../../library/gc.rst:40 +msgid "" +"With no arguments, run a full collection. The optional argument " +"*generation* may be an integer specifying which generation to collect (from " +"0 to 2). A :exc:`ValueError` is raised if the generation number is invalid." +" The sum of collected objects and uncollectable objects is returned." +msgstr "" +"不带参数时,将运行完全的回收。 可选的参数 *generation* 是一个指定要回收哪一代 (从 0 到 2) 的整数值。 如果 generation" +" 值无效则会引发 :exc:`ValueError`。 返回值为已回收对象和不可回收对象的总数。" + +#: ../../library/gc.rst:45 +msgid "" +"The free lists maintained for a number of built-in types are cleared " +"whenever a full collection or collection of the highest generation (2) is " +"run. Not all items in some free lists may be freed due to the particular " +"implementation, in particular :class:`float`." +msgstr "" +"每当运行完整收集或最高代 (2) 收集时,为多个内置类型所维护的空闲列表会被清空。由于特定类型特别是 :class:`float` " +"的实现,在某些空闲列表中并非所有项都会被释放。" + +#: ../../library/gc.rst:50 +msgid "" +"The effect of calling ``gc.collect()`` while the interpreter is already " +"performing a collection is undefined." +msgstr "当解释器已经在执行收集任务时调用 ``gc.collect()`` 的效果是未定义的。" + +#: ../../library/gc.rst:53 +msgid "``generation=1`` performs an increment of collection." +msgstr "``generation=1`` 执行一次增量回收。" + +#: ../../library/gc.rst:56 +msgid "``generation=1`` performs collection of the middle generation." +msgstr "" + +#: ../../library/gc.rst:62 +msgid "" +"Set the garbage collection debugging flags. Debugging information will be " +"written to ``sys.stderr``. See below for a list of debugging flags which " +"can be combined using bit operations to control debugging." +msgstr "" +"设置垃圾回收器的调试标识位。调试信息会被写入 ``sys.stderr`` " +"。此文档末尾列出了各个标志位及其含义;可以使用位操作对多个标志位进行设置以控制调试。" + +#: ../../library/gc.rst:69 +msgid "Return the debugging flags currently set." +msgstr "返回当前调试标识位。" + +#: ../../library/gc.rst:74 +msgid "" +"Returns a list of all objects tracked by the collector, excluding the list " +"returned. If *generation* is not ``None``, return only the objects tracked " +"by the collector that are in that generation." +msgstr "" +"返回一个由垃圾回收器所跟踪的所有对象组成的列表,不包括已返回对象的列表。 如果 *generation* 不为 " +"``None``,则只返回垃圾回收器所跟踪的属于该 generation 的对象。" + +#: ../../library/gc.rst:78 +msgid "New *generation* parameter." +msgstr "新的 *generation* 形参。" + +#: ../../library/gc.rst:81 +msgid "Generation 1 is removed" +msgstr "第 1 代已被移除" + +#: ../../library/gc.rst:84 +msgid "Generation 1 is reintroduced to maintain GC behavior from 3.13." +msgstr "" + +#: ../../library/gc.rst:87 +msgid "" +"Raises an :ref:`auditing event ` ``gc.get_objects`` with argument " +"``generation``." +msgstr "引发一个 :ref:`审计事件 ` ``gc.get_objects`` 并附带参数 ``generation``。" + +#: ../../library/gc.rst:91 +msgid "" +"Return a list of three per-generation dictionaries containing collection " +"statistics since interpreter start. The number of keys may change in the " +"future, but currently each dictionary will contain the following items:" +msgstr "" +"返回一个包含三个字典对象的列表,每个字典分别包含对应代的从解释器开始运行的垃圾回收统计数据。字典的键的数目在将来可能发生改变,目前每个字典包含以下内容:" + +#: ../../library/gc.rst:96 +msgid "``collections`` is the number of times this generation was collected;" +msgstr "``collections`` 是该代被回收的次数;" + +#: ../../library/gc.rst:98 +msgid "" +"``collected`` is the total number of objects collected inside this " +"generation;" +msgstr "``collected`` 是该代中被回收的对象总数;" + +#: ../../library/gc.rst:101 +msgid "" +"``uncollectable`` is the total number of objects which were found to be " +"uncollectable (and were therefore moved to the :data:`garbage` list) inside " +"this generation;" +msgstr "" + +#: ../../library/gc.rst:105 +msgid "" +"``candidates`` is the total number of objects in this generation which were " +"considered for collection and traversed;" +msgstr "" + +#: ../../library/gc.rst:108 +msgid "" +"``duration`` is the total time in seconds spent in collections for this " +"generation." +msgstr "" + +#: ../../library/gc.rst:113 +msgid "Add ``duration`` and ``candidates``." +msgstr "" + +#: ../../library/gc.rst:119 +msgid "" +"Set the garbage collection thresholds (the collection frequency). Setting " +"*threshold0* to zero disables collection." +msgstr "设置垃圾回收阈值(收集频率)。将 *threshold0* 设为零会禁用回收。" + +#: ../../library/gc.rst:122 +msgid "" +"The GC classifies objects into three generations depending on how many " +"collection sweeps they have survived. New objects are placed in the " +"youngest generation (generation ``0``). If an object survives a collection " +"it is moved into the next older generation. Since generation ``2`` is the " +"oldest generation, objects in that generation remain there after a " +"collection. In order to decide when to run, the collector keeps track of " +"the number object allocations and deallocations since the last collection. " +"When the number of allocations minus the number of deallocations exceeds " +"*threshold0*, collection starts. Initially only generation ``0`` is " +"examined. If generation ``0`` has been examined more than *threshold1* " +"times since generation ``1`` has been examined, then generation ``1`` is " +"examined as well. With the third generation, things are a bit more " +"complicated, see `Collecting the oldest generation " +"`_ for more information." +msgstr "" +"垃圾回收器把所有对象分类为三代,其依据是对象在多少次垃圾回收后幸存。 新建对象会被放在最年轻代(第 ``0`` 代)。 " +"如果一个对象在一次垃圾回收后幸存,它会被移入下一个较老代。 由于第 ``2`` 代是最老代,这一代的对象在一次垃圾回收后仍会保留原样。 " +"为了确定何时要运行,垃圾回收器会跟踪自上一次回收后对象分配和释放的数量。 当分配数量减去释放数量的结果值大于 *threshold0* " +"时,垃圾回收就会开始。 初始时只有第 ``0`` 代会被检查。 如果自第 ``1`` 代被检查后第 ``0`` 代已被检查超过 *threshold1*" +" 次,则第 ``1`` 也会被检查。 对于第三代来说情况还会更复杂,请参阅 `Collecting the oldest generation " +"`_ 来了解详情。" + +#: ../../library/gc.rst:136 +msgid "" +"See `Garbage collector design " +"`_" +" for more information." +msgstr "" + +#: ../../library/gc.rst:138 +msgid "*threshold2* is ignored" +msgstr "*threshold2* 将被忽略" + +#: ../../library/gc.rst:141 +msgid "*threshold2* is restored to match Python 3.13 behavior." +msgstr "" + +#: ../../library/gc.rst:147 +msgid "" +"Return the current collection counts as a tuple of ``(count0, count1, " +"count2)``." +msgstr "将当前回收计数以形为 ``(count0, count1, count2)`` 的元组返回。" + +#: ../../library/gc.rst:153 +msgid "" +"Return the current collection thresholds as a tuple of ``(threshold0, " +"threshold1, threshold2)``." +msgstr "将当前回收阈值以形为 ``(threshold0, threshold1, threshold2)`` 的元组返回。" + +#: ../../library/gc.rst:159 +msgid "" +"Return the list of objects that directly refer to any of objs. This function" +" will only locate those containers which support garbage collection; " +"extension types which do refer to other objects but do not support garbage " +"collection will not be found." +msgstr "返回直接引用任意一个 *objs* 的对象列表。这个函数只定位支持垃圾回收的容器;引用了其它对象但不支持垃圾回收的扩展类型不会被找到。" + +#: ../../library/gc.rst:164 +msgid "" +"Note that objects which have already been dereferenced, but which live in " +"cycles and have not yet been collected by the garbage collector can be " +"listed among the resulting referrers. To get only currently live objects, " +"call :func:`collect` before calling :func:`get_referrers`." +msgstr "" +"需要注意的是,已经解除对 *objs* 引用的对象,但仍存在于循环引用中未被回收时,仍然会被作为引用者出现在返回的列表当中。若要获取当前正在引用 " +"*objs* 的对象,需要调用 :func:`collect` 然后再调用 :func:`get_referrers`。" + +#: ../../library/gc.rst:170 +msgid "" +"Care must be taken when using objects returned by :func:`get_referrers` " +"because some of them could still be under construction and hence in a " +"temporarily invalid state. Avoid using :func:`get_referrers` for any purpose" +" other than debugging." +msgstr "" +"在使用 :func:`get_referrers` 返回的对象时必须要小心,因为其中一些对象可能仍在构造中因此处于暂时的无效状态。不要把 " +":func:`get_referrers` 用于调试以外的其它目的。" + +#: ../../library/gc.rst:175 +msgid "" +"Raises an :ref:`auditing event ` ``gc.get_referrers`` with " +"argument ``objs``." +msgstr "引发一个 :ref:`审计事件 ` ``gc.get_referrers`` 并附带参数 ``objs``。" + +#: ../../library/gc.rst:180 +msgid "" +"Return a list of objects directly referred to by any of the arguments. The " +"referents returned are those objects visited by the arguments' C-level " +":c:member:`~PyTypeObject.tp_traverse` methods (if any), and may not be all " +"objects actually directly reachable. :c:member:`~PyTypeObject.tp_traverse` " +"methods are supported only by objects that support garbage collection, and " +"are only required to visit objects that may be involved in a cycle. So, for" +" example, if an integer is directly reachable from an argument, that integer" +" object may or may not appear in the result list." +msgstr "" +"返回被任意一个参数中的对象直接引用的对象的列表。返回的被引用对象是被参数中的对象的 C 语言级别方法(若存在) " +":c:member:`~PyTypeObject.tp_traverse` 访问到的对象,可能不是所有的实际直接可达对象。只有支持垃圾回收的对象支持 " +":c:member:`~PyTypeObject.tp_traverse` " +"方法,并且此方法只会在需要访问涉及循环引用的对象时使用。因此,可以有以下例子:一个整数对其中一个参数是直接可达的,这个整数有可能出现或不出现在返回的结果列表当中。" + +#: ../../library/gc.rst:188 +msgid "" +"Raises an :ref:`auditing event ` ``gc.get_referents`` with " +"argument ``objs``." +msgstr "引发一个 :ref:`审计事件 ` ``gc.get_referents`` 并附带参数 ``objs``。" + +#: ../../library/gc.rst:192 +msgid "" +"Returns ``True`` if the object is currently tracked by the garbage " +"collector, ``False`` otherwise. As a general rule, instances of atomic " +"types aren't tracked and instances of non-atomic types (containers, user-" +"defined objects...) are. However, some type-specific optimizations can be " +"present in order to suppress the garbage collector footprint of simple " +"instances (e.g. dicts containing only atomic keys and values)::" +msgstr "" +"当对象正在被垃圾回收器监控时返回 ``True``,否则返回 ``False`` " +"。一般来说,原子类的实例不会被监控,而非原子类(如容器、用户自定义的对象)会被监控。然而,会有一些特定类型的优化以便减少垃圾回收器在简单实例(如只含有原子性的键和值的字典)上的消耗::" + +#: ../../library/gc.rst:199 +msgid "" +">>> gc.is_tracked(0)\n" +"False\n" +">>> gc.is_tracked(\"a\")\n" +"False\n" +">>> gc.is_tracked([])\n" +"True\n" +">>> gc.is_tracked({})\n" +"False\n" +">>> gc.is_tracked({\"a\": 1})\n" +"True" +msgstr "" +">>> gc.is_tracked(0)\n" +"False\n" +">>> gc.is_tracked(\"a\")\n" +"False\n" +">>> gc.is_tracked([])\n" +"True\n" +">>> gc.is_tracked({})\n" +"False\n" +">>> gc.is_tracked({\"a\": 1})\n" +"True" + +#: ../../library/gc.rst:215 +msgid "" +"Returns ``True`` if the given object has been finalized by the garbage " +"collector, ``False`` otherwise. ::" +msgstr "如果给定对象已被垃圾回收器终结则返回 ``True``,否则返回 ``False``。 ::" + +#: ../../library/gc.rst:218 +msgid "" +">>> x = None\n" +">>> class Lazarus:\n" +"... def __del__(self):\n" +"... global x\n" +"... x = self\n" +"...\n" +">>> lazarus = Lazarus()\n" +">>> gc.is_finalized(lazarus)\n" +"False\n" +">>> del lazarus\n" +">>> gc.is_finalized(x)\n" +"True" +msgstr "" +">>> x = None\n" +">>> class Lazarus:\n" +"... def __del__(self):\n" +"... global x\n" +"... x = self\n" +"...\n" +">>> lazarus = Lazarus()\n" +">>> gc.is_finalized(lazarus)\n" +"False\n" +">>> del lazarus\n" +">>> gc.is_finalized(x)\n" +"True" + +#: ../../library/gc.rst:236 +msgid "" +"Freeze all the objects tracked by the garbage collector; move them to a " +"permanent generation and ignore them in all the future collections." +msgstr "冻结由垃圾回收器追踪的所有对象;将它们移至永久代并在所有未来的回收操作中忽略它们。" + +#: ../../library/gc.rst:239 +msgid "" +"If a process will ``fork()`` without ``exec()``, avoiding unnecessary copy-" +"on-write in child processes will maximize memory sharing and reduce overall " +"memory usage. This requires both avoiding creation of freed \"holes\" in " +"memory pages in the parent process and ensuring that GC collections in child" +" processes won't touch the ``gc_refs`` counter of long-lived objects " +"originating in the parent process. To accomplish both, call ``gc.disable()``" +" early in the parent process, ``gc.freeze()`` right before ``fork()``, and " +"``gc.enable()`` early in child processes." +msgstr "" +"如果一个进程将执行 ``fork()`` 而不执行 ``exec()``,则在子进程中避免不必要的写入时拷贝将最大化内存共享并减少总体内存使用。 " +"这需要同时在父进程的内存页中避免创建已释放的“空洞”并确保在子进程中的 GC 回收不会触及源自父进程的长寿对象的 ``gc_refs`` 计数器。 " +"要同时达成这两个目标,请在父进程中尽早调用 ``gc.disable()``,在 ``fork()`` 之前调用 " +"``gc.freeze()``,并在子进程中尽早调用 ``gc.enable()``。 " + +#: ../../library/gc.rst:253 +msgid "" +"Unfreeze the objects in the permanent generation, put them back into the " +"oldest generation." +msgstr "解冻永久代中的对象,并将它们放回到年老代中。" + +#: ../../library/gc.rst:261 +msgid "Return the number of objects in the permanent generation." +msgstr "返回永久代中的对象数量。" + +#: ../../library/gc.rst:266 +msgid "" +"The following variables are provided for read-only access (you can mutate " +"the values but should not rebind them):" +msgstr "提供以下变量仅供只读访问(你可以修改但不应该重绑定它们):" + +#: ../../library/gc.rst:271 +msgid "" +"A list of objects which the collector found to be unreachable but could not " +"be freed (uncollectable objects). Starting with Python 3.4, this list " +"should be empty most of the time, except when using instances of C extension" +" types with a non-``NULL`` ``tp_del`` slot." +msgstr "" +"一个回收器发现不可达而又无法被释放的对象(不可回收对象)列表。从 Python 3.4 开始,该列表在大多数时候都应该是空的,除非使用了含有非 " +"``NULL`` ``tp_del`` 空位的 C 扩展类型的实例。" + +#: ../../library/gc.rst:276 +msgid "" +"If :const:`DEBUG_SAVEALL` is set, then all unreachable objects will be added" +" to this list rather than freed." +msgstr "如果设置了 :const:`DEBUG_SAVEALL`,则所有不可访问对象将被添加至该列表而不会被释放。" + +#: ../../library/gc.rst:279 +msgid "" +"If this list is non-empty at :term:`interpreter shutdown`, a " +":exc:`ResourceWarning` is emitted, which is silent by default. If " +":const:`DEBUG_UNCOLLECTABLE` is set, in addition all uncollectable objects " +"are printed." +msgstr "" +"当 :term:`interpreter shutdown` 即解释器关闭时,若此列表非空,会产生 :exc:`ResourceWarning` " +",默认情况下此警告是静默的。如果设置了 :const:`DEBUG_UNCOLLECTABLE`,所有无法被回收的对象会被打印。" + +#: ../../library/gc.rst:285 +msgid "" +"Following :pep:`442`, objects with a :meth:`~object.__del__` method don't " +"end up in :data:`gc.garbage` anymore." +msgstr "" +"根据 :pep:`442`,具有 :meth:`~object.__del__` 方法的对象不会再出现在 :data:`gc.garbage` 中。" + +#: ../../library/gc.rst:291 +msgid "" +"A list of callbacks that will be invoked by the garbage collector before and" +" after collection. The callbacks will be called with two arguments, *phase*" +" and *info*." +msgstr "在垃圾回收器开始前和完成后会被调用的一系列回调函数。这些回调函数在被调用时使用两个参数: *phase* 和 *info* 。" + +#: ../../library/gc.rst:295 +msgid "*phase* can be one of two values:" +msgstr "*phase* 可为以下两值之一:" + +#: ../../library/gc.rst:297 +msgid "\"start\": The garbage collection is about to start." +msgstr "\"start\": 垃圾回收即将开始。" + +#: ../../library/gc.rst:299 +msgid "\"stop\": The garbage collection has finished." +msgstr "\"stop\": 垃圾回收已结束。" + +#: ../../library/gc.rst:301 +msgid "" +"*info* is a dict providing more information for the callback. The following" +" keys are currently defined:" +msgstr "*info* 是一个字典,提供了回调函数更多信息。已有定义的键有:" + +#: ../../library/gc.rst:304 +msgid "\"generation\": The oldest generation being collected." +msgstr "\"generation\"(代):正在被回收的最久远的一代。" + +#: ../../library/gc.rst:306 +msgid "" +"\"collected\": When *phase* is \"stop\", the number of objects successfully " +"collected." +msgstr "\"collected\"(已回收的):当 *phase* 为 \"stop\" 时,被成功回收的对象的数目。" + +#: ../../library/gc.rst:309 +msgid "" +"\"uncollectable\": When *phase* is \"stop\", the number of objects that " +"could not be collected and were put in :data:`garbage`." +msgstr "" +"\"uncollectable\"(不可回收的):当 *phase* 为 \"stop\" 时,不能被回收并被放入 :data:`garbage` " +"的对象的数目。" + +#: ../../library/gc.rst:312 +msgid "" +"\"candidates\": When *phase* is \"stop\", the total number of objects in " +"this generation which were considered for collection and traversed." +msgstr "" + +#: ../../library/gc.rst:315 +msgid "" +"\"duration\": When *phase* is \"stop\", the time in seconds spent in the " +"collection." +msgstr "" + +#: ../../library/gc.rst:318 +msgid "" +"Applications can add their own callbacks to this list. The primary use " +"cases are:" +msgstr "应用程序可以把自己的回调函数加入此列表。主要的使用场景有:" + +#: ../../library/gc.rst:321 +msgid "" +"Gathering statistics about garbage collection, such as how often various " +"generations are collected, and how long the collection takes." +msgstr "统计垃圾回收的数据,如:不同代的回收频率、回收所花费的时间。" + +#: ../../library/gc.rst:325 +msgid "" +"Allowing applications to identify and clear their own uncollectable types " +"when they appear in :data:`garbage`." +msgstr "使应用程序可以识别和清理自身在 :data:`garbage` 中的不可回收类型的对象。" + +#: ../../library/gc.rst:330 +msgid "Add \"duration\" and \"candidates\"." +msgstr "" + +#: ../../library/gc.rst:334 +msgid "The following constants are provided for use with :func:`set_debug`:" +msgstr "以下常量被用于 :func:`set_debug`:" + +#: ../../library/gc.rst:339 +msgid "" +"Print statistics during collection. This information can be useful when " +"tuning the collection frequency." +msgstr "在回收期间打印统计信息。在调整回收频率时,这些信息会比较有用。" + +#: ../../library/gc.rst:345 +msgid "Print information on collectable objects found." +msgstr "当发现可回收对象时打印信息。" + +#: ../../library/gc.rst:350 +msgid "" +"Print information of uncollectable objects found (objects which are not " +"reachable but cannot be freed by the collector). These objects will be " +"added to the ``garbage`` list." +msgstr "打印找到的不可回收对象的信息(指不能被回收器回收的不可达对象)。这些对象会被添加到 ``garbage`` 列表中。" + +#: ../../library/gc.rst:354 +msgid "" +"Also print the contents of the :data:`garbage` list at :term:`interpreter " +"shutdown`, if it isn't empty." +msgstr "" +"当 :term:`interpreter shutdown` 时,即解释器关闭时,若 :data:`garbage` " +"列表中存在对象,这些对象也会被打印输出。" + +#: ../../library/gc.rst:360 +msgid "" +"When set, all unreachable objects found will be appended to *garbage* rather" +" than being freed. This can be useful for debugging a leaking program." +msgstr "设置后,所有回收器找到的不可达对象会被添加进 *garbage* 而不是直接被释放。这在调试一个内存泄漏的程序时会很有用。" + +#: ../../library/gc.rst:366 +msgid "" +"The debugging flags necessary for the collector to print information about a" +" leaking program (equal to ``DEBUG_COLLECTABLE | DEBUG_UNCOLLECTABLE | " +"DEBUG_SAVEALL``)." +msgstr "" +"调试内存泄漏的程序时,使回收器打印信息的调试标识位。(等价于 ``DEBUG_COLLECTABLE | DEBUG_UNCOLLECTABLE | " +"DEBUG_SAVEALL``)." diff --git a/library/getopt.po b/library/getopt.po new file mode 100644 index 0000000000..cbb8d2775b --- /dev/null +++ b/library/getopt.po @@ -0,0 +1,432 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/getopt.rst:2 +msgid ":mod:`!getopt` --- C-style parser for command line options" +msgstr ":mod:`!getopt` --- C 风格的命令行选项解析器" + +#: ../../library/getopt.rst:8 +msgid "**Source code:** :source:`Lib/getopt.py`" +msgstr "**源代码:** :source:`Lib/getopt.py`" + +#: ../../library/getopt.rst:12 +msgid "" +"This module is considered feature complete. A more declarative and " +"extensible alternative to this API is provided in the :mod:`optparse` " +"module. Further functional enhancements for command line parameter " +"processing are provided either as third party modules on PyPI, or else as " +"features in the :mod:`argparse` module." +msgstr "" +"该模块被认为具有完备的特性。在 :mod:`optparse` 模块中提供了一个针对此 API 的更为声明式和可扩展的替代物。 " +"对命令行形参处理进一步的功能增强或是作为 PyPI 上的第三方模块,或是作为 :mod:`argparse` 模块中的特性被提供。" + +#: ../../library/getopt.rst:20 +msgid "" +"This module helps scripts to parse the command line arguments in " +"``sys.argv``. It supports the same conventions as the Unix :c:func:`!getopt`" +" function (including the special meanings of arguments of the form '``-``' " +"and '``--``'). Long options similar to those supported by GNU software may " +"be used as well via an optional third argument." +msgstr "" +"此模块可协助脚本解析 ``sys.argv`` 中的命令行参数。它支持与 Unix :c:func:`!getopt` 函数相同的惯例 (包括形式为 " +"'``-``' 和 '``--``' 的参数的特殊含义)。也可以通过可选的第三个参数来使用类似于 GNU 软件所支持形式的长选项。" + +#: ../../library/getopt.rst:26 +msgid "" +"Users who are unfamiliar with the Unix :c:func:`!getopt` function should " +"consider using the :mod:`argparse` module instead. Users who are familiar " +"with the Unix :c:func:`!getopt` function, but would like to get equivalent " +"behavior while writing less code and getting better help and error messages " +"should consider using the :mod:`optparse` module. See :ref:`choosing-an-" +"argument-parser` for additional details." +msgstr "" +"不熟悉 Unix :c:func:`!getopt` 函数的用户应当考虑改用 :mod:`argparse` 模块。熟悉 Unix " +":c:func:`!getopt` 函数,但希望在获得等价的行为同时使用更少的代码又具有更好的帮助和错误信息的用户应当考虑使用 " +":mod:`optparse` 模块。请参阅 :ref:`choosing-an-argument-parser` 了解更多细节。" + +#: ../../library/getopt.rst:33 +msgid "This module provides two functions and an exception:" +msgstr "此模块提供了两个函数和一个异常:" + +#: ../../library/getopt.rst:39 +msgid "" +"Parses command line options and parameter list. *args* is the argument list" +" to be parsed, without the leading reference to the running program. " +"Typically, this means ``sys.argv[1:]``. *shortopts* is the string of option " +"letters that the script wants to recognize, with options that require an " +"argument followed by a colon (``':'``) and options that accept an optional " +"argument followed by two colons (``'::'``); i.e., the same format that Unix " +":c:func:`!getopt` uses." +msgstr "" +"解析命令行选项与形参列表。 *args* 是要解析的参数列表,不包含最开头的对正在运行的程序的引用。通常,这意味着 ``sys.argv[1:]``。 " +"*shortopts* 是脚本要识别的选项字母字符串,选项需要一个参数则后跟一个冒号 (``':'``),选项接受一个可选参数则后跟两个冒号 " +"(``'::'``);即与 Unix :c:func:`!getopt` 所用的格式相同。" + +#: ../../library/getopt.rst:48 +msgid "" +"Unlike GNU :c:func:`!getopt`, after a non-option argument, all further " +"arguments are considered also non-options. This is similar to the way non-" +"GNU Unix systems work." +msgstr "" +"与 GNU :c:func:`!getopt` 不同,在非选项参数之后,所有后续参数都会被视为非选项。这类似于非 GNU Unix 系统的运作方式。" + +#: ../../library/getopt.rst:52 +msgid "" +"*longopts*, if specified, must be a list of strings with the names of the " +"long options which should be supported. The leading ``'--'`` characters " +"should not be included in the option name. Long options which require an " +"argument should be followed by an equal sign (``'='``). Long options which " +"accept an optional argument should be followed by an equal sign and question" +" mark (``'=?'``). To accept only long options, *shortopts* should be an " +"empty string. Long options on the command line can be recognized so long as" +" they provide a prefix of the option name that matches exactly one of the " +"accepted options. For example, if *longopts* is ``['foo', 'frob']``, the " +"option ``--fo`` will match as ``--foo``, but ``--f`` will not match " +"uniquely, so :exc:`GetoptError` will be raised." +msgstr "" +"如果指定了 *longopts*,则必须为一个由应当被支持的长选项名称组成的列表。开头的 ``'--'`` 字符不应被包括在选项名称中。 " +"需要参数的长选项应当后跟一个等号 (``'='``)。接受可选参数的长选项应当后跟等号和问号 (``'=?'``)。 如果想仅接受长选项,则 " +"*shortopts* 应为一个空字符串。 命令行中的长选项只要提供了恰好能匹配可接受选项之一的选项名称前缀即可被识别。 举例来说,如果 " +"*longopts* 为 ``['foo', 'frob']``,则选项 ``--fo`` 将匹配为 ``--foo``,但 ``--f`` " +"将不能得到唯一匹配,因此将引发 :exc:`GetoptError`。" + +#: ../../library/getopt.rst:65 +msgid "" +"The return value consists of two elements: the first is a list of ``(option," +" value)`` pairs; the second is the list of program arguments left after the " +"option list was stripped (this is a trailing slice of *args*). Each option-" +"and-value pair returned has the option as its first element, prefixed with a" +" hyphen for short options (e.g., ``'-x'``) or two hyphens for long options " +"(e.g., ``'--long-option'``), and the option argument as its second element, " +"or an empty string if the option has no argument. The options occur in the " +"list in the same order in which they were found, thus allowing multiple " +"occurrences. Long and short options may be mixed." +msgstr "" +"返回值由两个元素组成:第一个是 ``(option, value)`` 对的列表;第二个是在去除该选项列表后余下的程序参数列表(这也就是 *args* " +"的尾部切片)。每个被返回的选项与值对的第一个元素是选项,短选项前缀一个连字符 (例如 ``'-x'``),长选项则前缀两个连字符 (例如 ``'--" +"long-option'``),第二个元素是选项参数,如果选项不带参数则为空字符串。列表中选项的排列顺序与它们被解析的顺序相同,因此允许多次出现。 " +"长选项与短选项可以混用。" + +#: ../../library/getopt.rst:75 +msgid "Optional arguments are supported." +msgstr "支持可选参数。" + +#: ../../library/getopt.rst:81 +msgid "" +"This function works like :func:`getopt`, except that GNU style scanning mode" +" is used by default. This means that option and non-option arguments may be " +"intermixed. The :func:`getopt` function stops processing options as soon as " +"a non-option argument is encountered." +msgstr "" +"此函数与 :func:`getopt` 类似,区别在于它默认使用 GNU 风格的扫描模式。这意味着选项和非选项参数可能会混在一起。 " +":func:`getopt` 函数将在遇到非选项参数时立即停止处理选项。" + +#: ../../library/getopt.rst:86 +msgid "" +"If the first character of the option string is ``'+'``, or if the " +"environment variable :envvar:`!POSIXLY_CORRECT` is set, then option " +"processing stops as soon as a non-option argument is encountered." +msgstr "" +"如果选项字符串的第一个字符为 ``'+'``,或者如果设置了环境变量 " +":envvar:`!POSIXLY_CORRECT`,则选项处理会在遇到非选项参数时立即停止。" + +#: ../../library/getopt.rst:90 +msgid "" +"If the first character of the option string is ``'-'``, non-option arguments" +" that are followed by options are added to the list of option-and-value " +"pairs as a pair that has ``None`` as its first element and the list of non-" +"option arguments as its second element. The second element of the " +":func:`!gnu_getopt` result is a list of program arguments after the last " +"option." +msgstr "" +"如果选项字符串的第一个字符是 ``'-'``,则后面跟着选项的非选项参数将作为一对添加到选项和值对列表中,该对的第一个元素是 " +"``None``,第二个元素是非选项参数列表。 :func:`!gnu_getopt` 结果的第二个元素是最后一个选项后的程序参数列表。" + +#: ../../library/getopt.rst:97 +msgid "" +"Support for returning intermixed options and non-option arguments in order." +msgstr "支持按顺序返回混合了的选项和非选项参数。" + +#: ../../library/getopt.rst:103 +msgid "" +"This is raised when an unrecognized option is found in the argument list or " +"when an option requiring an argument is given none. The argument to the " +"exception is a string indicating the cause of the error. For long options, " +"an argument given to an option which does not require one will also cause " +"this exception to be raised. The attributes :attr:`!msg` and :attr:`!opt` " +"give the error message and related option; if there is no specific option to" +" which the exception relates, :attr:`!opt` is an empty string." +msgstr "" +"当参数列表中出现不可识别的选项或当一个需要参数的选项未带参数时将引发此异常。此异常的参数是一个指明错误原因的字符串。 " +"对于长选项,将一个参数传给不需要参数的选项也将导致此异常被引发。 :attr:`!msg` 和 :attr:`!opt` " +"属性将给出错误消息和关联的选项;如果没有关联到此异常的特定选项,则 :attr:`!opt` 将为空字符串。" + +#: ../../library/getopt.rst:114 +msgid "Alias for :exc:`GetoptError`; for backward compatibility." +msgstr ":exc:`GetoptError` 的别名;用于向后兼容。" + +#: ../../library/getopt.rst:116 +msgid "An example using only Unix style options:" +msgstr "一个仅使用 Unix 风格选项的例子:" + +#: ../../library/getopt.rst:118 +msgid "" +">>> import getopt\n" +">>> args = '-a -b -cfoo -d bar a1 a2'.split()\n" +">>> args\n" +"['-a', '-b', '-cfoo', '-d', 'bar', 'a1', 'a2']\n" +">>> optlist, args = getopt.getopt(args, 'abc:d:')\n" +">>> optlist\n" +"[('-a', ''), ('-b', ''), ('-c', 'foo'), ('-d', 'bar')]\n" +">>> args\n" +"['a1', 'a2']" +msgstr "" +">>> import getopt\n" +">>> args = '-a -b -cfoo -d bar a1 a2'.split()\n" +">>> args\n" +"['-a', '-b', '-cfoo', '-d', 'bar', 'a1', 'a2']\n" +">>> optlist, args = getopt.getopt(args, 'abc:d:')\n" +">>> optlist\n" +"[('-a', ''), ('-b', ''), ('-c', 'foo'), ('-d', 'bar')]\n" +">>> args\n" +"['a1', 'a2']" + +#: ../../library/getopt.rst:130 +msgid "Using long option names is equally easy:" +msgstr "使用长选项名也同样容易:" + +#: ../../library/getopt.rst:132 +msgid "" +">>> s = '--condition=foo --testing --output-file abc.def -x a1 a2'\n" +">>> args = s.split()\n" +">>> args\n" +"['--condition=foo', '--testing', '--output-file', 'abc.def', '-x', 'a1', 'a2']\n" +">>> optlist, args = getopt.getopt(args, 'x', [\n" +"... 'condition=', 'output-file=', 'testing'])\n" +">>> optlist\n" +"[('--condition', 'foo'), ('--testing', ''), ('--output-file', 'abc.def'), ('-x', '')]\n" +">>> args\n" +"['a1', 'a2']" +msgstr "" +">>> s = '--condition=foo --testing --output-file abc.def -x a1 a2'\n" +">>> args = s.split()\n" +">>> args\n" +"['--condition=foo', '--testing', '--output-file', 'abc.def', '-x', 'a1', 'a2']\n" +">>> optlist, args = getopt.getopt(args, 'x', [\n" +"... 'condition=', 'output-file=', 'testing'])\n" +">>> optlist\n" +"[('--condition', 'foo'), ('--testing', ''), ('--output-file', 'abc.def'), ('-x', '')]\n" +">>> args\n" +"['a1', 'a2']" + +#: ../../library/getopt.rst:145 +msgid "Optional arguments should be specified explicitly:" +msgstr "应当显式地指定可选参数:" + +#: ../../library/getopt.rst:147 +msgid "" +">>> s = '-Con -C --color=off --color a1 a2'\n" +">>> args = s.split()\n" +">>> args\n" +"['-Con', '-C', '--color=off', '--color', 'a1', 'a2']\n" +">>> optlist, args = getopt.getopt(args, 'C::', ['color=?'])\n" +">>> optlist\n" +"[('-C', 'on'), ('-C', ''), ('--color', 'off'), ('--color', '')]\n" +">>> args\n" +"['a1', 'a2']" +msgstr "" +">>> s = '-Con -C --color=off --color a1 a2'\n" +">>> args = s.split()\n" +">>> args\n" +"['-Con', '-C', '--color=off', '--color', 'a1', 'a2']\n" +">>> optlist, args = getopt.getopt(args, 'C::', ['color=?'])\n" +">>> optlist\n" +"[('-C', 'on'), ('-C', ''), ('--color', 'off'), ('--color', '')]\n" +">>> args\n" +"['a1', 'a2']" + +#: ../../library/getopt.rst:159 +msgid "The order of options and non-option arguments can be preserved:" +msgstr "选项和非选项参数的顺序可以被保留:" + +#: ../../library/getopt.rst:161 +msgid "" +">>> s = 'a1 -x a2 a3 a4 --long a5 a6'\n" +">>> args = s.split()\n" +">>> args\n" +"['a1', '-x', 'a2', 'a3', 'a4', '--long', 'a5', 'a6']\n" +">>> optlist, args = getopt.gnu_getopt(args, '-x:', ['long='])\n" +">>> optlist\n" +"[(None, ['a1']), ('-x', 'a2'), (None, ['a3', 'a4']), ('--long', 'a5')]\n" +">>> args\n" +"['a6']" +msgstr "" +">>> s = 'a1 -x a2 a3 a4 --long a5 a6'\n" +">>> args = s.split()\n" +">>> args\n" +"['a1', '-x', 'a2', 'a3', 'a4', '--long', 'a5', 'a6']\n" +">>> optlist, args = getopt.gnu_getopt(args, '-x:', ['long='])\n" +">>> optlist\n" +"[(None, ['a1']), ('-x', 'a2'), (None, ['a3', 'a4']), ('--long', 'a5')]\n" +">>> args\n" +"['a6']" + +#: ../../library/getopt.rst:173 +msgid "In a script, typical usage is something like this:" +msgstr "在脚本中,典型的用法是这样的:" + +#: ../../library/getopt.rst:175 +msgid "" +"import getopt, sys\n" +"\n" +"def main():\n" +" try:\n" +" opts, args = getopt.getopt(sys.argv[1:], \"ho:v\", [\"help\", \"output=\"])\n" +" except getopt.GetoptError as err:\n" +" # print help information and exit:\n" +" print(err) # will print something like \"option -a not recognized\"\n" +" usage()\n" +" sys.exit(2)\n" +" output = None\n" +" verbose = False\n" +" for o, a in opts:\n" +" if o == \"-v\":\n" +" verbose = True\n" +" elif o in (\"-h\", \"--help\"):\n" +" usage()\n" +" sys.exit()\n" +" elif o in (\"-o\", \"--output\"):\n" +" output = a\n" +" else:\n" +" assert False, \"unhandled option\"\n" +" process(args, output=output, verbose=verbose)\n" +"\n" +"if __name__ == \"__main__\":\n" +" main()" +msgstr "" +"import getopt, sys\n" +"\n" +"def main():\n" +" try:\n" +" opts, args = getopt.getopt(sys.argv[1:], \"ho:v\", [\"help\", \"output=\"])\n" +" except getopt.GetoptError as err:\n" +" # 打印帮助信息并退出。\n" +" print(err) # 将打印 \"option -a not recognized\" 之类的消息\n" +" usage()\n" +" sys.exit(2)\n" +" output = None\n" +" verbose = False\n" +" for o, a in opts:\n" +" if o == \"-v\":\n" +" verbose = True\n" +" elif o in (\"-h\", \"--help\"):\n" +" usage()\n" +" sys.exit()\n" +" elif o in (\"-o\", \"--output\"):\n" +" output = a\n" +" else:\n" +" assert False, \"unhandled option\"\n" +" process(args, output=output, verbose=verbose)\n" +"\n" +"if __name__ == \"__main__\":\n" +" main()" + +#: ../../library/getopt.rst:204 +msgid "" +"Note that an equivalent command line interface could be produced with less " +"code and more informative help and error messages by using the " +":mod:`optparse` module:" +msgstr "请注意可以通过使用 :mod:`optparse` 模块以更少的代码并附带更清晰的帮助和错误消息生成等价的命令行界面:" + +#: ../../library/getopt.rst:207 +msgid "" +"import optparse\n" +"\n" +"if __name__ == '__main__':\n" +" parser = optparse.OptionParser()\n" +" parser.add_option('-o', '--output')\n" +" parser.add_option('-v', dest='verbose', action='store_true')\n" +" opts, args = parser.parse_args()\n" +" process(args, output=opts.output, verbose=opts.verbose)" +msgstr "" +"import optparse\n" +"\n" +"if __name__ == '__main__':\n" +" parser = optparse.OptionParser()\n" +" parser.add_option('-o', '--output')\n" +" parser.add_option('-v', dest='verbose', action='store_true')\n" +" opts, args = parser.parse_args()\n" +" process(args, output=opts.output, verbose=opts.verbose)" + +#: ../../library/getopt.rst:218 +msgid "" +"A roughly equivalent command line interface for this case can also be " +"produced by using the :mod:`argparse` module:" +msgstr "对这种情况也可以通过使用 :mod:`argparse` 模块来生成大致等价的命令行界面:" + +#: ../../library/getopt.rst:221 +msgid "" +"import argparse\n" +"\n" +"if __name__ == '__main__':\n" +" parser = argparse.ArgumentParser()\n" +" parser.add_argument('-o', '--output')\n" +" parser.add_argument('-v', dest='verbose', action='store_true')\n" +" parser.add_argument('rest', nargs='*')\n" +" args = parser.parse_args()\n" +" process(args.rest, output=args.output, verbose=args.verbose)" +msgstr "" +"import argparse\n" +"\n" +"if __name__ == '__main__':\n" +" parser = argparse.ArgumentParser()\n" +" parser.add_argument('-o', '--output')\n" +" parser.add_argument('-v', dest='verbose', action='store_true')\n" +" parser.add_argument('rest', nargs='*')\n" +" args = parser.parse_args()\n" +" process(args.rest, output=args.output, verbose=args.verbose)" + +#: ../../library/getopt.rst:233 +msgid "" +"See :ref:`choosing-an-argument-parser` for details on how the ``argparse`` " +"version of this code differs in behaviour from the ``optparse`` (and " +"``getopt``) version." +msgstr "" +"请参阅 :ref:`choosing-an-argument-parser` 了解有关此代码的 ``argparse`` 版本与 " +"``optparse`` (和 ``getopt``) 版本间行为差异的详情。" + +#: ../../library/getopt.rst:239 +msgid "Module :mod:`optparse`" +msgstr "模块 :mod:`optparse`" + +#: ../../library/getopt.rst:240 +msgid "Declarative command line option parsing." +msgstr "声明式命令行选项解析。" + +#: ../../library/getopt.rst:242 +msgid "Module :mod:`argparse`" +msgstr "模块 :mod:`argparse`" + +#: ../../library/getopt.rst:243 +msgid "More opinionated command line option and argument parsing library." +msgstr "更有针对性的命令行选项和参数解析库。" diff --git a/library/getpass.po b/library/getpass.po new file mode 100644 index 0000000000..edd93810a5 --- /dev/null +++ b/library/getpass.po @@ -0,0 +1,170 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/getpass.rst:2 +msgid ":mod:`!getpass` --- Portable password input" +msgstr ":mod:`!getpass` --- 可移植的密码输入" + +#: ../../library/getpass.rst:7 +msgid "**Source code:** :source:`Lib/getpass.py`" +msgstr "**源代码:** :source:`Lib/getpass.py`" + +#: ../../includes/wasm-notavail.rst:3 +msgid "Availability" +msgstr "可用性" + +#: ../../includes/wasm-notavail.rst:5 +msgid "" +"This module does not work or is not available on WebAssembly. See " +":ref:`wasm-availability` for more information." +msgstr "此模块在 WebAssembly 平台上无效或不可用。请参阅 :ref:`wasm-availability` 了解详情。" + +#: ../../library/getpass.rst:13 +msgid "The :mod:`!getpass` module provides two functions:" +msgstr ":mod:`!getpass` 模块提供了两个函数:" + +#: ../../library/getpass.rst:17 +msgid "" +"Prompt the user for a password without echoing. The user is prompted using " +"the string *prompt*, which defaults to ``'Password: '``. On Unix, the " +"prompt is written to the file-like object *stream* using the replace error " +"handler if needed. *stream* defaults to the controlling terminal " +"(:file:`/dev/tty`) or if that is unavailable to ``sys.stderr`` (this " +"argument is ignored on Windows)." +msgstr "" +"提示用户输入一个密码且不会回显。用户会看到字符串 *prompt* 作为提示,其默认值为 ``'Password: '``。在 Unix " +"上,如有必要提示会使用替换错误句柄写入到文件型对象 *stream*。 *stream* 默认指向控制终端 " +"(:file:`/dev/tty`),如果不可用则指向 ``sys.stderr`` (此参数在 Windows 上会被忽略)。" + +#: ../../library/getpass.rst:24 +msgid "" +"The *echo_char* argument controls how user input is displayed while typing. " +"If *echo_char* is ``None`` (default), input remains hidden. Otherwise, " +"*echo_char* must be a single printable ASCII character and each typed " +"character is replaced by it. For example, ``echo_char='*'`` will display " +"asterisks instead of the actual input." +msgstr "" +"*echo_char* 参数控制在按键时用户输入将如何显示。如果 *echo_char* 为 ``None`` (默认值),输入将保持隐藏。 " +"在其他情况下,*echo_char* 必须是一个可打印的 ASCII 字符而每个键入的字符将由它来替换。例如,``echo_char='*'`` " +"将显示星号而不是实际输入内容。" + +#: ../../library/getpass.rst:30 +msgid "" +"If echo free input is unavailable getpass() falls back to printing a warning" +" message to *stream* and reading from ``sys.stdin`` and issuing a " +":exc:`GetPassWarning`." +msgstr "" +"如果无回显输入不可用,则 getpass() 将回退为向 *stream* 打印一条警告消息,并从 ``sys.stdin`` 读取且发出 " +":exc:`GetPassWarning`." + +#: ../../library/getpass.rst:35 +msgid "" +"If you call getpass from within IDLE, the input may be done in the terminal " +"you launched IDLE from rather than the idle window itself." +msgstr "如果你从 IDLE 内部调用 getpass,输入可能是在你启动 IDLE 的终端中而非在 IDLE 窗口本身中完成。" + +#: ../../library/getpass.rst:39 +msgid "" +"On Unix systems, when *echo_char* is set, the terminal will be configured to" +" operate in :manpage:`noncanonical mode " +"`. Common terminal control " +"characters are supported:" +msgstr "" + +#: ../../library/getpass.rst:44 +msgid ":kbd:`Ctrl+A` - Move cursor to beginning of line" +msgstr "" + +#: ../../library/getpass.rst:45 +msgid ":kbd:`Ctrl+E` - Move cursor to end of line" +msgstr "" + +#: ../../library/getpass.rst:46 +msgid ":kbd:`Ctrl+K` - Kill (delete) from cursor to end of line" +msgstr "" + +#: ../../library/getpass.rst:47 +msgid ":kbd:`Ctrl+U` - Kill (delete) entire line" +msgstr "" + +#: ../../library/getpass.rst:48 +msgid ":kbd:`Ctrl+W` - Erase previous word" +msgstr "" + +#: ../../library/getpass.rst:49 +msgid ":kbd:`Ctrl+V` - Insert next character literally (quote)" +msgstr "" + +#: ../../library/getpass.rst:50 +msgid ":kbd:`Backspace`/:kbd:`DEL` - Delete character before cursor" +msgstr "" + +#: ../../library/getpass.rst:52 +msgid "" +"These shortcuts work by reading the terminal's configured control character " +"mappings from termios settings." +msgstr "" + +#: ../../library/getpass.rst:55 +msgid "Added the *echo_char* parameter for keyboard feedback." +msgstr "添加了 *echo_char* 形参用于键盘反馈。" + +#: ../../library/getpass.rst:58 +msgid "" +"When using non-empty *echo_char* on Unix, keyboard shortcuts (including " +"cursor movement and line editing) are now properly handled using the " +"terminal's control character configuration." +msgstr "" + +#: ../../library/getpass.rst:65 +msgid "" +"A :exc:`UserWarning` subclass issued when password input may be echoed." +msgstr "一个当密码输入可能被回显时发出的 :exc:`UserWarning` 子类。" + +#: ../../library/getpass.rst:70 +msgid "Return the \"login name\" of the user." +msgstr "返回用户的“登录名称”。" + +#: ../../library/getpass.rst:72 +msgid "" +"This function checks the environment variables :envvar:`LOGNAME`, " +":envvar:`USER`, :envvar:`!LNAME` and :envvar:`USERNAME`, in order, and " +"returns the value of the first one which is set to a non-empty string. If " +"none are set, the login name from the password database is returned on " +"systems which support the :mod:`pwd` module, otherwise, an :exc:`OSError` is" +" raised." +msgstr "" +"此函数会按顺序检查环境变量 :envvar:`LOGNAME`, :envvar:`USER`, :envvar:`!LNAME` 和 " +":envvar:`USERNAME`,并返回其中第一个被设为非空字符串的值。如果全都未设置,则在支持 :mod:`pwd` " +"模块的系统上将返回来自密码数据库的登录名,在其他情况下,将会引发 :exc:`OSError`。" + +#: ../../library/getpass.rst:79 +msgid "" +"In general, this function should be preferred over :func:`os.getlogin`." +msgstr "通常情况下,此函数应优先于 :func:`os.getlogin`。" + +#: ../../library/getpass.rst:81 +msgid "Previously, various exceptions beyond just :exc:`OSError` were raised." +msgstr "在之前版本中,除了 :exc:`OSError` 之外还会引发其他多种异常。" diff --git a/library/gettext.po b/library/gettext.po new file mode 100644 index 0000000000..811b08120d --- /dev/null +++ b/library/gettext.po @@ -0,0 +1,1093 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/gettext.rst:2 +msgid ":mod:`!gettext` --- Multilingual internationalization services" +msgstr ":mod:`!gettext` --- 多语种国际化服务" + +#: ../../library/gettext.rst:10 +msgid "**Source code:** :source:`Lib/gettext.py`" +msgstr "**源代码:** :source:`Lib/gettext.py`" + +#: ../../library/gettext.rst:14 +msgid "" +"The :mod:`!gettext` module provides internationalization (I18N) and " +"localization (L10N) services for your Python modules and applications. It " +"supports both the GNU :program:`gettext` message catalog API and a higher " +"level, class-based API that may be more appropriate for Python files. The " +"interface described below allows you to write your module and application " +"messages in one natural language, and provide a catalog of translated " +"messages for running under different natural languages." +msgstr "" + +#: ../../library/gettext.rst:22 +msgid "" +"Some hints on localizing your Python modules and applications are also " +"given." +msgstr "同时还给出一些本地化 Python 模块及应用程序的小技巧。" + +#: ../../library/gettext.rst:26 +msgid "GNU :program:`gettext` API" +msgstr "GNU :program:`gettext` API" + +#: ../../library/gettext.rst:28 +msgid "" +"The :mod:`!gettext` module defines the following API, which is very similar " +"to the GNU :program:`gettext` API. If you use this API you will affect the " +"translation of your entire application globally. Often this is what you " +"want if your application is monolingual, with the choice of language " +"dependent on the locale of your user. If you are localizing a Python " +"module, or if your application needs to switch languages on the fly, you " +"probably want to use the class-based API instead." +msgstr "" + +#: ../../library/gettext.rst:39 +msgid "" +"Bind the *domain* to the locale directory *localedir*. More concretely, " +":mod:`!gettext` will look for binary :file:`.mo` files for the given domain " +"using the path (on Unix): " +":file:`{localedir}/{language}/LC_MESSAGES/{domain}.mo`, where *language* is " +"searched for in the environment variables :envvar:`LANGUAGE`, " +":envvar:`LC_ALL`, :envvar:`LC_MESSAGES`, and :envvar:`LANG` respectively." +msgstr "" + +#: ../../library/gettext.rst:45 +msgid "" +"If *localedir* is omitted or ``None``, then the current binding for *domain*" +" is returned. [#]_" +msgstr "如果遗漏了 *localedir* 或者设置为 ``None``,那么将返回当前 *domain* 所绑定的值 [#]_" + +#: ../../library/gettext.rst:51 +msgid "" +"Change or query the current global domain. If *domain* is ``None``, then " +"the current global domain is returned, otherwise the global domain is set to" +" *domain*, which is returned." +msgstr "" +"修改或查询当前的全局域。如果 *domain* 为 ``None``,则返回当前的全局域,不为 ``None`` 则将全局域设置为 " +"*domain*,并返回它。" + +#: ../../library/gettext.rst:59 +msgid "" +"Return the localized translation of *message*, based on the current global " +"domain, language, and locale directory. This function is usually aliased as" +" :func:`!_` in the local namespace (see examples below)." +msgstr "" +"返回 *message* 的本地化翻译,依据当前的全局域、语言和语言区域目录。本函数在局部命名空间中通常包含别名 :func:`!_` " +"(参见下面的示例)。" + +#: ../../library/gettext.rst:66 +msgid "" +"Like :func:`.gettext`, but look the message up in the specified *domain*." +msgstr "与 :func:`.gettext` 类似,但在指定的 *domain* 中查找消息。" + +#: ../../library/gettext.rst:71 +msgid "" +"Like :func:`.gettext`, but consider plural forms. If a translation is found," +" apply the plural formula to *n*, and return the resulting message (some " +"languages have more than two plural forms). If no translation is found, " +"return *singular* if *n* is 1; return *plural* otherwise." +msgstr "" +"与 :func:`.gettext` 类似,但考虑了复数形式。如果找到了翻译,则将 *n* " +"代入复数公式,然后返回得出的消息(某些语言具有两种以上的复数形式)。如果未找到翻译,则 *n* 为 1 时返回 *singular*,为其他数时返回 " +"*plural*." + +#: ../../library/gettext.rst:76 +msgid "" +"The Plural formula is taken from the catalog header. It is a C or Python " +"expression that has a free variable *n*; the expression evaluates to the " +"index of the plural in the catalog. See `the GNU gettext documentation " +"`__ for the " +"precise syntax to be used in :file:`.po` files and the formulas for a " +"variety of languages." +msgstr "" +"复数公式取自编目头文件。它是 C 或 Python 表达式,有一个自变量 *n*,该表达式计算的是所需复数形式在编目中的索引号。关于在 " +":file:`.po` 文件中使用的确切语法和各种语言的公式,请参阅 `GNU gettext 文档 " +"`__." + +#: ../../library/gettext.rst:86 +msgid "" +"Like :func:`ngettext`, but look the message up in the specified *domain*." +msgstr "与 :func:`ngettext` 类似,但在指定的 *domain* 中查找消息。" + +#: ../../library/gettext.rst:94 +msgid "" +"Similar to the corresponding functions without the ``p`` in the prefix (that" +" is, :func:`gettext`, :func:`dgettext`, :func:`ngettext`, " +":func:`dngettext`), but the translation is restricted to the given message " +"*context*." +msgstr "" +"与前缀中没有 ``p`` 的相应函数类似 (即 :func:`gettext`, :func:`dgettext`, :func:`ngettext`," +" :func:`dngettext`),但翻译限定在给定的消息 *context* 中。" + +#: ../../library/gettext.rst:101 +msgid "" +"Note that GNU :program:`gettext` also defines a :func:`!dcgettext` method, " +"but this was deemed not useful and so it is currently unimplemented." +msgstr "" +"请注意 GNU :program:`gettext` 还定义了一个 :func:`!dcgettext` 方法,但它被认为并不实用因此目前尚未实现它。" + +#: ../../library/gettext.rst:104 +msgid "Here's an example of typical usage for this API::" +msgstr "这是该 API 的典型用法示例::" + +#: ../../library/gettext.rst:106 +msgid "" +"import gettext\n" +"gettext.bindtextdomain('myapplication', '/path/to/my/language/directory')\n" +"gettext.textdomain('myapplication')\n" +"_ = gettext.gettext\n" +"# ...\n" +"print(_('This is a translatable string.'))" +msgstr "" +"import gettext\n" +"gettext.bindtextdomain('myapplication', '/path/to/my/language/directory')\n" +"gettext.textdomain('myapplication')\n" +"_ = gettext.gettext\n" +"# ...\n" +"print(_('This is a translatable string.'))" + +#: ../../library/gettext.rst:115 +msgid "Class-based API" +msgstr "基于类的 API" + +#: ../../library/gettext.rst:117 +msgid "" +"The class-based API of the :mod:`!gettext` module gives you more flexibility" +" and greater convenience than the GNU :program:`gettext` API. It is the " +"recommended way of localizing your Python applications and modules. " +":mod:`!gettext` defines a :class:`GNUTranslations` class which implements " +"the parsing of GNU :file:`.mo` format files, and has methods for returning " +"strings. Instances of this class can also install themselves in the built-in" +" namespace as the function :func:`!_`." +msgstr "" + +#: ../../library/gettext.rst:127 +msgid "" +"This function implements the standard :file:`.mo` file search algorithm. It" +" takes a *domain*, identical to what :func:`textdomain` takes. Optional " +"*localedir* is as in :func:`bindtextdomain`. Optional *languages* is a list " +"of strings, where each string is a language code." +msgstr "" +"本函数实现了标准的 :file:`.mo` 文件搜索算法。它接受一个 *domain*,它与 :func:`textdomain` " +"接受的域相同。可选参数 *localedir* 与 :func:`bindtextdomain` 中的相同。可选参数 *languages* " +"是多条字符串的列表,其中每条字符串都是一种语言代码。" + +#: ../../library/gettext.rst:132 +msgid "" +"If *localedir* is not given, then the default system locale directory is " +"used. [#]_ If *languages* is not given, then the following environment " +"variables are searched: :envvar:`LANGUAGE`, :envvar:`LC_ALL`, " +":envvar:`LC_MESSAGES`, and :envvar:`LANG`. The first one returning a non-" +"empty value is used for the *languages* variable. The environment variables " +"should contain a colon separated list of languages, which will be split on " +"the colon to produce the expected list of language code strings." +msgstr "" +"如果没有传入 *localedir*,则使用默认的系统语言环境目录。 [#]_ 如果没有传入 " +"*languages*,则搜索以下环境变量::envvar:`LANGUAGE`、:envvar:`LC_ALL`、:envvar:`LC_MESSAGES`" +" 和 :envvar:`LANG`。从这些变量返回的第一个非空值将用作 *languages* " +"变量。环境变量应包含一个语言列表,由冒号分隔,该列表会被按冒号拆分,以产生所需的语言代码字符串列表。" + +#: ../../library/gettext.rst:140 +msgid "" +":func:`find` then expands and normalizes the languages, and then iterates " +"through them, searching for an existing file built of these components:" +msgstr ":func:`find` 将扩展并规范化 language,然后遍历它们,搜索由这些组件构建的现有文件:" + +#: ../../library/gettext.rst:143 +msgid ":file:`{localedir}/{language}/LC_MESSAGES/{domain}.mo`" +msgstr ":file:`{localedir}/{language}/LC_MESSAGES/{domain}.mo`" + +#: ../../library/gettext.rst:145 +msgid "" +"The first such file name that exists is returned by :func:`find`. If no such" +" file is found, then ``None`` is returned. If *all* is given, it returns a " +"list of all file names, in the order in which they appear in the languages " +"list or the environment variables." +msgstr "" +":func:`find` 返回找到类似的第一个文件名。如果找不到这样的文件,则返回 ``None``。如果传入了 " +"*all*,它将返回一个列表,包含所有文件名,并按它们在语言列表或环境变量中出现的顺序排列。" + +#: ../../library/gettext.rst:153 +msgid "" +"Return a ``*Translations`` instance based on the *domain*, *localedir*, and " +"*languages*, which are first passed to :func:`find` to get a list of the " +"associated :file:`.mo` file paths. Instances with identical :file:`.mo` " +"file names are cached. The actual class instantiated is *class_* if " +"provided, otherwise :class:`GNUTranslations`. The class's constructor must " +"take a single :term:`file object` argument." +msgstr "" +"根据 *domain*, *localedir* 和 *languages* 返回一个 ``*Translations`` 实例,它们将首先被传给 " +":func:`find` 以获取由所关联的 :file:`.mo` 文件路径组成的列表。具有相同 :file:`.mo` 文件名的实例会被缓存。 " +"如果提供了 *class_* 则它将是被实例化的类,否则将是 :class:`GNUTranslations`。该类的构造器必须接受一个 " +":term:`file object` 参数。" + +#: ../../library/gettext.rst:160 +msgid "" +"If multiple files are found, later files are used as fallbacks for earlier " +"ones. To allow setting the fallback, :func:`copy.copy` is used to clone each" +" translation object from the cache; the actual instance data is still shared" +" with the cache." +msgstr "" +"如果找到多个文件,后找到的文件将用作先前文件的替补。为了设置替补,将使用 :func:`copy.copy` 从缓存中克隆每个 translation " +"对象。实际的实例数据仍在缓存中共享。" + +#: ../../library/gettext.rst:165 +msgid "" +"If no :file:`.mo` file is found, this function raises :exc:`OSError` if " +"*fallback* is false (which is the default), and returns a " +":class:`NullTranslations` instance if *fallback* is true." +msgstr "" +"如果 :file:`.mo` 文件未找到,且 *fallback* 为 false(默认值),则本函数引发 :exc:`OSError` 异常,如果 " +"*fallback* 为 true,则返回一个 :class:`NullTranslations` 实例。" + +#: ../../library/gettext.rst:169 +msgid "" +":exc:`IOError` used to be raised, it is now an alias of :exc:`OSError`." +msgstr "过去触发的 :exc:`IOError`,现在是 :exc:`OSError` 的别名。" + +#: ../../library/gettext.rst:172 +msgid "*codeset* parameter is removed." +msgstr "*codeset* 形参已被移除。" + +#: ../../library/gettext.rst:177 +msgid "" +"This installs the function :func:`!_` in Python's builtins namespace, based " +"on *domain* and *localedir* which are passed to the function " +":func:`translation`." +msgstr "" +"这将在 Python 的内置命名空间中安装 :func:`!_` 函数,基于传给 :func:`translation` 函数的 *domain* 和 " +"*localedir*." + +#: ../../library/gettext.rst:180 +msgid "" +"For the *names* parameter, please see the description of the translation " +"object's :meth:`~NullTranslations.install` method." +msgstr "" +"*names* 参数的信息请参阅 translation 对象的 :meth:`~NullTranslations.install` 方法的描述。" + +#: ../../library/gettext.rst:183 +msgid "" +"As seen below, you usually mark the strings in your application that are " +"candidates for translation, by wrapping them in a call to the :func:`!_` " +"function, like this::" +msgstr "如下所示,通常是将字符串包裹在对 :func:`!_` 函数的调用中,以标记应用程序中待翻译的字符串,就像这样::" + +#: ../../library/gettext.rst:187 +msgid "print(_('This string will be translated.'))" +msgstr "print(_('This string will be translated.'))" + +#: ../../library/gettext.rst:189 +msgid "" +"For convenience, you want the :func:`!_` function to be installed in " +"Python's builtins namespace, so it is easily accessible in all modules of " +"your application." +msgstr "为了方便,可将 :func:`!_` 函数安装在 Python 的内置命名空间中,这样就可以在应用程序的所有模块中轻松地访问它。" + +#: ../../library/gettext.rst:193 +msgid "*names* is now a keyword-only parameter." +msgstr "*names* 现在是仅限关键字形参。" + +#: ../../library/gettext.rst:197 +msgid "The :class:`NullTranslations` class" +msgstr ":class:`NullTranslations` 类" + +#: ../../library/gettext.rst:199 +msgid "" +"Translation classes are what actually implement the translation of original " +"source file message strings to translated message strings. The base class " +"used by all translation classes is :class:`NullTranslations`; this provides " +"the basic interface you can use to write your own specialized translation " +"classes. Here are the methods of :class:`!NullTranslations`:" +msgstr "" +"translation 类实际实现的是,将原始源文件消息字符串转换为已翻译的消息字符串。所有 translation 类使用的基类为 " +":class:`NullTranslations`,它提供了基本的接口,可用于编写自己定制的 translation 类。以下是 " +":class:`!NullTranslations` 的方法:" + +#: ../../library/gettext.rst:208 +msgid "" +"Takes an optional :term:`file object` *fp*, which is ignored by the base " +"class. Initializes \"protected\" instance variables *_info* and *_charset* " +"which are set by derived classes, as well as *_fallback*, which is set " +"through :meth:`add_fallback`. It then calls ``self._parse(fp)`` if *fp* is " +"not ``None``." +msgstr "" +"接受一个可选参数 :term:`文件对象 ` *fp*,该参数会被基类忽略。初始化由派生类设置的 \"protected\" " +"(受保护的)实例变量 *_info* 和 *_charset*,以及 *_fallback*,后者是通过 :meth:`add_fallback` " +"来设置的。如果 *fp* 不为 ``None``,就会调用 ``self._parse(fp)``。" + +#: ../../library/gettext.rst:216 +msgid "" +"No-op in the base class, this method takes file object *fp*, and reads the " +"data from the file, initializing its message catalog. If you have an " +"unsupported message catalog file format, you should override this method to " +"parse your format." +msgstr "" +"在基类中没有操作,本方法接受文件对象 " +"*fp*,从该文件读取数据,用来初始化消息编目。如果你手头的消息编目文件的格式不受支持,则应重写本方法来解析你的格式。" + +#: ../../library/gettext.rst:224 +msgid "" +"Add *fallback* as the fallback object for the current translation object. A " +"translation object should consult the fallback if it cannot provide a " +"translation for a given message." +msgstr "" +"添加 *fallback* 为当前 translation 对象的替补对象。如果 translation 对象无法为指定消息提供翻译,则应向替补查询。" + +#: ../../library/gettext.rst:231 +msgid "" +"If a fallback has been set, forward :meth:`!gettext` to the fallback. " +"Otherwise, return *message*. Overridden in derived classes." +msgstr "如果设置了替补,则转发 :meth:`!gettext` 给替补。否则返回 *message*。在派生类中被重写。" + +#: ../../library/gettext.rst:237 +msgid "" +"If a fallback has been set, forward :meth:`!ngettext` to the fallback. " +"Otherwise, return *singular* if *n* is 1; return *plural* otherwise. " +"Overridden in derived classes." +msgstr "" +"如果设置了替补,则转发 :meth:`!ngettext` 给替补。否则,*n* 为 1 时返回 *singular*,为其他时返回 " +"*plural*。在派生类中被重写。" + +#: ../../library/gettext.rst:244 +msgid "" +"If a fallback has been set, forward :meth:`pgettext` to the fallback. " +"Otherwise, return the translated message. Overridden in derived classes." +msgstr "如果设置了替补,则转发 :meth:`pgettext` 给替补。否则返回已翻译的消息。在派生类中被重写。" + +#: ../../library/gettext.rst:252 +msgid "" +"If a fallback has been set, forward :meth:`npgettext` to the fallback. " +"Otherwise, return the translated message. Overridden in derived classes." +msgstr "如果设置了替补,则转发 :meth:`npgettext` 给替补。否则返回已翻译的消息。在派生类中被重写。" + +#: ../../library/gettext.rst:260 +msgid "" +"Return a dictionary containing the metadata found in the message catalog " +"file." +msgstr "返回一个包含在消息编目文件中找到的元数据的字典。" + +#: ../../library/gettext.rst:266 +msgid "Return the encoding of the message catalog file." +msgstr "返回消息编目文件的编码。" + +#: ../../library/gettext.rst:271 +msgid "" +"This method installs :meth:`.gettext` into the built-in namespace, binding " +"it to ``_``." +msgstr "本方法将 :meth:`.gettext` 安装至内建命名空间,并绑定为 ``_``。" + +#: ../../library/gettext.rst:274 +msgid "" +"If the *names* parameter is given, it must be a sequence containing the " +"names of functions you want to install in the builtins namespace in addition" +" to :func:`!_`. Supported names are ``'gettext'``, ``'ngettext'``, " +"``'pgettext'``, and ``'npgettext'``." +msgstr "" +"如果给出了 *names* 形参,则它必须是一个包含除 :func:`!_` 外需要在内置命名空间中安装的函数的名称的序列。受支持的名称有 " +"``'gettext'``, ``'ngettext'``, ``'pgettext'`` 和 ``'npgettext'``。" + +#: ../../library/gettext.rst:279 +msgid "" +"Note that this is only one way, albeit the most convenient way, to make the " +":func:`!_` function available to your application. Because it affects the " +"entire application globally, and specifically the built-in namespace, " +"localized modules should never install :func:`!_`. Instead, they should use " +"this code to make :func:`!_` available to their module::" +msgstr "" +"请注意这只是将 :func:`!_` 函数提供给应用程序的一种方式,尽管也是最方便的方式。 " +"由于它会全局性地影响整个应用程序,特别是内置命名空间,因此本地化的模块绝不应安装 :func:`!_`。作为替代,它们应使用以下代码使 " +":func:`!_` 可用于它们的模块::" + +#: ../../library/gettext.rst:285 +msgid "" +"import gettext\n" +"t = gettext.translation('mymodule', ...)\n" +"_ = t.gettext" +msgstr "" +"import gettext\n" +"t = gettext.translation('mymodule', ...)\n" +"_ = t.gettext" + +#: ../../library/gettext.rst:289 +msgid "" +"This puts :func:`!_` only in the module's global namespace and so only " +"affects calls within this module." +msgstr "这样只把 :func:`!_` 放在模块的全局命名空间中所以只会影响该模块内的调用。" + +#: ../../library/gettext.rst:292 +msgid "Added ``'pgettext'`` and ``'npgettext'``." +msgstr "添加了 ``'pgettext'`` 和 ``'npgettext'``。" + +#: ../../library/gettext.rst:297 +msgid "The :class:`GNUTranslations` class" +msgstr ":class:`GNUTranslations` 类" + +#: ../../library/gettext.rst:299 +msgid "" +"The :mod:`!gettext` module provides one additional class derived from " +":class:`NullTranslations`: :class:`GNUTranslations`. This class overrides " +":meth:`!_parse` to enable reading GNU :program:`gettext` format :file:`.mo` " +"files in both big-endian and little-endian format." +msgstr "" +":mod:`!gettext` 模块提供了一个派生自 :class:`NullTranslations` " +"的附加类::class:`GNUTranslations`。该类重写了 :meth:`!_parse` 以同时支持以大端序和小端序格式读取 GNU " +":program:`gettext` 格式的 :file:`.mo` 文件。" + +#: ../../library/gettext.rst:304 +msgid "" +":class:`GNUTranslations` parses optional metadata out of the translation " +"catalog. It is convention with GNU :program:`gettext` to include metadata as" +" the translation for the empty string. This metadata is in :rfc:`822`\\ " +"-style ``key: value`` pairs, and should contain the ``Project-Id-Version`` " +"key. If the key ``Content-Type`` is found, then the ``charset`` property is" +" used to initialize the \"protected\" :attr:`!_charset` instance variable, " +"defaulting to ``None`` if not found. If the charset encoding is specified, " +"then all message ids and message strings read from the catalog are converted" +" to Unicode using this encoding, else ASCII is assumed." +msgstr "" +":class:`GNUTranslations` 会从翻译编目中解析可选的元数据。根据惯例 GNU :program:`gettext` " +"会以空字符串翻译的形式包括元数据。该元数据使用 :rfc:`822` 风格的 ``key: value`` 对,并且应当包含 ``Project-Id-" +"Version`` 键。如果找到了 ``Content-Type`` 键,则将使用 ``charset`` 属性来初始化 " +":attr:`!_charset` 实例变量,如未找到则默认为 ``None``。如果指定了 charset 编码格式,则从编目中读取的所有消息 ID " +"和消息字符串都将使用该编码格式转换为 Unicode,否则会设定使用 ASCII。" + +#: ../../library/gettext.rst:314 +msgid "" +"Since message ids are read as Unicode strings too, all ``*gettext()`` " +"methods will assume message ids as Unicode strings, not byte strings." +msgstr "" +"由于消息 ID 也是以 Unicode 字符串的形式读取的,因此所有 ``*gettext()`` 方法都会假定消息 ID 为 Unicode " +"字符串,而不是字节串。" + +#: ../../library/gettext.rst:317 +msgid "" +"The entire set of key/value pairs are placed into a dictionary and set as " +"the \"protected\" :attr:`!_info` instance variable." +msgstr "整个键/值对集合将被放入一个字典并设置为 \"protected\" :attr:`!_info` 实例变量。" + +#: ../../library/gettext.rst:320 +msgid "" +"If the :file:`.mo` file's magic number is invalid, the major version number " +"is unexpected, or if other problems occur while reading the file, " +"instantiating a :class:`GNUTranslations` class can raise :exc:`OSError`." +msgstr "" +"如果 :file:`.mo` 文件的魔法值 (magic number) 无效,或遇到意外的主版本号,或在读取文件时发生其他问题,则实例化 " +":class:`GNUTranslations` 类会引发 :exc:`OSError`。" + +#: ../../library/gettext.rst:326 +msgid "" +"The following methods are overridden from the base class implementation:" +msgstr "下列方法是根据基类实现重写的:" + +#: ../../library/gettext.rst:330 +msgid "" +"Look up the *message* id in the catalog and return the corresponding message" +" string, as a Unicode string. If there is no entry in the catalog for the " +"*message* id, and a fallback has been set, the look up is forwarded to the " +"fallback's :meth:`~NullTranslations.gettext` method. Otherwise, the " +"*message* id is returned." +msgstr "" +"在编目中查找 *message* ID,并以 Unicode 字符串形式返回相应的消息字符串。如果在编目中没有 *message* ID " +"条目,且配置了替补,则查找请求将被转发到替补的 :meth:`~NullTranslations.gettext` 方法。否则,返回 *message*" +" ID." + +#: ../../library/gettext.rst:339 +msgid "" +"Do a plural-forms lookup of a message id. *singular* is used as the message" +" id for purposes of lookup in the catalog, while *n* is used to determine " +"which plural form to use. The returned message string is a Unicode string." +msgstr "" +"查找消息 ID 的复数形式。*singular* 用作消息 ID,用于在编目中查找,同时 *n* 用于确定使用哪种复数形式。返回的消息字符串是 " +"Unicode 字符串。" + +#: ../../library/gettext.rst:343 +msgid "" +"If the message id is not found in the catalog, and a fallback is specified, " +"the request is forwarded to the fallback's " +":meth:`~NullTranslations.ngettext` method. Otherwise, when *n* is 1 " +"*singular* is returned, and *plural* is returned in all other cases." +msgstr "" +"如果在编目中没有找到消息 ID,且配置了替补,则查找请求将被转发到替补的 :meth:`~NullTranslations.ngettext` " +"方法。否则,当 *n* 为 1 时返回 *singular*,其他情况返回 *plural*。" + +#: ../../library/gettext.rst:348 +msgid "Here is an example::" +msgstr "例如:" + +#: ../../library/gettext.rst:350 +msgid "" +"n = len(os.listdir('.'))\n" +"cat = GNUTranslations(somefile)\n" +"message = cat.ngettext(\n" +" 'There is %(num)d file in this directory',\n" +" 'There are %(num)d files in this directory',\n" +" n) % {'num': n}" +msgstr "" +"n = len(os.listdir('.'))\n" +"cat = GNUTranslations(somefile)\n" +"message = cat.ngettext(\n" +" 'There is %(num)d file in this directory',\n" +" 'There are %(num)d files in this directory',\n" +" n) % {'num': n}" + +#: ../../library/gettext.rst:360 +msgid "" +"Look up the *context* and *message* id in the catalog and return the " +"corresponding message string, as a Unicode string. If there is no entry in " +"the catalog for the *message* id and *context*, and a fallback has been set," +" the look up is forwarded to the fallback's :meth:`pgettext` method. " +"Otherwise, the *message* id is returned." +msgstr "" +"在编目中查找 *context* 和 *message* ID,并以 Unicode 字符串形式返回相应的消息字符串。如果在编目中没有 " +"*message* ID 和 *context* 条目,且配置了替补,则查找请求将被转发到替补的 :meth:`pgettext` 方法。否则,返回 " +"*message* ID." + +#: ../../library/gettext.rst:371 +msgid "" +"Do a plural-forms lookup of a message id. *singular* is used as the message" +" id for purposes of lookup in the catalog, while *n* is used to determine " +"which plural form to use." +msgstr "查找消息 ID 的复数形式。*singular* 用作消息 ID,用于在编目中查找,同时 *n* 用于确定使用哪种复数形式。" + +#: ../../library/gettext.rst:375 +msgid "" +"If the message id for *context* is not found in the catalog, and a fallback " +"is specified, the request is forwarded to the fallback's :meth:`npgettext` " +"method. Otherwise, when *n* is 1 *singular* is returned, and *plural* is " +"returned in all other cases." +msgstr "" +"如果在编目中没有找到 *context* 对应的消息 ID,且配置了替补,则查找请求将被转发到替补的 :meth:`npgettext` 方法。否则,当" +" *n* 为 1 时返回 *singular*,其他情况返回 *plural*。" + +#: ../../library/gettext.rst:384 +msgid "Solaris message catalog support" +msgstr "Solaris 消息编目支持" + +#: ../../library/gettext.rst:386 +msgid "" +"The Solaris operating system defines its own binary :file:`.mo` file format," +" but since no documentation can be found on this format, it is not supported" +" at this time." +msgstr "Solaris 操作系统定义了自己的二进制 :file:`.mo` 文件格式,但由于找不到该格式的文档,因此目前不支持该格式。" + +#: ../../library/gettext.rst:392 +msgid "The Catalog constructor" +msgstr "编目构造器" + +#: ../../library/gettext.rst:396 +msgid "" +"GNOME uses a version of the :mod:`!gettext` module by James Henstridge, but " +"this version has a slightly different API. Its documented usage was::" +msgstr "" + +#: ../../library/gettext.rst:399 +msgid "" +"import gettext\n" +"cat = gettext.Catalog(domain, localedir)\n" +"_ = cat.gettext\n" +"print(_('hello world'))" +msgstr "" +"import gettext\n" +"cat = gettext.Catalog(domain, localedir)\n" +"_ = cat.gettext\n" +"print(_('hello world'))" + +#: ../../library/gettext.rst:404 +msgid "" +"For compatibility with this older module, the function :func:`!Catalog` is " +"an alias for the :func:`translation` function described above." +msgstr "为了与此模块的旧版本兼容,函数 :func:`!Catalog` 是上述 :func:`translation` 函数的别名。" + +#: ../../library/gettext.rst:407 +msgid "" +"One difference between this module and Henstridge's: his catalog objects " +"supported access through a mapping API, but this appears to be unused and so" +" is not currently supported." +msgstr "" +"本模块与 Henstridge 的模块有一个区别:他的编目对象支持通过映射 API 进行访问,但是该特性似乎从未使用过,因此目前不支持该特性。" + +#: ../../library/gettext.rst:414 +msgid "Internationalizing your programs and modules" +msgstr "国际化 (I18N) 你的程序和模块" + +#: ../../library/gettext.rst:416 +msgid "" +"Internationalization (I18N) refers to the operation by which a program is " +"made aware of multiple languages. Localization (L10N) refers to the " +"adaptation of your program, once internationalized, to the local language " +"and cultural habits. In order to provide multilingual messages for your " +"Python programs, you need to take the following steps:" +msgstr "" +"国际化 (I18N) 是指使程序可切换多种语言的操作。本地化 (L10N) 是指程序的适配能力,一旦程序被国际化,就能适配当地的语言和文化习惯。为了向 " +"Python 程序提供不同语言的消息,需要执行以下步骤:" + +#: ../../library/gettext.rst:422 +msgid "" +"prepare your program or module by specially marking translatable strings" +msgstr "准备程序或模块,将可翻译的字符串特别标记起来" + +#: ../../library/gettext.rst:424 +msgid "" +"run a suite of tools over your marked files to generate raw messages " +"catalogs" +msgstr "在已标记的文件上运行一套工具,用来生成原始消息编目" + +#: ../../library/gettext.rst:426 +msgid "create language-specific translations of the message catalogs" +msgstr "创建消息编目的不同语言的翻译" + +#: ../../library/gettext.rst:428 +msgid "" +"use the :mod:`!gettext` module so that message strings are properly " +"translated" +msgstr "" + +#: ../../library/gettext.rst:430 +msgid "" +"In order to prepare your code for I18N, you need to look at all the strings " +"in your files. Any string that needs to be translated should be marked by " +"wrapping it in ``_('...')`` --- that is, a call to the function :func:`_ " +"`. For example::" +msgstr "" +"为了准备代码以实现 I18N,你需要查看文件中的所有字符串。任何需要翻译的字符串都应通过包裹在 ``_('...')`` 中来进行标记 --- " +"即调用函数 :func:`_ `。例如::" + +#: ../../library/gettext.rst:434 +msgid "" +"filename = 'mylog.txt'\n" +"message = _('writing a log message')\n" +"with open(filename, 'w') as fp:\n" +" fp.write(message)" +msgstr "" +"filename = 'mylog.txt'\n" +"message = _('writing a log message')\n" +"with open(filename, 'w') as fp:\n" +" fp.write(message)" + +#: ../../library/gettext.rst:439 +msgid "" +"In this example, the string ``'writing a log message'`` is marked as a " +"candidate for translation, while the strings ``'mylog.txt'`` and ``'w'`` are" +" not." +msgstr "" +"在这个例子中,字符串 ``'writing a log message'`` 被标记为待翻译,而字符串 ``'mylog.txt'`` 和 " +"``'w'`` 没有被标记。" + +#: ../../library/gettext.rst:442 +msgid "" +"There are a few tools to extract the strings meant for translation. The " +"original GNU :program:`gettext` only supported C or C++ source code but its " +"extended version :program:`xgettext` scans code written in a number of " +"languages, including Python, to find strings marked as translatable. `Babel" +" `__ is a Python internationalization library that" +" includes a :file:`pybabel` script to extract and compile message catalogs." +" François Pinard's program called :program:`xpot` does a similar job and is" +" available as part of his `po-utils package `__." +msgstr "" +"有一些工具可以将待翻译的字符串提取出来。原版的 GNU :program:`gettext` 仅支持 C 或 C++ 源代码,但其扩展版 " +":program:`xgettext` 可以扫描多种语言的代码,包括 Python 在内,来找出标记为可翻译的字符串。`Babel " +"`__ 是一个包括了可用于提取并编译消息编目的 :file:`pybabel` 脚本的 Python" +" 国际化库。François Pinard 的 :program:`xpot` 程序也能完成类似的工作并可在他的 `po-utils 包 " +"`__ 中获取。" + +#: ../../library/gettext.rst:452 +msgid "" +"(Python also includes pure-Python versions of these programs, called " +":program:`pygettext.py` and :program:`msgfmt.py`; some Python distributions " +"will install them for you. :program:`pygettext.py` is similar to " +":program:`xgettext`, but only understands Python source code and cannot " +"handle other programming languages such as C or C++. :program:`pygettext.py`" +" supports a command-line interface similar to :program:`xgettext`; for " +"details on its use, run ``pygettext.py --help``. :program:`msgfmt.py` is " +"binary compatible with GNU :program:`msgfmt`. With these two programs, you " +"may not need the GNU :program:`gettext` package to internationalize your " +"Python applications.)" +msgstr "" +"(Python 还包括了这些程序的纯 Python 版本,称为 :program:`pygettext.py` 和 " +":program:`msgfmt.py`,某些 Python 发行版已经安装了它们。:program:`pygettext.py` 类似于 " +":program:`xgettext`,但只能理解 Python 源代码,无法处理诸如 C 或 C++ " +"的其他编程语言。:program:`pygettext.py` 支持的命令行界面类似于 :program:`xgettext`,查看其详细用法请运行 " +"``pygettext.py --help``。:program:`msgfmt.py` 与 GNU :program:`msgfmt` " +"是二进制兼容的。有了这两个程序,可以不需要 GNU :program:`gettext` 包来国际化 Python 应用程序。)" + +#: ../../library/gettext.rst:464 +msgid "" +":program:`xgettext`, :program:`pygettext`, and similar tools generate " +":file:`.po` files that are message catalogs. They are structured human-" +"readable files that contain every marked string in the source code, along " +"with a placeholder for the translated versions of these strings." +msgstr "" +":program:`xgettext`、:program:`pygettext` 或类似工具生成的 :file:`.po` " +"文件就是消息编目。它们是结构化的人类可读文件,包含源代码中所有被标记的字符串,以及这些字符串的翻译的占位符。" + +#: ../../library/gettext.rst:470 +msgid "" +"Copies of these :file:`.po` files are then handed over to the individual " +"human translators who write translations for every supported natural " +"language. They send back the completed language-specific versions as a " +":file:`.po` file that's compiled into a machine-readable " +":file:`.mo` binary catalog file using the :program:`msgfmt` program. The " +":file:`.mo` files are used by the :mod:`!gettext` module for the actual " +"translation processing at run-time." +msgstr "" + +#: ../../library/gettext.rst:479 +msgid "" +"How you use the :mod:`!gettext` module in your code depends on whether you " +"are internationalizing a single module or your entire application. The next " +"two sections will discuss each case." +msgstr "" + +#: ../../library/gettext.rst:485 +msgid "Localizing your module" +msgstr "本地化你的模块" + +#: ../../library/gettext.rst:487 +msgid "" +"If you are localizing your module, you must take care not to make global " +"changes, e.g. to the built-in namespace. You should not use the GNU " +":program:`gettext` API but instead the class-based API." +msgstr "" +"如果要本地化模块,则切忌进行全局性的更改,如更改内建命名空间。不应使用 GNU :program:`gettext` API,而应使用基于类的 API。" + +#: ../../library/gettext.rst:491 +msgid "" +"Let's say your module is called \"spam\" and the module's various natural " +"language translation :file:`.mo` files reside in :file:`/usr/share/locale` " +"in GNU :program:`gettext` format. Here's what you would put at the top of " +"your module::" +msgstr "" +"假设你的模块叫做 \"spam\",并且该模块的各种自然语言翻译 :file:`.mo` 文件存放于 " +":file:`/usr/share/locale`,为 GNU :program:`gettext` 格式。以下内容应放在模块顶部::" + +#: ../../library/gettext.rst:496 +msgid "" +"import gettext\n" +"t = gettext.translation('spam', '/usr/share/locale')\n" +"_ = t.gettext" +msgstr "" +"import gettext\n" +"t = gettext.translation('spam', '/usr/share/locale')\n" +"_ = t.gettext" + +#: ../../library/gettext.rst:502 +msgid "Localizing your application" +msgstr "本地化你的应用程序" + +#: ../../library/gettext.rst:504 +msgid "" +"If you are localizing your application, you can install the :func:`!_` " +"function globally into the built-in namespace, usually in the main driver " +"file of your application. This will let all your application-specific files" +" just use ``_('...')`` without having to explicitly install it in each file." +msgstr "" +"如果你正在本地化你的应用程序,你可以将 :func:`!_` 函数全局安装到内置命名空间中,通常位于应用程序的主驱动文件内。 " +"这样将让你的应用程序专属的所有文件都可以使用 ``_('...')`` 而无需在每个文件中显式安装它。" + +#: ../../library/gettext.rst:509 +msgid "" +"In the simple case then, you need only add the following bit of code to the " +"main driver file of your application::" +msgstr "最简单的情况,就只需将以下代码添加到应用程序的主程序文件中::" + +#: ../../library/gettext.rst:512 +msgid "" +"import gettext\n" +"gettext.install('myapplication')" +msgstr "" +"import gettext\n" +"gettext.install('myapplication')" + +#: ../../library/gettext.rst:515 +msgid "" +"If you need to set the locale directory, you can pass it into the " +":func:`install` function::" +msgstr "如果需要设置语言环境目录,可以将其传递给 :func:`install` 函数::" + +#: ../../library/gettext.rst:518 +msgid "" +"import gettext\n" +"gettext.install('myapplication', '/usr/share/locale')" +msgstr "" +"import gettext\n" +"gettext.install('myapplication', '/usr/share/locale')" + +#: ../../library/gettext.rst:523 +msgid "Changing languages on the fly" +msgstr "即时更改语言" + +#: ../../library/gettext.rst:525 +msgid "" +"If your program needs to support many languages at the same time, you may " +"want to create multiple translation instances and then switch between them " +"explicitly, like so::" +msgstr "如果程序需要同时支持多种语言,则可能需要创建多个翻译实例,然后在它们之间进行显式切换,如下所示::" + +#: ../../library/gettext.rst:529 +msgid "" +"import gettext\n" +"\n" +"lang1 = gettext.translation('myapplication', languages=['en'])\n" +"lang2 = gettext.translation('myapplication', languages=['fr'])\n" +"lang3 = gettext.translation('myapplication', languages=['de'])\n" +"\n" +"# start by using language1\n" +"lang1.install()\n" +"\n" +"# ... time goes by, user selects language 2\n" +"lang2.install()\n" +"\n" +"# ... more time goes by, user selects language 3\n" +"lang3.install()" +msgstr "" +"import gettext\n" +"\n" +"lang1 = gettext.translation('myapplication', languages=['en'])\n" +"lang2 = gettext.translation('myapplication', languages=['fr'])\n" +"lang3 = gettext.translation('myapplication', languages=['de'])\n" +"\n" +"# 从使用语言 1 开始\n" +"lang1.install()\n" +"\n" +"# ... 过一段时间后,用户选择了语言 2\n" +"lang2.install()\n" +"\n" +"# ... 再过一段时间后,用户选择了语言 3\n" +"lang3.install()" + +#: ../../library/gettext.rst:546 +msgid "Deferred translations" +msgstr "延迟翻译" + +#: ../../library/gettext.rst:548 +msgid "" +"In most coding situations, strings are translated where they are coded. " +"Occasionally however, you need to mark strings for translation, but defer " +"actual translation until later. A classic example is::" +msgstr "在大多数代码中,字符串会在编写位置进行翻译。但偶尔需要将字符串标记为待翻译,实际翻译却推迟到后面。一个典型的例子是::" + +#: ../../library/gettext.rst:552 +msgid "" +"animals = ['mollusk',\n" +" 'albatross',\n" +" 'rat',\n" +" 'penguin',\n" +" 'python', ]\n" +"# ...\n" +"for a in animals:\n" +" print(a)" +msgstr "" +"animals = ['mollusk',\n" +" 'albatross',\n" +" 'rat',\n" +" 'penguin',\n" +" 'python', ]\n" +"# ...\n" +"for a in animals:\n" +" print(a)" + +#: ../../library/gettext.rst:561 +msgid "" +"Here, you want to mark the strings in the ``animals`` list as being " +"translatable, but you don't actually want to translate them until they are " +"printed." +msgstr "此处希望将 ``animals`` 列表中的字符串标记为可翻译,但不希望在打印之前对它们进行翻译。" + +#: ../../library/gettext.rst:565 +msgid "Here is one way you can handle this situation::" +msgstr "这是处理该情况的一种方式::" + +#: ../../library/gettext.rst:567 +msgid "" +"def _(message): return message\n" +"\n" +"animals = [_('mollusk'),\n" +" _('albatross'),\n" +" _('rat'),\n" +" _('penguin'),\n" +" _('python'), ]\n" +"\n" +"del _\n" +"\n" +"# ...\n" +"for a in animals:\n" +" print(_(a))" +msgstr "" +"def _(message): return message\n" +"\n" +"animals = [_('mollusk'),\n" +" _('albatross'),\n" +" _('rat'),\n" +" _('penguin'),\n" +" _('python'), ]\n" +"\n" +"del _\n" +"\n" +"# ...\n" +"for a in animals:\n" +" print(_(a))" + +#: ../../library/gettext.rst:581 +msgid "" +"This works because the dummy definition of :func:`!_` simply returns the " +"string unchanged. And this dummy definition will temporarily override any " +"definition of :func:`!_` in the built-in namespace (until the :keyword:`del`" +" command). Take care, though if you have a previous definition of :func:`!_`" +" in the local namespace." +msgstr "" +"这样做是因为 :func:`!_` 的虚定义只是简单地原样返回字符串。并且这个虚定义将临时覆盖内置命名空间中任何的 :func:`!_` 定义(直到 " +":keyword:`del` 命令)。但是如果之前你在局部命名空间中已有 :func:`!_` 的定义,则需要特别注意。" + +#: ../../library/gettext.rst:587 +msgid "" +"Note that the second use of :func:`!_` will not identify \"a\" as being " +"translatable to the :program:`gettext` program, because the parameter is not" +" a string literal." +msgstr "" +"请注意在第二次使用 :func:`!_` 时将不会认为“a”可以由 :program:`gettext` 程序去翻译,因为该形参不是字符串字面值。" + +#: ../../library/gettext.rst:591 +msgid "Another way to handle this is with the following example::" +msgstr "解决该问题的另一种方法是下面这个例子::" + +#: ../../library/gettext.rst:593 +msgid "" +"def N_(message): return message\n" +"\n" +"animals = [N_('mollusk'),\n" +" N_('albatross'),\n" +" N_('rat'),\n" +" N_('penguin'),\n" +" N_('python'), ]\n" +"\n" +"# ...\n" +"for a in animals:\n" +" print(_(a))" +msgstr "" +"def N_(message): return message\n" +"\n" +"animals = [N_('mollusk'),\n" +" N_('albatross'),\n" +" N_('rat'),\n" +" N_('penguin'),\n" +" N_('python'), ]\n" +"\n" +"# ...\n" +"for a in animals:\n" +" print(_(a))" + +#: ../../library/gettext.rst:605 +msgid "" +"In this case, you are marking translatable strings with the function " +":func:`!N_`, which won't conflict with any definition of :func:`!_`. " +"However, you will need to teach your message extraction program to look for " +"translatable strings marked with :func:`!N_`. :program:`xgettext`, " +":program:`pygettext`, ``pybabel extract``, and :program:`xpot` all support " +"this through the use of the :option:`!-k` command-line switch. The choice of" +" :func:`!N_` here is totally arbitrary; it could have just as easily been " +":func:`!MarkThisStringForTranslation`." +msgstr "" +"在这种情况下,你用函数 :func:`!N_` 来标记可翻译的字符串,它与 :func:`!_` 的任何定义都不会冲突。 " +"不过,你需要让你的消息提取程序寻找用 :func:`!N_` 标记的可翻译字符串。 :program:`xgettext`, " +":program:`pygettext`, ``pybabel extract`` 和 :program:`xpot` 都通过使用 " +":option:`!-k` 命令行开关来支持此功能。这里选择用 :func:`!N_` 完全是任意的;它也可以简单地改为 " +":func:`!MarkThisStringForTranslation`." + +#: ../../library/gettext.rst:616 +msgid "Acknowledgements" +msgstr "致谢" + +#: ../../library/gettext.rst:618 +msgid "" +"The following people contributed code, feedback, design suggestions, " +"previous implementations, and valuable experience to the creation of this " +"module:" +msgstr "以下人员为创建此模块贡献了代码、反馈、设计建议、早期实现和宝贵的经验:" + +#: ../../library/gettext.rst:621 +msgid "Peter Funk" +msgstr "Peter Funk" + +#: ../../library/gettext.rst:623 +msgid "James Henstridge" +msgstr "James Henstridge" + +#: ../../library/gettext.rst:625 +msgid "Juan David Ibáñez Palomar" +msgstr "Juan David Ibáñez Palomar" + +#: ../../library/gettext.rst:627 +msgid "Marc-André Lemburg" +msgstr "Marc-André Lemburg" + +#: ../../library/gettext.rst:629 +msgid "Martin von Löwis" +msgstr "Martin von Löwis" + +#: ../../library/gettext.rst:631 +msgid "François Pinard" +msgstr "François Pinard" + +#: ../../library/gettext.rst:633 +msgid "Barry Warsaw" +msgstr "Barry Warsaw" + +#: ../../library/gettext.rst:635 +msgid "Gustavo Niemeyer" +msgstr "Gustavo Niemeyer" + +#: ../../library/gettext.rst:638 +msgid "Footnotes" +msgstr "备注" + +#: ../../library/gettext.rst:639 +msgid "" +"The default locale directory is system dependent; for example, on Red Hat " +"Linux it is :file:`/usr/share/locale`, but on Solaris it is " +":file:`/usr/lib/locale`. The :mod:`!gettext` module does not try to support " +"these system dependent defaults; instead its default is " +":file:`{sys.base_prefix}/share/locale` (see :data:`sys.base_prefix`). For " +"this reason, it is always best to call :func:`bindtextdomain` with an " +"explicit absolute path at the start of your application." +msgstr "" +"默认的语言区域目录取决于具体系统;例如,在 Red Hat Linux 上为 :file:`/usr/share/locale`,但在 Solaris " +"上则为 :file:`/usr/lib/locale`。 :mod:`!gettext` 模块没有试图支持这些依赖于系统的默认值;而是默认设为 " +":file:`{sys.base_prefix}/share/locale` (参见 :data:`sys.base_prefix`)。 " +"基于上述原因,最好每次都在程序启动时调用 :func:`bindtextdomain` 并附带一个显式的绝对路径。" + +#: ../../library/gettext.rst:647 +msgid "See the footnote for :func:`bindtextdomain` above." +msgstr "参阅上方 :func:`bindtextdomain` 的脚注。" + +#: ../../library/gettext.rst:56 +msgid "_ (underscore)" +msgstr "_ (下划线)" + +#: ../../library/gettext.rst:56 +msgid "gettext" +msgstr "gettext" + +#: ../../library/gettext.rst:394 +msgid "GNOME" +msgstr "GNOME" diff --git a/library/glob.po b/library/glob.po new file mode 100644 index 0000000000..0bce25ecbc --- /dev/null +++ b/library/glob.po @@ -0,0 +1,340 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-07 17:18+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/glob.rst:2 +msgid ":mod:`!glob` --- Unix style pathname pattern expansion" +msgstr ":mod:`!glob` --- Unix 风格的路径名模式扩展" + +#: ../../library/glob.rst:7 +msgid "**Source code:** :source:`Lib/glob.py`" +msgstr "**源代码:** :source:`Lib/glob.py`" + +#: ../../library/glob.rst:21 +msgid "" +"The :mod:`!glob` module finds pathnames using pattern matching rules similar" +" to the Unix shell. No tilde expansion is done, but ``*``, ``?``, and " +"character ranges expressed with ``[]`` will be correctly matched. This is " +"done by using the :func:`os.scandir` and :func:`fnmatch.fnmatch` functions " +"in concert, and not by actually invoking a subshell." +msgstr "" +":mod:`!glob` 模块会使用与 Unix shell 类似的模式匹配规则来查找路径名称。波浪号扩展不会生效,但 ``*``, ``?`` 以及用" +" ``[]`` 表示的字符范围将被正确地匹配。这是通过配合使用 :func:`os.scandir` 和 :func:`fnmatch.fnmatch`" +" 函数完成的,而不是通过实际唤起子 shell。" + +#: ../../library/glob.rst:29 +msgid "" +"The pathnames are returned in no particular order. If you need a specific " +"order, sort the results." +msgstr "路径名称不会以特定的顺序返回。如果你需要特定的顺序,请对结果进行排序。" + +#: ../../library/glob.rst:32 +msgid "" +"By default, files beginning with a dot (``.``) can only be matched by " +"patterns that also start with a dot, unlike :func:`fnmatch.fnmatch` or " +":func:`pathlib.Path.glob`. For tilde and shell variable expansion, use " +":func:`os.path.expanduser` and :func:`os.path.expandvars`." +msgstr "" + +#: ../../library/glob.rst:38 +msgid "" +"For a literal match, wrap the meta-characters in brackets. For example, " +"``'[?]'`` matches the character ``'?'``." +msgstr "对于字面值匹配,请将元字符用方括号括起来。例如,``'[?]'`` 将匹配字符 ``'?'``。" + +#: ../../library/glob.rst:41 +msgid "The :mod:`!glob` module defines the following functions:" +msgstr ":mod:`!glob` 模块定义了下列函数:" + +#: ../../library/glob.rst:47 +msgid "" +"Return a possibly empty list of path names that match *pathname*, which must" +" be a string containing a path specification. *pathname* can be either " +"absolute (like :file:`/usr/src/Python-1.5/Makefile`) or relative (like " +":file:`../../Tools/\\*/\\*.gif`), and can contain shell-style wildcards. " +"Broken symlinks are included in the results (as in the shell). Whether or " +"not the results are sorted depends on the file system. If a file that " +"satisfies conditions is removed or added during the call of this function, " +"whether a path name for that file will be included is unspecified." +msgstr "" +"返回一个匹配 *pathname* 的可能为空的路径名列表,其中的元素必须为包含路径信息的字符串。 *pathname* 可以是绝对路径 (如 " +":file:`/usr/src/Python-1.5/Makefile`) 或相对路径 (如 " +":file:`../../Tools/\\*/\\*.gif`),并可包含 shell 风格的通配符。无效的符号链接也将包括在结果中 (如像在 " +"shell 中一样)。结果是否排序取决于具体文件系统。如果某个符合条件的文件在调用此函数期间被移除或添加,是否包括该文件的路径是没有规定的。" + +#: ../../library/glob.rst:56 +msgid "" +"If *root_dir* is not ``None``, it should be a :term:`path-like object` " +"specifying the root directory for searching. It has the same effect on " +":func:`!glob` as changing the current directory before calling it. If " +"*pathname* is relative, the result will contain paths relative to " +"*root_dir*." +msgstr "" +"如果 *root_dir* 不为 ``None``,则它应当是一个指明要搜索的根目录的 :term:`path-like object`。它在 " +":func:`!glob` 上与在调用它之前改变当前目录有相同的效果。如果 *pathname* 为相对路径,结果将包含相对于 *root_dir* " +"的路径。" + +#: ../../library/glob.rst:62 +msgid "" +"This function can support :ref:`paths relative to directory descriptors " +"` with the *dir_fd* parameter." +msgstr "本函数带有 *dir_fd* 参数,支持 :ref:`基于目录描述符的相对路径 `。" + +#: ../../library/glob.rst:68 +msgid "" +"If *recursive* is true, the pattern \"``**``\" will match any files and zero" +" or more directories, subdirectories and symbolic links to directories. If " +"the pattern is followed by an :data:`os.sep` or :data:`os.altsep` then files" +" will not match." +msgstr "" +" 将匹配目录中的任何文件以及零个或多个目录、子目录和符号链接。如果模式加了一个 :data:`os.sep` 或 :data:`os.altsep` " +"则将不匹配文件。" + +#: ../../library/glob.rst:73 +msgid "" +"If *include_hidden* is true, wildcards can match path segments that begin " +"with a dot (``.``)." +msgstr "" + +#: ../../library/glob.rst:76 ../../library/glob.rst:108 +msgid "" +"Raises an :ref:`auditing event ` ``glob.glob`` with arguments " +"``pathname``, ``recursive``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``glob.glob`` 并附带参数 ``pathname``, ``recursive``。" + +#: ../../library/glob.rst:77 ../../library/glob.rst:109 +msgid "" +"Raises an :ref:`auditing event ` ``glob.glob/2`` with arguments " +"``pathname``, ``recursive``, ``root_dir``, ``dir_fd``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``glob.glob/2`` 并附带参数 ``pathname``, " +"``recursive``, ``root_dir``, ``dir_fd``." + +#: ../../library/glob.rst:80 +msgid "" +"Using the \"``**``\" pattern in large directory trees may consume an " +"inordinate amount of time." +msgstr "在一个较大的目录树中使用 \"``**``\" 模式可能会消耗非常多的时间。" + +#: ../../library/glob.rst:84 ../../library/glob.rst:112 +msgid "" +"This function may return duplicate path names if *pathname* contains " +"multiple \"``**``\" patterns and *recursive* is true." +msgstr "如果 *pathname* 包含多个 \"``**``\" 模式并且 *recursive* 为真值则此函数可能返回重复的路径名。" + +#: ../../library/glob.rst:88 ../../library/glob.rst:116 +msgid "" +"Any :exc:`OSError` exceptions raised from scanning the filesystem are " +"suppressed. This includes :exc:`PermissionError` when accessing directories " +"without read permission." +msgstr "" +"任何因扫描文件系统而引发的 :exc:`OSError` 异常都会被抑制。 这包括访问没有读取权限的目录时的 " +":exc:`PermissionError`。" + +#: ../../library/glob.rst:92 ../../library/glob.rst:120 +msgid "Support for recursive globs using \"``**``\"." +msgstr "支持使用 \"``**``\" 的递归 glob。" + +#: ../../library/glob.rst:95 ../../library/glob.rst:123 +msgid "Added the *root_dir* and *dir_fd* parameters." +msgstr "添加了 *root_dir* 和 *dir_fd* 形参。" + +#: ../../library/glob.rst:98 ../../library/glob.rst:126 +msgid "Added the *include_hidden* parameter." +msgstr "增加了 *include_hidden* 形参。" + +#: ../../library/glob.rst:105 +msgid "" +"Return an :term:`iterator` which yields the same values as :func:`glob` " +"without actually storing them all simultaneously." +msgstr "返回一个 :term:`iterator`,它会产生与 :func:`glob` 相同的结果,但不会实际地同时保存它们。" + +#: ../../library/glob.rst:132 +msgid "" +"Escape all special characters (``'?'``, ``'*'`` and ``'['``). This is useful" +" if you want to match an arbitrary literal string that may have special " +"characters in it. Special characters in drive/UNC sharepoints are not " +"escaped, for example on Windows ``escape('//?/c:/Quo vadis?.txt')`` returns " +"``'//?/c:/Quo vadis[?].txt'``." +msgstr "" + +#: ../../library/glob.rst:143 +msgid "" +"Convert the given path specification to a regular expression for use with " +":func:`re.match`. The path specification can contain shell-style wildcards." +msgstr "将给定的路径规格说明转换为一个正则表达式供 :func:`re.match` 使用。路径规格说明可以包含 shell 风格的通配符。" + +#: ../../library/glob.rst:146 +msgid "For example:" +msgstr "例如:" + +#: ../../library/glob.rst:157 +msgid "" +"Path separators and segments are meaningful to this function, unlike " +":func:`fnmatch.translate`. By default wildcards do not match path " +"separators, and ``*`` pattern segments match precisely one path segment." +msgstr "" +"路径分隔符与部件对该函数是有意义的,这与 :func:`fnmatch.translate` 不同。在默认情况下通配符不会匹配路径分隔符,而 ``*``" +" 模式部件将精确匹配一个路径部件。" + +#: ../../library/glob.rst:161 +msgid "" +"If *recursive* is true, the pattern segment \"``**``\" will match any number" +" of path segments." +msgstr "如果 *recursive* 为真值,则模式部件 \"``**``\" 将匹配任意数量的路径部件。" + +#: ../../library/glob.rst:164 +msgid "" +"If *include_hidden* is true, wildcards can match path segments that start " +"with a dot (``.``)." +msgstr "如果 *include_hidden* 为真值,则通配符可以匹配以点号 (``.``) 打头的路径部件。" + +#: ../../library/glob.rst:167 +msgid "" +"A sequence of path separators may be supplied to the *seps* argument. If not" +" given, :data:`os.sep` and :data:`~os.altsep` (if available) are used." +msgstr "" +"可以向 *seps* 参数提供一个由路径分隔符组成的序列。如果未给出,则将使用 :data:`os.sep` 和 :data:`~os.altsep` " +"(如果可用)。" + +#: ../../library/glob.rst:172 +msgid "" +":meth:`pathlib.PurePath.full_match` and :meth:`pathlib.Path.glob` methods, " +"which call this function to implement pattern matching and globbing." +msgstr "" +":meth:`pathlib.PurePath.full_match` 和 :meth:`pathlib.Path.glob` " +"方法,它们将调用此函数来实现模式匹配和 glob 操作。" + +#: ../../library/glob.rst:180 +msgid "Examples" +msgstr "例子" + +#: ../../library/glob.rst:182 +msgid "" +"Consider a directory containing the following files: :file:`1.gif`, " +":file:`2.txt`, :file:`card.gif` and a subdirectory :file:`sub` which " +"contains only the file :file:`3.txt`. :func:`glob` will produce the " +"following results. Notice how any leading components of the path are " +"preserved. ::" +msgstr "" +"考虑一个包含以下文件的目录::file:`1.gif`, :file:`2.txt`, :file:`card.gif` 以及一个子目录 " +":file:`sub` 且其中只包含一个文件 :file:`3.txt`。 :func:`glob` 将产生如下结果。 " +"请注意路径的任何开头部件都将被保留。 ::" + +#: ../../library/glob.rst:188 +msgid "" +">>> import glob\n" +">>> glob.glob('./[0-9].*')\n" +"['./1.gif', './2.txt']\n" +">>> glob.glob('*.gif')\n" +"['1.gif', 'card.gif']\n" +">>> glob.glob('?.gif')\n" +"['1.gif']\n" +">>> glob.glob('**/*.txt', recursive=True)\n" +"['2.txt', 'sub/3.txt']\n" +">>> glob.glob('./**/', recursive=True)\n" +"['./', './sub/']" +msgstr "" +">>> import glob\n" +">>> glob.glob('./[0-9].*')\n" +"['./1.gif', './2.txt']\n" +">>> glob.glob('*.gif')\n" +"['1.gif', 'card.gif']\n" +">>> glob.glob('?.gif')\n" +"['1.gif']\n" +">>> glob.glob('**/*.txt', recursive=True)\n" +"['2.txt', 'sub/3.txt']\n" +">>> glob.glob('./**/', recursive=True)\n" +"['./', './sub/']" + +#: ../../library/glob.rst:200 +msgid "" +"If the directory contains files starting with ``.`` they won't be matched by" +" default. For example, consider a directory containing :file:`card.gif` and " +":file:`.card.gif`::" +msgstr "" +"如果目录包含以 ``.`` 打头的文件,它们默认将不会被匹配。例如,考虑一个包含 :file:`card.gif` 和 " +":file:`.card.gif` 的目录::" + +#: ../../library/glob.rst:204 +msgid "" +">>> import glob\n" +">>> glob.glob('*.gif')\n" +"['card.gif']\n" +">>> glob.glob('.c*')\n" +"['.card.gif']" +msgstr "" +">>> import glob\n" +">>> glob.glob('*.gif')\n" +"['card.gif']\n" +">>> glob.glob('.c*')\n" +"['.card.gif']" + +#: ../../library/glob.rst:211 +msgid "" +"The :mod:`fnmatch` module offers shell-style filename (not path) expansion." +msgstr ":mod:`fnmatch` 模块提供了 shell 风格的文件名(而非路径)扩展。" + +#: ../../library/glob.rst:214 +msgid "The :mod:`pathlib` module offers high-level path objects." +msgstr ":mod:`pathlib` 模块提供高级路径对象。" + +#: ../../library/glob.rst:9 +msgid "filenames" +msgstr "文件名" + +#: ../../library/glob.rst:9 +msgid "pathname expansion" +msgstr "路径名扩展" + +#: ../../library/glob.rst:13 +msgid "* (asterisk)" +msgstr "* (星号)" + +#: ../../library/glob.rst:13 ../../library/glob.rst:65 +msgid "in glob-style wildcards" +msgstr "使用 glob 风格的通配符" + +#: ../../library/glob.rst:13 +msgid "? (question mark)" +msgstr "? (问号)" + +#: ../../library/glob.rst:13 +msgid "[] (square brackets)" +msgstr "[] (方括号)" + +#: ../../library/glob.rst:13 +msgid "! (exclamation)" +msgstr "! (感叹号)" + +#: ../../library/glob.rst:13 +msgid "- (minus)" +msgstr "- (减号)" + +#: ../../library/glob.rst:13 +msgid ". (dot)" +msgstr ". (点号)" + +#: ../../library/glob.rst:65 +msgid "**" +msgstr "**" diff --git a/library/graphlib.po b/library/graphlib.po new file mode 100644 index 0000000000..d8b122deb5 --- /dev/null +++ b/library/graphlib.po @@ -0,0 +1,402 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/graphlib.rst:2 +msgid "" +":mod:`!graphlib` --- Functionality to operate with graph-like structures" +msgstr ":mod:`!graphlib` --- 操作类似图的结构的功能" + +#: ../../library/graphlib.rst:8 +msgid "**Source code:** :source:`Lib/graphlib.py`" +msgstr "**源代码:** :source:`Lib/graphlib.py`" + +#: ../../library/graphlib.rst:20 +msgid "" +"Provides functionality to topologically sort a graph of :term:`hashable` " +"nodes." +msgstr "提供以拓扑方式对由 :term:`hashable` 节点组成的图进行排序的功能。" + +#: ../../library/graphlib.rst:22 +msgid "" +"A topological order is a linear ordering of the vertices in a graph such " +"that for every directed edge u -> v from vertex u to vertex v, vertex u " +"comes before vertex v in the ordering. For instance, the vertices of the " +"graph may represent tasks to be performed, and the edges may represent " +"constraints that one task must be performed before another; in this example," +" a topological ordering is just a valid sequence for the tasks. A complete " +"topological ordering is possible if and only if the graph has no directed " +"cycles, that is, if it is a directed acyclic graph." +msgstr "" +"拓扑排序是指图中顶点的线性排序,使得对于每条从顶点 u 到顶点 v 的有向边 u -> v,顶点 u 都排在顶点 v 之前。 " +"例如,图的顶点可以代表要执行的任务,而边代表某一个任务必须在另一个任务之前执行的约束条件;在这个例子中,拓扑排序只是任务的有效序列。完全拓扑排序 " +"当且仅当图不包含有向环,也就是说为有向无环图时,完全拓扑排序才是可能的。" + +#: ../../library/graphlib.rst:31 +msgid "" +"If the optional *graph* argument is provided it must be a dictionary " +"representing a directed acyclic graph where the keys are nodes and the " +"values are iterables of all predecessors of that node in the graph (the " +"nodes that have edges that point to the value in the key). Additional nodes " +"can be added to the graph using the :meth:`~TopologicalSorter.add` method." +msgstr "" +"如果提供了可选的 *graph* " +"参数则它必须为一个表示有向无环图的字典,其中的键为节点而值为包含图中该节点的所有上级节点(即具有指向键中的值的边的节点)的可迭代对象。 " +"额外的节点可以使用 :meth:`~TopologicalSorter.add` 方法添加到图中。" + +#: ../../library/graphlib.rst:37 +msgid "" +"In the general case, the steps required to perform the sorting of a given " +"graph are as follows:" +msgstr "在通常情况下,对给定的图执行排序所需的步骤如下:" + +#: ../../library/graphlib.rst:40 +msgid "" +"Create an instance of the :class:`TopologicalSorter` with an optional " +"initial graph." +msgstr "通过可选的初始图创建一个 :class:`TopologicalSorter` 的实例。" + +#: ../../library/graphlib.rst:42 +msgid "Add additional nodes to the graph." +msgstr "添加额外的节点到图中。" + +#: ../../library/graphlib.rst:43 +msgid "Call :meth:`~TopologicalSorter.prepare` on the graph." +msgstr "在图上调用 :meth:`~TopologicalSorter.prepare`。" + +#: ../../library/graphlib.rst:44 +msgid "" +"While :meth:`~TopologicalSorter.is_active` is ``True``, iterate over the " +"nodes returned by :meth:`~TopologicalSorter.get_ready` and process them. " +"Call :meth:`~TopologicalSorter.done` on each node as it finishes processing." +msgstr "" +"当 :meth:`~TopologicalSorter.is_active` 为 ``True`` 时,迭代 " +":meth:`~TopologicalSorter.get_ready` 所返回的节点并加以处理。完成处理后在每个节点上调用 " +":meth:`~TopologicalSorter.done`." + +#: ../../library/graphlib.rst:49 +msgid "" +"In case just an immediate sorting of the nodes in the graph is required and " +"no parallelism is involved, the convenience method " +":meth:`TopologicalSorter.static_order` can be used directly:" +msgstr "" +"在只需要对图中的节点进行立即排序并且不涉及并行性的情况下,可以直接使用便捷方法 " +":meth:`TopologicalSorter.static_order`:" + +#: ../../library/graphlib.rst:53 +msgid "" +">>> graph = {\"D\": {\"B\", \"C\"}, \"C\": {\"A\"}, \"B\": {\"A\"}}\n" +">>> ts = TopologicalSorter(graph)\n" +">>> tuple(ts.static_order())\n" +"('A', 'C', 'B', 'D')" +msgstr "" +">>> graph = {\"D\": {\"B\", \"C\"}, \"C\": {\"A\"}, \"B\": {\"A\"}}\n" +">>> ts = TopologicalSorter(graph)\n" +">>> tuple(ts.static_order())\n" +"('A', 'C', 'B', 'D')" + +#: ../../library/graphlib.rst:60 +msgid "" +"The class is designed to easily support parallel processing of the nodes as " +"they become ready. For instance::" +msgstr "这个类被设计用来在节点就绪时方便地支持对其并行处理。例如::" + +#: ../../library/graphlib.rst:63 +msgid "" +"topological_sorter = TopologicalSorter()\n" +"\n" +"# Add nodes to 'topological_sorter'...\n" +"\n" +"topological_sorter.prepare()\n" +"while topological_sorter.is_active():\n" +" for node in topological_sorter.get_ready():\n" +" # Worker threads or processes take nodes to work on off the\n" +" # 'task_queue' queue.\n" +" task_queue.put(node)\n" +"\n" +" # When the work for a node is done, workers put the node in\n" +" # 'finalized_tasks_queue' so we can get more nodes to work on.\n" +" # The definition of 'is_active()' guarantees that, at this point, at\n" +" # least one node has been placed on 'task_queue' that hasn't yet\n" +" # been passed to 'done()', so this blocking 'get()' must (eventually)\n" +" # succeed. After calling 'done()', we loop back to call 'get_ready()'\n" +" # again, so put newly freed nodes on 'task_queue' as soon as\n" +" # logically possible.\n" +" node = finalized_tasks_queue.get()\n" +" topological_sorter.done(node)" +msgstr "" +"topological_sorter = TopologicalSorter()\n" +"\n" +"# 添加节点到 'topological_sorter'...\n" +"\n" +"topological_sorter.prepare()\n" +"while topological_sorter.is_active():\n" +" for node in topological_sorter.get_ready():\n" +" # 工作线程或进程从 'task_queue' 队列中\n" +" # 取出节点来处理。\n" +" task_queue.put(node)\n" +"\n" +" # 当一个节点的工作完成时,工作线程或进程就会将节点放入\n" +" # 'finalized_tasks_queue' 这样我们就可以继续操作其他节点。\n" +" # 'is_active()' 的定义能够确保这一点,这时,至少有一个节点\n" +" # 已被放置在 'task_queue' 上而尚未被传给 'done()',因此这个\n" +" # 阻塞中的 'get()' 必须(最终)成功。在调用 'done()' 之后,\n" +" # 我们将环回至再次调用 'get_ready()',因此只要逻辑上可能\n" +" # 就应尽快将新近可用的节点放入 'task_queue' 中。\n" +" node = finalized_tasks_queue.get()\n" +" topological_sorter.done(node)" + +#: ../../library/graphlib.rst:87 +msgid "" +"Add a new node and its predecessors to the graph. Both the *node* and all " +"elements in *predecessors* must be :term:`hashable`." +msgstr "" +"将一个新节点及其上级节点添加到图中。 *node* 和 *predecessors* 中的所有元素都必须是 :term:`hashable`。" + +#: ../../library/graphlib.rst:90 +msgid "" +"If called multiple times with the same node argument, the set of " +"dependencies will be the union of all dependencies passed in." +msgstr "如果附带相同的节点参数多次调用,则依赖项的集合将为所有被传入依赖项的并集。" + +#: ../../library/graphlib.rst:93 +msgid "" +"It is possible to add a node with no dependencies (*predecessors* is not " +"provided) or to provide a dependency twice. If a node that has not been " +"provided before is included among *predecessors* it will be automatically " +"added to the graph with no predecessors of its own." +msgstr "" +"可以添加不带依赖项的节点 (即不提供 *predecessors*) 或者重复提供依赖项。如果有先前未提供的节点包含在 *predecessors* " +"中则它将被自动添加到图中并且不带自己的上级节点。" + +#: ../../library/graphlib.rst:98 +msgid "" +"Raises :exc:`ValueError` if called after :meth:`~TopologicalSorter.prepare`." +msgstr "如果在 :meth:`~TopologicalSorter.prepare` 之后被调用则会引发 :exc:`ValueError`。" + +#: ../../library/graphlib.rst:102 +msgid "" +"Mark the graph as finished and check for cycles in the graph. If any cycle " +"is detected, :exc:`CycleError` will be raised, but " +":meth:`~TopologicalSorter.get_ready` can still be used to obtain as many " +"nodes as possible until cycles block more progress. After a call to this " +"function, the graph cannot be modified, and therefore no more nodes can be " +"added using :meth:`~TopologicalSorter.add`." +msgstr "" +"将图标记为已完成并检查图中是否存在环。如果检测到任何环,则将引发 :exc:`CycleError`,但 " +":meth:`~TopologicalSorter.get_ready` 仍可被用来获取尽可能多的节点直到环阻塞了操作过程。 " +"在调用此函数后,图将无法再修改,因此不能再使用 :meth:`~TopologicalSorter.add` 添加更多的节点。" + +#: ../../library/graphlib.rst:109 +msgid "" +"A :exc:`ValueError` will be raised if the sort has been started by " +":meth:`~.static_order` or :meth:`~.get_ready`." +msgstr "" +"如果排序是通过 :meth:`~.static_order` 方法或 :meth:`~.get_ready` 方法开始的,将会引发 " +":exc:`ValueError` 异常。" + +#: ../../library/graphlib.rst:114 +msgid "" +"``prepare()`` can now be called more than once as long as the sort has not " +"started. Previously this raised :exc:`ValueError`." +msgstr "现在,只要排序还没有开始,就可以多次调用 ``prepare()``。以前,这种情况下会引发 :exc:`ValueError`。" + +#: ../../library/graphlib.rst:119 +msgid "" +"Returns ``True`` if more progress can be made and ``False`` otherwise. " +"Progress can be made if cycles do not block the resolution and either there " +"are still nodes ready that haven't yet been returned by " +":meth:`TopologicalSorter.get_ready` or the number of nodes marked " +":meth:`TopologicalSorter.done` is less than the number that have been " +"returned by :meth:`TopologicalSorter.get_ready`." +msgstr "" +"如果可以取得更多进展则返回 ``True``,否则返回 ``False``。如果环没有阻塞操作,并且还存在尚未被 " +":meth:`TopologicalSorter.get_ready` 返回的已就绪节点或者已标记为 " +":meth:`TopologicalSorter.done` 的节点数量少于已被 :meth:`TopologicalSorter.get_ready`" +" 所返回的节点数量则还可以取得进展。" + +#: ../../library/graphlib.rst:126 +msgid "" +"The :meth:`~object.__bool__` method of this class defers to this function, " +"so instead of::" +msgstr "该类的 :meth:`~object.__bool__` 方法会转发给此函数,因此除了::" + +#: ../../library/graphlib.rst:129 +msgid "" +"if ts.is_active():\n" +" ..." +msgstr "" +"if ts.is_active():\n" +" ..." + +#: ../../library/graphlib.rst:132 +msgid "it is possible to simply do::" +msgstr "也可以简单地这样写::" + +#: ../../library/graphlib.rst:134 +msgid "" +"if ts:\n" +" ..." +msgstr "" +"if ts:\n" +" ..." + +#: ../../library/graphlib.rst:137 ../../library/graphlib.rst:160 +msgid "" +"Raises :exc:`ValueError` if called without calling " +":meth:`~TopologicalSorter.prepare` previously." +msgstr "" +"如果之前未调用 :meth:`~TopologicalSorter.prepare` 就调用此函数则会引发 :exc:`ValueError`。" + +#: ../../library/graphlib.rst:142 +msgid "" +"Marks a set of nodes returned by :meth:`TopologicalSorter.get_ready` as " +"processed, unblocking any successor of each node in *nodes* for being " +"returned in the future by a call to :meth:`TopologicalSorter.get_ready`." +msgstr "" +"将 :meth:`TopologicalSorter.get_ready` 所返回的节点集合标记为已处理,解除对 *nodes* " +"中每个节点的后续节点的阻塞以便在将来通过对 :meth:`TopologicalSorter.get_ready` 的调用来返回它们。" + +#: ../../library/graphlib.rst:146 +msgid "" +"Raises :exc:`ValueError` if any node in *nodes* has already been marked as " +"processed by a previous call to this method or if a node was not added to " +"the graph by using :meth:`TopologicalSorter.add`, if called without calling " +":meth:`~TopologicalSorter.prepare` or if node has not yet been returned by " +":meth:`~TopologicalSorter.get_ready`." +msgstr "" +"如果 *nodes* 中的任何节点已经被之前对该方法的调用标记为已处理或者如果未通过使用 :meth:`TopologicalSorter.add` " +"将一个节点添加到图中,如果未调用 :meth:`~TopologicalSorter.prepare` 即调用此方法或者如果节点尚未被 " +":meth:`~TopologicalSorter.get_ready` 所返回则将引发 :exc:`ValueError`。" + +#: ../../library/graphlib.rst:154 +msgid "" +"Returns a ``tuple`` with all the nodes that are ready. Initially it returns " +"all nodes with no predecessors, and once those are marked as processed by " +"calling :meth:`TopologicalSorter.done`, further calls will return all new " +"nodes that have all their predecessors already processed. Once no more " +"progress can be made, empty tuples are returned." +msgstr "" +"返回由所有已就绪节点组成的 ``tuple``。初始状态下它将返回所有不带上级节点的节点,并且一旦通过调用 " +":meth:`TopologicalSorter.done` 将它们标记为已处理,之后的调用将返回所有上级节点已被处理的新节点。 " +"一旦无法再取得进展,则会返回空元组。" + +#: ../../library/graphlib.rst:165 +msgid "" +"Returns an iterator object which will iterate over nodes in a topological " +"order. When using this method, :meth:`~TopologicalSorter.prepare` and " +":meth:`~TopologicalSorter.done` should not be called. This method is " +"equivalent to::" +msgstr "" +"返回一个迭代器,它将按照拓扑顺序来迭代所有节点。当使用此方法时,:meth:`~TopologicalSorter.prepare` 和 " +":meth:`~TopologicalSorter.done` 不应被调用。此方法等价于::" + +#: ../../library/graphlib.rst:170 +msgid "" +"def static_order(self):\n" +" self.prepare()\n" +" while self.is_active():\n" +" node_group = self.get_ready()\n" +" yield from node_group\n" +" self.done(*node_group)" +msgstr "" +"def static_order(self):\n" +" self.prepare()\n" +" while self.is_active():\n" +" node_group = self.get_ready()\n" +" yield from node_group\n" +" self.done(*node_group)" + +#: ../../library/graphlib.rst:177 +msgid "" +"The particular order that is returned may depend on the specific order in " +"which the items were inserted in the graph. For example:" +msgstr "所返回的特定顺序可能取决于条目被插入图中的顺序。例如:" + +#: ../../library/graphlib.rst:180 +msgid "" +">>> ts = TopologicalSorter()\n" +">>> ts.add(3, 2, 1)\n" +">>> ts.add(1, 0)\n" +">>> print([*ts.static_order()])\n" +"[2, 0, 1, 3]\n" +"\n" +">>> ts2 = TopologicalSorter()\n" +">>> ts2.add(1, 0)\n" +">>> ts2.add(3, 2, 1)\n" +">>> print([*ts2.static_order()])\n" +"[0, 2, 1, 3]" +msgstr "" +">>> ts = TopologicalSorter()\n" +">>> ts.add(3, 2, 1)\n" +">>> ts.add(1, 0)\n" +">>> print([*ts.static_order()])\n" +"[2, 0, 1, 3]\n" +"\n" +">>> ts2 = TopologicalSorter()\n" +">>> ts2.add(1, 0)\n" +">>> ts2.add(3, 2, 1)\n" +">>> print([*ts2.static_order()])\n" +"[0, 2, 1, 3]" + +#: ../../library/graphlib.rst:194 +msgid "" +"This is due to the fact that \"0\" and \"2\" are in the same level in the " +"graph (they would have been returned in the same call to " +":meth:`~TopologicalSorter.get_ready`) and the order between them is " +"determined by the order of insertion." +msgstr "" +"这是由于实际上 \"0\" 和 \"2\" 在图中的级别相同(它们将在对 :meth:`~TopologicalSorter.get_ready` " +"的同一次调用中被返回)并且它们之间的顺序是由插入顺序决定的。" + +#: ../../library/graphlib.rst:200 +msgid "If any cycle is detected, :exc:`CycleError` will be raised." +msgstr "如果检测到任何环,则将引发 :exc:`CycleError`。" + +#: ../../library/graphlib.rst:206 +msgid "Exceptions" +msgstr "异常" + +#: ../../library/graphlib.rst:207 +msgid "The :mod:`!graphlib` module defines the following exception classes:" +msgstr ":mod:`!graphlib` 模块定义了以下异常类:" + +#: ../../library/graphlib.rst:211 +msgid "" +"Subclass of :exc:`ValueError` raised by :meth:`TopologicalSorter.prepare` if" +" cycles exist in the working graph. If multiple cycles exist, only one " +"undefined choice among them will be reported and included in the exception." +msgstr "" +":exc:`ValueError` 的子类,当特定的图中存在环时将由 :meth:`TopologicalSorter.prepare` 引发。 " +"如果存在多个环,则将只报告并包含其中任意一个未作确定选择的环。" + +#: ../../library/graphlib.rst:215 +msgid "" +"The detected cycle can be accessed via the second element in the " +":attr:`~BaseException.args` attribute of the exception instance and consists" +" in a list of nodes, such that each node is, in the graph, an immediate " +"predecessor of the next node in the list. In the reported list, the first " +"and the last node will be the same, to make it clear that it is cyclic." +msgstr "" +"检测到的环可通过异常实例的 :attr:`~BaseException.args` " +"属性的第二个元素访问,它由一个节点列表组成,在图中每个节点都是列表中下一个节点的直接上级节点。 " +"在报告的列表中,开头和末尾的节点将是同一对象,以表明它是一个环。" diff --git a/library/grp.po b/library/grp.po new file mode 100644 index 0000000000..58e8e99612 --- /dev/null +++ b/library/grp.po @@ -0,0 +1,150 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/grp.rst:2 +msgid ":mod:`!grp` --- The group database" +msgstr ":mod:`!grp` --- 组数据库" + +#: ../../library/grp.rst:9 +msgid "" +"This module provides access to the Unix group database. It is available on " +"all Unix versions." +msgstr "该模块提供对 Unix 组数据库的访问。它在所有 Unix 版本上都可用。" + +#: ../../library/grp.rst:12 +msgid "Availability" +msgstr "可用性" + +#: ../../library/grp.rst:14 +msgid "" +"Group database entries are reported as a tuple-like object, whose attributes" +" correspond to the members of the ``group`` structure (Attribute field " +"below, see ````):" +msgstr "组数据库条目被报告为类似元组的对象,其属性对应于 ``group`` 结构的成员 (下面的属性字段,请参见 ````):" + +#: ../../library/grp.rst:19 +msgid "Index" +msgstr "索引" + +#: ../../library/grp.rst:19 +msgid "Attribute" +msgstr "属性" + +#: ../../library/grp.rst:19 +msgid "Meaning" +msgstr "含义" + +#: ../../library/grp.rst:21 +msgid "0" +msgstr "0" + +#: ../../library/grp.rst:21 +msgid "gr_name" +msgstr "gr_name" + +#: ../../library/grp.rst:21 +msgid "the name of the group" +msgstr "组名" + +#: ../../library/grp.rst:23 +msgid "1" +msgstr "1" + +#: ../../library/grp.rst:23 +msgid "gr_passwd" +msgstr "gr_passwd" + +#: ../../library/grp.rst:23 +msgid "the (encrypted) group password; often empty" +msgstr "(加密的)组密码;通常为空" + +#: ../../library/grp.rst:26 +msgid "2" +msgstr "2" + +#: ../../library/grp.rst:26 +msgid "gr_gid" +msgstr "gr_gid" + +#: ../../library/grp.rst:26 +msgid "the numerical group ID" +msgstr "数字组 ID" + +#: ../../library/grp.rst:28 +msgid "3" +msgstr "3" + +#: ../../library/grp.rst:28 +msgid "gr_mem" +msgstr "gr_mem" + +#: ../../library/grp.rst:28 +msgid "all the group member's user names" +msgstr "组内所有成员的用户名" + +#: ../../library/grp.rst:32 +msgid "" +"The gid is an integer, name and password are strings, and the member list is" +" a list of strings. (Note that most users are not explicitly listed as " +"members of the group they are in according to the password database. Check " +"both databases to get complete membership information. Also note that a " +"``gr_name`` that starts with a ``+`` or ``-`` is likely to be a YP/NIS " +"reference and may not be accessible via :func:`getgrnam` or " +":func:`getgrgid`.)" +msgstr "" +"gid 是整数,名称和密码是字符串,成员列表是字符串列表。 " +"(注意,大多数用户未根据密码数据库显式列为所属组的成员。请检查两个数据库以获取完整的成员资格信息。还要注意,以 ``+`` 或 ``-`` 开头的 " +"``gr_name`` 可能是 YP/NIS 引用,可能无法通过 :func:`getgrnam` 或 :func:`getgrgid` 访问。)" + +#: ../../library/grp.rst:39 +msgid "It defines the following items:" +msgstr "本模块定义如下内容:" + +#: ../../library/grp.rst:44 +msgid "" +"Return the group database entry for the given numeric group ID. " +":exc:`KeyError` is raised if the entry asked for cannot be found." +msgstr "返回给定数字组 ID 的组数据库条目。如果请求的条目无法找到则会引发 :exc:`KeyError`。" + +#: ../../library/grp.rst:47 +msgid "" +":exc:`TypeError` is raised for non-integer arguments like floats or strings." +msgstr "对于非整数参数如浮点数或字符串将引发 :exc:`TypeError`。" + +#: ../../library/grp.rst:52 +msgid "" +"Return the group database entry for the given group name. :exc:`KeyError` is" +" raised if the entry asked for cannot be found." +msgstr "返回给定组名的组数据库条目。如果找不到要求的条目,则会引发 :exc:`KeyError` 错误。" + +#: ../../library/grp.rst:58 +msgid "Return a list of all available group entries, in arbitrary order." +msgstr "以任意顺序返回所有可用组条目的列表。" + +#: ../../library/grp.rst:63 +msgid "Module :mod:`pwd`" +msgstr "模块 :mod:`pwd`" + +#: ../../library/grp.rst:64 +msgid "An interface to the user database, similar to this." +msgstr "用户数据库的接口,与此类似。" diff --git a/library/gzip.po b/library/gzip.po new file mode 100644 index 0000000000..ca23591739 --- /dev/null +++ b/library/gzip.po @@ -0,0 +1,515 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/gzip.rst:2 +msgid ":mod:`!gzip` --- Support for :program:`gzip` files" +msgstr ":mod:`!gzip` --- 对 :program:`gzip` 文件的支持" + +#: ../../library/gzip.rst:7 +msgid "**Source code:** :source:`Lib/gzip.py`" +msgstr "**源代码:** :source:`Lib/gzip.py`" + +#: ../../library/gzip.rst:11 +msgid "" +"This module provides a simple interface to compress and decompress files " +"just like the GNU programs :program:`gzip` and :program:`gunzip` would." +msgstr "" +"此模块提供的简单接口帮助用户压缩和解压缩文件,功能类似于 GNU 应用程序 :program:`gzip` 和 :program:`gunzip`。" + +#: ../../includes/optional-module.rst:1 +msgid "" +"This is an :term:`optional module`. If it is missing from your copy of " +"CPython, look for documentation from your distributor (that is, whoever " +"provided Python to you). If you are the distributor, see :ref:`optional-" +"module-requirements`." +msgstr "" +"这是一个 :term:`optional module`。如果它在你的 CPython 副本中缺失,请查看你的发行方(也就是说,向你提供 Python " +"的人)的文档。如果你就是发行方,请参阅 :ref:`optional-module-requirements`。" + +#: ../../library/gzip.rst:16 +msgid "The data compression is provided by the :mod:`zlib` module." +msgstr "数据压缩由 :mod:`zlib` 模块提供。" + +#: ../../library/gzip.rst:18 +msgid "" +"The :mod:`!gzip` module provides the :class:`GzipFile` class, as well as the" +" :func:`.open`, :func:`compress` and :func:`decompress` convenience " +"functions. The :class:`GzipFile` class reads and writes :program:`gzip`\\ " +"-format files, automatically compressing or decompressing the data so that " +"it looks like an ordinary :term:`file object`." +msgstr "" +":mod:`!gzip` 模块提供了 :class:`GzipFile` 类,以及 :func:`.open`, :func:`compress` 和 " +":func:`decompress` 等便捷函数。 :class:`GzipFile` 类可以读写 :program:`gzip` " +"格式的文件,自动压缩和解压缩数据以使其看起来像是普通的 :term:`file object`。" + +#: ../../library/gzip.rst:24 +msgid "" +"Note that additional file formats which can be decompressed by the " +":program:`gzip` and :program:`gunzip` programs, such as those produced by " +":program:`compress` and :program:`pack`, are not supported by this module." +msgstr "" +"注意,此模块不支持部分可以被 :program:`gzip` 和 :program:`gunzip` 解压的格式,如利用 " +":program:`compress` 或 :program:`pack` 压缩所得的文件。" + +#: ../../library/gzip.rst:28 +msgid "The module defines the following items:" +msgstr "这个模块定义了以下内容:" + +#: ../../library/gzip.rst:33 +msgid "" +"Open a gzip-compressed file in binary or text mode, returning a :term:`file " +"object`." +msgstr "以二进制方式或者文本方式打开一个 gzip 格式的压缩文件,返回一个 :term:`file object`。" + +#: ../../library/gzip.rst:36 +msgid "" +"The *filename* argument can be an actual filename (a :class:`str` or " +":class:`bytes` object), or an existing file object to read from or write to." +msgstr "" +"*filename* 参数可以是一个实际的文件名(一个 :class:`str` 对象或者 :class:`bytes` " +"对象),或者是一个用来读写的已存在的文件对象。" + +#: ../../library/gzip.rst:39 +msgid "" +"The *mode* argument can be any of ``'r'``, ``'rb'``, ``'a'``, ``'ab'``, " +"``'w'``, ``'wb'``, ``'x'`` or ``'xb'`` for binary mode, or ``'rt'``, " +"``'at'``, ``'wt'``, or ``'xt'`` for text mode. The default is ``'rb'``." +msgstr "" +"*mode* 参数可以是二进制模式: " +"``'r'``、``'rb'``、``'a'``、``'ab'``、``'w'``、``'wb'``、``'x'`` 或 " +"``'xb'``,或者是文本模式 ``'rt'``、``'at'``、``'wt'`` 或 ``'xt'``。默认值是 ``'rb'``。" + +#: ../../library/gzip.rst:43 +msgid "" +"The *compresslevel* argument is an integer from 0 to 9, as for the " +":class:`GzipFile` constructor." +msgstr " *compresslevel* 参数是一个用于 :class:`GzipFile` 构造器的从 0 到 9 的整数。" + +#: ../../library/gzip.rst:46 +msgid "" +"For binary mode, this function is equivalent to the :class:`GzipFile` " +"constructor: ``GzipFile(filename, mode, compresslevel)``. In this case, the " +"*encoding*, *errors* and *newline* arguments must not be provided." +msgstr "" +"对于二进制模式,这个函数等价于 :class:`GzipFile` 构造器: ``GzipFile(filename, mode, " +"compresslevel)``。 在此情况下,*encoding*、*errors* 和 *newline* 三个参数一定不要设置。" + +#: ../../library/gzip.rst:50 +msgid "" +"For text mode, a :class:`GzipFile` object is created, and wrapped in an " +":class:`io.TextIOWrapper` instance with the specified encoding, error " +"handling behavior, and line ending(s)." +msgstr "" +"对于文本模式,将会创建一个 :class:`GzipFile` 对象,并将它封装到一个 :class:`io.TextIOWrapper` " +"实例中,该实例具有指定的编码、错误处理行为和行结束符。" + +#: ../../library/gzip.rst:54 +msgid "" +"Added support for *filename* being a file object, support for text mode, and" +" the *encoding*, *errors* and *newline* arguments." +msgstr "支持 *filename* 为一个文件对象,支持文本模式和 *encoding*, *errors* 和 *newline* 参数。" + +#: ../../library/gzip.rst:58 +msgid "Added support for the ``'x'``, ``'xb'`` and ``'xt'`` modes." +msgstr "支持 ``'x'``, ``'xb'`` 和 ``'xt'`` 三种模式。" + +#: ../../library/gzip.rst:61 ../../library/gzip.rst:175 +msgid "Accepts a :term:`path-like object`." +msgstr "接受一个 :term:`path-like object`。" + +#: ../../library/gzip.rst:66 +msgid "" +"An exception raised for invalid gzip files. It inherits from " +":exc:`OSError`. :exc:`EOFError` and :exc:`zlib.error` can also be raised for" +" invalid gzip files." +msgstr "" +"针对无效 gzip 文件引发的异常。它继承自 :exc:`OSError`。针对无效 gzip 文件也可能引发 :exc:`EOFError` 和 " +":exc:`zlib.error`." + +#: ../../library/gzip.rst:74 +msgid "" +"Constructor for the :class:`GzipFile` class, which simulates most of the " +"methods of a :term:`file object`, with the exception of the " +":meth:`~io.IOBase.truncate` method. At least one of *fileobj* and " +"*filename* must be given a non-trivial value." +msgstr "" +":class:`GzipFile` 类的构造器,它模拟了 :term:`file object` 的大部分方法,但 " +":meth:`~io.IOBase.truncate` 方法除外。 *fileobj* 和 *filename* 中至少有一个必须为非空值。" + +#: ../../library/gzip.rst:79 +msgid "" +"The new class instance is based on *fileobj*, which can be a regular file, " +"an :class:`io.BytesIO` object, or any other object which simulates a file. " +"It defaults to ``None``, in which case *filename* is opened to provide a " +"file object." +msgstr "" +"新的实例基于 *fileobj*,它可以是一个普通文件,一个 :class:`io.BytesIO` 对象,或者任何模拟文件的对象。它的默认值是 " +"``None``,在此情况下会打开 *filename* 来提供文件对象。" + +#: ../../library/gzip.rst:84 +msgid "" +"When *fileobj* is not ``None``, the *filename* argument is only used to be " +"included in the :program:`gzip` file header, which may include the original " +"filename of the uncompressed file. It defaults to the filename of " +"*fileobj*, if discernible; otherwise, it defaults to the empty string, and " +"in this case the original filename is not included in the header." +msgstr "" +"当 *fileobj* 不为 ``None`` 时,*filename* 参数只用于 :program:`gzip` " +"文件头中,文件头有可能包含未压缩文件的源文件名。如果可识别,默认为 *fileobj* " +"的文件名;否则默认为空字符串,在这种情况下文件头将不包含源文件名。" + +#: ../../library/gzip.rst:90 +msgid "" +"The *mode* argument can be any of ``'r'``, ``'rb'``, ``'a'``, ``'ab'``, " +"``'w'``, ``'wb'``, ``'x'``, or ``'xb'``, depending on whether the file will " +"be read or written. The default is the mode of *fileobj* if discernible; " +"otherwise, the default is ``'rb'``. In future Python releases the mode of " +"*fileobj* will not be used. It is better to always specify *mode* for " +"writing." +msgstr "" +"*mode* 参数可以是 ``'r'``, ``'rb'``, ``'a'``, ``'ab'``, ``'w'``, ``'wb'``, " +"``'x'`` 或 ``'xb'`` 中的一个,具体取决于文件将被读取还是被写入。如果可识别则默认为 *fileobj* 的模式;否则默认为 " +"``'rb'``。在未来的 Python 发布版中将不再使用 *fileobj* 的模式。最好总是指定 *mode* 为写入模式。" + +#: ../../library/gzip.rst:96 +msgid "" +"Note that the file is always opened in binary mode. To open a compressed " +"file in text mode, use :func:`.open` (or wrap your :class:`GzipFile` with an" +" :class:`io.TextIOWrapper`)." +msgstr "" +"需要注意的是,文件默认使用二进制模式打开。如果要以文本模式打开一个压缩文件,请使用 :func:`.open` 方法 (或者使用 " +":class:`io.TextIOWrapper` 包装 :class:`GzipFile`)。" + +#: ../../library/gzip.rst:100 +msgid "" +"The *compresslevel* argument is an integer from ``0`` to ``9`` controlling " +"the level of compression; ``1`` is fastest and produces the least " +"compression, and ``9`` is slowest and produces the most compression. ``0`` " +"is no compression. The default is ``9``." +msgstr "" +"*compresslevel* 参数是一个从 ``0`` 到 ``9`` 的整数,用于控制压缩等级;``1`` 最快但压缩比例最小,``9`` " +"最慢但压缩比例最大。``0`` 不压缩。默认为 ``9``。" + +#: ../../library/gzip.rst:105 +msgid "" +"The optional *mtime* argument is the timestamp requested by gzip. The time " +"is in Unix format, i.e., seconds since 00:00:00 UTC, January 1, 1970. If " +"*mtime* is omitted or ``None``, the current time is used. Use *mtime* = 0 to" +" generate a compressed stream that does not depend on creation time." +msgstr "" +"可选的 *mtime* 参数是 gzip 所请求的时间戳。该时间为 Unix 格式,即距离 1970-01-01 00:00:00 UTC 的秒数。 " +"如果 *mtime* 被省略或为 ``None``,则会使用当前时间。使用 *mtime* = 0 可生成不依赖于创建时间的压缩流。" + +#: ../../library/gzip.rst:110 +msgid "" +"See below for the :attr:`mtime` attribute that is set when decompressing." +msgstr "有关在解压缩时设置的 :attr:`mtime` 属性见下文。" + +#: ../../library/gzip.rst:112 +msgid "" +"Calling a :class:`GzipFile` object's :meth:`!close` method does not close " +"*fileobj*, since you might wish to append more material after the compressed" +" data. This also allows you to pass an :class:`io.BytesIO` object opened " +"for writing as *fileobj*, and retrieve the resulting memory buffer using the" +" :class:`io.BytesIO` object's :meth:`~io.BytesIO.getvalue` method." +msgstr "" +"调用 :class:`GzipFile` 对象的 :meth:`!close` 方法不会关闭 " +"*fileobj*,因为你可能希望在已压缩的数据后追加更多内容。你还可以传入一个以写入模式打开的 :class:`io.BytesIO` 对象作为 " +"*fileobj*,并使用 :class:`io.BytesIO` 对象的 :meth:`~io.BytesIO.getvalue` " +"方法提取所得到的内存缓冲区数据。" + +#: ../../library/gzip.rst:118 +msgid "" +":class:`GzipFile` supports the :class:`io.BufferedIOBase` interface, " +"including iteration and the :keyword:`with` statement. Only the " +":meth:`~io.IOBase.truncate` method isn't implemented." +msgstr "" +":class:`GzipFile` 支持 :class:`io.BufferedIOBase` 接口,包括迭代和 :keyword:`with` 语句。" +" 只有 :meth:`~io.IOBase.truncate` 方法未被实现。" + +#: ../../library/gzip.rst:122 +msgid ":class:`GzipFile` also provides the following method and attribute:" +msgstr ":class:`GzipFile` 还提供了以下的方法和属性:" + +#: ../../library/gzip.rst:126 +msgid "" +"Read *n* uncompressed bytes without advancing the file position. The number " +"of bytes returned may be more or less than requested." +msgstr "读取 *n* 个未压缩字节而不前移文件指针位置。所返回的字节数有可能多于或少于所请求的。" + +#: ../../library/gzip.rst:129 +msgid "" +"While calling :meth:`peek` does not change the file position of the " +":class:`GzipFile`, it may change the position of the underlying file object " +"(e.g. if the :class:`GzipFile` was constructed with the *fileobj* " +"parameter)." +msgstr "" +"调用 :meth:`peek` 不会改变 :class:`GzipFile` 的文件位置,但它可能改变底层文件对象的位置(例如 " +":class:`GzipFile` 是使用 *fileobj* 参数来构造的情况)。" + +#: ../../library/gzip.rst:138 +msgid "``'rb'`` for reading and ``'wb'`` for writing." +msgstr "``'rb'`` 表示可读而 ``'wb'`` 表示可写。" + +#: ../../library/gzip.rst:140 +msgid "In previous versions it was an integer ``1`` or ``2``." +msgstr "在之前版本中该值为整数 ``1`` 或 ``2``。" + +#: ../../library/gzip.rst:145 +msgid "" +"When decompressing, this attribute is set to the last timestamp in the most " +"recently read header. It is an integer, holding the number of seconds since" +" the Unix epoch (00:00:00 UTC, January 1, 1970). The initial value before " +"reading any headers is ``None``." +msgstr "" +"当解压缩时,该属性将被设为最近读取的标头中的最后时间戳。它是一个整数,保存从 Unix 纪元 (1970-01-01 00:00:00 UTC) " +"开始的秒数。在读取任何标头之前的初始值为 ``None``。" + +#: ../../library/gzip.rst:152 +msgid "" +"The path to the gzip file on disk, as a :class:`str` or :class:`bytes`. " +"Equivalent to the output of :func:`os.fspath` on the original input path, " +"with no other normalization, resolution or expansion." +msgstr "" +"指向磁盘上 gzip 文件的路径,为 :class:`str` 或 :class:`bytes` 对象。等价于原始输入路径上 " +":func:`os.fspath` 的输出,不带其他标准化、解析或扩展。" + +#: ../../library/gzip.rst:156 +msgid "" +"Support for the :keyword:`with` statement was added, along with the *mtime* " +"constructor argument and :attr:`mtime` attribute." +msgstr "支持 :keyword:`with` 语句,构造器参数 *mtime* 和 :attr:`mtime` 属性。" + +#: ../../library/gzip.rst:160 +msgid "Support for zero-padded and unseekable files was added." +msgstr "添加了对零填充和不可搜索文件的支持。" + +#: ../../library/gzip.rst:163 +msgid "The :meth:`io.BufferedIOBase.read1` method is now implemented." +msgstr "实现 :meth:`io.BufferedIOBase.read1` 方法。" + +#: ../../library/gzip.rst:166 +msgid "Added support for the ``'x'`` and ``'xb'`` modes." +msgstr "支持 ``'x'`` 和 ``'xb'`` 两种模式。" + +#: ../../library/gzip.rst:169 +msgid "" +"Added support for writing arbitrary :term:`bytes-like objects `. The :meth:`~io.BufferedIOBase.read` method now accepts an argument" +" of ``None``." +msgstr "" +"支持写入任意 :term:`bytes-like objects `。:meth:`~io.BufferedIOBase.read` 方法可以接受 ``None`` 为参数。" + +#: ../../library/gzip.rst:178 +msgid "" +"Opening :class:`GzipFile` for writing without specifying the *mode* argument" +" is deprecated." +msgstr "打开 :class:`GzipFile` 用于写入而不指定 *mode* 参数的做法已被弃用。" + +#: ../../library/gzip.rst:182 +msgid "" +"Remove the ``filename`` attribute, use the :attr:`~GzipFile.name` attribute " +"instead." +msgstr "移除 ``filename`` 属性,改用 :attr:`~GzipFile.name` 属性。" + +#: ../../library/gzip.rst:189 +msgid "" +"Compress the *data*, returning a :class:`bytes` object containing the " +"compressed data. *compresslevel* and *mtime* have the same meaning as in " +"the :class:`GzipFile` constructor above, but *mtime* defaults to 0 for " +"reproducible output." +msgstr "" +"对 *data* 进行压缩,返回一个包含已压缩数据的 :class:`bytes` 对象。 *compresslevel* 和 *mtime* " +"具有与上文 :class:`GzipFile` 构造器中相同的含义,但 *mtime* 默认为 0 以确保可复现的输出。" + +#: ../../library/gzip.rst:195 +msgid "Added the *mtime* parameter for reproducible output." +msgstr "添加了 *mtime* 形参用于可重复的输出。" + +#: ../../library/gzip.rst:197 +msgid "" +"Speed is improved by compressing all data at once instead of in a streamed " +"fashion. Calls with *mtime* set to ``0`` are delegated to " +":func:`zlib.compress` for better speed. In this situation the output may " +"contain a gzip header \"OS\" byte value other than 255 \"unknown\" as " +"supplied by the underlying zlib implementation." +msgstr "" +"速度的提升是通过一次性压缩所有数据代替流的方式来达成的。将 *mtime* 设为 ``0`` 的调用被委托给 :func:`zlib.compress`" +" 以加快速度。在此情况下输出可能包含一个 gzip 标头 \"OS\" 字节值而不是下层 zlib 实现所提供的 255 \"unknown\"。" + +#: ../../library/gzip.rst:204 +msgid "" +"The gzip header OS byte is guaranteed to be set to 255 when this function is" +" used as was the case in 3.10 and earlier." +msgstr "当使用此函数时 gzip 标头 OS 字节会保证如在 3.10 和更早版本中一样被设为 255。" + +#: ../../library/gzip.rst:207 +msgid "" +"The *mtime* parameter now defaults to 0 for reproducible output. For the " +"previous behaviour of using the current time, pass ``None`` to *mtime*." +msgstr "" +"现在 *mtime* 形参默认为 0 以确保可复现的输出。要保留之前版本中使用当前时间的行为,则将 ``None`` 传给 *mtime*。" + +#: ../../library/gzip.rst:214 +msgid "" +"Decompress the *data*, returning a :class:`bytes` object containing the " +"uncompressed data. This function is capable of decompressing multi-member " +"gzip data (multiple gzip blocks concatenated together). When the data is " +"certain to contain only one member the :func:`zlib.decompress` function with" +" *wbits* set to 31 is faster." +msgstr "" +"解压缩 *data*,返回一个包含已解压数据的 :class:`bytes` 对象。此函数可以解压缩多成员的 gzip 数据(即多个 gzip " +"块拼接在一起)。当数据确定只包含一个成员时则 *wbits* 设为 31 的 :func:`zlib.decompress` 函数更快一些。" + +#: ../../library/gzip.rst:221 +msgid "" +"Speed is improved by decompressing members at once in memory instead of in a" +" streamed fashion." +msgstr "通过一次性解压缩全部数据而不是通过流方式提高了速度。" + +#: ../../library/gzip.rst:228 +msgid "Examples of usage" +msgstr "用法示例" + +#: ../../library/gzip.rst:230 +msgid "Example of how to read a compressed file::" +msgstr "读取压缩文件示例::" + +#: ../../library/gzip.rst:232 +msgid "" +"import gzip\n" +"with gzip.open('/home/joe/file.txt.gz', 'rb') as f:\n" +" file_content = f.read()" +msgstr "" +"import gzip\n" +"with gzip.open('/home/joe/file.txt.gz', 'rb') as f:\n" +" file_content = f.read()" + +#: ../../library/gzip.rst:236 +msgid "Example of how to create a compressed GZIP file::" +msgstr "创建 GZIP 文件示例::" + +#: ../../library/gzip.rst:238 +msgid "" +"import gzip\n" +"content = b\"Lots of content here\"\n" +"with gzip.open('/home/joe/file.txt.gz', 'wb') as f:\n" +" f.write(content)" +msgstr "" +"import gzip\n" +"content = b\"Lots of content here\"\n" +"with gzip.open('/home/joe/file.txt.gz', 'wb') as f:\n" +" f.write(content)" + +#: ../../library/gzip.rst:243 +msgid "Example of how to GZIP compress an existing file::" +msgstr "使用 GZIP 压缩已有的文件示例::" + +#: ../../library/gzip.rst:245 +msgid "" +"import gzip\n" +"import shutil\n" +"with open('/home/joe/file.txt', 'rb') as f_in:\n" +" with gzip.open('/home/joe/file.txt.gz', 'wb') as f_out:\n" +" shutil.copyfileobj(f_in, f_out)" +msgstr "" +"import gzip\n" +"import shutil\n" +"with open('/home/joe/file.txt', 'rb') as f_in:\n" +" with gzip.open('/home/joe/file.txt.gz', 'wb') as f_out:\n" +" shutil.copyfileobj(f_in, f_out)" + +#: ../../library/gzip.rst:251 +msgid "Example of how to GZIP compress a binary string::" +msgstr "使用 GZIP 压缩二进制字符串示例::" + +#: ../../library/gzip.rst:253 +msgid "" +"import gzip\n" +"s_in = b\"Lots of content here\"\n" +"s_out = gzip.compress(s_in)" +msgstr "" +"import gzip\n" +"s_in = b\"Lots of content here\"\n" +"s_out = gzip.compress(s_in)" + +#: ../../library/gzip.rst:259 +msgid "Module :mod:`zlib`" +msgstr "模块 :mod:`zlib`" + +#: ../../library/gzip.rst:260 +msgid "" +"The basic data compression module needed to support the :program:`gzip` file" +" format." +msgstr "支持 :program:`gzip` 格式所需要的基本压缩模块。" + +#: ../../library/gzip.rst:263 +msgid "" +"In case gzip (de)compression is a bottleneck, the `python-isal`_ package " +"speeds up (de)compression with a mostly compatible API." +msgstr "对于 gzip (解) 压缩成为瓶颈的情况,`python-isal`_ 软件包会使用基本兼容的 API 来加快 (解) 压缩的速度。" + +#: ../../library/gzip.rst:273 +msgid "Command-line interface" +msgstr "命令行接口" + +#: ../../library/gzip.rst:275 +msgid "" +"The :mod:`!gzip` module provides a simple command line interface to compress" +" or decompress files." +msgstr ":mod:`!gzip` 模块提供了简单的命令行界面用于压缩或解压缩文件。" + +#: ../../library/gzip.rst:278 +msgid "Once executed the :mod:`!gzip` module keeps the input file(s)." +msgstr "在执行之后 :mod:`!gzip` 模块会保留输入文件。module keeps the input file(s)." + +#: ../../library/gzip.rst:282 +msgid "" +"Add a new command line interface with a usage. By default, when you will " +"execute the CLI, the default compression level is 6." +msgstr "添加一个带有用法说明的新命令行界面命令。默认情况下,当你要执行 CLI 时,默认压缩等级为 6。" + +#: ../../library/gzip.rst:286 +msgid "Command-line options" +msgstr "命令行选项" + +#: ../../library/gzip.rst:290 +msgid "If *file* is not specified, read from :data:`sys.stdin`." +msgstr "如果未指定 *file*,则从 :data:`sys.stdin` 读取。" + +#: ../../library/gzip.rst:294 +msgid "Indicates the fastest compression method (less compression)." +msgstr "指明最快速的压缩方法(较低压缩率)。" + +#: ../../library/gzip.rst:298 +msgid "Indicates the slowest compression method (best compression)." +msgstr "指明最慢速的压缩方法(最高压缩率)。" + +#: ../../library/gzip.rst:302 +msgid "Decompress the given file." +msgstr "解压缩给定的文件。" + +#: ../../library/gzip.rst:306 +msgid "Show the help message." +msgstr "显示帮助消息。" diff --git a/library/hashlib.po b/library/hashlib.po new file mode 100644 index 0000000000..ecd8a236e6 --- /dev/null +++ b/library/hashlib.po @@ -0,0 +1,1248 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:17+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/hashlib.rst:2 +msgid ":mod:`!hashlib` --- Secure hashes and message digests" +msgstr ":mod:`!hashlib` --- 安全哈希与消息摘要" + +#: ../../library/hashlib.rst:10 +msgid "**Source code:** :source:`Lib/hashlib.py`" +msgstr "**源码:** :source:`Lib/hashlib.py`" + +#: ../../library/hashlib.rst:23 +msgid "" +"This module implements a common interface to many different hash algorithms." +" Included are the FIPS secure hash algorithms SHA224, SHA256, SHA384, " +"SHA512, (defined in `the FIPS 180-4 standard`_), the SHA-3 series (defined " +"in `the FIPS 202 standard`_) as well as the legacy algorithms SHA1 " +"(`formerly part of FIPS`_) and the MD5 algorithm (defined in internet " +":rfc:`1321`)." +msgstr "" +"本模块实现了一个针对不同哈希算法的通用接口。包括了 FIPS 安全哈希算法 SHA224, SHA256, SHA384, SHA512, (定义见 " +"`the FIPS 180-4 standard`_), SHA-3 系列 (定义见 `the FIPS 202 standard`_) 以及旧式算法 " +"SHA1 (`formerly part of FIPS`_) 和 MD5 算法 (定义见 internet :rfc:`1321`)。" + +#: ../../library/hashlib.rst:31 +msgid "" +"If you want the adler32 or crc32 hash functions, they are available in the " +":mod:`zlib` module." +msgstr "如果你想找到 adler32 或 crc32 哈希函数,它们在 :mod:`zlib` 模块中。" + +#: ../../library/hashlib.rst:38 +msgid "Hash algorithms" +msgstr "哈希算法" + +#: ../../library/hashlib.rst:40 +msgid "" +"There is one constructor method named for each type of :dfn:`hash`. All " +"return a hash object with the same simple interface. For example: use " +":func:`sha256` to create a SHA-256 hash object. You can now feed this object" +" with :term:`bytes-like objects ` (normally " +":class:`bytes`) using the :meth:`update` method. At any point " +"you can ask it for the :dfn:`digest` of the concatenation of the data fed to" +" it so far using the :meth:`digest()` or " +":meth:`hexdigest()` methods." +msgstr "" +"每种类型的 :dfn:`hash` 都有一个构造器方法。它们都返回一个具有相同简单接口的哈希对象。例如,使用 :func:`sha256` 创建一个 " +"SHA-256 哈希对象。你可以使用 :meth:`update` 方法向这个对象输入 :term:`字节类对象 " +"` (通常是 :class:`bytes`)。在任何时候你都可以使用 " +":meth:`digest()` 或 :meth:`hexdigest()` " +"方法获得到目前为止输入这个对象的拼接数据的 :dfn:`digest`。" + +#: ../../library/hashlib.rst:48 +msgid "" +"To allow multithreading, the Python :term:`GIL` is released while computing " +"a hash supplied more than 2047 bytes of data at once in its constructor or " +":meth:`.update` method." +msgstr "" +"为了允许多线程,当在其构造器或 :meth:`.update` 方法中计算一次性提供超过 2047 字节数据的哈希时将会释放 " +"Python :term:`GIL`." + +#: ../../library/hashlib.rst:55 +msgid "" +"Constructors for hash algorithms that are always present in this module are " +":func:`sha1`, :func:`sha224`, :func:`sha256`, :func:`sha384`, " +":func:`sha512`, :func:`sha3_224`, :func:`sha3_256`, :func:`sha3_384`, " +":func:`sha3_512`, :func:`shake_128`, :func:`shake_256`, :func:`blake2b`, and" +" :func:`blake2s`. :func:`md5` is normally available as well, though it may " +"be missing or blocked if you are using a rare \"FIPS compliant\" build of " +"Python. These correspond to :data:`algorithms_guaranteed`." +msgstr "" +"本模块中总是存在的哈希算法构造器有 :func:`sha1`, :func:`sha224`, :func:`sha256`, " +":func:`sha384`, :func:`sha512`, :func:`sha3_224`, :func:`sha3_256`, " +":func:`sha3_384`, :func:`sha3_512`, :func:`shake_128`, :func:`shake_256`, " +":func:`blake2b` 和 :func:`blake2s`。 :func:`md5` 通常也是可用的,但在你使用稀有的 \"FIPS 兼容\" " +"Python 编译版时它可能会缺失或被屏蔽。这些构造器对应于 :data:`algorithms_guaranteed`。" + +#: ../../library/hashlib.rst:63 +msgid "" +"Additional algorithms may also be available if your Python distribution's " +":mod:`!hashlib` was linked against a build of OpenSSL that provides others. " +"Others *are not guaranteed available* on all installations and will only be " +"accessible by name via :func:`new`. See :data:`algorithms_available`." +msgstr "" +"如果你的 Python 分发版的 :mod:`!hashlib` 是基于提供了其他算法的 OpenSSL 编译版上链接的那么还可能存在一些附加的算法。 " +"其他算法在各个安装版上 *不保证全都可用* 并且仅可通过 :func:`new` 使用名称来访问。 参见 " +":data:`algorithms_available`。" + +#: ../../library/hashlib.rst:70 +msgid "" +"Some algorithms have known hash collision weaknesses (including MD5 and " +"SHA1). Refer to `Attacks on cryptographic hash algorithms`_ and the " +"`hashlib-seealso`_ section at the end of this document." +msgstr "" +"一些算法具有已知的碰撞弱点(包括 MD5 和 SHA1)。请参阅本文档末尾的 `Attacks on cryptographic hash " +"algorithms`_ 和 `hashlib-seealso`_ 小节。" + +#: ../../library/hashlib.rst:74 +msgid "" +"SHA3 (Keccak) and SHAKE constructors :func:`sha3_224`, :func:`sha3_256`, " +":func:`sha3_384`, :func:`sha3_512`, :func:`shake_128`, :func:`shake_256` " +"were added. :func:`blake2b` and :func:`blake2s` were added." +msgstr "" +"增加了 SHA3 (Keccak) 和 SHAKE 构造器 :func:`sha3_224`, :func:`sha3_256`, " +":func:`sha3_384`, :func:`sha3_512`, :func:`shake_128`, :func:`shake_256`. " +"并增加了 :func:`blake2b` 和 :func:`blake2s`。" + +#: ../../library/hashlib.rst:82 +msgid "" +"All hashlib constructors take a keyword-only argument *usedforsecurity* with" +" default value ``True``. A false value allows the use of insecure and " +"blocked hashing algorithms in restricted environments. ``False`` indicates " +"that the hashing algorithm is not used in a security context, e.g. as a non-" +"cryptographic one-way compression function." +msgstr "" +"所有 hashlib 的构造器都接受仅限关键字参数 *usedforsecurity* 且其默认值为 ``True``。 " +"设为假值即允许在受限的环境中使用不安全且被屏蔽的哈希算法。``False`` 表示此哈希算法不可用于安全场景,例如用作非加密的单向压缩函数。" + +#: ../../library/hashlib.rst:89 +msgid "Hashlib now uses SHA3 and SHAKE from OpenSSL if it provides it." +msgstr "现在 hashlib 会在 OpenSSL 有提供的情况下使用 SHA3 和 SHAKE。" + +#: ../../library/hashlib.rst:92 +msgid "" +"For any of the MD5, SHA1, SHA2, or SHA3 algorithms that the linked OpenSSL " +"does not provide we fall back to a verified implementation from the `HACL\\*" +" project`_." +msgstr "" +"在所链接的 OpenSSL 未提供 MD5, SHA1, SHA2 或 SHA3 算法的情况下我们将回退至来自 `HACL\\* project`_ " +"的已验证的实现。" + +#: ../../library/hashlib.rst:98 +msgid "Usage" +msgstr "用法" + +#: ../../library/hashlib.rst:100 +msgid "" +"To obtain the digest of the byte string ``b\"Nobody inspects the spammish " +"repetition\"``::" +msgstr "要获取字节串 ``b\"Nobody inspects the spammish repetition\"`` 的摘要::" + +#: ../../library/hashlib.rst:103 +msgid "" +">>> import hashlib\n" +">>> m = hashlib.sha256()\n" +">>> m.update(b\"Nobody inspects\")\n" +">>> m.update(b\" the spammish repetition\")\n" +">>> m.digest()\n" +"b'\\x03\\x1e\\xdd}Ae\\x15\\x93\\xc5\\xfe\\\\\\x00o\\xa5u+7\\xfd\\xdf\\xf7\\xbcN\\x84:\\xa6\\xaf\\x0c\\x95\\x0fK\\x94\\x06'\n" +">>> m.hexdigest()\n" +"'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'" +msgstr "" +">>> import hashlib\n" +">>> m = hashlib.sha256()\n" +">>> m.update(b\"Nobody inspects\")\n" +">>> m.update(b\" the spammish repetition\")\n" +">>> m.digest()\n" +"b'\\x03\\x1e\\xdd}Ae\\x15\\x93\\xc5\\xfe\\\\\\x00o\\xa5u+7\\xfd\\xdf\\xf7\\xbcN\\x84:\\xa6\\xaf\\x0c\\x95\\x0fK\\x94\\x06'\n" +">>> m.hexdigest()\n" +"'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'" + +#: ../../library/hashlib.rst:112 +msgid "More condensed:" +msgstr "更简要的写法:" + +#: ../../library/hashlib.rst:118 +msgid "Constructors" +msgstr "构造器" + +#: ../../library/hashlib.rst:122 +msgid "" +"Is a generic constructor that takes the string *name* of the desired " +"algorithm as its first parameter. It also exists to allow access to the " +"above listed hashes as well as any other algorithms that your OpenSSL " +"library may offer." +msgstr "" +"接受想要的算法对应的字符串 *name* 作为其第一个形参的泛型构造器。它还允许访问上面列出的哈希算法以及你的 OpenSSL " +"库可能提供的任何其他算法。" + +#: ../../library/hashlib.rst:127 +msgid "Using :func:`new` with an algorithm name:" +msgstr "使用 :func:`new` 并附带一个算法名称:" + +#: ../../library/hashlib.rst:146 +msgid "" +"Named constructors such as these are faster than passing an algorithm name " +"to :func:`new`." +msgstr "这些带命名的构造器速度相比向 :func:`new` 传入算法名称更快。" + +#: ../../library/hashlib.rst:150 +msgid "Attributes" +msgstr "属性" + +#: ../../library/hashlib.rst:152 +msgid "Hashlib provides the following constant module attributes:" +msgstr "在 hashlib 中提供了下列常量模块属性:" + +#: ../../library/hashlib.rst:156 +msgid "" +"A set containing the names of the hash algorithms guaranteed to be supported" +" by this module on all platforms. Note that 'md5' is in this list despite " +"some upstream vendors offering an odd \"FIPS compliant\" Python build that " +"excludes it." +msgstr "" +"一个集合,其中包含此模块在所有平台上都保证支持的哈希算法的名称。请注意 'md5' 也在此清单中,虽然某些上游厂商提供了一个怪异的排除了此算法的 " +"\"FIPS 兼容\" Python 编译版本。" + +#: ../../library/hashlib.rst:165 +msgid "" +"A set containing the names of the hash algorithms that are available in the " +"running Python interpreter. These names will be recognized when passed to " +":func:`new`. :attr:`algorithms_guaranteed` will always be a subset. The " +"same algorithm may appear multiple times in this set under different names " +"(thanks to OpenSSL)." +msgstr "" +"一个集合,其中包含在所运行的 Python 解释器上可用的哈希算法的名称。将这些名称传给 :func:`new` 时将可被识别。 " +":attr:`algorithms_guaranteed` 将总是它的一个子集。同样的算法在此集合中可能以不同的名称出现多次(这是 OpenSSL " +"的原因)。" + +#: ../../library/hashlib.rst:174 +msgid "Hash Objects" +msgstr "哈希对象" + +#: ../../library/hashlib.rst:176 +msgid "" +"The following values are provided as constant attributes of the hash objects" +" returned by the constructors:" +msgstr "下列值会以构造器所返回的哈希对象的常量属性的形式被提供:" + +#: ../../library/hashlib.rst:181 +msgid "The size of the resulting hash in bytes." +msgstr "以字节表示的结果哈希对象的大小。" + +#: ../../library/hashlib.rst:185 +msgid "The internal block size of the hash algorithm in bytes." +msgstr "以字节表示的哈希算法的内部块大小。" + +#: ../../library/hashlib.rst:187 +msgid "A hash object has the following attributes:" +msgstr "hash 对象具有以下属性:" + +#: ../../library/hashlib.rst:191 +msgid "" +"The canonical name of this hash, always lowercase and always suitable as a " +"parameter to :func:`new` to create another hash of this type." +msgstr "此哈希对象的规范名称,总是为小写形式并且总是可以作为 :func:`new` 的形参用来创建另一个此类型的哈希对象。" + +#: ../../library/hashlib.rst:194 +msgid "" +"The name attribute has been present in CPython since its inception, but " +"until Python 3.4 was not formally specified, so may not exist on some " +"platforms." +msgstr "name 属性自被引入起即存在于 CPython 中,但在 Python 3.4 之前并未正式指明,因此可能不存在于某些平台上。" + +#: ../../library/hashlib.rst:199 +msgid "A hash object has the following methods:" +msgstr "哈希对象具有下列方法:" + +#: ../../library/hashlib.rst:204 +msgid "" +"Update the hash object with the :term:`bytes-like object`. Repeated calls " +"are equivalent to a single call with the concatenation of all the arguments:" +" ``m.update(a); m.update(b)`` is equivalent to ``m.update(a+b)``." +msgstr "" +"用 :term:`bytes-like object` 来更新哈希对象。 重复调用相当于单次调用并传入所有参数的拼接结果: ``m.update(a);" +" m.update(b)`` 等价于 ``m.update(a+b)``。" + +#: ../../library/hashlib.rst:212 +msgid "" +"Return the digest of the data passed to the :meth:`update` method so far. " +"This is a bytes object of size :attr:`digest_size` which may contain bytes " +"in the whole range from 0 to 255." +msgstr "" +"返回当前已传给 :meth:`update` 方法的数据摘要。这是一个大小为 :attr:`digest_size` 的字节串对象,字节串中可包含 0 " +"至 255 的完整取值范围。" + +#: ../../library/hashlib.rst:219 +msgid "" +"Like :meth:`digest` except the digest is returned as a string object of " +"double length, containing only hexadecimal digits. This may be used to " +"exchange the value safely in email or other non-binary environments." +msgstr "" +"类似于 :meth:`digest` 但摘要会以两倍长度字符串对象的形式返回,其中仅包含十六进制数码。 " +"这可以被用于在电子邮件或其他非二进制环境中安全地交换数据值。" + +#: ../../library/hashlib.rst:226 +msgid "" +"Return a copy (\"clone\") of the hash object. This can be used to " +"efficiently compute the digests of data sharing a common initial substring." +msgstr "返回哈希对象的副本(“克隆”)。这可被用来高效地计算共享相同初始子串的数据的摘要。" + +#: ../../library/hashlib.rst:231 +msgid "SHAKE variable length digests" +msgstr "SHAKE 可变长度摘要" + +#: ../../library/hashlib.rst:236 +msgid "" +"The :func:`shake_128` and :func:`shake_256` algorithms provide variable " +"length digests with length_in_bits//2 up to 128 or 256 bits of security. As " +"such, their digest methods require a length. Maximum length is not limited " +"by the SHAKE algorithm." +msgstr "" +":func:`shake_128` 和 :func:`shake_256` 算法提供安全的 length_in_bits//2 至 128 或 256 " +"位可变长度摘要。为此,它们的摘要需指定一个长度。SHAKE 算法不限制最大长度。" + +#: ../../library/hashlib.rst:243 +msgid "" +"Return the digest of the data passed to the :meth:`~hash.update` method so " +"far. This is a bytes object of size *length* which may contain bytes in the " +"whole range from 0 to 255." +msgstr "" +"返回当前已传给 :meth:`~hash.update` 方法的数据摘要。这是一个大小为 *length* 的字节串对象,其中可包含 0 至 255 " +"完整范围内的字节值。" + +#: ../../library/hashlib.rst:250 +msgid "" +"Like :meth:`digest` except the digest is returned as a string object of " +"double length, containing only hexadecimal digits. This may be used to " +"exchange the value in email or other non-binary environments." +msgstr "" +"类似于 :meth:`digest` 但摘要会以两倍长度字符串对象的形式返回,其中仅包含十六进制数码。 " +"这可以被用于在电子邮件或其他非二进制环境中交换数据值。" + +#: ../../library/hashlib.rst:254 +msgid "Example use:" +msgstr "用法示例:" + +#: ../../library/hashlib.rst:261 +msgid "File hashing" +msgstr "文件哈希" + +#: ../../library/hashlib.rst:263 +msgid "" +"The hashlib module provides a helper function for efficient hashing of a " +"file or file-like object." +msgstr "hashlib 模块提供了一个辅助函数用于文件或文件型对象的高效哈希操作。" + +#: ../../library/hashlib.rst:268 +msgid "" +"Return a digest object that has been updated with contents of file object." +msgstr "返回一个根据文件对象进行更新的摘要对象。" + +#: ../../library/hashlib.rst:270 +msgid "" +"*fileobj* must be a file-like object opened for reading in binary mode. It " +"accepts file objects from builtin :func:`open`, :class:`~io.BytesIO` " +"instances, SocketIO objects from :meth:`socket.socket.makefile`, and " +"similar. *fileobj* must be opened in blocking mode, otherwise a " +":exc:`BlockingIOError` may be raised." +msgstr "" +"*fileobj* 必须是一个以二进制模式打开用于读取的文件型对象。它接受来自内置 :func:`open`, :class:`~io.BytesIO`" +" 实例,:meth:`socket.socket.makefile` 创建的 SocketIO 及其他类似的文件对象。 *fileobj* " +"必须以阻塞模式打开,否则可能引发 :exc:`BlockingIOError`。" + +#: ../../library/hashlib.rst:276 +msgid "" +"The function may bypass Python's I/O and use the file descriptor from " +":meth:`~io.IOBase.fileno` directly. *fileobj* must be assumed to be in an " +"unknown state after this function returns or raises. It is up to the caller " +"to close *fileobj*." +msgstr "" +"此函数可能会绕过 Python 的 I/O 并直接使用来自 :meth:`~io.IOBase.fileno` 的文件描述符。 *fileobj* " +"在此函数返回或引发异常之后必须被假定为已处于未知状态。应当由调用方来负责关闭 *fileobj*。" + +#: ../../library/hashlib.rst:281 +msgid "" +"*digest* must either be a hash algorithm name as a *str*, a hash " +"constructor, or a callable that returns a hash object." +msgstr "*digest* 必须是一个 *str* 形式的哈希算法名称、哈希构造器或返回哈希对象的可调用对象。" + +#: ../../library/hashlib.rst:284 +msgid "Example:" +msgstr "示例:" + +#: ../../library/hashlib.rst:305 +msgid "" +"Now raises a :exc:`BlockingIOError` if the file is opened in non-blocking " +"mode. Previously, spurious null bytes were added to the digest." +msgstr "现在如果文件是以非阻塞模式打开则会引发 :exc:`BlockingIOError`。在之前版本中,会向摘要添加伪装的空字节。" + +#: ../../library/hashlib.rst:311 +msgid "Key derivation" +msgstr "密钥派生" + +#: ../../library/hashlib.rst:313 +msgid "" +"Key derivation and key stretching algorithms are designed for secure " +"password hashing. Naive algorithms such as ``sha1(password)`` are not " +"resistant against brute-force attacks. A good password hashing function must" +" be tunable, slow, and include a `salt " +"`_." +msgstr "" +"密钥派生和密钥延展算法被设计用于安全密码哈希。``sha1(password)`` 这样的简单算法无法防御暴力攻击。 " +"好的密码哈希函数必须可以微调、放慢步调,并且包含 `加盐 " +"`_." + +#: ../../library/hashlib.rst:321 +msgid "" +"The function provides PKCS#5 password-based key derivation function 2. It " +"uses HMAC as pseudorandom function." +msgstr "此函数提供 PKCS#5 基于密码的密钥派生函数 2。它使用 HMAC 作为伪随机函数。" + +#: ../../library/hashlib.rst:324 +msgid "" +"The string *hash_name* is the desired name of the hash digest algorithm for " +"HMAC, e.g. 'sha1' or 'sha256'. *password* and *salt* are interpreted as " +"buffers of bytes. Applications and libraries should limit *password* to a " +"sensible length (e.g. 1024). *salt* should be about 16 or more bytes from a " +"proper source, e.g. :func:`os.urandom`." +msgstr "" +"字符串 *hash_name* 是要求用于 HMAC 的哈希摘要算法的名称,例如 'sha1' 或 'sha256'。 *password* 和 " +"*salt* 会以字节串缓冲区的形式被解析。应用和库应当将 *password* 限制在合理长度 (例如 1024)。 *salt* 应当为适当来源例如" +" :func:`os.urandom` 的大约 16 个或更多的字节串数据。" + +#: ../../library/hashlib.rst:330 +msgid "" +"The number of *iterations* should be chosen based on the hash algorithm and " +"computing power. As of 2022, hundreds of thousands of iterations of SHA-256 " +"are suggested. For rationale as to why and how to choose what is best for " +"your application, read *Appendix A.2.2* of NIST-SP-800-132_. The answers on " +"the `stackexchange pbkdf2 iterations question`_ explain in detail." +msgstr "" +"*iterations* 的数值应当基于哈希算法和机器算力来选择。在 2022 年,建议选择进行数十万次的 SHA-256 迭代。 " +"对于为何以及如何选择最适合你的应用程序的迭代次数的理由,请参阅 NIST-SP-800-132_ 的 *Appendix A.2.2*。 " +"`stackexchange pbkdf2 iterations question`_ 的解答提供了详细的说明。" + +#: ../../library/hashlib.rst:336 +msgid "" +"*dklen* is the length of the derived key in bytes. If *dklen* is ``None`` " +"then the digest size of the hash algorithm *hash_name* is used, e.g. 64 for " +"SHA-512." +msgstr "" +"*dklen* 是以字节数表示的派生密钥长度。如果 *dklen* 为 ``None`` 则会使用哈希算法 *hash_name* 的摘要长度,例如对 " +"SHA-512 来说是 64。" + +#: ../../library/hashlib.rst:345 +msgid "Function only available when Python is compiled with OpenSSL." +msgstr "此函数只有在 Python 附带 OpenSSL 编译时才可用。" + +#: ../../library/hashlib.rst:349 +msgid "" +"Function now only available when Python is built with OpenSSL. The slow pure" +" Python implementation has been removed." +msgstr "现在此函数只有在 Python 附带 OpenSSL 构建时才可用。慢速的纯 Python 实现已被移除。" + +#: ../../library/hashlib.rst:355 +msgid "" +"The function provides scrypt password-based key derivation function as " +"defined in :rfc:`7914`." +msgstr "此函数提供基于密码加密的密钥派生函数,其定义参见 :rfc:`7914`。" + +#: ../../library/hashlib.rst:358 +msgid "" +"*password* and *salt* must be :term:`bytes-like objects `. Applications and libraries should limit *password* to a sensible " +"length (e.g. 1024). *salt* should be about 16 or more bytes from a proper " +"source, e.g. :func:`os.urandom`." +msgstr "" +"*password* 和 *salt* 必须为 :term:`字节类对象 `。应用和库应当将 *password*" +" 限制在合理长度 (例如 1024)。 *salt* 应当为适当来源例如 :func:`os.urandom` 的大约 16 个或更多的字节串数据。" + +#: ../../library/hashlib.rst:363 +msgid "" +"*n* is the CPU/Memory cost factor, *r* the block size, *p* parallelization " +"factor and *maxmem* limits memory (OpenSSL 1.1.0 defaults to 32 MiB). " +"*dklen* is the length of the derived key in bytes." +msgstr "" +"*n* 是 CPU/内存开销因子,*r* 是块大小,*p* 是并行化因子而 *maxmem* 是内存上限(OpenSSL 1.1.0 默认为 32 " +"MiB)。 *dklen* 是以字节数表示的派生密钥长度。" + +#: ../../library/hashlib.rst:373 +msgid "BLAKE2" +msgstr "BLAKE2" + +#: ../../library/hashlib.rst:380 +msgid "" +"BLAKE2_ is a cryptographic hash function defined in :rfc:`7693` that comes " +"in two flavors:" +msgstr "BLAKE2_ 是在 :rfc:`7693` 中定义的加密哈希函数,它有两种形式:" + +#: ../../library/hashlib.rst:383 +msgid "" +"**BLAKE2b**, optimized for 64-bit platforms and produces digests of any size" +" between 1 and 64 bytes," +msgstr "**BLAKE2b**,针对 64 位平台进行优化,并会生成长度介于 1 和 64 字节之间任意大小的摘要。" + +#: ../../library/hashlib.rst:386 +msgid "" +"**BLAKE2s**, optimized for 8- to 32-bit platforms and produces digests of " +"any size between 1 and 32 bytes." +msgstr "**BLAKE2s**,针对 8 至 32 位平台进行优化,并会生成长度介于 1 和 32 字节之间任意大小的摘要。" + +#: ../../library/hashlib.rst:389 +msgid "" +"BLAKE2 supports **keyed mode** (a faster and simpler replacement for HMAC_)," +" **salted hashing**, **personalization**, and **tree hashing**." +msgstr "BLAKE2 支持 **密钥模式** (HMAC_ 的更快速更简单的替代)、**加盐哈希**、**个性化** 和 **树形哈希**。" + +#: ../../library/hashlib.rst:392 +msgid "" +"Hash objects from this module follow the API of standard library's " +":mod:`!hashlib` objects." +msgstr "此模块的哈希对象遵循标准库 :mod:`!hashlib` 对象的 API。" + +#: ../../library/hashlib.rst:397 +msgid "Creating hash objects" +msgstr "创建哈希对象" + +#: ../../library/hashlib.rst:399 +msgid "New hash objects are created by calling constructor functions:" +msgstr "新哈希对象可通过调用构造器函数来创建:" + +#: ../../library/hashlib.rst:413 +msgid "" +"These functions return the corresponding hash objects for calculating " +"BLAKE2b or BLAKE2s. They optionally take these general parameters:" +msgstr "这些函数返回用于计算 BLAKE2b 或 BLAKE2s 的相应的哈希对象。它们接受下列可选通用形参:" + +#: ../../library/hashlib.rst:416 +msgid "" +"*data*: initial chunk of data to hash, which must be :term:`bytes-like " +"object`. It can be passed only as positional argument." +msgstr "*data*: 要哈希的初始数据块,它必须为 :term:`bytes-like object`。它只能作为位置参数传入。" + +#: ../../library/hashlib.rst:419 +msgid "*digest_size*: size of output digest in bytes." +msgstr "*digest_size*: 以字节数表示的输出摘要大小。" + +#: ../../library/hashlib.rst:421 +msgid "" +"*key*: key for keyed hashing (up to 64 bytes for BLAKE2b, up to 32 bytes for" +" BLAKE2s)." +msgstr "*key*: 用于密钥哈希的密钥(对于 BLAKE2b 最长 64 字节,对于 BLAKE2s 最长 32 字节)。" + +#: ../../library/hashlib.rst:424 +msgid "" +"*salt*: salt for randomized hashing (up to 16 bytes for BLAKE2b, up to 8 " +"bytes for BLAKE2s)." +msgstr "*salt*: 用于随机哈希的盐值(对于 BLAKE2b 最长 16 字节,对于 BLAKE2s 最长 8 字节)。" + +#: ../../library/hashlib.rst:427 +msgid "" +"*person*: personalization string (up to 16 bytes for BLAKE2b, up to 8 bytes " +"for BLAKE2s)." +msgstr "*person*: 个性化字符串(对于 BLAKE2b 最长 16 字节,对于 BLAKE2s 最长 8 字节)。" + +#: ../../library/hashlib.rst:430 +msgid "The following table shows limits for general parameters (in bytes):" +msgstr "下表显示了常规参数的限制(以字节为单位):" + +#: ../../library/hashlib.rst:433 +msgid "Hash" +msgstr "Hash" + +#: ../../library/hashlib.rst:433 +msgid "digest_size" +msgstr "digest_size" + +#: ../../library/hashlib.rst:433 +msgid "len(key)" +msgstr "len(key)" + +#: ../../library/hashlib.rst:433 +msgid "len(salt)" +msgstr "len(salt)" + +#: ../../library/hashlib.rst:433 +msgid "len(person)" +msgstr "len(person)" + +#: ../../library/hashlib.rst:435 +msgid "BLAKE2b" +msgstr "BLAKE2b" + +#: ../../library/hashlib.rst:435 +msgid "64" +msgstr "64" + +#: ../../library/hashlib.rst:435 +msgid "16" +msgstr "16" + +#: ../../library/hashlib.rst:436 +msgid "BLAKE2s" +msgstr "BLAKE2s" + +#: ../../library/hashlib.rst:436 +msgid "32" +msgstr "32" + +#: ../../library/hashlib.rst:436 +msgid "8" +msgstr "8" + +#: ../../library/hashlib.rst:441 +msgid "" +"BLAKE2 specification defines constant lengths for salt and personalization " +"parameters, however, for convenience, this implementation accepts byte " +"strings of any size up to the specified length. If the length of the " +"parameter is less than specified, it is padded with zeros, thus, for " +"example, ``b'salt'`` and ``b'salt\\x00'`` is the same value. (This is not " +"the case for *key*.)" +msgstr "" +"BLAKE2 规格描述为盐值和个性化形参定义了固定的长度,但是为了方便起见,此实现接受指定在长度以内的任意大小的字节串。 " +"如果形参长度小于指定值,它将以零值进行填充,因此举例来说,``b'salt'`` 和 ``b'salt\\x00'`` 为相同的值 (*key* " +"的情况则并非如此。)" + +#: ../../library/hashlib.rst:448 +msgid "These sizes are available as module `constants`_ described below." +msgstr "如下面的模块 `constants`_ 所描述,这些是可用的大小取值。" + +#: ../../library/hashlib.rst:450 +msgid "" +"Constructor functions also accept the following tree hashing parameters:" +msgstr "构造器函数还接受下列树形哈希形参:" + +#: ../../library/hashlib.rst:452 +msgid "*fanout*: fanout (0 to 255, 0 if unlimited, 1 in sequential mode)." +msgstr "*fanout*: 扇出值 (0 至 255,如无限制即为 0,连续模式下为 1)。" + +#: ../../library/hashlib.rst:454 +msgid "" +"*depth*: maximal depth of tree (1 to 255, 255 if unlimited, 1 in sequential " +"mode)." +msgstr "*depth*: 树的最大深度 (1 至 255,如无限制则为 255,连续模式下为 1)。" + +#: ../../library/hashlib.rst:457 +msgid "" +"*leaf_size*: maximal byte length of leaf (0 to ``2**32-1``, 0 if unlimited " +"or in sequential mode)." +msgstr "*leaf_size*: 叶子的最大字节长度 (0 至 ``2**32-1``,如无限制或在连续模式下则为 0)。" + +#: ../../library/hashlib.rst:460 +msgid "" +"*node_offset*: node offset (0 to ``2**64-1`` for BLAKE2b, 0 to ``2**48-1`` " +"for BLAKE2s, 0 for the first, leftmost, leaf, or in sequential mode)." +msgstr "" +"*node_offset*: 节点的偏移量 (对于 BLAKE2b 为 0 至 ``2**64-1``,对于 BLAKE2s 为 0 至 " +"``2**48-1``,对于最多边的第一个叶子或在连续模式下则为 0)。" + +#: ../../library/hashlib.rst:463 +msgid "" +"*node_depth*: node depth (0 to 255, 0 for leaves, or in sequential mode)." +msgstr "*node_depth*: 节点深度 (0 至 255,对于叶子或在连续模式下则为 0)。" + +#: ../../library/hashlib.rst:465 +msgid "" +"*inner_size*: inner digest size (0 to 64 for BLAKE2b, 0 to 32 for BLAKE2s, 0" +" in sequential mode)." +msgstr "" +"*inner_size*: 内部摘要大小 (对于 BLAKE2b 为 0 至 64,对于 BLAKE2s 为 0 至 32,连续模式下则为 0)。" + +#: ../../library/hashlib.rst:468 +msgid "" +"*last_node*: boolean indicating whether the processed node is the last one " +"(``False`` for sequential mode)." +msgstr "*last_node*: 一个指明所处理的节点是否为最后一个 (在连续模式下为 ``False``) 的布尔值。" + +#: ../../library/hashlib.rst:471 +msgid "Explanation of tree mode parameters." +msgstr "树模式形参的说明。" + +#: ../../library/hashlib.rst:475 +msgid "" +"See section 2.10 in `BLAKE2 specification " +"`_ for comprehensive review of " +"tree hashing." +msgstr "" +"请参阅 `BLAKE2 规格描述 `_ 第 2.10 " +"节获取有关树形哈希的完整介绍。" + +#: ../../library/hashlib.rst:481 +msgid "Constants" +msgstr "常量" + +#: ../../library/hashlib.rst:486 +msgid "Salt length (maximum length accepted by constructors)." +msgstr "盐值长度(构造器所接受的最大长度)。" + +#: ../../library/hashlib.rst:492 +msgid "" +"Personalization string length (maximum length accepted by constructors)." +msgstr "个性化字符串长度(构造器所接受的最大长度)。" + +#: ../../library/hashlib.rst:498 +msgid "Maximum key size." +msgstr "最大密钥长度。" + +#: ../../library/hashlib.rst:504 +msgid "Maximum digest size that the hash function can output." +msgstr "哈希函数可输出的最大摘要长度。" + +#: ../../library/hashlib.rst:508 +msgid "Examples" +msgstr "例子" + +#: ../../library/hashlib.rst:511 +msgid "Simple hashing" +msgstr "简单哈希" + +#: ../../library/hashlib.rst:513 +msgid "" +"To calculate hash of some data, you should first construct a hash object by " +"calling the appropriate constructor function (:func:`blake2b` or " +":func:`blake2s`), then update it with the data by calling " +":meth:`~hash.update` on the object, and, finally, get the digest out of the " +"object by calling :meth:`~hash.digest` (or :meth:`~hash.hexdigest` for hex-" +"encoded string)." +msgstr "" +"要计算某个数据的哈希值,你应该首先通过调用适当的构造器函数 (:func:`blake2b` 或 :func:`blake2s`) " +"来构造一个哈希对象,然后通过在该对象上调用 :meth:`~hash.update` 来更新目标数据,最后再通过调用 " +":meth:`~hash.digest` (或针对十六进制编码字符串的 :meth:`~hash.hexdigest`) 来获取该对象的摘要。" + +#: ../../library/hashlib.rst:526 +msgid "" +"As a shortcut, you can pass the first chunk of data to update directly to " +"the constructor as the positional argument:" +msgstr "作为快捷方式,你可以直接以位置参数的形式向构造器传入第一个数据块来直接更新:" + +#: ../../library/hashlib.rst:533 +msgid "" +"You can call :meth:`hash.update` as many times as you need to iteratively " +"update the hash:" +msgstr "你可以多次调用 :meth:`hash.update` 至你所想要的任意次数以迭代地更新哈希值:" + +#: ../../library/hashlib.rst:547 +msgid "Using different digest sizes" +msgstr "使用不同的摘要大小" + +#: ../../library/hashlib.rst:549 +msgid "" +"BLAKE2 has configurable size of digests up to 64 bytes for BLAKE2b and up to" +" 32 bytes for BLAKE2s. For example, to replace SHA-1 with BLAKE2b without " +"changing the size of output, we can tell BLAKE2b to produce 20-byte digests:" +msgstr "" +"BLAKE2 具有可配置的摘要大小,对于 BLAKE2b 最多 64 字节,对于 BLAKE2s 最多 32 字节。例如,要使用 BLAKE2b 来替代" +" SHA-1 而不改变输出大小,我们可以让 BLAKE2b 产生 20 个字节的摘要:" + +#: ../../library/hashlib.rst:563 +msgid "" +"Hash objects with different digest sizes have completely different outputs " +"(shorter hashes are *not* prefixes of longer hashes); BLAKE2b and BLAKE2s " +"produce different outputs even if the output length is the same:" +msgstr "" +"不同摘要大小的哈希对象具有完全不同的输出(较短哈希值 *并非* 较长哈希值的前缀);即使输出长度相同,BLAKE2b 和 BLAKE2s " +"也会产生不同的输出:" + +#: ../../library/hashlib.rst:579 +msgid "Keyed hashing" +msgstr "密钥哈希" + +#: ../../library/hashlib.rst:581 +msgid "" +"Keyed hashing can be used for authentication as a faster and simpler " +"replacement for `Hash-based message authentication code " +"`_ (HMAC). BLAKE2 can be securely used " +"in prefix-MAC mode thanks to the indifferentiability property inherited from" +" BLAKE." +msgstr "" +"带密钥的哈希运算可被用于身份验证,作为 `基于哈希的消息验证代码 `_ " +"(HMAC) 的一种更快速更简单的替代。BLAKE2 可被安全地用于前缀 MAC 模式,这是由于它从 BLAKE 继承而来的不可区分特性。" + +#: ../../library/hashlib.rst:587 +msgid "" +"This example shows how to get a (hex-encoded) 128-bit authentication code " +"for message ``b'message data'`` with key ``b'pseudorandom key'``::" +msgstr "" +"这个例子演示了如何使用密钥 ``b'pseudorandom key'`` 来为 ``b'message data'`` " +"获取一个(十六进制编码的)128 位验证代码::" + +#: ../../library/hashlib.rst:590 +msgid "" +">>> from hashlib import blake2b\n" +">>> h = blake2b(key=b'pseudorandom key', digest_size=16)\n" +">>> h.update(b'message data')\n" +">>> h.hexdigest()\n" +"'3d363ff7401e02026f4a4687d4863ced'" +msgstr "" +">>> from hashlib import blake2b\n" +">>> h = blake2b(key=b'pseudorandom key', digest_size=16)\n" +">>> h.update(b'message data')\n" +">>> h.hexdigest()\n" +"'3d363ff7401e02026f4a4687d4863ced'" + +#: ../../library/hashlib.rst:597 +msgid "" +"As a practical example, a web application can symmetrically sign cookies " +"sent to users and later verify them to make sure they weren't tampered " +"with::" +msgstr "作为实际的例子,一个 Web 应用可为发送给用户的 cookies 进行对称签名,并在之后对其进行验证以确保它们没有被篡改::" + +#: ../../library/hashlib.rst:600 +msgid "" +">>> from hashlib import blake2b\n" +">>> from hmac import compare_digest\n" +">>>\n" +">>> SECRET_KEY = b'pseudorandomly generated server secret key'\n" +">>> AUTH_SIZE = 16\n" +">>>\n" +">>> def sign(cookie):\n" +"... h = blake2b(digest_size=AUTH_SIZE, key=SECRET_KEY)\n" +"... h.update(cookie)\n" +"... return h.hexdigest().encode('utf-8')\n" +">>>\n" +">>> def verify(cookie, sig):\n" +"... good_sig = sign(cookie)\n" +"... return compare_digest(good_sig, sig)\n" +">>>\n" +">>> cookie = b'user-alice'\n" +">>> sig = sign(cookie)\n" +">>> print(\"{0},{1}\".format(cookie.decode('utf-8'), sig))\n" +"user-alice,b'43b3c982cf697e0c5ab22172d1ca7421'\n" +">>> verify(cookie, sig)\n" +"True\n" +">>> verify(b'user-bob', sig)\n" +"False\n" +">>> verify(cookie, b'0102030405060708090a0b0c0d0e0f00')\n" +"False" +msgstr "" +">>> from hashlib import blake2b\n" +">>> from hmac import compare_digest\n" +">>>\n" +">>> SECRET_KEY = b'pseudorandomly generated server secret key'\n" +">>> AUTH_SIZE = 16\n" +">>>\n" +">>> def sign(cookie):\n" +"... h = blake2b(digest_size=AUTH_SIZE, key=SECRET_KEY)\n" +"... h.update(cookie)\n" +"... return h.hexdigest().encode('utf-8')\n" +">>>\n" +">>> def verify(cookie, sig):\n" +"... good_sig = sign(cookie)\n" +"... return compare_digest(good_sig, sig)\n" +">>>\n" +">>> cookie = b'user-alice'\n" +">>> sig = sign(cookie)\n" +">>> print(\"{0},{1}\".format(cookie.decode('utf-8'), sig))\n" +"user-alice,b'43b3c982cf697e0c5ab22172d1ca7421'\n" +">>> verify(cookie, sig)\n" +"True\n" +">>> verify(b'user-bob', sig)\n" +"False\n" +">>> verify(cookie, b'0102030405060708090a0b0c0d0e0f00')\n" +"False" + +#: ../../library/hashlib.rst:626 +msgid "" +"Even though there's a native keyed hashing mode, BLAKE2 can, of course, be " +"used in HMAC construction with :mod:`hmac` module::" +msgstr "即使存在原生的密钥哈希模式,BLAKE2 也同样可在 :mod:`hmac` 模块的 HMAC 构造过程中使用::" + +#: ../../library/hashlib.rst:629 +msgid "" +">>> import hmac, hashlib\n" +">>> m = hmac.new(b'secret key', digestmod=hashlib.blake2s)\n" +">>> m.update(b'message')\n" +">>> m.hexdigest()\n" +"'e3c8102868d28b5ff85fc35dda07329970d1a01e273c37481326fe0c861c8142'" +msgstr "" +">>> import hmac, hashlib\n" +">>> m = hmac.new(b'secret key', digestmod=hashlib.blake2s)\n" +">>> m.update(b'message')\n" +">>> m.hexdigest()\n" +"'e3c8102868d28b5ff85fc35dda07329970d1a01e273c37481326fe0c861c8142'" + +#: ../../library/hashlib.rst:637 +msgid "Randomized hashing" +msgstr "随机哈希" + +#: ../../library/hashlib.rst:639 +msgid "" +"By setting *salt* parameter users can introduce randomization to the hash " +"function. Randomized hashing is useful for protecting against collision " +"attacks on the hash function used in digital signatures." +msgstr "用户可通过设置 *salt* 形参来为哈希函数引入随机化。随机哈希适用于防止对数字签名中使用的哈希函数进行碰撞攻击。" + +#: ../../library/hashlib.rst:643 +msgid "" +"Randomized hashing is designed for situations where one party, the message " +"preparer, generates all or part of a message to be signed by a second party," +" the message signer. If the message preparer is able to find cryptographic " +"hash function collisions (i.e., two messages producing the same hash value)," +" then they might prepare meaningful versions of the message that would " +"produce the same hash value and digital signature, but with different " +"results (e.g., transferring $1,000,000 to an account, rather than $10). " +"Cryptographic hash functions have been designed with collision resistance as" +" a major goal, but the current concentration on attacking cryptographic hash" +" functions may result in a given cryptographic hash function providing less " +"collision resistance than expected. Randomized hashing offers the signer " +"additional protection by reducing the likelihood that a preparer can " +"generate two or more messages that ultimately yield the same hash value " +"during the digital signature generation process --- even if it is practical " +"to find collisions for the hash function. However, the use of randomized " +"hashing may reduce the amount of security provided by a digital signature " +"when all portions of the message are prepared by the signer." +msgstr "" +"随机哈希被设计用来处理当一方(消息准备者)要生成由另一方(消息签名者)进行签名的全部或部分消息的情况。 " +"如果消息准备者能够找到加密哈希函数的碰撞现象(即两条消息产生相同的哈希值),则他们就可以准备将产生相同哈希值和数字签名但却具有不同结果的有意义的消息版本(例如向某个账户转入" +" $1,000,000 而不是 $10)。 " +"加密哈希函数的设计都是以防碰撞性能为其主要目标之一的,但是当前针对加密哈希函数的集中攻击可能导致特定加密哈希函数所提供的防碰撞性能低于预期。 " +"随机哈希为签名者提供了额外的保护,可以降低准备者在数字签名生成过程中使得两条或更多条消息最终产生相同哈希值的可能性 --- " +"即使为特定哈希函数找到碰撞现象是可行的。但是,当消息的所有部分均由签名者准备时,使用随机哈希可能降低数字签名所提供的安全性。" + +#: ../../library/hashlib.rst:662 +msgid "" +"(`NIST SP-800-106 \"Randomized Hashing for Digital Signatures\" " +"`_)" +msgstr "" +"(`NIST SP-800-106 \"数字签名的随机哈希\" " +"`_)" + +#: ../../library/hashlib.rst:665 +msgid "" +"In BLAKE2 the salt is processed as a one-time input to the hash function " +"during initialization, rather than as an input to each compression function." +msgstr "在 BLAKE2 中,盐值会在初始化期间作为对哈希函数的一次性输入而不是对每个压缩函数的输入来处理。" + +#: ../../library/hashlib.rst:670 +msgid "" +"*Salted hashing* (or just hashing) with BLAKE2 or any other general-purpose " +"cryptographic hash function, such as SHA-256, is not suitable for hashing " +"passwords. See `BLAKE2 FAQ `_ for more " +"information." +msgstr "" +"使用 BLAKE2 或任何其他通用加密哈希函数,例如 SHA-256 进行 *加盐哈希* (或纯哈希) 并不适用于对密码的哈希。请参阅 `BLAKE2 " +"FAQ `_ 了解更多信息。" + +#: ../../library/hashlib.rst:693 +msgid "Personalization" +msgstr "个性化" + +#: ../../library/hashlib.rst:695 +msgid "" +"Sometimes it is useful to force hash function to produce different digests " +"for the same input for different purposes. Quoting the authors of the Skein " +"hash function:" +msgstr "出于不同的目的强制让哈希函数为相同的输入生成不同的摘要有时也是有用的。正如 Skein 哈希函数的作者所言:" + +#: ../../library/hashlib.rst:699 +msgid "" +"We recommend that all application designers seriously consider doing this; " +"we have seen many protocols where a hash that is computed in one part of the" +" protocol can be used in an entirely different part because two hash " +"computations were done on similar or related data, and the attacker can " +"force the application to make the hash inputs the same. Personalizing each " +"hash function used in the protocol summarily stops this type of attack." +msgstr "" +"我们建议所有应用设计者慎重考虑这种做法;我们已看到有许多协议在协议的某一部分中计算出来的哈希值在另一个完全不同的部分中也可以被使用,因为两次哈希计算是针对类似或相关的数据进行的,这样攻击者可以强制应用为相同的输入生成哈希值。" +" 个性化协议中所使用的每个哈希函数将有效地阻止这种类型的攻击。" + +#: ../../library/hashlib.rst:706 +msgid "" +"(`The Skein Hash Function Family `_, p. 21)" +msgstr "" +"(`Skein 哈希函数族 `_, p. 21)" + +#: ../../library/hashlib.rst:710 +msgid "BLAKE2 can be personalized by passing bytes to the *person* argument::" +msgstr "BLAKE2 可通过向 *person* 参数传入字节串来进行个性化::" + +#: ../../library/hashlib.rst:712 +msgid "" +">>> from hashlib import blake2b\n" +">>> FILES_HASH_PERSON = b'MyApp Files Hash'\n" +">>> BLOCK_HASH_PERSON = b'MyApp Block Hash'\n" +">>> h = blake2b(digest_size=32, person=FILES_HASH_PERSON)\n" +">>> h.update(b'the same content')\n" +">>> h.hexdigest()\n" +"'20d9cd024d4fb086aae819a1432dd2466de12947831b75c5a30cf2676095d3b4'\n" +">>> h = blake2b(digest_size=32, person=BLOCK_HASH_PERSON)\n" +">>> h.update(b'the same content')\n" +">>> h.hexdigest()\n" +"'cf68fb5761b9c44e7878bfb2c4c9aea52264a80b75005e65619778de59f383a3'" +msgstr "" +">>> from hashlib import blake2b\n" +">>> FILES_HASH_PERSON = b'MyApp Files Hash'\n" +">>> BLOCK_HASH_PERSON = b'MyApp Block Hash'\n" +">>> h = blake2b(digest_size=32, person=FILES_HASH_PERSON)\n" +">>> h.update(b'the same content')\n" +">>> h.hexdigest()\n" +"'20d9cd024d4fb086aae819a1432dd2466de12947831b75c5a30cf2676095d3b4'\n" +">>> h = blake2b(digest_size=32, person=BLOCK_HASH_PERSON)\n" +">>> h.update(b'the same content')\n" +">>> h.hexdigest()\n" +"'cf68fb5761b9c44e7878bfb2c4c9aea52264a80b75005e65619778de59f383a3'" + +#: ../../library/hashlib.rst:724 +msgid "" +"Personalization together with the keyed mode can also be used to derive " +"different keys from a single one." +msgstr "个性化配合密钥模式也可被用来从单个密钥派生出多个不同密钥。" + +#: ../../library/hashlib.rst:738 +msgid "Tree mode" +msgstr "树形模式" + +#: ../../library/hashlib.rst:740 +msgid "Here's an example of hashing a minimal tree with two leaf nodes::" +msgstr "以下是对包含两个叶子节点的最小树进行哈希的例子::" + +#: ../../library/hashlib.rst:742 +msgid "" +" 10\n" +" / \\\n" +"00 01" +msgstr "" +" 10\n" +" / \\\n" +"00 01" + +#: ../../library/hashlib.rst:746 +msgid "" +"This example uses 64-byte internal digests, and returns the 32-byte final " +"digest::" +msgstr "这个例子使用 64 字节内部摘要,返回 32 字节最终摘要::" + +#: ../../library/hashlib.rst:749 +msgid "" +">>> from hashlib import blake2b\n" +">>>\n" +">>> FANOUT = 2\n" +">>> DEPTH = 2\n" +">>> LEAF_SIZE = 4096\n" +">>> INNER_SIZE = 64\n" +">>>\n" +">>> buf = bytearray(6000)\n" +">>>\n" +">>> # Left leaf\n" +"... h00 = blake2b(buf[0:LEAF_SIZE], fanout=FANOUT, depth=DEPTH,\n" +"... leaf_size=LEAF_SIZE, inner_size=INNER_SIZE,\n" +"... node_offset=0, node_depth=0, last_node=False)\n" +">>> # Right leaf\n" +"... h01 = blake2b(buf[LEAF_SIZE:], fanout=FANOUT, depth=DEPTH,\n" +"... leaf_size=LEAF_SIZE, inner_size=INNER_SIZE,\n" +"... node_offset=1, node_depth=0, last_node=True)\n" +">>> # Root node\n" +"... h10 = blake2b(digest_size=32, fanout=FANOUT, depth=DEPTH,\n" +"... leaf_size=LEAF_SIZE, inner_size=INNER_SIZE,\n" +"... node_offset=0, node_depth=1, last_node=True)\n" +">>> h10.update(h00.digest())\n" +">>> h10.update(h01.digest())\n" +">>> h10.hexdigest()\n" +"'3ad2a9b37c6070e374c7a8c508fe20ca86b6ed54e286e93a0318e95e881db5aa'" +msgstr "" +">>> from hashlib import blake2b\n" +">>>\n" +">>> FANOUT = 2\n" +">>> DEPTH = 2\n" +">>> LEAF_SIZE = 4096\n" +">>> INNER_SIZE = 64\n" +">>>\n" +">>> buf = bytearray(6000)\n" +">>>\n" +">>> # Left leaf\n" +"... h00 = blake2b(buf[0:LEAF_SIZE], fanout=FANOUT, depth=DEPTH,\n" +"... leaf_size=LEAF_SIZE, inner_size=INNER_SIZE,\n" +"... node_offset=0, node_depth=0, last_node=False)\n" +">>> # Right leaf\n" +"... h01 = blake2b(buf[LEAF_SIZE:], fanout=FANOUT, depth=DEPTH,\n" +"... leaf_size=LEAF_SIZE, inner_size=INNER_SIZE,\n" +"... node_offset=1, node_depth=0, last_node=True)\n" +">>> # Root node\n" +"... h10 = blake2b(digest_size=32, fanout=FANOUT, depth=DEPTH,\n" +"... leaf_size=LEAF_SIZE, inner_size=INNER_SIZE,\n" +"... node_offset=0, node_depth=1, last_node=True)\n" +">>> h10.update(h00.digest())\n" +">>> h10.update(h01.digest())\n" +">>> h10.hexdigest()\n" +"'3ad2a9b37c6070e374c7a8c508fe20ca86b6ed54e286e93a0318e95e881db5aa'" + +#: ../../library/hashlib.rst:776 +msgid "Credits" +msgstr "开发人员" + +#: ../../library/hashlib.rst:778 +msgid "" +"BLAKE2_ was designed by *Jean-Philippe Aumasson*, *Samuel Neves*, *Zooko " +"Wilcox-O'Hearn*, and *Christian Winnerlein* based on SHA-3_ finalist BLAKE_ " +"created by *Jean-Philippe Aumasson*, *Luca Henzen*, *Willi Meier*, and " +"*Raphael C.-W. Phan*." +msgstr "" +"BLAKE2_ 是由 *Jean-Philippe Aumasson*, *Samuel Neves*, *Zooko Wilcox-O'Hearn* " +"和 *Christian Winnerlein* 基于 *Jean-Philippe Aumasson*, *Luca Henzen*, *Willi " +"Meier* 和 *Raphael C.-W. Phan* 所创造的 SHA-3_ 入围方案 BLAKE_ 进行设计的。" + +#: ../../library/hashlib.rst:783 +msgid "" +"It uses core algorithm from ChaCha_ cipher designed by *Daniel J. " +"Bernstein*." +msgstr "它使用的核心算法来自由 *Daniel J. Bernstein* 所设计的 ChaCha_ 加密。" + +#: ../../library/hashlib.rst:785 +msgid "" +"The stdlib implementation is based on pyblake2_ module. It was written by " +"*Dmitry Chestnykh* based on C implementation written by *Samuel Neves*. The " +"documentation was copied from pyblake2_ and written by *Dmitry Chestnykh*." +msgstr "" +"stdlib 实现是基于 pyblake2_ 模块的。它由 *Dmitry Chestnykh* 在 *Samuel Neves* 所编写的 C " +"实现的基础上编写。此文档拷贝自 pyblake2_ 并由 *Dmitry Chestnykh* 撰写。" + +#: ../../library/hashlib.rst:789 +msgid "The C code was partly rewritten for Python by *Christian Heimes*." +msgstr "C 代码由 *Christian Heimes* 针对 Python 进行了部分的重写。" + +#: ../../library/hashlib.rst:791 +msgid "" +"The following public domain dedication applies for both C hash function " +"implementation, extension code, and this documentation:" +msgstr "以下公共领域贡献同时适用于 C 哈希函数实现、扩展代码和本文档:" + +#: ../../library/hashlib.rst:794 +msgid "" +"To the extent possible under law, the author(s) have dedicated all copyright" +" and related and neighboring rights to this software to the public domain " +"worldwide. This software is distributed without any warranty." +msgstr "在法律许可的范围内,作者已将此软件的全部版权以及关联和邻接权利贡献到全球公共领域。此软件的发布不附带任何担保。" + +#: ../../library/hashlib.rst:798 +msgid "" +"You should have received a copy of the CC0 Public Domain Dedication along " +"with this software. If not, see " +"https://creativecommons.org/publicdomain/zero/1.0/." +msgstr "" +"你应该已收到此软件附带的 CC0 公共领域专属证书的副本。如果没有,请参阅 " +"https://creativecommons.org/publicdomain/zero/1.0/." + +#: ../../library/hashlib.rst:802 +msgid "" +"The following people have helped with development or contributed their " +"changes to the project and the public domain according to the Creative " +"Commons Public Domain Dedication 1.0 Universal:" +msgstr "根据创意分享公共领域贡献 1.0 通用规范,下列人士为此项目的开发提供了帮助或对公共领域的修改作出了贡献:" + +#: ../../library/hashlib.rst:806 +msgid "*Alexandr Sokolovskiy*" +msgstr "*Alexandr Sokolovskiy*" + +#: ../../library/hashlib.rst:827 +msgid "Module :mod:`hmac`" +msgstr "模块 :mod:`hmac`" + +#: ../../library/hashlib.rst:828 +msgid "A module to generate message authentication codes using hashes." +msgstr "使用哈希运算来生成消息验证代码的模块。" + +#: ../../library/hashlib.rst:830 +msgid "Module :mod:`base64`" +msgstr "模块 :mod:`base64`" + +#: ../../library/hashlib.rst:831 +msgid "Another way to encode binary hashes for non-binary environments." +msgstr "针对非二进制环境对二进制哈希值进行编码的另一种方式。" + +#: ../../library/hashlib.rst:833 +msgid "https://nvlpubs.nist.gov/nistpubs/fips/nist.fips.180-4.pdf" +msgstr "https://nvlpubs.nist.gov/nistpubs/fips/nist.fips.180-4.pdf" + +#: ../../library/hashlib.rst:834 +msgid "The FIPS 180-4 publication on Secure Hash Algorithms." +msgstr "有关安全哈希算法的 FIPS 180-4 发布版。" + +#: ../../library/hashlib.rst:836 +msgid "https://csrc.nist.gov/pubs/fips/202/final" +msgstr "https://csrc.nist.gov/pubs/fips/202/final" + +#: ../../library/hashlib.rst:837 +msgid "The FIPS 202 publication on the SHA-3 Standard." +msgstr "关于 SHA-3 标准的 FIPS 202 公告。" + +#: ../../library/hashlib.rst:839 +msgid "https://www.blake2.net/" +msgstr "https://www.blake2.net/" + +#: ../../library/hashlib.rst:840 +msgid "Official BLAKE2 website." +msgstr "BLAKE2 官方网站" + +#: ../../library/hashlib.rst:842 +msgid "https://en.wikipedia.org/wiki/Cryptographic_hash_function" +msgstr "https://en.wikipedia.org/wiki/Cryptographic_hash_function" + +#: ../../library/hashlib.rst:843 +msgid "" +"Wikipedia article with information on which algorithms have known issues and" +" what that means regarding their use." +msgstr "包含关于哪些算法存在已知问题以及对其使用所造成的影响的信息的 Wikipedia 文章。" + +#: ../../library/hashlib.rst:846 +msgid "https://www.ietf.org/rfc/rfc8018.txt" +msgstr "https://www.ietf.org/rfc/rfc8018.txt" + +#: ../../library/hashlib.rst:847 +msgid "PKCS #5: Password-Based Cryptography Specification Version 2.1" +msgstr "PKCS #5: 基于密码的加密规范描述 2.1 版" + +#: ../../library/hashlib.rst:849 +msgid "" +"https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-132.pdf" +msgstr "" +"https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-132.pdf" + +#: ../../library/hashlib.rst:850 +msgid "NIST Recommendation for Password-Based Key Derivation." +msgstr "NIST 对基于密码的密钥派生的建议。" + +#: ../../library/hashlib.rst:12 +msgid "message digest, MD5" +msgstr "消息摘要,MD5" + +#: ../../library/hashlib.rst:12 +msgid "" +"secure hash algorithm, SHA1, SHA2, SHA224, SHA256, SHA384, SHA512, SHA3, " +"Shake, Blake2" +msgstr "" +"安全哈希算法,SHA1, SHA2, SHA224, SHA256, SHA384, SHA512, SHA3, Shake, Blake2" + +#: ../../library/hashlib.rst:53 +msgid "OpenSSL" +msgstr "OpenSSL" + +#: ../../library/hashlib.rst:53 +msgid "(use in module hashlib)" +msgstr "(在 hashlib 模块中使用)" + +#: ../../library/hashlib.rst:377 +msgid "blake2b, blake2s" +msgstr "blake2b, blake2s" diff --git a/library/heapq.po b/library/heapq.po new file mode 100644 index 0000000000..7bfb366e21 --- /dev/null +++ b/library/heapq.po @@ -0,0 +1,722 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/heapq.rst:2 +msgid ":mod:`!heapq` --- Heap queue algorithm" +msgstr ":mod:`!heapq` --- 堆队列算法" + +#: ../../library/heapq.rst:7 +msgid "**Source code:** :source:`Lib/heapq.py`" +msgstr "**源码:** :source:`Lib/heapq.py`" + +#: ../../library/heapq.rst:11 +msgid "" +"This module provides an implementation of the heap queue algorithm, also " +"known as the priority queue algorithm." +msgstr "这个模块实现了堆队列算法,即优先队列算法。" + +#: ../../library/heapq.rst:14 +msgid "" +"Min-heaps are binary trees for which every parent node has a value less than" +" or equal to any of its children. We refer to this condition as the heap " +"invariant." +msgstr "最小堆是一种二叉树,其中每个父节点的值都小于等于它的任何子节点。我们将此条件称为堆的不变性。" + +#: ../../library/heapq.rst:18 +msgid "" +"For min-heaps, this implementation uses lists for which ``heap[k] <= " +"heap[2*k+1]`` and ``heap[k] <= heap[2*k+2]`` for all *k* for which the " +"compared elements exist. Elements are counted from zero. The interesting " +"property of a min-heap is that its smallest element is always the root, " +"``heap[0]``." +msgstr "" +"对于最小堆,这个实现使用了列表,其中对于所有存在被比较元素的 *k* 都有 ``heap[k] <= heap[2*k+1]`` 且 ``heap[k]" +" <= heap[2*k+2]``。元素是从零开始计数的。最小堆最有趣的特征在于其最小的元素总是位于根节点,即 ``heap[0]``。" + +#: ../../library/heapq.rst:24 +msgid "" +"Max-heaps satisfy the reverse invariant: every parent node has a value " +"*greater* than any of its children. These are implemented as lists for " +"which ``maxheap[2*k+1] <= maxheap[k]`` and ``maxheap[2*k+2] <= maxheap[k]`` " +"for all *k* for which the compared elements exist. The root, ``maxheap[0]``," +" contains the *largest* element; ``heap.sort(reverse=True)`` maintains the " +"max-heap invariant." +msgstr "" +"最大堆满足反向不变性:每个父节点的值 *大于* 它的任何子节点。对于所有存在比较元素的 *k* ,它们被实现为 ``maxheap[2*k+1] <= " +"maxheap[k]`` 和 ``maxheap[2*k+2] <= maxheap[k]`` 的列表。根结点 ``maxheap[0]`` 包含 " +"*最大的* 元素;``heap.sort(reverse=True)`` 维持最大堆的不变性。" + +#: ../../library/heapq.rst:31 +msgid "" +"The :mod:`!heapq` API differs from textbook heap algorithms in two aspects: " +"(a) We use zero-based indexing. This makes the relationship between the " +"index for a node and the indexes for its children slightly less obvious, but" +" is more suitable since Python uses zero-based indexing. (b) Textbooks often" +" focus on max-heaps, due to their suitability for in-place sorting. Our " +"implementation favors min-heaps as they better correspond to Python " +":class:`lists `." +msgstr "" +":mod:`!heapq` API 与教科书中的堆算法在两个方面不同:(a)我们使用基于零的索引。 " +"这使得节点的索引与其子节点的索引之间的关系稍微不那么明显,但由于 Python " +"使用从零开始的索引,因此更合适。(b)教科书通常侧重于最大堆,因为它们适合原地排序。我们的实现倾向于最小堆,因为它们更好地对应于 Python 的 " +":class:`列表 `。" + +#: ../../library/heapq.rst:38 +msgid "" +"These two aspects make it possible to view the heap as a regular Python list" +" without surprises: ``heap[0]`` is the smallest item, and ``heap.sort()`` " +"maintains the heap invariant!" +msgstr "" +"这两个方面使我们可以毫不意外地将堆视为常规的 Python 列表: ``heap[0]`` 是最小的项,而 ``heap.sort()`` " +"维护堆的不变性!" + +#: ../../library/heapq.rst:42 +msgid "" +"Like :meth:`list.sort`, this implementation uses only the ``<`` operator for" +" comparisons, for both min-heaps and max-heaps." +msgstr "像 :meth:`list.sort` 一样,这个实现只使用 ``<`` 操作符进行比较,对于最小堆和最大堆都是如此。" + +#: ../../library/heapq.rst:45 +msgid "" +"In the API below, and in this documentation, the unqualified term *heap* " +"generally refers to a min-heap. The API for max-heaps is named using a " +"``_max`` suffix." +msgstr "在下面的 API 和本文档中,非限定术语 *heap* 通常指的是最小堆。最大堆的 API 使用 ``_max`` 后缀命名。" + +#: ../../library/heapq.rst:49 +msgid "" +"To create a heap, use a list initialized as ``[]``, or transform an existing" +" list into a min-heap or max-heap using the :func:`heapify` or " +":func:`heapify_max` functions, respectively." +msgstr "" +"要创建堆,请使用初始化为 ``[]`` 的列表,或者使用 :func:`heapify` 或 :func:`heapify_max` " +"函数将现有列表转换为最小堆或最大堆。" + +#: ../../library/heapq.rst:53 +msgid "The following functions are provided for min-heaps:" +msgstr "以下函数针对最小堆提供:" + +#: ../../library/heapq.rst:58 +msgid "Transform list *x* into a min-heap, in-place, in linear time." +msgstr "将列表 *x* 转换为最小堆,在线性时间内原地修改。" + +#: ../../library/heapq.rst:63 +msgid "" +"Push the value *item* onto the *heap*, maintaining the min-heap invariant." +msgstr "将值 *item* 推至 *heap* 中,保持最小堆的不变性。" + +#: ../../library/heapq.rst:68 +msgid "" +"Pop and return the smallest item from the *heap*, maintaining the min-heap " +"invariant. If the heap is empty, :exc:`IndexError` is raised. To access " +"the smallest item without popping it, use ``heap[0]``." +msgstr "" +"从 *heap* 弹出并返回最小的项,保持最小堆的不变性。如果堆为空,则会引发 :exc:`IndexError`。 要访问最小的项而不弹出它,可以使用" +" ``heap[0]``。" + +#: ../../library/heapq.rst:75 +msgid "" +"Push *item* on the heap, then pop and return the smallest item from the " +"*heap*. The combined action runs more efficiently than :func:`heappush` " +"followed by a separate call to :func:`heappop`." +msgstr "" +"将 *item* 放入堆中,然后弹出并返回 *heap* 的最小元素。该组合操作比先调用 :func:`heappush` 再调用 " +":func:`heappop` 运行起来更有效率。" + +#: ../../library/heapq.rst:82 +msgid "" +"Pop and return the smallest item from the *heap*, and also push the new " +"*item*. The heap size doesn't change. If the heap is empty, " +":exc:`IndexError` is raised." +msgstr "弹出并返回 *heap* 中最小的一项,同时推入新的 *item*。堆的大小不变。如果堆为空则引发 :exc:`IndexError`。" + +#: ../../library/heapq.rst:85 +msgid "" +"This one step operation is more efficient than a :func:`heappop` followed by" +" :func:`heappush` and can be more appropriate when using a fixed-size heap. " +"The pop/push combination always returns an element from the heap and " +"replaces it with *item*." +msgstr "" +"这个单步骤操作比 :func:`heappop` 加 :func:`heappush` 更高效,并且在使用固定大小的堆时更为适宜。pop/push " +"组合总是会从堆中返回一个元素并将其替换为 *item*。" + +#: ../../library/heapq.rst:90 +msgid "" +"The value returned may be larger than the *item* added. If that isn't " +"desired, consider using :func:`heappushpop` instead. Its push/pop " +"combination returns the smaller of the two values, leaving the larger value " +"on the heap." +msgstr "" +"返回的值可能会比新加入的值大。如果不希望如此,可改用 :func:`heappushpop`。它的 push/pop " +"组合返回两个值中较小的一个,将较大的留在堆中。" + +#: ../../library/heapq.rst:96 +msgid "For max-heaps, the following functions are provided:" +msgstr "对于最大堆,提供了下列函数:" + +#: ../../library/heapq.rst:101 +msgid "Transform list *x* into a max-heap, in-place, in linear time." +msgstr "将列表 *x* 转换为最大堆,在线性时间内原地修改。" + +#: ../../library/heapq.rst:108 +msgid "" +"Push the value *item* onto the max-heap *heap*, maintaining the max-heap " +"invariant." +msgstr "将值 *item* 推至最大堆 *heap* 中,保持最大堆的不变性。" + +#: ../../library/heapq.rst:116 +msgid "" +"Pop and return the largest item from the max-heap *heap*, maintaining the " +"max-heap invariant. If the max-heap is empty, :exc:`IndexError` is raised. " +"To access the largest item without popping it, use ``maxheap[0]``." +msgstr "" +"从 *heap* 弹出并返回最大的项,保持最大堆的不变性。如果最大堆为空,则会引发 :exc:`IndexError`。 " +"要访问最大的项而不弹出它,可以使用 ``maxheap[0]``。" + +#: ../../library/heapq.rst:125 +msgid "" +"Push *item* on the max-heap *heap*, then pop and return the largest item " +"from *heap*. The combined action runs more efficiently than " +":func:`heappush_max` followed by a separate call to :func:`heappop_max`." +msgstr "" +"将 *item* 放入最大堆 *heap* 中,然后弹出并返回 *heap* 的最大元素。该组合操作比先调用 :func:`heappush_max` " +"再调用 :func:`heappop_max` 运行起来更有效率。" + +#: ../../library/heapq.rst:135 +msgid "" +"Pop and return the largest item from the max-heap *heap* and also push the " +"new *item*. The max-heap size doesn't change. If the max-heap is empty, " +":exc:`IndexError` is raised." +msgstr "" +"弹出并返回最大堆 *heap* 中最大的一项,同时放入新的 *item*。最大堆的大小不变。如果最大堆为空则引发 :exc:`IndexError`." + +#: ../../library/heapq.rst:140 +msgid "" +"The value returned may be smaller than the *item* added. Refer to the " +"analogous function :func:`heapreplace` for detailed usage notes." +msgstr "返回的值可能小于添加的 *item*。参考类似的函数 :func:`heapreplace` 了解详细的用法说明。" + +#: ../../library/heapq.rst:146 +msgid "The module also offers three general purpose functions based on heaps." +msgstr "该模块还提供了三个基于堆的通用目的函数。" + +#: ../../library/heapq.rst:151 +msgid "" +"Merge multiple sorted inputs into a single sorted output (for example, merge" +" timestamped entries from multiple log files). Returns an :term:`iterator` " +"over the sorted values." +msgstr "将多个已排序的输入合并为一个已排序的输出(例如,合并来自多个日志文件的带时间戳的条目)。返回已排序值的 :term:`iterator`。" + +#: ../../library/heapq.rst:155 +msgid "" +"Similar to ``sorted(itertools.chain(*iterables))`` but returns an iterable, " +"does not pull the data into memory all at once, and assumes that each of the" +" input streams is already sorted (smallest to largest)." +msgstr "" +"类似于 ``sorted(itertools.chain(*iterables))`` " +"但返回一个可迭代对象,不会一次性地将数据全部放入内存,并假定每个输入流都是已排序的(从小到大)。" + +#: ../../library/heapq.rst:159 +msgid "" +"Has two optional arguments which must be specified as keyword arguments." +msgstr "具有两个可选参数,它们都必须指定为关键字参数。" + +#: ../../library/heapq.rst:161 +msgid "" +"*key* specifies a :term:`key function` of one argument that is used to " +"extract a comparison key from each input element. The default value is " +"``None`` (compare the elements directly)." +msgstr "" +"*key* 指定带有单个参数的 :term:`key function`,用于从每个输入元素中提取比较键。默认值为 ``None`` (直接比较元素)。" + +#: ../../library/heapq.rst:165 +msgid "" +"*reverse* is a boolean value. If set to ``True``, then the input elements " +"are merged as if each comparison were reversed. To achieve behavior similar " +"to ``sorted(itertools.chain(*iterables), reverse=True)``, all iterables must" +" be sorted from largest to smallest." +msgstr "" +"*reverse* 为一个布尔值。如果设为 ``True``,则输入元素将按比较结果逆序进行合并。要达成与 " +"``sorted(itertools.chain(*iterables), reverse=True)`` " +"类似的行为,所有可迭代对象必须是已从大到小排序的。" + +#: ../../library/heapq.rst:170 +msgid "Added the optional *key* and *reverse* parameters." +msgstr "添加了可选的 *key* 和 *reverse* 形参。" + +#: ../../library/heapq.rst:176 +msgid "" +"Return a list with the *n* largest elements from the dataset defined by " +"*iterable*. *key*, if provided, specifies a function of one argument that " +"is used to extract a comparison key from each element in *iterable* (for " +"example, ``key=str.lower``). Equivalent to: ``sorted(iterable, key=key, " +"reverse=True)[:n]``." +msgstr "" +"从 *iterable* 所定义的数据集中返回前 *n* 个最大元素组成的列表。如果提供了 *key* 则其应指定一个单参数的函数,用于从 " +"*iterable* 的每个元素中提取比较键 (例如 ``key=str.lower``)。 等价于: ``sorted(iterable, " +"key=key, reverse=True)[:n]``。" + +#: ../../library/heapq.rst:185 +msgid "" +"Return a list with the *n* smallest elements from the dataset defined by " +"*iterable*. *key*, if provided, specifies a function of one argument that " +"is used to extract a comparison key from each element in *iterable* (for " +"example, ``key=str.lower``). Equivalent to: ``sorted(iterable, " +"key=key)[:n]``." +msgstr "" +"从 *iterable* 所定义的数据集中返回前 *n* 个最小元素组成的列表。 如果提供了 *key* 则其应指定一个单参数的函数,用于从 " +"*iterable* 的每个元素中提取比较键 (例如 ``key=str.lower``)。 等价于: ``sorted(iterable, " +"key=key)[:n]``。" + +#: ../../library/heapq.rst:191 +msgid "" +"The latter two functions perform best for smaller values of *n*. For larger" +" values, it is more efficient to use the :func:`sorted` function. Also, " +"when ``n==1``, it is more efficient to use the built-in :func:`min` and " +":func:`max` functions. If repeated usage of these functions is required, " +"consider turning the iterable into an actual heap." +msgstr "" +"后两个函数在 *n* 值较小时性能最好。对于更大的值,使用 :func:`sorted` 函数会更有效率。此外,当 ``n==1`` 时,使用内置的 " +":func:`min` 和 :func:`max` 函数会更有效率。如果需要重复使用这些函数,请考虑将可迭代对象转为真正的堆。" + +#: ../../library/heapq.rst:199 +msgid "Basic Examples" +msgstr "基本示例" + +#: ../../library/heapq.rst:201 +msgid "" +"A `heapsort `_ can be implemented by" +" pushing all values onto a heap and then popping off the smallest values one" +" at a time::" +msgstr "" +"`堆排序 `_ " +"可以通过将所有值推入堆中然后每次弹出一个最小值项来实现::" + +#: ../../library/heapq.rst:205 +msgid "" +">>> def heapsort(iterable):\n" +"... h = []\n" +"... for value in iterable:\n" +"... heappush(h, value)\n" +"... return [heappop(h) for i in range(len(h))]\n" +"...\n" +">>> heapsort([1, 3, 5, 7, 9, 2, 4, 6, 8, 0])\n" +"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]" +msgstr "" +">>> def heapsort(iterable):\n" +"... h = []\n" +"... for value in iterable:\n" +"... heappush(h, value)\n" +"... return [heappop(h) for i in range(len(h))]\n" +"...\n" +">>> heapsort([1, 3, 5, 7, 9, 2, 4, 6, 8, 0])\n" +"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]" + +#: ../../library/heapq.rst:214 +msgid "" +"This is similar to ``sorted(iterable)``, but unlike :func:`sorted`, this " +"implementation is not stable." +msgstr "这类似于 ``sorted(iterable)``,但与 :func:`sorted` 不同的是这个实现是不稳定的。" + +#: ../../library/heapq.rst:217 +msgid "" +"Heap elements can be tuples. This is useful for assigning comparison values" +" (such as task priorities) alongside the main record being tracked::" +msgstr "堆元素可以为元组。这有利于以下做法——在被跟踪的主记录旁边添一个额外的值(例如任务的优先级)用于互相比较::" + +#: ../../library/heapq.rst:220 +msgid "" +">>> h = []\n" +">>> heappush(h, (5, 'write code'))\n" +">>> heappush(h, (7, 'release product'))\n" +">>> heappush(h, (1, 'write spec'))\n" +">>> heappush(h, (3, 'create tests'))\n" +">>> heappop(h)\n" +"(1, 'write spec')" +msgstr "" +">>> h = []\n" +">>> heappush(h, (5, 'write code'))\n" +">>> heappush(h, (7, 'release product'))\n" +">>> heappush(h, (1, 'write spec'))\n" +">>> heappush(h, (3, 'create tests'))\n" +">>> heappop(h)\n" +"(1, 'write spec')" + +#: ../../library/heapq.rst:230 +msgid "Other Applications" +msgstr "其他应用" + +#: ../../library/heapq.rst:232 +msgid "" +"`Medians `_ are a measure of central " +"tendency for a set of numbers. In distributions skewed by outliers, the " +"median provides a more stable estimate than an average (arithmetic mean). A" +" running median is an `online algorithm " +"`_ that updates continuously" +" as new data arrives." +msgstr "" +"`中位数 `_ 是对于一组数字所趋向的中间值的度量。 " +"在受到两侧偏离值扭曲的分布中,中位数可提供比平均数(算术平均值)更稳定的预测。移动中位数是一种随着新数据到达而连续更新的 `在线算法 " +"`_." + +#: ../../library/heapq.rst:239 +msgid "" +"A running median can be efficiently implemented by balancing two heaps, a " +"max-heap for values at or below the midpoint and a min-heap for values above" +" the midpoint. When the two heaps have the same size, the new median is the" +" average of the tops of the two heaps; otherwise, the median is at the top " +"of the larger heap::" +msgstr "" +"计算移动中位数可通过平衡两个堆来高效地实现,一个最大堆用于存放等于或小于中点的值和一个最小堆用于存放大于中点的值。 " +"当两个堆具有相同大小时,两个堆的堆顶元素的平均值就是新的中位数;否则,中位数位于较大的堆的堆顶::" + +#: ../../library/heapq.rst:245 +msgid "" +"def running_median(iterable):\n" +" \"Yields the cumulative median of values seen so far.\"\n" +"\n" +" lo = [] # max-heap\n" +" hi = [] # min-heap (same size as or one smaller than lo)\n" +"\n" +" for x in iterable:\n" +" if len(lo) == len(hi):\n" +" heappush_max(lo, heappushpop(hi, x))\n" +" yield lo[0]\n" +" else:\n" +" heappush(hi, heappushpop_max(lo, x))\n" +" yield (lo[0] + hi[0]) / 2" +msgstr "" +"def running_median(iterable):\n" +" \"Yields the cumulative median of values seen so far.\"\n" +"\n" +" lo = [] # 最大堆\n" +" hi = [] # 最小堆(大小与 lo 相同或小一)\n" +"\n" +" for x in iterable:\n" +" if len(lo) == len(hi):\n" +" heappush_max(lo, heappushpop(hi, x))\n" +" yield lo[0]\n" +" else:\n" +" heappush(hi, heappushpop_max(lo, x))\n" +" yield (lo[0] + hi[0]) / 2" + +#: ../../library/heapq.rst:259 +msgid "For example::" +msgstr "例如::" + +#: ../../library/heapq.rst:261 +msgid "" +">>> list(running_median([5.0, 9.0, 4.0, 12.0, 8.0, 9.0]))\n" +"[5.0, 7.0, 5.0, 7.0, 8.0, 8.5]" +msgstr "" +">>> list(running_median([5.0, 9.0, 4.0, 12.0, 8.0, 9.0]))\n" +"[5.0, 7.0, 5.0, 7.0, 8.0, 8.5]" + +#: ../../library/heapq.rst:266 +msgid "Priority Queue Implementation Notes" +msgstr "优先队列实现说明" + +#: ../../library/heapq.rst:268 +msgid "" +"A `priority queue `_ is common" +" use for a heap, and it presents several implementation challenges:" +msgstr "" +"`优先队列 `_ " +"是堆的常用场合,并且它的实现包含了多个挑战:" + +#: ../../library/heapq.rst:271 +msgid "" +"Sort stability: how do you get two tasks with equal priorities to be " +"returned in the order they were originally added?" +msgstr "排序稳定性:如何让两个相同优先级的任务按它们最初被加入队列的顺序返回?" + +#: ../../library/heapq.rst:274 +msgid "" +"Tuple comparison breaks for (priority, task) pairs if the priorities are " +"equal and the tasks do not have a default comparison order." +msgstr "如果 priority 相同且 task 之间未定义默认比较顺序,则两个 (priority, task) 元组之间的比较会报错。" + +#: ../../library/heapq.rst:277 +msgid "" +"If the priority of a task changes, how do you move it to a new position in " +"the heap?" +msgstr "如果任务优先级发生改变,你该如何将其移至堆中的新位置?" + +#: ../../library/heapq.rst:280 +msgid "" +"Or if a pending task needs to be deleted, how do you find it and remove it " +"from the queue?" +msgstr "或者如果一个挂起的任务需要被删除,你该如何找到它并将其移出队列?" + +#: ../../library/heapq.rst:283 +msgid "" +"A solution to the first two challenges is to store entries as 3-element list" +" including the priority, an entry count, and the task. The entry count " +"serves as a tie-breaker so that two tasks with the same priority are " +"returned in the order they were added. And since no two entry counts are the" +" same, the tuple comparison will never attempt to directly compare two " +"tasks." +msgstr "" +"针对前两项挑战的一种解决方案是将条目保存为包含优先级、条目计数和任务对象 3 个元素的列表。 " +"条目计数可用来打破平局,这样具有相同优先级的任务将按它们的添加顺序返回。并且由于没有哪两个条目计数是相同的,元组比较将永远不会直接比较两个任务。" + +#: ../../library/heapq.rst:289 +msgid "" +"Another solution to the problem of non-comparable tasks is to create a " +"wrapper class that ignores the task item and only compares the priority " +"field::" +msgstr "两个 task 之间不可比的问题的另一种解决方案是——创建一个忽略 task,只比较 priority 字段的包装器类::" + +#: ../../library/heapq.rst:292 +msgid "" +"from dataclasses import dataclass, field\n" +"from typing import Any\n" +"\n" +"@dataclass(order=True)\n" +"class PrioritizedItem:\n" +" priority: int\n" +" item: Any=field(compare=False)" +msgstr "" +"from dataclasses import dataclass, field\n" +"from typing import Any\n" +"\n" +"@dataclass(order=True)\n" +"class PrioritizedItem:\n" +" priority: int\n" +" item: Any=field(compare=False)" + +#: ../../library/heapq.rst:300 +msgid "" +"The remaining challenges revolve around finding a pending task and making " +"changes to its priority or removing it entirely. Finding a task can be done" +" with a dictionary pointing to an entry in the queue." +msgstr "其余的挑战主要包括找到挂起的任务并修改其优先级或将其完全移除。找到一个任务可使用一个指向队列中条目的字典来实现。" + +#: ../../library/heapq.rst:304 +msgid "" +"Removing the entry or changing its priority is more difficult because it " +"would break the heap structure invariants. So, a possible solution is to " +"mark the entry as removed and add a new entry with the revised priority::" +msgstr "" +"移除条目或改变其优先级的操作实现起来更为困难,因为它会破坏堆结构不变量。 " +"因此,一种可能的解决方案是将条目标记为已移除,再添加一个改变了优先级的新条目::" + +#: ../../library/heapq.rst:308 +msgid "" +"pq = [] # list of entries arranged in a heap\n" +"entry_finder = {} # mapping of tasks to entries\n" +"REMOVED = '' # placeholder for a removed task\n" +"counter = itertools.count() # unique sequence count\n" +"\n" +"def add_task(task, priority=0):\n" +" 'Add a new task or update the priority of an existing task'\n" +" if task in entry_finder:\n" +" remove_task(task)\n" +" count = next(counter)\n" +" entry = [priority, count, task]\n" +" entry_finder[task] = entry\n" +" heappush(pq, entry)\n" +"\n" +"def remove_task(task):\n" +" 'Mark an existing task as REMOVED. Raise KeyError if not found.'\n" +" entry = entry_finder.pop(task)\n" +" entry[-1] = REMOVED\n" +"\n" +"def pop_task():\n" +" 'Remove and return the lowest priority task. Raise KeyError if empty.'\n" +" while pq:\n" +" priority, count, task = heappop(pq)\n" +" if task is not REMOVED:\n" +" del entry_finder[task]\n" +" return task\n" +" raise KeyError('pop from an empty priority queue')" +msgstr "" +"pq = [] # 由在堆中处理的条目组成的列表\n" +"entry_finder = {} # 从任务到条目的映射\n" +"REMOVED = '' # 已移除任务的占位符\n" +"counter = itertools.count() # 唯一序列计数\n" +"\n" +"def add_task(task, priority=0):\n" +" '新增任务或更新现有任务的优先级'\n" +" if task in entry_finder:\n" +" remove_task(task)\n" +" count = next(counter)\n" +" entry = [priority, count, task]\n" +" entry_finder[task] = entry\n" +" heappush(pq, entry)\n" +"\n" +"def remove_task(task):\n" +" '将现有任务标记为已移除。如未找到则引发 KeyError。'\n" +" entry = entry_finder.pop(task)\n" +" entry[-1] = REMOVED\n" +"\n" +"def pop_task():\n" +" '移除并返回最低优先级的任务。如为空则引发 KeyError。'\n" +" while pq:\n" +" priority, count, task = heappop(pq)\n" +" if task is not REMOVED:\n" +" del entry_finder[task]\n" +" return task\n" +" raise KeyError('pop from an empty priority queue')" + +#: ../../library/heapq.rst:338 +msgid "Theory" +msgstr "理论" + +#: ../../library/heapq.rst:340 +msgid "" +"Heaps are arrays for which ``a[k] <= a[2*k+1]`` and ``a[k] <= a[2*k+2]`` for" +" all *k*, counting elements from 0. For the sake of comparison, non-" +"existing elements are considered to be infinite. The interesting property " +"of a heap is that ``a[0]`` is always its smallest element." +msgstr "" +"堆是通过数组来实现的,其中的元素从 0 开始计数,对于所有的 *k* 都有 ``a[k] <= a[2*k+1]`` 且 ``a[k] <= " +"a[2*k+2]``。为了便于比较,不存在的元素被视为无穷大。堆最有趣的特性在于 ``a[0]`` 总是其中最小的元素。" + +#: ../../library/heapq.rst:345 +msgid "" +"The strange invariant above is meant to be an efficient memory " +"representation for a tournament. The numbers below are *k*, not ``a[k]``:" +msgstr "" + +#: ../../library/heapq.rst:348 +msgid "Example (min-heap) binary tree." +msgstr "" + +#: ../../library/heapq.rst:353 +msgid "" +"In the tree above, each cell *k* is topping ``2*k+1`` and ``2*k+2``. In a " +"usual binary tournament we see in sports, each cell is the winner over the " +"two cells it tops, and we can trace the winner down the tree to see all " +"opponents s/he had. However, in many computer applications of such " +"tournaments, we do not need to trace the history of a winner. To be more " +"memory efficient, when a winner is promoted, we try to replace it by " +"something else at a lower level, and the rule becomes that a cell and the " +"two cells it tops contain three different items, but the top cell \"wins\" " +"over the two topped cells." +msgstr "" +"在上面的树中,每个 *k* 单元都位于 ``2*k+1`` 和 ``2*k+2`` 之上。 " +"体育运动中我们经常见到二元锦标赛模式,每个胜者单元都位于另两个单元之上,并且我们可以沿着树形图向下追溯胜者所遇到的所有对手。 " +"但是,在许多采用这种锦标赛模式的计算机应用程序中,我们并不需要追溯胜者的历史。 " +"为了获得更高的内存利用效率,当一个胜者晋级时,我们会用较低层级的另一条目来替代它,因此规则变为一个单元和它之下的两个单元包含三个不同条目,上方单元“胜过”了两个下方单元。" + +#: ../../library/heapq.rst:362 +msgid "" +"If this heap invariant is protected at all time, index 0 is clearly the " +"overall winner. The simplest algorithmic way to remove it and find the " +"\"next\" winner is to move some loser (let's say cell 30 in the diagram " +"above) into the 0 position, and then percolate this new 0 down the tree, " +"exchanging values, until the invariant is re-established. This is clearly " +"logarithmic on the total number of items in the tree. By iterating over all " +"items, you get an *O*\\ (*n* log *n*) sort." +msgstr "" +"如果这个堆的不变性始终受到保护,则索引号 0 显然是最终胜出者。移除它并找出“下一个”胜出者的最简单算法形式是将某个输家(让我们假定是上图中的 30 " +"号单元)移至 0 号位,然后将这个新的 0 号沿着树结构下行,不断进行值的交换,直到不变性得到重建。这显然会是树中条目总数的对数。 " +"通过迭代所有条目,你将得到一个 *O*\\ (*n* log *n*) 复杂度的排序。" + +#: ../../library/heapq.rst:369 +msgid "" +"A nice feature of this sort is that you can efficiently insert new items " +"while the sort is going on, provided that the inserted items are not " +"\"better\" than the last 0'th element you extracted. This is especially " +"useful in simulation contexts, where the tree holds all incoming events, and" +" the \"win\" condition means the smallest scheduled time. When an event " +"schedules other events for execution, they are scheduled into the future, so" +" they can easily go into the heap. So, a heap is a good structure for " +"implementing schedulers (this is what I used for my MIDI sequencer :-)." +msgstr "" +"此排序有一个很好的特性就是你可以在排序进行期间高效地插入新条目,前提是插入的条目不比你最近取出的 0 号元素“更好”。 " +"这在模拟上下文时特别有用,在这种情况下树保存的是所有传入事件,“胜出”条件是最小调度时间。 " +"当一个事件将其他事件排入执行计划时,它们的调度时间向未来方向延长,这样它们可方便地入堆。因此,堆结构很适宜用来实现调度器,我的 MIDI " +"音序器就是用的这个 :-)。" + +#: ../../library/heapq.rst:378 +msgid "" +"Various structures for implementing schedulers have been extensively " +"studied, and heaps are good for this, as they are reasonably speedy, the " +"speed is almost constant, and the worst case is not much different than the " +"average case. However, there are other representations which are more " +"efficient overall, yet the worst cases might be terrible." +msgstr "" +"用于实现调度器的各种结构都得到了充分的研究,堆是非常适宜的一种,因为它们的速度相当快,并且几乎是恒定的,最坏的情况与平均情况没有太大差别。 " +"虽然还存在其他总体而言更高效的实现方式,但其最坏的情况却可能非常糟糕。" + +#: ../../library/heapq.rst:384 +msgid "" +"Heaps are also very useful in big disk sorts. You most probably all know " +"that a big sort implies producing \"runs\" (which are pre-sorted sequences, " +"whose size is usually related to the amount of CPU memory), followed by a " +"merging passes for these runs, which merging is often very cleverly " +"organised [#]_. It is very important that the initial sort produces the " +"longest runs possible. Tournaments are a good way to achieve that. If, " +"using all the memory available to hold a tournament, you replace and " +"percolate items that happen to fit the current run, you'll produce runs " +"which are twice the size of the memory for random input, and much better for" +" input fuzzily ordered." +msgstr "" +"堆在大磁盘排序中也非常有用。你应该已经了解大规模排序会有多个“运行轮次”(即预排序的序列,其大小通常与 CPU " +"内存容量相关),随后这些轮次会进入合并通道,轮次合并的组织往往非常巧妙 [#]_。非常重要的一点是初始排序应产生尽可能长的运行轮次。 " +"锦标赛模式是达成此目标的好办法。 " +"如果你使用全部有用内存来进行锦标赛,替换和安排恰好适合当前运行轮次的条目,你将可以对于随机输入生成两倍于内存大小的运行轮次,对于模糊排序的输入还会有更好的效果。" + +#: ../../library/heapq.rst:394 +msgid "" +"Moreover, if you output the 0'th item on disk and get an input which may not" +" fit in the current tournament (because the value \"wins\" over the last " +"output value), it cannot fit in the heap, so the size of the heap decreases." +" The freed memory could be cleverly reused immediately for progressively " +"building a second heap, which grows at exactly the same rate the first heap " +"is melting. When the first heap completely vanishes, you switch heaps and " +"start a new run. Clever and quite effective!" +msgstr "" +"另外,如果你输出磁盘上的第 0 个条目并获得一个可能不适合当前锦标赛的输入(因为其值要“胜过”上一个输出值),它无法被放入堆中,因此堆的尺寸将缩小。 " +"被释放的内存可以被巧妙地立即重用以逐步构建第二个堆,其增长速度与第一个堆的缩减速度正好相同。当第一个堆完全消失时,你可以切换新堆并启动新的运行轮次。 " +"这样做既聪明又高效!" + +#: ../../library/heapq.rst:402 +msgid "" +"In a word, heaps are useful memory structures to know. I use them in a few " +"applications, and I think it is good to keep a 'heap' module around. :-)" +msgstr "总之,堆是值得了解的有用内存结构。我在一些应用中用到了它们,并且认为保留一个 'heap' 模块是很有意义的。 :-)" + +#: ../../library/heapq.rst:406 +msgid "Footnotes" +msgstr "脚注" + +#: ../../library/heapq.rst:407 +msgid "" +"The disk balancing algorithms which are current, nowadays, are more annoying" +" than clever, and this is a consequence of the seeking capabilities of the " +"disks. On devices which cannot seek, like big tape drives, the story was " +"quite different, and one had to be very clever to ensure (far in advance) " +"that each tape movement will be the most effective possible (that is, will " +"best participate at \"progressing\" the merge). Some tapes were even able " +"to read backwards, and this was also used to avoid the rewinding time. " +"Believe me, real good tape sorts were quite spectacular to watch! From all " +"times, sorting has always been a Great Art! :-)" +msgstr "" +"当前时代的磁盘平衡算法与其说是巧妙,不如说是麻烦,这是由磁盘的寻址能力导致的结果。 " +"在无法寻址的设备例如大型磁带机上,情况则相当不同,开发者必须非常聪明地(极为提前地)确保每次磁带转动都尽可能地高效(就是说能够最好地加入到合并“进程”中)。" +" 有些磁带甚至能够反向读取,这也被用来避免倒带的耗时。请相信我,真正优秀的磁带机排序看起来是极其壮观的,排序从来都是一门伟大的艺术! :-)" diff --git a/library/hmac.po b/library/hmac.po new file mode 100644 index 0000000000..da54c883a6 --- /dev/null +++ b/library/hmac.po @@ -0,0 +1,210 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/hmac.rst:2 +msgid ":mod:`!hmac` --- Keyed-Hashing for Message Authentication" +msgstr ":mod:`!hmac` --- 用于消息验证的密钥哈希" + +#: ../../library/hmac.rst:10 +msgid "**Source code:** :source:`Lib/hmac.py`" +msgstr "**源代码:** :source:`Lib/hmac.py`" + +#: ../../library/hmac.rst:14 +msgid "" +"This module implements the HMAC algorithm as described by :rfc:`2104`. The " +"interface allows to use any hash function with a *fixed* digest size. In " +"particular, extendable output functions such as SHAKE-128 or SHAKE-256 " +"cannot be used with HMAC." +msgstr "" +"本模块实现了 :rfc:`2104` 所描述的 HMAC 算法。该接口支持使用任意具有 *固定* 摘要长度的哈希函数。特别需要注意的是,像 " +"SHAKE-128 或 SHAKE-256 这类可扩展输出函数不能与 HMAC 一起使用。" + +#: ../../library/hmac.rst:22 +msgid "" +"Return a new hmac object. *key* is a bytes or bytearray object giving the " +"secret key. If *msg* is present, the method call ``update(msg)`` is made. " +"*digestmod* is the digest name, digest constructor or module for the HMAC " +"object to use. It may be any name suitable to :func:`hashlib.new`. Despite " +"its argument position, it is required." +msgstr "" +"返回一个新的 hmac 对象。 *key* 是一个指定密钥的 bytes 或 bytearray 对象。如果提供了 *msg*,将会调用 " +"``update(msg)`` 方法。 *digestmod* 为 HMAC 对象所用的摘要名称、摘要构造器或模块。它可以是适用于 " +":func:`hashlib.new` 的任何名称。虽然该参数位置靠后,但它却是必须的。" + +#: ../../library/hmac.rst:28 +msgid "" +"Parameter *key* can be a bytes or bytearray object. Parameter *msg* can be " +"of any type supported by :mod:`hashlib`. Parameter *digestmod* can be the " +"name of a hash algorithm." +msgstr "" +"形参 *key* 可以为 bytes 或 bytearray 对象。形参 *msg* 可以为 :mod:`hashlib` 所支持的任意类型。形参 " +"*digestmod* 可以为某种哈希算法的名称。" + +#: ../../library/hmac.rst:33 +msgid "" +"The *digestmod* argument is now required. Pass it as a keyword argument to " +"avoid awkwardness when you do not have an initial *msg*." +msgstr "*digestmod* 参数现在是必须的。请将其作为关键字参数传入以避免当你没有初始 *msg* 时将导致的麻烦。" + +#: ../../library/hmac.rst:40 +msgid "" +"Return digest of *msg* for given secret *key* and *digest*. The function is " +"equivalent to ``HMAC(key, msg, digest).digest()``, but uses an optimized C " +"or inline implementation, which is faster for messages that fit into memory." +" The parameters *key*, *msg*, and *digest* have the same meaning as in " +":func:`~hmac.new`." +msgstr "" +"基于给定密钥 *key* 和 *digest* 返回 *msg* 的摘要。此函数等价于 ``HMAC(key, msg, " +"digest).digest()``,但使用了优化的 C 或内联实现,对放入内存的消息能处理得更快。形参 *key*, *msg* 和 *digest*" +" 具有与 :func:`~hmac.new` 中相同的含义。" + +#: ../../library/hmac.rst:46 +msgid "" +"CPython implementation detail, the optimized C implementation is only used " +"when *digest* is a string and name of a digest algorithm, which is supported" +" by OpenSSL." +msgstr "" +"作为 CPython 的实现细节,优化的 C 实现仅当 *digest* 为字符串并且是一个 OpenSSL 所支持的摘要算法的名称时才会被使用。" + +#: ../../library/hmac.rst:55 +msgid "An HMAC object has the following methods:" +msgstr "HMAC 对象具有下列方法:" + +#: ../../library/hmac.rst:59 +msgid "" +"Update the hmac object with *msg*. Repeated calls are equivalent to a " +"single call with the concatenation of all the arguments: ``m.update(a); " +"m.update(b)`` is equivalent to ``m.update(a + b)``." +msgstr "" +"用 *msg* 来更新 hmac 对象。重复调用相当于单次调用并传入所有参数的拼接结果: ``m.update(a); m.update(b)`` " +"等价于 ``m.update(a + b)``。" + +#: ../../library/hmac.rst:63 +msgid "Parameter *msg* can be of any type supported by :mod:`hashlib`." +msgstr "形参 *msg* 可以为 :mod:`hashlib` 所支持的任何类型。" + +#: ../../library/hmac.rst:69 +msgid "" +"Return the digest of the bytes passed to the :meth:`update` method so far. " +"This bytes object will be the same length as the *digest_size* of the digest" +" given to the constructor. It may contain non-ASCII bytes, including NUL " +"bytes." +msgstr "" +"返回当前已传给 :meth:`update` 方法的字节串数据的摘要。这个字节串数据的长度将与传给构造器的摘要的长度 *digest_size* " +"相同。它可以包含非 ASCII 的字节,包括 NUL 字节。" + +#: ../../library/hmac.rst:76 +msgid "" +"When comparing the output of :meth:`digest` to an externally supplied digest" +" during a verification routine, it is recommended to use the " +":func:`compare_digest` function instead of the ``==`` operator to reduce the" +" vulnerability to timing attacks." +msgstr "" +"在验证例程运行期间将 :meth:`digest` 的输出与外部提供的摘要进行比较时,建议使用 :func:`compare_digest` 函数而不是" +" ``==`` 运算符以减少面对定时攻击的弱点。" + +#: ../../library/hmac.rst:84 +msgid "" +"Like :meth:`digest` except the digest is returned as a string twice the " +"length containing only hexadecimal digits. This may be used to exchange the" +" value safely in email or other non-binary environments." +msgstr "" +"类似于 :meth:`digest` 但摘要会以两倍长度字符串的形式返回,其中仅包含十六进制数码。 " +"这可以被用于在电子邮件或其他非二进制环境中安全地交换数据值。" + +#: ../../library/hmac.rst:90 +msgid "" +"When comparing the output of :meth:`hexdigest` to an externally supplied " +"digest during a verification routine, it is recommended to use the " +":func:`compare_digest` function instead of the ``==`` operator to reduce the" +" vulnerability to timing attacks." +msgstr "" +"在验证例程运行期间将 :meth:`hexdigest` 的输出与外部提供的摘要进行比较时,建议使用 :func:`compare_digest` " +"函数而不是 ``==`` 运算符以减少面对定时攻击的弱点。" + +#: ../../library/hmac.rst:98 +msgid "" +"Return a copy (\"clone\") of the hmac object. This can be used to " +"efficiently compute the digests of strings that share a common initial " +"substring." +msgstr ")。这可被用来高效地计算共享相同初始子串的数据的摘要。" + +#: ../../library/hmac.rst:102 +msgid "A hash object has the following attributes:" +msgstr "hash 对象具有以下属性:" + +#: ../../library/hmac.rst:106 +msgid "The size of the resulting HMAC digest in bytes." +msgstr "以字节表示的结果 HMAC 摘要的大小。" + +#: ../../library/hmac.rst:110 +msgid "The internal block size of the hash algorithm in bytes." +msgstr "以字节表示的哈希算法的内部块大小。" + +#: ../../library/hmac.rst:116 +msgid "The canonical name of this HMAC, always lowercase, e.g. ``hmac-md5``." +msgstr "HMAC 的规范名称,总是为小写形式,例如 ``hmac-md5``。" + +#: ../../library/hmac.rst:121 +msgid "" +"Removed the undocumented attributes ``HMAC.digest_cons``, ``HMAC.inner``, " +"and ``HMAC.outer``." +msgstr "移除了未写入文档的属性 ``HMAC.digest_cons``, ``HMAC.inner`` 和 ``HMAC.outer``。" + +#: ../../library/hmac.rst:125 +msgid "This module also provides the following helper function:" +msgstr "这个模块还提供了下列辅助函数:" + +#: ../../library/hmac.rst:129 +msgid "" +"Return ``a == b``. This function uses an approach designed to prevent " +"timing analysis by avoiding content-based short circuiting behaviour, making" +" it appropriate for cryptography. *a* and *b* must both be of the same " +"type: either :class:`str` (ASCII only, as e.g. returned by " +":meth:`HMAC.hexdigest`), or a :term:`bytes-like object`." +msgstr "" +"返回 ``a == b``。此函数使用一种经专门设计的方式通过避免基于内容的短路行为来防止定时分析,使得它适合处理密码。 *a* 和 *b* " +"必须为相同的类型:或者是 :class:`str` (仅限 ASCII 字符,如 :meth:`HMAC.hexdigest` 的返回值),或者是 " +":term:`bytes-like object`." + +#: ../../library/hmac.rst:137 +msgid "" +"If *a* and *b* are of different lengths, or if an error occurs, a timing " +"attack could theoretically reveal information about the types and lengths of" +" *a* and *b*—but not their values." +msgstr "" +"如果 *a* 和 *b* 具有不同的长度,或者如果发生了错误,定时攻击在理论上可以获取有关 *a* 和 *b* 的类型和长度信息 — " +"但不能获取它们的值。" + +#: ../../library/hmac.rst:145 +msgid "" +"The function uses OpenSSL's ``CRYPTO_memcmp()`` internally when available." +msgstr "此函数在可能的情况下会在内部使用 OpenSSL 的 ``CRYPTO_memcmp()``。" + +#: ../../library/hmac.rst:151 +msgid "Module :mod:`hashlib`" +msgstr "模块 :mod:`hashlib`" + +#: ../../library/hmac.rst:152 +msgid "The Python module providing secure hash functions." +msgstr "提供安全哈希函数的 Python 模块。" diff --git a/library/html.entities.po b/library/html.entities.po new file mode 100644 index 0000000000..913530e3df --- /dev/null +++ b/library/html.entities.po @@ -0,0 +1,77 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/html.entities.rst:2 +msgid ":mod:`!html.entities` --- Definitions of HTML general entities" +msgstr ":mod:`!html.entities` --- HTML 一般实体的定义" + +#: ../../library/html.entities.rst:9 +msgid "**Source code:** :source:`Lib/html/entities.py`" +msgstr "**源码:** :source:`Lib/html/entities.py`" + +#: ../../library/html.entities.rst:13 +msgid "" +"This module defines four dictionaries, :data:`html5`, " +":data:`name2codepoint`, :data:`codepoint2name`, and :data:`entitydefs`." +msgstr "" +"该模块定义了四个字典, :data:`html5`、 :data:`name2codepoint`、 :data:`codepoint2name`、以及" +" :data:`entitydefs`." + +#: ../../library/html.entities.rst:19 +msgid "" +"A dictionary that maps HTML5 named character references [#]_ to the " +"equivalent Unicode character(s), e.g. ``html5['gt;'] == '>'``. Note that the" +" trailing semicolon is included in the name (e.g. ``'gt;'``), however some " +"of the names are accepted by the standard even without the semicolon: in " +"this case the name is present with and without the ``';'``. See also " +":func:`html.unescape`." +msgstr "" +"将 HTML5 命名字符引用 [#]_ 映射到等效的 Unicode 字符的字典,例如 ``html5['gt;'] == '>'``。 " +"请注意,尾随的分号包含在名称中 (例如 ``'gt;'``),但是即使没有分号,一些名称也会被标准接受,在这种情况下,名称出现时带有和不带有 " +"``';'``。另见 :func:`html.unescape`。" + +#: ../../library/html.entities.rst:31 +msgid "" +"A dictionary mapping XHTML 1.0 entity definitions to their replacement text " +"in ISO Latin-1." +msgstr "将 XHTML 1.0 实体定义映射到 ISO Latin-1 中的替换文本的字典。" + +#: ../../library/html.entities.rst:37 +msgid "A dictionary that maps HTML4 entity names to the Unicode code points." +msgstr "一个将 HTML4 实体名称映射到 Unicode 代码点的字典。" + +#: ../../library/html.entities.rst:42 +msgid "A dictionary that maps Unicode code points to HTML4 entity names." +msgstr "一个将 Unicode 代码点映射到 HTML4 实体名称的字典。" + +#: ../../library/html.entities.rst:46 +msgid "Footnotes" +msgstr "脚注" + +#: ../../library/html.entities.rst:47 +msgid "" +"See https://html.spec.whatwg.org/multipage/named-characters.html#named-" +"character-references" +msgstr "" +"参见 https://html.spec.whatwg.org/multipage/named-characters.html#named-" +"character-references" diff --git a/library/html.parser.po b/library/html.parser.po new file mode 100644 index 0000000000..499fbd1c96 --- /dev/null +++ b/library/html.parser.po @@ -0,0 +1,645 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/html.parser.rst:2 +msgid ":mod:`!html.parser` --- Simple HTML and XHTML parser" +msgstr ":mod:`!html.parser` --- 简单的 HTML 和 XHTML 解析器" + +#: ../../library/html.parser.rst:7 +msgid "**Source code:** :source:`Lib/html/parser.py`" +msgstr "**源代码:** :source:`Lib/html/parser.py`" + +#: ../../library/html.parser.rst:15 +msgid "" +"This module defines a class :class:`HTMLParser` which serves as the basis " +"for parsing text files formatted in HTML (HyperText Mark-up Language) and " +"XHTML." +msgstr "这个模块定义了一个 :class:`HTMLParser` 类,为 HTML(超文本标记语言)和 XHTML 文本文件解析提供基础。" + +#: ../../library/html.parser.rst:20 +msgid "Create a parser instance able to parse invalid markup." +msgstr "创建一个能解析无效标记的解析器实例。" + +#: ../../library/html.parser.rst:22 +msgid "" +"If *convert_charrefs* is true (the default), all character references " +"(except the ones in elements like ``script`` and ``style``) are " +"automatically converted to the corresponding Unicode characters." +msgstr "" +"如果 *convert_charrefs* 为真值(默认),则所有字符引用(除了元素如 ``script`` 和 ``style`` " +"中的字符引用)都会自动转换为对应的 Unicode 字符。" + +#: ../../library/html.parser.rst:26 +msgid "" +"If *scripting* is false (the default), the content of the ``noscript`` " +"element is parsed normally; if it's true, it's returned as is without being " +"parsed." +msgstr "如果 *scripting* 为假值(默认),则 ``noscript`` 元素中的内容将被正常解析;如果为真值,它将不加解析地原样返回。" + +#: ../../library/html.parser.rst:30 +msgid "" +"An :class:`.HTMLParser` instance is fed HTML data and calls handler methods " +"when start tags, end tags, text, comments, and other markup elements are " +"encountered. The user should subclass :class:`.HTMLParser` and override its" +" methods to implement the desired behavior." +msgstr "" +"一个 :class:`.HTMLParser` 类的实例用来接受 HTML " +"数据,并在标记开始、标记结束、文本、注释和其他元素标记出现的时候调用对应的方法。要实现具体的行为,请使用 :class:`.HTMLParser` " +"的子类并重写其方法。" + +#: ../../library/html.parser.rst:35 +msgid "" +"This parser does not check that end tags match start tags or call the end-" +"tag handler for elements which are closed implicitly by closing an outer " +"element." +msgstr "这个解析器不检查结束标记是否与开始标记匹配,也不会因外层元素完毕而隐式关闭了的元素引发结束标记处理。" + +#: ../../library/html.parser.rst:38 +msgid "*convert_charrefs* keyword argument added." +msgstr "*convert_charrefs* 关键字参数被添加。" + +#: ../../library/html.parser.rst:41 +msgid "The default value for argument *convert_charrefs* is now ``True``." +msgstr "*convert_charrefs* 参数的默认值现在为 ``True``。" + +#: ../../library/html.parser.rst:44 +msgid "Added the *scripting* parameter." +msgstr "增加了 *scripting* 形参。" + +#: ../../library/html.parser.rst:49 +msgid "Example HTML Parser Application" +msgstr "HTML 解析器的示例程序" + +#: ../../library/html.parser.rst:51 +msgid "" +"As a basic example, below is a simple HTML parser that uses the " +":class:`HTMLParser` class to print out start tags, end tags, and data as " +"they are encountered:" +msgstr "" +"下面的基本示例是一个简单的 HTML 解析器,它使用 :class:`HTMLParser` 类,会在遇到开始标记、结束标记和数据时将它们打印出来:" + +#: ../../library/html.parser.rst:55 +msgid "" +"from html.parser import HTMLParser\n" +"\n" +"class MyHTMLParser(HTMLParser):\n" +" def handle_starttag(self, tag, attrs):\n" +" print(\"Encountered a start tag:\", tag)\n" +"\n" +" def handle_endtag(self, tag):\n" +" print(\"Encountered an end tag :\", tag)\n" +"\n" +" def handle_data(self, data):\n" +" print(\"Encountered some data :\", data)\n" +"\n" +"parser = MyHTMLParser()\n" +"parser.feed('Test'\n" +" '

Parse me!

')" +msgstr "" +"from html.parser import HTMLParser\n" +"\n" +"class MyHTMLParser(HTMLParser):\n" +" def handle_starttag(self, tag, attrs):\n" +" print(\"Encountered a start tag:\", tag)\n" +"\n" +" def handle_endtag(self, tag):\n" +" print(\"Encountered an end tag :\", tag)\n" +"\n" +" def handle_data(self, data):\n" +" print(\"Encountered some data :\", data)\n" +"\n" +"parser = MyHTMLParser()\n" +"parser.feed('Test'\n" +" '

Parse me!

')" + +#: ../../library/html.parser.rst:73 +msgid "The output will then be:" +msgstr "输出是:" + +#: ../../library/html.parser.rst:75 +msgid "" +"Encountered a start tag: html\n" +"Encountered a start tag: head\n" +"Encountered a start tag: title\n" +"Encountered some data : Test\n" +"Encountered an end tag : title\n" +"Encountered an end tag : head\n" +"Encountered a start tag: body\n" +"Encountered a start tag: h1\n" +"Encountered some data : Parse me!\n" +"Encountered an end tag : h1\n" +"Encountered an end tag : body\n" +"Encountered an end tag : html" +msgstr "" +"Encountered a start tag: html\n" +"Encountered a start tag: head\n" +"Encountered a start tag: title\n" +"Encountered some data : Test\n" +"Encountered an end tag : title\n" +"Encountered an end tag : head\n" +"Encountered a start tag: body\n" +"Encountered a start tag: h1\n" +"Encountered some data : Parse me!\n" +"Encountered an end tag : h1\n" +"Encountered an end tag : body\n" +"Encountered an end tag : html" + +#: ../../library/html.parser.rst:92 +msgid ":class:`.HTMLParser` Methods" +msgstr ":class:`.HTMLParser` 方法" + +#: ../../library/html.parser.rst:94 +msgid ":class:`HTMLParser` instances have the following methods:" +msgstr ":class:`HTMLParser` 实例有下列方法:" + +#: ../../library/html.parser.rst:99 +msgid "" +"Feed some text to the parser. It is processed insofar as it consists of " +"complete elements; incomplete data is buffered until more data is fed or " +":meth:`close` is called. *data* must be :class:`str`." +msgstr "" +"填充一些文本到解析器中。如果包含完整的元素,则被处理;如果数据不完整,将被缓冲直到更多的数据被填充,或者 :meth:`close` " +"被调用。*data* 必须为 :class:`str` 类型。" + +#: ../../library/html.parser.rst:106 +msgid "" +"Force processing of all buffered data as if it were followed by an end-of-" +"file mark. This method may be redefined by a derived class to define " +"additional processing at the end of the input, but the redefined version " +"should always call the :class:`HTMLParser` base class method :meth:`close`." +msgstr "" +"如同后面跟着一个文件结束标记一样,强制处理所有缓冲数据。这个方法能被派生类重新定义,用于在输入的末尾定义附加处理,但是重定义的版本应当始终调用基类 " +":class:`HTMLParser` 的 :meth:`close` 方法。" + +#: ../../library/html.parser.rst:114 +msgid "" +"Reset the instance. Loses all unprocessed data. This is called implicitly " +"at instantiation time." +msgstr "重置实例。丢失所有未处理的数据。在实例化阶段被隐式调用。" + +#: ../../library/html.parser.rst:120 +msgid "Return current line number and offset." +msgstr "返回当前行号和偏移值。" + +#: ../../library/html.parser.rst:125 +msgid "" +"Return the text of the most recently opened start tag. This should not " +"normally be needed for structured processing, but may be useful in dealing " +"with HTML \"as deployed\" or for re-generating input with minimal changes " +"(whitespace between attributes can be preserved, etc.)." +msgstr "" +"返回最近打开的开始标记中的文本。结构化处理时通常应该不需要这个,但在处理“已部署”的 HTML " +"或是在以最小改变来重新生成输入时可能会有用处(例如可以保留属性间的空格等)。" + +#: ../../library/html.parser.rst:131 +msgid "" +"The following methods are called when data or markup elements are " +"encountered and they are meant to be overridden in a subclass. The base " +"class implementations do nothing (except for " +":meth:`~HTMLParser.handle_startendtag`):" +msgstr "" +"下列方法将在遇到数据或者标记元素的时候被调用。它们需要在子类中重写。基类的实现中没有任何实际操作(除了 " +":meth:`~HTMLParser.handle_startendtag` ):" + +#: ../../library/html.parser.rst:138 +msgid "" +"This method is called to handle the start tag of an element (e.g. ``
``)." +msgstr "调用此方法来处理一个元素的开始标记 (例如 ``
``)。" + +#: ../../library/html.parser.rst:140 +msgid "" +"The *tag* argument is the name of the tag converted to lower case. The " +"*attrs* argument is a list of ``(name, value)`` pairs containing the " +"attributes found inside the tag's ``<>`` brackets. The *name* will be " +"translated to lower case, and quotes in the *value* have been removed, and " +"character and entity references have been replaced. For empty attributes, " +"*value* is ``None``." +msgstr "" + +#: ../../library/html.parser.rst:146 +msgid "" +"For instance, for the tag ````, this method " +"would be called as ``handle_starttag('a', [('href', " +"'https://www.cwi.nl/')])``." +msgstr "" +"例如,对于标签 ````,这个方法将以下列形式被调用 " +"``handle_starttag('a', [('href', 'https://www.cwi.nl/')])``." + +#: ../../library/html.parser.rst:149 +msgid "" +"All entity references from :mod:`html.entities` are replaced in the " +"attribute values." +msgstr ":mod:`html.entities` 中的所有实体引用,会在属性值中被替换。" + +#: ../../library/html.parser.rst:155 +msgid "" +"This method is called to handle the end tag of an element (e.g. ``
``)." +msgstr "此方法被用来处理元素的结束标记 (例如 ``
``)。" + +#: ../../library/html.parser.rst:157 +msgid "The *tag* argument is the name of the tag converted to lower case." +msgstr "*tag* 参数是小写的标签名。" + +#: ../../library/html.parser.rst:162 +msgid "" +"Similar to :meth:`handle_starttag`, but called when the parser encounters an" +" XHTML-style empty tag (````). This method may be overridden by " +"subclasses which require this particular lexical information; the default " +"implementation simply calls :meth:`handle_starttag` and " +":meth:`handle_endtag`." +msgstr "" +"类似于 :meth:`handle_starttag`, 只是在解析器遇到 XHTML 样式的空标记时被调用 (````)。这个方法能被需要这种特殊词法信息的子类重写;默认实现仅简单调用 :meth:`handle_starttag` 和 " +":meth:`handle_endtag`。" + +#: ../../library/html.parser.rst:170 +msgid "" +"This method is called to process arbitrary data (e.g. text nodes and the " +"content of elements like ``script`` and ``style``)." +msgstr "调用此方法来处理任意数据(例如文本节点和元素如 ``script`` 和 ``style`` 中的内容)。" + +#: ../../library/html.parser.rst:176 +msgid "" +"This method is called to process a named character reference of the form " +"``&name;`` (e.g. ``>``), where *name* is a general entity reference (e.g." +" ``'gt'``). This method is only called if *convert_charrefs* is false." +msgstr "" +"调用此方法来处理 ``&name;`` 形式的命名字符引用 (例如 ``>``),其中 *name* 是通用的实体引用 (例如 " +"``'gt'``)。此方法仅在 *convert_charrefs* 为假值时会被调用。" + +#: ../../library/html.parser.rst:184 +msgid "" +"This method is called to process decimal and hexadecimal numeric character " +"references of the form :samp:`&#{NNN};` and :samp:`&#x{NNN};`. For example," +" the decimal equivalent for ``>`` is ``>``, whereas the hexadecimal " +"is ``>``; in this case the method will receive ``'62'`` or ``'x3E'``. " +"This method is only called if *convert_charrefs* is false." +msgstr "" +"调用此方法来处理 :samp:`&#{NNN};` 和 :samp:`&#x{NNN};` 形式的十进制和十六进制数字字符引用。例如,``>`` " +"的等价十进制形式为 ``>``,而十六进制形式为 ``>``;在此情况下该方法将收到 ``'62'`` 或 ``'x3E'``。 " +"此方法仅在 *convert_charrefs* 为假值时会被调用。" + +#: ../../library/html.parser.rst:193 +msgid "" +"This method is called when a comment is encountered (e.g. ````)." +msgstr "这个方法在遇到注释的时候被调用 (例如 ````)。" + +#: ../../library/html.parser.rst:195 +msgid "" +"For example, the comment ```` will cause this method to be " +"called with the argument ``' comment '``." +msgstr "例如,```` 这个注释会用 ``' comment '`` 作为参数调用此方法。" + +#: ../../library/html.parser.rst:198 +msgid "" +"The content of Internet Explorer conditional comments (condcoms) will also " +"be sent to this method, so, for ````, this method will receive ``'[if IE 9]>IE9-specific " +"contentIE9-specific content``,这个方法将接收到 ``'[if IE 9]>IE9-specific " +"content``)." +msgstr "这个方法用来处理 HTML doctype 声明 (例如 ````)。" + +#: ../../library/html.parser.rst:208 +msgid "" +"The *decl* parameter will be the entire contents of the declaration inside " +"the ```` markup (e.g. ``'DOCTYPE html'``)." +msgstr "*decl* 形参为 ```` 标记中的所有内容 (例如 ``'DOCTYPE html'``)。" + +#: ../../library/html.parser.rst:214 +msgid "" +"Method called when a processing instruction is encountered. The *data* " +"parameter will contain the entire processing instruction. For example, for " +"the processing instruction ````, this method would be " +"called as ``handle_pi(\"proc color='red'\")``. It is intended to be " +"overridden by a derived class; the base class implementation does nothing." +msgstr "" +"此方法在遇到处理指令的时候被调用。*data* 形参将包含整个处理指令。例如,对于处理指令 ```` " +",这个方法将以 ``handle_pi(\"proc color='red'\")`` 形式被调用。它旨在被派生类重写;基类实现中无任何实际操作。" + +#: ../../library/html.parser.rst:222 +msgid "" +"The :class:`HTMLParser` class uses the SGML syntactic rules for processing " +"instructions. An XHTML processing instruction using the trailing ``'?'`` " +"will cause the ``'?'`` to be included in *data*." +msgstr "" +":class:`HTMLParser` 类使用 SGML 语法规则处理指令。使用 ``'?'`` 结尾的 XHTML 处理指令将导致 ``'?'`` " +"包含在 *data* 中。" + +#: ../../library/html.parser.rst:229 +msgid "" +"This method is called when an unrecognized declaration is read by the " +"parser." +msgstr "当解析器读到无法识别的声明时,此方法被调用。" + +#: ../../library/html.parser.rst:231 +msgid "" +"The *data* parameter will be the entire contents of the declaration inside " +"the ```` markup. It is sometimes useful to be overridden by a " +"derived class. The base class implementation does nothing." +msgstr "*data* 形参为 ```` 标记中的所有内容。某些时候对派生类的重写很有用。基类实现中无任何实际操作。" + +#: ../../library/html.parser.rst:239 +msgid "Examples" +msgstr "例子" + +#: ../../library/html.parser.rst:241 +msgid "" +"The following class implements a parser that will be used to illustrate more" +" examples:" +msgstr "下面的类实现了一个解析器,它将被用来演示更多的例子:" + +#: ../../library/html.parser.rst:244 +msgid "" +"from html.parser import HTMLParser\n" +"from html.entities import name2codepoint\n" +"\n" +"class MyHTMLParser(HTMLParser):\n" +" def handle_starttag(self, tag, attrs):\n" +" print(\"Start tag:\", tag)\n" +" for attr in attrs:\n" +" print(\" attr:\", attr)\n" +"\n" +" def handle_endtag(self, tag):\n" +" print(\"End tag :\", tag)\n" +"\n" +" def handle_data(self, data):\n" +" print(\"Data :\", data)\n" +"\n" +" def handle_comment(self, data):\n" +" print(\"Comment :\", data)\n" +"\n" +" def handle_entityref(self, name):\n" +" c = chr(name2codepoint[name])\n" +" print(\"Named ent:\", c)\n" +"\n" +" def handle_charref(self, name):\n" +" if name.startswith('x'):\n" +" c = chr(int(name[1:], 16))\n" +" else:\n" +" c = chr(int(name))\n" +" print(\"Num ent :\", c)\n" +"\n" +" def handle_decl(self, data):\n" +" print(\"Decl :\", data)\n" +"\n" +"parser = MyHTMLParser()" +msgstr "" +"from html.parser import HTMLParser\n" +"from html.entities import name2codepoint\n" +"\n" +"class MyHTMLParser(HTMLParser):\n" +" def handle_starttag(self, tag, attrs):\n" +" print(\"Start tag:\", tag)\n" +" for attr in attrs:\n" +" print(\" attr:\", attr)\n" +"\n" +" def handle_endtag(self, tag):\n" +" print(\"End tag :\", tag)\n" +"\n" +" def handle_data(self, data):\n" +" print(\"Data :\", data)\n" +"\n" +" def handle_comment(self, data):\n" +" print(\"Comment :\", data)\n" +"\n" +" def handle_entityref(self, name):\n" +" c = chr(name2codepoint[name])\n" +" print(\"Named ent:\", c)\n" +"\n" +" def handle_charref(self, name):\n" +" if name.startswith('x'):\n" +" c = chr(int(name[1:], 16))\n" +" else:\n" +" c = chr(int(name))\n" +" print(\"Num ent :\", c)\n" +"\n" +" def handle_decl(self, data):\n" +" print(\"Decl :\", data)\n" +"\n" +"parser = MyHTMLParser()" + +#: ../../library/html.parser.rst:280 +msgid "Parsing a doctype:" +msgstr "解析一个 doctype:" + +#: ../../library/html.parser.rst:282 +msgid "" +">>> parser.feed('')\n" +"Decl : DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\"" +msgstr "" +">>> parser.feed('')\n" +"Decl : DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\"" + +#: ../../library/html.parser.rst:288 +msgid "Parsing an element with a few attributes and a title:" +msgstr "解析一个带有某些属性和标题的元素:" + +#: ../../library/html.parser.rst:290 +msgid "" +">>> parser.feed('\"The')\n" +"Start tag: img\n" +" attr: ('src', 'python-logo.png')\n" +" attr: ('alt', 'The Python logo')\n" +">>>\n" +">>> parser.feed('

Python

')\n" +"Start tag: h1\n" +"Data : Python\n" +"End tag : h1" +msgstr "" +">>> parser.feed('\"The')\n" +"Start tag: img\n" +" attr: ('src', 'python-logo.png')\n" +" attr: ('alt', 'The Python logo')\n" +">>>\n" +">>> parser.feed('

Python

')\n" +"Start tag: h1\n" +"Data : Python\n" +"End tag : h1" + +#: ../../library/html.parser.rst:302 +msgid "" +"The content of elements like ``script`` and ``style`` is returned as is, " +"without further parsing:" +msgstr "元素如 ``script`` 和 ``style`` 的内容将原样返回,而不会被进一步地解析:" + +#: ../../library/html.parser.rst:305 +msgid "" +">>> parser.feed('')\n" +"Start tag: style\n" +" attr: ('type', 'text/css')\n" +"Data : #python { color: green }\n" +"End tag : style\n" +"\n" +">>> parser.feed('')\n" +"Start tag: script\n" +" attr: ('type', 'text/javascript')\n" +"Data : alert(\"hello! ☺\");\n" +"End tag : script" +msgstr "" +">>> parser.feed('')\n" +"Start tag: style\n" +" attr: ('type', 'text/css')\n" +"Data : #python { color: green }\n" +"End tag : style\n" +"\n" +">>> parser.feed('')\n" +"Start tag: script\n" +" attr: ('type', 'text/javascript')\n" +"Data : alert(\"hello! ☺\");\n" +"End tag : script" + +#: ../../library/html.parser.rst:320 +msgid "" +"Attribute names are converted to lowercase, quotes from attribute values " +"removed, and ``None`` is returned as *value* for empty attributes (such as " +"``checked``):" +msgstr "" + +#: ../../library/html.parser.rst:323 +msgid "" +">>> parser.feed(\"\")\n" +"Start tag: input\n" +" attr: ('type', 'checkbox')\n" +" attr: ('checked', None)\n" +" attr: ('required', '')\n" +" attr: ('disabled', 'disabled')" +msgstr "" + +#: ../../library/html.parser.rst:332 +msgid "Parsing comments:" +msgstr "解析注释:" + +#: ../../library/html.parser.rst:334 +msgid "" +">>> parser.feed(''\n" +"... '')\n" +"Comment : a comment\n" +"Comment : [if IE 9]>IE-specific content>> parser.feed(''\n" +"... '')\n" +"Comment : a comment\n" +"Comment : [if IE 9]>IE-specific content'``):" +msgstr "解析命名或数字形式的字符引用并将它们转换为正确的字符 (注意:这 3 个引用都等价于 ``'>'``):" + +#: ../../library/html.parser.rst:344 +msgid "" +">>> parser = MyHTMLParser()\n" +">>> parser.feed('>>>')\n" +"Data : >>>\n" +"\n" +">>> parser = MyHTMLParser(convert_charrefs=False)\n" +">>> parser.feed('>>>')\n" +"Named ent: >\n" +"Num ent : >\n" +"Num ent : >" +msgstr "" +">>> parser = MyHTMLParser()\n" +">>> parser.feed('>>>')\n" +"Data : >>>\n" +"\n" +">>> parser = MyHTMLParser(convert_charrefs=False)\n" +">>> parser.feed('>>>')\n" +"Named ent: >\n" +"Num ent : >\n" +"Num ent : >" + +#: ../../library/html.parser.rst:356 +msgid "" +"Feeding incomplete chunks to :meth:`~HTMLParser.feed` works, but " +":meth:`~HTMLParser.handle_data` might be called more than once if " +"*convert_charrefs* is false:" +msgstr "" +"可以将不完整的块喂给 :meth:`~HTMLParser.feed`,但如果 *convert_charrefs* 为假值则 " +":meth:`~HTMLParser.handle_data` 可能会被多次调用:" + +#: ../../library/html.parser.rst:360 +msgid "" +">>> for chunk in ['buff', 'ered', ' text']:\n" +"... parser.feed(chunk)\n" +"...\n" +"Start tag: span\n" +"Data : buff\n" +"Data : ered\n" +"Data : text\n" +"End tag : span" +msgstr "" +">>> for chunk in ['buff', 'ered', ' text']:\n" +"... parser.feed(chunk)\n" +"...\n" +"Start tag: span\n" +"Data : buff\n" +"Data : ered\n" +"Data : text\n" +"End tag : span" + +#: ../../library/html.parser.rst:371 +msgid "Parsing invalid HTML (e.g. unquoted attributes) also works:" +msgstr "解析无效的 HTML (例如有未带引号的属性) 也是可以的:" + +#: ../../library/html.parser.rst:373 +msgid "" +">>> parser.feed('

tag soup

')\n" +"Start tag: p\n" +"Start tag: a\n" +" attr: ('class', 'link')\n" +" attr: ('href', '#main')\n" +"Data : tag soup\n" +"End tag : p\n" +"End tag : a" +msgstr "" +">>> parser.feed('

tag soup

')\n" +"Start tag: p\n" +"Start tag: a\n" +" attr: ('class', 'link')\n" +" attr: ('href', '#main')\n" +"Data : tag soup\n" +"End tag : p\n" +"End tag : a" + +#: ../../library/html.parser.rst:9 +msgid "HTML" +msgstr "HTML" + +#: ../../library/html.parser.rst:9 +msgid "XHTML" +msgstr "XHTML" diff --git a/library/html.po b/library/html.po new file mode 100644 index 0000000000..00d5f12126 --- /dev/null +++ b/library/html.po @@ -0,0 +1,73 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/html.rst:2 +msgid ":mod:`!html` --- HyperText Markup Language support" +msgstr ":mod:`!html` --- 超文本标记语言支持" + +#: ../../library/html.rst:7 +msgid "**Source code:** :source:`Lib/html/__init__.py`" +msgstr "**源码:** :source:`Lib/html/__init__.py`" + +#: ../../library/html.rst:11 +msgid "This module defines utilities to manipulate HTML." +msgstr "该模块定义了操作 HTML 的工具。" + +#: ../../library/html.rst:15 +msgid "" +"Convert the characters ``&``, ``<`` and ``>`` in string *s* to HTML-safe " +"sequences. Use this if you need to display text that might contain such " +"characters in HTML. If the optional flag *quote* is true (the default), the" +" characters (``\"``) and (``'``) are also translated; this helps for " +"inclusion in an HTML attribute value delimited by quotes, as in ````. If *quote* is set to false, the characters (``\"``) and " +"(``'``) are not translated." +msgstr "" +"将字符串 *s* 中的字符 ``&``、``<`` 和 ``>`` 转换为 HTML 安全序列。当需要在 HTML " +"中显示可能包含此类字符的文本时,应使用此方法。如果可选参数 *quote* 为真值(默认),则字符 (``\"``) 和 (``'``) " +"也会被转义,这有助于将其包含在用引号分隔的 HTML 属性值中,例如 ````。如果 *quote* 设为假值,则字符 " +"(``\"``) 和 (``'``) 不会被转义。" + +#: ../../library/html.rst:29 +msgid "" +"Convert all named and numeric character references (e.g. ``>``, " +"``>``, ``>``) in the string *s* to the corresponding Unicode " +"characters. This function uses the rules defined by the HTML 5 standard for" +" both valid and invalid character references, and the :data:`list of HTML 5 " +"named character references `." +msgstr "" +"将字符串 *s* 中的所有命名和数字字符引用 (例如 ``>``、``>``、``>``) 转换为相应的 Unicode 字符。" +" 此函数使用 HTML 5 标准为有效和无效字符引用定义的规则,以及 :data:`HTML 5 命名字符引用列表 " +"`。" + +#: ../../library/html.rst:39 +msgid "Submodules in the ``html`` package are:" +msgstr "``html`` 包中的子模块是:" + +#: ../../library/html.rst:41 +msgid ":mod:`html.parser` -- HTML/XHTML parser with lenient parsing mode" +msgstr ":mod:`html.parser` —— 具有宽松解析模式的 HTML/XHTML 解析器" + +#: ../../library/html.rst:42 +msgid ":mod:`html.entities` -- HTML entity definitions" +msgstr ":mod:`html.entities` —— HTML 实体定义" diff --git a/library/http.client.po b/library/http.client.po new file mode 100644 index 0000000000..6821515441 --- /dev/null +++ b/library/http.client.po @@ -0,0 +1,973 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/http.client.rst:2 +msgid ":mod:`!http.client` --- HTTP protocol client" +msgstr ":mod:`!http.client` --- HTTP 协议客户端" + +#: ../../library/http.client.rst:7 +msgid "**Source code:** :source:`Lib/http/client.py`" +msgstr "**源代码:** :source:`Lib/http/client.py`" + +#: ../../library/http.client.rst:17 +msgid "" +"This module defines classes that implement the client side of the HTTP and " +"HTTPS protocols. It is normally not used directly --- the module " +":mod:`urllib.request` uses it to handle URLs that use HTTP and HTTPS." +msgstr "" +"这个模块定义了实现 HTTP 和 HTTPS 协议客户端的类。它通常不直接使用 --- 模块 :mod:`urllib.request` " +"会用它来处理使用 HTTP 和 HTTPS 的 URL。" + +#: ../../library/http.client.rst:23 +msgid "" +"The `Requests package `_ is " +"recommended for a higher-level HTTP client interface." +msgstr "" +"对于更高层级的 HTTP 客户端接口,建议使用 `Requests 包 " +"`_." + +#: ../../library/http.client.rst:28 +msgid "" +"HTTPS support is only available if Python was compiled with SSL support " +"(through the :mod:`ssl` module)." +msgstr "HTTPS 支持仅在编译 Python 时启用了 SSL 支持的情况下(通过 :mod:`ssl` 模块)可用。" + +#: ../../includes/wasm-notavail.rst:3 +msgid "Availability" +msgstr "可用性" + +#: ../../includes/wasm-notavail.rst:5 +msgid "" +"This module does not work or is not available on WebAssembly. See " +":ref:`wasm-availability` for more information." +msgstr "此模块在 WebAssembly 平台上无效或不可用。请参阅 :ref:`wasm-availability` 了解详情。" + +#: ../../library/http.client.rst:33 +msgid "The module provides the following classes:" +msgstr "该模块支持以下类:" + +#: ../../library/http.client.rst:39 +msgid "" +"An :class:`HTTPConnection` instance represents one transaction with an HTTP " +"server. It should be instantiated by passing it a host and optional port " +"number. If no port number is passed, the port is extracted from the host " +"string if it has the form ``host:port``, else the default HTTP port (80) is " +"used. If the optional *timeout* parameter is given, blocking operations " +"(like connection attempts) will timeout after that many seconds (if it is " +"not given, the global default timeout setting is used). The optional " +"*source_address* parameter may be a tuple of a (host, port) to use as the " +"source address the HTTP connection is made from. The optional *blocksize* " +"parameter sets the buffer size in bytes for sending a file-like message " +"body. The optional *max_response_headers* parameter sets the maximum number " +"of allowed response headers to help prevent denial-of-service attacks, " +"otherwise the default value (100) is used." +msgstr "" + +#: ../../library/http.client.rst:53 +msgid "" +"For example, the following calls all create instances that connect to the " +"server at the same host and port::" +msgstr "举个例子,以下调用都是创建连接到同一主机和端口的服务器的实例::" + +#: ../../library/http.client.rst:56 +msgid "" +">>> h1 = http.client.HTTPConnection('www.python.org')\n" +">>> h2 = http.client.HTTPConnection('www.python.org:80')\n" +">>> h3 = http.client.HTTPConnection('www.python.org', 80)\n" +">>> h4 = http.client.HTTPConnection('www.python.org', 80, timeout=10)" +msgstr "" +">>> h1 = http.client.HTTPConnection('www.python.org')\n" +">>> h2 = http.client.HTTPConnection('www.python.org:80')\n" +">>> h3 = http.client.HTTPConnection('www.python.org', 80)\n" +">>> h4 = http.client.HTTPConnection('www.python.org', 80, timeout=10)" + +#: ../../library/http.client.rst:61 +msgid "*source_address* was added." +msgstr "添加了 *source_address* 参数。" + +#: ../../library/http.client.rst:64 +msgid "" +"The *strict* parameter was removed. HTTP 0.9-style \"Simple Responses\" are" +" no longer supported." +msgstr "移除了 *strict* 形参。不再支持 HTTP 0.9 风格的“简单响应”。" + +#: ../../library/http.client.rst:68 +msgid "*blocksize* parameter was added." +msgstr "添加了 *blocksize* 参数。" + +#: ../../library/http.client.rst:71 ../../library/http.client.rst:117 +msgid "*max_response_headers* parameter was added." +msgstr "" + +#: ../../library/http.client.rst:79 +msgid "" +"A subclass of :class:`HTTPConnection` that uses SSL for communication with " +"secure servers. Default port is ``443``. If *context* is specified, it " +"must be a :class:`ssl.SSLContext` instance describing the various SSL " +"options." +msgstr "" +":class:`HTTPConnection` 的子类,使用 SSL 与安全服务器进行通信。默认端口为 ``443``。如果指定了 " +"*context*,它必须为一个描述 SSL 各选项的 :class:`ssl.SSLContext` 实例。" + +#: ../../library/http.client.rst:84 +msgid "" +"Please read :ref:`ssl-security` for more information on best practices." +msgstr "请参阅 :ref:`ssl-security` 了解有关最佳实践的更多信息。" + +#: ../../library/http.client.rst:86 +msgid "*source_address*, *context* and *check_hostname* were added." +msgstr "添加了 *source_address*, *context* 和 *check_hostname*。" + +#: ../../library/http.client.rst:89 +msgid "" +"This class now supports HTTPS virtual hosts if possible (that is, if " +":const:`ssl.HAS_SNI` is true)." +msgstr "这个类现在会在可能的情况下(即当 :const:`ssl.HAS_SNI` 为真值时)支持 HTTPS 虚拟主机。" + +#: ../../library/http.client.rst:93 +msgid "" +"The *strict* parameter was removed. HTTP 0.9-style \"Simple Responses\" are " +"no longer supported." +msgstr "删除了 *strict* 参数,不再支持 HTTP 0.9 风格的“简单响应”。" + +#: ../../library/http.client.rst:97 +msgid "" +"This class now performs all the necessary certificate and hostname checks by" +" default. To revert to the previous, unverified, behavior " +":func:`!ssl._create_unverified_context` can be passed to the *context* " +"parameter." +msgstr "" +"目前这个类在默认情况下会执行所有必要的证书和主机检查。要恢复到先前的非验证行为,可以将 " +":func:`!ssl._create_unverified_context` 传给 *context* 形参。" + +#: ../../library/http.client.rst:103 +msgid "" +"This class now enables TLS 1.3 :attr:`ssl.SSLContext.post_handshake_auth` " +"for the default *context* or when *cert_file* is passed with a custom " +"*context*." +msgstr "" +"该类现在对于默认的 *context* 或在传入 *cert_file* 并附带自定义 *context* 时会启用 TLS 1.3 " +":attr:`ssl.SSLContext.post_handshake_auth`." + +#: ../../library/http.client.rst:108 +msgid "" +"This class now sends an ALPN extension with protocol indicator ``http/1.1`` " +"when no *context* is given. Custom *context* should set ALPN protocols with " +":meth:`~ssl.SSLContext.set_alpn_protocols`." +msgstr "" +"现在这个类在未给出 *context* 的时候会发送一个带有协议指示符 ``http/1.1`` 的 ALPN 扩展。自定义 *context* " +"应当使用 :meth:`~ssl.SSLContext.set_alpn_protocols` 来设置 ALPN 协议。" + +#: ../../library/http.client.rst:113 +msgid "" +"The deprecated *key_file*, *cert_file* and *check_hostname* parameters have " +"been removed." +msgstr "已弃用的 *key_file*, *cert_file* 和 *check_hostname* 形参已被移除。" + +#: ../../library/http.client.rst:123 +msgid "" +"Class whose instances are returned upon successful connection. Not " +"instantiated directly by user." +msgstr "该类的实例在成功连接后返回。不会由用户直接实例化。" + +#: ../../library/http.client.rst:126 +msgid "" +"The *strict* parameter was removed. HTTP 0.9 style \"Simple Responses\" are " +"no longer supported." +msgstr "删除了 *strict* 参数,不再支持 HTTP 0.9 风格的\"简单响应\"。" + +#: ../../library/http.client.rst:130 +msgid "This module provides the following function:" +msgstr "这个模块定义了以下函数:" + +#: ../../library/http.client.rst:134 +msgid "" +"Parse the headers from a file pointer *fp* representing a HTTP " +"request/response. The file has to be a :class:`~io.BufferedIOBase` reader " +"(i.e. not text) and must provide a valid :rfc:`5322` style header." +msgstr "" +"解析来自一个代表 HTTP 请求/响应的文件指针 *fp* 的标头。该文件必须是一个 :class:`~io.BufferedIOBase` " +"读取器(即不为文本)并且必须提供有效的 :rfc:`5322` 样式标头。" + +#: ../../library/http.client.rst:138 +msgid "" +"This function returns an instance of :class:`http.client.HTTPMessage` that " +"holds the header fields, but no payload (the same as " +":attr:`HTTPResponse.msg` and " +":attr:`http.server.BaseHTTPRequestHandler.headers`). After returning, the " +"file pointer *fp* is ready to read the HTTP body." +msgstr "" +"该函数返回 :class:`http.client.HTTPMessage` 的实例,带有头部各个字段,但不带正文数据(与 " +":attr:`HTTPResponse.msg` 和 " +":attr:`http.server.BaseHTTPRequestHandler.headers` 一样)。返回之后,文件指针 *fp* 已为读取 " +"HTTP 正文做好准备了。" + +#: ../../library/http.client.rst:145 +msgid "" +":meth:`parse_headers` does not parse the start-line of a HTTP message; it " +"only parses the ``Name: value`` lines. The file has to be ready to read " +"these field lines, so the first line should already be consumed before " +"calling the function." +msgstr "" +":meth:`parse_headers` 不会解析 HTTP 消息的开始行;只会解析各 ``Name: value`` " +"行。文件必须为读取这些字段做好准备,所以在调用该函数之前,第一行应该已经被读取过了。" + +#: ../../library/http.client.rst:150 +msgid "The following exceptions are raised as appropriate:" +msgstr "下列异常可以适当地被引发:" + +#: ../../library/http.client.rst:155 +msgid "" +"The base class of the other exceptions in this module. It is a subclass of " +":exc:`Exception`." +msgstr "此模块中其他异常的基类。它是 :exc:`Exception` 的一个子类。" + +#: ../../library/http.client.rst:161 ../../library/http.client.rst:172 +#: ../../library/http.client.rst:177 ../../library/http.client.rst:182 +#: ../../library/http.client.rst:187 ../../library/http.client.rst:192 +msgid "A subclass of :exc:`HTTPException`." +msgstr ":exc:`HTTPException` 的一个子类。" + +#: ../../library/http.client.rst:166 +msgid "" +"A subclass of :exc:`HTTPException`, raised if a port is given and is either " +"non-numeric or empty." +msgstr ":exc:`HTTPException` 的一个子类,如果给出了一个非数字或为空值的端口就会被引发。" + +#: ../../library/http.client.rst:197 ../../library/http.client.rst:202 +#: ../../library/http.client.rst:207 +msgid "A subclass of :exc:`ImproperConnectionState`." +msgstr ":exc:`ImproperConnectionState` 的一个子类。" + +#: ../../library/http.client.rst:212 +msgid "" +"A subclass of :exc:`HTTPException`. Raised if a server responds with a HTTP" +" status code that we don't understand." +msgstr ":exc:`HTTPException` 的一个子类。如果服务器反馈了一个我们不理解的 HTTP 状态码就会被引发。" + +#: ../../library/http.client.rst:218 +msgid "" +"A subclass of :exc:`HTTPException`. Raised if an excessively long line is " +"received in the HTTP protocol from the server." +msgstr ":exc:`HTTPException` 的一个子类。如果在 HTTP 协议中从服务器接收到过长的行就会被引发。" + +#: ../../library/http.client.rst:224 +msgid "" +"A subclass of :exc:`ConnectionResetError` and :exc:`BadStatusLine`. Raised " +"by :meth:`HTTPConnection.getresponse` when the attempt to read the response " +"results in no data read from the connection, indicating that the remote end " +"has closed the connection." +msgstr "" +":exc:`ConnectionResetError` 和 :exc:`BadStatusLine` 的一个子类。 " +"当尝试读取响应时的结果是未从连接读取到数据时由 :meth:`HTTPConnection.getresponse` 引发,表明远端已关闭连接。" + +#: ../../library/http.client.rst:229 +msgid "Previously, :exc:`BadStatusLine`\\ ``('')`` was raised." +msgstr "在此之前引发的异常为 :exc:`BadStatusLine`\\ ``('')``。" + +#: ../../library/http.client.rst:233 +msgid "The constants defined in this module are:" +msgstr "此模块中定义的常量为:" + +#: ../../library/http.client.rst:237 +msgid "The default port for the HTTP protocol (always ``80``)." +msgstr "HTTP 协议默认的端口号 (总是 ``80``)。" + +#: ../../library/http.client.rst:241 +msgid "The default port for the HTTPS protocol (always ``443``)." +msgstr "HTTPS 协议默认的端口号 (总是 ``443``)。" + +#: ../../library/http.client.rst:245 +msgid "This dictionary maps the HTTP 1.1 status codes to the W3C names." +msgstr "这个字典把 HTTP 1.1 状态码映射到 W3C 名称。" + +#: ../../library/http.client.rst:247 +msgid "" +"Example: ``http.client.responses[http.client.NOT_FOUND]`` is ``'Not " +"Found'``." +msgstr "" +"例如: ``http.client.responses[http.client.NOT_FOUND]`` 是 ``'Not Found'``。" + +#: ../../library/http.client.rst:249 +msgid "" +"See :ref:`http-status-codes` for a list of HTTP status codes that are " +"available in this module as constants." +msgstr "本模块中可用的 HTTP 状态码常量可以参见 :ref:`http-status-codes`。" + +#: ../../library/http.client.rst:256 +msgid "HTTPConnection Objects" +msgstr "HTTPConnection 对象" + +#: ../../library/http.client.rst:258 +msgid ":class:`HTTPConnection` instances have the following methods:" +msgstr ":class:`HTTPConnection` 实例拥有以下方法:" + +#: ../../library/http.client.rst:264 +msgid "" +"This will send a request to the server using the HTTP request method " +"*method* and the request URI *url*. The provided *url* must be an absolute " +"path to conform with :rfc:`RFC 2616 §5.1.2 <2616#section-5.1.2>` (unless " +"connecting to an HTTP proxy server or using the ``OPTIONS`` or ``CONNECT`` " +"methods)." +msgstr "" +"这将使用 HTTP 请求方法 *method* 和请求 URI *url* 向服务器发送一个请求。所提供的 *url* 必须是符合 :rfc:`RFC " +"2616 §5.1.2 <2616#section-5.1.2>` 规范的绝对路径(除非是连接到一个 HTTP 代理服务器或者使用 " +"``OPTIONS`` 或 ``CONNECT`` 方法)。" + +#: ../../library/http.client.rst:270 +msgid "" +"If *body* is specified, the specified data is sent after the headers are " +"finished. It may be a :class:`str`, a :term:`bytes-like object`, an open " +":term:`file object`, or an iterable of :class:`bytes`. If *body* is a " +"string, it is encoded as ISO-8859-1, the default for HTTP. If it is a " +"bytes-like object, the bytes are sent as is. If it is a :term:`file " +"object`, the contents of the file is sent; this file object should support " +"at least the ``read()`` method. If the file object is an instance of " +":class:`io.TextIOBase`, the data returned by the ``read()`` method will be " +"encoded as ISO-8859-1, otherwise the data returned by ``read()`` is sent as " +"is. If *body* is an iterable, the elements of the iterable are sent as is " +"until the iterable is exhausted." +msgstr "" +"如果给定 *body*,那么给定的数据会在信息头完成之后发送。它可能是一个 :class:`str`,一个 :term:`bytes-like " +"object`,一个打开的 :term:`file object`,或者 :class:`bytes` 迭代器。如果 *body* 是字符串,它会按 " +"HTTP 默认的 ISO-8859-1 编码。如果是一个字节类对象,它会按原样发送。如果是 :term:`file " +"object`,文件的内容会被发送,这个文件对象应该至少支持 ``read()`` 方法。如果这个文件对象是一个 " +":class:`io.TextIOBase` 实例,由 ``read()`` 方法返回的数据会按 ISO-8859-1 编码,否则由 " +"``read()`` 方法返回的数据会按原样发送。如果 *body* 是一个迭代器,迭代器中的元素会被发送,直到迭代器耗尽。" + +#: ../../library/http.client.rst:282 +msgid "" +"The *headers* argument should be a mapping of extra HTTP headers to send " +"with the request. A :rfc:`Host header <2616#section-14.23>` must be provided" +" to conform with :rfc:`RFC 2616 §5.1.2 <2616#section-5.1.2>` (unless " +"connecting to an HTTP proxy server or using the ``OPTIONS`` or ``CONNECT`` " +"methods)." +msgstr "" +"*headers* 参数应为由要与请求一同发送的额外 HTTP 标头组成的映射。必须提供一个 :rfc:`主机标头 " +"<2616#section-14.23>` 以符合 :rfc:`RFC 2616 §5.1.2 <2616#section-5.1.2>` " +"规范(除非是连接到一个 HTTP 代理服务器或者使用 ``OPTIONS`` 或 ``CONNECT`` 方法)。" + +#: ../../library/http.client.rst:288 +msgid "" +"If *headers* contains neither Content-Length nor Transfer-Encoding, but " +"there is a request body, one of those header fields will be added " +"automatically. If *body* is ``None``, the Content-Length header is set to " +"``0`` for methods that expect a body (``PUT``, ``POST``, and ``PATCH``). If" +" *body* is a string or a bytes-like object that is not also a :term:`file " +"`, the Content-Length header is set to its length. Any other " +"type of *body* (files and iterables in general) will be chunk-encoded, and " +"the Transfer-Encoding header will automatically be set instead of Content-" +"Length." +msgstr "" +"如果 *headers* 既不包含 Content-Length 也没有 Transfer-" +"Encoding,但存在请求正文,那么这些头字段中的一个会自动设定。如果 *body* 是 ``None``,那么对于要求正文的方法 " +"(``PUT``,``POST``,和 ``PATCH``),Content-Length 头会被设为 ``0``。如果 *body* " +"是字符串或者类似字节的对象,并且也不是 :term:`文件`,Content-Length 头会设为正文的长度。任何其他类型的" +" *body* (一般是文件或迭代器)会按块编码,这时会自动设定 Transfer-Encoding 头以代替 Content-Length。" + +#: ../../library/http.client.rst:300 +msgid "" +"The *encode_chunked* argument is only relevant if Transfer-Encoding is " +"specified in *headers*. If *encode_chunked* is ``False``, the " +"HTTPConnection object assumes that all encoding is handled by the calling " +"code. If it is ``True``, the body will be chunk-encoded." +msgstr "" +"在 *headers* 中指定 Transfer-Encoding 时, *encode_chunked* 是唯一相关的参数。如果 " +"*encode_chunked* 为 ``False``,HTTPConnection 对象会假定所有的编码都由调用代码处理。如果为 " +"``True``,正文会按块编码。" + +#: ../../library/http.client.rst:305 +msgid "" +"For example, to perform a ``GET`` request to " +"``https://docs.python.org/3/``::" +msgstr "例如,要对 ``https://docs.python.org/3/`` 执行一个 ``GET`` 请求::" + +#: ../../library/http.client.rst:307 +msgid "" +">>> import http.client\n" +">>> host = \"docs.python.org\"\n" +">>> conn = http.client.HTTPSConnection(host)\n" +">>> conn.request(\"GET\", \"/3/\", headers={\"Host\": host})\n" +">>> response = conn.getresponse()\n" +">>> print(response.status, response.reason)\n" +"200 OK" +msgstr "" +">>> import http.client\n" +">>> host = \"docs.python.org\"\n" +">>> conn = http.client.HTTPSConnection(host)\n" +">>> conn.request(\"GET\", \"/3/\", headers={\"Host\": host})\n" +">>> response = conn.getresponse()\n" +">>> print(response.status, response.reason)\n" +"200 OK" + +#: ../../library/http.client.rst:316 +msgid "" +"Chunked transfer encoding has been added to the HTTP protocol version 1.1. " +"Unless the HTTP server is known to handle HTTP 1.1, the caller must either " +"specify the Content-Length, or must pass a :class:`str` or bytes-like object" +" that is not also a file as the body representation." +msgstr "" +"HTTP 协议在 1.1 版中添加了块传输编码。除非明确知道 HTTP 服务器可以处理 HTTP 1.1,调用者要么必须指定 Content-" +"Length,要么必须传入 :class:`str` 或字节类对象,注意该对象不能是表达 body 的文件。" + +#: ../../library/http.client.rst:324 +msgid "" +"Note that you must have read the whole response or call :meth:`close` if " +":meth:`getresponse` raised an non-:exc:`ConnectionError` exception before " +"you can send a new request to the server." +msgstr "" +"请注意在向服务器发送新请求之前,如果 :meth:`getresponse` 引发了非 :exc:`ConnectionError` " +"异常,则你必须读取整个响应或调用 :meth:`close`。" + +#: ../../library/http.client.rst:328 +msgid "*body* can now be an iterable." +msgstr "*body* 现在可以是可迭代对象了。" + +#: ../../library/http.client.rst:331 +msgid "" +"If neither Content-Length nor Transfer-Encoding are set in *headers*, file " +"and iterable *body* objects are now chunk-encoded. The *encode_chunked* " +"argument was added. No attempt is made to determine the Content-Length for " +"file objects." +msgstr "" +"如果 Content-Length 和 Transfer-Encoding 都没有在 *headers* 中设置,文件和可迭代的 *body* " +"对象现在会按块编码。添加了 *encode_chunked* 参数。不会尝试去确定文件对象的 Content-Length。" + +#: ../../library/http.client.rst:340 +msgid "" +"Should be called after a request is sent to get the response from the " +"server. Returns an :class:`HTTPResponse` instance." +msgstr "应当在发送一个请求从服务器获取响应时被调用。返回一个 :class:`HTTPResponse` 的实例。" + +#: ../../library/http.client.rst:343 +msgid "" +"If a :exc:`ConnectionError` or subclass is raised, the " +":class:`HTTPConnection` object will be ready to reconnect when a new request" +" is sent." +msgstr "" +"如果引发了 :exc:`ConnectionError` 或其子类, :class:`HTTPConnection` " +"对象将在发送新的请求时准备好重新连接。" + +#: ../../library/http.client.rst:348 +msgid "" +"Note that this does not apply to :exc:`OSError`\\s raised by the underlying " +"socket. Instead the caller is responsible to call :meth:`close` on the " +"existing connection." +msgstr "请注意这不适用于由下层套接字引发的 :exc:`OSError`。调用方要负责在现有的连接上调用 :meth:`close`。" + +#: ../../library/http.client.rst:355 +msgid "" +"Set the debugging level. The default debug level is ``0``, meaning no " +"debugging output is printed. Any value greater than ``0`` will cause all " +"currently defined debug output to be printed to stdout. The ``debuglevel`` " +"is passed to any new :class:`HTTPResponse` objects that are created." +msgstr "" +"设置调试等级。默认的调试等级为 ``0``,意味着不会打印调试输出。任何大于 ``0`` 的值将使得所有当前定义的调试输出被打印到 stdout。 " +"``debuglevel`` 会被传给任何新创建的 :class:`HTTPResponse` 对象。" + +#: ../../library/http.client.rst:365 +msgid "" +"Set the host and the port for HTTP Connect Tunnelling. This allows running " +"the connection through a proxy server." +msgstr "为 HTTP 连接隧道设置主机和端口。这将允许通过代理服务器运行连接。" + +#: ../../library/http.client.rst:368 +msgid "" +"The *host* and *port* arguments specify the endpoint of the tunneled " +"connection (i.e. the address included in the CONNECT request, *not* the " +"address of the proxy server)." +msgstr "*host* 和 *port* 参数指明隧道连接的端点(即 CONNECT 请求所包含的地址,而 *不是* 代理服务器的地址)。" + +#: ../../library/http.client.rst:372 +msgid "" +"The *headers* argument should be a mapping of extra HTTP headers to send " +"with the CONNECT request." +msgstr "*headers* 参数应为一个随 CONNECT 请求发送的额外 HTTP 标头的映射。" + +#: ../../library/http.client.rst:375 +msgid "" +"As HTTP/1.1 is used for HTTP CONNECT tunnelling request, `as per the RFC " +"`_, a HTTP " +"``Host:`` header must be provided, matching the authority-form of the " +"request target provided as the destination for the CONNECT request. If a " +"HTTP ``Host:`` header is not provided via the headers argument, one is " +"generated and transmitted automatically." +msgstr "" +"在 HTTP/1.1 被用于 HTTP CONNECT 隧道请求时,`根据相应的 RFC " +"`_,必须提供一个 HTTP " +"``Host:`` 标头,以匹配作为 CONNECT 请求的目标提供的请求目标 authority-form。如果未通过 headers 参数提供 " +"HTTP ``Host:`` 标头,则会自动生成并传送一个标头。" + +#: ../../library/http.client.rst:382 +msgid "" +"For example, to tunnel through a HTTPS proxy server running locally on port " +"8080, we would pass the address of the proxy to the :class:`HTTPSConnection`" +" constructor, and the address of the host that we eventually want to reach " +"to the :meth:`~HTTPConnection.set_tunnel` method::" +msgstr "" +"例如,要通过一个运行于本机 8080 端口的 HTTPS 代理服务器隧道,我们应当向 :class:`HTTPSConnection` " +"构造器传入代理的地址,并将我们最终想要访问的主机地址传给 :meth:`~HTTPConnection.set_tunnel` 方法::" + +#: ../../library/http.client.rst:387 +msgid "" +">>> import http.client\n" +">>> conn = http.client.HTTPSConnection(\"localhost\", 8080)\n" +">>> conn.set_tunnel(\"www.python.org\")\n" +">>> conn.request(\"HEAD\",\"/index.html\")" +msgstr "" +">>> import http.client\n" +">>> conn = http.client.HTTPSConnection(\"localhost\", 8080)\n" +">>> conn.set_tunnel(\"www.python.org\")\n" +">>> conn.request(\"HEAD\",\"/index.html\")" + +#: ../../library/http.client.rst:394 +msgid "" +"HTTP CONNECT tunnelling requests use protocol HTTP/1.1, upgraded from " +"protocol HTTP/1.0. ``Host:`` HTTP headers are mandatory for HTTP/1.1, so one" +" will be automatically generated and transmitted if not provided in the " +"headers argument." +msgstr "" +"HTTP CONNECT 隧道请求使用 HTTP/1.1 协议,它是从 HTTP/1.0 协议升级而来。``Host:`` HTTP 标头是 " +"HTTP/1.1 所必需的,因此如果未在 headers 参数中提供则会自动生成并传送一个标头。" + +#: ../../library/http.client.rst:403 +msgid "" +"Returns a dictionary with the headers of the response received from the " +"proxy server to the CONNECT request." +msgstr "返回一个包含从代理服务器收到的对 CONNECT 请求的响应标头的字典。" + +#: ../../library/http.client.rst:406 +msgid "If the CONNECT request was not sent, the method returns ``None``." +msgstr "如果未发送 CONNECT 请求,该方法将返回 ``None``。" + +#: ../../library/http.client.rst:413 +msgid "" +"Connect to the server specified when the object was created. By default, " +"this is called automatically when making a request if the client does not " +"already have a connection." +msgstr "当对象被创建后连接到指定的服务器。默认情况下,如果客户端还未建立连接,此函数会在发送请求时自动被调用。" + +#: ../../library/http.client.rst:417 +msgid "" +"Raises an :ref:`auditing event ` ``http.client.connect`` with " +"arguments ``self``, ``host``, ``port``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``http.client.connect`` 并附带参数 ``self``, " +"``host``, ``port``." + +#: ../../library/http.client.rst:422 +msgid "Close the connection to the server." +msgstr "关闭到服务器的连接。" + +#: ../../library/http.client.rst:427 +msgid "Buffer size in bytes for sending a file-like message body." +msgstr "用于发送文件类消息体的缓冲区大小。" + +#: ../../library/http.client.rst:434 +msgid "" +"The maximum number of allowed response headers to help prevent denial-of-" +"service attacks. By default, the maximum number of allowed headers is set to" +" 100." +msgstr "" + +#: ../../library/http.client.rst:440 +msgid "" +"As an alternative to using the :meth:`~HTTPConnection.request` method " +"described above, you can also send your request step by step, by using the " +"four functions below." +msgstr "" +"作为对使用上述 :meth:`~HTTPConnection.request` 方法的替代,你也可以通过使用以下四个函数来一步步地发送你的请求。" + +#: ../../library/http.client.rst:447 +msgid "" +"This should be the first call after the connection to the server has been " +"made. It sends a line to the server consisting of the *method* string, the " +"*url* string, and the HTTP version (``HTTP/1.1``). To disable automatic " +"sending of ``Host:`` or ``Accept-Encoding:`` headers (for example to accept " +"additional content encodings), specify *skip_host* or *skip_accept_encoding*" +" with non-False values." +msgstr "" +"应为连接服务器之后首先调用的函数。将向服务器发送一行数据,包含 *method* 字符串、*url* 字符串和 HTTP 版本 " +"(``HTTP/1.1``)。 若要禁止自动发送 ``Host:`` 或 ``Accept-Encoding:`` " +"头部信息(比如需要接受其他编码格式的内容),请将 *skip_host* 或 *skip_accept_encoding* 设为非 False 值。" + +#: ../../library/http.client.rst:457 +msgid "" +"Send an :rfc:`822`\\ -style header to the server. It sends a line to the " +"server consisting of the header, a colon and a space, and the first " +"argument. If more arguments are given, continuation lines are sent, each " +"consisting of a tab and an argument." +msgstr "" +"向服务器发送一个 :rfc:`822` 格式的头部。将向服务器发送一行由头、冒号和空格以及第一个参数组成的数据。 " +"如果还给出了其他参数,将在后续行中发送,每行由一个制表符和一个参数组成。" + +#: ../../library/http.client.rst:465 +msgid "" +"Send a blank line to the server, signalling the end of the headers. The " +"optional *message_body* argument can be used to pass a message body " +"associated with the request." +msgstr "向服务器发送一个空行,表示头部信息结束。可选的 *message_body* 参数可用于传入一个与请求相关的消息体。" + +#: ../../library/http.client.rst:469 +msgid "" +"If *encode_chunked* is ``True``, the result of each iteration of " +"*message_body* will be chunk-encoded as specified in :rfc:`7230`, Section " +"3.3.1. How the data is encoded is dependent on the type of *message_body*." +" If *message_body* implements the :ref:`buffer interface ` " +"the encoding will result in a single chunk. If *message_body* is a " +":class:`collections.abc.Iterable`, each iteration of *message_body* will " +"result in a chunk. If *message_body* is a :term:`file object`, each call to" +" ``.read()`` will result in a chunk. The method automatically signals the " +"end of the chunk-encoded data immediately after *message_body*." +msgstr "" +"如果 *encode_chunked* 为 ``True``,则对 *message_body* 的每次迭代结果将依照 :rfc:`7230` " +"3.3.1 节的规范进行分块编码。数据如何编码取决于 *message_body* 的类型。如果 *message_body* 实现了 " +":ref:`buffer 接口 `,编码将生成一个数据块。如果 *message_body* 是 " +":class:`collections.abc.Iterable`,则 *message_body* 的每次迭代都会产生一个块。如果 " +"*message_body* 为 :term:`file object`,那么每次调用 ``.read()`` 都会产生一个数据块。在 " +"*message_body* 结束后,本方法立即会自动标记分块编码数据的结束。" + +#: ../../library/http.client.rst:480 +msgid "" +"Due to the chunked encoding specification, empty chunks yielded by an " +"iterator body will be ignored by the chunk-encoder. This is to avoid " +"premature termination of the read of the request by the target server due to" +" malformed encoding." +msgstr "由于分块编码的规范要求,迭代器本身产生的空块将被分块编码器忽略。这是为了避免目标服务器因错误编码而过早终止对请求的读取。" + +#: ../../library/http.client.rst:485 +msgid "Added chunked encoding support and the *encode_chunked* parameter." +msgstr "增加了分块编码支持和 *encode_chunked* 形参。" + +#: ../../library/http.client.rst:491 +msgid "" +"Send data to the server. This should be used directly only after the " +":meth:`endheaders` method has been called and before :meth:`getresponse` is " +"called." +msgstr "" +"发送数据到服务器。本函数只应在调用 :meth:`endheaders` 方法之后且调用 :meth:`getresponse` 之前直接调用。" + +#: ../../library/http.client.rst:495 +msgid "" +"Raises an :ref:`auditing event ` ``http.client.send`` with " +"arguments ``self``, ``data``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``http.client.send`` 并附带参数 ``self``, ``data``。" + +#: ../../library/http.client.rst:501 +msgid "HTTPResponse Objects" +msgstr "HTTPResponse 对象" + +#: ../../library/http.client.rst:503 +msgid "" +"An :class:`HTTPResponse` instance wraps the HTTP response from the server. " +"It provides access to the request headers and the entity body. The response" +" is an iterable object and can be used in a with statement." +msgstr "" +":class:`HTTPResponse` 实例封装了来自服务器的 HTTP 响应。通过它可以访问请求头和响应体。响应是可迭代对象,可在 with " +"语句中使用。" + +#: ../../library/http.client.rst:508 +msgid "" +"The :class:`io.BufferedIOBase` interface is now implemented and all of its " +"reader operations are supported." +msgstr "现在已实现了 :class:`io.BufferedIOBase` 接口,并且支持所有的读取操作。" + +#: ../../library/http.client.rst:515 +msgid "Reads and returns the response body, or up to the next *amt* bytes." +msgstr "读取并返回响应体,或后续 *amt* 个字节。" + +#: ../../library/http.client.rst:519 +msgid "" +"Reads up to the next len(b) bytes of the response body into the buffer *b*. " +"Returns the number of bytes read." +msgstr "读取响应体的后续 len(b) 个字节到缓冲区 *b*。返回读取的字节数。" + +#: ../../library/http.client.rst:526 +msgid "" +"Return the value of the header *name*, or *default* if there is no header " +"matching *name*. If there is more than one header with the name *name*, " +"return all of the values joined by ', '. If *default* is any iterable other" +" than a single string, its elements are similarly returned joined by commas." +msgstr "" +"返回标头 *name* 的值,或者如果没有匹配 *name* 的标头则返回 *default*。如果名为 *name* 的标头不止一个,则返回以 ', " +"' 连接的所有值。如果 *default* 是任何不为单个字符串的可迭代对象,则其元素同样会以逗号连接的形式返回。" + +#: ../../library/http.client.rst:533 +msgid "Return a list of (header, value) tuples." +msgstr "返回 (header, value) 元组构成的列表。" + +#: ../../library/http.client.rst:537 +msgid "Return the ``fileno`` of the underlying socket." +msgstr "返回底层套接字的 ``fileno``。" + +#: ../../library/http.client.rst:541 +msgid "" +"A :class:`http.client.HTTPMessage` instance containing the response headers." +" :class:`http.client.HTTPMessage` is a subclass of " +":class:`email.message.Message`." +msgstr "" +"包含响应头的 :class:`http.client.HTTPMessage` 实例。 :class:`http.client.HTTPMessage`" +" 是 :class:`email.message.Message` 的子类。" + +#: ../../library/http.client.rst:547 +msgid "" +"HTTP protocol version used by server. 10 for HTTP/1.0, 11 for HTTP/1.1." +msgstr "服务器采用的 HTTP 协议版本。10 代表 HTTP/1.0,11 代表 HTTP/1.1。" + +#: ../../library/http.client.rst:551 +msgid "" +"URL of the resource retrieved, commonly used to determine if a redirect was " +"followed." +msgstr "已读取资源的 URL,通常用于确定是否进行了重定向。" + +#: ../../library/http.client.rst:555 +msgid "" +"Headers of the response in the form of an " +":class:`email.message.EmailMessage` instance." +msgstr "响应的头部信息,形式为 :class:`email.message.EmailMessage` 的实例。" + +#: ../../library/http.client.rst:559 +msgid "Status code returned by server." +msgstr "由服务器返回的状态码。" + +#: ../../library/http.client.rst:563 +msgid "Reason phrase returned by server." +msgstr "服务器返回的原因短语。" + +#: ../../library/http.client.rst:567 +msgid "" +"A debugging hook. If :attr:`debuglevel` is greater than zero, messages will" +" be printed to stdout as the response is read and parsed." +msgstr "一个调试钩子。如果 :attr:`debuglevel` 大于零,状态信息将在读取和解析响应数据时打印输出到 stdout。" + +#: ../../library/http.client.rst:572 +msgid "Is ``True`` if the stream is closed." +msgstr "如果流被关闭,则为 ``True``。" + +#: ../../library/http.client.rst:576 +msgid "Deprecated in favor of :attr:`~HTTPResponse.url`." +msgstr "已弃用,建议用 :attr:`~HTTPResponse.url`。" + +#: ../../library/http.client.rst:581 +msgid "Deprecated in favor of :attr:`~HTTPResponse.headers`." +msgstr "已弃用,建议用 :attr:`~HTTPResponse.headers`。" + +#: ../../library/http.client.rst:586 +msgid "Deprecated in favor of :attr:`~HTTPResponse.status`." +msgstr "已弃用,建议用 :attr:`~HTTPResponse.status`。" + +#: ../../library/http.client.rst:590 +msgid "Examples" +msgstr "例子" + +#: ../../library/http.client.rst:592 +msgid "Here is an example session that uses the ``GET`` method::" +msgstr "下面是使用 ``GET`` 方法的会话示例::" + +#: ../../library/http.client.rst:594 +msgid "" +">>> import http.client\n" +">>> conn = http.client.HTTPSConnection(\"www.python.org\")\n" +">>> conn.request(\"GET\", \"/\")\n" +">>> r1 = conn.getresponse()\n" +">>> print(r1.status, r1.reason)\n" +"200 OK\n" +">>> data1 = r1.read() # This will return entire content.\n" +">>> # The following example demonstrates reading data in chunks.\n" +">>> conn.request(\"GET\", \"/\")\n" +">>> r1 = conn.getresponse()\n" +">>> while chunk := r1.read(200):\n" +"... print(repr(chunk))\n" +"b'\\n'\n" +">>> print(aRepr.repr(example))\n" +"[\n" +"-->1,\n" +"-->'spam',\n" +"-->{\n" +"-->-->'a': 2,\n" +"-->-->'b': 'spam eggs',\n" +"-->-->'c': {\n" +"-->-->-->3: 4.5,\n" +"-->-->-->6: [],\n" +"-->-->},\n" +"-->},\n" +"-->'ham',\n" +"]" +msgstr "" +">>> aRepr.indent = '-->'\n" +">>> print(aRepr.repr(example))\n" +"[\n" +"-->1,\n" +"-->'spam',\n" +"-->{\n" +"-->-->'a': 2,\n" +"-->-->'b': 'spam eggs',\n" +"-->-->'c': {\n" +"-->-->-->3: 4.5,\n" +"-->-->-->6: [],\n" +"-->-->},\n" +"-->},\n" +"-->'ham',\n" +"]" + +#: ../../library/reprlib.rst:183 +msgid "" +"Setting :attr:`~Repr.indent` to a positive integer value behaves as if it " +"was set to a string with that number of spaces:" +msgstr "将 :attr:`~Repr.indent` 设为一个正整数时其行为与设为相应数量的空格是相同的:" + +#: ../../library/reprlib.rst:186 +msgid "" +">>> aRepr.indent = 4\n" +">>> print(aRepr.repr(example))\n" +"[\n" +" 1,\n" +" 'spam',\n" +" {\n" +" 'a': 2,\n" +" 'b': 'spam eggs',\n" +" 'c': {\n" +" 3: 4.5,\n" +" 6: [],\n" +" },\n" +" },\n" +" 'ham',\n" +"]" +msgstr "" +">>> aRepr.indent = 4\n" +">>> print(aRepr.repr(example))\n" +"[\n" +" 1,\n" +" 'spam',\n" +" {\n" +" 'a': 2,\n" +" 'b': 'spam eggs',\n" +" 'c': {\n" +" 3: 4.5,\n" +" 6: [],\n" +" },\n" +" },\n" +" 'ham',\n" +"]" + +#: ../../library/reprlib.rst:209 +msgid "" +"The equivalent to the built-in :func:`repr` that uses the formatting imposed" +" by the instance." +msgstr "内置 :func:`repr` 的等价形式,它使用实例专属的格式化。" + +#: ../../library/reprlib.rst:215 +msgid "" +"Recursive implementation used by :meth:`.repr`. This uses the type of *obj*" +" to determine which formatting method to call, passing it *obj* and *level*." +" The type-specific methods should call :meth:`repr1` to perform recursive " +"formatting, with ``level - 1`` for the value of *level* in the recursive " +"call." +msgstr "" +"供 :meth:`.repr` 使用的递归实现。此方法使用 *obj* 的类型来确定要调用哪个格式化方法,并传入 *obj* 和 *level*。 " +"类型专属的方法应当调用 :meth:`repr1` 来执行递归格式化,在递归调用中使用 ``level - 1`` 作为 *level* 的值。" + +#: ../../library/reprlib.rst:224 +msgid "" +"Formatting methods for specific types are implemented as methods with a name" +" based on the type name. In the method name, **TYPE** is replaced by " +"``'_'.join(type(obj).__name__.split())``. Dispatch to these methods is " +"handled by :meth:`repr1`. Type-specific methods which need to recursively " +"format a value should call ``self.repr1(subobj, level - 1)``." +msgstr "" +"特定类型的格式化方法会被实现为基于类型名称来命名的方法。在方法名称中,**TYPE** 会被替换为 " +"``'_'.join(type(obj).__name__.split())``。对这些方法的分派会由 :meth:`repr1` 来处理。 " +"需要对值进行递归格式化的类型专属方法应当调用 ``self.repr1(subobj, level - 1)``。" + +#: ../../library/reprlib.rst:234 +msgid "Subclassing Repr Objects" +msgstr "子类化 Repr 对象" + +#: ../../library/reprlib.rst:236 +msgid "" +"The use of dynamic dispatching by :meth:`Repr.repr1` allows subclasses of " +":class:`Repr` to add support for additional built-in object types or to " +"modify the handling of types already supported. This example shows how " +"special support for file objects could be added:" +msgstr "" +"通过 :meth:`Repr.repr1` 使用动态分派允许 :class:`Repr` 的子类添加额外内置对象类型的支持,或是修改对已支持类型的处理。" +" 这个例子演示了如何添加对文件对象的特殊支持:" + +#: ../../library/reprlib.rst:241 +msgid "" +"import reprlib\n" +"import sys\n" +"\n" +"class MyRepr(reprlib.Repr):\n" +"\n" +" def repr_TextIOWrapper(self, obj, level):\n" +" if obj.name in {'', '', ''}:\n" +" return obj.name\n" +" return repr(obj)\n" +"\n" +"aRepr = MyRepr()\n" +"print(aRepr.repr(sys.stdin)) # prints ''" +msgstr "" +"import reprlib\n" +"import sys\n" +"\n" +"class MyRepr(reprlib.Repr):\n" +"\n" +" def repr_TextIOWrapper(self, obj, level):\n" +" if obj.name in {'', '', ''}:\n" +" return obj.name\n" +" return repr(obj)\n" +"\n" +"aRepr = MyRepr()\n" +"print(aRepr.repr(sys.stdin)) # 打印 ''" + +#: ../../library/reprlib.rst:256 +msgid "" +msgstr "" + +#: ../../library/reprlib.rst:65 +msgid "..." +msgstr "..." + +#: ../../library/reprlib.rst:65 +msgid "placeholder" +msgstr "占位符" diff --git a/library/resource.po b/library/resource.po new file mode 100644 index 0000000000..b5d532a62d --- /dev/null +++ b/library/resource.po @@ -0,0 +1,647 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/resource.rst:2 +msgid ":mod:`!resource` --- Resource usage information" +msgstr ":mod:`!resource` --- 资源使用信息" + +#: ../../library/resource.rst:12 +msgid "" +"This module provides basic mechanisms for measuring and controlling system " +"resources utilized by a program." +msgstr "该模块提供了测量和控制程序所利用的系统资源的基本机制。" + +#: ../../library/resource.rst:15 ../../library/resource.rst:103 +#: ../../library/resource.rst:180 ../../library/resource.rst:192 +#: ../../library/resource.rst:201 ../../library/resource.rst:210 +#: ../../library/resource.rst:220 ../../library/resource.rst:229 +#: ../../library/resource.rst:240 ../../library/resource.rst:254 +#: ../../library/resource.rst:263 ../../library/resource.rst:272 +msgid "Availability" +msgstr "Availability" + +#: ../../library/resource.rst:17 +msgid "" +"Symbolic constants are used to specify particular system resources and to " +"request usage information about either the current process or its children." +msgstr "符号常量被用来指定特定的系统资源,并要求获得关于当前进程或其子进程的使用信息。" + +#: ../../library/resource.rst:20 +msgid "An :exc:`OSError` is raised on syscall failure." +msgstr "当系统调用失败时,会触发一个 :exc:`OSError`。" + +#: ../../library/resource.rst:25 +msgid "A deprecated alias of :exc:`OSError`." +msgstr "一个被弃用的 :exc:`OSError` 的别名。" + +#: ../../library/resource.rst:27 +msgid "Following :pep:`3151`, this class was made an alias of :exc:`OSError`." +msgstr "根据 :pep:`3151`,这个类是 :exc:`OSError` 的别名。" + +#: ../../library/resource.rst:32 +msgid "Resource Limits" +msgstr "资源限制" + +#: ../../library/resource.rst:34 +msgid "" +"Resources usage can be limited using the :func:`setrlimit` function " +"described below. Each resource is controlled by a pair of limits: a soft " +"limit and a hard limit. The soft limit is the current limit, and may be " +"lowered or raised by a process over time. The soft limit can never exceed " +"the hard limit. The hard limit can be lowered to any value greater than the " +"soft limit, but not raised. (Only processes with the effective UID of the " +"super-user can raise a hard limit.)" +msgstr "" +"资源的使用可以通过下面描述的 :func:`setrlimit` " +"函数来限制。每个资源都被一对限制所控制:一个软限制和一个硬限制。软限制是当前的限制,并且可以由一个进程随着时间的推移而降低或提高。软限制永远不能超过硬限制。硬限制可以降低到大于软限制的任何数值,但不能提高。(只有拥有超级用户有效" +" UID 的进程才能提高硬限制。)" + +#: ../../library/resource.rst:42 +msgid "" +"The specific resources that can be limited are system dependent. They are " +"described in the :manpage:`getrlimit(2)` man page. The resources listed " +"below are supported when the underlying operating system supports them; " +"resources which cannot be checked or controlled by the operating system are " +"not defined in this module for those platforms." +msgstr "" +"可以被限制的具体资源取决于系统。它们在 man :manpage:`getrlimit(2)` 中描述。 " +"下面列出的资源在底层操作系统支持的情况下被支持;那些不能被操作系统检查或控制的资源在本模块中没有为这些平台定义。" + +#: ../../library/resource.rst:51 +msgid "Constant used to represent the limit for an unlimited resource." +msgstr "用于表示资源无限制的常量。" + +#: ../../library/resource.rst:56 +msgid "" +"Returns a tuple ``(soft, hard)`` with the current soft and hard limits of " +"*resource*. Raises :exc:`ValueError` if an invalid resource is specified, or" +" :exc:`error` if the underlying system call fails unexpectedly." +msgstr "" +"返回一个包含 *resource* 当前软限制和硬限制的元组。如果指定了一个无效的资源,则触发 :exc:`ValueError` " +",如果底层系统调用意外失败,则引发 :exc:`error`。" + +#: ../../library/resource.rst:63 +msgid "" +"Sets new limits of consumption of *resource*. The *limits* argument must be " +"a tuple ``(soft, hard)`` of two integers describing the new limits. A value " +"of :const:`~resource.RLIM_INFINITY` can be used to request a limit that is " +"unlimited." +msgstr "" +"设置新的 *resource* 消耗限制。 *limits* 参数必须为一个由描述新限制的两个整数组成的元组 ``(soft, hard)``。 " +":const:`~resource.RLIM_INFINITY` 值可被用来请求设为无限制。" + +#: ../../library/resource.rst:68 +msgid "" +"Raises :exc:`ValueError` if an invalid resource is specified, if the new " +"soft limit exceeds the hard limit, or if a process tries to raise its hard " +"limit. Specifying a limit of :const:`~resource.RLIM_INFINITY` when the hard " +"or system limit for that resource is not unlimited will result in a " +":exc:`ValueError`. A process with the effective UID of super-user can " +"request any valid limit value, including unlimited, but :exc:`ValueError` " +"will still be raised if the requested limit exceeds the system imposed " +"limit." +msgstr "" +"如果指定了一个无效的资源,如果新的软限制超过了硬限制,或者如果一个进程试图提高它的硬限制,将会引发 :exc:`ValueError`。 " +"在资源的硬限制或系统限制不是无限时指定 :const:`~resource.RLIM_INFINITY` 限制将导致 " +":exc:`ValueError`。一个有效 UID 为超级用户的进程可以请求任何有效的限制值,包括无限,但如果请求的限制超过了系统设定的限制仍然会引发" +" :exc:`ValueError`。" + +#: ../../library/resource.rst:77 +msgid "" +"``setrlimit`` may also raise :exc:`error` if the underlying system call " +"fails." +msgstr "如果底层系统调用失败,``setrlimit`` 也可能触发 :exc:`error`。" + +#: ../../library/resource.rst:80 +msgid "VxWorks only supports setting :const:`RLIMIT_NOFILE`." +msgstr "VxWorks 只支持设置 :const:`RLIMIT_NOFILE`。" + +#: ../../library/resource.rst:82 +msgid "" +"Raises an :ref:`auditing event ` ``resource.setrlimit`` with " +"arguments ``resource``, ``limits``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``resource.setrlimit`` 并附带参数 ``resource``, " +"``limits``." + +#: ../../library/resource.rst:87 +msgid "" +"Combines :func:`setrlimit` and :func:`getrlimit` in one function and " +"supports to get and set the resources limits of an arbitrary process. If " +"*pid* is 0, then the call applies to the current process. *resource* and " +"*limits* have the same meaning as in :func:`setrlimit`, except that *limits*" +" is optional." +msgstr "" +"将 :func:`setrlimit` 和 :func:`getrlimit` 合并为一个函数,支持获取和设置任意进程的资源限制。如果 *pid* 为 " +"0,那么该调用适用于当前进程。 *resource* 和 *limits* 的含义与 :func:`setrlimit` 相同,只是 *limits* " +"是可选的。" + +#: ../../library/resource.rst:93 +msgid "" +"When *limits* is not given the function returns the *resource* limit of the " +"process *pid*. When *limits* is given the *resource* limit of the process is" +" set and the former resource limit is returned." +msgstr "" +"当 *limits* 没有给出时,该函数返回进程 *pid* 的 *resource* 限制。当 *limits* 被给定时,进程的 " +"*resource* 限制被设置,并返回以前的资源限制。" + +#: ../../library/resource.rst:97 +msgid "" +"Raises :exc:`ProcessLookupError` when *pid* can't be found and " +":exc:`PermissionError` when the user doesn't have ``CAP_SYS_RESOURCE`` for " +"the process." +msgstr "" +"当 *pid* 找不到时,触发 :exc:`ProcessLookupError`;当用户没有进程的 ``CAP_SYS_RESOURCE`` 时,触发" +" :exc:`PermissionError`。" + +#: ../../library/resource.rst:101 +msgid "" +"Raises an :ref:`auditing event ` ``resource.prlimit`` with " +"arguments ``pid``, ``resource``, ``limits``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``resource.prlimit`` 并附带参数 ``pid``, " +"``resource``, ``limits``." + +#: ../../library/resource.rst:108 +msgid "" +"These symbols define resources whose consumption can be controlled using the" +" :func:`setrlimit` and :func:`getrlimit` functions described below. The " +"values of these symbols are exactly the constants used by C programs." +msgstr "" +"这些符号定义了资源的消耗可以通过下面描述的 :func:`setrlimit` 和 :func:`getrlimit` 函数来控制。这些符号的值正是 C" +" 程序所使用的常数。" + +#: ../../library/resource.rst:112 +msgid "" +"The Unix man page for :manpage:`getrlimit(2)` lists the available resources." +" Note that not all systems use the same symbol or same value to denote the " +"same resource. This module does not attempt to mask platform differences " +"--- symbols not defined for a platform will not be available from this " +"module on that platform." +msgstr "" +"Unix man 页面 :manpage:`getrlimit(2)` " +"列出了可用的资源。注意,并非所有系统都使用相同的符号或相同的值来表示相同的资源。本模块并不试图掩盖平台的差异——没有为某一平台定义的符号在该平台上将无法从本模块中获得。" + +#: ../../library/resource.rst:121 +msgid "" +"The maximum size (in bytes) of a core file that the current process can " +"create. This may result in the creation of a partial core file if a larger " +"core would be required to contain the entire process image." +msgstr "当前进程可以创建的核心文件的最大大小(以字节为单位)。如果需要更大的核心文件来包含整个进程的镜像,这可能会导致创建一个部分核心文件。" + +#: ../../library/resource.rst:128 +msgid "" +"The maximum amount of processor time (in seconds) that a process can use. If" +" this limit is exceeded, a :const:`~signal.SIGXCPU` signal is sent to the " +"process. (See the :mod:`signal` module documentation for information about " +"how to catch this signal and do something useful, e.g. flush open files to " +"disk.)" +msgstr "" +"一个进程可以使用的最大处理器时间(以秒为单位)。如果超过此限制,将向进程发送 :const:`~signal.SIGXCPU` 信号。 (请参阅 " +":mod:`signal` 模块文档了解如何捕捉此信号并做一些有用的事情,例如将打开的文件数据刷新到磁盘。)" + +#: ../../library/resource.rst:136 +msgid "The maximum size of a file which the process may create." +msgstr "进程可能创建的文件的最大大小。" + +#: ../../library/resource.rst:141 +msgid "The maximum size (in bytes) of the process's heap." +msgstr "进程的堆的最大大小(以字节为单位)。" + +#: ../../library/resource.rst:146 +msgid "" +"The maximum size (in bytes) of the call stack for the current process. This" +" only affects the stack of the main thread in a multi-threaded process." +msgstr "当前进程的调用堆栈的最大大小(字节)。这只影响到多线程进程中主线程的堆栈。" + +#: ../../library/resource.rst:152 +msgid "" +"The maximum resident set size that should be made available to the process." +msgstr "应该提供给进程的最大常驻内存大小。" + +#: ../../library/resource.rst:157 +msgid "The maximum number of processes the current process may create." +msgstr "当前进程可能创建的最大进程数。" + +#: ../../library/resource.rst:162 +msgid "The maximum number of open file descriptors for the current process." +msgstr "当前进程打开的文件描述符的最大数量。" + +#: ../../library/resource.rst:167 +msgid "The BSD name for :const:`RLIMIT_NOFILE`." +msgstr "BSD 对 :const:`RLIMIT_NOFILE` 的命名。" + +#: ../../library/resource.rst:172 +msgid "The maximum address space which may be locked in memory." +msgstr "可能被锁定在内存中的最大地址空间。" + +#: ../../library/resource.rst:177 +msgid "" +"The largest area of mapped memory which the process may occupy. Usually an " +"alias of :const:`RLIMIT_AS`." +msgstr "进程可能占用的最大映射内存区域。通常是 :const:`RLIMIT_AS` 的别名。" + +#: ../../library/resource.rst:185 +msgid "" +"The maximum area (in bytes) of address space which may be taken by the " +"process." +msgstr "进程可能占用的地址空间的最大区域(以字节为单位)。" + +#: ../../library/resource.rst:190 +msgid "The number of bytes that can be allocated for POSIX message queues." +msgstr "可分配给 POSIX 消息队列的字节数。" + +#: ../../library/resource.rst:199 +msgid "" +"The ceiling for the process's nice level (calculated as 20 - rlim_cur)." +msgstr "进程的 Nice 级别的上限(计算为 20 - rlim_cur)。" + +#: ../../library/resource.rst:208 +msgid "The ceiling of the real-time priority." +msgstr "实时优先级的上限。" + +#: ../../library/resource.rst:217 +msgid "" +"The time limit (in microseconds) on CPU time that a process can spend under " +"real-time scheduling without making a blocking syscall." +msgstr "在实时调度下,一个进程在不进行阻塞性系统调用的情况下,可以花费的 CPU 时间限制(以微秒计)。" + +#: ../../library/resource.rst:227 +msgid "The number of signals which the process may queue." +msgstr "进程可能排队的信号数量。" + +#: ../../library/resource.rst:236 +msgid "" +"The maximum size (in bytes) of socket buffer usage for this user. This " +"limits the amount of network memory, and hence the amount of mbufs, that " +"this user may hold at any time." +msgstr "这个用户使用的套接字缓冲区的最大大小(字节数)。这限制了这个用户在任何时候都可以持有的网络内存数量,因此也限制了 mbufs 的数量。" + +#: ../../library/resource.rst:247 +msgid "" +"The maximum size (in bytes) of the swap space that may be reserved or used " +"by all of this user id's processes. This limit is enforced only if bit 1 of " +"the vm.overcommit sysctl is set. Please see `tuning(7) " +"`__ for a " +"complete description of this sysctl." +msgstr "" +"这个用户 ID 的所有进程可能保留或使用的交换空间的大小上限(以字节数表示)。此限制只有在 vm.overcommit sysctl 的 1 " +"号比特位被设置时才会生效。请参阅 `tuning(7) " +"`__ 获取该 sysctl " +"的完整描述。" + +#: ../../library/resource.rst:261 +msgid "The maximum number of pseudo-terminals created by this user id." +msgstr "该用户 ID 创建的伪终端的最大数量。" + +#: ../../library/resource.rst:270 +msgid "The maximum number of kqueues this user id is allowed to create." +msgstr "这个用户 ID 被允许创建的最大 kqueue 数量。" + +#: ../../library/resource.rst:278 +msgid "Resource Usage" +msgstr "资源用量" + +#: ../../library/resource.rst:280 +msgid "These functions are used to retrieve resource usage information:" +msgstr "这些函数被用来检索资源使用信息。" + +#: ../../library/resource.rst:285 +msgid "" +"This function returns an object that describes the resources consumed by " +"either the current process or its children, as specified by the *who* " +"parameter. The *who* parameter should be specified using one of the " +":const:`!RUSAGE_\\*` constants described below." +msgstr "" +"此函数返回一个描述当前进程或其子进程所消耗的资源的对象,它由 *who* 形参指定。 *who* 形参应当使用下面介绍的 " +":const:`!RUSAGE_\\*` 常量之一来指定。" + +#: ../../library/resource.rst:290 +msgid "A simple example::" +msgstr "一个简单的示例::" + +#: ../../library/resource.rst:292 +msgid "" +"from resource import *\n" +"import time\n" +"\n" +"# a non CPU-bound task\n" +"time.sleep(3)\n" +"print(getrusage(RUSAGE_SELF))\n" +"\n" +"# a CPU-bound task\n" +"for i in range(10 ** 8):\n" +" _ = 1 + 1\n" +"print(getrusage(RUSAGE_SELF))" +msgstr "" +"from resource import *\n" +"import time\n" +"\n" +"# 非 CPU 密集型任务\n" +"time.sleep(3)\n" +"print(getrusage(RUSAGE_SELF))\n" +"\n" +"# CPU 密集型任务\n" +"for i in range(10 ** 8):\n" +" _ = 1 + 1\n" +"print(getrusage(RUSAGE_SELF))" + +#: ../../library/resource.rst:304 +msgid "" +"The fields of the return value each describe how a particular system " +"resource has been used, e.g. amount of time spent running in user mode or " +"number of times the process was swapped out of main memory. Some values are " +"dependent on the clock tick interval, e.g. the amount of memory the process " +"is using." +msgstr "" +"返回值的每个字段分别描述某一特定系统资源的使用情况,例如在用户模式下运行花费的时间或进程从主内存中被交换出的次数。 " +"有些值取决于时钟周期,例如进程所使用的内存总量。" + +#: ../../library/resource.rst:309 +msgid "" +"For backward compatibility, the return value is also accessible as a tuple " +"of 16 elements." +msgstr "为了向后兼容,返回值也可以作为一个 16 个元素的元组来访问。" + +#: ../../library/resource.rst:312 +msgid "" +"The fields :attr:`!ru_utime` and :attr:`!ru_stime` of the return value are " +"floating-point values representing the amount of time spent executing in " +"user mode and the amount of time spent executing in system mode, " +"respectively. The remaining values are integers. Consult the " +":manpage:`getrusage(2)` man page for detailed information about these " +"values. A brief summary is presented here:" +msgstr "" +"返回值中的 :attr:`!ru_utime` 和 :attr:`!ru_stime` " +"字段是浮点数值,分别代表在用户模式下执行的时间和在系统模式下执行的时间。其余的值是整数。请查阅 :manpage:`getrusage(2)` " +"手册页了解有关这些值的详细信息。这里提供一个简短的摘要:" + +#: ../../library/resource.rst:319 +msgid "Index" +msgstr "索引" + +#: ../../library/resource.rst:319 +msgid "Field" +msgstr "字段" + +#: ../../library/resource.rst:319 +msgid "Resource" +msgstr "资源" + +#: ../../library/resource.rst:321 +msgid "``0``" +msgstr "``0``" + +#: ../../library/resource.rst:321 +msgid ":attr:`!ru_utime`" +msgstr ":attr:`!ru_utime`" + +#: ../../library/resource.rst:321 +msgid "time in user mode (float seconds)" +msgstr "用户模式下的时间(浮点数秒)" + +#: ../../library/resource.rst:323 +msgid "``1``" +msgstr "``1``" + +#: ../../library/resource.rst:323 +msgid ":attr:`!ru_stime`" +msgstr ":attr:`!ru_stime`" + +#: ../../library/resource.rst:323 +msgid "time in system mode (float seconds)" +msgstr "系统模式下的时间(浮点数秒)" + +#: ../../library/resource.rst:325 +msgid "``2``" +msgstr "``2``" + +#: ../../library/resource.rst:325 +msgid ":attr:`!ru_maxrss`" +msgstr ":attr:`!ru_maxrss`" + +#: ../../library/resource.rst:325 +msgid "maximum resident set size" +msgstr "最大的常驻内存大小" + +#: ../../library/resource.rst:327 +msgid "``3``" +msgstr "``3``" + +#: ../../library/resource.rst:327 +msgid ":attr:`!ru_ixrss`" +msgstr ":attr:`!ru_ixrss`" + +#: ../../library/resource.rst:327 +msgid "shared memory size" +msgstr "共享内存大小" + +#: ../../library/resource.rst:329 +msgid "``4``" +msgstr "``4``" + +#: ../../library/resource.rst:329 +msgid ":attr:`!ru_idrss`" +msgstr ":attr:`!ru_idrss`" + +#: ../../library/resource.rst:329 +msgid "unshared memory size" +msgstr "未共享的内存大小" + +#: ../../library/resource.rst:331 +msgid "``5``" +msgstr "``5``" + +#: ../../library/resource.rst:331 +msgid ":attr:`!ru_isrss`" +msgstr ":attr:`!ru_isrss`" + +#: ../../library/resource.rst:331 +msgid "unshared stack size" +msgstr "未共享的堆栈大小" + +#: ../../library/resource.rst:333 +msgid "``6``" +msgstr "``6``" + +#: ../../library/resource.rst:333 +msgid ":attr:`!ru_minflt`" +msgstr ":attr:`!ru_minflt`" + +#: ../../library/resource.rst:333 +msgid "page faults not requiring I/O" +msgstr "不需要 I/O 的页面故障数" + +#: ../../library/resource.rst:335 +msgid "``7``" +msgstr "``7``" + +#: ../../library/resource.rst:335 +msgid ":attr:`!ru_majflt`" +msgstr ":attr:`!ru_majflt`" + +#: ../../library/resource.rst:335 +msgid "page faults requiring I/O" +msgstr "需要 I/O 的页面故障数" + +#: ../../library/resource.rst:337 +msgid "``8``" +msgstr "``8``" + +#: ../../library/resource.rst:337 +msgid ":attr:`!ru_nswap`" +msgstr ":attr:`!ru_nswap`" + +#: ../../library/resource.rst:337 +msgid "number of swap outs" +msgstr "swap out 的数量" + +#: ../../library/resource.rst:339 +msgid "``9``" +msgstr "``9``" + +#: ../../library/resource.rst:339 +msgid ":attr:`!ru_inblock`" +msgstr ":attr:`!ru_inblock`" + +#: ../../library/resource.rst:339 +msgid "block input operations" +msgstr "块输入操作数" + +#: ../../library/resource.rst:341 +msgid "``10``" +msgstr "``10``" + +#: ../../library/resource.rst:341 +msgid ":attr:`!ru_oublock`" +msgstr ":attr:`!ru_oublock`" + +#: ../../library/resource.rst:341 +msgid "block output operations" +msgstr "块输出操作数" + +#: ../../library/resource.rst:343 +msgid "``11``" +msgstr "``11``" + +#: ../../library/resource.rst:343 +msgid ":attr:`!ru_msgsnd`" +msgstr ":attr:`!ru_msgsnd`" + +#: ../../library/resource.rst:343 +msgid "messages sent" +msgstr "发送消息数" + +#: ../../library/resource.rst:345 +msgid "``12``" +msgstr "``12``" + +#: ../../library/resource.rst:345 +msgid ":attr:`!ru_msgrcv`" +msgstr ":attr:`!ru_msgrcv`" + +#: ../../library/resource.rst:345 +msgid "messages received" +msgstr "收到消息数" + +#: ../../library/resource.rst:347 +msgid "``13``" +msgstr "``13``" + +#: ../../library/resource.rst:347 +msgid ":attr:`!ru_nsignals`" +msgstr ":attr:`!ru_nsignals`" + +#: ../../library/resource.rst:347 +msgid "signals received" +msgstr "收到信号数" + +#: ../../library/resource.rst:349 +msgid "``14``" +msgstr "``14``" + +#: ../../library/resource.rst:349 +msgid ":attr:`!ru_nvcsw`" +msgstr ":attr:`!ru_nvcsw`" + +#: ../../library/resource.rst:349 +msgid "voluntary context switches" +msgstr "主动上下文切换" + +#: ../../library/resource.rst:351 +msgid "``15``" +msgstr "``15``" + +#: ../../library/resource.rst:351 +msgid ":attr:`!ru_nivcsw`" +msgstr ":attr:`!ru_nivcsw`" + +#: ../../library/resource.rst:351 +msgid "involuntary context switches" +msgstr "被动上下文切换" + +#: ../../library/resource.rst:354 +msgid "" +"This function will raise a :exc:`ValueError` if an invalid *who* parameter " +"is specified. It may also raise :exc:`error` exception in unusual " +"circumstances." +msgstr "" +"如果指定了一个无效的 *who* 参数,这个函数将触发一个 :exc:`ValueError`。在特殊情况下,它也可能触发 :exc:`error` " +"异常。" + +#: ../../library/resource.rst:360 +msgid "" +"Returns the number of bytes in a system page. (This need not be the same as " +"the hardware page size.)" +msgstr "返回一个系统页面的字节数。(这不需要和硬件页的大小相同)。" + +#: ../../library/resource.rst:363 +msgid "" +"The following :const:`!RUSAGE_\\*` symbols are passed to the " +":func:`getrusage` function to specify which processes information should be " +"provided for." +msgstr "下面的 :const:`!RUSAGE_\\*` 符号将被传给 :func:`getrusage` 函数以指定应该为哪些进程提供信息。" + +#: ../../library/resource.rst:369 +msgid "" +"Pass to :func:`getrusage` to request resources consumed by the calling " +"process, which is the sum of resources used by all threads in the process." +msgstr "传递给 :func:`getrusage` 以请求调用进程消耗的资源,这是进程中所有线程使用的资源总和。" + +#: ../../library/resource.rst:375 +msgid "" +"Pass to :func:`getrusage` to request resources consumed by child processes " +"of the calling process which have been terminated and waited for." +msgstr "传递给 :func:`getrusage` 以请求被终止和等待的调用进程的子进程所消耗的资源。" + +#: ../../library/resource.rst:381 +msgid "" +"Pass to :func:`getrusage` to request resources consumed by both the current " +"process and child processes. May not be available on all systems." +msgstr "传递给 :func:`getrusage` 以请求当前进程和子进程所消耗的资源。并非所有系统都能使用。" + +#: ../../library/resource.rst:387 +msgid "" +"Pass to :func:`getrusage` to request resources consumed by the current " +"thread. May not be available on all systems." +msgstr "传递给 :func:`getrusage` 以请求当前线程所消耗的资源。并非所有系统都能使用。" diff --git a/library/rlcompleter.po b/library/rlcompleter.po new file mode 100644 index 0000000000..45161bf366 --- /dev/null +++ b/library/rlcompleter.po @@ -0,0 +1,130 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/rlcompleter.rst:2 +msgid ":mod:`!rlcompleter` --- Completion function for GNU readline" +msgstr ":mod:`!rlcompleter` --- 用于 GNU readline 的补全函数" + +#: ../../library/rlcompleter.rst:9 +msgid "**Source code:** :source:`Lib/rlcompleter.py`" +msgstr "**源代码:** :source:`Lib/rlcompleter.py`" + +#: ../../library/rlcompleter.rst:13 +msgid "" +"The :mod:`!rlcompleter` module defines a completion function suitable to be " +"passed to :func:`~readline.set_completer` in the :mod:`readline` module." +msgstr "" +":mod:`!rlcompleter` 模块定义了一个适合被传给 :mod:`readline` 模块中 " +":func:`~readline.set_completer` 的补全函数。" + +#: ../../library/rlcompleter.rst:16 +msgid "" +"When this module is imported on a Unix platform with the :mod:`readline` " +"module available, an instance of the :class:`Completer` class is " +"automatically created and its :meth:`~Completer.complete` method is set as " +"the :ref:`readline completer `. The method provides " +"completion of valid Python :ref:`identifiers and keywords `." +msgstr "" +"当此模块在具有 :mod:`readline` 模块的 Unix 平台上被导入时,会自动创建一个 :class:`Completer` 实例并将其 " +":meth:`~Completer.complete` 方法设为 :ref:`readline completer `。该方法提供了对有效的 Python :ref:`标识符和关键字 ` 的补全功能。" + +#: ../../library/rlcompleter.rst:22 +msgid "Example::" +msgstr "示例::" + +#: ../../library/rlcompleter.rst:24 +msgid "" +">>> import rlcompleter\n" +">>> import readline\n" +">>> readline.parse_and_bind(\"tab: complete\")\n" +">>> readline. \n" +"readline.__doc__ readline.get_line_buffer( readline.read_init_file(\n" +"readline.__file__ readline.insert_text( readline.set_completer(\n" +"readline.__name__ readline.parse_and_bind(\n" +">>> readline." +msgstr "" +">>> import rlcompleter\n" +">>> import readline\n" +">>> readline.parse_and_bind(\"tab: complete\")\n" +">>> readline. \n" +"readline.__doc__ readline.get_line_buffer( readline.read_init_file(\n" +"readline.__file__ readline.insert_text( readline.set_completer(\n" +"readline.__name__ readline.parse_and_bind(\n" +">>> readline." + +#: ../../library/rlcompleter.rst:33 +msgid "" +"The :mod:`!rlcompleter` module is designed for use with Python's " +":ref:`interactive mode `. Unless Python is run with the " +":option:`-S` option, the module is automatically imported and configured " +"(see :ref:`rlcompleter-config`)." +msgstr "" +":mod:`!rlcompleter` 模块是为 Python 的 :ref:`交互模式 ` 而设计的。除非 " +"Python 是附带 :option:`-S` 选项运行的,这个模块总是会被自动地导入并配置 (参见 :ref:`rlcompleter-" +"config`)." + +#: ../../library/rlcompleter.rst:38 +msgid "" +"On platforms without :mod:`readline`, the :class:`Completer` class defined " +"by this module can still be used for custom purposes." +msgstr "在没有 :mod:`readline` 的平台上,此模块定义的 :class:`Completer` 类仍然可以用于自定义目的。" + +#: ../../library/rlcompleter.rst:46 +msgid "Completer objects have the following method:" +msgstr "Completer 对象具有以下方法:" + +#: ../../library/rlcompleter.rst:50 +msgid "Return the next possible completion for *text*." +msgstr "返回针对 *text* 的下一个可能的补全项。" + +#: ../../library/rlcompleter.rst:52 +msgid "" +"When called by the :mod:`readline` module, this method is called " +"successively with ``state == 0, 1, 2, ...`` until the method returns " +"``None``." +msgstr "" +"当被 :mod:`readline` 模块调用时,此方法将被连续调用并附带 ``state == 0, 1, 2, ...`` 直到该方法返回 " +"``None``." + +#: ../../library/rlcompleter.rst:56 +msgid "" +"If called for *text* that doesn't include a period character (``'.'``), it " +"will complete from names currently defined in :mod:`__main__`, " +":mod:`builtins` and keywords (as defined by the :mod:`keyword` module)." +msgstr "" +"如果指定的 *text* 不包含句点字符 (``'.'``),它将根据当前 :mod:`__main__`, :mod:`builtins` " +"和保留关键字(定义于 :mod:`keyword` 模块)所定义的名称进行补全。" + +#: ../../library/rlcompleter.rst:60 +msgid "" +"If called for a dotted name, it will try to evaluate anything without " +"obvious side-effects (functions will not be evaluated, but it can generate " +"calls to :meth:`~object.__getattr__`) up to the last part, and find matches " +"for the rest via the :func:`dir` function. Any exception raised during the " +"evaluation of the expression is caught, silenced and :const:`None` is " +"returned." +msgstr "" +"如果为带有点号的名称执行调用,它将尝试对没有明显附带影响的内容进行求值,直到最后一部分为止(函数不会被求值,但它可以生成对 " +":meth:`~object.__getattr__` 的调用),并通过 :func:`dir` 函数来匹配剩余部分。 " +"在对表达式求值期间引发的任何异常都会被捕获、静默处理并返回 :const:`None`。" diff --git a/library/runpy.po b/library/runpy.po new file mode 100644 index 0000000000..dd96d235c7 --- /dev/null +++ b/library/runpy.po @@ -0,0 +1,332 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/runpy.rst:2 +msgid ":mod:`!runpy` --- Locating and executing Python modules" +msgstr ":mod:`!runpy` --- 查找并执行 Python 模块" + +#: ../../library/runpy.rst:7 +msgid "**Source code:** :source:`Lib/runpy.py`" +msgstr "**源代码:** :source:`Lib/runpy.py`" + +#: ../../library/runpy.rst:11 +msgid "" +"The :mod:`!runpy` module is used to locate and run Python modules without " +"importing them first. Its main use is to implement the :option:`-m` command " +"line switch that allows scripts to be located using the Python module " +"namespace rather than the filesystem." +msgstr "" +":mod:`!runpy` 模块用于定位并运行 Python 模块而不必预先导入。 它的主要用途是实现 :option:`-m` 命令行开关以允许使用 " +"Python 模块命名空间而不是文件系统来定位脚本。" + +#: ../../library/runpy.rst:16 +msgid "" +"Note that this is *not* a sandbox module - all code is executed in the " +"current process, and any side effects (such as cached imports of other " +"modules) will remain in place after the functions have returned." +msgstr "请注意,这 *并非* 一个沙盒模块——所有代码都在当前进程中运行,所有副作用(如其他模块对导入操作进行了缓存)在函数返回后都会留存。" + +#: ../../library/runpy.rst:20 +msgid "" +"Furthermore, any functions and classes defined by the executed code are not " +"guaranteed to work correctly after a :mod:`!runpy` function has returned. If" +" that limitation is not acceptable for a given use case, :mod:`importlib` is" +" likely to be a more suitable choice than this module." +msgstr "" +"此外,在 :mod:`!runpy` 函数返回之后任何由所执行代码定义的函数和类都不保证能正确工作。 如果特定使用场景不能接受此限制,那么更适合选择 " +":mod:`importlib` 而不是本模块。" + +#: ../../library/runpy.rst:25 +msgid "The :mod:`!runpy` module provides two functions:" +msgstr ":mod:`!runpy` 模块提供了两个函数:" + +#: ../../library/runpy.rst:33 +msgid "" +"Execute the code of the specified module and return the resulting module's " +"globals dictionary. The module's code is first located using the standard " +"import mechanism (refer to :pep:`302` for details) and then executed in a " +"fresh module namespace." +msgstr "" +"执行给定模块的代码并返回模块的全局 globals 字典作为结果。首先会使用标准的导入机制来定位该模块的代码(请参阅 :pep:`302` " +"了解详情)然后在新的模块命名空间中执行。" + +#: ../../library/runpy.rst:38 +msgid "" +"The *mod_name* argument should be an absolute module name. If the module " +"name refers to a package rather than a normal module, then that package is " +"imported and the :mod:`__main__` submodule within that package is then " +"executed and the resulting module globals dictionary returned." +msgstr "" +"*mod_name* 参数应当是一个绝对模块名。如果模块名指向一个包而非普通模块,则会导入这个包然后执行这个包中的 :mod:`__main__` " +"子模块再返回模块全局字典。" + +#: ../../library/runpy.rst:44 +msgid "" +"The optional dictionary argument *init_globals* may be used to pre-populate " +"the module's globals dictionary before the code is executed. *init_globals* " +"will not be modified. If any of the special global variables below are " +"defined in *init_globals*, those definitions are overridden by " +":func:`run_module`." +msgstr "" +"可选的字典参数 *init_globals* 可用来在代码执行前预填充模块的 globals 字典。 *init_globals* 不会被修改。如果在 " +"*init_globals* 中定义了下面的任何一个特殊全局变量,这些定义都会被 :func:`run_module` 覆盖。" + +#: ../../library/runpy.rst:50 ../../library/runpy.rst:128 +msgid "" +"The special global variables ``__name__``, ``__spec__``, ``__file__``, " +"``__loader__`` and ``__package__`` are set in the globals dictionary before " +"the module code is executed. (Note that this is a minimal set of variables -" +" other variables may be set implicitly as an interpreter implementation " +"detail.)" +msgstr "" + +#: ../../library/runpy.rst:56 +msgid "" +"``__name__`` is set to *run_name* if this optional argument is not " +":const:`None`, to ``mod_name + '.__main__'`` if the named module is a " +"package and to the *mod_name* argument otherwise." +msgstr "" +"若可选参数 *run_name* 不为 :const:`None` 则 ``__name__`` 被设为 " +"*run_name*,若此名称的模块是一个包则设为 ``mod_name + '.__main__'``,否则设为 *mod_name* 参数。" + +#: ../../library/runpy.rst:60 +msgid "" +"``__spec__`` will be set appropriately for the *actually* imported module " +"(that is, ``__spec__.name`` will always be *mod_name* or ``mod_name + " +"'.__main__'``, never *run_name*)." +msgstr "" +"``__spec__`` 将针对 *实际* 导入的模块进行适当的设置 (也就是说,``__spec__.name`` 将始终为 *mod_name* 或" +" ``mod_name + '.__main__'``,而不是 *run_name*)。" + +#: ../../library/runpy.rst:64 +msgid "" +"``__file__``, ``__loader__`` and ``__package__`` are :ref:`set as normal " +"` based on the module spec." +msgstr "" + +#: ../../library/runpy.rst:67 +msgid "" +"If the argument *alter_sys* is supplied and evaluates to :const:`True`, then" +" ``sys.argv[0]`` is updated with the value of ``__file__`` and " +"``sys.modules[__name__]`` is updated with a temporary module object for the " +"module being executed. Both ``sys.argv[0]`` and ``sys.modules[__name__]`` " +"are restored to their original values before the function returns." +msgstr "" +"如果给出了参数 *alter_sys* 并且值为 :const:`True`,那么 ``sys.argv[0]`` 将被更新为 ``__file__``" +" 的值,``sys.modules[__name__]`` 将被更新为临时模块对象。在函数返回前,``sys.argv[0]`` 和 " +"``sys.modules[__name__]`` 将会复原。" + +#: ../../library/runpy.rst:73 +msgid "" +"Note that this manipulation of :mod:`sys` is not thread-safe. Other threads " +"may see the partially initialised module, as well as the altered list of " +"arguments. It is recommended that the ``sys`` module be left alone when " +"invoking this function from threaded code." +msgstr "" +"请注意对 :mod:`sys` 的这种操作不是线程安全的。其他线程可能会看到部分初始化的模块,以及更改后的参数列表。 " +"建议当从线程中的代码调用此函数时不要使用 ``sys`` 模块。" + +#: ../../library/runpy.rst:79 +msgid "" +"The :option:`-m` option offering equivalent functionality from the command " +"line." +msgstr ":option:`-m` 选项由命令行提供相同功能。" + +#: ../../library/runpy.rst:82 +msgid "" +"Added ability to execute packages by looking for a :mod:`__main__` " +"submodule." +msgstr "增加了通过查找 :mod:`__main__` 子模块来执行包的功能。" + +#: ../../library/runpy.rst:85 +msgid "Added ``__cached__`` global variable (see :pep:`3147`)." +msgstr "加入了 ``__cached__`` 全局变量 (参见 :pep:`3147`)。" + +#: ../../library/runpy.rst:88 +msgid "" +"Updated to take advantage of the module spec feature added by :pep:`451`. " +"This allows ``__cached__`` to be set correctly for modules run this way, as " +"well as ensuring the real module name is always accessible as " +"``__spec__.name``." +msgstr "" +"充分利用 :pep:`451` 加入的模块规格功能。使得以这种方式运行的模块能够正确设置 ``__cached__``,并确保真正的模块名称总是可以通过" +" ``__spec__.name`` 的形式访问。" + +#: ../../library/runpy.rst:94 +msgid "" +"The setting of ``__cached__``, ``__loader__``, and ``__package__`` are " +"deprecated. See :class:`~importlib.machinery.ModuleSpec` for alternatives." +msgstr "" +"``__cached__``, ``__loader__`` 和 ``__package__`` 的设置已被弃用。替代设置参见 " +":class:`~importlib.machinery.ModuleSpec`." + +#: ../../library/runpy.rst:99 ../../library/runpy.rst:177 +msgid "``__cached__`` is no longer set." +msgstr "" + +#: ../../library/runpy.rst:107 +msgid "" +"Execute the code at the named filesystem location and return the resulting " +"module's globals dictionary. As with a script name supplied to the CPython " +"command line, *file_path* may refer to a Python source file, a compiled " +"bytecode file or a valid :data:`sys.path` entry containing a :mod:`__main__`" +" module (e.g. a zipfile containing a top-level :file:`__main__.py` file)." +msgstr "" +"执行位于指定文件系统位置上的代码并返回模块的 globals 字典作为结果。与提供给 CPython 命令行的脚本名称一样,*file_path* " +"可以指向一个 Python 源文件、编译后的字节码文件或包含 :mod:`__main__` 模块的有效 :data:`sys.path` " +"条目(例如一个包含最高层级 :file:`__main__.py` 文件的 zip 文件)。" + +#: ../../library/runpy.rst:114 +msgid "" +"For a simple script, the specified code is simply executed in a fresh module" +" namespace. For a valid :data:`sys.path` entry (typically a zipfile or " +"directory), the entry is first added to the beginning of ``sys.path``. The " +"function then looks for and executes a :mod:`__main__` module using the " +"updated path. Note that there is no special protection against invoking an " +"existing ``__main__`` entry located elsewhere on ``sys.path`` if there is no" +" such module at the specified location." +msgstr "" +"对于简单的脚本而言,只需在新的模块命名空间中执行指定的代码即可。对于一个有效的 :data:`sys.path` 条目(通常是一个 zip " +"文件或目录),首先会将该条目添加到 ``sys.path`` 的开头。然后函数会使用更新后的路径查找并执行 :mod:`__main__` 模块。 " +"请注意如果在指定的位置上没有 ``__main__`` 模块那么在唤起位于 ``sys.path`` 中其他位置上的现有条目时也不会受到特殊保护。" + +#: ../../library/runpy.rst:122 +msgid "" +"The optional dictionary argument *init_globals* may be used to pre-populate " +"the module's globals dictionary before the code is executed. *init_globals* " +"will not be modified. If any of the special global variables below are " +"defined in *init_globals*, those definitions are overridden by " +":func:`run_path`." +msgstr "" +"可选的字典参数 *init_globals* 可用来在代码执行前预填充模块的 globals 字典。 *init_globals* 不会被修改。如果在 " +"*init_globals* 中定义了下面的任何一个特殊全局变量,这些定义都会被 :func:`run_path` 覆盖。" + +#: ../../library/runpy.rst:134 +msgid "" +"``__name__`` is set to *run_name* if this optional argument is not " +":const:`None` and to ``''`` otherwise." +msgstr "" +"如果该可选参数不为 :const:`None`,则 ``__name__`` 被设为 *run_name*,否则为 ``''``。" + +#: ../../library/runpy.rst:137 +msgid "" +"If *file_path* directly references a script file (whether as source or as " +"precompiled byte code), then ``__file__`` will be set to *file_path*, and " +"``__spec__``, ``__loader__`` and ``__package__`` will all be set to " +":const:`None`." +msgstr "" + +#: ../../library/runpy.rst:142 +msgid "" +"If *file_path* is a reference to a valid :data:`sys.path` entry, then " +"``__spec__`` will be set appropriately for the imported :mod:`__main__` " +"module (that is, ``__spec__.name`` will always be ``__main__``). " +"``__file__``, ``__loader__`` and ``__package__`` will be :ref:`set as normal" +" ` based on the module spec." +msgstr "" + +#: ../../library/runpy.rst:148 +msgid "" +"A number of alterations are also made to the :mod:`sys` module. Firstly, " +":data:`sys.path` may be altered as described above. ``sys.argv[0]`` is " +"updated with the value of *file_path* and ``sys.modules[__name__]`` is " +"updated with a temporary module object for the module being executed. All " +"modifications to items in :mod:`sys` are reverted before the function " +"returns." +msgstr "" +":mod:`sys` 模块也进行了多项改动。首先,:data:`sys.path` 可能会有如上文所描述的调整,``sys.argv[0]`` 会使用 " +"*file_path* 的值进行更新而 ``sys.modules[__name__]`` 会使用对应于被执行模块的临时模块对象进行更新。 " +"在函数返回之前对 :mod:`sys` 中条目的所有修改都会被复原。" + +#: ../../library/runpy.rst:155 +msgid "" +"Note that, unlike :func:`run_module`, the alterations made to :mod:`sys` are" +" not optional in this function as these adjustments are essential to " +"allowing the execution of :data:`sys.path` entries. As the thread-safety " +"limitations still apply, use of this function in threaded code should be " +"either serialised with the import lock or delegated to a separate process." +msgstr "" +"请注意,与 :func:`run_module` 不同,对 :mod:`sys` 的修改在本函数中不是可选项,因为这些调整对于允许执行 " +":data:`sys.path` 条目来说是至关重要的。 " +"由于线程安全限制仍然适用,在线程代码中使用该函数应当使用导入锁进行序列化,或是委托给单独的进程。" + +#: ../../library/runpy.rst:162 +msgid "" +":ref:`using-on-interface-options` for equivalent functionality on the " +"command line (``python path/to/script``)." +msgstr "" +":ref:`using-on-interface-options` 用于在命令行上实现同等功能 (``python path/to/script``)。" + +#: ../../library/runpy.rst:167 +msgid "" +"Updated to take advantage of the module spec feature added by :pep:`451`. " +"This allows ``__cached__`` to be set correctly in the case where " +"``__main__`` is imported from a valid :data:`sys.path` entry rather than " +"being executed directly." +msgstr "" +"进行更新以便利用 :pep:`451` 加入的模块规格特性。这允许在 ``__main__`` 是从有效的 :data:`sys.path` " +"条目导入而不是直接执行的情况下能够正确地设置 ``__cached__``。" + +#: ../../library/runpy.rst:173 +msgid "" +"The setting of ``__cached__``, ``__loader__``, and ``__package__`` are " +"deprecated." +msgstr "``__cached__``, ``__loader__`` 和 ``__package__`` 已被弃用。" + +#: ../../library/runpy.rst:182 +msgid ":pep:`338` -- Executing modules as scripts" +msgstr ":pep:`338` -- 将模块作为脚本执行" + +#: ../../library/runpy.rst:183 ../../library/runpy.rst:186 +msgid "PEP written and implemented by Nick Coghlan." +msgstr "PEP 由 Nick Coghlan 撰写并实现。" + +#: ../../library/runpy.rst:185 +msgid ":pep:`366` -- Main module explicit relative imports" +msgstr ":pep:`366` ——主模块的显式相对导入" + +#: ../../library/runpy.rst:188 +msgid ":pep:`451` -- A ModuleSpec Type for the Import System" +msgstr ":pep:`451` —— 导入系统采用的 ModuleSpec 类型" + +#: ../../library/runpy.rst:189 +msgid "PEP written and implemented by Eric Snow" +msgstr "PEP 由 Eric Snow 撰写并实现。" + +#: ../../library/runpy.rst:191 +msgid ":ref:`using-on-general` - CPython command line details" +msgstr ":ref:`using-on-general` —— CPython 命令行详解" + +#: ../../library/runpy.rst:193 +msgid "The :func:`importlib.import_module` function" +msgstr ":func:`importlib.import_module` 函数" + +#: ../../library/runpy.rst:30 ../../library/runpy.rst:104 +msgid "module" +msgstr "module" + +#: ../../library/runpy.rst:30 ../../library/runpy.rst:104 +msgid "__main__" +msgstr "__main__" diff --git a/library/sched.po b/library/sched.po new file mode 100644 index 0000000000..5ef69e8592 --- /dev/null +++ b/library/sched.po @@ -0,0 +1,228 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-31 16:04+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/sched.rst:2 +msgid ":mod:`!sched` --- Event scheduler" +msgstr ":mod:`!sched` --- 事件调度器" + +#: ../../library/sched.rst:9 +msgid "**Source code:** :source:`Lib/sched.py`" +msgstr "**源码:** :source:`Lib/sched.py`" + +#: ../../library/sched.rst:15 +msgid "" +"The :mod:`!sched` module defines a class which implements a general purpose " +"event scheduler:" +msgstr ":mod:`!sched` 模块定义了一个实现通用事件调度器的类:" + +#: ../../library/sched.rst:20 +msgid "" +"The :class:`scheduler` class defines a generic interface to scheduling " +"events. It needs two functions to actually deal with the \"outside world\" " +"--- *timefunc* should be callable without arguments, and return a number " +"(the \"time\", in any units whatsoever). The *delayfunc* function should be" +" callable with one argument, compatible with the output of *timefunc*, and " +"should delay that many time units. *delayfunc* will also be called with the " +"argument ``0`` after each event is run to allow other threads an opportunity" +" to run in multi-threaded applications." +msgstr "" +":class:`scheduler` 类定义了一个调度事件的通用接口。它需要两个函数来实际处理“外部世界” —— *timefunc* " +"应当不带参数地调用,并返回一个数字(“时间”,可以为任意单位)。 *delayfunc* 函数应当带一个参数调用,与 *timefunc* " +"的输出相兼容,并且应当延迟其所指定的时间单位。每个事件运行后还将调用 *delayfunc* 并传入参数 ``0`` " +"以允许其他线程有机会在多线程应用中运行。" + +#: ../../library/sched.rst:29 +msgid "*timefunc* and *delayfunc* parameters are optional." +msgstr "*timefunc* 和 *delayfunc* 参数是可选的。" + +#: ../../library/sched.rst:32 +msgid "" +":class:`scheduler` class can be safely used in multi-threaded environments." +msgstr ":class:`scheduler` 类可以安全地在多线程环境中使用。" + +#: ../../library/sched.rst:36 +msgid "Example::" +msgstr "示例::" + +#: ../../library/sched.rst:38 +msgid "" +">>> import sched, time\n" +">>> s = sched.scheduler(time.time, time.sleep)\n" +">>> def print_time(a='default'):\n" +"... print(\"From print_time\", time.time(), a)\n" +"...\n" +">>> def print_some_times():\n" +"... print(time.time())\n" +"... s.enter(10, 1, print_time)\n" +"... s.enter(5, 2, print_time, argument=('positional',))\n" +"... # despite having higher priority, 'keyword' runs after 'positional' as enter() is relative\n" +"... s.enter(5, 1, print_time, kwargs={'a': 'keyword'})\n" +"... s.enterabs(1_650_000_000, 10, print_time, argument=(\"first enterabs\",))\n" +"... s.enterabs(1_650_000_000, 5, print_time, argument=(\"second enterabs\",))\n" +"... s.run()\n" +"... print(time.time())\n" +"...\n" +">>> print_some_times()\n" +"1652342830.3640375\n" +"From print_time 1652342830.3642538 second enterabs\n" +"From print_time 1652342830.3643398 first enterabs\n" +"From print_time 1652342835.3694863 positional\n" +"From print_time 1652342835.3696074 keyword\n" +"From print_time 1652342840.369612 default\n" +"1652342840.3697174" +msgstr "" +">>> import sched, time\n" +">>> s = sched.scheduler(time.time, time.sleep)\n" +">>> def print_time(a='default'):\n" +"... print(\"From print_time\", time.time(), a)\n" +"...\n" +">>> def print_some_times():\n" +"... print(time.time())\n" +"... s.enter(10, 1, print_time)\n" +"... s.enter(5, 2, print_time, argument=('positional',))\n" +"... # 虽然具有更高的优先级,'keyword' 将在 'positional' 之后运行,因为 enter() 是相对的\n" +"... s.enter(5, 1, print_time, kwargs={'a': 'keyword'})\n" +"... s.enterabs(1_650_000_000, 10, print_time, argument=(\"first enterabs\",))\n" +"... s.enterabs(1_650_000_000, 5, print_time, argument=(\"second enterabs\",))\n" +"... s.run()\n" +"... print(time.time())\n" +"...\n" +">>> print_some_times()\n" +"1652342830.3640375\n" +"From print_time 1652342830.3642538 second enterabs\n" +"From print_time 1652342830.3643398 first enterabs\n" +"From print_time 1652342835.3694863 positional\n" +"From print_time 1652342835.3696074 keyword\n" +"From print_time 1652342840.369612 default\n" +"1652342840.3697174" + +#: ../../library/sched.rst:67 +msgid "Scheduler Objects" +msgstr "调度器对象" + +#: ../../library/sched.rst:69 +msgid "" +":class:`scheduler` instances have the following methods and attributes:" +msgstr ":class:`scheduler` 实例拥有以下方法和属性:" + +#: ../../library/sched.rst:74 +msgid "" +"Schedule a new event. The *time* argument should be a numeric type " +"compatible with the return value of the *timefunc* function passed to the " +"constructor. Events scheduled for the same *time* will be executed in the " +"order of their *priority*. A lower number represents a higher priority." +msgstr "" +"安排一个新事件。 *time* 参数应当是一个数字类型,与传递给构造函数的 *timefunc* 函数的返回值兼容。计划在相同 *time* " +"的事件将按其 *priority* 的顺序执行。数字越小表示优先级越高。" + +#: ../../library/sched.rst:79 +msgid "" +"Executing the event means executing ``action(*argument, **kwargs)``. " +"*argument* is a sequence holding the positional arguments for *action*. " +"*kwargs* is a dictionary holding the keyword arguments for *action*." +msgstr "" +"执行事件意为执行 ``action(*argument, **kwargs)``。 *argument* 是包含有 *action* 的位置参数的序列。" +" *kwargs* 是包含 *action* 的关键字参数的字典。" + +#: ../../library/sched.rst:83 +msgid "" +"Return value is an event which may be used for later cancellation of the " +"event (see :meth:`cancel`)." +msgstr "返回值是一个事件,可用于以后取消事件 (参见 :meth:`cancel`)。" + +#: ../../library/sched.rst:86 ../../library/sched.rst:99 +msgid "*argument* parameter is optional." +msgstr "*argument* 参数是可选的。" + +#: ../../library/sched.rst:89 ../../library/sched.rst:102 +msgid "*kwargs* parameter was added." +msgstr "添加了 *kwargs* 形参。" + +#: ../../library/sched.rst:95 +msgid "" +"Schedule an event for *delay* more time units. Other than the relative time," +" the other arguments, the effect and the return value are the same as those " +"for :meth:`enterabs`." +msgstr "安排延后 *delay* 时间单位的事件。除了时间是相对的,其他参数、效果和返回值与 :meth:`enterabs` 相同。" + +#: ../../library/sched.rst:107 +msgid "" +"Remove the event from the queue. If *event* is not an event currently in the" +" queue, this method will raise a :exc:`ValueError`." +msgstr "从队列中删除事件。如果 *event* 不是当前队列中的事件,则此方法将引发 :exc:`ValueError`。" + +#: ../../library/sched.rst:113 +msgid "Return ``True`` if the event queue is empty." +msgstr "如果事件队列为空则返回 ``True``。" + +#: ../../library/sched.rst:118 +msgid "" +"Run all scheduled events. This method will wait (using the *delayfunc* " +"function passed to the constructor) for the next event, then execute it and " +"so on until there are no more scheduled events." +msgstr "" +"运行所有计划事件。此方法将等待(使用传递给构造函数的 *delayfunc* 函数)下一个事件,然后执行它,依此类推直到没有更多的计划事件。" + +#: ../../library/sched.rst:122 +msgid "" +"If *blocking* is false, immediately executes all events in the queue which " +"have a time value less than or equal to the current *timefunc* value (if " +"any) and returns the difference between the current *timefunc* value and the" +" time value of the next scheduled event in the scheduler's event queue. If " +"the queue is empty, returns ``None``." +msgstr "" + +#: ../../library/sched.rst:128 +msgid "" +"Either *action* or *delayfunc* can raise an exception. In either case, the " +"scheduler will maintain a consistent state and propagate the exception. If " +"an exception is raised by *action*, the event will not be attempted in " +"future calls to :meth:`run`." +msgstr "" +"*action* 或 *delayfunc* 都可以引发异常。在任何一种情况下,调度程序都将保持一致状态并传播异常。如果 *action* " +"引发异常,则在将来调用 :meth:`run` 时不会尝试该事件。" + +#: ../../library/sched.rst:133 +msgid "" +"If a sequence of events takes longer to run than the time available before " +"the next event, the scheduler will simply fall behind. No events will be " +"dropped; the calling code is responsible for canceling events which are no " +"longer pertinent." +msgstr "如果一系列事件的运行时间大于下一个事件发生前的可用时间,那么调度程序只会保持落后。没有事件会被丢弃;调用代码负责取消不再相关的事件。" + +#: ../../library/sched.rst:138 +msgid "*blocking* parameter was added." +msgstr "添加了 *blocking* 形参。" + +#: ../../library/sched.rst:143 +msgid "" +"Read-only attribute returning a list of upcoming events in the order they " +"will be run. Each event is shown as a :term:`named tuple` with the " +"following fields: time, priority, action, argument, kwargs." +msgstr "" +"只读属性,按照计划运行的顺序返回即将发生的事件列表。每个事件都显示为 :term:`named tuple` " +",包含以下字段:time、priority、action、argument、kwargs。" + +#: ../../library/sched.rst:11 +msgid "event scheduling" +msgstr "事件排期" diff --git a/library/secrets.po b/library/secrets.po new file mode 100644 index 0000000000..6c8126e3b6 --- /dev/null +++ b/library/secrets.po @@ -0,0 +1,290 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-21 16:26+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/secrets.rst:2 +msgid "" +":mod:`!secrets` --- Generate secure random numbers for managing secrets" +msgstr ":mod:`!secrets` --- 生成管理密码的安全随机数" + +#: ../../library/secrets.rst:16 +msgid "**Source code:** :source:`Lib/secrets.py`" +msgstr "**源代码:** :source:`Lib/secrets.py`" + +#: ../../library/secrets.rst:20 +msgid "" +"The :mod:`!secrets` module is used for generating cryptographically strong " +"random numbers suitable for managing data such as passwords, account " +"authentication, security tokens, and related secrets." +msgstr "" + +#: ../../library/secrets.rst:24 +msgid "" +"In particular, :mod:`!secrets` should be used in preference to the default " +"pseudo-random number generator in the :mod:`random` module, which is " +"designed for modelling and simulation, not security or cryptography." +msgstr "" + +#: ../../library/secrets.rst:30 +msgid ":pep:`506`" +msgstr ":pep:`506`" + +#: ../../library/secrets.rst:34 +msgid "Random numbers" +msgstr "随机数" + +#: ../../library/secrets.rst:36 +msgid "" +"The :mod:`!secrets` module provides access to the most secure source of " +"randomness that your operating system provides." +msgstr "" + +#: ../../library/secrets.rst:41 +msgid "" +"A class for generating random numbers using the highest-quality sources " +"provided by the operating system. See :class:`random.SystemRandom` for " +"additional details." +msgstr "用操作系统提供的最高质量源生成随机数的类。详见 :class:`random.SystemRandom`。" + +#: ../../library/secrets.rst:47 +msgid "Return a randomly chosen element from a non-empty sequence." +msgstr "返回一个从非空序列中随机选取的元素。" + +#: ../../library/secrets.rst:51 +msgid "Return a random int in the range [0, *exclusive_upper_bound*)." +msgstr "返回 [0, *exclusive_upper_bound*) 范围内的随机整数。" + +#: ../../library/secrets.rst:55 +msgid "Return a non-negative int with *k* random bits." +msgstr "返回有 *k* 个随机比特位的非负整数。" + +#: ../../library/secrets.rst:59 +msgid "Generating tokens" +msgstr "生成 Token" + +#: ../../library/secrets.rst:61 +msgid "" +"The :mod:`!secrets` module provides functions for generating secure tokens, " +"suitable for applications such as password resets, hard-to-guess URLs, and " +"similar." +msgstr "" + +#: ../../library/secrets.rst:67 +msgid "Return a random byte string containing *nbytes* number of bytes." +msgstr "" + +#: ../../library/secrets.rst:69 ../../library/secrets.rst:83 +#: ../../library/secrets.rst:97 +msgid "" +"If *nbytes* is not specified or ``None``, :const:`DEFAULT_ENTROPY` is used " +"instead." +msgstr "" + +#: ../../library/secrets.rst:72 +msgid "" +">>> token_bytes(16)\n" +"b'\\xebr\\x17D*t\\xae\\xd4\\xe3S\\xb6\\xe2\\xebP1\\x8b'" +msgstr "" +">>> token_bytes(16)\n" +"b'\\xebr\\x17D*t\\xae\\xd4\\xe3S\\xb6\\xe2\\xebP1\\x8b'" + +#: ../../library/secrets.rst:80 +msgid "" +"Return a random text string, in hexadecimal. The string has *nbytes* random" +" bytes, each byte converted to two hex digits." +msgstr "" + +#: ../../library/secrets.rst:86 +msgid "" +">>> token_hex(16)\n" +"'f9bf78b9a18ce6d46a0cd2b0b86df9da'" +msgstr "" +">>> token_hex(16)\n" +"'f9bf78b9a18ce6d46a0cd2b0b86df9da'" + +#: ../../library/secrets.rst:93 +msgid "" +"Return a random URL-safe text string, containing *nbytes* random bytes. The" +" text is Base64 encoded, so on average each byte results in approximately " +"1.3 characters." +msgstr "" + +#: ../../library/secrets.rst:100 +msgid "" +">>> token_urlsafe(16)\n" +"'Drmhze6EPcv0fN_81Bj-nA'" +msgstr "" +">>> token_urlsafe(16)\n" +"'Drmhze6EPcv0fN_81Bj-nA'" + +#: ../../library/secrets.rst:107 +msgid "How many bytes should tokens use?" +msgstr "Token 应当使用多少个字节?" + +#: ../../library/secrets.rst:109 +msgid "" +"To be secure against `brute-force attacks " +"`_, tokens need to have " +"sufficient randomness. Unfortunately, what is considered sufficient will " +"necessarily increase as computers get more powerful and able to make more " +"guesses in a shorter period. As of 2015, it is believed that 32 bytes (256 " +"bits) of randomness is sufficient for the typical use-case expected for the " +":mod:`!secrets` module." +msgstr "" + +#: ../../library/secrets.rst:117 +msgid "" +"For those who want to manage their own token length, you can explicitly " +"specify how much randomness is used for tokens by giving an :class:`int` " +"argument to the various ``token_*`` functions. That argument is taken as " +"the number of bytes of randomness to use." +msgstr "" +"要自行管理 Token 长度的用户,可以通过为 ``token_*`` 函数指定 :class:`int` 参数显式指定 Token " +"要使用多大的随机性。该参数以字节数表示随机性大小。" + +#: ../../library/secrets.rst:122 +msgid "" +"Otherwise, if no argument is provided, or if the argument is ``None``, the " +"``token_*`` functions use :const:`DEFAULT_ENTROPY` instead." +msgstr "" + +#: ../../library/secrets.rst:127 +msgid "" +"Default number of bytes of randomness used by the ``token_*`` functions." +msgstr "``token_*`` 函数所使用的默认随机字节数。" + +#: ../../library/secrets.rst:129 +msgid "" +"The exact value is subject to change at any time, including during " +"maintenance releases." +msgstr "该值可能随时发生变化,包括在维护版本发布的时候。" + +#: ../../library/secrets.rst:134 +msgid "Other functions" +msgstr "其他函数" + +#: ../../library/secrets.rst:138 +msgid "" +"Return ``True`` if strings or :term:`bytes-like objects `" +" *a* and *b* are equal, otherwise ``False``, using a \"constant-time " +"compare\" to reduce the risk of `timing attacks " +"`__. See :func:`hmac.compare_digest` for additional " +"details." +msgstr "" + +#: ../../library/secrets.rst:147 +msgid "Recipes and best practices" +msgstr "应用技巧与最佳实践" + +#: ../../library/secrets.rst:149 +msgid "" +"This section shows recipes and best practices for using :mod:`!secrets` to " +"manage a basic level of security." +msgstr "本节展示了一些使用 :mod:`!secrets` 来管理基本安全级别的应用技巧和最佳实践。" + +#: ../../library/secrets.rst:152 +msgid "Generate an eight-character alphanumeric password:" +msgstr "生成长度为八个字符的字母数字密码:" + +#: ../../library/secrets.rst:154 +msgid "" +"import string\n" +"import secrets\n" +"alphabet = string.ascii_letters + string.digits\n" +"password = ''.join(secrets.choice(alphabet) for i in range(8))" +msgstr "" +"import string\n" +"import secrets\n" +"alphabet = string.ascii_letters + string.digits\n" +"password = ''.join(secrets.choice(alphabet) for i in range(8))" + +#: ../../library/secrets.rst:164 +msgid "" +"Applications should not :cwe:`store passwords in a recoverable format " +"<257>`, whether plain text or encrypted. They should be salted and hashed " +"using a cryptographically strong one-way (irreversible) hash function." +msgstr "" +"应用程序不应该 :cwe:`以可恢复的格式存储密码 <257>`,无论是纯文本的还是加密的。 " +"它们应当使用高加密强度的单向(不可逆)哈希函数加盐并执行哈希运算。" + +#: ../../library/secrets.rst:170 +msgid "" +"Generate a ten-character alphanumeric password with at least one lowercase " +"character, at least one uppercase character, and at least three digits:" +msgstr "生成长度为十个字符的字母数字密码,包含至少一个小写字母,至少一个大写字母以及至少三个数字:" + +#: ../../library/secrets.rst:174 +msgid "" +"import string\n" +"import secrets\n" +"alphabet = string.ascii_letters + string.digits\n" +"while True:\n" +" password = ''.join(secrets.choice(alphabet) for i in range(10))\n" +" if (any(c.islower() for c in password)\n" +" and any(c.isupper() for c in password)\n" +" and sum(c.isdigit() for c in password) >= 3):\n" +" break" +msgstr "" +"import string\n" +"import secrets\n" +"alphabet = string.ascii_letters + string.digits\n" +"while True:\n" +" password = ''.join(secrets.choice(alphabet) for i in range(10))\n" +" if (any(c.islower() for c in password)\n" +" and any(c.isupper() for c in password)\n" +" and sum(c.isdigit() for c in password) >= 3):\n" +" break" + +#: ../../library/secrets.rst:187 +msgid "Generate an `XKCD-style passphrase `_:" +msgstr "生成 `XKCD 风格的密码串 `_:" + +#: ../../library/secrets.rst:189 +msgid "" +"import secrets\n" +"# On standard Linux systems, use a convenient dictionary file.\n" +"# Other platforms may need to provide their own word-list.\n" +"with open('/usr/share/dict/words') as f:\n" +" words = [word.strip() for word in f]\n" +" password = ' '.join(secrets.choice(words) for i in range(4))" +msgstr "" +"import secrets\n" +"# 在标准 Linux 系统中,使用方便的字典文件。\n" +"# 其他系统平台可能需要提供它们专用的词列表。\n" +"with open('/usr/share/dict/words') as f:\n" +" words = [word.strip() for word in f]\n" +" password = ' '.join(secrets.choice(words) for i in range(4))" + +#: ../../library/secrets.rst:199 +msgid "" +"Generate a hard-to-guess temporary URL containing a security token suitable " +"for password recovery applications:" +msgstr "生成包含安全 Token 的难以猜测的临时 URL,适用于密码恢复应用:" + +#: ../../library/secrets.rst:202 +msgid "" +"import secrets\n" +"url = 'https://example.com/reset=' + secrets.token_urlsafe()" +msgstr "" +"import secrets\n" +"url = 'https://example.com/reset=' + secrets.token_urlsafe()" diff --git a/library/security_warnings.po b/library/security_warnings.po new file mode 100644 index 0000000000..8e902b0667 --- /dev/null +++ b/library/security_warnings.po @@ -0,0 +1,130 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/security_warnings.rst:6 +msgid "Security Considerations" +msgstr "安全考量" + +#: ../../library/security_warnings.rst:8 +msgid "The following modules have specific security considerations:" +msgstr "下列模块具有专门的安全事项:" + +#: ../../library/security_warnings.rst:10 +msgid "" +":mod:`base64`: :ref:`base64 security considerations ` in " +":rfc:`4648`" +msgstr ":mod:`base64`: :ref:`base64 安全事项 `,参见 :rfc:`4648`" + +#: ../../library/security_warnings.rst:12 +msgid "" +":mod:`hashlib`: :ref:`all constructors take a \"usedforsecurity\" keyword-" +"only argument disabling known insecure and blocked algorithms `" +msgstr "" +":mod:`hashlib`: :ref:`所有构造器都接受一个 \"usedforsecurity\" 仅限关键字参数以停用已知的不安全和已封禁的算法" +" `" + +#: ../../library/security_warnings.rst:15 +msgid "" +":mod:`http.server` is not suitable for production use, only implementing " +"basic security checks. See the :ref:`security considerations `." +msgstr "" +":mod:`http.server` 不适合生产用途,只实现了基本的安全检查。请参阅 :ref:`安全性考量 `." + +#: ../../library/security_warnings.rst:17 +msgid "" +":mod:`logging`: :ref:`Logging configuration uses eval() `" +msgstr ":mod:`logging`: :ref:`日志记录配置使用了 eval() `" + +#: ../../library/security_warnings.rst:19 +msgid "" +":mod:`multiprocessing`: :ref:`Connection.recv() uses pickle " +"`" +msgstr "" +":mod:`multiprocessing`: :ref:`Connection.recv() 使用了 pickle `" + +#: ../../library/security_warnings.rst:21 +msgid ":mod:`pickle`: :ref:`Restricting globals in pickle `" +msgstr ":mod:`pickle`: :ref:`在 pickle 中限制全局变量 `" + +#: ../../library/security_warnings.rst:22 +msgid "" +":mod:`random` shouldn't be used for security purposes, use :mod:`secrets` " +"instead" +msgstr ":mod:`random` 不应当被用于安全目的,而应改用 :mod:`secrets`" + +#: ../../library/security_warnings.rst:24 +msgid "" +":mod:`shelve`: :ref:`shelve is based on pickle and thus unsuitable for " +"dealing with untrusted sources `" +msgstr "" +":mod:`shelve`: :ref:`shelve 是基于 pickle 的,因此不适合处理不受信任的源 `" + +#: ../../library/security_warnings.rst:26 +msgid ":mod:`ssl`: :ref:`SSL/TLS security considerations `" +msgstr ":mod:`ssl`: :ref:`SSL/TLS 安全事项 `" + +#: ../../library/security_warnings.rst:27 +msgid "" +":mod:`subprocess`: :ref:`Subprocess security considerations `" +msgstr ":mod:`subprocess`: :ref:`子进程安全事项 `" + +#: ../../library/security_warnings.rst:29 +msgid "" +":mod:`tempfile`: :ref:`mktemp is deprecated due to vulnerability to race " +"conditions `" +msgstr "" +":mod:`tempfile`: :ref:`mktemp 由于存在竞争条件缺陷已被弃用 `" + +#: ../../library/security_warnings.rst:31 +msgid ":mod:`xml`: :ref:`XML security `" +msgstr ":mod:`xml`: :ref:`XML 安全事项 `" + +#: ../../library/security_warnings.rst:32 +msgid "" +":mod:`zipfile`: :ref:`maliciously prepared .zip files can cause disk volume " +"exhaustion `" +msgstr "" +":mod:`zipfile`: :ref:`恶意构造的 .zip 文件可能导致硬盘空间耗尽 `" + +#: ../../library/security_warnings.rst:35 +msgid "" +"The :option:`-I` command line option can be used to run Python in isolated " +"mode. When it cannot be used, the :option:`-P` option or the " +":envvar:`PYTHONSAFEPATH` environment variable can be used to not prepend a " +"potentially unsafe path to :data:`sys.path` such as the current directory, " +"the script's directory or an empty string." +msgstr "" +":option:`-I` 命令行选项可被用来在隔离模式下运行 Python。当它无法使用时,可以使用 :option:`-P` 选项或 " +":envvar:`PYTHONSAFEPATH` 环境变量以避免在 :data:`sys.path` " +"中预置一个潜在的不安全路径,如当前目录、脚本的目录或一个空字符串。" + +#: ../../library/security_warnings.rst:3 +msgid "security considerations" +msgstr "安全考量" diff --git a/library/select.po b/library/select.po new file mode 100644 index 0000000000..0ba4d6ffad --- /dev/null +++ b/library/select.po @@ -0,0 +1,1090 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-15 16:52+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/select.rst:2 +msgid ":mod:`!select` --- Waiting for I/O completion" +msgstr ":mod:`!select` --- 等待 I/O 完成" + +#: ../../library/select.rst:9 +msgid "" +"This module provides access to the :c:func:`!select` and :c:func:`!poll` " +"functions available in most operating systems, :c:func:`!devpoll` available " +"on Solaris and derivatives, :c:func:`!epoll` available on Linux 2.5+ and " +":c:func:`!kqueue` available on most BSD. Note that on Windows, it only works" +" for sockets; on other operating systems, it also works for other file types" +" (in particular, on Unix, it works on pipes). It cannot be used on regular " +"files to determine whether a file has grown since it was last read." +msgstr "" +"该模块提供了对 :c:func:`!select` 和 :c:func:`!poll` " +"函数的访问,这在大多数操作系统上都是可用的,:c:func:`!devpoll` 在 Solaris " +"及其衍生系统上可用,:c:func:`!epoll` 在 Linux 2.5+ 上可用,而 :c:func:`!kqueue` 在大多数 BSD " +"上可用。注意在 Windows 上,它仅适用于套接字;在其他操作系统上,它还适用于其他文件类型(特别是在 Unix 上,它还适用于管道)。 " +"它不能被用在常规文件上确定一个文件自其最后一次被读取后大小是否有增长。" + +#: ../../library/select.rst:20 +msgid "" +"The :mod:`selectors` module allows high-level and efficient I/O " +"multiplexing, built upon the :mod:`!select` module primitives. Users are " +"encouraged to use the :mod:`selectors` module instead, unless they want " +"precise control over the OS-level primitives used." +msgstr "" +":mod:`selectors` 模块允许高层级且高效的 I/O 利用,它构建于 :mod:`!select` 模块原语的基础之上。 推荐用户改用 " +":mod:`selectors` 模块,除非用户希望对所用的 OS 层级原语进行精确控制。" + +#: ../../library/select.rst:57 ../../library/select.rst:94 +#: ../../library/select.rst:104 ../../library/select.rst:117 +#: ../../library/select.rst:125 ../../library/select.rst:188 +#: ../../includes/wasm-notavail.rst:3 +msgid "Availability" +msgstr "Availability" + +#: ../../includes/wasm-notavail.rst:5 +msgid "" +"This module does not work or is not available on WebAssembly. See " +":ref:`wasm-availability` for more information." +msgstr "此模块在 WebAssembly 平台上无效或不可用。请参阅 :ref:`wasm-availability` 了解详情。" + +#: ../../library/select.rst:27 +msgid "The module defines the following:" +msgstr "该模块定义以下内容:" + +#: ../../library/select.rst:32 +msgid "A deprecated alias of :exc:`OSError`." +msgstr "一个被弃用的 :exc:`OSError` 的别名。" + +#: ../../library/select.rst:34 +msgid "Following :pep:`3151`, this class was made an alias of :exc:`OSError`." +msgstr "根据 :pep:`3151`,这个类是 :exc:`OSError` 的别名。" + +#: ../../library/select.rst:40 +msgid "" +"Returns a ``/dev/poll`` polling object; see section :ref:`devpoll-objects` " +"below for the methods supported by devpoll objects." +msgstr "" + +#: ../../library/select.rst:44 +msgid "" +":c:func:`!devpoll` objects are linked to the number of file descriptors " +"allowed at the time of instantiation. If your program reduces this value, " +":c:func:`!devpoll` will fail. If your program increases this value, " +":c:func:`!devpoll` may return an incomplete list of active file descriptors." +msgstr "" +":c:func:`!devpoll` 对象与实例化时允许的文件描述符数量相关联。如果你的程序减少该值,:c:func:`!devpoll` 将会失败。 " +"如果你的程序增加该值,:c:func:`!devpoll` 可能会返回不完整的活动文件描述符列表。" + +#: ../../library/select.rst:50 ../../library/select.rst:81 +#: ../../library/select.rst:112 +msgid "The new file descriptor is :ref:`non-inheritable `." +msgstr "新的文件描述符是 :ref:`不可继承的 `。" + +#: ../../library/select.rst:54 ../../library/select.rst:114 +msgid "The new file descriptor is now non-inheritable." +msgstr "新的文件描述符现在是不可继承的。" + +#: ../../library/select.rst:61 +msgid "" +"Return an edge polling object, which can be used as Edge or Level Triggered " +"interface for I/O events." +msgstr "" + +#: ../../library/select.rst:65 +msgid "" +"*sizehint* informs epoll about the expected number of events to be " +"registered. It must be positive, or ``-1`` to use the default. It is only " +"used on older systems where :c:func:`!epoll_create1` is not available; " +"otherwise it has no effect (though its value is still checked)." +msgstr "" +"*sizehint* 通知 epoll 预计要注册的事件数量。该值必须为正数,或为 ``-1`` 以使用默认值。它仅在 " +":c:func:`!epoll_create1` 不可用的旧系统上会被使用,在其他情况下它没有任何作用(尽管仍会检查其值)。" + +#: ../../library/select.rst:70 +msgid "" +"*flags* is deprecated and completely ignored. However, when supplied, its " +"value must be ``0`` or ``select.EPOLL_CLOEXEC``, otherwise ``OSError`` is " +"raised." +msgstr "" +"*flags* 已经弃用且完全被忽略。但是,如果提供该值,则它必须是 ``0`` 或 ``select.EPOLL_CLOEXEC``,否则会抛出 " +"``OSError`` 异常。" + +#: ../../library/select.rst:74 +msgid "" +"See the :ref:`epoll-objects` section below for the methods supported by " +"epolling objects." +msgstr "请参阅下方 :ref:`epoll-objects` 获取 epoll 对象所支持的方法。" + +#: ../../library/select.rst:77 +msgid "" +"``epoll`` objects support the context management protocol: when used in a " +":keyword:`with` statement, the new file descriptor is automatically closed " +"at the end of the block." +msgstr "" +"``epoll`` 对象支持上下文管理器:当在 :keyword:`with` 语句中使用时,新建的文件描述符会在运行至语句块结束时自动关闭。" + +#: ../../library/select.rst:83 +msgid "Added the *flags* parameter." +msgstr "增加了 *flags* 参数。" + +#: ../../library/select.rst:86 +msgid "" +"Support for the :keyword:`with` statement was added. The new file descriptor" +" is now non-inheritable." +msgstr "增加了对 :keyword:`with` 语句的支持。新的文件描述符现在是不可继承的。" + +#: ../../library/select.rst:90 +msgid "" +"The *flags* parameter. ``select.EPOLL_CLOEXEC`` is used by default now. Use" +" :func:`os.set_inheritable` to make the file descriptor inheritable." +msgstr "" +"*flags* 参数。现在默认采用 ``select.EPOLL_CLOEXEC`` 标志。使用 :func:`os.set_inheritable` " +"来让文件描述符可继承。" + +#: ../../library/select.rst:99 +msgid "" +"Returns a polling object, which supports registering and unregistering file " +"descriptors, and then polling them for I/O events; see section :ref:`poll-" +"objects` below for the methods supported by polling objects." +msgstr "" + +#: ../../library/select.rst:109 +msgid "" +"Returns a kernel queue object; see section :ref:`kqueue-objects` below for " +"the methods supported by kqueue objects." +msgstr "" + +#: ../../library/select.rst:122 +msgid "" +"Returns a kernel event object; see section :ref:`kevent-objects` below for " +"the methods supported by kevent objects." +msgstr "" + +#: ../../library/select.rst:130 +msgid "" +"This is a straightforward interface to the Unix :c:func:`!select` system " +"call. The first three arguments are iterables of 'waitable objects': either " +"integers representing file descriptors or objects with a parameterless " +"method named :meth:`~io.IOBase.fileno` returning such an integer:" +msgstr "" +"这是一个明白直观的 Unix :c:func:`!select` 系统调用接口。 " +"前三个参数是产生“可等待对象”的可迭代对象:可以是代表文件描述符的整数,或是带有名为 :meth:`~io.IOBase.fileno` " +"的返回这样的整数的无形参方法的对象:" + +#: ../../library/select.rst:135 +msgid "*rlist*: wait until ready for reading" +msgstr "*rlist*:等待,直到可以开始读取" + +#: ../../library/select.rst:136 +msgid "*wlist*: wait until ready for writing" +msgstr "*wlist*:等待,直到可以开始写入" + +#: ../../library/select.rst:137 +msgid "" +"*xlist*: wait for an \"exceptional condition\" (see the manual page for what" +" your system considers such a condition)" +msgstr "*xlist*:等待“异常情况”(请参阅当前系统的手册,以获取哪些情况称为异常情况)" + +#: ../../library/select.rst:140 +msgid "" +"Empty iterables are allowed, but acceptance of three empty iterables is " +"platform-dependent. (It is known to work on Unix but not on Windows.) The " +"optional *timeout* argument specifies a time-out as a floating-point number " +"in seconds. When the *timeout* argument is omitted or ``None``, the function" +" blocks until at least one file descriptor is ready. A time-out value of " +"zero specifies a poll and never blocks." +msgstr "" +"允许空的可迭代对象,但是否接受三个空的可迭代对象则取决于具体平台。 (已知在 Unix 上可以但在 Windows 上不可以)。可选的 " +"*timeout* 参数以一个浮点数字表示超时秒数。当 *timeout* 参数被省略或为 ``None`` " +"时,该函数将阻塞直到至少有一个文件描述符准备就绪。超时值为零表示执行轮询且永不阻塞。" + +#: ../../library/select.rst:148 +msgid "" +"The return value is a triple of lists of objects that are ready: subsets of " +"the first three arguments. When the time-out is reached without a file " +"descriptor becoming ready, three empty lists are returned." +msgstr "返回值是三个列表,包含已就绪对象,返回的三个列表是前三个参数的子集。当超时时间已到且没有文件描述符就绪时,返回三个空列表。" + +#: ../../library/select.rst:156 +msgid "" +"Among the acceptable object types in the iterables are Python :term:`file " +"objects ` (e.g. ``sys.stdin``, or objects returned by " +":func:`open` or :func:`os.popen`), socket objects returned by " +":func:`socket.socket`. You may also define a :dfn:`wrapper` class yourself," +" as long as it has an appropriate :meth:`~io.IOBase.fileno` method (that " +"really returns a file descriptor, not just a random integer)." +msgstr "" +"可迭代对象中可接受的对象类型有 Python :term:`文件对象 ` (例如 ``sys.stdin`` 以及 " +":func:`open` 或 :func:`os.popen` 所返回的对象),由 :func:`socket.socket` 返回的套接字对象等。 " +"你也可以自定义一个 :dfn:`wrapper` 类,只要它具有适当的 :meth:`~io.IOBase.fileno` " +"方法(该方法要确实返回一个文件描述符,而不能只是一个随机整数)。" + +#: ../../library/select.rst:167 +msgid "" +"File objects on Windows are not acceptable, but sockets are. On Windows, " +"the underlying :c:func:`!select` function is provided by the WinSock " +"library, and does not handle file descriptors that don't originate from " +"WinSock." +msgstr "" +"在 Windows 上不接受文件对象,但可以接受套接字。在 Windows 上,底层的 :c:func:`!select` 函数由 WinSock " +"库提供,且不会处理不是源自 WinSock 的文件描述符。" + +#: ../../library/select.rst:172 ../../library/select.rst:278 +#: ../../library/select.rst:384 ../../library/select.rst:472 +#: ../../library/select.rst:513 +msgid "" +"The function is now retried with a recomputed timeout when interrupted by a " +"signal, except if the signal handler raises an exception (see :pep:`475` for" +" the rationale), instead of raising :exc:`InterruptedError`." +msgstr "" +"现在,当本函数被信号中断时,重试超时将从头开始计时,不会抛出 :exc:`InterruptedError` 异常。除非信号处理程序抛出异常 " +"(相关原理请参阅 :pep:`475`)。" + +#: ../../library/select.rst:181 +msgid "" +"The minimum number of bytes which can be written without blocking to a pipe " +"when the pipe has been reported as ready for writing by " +":func:`~select.select`, :func:`!poll` or another interface in this module. " +"This doesn't apply to other kinds of file-like objects such as sockets." +msgstr "" + +#: ../../library/select.rst:186 +msgid "This value is guaranteed by POSIX to be at least 512." +msgstr "POSIX 上须保证该值不小于 512。" + +#: ../../library/select.rst:196 +msgid "``/dev/poll`` polling objects" +msgstr "" + +#: ../../library/select.rst:198 +msgid "" +"Solaris and derivatives have ``/dev/poll``. While :c:func:`!select` is *O*\\" +" (*highest file descriptor*) and :c:func:`!poll` is *O*\\ (*number of file " +"descriptors*), ``/dev/poll`` is *O*\\ (*active file descriptors*)." +msgstr "" +"Solaris 及其衍生版本具有 ``/dev/poll``。而 :c:func:`!select` 为 *O*\\ (*最高文件描述符*) 并且 " +":c:func:`!poll` 为 *O*\\ (*文件描述符数量*), ``/dev/poll`` 为 *O*\\ (*活动的文件描述符*)。" + +#: ../../library/select.rst:202 +msgid "" +"``/dev/poll`` behaviour is very close to the standard :c:func:`!poll` " +"object." +msgstr "``/dev/poll`` 的行为非常接近标准 :c:func:`!poll` 对象。" + +#: ../../library/select.rst:208 +msgid "Close the file descriptor of the polling object." +msgstr "关闭轮询对象的文件描述符。" + +#: ../../library/select.rst:215 +msgid "``True`` if the polling object is closed." +msgstr "如果轮询对象已关闭,则返回 ``True``。" + +#: ../../library/select.rst:222 +msgid "Return the file descriptor number of the polling object." +msgstr "返回轮询对象的文件描述符对应的数字。" + +#: ../../library/select.rst:229 ../../library/select.rst:407 +msgid "" +"Register a file descriptor with the polling object. Future calls to the " +":meth:`poll` method will then check whether the file descriptor has any " +"pending I/O events. *fd* can be either an integer, or an object with a " +":meth:`~io.IOBase.fileno` method that returns an integer. File objects " +"implement :meth:`!fileno`, so they can also be used as the argument." +msgstr "" +"在轮询对象中注册文件描述符。这样,将来调用 :meth:`poll` 方法时将检查文件描述符是否有未处理的 I/O 事件。*fd* " +"可以是整数,也可以是带有 :meth:`~io.IOBase.fileno` 方法的对象(该方法返回一个整数)。文件对象已经实现了 " +":meth:`!fileno`,因此它们也可以用作参数。" + +#: ../../library/select.rst:235 +msgid "" +"*eventmask* is an optional bitmask describing the type of events you want to" +" check for. The constants are the same as with :c:func:`!poll` object. The " +"default value is a combination of the constants :const:`POLLIN`, " +":const:`POLLPRI`, and :const:`POLLOUT`." +msgstr "" + +#: ../../library/select.rst:242 +msgid "" +"Registering a file descriptor that's already registered is not an error, but" +" the result is undefined. The appropriate action is to unregister or modify " +"it first. This is an important difference compared with :c:func:`!poll`." +msgstr "注册已注册的文件描述符不会报错,但结果是未定义的。适当的做法是先注销或修改它。这是与 :c:func:`!poll` 的一个重要区别。" + +#: ../../library/select.rst:250 +msgid "" +"This method does an :meth:`unregister` followed by a :meth:`register`. It is" +" (a bit) more efficient than doing the same explicitly." +msgstr "" + +#: ../../library/select.rst:257 ../../library/select.rst:451 +msgid "" +"Remove a file descriptor being tracked by a polling object. Just like the " +":meth:`register` method, *fd* can be an integer or an object with a " +":meth:`~io.IOBase.fileno` method that returns an integer." +msgstr "" +"删除轮询对象正在跟踪的某个文件描述符。与 :meth:`register` 方法类似,*fd* 可以是整数,也可以是带有 " +":meth:`~io.IOBase.fileno` 方法的对象(该方法返回一个整数)。" + +#: ../../library/select.rst:261 +msgid "" +"Attempting to remove a file descriptor that was never registered is safely " +"ignored." +msgstr "尝试删除从未注册过的文件描述符将被安全地忽略。" + +#: ../../library/select.rst:267 +msgid "" +"Polls the set of registered file descriptors, and returns a possibly empty " +"list containing ``(fd, event)`` 2-tuples for the descriptors that have " +"events or errors to report. *fd* is the file descriptor, and *event* is a " +"bitmask with bits set for the reported events for that descriptor --- " +":const:`POLLIN` for waiting input, :const:`POLLOUT` to indicate that the " +"descriptor can be written to, and so forth. An empty list indicates that the" +" call timed out and no file descriptors had any events to report. If " +"*timeout* is given, it specifies the length of time in milliseconds which " +"the system will wait for events before returning. If *timeout* is omitted, " +"-1, or :const:`None`, the call will block until there is an event for this " +"poll object." +msgstr "" +"轮询已注册的文件描述符的集合,并返回一个列表,列表可能为空,也可能有多个 ``(fd, event)`` 2 元组,其中包含了要报告事件或错误的描述符。" +" *fd* 是文件描述符,*event* 是一个位掩码,表示该描述符所报告的事件 --- :const:`POLLIN` " +"表示等待输入,:const:`POLLOUT` 表示该描述符可以写入,依此类推。空列表表示调用超时,没有任何文件描述符报告事件。如果指定了 " +"*timeout*,它将指定系统等待事件时,等待多长时间后返回(以毫秒为单位)。如果 *timeout* 被省略、为 -1 或为 " +":const:`None`,则本调用将阻塞,直到轮询对象发生事件为止。" + +#: ../../library/select.rst:288 +msgid "Edge and level trigger polling (epoll) objects" +msgstr "" + +#: ../../library/select.rst:290 +msgid "https://linux.die.net/man/4/epoll" +msgstr "https://linux.die.net/man/4/epoll" + +#: ../../library/select.rst:292 +msgid "The *eventmask* is a bit mask using the following constants:" +msgstr "" + +#: ../../library/select.rst:295 ../../library/select.rst:419 +#: ../../library/select.rst:539 ../../library/select.rst:568 +#: ../../library/select.rst:599 ../../library/select.rst:607 +#: ../../library/select.rst:627 ../../library/select.rst:650 +msgid "Constant" +msgstr "常量" + +#: ../../library/select.rst:295 ../../library/select.rst:419 +#: ../../library/select.rst:539 ../../library/select.rst:568 +#: ../../library/select.rst:599 ../../library/select.rst:607 +#: ../../library/select.rst:627 ../../library/select.rst:650 +msgid "Meaning" +msgstr "含意" + +#: ../../library/select.rst:297 +msgid ":const:`EPOLLIN`" +msgstr ":const:`EPOLLIN`" + +#: ../../library/select.rst:297 +msgid "Available for read." +msgstr "" + +#: ../../library/select.rst:299 +msgid ":const:`EPOLLOUT`" +msgstr ":const:`EPOLLOUT`" + +#: ../../library/select.rst:299 +msgid "Available for write." +msgstr "" + +#: ../../library/select.rst:301 +msgid ":const:`EPOLLPRI`" +msgstr ":const:`EPOLLPRI`" + +#: ../../library/select.rst:301 +msgid "Urgent data for read." +msgstr "" + +#: ../../library/select.rst:303 +msgid ":const:`EPOLLERR`" +msgstr ":const:`EPOLLERR`" + +#: ../../library/select.rst:303 +msgid "Error condition happened on the associated fd." +msgstr "" + +#: ../../library/select.rst:305 +msgid ":const:`EPOLLHUP`" +msgstr ":const:`EPOLLHUP`" + +#: ../../library/select.rst:305 +msgid "Hang up happened on the associated fd." +msgstr "" + +#: ../../library/select.rst:307 +msgid ":const:`EPOLLET`" +msgstr ":const:`EPOLLET`" + +#: ../../library/select.rst:307 +msgid "Set Edge Trigger behavior, the default is Level Trigger behavior." +msgstr "" + +#: ../../library/select.rst:310 +msgid ":const:`EPOLLONESHOT`" +msgstr ":const:`EPOLLONESHOT`" + +#: ../../library/select.rst:310 +msgid "" +"Set one-shot behavior. After one event is pulled out, the fd is internally " +"disabled." +msgstr "" + +#: ../../library/select.rst:313 +msgid ":const:`EPOLLEXCLUSIVE`" +msgstr ":const:`EPOLLEXCLUSIVE`" + +#: ../../library/select.rst:313 +msgid "" +"Wake only one epoll object when the associated fd has an event. The default " +"(if this flag is not set) is to wake all epoll objects polling on an fd." +msgstr "" + +#: ../../library/select.rst:318 +msgid ":const:`EPOLLRDHUP`" +msgstr ":const:`EPOLLRDHUP`" + +#: ../../library/select.rst:318 +msgid "" +"Stream socket peer closed connection or shut down writing half of " +"connection." +msgstr "流套接字的对侧关闭了连接或关闭了连接的写入方向。" + +#: ../../library/select.rst:321 +msgid ":const:`EPOLLRDNORM`" +msgstr ":const:`EPOLLRDNORM`" + +#: ../../library/select.rst:321 +msgid "Equivalent to :const:`EPOLLIN`" +msgstr "等同于 :const:`EPOLLIN`" + +#: ../../library/select.rst:323 +msgid ":const:`EPOLLRDBAND`" +msgstr ":const:`EPOLLRDBAND`" + +#: ../../library/select.rst:323 +msgid "Priority data band can be read." +msgstr "可以读取优先数据带。" + +#: ../../library/select.rst:325 +msgid ":const:`EPOLLWRNORM`" +msgstr ":const:`EPOLLWRNORM`" + +#: ../../library/select.rst:325 +msgid "Equivalent to :const:`EPOLLOUT`." +msgstr "" + +#: ../../library/select.rst:327 +msgid ":const:`EPOLLWRBAND`" +msgstr ":const:`EPOLLWRBAND`" + +#: ../../library/select.rst:327 +msgid "Priority data may be written." +msgstr "可以写入优先级数据。" + +#: ../../library/select.rst:329 +msgid ":const:`EPOLLMSG`" +msgstr ":const:`EPOLLMSG`" + +#: ../../library/select.rst:329 +msgid "Ignored." +msgstr "忽略" + +#: ../../library/select.rst:331 +msgid ":const:`EPOLLWAKEUP`" +msgstr ":const:`EPOLLWAKEUP`" + +#: ../../library/select.rst:331 +msgid "Prevents sleep during event waiting." +msgstr "防止在事件等待期间休眠。" + +#: ../../library/select.rst:334 +msgid "" +":const:`EPOLLEXCLUSIVE` was added. It's only supported by Linux Kernel 4.5 " +"or later." +msgstr "增加了 :const:`EPOLLEXCLUSIVE`。仅支持 Linux Kernel 4.5 或更高版本。" + +#: ../../library/select.rst:338 +msgid "" +":const:`EPOLLWAKEUP` was added. It's only supported by Linux Kernel 3.5 or " +"later." +msgstr "增加了 :const:`EPOLLWAKEUP`。仅受 Linux 3.5 或更新的内核支持。" + +#: ../../library/select.rst:344 +msgid "Close the control file descriptor of the epoll object." +msgstr "关闭用于控制 epoll 对象的文件描述符。" + +#: ../../library/select.rst:349 +msgid "``True`` if the epoll object is closed." +msgstr "如果 epoll 对象已关闭,则返回 ``True``。" + +#: ../../library/select.rst:354 ../../library/select.rst:496 +msgid "Return the file descriptor number of the control fd." +msgstr "返回文件描述符对应的数字,该描述符用于控制 epoll 对象。" + +#: ../../library/select.rst:359 +msgid "Create an epoll object from a given file descriptor." +msgstr "根据给定的文件描述符创建 epoll 对象。" + +#: ../../library/select.rst:364 +msgid "Register a file descriptor *fd* with the epoll object." +msgstr "" + +#: ../../library/select.rst:369 +msgid "Modify a registered file descriptor *fd*." +msgstr "" + +#: ../../library/select.rst:374 +msgid "Remove a registered file descriptor from the epoll object." +msgstr "从 epoll 对象中删除一个已注册的文件描述符。" + +#: ../../library/select.rst:376 +msgid "The method no longer ignores the :data:`~errno.EBADF` error." +msgstr "此方法不会再忽略 :data:`~errno.EBADF` 错误。" + +#: ../../library/select.rst:382 +msgid "Wait for events. timeout in seconds (float)" +msgstr "等待事件发生,timeout 是浮点数,单位为秒。" + +#: ../../library/select.rst:394 +msgid "Polling objects" +msgstr "" + +#: ../../library/select.rst:396 +msgid "" +"The :c:func:`!poll` system call, supported on most Unix systems, provides " +"better scalability for network servers that service many, many clients at " +"the same time. :c:func:`!poll` scales better because the system call only " +"requires listing the file descriptors of interest, while :c:func:`!select` " +"builds a bitmap, turns on bits for the fds of interest, and then afterward " +"the whole bitmap has to be linearly scanned again. :c:func:`!select` is " +"*O*\\ (*highest file descriptor*), while :c:func:`!poll` is *O*\\ (*number " +"of file descriptors*)." +msgstr "" +"大多数 Unix 系统都支持 :c:func:`!poll` 系统调用,它为网络服务器提供了更好的可伸缩性,可以同时为大量客户端提供服务。 " +":c:func:`!poll` 的可伸缩性更好是因为该系统只须列出要关注的文件描述符,而 :c:func:`!select` " +"则会构建一个位映射表,打开这个要关注的描述符所对应的比特位,然后再次线性扫描整个位映射表。 :c:func:`!select` 的复杂度为 *O*\\ " +"(*最高文件描述符*),而 :c:func:`!poll` 则为 *O*\\ (*文件描述符的数量*)。" + +#: ../../library/select.rst:413 +msgid "" +"*eventmask* is an optional bitmask describing the type of events you want to" +" check for, and can be a combination of the constants :const:`POLLIN`, " +":const:`POLLPRI`, and :const:`POLLOUT`, described in the table below. If " +"not specified, the default value used will check for all 3 types of events." +msgstr "" +"*eventmask* 是可选的位掩码,用于指定要检查的事件类型,它可以是常量 :const:`POLLIN`、:const:`POLLPRI` 和 " +":const:`POLLOUT` 的组合,如下表所述。如果未指定本参数,默认将会检查所有 3 种类型的事件。" + +#: ../../library/select.rst:421 +msgid ":const:`POLLIN`" +msgstr ":const:`POLLIN`" + +#: ../../library/select.rst:421 +msgid "There is data to read." +msgstr "" + +#: ../../library/select.rst:423 +msgid ":const:`POLLPRI`" +msgstr ":const:`POLLPRI`" + +#: ../../library/select.rst:423 +msgid "There is urgent data to read." +msgstr "" + +#: ../../library/select.rst:425 +msgid ":const:`POLLOUT`" +msgstr ":const:`POLLOUT`" + +#: ../../library/select.rst:425 +msgid "Ready for output: writing will not block." +msgstr "" + +#: ../../library/select.rst:427 +msgid ":const:`POLLERR`" +msgstr ":const:`POLLERR`" + +#: ../../library/select.rst:427 +msgid "Error condition of some sort." +msgstr "" + +#: ../../library/select.rst:429 +msgid ":const:`POLLHUP`" +msgstr ":const:`POLLHUP`" + +#: ../../library/select.rst:429 +msgid "Hung up." +msgstr "" + +#: ../../library/select.rst:431 +msgid ":const:`POLLRDHUP`" +msgstr ":const:`POLLRDHUP`" + +#: ../../library/select.rst:431 +msgid "" +"Stream socket peer closed connection, or shut down writing half of " +"connection." +msgstr "" + +#: ../../library/select.rst:434 +msgid ":const:`POLLNVAL`" +msgstr ":const:`POLLNVAL`" + +#: ../../library/select.rst:434 +msgid "Invalid request: descriptor not open." +msgstr "" + +#: ../../library/select.rst:437 +msgid "" +"Registering a file descriptor that's already registered is not an error, and" +" has the same effect as registering the descriptor exactly once." +msgstr "注册已注册过的文件描述符不会报错,且等同于只注册一次该描述符。" + +#: ../../library/select.rst:443 +msgid "" +"Modifies an already registered fd. This has the same effect as " +"``register(fd, eventmask)``. Attempting to modify a file descriptor that " +"was never registered causes an :exc:`OSError` exception with errno " +":const:`ENOENT` to be raised." +msgstr "" +"修改一个已注册的文件描述符,等同于 ``register(fd, eventmask)``。尝试修改未注册的文件描述符会抛出 " +":exc:`OSError` 异常,错误码为 :const:`ENOENT`。" + +#: ../../library/select.rst:455 +msgid "" +"Attempting to remove a file descriptor that was never registered causes a " +":exc:`KeyError` exception to be raised." +msgstr "尝试删除从未注册过的文件描述符会抛出 :exc:`KeyError` 异常。" + +#: ../../library/select.rst:461 +msgid "" +"Polls the set of registered file descriptors, and returns a possibly empty " +"list containing ``(fd, event)`` 2-tuples for the descriptors that have " +"events or errors to report. *fd* is the file descriptor, and *event* is a " +"bitmask with bits set for the reported events for that descriptor --- " +":const:`POLLIN` for waiting input, :const:`POLLOUT` to indicate that the " +"descriptor can be written to, and so forth. An empty list indicates that the" +" call timed out and no file descriptors had any events to report. If " +"*timeout* is given, it specifies the length of time in milliseconds which " +"the system will wait for events before returning. If *timeout* is omitted, " +"negative, or :const:`None`, the call will block until there is an event for " +"this poll object." +msgstr "" +"轮询已注册的文件描述符的集合,并返回一个列表,列表可能为空,也可能有多个 ``(fd, event)`` 2 元组,其中包含了要报告事件或错误的描述符。" +" *fd* 是文件描述符,*event* 是一个位掩码,表示该描述符所报告的事件 --- :const:`POLLIN` " +"表示等待输入,:const:`POLLOUT` 表示该描述符可以写入,依此类推。空列表表示调用超时,没有任何文件描述符报告事件。如果指定了 " +"*timeout*,它将指定系统等待事件时,等待多长时间后返回(以毫秒为单位)。如果 *timeout* 被省略、为负数或为 " +":const:`None`,则本调用将阻塞,直到轮询对象发生事件为止。" + +#: ../../library/select.rst:482 +msgid "Kqueue objects" +msgstr "" + +#: ../../library/select.rst:486 +msgid "Close the control file descriptor of the kqueue object." +msgstr "关闭用于控制 kqueue 对象的文件描述符。" + +#: ../../library/select.rst:491 +msgid "``True`` if the kqueue object is closed." +msgstr "如果 kqueue 对象已关闭,则返回 ``True``。" + +#: ../../library/select.rst:501 +msgid "Create a kqueue object from a given file descriptor." +msgstr "根据给定的文件描述符创建 kqueue 对象。" + +#: ../../library/select.rst:506 +msgid "Low level interface to kevent" +msgstr "Kevent 的低级接口" + +#: ../../library/select.rst:508 +msgid "changelist must be an iterable of kevent objects or ``None``" +msgstr "changelist 必须是一个可迭代对象,迭代出 kevent 对象,否则置为 ``None``。" + +#: ../../library/select.rst:509 +msgid "max_events must be 0 or a positive integer" +msgstr "max_events 必须是 0 或一个正整数。" + +#: ../../library/select.rst:510 +msgid "" +"timeout in seconds (floats possible); the default is ``None``, to wait " +"forever" +msgstr "timeout 单位为秒(一般为浮点数),默认为 ``None``,即永不超时。" + +#: ../../library/select.rst:523 +msgid "Kevent objects" +msgstr "" + +#: ../../library/select.rst:525 +msgid "https://man.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2" +msgstr "https://man.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2" + +#: ../../library/select.rst:529 +msgid "" +"Value used to identify the event. The interpretation depends on the filter " +"but it's usually the file descriptor. In the constructor ident can either be" +" an int or an object with a :meth:`~io.IOBase.fileno` method. kevent stores " +"the integer internally." +msgstr "" +"用于区分事件的标识值。其解释取决于筛选器,但该值通常是文件描述符。在构造函数中,该标识值可以是整数或带有 " +":meth:`~io.IOBase.fileno` 方法的对象。kevent 在内部存储整数。" + +#: ../../library/select.rst:536 +msgid "Name of the kernel filter." +msgstr "内核筛选器的名称。" + +#: ../../library/select.rst:541 +msgid ":const:`KQ_FILTER_READ`" +msgstr ":const:`KQ_FILTER_READ`" + +#: ../../library/select.rst:541 +msgid "" +"Takes a descriptor and returns whenever there is data available to read." +msgstr "" + +#: ../../library/select.rst:544 +msgid ":const:`KQ_FILTER_WRITE`" +msgstr ":const:`KQ_FILTER_WRITE`" + +#: ../../library/select.rst:544 +msgid "" +"Takes a descriptor and returns whenever there is data available to write." +msgstr "" + +#: ../../library/select.rst:547 +msgid ":const:`KQ_FILTER_AIO`" +msgstr ":const:`KQ_FILTER_AIO`" + +#: ../../library/select.rst:547 +msgid "AIO requests." +msgstr "" + +#: ../../library/select.rst:549 +msgid ":const:`KQ_FILTER_VNODE`" +msgstr ":const:`KQ_FILTER_VNODE`" + +#: ../../library/select.rst:549 +msgid "" +"Returns when one or more of the requested events watched in *fflag* occurs." +msgstr "" + +#: ../../library/select.rst:552 +msgid ":const:`KQ_FILTER_PROC`" +msgstr ":const:`KQ_FILTER_PROC`" + +#: ../../library/select.rst:552 +msgid "Watch for events on a process ID." +msgstr "" + +#: ../../library/select.rst:554 +msgid ":const:`KQ_FILTER_NETDEV`" +msgstr ":const:`KQ_FILTER_NETDEV`" + +#: ../../library/select.rst:554 +msgid "Watch for events on a network device (not available on macOS)." +msgstr "" + +#: ../../library/select.rst:557 +msgid ":const:`KQ_FILTER_SIGNAL`" +msgstr ":const:`KQ_FILTER_SIGNAL`" + +#: ../../library/select.rst:557 +msgid "Returns whenever the watched signal is delivered to the process." +msgstr "" + +#: ../../library/select.rst:560 +msgid ":const:`KQ_FILTER_TIMER`" +msgstr ":const:`KQ_FILTER_TIMER`" + +#: ../../library/select.rst:560 +msgid "Establishes an arbitrary timer." +msgstr "" + +#: ../../library/select.rst:565 +msgid "Filter action." +msgstr "筛选器操作。" + +#: ../../library/select.rst:570 +msgid ":const:`KQ_EV_ADD`" +msgstr ":const:`KQ_EV_ADD`" + +#: ../../library/select.rst:570 +msgid "Adds or modifies an event." +msgstr "" + +#: ../../library/select.rst:572 +msgid ":const:`KQ_EV_DELETE`" +msgstr ":const:`KQ_EV_DELETE`" + +#: ../../library/select.rst:572 +msgid "Removes an event from the queue." +msgstr "" + +#: ../../library/select.rst:574 +msgid ":const:`KQ_EV_ENABLE`" +msgstr ":const:`KQ_EV_ENABLE`" + +#: ../../library/select.rst:574 +msgid "Permits control() to return the event." +msgstr "" + +#: ../../library/select.rst:576 +msgid ":const:`KQ_EV_DISABLE`" +msgstr ":const:`KQ_EV_DISABLE`" + +#: ../../library/select.rst:576 +msgid "Disables event." +msgstr "" + +#: ../../library/select.rst:578 +msgid ":const:`KQ_EV_ONESHOT`" +msgstr ":const:`KQ_EV_ONESHOT`" + +#: ../../library/select.rst:578 +msgid "Removes event after first occurrence." +msgstr "" + +#: ../../library/select.rst:580 +msgid ":const:`KQ_EV_CLEAR`" +msgstr ":const:`KQ_EV_CLEAR`" + +#: ../../library/select.rst:580 +msgid "Reset the state after an event is retrieved." +msgstr "" + +#: ../../library/select.rst:582 +msgid ":const:`KQ_EV_SYSFLAGS`" +msgstr ":const:`KQ_EV_SYSFLAGS`" + +#: ../../library/select.rst:582 ../../library/select.rst:584 +msgid "Internal event." +msgstr "" + +#: ../../library/select.rst:584 +msgid ":const:`KQ_EV_FLAG1`" +msgstr ":const:`KQ_EV_FLAG1`" + +#: ../../library/select.rst:586 +msgid ":const:`KQ_EV_EOF`" +msgstr ":const:`KQ_EV_EOF`" + +#: ../../library/select.rst:586 +msgid "Filter-specific EOF condition." +msgstr "" + +#: ../../library/select.rst:588 +msgid ":const:`KQ_EV_ERROR`" +msgstr ":const:`KQ_EV_ERROR`" + +#: ../../library/select.rst:588 +msgid "See return values." +msgstr "" + +#: ../../library/select.rst:594 +msgid "Filter-specific flags." +msgstr "" + +#: ../../library/select.rst:596 +msgid ":const:`KQ_FILTER_READ` and :const:`KQ_FILTER_WRITE` filter flags:" +msgstr ":const:`KQ_FILTER_READ` 和 :const:`KQ_FILTER_WRITE` 筛选标志:" + +#: ../../library/select.rst:601 +msgid ":const:`KQ_NOTE_LOWAT`" +msgstr ":const:`KQ_NOTE_LOWAT`" + +#: ../../library/select.rst:601 +msgid "Low water mark of a socket buffer." +msgstr "" + +#: ../../library/select.rst:604 +msgid ":const:`KQ_FILTER_VNODE` filter flags:" +msgstr ":const:`KQ_FILTER_VNODE` 筛选标志:" + +#: ../../library/select.rst:609 +msgid ":const:`KQ_NOTE_DELETE`" +msgstr ":const:`KQ_NOTE_DELETE`" + +#: ../../library/select.rst:609 +msgid "*unlink()* was called." +msgstr "" + +#: ../../library/select.rst:611 +msgid ":const:`KQ_NOTE_WRITE`" +msgstr ":const:`KQ_NOTE_WRITE`" + +#: ../../library/select.rst:611 +msgid "A write occurred." +msgstr "" + +#: ../../library/select.rst:613 +msgid ":const:`KQ_NOTE_EXTEND`" +msgstr ":const:`KQ_NOTE_EXTEND`" + +#: ../../library/select.rst:613 +msgid "The file was extended." +msgstr "" + +#: ../../library/select.rst:615 +msgid ":const:`KQ_NOTE_ATTRIB`" +msgstr ":const:`KQ_NOTE_ATTRIB`" + +#: ../../library/select.rst:615 +msgid "An attribute was changed." +msgstr "" + +#: ../../library/select.rst:617 +msgid ":const:`KQ_NOTE_LINK`" +msgstr ":const:`KQ_NOTE_LINK`" + +#: ../../library/select.rst:617 +msgid "The link count has changed." +msgstr "" + +#: ../../library/select.rst:619 +msgid ":const:`KQ_NOTE_RENAME`" +msgstr ":const:`KQ_NOTE_RENAME`" + +#: ../../library/select.rst:619 +msgid "The file was renamed." +msgstr "" + +#: ../../library/select.rst:621 +msgid ":const:`KQ_NOTE_REVOKE`" +msgstr ":const:`KQ_NOTE_REVOKE`" + +#: ../../library/select.rst:621 +msgid "Access to the file was revoked." +msgstr "" + +#: ../../library/select.rst:624 +msgid ":const:`KQ_FILTER_PROC` filter flags:" +msgstr ":const:`KQ_FILTER_PROC` 筛选标志:" + +#: ../../library/select.rst:629 +msgid ":const:`KQ_NOTE_EXIT`" +msgstr ":const:`KQ_NOTE_EXIT`" + +#: ../../library/select.rst:629 +msgid "The process has exited." +msgstr "" + +#: ../../library/select.rst:631 +msgid ":const:`KQ_NOTE_FORK`" +msgstr ":const:`KQ_NOTE_FORK`" + +#: ../../library/select.rst:631 +msgid "The process has called *fork()*." +msgstr "" + +#: ../../library/select.rst:633 +msgid ":const:`KQ_NOTE_EXEC`" +msgstr ":const:`KQ_NOTE_EXEC`" + +#: ../../library/select.rst:633 +msgid "The process has executed a new process." +msgstr "" + +#: ../../library/select.rst:635 +msgid ":const:`KQ_NOTE_PCTRLMASK`" +msgstr ":const:`KQ_NOTE_PCTRLMASK`" + +#: ../../library/select.rst:635 ../../library/select.rst:637 +msgid "Internal filter flag." +msgstr "" + +#: ../../library/select.rst:637 +msgid ":const:`KQ_NOTE_PDATAMASK`" +msgstr ":const:`KQ_NOTE_PDATAMASK`" + +#: ../../library/select.rst:639 +msgid ":const:`KQ_NOTE_TRACK`" +msgstr ":const:`KQ_NOTE_TRACK`" + +#: ../../library/select.rst:639 +msgid "Follow a process across *fork()*." +msgstr "" + +#: ../../library/select.rst:641 +msgid ":const:`KQ_NOTE_CHILD`" +msgstr ":const:`KQ_NOTE_CHILD`" + +#: ../../library/select.rst:641 +msgid "Returned on the child process for *NOTE_TRACK*." +msgstr "" + +#: ../../library/select.rst:644 +msgid ":const:`KQ_NOTE_TRACKERR`" +msgstr ":const:`KQ_NOTE_TRACKERR`" + +#: ../../library/select.rst:644 +msgid "Unable to attach to a child." +msgstr "" + +#: ../../library/select.rst:647 +msgid ":const:`KQ_FILTER_NETDEV` filter flags (not available on macOS):" +msgstr ":const:`KQ_FILTER_NETDEV` 筛选标志(在 macOS 上不可用):" + +#: ../../library/select.rst:652 +msgid ":const:`KQ_NOTE_LINKUP`" +msgstr ":const:`KQ_NOTE_LINKUP`" + +#: ../../library/select.rst:652 +msgid "Link is up." +msgstr "" + +#: ../../library/select.rst:654 +msgid ":const:`KQ_NOTE_LINKDOWN`" +msgstr ":const:`KQ_NOTE_LINKDOWN`" + +#: ../../library/select.rst:654 +msgid "Link is down." +msgstr "" + +#: ../../library/select.rst:656 +msgid ":const:`KQ_NOTE_LINKINV`" +msgstr ":const:`KQ_NOTE_LINKINV`" + +#: ../../library/select.rst:656 +msgid "Link state is invalid." +msgstr "" + +#: ../../library/select.rst:662 +msgid "Filter-specific data." +msgstr "" + +#: ../../library/select.rst:667 +msgid "User-defined value." +msgstr "" + +#: ../../library/select.rst:152 +msgid "socket() (in module socket)" +msgstr "socket() (在 socket 模块中)" + +#: ../../library/select.rst:152 +msgid "popen() (in module os)" +msgstr "popen() (在 os 模块中)" + +#: ../../library/select.rst:165 +msgid "WinSock" +msgstr "WinSock" diff --git a/library/selectors.po b/library/selectors.po new file mode 100644 index 0000000000..2d09109529 --- /dev/null +++ b/library/selectors.po @@ -0,0 +1,447 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/selectors.rst:2 +msgid ":mod:`!selectors` --- High-level I/O multiplexing" +msgstr ":mod:`!selectors` --- 高层级 I/O 复用" + +#: ../../library/selectors.rst:9 +msgid "**Source code:** :source:`Lib/selectors.py`" +msgstr "**源码:** :source:`Lib/selectors.py`" + +#: ../../library/selectors.rst:14 +msgid "Introduction" +msgstr "概述" + +#: ../../library/selectors.rst:16 +msgid "" +"This module allows high-level and efficient I/O multiplexing, built upon the" +" :mod:`select` module primitives. Users are encouraged to use this module " +"instead, unless they want precise control over the OS-level primitives used." +msgstr "" +"此模块允许高层级且高效率的 I/O 复用,它建立在 :mod:`select` 模块原型的基础之上。推荐用户改用此模块,除非他们希望对所使用的 OS " +"层级原型进行精确控制。" + +#: ../../library/selectors.rst:20 +msgid "" +"It defines a :class:`BaseSelector` abstract base class, along with several " +"concrete implementations (:class:`KqueueSelector`, " +":class:`EpollSelector`...), that can be used to wait for I/O readiness " +"notification on multiple file objects. In the following, \"file object\" " +"refers to any object with a :meth:`~io.IOBase.fileno` method, or a raw file " +"descriptor. See :term:`file object`." +msgstr "" +"它定义了一个 :class:`BaseSelector` 抽象基类,以及多个具体实现 (:class:`KqueueSelector`, " +":class:`EpollSelector`...),它们可被用于在多个文件对象上等待 I/O 就绪通知。在下文中,“文件对象”是指任何具有 " +":meth:`~io.IOBase.fileno` 方法的对象,或是一个原始文件描述符。参见 :term:`file object`。" + +#: ../../library/selectors.rst:26 +msgid "" +":class:`DefaultSelector` is an alias to the most efficient implementation " +"available on the current platform: this should be the default choice for " +"most users." +msgstr ":class:`DefaultSelector` 是一个指向当前平台上可用的最高效实现的别名:这应为大多数用户的默认选择。" + +#: ../../library/selectors.rst:31 +msgid "" +"The type of file objects supported depends on the platform: on Windows, " +"sockets are supported, but not pipes, whereas on Unix, both are supported " +"(some other types may be supported as well, such as fifos or special file " +"devices)." +msgstr "" +"受支持的文件对象类型取决于具体平台:在 Windows 上,支持套接字但不支持管道,而在 Unix 上两者均受支持(某些其他类型也可能受支持,例如 " +"fifo 或特殊文件设备等)。" + +#: ../../library/selectors.rst:38 +msgid ":mod:`select`" +msgstr ":mod:`select`" + +#: ../../library/selectors.rst:39 +msgid "Low-level I/O multiplexing module." +msgstr "低层级的 I/O 多路复用模块。" + +#: ../../includes/wasm-notavail.rst:3 +msgid "Availability" +msgstr "适用范围" + +#: ../../includes/wasm-notavail.rst:5 +msgid "" +"This module does not work or is not available on WebAssembly. See " +":ref:`wasm-availability` for more information." +msgstr "此模块在 WebAssembly 平台上无效或不可用。请参阅 :ref:`wasm-availability` 了解详情。" + +#: ../../library/selectors.rst:44 +msgid "Classes" +msgstr "类" + +#: ../../library/selectors.rst:46 +msgid "Classes hierarchy::" +msgstr "类的层次结构::" + +#: ../../library/selectors.rst:48 +msgid "" +"BaseSelector\n" +"+-- SelectSelector\n" +"+-- PollSelector\n" +"+-- EpollSelector\n" +"+-- DevpollSelector\n" +"+-- KqueueSelector" +msgstr "" +"BaseSelector\n" +"+-- SelectSelector\n" +"+-- PollSelector\n" +"+-- EpollSelector\n" +"+-- DevpollSelector\n" +"+-- KqueueSelector" + +#: ../../library/selectors.rst:56 +msgid "" +"In the following, *events* is a bitwise mask indicating which I/O events " +"should be waited for on a given file object. It can be a combination of the " +"module's constants below:" +msgstr "在下文中,*events* 是一个位掩码,它指明哪些 I/O 事件要在给定的文件对象上执行等待。 它可以是以下模块级常量的组合:" + +#: ../../library/selectors.rst:61 +msgid "Constant" +msgstr "常量" + +#: ../../library/selectors.rst:61 +msgid "Meaning" +msgstr "含义" + +#: ../../library/selectors.rst:63 +msgid "Available for read" +msgstr "可读" + +#: ../../library/selectors.rst:65 +msgid "Available for write" +msgstr "可写" + +#: ../../library/selectors.rst:71 +msgid "" +"A :class:`SelectorKey` is a :class:`~collections.namedtuple` used to " +"associate a file object to its underlying file descriptor, selected event " +"mask and attached data. It is returned by several :class:`BaseSelector` " +"methods." +msgstr "" +":class:`SelectorKey` 是一个 " +":class:`~collections.namedtuple`,用来将文件对象关联到其下层的文件描述符、选定事件掩码和附加数据等。它会被某些 " +":class:`BaseSelector` 方法返回。" + +#: ../../library/selectors.rst:78 +msgid "File object registered." +msgstr "已注册的文件对象。" + +#: ../../library/selectors.rst:82 +msgid "Underlying file descriptor." +msgstr "下层的文件描述符。" + +#: ../../library/selectors.rst:86 +msgid "Events that must be waited for on this file object." +msgstr "必须在此文件对象上被等待的事件。" + +#: ../../library/selectors.rst:90 +msgid "" +"Optional opaque data associated to this file object: for example, this could" +" be used to store a per-client session ID." +msgstr "可选的关联到此文件对象的不透明数据:例如,这可被用来存储各个客户端的会话 ID。" + +#: ../../library/selectors.rst:96 +msgid "" +"A :class:`BaseSelector` is used to wait for I/O event readiness on multiple " +"file objects. It supports file stream registration, unregistration, and a " +"method to wait for I/O events on those streams, with an optional timeout. " +"It's an abstract base class, so cannot be instantiated. Use " +":class:`DefaultSelector` instead, or one of :class:`SelectSelector`, " +":class:`KqueueSelector` etc. if you want to specifically use an " +"implementation, and your platform supports it. :class:`BaseSelector` and its" +" concrete implementations support the :term:`context manager` protocol." +msgstr "" +"一个 :class:`BaseSelector`,用来在多个文件对象上等待 I/O 事件就绪。它支持文件流注册、注销,以及在这些流上等待 I/O " +"事件的方法。它是一个抽象基类,因此不能被实例化。请改用 :class:`DefaultSelector`,或者 " +":class:`SelectSelector`, :class:`KqueueSelector` 等。 " +"如果你想要指明使用某个实现,并且你的平台支持它的话。 :class:`BaseSelector` 及其具体实现支持 :term:`context " +"manager` 协议。" + +#: ../../library/selectors.rst:109 +msgid "Register a file object for selection, monitoring it for I/O events." +msgstr "注册一个用于选择的文件对象,在其上监视 I/O 事件。" + +#: ../../library/selectors.rst:111 +msgid "" +"*fileobj* is the file object to monitor. It may either be an integer file " +"descriptor or an object with a ``fileno()`` method. *events* is a bitwise " +"mask of events to monitor. *data* is an opaque object." +msgstr "" +"*fileobj* 是要监视的文件对象。它可以是整数形式的文件描述符或者具有 ``fileno()`` 方法的对象。 *events* " +"是要监视的事件的位掩码。 *data* 是一个不透明对象。" + +#: ../../library/selectors.rst:116 +msgid "" +"This returns a new :class:`SelectorKey` instance, or raises a " +":exc:`ValueError` in case of invalid event mask or file descriptor, or " +":exc:`KeyError` if the file object is already registered." +msgstr "" +"这将返回一个新的 :class:`SelectorKey` 实例,或在出现无效事件掩码或文件描述符时引发 " +":exc:`ValueError`,或在文件对象已被注册时引发 :exc:`KeyError`。" + +#: ../../library/selectors.rst:123 +msgid "" +"Unregister a file object from selection, removing it from monitoring. A file" +" object shall be unregistered prior to being closed." +msgstr "注销对一个文件对象的选择,移除对它的监视。在文件对象被关闭之前应当先将其注销。" + +#: ../../library/selectors.rst:126 +msgid "*fileobj* must be a file object previously registered." +msgstr "*fileobj* 必须是之前已注册的文件对象。" + +#: ../../library/selectors.rst:128 +msgid "" +"This returns the associated :class:`SelectorKey` instance, or raises a " +":exc:`KeyError` if *fileobj* is not registered. It will raise " +":exc:`ValueError` if *fileobj* is invalid (e.g. it has no ``fileno()`` " +"method or its ``fileno()`` method has an invalid return value)." +msgstr "" +"这将返回已关联的 :class:`SelectorKey` 实例,或者如果 *fileobj* 未注册则会引发 :exc:`KeyError`。如果 " +"*fileobj* 无效(例如它没有 ``fileno()`` 方法或其 ``fileno()`` 方法返回无效值)则会引发 " +":exc:`ValueError`." + +#: ../../library/selectors.rst:135 +msgid "Change a registered file object's monitored events or attached data." +msgstr "更改已注册文件对象所监视的事件或所附带的数据。" + +#: ../../library/selectors.rst:137 +msgid "" +"This is equivalent to ``BaseSelector.unregister(fileobj)`` followed by " +"``BaseSelector.register(fileobj, events, data)``, except that it can be " +"implemented more efficiently." +msgstr "" +"这等价于 ``BaseSelector.unregister(fileobj)`` 加 ``BaseSelector.register(fileobj," +" events, data)``,区别在于它可以被更高效地实现。" + +#: ../../library/selectors.rst:141 +msgid "" +"This returns a new :class:`SelectorKey` instance, or raises a " +":exc:`ValueError` in case of invalid event mask or file descriptor, or " +":exc:`KeyError` if the file object is not registered." +msgstr "" +"这将返回一个新的 :class:`SelectorKey` 实例,或在出现无效事件掩码或文件描述符时引发 " +":exc:`ValueError`,或在文件对象未被注册时引发 :exc:`KeyError`。" + +#: ../../library/selectors.rst:148 +msgid "" +"Wait until some registered file objects become ready, or the timeout " +"expires." +msgstr "等待直到有已注册的文件对象就绪,或是超过时限。" + +#: ../../library/selectors.rst:151 +msgid "" +"If ``timeout > 0``, this specifies the maximum wait time, in seconds. If " +"``timeout <= 0``, the call won't block, and will report the currently ready " +"file objects. If *timeout* is ``None``, the call will block until a " +"monitored file object becomes ready." +msgstr "" +"如果 ``timeout > 0``,这指定以秒数表示的最大等待时间。如果 ``timeout <= " +"0``,调用将不会阻塞,并将报告当前就绪的文件对象。如果 *timeout* 为 ``None``,调用将阻塞直到某个被监视的文件对象就绪。" + +#: ../../library/selectors.rst:157 +msgid "" +"This returns a list of ``(key, events)`` tuples, one for each ready file " +"object." +msgstr "这将返回由 ``(key, events)`` 元组构成的列表,每项各表示一个就绪的文件对象。" + +#: ../../library/selectors.rst:160 +msgid "" +"*key* is the :class:`SelectorKey` instance corresponding to a ready file " +"object. *events* is a bitmask of events ready on this file object." +msgstr "*key* 是对应于就绪文件对象的 :class:`SelectorKey` 实例。 *events* 是在此文件对象上就绪的事件位掩码。" + +#: ../../library/selectors.rst:165 +msgid "" +"This method can return before any file object becomes ready or the timeout " +"has elapsed if the current process receives a signal: in this case, an empty" +" list will be returned." +msgstr "如果当前进程收到一个信号,此方法可在任何文件对象就绪之前或超出时限时返回:在此情况下,将返回一个空列表。" + +#: ../../library/selectors.rst:169 +msgid "" +"The selector is now retried with a recomputed timeout when interrupted by a " +"signal if the signal handler did not raise an exception (see :pep:`475` for " +"the rationale), instead of returning an empty list of events before the " +"timeout." +msgstr "" +"现在当被某个信号中断时,如果信号处理程序没有引发异常,选择器会用重新计算的超时值进行重试(请查看 :pep:`475` " +"了解其理由),而不是在超时之前返回空的事件列表。" + +#: ../../library/selectors.rst:177 +msgid "Close the selector." +msgstr "关闭选择器。" + +#: ../../library/selectors.rst:179 +msgid "" +"This must be called to make sure that any underlying resource is freed. The " +"selector shall not be used once it has been closed." +msgstr "必须调用这个方法以确保下层资源会被释放。选择器被关闭后将不可再使用。" + +#: ../../library/selectors.rst:184 +msgid "Return the key associated with a registered file object." +msgstr "返回关联到某个已注册文件对象的键。" + +#: ../../library/selectors.rst:186 +msgid "" +"This returns the :class:`SelectorKey` instance associated to this file " +"object, or raises :exc:`KeyError` if the file object is not registered." +msgstr "此方法将返回关联到文件对象的 :class:`SelectorKey` 实例,或在文件对象未注册时引发 :exc:`KeyError`。" + +#: ../../library/selectors.rst:192 +msgid "Return a mapping of file objects to selector keys." +msgstr "返回从文件对象到选择器键的映射。" + +#: ../../library/selectors.rst:194 +msgid "" +"This returns a :class:`~collections.abc.Mapping` instance mapping registered" +" file objects to their associated :class:`SelectorKey` instance." +msgstr "" +"这将返回一个将已注册文件对象映射到与其相关联的 :class:`SelectorKey` 实例的 " +":class:`~collections.abc.Mapping` 实例。" + +#: ../../library/selectors.rst:201 +msgid "" +"The default selector class, using the most efficient implementation " +"available on the current platform. This should be the default choice for " +"most users." +msgstr "默认的选择器类,使用当前平台上可用的最高效实现。这应为大多数用户的默认选择。" + +#: ../../library/selectors.rst:208 +msgid ":func:`select.select`-based selector." +msgstr "基于 :func:`select.select` 的选择器。" + +#: ../../library/selectors.rst:213 +msgid ":func:`select.poll`-based selector." +msgstr "基于 :func:`select.poll` 的选择器。" + +#: ../../library/selectors.rst:218 +msgid ":func:`select.epoll`-based selector." +msgstr "基于 :func:`select.epoll` 的选择器。" + +#: ../../library/selectors.rst:222 +msgid "" +"This returns the file descriptor used by the underlying :func:`select.epoll`" +" object." +msgstr "此方法将返回由下层 :func:`select.epoll` 对象所使用的文件描述符。" + +#: ../../library/selectors.rst:227 +msgid ":func:`select.devpoll`-based selector." +msgstr "基于 :func:`select.devpoll` 的选择器。" + +#: ../../library/selectors.rst:231 +msgid "" +"This returns the file descriptor used by the underlying " +":func:`select.devpoll` object." +msgstr "此方法将返回由下层 :func:`select.devpoll` 对象所使用的文件描述符。" + +#: ../../library/selectors.rst:238 +msgid ":func:`select.kqueue`-based selector." +msgstr "基于 :func:`select.kqueue` 的选择器。" + +#: ../../library/selectors.rst:242 +msgid "" +"This returns the file descriptor used by the underlying " +":func:`select.kqueue` object." +msgstr "此方法将返回由下层 :func:`select.kqueue` 对象所使用的文件描述符。" + +#: ../../library/selectors.rst:247 +msgid "Examples" +msgstr "例子" + +#: ../../library/selectors.rst:249 +msgid "Here is a simple echo server implementation::" +msgstr "下面是一个简单的回显服务器实现::" + +#: ../../library/selectors.rst:251 +msgid "" +"import selectors\n" +"import socket\n" +"\n" +"sel = selectors.DefaultSelector()\n" +"\n" +"def accept(sock, mask):\n" +" conn, addr = sock.accept() # Should be ready\n" +" print('accepted', conn, 'from', addr)\n" +" conn.setblocking(False)\n" +" sel.register(conn, selectors.EVENT_READ, read)\n" +"\n" +"def read(conn, mask):\n" +" data = conn.recv(1000) # Should be ready\n" +" if data:\n" +" print('echoing', repr(data), 'to', conn)\n" +" conn.send(data) # Hope it won't block\n" +" else:\n" +" print('closing', conn)\n" +" sel.unregister(conn)\n" +" conn.close()\n" +"\n" +"sock = socket.socket()\n" +"sock.bind(('localhost', 1234))\n" +"sock.listen(100)\n" +"sock.setblocking(False)\n" +"sel.register(sock, selectors.EVENT_READ, accept)\n" +"\n" +"while True:\n" +" events = sel.select()\n" +" for key, mask in events:\n" +" callback = key.data\n" +" callback(key.fileobj, mask)" +msgstr "" +"import selectors\n" +"import socket\n" +"\n" +"sel = selectors.DefaultSelector()\n" +"\n" +"def accept(sock, mask):\n" +" conn, addr = sock.accept() # 应当已就绪\n" +" print('accepted', conn, 'from', addr)\n" +" conn.setblocking(False)\n" +" sel.register(conn, selectors.EVENT_READ, read)\n" +"\n" +"def read(conn, mask):\n" +" data = conn.recv(1000) # 应当已就绪\n" +" if data:\n" +" print('echoing', repr(data), 'to', conn)\n" +" conn.send(data) # 希望不会阻塞\n" +" else:\n" +" print('closing', conn)\n" +" sel.unregister(conn)\n" +" conn.close()\n" +"\n" +"sock = socket.socket()\n" +"sock.bind(('localhost', 1234))\n" +"sock.listen(100)\n" +"sock.setblocking(False)\n" +"sel.register(sock, selectors.EVENT_READ, accept)\n" +"\n" +"while True:\n" +" events = sel.select()\n" +" for key, mask in events:\n" +" callback = key.data\n" +" callback(key.fileobj, mask)" diff --git a/library/shelve.po b/library/shelve.po new file mode 100644 index 0000000000..abe85405d6 --- /dev/null +++ b/library/shelve.po @@ -0,0 +1,446 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/shelve.rst:2 +msgid ":mod:`!shelve` --- Python object persistence" +msgstr ":mod:`!shelve` --- Python 对象持久化" + +#: ../../library/shelve.rst:7 +msgid "**Source code:** :source:`Lib/shelve.py`" +msgstr "**源代码:** :source:`Lib/shelve.py`" + +#: ../../library/shelve.rst:13 +msgid "" +"A \"shelf\" is a persistent, dictionary-like object. The difference with " +"\"dbm\" databases is that the values (not the keys!) in a shelf can be " +"essentially arbitrary Python objects --- anything that the :mod:`pickle` " +"module can handle. This includes most class instances, recursive data types," +" and objects containing lots of shared sub-objects. The keys are ordinary " +"strings." +msgstr "" +"\"Shelf\" 是一种持久化的类似字典的对象。与 \"dbm\" 数据库的区别在于 Shelf 中的值(不是键!)实际上可以为任意 Python " +"对象 --- 即 :mod:`pickle` 模块能够处理的任何东西。这包括大部分类实例、递归数据类型,以及包含大量共享子对象的对象。 " +"键则为普通的字符串。" + +#: ../../library/shelve.rst:23 +msgid "" +"Open a persistent dictionary. The filename specified is the base filename " +"for the underlying database. As a side-effect, an extension may be added to" +" the filename and more than one file may be created. By default, the " +"underlying database file is opened for reading and writing. The optional " +"*flag* parameter has the same interpretation as the *flag* parameter of " +":func:`dbm.open`." +msgstr "" +"打开一个持久化字典。filename 指定下层数据库的基准文件名。作为附带效果,会为 filename 添加一个扩展名并且可能创建更多的文件。 " +"默认情况下,下层数据库会以读写模式打开。可选的 *flag* 形参具有与 :func:`dbm.open` *flag* 形参相同的含义。" + +#: ../../library/shelve.rst:29 +msgid "" +"By default, pickles created with :const:`pickle.DEFAULT_PROTOCOL` are used " +"to serialize values. The version of the pickle protocol can be specified " +"with the *protocol* parameter." +msgstr "" +"在默认情况下,会使用以 :const:`pickle.DEFAULT_PROTOCOL` 创建的 pickle 来序列化值。pickle " +"协议的版本可通过 *protocol* 形参来指定。" + +#: ../../library/shelve.rst:33 +msgid "" +"Because of Python semantics, a shelf cannot know when a mutable persistent-" +"dictionary entry is modified. By default modified objects are written " +"*only* when assigned to the shelf (see :ref:`shelve-example`). If the " +"optional *writeback* parameter is set to ``True``, all entries accessed are " +"also cached in memory, and written back on :meth:`~Shelf.sync` and " +":meth:`~Shelf.close`; this can make it handier to mutate mutable entries in " +"the persistent dictionary, but, if many entries are accessed, it can consume" +" vast amounts of memory for the cache, and it can make the close operation " +"very slow since all accessed entries are written back (there is no way to " +"determine which accessed entries are mutable, nor which ones were actually " +"mutated)." +msgstr "" +"由于 Python 语义的限制,Shelf 对象无法确定一个可变的持久化字典条目在何时被修改。默认情况下 *只有* 在被修改对象再赋值给 shelf " +"时才会写入该对象 (参见 :ref:`shelve-example`)。如果可选的 *writeback* 形参设为 " +"``True``,则所有被访问的条目都将在内存中被缓存,并会在 :meth:`~Shelf.sync` 和 :meth:`~Shelf.close` " +"时被写入;这可以使得对持久化字典中可变条目的修改更方便,但是如果访问的条目很多,这会消耗大量内存作为缓存,并会使得关闭操作变得非常缓慢,因为所有被访问的条目都需要写回到字典(无法确定被访问的条目中哪个是可变的,也无法确定哪个被实际修改了)。" + +#: ../../library/shelve.rst:45 +msgid "" +"By default, :mod:`!shelve` uses :func:`pickle.dumps` and " +":func:`pickle.loads` for serializing and deserializing. This can be changed " +"by supplying *serializer* and *deserializer*, respectively." +msgstr "" + +#: ../../library/shelve.rst:49 +msgid "" +"The *serializer* argument must be a callable which takes an object ``obj`` " +"and the *protocol* as inputs and returns the representation ``obj`` as a " +":term:`bytes-like object`; the *protocol* value may be ignored by the " +"serializer." +msgstr "" + +#: ../../library/shelve.rst:54 +msgid "" +"The *deserializer* argument must be a callable which takes a serialized " +"object given as a :class:`bytes` object and returns the corresponding " +"object." +msgstr "" + +#: ../../library/shelve.rst:57 +msgid "" +"A :exc:`ShelveError` is raised if *serializer* is given but *deserializer* " +"is not, or vice-versa." +msgstr "" + +#: ../../library/shelve.rst:60 ../../library/shelve.rst:184 +msgid "" +":const:`pickle.DEFAULT_PROTOCOL` is now used as the default pickle protocol." +msgstr ":const:`pickle.DEFAULT_PROTOCOL` 现在会被用作默认的 pickle 协议。" + +#: ../../library/shelve.rst:64 +msgid "Accepts :term:`path-like object` for filename." +msgstr "接受 :term:`path-like object` 作为文件名。" + +#: ../../library/shelve.rst:67 +msgid "" +"Accepts custom *serializer* and *deserializer* functions in place of " +":func:`pickle.dumps` and :func:`pickle.loads`." +msgstr "" + +#: ../../library/shelve.rst:73 +msgid "" +"Do not rely on the shelf being closed automatically; always call " +":meth:`~Shelf.close` explicitly when you don't need it any more, or use " +":func:`shelve.open` as a context manager::" +msgstr "" +"请不要依赖于 Shelf 的自动关闭功能;当你不再需要时应当总是显式地调用 :meth:`~Shelf.close`,或者使用 " +":func:`shelve.open` 作为上下文管理器::" + +#: ../../library/shelve.rst:77 +msgid "" +"with shelve.open('spam') as db:\n" +" db['eggs'] = 'eggs'" +msgstr "" +"with shelve.open('spam') as db:\n" +" db['eggs'] = 'eggs'" + +#: ../../library/shelve.rst:84 +msgid "" +"Because the :mod:`!shelve` module is backed by :mod:`pickle`, it is insecure" +" to load a shelf from an untrusted source. Like with pickle, loading a " +"shelf can execute arbitrary code." +msgstr "" +"由于 :mod:`!shelve` 模块需要 :mod:`pickle` 的支持,因此从不受信任的来源载入 shelf 是不安全的。 与 pickle " +"一样,载入 shelf 时可能执行任意代码。" + +#: ../../library/shelve.rst:88 +msgid "" +"Shelf objects support most of the methods and operations supported by " +"dictionaries (except copying, constructors and operators ``|`` and ``|=``)." +" This eases the transition from dictionary based scripts to those requiring" +" persistent storage." +msgstr "" +"Shelf 对象支持字典所支持的大多数方法和运算(除了拷贝、构造器以及 ``|`` 和 ``|=`` 运算符)。 " +"这样就能方便地将基于字典的脚本转化为要求持久化存储的脚本。" + +#: ../../library/shelve.rst:92 +msgid "Two additional methods are supported:" +msgstr "额外支持的两个方法:" + +#: ../../library/shelve.rst:96 +msgid "" +"Write back all entries in the cache if the shelf was opened with *writeback*" +" set to :const:`True`. Also empty the cache and synchronize the persistent " +"dictionary on disk, if feasible. This is called automatically when " +":meth:`reorganize` is called or the shelf is closed with :meth:`close`." +msgstr "" + +#: ../../library/shelve.rst:103 +msgid "" +"Calls :meth:`sync` and attempts to shrink space used on disk by removing " +"empty space resulting from deletions." +msgstr "" + +#: ../../library/shelve.rst:110 +msgid "" +"Synchronize and close the persistent *dict* object. Operations on a closed " +"shelf will fail with a :exc:`ValueError`." +msgstr "同步并关闭持久化 *dict* 对象。对已关闭 Shelf 的操作将失败并引发 :exc:`ValueError`。" + +#: ../../library/shelve.rst:116 +msgid "" +"`Persistent dictionary recipe " +"`_ with widely supported storage formats and having " +"the speed of native dictionaries." +msgstr "" +"`持久化字典方案 `_ 使用了广泛支持的存储格式并具有原生字典的速度。" + +#: ../../library/shelve.rst:122 +msgid "Restrictions" +msgstr "限制" + +#: ../../library/shelve.rst:128 +msgid "" +"The choice of which database package will be used (such as :mod:`dbm.ndbm` " +"or :mod:`dbm.gnu`) depends on which interface is available. Therefore it is" +" not safe to open the database directly using :mod:`dbm`. The database is " +"also (unfortunately) subject to the limitations of :mod:`dbm`, if it is used" +" --- this means that (the pickled representation of) the objects stored in " +"the database should be fairly small, and in rare cases key collisions may " +"cause the database to refuse updates." +msgstr "" +"可选择使用哪种数据库包 (例如 :mod:`dbm.ndbm` 或 :mod:`dbm.gnu`) 取决于支持哪种接口。因此使用 :mod:`dbm` " +"直接打开数据库是不安全的。如果使用了 :mod:`dbm`,数据库同样会(不幸地)受限于它 --- " +"这意味着存储在数据库中的(封存形式的)对象尺寸应当较小,并且在少数情况下键冲突有可能导致数据库拒绝更新。" + +#: ../../library/shelve.rst:136 +msgid "" +"The :mod:`!shelve` module does not support *concurrent* read/write access to" +" shelved objects. (Multiple simultaneous read accesses are safe.) When a " +"program has a shelf open for writing, no other program should have it open " +"for reading or writing. Unix file locking can be used to solve this, but " +"this differs across Unix versions and requires knowledge about the database " +"implementation used." +msgstr "" +":mod:`!shelve` 模块不支持对 Shelf 对象的 *并发* 读/写访问。 (多个同时的读取访问则是安全的。) 当一个程序打开一个 " +"Shelf 对象来写入时,不应再有其他程序打开它来读取或写入。 Unix 文件锁定可被用来解决此问题,但这在不同 Unix " +"版本上会存在差异,并且需要有关所用数据库实现的细节知识。" + +#: ../../library/shelve.rst:143 +msgid "" +"On macOS :mod:`dbm.ndbm` can silently corrupt the database file on updates, " +"which can cause hard crashes when trying to read from the database." +msgstr "在 macOS 上 :mod:`dbm.ndbm` 会在更新时静默地破坏数据库文件,这将导致在尝试读取该数据库时发生硬崩溃。" + +#: ../../library/shelve.rst:146 +msgid "" +":meth:`Shelf.reorganize` may not be available for all database packages and " +"may temporarily increase resource usage (especially disk space) when called." +" Additionally, it will never run automatically and instead needs to be " +"called explicitly." +msgstr "" + +#: ../../library/shelve.rst:155 +msgid "" +"A subclass of :class:`collections.abc.MutableMapping` which stores pickled " +"values in the *dict* object." +msgstr ":class:`collections.abc.MutableMapping` 的一个子类,它会将封存的值保存在 *dict* 对象中。" + +#: ../../library/shelve.rst:158 +msgid "" +"By default, pickles created with :const:`pickle.DEFAULT_PROTOCOL` are used " +"to serialize values. The version of the pickle protocol can be specified " +"with the *protocol* parameter. See the :mod:`pickle` documentation for a " +"discussion of the pickle protocols." +msgstr "" +"在默认情况下,会使用以 :const:`pickle.DEFAULT_PROTOCOL` 创建的 pickle 来序列化值。pickle " +"协议的版本可通过 *protocol* 形参来指定。请参阅 :mod:`pickle` 文档来查看 pickle 协议的相关讨论。" + +#: ../../library/shelve.rst:163 +msgid "" +"If the *writeback* parameter is ``True``, the object will hold a cache of " +"all entries accessed and write them back to the *dict* at sync and close " +"times. This allows natural operations on mutable entries, but can consume " +"much more memory and make sync and close take a long time." +msgstr "" +"如果 *writeback* 形参为 ``True``,对象将为所有访问过的条目保留缓存并在同步和关闭时将它们写回到 *dict*。 " +"这允许对可变的条目执行自然操作,但是会消耗更多内存并让同步和关闭花费更长时间。" + +#: ../../library/shelve.rst:168 +msgid "" +"The *keyencoding* parameter is the encoding used to encode keys before they " +"are used with the underlying dict." +msgstr "*keyencoding* 形参是在键被用于下层字典之前对其进行编码的编码格式。" + +#: ../../library/shelve.rst:171 +msgid "" +"The *serializer* and *deserializer* parameters have the same interpretation " +"as in :func:`~shelve.open`." +msgstr "" + +#: ../../library/shelve.rst:174 +msgid "" +"A :class:`Shelf` object can also be used as a context manager, in which case" +" it will be automatically closed when the :keyword:`with` block ends." +msgstr ":class:`Shelf` 对象还可以被用作上下文管理器,在这种情况下它将在 :keyword:`with` 语句块结束时自动被关闭。" + +#: ../../library/shelve.rst:177 +msgid "" +"Added the *keyencoding* parameter; previously, keys were always encoded in " +"UTF-8." +msgstr "添加了 *keyencoding* 形参;之前,键总是使用 UTF-8 编码。" + +#: ../../library/shelve.rst:181 +msgid "Added context manager support." +msgstr "添加了上下文管理器支持。" + +#: ../../library/shelve.rst:188 ../../library/shelve.rst:207 +#: ../../library/shelve.rst:223 +msgid "Added the *serializer* and *deserializer* parameters." +msgstr "" + +#: ../../library/shelve.rst:196 +msgid "" +"A subclass of :class:`Shelf` which exposes :meth:`!first`, :meth:`!next`, " +":meth:`!previous`, :meth:`!last` and :meth:`!set_location` methods. These " +"are available in the third-party :mod:`!bsddb` module from `pybsddb " +"`_ but not in other database " +"modules. The *dict* object passed to the constructor must support those " +"methods. This is generally accomplished by calling one of " +":func:`!bsddb.hashopen`, :func:`!bsddb.btopen` or :func:`!bsddb.rnopen`. " +"The optional *protocol*, *writeback*, *keyencoding*, *serializer* and " +"*deserializer* parameters have the same interpretation as in " +":func:`~shelve.open`." +msgstr "" + +#: ../../library/shelve.rst:215 +msgid "" +"A subclass of :class:`Shelf` which accepts a *filename* instead of a dict-" +"like object. The underlying file will be opened using :func:`dbm.open`. By" +" default, the file will be created and opened for both read and write. The " +"optional *flag* parameter has the same interpretation as for the " +":func:`.open` function. The optional *protocol*, *writeback*, *serializer* " +"and *deserializer* parameters have the same interpretation as in " +":func:`~shelve.open`." +msgstr "" + +#: ../../library/shelve.rst:230 +msgid "Example" +msgstr "示例" + +#: ../../library/shelve.rst:232 +msgid "" +"To summarize the interface (``key`` is a string, ``data`` is an arbitrary " +"object)::" +msgstr "对接口的总结如下 (``key`` 为字符串,``data`` 为任意对象)::" + +#: ../../library/shelve.rst:235 +msgid "" +"import shelve\n" +"\n" +"d = shelve.open(filename) # open -- file may get suffix added by low-level\n" +" # library\n" +"\n" +"d[key] = data # store data at key (overwrites old data if\n" +" # using an existing key)\n" +"data = d[key] # retrieve a COPY of data at key (raise KeyError\n" +" # if no such key)\n" +"del d[key] # delete data stored at key (raises KeyError\n" +" # if no such key)\n" +"\n" +"flag = key in d # true if the key exists\n" +"klist = list(d.keys()) # a list of all existing keys (slow!)\n" +"\n" +"# as d was opened WITHOUT writeback=True, beware:\n" +"d['xx'] = [0, 1, 2] # this works as expected, but...\n" +"d['xx'].append(3) # *this doesn't!* -- d['xx'] is STILL [0, 1, 2]!\n" +"\n" +"# having opened d without writeback=True, you need to code carefully:\n" +"temp = d['xx'] # extracts the copy\n" +"temp.append(5) # mutates the copy\n" +"d['xx'] = temp # stores the copy right back, to persist it\n" +"\n" +"# or, d=shelve.open(filename,writeback=True) would let you just code\n" +"# d['xx'].append(5) and have it work as expected, BUT it would also\n" +"# consume more memory and make the d.close() operation slower.\n" +"\n" +"d.close() # close it" +msgstr "" +"import shelve\n" +"\n" +"d = shelve.open(filename) # 打开 -- 文件可能带有低层级库\n" +" # 所添加的后缀\n" +"\n" +"d[key] = data # 将 data 存储到 key 位置 (如果使用现有的 key\n" +" # 则会覆盖旧数据)\n" +"data = d[key] # 获取 key 位置上 data 的拷贝 (如果 key 不存在\n" +" # 则会引发 KeyError)\n" +"del d[key] # 删除 key 位置上的 data (如果 key 不存在\n" +" # 则会引发 KeyError)\n" +"\n" +"flag = key in d # 如果 key 存在则为真值\n" +"klist = list(d.keys()) # 由全部现有 key 组成的列表 (会很慢!)\n" +"\n" +"# 由于 d 打开时未设置 writeback=True,需要注意:\n" +"d['xx'] = [0, 1, 2] # 这将符合预期,但是...\n" +"d['xx'].append(3) # *这将不符合预期!* -- d['xx'] 仍为 [0, 1, 2]!\n" +"\n" +"# 由于 d 打开时未设置 writeback=True,你需要小心地编码:\n" +"temp = d['xx'] # 提取副本\n" +"temp.append(5) # 修改副本\n" +"d['xx'] = temp # 将副本存储回去,以使其持久化\n" +"\n" +"# 或者,d=shelve.open(filename,writeback=True) 将允许你\n" +"# 编码 d['xx'].append(5) 并使其符合预期,但是它也会\n" +"# 消耗更多内存并使 d.close() 操作变慢。\n" +"\n" +"d.close() # 关闭它" + +#: ../../library/shelve.rst:267 +msgid "Exceptions" +msgstr "" + +#: ../../library/shelve.rst:271 +msgid "" +"Exception raised when one of the arguments *deserializer* and *serializer* " +"is missing in the :func:`~shelve.open`, :class:`Shelf`, :class:`BsdDbShelf` " +"and :class:`DbfilenameShelf`." +msgstr "" + +#: ../../library/shelve.rst:275 +msgid "The *deserializer* and *serializer* arguments must be given together." +msgstr "" + +#: ../../library/shelve.rst:282 +msgid "Module :mod:`dbm`" +msgstr "模块 :mod:`dbm`" + +#: ../../library/shelve.rst:283 +msgid "Generic interface to ``dbm``-style databases." +msgstr "``dbm`` 风格数据库的泛型接口。" + +#: ../../library/shelve.rst:285 +msgid "Module :mod:`pickle`" +msgstr "模块 :mod:`pickle`" + +#: ../../library/shelve.rst:286 +msgid "Object serialization used by :mod:`!shelve`." +msgstr ":mod:`!shelve` 所使用的对象序列化。" + +#: ../../library/shelve.rst:9 ../../library/shelve.rst:124 +msgid "module" +msgstr "module" + +#: ../../library/shelve.rst:9 +msgid "pickle" +msgstr "pickle" + +#: ../../library/shelve.rst:124 +msgid "dbm.ndbm" +msgstr "dbm.ndbm" + +#: ../../library/shelve.rst:124 +msgid "dbm.gnu" +msgstr "dbm.gnu" diff --git a/library/shlex.po b/library/shlex.po new file mode 100644 index 0000000000..168c455a44 --- /dev/null +++ b/library/shlex.po @@ -0,0 +1,639 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/shlex.rst:2 +msgid ":mod:`!shlex` --- Simple lexical analysis" +msgstr ":mod:`!shlex` --- 简单词法分析" + +#: ../../library/shlex.rst:12 +msgid "**Source code:** :source:`Lib/shlex.py`" +msgstr "**源代码:** :source:`Lib/shlex.py`" + +#: ../../library/shlex.rst:16 +msgid "" +"The :class:`~shlex.shlex` class makes it easy to write lexical analyzers for" +" simple syntaxes resembling that of the Unix shell. This will often be " +"useful for writing minilanguages, (for example, in run control files for " +"Python applications) or for parsing quoted strings." +msgstr "" +":class:`~shlex.shlex` 类可用于编写类似 Unix shell 的简单词法分析程序。通常可用于编写“迷你语言”(如 Python " +"应用程序的运行控制文件)或解析带引号的字符串。" + +#: ../../library/shlex.rst:21 +msgid "The :mod:`!shlex` module defines the following functions:" +msgstr ":mod:`!shlex` 模块定义了下列函数:module defines the following functions:" + +#: ../../library/shlex.rst:26 +msgid "" +"Split the string *s* using shell-like syntax. If *comments* is " +":const:`False` (the default), the parsing of comments in the given string " +"will be disabled (setting the :attr:`~shlex.commenters` attribute of the " +":class:`~shlex.shlex` instance to the empty string). This function operates" +" in POSIX mode by default, but uses non-POSIX mode if the *posix* argument " +"is false." +msgstr "" +"用类似 shell 的语法拆分字符串 *s*。如果 *comments* 为 :const:`False` (默认值),则不会解析给定字符串中的注释 " +"(将 :class:`~shlex.shlex` 实例的 :attr:`~shlex.commenters` 属性设为空字符串)。本函数默认工作于 " +"POSIX 模式下,但若 *posix* 参数为 False,则采用非 POSIX 模式。" + +#: ../../library/shlex.rst:33 +msgid "" +"Passing ``None`` for *s* argument now raises an exception, rather than " +"reading :data:`sys.stdin`." +msgstr "传入 ``None`` 作为 *s* 参数现在会引发异常,而不是读取 :data:`sys.stdin`。" + +#: ../../library/shlex.rst:39 +msgid "" +"Concatenate the tokens of the list *split_command* and return a string. This" +" function is the inverse of :func:`split`." +msgstr "" +"将列表 *split_command* 中的词法单元(token)串联起来,返回一个字符串。本函数是 :func:`split` 的逆运算。" + +#: ../../library/shlex.rst:46 +msgid "" +"The returned value is shell-escaped to protect against injection " +"vulnerabilities (see :func:`quote`)." +msgstr "为防止注入漏洞,返回值是经过 shell 转义的 (参见 :func:`quote`)。" + +#: ../../library/shlex.rst:54 +msgid "" +"Return a shell-escaped version of the string *s*. The returned value is a " +"string that can safely be used as one token in a shell command line, for " +"cases where you cannot use a list." +msgstr "返回经过 shell 转义的字符串 *s* 。返回值为字符串,可以安全地用作 shell 命令行中的词法单元,可用于不能使用列表的场合。" + +#: ../../library/shlex.rst:62 +msgid "The ``shlex`` module is **only designed for Unix shells**." +msgstr "``shlex`` 模块 **仅适用于 Unix shell**。" + +#: ../../library/shlex.rst:64 +msgid "" +"The :func:`quote` function is not guaranteed to be correct on non-POSIX " +"compliant shells or shells from other operating systems such as Windows. " +"Executing commands quoted by this module on such shells can open up the " +"possibility of a command injection vulnerability." +msgstr "" +"在不兼容 POSIX 的 shell 或其他操作系统(如 Windows)的 shell 上,并不保证 :func:`quote` " +"函数能够正常使用。在这种 shell 中执行用本模块包装过的命令,有可能会存在命令注入漏洞。" + +#: ../../library/shlex.rst:69 +msgid "" +"Consider using functions that pass command arguments with lists such as " +":func:`subprocess.run` with ``shell=False``." +msgstr "请考虑采用命令参数以列表形式给出的函数,比如带了 ``shell=False`` 参数的 :func:`subprocess.run`。" + +#: ../../library/shlex.rst:72 +msgid "This idiom would be unsafe:" +msgstr "以下用法是不安全的:" + +#: ../../library/shlex.rst:79 +msgid ":func:`quote` lets you plug the security hole:" +msgstr "用 :func:`quote` 可以堵住这种安全漏洞:" + +#: ../../library/shlex.rst:89 +msgid "The quoting is compatible with UNIX shells and with :func:`split`:" +msgstr "这种包装方式兼容于 UNIX shell 和 :func:`split`。" + +#: ../../library/shlex.rst:101 +msgid "The :mod:`!shlex` module defines the following class:" +msgstr "" + +#: ../../library/shlex.rst:106 +msgid "" +"A :class:`~shlex.shlex` instance or subclass instance is a lexical analyzer " +"object. The initialization argument, if present, specifies where to read " +"characters from. It must be a file-/stream-like object with " +":meth:`~io.TextIOBase.read` and :meth:`~io.TextIOBase.readline` methods, or " +"a string. If no argument is given, input will be taken from ``sys.stdin``. " +"The second optional argument is a filename string, which sets the initial " +"value of the :attr:`~shlex.infile` attribute. If the *instream* argument is" +" omitted or equal to ``sys.stdin``, this second argument defaults to " +"\"stdin\". The *posix* argument defines the operational mode: when *posix* " +"is not true (default), the :class:`~shlex.shlex` instance will operate in " +"compatibility mode. When operating in POSIX mode, :class:`~shlex.shlex` " +"will try to be as close as possible to the POSIX shell parsing rules. The " +"*punctuation_chars* argument provides a way to make the behaviour even " +"closer to how real shells parse. This can take a number of values: the " +"default value, ``False``, preserves the behaviour seen under Python 3.5 and " +"earlier. If set to ``True``, then parsing of the characters ``();<>|&`` is " +"changed: any run of these characters (considered punctuation characters) is " +"returned as a single token. If set to a non-empty string of characters, " +"those characters will be used as the punctuation characters. Any characters" +" in the :attr:`wordchars` attribute that appear in *punctuation_chars* will " +"be removed from :attr:`wordchars`. See :ref:`improved-shell-compatibility` " +"for more information. *punctuation_chars* can be set only upon " +":class:`~shlex.shlex` instance creation and can't be modified later." +msgstr "" +":class:`~shlex.shlex` 及其子类的实例是一种词法分析器对象。利用初始化参数可指定从哪里读取字符。初始化参数必须是具备 " +":meth:`~io.TextIOBase.read` 和 :meth:`~io.TextIOBase.readline` " +"方法的文件/流对象,或者是一个字符串。如果没有给出初始化参数,则会从 ``sys.stdin`` 获取输入。第二个可选参数是个文件名字符串,用于设置 " +":attr:`~shlex.infile` 属性的初始值。如果 *instream* 参数被省略或等于 ``sys.stdin``,则第二个参数默认为 " +"\"stdin\"。 *posix* 参数定义了操作的模式:若 *posix* 不为真值(默认),则 :class:`~shlex.shlex` " +"实例将工作于兼容模式。若运行于 POSIX 模式下,则 :class:`~shlex.shlex` 会尽可能地应用 POSIX shell 解析规则。 " +"*punctuation_chars* 参数提供了一种使行为更接近于真正的 shell 解析的方式。 该参数可接受多种值:默认值 ``False`` " +"保持 Python 3.5 及更早版本的行为。如果设为 ``True``,则会改变对字符 ``();<>|&`` " +"的解析方式:这些字符将作为独立的词法单元被返回(视作标点符号)。如果设为非空字符串,则这些字符将被用作标点符号。出现在 " +"*punctuation_chars* 中的 :attr:`wordchars` 属性中的任何字符都会从 :attr:`wordchars` 中被删除。" +" 请参阅 :ref:`improved-shell-compatibility` 了解详情。 *punctuation_chars* 只能在创建 " +":class:`~shlex.shlex` 实例时设置,以后不能再作修改。" + +#: ../../library/shlex.rst:131 +msgid "The *punctuation_chars* parameter was added." +msgstr "加入 *punctuation_chars* 参数。" + +#: ../../library/shlex.rst:136 +msgid "Module :mod:`configparser`" +msgstr ":mod:`configparser` 模块" + +#: ../../library/shlex.rst:137 +msgid "" +"Parser for configuration files similar to the Windows :file:`.ini` files." +msgstr "配置文件解析器,类似于 Windows 的 :file:`.ini` 文件。" + +#: ../../library/shlex.rst:143 +msgid "shlex Objects" +msgstr "shlex 对象" + +#: ../../library/shlex.rst:145 +msgid "A :class:`~shlex.shlex` instance has the following methods:" +msgstr ":class:`~shlex.shlex` 实例具备以下方法:" + +#: ../../library/shlex.rst:150 +msgid "" +"Return a token. If tokens have been stacked using :meth:`push_token`, pop a" +" token off the stack. Otherwise, read one from the input stream. If " +"reading encounters an immediate end-of-file, :attr:`eof` is returned (the " +"empty string (``''``) in non-POSIX mode, and ``None`` in POSIX mode)." +msgstr "" +"返回一个词元。如果已使用 :meth:`push_token` 将词元堆叠在一起了,则从栈中弹出一个词元。否则就从输入流中读取一个。 " +"如果读取时遇到文件结束符,则会返回 :attr:`eof`;在非 POSIX 模式下为空字符串 ``''``,在 POSIX 模式下返回 " +"``None`` 值。" + +#: ../../library/shlex.rst:158 +msgid "Push the argument onto the token stack." +msgstr "将参数值压入词法单元堆栈。" + +#: ../../library/shlex.rst:163 +msgid "" +"Read a raw token. Ignore the pushback stack, and do not interpret source " +"requests. (This is not ordinarily a useful entry point, and is documented " +"here only for the sake of completeness.)" +msgstr "读取一个原始词法单元。忽略堆栈,且不解释源请求。(通常没什么用,只是为了完整起见。)" + +#: ../../library/shlex.rst:170 +msgid "" +"When :class:`~shlex.shlex` detects a source request (see :attr:`source` " +"below) this method is given the following token as argument, and expected to" +" return a tuple consisting of a filename and an open file-like object." +msgstr "" +"当 :class:`~shlex.shlex` 检测到源请求 (见下面的 :attr:`source`) " +"时,本方法会接收后面的词法单元作为参数,并应返回一个由文件名和打开的文件对象组成的元组。" + +#: ../../library/shlex.rst:174 +msgid "" +"Normally, this method first strips any quotes off the argument. If the " +"result is an absolute pathname, or there was no previous source request in " +"effect, or the previous source was a stream (such as ``sys.stdin``), the " +"result is left alone. Otherwise, if the result is a relative pathname, the " +"directory part of the name of the file immediately before it on the source " +"inclusion stack is prepended (this behavior is like the way the C " +"preprocessor handles ``#include \"file.h\"``)." +msgstr "" +"通常本方法会先移除参数中的引号。如果结果为绝对路径名,或者之前没有有效的源请求,或者之前的源请求是一个流对象 (比如 " +"``sys.stdin``),那么结果将不做处理。否则,如果结果是相对路径名,那么前面将会加上目录部分,目录名来自于源堆栈中前一个文件名(类似于 C " +"预处理器对 ``#include \"file.h\"`` 的处理方式)。" + +#: ../../library/shlex.rst:182 +msgid "" +"The result of the manipulations is treated as a filename, and returned as " +"the first component of the tuple, with :func:`open` called on it to yield " +"the second component. (Note: this is the reverse of the order of arguments " +"in instance initialization!)" +msgstr "" +"结果被视为一个文件名,并作为元组的第一部分返回,元组的第二部分以此为基础调用 :func:`open` " +"获得。(注意:这与实例初始化过程中的参数顺序相反!)" + +#: ../../library/shlex.rst:187 +msgid "" +"This hook is exposed so that you can use it to implement directory search " +"paths, addition of file extensions, and other namespace hacks. There is no " +"corresponding 'close' hook, but a shlex instance will call the " +":meth:`~io.IOBase.close` method of the sourced input stream when it returns " +"EOF." +msgstr "" +"此钩子函数是公开的,可用于实现路径搜索、添加文件扩展名及其他命名空间技巧。没有对应的\"关闭\"钩子函数,但 shlex 实例在返回 EOF " +"时会调用源输入流的 :meth:`~io.IOBase.close` 方法。" + +#: ../../library/shlex.rst:193 +msgid "" +"For more explicit control of source stacking, use the :meth:`push_source` " +"and :meth:`pop_source` methods." +msgstr "若要更明确地控制源堆栈,请采用 :meth:`push_source` 和 :meth:`pop_source` 方法。" + +#: ../../library/shlex.rst:199 +msgid "" +"Push an input source stream onto the input stack. If the filename argument " +"is specified it will later be available for use in error messages. This is " +"the same method used internally by the :meth:`sourcehook` method." +msgstr "将输入源流压入输入堆栈。如果指定了文件名参数,以后错误信息中将会用到。:meth:`sourcehook` 内部同样使用了本方法。" + +#: ../../library/shlex.rst:206 +msgid "" +"Pop the last-pushed input source from the input stack. This is the same " +"method used internally when the lexer reaches EOF on a stacked input stream." +msgstr "从输入堆栈中弹出最后一条输入源。当遇到输入流的 EOF 时,内部也使用同一方法。" + +#: ../../library/shlex.rst:212 +msgid "" +"This method generates an error message leader in the format of a Unix C " +"compiler error label; the format is ``'\"%s\", line %d: '``, where the " +"``%s`` is replaced with the name of the current source file and the ``%d`` " +"with the current input line number (the optional arguments can be used to " +"override these)." +msgstr "" +"本方法生成一条错误信息的首部,以 Unix C 编译器错误标签的形式;格式为 ``'\"%s\", line %d: '``,其中 ``%s`` " +"被替换为当前源文件的名称,``%d`` 被替换为当前输入行号(可用可选参数覆盖)。" + +#: ../../library/shlex.rst:217 +msgid "" +"This convenience is provided to encourage :mod:`!shlex` users to generate " +"error messages in the standard, parseable format understood by Emacs and " +"other Unix tools." +msgstr "" + +#: ../../library/shlex.rst:221 +msgid "" +"Instances of :class:`~shlex.shlex` subclasses have some public instance " +"variables which either control lexical analysis or can be used for " +"debugging:" +msgstr ":class:`~shlex.shlex` 子类的实例有一些公共实例变量,这些变量可以控制词法分析,也可用于调试。" + +#: ../../library/shlex.rst:227 +msgid "" +"The string of characters that are recognized as comment beginners. All " +"characters from the comment beginner to end of line are ignored. Includes " +"just ``'#'`` by default." +msgstr "将被视为注释起始字符串。从注释起始字符串到行尾的所有字符都将被忽略。默认情况下只包括 ``'#'``。" + +#: ../../library/shlex.rst:234 +msgid "" +"The string of characters that will accumulate into multi-character tokens. " +"By default, includes all ASCII alphanumerics and underscore. In POSIX mode," +" the accented characters in the Latin-1 set are also included. If " +":attr:`punctuation_chars` is not empty, the characters ``~-./*?=``, which " +"can appear in filename specifications and command line parameters, will also" +" be included in this attribute, and any characters which appear in " +"``punctuation_chars`` will be removed from ``wordchars`` if they are present" +" there. If :attr:`whitespace_split` is set to ``True``, this will have no " +"effect." +msgstr "" +"可连成多字符词法单元的字符串。默认包含所有 ASCII 字母数字和下划线。在 POSIX 模式下,Latin-1 字符集的重音字符也被包括在内。如果 " +":attr:`punctuation_chars` 不为空,则可出现在文件名规范和命令行参数中的 ``~-./*?=`` 字符也将包含在内,任何 " +"``punctuation_chars`` 中的字符将从 ``wordchars`` 中移除。如果 :attr:`whitespace_split` " +"设为 ``True``,则本规则无效。" + +#: ../../library/shlex.rst:247 +msgid "" +"Characters that will be considered whitespace and skipped. Whitespace " +"bounds tokens. By default, includes space, tab, linefeed and carriage-" +"return." +msgstr "将被视为空白符并跳过的字符。空白符是词法单元的边界。默认包含空格、制表符、换行符和回车符。" + +#: ../../library/shlex.rst:253 +msgid "" +"Characters that will be considered as escape. This will be only used in " +"POSIX mode, and includes just ``'\\'`` by default." +msgstr "将视为转义字符。仅适用于 POSIX 模式,默认只包含 ``'\\'``。" + +#: ../../library/shlex.rst:259 +msgid "" +"Characters that will be considered string quotes. The token accumulates " +"until the same quote is encountered again (thus, different quote types " +"protect each other as in the shell.) By default, includes ASCII single and " +"double quotes." +msgstr "" +"将视为引号的字符。词法单元中的字符将会累至再次遇到同样的引号(因此,不同的引号会像在 shell 中一样相互包含。)默认包含 ASCII " +"单引号和双引号。" + +#: ../../library/shlex.rst:266 +msgid "" +"Characters in :attr:`quotes` that will interpret escape characters defined " +"in :attr:`escape`. This is only used in POSIX mode, and includes just " +"``'\"'`` by default." +msgstr "" +":attr:`quotes` 中的字符将会解析 :attr:`escape` 定义的转义字符。这只在 POSIX 模式下使用,默认只包含 " +"``'\"'``。" + +#: ../../library/shlex.rst:273 +msgid "" +"If ``True``, tokens will only be split in whitespaces. This is useful, for " +"example, for parsing command lines with :class:`~shlex.shlex`, getting " +"tokens in a similar way to shell arguments. When used in combination with " +":attr:`punctuation_chars`, tokens will be split on whitespace in addition to" +" those characters." +msgstr "" +"若为 ``True``,则只根据空白符拆分词法单元。这很有用,比如用 :class:`~shlex.shlex` 解析命令行,用类似 shell " +"参数的方式读取各个词法单元。当与 :attr:`punctuation_chars` 一起使用时,将根据空白符和这些字符拆分词法单元。" + +#: ../../library/shlex.rst:279 +msgid "" +"The :attr:`punctuation_chars` attribute was made compatible with the " +":attr:`whitespace_split` attribute." +msgstr ":attr:`punctuation_chars` 属性已与 :attr:`whitespace_split` 属性兼容。" + +#: ../../library/shlex.rst:286 +msgid "" +"The name of the current input file, as initially set at class instantiation " +"time or stacked by later source requests. It may be useful to examine this " +"when constructing error messages." +msgstr "当前输入的文件名,可能是在类实例化时设置的,或者是由后来的源请求堆栈生成的。在构建错误信息时可能会用到本属性。" + +#: ../../library/shlex.rst:293 +msgid "" +"The input stream from which this :class:`~shlex.shlex` instance is reading " +"characters." +msgstr ":class:`~shlex.shlex` 实例正从中读取字符的输入流。" + +#: ../../library/shlex.rst:299 +msgid "" +"This attribute is ``None`` by default. If you assign a string to it, that " +"string will be recognized as a lexical-level inclusion request similar to " +"the ``source`` keyword in various shells. That is, the immediately " +"following token will be opened as a filename and input will be taken from " +"that stream until EOF, at which point the :meth:`~io.IOBase.close` method of" +" that stream will be called and the input source will again become the " +"original input stream. Source requests may be stacked any number of levels " +"deep." +msgstr "" +"本属性默认值为 ``None``。如果给定一个字符串,则会识别为包含请求,类似于各种 shell 中的 ``source`` 关键字。 " +"也就是说,紧随其后的词法单元将作为文件名打开,作为输入流,直至遇到 EOF 后调用流的 :meth:`~io.IOBase.close` " +"方法,然后原输入流重新变回输入源。源请求可以嵌套任意深度。" + +#: ../../library/shlex.rst:310 +msgid "" +"If this attribute is numeric and ``1`` or more, a :class:`~shlex.shlex` " +"instance will print verbose progress output on its behavior. If you need to" +" use this, you can read the module source code to learn the details." +msgstr "" +"如果本属性为 ``1`` 或更大的数字,则 :class:`~shlex.shlex` " +"实例会把动作进度详细地输出出来。若需用到本属性,可阅读源代码来了解细节。" + +#: ../../library/shlex.rst:317 +msgid "Source line number (count of newlines seen so far plus one)." +msgstr "源的行数(到目前为止读到的换行符数量加 1)。" + +#: ../../library/shlex.rst:322 +msgid "" +"The token buffer. It may be useful to examine this when catching " +"exceptions." +msgstr "词法单元的缓冲区。在捕获异常时可能会用到。" + +#: ../../library/shlex.rst:327 +msgid "" +"Token used to determine end of file. This will be set to the empty string " +"(``''``), in non-POSIX mode, and to ``None`` in POSIX mode." +msgstr "用于确定文件结束的词法单元。在非 POSIX 模式下,将设为空字符串 ``''``,在 POSIX 模式下被设为 ``None``。" + +#: ../../library/shlex.rst:333 +msgid "" +"A read-only property. Characters that will be considered punctuation. Runs " +"of punctuation characters will be returned as a single token. However, note " +"that no semantic validity checking will be performed: for example, '>>>' " +"could be returned as a token, even though it may not be recognised as such " +"by shells." +msgstr "" +"只读属性。表示应视作标点符号的字符。标点符号将作为单个词法单元返回。然而,请注意不会进行语义有效性检查:比如“>>>” 可能会作为一个词法单元返回,虽然" +" shell 可能无法识别。" + +#: ../../library/shlex.rst:344 +msgid "Parsing Rules" +msgstr "解析规则" + +#: ../../library/shlex.rst:346 +msgid "" +"When operating in non-POSIX mode, :class:`~shlex.shlex` will try to obey the" +" following rules." +msgstr "" + +#: ../../library/shlex.rst:349 +msgid "" +"Quote characters are not recognized within words (``Do\"Not\"Separate`` is " +"parsed as the single word ``Do\"Not\"Separate``);" +msgstr "不识别单词中的引号;例如,``Do\"Not\"Separate`` 会被解析为一个单词,即 ``Do\"Not\"Separate`` 这个词。" + +#: ../../library/shlex.rst:352 +msgid "Escape characters are not recognized;" +msgstr "不识别转义字符;" + +#: ../../library/shlex.rst:354 +msgid "" +"Enclosing characters in quotes preserve the literal value of all characters " +"within the quotes;" +msgstr "引号包裹的字符保留字面意思;" + +#: ../../library/shlex.rst:357 +msgid "" +"Closing quotes separate words (``\"Do\"Separate`` is parsed as ``\"Do\"`` " +"and ``Separate``);" +msgstr "成对的引号会将单词分离 (``\"Do\"Separate`` 解析为 ``\"Do\"`` 和 ``Separate``);" + +#: ../../library/shlex.rst:360 +msgid "" +"If :attr:`~shlex.whitespace_split` is ``False``, any character not declared " +"to be a word character, whitespace, or a quote will be returned as a single-" +"character token. If it is ``True``, :class:`~shlex.shlex` will only split " +"words in whitespaces;" +msgstr "" +"如果 :attr:`~shlex.whitespace_split` 为 " +"``False``,则未声明为单词字符、空白或引号的字符将作为单字符的词法单元返回。若为 ``True``,则 " +":class:`~shlex.shlex` 只根据空白符拆分单词。" + +#: ../../library/shlex.rst:365 +msgid "EOF is signaled with an empty string (``''``);" +msgstr "EOF 用空字符串 (``''``) 表示;" + +#: ../../library/shlex.rst:367 +msgid "It's not possible to parse empty strings, even if quoted." +msgstr "空字符串无法解析,即便是加了引号。" + +#: ../../library/shlex.rst:369 +msgid "" +"When operating in POSIX mode, :class:`~shlex.shlex` will try to obey the " +"following parsing rules." +msgstr "" + +#: ../../library/shlex.rst:372 +msgid "" +"Quotes are stripped out, and do not separate words " +"(``\"Do\"Not\"Separate\"`` is parsed as the single word ``DoNotSeparate``);" +msgstr "引号会被剔除,且不会拆分单词 (``\"Do\"Not\"Separate\"`` 将解析为单个单词 ``DoNotSeparate``);" + +#: ../../library/shlex.rst:375 +msgid "" +"Non-quoted escape characters (e.g. ``'\\'``) preserve the literal value of " +"the next character that follows;" +msgstr "未加引号包裹的转义字符 (如 ``'\\'``) 保留后一个字符的字面意思;" + +#: ../../library/shlex.rst:378 +msgid "" +"Enclosing characters in quotes which are not part of " +":attr:`~shlex.escapedquotes` (e.g. ``\"'\"``) preserve the literal value of " +"all characters within the quotes;" +msgstr "包裹在引号中不属于 :attr:`~shlex.escapedquotes` (例如 ``\"'\"``) 的字符将保留引号中所有字符的字面值;" + +#: ../../library/shlex.rst:382 +msgid "" +"Enclosing characters in quotes which are part of " +":attr:`~shlex.escapedquotes` (e.g. ``'\"'``) preserves the literal value of " +"all characters within the quotes, with the exception of the characters " +"mentioned in :attr:`~shlex.escape`. The escape characters retain their " +"special meaning only when followed by the quote in use, or the escape " +"character itself. Otherwise the escape character will be considered a normal" +" character." +msgstr "" + +#: ../../library/shlex.rst:390 +msgid "EOF is signaled with a :const:`None` value;" +msgstr "EOF 用 :const:`None` 表示;" + +#: ../../library/shlex.rst:392 +msgid "Quoted empty strings (``''``) are allowed." +msgstr "允许出现引号包裹的空字符串 (``''``)。" + +#: ../../library/shlex.rst:397 +msgid "Improved Compatibility with Shells" +msgstr "改进的 shell 兼容性" + +#: ../../library/shlex.rst:401 +msgid "" +"The :class:`shlex` class provides compatibility with the parsing performed " +"by common Unix shells like ``bash``, ``dash``, and ``sh``. To take " +"advantage of this compatibility, specify the ``punctuation_chars`` argument " +"in the constructor. This defaults to ``False``, which preserves pre-3.6 " +"behaviour. However, if it is set to ``True``, then parsing of the characters" +" ``();<>|&`` is changed: any run of these characters is returned as a single" +" token. While this is short of a full parser for shells (which would be out" +" of scope for the standard library, given the multiplicity of shells out " +"there), it does allow you to perform processing of command lines more easily" +" than you could otherwise. To illustrate, you can see the difference in the" +" following snippet:" +msgstr "" +":class:`shlex` 类提供了与常见 Unix shell (如 ``bash``、``dash`` 和 ``sh``) " +"的解析兼容性。为了充分利用这种兼容性,请在构造函数中设定 ``punctuation_chars`` 参数。该参数默认为 ``False``,维持 " +"3.6 以下版本的行为。如果设为 ``True``,则会改变对 ``();<>|&`` " +"字符的解析方式:这些字符都将视为单个的词法单元返回。虽然不算是完整的 shell 解析程序(考虑到 shell " +"的多样性,超出了标准库的范围),但确实能比其他方式更容易进行命令行的处理。以下代码段演示了两者的差异:" + +#: ../../library/shlex.rst:412 +msgid "" +">>> import shlex\n" +">>> text = \"a && b; c && d || e; f >'abc'; (def \\\"ghi\\\")\"\n" +">>> s = shlex.shlex(text, posix=True)\n" +">>> s.whitespace_split = True\n" +">>> list(s)\n" +"['a', '&&', 'b;', 'c', '&&', 'd', '||', 'e;', 'f', '>abc;', '(def', 'ghi)']\n" +">>> s = shlex.shlex(text, posix=True, punctuation_chars=True)\n" +">>> s.whitespace_split = True\n" +">>> list(s)\n" +"['a', '&&', 'b', ';', 'c', '&&', 'd', '||', 'e', ';', 'f', '>', 'abc', ';',\n" +"'(', 'def', 'ghi', ')']" +msgstr "" +">>> import shlex\n" +">>> text = \"a && b; c && d || e; f >'abc'; (def \\\"ghi\\\")\"\n" +">>> s = shlex.shlex(text, posix=True)\n" +">>> s.whitespace_split = True\n" +">>> list(s)\n" +"['a', '&&', 'b;', 'c', '&&', 'd', '||', 'e;', 'f', '>abc;', '(def', 'ghi)']\n" +">>> s = shlex.shlex(text, posix=True, punctuation_chars=True)\n" +">>> s.whitespace_split = True\n" +">>> list(s)\n" +"['a', '&&', 'b', ';', 'c', '&&', 'd', '||', 'e', ';', 'f', '>', 'abc', ';',\n" +"'(', 'def', 'ghi', ')']" + +#: ../../library/shlex.rst:427 +msgid "" +"Of course, tokens will be returned which are not valid for shells, and " +"you'll need to implement your own error checks on the returned tokens." +msgstr "当然,返回的词法单元中可能会包含对 shell 无效的内容,需要自行对返回的词法单元进行错误检查。" + +#: ../../library/shlex.rst:430 +msgid "" +"Instead of passing ``True`` as the value for the punctuation_chars " +"parameter, you can pass a string with specific characters, which will be " +"used to determine which characters constitute punctuation. For example::" +msgstr "punctuation_chars 参数可以不传入 ``True``,而是传入包含特定字符的字符串,用于确定由哪些字符构成标点符号。例如:" + +#: ../../library/shlex.rst:434 +msgid "" +">>> import shlex\n" +">>> s = shlex.shlex(\"a && b || c\", punctuation_chars=\"|\")\n" +">>> list(s)\n" +"['a', '&', '&', 'b', '||', 'c']" +msgstr "" +">>> import shlex\n" +">>> s = shlex.shlex(\"a && b || c\", punctuation_chars=\"|\")\n" +">>> list(s)\n" +"['a', '&', '&', 'b', '||', 'c']" + +#: ../../library/shlex.rst:439 +msgid "" +"When ``punctuation_chars`` is specified, the :attr:`~shlex.wordchars` " +"attribute is augmented with the characters ``~-./*?=``. That is because " +"these characters can appear in file names (including wildcards) and command-" +"line arguments (e.g. ``--color=auto``). Hence::" +msgstr "" +"如果指定了 ``punctuation_chars``,则 :attr:`~shlex.wordchars` 属性会增加字符 ``~-./*?=``。 " +"因为这些字符可以出现在文件名(包括通配符)和命令行参数中 (如 ``--color=auto``)。 因此:" + +#: ../../library/shlex.rst:444 +msgid "" +">>> import shlex\n" +">>> s = shlex.shlex('~/a && b-c --color=auto || d *.py?',\n" +"... punctuation_chars=True)\n" +">>> list(s)\n" +"['~/a', '&&', 'b-c', '--color=auto', '||', 'd', '*.py?']" +msgstr "" +">>> import shlex\n" +">>> s = shlex.shlex('~/a && b-c --color=auto || d *.py?',\n" +"... punctuation_chars=True)\n" +">>> list(s)\n" +"['~/a', '&&', 'b-c', '--color=auto', '||', 'd', '*.py?']" + +#: ../../library/shlex.rst:450 +msgid "" +"However, to match the shell as closely as possible, it is recommended to " +"always use ``posix`` and :attr:`~shlex.whitespace_split` when using " +":attr:`~shlex.punctuation_chars`, which will negate :attr:`~shlex.wordchars`" +" entirely." +msgstr "" +"不过为了尽可能接近于 shell,建议在使用 :attr:`~shlex.punctuation_chars` 时始终使用 ``posix`` 和 " +":attr:`~shlex.whitespace_split`,这将完全否定 :attr:`~shlex.wordchars`。" + +#: ../../library/shlex.rst:455 +msgid "" +"For best effect, ``punctuation_chars`` should be set in conjunction with " +"``posix=True``. (Note that ``posix=False`` is the default for " +":class:`~shlex.shlex`.)" +msgstr "" +"为了达到最佳效果,``punctuation_chars`` 应与 ``posix=True`` 一起设置。(注意 ``posix=False`` 是 " +":class:`~shlex.shlex` 的默认设置)。" diff --git a/library/shutil.po b/library/shutil.po new file mode 100644 index 0000000000..f2344efc4a --- /dev/null +++ b/library/shutil.po @@ -0,0 +1,1495 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-06-09 17:19+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/shutil.rst:2 +msgid ":mod:`!shutil` --- High-level file operations" +msgstr ":mod:`!shutil` --- 高层级文件操作" + +#: ../../library/shutil.rst:10 +msgid "**Source code:** :source:`Lib/shutil.py`" +msgstr "**源代码:** :source:`Lib/shutil.py`" + +#: ../../library/shutil.rst:18 +msgid "" +"The :mod:`!shutil` module offers a number of high-level operations on files " +"and collections of files. In particular, functions are provided which " +"support file copying and removal. For operations on individual files, see " +"also the :mod:`os` module." +msgstr "" +":mod:`!shutil` 模块提供了一系列对文件和文件集合的高阶操作。 特别是提供了一些支持文件拷贝和删除的函数。 对于单个文件的操作,请参阅 " +":mod:`os` 模块。" + +#: ../../library/shutil.rst:25 +msgid "" +"Even the higher-level file copying functions (:func:`shutil.copy`, " +":func:`shutil.copy2`) cannot copy all file metadata." +msgstr "" +"即便是高阶文件拷贝函数 (:func:`shutil.copy`, :func:`shutil.copy2`) 也无法拷贝所有的文件元数据。" + +#: ../../library/shutil.rst:28 +msgid "" +"On POSIX platforms, this means that file owner and group are lost as well as" +" ACLs. On Mac OS, the resource fork and other metadata are not used. This " +"means that resources will be lost and file type and creator codes will not " +"be correct. On Windows, file owners, ACLs and alternate data streams are not" +" copied." +msgstr "" +"在 POSIX 平台上,这意味着将丢失文件所有者和组以及 ACL 数据。在 Mac OS " +"上,资源分支和其他元数据不被使用。这意味着将丢失这些资源并且文件类型和创建者代码将不正确。在 Windows 上,将不会拷贝文件所有者、ACL " +"和替代数据流。" + +#: ../../library/shutil.rst:38 +msgid "Directory and files operations" +msgstr "目录和文件操作" + +#: ../../library/shutil.rst:42 +msgid "" +"Copy the contents of the :term:`file-like object ` *fsrc* to " +"the file-like object *fdst*. The integer *length*, if given, is the buffer " +"size. In particular, a negative *length* value means to copy the data " +"without looping over the source data in chunks; by default the data is read " +"in chunks to avoid uncontrolled memory consumption. Note that if the current" +" file position of the *fsrc* object is not 0, only the contents from the " +"current file position to the end of the file will be copied." +msgstr "" +"将 :term:`文件型对象 ` *fsrc* 的内容拷贝到文件型对象 *fdst*。如果给出了整数值 " +"*length*,即为缓冲区大小。特别地,*length* " +"为负值表示拷贝数据时不对源数据进行分块循环处理;在默认情况下会分块读取数据以避免不受控制的内存消耗。请注意如果 *fsrc* 对象的当前文件位置不为 " +"0,只有从当前文件位置到文件末尾的内容会被拷贝。" + +#: ../../library/shutil.rst:50 +msgid "" +":func:`copyfileobj` will *not* guarantee that the destination stream has " +"been flushed on completion of the copy. If you want to read from the " +"destination at the completion of the copy operation (for example, reading " +"the contents of a temporary file that has been copied from a HTTP stream), " +"you must ensure that you have called :func:`~io.IOBase.flush` or " +":func:`~io.IOBase.close` on the file-like object before attempting to read " +"the destination file." +msgstr "" +":func:`copyfileobj` 将 *不* 保证目标流在拷贝完成时已被刷新。 如果你希望在复制操作完成时从目标文件读取(例如,读取从 HTTP " +"流复制的临时文件的内容),则必须确保在尝试读取目标文件之前在文件型对象上调用了 :func:`~io.IOBase.flush` 或 " +":func:`~io.IOBase.close`。" + +#: ../../library/shutil.rst:60 +msgid "" +"Copy the contents (no metadata) of the file named *src* to a file named " +"*dst* and return *dst* in the most efficient way possible. *src* and *dst* " +"are :term:`path-like objects ` or path names given as " +"strings." +msgstr "" +"将名为 *src* 的文件的内容(不带元数据)拷贝到名为 *dst* 的文件并以尽可能高效的方式返回 *dst*。 *src* 和 *dst* 均为 " +":term:`路径型对象 ` 或字符串形式的路径名。" + +#: ../../library/shutil.rst:64 +msgid "" +"*dst* must be the complete target file name; look at :func:`~shutil.copy` " +"for a copy that accepts a target directory path. If *src* and *dst* specify" +" the same file, :exc:`SameFileError` is raised." +msgstr "" +"*dst* 必须是完整的目标文件名;对于接受目标目录路径的拷贝请参见 :func:`~shutil.copy`。如果 *src* 和 *dst* " +"指定了同一个文件,则将引发 :exc:`SameFileError`。" + +#: ../../library/shutil.rst:68 +msgid "" +"The destination location must be writable; otherwise, an :exc:`OSError` " +"exception will be raised. If *dst* already exists, it will be replaced. " +"Special files such as character or block devices and pipes cannot be copied " +"with this function." +msgstr "" +"目标位置必须是可写的;否则将引发 :exc:`OSError` 异常。如果 *dst* 已经存在,它将被替换。 " +"特殊文件如字符或块设备以及管道无法用此函数来拷贝。" + +#: ../../library/shutil.rst:73 +msgid "" +"If *follow_symlinks* is false and *src* is a symbolic link, a new symbolic " +"link will be created instead of copying the file *src* points to." +msgstr "如果 *follow_symlinks* 为假值且 *src* 为符号链接,则将创建一个新的符号链接而不是拷贝 *src* 所指向的文件。" + +#: ../../library/shutil.rst:77 ../../library/shutil.rst:191 +#: ../../library/shutil.rst:222 +msgid "" +"Raises an :ref:`auditing event ` ``shutil.copyfile`` with " +"arguments ``src``, ``dst``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``shutil.copyfile`` 并附带参数 ``src``, ``dst``。" + +#: ../../library/shutil.rst:79 +msgid "" +":exc:`IOError` used to be raised instead of :exc:`OSError`. Added " +"*follow_symlinks* argument. Now returns *dst*." +msgstr "" +"曾经是引发 :exc:`IOError` 而不是 :exc:`OSError`。增加了 *follow_symlinks* 参数。现在是返回 " +"*dst*." + +#: ../../library/shutil.rst:84 +msgid "" +"Raise :exc:`SameFileError` instead of :exc:`Error`. Since the former is a " +"subclass of the latter, this change is backward compatible." +msgstr "引发 :exc:`SameFileError` 而不是 :exc:`Error`。由于前者是后者的子类,此改变是向后兼容的。" + +#: ../../library/shutil.rst:88 ../../library/shutil.rst:199 +#: ../../library/shutil.rst:231 ../../library/shutil.rst:301 +#: ../../library/shutil.rst:418 +msgid "" +"Platform-specific fast-copy syscalls may be used internally in order to copy" +" the file more efficiently. See :ref:`shutil-platform-dependent-efficient-" +"copy-operations` section." +msgstr "" +"可能会在内部使用平台专属的快速拷贝系统调用以更高效地拷贝文件。参见 :ref:`shutil-platform-dependent-efficient-" +"copy-operations` 一节。" + +#: ../../library/shutil.rst:95 +msgid "" +"This exception is raised when :func:`copyfile` or :func:`copytree` attempt " +"to copy a named pipe." +msgstr "此异常会在 :func:`copyfile` 或 :func:`copytree` 试图拷贝命名管道时被引发。" + +#: ../../library/shutil.rst:102 +msgid "" +"This exception is raised if source and destination in :func:`copyfile` are " +"the same file." +msgstr "此异常会在 :func:`copyfile` 中的源和目标为同一文件时被引发。" + +#: ../../library/shutil.rst:110 +msgid "" +"Copy the permission bits from *src* to *dst*. The file contents, owner, and" +" group are unaffected. *src* and *dst* are :term:`path-like objects ` or path names given as strings. If *follow_symlinks* is false," +" and both *src* and *dst* are symbolic links, :func:`copymode` will attempt " +"to modify the mode of *dst* itself (rather than the file it points to). " +"This functionality is not available on every platform; please see " +":func:`copystat` for more information. If :func:`copymode` cannot modify " +"symbolic links on the local platform, and it is asked to do so, it will do " +"nothing and return." +msgstr "" +"将权限位从 *src* 拷贝到 *dst*。文件的内容、所有者和分组将不受影响。 *src* 和 *dst* 均为 :term:`路径型对象 " +"` 或字符串形式的路径名。如果 *follow_symlinks* 为假值,并且 *src* 和 *dst* " +"均为符号链接,则 :func:`copymode` 将尝试修改 *dst* 本身的模式(而不是它所指向的文件)。此功能并不是在所有平台上均可用;请参阅 " +":func:`copystat` 了解详情。如果 :func:`copymode` " +"无法修改本机平台上的符号链接,而它被要求这样做,它将不做任何操作即返回。" + +#: ../../library/shutil.rst:120 ../../library/shutil.rst:193 +msgid "" +"Raises an :ref:`auditing event ` ``shutil.copymode`` with " +"arguments ``src``, ``dst``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``shutil.copymode`` 并附带参数 ``src``, ``dst``。" + +#: ../../library/shutil.rst:122 +msgid "Added *follow_symlinks* argument." +msgstr "加入 *follow_symlinks* 参数。" + +#: ../../library/shutil.rst:127 +msgid "" +"Copy the permission bits, last access time, last modification time, and " +"flags from *src* to *dst*. On Linux, :func:`copystat` also copies the " +"\"extended attributes\" where possible. The file contents, owner, and group" +" are unaffected. *src* and *dst* are :term:`path-like objects ` or path names given as strings." +msgstr "" +"将权限位、最近访问时间、最近修改时间和旗标从 *src* 拷贝到 *dst*。在 Linux 上,:func:`copystat` " +"还会在可能的情况下拷贝“扩展属性”。文件的内容、所有者和分组将不受影响。 *src* 和 *dst* 均为 :term:`路径型对象 ` 或字符串形式的路径名。" + +#: ../../library/shutil.rst:133 +msgid "" +"If *follow_symlinks* is false, and *src* and *dst* both refer to symbolic " +"links, :func:`copystat` will operate on the symbolic links themselves rather" +" than the files the symbolic links refer to—reading the information from the" +" *src* symbolic link, and writing the information to the *dst* symbolic " +"link." +msgstr "" +"如果 *follow_symlinks* 为假值,并且 *src* 和 *dst* 均指向符号链接,:func:`copystat` " +"将作用于符号链接本身而非该符号链接所指向的文件 — 从 *src* 符号链接读取信息,并将信息写入 *dst* 符号链接。" + +#: ../../library/shutil.rst:142 +msgid "" +"Not all platforms provide the ability to examine and modify symbolic links." +" Python itself can tell you what functionality is locally available." +msgstr "并非所有平台都提供检查和修改符号链接的功能。Python 本身可以告诉你哪些功能是在本机上可用的。" + +#: ../../library/shutil.rst:146 +msgid "" +"If ``os.chmod in os.supports_follow_symlinks`` is ``True``, :func:`copystat`" +" can modify the permission bits of a symbolic link." +msgstr "" +"如果 ``os.chmod in os.supports_follow_symlinks`` 为 ``True``,则 :func:`copystat`" +" 可以修改符号链接的权限位。" + +#: ../../library/shutil.rst:150 +msgid "" +"If ``os.utime in os.supports_follow_symlinks`` is ``True``, :func:`copystat`" +" can modify the last access and modification times of a symbolic link." +msgstr "" +"如果 ``os.utime in os.supports_follow_symlinks`` 为 ``True``,则 :func:`copystat`" +" 可以修改符号链接的最近访问和修改时间。" + +#: ../../library/shutil.rst:154 +msgid "" +"If ``os.chflags in os.supports_follow_symlinks`` is ``True``, " +":func:`copystat` can modify the flags of a symbolic link. (``os.chflags`` " +"is not available on all platforms.)" +msgstr "" +"如果 ``os.chflags in os.supports_follow_symlinks`` 为 ``True``,则 " +":func:`copystat` 可以修改符号链接的旗标。 (``os.chflags`` 不是在所有平台上均可用。)" + +#: ../../library/shutil.rst:159 +msgid "" +"On platforms where some or all of this functionality is unavailable, when " +"asked to modify a symbolic link, :func:`copystat` will copy everything it " +"can. :func:`copystat` never returns failure." +msgstr "" +"在此功能部分或全部不可用的平台上,当被要求修改一个符号链接时,:func:`copystat` 将尽量拷贝所有内容。 :func:`copystat` " +"一定不会返回失败信息。" + +#: ../../library/shutil.rst:164 +msgid "Please see :data:`os.supports_follow_symlinks` for more information." +msgstr "更多信息请参阅 :data:`os.supports_follow_symlinks`。" + +#: ../../library/shutil.rst:167 ../../library/shutil.rst:224 +msgid "" +"Raises an :ref:`auditing event ` ``shutil.copystat`` with " +"arguments ``src``, ``dst``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``shutil.copystat`` 并附带参数 ``src``, ``dst``。" + +#: ../../library/shutil.rst:169 +msgid "" +"Added *follow_symlinks* argument and support for Linux extended attributes." +msgstr "添加了 *follow_symlinks* 参数并且支持 Linux 扩展属性。" + +#: ../../library/shutil.rst:174 +msgid "" +"Copies the file *src* to the file or directory *dst*. *src* and *dst* " +"should be :term:`path-like objects ` or strings. If *dst*" +" specifies a directory, the file will be copied into *dst* using the base " +"filename from *src*. If *dst* specifies a file that already exists, it will " +"be replaced. Returns the path to the newly created file." +msgstr "" +"将文件 *src* 拷贝到文件或目录 *dst*。 *src* 和 *dst* 应为 :term:`路径类对象 ` " +"或字符串。如果 *dst* 指定了一个目录,文件将使用 *src* 中的基准文件名拷贝到 *dst* 中。如果 *dst* " +"指定了一个已存在的文件,它将被替换。返回新创建文件所对应的路径。" + +#: ../../library/shutil.rst:180 +msgid "" +"If *follow_symlinks* is false, and *src* is a symbolic link, *dst* will be " +"created as a symbolic link. If *follow_symlinks* is true and *src* is a " +"symbolic link, *dst* will be a copy of the file *src* refers to." +msgstr "" +"如果 *follow_symlinks* 为假值且 *src* 为符号链接,则 *dst* 也将被创建为符号链接。如果 " +"*follow_symlinks* 为真值且 *src* 为符号链接,*dst* 将成为 *src* 所指向的文件的一个副本。" + +#: ../../library/shutil.rst:185 +msgid "" +":func:`~shutil.copy` copies the file data and the file's permission mode " +"(see :func:`os.chmod`). Other metadata, like the file's creation and " +"modification times, is not preserved. To preserve all file metadata from the" +" original, use :func:`~shutil.copy2` instead." +msgstr "" +":func:`~shutil.copy` 会拷贝文件数据和文件的权限模式 (参见 :func:`os.chmod`)。 " +"其他元数据,例如文件的创建和修改时间不会被保留。要保留所有原有的元数据,请改用 :func:`~shutil.copy2`。" + +#: ../../library/shutil.rst:195 +msgid "" +"Added *follow_symlinks* argument. Now returns path to the newly created " +"file." +msgstr "添加了 *follow_symlinks* 参数。现在会返回新创建文件的路径。" + +#: ../../library/shutil.rst:206 +msgid "" +"Identical to :func:`~shutil.copy` except that :func:`copy2` also attempts to" +" preserve file metadata." +msgstr "类似于 :func:`~shutil.copy`,区别在于 :func:`copy2` 还会尝试保留文件的元数据。" + +#: ../../library/shutil.rst:209 +msgid "" +"When *follow_symlinks* is false, and *src* is a symbolic link, :func:`copy2`" +" attempts to copy all metadata from the *src* symbolic link to the newly " +"created *dst* symbolic link. However, this functionality is not available on" +" all platforms. On platforms where some or all of this functionality is " +"unavailable, :func:`copy2` will preserve all the metadata it can; " +":func:`copy2` never raises an exception because it cannot preserve file " +"metadata." +msgstr "" +"当 *follow_symlinks* 为假值,并且 *src* 为符号链接时,:func:`copy2` 会尝试将来自 *src* " +"符号链接的所有元数据拷贝到新创建的 *dst* 符号链接。但是,此功能不是在所有平台上均可用。 " +"在此功能部分或全部不可用的平台上,:func:`copy2` 将尽量保留所有元数据,:func:`copy2` " +"一定不会由于无法保留文件元数据而引发异常。" + +#: ../../library/shutil.rst:218 +msgid "" +":func:`copy2` uses :func:`copystat` to copy the file metadata. Please see " +":func:`copystat` for more information about platform support for modifying " +"symbolic link metadata." +msgstr "" +":func:`copy2` 会使用 :func:`copystat` 来拷贝文件元数据。请参阅 :func:`copystat` " +"了解有关修改符号链接元数据的平台支持的更多信息。" + +#: ../../library/shutil.rst:226 +msgid "" +"Added *follow_symlinks* argument, try to copy extended file system " +"attributes too (currently Linux only). Now returns path to the newly created" +" file." +msgstr "添加了 *follow_symlinks* 参数,还会尝试拷贝扩展文件系统属性(目前仅限 Linux)。现在会返回新创建文件的路径。" + +#: ../../library/shutil.rst:238 +msgid "" +"This factory function creates a function that can be used as a callable for " +":func:`copytree`\\'s *ignore* argument, ignoring files and directories that " +"match one of the glob-style *patterns* provided. See the example below." +msgstr "" +"这个工厂函数会创建一个函数,它可被用作 :func:`copytree` 的 *ignore* 可调用对象参数,以忽略那些匹配所提供的 glob 风格的" +" *patterns* 之一的文件和目录。参见以下示例。" + +#: ../../library/shutil.rst:247 +msgid "" +"Recursively copy an entire directory tree rooted at *src* to a directory " +"named *dst* and return the destination directory. All intermediate " +"directories needed to contain *dst* will also be created by default." +msgstr "" +"递归地将以 *src* 为根起点的整个目录树拷贝到名为 *dst* 的目录并返回目标目录。所需的包含 *dst* 的中间目录在默认情况下也将被创建。" + +#: ../../library/shutil.rst:251 +msgid "" +"Permissions and times of directories are copied with :func:`copystat`, " +"individual files are copied using :func:`~shutil.copy2`." +msgstr "目录的权限和时间会通过 :func:`copystat` 来拷贝,单个文件则会使用 :func:`~shutil.copy2` 来拷贝。" + +#: ../../library/shutil.rst:254 +msgid "" +"If *symlinks* is true, symbolic links in the source tree are represented as " +"symbolic links in the new tree and the metadata of the original links will " +"be copied as far as the platform allows; if false or omitted, the contents " +"and metadata of the linked files are copied to the new tree." +msgstr "" +"如果 *symlinks* " +"为真值,源目录树中的符号链接会在新目录树中表示为符号链接,并且原链接的元数据在平台允许的情况下也会被拷贝;如果为假值或省略,则会将被链接文件的内容和元数据拷贝到新目录树。" + +#: ../../library/shutil.rst:259 +msgid "" +"When *symlinks* is false, if the file pointed to by the symlink doesn't " +"exist, an exception will be added in the list of errors raised in an " +":exc:`Error` exception at the end of the copy process. You can set the " +"optional *ignore_dangling_symlinks* flag to true if you want to silence this" +" exception. Notice that this option has no effect on platforms that don't " +"support :func:`os.symlink`." +msgstr "" +"当 *symlinks* 为假值时,如果符号链接所指向的文件不存在,则会在拷贝进程的末尾将一个异常添加到 :exc:`Error` " +"异常中的被引发错误列表。如果你希望屏蔽此异常则可以将可选的 *ignore_dangling_symlinks* 旗标设为真值。请注意此选项在不支持 " +":func:`os.symlink` 的平台上将不起作用。" + +#: ../../library/shutil.rst:266 +msgid "" +"If *ignore* is given, it must be a callable that will receive as its " +"arguments the directory being visited by :func:`copytree`, and a list of its" +" contents, as returned by :func:`os.listdir`. Since :func:`copytree` is " +"called recursively, the *ignore* callable will be called once for each " +"directory that is copied. The callable must return a sequence of directory " +"and file names relative to the current directory (i.e. a subset of the items" +" in its second argument); these names will then be ignored in the copy " +"process. :func:`ignore_patterns` can be used to create such a callable that" +" ignores names based on glob-style patterns." +msgstr "" +"如果给出了 *ignore*,它必须是一个可调用对象,该对象将接受 :func:`copytree` 所访问的目录以及 " +":func:`os.listdir` 所返回的目录内容列表作为其参数。由于 :func:`copytree` 是递归地被调用的,*ignore* " +"可调用对象对于每个被拷贝目录都将被调用一次。 " +"该可调用对象必须返回一个相对于当前目录的目录和文件名序列(即其第二个参数的子集);随后这些名称将在拷贝进程中被忽略。 " +":func:`ignore_patterns` 可被用于创建这种基于 glob 风格模式来忽略特定名称的可调用对象。" + +#: ../../library/shutil.rst:276 +msgid "" +"If exception(s) occur, an :exc:`Error` is raised with a list of reasons." +msgstr "如果发生了(一个或多个)异常,将引发一个附带原因列表的 :exc:`Error`。" + +#: ../../library/shutil.rst:278 +msgid "" +"If *copy_function* is given, it must be a callable that will be used to copy" +" each file. It will be called with the source path and the destination path " +"as arguments. By default, :func:`~shutil.copy2` is used, but any function " +"that supports the same signature (like :func:`~shutil.copy`) can be used." +msgstr "" +"如果给出了 *copy_function*,它必须是一个将被用来拷贝每个文件的可调用对象。它在被调用时会将源路径和目标路径作为参数传入。 " +"默认情况下,:func:`~shutil.copy2` 将被使用,但任何支持同样签名(与 :func:`~shutil.copy` 一致)都可以使用。" + +#: ../../library/shutil.rst:283 +msgid "" +"If *dirs_exist_ok* is false (the default) and *dst* already exists, a " +":exc:`FileExistsError` is raised. If *dirs_exist_ok* is true, the copying " +"operation will continue if it encounters existing directories, and files " +"within the *dst* tree will be overwritten by corresponding files from the " +"*src* tree." +msgstr "" +"如果 *dirs_exist_ok* 为(默认的)假值且 *dst* 已存在,则会引发 :exc:`FileExistsError`。如果 " +"*dirs_exist_ok* 为真值,则如果拷贝操作遇到已存在的目录时将继续执行,并且在 *dst* 目录树中的文件将被 *src* " +"目录树中对应的文件所覆盖。" + +#: ../../library/shutil.rst:289 +msgid "" +"Raises an :ref:`auditing event ` ``shutil.copytree`` with " +"arguments ``src``, ``dst``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``shutil.copytree`` 并附带参数 ``src``, ``dst``。" + +#: ../../library/shutil.rst:291 +msgid "" +"Added the *copy_function* argument to be able to provide a custom copy " +"function. Added the *ignore_dangling_symlinks* argument to silence dangling " +"symlinks errors when *symlinks* is false." +msgstr "" +"添加了 *copy_function* 参数以允许提供定制的拷贝函数。添加了 *ignore_dangling_symlinks* 参数以便在 " +"*symlinks* 为假值时屏蔽目标不存在的符号链接。" + +#: ../../library/shutil.rst:297 +msgid "Copy metadata when *symlinks* is false. Now returns *dst*." +msgstr "当 *symlinks* 为假值时拷贝元数据。现在会返回 *dst*。" + +#: ../../library/shutil.rst:306 +msgid "Added the *dirs_exist_ok* parameter." +msgstr "增加了 *dirs_exist_ok* 形参。" + +#: ../../library/shutil.rst:313 +msgid "" +"Delete an entire directory tree; *path* must point to a directory (but not a" +" symbolic link to a directory). If *ignore_errors* is true, errors " +"resulting from failed removals will be ignored; if false or omitted, such " +"errors are handled by calling a handler specified by *onexc* or *onerror* " +"or, if both are omitted, exceptions are propagated to the caller." +msgstr "" +"删除一个完整的目录树;*path* 必须指向一个目录(但不能是一个目录的符号链接)。如果 *ignore_errors* " +"为真值,则删除失败导致的错误将被忽略;如果为假值或被省略,则此类错误将通过调用由 *onexc* 或 *onerror* " +"所指定的处理器来处理,或者如果此参数被省略,异常将被传播给调用方。" + +#: ../../library/shutil.rst:319 +msgid "" +"This function can support :ref:`paths relative to directory descriptors " +"`." +msgstr "本函数支持 :ref:`基于目录描述符的相对路径 `。" + +#: ../../library/shutil.rst:324 +msgid "" +"On platforms that support the necessary fd-based functions a symlink attack " +"resistant version of :func:`rmtree` is used by default. On other platforms," +" the :func:`rmtree` implementation is susceptible to a symlink attack: given" +" proper timing and circumstances, attackers can manipulate symlinks on the " +"filesystem to delete files they wouldn't be able to access otherwise. " +"Applications can use the :data:`rmtree.avoids_symlink_attacks` function " +"attribute to determine which case applies." +msgstr "" +"在支持必要的基于 fd 的函数的平台上,默认会使用 :func:`rmtree` 的可防御符号链接攻击的版本。 " +"在其他平台上,:func:`rmtree` " +"较易遭受符号链接攻击:给定适当的时间和环境,攻击者可以操纵文件系统中的符号链接来删除他们在其他情况下无法访问的文件。应用程序可以使用 " +":data:`rmtree.avoids_symlink_attacks` 函数属性来确定此类情况具体是哪一些。" + +#: ../../library/shutil.rst:332 +msgid "" +"If *onexc* is provided, it must be a callable that accepts three parameters:" +" *function*, *path*, and *excinfo*." +msgstr "如果提供了 *onexc*,它必须为接受三个形参的可调用对象:*function*, *path* 和 *excinfo*。" + +#: ../../library/shutil.rst:335 +msgid "" +"The first parameter, *function*, is the function which raised the exception;" +" it depends on the platform and implementation. The second parameter, " +"*path*, will be the path name passed to *function*. The third parameter, " +"*excinfo*, is the exception that was raised. Exceptions raised by *onexc* " +"will not be caught." +msgstr "" +"第一个形参 *function* 是引发异常的函数;它依赖于具体的平台和实现。第二个形参 *path* 将为传递给 *function* 的路径名称。 " +"第三个形参 *excinfo* 是被引发的异常。由 *onexc* 所引发的异常将不会被捕获。" + +#: ../../library/shutil.rst:341 +msgid "" +"The deprecated *onerror* is similar to *onexc*, except that the third " +"parameter it receives is the tuple returned from :func:`sys.exc_info`." +msgstr "" +"已弃用的 *onerror* 与 *onexc* 类似,区别在于它接受的第三个形参是从 :func:`sys.exc_info` 返回的元组。" + +#: ../../library/shutil.rst:345 +msgid "" +":ref:`shutil-rmtree-example` for an example of handling the removal of a " +"directory tree that contains read-only files." +msgstr ":ref:`shutil-rmtree-example` 是一个处理删除包含只读文件的目录树的示例。" + +#: ../../library/shutil.rst:348 +msgid "" +"Raises an :ref:`auditing event ` ``shutil.rmtree`` with arguments " +"``path``, ``dir_fd``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``shutil.rmtree`` 并附带参数 ``path``, ``dir_fd``。" + +#: ../../library/shutil.rst:350 +msgid "" +"Added a symlink attack resistant version that is used automatically if " +"platform supports fd-based functions." +msgstr "添加了一个防御符号链接攻击的版本,如果平台支持基于 fd 的函数就会被使用。" + +#: ../../library/shutil.rst:354 +msgid "" +"On Windows, will no longer delete the contents of a directory junction " +"before removing the junction." +msgstr "在 Windows 上将不会再在移除连接之前删除目录连接中的内容。" + +#: ../../library/shutil.rst:358 +msgid "Added the *dir_fd* parameter." +msgstr "添加了 *dir_fd* 参数。" + +#: ../../library/shutil.rst:361 +msgid "Added the *onexc* parameter, deprecated *onerror*." +msgstr "增加了 *onexc* 形参,弃用了 *onerror*。" + +#: ../../library/shutil.rst:364 +msgid "" +":func:`!rmtree` now ignores :exc:`FileNotFoundError` exceptions for all but " +"the top-level path. Exceptions other than :exc:`OSError` and subclasses of " +":exc:`!OSError` are now always propagated to the caller." +msgstr "" +"现在 :func:`!rmtree` 会忽略最高层级路径以外所有路径的 :exc:`FileNotFoundError` 异常。 " +":exc:`OSError` 及 :exc:`!OSError` 的子类以外的异常现在总是会被传播给调用方。" + +#: ../../library/shutil.rst:372 +msgid "" +"Indicates whether the current platform and implementation provides a symlink" +" attack resistant version of :func:`rmtree`. Currently this is only true " +"for platforms supporting fd-based directory access functions." +msgstr "" +"指明当前平台和实现是否提供防御符号链接攻击的 :func:`rmtree` 版本。目前它仅在平台支持基于 fd 的目录访问函数时才返回真值。" + +#: ../../library/shutil.rst:381 +msgid "" +"Recursively move a file or directory (*src*) to another location and return " +"the destination." +msgstr "递归地将一个文件或目录 (*src*) 移到另一位置并返回目标位置。" + +#: ../../library/shutil.rst:384 +msgid "" +"If *dst* is an existing directory or a symlink to a directory, then *src* is" +" moved inside that directory. The destination path in that directory must " +"not already exist." +msgstr "如果 *dst* 为已存在的目录或指向目录的符号链接,则 *src* 将被移到该目录中。目标路径在该目录中不能已存在。" + +#: ../../library/shutil.rst:388 +msgid "" +"If *dst* already exists but is not a directory, it may be overwritten " +"depending on :func:`os.rename` semantics." +msgstr "如果 *dst* 已存在但不是一个目录,则它可能会被覆盖,具体取决于 :func:`os.rename` 的语义。" + +#: ../../library/shutil.rst:391 +msgid "" +":func:`os.rename` is preferably used internally when *src* and the " +"destination are on the same filesystem. In case :func:`os.rename` fails due " +"to :exc:`OSError` (e.g. the user has write permission to the destination " +"file but not to its parent directory), this method falls back to using " +"*copy_function*, in which case *src* is copied to the destination using " +"*copy_function* and then removed." +msgstr "" + +#: ../../library/shutil.rst:397 +msgid "" +"In case of symlinks, a new symlink pointing to the target of *src* will be " +"created in or as the destination, and *src* will be removed." +msgstr "" + +#: ../../library/shutil.rst:400 +msgid "" +"If *copy_function* is given, it must be a callable that takes two arguments," +" *src* and the destination, and will be used to copy *src* to the " +"destination if :func:`os.rename` cannot be used. If the source is a " +"directory, :func:`copytree` is called, passing it the *copy_function*. The " +"default *copy_function* is :func:`copy2`. Using :func:`~shutil.copy` as the" +" *copy_function* allows the move to succeed when it is not possible to also " +"copy the metadata, at the expense of not copying any of the metadata." +msgstr "" +"如果给出了 *copy_function*,则它必须为接受两个参数 *src* 和目标位置的可调用对象,并将在 :func:`os.rename` " +"无法使用时被用来将 *src* 拷贝到目标位置。如果源是一个目录,则会调用 :func:`copytree`,并向它传入 " +"*copy_function*。默认的 *copy_function* 是 :func:`copy2`。使用 :func:`~shutil.copy` " +"作为 *copy_function* 将允许在无法附带拷贝元数据时让移动操作成功执行,但其代价是不拷贝任何元数据。" + +#: ../../library/shutil.rst:408 +msgid "" +"Raises an :ref:`auditing event ` ``shutil.move`` with arguments " +"``src``, ``dst``." +msgstr "引发一个 :ref:`审计事件 ` ``shutil.move`` 并附带参数 ``src``, ``dst``。" + +#: ../../library/shutil.rst:410 +msgid "" +"Added explicit symlink handling for foreign filesystems, thus adapting it to" +" the behavior of GNU's :program:`mv`. Now returns *dst*." +msgstr "为异类文件系统添加了显式的符号链接处理,以便使它适应 GNU 的 :program:`mv` 的行为。现在会返回 *dst*。" + +#: ../../library/shutil.rst:415 +msgid "Added the *copy_function* keyword argument." +msgstr "增加了 *copy_function* 关键字参数。" + +#: ../../library/shutil.rst:423 +msgid "Accepts a :term:`path-like object` for both *src* and *dst*." +msgstr "接受一个 :term:`path-like object` 作为 *src* 和 *dst*。" + +#: ../../library/shutil.rst:428 +msgid "" +"Return disk usage statistics about the given path as a :term:`named tuple` " +"with the attributes *total*, *used* and *free*, which are the amount of " +"total, used and free space, in bytes. *path* may be a file or a directory." +msgstr "" +"返回给定路径的磁盘使用统计数据,形式为一个 :term:`named tuple`,其中包含 *total*, *used* 和 *free* " +"属性,分别表示总计、已使用和未使用空间的字节数。 *path* 可以是一个文件或是一个目录。" + +#: ../../library/shutil.rst:435 +msgid "" +"On Unix filesystems, *path* must point to a path within a **mounted** " +"filesystem partition. On those platforms, CPython doesn't attempt to " +"retrieve disk usage information from non-mounted filesystems." +msgstr "" +"在 Unix 文件系统中,*path* 必须指向一个 **已挂载** 文件系统分区中的路径。在这些平台上,CPython " +"不会尝试从未挂载的文件系统中获取磁盘使用信息。" + +#: ../../library/shutil.rst:441 +msgid "On Windows, *path* can now be a file or directory." +msgstr "在 Windows 上,*path* 现在可以是一个文件或目录。" + +#: ../../library/shutil.rst:444 ../../library/shutil.rst:458 +msgid "Availability" +msgstr "Availability" + +#: ../../library/shutil.rst:449 +msgid "Change owner *user* and/or *group* of the given *path*." +msgstr "修改给定 *path* 的所有者 *user* 和/或 *group*。" + +#: ../../library/shutil.rst:451 +msgid "" +"*user* can be a system user name or a uid; the same applies to *group*. At " +"least one argument is required." +msgstr "*user* 可以是一个系统用户名或 uid;*group* 同样如此。要求至少有一个参数。" + +#: ../../library/shutil.rst:454 +msgid "See also :func:`os.chown`, the underlying function." +msgstr "另请参阅下层的函数 :func:`os.chown`。" + +#: ../../library/shutil.rst:456 +msgid "" +"Raises an :ref:`auditing event ` ``shutil.chown`` with arguments " +"``path``, ``user``, ``group``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``shutil.chown`` 并附带参数 ``path``, ``user``, " +"``group``." + +#: ../../library/shutil.rst:462 +msgid "Added *dir_fd* and *follow_symlinks* parameters." +msgstr "增加了 *dir_fd* 和 *follow_symlinks* 形参。" + +#: ../../library/shutil.rst:468 +msgid "" +"Return the path to an executable which would be run if the given *cmd* was " +"called. If no *cmd* would be called, return ``None``." +msgstr "返回当给定的 *cmd* 被调用时将要运行的可执行文件的路径。如果没有 *cmd* 会被调用则返回 ``None``。" + +#: ../../library/shutil.rst:471 +msgid "" +"*mode* is a permission mask passed to :func:`os.access`, by default " +"determining if the file exists and is executable." +msgstr "*mode* 是一个传递给 :func:`os.access` 的权限掩码,在默认情况下将确定文件是否存在并且为可执行文件。" + +#: ../../library/shutil.rst:474 +msgid "" +"*path* is a \"``PATH`` string\" specifying the directories to look in, " +"delimited by :data:`os.pathsep`. When no *path* is specified, the " +":envvar:`PATH` environment variable is read from :data:`os.environ`, falling" +" back to :data:`os.defpath` if it is not set." +msgstr "" +"*path* 是一个指明要查找的目录的 \"``PATH`` 字符串\",由 :data:`os.pathsep` 分隔。当未指定 *path* " +"时,将从 :data:`os.environ` 读取 :envvar:`PATH` 环境变量,如果其未被设置则将回退至 " +":data:`os.defpath`." + +#: ../../library/shutil.rst:479 +msgid "" +"If *cmd* contains a directory component, :func:`!which` only checks the " +"specified path directly and does not search the directories listed in *path*" +" or in the system's :envvar:`PATH` environment variable." +msgstr "" +"如果 *cmd* 包含目录部分,则 :func:`!which` 仅直接检查指定的路径而不搜索在 *path* 或系统 :envvar:`PATH` " +"环境变量中列出的目录。" + +#: ../../library/shutil.rst:483 +msgid "" +"On Windows, the current directory is prepended to the *path* if *mode* does " +"not include ``os.X_OK``. When the *mode* does include ``os.X_OK``, the " +"Windows API ``NeedCurrentDirectoryForExePathW`` will be consulted to " +"determine if the current directory should be prepended to *path*. To avoid " +"consulting the current working directory for executables: set the " +"environment variable ``NoDefaultCurrentDirectoryInExePath``." +msgstr "" +"在 Windows 上,如果 *mode* 不包括 ``os.X_OK`` 则会将当前目录添加到 *path* 中。当 *mode* 包括 " +"``os.X_OK`` 时,则将通过 Windows API ``NeedCurrentDirectoryForExePathW`` " +"来确定当前目录是否应当添加到 *path* 中。要避免在当前工作目录下查找可执行文件:可设置 " +"``NoDefaultCurrentDirectoryInExePath`` 环境变量。" + +#: ../../library/shutil.rst:490 +msgid "" +"Also on Windows, the :envvar:`PATHEXT` environment variable is used to " +"resolve commands that may not already include an extension. For example, if " +"you call ``shutil.which(\"python\")``, :func:`which` will search ``PATHEXT``" +" to know that it should look for ``python.exe`` within the *path* " +"directories. For example, on Windows::" +msgstr "" +"在 Windows 上,还会使用 :envvar:`PATHEXT` 环境变量来处理可能尚未包括某个扩展的命令。举例来说,如果你调用 " +"``shutil.which(\"python\")``,:func:`which` 将搜索 ``PATHEXT`` 以获知应当在 *path* " +"的目录中查找 ``python.exe``。例如,在 Windows 上::" + +#: ../../library/shutil.rst:496 +msgid "" +">>> shutil.which(\"python\")\n" +"'C:\\\\Python33\\\\python.EXE'" +msgstr "" +">>> shutil.which(\"python\")\n" +"'C:\\\\Python33\\\\python.EXE'" + +#: ../../library/shutil.rst:499 +msgid "" +"This is also applied when *cmd* is a path that contains a directory " +"component::" +msgstr "这也适用于当 *cmd* 是一个包含目录组成部分路径的情况::" + +#: ../../library/shutil.rst:502 +msgid "" +">>> shutil.which(\"C:\\\\Python33\\\\python\")\n" +"'C:\\\\Python33\\\\python.EXE'" +msgstr "" +">>> shutil.which(\"C:\\\\Python33\\\\python\")\n" +"'C:\\\\Python33\\\\python.EXE'" + +#: ../../library/shutil.rst:507 +msgid "" +"The :class:`bytes` type is now accepted. If *cmd* type is :class:`bytes`, " +"the result type is also :class:`bytes`." +msgstr "" +"现在可以接受 :class:`bytes` 类型。如果 *cmd* 的类型为 :class:`bytes`,结果的类型也将为 " +":class:`bytes`." + +#: ../../library/shutil.rst:511 +msgid "" +"On Windows, the current directory is no longer prepended to the search path " +"if *mode* includes ``os.X_OK`` and WinAPI " +"``NeedCurrentDirectoryForExePathW(cmd)`` is false, else the current " +"directory is prepended even if it is already in the search path; ``PATHEXT``" +" is used now even when *cmd* includes a directory component or ends with an " +"extension that is in ``PATHEXT``; and filenames that have no extension can " +"now be found." +msgstr "" +"在 Windows 上,如果 *mode* 包括 ``os.X_OK`` 且 WinAPI " +"``NeedCurrentDirectoryForExePathW(cmd)`` " +"为假值则不会再将当前目录添加到搜索路径中,否则即使当前目录已经在搜索路径中仍会再次添加它;现在 ``PATHEXT`` 即使当 *cmd* " +"包括目录组成部分或以 ``PATHEXT`` 中的扩展名结束时仍然会被使用;并且没有扩展名的文件名现在也能被找到。" + +#: ../../library/shutil.rst:522 +msgid "" +"This exception collects exceptions that are raised during a multi-file " +"operation. For :func:`copytree`, the exception argument is a list of " +"3-tuples (*srcname*, *dstname*, *exception*)." +msgstr "" +"此异常会收集在多文件操作期间所引发的异常。对于 :func:`copytree`,此异常参数将是一个由三元组 (*srcname*, " +"*dstname*, *exception*) 构成的列表。" + +#: ../../library/shutil.rst:529 +msgid "Platform-dependent efficient copy operations" +msgstr "依赖于具体平台的高效拷贝操作" + +#: ../../library/shutil.rst:531 +msgid "" +"Starting from Python 3.8, all functions involving a file copy " +"(:func:`copyfile`, :func:`~shutil.copy`, :func:`copy2`, :func:`copytree`, " +"and :func:`move`) may use platform-specific \"fast-copy\" syscalls in order " +"to copy the file more efficiently (see :issue:`33671`). \"fast-copy\" means " +"that the copying operation occurs within the kernel, avoiding the use of " +"userspace buffers in Python as in \"``outfd.write(infd.read())``\"." +msgstr "" +"从 Python 3.8 开始,所有涉及文件拷贝的函数 (:func:`copyfile`, :func:`~shutil.copy`, " +":func:`copy2`, :func:`copytree` 以及 :func:`move`) 将会使用平台专属的 \"fast-copy\" " +"系统调用以便更高效地拷贝文件 (参见 :issue:`33671`)。 \"fast-copy\" 意味着拷贝操作将发生于内核之中,避免像在 " +"\"``outfd.write(infd.read())``\" 中那样使用 Python 用户空间的缓冲区。" + +#: ../../library/shutil.rst:539 +msgid "On macOS `fcopyfile`_ is used to copy the file content (not metadata)." +msgstr "在 macOS 上将会使用 `fcopyfile`_ 来拷贝文件内容(不含元数据)。" + +#: ../../library/shutil.rst:541 +msgid "On Linux :func:`os.copy_file_range` or :func:`os.sendfile` is used." +msgstr "在 Linux 上将会使用 :func:`os.copy_file_range` 或 :func:`os.sendfile`。" + +#: ../../library/shutil.rst:543 +msgid "On Solaris :func:`os.sendfile` is used." +msgstr "在 Solaris 上将使用 :func:`os.sendfile`。" + +#: ../../library/shutil.rst:545 +msgid "" +"On Windows :func:`shutil.copyfile` uses a bigger default buffer size (1 MiB " +"instead of 64 KiB) and a :func:`memoryview`-based variant of " +":func:`shutil.copyfileobj` is used." +msgstr "" +"在 Windows 上 :func:`shutil.copyfile` 将会使用更大的默认缓冲区(1 MiB 而非 64 KiB)并且会使用基于 " +":func:`memoryview` 的 :func:`shutil.copyfileobj` 变种形式。" + +#: ../../library/shutil.rst:549 +msgid "" +"If the fast-copy operation fails and no data was written in the destination " +"file then shutil will silently fall back to less efficient " +":func:`copyfileobj` function internally." +msgstr "" +"如果快速拷贝操作失败并且没有数据被写入目标文件,则 shutil 将在内部静默地回退到使用效率较低的 :func:`copyfileobj` 函数。" + +#: ../../library/shutil.rst:555 +msgid "Solaris now uses :func:`os.sendfile`." +msgstr "Solaris 现在将使用 :func:`os.sendfile`。" + +#: ../../library/shutil.rst:558 +msgid "" +"Copy-on-write or server-side copy may be used internally via " +":func:`os.copy_file_range` on supported Linux filesystems." +msgstr "在受支持的 Linux 文件系统上可能通过 :func:`os.copy_file_range` 在内部使用写入时拷贝或服务端拷贝。" + +#: ../../library/shutil.rst:565 +msgid "copytree example" +msgstr "copytree 示例" + +#: ../../library/shutil.rst:567 +msgid "An example that uses the :func:`ignore_patterns` helper::" +msgstr "一个使用 :func:`ignore_patterns` 辅助函数的例子::" + +#: ../../library/shutil.rst:569 +msgid "" +"from shutil import copytree, ignore_patterns\n" +"\n" +"copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*'))" +msgstr "" +"from shutil import copytree, ignore_patterns\n" +"\n" +"copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*'))" + +#: ../../library/shutil.rst:573 +msgid "" +"This will copy everything except ``.pyc`` files and files or directories " +"whose name starts with ``tmp``." +msgstr "这将会拷贝除 ``.pyc`` 文件和以 ``tmp`` 打头的文件或目录以外的所有条目。" + +#: ../../library/shutil.rst:576 +msgid "" +"Another example that uses the *ignore* argument to add a logging call::" +msgstr "另一个使用 *ignore* 参数来添加记录调用的例子::" + +#: ../../library/shutil.rst:578 +msgid "" +"from shutil import copytree\n" +"import logging\n" +"\n" +"def _logpath(path, names):\n" +" logging.info('Working in %s', path)\n" +" return [] # nothing will be ignored\n" +"\n" +"copytree(source, destination, ignore=_logpath)" +msgstr "" +"from shutil import copytree\n" +"import logging\n" +"\n" +"def _logpath(path, names):\n" +" logging.info('Working in %s', path)\n" +" return [] # nothing will be ignored\n" +"\n" +"copytree(source, destination, ignore=_logpath)" + +#: ../../library/shutil.rst:591 +msgid "rmtree example" +msgstr "rmtree 示例" + +#: ../../library/shutil.rst:593 +msgid "" +"This example shows how to remove a directory tree on Windows where some of " +"the files have their read-only bit set. It uses the onexc callback to clear " +"the readonly bit and reattempt the remove. Any subsequent failure will " +"propagate. ::" +msgstr "" +"这个例子演示了如何在 Windows 上删除一个目录树,其中部分文件设置了只读属性位。它会使用 onexc 回调函数来清除只读属性并再次尝试删除。 " +"任何后续的失败都将被传播。 ::" + +#: ../../library/shutil.rst:598 +msgid "" +"import os, stat\n" +"import shutil\n" +"\n" +"def remove_readonly(func, path, _):\n" +" \"Clear the readonly bit and reattempt the removal\"\n" +" os.chmod(path, stat.S_IWRITE)\n" +" func(path)\n" +"\n" +"shutil.rmtree(directory, onexc=remove_readonly)" +msgstr "" +"import os, stat\n" +"import shutil\n" +"\n" +"def remove_readonly(func, path, _):\n" +" \"Clear the readonly bit and reattempt the removal\"\n" +" os.chmod(path, stat.S_IWRITE)\n" +" func(path)\n" +"\n" +"shutil.rmtree(directory, onexc=remove_readonly)" + +#: ../../library/shutil.rst:611 +msgid "Archiving operations" +msgstr "归档操作" + +#: ../../library/shutil.rst:615 +msgid "Added support for the *xztar* format." +msgstr "添加了对 *xztar* 格式的支持。" + +#: ../../library/shutil.rst:619 +msgid "" +"High-level utilities to create and read compressed and archived files are " +"also provided. They rely on the :mod:`zipfile` and :mod:`tarfile` modules." +msgstr "本模块也提供了用于创建和读取压缩和归档文件的高层级工具。它们依赖于 :mod:`zipfile` 和 :mod:`tarfile` 模块。" + +#: ../../library/shutil.rst:624 +msgid "Create an archive file (such as zip or tar) and return its name." +msgstr "创建一个归档文件(例如 zip 或 tar)并返回其名称。" + +#: ../../library/shutil.rst:626 +msgid "" +"*base_name* is the name of the file to create, including the path, minus any" +" format-specific extension." +msgstr "*base_name* 是要创建的文件的名称,包括路径,去除任何格式专属的扩展名。" + +#: ../../library/shutil.rst:629 +msgid "" +"*format* is the archive format: one of \"zip\" (if the :mod:`zlib` module is" +" available), \"tar\", \"gztar\" (if the :mod:`zlib` module is available), " +"\"bztar\" (if the :mod:`bz2` module is available), \"xztar\" (if the " +":mod:`lzma` module is available), or \"zstdtar\" (if the " +":mod:`compression.zstd` module is available)." +msgstr "" +"*format* 是归档格式:为 \"zip\" (如果 :mod:`zlib` 模块可用), \"tar\", \"gztar\" (如果 " +":mod:`zlib` 模块可用), \"bztar\" (如果 :mod:`bz2` 模块可用), \"xztar\" (如果 :mod:`lzma`" +" 模块可用) 或 \"zstdtar\" (如果 :mod:`compression.zstd` 模块可用) 中的一个。" + +#: ../../library/shutil.rst:635 +msgid "" +"*root_dir* is a directory that will be the root directory of the archive, " +"all paths in the archive will be relative to it; for example, we typically " +"chdir into *root_dir* before creating the archive." +msgstr "" +"*root_dir* 是一个目录,它将作为归档文件的根目录,归档中的所有路径都将是它的相对路径;例如,我们通常会在创建归档之前用 chdir 命令切换到" +" *root_dir*." + +#: ../../library/shutil.rst:639 +msgid "" +"*base_dir* is the directory where we start archiving from; i.e. *base_dir* " +"will be the common prefix of all files and directories in the archive. " +"*base_dir* must be given relative to *root_dir*. See :ref:`shutil-" +"archiving-example-with-basedir` for how to use *base_dir* and *root_dir* " +"together." +msgstr "" +"*base_dir* 是我们要执行归档的起始目录;也就是说 *base_dir* 将成为归档中所有文件和目录共有的路径前缀。 *base_dir* " +"必须相对于 *root_dir* 给出。请参阅 :ref:`shutil-archiving-example-with-basedir` " +"了解如何同时使用 *base_dir* 和 *root_dir*。" + +#: ../../library/shutil.rst:645 +msgid "*root_dir* and *base_dir* both default to the current directory." +msgstr "*root_dir* 和 *base_dir* 默认均为当前目录。" + +#: ../../library/shutil.rst:647 +msgid "" +"If *dry_run* is true, no archive is created, but the operations that would " +"be executed are logged to *logger*." +msgstr "如果 *dry_run* 为真值,则不会创建归档文件,但将要被执行的操作会被记录到 *logger*。" + +#: ../../library/shutil.rst:650 +msgid "" +"*owner* and *group* are used when creating a tar archive. By default, uses " +"the current owner and group." +msgstr "*owner* 和 *group* 将在创建 tar 归档文件时被使用。默认会使用当前的所有者和分组。" + +#: ../../library/shutil.rst:653 +msgid "" +"*logger* must be an object compatible with :pep:`282`, usually an instance " +"of :class:`logging.Logger`." +msgstr "*logger* 必须是一个兼容 :pep:`282` 的对象,通常为 :class:`logging.Logger` 的实例。" + +#: ../../library/shutil.rst:656 +msgid "The *verbose* argument is unused and deprecated." +msgstr "*verbose* 参数已不再使用并进入弃用状态。" + +#: ../../library/shutil.rst:658 +msgid "" +"Raises an :ref:`auditing event ` ``shutil.make_archive`` with " +"arguments ``base_name``, ``format``, ``root_dir``, ``base_dir``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``shutil.make_archive`` 并附带参数 ``base_name``, " +"``format``, ``root_dir``, ``base_dir``." + +#: ../../library/shutil.rst:662 +msgid "" +"This function is not thread-safe when custom archivers registered with " +":func:`register_archive_format` do not support the *root_dir* argument. In " +"this case it temporarily changes the current working directory of the " +"process to *root_dir* to perform archiving." +msgstr "" +"此函数在通过 :func:`register_archive_format` 注册的自定义归档程序不支持 *root_dir* 参数时不是线程安全的。 " +"在这种情况下它会临时改变进程的当前工作目录到 *root_dir* 来执行归档操作。" + +#: ../../library/shutil.rst:668 +msgid "" +"The modern pax (POSIX.1-2001) format is now used instead of the legacy GNU " +"format for archives created with ``format=\"tar\"``." +msgstr "" +"现在对于通过 ``format=\"tar\"`` 创建的归档文件将使用新式的 pax (POSIX.1-2001) 格式而非旧式的 GNU 格式。" + +#: ../../library/shutil.rst:672 +msgid "" +"This function is now made thread-safe during creation of standard ``.zip`` " +"and tar archives." +msgstr "目前此函数在创建标准 ``.zip`` 和 tar 归档文件期间会确保是线程安全的。" + +#: ../../library/shutil.rst:678 +msgid "" +"Return a list of supported formats for archiving. Each element of the " +"returned sequence is a tuple ``(name, description)``." +msgstr "返回支持的归档格式列表。所返回序列中的每个元素为一个元组 ``(name, description)``。" + +#: ../../library/shutil.rst:681 ../../library/shutil.rst:798 +msgid "By default :mod:`!shutil` provides these formats:" +msgstr "默认情况下 :mod:`!shutil` 提供下列格式:" + +#: ../../library/shutil.rst:683 +msgid "*zip*: ZIP file (if the :mod:`zlib` module is available)." +msgstr "*zip*: ZIP 文件(如果 :mod:`zlib` 模块可用)。" + +#: ../../library/shutil.rst:684 +msgid "" +"*tar*: Uncompressed tar file. Uses POSIX.1-2001 pax format for new archives." +msgstr "*tar*: 未压缩的 tar 文件。对于新归档文件将使用 POSIX.1-2001 pax 格式。" + +#: ../../library/shutil.rst:685 ../../library/shutil.rst:803 +msgid "*gztar*: gzip'ed tar-file (if the :mod:`zlib` module is available)." +msgstr "*gztar*: gzip 压缩的 tar 文件(如果 :mod:`zlib` 模块可用)。" + +#: ../../library/shutil.rst:686 ../../library/shutil.rst:804 +msgid "*bztar*: bzip2'ed tar-file (if the :mod:`bz2` module is available)." +msgstr "*bztar*: bzip2 压缩的 tar 文件(如果 :mod:`bz2` 模块可用)。" + +#: ../../library/shutil.rst:687 ../../library/shutil.rst:805 +msgid "*xztar*: xz'ed tar-file (if the :mod:`lzma` module is available)." +msgstr "*xztar*: xz 压缩的 tar 文件(如果 :mod:`lzma` 模块可用)。" + +#: ../../library/shutil.rst:688 ../../library/shutil.rst:806 +msgid "" +"*zstdtar*: Zstandard compressed tar-file (if the :mod:`compression.zstd` " +"module is available)." +msgstr "*zstdtar*: Zstandard 压缩的 tar 文件(如果 :mod:`compression.zstd` 模块可用)。" + +#: ../../library/shutil.rst:691 +msgid "" +"You can register new formats or provide your own archiver for any existing " +"formats, by using :func:`register_archive_format`." +msgstr "你可以通过使用 :func:`register_archive_format` 注册新的格式或为任何现有格式提供你自己的归档器。" + +#: ../../library/shutil.rst:697 +msgid "Register an archiver for the format *name*." +msgstr "为 *name* 格式注册一个归档器。" + +#: ../../library/shutil.rst:699 +msgid "" +"*function* is the callable that will be used to create archives. The " +"callable will receive the *base_name* of the file to create, followed by the" +" *base_dir* (which defaults to :data:`os.curdir`) to start archiving from. " +"Further arguments are passed as keyword arguments: *owner*, *group*, " +"*dry_run* and *logger* (as passed in :func:`make_archive`)." +msgstr "" + +#: ../../library/shutil.rst:705 +msgid "" +"If *function* has the custom attribute ``function.supports_root_dir`` set to" +" ``True``, the *root_dir* argument is passed as a keyword argument. " +"Otherwise the current working directory of the process is temporarily " +"changed to *root_dir* before calling *function*. In this case " +":func:`make_archive` is not thread-safe." +msgstr "" +"如果 *function* 将自定义属性 ``function.supports_root_dir`` 设为 ``True``,则会以关键字参数形式传递" +" *root_dir* 参数。否则进程的当前工作目录将在调用 *function* 之前被临时更改为 *root_dir*。在此情况下 " +":func:`make_archive` 将不是线程安全的。" + +#: ../../library/shutil.rst:711 +msgid "" +"If given, *extra_args* is a sequence of ``(name, value)`` pairs that will be" +" used as extra keywords arguments when the archiver callable is used." +msgstr "" +"如果给出了 *extra_args*,则其应为一个 ``(name, value)`` 对的序列,将在归档器可调用对象被使用时作为附加的关键字参数。" + +#: ../../library/shutil.rst:714 +msgid "" +"*description* is used by :func:`get_archive_formats` which returns the list " +"of archivers. Defaults to an empty string." +msgstr "*description* 由 :func:`get_archive_formats` 使用,它将返回归档器的列表。默认值为一个空字符串。" + +#: ../../library/shutil.rst:717 +msgid "Added support for functions supporting the *root_dir* argument." +msgstr "增加了对支持 *root_dir* 参数的函数的支持。" + +#: ../../library/shutil.rst:723 +msgid "Remove the archive format *name* from the list of supported formats." +msgstr "从支持的格式中移除归档格式 *name*。" + +#: ../../library/shutil.rst:728 +msgid "Unpack an archive. *filename* is the full path of the archive." +msgstr "解包一个归档文件。 *filename* 是归档文件的完整路径。" + +#: ../../library/shutil.rst:730 +msgid "" +"*extract_dir* is the name of the target directory where the archive is " +"unpacked. If not provided, the current working directory is used." +msgstr "*extract_dir* 是归档文件解包的目标目录名称。如果未提供,则将使用当前工作目录。" + +#: ../../library/shutil.rst:733 +msgid "" +"*format* is the archive format: one of \"zip\", \"tar\", \"gztar\", " +"\"bztar\", \"xztar\", or \"zstdtar\". Or any other format registered with " +":func:`register_unpack_format`. If not provided, :func:`unpack_archive` " +"will use the archive file name extension and see if an unpacker was " +"registered for that extension. In case none is found, a :exc:`ValueError` " +"is raised." +msgstr "" +"*format* 是归档格式:应为 \"zip\", \"tar\", \"gztar\", \"bztar\", \"xztar\" 或 " +"\"zstdtar\" 中的一个。或者任何通过 :func:`register_unpack_format` 注册的其他格式。如果未提供,则 " +":func:`unpack_archive` 将使用归档文件的扩展名来检查是否注册了对应于该扩展名的解包器。对于未找到任何解包器的情况,将引发 " +":exc:`ValueError`." + +#: ../../library/shutil.rst:740 +msgid "" +"The keyword-only *filter* argument is passed to the underlying unpacking " +"function. For zip files, *filter* is not accepted. For tar files, it is " +"recommended to use ``'data'`` (default since Python 3.14), unless using " +"features specific to tar and UNIX-like filesystems. (See :ref:`tarfile-" +"extraction-filter` for details.)" +msgstr "" +"仅限关键字参数 *filter* 将被传给下层的解包函数。对于 zip 文件,*filter* 将不被接受。对于 tar 文件,推荐使用 " +"``'data'`` (自 Python 3.14 起为默认值),除非使用了 tar 和 UNIX 类文件系统专属的特性。 (请参阅 " +":ref:`tarfile-extraction-filter` 了解详情。)" + +#: ../../library/shutil.rst:746 +msgid "" +"Raises an :ref:`auditing event ` ``shutil.unpack_archive`` with " +"arguments ``filename``, ``extract_dir``, ``format``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``shutil.unpack_archive`` 并附带参数 ``filename``, " +"``extract_dir``, ``format``." + +#: ../../library/shutil.rst:750 +msgid "" +"Never extract archives from untrusted sources without prior inspection. It " +"is possible that files are created outside of the path specified in the " +"*extract_dir* argument, for example, members that have absolute filenames or" +" filenames with \"..\" components." +msgstr "" + +#: ../../library/shutil.rst:755 +msgid "" +"Since Python 3.14, the defaults for both built-in formats (zip and tar " +"files) will prevent the most dangerous of such security issues, but will not" +" prevent *all* unintended behavior. Read the :ref:`tarfile-further-" +"verification` section for tar-specific details." +msgstr "" +"自 Python 3.14 起,两种内置格式(zip 和 tar 文件)的默认设置将能防止最危险的此类安全问题,但是不能防止 *所有* 非故意的行为。 " +"请参阅 :ref:`tarfile-further-verification` 一节了解 tar 专属的细节。" + +#: ../../library/shutil.rst:761 +msgid "Accepts a :term:`path-like object` for *filename* and *extract_dir*." +msgstr "接受一个 :term:`path-like object` 作为 *filename* 和 *extract_dir*。" + +#: ../../library/shutil.rst:764 +msgid "Added the *filter* argument." +msgstr "增加了 *filter* 参数。" + +#: ../../library/shutil.rst:769 +msgid "" +"Registers an unpack format. *name* is the name of the format and " +"*extensions* is a list of extensions corresponding to the format, like " +"``.zip`` for Zip files." +msgstr "" +"注册一个解包格式。 *name* 为格式名称而 *extensions* 为对应于该格式的扩展名列表,例如 Zip 文件的扩展名为 ``.zip``。" + +#: ../../library/shutil.rst:773 +msgid "" +"*function* is the callable that will be used to unpack archives. The " +"callable will receive:" +msgstr "*function* 是将被用于解包归档的可调用对象。该可调用对象将接受:" + +#: ../../library/shutil.rst:776 +msgid "the path of the archive, as a positional argument;" +msgstr "归档的路径,为位置参数;" + +#: ../../library/shutil.rst:777 +msgid "" +"the directory the archive must be extracted to, as a positional argument;" +msgstr "归档要提取到的目录,为位置参数;" + +#: ../../library/shutil.rst:778 +msgid "" +"possibly a *filter* keyword argument, if it was given to " +":func:`unpack_archive`;" +msgstr "可选的 *filter* 关键字参数,如果有提供给 :func:`unpack_archive` 的话;" + +#: ../../library/shutil.rst:780 +msgid "" +"additional keyword arguments, specified by *extra_args* as a sequence of " +"``(name, value)`` tuples." +msgstr "额外的关键字参数,由 ``(name, value)`` 元组组成的序列 *extra_args* 指明。" + +#: ../../library/shutil.rst:783 +msgid "" +"*description* can be provided to describe the format, and will be returned " +"by the :func:`get_unpack_formats` function." +msgstr "可以提供 *description* 来描述该格式,它将被 :func:`get_unpack_formats` 返回。" + +#: ../../library/shutil.rst:789 +msgid "Unregister an unpack format. *name* is the name of the format." +msgstr "撤销注册一个解包格式。 *name* 为格式的名称。" + +#: ../../library/shutil.rst:794 +msgid "" +"Return a list of all registered formats for unpacking. Each element of the " +"returned sequence is a tuple ``(name, extensions, description)``." +msgstr "返回所有已注册的解包格式列表。所返回序列中的每个元素为一个元组 ``(name, extensions, description)``。" + +#: ../../library/shutil.rst:800 +msgid "" +"*zip*: ZIP file (unpacking compressed files works only if the corresponding " +"module is available)." +msgstr "*zip*: ZIP 文件(只有在相应模块可用时才能解包压缩文件)。" + +#: ../../library/shutil.rst:802 +msgid "*tar*: uncompressed tar file." +msgstr "*tar*: 未压缩的 tar 文件。" + +#: ../../library/shutil.rst:809 +msgid "" +"You can register new formats or provide your own unpacker for any existing " +"formats, by using :func:`register_unpack_format`." +msgstr "你可以通过使用 :func:`register_unpack_format` 注册新的格式或为任何现有格式提供你自己的解包器。" + +#: ../../library/shutil.rst:816 +msgid "Archiving example" +msgstr "归档程序示例" + +#: ../../library/shutil.rst:818 +msgid "" +"In this example, we create a gzip'ed tar-file archive containing all files " +"found in the :file:`.ssh` directory of the user::" +msgstr "在这个示例中,我们创建了一个 gzip 压缩的 tar 归档文件,其中包含用户的 :file:`.ssh` 目录下的所有文件::" + +#: ../../library/shutil.rst:821 +msgid "" +">>> from shutil import make_archive\n" +">>> import os\n" +">>> archive_name = os.path.expanduser(os.path.join('~', 'myarchive'))\n" +">>> root_dir = os.path.expanduser(os.path.join('~', '.ssh'))\n" +">>> make_archive(archive_name, 'gztar', root_dir)\n" +"'/Users/tarek/myarchive.tar.gz'" +msgstr "" +">>> from shutil import make_archive\n" +">>> import os\n" +">>> archive_name = os.path.expanduser(os.path.join('~', 'myarchive'))\n" +">>> root_dir = os.path.expanduser(os.path.join('~', '.ssh'))\n" +">>> make_archive(archive_name, 'gztar', root_dir)\n" +"'/Users/tarek/myarchive.tar.gz'" + +#: ../../library/shutil.rst:828 +msgid "The resulting archive contains:" +msgstr "结果归档文件中包含有:" + +#: ../../library/shutil.rst:830 +msgid "" +"$ tar -tzvf /Users/tarek/myarchive.tar.gz\n" +"drwx------ tarek/staff 0 2010-02-01 16:23:40 ./\n" +"-rw-r--r-- tarek/staff 609 2008-06-09 13:26:54 ./authorized_keys\n" +"-rwxr-xr-x tarek/staff 65 2008-06-09 13:26:54 ./config\n" +"-rwx------ tarek/staff 668 2008-06-09 13:26:54 ./id_dsa\n" +"-rwxr-xr-x tarek/staff 609 2008-06-09 13:26:54 ./id_dsa.pub\n" +"-rw------- tarek/staff 1675 2008-06-09 13:26:54 ./id_rsa\n" +"-rw-r--r-- tarek/staff 397 2008-06-09 13:26:54 ./id_rsa.pub\n" +"-rw-r--r-- tarek/staff 37192 2010-02-06 18:23:10 ./known_hosts" +msgstr "" +"$ tar -tzvf /Users/tarek/myarchive.tar.gz\n" +"drwx------ tarek/staff 0 2010-02-01 16:23:40 ./\n" +"-rw-r--r-- tarek/staff 609 2008-06-09 13:26:54 ./authorized_keys\n" +"-rwxr-xr-x tarek/staff 65 2008-06-09 13:26:54 ./config\n" +"-rwx------ tarek/staff 668 2008-06-09 13:26:54 ./id_dsa\n" +"-rwxr-xr-x tarek/staff 609 2008-06-09 13:26:54 ./id_dsa.pub\n" +"-rw------- tarek/staff 1675 2008-06-09 13:26:54 ./id_rsa\n" +"-rw-r--r-- tarek/staff 397 2008-06-09 13:26:54 ./id_rsa.pub\n" +"-rw-r--r-- tarek/staff 37192 2010-02-06 18:23:10 ./known_hosts" + +#: ../../library/shutil.rst:846 +msgid "Archiving example with *base_dir*" +msgstr "使用 *base_dir* 的归档程序示例" + +#: ../../library/shutil.rst:848 +msgid "" +"In this example, similar to the `one above `_, we" +" show how to use :func:`make_archive`, but this time with the usage of " +"*base_dir*. We now have the following directory structure:" +msgstr "" +"在这个例子中,与 `上面的例子 `_ 类似,我们演示了如何使用 " +":func:`make_archive`,但这次是使用 *base_dir*。我们现在具有如下的目录结构:" + +#: ../../library/shutil.rst:852 +msgid "" +"$ tree tmp\n" +"tmp\n" +"└── root\n" +" └── structure\n" +" ├── content\n" +" └── please_add.txt\n" +" └── do_not_add.txt" +msgstr "" +"$ tree tmp\n" +"tmp\n" +"└── root\n" +" └── structure\n" +" ├── content\n" +" └── please_add.txt\n" +" └── do_not_add.txt" + +#: ../../library/shutil.rst:862 +msgid "" +"In the final archive, :file:`please_add.txt` should be included, but " +":file:`do_not_add.txt` should not. Therefore we use the following::" +msgstr "" +"在最终的归档中,应当会包括 :file:`please_add.txt`,但不应当包括 :file:`do_not_add.txt`。 " +"因此我们使用以下代码::" + +#: ../../library/shutil.rst:865 +msgid "" +">>> from shutil import make_archive\n" +">>> import os\n" +">>> archive_name = os.path.expanduser(os.path.join('~', 'myarchive'))\n" +">>> make_archive(\n" +"... archive_name,\n" +"... 'tar',\n" +"... root_dir='tmp/root',\n" +"... base_dir='structure/content',\n" +"... )\n" +"'/Users/tarek/myarchive.tar'" +msgstr "" +">>> from shutil import make_archive\n" +">>> import os\n" +">>> archive_name = os.path.expanduser(os.path.join('~', 'myarchive'))\n" +">>> make_archive(\n" +"... archive_name,\n" +"... 'tar',\n" +"... root_dir='tmp/root',\n" +"... base_dir='structure/content',\n" +"... )\n" +"'/Users/tarek/myarchive.tar'" + +#: ../../library/shutil.rst:876 +msgid "Listing the files in the resulting archive gives us:" +msgstr "列出结果归档中的文件我们将会得到:" + +#: ../../library/shutil.rst:878 +msgid "" +"$ python -m tarfile -l /Users/tarek/myarchive.tar\n" +"structure/content/\n" +"structure/content/please_add.txt" +msgstr "" +"$ python -m tarfile -l /Users/tarek/myarchive.tar\n" +"structure/content/\n" +"structure/content/please_add.txt" + +#: ../../library/shutil.rst:886 +msgid "Querying the size of the output terminal" +msgstr "查询输出终端的尺寸" + +#: ../../library/shutil.rst:890 +msgid "Get the size of the terminal window." +msgstr "获取终端窗口的尺寸。" + +#: ../../library/shutil.rst:892 +msgid "" +"For each of the two dimensions, the environment variable, ``COLUMNS`` and " +"``LINES`` respectively, is checked. If the variable is defined and the value" +" is a positive integer, it is used." +msgstr "" +"对于两个维度中的每一个,会分别检查环境变量 ``COLUMNS`` 和 ``LINES``。如果定义了这些变量并且其值为正整数,则将使用这些值。" + +#: ../../library/shutil.rst:896 +msgid "" +"When ``COLUMNS`` or ``LINES`` is not defined, which is the common case, the " +"terminal connected to :data:`sys.__stdout__` is queried by invoking " +":func:`os.get_terminal_size`." +msgstr "" +"如果未定义 ``COLUMNS`` 或 ``LINES``,这是通常的情况,则连接到 :data:`sys.__stdout__` 的终端将通过唤起 " +":func:`os.get_terminal_size` 被查询。" + +#: ../../library/shutil.rst:900 +msgid "" +"If the terminal size cannot be successfully queried, either because the " +"system doesn't support querying, or because we are not connected to a " +"terminal, the value given in ``fallback`` parameter is used. ``fallback`` " +"defaults to ``(80, 24)`` which is the default size used by many terminal " +"emulators." +msgstr "" +"如果由于系统不支持查询,或是由于我们未连接到某个终端而导致查询终端尺寸不成功,则会使用在 ``fallback`` 形参中给出的值。 " +"``fallback`` 默认为 ``(80, 24)``,这是许多终端模拟器所使用的默认尺寸。" + +#: ../../library/shutil.rst:906 +msgid "The value returned is a named tuple of type :class:`os.terminal_size`." +msgstr "返回的值是一个 :class:`os.terminal_size` 类型的具名元组。" + +#: ../../library/shutil.rst:908 +msgid "" +"See also: The Single UNIX Specification, Version 2, `Other Environment " +"Variables`_." +msgstr "" +"另请参阅:The Single UNIX Specification, Version 2, `Other Environment " +"Variables`_." + +#: ../../library/shutil.rst:913 +msgid "" +"The ``fallback`` values are also used if :func:`os.get_terminal_size` " +"returns zeroes." +msgstr "如果 :func:`os.get_terminal_size` 返回零值则 ``fallback`` 值也将被使用。" + +#: ../../library/shutil.rst:12 +msgid "file" +msgstr "文件" + +#: ../../library/shutil.rst:12 +msgid "copying" +msgstr "拷贝" + +#: ../../library/shutil.rst:12 +msgid "copying files" +msgstr "拷贝文件" + +#: ../../library/shutil.rst:311 +msgid "directory" +msgstr "directory" + +#: ../../library/shutil.rst:311 +msgid "deleting" +msgstr "删除" diff --git a/library/signal.po b/library/signal.po new file mode 100644 index 0000000000..3d004245c8 --- /dev/null +++ b/library/signal.po @@ -0,0 +1,1175 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/signal.rst:2 +msgid ":mod:`!signal` --- Set handlers for asynchronous events" +msgstr ":mod:`!signal` --- 设置异步事件处理器" + +#: ../../library/signal.rst:7 +msgid "**Source code:** :source:`Lib/signal.py`" +msgstr "**源代码:** :source:`Lib/signal.py`" + +#: ../../library/signal.rst:11 +msgid "This module provides mechanisms to use signal handlers in Python." +msgstr "该模块提供了在 Python 中使用信号处理程序的机制。" + +#: ../../library/signal.rst:15 +msgid "General rules" +msgstr "一般规则" + +#: ../../library/signal.rst:17 +msgid "" +"The :func:`signal.signal` function allows defining custom handlers to be " +"executed when a signal is received. A small number of default handlers are " +"installed: :const:`SIGPIPE` is ignored (so write errors on pipes and sockets" +" can be reported as ordinary Python exceptions) and :const:`SIGINT` is " +"translated into a :exc:`KeyboardInterrupt` exception if the parent process " +"has not changed it." +msgstr "" +":func:`signal.signal` 函数允许定义在接收到信号时执行的自定义处理程序。少量的默认处理程序已经设置: " +":const:`SIGPIPE` 被忽略(因此管道和套接字上的写入错误可以报告为普通的 Python 异常)以及如果父进程没有更改 " +":const:`SIGINT`,则其会被翻译成 :exc:`KeyboardInterrupt` 异常。" + +#: ../../library/signal.rst:24 +msgid "" +"A handler for a particular signal, once set, remains installed until it is " +"explicitly reset (Python emulates the BSD style interface regardless of the " +"underlying implementation), with the exception of the handler for " +":const:`SIGCHLD`, which follows the underlying implementation." +msgstr "" +"一旦设置,特定信号的处理程序将保持安装,直到它被显式重置(Python 模拟 BSD 样式接口而不管底层实现),但 :const:`SIGCHLD` " +"的处理程序除外,它遵循底层实现。" + +#: ../../library/signal.rst:29 +msgid "" +"On WebAssembly platforms, signals are emulated and therefore behave " +"differently. Several functions and signals are not available on these " +"platforms." +msgstr "在 WebAssembly 平台上,信号是模拟实现的因而其行为有所不同。某些函数和信号在这些平台上将不可用。" + +#: ../../library/signal.rst:34 +msgid "Execution of Python signal handlers" +msgstr "执行 Python 信号处理程序" + +#: ../../library/signal.rst:36 +msgid "" +"A Python signal handler does not get executed inside the low-level (C) " +"signal handler. Instead, the low-level signal handler sets a flag which " +"tells the :term:`virtual machine` to execute the corresponding Python signal" +" handler at a later point (for example, at the next :term:`bytecode` " +"instruction). This has consequences:" +msgstr "" + +#: ../../library/signal.rst:42 +msgid "" +"It makes little sense to catch synchronous errors like :const:`SIGFPE` or " +":const:`SIGSEGV` that are caused by an invalid operation in C code. Python " +"will return from the signal handler to the C code, which is likely to raise " +"the same signal again, causing Python to apparently hang. From Python 3.3 " +"onwards, you can use the :mod:`faulthandler` module to report on synchronous" +" errors." +msgstr "" +"捕获同步错误是没有意义的,例如 :const:`SIGFPE` 或 :const:`SIGSEGV`,它们是由 C 代码中的无效操作引起的。Python" +" 将从信号处理程序返回到 C 代码,这可能会再次引发相同的信号,导致 Python 显然的挂起。从 Python 3.3 开始,你可以使用 " +":mod:`faulthandler` 模块来报告同步错误。" + +#: ../../library/signal.rst:49 +msgid "" +"A long-running calculation implemented purely in C (such as regular " +"expression matching on a large body of text) may run uninterrupted for an " +"arbitrary amount of time, regardless of any signals received. The Python " +"signal handlers will be called when the calculation finishes." +msgstr "" +"纯 C 中实现的长时间运行的计算(例如在大量文本上的正则表达式匹配)可以在任意时间内不间断地运行,而不管接收到任何信号。计算完成后将调用 Python " +"信号处理程序。" + +#: ../../library/signal.rst:54 +msgid "" +"If the handler raises an exception, it will be raised \"out of thin air\" in" +" the main thread. See the :ref:`note below ` for a " +"discussion." +msgstr "" +"如果处理器引发了异常,它将在主线程中“凭空”被引发。请参阅 :ref:`下面的注释 ` 讨论相关细节。" + +#: ../../library/signal.rst:62 +msgid "Signals and threads" +msgstr "信号与线程" + +#: ../../library/signal.rst:64 +msgid "" +"Python signal handlers are always executed in the main Python thread of the " +"main interpreter, even if the signal was received in another thread. This " +"means that signals can't be used as a means of inter-thread communication. " +"You can use the synchronization primitives from the :mod:`threading` module " +"instead." +msgstr "" +"Python 信号处理程序总是会在主 Python 主解释器的主线程中执行,即使信号是在另一个线程中接收的。这意味着信号不能被用作线程间通信的手段。 " +"你可以改用 :mod:`threading` 模块中的同步原语。" + +#: ../../library/signal.rst:69 +msgid "" +"Besides, only the main thread of the main interpreter is allowed to set a " +"new signal handler." +msgstr "此外,只有主解释器的主线程才被允许设置新的信号处理程序。" + +#: ../../library/signal.rst:73 +msgid "" +"Synchronization primitives such as :class:`threading.Lock` should not be " +"used within signal handlers. Doing so can lead to unexpected deadlocks." +msgstr "" + +#: ../../library/signal.rst:78 +msgid "Module contents" +msgstr "模块内容" + +#: ../../library/signal.rst:80 +msgid "" +"signal (SIG*), handler (:const:`SIG_DFL`, :const:`SIG_IGN`) and sigmask " +"(:const:`SIG_BLOCK`, :const:`SIG_UNBLOCK`, :const:`SIG_SETMASK`) related " +"constants listed below were turned into :class:`enums ` " +"(:class:`Signals`, :class:`Handlers` and :class:`Sigmasks` respectively). " +":func:`getsignal`, :func:`pthread_sigmask`, :func:`sigpending` and " +":func:`sigwait` functions return human-readable :class:`enums " +"` as :class:`Signals` objects." +msgstr "" +"下面列出的信号 (SIG*), 处理器 (:const:`SIG_DFL`, :const:`SIG_IGN`) 和信号掩码 " +"(:const:`SIG_BLOCK`, :const:`SIG_UNBLOCK`, :const:`SIG_SETMASK`) 相关的常量会被转成 " +":class:`enums ` (分别为 :class:`Signals`, :class:`Handlers` 和 " +":class:`Sigmasks`). :func:`getsignal`, :func:`pthread_sigmask`, " +":func:`sigpending` 和 :func:`sigwait` 函数将以 :class:`Signals` 对象形式返回人类可读的 " +":class:`enums `." + +#: ../../library/signal.rst:90 +msgid "The signal module defines three enums:" +msgstr "signal 模块定义了三个枚举:" + +#: ../../library/signal.rst:94 +msgid "" +":class:`enum.IntEnum` collection of SIG* constants and the CTRL_* constants." +msgstr ":class:`enum.IntEnum` 是 SIG* 常量和 CTRL_* 常量的多项集。" + +#: ../../library/signal.rst:100 +msgid "" +":class:`enum.IntEnum` collection of the constants :const:`SIG_DFL` and " +":const:`SIG_IGN`." +msgstr "" + +#: ../../library/signal.rst:106 +msgid "" +":class:`enum.IntEnum` collection of the constants :const:`SIG_BLOCK`, " +":const:`SIG_UNBLOCK` and :const:`SIG_SETMASK`." +msgstr "" + +#: ../../library/signal.rst:108 ../../library/signal.rst:141 +#: ../../library/signal.rst:147 ../../library/signal.rst:153 +#: ../../library/signal.rst:159 ../../library/signal.rst:165 +#: ../../library/signal.rst:171 ../../library/signal.rst:185 +#: ../../library/signal.rst:203 ../../library/signal.rst:211 +#: ../../library/signal.rst:217 ../../library/signal.rst:223 +#: ../../library/signal.rst:233 ../../library/signal.rst:240 +#: ../../library/signal.rst:255 ../../library/signal.rst:261 +#: ../../library/signal.rst:267 ../../library/signal.rst:273 +#: ../../library/signal.rst:279 ../../library/signal.rst:297 +#: ../../library/signal.rst:307 ../../library/signal.rst:386 +#: ../../library/signal.rst:425 ../../library/signal.rst:449 +#: ../../library/signal.rst:472 ../../library/signal.rst:506 +#: ../../library/signal.rst:537 ../../library/signal.rst:548 +#: ../../library/signal.rst:603 ../../library/signal.rst:645 +#: ../../library/signal.rst:660 ../../library/signal.rst:685 +#: ../../library/signal.rst:705 +msgid "Availability" +msgstr "Availability" + +#: ../../library/signal.rst:110 ../../library/signal.rst:508 +msgid "" +"See the man page :manpage:`sigprocmask(2)` and :manpage:`pthread_sigmask(3)`" +" for further information." +msgstr "" +"请参阅手册页面 :manpage:`sigprocmask(2)` 和 :manpage:`pthread_sigmask(3)` 了解更多信息。" + +#: ../../library/signal.rst:116 +msgid "The variables defined in the :mod:`!signal` module are:" +msgstr "" + +#: ../../library/signal.rst:121 +msgid "" +"This is one of two standard signal handling options; it will simply perform " +"the default function for the signal. For example, on most systems the " +"default action for :const:`SIGQUIT` is to dump core and exit, while the " +"default action for :const:`SIGCHLD` is to simply ignore it." +msgstr "" +"这是两种标准信号处理选项之一;它只会执行信号的默认函数。例如,在大多数系统上,对于 :const:`SIGQUIT` 的默认操作是转储核心并退出,而对于" +" :const:`SIGCHLD` 的默认操作是简单地忽略它。" + +#: ../../library/signal.rst:129 +msgid "" +"This is another standard signal handler, which will simply ignore the given " +"signal." +msgstr "这是另一个标准信号处理程序,它将简单地忽略给定的信号。" + +#: ../../library/signal.rst:135 +msgid "Abort signal from :manpage:`abort(3)`." +msgstr "来自 :manpage:`abort(3)` 的中止信号。" + +#: ../../library/signal.rst:139 +msgid "Timer signal from :manpage:`alarm(2)`." +msgstr "来自 :manpage:`alarm(2)` 的计时器信号。" + +#: ../../library/signal.rst:145 +msgid "Interrupt from keyboard (CTRL + BREAK)." +msgstr "来自键盘的中断 (CTRL + BREAK)。" + +#: ../../library/signal.rst:151 +msgid "Bus error (bad memory access)." +msgstr "总线错误 (非法的内存访问)。" + +#: ../../library/signal.rst:157 +msgid "Child process stopped or terminated." +msgstr "子进程被停止或终结。" + +#: ../../library/signal.rst:163 +msgid "Alias to :data:`SIGCHLD`." +msgstr ":data:`SIGCHLD` 的别名。" + +#: ../../library/signal.rst:169 +msgid "Continue the process if it is currently stopped" +msgstr "如果进程当前已停止则继续执行它" + +#: ../../library/signal.rst:175 +msgid "Floating-point exception. For example, division by zero." +msgstr "浮点异常。例如除以零。" + +#: ../../library/signal.rst:178 +msgid "" +":exc:`ZeroDivisionError` is raised when the second argument of a division or" +" modulo operation is zero." +msgstr "当除法或求余运算的第二个参数为零时会引发 :exc:`ZeroDivisionError`。" + +#: ../../library/signal.rst:183 +msgid "" +"Hangup detected on controlling terminal or death of controlling process." +msgstr "在控制终端上检测到挂起或控制进程的终止。" + +#: ../../library/signal.rst:189 +msgid "Illegal instruction." +msgstr "非法指令。" + +#: ../../library/signal.rst:193 +msgid "Interrupt from keyboard (CTRL + C)." +msgstr "来自键盘的中断 (CTRL + C)。" + +#: ../../library/signal.rst:195 +msgid "Default action is to raise :exc:`KeyboardInterrupt`." +msgstr "默认的动作是引发 :exc:`KeyboardInterrupt`。" + +#: ../../library/signal.rst:199 +msgid "Kill signal." +msgstr "终止信号。" + +#: ../../library/signal.rst:201 +msgid "It cannot be caught, blocked, or ignored." +msgstr "它不能被捕获、阻塞或忽略。" + +#: ../../library/signal.rst:207 +msgid "Broken pipe: write to pipe with no readers." +msgstr "损坏的管道:写入到没有读取器的管道。" + +#: ../../library/signal.rst:209 +msgid "Default action is to ignore the signal." +msgstr "默认的动作是忽略此信号。" + +#: ../../library/signal.rst:215 +msgid "Profiling timer expired." +msgstr "性能分析计时器已到期。" + +#: ../../library/signal.rst:221 +msgid "Terminal quit signal." +msgstr "终端退出信号。" + +#: ../../library/signal.rst:227 +msgid "Segmentation fault: invalid memory reference." +msgstr "段错误:无效的内存引用。" + +#: ../../library/signal.rst:231 +msgid "Stop executing (cannot be caught or ignored)." +msgstr "停止执行(无法被捕获或忽略)。" + +#: ../../library/signal.rst:237 +msgid "" +"Stack fault on coprocessor. The Linux kernel does not raise this signal: it " +"can only be raised in user space." +msgstr "协处理器上的栈错误。Linux 内核不会引发此信号:它只能在用户空间中被引发。" + +#: ../../library/signal.rst:242 +msgid "" +"On architectures where the signal is available. See the man page " +":manpage:`signal(7)` for further information." +msgstr "在信号可用的架构上。参见手册页面 :manpage:`signal(7)` 了解更多信息。" + +#: ../../library/signal.rst:249 +msgid "Termination signal." +msgstr "终结信号。" + +#: ../../library/signal.rst:253 +msgid "User-defined signal 1." +msgstr "用户自定义信号 1。" + +#: ../../library/signal.rst:259 +msgid "User-defined signal 2." +msgstr "用户自定义信号 2。" + +#: ../../library/signal.rst:265 +msgid "Virtual timer expired." +msgstr "虚拟计时器已到期。" + +#: ../../library/signal.rst:271 +msgid "Window resize signal." +msgstr "窗口调整大小信号。" + +#: ../../library/signal.rst:277 +msgid "CPU time limit exceeded." +msgstr "超出 CPU 时间限制。" + +#: ../../library/signal.rst:283 +msgid "" +"All the signal numbers are defined symbolically. For example, the hangup " +"signal is defined as :const:`signal.SIGHUP`; the variable names are " +"identical to the names used in C programs, as found in ````. The " +"Unix man page for '``signal``' lists the existing signals (on some systems " +"this is :manpage:`signal(2)`, on others the list is in " +":manpage:`signal(7)`). Note that not all systems define the same set of " +"signal names; only those names defined by the system are defined by this " +"module." +msgstr "" +"所有信号编号都是符号化定义的。例如,挂起信号被定义为 :const:`signal.SIGHUP`;变量的名称与 C 程序中使用的名称相同,具体见 " +"````。 '``signal``' 的 Unix 手册页面列出了现有的信号(在某些系统上是 " +":manpage:`signal(2)`,在其他系统中此列表则是在 :manpage:`signal(7)` 中)。 " +"请注意并非所有系统都会定义相同的信号名称集;只有系统所定义的名称才会由此模块来定义。" + +#: ../../library/signal.rst:294 +msgid "" +"The signal corresponding to the :kbd:`Ctrl+C` keystroke event. This signal " +"can only be used with :func:`os.kill`." +msgstr "对应于 :kbd:`Ctrl+C` 击键事件的信号。此信号只能用于 :func:`os.kill`。" + +#: ../../library/signal.rst:304 +msgid "" +"The signal corresponding to the :kbd:`Ctrl+Break` keystroke event. This " +"signal can only be used with :func:`os.kill`." +msgstr "对应于 :kbd:`Ctrl+Break` 击键事件的信号。此信号只能用于 :func:`os.kill`。" + +#: ../../library/signal.rst:314 +msgid "" +"One more than the number of the highest signal number. Use " +":func:`valid_signals` to get valid signal numbers." +msgstr "比最高的信号编号值多一。请使用 :func:`valid_signals` 来获取有效的信号编号。" + +#: ../../library/signal.rst:320 +msgid "" +"Decrements interval timer in real time, and delivers :const:`SIGALRM` upon " +"expiration." +msgstr "实时递减间隔计时器,并在到期时发送 :const:`SIGALRM`。" + +#: ../../library/signal.rst:326 +msgid "" +"Decrements interval timer only when the process is executing, and delivers " +"SIGVTALRM upon expiration." +msgstr "仅在进程执行时递减间隔计时器,并在到期时发送 SIGVTALRM。" + +#: ../../library/signal.rst:332 +msgid "" +"Decrements interval timer both when the process executes and when the system" +" is executing on behalf of the process. Coupled with ITIMER_VIRTUAL, this " +"timer is usually used to profile the time spent by the application in user " +"and kernel space. SIGPROF is delivered upon expiration." +msgstr "" +"当进程执行时以及当系统替进程执行时都会减小间隔计时器。这个计时器与 ITIMER_VIRTUAL " +"相配结,通常被用于分析应用程序在用户和内核空间中花费的时间。SIGPROF 会在超期时被发送。" + +#: ../../library/signal.rst:340 +msgid "" +"A possible value for the *how* parameter to :func:`pthread_sigmask` " +"indicating that signals are to be blocked." +msgstr ":func:`pthread_sigmask` 的 *how* 形参的一个可能的值,表明信号将会被阻塞。" + +#: ../../library/signal.rst:347 +msgid "" +"A possible value for the *how* parameter to :func:`pthread_sigmask` " +"indicating that signals are to be unblocked." +msgstr ":func:`pthread_sigmask` 的 *how* 形参的一个可能的值,表明信号将被解除阻塞。" + +#: ../../library/signal.rst:354 +msgid "" +"A possible value for the *how* parameter to :func:`pthread_sigmask` " +"indicating that the signal mask is to be replaced." +msgstr ":func:`pthread_sigmask` 的 *how* 形参的一个可能的值,表明信号掩码将要被替换。" + +#: ../../library/signal.rst:360 +msgid "The :mod:`!signal` module defines one exception:" +msgstr ":mod:`!signal` 模块定义了一个异常:" + +#: ../../library/signal.rst:364 +msgid "" +"Raised to signal an error from the underlying :func:`setitimer` or " +":func:`getitimer` implementation. Expect this error if an invalid interval " +"timer or a negative time is passed to :func:`setitimer`. This error is a " +"subtype of :exc:`OSError`." +msgstr "" +"作为来自下层 :func:`setitimer` 或 :func:`getitimer` 实现错误的信号被引发。如果将无效的定时器或负的时间值传给 " +":func:`setitimer` 就会导致这个错误。此错误是 :exc:`OSError` 的子类型。" + +#: ../../library/signal.rst:369 +msgid "" +"This error used to be a subtype of :exc:`IOError`, which is now an alias of " +":exc:`OSError`." +msgstr "此错误是 :exc:`IOError` 的子类型,现在则是 :exc:`OSError` 的别名。" + +#: ../../library/signal.rst:374 +msgid "The :mod:`!signal` module defines the following functions:" +msgstr ":mod:`!signal` 模块定义了下列函数:" + +#: ../../library/signal.rst:379 +msgid "" +"If *time* is non-zero, this function requests that a :const:`SIGALRM` signal" +" be sent to the process in *time* seconds. Any previously scheduled alarm is" +" canceled (only one alarm can be scheduled at any time). The returned value" +" is then the number of seconds before any previously set alarm was to have " +"been delivered. If *time* is zero, no alarm is scheduled, and any scheduled " +"alarm is canceled. If the return value is zero, no alarm is currently " +"scheduled." +msgstr "" +"如果 *time* 值非零,则此函数将要求将一个 :const:`SIGALRM` 信号在 *time* 秒内发往进程。 " +"任何在之前排入计划的警报都会被取消(在任何时刻都只能有一个警报被排入计划)。后续的返回值将是任何之前设置的警报被传入之前的秒数。如果 *time* " +"值为零,则不会将任何警报排入计划,并且任何已排入计划的警报都会被取消。如果返回值为零,则目前没有任何警报被排入计划。" + +#: ../../library/signal.rst:388 +msgid "See the man page :manpage:`alarm(2)` for further information." +msgstr "请参阅手册页面 :manpage:`alarm(2)` 了解更多信息。" + +#: ../../library/signal.rst:393 +msgid "" +"Return the current signal handler for the signal *signalnum*. The returned " +"value may be a callable Python object, or one of the special values " +":const:`signal.SIG_IGN`, :const:`signal.SIG_DFL` or :const:`None`. Here, " +":const:`signal.SIG_IGN` means that the signal was previously ignored, " +":const:`signal.SIG_DFL` means that the default way of handling the signal " +"was previously in use, and ``None`` means that the previous signal handler " +"was not installed from Python." +msgstr "" +"返回当前用于信号 *signalnum* 的信号处理程序。返回值可以是一个 Python 可调用对象,或是特殊值 " +":const:`signal.SIG_IGN`, :const:`signal.SIG_DFL` 或 :const:`None` 之一。 " +"在这里,:const:`signal.SIG_IGN` 表示信号在之前被忽略,:const:`signal.SIG_DFL` " +"表示之前在使用默认的信号处理方式,而 ``None`` 表示之前的信号处理程序未由 Python 安装。" + +#: ../../library/signal.rst:404 +msgid "" +"Returns the description of signal *signalnum*, such as \"Interrupt\" for " +":const:`SIGINT`. Returns :const:`None` if *signalnum* has no description. " +"Raises :exc:`ValueError` if *signalnum* is invalid." +msgstr "" +"返回信号 *signalnum* 的描述信息,例如 \"Interrupt\" 对应 :const:`SIGINT`。如果 *signalnum* " +"没有描述信息则返回 :const:`None`。如果 *signalnum* 无效则引发 :exc:`ValueError`。" + +#: ../../library/signal.rst:413 +msgid "" +"Return the set of valid signal numbers on this platform. This can be less " +"than ``range(1, NSIG)`` if some signals are reserved by the system for " +"internal use." +msgstr "返回本平台上的有效信号编号集。这可能会少于 ``range(1, NSIG)``,如果某些信号被系统保留作为内部使用的话。" + +#: ../../library/signal.rst:422 +msgid "" +"Cause the process to sleep until a signal is received; the appropriate " +"handler will then be called. Returns nothing." +msgstr "使进程休眠直至接收到一个信号;然后将会调用适当的处理程序。返回空值。" + +#: ../../library/signal.rst:427 +msgid "See the man page :manpage:`signal(2)` for further information." +msgstr "请参阅手册页面 :manpage:`signal(2)` 了解更多信息。" + +#: ../../library/signal.rst:429 +msgid "" +"See also :func:`sigwait`, :func:`sigwaitinfo`, :func:`sigtimedwait` and " +":func:`sigpending`." +msgstr "" +"另请参阅 :func:`sigwait`, :func:`sigwaitinfo`, :func:`sigtimedwait` 和 " +":func:`sigpending`." + +#: ../../library/signal.rst:435 +msgid "Sends a signal to the calling process. Returns nothing." +msgstr "向调用方进程发送一个信号。返回空值。" + +#: ../../library/signal.rst:442 +msgid "" +"Send signal *sig* to the process referred to by file descriptor *pidfd*. " +"Python does not currently support the *siginfo* parameter; it must be " +"``None``. The *flags* argument is provided for future extensions; no flag " +"values are currently defined." +msgstr "" +"发送信号 *sig* 到文件描述符 *pidfd* 所指向的进程。Python 目前不支持 *siginfo* 形参;它必须为 ``None``。 提供" +" *flags* 参数是为了将来扩展;当前未定义旗标值。" + +#: ../../library/signal.rst:447 +msgid "See the :manpage:`pidfd_send_signal(2)` man page for more information." +msgstr "更多信息请参阅 :manpage:`pidfd_send_signal(2)` 手册页面。" + +#: ../../library/signal.rst:455 +msgid "" +"Send the signal *signalnum* to the thread *thread_id*, another thread in the" +" same process as the caller. The target thread can be executing any code " +"(Python or not). However, if the target thread is executing the Python " +"interpreter, the Python signal handlers will be :ref:`executed by the main " +"thread of the main interpreter `. Therefore, the only " +"point of sending a signal to a particular Python thread would be to force a " +"running system call to fail with :exc:`InterruptedError`." +msgstr "" +"将信号 *signalnum* 发送至与调用者在同一进程中另一线程 *thread_id*。目标线程可被用于执行任何代码(Python 或其它)。 " +"但是,如果目标线程是在执行 Python 解释器,则 Python 信号处理程序将 :ref:`由主解释器的主线程来执行 `。因此,将信号发送给特定 Python 线程的唯一作用在于强制让一个正在运行的系统调用失败并抛出 " +":exc:`InterruptedError`." + +#: ../../library/signal.rst:463 +msgid "" +"Use :func:`threading.get_ident` or the :attr:`~threading.Thread.ident` " +"attribute of :class:`threading.Thread` objects to get a suitable value for " +"*thread_id*." +msgstr "" +"使用 :class:`threading.Thread` 对象的 :func:`threading.get_ident` 或 " +":attr:`~threading.Thread.ident` 属性为 *thread_id* 获取合适的值。" + +#: ../../library/signal.rst:467 +msgid "" +"If *signalnum* is 0, then no signal is sent, but error checking is still " +"performed; this can be used to check if the target thread is still running." +msgstr "如果 *signalnum* 为 0,则不会发送信号,但仍然会执行错误检测;这可被用来检测目标线程是否仍在运行。" + +#: ../../library/signal.rst:470 +msgid "" +"Raises an :ref:`auditing event ` ``signal.pthread_kill`` with " +"arguments ``thread_id``, ``signalnum``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``signal.pthread_kill`` 并附带参数 ``thread_id``, " +"``signalnum``." + +#: ../../library/signal.rst:474 +msgid "See the man page :manpage:`pthread_kill(3)` for further information." +msgstr "请参阅手册页面 :manpage:`pthread_kill(3)` 了解更多信息。" + +#: ../../library/signal.rst:476 +msgid "See also :func:`os.kill`." +msgstr "另请参阅 :func:`os.kill`。" + +#: ../../library/signal.rst:483 +msgid "" +"Fetch and/or change the signal mask of the calling thread. The signal mask " +"is the set of signals whose delivery is currently blocked for the caller. " +"Return the old signal mask as a set of signals." +msgstr "获取和/或修改调用方线程的信号掩码。信号掩码是一组传送过程目前为调用者而阻塞的信号集。返回旧的信号掩码作为一组信号。" + +#: ../../library/signal.rst:487 +msgid "" +"The behavior of the call is dependent on the value of *how*, as follows." +msgstr "该调用的行为取决于 *how* 的值,具体见下。" + +#: ../../library/signal.rst:489 +msgid "" +":data:`SIG_BLOCK`: The set of blocked signals is the union of the current " +"set and the *mask* argument." +msgstr ":data:`SIG_BLOCK`: 被阻塞信号集是当前集与 *mask* 参数的并集。" + +#: ../../library/signal.rst:491 +msgid "" +":data:`SIG_UNBLOCK`: The signals in *mask* are removed from the current set " +"of blocked signals. It is permissible to attempt to unblock a signal which " +"is not blocked." +msgstr ":data:`SIG_UNBLOCK`: *mask* 中的信号会从当前已阻塞信号集中被移除。允许尝试取消对一个非阻塞信号的阻塞。" + +#: ../../library/signal.rst:494 +msgid "" +":data:`SIG_SETMASK`: The set of blocked signals is set to the *mask* " +"argument." +msgstr ":data:`SIG_SETMASK`: 已阻塞信号集会被设为 *mask* 参数的值。" + +#: ../../library/signal.rst:497 +msgid "" +"*mask* is a set of signal numbers (e.g. {:const:`signal.SIGINT`, " +":const:`signal.SIGTERM`}). Use :func:`~signal.valid_signals` for a full mask" +" including all signals." +msgstr "" +"*mask* 是一个信号编号集合 (例如 {:const:`signal.SIGINT`, :const:`signal.SIGTERM`})。请使用 " +":func:`~signal.valid_signals` 表示包含所有信号的完全掩码。" + +#: ../../library/signal.rst:501 +msgid "" +"For example, ``signal.pthread_sigmask(signal.SIG_BLOCK, [])`` reads the " +"signal mask of the calling thread." +msgstr "例如,``signal.pthread_sigmask(signal.SIG_BLOCK, [])`` 会读取调用方线程的信号掩码。" + +#: ../../library/signal.rst:504 +msgid ":data:`SIGKILL` and :data:`SIGSTOP` cannot be blocked." +msgstr ":data:`SIGKILL` 和 :data:`SIGSTOP` 不能被阻塞。" + +#: ../../library/signal.rst:511 +msgid "See also :func:`pause`, :func:`sigpending` and :func:`sigwait`." +msgstr "另请参阅 :func:`pause`, :func:`sigpending` 和 :func:`sigwait`。" + +#: ../../library/signal.rst:518 +msgid "" +"Sets given interval timer (one of :const:`signal.ITIMER_REAL`, " +":const:`signal.ITIMER_VIRTUAL` or :const:`signal.ITIMER_PROF`) specified by " +"*which* to fire after *seconds* (rounded up to microseconds, different from " +":func:`alarm`) and after that every *interval* seconds (if *interval* is " +"non-zero). The interval timer specified by *which* can be cleared by setting" +" *seconds* to zero." +msgstr "" + +#: ../../library/signal.rst:525 +msgid "" +"When an interval timer fires, a signal is sent to the process. The signal " +"sent is dependent on the timer being used; :const:`signal.ITIMER_REAL` will " +"deliver :const:`SIGALRM`, :const:`signal.ITIMER_VIRTUAL` sends " +":const:`SIGVTALRM`, and :const:`signal.ITIMER_PROF` will deliver " +":const:`SIGPROF`." +msgstr "" +"当一个间隔计时器启动时,会有信号发送至进程。所发送的具体信号取决于所使用的计时器;:const:`signal.ITIMER_REAL` 将发送 " +":const:`SIGALRM`, :const:`signal.ITIMER_VIRTUAL` 将发送 :const:`SIGVTALRM`, 而 " +":const:`signal.ITIMER_PROF` 将发送 :const:`SIGPROF`." + +#: ../../library/signal.rst:531 +msgid "" +"The old values are returned as a two-tuple of floats: (``delay``, " +"``interval``)." +msgstr "" + +#: ../../library/signal.rst:534 +msgid "" +"Attempting to pass an invalid interval timer will cause an " +":exc:`ItimerError`." +msgstr "尝试传入无效的计时器将导致 :exc:`ItimerError`。" + +#: ../../library/signal.rst:539 +msgid "" +"Accepts any real numbers as *seconds* and *interval*, not only integers or " +"floats." +msgstr "" + +#: ../../library/signal.rst:546 +msgid "Returns current value of a given interval timer specified by *which*." +msgstr "返回由 *which* 指明的给定间隔计时器当前的值。" + +#: ../../library/signal.rst:553 +msgid "" +"Set the wakeup file descriptor to *fd*. When a signal your program has " +"registered a signal handler for is received, the signal number is written as" +" a single byte into the fd. If you haven't registered a signal handler for " +"the signals you care about, then nothing will be written to the wakeup fd. " +"This can be used by a library to wakeup a poll or select call, allowing the " +"signal to be fully processed." +msgstr "" +"将唤醒文件描述符设为 *fd*。当某个你的程序已注册了信号处理器的信号被接收时,该信号的编号会以单个字节的形式写入 fd。 " +"如果你没有为你关注的信号注册信号处理器,则不会有任何内容被写入唤醒文件描述符。这可以被某个库用来唤醒一次 poll 或 select " +"调用,以允许该信号被完整地处理。" + +#: ../../library/signal.rst:560 +msgid "" +"The old wakeup fd is returned (or -1 if file descriptor wakeup was not " +"enabled). If *fd* is -1, file descriptor wakeup is disabled. If not -1, " +"*fd* must be non-blocking. It is up to the library to remove any bytes from" +" *fd* before calling poll or select again." +msgstr "" +"原有的唤醒 fd 会被返回(或者如果未启用文件描述符唤醒则返回 -1)。如果 *fd* 为 -1,文件描述符唤醒会被禁用。如果不为 -1,则 *fd* " +"必须为非阻塞型。需要由库来负责在重新调用 poll 或 select 之前从 *fd* 移除任何字节数据。" + +#: ../../library/signal.rst:565 ../../library/signal.rst:620 +msgid "" +"When threads are enabled, this function can only be called from :ref:`the " +"main thread of the main interpreter `; attempting to " +"call it from other threads will cause a :exc:`ValueError` exception to be " +"raised." +msgstr "" +"当启用线程时,此函数只能从 :ref:`主解释器的主线程 ` 被调用;尝试从另一线程调用它将导致 " +":exc:`ValueError` 异常被引发。" + +#: ../../library/signal.rst:570 +msgid "" +"There are two common ways to use this function. In both approaches, you use " +"the fd to wake up when a signal arrives, but then they differ in how they " +"determine *which* signal or signals have arrived." +msgstr "" +"使用此函数有两种通常的方式。在两种方式下,当有信号到达时你都是用 fd 来唤醒,但之后它们在确定到达的一个或多个信号 *which* 时存在差异。" + +#: ../../library/signal.rst:575 +msgid "" +"In the first approach, we read the data out of the fd's buffer, and the byte" +" values give you the signal numbers. This is simple, but in rare cases it " +"can run into a problem: generally the fd will have a limited amount of " +"buffer space, and if too many signals arrive too quickly, then the buffer " +"may become full, and some signals may be lost. If you use this approach, " +"then you should set ``warn_on_full_buffer=True``, which will at least cause " +"a warning to be printed to stderr when signals are lost." +msgstr "" +"在第一种方式下,我们从 fd 的缓冲区读取数据,这些字节值会给你信号编号。这种方式很简单,但在少数情况下会发生问题:通常 fd " +"将有缓冲区空间大小限制,如果信号到达得太多且太快,缓冲区可能会爆满,有些信号可能丢失。如果你使用此方式,则你应当设置 " +"``warn_on_full_buffer=True``,当信号丢失时这至少能将警告消息打印到 stderr。" + +#: ../../library/signal.rst:584 +msgid "" +"In the second approach, we use the wakeup fd *only* for wakeups, and ignore " +"the actual byte values. In this case, all we care about is whether the fd's " +"buffer is empty or non-empty; a full buffer doesn't indicate a problem at " +"all. If you use this approach, then you should set " +"``warn_on_full_buffer=False``, so that your users are not confused by " +"spurious warning messages." +msgstr "" +"在第二种方式下,我们 *只会* 将唤醒 fd 用于唤醒,而忽略实际的字节值。在此情况下,我们所关心的只有 fd " +"的缓冲区为空还是不为空;爆满的缓冲区完全不会导致问题。如果你使用此方式,则你应当设置 " +"``warn_on_full_buffer=False``,这样你的用户就不会被虚假的警告消息所迷惑。" + +#: ../../library/signal.rst:591 +msgid "On Windows, the function now also supports socket handles." +msgstr "在 Windows 上,此函数现在也支持套接字句柄。" + +#: ../../library/signal.rst:594 +msgid "Added ``warn_on_full_buffer`` parameter." +msgstr "添加了 ``warn_on_full_buffer`` 形参。" + +#: ../../library/signal.rst:599 +msgid "" +"Change system call restart behaviour: if *flag* is :const:`False`, system " +"calls will be restarted when interrupted by signal *signalnum*, otherwise " +"system calls will be interrupted. Returns nothing." +msgstr "" +"更改系统调用重启行为:如果 *flag* 为 :const:`False`,系统调用将在被信号 *signalnum* " +"中断时重启,否则系统调用将被中断。返回空值。" + +#: ../../library/signal.rst:605 +msgid "See the man page :manpage:`siginterrupt(3)` for further information." +msgstr "请参阅手册页面 :manpage:`siginterrupt(3)` 了解更多信息。" + +#: ../../library/signal.rst:607 +msgid "" +"Note that installing a signal handler with :func:`signal` will reset the " +"restart behaviour to interruptible by implicitly calling " +":c:func:`!siginterrupt` with a true *flag* value for the given signal." +msgstr "" +"请注意使用 :func:`signal` 安装信号处理器将会通过隐式地调用 :c:func:`!siginterrupt` 并为给定信号的 *flag*" +" 设置真值来将重启行为重置为可中断的。" + +#: ../../library/signal.rst:614 +msgid "" +"Set the handler for signal *signalnum* to the function *handler*. *handler*" +" can be a callable Python object taking two arguments (see below), or one of" +" the special values :const:`signal.SIG_IGN` or :const:`signal.SIG_DFL`. The" +" previous signal handler will be returned (see the description of " +":func:`getsignal` above). (See the Unix man page :manpage:`signal(2)` for " +"further information.)" +msgstr "" +"将信号 *signalnum* 的处理程序设为函数 *handler*。 *handler* 可以为接受两个参数(见下)的 Python " +"可调用对象,或者为特殊值 :const:`signal.SIG_IGN` 或 :const:`signal.SIG_DFL` 之一。 " +"之前的信号处理程序将被返回(参见上文 :func:`getsignal` 的描述)。 (更多信息请参阅 Unix 手册页面 " +":manpage:`signal(2)`.)" + +#: ../../library/signal.rst:625 +msgid "" +"The *handler* is called with two arguments: the signal number and the " +"current stack frame (``None`` or a frame object; for a description of frame " +"objects, see the :ref:`description in the type hierarchy ` or" +" see the attribute descriptions in the :mod:`inspect` module)." +msgstr "" +"*handler* 将附带两个参数调用:信号编号和当前堆栈帧 (``None`` 或一个帧对象;有关帧对象的描述请参阅 :ref:`类型层级结构描述 " +"` 或者参阅 :mod:`inspect` 模块中的属性描述)。" + +#: ../../library/signal.rst:630 +msgid "" +"On Windows, :func:`signal` can only be called with :const:`SIGABRT`, " +":const:`SIGFPE`, :const:`SIGILL`, :const:`SIGINT`, :const:`SIGSEGV`, " +":const:`SIGTERM`, or :const:`SIGBREAK`. A :exc:`ValueError` will be raised " +"in any other case. Note that not all systems define the same set of signal " +"names; an :exc:`AttributeError` will be raised if a signal name is not " +"defined as ``SIG*`` module level constant." +msgstr "" +"在 Windows 上,:func:`signal` 调用只能附带 :const:`SIGABRT`, :const:`SIGFPE`, " +":const:`SIGILL`, :const:`SIGINT`, :const:`SIGSEGV`, :const:`SIGTERM` 或 " +":const:`SIGBREAK`。任何其他值都将引发 :exc:`ValueError`。 " +"请注意不是所有系统都定义了同样的信号名称集合;如果一个信号名称未被定义为 ``SIG*`` 模块层级常量则将引发 " +":exc:`AttributeError`." + +#: ../../library/signal.rst:641 +msgid "" +"Examine the set of signals that are pending for delivery to the calling " +"thread (i.e., the signals which have been raised while blocked). Return the" +" set of the pending signals." +msgstr "检查正在等待传送给调用方线程的信号集合(即在阻塞期间被引发的信号)。返回正在等待的信号集合。" + +#: ../../library/signal.rst:647 +msgid "See the man page :manpage:`sigpending(2)` for further information." +msgstr "请参阅手册页面 :manpage:`sigpending(2)` 了解更多信息。" + +#: ../../library/signal.rst:649 +msgid "See also :func:`pause`, :func:`pthread_sigmask` and :func:`sigwait`." +msgstr "另请参阅 :func:`pause`, :func:`pthread_sigmask` 和 :func:`sigwait`。" + +#: ../../library/signal.rst:656 +msgid "" +"Suspend execution of the calling thread until the delivery of one of the " +"signals specified in the signal set *sigset*. The function accepts the " +"signal (removes it from the pending list of signals), and returns the signal" +" number." +msgstr "" +"挂起调用方线程的执行直到信号集合 *sigset* 中指定的信号之一被传送。此函数会接受该信号(将其从等待信号列表中移除),并返回信号编号。" + +#: ../../library/signal.rst:662 +msgid "See the man page :manpage:`sigwait(3)` for further information." +msgstr "请参阅手册页面 :manpage:`sigwait(3)` 了解更多信息。" + +#: ../../library/signal.rst:664 +msgid "" +"See also :func:`pause`, :func:`pthread_sigmask`, :func:`sigpending`, " +":func:`sigwaitinfo` and :func:`sigtimedwait`." +msgstr "" +"另请参阅 :func:`pause`, :func:`pthread_sigmask`, :func:`sigpending`, " +":func:`sigwaitinfo` 和 :func:`sigtimedwait`。" + +#: ../../library/signal.rst:672 +msgid "" +"Suspend execution of the calling thread until the delivery of one of the " +"signals specified in the signal set *sigset*. The function accepts the " +"signal and removes it from the pending list of signals. If one of the " +"signals in *sigset* is already pending for the calling thread, the function " +"will return immediately with information about that signal. The signal " +"handler is not called for the delivered signal. The function raises an " +":exc:`InterruptedError` if it is interrupted by a signal that is not in " +"*sigset*." +msgstr "" +"挂起调用方线程的执行直到信号集合 *sigset* 中指定的信号之一被传送。此函数会接受该信号并将其从等待信号列表中移除。如果 *sigset* " +"中的信号之一已经在等待调用方线程,此函数将立即返回并附带有关该信号的信息。被传送信号的信号处理程序不会被调用。如果该函数被某个不在 *sigset* " +"中的信号中断则会引发 :exc:`InterruptedError`。" + +#: ../../library/signal.rst:681 +msgid "" +"The return value is an object representing the data contained in the " +"``siginfo_t`` structure, namely: ``si_signo``, ``si_code``, ``si_errno``, " +"``si_pid``, ``si_uid``, ``si_status``, ``si_band``." +msgstr "" +"返回值是一个代表 ``siginfo_t`` 结构体所包含数据的对象,具体为: ``si_signo``, ``si_code``, " +"``si_errno``, ``si_pid``, ``si_uid``, ``si_status``, ``si_band``。" + +#: ../../library/signal.rst:687 +msgid "See the man page :manpage:`sigwaitinfo(2)` for further information." +msgstr "请参阅手册页面 :manpage:`sigwaitinfo(2)` 了解更多信息。" + +#: ../../library/signal.rst:689 +msgid "See also :func:`pause`, :func:`sigwait` and :func:`sigtimedwait`." +msgstr "另请参阅 :func:`pause`, :func:`sigwait` 和 :func:`sigtimedwait`。" + +#: ../../library/signal.rst:693 +msgid "" +"The function is now retried if interrupted by a signal not in *sigset* and " +"the signal handler does not raise an exception (see :pep:`475` for the " +"rationale)." +msgstr "当被不在 *sigset* 中的信号中断且信号处理程序没有引发异常时,本函数现在会进行重试(请参阅 :pep:`475` 了解其理由)。" + +#: ../../library/signal.rst:701 +msgid "" +"Like :func:`sigwaitinfo`, but takes an additional *timeout* argument " +"specifying a timeout. If *timeout* is specified as ``0``, a poll is " +"performed. Returns :const:`None` if a timeout occurs." +msgstr "" +"与 :func:`sigwaitinfo` 类似,但会接受一个额外的 *timeout* 参数来指定超时限制。如果将 *timeout* 指定为 " +"``0``,则会执行轮询。如果发生超时则返回 :const:`None`。" + +#: ../../library/signal.rst:707 +msgid "See the man page :manpage:`sigtimedwait(2)` for further information." +msgstr "请参阅手册页面 :manpage:`sigtimedwait(2)` 了解更多信息。" + +#: ../../library/signal.rst:709 +msgid "See also :func:`pause`, :func:`sigwait` and :func:`sigwaitinfo`." +msgstr "另请参阅 :func:`pause`, :func:`sigwait` 和 :func:`sigwaitinfo`。" + +#: ../../library/signal.rst:713 +msgid "" +"The function is now retried with the recomputed *timeout* if interrupted by " +"a signal not in *sigset* and the signal handler does not raise an exception " +"(see :pep:`475` for the rationale)." +msgstr "" +"现在当此函数被不在 *sigset* 中的信号中断且信号处理程序没有引发异常时,将以重新计算的 *timeout* 进行重试(请参阅 " +":pep:`475` 了解其理由)。" + +#: ../../library/signal.rst:718 +msgid "Accepts any real number as *timeout*, not only integer or float." +msgstr "" + +#: ../../library/signal.rst:725 +msgid "Examples" +msgstr "例子" + +#: ../../library/signal.rst:727 +msgid "" +"Here is a minimal example program. It uses the :func:`alarm` function to " +"limit the time spent waiting to open a file; this is useful if the file is " +"for a serial device that may not be turned on, which would normally cause " +"the :func:`os.open` to hang indefinitely. The solution is to set a 5-second" +" alarm before opening the file; if the operation takes too long, the alarm " +"signal will be sent, and the handler raises an exception. ::" +msgstr "" +"这是一个最小示例程序。它使用 :func:`alarm` " +"函数来限制等待打开一个文件所花费的时间;这在文件为无法开启的串行设备时会很有用处,此情况通常会导致 :func:`os.open` 无限期地挂起。 " +"解决办法是在打开文件之前设置 5 秒钟的 alarm;如果操作耗时过长,将会发送 alarm 信号,并且处理程序会引发一个异常。 ::" + +#: ../../library/signal.rst:734 +msgid "" +"import signal, os\n" +"\n" +"def handler(signum, frame):\n" +" signame = signal.Signals(signum).name\n" +" print(f'Signal handler called with signal {signame} ({signum})')\n" +" raise OSError(\"Couldn't open device!\")\n" +"\n" +"# Set the signal handler and a 5-second alarm\n" +"signal.signal(signal.SIGALRM, handler)\n" +"signal.alarm(5)\n" +"\n" +"# This open() may hang indefinitely\n" +"fd = os.open('/dev/ttyS0', os.O_RDWR)\n" +"\n" +"signal.alarm(0) # Disable the alarm" +msgstr "" +"import signal, os\n" +"\n" +"def handler(signum, frame):\n" +" signame = signal.Signals(signum).name\n" +" print(f'Signal handler called with signal {signame} ({signum})')\n" +" raise OSError(\"Couldn't open device!\")\n" +"\n" +"# 设置信号处理器及 5 秒警报\n" +"signal.signal(signal.SIGALRM, handler)\n" +"signal.alarm(5)\n" +"\n" +"# open() 可能会无限挂起\n" +"fd = os.open('/dev/ttyS0', os.O_RDWR)\n" +"\n" +"signal.alarm(0) # 禁用警报" + +#: ../../library/signal.rst:751 +msgid "Note on SIGPIPE" +msgstr "对于 SIGPIPE 的说明" + +#: ../../library/signal.rst:753 +msgid "" +"Piping output of your program to tools like :manpage:`head(1)` will cause a " +":const:`SIGPIPE` signal to be sent to your process when the receiver of its " +"standard output closes early. This results in an exception like " +":code:`BrokenPipeError: [Errno 32] Broken pipe`. To handle this case, wrap " +"your entry point to catch this exception as follows::" +msgstr "" +"将你的程序用管道输出到工具例如 :manpage:`head(1)` 将会导致 :const:`SIGPIPE` " +"信号在其标准输出的接收方提前关闭时被发送到你的进程。这将引发一个异常例如 :code:`BrokenPipeError: [Errno 32] " +"Broken pipe`。要处理这种情况,请对你的入口点进行包装以捕获此异常,如下所示::" + +#: ../../library/signal.rst:759 +msgid "" +"import os\n" +"import sys\n" +"\n" +"def main():\n" +" try:\n" +" # simulate large output (your code replaces this loop)\n" +" for x in range(10000):\n" +" print(\"y\")\n" +" # flush output here to force SIGPIPE to be triggered\n" +" # while inside this try block.\n" +" sys.stdout.flush()\n" +" except BrokenPipeError:\n" +" # Python flushes standard streams on exit; redirect remaining output\n" +" # to devnull to avoid another BrokenPipeError at shutdown\n" +" devnull = os.open(os.devnull, os.O_WRONLY)\n" +" os.dup2(devnull, sys.stdout.fileno())\n" +" sys.exit(1) # Python exits with error code 1 on EPIPE\n" +"\n" +"if __name__ == '__main__':\n" +" main()" +msgstr "" +"import os\n" +"import sys\n" +"\n" +"def main():\n" +" try:\n" +" # 模拟大量输出(你的代码将替换此循环)\n" +" for x in range(10000):\n" +" print(\"y\")\n" +" # 在此刷新输出以在此 try 代码块内部时\n" +" # 强制让 SIGPIPE 被触发。\n" +" sys.stdout.flush()\n" +" except BrokenPipeError:\n" +" # Python 在退出时刷新标准流;将剩余的输出\n" +" # 重定向到 devnull 以避免关闭时引发新的 BrokenPipeError\n" +" devnull = os.open(os.devnull, os.O_WRONLY)\n" +" os.dup2(devnull, sys.stdout.fileno())\n" +" sys.exit(1) # Python 在 EPIPE 时以错误码 1 退出\n" +"\n" +"if __name__ == '__main__':\n" +" main()" + +#: ../../library/signal.rst:780 +msgid "" +"Do not set :const:`SIGPIPE`'s disposition to :const:`SIG_DFL` in order to " +"avoid :exc:`BrokenPipeError`. Doing that would cause your program to exit " +"unexpectedly whenever any socket connection is interrupted while your " +"program is still writing to it." +msgstr "" +"请不要将 :const:`SIGPIPE` 的处置方式设为 :const:`SIG_DFL` 以避免 :exc:`BrokenPipeError`。 " +"这样做还会在你的程序所写入的任何套接字连接中断时导致你的程序异常退出。" + +#: ../../library/signal.rst:789 +msgid "Note on Signal Handlers and Exceptions" +msgstr "有关信号处理器和异常的注释" + +#: ../../library/signal.rst:791 +msgid "" +"If a signal handler raises an exception, the exception will be propagated to" +" the main thread and may be raised after any :term:`bytecode` instruction. " +"Most notably, a :exc:`KeyboardInterrupt` may appear at any point during " +"execution. Most Python code, including the standard library, cannot be made " +"robust against this, and so a :exc:`KeyboardInterrupt` (or any other " +"exception resulting from a signal handler) may on rare occasions put the " +"program in an unexpected state." +msgstr "" +"如果一个信号处理器引发了异常,该异常将被传播到主线程并可能在任何 :term:`bytecode` 指令之后被引发。 " +"最需要注意的是,:exc:`KeyboardInterrupt` 可能会在执行期间的任何时候出现。大多数 Python " +"代码,包括标准库的代码都不能对此进行健壮性处理,因此 :exc:`KeyboardInterrupt` (或由信号处理器所导致的任何其他异常) " +"可能会在极少数情况下使程序处于非预期的状态。" + +#: ../../library/signal.rst:798 +msgid "To illustrate this issue, consider the following code::" +msgstr "为了展示这个问题,请考虑以下代码::" + +#: ../../library/signal.rst:800 +msgid "" +"class SpamContext:\n" +" def __init__(self):\n" +" self.lock = threading.Lock()\n" +"\n" +" def __enter__(self):\n" +" # If KeyboardInterrupt occurs here, everything is fine\n" +" self.lock.acquire()\n" +" # If KeyboardInterrupt occurs here, __exit__ will not be called\n" +" ...\n" +" # KeyboardInterrupt could occur just before the function returns\n" +"\n" +" def __exit__(self, exc_type, exc_val, exc_tb):\n" +" ...\n" +" self.lock.release()" +msgstr "" +"class SpamContext:\n" +" def __init__(self):\n" +" self.lock = threading.Lock()\n" +"\n" +" def __enter__(self):\n" +" # 如果 KeyboardInterrupt 在这里发生,将保持一切正常\n" +" self.lock.acquire()\n" +" # 如果 KeyboardInterrupt 在这里发生,__exit__ 将不会被调用\n" +" ...\n" +" # KeyboardInterrupt 可能会在该函数返回之前发生\n" +"\n" +" def __exit__(self, exc_type, exc_val, exc_tb):\n" +" ...\n" +" self.lock.release()" + +#: ../../library/signal.rst:815 +msgid "" +"For many programs, especially those that merely want to exit on " +":exc:`KeyboardInterrupt`, this is not a problem, but applications that are " +"complex or require high reliability should avoid raising exceptions from " +"signal handlers. They should also avoid catching :exc:`KeyboardInterrupt` as" +" a means of gracefully shutting down. Instead, they should install their " +"own :const:`SIGINT` handler. Below is an example of an HTTP server that " +"avoids :exc:`KeyboardInterrupt`::" +msgstr "" +"对于许多程序,特别是那些在遇到 :exc:`KeyboardInterrupt` " +"只需直接退出的程序来说,这不是个问题,但是高复杂度或要求高可靠性的应用程序则应当避免由于信号处理器引发异常。它们还应当避免将捕获 " +":exc:`KeyboardInterrupt` 作为程序关闭的优雅方式。相反地,它们应当安装自己的 :const:`SIGINT` 处理器。 " +"下面是一个避免了 :exc:`KeyboardInterrupt` 的 HTTP 服务器示例::" + +#: ../../library/signal.rst:823 +msgid "" +"import signal\n" +"import socket\n" +"from selectors import DefaultSelector, EVENT_READ\n" +"from http.server import HTTPServer, SimpleHTTPRequestHandler\n" +"\n" +"interrupt_read, interrupt_write = socket.socketpair()\n" +"\n" +"def handler(signum, frame):\n" +" print('Signal handler called with signal', signum)\n" +" interrupt_write.send(b'\\0')\n" +"signal.signal(signal.SIGINT, handler)\n" +"\n" +"def serve_forever(httpd):\n" +" sel = DefaultSelector()\n" +" sel.register(interrupt_read, EVENT_READ)\n" +" sel.register(httpd, EVENT_READ)\n" +"\n" +" while True:\n" +" for key, _ in sel.select():\n" +" if key.fileobj == interrupt_read:\n" +" interrupt_read.recv(1)\n" +" return\n" +" if key.fileobj == httpd:\n" +" httpd.handle_request()\n" +"\n" +"print(\"Serving on port 8000\")\n" +"httpd = HTTPServer(('', 8000), SimpleHTTPRequestHandler)\n" +"serve_forever(httpd)\n" +"print(\"Shutdown...\")" +msgstr "" +"import signal\n" +"import socket\n" +"from selectors import DefaultSelector, EVENT_READ\n" +"from http.server import HTTPServer, SimpleHTTPRequestHandler\n" +"\n" +"interrupt_read, interrupt_write = socket.socketpair()\n" +"\n" +"def handler(signum, frame):\n" +" print('Signal handler called with signal', signum)\n" +" interrupt_write.send(b'\\0')\n" +"signal.signal(signal.SIGINT, handler)\n" +"\n" +"def serve_forever(httpd):\n" +" sel = DefaultSelector()\n" +" sel.register(interrupt_read, EVENT_READ)\n" +" sel.register(httpd, EVENT_READ)\n" +"\n" +" while True:\n" +" for key, _ in sel.select():\n" +" if key.fileobj == interrupt_read:\n" +" interrupt_read.recv(1)\n" +" return\n" +" if key.fileobj == httpd:\n" +" httpd.handle_request()\n" +"\n" +"print(\"Serving on port 8000\")\n" +"httpd = HTTPServer(('', 8000), SimpleHTTPRequestHandler)\n" +"serve_forever(httpd)\n" +"print(\"Shutdown...\")" diff --git a/library/site.po b/library/site.po new file mode 100644 index 0000000000..baf41c9ecb --- /dev/null +++ b/library/site.po @@ -0,0 +1,682 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-09 14:43+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/site.rst:2 +msgid ":mod:`!site` --- Site-specific configuration hook" +msgstr ":mod:`!site` --- 站点专属的配置钩子" + +#: ../../library/site.rst:7 +msgid "**Source code:** :source:`Lib/site.py`" +msgstr "**源代码:** :source:`Lib/site.py`" + +#: ../../library/site.rst:13 +msgid "" +"**This module is automatically imported during initialization.** The " +"automatic import can be suppressed using the interpreter's :option:`-S` " +"option." +msgstr "**这个模块将在初始化时被自动导入。** 此自动导入可以通过使用解释器的 :option:`-S` 选项来屏蔽。" + +#: ../../library/site.rst:18 +msgid "" +"Importing this module normally appends site-specific paths to the module " +"search path and adds :ref:`callables `, including :func:`help` " +"to the built-in namespace. However, Python startup option :option:`-S` " +"blocks this, and this module can be safely imported with no automatic " +"modifications to the module search path or additions to the builtins. To " +"explicitly trigger the usual site-specific additions, call the :func:`main` " +"function." +msgstr "" + +#: ../../library/site.rst:25 +msgid "" +"Importing the module used to trigger paths manipulation even when using " +":option:`-S`." +msgstr "在之前即便使用了 :option:`-S`,导入此模块仍然会触发路径操纵。" + +#: ../../library/site.rst:32 +msgid "" +"It starts by constructing up to four directories from a head and a tail " +"part. For the head part, it uses ``sys.prefix`` and ``sys.exec_prefix``; " +"empty heads are skipped. For the tail part, it uses the empty string and " +"then :file:`lib/site-packages` (on Windows) or " +":file:`lib/python{X.Y[t]}/site-packages` (on Unix and macOS). (The optional " +"suffix \"t\" indicates the :term:`free-threaded build`, and is appended if " +"``\"t\"`` is present in the :data:`sys.abiflags` constant.) For each of the " +"distinct head-tail combinations, it sees if it refers to an existing " +"directory, and if so, adds it to ``sys.path`` and also inspects the newly " +"added path for configuration files." +msgstr "" +"它会以一个头部和一个尾部来构造至多四个目录作为起点。对于头部,它将使用 ``sys.prefix`` 和 " +"``sys.exec_prefix``;空的头部会被跳过。对于尾部,它将使用空字符串然后是 :file:`lib/site-packages` (在 " +"Windows 上) 或 :file:`lib/python{X.Y[t]}/site-packages` (在 Unix 和 macOS 上)。 " +"(可选后缀 \"t\" 表示 :term:`free-threaded build`,并会在 ``\"t\"`` 存在于 " +":data:`sys.abiflags` 常量中时被添加。) 对于每个不同的头部 - 尾部组合,它会查看其是否指向现有的目录,如果确实如此,则将其添加到" +" ``sys.path`` 并且还会检查新添加目录中的配置文件。" + +#: ../../library/site.rst:44 +msgid "Support for the \"site-python\" directory has been removed." +msgstr "对 \"site-python\" 目录的支持已被移除。" + +#: ../../library/site.rst:47 +msgid "" +"On Unix, :term:`Free threading ` Python installations are " +"identified by the \"t\" suffix in the version-specific directory name, such " +"as :file:`lib/python3.13t/`." +msgstr "" +"在 Unix 上,:term:`自由线程 ` Python 安装版是在版本专属的目录名称中以 \"t\" " +"后缀来标识的,例如 :file:`lib/python3.13t/`。" + +#: ../../library/site.rst:54 +msgid "" +":mod:`!site` is no longer responsible for updating :data:`sys.prefix` and " +":data:`sys.exec_prefix` on :ref:`sys-path-init-virtual-environments`. This " +"is now done during the :ref:`path initialization `. As a " +"result, under :ref:`sys-path-init-virtual-environments`, :data:`sys.prefix` " +"and :data:`sys.exec_prefix` no longer depend on the :mod:`!site` " +"initialization, and are therefore unaffected by :option:`-S`." +msgstr "" + +#: ../../library/site.rst:63 +msgid "" +"When running under a :ref:`virtual environment `, the ``pyvenv.cfg`` file in :data:`sys.prefix` is checked for" +" site-specific configurations. If the ``include-system-site-packages`` key " +"exists and is set to ``true`` (case-insensitive), the system-level prefixes " +"will be searched for site-packages, otherwise they won't. If the system-" +"level prefixes are not searched then the user site prefixes are also " +"implicitly not searched for site-packages." +msgstr "" + +#: ../../library/site.rst:74 +msgid "" +"The :mod:`!site` module recognizes two startup configuration files of the " +"form :file:`{name}.pth` for path configurations, and :file:`{name}.start` " +"for pre-first-line code execution. Both files can exist in one of the four " +"directories mentioned above. Within each directory, these files are sorted " +"alphabetically by filename, then parsed in sorted order." +msgstr "" + +#: ../../library/site.rst:83 +msgid "Path extensions (:file:`.pth` files)" +msgstr "" + +#: ../../library/site.rst:85 +msgid "" +":file:`{name}.pth` contains additional items (one per line) to be appended " +"to ``sys.path``. Items that name non-existing directories are never added " +"to ``sys.path``, and no check is made that the item refers to a directory " +"rather than a file. No item is added to ``sys.path`` more than once. Blank" +" lines and lines beginning with ``#`` are skipped." +msgstr "" + +#: ../../library/site.rst:91 +msgid "" +"For backward compatibility, lines starting with ``import`` (followed by " +"space or tab) are executed with :func:`exec`." +msgstr "" + +#: ../../library/site.rst:96 +msgid "" +"The :file:`.pth` files are now decoded by UTF-8 at first and then by the " +":term:`locale encoding` if it fails." +msgstr "" +"现在 :file:`.pth` 文件会首先使用 UTF-8 来解码,如果失败会再改用 :term:`locale encoding` 来解码。" + +#: ../../library/site.rst:101 +msgid "" +":file:`.pth` file lines starting with ``import`` are deprecated. During the" +" deprecation period, such lines are still executed (except in the case " +"below), but a diagnostic message is emitted only when the :option:`-v` flag " +"is given." +msgstr "" + +#: ../../library/site.rst:106 +msgid "" +"``import`` lines in :file:`{name}.pth` are silently ignored when a " +":ref:`matching ` :file:`{name}.start` file exists." +msgstr "" + +#: ../../library/site.rst:109 +msgid "" +"Errors on individual lines no longer abort processing of the rest of the " +"file. Each error is reported and the remaining lines continue to be " +"processed." +msgstr "" + +#: ../../library/site.rst:115 +msgid "" +"Decoding :file:`{name}.pth` files in any encoding other than ``utf-8-sig`` " +"is deprecated in Python 3.15, and support for decoding from the locale " +"encoding will be removed in Python 3.20." +msgstr "" + +#: ../../library/site.rst:119 +msgid "" +"``import`` lines in :file:`{name}.pth` files are deprecated and will be " +"silently ignored in Python 3.18 and 3.19. In Python 3.20 a warning will be " +"produced for ``import`` lines in :file:`{name}.pth` files." +msgstr "" + +#: ../../library/site.rst:127 +msgid "Startup entry points (:file:`.start` files)" +msgstr "" + +#: ../../library/site.rst:131 +msgid "" +"A startup entry point file is a file whose name has the form " +":file:`{name}.start` and exists in one of the site-packages directories " +"described above. Each file specifies entry points to be called during " +"interpreter startup, using the ``pkg.mod:callable`` syntax understood by " +":func:`pkgutil.resolve_name`." +msgstr "" + +#: ../../library/site.rst:137 +msgid "" +"Each non-blank line that does not begin with ``#`` must contain an entry " +"point reference in the form ``pkg.mod:callable``. The colon and callable " +"portion are mandatory. Each callable is invoked with no arguments, and any " +"return value is discarded." +msgstr "" + +#: ../../library/site.rst:142 +msgid "" +":file:`.start` files are processed after all :file:`.pth` path extensions " +"have been applied to :data:`sys.path`, ensuring that paths are available " +"before any startup code runs." +msgstr "" + +#: ../../library/site.rst:146 +msgid "" +"Unlike :data:`sys.path` extensions from :file:`.pth` files, duplicate entry " +"points are **not** de-duplicated --- if an entry point appears more than " +"once, it will be called more than once." +msgstr "" + +#: ../../library/site.rst:150 +msgid "" +"If an exception occurs during resolution or invocation of an entry point, a " +"traceback is printed to :data:`sys.stderr` and processing continues with the" +" remaining entry points." +msgstr "" + +#: ../../library/site.rst:154 +msgid ":file:`.start` files must be encoded in UTF-8." +msgstr "" + +#: ../../library/site.rst:156 +msgid ":pep:`829` defined the original specification for these features." +msgstr "" + +#: ../../library/site.rst:160 +msgid "" +"If a :file:`{name}.start` file exists alongside a :file:`{name}.pth` file " +"with the same base name, any ``import`` lines in the :file:`.pth` file are " +"ignored in favor of the entry points in the :file:`.start` file." +msgstr "" + +#: ../../library/site.rst:166 +msgid "" +"Executable lines (``import`` lines in :file:`{name}.pth` files and " +":file:`{name}.start` file entry points) are always run at Python startup " +"(unless :option:`-S` is given to disable the ``site.py`` module entirely), " +"regardless of whether a particular module is actually going to be used." +msgstr "" + +#: ../../library/site.rst:173 +msgid "" +":file:`{name}.start` files invoke :func:`pkgutil.resolve_name` with " +"``strict=True``, which requires the full ``pkg.mod:callable`` form." +msgstr "" + +#: ../../library/site.rst:182 +msgid "Startup file examples" +msgstr "" + +#: ../../library/site.rst:184 +msgid "" +"For example, suppose ``sys.prefix`` and ``sys.exec_prefix`` are set to " +":file:`/usr/local`. The Python X.Y library is then installed in " +":file:`/usr/local/lib/python{X.Y}`. Suppose this has a subdirectory " +":file:`/usr/local/lib/python{X.Y}/site-packages` with three sub-" +"subdirectories, :file:`foo`, :file:`bar` and :file:`spam`, and two path " +"configuration files, :file:`foo.pth` and :file:`bar.pth`. Assume " +":file:`foo.pth` contains the following::" +msgstr "" + +#: ../../library/site.rst:192 +msgid "" +"# foo package configuration\n" +"\n" +"foo\n" +"bar\n" +"bletch" +msgstr "" +"# foo 包配置\n" +"\n" +"foo\n" +"bar\n" +"bletch" + +#: ../../library/site.rst:198 +msgid "and :file:`bar.pth` contains::" +msgstr "并且 :file:`bar.pth` 包含::" + +#: ../../library/site.rst:200 +msgid "" +"# bar package configuration\n" +"\n" +"bar" +msgstr "" +"# bar 包配置\n" +"\n" +"bar" + +#: ../../library/site.rst:204 +msgid "" +"Then the following version-specific directories are added to ``sys.path``, " +"in this order::" +msgstr "则下面特定版本目录将以如下顺序被添加到 ``sys.path``::" + +#: ../../library/site.rst:207 +msgid "" +"/usr/local/lib/pythonX.Y/site-packages/bar\n" +"/usr/local/lib/pythonX.Y/site-packages/foo" +msgstr "" +"/usr/local/lib/pythonX.Y/site-packages/bar\n" +"/usr/local/lib/pythonX.Y/site-packages/foo" + +#: ../../library/site.rst:210 +msgid "" +"Note that :file:`bletch` is omitted because it doesn't exist; the " +":file:`bar` directory precedes the :file:`foo` directory because " +":file:`bar.pth` comes alphabetically before :file:`foo.pth`; and " +":file:`spam` is omitted because it is not mentioned in either path " +"configuration file." +msgstr "" +"请注意 :file:`bletch` 已被省略因为它并不存在;:file:`bar` 目录在 :file:`foo` 目录之前因为 " +":file:`bar.pth` 按字母顺序排在 :file:`foo.pth` 之前;而 :file:`spam` " +"已被省略因为它在两个路径配置文件中都未被提及。" + +#: ../../library/site.rst:215 +msgid "" +"Let's say that there is also a :file:`foo.start` file containing the " +"following::" +msgstr "让我们假设还有一个 :file:`foo.start` 文件包含以下内容::" + +#: ../../library/site.rst:218 +msgid "" +"# foo package startup code\n" +"\n" +"foo.submod:initialize" +msgstr "" +"# foo 包启动代码\n" +"\n" +"foo.submod:initialize" + +#: ../../library/site.rst:222 +msgid "" +"Now, after ``sys.path`` has been extended as above, and before Python turns " +"control over to user code, the ``foo.submod`` module is imported and the " +"``initialize()`` function from that module is called." +msgstr "" +"现在,当 ``sys.path`` 像上面那样扩展之后,并在 Python 将控制权交给用户代码之前,``foo.submod`` " +"模块将被导入且该模块的 ``initialize()`` 函数将被调用。" + +#: ../../library/site.rst:230 +msgid "Migrating from ``import`` lines in ``.pth`` files to ``.start`` files" +msgstr "将 ``.pth`` 文件中的 ``import`` 行迁移至 ``.start`` 文件" + +#: ../../library/site.rst:232 +msgid "" +"If your package currently ships a :file:`{name}.pth` file, you can keep all " +"``sys.path`` extension lines unchanged. Only ``import`` lines need to be " +"migrated." +msgstr "" +"如果你的包目前带有 :file:`{name}.pth` 文件,你可以保持所有 ``sys.path`` 扩展行不变。 只有 ``import`` " +"行需要迁移。" + +#: ../../library/site.rst:236 +msgid "" +"To migrate, create a callable (taking zero arguments) within an importable " +"module in your package. Reference it as a ``pkg.mod:callable`` entry point " +"in a matching :file:`{name}.start` file. Move everything on your ``import``" +" line after the first semi-colon into the ``callable()`` function." +msgstr "" + +#: ../../library/site.rst:241 +msgid "" +"If your package must straddle older Pythons that do not support :pep:`829` " +"and newer Pythons that do, change the ``import`` lines in your " +":file:`{name}.pth` to use the following form:" +msgstr "" + +#: ../../library/site.rst:245 +msgid "import pkg.mod; pkg.mod.callable()" +msgstr "" + +#: ../../library/site.rst:249 +msgid "" +"Older Pythons will execute these ``import`` lines, while newer Pythons will " +"ignore them in favor of the :file:`{name}.start` file. After the straddling" +" period, remove all ``import`` lines from your :file:`.pth` files." +msgstr "" + +#: ../../library/site.rst:255 +msgid ":mod:`!sitecustomize`" +msgstr "" + +#: ../../library/site.rst:259 +msgid "" +"After these path manipulations, an attempt is made to import a module named " +":mod:`!sitecustomize`, which can perform arbitrary site-specific " +"customizations. It is typically created by a system administrator in the " +"site-packages directory. If this import fails with an :exc:`ImportError` or" +" its subclass exception, and the exception's :attr:`~ImportError.name` " +"attribute equals ``'sitecustomize'``, it is silently ignored. If Python is " +"started without output streams available, as with :file:`pythonw.exe` on " +"Windows (which is used by default to start IDLE), attempted output from " +":mod:`!sitecustomize` is ignored. Any other exception causes a silent and " +"perhaps mysterious failure of the process." +msgstr "" + +#: ../../library/site.rst:271 +msgid ":mod:`!usercustomize`" +msgstr "" + +#: ../../library/site.rst:275 +msgid "" +"After this, an attempt is made to import a module named " +":mod:`!usercustomize`, which can perform arbitrary user-specific " +"customizations, if :data:`~site.ENABLE_USER_SITE` is true. This file is " +"intended to be created in the user site-packages directory (see below), " +"which is part of ``sys.path`` unless disabled by :option:`-s`. If this " +"import fails with an :exc:`ImportError` or its subclass exception, and the " +"exception's :attr:`~ImportError.name` attribute equals ``'usercustomize'``, " +"it is silently ignored." +msgstr "" + +#: ../../library/site.rst:283 +msgid "" +"Note that for some non-Unix systems, ``sys.prefix`` and ``sys.exec_prefix`` " +"are empty, and the path manipulations are skipped; however the import of " +":mod:`sitecustomize` and :mod:`!usercustomize` is still attempted." +msgstr "" + +#: ../../library/site.rst:292 +msgid "Readline configuration" +msgstr "Readline 配置" + +#: ../../library/site.rst:294 +msgid "" +"On systems that support :mod:`readline`, this module will also import and " +"configure the :mod:`rlcompleter` module, if Python is started in " +":ref:`interactive mode ` and without the :option:`-S` " +"option. The default behavior is to enable tab completion and to use " +":file:`~/.python_history` as the history save file. To disable it, delete " +"(or override) the :data:`sys.__interactivehook__` attribute in your " +":mod:`sitecustomize` or :mod:`usercustomize` module or your " +":envvar:`PYTHONSTARTUP` file." +msgstr "" + +#: ../../library/site.rst:303 +msgid "Activation of rlcompleter and history was made automatic." +msgstr "rlcompleter 和 history 会被自动激活。" + +#: ../../library/site.rst:308 +msgid "Module contents" +msgstr "模块内容" + +#: ../../library/site.rst:312 +msgid "A list of prefixes for site-packages directories." +msgstr "site-packages 目录的前缀列表。" + +#: ../../library/site.rst:317 +msgid "" +"Flag showing the status of the user site-packages directory. ``True`` means" +" that it is enabled and was added to ``sys.path``. ``False`` means that it " +"was disabled by user request (with :option:`-s` or " +":envvar:`PYTHONNOUSERSITE`). ``None`` means it was disabled for security " +"reasons (mismatch between user or group id and effective id) or by an " +"administrator." +msgstr "" +"显示用户 site-packages 目录状态的旗标。``True`` 意味着它被启用并被添加到 ``sys.path``。``False`` " +"意味着它按照用户请求被禁用 (通过 :option:`-s` 或 :envvar:`PYTHONNOUSERSITE`)。``None`` " +"意味着它因安全理由(user 或 group id 和 effective id 之间不匹配)或是被管理员所禁用。" + +#: ../../library/site.rst:327 +msgid "" +"Path to the user site-packages for the running Python. Can be ``None`` if " +":func:`getusersitepackages` hasn't been called yet. Default value is " +":file:`~/.local/lib/python{X.Y}[t]/site-packages` for UNIX and non-framework" +" macOS builds, :file:`~/Library/Python/{X.Y}/lib/python/site-packages` for " +"macOS framework builds, and " +":file:`{%APPDATA%}\\\\Python\\\\Python{XY}\\\\site-packages` on Windows. " +"The optional \"t\" indicates the free-threaded build. This directory is a " +"site directory, which means that :file:`.pth` files in it will be processed." +msgstr "" +"运行中的 Python 的用户级 site-packages 的路径。它可以为 ``None``,如果 " +":func:`getusersitepackages` 尚未被调用的话。默认值在 UNIX 和 macOS 非框架构建版上为 " +":file:`~/.local/lib/python{X.Y}[t]/site-packages`,在 macOS 框架构建版上为 " +":file:`~/Library/Python/{X.Y}/lib/python/site-packages`,而在 Windows 上为 " +":file:`{%APPDATA%}\\\\Python\\\\Python{XY}\\\\site-packages`。可选的 \"t\" " +"表示自由线程构建版。此目录属于 site 目录,这意味着其中的 :file:`.pth` 文件将会被处理。" + +#: ../../library/site.rst:339 +msgid "" +"Path to the base directory for the user site-packages. Can be ``None`` if " +":func:`getuserbase` hasn't been called yet. Default value is " +":file:`~/.local` for UNIX and macOS non-framework builds, " +":file:`~/Library/Python/{X.Y}` for macOS framework builds, and " +":file:`{%APPDATA%}\\\\Python` for Windows. This value is used to compute " +"the installation directories for scripts, data files, Python modules, etc. " +"for the :ref:`user installation scheme `. See also " +":envvar:`PYTHONUSERBASE`." +msgstr "" +"用户级 site-packages 的基准目录的路径。如果尚未调用 :func:`getuserbase` 则它可以为 ``None``。默认值在 " +"Unix 和 macOS 非框架编译版上为 :file:`~/.local`,在 macOS 框架编译版上为 " +":file:`~/Library/Python/{X.Y}`,而在 Windows 上则为 :file:`{%APPDATA%}\\\\Python`。" +" 这个值会被用于计算针对 :ref:`用户安装方案 ` 的脚本、数据文件、Python 模块等的安装目录。" +" 另请参阅 :envvar:`PYTHONUSERBASE`。" + +#: ../../library/site.rst:351 +msgid "" +"Adds all the standard site-specific directories to the module search path. " +"This function is called automatically when this module is imported, unless " +"the Python interpreter was started with the :option:`-S` flag." +msgstr "" +"将所有的标准站点专属目录添加到模块搜索路径。这个函数会在导入此模块时被自动调用,除非 Python 解释器启动时附带了 :option:`-S` 旗标。" + +#: ../../library/site.rst:355 +msgid "This function used to be called unconditionally." +msgstr "这个函数曾会被无条件调用。" + +#: ../../library/site.rst:361 +msgid "" +"Add a directory to sys.path and parse the :file:`.pth` and :file:`.start` " +"files found in that directory. Typically used in :mod:`sitecustomize` or " +":mod:`usercustomize` (see above)." +msgstr "" + +#: ../../library/site.rst:365 +msgid "" +"The *known_paths* argument is an optional set of case-normalized paths used " +"to prevent duplicate :data:`sys.path` entries. When ``None`` (the default)," +" the set is built from the current :data:`sys.path`." +msgstr "" + +#: ../../library/site.rst:369 +msgid "" +"While :file:`.pth` and :file:`.start` files are always parsed, set " +"*defer_processing_start_files* to ``True`` to prevent processing the startup" +" data found in those files, so that you can process them explicitly (this is" +" typically used by the :func:`main` function)." +msgstr "" + +#: ../../library/site.rst:376 +msgid "" +"Also processes :file:`.start` files. See :ref:`site-start-files`. All " +":file:`.pth` and :file:`.start` files are now read and accumulated before " +"any path extensions, ``import`` line execution, or entry point invocations " +"take place." +msgstr "" + +#: ../../library/site.rst:384 +msgid "Return a list containing all global site-packages directories." +msgstr "返回包含所有全局 site-packages 目录的列表。" + +#: ../../library/site.rst:391 +msgid "" +"Return the path of the user base directory, :data:`USER_BASE`. If it is not" +" initialized yet, this function will also set it, respecting " +":envvar:`PYTHONUSERBASE`." +msgstr "" +"返回用户基准目录的路径 :data:`USER_BASE`。如果它尚未被初始化,则此函数还将参照 :envvar:`PYTHONUSERBASE` " +"来设置它。" + +#: ../../library/site.rst:400 +msgid "" +"Return the path of the user-specific site-packages directory, " +":data:`USER_SITE`. If it is not initialized yet, this function will also " +"set it, respecting :data:`USER_BASE`. To determine if the user-specific " +"site-packages was added to ``sys.path`` :data:`ENABLE_USER_SITE` should be " +"used." +msgstr "" +"返回用户专属 site-packages 目录的路径 :data:`USER_SITE`。如果它尚未被初始化,则此函数还将参照 " +":data:`USER_BASE` 来设置它。要确定用户专属 site-packages 是否已被添加到 ``sys.path`` 则应当使用 " +":data:`ENABLE_USER_SITE`." + +#: ../../library/site.rst:412 +msgid "Command-line interface" +msgstr "命令行接口" + +#: ../../library/site.rst:416 +msgid "" +"The :mod:`!site` module also provides a way to get the user directories from" +" the command line:" +msgstr "" + +#: ../../library/site.rst:419 +msgid "" +"$ python -m site --user-site\n" +"/home/user/.local/lib/python3.11/site-packages" +msgstr "" +"$ python -m site --user-site\n" +"/home/user/.local/lib/python3.11/site-packages" + +#: ../../library/site.rst:424 +msgid "" +"If it is called without arguments, it will print the contents of " +":data:`sys.path` on the standard output, followed by the value of " +":data:`USER_BASE` and whether the directory exists, then the same thing for " +":data:`USER_SITE`, and finally the value of :data:`ENABLE_USER_SITE`." +msgstr "" +"如果它被不带参数地调用,它将在标准输出打印 :data:`sys.path` 的内容,再打印 :data:`USER_BASE` " +"的值以及该目录是否存在,然后打印 :data:`USER_SITE` 的相应信息,最后打印 :data:`ENABLE_USER_SITE` 的值。" + +#: ../../library/site.rst:431 +msgid "Print the path to the user base directory." +msgstr "输出用户基准目录的路径。" + +#: ../../library/site.rst:435 +msgid "Print the path to the user site-packages directory." +msgstr "输出用户 site-packages 目录的路径。" + +#: ../../library/site.rst:437 +msgid "" +"If both options are given, user base and user site will be printed (always " +"in this order), separated by :data:`os.pathsep`." +msgstr "如果同时给出了两个选项,则将打印用户基准目录和用户站点信息(总是按此顺序),并以 :data:`os.pathsep` 分隔。" + +#: ../../library/site.rst:440 +msgid "" +"If any option is given, the script will exit with one of these values: ``0``" +" if the user site-packages directory is enabled, ``1`` if it was disabled by" +" the user, ``2`` if it is disabled for security reasons or by an " +"administrator, and a value greater than 2 if there is an error." +msgstr "" +"如果给出了其中一个选项,脚本将退出并返回以下值中的一个:如果用户级 site-packages 目录被启用则为 ``0``,如果它被用户禁用则为 " +"``1``,如果它因安全理由或被管理员禁用则为 ``2``,如果发生错误则为大于 2 的值。" + +#: ../../library/site.rst:447 +msgid ":pep:`370` -- Per user site-packages directory" +msgstr ":pep:`370` -- 分用户的 site-packages 目录" + +#: ../../library/site.rst:448 +msgid "" +":pep:`829` -- Startup entry points and the deprecation of import lines in " +"``.pth`` files" +msgstr ":pep:`829` -- 启动入口点与 ``.pth`` 文件中导入行的弃用" + +#: ../../library/site.rst:449 +msgid ":ref:`sys-path-init` -- The initialization of :data:`sys.path`." +msgstr ":ref:`sys-path-init` -- :data:`sys.path` 的初始化。" + +#: ../../library/site.rst:16 +msgid "module" +msgstr "module" + +#: ../../library/site.rst:16 +msgid "search" +msgstr "搜索" + +#: ../../library/site.rst:16 ../../library/site.rst:176 +msgid "path" +msgstr "path" + +#: ../../library/site.rst:29 +msgid "site-packages" +msgstr "site-packages" + +#: ../../library/site.rst:29 +msgid "directory" +msgstr "directory" + +#: ../../library/site.rst:70 +msgid "# (hash)" +msgstr "# (hash)" + +#: ../../library/site.rst:70 +msgid "comment" +msgstr "注释" + +#: ../../library/site.rst:70 +msgid "statement" +msgstr "statement -- 语句" + +#: ../../library/site.rst:70 +msgid "import" +msgstr "import" + +#: ../../library/site.rst:176 +msgid "package" +msgstr "包" + +#: ../../library/site.rst:176 +msgid "configuration" +msgstr "配置" + +#: ../../library/site.rst:176 +msgid "file" +msgstr "文件" diff --git a/library/smtpd.po b/library/smtpd.po new file mode 100644 index 0000000000..99c98cddb4 --- /dev/null +++ b/library/smtpd.po @@ -0,0 +1,49 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/smtpd.rst:2 +msgid ":mod:`!smtpd` --- SMTP Server" +msgstr ":mod:`!smtpd` --- SMTP 服务器" + +#: ../../library/smtpd.rst:10 +msgid "" +"This module is no longer part of the Python standard library. It was " +":ref:`removed in Python 3.12 ` after being deprecated " +"in Python 3.6. The removal was decided in :pep:`594`." +msgstr "" +"此模块已不再是 Python 标准库的一部分。它在 Python 3.6 中被弃用后又在 :ref:`Python 3.12 中被移除 " +"`。移除计划是在 :pep:`594` 中确定的。" + +#: ../../library/smtpd.rst:14 +msgid "" +"A possible replacement is the third-party :pypi:`aiosmtpd` library. This " +"library is not maintained or supported by the Python core team." +msgstr "可用的替代是第三方库 :pypi:`aiosmtpd`。这个库不被 Python 核心团队所支持或维护。" + +#: ../../library/smtpd.rst:17 +msgid "" +"The last version of Python that provided the :mod:`!smtpd` module was " +"`Python 3.11 `_." +msgstr "" +"提供 :mod:`!smtpd` 模块的最后一个 Python 版本是 `Python 3.11 " +"`_." diff --git a/library/smtplib.po b/library/smtplib.po new file mode 100644 index 0000000000..1b1d5062d2 --- /dev/null +++ b/library/smtplib.po @@ -0,0 +1,997 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/smtplib.rst:2 +msgid ":mod:`!smtplib` --- SMTP protocol client" +msgstr ":mod:`!smtplib` --- SMTP 协议客户端" + +#: ../../library/smtplib.rst:7 +msgid "**Source code:** :source:`Lib/smtplib.py`" +msgstr "**源代码:** :source:`Lib/smtplib.py`" + +#: ../../library/smtplib.rst:15 +msgid "" +"The :mod:`!smtplib` module defines an SMTP client session object that can be" +" used to send mail to any internet machine with an SMTP or ESMTP listener " +"daemon. For details of SMTP and ESMTP operation, consult :rfc:`821` (Simple" +" Mail Transfer Protocol) and :rfc:`1869` (SMTP Service Extensions)." +msgstr "" +":mod:`!smtplib` 模块定义了一个 SMTP 客户端会话对象,该对象可被用来向任何具有 SMTP 或 ESMTP " +"监听守护程序的互联网机器发送邮件。 有关 SMTP 和 ESMTP 操作的详情,请参阅 :rfc:`821` (简单邮件传输协议) 和 " +":rfc:`1869` (SMTP 服务扩展)。" + +#: ../../includes/wasm-notavail.rst:3 +msgid "Availability" +msgstr "可用性" + +#: ../../includes/wasm-notavail.rst:5 +msgid "" +"This module does not work or is not available on WebAssembly. See " +":ref:`wasm-availability` for more information." +msgstr "此模块在 WebAssembly 平台上无效或不可用。请参阅 :ref:`wasm-availability` 了解详情。" + +#: ../../library/smtplib.rst:24 +msgid "" +"An :class:`SMTP` instance encapsulates an SMTP connection. It has methods " +"that support a full repertoire of SMTP and ESMTP operations." +msgstr "" + +#: ../../library/smtplib.rst:27 +msgid "" +"If the host parameter is set to a truthy value, :meth:`SMTP.connect` is " +"called with host and port automatically when the object is created; " +"otherwise, :meth:`!connect` must be called manually." +msgstr "" + +#: ../../library/smtplib.rst:31 +msgid "" +"If specified, *local_hostname* is used as the FQDN of the local host in the " +"HELO/EHLO command. Otherwise, the local hostname is found using " +":func:`socket.getfqdn`. If the :meth:`connect` call returns anything other " +"than a success code, an :exc:`SMTPConnectError` is raised. The optional " +"*timeout* parameter specifies a timeout in seconds for blocking operations " +"like the connection attempt (if not specified, the global default timeout " +"setting will be used). If the timeout expires, :exc:`TimeoutError` is " +"raised. The optional *source_address* parameter allows binding to some " +"specific source address in a machine with multiple network interfaces, " +"and/or to some specific source TCP port. It takes a 2-tuple ``(host, " +"port)``, for the socket to bind to as its source address before connecting. " +"If omitted (or if *host* or *port* are ``''`` and/or ``0`` respectively) the" +" OS default behavior will be used." +msgstr "" + +#: ../../library/smtplib.rst:45 +msgid "" +"For normal use, you should only require the initialization/connect, " +":meth:`sendmail`, and :meth:`SMTP.quit` methods. An example is included " +"below." +msgstr "" +"正常使用时,只需要初始化或 connect 方法,:meth:`sendmail` 方法,再加上 :meth:`SMTP.quit` " +"方法即可。下文包括了一个示例。" + +#: ../../library/smtplib.rst:49 +msgid "" +"The :class:`SMTP` class supports the :keyword:`with` statement. When used " +"like this, the SMTP ``QUIT`` command is issued automatically when the " +":keyword:`!with` statement exits. E.g.::" +msgstr "" +":class:`SMTP` 类支持 :keyword:`with` 语句。当这样使用时,:keyword:`!with` 语句一退出就会自动发出 " +"SMTP ``QUIT`` 命令。例如::" + +#: ../../library/smtplib.rst:53 +msgid "" +">>> from smtplib import SMTP\n" +">>> with SMTP(\"domain.org\") as smtp:\n" +"... smtp.noop()\n" +"...\n" +"(250, b'Ok')\n" +">>>" +msgstr "" +">>> from smtplib import SMTP\n" +">>> with SMTP(\"domain.org\") as smtp:\n" +"... smtp.noop()\n" +"...\n" +"(250, b'Ok')\n" +">>>" + +#: ../../library/smtplib.rst:60 ../../library/smtplib.rst:62 +msgid "" +"All commands will raise an :ref:`auditing event ` " +"``smtplib.SMTP.send`` with arguments ``self`` and ``data``, where ``data`` " +"is the bytes about to be sent to the remote host." +msgstr "" +"所有命令都会引发一个 :ref:`审计事件 ` ``smtplib.SMTP.send``,附带参数 ``self`` 和 " +"``data``,其中 ``data`` 是即将发送到远程主机的字节串。" + +#: ../../library/smtplib.rst:68 +msgid "The default port used for SMTP connections (25)." +msgstr "" + +#: ../../library/smtplib.rst:70 +msgid "Support for the :keyword:`with` statement was added." +msgstr "添加了对 :keyword:`with` 语句的支持。" + +#: ../../library/smtplib.rst:73 +msgid "*source_address* argument was added." +msgstr "添加了 *source_address* 参数。" + +#: ../../library/smtplib.rst:76 +msgid "The SMTPUTF8 extension (:rfc:`6531`) is now supported." +msgstr "现在已支持 SMTPUTF8 扩展 (:rfc:`6531`)。" + +#: ../../library/smtplib.rst:79 +msgid "" +"If the *timeout* parameter is set to be zero, it will raise a " +":class:`ValueError` to prevent the creation of a non-blocking socket." +msgstr "如果 *timeout* 参数设置为 0,创建非阻塞套接字时,它将引发 :class:`ValueError` 来阻止该操作。" + +#: ../../library/smtplib.rst:86 +msgid "" +"An :class:`SMTP_SSL` instance behaves exactly the same as instances of " +":class:`SMTP`. :class:`SMTP_SSL` should be used for situations where SSL is " +"required from the beginning of the connection and using " +":meth:`SMTP.starttls` is not appropriate." +msgstr "" + +#: ../../library/smtplib.rst:91 +msgid "" +"If the host parameter is set to a truthy value, :meth:`SMTP.connect` is " +"called with host and port automatically when the object is created; " +"otherwise, :meth:`!SMTP.connect` must be called manually." +msgstr "" + +#: ../../library/smtplib.rst:95 +msgid "" +"The optional arguments *local_hostname*, *timeout* and *source_address* have" +" the same meaning as they do in the :class:`SMTP` class. *context*, also " +"optional, can contain a :class:`~ssl.SSLContext` and allows configuring " +"various aspects of the secure connection. Please read :ref:`ssl-security` " +"for best practices." +msgstr "" + +#: ../../library/smtplib.rst:103 +msgid "The default port used for SMTP-over-SSL connections (465)." +msgstr "" + +#: ../../library/smtplib.rst:105 ../../library/smtplib.rst:440 +msgid "*context* was added." +msgstr "增加了 *context*。" + +#: ../../library/smtplib.rst:108 +msgid "The *source_address* argument was added." +msgstr "添加了 *source_address* 参数。" + +#: ../../library/smtplib.rst:111 +msgid "" +"The class now supports hostname check with " +":attr:`ssl.SSLContext.check_hostname` and *Server Name Indication* (see " +":const:`ssl.HAS_SNI`)." +msgstr "" +"该类现在支持使用 :attr:`ssl.SSLContext.check_hostname` 和 *服务器名称提示* (参见 " +":const:`ssl.HAS_SNI`) 进行主机名检测。" + +#: ../../library/smtplib.rst:116 +msgid "" +"If the *timeout* parameter is set to be zero, it will raise a " +":class:`ValueError` to prevent the creation of a non-blocking socket" +msgstr "如果 *timeout* 形参被设为零,则它将引发 :class:`ValueError` 来阻止创建非阻塞的套接字" + +#: ../../library/smtplib.rst:120 ../../library/smtplib.rst:428 +msgid "The deprecated *keyfile* and *certfile* parameters have been removed." +msgstr "已弃用的 *keyfile* 和 *certfile* 形参已被移除。" + +#: ../../library/smtplib.rst:126 +msgid "" +"The LMTP protocol, which is very similar to ESMTP, is heavily based on the " +"standard SMTP client. It's common to use Unix sockets for LMTP, so our " +":meth:`~SMTP.connect` method must support that as well as a regular " +"host:port server. The optional arguments *local_hostname* and " +"*source_address* have the same meaning as they do in the :class:`SMTP` " +"class. To specify a Unix socket, you must use an absolute path for *host*, " +"starting with a '/'." +msgstr "" +"LMTP 协议与 ESMTP 非常相似,它很大程度上基于标准 SMTP 客户端。将 Unix 套接字用于 LMTP 是很常见的,因此我们的 " +":meth:`~SMTP.connect` 方法必须支持它以及常规的 host:port 服务器。可选参数 *local_hostname* 和 " +"*source_address* 的含义与它们在 :class:`SMTP` 类中的相同。要指定 Unix 套接字,你必须使用绝对路径作为 " +"*host*,即以 '/' 打头。" + +#: ../../library/smtplib.rst:133 +msgid "" +"Authentication is supported, using the regular SMTP mechanism. When using a " +"Unix socket, LMTP generally don't support or require any authentication, but" +" your mileage might vary." +msgstr "支持使用常规的 SMTP 机制来进行认证。当使用 Unix 套接字时,LMTP 通常不支持或要求任何认证,但你的情况可能会有所不同。" + +#: ../../library/smtplib.rst:137 +msgid "The optional *timeout* parameter was added." +msgstr "添加了可选的 *timeout* 形参。" + +#: ../../library/smtplib.rst:141 +msgid "A nice selection of exceptions is defined as well:" +msgstr "同样地定义了一组精心选择的异常:" + +#: ../../library/smtplib.rst:146 +msgid "" +"Subclass of :exc:`OSError` that is the base exception class for all the " +"other exceptions provided by this module." +msgstr ":exc:`OSError` 的子类,它是本模块提供的所有其他异常的基类。" + +#: ../../library/smtplib.rst:149 +msgid "SMTPException became subclass of :exc:`OSError`" +msgstr "SMTPException 已成为 :exc:`OSError` 的子类" + +#: ../../library/smtplib.rst:155 +msgid "" +"This exception is raised when the server unexpectedly disconnects, or when " +"an attempt is made to use the :class:`SMTP` instance before connecting it to" +" a server." +msgstr "当服务器意外断开连接,或在 :class:`SMTP` 实例连接到服务器之前尝试使用它时将引发此异常。" + +#: ../../library/smtplib.rst:162 +msgid "" +"Base class for all exceptions that include an SMTP error code. These " +"exceptions are generated in some instances when the SMTP server returns an " +"error code." +msgstr "包括 SMTP 错误代码的所有异常的基类。这些异常会在某些情况下当 SMTP 服务器返回错误代码时生成。" + +#: ../../library/smtplib.rst:167 +msgid "The error code." +msgstr "错误代码。" + +#: ../../library/smtplib.rst:171 +msgid "The error message." +msgstr "错误消息。" + +#: ../../library/smtplib.rst:176 +msgid "" +"Sender address refused. In addition to the attributes set by on all " +":exc:`SMTPResponseException` exceptions, this sets 'sender' to the string " +"that the SMTP server refused." +msgstr "" +"发送方地址被拒绝。除了在所有 :exc:`SMTPResponseException` 异常上设置的属性,还会将 'sender' 设为 SMTP " +"服务器所拒绝的字符串。" + +#: ../../library/smtplib.rst:183 +msgid "All recipient addresses refused." +msgstr "所有接收方地址已被拒绝。" + +#: ../../library/smtplib.rst:187 +msgid "" +"A dictionary of exactly the same sort as returned by :meth:`SMTP.sendmail` " +"containing the errors for each recipient." +msgstr "一个字典,与 :meth:`SMTP.sendmail` 所返回的字典类型完全相同,包含关于每个收件人的错误。" + +#: ../../library/smtplib.rst:194 +msgid "The SMTP server refused to accept the message data." +msgstr "SMTP 服务器拒绝接收消息数据。" + +#: ../../library/smtplib.rst:199 +msgid "Error occurred during establishment of a connection with the server." +msgstr "在建立与服务器的连接期间发生了错误。" + +#: ../../library/smtplib.rst:204 +msgid "The server refused our ``HELO`` message." +msgstr "服务器拒绝了我们的 ``HELO`` 消息。" + +#: ../../library/smtplib.rst:209 +msgid "The command or option attempted is not supported by the server." +msgstr "尝试的命令或选项不被服务器所支持。" + +#: ../../library/smtplib.rst:216 +msgid "" +"SMTP authentication went wrong. Most probably the server didn't accept the " +"username/password combination provided." +msgstr "SMTP 认证出现问题。最大的可能是服务器不接受所提供的用户名/密码组合。" + +#: ../../library/smtplib.rst:222 +msgid ":rfc:`821` - Simple Mail Transfer Protocol" +msgstr ":rfc:`821` - 简单邮件传输协议" + +#: ../../library/smtplib.rst:223 +msgid "" +"Protocol definition for SMTP. This document covers the model, operating " +"procedure, and protocol details for SMTP." +msgstr "SMTP 的协议定义。该文件涵盖了 SMTP 的模型、操作程序和协议细节。" + +#: ../../library/smtplib.rst:226 +msgid ":rfc:`1869` - SMTP Service Extensions" +msgstr ":rfc:`1869` - SMTP 服务扩展" + +#: ../../library/smtplib.rst:227 +msgid "" +"Definition of the ESMTP extensions for SMTP. This describes a framework for" +" extending SMTP with new commands, supporting dynamic discovery of the " +"commands provided by the server, and defines a few additional commands." +msgstr "" +"定义了 SMTP 的 ESMTP 扩展。这描述了一个用新命令扩展 SMTP 的框架,支持动态发现服务器所提供的命令,并定义了一些额外的命令。" + +#: ../../library/smtplib.rst:235 +msgid "SMTP Objects" +msgstr "SMTP 对象" + +#: ../../library/smtplib.rst:237 +msgid "An :class:`SMTP` instance has the following methods:" +msgstr "一个 :class:`SMTP` 实例拥有以下方法:" + +#: ../../library/smtplib.rst:241 +msgid "" +"Set the debug output level. A value of 1 or ``True`` for *level* results in" +" debug messages for connection and for all messages sent to and received " +"from the server. A value of 2 for *level* results in these messages being " +"timestamped." +msgstr "" +"设置调试输出级别。如果 *level* 的值为 1 或 ``True``,就会产生连接的调试信息,以及所有发送到服务器和从服务器接收的信息。如果 " +"*level* 的值为 2,则这些信息会被加上时间戳。" + +#: ../../library/smtplib.rst:246 +msgid "Added debuglevel 2." +msgstr "添加了调试级别 2。" + +#: ../../library/smtplib.rst:251 +msgid "" +"Send a command *cmd* to the server. The optional argument *args* is simply " +"concatenated to the command, separated by a space." +msgstr "向服务器发送一条命令 *cmd* 。可选的参数 *args* 被简单地串联到命令中,用一个空格隔开。" + +#: ../../library/smtplib.rst:254 +msgid "" +"This returns a 2-tuple composed of a numeric response code and the actual " +"response line (multiline responses are joined into one long line.)" +msgstr "这将返回一个由数字响应代码和实际响应行组成的 2 元组(多行响应被连接成一个长行)。" + +#: ../../library/smtplib.rst:257 +msgid "" +"In normal operation it should not be necessary to call this method " +"explicitly. It is used to implement other methods and may be useful for " +"testing private extensions." +msgstr "在正常操作中,应该没有必要明确地调用这个方法。它被用来实现其他方法,对于测试私有扩展可能很有用。" + +#: ../../library/smtplib.rst:261 +msgid "" +"If the connection to the server is lost while waiting for the reply, " +":exc:`SMTPServerDisconnected` will be raised." +msgstr "如果在等待回复的过程中,与服务器的连接丢失, :exc:`SMTPServerDisconnected` 将被触发。" + +#: ../../library/smtplib.rst:267 +msgid "" +"Connect to a host on a given port. The defaults are to connect to the local" +" host at the standard SMTP port (25). If the hostname ends with a colon " +"(``':'``) followed by a number, that suffix will be stripped off and the " +"number interpreted as the port number to use. This method is automatically " +"invoked by the constructor if a host is specified during instantiation. " +"Returns a 2-tuple of the response code and message sent by the server in its" +" connection response." +msgstr "" +"连接到某个主机的某个端口。默认是连接到 localhost 的标准 SMTP 端口(25)上。如果主机名以冒号 (``':'``) " +"结尾,后跟数字,则该后缀将被删除,且数字将视作要使用的端口号。如果在实例化时指定了 host,则构造函数会自动调用本方法。返回包含响应码和响应消息的 2" +" 元组,它们由服务器在其连接响应中发送。" + +#: ../../library/smtplib.rst:275 +msgid "" +"If port is not changed from its default value of 0, the value of the " +":attr:`default_port` attribute is used." +msgstr "" + +#: ../../library/smtplib.rst:278 +msgid "" +"Raises an :ref:`auditing event ` ``smtplib.connect`` with " +"arguments ``self``, ``host``, ``port``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``smtplib.connect`` 并附带参数 ``self``, ``host``, " +"``port``." + +#: ../../library/smtplib.rst:283 +msgid "" +"Identify yourself to the SMTP server using ``HELO``. The hostname argument " +"defaults to the fully qualified domain name of the local host. The message " +"returned by the server is stored as the :attr:`helo_resp` attribute of the " +"object." +msgstr "" +"使用 ``HELO`` 向 SMTP 服务器表明自己的身份。hostname 参数默认为本地主机的完全合格域名。服务器返回的消息被存储为对象的 " +":attr:`helo_resp` 属性。" + +#: ../../library/smtplib.rst:288 +msgid "" +"In normal operation it should not be necessary to call this method " +"explicitly. It will be implicitly called by the :meth:`sendmail` when " +"necessary." +msgstr "在正常操作中,应该没有必要明确调用这个方法。它将在必要时被 :meth:`sendmail` 隐式调用。" + +#: ../../library/smtplib.rst:294 +msgid "" +"Identify yourself to an ESMTP server using ``EHLO``. The hostname argument " +"defaults to the fully qualified domain name of the local host. Examine the " +"response for ESMTP option and store them for use by :meth:`has_extn`. Also " +"sets several informational attributes: the message returned by the server is" +" stored as the :attr:`ehlo_resp` attribute, :attr:`does_esmtp` is set to " +"``True`` or ``False`` depending on whether the server supports ESMTP, and " +":attr:`esmtp_features` will be a dictionary containing the names of the SMTP" +" service extensions this server supports, and their parameters (if any)." +msgstr "" +"使用 ``EHLO`` 向 ESMTP 服务器表明自己的身份。hostname 参数默认为本地主机的完全合格域名。检查 ESMTP " +"选项的响应,并存储它们供 :meth:`has_extn` 使用。同时设置几个信息属性:服务器返回的消息被存储为 :attr:`ehlo_resp` " +"属性, :attr:`does_esmtp` 根据服务器是否支持 ESMTP 被设置为 ``True`` 或 ``False``,而 " +":attr:`esmtp_features` 将是一个字典,包含这个服务器支持的 SMTP 服务扩展的名称,以及它们的参数(如果有)。" + +#: ../../library/smtplib.rst:304 +msgid "" +"Unless you wish to use :meth:`has_extn` before sending mail, it should not " +"be necessary to call this method explicitly. It will be implicitly called " +"by :meth:`sendmail` when necessary." +msgstr "" +"除非你想在发送邮件前使用 :meth:`has_extn`,否则应该没有必要明确调用这个方法。它将在必要时被 :meth:`sendmail` " +"隐式调用。" + +#: ../../library/smtplib.rst:310 +msgid "" +"This method calls :meth:`ehlo` and/or :meth:`helo` if there has been no " +"previous ``EHLO`` or ``HELO`` command this session. It tries ESMTP ``EHLO``" +" first." +msgstr "" +"如果这个会话中没有先前的 ``EHLO`` 或 ``HELO`` 命令,该方法会调用 :meth:`ehlo` 和/或 :meth:`helo` " +"。它首先尝试 ESMTP ``EHLO``。" + +#: ../../library/smtplib.rst:314 ../../library/smtplib.rst:343 +#: ../../library/smtplib.rst:431 ../../library/smtplib.rst:499 +msgid ":exc:`SMTPHeloError`" +msgstr ":exc:`SMTPHeloError`" + +#: ../../library/smtplib.rst:315 ../../library/smtplib.rst:344 +#: ../../library/smtplib.rst:432 ../../library/smtplib.rst:500 +msgid "The server didn't reply properly to the ``HELO`` greeting." +msgstr "服务器没有正确回复 ``HELO`` 问候。" + +#: ../../library/smtplib.rst:319 +msgid "" +"Return :const:`True` if *name* is in the set of SMTP service extensions " +"returned by the server, :const:`False` otherwise. Case is ignored." +msgstr "" +"如果 *name* 在服务器返回的 SMTP 服务扩展集合中,返回 :const:`True`,否则为 :const:`False`。大小写被忽略。" + +#: ../../library/smtplib.rst:325 +msgid "" +"Check the validity of an address on this server using SMTP ``VRFY``. Returns" +" a tuple consisting of code 250 and a full :rfc:`822` address (including " +"human name) if the user address is valid. Otherwise returns an SMTP error " +"code of 400 or greater and an error string." +msgstr "" +"使用 SMTP ``VRFY`` 检查此服务器上的某个地址是否有效。如果用户地址有效则返回一个由代码 250 和完整 :rfc:`822` " +"地址(包括人名)组成的元组。否则返回 400 或更大的 SMTP 错误代码以及一个错误字符串。" + +#: ../../library/smtplib.rst:332 +msgid "Many sites disable SMTP ``VRFY`` in order to foil spammers." +msgstr "许多网站都禁用 SMTP ``VRFY`` 以阻止垃圾邮件。" + +#: ../../library/smtplib.rst:337 +msgid "" +"Log in on an SMTP server that requires authentication. The arguments are the" +" username and the password to authenticate with. If there has been no " +"previous ``EHLO`` or ``HELO`` command this session, this method tries ESMTP " +"``EHLO`` first. This method will return normally if the authentication was " +"successful, or may raise the following exceptions:" +msgstr "" +"登录到一个需要认证的 SMTP 服务器。参数是用于认证的用户名和密码。如果会话在之前没有执行过 ``EHLO`` 或 ``HELO`` " +"命令,此方法会先尝试 ESMTP ``EHLO``。如果认证成功则此方法将正常返回,否则可能引发以下异常:" + +#: ../../library/smtplib.rst:346 +msgid ":exc:`SMTPAuthenticationError`" +msgstr ":exc:`SMTPAuthenticationError`" + +#: ../../library/smtplib.rst:347 +msgid "The server didn't accept the username/password combination." +msgstr "服务器不接受所提供的用户名/密码组合。" + +#: ../../library/smtplib.rst:349 ../../library/smtplib.rst:434 +#: ../../library/smtplib.rst:509 +msgid ":exc:`SMTPNotSupportedError`" +msgstr ":exc:`SMTPNotSupportedError`" + +#: ../../library/smtplib.rst:350 +msgid "The ``AUTH`` command is not supported by the server." +msgstr "服务器不支持 ``AUTH`` 命令。" + +#: ../../library/smtplib.rst:352 +msgid ":exc:`SMTPException`" +msgstr ":exc:`SMTPException`" + +#: ../../library/smtplib.rst:353 +msgid "No suitable authentication method was found." +msgstr "未找到适当的认证方法。" + +#: ../../library/smtplib.rst:355 +msgid "" +"Each of the authentication methods supported by :mod:`!smtplib` are tried in" +" turn if they are advertised as supported by the server. See :meth:`auth` " +"for a list of supported authentication methods. *initial_response_ok* is " +"passed through to :meth:`auth`." +msgstr "" +":mod:`!smtplib` 支持的每种认证方法如果被服务器声明为支持,就会依次尝试。受支持的认证方法列表参见 :meth:`auth`。 " +"*initial_response_ok* 会被传递给 :meth:`auth`。" + +#: ../../library/smtplib.rst:360 +msgid "" +"Optional keyword argument *initial_response_ok* specifies whether, for " +"authentication methods that support it, an \"initial response\" as specified" +" in :rfc:`4954` can be sent along with the ``AUTH`` command, rather than " +"requiring a challenge/response." +msgstr "" +"可选的关键字参数 *initial_response_ok* 指定对于支持它的认证方法,是否可以与 ``AUTH`` 命令一起发送 " +":rfc:`4954` 中所规定的\"初始响应\",而不是要求质询/响应。" + +#: ../../library/smtplib.rst:365 +msgid "" +":exc:`SMTPNotSupportedError` may be raised, and the *initial_response_ok* " +"parameter was added." +msgstr "可能会引发 :exc:`SMTPNotSupportedError`,并添加 *initial_response_ok* 形参。" + +#: ../../library/smtplib.rst:372 +msgid "" +"Issue an ``SMTP`` ``AUTH`` command for the specified authentication " +"*mechanism*, and handle the challenge response via *authobject*." +msgstr "为指定的认证机制 *mechanism* 发送 ``SMTP`` ``AUTH`` 命令,并通过 *authobject* 处理质询响应。" + +#: ../../library/smtplib.rst:375 +msgid "" +"*mechanism* specifies which authentication mechanism is to be used as " +"argument to the ``AUTH`` command; the valid values are those listed in the " +"``auth`` element of :attr:`esmtp_features`." +msgstr "" +"*mechanism* 指定要使用何种认证机制作为 ``AUTH`` 命令的参数;可用的值是在 :attr:`esmtp_features` 的 " +"``auth`` 元素中列出的内容。" + +#: ../../library/smtplib.rst:379 +msgid "" +"*authobject* must be a callable object taking an optional single argument::" +msgstr "*authobject* 必须为接受一个可选的单独参数的可调用对象::" + +#: ../../library/smtplib.rst:381 +msgid "data = authobject(challenge=None)" +msgstr "data = authobject(challenge=None)" + +#: ../../library/smtplib.rst:383 +msgid "" +"If optional keyword argument *initial_response_ok* is true, ``authobject()``" +" will be called first with no argument. It can return the :rfc:`4954` " +"\"initial response\" ASCII ``str`` which will be encoded and sent with the " +"``AUTH`` command as below. If the ``authobject()`` does not support an " +"initial response (e.g. because it requires a challenge), it should return " +"``None`` when called with ``challenge=None``. If *initial_response_ok* is " +"false, then ``authobject()`` will not be called first with ``None``." +msgstr "" +"如果可选的关键字参数 *initial_response_ok* 为真值,则将先不带参数地调用 ``authobject()``。它可以返回 " +":rfc:`4954` \"初始响应\" ASCII ``str``,其内容将被编码并使用下述的 ``AUTH`` 命令来发送。如果 " +"``authobject()`` 不支持初始响应(例如由于要求一个质询),它应当将 ``None`` 作为附带 ``challenge=None`` " +"调用的返回值。如果 *initial_response_ok* 为假值,则 ``authobject()`` 将不会附带 ``None`` 被首先调用。" + +#: ../../library/smtplib.rst:391 +msgid "" +"If the initial response check returns ``None``, or if *initial_response_ok* " +"is false, ``authobject()`` will be called to process the server's challenge " +"response; the *challenge* argument it is passed will be a ``bytes``. It " +"should return ASCII ``str`` *data* that will be base64 encoded and sent to " +"the server." +msgstr "" +"如果初始响应检测返回了 ``None``,或者如果 *initial_response_ok* 为假值,则将调用 ``authobject()`` " +"来处理服务器的质询响应;传递给它的 *challenge* 参数将为一个 ``bytes``。它应当返回 ASCII ``str`` " +"*data*,该数据将被 base64 编码后发送给服务器。" + +#: ../../library/smtplib.rst:397 +msgid "" +"The ``SMTP`` class provides ``authobjects`` for the ``CRAM-MD5``, ``PLAIN``," +" and ``LOGIN`` mechanisms; they are named ``SMTP.auth_cram_md5``, " +"``SMTP.auth_plain``, and ``SMTP.auth_login`` respectively. They all require" +" that the ``user`` and ``password`` properties of the ``SMTP`` instance are " +"set to appropriate values." +msgstr "" +"``SMTP`` 类提供的 ``authobjects`` 针对 ``CRAM-MD5``, ``PLAIN`` 和 ``LOGIN`` " +"等机制;它们的名称分别是 ``SMTP.auth_cram_md5``, ``SMTP.auth_plain`` 和 " +"``SMTP.auth_login``。它们都要求将 ``user`` 和 ``password`` 这两个 ``SMTP`` 实例属性设为适当的值。" + +#: ../../library/smtplib.rst:403 +msgid "" +"User code does not normally need to call ``auth`` directly, but can instead " +"call the :meth:`login` method, which will try each of the above mechanisms " +"in turn, in the order listed. ``auth`` is exposed to facilitate the " +"implementation of authentication methods not (or not yet) supported directly" +" by :mod:`!smtplib`." +msgstr "" +"用户代码通常不需要直接调用 ``auth``,而是可以调用 :meth:`login` 方法,该方法将按照上述列出的顺序依次尝试每种机制。 " +"``auth`` 被公开出来是为了便于实现 :mod:`!smtplib` 尚不(或尚未)直接支持的认证方法。" + +#: ../../library/smtplib.rst:414 +msgid "" +"Put the SMTP connection in TLS (Transport Layer Security) mode. All SMTP " +"commands that follow will be encrypted. You should then call :meth:`ehlo` " +"again." +msgstr "将 SMTP 连接设为 TLS (传输层安全) 模式。后续的所有 SMTP 命令都将被加密。你应当随即再次调用 :meth:`ehlo`。" + +#: ../../library/smtplib.rst:418 +msgid "" +"If *keyfile* and *certfile* are provided, they are used to create an " +":class:`ssl.SSLContext`." +msgstr "如果提供了 *keyfile* 和 *certfile*,它们会被用来创建 :class:`ssl.SSLContext`。" + +#: ../../library/smtplib.rst:421 +msgid "" +"Optional *context* parameter is an :class:`ssl.SSLContext` object; This is " +"an alternative to using a keyfile and a certfile and if specified both " +"*keyfile* and *certfile* should be ``None``." +msgstr "" +"可选的 *context* 形参是一个 :class:`ssl.SSLContext` 对象;它是使用密钥文件和证书的替代方式,如果指定了该形参则 " +"*keyfile* 和 *certfile* 都应为 ``None``。" + +#: ../../library/smtplib.rst:425 +msgid "" +"If there has been no previous ``EHLO`` or ``HELO`` command this session, " +"this method tries ESMTP ``EHLO`` first." +msgstr "如果这个会话中没有先前的 ``EHLO`` 或 ``HELO`` 命令,该方法会首先尝试 ESMTP ``EHLO``。" + +#: ../../library/smtplib.rst:435 +msgid "The server does not support the STARTTLS extension." +msgstr "服务器不支持 STARTTLS 扩展。" + +#: ../../library/smtplib.rst:437 +msgid ":exc:`RuntimeError`" +msgstr ":exc:`RuntimeError`" + +#: ../../library/smtplib.rst:438 +msgid "SSL/TLS support is not available to your Python interpreter." +msgstr "SSL/TLS 支持在你的 Python 解释器上不可用。" + +#: ../../library/smtplib.rst:443 +msgid "" +"The method now supports hostname check with " +":attr:`ssl.SSLContext.check_hostname` and *Server Name Indicator* (see " +":const:`~ssl.HAS_SNI`)." +msgstr "" +"此方法现在支持使用 :attr:`ssl.SSLContext.check_hostname` 和 *Server Name Indicator* " +"进行主机名检测 (参见 :const:`~ssl.HAS_SNI`)。" + +#: ../../library/smtplib.rst:448 +msgid "" +"The error raised for lack of STARTTLS support is now the " +":exc:`SMTPNotSupportedError` subclass instead of the base " +":exc:`SMTPException`." +msgstr "" +"因缺少 STARTTLS 支持而引发的错误现在是 :exc:`SMTPNotSupportedError` 子类而不是 " +":exc:`SMTPException` 基类。" + +#: ../../library/smtplib.rst:456 +msgid "" +"Send mail. The required arguments are an :rfc:`822` from-address string, a " +"list of :rfc:`822` to-address strings (a bare string will be treated as a " +"list with 1 address), and a message string. The caller may pass a list of " +"ESMTP options (such as ``\"8bitmime\"``) to be used in ``MAIL FROM`` " +"commands as *mail_options*. ESMTP options (such as ``DSN`` commands) that " +"should be used with all ``RCPT`` commands can be passed as *rcpt_options*. " +"Each option should be passed as a string containing the full text of the " +"option, including any potential key (for instance, " +"``\"NOTIFY=SUCCESS,FAILURE\"``). (If you need to use different ESMTP options" +" to different recipients you have to use the low-level methods such as " +":meth:`!mail`, :meth:`!rcpt` and :meth:`!data` to send the message.)" +msgstr "" +"发送邮件。需要的参数包括一个 :rfc:`822` 发件地址字符串,一个 :rfc:`822` 收件地址字符串列表(单个字符串将被视为只有 1 " +"个地址的列表),以及一个消息字符串。调用方可以传入一个 ESMTP 选项 (如 ``\"8bitmime\"``) 的列表在 ``MAIL FROM``" +" 命令中用作 *mail_options*。应当与所有 ``RCPT`` 命令一起使用的 ESMTP 选项 (如 ``DSN`` 命令) 可以作为 " +"*rcpt_options* 传入。每个选项都应当以包含选项完整文本的字符串的形式传入,包括任何可能的键 (例如 " +"``\"NOTIFY=SUCCESS,FAILURE\"``)。 (如果你需要对不同的收件人使用不同的 ESMTP 选项那么你必须使用低层级的方法如 " +":meth:`!mail`, :meth:`!rcpt` 和 :meth:`!data` 来发送消息。)" + +#: ../../library/smtplib.rst:469 +msgid "" +"The *from_addr* and *to_addrs* parameters are used to construct the message " +"envelope used by the transport agents. ``sendmail`` does not modify the " +"message headers in any way." +msgstr "" +"*from_addr* 和 *to_addrs* 形参被用来构造传输代理所使用的消息封包。``sendmail`` 不会以任何方式修改消息标头。" + +#: ../../library/smtplib.rst:473 +msgid "" +"*msg* may be a string containing characters in the ASCII range, or a byte " +"string. A string is encoded to bytes using the ascii codec, and lone " +"``\\r`` and ``\\n`` characters are converted to ``\\r\\n`` characters. A " +"byte string is not modified." +msgstr "" +"*msg* 可以是一个包含 ASCII 范围内字符的字符串,或是一个字节串。字符串会使用 ascii 编解码器编码为字节串,并且单独的 ``\\r`` " +"和 ``\\n`` 字符会被转换为 ``\\r\\n`` 字符序列。字节串则不会被修改。" + +#: ../../library/smtplib.rst:478 +msgid "" +"If there has been no previous ``EHLO`` or ``HELO`` command this session, " +"this method tries ESMTP ``EHLO`` first. If the server does ESMTP, message " +"size and each of the specified options will be passed to it (if the option " +"is in the feature set the server advertises). If ``EHLO`` fails, ``HELO`` " +"will be tried and ESMTP options suppressed." +msgstr "" +"如果在此之前本会话没有执行过 ``EHLO`` 或 ``HELO`` 命令,此方法会先尝试 ESMTP ``EHLO``。如果服务器执行了 " +"ESMTP,消息大小和每个指定的选项将被传递给它(如果指定的选项属于服务器声明的特性集)。如果 ``EHLO`` 失败,则将尝试 ``HELO`` " +"并屏蔽 ESMTP 选项。" + +#: ../../library/smtplib.rst:484 +msgid "" +"This method will return normally if the mail is accepted for at least one " +"recipient. Otherwise it will raise an exception. That is, if this method " +"does not raise an exception, then someone should get your mail. If this " +"method does not raise an exception, it returns a dictionary, with one entry " +"for each recipient that was refused. Each entry contains a tuple of the " +"SMTP error code and the accompanying error message sent by the server." +msgstr "" +"如果邮件被至少一个接收方接受则此方法将正常返回。在其他情况下它将引发异常。也就是说,如果此方法没有引发异常,则应当会有人收到你的邮件。 " +"如果此方法没有引发异常,它将返回一个字典,其中的条目对应每个拒绝的接收方。每个条目均包含由服务器发送的 SMTP 错误代码和相应错误消息所组成的元组。" + +#: ../../library/smtplib.rst:491 +msgid "" +"If ``SMTPUTF8`` is included in *mail_options*, and the server supports it, " +"*from_addr* and *to_addrs* may contain non-ASCII characters." +msgstr "" +"如果 ``SMTPUTF8`` 包括在 *mail_options* 中,并且被服务器所支持,则 *from_addr* 和 *to_addrs* " +"可能包含非 ASCII 字符。" + +#: ../../library/smtplib.rst:494 +msgid "This method may raise the following exceptions:" +msgstr "此方法可能引发以下异常:" + +#: ../../library/smtplib.rst:496 +msgid ":exc:`SMTPRecipientsRefused`" +msgstr ":exc:`SMTPRecipientsRefused`" + +#: ../../library/smtplib.rst:497 +msgid "All recipients were refused. Nobody got the mail." +msgstr "所有收件人均被拒绝。不会有人收到邮件。" + +#: ../../library/smtplib.rst:502 +msgid ":exc:`SMTPSenderRefused`" +msgstr ":exc:`SMTPSenderRefused`" + +#: ../../library/smtplib.rst:503 +msgid "The server didn't accept the *from_addr*." +msgstr "服务器不接受 *from_addr*。" + +#: ../../library/smtplib.rst:505 +msgid ":exc:`SMTPDataError`" +msgstr ":exc:`SMTPDataError`" + +#: ../../library/smtplib.rst:506 +msgid "" +"The server replied with an unexpected error code (other than a refusal of a " +"recipient)." +msgstr "服务器回复了一个意外的错误代码(而不是拒绝收件人)。" + +#: ../../library/smtplib.rst:510 +msgid "" +"``SMTPUTF8`` was given in the *mail_options* but is not supported by the " +"server." +msgstr "在 *mail_options* 中给出了 ``SMTPUTF8`` 但是不被服务器所支持。" + +#: ../../library/smtplib.rst:513 +msgid "" +"Unless otherwise noted, the connection will be open even after an exception " +"is raised." +msgstr "除非另有说明,即使在引发异常之后连接仍将被打开。" + +#: ../../library/smtplib.rst:516 +msgid "*msg* may be a byte string." +msgstr "*msg* 可以为字节串。" + +#: ../../library/smtplib.rst:519 +msgid "" +"``SMTPUTF8`` support added, and :exc:`SMTPNotSupportedError` may be raised " +"if ``SMTPUTF8`` is specified but the server does not support it." +msgstr "" +"增加了 ``SMTPUTF8`` 支持,并且如果指定了 ``SMTPUTF8`` 但是不被服务器所支持则可能会引发 " +":exc:`SMTPNotSupportedError`." + +#: ../../library/smtplib.rst:527 +msgid "" +"This is a convenience method for calling :meth:`sendmail` with the message " +"represented by an :class:`email.message.Message` object. The arguments have" +" the same meaning as for :meth:`sendmail`, except that *msg* is a " +"``Message`` object." +msgstr "" +"本方法是一种快捷方法,用于带着消息调用 :meth:`sendmail`,消息由 :class:`email.message.Message` " +"对象表示。参数的含义与 :meth:`sendmail` 中的相同,除了 *msg*,它是一个 ``Message`` 对象。" + +#: ../../library/smtplib.rst:532 +msgid "" +"If *from_addr* is ``None`` or *to_addrs* is ``None``, ``send_message`` fills" +" those arguments with addresses extracted from the headers of *msg* as " +"specified in :rfc:`5322`\\: *from_addr* is set to the :mailheader:`Sender` " +"field if it is present, and otherwise to the :mailheader:`From` field. " +"*to_addrs* combines the values (if any) of the :mailheader:`To`, " +":mailheader:`Cc`, and :mailheader:`Bcc` fields from *msg*. If exactly one " +"set of :mailheader:`Resent-*` headers appear in the message, the regular " +"headers are ignored and the :mailheader:`Resent-*` headers are used instead." +" If the message contains more than one set of :mailheader:`Resent-*` " +"headers, a :exc:`ValueError` is raised, since there is no way to " +"unambiguously detect the most recent set of :mailheader:`Resent-` headers." +msgstr "" +"如果 *from_addr* 为 ``None`` 或 *to_addrs* 为 ``None``,那么 ``send_message`` 将根据 " +":rfc:`5322`,从 *msg* 头部提取地址填充下列参数:如果头部存在 :mailheader:`Sender` 字段,则用它填充 " +"*from_addr*,不存在则用 :mailheader:`From` 字段填充 *from_addr*。*to_addrs* 组合了 *msg* " +"中的 :mailheader:`To`, :mailheader:`Cc` 和 :mailheader:`Bcc` " +"字段的值(字段存在的情况下)。如果一组 :mailheader:`Resent-*` 头部恰好出现在 message 中,那么就忽略常规的头部,改用 " +":mailheader:`Resent-*` 头部。如果 message 包含多组 :mailheader:`Resent-*` 头部,则引发 " +":exc:`ValueError`,因为无法明确检测出哪一组 :mailheader:`Resent-` 头部是最新的。" + +#: ../../library/smtplib.rst:544 +msgid "" +"``send_message`` serializes *msg* using " +":class:`~email.generator.BytesGenerator` with ``\\r\\n`` as the *linesep*, " +"and calls :meth:`sendmail` to transmit the resulting message. Regardless of" +" the values of *from_addr* and *to_addrs*, ``send_message`` does not " +"transmit any :mailheader:`Bcc` or :mailheader:`Resent-Bcc` headers that may " +"appear in *msg*. If any of the addresses in *from_addr* and *to_addrs* " +"contain non-ASCII characters and the server does not advertise ``SMTPUTF8`` " +"support, an :exc:`SMTPNotSupportedError` is raised. Otherwise the " +"``Message`` is serialized with a clone of its :mod:`~email.policy` with the " +":attr:`~email.policy.EmailPolicy.utf8` attribute set to ``True``, and " +"``SMTPUTF8`` and ``BODY=8BITMIME`` are added to *mail_options*." +msgstr "" +"``send_message`` 使用 :class:`~email.generator.BytesGenerator` 来序列化 *msg* 并以 " +"``\\r\\n`` 作为 *linesep*,然后调用 :meth:`sendmail` 来传输结果消息。无论 *from_addr* 和 " +"*to_addrs* 的值是什么,``send_message`` 都不会传输 *msg* 中可能出现的 :mailheader:`Bcc` 或 " +":mailheader:`Resent-Bcc` 标头。如果 *from_addr* 和 *to_addrs* 中的任何地址包含非 ASCII " +"字符并且服务器没有声明 ``SMTPUTF8`` 支持,则会引发 :exc:`SMTPNotSupportedError`。在其他情况下 " +"``Message`` 将克隆其 :mod:`~email.policy` 来执行序列化并将 " +":attr:`~email.policy.EmailPolicy.utf8` 属性设为 ``True``,且会把 ``SMTPUTF8`` 和 " +"``BODY=8BITMIME`` 添加到 *mail_options* 中。" + +#: ../../library/smtplib.rst:558 +msgid "Support for internationalized addresses (``SMTPUTF8``)." +msgstr "支持国际化地址 (``SMTPUTF8``)。" + +#: ../../library/smtplib.rst:564 +msgid "" +"Terminate the SMTP session and close the connection. Return the result of " +"the SMTP ``QUIT`` command." +msgstr "终结 SMTP 会话并关闭连接。返回 SMTP ``QUIT`` 命令的结果。" + +#: ../../library/smtplib.rst:568 +msgid "" +"Low-level methods corresponding to the standard SMTP/ESMTP commands " +"``HELP``, ``RSET``, ``NOOP``, ``MAIL``, ``RCPT``, and ``DATA`` are also " +"supported. Normally these do not need to be called directly, so they are not" +" documented here. For details, consult the module code." +msgstr "" +"与标准 SMTP/ESMTP 命令 ``HELP``, ``RSET``, ``NOOP``, ``MAIL``, ``RCPT`` 和 " +"``DATA`` 对应的低层级方法也是受支持的。通常不需要直接调用这些方法,因此它们没有被写入本文档。相关细节请参看模块代码。" + +#: ../../library/smtplib.rst:573 +msgid "Additionally, an SMTP instance has the following attributes:" +msgstr "此外,SMTP 实例还具有以下属性:" + +#: ../../library/smtplib.rst:578 +msgid "The response to the ``HELO`` command, see :meth:`helo`." +msgstr "对 ``HELO`` 命令的响应,参见 :meth:`helo`。" + +#: ../../library/smtplib.rst:583 +msgid "The response to the ``EHLO`` command, see :meth:`ehlo`." +msgstr "对 ``EHLO`` 命令的响应,参见 :meth:`ehlo`。" + +#: ../../library/smtplib.rst:588 +msgid "" +"A boolean value indicating whether the server supports ESMTP, see " +":meth:`ehlo`." +msgstr "指明服务器是否支持 ESMTP 的布尔值,参见 :meth:`ehlo`。" + +#: ../../library/smtplib.rst:594 +msgid "" +"A dictionary of the names of SMTP service extensions supported by the " +"server, see :meth:`ehlo`." +msgstr "由服务器所支持的 SMTP 服务扩展名称组成的字典,参见 :meth:`ehlo`。" + +#: ../../library/smtplib.rst:601 +msgid "SMTP Example" +msgstr "SMTP 示例" + +#: ../../library/smtplib.rst:603 +msgid "" +"This example prompts the user for addresses needed in the message envelope " +"('To' and 'From' addresses), and the message to be delivered. Note that the" +" headers to be included with the message must be included in the message as " +"entered; this example doesn't do any processing of the :rfc:`822` headers. " +"In particular, the 'To' and 'From' addresses must be included in the message" +" headers explicitly::" +msgstr "" +"这个例子提示用户输入消息封包所需的地址 ('To' 和 'From' 地址),以及要发送的消息。 " +"请注意包括在消息中的标头必须包括在输入的消息中;这个例子不对 :rfc:`822` 标头进行任何处理。具体来说,'To' 和 'From' " +"地址必须显式地包括在消息标头中::" + +#: ../../library/smtplib.rst:609 +msgid "" +"import smtplib\n" +"\n" +"def prompt(title):\n" +" return input(title).strip()\n" +"\n" +"from_addr = prompt(\"From: \")\n" +"to_addrs = prompt(\"To: \").split()\n" +"print(\"Enter message, end with ^D (Unix) or ^Z (Windows):\")\n" +"\n" +"# Add the From: and To: headers at the start!\n" +"lines = [f\"From: {from_addr}\", f\"To: {', '.join(to_addrs)}\", \"\"]\n" +"while True:\n" +" try:\n" +" line = input()\n" +" except EOFError:\n" +" break\n" +" else:\n" +" lines.append(line)\n" +"\n" +"msg = \"\\r\\n\".join(lines)\n" +"print(\"Message length is\", len(msg))\n" +"\n" +"server = smtplib.SMTP(\"localhost\")\n" +"server.set_debuglevel(1)\n" +"server.sendmail(from_addr, to_addrs, msg)\n" +"server.quit()" +msgstr "" +"import smtplib\n" +"\n" +"def prompt(title):\n" +" return input(title).strip()\n" +"\n" +"from_addr = prompt(\"From: \")\n" +"to_addrs = prompt(\"To: \").split()\n" +"print(\"Enter message, end with ^D (Unix) or ^Z (Windows):\")\n" +"\n" +"# 在开始时添加 From: 和 To: 标头!\n" +"lines = [f\"From: {from_addr}\", f\"To: {', '.join(to_addrs)}\", \"\"]\n" +"while True:\n" +" try:\n" +" line = input()\n" +" except EOFError:\n" +" break\n" +" else:\n" +" lines.append(line)\n" +"\n" +"msg = \"\\r\\n\".join(lines)\n" +"print(\"Message length is\", len(msg))\n" +"\n" +"server = smtplib.SMTP(\"localhost\")\n" +"server.set_debuglevel(1)\n" +"server.sendmail(from_addr, to_addrs, msg)\n" +"server.quit()" + +#: ../../library/smtplib.rst:638 +msgid "" +"In general, you will want to use the :mod:`email` package's features to " +"construct an email message, which you can then send via " +":meth:`~smtplib.SMTP.send_message`; see :ref:`email-examples`." +msgstr "" +"通常,你将需要使用 :mod:`email` 包的特性来构造电子邮件消息,然后你可以通过 " +":meth:`~smtplib.SMTP.send_message` 来发送它,参见 :ref:`email-examples`。" + +#: ../../library/smtplib.rst:9 +msgid "SMTP" +msgstr "SMTP" + +#: ../../library/smtplib.rst:9 +msgid "protocol" +msgstr "协议" + +#: ../../library/smtplib.rst:9 +msgid "Simple Mail Transfer Protocol" +msgstr "简单邮件传输协议" diff --git a/library/sndhdr.po b/library/sndhdr.po new file mode 100644 index 0000000000..d312f9b1e5 --- /dev/null +++ b/library/sndhdr.po @@ -0,0 +1,52 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/sndhdr.rst:2 +msgid ":mod:`!sndhdr` --- Determine type of sound file" +msgstr ":mod:`!sndhdr` --- 确定声音文件的类型" + +#: ../../library/sndhdr.rst:10 +msgid "" +"This module is no longer part of the Python standard library. It was " +":ref:`removed in Python 3.13 ` after being deprecated in" +" Python 3.11. The removal was decided in :pep:`594`." +msgstr "" +"此模块已不再是 Python 标准库的一部分。它在 Python 3.11 中被弃用后又在 :ref:`Python 3.13 中被移除 " +"`。移除计划是在 :pep:`594` 确定的。" + +#: ../../library/sndhdr.rst:14 +msgid "" +"Possible replacements are third-party modules from PyPI: :pypi:`filetype`, " +":pypi:`puremagic`, or :pypi:`python-magic`. These are not supported or " +"maintained by the Python core team." +msgstr "" +"可用的替代来自 PyPI 的第三方模块::pypi:`filetype`, :pypi:`puremagic` 或 :pypi:`python-" +"magic`。它们不被 Python 核心团队所支持或维护。" + +#: ../../library/sndhdr.rst:18 +msgid "" +"The last version of Python that provided the :mod:`!sndhdr` module was " +"`Python 3.12 `_." +msgstr "" +"提供 :mod:`!sndhdr` 模块的最后一个 Python 版本是 `Python 3.12 " +"`_." diff --git a/library/socket.po b/library/socket.po new file mode 100644 index 0000000000..4d51a590f4 --- /dev/null +++ b/library/socket.po @@ -0,0 +1,3363 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-06-11 18:32+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/socket.rst:2 +msgid ":mod:`!socket` --- Low-level networking interface" +msgstr ":mod:`!socket` --- 低层级的网络接口" + +#: ../../library/socket.rst:7 +msgid "**Source code:** :source:`Lib/socket.py`" +msgstr "**源代码:** :source:`Lib/socket.py`" + +#: ../../library/socket.rst:11 +msgid "" +"This module provides access to the BSD *socket* interface. It is available " +"on all modern Unix systems, Windows, MacOS, and probably additional " +"platforms." +msgstr "这个模块提供了访问 BSD *套接字* 的接口。在所有现代 Unix 系统、Windows、macOS 和其他一些平台上可用。" + +#: ../../library/socket.rst:16 +msgid "" +"Some behavior may be platform dependent, since calls are made to the " +"operating system socket APIs." +msgstr "一些行为可能因平台不同而异,因为调用的是操作系统的套接字 API。" + +#: ../../library/socket.rst:198 ../../library/socket.rst:208 +#: ../../library/socket.rst:236 ../../library/socket.rst:243 +#: ../../library/socket.rst:260 ../../library/socket.rst:410 +#: ../../library/socket.rst:496 ../../library/socket.rst:513 +#: ../../library/socket.rst:528 ../../library/socket.rst:539 +#: ../../library/socket.rst:548 ../../library/socket.rst:557 +#: ../../library/socket.rst:568 ../../library/socket.rst:580 +#: ../../library/socket.rst:591 ../../library/socket.rst:604 +#: ../../library/socket.rst:632 ../../library/socket.rst:644 +#: ../../library/socket.rst:650 ../../library/socket.rst:682 +#: ../../library/socket.rst:735 ../../library/socket.rst:747 +#: ../../library/socket.rst:756 ../../library/socket.rst:771 +#: ../../library/socket.rst:780 ../../library/socket.rst:788 +#: ../../library/socket.rst:805 ../../library/socket.rst:820 +#: ../../library/socket.rst:830 ../../library/socket.rst:962 +#: ../../library/socket.rst:1081 ../../library/socket.rst:1097 +#: ../../library/socket.rst:1110 ../../library/socket.rst:1125 +#: ../../library/socket.rst:1142 ../../library/socket.rst:1153 +#: ../../library/socket.rst:1164 ../../library/socket.rst:1175 +#: ../../library/socket.rst:1264 ../../library/socket.rst:1284 +#: ../../library/socket.rst:1310 ../../library/socket.rst:1333 +#: ../../library/socket.rst:1362 ../../library/socket.rst:1373 +#: ../../library/socket.rst:1400 ../../library/socket.rst:1417 +#: ../../library/socket.rst:1434 ../../library/socket.rst:1448 +#: ../../library/socket.rst:1559 ../../library/socket.rst:1606 +#: ../../library/socket.rst:1620 ../../library/socket.rst:1640 +#: ../../library/socket.rst:1687 ../../library/socket.rst:1720 +#: ../../library/socket.rst:1733 ../../library/socket.rst:1859 +#: ../../library/socket.rst:1903 ../../library/socket.rst:2011 +#: ../../library/socket.rst:2029 ../../library/socket.rst:2110 +#: ../../library/socket.rst:2120 ../../library/socket.rst:2132 +#: ../../includes/wasm-notavail.rst:3 +msgid "Availability" +msgstr "可用性" + +#: ../../includes/wasm-notavail.rst:5 +msgid "" +"This module does not work or is not available on WebAssembly. See " +":ref:`wasm-availability` for more information." +msgstr "此模块在 WebAssembly 平台上无效或不可用。请参阅 :ref:`wasm-availability` 了解详情。" + +#: ../../library/socket.rst:24 +msgid "" +"The Python interface is a straightforward transliteration of the Unix system" +" call and library interface for sockets to Python's object-oriented style: " +"the :func:`~socket.socket` function returns a :dfn:`socket object` whose " +"methods implement the various socket system calls. Parameter types are " +"somewhat higher-level than in the C interface: as with :meth:`read` and " +":meth:`write` operations on Python files, buffer allocation on receive " +"operations is automatic, and buffer length is implicit on send operations." +msgstr "" +"这个 Python 接口是将 Unix 系统调用和套接字库接口直接转写为 Python 的面向对象风格:函数 " +":func:`~socket.socket` 返回一个 :dfn:`套接字对象`,其方法是对各种套接字系统调用的实现。形参类型相比 C " +"接口更高级一些:如同在 Python 文件上的 :meth:`read` 和 :meth:`write` " +"操作那样,接受操作的缓冲区分配是自动进行的,发送操作的缓冲区长度则是隐式的。" + +#: ../../library/socket.rst:35 +msgid "Module :mod:`socketserver`" +msgstr "模块 :mod:`socketserver`" + +#: ../../library/socket.rst:36 +msgid "Classes that simplify writing network servers." +msgstr "用于简化网络服务端编写的类。" + +#: ../../library/socket.rst:38 +msgid "Module :mod:`ssl`" +msgstr "模块 :mod:`ssl`" + +#: ../../library/socket.rst:39 +msgid "A TLS/SSL wrapper for socket objects." +msgstr "套接字对象的 TLS/SSL 封装。" + +#: ../../library/socket.rst:45 +msgid "Socket families" +msgstr "套接字协议族" + +#: ../../library/socket.rst:47 +msgid "" +"Depending on the system and the build options, various socket families are " +"supported by this module." +msgstr "根据系统以及构建选项,此模块提供了各种套接字协议簇。" + +#: ../../library/socket.rst:50 +msgid "" +"The address format required by a particular socket object is automatically " +"selected based on the address family specified when the socket object was " +"created. Socket addresses are represented as follows:" +msgstr "特定的套接字对象需要的地址格式将根据此套接字对象被创建时指定的地址族被自动选择。套接字地址表示如下:" + +#: ../../library/socket.rst:54 +msgid "" +"The address of an :const:`AF_UNIX` socket bound to a file system node is " +"represented as a string, using the file system encoding and the " +"``'surrogateescape'`` error handler (see :pep:`383`). An address in Linux's" +" abstract namespace is returned as a :term:`bytes-like object` with an " +"initial null byte; note that sockets in this namespace can communicate with " +"normal file system sockets, so programs intended to run on Linux may need to" +" deal with both types of address. A string or bytes-like object can be used" +" for either type of address when passing it as an argument." +msgstr "" +"一个绑定在文件系统节点上的 :const:`AF_UNIX` 套接字的地址表示为一个字符串,使用文件系统字符编码和 " +"``'surrogateescape'`` 错误回调方法 (参见 :pep:`383`)。 一个地址在 Linux 的抽象命名空间被返回为带有初始的 " +"null 字节的 :term:`字节型对象 `;注意在这个命名空间中的套接字可能与普通文件系统套接字通信,所以打算运行在 Linux 上的程序可能需要解决两种地址类型。 " +"当传递为参数时,一个字符串或字节类对象可以用于任一类型的地址。" + +#: ../../library/socket.rst:64 +msgid "" +"Previously, :const:`AF_UNIX` socket paths were assumed to use UTF-8 " +"encoding." +msgstr "之前,:const:`AF_UNIX` 套接字路径被假设使用 UTF-8 编码。" + +#: ../../library/socket.rst:68 ../../library/socket.rst:1247 +#: ../../library/socket.rst:1289 ../../library/socket.rst:2104 +msgid "Writable :term:`bytes-like object` is now accepted." +msgstr "现在接受可写的 :term:`字节类对象 `。" + +#: ../../library/socket.rst:73 +msgid "" +"A pair ``(host, port)`` is used for the :const:`AF_INET` address family, " +"where *host* is a string representing either a hostname in internet domain " +"notation like ``'daring.cwi.nl'`` or an IPv4 address like " +"``'100.50.200.5'``, and *port* is an integer." +msgstr "" +"一对 ``(host, port)`` 被用作 :const:`AF_INET` 地址族,其中 *host* 是一个表示互联网域名标记形式的主机名例如 " +"``'daring.cwi.nl'`` 或者 IPv4 地址例如 ``'100.50.200.5'`` 的字符串,而 *port* 是一个整数值。" + +#: ../../library/socket.rst:78 +msgid "" +"For IPv4 addresses, two special forms are accepted instead of a host " +"address: ``''`` represents :const:`INADDR_ANY`, which is used to bind to all" +" interfaces, and the string ``''`` represents " +":const:`INADDR_BROADCAST`. This behavior is not compatible with IPv6, " +"therefore, you may want to avoid these if you intend to support IPv6 with " +"your Python programs." +msgstr "" +"对于 IPv4 地址,有两种可接受的特殊形式被用来代替一个主机地址: ``''`` 代表 " +":const:`INADDR_ANY`,用来绑定到所有接口;字符串 ``''`` 代表 " +":const:`INADDR_BROADCAST`。 此行为不兼容 IPv6,因此,如果你的 Python 程序打算支持 IPv6,则可能需要避开这些。" + +#: ../../library/socket.rst:85 +msgid "" +"For :const:`AF_INET6` address family, a four-tuple ``(host, port, flowinfo, " +"scope_id)`` is used, where *flowinfo* and *scope_id* represent the " +"``sin6_flowinfo`` and ``sin6_scope_id`` members in :const:`struct " +"sockaddr_in6` in C. For :mod:`!socket` module methods, *flowinfo* and " +"*scope_id* can be omitted just for backward compatibility. Note, however, " +"omission of *scope_id* can cause problems in manipulating scoped IPv6 " +"addresses." +msgstr "" +"对于 :const:`AF_INET6` 地址族,使用一个四元组 ``(host, port, flowinfo, scope_id)``,其中 " +"*flowinfo* 和 *scope_id* 代表 C 库 :const:`struct sockaddr_in6` 中的 " +"``sin6_flowinfo`` 和 ``sin6_scope_id`` 成员。 对于 :mod:`!socket` 模块的方法,*flowinfo*" +" 和 *scope_id* 可以被省略以保持向下兼容。 但是请注意,省略 *scope_id* 可能会导致操作带领域的 IPv6 地址时出现问题。" + +#: ../../library/socket.rst:92 +msgid "" +"For multicast addresses (with *scope_id* meaningful) *address* may not " +"contain ``%scope_id`` (or ``zone id``) part. This information is superfluous" +" and may be safely omitted (recommended)." +msgstr "" +"对于多播地址(其 *scope_id* 起作用),*address* 中可以不包含 ``%scope_id`` (或 ``zone id``) " +"部分,这部分是多余的,可以放心省略(推荐)。" + +#: ../../library/socket.rst:97 +msgid "" +":const:`AF_NETLINK` sockets are represented as pairs ``(pid, groups)``." +msgstr ":const:`AF_NETLINK` 套接字由一对 ``(pid, groups)`` 表示。" + +#: ../../library/socket.rst:99 +msgid "" +"Linux-only support for TIPC is available using the :const:`AF_TIPC` address " +"family. TIPC is an open, non-IP based networked protocol designed for use " +"in clustered computer environments. Addresses are represented by a tuple, " +"and the fields depend on the address type. The general tuple form is " +"``(addr_type, v1, v2, v3 [, scope])``, where:" +msgstr "" +"指定 :const:`AF_TIPC` 地址族可以使用仅 Linux 支持的 TIPC 协议。TIPC 是一种开放的、非基于 IP " +"的网络协议,旨在用于集群计算环境。其地址用元组表示,其中的字段取决于地址类型。一般元组形式为 ``(addr_type, v1, v2, v3 [, " +"scope])``,其中:" + +#: ../../library/socket.rst:105 +msgid "" +"*addr_type* is one of :const:`TIPC_ADDR_NAMESEQ`, :const:`TIPC_ADDR_NAME`, " +"or :const:`TIPC_ADDR_ID`." +msgstr "" +"*addr_type* 取 :const:`TIPC_ADDR_NAMESEQ`、:const:`TIPC_ADDR_NAME` 或 " +":const:`TIPC_ADDR_ID` 中的一个。" + +#: ../../library/socket.rst:107 +msgid "" +"*scope* is one of :const:`TIPC_ZONE_SCOPE`, :const:`TIPC_CLUSTER_SCOPE`, and" +" :const:`TIPC_NODE_SCOPE`." +msgstr "" +"*scope* 取 :const:`TIPC_ZONE_SCOPE`、:const:`TIPC_CLUSTER_SCOPE` 和 " +":const:`TIPC_NODE_SCOPE` 中的一个。" + +#: ../../library/socket.rst:109 +msgid "" +"If *addr_type* is :const:`TIPC_ADDR_NAME`, then *v1* is the server type, " +"*v2* is the port identifier, and *v3* should be 0." +msgstr "" +"如果 *addr_type* 为 :const:`TIPC_ADDR_NAME`,那么 *v1* 是服务器类型,*v2* 是端口标识符,*v3* 应为 " +"0。" + +#: ../../library/socket.rst:112 +msgid "" +"If *addr_type* is :const:`TIPC_ADDR_NAMESEQ`, then *v1* is the server type, " +"*v2* is the lower port number, and *v3* is the upper port number." +msgstr "" +"如果 *addr_type* 为 :const:`TIPC_ADDR_NAMESEQ`,那么 *v1* 是服务器类型,*v2* 是端口号下限,而 " +"*v3* 是端口号上限。" + +#: ../../library/socket.rst:115 +msgid "" +"If *addr_type* is :const:`TIPC_ADDR_ID`, then *v1* is the node, *v2* is the " +"reference, and *v3* should be set to 0." +msgstr "" +"如果 *addr_type* 为 :const:`TIPC_ADDR_ID`,那么 *v1* 是节点 (node),*v2* 是 ref,*v3* 应为" +" 0。" + +#: ../../library/socket.rst:118 +msgid "" +"A tuple ``(interface, )`` is used for the :const:`AF_CAN` address family, " +"where *interface* is a string representing a network interface name like " +"``'can0'``. The network interface name ``''`` can be used to receive packets" +" from all network interfaces of this family." +msgstr "" +":const:`AF_CAN` 地址族使用元组 ``(interface, )``,其中 *interface* 是表示网络接口名称的字符串,如 " +"``'can0'``。网络接口名 ``''`` 可以用于接收本族所有网络接口的数据包。" + +#: ../../library/socket.rst:123 +msgid "" +":const:`CAN_ISOTP` protocol requires a tuple ``(interface, rx_addr, " +"tx_addr)`` where both additional parameters are unsigned long integer that " +"represent a CAN identifier (standard or extended)." +msgstr "" +":const:`CAN_ISOTP` 协议接受一个元组 ``(interface, rx_addr, tx_addr)`` 其中两个额外参数都为代表 " +"CAN 标识符(标准或扩展型)的无符号长整型。" + +#: ../../library/socket.rst:126 +msgid "" +":const:`CAN_J1939` protocol requires a tuple ``(interface, name, pgn, " +"addr)`` where additional parameters are 64-bit unsigned integer representing" +" the ECU name, a 32-bit unsigned integer representing the Parameter Group " +"Number (PGN), and an 8-bit integer representing the address." +msgstr "" +":const:`CAN_J1939` 协议需要一个元组 ``(interface, name, pgn, addr)`` 其中的额外参数为代表 ECU " +"名称的 64 位无符号整型,代表参数分组号(PGN)的 32 位无符号整型,以及代表地址的 8 位整型。" + +#: ../../library/socket.rst:131 +msgid "" +"A string or a tuple ``(id, unit)`` is used for the :const:`SYSPROTO_CONTROL`" +" protocol of the :const:`PF_SYSTEM` family. The string is the name of a " +"kernel control using a dynamically assigned ID. The tuple can be used if ID " +"and unit number of the kernel control are known or if a registered ID is " +"used." +msgstr "" +":const:`PF_SYSTEM` 协议族的 :const:`SYSPROTO_CONTROL` 协议使用一个字符串或元组 ``(id, " +"unit)``。这个字符串是使用动态分配 ID 的内核控件名称。如果 ID 和内核控件的单元编号都已知或者使用了已注册的 ID 则可以使用元组。" + +#: ../../library/socket.rst:139 +msgid "" +":const:`AF_BLUETOOTH` supports the following protocols and address formats:" +msgstr ":const:`AF_BLUETOOTH` 支持以下协议和地址格式:" + +#: ../../library/socket.rst:142 +msgid "" +":const:`BTPROTO_L2CAP` accepts a tuple ``(bdaddr, psm[, cid[, " +"bdaddr_type]])`` where:" +msgstr "" +":const:`BTPROTO_L2CAP` 接受一个元组 ``(bdaddr, psm[, cid[, bdaddr_type]])`` 其中:" + +#: ../../library/socket.rst:145 +msgid "``bdaddr`` is a string specifying the Bluetooth address." +msgstr "``bdaddr`` 是一个指定蓝牙地址的字符串。" + +#: ../../library/socket.rst:146 +msgid "``psm`` is an integer specifying the Protocol/Service Multiplexer." +msgstr "``psm`` 是一个指定协议/服务复用器的整数。" + +#: ../../library/socket.rst:147 +msgid "" +"``cid`` is an optional integer specifying the Channel Identifier. If not " +"given, defaults to zero." +msgstr "``cid`` 是一个可选的指定频道标识号的整数。如未给出,则默认为零。" + +#: ../../library/socket.rst:149 +msgid "" +"``bdaddr_type`` is an optional integer specifying the address type; one of " +":const:`BDADDR_BREDR` (default), :const:`BDADDR_LE_PUBLIC`, " +":const:`BDADDR_LE_RANDOM`." +msgstr "" +"``bdaddr_type`` 是一个可选的整数,用于指定地址类型;:const:`BDADDR_BREDR` " +"(默认)、:const:`BDADDR_LE_PUBLIC` 和 :const:`BDADDR_LE_RANDOM` 中的一个。" + +#: ../../library/socket.rst:153 +msgid "Added ``cid`` and ``bdaddr_type`` fields." +msgstr "增加了 ``cid`` 和 ``bdaddr_type`` 字段。" + +#: ../../library/socket.rst:156 +msgid "" +":const:`BTPROTO_RFCOMM` accepts ``(bdaddr, channel)`` where ``bdaddr`` is " +"the Bluetooth address as a string and ``channel`` is an integer." +msgstr "" +":const:`BTPROTO_RFCOMM` 接受 ``(bdaddr, channel)``,其中 ``bdaddr`` " +"为字符串格式的蓝牙地址,``channel`` 是一个整数。" + +#: ../../library/socket.rst:159 +msgid ":const:`BTPROTO_HCI` accepts a format that depends on your OS." +msgstr ":const:`BTPROTO_HCI` 将接受依赖于具体操作系统的格式。" + +#: ../../library/socket.rst:161 +msgid "" +"On Linux it accepts an integer ``device_id`` or a tuple ``(device_id, " +"[channel])`` where ``device_id`` specifies the number of the Bluetooth " +"device, and ``channel`` is an optional integer specifying the HCI channel " +"(:const:`HCI_CHANNEL_RAW` by default)." +msgstr "" +"在 Linux 上,它接受一个整数 ``device_id`` 或一个元组 ``(device_id, [channel])``,其中 " +"``device_id`` 指定蓝牙设备的编号,``channel`` 是一个可选的整数,指定 HCI 通道 (默认为 " +":const:`HCI_CHANNEL_RAW`)." + +#: ../../library/socket.rst:166 +msgid "" +"On FreeBSD, NetBSD and DragonFly BSD it accepts ``bdaddr`` where ``bdaddr`` " +"is the Bluetooth address as a string." +msgstr "" +"在 FreeBSD, NetBSD 和 DragonFly BSD 上它接受 ``bdaddr`` 其中 ``bdaddr`` 是字符串形式的蓝牙地址。" + +#: ../../library/socket.rst:169 +msgid "NetBSD and DragonFlyBSD support added." +msgstr "添加了对 NetBSD 和 DragonFlyBSD 的支持。" + +#: ../../library/socket.rst:172 ../../library/socket.rst:183 +msgid "FreeBSD support added." +msgstr "添加了 FreeBSD 支持。" + +#: ../../library/socket.rst:175 +msgid "" +"Added ``channel`` field. ``device_id`` not packed in a tuple is now " +"accepted." +msgstr "增加了 ``channel`` 字段。现在接受未打包在元组中的 ``device_id``。" + +#: ../../library/socket.rst:179 +msgid "" +":const:`BTPROTO_SCO` accepts ``bdaddr`` where ``bdaddr`` is the Bluetooth " +"address as a string or a :class:`bytes` object. (ex. ``'12:23:34:45:56:67'``" +" or ``b'12:23:34:45:56:67'``)" +msgstr "" +":const:`BTPROTO_SCO` 接受 ``bdaddr``,其中 ``bdaddr`` 是字符串或 :class:`bytes` " +"对象的蓝牙地址。 (例如 ``'12:23:34:45:56:67'`` 或 ``b'12:23:34:45:56:67'``)" + +#: ../../library/socket.rst:186 +msgid "" +":const:`AF_ALG` is a Linux-only socket based interface to Kernel " +"cryptography. An algorithm socket is configured with a tuple of two to four " +"elements ``(type, name [, feat [, mask]])``, where:" +msgstr "" +":const:`AF_ALG` 是一个仅 Linux 可用的、基于套接字的接口,用于连接内核加密算法。算法套接字可用包括 2 至 4 个元素的元组来配置" +" ``(type, name [, feat [, mask]])``,其中:" + +#: ../../library/socket.rst:190 +msgid "" +"*type* is the algorithm type as string, e.g. ``aead``, ``hash``, " +"``skcipher`` or ``rng``." +msgstr "*type* 是表示算法类型的字符串,如 ``aead``、``hash``、``skcipher`` 或 ``rng``。" + +#: ../../library/socket.rst:193 +msgid "" +"*name* is the algorithm name and operation mode as string, e.g. ``sha256``, " +"``hmac(sha256)``, ``cbc(aes)`` or ``drbg_nopr_ctr_aes256``." +msgstr "" +"*name* 是表示算法名称和操作模式的字符串,如 ``sha256``、``hmac(sha256)``、``cbc(aes)`` 或 " +"``drbg_nopr_ctr_aes256``." + +#: ../../library/socket.rst:196 +msgid "*feat* and *mask* are unsigned 32bit integers." +msgstr "*feat* 和 *mask* 是无符号 32 位整数。" + +#: ../../library/socket.rst:200 +msgid "Some algorithm types require more recent Kernels." +msgstr "某些算法类型需要更新的内核。" + +#: ../../library/socket.rst:204 +msgid "" +":const:`AF_VSOCK` allows communication between virtual machines and their " +"hosts. The sockets are represented as a ``(CID, port)`` tuple where the " +"context ID or CID and port are integers." +msgstr "" +":const:`AF_VSOCK` 用于支持虚拟机与宿主机之间的通讯。该套接字用 ``(CID, port)`` 元组表示,其中 Context ID " +"(CID) 和 port 都是整数。" + +#: ../../library/socket.rst:210 +msgid "See :manpage:`vsock(7)`" +msgstr "参见 :manpage:`vsock(7)`" + +#: ../../library/socket.rst:214 +msgid "" +":const:`AF_PACKET` is a low-level interface directly to network devices. The" +" addresses are represented by the tuple ``(ifname, proto[, pkttype[, " +"hatype[, addr]]])`` where:" +msgstr "" +":const:`AF_PACKET` 是一个直接连接网络设备的低层级接口。地址以元组 ``(ifname, proto[, pkttype[, " +"hatype[, addr]]])`` 表示,其中:" + +#: ../../library/socket.rst:218 +msgid "*ifname* - String specifying the device name." +msgstr "*ifname* - 指定设备名称的字符串。" + +#: ../../library/socket.rst:219 +msgid "" +"*proto* - The Ethernet protocol number. May be :data:`ETH_P_ALL` to capture " +"all protocols, one of the :ref:`ETHERTYPE_* constants ` or any other Ethernet protocol number." +msgstr "" +"*proto* - 以太网协议号。可以为 :data:`ETH_P_ALL` 表示捕获所有协议,某个 :ref:`ETHERTYPE_* 常量 " +"` 或者任何其他以太网协议号。" + +#: ../../library/socket.rst:223 +msgid "*pkttype* - Optional integer specifying the packet type:" +msgstr "*pkttype* - 指定数据包类型的整数(可选):" + +#: ../../library/socket.rst:225 +msgid "``PACKET_HOST`` (the default) - Packet addressed to the local host." +msgstr "``PACKET_HOST`` (默认值) - 寻址到本地主机的数据包。" + +#: ../../library/socket.rst:226 +msgid "``PACKET_BROADCAST`` - Physical-layer broadcast packet." +msgstr "``PACKET_BROADCAST`` - 物理层广播的数据包。" + +#: ../../library/socket.rst:227 +msgid "" +"``PACKET_MULTICAST`` - Packet sent to a physical-layer multicast address." +msgstr "``PACKET_MULTICAST`` - 发送到物理层多播地址的数据包。" + +#: ../../library/socket.rst:228 +msgid "" +"``PACKET_OTHERHOST`` - Packet to some other host that has been caught by a " +"device driver in promiscuous mode." +msgstr "``PACKET_OTHERHOST`` - 被(处于混杂模式的)网卡驱动捕获的、发送到其他主机的数据包。" + +#: ../../library/socket.rst:230 +msgid "" +"``PACKET_OUTGOING`` - Packet originating from the local host that is looped " +"back to a packet socket." +msgstr "``PACKET_OUTGOING`` - 来自本地主机的、回环到一个套接字的数据包。" + +#: ../../library/socket.rst:232 +msgid "*hatype* - Optional integer specifying the ARP hardware address type." +msgstr "*hatype* - 可选整数,指定 ARP 硬件地址类型。" + +#: ../../library/socket.rst:233 +msgid "" +"*addr* - Optional bytes-like object specifying the hardware physical " +"address, whose interpretation depends on the device." +msgstr "*addr* - 可选的类字节串对象,用于指定硬件物理地址,其解释取决于各设备。" + +#: ../../library/socket.rst:238 +msgid "" +":const:`AF_QIPCRTR` is a Linux-only socket based interface for communicating" +" with services running on co-processors in Qualcomm platforms. The address " +"family is represented as a ``(node, port)`` tuple where the *node* and " +"*port* are non-negative integers." +msgstr "" +":const:`AF_QIPCRTR` 是一个仅 Linux 可用的、基于套接字的接口,用于与高通平台中协处理器上运行的服务进行通信。该地址簇用一个 " +"``(node, port)`` 元组表示,其中 *node* 和 *port* 为非负整数。" + +#: ../../library/socket.rst:247 +msgid "" +":const:`IPPROTO_UDPLITE` is a variant of UDP which allows you to specify " +"what portion of a packet is covered with the checksum. It adds two socket " +"options that you can change. ``self.setsockopt(IPPROTO_UDPLITE, " +"UDPLITE_SEND_CSCOV, length)`` will change what portion of outgoing packets " +"are covered by the checksum and ``self.setsockopt(IPPROTO_UDPLITE, " +"UDPLITE_RECV_CSCOV, length)`` will filter out packets which cover too little" +" of their data. In both cases ``length`` should be in ``range(8, 2**16, " +"8)``." +msgstr "" +":const:`IPPROTO_UDPLITE` 是一种 UDP " +"的变体,允许指定数据包的哪一部分计算入校验码内。它添加了两个可以修改的套接字选项。``self.setsockopt(IPPROTO_UDPLITE, " +"UDPLITE_SEND_CSCOV, length)`` 修改传出数据包的哪一部分计算入校验码内,而 " +"``self.setsockopt(IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV, length)`` " +"将过滤掉计算入校验码的数据太少的数据包。在这两种情况下,``length`` 都应在 ``range(8, 2**16, 8)`` 范围内。" + +#: ../../library/socket.rst:256 +msgid "" +"Such a socket should be constructed with ``socket(AF_INET, SOCK_DGRAM, " +"IPPROTO_UDPLITE)`` for IPv4 or ``socket(AF_INET6, SOCK_DGRAM, " +"IPPROTO_UDPLITE)`` for IPv6." +msgstr "" +"对于 IPv4,应使用 ``socket(AF_INET, SOCK_DGRAM, IPPROTO_UDPLITE)`` 来构造这样的套接字;对于 " +"IPv6,应使用 ``socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDPLITE)`` 来构造这样的套接字。" + +#: ../../library/socket.rst:264 +msgid "" +":const:`AF_HYPERV` is a Windows-only socket based interface for " +"communicating with Hyper-V hosts and guests. The address family is " +"represented as a ``(vm_id, service_id)`` tuple where the ``vm_id`` and " +"``service_id`` are UUID strings." +msgstr "" +":const:`AF_HYPERV` 是 Windows 专属的用于同 Hyper-V 主机和客户机通信的基于套接字的接口。其地址族以一个 " +"``(vm_id, service_id)`` 元组表示,其中 ``vm_id`` 和 ``service_id`` 均为 UUID 字符串。" + +#: ../../library/socket.rst:269 +msgid "" +"The ``vm_id`` is the virtual machine identifier or a set of known VMID " +"values if the target is not a specific virtual machine. Known VMID constants" +" defined on ``socket`` are:" +msgstr "" +"``vm_id`` 为虚拟机标识号或者如果目标不是一台特定的虚拟机则为已知 VMID 值的集合。在 ``socket`` 上定义的已知 VMID " +"常量有:" + +#: ../../library/socket.rst:273 +msgid "``HV_GUID_ZERO``" +msgstr "``HV_GUID_ZERO``" + +#: ../../library/socket.rst:274 +msgid "``HV_GUID_BROADCAST``" +msgstr "``HV_GUID_BROADCAST``" + +#: ../../library/socket.rst:275 +msgid "" +"``HV_GUID_WILDCARD`` - Used to bind on itself and accept connections from " +"all partitions." +msgstr "``HV_GUID_WILDCARD`` - 用于绑定自身并接受来自所有分区的连接。" + +#: ../../library/socket.rst:277 +msgid "" +"``HV_GUID_CHILDREN`` - Used to bind on itself and accept connection from " +"child partitions." +msgstr "``HV_GUID_CHILDREN`` - 用于绑定自身并接受来自子分区的连接。" + +#: ../../library/socket.rst:279 +msgid "``HV_GUID_LOOPBACK`` - Used as a target to itself." +msgstr "``HV_GUID_LOOPBACK`` - 用作指向自身的目标。" + +#: ../../library/socket.rst:280 +msgid "" +"``HV_GUID_PARENT`` - When used as a bind accepts connection from the parent " +"partition. When used as an address target it will connect to the parent " +"partition." +msgstr "``HV_GUID_PARENT`` - 当用作绑定时接受来自父分区的连接。当用作地址目标时它将连接到父分区。" + +#: ../../library/socket.rst:283 +msgid "" +"The ``service_id`` is the service identifier of the registered service." +msgstr "``service_id`` 是已注册服务的服务标识号。" + +#: ../../library/socket.rst:287 +msgid "" +"If you use a hostname in the *host* portion of IPv4/v6 socket address, the " +"program may show a nondeterministic behavior, as Python uses the first " +"address returned from the DNS resolution. The socket address will be " +"resolved differently into an actual IPv4/v6 address, depending on the " +"results from DNS resolution and/or the host configuration. For " +"deterministic behavior use a numeric address in *host* portion." +msgstr "" +"如果你在 IPv4/v6 套接字地址的 *host* 部分中使用了一个主机名,此程序可能会表现不确定行为,因为 Python 使用 DNS " +"解析返回的第一个地址。套接字地址在实际的 IPv4/v6 中以不同方式解析,根据 DNS 解析和/或 host 配置。为了确定行为,在 *host* " +"部分中使用数字的地址。" + +#: ../../library/socket.rst:294 +msgid "" +"All errors raise exceptions. The normal exceptions for invalid argument " +"types and out-of-memory conditions can be raised. Errors related to socket " +"or address semantics raise :exc:`OSError` or one of its subclasses." +msgstr "" +"所有错误都会引发异常。普通异常将针对无效的参数类型和内存不足等情况被引发。与套接字或地址语义有关的错误则会引发 :exc:`OSError` " +"或它的某个子类。" + +#: ../../library/socket.rst:299 +msgid "" +"Non-blocking mode is supported through :meth:`~socket.setblocking`. A " +"generalization of this based on timeouts is supported through " +":meth:`~socket.settimeout`." +msgstr "" +"可以用 :meth:`~socket.setblocking` 设置非阻塞模式。基于超时的一般化机制通过 " +":meth:`~socket.settimeout` 支持。" + +#: ../../library/socket.rst:305 +msgid "Module contents" +msgstr "模块内容" + +#: ../../library/socket.rst:307 +msgid "The module :mod:`!socket` exports the following elements." +msgstr "模块 :mod:`!socket` 导出了下列元素。" + +#: ../../library/socket.rst:311 +msgid "Exceptions" +msgstr "异常" + +#: ../../library/socket.rst:315 +msgid "A deprecated alias of :exc:`OSError`." +msgstr "一个被弃用的 :exc:`OSError` 的别名。" + +#: ../../library/socket.rst:317 +msgid "Following :pep:`3151`, this class was made an alias of :exc:`OSError`." +msgstr "根据 :pep:`3151`,这个类是 :exc:`OSError` 的别名。" + +#: ../../library/socket.rst:323 +msgid "" +"A subclass of :exc:`OSError`, this exception is raised for address-related " +"errors, i.e. for functions that use *h_errno* in the POSIX C API, including " +":func:`gethostbyname_ex` and :func:`gethostbyaddr`. The accompanying value " +"is a pair ``(h_errno, string)`` representing an error returned by a library " +"call. *h_errno* is a numeric value, while *string* represents the " +"description of *h_errno*, as returned by the :c:func:`hstrerror` C function." +msgstr "" +":exc:`OSError` 的子类,本异常通常表示与地址相关的错误,比如那些在 POSIX C API 中使用了 *h_errno* 的函数,包括 " +":func:`gethostbyname_ex` 和 :func:`gethostbyaddr`。附带的值是一对 ``(h_errno, " +"string)``,代表库调用返回的错误。*h_errno* 是一个数字,而 *string* 表示 *h_errno* 的描述,它们由 C 函数 " +":c:func:`hstrerror` 返回。" + +#: ../../library/socket.rst:331 ../../library/socket.rst:344 +#: ../../library/socket.rst:357 +msgid "This class was made a subclass of :exc:`OSError`." +msgstr "此类是 :exc:`OSError` 的子类。" + +#: ../../library/socket.rst:336 +msgid "" +"A subclass of :exc:`OSError`, this exception is raised for address-related " +"errors by :func:`getaddrinfo` and :func:`getnameinfo`. The accompanying " +"value is a pair ``(error, string)`` representing an error returned by a " +"library call. *string* represents the description of *error*, as returned " +"by the :c:func:`gai_strerror` C function. The numeric *error* value will " +"match one of the :const:`!EAI_\\*` constants defined in this module." +msgstr "" +":exc:`OSError` 的子类,该异常由 :func:`getaddrinfo` 和 :func:`getnameinfo` " +"引发以表示与地址相关的错误。附带的值是一个 ``(error, string)`` 对,代表库调用所返回的错误。 *string* 代表 *error*" +" 的描述,如 :c:func:`gai_strerror` C 函数所返回的值。数字值 *error* 将与本模块中定义的某个 " +":const:`!EAI_\\*` 常量相匹配。" + +#: ../../library/socket.rst:349 +msgid "A deprecated alias of :exc:`TimeoutError`." +msgstr ":exc:`TimeoutError` 的已被弃用的别名。" + +#: ../../library/socket.rst:351 +msgid "" +"A subclass of :exc:`OSError`, this exception is raised when a timeout occurs" +" on a socket which has had timeouts enabled via a prior call to " +":meth:`~socket.settimeout` (or implicitly through " +":func:`~socket.setdefaulttimeout`). The accompanying value is a string " +"whose value is currently always \"timed out\"." +msgstr "" +":exc:`OSError` 的子类,当套接字发生超时,且事先已调用过 :meth:`~socket.settimeout` (或隐式地通过 " +":func:`~socket.setdefaulttimeout`) 启用了超时,则会抛出此异常。 附带的值是一个字符串,其值总是 \"timed " +"out\"。" + +#: ../../library/socket.rst:360 +msgid "This class was made an alias of :exc:`TimeoutError`." +msgstr "这个类是 :exc:`TimeoutError` 的别名。" + +#: ../../library/socket.rst:365 +msgid "Constants" +msgstr "常量" + +#: ../../library/socket.rst:367 +msgid "" +"The AF_* and SOCK_* constants are now :class:`AddressFamily` and " +":class:`SocketKind` :class:`.IntEnum` collections." +msgstr "" +"AF_* 和 SOCK_* 常量现在都在 :class:`AddressFamily` 和 :class:`SocketKind` 这两个 " +":class:`.IntEnum` 集合内。" + +#: ../../library/socket.rst:376 +msgid "" +"These constants represent the address (and protocol) families, used for the " +"first argument to :func:`~socket.socket`. If the :const:`AF_UNIX` constant " +"is not defined then this protocol is unsupported. More constants may be " +"available depending on the system." +msgstr "" +"这些常量表示地址(和协议)族,被用作传给 :func:`~socket.socket` 的第一个参数。如果 :const:`AF_UNIX` " +"常量未定义则该协议将不受支持。根据具体系统可能会有更多的常量可用。" + +#: ../../library/socket.rst:383 +msgid "" +":const:`AF_UNSPEC` means that :func:`getaddrinfo` should return socket " +"addresses for any address family (either IPv4, IPv6, or any other) that can " +"be used." +msgstr "" +":const:`AF_UNSPEC` 表示 :func:`getaddrinfo` 应当为任何可被使用的地址族返回套接字地址(无论是 IPv4, " +"IPv6 还是其他)。" + +#: ../../library/socket.rst:393 +msgid "" +"These constants represent the socket types, used for the second argument to " +":func:`~socket.socket`. More constants may be available depending on the " +"system. (Only :const:`SOCK_STREAM` and :const:`SOCK_DGRAM` appear to be " +"generally useful.)" +msgstr "" +"这些常量表示套接字类型,被用作传给 :func:`~socket.socket` 的第二个参数。根据具体系统可能会有更多的常量可用。 (只有 " +":const:`SOCK_STREAM` 和 :const:`SOCK_DGRAM` 是普遍适用的。)" + +#: ../../library/socket.rst:401 +msgid "" +"These two constants, if defined, can be combined with the socket types and " +"allow you to set some flags atomically (thus avoiding possible race " +"conditions and the need for separate calls)." +msgstr "这两个常量(如果已定义)可以与上述套接字类型结合使用,允许你设置这些原子性相关的 flags(从而避免可能的竞争条件和单独调用的需要)。" + +#: ../../library/socket.rst:407 +msgid "" +"`Secure File Descriptor Handling " +"`_ for a more thorough " +"explanation." +msgstr "`安全文件描述符处理 `_ 提供了更详尽的解释。" + +#: ../../library/socket.rst:431 +msgid "" +"Many constants of these forms, documented in the Unix documentation on " +"sockets and/or the IP protocol, are also defined in the socket module. They " +"are generally used in arguments to the :meth:`~socket.setsockopt` and " +":meth:`~socket.getsockopt` methods of socket objects. In most cases, only " +"those symbols that are defined in the Unix header files are defined; for a " +"few symbols, default values are provided." +msgstr "" +"许多这样的常量,记录在 Unix 有关套接字和/或 IP 协议的文档中,也在 socket 模块中有定义。它们通常被用于传给套接字对象的 " +":meth:`~socket.setsockopt` 和 :meth:`~socket.getsockopt` 等方法的参数中。 " +"在大多数情况下,只有那些在 Unix 头文件中有定义的符号会在本模块中定义;对于部分符号,还提供了默认值。" + +#: ../../library/socket.rst:438 +msgid "" +"``SO_DOMAIN``, ``SO_PROTOCOL``, ``SO_PEERSEC``, ``SO_PASSSEC``, " +"``TCP_USER_TIMEOUT``, ``TCP_CONGESTION`` were added." +msgstr "" +"添加了 ``SO_DOMAIN``, ``SO_PROTOCOL``, ``SO_PEERSEC``, ``SO_PASSSEC``, " +"``TCP_USER_TIMEOUT``, ``TCP_CONGESTION``." + +#: ../../library/socket.rst:442 +msgid "" +"Added support for ``TCP_FASTOPEN``, ``TCP_KEEPCNT`` on Windows platforms " +"when available." +msgstr "在 Windows 平台上增加了对 ``TCP_FASTOPEN``、``TCP_KEEPCNT`` 的支持(如果可用)。" + +#: ../../library/socket.rst:446 +msgid "``TCP_NOTSENT_LOWAT`` was added." +msgstr "添加了 ``TCP_NOTSENT_LOWAT``。" + +#: ../../library/socket.rst:449 +msgid "" +"Added support for ``TCP_KEEPIDLE``, ``TCP_KEEPINTVL`` on Windows platforms " +"when available." +msgstr "在 Windows 平台上添加了对 ``TCP_KEEPIDLE``、``TCP_KEEPINTVL`` 的支持(如果可用)。" + +#: ../../library/socket.rst:452 +msgid "" +"``IP_RECVTOS`` was added. Added ``TCP_KEEPALIVE``. On MacOS this constant " +"can be used in the same way that ``TCP_KEEPIDLE`` is used on Linux." +msgstr "" +"添加了 ``IP_RECVTOS``。还添加了 ``TCP_KEEPALIVE``。这个常量在 MacOS 上可以与在 Linux 上使用 " +"``TCP_KEEPIDLE`` 的相同方式被使用。" + +#: ../../library/socket.rst:457 +msgid "" +"Added ``TCP_CONNECTION_INFO``. On MacOS this constant can be used in the " +"same way that ``TCP_INFO`` is used on Linux and BSD." +msgstr "" +"添加了 ``TCP_CONNECTION_INFO``。在 MacOS 上此常量可以与在 Linux 和 BSD 上使用 ``TCP_INFO`` " +"的相同方式来使用。" + +#: ../../library/socket.rst:461 +msgid "" +"Added ``SO_RTABLE`` and ``SO_USER_COOKIE``. On OpenBSD and FreeBSD " +"respectively those constants can be used in the same way that ``SO_MARK`` is" +" used on Linux. Also added missing TCP socket options from Linux: " +"``TCP_MD5SIG``, ``TCP_THIN_LINEAR_TIMEOUTS``, ``TCP_THIN_DUPACK``, " +"``TCP_REPAIR``, ``TCP_REPAIR_QUEUE``, ``TCP_QUEUE_SEQ``, " +"``TCP_REPAIR_OPTIONS``, ``TCP_TIMESTAMP``, ``TCP_CC_INFO``, " +"``TCP_SAVE_SYN``, ``TCP_SAVED_SYN``, ``TCP_REPAIR_WINDOW``, " +"``TCP_FASTOPEN_CONNECT``, ``TCP_ULP``, ``TCP_MD5SIG_EXT``, " +"``TCP_FASTOPEN_KEY``, ``TCP_FASTOPEN_NO_COOKIE``, ``TCP_ZEROCOPY_RECEIVE``, " +"``TCP_INQ``, ``TCP_TX_DELAY``. Added ``IP_PKTINFO``, ``IP_UNBLOCK_SOURCE``, " +"``IP_BLOCK_SOURCE``, ``IP_ADD_SOURCE_MEMBERSHIP``, " +"``IP_DROP_SOURCE_MEMBERSHIP``." +msgstr "" +"增加了 ``SO_RTABLE`` 和 ``SO_USER_COOKIE``。这些常量分别在 OpenBSD 和 FreeBSD 可按与 " +"``SO_MARK`` 在 Linux 上相同的方式被使用。 还增加了来自 Linux 的缺失的 TCP 套接字选项: ``TCP_MD5SIG``, " +"``TCP_THIN_LINEAR_TIMEOUTS``, ``TCP_THIN_DUPACK``, ``TCP_REPAIR``, " +"``TCP_REPAIR_QUEUE``, ``TCP_QUEUE_SEQ``, ``TCP_REPAIR_OPTIONS``, " +"``TCP_TIMESTAMP``, ``TCP_CC_INFO``, ``TCP_SAVE_SYN``, ``TCP_SAVED_SYN``, " +"``TCP_REPAIR_WINDOW``, ``TCP_FASTOPEN_CONNECT``, ``TCP_ULP``, " +"``TCP_MD5SIG_EXT``, ``TCP_FASTOPEN_KEY``, ``TCP_FASTOPEN_NO_COOKIE``, " +"``TCP_ZEROCOPY_RECEIVE``, ``TCP_INQ``, ``TCP_TX_DELAY``。 增加了 ``IP_PKTINFO``," +" ``IP_UNBLOCK_SOURCE``, ``IP_BLOCK_SOURCE``, ``IP_ADD_SOURCE_MEMBERSHIP``, " +"``IP_DROP_SOURCE_MEMBERSHIP``。" + +#: ../../library/socket.rst:475 +msgid "" +"Added ``SO_BINDTOIFINDEX``. On Linux this constant can be used in the same " +"way that ``SO_BINDTODEVICE`` is used, but with the index of a network " +"interface instead of its name." +msgstr "" +"增加了 ``SO_BINDTOIFINDEX``。在 Linux 上此常量可按照与 ``SO_BINDTODEVICE`` " +"相同的用法来使用,但是要通过网络接口的索引号而不是其名称。" + +#: ../../library/socket.rst:480 +msgid "" +"Added missing ``IP_FREEBIND``, ``IP_RECVERR``, ``IPV6_RECVERR``, " +"``IP_RECVTTL``, and ``IP_RECVORIGDSTADDR`` on Linux." +msgstr "" +"增加了 Linux 上缺失的 " +"``IP_FREEBIND``、``IP_RECVERR``、``IPV6_RECVERR``、``IP_RECVTTL`` 和 " +"``IP_RECVORIGDSTADDR``。" + +#: ../../library/socket.rst:484 +msgid "" +"Added support for ``TCP_QUICKACK`` on Windows platforms when available." +msgstr "在 Windows 平台上增加了对 ``TCP_QUICKACK`` 的支持(如果可用)。" + +#: ../../library/socket.rst:493 ../../library/socket.rst:577 +#: ../../library/socket.rst:601 +msgid "" +"Many constants of these forms, documented in the Linux documentation, are " +"also defined in the socket module." +msgstr "此列表内的许多常量,记载在 Linux 文档中,同时也定义在本 socket 模块中。" + +#: ../../library/socket.rst:500 +msgid "NetBSD support was added." +msgstr "添加了 NetBSD 支持。" + +#: ../../library/socket.rst:503 +msgid "Restored missing ``CAN_RAW_ERR_FILTER`` on Linux." +msgstr "在 Linux 上恢复缺失的 ``CAN_RAW_ERR_FILTER``。" + +#: ../../library/socket.rst:509 +msgid "" +"CAN_BCM, in the CAN protocol family, is the broadcast manager (BCM) " +"protocol. Broadcast manager constants, documented in the Linux " +"documentation, are also defined in the socket module." +msgstr "" +"CAN 协议簇内的 CAN_BCM 是广播管理器(Broadcast Manager -- BCM)协议,广播管理器常量在 Linux " +"文档中有所记载,在本 socket 模块中也有定义。" + +#: ../../library/socket.rst:516 +msgid "" +"The :data:`CAN_BCM_CAN_FD_FRAME` flag is only available on Linux >= 4.8." +msgstr ":data:`CAN_BCM_CAN_FD_FRAME` 旗标仅在 Linux >= 4.8 时可用。" + +#: ../../library/socket.rst:522 +msgid "" +"Enables CAN FD support in a CAN_RAW socket. This is disabled by default. " +"This allows your application to send both CAN and CAN FD frames; however, " +"you must accept both CAN and CAN FD frames when reading from the socket." +msgstr "" +"在 CAN_RAW 套接字中启用 CAN FD 支持,默认是禁用的。它使应用程序可以发送 CAN 和 CAN FD " +"帧。但是,从套接字读取时,也必须同时接受 CAN 和 CAN FD 帧。" + +#: ../../library/socket.rst:526 ../../library/socket.rst:537 +msgid "This constant is documented in the Linux documentation." +msgstr "此常量在 Linux 文档中有所记载。" + +#: ../../library/socket.rst:534 +msgid "" +"Joins the applied CAN filters such that only CAN frames that match all given" +" CAN filters are passed to user space." +msgstr "加入已应用的 CAN 过滤器,这样只有与所有 CAN 过滤器匹配的 CAN 帧才能传递到用户空间。" + +#: ../../library/socket.rst:545 +msgid "" +"CAN_ISOTP, in the CAN protocol family, is the ISO-TP (ISO 15765-2) protocol." +" ISO-TP constants, documented in the Linux documentation." +msgstr "" +"CAN 协议簇中的 CAN_ISOTP 就是 ISO-TP (ISO 15765-2) 协议。ISO-TP 常量在 Linux 文档中有所记载。" + +#: ../../library/socket.rst:554 +msgid "" +"CAN_J1939, in the CAN protocol family, is the SAE J1939 protocol. J1939 " +"constants, documented in the Linux documentation." +msgstr "CAN 协议族中的 CAN_J1939 即 SAE J1939 协议。J1939 常量记录在 Linux 文档中。" + +#: ../../library/socket.rst:565 +msgid "" +"These two constants, documented in the FreeBSD divert(4) manual page, are " +"also defined in the socket module." +msgstr "这两个常量,记录在 FreeBSD divert(4) 手册页中,同样已在 socket 模块中定义。" + +#: ../../library/socket.rst:585 +msgid "" +":data:`!ETH_P_ALL` can be used in the :class:`~socket.socket` constructor as" +" *proto* for the :const:`AF_PACKET` family in order to capture every packet," +" regardless of protocol." +msgstr "" +":data:`!ETH_P_ALL` 可在 :class:`~socket.socket` 构造器中用作 :const:`AF_PACKET` 族的 " +"*proto* 以便捕获每个包,无论是使用什么协议。" + +#: ../../library/socket.rst:589 +msgid "For more information, see the :manpage:`packet(7)` manpage." +msgstr "要了解详情,请参阅 :manpage:`packet(7)` 手册页。" + +#: ../../library/socket.rst:614 +msgid "" +"Constants for Windows' WSAIoctl(). The constants are used as arguments to " +"the :meth:`~socket.socket.ioctl` method of socket objects." +msgstr "" +"Windows 的 WSAIoctl() 的常量。这些常量用于套接字对象的 :meth:`~socket.socket.ioctl` 方法的参数。" + +#: ../../library/socket.rst:617 ../../library/socket.rst:1722 +msgid "``SIO_LOOPBACK_FAST_PATH`` was added." +msgstr "添加了 ``SIO_LOOPBACK_FAST_PATH``。" + +#: ../../library/socket.rst:623 +msgid "" +"TIPC related constants, matching the ones exported by the C socket API. See " +"the TIPC documentation for more information." +msgstr "TIPC 相关常量,与 C socket API 导出的常量一致。更多信息请参阅 TIPC 文档。" + +#: ../../library/socket.rst:630 +msgid "Constants for Linux Kernel cryptography." +msgstr "用于 Linux 内核加密算法的常量。" + +#: ../../library/socket.rst:642 +msgid "Constants for Linux host/guest communication." +msgstr "用于 Linux 宿主机/虚拟机通讯的常量。" + +#: ../../library/socket.rst:656 +msgid "" +"This constant contains a boolean value which indicates if IPv6 is supported " +"on this platform." +msgstr "本常量为一个布尔值,该值指示当前平台是否支持 IPv6。" + +#: ../../library/socket.rst:665 +msgid "Integer constants for use with Bluetooth addresses." +msgstr "用于蓝牙地址的整数常量。" + +#: ../../library/socket.rst:670 +msgid "" +"These are string constants containing Bluetooth addresses with special " +"meanings. For example, :const:`BDADDR_ANY` can be used to indicate any " +"address when specifying the binding socket with :const:`BTPROTO_RFCOMM`." +msgstr "" +"这些是字符串常量,包含蓝牙地址,这些地址具有特殊含义。例如,当用 :const:`BTPROTO_RFCOMM` 指定绑定套接字时, " +":const:`BDADDR_ANY` 表示“任何地址”。" + +#: ../../library/socket.rst:679 +msgid "" +"These constants describe the Bluetooth address type when binding or " +"connecting a :const:`BTPROTO_L2CAP` socket." +msgstr "这些常量描述绑定或连接 :const:`BTPROTO_L2CAP` 套接字时的蓝牙地址类型。" + +#: ../../library/socket.rst:692 +msgid "" +"Used in the level argument to the :meth:`~socket.setsockopt` and " +":meth:`~socket.getsockopt` methods of Bluetooth socket objects." +msgstr "" +"用于蓝牙套接字对象的 :meth:`~socket.setsockopt` 和 :meth:`~socket.getsockopt` 方法的级别参数。" + +#: ../../library/socket.rst:695 +msgid "" +":const:`SOL_BLUETOOTH` is only available on Linux. Other constants are " +"available if the corresponding protocol is supported." +msgstr ":const:`SOL_BLUETOOTH` 仅在 Linux 上可用。如果支持相应的协议,则可以使用其他常量。" + +#: ../../library/socket.rst:707 +msgid "" +"Used in the option name and value argument to the :meth:`~socket.setsockopt`" +" and :meth:`~socket.getsockopt` methods of Bluetooth socket objects." +msgstr "" +"用于蓝牙套接字对象的 :meth:`~socket.setsockopt` 和 :meth:`~socket.getsockopt` " +"方法的选项名称和值参数。" + +#: ../../library/socket.rst:710 +msgid "" +":const:`!BT_*` and :const:`L2CAP_LM` are only available on Linux. " +":const:`!SO_BTH_*` are only available on Windows. Other constants may be " +"available on Linux and various BSD platforms." +msgstr "" +":const:`!BT_*` 和 :const:`L2CAP_LM` 仅在 Linux 上可用。 :const:`!SO_BTH_*` 仅在 " +"Windows 上可用。其他常量可能在 Linux 和各种 BSD 平台可用。" + +#: ../../library/socket.rst:722 +msgid "" +"Option names for use with :const:`BTPROTO_HCI`. Availability and format of " +"the option values depend on platform." +msgstr "用于 :const:`BTPROTO_HCI` 的选项名称。选项值的可用性和格式取决于平台。" + +#: ../../library/socket.rst:725 +msgid "" +"Added :const:`!SO_HCI_EVT_FILTER` and :const:`!SO_HCI_PKT_FILTER` on NetBSD " +"and DragonFly BSD. Added :const:`!HCI_DATA_DIR` on FreeBSD, NetBSD and " +"DragonFly BSD." +msgstr "" +"在 NetBSD 和 DragonFly BSD 上增加了 :const:`!SO_HCI_EVT_FILTER` 和 " +":const:`!SO_HCI_PKT_FILTER`。在 FreeBSD、NetBSD 和 DragonFly BSD 上增加了 " +":const:`!HCI_DATA_DIR`." + +#: ../../library/socket.rst:732 +msgid "" +"The ``device_id`` value used to create an HCI socket that isn't specific to " +"a single Bluetooth adapter." +msgstr "``device_id`` 值用于创建不特定于单个蓝牙适配器的 HCI 套接字。" + +#: ../../library/socket.rst:745 +msgid "" +"Possible values for ``channel`` field in the :const:`BTPROTO_HCI` address." +msgstr ":const:`BTPROTO_HCI` 地址中 ``channel`` 字段的可能值。" + +#: ../../library/socket.rst:753 +msgid "" +"Constant for Qualcomm's IPC router protocol, used to communicate with " +"service providing remote processors." +msgstr "高通 IPC 路由协议的常量,用于与提供远程处理器的服务进行通信。" + +#: ../../library/socket.rst:762 +msgid "" +"LOCAL_CREDS and LOCAL_CREDS_PERSISTENT can be used with SOCK_DGRAM, " +"SOCK_STREAM sockets, equivalent to Linux/DragonFlyBSD SO_PASSCRED, while " +"LOCAL_CREDS sends the credentials at first read, LOCAL_CREDS_PERSISTENT " +"sends for each read, SCM_CREDS2 must be then used for the latter for the " +"message type." +msgstr "" +"LOCAL_CREDS 和 LOCAL_CREDS_PERSISTENT 可与 SOCK_DGRAM, SOCK_STREAM 套接字一起使用,等价于 " +"Linux/DragonFlyBSD SO_PASSCRED,其中 LOCAL_CREDS " +"会在首次读取时发送凭证,LOCAL_CREDS_PERSISTENT 会在每次读取时发送,随后必须为后者使用 SCM_CREDS2 作为消息类型。" + +#: ../../library/socket.rst:775 +msgid "" +"Constant to optimize CPU locality, to be used in conjunction with " +":data:`SO_REUSEPORT`." +msgstr "用于优化 CPU 定位的常量,应与 :data:`SO_REUSEPORT` 配合使用。" + +#: ../../library/socket.rst:784 +msgid "" +"Constant to enable duplicate address and port bindings with load balancing." +msgstr "常量,用于启用具有负载均衡的重复地址和端口绑定。" + +#: ../../library/socket.rst:803 +msgid "Constants for Windows Hyper-V sockets for host/guest communications." +msgstr "用于 Windows Hyper-V 宿主机/客户机通信的套接字的常量。" + +#: ../../library/socket.rst:816 +msgid "" +"`IEEE 802.3 protocol number " +"`_. " +"constants." +msgstr "" +"`IEEE 802.3 协议号 " +"`_ " +"常量。" + +#: ../../library/socket.rst:828 +msgid "" +"These constants are used by the :meth:`~socket.socket.shutdown` method of " +"socket objects." +msgstr "这些常量将由套接字对象的 :meth:`~socket.socket.shutdown` 方法使用。" + +#: ../../library/socket.rst:833 +msgid "Functions" +msgstr "函数" + +#: ../../library/socket.rst:836 +msgid "Creating sockets" +msgstr "创建套接字" + +#: ../../library/socket.rst:838 +msgid "" +"The following functions all create :ref:`socket objects `." +msgstr "下列函数都能创建 :ref:`套接字对象 `." + +#: ../../library/socket.rst:841 +msgid "" +"The :class:`socket ` class constructor creates a new socket " +"directly; see :ref:`socket-objects` for its parameters and full description." +msgstr "" + +#: ../../library/socket.rst:846 +msgid "" +"Build a pair of connected socket objects using the given address family, " +"socket type, and protocol number. Address family, socket type, and protocol" +" number are as for the :func:`~socket.socket` function. The default family " +"is :const:`AF_UNIX` if defined on the platform; otherwise, the default is " +":const:`AF_INET`." +msgstr "" +"使用给定的地址族、套接字类型和协议号构建一对已连接的套接字对象。 地址族、套接字类型和协议号与上述 :func:`~socket.socket` " +"函数中的相同。 默认地址族为定义于平台中的 :const:`AF_UNIX`;如未定义,则默认为 :const:`AF_INET`。" + +#: ../../library/socket.rst:851 +msgid "The newly created sockets are :ref:`non-inheritable `." +msgstr "新创建的套接字都是 :ref:`不可继承的 `。" + +#: ../../library/socket.rst:853 +msgid "" +"The returned socket objects now support the whole socket API, rather than a " +"subset." +msgstr "现在,返回的套接字对象支持全部套接字 API,而不是全部 API 的一个子集。" + +#: ../../library/socket.rst:857 +msgid "The returned sockets are now non-inheritable." +msgstr "返回的套接字现在都是不可继承的。" + +#: ../../library/socket.rst:860 +msgid "Windows support added." +msgstr "添加了 Windows 支持。" + +#: ../../library/socket.rst:866 +msgid "" +"Connect to a TCP service listening on the internet *address* (a 2-tuple " +"``(host, port)``), and return the socket object. This is a higher-level " +"function than :meth:`socket.connect`: if *host* is a non-numeric hostname, " +"it will try to resolve it for both :data:`AF_INET` and :data:`AF_INET6`, and" +" then try to connect to all possible addresses in turn until a connection " +"succeeds. This makes it easy to write clients that are compatible to both " +"IPv4 and IPv6." +msgstr "" +"连接到一个在互联网 *address* (以 ``(host, port)`` 2 元组表示) 上侦听的 TCP 服务,并返回套接字对象。这是一个相比 " +":meth:`socket.connect` 层级更高的函数:如果 *host* 是非数字的主机名,它将尝试将其解析为 :data:`AF_INET` " +"和 :data:`AF_INET6`,然后依次尝试连接到所有可能的地址直到连接成功。这使编写兼容 IPv4 和 IPv6 的客户端变得很容易。" + +#: ../../library/socket.rst:874 +msgid "" +"Passing the optional *timeout* parameter will set the timeout on the socket " +"instance before attempting to connect. If no *timeout* is supplied, the " +"global default timeout setting returned by :func:`getdefaulttimeout` is " +"used." +msgstr "" +"传入可选参数 *timeout* 可以在套接字实例上设置超时(在尝试连接前)。如果未提供 *timeout*,则使用由 " +":func:`getdefaulttimeout` 返回的全局默认超时设置。" + +#: ../../library/socket.rst:879 +msgid "" +"If supplied, *source_address* must be a 2-tuple ``(host, port)`` for the " +"socket to bind to as its source address before connecting. If host or port " +"are '' or 0 respectively the OS default behavior will be used." +msgstr "" +"如果提供了 *source_address*,它必须为二元组 ``(host, port)``,以便套接字在连接之前绑定为其源地址。如果 host 或 " +"port 分别为 '' 或 0,则使用操作系统默认行为。" + +#: ../../library/socket.rst:883 +msgid "" +"When a connection cannot be created, an exception is raised. By default, it " +"is the exception from the last address in the list. If *all_errors* is " +"``True``, it is an :exc:`ExceptionGroup` containing the errors of all " +"attempts." +msgstr "" +"当无法创建连接时,将会引发一个异常。在默认情况下,它将是来自列表中最后一个地址的异常。如果 *all_errors* 为 " +"``True``,它将是一个包含所有尝试错误的 :exc:`ExceptionGroup`。" + +#: ../../library/socket.rst:888 +msgid "*source_address* was added." +msgstr "添加了*source_address* 参数" + +#: ../../library/socket.rst:891 +msgid "*all_errors* was added." +msgstr "添加了 *all_errors*。" + +#: ../../library/socket.rst:897 +msgid "" +"Convenience function which creates a TCP socket bound to *address* (a " +"2-tuple ``(host, port)``) and returns the socket object." +msgstr "创建绑定到 *address* 的 TCP 套接字(一个 ``(host, port)`` 2 元组)并返回该套接字对象的便捷函数。" + +#: ../../library/socket.rst:900 +msgid "" +"*family* should be either :data:`AF_INET` or :data:`AF_INET6`. *backlog* is " +"the queue size passed to :meth:`socket.listen`; if not specified , a default" +" reasonable value is chosen. *reuse_port* dictates whether to set the " +":data:`SO_REUSEPORT` socket option." +msgstr "" +"*family* 应当为 :data:`AF_INET` 或 :data:`AF_INET6`。 *backlog* 是传递给 " +":meth:`socket.listen` 的队列大小;当未指定时,将选择一个合理的默认值。 *reuse_port* 指定是否要设置 " +":data:`SO_REUSEPORT` 套接字选项。" + +#: ../../library/socket.rst:905 +msgid "" +"If *dualstack_ipv6* is true, *family* is :data:`AF_INET6` and the platform " +"supports it the socket will be able to accept both IPv4 and IPv6 " +"connections, else it will raise :exc:`ValueError`. Most POSIX platforms and " +"Windows are supposed to support this functionality. When this functionality " +"is enabled the address returned by :meth:`socket.getpeername` when an IPv4 " +"connection occurs will be an IPv6 address represented as an IPv4-mapped IPv6" +" address. If *dualstack_ipv6* is false it will explicitly disable this " +"functionality on platforms that enable it by default (e.g. Linux). This " +"parameter can be used in conjunction with :func:`has_dualstack_ipv6`:" +msgstr "" +"如果 *dualstack_ipv6* 为真值,*family* 为 :data:`AF_INET6` 并且平台支持则套接字将能同时接受 IPv4 和 " +"IPv6 连接,否则它将引发 :exc:`ValueError`。大多数 POSIX 平台和 Windows 都应该支持此功能。当此功能被启用时 " +":meth:`socket.getpeername` 在进行 IPv4 连接时返回的将是一个被表示为映射到 IPv4 的 IPv6 地址的 IPv6 " +"地址。如果 *dualstack_ipv6* 为假值则它将在默认启用此功能的平台上(例如 Linux)显式禁用此功能。该形参可与 " +":func:`has_dualstack_ipv6` 结合使用:" + +#: ../../library/socket.rst:918 +msgid "" +"import socket\n" +"\n" +"addr = (\"\", 8080) # all interfaces, port 8080\n" +"if socket.has_dualstack_ipv6():\n" +" s = socket.create_server(addr, family=socket.AF_INET6, dualstack_ipv6=True)\n" +"else:\n" +" s = socket.create_server(addr)" +msgstr "" +"import socket\n" +"\n" +"addr = (\"\", 8080) # 所有接口,端口 8080\n" +"if socket.has_dualstack_ipv6():\n" +" s = socket.create_server(addr, family=socket.AF_INET6, dualstack_ipv6=True)\n" +"else:\n" +" s = socket.create_server(addr)" + +#: ../../library/socket.rst:927 +msgid "" +"On POSIX platforms the :data:`SO_REUSEADDR` socket option is set in order to" +" immediately reuse previous sockets which were bound on the same *address* " +"and remained in TIME_WAIT state." +msgstr "" +"在 POSIX 平台上,设置 :data:`SO_REUSEADDR` 套接字选项是为了立即重用以前绑定在同一 *address* 上并保持 " +"TIME_WAIT 状态的套接字。" + +#: ../../library/socket.rst:935 +msgid "" +"Return ``True`` if the platform supports creating a TCP socket which can " +"handle both IPv4 and IPv6 connections." +msgstr "如果平台支持创建 IPv4 和 IPv6 连接都可以处理的 TCP 套接字,则返回 ``True``。" + +#: ../../library/socket.rst:942 +msgid "" +"Duplicate the file descriptor *fd* (an integer as returned by a file " +"object's :meth:`~io.IOBase.fileno` method) and build a socket object from " +"the result. Address family, socket type and protocol number are as for the " +":func:`~socket.socket` function. The file descriptor should refer to a " +"socket, but this is not checked --- subsequent operations on the object may " +"fail if the file descriptor is invalid. This function is rarely needed, but " +"can be used to get or set socket options on a socket passed to a program as " +"standard input or output (such as a server started by the Unix inet daemon)." +" The socket is assumed to be in blocking mode." +msgstr "" + +#: ../../library/socket.rst:951 ../../library/socket.rst:1486 +#: ../../library/socket.rst:1541 ../../library/socket.rst:1635 +msgid "The newly created socket is :ref:`non-inheritable `." +msgstr "新创建的套接字是 :ref:`不可继承的 `。" + +#: ../../library/socket.rst:953 ../../library/socket.rst:1497 +msgid "The returned socket is now non-inheritable." +msgstr "返回的套接字现在是不可继承的。" + +#: ../../library/socket.rst:959 +msgid "" +"Instantiate a socket from data obtained from the :meth:`socket.share` " +"method. The socket is assumed to be in blocking mode." +msgstr "根据 :meth:`socket.share` 方法获得的数据实例化套接字。套接字将处于阻塞模式。" + +#: ../../library/socket.rst:968 +msgid "Other functions" +msgstr "其他函数" + +#: ../../library/socket.rst:970 +msgid "" +"The :mod:`!socket` module also offers various network-related services:" +msgstr ":mod:`!socket` 模块还提供了多种网络相关的服务:" + +#: ../../library/socket.rst:975 +msgid "" +"Close a socket file descriptor. This is like :func:`os.close`, but for " +"sockets. On some platforms (most notably Windows) :func:`os.close` does not " +"work for socket file descriptors." +msgstr "" +"关闭一个套接字文件描述符。 它类似于 :func:`os.close`,但专用于套接字。 在某些平台上(特别是在 Windows " +"上),:func:`os.close` 对套接字文件描述符无效。" + +#: ../../library/socket.rst:983 +msgid "" +"This function wraps the C function ``getaddrinfo`` of the underlying system." +msgstr "此函数对下层系统的 C 函数 ``getaddrinfo`` 进行了包装。" + +#: ../../library/socket.rst:985 +msgid "" +"Translate the *host*/*port* argument into a sequence of 5-tuples that " +"contain all the necessary arguments for creating a socket connected to that " +"service. *host* is a domain name, a string representation of an IPv4/v6 " +"address or ``None``. *port* is a string service name such as ``'http'``, a " +"numeric port number or ``None``. By passing ``None`` as the value of *host*" +" and *port*, you can pass ``NULL`` to the underlying C API." +msgstr "" +"将 *host*/*port* 参数转换为 5 元组的序列,其中包含创建(连接到某服务的)套接字所需的所有参数。*host* 是域名,是字符串格式的 " +"IPv4/v6 地址或 ``None``。*port* 是字符串格式的服务名称,如 ``'http'``、端口号(数字)或 ``None``。传入 " +"``None`` 作为 *host* 和 *port* 的值,相当于将 ``NULL`` 传递给底层 C API。" + +#: ../../library/socket.rst:992 +msgid "" +"The *family*, *type* and *proto* arguments can be optionally specified in " +"order to provide options and limit the list of addresses returned. Pass " +"their default values (:data:`AF_UNSPEC`, 0, and 0, respectively) to not " +"limit the results. See the note below for details." +msgstr "" +"可以选择指定 *family*, *type* 和 *proto* 参数以提供选项并对所返回的地址列表进行限制。为其传入默认值(分别为 " +":data:`AF_UNSPEC`, 0 和 0)则不会对结果进行限制。请参阅下面的注释了解详情。" + +#: ../../library/socket.rst:997 +msgid "" +"The *flags* argument can be one or several of the ``AI_*`` constants, and " +"will influence how results are computed and returned. For example, " +":const:`AI_NUMERICHOST` will disable domain name resolution and will raise " +"an error if *host* is a domain name." +msgstr "" +"*flags* 参数可以是 ``AI_*`` 常量中的一个或多个,并会影响结果的计算和返回。例如,:const:`AI_NUMERICHOST` " +"将禁用域名解析并将在 *host* 为域名时引发错误。" + +#: ../../library/socket.rst:1002 +msgid "The function returns a list of 5-tuples with the following structure:" +msgstr "本函数返回一个列表,其中的 5 元组具有以下结构:" + +#: ../../library/socket.rst:1004 +msgid "``(family, type, proto, canonname, sockaddr)``" +msgstr "``(family, type, proto, canonname, sockaddr)``" + +#: ../../library/socket.rst:1006 +msgid "" +"In these tuples, *family*, *type*, *proto* are all integers and are meant to" +" be passed to the :func:`~socket.socket` function. *canonname* will be a " +"string representing the canonical name of the *host* if " +":const:`AI_CANONNAME` is part of the *flags* argument; else *canonname* will" +" be empty. *sockaddr* is a tuple describing a socket address, whose format " +"depends on the returned *family* (a ``(address, port)`` 2-tuple for " +":const:`AF_INET`, a ``(address, port, flowinfo, scope_id)`` 4-tuple for " +":const:`AF_INET6`), and is meant to be passed to the :meth:`socket.connect` " +"method." +msgstr "" +"在这些元组中,*family*, *type*, *proto* 都是整数且其作用是被传给 :func:`~socket.socket` 函数。如果 " +":const:`AI_CANONNAME` 是 *flags* 参数的一部分则 *canonname* 将为表示 *host* 的规范名称的字符串;否则" +" *canonname* 将为空。 *sockaddr* 是一个描述套接字地址的元组,其具体格式取决于返回的 *family* (对于 " +":const:`AF_INET` 将为 ``(address, port)`` 2 元组,对于 :const:`AF_INET6` 将为 " +"``(address, port, flowinfo, scope_id)`` 4 元组),其作用是被传给 :meth:`socket.connect`" +" 方法。" + +#: ../../library/socket.rst:1018 +msgid "" +"If you intend to use results from :func:`!getaddrinfo` to create a socket " +"(rather than, for example, retrieve *canonname*), consider limiting the " +"results by *type* (e.g. :data:`SOCK_STREAM` or :data:`SOCK_DGRAM`) and/or " +"*proto* (e.g. :data:`IPPROTO_TCP` or :data:`IPPROTO_UDP`) that your " +"application can handle." +msgstr "" +"如果你想要使用来自 :func:`!getaddrinfo` 的结果创建套接字(而不是使用提取 *canonname* 等方式),可以考虑通过 " +"*type* (例如 :data:`SOCK_STREAM` 或 :data:`SOCK_DGRAM`) 和/或你的应用程序能处理的 *proto* " +"(例如 :data:`IPPROTO_TCP` 或 :data:`IPPROTO_UDP`) 来限制结果。" + +#: ../../library/socket.rst:1024 +msgid "" +"The behavior with default values of *family*, *type*, *proto* and *flags* is" +" system-specific." +msgstr "对于 *family*, *type*, *proto* 和 *flags* 使用默认值时的行为取决于具体的系统。" + +#: ../../library/socket.rst:1027 +msgid "" +"Many systems (for example, most Linux configurations) will return a sorted " +"list of all matching addresses. These addresses should generally be tried in" +" order until a connection succeeds (possibly tried in parallel, for example," +" using a `Happy Eyeballs`_ algorithm). In these cases, limiting the *type* " +"and/or *proto* can help eliminate unsuccessful or unusable connection " +"attempts." +msgstr "" +"许多系统(例如,大多数 Linux 配置)将返回一个由所有匹配的地址组成的已排序列表。 " +"这些地址通常应按顺序被尝试直到有一个连接成功(可能是并行尝试,例如使用 `Happy Eyeballs`_ 算法)。在这些情况下,限制 *type* " +"和/或 *proto* 有助于消除不成功或不可用的连接尝试。" + +#: ../../library/socket.rst:1034 +msgid "" +"Some systems will, however, only return a single address. (For example, this" +" was reported on Solaris and AIX configurations.) On these systems, limiting" +" the *type* and/or *proto* helps ensure that this address is usable." +msgstr "" +"但是,某些系统将只返回一个地址。 (例如,在 Solaris 和 AIX 配置上即有报告此种情况。)在这些系统上,限制 *type* 和/或 " +"*proto* 有助于确保此地址是可用的。" + +#: ../../library/socket.rst:1039 +msgid "" +"Raises an :ref:`auditing event ` ``socket.getaddrinfo`` with " +"arguments ``host``, ``port``, ``family``, ``type``, ``protocol``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``socket.getaddrinfo`` 并附带参数 ``host``, ``port``," +" ``family``, ``type``, ``protocol``." + +#: ../../library/socket.rst:1041 +msgid "" +"The following example fetches address information for a hypothetical TCP " +"connection to ``example.org`` on port 80 (results may differ on your system " +"if IPv6 isn't enabled)::" +msgstr "" +"下面的示例获取了 TCP 连接地址信息,假设该连接通过 80 端口连接至 ``example.org`` (如果系统未启用 " +"IPv6,则结果可能会不同)::" + +#: ../../library/socket.rst:1045 +msgid "" +">>> socket.getaddrinfo(\"example.org\", 80, proto=socket.IPPROTO_TCP)\n" +"[(socket.AF_INET6, socket.SOCK_STREAM,\n" +" 6, '', ('2606:2800:220:1:248:1893:25c8:1946', 80, 0, 0)),\n" +" (socket.AF_INET, socket.SOCK_STREAM,\n" +" 6, '', ('93.184.216.34', 80))]" +msgstr "" +">>> socket.getaddrinfo(\"example.org\", 80, proto=socket.IPPROTO_TCP)\n" +"[(socket.AF_INET6, socket.SOCK_STREAM,\n" +" 6, '', ('2606:2800:220:1:248:1893:25c8:1946', 80, 0, 0)),\n" +" (socket.AF_INET, socket.SOCK_STREAM,\n" +" 6, '', ('93.184.216.34', 80))]" + +#: ../../library/socket.rst:1051 +msgid "parameters can now be passed using keyword arguments." +msgstr "现在可以使用关键字参数的形式来传递参数。" + +#: ../../library/socket.rst:1054 +msgid "" +"for IPv6 multicast addresses, string representing an address will not " +"contain ``%scope_id`` part." +msgstr "对于 IPv6 多播地址,表示地址的字符串将不包含 ``%scope_id`` 部分。" + +#: ../../library/socket.rst:1062 +msgid "" +"Return a fully qualified domain name for *name*. If *name* is omitted or " +"empty, it is interpreted as the local host. To find the fully qualified " +"name, the hostname returned by :func:`gethostbyaddr` is checked, followed by" +" aliases for the host, if available. The first name which includes a period" +" is selected. In case no fully qualified domain name is available and " +"*name* was provided, it is returned unchanged. If *name* was empty or equal" +" to ``'0.0.0.0'``, the hostname from :func:`gethostname` is returned." +msgstr "" +"返回 *name* 的完整限定域名。如果 *name* 被省略或为空,则将其解读为本地主机。要查找完整限定名称,将先检查 " +":func:`gethostbyaddr` 所返回的主机名,然后是主机的别名(如果存在)。包括句点的第一个名称将会被选择。 对于没有完整限定域名而提供了" +" *name* 的情况,则会将其原样返回。如果 *name* 为空或等于 ``'0.0.0.0'``,则返回来自 :func:`gethostname`" +" 的主机名。" + +#: ../../library/socket.rst:1073 +msgid "" +"Translate a host name to IPv4 address format. The IPv4 address is returned " +"as a string, such as ``'100.50.200.5'``. If the host name is an IPv4 " +"address itself it is returned unchanged. See :func:`gethostbyname_ex` for a" +" more complete interface. :func:`gethostbyname` does not support IPv6 name " +"resolution, and :func:`getaddrinfo` should be used instead for IPv4/v6 dual " +"stack support." +msgstr "" +"将主机名转换为 IPv4 地址格式。IPv4 地址以字符串格式返回,如 ``'100.50.200.5'``。如果主机名本身是 IPv4 " +"地址,则原样返回。更完整的接口请参考 :func:`gethostbyname_ex`。 :func:`gethostbyname` 不支持 IPv6 " +"名称解析,应使用 :func:`getaddrinfo` 来支持 IPv4/v6 双协议栈。" + +#: ../../library/socket.rst:1079 ../../library/socket.rst:1095 +msgid "" +"Raises an :ref:`auditing event ` ``socket.gethostbyname`` with " +"argument ``hostname``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``socket.gethostbyname`` 并附带参数 ``hostname``。" + +#: ../../library/socket.rst:1086 +msgid "" +"Translate a host name to IPv4 address format, extended interface. Return a " +"3-tuple ``(hostname, aliaslist, ipaddrlist)`` where *hostname* is the host's" +" primary host name, *aliaslist* is a (possibly empty) list of alternative " +"host names for the same address, and *ipaddrlist* is a list of IPv4 " +"addresses for the same interface on the same host (often but not always a " +"single address). :func:`gethostbyname_ex` does not support IPv6 name " +"resolution, and :func:`getaddrinfo` should be used instead for IPv4/v6 dual " +"stack support." +msgstr "" +"将一个主机名转换为 IPv4 地址格式的扩展接口。返回一个 3 元组 ``(hostname, aliaslist, ipaddrlist)`` 其中 " +"*hostname* 是主机的首选主机名,*aliaslist* 是同一地址的备选主机名列表(可能为空),而 *ipaddrlist* " +"是同一主机上同一接口的 IPv4 地址列表(通常为单个地址但并不总是如此)。 :func:`gethostbyname_ex` 不支持 IPv6 " +"名称解析,应当改用 :func:`getaddrinfo` 来提供 IPv4/v6 双栈支持。" + +#: ../../library/socket.rst:1102 +msgid "" +"Return a string containing the hostname of the machine where the Python " +"interpreter is currently executing." +msgstr "返回一个字符串,包含当前正在运行 Python 解释器的机器的主机名。" + +#: ../../library/socket.rst:1105 +msgid "" +"Raises an :ref:`auditing event ` ``socket.gethostname`` with no " +"arguments." +msgstr "引发一个不带参数的 :ref:`审计事件 ` ``socket.gethostname``。" + +#: ../../library/socket.rst:1107 +msgid "" +"Note: :func:`gethostname` doesn't always return the fully qualified domain " +"name; use :func:`getfqdn` for that." +msgstr "注意: :func:`gethostname` 并不总是返回全限定域名,必要的话请使用 :func:`getfqdn`。" + +#: ../../library/socket.rst:1115 +msgid "" +"Return a 3-tuple ``(hostname, aliaslist, ipaddrlist)`` where *hostname* is " +"the primary host name responding to the given *ip_address*, *aliaslist* is a" +" (possibly empty) list of alternative host names for the same address, and " +"*ipaddrlist* is a list of IPv4/v6 addresses for the same interface on the " +"same host (most likely containing only a single address). To find the fully " +"qualified domain name, use the function :func:`getfqdn`. " +":func:`gethostbyaddr` supports both IPv4 and IPv6." +msgstr "" +"返回一个 3 元组 ``(hostname, aliaslist, ipaddrlist)`` 其中 *hostname* 是响应给定 " +"*ip_address* 的首选主机名,*aliaslist* 是同一地址的备选主机名列表(可能为空),而 *ipaddrlist* " +"是同一主机上同一接口的 IPv4/v6 地址列表(很可能仅包含一个地址)。要查询完整限定域名,请使用函数 :func:`getfqdn`。 " +":func:`gethostbyaddr` 同时支持 IPv4 和 IPv6。" + +#: ../../library/socket.rst:1123 +msgid "" +"Raises an :ref:`auditing event ` ``socket.gethostbyaddr`` with " +"argument ``ip_address``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``socket.gethostbyaddr`` 并附带参数 ``ip_address``。" + +#: ../../library/socket.rst:1130 +msgid "" +"Translate a socket address *sockaddr* into a 2-tuple ``(host, port)``. " +"Depending on the settings of *flags*, the result can contain a fully " +"qualified domain name or numeric address representation in *host*. " +"Similarly, *port* can contain a string port name or a numeric port number." +msgstr "" +"将套接字地址 *sockaddr* 转换为一个 2 元组 ``(host, port)``。根据 *flags* 的设置,结果可能包含 *host* " +"中的完整限定域名或数字形式的地址。类似地,*port* 可以包含字符串形式的端口名或数字形式的端口号。" + +#: ../../library/socket.rst:1135 +msgid "" +"For IPv6 addresses, ``%scope_id`` is appended to the host part if *sockaddr*" +" contains meaningful *scope_id*. Usually this happens for multicast " +"addresses." +msgstr "" +"对于 IPv6 地址,如果 *sockaddr* 包含有意义的 *scope_id*,则 ``%scope_id`` 会被附加到主机部分。 " +"这种情况通常发生在多播地址上。" + +#: ../../library/socket.rst:1138 +msgid "" +"For more information about *flags* you can consult " +":manpage:`getnameinfo(3)`." +msgstr "关于 *flags* 的更多信息可参阅 :manpage:`getnameinfo(3)`。" + +#: ../../library/socket.rst:1140 +msgid "" +"Raises an :ref:`auditing event ` ``socket.getnameinfo`` with " +"argument ``sockaddr``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``socket.getnameinfo`` 并附带参数 ``sockaddr``。" + +#: ../../library/socket.rst:1147 +msgid "" +"Translate an internet protocol name (for example, ``'icmp'``) to a constant " +"suitable for passing as the (optional) third argument to the " +":func:`~socket.socket` function. This is usually only needed for sockets " +"opened in \"raw\" mode (:const:`SOCK_RAW`); for the normal socket modes, the" +" correct protocol is chosen automatically if the protocol is omitted or " +"zero." +msgstr "" +"将一个互联网协议名称 (如 ``'icmp'``) 转写为能被作为 (可选的) 第三个参数传给 :func:`~socket.socket` " +"函数的常量。这通常仅对以 \"raw\" 模式 (:const:`SOCK_RAW`) " +"打开的套接字来说是必要的;对于正常的套接字模式,当协议名称被省略或为零时会自动选择正确的协议。" + +#: ../../library/socket.rst:1158 +msgid "" +"Translate an internet service name and protocol name to a port number for " +"that service. The optional protocol name, if given, should be ``'tcp'`` or " +"``'udp'``, otherwise any protocol will match." +msgstr "" +"将一个互联网服务名称和协议名称转换为该服务的端口号。如果给出了可选的协议名称,它应为 ``'tcp'`` 或 ``'udp'``,否则将匹配任意的协议。" + +#: ../../library/socket.rst:1162 +msgid "" +"Raises an :ref:`auditing event ` ``socket.getservbyname`` with " +"arguments ``servicename``, ``protocolname``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``socket.getservbyname`` 并附带参数 ``servicename``, " +"``protocolname``." + +#: ../../library/socket.rst:1169 +msgid "" +"Translate an internet port number and protocol name to a service name for " +"that service. The optional protocol name, if given, should be ``'tcp'`` or " +"``'udp'``, otherwise any protocol will match." +msgstr "" +"将一个互联网端口号和协议名称转换为该服务的服务名称。如果给出了可选的协议名称,它应为 ``'tcp'`` 或 ``'udp'``,否则将匹配任意的协议。" + +#: ../../library/socket.rst:1173 +msgid "" +"Raises an :ref:`auditing event ` ``socket.getservbyport`` with " +"arguments ``port``, ``protocolname``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``socket.getservbyport`` 并附带参数 ``port``, " +"``protocolname``." + +#: ../../library/socket.rst:1180 +msgid "" +"Convert 32-bit positive integers from network to host byte order. On " +"machines where the host byte order is the same as network byte order, this " +"is a no-op; otherwise, it performs a 4-byte swap operation." +msgstr "" +"将 32 位正整数从网络字节序转换为主机字节序。在主机字节序与网络字节序相同的计算机上,这是一个空操作。字节序不同将执行 4 字节交换操作。" + +#: ../../library/socket.rst:1187 +msgid "" +"Convert 16-bit positive integers from network to host byte order. On " +"machines where the host byte order is the same as network byte order, this " +"is a no-op; otherwise, it performs a 2-byte swap operation." +msgstr "" +"将 16 位正整数从网络字节序转换为主机字节序。在主机字节序与网络字节序相同的计算机上,这是一个空操作。字节序不同将执行 2 字节交换操作。" + +#: ../../library/socket.rst:1191 ../../library/socket.rst:1209 +msgid "" +"Raises :exc:`OverflowError` if *x* does not fit in a 16-bit unsigned " +"integer." +msgstr "如果 *x* 不能转为 16 位无符号整数则会引发 :exc:`OverflowError`。" + +#: ../../library/socket.rst:1198 +msgid "" +"Convert 32-bit positive integers from host to network byte order. On " +"machines where the host byte order is the same as network byte order, this " +"is a no-op; otherwise, it performs a 4-byte swap operation." +msgstr "" +"将 32 位正整数从主机字节序转换为网络字节序。在主机字节序与网络字节序相同的计算机上,这是一个空操作。字节序不同将执行 4 字节交换操作。" + +#: ../../library/socket.rst:1205 +msgid "" +"Convert 16-bit positive integers from host to network byte order. On " +"machines where the host byte order is the same as network byte order, this " +"is a no-op; otherwise, it performs a 2-byte swap operation." +msgstr "" +"将 16 位正整数从主机字节序转换为网络字节序。在主机字节序与网络字节序相同的计算机上,这是一个空操作。字节序不同将执行 2 字节交换操作。" + +#: ../../library/socket.rst:1216 +msgid "" +"Convert an IPv4 address from dotted-quad string format (for example, " +"'123.45.67.89') to 32-bit packed binary format, as a bytes object four " +"characters in length. This is useful when conversing with a program that " +"uses the standard C library and needs objects of type :c:struct:`in_addr`, " +"which is the C type for the 32-bit packed binary this function returns." +msgstr "" +"将一个 IPv4 地址从以点号分为四段的字符串格式(例如 '123.45.67.89')转换为 32 位的紧凑二进制格式,长度为四个字符的字节串对象。 " +"这在与使用标准 C 库并且需要 :c:struct:`in_addr` 类型对象的程序通信时很有用处,该类型就是此函数所返回的 32 位的紧凑二进制格式" +" C 类型。" + +#: ../../library/socket.rst:1222 +msgid "" +":func:`inet_aton` also accepts strings with less than three dots; see the " +"Unix manual page :manpage:`inet(3)` for details." +msgstr ":func:`inet_aton` 也接受句点数少于三的字符串,详情请参阅 Unix 手册 :manpage:`inet(3)`。" + +#: ../../library/socket.rst:1225 +msgid "" +"If the IPv4 address string passed to this function is invalid, " +":exc:`OSError` will be raised. Note that exactly what is valid depends on " +"the underlying C implementation of :c:func:`inet_aton`." +msgstr "" +"如果传入本函数的 IPv4 地址字符串无效,则抛出 :exc:`OSError`。注意,具体什么样的地址有效取决于 " +":c:func:`inet_aton` 的底层 C 实现。" + +#: ../../library/socket.rst:1229 +msgid "" +":func:`inet_aton` does not support IPv6, and :func:`inet_pton` should be " +"used instead for IPv4/v6 dual stack support." +msgstr ":func:`inet_aton` 不支持 IPv6,在 IPv4/v6 双协议栈下应使用 :func:`inet_pton` 来代替。" + +#: ../../library/socket.rst:1235 +msgid "" +"Convert a 32-bit packed IPv4 address (a :term:`bytes-like object` four bytes" +" in length) to its standard dotted-quad string representation (for example, " +"'123.45.67.89'). This is useful when conversing with a program that uses " +"the standard C library and needs objects of type :c:struct:`in_addr`, which " +"is the C type for the 32-bit packed binary data this function takes as an " +"argument." +msgstr "" +"将一个 32 位紧凑 IPv4 地址 (长度为四个字节的 :term:`bytes-like object`) 转换为标准的以点号四分段字符串表示形式 " +"(例如 '123.45.67.89')。这在与使用标准 C 库并且需要 :c:struct:`in_addr` " +"类型对象的程序通信时很有用处,该类型就是此函数接受作为参数的 32 位的紧凑二进制格式 C 类型。" + +#: ../../library/socket.rst:1242 +msgid "" +"If the byte sequence passed to this function is not exactly 4 bytes in " +"length, :exc:`OSError` will be raised. :func:`inet_ntoa` does not support " +"IPv6, and :func:`inet_ntop` should be used instead for IPv4/v6 dual stack " +"support." +msgstr "" +"如果传入本函数的字节序列长度不是 4 个字节,则抛出 :exc:`OSError`。:func:`inet_ntoa` 不支持 IPv6,在 " +"IPv4/v6 双协议栈下应使用 :func:`inet_ntop` 来代替。" + +#: ../../library/socket.rst:1253 +msgid "" +"Convert an IP address from its family-specific string format to a packed, " +"binary format. :func:`inet_pton` is useful when a library or network " +"protocol calls for an object of type :c:struct:`in_addr` (similar to " +":func:`inet_aton`) or :c:struct:`in6_addr`." +msgstr "" +"将基于特定地址族字符串格式的 IP 地址转换为紧凑的二进制格式。 :func:`inet_pton` 在一个库或网络协议需要 " +":c:struct:`in_addr` (类似于 :func:`inet_aton`) 或 :c:struct:`in6_addr` " +"类型的对象时很有用处。" + +#: ../../library/socket.rst:1258 +msgid "" +"Supported values for *address_family* are currently :const:`AF_INET` and " +":const:`AF_INET6`. If the IP address string *ip_string* is invalid, " +":exc:`OSError` will be raised. Note that exactly what is valid depends on " +"both the value of *address_family* and the underlying implementation of " +":c:func:`inet_pton`." +msgstr "" +"目前 *address_family* 支持 :const:`AF_INET` 和 :const:`AF_INET6`。如果 IP 地址字符串 " +"*ip_string* 无效,则抛出 :exc:`OSError`。注意,具体什么地址有效取决于 *address_family* 的值和 " +":c:func:`inet_pton` 的底层实现。" + +#: ../../library/socket.rst:1266 ../../library/socket.rst:1286 +msgid "Windows support added" +msgstr "添加了 Windows 支持" + +#: ../../library/socket.rst:1272 +msgid "" +"Convert a packed IP address (a :term:`bytes-like object` of some number of " +"bytes) to its standard, family-specific string representation (for example, " +"``'7.10.0.5'`` or ``'5aef:2b::8'``). :func:`inet_ntop` is useful when a " +"library or network protocol returns an object of type :c:struct:`in_addr` " +"(similar to :func:`inet_ntoa`) or :c:struct:`in6_addr`." +msgstr "" +"将一个紧凑的 IP 地址 (长度为多个字节的 :term:`bytes-like object`) 转换为标准的基于特定地址族的字符串表示形式 (例如 " +"``'7.10.0.5'`` 或 ``'5aef:2b::8'``)。 :func:`inet_ntop` 在一个库或网络协议返回 " +":c:struct:`in_addr` (类似于 :func:`inet_ntoa`) 或 :c:struct:`in6_addr` " +"类型的对象时很有用处。" + +#: ../../library/socket.rst:1279 +msgid "" +"Supported values for *address_family* are currently :const:`AF_INET` and " +":const:`AF_INET6`. If the bytes object *packed_ip* is not the correct length" +" for the specified address family, :exc:`ValueError` will be raised. " +":exc:`OSError` is raised for errors from the call to :func:`inet_ntop`." +msgstr "" +"目前 *address_family* 支持 :const:`AF_INET` 和 :const:`AF_INET6`。如果字节对象 " +"*packed_ip* 与指定的地址簇长度不符,则抛出 :exc:`ValueError`。针对 :func:`inet_ntop` 调用的错误则抛出 " +":exc:`OSError`." + +#: ../../library/socket.rst:1301 +msgid "" +"Return the total length, without trailing padding, of an ancillary data item" +" with associated data of the given *length*. This value can often be used " +"as the buffer size for :meth:`~socket.recvmsg` to receive a single item of " +"ancillary data, but :rfc:`3542` requires portable applications to use " +":func:`CMSG_SPACE` and thus include space for padding, even when the item " +"will be the last in the buffer. Raises :exc:`OverflowError` if *length* is " +"outside the permissible range of values." +msgstr "" +"返回给定 *length* 所关联数据的辅助数据项的总长度(不带尾部填充)。此值通常用作 :meth:`~socket.recvmsg` " +"接收一个辅助数据项的缓冲区大小,但是 :rfc:`3542` 要求可移植应用程序使用 " +":func:`CMSG_SPACE`,以此将尾部填充的空间计入,即使该项在缓冲区的最后。如果 *length* 超出允许范围,则抛出 " +":exc:`OverflowError`." + +#: ../../library/socket.rst:1312 ../../library/socket.rst:1861 +#: ../../library/socket.rst:1905 ../../library/socket.rst:2013 +msgid "Most Unix platforms." +msgstr "大多数 Unix 平台。" + +#: ../../library/socket.rst:1319 +msgid "" +"Return the buffer size needed for :meth:`~socket.recvmsg` to receive an " +"ancillary data item with associated data of the given *length*, along with " +"any trailing padding. The buffer space needed to receive multiple items is " +"the sum of the :func:`CMSG_SPACE` values for their associated data lengths." +" Raises :exc:`OverflowError` if *length* is outside the permissible range " +"of values." +msgstr "" +"返回 :meth:`~socket.recvmsg` 所需的缓冲区大小,以接收给定 *length* " +"所关联数据的辅助数据项,带有尾部填充。接收多个项目所需的缓冲区空间是关联数据长度的 :func:`CMSG_SPACE` 值的总和。如果 " +"*length* 超出允许范围,则抛出 :exc:`OverflowError`。" + +#: ../../library/socket.rst:1327 +msgid "" +"Note that some systems might support ancillary data without providing this " +"function. Also note that setting the buffer size using the results of this " +"function may not precisely limit the amount of ancillary data that can be " +"received, since additional data may be able to fit into the padding area." +msgstr "" +"请注意,某些系统可能支持辅助数据,但不提供本函数。还需注意,如果使用本函数的结果来设置缓冲区大小,可能无法精确限制可接收的辅助数据量,因为可能会有其他数据写入尾部填充区域。" + +#: ../../library/socket.rst:1335 +msgid "most Unix platforms." +msgstr "大多数 Unix 平台。" + +#: ../../library/socket.rst:1342 +msgid "" +"Return the default timeout in seconds (float) for new socket objects. A " +"value of ``None`` indicates that new socket objects have no timeout. When " +"the socket module is first imported, the default is ``None``." +msgstr "" +"返回用于新套接字对象的默认超时(以秒为单位的浮点数)。值 ``None`` 表示新套接字对象没有超时。首次导入 socket 模块时,默认值为 " +"``None``." + +#: ../../library/socket.rst:1349 +msgid "" +"Set the default timeout in seconds (float) for new socket objects. When the" +" socket module is first imported, the default is ``None``. See " +":meth:`~socket.settimeout` for possible values and their respective " +"meanings." +msgstr "" +"设置用于新套接字对象的默认超时(以秒为单位的浮点数)。首次导入 socket 模块时,默认值为 ``None``。可能的取值及其各自的含义请参阅 " +":meth:`~socket.settimeout`." + +#: ../../library/socket.rst:1357 +msgid "" +"Set the machine's hostname to *name*. This will raise an :exc:`OSError` if " +"you don't have enough rights." +msgstr "将计算机的主机名设置为 *name*。如果权限不足将抛出 :exc:`OSError`。" + +#: ../../library/socket.rst:1360 +msgid "" +"Raises an :ref:`auditing event ` ``socket.sethostname`` with " +"argument ``name``." +msgstr "引发一个 :ref:`审计事件 ` ``socket.sethostname`` 并附带参数 ``name``。" + +#: ../../library/socket.rst:1369 +msgid "" +"Return a list of network interface information (index int, name string) " +"tuples. :exc:`OSError` if the system call fails." +msgstr "返回一个列表,包含网络接口(网卡)信息二元组(整数索引,名称字符串)。系统调用失败则抛出 :exc:`OSError`。" + +#: ../../library/socket.rst:1377 ../../library/socket.rst:1404 +#: ../../library/socket.rst:1421 +msgid "Windows support was added." +msgstr "添加了 Windows 支持。" + +#: ../../library/socket.rst:1382 +msgid "" +"On Windows network interfaces have different names in different contexts " +"(all names are examples):" +msgstr "在 Windows 中网络接口在不同上下文中具有不同的名称(所有名称见对应示例):" + +#: ../../library/socket.rst:1385 +msgid "UUID: ``{FB605B73-AAC2-49A6-9A2F-25416AEA0573}``" +msgstr "UUID: ``{FB605B73-AAC2-49A6-9A2F-25416AEA0573}``" + +#: ../../library/socket.rst:1386 +msgid "name: ``ethernet_32770``" +msgstr "名称: ``ethernet_32770``" + +#: ../../library/socket.rst:1387 +msgid "friendly name: ``vEthernet (nat)``" +msgstr "友好名称: ``vEthernet (nat)``" + +#: ../../library/socket.rst:1388 +msgid "description: ``Hyper-V Virtual Ethernet Adapter``" +msgstr "描述: ``Hyper-V Virtual Ethernet Adapter``" + +#: ../../library/socket.rst:1390 +msgid "" +"This function returns names of the second form from the list, " +"``ethernet_32770`` in this example case." +msgstr "此函数返回列表中第二种形式的名称,在此示例中为 ``ethernet_32770``。" + +#: ../../library/socket.rst:1396 +msgid "" +"Return a network interface index number corresponding to an interface name. " +":exc:`OSError` if no interface with the given name exists." +msgstr "返回与网络接口名称相对应的索引号。如果没有所给名称的接口,则抛出 :exc:`OSError`。" + +#: ../../library/socket.rst:1408 ../../library/socket.rst:1425 +msgid "\"Interface name\" is a name as documented in :func:`if_nameindex`." +msgstr "\"Interface name\" 为 :func:`if_nameindex` 中所描述的名称。" + +#: ../../library/socket.rst:1413 +msgid "" +"Return a network interface name corresponding to an interface index number. " +":exc:`OSError` if no interface with the given index exists." +msgstr "返回与网络接口索引号相对应的接口名称。如果没有所给索引号的接口,则抛出 :exc:`OSError`。" + +#: ../../library/socket.rst:1430 +msgid "" +"Send the list of file descriptors *fds* over an :const:`AF_UNIX` socket " +"*sock*. The *fds* parameter is a sequence of file descriptors. Consult " +":meth:`~socket.sendmsg` for the documentation of these parameters." +msgstr "" +"将文件描述符列表 *fds* 通过一个 :const:`AF_UNIX` 套接字 *sock* 进行发送。 *fds* 形参是由文件描述符组成的序列。 " +"请查看 :meth:`~socket.sendmsg` 获取这些形参的文档说明。" + +#: ../../library/socket.rst:1436 +msgid "" +"Unix platforms supporting :meth:`~socket.sendmsg` and :const:`SCM_RIGHTS` " +"mechanism." +msgstr "支持 :meth:`~socket.sendmsg` 和 :const:`SCM_RIGHTS` 机制的 Unix 平台。" + +#: ../../library/socket.rst:1444 +msgid "" +"Receive up to *maxfds* file descriptors from an :const:`AF_UNIX` socket " +"*sock*. Return ``(msg, list(fds), flags, addr)``. Consult " +":meth:`~socket.recvmsg` for the documentation of these parameters." +msgstr "" +"接收至多 *maxfds* 个来自 :const:`AF_UNIX` 套接字 *sock* 的文件描述符。返回 ``(msg, list(fds), " +"flags, addr)``。请查看 :meth:`~socket.recvmsg` 获取这些形参的文档说明。" + +#: ../../library/socket.rst:1450 +msgid "" +"Unix platforms supporting :meth:`~socket.recvmsg` and :const:`SCM_RIGHTS` " +"mechanism." +msgstr "支持 :meth:`~socket.recvmsg` 和 :const:`SCM_RIGHTS` 机制的 Unix 平台。" + +#: ../../library/socket.rst:1457 +msgid "Any truncated integers at the end of the list of file descriptors." +msgstr "位于文件描述符列表末尾的任何被截断整数。" + +#: ../../library/socket.rst:1463 +msgid "Socket Objects" +msgstr "套接字对象" + +#: ../../library/socket.rst:1467 +msgid "" +"Create a new socket using the given address family, socket type and protocol" +" number. The address family should be :const:`AF_INET` (the default), " +":const:`AF_INET6`, :const:`AF_UNIX`, :const:`AF_CAN`, :const:`AF_PACKET`, or" +" :const:`AF_RDS`. The socket type should be :const:`SOCK_STREAM` (the " +"default), :const:`SOCK_DGRAM`, :const:`SOCK_RAW` or perhaps one of the other" +" ``SOCK_`` constants. The protocol number is usually zero and may be omitted" +" or in the case where the address family is :const:`AF_CAN` the protocol " +"should be one of :const:`CAN_RAW`, :const:`CAN_BCM`, :const:`CAN_ISOTP` or " +":const:`CAN_J1939`." +msgstr "" +"使用给定的地址族、套接字类型和协议号创建一个新的套接字。地址族应为 :const:`AF_INET` (默认值), :const:`AF_INET6`," +" :const:`AF_UNIX`, :const:`AF_CAN`, :const:`AF_PACKET` 或 :const:`AF_RDS` " +"之一。套接字类型应为 :const:`SOCK_STREAM` (默认值), :const:`SOCK_DGRAM`, " +":const:`SOCK_RAW` 或其他可能的 ``SOCK_`` 常量之一。协议号通常为零并且可以省略,或在协议族为 :const:`AF_CAN`" +" 的情况下,协议应为 :const:`CAN_RAW`, :const:`CAN_BCM`, :const:`CAN_ISOTP` 或 " +":const:`CAN_J1939` 之一。" + +#: ../../library/socket.rst:1477 +msgid "" +"If *fileno* is specified, the values for *family*, *type*, and *proto* are " +"auto-detected from the specified file descriptor. Auto-detection can be " +"overruled by calling the function with explicit *family*, *type*, or *proto*" +" arguments. This only affects how Python represents e.g. the return value " +"of :meth:`socket.getpeername` but not the actual OS resource. Unlike " +":func:`socket.fromfd`, *fileno* will return the same socket and not a " +"duplicate. This may help close a detached socket using :meth:`socket.close`." +msgstr "" +"如果指定了 *fileno*,那么将从指定的文件描述符中自动检测 *family*, *type* 和 *proto* 的值。 " +"自动检测可被调用此函数时显式传入的 *family*, *type* 或 *proto* 参数所覆盖。这只会影响 Python 表示诸如 " +":meth:`socket.getpeername` 函数的返回值的方式而不会影响实际的 OS 资源。与 :func:`socket.fromfd` " +"不同,*fileno* 将返回同样的套接字而不是其副本。这将有助于使用 :meth:`socket.close` 来关闭已分离的套接字。" + +#: ../../library/socket.rst:1488 +msgid "" +"Raises an :ref:`auditing event ` ``socket.__new__`` with arguments" +" ``self``, ``family``, ``type``, ``protocol``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``socket.__new__`` 并附带参数 ``self``, ``family``, " +"``type``, ``protocol``." + +#: ../../library/socket.rst:1490 +msgid "The AF_CAN family was added. The AF_RDS family was added." +msgstr "添加了 AF_CAN 簇。添加了 AF_RDS 簇。" + +#: ../../library/socket.rst:1494 +msgid "The CAN_BCM protocol was added." +msgstr "添加了 CAN_BCM 协议。" + +#: ../../library/socket.rst:1500 +msgid "The CAN_ISOTP protocol was added." +msgstr "添加了 CAN_ISOTP 协议。" + +#: ../../library/socket.rst:1503 +msgid "" +"When :const:`SOCK_NONBLOCK` or :const:`SOCK_CLOEXEC` bit flags are applied " +"to *type* they are cleared, and :attr:`socket.type` will not reflect them. " +"They are still passed to the underlying system ``socket()`` call. " +"Therefore," +msgstr "" +"当将 :const:`SOCK_NONBLOCK` 或 :const:`SOCK_CLOEXEC` 旗标位应用于 *type* 时它们将被清除,且 " +":attr:`socket.type` 将不会反映它们。它们仍然会被传递给底层的系统 ``socket()`` 调用。因而," + +#: ../../library/socket.rst:1511 +msgid "" +"sock = socket.socket(\n" +" socket.AF_INET,\n" +" socket.SOCK_STREAM | socket.SOCK_NONBLOCK)" +msgstr "" +"sock = socket.socket(\n" +" socket.AF_INET,\n" +" socket.SOCK_STREAM | socket.SOCK_NONBLOCK)" + +#: ../../library/socket.rst:1515 +msgid "" +"will still create a non-blocking socket on OSes that support " +"``SOCK_NONBLOCK``, but ``sock.type`` will be set to ``socket.SOCK_STREAM``." +msgstr "" +"仍将在支持 ``SOCK_NONBLOCK`` 的系统上创建一个非阻塞的套接字,但是 ``sock.type`` 会被置为 " +"``socket.SOCK_STREAM``." + +#: ../../library/socket.rst:1519 +msgid "The CAN_J1939 protocol was added." +msgstr "添加了 CAN_J1939 协议。" + +#: ../../library/socket.rst:1522 +msgid "The IPPROTO_MPTCP protocol was added." +msgstr "添加了 IPPROTO_MPTCP 协议。" + +#: ../../library/socket.rst:1525 +msgid "" +"Socket objects have the following methods. Except for " +":meth:`~socket.makefile`, these correspond to Unix system calls applicable " +"to sockets." +msgstr "套接字对象具有以下方法。除了 :meth:`~socket.makefile`,其他都与套接字专用的 Unix 系统调用相对应。" + +#: ../../library/socket.rst:1529 +msgid "" +"Support for the :term:`context manager` protocol was added. Exiting the " +"context manager is equivalent to calling :meth:`~socket.close`." +msgstr "" +"添加了对 :term:`上下文管理器 ` 协议的支持。退出上下文管理器与调用 " +":meth:`~socket.close` 等效。" + +#: ../../library/socket.rst:1536 +msgid "" +"Accept a connection. The socket must be bound to an address and listening " +"for connections. The return value is a pair ``(conn, address)`` where *conn*" +" is a *new* socket object usable to send and receive data on the connection," +" and *address* is the address bound to the socket on the other end of the " +"connection." +msgstr "" +"接受一个连接。此 socket 必须绑定到一个地址上并且监听连接。返回值是一个 ``(conn, address)`` 对,其中 *conn* 是一个 " +"*新* 的套接字对象,用于在此连接上收发数据,*address* 是连接另一端的套接字所绑定的地址。" + +#: ../../library/socket.rst:1543 ../../library/socket.rst:1637 +msgid "The socket is now non-inheritable." +msgstr "该套接字现在是不可继承的。" + +#: ../../library/socket.rst:1546 ../../library/socket.rst:1773 +#: ../../library/socket.rst:1788 ../../library/socket.rst:1865 +#: ../../library/socket.rst:1938 ../../library/socket.rst:1957 +#: ../../library/socket.rst:1974 ../../library/socket.rst:2019 +msgid "" +"If the system call is interrupted and the signal handler does not raise an " +"exception, the method now retries the system call instead of raising an " +":exc:`InterruptedError` exception (see :pep:`475` for the rationale)." +msgstr "" +"如果系统调用被中断,但信号处理程序没有触发异常,此方法现在会重试系统调用,而不是触发 :exc:`InterruptedError` 异常 (原因详见 " +":pep:`475`)." + +#: ../../library/socket.rst:1554 +msgid "" +"Bind the socket to *address*. The socket must not already be bound. The " +"format of *address* depends on the address family --- see :ref:`socket-" +"addresses`." +msgstr "" +"将套接字绑定到 *address*。 套接字必须尚未绑定。 *address* 的格式取决于地址族 --- 参见 :ref:`socket-" +"addresses`。" + +#: ../../library/socket.rst:1557 +msgid "" +"Raises an :ref:`auditing event ` ``socket.bind`` with arguments " +"``self``, ``address``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``socket.bind`` 并附带参数 ``self``、``address``。" + +#: ../../library/socket.rst:1564 +msgid "" +"Mark the socket closed. The underlying system resource (e.g. a file " +"descriptor) is also closed when all file objects from :meth:`makefile` are " +"closed. Once that happens, all future operations on the socket object will " +"fail. The remote end will receive no more data (after queued data is " +"flushed)." +msgstr "" +"将套接字标记为已关闭。底层的系统资源(例如文件描述符)也将在 :meth:`makefile` 创建的所有文件对象关闭时被关闭。 " +"一旦上述情况发生,将来对该套接字对象的所有操作都将失败。远端将不会接收到新的数据(在队列中的数据被清空之后)。" + +#: ../../library/socket.rst:1570 +msgid "" +"Sockets are automatically closed when they are garbage-collected, but it is " +"recommended to :meth:`close` them explicitly, or to use a :keyword:`with` " +"statement around them." +msgstr "垃圾回收时,套接字会自动关闭,但建议显式 :meth:`close` 它们,或在它们周围使用 :keyword:`with` 语句。" + +#: ../../library/socket.rst:1574 +msgid "" +":exc:`OSError` is now raised if an error occurs when the underlying " +":c:func:`!close` call is made." +msgstr "" + +#: ../../library/socket.rst:1580 +msgid "" +":meth:`close` releases the resource associated with a connection but does " +"not necessarily close the connection immediately. If you want to close the " +"connection in a timely fashion, call :meth:`shutdown` before :meth:`close`." +msgstr "" +":meth:`close` 会释放与连接相关联的资源但不一定立即关闭连接。如果你想要及时关闭连接,请在 :meth:`close` 之前调用 " +":meth:`shutdown`." + +#: ../../library/socket.rst:1588 +msgid "" +"Connect to a remote socket at *address*. The format of *address* depends on " +"the address family --- see :ref:`socket-addresses`." +msgstr "" +"连接到位于 *address* 的远程套接字。 *address* 的格式取决于地址族 --- 参见 :ref:`socket-addresses`。" + +#: ../../library/socket.rst:1591 +msgid "" +"If the connection is interrupted by a signal, the method waits until the " +"connection completes, or raises a :exc:`TimeoutError` on timeout, if the " +"signal handler doesn't raise an exception and the socket is blocking or has " +"a timeout. For non-blocking sockets, the method raises an " +":exc:`InterruptedError` exception if the connection is interrupted by a " +"signal (or the exception raised by the signal handler)." +msgstr "" + +#: ../../library/socket.rst:1598 ../../library/socket.rst:1618 +msgid "" +"Raises an :ref:`auditing event ` ``socket.connect`` with arguments" +" ``self``, ``address``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``socket.connect`` 并附带参数 ``self``、``address``。" + +#: ../../library/socket.rst:1600 +msgid "" +"The method now waits until the connection completes instead of raising an " +":exc:`InterruptedError` exception if the connection is interrupted by a " +"signal, the signal handler doesn't raise an exception and the socket is " +"blocking or has a timeout (see the :pep:`475` for the rationale)." +msgstr "" +"本方法现在将等待,直到连接完成,而不是在以下情况抛出 :exc:`InterruptedError` " +"异常。该情况为,连接被信号中断,信号处理程序未抛出异常,且套接字阻塞中或已超时 (具体解释请参阅 :pep:`475`)。" + +#: ../../library/socket.rst:1611 +msgid "" +"Like ``connect(address)``, but return an error indicator instead of raising " +"an exception for errors returned by the C-level :c:func:`!connect` call " +"(other problems, such as \"host not found,\" can still raise exceptions). " +"The error indicator is ``0`` if the operation succeeded, otherwise the value" +" of the :c:data:`errno` variable. This is useful to support, for example, " +"asynchronous connects." +msgstr "" + +#: ../../library/socket.rst:1624 +msgid "" +"Put the socket object into closed state without actually closing the " +"underlying file descriptor. The file descriptor is returned, and can be " +"reused for other purposes." +msgstr "将套接字对象置于关闭状态,而底层的文件描述符实际并不关闭。返回该文件描述符,使其可以重新用于其他目的。" + +#: ../../library/socket.rst:1633 +msgid "Duplicate the socket." +msgstr "创建套接字的副本。" + +#: ../../library/socket.rst:1645 +msgid "" +"Return the socket's file descriptor (a small integer), or -1 on failure. " +"This is useful with :func:`select.select`." +msgstr "返回套接字的文件描述符(一个小整数),失败返回 -1。配合 :func:`select.select` 使用很有用。" + +#: ../../library/socket.rst:1648 +msgid "" +"Under Windows the small integer returned by this method cannot be used where" +" a file descriptor can be used (such as :func:`os.fdopen`). Unix does not " +"have this limitation." +msgstr "" +"在 Windows 下,此方法返回的小整数在允许使用文件描述符的地方无法使用 (如 :func:`os.fdopen`)。 Unix 无此限制。" + +#: ../../library/socket.rst:1654 +msgid "" +"Get the :ref:`inheritable flag ` of the socket's file " +"descriptor or socket's handle: ``True`` if the socket can be inherited in " +"child processes, ``False`` if it cannot." +msgstr "" +"获取套接字文件描述符或套接字句柄的 :ref:`可继承标志 `:如果子进程可以继承套接字则为 ``True``,否则为 " +"``False``." + +#: ../../library/socket.rst:1663 +msgid "" +"Return the remote address to which the socket is connected. This is useful " +"to find out the port number of a remote IPv4/v6 socket, for instance. The " +"format of the address returned depends on the address family --- see " +":ref:`socket-addresses`. On some systems this function is not supported." +msgstr "" + +#: ../../library/socket.rst:1671 +msgid "" +"Return the socket's own address. This is useful to find out the port number" +" of an IPv4/v6 socket, for instance. The format of the address returned " +"depends on the address family --- see :ref:`socket-addresses`." +msgstr "" + +#: ../../library/socket.rst:1678 +msgid "" +"Return the value of the given socket option (see the Unix man page " +":manpage:`getsockopt(2)`). The needed symbolic constants (:ref:`SO_\\* etc." +" `) are defined in this module. If *buflen* is " +"absent, an integer option is assumed and its integer value is returned by " +"the function. If *buflen* is present, it specifies the maximum length of " +"the buffer used to receive the option in, and this buffer is returned as a " +"bytes object. It is up to the caller to decode the contents of the buffer " +"(see the optional built-in module :mod:`struct` for a way to decode C " +"structures encoded as byte strings)." +msgstr "" +"返回给定套接字选项的值 (参见 Unix 手册页 :manpage:`getsockopt(2)`)。所需的符号常量 (:ref:`SO_\\* 等 " +"`) 在本模块中定义。如果未指定 *buflen*,则会假定该选项为整数值并且将由此函数返回其整数值。 " +"如果指定了 *buflen*,则它定义了用于存放选项值的缓冲区的最大长度,且该缓冲区将作为字节对象返回。 " +"调用方需要执行对缓冲区内容的解码(请参阅可选的内置模块 :mod:`struct` 了解如何对编码为字节串的 C 结构体进行解码)。" + +#: ../../library/socket.rst:1692 +msgid "" +"Return ``True`` if socket is in blocking mode, ``False`` if in non-blocking." +msgstr "如果套接字处于阻塞模式,返回 ``True``,非阻塞模式返回 ``False``。" + +#: ../../library/socket.rst:1695 +msgid "This is equivalent to checking ``socket.gettimeout() != 0``." +msgstr "这等价于检测 ``socket.gettimeout() != 0``。" + +#: ../../library/socket.rst:1702 +msgid "" +"Return the timeout in seconds (float) associated with socket operations, or " +"``None`` if no timeout is set. This reflects the last call to " +":meth:`setblocking` or :meth:`settimeout`." +msgstr "" +"返回套接字操作相关的超时秒数(浮点数),未设置超时则返回 ``None``。它反映最后一次调用 :meth:`setblocking` 或 " +":meth:`settimeout` 后的设置。" + +#: ../../library/socket.rst:1709 +msgid "" +"The :meth:`ioctl` method is a limited interface to the WSAIoctl system " +"interface. Please refer to the `Win32 documentation " +"`_ for " +"more information." +msgstr "" +":meth:`ioctl` 方法是 WSAIoctl 系统接口的有限接口。请参考 `Win32 文档 " +"`_ " +"以获取更多信息。" + +#: ../../library/socket.rst:1714 +msgid "" +"On other platforms, the generic :func:`fcntl.fcntl` and :func:`fcntl.ioctl` " +"functions may be used; they accept a socket object as their first argument." +msgstr "" +"在其他平台上,可以使用通用的 :func:`fcntl.fcntl` 和 :func:`fcntl.ioctl` " +"函数,它们接受套接字对象作为第一个参数。" + +#: ../../library/socket.rst:1717 +msgid "" +"Currently only the following control codes are supported: ``SIO_RCVALL``, " +"``SIO_KEEPALIVE_VALS``, and ``SIO_LOOPBACK_FAST_PATH``." +msgstr "" +"当前仅支持以下控制码: ``SIO_RCVALL``、``SIO_KEEPALIVE_VALS`` 和 " +"``SIO_LOOPBACK_FAST_PATH``。" + +#: ../../library/socket.rst:1728 +msgid "" +"Enable a server to accept connections. If *backlog* is specified, it must " +"be at least 0 (if it is lower, it is set to 0); it specifies the number of " +"unaccepted connections that the system will allow before refusing new " +"connections. If not specified, a default reasonable value is chosen." +msgstr "" +"启动一个服务器用于接受连接。如果指定 *backlog*,则它最低为 0(小于 0 会被置为 0),它指定系统允许暂未 accept " +"的连接数,超过后将拒绝新连接。未指定则自动设为合理的默认值。" + +#: ../../library/socket.rst:1735 +msgid "The *backlog* parameter is now optional." +msgstr "*backlog* 参数现在是可选的。" + +#: ../../library/socket.rst:1744 +msgid "" +"Return a :term:`file object` associated with the socket. The exact returned" +" type depends on the arguments given to :meth:`makefile`. These arguments " +"are interpreted the same way as by the built-in :func:`open` function, " +"except the only supported *mode* values are ``'r'`` (default), ``'w'``, " +"``'b'``, or a combination of those." +msgstr "" +"返回一个与套接字相关联的 :term:`file object`。返回对象的具体类型取决于传给 :meth:`makefile` 的参数。 " +"这些参数的解读方式与内置的 :func:`open` 函数相同,区别在于 *mode* 值仅支持 ``'r'`` (默认), ``'w'``, " +"``'b'`` 或它们的组合。" + +#: ../../library/socket.rst:1750 +msgid "" +"The socket must be in blocking mode; it can have a timeout, but the file " +"object's internal buffer may end up in an inconsistent state if a timeout " +"occurs." +msgstr "套接字必须处于阻塞模式,它可以有超时,但是如果发生超时,文件对象的内部缓冲区可能会以不一致的状态结尾。" + +#: ../../library/socket.rst:1754 +msgid "" +"Closing the file object returned by :meth:`makefile` won't close the " +"original socket unless all other file objects have been closed and " +":meth:`socket.close` has been called on the socket object." +msgstr "" +"关闭 :meth:`makefile` 返回的文件对象不会关闭原始套接字,除非所有其他文件对象都已关闭且在套接字对象上调用了 " +":meth:`socket.close`." + +#: ../../library/socket.rst:1760 +msgid "" +"On Windows, the file-like object created by :meth:`makefile` cannot be used " +"where a file object with a file descriptor is expected, such as the stream " +"arguments of :meth:`subprocess.Popen`." +msgstr "" +"在 Windows 上,由 :meth:`makefile` 创建的文件型对象无法作为带文件描述符的文件对象使用,如无法作为 " +":meth:`subprocess.Popen` 的流参数。" + +#: ../../library/socket.rst:1767 +msgid "" +"Receive data from the socket. The return value is a bytes object " +"representing the data received. The maximum amount of data to be received " +"at once is specified by *bufsize*. A returned empty bytes object indicates " +"that the client has disconnected. See the Unix manual page " +":manpage:`recv(2)` for the meaning of the optional argument *flags*; it " +"defaults to zero." +msgstr "" +"从套接字接收数据。返回值是一个代表所接收数据的字节串对象。可一次性接收的最大数据量由 *bufsize* 指定。 " +"返回空字节串对象表示客户端已断开连接。请参阅 Unix 手册页 :manpage:`recv(2)` 了解可选参数 *flags* 的含义;它默认为零。" + +#: ../../library/socket.rst:1781 +msgid "" +"Receive data from the socket. The return value is a pair ``(bytes, " +"address)`` where *bytes* is a bytes object representing the data received " +"and *address* is the address of the socket sending the data. See the Unix " +"manual page :manpage:`recv(2)` for the meaning of the optional argument " +"*flags*; it defaults to zero. The format of *address* depends on the address" +" family --- see :ref:`socket-addresses`." +msgstr "" + +#: ../../library/socket.rst:1793 +msgid "" +"For multicast IPv6 address, first item of *address* does not contain " +"``%scope_id`` part anymore. In order to get full IPv6 address use " +":func:`getnameinfo`." +msgstr "" +"对于多播 IPv6 地址,*address* 的第一项不会再包含 ``%scope_id`` 部分。要获得完整的 IPv6 地址请使用 " +":func:`getnameinfo`." + +#: ../../library/socket.rst:1800 +msgid "" +"Receive normal data (up to *bufsize* bytes) and ancillary data from the " +"socket. The *ancbufsize* argument sets the size in bytes of the internal " +"buffer used to receive the ancillary data; it defaults to 0, meaning that no" +" ancillary data will be received. Appropriate buffer sizes for ancillary " +"data can be calculated using :func:`CMSG_SPACE` or :func:`CMSG_LEN`, and " +"items which do not fit into the buffer might be truncated or discarded. The" +" *flags* argument defaults to 0 and has the same meaning as for " +":meth:`recv`." +msgstr "" +"从套接字接收普通数据(至多 *bufsize* 字节)和辅助数据。*ancbufsize* " +"参数设置用于接收辅助数据的内部缓冲区的大小(以字节为单位),默认为 0,表示不接收辅助数据。可以使用 :func:`CMSG_SPACE` 或 " +":func:`CMSG_LEN` 计算辅助数据缓冲区的合适大小,无法放入缓冲区的项目可能会被截断或丢弃。*flags* 参数默认为 0,其含义与 " +":meth:`recv` 中的相同。" + +#: ../../library/socket.rst:1810 +msgid "" +"The return value is a 4-tuple: ``(data, ancdata, msg_flags, address)``. The" +" *data* item is a :class:`bytes` object holding the non-ancillary data " +"received. The *ancdata* item is a list of zero or more tuples " +"``(cmsg_level, cmsg_type, cmsg_data)`` representing the ancillary data " +"(control messages) received: *cmsg_level* and *cmsg_type* are integers " +"specifying the protocol level and protocol-specific type respectively, and " +"*cmsg_data* is a :class:`bytes` object holding the associated data. The " +"*msg_flags* item is the bitwise OR of various flags indicating conditions on" +" the received message; see your system documentation for details. If the " +"receiving socket is unconnected, *address* is the address of the sending " +"socket, if available; otherwise, its value is unspecified." +msgstr "" +"返回值是一个四元组: ``(data, ancdata, msg_flags, address)``。*data* 项是一个 " +":class:`bytes` 对象,用于保存接收到的非辅助数据。*ancdata* 项是零个或多个元组 ``(cmsg_level, " +"cmsg_type, cmsg_data)`` 组成的列表,表示接收到的辅助数据(控制消息):*cmsg_level* 和 *cmsg_type* " +"是分别表示协议级别和协议类型的整数,而 *cmsg_data* 是保存相关数据的 :class:`bytes` 对象。*msg_flags* " +"项由各种标志按位或组成,表示接收消息的情况,详细信息请参阅系统文档。如果接收端套接字断开连接,则 *address* " +"是发送端套接字的地址(如果有),否则该值无指定。" + +#: ../../library/socket.rst:1824 +msgid "" +"On some systems, :meth:`sendmsg` and :meth:`recvmsg` can be used to pass " +"file descriptors between processes over an :const:`AF_UNIX` socket. When " +"this facility is used (it is often restricted to :const:`SOCK_STREAM` " +"sockets), :meth:`recvmsg` will return, in its ancillary data, items of the " +"form ``(socket.SOL_SOCKET, socket.SCM_RIGHTS, fds)``, where *fds* is a " +":class:`bytes` object representing the new file descriptors as a binary " +"array of the native C :c:expr:`int` type. If :meth:`recvmsg` raises an " +"exception after the system call returns, it will first attempt to close any " +"file descriptors received via this mechanism." +msgstr "" +"在某些系统上,可以使用 :meth:`sendmsg` 和 :meth:`recvmsg` 通过 :const:`AF_UNIX` " +"套接字在进程之间传递文件描述符。当使用此功能时 (通常仅限于 :const:`SOCK_STREAM` 套接字), :meth:`recvmsg` " +"将在其附带数据中返回 ``(socket.SOL_SOCKET, socket.SCM_RIGHTS, fds)`` 形式的项,其中 *fds* " +"是一个以原生 C :c:expr:`int` 类型的二进制数组形式来代表新文件描述符的 :class:`bytes` 对象。如果 " +":meth:`recvmsg` 在系统调用返回后引发了异常,它将首先尝试关闭通过此机制接收到的任何文件描述符。" + +#: ../../library/socket.rst:1835 +msgid "" +"Some systems do not indicate the truncated length of ancillary data items " +"which have been only partially received. If an item appears to extend " +"beyond the end of the buffer, :meth:`recvmsg` will issue a " +":exc:`RuntimeWarning`, and will return the part of it which is inside the " +"buffer provided it has not been truncated before the start of its associated" +" data." +msgstr "" +"对于仅接收到一部分的辅助数据项,一些系统没有指示其截断长度。如果某个项目可能超出了缓冲区的末尾,:meth:`recvmsg` 将发出 " +":exc:`RuntimeWarning`,并返回其在缓冲区内的部分,前提是该对象被截断于关联数据开始后。" + +#: ../../library/socket.rst:1842 +msgid "" +"On systems which support the :const:`!SCM_RIGHTS` mechanism, the following " +"function will receive up to *maxfds* file descriptors, returning the message" +" data and a list containing the descriptors (while ignoring unexpected " +"conditions such as unrelated control messages being received). See also " +":meth:`sendmsg`. ::" +msgstr "" + +#: ../../library/socket.rst:1848 +msgid "" +"import socket, array\n" +"\n" +"def recv_fds(sock, msglen, maxfds):\n" +" fds = array.array(\"i\") # Array of ints\n" +" msg, ancdata, flags, addr = sock.recvmsg(msglen, socket.CMSG_LEN(maxfds * fds.itemsize))\n" +" for cmsg_level, cmsg_type, cmsg_data in ancdata:\n" +" if cmsg_level == socket.SOL_SOCKET and cmsg_type == socket.SCM_RIGHTS:\n" +" # Append data, ignoring any truncated integers at the end.\n" +" fds.frombytes(cmsg_data[:len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])\n" +" return msg, list(fds)" +msgstr "" +"import socket, array\n" +"\n" +"def recv_fds(sock, msglen, maxfds):\n" +" fds = array.array(\"i\") # 整数数组\n" +" msg, ancdata, flags, addr = sock.recvmsg(msglen, socket.CMSG_LEN(maxfds * fds.itemsize))\n" +" for cmsg_level, cmsg_type, cmsg_data in ancdata:\n" +" if cmsg_level == socket.SOL_SOCKET and cmsg_type == socket.SCM_RIGHTS:\n" +" # 添加数据,忽略任何在末尾被截断的整数。\n" +" fds.frombytes(cmsg_data[:len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])\n" +" return msg, list(fds)" + +#: ../../library/socket.rst:1873 +msgid "" +"Receive normal data and ancillary data from the socket, behaving as " +":meth:`recvmsg` would, but scatter the non-ancillary data into a series of " +"buffers instead of returning a new bytes object. The *buffers* argument " +"must be an iterable of objects that export writable buffers (e.g. " +":class:`bytearray` objects); these will be filled with successive chunks of " +"the non-ancillary data until it has all been written or there are no more " +"buffers. The operating system may set a limit (:func:`~os.sysconf` value " +"``SC_IOV_MAX``) on the number of buffers that can be used. The *ancbufsize*" +" and *flags* arguments have the same meaning as for :meth:`recvmsg`." +msgstr "" +"从套接字接收普通数据和辅助数据,其行为与 :meth:`recvmsg` " +"相同,但将非辅助数据分散到一系列缓冲区中,而不是返回新的字节对象。*buffers* 参数必须是可迭代对象,它迭代出可供写入的缓冲区(如 " +":class:`bytearray` " +"对象),这些缓冲区将被连续的非辅助数据块填充,直到数据全部写完或缓冲区用完为止。在允许使用的缓冲区数量上,操作系统可能会有限制( " +":func:`~os.sysconf` 的 ``SC_IOV_MAX`` 值)。*ancbufsize* 和 *flags* 参数的含义与 " +":meth:`recvmsg` 中的相同。" + +#: ../../library/socket.rst:1884 +msgid "" +"The return value is a 4-tuple: ``(nbytes, ancdata, msg_flags, address)``, " +"where *nbytes* is the total number of bytes of non-ancillary data written " +"into the buffers, and *ancdata*, *msg_flags* and *address* are the same as " +"for :meth:`recvmsg`." +msgstr "" +"返回值为 4 元组: ``(nbytes, ancdata, msg_flags, address)``,其中 *nbytes* " +"是写入缓冲区的非辅助数据的字节总数,而 *ancdata*、*msg_flags* 和 *address* 与 :meth:`recvmsg` " +"中的相同。" + +#: ../../library/socket.rst:1889 +msgid "Example::" +msgstr "示例::" + +#: ../../library/socket.rst:1891 +msgid "" +">>> import socket\n" +">>> s1, s2 = socket.socketpair()\n" +">>> b1 = bytearray(b'----')\n" +">>> b2 = bytearray(b'0123456789')\n" +">>> b3 = bytearray(b'--------------')\n" +">>> s1.send(b'Mary had a little lamb')\n" +"22\n" +">>> s2.recvmsg_into([b1, memoryview(b2)[2:9], b3])\n" +"(22, [], 0, None)\n" +">>> [b1, b2, b3]\n" +"[bytearray(b'Mary'), bytearray(b'01 had a 9'), bytearray(b'little lamb---')]" +msgstr "" +">>> import socket\n" +">>> s1, s2 = socket.socketpair()\n" +">>> b1 = bytearray(b'----')\n" +">>> b2 = bytearray(b'0123456789')\n" +">>> b3 = bytearray(b'--------------')\n" +">>> s1.send(b'Mary had a little lamb')\n" +"22\n" +">>> s2.recvmsg_into([b1, memoryview(b2)[2:9], b3])\n" +"(22, [], 0, None)\n" +">>> [b1, b2, b3]\n" +"[bytearray(b'Mary'), bytearray(b'01 had a 9'), bytearray(b'little lamb---')]" + +#: ../../library/socket.rst:1912 +msgid "" +"Receive data from the socket, writing it into *buffer* instead of creating a" +" new bytestring. The return value is a pair ``(nbytes, address)`` where " +"*nbytes* is the number of bytes received and *address* is the address of the" +" socket sending the data. See the Unix manual page :manpage:`recv(2)` for " +"the meaning of the optional argument *flags*; it defaults to zero. The " +"format of *address* depends on the address family --- see :ref:`socket-" +"addresses`." +msgstr "" + +#: ../../library/socket.rst:1922 +msgid "" +"Receive up to *nbytes* bytes from the socket, storing the data into a buffer" +" rather than creating a new bytestring. If *nbytes* is not specified (or " +"0), receive up to the size available in the given buffer. Returns the " +"number of bytes received. See the Unix manual page :manpage:`recv(2)` for " +"the meaning of the optional argument *flags*; it defaults to zero." +msgstr "" +"从套接字接收至多 *nbytes* 个字节,将其写入缓冲区而不是创建新的字节串。如果 *nbytes* 未指定(或指定为 " +"0),则接收至所给缓冲区的最大可用大小。返回接收到的字节数。可选参数 *flags* 的含义请参阅 Unix 手册页 " +":manpage:`recv(2)`,它默认为零。" + +#: ../../library/socket.rst:1931 +msgid "" +"Send data to the socket. The socket must be connected to a remote socket. " +"The optional *flags* argument has the same meaning as for :meth:`recv`. " +"Returns the number of bytes sent. Applications are responsible for checking " +"that all data has been sent; if only some of the data was transmitted, the " +"application needs to attempt delivery of the remaining data. For further " +"information on this topic, consult the :ref:`socket-howto`." +msgstr "" + +#: ../../library/socket.rst:1946 +msgid "" +"Send data to the socket. The socket must be connected to a remote socket. " +"The optional *flags* argument has the same meaning as for :meth:`recv`. " +"Unlike :meth:`send`, this method continues to send data from *bytes* until " +"either all data has been sent or an error occurs. ``None`` is returned on " +"success. On error, an exception is raised, and there is no way to determine" +" how much data, if any, was successfully sent." +msgstr "" + +#: ../../library/socket.rst:1953 +msgid "" +"The socket timeout is no longer reset each time data is sent successfully. " +"The socket timeout is now the maximum total duration to send all data." +msgstr "每次成功发送数据后,套接字超时将不再重置。目前的套接字超时是发送所有数据的最大总持续时间。" + +#: ../../library/socket.rst:1966 +msgid "" +"Send data to the socket. The socket should not be connected to a remote " +"socket, since the destination socket is specified by *address*. The " +"optional *flags* argument has the same meaning as for :meth:`recv`. Return " +"the number of bytes sent. The format of *address* depends on the address " +"family --- see :ref:`socket-addresses`." +msgstr "" + +#: ../../library/socket.rst:1972 +msgid "" +"Raises an :ref:`auditing event ` ``socket.sendto`` with arguments " +"``self``, ``address``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``socket.sendto`` 并附带参数 ``self``, ``address``。" + +#: ../../library/socket.rst:1982 +msgid "" +"Send normal and ancillary data to the socket, gathering the non-ancillary " +"data from a series of buffers and concatenating it into a single message. " +"The *buffers* argument specifies the non-ancillary data as an iterable of " +":term:`bytes-like objects ` (e.g. :class:`bytes` " +"objects); the operating system may set a limit (:func:`~os.sysconf` value " +"``SC_IOV_MAX``) on the number of buffers that can be used. The *ancdata* " +"argument specifies the ancillary data (control messages) as an iterable of " +"zero or more tuples ``(cmsg_level, cmsg_type, cmsg_data)``, where " +"*cmsg_level* and *cmsg_type* are integers specifying the protocol level and " +"protocol-specific type respectively, and *cmsg_data* is a bytes-like object " +"holding the associated data. Note that some systems (in particular, systems" +" without :func:`CMSG_SPACE`) might support sending only one control message " +"per call. The *flags* argument defaults to 0 and has the same meaning as " +"for :meth:`send`. If *address* is supplied and not ``None``, it sets a " +"destination address for the message. The return value is the number of " +"bytes of non-ancillary data sent." +msgstr "" +"将普通数据和辅助数据发送给套接字,将从一系列缓冲区中收集非辅助数据,并将其拼接为一条消息。*buffers* 参数指定的非辅助数据应为可迭代的 " +":term:`字节类对象 ` (如 :class:`bytes` " +"对象),在允许使用的缓冲区数量上,操作系统可能会有限制 (:func:`~os.sysconf` 的 ``SC_IOV_MAX`` " +"值)。*ancdata* 参数指定的辅助数据(控制消息)应为可迭代对象,迭代出零个或多个 ``(cmsg_level, cmsg_type, " +"cmsg_data)`` 元组,其中 *cmsg_level* 和 *cmsg_type* 是分别指定协议级别和协议类型的整数,而 " +"*cmsg_data* 是保存相关数据的字节类对象。 请注意,某些系统(特别是没有 :func:`CMSG_SPACE` " +"的系统)可能每次调用仅支持发送一条控制消息。 *flags* 参数默认为 0,与 :meth:`send` 中的含义相同。如果 *address* " +"指定为除 ``None`` 以外的值,它将作为消息的目标地址。 返回值是已发送的非辅助数据的字节数。" + +#: ../../library/socket.rst:2002 +msgid "" +"The following function sends the list of file descriptors *fds* over an " +":const:`AF_UNIX` socket, on systems which support the :const:`!SCM_RIGHTS` " +"mechanism. See also :meth:`recvmsg`. ::" +msgstr "" + +#: ../../library/socket.rst:2006 +msgid "" +"import socket, array\n" +"\n" +"def send_fds(sock, msg, fds):\n" +" return sock.sendmsg([msg], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, array.array(\"i\", fds))])" +msgstr "" +"import socket, array\n" +"\n" +"def send_fds(sock, msg, fds):\n" +" return sock.sendmsg([msg], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, array.array(\"i\", fds))])" + +#: ../../library/socket.rst:2015 +msgid "" +"Raises an :ref:`auditing event ` ``socket.sendmsg`` with arguments" +" ``self``, ``address``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``socket.sendmsg`` 并附带参数 ``self``, ``address``。" + +#: ../../library/socket.rst:2026 +msgid "" +"Specialized version of :meth:`~socket.sendmsg` for :const:`AF_ALG` socket. " +"Set mode, IV, AEAD associated data length and flags for :const:`AF_ALG` " +"socket." +msgstr "" +"为 :const:`AF_ALG` 套接字定制的 :meth:`~socket.sendmsg` 版本。可为 :const:`AF_ALG` " +"套接字设置模式、IV、AEAD 关联数据的长度和标志位。" + +#: ../../library/socket.rst:2035 +msgid "" +"Send a file until EOF is reached by using high-performance " +":mod:`os.sendfile` and return the total number of bytes which were sent. " +"*file* must be a regular file object opened in binary mode. If " +":mod:`os.sendfile` is not available (e.g. Windows) or *file* is not a " +"regular file :meth:`send` will be used instead. *offset* tells from where to" +" start reading the file. If specified, *count* is the total number of bytes " +"to transmit as opposed to sending the file until EOF is reached. File " +"position is updated on return or also in case of error in which case " +":meth:`file.tell() ` can be used to figure out the number of" +" bytes which were sent. The socket must be of :const:`SOCK_STREAM` type. " +"Non-blocking sockets are not supported." +msgstr "" +"使用高性能的 :mod:`os.sendfile` 发送文件,直到达到文件的 EOF 为止,返回已发送的字节总数。*file* " +"必须是一个以二进制模式打开的常规文件对象。如果 :mod:`os.sendfile` 不可用(如 Windows)或 *file* 不是常规文件,将使用" +" :meth:`send` 代替。*offset* 指示从哪里开始读取文件。如果指定了 " +"*count*,它确定了要发送的字节总数,而不会持续发送直到达到文件的 " +"EOF。返回时或发生错误时,文件位置将更新,在这种情况下,:meth:`file.tell() ` " +"可用于确定已发送的字节数。套接字必须为 :const:`SOCK_STREAM` 类型。不支持非阻塞的套接字。" + +#: ../../library/socket.rst:2051 +msgid "" +"Set the :ref:`inheritable flag ` of the socket's file " +"descriptor or socket's handle." +msgstr "设置套接字文件描述符或套接字句柄的 :ref:`可继承标志 `。" + +#: ../../library/socket.rst:2059 +msgid "" +"Set blocking or non-blocking mode of the socket: if *flag* is false, the " +"socket is set to non-blocking, else to blocking mode." +msgstr "设置套接字为阻塞或非阻塞模式:如果 *flag* 为 false,则将套接字设置为非阻塞,否则设置为阻塞。" + +#: ../../library/socket.rst:2062 +msgid "" +"This method is a shorthand for certain :meth:`~socket.settimeout` calls:" +msgstr "本方法是某些 :meth:`~socket.settimeout` 调用的简写:" + +#: ../../library/socket.rst:2064 +msgid "``sock.setblocking(True)`` is equivalent to ``sock.settimeout(None)``" +msgstr "``sock.setblocking(True)`` 相当于 ``sock.settimeout(None)``" + +#: ../../library/socket.rst:2066 +msgid "``sock.setblocking(False)`` is equivalent to ``sock.settimeout(0.0)``" +msgstr "``sock.setblocking(False)`` 相当于 ``sock.settimeout(0.0)``" + +#: ../../library/socket.rst:2068 +msgid "" +"The method no longer applies :const:`SOCK_NONBLOCK` flag on " +":attr:`socket.type`." +msgstr "本方法不再对 :attr:`socket.type` 属性设置 :const:`SOCK_NONBLOCK` 标志。" + +#: ../../library/socket.rst:2075 +msgid "" +"Set a timeout on blocking socket operations. The *value* argument can be a " +"nonnegative real number expressing seconds, or ``None``. If a non-zero value" +" is given, subsequent socket operations will raise a :exc:`timeout` " +"exception if the timeout period *value* has elapsed before the operation has" +" completed. If zero is given, the socket is put in non-blocking mode. If " +"``None`` is given, the socket is put in blocking mode." +msgstr "" + +#: ../../library/socket.rst:2082 +msgid "" +"For further information, please consult the :ref:`notes on socket timeouts " +"`." +msgstr "更多信息请查阅 :ref:`关于套接字超时的说明 `。" + +#: ../../library/socket.rst:2084 +msgid "" +"The method no longer toggles :const:`SOCK_NONBLOCK` flag on " +":attr:`socket.type`." +msgstr "本方法不再修改 :attr:`socket.type` 属性的 :const:`SOCK_NONBLOCK` 标志。" + +#: ../../library/socket.rst:2094 +msgid "" +"Set the value of the given socket option (see the Unix manual page " +":manpage:`setsockopt(2)`). The needed symbolic constants are defined in " +"this module (:ref:`!SO_\\* etc. `). The value can be" +" an integer, ``None`` or a :term:`bytes-like object` representing a buffer. " +"In the latter case it is up to the caller to ensure that the bytestring " +"contains the proper bits (see the optional built-in module :mod:`struct` for" +" a way to encode C structures as bytestrings). When *value* is set to " +"``None``, *optlen* argument is required. It's equivalent to calling " +":c:func:`!setsockopt` C function with ``optval=NULL`` and ``optlen=optlen``." +msgstr "" + +#: ../../library/socket.rst:2107 +msgid "setsockopt(level, optname, None, optlen: int) form added." +msgstr "添加了 setsockopt(level, optname, None, optlen: int) 调用形式。" + +#: ../../library/socket.rst:2115 +msgid "" +"Shut down one or both halves of the connection. If *how* is " +":const:`SHUT_RD`, further receives are disallowed. If *how* is " +":const:`SHUT_WR`, further sends are disallowed. If *how* is " +":const:`SHUT_RDWR`, further sends and receives are disallowed." +msgstr "" +"关闭一半或全部的连接。如果 *how* 为 :const:`SHUT_RD`,则后续不再允许接收。如果 *how* 为 " +":const:`SHUT_WR`,则后续不再允许发送。如果 *how* 为 :const:`SHUT_RDWR`,则后续的发送和接收都不允许。" + +#: ../../library/socket.rst:2125 +msgid "" +"Duplicate a socket and prepare it for sharing with a target process. The " +"target process must be provided with *process_id*. The resulting bytes " +"object can then be passed to the target process using some form of " +"interprocess communication and the socket can be recreated there using " +":func:`fromshare`. Once this method has been called, it is safe to close the" +" socket since the operating system has already duplicated it for the target " +"process." +msgstr "" +"复制套接字,并准备将其与目标进程共享。目标进程必须以 *process_id* " +"形式提供。然后可以利用某种形式的进程间通信,将返回的字节对象传递给目标进程,还可以使用 :func:`fromshare` " +"在新进程中重新创建套接字。一旦本方法调用完毕,就可以安全地将套接字关闭,因为操作系统已经为目标进程复制了该套接字。" + +#: ../../library/socket.rst:2137 +msgid "" +"Note that there are no methods :meth:`!read` or :meth:`!write`; use " +":meth:`~socket.recv` and :meth:`~socket.send` without *flags* argument " +"instead." +msgstr "" + +#: ../../library/socket.rst:2140 +msgid "" +"Socket objects also have these (read-only) attributes that correspond to the" +" values given to the :class:`~socket.socket` constructor." +msgstr "套接字对象还具有以下(只读)属性,这些属性与传入 :class:`~socket.socket` 构造函数的值相对应。" + +#: ../../library/socket.rst:2146 +msgid "The socket family." +msgstr "套接字的协议簇。" + +#: ../../library/socket.rst:2151 +msgid "The socket type." +msgstr "套接字的类型。" + +#: ../../library/socket.rst:2156 +msgid "The socket protocol." +msgstr "套接字的协议。" + +#: ../../library/socket.rst:2161 +msgid "" +"The base class of the :class:`~socket.socket` type, re-exported from " +":mod:`!_socket`. An instance check such as ``isinstance(socket(...), " +"SocketType)`` is true, but ``SocketType`` is not the same as " +"``type(socket(...))``, which is :class:`~socket.socket` itself." +msgstr "" + +#: ../../library/socket.rst:2170 +msgid "Notes on socket timeouts" +msgstr "关于套接字超时的说明" + +#: ../../library/socket.rst:2172 +msgid "" +"A socket object can be in one of three modes: blocking, non-blocking, or " +"timeout. Sockets are by default always created in blocking mode, but this " +"can be changed by calling :func:`setdefaulttimeout`." +msgstr "" +"一个套接字对象可以处于以下三种模式之一:阻塞、非阻塞或超时。套接字默认以阻塞模式创建,但是可以调用 :func:`setdefaulttimeout` " +"来更改。" + +#: ../../library/socket.rst:2176 +msgid "" +"In *blocking mode*, operations block until complete or the system returns an" +" error (such as connection timed out)." +msgstr "在 *blocking mode* (阻塞模式)中,操作将阻塞,直到操作完成或系统返回错误(如连接超时)。" + +#: ../../library/socket.rst:2179 +msgid "" +"In *non-blocking mode*, operations fail (with an error that is unfortunately" +" system-dependent) if they cannot be completed immediately: functions from " +"the :mod:`select` module can be used to know when and whether a socket is " +"available for reading or writing." +msgstr "" +"在 *非阻塞模式* 中,如果操作无法立即完成则该操作将失败(不幸的是它所附带的错误将依赖于具体系统): 来自 :mod:`select` " +"模块的函数可被用来获知一个套接字是否可以读取或写入。" + +#: ../../library/socket.rst:2184 +msgid "" +"In *timeout mode*, operations fail if they cannot be completed within the " +"timeout specified for the socket (they raise a :exc:`timeout` exception) or " +"if the system returns an error." +msgstr "" +"在 *timeout mode* (超时模式)下,如果无法在指定的超时内完成操作(抛出 :exc:`timeout` " +"异常),或如果系统返回错误,则操作将失败。" + +#: ../../library/socket.rst:2189 +msgid "" +"At the operating system level, sockets in *timeout mode* are internally set " +"in non-blocking mode. Also, the blocking and timeout modes are shared " +"between file descriptors and socket objects that refer to the same network " +"endpoint. This implementation detail can have visible consequences if e.g. " +"you decide to use the :meth:`~socket.fileno` of a socket." +msgstr "" +"在操作系统层级,*超时模式* 下的套接字在内部都被设为非阻塞模式。同时,阻塞和超时模式会在指向同一个网络端点的文件描述符和套接字对象之间共享。 " +"这一实现细节可能导致明显的后果,例如当你决定使用套接字的 :meth:`~socket.fileno` 的时候。" + +#: ../../library/socket.rst:2196 +msgid "Timeouts and the ``connect`` method" +msgstr "超时与 ``connect`` 方法" + +#: ../../library/socket.rst:2198 +msgid "" +"The :meth:`~socket.connect` operation is also subject to the timeout " +"setting, and in general it is recommended to call :meth:`~socket.settimeout`" +" before calling :meth:`~socket.connect` or pass a timeout parameter to " +":meth:`create_connection`. However, the system network stack may also " +"return a connection timeout error of its own regardless of any Python socket" +" timeout setting." +msgstr "" +":meth:`~socket.connect` 操作也受超时设置的约束,通常建议在调用 :meth:`~socket.connect` 之前调用 " +":meth:`~socket.settimeout`,或将超时参数直接传递给 :meth:`create_connection`。但是,无论 " +"Python 套接字超时设置如何,系统网络栈都有可能返回自带的连接超时错误。" + +#: ../../library/socket.rst:2206 +msgid "Timeouts and the ``accept`` method" +msgstr "超时与 ``accept`` 方法" + +#: ../../library/socket.rst:2208 +msgid "" +"If :func:`getdefaulttimeout` is not :const:`None`, sockets returned by the " +":meth:`~socket.accept` method inherit that timeout. Otherwise, the " +"behaviour depends on settings of the listening socket:" +msgstr "" +"如果 :func:`getdefaulttimeout` 的值不是 :const:`None`,则 :meth:`~socket.accept` " +"方法返回的套接字将继承该超时值。若是 None,返回的套接字行为取决于侦听套接字的设置:" + +#: ../../library/socket.rst:2212 +msgid "" +"if the listening socket is in *blocking mode* or in *timeout mode*, the " +"socket returned by :meth:`~socket.accept` is in *blocking mode*;" +msgstr "如果侦听套接字处于 *阻塞模式* 或 *超时模式*,则 :meth:`~socket.accept` 返回的套接字处于 *阻塞模式*;" + +#: ../../library/socket.rst:2215 +msgid "" +"if the listening socket is in *non-blocking mode*, whether the socket " +"returned by :meth:`~socket.accept` is in blocking or non-blocking mode is " +"operating system-dependent. If you want to ensure cross-platform behaviour," +" it is recommended you manually override this setting." +msgstr "" +"如果侦听套接字处于 *非阻塞模式*,那么 :meth:`~socket.accept` " +"返回的套接字是阻塞还是非阻塞取决于操作系统。如果要确保跨平台时的正确行为,建议手动覆盖此设置。" + +#: ../../library/socket.rst:2224 +msgid "Example" +msgstr "示例" + +#: ../../library/socket.rst:2226 +msgid "" +"Here are four minimal example programs using the TCP/IP protocol: a server " +"that echoes all data that it receives back (servicing only one client), and " +"a client using it. Note that a server must perform the sequence " +":func:`~socket.socket`, :meth:`~socket.bind`, :meth:`~socket.listen`, " +":meth:`~socket.accept` (possibly repeating the :meth:`~socket.accept` to " +"service more than one client), while a client only needs the sequence " +":func:`~socket.socket`, :meth:`~socket.connect`. Also note that the server " +"does not :meth:`~socket.sendall`/:meth:`~socket.recv` on the socket it is " +"listening on but on the new socket returned by :meth:`~socket.accept`." +msgstr "" +"以下是四个使用 TCP/IP 协议的最小示例程序:一个将收到的所有数据原样回馈的服务器(仅服务一个客户端),和一个使用该服务器的客户端。 " +"请注意服务器必须按 :func:`~socket.socket`, :meth:`~socket.bind`, " +":meth:`~socket.listen`, :meth:`~socket.accept` 的顺序执行(可能需要重复执行 " +":meth:`~socket.accept` 以便 服务多个客户端),而客户端仅需要按 :func:`~socket.socket`, " +":meth:`~socket.connect` 的顺序执行。还要注意服务器不是在侦听的套接字上发送 " +":meth:`~socket.sendall`/:meth:`~socket.recv` 而是在由 :meth:`~socket.accept` " +"返回的新套接字上发送。" + +#: ../../library/socket.rst:2236 +msgid "The first two examples support IPv4 only. ::" +msgstr "前两个示例仅支持 IPv4。 ::" + +#: ../../library/socket.rst:2238 +msgid "" +"# Echo server program\n" +"import socket\n" +"\n" +"HOST = '' # Symbolic name meaning all available interfaces\n" +"PORT = 50007 # Arbitrary non-privileged port\n" +"with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:\n" +" s.bind((HOST, PORT))\n" +" s.listen(1)\n" +" conn, addr = s.accept()\n" +" with conn:\n" +" print('Connected by', addr)\n" +" while True:\n" +" data = conn.recv(1024)\n" +" if not data: break\n" +" conn.sendall(data)" +msgstr "" +"# Echo server program\n" +"import socket\n" +"\n" +"HOST = '' # 该符号名表示所有可用接口\n" +"PORT = 50007 # 任意非特权端口\n" +"with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:\n" +" s.bind((HOST, PORT))\n" +" s.listen(1)\n" +" conn, addr = s.accept()\n" +" with conn:\n" +" print('Connected by', addr)\n" +" while True:\n" +" data = conn.recv(1024)\n" +" if not data: break\n" +" conn.sendall(data)" + +#: ../../library/socket.rst:2256 +msgid "" +"# Echo client program\n" +"import socket\n" +"\n" +"HOST = 'daring.cwi.nl' # The remote host\n" +"PORT = 50007 # The same port as used by the server\n" +"with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:\n" +" s.connect((HOST, PORT))\n" +" s.sendall(b'Hello, world')\n" +" data = s.recv(1024)\n" +"print('Received', repr(data))" +msgstr "" +"# 回显客户端程序\n" +"import socket\n" +"\n" +"HOST = 'daring.cwi.nl' # 远端主机\n" +"PORT = 50007 # 与服务器所用端口相同\n" +"with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:\n" +" s.connect((HOST, PORT))\n" +" s.sendall(b'Hello, world')\n" +" data = s.recv(1024)\n" +"print('Received', repr(data))" + +#: ../../library/socket.rst:2267 +msgid "" +"The next two examples are identical to the above two, but support both IPv4 " +"and IPv6. The server side will listen to the first address family available " +"(it should listen to both instead). On most of IPv6-ready systems, IPv6 will" +" take precedence and the server may not accept IPv4 traffic. The client side" +" will try to connect to all the addresses returned as a result of the name " +"resolution, and sends traffic to the first one connected successfully. ::" +msgstr "" +"接下来的两个例子与上面两个很相像,但同时支持 IPv4 和 IPv6。服务端将监听第一个可用的地址族(它本应同时监听两个地址族)。在大多数支持 IPv6" +" 的系统中,IPv6 将有优先权并且服务端可能不会接受 IPv4 流量。 " +"客户端将尝试连接到作为名称解析结果被返回的所有地址,并将流量发送给第一个成功连接的地址。 ::" + +#: ../../library/socket.rst:2274 +msgid "" +"# Echo server program\n" +"import socket\n" +"import sys\n" +"\n" +"HOST = None # Symbolic name meaning all available interfaces\n" +"PORT = 50007 # Arbitrary non-privileged port\n" +"s = None\n" +"for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,\n" +" socket.SOCK_STREAM, 0, socket.AI_PASSIVE):\n" +" af, socktype, proto, canonname, sa = res\n" +" try:\n" +" s = socket.socket(af, socktype, proto)\n" +" except OSError as msg:\n" +" s = None\n" +" continue\n" +" try:\n" +" s.bind(sa)\n" +" s.listen(1)\n" +" except OSError as msg:\n" +" s.close()\n" +" s = None\n" +" continue\n" +" break\n" +"if s is None:\n" +" print('could not open socket')\n" +" sys.exit(1)\n" +"conn, addr = s.accept()\n" +"with conn:\n" +" print('Connected by', addr)\n" +" while True:\n" +" data = conn.recv(1024)\n" +" if not data: break\n" +" conn.send(data)" +msgstr "" +"# 回显服务端程序\n" +"import socket\n" +"import sys\n" +"\n" +"HOST = None # 该符号名表示所有可用接口\n" +"PORT = 50007 # 任意非特权端口\n" +"s = None\n" +"for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,\n" +" socket.SOCK_STREAM, 0, socket.AI_PASSIVE):\n" +" af, socktype, proto, canonname, sa = res\n" +" try:\n" +" s = socket.socket(af, socktype, proto)\n" +" except OSError as msg:\n" +" s = None\n" +" continue\n" +" try:\n" +" s.bind(sa)\n" +" s.listen(1)\n" +" except OSError as msg:\n" +" s.close()\n" +" s = None\n" +" continue\n" +" break\n" +"if s is None:\n" +" print('could not open socket')\n" +" sys.exit(1)\n" +"conn, addr = s.accept()\n" +"with conn:\n" +" print('Connected by', addr)\n" +" while True:\n" +" data = conn.recv(1024)\n" +" if not data: break\n" +" conn.send(data)" + +#: ../../library/socket.rst:2310 +msgid "" +"# Echo client program\n" +"import socket\n" +"import sys\n" +"\n" +"HOST = 'daring.cwi.nl' # The remote host\n" +"PORT = 50007 # The same port as used by the server\n" +"s = None\n" +"for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM):\n" +" af, socktype, proto, canonname, sa = res\n" +" try:\n" +" s = socket.socket(af, socktype, proto)\n" +" except OSError as msg:\n" +" s = None\n" +" continue\n" +" try:\n" +" s.connect(sa)\n" +" except OSError as msg:\n" +" s.close()\n" +" s = None\n" +" continue\n" +" break\n" +"if s is None:\n" +" print('could not open socket')\n" +" sys.exit(1)\n" +"with s:\n" +" s.sendall(b'Hello, world')\n" +" data = s.recv(1024)\n" +"print('Received', repr(data))" +msgstr "" +"# 回显客户端程序\n" +"import socket\n" +"import sys\n" +"\n" +"HOST = 'daring.cwi.nl' # 远端主机\n" +"PORT = 50007 # 与服务器所用端口相同\n" +"s = None\n" +"for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM):\n" +" af, socktype, proto, canonname, sa = res\n" +" try:\n" +" s = socket.socket(af, socktype, proto)\n" +" except OSError as msg:\n" +" s = None\n" +" continue\n" +" try:\n" +" s.connect(sa)\n" +" except OSError as msg:\n" +" s.close()\n" +" s = None\n" +" continue\n" +" break\n" +"if s is None:\n" +" print('could not open socket')\n" +" sys.exit(1)\n" +"with s:\n" +" s.sendall(b'Hello, world')\n" +" data = s.recv(1024)\n" +"print('Received', repr(data))" + +#: ../../library/socket.rst:2339 +msgid "" +"The next example shows how to write a very simple network sniffer with raw " +"sockets on Windows. The example requires administrator privileges to modify " +"the interface::" +msgstr "下面的例子演示了如何在 Windows 上使用原始套接字编写一个非常简单的网络嗅探器。这个例子需要管理员权限来修改接口::" + +#: ../../library/socket.rst:2343 +msgid "" +"import socket\n" +"\n" +"# the public network interface\n" +"HOST = socket.gethostbyname(socket.gethostname())\n" +"\n" +"# create a raw socket and bind it to the public interface\n" +"s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)\n" +"s.bind((HOST, 0))\n" +"\n" +"# Include IP headers\n" +"s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)\n" +"\n" +"# receive all packets\n" +"s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)\n" +"\n" +"# receive a packet\n" +"print(s.recvfrom(65565))\n" +"\n" +"# disabled promiscuous mode\n" +"s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)" +msgstr "" +"import socket\n" +"\n" +"# 公共网络接口\n" +"HOST = socket.gethostbyname(socket.gethostname())\n" +"\n" +"# 创建一个原始套接字并将其绑定到公共接口\n" +"s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)\n" +"s.bind((HOST, 0))\n" +"\n" +"# 包括 IP 标头\n" +"s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)\n" +"\n" +"# 接收所有数据包\n" +"s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)\n" +"\n" +"# 接收一个数据包\n" +"print(s.recvfrom(65565))\n" +"\n" +"# 禁用混杂模式\n" +"s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)" + +#: ../../library/socket.rst:2364 +msgid "" +"The next example shows how to use the socket interface to communicate to a " +"CAN network using the raw socket protocol. To use CAN with the broadcast " +"manager protocol instead, open a socket with::" +msgstr "" +"下面的例子演示了如何使用 socket 接口与采用原始套接字协议的 CAN 网络进行通信。要改为通过广播管理器协议来使用 CAN,则要用以下方式打开一个" +" socket::" + +#: ../../library/socket.rst:2368 +msgid "socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)" +msgstr "socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)" + +#: ../../library/socket.rst:2370 +msgid "" +"After binding (:const:`CAN_RAW`) or connecting (:const:`CAN_BCM`) the " +"socket, you can use the :meth:`socket.send` and :meth:`socket.recv` " +"operations (and their counterparts) on the socket object as usual." +msgstr "" +"在绑定 (:const:`CAN_RAW`) 或连接 (:const:`CAN_BCM`) 套接字之后,你将可以在套接字对象上正常地使用 " +":meth:`socket.send` 和 :meth:`socket.recv` 操作(及其同类操作)。" + +#: ../../library/socket.rst:2374 +msgid "This last example might require special privileges::" +msgstr "最后一个例子可能需要特别的权限::" + +#: ../../library/socket.rst:2376 +msgid "" +"import socket\n" +"import struct\n" +"\n" +"\n" +"# CAN frame packing/unpacking (see 'struct can_frame' in )\n" +"\n" +"can_frame_fmt = \"=IB3x8s\"\n" +"can_frame_size = struct.calcsize(can_frame_fmt)\n" +"\n" +"def build_can_frame(can_id, data):\n" +" can_dlc = len(data)\n" +" data = data.ljust(8, b'\\x00')\n" +" return struct.pack(can_frame_fmt, can_id, can_dlc, data)\n" +"\n" +"def dissect_can_frame(frame):\n" +" can_id, can_dlc, data = struct.unpack(can_frame_fmt, frame)\n" +" return (can_id, can_dlc, data[:can_dlc])\n" +"\n" +"\n" +"# create a raw socket and bind it to the 'vcan0' interface\n" +"s = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW)\n" +"s.bind(('vcan0',))\n" +"\n" +"while True:\n" +" cf, addr = s.recvfrom(can_frame_size)\n" +"\n" +" print('Received: can_id=%x, can_dlc=%x, data=%s' % dissect_can_frame(cf))\n" +"\n" +" try:\n" +" s.send(cf)\n" +" except OSError:\n" +" print('Error sending CAN frame')\n" +"\n" +" try:\n" +" s.send(build_can_frame(0x01, b'\\x01\\x02\\x03'))\n" +" except OSError:\n" +" print('Error sending CAN frame')" +msgstr "" +"import socket\n" +"import struct\n" +"\n" +"\n" +"# CAN 帧打包/解包 (参见 中的 'struct can_frame')\n" +"\n" +"can_frame_fmt = \"=IB3x8s\"\n" +"can_frame_size = struct.calcsize(can_frame_fmt)\n" +"\n" +"def build_can_frame(can_id, data):\n" +" can_dlc = len(data)\n" +" data = data.ljust(8, b'\\x00')\n" +" return struct.pack(can_frame_fmt, can_id, can_dlc, data)\n" +"\n" +"def dissect_can_frame(frame):\n" +" can_id, can_dlc, data = struct.unpack(can_frame_fmt, frame)\n" +" return (can_id, can_dlc, data[:can_dlc])\n" +"\n" +"\n" +"# 创建一个原始套接字并将其绑定到 'vcan0' 接口\n" +"s = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW)\n" +"s.bind(('vcan0',))\n" +"\n" +"while True:\n" +" cf, addr = s.recvfrom(can_frame_size)\n" +"\n" +" print('Received: can_id=%x, can_dlc=%x, data=%s' % dissect_can_frame(cf))\n" +"\n" +" try:\n" +" s.send(cf)\n" +" except OSError:\n" +" print('Error sending CAN frame')\n" +"\n" +" try:\n" +" s.send(build_can_frame(0x01, b'\\x01\\x02\\x03'))\n" +" except OSError:\n" +" print('Error sending CAN frame')" + +#: ../../library/socket.rst:2414 +msgid "" +"Running an example several times with too small delay between executions, " +"could lead to this error::" +msgstr "多次运行一个示例,且每次执行之间等待时间过短,可能导致这个错误::" + +#: ../../library/socket.rst:2417 +msgid "OSError: [Errno 98] Address already in use" +msgstr "OSError: [Errno 98] Address already in use" + +#: ../../library/socket.rst:2419 +msgid "" +"This is because the previous execution has left the socket in a " +"``TIME_WAIT`` state, and can't be immediately reused." +msgstr "这是因为前一次运行使套接字处于 ``TIME_WAIT`` 状态,无法立即重用。" + +#: ../../library/socket.rst:2422 +msgid "" +"There is a :mod:`!socket` flag to set, in order to prevent this, " +":const:`socket.SO_REUSEADDR`::" +msgstr "要防止这种情况,可以设置 :mod:`!socket` 旗标 :const:`socket.SO_REUSEADDR`::" + +#: ../../library/socket.rst:2425 +msgid "" +"s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n" +"s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)\n" +"s.bind((HOST, PORT))" +msgstr "" +"s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n" +"s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)\n" +"s.bind((HOST, PORT))" + +#: ../../library/socket.rst:2429 +msgid "" +"the :data:`SO_REUSEADDR` flag tells the kernel to reuse a local socket in " +"``TIME_WAIT`` state, without waiting for its natural timeout to expire." +msgstr "" +":data:`SO_REUSEADDR` 标志告诉内核将处于 ``TIME_WAIT`` 状态的本地套接字重新使用,而不必等到固有的超时到期。" + +#: ../../library/socket.rst:2435 +msgid "" +"For an introduction to socket programming (in C), see the following papers:" +msgstr "关于套接字编程(C 语言)的介绍,请参阅以下文章:" + +#: ../../library/socket.rst:2437 +msgid "" +"*An Introductory 4.3BSD Interprocess Communication Tutorial*, by Stuart " +"Sechrest" +msgstr "" +"*An Introductory 4.3BSD Interprocess Communication Tutorial*,作者 Stuart " +"Sechrest" + +#: ../../library/socket.rst:2439 +msgid "" +"*An Advanced 4.3BSD Interprocess Communication Tutorial*, by Samuel J. " +"Leffler et al," +msgstr "" +"*An Advanced 4.3BSD Interprocess Communication Tutorial*,作者 Samuel J. " +"Leffler et al," + +#: ../../library/socket.rst:2442 +msgid "" +"both in the UNIX Programmer's Manual, Supplementary Documents 1 (sections " +"PS1:7 and PS1:8). The platform-specific reference material for the various " +"socket-related system calls are also a valuable source of information on the" +" details of socket semantics. For Unix, refer to the manual pages; for " +"Windows, see the WinSock (or Winsock 2) specification. For IPv6-ready APIs," +" readers may want to refer to :rfc:`3493` titled Basic Socket Interface " +"Extensions for IPv6." +msgstr "" +"两篇文章都在 UNIX 开发者手册,补充文档 1(第 PS1:7 和 PS1:8 " +"节)中。那些特定于平台的参考资料,它们包含与套接字有关的各种系统调用,也是套接字语义细节的宝贵信息来源。对于 Unix,请参考手册页。对于 " +"Windows,请参阅 WinSock(或 Winsock 2)规范。如果需要支持 IPv6 的 API,读者可能希望参考 " +":rfc:`3493`,标题为 Basic Socket Interface Extensions for IPv6。" + +#: ../../library/socket.rst:22 +msgid "object" +msgstr "object -- 对象" + +#: ../../library/socket.rst:22 +msgid "socket" +msgstr "socket" + +#: ../../library/socket.rst:1742 +msgid "I/O control" +msgstr "I/O 控制" + +#: ../../library/socket.rst:1742 +msgid "buffering" +msgstr "缓冲" + +#: ../../library/socket.rst:2092 +msgid "module" +msgstr "module" + +#: ../../library/socket.rst:2092 +msgid "struct" +msgstr "struct" diff --git a/library/socketserver.po b/library/socketserver.po new file mode 100644 index 0000000000..708be2066d --- /dev/null +++ b/library/socketserver.po @@ -0,0 +1,1103 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/socketserver.rst:2 +msgid ":mod:`!socketserver` --- A framework for network servers" +msgstr ":mod:`!socketserver` --- 用于网络服务器的框架" + +#: ../../library/socketserver.rst:7 +msgid "**Source code:** :source:`Lib/socketserver.py`" +msgstr "**源代码:** :source:`Lib/socketserver.py`" + +#: ../../library/socketserver.rst:11 +msgid "" +"The :mod:`!socketserver` module simplifies the task of writing network " +"servers." +msgstr ":mod:`!socketserver` 模块简化了编写网络服务器的任务。" + +#: ../../includes/wasm-notavail.rst:3 +msgid "Availability" +msgstr "可用性" + +#: ../../includes/wasm-notavail.rst:5 +msgid "" +"This module does not work or is not available on WebAssembly. See " +":ref:`wasm-availability` for more information." +msgstr "此模块在 WebAssembly 平台上无效或不可用。请参阅 :ref:`wasm-availability` 了解详情。" + +#: ../../library/socketserver.rst:15 +msgid "There are four basic concrete server classes:" +msgstr "该模块具有四个基础实体服务器类:" + +#: ../../library/socketserver.rst:20 +msgid "" +"This uses the internet TCP protocol, which provides for continuous streams " +"of data between the client and server. If *bind_and_activate* is true, the " +"constructor automatically attempts to invoke :meth:`~BaseServer.server_bind`" +" and :meth:`~BaseServer.server_activate`. The other parameters are passed " +"to the :class:`BaseServer` base class." +msgstr "" +"该类使用互联网 TCP 协议,它可以提供客户端与服务器之间的连续数据流。如果 *bind_and_activate* 为真值,该类的构造器会自动尝试调用" +" :meth:`~BaseServer.server_bind` 和 " +":meth:`~BaseServer.server_activate`。其他形参会被传递给 :class:`BaseServer` 基类。" + +#: ../../library/socketserver.rst:30 +msgid "" +"This uses datagrams, which are discrete packets of information that may " +"arrive out of order or be lost while in transit. The parameters are the " +"same as for :class:`TCPServer`." +msgstr "该类使用数据包,即一系列离散的信息分包,它们可能会无序地到达或在传输中丢失。该类的形参与 :class:`TCPServer` 的相同。" + +#: ../../library/socketserver.rst:38 +msgid "" +"These more infrequently used classes are similar to the TCP and UDP classes," +" but use Unix domain sockets; they're not available on non-Unix platforms. " +"The parameters are the same as for :class:`TCPServer`." +msgstr "" +"这两个不太常用的类与 TCP 和 UDP 类相似,但使用 Unix 域套接字;它们在非 Unix 系统平台上不可用。它们的形参与 " +":class:`TCPServer` 的相同。" + +#: ../../library/socketserver.rst:44 +msgid "" +"These four classes process requests :dfn:`synchronously`; each request must " +"be completed before the next request can be started. This isn't suitable if" +" each request takes a long time to complete, because it requires a lot of " +"computation, or because it returns a lot of data which the client is slow to" +" process. The solution is to create a separate process or thread to handle " +"each request; the :class:`ForkingMixIn` and :class:`ThreadingMixIn` mix-in " +"classes can be used to support asynchronous behaviour." +msgstr "" +"这四个类会 :dfn:`同步地` 处理请求;每个请求必须完成才能开始下一个请求。 " +"这就不适用于每个请求要耗费很长时间来完成的情况,或者因为它需要大量的计算,又或者它返回了大量的数据而客户端处理起来很缓慢。 " +"解决方案是创建单独的进程或线程来处理每个请求;:class:`ForkingMixIn` 和 :class:`ThreadingMixIn` " +"混合类可以被用于支持异步行为。" + +#: ../../library/socketserver.rst:52 +msgid "" +"Creating a server requires several steps. First, you must create a request " +"handler class by subclassing the :class:`BaseRequestHandler` class and " +"overriding its :meth:`~BaseRequestHandler.handle` method; this method will " +"process incoming requests. Second, you must instantiate one of the server " +"classes, passing it the server's address and the request handler class. It " +"is recommended to use the server in a :keyword:`with` statement. Then call " +"the :meth:`~BaseServer.handle_request` or :meth:`~BaseServer.serve_forever` " +"method of the server object to process one or many requests. Finally, call " +":meth:`~BaseServer.server_close` to close the socket (unless you used a " +":keyword:`!with` statement)." +msgstr "" +"创建一个服务器需要分几个步骤进行。首先,你必须通过子类化 :class:`BaseRequestHandler` 类并重载其 " +":meth:`~BaseRequestHandler.handle` 方法来创建一个请求处理器类;这个方法将处理传入的请求。 " +"其次,你必须实例化某个服务器类,将服务器地址和请求处理器类传给它。建议在 :keyword:`with` 语句中使用该服务器。然后再调用服务器对象的 " +":meth:`~BaseServer.handle_request` 或 :meth:`~BaseServer.serve_forever` " +"方法来处理一个或多个请求。最后,调用 :meth:`~BaseServer.server_close` 来关闭套接字(除非你使用了 " +":keyword:`!with` 语句)。" + +#: ../../library/socketserver.rst:64 +msgid "" +"When inheriting from :class:`ThreadingMixIn` for threaded connection " +"behavior, you should explicitly declare how you want your threads to behave " +"on an abrupt shutdown. The :class:`ThreadingMixIn` class defines an " +"attribute *daemon_threads*, which indicates whether or not the server should" +" wait for thread termination. You should set the flag explicitly if you " +"would like threads to behave autonomously; the default is :const:`False`, " +"meaning that Python will not exit until all threads created by " +":class:`ThreadingMixIn` have exited." +msgstr "" +"当从 :class:`ThreadingMixIn` 继承线程连接行为时,你应当显式地声明你希望在突然关机时你的线程采取何种行为。 " +":class:`ThreadingMixIn` 类定义了一个属性 *daemon_threads*,它指明服务器是否应当等待线程终止。 " +"如果你希望线程能自主行动你应当显式地设置这个旗标;默认值为 :const:`False`,表示 Python 将不会在 " +":class:`ThreadingMixIn` 所创建的所有线程都退出之前退出。" + +#: ../../library/socketserver.rst:73 +msgid "" +"Server classes have the same external methods and attributes, no matter what" +" network protocol they use." +msgstr "服务器类具有同样的外部方法和属性,无论它们使用哪种网络协议。" + +#: ../../library/socketserver.rst:78 +msgid "Server Creation Notes" +msgstr "服务器创建的说明" + +#: ../../library/socketserver.rst:80 +msgid "" +"There are five classes in an inheritance diagram, four of which represent " +"synchronous servers of four types::" +msgstr "在继承图中有五个类,其中四个代表四种类型的同步服务器::" + +#: ../../library/socketserver.rst:83 +msgid "" +"+------------+\n" +"| BaseServer |\n" +"+------------+\n" +" |\n" +" v\n" +"+-----------+ +------------------+\n" +"| TCPServer |------->| UnixStreamServer |\n" +"+-----------+ +------------------+\n" +" |\n" +" v\n" +"+-----------+ +--------------------+\n" +"| UDPServer |------->| UnixDatagramServer |\n" +"+-----------+ +--------------------+" +msgstr "" +"+------------+\n" +"| BaseServer |\n" +"+------------+\n" +" |\n" +" v\n" +"+-----------+ +------------------+\n" +"| TCPServer |------->| UnixStreamServer |\n" +"+-----------+ +------------------+\n" +" |\n" +" v\n" +"+-----------+ +--------------------+\n" +"| UDPServer |------->| UnixDatagramServer |\n" +"+-----------+ +--------------------+" + +#: ../../library/socketserver.rst:97 +msgid "" +"Note that :class:`UnixDatagramServer` derives from :class:`UDPServer`, not " +"from :class:`UnixStreamServer` --- the only difference between an IP and a " +"Unix server is the address family." +msgstr "" +"请注意 :class:`UnixDatagramServer` 是派生自 :class:`UDPServer`,而不是派生自 " +":class:`UnixStreamServer` --- IP 和 Unix 服务器的唯一区别是地址族。" + +#: ../../library/socketserver.rst:105 +msgid "" +"Forking and threading versions of each type of server can be created using " +"these mix-in classes. For instance, :class:`ThreadingUDPServer` is created " +"as follows::" +msgstr "每种服务器类型的分叉和线程版本都可以使用这些混合类来创建。例如,:class:`ThreadingUDPServer` 的创建方式如下::" + +#: ../../library/socketserver.rst:109 +msgid "" +"class ThreadingUDPServer(ThreadingMixIn, UDPServer):\n" +" pass" +msgstr "" +"class ThreadingUDPServer(ThreadingMixIn, UDPServer):\n" +" pass" + +#: ../../library/socketserver.rst:112 +msgid "" +"The mix-in class comes first, since it overrides a method defined in " +":class:`UDPServer`. Setting the various attributes also changes the " +"behavior of the underlying server mechanism." +msgstr "混合类先出现,因为它重载了 :class:`UDPServer` 中定义的一个方法。设置各种属性也会改变下层服务器机制的行为。" + +#: ../../library/socketserver.rst:116 +msgid "" +":class:`ForkingMixIn` and the Forking classes mentioned below are only " +"available on POSIX platforms that support :func:`~os.fork`." +msgstr ":class:`ForkingMixIn` 和下文提及的分叉类仅在支持 :func:`~os.fork` 的 POSIX 系统平台上可用。" + +#: ../../library/socketserver.rst:121 +msgid "" +":meth:`ForkingMixIn.server_close ` waits until all " +"child processes complete, except if :attr:`block_on_close` attribute is " +"``False``." +msgstr "" +":meth:`ForkingMixIn.server_close ` 会等待直到所有子进程完成,除非 " +":attr:`block_on_close` 属性为 ``False``。" + +#: ../../library/socketserver.rst:125 +msgid "" +":meth:`ThreadingMixIn.server_close ` waits until " +"all non-daemon threads complete, except if :attr:`block_on_close` attribute " +"is ``False``." +msgstr "" +":meth:`ThreadingMixIn.server_close ` " +"会等待直到所有非守护线程完成,除非 :attr:`block_on_close` 属性为 ``False``。" + +#: ../../library/socketserver.rst:131 +msgid "" +"Specify how many child processes will exist to handle requests at a time for" +" :class:`ForkingMixIn`. If the limit is reached, new requests will wait " +"until one child process has finished." +msgstr "指定将有多少子进程为 :class:`ForkingMixIn` 同时处理请求。如果达到此限制,新请求将等待直到某个子进程结束。" + +#: ../../library/socketserver.rst:137 +msgid "" +"For :class:`ThreadingMixIn` use daemonic threads by setting " +":data:`ThreadingMixIn.daemon_threads ` to ``True`` to not " +"wait until threads complete." +msgstr "" +"对于 :class:`ThreadingMixIn` 可通过将 :data:`ThreadingMixIn.daemon_threads " +"` 设为 ``True`` 来使用守护线程从而无需等待线程完成。" + +#: ../../library/socketserver.rst:143 +msgid "" +":meth:`ForkingMixIn.server_close ` and " +":meth:`ThreadingMixIn.server_close ` now waits " +"until all child processes and non-daemonic threads complete. Add a new " +":attr:`ForkingMixIn.block_on_close ` class attribute to opt-" +"in for the pre-3.7 behaviour." +msgstr "" +":meth:`ForkingMixIn.server_close ` 和 " +":meth:`ThreadingMixIn.server_close ` " +"现在会等待直到所有子进程和非守护线程完成。新增了一个 :attr:`ForkingMixIn.block_on_close " +"` 类属性用来选择 3.7 版之前的行为。" + +#: ../../library/socketserver.rst:159 +msgid "These classes are pre-defined using the mix-in classes." +msgstr "这些类都是使用混合类来预定义的。" + +#: ../../library/socketserver.rst:161 +msgid "" +"The ``ForkingUnixStreamServer`` and ``ForkingUnixDatagramServer`` classes " +"were added." +msgstr "增加了 ``ForkingUnixStreamServer`` 和 ``ForkingUnixDatagramServer`` 类。" + +#: ../../library/socketserver.rst:165 +msgid "" +"To implement a service, you must derive a class from " +":class:`BaseRequestHandler` and redefine its " +":meth:`~BaseRequestHandler.handle` method. You can then run various versions" +" of the service by combining one of the server classes with your request " +"handler class. The request handler class must be different for datagram or " +"stream services. This can be hidden by using the handler subclasses " +":class:`StreamRequestHandler` or :class:`DatagramRequestHandler`." +msgstr "" +"要实现一个服务,你必须从 :class:`BaseRequestHandler` 派生一个类并重定义其 " +":meth:`~BaseRequestHandler.handle` 方法。然后你可以通过组合某种服务器类型与你的请求处理器类来运行各种版本的服务。 " +"请求处理器类对于数据报和流服务必须是不相同的。这可以通过使用处理器子类 :class:`StreamRequestHandler` 或 " +":class:`DatagramRequestHandler` 来隐藏。" + +#: ../../library/socketserver.rst:173 +msgid "" +"Of course, you still have to use your head! For instance, it makes no sense" +" to use a forking server if the service contains state in memory that can be" +" modified by different requests, since the modifications in the child " +"process would never reach the initial state kept in the parent process and " +"passed to each child. In this case, you can use a threading server, but you" +" will probably have to use locks to protect the integrity of the shared " +"data." +msgstr "" +"当然,你仍然需要动点脑筋! " +"举例来说,如果服务包含可能被不同请求所修改的内存状态则使用分叉服务器是没有意义的,因为在子进程中的修改将永远不会触及保存在父进程中的初始状态并传递到各个子进程。" +" 在这种情况下,你可以使用线程服务器,但你可能必须使用锁来保护共享数据的一致性。" + +#: ../../library/socketserver.rst:180 +msgid "" +"On the other hand, if you are building an HTTP server where all data is " +"stored externally (for instance, in the file system), a synchronous class " +"will essentially render the service \"deaf\" while one request is being " +"handled -- which may be for a very long time if a client is slow to receive " +"all the data it has requested. Here a threading or forking server is " +"appropriate." +msgstr "" +"另一方面,如果你是在编写一个所有数据保存在外部(例如文件系统)的 HTTP 服务器,同步类实际上将在正在处理某个请求的时候“失聪” -- " +"如果某个客户端在接收它所请求的所有数据时很缓慢这可能会是非常长的时间。这时线程或分叉服务器会更为适用。" + +#: ../../library/socketserver.rst:186 +msgid "" +"In some cases, it may be appropriate to process part of a request " +"synchronously, but to finish processing in a forked child depending on the " +"request data. This can be implemented by using a synchronous server and " +"doing an explicit fork in the request handler class " +":meth:`~BaseRequestHandler.handle` method." +msgstr "" +"在某些情况下,合适的做法是同步地处理请求的一部分,但根据请求数据在分叉的子进程中完成处理。这可以通过使用一个同步服务器并在请求处理器类 " +":meth:`~BaseRequestHandler.handle` 中进行显式分叉来实现。" + +#: ../../library/socketserver.rst:191 +msgid "" +"Another approach to handling multiple simultaneous requests in an " +"environment that supports neither threads nor :func:`~os.fork` (or where " +"these are too expensive or inappropriate for the service) is to maintain an " +"explicit table of partially finished requests and to use :mod:`selectors` to" +" decide which request to work on next (or whether to handle a new incoming " +"request). This is particularly important for stream services where each " +"client can potentially be connected for a long time (if threads or " +"subprocesses cannot be used)." +msgstr "" +"另一种可以在既不支持线程也不支持 :func:`~os.fork` " +"的环境(或者对于本服务来说这两者开销过大或不适用)中处理多个同时请求的方式是维护一个显式的部分完成的请求表并使用 :mod:`selectors` " +"来决定接下来要处理哪个请求(或者是否要处理一个新传入的请求)。 " +"这对于流式服务来说特别重要,因为每个客户端可能会连接很长的时间(如果不能使用线程或子进程)。" + +#: ../../library/socketserver.rst:204 +msgid "Server Objects" +msgstr "Server 对象" + +#: ../../library/socketserver.rst:208 +msgid "" +"This is the superclass of all Server objects in the module. It defines the " +"interface, given below, but does not implement most of the methods, which is" +" done in subclasses. The two parameters are stored in the respective " +":attr:`server_address` and :attr:`RequestHandlerClass` attributes." +msgstr "" +"这是本模块中所有 Server 对象的超类。它定义了下文给出的接口,但没有实现大部分的方法,它们应在子类中实现。两个形参存储在对应的 " +":attr:`server_address` 和 :attr:`RequestHandlerClass` 属性中。" + +#: ../../library/socketserver.rst:216 +msgid "" +"Return an integer file descriptor for the socket on which the server is " +"listening. This function is most commonly passed to :mod:`selectors`, to " +"allow monitoring multiple servers in the same process." +msgstr "" +"返回服务器正在监听的套接字的以整数表示的文件描述符。此函数最常被传递给 :mod:`selectors`,以允许在同一进程中监控多个服务器。" + +#: ../../library/socketserver.rst:223 +msgid "" +"Process a single request. This function calls the following methods in " +"order: :meth:`get_request`, :meth:`verify_request`, and " +":meth:`process_request`. If the user-provided " +":meth:`~BaseRequestHandler.handle` method of the handler class raises an " +"exception, the server's :meth:`handle_error` method will be called. If no " +"request is received within :attr:`timeout` seconds, :meth:`handle_timeout` " +"will be called and :meth:`handle_request` will return." +msgstr "" +"处理单个请求。此函数会依次调用下列方法::meth:`get_request`, :meth:`verify_request` 和 " +":meth:`process_request`。如果用户提供的处理器类的 :meth:`~BaseRequestHandler.handle` " +"方法引发了异常,则将调用服务器的 :meth:`handle_error` 方法。如果在 :attr:`timeout` 秒内未接收到请求,将会调用 " +":meth:`handle_timeout` 且 :meth:`handle_request` 将返回。" + +#: ../../library/socketserver.rst:235 +msgid "" +"Handle requests until an explicit :meth:`shutdown` request. Poll for " +"shutdown every *poll_interval* seconds. Ignores the :attr:`timeout` " +"attribute. It also calls :meth:`service_actions`, which may be used by a " +"subclass or mixin to provide actions specific to a given service. For " +"example, the :class:`ForkingMixIn` class uses :meth:`service_actions` to " +"clean up zombie child processes." +msgstr "" +"对请求进行处理直至收到显式的 :meth:`shutdown` 请求。每隔 *poll_interval* 秒对 shutdown 进行轮询。忽略 " +":attr:`timeout` 属性。它还会调用 :meth:`service_actions`,这可被子类或混合类用来提供某个给定服务的专属操作。 " +"例如,:class:`ForkingMixIn` 类使用 :meth:`service_actions` 来清理僵尸子进程。" + +#: ../../library/socketserver.rst:243 +msgid "Added ``service_actions`` call to the ``serve_forever`` method." +msgstr "将 ``service_actions`` 调用添加到 ``serve_forever`` 方法。" + +#: ../../library/socketserver.rst:249 +msgid "" +"This is called in the :meth:`serve_forever` loop. This method can be " +"overridden by subclasses or mixin classes to perform actions specific to a " +"given service, such as cleanup actions." +msgstr "" +"此方法会在 :meth:`serve_forever` 循环中被调用。此方法可被子类或混合类所重载以执行某个给定服务的专属操作,例如清理操作。" + +#: ../../library/socketserver.rst:257 +msgid "" +"Tell the :meth:`serve_forever` loop to stop and wait until it does. " +":meth:`shutdown` must be called while :meth:`serve_forever` is running in a " +"different thread otherwise it will deadlock." +msgstr "" +"通知 :meth:`serve_forever` 循环停止并等待它完成。 :meth:`shutdown` 必须在 " +":meth:`serve_forever` 运行于不同线程时被调用否则它将发生死锁。" + +#: ../../library/socketserver.rst:264 +msgid "Clean up the server. May be overridden." +msgstr "清理服务器。此方法可被重载。" + +#: ../../library/socketserver.rst:269 +msgid "" +"The family of protocols to which the server's socket belongs. Common " +"examples are :const:`socket.AF_INET`, :const:`socket.AF_INET6`, and " +":const:`socket.AF_UNIX`. Subclass the TCP or UDP server classes in this " +"module with class attribute ``address_family = AF_INET6`` set if you want " +"IPv6 server classes." +msgstr "" +"服务器套接字所属的协议族。常见的例子有 :const:`socket.AF_INET`, :const:`socket.AF_INET6` 和 " +":const:`socket.AF_UNIX` 等。如果你想要 IPv6 服务器类请子类化此模块中的 TCP 或 UDP 服务器类并设置类属性 " +"``address_family = AF_INET6``." + +#: ../../library/socketserver.rst:278 +msgid "" +"The user-provided request handler class; an instance of this class is " +"created for each request." +msgstr "用户提供的请求处理器类;将为每个请求创建该类的实例。" + +#: ../../library/socketserver.rst:284 +msgid "" +"The address on which the server is listening. The format of addresses " +"varies depending on the protocol family; see the documentation for the " +":mod:`socket` module for details. For internet protocols, this is a tuple " +"containing a string giving the address, and an integer port number: " +"``('127.0.0.1', 80)``, for example." +msgstr "" +"服务器所监听的地址。地址的格式因具体协议族而不同;请参阅 :mod:`socket` 模块的文档了解详情。 " +"对于互联网协议,这将是一个元组,其中包含一个表示地址的字符串,和一个表示端口号的整数,例如: ``('127.0.0.1', 80)``。" + +#: ../../library/socketserver.rst:293 +msgid "" +"The socket object on which the server will listen for incoming requests." +msgstr "将由服务器用于监听入站请求的套接字对象。" + +#: ../../library/socketserver.rst:296 +msgid "The server classes support the following class variables:" +msgstr "服务器类支持下列类变量:" + +#: ../../library/socketserver.rst:302 +msgid "" +"Whether the server will allow the reuse of an address. This defaults to " +":const:`False`, and can be set in subclasses to change the policy." +msgstr "服务器是否要允许地址的重用。默认值为 :const:`False`,并可在子类中设置以改变策略。" + +#: ../../library/socketserver.rst:308 +msgid "" +"The size of the request queue. If it takes a long time to process a single " +"request, any requests that arrive while the server is busy are placed into a" +" queue, up to :attr:`request_queue_size` requests. Once the queue is full, " +"further requests from clients will get a \"Connection denied\" error. The " +"default value is usually 5, but this can be overridden by subclasses." +msgstr "" +"请求队列的长度。如果处理单个请求要花费很长的时间,则当服务器正忙时到达的任何请求都会被加入队列,最多加入 " +":attr:`request_queue_size` 个请求。一旦队列被加满,来自客户端的更多请求将收到 \\错误。默认值为 5,但可在子类中重载。" + +#: ../../library/socketserver.rst:317 +msgid "" +"The type of socket used by the server; :const:`socket.SOCK_STREAM` and " +":const:`socket.SOCK_DGRAM` are two common values." +msgstr "" +"服务器使用的套接字类型;常见的有 :const:`socket.SOCK_STREAM` 和 :const:`socket.SOCK_DGRAM` " +"这两个值。" + +#: ../../library/socketserver.rst:323 +msgid "" +"Timeout duration, measured in seconds, or :const:`None` if no timeout is " +"desired. If :meth:`handle_request` receives no incoming requests within the" +" timeout period, the :meth:`handle_timeout` method is called." +msgstr "" +"超时限制,以秒数表示,或者如果不限制超时则为 :const:`None`。如果 :meth:`handle_request` " +"在超时限制期间没有收到传入请求,则会调用 :meth:`handle_timeout` 方法。" + +#: ../../library/socketserver.rst:328 +msgid "" +"There are various server methods that can be overridden by subclasses of " +"base server classes like :class:`TCPServer`; these methods aren't useful to " +"external users of the server object." +msgstr "有多个服务器方法可被服务器基类的子类例如 :class:`TCPServer` 所重载;这些方法对服务器对象的外部用户来说并无用处。" + +#: ../../library/socketserver.rst:337 +msgid "" +"Actually processes the request by instantiating :attr:`RequestHandlerClass` " +"and calling its :meth:`~BaseRequestHandler.handle` method." +msgstr "" +"通过实例化 :attr:`RequestHandlerClass` 并调用其 :meth:`~BaseRequestHandler.handle` " +"方法来实际处理请求。" + +#: ../../library/socketserver.rst:343 +msgid "" +"Must accept a request from the socket, and return a 2-tuple containing the " +"*new* socket object to be used to communicate with the client, and the " +"client's address." +msgstr "必须接受来自套接字的请求,并返回一个 2 元组,其中包含用来与客户端通信的 *新的* 套接字对象,以及客户端的地址。" + +#: ../../library/socketserver.rst:350 +msgid "" +"This function is called if the :meth:`~BaseRequestHandler.handle` method of " +"a :attr:`RequestHandlerClass` instance raises an exception. The default " +"action is to print the traceback to standard error and continue handling " +"further requests." +msgstr "" +"此函数会在 :attr:`RequestHandlerClass` 实例的 :meth:`~BaseRequestHandler.handle` " +"方法引发异常时被调用。默认行为是将回溯信息打印到标准错误并继续处理其他请求。" + +#: ../../library/socketserver.rst:355 +msgid "" +"Now only called for exceptions derived from the :exc:`Exception` class." +msgstr "现在只针对派生自 :exc:`Exception` 类的异常调用此方法。" + +#: ../../library/socketserver.rst:362 +msgid "" +"This function is called when the :attr:`timeout` attribute has been set to a" +" value other than :const:`None` and the timeout period has passed with no " +"requests being received. The default action for forking servers is to " +"collect the status of any child processes that have exited, while in " +"threading servers this method does nothing." +msgstr "" +"此函数会在 :attr:`timeout` 属性被设为 :const:`None` 以外的值并且在超出时限之后仍未收到请求时被调用。 " +"分叉服务器的默认行为是收集任何已退出的子进程状态,而在线程服务器中此方法则不做任何操作。" + +#: ../../library/socketserver.rst:371 +msgid "" +"Calls :meth:`finish_request` to create an instance of the " +":attr:`RequestHandlerClass`. If desired, this function can create a new " +"process or thread to handle the request; the :class:`ForkingMixIn` and " +":class:`ThreadingMixIn` classes do this." +msgstr "" +"调用 :meth:`finish_request` 来创建 :attr:`RequestHandlerClass` 的实例。 " +"如果需要,此函数可创建一个新的进程或线程来处理请求;:class:`ForkingMixIn` 和 :class:`ThreadingMixIn` " +"类能完成此任务。" + +#: ../../library/socketserver.rst:383 +msgid "" +"Called by the server's constructor to activate the server. The default " +"behavior for a TCP server just invokes :meth:`~socket.socket.listen` on the " +"server's socket. May be overridden." +msgstr "" +"由服务器的构造器调用以激活服务器。TCP 服务器的默认行为只是在服务器的套接字上调用 :meth:`~socket.socket.listen`。 " +"可以被重载。" + +#: ../../library/socketserver.rst:390 +msgid "" +"Called by the server's constructor to bind the socket to the desired " +"address. May be overridden." +msgstr "由服务器的构造器调用以将套接字绑定到所需的地址。可以被重载。" + +#: ../../library/socketserver.rst:396 +msgid "" +"Must return a Boolean value; if the value is :const:`True`, the request will" +" be processed, and if it's :const:`False`, the request will be denied. This" +" function can be overridden to implement access controls for a server. The " +"default implementation always returns :const:`True`." +msgstr "" +"必须返回一个布尔值;如果值为 :const:`True`,请求将被处理。而如果值为 :const:`False`,请求将被拒绝。 " +"此函数可被重载以实现服务器的访问控制。默认实现总是返回 :const:`True`。" + +#: ../../library/socketserver.rst:402 +msgid "" +"Support for the :term:`context manager` protocol was added. Exiting the " +"context manager is equivalent to calling :meth:`server_close`." +msgstr "" +"添加了对 :term:`context manager` 协议的支持。退出上下文管理器与调用 :meth:`server_close` 等效。" + +#: ../../library/socketserver.rst:408 +msgid "Request Handler Objects" +msgstr "请求处理器对象" + +#: ../../library/socketserver.rst:412 +msgid "" +"This is the superclass of all request handler objects. It defines the " +"interface, given below. A concrete request handler subclass must define a " +"new :meth:`handle` method, and can override any of the other methods. A new" +" instance of the subclass is created for each request." +msgstr "" +"这是所有请求处理器对象的超类。它定义了下文列出的接口。一个实体请求处理器子类必须定义新的 :meth:`handle` 方法,并可重载任何其他方法。 " +"对于每个请求都会创建一个新的子类的实例。" + +#: ../../library/socketserver.rst:421 +msgid "" +"Called before the :meth:`handle` method to perform any initialization " +"actions required. The default implementation does nothing." +msgstr "会在 :meth:`handle` 方法之前被调用以执行任何必要的初始化操作。默认实现不执行任何操作。" + +#: ../../library/socketserver.rst:427 +msgid "" +"This function must do all the work required to service a request. The " +"default implementation does nothing. Several instance attributes are " +"available to it; the request is available as :attr:`request`; the client " +"address as :attr:`client_address`; and the server instance as " +":attr:`server`, in case it needs access to per-server information." +msgstr "" +"此函数必须执行为请求提供服务所需的全部操作。默认实现不执行任何操作。它有几个可用的实例属性;请求为 :attr:`request`;客户端地址为 " +":attr:`client_address`;服务器实例为 :attr:`server`,如果它需要访问特定服务器信息的话。" + +#: ../../library/socketserver.rst:433 +msgid "" +"The type of :attr:`request` is different for datagram or stream services. " +"For stream services, :attr:`request` is a socket object; for datagram " +"services, :attr:`request` is a pair of string and socket." +msgstr "" +"针对数据报或流服务的 :attr:`request` 类型是不同的。对于流服务,:attr:`request` " +"是一个套接字对象;对于数据报服务,:attr:`request` 是一对字符串与套接字。" + +#: ../../library/socketserver.rst:440 +msgid "" +"Called after the :meth:`handle` method to perform any clean-up actions " +"required. The default implementation does nothing. If :meth:`setup` raises" +" an exception, this function will not be called." +msgstr "" +"在 :meth:`handle` 方法之后调用以执行任何需要的清理操作。默认实现不执行任何操作。如果 :meth:`setup` " +"引发了异常,此函数将不会被调用。" + +#: ../../library/socketserver.rst:447 +msgid "" +"The *new* :class:`socket.socket` object to be used to communicate with the " +"client." +msgstr "将被用于同客户端通信的 *新* :class:`socket.socket` 对象。" + +#: ../../library/socketserver.rst:453 +msgid "Client address returned by :meth:`BaseServer.get_request`." +msgstr ":meth:`BaseServer.get_request` 所返回的客户端地址。" + +#: ../../library/socketserver.rst:458 +msgid ":class:`BaseServer` object used for handling the request." +msgstr "用于处理请求的 :class:`BaseServer` 对象。" + +#: ../../library/socketserver.rst:464 +msgid "" +"These :class:`BaseRequestHandler` subclasses override the " +":meth:`~BaseRequestHandler.setup` and :meth:`~BaseRequestHandler.finish` " +"methods, and provide :attr:`rfile` and :attr:`wfile` attributes." +msgstr "" +"这些 :class:`BaseRequestHandler` 子类重载了 :meth:`~BaseRequestHandler.setup` 和 " +":meth:`~BaseRequestHandler.finish` 方法,并提供了 :attr:`rfile` 和 :attr:`wfile` 属性。" + +#: ../../library/socketserver.rst:470 +msgid "" +"A file object from which receives the request is read. Support the " +":class:`io.BufferedIOBase` readable interface." +msgstr "用于读取所接受请求的文件对象。支持 :class:`io.BufferedIOBase` 可读接口。" + +#: ../../library/socketserver.rst:475 +msgid "" +"A file object to which the reply is written. Support the " +":class:`io.BufferedIOBase` writable interface" +msgstr "用于写入所回复内容的文件对象。支持 :class:`io.BufferedIOBase` 可写接口。" + +#: ../../library/socketserver.rst:479 +msgid "" +":attr:`wfile` also supports the :class:`io.BufferedIOBase` writable " +"interface." +msgstr ":attr:`wfile` 也支持 :class:`io.BufferedIOBase` 可写接口。" + +#: ../../library/socketserver.rst:485 +msgid "Examples" +msgstr "例子" + +#: ../../library/socketserver.rst:488 +msgid ":class:`socketserver.TCPServer` Example" +msgstr ":class:`socketserver.TCPServer` 示例" + +#: ../../library/socketserver.rst:490 ../../library/socketserver.rst:601 +msgid "This is the server side::" +msgstr "以下是服务端::" + +#: ../../library/socketserver.rst:492 +msgid "" +"import socketserver\n" +"\n" +"class MyTCPHandler(socketserver.BaseRequestHandler):\n" +" \"\"\"\n" +" The request handler class for our server.\n" +"\n" +" It is instantiated once per connection to the server, and must\n" +" override the handle() method to implement communication to the\n" +" client.\n" +" \"\"\"\n" +"\n" +" def handle(self):\n" +" # self.request is the TCP socket connected to the client\n" +" pieces = [b'']\n" +" total = 0\n" +" while b'\\n' not in pieces[-1] and total < 10_000:\n" +" pieces.append(self.request.recv(2000))\n" +" total += len(pieces[-1])\n" +" self.data = b''.join(pieces)\n" +" print(f\"Received from {self.client_address[0]}:\")\n" +" print(self.data.decode(\"utf-8\"))\n" +" # just send back the same data, but upper-cased\n" +" self.request.sendall(self.data.upper())\n" +" # after we return, the socket will be closed.\n" +"\n" +"if __name__ == \"__main__\":\n" +" HOST, PORT = \"localhost\", 9999\n" +"\n" +" # Create the server, binding to localhost on port 9999\n" +" with socketserver.TCPServer((HOST, PORT), MyTCPHandler) as server:\n" +" # Activate the server; this will keep running until you\n" +" # interrupt the program with Ctrl-C\n" +" server.serve_forever()" +msgstr "" +"import socketserver\n" +"\n" +"class MyTCPHandler(socketserver.BaseRequestHandler):\n" +" \"\"\"\n" +" The request handler class for our server.\n" +"\n" +" It is instantiated once per connection to the server, and must\n" +" override the handle() method to implement communication to the\n" +" client.\n" +" \"\"\"\n" +"\n" +" def handle(self):\n" +" # self.request 是连接到客户端的 TCP 套接字\n" +" pieces = [b'']\n" +" total = 0\n" +" while b'\\n' not in pieces[-1] and total < 10_000:\n" +" pieces.append(self.request.recv(2000))\n" +" total += len(pieces[-1])\n" +" self.data = b''.join(pieces)\n" +" print(f\"Received from {self.client_address[0]}:\")\n" +" print(self.data.decode(\"utf-8\"))\n" +" # 发回同样的数据,但转为大写形式\n" +" self.request.sendall(self.data.upper())\n" +" # 在我们返回后,套接字将被关闭。\n" +"\n" +"if __name__ == \"__main__\":\n" +" HOST, PORT = \"localhost\", 9999\n" +"\n" +" # 创建服务器,绑定到 localhost 的 9999 端口\n" +" with socketserver.TCPServer((HOST, PORT), MyTCPHandler) as server:\n" +" # 激活服务器;它将持续运行直到你\n" +" # 使用 Ctrl-C 中断程序\n" +" server.serve_forever()" + +#: ../../library/socketserver.rst:526 +msgid "" +"An alternative request handler class that makes use of streams (file-like " +"objects that simplify communication by providing the standard file " +"interface)::" +msgstr "一个使用流(通过提供标准文件接口来简化通信的文件型对象)的替代请求处理器类::" + +#: ../../library/socketserver.rst:529 +msgid "" +"class MyTCPHandler(socketserver.StreamRequestHandler):\n" +"\n" +" def handle(self):\n" +" # self.rfile is a file-like object created by the handler.\n" +" # We can now use e.g. readline() instead of raw recv() calls.\n" +" # We limit ourselves to 10000 bytes to avoid abuse by the sender.\n" +" self.data = self.rfile.readline(10000).rstrip()\n" +" print(f\"{self.client_address[0]} wrote:\")\n" +" print(self.data.decode(\"utf-8\"))\n" +" # Likewise, self.wfile is a file-like object used to write back\n" +" # to the client\n" +" self.wfile.write(self.data.upper())" +msgstr "" +"class MyTCPHandler(socketserver.StreamRequestHandler):\n" +"\n" +" def handle(self):\n" +" # self.rfile 是由该处理器创建的文件型对象。\n" +" # 我们现在可以使用 readline() 代替原始 recv() 调用\n" +" # 我们自己限制为 10000 字节以避免被发送方滥用。\n" +" self.data = self.rfile.readline(10000).rstrip()\n" +" print(f\"{self.client_address[0]} wrote:\")\n" +" print(self.data.decode(\"utf-8\"))\n" +" # 类似地,self.wfile 是用于写回到客户端的\n" +" # 文件型对象\n" +" self.wfile.write(self.data.upper())" + +#: ../../library/socketserver.rst:542 +msgid "" +"The difference is that the ``readline()`` call in the second handler will " +"call ``recv()`` multiple times until it encounters a newline character, " +"while the first handler had to use a ``recv()`` loop to accumulate data " +"until a newline itself. If it had just used a single ``recv()`` without the" +" loop it would just have returned what has been received so far from the " +"client. TCP is stream based: data arrives in the order it was sent, but " +"there is no correlation between client ``send()`` or ``sendall()`` calls and" +" the number of ``recv()`` calls on the server required to receive it." +msgstr "" +"不同之处在于第二个处理器中的 ``readline()`` 调用将多次调用 ``recv()`` 直至遇到一个换行符,而第一个处理器必须使用一个 " +"``recv()`` 循环来累积数据直至遇到一个换行符。如果它只使用一个 ``recv()`` 而不带循环则将只返回当前已从客户端接收的内容。TCP " +"是基于流的:数据将按其发送顺序到达,但在客户端 ``send()`` 或 ``sendall()`` 调用和服务端需要接收它的 ``recv()`` " +"调用次数之间并没有关联。" + +#: ../../library/socketserver.rst:552 ../../library/socketserver.rst:625 +msgid "This is the client side::" +msgstr "以下是客户端::" + +#: ../../library/socketserver.rst:554 +msgid "" +"import socket\n" +"import sys\n" +"\n" +"HOST, PORT = \"localhost\", 9999\n" +"data = \" \".join(sys.argv[1:])\n" +"\n" +"# Create a socket (SOCK_STREAM means a TCP socket)\n" +"with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:\n" +" # Connect to server and send data\n" +" sock.connect((HOST, PORT))\n" +" sock.sendall(bytes(data, \"utf-8\"))\n" +" sock.sendall(b\"\\n\")\n" +"\n" +" # Receive data from the server and shut down\n" +" received = str(sock.recv(1024), \"utf-8\")\n" +"\n" +"print(\"Sent: \", data)\n" +"print(\"Received:\", received)" +msgstr "" +"import socket\n" +"import sys\n" +"\n" +"HOST, PORT = \"localhost\", 9999\n" +"data = \" \".join(sys.argv[1:])\n" +"\n" +"# 创建一个套接字 (SOCK_STREAM 表示一个 TCP 套接字)\n" +"with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:\n" +" # 连接到服务器并发送数据\n" +" sock.connect((HOST, PORT))\n" +" sock.sendall(bytes(data, \"utf-8\"))\n" +" sock.sendall(b\"\\n\")\n" +"\n" +" # 从服务器接收数据并关闭\n" +" received = str(sock.recv(1024), \"utf-8\")\n" +"\n" +"print(\"Sent: \", data)\n" +"print(\"Received:\", received)" + +#: ../../library/socketserver.rst:574 ../../library/socketserver.rst:700 +msgid "The output of the example should look something like this:" +msgstr "这个示例程序的输出应该是像这样的:" + +#: ../../library/socketserver.rst:576 +msgid "Server:" +msgstr "服务器:" + +#: ../../library/socketserver.rst:578 +msgid "" +"$ python TCPServer.py\n" +"127.0.0.1 wrote:\n" +"b'hello world with TCP'\n" +"127.0.0.1 wrote:\n" +"b'python is nice'" +msgstr "" +"$ python TCPServer.py\n" +"127.0.0.1 wrote:\n" +"b'hello world with TCP'\n" +"127.0.0.1 wrote:\n" +"b'python is nice'" + +#: ../../library/socketserver.rst:586 +msgid "Client:" +msgstr "客户端:" + +#: ../../library/socketserver.rst:588 +msgid "" +"$ python TCPClient.py hello world with TCP\n" +"Sent: hello world with TCP\n" +"Received: HELLO WORLD WITH TCP\n" +"$ python TCPClient.py python is nice\n" +"Sent: python is nice\n" +"Received: PYTHON IS NICE" +msgstr "" +"$ python TCPClient.py hello world with TCP\n" +"Sent: hello world with TCP\n" +"Received: HELLO WORLD WITH TCP\n" +"$ python TCPClient.py python is nice\n" +"Sent: python is nice\n" +"Received: PYTHON IS NICE" + +#: ../../library/socketserver.rst:599 +msgid ":class:`socketserver.UDPServer` Example" +msgstr ":class:`socketserver.UDPServer` 示例" + +#: ../../library/socketserver.rst:603 +msgid "" +"import socketserver\n" +"\n" +"class MyUDPHandler(socketserver.BaseRequestHandler):\n" +" \"\"\"\n" +" This class works similar to the TCP handler class, except that\n" +" self.request consists of a pair of data and client socket, and since\n" +" there is no connection the client address must be given explicitly\n" +" when sending data back via sendto().\n" +" \"\"\"\n" +"\n" +" def handle(self):\n" +" data = self.request[0].strip()\n" +" socket = self.request[1]\n" +" print(f\"{self.client_address[0]} wrote:\")\n" +" print(data)\n" +" socket.sendto(data.upper(), self.client_address)\n" +"\n" +"if __name__ == \"__main__\":\n" +" HOST, PORT = \"localhost\", 9999\n" +" with socketserver.UDPServer((HOST, PORT), MyUDPHandler) as server:\n" +" server.serve_forever()" +msgstr "" +"import socketserver\n" +"\n" +"class MyUDPHandler(socketserver.BaseRequestHandler):\n" +" \"\"\"\n" +" This class works similar to the TCP handler class, except that\n" +" self.request consists of a pair of data and client socket, and since\n" +" there is no connection the client address must be given explicitly\n" +" when sending data back via sendto().\n" +" \"\"\"\n" +"\n" +" def handle(self):\n" +" data = self.request[0].strip()\n" +" socket = self.request[1]\n" +" print(f\"{self.client_address[0]} wrote:\")\n" +" print(data)\n" +" socket.sendto(data.upper(), self.client_address)\n" +"\n" +"if __name__ == \"__main__\":\n" +" HOST, PORT = \"localhost\", 9999\n" +" with socketserver.UDPServer((HOST, PORT), MyUDPHandler) as server:\n" +" server.serve_forever()" + +#: ../../library/socketserver.rst:627 +msgid "" +"import socket\n" +"import sys\n" +"\n" +"HOST, PORT = \"localhost\", 9999\n" +"data = \" \".join(sys.argv[1:])\n" +"\n" +"# SOCK_DGRAM is the socket type to use for UDP sockets\n" +"sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)\n" +"\n" +"# As you can see, there is no connect() call; UDP has no connections.\n" +"# Instead, data is directly sent to the recipient via sendto().\n" +"sock.sendto(bytes(data + \"\\n\", \"utf-8\"), (HOST, PORT))\n" +"received = str(sock.recv(1024), \"utf-8\")\n" +"\n" +"print(\"Sent: \", data)\n" +"print(\"Received:\", received)" +msgstr "" +"import socket\n" +"import sys\n" +"\n" +"HOST, PORT = \"localhost\", 9999\n" +"data = \" \".join(sys.argv[1:])\n" +"\n" +"# SOCK_DGRAM 是用于 UDP 套接字的套接字类型\n" +"sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)\n" +"\n" +"# 如你所见,没有 connect() 调用;UDP 没有连接。\n" +"# 数据是通过 sendto() 直接发给接收方的。\n" +"sock.sendto(bytes(data + \"\\n\", \"utf-8\"), (HOST, PORT))\n" +"received = str(sock.recv(1024), \"utf-8\")\n" +"\n" +"print(\"Sent: \", data)\n" +"print(\"Received:\", received)" + +#: ../../library/socketserver.rst:644 +msgid "" +"The output of the example should look exactly like for the TCP server " +"example." +msgstr "这个示例程序的输出应该是与 TCP 服务器示例相一致的。" + +#: ../../library/socketserver.rst:648 +msgid "Asynchronous Mixins" +msgstr "异步混合类" + +#: ../../library/socketserver.rst:650 +msgid "" +"To build asynchronous handlers, use the :class:`ThreadingMixIn` and " +":class:`ForkingMixIn` classes." +msgstr "要构建异步处理器,请使用 :class:`ThreadingMixIn` 和 :class:`ForkingMixIn` 类。" + +#: ../../library/socketserver.rst:653 +msgid "An example for the :class:`ThreadingMixIn` class::" +msgstr ":class:`ThreadingMixIn` 类的示例::" + +#: ../../library/socketserver.rst:655 +msgid "" +"import socket\n" +"import threading\n" +"import socketserver\n" +"\n" +"class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):\n" +"\n" +" def handle(self):\n" +" data = str(self.request.recv(1024), 'ascii')\n" +" cur_thread = threading.current_thread()\n" +" response = bytes(\"{}: {}\".format(cur_thread.name, data), 'ascii')\n" +" self.request.sendall(response)\n" +"\n" +"class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):\n" +" pass\n" +"\n" +"def client(ip, port, message):\n" +" with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:\n" +" sock.connect((ip, port))\n" +" sock.sendall(bytes(message, 'ascii'))\n" +" response = str(sock.recv(1024), 'ascii')\n" +" print(\"Received: {}\".format(response))\n" +"\n" +"if __name__ == \"__main__\":\n" +" # Port 0 means to select an arbitrary unused port\n" +" HOST, PORT = \"localhost\", 0\n" +"\n" +" server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)\n" +" with server:\n" +" ip, port = server.server_address\n" +"\n" +" # Start a thread with the server -- that thread will then start one\n" +" # more thread for each request\n" +" server_thread = threading.Thread(target=server.serve_forever)\n" +" # Exit the server thread when the main thread terminates\n" +" server_thread.daemon = True\n" +" server_thread.start()\n" +" print(\"Server loop running in thread:\", server_thread.name)\n" +"\n" +" client(ip, port, \"Hello World 1\")\n" +" client(ip, port, \"Hello World 2\")\n" +" client(ip, port, \"Hello World 3\")\n" +"\n" +" server.shutdown()" +msgstr "" +"import socket\n" +"import threading\n" +"import socketserver\n" +"\n" +"class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):\n" +"\n" +" def handle(self):\n" +" data = str(self.request.recv(1024), 'ascii')\n" +" cur_thread = threading.current_thread()\n" +" response = bytes(\"{}: {}\".format(cur_thread.name, data), 'ascii')\n" +" self.request.sendall(response)\n" +"\n" +"class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):\n" +" pass\n" +"\n" +"def client(ip, port, message):\n" +" with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:\n" +" sock.connect((ip, port))\n" +" sock.sendall(bytes(message, 'ascii'))\n" +" response = str(sock.recv(1024), 'ascii')\n" +" print(\"Received: {}\".format(response))\n" +"\n" +"if __name__ == \"__main__\":\n" +" # 端口 0 表示选择任意一个未使用的端口\n" +" HOST, PORT = \"localhost\", 0\n" +"\n" +" server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)\n" +" with server:\n" +" ip, port = server.server_address\n" +"\n" +" # 启动一个服务器线程 -- 该线程将在此后\n" +" # 为每个请求再启动一个线程\n" +" server_thread = threading.Thread(target=server.serve_forever)\n" +" # 在主线程终结时退出服务器线程\n" +" server_thread.daemon = True\n" +" server_thread.start()\n" +" print(\"Server loop running in thread:\", server_thread.name)\n" +"\n" +" client(ip, port, \"Hello World 1\")\n" +" client(ip, port, \"Hello World 2\")\n" +" client(ip, port, \"Hello World 3\")\n" +"\n" +" server.shutdown()" + +#: ../../library/socketserver.rst:702 +msgid "" +"$ python ThreadedTCPServer.py\n" +"Server loop running in thread: Thread-1\n" +"Received: Thread-2: Hello World 1\n" +"Received: Thread-3: Hello World 2\n" +"Received: Thread-4: Hello World 3" +msgstr "" +"$ python ThreadedTCPServer.py\n" +"Server loop running in thread: Thread-1\n" +"Received: Thread-2: Hello World 1\n" +"Received: Thread-3: Hello World 2\n" +"Received: Thread-4: Hello World 3" + +#: ../../library/socketserver.rst:711 +msgid "" +"The :class:`ForkingMixIn` class is used in the same way, except that the " +"server will spawn a new process for each request. Available only on POSIX " +"platforms that support :func:`~os.fork`." +msgstr "" +":class:`ForkingMixIn` 类的使用方式是相同的,区别在于服务器将为每个请求产生一个新的进程。仅在支持 :func:`~os.fork`" +" 的 POSIX 系统平台上可用。" diff --git a/library/spwd.po b/library/spwd.po new file mode 100644 index 0000000000..9d0ec40240 --- /dev/null +++ b/library/spwd.po @@ -0,0 +1,49 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/spwd.rst:2 +msgid ":mod:`!spwd` --- The shadow password database" +msgstr ":mod:`!spwd` --- shadow 密码数据库" + +#: ../../library/spwd.rst:10 +msgid "" +"This module is no longer part of the Python standard library. It was " +":ref:`removed in Python 3.13 ` after being deprecated in" +" Python 3.11. The removal was decided in :pep:`594`." +msgstr "" +"此模块已不再是 Python 标准库的一部分。它在 Python 3.11 中被弃用后又在 :ref:`Python 3.13 中被移除 " +"`。移除计划是在 :pep:`594` 确定的。" + +#: ../../library/spwd.rst:14 +msgid "" +"A possible replacement is the third-party library :pypi:`python-pam`. This " +"library is not supported or maintained by the Python core team." +msgstr "可用的替代是第三方库 :pypi:`python-pam`。这个库不被 Python 核心团队所支持或维护。" + +#: ../../library/spwd.rst:17 +msgid "" +"The last version of Python that provided the :mod:`!spwd` module was `Python" +" 3.12 `_." +msgstr "" +"提供 :mod:`!spwd` 模块的最后一个 Python 版本是 `Python 3.12 " +"`_." diff --git a/library/sqlite3.po b/library/sqlite3.po new file mode 100644 index 0000000000..0603d21be1 --- /dev/null +++ b/library/sqlite3.po @@ -0,0 +1,3989 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/sqlite3.rst:2 +msgid ":mod:`!sqlite3` --- DB-API 2.0 interface for SQLite databases" +msgstr ":mod:`!sqlite3` --- SQLite 数据库的 DB-API 2.0 接口" + +#: ../../library/sqlite3.rst:7 +msgid "**Source code:** :source:`Lib/sqlite3/`" +msgstr "**源代码:** :source:`Lib/sqlite3/`" + +#: ../../library/sqlite3.rst:23 +msgid "" +"SQLite is a C library that provides a lightweight disk-based database that " +"doesn't require a separate server process and allows accessing the database " +"using a nonstandard variant of the SQL query language. Some applications can" +" use SQLite for internal data storage. It's also possible to prototype an " +"application using SQLite and then port the code to a larger database such as" +" PostgreSQL or Oracle." +msgstr "" +"SQLite 是一个 C 语言库,它可以提供一种轻量级的基于磁盘的数据库,这种数据库不需要独立的服务器进程,也允许需要使用一种非标准的 SQL " +"查询语言来访问它。一些应用程序可以使用 SQLite 作为内部数据存储。可以用它来创建一个应用程序原型,然后再迁移到更大的数据库,比如 " +"PostgreSQL 或 Oracle。" + +#: ../../library/sqlite3.rst:30 +msgid "" +"The :mod:`!sqlite3` module was written by Gerhard Häring. It provides an " +"SQL interface compliant with the DB-API 2.0 specification described by " +":pep:`249`, and requires the third-party `SQLite `_ " +"library." +msgstr "" +":mod:`!sqlite3` 模块由 Gerhard Häring 编写。它提供了 :pep:`249` 所描述的符合 DB-API 2.0 规范的 " +"SQL 接口,并需要有第三方的 `SQLite `_ 库。" + +#: ../../includes/optional-module.rst:1 +msgid "" +"This is an :term:`optional module`. If it is missing from your copy of " +"CPython, look for documentation from your distributor (that is, whoever " +"provided Python to you). If you are the distributor, see :ref:`optional-" +"module-requirements`." +msgstr "" +"这是一个 :term:`optional module`。如果它在你的 CPython 副本中缺失,请查看你的发行方(也就是说,向你提供 Python " +"的人)的文档。如果你就是发行方,请参阅 :ref:`optional-module-requirements`。" + +#: ../../library/sqlite3.rst:36 +msgid "This document includes four main sections:" +msgstr "本文档包括了四个主要部分:" + +#: ../../library/sqlite3.rst:38 +msgid ":ref:`sqlite3-tutorial` teaches how to use the :mod:`!sqlite3` module." +msgstr ":ref:`sqlite3-tutorial` 将教你如何使用 :mod:`!sqlite3` 模块。" + +#: ../../library/sqlite3.rst:39 +msgid "" +":ref:`sqlite3-reference` describes the classes and functions this module " +"defines." +msgstr ":ref:`sqlite3-reference` 描述了该模块定义的类与函数。" + +#: ../../library/sqlite3.rst:41 +msgid ":ref:`sqlite3-howtos` details how to handle specific tasks." +msgstr ":ref:`sqlite3-howtos` 详细介绍了如何处理一些特定的任务。" + +#: ../../library/sqlite3.rst:42 +msgid "" +":ref:`sqlite3-explanation` provides in-depth background on transaction " +"control." +msgstr ":ref:`sqlite3-explanation` 提供了关于事务控制(transaction control)的更深一步的背景。" + +#: ../../library/sqlite3.rst:47 +msgid "https://www.sqlite.org" +msgstr "https://www.sqlite.org" + +#: ../../library/sqlite3.rst:48 +msgid "" +"The SQLite web page; the documentation describes the syntax and the " +"available data types for the supported SQL dialect." +msgstr "SQLite 的主页;它的文档详细描述了它所支持的 SQL 方言的语法和可用的数据类型。" + +#: ../../library/sqlite3.rst:51 +msgid "https://www.w3schools.com/sql/" +msgstr "https://www.w3schools.com/sql/" + +#: ../../library/sqlite3.rst:52 +msgid "Tutorial, reference and examples for learning SQL syntax." +msgstr "学习 SQL 语法的教程、参考和例子。" + +#: ../../library/sqlite3.rst:54 +msgid ":pep:`249` - Database API Specification 2.0" +msgstr ":pep:`249` - DB-API 2.0 规范" + +#: ../../library/sqlite3.rst:55 +msgid "PEP written by Marc-André Lemburg." +msgstr "PEP 由 Marc-André Lemburg 撰写。" + +#: ../../library/sqlite3.rst:68 +msgid "Tutorial" +msgstr "教程" + +#: ../../library/sqlite3.rst:70 +msgid "" +"In this tutorial, you will create a database of Monty Python movies using " +"basic :mod:`!sqlite3` functionality. It assumes a fundamental understanding " +"of database concepts, including `cursors`_ and `transactions`_." +msgstr "" +"在本篇教程中,你将会使用 :mod:`!sqlite3` 模块的基本功能创建一个存储 Monty Python " +"的电影作品信息的数据库。本篇教程假定您在阅读前对于数据库的基本概念有所了解,例如 `cursors`_ 与 `transactions`_。" + +#: ../../library/sqlite3.rst:75 +msgid "" +"First, we need to create a new database and open a database connection to " +"allow :mod:`!sqlite3` to work with it. Call :func:`sqlite3.connect` to " +"create a connection to the database :file:`tutorial.db` in the current " +"working directory, implicitly creating it if it does not exist:" +msgstr "" +"首先,我们需要创建一个新的数据库并打开一个数据库连接以允许 :mod:`!sqlite3` 通过它来动作。调用 " +":func:`sqlite3.connect` 来创建与当前工作目录下 :file:`tutorial.db` " +"数据库的连接,如果它不存在则会隐式地创建它:" + +#: ../../library/sqlite3.rst:81 +msgid "" +"import sqlite3\n" +"con = sqlite3.connect(\"tutorial.db\")" +msgstr "" +"import sqlite3\n" +"con = sqlite3.connect(\"tutorial.db\")" + +#: ../../library/sqlite3.rst:86 +msgid "" +"The returned :class:`Connection` object ``con`` represents the connection to" +" the on-disk database." +msgstr "" +"上面的代码中,返回的 :class:`Connection` 对象 ``con`` 代表一个与在磁盘上的数据库(on-disk " +"database)的连接。" + +#: ../../library/sqlite3.rst:89 +msgid "" +"In order to execute SQL statements and fetch results from SQL queries, we " +"will need to use a database cursor. Call :meth:`con.cursor() " +"` to create the :class:`Cursor`:" +msgstr "" +"为了执行 SQL 语句并且从 SQL 查询中取得结果,我们需要使用游标 (cursor) 。在下面的代码中,我们调用函数 " +":meth:`con.cursor() ` 创建了一个游标 (:class:`Cursor`) :" + +#: ../../library/sqlite3.rst:93 +msgid "cur = con.cursor()" +msgstr "cur = con.cursor()" + +#: ../../library/sqlite3.rst:97 +msgid "" +"Now that we've got a database connection and a cursor, we can create a " +"database table ``movie`` with columns for title, release year, and review " +"score. For simplicity, we can just use column names in the table declaration" +" -- thanks to the `flexible typing`_ feature of SQLite, specifying the data " +"types is optional. Execute the ``CREATE TABLE`` statement by calling " +":meth:`cur.execute(...) `:" +msgstr "" +"通过上面的操作,我们已经得到了与数据库的连接 (connection) 与游标 (cursor) ,现在我们便可以在数据库中创建一张名为 " +"``movie`` 的表了,它包括电影名(title,在下方代码中对应“title”)、上映年份(release " +"year,在下方代码中对应“year”)以及电影评分(review " +"score,在下方代码中对应“score”)这三列。在本篇教程中,出于简洁的考虑,我们在创建表的 SQL 语句声明中只列出表头名 (column " +"names) ,而没有像一般的 SQL 语句那样同时声明数据列的对应数据类型 —— 这一点得益于 SQLite 的 `flexible typing`_" +" 特性,它使得我们在使用 SQLite 时,指明数据类型这一项工作是可选的。如下面的代码所示,我们通过调用函数 " +":meth:`cur.execute(...) ` 执行创建表格的 ``CREATE TABLE`` 语句:" + +#: ../../library/sqlite3.rst:106 +msgid "cur.execute(\"CREATE TABLE movie(title, year, score)\")" +msgstr "cur.execute(\"CREATE TABLE movie(title, year, score)\")" + +#: ../../library/sqlite3.rst:113 +msgid "" +"We can verify that the new table has been created by querying the " +"``sqlite_master`` table built-in to SQLite, which should now contain an " +"entry for the ``movie`` table definition (see `The Schema Table`_ for " +"details). Execute that query by calling :meth:`cur.execute(...) " +"`, assign the result to ``res``, and call " +":meth:`res.fetchone() ` to fetch the resulting row:" +msgstr "" +"我们可以通过查询 SQLite 内置的 ``sqlite_master`` 表以验证新表是否已经创建,本例中,此时该表应该已经包括了一条 " +"``movie`` 的表定义(更多内容请参考 `The Schema Table`_)。下面的代码将通过调用函数 " +":meth:`cur.execute(...) ` 执行查询,把结果赋给 ``res``,而后调用 " +":meth:`res.fetchone() ` 获取结果行:" + +#: ../../library/sqlite3.rst:121 +msgid "" +">>> res = cur.execute(\"SELECT name FROM sqlite_master\")\n" +">>> res.fetchone()\n" +"('movie',)" +msgstr "" +">>> res = cur.execute(\"SELECT name FROM sqlite_master\")\n" +">>> res.fetchone()\n" +"('movie',)" + +#: ../../library/sqlite3.rst:127 +msgid "" +"We can see that the table has been created, as the query returns a " +":class:`tuple` containing the table's name. If we query ``sqlite_master`` " +"for a non-existent table ``spam``, :meth:`!res.fetchone` will return " +"``None``:" +msgstr "" +"我们可以看到表已被创建,因为查询结果返回了一个包含表名的 :class:`tuple`。如果我们在 ``sqlite_master`` " +"中查询一个不存在的表 ``spam``,则 :meth:`!res.fetchone` 将返回 ``None``:" + +#: ../../library/sqlite3.rst:132 +msgid "" +">>> res = cur.execute(\"SELECT name FROM sqlite_master WHERE name='spam'\")\n" +">>> res.fetchone() is None\n" +"True" +msgstr "" +">>> res = cur.execute(\"SELECT name FROM sqlite_master WHERE name='spam'\")\n" +">>> res.fetchone() is None\n" +"True" + +#: ../../library/sqlite3.rst:138 +msgid "" +"Now, add two rows of data supplied as SQL literals by executing an " +"``INSERT`` statement, once again by calling :meth:`cur.execute(...) " +"`:" +msgstr "" +"现在,让我们再次调用 :meth:`cur.execute(...) ` 去添加由 SQL 字面量 (literals)" +" 提供的两行数据:" + +#: ../../library/sqlite3.rst:142 +msgid "" +"cur.execute(\"\"\"\n" +" INSERT INTO movie VALUES\n" +" ('Monty Python and the Holy Grail', 1975, 8.2),\n" +" ('And Now for Something Completely Different', 1971, 7.5)\n" +"\"\"\")" +msgstr "" +"cur.execute(\"\"\"\n" +" INSERT INTO movie VALUES\n" +" ('Monty Python and the Holy Grail', 1975, 8.2),\n" +" ('And Now for Something Completely Different', 1971, 7.5)\n" +"\"\"\")" + +#: ../../library/sqlite3.rst:150 +msgid "" +"The ``INSERT`` statement implicitly opens a transaction, which needs to be " +"committed before changes are saved in the database (see " +":ref:`sqlite3-controlling-transactions` for details). Call " +":meth:`con.commit() ` on the connection object to commit " +"the transaction:" +msgstr "" +"``INSERT`` 语句将隐式地创建一个事务,事务需要在将更改保存到数据库前提交 (更多细节请参考 " +":ref:`sqlite3-controlling-transactions`)。 我们通过在一个连接对象 (本例中为 ``con``) 上调用 " +":meth:`con.commit() ` 提交事务:" + +#: ../../library/sqlite3.rst:156 +msgid "con.commit()" +msgstr "con.commit()" + +#: ../../library/sqlite3.rst:160 +msgid "" +"We can verify that the data was inserted correctly by executing a ``SELECT``" +" query. Use the now-familiar :meth:`cur.execute(...) ` to " +"assign the result to ``res``, and call :meth:`res.fetchall() " +"` to return all resulting rows:" +msgstr "" +"我们可以通过执行一个 ``SELECT`` 查询以验证数据是否被正确地插入表中。下面的代码中,我们使用我们已经很熟悉的函数 " +":meth:`cur.execute(...) ` 将查询结果赋给 ``res``,而后调用 " +":meth:`res.fetchall() ` 返回所有的结果行:" + +#: ../../library/sqlite3.rst:166 +msgid "" +">>> res = cur.execute(\"SELECT score FROM movie\")\n" +">>> res.fetchall()\n" +"[(8.2,), (7.5,)]" +msgstr "" +">>> res = cur.execute(\"SELECT score FROM movie\")\n" +">>> res.fetchall()\n" +"[(8.2,), (7.5,)]" + +#: ../../library/sqlite3.rst:172 +msgid "" +"The result is a :class:`list` of two :class:`!tuple`\\s, one per row, each " +"containing that row's ``score`` value." +msgstr "" +"上面的代码中,结果是一个包含了两个元组 (:class:`!tuple`) 的列表 (:class:`list`) " +",其中每一个元组代表一个数据行,每个数据行都包括该行的 ``score`` 值。" + +#: ../../library/sqlite3.rst:175 +msgid "" +"Now, insert three more rows by calling :meth:`cur.executemany(...) " +"`:" +msgstr "现在,让我们调用 :meth:`cur.executemany(...) ` 再插入三行数据:" + +#: ../../library/sqlite3.rst:178 +msgid "" +"data = [\n" +" (\"Monty Python Live at the Hollywood Bowl\", 1982, 7.9),\n" +" (\"Monty Python's The Meaning of Life\", 1983, 7.5),\n" +" (\"Monty Python's Life of Brian\", 1979, 8.0),\n" +"]\n" +"cur.executemany(\"INSERT INTO movie VALUES(?, ?, ?)\", data)\n" +"con.commit() # Remember to commit the transaction after executing INSERT." +msgstr "" +"data = [\n" +" (\"Monty Python Live at the Hollywood Bowl\", 1982, 7.9),\n" +" (\"Monty Python's The Meaning of Life\", 1983, 7.5),\n" +" (\"Monty Python's Life of Brian\", 1979, 8.0),\n" +"]\n" +"cur.executemany(\"INSERT INTO movie VALUES(?, ?, ?)\", data)\n" +"con.commit() # 记得在执行 INSERT 之后提交事务。" + +#: ../../library/sqlite3.rst:188 +msgid "" +"Notice that ``?`` placeholders are used to bind ``data`` to the query. " +"Always use placeholders instead of :ref:`string formatting `" +" to bind Python values to SQL statements, to avoid `SQL injection attacks`_ " +"(see :ref:`sqlite3-placeholders` for more details)." +msgstr "" +"请注意,占位符 (placeholders) ``?`` 是用来在查询中绑定数据 ``data`` 的。 在绑定 Python 的值到 SQL " +"语句中时,请使用占位符取代 (:ref:`字符串格式化 ` ) 以避免 `SQL 注入攻击`_ (详情参见 " +":ref:`sqlite3-placeholders`)。" + +#: ../../library/sqlite3.rst:194 +msgid "" +"We can verify that the new rows were inserted by executing a ``SELECT`` " +"query, this time iterating over the results of the query:" +msgstr "同样的,我们可以通过执行 ``SELECT`` 查询验证新的数据行是否已经插入表中,这一次我们将迭代查询的结果:" + +#: ../../library/sqlite3.rst:198 +msgid "" +">>> for row in cur.execute(\"SELECT year, title FROM movie ORDER BY year\"):\n" +"... print(row)\n" +"(1971, 'And Now for Something Completely Different')\n" +"(1975, 'Monty Python and the Holy Grail')\n" +"(1979, \"Monty Python's Life of Brian\")\n" +"(1982, 'Monty Python Live at the Hollywood Bowl')\n" +"(1983, \"Monty Python's The Meaning of Life\")" +msgstr "" +">>> for row in cur.execute(\"SELECT year, title FROM movie ORDER BY year\"):\n" +"... print(row)\n" +"(1971, 'And Now for Something Completely Different')\n" +"(1975, 'Monty Python and the Holy Grail')\n" +"(1979, \"Monty Python's Life of Brian\")\n" +"(1982, 'Monty Python Live at the Hollywood Bowl')\n" +"(1983, \"Monty Python's The Meaning of Life\")" + +#: ../../library/sqlite3.rst:208 +msgid "" +"Each row is a two-item :class:`tuple` of ``(year, title)``, matching the " +"columns selected in the query." +msgstr "" +"如上可见,每一行都是包括 ``(year,title)`` 这两个元素的元组 (:class:`tuple` ) ,它与我们查询中选中的数据列相匹配。" + +#: ../../library/sqlite3.rst:211 +msgid "" +"Finally, verify that the database has been written to disk by calling " +":meth:`con.close() ` to close the existing connection, " +"opening a new one, creating a new cursor, then querying the database:" +msgstr "" +"最后,让我们先通过调用 :meth:`con.close() ` " +"关闭现存的与数据库的连接,而后打开一个新的连接、创建一个新的游标、执行一个新的查询以验证我们是否将数据库写入到了本地磁盘上:" + +#: ../../library/sqlite3.rst:216 +msgid "" +">>> con.close()\n" +">>> new_con = sqlite3.connect(\"tutorial.db\")\n" +">>> new_cur = new_con.cursor()\n" +">>> res = new_cur.execute(\"SELECT title, year FROM movie ORDER BY score DESC\")\n" +">>> title, year = res.fetchone()\n" +">>> print(f'The highest scoring Monty Python movie is {title!r}, released in {year}')\n" +"The highest scoring Monty Python movie is 'Monty Python and the Holy Grail', released in 1975\n" +">>> new_con.close()" +msgstr "" +">>> con.close()\n" +">>> new_con = sqlite3.connect(\"tutorial.db\")\n" +">>> new_cur = new_con.cursor()\n" +">>> res = new_cur.execute(\"SELECT title, year FROM movie ORDER BY score DESC\")\n" +">>> title, year = res.fetchone()\n" +">>> print(f'The highest scoring Monty Python movie is {title!r}, released in {year}')\n" +"The highest scoring Monty Python movie is 'Monty Python and the Holy Grail', released in 1975\n" +">>> new_con.close()" + +#: ../../library/sqlite3.rst:227 +msgid "" +"You've now created an SQLite database using the :mod:`!sqlite3` module, " +"inserted data and retrieved values from it in multiple ways." +msgstr "现在您已经成功地使用模块 :mod:`!sqlite3` 创建了一个 SQLite 数据库,并且学会了以多种方式往其中插入数据与检索值。" + +#: ../../library/sqlite3.rst:239 +msgid ":ref:`sqlite3-howtos` for further reading:" +msgstr "阅读 :ref:`sqlite3-howtos` 以获取更多信息:" + +#: ../../library/sqlite3.rst:241 +msgid ":ref:`sqlite3-placeholders`" +msgstr ":ref:`sqlite3-placeholders`" + +#: ../../library/sqlite3.rst:242 +msgid ":ref:`sqlite3-adapters`" +msgstr ":ref:`sqlite3-adapters`" + +#: ../../library/sqlite3.rst:243 +msgid ":ref:`sqlite3-converters`" +msgstr ":ref:`sqlite3-converters`" + +#: ../../library/sqlite3.rst:244 ../../library/sqlite3.rst:606 +msgid ":ref:`sqlite3-connection-context-manager`" +msgstr ":ref:`sqlite3-connection-context-manager`" + +#: ../../library/sqlite3.rst:245 +msgid ":ref:`sqlite3-howto-row-factory`" +msgstr ":ref:`sqlite3-howto-row-factory`" + +#: ../../library/sqlite3.rst:247 +msgid "" +":ref:`sqlite3-explanation` for in-depth background on transaction control." +msgstr "参阅 :ref:`sqlite3-explanation` 以获取关于事务控制的更深一步的背景。" + +#: ../../library/sqlite3.rst:252 +msgid "Reference" +msgstr "参考" + +#: ../../library/sqlite3.rst:260 +msgid "Module functions" +msgstr "模块函数" + +#: ../../library/sqlite3.rst:268 +msgid "Open a connection to an SQLite database." +msgstr "打开一个与 SQLite 数据库的连接。" + +#: ../../library/sqlite3.rst:0 +msgid "Parameters" +msgstr "参数" + +#: ../../library/sqlite3.rst:270 +msgid "" +"The path to the database file to be opened. You can pass ``\":memory:\"`` to" +" create an `SQLite database existing only in memory " +"`_, and open a connection to it." +msgstr "" +"要打开的数据库文件的路径。 你可以传入 ``\":memory:\"`` 来创建一个 `仅存在于内存中的 SQLite 数据库 " +"`_,并打开它的一个连接。" + +#: ../../library/sqlite3.rst:277 +msgid "" +"How many seconds the connection should wait before raising an " +":exc:`OperationalError` when a table is locked. If another connection opens " +"a transaction to modify a table, that table will be locked until the " +"transaction is committed. Default five seconds." +msgstr "" +"当一个表被锁定时连接在最终引发 :exc:`OperationalError` 之前应该等待多少秒。 " +"如果另一个连接开启了一个事务来修改一个表,该表将被锁定直到该事务完成提交。默认值为五秒。" + +#: ../../library/sqlite3.rst:284 +msgid "" +"Control whether and how data types not :ref:`natively supported by SQLite " +"` are looked up to be converted to Python types, using the " +"converters registered with :func:`register_converter`. Set it to any " +"combination (using ``|``, bitwise or) of :const:`PARSE_DECLTYPES` and " +":const:`PARSE_COLNAMES` to enable this. Column names take precedence over " +"declared types if both flags are set. By default (``0``), type detection is " +"disabled." +msgstr "" +"制是否以及如何查找要转换为 Python 类型的非 :ref:`SQLite 原生支持的 ` 数据类型,将使用通过 " +":func:`register_converter` 注册的转换器。 (使用 ``|``,即按位或)将它设为 " +":const:`PARSE_DECLTYPES` 和 :const:`PARSE_COLNAMES` 的任意组合来启用此选项。 " +"如果这两个旗标都已设置则列名将优先于声明的类型。 当为默认值 (``0``) 时,类型检测将被禁用。, type detection is " +"disabled." + +#: ../../library/sqlite3.rst:295 +msgid "" +"Control legacy transaction handling behaviour. See " +":attr:`Connection.isolation_level` and :ref:`sqlite3-transaction-control-" +"isolation-level` for more information. Can be ``\"DEFERRED\"`` (default), " +"``\"EXCLUSIVE\"`` or ``\"IMMEDIATE\"``; or ``None`` to disable opening " +"transactions implicitly. Has no effect unless :attr:`Connection.autocommit` " +"is set to :const:`~sqlite3.LEGACY_TRANSACTION_CONTROL` (the default)." +msgstr "" +"控制旧式的事务处理行为。更多信息请参阅 :attr:`Connection.isolation_level` 和 " +":ref:`sqlite3-transaction-control-isolation-level`。可以为 ``\\``;或者为 ``None`` " +"表示禁止隐式地开启事务。除非 :attr:`Connection.autocommit` 设为 " +":const:`~sqlite3.LEGACY_TRANSACTION_CONTROL` (默认值) 否则没有任何影响。" + +#: ../../library/sqlite3.rst:305 +msgid "" +"If ``True`` (default), :exc:`ProgrammingError` will be raised if the " +"database connection is used by a thread other than the one that created it. " +"If ``False``, the connection may be accessed in multiple threads; write " +"operations may need to be serialized by the user to avoid data corruption. " +"See :attr:`threadsafety` for more information." +msgstr "" +"如果为 ``True`` (默认),则 :exc:`ProgrammingError` 将在数据库连接被它的创建者以外的线程使用时被引发。如果为 " +"``False``,则连接可以在多个线程中被访问;写入操作需要由用户进行序列化以避免数据损坏。请参阅 :attr:`threadsafety` " +"了解详情。" + +#: ../../library/sqlite3.rst:314 +msgid "" +"A custom subclass of :class:`Connection` to create the connection with, if " +"not the default :class:`Connection` class." +msgstr "" +"如果您不想使用默认的 :class:`Connection` 类创建连接,那么您可以通过传入一个自定义的 :class:`Connection` " +"类的子类给该参数以创建连接。" + +#: ../../library/sqlite3.rst:318 +msgid "" +"The number of statements that :mod:`!sqlite3` should internally cache for " +"this connection, to avoid parsing overhead. By default, 128 statements." +msgstr "" +"该参数指明 :mod:`!sqlite3` 模块应该为该连接进行内部缓存的语句 (statements) 数量。默认情况下,它的值为 128。" + +#: ../../library/sqlite3.rst:323 +msgid "" +"If set to ``True``, *database* is interpreted as a :abbr:`URI (Uniform " +"Resource Identifier)` with a file path and an optional query string. The " +"scheme part *must* be ``\"file:\"``, and the path can be relative or " +"absolute. The query string allows passing parameters to SQLite, enabling " +"various :ref:`sqlite3-uri-tricks`." +msgstr "" +"如果将该参数的值设置为 ``True``,参数 *database* 将会被解释为一个由文件路径与可选的查询字符串组成的 :abbr:`URI " +"(Uniform Resource Identifier)` 链接。 链接的前缀协议部分 *必需* 为 " +"``\"file:\"``,后面的文件路径可以是相对路径或绝对路径。 查询字符串允许向 SQLite 传递参数,以实现不同的 " +":ref:`sqlite3-uri-tricks`。" + +#: ../../library/sqlite3.rst:332 +msgid "" +"Control :pep:`249` transaction handling behaviour. See " +":attr:`Connection.autocommit` and :ref:`sqlite3-transaction-control-" +"autocommit` for more information. *autocommit* currently defaults to " +":const:`~sqlite3.LEGACY_TRANSACTION_CONTROL`. The default will change to " +"``False`` in a future Python release." +msgstr "" +"控制 :pep:`249` 事务处理行为。更多信息参见 :attr:`Connection.autocommit` 和 " +":ref:`sqlite3-transaction-control-autocommit`。 *autocommit* 目前默认值为 " +":const:`~sqlite3.LEGACY_TRANSACTION_CONTROL`。在未来的 Python 版本中默认值将变为 " +"``False``." + +#: ../../library/sqlite3.rst:0 +msgid "Return type" +msgstr "返回类型" + +#: ../../library/sqlite3.rst:343 +msgid "" +"Raises an :ref:`auditing event ` ``sqlite3.connect`` with argument" +" ``database``." +msgstr "引发一个 :ref:`审计事件 ` ``sqlite3.connect`` 并附带参数 ``database``。" + +#: ../../library/sqlite3.rst:344 +msgid "" +"Raises an :ref:`auditing event ` ``sqlite3.connect/handle`` with " +"argument ``connection_handle``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``sqlite3.connect/handle`` 并附带参数 " +"``connection_handle``." + +#: ../../library/sqlite3.rst:346 +msgid "Added the *uri* parameter." +msgstr "增加了 *uri* 参数。" + +#: ../../library/sqlite3.rst:349 +msgid "" +"*database* can now also be a :term:`path-like object`, not only a string." +msgstr "*database* 现在可以是一个 :term:`path-like object` 对象了,而不仅仅是字符串。" + +#: ../../library/sqlite3.rst:352 +msgid "Added the ``sqlite3.connect/handle`` auditing event." +msgstr "增加了 ``sqlite3.connect/handle`` 审计事件。" + +#: ../../library/sqlite3.rst:355 +msgid "Added the *autocommit* parameter." +msgstr "增加了 *autocommit* 形参。" + +#: ../../library/sqlite3.rst:358 +msgid "All parameters except *database* are now keyword-only." +msgstr "" + +#: ../../library/sqlite3.rst:363 +msgid "" +"Return ``True`` if the string *statement* appears to contain one or more " +"complete SQL statements. No syntactic verification or parsing of any kind is" +" performed, other than checking that there are no unclosed string literals " +"and the statement is terminated by a semicolon." +msgstr "" +"如果传入的字符串语句 (statement) 看起来像是包括一条或多条完整的 SQL 语句,那么该函数将返回 ``True`` " +"。请注意,除了检查未封闭的字符串字面 (unclosed string literals) 以及语句是否以分号结束外,它不会执行任何的语法检查 " +"(syntactic verification) 与语法解析 (synatatic parsing) 。" + +#: ../../library/sqlite3.rst:369 +msgid "For example:" +msgstr "例如:" + +#: ../../library/sqlite3.rst:371 +msgid "" +">>> sqlite3.complete_statement(\"SELECT foo FROM bar;\")\n" +"True\n" +">>> sqlite3.complete_statement(\"SELECT foo\")\n" +"False" +msgstr "" +">>> sqlite3.complete_statement(\"SELECT foo FROM bar;\")\n" +"True\n" +">>> sqlite3.complete_statement(\"SELECT foo\")\n" +"False" + +#: ../../library/sqlite3.rst:378 +msgid "" +"This function may be useful during command-line input to determine if the " +"entered text seems to form a complete SQL statement, or if additional input " +"is needed before calling :meth:`~Cursor.execute`." +msgstr "" +"该函数可能在这样的情形下非常有用:在通过命令行 (command-line) 输入数据时,可使用该函数判断输入文本是否可以构成一个完整的 SQL " +"语句,或者判断在调用函数 :meth:`~Cursor.execute` 前是否还需要额外的输入。" + +#: ../../library/sqlite3.rst:382 +msgid "" +"See :func:`!runsource` in :source:`Lib/sqlite3/__main__.py` for real-world " +"use." +msgstr "请参阅 :source:`Lib/sqlite3/__main__.py` 中的 :func:`!runsource` 了解实际使用情况。" + +#: ../../library/sqlite3.rst:387 +msgid "" +"Enable or disable callback tracebacks. By default you will not get any " +"tracebacks in user-defined functions, aggregates, converters, authorizer " +"callbacks etc. If you want to debug them, you can call this function with " +"*flag* set to ``True``. Afterwards, you will get tracebacks from callbacks " +"on :data:`sys.stderr`. Use ``False`` to disable the feature again." +msgstr "" +"是否启用回调回溯 (callback tracebacks) 。默认情况下,在 SQLite 中,您不会在用户定义的函数、聚合函数 " +"(aggregates) 、转换函数 (converters) 、验证回调函数 (authorizer callbacks) " +"等中得到任何回溯信息。如果您想调试它们,您可以在将形式参数 *flag* 设置为 ``True`` 的情况下调用该函数。之后您便可以从 " +":data:`sys.stderr` 的回调中得到回溯信息。使用 ``False`` 将再次禁用该功能。" + +#: ../../library/sqlite3.rst:396 +msgid "" +"Errors in user-defined function callbacks are logged as unraisable " +"exceptions. Use an :func:`unraisable hook handler ` for " +"introspection of the failed callback." +msgstr "" +"用户自定义函数回调中的错误将被记录为不可引发的异常。请使用 :func:`不可引发的钩子处理器 ` " +"执行对失败回调的内省。" + +#: ../../library/sqlite3.rst:402 +msgid "" +"Register an *adapter* :term:`callable` to adapt the Python type *type* into " +"an SQLite type. The adapter is called with a Python object of type *type* as" +" its sole argument, and must return a value of a :ref:`type that SQLite " +"natively understands `." +msgstr "" +"注册 *adapter* :term:`callable` 以将 Python 类型 *type* 适配为一个 SQLite 类型。 " +"该适配器在调用时会传入一个 *type* 类型的 Python 对象作为其唯一参数,并且必须返回一个 :ref:`SQLite 原生支持的类型 " +"` 的值。" + +#: ../../library/sqlite3.rst:410 +msgid "" +"Register the *converter* :term:`callable` to convert SQLite objects of type " +"*typename* into a Python object of a specific type. The converter is invoked" +" for all SQLite values of type *typename*; it is passed a :class:`bytes` " +"object and should return an object of the desired Python type. Consult the " +"parameter *detect_types* of :func:`connect` for information regarding how " +"type detection works." +msgstr "" +"注册 *converter* :term:`callable` 以将 *typename* 类型的 SQLite 对象转换为一个特定类型的 Python" +" 对象。转换器会针对所有类型为 *typename* 的 SQLite 值唤起;它会传递一个 :class:`bytes` 对象并且应该返回一个所需的 " +"Python 类型的对象。请参阅 :func:`connect` 的 *detect_types* 形参了解有关类型检测工作方式的详情。" + +#: ../../library/sqlite3.rst:418 +msgid "" +"Note: *typename* and the name of the type in your query are matched case-" +"insensitively." +msgstr "注:*typename* 以及您在查询中使用的类型名是不大小写敏感的。" + +#: ../../library/sqlite3.rst:425 +msgid "Module constants" +msgstr "模块常量" + +#: ../../library/sqlite3.rst:429 +msgid "" +"Set :attr:`~Connection.autocommit` to this constant to select old style " +"(pre-Python 3.12) transaction control behaviour. See " +":ref:`sqlite3-transaction-control-isolation-level` for more information." +msgstr "" +"将 :attr:`~Connection.autocommit` 设为该常量以选择旧式(Python 3.12 之前)事务控制行为。更多信息请参阅 " +":ref:`sqlite3-transaction-control-isolation-level`." + +#: ../../library/sqlite3.rst:435 +msgid "" +"Pass this flag value to the *detect_types* parameter of :func:`connect` to " +"look up a converter function using the declared types for each column. The " +"types are declared when the database table is created. :mod:`!sqlite3` will " +"look up a converter function using the first word of the declared type as " +"the converter dictionary key. For example:" +msgstr "" +"将这个旗标值传递给 :func:`connect` 的 *detect_types* " +"形参,以使用创建数据库表时为每列声明的类型的查找转换器函数。:mod:`!sqlite3` " +"将使用声明类型的第一个单词作为转换字典键来查找转换函数。例如:" + +#: ../../library/sqlite3.rst:443 +msgid "" +"CREATE TABLE test(\n" +" i integer primary key, ! will look up a converter named \"integer\"\n" +" p point, ! will look up a converter named \"point\"\n" +" n number(10) ! will look up a converter named \"number\"\n" +" )" +msgstr "" +"CREATE TABLE test(\n" +" i integer primary key, ! will look up a converter named \"integer\"\n" +" p point, ! will look up a converter named \"point\"\n" +" n number(10) ! will look up a converter named \"number\"\n" +" )" + +#: ../../library/sqlite3.rst:451 +msgid "" +"This flag may be combined with :const:`PARSE_COLNAMES` using the ``|`` " +"(bitwise or) operator." +msgstr "此旗标可以使用 ``|`` (按位或) 运算符与 :const:`PARSE_COLNAMES` 组合。" + +#: ../../library/sqlite3.rst:456 +msgid "" +"Generated fields (for example ``MAX(p)``) are returned as :class:`str`. Use " +":const:`!PARSE_COLNAMES` to enforce types for such queries." +msgstr "" +"生成的字段 (例如 ``MAX(p)``) 将作为 :class:`str` 返回。使用 :const:`!PARSE_COLNAMES` " +"为这样的查询设置类型。" + +#: ../../library/sqlite3.rst:461 +msgid "" +"Pass this flag value to the *detect_types* parameter of :func:`connect` to " +"look up a converter function by using the type name, parsed from the query " +"column name, as the converter dictionary key. The query column name must be " +"wrapped in double quotes (``\"``) and the type name must be wrapped in " +"square brackets (``[]``)." +msgstr "" +"将这个旗标值传递给 :func:`connect` 的 *detect_types* " +"形参以使用类型名称来查找转换器函数,类型名称解析自查询列名,将作为转换器字典键。 查询列名必须包装在双引号 (``\"``) " +"中而类型名称必须包装在方括号 (``[]``) 中。" + +#: ../../library/sqlite3.rst:468 +msgid "SELECT MAX(p) as \"p [point]\" FROM test; ! will look up converter \"point\"" +msgstr "SELECT MAX(p) as \"p [point]\" FROM test; ! will look up converter \"point\"" + +#: ../../library/sqlite3.rst:472 +msgid "" +"This flag may be combined with :const:`PARSE_DECLTYPES` using the ``|`` " +"(bitwise or) operator." +msgstr "此旗标可以使用 ``|`` (按位或) 运算符与 :const:`PARSE_DECLTYPES` 组合。" + +#: ../../library/sqlite3.rst:479 +msgid "" +"Flags that should be returned by the *authorizer_callback* :term:`callable` " +"passed to :meth:`Connection.set_authorizer`, to indicate whether:" +msgstr "" +"应当由传给 :meth:`Connection.set_authorizer` 的 *authorizer_callback* " +":term:`callable` 返回的旗标,用于指明是否:" + +#: ../../library/sqlite3.rst:482 +msgid "Access is allowed (:const:`!SQLITE_OK`)," +msgstr "访问被允许 (:const:`!SQLITE_OK`)。" + +#: ../../library/sqlite3.rst:483 +msgid "" +"The SQL statement should be aborted with an error (:const:`!SQLITE_DENY`)" +msgstr "SQL 语句附带异常的执行失败 (:const:`!SQLITE_DENY`)。" + +#: ../../library/sqlite3.rst:484 +msgid "" +"The column should be treated as a ``NULL`` value (:const:`!SQLITE_IGNORE`)" +msgstr "该列应被视为 NULL (:const:`!SQLITE_IGNORE`)。" + +#: ../../library/sqlite3.rst:488 +msgid "" +"String constant stating the supported DB-API level. Required by the DB-API. " +"Hard-coded to ``\"2.0\"``." +msgstr "指明所支持的 DB-API 级别的字符串常量。 根据 DB-API 的需要设置。 硬编码为 ``\"2.0\"``。" + +#: ../../library/sqlite3.rst:493 +msgid "" +"String constant stating the type of parameter marker formatting expected by " +"the :mod:`!sqlite3` module. Required by the DB-API. Hard-coded to " +"``\"qmark\"``." +msgstr "指明 :mod:`!sqlite3` 模块所预期的形参标记格式化类型。 根据 DB-API 的需要设置。 硬编码为 ``\"qmark\"``。" + +#: ../../library/sqlite3.rst:499 +msgid "The ``named`` DB-API parameter style is also supported." +msgstr "``named`` DB-API 形参风格也受到支持。" + +#: ../../library/sqlite3.rst:503 +msgid "" +"Version number of the runtime SQLite library as a :class:`string `." +msgstr "以 :class:`字符串 ` 表示的运行时 SQLite 库版本号。" + +#: ../../library/sqlite3.rst:507 +msgid "" +"Version number of the runtime SQLite library as a :class:`tuple` of " +":class:`integers `." +msgstr "以 :class:`整数 ` :class:`tuple` 表示的运行时 SQLite 库版本号。" + +#: ../../library/sqlite3.rst:512 +msgid "A :class:`tuple` containing all SQLite keywords." +msgstr "" + +#: ../../library/sqlite3.rst:514 +msgid "" +"This constant is only available if Python was compiled with SQLite 3.24.0 or" +" greater." +msgstr "" + +#: ../../library/sqlite3.rst:521 +msgid "" +"Integer constant required by the DB-API 2.0, stating the level of thread " +"safety the :mod:`!sqlite3` module supports. This attribute is set based on " +"the default `threading mode `_ the " +"underlying SQLite library is compiled with. The SQLite threading modes are:" +msgstr "" +"DB-API 2.0 所要求的整数常量,指明 :mod:`!sqlite3` 模块支持的线程安全级别。该属性将基于编译下层 SQLite 库所使用的默认" +" `线程模式 `_ 来设置。SQLite 的线程模式有:" + +#: ../../library/sqlite3.rst:526 +msgid "" +"**Single-thread**: In this mode, all mutexes are disabled and SQLite is " +"unsafe to use in more than a single thread at once." +msgstr "**Single-thread**: 在此模式下,所有的互斥都被禁用并且 SQLite 同时在多个线程中使用将是不安全的。" + +#: ../../library/sqlite3.rst:528 +msgid "" +"**Multi-thread**: In this mode, SQLite can be safely used by multiple " +"threads provided that no single database connection is used simultaneously " +"in two or more threads." +msgstr "" +"**Multi-thread**: 在此模式下,只要单个数据库连接没有被同时用于两个或多个线程之中 SQLite 就可以安全地被多个线程所使用。" + +#: ../../library/sqlite3.rst:531 +msgid "" +"**Serialized**: In serialized mode, SQLite can be safely used by multiple " +"threads with no restriction." +msgstr "**Serialized**: 在序列化模式下,SQLite 可以安全地被多个线程所使用而没有额外的限制。" + +#: ../../library/sqlite3.rst:534 +msgid "" +"The mappings from SQLite threading modes to DB-API 2.0 threadsafety levels " +"are as follows:" +msgstr "从 SQLite 线程模式到 DB-API 2.0 线程安全级别的映射关系如下:" + +#: ../../library/sqlite3.rst:538 +msgid "SQLite threading mode" +msgstr "SQLite 线程模式" + +#: ../../library/sqlite3.rst:538 +msgid ":pep:`threadsafety <0249#threadsafety>`" +msgstr ":pep:`threadsafety <0249#threadsafety>`" + +#: ../../library/sqlite3.rst:538 +msgid "`SQLITE_THREADSAFE`_" +msgstr "`SQLITE_THREADSAFE`_" + +#: ../../library/sqlite3.rst:538 +msgid "DB-API 2.0 meaning" +msgstr "DB-API 2.0 含义" + +#: ../../library/sqlite3.rst:541 +msgid "single-thread" +msgstr "single-thread" + +#: ../../library/sqlite3.rst:541 +msgid "0" +msgstr "0" + +#: ../../library/sqlite3.rst:541 +msgid "Threads may not share the module" +msgstr "各个线程不能共享模块" + +#: ../../library/sqlite3.rst:544 +msgid "multi-thread" +msgstr "multi-thread" + +#: ../../library/sqlite3.rst:544 ../../library/sqlite3.rst:547 +msgid "1" +msgstr "1" + +#: ../../library/sqlite3.rst:544 +msgid "2" +msgstr "2" + +#: ../../library/sqlite3.rst:544 +msgid "Threads may share the module, but not connections" +msgstr "线程可以共享模块,但不能共享连接" + +#: ../../library/sqlite3.rst:547 +msgid "serialized" +msgstr "serialized" + +#: ../../library/sqlite3.rst:547 +msgid "3" +msgstr "3" + +#: ../../library/sqlite3.rst:547 +msgid "Threads may share the module, connections and cursors" +msgstr "线程可以共享模块、连接和游标" + +#: ../../library/sqlite3.rst:553 +msgid "Set *threadsafety* dynamically instead of hard-coding it to ``1``." +msgstr "动态设置 *threadsafety* 而不是将其硬编码为 ``1``。" + +#: ../../library/sqlite3.rst:575 +msgid "" +"These constants are used for the :meth:`Connection.setconfig` and " +":meth:`~Connection.getconfig` methods." +msgstr "" +"这些常量被用于 :meth:`Connection.setconfig` 和 :meth:`~Connection.getconfig` 方法。" + +#: ../../library/sqlite3.rst:578 +msgid "" +"The availability of these constants varies depending on the version of " +"SQLite Python was compiled with." +msgstr "这些常量的可用性会根据 Python 编译时使用的 SQLite 版本而发生变化。" + +#: ../../library/sqlite3.rst:585 +msgid "https://www.sqlite.org/c3ref/c_dbconfig_defensive.html" +msgstr "https://www.sqlite.org/c3ref/c_dbconfig_defensive.html" + +#: ../../library/sqlite3.rst:586 +msgid "SQLite docs: Database Connection Configuration Options" +msgstr "SQLite 文档:数据库连接配置选项" + +#: ../../library/sqlite3.rst:588 +msgid "The :data:`!version` and :data:`!version_info` constants." +msgstr ":data:`!version` 和 :data:`!version_info` 常量。" + +#: ../../library/sqlite3.rst:594 +msgid "Connection objects" +msgstr "连接对象" + +#: ../../library/sqlite3.rst:598 +msgid "" +"Each open SQLite database is represented by a ``Connection`` object, which " +"is created using :func:`sqlite3.connect`. Their main purpose is creating " +":class:`Cursor` objects, and :ref:`sqlite3-controlling-transactions`." +msgstr "" +"每个打开的 SQLite 数据库均以 ``Connection`` 对象来表示,这种对象是使用 :func:`sqlite3.connect` 创建的。" +" 它们的主要目的是创建 :class:`Cursor` 对象,以及 :ref:`sqlite3-controlling-transactions`。" + +#: ../../library/sqlite3.rst:605 +msgid ":ref:`sqlite3-connection-shortcuts`" +msgstr ":ref:`sqlite3-connection-shortcuts`" + +#: ../../library/sqlite3.rst:611 +msgid "" +"A :exc:`ResourceWarning` is emitted if :meth:`close` is not called before a " +":class:`!Connection` object is deleted." +msgstr "" +"如果未在 :class:`!Connection` 对象被删除前调用 :meth:`close` 则会发出 " +":exc:`ResourceWarning`." + +#: ../../library/sqlite3.rst:614 +msgid "" +"An SQLite database connection has the following attributes and methods:" +msgstr "SQLite 数据库连接对象有如下的属性和方法:" + +#: ../../library/sqlite3.rst:618 +msgid "" +"Create and return a :class:`Cursor` object. The cursor method accepts a " +"single optional parameter *factory*. If supplied, this must be a " +":term:`callable` returning an instance of :class:`Cursor` or its subclasses." +msgstr "" +"创建并返回 :class:`Cursor` 对象。cursor 方法接受一个可选参数 *factory*。如果提供了这个参数,它必须是一个 " +":term:`callable` 并且返回 :class:`Cursor` 或其子类的实例。" + +#: ../../library/sqlite3.rst:625 +msgid "" +"Open a :class:`Blob` handle to an existing :abbr:`BLOB (Binary Large " +"OBject)`." +msgstr "打开一个 :class:`Blob` 句柄指向现有的 :abbr:`BLOB (Binary Large OBject)`。" + +#: ../../library/sqlite3.rst:628 +msgid "The name of the table where the blob is located." +msgstr "二进制大对象 blob 所在表的名称。" + +#: ../../library/sqlite3.rst:631 +msgid "The name of the column where the blob is located." +msgstr "二进制大对象 blob 所在表的列名。" + +#: ../../library/sqlite3.rst:634 +msgid "The row id where the blob is located." +msgstr "blob 所在的行 ID。" + +#: ../../library/sqlite3.rst:637 +msgid "" +"Set to ``True`` if the blob should be opened without write permissions. " +"Defaults to ``False``." +msgstr "如果 blob 应当不带写入权限打开则设为 ``True``。默认为 ``False``。" + +#: ../../library/sqlite3.rst:642 +msgid "" +"The name of the database where the blob is located. Defaults to " +"``\"main\"``." +msgstr "二进制大对象 blob 所在的数据库名。 默认为 ``\"main\"``。" + +#: ../../library/sqlite3.rst:0 +msgid "Raises" +msgstr "引发" + +#: ../../library/sqlite3.rst:646 +msgid "When trying to open a blob in a ``WITHOUT ROWID`` table." +msgstr "当尝试打开 ``WITHOUT ROWID`` 的表中的某个 blob 时。" + +#: ../../library/sqlite3.rst:653 +msgid "" +"The blob size cannot be changed using the :class:`Blob` class. Use the SQL " +"function ``zeroblob`` to create a blob with a fixed size." +msgstr "" +"blob 的大小无法使用 :class:`Blob` 类来修改。可使用 SQL 函数 ``zeroblob`` 来创建固定大小的 blob。" + +#: ../../library/sqlite3.rst:660 +msgid "" +"Commit any pending transaction to the database. If :attr:`autocommit` is " +"``True``, or there is no open transaction, this method does nothing. If " +":attr:`!autocommit` is ``False``, a new transaction is implicitly opened if " +"a pending transaction was committed by this method." +msgstr "" +"向数据库提交任何待处理事务。如果 :attr:`autocommit` 为 ``True``,或者没有已开启的事务,则此方法不会做任何操作。如果 " +":attr:`!autocommit` 为 ``False``,则如果有一个待处理事务被此方法提交则会隐式地开启一个新事务。" + +#: ../../library/sqlite3.rst:668 +msgid "" +"Roll back to the start of any pending transaction. If :attr:`autocommit` is " +"``True``, or there is no open transaction, this method does nothing. If " +":attr:`!autocommit` is ``False``, a new transaction is implicitly opened if " +"a pending transaction was rolled back by this method." +msgstr "" +"回滚到任何待处理事务的起始位置。如果 :attr:`autocommit` 为 ``True``,或者没有已开启的事务,则此方法不会做任何操作。如果 " +":attr:`!autocommit` 为 ``False``,则如果此方法回滚了一个待处理事务则会隐式地开启一个新事务。" + +#: ../../library/sqlite3.rst:676 +msgid "" +"Close the database connection. If :attr:`autocommit` is ``False``, any " +"pending transaction is implicitly rolled back. If :attr:`!autocommit` is " +"``True`` or :data:`LEGACY_TRANSACTION_CONTROL`, no implicit transaction " +"control is executed. Make sure to :meth:`commit` before closing to avoid " +"losing pending changes." +msgstr "" +"关闭数据库连接。如果 :attr:`autocommit` 为 ``False``,则任何待处理事务都会被隐式地回滚。如果 " +":attr:`!autocommit` 为 ``True`` 或 " +":data:`LEGACY_TRANSACTION_CONTROL`,则不会执行隐式的事务控制。请确保在关闭之前 :meth:`commit` " +"以避免丢失待处理的更改。" + +#: ../../library/sqlite3.rst:686 +msgid "" +"Create a new :class:`Cursor` object and call :meth:`~Cursor.execute` on it " +"with the given *sql* and *parameters*. Return the new cursor object." +msgstr "" +"创建一个新的 :class:`Cursor` 对象,并在其上使用给出的 *sql* 和 *parameters* 调用 " +":meth:`~Cursor.execute`。返回新的游标对象。" + +#: ../../library/sqlite3.rst:692 +msgid "" +"Create a new :class:`Cursor` object and call :meth:`~Cursor.executemany` on " +"it with the given *sql* and *parameters*. Return the new cursor object." +msgstr "" +"创建一个新的 :class:`Cursor` 对象,并在其上使用给出的 *sql* 和 *parameters* 调用 " +":meth:`~Cursor.executemany`。返回新的游标对象。" + +#: ../../library/sqlite3.rst:698 +msgid "" +"Create a new :class:`Cursor` object and call :meth:`~Cursor.executescript` " +"on it with the given *sql_script*. Return the new cursor object." +msgstr "" +"创建一个新的 :class:`Cursor` 对象,并在其上使用给出的 *sql_script* 调用 " +":meth:`~Cursor.executescript`。返回新的游标对象。" + +#: ../../library/sqlite3.rst:704 +msgid "Create or remove a user-defined SQL function." +msgstr "创建或移除用户定义的 SQL 函数。" + +#: ../../library/sqlite3.rst:706 +msgid "The name of the SQL function." +msgstr "SQL 函数的名称。" + +#: ../../library/sqlite3.rst:709 +msgid "" +"The number of arguments the SQL function can accept. If ``-1``, it may take " +"any number of arguments." +msgstr "SQL 函数可接受的参数数量,如果是 ``-1``,则该函数可以接受任意数量的参数。" + +#: ../../library/sqlite3.rst:713 +msgid "" +"A :term:`callable` that is called when the SQL function is invoked. The " +"callable must return :ref:`a type natively supported by SQLite " +"`. Set to ``None`` to remove an existing SQL function." +msgstr "" +"当该 SQL 函数被唤起时将会调用的 :term:`callable`。该可调用对象必须返回 :ref:`一个 SQLite 原生支持的类型 " +"`。设为 ``None`` 将移除现有的 SQL 函数。" + +#: ../../library/sqlite3.rst:720 +msgid "" +"If ``True``, the created SQL function is marked as `deterministic " +"`_, which allows SQLite to perform " +"additional optimizations." +msgstr "" +"如为 ``True``,创建的 SQL 函数将被标记为 `deterministic " +"`_,这允许 SQLite 执行额外的优化。" + +#: ../../library/sqlite3.rst:725 +msgid "Added the *deterministic* parameter." +msgstr "增加了 *deterministic* 形参。" + +#: ../../library/sqlite3.rst:728 +msgid "The first three parameters are now positional-only." +msgstr "" + +#: ../../library/sqlite3.rst:731 ../../library/sqlite3.rst:773 +#: ../../library/sqlite3.rst:836 ../../library/sqlite3.rst:1112 +#: ../../library/sqlite3.rst:1536 ../../library/sqlite3.rst:1577 +msgid "Example:" +msgstr "示例:" + +#: ../../library/sqlite3.rst:733 +msgid "" +">>> import hashlib\n" +">>> def md5sum(t):\n" +"... return hashlib.md5(t).hexdigest()\n" +">>> con = sqlite3.connect(\":memory:\")\n" +">>> con.create_function(\"md5\", 1, md5sum)\n" +">>> for row in con.execute(\"SELECT md5(?)\", (b\"foo\",)):\n" +"... print(row)\n" +"('acbd18db4cc2f85cedef654fccc4a4d8',)\n" +">>> con.close()" +msgstr "" +">>> import hashlib\n" +">>> def md5sum(t):\n" +"... return hashlib.md5(t).hexdigest()\n" +">>> con = sqlite3.connect(\":memory:\")\n" +">>> con.create_function(\"md5\", 1, md5sum)\n" +">>> for row in con.execute(\"SELECT md5(?)\", (b\"foo\",)):\n" +"... print(row)\n" +"('acbd18db4cc2f85cedef654fccc4a4d8',)\n" +">>> con.close()" + +#: ../../library/sqlite3.rst:748 +msgid "Create or remove a user-defined SQL aggregate function." +msgstr "创建或移除用户自定义的 SQL 聚合函数。" + +#: ../../library/sqlite3.rst:750 +msgid "The name of the SQL aggregate function." +msgstr "SQL 聚合函数的名称。" + +#: ../../library/sqlite3.rst:753 +msgid "" +"The number of arguments the SQL aggregate function can accept. If ``-1``, it" +" may take any number of arguments." +msgstr "SQL 聚合函数可接受的参数数量。如为 ``-1``,则可以接受任意数量的参数。" + +#: ../../library/sqlite3.rst:757 +msgid "" +"A class must implement the following methods: * ``step()``: Add a row to " +"the aggregate. * ``finalize()``: Return the final result of the aggregate as" +" :ref:`a type natively supported by SQLite `. The number " +"of arguments that the ``step()`` method must accept is controlled by " +"*n_arg*. Set to ``None`` to remove an existing SQL aggregate function." +msgstr "" +"一个类必须实现下列方法: * ``step()``: 向聚合添加一行。 * ``finalize()``: 将聚合的最终结果作为 :ref:`一个 " +"SQLite 原生支持的类型 ` 返回。``step()`` 方法需要接受的参数数量是由 *n_arg* 控制的。设为 " +"``None`` 将移除现有的 SQL 聚合函数。" + +#: ../../library/sqlite3.rst:758 +msgid "A class must implement the following methods:" +msgstr "此类必须实现以下方法:" + +#: ../../library/sqlite3.rst:760 +msgid "``step()``: Add a row to the aggregate." +msgstr "``step()``: 向聚合添加一行。" + +#: ../../library/sqlite3.rst:761 ../../library/sqlite3.rst:820 +msgid "" +"``finalize()``: Return the final result of the aggregate as :ref:`a type " +"natively supported by SQLite `." +msgstr "" +"``finalize()``: 将聚合的最终结果作为 :ref:`一个 SQLite 原生支持的类型 ` 返回。" + +#: ../../library/sqlite3.rst:764 +msgid "" +"The number of arguments that the ``step()`` method must accept is controlled" +" by *n_arg*." +msgstr "``step()`` 方法所必须接受的参数数量是由 *n_arg* 控制的。" + +#: ../../library/sqlite3.rst:767 +msgid "Set to ``None`` to remove an existing SQL aggregate function." +msgstr "设为 ``None`` 以移除现有的 SQL 聚合函数。" + +#: ../../library/sqlite3.rst:770 +msgid "All three parameters are now positional-only." +msgstr "" + +#: ../../library/sqlite3.rst:775 +msgid "" +"class MySum:\n" +" def __init__(self):\n" +" self.count = 0\n" +"\n" +" def step(self, value):\n" +" self.count += value\n" +"\n" +" def finalize(self):\n" +" return self.count\n" +"\n" +"con = sqlite3.connect(\":memory:\")\n" +"con.create_aggregate(\"mysum\", 1, MySum)\n" +"cur = con.execute(\"CREATE TABLE test(i)\")\n" +"cur.execute(\"INSERT INTO test(i) VALUES(1)\")\n" +"cur.execute(\"INSERT INTO test(i) VALUES(2)\")\n" +"cur.execute(\"SELECT mysum(i) FROM test\")\n" +"print(cur.fetchone()[0])\n" +"\n" +"con.close()" +msgstr "" +"class MySum:\n" +" def __init__(self):\n" +" self.count = 0\n" +"\n" +" def step(self, value):\n" +" self.count += value\n" +"\n" +" def finalize(self):\n" +" return self.count\n" +"\n" +"con = sqlite3.connect(\":memory:\")\n" +"con.create_aggregate(\"mysum\", 1, MySum)\n" +"cur = con.execute(\"CREATE TABLE test(i)\")\n" +"cur.execute(\"INSERT INTO test(i) VALUES(1)\")\n" +"cur.execute(\"INSERT INTO test(i) VALUES(2)\")\n" +"cur.execute(\"SELECT mysum(i) FROM test\")\n" +"print(cur.fetchone()[0])\n" +"\n" +"con.close()" + +#: ../../library/sqlite3.rst:805 +msgid "Create or remove a user-defined aggregate window function." +msgstr "创建或移除用户定义的聚合窗口函数。" + +#: ../../library/sqlite3.rst:807 +msgid "The name of the SQL aggregate window function to create or remove." +msgstr "要创建或移除的 SQL 聚合窗口函数的名称。" + +#: ../../library/sqlite3.rst:810 +msgid "" +"The number of arguments the SQL aggregate window function can accept. If " +"``-1``, it may take any number of arguments." +msgstr "SQL 聚合窗口函数可接受的参数数量。如为 ``-1``,则可以接受任意数量的参数。" + +#: ../../library/sqlite3.rst:814 +msgid "" +"A class that must implement the following methods: * ``step()``: Add a row " +"to the current window. * ``value()``: Return the current value of the " +"aggregate. * ``inverse()``: Remove a row from the current window. * " +"``finalize()``: Return the final result of the aggregate as :ref:`a type " +"natively supported by SQLite `. The number of arguments that" +" the ``step()`` and ``value()`` methods must accept is controlled by " +"*num_params*. Set to ``None`` to remove an existing SQL aggregate window " +"function." +msgstr "" +"一个必须实现下列方法的类: * ``step()``: 向当前窗口添加一行。 * ``value()``: 返回聚合的当前值。 * " +"``inverse()``: 从当前窗口移除一行。 * ``finalize()``: 将聚合的最终结果作为 :ref:`一个 SQLite " +"原生支持的类型 ` 返回。``step()`` 和 ``value()`` 方法需要接受的参数数量是由 " +"*num_params* 控制的。设为 ``None`` 将移除现有的 SQL 聚合窗口函数。" + +#: ../../library/sqlite3.rst:815 +msgid "A class that must implement the following methods:" +msgstr "此类必须实现以下方法:" + +#: ../../library/sqlite3.rst:817 +msgid "``step()``: Add a row to the current window." +msgstr "``step()``: 向当前窗口添加一行。" + +#: ../../library/sqlite3.rst:818 +msgid "``value()``: Return the current value of the aggregate." +msgstr "``value()``: 返回聚合的当前值。" + +#: ../../library/sqlite3.rst:819 +msgid "``inverse()``: Remove a row from the current window." +msgstr "``inverse()``: 从当前窗口移除一行。" + +#: ../../library/sqlite3.rst:823 +msgid "" +"The number of arguments that the ``step()`` and ``value()`` methods must " +"accept is controlled by *num_params*." +msgstr "``step()`` 和 ``value()`` 方法需要接受的参数数量是由 *num_params* 控制的。" + +#: ../../library/sqlite3.rst:826 +msgid "Set to ``None`` to remove an existing SQL aggregate window function." +msgstr "设为 ``None`` 将移除现有的 SQL 聚合窗口函数。" + +#: ../../library/sqlite3.rst:828 +msgid "" +"If used with a version of SQLite older than 3.25.0, which does not support " +"aggregate window functions." +msgstr "如果在早于 SQLite 3.25.0,不支持聚合窗口函数的版本上使用。" + +#: ../../library/sqlite3.rst:838 +msgid "" +"# Example taken from https://www.sqlite.org/windowfunctions.html#udfwinfunc\n" +"class WindowSumInt:\n" +" def __init__(self):\n" +" self.count = 0\n" +"\n" +" def step(self, value):\n" +" \"\"\"Add a row to the current window.\"\"\"\n" +" self.count += value\n" +"\n" +" def value(self):\n" +" \"\"\"Return the current value of the aggregate.\"\"\"\n" +" return self.count\n" +"\n" +" def inverse(self, value):\n" +" \"\"\"Remove a row from the current window.\"\"\"\n" +" self.count -= value\n" +"\n" +" def finalize(self):\n" +" \"\"\"Return the final value of the aggregate.\n" +"\n" +" Any clean-up actions should be placed here.\n" +" \"\"\"\n" +" return self.count\n" +"\n" +"\n" +"con = sqlite3.connect(\":memory:\")\n" +"cur = con.execute(\"CREATE TABLE test(x, y)\")\n" +"values = [\n" +" (\"a\", 4),\n" +" (\"b\", 5),\n" +" (\"c\", 3),\n" +" (\"d\", 8),\n" +" (\"e\", 1),\n" +"]\n" +"cur.executemany(\"INSERT INTO test VALUES(?, ?)\", values)\n" +"con.create_window_function(\"sumint\", 1, WindowSumInt)\n" +"cur.execute(\"\"\"\n" +" SELECT x, sumint(y) OVER (\n" +" ORDER BY x ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING\n" +" ) AS sum_y\n" +" FROM test ORDER BY x\n" +"\"\"\")\n" +"print(cur.fetchall())\n" +"con.close()" +msgstr "" +"# 来自 https://www.sqlite.org/windowfunctions.html#udfwinfunc 的示例\n" +"class WindowSumInt:\n" +" def __init__(self):\n" +" self.count = 0\n" +"\n" +" def step(self, value):\n" +" \"\"\"添加一行到当前窗口。\"\"\"\n" +" self.count += value\n" +"\n" +" def value(self):\n" +" \"\"\"返回聚合的当前值。\"\"\"\n" +" return self.count\n" +"\n" +" def inverse(self, value):\n" +" \"\"\"从当前窗口移除一行。\"\"\"\n" +" self.count -= value\n" +"\n" +" def finalize(self):\n" +" \"\"\"返回聚合的最终值。\n" +"\n" +" 任何清理动作都应放在此处。\n" +" \"\"\"\n" +" return self.count\n" +"\n" +"\n" +"con = sqlite3.connect(\":memory:\")\n" +"cur = con.execute(\"CREATE TABLE test(x, y)\")\n" +"values = [\n" +" (\"a\", 4),\n" +" (\"b\", 5),\n" +" (\"c\", 3),\n" +" (\"d\", 8),\n" +" (\"e\", 1),\n" +"]\n" +"cur.executemany(\"INSERT INTO test VALUES(?, ?)\", values)\n" +"con.create_window_function(\"sumint\", 1, WindowSumInt)\n" +"cur.execute(\"\"\"\n" +" SELECT x, sumint(y) OVER (\n" +" ORDER BY x ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING\n" +" ) AS sum_y\n" +" FROM test ORDER BY x\n" +"\"\"\")\n" +"print(cur.fetchall())\n" +"con.close()" + +#: ../../library/sqlite3.rst:892 +msgid "" +"Create a collation named *name* using the collating function *callable*. " +"*callable* is passed two :class:`string ` arguments, and it should " +"return an :class:`integer `:" +msgstr "" +"使用排序函数 *callable* 创建一个名为 *name* 的排序规则。 *callable* 被传递给两个 :class:`字符串 ` " +"参数,并且它应该返回一个 :class:`整数 `。" + +#: ../../library/sqlite3.rst:896 +msgid "``1`` if the first is ordered higher than the second" +msgstr "如果前者的排序高于后者则为 ``1``" + +#: ../../library/sqlite3.rst:897 +msgid "``-1`` if the first is ordered lower than the second" +msgstr "如果前者的排序低于后者则为 ``-1``" + +#: ../../library/sqlite3.rst:898 +msgid "``0`` if they are ordered equal" +msgstr "如果它们的顺序相同则为 ``0``" + +#: ../../library/sqlite3.rst:900 +msgid "The following example shows a reverse sorting collation:" +msgstr "下面的例子显示了一个反向排序的排序方法:" + +#: ../../library/sqlite3.rst:902 +msgid "" +"def collate_reverse(string1, string2):\n" +" if string1 == string2:\n" +" return 0\n" +" elif string1 < string2:\n" +" return 1\n" +" else:\n" +" return -1\n" +"\n" +"con = sqlite3.connect(\":memory:\")\n" +"con.create_collation(\"reverse\", collate_reverse)\n" +"\n" +"cur = con.execute(\"CREATE TABLE test(x)\")\n" +"cur.executemany(\"INSERT INTO test(x) VALUES(?)\", [(\"a\",), (\"b\",)])\n" +"cur.execute(\"SELECT x FROM test ORDER BY x COLLATE reverse\")\n" +"for row in cur:\n" +" print(row)\n" +"con.close()" +msgstr "" +"def collate_reverse(string1, string2):\n" +" if string1 == string2:\n" +" return 0\n" +" elif string1 < string2:\n" +" return 1\n" +" else:\n" +" return -1\n" +"\n" +"con = sqlite3.connect(\":memory:\")\n" +"con.create_collation(\"reverse\", collate_reverse)\n" +"\n" +"cur = con.execute(\"CREATE TABLE test(x)\")\n" +"cur.executemany(\"INSERT INTO test(x) VALUES(?)\", [(\"a\",), (\"b\",)])\n" +"cur.execute(\"SELECT x FROM test ORDER BY x COLLATE reverse\")\n" +"for row in cur:\n" +" print(row)\n" +"con.close()" + +#: ../../library/sqlite3.rst:928 +msgid "Remove a collation function by setting *callable* to ``None``." +msgstr "通过将 *callable* 设为 ``None`` 来移除一个排序规则函数。" + +#: ../../library/sqlite3.rst:930 +msgid "" +"The collation name can contain any Unicode character. Earlier, only ASCII " +"characters were allowed." +msgstr "排序规则的名称可以包含任意 Unicode 字符。在之前,只允许 ASCII 字符。" + +#: ../../library/sqlite3.rst:937 +msgid "" +"Call this method from a different thread to abort any queries that might be " +"executing on the connection. Aborted queries will raise an " +":exc:`OperationalError`." +msgstr "从其他的线程调用此方法以中止可能正在连接上执行的任何查询。被中止的查询将引发 :exc:`OperationalError`。" + +#: ../../library/sqlite3.rst:944 +msgid "" +"Register :term:`callable` *authorizer_callback* to be invoked for each " +"attempt to access a column of a table in the database. The callback should " +"return one of :const:`SQLITE_OK`, :const:`SQLITE_DENY`, or " +":const:`SQLITE_IGNORE` to signal how access to the column should be handled " +"by the underlying SQLite library." +msgstr "" +"注册 :term:`callable` *authorizer_callback* 用于在每次尝试访问数据库中表的某一列时被唤起。该回调应当返回 " +":const:`SQLITE_OK`、:const:`SQLITE_DENY` 或 :const:`SQLITE_IGNORE` 中的一个以提示下层 " +"SQLite 库应当如何处理对该列的访问。" + +#: ../../library/sqlite3.rst:951 +msgid "" +"The first argument to the callback signifies what kind of operation is to be" +" authorized. The second and third argument will be arguments or ``None`` " +"depending on the first argument. The 4th argument is the name of the " +"database (\"main\", \"temp\", etc.) if applicable. The 5th argument is the " +"name of the inner-most trigger or view that is responsible for the access " +"attempt or ``None`` if this access attempt is directly from input SQL code." +msgstr "" +"该回调的第一个参数指明哪种操作将被授权。第二个和第三个参数根据第一个参数的具体值将为传给操作的参数或为 ``None``。 " +"第四个参数如果适用则为数据库名称(\"main\", \"temp\" 等)。 " +"第五个参数是负责尝试访问的最内层触发器或视图的名称或者如果该尝试访问是直接来自输入的 SQL 代码的话则为 ``None``。" + +#: ../../library/sqlite3.rst:958 +msgid "" +"Please consult the SQLite documentation about the possible values for the " +"first argument and the meaning of the second and third argument depending on" +" the first one. All necessary constants are available in the :mod:`!sqlite3`" +" module." +msgstr "" +"请参阅 SQLite 文档了解第一个参数可能的值以及依赖于第一个参数的第二个和第三个参数的含义。所有必需的常量均在 :mod:`!sqlite3` " +"模块中可用。" + +#: ../../library/sqlite3.rst:962 +msgid "Passing ``None`` as *authorizer_callback* will disable the authorizer." +msgstr "将 ``None`` 作为 *authorizer_callback* 传入将禁用授权回调。" + +#: ../../library/sqlite3.rst:964 +msgid "Added support for disabling the authorizer using ``None``." +msgstr "增加对使用 ``None`` 禁用授权回调的支持。" + +#: ../../library/sqlite3.rst:967 +msgid "The only parameter is now positional-only." +msgstr "" + +#: ../../library/sqlite3.rst:973 +msgid "" +"Register :term:`callable` *progress_handler* to be invoked for every *n* " +"instructions of the SQLite virtual machine. This is useful if you want to " +"get called from SQLite during long-running operations, for example to update" +" a GUI." +msgstr "" +"注册 :term:`callable` *progress_handler* 以针对 SQLite 虚拟机的每 *n* 条指令被唤起。 " +"如果你想要在长时间运行的操作,例如更新 GUI 期间获得来自 SQLite 的调用这将很有用处。" + +#: ../../library/sqlite3.rst:978 +msgid "" +"If you want to clear any previously installed progress handler, call the " +"method with ``None`` for *progress_handler*." +msgstr "如果你想清除任何先前安装的进度处理器,可在调用该方法时传入 ``None`` 作为 *progress_handler*。" + +#: ../../library/sqlite3.rst:981 +msgid "" +"Returning a non-zero value from the handler function will terminate the " +"currently executing query and cause it to raise a :exc:`DatabaseError` " +"exception." +msgstr "从处理函数返回非零值将终止当前正在执行的查询并导致它引发 :exc:`DatabaseError` 异常。" + +#: ../../library/sqlite3.rst:985 ../../library/sqlite3.rst:1012 +msgid "The first parameter is now positional-only." +msgstr "" + +#: ../../library/sqlite3.rst:991 +msgid "" +"Register :term:`callable` *trace_callback* to be invoked for each SQL " +"statement that is actually executed by the SQLite backend." +msgstr "注册 :term:`callable` *trace_callback* 以针对 SQLite 后端实际执行的每条 SQL 语句被唤起。" + +#: ../../library/sqlite3.rst:994 +msgid "" +"The only argument passed to the callback is the statement (as :class:`str`) " +"that is being executed. The return value of the callback is ignored. Note " +"that the backend does not only run statements passed to the " +":meth:`Cursor.execute` methods. Other sources include the :ref:`transaction" +" management ` of the :mod:`!sqlite3` " +"module and the execution of triggers defined in the current database." +msgstr "" +"传给该回调的唯一参数是被执行的语句 (作为 :class:`str`)。回调的返回值将被忽略。请注意后端不仅会运行传给 " +":meth:`Cursor.execute` 方法的语句。其他来源还包括 :mod:`!sqlite3` 模块的 :ref:`事务管理 " +"` 以及在当前数据库中定义的触发器的执行。" + +#: ../../library/sqlite3.rst:1002 +msgid "Passing ``None`` as *trace_callback* will disable the trace callback." +msgstr "传入 ``None`` 作为 *trace_callback* 将禁用追踪回调。" + +#: ../../library/sqlite3.rst:1005 +msgid "" +"Exceptions raised in the trace callback are not propagated. As a development" +" and debugging aid, use :meth:`~sqlite3.enable_callback_tracebacks` to " +"enable printing tracebacks from exceptions raised in the trace callback." +msgstr "" +"在跟踪回调中产生的异常不会被传播。作为开发和调试的辅助手段,使用 :meth:`~sqlite3.enable_callback_tracebacks`" +" 来启用打印跟踪回调中产生的异常的回调。" + +#: ../../library/sqlite3.rst:1018 +msgid "" +"Enable the SQLite engine to load SQLite extensions from shared libraries if " +"*enabled* is ``True``; else, disallow loading SQLite extensions. SQLite " +"extensions can define new functions, aggregates or whole new virtual table " +"implementations. One well-known extension is the fulltext-search extension " +"distributed with SQLite." +msgstr "" +"如果 *enabled* 为 ``True`` 则允许 SQLite 从共享库加载 SQLite 扩展;否则,不允许加载 SQLite 扩展。 " +"SQLite 扩展可以定义新的函数、聚合或全新的虚拟表实现。一个知名的扩展是与随同 SQLite 一起分发的全文搜索扩展。" + +#: ../../library/sqlite3.rst:1027 +msgid "" +"The :mod:`!sqlite3` module is not built with loadable extension support by " +"default, because some platforms (notably macOS) have SQLite libraries which " +"are compiled without this feature. To get loadable extension support, you " +"must pass the :option:`--enable-loadable-sqlite-extensions` option to " +":program:`configure`." +msgstr "" +"在默认情况下 :mod:`!sqlite3` 模块的构建没有附带可加载扩展支持,因为某些平台(主要是 macOS)上的 SQLite " +"库在编译时未启用此特性。要获得可加载扩展支持,你必须将 :option:`--enable-loadable-sqlite-extensions` " +"选项传给 :program:`configure`。" + +#: ../../library/sqlite3.rst:1034 +msgid "" +"Raises an :ref:`auditing event ` ``sqlite3.enable_load_extension``" +" with arguments ``connection``, ``enabled``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``sqlite3.enable_load_extension`` 并附带参数 " +"``connection``, ``enabled``." + +#: ../../library/sqlite3.rst:1038 +msgid "Added the ``sqlite3.enable_load_extension`` auditing event." +msgstr "增加了 ``sqlite3.enable_load_extension`` 审计事件。" + +#: ../../library/sqlite3.rst:1044 +msgid "" +"con.enable_load_extension(True)\n" +"\n" +"# Load the fulltext search extension\n" +"con.execute(\"select load_extension('./fts3.so')\")\n" +"\n" +"# alternatively you can load the extension using an API call:\n" +"# con.load_extension(\"./fts3.so\")\n" +"\n" +"# disable extension loading again\n" +"con.enable_load_extension(False)\n" +"\n" +"# example from SQLite wiki\n" +"con.execute(\"CREATE VIRTUAL TABLE recipe USING fts3(name, ingredients)\")\n" +"con.executescript(\"\"\"\n" +" INSERT INTO recipe (name, ingredients) VALUES('broccoli stew', 'broccoli peppers cheese tomatoes');\n" +" INSERT INTO recipe (name, ingredients) VALUES('pumpkin stew', 'pumpkin onions garlic celery');\n" +" INSERT INTO recipe (name, ingredients) VALUES('broccoli pie', 'broccoli cheese onions flour');\n" +" INSERT INTO recipe (name, ingredients) VALUES('pumpkin pie', 'pumpkin sugar flour butter');\n" +" \"\"\")\n" +"for row in con.execute(\"SELECT rowid, name, ingredients FROM recipe WHERE name MATCH 'pie'\"):\n" +" print(row)" +msgstr "" +"con.enable_load_extension(True)\n" +"\n" +"# 加载 fts (fulltext search) 扩展\n" +"con.execute(\"select load_extension('./fts3.so')\")\n" +"\n" +"# 你也可以使用 API 调用来加载该扩展:\n" +"# con.load_extension(\"./fts3.so\")\n" +"\n" +"# 禁止扩展再次加载\n" +"con.enable_load_extension(False)\n" +"\n" +"# 来自 SQLite wiki 的示例\n" +"con.execute(\"CREATE VIRTUAL TABLE recipe USING fts3(name, ingredients)\")\n" +"con.executescript(\"\"\"\n" +" INSERT INTO recipe (name, ingredients) VALUES('broccoli stew', 'broccoli peppers cheese tomatoes');\n" +" INSERT INTO recipe (name, ingredients) VALUES('pumpkin stew', 'pumpkin onions garlic celery');\n" +" INSERT INTO recipe (name, ingredients) VALUES('broccoli pie', 'broccoli cheese onions flour');\n" +" INSERT INTO recipe (name, ingredients) VALUES('pumpkin pie', 'pumpkin sugar flour butter');\n" +" \"\"\")\n" +"for row in con.execute(\"SELECT rowid, name, ingredients FROM recipe WHERE name MATCH 'pie'\"):\n" +" print(row)" + +#: ../../library/sqlite3.rst:1070 +msgid "" +"Load an SQLite extension from a shared library. Enable extension loading " +"with :meth:`enable_load_extension` before calling this method." +msgstr "从共享库加载 SQLite 扩展。请在调用此方法前通过 :meth:`enable_load_extension` 来启用扩展加载。" + +#: ../../library/sqlite3.rst:1074 +msgid "The path to the SQLite extension." +msgstr "SQLite 扩展的路径。" + +#: ../../library/sqlite3.rst:1078 +msgid "" +"Entry point name. If ``None`` (the default), SQLite will come up with an " +"entry point name of its own; see the SQLite docs `Loading an Extension`_ for" +" details." +msgstr "" +"入口点名称。如果为 ``None`` (默认值),SQLite 将自行生成入口点名称;请参阅 SQLite 文档 `Loading an " +"Extension`_ 了解详情。" + +#: ../../library/sqlite3.rst:1087 +msgid "" +"Raises an :ref:`auditing event ` ``sqlite3.load_extension`` with " +"arguments ``connection``, ``path``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``sqlite3.load_extension`` 并附带参数 ``connection``," +" ``path``." + +#: ../../library/sqlite3.rst:1091 +msgid "Added the ``sqlite3.load_extension`` auditing event." +msgstr "增加了 ``sqlite3.load_extension`` 审计事件。" + +#: ../../library/sqlite3.rst:1094 +msgid "Added the *entrypoint* parameter." +msgstr "增加了 *entrypoint* 形参。" + +#: ../../library/sqlite3.rst:1101 +msgid "" +"Return an :term:`iterator` to dump the database as SQL source code. Useful " +"when saving an in-memory database for later restoration. Similar to the " +"``.dump`` command in the :program:`sqlite3` shell." +msgstr "" +"返回一个 :term:`iterator` 用来将数据库转储为 SQL 源代码。在保存内存数据库以便将来恢复时很有用处。类似于 " +":program:`sqlite3` shell 中的 ``.dump`` 命令。" + +#: ../../library/sqlite3.rst:1105 +msgid "" +"An optional ``LIKE`` pattern for database objects to dump, e.g. " +"``prefix_%``. If ``None`` (the default), all database objects will be " +"included." +msgstr "" +"可选的 ``LIKE`` 模式用于确定要转储的数据库对象,例如 ``prefix_%``。如为 ``None`` (默认值),则将包括所有数据库对象。" + +#: ../../library/sqlite3.rst:1114 +msgid "" +"# Convert file example.db to SQL dump file dump.sql\n" +"con = sqlite3.connect('example.db')\n" +"with open('dump.sql', 'w') as f:\n" +" for line in con.iterdump():\n" +" f.write('%s\\n' % line)\n" +"con.close()" +msgstr "" +"# 将文件 example.db 转换为 SQL 转储文件 dump.sql\n" +"con = sqlite3.connect('example.db')\n" +"with open('dump.sql', 'w') as f:\n" +" for line in con.iterdump():\n" +" f.write('%s\\n' % line)\n" +"con.close()" + +#: ../../library/sqlite3.rst:1125 ../../library/sqlite3.rst:1199 +msgid ":ref:`sqlite3-howto-encoding`" +msgstr ":ref:`sqlite3-howto-encoding`" + +#: ../../library/sqlite3.rst:1127 +msgid "Added the *filter* parameter." +msgstr "添加了 *filter* 形参。" + +#: ../../library/sqlite3.rst:1132 +msgid "Create a backup of an SQLite database." +msgstr "创建 SQLite 数据库的备份。" + +#: ../../library/sqlite3.rst:1134 +msgid "" +"Works even if the database is being accessed by other clients or " +"concurrently by the same connection." +msgstr "即使数据库是通过其他客户端访问或通过同一连接并发访问也是有效的。" + +#: ../../library/sqlite3.rst:1137 +msgid "The database connection to save the backup to." +msgstr "用于保存备份的数据库连接。" + +#: ../../library/sqlite3.rst:1140 +msgid "" +"The number of pages to copy at a time. If equal to or less than ``0``, the " +"entire database is copied in a single step. Defaults to ``-1``." +msgstr "每次要拷贝的页数。如果小于等于 ``0``,则一次性拷贝整个数据库。默认为 ``-1``。" + +#: ../../library/sqlite3.rst:1146 +msgid "" +"If set to a :term:`callable`, it is invoked with three integer arguments for" +" every backup iteration: the *status* of the last iteration, the *remaining*" +" number of pages still to be copied, and the *total* number of pages. " +"Defaults to ``None``." +msgstr "" +"如果设为一个 :term:`callable`,它将针对每次备份迭代附带三个整数参数被唤起:上次迭代的状态 *status*,待拷贝的剩余页数 " +"*remaining*,以及总页数 *total*。默认值为 ``None``。" + +#: ../../library/sqlite3.rst:1155 +msgid "" +"The name of the database to back up. Either ``\"main\"`` (the default) for " +"the main database, ``\"temp\"`` for the temporary database, or the name of a" +" custom database as attached using the ``ATTACH DATABASE`` SQL statement." +msgstr "要备份的数据库名称。可能为代表主数据库的 ``\\ DATABASE`` SQL 语句所附加的自定义数据库名称。" + +#: ../../library/sqlite3.rst:1162 +msgid "" +"The number of seconds to sleep between successive attempts to back up " +"remaining pages." +msgstr "连续尝试备份剩余页所要间隔的休眠秒数。" + +#: ../../library/sqlite3.rst:1166 +msgid "Example 1, copy an existing database into another:" +msgstr "示例 1,将现有数据库拷贝至另一个数据库:" + +#: ../../library/sqlite3.rst:1168 +msgid "" +"def progress(status, remaining, total):\n" +" print(f'Copied {total-remaining} of {total} pages...')\n" +"\n" +"src = sqlite3.connect('example.db')\n" +"dst = sqlite3.connect('backup.db')\n" +"with dst:\n" +" src.backup(dst, pages=1, progress=progress)\n" +"dst.close()\n" +"src.close()" +msgstr "" +"def progress(status, remaining, total):\n" +" print(f'已复制 {total} 页中的 {total-remaining} 页……')\n" +"\n" +"src = sqlite3.connect('example.db')\n" +"dst = sqlite3.connect('backup.db')\n" +"with dst:\n" +" src.backup(dst, pages=1, progress=progress)\n" +"dst.close()\n" +"src.close()" + +#: ../../library/sqlite3.rst:1185 +msgid "Example 2, copy an existing database into a transient copy:" +msgstr "示例 2,将现有数据库拷贝至一个临时副本:" + +#: ../../library/sqlite3.rst:1187 +msgid "" +"src = sqlite3.connect('example.db')\n" +"dst = sqlite3.connect(':memory:')\n" +"src.backup(dst)\n" +"dst.close()\n" +"src.close()" +msgstr "" +"src = sqlite3.connect('example.db')\n" +"dst = sqlite3.connect(':memory:')\n" +"src.backup(dst)\n" +"dst.close()\n" +"src.close()" + +#: ../../library/sqlite3.rst:1203 +msgid "Get a connection runtime limit." +msgstr "获取一个连接的运行时限制。" + +#: ../../library/sqlite3.rst:1205 +msgid "The `SQLite limit category`_ to be queried." +msgstr "要查询的 `SQLite limit category`_。" + +#: ../../library/sqlite3.rst:1210 ../../library/sqlite3.rst:1247 +msgid "If *category* is not recognised by the underlying SQLite library." +msgstr "如果 *category* 不能被下层的 SQLite 库所识别。" + +#: ../../library/sqlite3.rst:1213 +msgid "" +"Example, query the maximum length of an SQL statement for " +":class:`Connection` ``con`` (the default is 1000000000):" +msgstr "示例,查询 :class:`Connection` ``con`` 上一条 SQL 语句的最大长度(默认值为 1000000000):" + +#: ../../library/sqlite3.rst:1223 +msgid "" +">>> con.getlimit(sqlite3.SQLITE_LIMIT_SQL_LENGTH)\n" +"1000000000" +msgstr "" +">>> con.getlimit(sqlite3.SQLITE_LIMIT_SQL_LENGTH)\n" +"1000000000" + +#: ../../library/sqlite3.rst:1233 +msgid "" +"Set a connection runtime limit. Attempts to increase a limit above its hard " +"upper bound are silently truncated to the hard upper bound. Regardless of " +"whether or not the limit was changed, the prior value of the limit is " +"returned." +msgstr "设置连接运行时限制。如果试图将限制提高到超出强制上界则会静默地截短到强制上界。无论限制值是否被修改,都将返回之前的限制值。" + +#: ../../library/sqlite3.rst:1238 +msgid "The `SQLite limit category`_ to be set." +msgstr "要设置的 `SQLite limit category`_。" + +#: ../../library/sqlite3.rst:1241 +msgid "" +"The value of the new limit. If negative, the current limit is unchanged." +msgstr "新的限制值。如为负值,当前限制将保持不变。" + +#: ../../library/sqlite3.rst:1250 +msgid "" +"Example, limit the number of attached databases to 1 for :class:`Connection`" +" ``con`` (the default limit is 10):" +msgstr "示例,将 :class:`Connection` ``con`` 上附加的数据库数量限制为 1(默认限制为 10):" + +#: ../../library/sqlite3.rst:1253 +msgid "" +">>> con.setlimit(sqlite3.SQLITE_LIMIT_ATTACHED, 1)\n" +"10\n" +">>> con.getlimit(sqlite3.SQLITE_LIMIT_ATTACHED)\n" +"1" +msgstr "" +">>> con.setlimit(sqlite3.SQLITE_LIMIT_ATTACHED, 1)\n" +"10\n" +">>> con.getlimit(sqlite3.SQLITE_LIMIT_ATTACHED)\n" +"1" + +#: ../../library/sqlite3.rst:1271 +msgid "Query a boolean connection configuration option." +msgstr "查询一个布尔类型的连接配置选项。" + +#: ../../library/sqlite3.rst:1273 ../../library/sqlite3.rst:1284 +msgid "A :ref:`SQLITE_DBCONFIG code `." +msgstr "一个 :ref:`SQLITE_DBCONFIG 代码 `。" + +#: ../../library/sqlite3.rst:1282 +msgid "Set a boolean connection configuration option." +msgstr "设置一个布尔类型的连接配置选项。" + +#: ../../library/sqlite3.rst:1287 +msgid "" +"``True`` if the configuration option should be enabled (default); ``False`` " +"if it should be disabled." +msgstr "如果该配置选项应当启用则为 ``True`` (默认值);如果应当禁用则为 ``False``。" + +#: ../../library/sqlite3.rst:1295 +msgid "" +"Serialize a database into a :class:`bytes` object. For an ordinary on-disk " +"database file, the serialization is just a copy of the disk file. For an " +"in-memory database or a \"temp\" database, the serialization is the same " +"sequence of bytes which would be written to disk if that database were " +"backed up to disk." +msgstr "" +"将一个数据库序列化为 :class:`bytes` 对象。对于普通的磁盘数据库文件,序列化就是磁盘文件的一个副本。 " +"对于内存数据库或“临时”数据库,序列化就是当数据库备份到磁盘时要写入到磁盘的相同字节序列。" + +#: ../../library/sqlite3.rst:1301 +msgid "The database name to be serialized. Defaults to ``\"main\"``." +msgstr "要序列化的数据库名称。 默认为 ``\"main\"``。" + +#: ../../library/sqlite3.rst:1309 +msgid "" +"This method is only available if the underlying SQLite library has the " +"serialize API." +msgstr "此方法仅在下层 SQLite 库具有序列化 API 时可用。" + +#: ../../library/sqlite3.rst:1317 +msgid "" +"Deserialize a :meth:`serialized ` database into a " +":class:`Connection`. This method causes the database connection to " +"disconnect from database *name*, and reopen *name* as an in-memory database " +"based on the serialization contained in *data*." +msgstr "" +"将一个 :meth:`已序列化的 ` 数据库反序列化至 :class:`Connection`。此方法将导致数据库连接从 " +"*name* 数据库断开,并基于包含在 *data* 中的序列化数据将 *name* 作为内存数据库重新打开。" + +#: ../../library/sqlite3.rst:1323 +msgid "A serialized database." +msgstr "已序列化的数据库。" + +#: ../../library/sqlite3.rst:1326 +msgid "The database name to deserialize into. Defaults to ``\"main\"``." +msgstr "反序列化的目标数据库名称。 默认为 ``\"main\"``。" + +#: ../../library/sqlite3.rst:1330 +msgid "" +"If the database connection is currently involved in a read transaction or a " +"backup operation." +msgstr "如果当前数据库连接正在执行读取事务或备份操作。" + +#: ../../library/sqlite3.rst:1334 +msgid "If *data* does not contain a valid SQLite database." +msgstr "如果 *data* 不包含有效的 SQLite 数据库。" + +#: ../../library/sqlite3.rst:1337 +msgid "If :func:`len(data) ` is larger than ``2**63 - 1``." +msgstr "如果 :func:`len(data) ` 大于 ``2**63 - 1``。" + +#: ../../library/sqlite3.rst:1342 +msgid "" +"This method is only available if the underlying SQLite library has the " +"deserialize API." +msgstr "此方法仅在下层的 SQLite 库具有反序列化 API 时可用。" + +#: ../../library/sqlite3.rst:1349 +msgid "" +"This attribute controls :pep:`249`-compliant transaction behaviour. " +":attr:`!autocommit` has three allowed values:" +msgstr "该属性控制符合 :pep:`249` 的事务行为。 :attr:`!autocommit` 有三个可用的值:" + +#: ../../library/sqlite3.rst:1352 +msgid "" +"``False``: Select :pep:`249`-compliant transaction behaviour, implying that " +":mod:`!sqlite3` ensures a transaction is always open. Use :meth:`commit` and" +" :meth:`rollback` to close transactions." +msgstr "" +"``False``: 选择符合 :pep:`249` 的事务行为,即 :mod:`!sqlite3` 将保证总是开启一个事务。使用 " +":meth:`commit` 和 :meth:`rollback` 来关闭事务。" + +#: ../../library/sqlite3.rst:1356 +msgid "This is the recommended value of :attr:`!autocommit`." +msgstr "这是 :attr:`!autocommit` 推荐的取值。" + +#: ../../library/sqlite3.rst:1358 +msgid "" +"``True``: Use SQLite's `autocommit mode`_. :meth:`commit` and " +":meth:`rollback` have no effect in this mode." +msgstr "" +"``True``: 使用 SQLite 的 `autocommit mode`_。在此模式下 :meth:`commit` 和 " +":meth:`rollback` 将没有任何效果。" + +#: ../../library/sqlite3.rst:1361 +msgid "" +":data:`LEGACY_TRANSACTION_CONTROL`: Pre-Python 3.12 " +"(non-:pep:`249`-compliant) transaction control. See :attr:`isolation_level` " +"for more details." +msgstr "" +":data:`LEGACY_TRANSACTION_CONTROL`: Python 3.12 之前 (不符合 :pep:`249`) 的事务控制。 " +"请参阅 :attr:`isolation_level` 了解详情。" + +#: ../../library/sqlite3.rst:1365 +msgid "This is currently the default value of :attr:`!autocommit`." +msgstr "这是 :attr:`!autocommit` 当前的默认值。" + +#: ../../library/sqlite3.rst:1367 +msgid "" +"Changing :attr:`!autocommit` to ``False`` will open a new transaction, and " +"changing it to ``True`` will commit any pending transaction." +msgstr "" +"将 :attr:`!autocommit` 更改为 ``False`` 将开启一个新事务,而将其更改为 ``True`` 将提交任何待处理事务。" + +#: ../../library/sqlite3.rst:1370 +msgid "See :ref:`sqlite3-transaction-control-autocommit` for more details." +msgstr "详情参见 :ref:`sqlite3-transaction-control-autocommit`。" + +#: ../../library/sqlite3.rst:1374 +msgid "" +"The :attr:`isolation_level` attribute has no effect unless " +":attr:`autocommit` is :data:`LEGACY_TRANSACTION_CONTROL`." +msgstr "" +"除非 :attr:`autocommit` 为 :data:`LEGACY_TRANSACTION_CONTROL` 否则 " +":attr:`isolation_level` 属性将不起作用。" + +#: ../../library/sqlite3.rst:1381 +msgid "" +"This read-only attribute corresponds to the low-level SQLite `autocommit " +"mode`_." +msgstr "这个只读属性对应于低层级的 SQLite `autocommit mode`_。" + +#: ../../library/sqlite3.rst:1384 +msgid "" +"``True`` if a transaction is active (there are uncommitted changes), " +"``False`` otherwise." +msgstr "如果一个事务处于活动状态(有未提交的更改)则为 ``True``,否则为 ``False``。" + +#: ../../library/sqlite3.rst:1391 +msgid "" +"Controls the :ref:`legacy transaction handling mode ` of :mod:`!sqlite3`. If set to ``None``, " +"transactions are never implicitly opened. If set to one of ``\"DEFERRED\"``," +" ``\"IMMEDIATE\"``, or ``\"EXCLUSIVE\"``, corresponding to the underlying " +"`SQLite transaction behaviour`_, :ref:`implicit transaction management " +"` is performed." +msgstr "" +"控制 :mod:`!sqlite3` 的 :ref:`旧式事务处理模式 `。 如果设为 ``None``,则绝不会隐式地开启事务。 如果设为 ``\"DEFERRED\"``, ``\"IMMEDIATE\"``" +" 或 ``\"EXCLUSIVE\"`` 中的一个,即与下层的 `SQLite transaction behaviour`_ 对应,则会执行 " +":ref:`隐式事务管理 `。" + +#: ../../library/sqlite3.rst:1399 +msgid "" +"If not overridden by the *isolation_level* parameter of :func:`connect`, the" +" default is ``\"\"``, which is an alias for ``\"DEFERRED\"``." +msgstr "" +"如果未被 :func:`connect` 的 *isolation_level* 形参覆盖,则默认为 ``\"\"``,这是 " +"``\"DEFERRED\"`` 的一个别名。" + +#: ../../library/sqlite3.rst:1404 +msgid "" +"Using :attr:`autocommit` to control transaction handling is recommended over" +" using :attr:`!isolation_level`. :attr:`!isolation_level` has no effect " +"unless :attr:`autocommit` is set to :data:`LEGACY_TRANSACTION_CONTROL` (the " +"default)." +msgstr "" +"建议使用 :attr:`autocommit` 来控制事务处理而不是使用 :attr:`!isolation_level`。除非 " +":attr:`autocommit` 设为 :data:`LEGACY_TRANSACTION_CONTROL` (默认值) 否则 " +":attr:`!isolation_level` 将不起作用。" + +#: ../../library/sqlite3.rst:1411 +msgid "" +"The initial :attr:`~Cursor.row_factory` for :class:`Cursor` objects created " +"from this connection. Assigning to this attribute does not affect the " +":attr:`!row_factory` of existing cursors belonging to this connection, only " +"new ones. Is ``None`` by default, meaning each row is returned as a " +":class:`tuple`." +msgstr "" +"针对从该连接创建的 :class:`Cursor` 对象的初始 :attr:`~Cursor.row_factory`。 " +"为该属性赋值不会影响属于该连接的现有游标的 :attr:`!row_factory`,只影响新的游标。默认为 ``None``,表示将每一行作为 " +":class:`tuple` 返回。" + +#: ../../library/sqlite3.rst:1418 ../../library/sqlite3.rst:1710 +#: ../../library/sqlite3.rst:1733 +msgid "See :ref:`sqlite3-howto-row-factory` for more details." +msgstr "详情参见 :ref:`sqlite3-howto-row-factory`。" + +#: ../../library/sqlite3.rst:1422 +msgid "" +"A :term:`callable` that accepts a :class:`bytes` parameter and returns a " +"text representation of it. The callable is invoked for SQLite values with " +"the ``TEXT`` data type. By default, this attribute is set to :class:`str`." +msgstr "" +"一个接受 :class:`bytes` 形参并返回其文本表示形式的 :term:`callable`。该可调用对象将针对数据类型为 ``TEXT`` 的" +" SQLite 值被唤起。在默认情况下,该属性将被设为 :class:`str`。" + +#: ../../library/sqlite3.rst:1427 +msgid "See :ref:`sqlite3-howto-encoding` for more details." +msgstr "请参阅 :ref:`sqlite3-howto-encoding` 了解详情。" + +#: ../../library/sqlite3.rst:1431 +msgid "" +"Return the total number of database rows that have been modified, inserted, " +"or deleted since the database connection was opened." +msgstr "返回自打开数据库连接以来已修改、插入或删除的数据库行的总数。" + +#: ../../library/sqlite3.rst:1438 +msgid "Cursor objects" +msgstr "游标对象" + +#: ../../library/sqlite3.rst:1440 +msgid "" +"A ``Cursor`` object represents a `database cursor`_ which is used to execute" +" SQL statements, and manage the context of a fetch operation. Cursors are " +"created using :meth:`Connection.cursor`, or by using any of the " +":ref:`connection shortcut methods `." +msgstr "" +"一个代表被用于执行 SQL 语句,并管理获取操作的上下文的 `database cursor`_ 的 ``Cursor`` 对象。游标对象是使用 " +":meth:`Connection.cursor`,或是通过使用任何 :ref:`连接快捷方法 ` 来创建的。" + +#: ../../library/sqlite3.rst:1447 +msgid "" +"Cursor objects are :term:`iterators `, meaning that if you " +":meth:`~Cursor.execute` a ``SELECT`` query, you can simply iterate over the " +"cursor to fetch the resulting rows:" +msgstr "" +"Cursor 对象属于 :term:`迭代器 `,这意味着如果你通过 :meth:`~Cursor.execute` 来执行 " +"``SELECT`` 查询,你可以简单地迭代游标来获取结果行:" + +#: ../../library/sqlite3.rst:1458 +msgid "" +"for row in cur.execute(\"SELECT t FROM data\"):\n" +" print(row)" +msgstr "" +"for row in cur.execute(\"SELECT t FROM data\"):\n" +" print(row)" + +#: ../../library/sqlite3.rst:1472 +msgid "A :class:`Cursor` instance has the following attributes and methods." +msgstr ":class:`Cursor` 游标实例具有以下属性和方法。" + +#: ../../library/sqlite3.rst:1479 +msgid "" +"Execute a single SQL statement, optionally binding Python values using " +":ref:`placeholders `." +msgstr "执行一条 SQL 语句,可以选择使用 :ref:`占位符 ` 来绑定 Python 值。" + +#: ../../library/sqlite3.rst:1483 +msgid "A single SQL statement." +msgstr "一条 SQL 语句。" + +#: ../../library/sqlite3.rst:1486 +msgid "" +"Python values to bind to placeholders in *sql*. A :class:`!dict` if named " +"placeholders are used. A :term:`!sequence` if unnamed placeholders are used." +" See :ref:`sqlite3-placeholders`." +msgstr "" +"要绑定到 *sql* 中占位符的 Python 值。如果使用命名占位符则会使用 :class:`!dict`。如果使用非命名占位符则会使用 " +":term:`!sequence`。参见 :ref:`sqlite3-placeholders`。" + +#: ../../library/sqlite3.rst:1493 +msgid "" +"When *sql* contains more than one SQL statement. When :ref:`named " +"placeholders ` are used and *parameters* is a sequence" +" instead of a :class:`dict`." +msgstr "" +"当 *sql* 包含多个 SQL 语句。当使用了 :ref:`命名占位符 ` 且 *parameters* " +"是一个序列而不是 :class:`dict`。" + +#: ../../library/sqlite3.rst:1498 +msgid "" +"If :attr:`~Connection.autocommit` is :data:`LEGACY_TRANSACTION_CONTROL`, " +":attr:`~Connection.isolation_level` is not ``None``, *sql* is an ``INSERT``," +" ``UPDATE``, ``DELETE``, or ``REPLACE`` statement, and there is no open " +"transaction, a transaction is implicitly opened before executing *sql*." +msgstr "" +"如果 :attr:`~Connection.autocommit` 为 " +":data:`LEGACY_TRANSACTION_CONTROL`,:attr:`~Connection.isolation_level` 不为 " +"``None``,*sql* 为一条 ``INSERT``, ``UPDATE``, ``DELETE`` 或 ``REPLACE`` " +"语句,并且没有开启事务,则会在执行 *sql* 之前隐式地开启事务。" + +#: ../../library/sqlite3.rst:1507 +msgid "" +":exc:`ProgrammingError` is emitted if :ref:`named placeholders " +"` are used and *parameters* is a sequence instead of a" +" :class:`dict`." +msgstr "" +"如果使用了 :ref:`命名占位符 ` 且 *parameters* 是一个序列而不是 " +":class:`dict` 则会发出 :exc:`ProgrammingError`。" + +#: ../../library/sqlite3.rst:1511 +msgid "Use :meth:`executescript` to execute multiple SQL statements." +msgstr "使用 :meth:`executescript` 来执行多条 SQL 语句。" + +#: ../../library/sqlite3.rst:1515 +msgid "" +"For every item in *parameters*, repeatedly execute the :ref:`parameterized " +"` :abbr:`DML (Data Manipulation Language)` SQL " +"statement *sql*." +msgstr "" +"对于 *parameters* 中的每一项,重复执行 :ref:`参数化的 ` :abbr:`DML " +"(Data Manipulation Language)` SQL 语句 *sql*。" + +#: ../../library/sqlite3.rst:1519 +msgid "" +"Uses the same implicit transaction handling as :meth:`~Cursor.execute`." +msgstr "使用与 :meth:`~Cursor.execute` 相同的隐式事务处理。" + +#: ../../library/sqlite3.rst:1521 +msgid "A single SQL DML statement." +msgstr "一条 SQL DML 语句。" + +#: ../../library/sqlite3.rst:1524 +msgid "" +"An :term:`!iterable` of parameters to bind with the placeholders in *sql*. " +"See :ref:`sqlite3-placeholders`." +msgstr "" +"一个用来绑定到 *sql* 中的占位符的形参的 :term:`!iterable`。参见 :ref:`sqlite3-placeholders`。" + +#: ../../library/sqlite3.rst:1530 +msgid "" +"When *sql* contains more than one SQL statement or is not a DML statement, " +"When :ref:`named placeholders ` are used and the items" +" in *parameters* are sequences instead of :class:`dict`\\s." +msgstr "" +"当 *sql* 包含多个 SQL 语句或者不是一个 DML 语句时,当使用了 :ref:`命名占位符 ` " +"并且 *parameters* 中的条目是序列而不是 :class:`dict` 时。" + +#: ../../library/sqlite3.rst:1538 +msgid "" +"rows = [\n" +" (\"row1\",),\n" +" (\"row2\",),\n" +"]\n" +"# cur is an sqlite3.Cursor object\n" +"cur.executemany(\"INSERT INTO data VALUES(?)\", rows)" +msgstr "" +"rows = [\n" +" (\"row1\",),\n" +" (\"row2\",),\n" +"]\n" +"# cur 是一个 sqlite3.Cursor 对象\n" +"cur.executemany(\"INSERT INTO data VALUES(?)\", rows)" + +#: ../../library/sqlite3.rst:1553 +msgid "" +"Any resulting rows are discarded, including DML statements with `RETURNING " +"clauses`_." +msgstr "任何结果行都将被丢弃,包括带有 `RETURNING clauses`_ 的 DML 语句。" + +#: ../../library/sqlite3.rst:1560 +msgid "" +":exc:`ProgrammingError` is emitted if :ref:`named placeholders " +"` are used and the items in *parameters* are sequences" +" instead of :class:`dict`\\s." +msgstr "" +"如果使用了 :ref:`命名占位符 ` 并且 *parameters* 中的条目是序列而不是 " +":class:`dict` 时则会发出 :exc:`ProgrammingError`。" + +#: ../../library/sqlite3.rst:1567 +msgid "" +"Execute the SQL statements in *sql_script*. If the " +":attr:`~Connection.autocommit` is :data:`LEGACY_TRANSACTION_CONTROL` and " +"there is a pending transaction, an implicit ``COMMIT`` statement is executed" +" first. No other implicit transaction control is performed; any transaction " +"control must be added to *sql_script*." +msgstr "" +"执行 *sql_script* 中的 SQL 语句。如果 :attr:`~Connection.autocommit` 为 " +":data:`LEGACY_TRANSACTION_CONTROL` 并且存在待处理的事务,则首先隐式执行一条 ``COMMIT`` 语句。 " +"不会执行其他隐式事务控制;任何事务控制都必须添加至 *sql_script*。" + +#: ../../library/sqlite3.rst:1575 +msgid "*sql_script* must be a :class:`string `." +msgstr "*sql_script* 必须为 :class:`字符串 `。" + +#: ../../library/sqlite3.rst:1579 +msgid "" +"# cur is an sqlite3.Cursor object\n" +"cur.executescript(\"\"\"\n" +" BEGIN;\n" +" CREATE TABLE person(firstname, lastname, age);\n" +" CREATE TABLE book(title, author, published);\n" +" CREATE TABLE publisher(name, address);\n" +" COMMIT;\n" +"\"\"\")" +msgstr "" +"# cur 是一个 sqlite3.Cursor 对象\n" +"cur.executescript(\"\"\"\n" +" BEGIN;\n" +" CREATE TABLE person(firstname, lastname, age);\n" +" CREATE TABLE book(title, author, published);\n" +" CREATE TABLE publisher(name, address);\n" +" COMMIT;\n" +"\"\"\")" + +#: ../../library/sqlite3.rst:1592 +msgid "" +"If :attr:`~Cursor.row_factory` is ``None``, return the next row query result" +" set as a :class:`tuple`. Else, pass it to the row factory and return its " +"result. Return ``None`` if no more data is available." +msgstr "" +"如果 :attr:`~Cursor.row_factory` 为 ``None``,则将下一行查询结果集作为 :class:`tuple` 返回。 " +"否则,将其传给指定的行工厂函数并返回函数结果。如果没有更多可用数据则返回 ``None``。" + +#: ../../library/sqlite3.rst:1600 +msgid "" +"Return the next set of rows of a query result as a :class:`list`. Return an " +"empty list if no more rows are available." +msgstr "将下一个多行查询结果集作为 :class:`list` 返回。如果没有更多可用行时则返回一个空列表。" + +#: ../../library/sqlite3.rst:1603 +msgid "" +"The number of rows to fetch per call is specified by the *size* parameter. " +"If *size* is not given, :attr:`arraysize` determines the number of rows to " +"be fetched. If fewer than *size* rows are available, as many rows as are " +"available are returned." +msgstr "" +"每次调用要获取的行数是由 *size* 形参指定的。如果未指定 *size*,则由 :attr:`arraysize` 确定要获取的行数。 " +"如果可用的行少于 *size*,则返回可用的行数。" + +#: ../../library/sqlite3.rst:1609 +msgid "" +"Note there are performance considerations involved with the *size* " +"parameter. For optimal performance, it is usually best to use the arraysize " +"attribute. If the *size* parameter is used, then it is best for it to retain" +" the same value from one :meth:`fetchmany` call to the next." +msgstr "" +"请注意 *size* 形参会涉及到性能方面的考虑。为了获得优化的性能,通常最好是使用 arraysize 属性。如果使用 *size* " +"形参,则最好在从一个 :meth:`fetchmany` 调用到下一个调用之间保持相同的值。" + +#: ../../library/sqlite3.rst:1614 +msgid "Negative *size* values are rejected by raising :exc:`ValueError`." +msgstr "负的 *size* 值将被拒绝并引发 :exc:`ValueError`。" + +#: ../../library/sqlite3.rst:1619 +msgid "" +"Return all (remaining) rows of a query result as a :class:`list`. Return an " +"empty list if no rows are available. Note that the :attr:`arraysize` " +"attribute can affect the performance of this operation." +msgstr "" +"将全部(剩余的)查询结果行作为 :class:`list` 返回。如果没有可用的行则返回空列表。请注意 :attr:`arraysize` " +"属性可能会影响此操作的性能。" + +#: ../../library/sqlite3.rst:1626 +msgid "Close the cursor now (rather than whenever ``__del__`` is called)." +msgstr "立即关闭 cursor(而不是在当 ``__del__`` 被调用的时候)。" + +#: ../../library/sqlite3.rst:1628 +msgid "" +"The cursor will be unusable from this point forward; a " +":exc:`ProgrammingError` exception will be raised if any operation is " +"attempted with the cursor." +msgstr "" +"从这一时刻起该 cursor 将不再可用,如果再尝试用该 cursor 执行任何操作将引发 :exc:`ProgrammingError` 异常。" + +#: ../../library/sqlite3.rst:1633 ../../library/sqlite3.rst:1637 +msgid "Required by the DB-API. Does nothing in :mod:`!sqlite3`." +msgstr "DB-API 要求的方法。在 :mod:`!sqlite3` 不做任何事情。" + +#: ../../library/sqlite3.rst:1641 +msgid "" +"Read/write attribute that controls the number of rows returned by " +":meth:`fetchmany`. The default value is 1 which means a single row would be " +"fetched per call." +msgstr "用于控制 :meth:`fetchmany` 返回行数的可读取/写入属性。该属性的默认值为 1,表示每次调用将获取单独一行。" + +#: ../../library/sqlite3.rst:1644 +msgid "Negative values are rejected by raising :exc:`ValueError`." +msgstr "负值将被拒绝并引发 :exc:`ValueError`。" + +#: ../../library/sqlite3.rst:1649 +msgid "" +"Read-only attribute that provides the SQLite database :class:`Connection` " +"belonging to the cursor. A :class:`Cursor` object created by calling " +":meth:`con.cursor() ` will have a :attr:`connection` " +"attribute that refers to *con*:" +msgstr "" +"提供属于该游标的 SQLite :class:`Connection` 的只读属性。通过调用 :meth:`con.cursor() " +"` 创建的 :class:`Cursor` 对象将具有一个指向 *con* 的 " +":attr:`connection` 属性:" + +#: ../../library/sqlite3.rst:1654 +msgid "" +">>> con = sqlite3.connect(\":memory:\")\n" +">>> cur = con.cursor()\n" +">>> cur.connection == con\n" +"True\n" +">>> con.close()" +msgstr "" +">>> con = sqlite3.connect(\":memory:\")\n" +">>> cur = con.cursor()\n" +">>> cur.connection == con\n" +"True\n" +">>> con.close()" + +#: ../../library/sqlite3.rst:1664 +msgid "" +"Read-only attribute that provides the column names of the last query. To " +"remain compatible with the Python DB API, it returns a 7-tuple for each " +"column where the last six items of each tuple are ``None``." +msgstr "" +"提供上一次查询的列名称的只读属性。为了与 Python DB API 保持兼容,它会为每个列返回一个 7 元组,每个元组的最后六个条目均为 " +"``None``." + +#: ../../library/sqlite3.rst:1668 +msgid "It is set for ``SELECT`` statements without any matching rows as well." +msgstr "对于没有任何匹配行的 ``SELECT`` 语句同样会设置该属性。" + +#: ../../library/sqlite3.rst:1672 +msgid "" +"Read-only attribute that provides the row id of the last inserted row. It is" +" only updated after successful ``INSERT`` or ``REPLACE`` statements using " +"the :meth:`execute` method. For other statements, after :meth:`executemany`" +" or :meth:`executescript`, or if the insertion failed, the value of " +"``lastrowid`` is left unchanged. The initial value of ``lastrowid`` is " +"``None``." +msgstr "" +"提供上一次插入的行的行 ID 的只读属性。它只会在使用 :meth:`execute` 方法的 ``INSERT`` 或 ``REPLACE`` " +"语句成功后被更新。对于其他语句,则在 :meth:`executemany` 或 " +":meth:`executescript`,或者如果插入失败,``lastrowid`` 的值将保持不变。``lastrowid`` 的初始值为 " +"``None``." + +#: ../../library/sqlite3.rst:1680 +msgid "Inserts into ``WITHOUT ROWID`` tables are not recorded." +msgstr "对 ``WITHOUT ROWID`` 表的插入不被记录。" + +#: ../../library/sqlite3.rst:1682 +msgid "Added support for the ``REPLACE`` statement." +msgstr "增加了 ``REPLACE`` 语句的支持。" + +#: ../../library/sqlite3.rst:1687 +msgid "" +"Read-only attribute that provides the number of modified rows for " +"``INSERT``, ``UPDATE``, ``DELETE``, and ``REPLACE`` statements; is ``-1`` " +"for other statements, including :abbr:`CTE (Common Table Expression)` " +"queries. It is only updated by the :meth:`execute` and :meth:`executemany` " +"methods, after the statement has run to completion. This means that any " +"resulting rows must be fetched in order for :attr:`!rowcount` to be updated." +msgstr "" +"提供 ``INSERT``, ``UPDATE``, ``DELETE`` 和 ``REPLACE`` 语句所修改行数的只读属性;对于其他语句则为 " +"``-1``,包括 :abbr:`CTE (Common Table Expression)` 查询。只有 :meth:`execute` 和 " +":meth:`executemany` 方法会在语句运行完成后更新此属性。这意味着任何结果行都必须按顺序被提取以使 :attr:`!rowcount` " +"获得更新。" + +#: ../../library/sqlite3.rst:1698 +msgid "" +"Control how a row fetched from this :class:`!Cursor` is represented. If " +"``None``, a row is represented as a :class:`tuple`. Can be set to the " +"included :class:`sqlite3.Row`; or a :term:`callable` that accepts two " +"arguments, a :class:`Cursor` object and the :class:`!tuple` of row values, " +"and returns a custom object representing an SQLite row." +msgstr "" +"控制从该 :class:`!Cursor` 获取的行的表示形式。如为 ``None``,一行将表示为一个 :class:`tuple`。可设置形式包括 " +":class:`sqlite3.Row`;或者接受两个参数的 :term:`callable`,一个 :class:`Cursor` " +"对象和由行内所有值组成的 :class:`!tuple`,以及返回代表一个 SQLite 行的自定义对象。" + +#: ../../library/sqlite3.rst:1705 +msgid "" +"Defaults to what :attr:`Connection.row_factory` was set to when the " +":class:`!Cursor` was created. Assigning to this attribute does not affect " +":attr:`Connection.row_factory` of the parent connection." +msgstr "" +"默认为当 :class:`!Cursor` 被创建时设置的 :attr:`Connection.row_factory`。对该属性赋值不会影响父连接的 " +":attr:`Connection.row_factory`." + +#: ../../library/sqlite3.rst:1721 +msgid "Row objects" +msgstr "Row 对象" + +#: ../../library/sqlite3.rst:1725 +msgid "" +"A :class:`!Row` instance serves as a highly optimized " +":attr:`~Connection.row_factory` for :class:`Connection` objects. It supports" +" iteration, equality testing, :func:`len`, and :term:`mapping` access by " +"column name and index." +msgstr "" +"一个被用作 :class:`Connection` 对象的高度优化的 :attr:`~Connection.row_factory` 的 " +":class:`!Row` 实例。它支持迭代、相等性检测、:func:`len` 以及基于列名称的 :term:`mapping` 访问和数字序列。" + +#: ../../library/sqlite3.rst:1730 +msgid "" +"Two :class:`!Row` objects compare equal if they have identical column names " +"and values." +msgstr "两个 :class:`!Row` 对象如果具有相同的列名称和值则比较结果相等。" + +#: ../../library/sqlite3.rst:1737 +msgid "" +"Return a :class:`list` of column names as :class:`strings `. " +"Immediately after a query, it is the first member of each tuple in " +":attr:`Cursor.description`." +msgstr "" +"在一次查询之后,立即将由列名称组成的 :class:`list` 作为 :class:`字符串 ` 返回,它是 " +":attr:`Cursor.description` 中每个元组的第一个成员。" + +#: ../../library/sqlite3.rst:1741 +msgid "Added support of slicing." +msgstr "添加了对切片操作的支持。" + +#: ../../library/sqlite3.rst:1748 +msgid "Blob objects" +msgstr "Blob 对象" + +#: ../../library/sqlite3.rst:1754 +msgid "" +"A :class:`Blob` instance is a :term:`file-like object` that can read and " +"write data in an SQLite :abbr:`BLOB (Binary Large OBject)`. Call " +":func:`len(blob) ` to get the size (number of bytes) of the blob. Use " +"indices and :term:`slices ` for direct access to the blob data." +msgstr "" +":class:`Blob` 实例是可以读写 SQLite :abbr:`BLOB (Binary Large OBject)` 数据的 " +":term:`file-like object`。调用 :func:`len(blob) ` 可得到 blob 的大小(字节数)。 " +"请使用索引和 :term:`切片 ` 来直接访问 blob 数据。" + +#: ../../library/sqlite3.rst:1759 +msgid "" +"Use the :class:`Blob` as a :term:`context manager` to ensure that the blob " +"handle is closed after use." +msgstr "将 :class:`Blob` 作为 :term:`context manager` 使用以确保使用结束后 blob 句柄自动关闭。" + +#: ../../library/sqlite3.rst:1762 +msgid "" +"con = sqlite3.connect(\":memory:\")\n" +"con.execute(\"CREATE TABLE test(blob_col blob)\")\n" +"con.execute(\"INSERT INTO test(blob_col) VALUES(zeroblob(13))\")\n" +"\n" +"# Write to our blob, using two write operations:\n" +"with con.blobopen(\"test\", \"blob_col\", 1) as blob:\n" +" blob.write(b\"hello, \")\n" +" blob.write(b\"world.\")\n" +" # Modify the first and last bytes of our blob\n" +" blob[0] = ord(\"H\")\n" +" blob[-1] = ord(\"!\")\n" +"\n" +"# Read the contents of our blob\n" +"with con.blobopen(\"test\", \"blob_col\", 1) as blob:\n" +" greeting = blob.read()\n" +"\n" +"print(greeting) # outputs \"b'Hello, world!'\"\n" +"con.close()" +msgstr "" +"con = sqlite3.connect(\":memory:\")\n" +"con.execute(\"CREATE TABLE test(blob_col blob)\")\n" +"con.execute(\"INSERT INTO test(blob_col) VALUES(zeroblob(13))\")\n" +"\n" +"# 写入到我们的 blob,使用两次 write 操作:\n" +"with con.blobopen(\"test\", \"blob_col\", 1) as blob:\n" +" blob.write(b\"hello, \")\n" +" blob.write(b\"world.\")\n" +" # 修改我们的 blob 的开头和末尾字节\n" +" blob[0] = ord(\"H\")\n" +" blob[-1] = ord(\"!\")\n" +"\n" +"# 读取我们的 blob 的内容\n" +"with con.blobopen(\"test\", \"blob_col\", 1) as blob:\n" +" greeting = blob.read()\n" +"\n" +"print(greeting) # 输出 \"b'Hello, world!'\"\n" +"con.close()" + +#: ../../library/sqlite3.rst:1790 +msgid "Close the blob." +msgstr "关闭 blob。" + +#: ../../library/sqlite3.rst:1792 +msgid "" +"The blob will be unusable from this point onward. An " +":class:`~sqlite3.Error` (or subclass) exception will be raised if any " +"further operation is attempted with the blob." +msgstr "" +"从这一时刻起该 blob 将不再可用。如果再尝试用该 blob 执行任何操作将引发 :class:`~sqlite3.Error` (或其子类) 异常。" + +#: ../../library/sqlite3.rst:1798 +msgid "" +"Read *length* bytes of data from the blob at the current offset position. If" +" the end of the blob is reached, the data up to :abbr:`EOF (End of File)` " +"will be returned. When *length* is not specified, or is negative, " +":meth:`~Blob.read` will read until the end of the blob." +msgstr "" +"从 blob 的当前偏移位置读取 *length* 个字节的数据。如果到达了 blob 的末尾,则将返回 :abbr:`EOF (End of " +"File)` 之前的数据。当未指定 *length*,或指定负值时,:meth:`~Blob.read` 将读取至 blob 的末尾。" + +#: ../../library/sqlite3.rst:1806 +msgid "" +"Write *data* to the blob at the current offset. This function cannot change" +" the blob length. Writing beyond the end of the blob will raise " +":exc:`ValueError`." +msgstr "" +"在 blob 的当前偏移位置上写入 *data*。此函数不能改变 blob 的长度。写入数据超出 blob 的末尾将引发 " +":exc:`ValueError`." + +#: ../../library/sqlite3.rst:1812 +msgid "Return the current access position of the blob." +msgstr "返回 blob 的当前访问位置。" + +#: ../../library/sqlite3.rst:1816 +msgid "" +"Set the current access position of the blob to *offset*. The *origin* " +"argument defaults to :const:`os.SEEK_SET` (absolute blob positioning). Other" +" values for *origin* are :const:`os.SEEK_CUR` (seek relative to the current " +"position) and :const:`os.SEEK_END` (seek relative to the blob’s end)." +msgstr "" +"将 Blob 的当前访问位置设为 *offset*。 *origin* 参数默认为 :const:`os.SEEK_SET` (blob 的绝对位置)。" +" *origin* 的其他值包括 :const:`os.SEEK_CUR` (相对于当前位置寻址) 和 :const:`os.SEEK_END` " +"(相对于 blob 末尾寻址)。" + +#: ../../library/sqlite3.rst:1824 +msgid "PrepareProtocol objects" +msgstr "PrepareProtocol 对象" + +#: ../../library/sqlite3.rst:1828 +msgid "" +"The PrepareProtocol type's single purpose is to act as a :pep:`246` style " +"adaption protocol for objects that can :ref:`adapt themselves " +"` to :ref:`native SQLite types `." +msgstr "" +"PrepareProtocol 类型的唯一目的是作为 :pep:`246` 风格的适配协议让对象能够 :ref:`将自身适配 " +"` 为 :ref:`原生 SQLite 类型 `。" + +#: ../../library/sqlite3.rst:1836 +msgid "Exceptions" +msgstr "异常" + +#: ../../library/sqlite3.rst:1838 +msgid "The exception hierarchy is defined by the DB-API 2.0 (:pep:`249`)." +msgstr "异常层次是由 DB-API 2.0 (:pep:`249`) 定义的。" + +#: ../../library/sqlite3.rst:1842 +msgid "" +"This exception is not currently raised by the :mod:`!sqlite3` module, but " +"may be raised by applications using :mod:`!sqlite3`, for example if a user-" +"defined function truncates data while inserting. ``Warning`` is a subclass " +"of :exc:`Exception`." +msgstr "" +"目前此异常不会被 :mod:`!sqlite3` 模块引发,但可能会被使用 :mod:`!sqlite3` " +"的应用程序引发,例如当一个用户自定义的函数在插入操作中截断了数据时。``Warning`` 是 :exc:`Exception` 的一个子类。" + +#: ../../library/sqlite3.rst:1849 +msgid "" +"The base class of the other exceptions in this module. Use this to catch all" +" errors with one single :keyword:`except` statement. ``Error`` is a subclass" +" of :exc:`Exception`." +msgstr "" +"本模块中其他异常的基类。使用它来捕捉所有的错误,只需一条 :keyword:`except` 语句。``Error`` 是 " +":exc:`Exception` 的子类。" + +#: ../../library/sqlite3.rst:1853 +msgid "" +"If the exception originated from within the SQLite library, the following " +"two attributes are added to the exception:" +msgstr "如果异常是产生于 SQLite 库的内部,则以下两个属性将被添加到该异常:" + +#: ../../library/sqlite3.rst:1858 +msgid "" +"The numeric error code from the `SQLite API " +"`_" +msgstr "来自 `SQLite API `_ 的数字错误代码" + +#: ../../library/sqlite3.rst:1865 +msgid "" +"The symbolic name of the numeric error code from the `SQLite API " +"`_" +msgstr "来自 `SQLite API `_ 的数字错误代码符号名称" + +#: ../../library/sqlite3.rst:1872 +msgid "" +"Exception raised for misuse of the low-level SQLite C API. In other words, " +"if this exception is raised, it probably indicates a bug in the " +":mod:`!sqlite3` module. ``InterfaceError`` is a subclass of :exc:`Error`." +msgstr "" +"因错误使用低层级 SQLite C API 而引发的异常,换句话说,如果此异常被引发,则可能表明 :mod:`!sqlite3` 模块中存在错误。 " +"``InterfaceError`` 是 :exc:`Error` 的一个子类。" + +#: ../../library/sqlite3.rst:1879 +msgid "" +"Exception raised for errors that are related to the database. This serves as" +" the base exception for several types of database errors. It is only raised " +"implicitly through the specialised subclasses. ``DatabaseError`` is a " +"subclass of :exc:`Error`." +msgstr "" +"对与数据库有关的错误引发的异常。它作为几种数据库错误的基础异常。它只通过专门的子类隐式引发。``DatabaseError`` 是 " +":exc:`Error` 的一个子类。" + +#: ../../library/sqlite3.rst:1886 +msgid "" +"Exception raised for errors caused by problems with the processed data, like" +" numeric values out of range, and strings which are too long. ``DataError`` " +"is a subclass of :exc:`DatabaseError`." +msgstr "" +"由于处理的数据有问题而产生的异常,比如数字值超出范围,字符串太长。``DataError`` 是 :exc:`DatabaseError` 的子类。" + +#: ../../library/sqlite3.rst:1892 +msgid "" +"Exception raised for errors that are related to the database's operation, " +"and not necessarily under the control of the programmer. For example, the " +"database path is not found, or a transaction could not be processed. " +"``OperationalError`` is a subclass of :exc:`DatabaseError`." +msgstr "" +"与数据库操作有关的错误而引发的异常,不一定在程序员的控制之下。例如,数据库路径没有找到,或者一个事务无法被处理。 " +"``OperationalError`` 是 :exc:`DatabaseError` 的子类。" + +#: ../../library/sqlite3.rst:1900 +msgid "" +"Exception raised when the relational integrity of the database is affected, " +"e.g. a foreign key check fails. It is a subclass of :exc:`DatabaseError`." +msgstr "当数据库的关系一致性受到影响时引发的异常。例如外键检查失败等。它是 :exc:`DatabaseError` 的子类。" + +#: ../../library/sqlite3.rst:1905 +msgid "" +"Exception raised when SQLite encounters an internal error. If this is " +"raised, it may indicate that there is a problem with the runtime SQLite " +"library. ``InternalError`` is a subclass of :exc:`DatabaseError`." +msgstr "" +"当 SQLite 遇到一个内部错误时引发的异常。如果它被引发,可能表明运行中的 SQLite 库有问题。``InternalError`` 是 " +":exc:`DatabaseError` 的子类。" + +#: ../../library/sqlite3.rst:1912 +msgid "" +"Exception raised for :mod:`!sqlite3` API programming errors, for example " +"supplying the wrong number of bindings to a query, or trying to operate on a" +" closed :class:`Connection`. ``ProgrammingError`` is a subclass of " +":exc:`DatabaseError`." +msgstr "" +"针对 :mod:`!sqlite3` API 编程错误引发的异常,例如向查询提供错误数量的绑定,或试图在已关闭的 :class:`Connection`" +" 上执行操作。``ProgrammingError`` 是 :exc:`DatabaseError` 的一个子类。" + +#: ../../library/sqlite3.rst:1919 +msgid "" +"Exception raised in case a method or database API is not supported by the " +"underlying SQLite library. For example, setting *deterministic* to ``True`` " +"in :meth:`~Connection.create_function`, if the underlying SQLite library " +"does not support deterministic functions. ``NotSupportedError`` is a " +"subclass of :exc:`DatabaseError`." +msgstr "" +"在下层的 SQLite 库不支持某个方法或数据库 API 的情况下引发的异常。例如,在 " +":meth:`~Connection.create_function` 中把 *deterministic* 设为 ``True``,而下层的 " +"SQLite 库不支持确定性函数的时候。``NotSupportedError`` 是 :exc:`DatabaseError` 的一个子类。" + +#: ../../library/sqlite3.rst:1929 +msgid "SQLite and Python types" +msgstr "SQLite 与 Python 类型" + +#: ../../library/sqlite3.rst:1931 +msgid "" +"SQLite natively supports the following types: ``NULL``, ``INTEGER``, " +"``REAL``, ``TEXT``, ``BLOB``." +msgstr "SQLite 原生支持如下的类型: ``NULL``,``INTEGER``,``REAL``,``TEXT``,``BLOB``。" + +#: ../../library/sqlite3.rst:1934 +msgid "" +"The following Python types can thus be sent to SQLite without any problem:" +msgstr "因此可以将以下 Python 类型发送到 SQLite 而不会出现任何问题:" + +#: ../../library/sqlite3.rst:1937 ../../library/sqlite3.rst:1954 +msgid "Python type" +msgstr "Python 类型" + +#: ../../library/sqlite3.rst:1937 ../../library/sqlite3.rst:1954 +msgid "SQLite type" +msgstr "SQLite 类型" + +#: ../../library/sqlite3.rst:1939 ../../library/sqlite3.rst:1956 +msgid "``None``" +msgstr "``None``" + +#: ../../library/sqlite3.rst:1939 ../../library/sqlite3.rst:1956 +msgid "``NULL``" +msgstr "``NULL``" + +#: ../../library/sqlite3.rst:1941 ../../library/sqlite3.rst:1958 +msgid ":class:`int`" +msgstr ":class:`int`" + +#: ../../library/sqlite3.rst:1941 ../../library/sqlite3.rst:1958 +msgid "``INTEGER``" +msgstr "``INTEGER``" + +#: ../../library/sqlite3.rst:1943 ../../library/sqlite3.rst:1960 +msgid ":class:`float`" +msgstr ":class:`float`" + +#: ../../library/sqlite3.rst:1943 ../../library/sqlite3.rst:1960 +msgid "``REAL``" +msgstr "``REAL``" + +#: ../../library/sqlite3.rst:1945 +msgid ":class:`str`" +msgstr ":class:`str`" + +#: ../../library/sqlite3.rst:1945 ../../library/sqlite3.rst:1962 +msgid "``TEXT``" +msgstr "``TEXT``" + +#: ../../library/sqlite3.rst:1947 ../../library/sqlite3.rst:1965 +msgid ":class:`bytes`" +msgstr ":class:`bytes`" + +#: ../../library/sqlite3.rst:1947 ../../library/sqlite3.rst:1965 +msgid "``BLOB``" +msgstr "``BLOB``" + +#: ../../library/sqlite3.rst:1951 +msgid "This is how SQLite types are converted to Python types by default:" +msgstr "这是 SQLite 类型默认转换为 Python 类型的方式:" + +#: ../../library/sqlite3.rst:1962 +msgid "depends on :attr:`~Connection.text_factory`, :class:`str` by default" +msgstr "取决于 :attr:`~Connection.text_factory` , 默认为 :class:`str`" + +#: ../../library/sqlite3.rst:1968 +msgid "" +"The type system of the :mod:`!sqlite3` module is extensible in two ways: you" +" can store additional Python types in an SQLite database via :ref:`object " +"adapters `, and you can let the :mod:`!sqlite3` module " +"convert SQLite types to Python types via :ref:`converters " +"`." +msgstr "" +":mod:`!sqlite3` 模块的类型系统可通过两种方式来扩展:你可以通过 :ref:`对象适配器 ` 将额外的" +" Python 类型保存在 SQLite 数据库中,你也可以让 :mod:`!sqlite3` 模块通过 :ref:`转换器 " +"` 将 SQLite 类型转换为不同的 Python 类型。" + +#: ../../library/sqlite3.rst:1978 +msgid "Default adapters and converters (deprecated)" +msgstr "默认适配器和转换器(已弃用)" + +#: ../../library/sqlite3.rst:1982 +msgid "" +"The default adapters and converters are deprecated as of Python 3.12. " +"Instead, use the :ref:`sqlite3-adapter-converter-recipes` and tailor them to" +" your needs." +msgstr "" +"自 Python 3.12 起,默认适配器和转换器已被弃用。取而代之的是使用 :ref:`sqlite3-adapter-converter-" +"recipes`,并根据您的需要定制它们。" + +#: ../../library/sqlite3.rst:1986 +msgid "The deprecated default adapters and converters consist of:" +msgstr "弃用的默认适配器和转换器包括:" + +#: ../../library/sqlite3.rst:1988 +msgid "" +"An adapter for :class:`datetime.date` objects to :class:`strings ` in " +"`ISO 8601`_ format." +msgstr "" +"将 :class:`datetime.date` 对象转换为 `ISO 8601`_ 格式 :class:`字符串 ` 的适配器。" + +#: ../../library/sqlite3.rst:1990 +msgid "" +"An adapter for :class:`datetime.datetime` objects to strings in ISO 8601 " +"format." +msgstr "将 :class:`datetime.datetime` 对象转换为 ISO 8601 格式字符串的适配器。" + +#: ../../library/sqlite3.rst:1992 +msgid "" +"A converter for :ref:`declared ` \"date\" types to " +":class:`datetime.date` objects." +msgstr "" +"从 :ref:`已声明的 ` \"date\" 类型到 :class:`datetime.date` " +"对象的转换器。" + +#: ../../library/sqlite3.rst:1994 +msgid "" +"A converter for declared \"timestamp\" types to :class:`datetime.datetime` " +"objects. Fractional parts will be truncated to 6 digits (microsecond " +"precision)." +msgstr " 类型转成 :class:`datetime.datetime` 对象的转换器。小数部分将截断至 6 位(微秒精度)。" + +#: ../../library/sqlite3.rst:2000 +msgid "" +"The default \"timestamp\" converter ignores UTC offsets in the database and " +"always returns a naive :class:`datetime.datetime` object. To preserve UTC " +"offsets in timestamps, either leave converters disabled, or register an " +"offset-aware converter with :func:`register_converter`." +msgstr "" +"默认的 \"时间戳\" 转换器忽略了数据库中的 UTC 偏移,总是返回一个原生的 :class:`datetime.datetime` " +"对象。要在时间戳中保留 UTC 偏移,可以不使用转换器,或者用 :func:`register_converter` 注册一个偏移感知的转换器。" + +#: ../../library/sqlite3.rst:2013 +msgid "Command-line interface" +msgstr "命令行接口" + +#: ../../library/sqlite3.rst:2015 +msgid "" +"The :mod:`!sqlite3` module can be invoked as a script, using the " +"interpreter's :option:`-m` switch, in order to provide a simple SQLite " +"shell. The argument signature is as follows::" +msgstr "" +":mod:`!sqlite3` 模块可以作为脚本被唤起,使用解释器的 :option:`-m` 开关选项,以提供一个简单的 SQLite shell。 " +"参数签名如下::" + +#: ../../library/sqlite3.rst:2020 +msgid "python -m sqlite3 [-h] [-v] [filename] [sql]" +msgstr "python -m sqlite3 [-h] [-v] [filename] [sql]" + +#: ../../library/sqlite3.rst:2022 +msgid "Type ``.quit`` or CTRL-D to exit the shell." +msgstr "输入 ``.quit`` 或 CTRL-D 退出 shell。" + +#: ../../library/sqlite3.rst:2028 +msgid "Print CLI help." +msgstr "打印 CLI 帮助。" + +#: ../../library/sqlite3.rst:2032 +msgid "Print underlying SQLite library version." +msgstr "打印下层 SQLite 库版本。" + +#: ../../library/sqlite3.rst:2040 +msgid "How-to guides" +msgstr "常用方案指引" + +#: ../../library/sqlite3.rst:2045 +msgid "How to use placeholders to bind values in SQL queries" +msgstr "如何在 SQL 查询中使用占位符来绑定值" + +#: ../../library/sqlite3.rst:2047 +msgid "" +"SQL operations usually need to use values from Python variables. However, " +"beware of using Python's string operations to assemble queries, as they are " +"vulnerable to `SQL injection attacks`_. For example, an attacker can simply " +"close the single quote and inject ``OR TRUE`` to select all rows::" +msgstr "" +"SQL 操作通常会需要使用来自 Python 变量的值。不过,请谨慎使用 Python 的字符串操作来拼装查询,因为这样易受 `SQL " +"injection attacks`_。例如,攻击者可以简单地添加结束单引号并注入 ``OR TRUE`` 来选择所有的行::" + +#: ../../library/sqlite3.rst:2052 +msgid "" +">>> # Never do this -- insecure!\n" +">>> symbol = input()\n" +"' OR TRUE; --\n" +">>> sql = \"SELECT * FROM stocks WHERE symbol = '%s'\" % symbol\n" +">>> print(sql)\n" +"SELECT * FROM stocks WHERE symbol = '' OR TRUE; --'\n" +">>> cur.execute(sql)" +msgstr "" +">>> # 绝不要这样做 -- 很不安全!\n" +">>> symbol = input()\n" +"' OR TRUE; --\n" +">>> sql = \"SELECT * FROM stocks WHERE symbol = '%s'\" % symbol\n" +">>> print(sql)\n" +"SELECT * FROM stocks WHERE symbol = '' OR TRUE; --'\n" +">>> cur.execute(sql)" + +#: ../../library/sqlite3.rst:2060 +msgid "" +"Instead, use the DB-API's parameter substitution. To insert a variable into " +"a query string, use a placeholder in the string, and substitute the actual " +"values into the query by providing them as a :class:`tuple` of values to the" +" second argument of the cursor's :meth:`~Cursor.execute` method." +msgstr "" +"请改用 DB-API 的形参替换。要将变量插入到查询字符串中,可在字符串中使用占位符,并通过将实际值作为游标的 " +":meth:`~Cursor.execute` 方法的第二个参数以由多个值组成的 :class:`tuple` 形式提供给查询来替换它们。" + +#: ../../library/sqlite3.rst:2065 +msgid "" +"An SQL statement may use one of two kinds of placeholders: question marks " +"(qmark style) or named placeholders (named style). For the qmark style, " +"*parameters* must be a :term:`sequence` whose length must match the number " +"of placeholders, or a :exc:`ProgrammingError` is raised. For the named " +"style, *parameters* must be an instance of a :class:`dict` (or a subclass), " +"which must contain keys for all named parameters; any extra items are " +"ignored. Here's an example of both styles:" +msgstr "" +"SQL 语句可以使用两种占位符之一:问号占位符(问号风格)或命名占位符(命名风格)。对于问号风格,*parameters* " +"要是一个长度必须与占位符的数量相匹配的 :term:`sequence`,否则将引发 :exc:`ProgrammingError`。 " +"对于命名风格,*parameters* 必须是 :class:`dict` " +"(或其子类)的实例,它必须包含与所有命名参数相对应的键;任何额外的条目都将被忽略。下面是一个同时使用这两种风格的示例:" + +#: ../../library/sqlite3.rst:2076 +msgid "" +"con = sqlite3.connect(\":memory:\")\n" +"cur = con.execute(\"CREATE TABLE lang(name, first_appeared)\")\n" +"\n" +"# This is the named style used with executemany():\n" +"data = (\n" +" {\"name\": \"C\", \"year\": 1972},\n" +" {\"name\": \"Fortran\", \"year\": 1957},\n" +" {\"name\": \"Python\", \"year\": 1991},\n" +" {\"name\": \"Go\", \"year\": 2009},\n" +")\n" +"cur.executemany(\"INSERT INTO lang VALUES(:name, :year)\", data)\n" +"\n" +"# This is the qmark style used in a SELECT query:\n" +"params = (1972,)\n" +"cur.execute(\"SELECT * FROM lang WHERE first_appeared = ?\", params)\n" +"print(cur.fetchall())\n" +"con.close()" +msgstr "" +"con = sqlite3.connect(\":memory:\")\n" +"cur = con.execute(\"CREATE TABLE lang(name, first_appeared)\")\n" +"\n" +"# 这是用于 executemany() 的名称风格:\n" +"data = (\n" +" {\"name\": \"C\", \"year\": 1972},\n" +" {\"name\": \"Fortran\", \"year\": 1957},\n" +" {\"name\": \"Python\", \"year\": 1991},\n" +" {\"name\": \"Go\", \"year\": 2009},\n" +")\n" +"cur.executemany(\"INSERT INTO lang VALUES(:name, :year)\", data)\n" +"\n" +"# 这是用于 SELECT 查询的问号风格:\n" +"params = (1972,)\n" +"cur.execute(\"SELECT * FROM lang WHERE first_appeared = ?\", params)\n" +"print(cur.fetchall())\n" +"con.close()" + +#: ../../library/sqlite3.rst:2103 +msgid "" +":pep:`249` numeric placeholders are *not* supported. If used, they will be " +"interpreted as named placeholders." +msgstr ":pep:`249` 数字占位符 *不* 被支持。如果使用,它们将被解读为命名占位符。" + +#: ../../library/sqlite3.rst:2110 +msgid "How to adapt custom Python types to SQLite values" +msgstr "如何将自定义 Python 类型适配到 SQLite 值" + +#: ../../library/sqlite3.rst:2112 +msgid "" +"SQLite supports only a limited set of data types natively. To store custom " +"Python types in SQLite databases, *adapt* them to one of the :ref:`Python " +"types SQLite natively understands `." +msgstr "" +"SQLite 仅支持一个原生数据类型的有限集。要在 SQLite 数据库中存储自定义 Python 类型,请将它们 *适配* 到 " +":ref:`SQLite 原生可识别的 Python 类型 ` 之一。" + +#: ../../library/sqlite3.rst:2116 +msgid "" +"There are two ways to adapt Python objects to SQLite types: letting your " +"object adapt itself, or using an *adapter callable*. The latter will take " +"precedence above the former. For a library that exports a custom type, it " +"may make sense to enable that type to adapt itself. As an application " +"developer, it may make more sense to take direct control by registering " +"custom adapter functions." +msgstr "" +"有两种方式可将 Python 对象适配到 SQLite 类型:让你的对象自行适配,或是使用 *适配器可调用对象*。后者将优先于前者发挥作用。 " +"对于导出自定义类型的库,启用该类型的自行适配可能更为合理。而作为一名应用程序开发者,通过注册自定义适配器函数进行直接控制可能更为合理。" + +#: ../../library/sqlite3.rst:2128 +msgid "How to write adaptable objects" +msgstr "如何编写可适配对象" + +#: ../../library/sqlite3.rst:2130 +msgid "" +"Suppose we have a :class:`!Point` class that represents a pair of " +"coordinates, ``x`` and ``y``, in a Cartesian coordinate system. The " +"coordinate pair will be stored as a text string in the database, using a " +"semicolon to separate the coordinates. This can be implemented by adding a " +"``__conform__(self, protocol)`` method which returns the adapted value. The " +"object passed to *protocol* will be of type :class:`PrepareProtocol`." +msgstr "" +"假设我们有一个代表笛卡尔坐标系中的坐标值对 :class:`!Point`,``x`` 和 ``y`` 的类,该坐标值在数据库中将存储为一个文本字符串。" +" 这可以通过添加一个返回已适配值的 ``__conform__(self, protocol)`` 方法来实现。传给 *protocol* 的对象将为 " +":class:`PrepareProtocol` 类型。" + +#: ../../library/sqlite3.rst:2138 +msgid "" +"class Point:\n" +" def __init__(self, x, y):\n" +" self.x, self.y = x, y\n" +"\n" +" def __conform__(self, protocol):\n" +" if protocol is sqlite3.PrepareProtocol:\n" +" return f\"{self.x};{self.y}\"\n" +"\n" +"con = sqlite3.connect(\":memory:\")\n" +"cur = con.cursor()\n" +"\n" +"cur.execute(\"SELECT ?\", (Point(4.0, -3.2),))\n" +"print(cur.fetchone()[0])\n" +"con.close()" +msgstr "" +"class Point:\n" +" def __init__(self, x, y):\n" +" self.x, self.y = x, y\n" +"\n" +" def __conform__(self, protocol):\n" +" if protocol is sqlite3.PrepareProtocol:\n" +" return f\"{self.x};{self.y}\"\n" +"\n" +"con = sqlite3.connect(\":memory:\")\n" +"cur = con.cursor()\n" +"\n" +"cur.execute(\"SELECT ?\", (Point(4.0, -3.2),))\n" +"print(cur.fetchone()[0])\n" +"con.close()" + +#: ../../library/sqlite3.rst:2162 +msgid "How to register adapter callables" +msgstr "如何注册适配器可调用对象" + +#: ../../library/sqlite3.rst:2164 +msgid "" +"The other possibility is to create a function that converts the Python " +"object to an SQLite-compatible type. This function can then be registered " +"using :func:`register_adapter`." +msgstr "" +"另一种可能的方式是创建一个将 Python 对象转换为 SQLite 兼容类型的函数。随后可使用 :func:`register_adapter` " +"来注册该函数。" + +#: ../../library/sqlite3.rst:2168 +msgid "" +"class Point:\n" +" def __init__(self, x, y):\n" +" self.x, self.y = x, y\n" +"\n" +"def adapt_point(point):\n" +" return f\"{point.x};{point.y}\"\n" +"\n" +"sqlite3.register_adapter(Point, adapt_point)\n" +"\n" +"con = sqlite3.connect(\":memory:\")\n" +"cur = con.cursor()\n" +"\n" +"cur.execute(\"SELECT ?\", (Point(1.0, 2.5),))\n" +"print(cur.fetchone()[0])\n" +"con.close()" +msgstr "" +"class Point:\n" +" def __init__(self, x, y):\n" +" self.x, self.y = x, y\n" +"\n" +"def adapt_point(point):\n" +" return f\"{point.x};{point.y}\"\n" +"\n" +"sqlite3.register_adapter(Point, adapt_point)\n" +"\n" +"con = sqlite3.connect(\":memory:\")\n" +"cur = con.cursor()\n" +"\n" +"cur.execute(\"SELECT ?\", (Point(1.0, 2.5),))\n" +"print(cur.fetchone()[0])\n" +"con.close()" + +#: ../../library/sqlite3.rst:2195 +msgid "How to convert SQLite values to custom Python types" +msgstr "如何将 SQLite 值转换为自定义 Python 类型" + +#: ../../library/sqlite3.rst:2197 +msgid "" +"Writing an adapter lets you convert *from* custom Python types *to* SQLite " +"values. To be able to convert *from* SQLite values *to* custom Python types," +" we use *converters*." +msgstr "" +"编写适配器使你可以将自定义 Python 类型转换为 SQLite 值。为了能将 SQLite 值转换为自定义 Python 类型,我们可使用 " +"*转换器*。" + +#: ../../library/sqlite3.rst:2202 +msgid "" +"Let's go back to the :class:`!Point` class. We stored the x and y " +"coordinates separated via semicolons as strings in SQLite." +msgstr "让我们回到 :class:`!Point` 类。我们以以分号分隔的字符串形式在 SQLite 中存储了 x 和 y 坐标值。" + +#: ../../library/sqlite3.rst:2205 +msgid "" +"First, we'll define a converter function that accepts the string as a " +"parameter and constructs a :class:`!Point` object from it." +msgstr "首先,我们将定义一个转换器函数,它接受这样的字符串作为形参并根据该参数构造一个 :class:`!Point` 对象。" + +#: ../../library/sqlite3.rst:2210 +msgid "" +"Converter functions are **always** passed a :class:`bytes` object, no matter" +" the underlying SQLite data type." +msgstr "转换器函数 **总是** 接受传入一个 :class:`bytes` 对象,无论下层的 SQLite 数据类型是什么。" + +#: ../../library/sqlite3.rst:2213 +msgid "" +"def convert_point(s):\n" +" x, y = map(float, s.split(b\";\"))\n" +" return Point(x, y)" +msgstr "" +"def convert_point(s):\n" +" x, y = map(float, s.split(b\";\"))\n" +" return Point(x, y)" + +#: ../../library/sqlite3.rst:2219 +msgid "" +"We now need to tell :mod:`!sqlite3` when it should convert a given SQLite " +"value. This is done when connecting to a database, using the *detect_types* " +"parameter of :func:`connect`. There are three options:" +msgstr "" +"我们现在需要告诉 :mod:`!sqlite3` 何时应当转换一个给定的 SQLite 值。这是在连接到一个数据库时完成的,使用 " +":func:`connect` 的 *detect_types* 形参。有三个选项:" + +#: ../../library/sqlite3.rst:2223 +msgid "Implicit: set *detect_types* to :const:`PARSE_DECLTYPES`" +msgstr "隐式:将 *detect_types* 设为 :const:`PARSE_DECLTYPES`" + +#: ../../library/sqlite3.rst:2224 +msgid "Explicit: set *detect_types* to :const:`PARSE_COLNAMES`" +msgstr "显式:将 *detect_types* 设为 :const:`PARSE_COLNAMES`" + +#: ../../library/sqlite3.rst:2225 +msgid "" +"Both: set *detect_types* to ``sqlite3.PARSE_DECLTYPES | " +"sqlite3.PARSE_COLNAMES``. Column names take precedence over declared types." +msgstr "" +"同时:将 *detect_types* 设为 ``sqlite3.PARSE_DECLTYPES | " +"sqlite3.PARSE_COLNAMES``。列名的优先级高于声明的类型。" + +#: ../../library/sqlite3.rst:2229 +msgid "" +"The following example illustrates the implicit and explicit approaches:" +msgstr "下面的示例演示了隐式和显式的方法:" + +#: ../../library/sqlite3.rst:2231 +msgid "" +"class Point:\n" +" def __init__(self, x, y):\n" +" self.x, self.y = x, y\n" +"\n" +" def __repr__(self):\n" +" return f\"Point({self.x}, {self.y})\"\n" +"\n" +"def adapt_point(point):\n" +" return f\"{point.x};{point.y}\"\n" +"\n" +"def convert_point(s):\n" +" x, y = list(map(float, s.split(b\";\")))\n" +" return Point(x, y)\n" +"\n" +"# Register the adapter and converter\n" +"sqlite3.register_adapter(Point, adapt_point)\n" +"sqlite3.register_converter(\"point\", convert_point)\n" +"\n" +"# 1) Parse using declared types\n" +"p = Point(4.0, -3.2)\n" +"con = sqlite3.connect(\":memory:\", detect_types=sqlite3.PARSE_DECLTYPES)\n" +"cur = con.execute(\"CREATE TABLE test(p point)\")\n" +"\n" +"cur.execute(\"INSERT INTO test(p) VALUES(?)\", (p,))\n" +"cur.execute(\"SELECT p FROM test\")\n" +"print(\"with declared types:\", cur.fetchone()[0])\n" +"cur.close()\n" +"con.close()\n" +"\n" +"# 2) Parse using column names\n" +"con = sqlite3.connect(\":memory:\", detect_types=sqlite3.PARSE_COLNAMES)\n" +"cur = con.execute(\"CREATE TABLE test(p)\")\n" +"\n" +"cur.execute(\"INSERT INTO test(p) VALUES(?)\", (p,))\n" +"cur.execute('SELECT p AS \"p [point]\" FROM test')\n" +"print(\"with column names:\", cur.fetchone()[0])\n" +"cur.close()\n" +"con.close()" +msgstr "" +"class Point:\n" +" def __init__(self, x, y):\n" +" self.x, self.y = x, y\n" +"\n" +" def __repr__(self):\n" +" return f\"Point({self.x}, {self.y})\"\n" +"\n" +"def adapt_point(point):\n" +" return f\"{point.x};{point.y}\"\n" +"\n" +"def convert_point(s):\n" +" x, y = list(map(float, s.split(b\";\")))\n" +" return Point(x, y)\n" +"\n" +"# 注册适配器和转换器\n" +"sqlite3.register_adapter(Point, adapt_point)\n" +"sqlite3.register_converter(\"point\", convert_point)\n" +"\n" +"# 1) 使用声明的类型来解析\n" +"p = Point(4.0, -3.2)\n" +"con = sqlite3.connect(\":memory:\", detect_types=sqlite3.PARSE_DECLTYPES)\n" +"cur = con.execute(\"CREATE TABLE test(p point)\")\n" +"\n" +"cur.execute(\"INSERT INTO test(p) VALUES(?)\", (p,))\n" +"cur.execute(\"SELECT p FROM test\")\n" +"print(\"with declared types:\", cur.fetchone()[0])\n" +"cur.close()\n" +"con.close()\n" +"\n" +"# 2) 使用列名称来解析\n" +"con = sqlite3.connect(\":memory:\", detect_types=sqlite3.PARSE_COLNAMES)\n" +"cur = con.execute(\"CREATE TABLE test(p)\")\n" +"\n" +"cur.execute(\"INSERT INTO test(p) VALUES(?)\", (p,))\n" +"cur.execute('SELECT p AS \"p [point]\" FROM test')\n" +"print(\"with column names:\", cur.fetchone()[0])\n" +"cur.close()\n" +"con.close()" + +#: ../../library/sqlite3.rst:2282 +msgid "Adapter and converter recipes" +msgstr "适配器和转换器范例程序" + +#: ../../library/sqlite3.rst:2284 +msgid "This section shows recipes for common adapters and converters." +msgstr "本小节显示了通用适配器和转换器的范例程序。" + +#: ../../library/sqlite3.rst:2286 +msgid "" +"import datetime as dt\n" +"import sqlite3\n" +"\n" +"def adapt_date_iso(val):\n" +" \"\"\"Adapt datetime.date to ISO 8601 date.\"\"\"\n" +" return val.isoformat()\n" +"\n" +"def adapt_datetime_iso(val):\n" +" \"\"\"Adapt datetime.datetime to timezone-naive ISO 8601 date.\"\"\"\n" +" return val.replace(tzinfo=None).isoformat()\n" +"\n" +"def adapt_datetime_epoch(val):\n" +" \"\"\"Adapt datetime.datetime to Unix timestamp.\"\"\"\n" +" return int(val.timestamp())\n" +"\n" +"sqlite3.register_adapter(dt.date, adapt_date_iso)\n" +"sqlite3.register_adapter(dt.datetime, adapt_datetime_iso)\n" +"sqlite3.register_adapter(dt.datetime, adapt_datetime_epoch)\n" +"\n" +"def convert_date(val):\n" +" \"\"\"Convert ISO 8601 date to datetime.date object.\"\"\"\n" +" return dt.date.fromisoformat(val.decode())\n" +"\n" +"def convert_datetime(val):\n" +" \"\"\"Convert ISO 8601 datetime to datetime.datetime object.\"\"\"\n" +" return dt.datetime.fromisoformat(val.decode())\n" +"\n" +"def convert_timestamp(val):\n" +" \"\"\"Convert Unix epoch timestamp to datetime.datetime object.\"\"\"\n" +" return dt.datetime.fromtimestamp(int(val))\n" +"\n" +"sqlite3.register_converter(\"date\", convert_date)\n" +"sqlite3.register_converter(\"datetime\", convert_datetime)\n" +"sqlite3.register_converter(\"timestamp\", convert_timestamp)" +msgstr "" +"import datetime as dt\n" +"import sqlite3\n" +"\n" +"def adapt_date_iso(val):\n" +" \"\"\"Adapt datetime.date to ISO 8601 date.\"\"\"\n" +" return val.isoformat()\n" +"\n" +"def adapt_datetime_iso(val):\n" +" \"\"\"Adapt datetime.datetime to timezone-naive ISO 8601 date.\"\"\"\n" +" return val.replace(tzinfo=None).isoformat()\n" +"\n" +"def adapt_datetime_epoch(val):\n" +" \"\"\"Adapt datetime.datetime to Unix timestamp.\"\"\"\n" +" return int(val.timestamp())\n" +"\n" +"sqlite3.register_adapter(dt.date, adapt_date_iso)\n" +"sqlite3.register_adapter(dt.datetime, adapt_datetime_iso)\n" +"sqlite3.register_adapter(dt.datetime, adapt_datetime_epoch)\n" +"\n" +"def convert_date(val):\n" +" \"\"\"Convert ISO 8601 date to datetime.date object.\"\"\"\n" +" return dt.date.fromisoformat(val.decode())\n" +"\n" +"def convert_datetime(val):\n" +" \"\"\"Convert ISO 8601 datetime to datetime.datetime object.\"\"\"\n" +" return dt.datetime.fromisoformat(val.decode())\n" +"\n" +"def convert_timestamp(val):\n" +" \"\"\"Convert Unix epoch timestamp to datetime.datetime object.\"\"\"\n" +" return dt.datetime.fromtimestamp(int(val))\n" +"\n" +"sqlite3.register_converter(\"date\", convert_date)\n" +"sqlite3.register_converter(\"datetime\", convert_datetime)\n" +"sqlite3.register_converter(\"timestamp\", convert_timestamp)" + +#: ../../library/sqlite3.rst:2346 +msgid "How to use connection shortcut methods" +msgstr "如何使用连接快捷方法" + +#: ../../library/sqlite3.rst:2348 +msgid "" +"Using the :meth:`~Connection.execute`, :meth:`~Connection.executemany`, and " +":meth:`~Connection.executescript` methods of the :class:`Connection` class, " +"your code can be written more concisely because you don't have to create the" +" (often superfluous) :class:`Cursor` objects explicitly. Instead, the " +":class:`Cursor` objects are created implicitly and these shortcut methods " +"return the cursor objects. This way, you can execute a ``SELECT`` statement " +"and iterate over it directly using only a single call on the " +":class:`Connection` object." +msgstr "" +"通过使用 :class:`Connection` 类的 :meth:`~Connection.execute`, " +":meth:`~Connection.executemany` 与 :meth:`~Connection.executescript` " +"方法,您可以简化您的代码,因为无需再显式创建(通常是多余的) :class:`Cursor` 对象。此时 :class:`Cursor` " +"对象会被隐式创建并且由这些快捷方法返回。这样一来,您仅需在 :class:`Connection` 对象上调用一次方法就可以执行 ``SELECT`` " +"语句,并对其进行迭代。" + +#: ../../library/sqlite3.rst:2357 +msgid "" +"# Create and fill the table.\n" +"con = sqlite3.connect(\":memory:\")\n" +"con.execute(\"CREATE TABLE lang(name, first_appeared)\")\n" +"data = [\n" +" (\"C++\", 1985),\n" +" (\"Objective-C\", 1984),\n" +"]\n" +"con.executemany(\"INSERT INTO lang(name, first_appeared) VALUES(?, ?)\", data)\n" +"\n" +"# Print the table contents\n" +"for row in con.execute(\"SELECT name, first_appeared FROM lang\"):\n" +" print(row)\n" +"\n" +"print(\"I just deleted\", con.execute(\"DELETE FROM lang\").rowcount, \"rows\")\n" +"\n" +"# close() is not a shortcut method and it's not called automatically;\n" +"# the connection object should be closed manually\n" +"con.close()" +msgstr "" +"# 创建并填充表。\n" +"con = sqlite3.connect(\":memory:\")\n" +"con.execute(\"CREATE TABLE lang(name, first_appeared)\")\n" +"data = [\n" +" (\"C++\", 1985),\n" +" (\"Objective-C\", 1984),\n" +"]\n" +"con.executemany(\"INSERT INTO lang(name, first_appeared) VALUES(?, ?)\", data)\n" +"\n" +"# 打印表内容\n" +"for row in con.execute(\"SELECT name, first_appeared FROM lang\"):\n" +" print(row)\n" +"\n" +"print(\"I just deleted\", con.execute(\"DELETE FROM lang\").rowcount, \"rows\")\n" +"\n" +"# close() 不是一个快捷方法也不会被自动调用;\n" +"# 连接对象应当被手动关闭\n" +"con.close()" + +#: ../../library/sqlite3.rst:2389 +msgid "How to use the connection context manager" +msgstr "如何使用连接上下文管理器" + +#: ../../library/sqlite3.rst:2391 +msgid "" +"A :class:`Connection` object can be used as a context manager that " +"automatically commits or rolls back open transactions when leaving the body " +"of the context manager. If the body of the :keyword:`with` statement " +"finishes without exceptions, the transaction is committed. If this commit " +"fails, or if the body of the ``with`` statement raises an uncaught " +"exception, the transaction is rolled back. If :attr:`~Connection.autocommit`" +" is ``False``, a new transaction is implicitly opened after committing or " +"rolling back." +msgstr "" +":class:`Connection` 对象可被用作上下文管理器以便在离开上下文管理器代码块时自动提交或回滚开启的事务。如果 " +":keyword:`with` 语句体无异常地结束,事务将被提交。如果提交失败,或者如果 ``with`` 语句体引发了未捕获的异常,则事务将被回滚。 " +"如果 :attr:`~Connection.autocommit` 为 ``False``,则会在提交或回滚后隐式地开启一个新事务。" + +#: ../../library/sqlite3.rst:2402 +msgid "" +"If there is no open transaction upon leaving the body of the ``with`` " +"statement, or if :attr:`~Connection.autocommit` is ``True``, the context " +"manager does nothing." +msgstr "" +"如果在离开 ``with`` 语句体时没有开启的事务,或者如果 :attr:`~Connection.autocommit` 为 " +"``True``,则上下文管理器将不做任何操作。" + +#: ../../library/sqlite3.rst:2407 +msgid "" +"The context manager neither implicitly opens a new transaction nor closes " +"the connection. If you need a closing context manager, consider using " +":meth:`contextlib.closing`." +msgstr "" +"上下文管理器既不会隐式开启新事务也不会关闭连接。如果你需要关闭上下文管理器,请考虑使用 :meth:`contextlib.closing`。" + +#: ../../library/sqlite3.rst:2411 +msgid "" +"con = sqlite3.connect(\":memory:\")\n" +"con.execute(\"CREATE TABLE lang(id INTEGER PRIMARY KEY, name VARCHAR UNIQUE)\")\n" +"\n" +"# Successful, con.commit() is called automatically afterwards\n" +"with con:\n" +" con.execute(\"INSERT INTO lang(name) VALUES(?)\", (\"Python\",))\n" +"\n" +"# con.rollback() is called after the with block finishes with an exception,\n" +"# the exception is still raised and must be caught\n" +"try:\n" +" with con:\n" +" con.execute(\"INSERT INTO lang(name) VALUES(?)\", (\"Python\",))\n" +"except sqlite3.IntegrityError:\n" +" print(\"couldn't add Python twice\")\n" +"\n" +"# Connection object used as context manager only commits or rollbacks transactions,\n" +"# so the connection object should be closed manually\n" +"con.close()" +msgstr "" +"con = sqlite3.connect(\":memory:\")\n" +"con.execute(\"CREATE TABLE lang(id INTEGER PRIMARY KEY, name VARCHAR UNIQUE)\")\n" +"\n" +"# 成功,con.commit() 将在此后被自动调用\n" +"with con:\n" +" con.execute(\"INSERT INTO lang(name) VALUES(?)\", (\"Python\",))\n" +"\n" +"# con.rollback() 会在 with 代码块结束时被自动调用并附带一个异常;\n" +"# 该异常仍会被引发并且必须被捕获\n" +"try:\n" +" with con:\n" +" con.execute(\"INSERT INTO lang(name) VALUES(?)\", (\"Python\",))\n" +"except sqlite3.IntegrityError:\n" +" print(\"couldn't add Python twice\")\n" +"\n" +"# 被用作上下文管理器的连接对象只能提交或回滚事务,\n" +"# 因此连接对象必须被手动关闭\n" +"con.close()" + +#: ../../library/sqlite3.rst:2441 +msgid "How to work with SQLite URIs" +msgstr "如何使用 SQLite URI" + +#: ../../library/sqlite3.rst:2443 +msgid "Some useful URI tricks include:" +msgstr "一些有用的 URI 技巧包括:" + +#: ../../library/sqlite3.rst:2445 +msgid "Open a database in read-only mode:" +msgstr "以只读模式打开一个数据库:" + +#: ../../library/sqlite3.rst:2447 +msgid "" +">>> con = sqlite3.connect(\"file:tutorial.db?mode=ro\", uri=True)\n" +">>> con.execute(\"CREATE TABLE readonly(data)\")\n" +"Traceback (most recent call last):\n" +"OperationalError: attempt to write a readonly database\n" +">>> con.close()" +msgstr "" +">>> con = sqlite3.connect(\"file:tutorial.db?mode=ro\", uri=True)\n" +">>> con.execute(\"CREATE TABLE readonly(data)\")\n" +"Traceback (most recent call last):\n" +"OperationalError: attempt to write a readonly database\n" +">>> con.close()" + +#: ../../library/sqlite3.rst:2455 +msgid "" +"Do not implicitly create a new database file if it does not already exist; " +"will raise :exc:`~sqlite3.OperationalError` if unable to create a new file:" +msgstr "" +"如果一个数据库尚不存在则不会隐式地新建数据库;如果无法新建数据库则将引发 :exc:`~sqlite3.OperationalError`:" + +#: ../../library/sqlite3.rst:2458 +msgid "" +">>> con = sqlite3.connect(\"file:nosuchdb.db?mode=rw\", uri=True)\n" +"Traceback (most recent call last):\n" +"OperationalError: unable to open database file" +msgstr "" +">>> con = sqlite3.connect(\"file:nosuchdb.db?mode=rw\", uri=True)\n" +"Traceback (most recent call last):\n" +"OperationalError: unable to open database file" + +#: ../../library/sqlite3.rst:2465 +msgid "Create a shared named in-memory database:" +msgstr "创建一个名为 shared 的内存数据库:" + +#: ../../library/sqlite3.rst:2467 +msgid "" +"db = \"file:mem1?mode=memory&cache=shared\"\n" +"con1 = sqlite3.connect(db, uri=True)\n" +"con2 = sqlite3.connect(db, uri=True)\n" +"with con1:\n" +" con1.execute(\"CREATE TABLE shared(data)\")\n" +" con1.execute(\"INSERT INTO shared VALUES(28)\")\n" +"res = con2.execute(\"SELECT data FROM shared\")\n" +"assert res.fetchone() == (28,)\n" +"\n" +"con1.close()\n" +"con2.close()" +msgstr "" +"db = \"file:mem1?mode=memory&cache=shared\"\n" +"con1 = sqlite3.connect(db, uri=True)\n" +"con2 = sqlite3.connect(db, uri=True)\n" +"with con1:\n" +" con1.execute(\"CREATE TABLE shared(data)\")\n" +" con1.execute(\"INSERT INTO shared VALUES(28)\")\n" +"res = con2.execute(\"SELECT data FROM shared\")\n" +"assert res.fetchone() == (28,)\n" +"\n" +"con1.close()\n" +"con2.close()" + +#: ../../library/sqlite3.rst:2481 +msgid "" +"More information about this feature, including a list of parameters, can be " +"found in the `SQLite URI documentation`_." +msgstr "关于此特性的更多信息,包括可用的形参列表,可以在 `SQLite URI documentation`_ 中找到。" + +#: ../../library/sqlite3.rst:2490 +msgid "How to create and use row factories" +msgstr "如何创建并使用行工厂对象" + +#: ../../library/sqlite3.rst:2492 +msgid "" +"By default, :mod:`!sqlite3` represents each row as a :class:`tuple`. If a " +":class:`!tuple` does not suit your needs, you can use the " +":class:`sqlite3.Row` class or a custom :attr:`~Cursor.row_factory`." +msgstr "" +"在默认情况下,:mod:`!sqlite3` 会以 :class:`tuple` 来表示每一行。如果 :class:`!tuple` " +"不适合你的需求,你可以使用 :class:`sqlite3.Row` 类或自定义的 :attr:`~Cursor.row_factory`。" + +#: ../../library/sqlite3.rst:2497 +msgid "" +"While :attr:`!row_factory` exists as an attribute both on the " +":class:`Cursor` and the :class:`Connection`, it is recommended to set " +":class:`Connection.row_factory`, so all cursors created from the connection " +"will use the same row factory." +msgstr "" +"虽然 :attr:`!row_factory` 同时作为 :class:`Cursor` 和 :class:`Connection` " +"的属性存在,但推荐设置 :class:`Connection.row_factory`,这样在该连接上创建的所有游标都将使用同一个行工厂对象。" + +#: ../../library/sqlite3.rst:2502 +msgid "" +":class:`!Row` provides indexed and case-insensitive named access to columns," +" with minimal memory overhead and performance impact over a :class:`!tuple`." +" To use :class:`!Row` as a row factory, assign it to the " +":attr:`!row_factory` attribute:" +msgstr "" +":class:`!Row` 提供了针对列的序列方式和大小写不敏感的名称方式访问,具有优于 :class:`!tuple` 的最小化内存开销和性能影响。 " +"要使用 :class:`!Row` 作为行工厂对象,请将其赋值给 :attr:`!row_factory` 属性:" + +#: ../../library/sqlite3.rst:2507 +msgid "" +">>> con = sqlite3.connect(\":memory:\")\n" +">>> con.row_factory = sqlite3.Row" +msgstr "" +">>> con = sqlite3.connect(\":memory:\")\n" +">>> con.row_factory = sqlite3.Row" + +#: ../../library/sqlite3.rst:2512 +msgid "Queries now return :class:`!Row` objects:" +msgstr "现在查询将返回 :class:`!Row` 对象:" + +#: ../../library/sqlite3.rst:2514 +msgid "" +">>> res = con.execute(\"SELECT 'Earth' AS name, 6378 AS radius\")\n" +">>> row = res.fetchone()\n" +">>> row.keys()\n" +"['name', 'radius']\n" +">>> row[0] # Access by index.\n" +"'Earth'\n" +">>> row[\"name\"] # Access by name.\n" +"'Earth'\n" +">>> row[\"RADIUS\"] # Column names are case-insensitive.\n" +"6378\n" +">>> con.close()" +msgstr "" +">>> res = con.execute(\"SELECT 'Earth' AS name, 6378 AS radius\")\n" +">>> row = res.fetchone()\n" +">>> row.keys()\n" +"['name', 'radius']\n" +">>> row[0] # 通过索引访问。\n" +"'Earth'\n" +">>> row[\"name\"] # 通过名称访问。\n" +"'Earth'\n" +">>> row[\"RADIUS\"] # 列名不区分大小写。\n" +"6378\n" +">>> con.close()" + +#: ../../library/sqlite3.rst:2530 +msgid "" +"The ``FROM`` clause can be omitted in the ``SELECT`` statement, as in the " +"above example. In such cases, SQLite returns a single row with columns " +"defined by expressions, e.g. literals, with the given aliases ``expr AS " +"alias``." +msgstr "" +"``FROM`` 子句可以在 ``SELECT`` 语句中省略,像在上面的示例中那样。在这种情况下,SQLite " +"将返回单独的行,其中的列由表达式来定义,例如使用字面量并给出相应的别名 ``expr AS alias``。" + +#: ../../library/sqlite3.rst:2535 +msgid "" +"You can create a custom :attr:`~Cursor.row_factory` that returns each row as" +" a :class:`dict`, with column names mapped to values:" +msgstr "" +"你可以创建自定义 :attr:`~Cursor.row_factory` 用来返回 :class:`dict` 形式的行,将列名映射到相应的值。" + +#: ../../library/sqlite3.rst:2538 +msgid "" +"def dict_factory(cursor, row):\n" +" fields = [column[0] for column in cursor.description]\n" +" return {key: value for key, value in zip(fields, row)}" +msgstr "" +"def dict_factory(cursor, row):\n" +" fields = [column[0] for column in cursor.description]\n" +" return {key: value for key, value in zip(fields, row)}" + +#: ../../library/sqlite3.rst:2544 +msgid "" +"Using it, queries now return a :class:`!dict` instead of a :class:`!tuple`:" +msgstr "使用它,现在查询将返回 :class:`!dict` 而不是 :class:`!tuple`:" + +#: ../../library/sqlite3.rst:2546 +msgid "" +">>> con = sqlite3.connect(\":memory:\")\n" +">>> con.row_factory = dict_factory\n" +">>> for row in con.execute(\"SELECT 1 AS a, 2 AS b\"):\n" +"... print(row)\n" +"{'a': 1, 'b': 2}\n" +">>> con.close()" +msgstr "" +">>> con = sqlite3.connect(\":memory:\")\n" +">>> con.row_factory = dict_factory\n" +">>> for row in con.execute(\"SELECT 1 AS a, 2 AS b\"):\n" +"... print(row)\n" +"{'a': 1, 'b': 2}\n" +">>> con.close()" + +#: ../../library/sqlite3.rst:2555 +msgid "The following row factory returns a :term:`named tuple`:" +msgstr "以下行工厂函数将返回一个 :term:`named tuple`:" + +#: ../../library/sqlite3.rst:2557 +msgid "" +"from collections import namedtuple\n" +"\n" +"def namedtuple_factory(cursor, row):\n" +" fields = [column[0] for column in cursor.description]\n" +" cls = namedtuple(\"Row\", fields)\n" +" return cls._make(row)" +msgstr "" +"from collections import namedtuple\n" +"\n" +"def namedtuple_factory(cursor, row):\n" +" fields = [column[0] for column in cursor.description]\n" +" cls = namedtuple(\"Row\", fields)\n" +" return cls._make(row)" + +#: ../../library/sqlite3.rst:2566 +msgid ":func:`!namedtuple_factory` can be used as follows:" +msgstr ":func:`!namedtuple_factory` 可以像下面这样使用:" + +#: ../../library/sqlite3.rst:2568 +msgid "" +">>> con = sqlite3.connect(\":memory:\")\n" +">>> con.row_factory = namedtuple_factory\n" +">>> cur = con.execute(\"SELECT 1 AS a, 2 AS b\")\n" +">>> row = cur.fetchone()\n" +">>> row\n" +"Row(a=1, b=2)\n" +">>> row[0] # Indexed access.\n" +"1\n" +">>> row.b # Attribute access.\n" +"2\n" +">>> con.close()" +msgstr "" +">>> con = sqlite3.connect(\":memory:\")\n" +">>> con.row_factory = namedtuple_factory\n" +">>> cur = con.execute(\"SELECT 1 AS a, 2 AS b\")\n" +">>> row = cur.fetchone()\n" +">>> row\n" +"Row(a=1, b=2)\n" +">>> row[0] # 索引访问。\n" +"1\n" +">>> row.b # 属性访问。\n" +"2\n" +">>> con.close()" + +#: ../../library/sqlite3.rst:2582 +msgid "" +"With some adjustments, the above recipe can be adapted to use a " +":class:`~dataclasses.dataclass`, or any other custom class, instead of a " +":class:`~collections.namedtuple`." +msgstr "" +"经过一些调整,上面的范例程序可以被适配为使用 :class:`~dataclasses.dataclass`,或任何其他自定义类,而不是 " +":class:`~collections.namedtuple`." + +#: ../../library/sqlite3.rst:2590 +msgid "How to handle non-UTF-8 text encodings" +msgstr "如何处理非 UTF-8 文本编码格式" + +#: ../../library/sqlite3.rst:2592 +msgid "" +"By default, :mod:`!sqlite3` uses :class:`str` to adapt SQLite values with " +"the ``TEXT`` data type. This works well for UTF-8 encoded text, but it might" +" fail for other encodings and invalid UTF-8. You can use a custom " +":attr:`~Connection.text_factory` to handle such cases." +msgstr "" +"在默认情况下,:mod:`!sqlite3` 使用 :class:`str` 来适配 ``TEXT`` 数据类型的 SQLite 值。这对 UTF-8 " +"编码的文本来说很适用,但对于其他编码格式和无效的 UTF-8 来说则可能出错。你可以使用自定义的 " +":attr:`~Connection.text_factory` 来处理这种情况。" + +#: ../../library/sqlite3.rst:2598 +msgid "" +"Because of SQLite's `flexible typing`_, it is not uncommon to encounter " +"table columns with the ``TEXT`` data type containing non-UTF-8 encodings, or" +" even arbitrary data. To demonstrate, let's assume we have a database with " +"ISO-8859-2 (Latin-2) encoded text, for example a table of Czech-English " +"dictionary entries. Assuming we now have a :class:`Connection` instance " +":py:data:`!con` connected to this database, we can decode the Latin-2 " +"encoded text using this :attr:`~Connection.text_factory`:" +msgstr "" +"由于 SQLite 的 `flexible typing`_,遇到包含非 UTF-8 编码格式的 ``TEXT`` " +"数据类型甚至任意数据的表字段的情况并不少见。作为演示,让我们假定有一个使用 ISO-8859-2 (Latin-2) 编码的文本的数据库,例如一个捷克语" +" - 英语字典条目的表。假定我们现在有一个 :class:`Connection` 实例 :py:data:`!con` " +"已连接到这个数据库,我们将可以使用这个 :attr:`~Connection.text_factory` 来解码使用 Latin-2 编码的文本:" + +#: ../../library/sqlite3.rst:2607 +msgid "con.text_factory = lambda data: str(data, encoding=\"latin2\")" +msgstr "con.text_factory = lambda data: str(data, encoding=\"latin2\")" + +#: ../../library/sqlite3.rst:2611 +msgid "" +"For invalid UTF-8 or arbitrary data in stored in ``TEXT`` table columns, you" +" can use the following technique, borrowed from the :ref:`unicode-howto`:" +msgstr "" +"对于存储在 ``TEXT`` 表字段中的无效 UTF-8 或任意数据,你可以使用以下技巧,借用自 :ref:`unicode-howto`:" + +#: ../../library/sqlite3.rst:2614 +msgid "con.text_factory = lambda data: str(data, errors=\"surrogateescape\")" +msgstr "con.text_factory = lambda data: str(data, errors=\"surrogateescape\")" + +#: ../../library/sqlite3.rst:2620 +msgid "" +"The :mod:`!sqlite3` module API does not support strings containing " +"surrogates." +msgstr ":mod:`!sqlite3` 模块 API 不支持包含替代符的字符串。" + +#: ../../library/sqlite3.rst:2625 +msgid ":ref:`unicode-howto`" +msgstr ":ref:`unicode-howto`" + +#: ../../library/sqlite3.rst:2631 +msgid "Explanation" +msgstr "说明" + +#: ../../library/sqlite3.rst:2637 +msgid "Transaction control" +msgstr "事务控制" + +#: ../../library/sqlite3.rst:2639 +msgid "" +":mod:`!sqlite3` offers multiple methods of controlling whether, when and how" +" database transactions are opened and closed. :ref:`sqlite3-transaction-" +"control-autocommit` is recommended, while :ref:`sqlite3-transaction-control-" +"isolation-level` retains the pre-Python 3.12 behaviour." +msgstr "" +":mod:`!sqlite3` 提供了多个方法来控制在何时以及怎样控制数据库事务的开启和关闭。推荐使用 " +":ref:`sqlite3-transaction-control-autocommit`,而 :ref:`sqlite3-transaction-" +"control-isolation-level` 则保留了 Python 3.12 之前的行为。" + +#: ../../library/sqlite3.rst:2648 +msgid "Transaction control via the ``autocommit`` attribute" +msgstr "通过 ``autocommit`` 属性进行事务控制" + +#: ../../library/sqlite3.rst:2650 +msgid "" +"The recommended way of controlling transaction behaviour is through the " +":attr:`Connection.autocommit` attribute, which should preferably be set " +"using the *autocommit* parameter of :func:`connect`." +msgstr "" +"控制事务行为的推荐方式是通过 :attr:`Connection.autocommit` 属性,最好是使用 :func:`connect` 的 " +"*autocommit* 形参来设置该属性。" + +#: ../../library/sqlite3.rst:2655 +msgid "" +"It is suggested to set *autocommit* to ``False``, which implies " +":pep:`249`-compliant transaction control. This means:" +msgstr "建议将 *autocommit* 设为 ``False``,表示使用兼容 :pep:`249` 的事务控制。这意味着:" + +#: ../../library/sqlite3.rst:2659 +msgid "" +":mod:`!sqlite3` ensures that a transaction is always open, so " +":func:`connect`, :meth:`Connection.commit`, and :meth:`Connection.rollback` " +"will implicitly open a new transaction (immediately after closing the " +"pending one, for the latter two). :mod:`!sqlite3` uses ``BEGIN DEFERRED`` " +"statements when opening transactions." +msgstr "" +":mod:`!sqlite3` 会确保事务始终处于开启状态,因此 :func:`connect`、:meth:`Connection.commit` 和" +" :meth:`Connection.rollback` 将隐式地开启一个新事务(对于后两者,在关闭待处理事务后会立即执行)。开启事务时 " +":mod:`!sqlite3` 会使用 ``BEGIN DEFERRED`` 语句。" + +#: ../../library/sqlite3.rst:2664 +msgid "Transactions should be committed explicitly using :meth:`!commit`." +msgstr "事务应当显式地使用 :meth:`!commit` 执行提交。" + +#: ../../library/sqlite3.rst:2665 +msgid "Transactions should be rolled back explicitly using :meth:`!rollback`." +msgstr "事务应当显式地使用 :meth:`!rollback` 执行回滚。" + +#: ../../library/sqlite3.rst:2666 +msgid "" +"An implicit rollback is performed if the database is " +":meth:`~Connection.close`-ed with pending changes." +msgstr "如果数据库执行 :meth:`~Connection.close` 时有待处理的更改则会隐式地执行回滚。" + +#: ../../library/sqlite3.rst:2669 +msgid "" +"Set *autocommit* to ``True`` to enable SQLite's `autocommit mode`_. In this " +"mode, :meth:`Connection.commit` and :meth:`Connection.rollback` have no " +"effect. Note that SQLite's autocommit mode is distinct from the " +":pep:`249`-compliant :attr:`Connection.autocommit` attribute; use " +":attr:`Connection.in_transaction` to query the low-level SQLite autocommit " +"mode." +msgstr "" +"将 *autocommit* 设为 ``True`` 以启用 SQLite 的 `autocommit mode`_。 " +"在此模式下,:meth:`Connection.commit` 和 :meth:`Connection.rollback` 将没有任何作用。请注意 " +"SQLite 的自动提交模式与兼容 :pep:`249` 的 :attr:`Connection.autocommit` 属性不同;请使用 " +":attr:`Connection.in_transaction` 查询底层的 SQLite 自动提交模式。" + +#: ../../library/sqlite3.rst:2677 +msgid "" +"Set *autocommit* to :data:`LEGACY_TRANSACTION_CONTROL` to leave transaction " +"control behaviour to the :attr:`Connection.isolation_level` attribute. See " +":ref:`sqlite3-transaction-control-isolation-level` for more information." +msgstr "" +"将 *autocommit* 设为 :data:`LEGACY_TRANSACTION_CONTROL` 以将事务控制行为保留给 " +":attr:`Connection.isolation_level` 属性。更多信息参见 :ref:`sqlite3-transaction-" +"control-isolation-level`." + +#: ../../library/sqlite3.rst:2686 +msgid "Transaction control via the ``isolation_level`` attribute" +msgstr "通过 ``isolation_level`` 属性进行事务控制" + +#: ../../library/sqlite3.rst:2690 +msgid "" +"The recommended way of controlling transactions is via the " +":attr:`~Connection.autocommit` attribute. See :ref:`sqlite3-transaction-" +"control-autocommit`." +msgstr "" +"推荐的控制事务方式是通过 :attr:`~Connection.autocommit` 属性。参见 :ref:`sqlite3-transaction-" +"control-autocommit`." + +#: ../../library/sqlite3.rst:2694 +msgid "" +"If :attr:`Connection.autocommit` is set to " +":data:`LEGACY_TRANSACTION_CONTROL` (the default), transaction behaviour is " +"controlled using the :attr:`Connection.isolation_level` attribute. " +"Otherwise, :attr:`!isolation_level` has no effect." +msgstr "" +"如果 :attr:`Connection.autocommit` 被设为 :data:`LEGACY_TRANSACTION_CONTROL` " +"(默认值),则事务行为由 :attr:`Connection.isolation_level` 属性控制。 " +"否则,:attr:`!isolation_level` 将没有任何作用。" + +#: ../../library/sqlite3.rst:2700 +msgid "" +"If the connection attribute :attr:`~Connection.isolation_level` is not " +"``None``, new transactions are implicitly opened before " +":meth:`~Cursor.execute` and :meth:`~Cursor.executemany` executes ``INSERT``," +" ``UPDATE``, ``DELETE``, or ``REPLACE`` statements; for other statements, no" +" implicit transaction handling is performed. Use the " +":meth:`~Connection.commit` and :meth:`~Connection.rollback` methods to " +"respectively commit and roll back pending transactions. You can choose the " +"underlying `SQLite transaction behaviour`_ — that is, whether and what type " +"of ``BEGIN`` statements :mod:`!sqlite3` implicitly executes – via the " +":attr:`~Connection.isolation_level` attribute." +msgstr "" +"如果连接的属性 :attr:`~Connection.isolation_level` 不为 ``None``,新的事务会在 " +":meth:`~Cursor.execute` 和 :meth:`~Cursor.executemany` 执行 ``INSERT``, " +"``UPDATE``, ``DELETE`` 或 ``REPLACE`` 语句之前隐式地开启;对于其他语句,则不会执行隐式的事务处理。可分别使用 " +":meth:`~Connection.commit` 和 :meth:`~Connection.rollback` 方法提交和回滚未应用的事务。 " +"你可以通过 :attr:`~Connection.isolation_level` 属性来选择下层的 `SQLite transaction " +"behaviour`_ — 也就是说,:mod:`!sqlite3` 是否要隐式地执行以及执行何种类型的 ``BEGIN`` 语句" + +#: ../../library/sqlite3.rst:2713 +msgid "" +"If :attr:`~Connection.isolation_level` is set to ``None``, no transactions " +"are implicitly opened at all. This leaves the underlying SQLite library in " +"`autocommit mode`_, but also allows the user to perform their own " +"transaction handling using explicit SQL statements. The underlying SQLite " +"library autocommit mode can be queried using the " +":attr:`~Connection.in_transaction` attribute." +msgstr "" +"如果 :attr:`~Connection.isolation_level` 被设为 ``None``,则完全不会隐式地开启任何事务。这将使下层 " +"SQLite 库处于 `autocommit mode`_,但也允许用户使用显式 SQL 语句执行他们自己的事务处理。下层 SQLite " +"库的自动提交模式可使用 :attr:`~Connection.in_transaction` 属性来查询。" + +#: ../../library/sqlite3.rst:2721 +msgid "" +"The :meth:`~Cursor.executescript` method implicitly commits any pending " +"transaction before execution of the given SQL script, regardless of the " +"value of :attr:`~Connection.isolation_level`." +msgstr "" +":meth:`~Cursor.executescript` 方法会在执行给定的 SQL 脚本之前隐式地提交任何挂起的事务,无论 " +":attr:`~Connection.isolation_level` 的值是什么。" + +#: ../../library/sqlite3.rst:2725 +msgid "" +":mod:`!sqlite3` used to implicitly commit an open transaction before DDL " +"statements. This is no longer the case." +msgstr "在以前 :mod:`!sqlite3` 会在 DDL 语句之前隐式地提交已开启的事务。现在则不会再这样做。" + +#: ../../library/sqlite3.rst:2729 +msgid "" +"The recommended way of controlling transactions is now via the " +":attr:`~Connection.autocommit` attribute." +msgstr "现在推荐的控制事务方式是通过 :attr:`~Connection.autocommit` 属性。" + +#: ../../library/sqlite3.rst:1474 +msgid "? (question mark)" +msgstr "? (问号)" + +#: ../../library/sqlite3.rst:1474 ../../library/sqlite3.rst:1475 +msgid "in SQL statements" +msgstr "在 SQL 语句中" + +#: ../../library/sqlite3.rst:1475 +msgid ": (colon)" +msgstr ": (冒号)" diff --git a/library/ssl.po b/library/ssl.po new file mode 100644 index 0000000000..d0277ea422 --- /dev/null +++ b/library/ssl.po @@ -0,0 +1,4431 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-06-03 19:20+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/ssl.rst:2 +msgid ":mod:`!ssl` --- TLS/SSL wrapper for socket objects" +msgstr ":mod:`!ssl` --- 套接字对象的 TLS/SSL 包装器" + +#: ../../library/ssl.rst:10 +msgid "**Source code:** :source:`Lib/ssl.py`" +msgstr "**源代码:** :source:`Lib/ssl.py`" + +#: ../../library/ssl.rst:18 +msgid "" +"This module provides access to Transport Layer Security (often known as " +"\"Secure Sockets Layer\") encryption and peer authentication facilities for " +"network sockets, both client-side and server-side. This module uses the " +"OpenSSL library." +msgstr "" +"本模块提供了对传输层安全(常被称为“安全套接字层”)加密和网络套接字的对等认证功能的访问,包括客户端和服务器端。本模块使用了 OpenSSL 库。" + +#: ../../includes/optional-module.rst:1 +msgid "" +"This is an :term:`optional module`. If it is missing from your copy of " +"CPython, look for documentation from your distributor (that is, whoever " +"provided Python to you). If you are the distributor, see :ref:`optional-" +"module-requirements`." +msgstr "" +"这是一个 :term:`optional module`。如果它在你的 CPython 副本中缺失,请查看你的发行方(也就是说,向你提供 Python " +"的人)的文档。如果你就是发行方,请参阅 :ref:`optional-module-requirements`。" + +#: ../../library/ssl.rst:27 +msgid "" +"Some behavior may be platform dependent, since calls are made to the " +"operating system socket APIs. The installed version of OpenSSL may also " +"cause variations in behavior. For example, TLSv1.3 comes with OpenSSL " +"version 1.1.1." +msgstr "" +"某些行为可能依赖于具体平台,因为调用了操作系统的套接字 API. 已安装的 OpenSSL 版本也可能会导致不同的行为。比如,TLSv1.3 是 " +"OpenSSL 1.1.1 版才提供的。" + +#: ../../library/ssl.rst:33 +msgid "" +"Don't use this module without reading the :ref:`ssl-security`. Doing so may" +" lead to a false sense of security, as the default settings of the ssl " +"module are not necessarily appropriate for your application." +msgstr "" +"在阅读 :ref:`ssl-security` 前不要使用此模块。这样做可能会导致虚假的安全感,因为 ssl 模块的默认设置不一定适合你的应用程序。" + +#: ../../library/ssl.rst:456 ../../library/ssl.rst:471 +#: ../../includes/wasm-notavail.rst:3 +msgid "Availability" +msgstr "Availability" + +#: ../../includes/wasm-notavail.rst:5 +msgid "" +"This module does not work or is not available on WebAssembly. See " +":ref:`wasm-availability` for more information." +msgstr "此模块在 WebAssembly 平台上无效或不可用。请参阅 :ref:`wasm-availability` 了解详情。" + +#: ../../library/ssl.rst:39 +msgid "" +"This section documents the objects and functions in the ``ssl`` module; for " +"more general information about TLS, SSL, and certificates, the reader is " +"referred to the documents in the \"See Also\" section at the bottom." +msgstr "本节记录 ``ssl`` 模块的对象和函数;更多关于 TLS、SSL 和证书的信息,请参阅下方的“另请参阅”部分" + +#: ../../library/ssl.rst:43 +msgid "" +"This module provides a class, :class:`ssl.SSLSocket`, which is derived from " +"the :class:`socket.socket` type, and provides a socket-like wrapper that " +"also encrypts and decrypts the data going over the socket with SSL. It " +"supports additional methods such as :meth:`getpeercert`, which retrieves the" +" certificate of the other side of the connection, :meth:`cipher`, which " +"retrieves the cipher being used for the secure connection or " +":meth:`get_verified_chain`, :meth:`get_unverified_chain` which retrieves " +"certificate chain." +msgstr "" +"本模块提供了一个类 :class:`ssl.SSLSocket`,它派生自 :class:`socket.socket` " +"类型,并提供类似套接字的包装器,也能够使用 SSL 对通过套接字的数据进行加密和解密。它支持一些额外方法例如 " +":meth:`getpeercert`,该方法可以从连接的另一端获取证书,还有 :meth:`cipher`,该方法可获取安全连接所使用的密码,以及 " +":meth:`get_verified_chain`、:meth:`get_unverified_chain`,它们可获取证书链。" + +#: ../../library/ssl.rst:52 +msgid "" +"For more sophisticated applications, the :class:`ssl.SSLContext` class helps" +" manage settings and certificates, which can then be inherited by SSL " +"sockets created through the :meth:`SSLContext.wrap_socket` method." +msgstr "" +"对于更复杂的应用程序,:class:`ssl.SSLContext` 类有助于管理设置项和证书,进而可以被使用 " +":meth:`SSLContext.wrap_socket` 方法创建的 SSL 套接字继承。" + +#: ../../library/ssl.rst:56 +msgid "Updated to support linking with OpenSSL 1.1.0" +msgstr "更新以支持和 OpenSSL 1.1.0 的链接" + +#: ../../library/ssl.rst:61 +msgid "" +"OpenSSL 0.9.8, 1.0.0 and 1.0.1 are deprecated and no longer supported. In " +"the future the ssl module will require at least OpenSSL 1.0.2 or 1.1.0." +msgstr "" +"OpenSSL 0.9.8、1.0.0 和 1.0.1 已过时,将不再被支持。在 ssl 模块未来的版本中,最低需要 OpenSSL 1.0.2 或 " +"1.1.0。" + +#: ../../library/ssl.rst:67 +msgid "" +":pep:`644` has been implemented. The ssl module requires OpenSSL 1.1.1 or " +"newer." +msgstr ":pep:`644` 已经实现。ssl 模块需要 OpenSSL 1.1.1 以上版本的支持。" + +#: ../../library/ssl.rst:70 +msgid "" +"Use of deprecated constants and functions result in deprecation warnings." +msgstr "使用废弃的常量和函数会导致废弃警告。" + +#: ../../library/ssl.rst:74 +msgid "Functions, constants, and exceptions" +msgstr "函数、常量和异常" + +#: ../../library/ssl.rst:78 +msgid "Socket creation" +msgstr "套接字创建" + +#: ../../library/ssl.rst:80 +msgid "" +"Instances of :class:`SSLSocket` must be created using the " +":meth:`SSLContext.wrap_socket` method. The helper function " +":func:`create_default_context` returns a new context with secure default " +"settings." +msgstr "" +":class:`SSLSocket` 的实例必须使用 :meth:`SSLContext.wrap_socket` 方法来创建。辅助函数 " +":func:`create_default_context` 将返回一个使用安全的默认设置的新上下文。" + +#: ../../library/ssl.rst:85 +msgid "Client socket example with default context and IPv4/IPv6 dual stack::" +msgstr "客户端套接字实例,采用默认上下文和 IPv4/IPv6 双栈::" + +#: ../../library/ssl.rst:87 +msgid "" +"import socket\n" +"import ssl\n" +"\n" +"hostname = 'www.python.org'\n" +"context = ssl.create_default_context()\n" +"\n" +"with socket.create_connection((hostname, 443)) as sock:\n" +" with context.wrap_socket(sock, server_hostname=hostname) as ssock:\n" +" print(ssock.version())" +msgstr "" +"import socket\n" +"import ssl\n" +"\n" +"hostname = 'www.python.org'\n" +"context = ssl.create_default_context()\n" +"\n" +"with socket.create_connection((hostname, 443)) as sock:\n" +" with context.wrap_socket(sock, server_hostname=hostname) as ssock:\n" +" print(ssock.version())" + +#: ../../library/ssl.rst:98 +msgid "Client socket example with custom context and IPv4::" +msgstr "客户端套接字示例,带有自定义上下文和 IPv4::" + +#: ../../library/ssl.rst:100 +msgid "" +"hostname = 'www.python.org'\n" +"# PROTOCOL_TLS_CLIENT requires valid cert chain and hostname\n" +"context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)\n" +"context.load_verify_locations('path/to/cabundle.pem')\n" +"\n" +"with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock:\n" +" with context.wrap_socket(sock, server_hostname=hostname) as ssock:\n" +" print(ssock.version())" +msgstr "" +"hostname = 'www.python.org'\n" +"# PROTOCOL_TLS_CLIENT 需要有效的证书链和主机名\n" +"context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)\n" +"context.load_verify_locations('path/to/cabundle.pem')\n" +"\n" +"with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock:\n" +" with context.wrap_socket(sock, server_hostname=hostname) as ssock:\n" +" print(ssock.version())" + +#: ../../library/ssl.rst:110 +msgid "Server socket example listening on localhost IPv4::" +msgstr "服务器套接字实例,在 localhost 上监听 IPv4::" + +#: ../../library/ssl.rst:112 +msgid "" +"context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)\n" +"context.load_cert_chain('/path/to/certchain.pem', '/path/to/private.key')\n" +"\n" +"with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock:\n" +" sock.bind(('127.0.0.1', 8443))\n" +" sock.listen(5)\n" +" with context.wrap_socket(sock, server_side=True) as ssock:\n" +" conn, addr = ssock.accept()\n" +" ..." +msgstr "" +"context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)\n" +"context.load_cert_chain('/path/to/certchain.pem', '/path/to/private.key')\n" +"\n" +"with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock:\n" +" sock.bind(('127.0.0.1', 8443))\n" +" sock.listen(5)\n" +" with context.wrap_socket(sock, server_side=True) as ssock:\n" +" conn, addr = ssock.accept()\n" +" ..." + +#: ../../library/ssl.rst:124 +msgid "Context creation" +msgstr "上下文创建" + +#: ../../library/ssl.rst:126 +msgid "" +"A convenience function helps create :class:`SSLContext` objects for common " +"purposes." +msgstr "便捷函数,可以帮助创建 :class:`SSLContext` 对象,用于常见的目的。" + +#: ../../library/ssl.rst:132 +msgid "" +"Return a new :class:`SSLContext` object with default settings for the given " +"*purpose*. The settings are chosen by the :mod:`!ssl` module, and usually " +"represent a higher security level than when calling the :class:`SSLContext` " +"constructor directly." +msgstr "" +"返回一个新的 :class:`SSLContext` 对象并使用给定 *purpose* 的默认设置。 这些设置由 :mod:`!ssl` " +"模块选择,并且通常是代表一个比直接调用 :class:`SSLContext` 构造器时更高的安全等级。" + +#: ../../library/ssl.rst:137 +msgid "" +"*cafile*, *capath*, *cadata* represent optional CA certificates to trust for" +" certificate verification, as in :meth:`SSLContext.load_verify_locations`. " +"If all three are :const:`None`, this function can choose to trust the " +"system's default CA certificates instead." +msgstr "" +"*cafile*, *capath*, *cadata* 代表用于进行证书核验的可选受信任 CA 证书,与 " +":meth:`SSLContext.load_verify_locations` 的一致。如果三个参数均为 " +":const:`None`,此函数可以转而选择信任系统的默认 CA 证书。" + +#: ../../library/ssl.rst:143 +msgid "" +"The settings are: :data:`PROTOCOL_TLS_CLIENT` or " +":data:`PROTOCOL_TLS_SERVER`, :data:`OP_NO_SSLv2`, and :data:`OP_NO_SSLv3` " +"with high encryption cipher suites without RC4 and without unauthenticated " +"cipher suites. Passing :const:`~Purpose.SERVER_AUTH` as *purpose* sets " +":data:`~SSLContext.verify_mode` to :data:`CERT_REQUIRED` and either loads CA" +" certificates (when at least one of *cafile*, *capath* or *cadata* is given)" +" or uses :meth:`SSLContext.load_default_certs` to load default CA " +"certificates." +msgstr "" +"设置为::data:`PROTOCOL_TLS_CLIENT` 或 :data:`PROTOCOL_TLS_SERVER`, " +":data:`OP_NO_SSLv2` 和 :data:`OP_NO_SSLv3` 带有不含 RC4 及未认证的高强度加密密码套件。传入 " +":const:`~Purpose.SERVER_AUTH` 作为 *purpose* 将把 " +":data:`~SSLContext.verify_mode` 设为 :data:`CERT_REQUIRED` 并加载 CA 证书(若至少给出 " +"*cafile*, *capath* 或 *cadata* 之一)或使用 :meth:`SSLContext.load_default_certs` " +"加载默认的 CA 证书。" + +#: ../../library/ssl.rst:152 +msgid "" +"When :attr:`~SSLContext.keylog_filename` is supported and the environment " +"variable :envvar:`SSLKEYLOGFILE` is set, :func:`create_default_context` " +"enables key logging." +msgstr "" +"当 :attr:`~SSLContext.keylog_filename` 受支持并且设置了环境变量 :envvar:`SSLKEYLOGFILE` " +"时,:func:`create_default_context` 会启用密钥日志记录。" + +#: ../../library/ssl.rst:156 +msgid "" +"The default settings for this context include " +":data:`VERIFY_X509_PARTIAL_CHAIN` and :data:`VERIFY_X509_STRICT`. These make" +" the underlying OpenSSL implementation behave more like a conforming " +"implementation of :rfc:`5280`, in exchange for a small amount of " +"incompatibility with older X.509 certificates." +msgstr "" +"此上下文的默认设置包括 :data:`VERIFY_X509_PARTIAL_CHAIN` 和 :data:`VERIFY_X509_STRICT`。 " +"这使得下层的 OpenSSL 实现的行为与符合 :rfc:`5280` 的实现更为相似,代价则是与较旧的 X.509 证书存在少量不兼容。" + +#: ../../library/ssl.rst:163 +msgid "" +"The protocol, options, cipher and other settings may change to more " +"restrictive values anytime without prior deprecation. The values represent " +"a fair balance between compatibility and security." +msgstr "协议、选项、密码和其他设置可随时更改为更具约束性的值而无须事先弃用。这些值代表了兼容性和安全性之间的合理平衡。" + +#: ../../library/ssl.rst:167 +msgid "" +"If your application needs specific settings, you should create a " +":class:`SSLContext` and apply the settings yourself." +msgstr "如果你的应用需要特定的设置,你应当创建一个 :class:`SSLContext` 并自行应用设置。" + +#: ../../library/ssl.rst:171 +msgid "" +"If you find that when certain older clients or servers attempt to connect " +"with a :class:`SSLContext` created by this function that they get an error " +"stating \"Protocol or cipher suite mismatch\", it may be that they only " +"support SSL3.0 which this function excludes using the :data:`OP_NO_SSLv3`. " +"SSL3.0 is widely considered to be `completely broken " +"`_. If you still wish to continue to " +"use this function but still allow SSL 3.0 connections you can re-enable them" +" using::" +msgstr "" +"如果你发现当某些较旧的客户端或服务器尝试与用此函数创建的 :class:`SSLContext` 进行连接时收到了报错提示 \"Protocol or " +"cipher suite mismatch\",这可能是因为它们只支持 SSL3.0 而它被此函数用 :data:`OP_NO_SSLv3` 排除掉了。" +" SSL3.0 被广泛认为 `完全不可用 `_。 " +"如果你仍希望继续使用此函数但仍允许 SSL 3.0 连接,你可以使用以下代码重新启用它们::" + +#: ../../library/ssl.rst:180 +msgid "" +"ctx = ssl.create_default_context(Purpose.CLIENT_AUTH)\n" +"ctx.options &= ~ssl.OP_NO_SSLv3" +msgstr "" +"ctx = ssl.create_default_context(Purpose.CLIENT_AUTH)\n" +"ctx.options &= ~ssl.OP_NO_SSLv3" + +#: ../../library/ssl.rst:184 +msgid "" +"This context enables :data:`VERIFY_X509_STRICT` by default, which may reject" +" pre-:rfc:`5280` or malformed certificates that the underlying OpenSSL " +"implementation otherwise would accept. While disabling this is not " +"recommended, you can do so using::" +msgstr "" +"此上下文默认会启用 :data:`VERIFY_X509_STRICT`,它可能拒绝下层 OpenSSL 实现在其他情况下应当会接受的 " +":rfc:`5280` 之前的证书或格式错误的证书。虽然不建议禁用此功能,但你可以使用以下方式做到这一点::" + +#: ../../library/ssl.rst:189 +msgid "" +"ctx = ssl.create_default_context()\n" +"ctx.verify_flags &= ~ssl.VERIFY_X509_STRICT" +msgstr "" +"ctx = ssl.create_default_context()\n" +"ctx.verify_flags &= ~ssl.VERIFY_X509_STRICT" + +#: ../../library/ssl.rst:196 +msgid "RC4 was dropped from the default cipher string." +msgstr "RC4 被从默认密码字符串中丢弃。" + +#: ../../library/ssl.rst:200 +msgid "ChaCha20/Poly1305 was added to the default cipher string." +msgstr "ChaCha20/Poly1305 被添加到默认密码字符串中。" + +#: ../../library/ssl.rst:202 +msgid "3DES was dropped from the default cipher string." +msgstr "3DES 被从默认密码字符串中丢弃。" + +#: ../../library/ssl.rst:206 +msgid "Support for key logging to :envvar:`SSLKEYLOGFILE` was added." +msgstr "增加了对密钥日志记录至 :envvar:`SSLKEYLOGFILE` 的支持。" + +#: ../../library/ssl.rst:210 +msgid "" +"The context now uses :data:`PROTOCOL_TLS_CLIENT` or " +":data:`PROTOCOL_TLS_SERVER` protocol instead of generic " +":data:`PROTOCOL_TLS`." +msgstr "" +"当前上下文使用 :data:`PROTOCOL_TLS_CLIENT` 或 :data:`PROTOCOL_TLS_SERVER` 协议而非通用的 " +":data:`PROTOCOL_TLS`." + +#: ../../library/ssl.rst:216 +msgid "" +"The context now uses :data:`VERIFY_X509_PARTIAL_CHAIN` and " +":data:`VERIFY_X509_STRICT` in its default verify flags." +msgstr "" +"此上下文现在会在其默认验证旗标中使用 :data:`VERIFY_X509_PARTIAL_CHAIN` 和 " +":data:`VERIFY_X509_STRICT`." + +#: ../../library/ssl.rst:221 +msgid "Exceptions" +msgstr "异常" + +#: ../../library/ssl.rst:225 +msgid "" +"Raised to signal an error from the underlying SSL implementation (currently " +"provided by the OpenSSL library). This signifies some problem in the " +"higher-level encryption and authentication layer that's superimposed on the " +"underlying network connection. This error is a subtype of :exc:`OSError`. " +"The error code and message of :exc:`SSLError` instances are provided by the " +"OpenSSL library." +msgstr "" +"引发此异常以提示来自下层 SSL 实现(目前由 OpenSSL 库提供)的错误。它表示在下层网络连接之上叠加的高层级加密和验证层存在某种问题。 此错误是" +" :exc:`OSError` 的一个子类型。 :exc:`SSLError` 实例的错误和消息是由 OpenSSL 库提供的。" + +#: ../../library/ssl.rst:232 +msgid ":exc:`SSLError` used to be a subtype of :exc:`socket.error`." +msgstr ":exc:`SSLError` 曾经是 :exc:`socket.error` 的一个子类型。" + +#: ../../library/ssl.rst:237 +msgid "" +"A string mnemonic designating the OpenSSL submodule in which the error " +"occurred, such as ``SSL``, ``PEM`` or ``X509``. The range of possible " +"values depends on the OpenSSL version." +msgstr "" +"一个字符串形式的助记符,用来指明发生错误的 OpenSSL 子模块,例如 ``SSL``, ``PEM`` 或 ``X509``。可能的取值范围依赖于 " +"OpenSSL 的版本。" + +#: ../../library/ssl.rst:245 +msgid "" +"A string mnemonic designating the reason this error occurred, for example " +"``CERTIFICATE_VERIFY_FAILED``. The range of possible values depends on the " +"OpenSSL version." +msgstr "" +"一个字符串形式的助记符,用来指明发生错误的原因,例如 ``CERTIFICATE_VERIFY_FAILED``。可能的取值范围依赖于 OpenSSL " +"的版本。" + +#: ../../library/ssl.rst:253 +msgid "" +"A subclass of :exc:`SSLError` raised when trying to read or write and the " +"SSL connection has been closed cleanly. Note that this doesn't mean that " +"the underlying transport (read TCP) has been closed." +msgstr "" +":exc:`SSLError` 的子类,当尝试读取或写入且 SSL 连接已被完全关闭时会被引发。请注意这并不意味着下层的传输(读取 TCP)已被关闭。" + +#: ../../library/ssl.rst:261 +msgid "" +"A subclass of :exc:`SSLError` raised by a :ref:`non-blocking SSL socket " +"` when trying to read or write data, but more data needs to" +" be received on the underlying TCP transport before the request can be " +"fulfilled." +msgstr "" +":exc:`SSLError` 的子类,当尝试读取或写入数据,但在请求被满足之前还需要在下层的 TCP 传输上接收更多数据时会被 :ref:`非阻塞型 " +"SSL 套接字 ` 引发。" + +#: ../../library/ssl.rst:270 +msgid "" +"A subclass of :exc:`SSLError` raised by a :ref:`non-blocking SSL socket " +"` when trying to read or write data, but more data needs to" +" be sent on the underlying TCP transport before the request can be " +"fulfilled." +msgstr "" +":exc:`SSLError` 的子类,当尝试读取或写入数据,但在请求被满足之前还需要在下层的 TCP 传输上发送更多数据时会被 :ref:`非阻塞型 " +"SSL 套接字 ` 引发。" + +#: ../../library/ssl.rst:279 +msgid "" +"A subclass of :exc:`SSLError` raised when a system error was encountered " +"while trying to fulfill an operation on a SSL socket. Unfortunately, there " +"is no easy way to inspect the original errno number." +msgstr "" +":exc:`SSLError` 的子类,当尝试在 SSL 套接字上执行操作时遇到系统错误时会被引发。不幸的是,没有简单的方式能检查原始 errno " +"编号。" + +#: ../../library/ssl.rst:287 +msgid "" +"A subclass of :exc:`SSLError` raised when the SSL connection has been " +"terminated abruptly. Generally, you shouldn't try to reuse the underlying " +"transport when this error is encountered." +msgstr ":exc:`SSLError` 的子类,当 SSL 连接被突然终止时会被引发。通常,当遇到此错误时你不应再尝试重用下层的传输。" + +#: ../../library/ssl.rst:295 +msgid "" +"A subclass of :exc:`SSLError` raised when certificate validation has failed." +msgstr ":exc:`SSLError` 的子类,当证书验证失败时会被引发。" + +#: ../../library/ssl.rst:302 +msgid "A numeric error number that denotes the verification error." +msgstr "一个数字形式的错误编号,用于表示验证错误。" + +#: ../../library/ssl.rst:306 +msgid "A human readable string of the verification error." +msgstr "用于表示验证错误的人类可读的字符串。" + +#: ../../library/ssl.rst:310 +msgid "An alias for :exc:`SSLCertVerificationError`." +msgstr ":exc:`SSLCertVerificationError` 的别名。" + +#: ../../library/ssl.rst:312 +msgid "The exception is now an alias for :exc:`SSLCertVerificationError`." +msgstr "此异常现在是 :exc:`SSLCertVerificationError` 的别名。" + +#: ../../library/ssl.rst:317 +msgid "Random generation" +msgstr "随机生成" + +#: ../../library/ssl.rst:321 +msgid "" +"Return *num* cryptographically strong pseudo-random bytes. Raises an " +":class:`SSLError` if the PRNG has not been seeded with enough data or if the" +" operation is not supported by the current RAND method. :func:`RAND_status` " +"can be used to check the status of the PRNG and :func:`RAND_add` can be used" +" to seed the PRNG." +msgstr "" +"返回 *num* 个高加密强度伪随机字节数据。如果 PRNG 未使用足够的数据作为随机种子或者如果当前 RAND 方法不支持该操作则会引发 " +":class:`SSLError`。 :func:`RAND_status` 可被用来检查 PRNG 的状态而 :func:`RAND_add` " +"可被用来为 PRNG 设置随机种子。" + +#: ../../library/ssl.rst:327 +msgid "For almost all applications :func:`os.urandom` is preferable." +msgstr "对于几乎所有应用程序都更推荐使用 :func:`os.urandom`。" + +#: ../../library/ssl.rst:329 +msgid "" +"Read the Wikipedia article, `Cryptographically secure pseudorandom number " +"generator (CSPRNG) " +"`_," +" to get the requirements of a cryptographically strong generator." +msgstr "" +"请阅读维基百科文章 `Cryptographically secure pseudorandom number generator (CSPRNG) " +"`_" +" 以了解对于高加密强度生成器的具体要求。" + +#: ../../library/ssl.rst:338 +msgid "" +"Return ``True`` if the SSL pseudo-random number generator has been seeded " +"with 'enough' randomness, and ``False`` otherwise. You can use " +":func:`ssl.RAND_egd` and :func:`ssl.RAND_add` to increase the randomness of " +"the pseudo-random number generator." +msgstr "" +"如果 SSL 伪随机数生成器已使用‘足够的’随机性作为种子则返回 ``True``,否则返回 ``False``。你可以使用 " +":func:`ssl.RAND_egd` 和 :func:`ssl.RAND_add` 来增加伪随机数生成器的随机性。" + +#: ../../library/ssl.rst:345 +msgid "" +"Mix the given *bytes* into the SSL pseudo-random number generator. The " +"parameter *entropy* (a float) is a lower bound on the entropy contained in " +"string (so you can always use ``0.0``). See :rfc:`1750` for more " +"information on sources of entropy." +msgstr "" +"将给定的 *bytes* 混合到 SSL 伪随机数生成器中。参数 *entropy* (浮点数) 是字符串中包含的熵值的下限(因此可以始终使用 " +"``0.0``)。请参阅 :rfc:`1750` 了解有关熵源的更多信息。" + +#: ../../library/ssl.rst:350 +msgid "Writable :term:`bytes-like object` is now accepted." +msgstr "现在接受可写的 :term:`字节类对象 `。" + +#: ../../library/ssl.rst:354 +msgid "Certificate handling" +msgstr "证书处理" + +#: ../../library/ssl.rst:362 +msgid "" +"Return the time in seconds since the epoch, given the ``cert_time`` string " +"representing the \"notBefore\" or \"notAfter\" date from a certificate in " +"``\"%b %d %H:%M:%S %Y %Z\"`` strptime format (C locale)." +msgstr "" + +#: ../../library/ssl.rst:367 +msgid "Here's an example:" +msgstr "以下为示例代码:" + +#: ../../library/ssl.rst:369 +msgid "" +">>> import ssl\n" +">>> import datetime as dt\n" +">>> timestamp = ssl.cert_time_to_seconds(\"Jan 5 09:34:43 2018 GMT\")\n" +">>> timestamp\n" +"1515144883\n" +">>> print(dt.datetime.fromtimestamp(timestamp, dt.UTC))\n" +"2018-01-05 09:34:43+00:00" +msgstr "" + +#: ../../library/ssl.rst:379 +msgid "\"notBefore\" or \"notAfter\" dates must use GMT (:rfc:`5280`)." +msgstr "\"notBefore\" 或 \"notAfter\" 日期值必须使用 GMT (:rfc:`5280`)。" + +#: ../../library/ssl.rst:381 +msgid "" +"Interpret the input time as a time in UTC as specified by 'GMT' timezone in " +"the input string. Local timezone was used previously. Return an integer (no " +"fractions of a second in the input format)" +msgstr "" +"将输入时间解读为 UTC 时间,基于输入字符串中指明的 'GMT' 时区。在之前使用的是本地时区。返回一个整数(不带输入格式中秒的分数部分)" + +#: ../../library/ssl.rst:390 +msgid "" +"Given the address ``addr`` of an SSL-protected server, as a (*hostname*, " +"*port-number*) pair, fetches the server's certificate, and returns it as a " +"PEM-encoded string. If ``ssl_version`` is specified, uses that version of " +"the SSL protocol to attempt to connect to the server. If *ca_certs* is " +"specified, it should be a file containing a list of root certificates, the " +"same format as used for the *cafile* parameter in " +":meth:`SSLContext.load_verify_locations`. The call will attempt to validate" +" the server certificate against that set of root certificates, and will fail" +" if the validation attempt fails. A timeout can be specified with the " +"``timeout`` parameter." +msgstr "" +"给定使用 SSL 保护的服务器的地址 ``addr``,形式为一个 (*hostname*, *port-number*) " +"对,获取该服务器的证书,并返回为 PEM 编码的字符串。如果指定了 ``ssl_version``,则使用该版本的 SSL 协议尝试连接该服务器。 " +"如果指定了 *ca_certs*,它应当是一个包含根证书列表的文件,与 :meth:`SSLContext.load_verify_locations`" +" 中 *cafile* 形参所使用的格式相同。该调用将尝试根据该根证书集来验证服务器的证书,如果验证失败则调用也将失败。可以通过 ``timeout``" +" 形参来指定超时限制。" + +#: ../../library/ssl.rst:401 +msgid "This function is now IPv6-compatible." +msgstr "此函数现在是 IPv6 兼容的。" + +#: ../../library/ssl.rst:404 +msgid "" +"The default *ssl_version* is changed from :data:`PROTOCOL_SSLv3` to " +":data:`PROTOCOL_TLS` for maximum compatibility with modern servers." +msgstr "" +"默认的 *ssl_version* 从 :data:`PROTOCOL_SSLv3` 改为 :data:`PROTOCOL_TLS` " +"以保证与现代服务器的最大兼容性。" + +#: ../../library/ssl.rst:408 +msgid "The *timeout* parameter was added." +msgstr "加入 *timeout* 参数。" + +#: ../../library/ssl.rst:413 +msgid "" +"Given a certificate as a DER-encoded blob of bytes, returns a PEM-encoded " +"string version of the same certificate." +msgstr "根据给定的 DER 编码字节块形式的证书,返回同一证书的 PEM 编码字符串版本。" + +#: ../../library/ssl.rst:418 +msgid "" +"Given a certificate as an ASCII PEM string, returns a DER-encoded sequence " +"of bytes for that same certificate." +msgstr "根据给定的 ASCII PEM 字符串形式的证书,返回同一证书的 DER 编码字节序列。" + +#: ../../library/ssl.rst:423 +msgid "" +"Returns a named tuple with paths to OpenSSL's default cafile and capath. The" +" paths are the same as used by :meth:`SSLContext.set_default_verify_paths`. " +"The return value is a :term:`named tuple` ``DefaultVerifyPaths``:" +msgstr "" +"返回包含 OpenSSL 的默认 cafile 和 capath 的路径的命名元组。此路径与 " +":meth:`SSLContext.set_default_verify_paths` 所使用的相同。返回值是一个 :term:`named " +"tuple` ``DefaultVerifyPaths``:" + +#: ../../library/ssl.rst:428 +msgid "" +":attr:`cafile` - resolved path to cafile or ``None`` if the file doesn't " +"exist," +msgstr ":attr:`cafile` - 解析出的 cafile 路径或者如果文件不存在则为 ``None``," + +#: ../../library/ssl.rst:429 +msgid "" +":attr:`capath` - resolved path to capath or ``None`` if the directory " +"doesn't exist," +msgstr ":attr:`capath` - 解析出的 capath 路径或者如果目录不存在则为 ``None``," + +#: ../../library/ssl.rst:430 +msgid "" +":attr:`openssl_cafile_env` - OpenSSL's environment key that points to a " +"cafile," +msgstr ":attr:`openssl_cafile_env` - 指向一个 cafile 的 OpenSSL 环境键," + +#: ../../library/ssl.rst:431 +msgid ":attr:`openssl_cafile` - hard coded path to a cafile," +msgstr ":attr:`openssl_cafile` - 一个 cafile 的硬编码路径," + +#: ../../library/ssl.rst:432 +msgid "" +":attr:`openssl_capath_env` - OpenSSL's environment key that points to a " +"capath," +msgstr ":attr:`openssl_capath_env` - 指向一个 capath 的 OpenSSL 环境键," + +#: ../../library/ssl.rst:433 +msgid ":attr:`openssl_capath` - hard coded path to a capath directory" +msgstr ":attr:`openssl_capath` - 一个 capath 目录的硬编码路径" + +#: ../../library/ssl.rst:439 +msgid "" +"Retrieve certificates from Windows' system cert store. *store_name* may be " +"one of ``CA``, ``ROOT`` or ``MY``. Windows may provide additional cert " +"stores, too." +msgstr "" +"从 Windows 的系统证书库中检索证书。 *store_name* 可以是 ``CA``, ``ROOT`` 或 ``MY`` 中的一个。 " +"Windows 也可能会提供额外的证书库。" + +#: ../../library/ssl.rst:443 +msgid "" +"The function returns a list of (cert_bytes, encoding_type, trust) tuples. " +"The encoding_type specifies the encoding of cert_bytes. It is either " +":const:`x509_asn` for X.509 ASN.1 data or :const:`pkcs_7_asn` for PKCS#7 " +"ASN.1 data. Trust specifies the purpose of the certificate as a set of OIDS " +"or exactly ``True`` if the certificate is trustworthy for all purposes." +msgstr "" +"此函数返回一个包含 (cert_bytes, encoding_type, trust) 元组的列表。encoding_type 指明 " +"cert_bytes 的编码格式。它可以为 :const:`x509_asn` 以表示 X.509 ASN.1 数据或是 " +":const:`pkcs_7_asn` 以表示 PKCS#7 ASN.1 数据。trust 以 OIDS " +"集合的形式指明证书的目的,或者如果证书对于所有目的都可以信任则为 ``True``。" + +#: ../../library/ssl.rst:450 ../../library/ssl.rst:1610 +#: ../../library/ssl.rst:1910 +msgid "Example::" +msgstr "示例::" + +#: ../../library/ssl.rst:452 +msgid "" +">>> ssl.enum_certificates(\"CA\")\n" +"[(b'data...', 'x509_asn', {'1.3.6.1.5.5.7.3.1', '1.3.6.1.5.5.7.3.2'}),\n" +" (b'data...', 'x509_asn', True)]" +msgstr "" +">>> ssl.enum_certificates(\"CA\")\n" +"[(b'data...', 'x509_asn', {'1.3.6.1.5.5.7.3.1', '1.3.6.1.5.5.7.3.2'}),\n" +" (b'data...', 'x509_asn', True)]" + +#: ../../library/ssl.rst:462 +msgid "" +"Retrieve CRLs from Windows' system cert store. *store_name* may be one of " +"``CA``, ``ROOT`` or ``MY``. Windows may provide additional cert stores, too." +msgstr "" +"从 Windows 的系统证书库中检索 CRL。 *store_name* 可以是 ``CA``, ``ROOT`` 或 ``MY`` 中的一个。 " +"Windows 也可能会提供额外的证书库。" + +#: ../../library/ssl.rst:466 +msgid "" +"The function returns a list of (cert_bytes, encoding_type, trust) tuples. " +"The encoding_type specifies the encoding of cert_bytes. It is either " +":const:`x509_asn` for X.509 ASN.1 data or :const:`pkcs_7_asn` for PKCS#7 " +"ASN.1 data." +msgstr "" +"此函数返回一个包含 (cert_bytes, encoding_type, trust) 元组的列表。encoding_type 指明 " +"cert_bytes 的编码格式。它可以为 :const:`x509_asn` 以表示 X.509 ASN.1 数据或是 " +":const:`pkcs_7_asn` 以表示 PKCS#7 ASN.1 数据。" + +#: ../../library/ssl.rst:477 +msgid "Constants" +msgstr "常量" + +#: ../../library/ssl.rst:479 +msgid "" +"All constants are now :class:`enum.IntEnum` or :class:`enum.IntFlag` " +"collections." +msgstr "所有常量现在都是 :class:`enum.IntEnum` 或 :class:`enum.IntFlag` 多项集的成员。" + +#: ../../library/ssl.rst:485 +msgid "" +"Possible value for :attr:`SSLContext.verify_mode`. Except for " +":const:`PROTOCOL_TLS_CLIENT`, it is the default mode. With client-side " +"sockets, just about any cert is accepted. Validation errors, such as " +"untrusted or expired cert, are ignored and do not abort the TLS/SSL " +"handshake." +msgstr "" +":attr:`SSLContext.verify_mode` 可能的取值。 :const:`PROTOCOL_TLS_CLIENT` " +"除外,这是默认的模式。对于客户端套接字,几乎任何证书都会被接受。验证错误,如不受信任或过期的证书等,会被忽略并且不会中止 TLS/SSL 握手。" + +#: ../../library/ssl.rst:491 +msgid "" +"In server mode, no certificate is requested from the client, so the client " +"does not send any for client cert authentication." +msgstr "在服务器模式下,不会从客户端请求任何证书,因此客户端不会发送任何用于客户端证书身份验证的证书。" + +#: ../../library/ssl.rst:494 ../../library/ssl.rst:2412 +msgid "See the discussion of :ref:`ssl-security` below." +msgstr "参见下文对于 :ref:`ssl-security` 的讨论。" + +#: ../../library/ssl.rst:498 +msgid "" +"Possible value for :attr:`SSLContext.verify_mode`. In client mode, " +":const:`CERT_OPTIONAL` has the same meaning as :const:`CERT_REQUIRED`. It is" +" recommended to use :const:`CERT_REQUIRED` for client-side sockets instead." +msgstr "" +":attr:`SSLContext.verify_mode` 可能的取值。在客户端模式下,:const:`CERT_OPTIONAL` 具有与 " +":const:`CERT_REQUIRED` 相同的含义。对于客户端套接字推荐改用 :const:`CERT_REQUIRED`。" + +#: ../../library/ssl.rst:503 +msgid "" +"In server mode, a client certificate request is sent to the client. The " +"client may either ignore the request or send a certificate in order perform " +"TLS client cert authentication. If the client chooses to send a " +"certificate, it is verified. Any verification error immediately aborts the " +"TLS handshake." +msgstr "" +"在服务器模式下,客户端证书请求会被发送给客户端。客户端可以忽略请求也可以发送一个证书以执行 TLS 客户端证书身份验证。 " +"如果客户端选择发送证书,则将对其执行验证。任何验证错误都将立即中止 TLS 握手。" + +#: ../../library/ssl.rst:509 ../../library/ssl.rst:528 +msgid "" +"Use of this setting requires a valid set of CA certificates to be passed to " +":meth:`SSLContext.load_verify_locations`." +msgstr "使用此设置要求将一组有效的 CA 证书传递给 :meth:`SSLContext.load_verify_locations`。" + +#: ../../library/ssl.rst:514 +msgid "" +"Possible value for :attr:`SSLContext.verify_mode`. In this mode, " +"certificates are required from the other side of the socket connection; an " +":class:`SSLError` will be raised if no certificate is provided, or if its " +"validation fails. This mode is **not** sufficient to verify a certificate in" +" client mode as it does not match hostnames. " +":attr:`~SSLContext.check_hostname` must be enabled as well to verify the " +"authenticity of a cert. :const:`PROTOCOL_TLS_CLIENT` uses " +":const:`CERT_REQUIRED` and enables :attr:`~SSLContext.check_hostname` by " +"default." +msgstr "" +":attr:`SSLContext.verify_mode` 可能的取值。 " +"在此模式下,需要从套接字连接的另一端获取证书;如果未提供证书,或验证失败则将引发 :class:`SSLError`。此模式 **不能** " +"在客户端模式下对证书进行验证因为它不会匹配主机名。 :attr:`~SSLContext.check_hostname` " +"也必须被启用以验证证书的真实性。 :const:`PROTOCOL_TLS_CLIENT` 会使用 :const:`CERT_REQUIRED` " +"并默认启用 :attr:`~SSLContext.check_hostname`。" + +#: ../../library/ssl.rst:524 +msgid "" +"With server socket, this mode provides mandatory TLS client cert " +"authentication. A client certificate request is sent to the client and the " +"client must provide a valid and trusted certificate." +msgstr "对于服务器套接字,此模式会提供强制性的 TLS 客户端证书验证。客户端证书请求会被发送给客户端并且客户端必须提供有效且受信任的证书。" + +#: ../../library/ssl.rst:533 +msgid ":class:`enum.IntEnum` collection of CERT_* constants." +msgstr "CERT_* 常量的 :class:`enum.IntEnum` 多项集。" + +#: ../../library/ssl.rst:539 +msgid "" +"Possible value for :attr:`SSLContext.verify_flags`. In this mode, " +"certificate revocation lists (CRLs) are not checked. By default OpenSSL does" +" neither require nor verify CRLs." +msgstr "" +":attr:`SSLContext.verify_flags` 可能的取值。在此模式下,证书吊销列表(CRL)并不会被检查。OpenSSL " +"默认不要求也不验证 CRL。" + +#: ../../library/ssl.rst:547 +msgid "" +"Possible value for :attr:`SSLContext.verify_flags`. In this mode, only the " +"peer cert is checked but none of the intermediate CA certificates. The mode " +"requires a valid CRL that is signed by the peer cert's issuer (its direct " +"ancestor CA). If no proper CRL has been loaded with " +":attr:`SSLContext.load_verify_locations`, validation will fail." +msgstr "" +":attr:`SSLContext.verify_flags` 可能的取值。在此模式下,只会检查对等证书而不检查任何中间 CA 证书。 " +"此模式要求提供由对等证书颁发者(其直接上级 CA)签名的有效 CRL。如果未使用 " +":attr:`SSLContext.load_verify_locations` 加载正确的 CRL,则验证将失败。" + +#: ../../library/ssl.rst:557 +msgid "" +"Possible value for :attr:`SSLContext.verify_flags`. In this mode, CRLs of " +"all certificates in the peer cert chain are checked." +msgstr ":attr:`SSLContext.verify_flags` 可能的取值。在此模式下,会检查对等证书链中所有证书的 CRL。" + +#: ../../library/ssl.rst:564 +msgid "" +"Possible value for :attr:`SSLContext.verify_flags` to disable workarounds " +"for broken X.509 certificates." +msgstr ":attr:`SSLContext.verify_flags` 可能的取值,用于禁用已损坏 X.509 证书的绕过操作。" + +#: ../../library/ssl.rst:571 +msgid "" +"Possible value for :attr:`SSLContext.verify_flags` to enables proxy " +"certificate verification." +msgstr ":attr:`SSLContext.verify_flags` 的可能取值,启用代理证书验证。" + +#: ../../library/ssl.rst:578 +msgid "" +"Possible value for :attr:`SSLContext.verify_flags`. It instructs OpenSSL to " +"prefer trusted certificates when building the trust chain to validate a " +"certificate. This flag is enabled by default." +msgstr "" +":attr:`SSLContext.verify_flags` 可能的取值。它指示 OpenSSL 在构建用于验证某个证书的信任链时首选受信任的证书。 " +"此旗标将默认被启用。" + +#: ../../library/ssl.rst:586 +msgid "" +"Possible value for :attr:`SSLContext.verify_flags`. It instructs OpenSSL to " +"accept intermediate CAs in the trust store to be treated as trust-anchors, " +"in the same way as the self-signed root CA certificates. This makes it " +"possible to trust certificates issued by an intermediate CA without having " +"to trust its ancestor root CA." +msgstr "" +":attr:`SSLContext.verify_flags` 的可能取值。它指示 OpenSSL 接受信任存储中的中间 CA " +"作为信任锚,与自我签名的根 CA 证书的方式相同。这样就能信任中间 CA 颁发的证书,而不一定非要去信任其祖先的根 CA。" + +#: ../../library/ssl.rst:597 +msgid ":class:`enum.IntFlag` collection of VERIFY_* constants." +msgstr "VERIFY_* 常量的 :class:`enum.IntFlag` 多项集。" + +#: ../../library/ssl.rst:603 +msgid "" +"Selects the highest protocol version that both the client and server " +"support. Despite the name, this option can select both \"SSL\" and \"TLS\" " +"protocols." +msgstr "选择客户端和服务器均支持的最高协议版本。此选项名称并不准确,实际上 \\" + +#: ../../library/ssl.rst:610 +msgid "" +"TLS clients and servers require different default settings for secure " +"communication. The generic TLS protocol constant is deprecated in favor of " +":data:`PROTOCOL_TLS_CLIENT` and :data:`PROTOCOL_TLS_SERVER`." +msgstr "" +"TLS 客户端和服务器需要不同的默认设置来实现安全通信。通用的 TLS 协议常量已废弃,而采用 :data:`PROTOCOL_TLS_CLIENT` " +"和 :data:`PROTOCOL_TLS_SERVER`。" + +#: ../../library/ssl.rst:616 +msgid "" +"Auto-negotiate the highest protocol version that both the client and server " +"support, and configure the context client-side connections. The protocol " +"enables :data:`CERT_REQUIRED` and :attr:`~SSLContext.check_hostname` by " +"default." +msgstr "" +"自动协商为客户端和服务器都支持的最高版本协议,并配置当前上下文客户端的连接。该协议默认启用 :data:`CERT_REQUIRED` 和 " +":attr:`~SSLContext.check_hostname`." + +#: ../../library/ssl.rst:625 +msgid "" +"Auto-negotiate the highest protocol version that both the client and server " +"support, and configure the context server-side connections." +msgstr "自动协商为客户端和服务器都支持的最高版本协议,并配置上下文服务器端的连接。" + +#: ../../library/ssl.rst:632 +msgid "Alias for :data:`PROTOCOL_TLS`." +msgstr ":data:`PROTOCOL_TLS` 的别名。" + +#: ../../library/ssl.rst:636 +msgid "Use :data:`PROTOCOL_TLS` instead." +msgstr "请改用 :data:`PROTOCOL_TLS`。" + +#: ../../library/ssl.rst:640 +msgid "Selects SSL version 3 as the channel encryption protocol." +msgstr "选择 SSL 版本 3 作为通道加密协议。" + +#: ../../library/ssl.rst:642 +msgid "" +"This protocol is not available if OpenSSL is compiled with the ``no-ssl3`` " +"option." +msgstr "如果 OpenSSL 是用 ``no-ssl3`` 选项编译的,则该协议不可用。" + +#: ../../library/ssl.rst:647 +msgid "SSL version 3 is insecure. Its use is highly discouraged." +msgstr "SSL 版本 3 并不安全。极不建议使用它。" + +#: ../../library/ssl.rst:651 +msgid "" +"OpenSSL has deprecated all version specific protocols. Use the default " +"protocol :data:`PROTOCOL_TLS_SERVER` or :data:`PROTOCOL_TLS_CLIENT` with " +":attr:`SSLContext.minimum_version` and :attr:`SSLContext.maximum_version` " +"instead." +msgstr "" +"OpenSSL 已经废弃了所有特定于版本的协议。请换用带有 :attr:`SSLContext.minimum_version` 和 " +":attr:`SSLContext.maximum_version` 的默认协议 :data:`PROTOCOL_TLS_SERVER` 或 " +":data:`PROTOCOL_TLS_CLIENT` ." + +#: ../../library/ssl.rst:659 +msgid "Selects TLS version 1.0 as the channel encryption protocol." +msgstr "选择 TLS 版本 1.0 作为通道加密协议。" + +#: ../../library/ssl.rst:663 ../../library/ssl.rst:674 +#: ../../library/ssl.rst:685 +msgid "OpenSSL has deprecated all version specific protocols." +msgstr "OpenSSL 已经废弃了所有特定于版本的协议。" + +#: ../../library/ssl.rst:667 +msgid "" +"Selects TLS version 1.1 as the channel encryption protocol. Available only " +"with openssl version 1.0.1+." +msgstr "选择 TLS 版本 1.1 作为通道加密协议。仅适用于 openssl 版本 1.0.1+。" + +#: ../../library/ssl.rst:678 +msgid "" +"Selects TLS version 1.2 as the channel encryption protocol. Available only " +"with openssl version 1.0.1+." +msgstr "选用 TLS 1.2 版本作为隧道加密协议。只适用于 openssl 1.0.1 以上版本。" + +#: ../../library/ssl.rst:689 +msgid "" +"Enables workarounds for various bugs present in other SSL implementations. " +"This option is set by default. It does not necessarily set the same flags " +"as OpenSSL's ``SSL_OP_ALL`` constant." +msgstr "" +"对存在于其他 SSL 实现中的各种缺陷启用绕过操作。默认会设置此选项。它不一定会设置与 OpenSSL 的 ``SSL_OP_ALL`` " +"常量相同的旗标。" + +#: ../../library/ssl.rst:697 +msgid "" +"Prevents an SSLv2 connection. This option is only applicable in conjunction" +" with :const:`PROTOCOL_TLS`. It prevents the peers from choosing SSLv2 as " +"the protocol version." +msgstr "阻止 SSLv2 连接。此选项仅可与 :const:`PROTOCOL_TLS` 结合使用。它会阻止对等方选择 SSLv2 作为协议版本。" + +#: ../../library/ssl.rst:705 +msgid "SSLv2 is deprecated" +msgstr "SSLv2 已被弃用" + +#: ../../library/ssl.rst:709 +msgid "" +"Prevents an SSLv3 connection. This option is only applicable in conjunction" +" with :const:`PROTOCOL_TLS`. It prevents the peers from choosing SSLv3 as " +"the protocol version." +msgstr "阻止 SSLv3 连接。此选项仅可与 :const:`PROTOCOL_TLS` 结合使用。它会阻止对等方选择 SSLv3 作为协议版本。" + +#: ../../library/ssl.rst:717 +msgid "SSLv3 is deprecated" +msgstr "SSLv3 已被弃用" + +#: ../../library/ssl.rst:721 +msgid "" +"Prevents a TLSv1 connection. This option is only applicable in conjunction " +"with :const:`PROTOCOL_TLS`. It prevents the peers from choosing TLSv1 as " +"the protocol version." +msgstr "阻止 TLSv1 连接。此选项仅可与 :const:`PROTOCOL_TLS` 结合使用。它会阻止对等方选择 TLSv1 作为协议版本。" + +#: ../../library/ssl.rst:727 +msgid "" +"The option is deprecated since OpenSSL 1.1.0, use the new " +":attr:`SSLContext.minimum_version` and :attr:`SSLContext.maximum_version` " +"instead." +msgstr "" +"此选项自 OpenSSL 1.1.0 起已被弃用,请改用新的 :attr:`SSLContext.minimum_version` 和 " +":attr:`SSLContext.maximum_version`." + +#: ../../library/ssl.rst:734 +msgid "" +"Prevents a TLSv1.1 connection. This option is only applicable in conjunction" +" with :const:`PROTOCOL_TLS`. It prevents the peers from choosing TLSv1.1 as " +"the protocol version. Available only with openssl version 1.0.1+." +msgstr "" +"阻止 TLSv1.1 连接。此选项仅可与 :const:`PROTOCOL_TLS` 结合使用。它会阻止对等方选择 TLSv1.1 作为协议版本。 " +"仅适用于 openssl 版本 1.0.1+。" + +#: ../../library/ssl.rst:740 ../../library/ssl.rst:751 +msgid "The option is deprecated since OpenSSL 1.1.0." +msgstr "此选项自 OpenSSL 1.1.0 起已被弃用。" + +#: ../../library/ssl.rst:745 +msgid "" +"Prevents a TLSv1.2 connection. This option is only applicable in conjunction" +" with :const:`PROTOCOL_TLS`. It prevents the peers from choosing TLSv1.2 as " +"the protocol version. Available only with openssl version 1.0.1+." +msgstr "" +"阻止 TLSv1.2 连接。此选项仅可与 :const:`PROTOCOL_TLS` 结合使用。它会阻止对等方选择 TLSv1.2 作为协议版本。 " +"仅适用于 openssl 版本 1.0.1+。" + +#: ../../library/ssl.rst:756 +msgid "" +"Prevents a TLSv1.3 connection. This option is only applicable in conjunction" +" with :const:`PROTOCOL_TLS`. It prevents the peers from choosing TLSv1.3 as " +"the protocol version. TLS 1.3 is available with OpenSSL 1.1.1 or later. When" +" Python has been compiled against an older version of OpenSSL, the flag " +"defaults to *0*." +msgstr "" +"阻止 TLSv1.3 连接。此选项仅可与 :const:`PROTOCOL_TLS` 结合使用。它会阻止对等方选择 TLSv1.3 作为协议版本。 " +"TLS 1.3 适用于 OpenSSL 1.1.1 或更新的版本。当 Python 编译是基于较旧版本的 OpenSSL 时,该旗标默认为 *0*。" + +#: ../../library/ssl.rst:764 +msgid "" +"The option is deprecated since OpenSSL 1.1.0. It was added to 2.7.15 and " +"3.6.3 for backwards compatibility with OpenSSL 1.0.2." +msgstr "此选项自 OpenSSL 1.1.0 起已被弃用。它被添加到 2.7.15 和 3.6.3 是为了向下兼容 OpenSSL 1.0.2。" + +#: ../../library/ssl.rst:770 +msgid "" +"Disable all renegotiation in TLSv1.2 and earlier. Do not send HelloRequest " +"messages, and ignore renegotiation requests via ClientHello." +msgstr "" +"禁用所有 TLSv1.2 和更早版本的重协商操作。不发送 HelloRequest 消息,并忽略通过 ClientHello 发起的重协商请求。" + +#: ../../library/ssl.rst:773 +msgid "This option is only available with OpenSSL 1.1.0h and later." +msgstr "此选项仅适用于 OpenSSL 1.1.0h 及更新的版本。" + +#: ../../library/ssl.rst:779 +msgid "" +"Use the server's cipher ordering preference, rather than the client's. This " +"option has no effect on client sockets and SSLv2 server sockets." +msgstr "使用服务器的密码顺序首选项,而不是客户端的首选项。此选项在客户端套接字和 SSLv2 服务器套接字上无效。" + +#: ../../library/ssl.rst:786 +msgid "" +"Prevents reuse of the same DH key for distinct SSL sessions. This improves " +"forward secrecy but requires more computational resources. This option only " +"applies to server sockets." +msgstr "防止对于单独 SSL 会话重用相同的 DH 密钥。这会提升前向保密性但需要更多的计算资源。此选项仅适用于服务器套接字。" + +#: ../../library/ssl.rst:794 +msgid "" +"Prevents reuse of the same ECDH key for distinct SSL sessions. This " +"improves forward secrecy but requires more computational resources. This " +"option only applies to server sockets." +msgstr "防止对于单独 SSL 会话重用相同的 ECDH 密钥。这会提升前向保密性但需要更多的计算资源。此选项仅适用于服务器套接字。" + +#: ../../library/ssl.rst:802 +msgid "" +"Send dummy Change Cipher Spec (CCS) messages in TLS 1.3 handshake to make a " +"TLS 1.3 connection look more like a TLS 1.2 connection." +msgstr "在 TLS 1.3 握手中发送虚拟更改密码规格(CCS)消息以使得 TLS 1.3 连接看起来更像是 TLS 1.2 连接。" + +#: ../../library/ssl.rst:805 +msgid "This option is only available with OpenSSL 1.1.1 and later." +msgstr "此选项仅适用于 OpenSSL 1.1.1 及更新的版本。" + +#: ../../library/ssl.rst:811 +msgid "" +"Disable compression on the SSL channel. This is useful if the application " +"protocol supports its own compression scheme." +msgstr "在 SSL 通道上禁用压缩。这适用于应用协议支持自己的压缩方案的情况。" + +#: ../../library/ssl.rst:818 +msgid ":class:`enum.IntFlag` collection of OP_* constants." +msgstr "OP_* 常量的 :class:`enum.IntFlag` 多项集。" + +#: ../../library/ssl.rst:822 +msgid "Prevent client side from requesting a session ticket." +msgstr "阻止客户端请求会话凭据。" + +#: ../../library/ssl.rst:828 +msgid "Ignore unexpected shutdown of TLS connections." +msgstr "忽略 TLS 连接的意外关闭。" + +#: ../../library/ssl.rst:830 ../../library/ssl.rst:846 +msgid "This option is only available with OpenSSL 3.0.0 and later." +msgstr "此选项仅适用于 OpenSSL 3.0.0 及更新的版本。" + +#: ../../library/ssl.rst:836 +msgid "" +"Enable the use of the kernel TLS. To benefit from the feature, OpenSSL must " +"have been compiled with support for it, and the negotiated cipher suites and" +" extensions must be supported by it (a list of supported ones may vary by " +"platform and kernel version)." +msgstr "" +"启用内核 TLS。为了利用该特征,OpenSSL " +"编译时必须附带对它的支持,并且协商的密码套件和扩展必须被它所支持(受支持项的列表可能因平台和内核版本而有所变化)。" + +#: ../../library/ssl.rst:841 +msgid "" +"Note that with enabled kernel TLS some cryptographic operations are " +"performed by the kernel directly and not via any available OpenSSL " +"Providers. This might be undesirable if, for example, the application " +"requires all cryptographic operations to be performed by the FIPS provider." +msgstr "" +"请注意当启用内核 TLS 时某些加解密操作将由内核直接执行而不是通过任何可用的 OpenSSL 提供程序。 " +"这可能并不是你想要的,例如,当应用程序要求所有加解密操作由 FIPS 提供程序执行时。" + +#: ../../library/ssl.rst:852 +msgid "" +"Allow legacy insecure renegotiation between OpenSSL and unpatched servers " +"only." +msgstr "允许只在 OpenSSL 和未打补丁的服务器之间进行旧式的不安全协商。" + +#: ../../library/ssl.rst:859 +msgid "" +"Whether the OpenSSL library has built-in support for the *Application-Layer " +"Protocol Negotiation* TLS extension as described in :rfc:`7301`." +msgstr "OpenSSL 库是否具有对 :rfc:`7301` 中描述的 *应用层协议协商* TLS 扩展的内置支持。" + +#: ../../library/ssl.rst:866 +msgid "" +"Whether the OpenSSL library has built-in support not checking subject common" +" name and :attr:`SSLContext.hostname_checks_common_name` is writeable." +msgstr "" +"OpenSSL 库是否具有对不检测目标通用名称的内置支持且 :attr:`SSLContext.hostname_checks_common_name`" +" 为可写状态。" + +#: ../../library/ssl.rst:874 +msgid "" +"Whether the OpenSSL library has built-in support for the Elliptic Curve-" +"based Diffie-Hellman key exchange. This should be true unless the feature " +"was explicitly disabled by the distributor." +msgstr "" +"OpenSSL 库是否具有对基于椭圆曲线的 Diffie-Hellman 密钥交换的内置支持。此常量应当为真值,除非发布者明确地禁用了此功能。" + +#: ../../library/ssl.rst:882 +msgid "" +"Whether the OpenSSL library has built-in support for the *Server Name " +"Indication* extension (as defined in :rfc:`6066`)." +msgstr "OpenSSL 库是否具有对 *服务器名称提示* 扩展(在 :rfc:`6066` 中定义)的内置支持。" + +#: ../../library/ssl.rst:889 +msgid "" +"Whether the OpenSSL library has built-in support for the *Next Protocol " +"Negotiation* as described in the `Application Layer Protocol Negotiation " +"`_. " +"When true, you can use the :meth:`SSLContext.set_npn_protocols` method to " +"advertise which protocols you want to support." +msgstr "" +"OpenSSL 库是否具有对 `应用层协议协商 `_ 中描述的 *下一协议协商* 的内置支持。当此常量为真值时,你可以使用 " +":meth:`SSLContext.set_npn_protocols` 方法来公告你想要支持的协议。" + +#: ../../library/ssl.rst:899 +msgid "" +"Whether the OpenSSL library has built-in support for the SSL 2.0 protocol." +msgstr "OpenSSL 库是否具有对 SSL 2.0 协议的内置支持。" + +#: ../../library/ssl.rst:905 +msgid "" +"Whether the OpenSSL library has built-in support for the SSL 3.0 protocol." +msgstr "OpenSSL 库是否具有对 SSL 3.0 协议的内置支持。" + +#: ../../library/ssl.rst:911 +msgid "" +"Whether the OpenSSL library has built-in support for the TLS 1.0 protocol." +msgstr "OpenSSL 库是否具有对 TLS 1.0 协议的内置支持。" + +#: ../../library/ssl.rst:917 +msgid "" +"Whether the OpenSSL library has built-in support for the TLS 1.1 protocol." +msgstr "OpenSSL 库是否具有对 TLS 1.1 协议的内置支持。" + +#: ../../library/ssl.rst:923 +msgid "" +"Whether the OpenSSL library has built-in support for the TLS 1.2 protocol." +msgstr "OpenSSL 库是否具有对 TLS 1.2 协议的内置支持。" + +#: ../../library/ssl.rst:929 +msgid "" +"Whether the OpenSSL library has built-in support for the TLS 1.3 protocol." +msgstr "OpenSSL 库是否具有对 TLS 1.3 协议的内置支持。" + +#: ../../library/ssl.rst:935 +msgid "Whether the OpenSSL library has built-in support for TLS-PSK." +msgstr "OpenSSL 库是否具有对 TLS-PSK 的内置支持。" + +#: ../../library/ssl.rst:941 +msgid "Whether the OpenSSL library has built-in support for TLS-PHA." +msgstr "OpenSSL 库是否具有对 TLS-PHA 的内置支持。" + +#: ../../library/ssl.rst:947 +msgid "" +"List of supported TLS channel binding types. Strings in this list can be " +"used as arguments to :meth:`SSLSocket.get_channel_binding`." +msgstr "" +"受支持的 TLS 通道绑定类型组成的列表。此列表中的字符串可被用作传给 :meth:`SSLSocket.get_channel_binding` " +"的参数。" + +#: ../../library/ssl.rst:954 +msgid "The version string of the OpenSSL library loaded by the interpreter::" +msgstr "解释器所加载的 OpenSSL 库的版本字符串::" + +#: ../../library/ssl.rst:956 +msgid "" +">>> ssl.OPENSSL_VERSION\n" +"'OpenSSL 1.0.2k 26 Jan 2017'" +msgstr "" +">>> ssl.OPENSSL_VERSION\n" +"'OpenSSL 1.0.2k 26 Jan 2017'" + +#: ../../library/ssl.rst:963 +msgid "" +"A tuple of five integers representing version information about the OpenSSL " +"library::" +msgstr "代表 OpenSSL 库的版本信息的五个整数所组成的元组::" + +#: ../../library/ssl.rst:966 +msgid "" +">>> ssl.OPENSSL_VERSION_INFO\n" +"(1, 0, 2, 11, 15)" +msgstr "" +">>> ssl.OPENSSL_VERSION_INFO\n" +"(1, 0, 2, 11, 15)" + +#: ../../library/ssl.rst:973 +msgid "The raw version number of the OpenSSL library, as a single integer::" +msgstr "OpenSSL 库的原始版本号,以单个整数表示::" + +#: ../../library/ssl.rst:975 +msgid "" +">>> ssl.OPENSSL_VERSION_NUMBER\n" +"268443839\n" +">>> hex(ssl.OPENSSL_VERSION_NUMBER)\n" +"'0x100020bf'" +msgstr "" +">>> ssl.OPENSSL_VERSION_NUMBER\n" +"268443839\n" +">>> hex(ssl.OPENSSL_VERSION_NUMBER)\n" +"'0x100020bf'" + +#: ../../library/ssl.rst:986 +msgid "" +"Alert Descriptions from :rfc:`5246` and others. The `IANA TLS Alert Registry" +" `_ contains this list and references to the RFCs where their " +"meaning is defined." +msgstr "" +"来自 :rfc:`5246` 等文档的警报描述。`IANA TLS Alert Registry " +"`_ 中包含了这个列表及对定义其含义的 RFC 引用。" + +#: ../../library/ssl.rst:990 +msgid "" +"Used as the return value of the callback function in " +":meth:`SSLContext.set_servername_callback`." +msgstr "被用作 :meth:`SSLContext.set_servername_callback` 中的回调函数的返回值。" + +#: ../../library/ssl.rst:997 +msgid ":class:`enum.IntEnum` collection of ALERT_DESCRIPTION_* constants." +msgstr "ALERT_DESCRIPTION_* 常量的 :class:`enum.IntEnum` 多项集。" + +#: ../../library/ssl.rst:1003 +msgid "" +"Option for :func:`create_default_context` and " +":meth:`SSLContext.load_default_certs`. This value indicates that the " +"context may be used to authenticate web servers (therefore, it will be used " +"to create client-side sockets)." +msgstr "" +"用于 :func:`create_default_context` 和 :meth:`SSLContext.load_default_certs` " +"的参数。表示上下文可用于验证网络服务器(因此,它将被用于创建客户端套接字)。" + +#: ../../library/ssl.rst:1012 +msgid "" +"Option for :func:`create_default_context` and " +":meth:`SSLContext.load_default_certs`. This value indicates that the " +"context may be used to authenticate web clients (therefore, it will be used " +"to create server-side sockets)." +msgstr "" +"用于 :func:`create_default_context` 和 :meth:`SSLContext.load_default_certs` " +"的参数。表示上下文可用于验证网络客户(因此,它将被用于创建服务器端套接字)。" + +#: ../../library/ssl.rst:1021 +msgid ":class:`enum.IntEnum` collection of SSL_ERROR_* constants." +msgstr "SSL_ERROR_* 常量的 :class:`enum.IntEnum` 多项集。" + +#: ../../library/ssl.rst:1027 +msgid "" +":class:`enum.IntEnum` collection of SSL and TLS versions for " +":attr:`SSLContext.maximum_version` and :attr:`SSLContext.minimum_version`." +msgstr "" +":attr:`SSLContext.maximum_version` 和 :attr:`SSLContext.minimum_version` 中的 " +"SSL 和 TLS 版本的 :class:`enum.IntEnum` 多项集。" + +#: ../../library/ssl.rst:1035 +msgid "" +"The minimum or maximum supported SSL or TLS version. These are magic " +"constants. Their values don't reflect the lowest and highest available " +"TLS/SSL versions." +msgstr "受支持的最低和最高 SSL 或 TLS 版本。这些常量被称为魔术常量。它们的值并不反映可用的最低和最高 TLS/SSL 版本。" + +#: ../../library/ssl.rst:1045 +msgid "SSL 3.0 to TLS 1.3." +msgstr "SSL 3.0 至 TLS 1.3。" + +#: ../../library/ssl.rst:1049 +msgid "" +"All :class:`TLSVersion` members except :attr:`TLSVersion.TLSv1_2` and " +":attr:`TLSVersion.TLSv1_3` are deprecated." +msgstr "" +"所有 :class:`TLSVersion` 成员,除 :attr:`TLSVersion.TLSv1_2` 和 " +":attr:`TLSVersion.TLSv1_3` 之外均已废弃。" + +#: ../../library/ssl.rst:1054 +msgid "SSL sockets" +msgstr "" + +#: ../../library/ssl.rst:1058 +msgid "SSL sockets provide the following methods of :ref:`socket-objects`:" +msgstr "SSL 套接字提供了 :ref:`socket-objects` 的下列方法:" + +#: ../../library/ssl.rst:1060 +msgid ":meth:`~socket.socket.accept`" +msgstr ":meth:`~socket.socket.accept`" + +#: ../../library/ssl.rst:1061 +msgid ":meth:`~socket.socket.bind`" +msgstr ":meth:`~socket.socket.bind`" + +#: ../../library/ssl.rst:1062 +msgid ":meth:`~socket.socket.close`" +msgstr ":meth:`~socket.socket.close`" + +#: ../../library/ssl.rst:1063 +msgid ":meth:`~socket.socket.connect`" +msgstr ":meth:`~socket.socket.connect`" + +#: ../../library/ssl.rst:1064 +msgid ":meth:`~socket.socket.detach`" +msgstr ":meth:`~socket.socket.detach`" + +#: ../../library/ssl.rst:1065 +msgid ":meth:`~socket.socket.fileno`" +msgstr ":meth:`~socket.socket.fileno`" + +#: ../../library/ssl.rst:1066 +msgid ":meth:`~socket.socket.getpeername`, :meth:`~socket.socket.getsockname`" +msgstr "" +":meth:`~socket.socket.getpeername`, :meth:`~socket.socket.getsockname`" + +#: ../../library/ssl.rst:1067 +msgid ":meth:`~socket.socket.getsockopt`, :meth:`~socket.socket.setsockopt`" +msgstr ":meth:`~socket.socket.getsockopt`, :meth:`~socket.socket.setsockopt`" + +#: ../../library/ssl.rst:1068 +msgid "" +":meth:`~socket.socket.gettimeout`, :meth:`~socket.socket.settimeout`, " +":meth:`~socket.socket.setblocking`" +msgstr "" +":meth:`~socket.socket.gettimeout`, :meth:`~socket.socket.settimeout`, " +":meth:`~socket.socket.setblocking`" + +#: ../../library/ssl.rst:1070 +msgid ":meth:`~socket.socket.listen`" +msgstr ":meth:`~socket.socket.listen`" + +#: ../../library/ssl.rst:1071 +msgid ":meth:`~socket.socket.makefile`" +msgstr ":meth:`~socket.socket.makefile`" + +#: ../../library/ssl.rst:1072 +msgid "" +":meth:`~socket.socket.recv`, :meth:`~socket.socket.recv_into` (but passing a" +" non-zero ``flags`` argument is not allowed)" +msgstr "" +":meth:`~socket.socket.recv`, :meth:`~socket.socket.recv_into` (但不允许传入非零的 " +"``flags`` 参数)" + +#: ../../library/ssl.rst:1074 +msgid "" +":meth:`~socket.socket.send`, :meth:`~socket.socket.sendall` (with the same " +"limitation)" +msgstr ":meth:`~socket.socket.send`, :meth:`~socket.socket.sendall` (具有同样的限制)" + +#: ../../library/ssl.rst:1076 +msgid "" +":meth:`~socket.socket.sendfile` (but :mod:`os.sendfile` will be used for " +"plain-text sockets only, else :meth:`~socket.socket.send` will be used)" +msgstr "" +":meth:`~socket.socket.sendfile` (但 :mod:`os.sendfile` 将仅用于纯文本套接字,在其他情况下将使用 " +":meth:`~socket.socket.send`)" + +#: ../../library/ssl.rst:1078 +msgid ":meth:`~socket.socket.shutdown`" +msgstr ":meth:`~socket.socket.shutdown`" + +#: ../../library/ssl.rst:1080 +msgid "" +"However, since the SSL (and TLS) protocol has its own framing atop of TCP, " +"the SSL sockets abstraction can, in certain respects, diverge from the " +"specification of normal, OS-level sockets. See especially the :ref:`notes " +"on non-blocking sockets `." +msgstr "" +"但是,由于 SSL(和 TLS)协议在 TCP 之上具有自己的框架,因此 SSL 套接字抽象在某些方面可能与常规的 OS 层级套接字存在差异。 " +"特别是要查看 :ref:`非阻塞型套接字说明 `。" + +#: ../../library/ssl.rst:1085 +msgid "" +"Instances of :class:`SSLSocket` must be created using the " +":meth:`SSLContext.wrap_socket` method." +msgstr ":class:`SSLSocket` 的实例必须使用 :meth:`SSLContext.wrap_socket` 方法来创建。" + +#: ../../library/ssl.rst:1088 +msgid "The :meth:`sendfile` method was added." +msgstr "新增了 :meth:`sendfile` 方法。" + +#: ../../library/ssl.rst:1091 +msgid "" +"The :meth:`shutdown` does not reset the socket timeout each time bytes are " +"received or sent. The socket timeout is now the maximum total duration of " +"the shutdown." +msgstr ":meth:`shutdown` 不会在每次接收或发送字节数据后重置套接字超时。现在套接字超时为关闭的最大总持续时间。" + +#: ../../library/ssl.rst:1096 +msgid "" +"It is deprecated to create a :class:`SSLSocket` instance directly, use " +":meth:`SSLContext.wrap_socket` to wrap a socket." +msgstr "" +"直接创建 :class:`SSLSocket` 实例的做法已被弃用,请使用 :meth:`SSLContext.wrap_socket` 来包装套接字。" + +#: ../../library/ssl.rst:1100 +msgid "" +":class:`SSLSocket` instances must be created with " +":meth:`~SSLContext.wrap_socket`. In earlier versions, it was possible to " +"create instances directly. This was never documented or officially " +"supported." +msgstr "" + +#: ../../library/ssl.rst:1106 +msgid "" +"Python now uses ``SSL_read_ex`` and ``SSL_write_ex`` internally. The " +"functions support reading and writing of data larger than 2 GB. Writing " +"zero-length data no longer fails with a protocol violation error." +msgstr "" +"Python 内部现在使用 ``SSL_read_ex`` 和 ``SSL_write_ex``。这些函数支持读取和写入大于 2GB " +"的数据。写入零长数据不再出现违反协议的错误。" + +#: ../../library/ssl.rst:1111 +msgid "SSL sockets also have the following additional methods and attributes:" +msgstr "SSL 套接字还具有下列方法和属性:" + +#: ../../library/ssl.rst:1115 +msgid "" +"Read up to *len* bytes of data from the SSL socket and return the result as " +"a ``bytes`` instance. If *buffer* is specified, then read into the buffer " +"instead, and return the number of bytes read." +msgstr "" +"从 SSL 套接字读取至多 *len* 个字节的数据并将结果作为 ``bytes`` 实例返回。如果指定了 " +"*buffer*,则改为读取到缓冲区,并返回所读取的字节数。" + +#: ../../library/ssl.rst:1119 +msgid "" +"Raise :exc:`SSLWantReadError` or :exc:`SSLWantWriteError` if the socket is " +":ref:`non-blocking ` and the read would block." +msgstr "" +"如果套接字为 :ref:`非阻塞型 ` 则会引发 :exc:`SSLWantReadError` 或 " +":exc:`SSLWantWriteError` 且读取将阻塞。" + +#: ../../library/ssl.rst:1122 +msgid "" +"As at any time a re-negotiation is possible, a call to :meth:`read` can also" +" cause write operations." +msgstr "由于在任何时候重新协商都是可能的,因此调用 :meth:`read` 也可能导致写入操作。" + +#: ../../library/ssl.rst:1125 +msgid "" +"The socket timeout is no longer reset each time bytes are received or sent. " +"The socket timeout is now the maximum total duration to read up to *len* " +"bytes." +msgstr "套接字超时在每次接收或发送字节数据后不会再被重置。现在套接字超时为读取至多 *len* 个字节数据的最大总持续时间。" + +#: ../../library/ssl.rst:1130 +msgid "Use :meth:`~SSLSocket.recv` instead of :meth:`~SSLSocket.read`." +msgstr "请使用 :meth:`~SSLSocket.recv` 来代替 :meth:`~SSLSocket.read`。" + +#: ../../library/ssl.rst:1135 +msgid "" +"Write *data* to the SSL socket and return the number of bytes written. The " +"*data* argument must be an object supporting the buffer interface." +msgstr "将 *data* 写入 SSL 套接字并返回所写入的字节数。 *data* 参数必须为支持缓冲区接口的对象。" + +#: ../../library/ssl.rst:1138 +msgid "" +"Raise :exc:`SSLWantReadError` or :exc:`SSLWantWriteError` if the socket is " +":ref:`non-blocking ` and the write would block." +msgstr "" +"如果套接字为 :ref:`非阻塞型 ` 则会引发 :exc:`SSLWantReadError` 或 " +":exc:`SSLWantWriteError` 且写入将阻塞。" + +#: ../../library/ssl.rst:1141 +msgid "" +"As at any time a re-negotiation is possible, a call to :meth:`write` can " +"also cause read operations." +msgstr "由于在任何时候重新协商都是可能的,因此调用 :meth:`write` 也可能导致读取操作。" + +#: ../../library/ssl.rst:1144 +msgid "" +"The socket timeout is no longer reset each time bytes are received or sent. " +"The socket timeout is now the maximum total duration to write *data*." +msgstr "套接字超时在每次接收或发送字节数据后不会再被重置。现在套接字超时为写入 *data* 的最大总持续时间。" + +#: ../../library/ssl.rst:1148 +msgid "Use :meth:`~SSLSocket.send` instead of :meth:`~SSLSocket.write`." +msgstr "请使用 :meth:`~SSLSocket.send` 来代替 :meth:`~SSLSocket.write`。" + +#: ../../library/ssl.rst:1153 +msgid "" +"The :meth:`~SSLSocket.read` and :meth:`~SSLSocket.write` methods are the " +"low-level methods that read and write unencrypted, application-level data " +"and decrypt/encrypt it to encrypted, wire-level data. These methods require " +"an active SSL connection, i.e. the handshake was completed and " +":meth:`SSLSocket.unwrap` was not called." +msgstr "" +":meth:`~SSLSocket.read` 和 :meth:`~SSLSocket.write` " +"方法是读写未加密的应用级数据,并将其解密/加密为带加密的线路级数据的低层级方法。这些方法需要有激活的 SSL 连接,即握手已完成而 " +":meth:`SSLSocket.unwrap` 尚未被调用。" + +#: ../../library/ssl.rst:1159 +msgid "" +"Normally you should use the socket API methods like " +":meth:`~socket.socket.recv` and :meth:`~socket.socket.send` instead of these" +" methods." +msgstr "" +"通常你应当使用套接字 API 方法例如 :meth:`~socket.socket.recv` 和 " +":meth:`~socket.socket.send` 来代替这些方法。" + +#: ../../library/ssl.rst:1165 +msgid "Perform the SSL setup handshake." +msgstr "执行 SSL 设置握手。" + +#: ../../library/ssl.rst:1167 +msgid "" +"If *block* is true and the timeout obtained by " +":meth:`~socket.socket.gettimeout` is zero, the socket is set in blocking " +"mode until the handshake is performed." +msgstr "" +"如果 *block* 为真值且通过 :meth:`~socket.socket.gettimeout` " +"获取的超时值为零,套接字将被设为阻塞模式直到执行了握手。" + +#: ../../library/ssl.rst:1170 +msgid "" +"The handshake method also performs :func:`!match_hostname` when the " +":attr:`~SSLContext.check_hostname` attribute of the socket's " +":attr:`~SSLSocket.context` is true." +msgstr "" +"当套接字的 :attr:`~SSLSocket.context` 的 :attr:`~SSLContext.check_hostname` " +"属性为真值时握手方法还会执行 :func:`!match_hostname`。" + +#: ../../library/ssl.rst:1175 +msgid "" +"The socket timeout is no longer reset each time bytes are received or sent. " +"The socket timeout is now the maximum total duration of the handshake." +msgstr "套接字超时在每次接收或发送字节数据时不会再被重置。现在套接字超时为握手的最大总持续时间。" + +#: ../../library/ssl.rst:1179 +msgid "" +"Hostname or IP address is matched by OpenSSL during handshake. The function " +":func:`!match_hostname` is no longer used. In case OpenSSL refuses a " +"hostname or IP address, the handshake is aborted early and a TLS alert " +"message is sent to the peer." +msgstr "" +"主机名或 IP 地址会在握手期间由 OpenSSL 进行匹配。函数 :func:`!match_hostname` 将不再被使用。在 OpenSSL " +"拒绝主机名或 IP 地址的情况下,握手将提前被中止并向对等方发送 TLS 警告消息。" + +#: ../../library/ssl.rst:1187 +msgid "" +"If there is no certificate for the peer on the other end of the connection, " +"return ``None``. If the SSL handshake hasn't been done yet, raise " +":exc:`ValueError`." +msgstr "如果连接另一端的对等方没有证书,则返回 ``None``。如果 SSL 握手还未完成,则会引发 :exc:`ValueError`。" + +#: ../../library/ssl.rst:1191 +msgid "" +"If the ``binary_form`` parameter is :const:`False`, and a certificate was " +"received from the peer, this method returns a :class:`dict` instance. If " +"the certificate was not validated, the dict is empty. If the certificate " +"was validated, it returns a dict with several keys, amongst them ``subject``" +" (the principal for which the certificate was issued) and ``issuer`` (the " +"principal issuing the certificate). If a certificate contains an instance " +"of the *Subject Alternative Name* extension (see :rfc:`3280`), there will " +"also be a ``subjectAltName`` key in the dictionary." +msgstr "" +"如果 ``binary_form`` 形参为 :const:`False`,并且从对等方接收到了证书,此方法将返回一个 :class:`dict` " +"实例。如果证书未通过验证,则字典将为空。如果证书通过验证,它将返回包含多个键的字典,其中包括 ``subject`` (证书颁发给的主体) 和 " +"``issuer`` (颁发证书的主体)。如果证书包含一个 *Subject Alternative Name* 扩展的实例 (参见 " +":rfc:`3280`),则字典中还将有一个 ``subjectAltName`` 键。" + +#: ../../library/ssl.rst:1200 +msgid "" +"The ``subject`` and ``issuer`` fields are tuples containing the sequence of " +"relative distinguished names (RDNs) given in the certificate's data " +"structure for the respective fields, and each RDN is a sequence of name-" +"value pairs. Here is a real-world example::" +msgstr "" +"``subject`` 和 ``issuer`` 字段都是包含在证书中相应字段的数据结构中给出的相对专有名称(RDN)序列的元组,每个 RDN 均为 " +"name-value 对的序列。这里是一个实际的示例::" + +#: ../../library/ssl.rst:1205 +msgid "" +"{'issuer': ((('countryName', 'IL'),),\n" +" (('organizationName', 'StartCom Ltd.'),),\n" +" (('organizationalUnitName',\n" +" 'Secure Digital Certificate Signing'),),\n" +" (('commonName',\n" +" 'StartCom Class 2 Primary Intermediate Server CA'),)),\n" +" 'notAfter': 'Nov 22 08:15:19 2013 GMT',\n" +" 'notBefore': 'Nov 21 03:09:52 2011 GMT',\n" +" 'serialNumber': '95F0',\n" +" 'subject': ((('description', '571208-SLe257oHY9fVQ07Z'),),\n" +" (('countryName', 'US'),),\n" +" (('stateOrProvinceName', 'California'),),\n" +" (('localityName', 'San Francisco'),),\n" +" (('organizationName', 'Electronic Frontier Foundation, Inc.'),),\n" +" (('commonName', '*.eff.org'),),\n" +" (('emailAddress', 'hostmaster@eff.org'),)),\n" +" 'subjectAltName': (('DNS', '*.eff.org'), ('DNS', 'eff.org')),\n" +" 'version': 3}" +msgstr "" +"{'issuer': ((('countryName', 'IL'),),\n" +" (('organizationName', 'StartCom Ltd.'),),\n" +" (('organizationalUnitName',\n" +" 'Secure Digital Certificate Signing'),),\n" +" (('commonName',\n" +" 'StartCom Class 2 Primary Intermediate Server CA'),)),\n" +" 'notAfter': 'Nov 22 08:15:19 2013 GMT',\n" +" 'notBefore': 'Nov 21 03:09:52 2011 GMT',\n" +" 'serialNumber': '95F0',\n" +" 'subject': ((('description', '571208-SLe257oHY9fVQ07Z'),),\n" +" (('countryName', 'US'),),\n" +" (('stateOrProvinceName', 'California'),),\n" +" (('localityName', 'San Francisco'),),\n" +" (('organizationName', 'Electronic Frontier Foundation, Inc.'),),\n" +" (('commonName', '*.eff.org'),),\n" +" (('emailAddress', 'hostmaster@eff.org'),)),\n" +" 'subjectAltName': (('DNS', '*.eff.org'), ('DNS', 'eff.org')),\n" +" 'version': 3}" + +#: ../../library/ssl.rst:1224 +msgid "" +"If the ``binary_form`` parameter is :const:`True`, and a certificate was " +"provided, this method returns the DER-encoded form of the entire certificate" +" as a sequence of bytes, or :const:`None` if the peer did not provide a " +"certificate. Whether the peer provides a certificate depends on the SSL " +"socket's role:" +msgstr "" +"如果 ``binary_form`` 形参为 :const:`True`,并且提供了证书,此方法会将整个证书的 DER " +"编码形式作为字节序列返回,或者如果对等方未提供证书则返回 :const:`None`。对等方是否提供证书取决于 SSL 套接字的角色:" + +#: ../../library/ssl.rst:1230 +msgid "" +"for a client SSL socket, the server will always provide a certificate, " +"regardless of whether validation was required;" +msgstr "对于客户端 SSL 套接字,服务器将总是提供证书,无论是否需要进行验证;" + +#: ../../library/ssl.rst:1233 +msgid "" +"for a server SSL socket, the client will only provide a certificate when " +"requested by the server; therefore :meth:`getpeercert` will return " +":const:`None` if you used :const:`CERT_NONE` (rather than " +":const:`CERT_OPTIONAL` or :const:`CERT_REQUIRED`)." +msgstr "" +"对于服务器 SSL 套接字,客户端将仅在服务器要求时才提供证书;因此如果你使用了 :const:`CERT_NONE` (而不是 " +":const:`CERT_OPTIONAL` 或 :const:`CERT_REQUIRED`) 则 :meth:`getpeercert` 将返回 " +":const:`None`." + +#: ../../library/ssl.rst:1238 +msgid "See also :attr:`SSLContext.check_hostname`." +msgstr "另请参阅 :attr:`SSLContext.check_hostname`。" + +#: ../../library/ssl.rst:1240 +msgid "" +"The returned dictionary includes additional items such as ``issuer`` and " +"``notBefore``." +msgstr "返回的字典包括额外的条目例如 ``issuer`` 和 ``notBefore``。" + +#: ../../library/ssl.rst:1244 +msgid "" +":exc:`ValueError` is raised when the handshake isn't done. The returned " +"dictionary includes additional X509v3 extension items such as " +"``crlDistributionPoints``, ``caIssuers`` and ``OCSP`` URIs." +msgstr "" +"如果握手未完成则会引发 :exc:`ValueError`。返回的字典包括额外的 X509v3 扩展条目例如 " +"``crlDistributionPoints``, ``caIssuers`` 和 ``OCSP`` URI。" + +#: ../../library/ssl.rst:1249 +msgid "IPv6 address strings no longer have a trailing new line." +msgstr "IPv6 地址字符串不再附带末尾换行符。" + +#: ../../library/ssl.rst:1254 +msgid "" +"Returns verified certificate chain provided by the other end of the SSL " +"channel as a list of DER-encoded bytes. If certificate verification was " +"disabled method acts the same as :meth:`~SSLSocket.get_unverified_chain`." +msgstr "" +"返回由 SSL 通道另一端以 DER 编码字节列表形式提供的经过验证的证书链。如果证书验证被禁用则此方法的行为与 " +":meth:`~SSLSocket.get_unverified_chain` 相同。" + +#: ../../library/ssl.rst:1263 +msgid "" +"Returns raw certificate chain provided by the other end of the SSL channel " +"as a list of DER-encoded bytes." +msgstr "返回由 SSL 通道另一端以 DER 编码字节列表形式提供的原始证书链。" + +#: ../../library/ssl.rst:1270 +msgid "" +"Returns a three-value tuple containing the name of the cipher being used, " +"the version of the SSL protocol that defines its use, and the number of " +"secret bits being used. If no connection has been established, returns " +"``None``." +msgstr "" +"返回由三个值组成的元组,其中包含所使用的密码名称,定义其使用方式的 SSL 协议版本,以及所使用的加密比特位数。如果尚未建立连接,则返回 " +"``None``." + +#: ../../library/ssl.rst:1276 +msgid "" +"Return the list of ciphers available in both the client and server. Each " +"entry of the returned list is a three-value tuple containing the name of the" +" cipher, the version of the SSL protocol that defines its use, and the " +"number of secret bits the cipher uses. :meth:`~SSLSocket.shared_ciphers` " +"returns ``None`` if no connection has been established or the socket is a " +"client socket." +msgstr "" +"返回在客户端和服务器均可用的密码列表。所返回列表的每个条目都是由三个值组成的元组其中包含密码名称、定义其使用方式的 SSL " +"协议版本,以及密码所使用的加密比特位数量。如果连接尚未建立或套接字为客户端套接字则 :meth:`~SSLSocket.shared_ciphers` " +"将返回 ``None``。" + +#: ../../library/ssl.rst:1287 +msgid "" +"Return the compression algorithm being used as a string, or ``None`` if the " +"connection isn't compressed." +msgstr "以字符串形式返回所使用的压缩算法,或者如果连接没有使用压缩则返回 ``None``。" + +#: ../../library/ssl.rst:1290 +msgid "" +"If the higher-level protocol supports its own compression mechanism, you can" +" use :data:`OP_NO_COMPRESSION` to disable SSL-level compression." +msgstr "如果高层级的协议支持自己的压缩机制,你可以使用 :data:`OP_NO_COMPRESSION` 来禁用 SSL 层级的压缩。" + +#: ../../library/ssl.rst:1297 +msgid "" +"Get channel binding data for current connection, as a bytes object. Returns" +" ``None`` if not connected or the handshake has not been completed." +msgstr "为当前连接获取字节串形式的通道绑定数据。如果尚未连接或握手尚未完成则返回 ``None``。" + +#: ../../library/ssl.rst:1300 +msgid "" +"The *cb_type* parameter allow selection of the desired channel binding type." +" Valid channel binding types are listed in the :data:`CHANNEL_BINDING_TYPES`" +" list. Currently only the 'tls-unique' channel binding, defined by " +":rfc:`5929`, is supported. :exc:`ValueError` will be raised if an " +"unsupported channel binding type is requested." +msgstr "" +"*cb_type* 形参允许选择需要的通道绑定类型。有效的通道绑定类型在 :data:`CHANNEL_BINDING_TYPES` 列表中列出。 " +"目前只支持由 :rfc:`5929` 所定义的 'tls-unique' 通道绑定。如果请求了一个不受支持的通道绑定类型则将引发 " +":exc:`ValueError`." + +#: ../../library/ssl.rst:1310 +msgid "" +"Return the protocol that was selected during the TLS handshake. If " +":meth:`SSLContext.set_alpn_protocols` was not called, if the other party " +"does not support ALPN, if this socket does not support any of the client's " +"proposed protocols, or if the handshake has not happened yet, ``None`` is " +"returned." +msgstr "" +"返回在 TLS 握手期间所选择的协议。如果 :meth:`SSLContext.set_alpn_protocols` 未被调用,如果另一方不支持 " +"ALPN,如果此套接字不支持任何客户端所用的协议,或者如果握手尚未发生,则将返回 ``None``。" + +#: ../../library/ssl.rst:1320 +msgid "" +"Return the higher-level protocol that was selected during the TLS/SSL " +"handshake. If :meth:`SSLContext.set_npn_protocols` was not called, or if the" +" other party does not support NPN, or if the handshake has not yet happened," +" this will return ``None``." +msgstr "" +"返回在 TLS/SSL 握手期间所选择的高层级协议。如果 :meth:`SSLContext.set_npn_protocols` " +"未被调用,或者如果另一方不支持 NPN,或者如果握手尚未发生,则将返回 ``None``。" + +#: ../../library/ssl.rst:1329 ../../library/ssl.rst:1698 +msgid "NPN has been superseded by ALPN" +msgstr "NPN 已被 ALPN 取代。" + +#: ../../library/ssl.rst:1333 +msgid "" +"Performs the SSL shutdown handshake, which removes the TLS layer from the " +"underlying socket, and returns the underlying socket object. This can be " +"used to go from encrypted operation over a connection to unencrypted. The " +"returned socket should always be used for further communication with the " +"other side of the connection, rather than the original socket." +msgstr "" +"执行 SSL 关闭握手,这会从下层的套接字中移除 TLS 层,并返回下层的套接字对象。这可被用来通过一个连接将加密操作转为非加密。 " +"返回的套接字应当总是被用于同连接另一方的进一步通信,而不是原始的套接字。" + +#: ../../library/ssl.rst:1341 +msgid "" +"Requests post-handshake authentication (PHA) from a TLS 1.3 client. PHA can " +"only be initiated for a TLS 1.3 connection from a server-side socket, after " +"the initial TLS handshake and with PHA enabled on both sides, see " +":attr:`SSLContext.post_handshake_auth`." +msgstr "" +"向一个 TLS 1.3 客户端请求握手后身份验证(PHA)。只有在初始 TLS 握手之后且双方都启用了 PHA 的情况下才能为服务器端套接字的 TLS " +"1.3 连接启用 PHA,参见 :attr:`SSLContext.post_handshake_auth`。" + +#: ../../library/ssl.rst:1346 +msgid "" +"The method does not perform a cert exchange immediately. The server-side " +"sends a CertificateRequest during the next write event and expects the " +"client to respond with a certificate on the next read event." +msgstr "" +"此方法不会立即执行证书交换。服务器端会在下一次写入事件期间发送 CertificateRequest 并期待客户端在下一次读取事件期间附带证书进行响应。" + +#: ../../library/ssl.rst:1350 +msgid "" +"If any precondition isn't met (e.g. not TLS 1.3, PHA not enabled), an " +":exc:`SSLError` is raised." +msgstr "如果有任何前置条件未被满足(例如非 TLS 1.3,PHA 未启用),则会引发 :exc:`SSLError`。" + +#: ../../library/ssl.rst:1354 +msgid "" +"Only available with OpenSSL 1.1.1 and TLS 1.3 enabled. Without TLS 1.3 " +"support, the method raises :exc:`NotImplementedError`." +msgstr "" +"仅在 OpenSSL 1.1.1 且 TLS 1.3 被启用时可用。没有 TLS 1.3 支持,此方法将引发 " +":exc:`NotImplementedError`." + +#: ../../library/ssl.rst:1361 +msgid "" +"Return the actual SSL protocol version negotiated by the connection as a " +"string, or ``None`` if no secure connection is established. As of this " +"writing, possible return values include ``\"SSLv2\"``, ``\"SSLv3\"``, " +"``\"TLSv1\"``, ``\"TLSv1.1\"`` and ``\"TLSv1.2\"``. Recent OpenSSL versions " +"may define more return values." +msgstr "" +"以字符串形式返回由连接协商确定的实际 SSL 协议版本,或者如果未建立安全连接则返回 ``None``。 在撰写本文档时,可能的返回值包括 " +"``\"SSLv2\"``, ``\"SSLv3\"``, ``\"TLSv1\"``, ``\"TLSv1.1\"`` 和 " +"``\"TLSv1.2\"``。 最新的 OpenSSL 版本可能会定义更多的返回值。" + +#: ../../library/ssl.rst:1371 +msgid "" +"Returns the number of already decrypted bytes available for read, pending on" +" the connection." +msgstr "返回在连接上等待被读取的已解密字节数。" + +#: ../../library/ssl.rst:1376 +msgid "The :class:`SSLContext` object this SSL socket is tied to." +msgstr "该 SSL 套接字所关联的 :class:`SSLContext` 对象。" + +#: ../../library/ssl.rst:1382 +msgid "" +"A boolean which is ``True`` for server-side sockets and ``False`` for " +"client-side sockets." +msgstr "一个布尔值,对于服务器端套接字为 ``True`` 而对于客户端套接字则为 ``False``。" + +#: ../../library/ssl.rst:1389 +msgid "" +"Hostname of the server: :class:`str` type, or ``None`` for server-side " +"socket or if the hostname was not specified in the constructor." +msgstr "服务器的主机名::class:`str` 类型,对于服务器端套接字或者如果构造器中未指定主机名则为 ``None``。" + +#: ../../library/ssl.rst:1394 +msgid "" +"The attribute is now always ASCII text. When ``server_hostname`` is an " +"internationalized domain name (IDN), this attribute now stores the A-label " +"form (``\"xn--pythn-mua.org\"``), rather than the U-label form " +"(``\"pythön.org\"``)." +msgstr "" +"现在该属性将始终为 ASCII 文本。当 ``server_hostname`` 为一个国际化域名(IDN)时,该属性现在会保存为 A 标签形式 " +"(``\"xn--pythn-mua.org\"``) 而非 U 标签形式 (``\"pythön.org\"``)。" + +#: ../../library/ssl.rst:1402 +msgid "" +"The :class:`SSLSession` for this SSL connection. The session is available " +"for client and server side sockets after the TLS handshake has been " +"performed. For client sockets the session can be set before " +":meth:`~SSLSocket.do_handshake` has been called to reuse a session." +msgstr "" +"用于 SSL 连接的 :class:`SSLSession`。该会话将在执行 TLS 握手后对客户端和服务器端套接字可用。 " +"对于客户端套接字该会话可以在调用 :meth:`~SSLSocket.do_handshake` 之前被设置以重用一个会话。" + +#: ../../library/ssl.rst:1415 +msgid "SSL contexts" +msgstr "" + +#: ../../library/ssl.rst:1419 +msgid "" +"An SSL context holds various data longer-lived than single SSL connections, " +"such as SSL configuration options, certificate(s) and private key(s). It " +"also manages a cache of SSL sessions for server-side sockets, in order to " +"speed up repeated connections from the same clients." +msgstr "" +"SSL 上下文可保存各种比单独 SSL 连接寿命更长的数据,例如 SSL 配置选项,证书和私钥等。 " +"它还可为服务器端套接字管理缓存,以加快来自相同客户端的重复连接。" + +#: ../../library/ssl.rst:1426 +msgid "" +"Create a new SSL context. You may pass *protocol* which must be one of the " +"``PROTOCOL_*`` constants defined in this module. The parameter specifies " +"which version of the SSL protocol to use. Typically, the server chooses a " +"particular protocol version, and the client must adapt to the server's " +"choice. Most of the versions are not interoperable with the other versions." +" If not specified, the default is :data:`PROTOCOL_TLS`; it provides the " +"most compatibility with other versions." +msgstr "" +"创建一个新的 SSL 上下文。你可以传入 *protocol*,它必须为此模块中定义的 ``PROTOCOL_*`` 常量之一。该形参指定要使用哪个 " +"SSL 协议版本。通常,服务器会选择一个特定的协议版本,而客户端必须适应服务器的选择。大多数版本都不能与其他版本互操作。如果未指定,则默认值为 " +":data:`PROTOCOL_TLS`;它提供了与其他版本的最大兼容性。" + +#: ../../library/ssl.rst:1435 +msgid "" +"Here's a table showing which versions in a client (down the side) can " +"connect to which versions in a server (along the top):" +msgstr "这个表显示了客户端(纵向)的哪个版本能够连接服务器(横向)的哪个版本。" + +#: ../../library/ssl.rst:1441 +msgid "*client* / **server**" +msgstr "*客户端* / **服务器**" + +#: ../../library/ssl.rst:1441 +msgid "**SSLv2**" +msgstr "**SSLv2**" + +#: ../../library/ssl.rst:1441 +msgid "**SSLv3**" +msgstr "**SSLv3**" + +#: ../../library/ssl.rst:1441 +msgid "**TLS** [3]_" +msgstr "**TLS** [3]_" + +#: ../../library/ssl.rst:1441 +msgid "**TLSv1**" +msgstr "**TLSv1**" + +#: ../../library/ssl.rst:1441 +msgid "**TLSv1.1**" +msgstr "**TLSv1.1**" + +#: ../../library/ssl.rst:1441 +msgid "**TLSv1.2**" +msgstr "**TLSv1.2**" + +#: ../../library/ssl.rst:1443 +msgid "*SSLv2*" +msgstr "*SSLv2*" + +#: ../../library/ssl.rst:1443 ../../library/ssl.rst:1444 +#: ../../library/ssl.rst:1445 ../../library/ssl.rst:1446 +#: ../../library/ssl.rst:1447 ../../library/ssl.rst:1448 +msgid "yes" +msgstr "是" + +#: ../../library/ssl.rst:1443 ../../library/ssl.rst:1444 +#: ../../library/ssl.rst:1446 ../../library/ssl.rst:1447 +#: ../../library/ssl.rst:1448 +msgid "no" +msgstr "否" + +#: ../../library/ssl.rst:1443 ../../library/ssl.rst:1445 +msgid "no [1]_" +msgstr "否 [1]_" + +#: ../../library/ssl.rst:1444 +msgid "*SSLv3*" +msgstr "*SSLv3*" + +#: ../../library/ssl.rst:1444 ../../library/ssl.rst:1445 +msgid "no [2]_" +msgstr "否 [2]_" + +#: ../../library/ssl.rst:1445 +msgid "*TLS* (*SSLv23*) [3]_" +msgstr "*TLS* (*SSLv23*) [3]_" + +#: ../../library/ssl.rst:1446 +msgid "*TLSv1*" +msgstr "*TLSv1*" + +#: ../../library/ssl.rst:1447 +msgid "*TLSv1.1*" +msgstr "*TLSv1.1*" + +#: ../../library/ssl.rst:1448 +msgid "*TLSv1.2*" +msgstr "*TLSv1.2*" + +#: ../../library/ssl.rst:1451 +msgid "Footnotes" +msgstr "备注" + +#: ../../library/ssl.rst:1452 +msgid "" +":class:`SSLContext` disables SSLv2 with :data:`OP_NO_SSLv2` by default." +msgstr ":class:`SSLContext` 默认设置 :data:`OP_NO_SSLv2` 以禁用 SSLv2。" + +#: ../../library/ssl.rst:1453 +msgid "" +":class:`SSLContext` disables SSLv3 with :data:`OP_NO_SSLv3` by default." +msgstr ":class:`SSLContext` 默认设置 :data:`OP_NO_SSLv3` 以禁用 SSLv3。" + +#: ../../library/ssl.rst:1454 +msgid "" +"TLS 1.3 protocol will be available with :data:`PROTOCOL_TLS` in OpenSSL >= " +"1.1.1. There is no dedicated PROTOCOL constant for just TLS 1.3." +msgstr "" +"TLS 1.3 协议在 OpenSSL >= 1.1.1 中设置 :data:`PROTOCOL_TLS` 时可用。没有专门针对 TLS 1.3 的 " +"PROTOCOL 常量。" + +#: ../../library/ssl.rst:1459 +msgid "" +":func:`create_default_context` lets the :mod:`!ssl` module choose security " +"settings for a given purpose." +msgstr ":func:`create_default_context` 让 :mod:`!ssl` 模块为给定目标选择安全设置。" + +#: ../../library/ssl.rst:1464 +msgid "" +"The context is created with secure default values. The options " +":data:`OP_NO_COMPRESSION`, :data:`OP_CIPHER_SERVER_PREFERENCE`, " +":data:`OP_SINGLE_DH_USE`, :data:`OP_SINGLE_ECDH_USE`, :data:`OP_NO_SSLv2`, " +"and :data:`OP_NO_SSLv3` (except for :data:`PROTOCOL_SSLv3`) are set by " +"default. The initial cipher suite list contains only ``HIGH`` ciphers, no " +"``NULL`` ciphers and no ``MD5`` ciphers." +msgstr "" +"上下文会使用安全的默认值来创建。默认设置的选项有 :data:`OP_NO_COMPRESSION`, " +":data:`OP_CIPHER_SERVER_PREFERENCE`, :data:`OP_SINGLE_DH_USE`, " +":data:`OP_SINGLE_ECDH_USE`, :data:`OP_NO_SSLv2` 和 :data:`OP_NO_SSLv3` " +"(:data:`PROTOCOL_SSLv3` 除外)。初始密码套件列表只包含 ``HIGH`` 密码,而不包含 ``NULL`` 密码和 " +"``MD5`` 密码。" + +#: ../../library/ssl.rst:1474 +msgid "" +":class:`SSLContext` without protocol argument is deprecated. The context " +"class will either require :data:`PROTOCOL_TLS_CLIENT` or " +":data:`PROTOCOL_TLS_SERVER` protocol in the future." +msgstr "" +"不带协议参数的 :class:`SSLContext` 已废弃。将来,上下文类会要求使用 :data:`PROTOCOL_TLS_CLIENT` 或 " +":data:`PROTOCOL_TLS_SERVER` 协议。" + +#: ../../library/ssl.rst:1480 +msgid "" +"The default cipher suites now include only secure AES and ChaCha20 ciphers " +"with forward secrecy and security level 2. RSA and DH keys with less than " +"2048 bits and ECC keys with less than 224 bits are prohibited. " +":data:`PROTOCOL_TLS`, :data:`PROTOCOL_TLS_CLIENT`, and " +":data:`PROTOCOL_TLS_SERVER` use TLS 1.2 as minimum TLS version." +msgstr "" +"现在默认的密码套件只包含安全的 AES 和 ChaCha20 密码,具有前向保密性和安全级别 2。禁止使用少于 2048 位的 RSA 和 DH " +"密钥以及少于 224 位的 ECC 密钥。 :data:`PROTOCOL_TLS`、 :data:`PROTOCOL_TLS_CLIENT` 和 " +":data:`PROTOCOL_TLS_SERVER` 至少使用 TLS 1.2 版本。" + +#: ../../library/ssl.rst:1488 +msgid "" +":class:`SSLContext` only supports limited mutation once it has been used by " +"a connection. Adding new certificates to the internal trust store is " +"allowed, but changing ciphers, verification settings, or mTLS certificates " +"may result in surprising behavior." +msgstr "" +":class:`SSLContext` 一旦被某个连接使用它将只支持有限的变异。在内部信任存储中添加新证书是允许的,但是更改密码、验证设置或 mTLS " +"证书则可能导致令人吃惊的行为。" + +#: ../../library/ssl.rst:1495 +msgid "" +":class:`SSLContext` is designed to be shared and used by multiple " +"connections. Thus, it is thread-safe as long as it is not reconfigured after" +" being used by a connection." +msgstr ":class:`SSLContext` 被设计为可由多个连接共享和使用。因此,只要在被某个连接使用后不重新配置那么它就是线程安全的。" + +#: ../../library/ssl.rst:1500 +msgid ":class:`SSLContext` objects have the following methods and attributes:" +msgstr ":class:`SSLContext` 对象具有以下方法和属性:" + +#: ../../library/ssl.rst:1504 +msgid "" +"Get statistics about quantities of loaded X.509 certificates, count of X.509" +" certificates flagged as CA certificates and certificate revocation lists as" +" dictionary." +msgstr "获取以字典表示的有关已加载的 X.509 证书数量,被标记为 CA 证书的 X.509 证书数量以及证书吊销列表的统计信息。" + +#: ../../library/ssl.rst:1508 +msgid "Example for a context with one CA cert and one other cert::" +msgstr "具有一个 CA 证书和一个其他证书的上下文示例::" + +#: ../../library/ssl.rst:1510 +msgid "" +">>> context.cert_store_stats()\n" +"{'crl': 0, 'x509_ca': 1, 'x509': 2}" +msgstr "" +">>> context.cert_store_stats()\n" +"{'crl': 0, 'x509_ca': 1, 'x509': 2}" + +#: ../../library/ssl.rst:1518 +msgid "" +"Load a private key and the corresponding certificate. The *certfile* string" +" must be the path to a single file in PEM format containing the certificate " +"as well as any number of CA certificates needed to establish the " +"certificate's authenticity. The *keyfile* string, if present, must point to" +" a file containing the private key. Otherwise the private key will be taken" +" from *certfile* as well. See the discussion of :ref:`ssl-certificates` for" +" more information on how the certificate is stored in the *certfile*." +msgstr "" +"加载一个私钥及对应的证书。 *certfile* 字符串必须为以 PEM 格式表示的单个文件路径,该文件中包含证书以及确立证书真实性所需的任意数量的 " +"CA 证书。如果存在 *keyfile* 字符串,它必须指向一个包含私钥的文件。否则私钥也将从 *certfile* 中提取。请参阅 " +":ref:`ssl-certificates` 中的讨论来了解有关如何将证书存储至 *certfile* 的更多信息。" + +#: ../../library/ssl.rst:1527 +msgid "" +"The *password* argument may be a function to call to get the password for " +"decrypting the private key. It will only be called if the private key is " +"encrypted and a password is necessary. It will be called with no arguments," +" and it should return a string, bytes, or bytearray. If the return value is" +" a string it will be encoded as UTF-8 before using it to decrypt the key. " +"Alternatively a string, bytes, or bytearray value may be supplied directly " +"as the *password* argument. It will be ignored if the private key is not " +"encrypted and no password is needed." +msgstr "" +"*password* 参数可以是一个函数,调用时将得到用于解密私钥的密码。它在私钥被加密且需要密码时才会被调用。 " +"它调用时将不带任何参数,并且应当返回一个字符串、字节串或字节数组。如果返回值是一个字符串,在用它解密私钥之前它将以 UTF-8 进行编码。 " +"或者也可以直接将字符串、字节串或字节数组值作为 *password* 参数提供。如果私钥未被加密且不需要密码则它将被忽略。" + +#: ../../library/ssl.rst:1536 +msgid "" +"If the *password* argument is not specified and a password is required, " +"OpenSSL's built-in password prompting mechanism will be used to " +"interactively prompt the user for a password." +msgstr "如果未指定 *password* 参数且需要一个密码,将会使用 OpenSSL 内置的密码提示机制来交互式地提示用户输入密码。" + +#: ../../library/ssl.rst:1540 +msgid "" +"An :class:`SSLError` is raised if the private key doesn't match with the " +"certificate." +msgstr "如果私钥不能匹配证书则会引发 :class:`SSLError`。" + +#: ../../library/ssl.rst:1543 +msgid "New optional argument *password*." +msgstr "新增可选参数 *password*。" + +#: ../../library/ssl.rst:1548 +msgid "" +"Load a set of default \"certification authority\" (CA) certificates from " +"default locations. On Windows it loads CA certs from the ``CA`` and ``ROOT``" +" system stores. On all systems it calls " +":meth:`SSLContext.set_default_verify_paths`. In the future the method may " +"load CA certificates from other locations, too." +msgstr "" +" (CA) 证书。在 Windows 上它将从 ``CA`` 和 ``ROOT`` 系统存储中加载 CA 证书。在所有系统上它会调用 " +":meth:`SSLContext.set_default_verify_paths`。 将来该方法也可能会从其他位置加载 CA 证书。" + +#: ../../library/ssl.rst:1554 +msgid "" +"The *purpose* flag specifies what kind of CA certificates are loaded. The " +"default settings :const:`Purpose.SERVER_AUTH` loads certificates, that are " +"flagged and trusted for TLS web server authentication (client side sockets)." +" :const:`Purpose.CLIENT_AUTH` loads CA certificates for client certificate " +"verification on the server side." +msgstr "" +"*purpose* 旗标指明要加载哪种 CA 证书。默认设置 :const:`Purpose.SERVER_AUTH` 将加载被标记且被信任用于 TLS" +" Web 服务器验证(客户端套接字)的证书。 :const:`Purpose.CLIENT_AUTH` 则会加载用于在服务器端进行客户端证书验证的 CA" +" 证书。" + +#: ../../library/ssl.rst:1564 +msgid "" +"Load a set of \"certification authority\" (CA) certificates used to validate" +" other peers' certificates when :data:`verify_mode` is other than " +":data:`CERT_NONE`. At least one of *cafile* or *capath* must be specified." +msgstr "" +"当 :data:`verify_mode` 不为 :data:`CERT_NONE` 时加载一组用于验证其他对等方证书的 \"证书颁发机构\" (CA)" +" 证书。必须至少指定 *cafile* 或 *capath* 中的一个。" + +#: ../../library/ssl.rst:1568 +msgid "" +"This method can also load certification revocation lists (CRLs) in PEM or " +"DER format. In order to make use of CRLs, :attr:`SSLContext.verify_flags` " +"must be configured properly." +msgstr "" +"此方法还可加载 PEM 或 DER 格式的证书吊销列表 (CRL),为此必须正确配置 :attr:`SSLContext.verify_flags`。" + +#: ../../library/ssl.rst:1572 +msgid "" +"The *cafile* string, if present, is the path to a file of concatenated CA " +"certificates in PEM format. See the discussion of :ref:`ssl-certificates` " +"for more information about how to arrange the certificates in this file." +msgstr "" +"如果存在 *cafile* 字符串,它应为 PEM 格式的级联 CA 证书文件的路径。请参阅 :ref:`ssl-certificates` " +"中的讨论来了解有关如何处理此文件中的证书的更多信息。" + +#: ../../library/ssl.rst:1577 +msgid "" +"The *capath* string, if present, is the path to a directory containing " +"several CA certificates in PEM format, following an `OpenSSL specific layout" +" `_." +msgstr "" +"如果存在 *capath* 字符串,它将为包含多个 PEM 格式的 CA 证书的目录的路径,并遵循 `OpenSSL 专属布局 " +"`_." + +#: ../../library/ssl.rst:1582 +msgid "" +"The *cadata* object, if present, is either an ASCII string of one or more " +"PEM-encoded certificates or a :term:`bytes-like object` of DER-encoded " +"certificates. Like with *capath* extra lines around PEM-encoded certificates" +" are ignored but at least one certificate must be present." +msgstr "" +"如果存在 *cadata* 对象,它应为一个或多个 PEM 编码的证书的 ASCII 字符串或者 DER 编码的证书的 :term:`bytes-" +"like object`。与 *capath* 一样 PEM 编码的证书之外的多余行会被忽略,但至少要有一个证书。" + +#: ../../library/ssl.rst:1587 +msgid "New optional argument *cadata*" +msgstr "新增可选参数 *cadata*" + +#: ../../library/ssl.rst:1592 +msgid "" +"Get a list of loaded \"certification authority\" (CA) certificates. If the " +"``binary_form`` parameter is :const:`False` each list entry is a dict like " +"the output of :meth:`SSLSocket.getpeercert`. Otherwise the method returns a " +"list of DER-encoded certificates. The returned list does not contain " +"certificates from *capath* unless a certificate was requested and loaded by " +"a SSL connection." +msgstr "" +" (CA) 证书列表。如果 ``binary_form`` 形参为 :const:`False` 则每个列表条目都是一个类似于 " +":meth:`SSLSocket.getpeercert` 输出的字典。在其他情况下此方法将返回一个 DER 编码的证书的列表。返回的列表不包含来自 " +"*capath* 的证书,除非 SSL 连接请求并加载了一个证书。" + +#: ../../library/ssl.rst:1600 +msgid "" +"Certificates in a capath directory aren't loaded unless they have been used " +"at least once." +msgstr "capath 目录中的证书不会被加载,除非它们已至少被使用过一次。" + +#: ../../library/ssl.rst:1607 +msgid "" +"Get a list of enabled ciphers. The list is in order of cipher priority. See " +":meth:`SSLContext.set_ciphers`." +msgstr "获取已启用密码的列表。该列表将按密码的优先级排序。参见 :meth:`SSLContext.set_ciphers`。" + +#: ../../library/ssl.rst:1612 +msgid "" +">>> ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)\n" +">>> ctx.set_ciphers('ECDHE+AESGCM:!ECDSA')\n" +">>> ctx.get_ciphers()\n" +"[{'aead': True,\n" +" 'alg_bits': 256,\n" +" 'auth': 'auth-rsa',\n" +" 'description': 'ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA '\n" +" 'Enc=AESGCM(256) Mac=AEAD',\n" +" 'digest': None,\n" +" 'id': 50380848,\n" +" 'kea': 'kx-ecdhe',\n" +" 'name': 'ECDHE-RSA-AES256-GCM-SHA384',\n" +" 'protocol': 'TLSv1.2',\n" +" 'strength_bits': 256,\n" +" 'symmetric': 'aes-256-gcm'},\n" +" {'aead': True,\n" +" 'alg_bits': 128,\n" +" 'auth': 'auth-rsa',\n" +" 'description': 'ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA '\n" +" 'Enc=AESGCM(128) Mac=AEAD',\n" +" 'digest': None,\n" +" 'id': 50380847,\n" +" 'kea': 'kx-ecdhe',\n" +" 'name': 'ECDHE-RSA-AES128-GCM-SHA256',\n" +" 'protocol': 'TLSv1.2',\n" +" 'strength_bits': 128,\n" +" 'symmetric': 'aes-128-gcm'}]" +msgstr "" +">>> ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)\n" +">>> ctx.set_ciphers('ECDHE+AESGCM:!ECDSA')\n" +">>> ctx.get_ciphers()\n" +"[{'aead': True,\n" +" 'alg_bits': 256,\n" +" 'auth': 'auth-rsa',\n" +" 'description': 'ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA '\n" +" 'Enc=AESGCM(256) Mac=AEAD',\n" +" 'digest': None,\n" +" 'id': 50380848,\n" +" 'kea': 'kx-ecdhe',\n" +" 'name': 'ECDHE-RSA-AES256-GCM-SHA384',\n" +" 'protocol': 'TLSv1.2',\n" +" 'strength_bits': 256,\n" +" 'symmetric': 'aes-256-gcm'},\n" +" {'aead': True,\n" +" 'alg_bits': 128,\n" +" 'auth': 'auth-rsa',\n" +" 'description': 'ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA '\n" +" 'Enc=AESGCM(128) Mac=AEAD',\n" +" 'digest': None,\n" +" 'id': 50380847,\n" +" 'kea': 'kx-ecdhe',\n" +" 'name': 'ECDHE-RSA-AES128-GCM-SHA256',\n" +" 'protocol': 'TLSv1.2',\n" +" 'strength_bits': 128,\n" +" 'symmetric': 'aes-128-gcm'}]" + +#: ../../library/ssl.rst:1644 +msgid "" +"Load a set of default \"certification authority\" (CA) certificates from a " +"filesystem path defined when building the OpenSSL library. Unfortunately, " +"there's no easy way to know whether this method succeeds: no error is " +"returned if no certificates are to be found. When the OpenSSL library is " +"provided as part of the operating system, though, it is likely to be " +"configured properly." +msgstr "" +"从构建 OpenSSL 库时定义的文件系统路径中加载一组默认的 \"证书颁发机构\" (CA) 证书。 " +"不幸的是,没有一种简单的方式能知道此方法是否执行成功:如果未找到任何证书也不会返回错误。不过,当 OpenSSL " +"库是作为操作系统的一部分被提供时,它的配置应当是正确的。" + +#: ../../library/ssl.rst:1653 +msgid "" +"Set the available ciphers for sockets created with this context. It should " +"be a string in the `OpenSSL cipher list format " +"`_. If no cipher can be " +"selected (because compile-time options or other configuration forbids use of" +" all the specified ciphers), an :class:`SSLError` will be raised." +msgstr "" +"为使用此上下文创建的套接字设置可用密码。它应当为 `OpenSSL 密码列表格式 " +"`_ 的字符串。 " +"如果没有可被选择的密码(由于编译时选项或其他配置禁止使用已指定的所有密码),则将引发 :class:`SSLError`。" + +#: ../../library/ssl.rst:1661 +msgid "" +"when connected, the :meth:`SSLSocket.cipher` method of SSL sockets will give" +" the currently selected cipher." +msgstr "在连接后,SSL 套接字的 :meth:`SSLSocket.cipher` 方法将给出当前所选择的密码。" + +#: ../../library/ssl.rst:1664 +msgid "" +"TLS 1.3 cipher suites cannot be disabled with " +":meth:`~SSLContext.set_ciphers`." +msgstr "TLS 1.3 密码套件不能通过 :meth:`~SSLContext.set_ciphers` 禁用。" + +#: ../../library/ssl.rst:1669 +msgid "" +"Specify which protocols the socket should advertise during the SSL/TLS " +"handshake. It should be a list of ASCII strings, like ``['http/1.1', " +"'spdy/2']``, ordered by preference. The selection of a protocol will happen " +"during the handshake, and will play out according to :rfc:`7301`. After a " +"successful handshake, the :meth:`SSLSocket.selected_alpn_protocol` method " +"will return the agreed-upon protocol." +msgstr "" +"指定在 SSL/TLS 握手期间套接字应当通告的协议。它应为由 ASCII 字符串组成的列表,例如 ``['http/1.1', " +"'spdy/2']``,按首选顺序排列。协议的选择将在握手期间发生,并依据 :rfc:`7301` 来执行。 " +"在握手成功后,:meth:`SSLSocket.selected_alpn_protocol` 方法将返回已达成一致的协议。" + +#: ../../library/ssl.rst:1676 +msgid "" +"This method will raise :exc:`NotImplementedError` if :data:`HAS_ALPN` is " +"``False``." +msgstr "如果 :data:`HAS_ALPN` 为 ``False`` 则此方法将引发 :exc:`NotImplementedError`。" + +#: ../../library/ssl.rst:1683 +msgid "" +"Specify which protocols the socket should advertise during the SSL/TLS " +"handshake. It should be a list of strings, like ``['http/1.1', 'spdy/2']``, " +"ordered by preference. The selection of a protocol will happen during the " +"handshake, and will play out according to the `Application Layer Protocol " +"Negotiation `_. After a successful handshake, the " +":meth:`SSLSocket.selected_npn_protocol` method will return the agreed-upon " +"protocol." +msgstr "" +"指定在 SSL/TLS 握手期间套接字应当通告的协议。它应为由字符串组成的列表,例如 ``['http/1.1', " +"'spdy/2']``,按首选顺序排列。协议的选择将在握手期间发生,并将依据 `应用层协议协商 " +"`_ " +"来执行。在握手成功后,:meth:`SSLSocket.selected_npn_protocol` 方法将返回已达成一致的协议。" + +#: ../../library/ssl.rst:1691 +msgid "" +"This method will raise :exc:`NotImplementedError` if :data:`HAS_NPN` is " +"``False``." +msgstr "如果 :data:`HAS_NPN` 为 ``False`` 则此方法将引发 :exc:`NotImplementedError`。" + +#: ../../library/ssl.rst:1702 +msgid "" +"Register a callback function that will be called after the TLS Client Hello " +"handshake message has been received by the SSL/TLS server when the TLS " +"client specifies a server name indication. The server name indication " +"mechanism is specified in :rfc:`6066` section 3 - Server Name Indication." +msgstr "" +"注册一个回调函数,当 TLS 客户端指定了一个服务器名称提示时,该回调函数将在 SSL/TLS 服务器接收到 TLS Client Hello " +"握手消息后被调用。服务器名称提示机制的定义见 :rfc:`6066` section 3 - Server Name Indication。" + +#: ../../library/ssl.rst:1707 +msgid "" +"Only one callback can be set per ``SSLContext``. If *sni_callback* is set " +"to ``None`` then the callback is disabled. Calling this function a " +"subsequent time will disable the previously registered callback." +msgstr "" +"每个 ``SSLContext`` 只能设置一个回调。如果 *sni_callback* 被设置为 ``None`` 则会禁用回调。 " +"对该函数的后续调用将禁用之前注册的回调。" + +#: ../../library/ssl.rst:1711 +msgid "" +"The callback function will be called with three arguments; the first being " +"the :class:`ssl.SSLSocket`, the second is a string that represents the " +"server name that the client is intending to communicate (or :const:`None` if" +" the TLS Client Hello does not contain a server name) and the third argument" +" is the original :class:`SSLContext`. The server name argument is text. For " +"internationalized domain name, the server name is an IDN A-label (``\"xn--" +"pythn-mua.org\"``)." +msgstr "" +"此回调函数将附带三个参数来调用;第一个参数是 :class:`ssl.SSLSocket`,第二个参数是代表客户端准备与之通信的服务器的字符串 " +"(或者如果 TLS Client Hello 不包含服务器名称则为 :const:`None`) 而第三个参数是原来的 " +":class:`SSLContext`。服务器名称参数为文本形式。对于国际化域名,服务器名称是一个 IDN A 标签 " +"(``\\mua.org\"``)。" + +#: ../../library/ssl.rst:1719 +msgid "" +"A typical use of this callback is to change the :class:`ssl.SSLSocket`'s " +":attr:`SSLSocket.context` attribute to a new object of type " +":class:`SSLContext` representing a certificate chain that matches the server" +" name." +msgstr "" +"此回调的一个典型用法是将 :class:`ssl.SSLSocket` 的 :attr:`SSLSocket.context` 属性修改为一个 " +":class:`SSLContext` 类型的新对象,该对象代表与服务器相匹配的证书链。" + +#: ../../library/ssl.rst:1724 +msgid "" +"Due to the early negotiation phase of the TLS connection, only limited " +"methods and attributes are usable like " +":meth:`SSLSocket.selected_alpn_protocol` and :attr:`SSLSocket.context`. The " +":meth:`SSLSocket.getpeercert`, :meth:`SSLSocket.get_verified_chain`, " +":meth:`SSLSocket.get_unverified_chain` :meth:`SSLSocket.cipher` and " +":meth:`SSLSocket.compression` methods require that the TLS connection has " +"progressed beyond the TLS Client Hello and therefore will not return " +"meaningful values nor can they be called safely." +msgstr "" +"由于 TLS 连接处于早期协商阶段,因此仅能使用有限的方法和属性例如 :meth:`SSLSocket.selected_alpn_protocol` " +"和 :attr:`SSLSocket.context`。 :meth:`SSLSocket.getpeercert`, " +":meth:`SSLSocket.get_verified_chain`, :meth:`SSLSocket.get_unverified_chain`" +" :meth:`SSLSocket.cipher` 和 :meth:`SSLSocket.compression` 方法要求 TLS 连接已过 TLS " +"Client Hello 步骤因而不会返回有意义的值也不能安全地调用它们。" + +#: ../../library/ssl.rst:1733 +msgid "" +"The *sni_callback* function must return ``None`` to allow the TLS " +"negotiation to continue. If a TLS failure is required, a constant " +":const:`ALERT_DESCRIPTION_* ` can be " +"returned. Other return values will result in a TLS fatal error with " +":const:`ALERT_DESCRIPTION_INTERNAL_ERROR`." +msgstr "" +"*sni_callback* 函数必须返回 ``None`` 以允许 TLS 协商继续进行。如果想要 TLS 失败,则可以返回常量 " +":const:`ALERT_DESCRIPTION_* `。其他返回值将导致 TLS" +" 的致命错误 :const:`ALERT_DESCRIPTION_INTERNAL_ERROR`。" + +#: ../../library/ssl.rst:1739 +msgid "" +"If an exception is raised from the *sni_callback* function the TLS " +"connection will terminate with a fatal TLS alert message " +":const:`ALERT_DESCRIPTION_HANDSHAKE_FAILURE`." +msgstr "" +"如果从 *sni_callback* 函数引发了异常,则 TLS 连接将终止并发出 TLS 致命警告消息 " +":const:`ALERT_DESCRIPTION_HANDSHAKE_FAILURE`." + +#: ../../library/ssl.rst:1743 +msgid "" +"This method will raise :exc:`NotImplementedError` if the OpenSSL library had" +" OPENSSL_NO_TLSEXT defined when it was built." +msgstr "" +"如果 OpenSSL 库在构建时定义了 OPENSSL_NO_TLSEXT 则此方法将引发 :exc:`NotImplementedError`。" + +#: ../../library/ssl.rst:1750 +msgid "" +"This is a legacy API retained for backwards compatibility. When possible, " +"you should use :attr:`sni_callback` instead. The given " +"*server_name_callback* is similar to *sni_callback*, except that when the " +"server hostname is an IDN-encoded internationalized domain name, the " +"*server_name_callback* receives a decoded U-label (``\"pythön.org\"``)." +msgstr "" +"这是被保留用于向下兼容的旧式 API。在可能的情况下,你应当改用 :attr:`sni_callback`。给出的 " +"*server_name_callback* 类似于 *sni_callback*,不同之处在于当服务器主机名是 IDN " +"编码的国际化域名时,*server_name_callback* 会接收到一个已解码的 U 标签 (``\"pythön.org\"``)。" + +#: ../../library/ssl.rst:1756 +msgid "" +"If there is a decoding error on the server name, the TLS connection will " +"terminate with an :const:`ALERT_DESCRIPTION_INTERNAL_ERROR` fatal TLS alert " +"message to the client." +msgstr "" +"如果发生了服务器名称解码错误,TLS 连接将终止并向客户端发出 :const:`ALERT_DESCRIPTION_INTERNAL_ERROR` 致命" +" TLS 警告消息。" + +#: ../../library/ssl.rst:1764 +msgid "" +"Load the key generation parameters for Diffie-Hellman (DH) key exchange. " +"Using DH key exchange improves forward secrecy at the expense of " +"computational resources (both on the server and on the client). The *dhfile*" +" parameter should be the path to a file containing DH parameters in PEM " +"format." +msgstr "" +"加载密钥生成参数用于 Diffie-Hellman (DH) 密钥交换。使用 DH 密钥交换能以消耗(服务器和客户端的)计算资源为代价提升前向保密性。 " +"*dhfile* 参数应当为指向一个包含 PEM 格式的 DH 形参的文件的路径。" + +#: ../../library/ssl.rst:1770 +msgid "" +"This setting doesn't apply to client sockets. You can also use the " +":data:`OP_SINGLE_DH_USE` option to further improve security." +msgstr "此设置不会应用于客户端套接字。你还可以使用 :data:`OP_SINGLE_DH_USE` 选项来进一步提升安全性。" + +#: ../../library/ssl.rst:1777 +msgid "" +"Set the curve name for Elliptic Curve-based Diffie-Hellman (ECDH) key " +"exchange. ECDH is significantly faster than regular DH while arguably as " +"secure. The *curve_name* parameter should be a string describing a well-" +"known elliptic curve, for example ``prime256v1`` for a widely supported " +"curve." +msgstr "" +"为基于椭圆曲线的 Elliptic Curve-based Diffie-Hellman (ECDH) 密钥交换设置曲线名称。ECDH 显著快于常规 " +"DH 同时据信同样安全。 *curve_name* 形参应为描述某个知名椭圆曲线的字符串,例如受到广泛支持的曲线 ``prime256v1``。" + +#: ../../library/ssl.rst:1783 +msgid "" +"This setting doesn't apply to client sockets. You can also use the " +":data:`OP_SINGLE_ECDH_USE` option to further improve security." +msgstr "此设置不会应用于客户端套接字。你还可以使用 :data:`OP_SINGLE_ECDH_USE` 选项来进一步提升安全性。" + +#: ../../library/ssl.rst:1786 +msgid "This method is not available if :data:`HAS_ECDH` is ``False``." +msgstr "如果 :data:`HAS_ECDH` 为 ``False`` 则此方法将不可用。" + +#: ../../library/ssl.rst:1791 +msgid "" +"`SSL/TLS & Perfect Forward Secrecy " +"`_" +msgstr "" +"`SSL/TLS & Perfect Forward Secrecy " +"`_" + +#: ../../library/ssl.rst:1792 +msgid "Vincent Bernat." +msgstr "Vincent Bernat." + +#: ../../library/ssl.rst:1798 +msgid "" +"Wrap an existing Python socket *sock* and return an instance of " +":attr:`SSLContext.sslsocket_class` (default :class:`SSLSocket`). The " +"returned SSL socket is tied to the context, its settings and certificates. " +"*sock* must be a :const:`~socket.SOCK_STREAM` socket; other socket types are" +" unsupported." +msgstr "" +"包装一个现有的 Python 套接字 *sock* 并返回一个 :attr:`SSLContext.sslsocket_class` 的实例 (默认为 " +":class:`SSLSocket`)。返回的 SSL 套接字会关联到相应上下文、设置及证书。 *sock* 必须是一个 " +":const:`~socket.SOCK_STREAM` 套接字;其他套接字类型均不受支持。" + +#: ../../library/ssl.rst:1804 +msgid "" +"The parameter ``server_side`` is a boolean which identifies whether server-" +"side or client-side behavior is desired from this socket." +msgstr "形参 ``server_side`` 是一个布尔值,它标明希望从该套接字获得服务器端行为还是客户端行为。" + +#: ../../library/ssl.rst:1807 +msgid "" +"For client-side sockets, the context construction is lazy; if the underlying" +" socket isn't connected yet, the context construction will be performed " +"after :meth:`connect` is called on the socket. For server-side sockets, if " +"the socket has no remote peer, it is assumed to be a listening socket, and " +"the server-side SSL wrapping is automatically performed on client " +"connections accepted via the :meth:`accept` method. The method may raise " +":exc:`SSLError`." +msgstr "" +"对于客户端套接字,上下文的构造会延迟执行;如果下层的套接字尚未连接,上下文的构造将在对套接字调用 :meth:`connect` 之后执行。 " +"对于服务器端套接字,如果套接字没有远端对等方,它会被视为一个监听套接字,并且服务器端 SSL 包装操作会在通过 :meth:`accept` " +"方法所接受的客户端连接上自动执行。此方法可能会引发 :exc:`SSLError`。" + +#: ../../library/ssl.rst:1815 +msgid "" +"On client connections, the optional parameter *server_hostname* specifies " +"the hostname of the service which we are connecting to. This allows a " +"single server to host multiple SSL-based services with distinct " +"certificates, quite similarly to HTTP virtual hosts. Specifying " +"*server_hostname* will raise a :exc:`ValueError` if *server_side* is true." +msgstr "" +"在客户端连接上,可选形参 *server_hostname* 指定所要连接的服务的主机名。这允许单个服务器托管具有单独证书的多个基于 SSL " +"的服务,很类似于 HTTP 虚拟主机。如果 *server_side* 为真值则指定 *server_hostname* 将引发 " +":exc:`ValueError`." + +#: ../../library/ssl.rst:1821 +msgid "" +"The parameter ``do_handshake_on_connect`` specifies whether to do the SSL " +"handshake automatically after doing a :meth:`socket.connect`, or whether the" +" application program will call it explicitly, by invoking the " +":meth:`SSLSocket.do_handshake` method. Calling " +":meth:`SSLSocket.do_handshake` explicitly gives the program control over the" +" blocking behavior of the socket I/O involved in the handshake." +msgstr "" +"形参 ``do_handshake_on_connect`` 指明是否要在调用 :meth:`socket.connect` 之后自动执行 SSL " +"握手,还是要通过唤起 :meth:`SSLSocket.do_handshake` 方法让应用程序显式地调用它。显式地调用 " +":meth:`SSLSocket.do_handshake` 可给予程序对握手中所涉及的套接字 I/O 阻塞行为的控制。" + +#: ../../library/ssl.rst:1828 +msgid "" +"The parameter ``suppress_ragged_eofs`` specifies how the " +":meth:`SSLSocket.recv` method should signal unexpected EOF from the other " +"end of the connection. If specified as :const:`True` (the default), it " +"returns a normal EOF (an empty bytes object) in response to unexpected EOF " +"errors raised from the underlying socket; if :const:`False`, it will raise " +"the exceptions back to the caller." +msgstr "" +"形参 ``suppress_ragged_eofs`` 指明 :meth:`SSLSocket.recv` 方法应当如何从连接的另一端发送非预期的 " +"EOF 信号。如果指定为 :const:`True` (默认值),它将返回正常的 EOF (空字节串对象) 来响应从下层套接字引发的非预期的 EOF " +"错误;如果指定为 :const:`False`,它将向调用方引发异常。" + +#: ../../library/ssl.rst:1835 +msgid "*session*, see :attr:`~SSLSocket.session`." +msgstr "*session*,参见 :attr:`~SSLSocket.session`。" + +#: ../../library/ssl.rst:1837 +msgid "" +"To wrap an :class:`SSLSocket` in another :class:`SSLSocket`, use " +":meth:`SSLContext.wrap_bio`." +msgstr "" +"要将 :class:`SSLSocket` 包装在另一个 :class:`SSLSocket` 中,请使用 " +":meth:`SSLContext.wrap_bio`." + +#: ../../library/ssl.rst:1840 +msgid "" +"Always allow a server_hostname to be passed, even if OpenSSL does not have " +"SNI." +msgstr "总是允许传送 server_hostname,即使 OpenSSL 没有 SNI。" + +#: ../../library/ssl.rst:1844 ../../library/ssl.rst:1871 +msgid "*session* argument was added." +msgstr "增加了 *session* 参数。" + +#: ../../library/ssl.rst:1847 +msgid "" +"The method returns an instance of :attr:`SSLContext.sslsocket_class` instead" +" of hard-coded :class:`SSLSocket`." +msgstr "" +"此方法返回 :attr:`SSLContext.sslsocket_class` 的实例而不是硬编码的 :class:`SSLSocket`。" + +#: ../../library/ssl.rst:1853 +msgid "" +"The return type of :meth:`SSLContext.wrap_socket`, defaults to " +":class:`SSLSocket`. The attribute can be assigned to on instances of " +":class:`SSLContext` in order to return a custom subclass of " +":class:`SSLSocket`." +msgstr "" +":meth:`SSLContext.wrap_socket` 的返回类型,默认为 :class:`SSLSocket`。该属性可以分配给 " +":class:`SSLContext` 实例被重载以便返回自定义的 :class:`SSLSocket` 的子类。" + +#: ../../library/ssl.rst:1863 +msgid "" +"Wrap the BIO objects *incoming* and *outgoing* and return an instance of " +":attr:`SSLContext.sslobject_class` (default :class:`SSLObject`). The SSL " +"routines will read input data from the incoming BIO and write data to the " +"outgoing BIO." +msgstr "" +"包装 BIO 对象 *incoming* 和 *outgoing* 并返回一个 :attr:`SSLContext.sslobject_class` " +"(默认为 :class:`SSLObject`) 的实例。SSL 例程将从 BIO 中读取输入数据并将数据写入到 outgoing BIO。" + +#: ../../library/ssl.rst:1868 +msgid "" +"The *server_side*, *server_hostname* and *session* parameters have the same " +"meaning as in :meth:`SSLContext.wrap_socket`." +msgstr "" +"*server_side*, *server_hostname* 和 *session* 形参具有与 " +":meth:`SSLContext.wrap_socket` 中相同的含义。" + +#: ../../library/ssl.rst:1874 +msgid "" +"The method returns an instance of :attr:`SSLContext.sslobject_class` instead" +" of hard-coded :class:`SSLObject`." +msgstr "" +"此方法返回 :attr:`SSLContext.sslobject_class` 的实例而不是硬编码的 :class:`SSLObject`。" + +#: ../../library/ssl.rst:1880 +msgid "" +"The return type of :meth:`SSLContext.wrap_bio`, defaults to " +":class:`SSLObject`. The attribute can be overridden on instance of class in " +"order to return a custom subclass of :class:`SSLObject`." +msgstr "" +":meth:`SSLContext.wrap_bio` 的返回类型,默认为 :class:`SSLObject`。 " +"该属性可以在类实例上被重载以便返回自定义的 :class:`SSLObject` 的子类。" + +#: ../../library/ssl.rst:1888 +msgid "" +"Get statistics about the SSL sessions created or managed by this context. A " +"dictionary is returned which maps the names of each `piece of information " +"`_ to their " +"numeric values. For example, here is the total number of hits and misses in" +" the session cache since the context was created::" +msgstr "" +"获取由该上下文创建或管理的 SSL 会话的统计数据。返回将每个 `信息块 " +"`_ 映射到其数字值的字典。 " +"例如,下面是自该上下文创建以来会话缓存中命中和未命中的总计数::" + +#: ../../library/ssl.rst:1893 +msgid "" +">>> stats = context.session_stats()\n" +">>> stats['hits'], stats['misses']\n" +"(0, 0)" +msgstr "" +">>> stats = context.session_stats()\n" +">>> stats['hits'], stats['misses']\n" +"(0, 0)" + +#: ../../library/ssl.rst:1899 +msgid "" +"Whether to match the peer cert's hostname in :meth:`SSLSocket.do_handshake`." +" The context's :attr:`~SSLContext.verify_mode` must be set to " +":data:`CERT_OPTIONAL` or :data:`CERT_REQUIRED`, and you must pass " +"*server_hostname* to :meth:`~SSLContext.wrap_socket` in order to match the " +"hostname. Enabling hostname checking automatically sets " +":attr:`~SSLContext.verify_mode` from :data:`CERT_NONE` to " +":data:`CERT_REQUIRED`. It cannot be set back to :data:`CERT_NONE` as long " +"as hostname checking is enabled. The :data:`PROTOCOL_TLS_CLIENT` protocol " +"enables hostname checking by default. With other protocols, hostname " +"checking must be enabled explicitly." +msgstr "" +"是否要将匹配 :meth:`SSLSocket.do_handshake` 中对等方证书的主机名。该上下文的 " +":attr:`~SSLContext.verify_mode` 必须被设为 :data:`CERT_OPTIONAL` 或 " +":data:`CERT_REQUIRED`,并且你必须将 *server_hostname* 传给 " +":meth:`~SSLContext.wrap_socket` 以便匹配主机名。启用主机名检查会自动将 " +":attr:`~SSLContext.verify_mode` 从 :data:`CERT_NONE` 设为 " +":data:`CERT_REQUIRED`。只要启用了主机名检查就无法将其设回 :data:`CERT_NONE`。 " +":data:`PROTOCOL_TLS_CLIENT` 协议默认启用主机名检查。对于其他协议,则必须显式地启用主机名检查。" + +#: ../../library/ssl.rst:1912 +msgid "" +"import socket, ssl\n" +"\n" +"context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)\n" +"context.verify_mode = ssl.CERT_REQUIRED\n" +"context.check_hostname = True\n" +"context.load_default_certs()\n" +"\n" +"s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n" +"ssl_sock = context.wrap_socket(s, server_hostname='www.verisign.com')\n" +"ssl_sock.connect(('www.verisign.com', 443))" +msgstr "" +"import socket, ssl\n" +"\n" +"context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)\n" +"context.verify_mode = ssl.CERT_REQUIRED\n" +"context.check_hostname = True\n" +"context.load_default_certs()\n" +"\n" +"s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n" +"ssl_sock = context.wrap_socket(s, server_hostname='www.verisign.com')\n" +"ssl_sock.connect(('www.verisign.com', 443))" + +#: ../../library/ssl.rst:1927 +msgid "" +":attr:`~SSLContext.verify_mode` is now automatically changed to " +":data:`CERT_REQUIRED` when hostname checking is enabled and " +":attr:`~SSLContext.verify_mode` is :data:`CERT_NONE`. Previously the same " +"operation would have failed with a :exc:`ValueError`." +msgstr "" +"现在当主机名检查被启用且 :attr:`~SSLContext.verify_mode` 为 :data:`CERT_NONE` 时 " +":attr:`~SSLContext.verify_mode` 会自动更改为 :data:`CERT_REQUIRED`。 " +"在之前版本中同样的操作将失败并引发 :exc:`ValueError`。" + +#: ../../library/ssl.rst:1934 +msgid "" +"Write TLS keys to a keylog file, whenever key material is generated or " +"received. The keylog file is designed for debugging purposes only. The file " +"format is specified by NSS and used by many traffic analyzers such as " +"Wireshark. The log file is opened in append-only mode. Writes are " +"synchronized between threads, but not between processes." +msgstr "" +"每当生成或接收到密钥时,将 TLS 密钥写入到一个密钥日志文件。密钥日志文件的设计仅适用于调试目的。文件的格式由 NSS 指明并为许多流量分析工具例如 " +"Wireshark 所使用。日志文件会以追加模式打开。写入操作会在线程之间同步,但不会在进程之间同步。" + +#: ../../library/ssl.rst:1944 +msgid "" +"A :class:`TLSVersion` enum member representing the highest supported TLS " +"version. The value defaults to :attr:`TLSVersion.MAXIMUM_SUPPORTED`. The " +"attribute is read-only for protocols other than :const:`PROTOCOL_TLS`, " +":const:`PROTOCOL_TLS_CLIENT`, and :const:`PROTOCOL_TLS_SERVER`." +msgstr "" +"一个代表所支持的最高 TLS 版本的 :class:`TLSVersion` 枚举成员。该值默认为 " +":attr:`TLSVersion.MAXIMUM_SUPPORTED`。这个属性对于 :const:`PROTOCOL_TLS`, " +":const:`PROTOCOL_TLS_CLIENT` 和 :const:`PROTOCOL_TLS_SERVER` 以外的其他协议来说都是只读的。" + +#: ../../library/ssl.rst:1949 +msgid "" +"The attributes :attr:`~SSLContext.maximum_version`, " +":attr:`~SSLContext.minimum_version` and :attr:`SSLContext.options` all " +"affect the supported SSL and TLS versions of the context. The implementation" +" does not prevent invalid combinations. For example a context with " +":attr:`OP_NO_TLSv1_2` in :attr:`~SSLContext.options` and " +":attr:`~SSLContext.maximum_version` set to :attr:`TLSVersion.TLSv1_2` will " +"not be able to establish a TLS 1.2 connection." +msgstr "" + +#: ../../library/ssl.rst:1962 +msgid "" +"Like :attr:`SSLContext.maximum_version` except it is the lowest supported " +"version or :attr:`TLSVersion.MINIMUM_SUPPORTED`." +msgstr "" +"与 :attr:`SSLContext.maximum_version` 类似,区别在于它是所支持的最低版本或为 " +":attr:`TLSVersion.MINIMUM_SUPPORTED`." + +#: ../../library/ssl.rst:1969 +msgid "" +"Control the number of TLS 1.3 session tickets of a " +":const:`PROTOCOL_TLS_SERVER` context. The setting has no impact on TLS 1.0 " +"to 1.2 connections." +msgstr "" +"控制一个 :const:`PROTOCOL_TLS_SERVER` 上下文的 TLS 1.3 会话凭据数量。这个设置不会影响 TLS 1.0 至 1.2" +" 的连接。" + +#: ../../library/ssl.rst:1977 +msgid "" +"An integer representing the set of SSL options enabled on this context. The " +"default value is :data:`OP_ALL`, but you can specify other options such as " +":data:`OP_NO_SSLv2` by ORing them together." +msgstr "" +"一个代表此上下文中所启用的 SSL 选项集的整数。默认值为 :data:`OP_ALL`,但你也可以通过在选项间进行 OR 运算来指定其他选项例如 " +":data:`OP_NO_SSLv2`." + +#: ../../library/ssl.rst:1981 +msgid ":attr:`SSLContext.options` returns :class:`Options` flags:" +msgstr ":attr:`SSLContext.options` 返回 :class:`Options` 旗标:" + +#: ../../library/ssl.rst:1989 +msgid "" +"All ``OP_NO_SSL*`` and ``OP_NO_TLS*`` options have been deprecated since " +"Python 3.7. Use :attr:`SSLContext.minimum_version` and " +":attr:`SSLContext.maximum_version` instead." +msgstr "" +"自 Python 3.7 起,所有 ``OP_NO_SSL*`` 和 ``OP_NO_TLS*`` 选项已被弃用,请改用 " +":attr:`SSLContext.minimum_version` 和 :attr:`SSLContext.maximum_version`。" + +#: ../../library/ssl.rst:1995 +msgid "" +"Enable TLS 1.3 post-handshake client authentication. Post-handshake auth is " +"disabled by default and a server can only request a TLS client certificate " +"during the initial handshake. When enabled, a server may request a TLS " +"client certificate at any time after the handshake." +msgstr "" +"启用 TLS 1.3 握手后客户端身份验证。握手后验证默认是被禁用的,服务器只能在初始握手期间请求 TLS 客户端证书。 " +"当启用时,服务器可以在握手之后的任何时候请求 TLS 客户端证书。" + +#: ../../library/ssl.rst:2000 +msgid "" +"When enabled on client-side sockets, the client signals the server that it " +"supports post-handshake authentication." +msgstr "当在客户端套接字上启用时,客户端会向服务器发信号说明它支持握手后身份验证。" + +#: ../../library/ssl.rst:2003 +msgid "" +"When enabled on server-side sockets, :attr:`SSLContext.verify_mode` must be " +"set to :data:`CERT_OPTIONAL` or :data:`CERT_REQUIRED`, too. The actual " +"client cert exchange is delayed until " +":meth:`SSLSocket.verify_client_post_handshake` is called and some I/O is " +"performed." +msgstr "" +"当在服务器端套接字上启用时,:attr:`SSLContext.verify_mode` 也必须被设为 :data:`CERT_OPTIONAL` 或 " +":data:`CERT_REQUIRED`。实际的客户端证书交换会被延迟直至 " +":meth:`SSLSocket.verify_client_post_handshake` 被调用并执行了一些 I/O 操作后再进行。" + +#: ../../library/ssl.rst:2013 +msgid "" +"The protocol version chosen when constructing the context. This attribute " +"is read-only." +msgstr "构造上下文时所选择的协议版本。这个属性是只读的。" + +#: ../../library/ssl.rst:2018 +msgid "" +"Whether :attr:`~SSLContext.check_hostname` falls back to verify the cert's " +"subject common name in the absence of a subject alternative name extension " +"(default: true)." +msgstr "" +"在没有目标替代名称扩展的情况下 :attr:`~SSLContext.check_hostname` 是否要回退为验证证书的通用名称(默认为真值)。" + +#: ../../library/ssl.rst:2026 +msgid "" +"The flag had no effect with OpenSSL before version 1.1.1l. Python 3.8.9, " +"3.9.3, and 3.10 include workarounds for previous versions." +msgstr "" +"此旗标在 OpenSSL 1.1.1l 之前的版本上不起作用。Python 3.8.9, 3.9.3 和 3.10 包括了针对之前版本的变通处理。" + +#: ../../library/ssl.rst:2031 +msgid "" +"An integer representing the `security level " +"`_ for the" +" context. This attribute is read-only." +msgstr "" +"一个代表上下文 `安全级别 " +"`_ 的整数。 " +"该属性是只读的。" + +#: ../../library/ssl.rst:2039 +msgid "" +"The flags for certificate verification operations. You can set flags like " +":data:`VERIFY_CRL_CHECK_LEAF` by ORing them together. By default OpenSSL " +"does neither require nor verify certificate revocation lists (CRLs)." +msgstr "" +"证书验证操作的标志位。可以用“或”的方式组合在一起设置 :data:`VERIFY_CRL_CHECK_LEAF` 这类标志。默认情况下,OpenSSL" +" 既不需要也不验证证书吊销列表(CRL)。" + +#: ../../library/ssl.rst:2045 +msgid ":attr:`SSLContext.verify_flags` returns :class:`VerifyFlags` flags:" +msgstr ":attr:`SSLContext.verify_flags` 返回 :class:`VerifyFlags` 旗标:" + +#: ../../library/ssl.rst:2053 +msgid "" +"Whether to try to verify other peers' certificates and how to behave if " +"verification fails. This attribute must be one of :data:`CERT_NONE`, " +":data:`CERT_OPTIONAL` or :data:`CERT_REQUIRED`." +msgstr "" +"是否要尝试验证其他对等方的证书以及如果验证失败应采取何种行为。该属性值必须为 :data:`CERT_NONE`, " +":data:`CERT_OPTIONAL` 或 :data:`CERT_REQUIRED` 之一。" + +#: ../../library/ssl.rst:2057 +msgid ":attr:`SSLContext.verify_mode` returns :class:`VerifyMode` enum:" +msgstr ":attr:`SSLContext.verify_mode` 返回 :class:`VerifyMode` 枚举:" + +#: ../../library/ssl.rst:2065 +msgid "" +"Enables TLS-PSK (pre-shared key) authentication on a client-side connection." +msgstr "在客户端连接上启用 TLS-PSK(预共享密钥)验证。" + +#: ../../library/ssl.rst:2067 ../../library/ssl.rst:2116 +msgid "" +"In general, certificate based authentication should be preferred over this " +"method." +msgstr "一般来说,基于证书的身份验证应当优先于此方法。" + +#: ../../library/ssl.rst:2069 +msgid "" +"The parameter ``callback`` is a callable object with the signature: ``def " +"callback(hint: str | None) -> tuple[str | None, bytes]``. The ``hint`` " +"parameter is an optional identity hint sent by the server. The return value " +"is a tuple in the form (client-identity, psk). Client-identity is an " +"optional string which may be used by the server to select a corresponding " +"PSK for the client. The string must be less than or equal to ``256`` octets " +"when UTF-8 encoded. PSK is a :term:`bytes-like object` representing the pre-" +"shared key. Return a zero length PSK to reject the connection." +msgstr "" +"形参 ``callback`` 是一个签名为 ``def callback(hint: str | None) -> tuple[str | None," +" bytes]`` 的可调用对象。``hint`` 形参是服务器所发送的可选身份标识。返回值是一个 (client-identity, psk) " +"形式的元组。其中 client-identity 是一个可选的字符串,它可被服务器用来为客户选择相应的 PSK。该字符串在使用 UTF-8 " +"编码时必须小于等于 ``256`` 个八位字节。PSK 是一个代表预共享密钥的 :term:`bytes-like object`。返回一个零长度的 " +"PSK 以拒绝连接。" + +#: ../../library/ssl.rst:2079 ../../library/ssl.rst:2125 +msgid "Setting ``callback`` to :const:`None` removes any existing callback." +msgstr "将 ``callback`` 设为 :const:`None` 将移除任何现有的回调。" + +#: ../../library/ssl.rst:2082 +msgid "When using TLS 1.3:" +msgstr "当使用 TLS 1.3 时:" + +#: ../../library/ssl.rst:2084 +msgid "the ``hint`` parameter is always :const:`None`." +msgstr "``hint`` 形参值将始终为 :const:`None`。" + +#: ../../library/ssl.rst:2085 +msgid "client-identity must be a non-empty string." +msgstr "client-identity 必须是一个非空字符串。" + +#: ../../library/ssl.rst:2087 ../../library/ssl.rst:2134 +msgid "Example usage::" +msgstr "用法示例::" + +#: ../../library/ssl.rst:2089 +msgid "" +"context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)\n" +"context.check_hostname = False\n" +"context.verify_mode = ssl.CERT_NONE\n" +"context.maximum_version = ssl.TLSVersion.TLSv1_2\n" +"context.set_ciphers('PSK')\n" +"\n" +"# A simple lambda:\n" +"psk = bytes.fromhex('c0ffee')\n" +"context.set_psk_client_callback(lambda hint: (None, psk))\n" +"\n" +"# A table using the hint from the server:\n" +"psk_table = { 'ServerId_1': bytes.fromhex('c0ffee'),\n" +" 'ServerId_2': bytes.fromhex('facade')\n" +"}\n" +"def callback(hint):\n" +" return 'ClientId_1', psk_table.get(hint, b'')\n" +"context.set_psk_client_callback(callback)" +msgstr "" +"context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)\n" +"context.check_hostname = False\n" +"context.verify_mode = ssl.CERT_NONE\n" +"context.maximum_version = ssl.TLSVersion.TLSv1_2\n" +"context.set_ciphers('PSK')\n" +"\n" +"# 一个简单的 lambda:\n" +"psk = bytes.fromhex('c0ffee')\n" +"context.set_psk_client_callback(lambda hint: (None, psk))\n" +"\n" +"# 一个使用来自服务器的提示的表:\n" +"psk_table = { 'ServerId_1': bytes.fromhex('c0ffee'),\n" +" 'ServerId_2': bytes.fromhex('facade')\n" +"}\n" +"def callback(hint):\n" +" return 'ClientId_1', psk_table.get(hint, b'')\n" +"context.set_psk_client_callback(callback)" + +#: ../../library/ssl.rst:2107 ../../library/ssl.rst:2152 +msgid "" +"This method will raise :exc:`NotImplementedError` if :data:`HAS_PSK` is " +"``False``." +msgstr "如果 :data:`HAS_PSK` 为 ``False`` 则此方法将引发 :exc:`NotImplementedError`。" + +#: ../../library/ssl.rst:2114 +msgid "" +"Enables TLS-PSK (pre-shared key) authentication on a server-side connection." +msgstr "在服务器端连接上启用 TLS-PSK(预共享密钥验证)。" + +#: ../../library/ssl.rst:2118 +msgid "" +"The parameter ``callback`` is a callable object with the signature: ``def " +"callback(identity: str | None) -> bytes``. The ``identity`` parameter is an " +"optional identity sent by the client which can be used to select a " +"corresponding PSK. The return value is a :term:`bytes-like object` " +"representing the pre-shared key. Return a zero length PSK to reject the " +"connection." +msgstr "" +"形参 ``callback`` 是一个签名为 ``def callback(identity: str | None) -> bytes`` " +"的可调用对象。``identity`` 形参是客户端所发送的可选身份标识,可用于选择相应的 PSK。返回值是一个代表预共享密钥的 " +":term:`bytes-like object`。返回一个零长度的 PSK 以拒绝连接。" + +#: ../../library/ssl.rst:2127 +msgid "" +"The parameter ``identity_hint`` is an optional identity hint string sent to " +"the client. The string must be less than or equal to ``256`` octets when " +"UTF-8 encoded." +msgstr "" +"形参 ``identity_hint`` 是发送给客户端的可选身份标识字符串。该字符串在使用 UTF-8 编码时必须小于等于 ``256`` " +"个八位字节。" + +#: ../../library/ssl.rst:2132 +msgid "" +"When using TLS 1.3 the ``identity_hint`` parameter is not sent to the " +"client." +msgstr "当使用 TLS 1.3 时 ``identity_hint`` 形参将不会被发送给客户端。" + +#: ../../library/ssl.rst:2136 +msgid "" +"context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)\n" +"context.maximum_version = ssl.TLSVersion.TLSv1_2\n" +"context.set_ciphers('PSK')\n" +"\n" +"# A simple lambda:\n" +"psk = bytes.fromhex('c0ffee')\n" +"context.set_psk_server_callback(lambda identity: psk)\n" +"\n" +"# A table using the identity of the client:\n" +"psk_table = { 'ClientId_1': bytes.fromhex('c0ffee'),\n" +" 'ClientId_2': bytes.fromhex('facade')\n" +"}\n" +"def callback(identity):\n" +" return psk_table.get(identity, b'')\n" +"context.set_psk_server_callback(callback, 'ServerId_1')" +msgstr "" +"context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)\n" +"context.maximum_version = ssl.TLSVersion.TLSv1_2\n" +"context.set_ciphers('PSK')\n" +"\n" +"# 一个简单的 lambda:\n" +"psk = bytes.fromhex('c0ffee')\n" +"context.set_psk_server_callback(lambda identity: psk)\n" +"\n" +"# 一个使用客户端标识的表:\n" +"psk_table = { 'ClientId_1': bytes.fromhex('c0ffee'),\n" +" 'ClientId_2': bytes.fromhex('facade')\n" +"}\n" +"def callback(identity):\n" +" return psk_table.get(identity, b'')\n" +"context.set_psk_server_callback(callback, 'ServerId_1')" + +#: ../../library/ssl.rst:2164 +msgid "Certificates" +msgstr "证书" + +#: ../../library/ssl.rst:2166 +msgid "" +"Certificates in general are part of a public-key / private-key system. In " +"this system, each *principal*, (which may be a machine, or a person, or an " +"organization) is assigned a unique two-part encryption key. One part of the" +" key is public, and is called the *public key*; the other part is kept " +"secret, and is called the *private key*. The two parts are related, in that" +" if you encrypt a message with one of the parts, you can decrypt it with the" +" other part, and **only** with the other part." +msgstr "" +"总的来说证书是公钥/私钥系统的一个组成部分。在这个系统中,每 个 *主体* (可能是一台机器、一个人或者一个组织) " +"都会分配到唯一的包含两部分的加密密钥。一部分密钥是公开的,称为 *公钥*;另一部分密钥是保密的,称为 *私钥*。 " +"这两个部分是互相关联的,就是说如果你用其中一个部分来加密一条消息,你将能用并且 **只能** 用另一个部分来解密它。" + +#: ../../library/ssl.rst:2174 +msgid "" +"A certificate contains information about two principals. It contains the " +"name of a *subject*, and the subject's public key. It also contains a " +"statement by a second principal, the *issuer*, that the subject is who they " +"claim to be, and that this is indeed the subject's public key. The issuer's" +" statement is signed with the issuer's private key, which only the issuer " +"knows. However, anyone can verify the issuer's statement by finding the " +"issuer's public key, decrypting the statement with it, and comparing it to " +"the other information in the certificate. The certificate also contains " +"information about the time period over which it is valid. This is expressed" +" as two fields, called \"notBefore\" and \"notAfter\"." +msgstr "" +"在一个证书中包含有两个主体的相关信息。它包含 *目标方* 的名称和目标方的公钥。它还包含由第二个主体 *颁发方* " +"所发布的声明:目标方的身份与他们所宣称的一致,包含的公钥也确实是目标方的公钥。颁发方的声明使用颁发方的私钥进行签名,该私钥的内容只有颁发方自己才知道。 " +"但是,任何人都可以找到颁发方的公钥,用它来解密这个声明,并将其与证书中的其他信息进行比较来验证颁发方声明的真实性。证书还包含有关其有效期限的信息。 " +"这被表示为两个字段,即 \"notBefore\" 和 \"notAfter\"。" + +#: ../../library/ssl.rst:2184 +msgid "" +"In the Python use of certificates, a client or server can use a certificate " +"to prove who they are. The other side of a network connection can also be " +"required to produce a certificate, and that certificate can be validated to " +"the satisfaction of the client or server that requires such validation. The" +" connection attempt can be set to raise an exception if the validation " +"fails. Validation is done automatically, by the underlying OpenSSL " +"framework; the application need not concern itself with its mechanics. But " +"the application does usually need to provide sets of certificates to allow " +"this process to take place." +msgstr "" +"在 Python 中应用证书时,客户端或服务器可以用证书来证明自己的身份。 " +"还可以要求网络连接的另一方提供证书,提供的证书可以用于验证以满足客户端或服务器的验证要求。如果验证失败,连接尝试可被设置为引发一个异常。 验证是由下层的" +" OpenSSL 框架来自动执行的;应用程序本身不必关注其内部的机制。但是应用程序通常需要提供一组证书以允许此过程的发生。" + +#: ../../library/ssl.rst:2194 +msgid "" +"Python uses files to contain certificates. They should be formatted as " +"\"PEM\" (see :rfc:`1422`), which is a base-64 encoded form wrapped with a " +"header line and a footer line::" +msgstr "Python 使用文件来包含证书。它们应当采用 \\编码包装形式::" + +#: ../../library/ssl.rst:2198 +msgid "" +"-----BEGIN CERTIFICATE-----\n" +"... (certificate in base64 PEM encoding) ...\n" +"-----END CERTIFICATE-----" +msgstr "" +"-----BEGIN CERTIFICATE-----\n" +"... (使用 base64 PEM 编码的证书) ...\n" +"-----END CERTIFICATE-----" + +#: ../../library/ssl.rst:2203 +msgid "Certificate chains" +msgstr "证书链" + +#: ../../library/ssl.rst:2205 +msgid "" +"The Python files which contain certificates can contain a sequence of " +"certificates, sometimes called a *certificate chain*. This chain should " +"start with the specific certificate for the principal who \"is\" the client " +"or server, and then the certificate for the issuer of that certificate, and " +"then the certificate for the issuer of *that* certificate, and so on up the " +"chain till you get to a certificate which is *self-signed*, that is, a " +"certificate which has the same subject and issuer, sometimes called a *root " +"certificate*. The certificates should just be concatenated together in the " +"certificate file. For example, suppose we had a three certificate chain, " +"from our server certificate to the certificate of the certification " +"authority that signed our server certificate, to the root certificate of the" +" agency which issued the certification authority's certificate::" +msgstr "" +"包含证书的 Python 文件可以包含一系列的证书,有时被称为 *证书链*。这个证书链应当以 " +"\\客户端或服务器的主体的专属证书打头,然后是证书颁发方的证书,然后是 *上述* 证书的颁发方的证书,证书链就这样不断上溯直到你得到一个 *自签名* " +"的证书,即具有相同目标方和颁发方的证书,有时也称为 *根证书*。在证书文件中这些证书应当被拼接为一体。 " +"例如,假设我们有一个包含三个证书的证书链,以我们的服务器证书打头,然后是为我们的服务器证书签名的证书颁发机构的证书,最后是为证书颁发机构的证书颁发证书的机构的根证书::" + +#: ../../library/ssl.rst:2218 +msgid "" +"-----BEGIN CERTIFICATE-----\n" +"... (certificate for your server)...\n" +"-----END CERTIFICATE-----\n" +"-----BEGIN CERTIFICATE-----\n" +"... (the certificate for the CA)...\n" +"-----END CERTIFICATE-----\n" +"-----BEGIN CERTIFICATE-----\n" +"... (the root certificate for the CA's issuer)...\n" +"-----END CERTIFICATE-----" +msgstr "" +"-----BEGIN CERTIFICATE-----\n" +"... (你的服务器的证书)...\n" +"-----END CERTIFICATE-----\n" +"-----BEGIN CERTIFICATE-----\n" +"... (CA 的证书)...\n" +"-----END CERTIFICATE-----\n" +"-----BEGIN CERTIFICATE-----\n" +"... (CA 的颁发者的根证书)...\n" +"-----END CERTIFICATE-----" + +#: ../../library/ssl.rst:2229 +msgid "CA certificates" +msgstr "CA 证书" + +#: ../../library/ssl.rst:2231 +msgid "" +"If you are going to require validation of the other side of the connection's" +" certificate, you need to provide a \"CA certs\" file, filled with the " +"certificate chains for each issuer you are willing to trust. Again, this " +"file just contains these chains concatenated together. For validation, " +"Python will use the first chain it finds in the file which matches. The " +"platform's certificates file can be used by calling " +":meth:`SSLContext.load_default_certs`, this is done automatically with " +":func:`.create_default_context`." +msgstr "" +"如果你想要求对连接的另一方的证书进行验证,你必须提供一个 \"CA 证书\" 文件,其中包含了你愿意信任的每个颁发方的证书链。 " +"同样地,这个文件的内容就是这些证书链拼接在一起的结果。为了进行验证,Python 将使用它在文件中找到的第一个匹配的证书链。可以通过调用 " +":meth:`SSLContext.load_default_certs` 来使用系统平台的证书文件,这可以由 " +":func:`.create_default_context` 自动完成。" + +#: ../../library/ssl.rst:2240 +msgid "Combined key and certificate" +msgstr "合并的密钥和证书" + +#: ../../library/ssl.rst:2242 +msgid "" +"Often the private key is stored in the same file as the certificate; in this" +" case, only the ``certfile`` parameter to :meth:`SSLContext.load_cert_chain`" +" needs to be passed. If the private key is stored with the certificate, it " +"should come before the first certificate in the certificate chain::" +msgstr "" +"私钥往往与证书存储在相同的文件中;在此情况下,只需要将 ``certfile`` 形参传给 " +":meth:`SSLContext.load_cert_chain`。如果私钥是与证书一起存储的,则它应当放在证书链的第一个证书之前::" + +#: ../../library/ssl.rst:2248 +msgid "" +"-----BEGIN RSA PRIVATE KEY-----\n" +"... (private key in base64 encoding) ...\n" +"-----END RSA PRIVATE KEY-----\n" +"-----BEGIN CERTIFICATE-----\n" +"... (certificate in base64 PEM encoding) ...\n" +"-----END CERTIFICATE-----" +msgstr "" +"-----BEGIN RSA PRIVATE KEY-----\n" +"... (使用 base64 编码格式的私钥) ...\n" +"-----END RSA PRIVATE KEY-----\n" +"-----BEGIN CERTIFICATE-----\n" +"... (使用 base64 PEM 编码格式的证书) ...\n" +"-----END CERTIFICATE-----" + +#: ../../library/ssl.rst:2256 +msgid "Self-signed certificates" +msgstr "自签名证书" + +#: ../../library/ssl.rst:2258 +msgid "" +"If you are going to create a server that provides SSL-encrypted connection " +"services, you will need to acquire a certificate for that service. There " +"are many ways of acquiring appropriate certificates, such as buying one from" +" a certification authority. Another common practice is to generate a self-" +"signed certificate. The simplest way to do this is with the OpenSSL " +"package, using something like the following::" +msgstr "" +"如果你准备创建一个提供 SSL 加密连接服务的服务器,你需要为该服务获取一份证书。有许多方式可以获取合适的证书,例如从证书颁发机构购买。 " +"另一种常见做法是生成自签名证书。生成自签名证书的最简单方式是使用 OpenSSL 软件包,代码如下所示::" + +#: ../../library/ssl.rst:2265 +msgid "" +"% openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout cert.pem\n" +"Generating a 1024 bit RSA private key\n" +".......++++++\n" +".............................++++++\n" +"writing new private key to 'cert.pem'\n" +"-----\n" +"You are about to be asked to enter information that will be incorporated\n" +"into your certificate request.\n" +"What you are about to enter is what is called a Distinguished Name or a DN.\n" +"There are quite a few fields but you can leave some blank\n" +"For some fields there will be a default value,\n" +"If you enter '.', the field will be left blank.\n" +"-----\n" +"Country Name (2 letter code) [AU]:US\n" +"State or Province Name (full name) [Some-State]:MyState\n" +"Locality Name (eg, city) []:Some City\n" +"Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Organization, Inc.\n" +"Organizational Unit Name (eg, section) []:My Group\n" +"Common Name (eg, YOUR name) []:myserver.mygroup.myorganization.com\n" +"Email Address []:ops@myserver.mygroup.myorganization.com\n" +"%" +msgstr "" +"% openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout cert.pem\n" +"Generating a 1024 bit RSA private key\n" +".......++++++\n" +".............................++++++\n" +"writing new private key to 'cert.pem'\n" +"-----\n" +"You are about to be asked to enter information that will be incorporated\n" +"into your certificate request.\n" +"What you are about to enter is what is called a Distinguished Name or a DN.\n" +"There are quite a few fields but you can leave some blank\n" +"For some fields there will be a default value,\n" +"If you enter '.', the field will be left blank.\n" +"-----\n" +"Country Name (2 letter code) [AU]:US\n" +"State or Province Name (full name) [Some-State]:MyState\n" +"Locality Name (eg, city) []:Some City\n" +"Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Organization, Inc.\n" +"Organizational Unit Name (eg, section) []:My Group\n" +"Common Name (eg, YOUR name) []:myserver.mygroup.myorganization.com\n" +"Email Address []:ops@myserver.mygroup.myorganization.com\n" +"%" + +#: ../../library/ssl.rst:2287 +msgid "" +"The disadvantage of a self-signed certificate is that it is its own root " +"certificate, and no one else will have it in their cache of known (and " +"trusted) root certificates." +msgstr "自签名证书的缺点在于它是它自身的根证书,因此不会存在于别人的已知(且信任的)根证书缓存当中。" + +#: ../../library/ssl.rst:2293 +msgid "Examples" +msgstr "例子" + +#: ../../library/ssl.rst:2296 +msgid "Testing for SSL support" +msgstr "检测 SSL 支持" + +#: ../../library/ssl.rst:2298 +msgid "" +"To test for the presence of SSL support in a Python installation, user code " +"should use the following idiom::" +msgstr "要检测一个 Python 安装版中是否带有 SSL 支持,用户代码应当使用以下例程::" + +#: ../../library/ssl.rst:2301 +msgid "" +"try:\n" +" import ssl\n" +"except ImportError:\n" +" pass\n" +"else:\n" +" ... # do something that requires SSL support" +msgstr "" +"try:\n" +" import ssl\n" +"except ImportError:\n" +" pass\n" +"else:\n" +" ... # 执行需要 SSL 支持的操作" + +#: ../../library/ssl.rst:2309 +msgid "Client-side operation" +msgstr "客户端操作" + +#: ../../library/ssl.rst:2311 +msgid "" +"This example creates a SSL context with the recommended security settings " +"for client sockets, including automatic certificate verification::" +msgstr "这个例子创建了一个 SSL 上下文并使用客户端套接字的推荐安全设置,包括自动证书验证::" + +#: ../../library/ssl.rst:2314 +msgid ">>> context = ssl.create_default_context()" +msgstr ">>> context = ssl.create_default_context()" + +#: ../../library/ssl.rst:2316 +msgid "" +"If you prefer to tune security settings yourself, you might create a context" +" from scratch (but beware that you might not get the settings right)::" +msgstr "如果你喜欢自行调整安全设置,你可能需要从头创建一个上下文(但是请注意避免不正确的设置)::" + +#: ../../library/ssl.rst:2320 +msgid "" +">>> context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)\n" +">>> context.load_verify_locations(\"/etc/ssl/certs/ca-bundle.crt\")" +msgstr "" +">>> context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)\n" +">>> context.load_verify_locations(\"/etc/ssl/certs/ca-bundle.crt\")" + +#: ../../library/ssl.rst:2323 +msgid "" +"(this snippet assumes your operating system places a bundle of all CA " +"certificates in ``/etc/ssl/certs/ca-bundle.crt``; if not, you'll get an " +"error and have to adjust the location)" +msgstr "" +"(这段代码假定你的操作系统将所有 CA 证书打包存放于 ``/etc/ssl/certs/ca-" +"bundle.crt``;如果不是这样,你将收到报错信息,必须修改此位置)" + +#: ../../library/ssl.rst:2327 +msgid "" +"The :data:`PROTOCOL_TLS_CLIENT` protocol configures the context for cert " +"validation and hostname verification. :attr:`~SSLContext.verify_mode` is set" +" to :data:`CERT_REQUIRED` and :attr:`~SSLContext.check_hostname` is set to " +"``True``. All other protocols create SSL contexts with insecure defaults." +msgstr "" +":data:`PROTOCOL_TLS_CLIENT` 协议配置用于证书验证和主机名验证的上下文。 " +":attr:`~SSLContext.verify_mode` 设为 :data:`CERT_REQUIRED` 而 " +":attr:`~SSLContext.check_hostname` 设为 ``True``。所有其他协议都会使用不安全的默认值创建 SSL 上下文。" + +#: ../../library/ssl.rst:2332 +msgid "" +"When you use the context to connect to a server, :const:`CERT_REQUIRED` and " +":attr:`~SSLContext.check_hostname` validate the server certificate: it " +"ensures that the server certificate was signed with one of the CA " +"certificates, checks the signature for correctness, and verifies other " +"properties like validity and identity of the hostname::" +msgstr "" +"当你使用此上下文去连接服务器时,:const:`CERT_REQUIRED` 和 :attr:`~SSLContext.check_hostname` " +"会验证服务器证书;它将确认服务器证书使用了某个 CA 证书进行签名,检查签名是否正确,并验证其他属性例如主机名的有效性和身份真实性::" + +#: ../../library/ssl.rst:2338 +msgid "" +">>> conn = context.wrap_socket(socket.socket(socket.AF_INET),\n" +"... server_hostname=\"www.python.org\")\n" +">>> conn.connect((\"www.python.org\", 443))" +msgstr "" +">>> conn = context.wrap_socket(socket.socket(socket.AF_INET),\n" +"... server_hostname=\"www.python.org\")\n" +">>> conn.connect((\"www.python.org\", 443))" + +#: ../../library/ssl.rst:2342 +msgid "You may then fetch the certificate::" +msgstr "你可以随后获取该证书::" + +#: ../../library/ssl.rst:2344 +msgid ">>> cert = conn.getpeercert()" +msgstr ">>> cert = conn.getpeercert()" + +#: ../../library/ssl.rst:2346 +msgid "" +"Visual inspection shows that the certificate does identify the desired " +"service (that is, the HTTPS host ``www.python.org``)::" +msgstr "可视化检查显示证书能够证明目标服务 (即 HTTPS 主机 ``www.python.org``) 的身份::" + +#: ../../library/ssl.rst:2349 +msgid "" +">>> pprint.pprint(cert)\n" +"{'OCSP': ('http://ocsp.digicert.com',),\n" +" 'caIssuers': ('http://cacerts.digicert.com/DigiCertSHA2ExtendedValidationServerCA.crt',),\n" +" 'crlDistributionPoints': ('http://crl3.digicert.com/sha2-ev-server-g1.crl',\n" +" 'http://crl4.digicert.com/sha2-ev-server-g1.crl'),\n" +" 'issuer': ((('countryName', 'US'),),\n" +" (('organizationName', 'DigiCert Inc'),),\n" +" (('organizationalUnitName', 'www.digicert.com'),),\n" +" (('commonName', 'DigiCert SHA2 Extended Validation Server CA'),)),\n" +" 'notAfter': 'Sep 9 12:00:00 2016 GMT',\n" +" 'notBefore': 'Sep 5 00:00:00 2014 GMT',\n" +" 'serialNumber': '01BB6F00122B177F36CAB49CEA8B6B26',\n" +" 'subject': ((('businessCategory', 'Private Organization'),),\n" +" (('1.3.6.1.4.1.311.60.2.1.3', 'US'),),\n" +" (('1.3.6.1.4.1.311.60.2.1.2', 'Delaware'),),\n" +" (('serialNumber', '3359300'),),\n" +" (('streetAddress', '16 Allen Rd'),),\n" +" (('postalCode', '03894-4801'),),\n" +" (('countryName', 'US'),),\n" +" (('stateOrProvinceName', 'NH'),),\n" +" (('localityName', 'Wolfeboro'),),\n" +" (('organizationName', 'Python Software Foundation'),),\n" +" (('commonName', 'www.python.org'),)),\n" +" 'subjectAltName': (('DNS', 'www.python.org'),\n" +" ('DNS', 'python.org'),\n" +" ('DNS', 'pypi.org'),\n" +" ('DNS', 'docs.python.org'),\n" +" ('DNS', 'testpypi.org'),\n" +" ('DNS', 'bugs.python.org'),\n" +" ('DNS', 'wiki.python.org'),\n" +" ('DNS', 'hg.python.org'),\n" +" ('DNS', 'mail.python.org'),\n" +" ('DNS', 'packaging.python.org'),\n" +" ('DNS', 'pythonhosted.org'),\n" +" ('DNS', 'www.pythonhosted.org'),\n" +" ('DNS', 'test.pythonhosted.org'),\n" +" ('DNS', 'us.pycon.org'),\n" +" ('DNS', 'id.python.org')),\n" +" 'version': 3}" +msgstr "" +">>> pprint.pprint(cert)\n" +"{'OCSP': ('http://ocsp.digicert.com',),\n" +" 'caIssuers': ('http://cacerts.digicert.com/DigiCertSHA2ExtendedValidationServerCA.crt',),\n" +" 'crlDistributionPoints': ('http://crl3.digicert.com/sha2-ev-server-g1.crl',\n" +" 'http://crl4.digicert.com/sha2-ev-server-g1.crl'),\n" +" 'issuer': ((('countryName', 'US'),),\n" +" (('organizationName', 'DigiCert Inc'),),\n" +" (('organizationalUnitName', 'www.digicert.com'),),\n" +" (('commonName', 'DigiCert SHA2 Extended Validation Server CA'),)),\n" +" 'notAfter': 'Sep 9 12:00:00 2016 GMT',\n" +" 'notBefore': 'Sep 5 00:00:00 2014 GMT',\n" +" 'serialNumber': '01BB6F00122B177F36CAB49CEA8B6B26',\n" +" 'subject': ((('businessCategory', 'Private Organization'),),\n" +" (('1.3.6.1.4.1.311.60.2.1.3', 'US'),),\n" +" (('1.3.6.1.4.1.311.60.2.1.2', 'Delaware'),),\n" +" (('serialNumber', '3359300'),),\n" +" (('streetAddress', '16 Allen Rd'),),\n" +" (('postalCode', '03894-4801'),),\n" +" (('countryName', 'US'),),\n" +" (('stateOrProvinceName', 'NH'),),\n" +" (('localityName', 'Wolfeboro'),),\n" +" (('organizationName', 'Python Software Foundation'),),\n" +" (('commonName', 'www.python.org'),)),\n" +" 'subjectAltName': (('DNS', 'www.python.org'),\n" +" ('DNS', 'python.org'),\n" +" ('DNS', 'pypi.org'),\n" +" ('DNS', 'docs.python.org'),\n" +" ('DNS', 'testpypi.org'),\n" +" ('DNS', 'bugs.python.org'),\n" +" ('DNS', 'wiki.python.org'),\n" +" ('DNS', 'hg.python.org'),\n" +" ('DNS', 'mail.python.org'),\n" +" ('DNS', 'packaging.python.org'),\n" +" ('DNS', 'pythonhosted.org'),\n" +" ('DNS', 'www.pythonhosted.org'),\n" +" ('DNS', 'test.pythonhosted.org'),\n" +" ('DNS', 'us.pycon.org'),\n" +" ('DNS', 'id.python.org')),\n" +" 'version': 3}" + +#: ../../library/ssl.rst:2389 +msgid "" +"Now the SSL channel is established and the certificate verified, you can " +"proceed to talk with the server::" +msgstr "现在 SSL 通道已建立并已验证了证书,你可以继续与服务器对话了::" + +#: ../../library/ssl.rst:2392 +msgid "" +">>> conn.sendall(b\"HEAD / HTTP/1.0\\r\\nHost: linuxfr.org\\r\\n\\r\\n\")\n" +">>> pprint.pprint(conn.recv(1024).split(b\"\\r\\n\"))\n" +"[b'HTTP/1.1 200 OK',\n" +" b'Date: Sat, 18 Oct 2014 18:27:20 GMT',\n" +" b'Server: nginx',\n" +" b'Content-Type: text/html; charset=utf-8',\n" +" b'X-Frame-Options: SAMEORIGIN',\n" +" b'Content-Length: 45679',\n" +" b'Accept-Ranges: bytes',\n" +" b'Via: 1.1 varnish',\n" +" b'Age: 2188',\n" +" b'X-Served-By: cache-lcy1134-LCY',\n" +" b'X-Cache: HIT',\n" +" b'X-Cache-Hits: 11',\n" +" b'Vary: Cookie',\n" +" b'Strict-Transport-Security: max-age=63072000; includeSubDomains',\n" +" b'Connection: close',\n" +" b'',\n" +" b'']" +msgstr "" +">>> conn.sendall(b\"HEAD / HTTP/1.0\\r\\nHost: linuxfr.org\\r\\n\\r\\n\")\n" +">>> pprint.pprint(conn.recv(1024).split(b\"\\r\\n\"))\n" +"[b'HTTP/1.1 200 OK',\n" +" b'Date: Sat, 18 Oct 2014 18:27:20 GMT',\n" +" b'Server: nginx',\n" +" b'Content-Type: text/html; charset=utf-8',\n" +" b'X-Frame-Options: SAMEORIGIN',\n" +" b'Content-Length: 45679',\n" +" b'Accept-Ranges: bytes',\n" +" b'Via: 1.1 varnish',\n" +" b'Age: 2188',\n" +" b'X-Served-By: cache-lcy1134-LCY',\n" +" b'X-Cache: HIT',\n" +" b'X-Cache-Hits: 11',\n" +" b'Vary: Cookie',\n" +" b'Strict-Transport-Security: max-age=63072000; includeSubDomains',\n" +" b'Connection: close',\n" +" b'',\n" +" b'']" + +#: ../../library/ssl.rst:2416 +msgid "Server-side operation" +msgstr "服务器端操作" + +#: ../../library/ssl.rst:2418 +msgid "" +"For server operation, typically you'll need to have a server certificate, " +"and private key, each in a file. You'll first create a context holding the " +"key and the certificate, so that clients can check your authenticity. Then " +"you'll open a socket, bind it to a port, call :meth:`listen` on it, and " +"start waiting for clients to connect::" +msgstr "" +"对于服务器操作,通常你需要在文件中存放服务器证书和私钥各一份。你将首先创建一个包含密钥和证书的上下文,这样客户端就能检查你的身份真实性。 " +"然后你将打开一个套接字,将其绑定到一个端口,在其上调用 :meth:`listen`,并开始等待客户端连接::" + +#: ../../library/ssl.rst:2424 +msgid "" +"import socket, ssl\n" +"\n" +"context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)\n" +"context.load_cert_chain(certfile=\"mycertfile\", keyfile=\"mykeyfile\")\n" +"\n" +"bindsocket = socket.socket()\n" +"bindsocket.bind(('myaddr.example.com', 10023))\n" +"bindsocket.listen(5)" +msgstr "" +"import socket, ssl\n" +"\n" +"context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)\n" +"context.load_cert_chain(certfile=\"mycertfile\", keyfile=\"mykeyfile\")\n" +"\n" +"bindsocket = socket.socket()\n" +"bindsocket.bind(('myaddr.example.com', 10023))\n" +"bindsocket.listen(5)" + +#: ../../library/ssl.rst:2433 +msgid "" +"When a client connects, you'll call :meth:`accept` on the socket to get the " +"new socket from the other end, and use the context's " +":meth:`SSLContext.wrap_socket` method to create a server-side SSL socket for" +" the connection::" +msgstr "" +"当有客户端连接时,你将在套接字上调用 :meth:`accept` 以从另一端获取新的套接字,并使用上下文的 " +":meth:`SSLContext.wrap_socket` 方法来为连接创建一个服务器端 SSL 套接字::" + +#: ../../library/ssl.rst:2437 +msgid "" +"while True:\n" +" newsocket, fromaddr = bindsocket.accept()\n" +" connstream = context.wrap_socket(newsocket, server_side=True)\n" +" try:\n" +" deal_with_client(connstream)\n" +" finally:\n" +" connstream.shutdown(socket.SHUT_RDWR)\n" +" connstream.close()" +msgstr "" +"while True:\n" +" newsocket, fromaddr = bindsocket.accept()\n" +" connstream = context.wrap_socket(newsocket, server_side=True)\n" +" try:\n" +" deal_with_client(connstream)\n" +" finally:\n" +" connstream.shutdown(socket.SHUT_RDWR)\n" +" connstream.close()" + +#: ../../library/ssl.rst:2446 +msgid "" +"Then you'll read data from the ``connstream`` and do something with it till " +"you are finished with the client (or the client is finished with you)::" +msgstr "随后你将从 ``connstream`` 读取数据并对其进行处理,直至你结束与客户端的会话(或客户端结束与你的会话)::" + +#: ../../library/ssl.rst:2449 +msgid "" +"def deal_with_client(connstream):\n" +" data = connstream.recv(1024)\n" +" # empty data means the client is finished with us\n" +" while data:\n" +" if not do_something(connstream, data):\n" +" # we'll assume do_something returns False\n" +" # when we're finished with client\n" +" break\n" +" data = connstream.recv(1024)\n" +" # finished with client" +msgstr "" +"def deal_with_client(connstream):\n" +" data = connstream.recv(1024)\n" +" # 空数据表明客户端已结束与我们的通信\n" +" while data:\n" +" if not do_something(connstream, data):\n" +" # 我们将假定当我们结束与客户端的通信时\n" +" # do_something 将返回 False\n" +" break\n" +" data = connstream.recv(1024)\n" +" # 结束与客户端的通信" + +#: ../../library/ssl.rst:2460 +msgid "" +"And go back to listening for new client connections (of course, a real " +"server would probably handle each client connection in a separate thread, or" +" put the sockets in :ref:`non-blocking mode ` and use an " +"event loop)." +msgstr "" +"并返回至监听新的客户端连接(当然,真正的服务器应当会在单独的线程中处理每个客户端连接,或者将套接字设为 :ref:`非阻塞模式 ` 并使用事件循环)。" + +#: ../../library/ssl.rst:2468 +msgid "Notes on non-blocking sockets" +msgstr "关于非阻塞套接字的说明" + +#: ../../library/ssl.rst:2470 +msgid "" +"SSL sockets behave slightly different than regular sockets in non-blocking " +"mode. When working with non-blocking sockets, there are thus several things " +"you need to be aware of:" +msgstr "在非阻塞模式下 SSL 套接字的行为与常规套接字略有不同。当使用非阻塞模式时,你需要注意下面这些事情:" + +#: ../../library/ssl.rst:2474 +msgid "" +"Most :class:`SSLSocket` methods will raise either :exc:`SSLWantWriteError` " +"or :exc:`SSLWantReadError` instead of :exc:`BlockingIOError` if an I/O " +"operation would block. :exc:`SSLWantReadError` will be raised if a read " +"operation on the underlying socket is necessary, and " +":exc:`SSLWantWriteError` for a write operation on the underlying socket. " +"Note that attempts to *write* to an SSL socket may require *reading* from " +"the underlying socket first, and attempts to *read* from the SSL socket may " +"require a prior *write* to the underlying socket." +msgstr "" +"如果一个 I/O 操作会阻塞,大多数 :class:`SSLSocket` 方法都将引发 :exc:`SSLWantWriteError` 或 " +":exc:`SSLWantReadError` 而非 :exc:`BlockingIOError`。如果有必要在下层套接字上执行读取操作将引发 " +":exc:`SSLWantReadError`,在下层套接字上执行写入操作则将引发 :exc:`SSLWantWriteError`。请注意尝试 " +"*写入* 到 SSL 套接字可能需要先从下层套接字 *读取*,而尝试从 SSL 套接字 *读取* 则可能需要先向下层套接字 *写入*。" + +#: ../../library/ssl.rst:2486 +msgid "" +"In earlier Python versions, the :meth:`!SSLSocket.send` method returned zero" +" instead of raising :exc:`SSLWantWriteError` or :exc:`SSLWantReadError`." +msgstr "" +"在较早的 Python 版本中,:meth:`!SSLSocket.send` 方法会返回零值而非引发 :exc:`SSLWantWriteError`" +" 或 :exc:`SSLWantReadError`。" + +#: ../../library/ssl.rst:2490 +msgid "" +"Calling :func:`~select.select` tells you that the OS-level socket can be " +"read from (or written to), but it does not imply that there is sufficient " +"data at the upper SSL layer. For example, only part of an SSL frame might " +"have arrived. Therefore, you must be ready to handle :meth:`SSLSocket.recv`" +" and :meth:`SSLSocket.send` failures, and retry after another call to " +":func:`~select.select`." +msgstr "" +"调用 :func:`~select.select` 将告诉你可以从 OS 层级的套接字读取(或向其写入),但这并不意味着在上面的 SSL " +"层有足够的数据。例如,可能只有部分 SSL 帧已经到达。因此,你必须准备好处理 :meth:`SSLSocket.recv` 和 " +":meth:`SSLSocket.send` 失败的情况,并在再次调用 :func:`~select.select` 之后重新尝试。" + +#: ../../library/ssl.rst:2497 +msgid "" +"Conversely, since the SSL layer has its own framing, a SSL socket may still " +"have data available for reading without :func:`~select.select` being aware " +"of it. Therefore, you should first call :meth:`SSLSocket.recv` to drain any" +" potentially available data, and then only block on a :func:`~select.select`" +" call if still necessary." +msgstr "" +"相反地,由于 SSL 层具有自己的帧机制,一个 SSL 套接字可能仍有可读取的数据而 :func:`~select.select` 并不知道这一点。 " +"因此,你应当先调用 :meth:`SSLSocket.recv` 取走所有潜在的可用数据,然后只在必要时对 :func:`~select.select`" +" 调用执行阻塞。" + +#: ../../library/ssl.rst:2503 +msgid "" +"(of course, similar provisions apply when using other primitives such as " +":func:`~select.poll`, or those in the :mod:`selectors` module)" +msgstr "" +"(当然,类似的保留规则在使用其他原语例如 :func:`~select.poll`,或 :mod:`selectors` 模块中的原语时也适用)" + +#: ../../library/ssl.rst:2506 +msgid "" +"The SSL handshake itself will be non-blocking: the " +":meth:`SSLSocket.do_handshake` method has to be retried until it returns " +"successfully. Here is a synopsis using :func:`~select.select` to wait for " +"the socket's readiness::" +msgstr "" +"SSL 握手本身将是非阻塞的::meth:`SSLSocket.do_handshake` 方法必须不断重试直至其成功返回。下面是一个使用 " +":func:`~select.select` 来等待套接字就绪的简短例子::" + +#: ../../library/ssl.rst:2511 +msgid "" +"while True:\n" +" try:\n" +" sock.do_handshake()\n" +" break\n" +" except ssl.SSLWantReadError:\n" +" select.select([sock], [], [])\n" +" except ssl.SSLWantWriteError:\n" +" select.select([], [sock], [])" +msgstr "" +"while True:\n" +" try:\n" +" sock.do_handshake()\n" +" break\n" +" except ssl.SSLWantReadError:\n" +" select.select([sock], [], [])\n" +" except ssl.SSLWantWriteError:\n" +" select.select([], [sock], [])" + +#: ../../library/ssl.rst:2522 +msgid "" +"The :mod:`asyncio` module supports :ref:`non-blocking SSL sockets ` and provides a higher level :ref:`Streams API `. It polls for events using the :mod:`selectors` module and handles" +" :exc:`SSLWantWriteError`, :exc:`SSLWantReadError` and " +":exc:`BlockingIOError` exceptions. It runs the SSL handshake asynchronously " +"as well." +msgstr "" +":mod:`asyncio` 模块支持 :ref:`非阻塞 SSL 套接字 ` 并提供了更高层级的 :ref:`流 " +"API `。它会使用 :mod:`selectors` 模块来轮询事件并处理 " +":exc:`SSLWantWriteError`, :exc:`SSLWantReadError` 和 :exc:`BlockingIOError` " +"等异常。它还会异步地执行 SSL 握手。" + +#: ../../library/ssl.rst:2531 +msgid "Memory BIO support" +msgstr "" + +#: ../../library/ssl.rst:2535 +msgid "" +"Ever since the SSL module was introduced in Python 2.6, the " +":class:`SSLSocket` class has provided two related but distinct areas of " +"functionality:" +msgstr "自从 SSL 模块在 Python 2.6 起被引入之后,:class:`SSLSocket` 类提供了两个互相关联但彼此独立的功能分块:" + +#: ../../library/ssl.rst:2538 +msgid "SSL protocol handling" +msgstr "SSL 协议处理" + +#: ../../library/ssl.rst:2539 +msgid "Network IO" +msgstr "网络 IO" + +#: ../../library/ssl.rst:2541 +msgid "" +"The network IO API is identical to that provided by :class:`socket.socket`, " +"from which :class:`SSLSocket` also inherits. This allows an SSL socket to be" +" used as a drop-in replacement for a regular socket, making it very easy to " +"add SSL support to an existing application." +msgstr "" +"网络 IO API 与 :class:`socket.socket` 所提供的功能一致,:class:`SSLSocket` 也是从那里继承而来的。 " +"这允许 SSL 套接字被用作常规套接字的替代,使得向现有应用程序添加 SSL 支持变得非常容易。" + +#: ../../library/ssl.rst:2546 +msgid "" +"Combining SSL protocol handling and network IO usually works well, but there" +" are some cases where it doesn't. An example is async IO frameworks that " +"want to use a different IO multiplexing model than the \"select/poll on a " +"file descriptor\" (readiness based) model that is assumed by " +":class:`socket.socket` and by the internal OpenSSL socket IO routines. This " +"is mostly relevant for platforms like Windows where this model is not " +"efficient. For this purpose, a reduced scope variant of :class:`SSLSocket` " +"called :class:`SSLObject` is provided." +msgstr "" +"将 SSL 协议处理与网络 IO 结合使用通常都能运行良好,但在某些情况下则不能。此情况的一个例子是 async IO 框架,该框架要使用不同的 IO " +"多路复用模型而非 (基于就绪状态的) \"在文件描述器上执行选择/轮询\" 模型,该模型是 :class:`socket.socket` 和内部 " +"OpenSSL 套接字 IO 例程正常运行的假设前提。这种情况在该模型效率不高的 Windows 平台上最为常见。为此还提供了一个 " +":class:`SSLSocket` 的简化形式,称为 :class:`SSLObject`。" + +#: ../../library/ssl.rst:2557 +msgid "" +"A reduced-scope variant of :class:`SSLSocket` representing an SSL protocol " +"instance that does not contain any network IO methods. This class is " +"typically used by framework authors that want to implement asynchronous IO " +"for SSL through memory buffers." +msgstr "" +":class:`SSLSocket` 的简化形式,表示一个不包含任何网络 IO 方法的 SSL 协议实例。这个类通常由想要通过内存缓冲区为 SSL " +"实现异步 IO 的框架作者来使用。" + +#: ../../library/ssl.rst:2562 +msgid "" +"This class implements an interface on top of a low-level SSL object as " +"implemented by OpenSSL. This object captures the state of an SSL connection " +"but does not provide any network IO itself. IO needs to be performed through" +" separate \"BIO\" objects which are OpenSSL's IO abstraction layer." +msgstr "" +"这个类在低层级 SSL 对象上实现了一个接口,与 OpenSSL 所实现的类似。此对象会捕获 SSL 连接的状态但其本身不提供任何网络 IO。IO " +"需要通过单独的 \"BIO\" 对象来执行,该对象是 OpenSSL 的 IO 抽象层。" + +#: ../../library/ssl.rst:2567 +msgid "" +"This class has no public constructor. An :class:`SSLObject` instance must " +"be created using the :meth:`~SSLContext.wrap_bio` method. This method will " +"create the :class:`SSLObject` instance and bind it to a pair of BIOs. The " +"*incoming* BIO is used to pass data from Python to the SSL protocol " +"instance, while the *outgoing* BIO is used to pass data the other way " +"around." +msgstr "" +"这个类没有公有构造器。 :class:`SSLObject` 实例必须使用 :meth:`~SSLContext.wrap_bio` 方法来创建。 " +"此方法将创建 :class:`SSLObject` 实例并将其绑定到一个 BIO 对。其中 *incoming* BIO 用来将数据从 Python " +"传递到 SSL 协议实例,而 *outgoing* BIO 用来进行数据反向传递。" + +#: ../../library/ssl.rst:2574 +msgid "The following methods are available:" +msgstr "可以使用以下方法:" + +#: ../../library/ssl.rst:2576 +msgid ":attr:`~SSLSocket.context`" +msgstr ":attr:`~SSLSocket.context`" + +#: ../../library/ssl.rst:2577 +msgid ":attr:`~SSLSocket.server_side`" +msgstr ":attr:`~SSLSocket.server_side`" + +#: ../../library/ssl.rst:2578 +msgid ":attr:`~SSLSocket.server_hostname`" +msgstr ":attr:`~SSLSocket.server_hostname`" + +#: ../../library/ssl.rst:2579 +msgid ":attr:`~SSLSocket.session`" +msgstr ":attr:`~SSLSocket.session`" + +#: ../../library/ssl.rst:2580 +msgid ":attr:`~SSLSocket.session_reused`" +msgstr ":attr:`~SSLSocket.session_reused`" + +#: ../../library/ssl.rst:2581 +msgid ":meth:`~SSLSocket.read`" +msgstr ":meth:`~SSLSocket.read`" + +#: ../../library/ssl.rst:2582 +msgid ":meth:`~SSLSocket.write`" +msgstr ":meth:`~SSLSocket.write`" + +#: ../../library/ssl.rst:2583 +msgid ":meth:`~SSLSocket.getpeercert`" +msgstr ":meth:`~SSLSocket.getpeercert`" + +#: ../../library/ssl.rst:2584 +msgid ":meth:`~SSLSocket.get_verified_chain`" +msgstr ":meth:`~SSLSocket.get_verified_chain`" + +#: ../../library/ssl.rst:2585 +msgid ":meth:`~SSLSocket.get_unverified_chain`" +msgstr ":meth:`~SSLSocket.get_unverified_chain`" + +#: ../../library/ssl.rst:2586 +msgid ":meth:`~SSLSocket.selected_alpn_protocol`" +msgstr ":meth:`~SSLSocket.selected_alpn_protocol`" + +#: ../../library/ssl.rst:2587 +msgid ":meth:`~SSLSocket.selected_npn_protocol`" +msgstr ":meth:`~SSLSocket.selected_npn_protocol`" + +#: ../../library/ssl.rst:2588 +msgid ":meth:`~SSLSocket.cipher`" +msgstr ":meth:`~SSLSocket.cipher`" + +#: ../../library/ssl.rst:2589 +msgid ":meth:`~SSLSocket.shared_ciphers`" +msgstr ":meth:`~SSLSocket.shared_ciphers`" + +#: ../../library/ssl.rst:2590 +msgid ":meth:`~SSLSocket.compression`" +msgstr ":meth:`~SSLSocket.compression`" + +#: ../../library/ssl.rst:2591 +msgid ":meth:`~SSLSocket.pending`" +msgstr ":meth:`~SSLSocket.pending`" + +#: ../../library/ssl.rst:2592 +msgid ":meth:`~SSLSocket.do_handshake`" +msgstr ":meth:`~SSLSocket.do_handshake`" + +#: ../../library/ssl.rst:2593 +msgid ":meth:`~SSLSocket.verify_client_post_handshake`" +msgstr ":meth:`~SSLSocket.verify_client_post_handshake`" + +#: ../../library/ssl.rst:2594 +msgid ":meth:`~SSLSocket.unwrap`" +msgstr ":meth:`~SSLSocket.unwrap`" + +#: ../../library/ssl.rst:2595 +msgid ":meth:`~SSLSocket.get_channel_binding`" +msgstr ":meth:`~SSLSocket.get_channel_binding`" + +#: ../../library/ssl.rst:2596 +msgid ":meth:`~SSLSocket.version`" +msgstr ":meth:`~SSLSocket.version`" + +#: ../../library/ssl.rst:2598 +msgid "" +"When compared to :class:`SSLSocket`, this object lacks the following " +"features:" +msgstr "与 :class:`SSLSocket` 相比,此对象缺少下列特性:" + +#: ../../library/ssl.rst:2601 +msgid "" +"Any form of network IO; ``recv()`` and ``send()`` read and write only to the" +" underlying :class:`MemoryBIO` buffers." +msgstr "" +"任何形式的网络 IO; ``recv()`` 和 ``send()`` 仅对下层的 :class:`MemoryBIO` 缓冲区执行读取和写入。" + +#: ../../library/ssl.rst:2604 +msgid "" +"There is no *do_handshake_on_connect* machinery. You must always manually " +"call :meth:`~SSLSocket.do_handshake` to start the handshake." +msgstr "" +"不存在 *do_handshake_on_connect* 机制。你必须总是手动调用 :meth:`~SSLSocket.do_handshake` " +"来开始握手操作。" + +#: ../../library/ssl.rst:2607 +msgid "" +"There is no handling of *suppress_ragged_eofs*. All end-of-file conditions " +"that are in violation of the protocol are reported via the " +":exc:`SSLEOFError` exception." +msgstr "" +"不存在对 *suppress_ragged_eofs* 的处理。所有违反协议的文件结束条件将通过 :exc:`SSLEOFError` 异常来报告。" + +#: ../../library/ssl.rst:2611 +msgid "" +"The method :meth:`~SSLSocket.unwrap` call does not return anything, unlike " +"for an SSL socket where it returns the underlying socket." +msgstr "方法 :meth:`~SSLSocket.unwrap` 的调用不返回任何东西,不会如 SSL 套接字那样返回下层的套接字。" + +#: ../../library/ssl.rst:2614 +msgid "" +"The *server_name_callback* callback passed to " +":meth:`SSLContext.set_servername_callback` will get an :class:`SSLObject` " +"instance instead of a :class:`SSLSocket` instance as its first parameter." +msgstr "" +"*server_name_callback* 回调被传给 :meth:`SSLContext.set_servername_callback` " +"时将获得一个 :class:`SSLObject` 实例而非 :class:`SSLSocket` 实例作为其第一个形参。" + +#: ../../library/ssl.rst:2618 +msgid "Some notes related to the use of :class:`SSLObject`:" +msgstr "有关 :class:`SSLObject` 用法的一些说明:" + +#: ../../library/ssl.rst:2620 +msgid "" +"All IO on an :class:`SSLObject` is :ref:`non-blocking `. " +"This means that for example :meth:`~SSLSocket.read` will raise an " +":exc:`SSLWantReadError` if it needs more data than the incoming BIO has " +"available." +msgstr "" +"在 :class:`SSLObject` 上的所有 IO 都是 :ref:`非阻塞的 `。这意味着例如 " +":meth:`~SSLSocket.read` 在其需要比 incoming BIO 可用的更多数据时将会引发 " +":exc:`SSLWantReadError`." + +#: ../../library/ssl.rst:2625 +msgid "" +":class:`SSLObject` instances must be created with " +":meth:`~SSLContext.wrap_bio`. In earlier versions, it was possible to create" +" instances directly. This was never documented or officially supported." +msgstr "" +":class:`SSLObject` 的实例必须使用 :meth:`~SSLContext.wrap_bio` 来创建。 " +"在较早的版本中,直接创建该实例是可能的。但这从未被写入文档或是被正式支持。" + +#: ../../library/ssl.rst:2631 +msgid "" +"An SSLObject communicates with the outside world using memory buffers. The " +"class :class:`MemoryBIO` provides a memory buffer that can be used for this " +"purpose. It wraps an OpenSSL memory BIO (Basic IO) object:" +msgstr "" +"SSLObject 会使用内存缓冲区与外部世界通信。 :class:`MemoryBIO` 类提供了可被用于此目的的内存缓冲区。它包装了一个 " +"OpenSSL 内存 BIO (Basic IO) 对象:" + +#: ../../library/ssl.rst:2637 +msgid "" +"A memory buffer that can be used to pass data between Python and an SSL " +"protocol instance." +msgstr "一个可被用来在 Python 和 SSL 协议实例之间传递数据的内存缓冲区。" + +#: ../../library/ssl.rst:2642 +msgid "Return the number of bytes currently in the memory buffer." +msgstr "返回当前存在于内存缓冲区的字节数。" + +#: ../../library/ssl.rst:2646 +msgid "" +"A boolean indicating whether the memory BIO is current at the end-of-file " +"position." +msgstr "一个表明内存 BIO 目前是否位于文件末尾的布尔值。" + +#: ../../library/ssl.rst:2651 +msgid "" +"Read up to *n* bytes from the memory buffer. If *n* is not specified or " +"negative, all bytes are returned." +msgstr "从内存缓冲区读取至多 *n* 个字节。如果 *n* 未指定或为负值,则返回全部字节数据。" + +#: ../../library/ssl.rst:2656 +msgid "" +"Write the bytes from *buf* to the memory BIO. The *buf* argument must be an " +"object supporting the buffer protocol." +msgstr "将字节数据从 *buf* 写入到内存 BIO。 *buf* 参数必须为支持缓冲区协议的对象。" + +#: ../../library/ssl.rst:2659 +msgid "" +"The return value is the number of bytes written, which is always equal to " +"the length of *buf*." +msgstr "返回值为写入的字节数,它总是与 *buf* 的长度相等。" + +#: ../../library/ssl.rst:2664 +msgid "" +"Write an EOF marker to the memory BIO. After this method has been called, it" +" is illegal to call :meth:`~MemoryBIO.write`. The attribute :attr:`eof` will" +" become true after all data currently in the buffer has been read." +msgstr "" +"将一个 EOF 标记写入到内存 BIO。在此方法被调用以后,再调用 :meth:`~MemoryBIO.write` 将是非法的。属性 " +":attr:`eof` 在缓冲区当前的所有数据都被读取之后将变为真值。" + +#: ../../library/ssl.rst:2670 +msgid "SSL session" +msgstr "SSL 会话" + +#: ../../library/ssl.rst:2676 +msgid "Session object used by :attr:`~SSLSocket.session`." +msgstr ":attr:`~SSLSocket.session` 所使用的会话对象。" + +#: ../../library/ssl.rst:2688 +msgid "Security considerations" +msgstr "安全考量" + +#: ../../library/ssl.rst:2691 +msgid "Best defaults" +msgstr "最佳默认值" + +#: ../../library/ssl.rst:2693 +msgid "" +"For **client use**, if you don't have any special requirements for your " +"security policy, it is highly recommended that you use the " +":func:`create_default_context` function to create your SSL context. It will " +"load the system's trusted CA certificates, enable certificate validation and" +" hostname checking, and try to choose reasonably secure protocol and cipher " +"settings." +msgstr "" +"针对 **客户端使用**,如果你对于安全策略没有任何特殊要求,则强烈推荐你使用 :func:`create_default_context` " +"函数来创建你的 SSL 上下文。它将加载系统的受信任 CA 证书,启用证书验证和主机名检查,并尝试合理地选择安全的协议和密码设置。" + +#: ../../library/ssl.rst:2700 +msgid "" +"For example, here is how you would use the :class:`smtplib.SMTP` class to " +"create a trusted, secure connection to a SMTP server::" +msgstr "例如,以下演示了你应当如何使用 :class:`smtplib.SMTP` 类来创建指向一个 SMTP 服务器的受信任且安全的连接::" + +#: ../../library/ssl.rst:2703 +msgid "" +">>> import ssl, smtplib\n" +">>> smtp = smtplib.SMTP(\"mail.python.org\", port=587)\n" +">>> context = ssl.create_default_context()\n" +">>> smtp.starttls(context=context)\n" +"(220, b'2.0.0 Ready to start TLS')" +msgstr "" +">>> import ssl, smtplib\n" +">>> smtp = smtplib.SMTP(\"mail.python.org\", port=587)\n" +">>> context = ssl.create_default_context()\n" +">>> smtp.starttls(context=context)\n" +"(220, b'2.0.0 Ready to start TLS')" + +#: ../../library/ssl.rst:2709 +msgid "" +"If a client certificate is needed for the connection, it can be added with " +":meth:`SSLContext.load_cert_chain`." +msgstr "如果连接需要客户端证书,可使用 :meth:`SSLContext.load_cert_chain` 来添加。" + +#: ../../library/ssl.rst:2712 +msgid "" +"By contrast, if you create the SSL context by calling the " +":class:`SSLContext` constructor yourself, it will not have certificate " +"validation nor hostname checking enabled by default. If you do so, please " +"read the paragraphs below to achieve a good security level." +msgstr "" +"作为对比,如果你通过自行调用 :class:`SSLContext` 构造器来创建 SSL 上下文,它默认将不会启用证书验证和主机名检查。 " +"如果你这样做,请阅读下面的段落以达到良好的安全级别。" + +#: ../../library/ssl.rst:2718 +msgid "Manual settings" +msgstr "手动设置" + +#: ../../library/ssl.rst:2721 +msgid "Verifying certificates" +msgstr "验证证书" + +#: ../../library/ssl.rst:2723 +msgid "" +"When calling the :class:`SSLContext` constructor directly, " +":const:`CERT_NONE` is the default. Since it does not authenticate the other" +" peer, it can be insecure, especially in client mode where most of the time " +"you would like to ensure the authenticity of the server you're talking to. " +"Therefore, when in client mode, it is highly recommended to use " +":const:`CERT_REQUIRED`. However, it is in itself not sufficient; you also " +"have to check that the server certificate, which can be obtained by calling " +":meth:`SSLSocket.getpeercert`, matches the desired service. For many " +"protocols and applications, the service can be identified by the hostname. " +"This common check is automatically performed when " +":attr:`SSLContext.check_hostname` is enabled." +msgstr "" +"当直接调用 :class:`SSLContext` 构造器时,默认值为 :const:`CERT_NONE`。 " +"由于它不会验证对端的身份,因而是不安全的,特别是在大部分时间里你都希望能确保与你通信的服务器的可靠性的客户端模式下。 " +"为此,当在客户端模式下,强烈建议使用 :const:`CERT_REQUIRED`。但是,仅靠它本身是不够的;你还必须检查服务器证书,它可通过调用 " +":meth:`SSLSocket.getpeercert` 来获取,确定它与目标服务相匹配。对于许多协议和应用程序来说,服务可通过主机名来进行标识。 " +"这种通用检查会在 :attr:`SSLContext.check_hostname` 已启用时自动执行。" + +#: ../../library/ssl.rst:2735 +msgid "" +"Hostname matchings is now performed by OpenSSL. Python no longer uses " +":func:`!match_hostname`." +msgstr "主机名匹配现在是由 OpenSSL 来进行的。Python 不会再使用 :func:`!match_hostname`。" + +#: ../../library/ssl.rst:2739 +msgid "" +"In server mode, if you want to authenticate your clients using the SSL layer" +" (rather than using a higher-level authentication mechanism), you'll also " +"have to specify :const:`CERT_REQUIRED` and similarly check the client " +"certificate." +msgstr "" +"在服务器模式下,如果你想要使用 SSL 层来验证客户端(而不是使用更高层级的验证机制),你也必须要指定 :const:`CERT_REQUIRED` " +"并以类似方式检查客户端证书。" + +#: ../../library/ssl.rst:2745 +msgid "Protocol versions" +msgstr "协议版本" + +#: ../../library/ssl.rst:2747 +msgid "" +"SSL versions 2 and 3 are considered insecure and are therefore dangerous to " +"use. If you want maximum compatibility between clients and servers, it is " +"recommended to use :const:`PROTOCOL_TLS_CLIENT` or " +":const:`PROTOCOL_TLS_SERVER` as the protocol version. SSLv2 and SSLv3 are " +"disabled by default." +msgstr "" +"SSL 版本 2 和 3 被认为是不安全的因而使用它们会有风险。如果你想要客户端和服务器之间有最大的兼容性,推荐使用 " +":const:`PROTOCOL_TLS_CLIENT` 或 :const:`PROTOCOL_TLS_SERVER` 作为协议版本。SSLv2 和 " +"SSLv3 默认会被禁用。" + +#: ../../library/ssl.rst:2755 +msgid "" +">>> client_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)\n" +">>> client_context.minimum_version = ssl.TLSVersion.TLSv1_2\n" +">>> client_context.maximum_version = ssl.TLSVersion.TLSv1_3" +msgstr "" + +#: ../../library/ssl.rst:2760 +msgid "" +"The SSL client context created above will only allow TLSv1.2 and TLSv1.3 (if" +" supported by your system) connections to a server. " +":const:`PROTOCOL_TLS_CLIENT` implies certificate validation and hostname " +"checks by default. You have to load certificates into the context." +msgstr "" + +#: ../../library/ssl.rst:2767 +msgid "Cipher selection" +msgstr "密码选择" + +#: ../../library/ssl.rst:2769 +msgid "" +"If you have advanced security requirements, fine-tuning of the ciphers " +"enabled when negotiating a SSL session is possible through the " +":meth:`SSLContext.set_ciphers` method. Starting from Python 3.2.3, the ssl " +"module disables certain weak ciphers by default, but you may want to further" +" restrict the cipher choice. Be sure to read OpenSSL's documentation about " +"the `cipher list format " +"`_. If you " +"want to check which ciphers are enabled by a given cipher list, use " +":meth:`SSLContext.get_ciphers` or the ``openssl ciphers`` command on your " +"system." +msgstr "" +"如果你有更高级的安全要求,也可通过 :meth:`SSLContext.set_ciphers` 方法在协商 SSL 会话时对启用的加密进行微调。从 " +"Python 3.2.3 开始,ssl 模块默认禁用了某些较弱的加密,但你还可能希望进一步限制加密选项。请确保仔细阅读有关 `加密列表格式 " +"`_ 的 " +"OpenSSL 文档。如果你想要检查给定的加密列表启用了哪些加密,可以使用 :meth:`SSLContext.get_ciphers` 或你所用系统的" +" ``openssl ciphers`` 命令。" + +#: ../../library/ssl.rst:2780 +msgid "Multi-processing" +msgstr "多进程" + +#: ../../library/ssl.rst:2782 +msgid "" +"If using this module as part of a multi-processed application (using, for " +"example the :mod:`multiprocessing` or :mod:`concurrent.futures` modules), be" +" aware that OpenSSL's internal random number generator does not properly " +"handle forked processes. Applications must change the PRNG state of the " +"parent process if they use any SSL feature with :func:`os.fork`. Any " +"successful call of :func:`~ssl.RAND_add` or :func:`~ssl.RAND_bytes` is " +"sufficient." +msgstr "" +"如果使用此模块作为多进程应用的一部分(例如,使用 :mod:`multiprocessing` 或 :mod:`concurrent.futures` " +"模块),请注意 OpenSSL 的内部随机数字生成器并不能正确处理分叉的进程。应用程序必须修改父进程的 PRNG 状态,如果它们要使用任何包含 " +":func:`os.fork` 的 SSL 特征的话。任何对 :func:`~ssl.RAND_add` 或 " +":func:`~ssl.RAND_bytes` 的成功调用都可以做到这一点。" + +#: ../../library/ssl.rst:2794 +msgid "TLS 1.3" +msgstr "TLS 1.3" + +#: ../../library/ssl.rst:2798 +msgid "" +"The TLS 1.3 protocol behaves slightly differently than previous version of " +"TLS/SSL. Some new TLS 1.3 features are not yet available." +msgstr "TLS 1.3 协议的行为与低版本的 TLS/SSL 略有不同。某些 TLS 1.3 新特性还不可用。" + +#: ../../library/ssl.rst:2801 +msgid "" +"TLS 1.3 uses a disjunct set of cipher suites. All AES-GCM and ChaCha20 " +"cipher suites are enabled by default. The method " +":meth:`SSLContext.set_ciphers` cannot enable or disable any TLS 1.3 ciphers " +"yet, but :meth:`SSLContext.get_ciphers` returns them." +msgstr "" +"TLS 1.3 使用一组不同的加密套件集。默认情况下所有 AES-GCM 和 ChaCha20 加密套件都会被启用。 " +":meth:`SSLContext.set_ciphers` 方法还不能启用或禁用任何 TLS 1.3 加密,但 " +":meth:`SSLContext.get_ciphers` 会返回它们。" + +#: ../../library/ssl.rst:2805 +msgid "" +"Session tickets are no longer sent as part of the initial handshake and are " +"handled differently. :attr:`SSLSocket.session` and :class:`SSLSession` are " +"not compatible with TLS 1.3." +msgstr "" +"会话凭据不再会作为初始握手的组成部分被发送而是以不同的方式来处理。 :attr:`SSLSocket.session` 和 " +":class:`SSLSession` 与 TLS 1.3 不兼容。" + +#: ../../library/ssl.rst:2808 +msgid "" +"Client-side certificates are also no longer verified during the initial " +"handshake. A server can request a certificate at any time. Clients process" +" certificate requests while they send or receive application data from the " +"server." +msgstr "客户端证书在初始握手期间也不会再被验证。服务器可以在任何时候请求证书。客户端会在它们从服务器发送或接收应用数据时处理证书请求。" + +#: ../../library/ssl.rst:2812 +msgid "" +"TLS 1.3 features like early data, deferred TLS client cert request, " +"signature algorithm configuration, and rekeying are not supported yet." +msgstr "早期数据、延迟的 TLS 客户端证书请求、签名算法配置和密钥重生成等 TLS 1.3 特性尚未被支持。" + +#: ../../library/ssl.rst:2818 +msgid "Class :class:`socket.socket`" +msgstr "Class :class:`socket.socket`" + +#: ../../library/ssl.rst:2819 +msgid "Documentation of underlying :mod:`socket` class" +msgstr "下层 :mod:`socket` 类的文档" + +#: ../../library/ssl.rst:2821 +msgid "" +"`SSL/TLS Strong Encryption: An Introduction " +"`_" +msgstr "" +"`SSL/TLS 高强度加密:概述 " +"`_" + +#: ../../library/ssl.rst:2822 +msgid "Intro from the Apache HTTP Server documentation" +msgstr "Apache HTTP Server 文档介绍" + +#: ../../library/ssl.rst:2824 +msgid "" +":rfc:`RFC 1422: Privacy Enhancement for Internet Electronic Mail: Part II: " +"Certificate-Based Key Management <1422>`" +msgstr ":rfc:`RFC 1422: 因特网电子邮件的隐私加强:第二部分:基于证书的密钥管理 <1422>`" + +#: ../../library/ssl.rst:2825 +msgid "Steve Kent" +msgstr "Steve Kent" + +#: ../../library/ssl.rst:2827 +msgid ":rfc:`RFC 4086: Randomness Requirements for Security <4086>`" +msgstr ":rfc:`RFC 4086: 确保安全的随机性要求 <4086>`" + +#: ../../library/ssl.rst:2828 +msgid "Donald E. Eastlake, Jeffrey I. Schiller, Steve Crocker" +msgstr "Donald E. Eastlake, Jeffrey I. Schiller, Steve Crocker" + +#: ../../library/ssl.rst:2830 +msgid "" +":rfc:`RFC 5280: Internet X.509 Public Key Infrastructure Certificate and " +"Certificate Revocation List (CRL) Profile <5280>`" +msgstr ":rfc:`RFC 5280: 互联网 X.509 公钥基础架构证书和证书吊销列表 (CRL) 配置文件 <5280>`" + +#: ../../library/ssl.rst:2831 +msgid "David Cooper et al." +msgstr "David Cooper 等人" + +#: ../../library/ssl.rst:2833 +msgid "" +":rfc:`RFC 5246: The Transport Layer Security (TLS) Protocol Version 1.2 " +"<5246>`" +msgstr ":rfc:`RFC 5246: 传输层安全性 (TLS) 协议版本 1.2 <5246>`" + +#: ../../library/ssl.rst:2834 +msgid "Tim Dierks and Eric Rescorla." +msgstr "Tim Dierks 和 Eric Rescorla。" + +#: ../../library/ssl.rst:2836 +msgid ":rfc:`RFC 6066: Transport Layer Security (TLS) Extensions <6066>`" +msgstr ":rfc:`RFC 6066: 传输层安全性 (TLS) 的扩展 <6066>`" + +#: ../../library/ssl.rst:2837 +msgid "Donald E. Eastlake" +msgstr "Donald E. Eastlake" + +#: ../../library/ssl.rst:2839 +msgid "" +"`IANA TLS: Transport Layer Security (TLS) Parameters " +"`_" +msgstr "" +"`IANA TLS: 传输层安全性 (TLS) 的参数 `_" + +#: ../../library/ssl.rst:2840 +msgid "IANA" +msgstr "IANA" + +#: ../../library/ssl.rst:2842 +msgid "" +":rfc:`RFC 7525: Recommendations for Secure Use of Transport Layer Security " +"(TLS) and Datagram Transport Layer Security (DTLS) <7525>`" +msgstr ":rfc:`RFC 7525: 传输层安全性 (TLS) 和数据报传输层安全性 (DTLS) 的安全使用建议 <7525>`" + +#: ../../library/ssl.rst:2843 +msgid "IETF" +msgstr "IETF" + +#: ../../library/ssl.rst:2845 +msgid "" +"`Mozilla's Server Side TLS recommendations " +"`_" +msgstr "" +"`Mozilla 的服务器端 TLS 建议 `_" + +#: ../../library/ssl.rst:2846 +msgid "Mozilla" +msgstr "Mozilla" + +#: ../../library/ssl.rst:12 +msgid "OpenSSL" +msgstr "OpenSSL" + +#: ../../library/ssl.rst:12 +msgid "(use in module ssl)" +msgstr "(在 ssl 模块中使用)" + +#: ../../library/ssl.rst:14 +msgid "TLS" +msgstr "TLS" + +#: ../../library/ssl.rst:14 +msgid "SSL" +msgstr "SSL" + +#: ../../library/ssl.rst:14 +msgid "Transport Layer Security" +msgstr "Transport Layer Security" + +#: ../../library/ssl.rst:14 +msgid "Secure Sockets Layer" +msgstr "Secure Sockets Layer" + +#: ../../library/ssl.rst:2157 +msgid "certificates" +msgstr "certificates" + +#: ../../library/ssl.rst:2159 +msgid "X509 certificate" +msgstr "X509 证书" diff --git a/library/stat.po b/library/stat.po new file mode 100644 index 0000000000..de6dc7c269 --- /dev/null +++ b/library/stat.po @@ -0,0 +1,535 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/stat.rst:2 +msgid ":mod:`!stat` --- Interpreting :func:`~os.stat` results" +msgstr ":mod:`!stat` --- 解释 :func:`~os.stat` 的结果" + +#: ../../library/stat.rst:10 +msgid "**Source code:** :source:`Lib/stat.py`" +msgstr "**源代码:** :source:`Lib/stat.py`" + +#: ../../library/stat.rst:14 +msgid "" +"The :mod:`!stat` module defines constants and functions for interpreting the" +" results of :func:`os.stat`, :func:`os.fstat` and :func:`os.lstat` (if they " +"exist). For complete details about the :c:func:`stat`, :c:func:`!fstat` and" +" :c:func:`!lstat` calls, consult the documentation for your system." +msgstr "" +":mod:`!stat` 模块定义了一些用于解读 :func:`os.stat`, :func:`os.fstat` 和 " +":func:`os.lstat` (如果它们存在) 输出结果的常量和函数。 有关 :c:func:`stat`, :c:func:`!fstat` 和 " +":c:func:`!lstat` 调用的完整细节,请参阅你的系统文档。" + +#: ../../library/stat.rst:19 +msgid "The stat module is backed by a C implementation." +msgstr "stat 模块是通过 C 实现来支持的。" + +#: ../../library/stat.rst:22 +msgid "" +"The :mod:`!stat` module defines the following functions to test for specific" +" file types:" +msgstr ":mod:`!stat` 模块定义了下列函数来检测特定的文件类型:" + +#: ../../library/stat.rst:28 +msgid "Return non-zero if the mode is from a directory." +msgstr "如果 mode 来自一个目录则返回非零值。" + +#: ../../library/stat.rst:33 +msgid "Return non-zero if the mode is from a character special device file." +msgstr "如果 mode 来自一个字符特殊设备文件则返回非零值。" + +#: ../../library/stat.rst:38 +msgid "Return non-zero if the mode is from a block special device file." +msgstr "如果 mode 来自一个块特殊设备文件则返回非零值。" + +#: ../../library/stat.rst:43 +msgid "Return non-zero if the mode is from a regular file." +msgstr "如果 mode 来自一个常规文件则返回非零值。" + +#: ../../library/stat.rst:48 +msgid "Return non-zero if the mode is from a FIFO (named pipe)." +msgstr "如果 mode 来自一个 FIFO (命名管道) 则返回非零值。" + +#: ../../library/stat.rst:53 +msgid "Return non-zero if the mode is from a symbolic link." +msgstr "如果 mode 来自一个符号链接则返回非零值。" + +#: ../../library/stat.rst:58 +msgid "Return non-zero if the mode is from a socket." +msgstr "如果 mode 来自一个套接字则返回非零值。" + +#: ../../library/stat.rst:62 +msgid "Return non-zero if the mode is from a door." +msgstr "如果 mode 来自一个门则返回非零值。" + +#: ../../library/stat.rst:68 +msgid "Return non-zero if the mode is from an event port." +msgstr "如果 mode 来自一个事件端口则返回非零值。" + +#: ../../library/stat.rst:74 +msgid "Return non-zero if the mode is from a whiteout." +msgstr "如果 mode 来自一个 whiteout 则返回非零值。" + +#: ../../library/stat.rst:78 +msgid "" +"Two additional functions are defined for more general manipulation of the " +"file's mode:" +msgstr "定义了两个附加函数用于对文件模式进行更一般化的操作:" + +#: ../../library/stat.rst:84 +msgid "" +"Return the portion of the file's mode that can be set by :func:`os.chmod`\\ " +"---that is, the file's permission bits, plus the sticky bit, set-group-id, " +"and set-user-id bits (on systems that support them)." +msgstr "" +"返回文件模式中可由 :func:`os.chmod` 进行设置的部分 --- 即文件的 permission 位,加上 sticky 位、set-" +"group-id 以及 set-user-id 位(在支持这些部分的系统上)。" + +#: ../../library/stat.rst:91 +msgid "" +"Return the portion of the file's mode that describes the file type (used by " +"the :func:`!S_IS\\*` functions above)." +msgstr "返回文件模式中描述文件类型的部分(供上面的 :func:`!S_IS\\*` 函数使用)。" + +#: ../../library/stat.rst:94 +msgid "" +"Normally, you would use the :func:`!os.path.is\\*` functions for testing the" +" type of a file; the functions here are useful when you are doing multiple " +"tests of the same file and wish to avoid the overhead of the :c:func:`stat` " +"system call for each test. These are also useful when checking for " +"information about a file that isn't handled by :mod:`os.path`, like the " +"tests for block and character devices." +msgstr "" +"通常,你将使用 :func:`!os.path.is\\*` 函数来检测文件的类型;这里提供的函数在你要对同一文件执行多项检测并且希望避免每项检测的 " +":c:func:`stat` 系统调用的开销时会很有用。这些函数也适用于检测有关未被 :mod:`os.path` 处理的信息,如检测块和字符设备等。" + +#: ../../library/stat.rst:101 +msgid "Example::" +msgstr "示例::" + +#: ../../library/stat.rst:103 +msgid "" +"import os, sys\n" +"from stat import *\n" +"\n" +"def walktree(top, callback):\n" +" '''recursively descend the directory tree rooted at top,\n" +" calling the callback function for each regular file'''\n" +"\n" +" for f in os.listdir(top):\n" +" pathname = os.path.join(top, f)\n" +" mode = os.lstat(pathname).st_mode\n" +" if S_ISDIR(mode):\n" +" # It's a directory, recurse into it\n" +" walktree(pathname, callback)\n" +" elif S_ISREG(mode):\n" +" # It's a file, call the callback function\n" +" callback(pathname)\n" +" else:\n" +" # Unknown file type, print a message\n" +" print('Skipping %s' % pathname)\n" +"\n" +"def visitfile(file):\n" +" print('visiting', file)\n" +"\n" +"if __name__ == '__main__':\n" +" walktree(sys.argv[1], visitfile)" +msgstr "" +"import os, sys\n" +"from stat import *\n" +"\n" +"def walktree(top, callback):\n" +" '''在根位于顶部的目录树中递归地下行,\n" +" 为每个常规文件调用回调函数'''\n" +"\n" +" for f in os.listdir(top):\n" +" pathname = os.path.join(top, f)\n" +" mode = os.lstat(pathname).st_mode\n" +" if S_ISDIR(mode):\n" +" # 是个目录,递归进去\n" +" walktree(pathname, callback)\n" +" elif S_ISREG(mode):\n" +" # 是个文件,调用回调函数\n" +" callback(pathname)\n" +" else:\n" +" # 未知文件类型,打印一条消息\n" +" print('Skipping %s' % pathname)\n" +"\n" +"def visitfile(file):\n" +" print('visiting', file)\n" +"\n" +"if __name__ == '__main__':\n" +" walktree(sys.argv[1], visitfile)" + +#: ../../library/stat.rst:129 +msgid "" +"An additional utility function is provided to convert a file's mode in a " +"human readable string:" +msgstr "另外还提供了一个附加的辅助函数用来将文件模式转换为人类易读的字符串:" + +#: ../../library/stat.rst:134 +msgid "Convert a file's mode to a string of the form '-rwxrwxrwx'." +msgstr "将文件模式转换为 '-rwxrwxrwx' 形式的字符串。" + +#: ../../library/stat.rst:138 +msgid "" +"The function supports :data:`S_IFDOOR`, :data:`S_IFPORT` and " +":data:`S_IFWHT`." +msgstr "此函数支持 :data:`S_IFDOOR`, :data:`S_IFPORT` 和 :data:`S_IFWHT`。" + +#: ../../library/stat.rst:143 +msgid "" +"All the variables below are simply symbolic indexes into the 10-tuple " +"returned by :func:`os.stat`, :func:`os.fstat` or :func:`os.lstat`." +msgstr "" +"以下所有变量是一些简单的符号索引,用于访问 :func:`os.stat`, :func:`os.fstat` 或 :func:`os.lstat` " +"所返回的 10 条目元组。" + +#: ../../library/stat.rst:149 +msgid "Inode protection mode." +msgstr "inode 保护模式。" + +#: ../../library/stat.rst:154 +msgid "Inode number." +msgstr "Inode 号" + +#: ../../library/stat.rst:159 +msgid "Device inode resides on." +msgstr "Inode 所在的设备。" + +#: ../../library/stat.rst:164 +msgid "Number of links to the inode." +msgstr "Inode 拥有的链接数量。" + +#: ../../library/stat.rst:169 +msgid "User id of the owner." +msgstr "所有者的用户 ID。" + +#: ../../library/stat.rst:174 +msgid "Group id of the owner." +msgstr "所有者的用户组 ID。" + +#: ../../library/stat.rst:179 +msgid "" +"Size in bytes of a plain file; amount of data waiting on some special files." +msgstr "以字节为单位的普通文件大小;对于某些特殊文件则是所等待的数据量。" + +#: ../../library/stat.rst:184 +msgid "Time of last access." +msgstr "上次访问的时间。" + +#: ../../library/stat.rst:189 +msgid "Time of last modification." +msgstr "上次修改的时间。" + +#: ../../library/stat.rst:194 +msgid "" +"The \"ctime\" as reported by the operating system. On some systems (like " +"Unix) is the time of the last metadata change, and, on others (like " +"Windows), is the creation time (see platform documentation for details)." +msgstr "" +"。在某些系统上(例如 Unix)是元数据的最后修改时间,而在其他系统上(例如 Windows)则是创建时间(请参阅系统平台的文档了解相关细节)。" + +#: ../../library/stat.rst:198 +msgid "" +"The interpretation of \"file size\" changes according to the file type. For" +" plain files this is the size of the file in bytes. For FIFOs and sockets " +"under most flavors of Unix (including Linux in particular), the \"size\" is " +"the number of bytes waiting to be read at the time of the call to " +":func:`os.stat`, :func:`os.fstat`, or :func:`os.lstat`; this can sometimes " +"be useful, especially for polling one of these special files after a non-" +"blocking open. The meaning of the size field for other character and block " +"devices varies more, depending on the implementation of the underlying " +"system call." +msgstr "" +"对于“文件大小”的解析可因文件类型的不同而变化。对于普通文件就是文件的字节数。对于大部分种类的 Unix(特别包括 Linux)的 FIFO " +"和套接字来说,“大小”则是指在调用 :func:`os.stat`, :func:`os.fstat` 或 :func:`os.lstat` " +"时等待读取的字节数;这在某些时候很有用处,特别是在一个非阻塞的打开后轮询这些特殊文件中的一个时。 " +"其他字符和块设备的文件大小字段的含义还会有更多变化,具体取决于底层系统调用的实现方式。" + +#: ../../library/stat.rst:207 +msgid "" +"The variables below define the flags used in the :data:`ST_MODE` field." +msgstr "以下变量定义了在 :data:`ST_MODE` 字段中使用的旗标。" + +#: ../../library/stat.rst:209 +msgid "" +"Use of the functions above is more portable than use of the first set of " +"flags:" +msgstr "使用上面的函数会比使用第一组旗标更容易移植:" + +#: ../../library/stat.rst:213 +msgid "Socket." +msgstr "套接字。" + +#: ../../library/stat.rst:217 +msgid "Symbolic link." +msgstr "符号链接。" + +#: ../../library/stat.rst:221 +msgid "Regular file." +msgstr "普通文件。" + +#: ../../library/stat.rst:225 +msgid "Block device." +msgstr "块设备。" + +#: ../../library/stat.rst:229 +msgid "Directory." +msgstr "目录。" + +#: ../../library/stat.rst:233 +msgid "Character device." +msgstr "字符设备。" + +#: ../../library/stat.rst:237 +msgid "FIFO." +msgstr "FIFO." + +#: ../../library/stat.rst:241 +msgid "Door." +msgstr "门。" + +#: ../../library/stat.rst:247 +msgid "Event port." +msgstr "事件端口。" + +#: ../../library/stat.rst:253 +msgid "Whiteout." +msgstr "Whiteout." + +#: ../../library/stat.rst:259 +msgid "" +":data:`S_IFDOOR`, :data:`S_IFPORT` or :data:`S_IFWHT` are defined as 0 when " +"the platform does not have support for the file types." +msgstr "" +":data:`S_IFDOOR`, :data:`S_IFPORT` 或 :data:`S_IFWHT` 等文件类型在不受系统平台支持时会被定义为 0。" + +#: ../../library/stat.rst:262 +msgid "" +"The following flags can also be used in the *mode* argument of " +":func:`os.chmod`:" +msgstr "以下旗标还可以在 :func:`os.chmod` 的 *mode* 参数中使用:" + +#: ../../library/stat.rst:266 +msgid "Set UID bit." +msgstr "设置 UID 位。" + +#: ../../library/stat.rst:270 +msgid "" +"Set-group-ID bit. This bit has several special uses. For a directory it " +"indicates that BSD semantics is to be used for that directory: files created" +" there inherit their group ID from the directory, not from the effective " +"group ID of the creating process, and directories created there will also " +"get the :data:`S_ISGID` bit set. For a file that does not have the group " +"execution bit (:data:`S_IXGRP`) set, the set-group-ID bit indicates " +"mandatory file/record locking (see also :data:`S_ENFMT`)." +msgstr "" +"设置分组 ID 位。这个位有几种特殊用途。对于目录它表示该目录将使用 BSD 语义:在其中创建的文件将从目录继承其分组 ID,而不是从创建进程的有效分组" +" ID 继承,并且在其中创建的目录也将设置 :data:`S_ISGID` 位。对于没有设置分组执行位 (:data:`S_IXGRP`) " +"的文件,设置分组 ID 位表示强制性文件/记录锁定 (另请参见 :data:`S_ENFMT`)。" + +#: ../../library/stat.rst:281 +msgid "" +"Sticky bit. When this bit is set on a directory it means that a file in " +"that directory can be renamed or deleted only by the owner of the file, by " +"the owner of the directory, or by a privileged process." +msgstr "固定位。当对目录设置该位时则意味着此目录中的文件只能由文件所有者、目录所有者或特权进程来重命名或删除。" + +#: ../../library/stat.rst:287 +msgid "Mask for file owner permissions." +msgstr "文件所有者权限的掩码。" + +#: ../../library/stat.rst:291 +msgid "Owner has read permission." +msgstr "所有者具有读取权限。" + +#: ../../library/stat.rst:295 +msgid "Owner has write permission." +msgstr "所有者具有写入权限。" + +#: ../../library/stat.rst:299 +msgid "Owner has execute permission." +msgstr "所有者具有执行权限。" + +#: ../../library/stat.rst:303 +msgid "Mask for group permissions." +msgstr "组权限的掩码。" + +#: ../../library/stat.rst:307 +msgid "Group has read permission." +msgstr "组具有读取权限。" + +#: ../../library/stat.rst:311 +msgid "Group has write permission." +msgstr "组具有写入权限。" + +#: ../../library/stat.rst:315 +msgid "Group has execute permission." +msgstr "组具有执行权限。" + +#: ../../library/stat.rst:319 +msgid "Mask for permissions for others (not in group)." +msgstr "其他人(不在组中)的权限掩码。" + +#: ../../library/stat.rst:323 +msgid "Others have read permission." +msgstr "其他人具有读取权限。" + +#: ../../library/stat.rst:327 +msgid "Others have write permission." +msgstr "其他人具有写入权限。" + +#: ../../library/stat.rst:331 +msgid "Others have execute permission." +msgstr "其他人具有执行权限。" + +#: ../../library/stat.rst:335 +msgid "" +"System V file locking enforcement. This flag is shared with " +":data:`S_ISGID`: file/record locking is enforced on files that do not have " +"the group execution bit (:data:`S_IXGRP`) set." +msgstr "" +"System V 执行文件锁定。此旗标是与 :data:`S_ISGID` 共享的:文件/记录锁定会针对未设置分组执行位 " +"(:data:`S_IXGRP`) 的文件强制执行。" + +#: ../../library/stat.rst:341 +msgid "Unix V7 synonym for :data:`S_IRUSR`." +msgstr "Unix V7 中 :data:`S_IRUSR` 的同义词。" + +#: ../../library/stat.rst:345 +msgid "Unix V7 synonym for :data:`S_IWUSR`." +msgstr "Unix V7 中 :data:`S_IWUSR` 的同义词。" + +#: ../../library/stat.rst:349 +msgid "Unix V7 synonym for :data:`S_IXUSR`." +msgstr "Unix V7 中 :data:`S_IXUSR` 的同义词。" + +#: ../../library/stat.rst:351 +msgid "" +"The following flags can be used in the *flags* argument of " +":func:`os.chflags`:" +msgstr "以下旗标可以在 :func:`os.chflags` 的 *flags* 参数中使用:" + +#: ../../library/stat.rst:355 +msgid "All user settable flags." +msgstr "所有用户可设置的旗标。" + +#: ../../library/stat.rst:361 +msgid "Do not dump the file." +msgstr "不要转储文件。" + +#: ../../library/stat.rst:365 ../../library/stat.rst:427 +msgid "The file may not be changed." +msgstr "文件不能被更改。" + +#: ../../library/stat.rst:369 ../../library/stat.rst:431 +msgid "The file may only be appended to." +msgstr "文件只能被附加。" + +#: ../../library/stat.rst:373 +msgid "The directory is opaque when viewed through a union stack." +msgstr "当通过联合堆栈查看时,目录是不透明的。" + +#: ../../library/stat.rst:377 ../../library/stat.rst:441 +msgid "The file may not be renamed or deleted." +msgstr "文件不能重命名或删除。" + +#: ../../library/stat.rst:381 +msgid "The file is stored compressed (macOS 10.6+)." +msgstr "文件是压缩存储的(macOS 10.6+)。" + +#: ../../library/stat.rst:385 +msgid "Used for handling document IDs (macOS)" +msgstr "用于处理文档 ID (macOS)" + +#: ../../library/stat.rst:391 +msgid "The file needs an entitlement for reading or writing (macOS 10.13+)" +msgstr "文件需要赋予读取或写入权限 (macOS 10.13+)" + +#: ../../library/stat.rst:397 +msgid "The file should not be displayed in a GUI (macOS 10.5+)." +msgstr "文件不应在 GUI 中显示(macOS 10.5+)。" + +#: ../../library/stat.rst:401 +msgid "All super-user changeable flags" +msgstr "所有超级用户可修改的旗标" + +#: ../../library/stat.rst:407 +msgid "All super-user supported flags" +msgstr "所有超级用户支持的旗标" + +#: ../../library/stat.rst:409 ../../library/stat.rst:417 +msgid "Availability" +msgstr "Availability" + +#: ../../library/stat.rst:415 +msgid "All super-user read-only synthetic flags" +msgstr "所有超级用户只读的合成旗标" + +#: ../../library/stat.rst:423 +msgid "The file may be archived." +msgstr "文件可以被存档。" + +#: ../../library/stat.rst:435 +msgid "The file needs an entitlement to write to (macOS 10.13+)" +msgstr "文件需要赋予写入权限 (macOS 10.13+)" + +#: ../../library/stat.rst:445 +msgid "The file is a snapshot file." +msgstr "文件是一个快照文件。" + +#: ../../library/stat.rst:449 +msgid "The file is a firmlink (macOS 10.15+)" +msgstr "文件是一个固定链接 (macOS 10.15+)" + +#: ../../library/stat.rst:455 +msgid "The file is a dataless object (macOS 10.15+)" +msgstr "文件是一个无数据对象 (macOS 10.15+)" + +#: ../../library/stat.rst:459 +msgid "" +"See the \\*BSD or macOS systems man page :manpage:`chflags(2)` for more " +"information." +msgstr "请参阅 \\*BSD 或 macOS 系统的指南页 :manpage:`chflags(2)` 来了解详情。" + +#: ../../library/stat.rst:461 +msgid "" +"On Windows, the following file attribute constants are available for use " +"when testing bits in the ``st_file_attributes`` member returned by " +":func:`os.stat`. See the `Windows API documentation " +"`_ " +"for more detail on the meaning of these constants." +msgstr "" +"在 Windows 上,以下文件属性常量可被用来检测 :func:`os.stat` 所返回的 ``st_file_attributes`` " +"成员中的位。请参阅 `Windows API 文档 `_ 了解有关这些常量含义的详情。" + +#: ../../library/stat.rst:487 +msgid "" +"On Windows, the following constants are available for comparing against the " +"``st_reparse_tag`` member returned by :func:`os.lstat`. These are well-known" +" constants, but are not an exhaustive list." +msgstr "" +"在 Windows 上,以下常量可被用来与 :func:`os.lstat` 所返回的 ``st_reparse_tag`` 成员进行比较。 " +"这些是最主要的常量,而不是详尽的清单。" diff --git a/library/statistics.po b/library/statistics.po new file mode 100644 index 0000000000..ddd8aae443 --- /dev/null +++ b/library/statistics.po @@ -0,0 +1,2043 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/statistics.rst:2 +msgid ":mod:`!statistics` --- Mathematical statistics functions" +msgstr ":mod:`!statistics` --- 数学统计函数" + +#: ../../library/statistics.rst:9 +msgid "**Source code:** :source:`Lib/statistics.py`" +msgstr "**源代码:** :source:`Lib/statistics.py`" + +#: ../../library/statistics.rst:19 +msgid "" +"This module provides functions for calculating mathematical statistics of " +"numeric (:class:`~numbers.Real`-valued) data." +msgstr "该模块提供了用于计算数字 (:class:`~numbers.Real`-valued) 数据的数理统计量的函数。" + +#: ../../library/statistics.rst:22 +msgid "" +"The module is not intended to be a competitor to third-party libraries such " +"as `NumPy `_, `SciPy `_, or " +"proprietary full-featured statistics packages aimed at professional " +"statisticians such as Minitab, SAS and Matlab. It is aimed at the level of " +"graphing and scientific calculators." +msgstr "" +"此模块并不是诸如 `NumPy `_, `SciPy `_ " +"等第三方库或者诸如 Minitab, SAS 和 Matlab 等针对专业统计学家的专有全功能统计软件包的竞品。此模块针对图形和科学计算器的水平。" + +#: ../../library/statistics.rst:28 +msgid "" +"Unless explicitly noted, these functions support :class:`int`, " +":class:`float`, :class:`~decimal.Decimal` and :class:`~fractions.Fraction`. " +"Behaviour with other types (whether in the numeric tower or not) is " +"currently unsupported. Collections with a mix of types are also undefined " +"and implementation-dependent. If your input data consists of mixed types, " +"you may be able to use :func:`map` to ensure a consistent result, for " +"example: ``map(float, input_data)``." +msgstr "" +"除非明确注释,这些函数支持 :class:`int`, :class:`float`, :class:`~decimal.Decimal` 和 " +":class:`~fractions.Fraction` " +"。当前不支持同其他类型(是否在数字塔中)的行为。混合类型的多项集也是未定义的,并且依赖于实现。如果你输入的数据由混合类型组成,你应该能够使用 " +":func:`map` 来确保一个一致的结果,比如: ``map(float, input_data)``。" + +#: ../../library/statistics.rst:36 +msgid "" +"Some datasets use ``NaN`` (not a number) values to represent missing data. " +"Since NaNs have unusual comparison semantics, they cause surprising or " +"undefined behaviors in the statistics functions that sort data or that count" +" occurrences. The functions affected are ``median()``, ``median_low()``, " +"``median_high()``, ``median_grouped()``, ``mode()``, ``multimode()``, and " +"``quantiles()``. The ``NaN`` values should be stripped before calling these" +" functions::" +msgstr "" +"某些数据集合类型使用 ``NaN`` (not a number) 值来代表缺失的数据。由于 NaN " +"具有特殊的比较语义,它们会在数据排序或计数等统计函数中产生怪异或未定义的行为。受影响的函数有 ``median()``, " +"``median_low()``, ``median_high()``, ``median_grouped()``, ``mode()``, " +"``multimode()`` 和 ``quantiles()``。``NaN`` 值应当在调用这些函数之前被去除::" + +#: ../../library/statistics.rst:44 +msgid "" +">>> from statistics import median\n" +">>> from math import isnan\n" +">>> from itertools import filterfalse\n" +"\n" +">>> data = [20.7, float('NaN'),19.2, 18.3, float('NaN'), 14.4]\n" +">>> sorted(data) # This has surprising behavior\n" +"[20.7, nan, 14.4, 18.3, 19.2, nan]\n" +">>> median(data) # This result is unexpected\n" +"16.35\n" +"\n" +">>> sum(map(isnan, data)) # Number of missing values\n" +"2\n" +">>> clean = list(filterfalse(isnan, data)) # Strip NaN values\n" +">>> clean\n" +"[20.7, 19.2, 18.3, 14.4]\n" +">>> sorted(clean) # Sorting now works as expected\n" +"[14.4, 18.3, 19.2, 20.7]\n" +">>> median(clean) # This result is now well defined\n" +"18.75" +msgstr "" +">>> from statistics import median\n" +">>> from math import isnan\n" +">>> from itertools import filterfalse\n" +"\n" +">>> data = [20.7, float('NaN'),19.2, 18.3, float('NaN'), 14.4]\n" +">>> sorted(data) # 这将有令人惊讶的行为\n" +"[20.7, nan, 14.4, 18.3, 19.2, nan]\n" +">>> median(data) # 这个结果不符合预期\n" +"16.35\n" +"\n" +">>> sum(map(isnan, data)) # 缺失值的数量\n" +"2\n" +">>> clean = list(filterfalse(isnan, data)) # 去除 NaN 值\n" +">>> clean\n" +"[20.7, 19.2, 18.3, 14.4]\n" +">>> sorted(clean) # 现在排序将符合预期\n" +"[14.4, 18.3, 19.2, 20.7]\n" +">>> median(clean) # 现在这个结果是有良好定义的\n" +"18.75" + +#: ../../library/statistics.rst:66 +msgid "Averages and measures of central location" +msgstr "平均值以及对中心位置的评估" + +#: ../../library/statistics.rst:68 +msgid "" +"These functions calculate an average or typical value from a population or " +"sample." +msgstr "这些函数用于计算一个总体或样本的平均值或者典型值。" + +#: ../../library/statistics.rst:72 +msgid ":func:`mean`" +msgstr ":func:`mean`" + +#: ../../library/statistics.rst:72 +msgid "Arithmetic mean (\"average\") of data." +msgstr "数据的算术平均数(“平均数”)。" + +#: ../../library/statistics.rst:73 +msgid ":func:`fmean`" +msgstr ":func:`fmean`" + +#: ../../library/statistics.rst:73 +msgid "Fast, floating-point arithmetic mean, with optional weighting." +msgstr "快速的浮点算术平均值,带有可选的权重设置。" + +#: ../../library/statistics.rst:74 +msgid ":func:`geometric_mean`" +msgstr ":func:`geometric_mean`" + +#: ../../library/statistics.rst:74 +msgid "Geometric mean of data." +msgstr "数据的几何平均数" + +#: ../../library/statistics.rst:75 +msgid ":func:`harmonic_mean`" +msgstr ":func:`harmonic_mean`" + +#: ../../library/statistics.rst:75 +msgid "Harmonic mean of data." +msgstr "数据的调和均值" + +#: ../../library/statistics.rst:76 +msgid ":func:`kde`" +msgstr ":func:`kde`" + +#: ../../library/statistics.rst:76 +msgid "Estimate the probability density distribution of the data." +msgstr "估算数据的概率密度分布。" + +#: ../../library/statistics.rst:77 +msgid ":func:`kde_random`" +msgstr ":func:`kde_random`" + +#: ../../library/statistics.rst:77 +msgid "Random sampling from the PDF generated by kde()." +msgstr "对由 kde() 生成的 PDF 进行随机采样。" + +#: ../../library/statistics.rst:78 +msgid ":func:`median`" +msgstr ":func:`median`" + +#: ../../library/statistics.rst:78 +msgid "Median (middle value) of data." +msgstr "数据的中位数(中间值)" + +#: ../../library/statistics.rst:79 +msgid ":func:`median_low`" +msgstr ":func:`median_low`" + +#: ../../library/statistics.rst:79 +msgid "Low median of data." +msgstr "数据的低中位数" + +#: ../../library/statistics.rst:80 +msgid ":func:`median_high`" +msgstr ":func:`median_high`" + +#: ../../library/statistics.rst:80 +msgid "High median of data." +msgstr "数据的高中位数" + +#: ../../library/statistics.rst:81 +msgid ":func:`median_grouped`" +msgstr ":func:`median_grouped`" + +#: ../../library/statistics.rst:81 +msgid "Median (50th percentile) of grouped data." +msgstr "分组数据的中位数(即第 50 个百分点的位置)。" + +#: ../../library/statistics.rst:82 +msgid ":func:`mode`" +msgstr ":func:`mode`" + +#: ../../library/statistics.rst:82 +msgid "Single mode (most common value) of discrete or nominal data." +msgstr "离散的或标称的数据的单个众数(出现最多的值)。" + +#: ../../library/statistics.rst:83 +msgid ":func:`multimode`" +msgstr ":func:`multimode`" + +#: ../../library/statistics.rst:83 +msgid "List of modes (most common values) of discrete or nominal data." +msgstr "离散的或标称的数据的众数(出现最多的值)列表。" + +#: ../../library/statistics.rst:84 +msgid ":func:`quantiles`" +msgstr ":func:`quantiles`" + +#: ../../library/statistics.rst:84 +msgid "Divide data into intervals with equal probability." +msgstr "将数据以相等的概率分为多个间隔。" + +#: ../../library/statistics.rst:88 +msgid "Measures of spread" +msgstr "对分散程度的评估" + +#: ../../library/statistics.rst:90 +msgid "" +"These functions calculate a measure of how much the population or sample " +"tends to deviate from the typical or average values." +msgstr "这些函数用于计算总体或样本与典型值或平均值的偏离程度。" + +#: ../../library/statistics.rst:94 +msgid ":func:`pstdev`" +msgstr ":func:`pstdev`" + +#: ../../library/statistics.rst:94 +msgid "Population standard deviation of data." +msgstr "数据的总体标准差" + +#: ../../library/statistics.rst:95 +msgid ":func:`pvariance`" +msgstr ":func:`pvariance`" + +#: ../../library/statistics.rst:95 +msgid "Population variance of data." +msgstr "数据的总体方差" + +#: ../../library/statistics.rst:96 +msgid ":func:`stdev`" +msgstr ":func:`stdev`" + +#: ../../library/statistics.rst:96 +msgid "Sample standard deviation of data." +msgstr "数据的样本标准差" + +#: ../../library/statistics.rst:97 +msgid ":func:`variance`" +msgstr ":func:`variance`" + +#: ../../library/statistics.rst:97 +msgid "Sample variance of data." +msgstr "数据的样本方差" + +#: ../../library/statistics.rst:101 +msgid "Statistics for relations between two inputs" +msgstr "对两个输入之间关系的统计" + +#: ../../library/statistics.rst:103 +msgid "" +"These functions calculate statistics regarding relations between two inputs." +msgstr "这些函数计算两个输入之间关系的统计值。" + +#: ../../library/statistics.rst:106 +msgid ":func:`covariance`" +msgstr ":func:`covariance`" + +#: ../../library/statistics.rst:106 +msgid "Sample covariance for two variables." +msgstr "两个变量的样本协方差。" + +#: ../../library/statistics.rst:107 +msgid ":func:`correlation`" +msgstr ":func:`correlation`" + +#: ../../library/statistics.rst:107 +msgid "Pearson and Spearman's correlation coefficients." +msgstr "皮尔逊和斯皮尔曼相关系数。" + +#: ../../library/statistics.rst:108 +msgid ":func:`linear_regression`" +msgstr ":func:`linear_regression`" + +#: ../../library/statistics.rst:108 +msgid "Slope and intercept for simple linear regression." +msgstr "简单线性回归的斜率和截距。" + +#: ../../library/statistics.rst:113 +msgid "Function details" +msgstr "函数细节" + +#: ../../library/statistics.rst:115 +msgid "" +"Note: The functions do not require the data given to them to be sorted. " +"However, for reading convenience, most of the examples show sorted " +"sequences." +msgstr "注释:这些函数不需要对提供给它们的数据进行排序。但是,为了方便阅读,大多数例子展示的是已排序的序列。" + +#: ../../library/statistics.rst:120 +msgid "" +"Return the sample arithmetic mean of *data* which can be a sequence or " +"iterable." +msgstr "返回 *data* 的样本算术平均数,形式为序列或迭代器。" + +#: ../../library/statistics.rst:122 +msgid "" +"The arithmetic mean is the sum of the data divided by the number of data " +"points. It is commonly called \"the average\", although it is only one of " +"many different mathematical averages. It is a measure of the central " +"location of the data." +msgstr "算术平均数是数据之和与数据点个数的商。通常称作“平均数”,尽管它只是诸多数学平均数之一。它是数据的中心位置的度量。" + +#: ../../library/statistics.rst:127 +msgid "If *data* is empty, :exc:`StatisticsError` will be raised." +msgstr "若 *data* 为空,将会引发 :exc:`StatisticsError`。" + +#: ../../library/statistics.rst:129 +msgid "Some examples of use:" +msgstr "一些用法示例:" + +#: ../../library/statistics.rst:131 +msgid "" +">>> mean([1, 2, 3, 4, 4])\n" +"2.8\n" +">>> mean([-1.0, 2.5, 3.25, 5.75])\n" +"2.625\n" +"\n" +">>> from fractions import Fraction as F\n" +">>> mean([F(3, 7), F(1, 21), F(5, 3), F(1, 3)])\n" +"Fraction(13, 21)\n" +"\n" +">>> from decimal import Decimal as D\n" +">>> mean([D(\"0.5\"), D(\"0.75\"), D(\"0.625\"), D(\"0.375\")])\n" +"Decimal('0.5625')" +msgstr "" +">>> mean([1, 2, 3, 4, 4])\n" +"2.8\n" +">>> mean([-1.0, 2.5, 3.25, 5.75])\n" +"2.625\n" +"\n" +">>> from fractions import Fraction as F\n" +">>> mean([F(3, 7), F(1, 21), F(5, 3), F(1, 3)])\n" +"Fraction(13, 21)\n" +"\n" +">>> from decimal import Decimal as D\n" +">>> mean([D(\"0.5\"), D(\"0.75\"), D(\"0.625\"), D(\"0.375\")])\n" +"Decimal('0.5625')" + +#: ../../library/statistics.rst:148 +msgid "" +"The mean is strongly affected by `outliers " +"`_ and is not necessarily a typical " +"example of the data points. For a more robust, although less efficient, " +"measure of `central tendency " +"`_, see :func:`median`." +msgstr "" +"平均数会受到 `异常值 `_ 的强烈影响因而不一定能作为数据点的典型样本。" +" 想获得对于 `集中趋势 `_ 的更可靠的度量,可以参看" +" :func:`median`,但其效率要低一些。" + +#: ../../library/statistics.rst:154 +msgid "" +"The sample mean gives an unbiased estimate of the true population mean, so " +"that when taken on average over all the possible samples, ``mean(sample)`` " +"converges on the true mean of the entire population. If *data* represents " +"the entire population rather than a sample, then ``mean(data)`` is " +"equivalent to calculating the true population mean μ." +msgstr "" +"样本均值给出了一个无偏向的真实总体均值的估计,因此当平均抽取所有可能的样本,``mean(sample)`` 收敛于整个总体的真实均值。如果 " +"*data* 代表整个总体而不是样本,那么 ``mean(data)`` 等同于计算真实整体均值 μ。" + +#: ../../library/statistics.rst:163 +msgid "Convert *data* to floats and compute the arithmetic mean." +msgstr "将 *data* 转换成浮点数并且计算算术平均数。" + +#: ../../library/statistics.rst:165 +msgid "" +"This runs faster than the :func:`mean` function and it always returns a " +":class:`float`. The *data* may be a sequence or iterable. If the input " +"dataset is empty, raises a :exc:`StatisticsError`." +msgstr "" +"此函数的运行速度比 :func:`mean` 函数快并且它总是返回一个 :class:`float`。 *data* 可以为序列或可迭代对象。 " +"如果输入数据集为空,则会引发 :exc:`StatisticsError`。" + +#: ../../library/statistics.rst:169 +msgid "" +">>> fmean([3.5, 4.0, 5.25])\n" +"4.25" +msgstr "" +">>> fmean([3.5, 4.0, 5.25])\n" +"4.25" + +#: ../../library/statistics.rst:174 +msgid "" +"Optional weighting is supported. For example, a professor assigns a grade " +"for a course by weighting quizzes at 20%, homework at 20%, a midterm exam at" +" 30%, and a final exam at 30%:" +msgstr "支持可选的权重参数。例如,某位教授在为课程打分时可设置权重为测验 20%, 作业 20%, 期中考试 30%, 期末考试 30%:" + +#: ../../library/statistics.rst:178 +msgid "" +">>> grades = [85, 92, 83, 91]\n" +">>> weights = [0.20, 0.20, 0.30, 0.30]\n" +">>> fmean(grades, weights)\n" +"87.6" +msgstr "" +">>> grades = [85, 92, 83, 91]\n" +">>> weights = [0.20, 0.20, 0.30, 0.30]\n" +">>> fmean(grades, weights)\n" +"87.6" + +#: ../../library/statistics.rst:185 +msgid "" +"If *weights* is supplied, it must be the same length as the *data* or a " +":exc:`ValueError` will be raised." +msgstr "如果提供了 *weights*,它必须与 *data* 的长度相同否则将引发 :exc:`ValueError`。" + +#: ../../library/statistics.rst:190 ../../library/statistics.rst:258 +msgid "Added support for *weights*." +msgstr "添加了对 *weights* 的支持。" + +#: ../../library/statistics.rst:196 +msgid "Convert *data* to floats and compute the geometric mean." +msgstr "将 *data* 转换成浮点数并且计算几何平均数。" + +#: ../../library/statistics.rst:198 +msgid "" +"The geometric mean indicates the central tendency or typical value of the " +"*data* using the product of the values (as opposed to the arithmetic mean " +"which uses their sum)." +msgstr "几何平均值使用值的乘积表示 *data* 的中心趋势或典型值(与使用它们的总和的算术平均值相反)。" + +#: ../../library/statistics.rst:202 +msgid "" +"Raises a :exc:`StatisticsError` if the input dataset is empty, if it " +"contains a zero, or if it contains a negative value. The *data* may be a " +"sequence or iterable." +msgstr "如果输入数据集为空、包含零或包含负值则将引发 :exc:`StatisticsError`。 *data* 可以是序列或可迭代对象。" + +#: ../../library/statistics.rst:206 +msgid "" +"No special efforts are made to achieve exact results. (However, this may " +"change in the future.)" +msgstr "没有为获得精确结果做出特殊处理。(但是,将来或许会修改。)" + +#: ../../library/statistics.rst:209 +msgid "" +">>> round(geometric_mean([54, 24, 36]), 1)\n" +"36.0" +msgstr "" +">>> round(geometric_mean([54, 24, 36]), 1)\n" +"36.0" + +#: ../../library/statistics.rst:219 +msgid "" +"Return the harmonic mean of *data*, a sequence or iterable of real-valued " +"numbers. If *weights* is omitted or ``None``, then equal weighting is " +"assumed." +msgstr "返回包含实数的序列或可迭代对象 *data* 的调和平均值。如果 *weights* 被省略或为 ``None``,则会假定为相等权重。" + +#: ../../library/statistics.rst:223 +msgid "" +"The harmonic mean is the reciprocal of the arithmetic :func:`mean` of the " +"reciprocals of the data. For example, the harmonic mean of three values *a*," +" *b* and *c* will be equivalent to ``3/(1/a + 1/b + 1/c)``. If one of the " +"values is zero, the result will be zero." +msgstr "" +"调和平均数是数据的倒数的算术平均值 :func:`mean` 的倒数。例如,三个数值 *a*, *b* 和 *c* 的调和平均数将等于 ``3/(1/a" +" + 1/b + 1/c)``。如果其中一个值为零,则结果也将为零。" + +#: ../../library/statistics.rst:228 +msgid "" +"The harmonic mean is a type of average, a measure of the central location of" +" the data. It is often appropriate when averaging ratios or rates, for " +"example speeds." +msgstr "调和平均数是均值的一种,是对数据的中心位置的度量。它通常适用于求比率和比例(如速度)的均值。" + +#: ../../library/statistics.rst:232 +msgid "" +"Suppose a car travels 10 km at 40 km/hr, then another 10 km at 60 km/hr. " +"What is the average speed?" +msgstr "假设一辆车在 40 km/hr 的速度下行驶了 10 km,然后又以 60 km/hr 的速度行驶了 10 km。车辆的平均速率是多少?" + +#: ../../library/statistics.rst:235 +msgid "" +">>> harmonic_mean([40, 60])\n" +"48.0" +msgstr "" +">>> harmonic_mean([40, 60])\n" +"48.0" + +#: ../../library/statistics.rst:240 +msgid "" +"Suppose a car travels 40 km/hr for 5 km, and when traffic clears, speeds-up " +"to 60 km/hr for the remaining 30 km of the journey. What is the average " +"speed?" +msgstr "" +"假设一辆汽车以速度 40 公里/小时行驶了 5 公里,当道路变得畅通后,提速到 60 公里/小时行驶了行程中剩余的 30 km。请问其平均速度是多少?" + +#: ../../library/statistics.rst:244 +msgid "" +">>> harmonic_mean([40, 60], weights=[5, 30])\n" +"56.0" +msgstr "" +">>> harmonic_mean([40, 60], weights=[5, 30])\n" +"56.0" + +#: ../../library/statistics.rst:249 +msgid "" +":exc:`StatisticsError` is raised if *data* is empty, any element is less " +"than zero, or if the weighted sum isn't positive." +msgstr "如果 *data* 为空、任意元素小于零,或者加权汇总值不为正数则会引发 :exc:`StatisticsError`。" + +#: ../../library/statistics.rst:252 +msgid "" +"The current algorithm has an early-out when it encounters a zero in the " +"input. This means that the subsequent inputs are not tested for validity. " +"(This behavior may change in the future.)" +msgstr "当前算法在输入中遇到零时会提前退出。这意味着不会测试后续输入的有效性。(此行为将来可能会更改。)" + +#: ../../library/statistics.rst:264 +msgid "" +"`Kernel Density Estimation (KDE) `_: " +"Create a continuous probability density function or cumulative distribution " +"function from discrete samples." +msgstr "" +"`核密度估计 (KDE) `_: " +"基于离散的样本创建一个连续概率密度函数或累积分布函数。" + +#: ../../library/statistics.rst:269 +msgid "" +"The basic idea is to smooth the data using `a kernel function " +"`_. to help draw " +"inferences about a population from a sample." +msgstr "" +"其基本思路是使用 `核函数 `_ 来平滑数据。 " +"以帮助根据一个样本来推断总体情况。" + +#: ../../library/statistics.rst:273 +msgid "" +"The degree of smoothing is controlled by the scaling parameter *h* which is " +"called the bandwidth. Smaller values emphasize local features while larger " +"values give smoother results." +msgstr "平滑等级是由被称为“带宽”的缩放形参 *h* 来控制的。较小的值将强调局部特性而较大的值将给出更平滑的结果。" + +#: ../../library/statistics.rst:277 +msgid "" +"The *kernel* determines the relative weights of the sample data points. " +"Generally, the choice of kernel shape does not matter as much as the more " +"influential bandwidth smoothing parameter." +msgstr "*kernel* 确定样本数据点的相对权重。通常,对核形状的选择带来的影响没有对带宽平滑形参的选择那样大。" + +#: ../../library/statistics.rst:281 +msgid "" +"Kernels that give some weight to every sample point include *normal* " +"(*gauss*), *logistic*, and *sigmoid*." +msgstr "为每个样本点都给出一定权重的核包括 *normal* (*gauss*), *logistic* 和 *sigmoid*。" + +#: ../../library/statistics.rst:284 +msgid "" +"Kernels that only give weight to sample points within the bandwidth include " +"*rectangular* (*uniform*), *triangular*, *parabolic* (*epanechnikov*), " +"*quartic* (*biweight*), *triweight*, and *cosine*." +msgstr "" +"只为带宽范围内的样本点给出权重的核包括 *rectangular* (*uniform*), *triangular*, *parabolic* " +"(*epanechnikov*), *quartic* (*biweight*), *triweight* 和 *cosine*。" + +#: ../../library/statistics.rst:288 +msgid "" +"If *cumulative* is true, will return a cumulative distribution function." +msgstr "如果 *cumulative* 为真值,将返回一个累积分布函数。" + +#: ../../library/statistics.rst:290 ../../library/statistics.rst:321 +msgid "" +"A :exc:`StatisticsError` will be raised if the *data* sequence is empty." +msgstr "如果 *data* 序列为空则会引发 :exc:`StatisticsError`。" + +#: ../../library/statistics.rst:292 +msgid "" +"`Wikipedia has an example " +"`_ where we" +" can use :func:`kde` to generate and plot a probability density function " +"estimated from a small sample:" +msgstr "" +"在 `Wikipedia 提供的示例 " +"`_ 中我们可以使用 " +":func:`kde` 来生成并绘制从小样本中估算出的概率密度函数:" + +#: ../../library/statistics.rst:297 +msgid "" +">>> sample = [-2.1, -1.3, -0.4, 1.9, 5.1, 6.2]\n" +">>> f_hat = kde(sample, h=1.5)\n" +">>> xarr = [i/100 for i in range(-750, 1100)]\n" +">>> yarr = [f_hat(x) for x in xarr]" +msgstr "" +">>> sample = [-2.1, -1.3, -0.4, 1.9, 5.1, 6.2]\n" +">>> f_hat = kde(sample, h=1.5)\n" +">>> xarr = [i/100 for i in range(-750, 1100)]\n" +">>> yarr = [f_hat(x) for x in xarr]" + +#: ../../library/statistics.rst:304 +msgid "The points in ``xarr`` and ``yarr`` can be used to make a PDF plot:" +msgstr "``xarr`` 和 ``yarr`` 中的点可被用来绘制一个 PDF 图形:" + +#: ../../library/statistics.rst:306 +msgid "Scatter plot of the estimated probability density function." +msgstr "估计概率密度函数的散点图。" + +#: ../../library/statistics.rst:314 +msgid "" +"Return a function that makes a random selection from the estimated " +"probability density function produced by ``kde(data, h, kernel)``." +msgstr "返回一个函数,从 ``kde(data, h, kernel)`` 产生的估计概率密度函数中执行一次随机选择。" + +#: ../../library/statistics.rst:317 +msgid "" +"Providing a *seed* allows reproducible selections. In the future, the values" +" may change slightly as more accurate kernel inverse CDF estimates are " +"implemented. The seed may be an integer, float, str, or bytes." +msgstr "" +"提供 *seed* 将允许可重现的选择。在未来版本中,这些值可能因更精确的反向 CDF 估计的实现而略微修改。seed " +"可以是一个整数、浮点数、字符串或字节串。" + +#: ../../library/statistics.rst:323 +msgid "" +"Continuing the example for :func:`kde`, we can use :func:`kde_random` to " +"generate new random selections from an estimated probability density " +"function:" +msgstr "继续 :func:`kde` 的例子,我们可以使用 :func:`kde_random` 从一个估计概率密度函数生成新的随机选择:" + +#: ../../library/statistics.rst:338 +msgid "" +"Return the median (middle value) of numeric data, using the common \"mean of" +" middle two\" method. If *data* is empty, :exc:`StatisticsError` is raised." +" *data* can be a sequence or iterable." +msgstr "" +"使用普通的“取中间两数平均值”方法返回数值数据的中位数(中间值)。如果 *data* 为空,则将引发 :exc:`StatisticsError`。 " +"*data* 可以是序列或可迭代对象。" + +#: ../../library/statistics.rst:342 +msgid "" +"The median is a robust measure of central location and is less affected by " +"the presence of outliers. When the number of data points is odd, the middle" +" data point is returned:" +msgstr "中位数是衡量中间位置的可靠方式,并且较少受到极端值的影响。当数据点的总数为奇数时,将返回中间数据点:" + +#: ../../library/statistics.rst:346 +msgid "" +">>> median([1, 3, 5])\n" +"3" +msgstr "" +">>> median([1, 3, 5])\n" +"3" + +#: ../../library/statistics.rst:351 +msgid "" +"When the number of data points is even, the median is interpolated by taking" +" the average of the two middle values:" +msgstr "当数据点的总数为偶数时,中位数将通过对两个中间值求平均进行插值得出:" + +#: ../../library/statistics.rst:354 +msgid "" +">>> median([1, 3, 5, 7])\n" +"4.0" +msgstr "" +">>> median([1, 3, 5, 7])\n" +"4.0" + +#: ../../library/statistics.rst:359 +msgid "" +"This is suited for when your data is discrete, and you don't mind that the " +"median may not be an actual data point." +msgstr "这适用于当你的数据是离散的,并且你不介意中位数不是实际数据点的情况。" + +#: ../../library/statistics.rst:362 +msgid "" +"If the data is ordinal (supports order operations) but not numeric (doesn't " +"support addition), consider using :func:`median_low` or :func:`median_high` " +"instead." +msgstr "" +"如果数据是有序的(支持排序操作)但不是数字(不支持加法),请考虑改用 :func:`median_low` 或 :func:`median_high`。" + +#: ../../library/statistics.rst:368 +msgid "" +"Return the low median of numeric data. If *data* is empty, " +":exc:`StatisticsError` is raised. *data* can be a sequence or iterable." +msgstr "" +"返回数值数据的低中位数。如果 *data* 为空则将引发 :exc:`StatisticsError`。 *data* 可以是序列或可迭代对象。" + +#: ../../library/statistics.rst:371 +msgid "" +"The low median is always a member of the data set. When the number of data " +"points is odd, the middle value is returned. When it is even, the smaller " +"of the two middle values is returned." +msgstr "低中位数一定是数据集的成员。当数据点总数为奇数时,将返回中间值。当其为偶数时,将返回两个中间值中较小的那个。" + +#: ../../library/statistics.rst:375 +msgid "" +">>> median_low([1, 3, 5])\n" +"3\n" +">>> median_low([1, 3, 5, 7])\n" +"3" +msgstr "" +">>> median_low([1, 3, 5])\n" +"3\n" +">>> median_low([1, 3, 5, 7])\n" +"3" + +#: ../../library/statistics.rst:382 +msgid "" +"Use the low median when your data are discrete and you prefer the median to " +"be an actual data point rather than interpolated." +msgstr "当你的数据是离散的,并且你希望中位数是一个实际数据点而非插值结果时可以使用低中位数。" + +#: ../../library/statistics.rst:388 +msgid "" +"Return the high median of data. If *data* is empty, :exc:`StatisticsError` " +"is raised. *data* can be a sequence or iterable." +msgstr "" +"返回数据的高中位数。如果 *data* 为空则将引发 :exc:`StatisticsError`。 *data* 可以是序列或可迭代对象。" + +#: ../../library/statistics.rst:391 +msgid "" +"The high median is always a member of the data set. When the number of data" +" points is odd, the middle value is returned. When it is even, the larger " +"of the two middle values is returned." +msgstr "高中位数一定是数据集的成员。当数据点总数为奇数时,将返回中间值。当其为偶数时,将返回两个中间值中较大的那个。" + +#: ../../library/statistics.rst:395 +msgid "" +">>> median_high([1, 3, 5])\n" +"3\n" +">>> median_high([1, 3, 5, 7])\n" +"5" +msgstr "" +">>> median_high([1, 3, 5])\n" +"3\n" +">>> median_high([1, 3, 5, 7])\n" +"5" + +#: ../../library/statistics.rst:402 +msgid "" +"Use the high median when your data are discrete and you prefer the median to" +" be an actual data point rather than interpolated." +msgstr "当你的数据是离散的,并且你希望中位数是一个实际数据点而非插值结果时可以使用高中位数。" + +#: ../../library/statistics.rst:408 +msgid "" +"Estimates the median for numeric data that has been `grouped or binned " +"`_ around the midpoints of " +"consecutive, fixed-width intervals." +msgstr "" +"针对围绕连续的、固定宽度区间的中点进行了 `分组或分档 `_ " +"的数值数据估算中位数。" + +#: ../../library/statistics.rst:412 +msgid "" +"The *data* can be any iterable of numeric data with each value being exactly" +" the midpoint of a bin. At least one value must be present." +msgstr "*data* 可以是任意数值数据的可迭代对象,其中每个值都恰好为分档的中点。至少必须有一个值。" + +#: ../../library/statistics.rst:415 +msgid "The *interval* is the width of each bin." +msgstr "*interval* 是每个分档的宽度。" + +#: ../../library/statistics.rst:417 +msgid "" +"For example, demographic information may have been summarized into " +"consecutive ten-year age groups with each group being represented by the " +"5-year midpoints of the intervals:" +msgstr "例如,人口信息可能被归纳为按 10 年划分的连续年龄分组,每个分组由各区间的 5 年中点来表示:" + +#: ../../library/statistics.rst:421 +msgid "" +">>> from collections import Counter\n" +">>> demographics = Counter({\n" +"... 25: 172, # 20 to 30 years old\n" +"... 35: 484, # 30 to 40 years old\n" +"... 45: 387, # 40 to 50 years old\n" +"... 55: 22, # 50 to 60 years old\n" +"... 65: 6, # 60 to 70 years old\n" +"... })\n" +"..." +msgstr "" +">>> from collections import Counter\n" +">>> demographics = Counter({\n" +"... 25: 172, # 20 至 30 岁\n" +"... 35: 484, # 30 至 40 岁\n" +"... 45: 387, # 40 至 50 岁\n" +"... 55: 22, # 50 至 60 岁\n" +"... 65: 6, # 60 至 70 岁\n" +"... })\n" +"..." + +#: ../../library/statistics.rst:433 +msgid "" +"The 50th percentile (median) is the 536th person out of the 1071 member " +"cohort. That person is in the 30 to 40 year old age group." +msgstr "第 50 个百分点位置(中位数)就是 1071 名成员中的第 536 人。此人属于 30 至 40 岁年龄分组。" + +#: ../../library/statistics.rst:436 +msgid "" +"The regular :func:`median` function would assume that everyone in the " +"tricenarian age group was exactly 35 years old. A more tenable assumption " +"is that the 484 members of that age group are evenly distributed between 30 " +"and 40. For that, we use :func:`median_grouped`:" +msgstr "" +"常规的 :func:`median` 函数会假定三十至四十岁年龄组中的每个人都正好是 35 岁。一个更站得住脚的假设则是该年龄组的 484 " +"名成员均匀分布在 30 岁到 40 岁之间。为此,我们会使用 :func:`median_grouped`:" + +#: ../../library/statistics.rst:442 +msgid "" +">>> data = list(demographics.elements())\n" +">>> median(data)\n" +"35\n" +">>> round(median_grouped(data, interval=10), 1)\n" +"37.5" +msgstr "" +">>> data = list(demographics.elements())\n" +">>> median(data)\n" +"35\n" +">>> round(median_grouped(data, interval=10), 1)\n" +"37.5" + +#: ../../library/statistics.rst:450 +msgid "" +"The caller is responsible for making sure the data points are separated by " +"exact multiples of *interval*. This is essential for getting a correct " +"result. The function does not check this precondition." +msgstr "调用者有责任确保数据点之间以 *interval* 的精确倍数分隔。这对于获得正确结果至关重要。该函数不会检查这一前提条件。" + +#: ../../library/statistics.rst:454 +msgid "" +"Inputs may be any numeric type that can be coerced to a float during the " +"interpolation step." +msgstr "输入可以是任何可在插值步骤中强制转换为浮点数的数值类型。" + +#: ../../library/statistics.rst:460 +msgid "" +"Return the single most common data point from discrete or nominal *data*. " +"The mode (when it exists) is the most typical value and serves as a measure " +"of central location." +msgstr "从离散或标称的 *data* 返回单个出现最多的数据点。此众数(如果存在)是最典型的值,并可用来度量中心的位置。" + +#: ../../library/statistics.rst:464 +msgid "" +"If there are multiple modes with the same frequency, returns the first one " +"encountered in the *data*. If the smallest or largest of those is desired " +"instead, use ``min(multimode(data))`` or ``max(multimode(data))``. If the " +"input *data* is empty, :exc:`StatisticsError` is raised." +msgstr "" +"如果存在具有相同频率的多个众数,则返回在 *data* 中遇到的第一个。如果想要其中最小或最大的一个,请使用 " +"``min(multimode(data))`` 或 ``max(multimode(data))``。如果输入的 *data* 为空,则会引发 " +":exc:`StatisticsError`." + +#: ../../library/statistics.rst:469 +msgid "" +"``mode`` assumes discrete data and returns a single value. This is the " +"standard treatment of the mode as commonly taught in schools:" +msgstr "``mode`` 将假定是离散数据并返回一个单一的值。这是通常的学校教学中标准的处理方式:" + +#: ../../library/statistics.rst:472 +msgid "" +">>> mode([1, 1, 2, 3, 3, 3, 3, 4])\n" +"3" +msgstr "" +">>> mode([1, 1, 2, 3, 3, 3, 3, 4])\n" +"3" + +#: ../../library/statistics.rst:477 +msgid "" +"The mode is unique in that it is the only statistic in this package that " +"also applies to nominal (non-numeric) data:" +msgstr "此众数的独特之处在于它是这个包中唯一还可应用于标称(非数字)数据的统计信息:" + +#: ../../library/statistics.rst:480 +msgid "" +">>> mode([\"red\", \"blue\", \"blue\", \"red\", \"green\", \"red\", \"red\"])\n" +"'red'" +msgstr "" +">>> mode([\"red\", \"blue\", \"blue\", \"red\", \"green\", \"red\", \"red\"])\n" +"'red'" + +#: ../../library/statistics.rst:485 +msgid "" +"Only hashable inputs are supported. To handle type :class:`set`, consider " +"casting to :class:`frozenset`. To handle type :class:`list`, consider " +"casting to :class:`tuple`. For mixed or nested inputs, consider using this " +"slower quadratic algorithm that only depends on equality tests: ``max(data, " +"key=data.count)``." +msgstr "" +"仅支持输入可哈希对象。要处理 :class:`set` 类型,可将其转换为 :class:`frozenset`。要处理 :class:`list` " +"类型,可将其转换为 :class:`tuple`。对于混合的或嵌套的输入,可使用这个仅依赖于相等性检测的速度较慢的二次方复杂度算法: " +"``max(data, key=data.count)``." + +#: ../../library/statistics.rst:491 +msgid "" +"Now handles multimodal datasets by returning the first mode encountered. " +"Formerly, it raised :exc:`StatisticsError` when more than one mode was " +"found." +msgstr "现在会通过返回所遇到的第一个众数来处理多模数据集。之前它会在遇到超过一个的众数时引发 :exc:`StatisticsError`。" + +#: ../../library/statistics.rst:499 +msgid "" +"Return a list of the most frequently occurring values in the order they were" +" first encountered in the *data*. Will return more than one result if there" +" are multiple modes or an empty list if the *data* is empty:" +msgstr "" +"返回最频繁出现的值的列表,并按它们在 *data* 中首次出现的位置排序。如果存在多个众数则将返回一个以上的众数,或者如果 *data* " +"为空则将返回空列表:" + +#: ../../library/statistics.rst:503 +msgid "" +">>> multimode('aabbbbccddddeeffffgg')\n" +"['b', 'd', 'f']\n" +">>> multimode('')\n" +"[]" +msgstr "" +">>> multimode('aabbbbccddddeeffffgg')\n" +"['b', 'd', 'f']\n" +">>> multimode('')\n" +"[]" + +#: ../../library/statistics.rst:515 +msgid "" +"Return the population standard deviation (the square root of the population " +"variance). See :func:`pvariance` for arguments and other details." +msgstr "返回总体标准差(总体方差的平方根)。请参阅 :func:`pvariance` 了解参数和其他细节。" + +#: ../../library/statistics.rst:518 +msgid "" +">>> pstdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75])\n" +"0.986893273527251" +msgstr "" +">>> pstdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75])\n" +"0.986893273527251" + +#: ../../library/statistics.rst:526 +msgid "" +"Return the population variance of *data*, a non-empty sequence or iterable " +"of real-valued numbers. Variance, or second moment about the mean, is a " +"measure of the variability (spread or dispersion) of data. A large variance" +" indicates that the data is spread out; a small variance indicates it is " +"clustered closely around the mean." +msgstr "" +"返回非空序列或包含实数值的可迭代对象 *data* 的总体方差。方差或称相对于均值的二阶距,是对数据变化幅度(延展度或分散度)的度量。 " +"方差值较大表明数据的散布范围较大;方差值较小表明它紧密聚集于均值附近。" + +#: ../../library/statistics.rst:532 +msgid "" +"If the optional second argument *mu* is given, it should be the *population*" +" mean of the *data*. It can also be used to compute the second moment " +"around a point that is not the mean. If it is missing or ``None`` (the " +"default), the arithmetic mean is automatically calculated." +msgstr "" +"如果给出了可选的第二个参数 *mu*,它应为 *data* 的 *总体* 均值。它也可以被用来计算一个非均值点的二阶距。如果该参数被省略或为 " +"``None`` (默认值),则会自动进行算术均值计算。" + +#: ../../library/statistics.rst:537 +msgid "" +"Use this function to calculate the variance from the entire population. To " +"estimate the variance from a sample, the :func:`variance` function is " +"usually a better choice." +msgstr "使用此函数可根据所有数值来计算方差。要根据一个样本来估算方差,通常 :func:`variance` 函数是更好的选择。" + +#: ../../library/statistics.rst:541 +msgid "Raises :exc:`StatisticsError` if *data* is empty." +msgstr "如果 *data* 为空则会引发 :exc:`StatisticsError`。" + +#: ../../library/statistics.rst:543 ../../library/statistics.rst:613 +#: ../../library/statistics.rst:722 +msgid "Examples:" +msgstr "示例:" + +#: ../../library/statistics.rst:545 +msgid "" +">>> data = [0.0, 0.25, 0.25, 1.25, 1.5, 1.75, 2.75, 3.25]\n" +">>> pvariance(data)\n" +"1.25" +msgstr "" +">>> data = [0.0, 0.25, 0.25, 1.25, 1.5, 1.75, 2.75, 3.25]\n" +">>> pvariance(data)\n" +"1.25" + +#: ../../library/statistics.rst:551 +msgid "" +"If you have already calculated the mean of your data, you can pass it as the" +" optional second argument *mu* to avoid recalculation:" +msgstr "如果你已经计算过数据的平均值,你可以将其作为可选的第二个参数 *mu* 传入以避免重复计算:" + +#: ../../library/statistics.rst:554 +msgid "" +">>> mu = mean(data)\n" +">>> pvariance(data, mu)\n" +"1.25" +msgstr "" +">>> mu = mean(data)\n" +">>> pvariance(data, mu)\n" +"1.25" + +#: ../../library/statistics.rst:560 +msgid "Decimals and Fractions are supported:" +msgstr "同样也支持使用 Decimal 和 Fraction 值:" + +#: ../../library/statistics.rst:562 +msgid "" +">>> from decimal import Decimal as D\n" +">>> pvariance([D(\"27.5\"), D(\"30.25\"), D(\"30.25\"), D(\"34.5\"), D(\"41.75\")])\n" +"Decimal('24.815')\n" +"\n" +">>> from fractions import Fraction as F\n" +">>> pvariance([F(1, 4), F(5, 4), F(1, 2)])\n" +"Fraction(13, 72)" +msgstr "" +">>> from decimal import Decimal as D\n" +">>> pvariance([D(\"27.5\"), D(\"30.25\"), D(\"30.25\"), D(\"34.5\"), D(\"41.75\")])\n" +"Decimal('24.815')\n" +"\n" +">>> from fractions import Fraction as F\n" +">>> pvariance([F(1, 4), F(5, 4), F(1, 2)])\n" +"Fraction(13, 72)" + +#: ../../library/statistics.rst:574 +msgid "" +"When called with the entire population, this gives the population variance " +"σ². When called on a sample instead, this is the biased sample variance s²," +" also known as variance with N degrees of freedom." +msgstr "" +"当调用时附带完整的总体数据时,这将给出总体方差 σ²。而当调用时只附带一个样本时,这将给出偏置样本方差 s²,也被称为带有 N 个自由度的方差。" + +#: ../../library/statistics.rst:578 +msgid "" +"If you somehow know the true population mean μ, you may use this function to" +" calculate the variance of a sample, giving the known population mean as the" +" second argument. Provided the data points are a random sample of the " +"population, the result will be an unbiased estimate of the population " +"variance." +msgstr "" +"如果你通过某种方式知道了真实的总体平均值 μ,则可以使用此函数来计算一个样本的方差,并将已知的总体平均值作为第二个参数。 " +"假设数据点是总体的一个随机样本,则结果将为总体方差的无偏估计值。" + +#: ../../library/statistics.rst:587 +msgid "" +"Return the sample standard deviation (the square root of the sample " +"variance). See :func:`variance` for arguments and other details." +msgstr "返回样本标准差(样本方差的平方根)。请参阅 :func:`variance` 了解参数和其他细节。" + +#: ../../library/statistics.rst:590 +msgid "" +">>> stdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75])\n" +"1.0810874155219827" +msgstr "" +">>> stdev([1.5, 2.5, 2.5, 2.75, 3.25, 4.75])\n" +"1.0810874155219827" + +#: ../../library/statistics.rst:598 +msgid "" +"Return the sample variance of *data*, an iterable of at least two real-" +"valued numbers. Variance, or second moment about the mean, is a measure of " +"the variability (spread or dispersion) of data. A large variance indicates " +"that the data is spread out; a small variance indicates it is clustered " +"closely around the mean." +msgstr "" +"返回包含至少两个实数值的可迭代对象 *data* 的样本方差。方差或称相对于均值的二阶矩,是对数据变化幅度(延展度或分散度)的度量。 " +"方差值较大表明数据的散布范围较大;方差值较小表明它紧密聚集于均值附近。" + +#: ../../library/statistics.rst:604 +msgid "" +"If the optional second argument *xbar* is given, it should be the *sample* " +"mean of *data*. If it is missing or ``None`` (the default), the mean is " +"automatically calculated." +msgstr "" +"如果给出了可选的第二个参数 *xbar*,它应为 *data* 的 *样本* 均值。如果该参数省略或为 ``None`` " +"(默认值),则会自动进行均值计算。" + +#: ../../library/statistics.rst:608 +msgid "" +"Use this function when your data is a sample from a population. To calculate" +" the variance from the entire population, see :func:`pvariance`." +msgstr "当你的数据是总体数据的样本时请使用此函数。要根据整个总体数据来计算方差,请参见 :func:`pvariance`。" + +#: ../../library/statistics.rst:611 +msgid "Raises :exc:`StatisticsError` if *data* has fewer than two values." +msgstr "如果 *data* 包含的值少于两个则会引发 :exc:`StatisticsError`。" + +#: ../../library/statistics.rst:615 +msgid "" +">>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]\n" +">>> variance(data)\n" +"1.3720238095238095" +msgstr "" +">>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]\n" +">>> variance(data)\n" +"1.3720238095238095" + +#: ../../library/statistics.rst:621 +msgid "" +"If you have already calculated the sample mean of your data, you can pass it" +" as the optional second argument *xbar* to avoid recalculation:" +msgstr "如果你已经计算过数据的平均值,你可以将其作为可选的第二个参数 *xbar* 传入以避免重复计算:" + +#: ../../library/statistics.rst:624 +msgid "" +">>> m = mean(data)\n" +">>> variance(data, m)\n" +"1.3720238095238095" +msgstr "" +">>> m = mean(data)\n" +">>> variance(data, m)\n" +"1.3720238095238095" + +#: ../../library/statistics.rst:630 +msgid "" +"This function does not attempt to verify that you have passed the actual " +"mean as *xbar*. Using arbitrary values for *xbar* can lead to invalid or " +"impossible results." +msgstr "此函数不会试图检查你所传入的 *xbar* 是否为真实的平均值。使用任意值作为 *xbar* 可能导致无效或不可能的结果。" + +#: ../../library/statistics.rst:634 +msgid "Decimal and Fraction values are supported:" +msgstr "同样也支持使用 Decimal 和 Fraction 值:" + +#: ../../library/statistics.rst:636 +msgid "" +">>> from decimal import Decimal as D\n" +">>> variance([D(\"27.5\"), D(\"30.25\"), D(\"30.25\"), D(\"34.5\"), D(\"41.75\")])\n" +"Decimal('31.01875')\n" +"\n" +">>> from fractions import Fraction as F\n" +">>> variance([F(1, 6), F(1, 2), F(5, 3)])\n" +"Fraction(67, 108)" +msgstr "" +">>> from decimal import Decimal as D\n" +">>> variance([D(\"27.5\"), D(\"30.25\"), D(\"30.25\"), D(\"34.5\"), D(\"41.75\")])\n" +"Decimal('31.01875')\n" +"\n" +">>> from fractions import Fraction as F\n" +">>> variance([F(1, 6), F(1, 2), F(5, 3)])\n" +"Fraction(67, 108)" + +#: ../../library/statistics.rst:648 +msgid "" +"This is the sample variance s² with Bessel's correction, also known as " +"variance with N-1 degrees of freedom. Provided that the data points are " +"representative (e.g. independent and identically distributed), the result " +"should be an unbiased estimate of the true population variance." +msgstr "" +"这是附带贝塞尔校正的样本方差 s²,也称为具有 N-1 自由度的方差。假设数据点具有代表性(即为独立且均匀的分布),则结果应当是对总体方差的无偏估计。" + +#: ../../library/statistics.rst:653 +msgid "" +"If you somehow know the actual population mean μ you should pass it to the " +":func:`pvariance` function as the *mu* parameter to get the variance of a " +"sample." +msgstr "" +"如果你通过某种方式知道了真实的总体平均值 μ 则应当调用 :func:`pvariance` 函数并将该值作为 *mu* 形参传入以得到一个样本的方差。" + +#: ../../library/statistics.rst:659 +msgid "" +"Divide *data* into *n* continuous intervals with equal probability. Returns " +"a list of ``n - 1`` cut points separating the intervals." +msgstr "将 *data* 分隔为具有相等概率的 *n* 个连续区间。返回分隔这些区间的 ``n - 1`` 个分隔点的列表。" + +#: ../../library/statistics.rst:662 +msgid "" +"Set *n* to 4 for quartiles (the default). Set *n* to 10 for deciles. Set " +"*n* to 100 for percentiles which gives the 99 cuts points that separate " +"*data* into 100 equal sized groups. Raises :exc:`StatisticsError` if *n* is" +" not least 1." +msgstr "" +"将 *n* 设为 4 以使用四分位(默认值)。将 *n* 设为 10 以使用十分位。将 *n* 设为 100 以使用百分位,即给出 99 个分隔点来将 " +"*data* 分隔为 100 个大小相等的组。如果 *n* 小于 1 则将引发 :exc:`StatisticsError`。" + +#: ../../library/statistics.rst:667 +msgid "" +"The *data* can be any iterable containing sample data. For meaningful " +"results, the number of data points in *data* should be larger than *n*. " +"Raises :exc:`StatisticsError` if there is not at least one data point." +msgstr "" +"*data* 可以是包含样本数据的任意可迭代对象。为了获得有意义的结果,*data* 中数据点的数量应当大于 *n*。如果连一个数据点都没有则会引发 " +":exc:`StatisticsError`." + +#: ../../library/statistics.rst:671 +msgid "" +"The cut points are linearly interpolated from the two nearest data points. " +"For example, if a cut point falls one-third of the distance between two " +"sample values, ``100`` and ``112``, the cut-point will evaluate to ``104``." +msgstr "" +"分隔点是通过对两个最接近的数据点进行线性插值得到的。例如,如果一个分隔点落在两个样本值 ``100`` 和 ``112`` " +"之间距离三分之一的位置,则分隔点的取值将为 ``104``。" + +#: ../../library/statistics.rst:676 +msgid "" +"The *method* for computing quantiles can be varied depending on whether the " +"*data* includes or excludes the lowest and highest possible values from the " +"population." +msgstr "*method* 用于计算分位值,它会由于 *data* 是包含还是排除总体的最低和最高可能值而有所不同。" + +#: ../../library/statistics.rst:680 +msgid "" +"The default *method* is \"exclusive\" and is used for data sampled from a " +"population that can have more extreme values than found in the samples. The" +" portion of the population falling below the *i-th* of *m* sorted data " +"points is computed as ``i / (m + 1)``. Given nine sample values, the method" +" sorts them and assigns the following percentiles: 10%, 20%, 30%, 40%, 50%, " +"60%, 70%, 80%, 90%." +msgstr "" +" 并被用于数据从总体中采样的情况,此时总体可能有比样本中所发现的更极端的值。处于 *m* 个已排序数据点中 *第 i 个* 以下的总体部分会以 ``i " +"/ (m + 1)`` 来计算。给定九个样本值,该方法会将它们排序并赋予以下百分位:10%, 20%, 30%, 40%, 50%, 60%, 70%," +" 80%, 90%。" + +#: ../../library/statistics.rst:687 +msgid "" +"Setting the *method* to \"inclusive\" is used for describing population data" +" or for samples that are known to include the most extreme values from the " +"population. The minimum value in *data* is treated as the 0th percentile " +"and the maximum value is treated as the 100th percentile. The portion of the" +" population falling below the *i-th* of *m* sorted data points is computed " +"as ``(i - 1) / (m - 1)``. Given 11 sample values, the method sorts them and" +" assigns the following percentiles: 0%, 10%, 20%, 30%, 40%, 50%, 60%, 70%, " +"80%, 90%, 100%." +msgstr "" +"将 *method* 设为 \"inclusive\" 可用于描述总体数据或已明确知道包含有总体数据中最极端值的样本。 *data* " +"中的最小值会被作为第 0 个百分位而最大值会被作为第 100 个百分位。总体数据里处于 *m* 个已排序数据点中 *第 i 个* 以下的部分会以 " +"``(i - 1) / (m - 1)`` 来计算。给定 11 个样本值,该方法会对它们进行排序并赋予以下百分位:0%, 10%, 20%, 30%, " +"40%, 50%, 60%, 70%, 80%, 90%, 100%。" + +#: ../../library/statistics.rst:696 +msgid "" +"# Decile cut points for empirically sampled data\n" +">>> data = [105, 129, 87, 86, 111, 111, 89, 81, 108, 92, 110,\n" +"... 100, 75, 105, 103, 109, 76, 119, 99, 91, 103, 129,\n" +"... 106, 101, 84, 111, 74, 87, 86, 103, 103, 106, 86,\n" +"... 111, 75, 87, 102, 121, 111, 88, 89, 101, 106, 95,\n" +"... 103, 107, 101, 81, 109, 104]\n" +">>> [round(q, 1) for q in quantiles(data, n=10)]\n" +"[81.0, 86.2, 89.0, 99.4, 102.5, 103.6, 106.0, 109.8, 111.0]" +msgstr "" +"# Decile cut points for empirically sampled data\n" +">>> data = [105, 129, 87, 86, 111, 111, 89, 81, 108, 92, 110,\n" +"... 100, 75, 105, 103, 109, 76, 119, 99, 91, 103, 129,\n" +"... 106, 101, 84, 111, 74, 87, 86, 103, 103, 106, 86,\n" +"... 111, 75, 87, 102, 121, 111, 88, 89, 101, 106, 95,\n" +"... 103, 107, 101, 81, 109, 104]\n" +">>> [round(q, 1) for q in quantiles(data, n=10)]\n" +"[81.0, 86.2, 89.0, 99.4, 102.5, 103.6, 106.0, 109.8, 111.0]" + +#: ../../library/statistics.rst:709 +msgid "" +"No longer raises an exception for an input with only a single data point. " +"This allows quantile estimates to be built up one sample point at a time " +"becoming gradually more refined with each new data point." +msgstr "对于只有单个数据点的输入不会再引发异常。这允许分位点估计以每次一个样本点的方式建立并随着每个新数据点逐渐变得更为精细。" + +#: ../../library/statistics.rst:716 +msgid "" +"Return the sample covariance of two sequence inputs *x* and *y*. Covariance " +"is a measure of the joint variability of two inputs." +msgstr "" + +#: ../../library/statistics.rst:719 +msgid "" +"Both inputs must be of the same length (no less than two), otherwise " +":exc:`StatisticsError` is raised." +msgstr "两个输入必须具有相同的长度(不少于两个元素),否则会引发 :exc:`StatisticsError`。" + +#: ../../library/statistics.rst:724 +msgid "" +">>> x = [1, 2, 3, 4, 5, 6, 7, 8, 9]\n" +">>> y = [1, 2, 3, 1, 2, 3, 1, 2, 3]\n" +">>> covariance(x, y)\n" +"0.75\n" +">>> z = [9, 8, 7, 6, 5, 4, 3, 2, 1]\n" +">>> covariance(x, z)\n" +"-7.5\n" +">>> covariance(z, x)\n" +"-7.5" +msgstr "" +">>> x = [1, 2, 3, 4, 5, 6, 7, 8, 9]\n" +">>> y = [1, 2, 3, 1, 2, 3, 1, 2, 3]\n" +">>> covariance(x, y)\n" +"0.75\n" +">>> z = [9, 8, 7, 6, 5, 4, 3, 2, 1]\n" +">>> covariance(x, z)\n" +"-7.5\n" +">>> covariance(z, x)\n" +"-7.5" + +#: ../../library/statistics.rst:740 +msgid "" +"Return the `Pearson's correlation coefficient " +"`_ for two " +"sequence inputs. Pearson's correlation coefficient *r* takes values between " +"-1 and +1. It measures the strength and direction of a linear relationship." +msgstr "" + +#: ../../library/statistics.rst:746 +msgid "" +"If *method* is \"ranked\", computes `Spearman's rank correlation coefficient" +" `_" +" for two inputs. The data is replaced by ranks. Ties are averaged so that " +"equal values receive the same rank. The resulting coefficient measures the " +"strength of a monotonic relationship." +msgstr "" +"如果 *method* 为 \"ranked\",则计算两个输入的 `斯皮尔曼等级相关系数 " +"`_." +" 数据将被替换为等级。同级的值将被平均因此相同的值将得到相同的等级。结果系数衡量的是单调关系的强度。" + +#: ../../library/statistics.rst:752 +msgid "" +"Spearman's correlation coefficient is appropriate for ordinal data or for " +"continuous data that doesn't meet the linear proportion requirement for " +"Pearson's correlation coefficient." +msgstr "斯皮尔曼相关系数适用于有序数据或不满足皮尔逊相关系数的线性比例要求的连续数据。" + +#: ../../library/statistics.rst:756 +msgid "" +"Both inputs must be of the same length (no less than two), and need not to " +"be constant, otherwise :exc:`StatisticsError` is raised." +msgstr "两个输入必须具有相同的长度(不少于两个元素),并且不必为常量,否则会引发 :exc:`StatisticsError`。" + +#: ../../library/statistics.rst:759 +msgid "" +"Example with `Kepler's laws of planetary motion " +"`_:" +msgstr "" +"使用 `开普勒行星运动定律 " +"`_ 的示例:" + +#: ../../library/statistics.rst:762 +msgid "" +">>> # Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, and Neptune\n" +">>> orbital_period = [88, 225, 365, 687, 4331, 10_756, 30_687, 60_190] # days\n" +">>> dist_from_sun = [58, 108, 150, 228, 778, 1_400, 2_900, 4_500] # million km\n" +"\n" +">>> # Show that a perfect monotonic relationship exists\n" +">>> correlation(orbital_period, dist_from_sun, method='ranked')\n" +"1.0\n" +"\n" +">>> # Observe that a linear relationship is imperfect\n" +">>> round(correlation(orbital_period, dist_from_sun), 4)\n" +"0.9882\n" +"\n" +">>> # Demonstrate Kepler's third law: There is a linear correlation\n" +">>> # between the square of the orbital period and the cube of the\n" +">>> # distance from the sun.\n" +">>> period_squared = [p * p for p in orbital_period]\n" +">>> dist_cubed = [d * d * d for d in dist_from_sun]\n" +">>> round(correlation(period_squared, dist_cubed), 4)\n" +"1.0" +msgstr "" +">>> # 水星、金星、地球、火星、木星、土星、天王星和海王星\n" +">>> orbital_period = [88, 225, 365, 687, 4331, 10_756, 30_687, 60_190] # 天\n" +">>> dist_from_sun = [58, 108, 150, 228, 778, 1_400, 2_900, 4_500] # 百万公里\n" +"\n" +">>> # 显示存在完美的单调关系\n" +">>> correlation(orbital_period, dist_from_sun, method='ranked')\n" +"1.0\n" +"\n" +">>> # 表明存在不完美的线性关系\n" +">>> round(correlation(orbital_period, dist_from_sun), 4)\n" +"0.9882\n" +"\n" +">>> # 体现开普勒第三定律:公转周期的\n" +">>> # 平方与到太阳距离的立方之间存在\n" +">>> # 线性对应关系\n" +">>> period_squared = [p * p for p in orbital_period]\n" +">>> dist_cubed = [d * d * d for d in dist_from_sun]\n" +">>> round(correlation(period_squared, dist_cubed), 4)\n" +"1.0" + +#: ../../library/statistics.rst:786 +msgid "Added support for Spearman's rank correlation coefficient." +msgstr "增加了对斯皮尔曼等级相关系数的支持。" + +#: ../../library/statistics.rst:791 +msgid "" +"Return the slope and intercept of `simple linear regression " +"`_ parameters " +"estimated using ordinary least squares. Simple linear regression describes " +"the relationship between an independent variable *x* and a dependent " +"variable *y* in terms of this linear function:" +msgstr "" +"返回使用普通最小二乘法估计得到的 `简单线性回归 " +"`_ 参数的斜率和截距。 " +"简单线性回归通过此线性函数来描述自变量 *x* 和因变量 *y* 之间的关系。" + +#: ../../library/statistics.rst:797 +msgid "*y = slope \\* x + intercept + noise*" +msgstr "*y = slope \\* x + intercept + noise*" + +#: ../../library/statistics.rst:799 +msgid "" +"where ``slope`` and ``intercept`` are the regression parameters that are " +"estimated, and ``noise`` represents the variability of the data that was not" +" explained by the linear regression (it is equal to the difference between " +"predicted and actual values of the dependent variable)." +msgstr "" +"其中 ``slope`` 和 ``intercept`` 是估计得到的回归参数,而 ``noise`` " +"代表不可由线性回归解释的数据变异性(它等于因变量的预测值和实际值之间的差异)。" + +#: ../../library/statistics.rst:805 +msgid "" +"Both inputs must be sequences of the same length (no less than two), and the" +" independent variable *x* cannot be constant; otherwise a " +":exc:`StatisticsError` is raised." +msgstr "" + +#: ../../library/statistics.rst:809 +msgid "" +"For example, we can use the `release dates of the Monty Python films " +"`_ to predict the " +"cumulative number of Monty Python films that would have been produced by " +"2019 assuming that they had kept the pace." +msgstr "" +"例如,我们可以使用 `Monty Python 系列电影的发布日期 " +"`_ 在假定出品方保持现有步调的情况下预测到 " +"2019 年时产出的 Monty Python 电影的累计数量。" + +#: ../../library/statistics.rst:815 +msgid "" +">>> year = [1971, 1975, 1979, 1982, 1983]\n" +">>> films_total = [1, 2, 3, 4, 5]\n" +">>> slope, intercept = linear_regression(year, films_total)\n" +">>> round(slope * 2019 + intercept)\n" +"16" +msgstr "" +">>> year = [1971, 1975, 1979, 1982, 1983]\n" +">>> films_total = [1, 2, 3, 4, 5]\n" +">>> slope, intercept = linear_regression(year, films_total)\n" +">>> round(slope * 2019 + intercept)\n" +"16" + +#: ../../library/statistics.rst:823 +msgid "" +"If *proportional* is true, the independent variable *x* and the dependent " +"variable *y* are assumed to be directly proportional. The data is fit to a " +"line passing through the origin. Since the *intercept* will always be 0.0, " +"the underlying linear function simplifies to:" +msgstr "" +"如果 *proportional* 为真值,则自变量 *x* 和因变量 *y* 将被视为成正比关系。数据会被拟合到一条通过原点的直线上。由于 " +"*intercept* 将始终为 0.0,因此下层的线性函数会简化为:" + +#: ../../library/statistics.rst:829 +msgid "*y = slope \\* x + noise*" +msgstr "*y = slope \\* x + noise*" + +#: ../../library/statistics.rst:831 +msgid "" +"Continuing the example from :func:`correlation`, we look to see how well a " +"model based on major planets can predict the orbital distances for dwarf " +"planets:" +msgstr "继续 :func:`correlation` 的例子,我们来看看基于大行星的模型是否能很好地预测矮行星的轨道距离:" + +#: ../../library/statistics.rst:835 +msgid "" +">>> model = linear_regression(period_squared, dist_cubed, proportional=True)\n" +">>> slope = model.slope\n" +"\n" +">>> # Dwarf planets: Pluto, Eris, Makemake, Haumea, Ceres\n" +">>> orbital_periods = [90_560, 204_199, 111_845, 103_410, 1_680] # days\n" +">>> predicted_dist = [math.cbrt(slope * (p * p)) for p in orbital_periods]\n" +">>> list(map(round, predicted_dist))\n" +"[5912, 10166, 6806, 6459, 414]\n" +"\n" +">>> [5_906, 10_152, 6_796, 6_450, 414] # actual distance in million km\n" +"[5906, 10152, 6796, 6450, 414]" +msgstr "" +">>> model = linear_regression(period_squared, dist_cubed, proportional=True)\n" +">>> slope = model.slope\n" +"\n" +">>> # 矮行星:冥王星、阋神星、鸟神星、妊神星、谷神星\n" +">>> orbital_periods = [90_560, 204_199, 111_845, 103_410, 1_680] # days\n" +">>> predicted_dist = [math.cbrt(slope * (p * p)) for p in orbital_periods]\n" +">>> list(map(round, predicted_dist))\n" +"[5912, 10166, 6806, 6459, 414]\n" +"\n" +">>> [5_906, 10_152, 6_796, 6_450, 414] # 以百万公里表示的实际距离\n" +"[5906, 10152, 6796, 6450, 414]" + +#: ../../library/statistics.rst:851 +msgid "Added support for *proportional*." +msgstr "添加了对 *proportional* 的支持。" + +#: ../../library/statistics.rst:855 +msgid "Exceptions" +msgstr "异常" + +#: ../../library/statistics.rst:857 +msgid "A single exception is defined:" +msgstr "只定义了一个异常:" + +#: ../../library/statistics.rst:861 +msgid "Subclass of :exc:`ValueError` for statistics-related exceptions." +msgstr ":exc:`ValueError` 的子类,表示统计相关的异常。" + +#: ../../library/statistics.rst:865 +msgid ":class:`NormalDist` objects" +msgstr ":class:`NormalDist` 对象" + +#: ../../library/statistics.rst:867 +msgid "" +":class:`NormalDist` is a tool for creating and manipulating normal " +"distributions of a `random variable " +"`_. It is a class " +"that treats the mean and standard deviation of data measurements as a single" +" entity." +msgstr "" +":class:`NormalDist` 工具可用于创建和操纵 `随机变量 " +"`_ 的正态分布。 " +"这个类将数据度量值的平均值和标准差作为单一实体来处理。" + +#: ../../library/statistics.rst:873 +msgid "" +"Normal distributions arise from the `Central Limit Theorem " +"`_ and have a wide " +"range of applications in statistics." +msgstr "" +"正态分布的概念来自于 `中心极限定理 `_ " +"并且在统计学中有广泛的应用。" + +#: ../../library/statistics.rst:879 +msgid "" +"Returns a new *NormalDist* object where *mu* represents the `arithmetic mean" +" `_ and *sigma* represents " +"the `standard deviation " +"`_." +msgstr "" +"返回一个新的 *NormalDist* 对象,其中 *mu* 代表 `算术平均值 " +"`_ 而 *sigma* 代表 `标准差 " +"`_." + +#: ../../library/statistics.rst:884 +msgid "If *sigma* is negative, raises :exc:`StatisticsError`." +msgstr "若 *sigma* 为负数,将会引发 :exc:`StatisticsError`。" + +#: ../../library/statistics.rst:888 +msgid "" +"A read-only property for the `arithmetic mean " +"`_ of a normal distribution." +msgstr "" +"一个只读特征属性,表示特定正态分布的 `算术平均值 `_。" + +#: ../../library/statistics.rst:894 +msgid "" +"A read-only property for the `median " +"`_ of a normal distribution." +msgstr "一个只读特征属性,表示特定正态分布的 `中位数 `_。" + +#: ../../library/statistics.rst:900 +msgid "" +"A read-only property for the `mode " +"`_ of a normal " +"distribution." +msgstr "" +"一个只读特征属性,表示特定正态分布的 `众数 `_。" + +#: ../../library/statistics.rst:906 +msgid "" +"A read-only property for the `standard deviation " +"`_ of a normal " +"distribution." +msgstr "" +"一个只读特征属性,表示特定正态分布的 `标准差 " +"`_." + +#: ../../library/statistics.rst:912 +msgid "" +"A read-only property for the `variance " +"`_ of a normal distribution. Equal " +"to the square of the standard deviation." +msgstr "" +"一个只读特征属性,表示特定正态分布的 `方差 `_。等于标准差的平方。" + +#: ../../library/statistics.rst:918 +msgid "" +"Makes a normal distribution instance with *mu* and *sigma* parameters " +"estimated from the *data* using :func:`fmean` and :func:`stdev`." +msgstr "" +"传入使用 :func:`fmean` 和 :func:`stdev` 基于 *data* 估算出的 *mu* 和 *sigma* " +"形参创建一个正态分布实例。" + +#: ../../library/statistics.rst:921 +msgid "" +"The *data* can be any :term:`iterable` and should consist of values that can" +" be converted to type :class:`float`. If *data* does not contain at least " +"two elements, raises :exc:`StatisticsError` because it takes at least one " +"point to estimate a central value and at least two points to estimate " +"dispersion." +msgstr "" +"*data* 可以是任何 :term:`iterable` 并且应当包含能被转换为 :class:`float` 类型的值。如果 *data* " +"不包含至少两个元素,则会引发 :exc:`StatisticsError`,因为估算中心值至少需要一个点而估算分散度至少需要两个点。" + +#: ../../library/statistics.rst:929 +msgid "" +"Generates *n* random samples for a given mean and standard deviation. " +"Returns a :class:`list` of :class:`float` values." +msgstr "对于给定的平均值和标准差生成 *n* 个随机样本。返回一个由 :class:`float` 值组成的 :class:`list`。" + +#: ../../library/statistics.rst:932 +msgid "" +"If *seed* is given, creates a new instance of the underlying random number " +"generator. This is useful for creating reproducible results, even in a " +"multi-threading context." +msgstr "当给定 *seed* 时,创建一个新的底层随机数生成器实例。这适用于创建可重现的结果,即使对于多线程上下文也有效。" + +#: ../../library/statistics.rst:938 +msgid "" +"Switched to a faster algorithm. To reproduce samples from previous " +"versions, use :func:`random.seed` and :func:`random.gauss`." +msgstr "" +"切换为更快速的算法。要重新产生来自之前版本的样本,请使用 :func:`random.seed` 和 :func:`random.gauss`。" + +#: ../../library/statistics.rst:943 +msgid "" +"Using a `probability density function (pdf) " +"`_, compute the " +"relative likelihood that a random variable *X* will be near the given value " +"*x*. Mathematically, it is the limit of the ratio ``P(x <= X < x+dx) / dx``" +" as *dx* approaches zero." +msgstr "" +"使用 `概率密度函数 (pdf) " +"`_,计算一个随机变量 *X* " +"趋向于给定值 *x* 的相对可能性。在数学意义上,它是当 *dx* 趋向于零时比率 ``P(x <= X < x+dx) / dx`` 的极限。" + +#: ../../library/statistics.rst:949 +msgid "" +"The relative likelihood is computed as the probability of a sample occurring" +" in a narrow range divided by the width of the range (hence the word " +"\"density\"). Since the likelihood is relative to other points, its value " +"can be greater than ``1.0``." +msgstr "" +"相对可能性的计算方法是用一个狭窄区间内某个样本出现的概率除以区间的宽度(因此使用 \"density\" 一词)。 " +"由于可能性是相对于其他点的,因此它的值可以大于 ``1.0``。" + +#: ../../library/statistics.rst:956 +msgid "" +"Using a `cumulative distribution function (cdf) " +"`_, compute " +"the probability that a random variable *X* will be less than or equal to " +"*x*. Mathematically, it is written ``P(X <= x)``." +msgstr "" +"使用 `累积分布函数 (cdf) " +"`_,计算一个随机变量 " +"*X* 小于等于 *x* 的概率。在数学上,它表示为 ``P(X <= x)``。" + +#: ../../library/statistics.rst:963 +msgid "" +"Compute the inverse cumulative distribution function, also known as the " +"`quantile function `_ or " +"the `percent-point " +"`_ function. Mathematically, it is written ``x : P(X" +" <= x) = p``." +msgstr "" +"计算逆累积分布函数,也称为 `分位数函数 `_ 或 " +"`百分点 " +"`_ 函数。在数学上,它表示为 ``x : P(X <= x) = p``。" + +#: ../../library/statistics.rst:969 +msgid "" +"Finds the value *x* of the random variable *X* such that the probability of " +"the variable being less than or equal to that value equals the given " +"probability *p*." +msgstr "找出随机变量 *X* 的值 *x* 使得该变量小于等于该值的概率等于给定的概率 *p*。" + +#: ../../library/statistics.rst:975 +msgid "" +"Measures the agreement between two normal probability distributions. Returns" +" a value between 0.0 and 1.0 giving `the overlapping area for the two " +"probability density functions `_." +msgstr "" +"测量两个正态概率分布之间的一致性。返回介于 0.0 和 1.0 之间的值,给出 `两个概率密度函数的重叠区域 " +"`_." + +#: ../../library/statistics.rst:982 +msgid "" +"Divide the normal distribution into *n* continuous intervals with equal " +"probability. Returns a list of (n - 1) cut points separating the intervals." +msgstr "将指定正态分布划分为 *n* 个相等概率的连续分隔区。返回这些分隔区对应的 (n - 1) 个分隔点的列表。" + +#: ../../library/statistics.rst:986 +msgid "" +"Set *n* to 4 for quartiles (the default). Set *n* to 10 for deciles. Set " +"*n* to 100 for percentiles which gives the 99 cuts points that separate the " +"normal distribution into 100 equal sized groups." +msgstr "" +"将 *n* 设为 4 以使用四分位(默认值)。将 *n* 设为 10 以使用十分位。将 *n* 设为 100 以使用百分位,即给出 99 " +"个分隔点来将正态分布分隔为 100 个大小相等的组。" + +#: ../../library/statistics.rst:992 +msgid "" +"Compute the `Standard Score `_ describing *x* in terms of the number of standard" +" deviations above or below the mean of the normal distribution: ``(x - mean)" +" / stdev``." +msgstr "" +"计算 `标准分 `_ 即以高于或低于正态分布的平均值的标准差数值的形式来描述 *x*: ``(x - mean) / " +"stdev``." + +#: ../../library/statistics.rst:1000 +msgid "" +"Instances of :class:`NormalDist` support addition, subtraction, " +"multiplication and division by a constant. These operations are used for " +"translation and scaling. For example:" +msgstr ":class:`NormalDist` 的实例支持加上、减去、乘以或除以一个常量。这些运算被用于转换和缩放。例如:" + +#: ../../library/statistics.rst:1004 +msgid "" +">>> temperature_february = NormalDist(5, 2.5) # Celsius\n" +">>> temperature_february * (9/5) + 32 # Fahrenheit\n" +"NormalDist(mu=41.0, sigma=4.5)" +msgstr "" +">>> temperature_february = NormalDist(5, 2.5) # 摄氏度\n" +">>> temperature_february * (9/5) + 32 # 华氏度\n" +"NormalDist(mu=41.0, sigma=4.5)" + +#: ../../library/statistics.rst:1010 +msgid "" +"Dividing a constant by an instance of :class:`NormalDist` is not supported " +"because the result wouldn't be normally distributed." +msgstr "不允许一个常量除以 :class:`NormalDist` 的实例,因为结果将不是正态分布。" + +#: ../../library/statistics.rst:1013 +msgid "" +"Since normal distributions arise from additive effects of independent " +"variables, it is possible to `add and subtract two independent normally " +"distributed random variables " +"`_" +" represented as instances of :class:`NormalDist`. For example:" +msgstr "" +"由于正态分布是由独立变量的累加效应产生的,因此允许表示为 :class:`NormalDist` 实例的 `两组独立正态分布的随机变量相加和相减 " +"`_." +" 例如:" + +#: ../../library/statistics.rst:1019 +msgid "" +">>> birth_weights = NormalDist.from_samples([2.5, 3.1, 2.1, 2.4, 2.7, 3.5])\n" +">>> drug_effects = NormalDist(0.4, 0.15)\n" +">>> combined = birth_weights + drug_effects\n" +">>> round(combined.mean, 1)\n" +"3.1\n" +">>> round(combined.stdev, 1)\n" +"0.5" +msgstr "" +">>> birth_weights = NormalDist.from_samples([2.5, 3.1, 2.1, 2.4, 2.7, 3.5])\n" +">>> drug_effects = NormalDist(0.4, 0.15)\n" +">>> combined = birth_weights + drug_effects\n" +">>> round(combined.mean, 1)\n" +"3.1\n" +">>> round(combined.stdev, 1)\n" +"0.5" + +#: ../../library/statistics.rst:1033 +msgid "Examples and Recipes" +msgstr "例子和配方" + +#: ../../library/statistics.rst:1037 +msgid "Classic probability problems" +msgstr "经典概率问题" + +#: ../../library/statistics.rst:1039 +msgid ":class:`NormalDist` readily solves classic probability problems." +msgstr ":class:`NormalDist` 适合用来解决经典概率问题。" + +#: ../../library/statistics.rst:1041 +msgid "" +"For example, given `historical data for SAT exams " +"`_ showing " +"that scores are normally distributed with a mean of 1060 and a standard " +"deviation of 195, determine the percentage of students with test scores " +"between 1100 and 1200, after rounding to the nearest whole number:" +msgstr "" +"举例来说,如果 `SAT 考试的历史数据 " +"`_ 显示分数呈平均值为" +" 1060 且标准差为 195 的正态分布,则可以确定考试分数处于 1100 和 1200 之间的学生的百分比舍入到最接近的整数应为:" + +#: ../../library/statistics.rst:1047 +msgid "" +">>> sat = NormalDist(1060, 195)\n" +">>> fraction = sat.cdf(1200 + 0.5) - sat.cdf(1100 - 0.5)\n" +">>> round(fraction * 100.0, 1)\n" +"18.4" +msgstr "" +">>> sat = NormalDist(1060, 195)\n" +">>> fraction = sat.cdf(1200 + 0.5) - sat.cdf(1100 - 0.5)\n" +">>> round(fraction * 100.0, 1)\n" +"18.4" + +#: ../../library/statistics.rst:1054 +msgid "" +"Find the `quartiles `_ and `deciles " +"`_ for the SAT scores:" +msgstr "" +"求 SAT 分数的 `四分位 `_ 和 `十分位 " +"`_:" + +#: ../../library/statistics.rst:1057 +msgid "" +">>> list(map(round, sat.quantiles()))\n" +"[928, 1060, 1192]\n" +">>> list(map(round, sat.quantiles(n=10)))\n" +"[810, 896, 958, 1011, 1060, 1109, 1162, 1224, 1310]" +msgstr "" +">>> list(map(round, sat.quantiles()))\n" +"[928, 1060, 1192]\n" +">>> list(map(round, sat.quantiles(n=10)))\n" +"[810, 896, 958, 1011, 1060, 1109, 1162, 1224, 1310]" + +#: ../../library/statistics.rst:1066 +msgid "Monte Carlo inputs for simulations" +msgstr "蒙特卡罗模拟输入" + +#: ../../library/statistics.rst:1068 +msgid "" +"To estimate the distribution for a model that isn't easy to solve " +"analytically, :class:`NormalDist` can generate input samples for a `Monte " +"Carlo simulation `_:" +msgstr "" +"为了估算一个不易获得解析解的模型分布,:class:`NormalDist` 可以生成用于 `蒙特卡洛模拟 " +"`_ 的输入样本:" + +#: ../../library/statistics.rst:1072 +msgid "" +">>> def model(x, y, z):\n" +"... return (3*x + 7*x*y - 5*y) / (11 * z)\n" +"...\n" +">>> n = 100_000\n" +">>> X = NormalDist(10, 2.5).samples(n, seed=3652260728)\n" +">>> Y = NormalDist(15, 1.75).samples(n, seed=4582495471)\n" +">>> Z = NormalDist(50, 1.25).samples(n, seed=6582483453)\n" +">>> quantiles(map(model, X, Y, Z))\n" +"[1.4591308524824727, 1.8035946855390597, 2.175091447274739]" +msgstr "" +">>> def model(x, y, z):\n" +"... return (3*x + 7*x*y - 5*y) / (11 * z)\n" +"...\n" +">>> n = 100_000\n" +">>> X = NormalDist(10, 2.5).samples(n, seed=3652260728)\n" +">>> Y = NormalDist(15, 1.75).samples(n, seed=4582495471)\n" +">>> Z = NormalDist(50, 1.25).samples(n, seed=6582483453)\n" +">>> quantiles(map(model, X, Y, Z))\n" +"[1.4591308524824727, 1.8035946855390597, 2.175091447274739]" + +#: ../../library/statistics.rst:1085 +msgid "Approximating binomial distributions" +msgstr "近似二项分布" + +#: ../../library/statistics.rst:1087 +msgid "" +"Normal distributions can be used to approximate `Binomial distributions " +"`_ when the sample " +"size is large and when the probability of a successful trial is near 50%." +msgstr "" +"当样本量较大且成功试验的可能性接近 50% 时,正态分布可以被用来模拟 `二项式分布 " +"`_ ." + +#: ../../library/statistics.rst:1092 +msgid "" +"For example, an open source conference has 750 attendees and two rooms with " +"a 500 person capacity. There is a talk about Python and another about Ruby." +" In previous conferences, 65% of the attendees preferred to listen to Python" +" talks. Assuming the population preferences haven't changed, what is the " +"probability that the Python room will stay within its capacity limits?" +msgstr "" +"例如,一次开源会议有 750 名与会者和两个可分别容纳 500 人的会议厅。会上有一场关于 Python 的演讲和一场关于 Ruby 的演讲。 " +"在往届会议中,65% 的与会者更愿意去听关于 Python 的演讲。假定人群的偏好没有发生改变,那么 Python " +"演讲的会议厅不超出其容量上限的可能性是多少?" + +#: ../../library/statistics.rst:1098 +msgid "" +">>> n = 750 # Sample size\n" +">>> p = 0.65 # Preference for Python\n" +">>> q = 1.0 - p # Preference for Ruby\n" +">>> k = 500 # Room capacity\n" +"\n" +">>> # Approximation using the cumulative normal distribution\n" +">>> from math import sqrt\n" +">>> round(NormalDist(mu=n*p, sigma=sqrt(n*p*q)).cdf(k + 0.5), 4)\n" +"0.8402\n" +"\n" +">>> # Exact solution using the cumulative binomial distribution\n" +">>> from math import comb, fsum\n" +">>> round(fsum(comb(n, r) * p**r * q**(n-r) for r in range(k+1)), 4)\n" +"0.8402\n" +"\n" +">>> # Approximation using a simulation\n" +">>> from random import seed, binomialvariate\n" +">>> seed(8675309)\n" +">>> mean(binomialvariate(n, p) <= k for i in range(10_000))\n" +"0.8406" +msgstr "" +">>> n = 750 # 样本大小\n" +">>> p = 0.65 # 对 Python 的偏好\n" +">>> q = 1.0 - p # 对 Ruby 的偏好\n" +">>> k = 500 # 空间容量\n" +"\n" +">>> # 使用累积正态分布的近似解\n" +">>> from math import sqrt\n" +">>> round(NormalDist(mu=n*p, sigma=sqrt(n*p*q)).cdf(k + 0.5), 4)\n" +"0.8402\n" +"\n" +">>> # 使用累积二项分布的精确解\n" +">>> from math import comb, fsum\n" +">>> round(fsum(comb(n, r) * p**r * q**(n-r) for r in range(k+1)), 4)\n" +"0.8402\n" +"\n" +">>> # 使用随机模拟的近似解\n" +">>> from random import seed, binomialvariate\n" +">>> seed(8675309)\n" +">>> mean(binomialvariate(n, p) <= k for i in range(10_000))\n" +"0.8406" + +#: ../../library/statistics.rst:1123 +msgid "Naive bayesian classifier" +msgstr "朴素贝叶斯分类器" + +#: ../../library/statistics.rst:1125 +msgid "Normal distributions commonly arise in machine learning problems." +msgstr "在机器学习问题中也经常会出现正态分布。" + +#: ../../library/statistics.rst:1127 +msgid "" +"Wikipedia has a `nice example of a Naive Bayesian Classifier " +"`_." +" The challenge is to predict a person's gender from measurements of normally" +" distributed features including height, weight, and foot size." +msgstr "" +"维基百科上有一个 `朴素贝叶斯分类器的良好样例 " +"`_." +" 要处理的问题是根据对正态分布的特征测量值包括身高、体重和足部尺码来预测一个人的性别。" + +#: ../../library/statistics.rst:1132 +msgid "" +"We're given a training dataset with measurements for eight people. The " +"measurements are assumed to be normally distributed, so we summarize the " +"data with :class:`NormalDist`:" +msgstr "我们得到了由八个人的测量值组成的训练数据集。假定这些测量值是正态分布的,因此我们用 :class:`NormalDist` 来总结数据:" + +#: ../../library/statistics.rst:1136 +msgid "" +">>> height_male = NormalDist.from_samples([6, 5.92, 5.58, 5.92])\n" +">>> height_female = NormalDist.from_samples([5, 5.5, 5.42, 5.75])\n" +">>> weight_male = NormalDist.from_samples([180, 190, 170, 165])\n" +">>> weight_female = NormalDist.from_samples([100, 150, 130, 150])\n" +">>> foot_size_male = NormalDist.from_samples([12, 11, 12, 10])\n" +">>> foot_size_female = NormalDist.from_samples([6, 8, 7, 9])" +msgstr "" +">>> height_male = NormalDist.from_samples([6, 5.92, 5.58, 5.92])\n" +">>> height_female = NormalDist.from_samples([5, 5.5, 5.42, 5.75])\n" +">>> weight_male = NormalDist.from_samples([180, 190, 170, 165])\n" +">>> weight_female = NormalDist.from_samples([100, 150, 130, 150])\n" +">>> foot_size_male = NormalDist.from_samples([12, 11, 12, 10])\n" +">>> foot_size_female = NormalDist.from_samples([6, 8, 7, 9])" + +#: ../../library/statistics.rst:1145 +msgid "" +"Next, we encounter a new person whose feature measurements are known but " +"whose gender is unknown:" +msgstr "接下来,我们遇到一个特征测量值已知但性别未知的新人:" + +#: ../../library/statistics.rst:1148 +msgid "" +">>> ht = 6.0 # height\n" +">>> wt = 130 # weight\n" +">>> fs = 8 # foot size" +msgstr "" +">>> ht = 6.0 # 身高\n" +">>> wt = 130 # 体重\n" +">>> fs = 8 # 足部尺码" + +#: ../../library/statistics.rst:1154 +msgid "" +"Starting with a 50% `prior probability " +"`_ of being male or female," +" we compute the posterior as the prior times the product of likelihoods for " +"the feature measurements given the gender:" +msgstr "" +"从是男是女各 50% 的 `先验概率 `_ " +"出发,我们通过将该先验概率乘以给定性别的特征度量值的可能性累积值来计算后验概率:" + +#: ../../library/statistics.rst:1159 +msgid "" +">>> prior_male = 0.5\n" +">>> prior_female = 0.5\n" +">>> posterior_male = (prior_male * height_male.pdf(ht) *\n" +"... weight_male.pdf(wt) * foot_size_male.pdf(fs))\n" +"\n" +">>> posterior_female = (prior_female * height_female.pdf(ht) *\n" +"... weight_female.pdf(wt) * foot_size_female.pdf(fs))" +msgstr "" +">>> prior_male = 0.5\n" +">>> prior_female = 0.5\n" +">>> posterior_male = (prior_male * height_male.pdf(ht) *\n" +"... weight_male.pdf(wt) * foot_size_male.pdf(fs))\n" +"\n" +">>> posterior_female = (prior_female * height_female.pdf(ht) *\n" +"... weight_female.pdf(wt) * foot_size_female.pdf(fs))" + +#: ../../library/statistics.rst:1169 +msgid "" +"The final prediction goes to the largest posterior. This is known as the " +"`maximum a posteriori " +"`_ or MAP:" +msgstr "" +"最终预测值应为最大后验概率值。这种算法被称为 `maximum a posteriori " +"`_ 或 MAP:" + +#: ../../library/statistics.rst:1173 +msgid "" +">>> 'male' if posterior_male > posterior_female else 'female'\n" +"'female'" +msgstr "" +">>> 'male' if posterior_male > posterior_female else 'female'\n" +"'female'" diff --git a/library/stdtypes.po b/library/stdtypes.po new file mode 100644 index 0000000000..1599fa1e57 --- /dev/null +++ b/library/stdtypes.po @@ -0,0 +1,11196 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-06-09 17:19+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/stdtypes.rst:8 +msgid "Built-in Types" +msgstr "内置类型" + +#: ../../library/stdtypes.rst:10 +msgid "" +"The following sections describe the standard types that are built into the " +"interpreter." +msgstr "以下部分描述了解释器中内置的标准类型。" + +#: ../../library/stdtypes.rst:15 +msgid "" +"The principal built-in types are numerics, sequences, mappings, classes, " +"instances and exceptions." +msgstr "主要内置类型有数字、序列、映射、类、实例和异常。" + +#: ../../library/stdtypes.rst:18 +msgid "" +"Some collection classes are mutable. The methods that add, subtract, or " +"rearrange their members in place, and don't return a specific item, never " +"return the collection instance itself but ``None``." +msgstr "" +"有些多项集类是可变的。它们用于添加、移除或重排其成员的方法将原地执行,并不返回特定的项,绝对不会返回多项集实例自身而是返回 ``None``。" + +#: ../../library/stdtypes.rst:22 +msgid "" +"Some operations are supported by several object types; in particular, " +"practically all objects can be compared for equality, tested for truth " +"value, and converted to a string (with the :func:`repr` function or the " +"slightly different :func:`str` function). The latter function is implicitly" +" used when an object is written by the :func:`print` function." +msgstr "" +"有些操作受多种对象类型的支持;特别地,实际上所有对象都可以比较是否相等、检测逻辑值,以及转换为字符串(使用 :func:`repr` 函数或略有差异的 " +":func:`str` 函数)。后一个函数是在对象由 :func:`print` 函数输出时被隐式地调用的。" + +#: ../../library/stdtypes.rst:32 +msgid "Truth Value Testing" +msgstr "逻辑值检测" + +#: ../../library/stdtypes.rst:41 +msgid "" +"Any object can be tested for truth value, for use in an :keyword:`if` or " +":keyword:`while` condition or as operand of the Boolean operations below." +msgstr "" +"任何对象都可以进行逻辑值的检测,以便在 :keyword:`if` 或 :keyword:`while` " +"作为条件或是作为下文所述布尔运算的操作数来使用。" + +#: ../../library/stdtypes.rst:46 +msgid "" +"By default, an object is considered true unless its class defines either a " +":meth:`~object.__bool__` method that returns ``False`` or a " +":meth:`~object.__len__` method that returns zero, when called with the " +"object. [1]_ If one of the methods raises an exception when called, the " +"exception is propagated and the object does not have a truth value (for " +"example, :data:`NotImplemented`). Here are most of the built-in objects " +"considered false:" +msgstr "" +"在默认情况下,一个对象会被视为具有真值,除非其所属的类在该对象上调用时,定义了 :meth:`~object.__bool__` 方法返回 " +"``False`` 或 :meth:`~object.__len__` 方法返回零。 [1]_ " +"如果其中某一方法被调用时引发了异常,该异常将被传播并且该对象将不具有真值 (例如 :data:`NotImplemented`)。 " +"以下基本完整地列出了具有假值的内置对象:" + +#: ../../library/stdtypes.rst:58 +msgid "constants defined to be false: ``None`` and ``False``" +msgstr "被定义为假值的常量: ``None`` 和 ``False``" + +#: ../../library/stdtypes.rst:60 +msgid "" +"zero of any numeric type: ``0``, ``0.0``, ``0j``, ``Decimal(0)``, " +"``Fraction(0, 1)``" +msgstr "任何数值类型的零: ``0``, ``0.0``, ``0j``, ``Decimal(0)``, ``Fraction(0, 1)``" + +#: ../../library/stdtypes.rst:63 +msgid "" +"empty sequences and collections: ``''``, ``()``, ``[]``, ``{}``, ``set()``, " +"``range(0)``" +msgstr "空的序列和多项集: ``''``, ``()``, ``[]``, ``{}``, ``set()``, ``range(0)``" + +#: ../../library/stdtypes.rst:72 +msgid "" +"Operations and built-in functions that have a Boolean result always return " +"``0`` or ``False`` for false and ``1`` or ``True`` for true, unless " +"otherwise stated. (Important exception: the Boolean operations ``or`` and " +"``and`` always return one of their operands.)" +msgstr "" +"产生布尔值结果的运算和内置函数总是返回 ``0`` 或 ``False`` 作为假值,``1`` 或 ``True`` 作为真值,除非另行说明。 " +"(重要例外:布尔运算 ``or`` 和 ``and`` 总是返回其中一个操作数。)" + +#: ../../library/stdtypes.rst:81 +msgid "" +"Boolean Operations --- :keyword:`!and`, :keyword:`!or`, :keyword:`!not`" +msgstr "布尔运算 --- :keyword:`!and`, :keyword:`!or`, :keyword:`!not`" + +#: ../../library/stdtypes.rst:85 +msgid "These are the Boolean operations, ordered by ascending priority:" +msgstr "这些属于布尔运算,按优先级升序排列:" + +#: ../../library/stdtypes.rst:88 ../../library/stdtypes.rst:146 +#: ../../library/stdtypes.rst:292 ../../library/stdtypes.rst:382 +#: ../../library/stdtypes.rst:432 ../../library/stdtypes.rst:1015 +#: ../../library/stdtypes.rst:1237 +msgid "Operation" +msgstr "运算" + +#: ../../library/stdtypes.rst:88 ../../library/stdtypes.rst:292 +#: ../../library/stdtypes.rst:382 ../../library/stdtypes.rst:432 +#: ../../library/stdtypes.rst:1015 ../../library/stdtypes.rst:1237 +msgid "Result" +msgstr "结果:" + +#: ../../library/stdtypes.rst:88 ../../library/stdtypes.rst:292 +#: ../../library/stdtypes.rst:432 ../../library/stdtypes.rst:1015 +#: ../../library/stdtypes.rst:1237 ../../library/stdtypes.rst:3190 +#: ../../library/stdtypes.rst:4459 +msgid "Notes" +msgstr "备注" + +#: ../../library/stdtypes.rst:90 +msgid "``x or y``" +msgstr "``x or y``" + +#: ../../library/stdtypes.rst:90 +msgid "if *x* is true, then *x*, else *y*" +msgstr "如果 *x* 为真值,则 *x*,否则 *y*" + +#: ../../library/stdtypes.rst:90 ../../library/stdtypes.rst:1017 +#: ../../library/stdtypes.rst:1020 ../../library/stdtypes.rst:1252 +#: ../../library/stdtypes.rst:3196 ../../library/stdtypes.rst:4465 +msgid "\\(1)" +msgstr "\\(1)" + +#: ../../library/stdtypes.rst:93 +msgid "``x and y``" +msgstr "``x and y``" + +#: ../../library/stdtypes.rst:93 +msgid "if *x* is false, then *x*, else *y*" +msgstr "如果 *x* 为假值,则返回 *x*,否则返回 *y*" + +#: ../../library/stdtypes.rst:93 ../../library/stdtypes.rst:305 +#: ../../library/stdtypes.rst:325 ../../library/stdtypes.rst:1263 +#: ../../library/stdtypes.rst:3200 ../../library/stdtypes.rst:3202 +#: ../../library/stdtypes.rst:4469 ../../library/stdtypes.rst:4471 +msgid "\\(2)" +msgstr "\\(2)" + +#: ../../library/stdtypes.rst:96 +msgid "``not x``" +msgstr "``not x``" + +#: ../../library/stdtypes.rst:96 +msgid "if *x* is false, then ``True``, else ``False``" +msgstr "如果 *x* 为假值,则为 ``True``,否则为 ``False``" + +#: ../../library/stdtypes.rst:96 ../../library/stdtypes.rst:3204 +#: ../../library/stdtypes.rst:3206 ../../library/stdtypes.rst:3208 +#: ../../library/stdtypes.rst:3210 ../../library/stdtypes.rst:4473 +#: ../../library/stdtypes.rst:4475 ../../library/stdtypes.rst:4477 +#: ../../library/stdtypes.rst:4479 +msgid "\\(3)" +msgstr "\\(3)" + +#: ../../library/stdtypes.rst:105 ../../library/stdtypes.rst:336 +#: ../../library/stdtypes.rst:450 ../../library/stdtypes.rst:1059 +#: ../../library/stdtypes.rst:1267 ../../library/stdtypes.rst:3240 +#: ../../library/stdtypes.rst:4509 +msgid "Notes:" +msgstr "注释:" + +#: ../../library/stdtypes.rst:108 +msgid "" +"This is a short-circuit operator, so it only evaluates the second argument " +"if the first one is false." +msgstr "这是个短路运算符,因此只有在第一个参数为假值时才会对第二个参数求值。" + +#: ../../library/stdtypes.rst:112 +msgid "" +"This is a short-circuit operator, so it only evaluates the second argument " +"if the first one is true." +msgstr "这是个短路运算符,因此只有在第一个参数为真值时才会对第二个参数求值。" + +#: ../../library/stdtypes.rst:116 +msgid "" +"``not`` has a lower priority than non-Boolean operators, so ``not a == b`` " +"is interpreted as ``not (a == b)``, and ``a == not b`` is a syntax error." +msgstr "" +"``not`` 的优先级比非布尔运算符低,因此 ``not a == b`` 会被解读为 ``not (a == b)`` 而 ``a == not " +"b`` 会引发语法错误。" + +#: ../../library/stdtypes.rst:123 +msgid "Comparisons" +msgstr "比较运算" + +#: ../../library/stdtypes.rst:137 +msgid "" +"There are eight comparison operations in Python. They all have the same " +"priority (which is higher than that of the Boolean operations). Comparisons" +" can be chained arbitrarily; for example, ``x < y <= z`` is equivalent to " +"``x < y and y <= z``, except that *y* is evaluated only once (but in both " +"cases *z* is not evaluated at all when ``x < y`` is found to be false)." +msgstr "" +"在 Python 中有八种比较运算符。它们的优先级相同(比布尔运算的优先级高)。比较运算可以任意串连;例如,``x < y <= z`` 等价于 ``x" +" < y and y <= z``,前者的不同之处在于 *y* 只被求值一次(但在两种情况下当 ``x < y`` 结果为假值时 *z* " +"都不会被求值)。" + +#: ../../library/stdtypes.rst:143 +msgid "This table summarizes the comparison operations:" +msgstr "此表格汇总了比较运算:" + +#: ../../library/stdtypes.rst:146 ../../library/stdtypes.rst:3167 +#: ../../library/stdtypes.rst:3190 ../../library/stdtypes.rst:4436 +#: ../../library/stdtypes.rst:4459 +msgid "Meaning" +msgstr "含意" + +#: ../../library/stdtypes.rst:148 +msgid "``<``" +msgstr "``<``" + +#: ../../library/stdtypes.rst:148 +msgid "strictly less than" +msgstr "严格小于" + +#: ../../library/stdtypes.rst:150 +msgid "``<=``" +msgstr "``<=``" + +#: ../../library/stdtypes.rst:150 +msgid "less than or equal" +msgstr "小于或等于" + +#: ../../library/stdtypes.rst:152 +msgid "``>``" +msgstr "``>``" + +#: ../../library/stdtypes.rst:152 +msgid "strictly greater than" +msgstr "严格大于" + +#: ../../library/stdtypes.rst:154 +msgid "``>=``" +msgstr "``>=``" + +#: ../../library/stdtypes.rst:154 +msgid "greater than or equal" +msgstr "大于或等于" + +#: ../../library/stdtypes.rst:156 +msgid "``==``" +msgstr "``==``" + +#: ../../library/stdtypes.rst:156 +msgid "equal" +msgstr "等于" + +#: ../../library/stdtypes.rst:158 +msgid "``!=``" +msgstr "``!=``" + +#: ../../library/stdtypes.rst:158 +msgid "not equal" +msgstr "不等于" + +#: ../../library/stdtypes.rst:160 +msgid "``is``" +msgstr "``is``" + +#: ../../library/stdtypes.rst:160 +msgid "object identity" +msgstr "对象标识" + +#: ../../library/stdtypes.rst:162 +msgid "``is not``" +msgstr "``is not``" + +#: ../../library/stdtypes.rst:162 +msgid "negated object identity" +msgstr "否定的对象标识" + +#: ../../library/stdtypes.rst:169 +msgid "" +"Unless stated otherwise, objects of different types never compare equal. The" +" ``==`` operator is always defined but for some object types (for example, " +"class objects) is equivalent to :keyword:`is`. The ``<``, ``<=``, ``>`` and " +"``>=`` operators are only defined where they make sense; for example, they " +"raise a :exc:`TypeError` exception when one of the arguments is a complex " +"number." +msgstr "" +"除非另有指明,不同类型的对象绝对不会相等。``==`` 运算符总是会被定义但对某些类型来说(例如类对象)它就等价于 :keyword:`is`。 " +"``<``, ``<=``, ``>`` 和 ``>=`` 运算符仅在有意义的场合下才会被定义;例如,当有一个参数为复数时这些运算会引发 " +":exc:`TypeError` 异常。" + +#: ../../library/stdtypes.rst:183 +msgid "" +"Non-identical instances of a class normally compare as non-equal unless the " +"class defines the :meth:`~object.__eq__` method." +msgstr "具有不同标识的类的实例比较结果通常为不相等,除非类定义了 :meth:`~object.__eq__` 方法。" + +#: ../../library/stdtypes.rst:186 +msgid "" +"Instances of a class cannot be ordered with respect to other instances of " +"the same class, or other types of object, unless the class defines enough of" +" the methods :meth:`~object.__lt__`, :meth:`~object.__le__`, " +":meth:`~object.__gt__`, and :meth:`~object.__ge__` (in general, " +":meth:`~object.__lt__` and :meth:`~object.__eq__` are sufficient, if you " +"want the conventional meanings of the comparison operators)." +msgstr "" +"一个类的实例不能与相同类的其他实例或其他类型的对象进行排序,除非定义该类定义了足够多的方法,包括 :meth:`~object.__lt__`, " +":meth:`~object.__le__`, :meth:`~object.__gt__` 以及 :meth:`~object.__ge__` " +"(而如果你想实现常规意义上的比较操作,通常只要有 :meth:`~object.__lt__` 和 :meth:`~object.__eq__` " +"就可以了)。" + +#: ../../library/stdtypes.rst:193 +msgid "" +"The behavior of the :keyword:`is` and :keyword:`is not` operators cannot be " +"customized; also they can be applied to any two objects and never raise an " +"exception." +msgstr ":keyword:`is` 和 :keyword:`is not` 运算符无法自定义;并且它们可以被应用于任意两个对象而不会引发异常。" + +#: ../../library/stdtypes.rst:201 +msgid "" +"Two more operations with the same syntactic priority, :keyword:`in` and " +":keyword:`not in`, are supported by types that are :term:`iterable` or " +"implement the :meth:`~object.__contains__` method." +msgstr "" +"还有两种具有相同语法优先级的运算 :keyword:`in` 和 :keyword:`not in`,它们被 :term:`iterable` 或实现了" +" :meth:`~object.__contains__` 方法的类型所支持。" + +#: ../../library/stdtypes.rst:208 +msgid "Numeric Types --- :class:`int`, :class:`float`, :class:`complex`" +msgstr "数字类型 --- :class:`int`, :class:`float`, :class:`complex`" + +#: ../../library/stdtypes.rst:218 +msgid "" +"There are three distinct numeric types: :dfn:`integers`, :dfn:`floating-" +"point numbers`, and :dfn:`complex numbers`. In addition, Booleans are a " +"subtype of integers. Integers have unlimited precision. Floating-point " +"numbers are usually implemented using :c:expr:`double` in C; information " +"about the precision and internal representation of floating-point numbers " +"for the machine on which your program is running is available in " +":data:`sys.float_info`. Complex numbers have a real and imaginary part, " +"which are each a floating-point number. To extract these parts from a " +"complex number *z*, use ``z.real`` and ``z.imag``. (The standard library " +"includes the additional numeric types :mod:`fractions.Fraction`, for " +"rationals, and :mod:`decimal.Decimal`, for floating-point numbers with user-" +"definable precision.)" +msgstr "" +"存在三种不同的数字类型::dfn:`整数`, :dfn:`浮点数` 和 :dfn:`复数`。此外,布尔值属于整数的子类型。整数具有无限的精度。 " +"浮点数通常使用 C 中的 :c:expr:`double` 来实现;有关你的程序运行所在机器上浮点数的精度和内部表示法可在 " +":data:`sys.float_info` 中查看。复数包含实部和虚部,分别以一个浮点数表示。要从一个复数 *z* 中提取这两个部分,可使用 " +"``z.real`` 和 ``z.imag``。 (标准库包含附加的数字类型,如表示有理数的 :mod:`fractions.Fraction` " +"以及以用户定制精度表示浮点数的 :mod:`decimal.Decimal`。)" + +#: ../../library/stdtypes.rst:240 +msgid "" +"Numbers are created by numeric literals or as the result of built-in " +"functions and operators. Unadorned integer literals (including hex, octal " +"and binary numbers) yield integers. Numeric literals containing a decimal " +"point or an exponent sign yield floating-point numbers. Appending ``'j'`` " +"or ``'J'`` to a numeric literal yields an imaginary number (a complex number" +" with a zero real part) which you can add to an integer or float to get a " +"complex number with real and imaginary parts." +msgstr "" +"数字是由数字字面值或内置函数与运算符的结果来创建的。不带修饰的整数字面值(包括十六进制、八进制和二进制数)会生成整数。 " +"包含小数点或幂运算符的数字字面值会生成浮点数。在数字字面值末尾加上 ``'j'`` 或 ``'J'`` " +"会生成虚数(实部为零的复数),你可以将其与整数或浮点数相加来得到具有实部和虚部的复数。" + +#: ../../library/stdtypes.rst:248 +msgid "" +"The constructors :func:`int`, :func:`float`, and :func:`complex` can be used" +" to produce numbers of a specific type." +msgstr "构造函数 :func:`int`、 :func:`float` 和 :func:`complex` 可以用来构造特定类型的数字。" + +#: ../../library/stdtypes.rst:270 +msgid "" +"Python fully supports mixed arithmetic: when a binary arithmetic operator " +"has operands of different built-in numeric types, the operand with the " +"\"narrower\" type is widened to that of the other:" +msgstr "" +"Python 完整支持混合算术运算:当一个双目算术运算符的操作数具有不同的内置数字类型时,“较窄类型”的操作数会被加宽为与另一个操作数的类型:" + +#: ../../library/stdtypes.rst:274 +msgid "If both arguments are complex numbers, no conversion is performed;" +msgstr "如果两个参数均为复数,则不会执行任何转换;" + +#: ../../library/stdtypes.rst:275 +msgid "" +"if either argument is a complex or a floating-point number, the other is " +"converted to a floating-point number;" +msgstr "如果任一参数为复数或浮点数,另一参数将被转换为浮点数;" + +#: ../../library/stdtypes.rst:277 +msgid "otherwise, both must be integers and no conversion is necessary." +msgstr "否则,两者应该都为整数,不需要进行转换。" + +#: ../../library/stdtypes.rst:279 +msgid "" +"Arithmetic with complex and real operands is defined by the usual " +"mathematical formula, for example::" +msgstr "与复数和实数的算术运算是根据通常的数学法则来定义的,例如::" + +#: ../../library/stdtypes.rst:282 +msgid "" +"x + complex(u, v) = complex(x + u, v)\n" +"x * complex(u, v) = complex(x * u, x * v)" +msgstr "" +"x + complex(u, v) = complex(x + u, v)\n" +"x * complex(u, v) = complex(x * u, x * v)" + +#: ../../library/stdtypes.rst:285 +msgid "" +"A comparison between numbers of different types behaves as though the exact " +"values of those numbers were being compared. [2]_" +msgstr "不同类型数值之间的比较行为就如同对这些数字的实际值进行比较。 [2]_" + +#: ../../library/stdtypes.rst:288 +msgid "" +"All numeric types (except complex) support the following operations (for " +"priorities of the operations, see :ref:`operator-summary`):" +msgstr "所有数字类型(复数除外)都支持下列运算 (有关运算优先级,请参阅 :ref:`operator-summary`):" + +#: ../../library/stdtypes.rst:292 +msgid "Full documentation" +msgstr "完整文档" + +#: ../../library/stdtypes.rst:294 +msgid "``x + y``" +msgstr "``x + y``" + +#: ../../library/stdtypes.rst:294 +msgid "sum of *x* and *y*" +msgstr "*x* 和 *y* 的和" + +#: ../../library/stdtypes.rst:296 +msgid "``x - y``" +msgstr "``x - y``" + +#: ../../library/stdtypes.rst:296 +msgid "difference of *x* and *y*" +msgstr "*x* 和 *y* 的差" + +#: ../../library/stdtypes.rst:298 +msgid "``x * y``" +msgstr "``x * y``" + +#: ../../library/stdtypes.rst:298 +msgid "product of *x* and *y*" +msgstr "*x* 和 *y* 的乘积" + +#: ../../library/stdtypes.rst:300 +msgid "``x / y``" +msgstr "``x / y``" + +#: ../../library/stdtypes.rst:300 +msgid "quotient of *x* and *y*" +msgstr "*x* 和 *y* 的商" + +#: ../../library/stdtypes.rst:302 +msgid "``x // y``" +msgstr "``x // y``" + +#: ../../library/stdtypes.rst:302 +msgid "floored quotient of *x* and *y*" +msgstr "*x* 和 *y* 的商数" + +#: ../../library/stdtypes.rst:302 +msgid "\\(1)\\(2)" +msgstr "\\(1)\\(2)" + +#: ../../library/stdtypes.rst:305 +msgid "``x % y``" +msgstr "``x % y``" + +#: ../../library/stdtypes.rst:305 +msgid "remainder of ``x / y``" +msgstr "``x / y`` 的余数" + +#: ../../library/stdtypes.rst:307 +msgid "``-x``" +msgstr "``-x``" + +#: ../../library/stdtypes.rst:307 +msgid "*x* negated" +msgstr "*x* 取反" + +#: ../../library/stdtypes.rst:309 +msgid "``+x``" +msgstr "``+x``" + +#: ../../library/stdtypes.rst:309 +msgid "*x* unchanged" +msgstr "*x* 不变" + +#: ../../library/stdtypes.rst:311 +msgid "``abs(x)``" +msgstr "``abs(x)``" + +#: ../../library/stdtypes.rst:311 +msgid "absolute value or magnitude of *x*" +msgstr "*x* 的绝对值或大小" + +#: ../../library/stdtypes.rst:311 +msgid ":func:`abs`" +msgstr ":func:`abs`" + +#: ../../library/stdtypes.rst:314 +msgid "``int(x)``" +msgstr "``int(x)``" + +#: ../../library/stdtypes.rst:314 +msgid "*x* converted to integer" +msgstr "将 *x* 转换为整数" + +#: ../../library/stdtypes.rst:314 +msgid "\\(3)\\(6)" +msgstr "\\(3)\\(6)" + +#: ../../library/stdtypes.rst:314 +msgid ":func:`int`" +msgstr ":func:`int`" + +#: ../../library/stdtypes.rst:316 +msgid "``float(x)``" +msgstr "``float(x)``" + +#: ../../library/stdtypes.rst:316 +msgid "*x* converted to floating point" +msgstr "将 *x* 转换为浮点数" + +#: ../../library/stdtypes.rst:316 +msgid "\\(4)\\(6)" +msgstr "\\(4)\\(6)" + +#: ../../library/stdtypes.rst:316 +msgid ":func:`float`" +msgstr ":func:`float`" + +#: ../../library/stdtypes.rst:318 +msgid "``complex(re, im)``" +msgstr "``complex(re, im)``" + +#: ../../library/stdtypes.rst:318 +msgid "" +"a complex number with real part *re*, imaginary part *im*. *im* defaults to " +"zero." +msgstr "一个带有实部 *re* 和虚部 *im* 的复数。*im* 默认为 0。" + +#: ../../library/stdtypes.rst:318 ../../library/stdtypes.rst:3198 +#: ../../library/stdtypes.rst:4496 +msgid "\\(6)" +msgstr "\\(6)" + +#: ../../library/stdtypes.rst:318 +msgid ":func:`complex`" +msgstr ":func:`complex`" + +#: ../../library/stdtypes.rst:322 +msgid "``c.conjugate()``" +msgstr "``c.conjugate()``" + +#: ../../library/stdtypes.rst:322 +msgid "conjugate of the complex number *c*" +msgstr "复数 *c* 的共轭" + +#: ../../library/stdtypes.rst:325 +msgid "``divmod(x, y)``" +msgstr "``divmod(x, y)``" + +#: ../../library/stdtypes.rst:325 +msgid "the pair ``(x // y, x % y)``" +msgstr "``(x // y, x % y)``" + +#: ../../library/stdtypes.rst:325 +msgid ":func:`divmod`" +msgstr ":func:`divmod`" + +#: ../../library/stdtypes.rst:327 +msgid "``pow(x, y)``" +msgstr "``pow(x, y)``" + +#: ../../library/stdtypes.rst:327 ../../library/stdtypes.rst:329 +msgid "*x* to the power *y*" +msgstr "*x* 的 *y* 次幂" + +#: ../../library/stdtypes.rst:327 ../../library/stdtypes.rst:329 +#: ../../library/stdtypes.rst:3223 ../../library/stdtypes.rst:3226 +#: ../../library/stdtypes.rst:3229 ../../library/stdtypes.rst:4492 +#: ../../library/stdtypes.rst:4499 +msgid "\\(5)" +msgstr "\\(5)" + +#: ../../library/stdtypes.rst:327 +msgid ":func:`pow`" +msgstr ":func:`pow`" + +#: ../../library/stdtypes.rst:329 +msgid "``x ** y``" +msgstr "``x ** y``" + +#: ../../library/stdtypes.rst:339 +msgid "" +"Also referred to as integer division. For operands of type :class:`int`, " +"the result has type :class:`int`. For operands of type :class:`float`, the " +"result has type :class:`float`. In general, the result is a whole integer, " +"though the result's type is not necessarily :class:`int`. The result is " +"always rounded towards minus infinity: ``1//2`` is ``0``, ``(-1)//2`` is " +"``-1``, ``1//(-2)`` is ``-1``, and ``(-1)//(-2)`` is ``0``." +msgstr "" +"也称为整数除法。对于 :class:`int` 类型的操作数,结果的类型为 :class:`int`。对于 :class:`float` " +"类型的操作数,结果的类型为 :class:`float`。总的说来,结果是一个整数,但结果的类型不一定为 :class:`int`。 " +"结果总是向负无穷的方向舍入: ``1//2`` 为 ``0``,``(-1)//2`` 为 ``-1``,``1//(-2)`` 为 " +"``-1``,``(-1)//(-2)`` 为 ``0``。" + +#: ../../library/stdtypes.rst:347 +msgid "" +"Not for complex numbers. Instead convert to floats using :func:`abs` if " +"appropriate." +msgstr "不可用于复数。而应在适当条件下使用 :func:`abs` 转换为浮点数。" + +#: ../../library/stdtypes.rst:358 +msgid "" +"Conversion from :class:`float` to :class:`int` truncates, discarding the " +"fractional part. See functions :func:`math.floor` and :func:`math.ceil` for " +"alternative conversions." +msgstr "" +"从 :class:`float` 转换为 :class:`int` 将会执行截断,丢弃掉小数部分。请参阅 :func:`math.floor` 和 " +":func:`math.ceil` 函数了解替代的转换方式。" + +#: ../../library/stdtypes.rst:363 +msgid "" +"float also accepts the strings \"nan\" and \"inf\" with an optional prefix " +"\"+\" or \"-\" for Not a Number (NaN) and positive or negative infinity." +msgstr "float 也接受字符串 \"nan\" 和附带可选前缀 \"+\" 或 \"-\" 的 \"inf\" 分别表示非数字 (NaN) 以及正或负无穷。" + +#: ../../library/stdtypes.rst:367 +msgid "" +"Python defines ``pow(0, 0)`` and ``0 ** 0`` to be ``1``, as is common for " +"programming languages." +msgstr "Python 将 ``pow(0, 0)`` 和 ``0 ** 0`` 定义为 ``1``,这是编程语言的普遍做法。" + +#: ../../library/stdtypes.rst:371 +msgid "" +"The numeric literals accepted include the digits ``0`` to ``9`` or any " +"Unicode equivalent (code points with the ``Nd`` property)." +msgstr "接受的数字字面值包括数码 ``0`` 到 ``9`` 或任何等效的 Unicode 字符(具有 ``Nd`` 特征属性的代码点)。" + +#: ../../library/stdtypes.rst:374 +msgid "" +"See `the Unicode Standard " +"`_ for " +"a complete list of code points with the ``Nd`` property." +msgstr "" +"请参阅 `Unicode 标准 " +"`_ 了解具有" +" ``Nd`` 特征属性的码位完整列表。" + +#: ../../library/stdtypes.rst:378 +msgid "" +"All :class:`numbers.Real` types (:class:`int` and :class:`float`) also " +"include the following operations:" +msgstr "所有 :class:`numbers.Real` 类型 (:class:`int` 和 :class:`float`) 还包括下列运算:" + +#: ../../library/stdtypes.rst:384 +msgid ":func:`math.trunc(\\ x) `" +msgstr ":func:`math.trunc(\\ x) `" + +#: ../../library/stdtypes.rst:384 +msgid "*x* truncated to :class:`~numbers.Integral`" +msgstr "*x* 截断为 :class:`~numbers.Integral`" + +#: ../../library/stdtypes.rst:387 +msgid ":func:`round(x[, n]) `" +msgstr ":func:`round(x[, n]) `" + +#: ../../library/stdtypes.rst:387 +msgid "" +"*x* rounded to *n* digits, rounding half to even. If *n* is omitted, it " +"defaults to 0." +msgstr "*x* 舍入到 *n* 位小数,半数值会舍入到偶数。如果省略 *n*,则默认为 0。" + +#: ../../library/stdtypes.rst:391 +msgid ":func:`math.floor(\\ x) `" +msgstr ":func:`math.floor(\\ x) `" + +#: ../../library/stdtypes.rst:391 +msgid "the greatest :class:`~numbers.Integral` <= *x*" +msgstr "<= *x* 的最大 :class:`~numbers.Integral`" + +#: ../../library/stdtypes.rst:394 +msgid ":func:`math.ceil(x) `" +msgstr ":func:`math.ceil(x) `" + +#: ../../library/stdtypes.rst:394 +msgid "the least :class:`~numbers.Integral` >= *x*" +msgstr ">= *x* 的最小 :class:`~numbers.Integral`" + +#: ../../library/stdtypes.rst:398 +msgid "" +"For additional numeric operations see the :mod:`math` and :mod:`cmath` " +"modules." +msgstr "有关更多的数字运算请参阅 :mod:`math` 和 :mod:`cmath` 模块。" + +#: ../../library/stdtypes.rst:407 +msgid "Bitwise Operations on Integer Types" +msgstr "整数类型的按位运算" + +#: ../../library/stdtypes.rst:421 +msgid "" +"Bitwise operations only make sense for integers. The result of bitwise " +"operations is calculated as though carried out in two's complement with an " +"infinite number of sign bits." +msgstr "按位运算只对整数有意义。计算按位运算的结果,就相当于使用无穷多个二进制符号位对二的补码执行操作。" + +#: ../../library/stdtypes.rst:425 +msgid "" +"The priorities of the binary bitwise operations are all lower than the " +"numeric operations and higher than the comparisons; the unary operation " +"``~`` has the same priority as the other unary numeric operations (``+`` and" +" ``-``)." +msgstr "" +"二进制按位运算的优先级全都低于数字运算,但又高于比较运算;一元运算 ``~`` 具有与其他一元算术运算 (``+`` and ``-``) " +"相同的优先级。" + +#: ../../library/stdtypes.rst:429 +msgid "This table lists the bitwise operations sorted in ascending priority:" +msgstr "此表格是以优先级升序排序的按位运算列表:" + +#: ../../library/stdtypes.rst:434 +msgid "``x | y``" +msgstr "``x | y``" + +#: ../../library/stdtypes.rst:434 +msgid "bitwise :dfn:`or` of *x* and *y*" +msgstr "*x* 和 *y* 按位 :dfn:`或`" + +#: ../../library/stdtypes.rst:434 ../../library/stdtypes.rst:437 +#: ../../library/stdtypes.rst:440 ../../library/stdtypes.rst:3212 +#: ../../library/stdtypes.rst:3216 ../../library/stdtypes.rst:4481 +#: ../../library/stdtypes.rst:4485 +msgid "\\(4)" +msgstr "\\(4)" + +#: ../../library/stdtypes.rst:437 +msgid "``x ^ y``" +msgstr "``x ^ y``" + +#: ../../library/stdtypes.rst:437 +msgid "bitwise :dfn:`exclusive or` of *x* and *y*" +msgstr "*x* 和 *y* 按位 :dfn:`异或`" + +#: ../../library/stdtypes.rst:440 +msgid "``x & y``" +msgstr "``x & y``" + +#: ../../library/stdtypes.rst:440 +msgid "bitwise :dfn:`and` of *x* and *y*" +msgstr "*x* 和 *y* 按位 :dfn:`与`" + +#: ../../library/stdtypes.rst:443 +msgid "``x << n``" +msgstr "``x << n``" + +#: ../../library/stdtypes.rst:443 +msgid "*x* shifted left by *n* bits" +msgstr "*x* 左移 *n* 位" + +#: ../../library/stdtypes.rst:443 +msgid "(1)(2)" +msgstr "(1)(2)" + +#: ../../library/stdtypes.rst:445 +msgid "``x >> n``" +msgstr "``x >> n``" + +#: ../../library/stdtypes.rst:445 +msgid "*x* shifted right by *n* bits" +msgstr "*x* 右移 *n* 位" + +#: ../../library/stdtypes.rst:445 +msgid "(1)(3)" +msgstr "(1)(3)" + +#: ../../library/stdtypes.rst:447 +msgid "``~x``" +msgstr "``~x``" + +#: ../../library/stdtypes.rst:447 +msgid "the bits of *x* inverted" +msgstr "*x* 逐位取反" + +#: ../../library/stdtypes.rst:453 +msgid "" +"Negative shift counts are illegal and cause a :exc:`ValueError` to be " +"raised." +msgstr "负的移位数是非法的,会导致引发 :exc:`ValueError`。" + +#: ../../library/stdtypes.rst:456 +msgid "" +"A left shift by *n* bits is equivalent to multiplication by ``pow(2, n)``." +msgstr "左移 *n* 位等价于乘以 ``pow(2, n)``。" + +#: ../../library/stdtypes.rst:459 +msgid "" +"A right shift by *n* bits is equivalent to floor division by ``pow(2, n)``." +msgstr "右移 *n* 位等价于除以 ``pow(2, n)``,作向下取整除法。" + +#: ../../library/stdtypes.rst:462 +msgid "" +"Performing these calculations with at least one extra sign extension bit in " +"a finite two's complement representation (a working bit-width of ``1 + " +"max(x.bit_length(), y.bit_length())`` or more) is sufficient to get the same" +" result as if there were an infinite number of sign bits." +msgstr "" +"使用带有至少一个额外符号扩展位的有限个二进制补码表示(有效位宽度为 ``1 + max(x.bit_length(), " +"y.bit_length())`` 或以上)执行这些计算就足以获得相当于有无数个符号位时的同样结果。" + +#: ../../library/stdtypes.rst:469 +msgid "Additional Methods on Integer Types" +msgstr "整数类型的附加方法" + +#: ../../library/stdtypes.rst:471 +msgid "" +"The int type implements the :class:`numbers.Integral` :term:`abstract base " +"class`. In addition, it provides a few more methods:" +msgstr "" +"int 类型实现了 :class:`numbers.Integral` :term:`abstract base class`。 " +"此外,它还提供了其他几个方法:" + +#: ../../library/stdtypes.rst:476 +msgid "" +"Return the number of bits necessary to represent an integer in binary, " +"excluding the sign and leading zeros::" +msgstr "返回以二进制表示一个整数所需要的位数,不包括符号位和前面的零::" + +#: ../../library/stdtypes.rst:479 +msgid "" +">>> n = -37\n" +">>> bin(n)\n" +"'-0b100101'\n" +">>> n.bit_length()\n" +"6" +msgstr "" +">>> n = -37\n" +">>> bin(n)\n" +"'-0b100101'\n" +">>> n.bit_length()\n" +"6" + +#: ../../library/stdtypes.rst:485 +msgid "" +"More precisely, if ``x`` is nonzero, then ``x.bit_length()`` is the unique " +"positive integer ``k`` such that ``2**(k-1) <= abs(x) < 2**k``. " +"Equivalently, when ``abs(x)`` is small enough to have a correctly rounded " +"logarithm, then ``k = 1 + int(log(abs(x), 2))``. If ``x`` is zero, then " +"``x.bit_length()`` returns ``0``." +msgstr "" +"更准确地说,如果 ``x`` 非零,则 ``x.bit_length()`` 是使得 ``2**(k-1) <= abs(x) < 2**k`` " +"的唯一正整数 ``k``。同样地,当 ``abs(x)`` 小到足以具有正确的舍入对数时,则 ``k = 1 + int(log(abs(x), " +"2))``。如果 ``x`` 为零,则 ``x.bit_length()`` 返回 ``0``。" + +#: ../../library/stdtypes.rst:491 ../../library/stdtypes.rst:514 +#: ../../library/stdtypes.rst:559 ../../library/stdtypes.rst:603 +msgid "Equivalent to::" +msgstr "等价于::" + +#: ../../library/stdtypes.rst:493 +msgid "" +"def bit_length(self):\n" +" s = bin(self) # binary representation: bin(-37) --> '-0b100101'\n" +" s = s.lstrip('-0b') # remove leading zeros and minus sign\n" +" return len(s) # len('100101') --> 6" +msgstr "" +"def bit_length(self):\n" +" s = bin(self) # 二进制表示形式:bin(-37) --> '-0b100101'\\n s = s.lstrip('-0b') # 移除开头的零和负号\n" +" return len(s) # len('100101') --> 6" + +#: ../../library/stdtypes.rst:502 +msgid "" +"Return the number of ones in the binary representation of the absolute value" +" of the integer. This is also known as the population count. Example::" +msgstr "返回整数的绝对值的二进制表示中 1 的个数。也被称为 population count。示例::" + +#: ../../library/stdtypes.rst:506 +msgid "" +">>> n = 19\n" +">>> bin(n)\n" +"'0b10011'\n" +">>> n.bit_count()\n" +"3\n" +">>> (-n).bit_count()\n" +"3" +msgstr "" +">>> n = 19\n" +">>> bin(n)\n" +"'0b10011'\n" +">>> n.bit_count()\n" +"3\n" +">>> (-n).bit_count()\n" +"3" + +#: ../../library/stdtypes.rst:516 +msgid "" +"def bit_count(self):\n" +" return bin(self).count(\"1\")" +msgstr "" +"def bit_count(self):\n" +" return bin(self).count(\"1\")" + +#: ../../library/stdtypes.rst:523 +msgid "Return an array of bytes representing an integer." +msgstr "返回表示一个整数的字节数组。" + +#: ../../library/stdtypes.rst:535 +msgid "" +"The integer is represented using *length* bytes, and defaults to 1. An " +":exc:`OverflowError` is raised if the integer is not representable with the " +"given number of bytes." +msgstr "" +"整数会使用 *length* 个字节来表示,默认为 1。如果整数不能用给定的字节数来表示则会引发 :exc:`OverflowError`。" + +#: ../../library/stdtypes.rst:539 +msgid "" +"The *byteorder* argument determines the byte order used to represent the " +"integer, and defaults to ``\"big\"``. If *byteorder* is ``\"big\"``, the " +"most significant byte is at the beginning of the byte array. If *byteorder*" +" is ``\"little\"``, the most significant byte is at the end of the byte " +"array." +msgstr "" +"*byteorder* 参数确定用于表示整数的字节序,默认为 ``\"big\"``。 如果 *byteorder* 为 " +"``\"big\"``,则最高位字节将放在字节数组的开头。 如果 *byteorder* 为 " +"``\"little\"``,则最高位字节将放在字节数组的末尾。" + +#: ../../library/stdtypes.rst:545 +msgid "" +"The *signed* argument determines whether two's complement is used to " +"represent the integer. If *signed* is ``False`` and a negative integer is " +"given, an :exc:`OverflowError` is raised. The default value for *signed* is " +"``False``." +msgstr "" +"*signed* 参数确定是否使用二的补码来表示整数。如果 *signed* 为 ``False`` 并且给出的是负整数,则会引发 " +":exc:`OverflowError`。 *signed* 的默认值为 ``False``。" + +#: ../../library/stdtypes.rst:550 +msgid "" +"The default values can be used to conveniently turn an integer into a single" +" byte object::" +msgstr "默认值可用于方便地将整数转为一个单字节对象::" + +#: ../../library/stdtypes.rst:553 +msgid "" +">>> (65).to_bytes()\n" +"b'A'" +msgstr "" +">>> (65).to_bytes()\n" +"b'A'" + +#: ../../library/stdtypes.rst:556 +msgid "" +"However, when using the default arguments, don't try to convert a value " +"greater than 255 or you'll get an :exc:`OverflowError`." +msgstr "但是,当使用默认参数时,请不要试图转换大于 255 的值否则会引发 :exc:`OverflowError`。" + +#: ../../library/stdtypes.rst:561 +msgid "" +"def to_bytes(n, length=1, byteorder='big', signed=False):\n" +" if byteorder == 'little':\n" +" order = range(length)\n" +" elif byteorder == 'big':\n" +" order = reversed(range(length))\n" +" else:\n" +" raise ValueError(\"byteorder must be either 'little' or 'big'\")\n" +"\n" +" return bytes((n >> i*8) & 0xff for i in order)" +msgstr "" +"def to_bytes(n, length=1, byteorder='big', signed=False):\n" +" if byteorder == 'little':\n" +" order = range(length)\n" +" elif byteorder == 'big':\n" +" order = reversed(range(length))\n" +" else:\n" +" raise ValueError(\"byteorder must be either 'little' or 'big'\")\n" +"\n" +" return bytes((n >> i*8) & 0xff for i in order)" + +#: ../../library/stdtypes.rst:572 +msgid "Added default argument values for ``length`` and ``byteorder``." +msgstr "添加了 ``length`` 和 ``byteorder`` 的默认参数值。" + +#: ../../library/stdtypes.rst:577 +msgid "Return the integer represented by the given array of bytes." +msgstr "返回由给定字节数组所表示的整数。" + +#: ../../library/stdtypes.rst:590 +msgid "" +"The argument *bytes* must either be a :term:`bytes-like object` or an " +"iterable producing bytes." +msgstr "*bytes* 参数必须为一个 :term:`bytes-like object` 或是生成字节的可迭代对象。" + +#: ../../library/stdtypes.rst:593 +msgid "" +"The *byteorder* argument determines the byte order used to represent the " +"integer, and defaults to ``\"big\"``. If *byteorder* is ``\"big\"``, the " +"most significant byte is at the beginning of the byte array. If *byteorder*" +" is ``\"little\"``, the most significant byte is at the end of the byte " +"array. To request the native byte order of the host system, use " +":data:`sys.byteorder` as the byte order value." +msgstr "" +"*byteorder* 参数确定用于表示整数的字节顺序,默认为 ``\"big\"``。 如果 *byteorder* 为 " +"``\"big\"``,则最高位字节放在字节数组的开头。 如果 *byteorder* 为 " +"``\"little\"``,则最高位字节放在字节数组的末尾。 要请求主机系统上的原生字节顺序,请使用 :data:`sys.byteorder` " +"作为字节顺序值。" + +#: ../../library/stdtypes.rst:600 +msgid "" +"The *signed* argument indicates whether two's complement is used to " +"represent the integer." +msgstr "*signed* 参数指明是否使用二的补码来表示整数。" + +#: ../../library/stdtypes.rst:605 +msgid "" +"def from_bytes(bytes, byteorder='big', signed=False):\n" +" if byteorder == 'little':\n" +" little_ordered = list(bytes)\n" +" elif byteorder == 'big':\n" +" little_ordered = list(reversed(bytes))\n" +" else:\n" +" raise ValueError(\"byteorder must be either 'little' or 'big'\")\n" +"\n" +" n = sum(b << i*8 for i, b in enumerate(little_ordered))\n" +" if signed and little_ordered and (little_ordered[-1] & 0x80):\n" +" n -= 1 << 8*len(little_ordered)\n" +"\n" +" return n" +msgstr "" +"def from_bytes(bytes, byteorder='big', signed=False):\n" +" if byteorder == 'little':\n" +" little_ordered = list(bytes)\n" +" elif byteorder == 'big':\n" +" little_ordered = list(reversed(bytes))\n" +" else:\n" +" raise ValueError(\"byteorder must be either 'little' or 'big'\")\n" +"\n" +" n = sum(b << i*8 for i, b in enumerate(little_ordered))\n" +" if signed and little_ordered and (little_ordered[-1] & 0x80):\n" +" n -= 1 << 8*len(little_ordered)\n" +"\n" +" return n" + +#: ../../library/stdtypes.rst:620 +msgid "Added default argument value for ``byteorder``." +msgstr "添加了 ``byteorder`` 的默认参数值。" + +#: ../../library/stdtypes.rst:625 +msgid "" +"Return a pair of integers whose ratio is equal to the original integer and " +"has a positive denominator. The integer ratio of integers (whole numbers) " +"is always the integer as the numerator and ``1`` as the denominator." +msgstr "返回一对整数,其比率正好等于原整数并且分母为正数。整数的比率总是用这个整数本身作为分子并以 ``1`` 作为分母。" + +#: ../../library/stdtypes.rst:634 +msgid "" +"Returns ``True``. Exists for duck type compatibility with " +":meth:`float.is_integer`." +msgstr "返回 ``True``。存在于兼容 :meth:`float.is_integer` 的鸭子类型。" + +#: ../../library/stdtypes.rst:639 +msgid "Additional Methods on Float" +msgstr "浮点类型的附加方法" + +#: ../../library/stdtypes.rst:641 +msgid "" +"The float type implements the :class:`numbers.Real` :term:`abstract base " +"class`. float also has the following additional methods." +msgstr "" +"float 类型实现了 :class:`numbers.Real` :term:`abstract base class`。float " +"还具有以下附加方法。" + +#: ../../library/stdtypes.rst:646 +msgid "" +"Class method to return a floating-point number constructed from a number " +"*x*." +msgstr "返回基于一个数字 *x* 所构造的浮点数的类方法。" + +#: ../../library/stdtypes.rst:648 +msgid "" +"If the argument is an integer or a floating-point number, a floating-point " +"number with the same value (within Python's floating-point precision) is " +"returned. If the argument is outside the range of a Python float, an " +":exc:`OverflowError` will be raised." +msgstr "" +"如果参数是整数或浮点数,则返回一个具有相同值(在 Python 浮点精度范围内)的浮点数。如果参数超出了 Python 浮点数的取值范围,则会引发 " +":exc:`OverflowError`." + +#: ../../library/stdtypes.rst:653 +msgid "" +"For a general Python object ``x``, ``float.from_number(x)`` delegates to " +"``x.__float__()``. If :meth:`~object.__float__` is not defined then it falls" +" back to :meth:`~object.__index__`." +msgstr "" +"对于一个普通 Python 对象 ``x``,``float.from_number(x)`` 会委托给 ``x.__float__()``。如果 " +":meth:`~object.__float__` 未定义则将回退至 :meth:`~object.__index__`。" + +#: ../../library/stdtypes.rst:663 +msgid "" +"Return a pair of integers whose ratio is exactly equal to the original " +"float. The ratio is in lowest terms and has a positive denominator. Raises " +":exc:`OverflowError` on infinities and a :exc:`ValueError` on NaNs." +msgstr "" +"返回一对整数,其比率正好等于原浮点数。该比率为最简形式且分母为正值。无穷大会引发 :exc:`OverflowError` 而 NaN 则会引发 " +":exc:`ValueError`." + +#: ../../library/stdtypes.rst:670 +msgid "" +"Return ``True`` if the float instance is finite with integral value, and " +"``False`` otherwise::" +msgstr "如果 float 实例可用有限位整数表示则返回 ``True``,否则返回 ``False``::" + +#: ../../library/stdtypes.rst:673 +msgid "" +">>> (-2.0).is_integer()\n" +"True\n" +">>> (3.2).is_integer()\n" +"False" +msgstr "" +">>> (-2.0).is_integer()\n" +"True\n" +">>> (3.2).is_integer()\n" +"False" + +#: ../../library/stdtypes.rst:678 +msgid "" +"Two methods support conversion to and from hexadecimal strings. Since " +"Python's floats are stored internally as binary numbers, converting a float " +"to or from a *decimal* string usually involves a small rounding error. In " +"contrast, hexadecimal strings allow exact representation and specification " +"of floating-point numbers. This can be useful when debugging, and in " +"numerical work." +msgstr "" +"两个方法均支持与十六进制数字符串之间的转换。由于 Python 浮点数在内部存储为二进制数,因此浮点数与 *十进制数* " +"字符串之间的转换往往会导致微小的舍入错误。而十六进制数字符串却允许精确地表示和描述浮点数。这在进行调试和数值工作时非常有用。" + +#: ../../library/stdtypes.rst:689 +msgid "" +"Return a representation of a floating-point number as a hexadecimal string." +" For finite floating-point numbers, this representation will always include" +" a leading ``0x`` and a trailing ``p`` and exponent." +msgstr "以十六进制字符串的形式返回一个浮点数表示。对于有限浮点数,这种表示法将总是包含前导的 ``0x`` 和尾随的 ``p`` 加指数。" + +#: ../../library/stdtypes.rst:697 +msgid "" +"Class method to return the float represented by a hexadecimal string *s*. " +"The string *s* may have leading and trailing whitespace." +msgstr "返回以十六进制字符串 *s* 表示的浮点数的类方法。字符串 *s* 可以带有前导和尾随的空格。" + +#: ../../library/stdtypes.rst:702 +msgid "" +"Note that :meth:`float.hex` is an instance method, while " +":meth:`float.fromhex` is a class method." +msgstr "请注意 :meth:`float.hex` 是实例方法,而 :meth:`float.fromhex` 是类方法。" + +#: ../../library/stdtypes.rst:705 +msgid "A hexadecimal string takes the form::" +msgstr "十六进制字符串采用的形式为::" + +#: ../../library/stdtypes.rst:707 +msgid "[sign] ['0x'] integer ['.' fraction] ['p' exponent]" +msgstr "[sign] ['0x'] integer ['.' fraction] ['p' exponent]" + +#: ../../library/stdtypes.rst:709 +msgid "" +"where the optional ``sign`` may by either ``+`` or ``-``, ``integer`` and " +"``fraction`` are strings of hexadecimal digits, and ``exponent`` is a " +"decimal integer with an optional leading sign. Case is not significant, and" +" there must be at least one hexadecimal digit in either the integer or the " +"fraction. This syntax is similar to the syntax specified in section 6.4.4.2" +" of the C99 standard, and also to the syntax used in Java 1.5 onwards. In " +"particular, the output of :meth:`float.hex` is usable as a hexadecimal " +"floating-point literal in C or Java code, and hexadecimal strings produced " +"by C's ``%a`` format character or Java's ``Double.toHexString`` are accepted" +" by :meth:`float.fromhex`." +msgstr "" +"可选的 ``sign`` 可以是 ``+`` 或 ``-``,``integer`` 和 ``fraction`` " +"是十六进制数码组成的字符串,``exponent`` 是带有可选前导符的十进制整数。大小写没有影响,在 integer 或 fraction " +"中必须至少有一个十六进制数码。此语法类似于 C99 标准的 6.4.4.2 小节中所描述的语法,也是 Java 1.5 以上所使用的语法。 " +"特别地,:meth:`float.hex` 的输出可以用作 C 或 Java 代码中的十六进制浮点数字面值,而由 C 的 ``%a`` 格式字符或 " +"Java 的 ``Double.toHexString`` 所生成的十六进制数字符串由为 :meth:`float.fromhex` 所接受。" + +#: ../../library/stdtypes.rst:722 +msgid "" +"Note that the exponent is written in decimal rather than hexadecimal, and " +"that it gives the power of 2 by which to multiply the coefficient. For " +"example, the hexadecimal string ``0x3.a7p10`` represents the floating-point " +"number ``(3 + 10./16 + 7./16**2) * 2.0**10``, or ``3740.0``::" +msgstr "" +"请注意 exponent 是十进制数而非十六进制数,它给出要与系数相乘的 2 的幂次。例如,十六进制数字符串 ``0x3.a7p10`` 表示浮点数 " +"``(3 + 10./16 + 7./16**2) * 2.0**10`` 即 ``3740.0``::" + +#: ../../library/stdtypes.rst:728 +msgid "" +">>> float.fromhex('0x3.a7p10')\n" +"3740.0" +msgstr "" +">>> float.fromhex('0x3.a7p10')\n" +"3740.0" + +#: ../../library/stdtypes.rst:732 +msgid "" +"Applying the reverse conversion to ``3740.0`` gives a different hexadecimal " +"string representing the same number::" +msgstr "对 ``3740.0`` 应用反向转换会得到另一个代表相同数值的十六进制数字符串::" + +#: ../../library/stdtypes.rst:735 +msgid "" +">>> float.hex(3740.0)\n" +"'0x1.d380000000000p+11'" +msgstr "" +">>> float.hex(3740.0)\n" +"'0x1.d380000000000p+11'" + +#: ../../library/stdtypes.rst:740 +msgid "Additional Methods on Complex" +msgstr "复数类型的附加方法" + +#: ../../library/stdtypes.rst:742 +msgid "" +"The :class:`!complex` type implements the :class:`numbers.Complex` " +":term:`abstract base class`. :class:`!complex` also has the following " +"additional methods." +msgstr "" +":class:`!complex` 类型实现了 :class:`numbers.Complex` :term:`abstract base " +"class`。 :class:`!complex` 还具有以下附加方法。" + +#: ../../library/stdtypes.rst:748 +msgid "Class method to convert a number to a complex number." +msgstr "将数字转换为复数的类方法。" + +#: ../../library/stdtypes.rst:750 +msgid "" +"For a general Python object ``x``, ``complex.from_number(x)`` delegates to " +"``x.__complex__()``. If :meth:`~object.__complex__` is not defined then it " +"falls back to :meth:`~object.__float__`. If :meth:`!__float__` is not " +"defined then it falls back to :meth:`~object.__index__`." +msgstr "" +"对于一个普通 Python 对象 ``x``,``complex.from_number(x)`` 会委托给 ``x.__complex__()``。 " +"如果 :meth:`~object.__complex__` 未定义则将回退至 :meth:`~object.__float__`。如果 " +":meth:`!__float__` 未定义则将回退至 :meth:`~object.__index__`。" + +#: ../../library/stdtypes.rst:761 +msgid "Hashing of numeric types" +msgstr "数字类型的哈希运算" + +#: ../../library/stdtypes.rst:763 +msgid "" +"For numbers ``x`` and ``y``, possibly of different types, it's a requirement" +" that ``hash(x) == hash(y)`` whenever ``x == y`` (see the " +":meth:`~object.__hash__` method documentation for more details). For ease " +"of implementation and efficiency across a variety of numeric types " +"(including :class:`int`, :class:`float`, :class:`decimal.Decimal` and " +":class:`fractions.Fraction`) Python's hash for numeric types is based on a " +"single mathematical function that's defined for any rational number, and " +"hence applies to all instances of :class:`int` and " +":class:`fractions.Fraction`, and all finite instances of :class:`float` and " +":class:`decimal.Decimal`. Essentially, this function is given by reduction " +"modulo ``P`` for a fixed prime ``P``. The value of ``P`` is made available " +"to Python as the :attr:`~sys.hash_info.modulus` attribute of " +":data:`sys.hash_info`." +msgstr "" +"对于可能为不同类型的数字 ``x`` 和 ``y``,要求当 ``x == y`` 时必定有 ``hash(x) == hash(y)`` (详情参见 " +":meth:`~object.__hash__` 方法的文档)。为了便于在各种数字类型 (包括 :class:`int`, " +":class:`float`, :class:`decimal.Decimal` 和 :class:`fractions.Fraction`) " +"上实现并保证效率,Python 对数字类型的哈希运算是基于为任意有理数定义统一的数学函数,因此该运算对 :class:`int` 和 " +":class:`fractions.Fraction` 的全部实例,以及 :class:`float` 和 " +":class:`decimal.Decimal` 的全部有限实例均可用。从本质上说,此函数是通过以一个固定质数 ``P`` 进行 ``P`` " +"降模给出的。``P`` 的值在 Python 中可以 :data:`sys.hash_info` 的 " +":attr:`~sys.hash_info.modulus` 属性的形式被访问。" + +#: ../../library/stdtypes.rst:778 +msgid "" +"Currently, the prime used is ``P = 2**31 - 1`` on machines with 32-bit C " +"longs and ``P = 2**61 - 1`` on machines with 64-bit C longs." +msgstr "" +"目前所用的质数设定,在 C long 为 32 位的机器上 ``P = 2**31 - 1`` 而在 C long 为 64 位的机器上 ``P = " +"2**61 - 1``。" + +#: ../../library/stdtypes.rst:781 +msgid "Here are the rules in detail:" +msgstr "详细规则如下所述:" + +#: ../../library/stdtypes.rst:783 +msgid "" +"If ``x = m / n`` is a nonnegative rational number and ``n`` is not divisible" +" by ``P``, define ``hash(x)`` as ``m * invmod(n, P) % P``, where ``invmod(n," +" P)`` gives the inverse of ``n`` modulo ``P``." +msgstr "" +"如果 ``x = m / n`` 是一个非负的有理数且 ``n`` 不可被 ``P`` 整除,则定义 ``hash(x)`` 为 ``m * " +"invmod(n, P) % P``,其中 ``invmod(n, P)`` 是对 ``n`` 模 ``P`` 取反。" + +#: ../../library/stdtypes.rst:787 +msgid "" +"If ``x = m / n`` is a nonnegative rational number and ``n`` is divisible by " +"``P`` (but ``m`` is not) then ``n`` has no inverse modulo ``P`` and the rule" +" above doesn't apply; in this case define ``hash(x)`` to be the constant " +"value ``sys.hash_info.inf``." +msgstr "" +"如果 ``x = m / n`` 是一个非负的有理数且 ``n`` 可被 ``P`` 整除(但 ``m`` 不能)则 ``n`` 不能对 ``P`` " +"降模,以上规则不适用;在此情况下则定义 ``hash(x)`` 为常数值 ``sys.hash_info.inf``。" + +#: ../../library/stdtypes.rst:792 +msgid "" +"If ``x = m / n`` is a negative rational number define ``hash(x)`` as " +"``-hash(-x)``. If the resulting hash is ``-1``, replace it with ``-2``." +msgstr "" +"如果 ``x = m / n`` 是一个负的有理数则定义 ``hash(x)`` 为 ``-hash(-x)``。如果结果哈希值为 ``-1`` " +"则将其替换为 ``-2``。" + +#: ../../library/stdtypes.rst:796 +msgid "" +"The particular values ``sys.hash_info.inf`` and ``-sys.hash_info.inf`` are " +"used as hash values for positive infinity or negative infinity " +"(respectively)." +msgstr "特殊值 ``sys.hash_info.inf`` 和 ``-sys.hash_info.inf`` 分别用于正无穷或负无穷的哈希值。" + +#: ../../library/stdtypes.rst:800 +msgid "" +"For a :class:`complex` number ``z``, the hash values of the real and " +"imaginary parts are combined by computing ``hash(z.real) + " +"sys.hash_info.imag * hash(z.imag)``, reduced modulo " +"``2**sys.hash_info.width`` so that it lies in " +"``range(-2**(sys.hash_info.width - 1), 2**(sys.hash_info.width - 1))``. " +"Again, if the result is ``-1``, it's replaced with ``-2``." +msgstr "" +"对于一个 :class:`complex` 值 ``z``,会通过计算 ``hash(z.real) + sys.hash_info.imag * " +"hash(z.imag)`` 将实部和虚部的哈希值结合起来,并进行降模 ``2**sys.hash_info.width`` 以使其处于 " +"``range(-2**(sys.hash_info.width - 1), 2**(sys.hash_info.width - 1))`` 范围之内。" +" 同样地,如果结果为 ``-1`` 则将其替换为 ``-2``。" + +#: ../../library/stdtypes.rst:808 +msgid "" +"To clarify the above rules, here's some example Python code, equivalent to " +"the built-in hash, for computing the hash of a rational number, " +":class:`float`, or :class:`complex`::" +msgstr "" +"为了阐明上述规则,这里有一些等价于内置哈希算法的 Python 代码示例,可用于计算有理数、:class:`float` 或 " +":class:`complex` 的哈希值::" + +#: ../../library/stdtypes.rst:813 +msgid "" +"import sys, math\n" +"\n" +"def hash_fraction(m, n):\n" +" \"\"\"Compute the hash of a rational number m / n.\n" +"\n" +" Assumes m and n are integers, with n positive.\n" +" Equivalent to hash(fractions.Fraction(m, n)).\n" +"\n" +" \"\"\"\n" +" P = sys.hash_info.modulus\n" +" # Remove common factors of P. (Unnecessary if m and n already coprime.)\n" +" while m % P == n % P == 0:\n" +" m, n = m // P, n // P\n" +"\n" +" if n % P == 0:\n" +" hash_value = sys.hash_info.inf\n" +" else:\n" +" # Fermat's Little Theorem: pow(n, P-1, P) is 1, so\n" +" # pow(n, P-2, P) gives the inverse of n modulo P.\n" +" hash_value = (abs(m) % P) * pow(n, P - 2, P) % P\n" +" if m < 0:\n" +" hash_value = -hash_value\n" +" if hash_value == -1:\n" +" hash_value = -2\n" +" return hash_value\n" +"\n" +"def hash_float(x):\n" +" \"\"\"Compute the hash of a float x.\"\"\"\n" +"\n" +" if math.isnan(x):\n" +" return object.__hash__(x)\n" +" elif math.isinf(x):\n" +" return sys.hash_info.inf if x > 0 else -sys.hash_info.inf\n" +" else:\n" +" return hash_fraction(*x.as_integer_ratio())\n" +"\n" +"def hash_complex(z):\n" +" \"\"\"Compute the hash of a complex number z.\"\"\"\n" +"\n" +" hash_value = hash_float(z.real) + sys.hash_info.imag * hash_float(z.imag)\n" +" # do a signed reduction modulo 2**sys.hash_info.width\n" +" M = 2**(sys.hash_info.width - 1)\n" +" hash_value = (hash_value & (M - 1)) - (hash_value & M)\n" +" if hash_value == -1:\n" +" hash_value = -2\n" +" return hash_value" +msgstr "" +"import sys, math\n" +"\n" +"def hash_fraction(m, n):\n" +" \"\"\"Compute the hash of a rational number m / n.\n" +"\n" +" Assumes m and n are integers, with n positive.\n" +" Equivalent to hash(fractions.Fraction(m, n)).\n" +"\n" +" \"\"\"\n" +" P = sys.hash_info.modulus\n" +" # 移除 P 的公因数。 (如果 m 和 n 互质则不需要。)\n" +" while m % P == n % P == 0:\n" +" m, n = m // P, n // P\n" +"\n" +" if n % P == 0:\n" +" hash_value = sys.hash_info.inf\n" +" else:\n" +" # 费马小定理:pow(n, P-1, P) 等于 1,\\n # 则 pow(n, P-2, P) 等于 n 除以 P 的余数的倒数。\n" +" hash_value = (abs(m) % P) * pow(n, P - 2, P) % P\n" +" if m < 0:\n" +" hash_value = -hash_value\n" +" if hash_value == -1:\n" +" hash_value = -2\n" +" return hash_value\n" +"\n" +"def hash_float(x):\n" +" \"\"\"Compute the hash of a float x.\"\"\"\n" +"\n" +" if math.isnan(x):\n" +" return object.__hash__(x)\n" +" elif math.isinf(x):\n" +" return sys.hash_info.inf if x > 0 else -sys.hash_info.inf\n" +" else:\n" +" return hash_fraction(*x.as_integer_ratio())\n" +"\n" +"def hash_complex(z):\n" +" \"\"\"Compute the hash of a complex number z.\"\"\"\n" +"\n" +" hash_value = hash_float(z.real) + sys.hash_info.imag * hash_float(z.imag)\n" +" # 带正负号的约减求余运算 2**sys.hash_info.width\n" +" M = 2**(sys.hash_info.width - 1)\n" +" hash_value = (hash_value & (M - 1)) - (hash_value & M)\n" +" if hash_value == -1:\n" +" hash_value = -2\n" +" return hash_value" + +#: ../../library/stdtypes.rst:864 +msgid "Boolean Type - :class:`bool`" +msgstr "布尔类型 - :class:`bool`" + +#: ../../library/stdtypes.rst:866 +msgid "" +"Booleans represent truth values. The :class:`bool` type has exactly two " +"constant instances: ``True`` and ``False``." +msgstr "代表真值的布尔对象。 :class:`bool` 类型只有两个常量实例: ``True`` 和 ``False``。" + +#: ../../library/stdtypes.rst:874 +msgid "" +"The built-in function :func:`bool` converts any value to a boolean, if the " +"value can be interpreted as a truth value (see section :ref:`truth` above)." +msgstr "内置函数 :func:`bool` 可将任意值转换为布尔值,如果该值可以被解读为逻辑值的话(参见上面的 :ref:`truth` 小节)。" + +#: ../../library/stdtypes.rst:877 +msgid "" +"For logical operations, use the :ref:`boolean operators ` ``and``, " +"``or`` and ``not``. When applying the bitwise operators ``&``, ``|``, ``^`` " +"to two booleans, they return a bool equivalent to the logical operations " +"\"and\", \"or\", \"xor\". However, the logical operators ``and``, ``or`` and" +" ``!=`` should be preferred over ``&``, ``|`` and ``^``." +msgstr "" +"对于逻辑运算,请使用 :ref:`布尔运算符 ` ``and``, ``or`` 和 ``not``。当于两个布尔值应用按位运算符 " +"``&``, ``|``, ``^`` 时,它们将返回一个等价于逻辑运算 \"与\", \"或\", \"异或\" 的布尔值。 " +"但是,更推荐使用逻辑运算符 ``and``, ``or`` 和 ``!=`` 而不是 ``&``, ``|`` 和 ``^``。" + +#: ../../library/stdtypes.rst:886 +msgid "" +"The use of the bitwise inversion operator ``~`` is deprecated and will raise" +" an error in Python 3.16." +msgstr "使用按位取反运算符 ``~`` 已被弃用并将在 Python 3.16 中引发错误。" + +#: ../../library/stdtypes.rst:889 +msgid "" +":class:`bool` is a subclass of :class:`int` (see :ref:`typesnumeric`). In " +"many numeric contexts, ``False`` and ``True`` behave like the integers 0 and" +" 1, respectively. However, relying on this is discouraged; explicitly " +"convert using :func:`int` instead." +msgstr "" +":class:`bool` 是 :class:`int` 的子类 (参见 :ref:`typesnumeric`)。 " +"在许多数字场景下,``False`` 和 ``True`` 的行为分别与整数 0 和 1 类似。但是,不建议这样使用;请使用 :func:`int` " +"显式地执行转换。" + +#: ../../library/stdtypes.rst:897 +msgid "Iterator Types" +msgstr "迭代器类型" + +#: ../../library/stdtypes.rst:905 +msgid "" +"Python supports a concept of iteration over containers. This is implemented" +" using two distinct methods; these are used to allow user-defined classes to" +" support iteration. Sequences, described below in more detail, always " +"support the iteration methods." +msgstr "" +"Python 支持在容器中进行迭代的概念。这是通过使用两个单独方法来实现的;它们被用于允许用户自定义类对迭代的支持。 " +"将在下文中详细描述的序列总是支持迭代方法。" + +#: ../../library/stdtypes.rst:910 +msgid "" +"One method needs to be defined for container objects to provide " +":term:`iterable` support:" +msgstr "容器对象要提供 :term:`iterable` 支持,必须定义一个方法:" + +#: ../../library/stdtypes.rst:917 +msgid "" +"Return an :term:`iterator` object. The object is required to support the " +"iterator protocol described below. If a container supports different types " +"of iteration, additional methods can be provided to specifically request " +"iterators for those iteration types. (An example of an object supporting " +"multiple forms of iteration would be a tree structure which supports both " +"breadth-first and depth-first traversal.) This method corresponds to the " +":c:member:`~PyTypeObject.tp_iter` slot of the type structure for Python " +"objects in the Python/C API." +msgstr "" +"返回一个 :term:`iterator` 对象。该对象需要支持下文所述的迭代器协议。 " +"如果容器支持不同的迭代类型,则可以提供额外的方法来专门地请求不同迭代类型的迭代器。 " +"(支持多种迭代形式的对象的例子有同时支持广度优先和深度优先遍历的树结构。)此方法对应于 Python/C API 中 Python 对象类型结构体的 " +":c:member:`~PyTypeObject.tp_iter` 槽位。" + +#: ../../library/stdtypes.rst:926 +msgid "" +"The iterator objects themselves are required to support the following two " +"methods, which together form the :dfn:`iterator protocol`:" +msgstr "迭代器对象自身需要支持以下两个方法,它们共同组成了 :dfn:`迭代器协议`:" + +#: ../../library/stdtypes.rst:932 +msgid "" +"Return the :term:`iterator` object itself. This is required to allow both " +"containers and iterators to be used with the :keyword:`for` and " +":keyword:`in` statements. This method corresponds to the " +":c:member:`~PyTypeObject.tp_iter` slot of the type structure for Python " +"objects in the Python/C API." +msgstr "" +"返回 :term:`iterator` 对象本身。这是同时允许容器和迭代器配合 :keyword:`for` 和 :keyword:`in` " +"语句使用所必须的。此方法对应于 Python/C API 中 Python 对象类型结构体的 " +":c:member:`~PyTypeObject.tp_iter` 槽位。" + +#: ../../library/stdtypes.rst:941 +msgid "" +"Return the next item from the :term:`iterator`. If there are no further " +"items, raise the :exc:`StopIteration` exception. This method corresponds to" +" the :c:member:`~PyTypeObject.tp_iternext` slot of the type structure for " +"Python objects in the Python/C API." +msgstr "" +"从 :term:`iterator` 中返回下一项。如果已经没有可返回的项,则会引发 :exc:`StopIteration` 异常。此方法对应于 " +"Python/C API 中 Python 对象类型结构体的 :c:member:`~PyTypeObject.tp_iternext` 槽位。" + +#: ../../library/stdtypes.rst:946 +msgid "" +"Python defines several iterator objects to support iteration over general " +"and specific sequence types, dictionaries, and other more specialized forms." +" The specific types are not important beyond their implementation of the " +"iterator protocol." +msgstr "" +"Python 定义了几种迭代器对象以支持对一般和特定序列类型、字典和其他更特别的形式进行迭代。 " +"除了迭代器协议的实现,特定类型的其他性质对迭代操作来说都不重要。" + +#: ../../library/stdtypes.rst:951 +msgid "" +"Once an iterator's :meth:`~iterator.__next__` method raises " +":exc:`StopIteration`, it must continue to do so on subsequent calls. " +"Implementations that do not obey this property are deemed broken." +msgstr "" +"一旦迭代器的 :meth:`~iterator.__next__` 方法引发了 " +":exc:`StopIteration`,它必须一直对后续调用引发同样的异常。不遵循此行为特性的实现将无法正常使用。" + +#: ../../library/stdtypes.rst:959 +msgid "Generator Types" +msgstr "生成器类型" + +#: ../../library/stdtypes.rst:961 +msgid "" +"Python's :term:`generator`\\s provide a convenient way to implement the " +"iterator protocol. If a container object's :meth:`~object.__iter__` method " +"is implemented as a generator, it will automatically return an iterator " +"object (technically, a generator object) supplying the " +":meth:`~iterator.__iter__` and :meth:`~generator.__next__` methods. More " +"information about generators can be found in :ref:`the documentation for the" +" yield expression `." +msgstr "" +"Python 的 :term:`generator` 提供了一种实现迭代器协议的便捷方式。如果一个容器对象的 " +":meth:`~object.__iter__` 方法以生成器的形式实现,它将自动返回一个提供 :meth:`~iterator.__iter__` 和" +" :meth:`~generator.__next__` 方法的迭代器对象(从技术上说,是一个生成器对象)。有关生成器的更多信息可参阅 " +":ref:`yield 表达式的文档 `。" + +#: ../../library/stdtypes.rst:973 +msgid "Sequence Types --- :class:`list`, :class:`tuple`, :class:`range`" +msgstr "序列类型 --- :class:`list`, :class:`tuple`, :class:`range`" + +#: ../../library/stdtypes.rst:975 +msgid "" +"There are three basic sequence types: lists, tuples, and range objects. " +"Additional sequence types tailored for processing of :ref:`binary data " +"` and :ref:`text strings ` are described in dedicated " +"sections." +msgstr "" +"有三种基本序列类型:list, tuple 和 range 对象。为处理 :ref:`二进制数据 ` 和 :ref:`文本字符串 " +"` 而特别定制的附加序列类型会在专门的小节中描述。" + +#: ../../library/stdtypes.rst:984 +msgid "Common Sequence Operations" +msgstr "通用序列操作" + +#: ../../library/stdtypes.rst:988 +msgid "" +"The operations in the following table are supported by most sequence types, " +"both mutable and immutable. The :class:`collections.abc.Sequence` ABC is " +"provided to make it easier to correctly implement these operations on custom" +" sequence types." +msgstr "" +"大多数序列类型,包括可变类型和不可变类型都支持下表中的操作。 :class:`collections.abc.Sequence` ABC " +"被提供用来更容易地在自定义序列类型上正确地实现这些操作。" + +#: ../../library/stdtypes.rst:993 +msgid "" +"This table lists the sequence operations sorted in ascending priority. In " +"the table, *s* and *t* are sequences of the same type, *n*, *i*, *j* and *k*" +" are integers and *x* is an arbitrary object that meets any type and value " +"restrictions imposed by *s*." +msgstr "" +"此表按优先级升序列出了序列操作。在表格中,*s* 和 *t* 是具有相同类型的序列,*n*, *i*, *j* 和 *k* 是整数而 *x* 是任何满足" +" *s* 所规定的类型和值限制的任意对象。" + +#: ../../library/stdtypes.rst:998 +msgid "" +"The ``in`` and ``not in`` operations have the same priorities as the " +"comparison operations. The ``+`` (concatenation) and ``*`` (repetition) " +"operations have the same priority as the corresponding numeric operations. " +"[3]_" +msgstr "" +"``in`` 和 ``not in`` 操作具有与比较操作相同的优先级。``+`` (拼接) 和 ``*`` (重复) " +"操作具有与对应数值运算相同的优先级。 [3]_" + +#: ../../library/stdtypes.rst:1017 +msgid "``x in s``" +msgstr "``x in s``" + +#: ../../library/stdtypes.rst:1017 +msgid "``True`` if an item of *s* is equal to *x*, else ``False``" +msgstr "如果 *s* 中的某项等于 *x* 则结果为 ``True``,否则为 ``False``" + +#: ../../library/stdtypes.rst:1020 +msgid "``x not in s``" +msgstr "``x not in s``" + +#: ../../library/stdtypes.rst:1020 +msgid "``False`` if an item of *s* is equal to *x*, else ``True``" +msgstr "如果 *s* 中的某项等于 *x* 则结果为 ``False``,否则为 ``True``" + +#: ../../library/stdtypes.rst:1023 +msgid "``s + t``" +msgstr "``s + t``" + +#: ../../library/stdtypes.rst:1023 +msgid "the concatenation of *s* and *t*" +msgstr "*s* 与 *t* 相拼接" + +#: ../../library/stdtypes.rst:1023 +msgid "(6)(7)" +msgstr "(6)(7)" + +#: ../../library/stdtypes.rst:1026 +msgid "``s * n`` or ``n * s``" +msgstr "``s * n`` 或 ``n * s``" + +#: ../../library/stdtypes.rst:1026 +msgid "equivalent to adding *s* to itself *n* times" +msgstr "相当于 *s* 与自身进行 *n* 次拼接" + +#: ../../library/stdtypes.rst:1026 +msgid "(2)(7)" +msgstr "(2)(7)" + +#: ../../library/stdtypes.rst:1029 +msgid "``s[i]``" +msgstr "``s[i]``" + +#: ../../library/stdtypes.rst:1029 +msgid "*i*\\ th item of *s*, origin 0" +msgstr "*s* 的第 *i* 项,起始为 0" + +#: ../../library/stdtypes.rst:1029 +msgid "(3)(8)" +msgstr "(3)(8)" + +#: ../../library/stdtypes.rst:1031 +msgid "``s[i:j]``" +msgstr "``s[i:j]``" + +#: ../../library/stdtypes.rst:1031 +msgid "slice of *s* from *i* to *j*" +msgstr "*s* 从 *i* 到 *j* 的切片" + +#: ../../library/stdtypes.rst:1031 +msgid "(3)(4)" +msgstr "(3)(4)" + +#: ../../library/stdtypes.rst:1033 +msgid "``s[i:j:k]``" +msgstr "``s[i:j:k]``" + +#: ../../library/stdtypes.rst:1033 +msgid "slice of *s* from *i* to *j* with step *k*" +msgstr "*s* 从 *i* 到 *j* 步长为 *k* 的切片" + +#: ../../library/stdtypes.rst:1033 +msgid "(3)(5)" +msgstr "(3)(5)" + +#: ../../library/stdtypes.rst:1036 +msgid "``len(s)``" +msgstr "``len(s)``" + +#: ../../library/stdtypes.rst:1036 +msgid "length of *s*" +msgstr "*s* 的长度" + +#: ../../library/stdtypes.rst:1038 +msgid "``min(s)``" +msgstr "``min(s)``" + +#: ../../library/stdtypes.rst:1038 +msgid "smallest item of *s*" +msgstr "*s* 的最小项" + +#: ../../library/stdtypes.rst:1040 +msgid "``max(s)``" +msgstr "``max(s)``" + +#: ../../library/stdtypes.rst:1040 +msgid "largest item of *s*" +msgstr "*s* 的最大项" + +#: ../../library/stdtypes.rst:1043 +msgid "" +"Sequences of the same type also support comparisons. In particular, tuples " +"and lists are compared lexicographically by comparing corresponding " +"elements. This means that to compare equal, every element must compare equal" +" and the two sequences must be of the same type and have the same length. " +"(For full details see :ref:`comparisons` in the language reference.)" +msgstr "" +"相同类型的序列也支持比较。特别地,tuple 和 list 的比较是通过比较对应元素的字典顺序。 " +"这意味着想要比较结果相等,则每个元素比较结果都必须相等,并且两个序列长度必须相同。 (完整细节请参阅语言参考的 :ref:`comparisons` " +"部分。)" + +#: ../../library/stdtypes.rst:1053 +msgid "" +"Forward and reversed iterators over mutable sequences access values using an" +" index. That index will continue to march forward (or backward) even if the" +" underlying sequence is mutated. The iterator terminates only when an " +":exc:`IndexError` or a :exc:`StopIteration` is encountered (or when the " +"index drops below zero)." +msgstr "" +"可变序列的正向和逆向迭代器使用一个索引来访问值。即使底层序列被改变该索引也将持续向前(或向后)步进。迭代器只有在遇到 :exc:`IndexError`" +" 或 :exc:`StopIteration` 时才会终结(或是当索引降至零以下)。" + +#: ../../library/stdtypes.rst:1062 +msgid "" +"While the ``in`` and ``not in`` operations are used only for simple " +"containment testing in the general case, some specialised sequences (such as" +" :class:`str`, :class:`bytes` and :class:`bytearray`) also use them for " +"subsequence testing::" +msgstr "" +"虽然 ``in`` 和 ``not in`` 操作在通常情况下仅被用于简单的成员检测,某些专门化序列 (例如 :class:`str`, " +":class:`bytes` 和 :class:`bytearray`) 也使用它们进行子序列检测::" + +#: ../../library/stdtypes.rst:1067 +msgid "" +">>> \"gg\" in \"eggs\"\n" +"True" +msgstr "" +">>> \"gg\" in \"eggs\"\n" +"True" + +#: ../../library/stdtypes.rst:1071 +msgid "" +"Values of *n* less than ``0`` are treated as ``0`` (which yields an empty " +"sequence of the same type as *s*). Note that items in the sequence *s* are " +"not copied; they are referenced multiple times. This often haunts new " +"Python programmers; consider::" +msgstr "" +"小于 ``0`` 的 *n* 值会被当作 ``0`` 来处理 (生成一个与 *s* 同类型的空序列)。请注意序列 *s* " +"中的项并不会被拷贝;它们会被多次引用。这一点经常会令 Python 编程新手感到困扰;例如::" + +#: ../../library/stdtypes.rst:1076 +msgid "" +">>> lists = [[]] * 3\n" +">>> lists\n" +"[[], [], []]\n" +">>> lists[0].append(3)\n" +">>> lists\n" +"[[3], [3], [3]]" +msgstr "" +">>> lists = [[]] * 3\n" +">>> lists\n" +"[[], [], []]\n" +">>> lists[0].append(3)\n" +">>> lists\n" +"[[3], [3], [3]]" + +#: ../../library/stdtypes.rst:1083 +msgid "" +"What has happened is that ``[[]]`` is a one-element list containing an empty" +" list, so all three elements of ``[[]] * 3`` are references to this single " +"empty list. Modifying any of the elements of ``lists`` modifies this single" +" list. You can create a list of different lists this way::" +msgstr "" +"具体的原因在于 ``[[]]`` 是一个包含了一个空列表的单元素列表,所以 ``[[]] * 3`` 结果中的三个元素都是对这一个空列表的引用。修改 " +"``lists`` 中的任何一个元素实际上都是对这一个空列表的修改。你可以用以下方式创建以不同列表为元素的列表::" + +#: ../../library/stdtypes.rst:1088 +msgid "" +">>> lists = [[] for i in range(3)]\n" +">>> lists[0].append(3)\n" +">>> lists[1].append(5)\n" +">>> lists[2].append(7)\n" +">>> lists\n" +"[[3], [5], [7]]" +msgstr "" +">>> lists = [[] for i in range(3)]\n" +">>> lists[0].append(3)\n" +">>> lists[1].append(5)\n" +">>> lists[2].append(7)\n" +">>> lists\n" +"[[3], [5], [7]]" + +#: ../../library/stdtypes.rst:1095 +msgid "" +"Further explanation is available in the FAQ entry :ref:`faq-" +"multidimensional-list`." +msgstr "进一步的解释可以在 FAQ 条目 :ref:`faq-multidimensional-list` 中查看。" + +#: ../../library/stdtypes.rst:1099 +msgid "" +"If *i* or *j* is negative, the index is relative to the end of sequence *s*:" +" ``len(s) + i`` or ``len(s) + j`` is substituted. But note that ``-0`` is " +"still ``0``." +msgstr "" +"如果 *i* 或 *j* 为负值,则索引顺序是相对于序列 *s* 的末尾:索引号会被替换为 ``len(s) + i`` 或 ``len(s) + " +"j``。但要注意 ``-0`` 仍然为 ``0``。" + +#: ../../library/stdtypes.rst:1104 +msgid "" +"The slice of *s* from *i* to *j* is defined as the sequence of items with " +"index *k* such that ``i <= k < j``." +msgstr "*s* 的从 *i* 到 *j* 的切片被定义为由索引号 *k* 使得 ``i <= k < j`` 的条目组成的序列。" + +#: ../../library/stdtypes.rst:1107 +msgid "If *i* is omitted or ``None``, use ``0``." +msgstr "如果 *i* 被省略或为 ``None``,则使用 ``0``。" + +#: ../../library/stdtypes.rst:1108 +msgid "If *j* is omitted or ``None``, use ``len(s)``." +msgstr "如果 *j* 被省略或为 ``None``,则使用 ``len(s)``。" + +#: ../../library/stdtypes.rst:1109 +msgid "If *i* or *j* is less than ``-len(s)``, use ``0``." +msgstr "如果 *i* 或 *j* 小于 ``-len(s)``,则使用 ``0``。" + +#: ../../library/stdtypes.rst:1110 +msgid "If *i* or *j* is greater than ``len(s)``, use ``len(s)``." +msgstr "如果 *i* 或 *j* 大于 ``len(s)``,则使用 ``len(s)``。" + +#: ../../library/stdtypes.rst:1111 +msgid "If *i* is greater than or equal to *j*, the slice is empty." +msgstr "如果 *i* 大于等于 *j*,则切片将为空。" + +#: ../../library/stdtypes.rst:1114 +msgid "" +"The slice of *s* from *i* to *j* with step *k* is defined as the sequence of" +" items with index ``x = i + n*k`` such that ``0 <= n < (j-i)/k``. In other" +" words, the indices are ``i``, ``i+k``, ``i+2*k``, ``i+3*k`` and so on, " +"stopping when *j* is reached (but never including *j*). When *k* is " +"positive, *i* and *j* are reduced to ``len(s)`` if they are greater. When " +"*k* is negative, *i* and *j* are reduced to ``len(s) - 1`` if they are " +"greater. If *i* or *j* are omitted or ``None``, they become \"end\" values " +"(which end depends on the sign of *k*). Note, *k* cannot be zero. If *k* is" +" ``None``, it is treated like ``1``." +msgstr "" +"*s* 从 *i* 到 *j* 步长为 *k* 的切片被定义为所有满足 ``0 <= n < (j-i)/k`` 的索引号 ``x = i + " +"n*k`` 的项组成的序列。换句话说,索引号为 ``i``, ``i+k``, ``i+2*k``, ``i+3*k``,以此类推,当达到 *j* " +"时停止 (但一定不包括 *j*)。当 *k* 为正值时,*i* 和 *j* 会被减至不大于 ``len(s)``。当 *k* 为负值时,*i* 和 " +"*j* 会被减至不大于 ``len(s) - 1``。如果 *i* 或 *j* 被省略或为 ``None``,它们会成为“终止”值 " +"(是哪一端的终止值则取决于 *k* 的符号)。请注意,*k* 不可为零。如果 *k* 为 ``None``,则当作 ``1`` 处理。" + +#: ../../library/stdtypes.rst:1125 +msgid "" +"Concatenating immutable sequences always results in a new object. This " +"means that building up a sequence by repeated concatenation will have a " +"quadratic runtime cost in the total sequence length. To get a linear " +"runtime cost, you must switch to one of the alternatives below:" +msgstr "" +"拼接不可变序列总是会生成新的对象。这意味着通过重复拼接来构建序列的运行时开销将会基于序列总长度的乘方。 " +"想要获得线性的运行时开销,你必须改用下列替代方案之一:" + +#: ../../library/stdtypes.rst:1130 +msgid "" +"if concatenating :class:`str` objects, you can build a list and use " +":meth:`str.join` at the end or else write to an :class:`io.StringIO` " +"instance and retrieve its value when complete" +msgstr "" +"如果拼接 :class:`str` 对象,你可以构建一个列表并在最后使用 :meth:`str.join` 或是写入一个 " +":class:`io.StringIO` 实例并在结束时获取它的值" + +#: ../../library/stdtypes.rst:1134 +msgid "" +"if concatenating :class:`bytes` objects, you can similarly use " +":meth:`bytes.join` or :class:`io.BytesIO`, or you can do in-place " +"concatenation with a :class:`bytearray` object. :class:`bytearray` objects " +"are mutable and have an efficient overallocation mechanism" +msgstr "" +"如果拼接 :class:`bytes` 对象,你可以类似地使用 :meth:`bytes.join` 或 " +":class:`io.BytesIO`,或者你也可以使用 :class:`bytearray` 对象进行原地拼接。 :class:`bytearray`" +" 对象是可变的,并且具有高效的重分配机制" + +#: ../../library/stdtypes.rst:1139 +msgid "" +"if concatenating :class:`tuple` objects, extend a :class:`list` instead" +msgstr "如果拼接 :class:`tuple` 对象,请改为扩展 :class:`list` 类" + +#: ../../library/stdtypes.rst:1141 +msgid "for other types, investigate the relevant class documentation" +msgstr "对于其它类型,请查看相应的文档" + +#: ../../library/stdtypes.rst:1145 +msgid "" +"Some sequence types (such as :class:`range`) only support item sequences " +"that follow specific patterns, and hence don't support sequence " +"concatenation or repetition." +msgstr "某些序列类型 (例如 :class:`range`) 仅支持遵循特定模式的项序列,因此并不支持序列拼接或重复。" + +#: ../../library/stdtypes.rst:1150 +msgid "An :exc:`IndexError` is raised if *i* is outside the sequence range." +msgstr "如果 *i* 超出了序列范围则会引发 :exc:`IndexError`。" + +#: ../../library/stdtypes.rst:1153 +msgid "Sequence Methods" +msgstr "序列方法" + +#: ../../library/stdtypes.rst:1154 +msgid "Sequence types also support the following methods:" +msgstr "序列类型还支持下列方法:" + +#: ../../library/stdtypes.rst:1164 +msgid "Return the total number of occurrences of *value* in *sequence*." +msgstr "返回 *value* 在 *sequence* 中出现的总次数。" + +#: ../../library/stdtypes.rst:1174 +msgid "Return the index of the first occurrence of *value* in *sequence*." +msgstr "返回 *value* 在 *sequence* 中首次出现所在的索引号。" + +#: ../../library/stdtypes.rst:1176 ../../library/stdtypes.rst:1360 +msgid "Raises :exc:`ValueError` if *value* is not found in *sequence*." +msgstr "如果 *value* 不存在于 *sequence* 中则会引发 :exc:`ValueError`。" + +#: ../../library/stdtypes.rst:1178 +msgid "" +"The *start* or *stop* arguments allow for efficient searching of subsections" +" of the sequence, beginning at *start* and ending at *stop*. This is roughly" +" equivalent to ``start + sequence[start:stop].index(value)``, only without " +"copying any data." +msgstr "" +"*start* 或 *stop* 参数允许对序列的一部分进行高效搜索,从 *start* 开始到 *stop* 结束。这大致等价于 ``start + " +"sequence[start:stop].index(value)``,但不会拷贝任何数据。" + +#: ../../library/stdtypes.rst:1184 +msgid "" +"Not all sequence types support passing the *start* and *stop* arguments." +msgstr "不是所有序列都支持传入 *start* 和 *stop* 参数。" + +#: ../../library/stdtypes.rst:1190 +msgid "Immutable Sequence Types" +msgstr "不可变序列类型" + +#: ../../library/stdtypes.rst:1197 +msgid "" +"The only operation that immutable sequence types generally implement that is" +" not also implemented by mutable sequence types is support for the " +":func:`hash` built-in." +msgstr "不可变序列类型普遍实现而可变序列类型未实现的唯一操作就是对 :func:`hash` 内置函数的支持。" + +#: ../../library/stdtypes.rst:1201 +msgid "" +"This support allows immutable sequences, such as :class:`tuple` instances, " +"to be used as :class:`dict` keys and stored in :class:`set` and " +":class:`frozenset` instances." +msgstr "" +"这种支持允许不可变类型,例如 :class:`tuple` 实例被用作 :class:`dict` 键,以及存储在 :class:`set` 和 " +":class:`frozenset` 实例中。" + +#: ../../library/stdtypes.rst:1205 +msgid "" +"Attempting to hash an immutable sequence that contains unhashable values " +"will result in :exc:`TypeError`." +msgstr "尝试对包含有不可哈希值的不可变序列进行哈希运算将会导致 :exc:`TypeError`。" + +#: ../../library/stdtypes.rst:1212 +msgid "Mutable Sequence Types" +msgstr "可变序列类型" + +#: ../../library/stdtypes.rst:1219 +msgid "" +"The operations in the following table are defined on mutable sequence types." +" The :class:`collections.abc.MutableSequence` ABC is provided to make it " +"easier to correctly implement these operations on custom sequence types." +msgstr "" +"以下表格中的操作是在可变序列类型上定义的。 :class:`collections.abc.MutableSequence` ABC " +"被提供用来更容易地在自定义序列类型上正确实现这些操作。" + +#: ../../library/stdtypes.rst:1223 +msgid "" +"In the table *s* is an instance of a mutable sequence type, *t* is any " +"iterable object and *x* is an arbitrary object that meets any type and value" +" restrictions imposed by *s* (for example, :class:`bytearray` only accepts " +"integers that meet the value restriction ``0 <= x <= 255``)." +msgstr "" +"表格中的 *s* 是可变序列类型的实例,*t* 是任意可迭代对象,而 *x* 是符合对 *s* 所规定类型与值限制的任何对象 " +"(例如,:class:`bytearray` 仅接受满足 ``0 <= x <= 255`` 值限制的整数)。" + +#: ../../library/stdtypes.rst:1239 +msgid "``s[i] = x``" +msgstr "``s[i] = x``" + +#: ../../library/stdtypes.rst:1239 +msgid "item *i* of *s* is replaced by *x*" +msgstr "将 *s* 的第 *i* 项替换为 *x*" + +#: ../../library/stdtypes.rst:1242 +msgid "``del s[i]``" +msgstr "``del s[i]``" + +#: ../../library/stdtypes.rst:1242 +msgid "removes item *i* of *s*" +msgstr "移除 *s* 的 *i* 号项。" + +#: ../../library/stdtypes.rst:1244 +msgid "``s[i:j] = t``" +msgstr "``s[i:j] = t``" + +#: ../../library/stdtypes.rst:1244 +msgid "" +"slice of *s* from *i* to *j* is replaced by the contents of the iterable *t*" +msgstr "将 *s* 从 *i* 到 *j* 的切片替换为可迭代对象 *t* 的内容" + +#: ../../library/stdtypes.rst:1248 +msgid "``del s[i:j]``" +msgstr "``del s[i:j]``" + +#: ../../library/stdtypes.rst:1248 +msgid "" +"removes the elements of ``s[i:j]`` from the list (same as ``s[i:j] = []``)" +msgstr "从列表中移除切片 ``s[i:j]`` 的元素(等同于执行 ``s[i:j] = []`` 操作)" + +#: ../../library/stdtypes.rst:1252 +msgid "``s[i:j:k] = t``" +msgstr "``s[i:j:k] = t``" + +#: ../../library/stdtypes.rst:1252 +msgid "the elements of ``s[i:j:k]`` are replaced by those of *t*" +msgstr "将 ``s[i:j:k]`` 的元素替换为 *t* 的元素" + +#: ../../library/stdtypes.rst:1255 +msgid "``del s[i:j:k]``" +msgstr "``del s[i:j:k]``" + +#: ../../library/stdtypes.rst:1255 +msgid "removes the elements of ``s[i:j:k]`` from the list" +msgstr "从列表中移除 ``s[i:j:k]`` 的元素" + +#: ../../library/stdtypes.rst:1258 +msgid "``s += t``" +msgstr "``s += t``" + +#: ../../library/stdtypes.rst:1258 +msgid "" +"extends *s* with the contents of *t* (for the most part the same as " +"``s[len(s):len(s)] = t``)" +msgstr "用 *t* 的内容扩展 *s* (基本上等同于 ``s[len(s):len(s)] = t``)" + +#: ../../library/stdtypes.rst:1263 +msgid "``s *= n``" +msgstr "``s *= n``" + +#: ../../library/stdtypes.rst:1263 +msgid "updates *s* with its contents repeated *n* times" +msgstr "使用 *s* 的内容重复 *n* 次来对其进行更新" + +#: ../../library/stdtypes.rst:1270 +msgid "" +"If *k* is not equal to ``1``, *t* must have the same length as the slice it " +"is replacing." +msgstr "如果 *k* 不等于 ``1``,则 *t* 必须与它所替换的切片具有相同的长度。" + +#: ../../library/stdtypes.rst:1273 +msgid "" +"The value *n* is an integer, or an object implementing " +":meth:`~object.__index__`. Zero and negative values of *n* clear the " +"sequence. Items in the sequence are not copied; they are referenced " +"multiple times, as explained for ``s * n`` under :ref:`typesseq-common`." +msgstr "" +"*n* 值为一个整数,或是一个实现了 :meth:`~object.__index__` 的对象。 *n* 值为零或负数将清空序列。 " +"序列中的项不会被拷贝;它们会被多次引用,正如 :ref:`typesseq-common` 中有关 ``s * n`` 的说明。" + +#: ../../library/stdtypes.rst:1279 +msgid "Mutable Sequence Methods" +msgstr "可变序列方法" + +#: ../../library/stdtypes.rst:1280 +msgid "Mutable sequence types also support the following methods:" +msgstr "可变序列类型还支持下列方法:" + +#: ../../library/stdtypes.rst:1289 +msgid "" +"Append *value* to the end of the sequence. This is equivalent to writing " +"``seq[len(seq):len(seq)] = [value]``." +msgstr "将 *value* 添加到序列的末尾。 这等价于 ``seq[len(seq):len(seq)] = [value]`` 的写法。" + +#: ../../library/stdtypes.rst:1301 +msgid "" +"Remove all items from *sequence*. This is equivalent to writing ``del " +"sequence[:]``." +msgstr "移除 *sequence* 中的所有条目。这等价于 ``del sequence[:]``。" + +#: ../../library/stdtypes.rst:1313 +msgid "" +"Create a shallow copy of *sequence*. This is equivalent to writing " +"``sequence[:]``." +msgstr "创建 *sequence* 的浅拷贝。这等价于 ``sequence[:]``。" + +#: ../../library/stdtypes.rst:1316 +msgid "" +"The :meth:`!copy` method is not part of the " +":class:`~collections.abc.MutableSequence` :class:`~abc.ABC`, but most " +"concrete mutable sequence types provide it." +msgstr "" +":meth:`!copy` 方法不是 :class:`~collections.abc.MutableSequence` " +":class:`~abc.ABC` 的一部分,但大多数实体可变序列类型都提供此方法。" + +#: ../../library/stdtypes.rst:1327 +msgid "" +"Extend *sequence* with the contents of *iterable*. For the most part, this " +"is the same as writing ``seq[len(seq):len(seq)] = iterable``." +msgstr "" +"使用 *iterable* 的内容扩展 *sequence*。大体上,这与 ``seq[len(seq):len(seq)] = iterable`` " +"相同。" + +#: ../../library/stdtypes.rst:1338 +msgid "" +"Insert *value* into *sequence* at the given *index*. This is equivalent to " +"writing ``sequence[index:index] = [value]``." +msgstr "" +"将 *value* 在给定的 *index* 位置插入到 *sequence* 中。这等价于 ``sequence[index:index] = " +"[value]``." + +#: ../../library/stdtypes.rst:1348 +msgid "" +"Retrieve the item at *index* and also removes it from *sequence*. By " +"default, the last item in *sequence* is removed and returned." +msgstr "" +"提取位于 *index* 上的条目并从 *sequence* 中将其移除。在默认情况下,将移除并返回 *sequence* 中的最后一个条目。" + +#: ../../library/stdtypes.rst:1358 +msgid "Remove the first item from *sequence* where ``sequence[i] == value``." +msgstr "从 *sequence* 中移除满足 ``sequence[i] == value`` 的第一个条目。" + +#: ../../library/stdtypes.rst:1369 +msgid "" +"Reverse the items of *sequence* in place. This method maintains economy of " +"space when reversing a large sequence. To remind users that it operates by " +"side-effect, it returns ``None``." +msgstr "" +"原地反转 *sequence* 的条目。此方法会在反转大尺寸序列时保持空间经济性。为提醒用户此操作是通过间接影响进行的,它的返回值为 ``None``." + +#: ../../library/stdtypes.rst:1377 +msgid "Lists" +msgstr "列表" + +#: ../../library/stdtypes.rst:1381 +msgid "" +"Lists are mutable sequences, typically used to store collections of " +"homogeneous items (where the precise degree of similarity will vary by " +"application)." +msgstr "列表是可变序列,通常用于存放同类项目的集合(其中精确的相似程度将根据应用而变化)。" + +#: ../../library/stdtypes.rst:1387 +msgid "Lists may be constructed in several ways:" +msgstr "可以用多种方式构建列表:" + +#: ../../library/stdtypes.rst:1389 +msgid "Using a pair of square brackets to denote the empty list: ``[]``" +msgstr "使用一对方括号来表示空列表: ``[]``" + +#: ../../library/stdtypes.rst:1390 +msgid "" +"Using square brackets, separating items with commas: ``[a]``, ``[a, b, c]``" +msgstr "使用方括号,其中的项以逗号分隔: ``[a]``, ``[a, b, c]``" + +#: ../../library/stdtypes.rst:1391 +msgid "Using a list comprehension: ``[x for x in iterable]``" +msgstr "使用列表推导式: ``[x for x in iterable]``" + +#: ../../library/stdtypes.rst:1392 +msgid "Using the type constructor: ``list()`` or ``list(iterable)``" +msgstr "使用类型的构造器: ``list()`` 或 ``list(iterable)``" + +#: ../../library/stdtypes.rst:1394 +msgid "" +"The constructor builds a list whose items are the same and in the same order" +" as *iterable*'s items. *iterable* may be either a sequence, a container " +"that supports iteration, or an iterator object. If *iterable* is already a " +"list, a copy is made and returned, similar to ``iterable[:]``. For example, " +"``list('abc')`` returns ``['a', 'b', 'c']`` and ``list( (1, 2, 3) )`` " +"returns ``[1, 2, 3]``. If no argument is given, the constructor creates a " +"new empty list, ``[]``." +msgstr "" +"构造器将构造一个列表,其中的项与 *iterable* 中的项具有相同的的值与顺序。 *iterable* 可以是序列、支持迭代的容器或其它可迭代对象。" +" 如果 *iterable* 已经是一个列表,将创建并返回其副本,类似于 ``iterable[:]``。例如,``list('abc')`` 返回 " +"``['a', 'b', 'c']`` 而 ``list( (1, 2, 3) )`` 返回 ``[1, 2, 3]``。 " +"如果没有给出参数,构造器将创建一个空列表 ``[]``。" + +#: ../../library/stdtypes.rst:1403 +msgid "" +"Many other operations also produce lists, including the :func:`sorted` " +"built-in." +msgstr "其它许多操作也会产生列表,包括 :func:`sorted` 内置函数。" + +#: ../../library/stdtypes.rst:1406 +msgid "Lists are :ref:`generic ` over the types of their items." +msgstr "" + +#: ../../library/stdtypes.rst:1408 +msgid "" +"Lists implement all of the :ref:`common ` and :ref:`mutable" +" ` sequence operations. Lists also provide the following " +"additional method:" +msgstr "" +"列表实现了所有 :ref:`一般 ` 和 :ref:`可变 ` 序列的操作。 " +"列表还额外提供了以下方法:" + +#: ../../library/stdtypes.rst:1414 +msgid "" +"This method sorts the list in place, using only ``<`` comparisons between " +"items. Exceptions are not suppressed - if any comparison operations fail, " +"the entire sort operation will fail (and the list will likely be left in a " +"partially modified state)." +msgstr "" +"此方法会对列表进行原地排序,只使用 ``<`` 来进行各项间比较。异常不会被屏蔽 —— " +"如果有任何比较操作失败,整个排序操作将失败(而列表可能会处于被部分修改的状态)。" + +#: ../../library/stdtypes.rst:1419 +msgid "" +":meth:`sort` accepts two arguments that can only be passed by keyword " +"(:ref:`keyword-only arguments `):" +msgstr "" +":meth:`sort` 接受两个仅限以关键字形式传入的参数 (:ref:`仅限关键字参数 `):" + +#: ../../library/stdtypes.rst:1422 +msgid "" +"*key* specifies a function of one argument that is used to extract a " +"comparison key from each list element (for example, ``key=str.lower``). The " +"key corresponding to each item in the list is calculated once and then used " +"for the entire sorting process. The default value of ``None`` means that " +"list items are sorted directly without calculating a separate key value." +msgstr "" +"*key* 指定带有一个参数的函数,用于从每个列表元素中提取比较键 (例如 ``key=str.lower``)。 " +"对应于列表中每一项的键会被计算一次,然后在整个排序过程中使用。默认值 ``None`` 表示直接对列表项排序而不计算一个单独的键值。" + +#: ../../library/stdtypes.rst:1429 +msgid "" +"The :func:`functools.cmp_to_key` utility is available to convert a 2.x style" +" *cmp* function to a *key* function." +msgstr "可以使用 :func:`functools.cmp_to_key` 将 2.x 风格的 *cmp* 函数转换为 *key* 函数。" + +#: ../../library/stdtypes.rst:1432 +msgid "" +"*reverse* is a boolean value. If set to ``True``, then the list elements " +"are sorted as if each comparison were reversed." +msgstr "*reverse* 为一个布尔值。如果设为 ``True``,则每个列表元素将按反向顺序比较进行排序。" + +#: ../../library/stdtypes.rst:1435 +msgid "" +"This method modifies the sequence in place for economy of space when sorting" +" a large sequence. To remind users that it operates by side effect, it does" +" not return the sorted sequence (use :func:`sorted` to explicitly request a " +"new sorted list instance)." +msgstr "" +"当排序大尺寸序列时此方法会原地修改该序列以保证空间经济性。为提醒用户此操作是通过间接影响进行的,它并不会返回排序后的序列(请使用 " +":func:`sorted` 显式地请求一个新的已排序列表实例)。" + +#: ../../library/stdtypes.rst:1440 +msgid "" +"The :meth:`sort` method is guaranteed to be stable. A sort is stable if it " +"guarantees not to change the relative order of elements that compare equal " +"--- this is helpful for sorting in multiple passes (for example, sort by " +"department, then by salary grade)." +msgstr "" +":meth:`sort` 方法确保是稳定的。如果一个排序确保不会改变比较结果相等的元素的相对顺序就称其为稳定的 --- " +"这有利于进行多重排序(例如先按部门、再按薪级排序)。" + +#: ../../library/stdtypes.rst:1445 +msgid "" +"For sorting examples and a brief sorting tutorial, see :ref:`sortinghowto`." +msgstr "有关排序示例和简要排序教程,请参阅 :ref:`sortinghowto`。" + +#: ../../library/stdtypes.rst:1449 +msgid "" +"While a list is being sorted, the effect of attempting to mutate, or even " +"inspect, the list is undefined. The C implementation of Python makes the " +"list appear empty for the duration, and raises :exc:`ValueError` if it can " +"detect that the list has been mutated during a sort." +msgstr "" +"在一个列表被排序期间,尝试改变甚至进行检测也会造成未定义的影响。Python 的 C " +"实现会在排序期间将列表显示为空,如果发现列表在排序期间被改变将会引发 :exc:`ValueError`。" + +#: ../../library/stdtypes.rst:1456 +msgid "" +"For detailed information on thread-safety guarantees for :class:`list` " +"objects, see :ref:`thread-safety-list`." +msgstr "有关 :class:`list` 对象的线程安全性保证的详情,请参阅 :ref:`thread-safety-list`。" + +#: ../../library/stdtypes.rst:1463 +msgid "Tuples" +msgstr "元组" + +#: ../../library/stdtypes.rst:1467 +msgid "" +"Tuples are immutable sequences, typically used to store collections of " +"heterogeneous data (such as the 2-tuples produced by the :func:`enumerate` " +"built-in). Tuples are also used for cases where an immutable sequence of " +"homogeneous data is needed (such as allowing storage in a :class:`set` or " +":class:`dict` instance)." +msgstr "" +"元组是不可变序列,通常用于储存异构数据的多项集(例如由 :func:`enumerate` 内置函数所产生的二元组)。 " +"元组也被用于需要同构数据的不可变序列的情况(例如允许存储到 :class:`set` 或 :class:`dict` 的实例)。" + +#: ../../library/stdtypes.rst:1475 +msgid "Tuples may be constructed in a number of ways:" +msgstr "可以用多种方式构建元组:" + +#: ../../library/stdtypes.rst:1477 +msgid "Using a pair of parentheses to denote the empty tuple: ``()``" +msgstr "使用一对圆括号来表示空元组: ``()``" + +#: ../../library/stdtypes.rst:1478 +msgid "Using a trailing comma for a singleton tuple: ``a,`` or ``(a,)``" +msgstr "使用一个后缀的逗号来表示单元组: ``a,`` 或 ``(a,)``" + +#: ../../library/stdtypes.rst:1479 +msgid "Separating items with commas: ``a, b, c`` or ``(a, b, c)``" +msgstr "使用以逗号分隔的多个项: ``a, b, c`` 或 ``(a, b, c)``" + +#: ../../library/stdtypes.rst:1480 +msgid "Using the :func:`tuple` built-in: ``tuple()`` or ``tuple(iterable)``" +msgstr "使用内置的 :func:`tuple`: ``tuple()`` 或 ``tuple(iterable)``" + +#: ../../library/stdtypes.rst:1482 +msgid "" +"The constructor builds a tuple whose items are the same and in the same " +"order as *iterable*'s items. *iterable* may be either a sequence, a " +"container that supports iteration, or an iterator object. If *iterable* is " +"already a tuple, it is returned unchanged. For example, ``tuple('abc')`` " +"returns ``('a', 'b', 'c')`` and ``tuple( [1, 2, 3] )`` returns ``(1, 2, " +"3)``. If no argument is given, the constructor creates a new empty tuple, " +"``()``." +msgstr "" +"构造器将构造一个元组,其中的项与 *iterable* 中的项具有相同的值与顺序。 *iterable* 可以是序列、支持迭代的容器或其他可迭代对象。 " +"如果 *iterable* 已经是一个元组,会不加改变地将其返回。例如,``tuple('abc')`` 返回 ``('a', 'b', 'c')`` " +"而 ``tuple( [1, 2, 3] )`` 返回 ``(1, 2, 3)``。如果没有给出参数,构造器将创建一个空元组 ``()``。" + +#: ../../library/stdtypes.rst:1490 +msgid "" +"Note that it is actually the comma which makes a tuple, not the parentheses." +" The parentheses are optional, except in the empty tuple case, or when they " +"are needed to avoid syntactic ambiguity. For example, ``f(a, b, c)`` is a " +"function call with three arguments, while ``f((a, b, c))`` is a function " +"call with a 3-tuple as the sole argument." +msgstr "" +"请注意决定生成元组的其实是逗号而不是圆括号。圆括号只是可选的,生成空元组或需要避免语法歧义的情况除外。例如,``f(a, b, c)`` " +"是在调用函数时附带三个参数,而 ``f((a, b, c))`` 则是在调用函数时附带一个三元组。" + +#: ../../library/stdtypes.rst:1496 +msgid "" +"Tuples implement all of the :ref:`common ` sequence " +"operations." +msgstr "元组实现了所有 :ref:`一般 ` 序列的操作。" + +#: ../../library/stdtypes.rst:1499 +msgid "" +"Tuples are :ref:`generic ` over the types of their contents. For " +"more information, refer to :ref:`the typing documentation on annotating " +"tuples `." +msgstr "" + +#: ../../library/stdtypes.rst:1503 +msgid "" +"For heterogeneous collections of data where access by name is clearer than " +"access by index, :func:`collections.namedtuple` may be a more appropriate " +"choice than a simple tuple object." +msgstr "" +"对于通过名称访问相比通过索引访问更清晰的异构数据多项集,:func:`collections.namedtuple` " +"可能是比简单元组对象更为合适的选择。" + +#: ../../library/stdtypes.rst:1511 +msgid "Ranges" +msgstr "range 对象" + +#: ../../library/stdtypes.rst:1515 +msgid "" +"The :class:`range` type represents an immutable sequence of numbers and is " +"commonly used for looping a specific number of times in :keyword:`for` " +"loops." +msgstr ":class:`range` 类型表示不可变的数字序列,通常用于在 :keyword:`for` 循环中循环指定的次数。" + +#: ../../library/stdtypes.rst:1522 +msgid "" +"The arguments to the range constructor must be integers (either built-in " +":class:`int` or any object that implements the :meth:`~object.__index__` " +"special method). If the *step* argument is omitted, it defaults to ``1``. " +"If the *start* argument is omitted, it defaults to ``0``. If *step* is zero," +" :exc:`ValueError` is raised." +msgstr "" +"range 构造器的参数必须为整数(可以是内置的 :class:`int` 或任何实现了 :meth:`~object.__index__` " +"特殊方法的对象)。如果省略 *step* 参数,则默认为 ``1``。如果省略 *start* 参数,则默认为 ``0``。如果 *step* " +"为零,则会引发 :exc:`ValueError`。" + +#: ../../library/stdtypes.rst:1528 +msgid "" +"For a positive *step*, the contents of a range ``r`` are determined by the " +"formula ``r[i] = start + step*i`` where ``i >= 0`` and ``r[i] < stop``." +msgstr "" +"如果 *step* 为正值,确定 range ``r`` 内容的公式为 ``r[i] = start + step*i`` 其中 ``i >= 0`` " +"且 ``r[i] < stop``。" + +#: ../../library/stdtypes.rst:1532 +msgid "" +"For a negative *step*, the contents of the range are still determined by the" +" formula ``r[i] = start + step*i``, but the constraints are ``i >= 0`` and " +"``r[i] > stop``." +msgstr "" +"如果 *step* 为负值,确定 range 内容的公式仍然为 ``r[i] = start + step*i``,但限制条件改为 ``i >= 0``" +" 且 ``r[i] > stop``." + +#: ../../library/stdtypes.rst:1536 +msgid "" +"A range object will be empty if ``r[0]`` does not meet the value constraint." +" Ranges do support negative indices, but these are interpreted as indexing " +"from the end of the sequence determined by the positive indices." +msgstr "" +"如果 ``r[0]`` 不符合值的限制条件,则该 range 对象为空。range " +"对象确实支持负索引,但是会将其解读为从正索引所确定的序列的末尾开始索引。" + +#: ../../library/stdtypes.rst:1541 +msgid "" +"Ranges containing absolute values larger than :data:`sys.maxsize` are " +"permitted but some features (such as :func:`len`) may raise " +":exc:`OverflowError`." +msgstr "" +"元素绝对值大于 :data:`sys.maxsize` 的 range 对象是被允许的,但某些特性 (例如 :func:`len`) 可能引发 " +":exc:`OverflowError`." + +#: ../../library/stdtypes.rst:1545 +msgid "Range examples::" +msgstr "一些 range 对象的例子::" + +#: ../../library/stdtypes.rst:1547 +msgid "" +">>> list(range(10))\n" +"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n" +">>> list(range(1, 11))\n" +"[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n" +">>> list(range(0, 30, 5))\n" +"[0, 5, 10, 15, 20, 25]\n" +">>> list(range(0, 10, 3))\n" +"[0, 3, 6, 9]\n" +">>> list(range(0, -10, -1))\n" +"[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]\n" +">>> list(range(0))\n" +"[]\n" +">>> list(range(1, 0))\n" +"[]" +msgstr "" +">>> list(range(10))\n" +"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n" +">>> list(range(1, 11))\n" +"[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n" +">>> list(range(0, 30, 5))\n" +"[0, 5, 10, 15, 20, 25]\n" +">>> list(range(0, 10, 3))\n" +"[0, 3, 6, 9]\n" +">>> list(range(0, -10, -1))\n" +"[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]\n" +">>> list(range(0))\n" +"[]\n" +">>> list(range(1, 0))\n" +"[]" + +#: ../../library/stdtypes.rst:1562 +msgid "" +"Ranges implement all of the :ref:`common ` sequence " +"operations except concatenation and repetition (due to the fact that range " +"objects can only represent sequences that follow a strict pattern and " +"repetition and concatenation will usually violate that pattern)." +msgstr "" +"range 对象实现了 :ref:`一般 ` 序列的所有操作,但拼接和重复除外(这是由于 range " +"对象只能表示符合严格模式的序列,而重复和拼接通常都会违反这样的模式)。" + +#: ../../library/stdtypes.rst:1569 +msgid "" +"The value of the *start* parameter (or ``0`` if the parameter was not " +"supplied)" +msgstr "*start* 形参的值 (如果该形参未提供则为 ``0``)" + +#: ../../library/stdtypes.rst:1574 +msgid "The value of the *stop* parameter" +msgstr "*stop* 形参的值" + +#: ../../library/stdtypes.rst:1578 +msgid "" +"The value of the *step* parameter (or ``1`` if the parameter was not " +"supplied)" +msgstr "*step* 形参的值 (如果该形参未提供则为 ``1``)" + +#: ../../library/stdtypes.rst:1581 +msgid "" +"The advantage of the :class:`range` type over a regular :class:`list` or " +":class:`tuple` is that a :class:`range` object will always take the same " +"(small) amount of memory, no matter the size of the range it represents (as " +"it only stores the ``start``, ``stop`` and ``step`` values, calculating " +"individual items and subranges as needed)." +msgstr "" +":class:`range` 类型相比常规 :class:`list` 或 :class:`tuple` 的优势在于一个 :class:`range` " +"对象总是占用固定数量的(较小)内存,不论其所表示的范围有多大(因为它只保存了 ``start``, ``stop`` 和 ``step`` " +"值,并会根据需要计算具体单项或子范围的值)。" + +#: ../../library/stdtypes.rst:1587 +msgid "" +"Range objects implement the :class:`collections.abc.Sequence` ABC, and " +"provide features such as containment tests, element index lookup, slicing " +"and support for negative indices (see :ref:`typesseq`):" +msgstr "" +"range 对象实现了 :class:`collections.abc.Sequence` " +"ABC,提供如包含检测、元素索引查找、切片等特性,并支持负索引 (参见 :ref:`typesseq`):" + +#: ../../library/stdtypes.rst:1607 +msgid "" +"Testing range objects for equality with ``==`` and ``!=`` compares them as " +"sequences. That is, two range objects are considered equal if they " +"represent the same sequence of values. (Note that two range objects that " +"compare equal might have different :attr:`~range.start`, :attr:`~range.stop`" +" and :attr:`~range.step` attributes, for example ``range(0) == range(2, 1, " +"3)`` or ``range(0, 3, 2) == range(0, 4, 2)``.)" +msgstr "" +"使用 ``==`` 和 ``!=`` 检测 range 对象是否相等是将其作为序列来比较。也就是说,如果两个 range " +"对象表示相同的值序列就认为它们是相等的。 (请注意比较结果相等的两个 range 对象可能会具有不同的 :attr:`~range.start`, " +":attr:`~range.stop` 和 :attr:`~range.step` 属性,例如 ``range(0) == range(2, 1, " +"3)`` 而 ``range(0, 3, 2) == range(0, 4, 2)``。)" + +#: ../../library/stdtypes.rst:1614 +msgid "" +"Implement the Sequence ABC. Support slicing and negative indices. Test " +":class:`int` objects for membership in constant time instead of iterating " +"through all items." +msgstr "实现 Sequence ABC。支持切片和负数索引。使用 :class:`int` 对象在固定时间内进行成员检测,而不是逐一迭代所有项。" + +#: ../../library/stdtypes.rst:1620 +msgid "" +"Define '==' and '!=' to compare range objects based on the sequence of " +"values they define (instead of comparing based on object identity)." +msgstr "定义 '==' 和 '!=' 以根据 range 对象所定义的值序列来进行比较(而不是根据对象的标识)。" + +#: ../../library/stdtypes.rst:1625 +msgid "" +"Added the :attr:`~range.start`, :attr:`~range.stop` and :attr:`~range.step` " +"attributes." +msgstr "" +"增加了 :attr:`~range.start`, :attr:`~range.stop` 和 :attr:`~range.step` 属性。" + +#: ../../library/stdtypes.rst:1630 +msgid "" +"The `linspace recipe `_ shows how to implement a lazy version of range " +"suitable for floating-point applications." +msgstr "" +"`linspace recipe `_ 演示了如何实现一个惰性求值版本的适合浮点数应用的 range 对象。" + +#: ../../library/stdtypes.rst:1642 +msgid "Text and Binary Sequence Type Methods Summary" +msgstr "文本和二进制序列类型方法摘要" + +#: ../../library/stdtypes.rst:1643 +msgid "" +"The following table summarizes the text and binary sequence types methods by" +" category." +msgstr "下表按类别总结了文本和二进制序列类型方法。" + +#: ../../library/stdtypes.rst:1648 +msgid "Category" +msgstr "类别" + +#: ../../library/stdtypes.rst:1648 +msgid ":class:`str` methods" +msgstr ":class:`str` 方法" + +#: ../../library/stdtypes.rst:1648 +msgid ":class:`bytes` and :class:`bytearray` methods" +msgstr ":class:`bytes` 和 :class:`bytearray` 方法" + +#: ../../library/stdtypes.rst:1650 +msgid "Formatting" +msgstr "格式化" + +#: ../../library/stdtypes.rst:1650 +msgid ":meth:`str.format`" +msgstr ":meth:`str.format`" + +#: ../../library/stdtypes.rst:1652 +msgid ":meth:`str.format_map`" +msgstr ":meth:`str.format_map`" + +#: ../../library/stdtypes.rst:1654 +msgid ":ref:`f-strings`" +msgstr ":ref:`f-strings`" + +#: ../../library/stdtypes.rst:1656 +msgid ":ref:`old-string-formatting`" +msgstr ":ref:`old-string-formatting`" + +#: ../../library/stdtypes.rst:1656 +msgid ":ref:`bytes-formatting`" +msgstr ":ref:`bytes-formatting`" + +#: ../../library/stdtypes.rst:1658 +msgid "Searching and Replacing" +msgstr "搜索和替换" + +#: ../../library/stdtypes.rst:1658 +msgid ":meth:`str.find`" +msgstr ":meth:`str.find`" + +#: ../../library/stdtypes.rst:1658 +msgid ":meth:`str.rfind`" +msgstr ":meth:`str.rfind`" + +#: ../../library/stdtypes.rst:1658 +msgid ":meth:`bytes.find`" +msgstr ":meth:`bytes.find`" + +#: ../../library/stdtypes.rst:1658 +msgid ":meth:`bytes.rfind`" +msgstr ":meth:`bytes.rfind`" + +#: ../../library/stdtypes.rst:1660 +msgid ":meth:`str.index`" +msgstr ":meth:`str.index`" + +#: ../../library/stdtypes.rst:1660 +msgid ":meth:`str.rindex`" +msgstr ":meth:`str.rindex`" + +#: ../../library/stdtypes.rst:1660 +msgid ":meth:`bytes.index`" +msgstr ":meth:`bytes.index`" + +#: ../../library/stdtypes.rst:1660 +msgid ":meth:`bytes.rindex`" +msgstr ":meth:`bytes.rindex`" + +#: ../../library/stdtypes.rst:1662 +msgid ":meth:`str.startswith`" +msgstr ":meth:`str.startswith`" + +#: ../../library/stdtypes.rst:1662 +msgid ":meth:`bytes.startswith`" +msgstr ":meth:`bytes.startswith`" + +#: ../../library/stdtypes.rst:1664 +msgid ":meth:`str.endswith`" +msgstr ":meth:`str.endswith`" + +#: ../../library/stdtypes.rst:1664 +msgid ":meth:`bytes.endswith`" +msgstr ":meth:`bytes.endswith`" + +#: ../../library/stdtypes.rst:1666 +msgid ":meth:`str.count`" +msgstr ":meth:`str.count`" + +#: ../../library/stdtypes.rst:1666 +msgid ":meth:`bytes.count`" +msgstr ":meth:`bytes.count`" + +#: ../../library/stdtypes.rst:1668 +msgid ":meth:`str.replace`" +msgstr ":meth:`str.replace`" + +#: ../../library/stdtypes.rst:1668 +msgid ":meth:`bytes.replace`" +msgstr ":meth:`bytes.replace`" + +#: ../../library/stdtypes.rst:1670 +msgid "Splitting and Joining" +msgstr "拆分与合并" + +#: ../../library/stdtypes.rst:1670 +msgid ":meth:`str.split`" +msgstr ":meth:`str.split`" + +#: ../../library/stdtypes.rst:1670 +msgid ":meth:`str.rsplit`" +msgstr ":meth:`str.rsplit`" + +#: ../../library/stdtypes.rst:1670 +msgid ":meth:`bytes.split`" +msgstr ":meth:`bytes.split`" + +#: ../../library/stdtypes.rst:1670 +msgid ":meth:`bytes.rsplit`" +msgstr ":meth:`bytes.rsplit`" + +#: ../../library/stdtypes.rst:1672 +msgid ":meth:`str.splitlines`" +msgstr ":meth:`str.splitlines`" + +#: ../../library/stdtypes.rst:1672 +msgid ":meth:`bytes.splitlines`" +msgstr ":meth:`bytes.splitlines`" + +#: ../../library/stdtypes.rst:1674 +msgid ":meth:`str.partition`" +msgstr ":meth:`str.partition`" + +#: ../../library/stdtypes.rst:1674 +msgid ":meth:`bytes.partition`" +msgstr ":meth:`bytes.partition`" + +#: ../../library/stdtypes.rst:1676 +msgid ":meth:`str.rpartition`" +msgstr ":meth:`str.rpartition`" + +#: ../../library/stdtypes.rst:1676 +msgid ":meth:`bytes.rpartition`" +msgstr ":meth:`bytes.rpartition`" + +#: ../../library/stdtypes.rst:1678 +msgid ":meth:`str.join`" +msgstr ":meth:`str.join`" + +#: ../../library/stdtypes.rst:1678 +msgid ":meth:`bytes.join`" +msgstr ":meth:`bytes.join`" + +#: ../../library/stdtypes.rst:1680 +msgid "String Classification" +msgstr "字符串分类" + +#: ../../library/stdtypes.rst:1680 +msgid ":meth:`str.isalpha`" +msgstr ":meth:`str.isalpha`" + +#: ../../library/stdtypes.rst:1680 +msgid ":meth:`bytes.isalpha`" +msgstr ":meth:`bytes.isalpha`" + +#: ../../library/stdtypes.rst:1682 +msgid ":meth:`str.isdecimal`" +msgstr ":meth:`str.isdecimal`" + +#: ../../library/stdtypes.rst:1684 +msgid ":meth:`str.isdigit`" +msgstr ":meth:`str.isdigit`" + +#: ../../library/stdtypes.rst:1684 +msgid ":meth:`bytes.isdigit`" +msgstr ":meth:`bytes.isdigit`" + +#: ../../library/stdtypes.rst:1686 +msgid ":meth:`str.isnumeric`" +msgstr ":meth:`str.isnumeric`" + +#: ../../library/stdtypes.rst:1688 +msgid ":meth:`str.isalnum`" +msgstr ":meth:`str.isalnum`" + +#: ../../library/stdtypes.rst:1688 +msgid ":meth:`bytes.isalnum`" +msgstr ":meth:`bytes.isalnum`" + +#: ../../library/stdtypes.rst:1690 +msgid ":meth:`str.isidentifier`" +msgstr ":meth:`str.isidentifier`" + +#: ../../library/stdtypes.rst:1692 +msgid ":meth:`str.islower`" +msgstr ":meth:`str.islower`" + +#: ../../library/stdtypes.rst:1692 +msgid ":meth:`bytes.islower`" +msgstr ":meth:`bytes.islower`" + +#: ../../library/stdtypes.rst:1694 +msgid ":meth:`str.isupper`" +msgstr ":meth:`str.isupper`" + +#: ../../library/stdtypes.rst:1694 +msgid ":meth:`bytes.isupper`" +msgstr ":meth:`bytes.isupper`" + +#: ../../library/stdtypes.rst:1696 +msgid ":meth:`str.istitle`" +msgstr ":meth:`str.istitle`" + +#: ../../library/stdtypes.rst:1696 +msgid ":meth:`bytes.istitle`" +msgstr ":meth:`bytes.istitle`" + +#: ../../library/stdtypes.rst:1698 +msgid ":meth:`str.isspace`" +msgstr ":meth:`str.isspace`" + +#: ../../library/stdtypes.rst:1698 +msgid ":meth:`bytes.isspace`" +msgstr ":meth:`bytes.isspace`" + +#: ../../library/stdtypes.rst:1700 +msgid ":meth:`str.isprintable`" +msgstr ":meth:`str.isprintable`" + +#: ../../library/stdtypes.rst:1702 +msgid "Case Manipulation" +msgstr "大小写操作" + +#: ../../library/stdtypes.rst:1702 +msgid ":meth:`str.lower`" +msgstr ":meth:`str.lower`" + +#: ../../library/stdtypes.rst:1702 +msgid ":meth:`bytes.lower`" +msgstr ":meth:`bytes.lower`" + +#: ../../library/stdtypes.rst:1704 +msgid ":meth:`str.upper`" +msgstr ":meth:`str.upper`" + +#: ../../library/stdtypes.rst:1704 +msgid ":meth:`bytes.upper`" +msgstr ":meth:`bytes.upper`" + +#: ../../library/stdtypes.rst:1706 +msgid ":meth:`str.casefold`" +msgstr ":meth:`str.casefold`" + +#: ../../library/stdtypes.rst:1708 +msgid ":meth:`str.capitalize`" +msgstr ":meth:`str.capitalize`" + +#: ../../library/stdtypes.rst:1708 +msgid ":meth:`bytes.capitalize`" +msgstr ":meth:`bytes.capitalize`" + +#: ../../library/stdtypes.rst:1710 +msgid ":meth:`str.title`" +msgstr ":meth:`str.title`" + +#: ../../library/stdtypes.rst:1710 +msgid ":meth:`bytes.title`" +msgstr ":meth:`bytes.title`" + +#: ../../library/stdtypes.rst:1712 +msgid ":meth:`str.swapcase`" +msgstr ":meth:`str.swapcase`" + +#: ../../library/stdtypes.rst:1712 +msgid ":meth:`bytes.swapcase`" +msgstr ":meth:`bytes.swapcase`" + +#: ../../library/stdtypes.rst:1714 +msgid "Padding and Stripping" +msgstr "填充与去除" + +#: ../../library/stdtypes.rst:1714 +msgid ":meth:`str.ljust`" +msgstr ":meth:`str.ljust`" + +#: ../../library/stdtypes.rst:1714 +msgid ":meth:`str.rjust`" +msgstr ":meth:`str.rjust`" + +#: ../../library/stdtypes.rst:1714 +msgid ":meth:`bytes.ljust`" +msgstr ":meth:`bytes.ljust`" + +#: ../../library/stdtypes.rst:1714 +msgid ":meth:`bytes.rjust`" +msgstr ":meth:`bytes.rjust`" + +#: ../../library/stdtypes.rst:1716 +msgid ":meth:`str.center`" +msgstr ":meth:`str.center`" + +#: ../../library/stdtypes.rst:1716 +msgid ":meth:`bytes.center`" +msgstr ":meth:`bytes.center`" + +#: ../../library/stdtypes.rst:1718 +msgid ":meth:`str.expandtabs`" +msgstr ":meth:`str.expandtabs`" + +#: ../../library/stdtypes.rst:1718 +msgid ":meth:`bytes.expandtabs`" +msgstr ":meth:`bytes.expandtabs`" + +#: ../../library/stdtypes.rst:1720 +msgid ":meth:`str.strip`" +msgstr ":meth:`str.strip`" + +#: ../../library/stdtypes.rst:1720 +msgid ":meth:`bytes.strip`" +msgstr ":meth:`bytes.strip`" + +#: ../../library/stdtypes.rst:1722 +msgid ":meth:`str.lstrip`" +msgstr ":meth:`str.lstrip`" + +#: ../../library/stdtypes.rst:1722 +msgid ":meth:`str.rstrip`" +msgstr ":meth:`str.rstrip`" + +#: ../../library/stdtypes.rst:1722 +msgid ":meth:`bytes.lstrip`" +msgstr ":meth:`bytes.lstrip`" + +#: ../../library/stdtypes.rst:1722 +msgid ":meth:`bytes.rstrip`" +msgstr ":meth:`bytes.rstrip`" + +#: ../../library/stdtypes.rst:1724 +msgid "Translation and Encoding" +msgstr "转写和编码格式" + +#: ../../library/stdtypes.rst:1724 +msgid ":meth:`str.translate`" +msgstr ":meth:`str.translate`" + +#: ../../library/stdtypes.rst:1724 +msgid ":meth:`bytes.translate`" +msgstr ":meth:`bytes.translate`" + +#: ../../library/stdtypes.rst:1726 +msgid ":meth:`str.maketrans`" +msgstr ":meth:`str.maketrans`" + +#: ../../library/stdtypes.rst:1726 +msgid ":meth:`bytes.maketrans`" +msgstr ":meth:`bytes.maketrans`" + +#: ../../library/stdtypes.rst:1728 +msgid ":meth:`str.encode`" +msgstr ":meth:`str.encode`" + +#: ../../library/stdtypes.rst:1730 +msgid ":meth:`bytes.decode`" +msgstr ":meth:`bytes.decode`" + +#: ../../library/stdtypes.rst:1736 +msgid "Text Sequence Type --- :class:`str`" +msgstr "文本序列类型 --- :class:`str`" + +#: ../../library/stdtypes.rst:1738 +msgid "" +"Textual data in Python is handled with :class:`str` objects, or " +":dfn:`strings`. Strings are immutable :ref:`sequences ` of Unicode" +" code points. String literals are written in a variety of ways:" +msgstr "" +"在 Python 中处理文本数据是使用 :class:`str` 对象,也称为 :dfn:`字符串`。字符串是由 Unicode 码位构成的不可变 " +":ref:`序列 `。字符串字面值有多种不同的写法:" + +#: ../../library/stdtypes.rst:1743 +msgid "Single quotes: ``'allows embedded \"double\" quotes'``" +msgstr "单引号: ``'允许包含有 \"双\" 引号'``" + +#: ../../library/stdtypes.rst:1744 +msgid "Double quotes: ``\"allows embedded 'single' quotes\"``" +msgstr "双引号: ``\"允许嵌入 '单' 引号\"``" + +#: ../../library/stdtypes.rst:1745 +msgid "Triple quoted: ``'''Three single quotes'''``, ``\"\"\"Three double quotes\"\"\"``" +msgstr "三重引号: ``'''三重单引号'''``, ``\"\"\"三重双引号\"\"\"``" + +#: ../../library/stdtypes.rst:1747 +msgid "" +"Triple quoted strings may span multiple lines - all associated whitespace " +"will be included in the string literal." +msgstr "使用三重引号的字符串可以跨越多行 —— 其中所有的空白字符都将包含在该字符串字面值中。" + +#: ../../library/stdtypes.rst:1750 +msgid "" +"String literals that are part of a single expression and have only " +"whitespace between them will be implicitly converted to a single string " +"literal. That is, ``(\"spam \" \"eggs\") == \"spam eggs\"``." +msgstr "作为单一表达式组成部分,之间只由空格分隔的多个字符串字面值会被隐式地转换为单个字符串字面值。也就是说,``(\\== \"spam eggs\"``。" + +#: ../../library/stdtypes.rst:1754 +msgid "" +"See :ref:`strings` for more about the various forms of string literal, " +"including supported :ref:`escape sequences `, and the " +"``r`` (\"raw\") prefix that disables most escape sequence processing." +msgstr "" +"请参阅 :ref:`strings` 了解有关各种字符串字面值形式的更多信息,包括所支持的 :ref:`转义序列 `,以及禁用大多数转义序列处理的 ``r`` (\"raw\") 前缀。" + +#: ../../library/stdtypes.rst:1758 +msgid "" +"Strings may also be created from other objects using the :class:`str` " +"constructor." +msgstr "字符串也可以通过使用 :class:`str` 构造器从其他对象创建。" + +#: ../../library/stdtypes.rst:1761 +msgid "" +"Since there is no separate \"character\" type, indexing a string produces " +"strings of length 1. That is, for a non-empty string *s*, ``s[0] == " +"s[0:1]``." +msgstr "" +"由于不存在单独的“字符”类型,对字符串做索引操作将产生一个长度为 1 的字符串。也就是说,对于一个非空字符串 *s*, ``s[0] == " +"s[0:1]``。" + +#: ../../library/stdtypes.rst:1767 +msgid "" +"There is also no mutable string type, but :meth:`str.join` or " +":class:`io.StringIO` can be used to efficiently construct strings from " +"multiple fragments." +msgstr "" +"不存在可变的字符串类型,但是 :meth:`str.join` 或 :class:`io.StringIO` 可以被用来根据多个片段高效率地构建字符串。" + +#: ../../library/stdtypes.rst:1771 +msgid "" +"For backwards compatibility with the Python 2 series, the ``u`` prefix is " +"once again permitted on string literals. It has no effect on the meaning of " +"string literals and cannot be combined with the ``r`` prefix." +msgstr "" +"为了与 Python 2 系列的向下兼容,再次允许字符串字面值使用 ``u`` 前缀。它对字符串字面值的含义没有影响,并且不能与 ``r`` " +"前缀同时出现。" + +#: ../../library/stdtypes.rst:1785 +msgid "" +"Return a :ref:`string ` version of *object*. If *object* is not " +"provided, returns the empty string. Otherwise, the behavior of ``str()`` " +"depends on whether *encoding* or *errors* is given, as follows." +msgstr "" +"返回 *object* 的 :ref:`字符串 ` 版本。如果未提供 *object* 则返回空字符串。在其他情况下 " +"``str()`` 的行为取决于 *encoding* 或 *errors* 是否有给出,具体见下。" + +#: ../../library/stdtypes.rst:1789 +msgid "" +"If neither *encoding* nor *errors* is given, ``str(object)`` returns " +":meth:`type(object).__str__(object) `, which is the " +"\"informal\" or nicely printable string representation of *object*. For " +"string objects, this is the string itself. If *object* does not have a " +":meth:`~object.__str__` method, then :func:`str` falls back to returning " +":func:`repr(object) `." +msgstr "" +"如果 *encoding* 或 *errors* 均未给出,则 ``str(object)`` 将返回 " +":meth:`type(object).__str__(object) `,这是 *object* " +"的“非正式”而适合显示的字符串表示形式。对于字符串对象,这就是该字符串本身。如果 *object* 没有 :meth:`~object.__str__`" +" 方法,则 :func:`str` 将回退为返回 :func:`repr(object) `。" + +#: ../../library/stdtypes.rst:1801 +msgid "" +"If at least one of *encoding* or *errors* is given, *object* should be a " +":term:`bytes-like object` (e.g. :class:`bytes` or :class:`bytearray`). In " +"this case, if *object* is a :class:`bytes` (or :class:`bytearray`) object, " +"then ``str(bytes, encoding, errors)`` is equivalent to " +":meth:`bytes.decode(encoding, errors) `. Otherwise, the bytes" +" object underlying the buffer object is obtained before calling " +":meth:`bytes.decode`. See :ref:`binaryseq` and :ref:`bufferobjects` for " +"information on buffer objects." +msgstr "" +"如果 *encoding* 或 *errors* 至少给出其中之一,则 *object* 应该是一个 :term:`bytes-like object`" +" (例如 :class:`bytes` 或 :class:`bytearray`)。在此情况下,如果 *object* 是一个 " +":class:`bytes` (或 :class:`bytearray`) 对象,则 ``str(bytes, encoding, errors)`` " +"等价于 :meth:`bytes.decode(encoding, errors) `。否则的话,会在调用 " +":meth:`bytes.decode` 之前获取缓冲区对象下层的 bytes 对象。请参阅 :ref:`binaryseq` 与 " +":ref:`bufferobjects` 了解有关缓冲区对象的信息。" + +#: ../../library/stdtypes.rst:1810 +msgid "" +"Passing a :class:`bytes` object to :func:`str` without the *encoding* or " +"*errors* arguments falls under the first case of returning the informal " +"string representation (see also the :option:`-b` command-line option to " +"Python). For example::" +msgstr "" +"将一个 :class:`bytes` 对象传入 :func:`str` 而不给出 *encoding* 或 *errors* 参数的操作属于第一种情况," +" 将返回非正式的字符串表示(另请参阅 Python 的 :option:`-b` 命令行选项)。例如::" + +#: ../../library/stdtypes.rst:1815 +msgid "" +">>> str(b'Zoot!')\n" +"\"b'Zoot!'\"" +msgstr "" +">>> str(b'Zoot!')\n" +"\"b'Zoot!'\"" + +#: ../../library/stdtypes.rst:1818 +msgid "" +"For more information on the ``str`` class and its methods, see " +":ref:`textseq` and the :ref:`string-methods` section below. To output " +"formatted strings, see the :ref:`f-strings` and :ref:`formatstrings` " +"sections. In addition, see the :ref:`stringservices` section." +msgstr "" +"有关 ``str`` 类及其方法的更多信息,请参阅下面的 :ref:`textseq` 和 :ref:`string-methods` 小节。 " +"要输出格式化字符串,请参阅 :ref:`f-strings` 和 :ref:`formatstrings` 小节。此外还可以参阅 " +":ref:`stringservices` 小节。" + +#: ../../library/stdtypes.rst:1830 +msgid "String Methods" +msgstr "字符串的方法" + +#: ../../library/stdtypes.rst:1835 +msgid "" +"Strings implement all of the :ref:`common ` sequence " +"operations, along with the additional methods described below." +msgstr "字符串实现了所有 :ref:`一般 ` 序列的操作,还额外提供了以下列出的一些附加方法。" + +#: ../../library/stdtypes.rst:1838 +msgid "" +"Strings also support two styles of string formatting, one providing a large " +"degree of flexibility and customization (see :meth:`str.format`, " +":ref:`formatstrings` and :ref:`string-formatting`) and the other based on C " +"``printf`` style formatting that handles a narrower range of types and is " +"slightly harder to use correctly, but is often faster for the cases it can " +"handle (:ref:`old-string-formatting`)." +msgstr "" +"字符串还支持两种字符串格式化样式,一种提供了很大程度的灵活性和可定制性 (参阅 :meth:`str.format`, " +":ref:`formatstrings` 和 :ref:`string-formatting`) 而另一种是基于 C ``printf`` " +"样式的格式化,它可处理的类型范围较窄,并且更难以正确使用,但对于它可处理的情况往往会更为快速 (:ref:`old-string-" +"formatting`)." + +#: ../../library/stdtypes.rst:1845 +msgid "" +"The :ref:`textservices` section of the standard library covers a number of " +"other modules that provide various text related utilities (including regular" +" expression support in the :mod:`re` module)." +msgstr "" +"标准库的 :ref:`textservices` 部分涵盖了许多其他模块,提供各种文本相关工具(例如包含于 :mod:`re` " +"模块中的正则表达式支持)。" + +#: ../../library/stdtypes.rst:1851 +msgid "" +"Return a copy of the string with its first character capitalized and the " +"rest lowercased." +msgstr "返回原字符串的副本,其首个字符大写,其余为小写。" + +#: ../../library/stdtypes.rst:1854 +msgid "" +"The first character is now put into titlecase rather than uppercase. This " +"means that characters like digraphs will only have their first letter " +"capitalized, instead of the full character." +msgstr "" +"第一个字符现在被放入了 titlecase 而不是 uppercase。这意味着复合字母类字符将只有首个字母改为大写,而再不是全部字符大写。" + +#: ../../library/stdtypes.rst:1861 +msgid "" +"Return a casefolded copy of the string. Casefolded strings may be used for " +"caseless matching." +msgstr "返回原字符串消除大小写的副本。消除大小写的字符串可用于忽略大小写的匹配。" + +#: ../../library/stdtypes.rst:1864 +msgid "" +"Casefolding is similar to lowercasing but more aggressive because it is " +"intended to remove all case distinctions in a string. For example, the " +"German lowercase letter ``'ß'`` is equivalent to ``\"ss\"``. Since it is " +"already lowercase, :meth:`lower` would do nothing to ``'ß'``; " +":meth:`casefold` converts it to ``\"ss\"``. For example:" +msgstr "" +"消除大小写类似于转为小写但是更为彻底因为它会移除字符串中的所有大小写变化形式。 例如,德语小写字母 ``'ß'`` 相当于 ``\"ss\"``。 " +"由于它已经是小写了,:meth:`lower` 不会对 ``'ß'`` 做改变;而 :meth:`casefold` 会将其转为 ``\"ss\"``。" +" 例如:" + +#: ../../library/stdtypes.rst:1871 +msgid "" +">>> 'straße'.lower()\n" +"'straße'\n" +">>> 'straße'.casefold()\n" +"'strasse'" +msgstr "" +">>> 'straße'.lower()\n" +"'straße'\n" +">>> 'straße'.casefold()\n" +"'strasse'" + +#: ../../library/stdtypes.rst:1878 +msgid "" +"The casefolding algorithm is `described in section 3.13 'Default Case " +"Folding' of the Unicode Standard " +"`__." +msgstr "" +"大小写折叠算法在 `Unicode 标准 3.13 节 'Default Case Folding' 中描述 " +"`__." + +#: ../../library/stdtypes.rst:1887 +msgid "" +"Return centered in a string of length *width*. Padding is done using the " +"specified *fillchar* (default is an ASCII space). The original string is " +"returned if *width* is less than or equal to ``len(s)``. For example::" +msgstr "" +"返回长度为 *width* 的居中字符串。使用指定的 *fillchar* 填充空位(默认为 ASCII 空格)。如果 *width* 小于等于 " +"``len(s)`` 则返回原字符串。例如::" + +#: ../../library/stdtypes.rst:1891 +msgid "" +">>> 'Python'.center(10)\n" +"' Python '\n" +">>> 'Python'.center(10, '-')\n" +"'--Python--'\n" +">>> 'Python'.center(4)\n" +"'Python'" +msgstr "" +">>> 'Python'.center(10)\n" +"' Python '\n" +">>> 'Python'.center(10, '-')\n" +"'--Python--'\n" +">>> 'Python'.center(4)\n" +"'Python'" + +#: ../../library/stdtypes.rst:1901 +msgid "" +"Return the number of non-overlapping occurrences of substring *sub* in the " +"range [*start*, *end*]. Optional arguments *start* and *end* are " +"interpreted as in slice notation." +msgstr "" +"返回子字符串 *sub* 在 [*start*, *end*] 范围内非重叠出现的次数。可选参数 *start* 与 *end* 会被解读为切片表示法。" + +#: ../../library/stdtypes.rst:1905 +msgid "" +"If *sub* is empty, returns the number of empty strings between characters " +"which is the length of the string plus one. For example::" +msgstr "如果 *sub* 为空,则返回字符之间的空字符串数,即字符串的长度加一。例如::" + +#: ../../library/stdtypes.rst:1908 +msgid "" +">>> 'spam, spam, spam'.count('spam')\n" +"3\n" +">>> 'spam, spam, spam'.count('spam', 5)\n" +"2\n" +">>> 'spam, spam, spam'.count('spam', 5, 10)\n" +"1\n" +">>> 'spam, spam, spam'.count('eggs')\n" +"0\n" +">>> 'spam, spam, spam'.count('')\n" +"17" +msgstr "" +">>> 'spam, spam, spam'.count('spam')\n" +"3\n" +">>> 'spam, spam, spam'.count('spam', 5)\n" +"2\n" +">>> 'spam, spam, spam'.count('spam', 5, 10)\n" +"1\n" +">>> 'spam, spam, spam'.count('eggs')\n" +"0\n" +">>> 'spam, spam, spam'.count('')\n" +"17" + +#: ../../library/stdtypes.rst:1921 +msgid "Return the string encoded to :class:`bytes`." +msgstr "返回编码为 :class:`bytes` 的字符串。" + +#: ../../library/stdtypes.rst:1923 ../../library/stdtypes.rst:3635 +msgid "" +"*encoding* defaults to ``'utf-8'``; see :ref:`standard-encodings` for " +"possible values." +msgstr "*encoding* 默认为 ``'utf-8'``;请参阅 :ref:`standard-encodings` 了解其他可能的值。" + +#: ../../library/stdtypes.rst:1926 +msgid "" +"*errors* controls how encoding errors are handled. If ``'strict'`` (the " +"default), a :exc:`UnicodeError` exception is raised. Other possible values " +"are ``'ignore'``, ``'replace'``, ``'xmlcharrefreplace'``, " +"``'backslashreplace'`` and any other name registered via " +":func:`codecs.register_error`. See :ref:`error-handlers` for details." +msgstr "" +"*errors* 控制如何处理编码错误。如为 ``'strict'`` (默认值),则会引发 :exc:`UnicodeError`。其他可能的值有 " +"``'ignore'``, ``'replace'``, ``'xmlcharrefreplace'``, ``'backslashreplace'``" +" 以及通过 :func:`codecs.register_error` 注册的任何其他名称。请参阅 :ref:`error-handlers` " +"了解详情。" + +#: ../../library/stdtypes.rst:1933 +msgid "" +"For performance reasons, the value of *errors* is not checked for validity " +"unless an encoding error actually occurs, :ref:`devmode` is enabled or a " +":ref:`debug build ` is used. For example::" +msgstr "" +"出于性能原因,*errors* 的值不会被执行有效性检查除非真的发生了编码错误、启用了 :ref:`devmode` 或是使用了 :ref:`调试编译版" +" `。例如::" + +#: ../../library/stdtypes.rst:1939 +msgid "" +">>> encoded_str_to_bytes = 'Python'.encode()\n" +">>> type(encoded_str_to_bytes)\n" +"\n" +">>> encoded_str_to_bytes\n" +"b'Python'" +msgstr "" +">>> encoded_str_to_bytes = 'Python'.encode()\n" +">>> type(encoded_str_to_bytes)\n" +"\n" +">>> encoded_str_to_bytes\n" +"b'Python'" + +#: ../../library/stdtypes.rst:1946 ../../library/stdtypes.rst:3654 +msgid "Added support for keyword arguments." +msgstr "加入了对关键字参数的支持。" + +#: ../../library/stdtypes.rst:1949 ../../library/stdtypes.rst:3657 +msgid "" +"The value of the *errors* argument is now checked in :ref:`devmode` and in " +":ref:`debug mode `." +msgstr "现在会在 :ref:`devmode` 和 :ref:`调试模式 ` 下检查 *errors* 参数的值。" + +#: ../../library/stdtypes.rst:1956 +msgid "" +"Return ``True`` if the string ends with the specified *suffix*, otherwise " +"return ``False``. *suffix* can also be a tuple of suffixes to look for. " +"With optional *start*, test beginning at that position. With optional " +"*end*, stop comparing at that position. Using *start* and *end* is " +"equivalent to ``str[start:end].endswith(suffix)``. For example::" +msgstr "" +"如果字符串以指定的 *suffix* 结束则返回 ``True``,否则返回 ``False``。 *suffix* " +"也可以是一个由供查找的后缀组成的元组。如果有可选项 *start*,测试将从该位置开始。如果有可选项 *end*,将在该位置停止比较。使用 " +"*start* 和 *end* 等价于 ``str[start:end].endswith(suffix)``。例如::" + +#: ../../library/stdtypes.rst:1962 +msgid "" +">>> 'Python'.endswith('on')\n" +"True\n" +">>> 'a tuple of suffixes'.endswith(('at', 'in'))\n" +"False\n" +">>> 'a tuple of suffixes'.endswith(('at', 'es'))\n" +"True\n" +">>> 'Python is amazing'.endswith('is', 0, 9)\n" +"True" +msgstr "" +">>> 'Python'.endswith('on')\n" +"True\n" +">>> 'a tuple of suffixes'.endswith(('at', 'in'))\n" +"False\n" +">>> 'a tuple of suffixes'.endswith(('at', 'es'))\n" +"True\n" +">>> 'Python is amazing'.endswith('is', 0, 9)\n" +"True" + +#: ../../library/stdtypes.rst:1971 +msgid "See also :meth:`startswith` and :meth:`removesuffix`." +msgstr "另请参阅 :meth:`startswith` 和 :meth:`removesuffix`。" + +#: ../../library/stdtypes.rst:1976 +msgid "" +"Return a copy of the string where all tab characters are replaced by one or " +"more spaces, depending on the current column and the given tab size. Tab " +"positions occur every *tabsize* characters (default is 8, giving tab " +"positions at columns 0, 8, 16 and so on). To expand the string, the current" +" column is set to zero and the string is examined character by character. " +"If the character is a tab (``\\t``), one or more space characters are " +"inserted in the result until the current column is equal to the next tab " +"position. (The tab character itself is not copied.) If the character is a " +"newline (``\\n``) or return (``\\r``), it is copied and the current column " +"is reset to zero. Any other character is copied unchanged and the current " +"column is incremented by one regardless of how the character is represented " +"when printed. For example::" +msgstr "" +"返回字符串的副本,其中所有的制表符会由一个或多个空格替换,具体取决于当前列位置和给定的制表符宽度。每 *tabsize* 个字符设为一个制表位(默认值 " +"8 时设定的制表位在列 0, 8, 16 依次类推)。要展开字符串,当前列将被设为零并逐一检查字符串中的每个字符。如果字符为制表符 " +"(``\\\\t``),则会在结果中插入一个或多个空格符,直到当前列等于下一个制表位。 (制表符本身不会被复制。)如果字符为换行符 " +"(``\\\\n``) 或回车符 " +"(``\\\\r``),它会被复制并将当前列重设为零。任何其他字符会被不加修改地复制并将当前列加一,不论该字符在被打印时会如何显示。例如::" + +#: ../../library/stdtypes.rst:1989 +msgid "" +">>> '01\\t012\\t0123\\t01234'.expandtabs()\n" +"'01 012 0123 01234'\n" +">>> '01\\t012\\t0123\\t01234'.expandtabs(4)\n" +"'01 012 0123 01234'\n" +">>> print('01\\t012\\n0123\\t01234'.expandtabs(4))\n" +"01 012\n" +"0123 01234" +msgstr "" +">>> '01\\t012\\t0123\\t01234'.expandtabs()\n" +"'01 012 0123 01234'\n" +">>> '01\\t012\\t0123\\t01234'.expandtabs(4)\n" +"'01 012 0123 01234'\n" +">>> print('01\\t012\\n0123\\t01234'.expandtabs(4))\n" +"01 012\n" +"0123 01234" + +#: ../../library/stdtypes.rst:2000 +msgid "" +"Return the lowest index in the string where substring *sub* is found within " +"the slice ``s[start:end]``. Optional arguments *start* and *end* are " +"interpreted as in slice notation. Return ``-1`` if *sub* is not found. For " +"example::" +msgstr "" +"返回子字符串 *sub* 在 ``s[start:end]`` 切片内被找到的最小索引。可选参数 *start* 与 *end* " +"会被解读为切片表示法。如果 *sub* 未被找到则返回 ``-1``。例如::" + +#: ../../library/stdtypes.rst:2005 +msgid "" +">>> 'spam, spam, spam'.find('sp')\n" +"0\n" +">>> 'spam, spam, spam'.find('sp', 5)\n" +"6" +msgstr "" +">>> 'spam, spam, spam'.find('sp')\n" +"0\n" +">>> 'spam, spam, spam'.find('sp', 5)\n" +"6" + +#: ../../library/stdtypes.rst:2010 +msgid "See also :meth:`rfind` and :meth:`index`." +msgstr "另请参阅 :meth:`rfind` 和 :meth:`index`。" + +#: ../../library/stdtypes.rst:2014 +msgid "" +"The :meth:`~str.find` method should be used only if you need to know the " +"position of *sub*. To check if *sub* is a substring or not, use the " +":keyword:`in` operator::" +msgstr "" +":meth:`~str.find` 方法应该只在你需要知道 *sub* 所在位置时使用。要检查 *sub* 是否为子字符串,请使用 " +":keyword:`in` 操作符::" + +#: ../../library/stdtypes.rst:2018 +msgid "" +">>> 'Py' in 'Python'\n" +"True" +msgstr "" +">>> 'Py' in 'Python'\n" +"True" + +#: ../../library/stdtypes.rst:2024 +msgid "" +"Perform a string formatting operation. The string on which this method is " +"called can contain literal text or replacement fields delimited by braces " +"``{}``. Each replacement field contains either the numeric index of a " +"positional argument, or the name of a keyword argument. Returns a copy of " +"the string where each replacement field is replaced with the string value of" +" the corresponding argument. For example:" +msgstr "" +"执行字符串格式化操作。调用此方法的字符串可以包含文本字面值或者以花括号 ``{}`` 标明的替换字段。 " +"每个替换字段可以包含一个位置参数的数字索引,或是一个关键字参数的名称。返回的字符串副本中每个替换字段都会被替换为对应参数的字符串值。例如:" + +#: ../../library/stdtypes.rst:2031 +msgid "" +">>> \"The sum of 1 + 2 is {0}\".format(1+2)\n" +"'The sum of 1 + 2 is 3'\n" +">>> \"The sum of {a} + {b} is {answer}\".format(answer=1+2, a=1, b=2)\n" +"'The sum of 1 + 2 is 3'\n" +">>> \"{1} expects the {0} Inquisition!\".format(\"Spanish\", \"Nobody\")\n" +"'Nobody expects the Spanish Inquisition!'" +msgstr "" +">>> \"The sum of 1 + 2 is {0}\".format(1+2)\n" +"'The sum of 1 + 2 is 3'\n" +">>> \"The sum of {a} + {b} is {answer}\".format(answer=1+2, a=1, b=2)\n" +"'The sum of 1 + 2 is 3'\n" +">>> \"{1} expects the {0} Inquisition!\".format(\"Spanish\", \"Nobody\")\n" +"'Nobody expects the Spanish Inquisition!'" + +#: ../../library/stdtypes.rst:2040 +msgid "" +"See :ref:`formatstrings` for a description of the various formatting options" +" that can be specified in format strings." +msgstr "请参阅 :ref:`formatstrings` 了解有关可以在格式字符串中指定的各种格式选项的说明。" + +#: ../../library/stdtypes.rst:2044 +msgid "" +"When formatting a number (:class:`int`, :class:`float`, :class:`complex`, " +":class:`decimal.Decimal` and subclasses) with the ``n`` type (ex: " +"``'{:n}'.format(1234)``), the function temporarily sets the ``LC_CTYPE`` " +"locale to the ``LC_NUMERIC`` locale to decode ``decimal_point`` and " +"``thousands_sep`` fields of :c:func:`localeconv` if they are non-ASCII or " +"longer than 1 byte, and the ``LC_NUMERIC`` locale is different than the " +"``LC_CTYPE`` locale. This temporary change affects other threads." +msgstr "" +"当使用 ``n`` 类型 (例如: ``'{:n}'.format(1234)``) 来格式化数字 (:class:`int`, " +":class:`float`, :class:`complex`, :class:`decimal.Decimal` 及其子类) " +"的时候,该函数会临时性地将 ``LC_CTYPE`` 区域设置为 ``LC_NUMERIC`` 区域以解码 :c:func:`localeconv` " +"的 ``decimal_point`` 和 ``thousands_sep`` 字段,如果它们是非 ASCII 字符或长度超过 1 字节的话,并且 " +"``LC_NUMERIC`` 区域会与 ``LC_CTYPE`` 区域不一致。这个临时更改会影响其他线程。" + +#: ../../library/stdtypes.rst:2053 +msgid "" +"When formatting a number with the ``n`` type, the function sets temporarily " +"the ``LC_CTYPE`` locale to the ``LC_NUMERIC`` locale in some cases." +msgstr "" +"当使用 ``n`` 类型格式化数字时,该函数在某些情况下会临时性地将 ``LC_CTYPE`` 区域设置为 ``LC_NUMERIC`` 区域。" + +#: ../../library/stdtypes.rst:2061 +msgid "" +"Similar to ``str.format(**mapping)``, except that ``mapping`` is used " +"directly and not copied to a :class:`dict`. This is useful if for example " +"``mapping`` is a dict subclass:" +msgstr "" +"类似于 ``str.format(**mapping)``,不同之处在于 ``mapping`` 会被直接使用而不是复制到一个 " +":class:`dict`。适宜使用此方法的一个例子是当 ``mapping`` 为 dict 的子类的情况:" + +#: ../../library/stdtypes.rst:2077 +msgid "" +"Like :meth:`~str.find`, but raise :exc:`ValueError` when the substring is " +"not found. For example:" +msgstr "类似于 :meth:`~str.find`,但在找不到子串时会引发 :exc:`ValueError`。例如:" + +#: ../../library/stdtypes.rst:2080 +msgid "" +">>> 'spam, spam, spam'.index('spam')\n" +"0\n" +">>> 'spam, spam, spam'.index('eggs')\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +" 'spam, spam, spam'.index('eggs')\n" +" ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^\n" +"ValueError: substring not found" +msgstr "" +">>> 'spam, spam, spam'.index('spam')\n" +"0\n" +">>> 'spam, spam, spam'.index('eggs')\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +" 'spam, spam, spam'.index('eggs')\n" +" ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^\n" +"ValueError: substring not found" + +#: ../../library/stdtypes.rst:2091 +msgid "See also :meth:`rindex`." +msgstr "另请参阅 :meth:`rindex`。" + +#: ../../library/stdtypes.rst:2096 +msgid "" +"Return ``True`` if all characters in the string are alphanumeric and there " +"is at least one character, ``False`` otherwise. A character ``c`` is " +"alphanumeric if one of the following returns ``True``: ``c.isalpha()``, " +"``c.isdecimal()``, ``c.isdigit()``, or ``c.isnumeric()``. For example:" +msgstr "" +"如果字符串中的所有字符都是字母数字类且至少有一个字符则返回 ``True``,否则返回 ``False``。 某个字符 ``c`` 当以下方法之一返回 " +"``True`` 时就属于字母数字类: ``c.isalpha()``, ``c.isdecimal()``, ``c.isdigit()`` 或 " +"``c.isnumeric()``。 例如:. For example:" + +#: ../../library/stdtypes.rst:2101 +msgid "" +">>> 'abc123'.isalnum()\n" +"True\n" +">>> 'abc123!@#'.isalnum()\n" +"False\n" +">>> ''.isalnum()\n" +"False\n" +">>> ' '.isalnum()\n" +"False" +msgstr "" +">>> 'abc123'.isalnum()\n" +"True\n" +">>> 'abc123!@#'.isalnum()\n" +"False\n" +">>> ''.isalnum()\n" +"False\n" +">>> ' '.isalnum()\n" +"False" + +#: ../../library/stdtypes.rst:2115 +msgid "" +"Return ``True`` if all characters in the string are alphabetic and there is " +"at least one character, ``False`` otherwise. Alphabetic characters are " +"those characters defined in the Unicode character database as \"Letter\", " +"i.e., those with general category property being one of \"Lm\", \"Lt\", " +"\"Lu\", \"Ll\", or \"Lo\". Note that this is different from the `Alphabetic" +" property defined in the section 4.10 'Letters, Alphabetic, and Ideographic'" +" of the Unicode Standard " +"`_. For example:" +msgstr "" +"如果字符串中的所有字符都为字母类并且至少有一个字符则返回 ``True``,否则返回 ``False``。字母类字符是指在 Unicode " +"字符数据库中被定义为 \"Letter\" 的字符,即通用类别属性为 \"Lm\", \"Lt\", \"Lu\", \"Ll\" 或 \"Lo\" " +"之一的字符。请注意这不同于在 Unicode 标准 `4.10 节 'Letters, Alphabetic, and Ideographic' " +"中定义的 Alphabetic 属性 `_。例如:" + +#: ../../library/stdtypes.rst:2124 +msgid "" +">>> 'Letters and spaces'.isalpha()\n" +"False\n" +">>> 'LettersOnly'.isalpha()\n" +"True\n" +">>> 'µ'.isalpha() # non-ASCII characters can be considered alphabetical too\n" +"True" +msgstr "" +">>> 'Letters and spaces'.isalpha()\n" +"False\n" +">>> 'LettersOnly'.isalpha()\n" +"True\n" +">>> 'µ'.isalpha() # 非 ASCII 字符也可能为字母类\n" +"True" + +#: ../../library/stdtypes.rst:2133 +msgid "See :ref:`unicode-properties`." +msgstr "参见 :ref:`unicode-properties`。" + +#: ../../library/stdtypes.rst:2138 +msgid "" +"Return ``True`` if the string is empty or all characters in the string are " +"ASCII, ``False`` otherwise. ASCII characters have code points in the range " +"U+0000-U+007F. For example:" +msgstr "" +"如果字符串为空或字符串中的所有字符均为 ASCII 则返回 ``True``,否则返回 ``False``。ASCII 字符的码点范围是 " +"U+0000-U+007F。例如:" + +#: ../../library/stdtypes.rst:2142 +msgid "" +">>> 'ASCII characters'.isascii()\n" +"True\n" +">>> 'µ'.isascii()\n" +"False" +msgstr "" +">>> 'ASCII characters'.isascii()\n" +"True\n" +">>> 'µ'.isascii()\n" +"False" + +#: ../../library/stdtypes.rst:2154 +msgid "" +"Return ``True`` if all characters in the string are decimal characters and " +"there is at least one character, ``False`` otherwise. Decimal characters are" +" those that can be used to form numbers in base 10, such as U+0660, ARABIC-" +"INDIC DIGIT ZERO. Formally a decimal character is a character in the " +"Unicode General Category \"Nd\". For example:" +msgstr "" +"如果字符串中的所有字符都是十进制数码字符且至少有一个字符则返回 ``True``,否则返回 ``False``。十进制数码字符指那些可以用于组成以 10" +" 为基数的数字的字符,如 U+0660, ARABIC-INDIC DIGIT ZERO。正式地说十进制数码字符就是属于 Unicode 通用类别 " +"的字符。例如:" + +#: ../../library/stdtypes.rst:2161 +msgid "" +">>> '0123456789'.isdecimal()\n" +"True\n" +">>> '٠١٢٣٤٥٦٧٨٩'.isdecimal() # Arabic-Indic digits zero to nine\n" +"True\n" +">>> 'alphabetic'.isdecimal()\n" +"False" +msgstr "" +">>> '0123456789'.isdecimal()\n" +"True\n" +">>> '٠١٢٣٤٥٦٧٨٩'.isdecimal() # 阿拉伯 - 印度数字零至九\\nTrue\n" +">>> 'alphabetic'.isdecimal()\n" +"False" + +#: ../../library/stdtypes.rst:2173 +msgid "" +"Return ``True`` if all characters in the string are digits and there is at " +"least one character, ``False`` otherwise. Digits include decimal characters" +" and digits that need special handling, such as the compatibility " +"superscript digits. This covers digits which cannot be used to form numbers " +"in base 10, like the `Kharosthi numbers " +"`__. Formally, a digit is " +"a character that has the property value Numeric_Type=Digit or " +"Numeric_Type=Decimal." +msgstr "" + +#: ../../library/stdtypes.rst:2181 ../../library/stdtypes.rst:2262 +#: ../../library/stdtypes.rst:2279 ../../library/stdtypes.rst:2306 +#: ../../library/stdtypes.rst:2361 ../../library/stdtypes.rst:2434 +#: ../../library/stdtypes.rst:2545 ../../library/stdtypes.rst:2566 +#: ../../library/stdtypes.rst:2630 ../../library/stdtypes.rst:2650 +#: ../../library/stdtypes.rst:2664 ../../library/stdtypes.rst:2751 +#: ../../library/stdtypes.rst:2775 ../../library/stdtypes.rst:2789 +#: ../../library/stdtypes.rst:2896 +msgid "For example:" +msgstr "例如:" + +#: ../../library/stdtypes.rst:2183 +msgid "" +">>> '0123456789'.isdigit()\n" +"True\n" +">>> '٠١٢٣٤٥٦٧٨٩'.isdigit() # Arabic-Indic digits zero to nine\n" +"True\n" +">>> '⅕'.isdigit() # Vulgar fraction one fifth\n" +"False\n" +">>> '²'.isdecimal(), '²'.isdigit(), '²'.isnumeric()\n" +"(False, True, True)" +msgstr "" + +#: ../../library/stdtypes.rst:2194 +msgid "See also :meth:`isdecimal` and :meth:`isnumeric`." +msgstr "" + +#: ../../library/stdtypes.rst:2199 +msgid "" +"Return ``True`` if the string is a valid identifier according to the " +"language definition, section :ref:`identifiers`." +msgstr "如果字符串是有效的标识符,返回 ``True``,依据语言定义, :ref:`identifiers` 节。" + +#: ../../library/stdtypes.rst:2202 +msgid "" +":func:`keyword.iskeyword` can be used to test whether string ``s`` is a " +"reserved identifier, such as :keyword:`def` and :keyword:`class`." +msgstr "" +":func:`keyword.iskeyword` 可被用来测试字符串 ``s`` 是否为保留的标识符,如 :keyword:`def` 和 " +":keyword:`class`." + +#: ../../library/stdtypes.rst:2205 +msgid "Example: ::" +msgstr "示例: ::" + +#: ../../library/stdtypes.rst:2208 +msgid "" +">>> from keyword import iskeyword\n" +"\n" +">>> 'hello'.isidentifier(), iskeyword('hello')\n" +"(True, False)\n" +">>> 'def'.isidentifier(), iskeyword('def')\n" +"(True, True)" +msgstr "" +">>> from keyword import iskeyword\n" +"\n" +">>> 'hello'.isidentifier(), iskeyword('hello')\n" +"(True, False)\n" +">>> 'def'.isidentifier(), iskeyword('def')\n" +"(True, True)" + +#: ../../library/stdtypes.rst:2218 +msgid "" +"Return ``True`` if all cased characters [4]_ in the string are lowercase and" +" there is at least one cased character, ``False`` otherwise." +msgstr "如果字符串中至少有一个区分大小写的字符 [4]_ 且此类字符均为小写则返回 ``True``,否则返回 ``False``。" + +#: ../../library/stdtypes.rst:2224 +msgid "" +"Return ``True`` if all characters in the string are numeric characters, and " +"there is at least one character, ``False`` otherwise. Numeric characters " +"include digit characters, and all characters that have the Unicode numeric " +"value property, e.g. U+2155, VULGAR FRACTION ONE FIFTH. Formally, numeric " +"characters are those with the property value Numeric_Type=Digit, " +"Numeric_Type=Decimal or Numeric_Type=Numeric. For example:" +msgstr "" +"如果字符串中的所有字符均为数值类字符,且至少有一个字符则返回 ``True``,否则返回 ``False``。数值类字符包括数字字符,以及所有设置了 " +"Unicode 数值特征属性的字符,例如 U+2155, VULGAR FRACTION ONE FIFTH。 " +"按正式的定义,数值类字符就是具有特征属性值 Numeric_Type=Digit, Numeric_Type=Decimal 或 " +"Numeric_Type=Numeric 的字符。例如:" + +#: ../../library/stdtypes.rst:2232 +msgid "" +">>> '0123456789'.isnumeric()\n" +"True\n" +">>> '٠١٢٣٤٥٦٧٨٩'.isnumeric() # Arabic-Indic digits zero to nine\n" +"True\n" +">>> '⅕'.isnumeric() # Vulgar fraction one fifth\n" +"True\n" +">>> '²'.isdecimal(), '²'.isdigit(), '²'.isnumeric()\n" +"(False, True, True)" +msgstr "" + +#: ../../library/stdtypes.rst:2243 +msgid "See also :meth:`isdecimal` and :meth:`isdigit`." +msgstr "" + +#: ../../library/stdtypes.rst:2248 +msgid "" +"Return ``True`` if all characters in the string are printable, ``False`` if " +"it contains at least one non-printable character." +msgstr "如果字符串中的所有字符均为可打印字符则返回 ``True``,如果包含至少一个不可打印字符则返回 ``False``。" + +#: ../../library/stdtypes.rst:2251 +msgid "" +"Here \"printable\" means the character is suitable for :func:`repr` to use " +"in its output; \"non-printable\" means that :func:`repr` on built-in types " +"will hex-escape the character. It has no bearing on the handling of strings" +" written to :data:`sys.stdout` or :data:`sys.stderr`." +msgstr "" +"这里的“可打印”是指字符适用于在其输出中 :func:`repr` 中;“不可打印”则意味着内置类型的 :func:`repr` " +"将以十六进制转义代码表示该字符。它不会影响对写入到 :data:`sys.stdout` 或 :data:`sys.stderr` 的字符串的处理。" + +#: ../../library/stdtypes.rst:2256 +msgid "" +"The printable characters are those which in the Unicode character database " +"(see :mod:`unicodedata`) have a general category in group Letter, Mark, " +"Number, Punctuation, or Symbol (L, M, N, P, or S); plus the ASCII space " +"0x20. Nonprintable characters are those in group Separator or Other (Z or " +"C), except the ASCII space." +msgstr "" +"可打印字符就是在 Unicode 字符数据库 (参见 :mod:`unicodedata`) 中分组为主类别 Letter, Mark, Number," +" Punctuation 或 Symbol (L, M, N, P 或 S) 的字符;加上 ASCII 空格符 0x20。不可打印字符就是分组为 " +"Separator 或 Other (Z 或 C) 的字符,ASCII 空格符除外。" + +#: ../../library/stdtypes.rst:2264 +msgid "" +">>> ''.isprintable(), ' '.isprintable()\n" +"(True, True)\n" +">>> '\\t'.isprintable(), '\\n'.isprintable()\n" +"(False, False)" +msgstr "" +">>> ''.isprintable(), ' '.isprintable()\n" +"(True, True)\n" +">>> '\\t'.isprintable(), '\\n'.isprintable()\n" +"(False, False)" + +#: ../../library/stdtypes.rst:2271 +msgid "See also :meth:`isspace`." +msgstr "另请参阅 :meth:`isspace`。" + +#: ../../library/stdtypes.rst:2276 +msgid "" +"Return ``True`` if there are only whitespace characters in the string and " +"there is at least one character, ``False`` otherwise." +msgstr "如果字符串中只有空白字符且至少有一个字符则返回 ``True``,否则返回 ``False``。" + +#: ../../library/stdtypes.rst:2281 +msgid "" +">>> ''.isspace()\n" +"False\n" +">>> ' '.isspace()\n" +"True\n" +">>> '\\t\\n'.isspace() # TAB and BREAK LINE\n" +"True\n" +">>> '\\u3000'.isspace() # IDEOGRAPHIC SPACE\n" +"True" +msgstr "" +">>> ''.isspace()\n" +"False\n" +">>> ' '.isspace()\n" +"True\n" +">>> '\\t\\n'.isspace() # 制表符和换行符\n" +"True\n" +">>> '\\u3000'.isspace() # 表意文字空格\n" +"True" + +#: ../../library/stdtypes.rst:2292 +msgid "" +"A character is *whitespace* if in the Unicode character database (see " +":mod:`unicodedata`), either its general category is ``Zs`` (\"Separator, " +"space\"), or its bidirectional class is one of ``WS``, ``B``, or ``S``." +msgstr "" +"*空白* 字符是指在 Unicode 字符数据库 (参见 :mod:`unicodedata`) 中主要类别为 ``Zs`` (\"Separator," +" space\") 或所属双向类为 ``WS``, ``B`` 或 ``S`` 的字符。" + +#: ../../library/stdtypes.rst:2297 +msgid "See also :meth:`isprintable`." +msgstr "另请参阅 :meth:`isprintable`。" + +#: ../../library/stdtypes.rst:2302 +msgid "" +"Return ``True`` if the string is a titlecased string and there is at least " +"one character, for example uppercase characters may only follow uncased " +"characters and lowercase characters only cased ones. Return ``False`` " +"otherwise." +msgstr "" +"如果字符串中至少有一个字符且为标题字符串则返回 ``True``,例如大写字符之后只能带非大写字符而小写字符必须有大写字符打头。否则返回 " +"``False`` ." + +#: ../../library/stdtypes.rst:2308 +msgid "" +">>> 'Spam, Spam, Spam'.istitle()\n" +"True\n" +">>> 'spam, spam, spam'.istitle()\n" +"False\n" +">>> 'SPAM, SPAM, SPAM'.istitle()\n" +"False" +msgstr "" +">>> 'Spam, Spam, Spam'.istitle()\n" +"True\n" +">>> 'spam, spam, spam'.istitle()\n" +"False\n" +">>> 'SPAM, SPAM, SPAM'.istitle()\n" +"False" + +#: ../../library/stdtypes.rst:2317 +msgid "See also :meth:`title`." +msgstr "另请参阅 :meth:`title`。" + +#: ../../library/stdtypes.rst:2322 +msgid "" +"Return ``True`` if all cased characters [4]_ in the string are uppercase and" +" there is at least one cased character, ``False`` otherwise." +msgstr "如果字符串中至少有一个区分大小写的字符 [4]_ 且此类字符均为大写则返回 ``True``,否则返回 ``False``。" + +#: ../../library/stdtypes.rst:2340 +msgid "" +"Return a string which is the concatenation of the strings in *iterable*. A " +":exc:`TypeError` will be raised if there are any non-string values in " +"*iterable*, including :class:`bytes` objects. The separator between " +"elements is the string providing this method. For example:" +msgstr "" +"返回一个由 *iterable* 中的字符串拼接而成的字符串。如果 *iterable* 中存在任何非字符串值包括 :class:`bytes` " +"对象则会引发 :exc:`TypeError`。调用该方法的字符串将作为元素之间的分隔符。例如:" + +#: ../../library/stdtypes.rst:2345 +msgid "" +">>> ', '.join(['spam', 'spam', 'spam'])\n" +"'spam, spam, spam'\n" +">>> '-'.join('Python')\n" +"'P-y-t-h-o-n'" +msgstr "" +">>> ', '.join(['spam', 'spam', 'spam'])\n" +"'spam, spam, spam'\n" +">>> '-'.join('Python')\n" +"'P-y-t-h-o-n'" + +#: ../../library/stdtypes.rst:2352 +msgid "See also :meth:`split`." +msgstr "另请参阅 :meth:`split`。" + +#: ../../library/stdtypes.rst:2357 +msgid "" +"Return the string left justified in a string of length *width*. Padding is " +"done using the specified *fillchar* (default is an ASCII space). The " +"original string is returned if *width* is less than or equal to ``len(s)``." +msgstr "" +"返回长度为 *width* 的字符串,原字符串在其中靠左对齐。使用指定的 *fillchar* 填充空位 (默认使用 ASCII 空格符)。如果 " +"*width* 小于等于 ``len(s)`` 则返回原字符串的副本。" + +#: ../../library/stdtypes.rst:2363 +msgid "" +">>> 'Python'.ljust(10)\n" +"'Python '\n" +">>> 'Python'.ljust(10, '.')\n" +"'Python....'\n" +">>> 'Monty Python'.ljust(10, '.')\n" +"'Monty Python'" +msgstr "" +">>> 'Python'.ljust(10)\n" +"'Python '\n" +">>> 'Python'.ljust(10, '.')\n" +"'Python....'\n" +">>> 'Monty Python'.ljust(10, '.')\n" +"'Monty Python'" + +#: ../../library/stdtypes.rst:2372 ../../library/stdtypes.rst:2905 +msgid "See also :meth:`rjust`." +msgstr "另请参阅 :meth:`rjust`。" + +#: ../../library/stdtypes.rst:2377 +msgid "" +"Return a copy of the string with all the cased characters [4]_ converted to " +"lowercase. For example:" +msgstr "返回原字符串的副本其中所有区分大小写的字符 [4]_ 均转换为小写。例如:" + +#: ../../library/stdtypes.rst:2380 +msgid "" +">>> 'Lower Method Example'.lower()\n" +"'lower method example'" +msgstr "" +">>> 'Lower Method Example'.lower()\n" +"'lower method example'" + +#: ../../library/stdtypes.rst:2385 +msgid "" +"The lowercasing algorithm used is `described in section 3.13 'Default Case " +"Folding' of the Unicode Standard " +"`__." +msgstr "" +"使用的小写算法在 `Unicode 标准 3.13 节 'Default Case Folding' " +"`__ 中有描述。" + +#: ../../library/stdtypes.rst:2392 +msgid "" +"Return a copy of the string with leading characters removed. The *chars* " +"argument is a string specifying the set of characters to be removed. If " +"omitted or ``None``, the *chars* argument defaults to removing whitespace. " +"The *chars* argument is not a prefix; rather, all combinations of its values" +" are stripped::" +msgstr "" +"返回原字符串的副本,移除其中的前导字符。 *chars* 参数为指定要移除字符的字符串。如果省略或为 ``None``,则 *chars* " +"参数默认移除空白符。实际上 *chars* 参数并非指定单个前缀;而是会移除参数值的所有组合::" + +#: ../../library/stdtypes.rst:2397 +msgid "" +">>> ' spacious '.lstrip()\n" +"'spacious '\n" +">>> 'www.example.com'.lstrip('cmowz.')\n" +"'example.com'" +msgstr "" +">>> ' spacious '.lstrip()\n" +"'spacious '\n" +">>> 'www.example.com'.lstrip('cmowz.')\n" +"'example.com'" + +#: ../../library/stdtypes.rst:2402 +msgid "" +"See :meth:`str.removeprefix` for a method that will remove a single prefix " +"string rather than all of a set of characters. For example::" +msgstr "参见 :meth:`str.removeprefix`,该方法将删除单个前缀字符串,而不是全部给定集合中的字符。例如:" + +#: ../../library/stdtypes.rst:2405 +msgid "" +">>> 'Arthur: three!'.lstrip('Arthur: ')\n" +"'ee!'\n" +">>> 'Arthur: three!'.removeprefix('Arthur: ')\n" +"'three!'" +msgstr "" +">>> 'Arthur: three!'.lstrip('Arthur: ')\n" +"'ee!'\n" +">>> 'Arthur: three!'.removeprefix('Arthur: ')\n" +"'three!'" + +#: ../../library/stdtypes.rst:2414 +msgid "" +"This static method returns a translation table usable for " +":meth:`str.translate`." +msgstr "此静态方法返回一个可供 :meth:`str.translate` 使用的转换对照表。" + +#: ../../library/stdtypes.rst:2416 +msgid "" +"If there is only one argument, it must be a dictionary mapping Unicode " +"ordinals (integers) or characters (strings of length 1) to Unicode ordinals," +" strings (of arbitrary lengths) or ``None``. Character keys will then be " +"converted to ordinals." +msgstr "" +"如果只有一个参数,则它必须是一个将 Unicode 码位序号(整数)或字符(长度为 1 的字符串)映射到 Unicode " +"码位序号、(任意长度的)字符串或 ``None`` 的字典。字符键将会被转换为码位序号。" + +#: ../../library/stdtypes.rst:2421 +msgid "" +"If there are two arguments, they must be strings of equal length, and in the" +" resulting dictionary, each character in *from* will be mapped to the " +"character at the same position in *to*. If there is a third argument, it " +"must be a string, whose characters will be mapped to ``None`` in the result." +msgstr "" +"如果有两个参数,则它们必须是两个长度相等的字符串,并且在结果字典中,*from* 中每个字符将被映射到 *to* 中相同位置的字符。 " +"如果有第三个参数,它必须是一个字符串,其中的字符将在结果中被映射到 ``None``。" + +#: ../../library/stdtypes.rst:2429 +msgid "" +"Split the string at the first occurrence of *sep*, and return a 3-tuple " +"containing the part before the separator, the separator itself, and the part" +" after the separator. If the separator is not found, return a 3-tuple " +"containing the string itself, followed by two empty strings." +msgstr "" +"在 *sep* 首次出现的位置拆分字符串,返回一个 3 元组,其中包含分隔符之前的部分、分隔符本身,以及分隔符之后的部分。如果分隔符未找到,则返回的 3" +" 元组中包含字符本身以及两个空字符串。" + +#: ../../library/stdtypes.rst:2436 +msgid "" +">>> 'Monty Python'.partition(' ')\n" +"('Monty', ' ', 'Python')\n" +">>> \"Monty Python's Flying Circus\".partition(' ')\n" +"('Monty', ' ', \"Python's Flying Circus\")\n" +">>> 'Monty Python'.partition('-')\n" +"('Monty Python', '', '')" +msgstr "" +">>> 'Monty Python'.partition(' ')\n" +"('Monty', ' ', 'Python')\n" +">>> \"Monty Python's Flying Circus\".partition(' ')\n" +"('Monty', ' ', \"Python's Flying Circus\")\n" +">>> 'Monty Python'.partition('-')\n" +"('Monty Python', '', '')" + +#: ../../library/stdtypes.rst:2445 +msgid "See also :meth:`rpartition`." +msgstr "另请参阅 :meth:`rpartition`。" + +#: ../../library/stdtypes.rst:2450 +msgid "" +"If the string starts with the *prefix* string, return " +"``string[len(prefix):]``. Otherwise, return a copy of the original string:" +msgstr "如果字符串以 *prefix* 字符串开头,则返回 ``string[len(prefix):]``。否则,返回原始字符串的副本:" + +#: ../../library/stdtypes.rst:2454 +msgid "" +">>> 'TestHook'.removeprefix('Test')\n" +"'Hook'\n" +">>> 'BaseTestCase'.removeprefix('Test')\n" +"'BaseTestCase'" +msgstr "" +">>> 'TestHook'.removeprefix('Test')\n" +"'Hook'\n" +">>> 'BaseTestCase'.removeprefix('Test')\n" +"'BaseTestCase'" + +#: ../../library/stdtypes.rst:2463 +msgid "See also :meth:`removesuffix` and :meth:`startswith`." +msgstr "另请参阅 :meth:`removesuffix` 和 :meth:`startswith`。" + +#: ../../library/stdtypes.rst:2468 +msgid "" +"If the string ends with the *suffix* string and that *suffix* is not empty, " +"return ``string[:-len(suffix)]``. Otherwise, return a copy of the original " +"string:" +msgstr "" +"如果字符串以 *suffix* 字符串结尾并且 *suffix* 不为空,则返回 ``string[:-len(suffix)]``。 " +"否则,返回原始字符串的副本:" + +#: ../../library/stdtypes.rst:2472 +msgid "" +">>> 'MiscTests'.removesuffix('Tests')\n" +"'Misc'\n" +">>> 'TmpDirMixin'.removesuffix('Tests')\n" +"'TmpDirMixin'" +msgstr "" +">>> 'MiscTests'.removesuffix('Tests')\n" +"'Misc'\n" +">>> 'TmpDirMixin'.removesuffix('Tests')\n" +"'TmpDirMixin'" + +#: ../../library/stdtypes.rst:2481 +msgid "See also :meth:`removeprefix` and :meth:`endswith`." +msgstr "另请参阅 :meth:`removeprefix` 和 :meth:`endswith`。" + +#: ../../library/stdtypes.rst:2486 +msgid "" +"Return a copy of the string with all occurrences of substring *old* replaced" +" by *new*. If *count* is given, only the first *count* occurrences are " +"replaced. If *count* is not specified or ``-1``, then all occurrences are " +"replaced. For example:" +msgstr "" +"返回字符串的副本,其中出现的所有子串 *old* 都将被替换为 *new*。如果给出了 *count*,则只替换前 *count* 次出现。如果 " +"*count* 未指定或为 ``-1``,则全部替换。例如:" + +#: ../../library/stdtypes.rst:2491 +msgid "" +">>> 'spam, spam, spam'.replace('spam', 'eggs')\n" +"'eggs, eggs, eggs'\n" +">>> 'spam, spam, spam'.replace('spam', 'eggs', 1)\n" +"'eggs, spam, spam'" +msgstr "" +">>> 'spam, spam, spam'.replace('spam', 'eggs')\n" +"'eggs, eggs, eggs'\n" +">>> 'spam, spam, spam'.replace('spam', 'eggs', 1)\n" +"'eggs, spam, spam'" + +#: ../../library/stdtypes.rst:2498 +msgid "*count* is now supported as a keyword argument." +msgstr "现在可支持 *count* 关键字参数。" + +#: ../../library/stdtypes.rst:2504 +msgid "" +"Return the highest index in the string where substring *sub* is found, such " +"that *sub* is contained within ``s[start:end]``. Optional arguments *start*" +" and *end* are interpreted as in slice notation. Return ``-1`` on failure. " +"For example:" +msgstr "" +"返回找到的 *sub* 在字符串中的最高索引号,*sub* 应包含在 ``s[start:end]`` 区间内。可选参数 *start* 和 *end*" +" 将被解读为切片序号。失败时返回 ``-1``。例如:" + +#: ../../library/stdtypes.rst:2509 +msgid "" +">>> 'spam, spam, spam'.rfind('sp')\n" +"12\n" +">>> 'spam, spam, spam'.rfind('sp', 0, 10)\n" +"6" +msgstr "" +">>> 'spam, spam, spam'.rfind('sp')\n" +"12\n" +">>> 'spam, spam, spam'.rfind('sp', 0, 10)\n" +"6" + +#: ../../library/stdtypes.rst:2516 +msgid "See also :meth:`find` and :meth:`rindex`." +msgstr "另请参阅 :meth:`find` 和 :meth:`rindex`。" + +#: ../../library/stdtypes.rst:2521 +msgid "" +"Like :meth:`rfind` but raises :exc:`ValueError` when the substring *sub* is " +"not found. For example:" +msgstr "类似于 :meth:`rfind` 但在找不到子串 *sub* 时会引发 :exc:`ValueError`。例如:" + +#: ../../library/stdtypes.rst:2525 +msgid "" +">>> 'spam, spam, spam'.rindex('spam')\n" +"12\n" +">>> 'spam, spam, spam'.rindex('eggs')\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +" 'spam, spam, spam'.rindex('eggs')\n" +" ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^\n" +"ValueError: substring not found" +msgstr "" +">>> 'spam, spam, spam'.rindex('spam')\n" +"12\n" +">>> 'spam, spam, spam'.rindex('eggs')\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +" 'spam, spam, spam'.rindex('eggs')\n" +" ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^\n" +"ValueError: substring not found" + +#: ../../library/stdtypes.rst:2536 +msgid "See also :meth:`index` and :meth:`find`." +msgstr "另请参阅 :meth:`index` 和 :meth:`find`。" + +#: ../../library/stdtypes.rst:2541 +msgid "" +"Return the string right justified in a string of length *width*. Padding is " +"done using the specified *fillchar* (default is an ASCII space). The " +"original string is returned if *width* is less than or equal to ``len(s)``." +msgstr "" +"返回长度为 *width* 的字符串,原字符串在其中靠右对齐。使用指定的 *fillchar* 填充空位 (默认使用 ASCII 空格符)。如果 " +"*width* 小于等于 ``len(s)`` 则返回原字符串的副本。" + +#: ../../library/stdtypes.rst:2547 +msgid "" +">>> 'Python'.rjust(10)\n" +"' Python'\n" +">>> 'Python'.rjust(10, '.')\n" +"'....Python'\n" +">>> 'Monty Python'.rjust(10, '.')\n" +"'Monty Python'" +msgstr "" +">>> 'Python'.rjust(10)\n" +"' Python'\n" +">>> 'Python'.rjust(10, '.')\n" +"'....Python'\n" +">>> 'Monty Python'.rjust(10, '.')\n" +"'Monty Python'" + +#: ../../library/stdtypes.rst:2556 +msgid "See also :meth:`ljust` and :meth:`zfill`." +msgstr "另请参阅 :meth:`ljust` 和 :meth:`zfill`。" + +#: ../../library/stdtypes.rst:2561 +msgid "" +"Split the string at the last occurrence of *sep*, and return a 3-tuple " +"containing the part before the separator, the separator itself, and the part" +" after the separator. If the separator is not found, return a 3-tuple " +"containing two empty strings, followed by the string itself." +msgstr "" +"在 *sep* 最后一次出现的位置拆分字符串,返回一个 3 元组,其中包含分隔符之前的部分、分隔符本身,以及分隔符之后的部分。 " +"如果分隔符未找到,则返回的 3 元组中包含两个空字符串以及字符串本身。" + +#: ../../library/stdtypes.rst:2568 +msgid "" +">>> 'Monty Python'.rpartition(' ')\n" +"('Monty', ' ', 'Python')\n" +">>> \"Monty Python's Flying Circus\".rpartition(' ')\n" +"(\"Monty Python's Flying\", ' ', 'Circus')\n" +">>> 'Monty Python'.rpartition('-')\n" +"('', '', 'Monty Python')" +msgstr "" +">>> 'Monty Python'.rpartition(' ')\n" +"('Monty', ' ', 'Python')\n" +">>> \"Monty Python's Flying Circus\".rpartition(' ')\n" +"(\"Monty Python's Flying\", ' ', 'Circus')\n" +">>> 'Monty Python'.rpartition('-')\n" +"('', '', 'Monty Python')" + +#: ../../library/stdtypes.rst:2577 +msgid "See also :meth:`partition`." +msgstr "另请参阅 :meth:`partition`。" + +#: ../../library/stdtypes.rst:2582 +msgid "" +"Return a list of the words in the string, using *sep* as the delimiter " +"string. If *maxsplit* is given, at most *maxsplit* splits are done, the " +"*rightmost* ones. If *sep* is not specified or ``None``, any whitespace " +"string is a separator. Except for splitting from the right, :meth:`rsplit` " +"behaves like :meth:`split` which is described in detail below." +msgstr "" +"返回一个由字符串内单词组成的列表,使用 *sep* 作为分隔字符串。如果给出了 *maxsplit*,则最多进行 *maxsplit* 次拆分,从 " +"*最右边* 开始。如果 *sep* 未指定或为 ``None``,任何空白字符串都会被作为分隔符。除了从右边开始拆分,:meth:`rsplit` " +"的其他行为都类似于下文所述的 :meth:`split`。" + +#: ../../library/stdtypes.rst:2591 +msgid "" +"Return a copy of the string with trailing characters removed. The *chars* " +"argument is a string specifying the set of characters to be removed. If " +"omitted or ``None``, the *chars* argument defaults to removing whitespace. " +"The *chars* argument is not a suffix; rather, all combinations of its values" +" are stripped. For example:" +msgstr "" + +#: ../../library/stdtypes.rst:2597 +msgid "" +">>> ' spacious '.rstrip()\n" +"' spacious'\n" +">>> 'mississippi'.rstrip('ipz')\n" +"'mississ'" +msgstr "" +">>> ' spacious '.rstrip()\n" +"' spacious'\n" +">>> 'mississippi'.rstrip('ipz')\n" +"'mississ'" + +#: ../../library/stdtypes.rst:2604 +msgid "" +"See :meth:`removesuffix` for a method that will remove a single suffix " +"string rather than all of a set of characters. For example::" +msgstr "" + +#: ../../library/stdtypes.rst:2607 +msgid "" +">>> 'Monty Python'.rstrip(' Python')\n" +"'M'\n" +">>> 'Monty Python'.removesuffix(' Python')\n" +"'Monty'" +msgstr "" +">>> 'Monty Python'.rstrip(' Python')\n" +"'M'\n" +">>> 'Monty Python'.removesuffix(' Python')\n" +"'Monty'" + +#: ../../library/stdtypes.rst:2612 +msgid "See also :meth:`strip`." +msgstr "另请参阅 :meth:`strip`。" + +#: ../../library/stdtypes.rst:2617 +msgid "" +"Return a list of the words in the string, using *sep* as the delimiter " +"string. If *maxsplit* is given, at most *maxsplit* splits are done (thus, " +"the list will have at most ``maxsplit+1`` elements). If *maxsplit* is not " +"specified or ``-1``, then there is no limit on the number of splits (all " +"possible splits are made)." +msgstr "" +"返回一个由字符串内单词组成的列表,使用 *sep* 作为分隔字符串。如果给出了 *maxsplit*,则最多进行 *maxsplit* " +"次拆分(因此,列表最多会有 ``maxsplit+1`` 个元素)。如果 *maxsplit* 未指定或为 " +"``-1``,则不限制拆分次数(进行所有可能的拆分)。" + +#: ../../library/stdtypes.rst:2623 +msgid "" +"If *sep* is given, consecutive delimiters are not grouped together and are " +"deemed to delimit empty strings (for example, ``'1,,2'.split(',')`` returns " +"``['1', '', '2']``). The *sep* argument may consist of multiple characters " +"as a single delimiter (to split with multiple delimiters, use " +":func:`re.split`). Splitting an empty string with a specified separator " +"returns ``['']``." +msgstr "" +"如果给出了 *sep*,则连续的分隔符不会被组合在一起而是会被视为分隔空字符串 (例如 ``'1,,2'.split(',')`` 将返回 " +"``['1', '', '2']``)。 *sep* 参数可能是由多个字符组成的单个分隔符 (要使用多个分隔符进行拆分,请使用 " +":func:`re.split`)。使用指定的分隔符拆分一个空字符串将返回 ``['']``。" + +#: ../../library/stdtypes.rst:2632 +msgid "" +">>> '1,2,3'.split(',')\n" +"['1', '2', '3']\n" +">>> '1,2,3'.split(',', maxsplit=1)\n" +"['1', '2,3']\n" +">>> '1,2,,3,'.split(',')\n" +"['1', '2', '', '3', '']\n" +">>> '1<>2<>3<4'.split('<>')\n" +"['1', '2', '3<4']" +msgstr "" +">>> '1,2,3'.split(',')\n" +"['1', '2', '3']\n" +">>> '1,2,3'.split(',', maxsplit=1)\n" +"['1', '2,3']\n" +">>> '1,2,,3,'.split(',')\n" +"['1', '2', '', '3', '']\n" +">>> '1<>2<>3<4'.split('<>')\n" +"['1', '2', '3<4']" + +#: ../../library/stdtypes.rst:2643 +msgid "" +"If *sep* is not specified or is ``None``, a different splitting algorithm is" +" applied: runs of consecutive whitespace are regarded as a single separator," +" and the result will contain no empty strings at the start or end if the " +"string has leading or trailing whitespace. Consequently, splitting an empty" +" string or a string consisting of just whitespace with a ``None`` separator " +"returns ``[]``." +msgstr "" +"如果 *sep* 未指定或为 " +"``None``,则会应用另一种拆分算法:连续的空格会被视为单个分隔符,其结果将不包含开头或末尾的空字符串,如果字符串包含前缀或后缀空格的话。 " +"因此,使用 ``None`` 拆分空字符串或仅包含空格的字符串将返回 ``[]``。" + +#: ../../library/stdtypes.rst:2652 +msgid "" +">>> '1 2 3'.split()\n" +"['1', '2', '3']\n" +">>> '1 2 3'.split(maxsplit=1)\n" +"['1', '2 3']\n" +">>> ' 1 2 3 '.split()\n" +"['1', '2', '3']" +msgstr "" +">>> '1 2 3'.split()\n" +"['1', '2', '3']\n" +">>> '1 2 3'.split(maxsplit=1)\n" +"['1', '2 3']\n" +">>> ' 1 2 3 '.split()\n" +"['1', '2', '3']" + +#: ../../library/stdtypes.rst:2661 +msgid "" +"If *sep* is not specified or is ``None`` and *maxsplit* is ``0``, only " +"leading runs of consecutive whitespace are considered." +msgstr "如果 *sep* 未指定或为 ``None`` 且 *maxsplit* 为 ``0``,则只有开头的连续空格会被纳入考虑。" + +#: ../../library/stdtypes.rst:2666 +msgid "" +">>> \"\".split(None, 0)\n" +"[]\n" +">>> \" \".split(None, 0)\n" +"[]\n" +">>> \" foo \".split(maxsplit=0)\n" +"['foo ']" +msgstr "" +">>> \"\".split(None, 0)\n" +"[]\n" +">>> \" \".split(None, 0)\n" +"[]\n" +">>> \" foo \".split(maxsplit=0)\n" +"['foo ']" + +#: ../../library/stdtypes.rst:2675 +msgid "See also :meth:`join` and :meth:`rsplit`." +msgstr "" + +#: ../../library/stdtypes.rst:2683 +msgid "" +"Return a list of the lines in the string, breaking at line boundaries. Line" +" breaks are not included in the resulting list unless *keepends* is given " +"and true." +msgstr "返回由原字符串中各行组成的列表,在行边界的位置拆分。结果列表中不包含行边界,除非给出了 *keepends* 且为真值。" + +#: ../../library/stdtypes.rst:2687 +msgid "" +"This method splits on the following line boundaries. In particular, the " +"boundaries are a superset of :term:`universal newlines`." +msgstr "此方法会以下列行边界进行拆分。特别地,行边界是 :term:`universal newlines` 的一个超集。" + +#: ../../library/stdtypes.rst:2691 +msgid "Representation" +msgstr "表示符" + +#: ../../library/stdtypes.rst:2691 +msgid "Description" +msgstr "描述" + +#: ../../library/stdtypes.rst:2693 +msgid "``\\n``" +msgstr "``\\n``" + +#: ../../library/stdtypes.rst:2693 +msgid "Line Feed" +msgstr "换行" + +#: ../../library/stdtypes.rst:2695 +msgid "``\\r``" +msgstr "``\\r``" + +#: ../../library/stdtypes.rst:2695 +msgid "Carriage Return" +msgstr "回车" + +#: ../../library/stdtypes.rst:2697 +msgid "``\\r\\n``" +msgstr "``\\r\\n``" + +#: ../../library/stdtypes.rst:2697 +msgid "Carriage Return + Line Feed" +msgstr "回车 + 换行" + +#: ../../library/stdtypes.rst:2699 +msgid "``\\v`` or ``\\x0b``" +msgstr "``\\v`` 或 ``\\x0b``" + +#: ../../library/stdtypes.rst:2699 +msgid "Line Tabulation" +msgstr "行制表符" + +#: ../../library/stdtypes.rst:2701 +msgid "``\\f`` or ``\\x0c``" +msgstr "``\\f`` 或 ``\\x0c``" + +#: ../../library/stdtypes.rst:2701 +msgid "Form Feed" +msgstr "换表单" + +#: ../../library/stdtypes.rst:2703 +msgid "``\\x1c``" +msgstr "``\\x1c``" + +#: ../../library/stdtypes.rst:2703 +msgid "File Separator" +msgstr "文件分隔符" + +#: ../../library/stdtypes.rst:2705 +msgid "``\\x1d``" +msgstr "``\\x1d``" + +#: ../../library/stdtypes.rst:2705 +msgid "Group Separator" +msgstr "组分隔符" + +#: ../../library/stdtypes.rst:2707 +msgid "``\\x1e``" +msgstr "``\\x1e``" + +#: ../../library/stdtypes.rst:2707 +msgid "Record Separator" +msgstr "记录分隔符" + +#: ../../library/stdtypes.rst:2709 +msgid "``\\x85``" +msgstr "``\\x85``" + +#: ../../library/stdtypes.rst:2709 +msgid "Next Line (C1 Control Code)" +msgstr "下一行 (C1 控制码)" + +#: ../../library/stdtypes.rst:2711 +msgid "``\\u2028``" +msgstr "``\\u2028``" + +#: ../../library/stdtypes.rst:2711 +msgid "Line Separator" +msgstr "行分隔符" + +#: ../../library/stdtypes.rst:2713 +msgid "``\\u2029``" +msgstr "``\\u2029``" + +#: ../../library/stdtypes.rst:2713 +msgid "Paragraph Separator" +msgstr "段分隔符" + +#: ../../library/stdtypes.rst:2718 +msgid "``\\v`` and ``\\f`` added to list of line boundaries." +msgstr "``\\v`` 和 ``\\f`` 被添加到行边界列表" + +#: ../../library/stdtypes.rst:2720 ../../library/stdtypes.rst:2826 +#: ../../library/stdtypes.rst:2995 ../../library/stdtypes.rst:3970 +#: ../../library/stdtypes.rst:3988 ../../library/stdtypes.rst:4078 +#: ../../library/stdtypes.rst:4094 ../../library/stdtypes.rst:4119 +#: ../../library/stdtypes.rst:4133 ../../library/stdtypes.rst:4161 +#: ../../library/stdtypes.rst:4175 ../../library/stdtypes.rst:4193 +#: ../../library/stdtypes.rst:4220 ../../library/stdtypes.rst:4243 +#: ../../library/stdtypes.rst:4270 ../../library/stdtypes.rst:4312 +#: ../../library/stdtypes.rst:4336 +msgid "For example::" +msgstr "例如:" + +#: ../../library/stdtypes.rst:2722 +msgid "" +">>> 'ab c\\n\\nde fg\\rkl\\r\\n'.splitlines()\n" +"['ab c', '', 'de fg', 'kl']\n" +">>> 'ab c\\n\\nde fg\\rkl\\r\\n'.splitlines(keepends=True)\n" +"['ab c\\n', '\\n', 'de fg\\r', 'kl\\r\\n']" +msgstr "" +">>> 'ab c\\n\\nde fg\\rkl\\r\\n'.splitlines()\n" +"['ab c', '', 'de fg', 'kl']\n" +">>> 'ab c\\n\\nde fg\\rkl\\r\\n'.splitlines(keepends=True)\n" +"['ab c\\n', '\\n', 'de fg\\r', 'kl\\r\\n']" + +#: ../../library/stdtypes.rst:2727 +msgid "" +"Unlike :meth:`~str.split` when a delimiter string *sep* is given, this " +"method returns an empty list for the empty string, and a terminal line break" +" does not result in an extra line::" +msgstr "" +"不同于 :meth:`~str.split`,当给出了分隔字符串 *sep* " +"时,对于空字符串此方法将返回一个空列表,而末尾的换行不会令结果中增加额外的行::" + +#: ../../library/stdtypes.rst:2731 +msgid "" +">>> \"\".splitlines()\n" +"[]\n" +">>> \"One line\\n\".splitlines()\n" +"['One line']" +msgstr "" +">>> \"\".splitlines()\n" +"[]\n" +">>> \"One line\\n\".splitlines()\n" +"['One line']" + +#: ../../library/stdtypes.rst:2736 +msgid "For comparison, ``split('\\n')`` gives::" +msgstr "作为比较,``split('\\n')`` 的结果为::" + +#: ../../library/stdtypes.rst:2738 +msgid "" +">>> ''.split('\\n')\n" +"['']\n" +">>> 'Two lines\\n'.split('\\n')\n" +"['Two lines', '']" +msgstr "" +">>> ''.split('\\n')\n" +"['']\n" +">>> 'Two lines\\n'.split('\\n')\n" +"['Two lines', '']" + +#: ../../library/stdtypes.rst:2746 +msgid "" +"Return ``True`` if string starts with the *prefix*, otherwise return " +"``False``. *prefix* can also be a tuple of prefixes to look for. With " +"optional *start*, test string beginning at that position. With optional " +"*end*, stop comparing string at that position." +msgstr "" +"如果字符串以指定的 *prefix* 开始则返回 ``True``,否则返回 ``False``。 *prefix* " +"也可以为由多个供查找的前缀构成的元组。如果有可选项 *start*,将从所指定位置开始检查。如果有可选项 *end*,将在所指定位置停止比较。" + +#: ../../library/stdtypes.rst:2753 +msgid "" +">>> 'Python'.startswith('Py')\n" +"True\n" +">>> 'a tuple of prefixes'.startswith(('at', 'a'))\n" +"True\n" +">>> 'Python is amazing'.startswith('is', 7)\n" +"True" +msgstr "" +">>> 'Python'.startswith('Py')\n" +"True\n" +">>> 'a tuple of prefixes'.startswith(('at', 'a'))\n" +"True\n" +">>> 'Python is amazing'.startswith('is', 7)\n" +"True" + +#: ../../library/stdtypes.rst:2762 +msgid "See also :meth:`endswith` and :meth:`removeprefix`." +msgstr "另请参阅 :meth:`endswith` 和 :meth:`removeprefix`。" + +#: ../../library/stdtypes.rst:2767 +msgid "" +"Return a copy of the string with the leading and trailing characters " +"removed. The *chars* argument is a string specifying the set of characters " +"to be removed. If omitted or ``None``, the *chars* argument defaults to " +"removing whitespace. The *chars* argument is not a prefix or suffix; rather," +" all combinations of its values are stripped." +msgstr "" + +#: ../../library/stdtypes.rst:2773 +msgid "Whitespace characters are defined by :meth:`str.isspace`." +msgstr "" + +#: ../../library/stdtypes.rst:2777 +msgid "" +">>> ' spacious '.strip()\n" +"'spacious'\n" +">>> 'www.example.com'.strip('cmowz.')\n" +"'example'" +msgstr "" +">>> ' spacious '.strip()\n" +"'spacious'\n" +">>> 'www.example.com'.strip('cmowz.')\n" +"'example'" + +#: ../../library/stdtypes.rst:2784 +msgid "" +"The outermost leading and trailing *chars* argument values are stripped from" +" the string. Characters are removed from the leading end until reaching a " +"string character that is not contained in the set of characters in *chars*. " +"A similar action takes place on the trailing end." +msgstr "" + +#: ../../library/stdtypes.rst:2791 +msgid "" +">>> comment_string = '#....... Section 3.2.1 Issue #32 .......'\n" +">>> comment_string.strip('.#! ')\n" +"'Section 3.2.1 Issue #32'" +msgstr "" +">>> comment_string = '#....... Section 3.2.1 Issue #32 .......'\n" +">>> comment_string.strip('.#! ')\n" +"'Section 3.2.1 Issue #32'" + +#: ../../library/stdtypes.rst:2797 +msgid "See also :meth:`rstrip`." +msgstr "另请参阅 :meth:`rstrip`。" + +#: ../../library/stdtypes.rst:2802 +msgid "" +"Return a copy of the string with uppercase characters converted to lowercase" +" and vice versa. For example:" +msgstr "" + +#: ../../library/stdtypes.rst:2805 +msgid "" +">>> 'Hello World'.swapcase()\n" +"'hELLO wORLD'" +msgstr "" +">>> 'Hello World'.swapcase()\n" +"'hELLO wORLD'" + +#: ../../library/stdtypes.rst:2810 +msgid "" +"Note that it is not necessarily true that ``s.swapcase().swapcase() == s``. " +"For example:" +msgstr "请注意 ``s.swapcase().swapcase() == s`` 不一定为真。 例如:" + +#: ../../library/stdtypes.rst:2813 +msgid "" +">>> 'straße'.swapcase().swapcase()\n" +"'strasse'" +msgstr "" +">>> 'straße'.swapcase().swapcase()\n" +"'strasse'" + +#: ../../library/stdtypes.rst:2818 +msgid "See also :meth:`str.lower` and :meth:`str.upper`." +msgstr "另请参阅 :meth:`str.lower` 和 :meth:`str.upper`。" + +#: ../../library/stdtypes.rst:2823 +msgid "" +"Return a titlecased version of the string where words start with an " +"uppercase character and the remaining characters are lowercase." +msgstr "返回原字符串的标题版本,其中每个单词第一个字母为大写,其余字母为小写。" + +#: ../../library/stdtypes.rst:2828 +msgid "" +">>> 'Hello world'.title()\n" +"'Hello World'" +msgstr "" +">>> 'Hello world'.title()\n" +"'Hello World'" + +#: ../../library/stdtypes.rst:2831 ../../library/stdtypes.rst:4280 +msgid "" +"The algorithm uses a simple language-independent definition of a word as " +"groups of consecutive letters. The definition works in many contexts but it" +" means that apostrophes in contractions and possessives form word " +"boundaries, which may not be the desired result::" +msgstr "" +"该算法使用一种简单的与语言无关的定义,将连续的字母组合视为单词。 " +"该定义在多数情况下都很有效,但它也意味着代表缩写形式与所有格的撇号也会成为单词边界,这可能导致不希望的结果::" + +#: ../../library/stdtypes.rst:2836 +msgid "" +">>> \"they're bill's friends from the UK\".title()\n" +"\"They'Re Bill'S Friends From The Uk\"" +msgstr "" +">>> \"they're bill's friends from the UK\".title()\n" +"\"They'Re Bill'S Friends From The Uk\"" + +#: ../../library/stdtypes.rst:2839 +msgid "" +"The :func:`string.capwords` function does not have this problem, as it " +"splits words on spaces only." +msgstr ":func:`string.capwords` 函数没有此问题,因为它只用空格来拆分单词。" + +#: ../../library/stdtypes.rst:2842 +msgid "" +"Alternatively, a workaround for apostrophes can be constructed using regular" +" expressions::" +msgstr "作为替代,可以使用正则表达式来构造针对撇号的变通处理::" + +#: ../../library/stdtypes.rst:2845 +msgid "" +">>> import re\n" +">>> def titlecase(s):\n" +"... return re.sub(r\"[A-Za-z]+('[A-Za-z]+)?\",\n" +"... lambda mo: mo.group(0).capitalize(),\n" +"... s)\n" +"...\n" +">>> titlecase(\"they're bill's friends.\")\n" +"\"They're Bill's Friends.\"" +msgstr "" +">>> import re\n" +">>> def titlecase(s):\n" +"... return re.sub(r\"[A-Za-z]+('[A-Za-z]+)?\",\n" +"... lambda mo: mo.group(0).capitalize(),\n" +"... s)\n" +"...\n" +">>> titlecase(\"they're bill's friends.\")\n" +"\"They're Bill's Friends.\"" + +#: ../../library/stdtypes.rst:2854 +msgid "See also :meth:`istitle`." +msgstr "另请参阅 :meth:`istitle`。" + +#: ../../library/stdtypes.rst:2859 +msgid "" +"Return a copy of the string in which each character has been mapped through " +"the given translation table. The table must be an object that implements " +"indexing via :meth:`~object.__getitem__`, typically a :term:`mapping` or " +":term:`sequence`. When indexed by a Unicode ordinal (an integer), the table" +" object can do any of the following: return a Unicode ordinal or a string, " +"to map the character to one or more other characters; return ``None``, to " +"delete the character from the return string; or raise a :exc:`LookupError` " +"exception, to map the character to itself." +msgstr "" +"返回原字符串的副本,其中每个字符按给定的转换表进行映射。转换表必须是一个通过 :meth:`~object.__getitem__` " +"来实现索引操作的对象,通常为 :term:`mapping` 或 :term:`sequence`。当以 Unicode " +"码位序号(整数)为索引时,转换表对象可以做以下任何一种操作:返回 Unicode 码位序号或字符串,将字符映射为一个或多个其他字符;返回 " +"``None``,将字符从返回的字符串中删除;或引发 :exc:`LookupError` 异常,将字符映射为其自身。" + +#: ../../library/stdtypes.rst:2868 +msgid "" +"You can use :meth:`str.maketrans` to create a translation map from " +"character-to-character mappings in different formats." +msgstr "你可以使用 :meth:`str.maketrans` 基于不同格式的字符到字符映射来创建一个转换映射表。" + +#: ../../library/stdtypes.rst:2871 +msgid "" +"See also the :mod:`codecs` module for a more flexible approach to custom " +"character mappings." +msgstr "另请参阅 :mod:`codecs` 模块以了解定制字符映射的更灵活方式。" + +#: ../../library/stdtypes.rst:2877 +msgid "" +"Return a copy of the string with all the cased characters [4]_ converted to " +"uppercase. Note that ``s.upper().isupper()`` might be ``False`` if ``s`` " +"contains uncased characters or if the Unicode category of the resulting " +"character(s) is not \"Lu\" (Letter, uppercase), but e.g. \"Lt\" (Letter, " +"titlecase)." +msgstr "" +"返回原字符串的副本,其中所有区分大小写的字符 [4]_ 均转换为大写。请注意如果 ``s`` 包含不区分大小写的字符或者如果结果字符的 Unicode " +"类别不是 \"Lu\" (Letter, uppercase) 而是 \"Lt\" (Letter, titlecase) 则 " +"``s.upper().isupper()`` 有可能为 ``False``。" + +#: ../../library/stdtypes.rst:2883 +msgid "" +"The uppercasing algorithm used is `described in section 3.13 'Default Case " +"Folding' of the Unicode Standard " +"`__." +msgstr "" +"使用的大写算法在 `Unicode 标准 3.13 节 'Default Case Folding' " +"`__ 中有描述。" + +#: ../../library/stdtypes.rst:2890 +msgid "" +"Return a copy of the string left filled with ASCII ``'0'`` digits to make a " +"string of length *width*. A leading sign prefix (``'+'``/``'-'``) is handled" +" by inserting the padding *after* the sign character rather than before. The" +" original string is returned if *width* is less than or equal to ``len(s)``." +msgstr "" +"返回原字符串的副本,在左边填充 ASCII ``'0'`` 数码使其长度变为 *width*。正负值前缀 (``'+'``/``'-'``) " +"的处理方式是在正负符号 *之后* 填充而非在之前。如果 *width* 小于等于 ``len(s)`` 则返回原字符串的副本。" + +#: ../../library/stdtypes.rst:2898 +msgid "" +">>> \"42\".zfill(5)\n" +"'00042'\n" +">>> \"-42\".zfill(5)\n" +"'-0042'" +msgstr "" +">>> \"42\".zfill(5)\n" +"'00042'\n" +">>> \"-42\".zfill(5)\n" +"'-0042'" + +#: ../../library/stdtypes.rst:2925 +msgid "Formatted String Literals (f-strings)" +msgstr "格式化字符串字面值(f-字符串)" + +#: ../../library/stdtypes.rst:2928 +msgid "" +"The :keyword:`await` and :keyword:`async for` can be used in expressions " +"within f-strings." +msgstr ":keyword:`await` 和 :keyword:`async for` 可在 f-字符串内部的表达式中使用。" + +#: ../../library/stdtypes.rst:2931 +msgid "Added the debug specifier (``=``)" +msgstr "增加了调试说明符 (``=``)" + +#: ../../library/stdtypes.rst:2933 +msgid "" +"Many restrictions on expressions within f-strings have been removed. " +"Notably, nested strings, comments, and backslashes are now permitted." +msgstr "许多针对 f-字符串内部的表达式的限制已被移除。例如,嵌套字符串、注释和反斜杠现在都是允许的。" + +#: ../../library/stdtypes.rst:2937 +msgid "" +"An :dfn:`f-string` (formally a :dfn:`formatted string literal`) is a string " +"literal that is prefixed with ``f`` or ``F``. This type of string literal " +"allows embedding the results of arbitrary Python expressions within " +"*replacement fields*, which are delimited by curly brackets (``{}``). Each " +"replacement field must contain an expression, optionally followed by:" +msgstr "" +":dfn:`f-字符串` (正式名称为 :dfn:`格式化字符串字面值`) 是带有 ``f`` 或 ``F`` 前缀的字符串字面值。 " +"这种类型的字符串字面值允许将任意 Python 表达式的结果嵌入到由花括号 (``{}``) 标记的 *替换字段* 内部。 " +"每个替换字段必须包含一个表达式,后面还可以带有:" + +#: ../../library/stdtypes.rst:2944 +msgid "a *debug specifier* -- an equal sign (``=``);" +msgstr "一个 *调试说明符* -- 以等号 (``=``) 表示;" + +#: ../../library/stdtypes.rst:2945 +msgid "a *conversion specifier* -- ``!s``, ``!r`` or ``!a``; and/or" +msgstr "一个 *转换说明符* -- ``!s``, ``!r`` 或 ``!a``;和/或" + +#: ../../library/stdtypes.rst:2946 +msgid "a *format specifier* prefixed with a colon (``:``)." +msgstr "一个以冒号 (``:``) 作为前缀的 *格式说明符*。" + +#: ../../library/stdtypes.rst:2948 +msgid "" +"See the :ref:`Lexical Analysis section on f-strings ` for details" +" on the syntax of these fields." +msgstr "请参阅 :ref:`f-字符串的语法分析 ` 一节了解这些字段的语法细节。" + +#: ../../library/stdtypes.rst:2952 +msgid "Debug specifier" +msgstr "调试说明符" + +#: ../../library/stdtypes.rst:2956 +msgid "" +"If a debug specifier -- an equal sign (``=``) -- appears after the " +"replacement field expression, the resulting f-string will contain the " +"expression's source, the equal sign, and the value of the expression. This " +"is often useful for debugging::" +msgstr "" +"如果有调试说明符 -- 一个等号 (``=``) -- 出现在替换字段表达式之后,结果 f-字符串将包含该表达式的源,等号以及该表达式的值。 " +"这通常适用于调试操作::" + +#: ../../library/stdtypes.rst:2961 +msgid "" +">>> number = 14.3\n" +">>> f'{number=}'\n" +"'number=14.3'" +msgstr "" +">>> number = 14.3\n" +">>> f'{number=}'\n" +"'number=14.3'" + +#: ../../library/stdtypes.rst:2965 +msgid "" +"Whitespace before, inside and after the expression, as well as whitespace " +"after the equal sign, is significant --- it is retained in the result::" +msgstr "在表达式之前、之中和之后的空格,以及等号之后的空格是有意义的 --- 它将保留在结果中::" + +#: ../../library/stdtypes.rst:2968 +msgid "" +">>> f'{ number - 4 = }'\n" +"' number - 4 = 10.3'" +msgstr "" +">>> f'{ number - 4 = }'\n" +"' number - 4 = 10.3'" + +#: ../../library/stdtypes.rst:2973 +msgid "Conversion specifier" +msgstr "转换说明符" + +#: ../../library/stdtypes.rst:2975 +msgid "" +"By default, the value of a replacement field expression is converted to a " +"string using :func:`str`::" +msgstr "在默认情况下,替换字段表达式的值将使用 :func:`str` 转换为字符串::" + +#: ../../library/stdtypes.rst:2978 +msgid "" +">>> from fractions import Fraction\n" +">>> one_third = Fraction(1, 3)\n" +">>> f'{one_third}'\n" +"'1/3'" +msgstr "" +">>> from fractions import Fraction\n" +">>> one_third = Fraction(1, 3)\n" +">>> f'{one_third}'\n" +"'1/3'" + +#: ../../library/stdtypes.rst:2983 +msgid "" +"When a debug specifier but no format specifier is used, the default " +"conversion instead uses :func:`repr`::" +msgstr "当使用了调试说明符但未使用格式说明符时,默认的转换将改用 :func:`repr`::" + +#: ../../library/stdtypes.rst:2986 +msgid "" +">>> f'{one_third = }'\n" +"'one_third = Fraction(1, 3)'" +msgstr "" +">>> f'{one_third = }'\n" +"'one_third = Fraction(1, 3)'" + +#: ../../library/stdtypes.rst:2989 +msgid "" +"The conversion can be specified explicitly using one of these specifiers:" +msgstr "转换可使用以下说明符之一来显式地指明:" + +#: ../../library/stdtypes.rst:2991 +msgid "``!s`` for :func:`str`" +msgstr "``!s`` 表示 :func:`str`" + +#: ../../library/stdtypes.rst:2992 +msgid "``!r`` for :func:`repr`" +msgstr "``!r`` 表示 :func:`repr`" + +#: ../../library/stdtypes.rst:2993 +msgid "``!a`` for :func:`ascii`" +msgstr "``!a`` 表示 :func:`ascii`" + +#: ../../library/stdtypes.rst:2997 +msgid "" +">>> str(one_third)\n" +"'1/3'\n" +">>> repr(one_third)\n" +"'Fraction(1, 3)'\n" +"\n" +">>> f'{one_third!s} is {one_third!r}'\n" +"'1/3 is Fraction(1, 3)'\n" +"\n" +">>> string = \"¡kočka 😸!\"\n" +">>> ascii(string)\n" +"\"'\\\\xa1ko\\\\u010dka \\\\U0001f638!'\"\n" +"\n" +">>> f'{string = !a}'\n" +"\"string = '\\\\xa1ko\\\\u010dka \\\\U0001f638!'\"" +msgstr "" +">>> str(one_third)\n" +"'1/3'\n" +">>> repr(one_third)\n" +"'Fraction(1, 3)'\n" +"\n" +">>> f'{one_third!s} is {one_third!r}'\n" +"'1/3 is Fraction(1, 3)'\n" +"\n" +">>> string = \"¡kočka 😸!\"\n" +">>> ascii(string)\n" +"\"'\\\\xa1ko\\\\u010dka \\\\U0001f638!'\"\n" +"\n" +">>> f'{string = !a}'\n" +"\"string = '\\\\xa1ko\\\\u010dka \\\\U0001f638!'\"" + +#: ../../library/stdtypes.rst:3014 +msgid "Format specifier" +msgstr "格式说明符" + +#: ../../library/stdtypes.rst:3016 +msgid "" +"After the expression has been evaluated, and possibly converted using an " +"explicit conversion specifier, it is formatted using the :func:`format` " +"function. If the replacement field includes a *format specifier* introduced " +"by a colon (``:``), the specifier is passed to :func:`!format` as the second" +" argument. The result of :func:`!format` is then used as the final value for" +" the replacement field. For example::" +msgstr "" +"在表达式被求值,并可能使用显式的转换说明符进行转换之后,它将使用 :func:`format` 函数来格式化。如果替换字段还包括由一个冒号 " +"(``:``) 标记的 *格式说明符*,该说明符作为传给 :func:`!format` 的第二个参数。随后 :func:`!format` " +"的结果将被用作替换字段的最终值。例如::" + +#: ../../library/stdtypes.rst:3023 +msgid "" +">>> from fractions import Fraction\n" +">>> one_third = Fraction(1, 3)\n" +">>> f'{one_third:.6f}'\n" +"'0.333333'\n" +">>> f'{one_third:_^+10}'\n" +"'___+1/3___'\n" +">>> >>> f'{one_third!r:_^20}'\n" +"'___Fraction(1, 3)___'\n" +">>> f'{one_third = :~>10}~'\n" +"'one_third = ~~~~~~~1/3~'" +msgstr "" +">>> from fractions import Fraction\n" +">>> one_third = Fraction(1, 3)\n" +">>> f'{one_third:.6f}'\n" +"'0.333333'\n" +">>> f'{one_third:_^+10}'\n" +"'___+1/3___'\n" +">>> >>> f'{one_third!r:_^20}'\n" +"'___Fraction(1, 3)___'\n" +">>> f'{one_third = :~>10}~'\n" +"'one_third = ~~~~~~~1/3~'" + +#: ../../library/stdtypes.rst:3037 +msgid "Template String Literals (t-strings)" +msgstr "模板字符串字面值 (t-字符串)" + +#: ../../library/stdtypes.rst:3039 +msgid "" +"An :dfn:`t-string` (formally a :dfn:`template string literal`) is a string " +"literal that is prefixed with ``t`` or ``T``." +msgstr ":dfn:`t-字符串` (正式名称为 :dfn:`模板字符串字面值`) 是带有 ``t`` 或 ``T`` 前缀的字符串字面值。" + +#: ../../library/stdtypes.rst:3042 +msgid "" +"These strings follow the same syntax and evaluation rules as :ref:`formatted" +" string literals `, with for the following differences:" +msgstr "这些字符串遵循与 :ref:`格式化字符串字面值 ` 相同的语法和求值规则,但有下列区别:" + +#: ../../library/stdtypes.rst:3046 +msgid "" +"Rather than evaluating to a ``str`` object, template string literals " +"evaluate to a :class:`string.templatelib.Template` object." +msgstr "" +"模板字符串字面值不会求值为 ``str`` 对象,而是会求值为一个 :class:`string.templatelib.Template` 对象。" + +#: ../../library/stdtypes.rst:3049 +msgid "" +"The :func:`format` protocol is not used. Instead, the format specifier and " +"conversions (if any) are passed to a new " +":class:`~string.templatelib.Interpolation` object that is created for each " +"evaluated expression. It is up to code that processes the resulting " +":class:`~string.templatelib.Template` object to decide how to handle format " +"specifiers and conversions." +msgstr "" +":func:`format` 协议未被使用。相反,格式说明符和转换(如果有)将被传递给为每个评估表达式创建的新的 " +":class:`~string.templatelib.Interpolation` 对象。处理生成的 " +":class:`~string.templatelib.Template` 对象的代码将决定如何处理格式说明符和转换。" + +#: ../../library/stdtypes.rst:3056 +msgid "" +"Format specifiers containing nested replacement fields are evaluated " +"eagerly, prior to being passed to the " +":class:`~string.templatelib.Interpolation` object. For instance, an " +"interpolation of the form ``{amount:.{precision}f}`` will evaluate the inner" +" expression ``{precision}`` to determine the value of the ``format_spec`` " +"attribute. If ``precision`` were to be ``2``, the resulting format specifier" +" would be ``'.2f'``." +msgstr "" +"包含嵌套替换字段的格式说明符会在传递给 :class:`~string.templatelib.Interpolation` " +"对象之前进行急切求值。例如,形如 ``{amount:.{precision}f}`` 的插值表达式会先计算内部表达式 ``{precision}`` " +"以确定 ``format_spec`` 属性的值。若 ``precision`` 的值为 ``2``,则最终的格式说明符将是 ``'.2f'``。" + +#: ../../library/stdtypes.rst:3064 +msgid "" +"When the equals sign ``'='`` is provided in an interpolation expression, the" +" text of the expression is appended to the literal string that precedes the " +"relevant interpolation. This includes the equals sign and any surrounding " +"whitespace. The :class:`!Interpolation` instance for the expression will be " +"created as normal, except that " +":attr:`~string.templatelib.Interpolation.conversion` will be set to '``r``' " +"(:func:`repr`) by default. If an explicit conversion or format specifier are" +" provided, this will override the default behaviour." +msgstr "" +"当插值表达式中包含等号 ``'='`` 时,该表达式的文本(包括等号本身及其周围的空白符)会被追加到相关插值位置之前的字面值字符串之后。该表达式对应的 " +":class:`!Interpolation` 实例会按常规方式创建,只不过其 " +":attr:`~string.templatelib.Interpolation.conversion` 属性默认会被设为 '``r``'(即使用 " +":func:`repr` 函数)。如果提供了显式的转换说明符或格式说明符,将会覆盖这一默认行为。" + +#: ../../library/stdtypes.rst:3078 +msgid "``printf``-style String Formatting" +msgstr "``printf`` 风格的字符串格式化" + +#: ../../library/stdtypes.rst:3091 +msgid "" +"The formatting operations described here exhibit a variety of quirks that " +"lead to a number of common errors (such as failing to display tuples and " +"dictionaries correctly)." +msgstr "此处介绍的格式化操作具有多种怪异特性,可能导致多种常见错误(例如无法正确显示元组和字典)。" + +#: ../../library/stdtypes.rst:3095 +msgid "" +"Using :ref:`formatted string literals `, the :meth:`str.format` " +"interface, or :class:`string.Template` may help avoid these errors. Each of " +"these alternatives provides their own trade-offs and benefits of simplicity," +" flexibility, and/or extensibility." +msgstr "" +"使用 :ref:`格式字符串字面值 `、:meth:`str.format` 接口或 " +":class:`string.Template` 类可能有助于避免这些错误。每种替代方案在简洁性、灵活性和/或可扩展性方面都有各自的权衡和优势。" + +#: ../../library/stdtypes.rst:3100 +msgid "" +"String objects have one unique built-in operation: the ``%`` operator " +"(modulo). This is also known as the string *formatting* or *interpolation* " +"operator. Given ``format % values`` (where *format* is a string), ``%`` " +"conversion specifications in *format* are replaced with zero or more " +"elements of *values*. The effect is similar to using the :c:func:`sprintf` " +"function in the C language. For example:" +msgstr "" +"字符串具有一种特殊的内置操作即 ``%`` (求模) 运算符。这也被称为字符串的 *格式化* 或 *插值* 运算符。对于给定的 ``format % " +"values`` (其中 *format* 是一个字符串),在 *format* 中的 ``%`` 转换标记符将被替换为零个或多个 *values* " +"中的元素。其效果类似于在 C 语言中使用 :c:func:`sprintf` 函数。例如:" + +#: ../../library/stdtypes.rst:3107 +msgid "" +">>> print('%s has %d quote types.' % ('Python', 2))\n" +"Python has 2 quote types." +msgstr "" +">>> print('%s has %d quote types.' % ('Python', 2))\n" +"Python has 2 quote types." + +#: ../../library/stdtypes.rst:3112 +msgid "" +"If *format* requires a single argument, *values* may be a single non-tuple " +"object. [5]_ Otherwise, *values* must be a tuple with exactly the number of" +" items specified by the format string, or a single mapping object (for " +"example, a dictionary)." +msgstr "" +"如果 *format* 要求一个单独参数,则 *values* 可以为一个非元组对象。 [5]_ 否则的话,*values* " +"必须或者是一个包含项数与格式字符串中指定的转换符项数相同的元组,或者是一个单独映射对象(例如字典)。" + +#: ../../library/stdtypes.rst:3122 ../../library/stdtypes.rst:4391 +msgid "" +"A conversion specifier contains two or more characters and has the following" +" components, which must occur in this order:" +msgstr "转换标记符包含两个或更多字符并具有以下组成,且必须遵循此处规定的顺序:" + +#: ../../library/stdtypes.rst:3125 ../../library/stdtypes.rst:4394 +msgid "The ``'%'`` character, which marks the start of the specifier." +msgstr "``'%'`` 字符,用于标记转换符的起始。" + +#: ../../library/stdtypes.rst:3127 ../../library/stdtypes.rst:4396 +msgid "" +"Mapping key (optional), consisting of a parenthesised sequence of characters" +" (for example, ``(somename)``)." +msgstr "映射键(可选),由加圆括号的字符序列组成 (例如 ``(somename)``)。" + +#: ../../library/stdtypes.rst:3130 ../../library/stdtypes.rst:4399 +msgid "" +"Conversion flags (optional), which affect the result of some conversion " +"types." +msgstr "转换旗标(可选),用于影响某些转换类型的结果。" + +#: ../../library/stdtypes.rst:3133 ../../library/stdtypes.rst:4402 +msgid "" +"Minimum field width (optional). If specified as an ``'*'`` (asterisk), the " +"actual width is read from the next element of the tuple in *values*, and the" +" object to convert comes after the minimum field width and optional " +"precision." +msgstr "" +"最小字段宽度(可选)。如果指定为 ``'*'`` (星号),则实际宽度会从 *values* " +"元组的下一元素中读取,要转换的对象则为最小字段宽度和可选的精度之后的元素。" + +#: ../../library/stdtypes.rst:3137 ../../library/stdtypes.rst:4406 +msgid "" +"Precision (optional), given as a ``'.'`` (dot) followed by the precision. " +"If specified as ``'*'`` (an asterisk), the actual precision is read from the" +" next element of the tuple in *values*, and the value to convert comes after" +" the precision." +msgstr "" +"精度(可选),以在 ``'.'`` (点号) 之后加精度值的形式给出。如果指定为 ``'*'`` (星号),则实际精度会从 *values* " +"元组的下一元素中读取,要转换的对象则为精度之后的元素。" + +#: ../../library/stdtypes.rst:3142 ../../library/stdtypes.rst:4411 +msgid "Length modifier (optional)." +msgstr "长度修饰符(可选)。" + +#: ../../library/stdtypes.rst:3144 ../../library/stdtypes.rst:4413 +msgid "Conversion type." +msgstr "转换类型。" + +#: ../../library/stdtypes.rst:3146 +msgid "" +"When the right argument is a dictionary (or other mapping type), then the " +"formats in the string *must* include a parenthesised mapping key into that " +"dictionary inserted immediately after the ``'%'`` character. The mapping key" +" selects the value to be formatted from the mapping. For example:" +msgstr "" +"当右边的参数为一个字典(或其他映射类型)时,字符串中的格式 *必须* 包含加圆括号的映射键,对应 ``'%'`` 字符之后字典中的每一项。 " +"映射键将从映射中选取要格式化的值。例如:" + +#: ../../library/stdtypes.rst:3155 ../../library/stdtypes.rst:4424 +msgid "" +"In this case no ``*`` specifiers may occur in a format (since they require a" +" sequential parameter list)." +msgstr "在此情况下格式中不能出现 ``*`` 标记符(因其需要一个序列类的参数列表)。" + +#: ../../library/stdtypes.rst:3158 ../../library/stdtypes.rst:4427 +msgid "The conversion flag characters are:" +msgstr "转换旗标为:" + +#: ../../library/stdtypes.rst:3167 ../../library/stdtypes.rst:4436 +msgid "Flag" +msgstr "旗标" + +#: ../../library/stdtypes.rst:3169 ../../library/stdtypes.rst:4438 +msgid "``'#'``" +msgstr "``'#'``" + +#: ../../library/stdtypes.rst:3169 ../../library/stdtypes.rst:4438 +msgid "" +"The value conversion will use the \"alternate form\" (where defined below)." +msgstr "值的转换将使用“替代形式”(具体定义见下文)。" + +#: ../../library/stdtypes.rst:3172 ../../library/stdtypes.rst:4441 +msgid "``'0'``" +msgstr "``'0'``" + +#: ../../library/stdtypes.rst:3172 ../../library/stdtypes.rst:4441 +msgid "The conversion will be zero padded for numeric values." +msgstr "转换将为数字值填充零字符。" + +#: ../../library/stdtypes.rst:3174 ../../library/stdtypes.rst:4443 +msgid "``'-'``" +msgstr "``'-'``" + +#: ../../library/stdtypes.rst:3174 ../../library/stdtypes.rst:4443 +msgid "" +"The converted value is left adjusted (overrides the ``'0'`` conversion if " +"both are given)." +msgstr "转换值将靠左对齐(如果同时给出 ``'0'`` 转换,则会覆盖后者)。" + +#: ../../library/stdtypes.rst:3177 ../../library/stdtypes.rst:4446 +msgid "``' '``" +msgstr "``' '``" + +#: ../../library/stdtypes.rst:3177 ../../library/stdtypes.rst:4446 +msgid "" +"(a space) A blank should be left before a positive number (or empty string) " +"produced by a signed conversion." +msgstr "(空格) 符号位转换产生的正数(或空字符串)前将留出一个空格。" + +#: ../../library/stdtypes.rst:3180 ../../library/stdtypes.rst:4449 +msgid "``'+'``" +msgstr "``'+'``" + +#: ../../library/stdtypes.rst:3180 ../../library/stdtypes.rst:4449 +msgid "" +"A sign character (``'+'`` or ``'-'``) will precede the conversion (overrides" +" a \"space\" flag)." +msgstr "符号字符 (``'+'`` 或 ``'-'``) 将显示于转换结果的开头(会覆盖 \"空格\" 旗标)。" + +#: ../../library/stdtypes.rst:3184 ../../library/stdtypes.rst:4453 +msgid "" +"A length modifier (``h``, ``l``, or ``L``) may be present, but is ignored as" +" it is not necessary for Python -- so e.g. ``%ld`` is identical to ``%d``." +msgstr "" +"可以给出长度修饰符 (``h``, ``l`` 或 ``L``),但会被忽略,因为对 Python 来说没有必要 -- 所以 ``%ld`` 等价于 " +"``%d``。" + +#: ../../library/stdtypes.rst:3187 ../../library/stdtypes.rst:4456 +msgid "The conversion types are:" +msgstr "转换类型为:" + +#: ../../library/stdtypes.rst:3190 ../../library/stdtypes.rst:4459 +msgid "Conversion" +msgstr "转换符" + +#: ../../library/stdtypes.rst:3192 ../../library/stdtypes.rst:4461 +msgid "``'d'``" +msgstr "``'d'``" + +#: ../../library/stdtypes.rst:3192 ../../library/stdtypes.rst:3194 +#: ../../library/stdtypes.rst:4461 ../../library/stdtypes.rst:4463 +msgid "Signed integer decimal." +msgstr "有符号十进制整数。" + +#: ../../library/stdtypes.rst:3194 ../../library/stdtypes.rst:4463 +msgid "``'i'``" +msgstr "``'i'``" + +#: ../../library/stdtypes.rst:3196 ../../library/stdtypes.rst:4465 +msgid "``'o'``" +msgstr "``'o'``" + +#: ../../library/stdtypes.rst:3196 ../../library/stdtypes.rst:4465 +msgid "Signed octal value." +msgstr "有符号八进制数。" + +#: ../../library/stdtypes.rst:3198 ../../library/stdtypes.rst:4467 +msgid "``'u'``" +msgstr "``'u'``" + +#: ../../library/stdtypes.rst:3198 ../../library/stdtypes.rst:4467 +msgid "Obsolete type -- it is identical to ``'d'``." +msgstr "过时类型 -- 等价于 ``'d'``。" + +#: ../../library/stdtypes.rst:3200 ../../library/stdtypes.rst:4469 +msgid "``'x'``" +msgstr "``'x'``" + +#: ../../library/stdtypes.rst:3200 ../../library/stdtypes.rst:4469 +msgid "Signed hexadecimal (lowercase)." +msgstr "有符号十六进制数(小写)。" + +#: ../../library/stdtypes.rst:3202 ../../library/stdtypes.rst:4471 +msgid "``'X'``" +msgstr "``'X'``" + +#: ../../library/stdtypes.rst:3202 ../../library/stdtypes.rst:4471 +msgid "Signed hexadecimal (uppercase)." +msgstr "有符号十六进制数(大写)。" + +#: ../../library/stdtypes.rst:3204 ../../library/stdtypes.rst:4473 +msgid "``'e'``" +msgstr "``'e'``" + +#: ../../library/stdtypes.rst:3204 ../../library/stdtypes.rst:4473 +msgid "Floating-point exponential format (lowercase)." +msgstr "浮点指数格式(小写)。" + +#: ../../library/stdtypes.rst:3206 ../../library/stdtypes.rst:4475 +msgid "``'E'``" +msgstr "``'E'``" + +#: ../../library/stdtypes.rst:3206 ../../library/stdtypes.rst:4475 +msgid "Floating-point exponential format (uppercase)." +msgstr "浮点指数格式(大写)。" + +#: ../../library/stdtypes.rst:3208 ../../library/stdtypes.rst:4477 +msgid "``'f'``" +msgstr "``'f'``" + +#: ../../library/stdtypes.rst:3208 ../../library/stdtypes.rst:3210 +#: ../../library/stdtypes.rst:4477 ../../library/stdtypes.rst:4479 +msgid "Floating-point decimal format." +msgstr "浮点十进制格式。" + +#: ../../library/stdtypes.rst:3210 ../../library/stdtypes.rst:4479 +msgid "``'F'``" +msgstr "``'F'``" + +#: ../../library/stdtypes.rst:3212 ../../library/stdtypes.rst:4481 +msgid "``'g'``" +msgstr "``'g'``" + +#: ../../library/stdtypes.rst:3212 ../../library/stdtypes.rst:4481 +msgid "" +"Floating-point format. Uses lowercase exponential format if exponent is less" +" than -4 or not less than precision, decimal format otherwise." +msgstr "浮点格式。如果指数小于 -4 或不小于精度则使用小写指数格式,否则使用十进制格式。" + +#: ../../library/stdtypes.rst:3216 ../../library/stdtypes.rst:4485 +msgid "``'G'``" +msgstr "``'G'``" + +#: ../../library/stdtypes.rst:3216 ../../library/stdtypes.rst:4485 +msgid "" +"Floating-point format. Uses uppercase exponential format if exponent is less" +" than -4 or not less than precision, decimal format otherwise." +msgstr "浮点格式。如果指数小于 -4 或不小于精度则使用大写指数格式,否则使用十进制格式。" + +#: ../../library/stdtypes.rst:3220 ../../library/stdtypes.rst:4489 +msgid "``'c'``" +msgstr "``'c'``" + +#: ../../library/stdtypes.rst:3220 +msgid "Single character (accepts integer or single character string)." +msgstr "单个字符(接受整数或单个字符的字符串)。" + +#: ../../library/stdtypes.rst:3223 ../../library/stdtypes.rst:4502 +msgid "``'r'``" +msgstr "``'r'``" + +#: ../../library/stdtypes.rst:3223 +msgid "String (converts any Python object using :func:`repr`)." +msgstr "字符串(使用 :func:`repr` 转换任何 Python 对象)。" + +#: ../../library/stdtypes.rst:3226 ../../library/stdtypes.rst:4496 +msgid "``'s'``" +msgstr "``'s'``" + +#: ../../library/stdtypes.rst:3226 +msgid "String (converts any Python object using :func:`str`)." +msgstr "字符串(使用 :func:`str` 转换任何 Python 对象)。" + +#: ../../library/stdtypes.rst:3229 ../../library/stdtypes.rst:4499 +msgid "``'a'``" +msgstr "``'a'``" + +#: ../../library/stdtypes.rst:3229 +msgid "String (converts any Python object using :func:`ascii`)." +msgstr "字符串(使用 :func:`ascii` 转换任何 Python 对象)。" + +#: ../../library/stdtypes.rst:3232 ../../library/stdtypes.rst:4505 +msgid "``'%'``" +msgstr "``'%'``" + +#: ../../library/stdtypes.rst:3232 ../../library/stdtypes.rst:4505 +msgid "" +"No argument is converted, results in a ``'%'`` character in the result." +msgstr "不转换参数,在结果中输出一个 ``'%'`` 字符。" + +#: ../../library/stdtypes.rst:3236 +msgid "" +"For floating-point formats, the result should be correctly rounded to a " +"given precision ``p`` of digits after the decimal point. The rounding mode " +"matches that of the :func:`round` builtin." +msgstr "" + +#: ../../library/stdtypes.rst:3243 ../../library/stdtypes.rst:4512 +msgid "" +"The alternate form causes a leading octal specifier (``'0o'``) to be " +"inserted before the first digit." +msgstr "此替代形式会在第一个数码之前插入标示八进制数的前缀 (``'0o'``)。" + +#: ../../library/stdtypes.rst:3247 ../../library/stdtypes.rst:4516 +msgid "" +"The alternate form causes a leading ``'0x'`` or ``'0X'`` (depending on " +"whether the ``'x'`` or ``'X'`` format was used) to be inserted before the " +"first digit." +msgstr "" +"此替代形式会在第一个数码之前插入 ``'0x'`` 或 ``'0X'`` 前缀(取决于是使用 ``'x'`` 还是 ``'X'`` 格式)。" + +#: ../../library/stdtypes.rst:3251 ../../library/stdtypes.rst:4520 +msgid "" +"The alternate form causes the result to always contain a decimal point, even" +" if no digits follow it." +msgstr "此替代形式总是会在结果中包含一个小数点,即使其后并没有数码。" + +#: ../../library/stdtypes.rst:3254 ../../library/stdtypes.rst:4523 +msgid "" +"The precision determines the number of digits after the decimal point and " +"defaults to 6." +msgstr "小数点后的数码位数由精度决定,默认为 6。" + +#: ../../library/stdtypes.rst:3258 ../../library/stdtypes.rst:4527 +msgid "" +"The alternate form causes the result to always contain a decimal point, and " +"trailing zeroes are not removed as they would otherwise be." +msgstr "此替代形式总是会在结果中包含一个小数点,末尾各位的零不会如其他情况下那样被移除。" + +#: ../../library/stdtypes.rst:3261 ../../library/stdtypes.rst:4530 +msgid "" +"The precision determines the number of significant digits before and after " +"the decimal point and defaults to 6." +msgstr "小数点前后的有效数码位数由精度决定,默认为 6。" + +#: ../../library/stdtypes.rst:3265 ../../library/stdtypes.rst:4534 +msgid "If precision is ``N``, the output is truncated to ``N`` characters." +msgstr "如果精度为 ``N``,输出将截短为 ``N`` 个字符。" + +#: ../../library/stdtypes.rst:3268 ../../library/stdtypes.rst:4543 +msgid "See :pep:`237`." +msgstr "参见 :pep:`237`。" + +#: ../../library/stdtypes.rst:3270 +msgid "" +"Since Python strings have an explicit length, ``%s`` conversions do not " +"assume that ``'\\0'`` is the end of the string." +msgstr "由于 Python 字符串显式指明长度,``%s`` 转换不会将 ``'\\0'`` 视为字符串的结束。" + +#: ../../library/stdtypes.rst:3275 +msgid "" +"``%f`` conversions for numbers whose absolute value is over 1e50 are no " +"longer replaced by ``%g`` conversions." +msgstr "绝对值超过 1e50 的 ``%f`` 转换不会再被替换为 ``%g`` 转换。" + +#: ../../library/stdtypes.rst:3286 +msgid "" +"Binary Sequence Types --- :class:`bytes`, :class:`bytearray`, " +":class:`memoryview`" +msgstr "二进制序列类型 --- :class:`bytes`, :class:`bytearray`, :class:`memoryview`" + +#: ../../library/stdtypes.rst:3294 +msgid "" +"The core built-in types for manipulating binary data are :class:`bytes` and " +":class:`bytearray`. They are supported by :class:`memoryview` which uses the" +" :ref:`buffer protocol ` to access the memory of other binary" +" objects without needing to make a copy." +msgstr "" +"操作二进制数据的核心内置类型是 :class:`bytes` 和 :class:`bytearray`。它们由 :class:`memoryview` " +"提供支持,该对象使用 :ref:`缓冲区协议 ` 来访问其他二进制对象所在内存,不需要创建对象的副本。" + +#: ../../library/stdtypes.rst:3299 +msgid "" +"The :mod:`array` module supports efficient storage of basic data types like " +"32-bit integers and IEEE754 double-precision floating values." +msgstr ":mod:`array` 模块支持高效地存储基本数据类型,例如 32 位整数和 IEEE754 双精度浮点值。" + +#: ../../library/stdtypes.rst:3305 +msgid "Bytes Objects" +msgstr "bytes 对象" + +#: ../../library/stdtypes.rst:3309 +msgid "" +"Bytes objects are immutable sequences of single bytes. Since many major " +"binary protocols are based on the ASCII text encoding, bytes objects offer " +"several methods that are only valid when working with ASCII compatible data " +"and are closely related to string objects in a variety of other ways." +msgstr "" +"bytes 对象是由单个字节构成的不可变序列。由于许多主要二进制协议都基于 ASCII 文本编码,因此 bytes 对象提供了一些仅在处理 ASCII " +"兼容数据时可用,并且在许多特性上与字符串对象紧密相关的方法。" + +#: ../../library/stdtypes.rst:3317 +msgid "" +"Firstly, the syntax for bytes literals is largely the same as that for " +"string literals, except that a ``b`` prefix is added:" +msgstr "首先,表示 bytes 字面值的语法与字符串字面值的大致相同,只是添加了一个 ``b`` 前缀:" + +#: ../../library/stdtypes.rst:3320 +msgid "Single quotes: ``b'still allows embedded \"double\" quotes'``" +msgstr "单引号: ``b'同样允许嵌入 \"双\" 引号'``。" + +#: ../../library/stdtypes.rst:3321 +msgid "Double quotes: ``b\"still allows embedded 'single' quotes\"``" +msgstr "双引号: ``b\"仍然允许嵌入 '单' 引号\"``" + +#: ../../library/stdtypes.rst:3322 +msgid "Triple quoted: ``b'''3 single quotes'''``, ``b\"\"\"3 double quotes\"\"\"``" +msgstr "三重引号: ``b'''三重单引号'''``, ``b\"\"\"三重双引号\"\"\"``" + +#: ../../library/stdtypes.rst:3324 +msgid "" +"Only ASCII characters are permitted in bytes literals (regardless of the " +"declared source code encoding). Any binary values over 127 must be entered " +"into bytes literals using the appropriate escape sequence." +msgstr "" +"bytes 字面值中只允许 ASCII 字符(无论源代码声明的编码格式为何)。任何超出 127 的二进制值必须使用相应的转义序列形式加入 bytes " +"字面值。" + +#: ../../library/stdtypes.rst:3328 +msgid "" +"As with string literals, bytes literals may also use a ``r`` prefix to " +"disable processing of escape sequences. See :ref:`strings` for more about " +"the various forms of bytes literal, including supported escape sequences." +msgstr "" +"像字符串字面值一样,bytes 字面值也可以使用 ``r`` 前缀来禁用转义序列处理。请参阅 :ref:`strings` 了解有关各种 bytes " +"字面值形式的详情,包括所支持的转义序列。" + +#: ../../library/stdtypes.rst:3332 +msgid "" +"While bytes literals and representations are based on ASCII text, bytes " +"objects actually behave like immutable sequences of integers, with each " +"value in the sequence restricted such that ``0 <= x < 256`` (attempts to " +"violate this restriction will trigger :exc:`ValueError`). This is done " +"deliberately to emphasise that while many binary formats include ASCII based" +" elements and can be usefully manipulated with some text-oriented " +"algorithms, this is not generally the case for arbitrary binary data " +"(blindly applying text processing algorithms to binary data formats that are" +" not ASCII compatible will usually lead to data corruption)." +msgstr "" +"虽然 bytes 字面值和表示法是基于 ASCII 文本的,但 bytes 对象的行为实际上更像是不可变的整数序列,序列中的每个值的大小被限制为 ``0" +" <= x < 256`` (如果违反此限制将引发 :exc:`ValueError`)。 " +"这种限制是有意设计用以强调以下事实,虽然许多二进制格式都包含基于 ASCII " +"的元素,可以通过某些面向文本的算法进行有用的操作,但情况对于任意二进制数据来说通常却并非如此(盲目地将文本处理算法应用于不兼容 ASCII " +"的二进制数据格式往往将导致数据损坏)。" + +#: ../../library/stdtypes.rst:3342 +msgid "" +"In addition to the literal forms, bytes objects can be created in a number " +"of other ways:" +msgstr "除了字面值形式,bytes 对象还可以通过其他几种方式来创建:" + +#: ../../library/stdtypes.rst:3345 +msgid "A zero-filled bytes object of a specified length: ``bytes(10)``" +msgstr "指定长度的以零值填充的 bytes 对象: ``bytes(10)``" + +#: ../../library/stdtypes.rst:3346 +msgid "From an iterable of integers: ``bytes(range(20))``" +msgstr "通过由整数组成的可迭代对象: ``bytes(range(20))``" + +#: ../../library/stdtypes.rst:3347 +msgid "Copying existing binary data via the buffer protocol: ``bytes(obj)``" +msgstr "通过缓冲区协议复制现有的二进制数据: ``bytes(obj)``" + +#: ../../library/stdtypes.rst:3349 +msgid "Also see the :ref:`bytes ` built-in." +msgstr "另请参阅 :ref:`bytes ` 内置类型。" + +#: ../../library/stdtypes.rst:3351 +msgid "" +"Since 2 hexadecimal digits correspond precisely to a single byte, " +"hexadecimal numbers are a commonly used format for describing binary data. " +"Accordingly, the bytes type has an additional class method to read data in " +"that format:" +msgstr "" +"由于两个十六进制数码精确对应一个字节,因此十六进制数是描述二进制数据的常用格式。相应地,bytes 类型具有从此种格式读取数据的附加类方法:" + +#: ../../library/stdtypes.rst:3357 +msgid "" +"This :class:`bytes` class method returns a bytes object, decoding the given " +"string object. The string must contain two hexadecimal digits per byte, " +"with ASCII whitespace being ignored." +msgstr "" +"此 :class:`bytes` 类方法返回一个解码给定字符串的 bytes 对象。字符串必须由表示每个字节的两个十六进制数码构成,其中的 ASCII " +"空白符会被忽略。" + +#: ../../library/stdtypes.rst:3364 +msgid "" +":meth:`bytes.fromhex` now skips all ASCII whitespace in the string, not just" +" spaces." +msgstr ":meth:`bytes.fromhex` 现在会忽略所有 ASCII 空白符而不只是空格符。" + +#: ../../library/stdtypes.rst:3368 +msgid "" +":meth:`bytes.fromhex` now accepts ASCII :class:`bytes` and :term:`bytes-like" +" objects ` as input." +msgstr "" +":meth:`bytes.fromhex` 现在接受 ASCII :class:`bytes` 和 :term:`字节型对象 ` 作为输入。" + +#: ../../library/stdtypes.rst:3372 +msgid "" +"A reverse conversion function exists to transform a bytes object into its " +"hexadecimal representation." +msgstr "存在一个反向转换函数,可以将 bytes 对象转换为对应的十六进制表示。" + +#: ../../library/stdtypes.rst:3378 ../../library/stdtypes.rst:3469 +msgid "" +"Return a string object containing two hexadecimal digits for each byte in " +"the instance." +msgstr "返回一个字符串对象,该对象包含实例中每个字节的两个十六进制数字。" + +#: ../../library/stdtypes.rst:3384 +msgid "" +"If you want to make the hex string easier to read, you can specify a single " +"character separator *sep* parameter to include in the output. By default, " +"this separator will be included between each byte. A second optional " +"*bytes_per_sep* parameter controls the spacing. Positive values calculate " +"the separator position from the right, negative values from the left." +msgstr "" +"如果你希望令十六进制数字符串更易读,你可以指定单个字符分隔符作为 *sep* 形参包含于输出中。默认情况下,该分隔符会放在每个字节之间。第二个可选的 " +"*bytes_per_sep* 形参控制间距。正值会从右开始计算分隔符的位置,负值则是从左开始。" + +#: ../../library/stdtypes.rst:3401 +msgid "" +":meth:`bytes.hex` now supports optional *sep* and *bytes_per_sep* parameters" +" to insert separators between bytes in the hex output." +msgstr "" +":meth:`bytes.hex` 现在支持可选的 *sep* 和 *bytes_per_sep* 形参以在十六进制输出的字节之间插入分隔符。" + +#: ../../library/stdtypes.rst:3405 +msgid "" +"Since bytes objects are sequences of integers (akin to a tuple), for a bytes" +" object *b*, ``b[0]`` will be an integer, while ``b[0:1]`` will be a bytes " +"object of length 1. (This contrasts with text strings, where both indexing " +"and slicing will produce a string of length 1)" +msgstr "" +"由于 bytes 对象是由整数构成的序列(类似于元组),因此对于一个 bytes 对象 *b*,``b[0]`` 将为一个整数,而 ``b[0:1]``" +" 将为一个长度为 1 的 bytes 对象。 (这与文本字符串不同,索引和切片所产生的将都是一个长度为 1 的字符串)。" + +#: ../../library/stdtypes.rst:3410 +msgid "" +"The representation of bytes objects uses the literal format (``b'...'``) " +"since it is often more useful than e.g. ``bytes([46, 46, 46])``. You can " +"always convert a bytes object into a list of integers using ``list(b)``." +msgstr "" +"bytes 对象的表示使用字面值格式 (``b'...'``),因为它通常都要比像 ``bytes([46, 46, 46])`` 这样的格式更好用。 " +"你总是可以使用 ``list(b)`` 将 bytes 对象转换为一个由整数构成的列表。" + +#: ../../library/stdtypes.rst:3418 +msgid "Bytearray Objects" +msgstr "bytearray 对象" + +#: ../../library/stdtypes.rst:3422 +msgid "" +":class:`bytearray` objects are a mutable counterpart to :class:`bytes` " +"objects." +msgstr ":class:`bytearray` 对象是 :class:`bytes` 对象的可变对应物。" + +#: ../../library/stdtypes.rst:3428 +msgid "" +"There is no dedicated literal syntax for bytearray objects, instead they are" +" always created by calling the constructor:" +msgstr "bytearray 对象没有专属的字面值语法,它们总是通过调用构造器来创建:" + +#: ../../library/stdtypes.rst:3431 +msgid "Creating an empty instance: ``bytearray()``" +msgstr "创建一个空实例: ``bytearray()``" + +#: ../../library/stdtypes.rst:3432 +msgid "Creating a zero-filled instance with a given length: ``bytearray(10)``" +msgstr "创建一个指定长度的以零值填充的实例: ``bytearray(10)``" + +#: ../../library/stdtypes.rst:3433 +msgid "From an iterable of integers: ``bytearray(range(20))``" +msgstr "通过由整数组成的可迭代对象: ``bytearray(range(20))``" + +#: ../../library/stdtypes.rst:3434 +msgid "" +"Copying existing binary data via the buffer protocol: ``bytearray(b'Hi!')``" +msgstr "通过缓冲区协议复制现有的二进制数据: ``bytearray(b'Hi!')``" + +#: ../../library/stdtypes.rst:3436 +msgid "" +"As bytearray objects are mutable, they support the :ref:`mutable ` sequence operations in addition to the common bytes and bytearray " +"operations described in :ref:`bytes-methods`." +msgstr "" +"由于 bytearray 对象是可变的,该对象除了 :ref:`bytes-methods` 中所描述的 bytes 和 bytearray " +"共有操作之外,还支持 :ref:`可变 ` 序列操作。" + +#: ../../library/stdtypes.rst:3440 +msgid "Also see the :ref:`bytearray ` built-in." +msgstr "另请参见 :ref:`bytearray ` 内置类型。" + +#: ../../library/stdtypes.rst:3442 +msgid "" +"Since 2 hexadecimal digits correspond precisely to a single byte, " +"hexadecimal numbers are a commonly used format for describing binary data. " +"Accordingly, the bytearray type has an additional class method to read data " +"in that format:" +msgstr "" +"由于两个十六进制数码精确对应一个字节,因此十六进制数是描述二进制数据的常用格式。相应地,bytearray 类型具有从此种格式读取数据的附加类方法:" + +#: ../../library/stdtypes.rst:3448 +msgid "" +"This :class:`bytearray` class method returns bytearray object, decoding the " +"given string object. The string must contain two hexadecimal digits per " +"byte, with ASCII whitespace being ignored." +msgstr "" +":class:`bytearray` 类方法返回一个解码给定字符串的 bytearray 对象。字符串必须由表示每个字节的两个十六进制数码构成,其中的 " +"ASCII 空白符会被忽略。" + +#: ../../library/stdtypes.rst:3455 +msgid "" +":meth:`bytearray.fromhex` now skips all ASCII whitespace in the string, not " +"just spaces." +msgstr ":meth:`bytearray.fromhex` 现在会忽略所有 ASCII 空白符而不只是空格符。" + +#: ../../library/stdtypes.rst:3459 +msgid "" +":meth:`bytearray.fromhex` now accepts ASCII :class:`bytes` and :term:`bytes-" +"like objects ` as input." +msgstr "" +":meth:`bytearray.fromhex` 现在接受 ASCII :class:`bytes` 和 :term:`字节型对象 ` 作为输入。" + +#: ../../library/stdtypes.rst:3463 +msgid "" +"A reverse conversion function exists to transform a bytearray object into " +"its hexadecimal representation." +msgstr "存在一个反向转换函数,可以将 bytearray 对象转换为对应的十六进制表示。" + +#: ../../library/stdtypes.rst:3477 +msgid "" +"Similar to :meth:`bytes.hex`, :meth:`bytearray.hex` now supports optional " +"*sep* and *bytes_per_sep* parameters to insert separators between bytes in " +"the hex output." +msgstr "" +"与 :meth:`bytes.hex` 相似, :meth:`bytearray.hex` 现在支持可选的 *sep* 和 " +"*bytes_per_sep* 参数以在十六进制输出的字节之间插入分隔符。" + +#: ../../library/stdtypes.rst:3484 +msgid "" +"Resize the :class:`bytearray` to contain *size* bytes. *size* must be " +"greater than or equal to 0." +msgstr "调整 :class:`bytearray` 的大小以包含 *size* 字节。*size* 必须大于等于 0。" + +#: ../../library/stdtypes.rst:3487 +msgid "" +"If the :class:`bytearray` needs to shrink, bytes beyond *size* are " +"truncated." +msgstr "如果 :class:`bytearray` 需要缩小,超过 *size* 的字节将被截断。" + +#: ../../library/stdtypes.rst:3489 +msgid "" +"If the :class:`bytearray` needs to grow, all new bytes, those beyond *size*," +" will be set to null bytes." +msgstr "如果 :class:`bytearray` 需要增长,那些超过 *size* 的所有新字节,将被设置为空字节。" + +#: ../../library/stdtypes.rst:3493 +msgid "This is equivalent to:" +msgstr "这相当于:" + +#: ../../library/stdtypes.rst:3501 +msgid "Examples:" +msgstr "示例:" + +#: ../../library/stdtypes.rst:3514 +msgid "" +"Since bytearray objects are sequences of integers (akin to a list), for a " +"bytearray object *b*, ``b[0]`` will be an integer, while ``b[0:1]`` will be " +"a bytearray object of length 1. (This contrasts with text strings, where " +"both indexing and slicing will produce a string of length 1)" +msgstr "" +"由于 bytearray 对象是由整数构成的序列(类似于列表),因此对于一个 bytearray 对象 *b*,``b[0]`` 将为一个整数,而 " +"``b[0:1]`` 将为一个长度为 1 的 bytearray 对象。 (这与文本字符串不同,索引和切片所产生的将都是一个长度为 1 的字符串)。" + +#: ../../library/stdtypes.rst:3519 +msgid "" +"The representation of bytearray objects uses the bytes literal format " +"(``bytearray(b'...')``) since it is often more useful than e.g. " +"``bytearray([46, 46, 46])``. You can always convert a bytearray object into" +" a list of integers using ``list(b)``." +msgstr "" +"bytearray 对象的表示使用 bytes 对象字面值格式 (``bytearray(b'...')``),因为它通常都要比 " +"``bytearray([46, 46, 46])`` 这样的格式更好用。你总是可以使用 ``list(b)`` 将 bytearray " +"对象转换为一个由整数构成的列表。" + +#: ../../library/stdtypes.rst:3526 +msgid "" +"For detailed information on thread-safety guarantees for :class:`bytearray` " +"objects, see :ref:`thread-safety-bytearray`." +msgstr "" + +#: ../../library/stdtypes.rst:3533 +msgid "Bytes and Bytearray Operations" +msgstr "bytes 和 bytearray 操作" + +#: ../../library/stdtypes.rst:3538 +msgid "" +"Both bytes and bytearray objects support the :ref:`common `" +" sequence operations. They interoperate not just with operands of the same " +"type, but with any :term:`bytes-like object`. Due to this flexibility, they " +"can be freely mixed in operations without causing errors. However, the " +"return type of the result may depend on the order of operands." +msgstr "" +"bytes 和 bytearray 对象都支持 :ref:`通用 ` 序列操作。 " +"它们不仅能与相同类型的操作数,也能与任何 :term:`bytes-like object` 进行互操作。 " +"由于这样的灵活性,它们可以在操作中自由地混合而不会导致错误。但是,操作结果的返回值类型可能取决于操作数的顺序。" + +#: ../../library/stdtypes.rst:3546 +msgid "" +"The methods on bytes and bytearray objects don't accept strings as their " +"arguments, just as the methods on strings don't accept bytes as their " +"arguments. For example, you have to write::" +msgstr "" +"bytes 和 bytearray 对象的方法不接受字符串作为其参数,就像字符串的方法不接受 bytes 对象作为其参数一样。 " +"例如,你必须使用以下写法::" + +#: ../../library/stdtypes.rst:3550 +msgid "" +"a = \"abc\"\n" +"b = a.replace(\"a\", \"f\")" +msgstr "" +"a = \"abc\"\n" +"b = a.replace(\"a\", \"f\")" + +#: ../../library/stdtypes.rst:3553 +msgid "and::" +msgstr "和::" + +#: ../../library/stdtypes.rst:3555 +msgid "" +"a = b\"abc\"\n" +"b = a.replace(b\"a\", b\"f\")" +msgstr "" +"a = b\"abc\"\n" +"b = a.replace(b\"a\", b\"f\")" + +#: ../../library/stdtypes.rst:3558 +msgid "" +"Some bytes and bytearray operations assume the use of ASCII compatible " +"binary formats, and hence should be avoided when working with arbitrary " +"binary data. These restrictions are covered below." +msgstr "" +"某些 bytes 和 bytearray 操作假定使用兼容 ASCII 的二进制格式,因此在处理任意二进数数据时应当避免使用。这些限制会在下文中说明。" + +#: ../../library/stdtypes.rst:3563 +msgid "" +"Using these ASCII based operations to manipulate binary data that is not " +"stored in an ASCII based format may lead to data corruption." +msgstr "使用这些基于 ASCII 的操作来处理未以基于 ASCII 的格式存储的二进制数据可能会导致数据损坏。" + +#: ../../library/stdtypes.rst:3566 +msgid "" +"The following methods on bytes and bytearray objects can be used with " +"arbitrary binary data." +msgstr "bytes 和 bytearray 对象的下列方法可以用于任意二进制数据。" + +#: ../../library/stdtypes.rst:3572 +msgid "" +"Return the number of non-overlapping occurrences of subsequence *sub* in the" +" range [*start*, *end*]. Optional arguments *start* and *end* are " +"interpreted as in slice notation." +msgstr "" +"返回子序列 *sub* 在 [*start*, *end*] 范围内非重叠出现的次数。可选参数 *start* 与 *end* 会被解读为切片表示法。" + +#: ../../library/stdtypes.rst:3576 ../../library/stdtypes.rst:3681 +#: ../../library/stdtypes.rst:3703 ../../library/stdtypes.rst:3769 +#: ../../library/stdtypes.rst:3782 +msgid "" +"The subsequence to search for may be any :term:`bytes-like object` or an " +"integer in the range 0 to 255." +msgstr "要搜索的子序列可以是任意 :term:`bytes-like object` 或是 0 至 255 范围内的整数。" + +#: ../../library/stdtypes.rst:3579 +msgid "" +"If *sub* is empty, returns the number of empty slices between characters " +"which is the length of the bytes object plus one." +msgstr "如果 *sub* 为空,则返回字符之间的空切片的数量即字节串对象的长度加一。" + +#: ../../library/stdtypes.rst:3582 ../../library/stdtypes.rst:3693 +#: ../../library/stdtypes.rst:3706 ../../library/stdtypes.rst:3772 +#: ../../library/stdtypes.rst:3785 +msgid "Also accept an integer in the range 0 to 255 as the subsequence." +msgstr "也接受 0 至 255 范围内的整数作为子序列。" + +#: ../../library/stdtypes.rst:3589 +msgid "" +"If the binary data starts with the *prefix* string, return " +"``bytes[len(prefix):]``. Otherwise, return a copy of the original binary " +"data::" +msgstr "如果二进制数据以 *prefix* 字符串开头,返回 ``bytes[len(prefix):]``。否则,返回原始二进制数据的副本:" + +#: ../../library/stdtypes.rst:3593 +msgid "" +">>> b'TestHook'.removeprefix(b'Test')\n" +"b'Hook'\n" +">>> b'BaseTestCase'.removeprefix(b'Test')\n" +"b'BaseTestCase'" +msgstr "" +">>> b'TestHook'.removeprefix(b'Test')\n" +"b'Hook'\n" +">>> b'BaseTestCase'.removeprefix(b'Test')\n" +"b'BaseTestCase'" + +#: ../../library/stdtypes.rst:3598 +msgid "The *prefix* may be any :term:`bytes-like object`." +msgstr "*prefix* 可以是任意 :term:`bytes-like object`。" + +#: ../../library/stdtypes.rst:3602 ../../library/stdtypes.rst:3624 +#: ../../library/stdtypes.rst:3757 ../../library/stdtypes.rst:3850 +#: ../../library/stdtypes.rst:3864 ../../library/stdtypes.rst:3894 +#: ../../library/stdtypes.rst:3908 ../../library/stdtypes.rst:3949 +#: ../../library/stdtypes.rst:4019 ../../library/stdtypes.rst:4037 +#: ../../library/stdtypes.rst:4065 ../../library/stdtypes.rst:4204 +#: ../../library/stdtypes.rst:4259 ../../library/stdtypes.rst:4302 +#: ../../library/stdtypes.rst:4323 ../../library/stdtypes.rst:4345 +#: ../../library/stdtypes.rst:4547 +msgid "" +"The bytearray version of this method does *not* operate in place - it always" +" produces a new object, even if no changes were made." +msgstr "此方法的 bytearray 版本 *并非* 原地操作 —— 它总是产生一个新对象,即便没有做任何改变。" + +#: ../../library/stdtypes.rst:3611 +msgid "" +"If the binary data ends with the *suffix* string and that *suffix* is not " +"empty, return ``bytes[:-len(suffix)]``. Otherwise, return a copy of the " +"original binary data::" +msgstr "" +"如果二进制数据以 *suffix* 字符串结尾,并且 *suffix* 非空,返回 ``bytes[:-len(suffix)]``。 " +"否则,返回原始二进制数据的副本::" + +#: ../../library/stdtypes.rst:3615 +msgid "" +">>> b'MiscTests'.removesuffix(b'Tests')\n" +"b'Misc'\n" +">>> b'TmpDirMixin'.removesuffix(b'Tests')\n" +"b'TmpDirMixin'" +msgstr "" +">>> b'MiscTests'.removesuffix(b'Tests')\n" +"b'Misc'\n" +">>> b'TmpDirMixin'.removesuffix(b'Tests')\n" +"b'TmpDirMixin'" + +#: ../../library/stdtypes.rst:3620 +msgid "The *suffix* may be any :term:`bytes-like object`." +msgstr "*suffix* 可以是任意 :term:`bytes-like object`。" + +#: ../../library/stdtypes.rst:3633 +msgid "Return the bytes decoded to a :class:`str`." +msgstr "返回解码为 :class:`str` 的字节串。" + +#: ../../library/stdtypes.rst:3638 +msgid "" +"*errors* controls how decoding errors are handled. If ``'strict'`` (the " +"default), a :exc:`UnicodeError` exception is raised. Other possible values " +"are ``'ignore'``, ``'replace'``, and any other name registered via " +":func:`codecs.register_error`. See :ref:`error-handlers` for details." +msgstr "" +"*errors* 控制如何处理编码错误。如为 ``'strict'`` (默认值),则会引发 :exc:`UnicodeError`。其他可能的值有 " +"``'ignore'``, ``'replace'`` 以及通过 :func:`codecs.register_error` 注册的任何其他名称。 " +"请参阅 :ref:`error-handlers` 了解详情。" + +#: ../../library/stdtypes.rst:3644 +msgid "" +"For performance reasons, the value of *errors* is not checked for validity " +"unless a decoding error actually occurs, :ref:`devmode` is enabled or a " +":ref:`debug build ` is used." +msgstr "" +"出于性能原因,除非真正发生了编码错误,启用了 :ref:`devmode` 或使用了 :ref:`调试编译版 ` 否则不会检查" +" *errors* 值的有效性。" + +#: ../../library/stdtypes.rst:3650 +msgid "" +"Passing the *encoding* argument to :class:`str` allows decoding any " +":term:`bytes-like object` directly, without needing to make a temporary " +":class:`!bytes` or :class:`!bytearray` object." +msgstr "" +"将 *encoding* 参数传给 :class:`str` 允许直接解码任何 :term:`bytes-like object`,无须创建临时的 " +":class:`!bytes` 或 :class:`!bytearray` 对象。" + +#: ../../library/stdtypes.rst:3665 +msgid "" +"Return ``True`` if the binary data ends with the specified *suffix*, " +"otherwise return ``False``. *suffix* can also be a tuple of suffixes to " +"look for. With optional *start*, test beginning at that position. With " +"optional *end*, stop comparing at that position." +msgstr "" +"如果二进制数据以指定的 *suffix* 结束则返回 ``True``,否则返回 ``False``。 *suffix* " +"也可以为由多个供查找的后缀构成的元组。如果有可选项 *start*,将从所指定位置开始检查。如果有可选项 *end*,将在所指定位置停止比较。" + +#: ../../library/stdtypes.rst:3670 +msgid "The suffix(es) to search for may be any :term:`bytes-like object`." +msgstr "要搜索的后缀可以是任意 :term:`bytes-like object`。" + +#: ../../library/stdtypes.rst:3676 +msgid "" +"Return the lowest index in the data where the subsequence *sub* is found, " +"such that *sub* is contained in the slice ``s[start:end]``. Optional " +"arguments *start* and *end* are interpreted as in slice notation. Return " +"``-1`` if *sub* is not found." +msgstr "" +"返回子序列 *sub* 在数据中被找到的最小索引,*sub* 包含于切片 ``s[start:end]`` 之内。可选参数 *start* 与 " +"*end* 会被解读为切片表示法。如果 *sub* 未被找到则返回 ``-1``。" + +#: ../../library/stdtypes.rst:3686 +msgid "" +"The :meth:`~bytes.find` method should be used only if you need to know the " +"position of *sub*. To check if *sub* is a substring or not, use the " +":keyword:`in` operator::" +msgstr "" +":meth:`~bytes.find` 方法应该只在你需要知道 *sub* 所在位置时使用。要检查 *sub* 是否为子串,请使用 " +":keyword:`in` 操作符::" + +#: ../../library/stdtypes.rst:3690 +msgid "" +">>> b'Py' in b'Python'\n" +"True" +msgstr "" +">>> b'Py' in b'Python'\n" +"True" + +#: ../../library/stdtypes.rst:3700 +msgid "" +"Like :meth:`~bytes.find`, but raise :exc:`ValueError` when the subsequence " +"is not found." +msgstr "类似于 :meth:`~bytes.find`,但在找不到子序列时会引发 :exc:`ValueError`。" + +#: ../../library/stdtypes.rst:3713 +msgid "" +"Return a bytes or bytearray object which is the concatenation of the binary " +"data sequences in *iterable*. A :exc:`TypeError` will be raised if there " +"are any values in *iterable* that are not :term:`bytes-like objects `, including :class:`str` objects. The separator between " +"elements is the contents of the bytes or bytearray object providing this " +"method." +msgstr "" +"返回一个由 *iterable* 中的二进制数据序列拼接而成的 bytes 或 bytearray 对象。如果 *iterable* 中存在任何非 " +":term:`字节类对象 ` 包括存在 :class:`str` 对象值则会引发 " +":exc:`TypeError`。提供该方法的 bytes 或 bytearray 对象的内容将作为元素之间的分隔。" + +#: ../../library/stdtypes.rst:3724 +msgid "" +"This static method returns a translation table usable for " +":meth:`bytes.translate` that will map each character in *from* into the " +"character at the same position in *to*; *from* and *to* must both be " +":term:`bytes-like objects ` and have the same length." +msgstr "" +"此静态方法返回一个可用于 :meth:`bytes.translate` 的转换对照表,它将把 *from* 中的每个字符映射为 *to* " +"中相同位置上的字符;*from* 与 *to* 必须都是 :term:`字节类对象 ` 并且具有相同的长度。" + +#: ../../library/stdtypes.rst:3735 +msgid "" +"Split the sequence at the first occurrence of *sep*, and return a 3-tuple " +"containing the part before the separator, the separator itself or its " +"bytearray copy, and the part after the separator. If the separator is not " +"found, return a 3-tuple containing a copy of the original sequence, followed" +" by two empty bytes or bytearray objects." +msgstr "" +"在 *sep* 首次出现的位置拆分序列,返回一个 3 元组,其中包含分隔符之前的部分、分隔符本身或其 bytearray 副本,以及分隔符之后的部分。 " +"如果分隔符未找到,则返回的 3 元组中包含原序列以及两个空的 bytes 或 bytearray 对象。" + +#: ../../library/stdtypes.rst:3742 ../../library/stdtypes.rst:3799 +msgid "The separator to search for may be any :term:`bytes-like object`." +msgstr "要搜索的分隔符可以是任意 :term:`bytes-like object`。" + +#: ../../library/stdtypes.rst:3748 +msgid "" +"Return a copy of the sequence with all occurrences of subsequence *old* " +"replaced by *new*. If the optional argument *count* is given, only the " +"first *count* occurrences are replaced." +msgstr "" +"返回序列的副本,其中出现的所有子序列 *old* 都将被替换为 *new*。如果给出了可选参数 *count*,则只替换前 *count* 次出现。" + +#: ../../library/stdtypes.rst:3752 +msgid "" +"The subsequence to search for and its replacement may be any :term:`bytes-" +"like object`." +msgstr "要搜索的子序列及其替换序列可以是任意 :term:`bytes-like object`。" + +#: ../../library/stdtypes.rst:3764 +msgid "" +"Return the highest index in the sequence where the subsequence *sub* is " +"found, such that *sub* is contained within ``s[start:end]``. Optional " +"arguments *start* and *end* are interpreted as in slice notation. Return " +"``-1`` on failure." +msgstr "" +"返回子序列 *sub* 在序列内被找到的最大(最右)索引,这样 *sub* 将包含在 ``s[start:end]`` 当中。可选参数 *start* " +"与 *end* 会被解读为切片表示法。如果未找到则返回 ``-1``。" + +#: ../../library/stdtypes.rst:3779 +msgid "" +"Like :meth:`~bytes.rfind` but raises :exc:`ValueError` when the subsequence " +"*sub* is not found." +msgstr "类似于 :meth:`~bytes.rfind`,但在子序列 *sub* 未找到时会引发 :exc:`ValueError`。" + +#: ../../library/stdtypes.rst:3792 +msgid "" +"Split the sequence at the last occurrence of *sep*, and return a 3-tuple " +"containing the part before the separator, the separator itself or its " +"bytearray copy, and the part after the separator. If the separator is not " +"found, return a 3-tuple containing two empty bytes or bytearray objects, " +"followed by a copy of the original sequence." +msgstr "" +"在 *sep* 最后一次出现的位置拆分序列,返回一个 3 元组,其中包含分隔符之前的部分,分隔符本身或其 bytearray " +"副本,以及分隔符之后的部分。如果分隔符未找到,则返回的 3 元组中包含两个空的 bytes 或 bytearray 对象以及原序列的副本。" + +#: ../../library/stdtypes.rst:3805 +msgid "" +"Return ``True`` if the binary data starts with the specified *prefix*, " +"otherwise return ``False``. *prefix* can also be a tuple of prefixes to " +"look for. With optional *start*, test beginning at that position. With " +"optional *end*, stop comparing at that position." +msgstr "" +"如果二进制数据以指定的 *prefix* 开头则返回 ``True``,否则返回 ``False``。 *prefix* " +"也可以为由多个供查找的前缀构成的元组。如果有可选项 *start*,将从所指定位置开始检查。如果有可选项 *end*,将在所指定位置停止比较。" + +#: ../../library/stdtypes.rst:3810 +msgid "The prefix(es) to search for may be any :term:`bytes-like object`." +msgstr "要搜索的前缀可以是任意 :term:`bytes-like object`。" + +#: ../../library/stdtypes.rst:3816 +msgid "" +"Return a copy of the bytes or bytearray object where all bytes occurring in " +"the optional argument *delete* are removed, and the remaining bytes have " +"been mapped through the given translation table, which must be a bytes " +"object of length 256." +msgstr "" +"返回原 bytes 或 bytearray 对象的副本,移除其中所有在可选参数 *delete* 中出现的 bytes,其余 bytes " +"将通过给定的转换表进行映射,该转换表必须是长度为 256 的 bytes 对象。" + +#: ../../library/stdtypes.rst:3821 +msgid "" +"You can use the :func:`bytes.maketrans` method to create a translation " +"table." +msgstr "你可以使用 :func:`bytes.maketrans` 方法来创建转换表。" + +#: ../../library/stdtypes.rst:3824 +msgid "" +"Set the *table* argument to ``None`` for translations that only delete " +"characters::" +msgstr "对于仅需移除字符的转换,请将 *table* 参数设为 ``None``::" + +#: ../../library/stdtypes.rst:3827 +msgid "" +">>> b'read this short text'.translate(None, b'aeiou')\n" +"b'rd ths shrt txt'" +msgstr "" +">>> b'read this short text'.translate(None, b'aeiou')\n" +"b'rd ths shrt txt'" + +#: ../../library/stdtypes.rst:3830 +msgid "*delete* is now supported as a keyword argument." +msgstr "现在支持将 *delete* 作为关键字参数。" + +#: ../../library/stdtypes.rst:3834 +msgid "" +"The following methods on bytes and bytearray objects have default behaviours" +" that assume the use of ASCII compatible binary formats, but can still be " +"used with arbitrary binary data by passing appropriate arguments. Note that " +"all of the bytearray methods in this section do *not* operate in place, and " +"instead produce new objects." +msgstr "" +"以下 bytes 和 bytearray 对象的方法的默认行为会假定使用兼容 ASCII 的二进制格式,但通过传入适当的参数仍然可用于任意二进制数据。 " +"请注意本小节中所有的 bytearray 方法都 *不是* 原地执行操作,而是会产生新的对象。" + +#: ../../library/stdtypes.rst:3843 +msgid "" +"Return a copy of the object centered in a sequence of length *width*. " +"Padding is done using the specified *fillbyte* (default is an ASCII space). " +"For :class:`bytes` objects, the original sequence is returned if *width* is " +"less than or equal to ``len(s)``." +msgstr "" +"返回原对象的副本,在长度为 *width* 的序列内居中,使用指定的 *fillbyte* 填充两边的空位(默认使用 ASCII 空格符)。对于 " +":class:`bytes` 对象,如果 *width* 小于等于 ``len(s)`` 则返回原序列的副本。" + +#: ../../library/stdtypes.rst:3857 +msgid "" +"Return a copy of the object left justified in a sequence of length *width*. " +"Padding is done using the specified *fillbyte* (default is an ASCII space). " +"For :class:`bytes` objects, the original sequence is returned if *width* is " +"less than or equal to ``len(s)``." +msgstr "" +"返回原对象的副本,在长度为 *width* 的序列中靠左对齐。使用指定的 *fillbyte* 填充空位(默认使用 ASCII 空格符)。对于 " +":class:`bytes` 对象,如果 *width* 小于等于 ``len(s)`` 则返回原序列的副本。" + +#: ../../library/stdtypes.rst:3871 +msgid "" +"Return a copy of the sequence with specified leading bytes removed. The " +"*bytes* argument is a binary sequence specifying the set of byte values to " +"be removed. If omitted or ``None``, the *bytes* argument defaults to " +"removing ASCII whitespace. The *bytes* argument is not a prefix; rather, " +"all combinations of its values are stripped::" +msgstr "" +"返回移除指定起始字节后的序列副本。*bytes* 参数是一个二进制序列,用于指定要移除的字节值集合。如果省略或设为 ``None``,则 *bytes*" +" 参数默认移除 ASCII 空白符。需注意,*bytes* 参数并非前缀匹配;实际上,它会移除所有匹配该参数值组合的字节::" + +#: ../../library/stdtypes.rst:3877 +msgid "" +">>> b' spacious '.lstrip()\n" +"b'spacious '\n" +">>> b'www.example.com'.lstrip(b'cmowz.')\n" +"b'example.com'" +msgstr "" +">>> b' spacious '.lstrip()\n" +"b'spacious '\n" +">>> b'www.example.com'.lstrip(b'cmowz.')\n" +"b'example.com'" + +#: ../../library/stdtypes.rst:3882 +msgid "" +"The binary sequence of byte values to remove may be any :term:`bytes-like " +"object`. See :meth:`~bytes.removeprefix` for a method that will remove a " +"single prefix string rather than all of a set of characters. For example::" +msgstr "" +"要移除的二进制序列可以是任意 :term:`bytes-like object`。要删除单个前缀字符串,而不是全部给定集合中的字符,请参见 " +":meth:`str.removeprefix` 方法。例如:" + +#: ../../library/stdtypes.rst:3887 +msgid "" +">>> b'Arthur: three!'.lstrip(b'Arthur: ')\n" +"b'ee!'\n" +">>> b'Arthur: three!'.removeprefix(b'Arthur: ')\n" +"b'three!'" +msgstr "" +">>> b'Arthur: three!'.lstrip(b'Arthur: ')\n" +"b'ee!'\n" +">>> b'Arthur: three!'.removeprefix(b'Arthur: ')\n" +"b'three!'" + +#: ../../library/stdtypes.rst:3901 +msgid "" +"Return a copy of the object right justified in a sequence of length *width*." +" Padding is done using the specified *fillbyte* (default is an ASCII space)." +" For :class:`bytes` objects, the original sequence is returned if *width* is" +" less than or equal to ``len(s)``." +msgstr "" +"返回原对象的副本,在长度为 *width* 的序列中靠右对齐。使用指定的 *fillbyte* 填充空位(默认使用 ASCII 空格符)。对于 " +":class:`bytes` 对象,如果 *width* 小于等于 ``len(s)`` 则返回原序列的副本。" + +#: ../../library/stdtypes.rst:3915 +msgid "" +"Split the binary sequence into subsequences of the same type, using *sep* as" +" the delimiter string. If *maxsplit* is given, at most *maxsplit* splits are" +" done, the *rightmost* ones. If *sep* is not specified or ``None``, any " +"subsequence consisting solely of ASCII whitespace is a separator. Except for" +" splitting from the right, :meth:`rsplit` behaves like :meth:`split` which " +"is described in detail below." +msgstr "" +"将二进制序列拆分为相同类型的子序列,使用 *sep* 作为分隔符。如果给出了 *maxsplit*,则最多进行 *maxsplit* 次拆分,从 " +"*最右边* 开始。如果 *sep* 未指定或为 ``None``,任何只包含 ASCII 空白符的子序列都会被作为分隔符。 " +"除了从右边开始拆分,:meth:`rsplit` 的其他行为都类似于下文所述的 :meth:`split`。" + +#: ../../library/stdtypes.rst:3926 +msgid "" +"Return a copy of the sequence with specified trailing bytes removed. The " +"*bytes* argument is a binary sequence specifying the set of byte values to " +"be removed. If omitted or ``None``, the *bytes* argument defaults to " +"removing ASCII whitespace. The *bytes* argument is not a suffix; rather, " +"all combinations of its values are stripped::" +msgstr "" +"返回移除指定尾部字节后的序列副本。*bytes* 参数是一个二进制序列,用于指定要移除的字节值集合。如果省略或设为 ``None``,则 *bytes*" +" 参数默认移除 ASCII 空白符。需注意,*bytes* 参数并非后缀匹配;实际上,它会移除所有匹配该参数值组合的字节::" + +#: ../../library/stdtypes.rst:3932 +msgid "" +">>> b' spacious '.rstrip()\n" +"b' spacious'\n" +">>> b'mississippi'.rstrip(b'ipz')\n" +"b'mississ'" +msgstr "" +">>> b' spacious '.rstrip()\n" +"b' spacious'\n" +">>> b'mississippi'.rstrip(b'ipz')\n" +"b'mississ'" + +#: ../../library/stdtypes.rst:3937 +msgid "" +"The binary sequence of byte values to remove may be any :term:`bytes-like " +"object`. See :meth:`~bytes.removesuffix` for a method that will remove a " +"single suffix string rather than all of a set of characters. For example::" +msgstr "" +"要移除的二进制序列可以是任意 :term:`bytes-like object`。要删除单个后缀字符串,而不是全部给定集合中的字符,请参见 " +":meth:`str.removesuffix` 方法。例如:" + +#: ../../library/stdtypes.rst:3942 +msgid "" +">>> b'Monty Python'.rstrip(b' Python')\n" +"b'M'\n" +">>> b'Monty Python'.removesuffix(b' Python')\n" +"b'Monty'" +msgstr "" +">>> b'Monty Python'.rstrip(b' Python')\n" +"b'M'\n" +">>> b'Monty Python'.removesuffix(b' Python')\n" +"b'Monty'" + +#: ../../library/stdtypes.rst:3956 +msgid "" +"Split the binary sequence into subsequences of the same type, using *sep* as" +" the delimiter string. If *maxsplit* is given and non-negative, at most " +"*maxsplit* splits are done (thus, the list will have at most ``maxsplit+1`` " +"elements). If *maxsplit* is not specified or is ``-1``, then there is no " +"limit on the number of splits (all possible splits are made)." +msgstr "" +"将二进制序列拆分为相同类型的子序列,使用 *sep* 作为分隔符。如果给出了 *maxsplit* 且非负值,则最多进行 *maxsplit* " +"次拆分(因此,列表最多会有 ``maxsplit+1`` 个元素)。如果 *maxsplit* 未指定或为 " +"``-1``,则不限制拆分次数(进行所有可能的拆分)。" + +#: ../../library/stdtypes.rst:3962 +msgid "" +"If *sep* is given, consecutive delimiters are not grouped together and are " +"deemed to delimit empty subsequences (for example, ``b'1,,2'.split(b',')`` " +"returns ``[b'1', b'', b'2']``). The *sep* argument may consist of a " +"multibyte sequence as a single delimiter. Splitting an empty sequence with a" +" specified separator returns ``[b'']`` or ``[bytearray(b'')]`` depending on " +"the type of object being split. The *sep* argument may be any :term:`bytes-" +"like object`." +msgstr "" +"如果给出了 *sep*,则连续的分隔符不会被组合在一起而是会被视为分隔空子序列 (例如 ``b'1,,2'.split(b',')`` 将将返回 " +"``[b'1', b'', b'2']``)。 *sep* 参数可能是由多个序列组成的单个分隔符。使用指定的分隔符拆分一个空序列将返回 " +"``[b'']`` 或 ``[bytearray(b'')]``,具体取决于被拆分对象的类型。 *sep* 参数可以是任何 :term:`bytes-" +"like object`." + +#: ../../library/stdtypes.rst:3972 +msgid "" +">>> b'1,2,3'.split(b',')\n" +"[b'1', b'2', b'3']\n" +">>> b'1,2,3'.split(b',', maxsplit=1)\n" +"[b'1', b'2,3']\n" +">>> b'1,2,,3,'.split(b',')\n" +"[b'1', b'2', b'', b'3', b'']\n" +">>> b'1<>2<>3<4'.split(b'<>')\n" +"[b'1', b'2', b'3<4']" +msgstr "" +">>> b'1,2,3'.split(b',')\n" +"[b'1', b'2', b'3']\n" +">>> b'1,2,3'.split(b',', maxsplit=1)\n" +"[b'1', b'2,3']\n" +">>> b'1,2,,3,'.split(b',')\n" +"[b'1', b'2', b'', b'3', b'']\n" +">>> b'1<>2<>3<4'.split(b'<>')\n" +"[b'1', b'2', b'3<4']" + +#: ../../library/stdtypes.rst:3981 +msgid "" +"If *sep* is not specified or is ``None``, a different splitting algorithm is" +" applied: runs of consecutive ASCII whitespace are regarded as a single " +"separator, and the result will contain no empty strings at the start or end " +"if the sequence has leading or trailing whitespace. Consequently, splitting" +" an empty sequence or a sequence consisting solely of ASCII whitespace " +"without a specified separator returns ``[]``." +msgstr "" +"如果 *sep* 未指定或为 ``None``,则会应用另一种拆分算法:连续的 ASCII " +"空白符会被视为单个分隔符,其结果将不包含序列开头或末尾的空白符。因此,在不指定分隔符的情况下对空序列或仅包含 ASCII 空白符的序列进行拆分将返回 " +"``[]``。" + +#: ../../library/stdtypes.rst:3991 +msgid "" +">>> b'1 2 3'.split()\n" +"[b'1', b'2', b'3']\n" +">>> b'1 2 3'.split(maxsplit=1)\n" +"[b'1', b'2 3']\n" +">>> b' 1 2 3 '.split()\n" +"[b'1', b'2', b'3']" +msgstr "" +">>> b'1 2 3'.split()\n" +"[b'1', b'2', b'3']\n" +">>> b'1 2 3'.split(maxsplit=1)\n" +"[b'1', b'2 3']\n" +">>> b' 1 2 3 '.split()\n" +"[b'1', b'2', b'3']" + +#: ../../library/stdtypes.rst:4002 +msgid "" +"Return a copy of the sequence with specified leading and trailing bytes " +"removed. The *bytes* argument is a binary sequence specifying the set of " +"byte values to be removed. If omitted or ``None``, the *bytes* argument " +"defaults to removing ASCII whitespace. The *bytes* argument is not a prefix " +"or suffix; rather, all combinations of its values are stripped::" +msgstr "" +"返回移除指定首尾字节后的序列副本。*bytes* 参数是一个二进制序列,用于指定要移除的字节值集合。如果省略或设为 ``None``,则 *bytes*" +" 参数默认移除 ASCII 空白符。需注意,*bytes* 参数既非前缀也非后缀匹配;实际上,它会移除所有匹配该参数值组合的首尾字节::" + +#: ../../library/stdtypes.rst:4009 +msgid "" +">>> b' spacious '.strip()\n" +"b'spacious'\n" +">>> b'www.example.com'.strip(b'cmowz.')\n" +"b'example'" +msgstr "" +">>> b' spacious '.strip()\n" +"b'spacious'\n" +">>> b'www.example.com'.strip(b'cmowz.')\n" +"b'example'" + +#: ../../library/stdtypes.rst:4014 +msgid "" +"The binary sequence of byte values to remove may be any :term:`bytes-like " +"object`." +msgstr "要移除的字节值二进制序列可以是任意 :term:`bytes-like object`。" + +#: ../../library/stdtypes.rst:4023 +msgid "" +"The following methods on bytes and bytearray objects assume the use of ASCII" +" compatible binary formats and should not be applied to arbitrary binary " +"data. Note that all of the bytearray methods in this section do *not* " +"operate in place, and instead produce new objects." +msgstr "" +"以下 bytes 和 bytearray 对象的方法会假定使用兼容 ASCII 的二进制格式,不应当被应用于任意二进制数据。请注意本小节中所有的 " +"bytearray 方法都 *不是* 原地执行操作,而是会产生新的对象。" + +#: ../../library/stdtypes.rst:4031 +msgid "" +"Return a copy of the sequence with each byte interpreted as an ASCII " +"character, and the first byte capitalized and the rest lowercased. Non-ASCII" +" byte values are passed through unchanged." +msgstr "" +"返回原序列的副本,其中每个字节将都将被解读为一个 ASCII 字符,并且第一个字节的字符大写而其余的小写。非 ASCII 字节值将保持原样不变。" + +#: ../../library/stdtypes.rst:4044 +msgid "" +"Return a copy of the sequence where all ASCII tab characters are replaced by" +" one or more ASCII spaces, depending on the current column and the given tab" +" size. Tab positions occur every *tabsize* bytes (default is 8, giving tab " +"positions at columns 0, 8, 16 and so on). To expand the sequence, the " +"current column is set to zero and the sequence is examined byte by byte. If" +" the byte is an ASCII tab character (``b'\\t'``), one or more space " +"characters are inserted in the result until the current column is equal to " +"the next tab position. (The tab character itself is not copied.) If the " +"current byte is an ASCII newline (``b'\\n'``) or carriage return " +"(``b'\\r'``), it is copied and the current column is reset to zero. Any " +"other byte value is copied unchanged and the current column is incremented " +"by one regardless of how the byte value is represented when printed::" +msgstr "" +"返回序列的副本,其中所有的 ASCII 制表符会由一个或多个 ASCII 空格替换,具体取决于当前列位置和给定的制表符宽度。每 *tabsize* " +"个字节设为一个制表位(默认值 8 时设定的制表位在列 0, 8, 16 依次类推)。要展开序列,当前列位置将被设为零并逐一检查序列中的每个字节。 " +"如果字节为 ASCII 制表符 (``b'\\t'``),则并在结果中插入一个或多个空格符,直到当前列等于下一个制表位。 (制表符本身不会被复制。) " +"如果当前字节为 ASCII 换行符 (``b'\\n'``) 或回车符 (``b'\\r'``),它会被复制并将当前列重设为零。 " +"任何其他字节会被不加修改地复制并将当前列加一,不论该字节值在被打印时会如何显示::" + +#: ../../library/stdtypes.rst:4058 +msgid "" +">>> b'01\\t012\\t0123\\t01234'.expandtabs()\n" +"b'01 012 0123 01234'\n" +">>> b'01\\t012\\t0123\\t01234'.expandtabs(4)\n" +"b'01 012 0123 01234'" +msgstr "" +">>> b'01\\t012\\t0123\\t01234'.expandtabs()\n" +"b'01 012 0123 01234'\n" +">>> b'01\\t012\\t0123\\t01234'.expandtabs(4)\n" +"b'01 012 0123 01234'" + +#: ../../library/stdtypes.rst:4072 +msgid "" +"Return ``True`` if all bytes in the sequence are alphabetical ASCII " +"characters or ASCII decimal digits and the sequence is not empty, ``False`` " +"otherwise. Alphabetic ASCII characters are those byte values in the sequence" +" ``b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'``. ASCII decimal " +"digits are those byte values in the sequence ``b'0123456789'``." +msgstr "" +"如果序列中所有字节都是字母类 ASCII 字符或 ASCII 十进制数码并且序列非空则返回 ``True``,否则返回 ``False``。字母类 " +"ASCII 字符就是字节值包含在序列 " +"``b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'`` 中的字符。ASCII " +"十进制数码就是字节值包含在序列 ``b'0123456789'`` 中的字符。" + +#: ../../library/stdtypes.rst:4080 +msgid "" +">>> b'ABCabc1'.isalnum()\n" +"True\n" +">>> b'ABC abc1'.isalnum()\n" +"False" +msgstr "" +">>> b'ABCabc1'.isalnum()\n" +"True\n" +">>> b'ABC abc1'.isalnum()\n" +"False" + +#: ../../library/stdtypes.rst:4089 +msgid "" +"Return ``True`` if all bytes in the sequence are alphabetic ASCII characters" +" and the sequence is not empty, ``False`` otherwise. Alphabetic ASCII " +"characters are those byte values in the sequence " +"``b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'``." +msgstr "" +"如果序列中所有字节都是字母类 ASCII 字符并且序列非空则返回 ``True``,否则返回 ``False``。字母类 ASCII " +"字符就是字节值包含在序列 ``b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'`` " +"中的字符。" + +#: ../../library/stdtypes.rst:4096 +msgid "" +">>> b'ABCabc'.isalpha()\n" +"True\n" +">>> b'ABCabc1'.isalpha()\n" +"False" +msgstr "" +">>> b'ABCabc'.isalpha()\n" +"True\n" +">>> b'ABCabc1'.isalpha()\n" +"False" + +#: ../../library/stdtypes.rst:4105 +msgid "" +"Return ``True`` if the sequence is empty or all bytes in the sequence are " +"ASCII, ``False`` otherwise. ASCII bytes are in the range 0-0x7F." +msgstr "" +"如果序列为空或序列中所有字节都是 ASCII 字节则返回 ``True``,否则返回 ``False``。ASCII 字节的取值范围是 0-0x7F。" + +#: ../../library/stdtypes.rst:4115 +msgid "" +"Return ``True`` if all bytes in the sequence are ASCII decimal digits and " +"the sequence is not empty, ``False`` otherwise. ASCII decimal digits are " +"those byte values in the sequence ``b'0123456789'``." +msgstr "" +"如果序列中所有字节都是 ASCII 十进制数码并且序列非空则返回 ``True``,否则返回 ``False``。ASCII " +"十进制数码就是字节值包含在序列 ``b'0123456789'`` 中的字符。" + +#: ../../library/stdtypes.rst:4121 +msgid "" +">>> b'1234'.isdigit()\n" +"True\n" +">>> b'1.23'.isdigit()\n" +"False" +msgstr "" +">>> b'1234'.isdigit()\n" +"True\n" +">>> b'1.23'.isdigit()\n" +"False" + +#: ../../library/stdtypes.rst:4130 +msgid "" +"Return ``True`` if there is at least one lowercase ASCII character in the " +"sequence and no uppercase ASCII characters, ``False`` otherwise." +msgstr "如果序列中至少有一个小写的 ASCII 字符并且没有大写的 ASCII 字符则返回 ``True``,否则返回 ``False``。" + +#: ../../library/stdtypes.rst:4135 +msgid "" +">>> b'hello world'.islower()\n" +"True\n" +">>> b'Hello world'.islower()\n" +"False" +msgstr "" +">>> b'hello world'.islower()\n" +"True\n" +">>> b'Hello world'.islower()\n" +"False" + +#: ../../library/stdtypes.rst:4140 ../../library/stdtypes.rst:4182 +#: ../../library/stdtypes.rst:4198 ../../library/stdtypes.rst:4248 +#: ../../library/stdtypes.rst:4317 +msgid "" +"Lowercase ASCII characters are those byte values in the sequence " +"``b'abcdefghijklmnopqrstuvwxyz'``. Uppercase ASCII characters are those byte" +" values in the sequence ``b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'``." +msgstr "" +"小写 ASCII 字符就是字节值包含在序列 ``b'abcdefghijklmnopqrstuvwxyz'`` 中的字符。大写 ASCII " +"字符就是字节值包含在序列 ``b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`` 中的字符。" + +#: ../../library/stdtypes.rst:4148 +msgid "" +"Return ``True`` if all bytes in the sequence are ASCII whitespace and the " +"sequence is not empty, ``False`` otherwise. ASCII whitespace characters are" +" those byte values in the sequence ``b' \\t\\n\\r\\x0b\\f'`` (space, tab, " +"newline, carriage return, vertical tab, form feed)." +msgstr "" +"如果序列中所有字节都是 ASCII 空白符并且序列非空则返回 ``True``,否则返回 ``False``。ASCII 空白符就是字节值包含在序列 " +"``b' \\\\t\\\\n\\\\r\\\\x0b\\\\f'`` (空格,制表,换行,回车,垂直制表,进纸) 中的字符。" + +#: ../../library/stdtypes.rst:4157 +msgid "" +"Return ``True`` if the sequence is ASCII titlecase and the sequence is not " +"empty, ``False`` otherwise. See :meth:`bytes.title` for more details on the " +"definition of \"titlecase\"." +msgstr "" +"如果序列为 ASCII 标题大小写形式并且序列非空则返回 ``True``,否则返回 ``False``。请参阅 :meth:`bytes.title`" +" 了解有关“标题大小写”的详细定义。" + +#: ../../library/stdtypes.rst:4163 +msgid "" +">>> b'Hello World'.istitle()\n" +"True\n" +">>> b'Hello world'.istitle()\n" +"False" +msgstr "" +">>> b'Hello World'.istitle()\n" +"True\n" +">>> b'Hello world'.istitle()\n" +"False" + +#: ../../library/stdtypes.rst:4172 +msgid "" +"Return ``True`` if there is at least one uppercase alphabetic ASCII " +"character in the sequence and no lowercase ASCII characters, ``False`` " +"otherwise." +msgstr "如果序列中至少有一个大写字母 ASCII 字符并且没有小写 ASCII 字符则返回 ``True``,否则返回 ``False``。" + +#: ../../library/stdtypes.rst:4177 +msgid "" +">>> b'HELLO WORLD'.isupper()\n" +"True\n" +">>> b'Hello world'.isupper()\n" +"False" +msgstr "" +">>> b'HELLO WORLD'.isupper()\n" +"True\n" +">>> b'Hello world'.isupper()\n" +"False" + +#: ../../library/stdtypes.rst:4190 +msgid "" +"Return a copy of the sequence with all the uppercase ASCII characters " +"converted to their corresponding lowercase counterpart." +msgstr "返回原序列的副本,其所有大写 ASCII 字符均转换为对应的小写形式。" + +#: ../../library/stdtypes.rst:4195 +msgid "" +">>> b'Hello World'.lower()\n" +"b'hello world'" +msgstr "" +">>> b'Hello World'.lower()\n" +"b'hello world'" + +#: ../../library/stdtypes.rst:4215 +msgid "" +"Return a list of the lines in the binary sequence, breaking at ASCII line " +"boundaries. This method uses the :term:`universal newlines` approach to " +"splitting lines. Line breaks are not included in the resulting list unless " +"*keepends* is given and true." +msgstr "" +"返回由原二进制序列中各行组成的列表,在 ASCII 行边界符的位置拆分。此方法使用 :term:`universal newlines` 方式来分行。 " +"结果列表中不包含换行符,除非给出了 *keepends* 且为真值。" + +#: ../../library/stdtypes.rst:4222 +msgid "" +">>> b'ab c\\n\\nde fg\\rkl\\r\\n'.splitlines()\n" +"[b'ab c', b'', b'de fg', b'kl']\n" +">>> b'ab c\\n\\nde fg\\rkl\\r\\n'.splitlines(keepends=True)\n" +"[b'ab c\\n', b'\\n', b'de fg\\r', b'kl\\r\\n']" +msgstr "" +">>> b'ab c\\n\\nde fg\\rkl\\r\\n'.splitlines()\n" +"[b'ab c', b'', b'de fg', b'kl']\n" +">>> b'ab c\\n\\nde fg\\rkl\\r\\n'.splitlines(keepends=True)\n" +"[b'ab c\\n', b'\\n', b'de fg\\r', b'kl\\r\\n']" + +#: ../../library/stdtypes.rst:4227 +msgid "" +"Unlike :meth:`~bytes.split` when a delimiter string *sep* is given, this " +"method returns an empty list for the empty string, and a terminal line break" +" does not result in an extra line::" +msgstr "" +"不同于 :meth:`~bytes.split`,当给出了分隔符 *sep* " +"时,对于空字符串此方法将返回一个空列表,而末尾的换行不会令结果中增加额外的行::" + +#: ../../library/stdtypes.rst:4231 +msgid "" +">>> b\"\".split(b'\\n'), b\"Two lines\\n\".split(b'\\n')\n" +"([b''], [b'Two lines', b''])\n" +">>> b\"\".splitlines(), b\"One line\\n\".splitlines()\n" +"([], [b'One line'])" +msgstr "" +">>> b\"\".split(b'\\n'), b\"Two lines\\n\".split(b'\\n')\n" +"([b''], [b'Two lines', b''])\n" +">>> b\"\".splitlines(), b\"One line\\n\".splitlines()\n" +"([], [b'One line'])" + +#: ../../library/stdtypes.rst:4240 +msgid "" +"Return a copy of the sequence with all the lowercase ASCII characters " +"converted to their corresponding uppercase counterpart and vice-versa." +msgstr "返回原序列的副本,其所有小写 ASCII 字符均转换为对应的大写形式,反之亦反。" + +#: ../../library/stdtypes.rst:4245 +msgid "" +">>> b'Hello World'.swapcase()\n" +"b'hELLO wORLD'" +msgstr "" +">>> b'Hello World'.swapcase()\n" +"b'hELLO wORLD'" + +#: ../../library/stdtypes.rst:4252 +msgid "" +"Unlike :func:`str.swapcase`, it is always the case that " +"``bin.swapcase().swapcase() == bin`` for the binary versions. Case " +"conversions are symmetrical in ASCII, even though that is not generally true" +" for arbitrary Unicode code points." +msgstr "" +"不同于 :func:`str.swapcase`,在二进制版本下 ``bin.swapcase().swapcase() == bin`` 始终成立。 " +"大小写转换在 ASCII 中是对称的,即使其对于任意 Unicode 码位来说并不总是成立。" + +#: ../../library/stdtypes.rst:4266 +msgid "" +"Return a titlecased version of the binary sequence where words start with an" +" uppercase ASCII character and the remaining characters are lowercase. " +"Uncased byte values are left unmodified." +msgstr "返回原二进制序列的标题版本,其中每个单词以一个大写 ASCII 字符为开头,其余字母为小写。不区别大小写的字节值将保持原样不变。" + +#: ../../library/stdtypes.rst:4272 +msgid "" +">>> b'Hello world'.title()\n" +"b'Hello World'" +msgstr "" +">>> b'Hello world'.title()\n" +"b'Hello World'" + +#: ../../library/stdtypes.rst:4275 +msgid "" +"Lowercase ASCII characters are those byte values in the sequence " +"``b'abcdefghijklmnopqrstuvwxyz'``. Uppercase ASCII characters are those byte" +" values in the sequence ``b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'``. All other byte " +"values are uncased." +msgstr "" +"小写 ASCII 字符就是字节值包含在序列 ``b'abcdefghijklmnopqrstuvwxyz'`` 中的字符。大写 ASCII " +"字符就是字节值包含在序列 ``b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`` 中的字符。所有其他字节值都不区分大小写。" + +#: ../../library/stdtypes.rst:4285 +msgid "" +">>> b\"they're bill's friends from the UK\".title()\n" +"b\"They'Re Bill'S Friends From The Uk\"" +msgstr "" +">>> b\"they're bill's friends from the UK\".title()\n" +"b\"They'Re Bill'S Friends From The Uk\"" + +#: ../../library/stdtypes.rst:4288 +msgid "" +"A workaround for apostrophes can be constructed using regular expressions::" +msgstr "可以使用正则表达式来构建针对撇号的特别处理::" + +#: ../../library/stdtypes.rst:4290 +msgid "" +">>> import re\n" +">>> def titlecase(s):\n" +"... return re.sub(rb\"[A-Za-z]+('[A-Za-z]+)?\",\n" +"... lambda mo: mo.group(0)[0:1].upper() +\n" +"... mo.group(0)[1:].lower(),\n" +"... s)\n" +"...\n" +">>> titlecase(b\"they're bill's friends.\")\n" +"b\"They're Bill's Friends.\"" +msgstr "" +">>> import re\n" +">>> def titlecase(s):\n" +"... return re.sub(rb\"[A-Za-z]+('[A-Za-z]+)?\",\n" +"... lambda mo: mo.group(0)[0:1].upper() +\n" +"... mo.group(0)[1:].lower(),\n" +"... s)\n" +"...\n" +">>> titlecase(b\"they're bill's friends.\")\n" +"b\"They're Bill's Friends.\"" + +#: ../../library/stdtypes.rst:4309 +msgid "" +"Return a copy of the sequence with all the lowercase ASCII characters " +"converted to their corresponding uppercase counterpart." +msgstr "返回原序列的副本,其所有小写 ASCII 字符均转换为对应的大写形式。" + +#: ../../library/stdtypes.rst:4314 +msgid "" +">>> b'Hello World'.upper()\n" +"b'HELLO WORLD'" +msgstr "" +">>> b'Hello World'.upper()\n" +"b'HELLO WORLD'" + +#: ../../library/stdtypes.rst:4330 +msgid "" +"Return a copy of the sequence left filled with ASCII ``b'0'`` digits to make" +" a sequence of length *width*. A leading sign prefix (``b'+'``/ ``b'-'``) is" +" handled by inserting the padding *after* the sign character rather than " +"before. For :class:`bytes` objects, the original sequence is returned if " +"*width* is less than or equal to ``len(seq)``." +msgstr "" +"返回原序列的副本,在左边填充 ``b'0'`` 数码使序列长度为 *width*。正负值前缀 (``b'+'``/ ``b'-'``) " +"的处理方式是在正负符号 *之后* 填充而非在之前。对于 :class:`bytes` 对象,如果 *width* 小于等于 ``len(seq)`` " +"则返回原序列。" + +#: ../../library/stdtypes.rst:4338 +msgid "" +">>> b\"42\".zfill(5)\n" +"b'00042'\n" +">>> b\"-42\".zfill(5)\n" +"b'-0042'" +msgstr "" +">>> b\"42\".zfill(5)\n" +"b'00042'\n" +">>> b\"-42\".zfill(5)\n" +"b'-0042'" + +#: ../../library/stdtypes.rst:4352 +msgid "``printf``-style Bytes Formatting" +msgstr "``printf`` 风格的字节串格式化" + +#: ../../library/stdtypes.rst:4369 +msgid "" +"The formatting operations described here exhibit a variety of quirks that " +"lead to a number of common errors (such as failing to display tuples and " +"dictionaries correctly). If the value being printed may be a tuple or " +"dictionary, wrap it in a tuple." +msgstr "" +"此处介绍的格式化操作具有多种怪异特性,可能导致许多常见错误(例如无法正确显示元组和字典)。如果要打印的值可能为元组或字典,请将其放入一个元组中。" + +#: ../../library/stdtypes.rst:4374 +msgid "" +"Bytes objects (``bytes``/``bytearray``) have one unique built-in operation: " +"the ``%`` operator (modulo). This is also known as the bytes *formatting* or" +" *interpolation* operator. Given ``format % values`` (where *format* is a " +"bytes object), ``%`` conversion specifications in *format* are replaced with" +" zero or more elements of *values*. The effect is similar to using the " +":c:func:`sprintf` in the C language." +msgstr "" +"字节串对象 (``bytes``/``bytearray``) 具有一种特殊的内置操作:使用 ``%`` (取模) 运算符。这也被称为字节串的 " +"*格式化* 或 *插值* 运算符。对于 ``format % values`` (其中 *format* 为一个字节串对象),在 *format* 中的" +" ``%`` 转换标记符将被替换为零个或多个 *values* 条目。其效果类似于在 C 语言中使用 :c:func:`sprintf`。" + +#: ../../library/stdtypes.rst:4381 +msgid "" +"If *format* requires a single argument, *values* may be a single non-tuple " +"object. [5]_ Otherwise, *values* must be a tuple with exactly the number of" +" items specified by the format bytes object, or a single mapping object (for" +" example, a dictionary)." +msgstr "" +"如果 *format* 要求一个单独参数,则 *values* 可以为一个非元组对象。 [5]_ 否则的话,*values* " +"必须或是一个包含项数与格式字节串对象中指定的转换符项数相同的元组,或者是一个单独的映射对象(例如字典)。" + +#: ../../library/stdtypes.rst:4415 +msgid "" +"When the right argument is a dictionary (or other mapping type), then the " +"formats in the bytes object *must* include a parenthesised mapping key into " +"that dictionary inserted immediately after the ``'%'`` character. The " +"mapping key selects the value to be formatted from the mapping. For " +"example:" +msgstr "" +"当右边的参数为一个字典(或其他映射类型)时,字节串对象中的格式 *必须* 包含加圆括号的映射键,对应 ``'%'`` 字符之后字典中的每一项。 " +"映射键将从映射中选取要格式化的值。例如:" + +#: ../../library/stdtypes.rst:4467 +msgid "\\(8)" +msgstr "\\(8)" + +#: ../../library/stdtypes.rst:4489 +msgid "Single byte (accepts integer or single byte objects)." +msgstr "单个字节(接受整数或单个字节对象)。" + +#: ../../library/stdtypes.rst:4492 +msgid "``'b'``" +msgstr "``'b'``" + +#: ../../library/stdtypes.rst:4492 +msgid "" +"Bytes (any object that follows the :ref:`buffer protocol ` or" +" has :meth:`~object.__bytes__`)." +msgstr "" +"字节串(任何遵循 :ref:`缓冲区协议 ` 或是具有 :meth:`~object.__bytes__` 的对象)。" + +#: ../../library/stdtypes.rst:4496 +msgid "" +"``'s'`` is an alias for ``'b'`` and should only be used for Python2/3 code " +"bases." +msgstr "``'s'`` 是 ``'b'`` 的一个别名,只应当在基于 Python2/3 的代码中使用。" + +#: ../../library/stdtypes.rst:4499 +msgid "" +"Bytes (converts any Python object using ``repr(obj).encode('ascii', " +"'backslashreplace')``)." +msgstr "" +"字节串(使用 ``repr(obj).encode('ascii', 'backslashreplace')`` 来转换任意 Python 对象)。" + +#: ../../library/stdtypes.rst:4502 +msgid "" +"``'r'`` is an alias for ``'a'`` and should only be used for Python2/3 code " +"bases." +msgstr "``'r'`` 是 ``'a'`` 的一个别名,只应当在基于 Python2/3 的代码中使用。" + +#: ../../library/stdtypes.rst:4502 +msgid "\\(7)" +msgstr "\\(7)" + +#: ../../library/stdtypes.rst:4537 +msgid "" +"``b'%s'`` is deprecated, but will not be removed during the 3.x series." +msgstr "``b'%s'`` 已弃用,但在 3.x 系列中将不会被移除。" + +#: ../../library/stdtypes.rst:4540 +msgid "" +"``b'%r'`` is deprecated, but will not be removed during the 3.x series." +msgstr "``b'%r'`` 已弃用,但在 3.x 系列中将不会被移除。" + +#: ../../library/stdtypes.rst:4552 +msgid ":pep:`461` - Adding % formatting to bytes and bytearray" +msgstr ":pep:`461` - 为 bytes 和 bytearray 添加 % 格式化" + +#: ../../library/stdtypes.rst:4559 +msgid "Memory Views" +msgstr "内存视图" + +#: ../../library/stdtypes.rst:4561 +msgid "" +":class:`memoryview` objects allow Python code to access the internal data of" +" an object that supports the :ref:`buffer protocol ` without " +"copying." +msgstr "" +":class:`memoryview` 对象允许 Python 代码访问一个对象的内部数据,只要该对象支持 :ref:`缓冲区协议 " +"` 而无需进行拷贝。" + +#: ../../library/stdtypes.rst:4567 +msgid "" +"Create a :class:`memoryview` that references *object*. *object* must " +"support the buffer protocol. Built-in objects that support the buffer " +"protocol include :class:`bytes` and :class:`bytearray`." +msgstr "" +"创建一个引用 *object* 的 :class:`memoryview`。 *object* 必须支持缓冲区协议。支持缓冲区协议的内置对象有 " +":class:`bytes` 和 :class:`bytearray`。" + +#: ../../library/stdtypes.rst:4571 +msgid "" +"A :class:`memoryview` has the notion of an *element*, which is the atomic " +"memory unit handled by the originating *object*. For many simple types such" +" as :class:`bytes` and :class:`bytearray`, an element is a single byte, but " +"other types such as :class:`array.array` may have bigger elements." +msgstr "" +":class:`memoryview` 有 **元素** 的概念, **元素** 指由原始 *object* 处理的原子内存单元。对于许多简单的类型,如" +" :class:`bytes` 和 :class:`bytearray`,一个元素是一个字节,但其他类型,如 :class:`array.array` " +"可能有更大的元素。" + +#: ../../library/stdtypes.rst:4576 +msgid "" +":class:`!memoryview`\\s are :ref:`generic ` over the type of their" +" underlying data." +msgstr "" + +#: ../../library/stdtypes.rst:4579 +msgid "" +"``len(view)`` is equal to the length of :class:`~memoryview.tolist`, which " +"is the nested list representation of the view. If ``view.ndim = 1``, this is" +" equal to the number of elements in the view." +msgstr "" +"``len(view)`` 等于 :class:`~memoryview.tolist` 的长度,即视图的嵌套列表表示形式。如果 ``view.ndim" +" = 1``,它将等于视图中元素的数量。" + +#: ../../library/stdtypes.rst:4583 +msgid "" +"If ``view.ndim == 0``, ``len(view)`` now raises :exc:`TypeError` instead of " +"returning 1." +msgstr "如果 ``view.ndim == 0``,现在 ``len(view)`` 将引发 :exc:`TypeError` 而不是返回 1." + +#: ../../library/stdtypes.rst:4586 +msgid "" +"The :class:`~memoryview.itemsize` attribute will give you the number of " +"bytes in a single element." +msgstr ":class:`~memoryview.itemsize` 属性将给出单个元素的字节数。" + +#: ../../library/stdtypes.rst:4589 +msgid "" +"A :class:`memoryview` supports slicing and indexing to expose its data. One-" +"dimensional slicing will result in a subview::" +msgstr ":class:`memoryview` 支持通过切片和索引访问其元素。一维切片的结果将是一个子视图::" + +#: ../../library/stdtypes.rst:4592 +msgid "" +">>> v = memoryview(b'abcefg')\n" +">>> v[1]\n" +"98\n" +">>> v[-1]\n" +"103\n" +">>> v[1:4]\n" +"\n" +">>> bytes(v[1:4])\n" +"b'bce'" +msgstr "" +">>> v = memoryview(b'abcefg')\n" +">>> v[1]\n" +"98\n" +">>> v[-1]\n" +"103\n" +">>> v[1:4]\n" +"\n" +">>> bytes(v[1:4])\n" +"b'bce'" + +#: ../../library/stdtypes.rst:4602 +msgid "" +"If :class:`~memoryview.format` is one of the native format specifiers from " +"the :mod:`struct` module, indexing with an integer or a tuple of integers is" +" also supported and returns a single *element* with the correct type. One-" +"dimensional memoryviews can be indexed with an integer or a one-integer " +"tuple. Multi-dimensional memoryviews can be indexed with tuples of exactly " +"*ndim* integers where *ndim* is the number of dimensions. Zero-dimensional " +"memoryviews can be indexed with the empty tuple." +msgstr "" +"如果 :class:`~memoryview.format` 是一个来自于 :mod:`struct` " +"模块的原生格式说明符,则也支持使用整数或由整数构成的元组进行索引,并返回具有正确类型的单个 *元素*。 " +"一维内存视图可以使用一个整数或由一个整数构成的元组进行索引。多维内存视图可以使用由恰好 *ndim* 个整数构成的元素进行索引,*ndim* " +"即其维度。零维内存视图可以使用空元组进行索引。" + +#: ../../library/stdtypes.rst:4611 +msgid "Here is an example with a non-byte format::" +msgstr "这里是一个使用非字节格式的例子::" + +#: ../../library/stdtypes.rst:4613 +msgid "" +">>> import array\n" +">>> a = array.array('l', [-11111111, 22222222, -33333333, 44444444])\n" +">>> m = memoryview(a)\n" +">>> m[0]\n" +"-11111111\n" +">>> m[-1]\n" +"44444444\n" +">>> m[::2].tolist()\n" +"[-11111111, -33333333]" +msgstr "" +">>> import array\n" +">>> a = array.array('l', [-11111111, 22222222, -33333333, 44444444])\n" +">>> m = memoryview(a)\n" +">>> m[0]\n" +"-11111111\n" +">>> m[-1]\n" +"44444444\n" +">>> m[::2].tolist()\n" +"[-11111111, -33333333]" + +#: ../../library/stdtypes.rst:4623 +msgid "" +"If the underlying object is writable, the memoryview supports one-" +"dimensional slice assignment. Resizing is not allowed::" +msgstr "如果下层对象是可写的,则内存视图支持一维切片赋值。改变大小则不被允许::" + +#: ../../library/stdtypes.rst:4626 +msgid "" +">>> data = bytearray(b'abcefg')\n" +">>> v = memoryview(data)\n" +">>> v.readonly\n" +"False\n" +">>> v[0] = ord(b'z')\n" +">>> data\n" +"bytearray(b'zbcefg')\n" +">>> v[1:4] = b'123'\n" +">>> data\n" +"bytearray(b'z123fg')\n" +">>> v[2:3] = b'spam'\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"ValueError: memoryview assignment: lvalue and rvalue have different structures\n" +">>> v[2:6] = b'spam'\n" +">>> data\n" +"bytearray(b'z1spam')" +msgstr "" +">>> data = bytearray(b'abcefg')\n" +">>> v = memoryview(data)\n" +">>> v.readonly\n" +"False\n" +">>> v[0] = ord(b'z')\n" +">>> data\n" +"bytearray(b'zbcefg')\n" +">>> v[1:4] = b'123'\n" +">>> data\n" +"bytearray(b'z123fg')\n" +">>> v[2:3] = b'spam'\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"ValueError: memoryview assignment: lvalue and rvalue have different structures\n" +">>> v[2:6] = b'spam'\n" +">>> data\n" +"bytearray(b'z1spam')" + +#: ../../library/stdtypes.rst:4644 +msgid "" +"One-dimensional memoryviews of :term:`hashable` (read-only) types with " +"formats 'B', 'b' or 'c' are also hashable. The hash is defined as ``hash(m) " +"== hash(m.tobytes())``::" +msgstr "" +"格式符为 'B', 'b' 或 'c' 的 :term:`hashable` (只读) 类型的一维内存视图也是可哈希对象。哈希被定义为 " +"``hash(m) == hash(m.tobytes())``::" + +#: ../../library/stdtypes.rst:4648 +msgid "" +">>> v = memoryview(b'abcefg')\n" +">>> hash(v) == hash(b'abcefg')\n" +"True\n" +">>> hash(v[2:4]) == hash(b'ce')\n" +"True\n" +">>> hash(v[::-2]) == hash(b'abcefg'[::-2])\n" +"True" +msgstr "" +">>> v = memoryview(b'abcefg')\n" +">>> hash(v) == hash(b'abcefg')\n" +"True\n" +">>> hash(v[2:4]) == hash(b'ce')\n" +"True\n" +">>> hash(v[::-2]) == hash(b'abcefg'[::-2])\n" +"True" + +#: ../../library/stdtypes.rst:4656 +msgid "" +"One-dimensional memoryviews can now be sliced. One-dimensional memoryviews " +"with formats 'B', 'b' or 'c' are now :term:`hashable`." +msgstr "一维内存视图现在可以被切片。格式符为 'B', 'b' 或 'c' 的一维内存视图现在是 :term:`hashable`。" + +#: ../../library/stdtypes.rst:4660 +msgid "" +"memoryview is now registered automatically with " +":class:`collections.abc.Sequence`" +msgstr "内存视图现在会自动注册为 :class:`collections.abc.Sequence`" + +#: ../../library/stdtypes.rst:4664 +msgid "memoryviews can now be indexed with tuple of integers." +msgstr "内存视图现在可使用整数元组进行索引。" + +#: ../../library/stdtypes.rst:4667 +msgid "memoryview is now a :term:`generic type`." +msgstr "memoryview 现在是一个 :term:`generic type`。" + +#: ../../library/stdtypes.rst:4670 +msgid ":class:`memoryview` has several methods:" +msgstr ":class:`memoryview` 具有以下一些方法:" + +#: ../../library/stdtypes.rst:4674 +msgid "" +"A memoryview and a :pep:`3118` exporter are equal if their shapes are " +"equivalent and if all corresponding values are equal when the operands' " +"respective format codes are interpreted using :mod:`struct` syntax." +msgstr "" +"memoryview 与 :pep:`3118` 中的导出器这两者如果形状相同,并且如果当使用 :mod:`struct` " +"语法解读操作数的相应格式代码时所有对应值都相同,则它们就是等价的。" + +#: ../../library/stdtypes.rst:4678 +msgid "" +"For the subset of :mod:`struct` format strings currently supported by " +":meth:`tolist`, ``v`` and ``w`` are equal if ``v.tolist() == w.tolist()``::" +msgstr "" +"对于 :meth:`tolist` 当前所支持的 :mod:`struct` 格式字符串子集,如果 ``v.tolist() == " +"w.tolist()`` 则 ``v`` 和 ``w`` 相等::" + +#: ../../library/stdtypes.rst:4681 +msgid "" +">>> import array\n" +">>> a = array.array('I', [1, 2, 3, 4, 5])\n" +">>> b = array.array('d', [1.0, 2.0, 3.0, 4.0, 5.0])\n" +">>> c = array.array('b', [5, 3, 1])\n" +">>> x = memoryview(a)\n" +">>> y = memoryview(b)\n" +">>> x == a == y == b\n" +"True\n" +">>> x.tolist() == a.tolist() == y.tolist() == b.tolist()\n" +"True\n" +">>> z = y[::-2]\n" +">>> z == c\n" +"True\n" +">>> z.tolist() == c.tolist()\n" +"True" +msgstr "" +">>> import array\n" +">>> a = array.array('I', [1, 2, 3, 4, 5])\n" +">>> b = array.array('d', [1.0, 2.0, 3.0, 4.0, 5.0])\n" +">>> c = array.array('b', [5, 3, 1])\n" +">>> x = memoryview(a)\n" +">>> y = memoryview(b)\n" +">>> x == a == y == b\n" +"True\n" +">>> x.tolist() == a.tolist() == y.tolist() == b.tolist()\n" +"True\n" +">>> z = y[::-2]\n" +">>> z == c\n" +"True\n" +">>> z.tolist() == c.tolist()\n" +"True" + +#: ../../library/stdtypes.rst:4697 +msgid "" +"If either format string is not supported by the :mod:`struct` module, then " +"the objects will always compare as unequal (even if the format strings and " +"buffer contents are identical)::" +msgstr "如果两边的格式字符串都不被 :mod:`struct` 模块所支持,则两对象比较结果总是不相等(即使格式字符串和缓冲区内容相同)::" + +#: ../../library/stdtypes.rst:4701 +msgid "" +">>> from ctypes import BigEndianStructure, c_long\n" +">>> class BEPoint(BigEndianStructure):\n" +"... _fields_ = [(\"x\", c_long), (\"y\", c_long)]\n" +"...\n" +">>> point = BEPoint(100, 200)\n" +">>> a = memoryview(point)\n" +">>> b = memoryview(point)\n" +">>> a == point\n" +"False\n" +">>> a == b\n" +"False" +msgstr "" +">>> from ctypes import BigEndianStructure, c_long\n" +">>> class BEPoint(BigEndianStructure):\n" +"... _fields_ = [(\"x\", c_long), (\"y\", c_long)]\n" +"...\n" +">>> point = BEPoint(100, 200)\n" +">>> a = memoryview(point)\n" +">>> b = memoryview(point)\n" +">>> a == point\n" +"False\n" +">>> a == b\n" +"False" + +#: ../../library/stdtypes.rst:4713 +msgid "" +"Note that, as with floating-point numbers, ``v is w`` does *not* imply ``v " +"== w`` for memoryview objects." +msgstr "请注意,与浮点数的情况一样,对于内存视图对象来说,``v is w`` 也 *并不* 意味着 ``v == w``。" + +#: ../../library/stdtypes.rst:4716 +msgid "" +"Previous versions compared the raw memory disregarding the item format and " +"the logical array structure." +msgstr "之前的版本比较原始内存时会忽略条目的格式与逻辑数组结构。" + +#: ../../library/stdtypes.rst:4722 +msgid "" +"Return the data in the buffer as a bytestring. This is equivalent to " +"calling the :class:`bytes` constructor on the memoryview. ::" +msgstr "将缓冲区中的数据作为字节串返回。这相当于在内存视图上调用 :class:`bytes` 构造器。 ::" + +#: ../../library/stdtypes.rst:4725 +msgid "" +">>> m = memoryview(b\"abc\")\n" +">>> m.tobytes()\n" +"b'abc'\n" +">>> bytes(m)\n" +"b'abc'" +msgstr "" +">>> m = memoryview(b\"abc\")\n" +">>> m.tobytes()\n" +"b'abc'\n" +">>> bytes(m)\n" +"b'abc'" + +#: ../../library/stdtypes.rst:4731 +msgid "" +"For non-contiguous arrays the result is equal to the flattened list " +"representation with all elements converted to bytes. :meth:`tobytes` " +"supports all format strings, including those that are not in :mod:`struct` " +"module syntax." +msgstr "" +"对于非连续数组,结果等于平面化表示的列表,其中所有元素都转换为字节串。 :meth:`tobytes` 支持所有格式字符串,不符合 " +":mod:`struct` 模块语法的那些也包括在内。" + +#: ../../library/stdtypes.rst:4736 +msgid "" +"*order* can be {'C', 'F', 'A'}. When *order* is 'C' or 'F', the data of the" +" original array is converted to C or Fortran order. For contiguous views, " +"'A' returns an exact copy of the physical memory. In particular, in-memory " +"Fortran order is preserved. For non-contiguous views, the data is converted " +"to C first. *order=None* is the same as *order='C'*." +msgstr "" +"*order* 可以为 {'C', 'F', 'A'}。当 *order* 为 'C' 或 'F' 时,原始数组的数据会被转换至 C 或 Fortran" +" 顺序。对于连续视图,'A' 会返回物理内存的精确副本。特别地,内存中的 Fortran 顺序会被保留。对于非连续视图,数据会先被转换为 C 形式。 " +"*order=None* 与 *order='C'* 是相同的。" + +#: ../../library/stdtypes.rst:4746 +msgid "" +"Return a string object containing two hexadecimal digits for each byte in " +"the buffer. ::" +msgstr "返回一个字符串对象,其中分别以两个十六进制数码表示缓冲区里的每个字节。 ::" + +#: ../../library/stdtypes.rst:4749 +msgid "" +">>> m = memoryview(b\"abc\")\n" +">>> m.hex()\n" +"'616263'" +msgstr "" +">>> m = memoryview(b\"abc\")\n" +">>> m.hex()\n" +"'616263'" + +#: ../../library/stdtypes.rst:4755 +msgid "" +"Similar to :meth:`bytes.hex`, :meth:`memoryview.hex` now supports optional " +"*sep* and *bytes_per_sep* parameters to insert separators between bytes in " +"the hex output." +msgstr "" +"与 :meth:`bytes.hex` 相似, :meth:`memoryview.hex` 现在支持可选的 *sep* 和 " +"*bytes_per_sep* 参数以在十六进制输出的字节之间插入分隔符。" + +#: ../../library/stdtypes.rst:4762 +msgid "Return the data in the buffer as a list of elements. ::" +msgstr "将缓冲区内的数据以一个元素列表的形式返回。 ::" + +#: ../../library/stdtypes.rst:4764 +msgid "" +">>> memoryview(b'abc').tolist()\n" +"[97, 98, 99]\n" +">>> import array\n" +">>> a = array.array('d', [1.1, 2.2, 3.3])\n" +">>> m = memoryview(a)\n" +">>> m.tolist()\n" +"[1.1, 2.2, 3.3]" +msgstr "" +">>> memoryview(b'abc').tolist()\n" +"[97, 98, 99]\n" +">>> import array\n" +">>> a = array.array('d', [1.1, 2.2, 3.3])\n" +">>> m = memoryview(a)\n" +">>> m.tolist()\n" +"[1.1, 2.2, 3.3]" + +#: ../../library/stdtypes.rst:4772 +msgid "" +":meth:`tolist` now supports all single character native formats in " +":mod:`struct` module syntax as well as multi-dimensional representations." +msgstr ":meth:`tolist` 现在支持 :mod:`struct` 模块语法中的所有单字符原生格式以及多维表示形式。" + +#: ../../library/stdtypes.rst:4779 +msgid "" +"Return a readonly version of the memoryview object. The original memoryview" +" object is unchanged. ::" +msgstr "返回 memoryview 对象的只读版本。原始的 memoryview 对象不会被改变。 ::" + +#: ../../library/stdtypes.rst:4782 +msgid "" +">>> m = memoryview(bytearray(b'abc'))\n" +">>> mm = m.toreadonly()\n" +">>> mm.tolist()\n" +"[97, 98, 99]\n" +">>> mm[0] = 42\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"TypeError: cannot modify read-only memory\n" +">>> m[0] = 43\n" +">>> mm.tolist()\n" +"[43, 98, 99]" +msgstr "" +">>> m = memoryview(bytearray(b'abc'))\n" +">>> mm = m.toreadonly()\n" +">>> mm.tolist()\n" +"[97, 98, 99]\n" +">>> mm[0] = 42\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"TypeError: cannot modify read-only memory\n" +">>> m[0] = 43\n" +">>> mm.tolist()\n" +"[43, 98, 99]" + +#: ../../library/stdtypes.rst:4798 +msgid "" +"Release the underlying buffer exposed by the memoryview object. Many " +"objects take special actions when a view is held on them (for example, a " +":class:`bytearray` would temporarily forbid resizing); therefore, calling " +"release() is handy to remove these restrictions (and free any dangling " +"resources) as soon as possible." +msgstr "" +"释放由内存视图对象所公开的底层缓冲区。许多对象在被视图所获取时都会采取特殊动作(例如,:class:`bytearray` " +"将会暂时禁止调整大小);因此,调用 release() 可以方便地尽早去除这些限制(并释放任何多余的资源)。" + +#: ../../library/stdtypes.rst:4804 +msgid "" +"After this method has been called, any further operation on the view raises " +"a :class:`ValueError` (except :meth:`release` itself which can be called " +"multiple times)::" +msgstr "" +"在此方法被调用后,任何对该视图的进一步操作都将引发 :class:`ValueError` (除了可被多次调用的 :meth:`release` " +"本身)::" + +#: ../../library/stdtypes.rst:4808 +msgid "" +">>> m = memoryview(b'abc')\n" +">>> m.release()\n" +">>> m[0]\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"ValueError: operation forbidden on released memoryview object" +msgstr "" +">>> m = memoryview(b'abc')\n" +">>> m.release()\n" +">>> m[0]\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"ValueError: operation forbidden on released memoryview object" + +#: ../../library/stdtypes.rst:4815 +msgid "" +"The context management protocol can be used for a similar effect, using the " +"``with`` statement::" +msgstr "使用 ``with`` 语句,可以通过上下文管理协议达到类似的效果::" + +#: ../../library/stdtypes.rst:4818 +msgid "" +">>> with memoryview(b'abc') as m:\n" +"... m[0]\n" +"...\n" +"97\n" +">>> m[0]\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"ValueError: operation forbidden on released memoryview object" +msgstr "" +">>> with memoryview(b'abc') as m:\n" +"... m[0]\n" +"...\n" +"97\n" +">>> m[0]\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"ValueError: operation forbidden on released memoryview object" + +#: ../../library/stdtypes.rst:4832 +msgid "" +"Cast a memoryview to a new format or shape. *shape* defaults to " +"``[byte_length//new_itemsize]``, which means that the result view will be " +"one-dimensional. The return value is a new memoryview, but the buffer itself" +" is not copied. Supported casts are 1D -> C-:term:`contiguous` and " +"C-contiguous -> 1D." +msgstr "" +"将内存视图转化为新的格式或形状。 *shape* 默认为 ``[byte_length//new_itemsize]``,这意味着结果视图将是一维的。 " +"返回值是一个新的内存视图,但缓冲区本身不会被复制。支持的转化有 1D -> C-:term:`contiguous` 和 C-contiguous ->" +" 1D。" + +#: ../../library/stdtypes.rst:4838 +msgid "" +"The destination format is restricted to a single element native format in " +":mod:`struct` syntax. One of the formats must be a byte format ('B', 'b' or " +"'c'). The byte length of the result must be the same as the original length." +" Note that all byte lengths may depend on the operating system." +msgstr "" +"目标格式被限制为 :mod:`struct` 语法中的单一元素的原生格式。这些格式中的一种必须为字节格式 ('B', 'b' 或 'c')。 " +"结果的字节长度必须与原始长度相同。请注意全部字节长度可能取决于具体操作系统。" + +#: ../../library/stdtypes.rst:4844 +msgid "Cast 1D/long to 1D/unsigned bytes::" +msgstr "将 1D/long 转换为 1D/unsigned bytes::" + +#: ../../library/stdtypes.rst:4846 +msgid "" +">>> import array\n" +">>> a = array.array('l', [1,2,3])\n" +">>> x = memoryview(a)\n" +">>> x.format\n" +"'l'\n" +">>> x.itemsize\n" +"8\n" +">>> len(x)\n" +"3\n" +">>> x.nbytes\n" +"24\n" +">>> y = x.cast('B')\n" +">>> y.format\n" +"'B'\n" +">>> y.itemsize\n" +"1\n" +">>> len(y)\n" +"24\n" +">>> y.nbytes\n" +"24" +msgstr "" +">>> import array\n" +">>> a = array.array('l', [1,2,3])\n" +">>> x = memoryview(a)\n" +">>> x.format\n" +"'l'\n" +">>> x.itemsize\n" +"8\n" +">>> len(x)\n" +"3\n" +">>> x.nbytes\n" +"24\n" +">>> y = x.cast('B')\n" +">>> y.format\n" +"'B'\n" +">>> y.itemsize\n" +"1\n" +">>> len(y)\n" +"24\n" +">>> y.nbytes\n" +"24" + +#: ../../library/stdtypes.rst:4867 +msgid "Cast 1D/unsigned bytes to 1D/char::" +msgstr "将 1D/unsigned bytes 转换为 1D/char::" + +#: ../../library/stdtypes.rst:4869 +msgid "" +">>> b = bytearray(b'zyz')\n" +">>> x = memoryview(b)\n" +">>> x[0] = b'a'\n" +"Traceback (most recent call last):\n" +" ...\n" +"TypeError: memoryview: invalid type for format 'B'\n" +">>> y = x.cast('c')\n" +">>> y[0] = b'a'\n" +">>> b\n" +"bytearray(b'ayz')" +msgstr "" +">>> b = bytearray(b'zyz')\n" +">>> x = memoryview(b)\n" +">>> x[0] = b'a'\n" +"Traceback (most recent call last):\n" +" ...\n" +"TypeError: memoryview: invalid type for format 'B'\n" +">>> y = x.cast('c')\n" +">>> y[0] = b'a'\n" +">>> b\n" +"bytearray(b'ayz')" + +#: ../../library/stdtypes.rst:4880 +msgid "Cast 1D/bytes to 3D/ints to 1D/signed char::" +msgstr "将 1D/bytes 转换为 3D/ints 再转换为 1D/signed char::" + +#: ../../library/stdtypes.rst:4882 +msgid "" +">>> import struct\n" +">>> buf = struct.pack(\"i\"*12, *list(range(12)))\n" +">>> x = memoryview(buf)\n" +">>> y = x.cast('i', shape=[2,2,3])\n" +">>> y.tolist()\n" +"[[[0, 1, 2], [3, 4, 5]], [[6, 7, 8], [9, 10, 11]]]\n" +">>> y.format\n" +"'i'\n" +">>> y.itemsize\n" +"4\n" +">>> len(y)\n" +"2\n" +">>> y.nbytes\n" +"48\n" +">>> z = y.cast('b')\n" +">>> z.format\n" +"'b'\n" +">>> z.itemsize\n" +"1\n" +">>> len(z)\n" +"48\n" +">>> z.nbytes\n" +"48" +msgstr "" +">>> import struct\n" +">>> buf = struct.pack(\"i\"*12, *list(range(12)))\n" +">>> x = memoryview(buf)\n" +">>> y = x.cast('i', shape=[2,2,3])\n" +">>> y.tolist()\n" +"[[[0, 1, 2], [3, 4, 5]], [[6, 7, 8], [9, 10, 11]]]\n" +">>> y.format\n" +"'i'\n" +">>> y.itemsize\n" +"4\n" +">>> len(y)\n" +"2\n" +">>> y.nbytes\n" +"48\n" +">>> z = y.cast('b')\n" +">>> z.format\n" +"'b'\n" +">>> z.itemsize\n" +"1\n" +">>> len(z)\n" +"48\n" +">>> z.nbytes\n" +"48" + +#: ../../library/stdtypes.rst:4906 +msgid "Cast 1D/unsigned long to 2D/unsigned long::" +msgstr "将 1D/unsigned long 转换为 2D/unsigned long::" + +#: ../../library/stdtypes.rst:4908 +msgid "" +">>> buf = struct.pack(\"L\"*6, *list(range(6)))\n" +">>> x = memoryview(buf)\n" +">>> y = x.cast('L', shape=[2,3])\n" +">>> len(y)\n" +"2\n" +">>> y.nbytes\n" +"48\n" +">>> y.tolist()\n" +"[[0, 1, 2], [3, 4, 5]]" +msgstr "" +">>> buf = struct.pack(\"L\"*6, *list(range(6)))\n" +">>> x = memoryview(buf)\n" +">>> y = x.cast('L', shape=[2,3])\n" +">>> len(y)\n" +"2\n" +">>> y.nbytes\n" +"48\n" +">>> y.tolist()\n" +"[[0, 1, 2], [3, 4, 5]]" + +#: ../../library/stdtypes.rst:4920 +msgid "The source format is no longer restricted when casting to a byte view." +msgstr "当转换为字节视图时,源格式将不再受限。" + +#: ../../library/stdtypes.rst:4925 +msgid "Count the number of occurrences of *value*." +msgstr "统计 *value* 出现的次数。" + +#: ../../library/stdtypes.rst:4931 +msgid "" +"Return the index of the first occurrence of *value* (at or after index " +"*start* and before index *stop*)." +msgstr "返回 *value* 首次出现的项的索引号(在索引号 *start* 或其后且在索引号 *stop* 之前)。" + +#: ../../library/stdtypes.rst:4934 +msgid "Raises a :exc:`ValueError` if *value* cannot be found." +msgstr "如果找不到 *value* 则会引发 :exc:`ValueError`。" + +#: ../../library/stdtypes.rst:4938 +msgid "There are also several readonly attributes available:" +msgstr "还存在一些可用的只读属性:" + +#: ../../library/stdtypes.rst:4942 +msgid "The underlying object of the memoryview::" +msgstr "内存视图的下层对象::" + +#: ../../library/stdtypes.rst:4944 +msgid "" +">>> b = bytearray(b'xyz')\n" +">>> m = memoryview(b)\n" +">>> m.obj is b\n" +"True" +msgstr "" +">>> b = bytearray(b'xyz')\n" +">>> m = memoryview(b)\n" +">>> m.obj is b\n" +"True" + +#: ../../library/stdtypes.rst:4953 +msgid "" +"``nbytes == product(shape) * itemsize == len(m.tobytes())``. This is the " +"amount of space in bytes that the array would use in a contiguous " +"representation. It is not necessarily equal to ``len(m)``::" +msgstr "" +"``nbytes == product(shape) * itemsize == len(m.tobytes())``。 " +"这是数组在连续表示时将会占用的空间总字节数。它不一定等于 ``len(m)``::" + +#: ../../library/stdtypes.rst:4957 +msgid "" +">>> import array\n" +">>> a = array.array('i', [1,2,3,4,5])\n" +">>> m = memoryview(a)\n" +">>> len(m)\n" +"5\n" +">>> m.nbytes\n" +"20\n" +">>> y = m[::2]\n" +">>> len(y)\n" +"3\n" +">>> y.nbytes\n" +"12\n" +">>> len(y.tobytes())\n" +"12" +msgstr "" +">>> import array\n" +">>> a = array.array('i', [1,2,3,4,5])\n" +">>> m = memoryview(a)\n" +">>> len(m)\n" +"5\n" +">>> m.nbytes\n" +"20\n" +">>> y = m[::2]\n" +">>> len(y)\n" +"3\n" +">>> y.nbytes\n" +"12\n" +">>> len(y.tobytes())\n" +"12" + +#: ../../library/stdtypes.rst:4972 +msgid "Multi-dimensional arrays::" +msgstr "多维数组::" + +#: ../../library/stdtypes.rst:4974 +msgid "" +">>> import struct\n" +">>> buf = struct.pack(\"d\"*12, *[1.5*x for x in range(12)])\n" +">>> x = memoryview(buf)\n" +">>> y = x.cast('d', shape=[3,4])\n" +">>> y.tolist()\n" +"[[0.0, 1.5, 3.0, 4.5], [6.0, 7.5, 9.0, 10.5], [12.0, 13.5, 15.0, 16.5]]\n" +">>> len(y)\n" +"3\n" +">>> y.nbytes\n" +"96" +msgstr "" +">>> import struct\n" +">>> buf = struct.pack(\"d\"*12, *[1.5*x for x in range(12)])\n" +">>> x = memoryview(buf)\n" +">>> y = x.cast('d', shape=[3,4])\n" +">>> y.tolist()\n" +"[[0.0, 1.5, 3.0, 4.5], [6.0, 7.5, 9.0, 10.5], [12.0, 13.5, 15.0, 16.5]]\n" +">>> len(y)\n" +"3\n" +">>> y.nbytes\n" +"96" + +#: ../../library/stdtypes.rst:4989 +msgid "A bool indicating whether the memory is read only." +msgstr "一个表明内存是否只读的布尔值。" + +#: ../../library/stdtypes.rst:4993 +msgid "" +"A string containing the format (in :mod:`struct` module style) for each " +"element in the view. A memoryview can be created from exporters with " +"arbitrary format strings, but some methods (e.g. :meth:`tolist`) are " +"restricted to native single element formats." +msgstr "" +"一个字符串,包含视图中每个元素的格式(表示为 :mod:`struct` 模块样式)。内存视图可以从具有任意格式字符串的导出器创建,但某些方法 (例如 " +":meth:`tolist`) 仅限于原生的单元素格式。" + +#: ../../library/stdtypes.rst:4998 +msgid "" +"format ``'B'`` is now handled according to the struct module syntax. This " +"means that ``memoryview(b'abc')[0] == b'abc'[0] == 97``." +msgstr "" +"格式 ``'B'`` 现在会按照 struct 模块语法来处理。这意味着 ``memoryview(b'abc')[0] == b'abc'[0] ==" +" 97``。" + +#: ../../library/stdtypes.rst:5004 +msgid "The size in bytes of each element of the memoryview::" +msgstr "memoryview 中每个元素以字节表示的大小::" + +#: ../../library/stdtypes.rst:5006 +msgid "" +">>> import array, struct\n" +">>> m = memoryview(array.array('H', [32000, 32001, 32002]))\n" +">>> m.itemsize\n" +"2\n" +">>> m[0]\n" +"32000\n" +">>> struct.calcsize('H') == m.itemsize\n" +"True" +msgstr "" +">>> import array, struct\n" +">>> m = memoryview(array.array('H', [32000, 32001, 32002]))\n" +">>> m.itemsize\n" +"2\n" +">>> m[0]\n" +"32000\n" +">>> struct.calcsize('H') == m.itemsize\n" +"True" + +#: ../../library/stdtypes.rst:5017 +msgid "" +"An integer indicating how many dimensions of a multi-dimensional array the " +"memory represents." +msgstr "一个整数,表示内存所代表的多维数组具有多少个维度。" + +#: ../../library/stdtypes.rst:5022 +msgid "" +"A tuple of integers the length of :attr:`ndim` giving the shape of the " +"memory as an N-dimensional array." +msgstr "一个整数元组,通过 :attr:`ndim` 的长度值给出内存所代表的 N 维数组的形状。" + +#: ../../library/stdtypes.rst:5025 ../../library/stdtypes.rst:5033 +msgid "An empty tuple instead of ``None`` when ndim = 0." +msgstr "当 ndim = 0 时值为空元组而不再为 ``None``。" + +#: ../../library/stdtypes.rst:5030 +msgid "" +"A tuple of integers the length of :attr:`ndim` giving the size in bytes to " +"access each element for each dimension of the array." +msgstr "一个整数元组,通过 :attr:`ndim` 的长度给出以字节表示的大小,以便访问数组中每个维度上的每个元素。" + +#: ../../library/stdtypes.rst:5038 +msgid "Used internally for PIL-style arrays. The value is informational only." +msgstr "供 PIL 风格的数组内部使用。该值仅作为参考信息。" + +#: ../../library/stdtypes.rst:5042 +msgid "A bool indicating whether the memory is C-:term:`contiguous`." +msgstr "一个表明内存是否为 C-:term:`contiguous` 的布尔值。" + +#: ../../library/stdtypes.rst:5048 +msgid "A bool indicating whether the memory is Fortran :term:`contiguous`." +msgstr "一个表明内存是否为 Fortran :term:`contiguous` 的布尔值。" + +#: ../../library/stdtypes.rst:5054 +msgid "A bool indicating whether the memory is :term:`contiguous`." +msgstr "一个表明内存是否为 :term:`contiguous` 的布尔值。" + +#: ../../library/stdtypes.rst:5058 +msgid "" +"For information on the thread safety of :class:`memoryview` objects in the " +":term:`free-threaded build`, see :ref:`thread-safety-memoryview`." +msgstr "" + +#: ../../library/stdtypes.rst:5065 +msgid "Set Types --- :class:`set`, :class:`frozenset`" +msgstr "集合类型 --- :class:`set`, :class:`frozenset`" + +#: ../../library/stdtypes.rst:5069 +msgid "" +"A :dfn:`set` object is an unordered collection of distinct :term:`hashable` " +"objects. Common uses include membership testing, removing duplicates from a " +"sequence, and computing mathematical operations such as intersection, union," +" difference, and symmetric difference. (For other containers see the built-" +"in :class:`dict`, :class:`list`, and :class:`tuple` classes, and the " +":mod:`collections` module.)" +msgstr "" +":dfn:`set` 对象是由具有唯一性的 :term:`hashable` 对象所组成的无序多项集。 " +"常见的用途包括成员检测、从序列中去除重复项以及数学中的集合类计算,例如交集、并集、差集与对称差集等等。 (关于其他容器对象请参看 " +":class:`dict`, :class:`list` 与 :class:`tuple` 等内置类,以及 :mod:`collections` " +"模块。)" + +#: ../../library/stdtypes.rst:5076 +msgid "" +"Like other collections, sets support ``x in set``, ``len(set)``, and ``for x" +" in set``. Being an unordered collection, sets do not record element " +"position or order of insertion. Accordingly, sets do not support indexing, " +"slicing, or other sequence-like behavior." +msgstr "" +"与其他多项集一样,集合也支持 ``x in set``, ``len(set)`` 和 ``for x in set``。 " +"作为一种无序的多项集,集合并不记录元素位置或插入顺序。相应地,集合不支持索引、切片或其他序列类的操作。" + +#: ../../library/stdtypes.rst:5081 +msgid "" +"There are currently two built-in set types, :class:`set` and " +":class:`frozenset`. The :class:`set` type is mutable --- the contents can be" +" changed using methods like :meth:`~set.add` and :meth:`~set.remove`. Since " +"it is mutable, it has no hash value and cannot be used as either a " +"dictionary key or as an element of another set. The :class:`frozenset` type " +"is immutable and :term:`hashable` --- its contents cannot be altered after " +"it is created; it can therefore be used as a dictionary key or as an element" +" of another set." +msgstr "" +"目前有两种内置集合类型,:class:`set` 和 :class:`frozenset`。 :class:`set` 类型是可变的 --- " +"其内容可以使用 :meth:`~set.add` 和 :meth:`~set.remove` 这样的方法来改变。 " +"由于是可变的,它没有哈希值并且不能被用作字典的键或其他集合的元素。 :class:`frozenset` 类型是不可变的并且为 " +":term:`hashable` --- 其内容在被创建后不能再改变;因此它可以被用作字典的键或其他集合的元素。" + +#: ../../library/stdtypes.rst:5090 +msgid "" +"Non-empty sets (not frozensets) can be created by placing a comma-separated " +"list of elements within braces, for example: ``{'jack', 'sjoerd'}``, in " +"addition to the :class:`set` constructor." +msgstr "" +"除了可以使用 :class:`set` 构造器,非空的 set (不是 frozenset) " +"还可以通过将以逗号分隔的元素列表包含于花括号之内来创建,例如: ``{'jack', 'sjoerd'}``。" + +#: ../../library/stdtypes.rst:5094 +msgid "The constructors for both classes work the same:" +msgstr "两个类的构造器具有相同的作用方式:" + +#: ../../library/stdtypes.rst:5099 +msgid "" +"Return a new set or frozenset object whose elements are taken from " +"*iterable*. The elements of a set must be :term:`hashable`. To represent " +"sets of sets, the inner sets must be :class:`frozenset` objects. If " +"*iterable* is not specified, a new empty set is returned." +msgstr "" +"返回一个新的 set 或 frozenset 对象,其元素来自于 *iterable*。集合的元素必须为 :term:`hashable`。 " +"要表示由集合对象构成的集合,所有的内层集合必须为 :class:`frozenset` 对象。如果未指定 *iterable*,则将返回一个新的空集合。" + +#: ../../library/stdtypes.rst:5105 +msgid "Sets can be created by several means:" +msgstr "集合可用多种方式来创建:" + +#: ../../library/stdtypes.rst:5107 +msgid "" +"Use a comma-separated list of elements within braces: ``{'jack', 'sjoerd'}``" +msgstr "使用花括号内以逗号分隔元素的方式: ``{'jack', 'sjoerd'}``" + +#: ../../library/stdtypes.rst:5108 +msgid "" +"Use a set comprehension: ``{c for c in 'abracadabra' if c not in 'abc'}``" +msgstr "使用集合推导式: ``{c for c in 'abracadabra' if c not in 'abc'}``" + +#: ../../library/stdtypes.rst:5109 +msgid "" +"Use the type constructor: ``set()``, ``set('foobar')``, ``set(['a', 'b', " +"'foo'])``" +msgstr "使用类型构造器: ``set()``, ``set('foobar')``, ``set(['a', 'b', 'foo'])``" + +#: ../../library/stdtypes.rst:5111 +msgid "" +"Instances of :class:`set` and :class:`frozenset` provide the following " +"operations:" +msgstr ":class:`set` 和 :class:`frozenset` 的实例提供以下操作:" + +#: ../../library/stdtypes.rst:5116 +msgid "Return the number of elements in set *s* (cardinality of *s*)." +msgstr "返回集合 *s* 中的元素数量(即 *s* 的基数)。" + +#: ../../library/stdtypes.rst:5120 +msgid "Test *x* for membership in *s*." +msgstr "检测 *x* 是否为 *s* 中的成员。" + +#: ../../library/stdtypes.rst:5124 +msgid "Test *x* for non-membership in *s*." +msgstr "检测 *x* 是否非 *s* 中的成员。" + +#: ../../library/stdtypes.rst:5129 +msgid "" +"Return ``True`` if the set has no elements in common with *other*. Sets are" +" disjoint if and only if their intersection is the empty set." +msgstr "如果集合中没有与 *other* 共有的元素则返回 ``True``。当且仅当两个集合的交集为空集合时,两者为不相交集合。" + +#: ../../library/stdtypes.rst:5136 +msgid "Test whether every element in the set is in *other*." +msgstr "检测是否集合中的每个元素都在 *other* 之中。" + +#: ../../library/stdtypes.rst:5140 +msgid "" +"Test whether the set is a proper subset of *other*, that is, ``set <= other " +"and set != other``." +msgstr "检测集合是否为 *other* 的真子集,即 ``set <= other and set != other``。" + +#: ../../library/stdtypes.rst:5147 +msgid "Test whether every element in *other* is in the set." +msgstr "检测是否 *other* 中的每个元素都在集合之中。" + +#: ../../library/stdtypes.rst:5151 +msgid "" +"Test whether the set is a proper superset of *other*, that is, ``set >= " +"other and set != other``." +msgstr "检测集合是否为 *other* 的真超集,即 ``set >= other and set != other``。" + +#: ../../library/stdtypes.rst:5158 +msgid "Return a new set with elements from the set and all others." +msgstr "返回一个新集合,其中包含来自原集合以及 others 指定的所有集合中的元素。" + +#: ../../library/stdtypes.rst:5164 +msgid "Return a new set with elements common to the set and all others." +msgstr "返回一个新集合,其中包含原集合以及 others 指定的所有集合中共有的元素。" + +#: ../../library/stdtypes.rst:5170 +msgid "Return a new set with elements in the set that are not in the others." +msgstr "返回一个新集合,其中包含原集合中在 others 指定的其他集合中不存在的元素。" + +#: ../../library/stdtypes.rst:5176 +msgid "" +"Return a new set with elements in either the set or *other* but not both." +msgstr "返回一个新集合,其中的元素或属于原集合或属于 *other* 指定的其他集合,但不能同时属于两者。" + +#: ../../library/stdtypes.rst:5181 +msgid "Return a shallow copy of the set." +msgstr "返回原集合的浅拷贝。" + +#: ../../library/stdtypes.rst:5184 +msgid "" +"Note, the non-operator versions of :meth:`~frozenset.union`, " +":meth:`~frozenset.intersection`, :meth:`~frozenset.difference`, " +":meth:`~frozenset.symmetric_difference`, :meth:`~frozenset.issubset`, and " +":meth:`~frozenset.issuperset` methods will accept any iterable as an " +"argument. In contrast, their operator based counterparts require their " +"arguments to be sets. This precludes error-prone constructions like " +"``set('abc') & 'cbs'`` in favor of the more readable " +"``set('abc').intersection('cbs')``." +msgstr "" +"请注意,非运算符版本的 :meth:`~frozenset.union`, :meth:`~frozenset.intersection`, " +":meth:`~frozenset.difference`, :meth:`~frozenset.symmetric_difference`, " +":meth:`~frozenset.issubset` 和 :meth:`~frozenset.issuperset` " +"方法可接受任何可迭代对象作为参数。相比之下,基于运算符的对应方法则要求参数为集合。这将能避免像 ``set('abc') & 'cbs'`` " +"这样出错的结构而换成了可读性更好的 ``set('abc').intersection('cbs')``。" + +#: ../../library/stdtypes.rst:5191 +msgid "" +"Both :class:`set` and :class:`frozenset` support set to set comparisons. Two" +" sets are equal if and only if every element of each set is contained in the" +" other (each is a subset of the other). A set is less than another set if " +"and only if the first set is a proper subset of the second set (is a subset," +" but is not equal). A set is greater than another set if and only if the " +"first set is a proper superset of the second set (is a superset, but is not " +"equal)." +msgstr "" +":class:`set` 和 :class:`frozenset` 均支持集合与集合的比较。 " +"两个集合当且仅当每个集合中的每个元素均包含于另一个集合之内(即各为对方的子集)时则相等。 " +"一个集合当且仅当其为另一个集合的真子集(即为后者的子集但两者不相等)时则小于另一个集合。 " +"一个集合当且仅当其为另一个集合的真超集(即为后者的超集但两者不相等)时则大于另一个集合。" + +#: ../../library/stdtypes.rst:5198 +msgid "" +"Instances of :class:`set` are compared to instances of :class:`frozenset` " +"based on their members. For example, ``set('abc') == frozenset('abc')`` " +"returns ``True`` and so does ``set('abc') in set([frozenset('abc')])``." +msgstr "" +":class:`set` 的实例与 :class:`frozenset` 的实例之间基于它们的成员进行比较。例如 ``set('abc') == " +"frozenset('abc')`` 返回 ``True``,``set('abc') in set([frozenset('abc')])`` " +"也一样。" + +#: ../../library/stdtypes.rst:5202 +msgid "" +"The subset and equality comparisons do not generalize to a total ordering " +"function. For example, any two nonempty disjoint sets are not equal and are" +" not subsets of each other, so *all* of the following return ``False``: " +"``ab``." +msgstr "" +"子集与相等比较并不能推广为完全排序函数。例如,任意两个非空且不相交的集合不相等且互不为对方的子集,因此以下 *所有* 比较均返回 ``False``: " +"``ab``。" + +#: ../../library/stdtypes.rst:5207 +msgid "" +"Since sets only define partial ordering (subset relationships), the output " +"of the :meth:`list.sort` method is undefined for lists of sets." +msgstr "由于集合仅定义了部分排序(子集关系),因此由集合构成的列表 :meth:`list.sort` 方法的输出并无定义。" + +#: ../../library/stdtypes.rst:5210 +msgid "Set elements, like dictionary keys, must be :term:`hashable`." +msgstr "集合的元素,与字典的键类似,必须为 :term:`hashable`。" + +#: ../../library/stdtypes.rst:5212 +msgid "" +"Binary operations that mix :class:`set` instances with :class:`frozenset` " +"return the type of the first operand. For example: ``frozenset('ab') | " +"set('bc')`` returns an instance of :class:`frozenset`." +msgstr "" +"混合了 :class:`set` 实例与 :class:`frozenset` 的二元运算将返回与第一个操作数相同的类型。例如: " +"``frozenset('ab') | set('bc')`` 将返回 :class:`frozenset` 的实例。" + +#: ../../library/stdtypes.rst:5216 +msgid "" +"The following table lists operations available for :class:`set` that do not " +"apply to immutable instances of :class:`frozenset`:" +msgstr "下表列出了可用于 :class:`set` 而不能用于不可变的 :class:`frozenset` 实例的操作:" + +#: ../../library/stdtypes.rst:5222 +msgid "Update the set, adding elements from all others." +msgstr "更新集合,添加来自 others 中的所有元素。" + +#: ../../library/stdtypes.rst:5227 +msgid "Update the set, keeping only elements found in it and all others." +msgstr "更新集合,只保留其中在所有 others 中也存在的元素。" + +#: ../../library/stdtypes.rst:5232 +msgid "Update the set, removing elements found in others." +msgstr "更新集合,移除其中也存在于 others 中的元素。" + +#: ../../library/stdtypes.rst:5237 +msgid "" +"Update the set, keeping only elements found in either set, but not in both." +msgstr "更新集合,只保留存在于集合的一方而非共同存在的元素。" + +#: ../../library/stdtypes.rst:5241 +msgid "Add element *elem* to the set." +msgstr "将元素 *elem* 添加到集合中。" + +#: ../../library/stdtypes.rst:5245 +msgid "" +"Remove element *elem* from the set. Raises :exc:`KeyError` if *elem* is not" +" contained in the set." +msgstr "从集合中移除元素 *elem*。如果 *elem* 不存在于集合中则会引发 :exc:`KeyError`。" + +#: ../../library/stdtypes.rst:5250 +msgid "Remove element *elem* from the set if it is present." +msgstr "如果元素 *elem* 存在于集合中则将其移除。" + +#: ../../library/stdtypes.rst:5254 +msgid "" +"Remove and return an arbitrary element from the set. Raises :exc:`KeyError`" +" if the set is empty." +msgstr "从集合中移除并返回任意一个元素。如果集合为空则会引发 :exc:`KeyError`。" + +#: ../../library/stdtypes.rst:5259 +msgid "Remove all elements from the set." +msgstr "从集合中移除所有元素。" + +#: ../../library/stdtypes.rst:5262 +msgid "" +"Note, the non-operator versions of the :meth:`~set.update`, " +":meth:`~set.intersection_update`, :meth:`~set.difference_update`, and " +":meth:`~set.symmetric_difference_update` methods will accept any iterable as" +" an argument." +msgstr "" +"请注意,非运算符版本的 :meth:`~set.update`, :meth:`~set.intersection_update`, " +":meth:`~set.difference_update` 和 :meth:`~set.symmetric_difference_update` " +"方法可接受任意可迭代对象作为参数。" + +#: ../../library/stdtypes.rst:5267 +msgid "" +"Note, the *elem* argument to the :meth:`~object.__contains__`, " +":meth:`~set.remove`, and :meth:`~set.discard` methods may be a set. To " +"support searching for an equivalent frozenset, a temporary one is created " +"from *elem*." +msgstr "" +"请注意,:meth:`~object.__contains__`, :meth:`~set.remove` 和 :meth:`~set.discard`" +" 方法的 *elem* 参数可以是一个集合。为支持搜索等价的冻结集合,将根据 *elem* 临时创建一个对象。" + +#: ../../library/stdtypes.rst:5274 +msgid "" +"For detailed information on thread-safety guarantees for :class:`set` " +"objects, see :ref:`thread-safety-set`." +msgstr "" + +#: ../../library/stdtypes.rst:5277 +msgid "" +"Sets and frozensets are :ref:`generic ` over the type of their " +"elements." +msgstr "" + +#: ../../library/stdtypes.rst:5283 +msgid "Mapping Types --- :class:`dict`" +msgstr "映射类型 --- :class:`dict`" + +#: ../../library/stdtypes.rst:5293 +msgid "" +"A :term:`mapping` object maps :term:`hashable` values to arbitrary objects. " +"Mappings are mutable objects. There is currently only one standard mapping " +"type, the :dfn:`dictionary`. (For other containers see the built-in " +":class:`list`, :class:`set`, and :class:`tuple` classes, and the " +":mod:`collections` module.)" +msgstr "" +":term:`mapping` 对象会将 :term:`hashable` 值映射到任意对象。映射属于可变对象。目前仅有一种标准映射类型 " +":dfn:`字典`。 (关于其他容器对象请参看 :class:`list`, :class:`set` 与 :class:`tuple` 等内置类,以及" +" :mod:`collections` 模块。)" + +#: ../../library/stdtypes.rst:5299 +msgid "" +"A dictionary's keys are *almost* arbitrary values. Values that are not " +":term:`hashable`, that is, values containing lists, dictionaries or other " +"mutable types (that are compared by value rather than by object identity) " +"may not be used as keys. Values that compare equal (such as ``1``, ``1.0``, " +"and ``True``) can be used interchangeably to index the same dictionary " +"entry." +msgstr "" +"字典的键 *几乎* 可以为任何值。不是 :term:`hashable` " +"的值,即包含列表、字典或其他可变类型(按值比较而非按对象标识比较)的值不可被用作键。比较结果相等的值(如 ``1``, ``1.0`` 和 " +"``True`` 等)可被互换使用以索引同一个字典条目。" + +#: ../../library/stdtypes.rst:5310 +msgid "" +"Return a new dictionary initialized from an optional positional argument and" +" a possibly empty set of keyword arguments." +msgstr "返回一个新的字典,基于可选的位置参数和可能为空的关键字参数集来初始化。" + +#: ../../library/stdtypes.rst:5313 +msgid "Dictionaries can be created by several means:" +msgstr "字典可用多种方式来创建:" + +#: ../../library/stdtypes.rst:5315 +msgid "" +"Use a comma-separated list of ``key: value`` pairs within braces: ``{'jack':" +" 4098, 'sjoerd': 4127}`` or ``{4098: 'jack', 4127: 'sjoerd'}``" +msgstr "" +"使用花括号内以逗号分隔 ``key: value`` 对的方式: ``{'jack': 4098, 'sjoerd': 4127}`` 或 " +"``{4098: 'jack', 4127: 'sjoerd'}``" + +#: ../../library/stdtypes.rst:5317 +msgid "Use a dict comprehension: ``{}``, ``{x: x ** 2 for x in range(10)}``" +msgstr "使用字典推导式: ``{}``, ``{x: x ** 2 for x in range(10)}``" + +#: ../../library/stdtypes.rst:5318 +msgid "" +"Use the type constructor: ``dict()``, ``dict([('foo', 100), ('bar', " +"200)])``, ``dict(foo=100, bar=200)``" +msgstr "" +"使用类型构造器: ``dict()``, ``dict([('foo', 100), ('bar', 200)])``, ``dict(foo=100," +" bar=200)``" + +#: ../../library/stdtypes.rst:5321 +msgid "" +"If no positional argument is given, an empty dictionary is created. If a " +"positional argument is given and it defines a ``keys()`` method, a " +"dictionary is created by calling :meth:`~object.__getitem__` on the argument" +" with each returned key from the method. Otherwise, the positional argument" +" must be an :term:`iterable` object. Each item in the iterable must itself " +"be an iterable with exactly two elements. The first element of each item " +"becomes a key in the new dictionary, and the second element the " +"corresponding value. If a key occurs more than once, the last value for " +"that key becomes the corresponding value in the new dictionary." +msgstr "" +"如果没有给出位置参数,将创建一个空字典。如果给出一个位置参数并且其定义了 ``keys()`` 方法,则通过在该参数上调用 " +":meth:`~object.__getitem__` 创建一个字典并包含从该方法返回的每个键。在其他情况下,位置参数必须是一个 " +":term:`iterable` 对象。该可迭代对象中的每一项本身必须是一个恰好包含两个元素的可迭代对象。 " +"每一项中的第一个元素将成为新字典的一个键,第二个元素将成为其对应的值。如果一个键出现多次,该键的最后一个值将成为其在新字典中的对应值。" + +#: ../../library/stdtypes.rst:5331 +msgid "" +"If keyword arguments are given, the keyword arguments and their values are " +"added to the dictionary created from the positional argument. If a key " +"being added is already present, the value from the keyword argument replaces" +" the value from the positional argument." +msgstr "如果给出了关键字参数,则关键字参数及其值会被加入到基于位置参数创建的字典。如果要加入的键已存在,来自关键字参数的值将替代来自位置参数的值。" + +#: ../../library/stdtypes.rst:5336 +msgid "" +"Dictionaries compare equal if and only if they have the same ``(key, " +"value)`` pairs (regardless of ordering). Order comparisons ('<', '<=', '>='," +" '>') raise :exc:`TypeError`. To illustrate dictionary creation and " +"equality, the following examples all return a dictionary equal to " +"``{\"one\": 1, \"two\": 2, \"three\": 3}``::" +msgstr "" +"字典比较结果当且仅当它们有相同的 ``(key, value)`` 对时(无论顺序如何)才会相等。顺序比较('<', '<=', '>=', " +"'>')会引发 :exc:`TypeError`。为了说明字典的创建和相等性规则,下面的示例都返回一个等于 ``{\\\"two\": 2, " +"\"three\": 3}`` 的字典::" + +#: ../../library/stdtypes.rst:5342 +msgid "" +">>> a = dict(one=1, two=2, three=3)\n" +">>> b = {'one': 1, 'two': 2, 'three': 3}\n" +">>> c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))\n" +">>> d = dict([('two', 2), ('one', 1), ('three', 3)])\n" +">>> e = dict({'three': 3, 'one': 1, 'two': 2})\n" +">>> f = dict({'one': 1, 'three': 3}, two=2)\n" +">>> a == b == c == d == e == f\n" +"True" +msgstr "" +">>> a = dict(one=1, two=2, three=3)\n" +">>> b = {'one': 1, 'two': 2, 'three': 3}\n" +">>> c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))\n" +">>> d = dict([('two', 2), ('one', 1), ('three', 3)])\n" +">>> e = dict({'three': 3, 'one': 1, 'two': 2})\n" +">>> f = dict({'one': 1, 'three': 3}, two=2)\n" +">>> a == b == c == d == e == f\n" +"True" + +#: ../../library/stdtypes.rst:5351 +msgid "" +"Providing keyword arguments as in the first example only works for keys that" +" are valid Python identifiers. Otherwise, any valid keys can be used." +msgstr "像第一个例子那样提供关键字参数的方式只能使用有效的 Python 标识符作为键。其他方式则可使用任何有效的键。" + +#: ../../library/stdtypes.rst:5354 +msgid "" +"Dictionaries preserve insertion order. Note that updating a key does not " +"affect the order. Keys added after deletion are inserted at the end. ::" +msgstr "字典会保留插入时的顺序。请注意对键的更新不会影响顺序。删除并再次添加的键将被插入到末尾。 ::" + +#: ../../library/stdtypes.rst:5357 +msgid "" +">>> d = {\"one\": 1, \"two\": 2, \"three\": 3, \"four\": 4}\n" +">>> d\n" +"{'one': 1, 'two': 2, 'three': 3, 'four': 4}\n" +">>> list(d)\n" +"['one', 'two', 'three', 'four']\n" +">>> list(d.values())\n" +"[1, 2, 3, 4]\n" +">>> d[\"one\"] = 42\n" +">>> d\n" +"{'one': 42, 'two': 2, 'three': 3, 'four': 4}\n" +">>> del d[\"two\"]\n" +">>> d[\"two\"] = None\n" +">>> d\n" +"{'one': 42, 'three': 3, 'four': 4, 'two': None}" +msgstr "" +">>> d = {\"one\": 1, \"two\": 2, \"three\": 3, \"four\": 4}\n" +">>> d\n" +"{'one': 1, 'two': 2, 'three': 3, 'four': 4}\n" +">>> list(d)\n" +"['one', 'two', 'three', 'four']\n" +">>> list(d.values())\n" +"[1, 2, 3, 4]\n" +">>> d[\"one\"] = 42\n" +">>> d\n" +"{'one': 42, 'two': 2, 'three': 3, 'four': 4}\n" +">>> del d[\"two\"]\n" +">>> d[\"two\"] = None\n" +">>> d\n" +"{'one': 42, 'three': 3, 'four': 4, 'two': None}" + +#: ../../library/stdtypes.rst:5372 +msgid "" +"Dictionary order is guaranteed to be insertion order. This behavior was an " +"implementation detail of CPython from 3.6." +msgstr "字典顺序会确保为插入顺序。此行为是自 3.6 版开始的 CPython 实现细节。" + +#: ../../library/stdtypes.rst:5376 +msgid "" +"Dictionaries are :ref:`generic ` over two types, signifying " +"(respectively) the types of the dictionary's keys and values." +msgstr "" + +#: ../../library/stdtypes.rst:5379 +msgid "" +"These are the operations that dictionaries support (and therefore, custom " +"mapping types should support too):" +msgstr "这些是字典所支持的操作(因而自定义的映射类型也应当支持):" + +#: ../../library/stdtypes.rst:5384 +msgid "Return a list of all the keys used in the dictionary *d*." +msgstr "返回字典 *d* 中使用的所有键的列表。" + +#: ../../library/stdtypes.rst:5388 +msgid "Return the number of items in the dictionary *d*." +msgstr "返回字典 *d* 中的项数。" + +#: ../../library/stdtypes.rst:5392 +msgid "" +"Return the item of *d* with key *key*. Raises a :exc:`KeyError` if *key* is" +" not in the map." +msgstr "返回 *d* 中以 *key* 为键的项。如果映射中不存在 *key* 则会引发 :exc:`KeyError`。" + +#: ../../library/stdtypes.rst:5397 +msgid "" +"If a subclass of dict defines a method :meth:`~object.__missing__` and *key*" +" is not present, the ``d[key]`` operation calls that method with the key " +"*key* as argument. The ``d[key]`` operation then returns or raises whatever" +" is returned or raised by the ``__missing__(key)`` call. No other operations" +" or methods invoke :meth:`~object.__missing__`. If " +":meth:`~object.__missing__` is not defined, :exc:`KeyError` is raised. " +":meth:`~object.__missing__` must be a method; it cannot be an instance " +"variable::" +msgstr "" +"如果字典的子类定义了方法 :meth:`~object.__missing__` 并且 *key* 不存在,则 ``d[key]`` " +"操作将调用该方法并附带键 *key* 作为参数。``d[key]`` 随后将返回或引发 ``__missing__(key)`` " +"调用所返回或引发的任何对象或异常。没有其他操作或方法会唤起 :meth:`~object.__missing__`。如果未定义 " +":meth:`~object.__missing__`,则会引发 :exc:`KeyError`。 " +":meth:`~object.__missing__` 必须是一个方法;它不能是一个实例变量::" + +#: ../../library/stdtypes.rst:5405 +msgid "" +">>> class Counter(dict):\n" +"... def __missing__(self, key):\n" +"... return 0\n" +"...\n" +">>> c = Counter()\n" +">>> c['red']\n" +"0\n" +">>> c['red'] += 1\n" +">>> c['red']\n" +"1" +msgstr "" +">>> class Counter(dict):\n" +"... def __missing__(self, key):\n" +"... return 0\n" +"...\n" +">>> c = Counter()\n" +">>> c['red']\n" +"0\n" +">>> c['red'] += 1\n" +">>> c['red']\n" +"1" + +#: ../../library/stdtypes.rst:5416 +msgid "" +"The example above shows part of the implementation of " +":class:`collections.Counter`. A different :meth:`!__missing__` method is " +"used by :class:`collections.defaultdict`." +msgstr "" +"上面的例子显示了 :class:`collections.Counter` 实现的部分代码。还有另一个不同的 :meth:`!__missing__` " +"方法是由 :class:`collections.defaultdict` 所使用的。" + +#: ../../library/stdtypes.rst:5423 +msgid "Set ``d[key]`` to *value*." +msgstr "将 ``d[key]`` 设为 *value*。" + +#: ../../library/stdtypes.rst:5427 +msgid "" +"Remove ``d[key]`` from *d*. Raises a :exc:`KeyError` if *key* is not in the" +" map." +msgstr "将 ``d[key]`` 从 *d* 中移除。如果映射中不存在 *key* 则会引发 :exc:`KeyError`。" + +#: ../../library/stdtypes.rst:5432 +msgid "Return ``True`` if *d* has a key *key*, else ``False``." +msgstr "如果 *d* 中存在键 *key* 则返回 ``True``,否则返回 ``False``。" + +#: ../../library/stdtypes.rst:5436 +msgid "Equivalent to ``not key in d``." +msgstr "等价于 ``not key in d``。" + +#: ../../library/stdtypes.rst:5440 +msgid "" +"Return an iterator over the keys of the dictionary. This is a shortcut for " +"``iter(d.keys())``." +msgstr "返回以字典的键为元素的迭代器。这是 ``iter(d.keys())`` 的快捷方式。" + +#: ../../library/stdtypes.rst:5445 +msgid "Remove all items from the dictionary." +msgstr "移除字典中的所有元素。" + +#: ../../library/stdtypes.rst:5449 +msgid "Return a shallow copy of the dictionary." +msgstr "返回原字典的浅拷贝。" + +#: ../../library/stdtypes.rst:5453 +msgid "" +"Create a new dictionary with keys from *iterable* and values set to *value*." +msgstr "使用来自 *iterable* 的键创建一个新字典,并将键值设为 *value*。" + +#: ../../library/stdtypes.rst:5455 +msgid "" +":meth:`fromkeys` is a class method that returns a new dictionary. *value* " +"defaults to ``None``. All of the values refer to just a single instance, so" +" it generally doesn't make sense for *value* to be a mutable object such as " +"an empty list. To get distinct values, use a :ref:`dict comprehension " +"` instead." +msgstr "" +":meth:`fromkeys` 是一个返回新字典的类方法。 *value* 默认为 ``None``。所有值都只引用一个单独的实例,因此让 " +"*value* 成为一个可变对象例如空列表通常是没有意义的。要获取不同的值,请改用 :ref:`字典推导式 `。" + +#: ../../library/stdtypes.rst:5463 +msgid "" +"Return the value for *key* if *key* is in the dictionary, else *default*. If" +" *default* is not given, it defaults to ``None``, so that this method never " +"raises a :exc:`KeyError`." +msgstr "" +"如果 *key* 存在于字典中则返回 *key* 的值,否则返回 *default*。如果 *default* 未给出则默认为 " +"``None``,因而此方法绝不会引发 :exc:`KeyError`。" + +#: ../../library/stdtypes.rst:5469 +msgid "" +"Return a new view of the dictionary's items (``(key, value)`` pairs). See " +"the :ref:`documentation of view objects `." +msgstr "返回由字典项 (``(键,值)`` 对) 组成的一个新视图。参见 :ref:`视图对象文档 `。" + +#: ../../library/stdtypes.rst:5474 +msgid "" +"Return a new view of the dictionary's keys. See the :ref:`documentation of " +"view objects `." +msgstr "返回由字典键组成的一个新视图。参见 :ref:`视图对象文档 `。" + +#: ../../library/stdtypes.rst:5480 +msgid "" +"If *key* is in the dictionary, remove it and return its value, else return " +"*default*. If *default* is not given and *key* is not in the dictionary, a " +":exc:`KeyError` is raised." +msgstr "" +"如果 *key* 存在于字典中则将其移除并返回其值,否则返回 *default*。如果 *default* 未给出且 *key* " +"不存在于字典中,则会引发 :exc:`KeyError`。" + +#: ../../library/stdtypes.rst:5486 +msgid "" +"Remove and return a ``(key, value)`` pair from the dictionary. Pairs are " +"returned in :abbr:`LIFO (last-in, first-out)` order." +msgstr "从字典中移除并返回一个 ``(键,值)`` 对。键值对会按 :abbr:`LIFO (后进先出)` 的顺序被返回。" + +#: ../../library/stdtypes.rst:5489 +msgid "" +":meth:`popitem` is useful to destructively iterate over a dictionary, as " +"often used in set algorithms. If the dictionary is empty, calling " +":meth:`popitem` raises a :exc:`KeyError`." +msgstr "" +":meth:`popitem` 适用于对字典进行消耗性的迭代,这在集合算法中经常被使用。如果字典为空,调用 :meth:`popitem` 将引发 " +":exc:`KeyError`." + +#: ../../library/stdtypes.rst:5493 +msgid "" +"LIFO order is now guaranteed. In prior versions, :meth:`popitem` would " +"return an arbitrary key/value pair." +msgstr "现在会确保采用 LIFO 顺序。在之前的版本中,:meth:`popitem` 会返回一个任意的键/值对。" + +#: ../../library/stdtypes.rst:5499 +msgid "" +"Return a reverse iterator over the keys of the dictionary. This is a " +"shortcut for ``reversed(d.keys())``." +msgstr "返回一个逆序获取字典键的迭代器。这是 ``reversed(d.keys())`` 的快捷方式。" + +#: ../../library/stdtypes.rst:5506 +msgid "" +"If *key* is in the dictionary, return its value. If not, insert *key* with " +"a value of *default* and return *default*. *default* defaults to ``None``." +msgstr "" +"如果字典存在键 *key* ,返回它的值。如果不存在,插入值为 *default* 的键 *key* ,并返回 *default* 。 " +"*default* 默认为 ``None``。" + +#: ../../library/stdtypes.rst:5514 +msgid "" +"Update the dictionary with the key/value pairs from *mapping* or *iterable* " +"and *kwargs*, overwriting existing keys. Return ``None``." +msgstr "使用 *mapping* 或 *iterable* 以及 *kwargs* 中的键值对更新字典,并覆盖现有键。返回 ``None``。" + +#: ../../library/stdtypes.rst:5517 +msgid "" +":meth:`update` accepts either another object with a ``keys()`` method (in " +"which case :meth:`~object.__getitem__` is called with every key returned " +"from the method) or an iterable of key/value pairs (as tuples or other " +"iterables of length two). If keyword arguments are specified, the dictionary" +" is then updated with those key/value pairs: ``d.update(red=1, blue=2)``." +msgstr "" +":meth:`update` 接受另一个具有 ``keys()`` 方法的对象(在此情况下 :meth:`~object.__getitem__` " +"将被调用并附带从该方法返回的键)或一个包含键/值对(以长度为二的元组或其他可迭代对象表示)的可迭代对象。 " +"如果指定了关键字参数,则会以其所对应的键/值对更新字典: ``d.update(red=1, blue=2)``。" + +#: ../../library/stdtypes.rst:5525 +msgid "" +"Return a new view of the dictionary's values. See the :ref:`documentation " +"of view objects `." +msgstr "返回由字典值组成的一个新视图。参见 :ref:`视图对象文档 `。" + +#: ../../library/stdtypes.rst:5528 +msgid "" +"An equality comparison between one ``dict.values()`` view and another will " +"always return ``False``. This also applies when comparing ``dict.values()`` " +"to itself::" +msgstr "" +"两个 ``dict.values()`` 视图之间的相等性比较将总是返回 ``False``。这在 ``dict.values()`` " +"与其自身比较时也同样适用::" + +#: ../../library/stdtypes.rst:5532 +msgid "" +">>> d = {'a': 1}\n" +">>> d.values() == d.values()\n" +"False" +msgstr "" +">>> d = {'a': 1}\n" +">>> d.values() == d.values()\n" +"False" + +#: ../../library/stdtypes.rst:5538 +msgid "" +"Create a new dictionary with the merged keys and values of *d* and *other*, " +"which must both be dictionaries. The values of *other* take priority when " +"*d* and *other* share keys." +msgstr "" +"合并 *d* 和 *other* 中的键和值来创建一个新的字典,两者必须都是字典。当 *d* 和 *other* 有相同键时, *other* " +"的值优先。" + +#: ../../library/stdtypes.rst:5546 +msgid "" +"Update the dictionary *d* with keys and values from *other*, which may be " +"either a :term:`mapping` or an :term:`iterable` of key/value pairs. The " +"values of *other* take priority when *d* and *other* share keys." +msgstr "" +"用 *other* 的键和值更新字典 *d* ,*other* 可以是 :term:`mapping` 或 :term:`iterable` " +"的键值对。当 *d* 和 *other* 有相同键时, *other* 的值优先。" + +#: ../../library/stdtypes.rst:5552 +msgid "Dictionaries and dictionary views are reversible. ::" +msgstr "字典和字典视图都是可逆的。 ::" + +#: ../../library/stdtypes.rst:5554 +msgid "" +">>> d = {\"one\": 1, \"two\": 2, \"three\": 3, \"four\": 4}\n" +">>> d\n" +"{'one': 1, 'two': 2, 'three': 3, 'four': 4}\n" +">>> list(reversed(d))\n" +"['four', 'three', 'two', 'one']\n" +">>> list(reversed(d.values()))\n" +"[4, 3, 2, 1]\n" +">>> list(reversed(d.items()))\n" +"[('four', 4), ('three', 3), ('two', 2), ('one', 1)]" +msgstr "" +">>> d = {\"one\": 1, \"two\": 2, \"three\": 3, \"four\": 4}\n" +">>> d\n" +"{'one': 1, 'two': 2, 'three': 3, 'four': 4}\n" +">>> list(reversed(d))\n" +"['four', 'three', 'two', 'one']\n" +">>> list(reversed(d.values()))\n" +"[4, 3, 2, 1]\n" +">>> list(reversed(d.items()))\n" +"[('four', 4), ('three', 3), ('two', 2), ('one', 1)]" + +#: ../../library/stdtypes.rst:5564 +msgid "Dictionaries are now reversible." +msgstr "字典现在是可逆的。" + +#: ../../library/stdtypes.rst:5569 +msgid "" +":class:`types.MappingProxyType` can be used to create a read-only view of a " +":class:`dict`." +msgstr ":class:`types.MappingProxyType` 可被用来创建一个 :class:`dict` 的只读视图。" + +#: ../../library/stdtypes.rst:5575 +msgid "" +"For detailed information on thread-safety guarantees for :class:`dict` " +"objects, see :ref:`thread-safety-dict`." +msgstr "" + +#: ../../library/stdtypes.rst:5582 +msgid "Dictionary view objects" +msgstr "字典视图对象" + +#: ../../library/stdtypes.rst:5584 +msgid "" +"The objects returned by :meth:`dict.keys`, :meth:`dict.values` and " +":meth:`dict.items` are *view objects*. They provide a dynamic view on the " +"dictionary's entries, which means that when the dictionary changes, the view" +" reflects these changes." +msgstr "" +"由 :meth:`dict.keys`, :meth:`dict.values` 和 :meth:`dict.items` 所返回的对象是 " +"*视图对象*。该对象提供字典条目的一个动态视图,这意味着当字典改变时,视图也会相应改变。" + +#: ../../library/stdtypes.rst:5589 +msgid "" +"Dictionary views can be iterated over to yield their respective data, and " +"support membership tests:" +msgstr "字典视图可以被迭代以产生与其对应的数据,并支持成员检测:" + +#: ../../library/stdtypes.rst:5594 +msgid "Return the number of entries in the dictionary." +msgstr "返回字典中的条目数。" + +#: ../../library/stdtypes.rst:5598 +msgid "" +"Return an iterator over the keys, values or items (represented as tuples of " +"``(key, value)``) in the dictionary." +msgstr "返回字典中的键、值或项(以 ``(键,值)`` 为元素的元组表示)的迭代器。" + +#: ../../library/stdtypes.rst:5601 +msgid "" +"Keys and values are iterated over in insertion order. This allows the " +"creation of ``(value, key)`` pairs using :func:`zip`: ``pairs = " +"zip(d.values(), d.keys())``. Another way to create the same list is ``pairs" +" = [(v, k) for (k, v) in d.items()]``." +msgstr "" +"键和值是按插入时的顺序进行迭代的。这样就允许使用 :func:`zip` 来创建 ``(value, key)`` 对: ``pairs = " +"zip(d.values(), d.keys())``。 另一个创建相同列表的方式是 ``pairs = [(v, k) for (k, v) in " +"d.items()]``." + +#: ../../library/stdtypes.rst:5606 +msgid "" +"Iterating views while adding or deleting entries in the dictionary may raise" +" a :exc:`RuntimeError` or fail to iterate over all entries." +msgstr "在添加或删除字典中的条目期间对视图进行迭代可能引发 :exc:`RuntimeError` 或者无法完全迭代所有条目。" + +#: ../../library/stdtypes.rst:5609 +msgid "Dictionary order is guaranteed to be insertion order." +msgstr "字典顺序会确保为插入顺序。" + +#: ../../library/stdtypes.rst:5614 +msgid "" +"Return ``True`` if *x* is in the underlying dictionary's keys, values or " +"items (in the latter case, *x* should be a ``(key, value)`` tuple)." +msgstr "如果 *x* 是对应字典中存在的键、值或项(在最后一种情况下 *x* 应为一个 ``(键,值)`` 元组)则返回 ``True``。" + +#: ../../library/stdtypes.rst:5619 +msgid "" +"Return a reverse iterator over the keys, values or items of the dictionary. " +"The view will be iterated in reverse order of the insertion." +msgstr "返回一个逆序获取字典键、值或项的迭代器。视图将按与插入时相反的顺序进行迭代。" + +#: ../../library/stdtypes.rst:5622 +msgid "Dictionary views are now reversible." +msgstr "字典视图现在是可逆的。" + +#: ../../library/stdtypes.rst:5627 +msgid "" +"Return a :class:`types.MappingProxyType` that wraps the original dictionary " +"to which the view refers." +msgstr "返回 :class:`types.MappingProxyType` 对象,封装了字典视图指向的原始字典。" + +#: ../../library/stdtypes.rst:5632 +msgid "" +"Keys views are set-like since their entries are unique and :term:`hashable`." +" Items views also have set-like operations since the (key, value) pairs are " +"unique and the keys are hashable. If all values in an items view are " +"hashable as well, then the items view can interoperate with other sets. " +"(Values views are not treated as set-like since the entries are generally " +"not unique.) For set-like views, all of the operations defined for the " +"abstract base class :class:`collections.abc.Set` are available (for example," +" ``==``, ``<``, or ``^``). While using set operators, set-like views accept" +" any iterable as the other operand, unlike sets which only accept sets as " +"the input." +msgstr "" +"键视图与集合类似因为其条目是唯一的并且为 :term:`hashable`。条视图也有类似集合的操作因为 (键,值) 对是唯一的并且键是可哈希的。 " +"如果条目视图中的所有值也都是可哈希的,那么条目视图就可以与其他集合执行互操作。 (值视图不会被认为与集合类似因为条目通常不是唯一的)。 " +"对于与集合类似的视图,可以使用为抽象基类 :class:`collections.abc.Set` 定义的所有操作(例如,``==``, ``<`` 或" +" ``^`` 等)。虽然使用了集合运算符,但与集合类似的视图接受任何可迭代对象作为其操作数,而不像集合那样只接受集合作为输入。" + +#: ../../library/stdtypes.rst:5644 +msgid "An example of dictionary view usage::" +msgstr "一个使用字典视图的示例::" + +#: ../../library/stdtypes.rst:5646 +msgid "" +">>> dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}\n" +">>> keys = dishes.keys()\n" +">>> values = dishes.values()\n" +"\n" +">>> # iteration\n" +">>> n = 0\n" +">>> for val in values:\n" +"... n += val\n" +"...\n" +">>> print(n)\n" +"504\n" +"\n" +">>> # keys and values are iterated over in the same order (insertion order)\n" +">>> list(keys)\n" +"['eggs', 'sausage', 'bacon', 'spam']\n" +">>> list(values)\n" +"[2, 1, 1, 500]\n" +"\n" +">>> # view objects are dynamic and reflect dict changes\n" +">>> del dishes['eggs']\n" +">>> del dishes['sausage']\n" +">>> list(keys)\n" +"['bacon', 'spam']\n" +"\n" +">>> # set operations\n" +">>> keys & {'eggs', 'bacon', 'salad'}\n" +"{'bacon'}\n" +">>> keys ^ {'sausage', 'juice'} == {'juice', 'sausage', 'bacon', 'spam'}\n" +"True\n" +">>> keys | ['juice', 'juice', 'juice'] == {'bacon', 'spam', 'juice'}\n" +"True\n" +"\n" +">>> # get back a read-only proxy for the original dictionary\n" +">>> values.mapping\n" +"mappingproxy({'bacon': 1, 'spam': 500})\n" +">>> values.mapping['spam']\n" +"500" +msgstr "" +">>> dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}\n" +">>> keys = dishes.keys()\n" +">>> values = dishes.values()\n" +"\n" +">>> # 迭代\n" +">>> n = 0\n" +">>> for val in values:\n" +"... n += val\n" +"...\n" +">>> print(n)\n" +"504\n" +"\n" +">>> # 键和值将以相同顺序(插入顺序)被迭代\n" +">>> list(keys)\n" +"['eggs', 'sausage', 'bacon', 'spam']\n" +">>> list(values)\n" +"[2, 1, 1, 500]\n" +"\n" +">>> # 视图对象是动态的并会反映字典的改变\n" +">>> del dishes['eggs']\n" +">>> del dishes['sausage']\n" +">>> list(keys)\n" +"['bacon', 'spam']\n" +"\n" +">>> # 集合运算\n" +">>> keys & {'eggs', 'bacon', 'salad'}\n" +"{'bacon'}\n" +">>> keys ^ {'sausage', 'juice'} == {'juice', 'sausage', 'bacon', 'spam'}\n" +"True\n" +">>> keys | ['juice', 'juice', 'juice'] == {'bacon', 'spam', 'juice'}\n" +"True\n" +"\n" +">>> # 获取原始字典的只读代理\n" +">>> values.mapping\n" +"mappingproxy({'bacon': 1, 'spam': 500})\n" +">>> values.mapping['spam']\n" +"500" + +#: ../../library/stdtypes.rst:5688 +msgid "Context Manager Types" +msgstr "上下文管理器类型" + +#: ../../library/stdtypes.rst:5695 +msgid "" +"Python's :keyword:`with` statement supports the concept of a runtime context" +" defined by a context manager. This is implemented using a pair of methods " +"that allow user-defined classes to define a runtime context that is entered " +"before the statement body is executed and exited when the statement ends:" +msgstr "" +"Python 的 :keyword:`with` 语句支持通过上下文管理器所定义的运行时上下文这一概念。 " +"此对象的实现使用了一对专门方法,允许用户自定义类来定义运行时上下文,在语句体被执行前进入该上下文,并在语句执行完毕时退出该上下文:" + +#: ../../library/stdtypes.rst:5703 +msgid "" +"Enter the runtime context and return either this object or another object " +"related to the runtime context. The value returned by this method is bound " +"to the identifier in the :keyword:`!as` clause of :keyword:`with` statements" +" using this context manager." +msgstr "" +"进入运行时上下文并返回此对象或关联到该运行时上下文的其他对象。此方法的返回值会绑定到使用此上下文管理器的 :keyword:`with` 语句的 " +":keyword:`!as` 子句中的标识符。" + +#: ../../library/stdtypes.rst:5708 +msgid "" +"An example of a context manager that returns itself is a :term:`file " +"object`. File objects return themselves from __enter__() to allow " +":func:`open` to be used as the context expression in a :keyword:`with` " +"statement." +msgstr "" +"一个返回其自身的上下文管理器的例子是 :term:`file object`。文件对象会从 __enter__() 返回其自身,以允许 " +":func:`open` 被用作 :keyword:`with` 语句中的上下文表达式。" + +#: ../../library/stdtypes.rst:5712 +msgid "" +"An example of a context manager that returns a related object is the one " +"returned by :func:`decimal.localcontext`. These managers set the active " +"decimal context to a copy of the original decimal context and then return " +"the copy. This allows changes to be made to the current decimal context in " +"the body of the :keyword:`with` statement without affecting code outside the" +" :keyword:`!with` statement." +msgstr "" +"一个返回关联对象的上下文管理器的例子是 :func:`decimal.localcontext` 所返回的对象。此种管理器会将活动的 decimal " +"上下文设为原始 decimal 上下文的一个副本并返回该副本。这允许对 :keyword:`with` 语句的语句体中的当前 decimal " +"上下文进行更改,而不会影响 :keyword:`!with` 语句以外的代码。" + +#: ../../library/stdtypes.rst:5722 +msgid "" +"Exit the runtime context and return a Boolean flag indicating if any " +"exception that occurred should be suppressed. If an exception occurred while" +" executing the body of the :keyword:`with` statement, the arguments contain " +"the exception type, value and traceback information. Otherwise, all three " +"arguments are ``None``." +msgstr "" +"退出运行时上下文并返回一个布尔值旗标来表明所发生的任何异常是否应当被屏蔽。如果在执行 :keyword:`with` " +"语句的语句体期间发生了异常,则参数会包含异常的类型、值以及回溯信息。在其他情况下三个参数均为 ``None``。" + +#: ../../library/stdtypes.rst:5727 +msgid "" +"Returning a true value from this method will cause the :keyword:`with` " +"statement to suppress the exception and continue execution with the " +"statement immediately following the :keyword:`!with` statement. Otherwise " +"the exception continues propagating after this method has finished " +"executing." +msgstr "" +"从这个方法返回真值将导致 :keyword:`with` 语句屏蔽异常并继续执行紧随在 :keyword:`!with` 语句之后的语句。 " +"否则异常将在此方法结束执行后继续传播。" + +#: ../../library/stdtypes.rst:5732 +msgid "" +"If this method raises an exception while handling an earlier exception from " +"the :keyword:`with` block, the new exception is raised, and the original " +"exception is stored in its :attr:`~BaseException.__context__` attribute." +msgstr "" +"如果在处理先前来自 :keyword:`with` 代码块的异常期间此方法又引发了异常,新的异常将被引发,旧的异常将被存储在其 " +":attr:`~BaseException.__context__` 属性中。" + +#: ../../library/stdtypes.rst:5736 +msgid "" +"The exception passed in should never be reraised explicitly - instead, this " +"method should return a false value to indicate that the method completed " +"successfully and does not want to suppress the raised exception. This allows" +" context management code to easily detect whether or not an " +":meth:`~object.__exit__` method has actually failed." +msgstr "" +"传入的异常绝对不应当被显式地重新引发 —— 相反地,此方法应当返回一个假值以表明方法已成功完成并且不希望屏蔽被引发的异常。 " +"这允许上下文管理代码方便地检测 :meth:`~object.__exit__` 方法是否确实已失败。" + +#: ../../library/stdtypes.rst:5742 +msgid "" +"Python defines several context managers to support easy thread " +"synchronisation, prompt closure of files or other objects, and simpler " +"manipulation of the active decimal arithmetic context. The specific types " +"are not treated specially beyond their implementation of the context " +"management protocol. See the :mod:`contextlib` module for some examples." +msgstr "" +"Python 定义了一些上下文管理器来支持简易的线程同步、文件或其他对象的快速关闭,以及更方便地操作活动的十进制算术上下文。 " +"除了实现上下文管理协议以外,不同类型不会被特殊处理。请参阅 :mod:`contextlib` 模块查看相关的示例。" + +#: ../../library/stdtypes.rst:5748 +msgid "" +"Python's :term:`generator`\\s and the :class:`contextlib.contextmanager` " +"decorator provide a convenient way to implement these protocols. If a " +"generator function is decorated with the :class:`contextlib.contextmanager` " +"decorator, it will return a context manager implementing the necessary " +":meth:`~contextmanager.__enter__` and :meth:`~contextmanager.__exit__` " +"methods, rather than the iterator produced by an undecorated generator " +"function." +msgstr "" +"Python 的 :term:`generator` 和 :class:`contextlib.contextmanager` " +"装饰器提供了实现这些协议的便捷方式。如果使用 :class:`contextlib.contextmanager` " +"装饰器来装饰一个生成器函数,它将返回一个实现了必要的 :meth:`~contextmanager.__enter__` 和 " +":meth:`~contextmanager.__exit__` 方法的上下文管理器,而不再是由未经装饰的生成器所产生的迭代器。" + +#: ../../library/stdtypes.rst:5755 +msgid "" +"Note that there is no specific slot for any of these methods in the type " +"structure for Python objects in the Python/C API. Extension types wanting to" +" define these methods must provide them as a normal Python accessible " +"method. Compared to the overhead of setting up the runtime context, the " +"overhead of a single class dictionary lookup is negligible." +msgstr "" +"请注意,Python/C API 中 Python 对象的类型结构中并没有针对这些方法的专门槽位。想要定义这些方法的扩展类型必须将它们作为普通的 " +"Python 可访问方法来提供。与设置运行时上下文的开销相比,单个类字典查找的开销可以忽略不计。" + +#: ../../library/stdtypes.rst:5763 +msgid "" +"Type Annotation Types --- :ref:`Generic Alias `, " +":ref:`Union `" +msgstr "" +"类型注解的类型 --- :ref:`Generic Alias `、 :ref:`Union `" + +#: ../../library/stdtypes.rst:5768 +msgid "" +"The core built-in types for :term:`type annotations ` are " +":ref:`Generic Alias ` and :ref:`Union `." +msgstr "" +":term:`type annotations ` 的内置类型为 :ref:`Generic Alias` 和 :ref:`Union`。" + +#: ../../library/stdtypes.rst:5775 +msgid "Generic Alias Type" +msgstr "GenericAlias 类型" + +#: ../../library/stdtypes.rst:5781 +msgid "" +"``GenericAlias`` objects are generally created by :ref:`subscripting " +"` a class. They are most often used with :ref:`container " +"classes `, such as :class:`list` or :class:`dict`. For " +"example, ``list[int]`` is a ``GenericAlias`` object created by subscripting " +"the ``list`` class with the argument :class:`int`. ``GenericAlias`` objects " +"are intended primarily for use with :term:`type annotations `." +msgstr "" +"``GenericAlias`` 对象通常是通过 :ref:`抽取 ` 一个类来创建的。它们最常被用于 :ref:`容器类" +" `,如 :class:`list` 或 :class:`dict`。 举例来说,``list[int]`` 这个 " +"``GenericAlias`` 对象是通过附带 :class:`int` 参数抽取 ``list`` 类来创建的。``GenericAlias`` " +"对象的主要目的是用于 :term:`类型标注 `。" + +#: ../../library/stdtypes.rst:5791 +msgid "" +"It is generally only possible to subscript a class if the class implements " +"the special method :meth:`~object.__class_getitem__`." +msgstr "通常一个类只有在实现了特殊方法 :meth:`~object.__class_getitem__` 时才支持抽取操作。" + +#: ../../library/stdtypes.rst:5794 +msgid "" +"A ``GenericAlias`` object acts as a proxy for a :term:`generic type`, " +"implementing *parameterized generics*." +msgstr "``GenericAlias`` 对象可作为 :term:`generic type` 的代理,实现了 *形参化泛型*。" + +#: ../../library/stdtypes.rst:5797 +msgid "" +"For a container class, the argument(s) supplied to a :ref:`subscription " +"` of the class may indicate the type(s) of the elements an " +"object contains. For example, ``set[bytes]`` can be used in type annotations" +" to signify a :class:`set` in which all the elements are of type " +":class:`bytes`." +msgstr "" +"对于一个容器类,提供给类的 :ref:`抽取 ` 操作的参数可以指明对象所包含的元素类型。 " +"例如,``set[bytes]`` 可在类型标注中用来表示一个 :class:`set` 中的所有元素均为 :class:`bytes` 类型。" + +#: ../../library/stdtypes.rst:5803 +msgid "" +"For a class which defines :meth:`~object.__class_getitem__` but is not a " +"container, the argument(s) supplied to a subscription of the class will " +"often indicate the return type(s) of one or more methods defined on an " +"object. For example, :mod:`regular expressions ` can be used on both the" +" :class:`str` data type and the :class:`bytes` data type:" +msgstr "" +"对于一个定义了 :meth:`~object.__class_getitem__` " +"但不属于容器的类,提供给类的抽取操作的参数往往会指明在对象上定义的一个或多个方法的返回值类型。例如,:mod:`正则表达式 ` 可以被用在 " +":class:`str` 数据类型和 :class:`bytes` 数据类型上:" + +#: ../../library/stdtypes.rst:5809 +msgid "" +"If ``x = re.search('foo', 'foo')``, ``x`` will be a :ref:`re.Match ` object where the return values of ``x.group(0)`` and ``x[0]`` will" +" both be of type :class:`str`. We can represent this kind of object in type " +"annotations with the ``GenericAlias`` ``re.Match[str]``." +msgstr "" +"如果 ``x = re.search('foo', 'foo')``,则 ``x`` 将为一个 :ref:`re.Match ` 对象而 ``x.group(0)`` 和 ``x[0]`` 的返回值将均为 :class:`str` 类型。 " +"我们可以在类型标注中使用 ``GenericAlias`` ``re.Match[str]`` 来代表这种对象。" + +#: ../../library/stdtypes.rst:5815 +msgid "" +"If ``y = re.search(b'bar', b'bar')``, (note the ``b`` for :class:`bytes`), " +"``y`` will also be an instance of ``re.Match``, but the return values of " +"``y.group(0)`` and ``y[0]`` will both be of type :class:`bytes`. In type " +"annotations, we would represent this variety of :ref:`re.Match ` objects with ``re.Match[bytes]``." +msgstr "" +"如果 ``y = re.search(b'bar', b'bar')``,(注意 ``b`` 表示 :class:`bytes`),则 ``y`` " +"也将为一个 ``re.Match`` 的实例,但 ``y.group(0)`` 和 ``y[0]`` 的返回值将均为 :class:`bytes` " +"类型。在类型标注中,我们将使用 ``re.Match[bytes]`` 来代表这种形式的 :ref:`re.Match `" +" 对象。" + +#: ../../library/stdtypes.rst:5821 +msgid "" +"``GenericAlias`` objects are instances of the class " +":class:`types.GenericAlias`, which can also be used to create " +"``GenericAlias`` objects directly. Specializations of user-defined " +":ref:`generic classes ` may not be instances of " +":class:`types.GenericAlias`, but they provide similar functionality." +msgstr "" + +#: ../../library/stdtypes.rst:5828 +msgid "" +"Creates a ``GenericAlias`` representing a type ``T`` parameterized by types " +"*X*, *Y*, and more depending on the ``T`` used. For example, a function " +"expecting a :class:`list` containing :class:`float` elements::" +msgstr "" +"创建一个代表由类型 *X*, *Y* 来参数化的类型 ``T`` 的 ``GenericAlias``,此类型会更依赖于所使用的 ``T``。 " +"例如,一个接受包含 :class:`float` 元素的 :class:`list` 的函数::" + +#: ../../library/stdtypes.rst:5833 +msgid "" +"def average(values: list[float]) -> float:\n" +" return sum(values) / len(values)" +msgstr "" +"def average(values: list[float]) -> float:\n" +" return sum(values) / len(values)" + +#: ../../library/stdtypes.rst:5836 +msgid "" +"Another example for :term:`mapping` objects, using a :class:`dict`, which is" +" a generic type expecting two type parameters representing the key type and " +"the value type. In this example, the function expects a ``dict`` with keys " +"of type :class:`str` and values of type :class:`int`::" +msgstr "" +"另一个例子是关于 :term:`mapping` 对象的,用到了 " +":class:`dict`,泛型的两个类型参数分别代表了键类型和值类型。本例中的函数需要一个 ``dict``,其键的类型为 " +":class:`str`,值的类型为 :class:`int`::" + +#: ../../library/stdtypes.rst:5841 +msgid "" +"def send_post_request(url: str, body: dict[str, int]) -> None:\n" +" ..." +msgstr "" +"def send_post_request(url: str, body: dict[str, int]) -> None:\n" +" ..." + +#: ../../library/stdtypes.rst:5844 +msgid "" +"The builtin functions :func:`isinstance` and :func:`issubclass` do not " +"accept ``GenericAlias`` types for their second argument::" +msgstr "" +"内置函数 :func:`isinstance` 和 :func:`issubclass` 不接受第二个参数为 ``GenericAlias`` 类型:" + +#: ../../library/stdtypes.rst:5847 +msgid "" +">>> isinstance([1, 2], list[str])\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"TypeError: isinstance() argument 2 cannot be a parameterized generic" +msgstr "" +">>> isinstance([1, 2], list[str])\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"TypeError: isinstance() argument 2 cannot be a parameterized generic" + +#: ../../library/stdtypes.rst:5852 +msgid "" +"The Python runtime does not enforce :term:`type annotations `. " +"This extends to generic types and their type parameters. When creating a " +"container object from a ``GenericAlias``, the elements in the container are " +"not checked against their type. For example, the following code is " +"discouraged, but will run without errors::" +msgstr "" +"Python 运行时不会强制执行 :term:`类型标注 `。这种行为扩展到了泛型及其类型形参。当由 " +"``GenericAlias`` 创建容器对象时,并不会检查容器中为元素指定的类型。例如,以下代码虽然不被鼓励,但运行时并不会报错::" + +#: ../../library/stdtypes.rst:5858 +msgid "" +">>> t = list[str]\n" +">>> t([1, 2, 3])\n" +"[1, 2, 3]" +msgstr "" +">>> t = list[str]\n" +">>> t([1, 2, 3])\n" +"[1, 2, 3]" + +#: ../../library/stdtypes.rst:5862 +msgid "" +"Furthermore, parameterized generics erase type parameters during object " +"creation::" +msgstr "不仅如此,在创建对象的过程中,应用了参数后的泛型还会抹除类型参数:" + +#: ../../library/stdtypes.rst:5865 +msgid "" +">>> t = list[str]\n" +">>> type(t)\n" +"\n" +"\n" +">>> l = t()\n" +">>> type(l)\n" +"" +msgstr "" +">>> t = list[str]\n" +">>> type(t)\n" +"\n" +"\n" +">>> l = t()\n" +">>> type(l)\n" +"" + +#: ../../library/stdtypes.rst:5873 +msgid "" +"Calling :func:`repr` or :func:`str` on a generic shows the parameterized " +"type::" +msgstr "在泛型上调用 :func:`repr` 或 :func:`str` 会显示应用参数之后的类型:" + +#: ../../library/stdtypes.rst:5875 +msgid "" +">>> repr(list[int])\n" +"'list[int]'\n" +"\n" +">>> str(list[int])\n" +"'list[int]'" +msgstr "" +">>> repr(list[int])\n" +"'list[int]'\n" +"\n" +">>> str(list[int])\n" +"'list[int]'" + +#: ../../library/stdtypes.rst:5881 +msgid "" +"The :meth:`~object.__getitem__` method of generic containers will raise an " +"exception to disallow mistakes like ``dict[str][str]``::" +msgstr "" +"调用泛型容器的 :meth:`~object.__getitem__` 方法将引发异常以防出现 ``dict[str][str]`` 之类的错误::" + +#: ../../library/stdtypes.rst:5884 +msgid "" +">>> dict[str][str]\n" +"Traceback (most recent call last):\n" +" ...\n" +"TypeError: dict[str] is not a generic class" +msgstr "" +">>> dict[str][str]\n" +"Traceback (most recent call last):\n" +" ...\n" +"TypeError: dict[str] is not a generic class" + +#: ../../library/stdtypes.rst:5889 +msgid "" +"However, such expressions are valid when :ref:`type variables ` " +"are used. The index must have as many elements as there are type variable " +"items in the ``GenericAlias`` object's :attr:`~genericalias.__args__`. ::" +msgstr "" +"不过,当使用了 :ref:`类型变量 ` 时这种表达式是有效的。索引必须有与 ``GenericAlias`` 对象的 " +":attr:`~genericalias.__args__` 中的类型变量条目数量相当的元素。 ::" + +#: ../../library/stdtypes.rst:5893 +msgid "" +">>> from typing import TypeVar\n" +">>> Y = TypeVar('Y')\n" +">>> dict[str, Y][int]\n" +"dict[str, int]" +msgstr "" +">>> from typing import TypeVar\n" +">>> Y = TypeVar('Y')\n" +">>> dict[str, Y][int]\n" +"dict[str, int]" + +#: ../../library/stdtypes.rst:5900 +msgid "Standard Generic Classes" +msgstr "标准泛型类" + +#: ../../library/stdtypes.rst:5902 +msgid "" +"The following standard library classes support parameterized generics. This " +"list is non-exhaustive." +msgstr "下列标准库类支持形参化的泛型。此列表并不是详尽无遗的。" + +#: ../../library/stdtypes.rst:5905 +msgid ":class:`tuple`" +msgstr ":class:`tuple`" + +#: ../../library/stdtypes.rst:5906 +msgid ":class:`list`" +msgstr ":class:`list`" + +#: ../../library/stdtypes.rst:5907 +msgid ":class:`dict`" +msgstr ":class:`dict`" + +#: ../../library/stdtypes.rst:5908 +msgid ":class:`set`" +msgstr ":class:`set`" + +#: ../../library/stdtypes.rst:5909 +msgid ":class:`frozenset`" +msgstr ":class:`frozenset`" + +#: ../../library/stdtypes.rst:5910 +msgid ":class:`type`" +msgstr ":class:`type`" + +#: ../../library/stdtypes.rst:5911 +msgid ":class:`asyncio.Future`" +msgstr ":class:`asyncio.Future`" + +#: ../../library/stdtypes.rst:5912 +msgid ":class:`asyncio.Task`" +msgstr ":class:`asyncio.Task`" + +#: ../../library/stdtypes.rst:5913 +msgid ":class:`collections.deque`" +msgstr ":class:`collections.deque`" + +#: ../../library/stdtypes.rst:5914 +msgid ":class:`collections.defaultdict`" +msgstr ":class:`collections.defaultdict`" + +#: ../../library/stdtypes.rst:5915 +msgid ":class:`collections.OrderedDict`" +msgstr ":class:`collections.OrderedDict`" + +#: ../../library/stdtypes.rst:5916 +msgid ":class:`collections.Counter`" +msgstr ":class:`collections.Counter`" + +#: ../../library/stdtypes.rst:5917 +msgid ":class:`collections.ChainMap`" +msgstr ":class:`collections.ChainMap`" + +#: ../../library/stdtypes.rst:5918 +msgid ":class:`collections.abc.Awaitable`" +msgstr ":class:`collections.abc.Awaitable`" + +#: ../../library/stdtypes.rst:5919 +msgid ":class:`collections.abc.Coroutine`" +msgstr ":class:`collections.abc.Coroutine`" + +#: ../../library/stdtypes.rst:5920 +msgid ":class:`collections.abc.AsyncIterable`" +msgstr ":class:`collections.abc.AsyncIterable`" + +#: ../../library/stdtypes.rst:5921 +msgid ":class:`collections.abc.AsyncIterator`" +msgstr ":class:`collections.abc.AsyncIterator`" + +#: ../../library/stdtypes.rst:5922 +msgid ":class:`collections.abc.AsyncGenerator`" +msgstr ":class:`collections.abc.AsyncGenerator`" + +#: ../../library/stdtypes.rst:5923 +msgid ":class:`collections.abc.Iterable`" +msgstr ":class:`collections.abc.Iterable`" + +#: ../../library/stdtypes.rst:5924 +msgid ":class:`collections.abc.Iterator`" +msgstr ":class:`collections.abc.Iterator`" + +#: ../../library/stdtypes.rst:5925 +msgid ":class:`collections.abc.Generator`" +msgstr ":class:`collections.abc.Generator`" + +#: ../../library/stdtypes.rst:5926 +msgid ":class:`collections.abc.Reversible`" +msgstr ":class:`collections.abc.Reversible`" + +#: ../../library/stdtypes.rst:5927 +msgid ":class:`collections.abc.Container`" +msgstr ":class:`collections.abc.Container`" + +#: ../../library/stdtypes.rst:5928 +msgid ":class:`collections.abc.Collection`" +msgstr ":class:`collections.abc.Collection`" + +#: ../../library/stdtypes.rst:5929 +msgid ":class:`collections.abc.Callable`" +msgstr ":class:`collections.abc.Callable`" + +#: ../../library/stdtypes.rst:5930 +msgid ":class:`collections.abc.Set`" +msgstr ":class:`collections.abc.Set`" + +#: ../../library/stdtypes.rst:5931 +msgid ":class:`collections.abc.MutableSet`" +msgstr ":class:`collections.abc.MutableSet`" + +#: ../../library/stdtypes.rst:5932 +msgid ":class:`collections.abc.Mapping`" +msgstr ":class:`collections.abc.Mapping`" + +#: ../../library/stdtypes.rst:5933 +msgid ":class:`collections.abc.MutableMapping`" +msgstr ":class:`collections.abc.MutableMapping`" + +#: ../../library/stdtypes.rst:5934 +msgid ":class:`collections.abc.Sequence`" +msgstr ":class:`collections.abc.Sequence`" + +#: ../../library/stdtypes.rst:5935 +msgid ":class:`collections.abc.MutableSequence`" +msgstr ":class:`collections.abc.MutableSequence`" + +#: ../../library/stdtypes.rst:5936 +msgid ":class:`collections.abc.ByteString`" +msgstr ":class:`collections.abc.ByteString`" + +#: ../../library/stdtypes.rst:5937 +msgid ":class:`collections.abc.MappingView`" +msgstr ":class:`collections.abc.MappingView`" + +#: ../../library/stdtypes.rst:5938 +msgid ":class:`collections.abc.KeysView`" +msgstr ":class:`collections.abc.KeysView`" + +#: ../../library/stdtypes.rst:5939 +msgid ":class:`collections.abc.ItemsView`" +msgstr ":class:`collections.abc.ItemsView`" + +#: ../../library/stdtypes.rst:5940 +msgid ":class:`collections.abc.ValuesView`" +msgstr ":class:`collections.abc.ValuesView`" + +#: ../../library/stdtypes.rst:5941 +msgid ":class:`contextlib.AbstractContextManager`" +msgstr ":class:`contextlib.AbstractContextManager`" + +#: ../../library/stdtypes.rst:5942 +msgid ":class:`contextlib.AbstractAsyncContextManager`" +msgstr ":class:`contextlib.AbstractAsyncContextManager`" + +#: ../../library/stdtypes.rst:5943 +msgid ":class:`dataclasses.Field`" +msgstr ":class:`dataclasses.Field`" + +#: ../../library/stdtypes.rst:5944 +msgid ":class:`functools.cached_property`" +msgstr ":class:`functools.cached_property`" + +#: ../../library/stdtypes.rst:5945 +msgid ":class:`functools.partialmethod`" +msgstr ":class:`functools.partialmethod`" + +#: ../../library/stdtypes.rst:5946 +msgid ":class:`os.PathLike`" +msgstr ":class:`os.PathLike`" + +#: ../../library/stdtypes.rst:5947 +msgid ":class:`queue.LifoQueue`" +msgstr ":class:`queue.LifoQueue`" + +#: ../../library/stdtypes.rst:5948 +msgid ":class:`queue.Queue`" +msgstr ":class:`queue.Queue`" + +#: ../../library/stdtypes.rst:5949 +msgid ":class:`queue.PriorityQueue`" +msgstr ":class:`queue.PriorityQueue`" + +#: ../../library/stdtypes.rst:5950 +msgid ":class:`queue.SimpleQueue`" +msgstr ":class:`queue.SimpleQueue`" + +#: ../../library/stdtypes.rst:5951 +msgid ":ref:`re.Pattern `" +msgstr ":ref:`re.Pattern `" + +#: ../../library/stdtypes.rst:5952 +msgid ":ref:`re.Match `" +msgstr ":ref:`re.Match `" + +#: ../../library/stdtypes.rst:5953 +msgid ":class:`shelve.BsdDbShelf`" +msgstr ":class:`shelve.BsdDbShelf`" + +#: ../../library/stdtypes.rst:5954 +msgid ":class:`shelve.DbfilenameShelf`" +msgstr ":class:`shelve.DbfilenameShelf`" + +#: ../../library/stdtypes.rst:5955 +msgid ":class:`shelve.Shelf`" +msgstr ":class:`shelve.Shelf`" + +#: ../../library/stdtypes.rst:5956 +msgid ":class:`types.MappingProxyType`" +msgstr ":class:`types.MappingProxyType`" + +#: ../../library/stdtypes.rst:5957 +msgid ":class:`weakref.WeakKeyDictionary`" +msgstr ":class:`weakref.WeakKeyDictionary`" + +#: ../../library/stdtypes.rst:5958 +msgid ":class:`weakref.WeakMethod`" +msgstr ":class:`weakref.WeakMethod`" + +#: ../../library/stdtypes.rst:5959 +msgid ":class:`weakref.WeakSet`" +msgstr ":class:`weakref.WeakSet`" + +#: ../../library/stdtypes.rst:5960 +msgid ":class:`weakref.WeakValueDictionary`" +msgstr ":class:`weakref.WeakValueDictionary`" + +#: ../../library/stdtypes.rst:5965 +msgid "Special Attributes of ``GenericAlias`` objects" +msgstr "``GenericAlias`` 对象的特殊属性" + +#: ../../library/stdtypes.rst:5967 +msgid "All parameterized generics implement special read-only attributes." +msgstr "应用参数后的泛型都实现了一些特殊的只读属性:" + +#: ../../library/stdtypes.rst:5971 +msgid "This attribute points at the non-parameterized generic class::" +msgstr "本属性指向未应用参数之前的泛型类:" + +#: ../../library/stdtypes.rst:5973 +msgid "" +">>> list[int].__origin__\n" +"" +msgstr "" +">>> list[int].__origin__\n" +"" + +#: ../../library/stdtypes.rst:5979 +msgid "" +"This attribute is a :class:`tuple` (possibly of length 1) of generic types " +"passed to the original :meth:`~object.__class_getitem__` of the generic " +"class::" +msgstr "" +"该属性是传给泛型类的原始 :meth:`~object.__class_getitem__` 的泛型所组成的 :class:`tuple` (长度可能为" +" 1)::" + +#: ../../library/stdtypes.rst:5983 +msgid "" +">>> dict[str, list[int]].__args__\n" +"(, list[int])" +msgstr "" +">>> dict[str, list[int]].__args__\n" +"(, list[int])" + +#: ../../library/stdtypes.rst:5989 +msgid "" +"This attribute is a lazily computed tuple (possibly empty) of unique type " +"variables found in ``__args__``::" +msgstr "该属性是延迟计算出来的一个元组(可能为空),包含了 ``__args__`` 中的类型变量。" + +#: ../../library/stdtypes.rst:5992 +msgid "" +">>> from typing import TypeVar\n" +"\n" +">>> T = TypeVar('T')\n" +">>> list[T].__parameters__\n" +"(~T,)" +msgstr "" +">>> from typing import TypeVar\n" +"\n" +">>> T = TypeVar('T')\n" +">>> list[T].__parameters__\n" +"(~T,)" + +#: ../../library/stdtypes.rst:6000 +msgid "" +"A ``GenericAlias`` object with :class:`typing.ParamSpec` parameters may not " +"have correct ``__parameters__`` after substitution because " +":class:`typing.ParamSpec` is intended primarily for static type checking." +msgstr "" +"带有参数 :class:`typing.ParamSpec` 的 ``GenericAlias`` 对象,在类型替换后其 " +"``__parameters__`` 可能会不准确,因为 :class:`typing.ParamSpec` 主要用于静态类型检查。" + +#: ../../library/stdtypes.rst:6007 +msgid "" +"A boolean that is true if the alias has been unpacked using the ``*`` " +"operator (see :data:`~typing.TypeVarTuple`)." +msgstr "一个布尔值,如果别名已使用 ``*`` 运算符进行解包则为真值 (参见 :data:`~typing.TypeVarTuple`)。" + +#: ../../library/stdtypes.rst:6015 +msgid ":pep:`484` - Type Hints" +msgstr ":pep:`484` —— 类型注解" + +#: ../../library/stdtypes.rst:6016 +msgid "Introducing Python's framework for type annotations." +msgstr "介绍 Python 中用于类型标注的框架。" + +#: ../../library/stdtypes.rst:6018 +msgid ":pep:`585` - Type Hinting Generics In Standard Collections" +msgstr ":pep:`585` - 标准多项集中的类型提示泛型" + +#: ../../library/stdtypes.rst:6019 +msgid "" +"Introducing the ability to natively parameterize standard-library classes, " +"provided they implement the special class method " +":meth:`~object.__class_getitem__`." +msgstr "介绍了对标准库类进行原生形参化的能力,只要它们实现了特殊的类方法 :meth:`~object.__class_getitem__`。" + +#: ../../library/stdtypes.rst:6023 +msgid "" +":ref:`Generics`, :ref:`user-defined generics ` and " +":class:`typing.Generic`" +msgstr "" +":ref:`Generics`, :ref:`用户自定义泛型 ` 和 " +":class:`typing.Generic`" + +#: ../../library/stdtypes.rst:6024 +msgid "" +"Documentation on how to implement generic classes that can be parameterized " +"at runtime and understood by static type-checkers." +msgstr "有关如何实现可在运行时被形参化并能被静态类型检查器所识别的泛用类的文档。" + +#: ../../library/stdtypes.rst:6033 +msgid "Union Type" +msgstr "union 类型" + +#: ../../library/stdtypes.rst:6039 +msgid "" +"A union object holds the value of the ``|`` (bitwise or) operation on " +"multiple :ref:`type objects `. These types are intended" +" primarily for :term:`type annotations `. The union type " +"expression enables cleaner type hinting syntax compared to subscripting " +":class:`typing.Union`." +msgstr "" +"union 对象包含了在多个 :ref:`类型对象 ` 上执行 ``|`` (按位或) 运算后的值。 " +"这些类型主要用于 :term:`类型注解 `。与 :class:`typing.Union` " +"下标相比,联合类型表达式可以实现更简洁的类型提示语法。" + +#: ../../library/stdtypes.rst:6046 +msgid "" +"Defines a union object which holds types *X*, *Y*, and so forth. ``X | Y`` " +"means either X or Y. It is equivalent to ``typing.Union[X, Y]``. For " +"example, the following function expects an argument of type :class:`int` or " +":class:`float`::" +msgstr "" +"定义包含了 *X*、*Y* 等类型的 union 对象。``X | Y`` 表示 X 或 Y。相当于 ``typing.Union[X, Y]`` " +"。比如以下函数的参数应为类型 :class:`int` 或 :class:`float`:" + +#: ../../library/stdtypes.rst:6051 +msgid "" +"def square(number: int | float) -> int | float:\n" +" return number ** 2" +msgstr "" +"def square(number: int | float) -> int | float:\n" +" return number ** 2" + +#: ../../library/stdtypes.rst:6056 +msgid "" +"The ``|`` operand cannot be used at runtime to define unions where one or " +"more members is a forward reference. For example, ``int | \"Foo\"``, where " +"``\"Foo\"`` is a reference to a class not yet defined, will fail at runtime." +" For unions which include forward references, present the whole expression " +"as a string, e.g. ``\"int | Foo\"``." +msgstr "" +"不可在运行时使用 ``|`` 操作数来定义有一个或多个成员为前向引用的并集。 例如,``int | \"Foo\"``,其中 ``\"Foo\"`` " +"是指向某个尚未定义的类的引用,在运行时将会失败。 对于包括前向引用的并集,请将整个表达式用字符串来表示,例如 ``\"int | Foo\"``。" + +#: ../../library/stdtypes.rst:6064 +msgid "" +"Union objects can be tested for equality with other union objects. Details:" +msgstr "union 对象可与其他 union 对象进行比较。详细结果如下:" + +#: ../../library/stdtypes.rst:6066 +msgid "Unions of unions are flattened::" +msgstr "多次组合的结果会平推:" + +#: ../../library/stdtypes.rst:6068 +msgid "(int | str) | float == int | str | float" +msgstr "(int | str) | float == int | str | float" + +#: ../../library/stdtypes.rst:6070 +msgid "Redundant types are removed::" +msgstr "冗余的类型会被删除:" + +#: ../../library/stdtypes.rst:6072 +msgid "int | str | int == int | str" +msgstr "int | str | int == int | str" + +#: ../../library/stdtypes.rst:6074 +msgid "When comparing unions, the order is ignored::" +msgstr "在相互比较时,会忽略顺序:" + +#: ../../library/stdtypes.rst:6076 +msgid "int | str == str | int" +msgstr "int | str == str | int" + +#: ../../library/stdtypes.rst:6078 +msgid "It creates instances of :class:`typing.Union`::" +msgstr "它创建 :class:`typing.Union` 的实例::" + +#: ../../library/stdtypes.rst:6080 +msgid "" +"int | str == typing.Union[int, str]\n" +"type(int | str) is typing.Union" +msgstr "" +"int | str == typing.Union[int, str]\n" +"type(int | str) is typing.Union" + +#: ../../library/stdtypes.rst:6083 +msgid "Optional types can be spelled as a union with ``None``::" +msgstr "Optional 类型可表示为与 ``None`` 的组合。" + +#: ../../library/stdtypes.rst:6085 +msgid "str | None == typing.Optional[str]" +msgstr "str | None == typing.Optional[str]" + +#: ../../library/stdtypes.rst:6090 +msgid "" +"Calls to :func:`isinstance` and :func:`issubclass` are also supported with a" +" union object::" +msgstr ":func:`isinstance` 和 :func:`issubclass` 也支持 union 对象:" + +#: ../../library/stdtypes.rst:6093 +msgid "" +">>> isinstance(\"\", int | str)\n" +"True" +msgstr "" +">>> isinstance(\"\", int | str)\n" +"True" + +#: ../../library/stdtypes.rst:6096 +msgid "" +"However, :ref:`parameterized generics ` in union objects" +" cannot be checked::" +msgstr "但是联合对象中的 :ref:`参数化泛型 ` 将无法被检测::" + +#: ../../library/stdtypes.rst:6099 +msgid "" +">>> isinstance(1, int | list[int]) # short-circuit evaluation\n" +"True\n" +">>> isinstance([1], int | list[int])\n" +"Traceback (most recent call last):\n" +" ...\n" +"TypeError: isinstance() argument 2 cannot be a parameterized generic" +msgstr "" +">>> isinstance(1, int | list[int]) # 短路求值\n" +"True\n" +">>> isinstance([1], int | list[int])\n" +"Traceback (most recent call last):\n" +" ...\n" +"TypeError: isinstance() argument 2 cannot be a parameterized generic" + +#: ../../library/stdtypes.rst:6106 +msgid "" +"The user-exposed type for the union object can be accessed from " +":class:`typing.Union` and used for :func:`isinstance` checks::" +msgstr "" +"union 对象构成的用户类型可以经由 :class:`typing.Union` 访问,并可用于 :func:`isinstance` 检查::" + +#: ../../library/stdtypes.rst:6109 +msgid "" +">>> import typing\n" +">>> isinstance(int | str, typing.Union)\n" +"True\n" +">>> typing.Union()\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"TypeError: cannot create 'typing.Union' instances" +msgstr "" +">>> import typing\n" +">>> isinstance(int | str, typing.Union)\n" +"True\n" +">>> typing.Union()\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"TypeError: cannot create 'typing.Union' instances" + +#: ../../library/stdtypes.rst:6118 +msgid "" +"The :meth:`!__or__` method for type objects was added to support the syntax " +"``X | Y``. If a metaclass implements :meth:`!__or__`, the Union may " +"override it:" +msgstr "" +"为了支持 ``X | Y`` 语法,类型对象加入了 :meth:`!__or__` 方法。如果一个元类实现了 :meth:`!__or__`,Union" +" 可以重载它:" + +#: ../../library/stdtypes.rst:6122 +msgid "" +">>> class M(type):\n" +"... def __or__(self, other):\n" +"... return \"Hello\"\n" +"...\n" +">>> class C(metaclass=M):\n" +"... pass\n" +"...\n" +">>> C | int\n" +"'Hello'\n" +">>> int | C\n" +"int | C" +msgstr "" +">>> class M(type):\n" +"... def __or__(self, other):\n" +"... return \"Hello\"\n" +"...\n" +">>> class C(metaclass=M):\n" +"... pass\n" +"...\n" +">>> C | int\n" +"'Hello'\n" +">>> int | C\n" +"int | C" + +#: ../../library/stdtypes.rst:6138 +msgid ":pep:`604` -- PEP proposing the ``X | Y`` syntax and the Union type." +msgstr ":pep:`604` —— 提出了 ``X | Y`` 语法和 union 类型。" + +#: ../../library/stdtypes.rst:6144 +msgid "" +"Union objects are now instances of :class:`typing.Union`. Previously, they " +"were instances of :class:`types.UnionType`, which remains an alias for " +":class:`typing.Union`." +msgstr "" +"联合对象现在是 :class:`typing.Union` 的实例。在之前版本中,它们是 :class:`types.UnionType` " +"的实例,后者仍保留作为 :class:`typing.Union` 的别名。" + +#: ../../library/stdtypes.rst:6151 +msgid "Other Built-in Types" +msgstr "其他内置类型" + +#: ../../library/stdtypes.rst:6153 +msgid "" +"The interpreter supports several other kinds of objects. Most of these " +"support only one or two operations." +msgstr "解释器支持一些其他种类的对象。这些对象大都仅支持一两种操作。" + +#: ../../library/stdtypes.rst:6160 +msgid "Modules" +msgstr "模块" + +#: ../../library/stdtypes.rst:6162 +msgid "" +"The only special operation on a module is attribute access: ``m.name``, " +"where *m* is a module and *name* accesses a name defined in *m*'s symbol " +"table. Module attributes can be assigned to. (Note that the " +":keyword:`import` statement is not, strictly speaking, an operation on a " +"module object; ``import foo`` does not require a module object named *foo* " +"to exist, rather it requires an (external) *definition* for a module named " +"*foo* somewhere.)" +msgstr "" +"模块唯一的特殊操作是属性访问: ``m.name``,这里 *m* 为一个模块而 *name* 访问定义在 *m* 的符号表中的一个名称。 " +"模块属性可以被赋值。 (请注意 :keyword:`import` 语句严格来说也是对模块对象的一种操作;``import foo`` " +"不要求存在一个名为 *foo* 的模块对象,而是要求存在一个对于名为 *foo* 的模块的 (永久性) *定义*。)" + +#: ../../library/stdtypes.rst:6169 +msgid "" +"A special attribute of every module is :attr:`~object.__dict__`. This is the" +" dictionary containing the module's symbol table. Modifying this dictionary " +"will actually change the module's symbol table, but direct assignment to the" +" :attr:`~object.__dict__` attribute is not possible (you can write " +"``m.__dict__['a'] = 1``, which defines ``m.a`` to be ``1``, but you can't " +"write ``m.__dict__ = {}``). Modifying :attr:`~object.__dict__` directly is " +"not recommended." +msgstr "" +"每个模块都有一个特殊属性 :attr:`~object.__dict__`。这是包含模块的符号表的字典。 " +"修改此字典将实际改变模块的符号表,但是无法直接对 :attr:`~object.__dict__` 赋值 (你可以写 ``m.__dict__['a']" +" = 1``,这会将 ``m.a`` 定义为 ``1``,但是你不能写 ``m.__dict__ = {}``)。不建议直接修改 " +":attr:`~object.__dict__`." + +#: ../../library/stdtypes.rst:6177 +msgid "" +"Modules built into the interpreter are written like this: ````. If loaded from a file, they are written as ````." +msgstr "" +"内置于解释器中的模块会写成这样: ````。 如果是从一个文件加载,则会写成 ````。" + +#: ../../library/stdtypes.rst:6185 +msgid "Classes and Class Instances" +msgstr "类与类实例" + +#: ../../library/stdtypes.rst:6187 +msgid "See :ref:`objects` and :ref:`class` for these." +msgstr "关于这些类型请参阅 :ref:`objects` 和 :ref:`class`。" + +#: ../../library/stdtypes.rst:6193 +msgid "Functions" +msgstr "函数" + +#: ../../library/stdtypes.rst:6195 +msgid "" +"Function objects are created by function definitions. The only operation on" +" a function object is to call it: ``func(argument-list)``." +msgstr "函数对象是通过函数定义创建的。 对函数对象的唯一操作是调用它: ``func(argument-list)``。" + +#: ../../library/stdtypes.rst:6198 +msgid "" +"There are really two flavors of function objects: built-in functions and " +"user-defined functions. Both support the same operation (to call the " +"function), but the implementation is different, hence the different object " +"types." +msgstr "实际上存在两种不同的函数对象:内置函数和用户自定义函数。两者支持同样的操作(调用函数),但实现方式不同,因此对象类型也不同。" + +#: ../../library/stdtypes.rst:6202 +msgid "See :ref:`function` for more information." +msgstr "更多信息请参阅 :ref:`function`。" + +#: ../../library/stdtypes.rst:6208 +msgid "Methods" +msgstr "方法" + +#: ../../library/stdtypes.rst:6212 +msgid "" +"Methods are functions that are called using the attribute notation. There " +"are two flavors: :ref:`built-in methods ` (such as " +":meth:`~list.append` on lists) and :ref:`class instance method `. Built-in methods are described with the types that support them." +msgstr "" +"方法是使用属性表示法执行调用的函数。存在两种类别::ref:`内置方法 ` (如列表的 " +":meth:`~list.append`) 和 :ref:`类实例方法 `。内置方法由支持它们的类型来描述。" + +#: ../../library/stdtypes.rst:6218 +msgid "" +"If you access a method (a function defined in a class namespace) through an " +"instance, you get a special object: a :dfn:`bound method` (also called " +":ref:`instance method `) object. When called, it will add " +"the ``self`` argument to the argument list. Bound methods have two special " +"read-only attributes: :attr:`m.__self__ ` is the object on " +"which the method operates, and :attr:`m.__func__ ` is the " +"function implementing the method. Calling ``m(arg-1, arg-2, ..., arg-n)`` " +"is completely equivalent to calling ``m.__func__(m.__self__, arg-1, arg-2, " +"..., arg-n)``." +msgstr "" +"如果你通过一个实例来访问方法(即定义在类命名空间内的函数),你会得到一个特殊对象::dfn:`绑定方法` (或称 :ref:`实例方法 " +"`) 对象。当被调用时,它会将 ``self`` " +"参数添加到参数列表。绑定方法具有两个特殊的只读属性::attr:`m.__self__ ` 操作该方法的对象,而 " +":attr:`m.__func__ ` 是实现该方法的函数。调用 ``m(arg-1, arg-2, ..., " +"arg-n)`` 完全等价于调用 ``m.__func__(m.__self__, arg-1, arg-2, ..., arg-n)``。" + +#: ../../library/stdtypes.rst:6229 +msgid "" +"Like :ref:`function objects `, bound method objects " +"support getting arbitrary attributes. However, since method attributes are " +"actually stored on the underlying function object (:attr:`method.__func__`)," +" setting method attributes on bound methods is disallowed. Attempting to " +"set an attribute on a method results in an :exc:`AttributeError` being " +"raised. In order to set a method attribute, you need to explicitly set it " +"on the underlying function object:" +msgstr "" +"与 :ref:`函数对象 ` 类似,绑定方法对象也支持获取任意属性。 " +"但是,由于方法属性实际上保存于下层的函数对象中 (:attr:`method.__func__`),因此不允许设置绑定方法的方法属性。 " +"尝试设置方法的属性将会导致引发 :exc:`AttributeError`。想要设置方法属性,你必须在下层的函数对象中显式地设置它。" + +#: ../../library/stdtypes.rst:6237 +msgid "" +">>> class C:\n" +"... def method(self):\n" +"... pass\n" +"...\n" +">>> c = C()\n" +">>> c.method.whoami = 'my name is method' # can't set on the method\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"AttributeError: 'method' object has no attribute 'whoami'\n" +">>> c.method.__func__.whoami = 'my name is method'\n" +">>> c.method.whoami\n" +"'my name is method'" +msgstr "" +">>> class C:\n" +"... def method(self):\n" +"... pass\n" +"...\n" +">>> c = C()\n" +">>> c.method.whoami = 'my name is method' # can't set on the method\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"AttributeError: 'method' object has no attribute 'whoami'\n" +">>> c.method.__func__.whoami = 'my name is method'\n" +">>> c.method.whoami\n" +"'my name is method'" + +#: ../../library/stdtypes.rst:6252 +msgid "See :ref:`instance-methods` for more information." +msgstr "请参阅 :ref:`instance-methods` 了解更多信息。" + +#: ../../library/stdtypes.rst:6260 +msgid "Code Objects" +msgstr "代码对象" + +#: ../../library/stdtypes.rst:6266 +msgid "" +"Code objects are used by the implementation to represent \"pseudo-compiled\"" +" executable Python code such as a function body. They differ from function " +"objects because they don't contain a reference to their global execution " +"environment. Code objects are returned by the built-in :func:`compile` " +"function and can be extracted from function objects through their " +":attr:`~function.__code__` attribute. See also the :mod:`code` module." +msgstr "" +"代码对象被具体实现用来表示“伪编译”的可执行 Python 代码例如一个函数体。它们不同于函数对象,因为它们不包含对其全局执行环境的引用。 " +"代码对象由内置的 :func:`compile` 函数返回,并可通过函数对象的 :attr:`~function.__code__` 属性来提取。 " +"另请参阅 :mod:`code` 模块。" + +#: ../../library/stdtypes.rst:6273 +msgid "" +"Accessing :attr:`~function.__code__` raises an :ref:`auditing event " +"` ``object.__getattr__`` with arguments ``obj`` and " +"``\"__code__\"``." +msgstr "" +"访问 :attr:`~function.__code__` 会引发一个 :ref:`审计事件 ` " +"``object.__getattr__``,并附带参数 ``obj`` 和 ``\"__code__\"``。" + +#: ../../library/stdtypes.rst:6280 +msgid "" +"A code object can be executed or evaluated by passing it (instead of a " +"source string) to the :func:`exec` or :func:`eval` built-in functions." +msgstr "可以通过将代码对象(而非源码字符串)传给 :func:`exec` 或 :func:`eval` 内置函数来执行或求值。" + +#: ../../library/stdtypes.rst:6283 +msgid "See :ref:`types` for more information." +msgstr "更多信息请参阅 :ref:`types`。" + +#: ../../library/stdtypes.rst:6289 +msgid "Type Objects" +msgstr "类型对象" + +#: ../../library/stdtypes.rst:6295 +msgid "" +"Type objects represent the various object types. An object's type is " +"accessed by the built-in function :func:`type`. There are no special " +"operations on types. The standard module :mod:`types` defines names for all" +" standard built-in types." +msgstr "" +"类型对象表示各种对象类型。对象的类型可通过内置函数 :func:`type` 来获取。类型没有特殊的操作。标准库模块 :mod:`types` " +"定义了所有标准内置类型的名称。" + +#: ../../library/stdtypes.rst:6300 +msgid "Types are written like this: ````." +msgstr "类型以这样的写法来表示: ````。" + +#: ../../library/stdtypes.rst:6306 +msgid "The Null Object" +msgstr "空对象" + +#: ../../library/stdtypes.rst:6308 +msgid "" +"This object is returned by functions that don't explicitly return a value. " +"It supports no special operations. There is exactly one null object, named " +"``None`` (a built-in name). ``type(None)()`` produces the same singleton." +msgstr "" +"此对象会由不显式地返回值的函数所返回。它不支持任何特殊的操作。空对象只有一种值 ``None`` (这是个内置名称)。 ``type(None)()``" +" 会生成同一个单例。" + +#: ../../library/stdtypes.rst:6312 +msgid "It is written as ``None``." +msgstr "该对象的写法为 ``None``。" + +#: ../../library/stdtypes.rst:6319 +msgid "The Ellipsis Object" +msgstr "省略符对象" + +#: ../../library/stdtypes.rst:6321 +msgid "" +"This object is commonly used to indicate that something is omitted. It " +"supports no special operations. There is exactly one ellipsis object, named" +" :const:`Ellipsis` (a built-in name). ``type(Ellipsis)()`` produces the " +":const:`Ellipsis` singleton." +msgstr "" +"此对象通常被用于表示有内容被省略。它不支持任何特殊操作。只有一个 ellipsis 对象,名为 :const:`Ellipsis` " +"(属于内置名称)。``type(Ellipsis)()`` 将产生 :const:`Ellipsis` 单例。" + +#: ../../library/stdtypes.rst:6326 +msgid "It is written as ``Ellipsis`` or ``...``." +msgstr "该对象的写法为 ``Ellipsis`` 或 ``...``。" + +#: ../../library/stdtypes.rst:6328 +msgid "" +"In typical use, ``...`` as the ``Ellipsis`` object appears in a few " +"different places, for instance:" +msgstr "作为典型的用法,``...`` 在几个不同的场合中代表 ``Ellipsis`` 对象,例如:" + +#: ../../library/stdtypes.rst:6331 +msgid "" +"In type annotations, such as :ref:`callable arguments ` or :ref:`tuple elements `." +msgstr "" +"在类型注解中,例如 :ref:`可调用对象参数 ` 或 :ref:`元组元素 `." + +#: ../../library/stdtypes.rst:6334 +msgid "" +"As the body of a function instead of a :ref:`pass statement `." +msgstr "作为函数体,替代 :ref:`pass 语句 `。" + +#: ../../library/stdtypes.rst:6336 +msgid "" +"In third-party libraries, such as `Numpy's slicing and striding " +"`_." +msgstr "" +"在第三方库中,如 `NumPy 中的切片和步进 " +"`_." + +#: ../../library/stdtypes.rst:6339 +msgid "" +"Python also uses three dots in ways that are not ``Ellipsis`` objects, for " +"instance:" +msgstr "Python 还会以非 ``Ellipsis`` 对象的形式使用三个点,例如:" + +#: ../../library/stdtypes.rst:6341 +msgid "" +"Doctest's :const:`ELLIPSIS `, as a pattern for missing " +"content." +msgstr "Doctest 的 :const:`ELLIPSIS ` 选项,用作匹配缺失内容的模式。" + +#: ../../library/stdtypes.rst:6343 +msgid "" +"The default Python prompt of the :term:`interactive` shell when partial " +"input is incomplete." +msgstr "Python :term:`interactive` shell 在输入不完整时的默认提示符。" + +#: ../../library/stdtypes.rst:6345 +msgid "" +"Lastly, the Python documentation often uses three dots in conventional " +"English usage to mean omitted content, even in code examples that also use " +"them as the ``Ellipsis``." +msgstr "最后,Python 文档在传统英语用法中经常使用三个点表示省略内容,即使在那些同时使用 ``Ellipsis`` 的代码示例中也是如此。" + +#: ../../library/stdtypes.rst:6353 +msgid "The NotImplemented Object" +msgstr "未实现对象" + +#: ../../library/stdtypes.rst:6355 +msgid "" +"This object is returned from comparisons and binary operations when they are" +" asked to operate on types they don't support. See :ref:`comparisons` for " +"more information. There is exactly one :data:`NotImplemented` object. " +":code:`type(NotImplemented)()` produces the singleton instance." +msgstr "" +"此对象会被作为比较和二元运算被应用于它们所不支持的类型时的返回值。请参阅 :ref:`comparisons` 了解更多信息。未实现对象只有一种值 " +":data:`NotImplemented`。 :code:`type(NotImplemented)()` 会生成这个单例。" + +#: ../../library/stdtypes.rst:6360 +msgid "It is written as :code:`NotImplemented`." +msgstr "其写法为 :code:`NotImplemented`。" + +#: ../../library/stdtypes.rst:6366 +msgid "Internal Objects" +msgstr "内部对象" + +#: ../../library/stdtypes.rst:6368 +msgid "" +"See :ref:`types` for this information. It describes :ref:`stack frame " +"objects `, :ref:`traceback objects `, and " +"slice objects." +msgstr "" +"相关信息请参阅 :ref:`types`。其中描述了 :ref:`栈帧对象 `, :ref:`回溯对象 " +"` 以及切片对象等。" + +#: ../../library/stdtypes.rst:6376 +msgid "Special Attributes" +msgstr "特殊属性" + +#: ../../library/stdtypes.rst:6378 +msgid "" +"The implementation adds a few special read-only attributes to several object" +" types, where they are relevant. Some of these are not reported by the " +":func:`dir` built-in function." +msgstr "语言实现为部分对象类型添加了一些特殊的只读属性,它们具有各自的作用。其中一些并不会被 :func:`dir` 内置函数所列出。" + +#: ../../library/stdtypes.rst:6385 +msgid "" +"The name of the class, function, method, descriptor, or generator instance." +msgstr "类、函数、方法、描述器或生成器实例的名称。" + +#: ../../library/stdtypes.rst:6391 +msgid "" +"The :term:`qualified name` of the class, function, method, descriptor, or " +"generator instance." +msgstr "类、函数、方法、描述器或生成器实例的 :term:`qualified name`。" + +#: ../../library/stdtypes.rst:6399 +msgid "The name of the module in which a class or function was defined." +msgstr "类或函数定义所在的模块的名称。" + +#: ../../library/stdtypes.rst:6404 +msgid "" +"The documentation string of a class or function, or ``None`` if undefined." +msgstr "类或函数的文档字符串,如果未定义则为 ``None``。" + +#: ../../library/stdtypes.rst:6409 +msgid "" +"The :ref:`type parameters ` of generic classes, functions, and " +":ref:`type aliases `. For classes and functions that are not " +"generic, this will be an empty tuple." +msgstr "" +"泛型类、函数和 :ref:`类型别名 ` 的 :ref:`类型形参 `。 " +"对于非泛型类和函数,这将为空元组。" + +#: ../../library/stdtypes.rst:6419 +msgid "Integer string conversion length limitation" +msgstr "整数字符串转换长度限制" + +#: ../../library/stdtypes.rst:6421 +msgid "" +"CPython has a global limit for converting between :class:`int` and " +":class:`str` to mitigate denial of service attacks. This limit *only* " +"applies to decimal or other non-power-of-two number bases. Hexadecimal, " +"octal, and binary conversions are unlimited. The limit can be configured." +msgstr "" +"CPython 对于 :class:`int` 和 :class:`str` 之间的转换有一个全局限制以缓解拒绝服务攻击。此限制 *仅会* " +"作用于十进制或其他以非二的乘方为基数的数字。十六进制、八进制和二进制转换不受限制。该限制可以被配置。" + +#: ../../library/stdtypes.rst:6426 +msgid "" +"The :class:`int` type in CPython is an arbitrary length number stored in " +"binary form (commonly known as a \"bignum\"). There exists no algorithm that" +" can convert a string to a binary integer or a binary integer to a string in" +" linear time, *unless* the base is a power of 2. Even the best known " +"algorithms for base 10 have sub-quadratic complexity. Converting a large " +"value such as ``int('1' * 500_000)`` can take over a second on a fast CPU." +msgstr "" +":class:`int` 类型在 CPython 中是存储为二进制形式的任意长度的数字(通常称为“大数字”)。 " +"不存在可在线性时间内将一个字符串转换为二进制整数或将一个二进制整数转换为字符串的算法,*除非* 基数为 2 的乘方。对于基数为 10 " +"来说已知最好的算法也有亚二次方复杂度。转换一个大数值如 ``int('1' * 500_000)`` 在快速的 CPU 上也会花费一秒以上的时间。" + +#: ../../library/stdtypes.rst:6433 +msgid "" +"Limiting conversion size offers a practical way to avoid :cve:`2020-10735`." +msgstr "限制转换大小是一项避免 :cve:`2020-10735` 的务实解决方式。" + +#: ../../library/stdtypes.rst:6435 +msgid "" +"The limit is applied to the number of digit characters in the input or " +"output string when a non-linear conversion algorithm would be involved. " +"Underscores and the sign are not counted towards the limit." +msgstr "此限制会在可能涉及非线性转换算法时作用于输入或输出字符串中的数字型字符数量。下划线和正负号不计入限制数量。" + +#: ../../library/stdtypes.rst:6439 +msgid "" +"When an operation would exceed the limit, a :exc:`ValueError` is raised:" +msgstr "当一个操作会超出限制时,将引发 :exc:`ValueError`:" + +#: ../../library/stdtypes.rst:6441 +msgid "" +">>> import sys\n" +">>> sys.set_int_max_str_digits(4300) # Illustrative, this is the default.\n" +">>> _ = int('2' * 5432)\n" +"Traceback (most recent call last):\n" +"...\n" +"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\n" +">>> i = int('2' * 4300)\n" +">>> len(str(i))\n" +"4300\n" +">>> i_squared = i*i\n" +">>> len(str(i_squared))\n" +"Traceback (most recent call last):\n" +"...\n" +"ValueError: Exceeds the limit (4300 digits) for integer string conversion; use sys.set_int_max_str_digits() to increase the limit\n" +">>> len(hex(i_squared))\n" +"7144\n" +">>> assert int(hex(i_squared), base=16) == i*i # Hexadecimal is unlimited." +msgstr "" +">>> import sys\n" +">>> sys.set_int_max_str_digits(4300) # 含义如名称所示,这是默认值。\n" +">>> _ = int('2' * 5432)\n" +"Traceback (most recent call last):\n" +"...\n" +"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\n" +">>> i = int('2' * 4300)\n" +">>> len(str(i))\n" +"4300\n" +">>> i_squared = i*i\n" +">>> len(str(i_squared))\n" +"Traceback (most recent call last):\n" +"...\n" +"ValueError: Exceeds the limit (4300 digits) for integer string conversion; use sys.set_int_max_str_digits() to increase the limit\n" +">>> len(hex(i_squared))\n" +"7144\n" +">>> assert int(hex(i_squared), base=16) == i*i # 十六进制数没有限制。" + +#: ../../library/stdtypes.rst:6461 +msgid "" +"The default limit is 4300 digits as provided in " +":data:`sys.int_info.default_max_str_digits `. The lowest limit" +" that can be configured is 640 digits as provided in " +":data:`sys.int_info.str_digits_check_threshold `." +msgstr "" +"默认限制为 4300 位即 :data:`sys.int_info.default_max_str_digits ` 的值。" +" 最低限制可被配置为 640 位即 :data:`sys.int_info.str_digits_check_threshold " +"`." + +#: ../../library/stdtypes.rst:6466 +msgid "Verification:" +msgstr "验证:" + +#: ../../library/stdtypes.rst:6468 +msgid "" +">>> import sys\n" +">>> assert sys.int_info.default_max_str_digits == 4300, sys.int_info\n" +">>> assert sys.int_info.str_digits_check_threshold == 640, sys.int_info\n" +">>> msg = int('578966293710682886880994035146873798396722250538762761564'\n" +"... '9252925514383915483333812743580549779436104706260696366600'\n" +"... '571186405732').to_bytes(53, 'big')\n" +"..." +msgstr "" +">>> import sys\n" +">>> assert sys.int_info.default_max_str_digits == 4300, sys.int_info\n" +">>> assert sys.int_info.str_digits_check_threshold == 640, sys.int_info\n" +">>> msg = int('578966293710682886880994035146873798396722250538762761564'\n" +"... '9252925514383915483333812743580549779436104706260696366600'\n" +"... '571186405732').to_bytes(53, 'big')\n" +"..." + +#: ../../library/stdtypes.rst:6481 +msgid "Affected APIs" +msgstr "受影响的 API" + +#: ../../library/stdtypes.rst:6483 +msgid "" +"The limitation only applies to potentially slow conversions between " +":class:`int` and :class:`str` or :class:`bytes`:" +msgstr "此限制仅会作用于 :class:`int` 和 :class:`str` 和 :class:`bytes` 之间存在速度变慢可能的转换:" + +#: ../../library/stdtypes.rst:6486 +msgid "``int(string)`` with default base 10." +msgstr "``int(string)`` 默认以 10 为基数。" + +#: ../../library/stdtypes.rst:6487 +msgid "``int(string, base)`` for all bases that are not a power of 2." +msgstr "``int(string, base)`` 用于所有不为 2 的乘方的基数。" + +#: ../../library/stdtypes.rst:6488 +msgid "``str(integer)``." +msgstr "``str(integer)``." + +#: ../../library/stdtypes.rst:6489 +msgid "``repr(integer)``." +msgstr "``repr(integer)``." + +#: ../../library/stdtypes.rst:6490 +msgid "" +"any other string conversion to base 10, for example ``f\"{integer}\"``, " +"``\"{}\".format(integer)``, or ``b\"%d\" % integer``." +msgstr "" +"任何其他字符串转换都以 10 为基数,例如 ``f\"{integer}\"``, ``\"{}\".format(integer)`` 或 " +"``b\"%d\" % integer``。" + +#: ../../library/stdtypes.rst:6493 +msgid "The limitations do not apply to functions with a linear algorithm:" +msgstr "此限制不会作用于使用线性算法的函数:" + +#: ../../library/stdtypes.rst:6495 +msgid "``int(string, base)`` with base 2, 4, 8, 16, or 32." +msgstr "``int(string, base)`` 中 base 可以为 2, 4, 8, 16 或 32。" + +#: ../../library/stdtypes.rst:6496 +msgid ":func:`int.from_bytes` and :func:`int.to_bytes`." +msgstr ":func:`int.from_bytes` 和 :func:`int.to_bytes`。" + +#: ../../library/stdtypes.rst:6497 +msgid ":func:`hex`, :func:`oct`, :func:`bin`." +msgstr ":func:`hex`, :func:`oct`, :func:`bin`." + +#: ../../library/stdtypes.rst:6498 +msgid ":ref:`formatspec` for hex, octal, and binary numbers." +msgstr ":ref:`formatspec` 用于十六进制、八进制和二进制数。" + +#: ../../library/stdtypes.rst:6499 +msgid ":class:`str` to :class:`float`." +msgstr ":class:`str` 至 :class:`float`。" + +#: ../../library/stdtypes.rst:6500 +msgid ":class:`str` to :class:`decimal.Decimal`." +msgstr ":class:`str` 至 :class:`decimal.Decimal`。" + +#: ../../library/stdtypes.rst:6503 +msgid "Configuring the limit" +msgstr "配置限制值" + +#: ../../library/stdtypes.rst:6505 +msgid "" +"Before Python starts up you can use an environment variable or an " +"interpreter command line flag to configure the limit:" +msgstr "在 Python 启动之前你可以使用环境变量或解释器命令行旗标来配置限制值:" + +#: ../../library/stdtypes.rst:6508 +msgid "" +":envvar:`PYTHONINTMAXSTRDIGITS`, e.g. ``PYTHONINTMAXSTRDIGITS=640 python3`` " +"to set the limit to 640 or ``PYTHONINTMAXSTRDIGITS=0 python3`` to disable " +"the limitation." +msgstr "" +":envvar:`PYTHONINTMAXSTRDIGITS`,例如 ``PYTHONINTMAXSTRDIGITS=640 python3`` " +"是将限制设为 640 而 ``PYTHONINTMAXSTRDIGITS=0 python3`` 是禁用此限制。" + +#: ../../library/stdtypes.rst:6511 +msgid "" +":option:`-X int_max_str_digits <-X>`, e.g. ``python3 -X " +"int_max_str_digits=640``" +msgstr "" +":option:`-X int_max_str_digits <-X>`,例如 ``python3 -X " +"int_max_str_digits=640``" + +#: ../../library/stdtypes.rst:6513 +msgid "" +":data:`sys.flags.int_max_str_digits` contains the value of " +":envvar:`PYTHONINTMAXSTRDIGITS` or :option:`-X int_max_str_digits <-X>`. If " +"both the env var and the ``-X`` option are set, the ``-X`` option takes " +"precedence. A value of *-1* indicates that both were unset, thus a value of " +":data:`sys.int_info.default_max_str_digits` was used during initialization." +msgstr "" +":data:`sys.flags.int_max_str_digits` 包含 :envvar:`PYTHONINTMAXSTRDIGITS` 或 " +":option:`-X int_max_str_digits <-X>` 的值。如果环境变量和 ``-X`` 选项均有设置,则 ``-X`` " +"选项优先。值为 *-1* 表示两者均未设置,因此会在初始化时使用 :data:`sys.int_info.default_max_str_digits`" +" 的值。" + +#: ../../library/stdtypes.rst:6519 +msgid "" +"From code, you can inspect the current limit and set a new one using these " +":mod:`sys` APIs:" +msgstr "从代码中,你可以检查当前的限制并使用这些 :mod:`sys` API 来设置新值:" + +#: ../../library/stdtypes.rst:6522 +msgid "" +":func:`sys.get_int_max_str_digits` and :func:`sys.set_int_max_str_digits` " +"are a getter and setter for the interpreter-wide limit. Subinterpreters have" +" their own limit." +msgstr "" +":func:`sys.get_int_max_str_digits` 和 :func:`sys.set_int_max_str_digits` " +"是解释器级限制的读取器和设置器。子解释器具有它们自己的限制。" + +#: ../../library/stdtypes.rst:6526 +msgid "" +"Information about the default and minimum can be found in " +":data:`sys.int_info`:" +msgstr "有关默认值和最小值的信息可在 :data:`sys.int_info` 中找到:" + +#: ../../library/stdtypes.rst:6528 +msgid "" +":data:`sys.int_info.default_max_str_digits ` is the compiled-" +"in default limit." +msgstr ":data:`sys.int_info.default_max_str_digits ` 是已编译的默认限制。" + +#: ../../library/stdtypes.rst:6530 +msgid "" +":data:`sys.int_info.str_digits_check_threshold ` is the lowest" +" accepted value for the limit (other than 0 which disables it)." +msgstr "" +":data:`sys.int_info.str_digits_check_threshold ` " +"是该限制可接受的最低值(禁用该限制的 0 除外)。" + +#: ../../library/stdtypes.rst:6537 +msgid "" +"Setting a low limit *can* lead to problems. While rare, code exists that " +"contains integer constants in decimal in their source that exceed the " +"minimum threshold. A consequence of setting the limit is that Python source " +"code containing decimal integer literals longer than the limit will " +"encounter an error during parsing, usually at startup time or import time or" +" even at installation time - anytime an up to date ``.pyc`` does not already" +" exist for the code. A workaround for source that contains such large " +"constants is to convert them to ``0x`` hexadecimal form as it has no limit." +msgstr "" +"设置较低的限制值 *可能* 导致问题。虽然不常见,但还是会有在其源代码中包含超出最小阈值的十进制整数常量的代码存在。 " +"设置此限制的一个后果将是包含比此限制长的十进制整数字面值的 Python 源代码将在解析期间遇到错误,通常是在启动时或导入时甚至是在安装时 —— " +"只要对于某个代码还不存在已更新的 ``.pyc`` 就会发生。一种在包含此类大数值常量的源代码中绕过该问题的办法是将它们转换为不受限制的 ``0x`` " +"十六进制形式。" + +#: ../../library/stdtypes.rst:6546 +msgid "" +"Test your application thoroughly if you use a low limit. Ensure your tests " +"run with the limit set early via the environment or flag so that it applies " +"during startup and even during any installation step that may invoke Python " +"to precompile ``.py`` sources to ``.pyc`` files." +msgstr "" +"如果你使用了较低的限制则请要彻底地测试你的应用程序。确保你的测试通过环境变量或旗标尽早设置该限制来运行以便在启动期间甚至是在可能唤起 Python 来将" +" ``.py`` 源文件预编译为 ``.pyc`` 文件的任何安装步骤其间应用该限制。" + +#: ../../library/stdtypes.rst:6552 +msgid "Recommended configuration" +msgstr "推荐配置" + +#: ../../library/stdtypes.rst:6554 +msgid "" +"The default :data:`sys.int_info.default_max_str_digits` is expected to be " +"reasonable for most applications. If your application requires a different " +"limit, set it from your main entry point using Python version agnostic code " +"as these APIs were added in security patch releases in versions before 3.12." +msgstr "" +"默认的 :data:`sys.int_info.default_max_str_digits` 被预期对于大多数应用程序来说都是合理的。 " +"如果你的应用程序需要不同的限制值,请使用不预设 Python 版本的代码从你的主入口点进行设置,因为这些 API 是在 3.12 " +"之前的版本所发布的安全补丁中添加的。" + +#: ../../library/stdtypes.rst:6559 +msgid "Example::" +msgstr "示例:" + +#: ../../library/stdtypes.rst:6561 +msgid "" +">>> import sys\n" +">>> if hasattr(sys, \"set_int_max_str_digits\"):\n" +"... upper_bound = 68000\n" +"... lower_bound = 4004\n" +"... current_limit = sys.get_int_max_str_digits()\n" +"... if current_limit == 0 or current_limit > upper_bound:\n" +"... sys.set_int_max_str_digits(upper_bound)\n" +"... elif current_limit < lower_bound:\n" +"... sys.set_int_max_str_digits(lower_bound)" +msgstr "" +">>> import sys\n" +">>> if hasattr(sys, \"set_int_max_str_digits\"):\n" +"... upper_bound = 68000\n" +"... lower_bound = 4004\n" +"... current_limit = sys.get_int_max_str_digits()\n" +"... if current_limit == 0 or current_limit > upper_bound:\n" +"... sys.set_int_max_str_digits(upper_bound)\n" +"... elif current_limit < lower_bound:\n" +"... sys.set_int_max_str_digits(lower_bound)" + +#: ../../library/stdtypes.rst:6571 +msgid "If you need to disable it entirely, set it to ``0``." +msgstr "如果你需要完全禁用它,请将其设为 ``0``。" + +#: ../../library/stdtypes.rst:6575 +msgid "Footnotes" +msgstr "备注" + +#: ../../library/stdtypes.rst:6576 +msgid "" +"Additional information on these special methods may be found in the Python " +"Reference Manual (:ref:`customization`)." +msgstr "有关这些特殊方法的额外信息可参看 Python 参考指南 (:ref:`customization`)。" + +#: ../../library/stdtypes.rst:6579 +msgid "" +"As a consequence, the list ``[1, 2]`` is considered equal to ``[1.0, 2.0]``," +" and similarly for tuples." +msgstr "作为结果,列表 ``[1, 2]`` 与 ``[1.0, 2.0]`` 是相等的,元组的情况也类似。" + +#: ../../library/stdtypes.rst:6582 +msgid "They must have since the parser can't tell the type of the operands." +msgstr "必须如此,因为解析器无法判断操作数的类型。" + +#: ../../library/stdtypes.rst:6584 +msgid "" +"Cased characters are those with general category property being one of " +"\"Lu\" (Letter, uppercase), \"Ll\" (Letter, lowercase), or \"Lt\" (Letter, " +"titlecase)." +msgstr "" +"区分大小写的字符是指所属一般类别属性为 \"Lu\" (Letter, uppercase), \"Ll\" (Letter, lowercase) 或" +" \"Lt\" (Letter, titlecase) 之一的字符。" + +#: ../../library/stdtypes.rst:6587 +msgid "" +"To format only a tuple you should therefore provide a singleton tuple whose " +"only element is the tuple to be formatted." +msgstr "若只是要格式化一个元组,则应提供一个单例元组,其中只包含一个元素,就是需要格式化的那个元组。" + +#: ../../library/stdtypes.rst:13 +msgid "built-in" +msgstr "内置" + +#: ../../library/stdtypes.rst:13 ../../library/stdtypes.rst:332 +#: ../../library/stdtypes.rst:409 ../../library/stdtypes.rst:1002 +#: ../../library/stdtypes.rst:1192 ../../library/stdtypes.rst:1214 +#: ../../library/stdtypes.rst:1229 ../../library/stdtypes.rst:5285 +#: ../../library/stdtypes.rst:6291 +msgid "types" +msgstr "types" + +#: ../../library/stdtypes.rst:34 ../../library/stdtypes.rst:1229 +#: ../../library/stdtypes.rst:5285 +msgid "statement" +msgstr "statement -- 语句" + +#: ../../library/stdtypes.rst:34 +msgid "if" +msgstr "if" + +#: ../../library/stdtypes.rst:34 +msgid "while" +msgstr "while" + +#: ../../library/stdtypes.rst:34 +msgid "truth" +msgstr "真值" + +#: ../../library/stdtypes.rst:34 +msgid "value" +msgstr "value" + +#: ../../library/stdtypes.rst:34 ../../library/stdtypes.rst:83 +#: ../../library/stdtypes.rst:210 ../../library/stdtypes.rst:869 +msgid "Boolean" +msgstr "布尔值" + +#: ../../library/stdtypes.rst:34 ../../library/stdtypes.rst:83 +#: ../../library/stdtypes.rst:409 +msgid "operations" +msgstr "操作" + +#: ../../library/stdtypes.rst:34 +msgid "false" +msgstr "false" + +#: ../../library/stdtypes.rst:44 +msgid "true" +msgstr "true" + +#: ../../library/stdtypes.rst:54 +msgid "None (Built-in object)" +msgstr "None (内置对象)" + +#: ../../library/stdtypes.rst:54 +msgid "False (Built-in object)" +msgstr "False (内置对象)" + +#: ../../library/stdtypes.rst:66 ../../library/stdtypes.rst:100 +#: ../../library/stdtypes.rst:125 ../../library/stdtypes.rst:197 +#: ../../library/stdtypes.rst:251 ../../library/stdtypes.rst:409 +#: ../../library/stdtypes.rst:1002 +msgid "operator" +msgstr "operator" + +#: ../../library/stdtypes.rst:66 ../../library/stdtypes.rst:100 +msgid "or" +msgstr "or" + +#: ../../library/stdtypes.rst:66 ../../library/stdtypes.rst:100 +msgid "and" +msgstr "and" + +#: ../../library/stdtypes.rst:66 ../../library/stdtypes.rst:869 +msgid "False" +msgstr "False" + +#: ../../library/stdtypes.rst:66 ../../library/stdtypes.rst:869 +msgid "True" +msgstr "True" + +#: ../../library/stdtypes.rst:100 +msgid "not" +msgstr "not" + +#: ../../library/stdtypes.rst:125 +msgid "chaining" +msgstr "chaining" + +#: ../../library/stdtypes.rst:125 +msgid "comparisons" +msgstr "比较" + +#: ../../library/stdtypes.rst:125 +msgid "comparison" +msgstr "比较" + +#: ../../library/stdtypes.rst:125 +msgid "==" +msgstr "==" + +#: ../../library/stdtypes.rst:125 +msgid "< (less)" +msgstr "< (小于)" + +#: ../../library/stdtypes.rst:125 +msgid "<=" +msgstr "<=" + +#: ../../library/stdtypes.rst:125 +msgid "> (greater)" +msgstr "> (大于)" + +#: ../../library/stdtypes.rst:125 +msgid ">=" +msgstr ">=" + +#: ../../library/stdtypes.rst:125 +msgid "!=" +msgstr "!=" + +#: ../../library/stdtypes.rst:125 +msgid "is" +msgstr "is" + +#: ../../library/stdtypes.rst:125 +msgid "is not" +msgstr "is not" + +#: ../../library/stdtypes.rst:165 ../../library/stdtypes.rst:210 +#: ../../library/stdtypes.rst:986 ../../library/stdtypes.rst:1192 +#: ../../library/stdtypes.rst:1214 ../../library/stdtypes.rst:1379 +#: ../../library/stdtypes.rst:1465 ../../library/stdtypes.rst:1513 +#: ../../library/stdtypes.rst:1634 ../../library/stdtypes.rst:1764 +#: ../../library/stdtypes.rst:3288 ../../library/stdtypes.rst:3307 +#: ../../library/stdtypes.rst:3420 ../../library/stdtypes.rst:5067 +#: ../../library/stdtypes.rst:5285 ../../library/stdtypes.rst:5777 +#: ../../library/stdtypes.rst:6035 ../../library/stdtypes.rst:6210 +#: ../../library/stdtypes.rst:6255 +msgid "object" +msgstr "object -- 对象" + +#: ../../library/stdtypes.rst:165 ../../library/stdtypes.rst:210 +#: ../../library/stdtypes.rst:231 ../../library/stdtypes.rst:332 +#: ../../library/stdtypes.rst:351 +msgid "numeric" +msgstr "数字" + +#: ../../library/stdtypes.rst:165 +msgid "objects" +msgstr "objects" + +#: ../../library/stdtypes.rst:165 +msgid "comparing" +msgstr "比较" + +#: ../../library/stdtypes.rst:175 +msgid "__eq__() (instance method)" +msgstr "__eq__() (实例方法)" + +#: ../../library/stdtypes.rst:175 +msgid "__ne__() (instance method)" +msgstr "__ne__() (实例方法)" + +#: ../../library/stdtypes.rst:175 +msgid "__lt__() (instance method)" +msgstr "__lt__() (实例方法)" + +#: ../../library/stdtypes.rst:175 +msgid "__le__() (instance method)" +msgstr "__le__() (实例方法)" + +#: ../../library/stdtypes.rst:175 +msgid "__gt__() (instance method)" +msgstr "__gt__() (实例方法)" + +#: ../../library/stdtypes.rst:175 +msgid "__ge__() (instance method)" +msgstr "__ge__() (实例方法)" + +#: ../../library/stdtypes.rst:197 ../../library/stdtypes.rst:1002 +msgid "in" +msgstr "in" + +#: ../../library/stdtypes.rst:197 ../../library/stdtypes.rst:1002 +msgid "not in" +msgstr "not in" + +#: ../../library/stdtypes.rst:210 ../../library/stdtypes.rst:231 +#: ../../library/stdtypes.rst:409 +msgid "integer" +msgstr "integer" + +#: ../../library/stdtypes.rst:210 ../../library/stdtypes.rst:231 +msgid "floating-point" +msgstr "浮点数" + +#: ../../library/stdtypes.rst:210 ../../library/stdtypes.rst:231 +msgid "complex number" +msgstr "complex number -- 复数" + +#: ../../library/stdtypes.rst:210 +msgid "C" +msgstr "C" + +#: ../../library/stdtypes.rst:210 +msgid "language" +msgstr "语言" + +#: ../../library/stdtypes.rst:231 +msgid "literals" +msgstr "字面值" + +#: ../../library/stdtypes.rst:231 +msgid "hexadecimal" +msgstr "十六进制" + +#: ../../library/stdtypes.rst:231 +msgid "octal" +msgstr "八进制" + +#: ../../library/stdtypes.rst:231 +msgid "binary" +msgstr "二进制" + +#: ../../library/stdtypes.rst:251 +msgid "arithmetic" +msgstr "arithmetic" + +#: ../../library/stdtypes.rst:251 ../../library/stdtypes.rst:1002 +#: ../../library/stdtypes.rst:1192 ../../library/stdtypes.rst:5285 +#: ../../library/stdtypes.rst:6262 ../../library/stdtypes.rst:6276 +#: ../../library/stdtypes.rst:6291 +msgid "built-in function" +msgstr "内置函数" + +#: ../../library/stdtypes.rst:251 +msgid "int" +msgstr "int" + +#: ../../library/stdtypes.rst:251 +msgid "float" +msgstr "float" + +#: ../../library/stdtypes.rst:251 +msgid "complex" +msgstr "复数" + +#: ../../library/stdtypes.rst:251 ../../library/stdtypes.rst:3160 +#: ../../library/stdtypes.rst:4429 +msgid "+ (plus)" +msgstr "+ (加号)" + +#: ../../library/stdtypes.rst:251 +msgid "unary operator" +msgstr "单目运算符" + +#: ../../library/stdtypes.rst:251 +msgid "binary operator" +msgstr "双目运算符" + +#: ../../library/stdtypes.rst:251 ../../library/stdtypes.rst:3160 +#: ../../library/stdtypes.rst:4429 +msgid "- (minus)" +msgstr "- (减号)" + +#: ../../library/stdtypes.rst:251 ../../library/stdtypes.rst:3117 +#: ../../library/stdtypes.rst:4386 +msgid "* (asterisk)" +msgstr "* (星号)" + +#: ../../library/stdtypes.rst:251 +msgid "/ (slash)" +msgstr "/ (斜杠)" + +#: ../../library/stdtypes.rst:251 +msgid "//" +msgstr "//" + +#: ../../library/stdtypes.rst:251 ../../library/stdtypes.rst:3080 +#: ../../library/stdtypes.rst:4354 +msgid "% (percent)" +msgstr "% (百分号)" + +#: ../../library/stdtypes.rst:251 +msgid "**" +msgstr "**" + +#: ../../library/stdtypes.rst:332 ../../library/stdtypes.rst:409 +#: ../../library/stdtypes.rst:1002 ../../library/stdtypes.rst:1229 +#: ../../library/stdtypes.rst:5285 +msgid "operations on" +msgstr "运算目标" + +#: ../../library/stdtypes.rst:332 +msgid "conjugate() (complex number method)" +msgstr "conjugate() (复数方法)" + +#: ../../library/stdtypes.rst:351 ../../library/stdtypes.rst:1832 +#: ../../library/stdtypes.rst:3288 ../../library/stdtypes.rst:6291 +msgid "module" +msgstr "module" + +#: ../../library/stdtypes.rst:351 +msgid "math" +msgstr "math" + +#: ../../library/stdtypes.rst:351 +msgid "floor() (in module math)" +msgstr "floor() (在 math 模块中)" + +#: ../../library/stdtypes.rst:351 +msgid "ceil() (in module math)" +msgstr "ceil() (在 math 模块中)" + +#: ../../library/stdtypes.rst:351 +msgid "trunc() (in module math)" +msgstr "trunc() (在 math 模块中)" + +#: ../../library/stdtypes.rst:351 +msgid "conversions" +msgstr "转换" + +#: ../../library/stdtypes.rst:409 +msgid "bitwise" +msgstr "bitwise" + +#: ../../library/stdtypes.rst:409 +msgid "shifting" +msgstr "移位" + +#: ../../library/stdtypes.rst:409 +msgid "masking" +msgstr "掩码" + +#: ../../library/stdtypes.rst:409 +msgid "| (vertical bar)" +msgstr "| (竖线)" + +#: ../../library/stdtypes.rst:409 +msgid "^ (caret)" +msgstr "^ (脱字号)" + +#: ../../library/stdtypes.rst:409 +msgid "& (ampersand)" +msgstr "& (和号)" + +#: ../../library/stdtypes.rst:409 +msgid "<<" +msgstr "<<" + +#: ../../library/stdtypes.rst:409 +msgid ">>" +msgstr ">>" + +#: ../../library/stdtypes.rst:409 +msgid "~ (tilde)" +msgstr "~ (波浪号)" + +#: ../../library/stdtypes.rst:869 +msgid "values" +msgstr "values" + +#: ../../library/stdtypes.rst:899 +msgid "iterator protocol" +msgstr "迭代器协议" + +#: ../../library/stdtypes.rst:899 ../../library/stdtypes.rst:5690 +msgid "protocol" +msgstr "协议" + +#: ../../library/stdtypes.rst:899 +msgid "iterator" +msgstr "iterator -- 迭代器" + +#: ../../library/stdtypes.rst:899 ../../library/stdtypes.rst:986 +#: ../../library/stdtypes.rst:1002 ../../library/stdtypes.rst:1192 +#: ../../library/stdtypes.rst:1214 ../../library/stdtypes.rst:1229 +msgid "sequence" +msgstr "sequence" + +#: ../../library/stdtypes.rst:899 +msgid "iteration" +msgstr "迭代" + +#: ../../library/stdtypes.rst:899 +msgid "container" +msgstr "容器" + +#: ../../library/stdtypes.rst:899 +msgid "iteration over" +msgstr "迭代目标" + +#: ../../library/stdtypes.rst:1002 ../../library/stdtypes.rst:5285 +msgid "len" +msgstr "len" + +#: ../../library/stdtypes.rst:1002 +msgid "min" +msgstr "min" + +#: ../../library/stdtypes.rst:1002 +msgid "max" +msgstr "max" + +#: ../../library/stdtypes.rst:1002 +msgid "concatenation" +msgstr "拼接" + +#: ../../library/stdtypes.rst:1002 +msgid "operation" +msgstr "operation" + +#: ../../library/stdtypes.rst:1002 +msgid "repetition" +msgstr "重复" + +#: ../../library/stdtypes.rst:1002 ../../library/stdtypes.rst:1229 +msgid "subscript" +msgstr "下标" + +#: ../../library/stdtypes.rst:1002 ../../library/stdtypes.rst:1229 +msgid "slice" +msgstr "slice -- 切片" + +#: ../../library/stdtypes.rst:1049 +msgid "loop" +msgstr "循环" + +#: ../../library/stdtypes.rst:1049 +msgid "over mutable sequence" +msgstr "针对可变序列" + +#: ../../library/stdtypes.rst:1049 +msgid "mutable sequence" +msgstr "可变序列" + +#: ../../library/stdtypes.rst:1049 +msgid "loop over" +msgstr "循环" + +#: ../../library/stdtypes.rst:1192 +msgid "immutable" +msgstr "immutable -- 不可变对象" + +#: ../../library/stdtypes.rst:1192 ../../library/stdtypes.rst:1465 +msgid "tuple" +msgstr "元组" + +#: ../../library/stdtypes.rst:1192 +msgid "hash" +msgstr "hash" + +#: ../../library/stdtypes.rst:1214 +msgid "mutable" +msgstr "mutable -- 可变对象" + +#: ../../library/stdtypes.rst:1214 ../../library/stdtypes.rst:1229 +#: ../../library/stdtypes.rst:1379 +msgid "list" +msgstr "list" + +#: ../../library/stdtypes.rst:1214 ../../library/stdtypes.rst:3288 +#: ../../library/stdtypes.rst:3420 ../../library/stdtypes.rst:3535 +#: ../../library/stdtypes.rst:4354 +msgid "bytearray" +msgstr "bytearray" + +#: ../../library/stdtypes.rst:1229 ../../library/stdtypes.rst:5285 +#: ../../library/stdtypes.rst:6035 ../../library/stdtypes.rst:6291 +msgid "type" +msgstr "type" + +#: ../../library/stdtypes.rst:1229 +msgid "assignment" +msgstr "赋值" + +#: ../../library/stdtypes.rst:1229 ../../library/stdtypes.rst:5285 +msgid "del" +msgstr "del" + +#: ../../library/stdtypes.rst:1513 +msgid "range" +msgstr "range" + +#: ../../library/stdtypes.rst:1634 ../../library/stdtypes.rst:1777 +#: ../../library/stdtypes.rst:1824 ../../library/stdtypes.rst:2908 +#: ../../library/stdtypes.rst:3080 +msgid "string" +msgstr "string" + +#: ../../library/stdtypes.rst:1634 +msgid "text sequence type" +msgstr "文本序列类型" + +#: ../../library/stdtypes.rst:1634 ../../library/stdtypes.rst:1777 +#: ../../library/stdtypes.rst:1797 +msgid "str (built-in class)" +msgstr "str (内置类)" + +#: ../../library/stdtypes.rst:1634 +msgid "(see also string)" +msgstr "(另请参阅字符串)" + +#: ../../library/stdtypes.rst:1764 +msgid "io.StringIO" +msgstr "io.StringIO" + +#: ../../library/stdtypes.rst:1797 ../../library/stdtypes.rst:3280 +msgid "buffer protocol" +msgstr "缓冲协议" + +#: ../../library/stdtypes.rst:1797 ../../library/stdtypes.rst:3288 +#: ../../library/stdtypes.rst:3307 ../../library/stdtypes.rst:3535 +#: ../../library/stdtypes.rst:4354 +msgid "bytes" +msgstr "字节串" + +#: ../../library/stdtypes.rst:1824 ../../library/stdtypes.rst:3535 +msgid "methods" +msgstr "方法" + +#: ../../library/stdtypes.rst:1832 +msgid "re" +msgstr "re" + +#: ../../library/stdtypes.rst:2678 ../../library/stdtypes.rst:4208 +msgid "universal newlines" +msgstr "universal newlines -- 通用换行" + +#: ../../library/stdtypes.rst:2678 +msgid "str.splitlines method" +msgstr "str.splitlines 方法" + +#: ../../library/stdtypes.rst:2908 +msgid "! formatted string literal" +msgstr "! 格式化字符串字面值" + +#: ../../library/stdtypes.rst:2908 +msgid "formatted string literals" +msgstr "格式化字符串字面值" + +#: ../../library/stdtypes.rst:2908 +msgid "! f-string" +msgstr "! f-字符串" + +#: ../../library/stdtypes.rst:2908 +msgid "f-strings" +msgstr "f 字符串" + +#: ../../library/stdtypes.rst:2908 +msgid "fstring" +msgstr "fstring" + +#: ../../library/stdtypes.rst:2908 +msgid "interpolated string literal" +msgstr "插值字符串字面值" + +#: ../../library/stdtypes.rst:2908 +msgid "formatted literal" +msgstr "格式化字面值" + +#: ../../library/stdtypes.rst:2908 +msgid "interpolated literal" +msgstr "插值字面值" + +#: ../../library/stdtypes.rst:2908 +msgid "{} (curly brackets)" +msgstr "{} (花括号)" + +#: ../../library/stdtypes.rst:2908 +msgid "in formatted string literal" +msgstr "格式字符串字面值形式" + +#: ../../library/stdtypes.rst:2908 +msgid "! (exclamation mark)" +msgstr "! (叹号)" + +#: ../../library/stdtypes.rst:2908 +msgid ": (colon)" +msgstr ": (冒号)" + +#: ../../library/stdtypes.rst:2908 +msgid "= (equals)" +msgstr "= (等于号)" + +#: ../../library/stdtypes.rst:2908 +msgid "for help in debugging using string literals" +msgstr "用于帮助使用字符串字面值进行调试" + +#: ../../library/stdtypes.rst:3080 +msgid "formatting, string (%)" +msgstr "格式化,字符串 (%)" + +#: ../../library/stdtypes.rst:3080 +msgid "interpolation, string (%)" +msgstr "插值,字符串 (%)" + +#: ../../library/stdtypes.rst:3080 +msgid "formatting, printf" +msgstr "格式化,printf" + +#: ../../library/stdtypes.rst:3080 +msgid "interpolation, printf" +msgstr "插值,printf" + +#: ../../library/stdtypes.rst:3080 ../../library/stdtypes.rst:4354 +msgid "printf-style formatting" +msgstr "printf 风格的格式化" + +#: ../../library/stdtypes.rst:3080 ../../library/stdtypes.rst:4354 +msgid "sprintf-style formatting" +msgstr "sprintf 风格的格式化" + +#: ../../library/stdtypes.rst:3117 ../../library/stdtypes.rst:4386 +msgid "() (parentheses)" +msgstr "() (圆括号)" + +#: ../../library/stdtypes.rst:3117 ../../library/stdtypes.rst:3160 +#: ../../library/stdtypes.rst:4386 ../../library/stdtypes.rst:4429 +msgid "in printf-style formatting" +msgstr "使用 printf 风格的格式化" + +#: ../../library/stdtypes.rst:3117 ../../library/stdtypes.rst:4386 +msgid ". (dot)" +msgstr ". (点号)" + +#: ../../library/stdtypes.rst:3160 ../../library/stdtypes.rst:4429 +msgid "# (hash)" +msgstr "# (hash)" + +#: ../../library/stdtypes.rst:3160 ../../library/stdtypes.rst:4429 +msgid "space" +msgstr "space" + +#: ../../library/stdtypes.rst:3280 +msgid "binary sequence types" +msgstr "二进制序列类型" + +#: ../../library/stdtypes.rst:3288 +msgid "memoryview" +msgstr "memoryview" + +#: ../../library/stdtypes.rst:3288 +msgid "array" +msgstr "array" + +#: ../../library/stdtypes.rst:4208 +msgid "bytes.splitlines method" +msgstr "bytes.splitlines 方法" + +#: ../../library/stdtypes.rst:4208 +msgid "bytearray.splitlines method" +msgstr "bytearray.splitlines 方法" + +#: ../../library/stdtypes.rst:4354 +msgid "formatting" +msgstr "格式化" + +#: ../../library/stdtypes.rst:4354 +msgid "bytes (%)" +msgstr "bytes (%)" + +#: ../../library/stdtypes.rst:4354 +msgid "bytearray (%)" +msgstr "bytearray (%)" + +#: ../../library/stdtypes.rst:4354 +msgid "interpolation" +msgstr "插值" + +#: ../../library/stdtypes.rst:5067 +msgid "set" +msgstr "set" + +#: ../../library/stdtypes.rst:5285 +msgid "mapping" +msgstr "mapping -- 映射" + +#: ../../library/stdtypes.rst:5285 +msgid "dictionary" +msgstr "dictionary -- 字典" + +#: ../../library/stdtypes.rst:5395 +msgid "__missing__()" +msgstr "__missing__()" + +#: ../../library/stdtypes.rst:5690 +msgid "context manager" +msgstr "context manager -- 上下文管理器" + +#: ../../library/stdtypes.rst:5690 +msgid "context management protocol" +msgstr "上下文管理协议" + +#: ../../library/stdtypes.rst:5690 +msgid "context management" +msgstr "上下文管理" + +#: ../../library/stdtypes.rst:5765 +msgid "annotation" +msgstr "annotation -- 标注" + +#: ../../library/stdtypes.rst:5765 +msgid "type annotation; type hint" +msgstr "类型标注; 类型提示 type hint" + +#: ../../library/stdtypes.rst:5777 +msgid "GenericAlias" +msgstr "GenericAlias" + +#: ../../library/stdtypes.rst:5777 +msgid "Generic" +msgstr "Generic" + +#: ../../library/stdtypes.rst:5777 +msgid "Alias" +msgstr "Alias" + +#: ../../library/stdtypes.rst:6035 +msgid "Union" +msgstr "Union" + +#: ../../library/stdtypes.rst:6035 +msgid "union" +msgstr "union" + +#: ../../library/stdtypes.rst:6210 +msgid "method" +msgstr "method -- 方法" + +#: ../../library/stdtypes.rst:6255 +msgid "code" +msgstr "code -- 代码" + +#: ../../library/stdtypes.rst:6255 +msgid "code object" +msgstr "代码对象" + +#: ../../library/stdtypes.rst:6262 +msgid "compile" +msgstr "编译" + +#: ../../library/stdtypes.rst:6262 +msgid "__code__ (function object attribute)" +msgstr "__code__ (函数对象属性)" + +#: ../../library/stdtypes.rst:6276 +msgid "exec" +msgstr "exec" + +#: ../../library/stdtypes.rst:6276 +msgid "eval" +msgstr "eval" + +#: ../../library/stdtypes.rst:6315 +msgid "..." +msgstr "..." + +#: ../../library/stdtypes.rst:6315 +msgid "ellipsis literal" +msgstr "省略符字面值" diff --git a/library/string.po b/library/string.po new file mode 100644 index 0000000000..4ec8a8cfbf --- /dev/null +++ b/library/string.po @@ -0,0 +1,1742 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-09 16:24+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/string.rst:2 +msgid ":mod:`!string` --- Common string operations" +msgstr ":mod:`!string` --- 常见的字符串操作" + +#: ../../library/string.rst:7 +msgid "**Source code:** :source:`Lib/string/__init__.py`" +msgstr "**源代码:** :source:`Lib/string/__init__.py`" + +#: ../../library/string.rst:14 +msgid ":ref:`textseq`" +msgstr ":ref:`textseq`" + +#: ../../library/string.rst:16 +msgid ":ref:`string-methods`" +msgstr ":ref:`string-methods`" + +#: ../../library/string.rst:19 +msgid "String constants" +msgstr "字符串常量" + +#: ../../library/string.rst:21 +msgid "The constants defined in this module are:" +msgstr "此模块中定义的常量为:" + +#: ../../library/string.rst:26 +msgid "" +"The concatenation of the :const:`ascii_lowercase` and " +":const:`ascii_uppercase` constants described below. This value is not " +"locale-dependent." +msgstr "" +"下文所述 :const:`ascii_lowercase` 和 :const:`ascii_uppercase` 常量的拼连。该值不依赖于语言区域。" + +#: ../../library/string.rst:32 +msgid "" +"The lowercase letters ``'abcdefghijklmnopqrstuvwxyz'``. This value is not " +"locale-dependent and will not change." +msgstr "小写字母 ``'abcdefghijklmnopqrstuvwxyz'``。该值不依赖于语言区域,不会发生改变。" + +#: ../../library/string.rst:38 +msgid "" +"The uppercase letters ``'ABCDEFGHIJKLMNOPQRSTUVWXYZ'``. This value is not " +"locale-dependent and will not change." +msgstr "大写字母 ``'ABCDEFGHIJKLMNOPQRSTUVWXYZ'``。该值不依赖于语言区域,不会发生改变。" + +#: ../../library/string.rst:44 +msgid "The string ``'0123456789'``." +msgstr "字符串 ``'0123456789'``。" + +#: ../../library/string.rst:49 +msgid "The string ``'0123456789abcdefABCDEF'``." +msgstr "字符串 ``'0123456789abcdefABCDEF'``。" + +#: ../../library/string.rst:54 +msgid "The string ``'01234567'``." +msgstr "字符串 ``'01234567'``。" + +#: ../../library/string.rst:59 +msgid "" +"String of ASCII characters which are considered punctuation characters in " +"the ``C`` locale: ``!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~``." +msgstr "" +"由在 ``C`` 区域设置中被视为标点符号的 ASCII 字符所组成的字符串: " +"``!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~``." + +#: ../../library/string.rst:65 +msgid "" +"String of ASCII characters which are considered printable by Python. This is" +" a combination of :const:`digits`, :const:`ascii_letters`, " +":const:`punctuation`, and :const:`whitespace`." +msgstr "" +"由被视为可打印符号的 ASCII 字符组成的字符串。这是 :const:`digits`, :const:`ascii_letters`, " +":const:`punctuation` 和 :const:`whitespace` 的总和。" + +#: ../../library/string.rst:71 +msgid "" +"By design, :meth:`string.printable.isprintable() ` returns " +":const:`False`. In particular, ``string.printable`` is not printable in the " +"POSIX sense (see :manpage:`LC_CTYPE `)." +msgstr "" +"根据设计,:meth:`string.printable.isprintable() ` 将返回 " +":const:`False`。特别地,``string.printable`` 在 POSIX 中是不可打印的 (参见 " +":manpage:`LC_CTYPE `)." + +#: ../../library/string.rst:78 +msgid "" +"A string containing all ASCII characters that are considered whitespace. " +"This includes the characters space, tab, linefeed, return, formfeed, and " +"vertical tab." +msgstr "由被视为空白符号的 ASCII 字符组成的字符串。其中包括空格、制表、换行、回车、进纸和纵向制表符。" + +#: ../../library/string.rst:86 +msgid "Custom string formatting" +msgstr "" + +#: ../../library/string.rst:88 +msgid "" +"The built-in string class provides the ability to do complex variable " +"substitutions and value formatting via the :meth:`~str.format` method " +"described in :pep:`3101`. The :class:`Formatter` class in the " +":mod:`!string` module allows you to create and customize your own string " +"formatting behaviors using the same implementation as the built-in " +":meth:`~str.format` method." +msgstr "" +"内置的字符串类提供了通过使用 :pep:`3101` 所描述的 :meth:`~str.format` 方法进行复杂变量替换和值格式化的能力。 " +":mod:`!string` 模块中的 :class:`Formatter` 类许你使用与内置 :meth:`~str.format` " +"方法相同的实现来创建并定制你自己的字符串格式化行为。" + +#: ../../library/string.rst:97 +msgid "The :class:`Formatter` class has the following public methods:" +msgstr ":class:`Formatter` 类包含下列公有方法:" + +#: ../../library/string.rst:101 +msgid "" +"The primary API method. It takes a format string and an arbitrary set of " +"positional and keyword arguments. It is just a wrapper that calls " +":meth:`vformat`." +msgstr "首要的 API 方法。它接受一个格式字符串和任意一组位置和关键字参数。它只是一个调用 :meth:`vformat` 的包装器。" + +#: ../../library/string.rst:105 +msgid "" +"A format string argument is now :ref:`positional-only `." +msgstr "格式字符串参数现在是 :ref:`仅限位置参数 `。" + +#: ../../library/string.rst:111 +msgid "" +"This function does the actual work of formatting. It is exposed as a " +"separate function for cases where you want to pass in a predefined " +"dictionary of arguments, rather than unpacking and repacking the dictionary " +"as individual arguments using the ``*args`` and ``**kwargs`` syntax. " +":meth:`vformat` does the work of breaking up the format string into " +"character data and replacement fields. It calls the various methods " +"described below." +msgstr "" +"此函数执行实际的格式化操作。它被公开为一个单独的函数,用于需要传入一个预定义字典作为参数,而不是使用 ``*args`` 和 ``**kwargs`` " +"语法将字典解包为多个单独参数并重打包的情况。 :meth:`vformat` 完成将格式字符串分解为字符数据和替换字段的工作。 " +"它会调用下文所述的几种不同方法。" + +#: ../../library/string.rst:119 +msgid "" +"In addition, the :class:`Formatter` defines a number of methods that are " +"intended to be replaced by subclasses:" +msgstr "此外,:class:`Formatter` 还定义了一些旨在被子类替换的方法:" + +#: ../../library/string.rst:124 +msgid "" +"Loop over the format_string and return an iterable of tuples " +"(*literal_text*, *field_name*, *format_spec*, *conversion*). This is used " +"by :meth:`vformat` to break the string into either literal text, or " +"replacement fields." +msgstr "" +"循环遍历 format_string 并返回一个由元组组成的可迭代对象 (*literal_text*, *field_name*, " +"*format_spec*, *conversion*)。它会被 :meth:`vformat` 用来将字符串分解为文本字面值或替换字段。" + +#: ../../library/string.rst:129 +msgid "" +"The values in the tuple conceptually represent a span of literal text " +"followed by a single replacement field. If there is no literal text (which " +"can happen if two replacement fields occur consecutively), then " +"*literal_text* will be a zero-length string. If there is no replacement " +"field, then the values of *field_name*, *format_spec* and *conversion* will " +"be ``None``. The value of *field_name* is unmodified and auto-numbering of " +"non-numbered positional fields is done by :meth:`vformat`." +msgstr "" +"元组中的值在概念上表示一段字面文本加上一个替换字段。如果没有字面文本(如果连续出现两个替换字段就会发生这种情况),则 *literal_text* " +"将是一个长度为零的字符串。如果没有替换字段,则 *field_name*, *format_spec* 和 *conversion* 的值将为 " +"``None``。 *field_name* 的值未被修改,未编号的位置字段的自动编号由 :meth:`vformat` 完成。" + +#: ../../library/string.rst:139 +msgid "" +"Given *field_name*, convert it to an object to be formatted. Auto-numbering " +"of *field_name* returned from :meth:`parse` is done by :meth:`vformat` " +"before calling this method. Returns a tuple (obj, used_key). The default " +"version takes strings of the form defined in :pep:`3101`, such as " +"\"0[name]\" or \"label.title\". *args* and *kwargs* are as passed in to " +":meth:`vformat`. The return value *used_key* has the same meaning as the " +"*key* parameter to :meth:`get_value`." +msgstr "" +"给定 *field_name*,将其转换为要格式化的对象。在调用此方法之前,:meth:`parse` 返回的 *field_name* 的自动编号是由" +" :meth:`vformat` 完成的。返回一个元组 (obj, used_key)。默认版本接受在 :pep:`3101` 所定义形式的字符串,例如" +" \"0[name]\" 或 \"label.title\"。 *args* 和 *kwargs* 与传给 :meth:`vformat` " +"的一样。返回值 *used_key* 与 :meth:`get_value` 的 *key* 形参具有相同的含义。" + +#: ../../library/string.rst:149 +msgid "" +"Retrieve a given field value. The *key* argument will be either an integer " +"or a string. If it is an integer, it represents the index of the positional" +" argument in *args*; if it is a string, then it represents a named argument " +"in *kwargs*." +msgstr "" +"提取给定的字段值。 *key* 参数将为整数或字符串。如果是整数,它表示 *args* 中位置参数的索引;如果是字符串,它表示 *kwargs* " +"中的关键字参数名。" + +#: ../../library/string.rst:154 +msgid "" +"The *args* parameter is set to the list of positional arguments to " +":meth:`vformat`, and the *kwargs* parameter is set to the dictionary of " +"keyword arguments." +msgstr "*args* 形参会被设为 :meth:`vformat` 的位置参数列表,而 *kwargs* 形参会被设为由关键字参数组成的字典。" + +#: ../../library/string.rst:158 +msgid "" +"For compound field names, these functions are only called for the first " +"component of the field name; subsequent components are handled through " +"normal attribute and indexing operations." +msgstr "对于复合字段名称,仅会为字段名称的第一个组件调用这些函数;后续组件会通过普通属性和索引操作来进行处理。" + +#: ../../library/string.rst:162 +msgid "" +"So for example, the field expression '0.name' would cause :meth:`get_value` " +"to be called with a *key* argument of 0. The ``name`` attribute will be " +"looked up after :meth:`get_value` returns by calling the built-in " +":func:`getattr` function." +msgstr "" +"因此举例来说,字段表达式 '0.name' 将导致调用 :meth:`get_value` 时附带 *key* 参数值 0。在 " +":meth:`get_value` 通过调用内置的 :func:`getattr` 函数返回后将会查找 ``name`` 属性。" + +#: ../../library/string.rst:167 +msgid "" +"If the index or keyword refers to an item that does not exist, then an " +":exc:`IndexError` or :exc:`KeyError` should be raised." +msgstr "如果索引或关键字引用了一个不存在的项,则将引发 :exc:`IndexError` 或 :exc:`KeyError`。" + +#: ../../library/string.rst:172 +msgid "" +"Implement checking for unused arguments if desired. The arguments to this " +"function is the set of all argument keys that were actually referred to in " +"the format string (integers for positional arguments, and strings for named " +"arguments), and a reference to the *args* and *kwargs* that was passed to " +"vformat. The set of unused args can be calculated from these parameters. " +":meth:`check_unused_args` is assumed to raise an exception if the check " +"fails." +msgstr "" +"在必要时实现对未使用参数进行检测。此函数的参数是格式字符串中实际引用的所有参数键的集合(整数表示位置参数,字符串表示名称参数),以及被传给 " +"vformat 的 *args* 和 *kwargs* 的引用。未使用参数的集合可以根据这些形参计算出来。如果检测失败则 " +":meth:`check_unused_args` 应会引发一个异常。" + +#: ../../library/string.rst:182 +msgid "" +":meth:`format_field` simply calls the global :func:`format` built-in. The " +"method is provided so that subclasses can override it." +msgstr ":meth:`format_field` 会简单地调用内置全局函数 :func:`format`。提供该方法是为了让子类能够重载它。" + +#: ../../library/string.rst:187 +msgid "" +"Converts the value (returned by :meth:`get_field`) given a conversion type " +"(as in the tuple returned by the :meth:`parse` method). The default version" +" understands 's' (str), 'r' (repr) and 'a' (ascii) conversion types." +msgstr "" +"使用给定的转换类型(来自 :meth:`parse` 方法所返回的元组)来转换(由 :meth:`get_field` 所返回的)值。默认版本支持 " +"'s' (str), 'r' (repr) 和 'a' (ascii) 等转换类型。" + +#: ../../library/string.rst:196 +msgid "Format string syntax" +msgstr "" + +#: ../../library/string.rst:198 +msgid "" +"The :meth:`str.format` method and the :class:`Formatter` class share the " +"same syntax for format strings (although in the case of :class:`Formatter`, " +"subclasses can define their own format string syntax). The syntax is " +"related to that of :ref:`formatted string literals ` and " +":ref:`template string literals `, but it is less sophisticated " +"and, in particular, does not support arbitrary expressions in " +"interpolations." +msgstr "" +":meth:`str.format` 方法与 :class:`Formatter` 类共享相同的格式字符串语法(不过对于 " +":class:`Formatter` 而言,其子类可以自定义格式字符串语法)。该语法与 :ref:`格式字符串字面值 ` 和 " +":ref:`模板字符串字面值 ` 有关联,但复杂度较低,具体而言是不支持在插值中使用任意表达式。" + +#: ../../library/string.rst:212 +msgid "" +"Format strings contain \"replacement fields\" surrounded by curly braces " +"``{}``. Anything that is not contained in braces is considered literal text," +" which is copied unchanged to the output. If you need to include a brace " +"character in the literal text, it can be escaped by doubling: ``{{`` and " +"``}}``." +msgstr "" +"格式字符串包含有以花括号 ``{}`` 括起来的“替换字段”。不在花括号之内的内容被视为字面文本,会不加修改地复制到输出中。 " +"如果你需要在字面文本中包含花括号字符,可以通过重复来转义: ``{{`` 和 ``}}``。" + +#: ../../library/string.rst:217 +msgid "The grammar for a replacement field is as follows:" +msgstr "替换字段的语法如下:" + +#: ../../library/string.rst:229 +msgid "" +"In less formal terms, the replacement field can start with a *field_name* " +"that specifies the object whose value is to be formatted and inserted into " +"the output instead of the replacement field. The *field_name* is optionally " +"followed by a *conversion* field, which is preceded by an exclamation point" +" ``'!'``, and a *format_spec*, which is preceded by a colon ``':'``. These " +"specify a non-default format for the replacement value." +msgstr "" +"用不太正式的术语来描述,替换字段开头可以用一个 *field_name* 指定要对值进行格式化并取代替换字段被插入到输出结果的对象。 " +"*field_name* 之后有可选的 *conversion* 字段,它是一个感叹号 ``'!'`` 加一个 " +"*format_spec*,并以一个冒号 ``':'`` 打头。这些指明了替换值的非默认格式。" + +#: ../../library/string.rst:236 +msgid "See also the :ref:`formatspec` section." +msgstr "另请参阅 :ref:`formatspec` 一节。" + +#: ../../library/string.rst:238 +msgid "" +"The *field_name* itself begins with an *arg_name* that is either a number or" +" a keyword. If it's a number, it refers to a positional argument, and if " +"it's a keyword, it refers to a named keyword argument. An *arg_name* is " +"treated as a number if a call to :meth:`str.isdecimal` on the string would " +"return true. If the numerical arg_names in a format string are 0, 1, 2, ... " +"in sequence, they can all be omitted (not just some) and the numbers 0, 1, " +"2, ... will be automatically inserted in that order. Because *arg_name* is " +"not quote-delimited, it is not possible to specify arbitrary dictionary keys" +" (e.g., the strings ``'10'`` or ``':-]'``) within a format string. The " +"*arg_name* can be followed by any number of index or attribute expressions. " +"An expression of the form ``'.name'`` selects the named attribute using " +":func:`getattr`, while an expression of the form ``'[index]'`` does an index" +" lookup using :meth:`~object.__getitem__`." +msgstr "" +"*field_name* 本身以一个数字或关键字形式的 *arg_name* 打头。 " +"如果为数字,则它指向一个位置参数,而如果为关键字,则它指向一个命名关键字参数。如果在字符串上调用 :meth:`str.isdecimal` " +"会返回真值则 *arg_name* 会被当作数字来处理。如果格式字段串中的数字 arg_names 为 0, 1, 2, ... " +"的序列,它们可以全部(而非部分)被省略并且数字 0, 1, 2, ... 将按顺序被自动插入。由于 *arg_name* " +"不使用引号分隔,因此无法在格式字符串中指定任意的字典键(例如字符串 ``'10'`` 或 ``':-]'`` 等)。 *arg_name* " +"之后可以跟任意数量的索引或属性表达式。``'.name'`` 形式的表达式会使用 :func:`getattr` 来选择命名属性,而 " +"``'[index]'`` 形式的表达式会使用 :meth:`~object.__getitem__` 来执行索引查找。" + +#: ../../library/string.rst:252 +msgid "" +"The positional argument specifiers can be omitted for :meth:`str.format`, so" +" ``'{} {}'.format(a, b)`` is equivalent to ``'{0} {1}'.format(a, b)``." +msgstr "" +"位置参数说明符对于 :meth:`str.format` 可以省略,因此 ``'{} {}'.format(a, b)`` 等价于 ``'{0} " +"{1}'.format(a, b)``." + +#: ../../library/string.rst:256 +msgid "" +"The positional argument specifiers can be omitted for :class:`Formatter`." +msgstr "位置参数说明符对于 :class:`Formatter` 可以省略。" + +#: ../../library/string.rst:259 +msgid "Some simple format string examples::" +msgstr "一些简单的格式字符串示例" + +#: ../../library/string.rst:261 +msgid "" +"\"First, thou shalt count to {0}\" # References first positional argument\n" +"\"Bring me a {}\" # Implicitly references the first positional argument\n" +"\"From {} to {}\" # Same as \"From {0} to {1}\"\n" +"\"My quest is {name}\" # References keyword argument 'name'\n" +"\"Weight in tons {0.weight}\" # 'weight' attribute of first positional arg\n" +"\"Units destroyed: {players[0]}\" # First element of keyword argument 'players'." +msgstr "" +"\"First, thou shalt count to {0}\" # 引用第一个位置参数\n" +"\"Bring me a {}\" # 隐式引用第一个位置参数\n" +"\"From {} to {}\" # 等同于 \"From {0} to {1}\"\n" +"\"My quest is {name}\" # 引用关键字参数 'name'\n" +"\"Weight in tons {0.weight}\" # 第一个位置参数的 'weight' 属性\n" +"\"Units destroyed: {players[0]}\" # 关键字参数 'players' 的第一个元素。" + +#: ../../library/string.rst:270 +msgid "" +"The *conversion* field causes a type coercion before formatting. Normally, " +"the job of formatting a value is done by the :meth:`~object.__format__` " +"method of the value itself. However, in some cases it is desirable to force" +" a type to be formatted as a string, overriding its own definition of " +"formatting. By converting the value to a string before calling " +":meth:`~object.__format__`, the normal formatting logic is bypassed." +msgstr "" +"*conversion* 字段会在格式化之前进行类型强制转换。通常,格式化一个值的工作是由该值本身的 " +":meth:`~object.__format__` 方法完成的。但是,在某些情况下最好是强制将类型格式化为一个字符串,覆盖其本身的格式化定义。 " +"通过在调用 :meth:`~object.__format__` 之前将值转换为字符串,可以绕过正常的格式化逻辑。" + +#: ../../library/string.rst:277 +msgid "" +"Three conversion flags are currently supported: ``'!s'`` which calls " +":func:`str` on the value, ``'!r'`` which calls :func:`repr` and ``'!a'`` " +"which calls :func:`ascii`." +msgstr "" +"目前支持的转换旗标有三种: ``'!s'`` 会对值调用 :func:`str`,``'!r'`` 调用 :func:`repr` 而 ``'!a'``" +" 则调用 :func:`ascii`。" + +#: ../../library/string.rst:281 +msgid "Some examples::" +msgstr "示例如下:" + +#: ../../library/string.rst:283 +msgid "" +"\"Harold's a clever {0!s}\" # Calls str() on the argument first\n" +"\"Bring out the holy {name!r}\" # Calls repr() on the argument first\n" +"\"More {!a}\" # Calls ascii() on the argument first" +msgstr "" +"\"Harold's a clever {0!s}\" # 先在参数上调用 str()\n" +"\"Bring out the holy {name!r}\" # 先在参数上调用 repr()\n" +"\"More {!a}\" # 先在参数上调用 ascii()" + +#: ../../library/string.rst:287 +msgid "" +"The *format_spec* field contains a specification of how the value should be " +"presented, including such details as field width, alignment, padding, " +"decimal precision and so on. Each value type can define its own " +"\"formatting mini-language\" or interpretation of the *format_spec*." +msgstr "" +"*format_spec* 字段包含值应如何呈现的规格描述,例如字段宽度、对齐、填充、小数精度等细节信息。 " +"每种值类型可以定义自己的“格式化迷你语言”或对 *format_spec* 的解读方式。" + +#: ../../library/string.rst:292 +msgid "" +"Most built-in types support a common formatting mini-language, which is " +"described in the next section." +msgstr "大多数内置类型都支持同样的格式化迷你语言,具体描述见下一节。" + +#: ../../library/string.rst:295 +msgid "" +"A *format_spec* field can also include nested replacement fields within it. " +"These nested replacement fields may contain a field name, conversion flag " +"and format specification, but deeper nesting is not allowed. The " +"replacement fields within the format_spec are substituted before the " +"*format_spec* string is interpreted. This allows the formatting of a value " +"to be dynamically specified." +msgstr "" +"*format_spec* 字段还可以在其内部包含嵌套的替换字段。 " +"这些嵌套的替换字段可能包括字段名称、转换旗标和格式规格描述,但是不再允许更深层的嵌套。format_spec 内部的替换字段会在解读 " +"*format_spec* 字符串之前先被解读。这将允许动态地指定特定值的格式。" + +#: ../../library/string.rst:302 +msgid "See the :ref:`formatexamples` section for some examples." +msgstr "请参阅 :ref:`formatexamples` 一节查看相关示例。" + +#: ../../library/string.rst:308 +msgid "Format specification mini-language" +msgstr "" + +#: ../../library/string.rst:310 +msgid "" +"\"Format specifications\" are used within replacement fields contained " +"within a format string to define how individual values are presented (see " +":ref:`formatstrings`, :ref:`f-strings`, and :ref:`t-strings`). They can also" +" be passed directly to the built-in :func:`format` function. Each " +"formattable type may define how the format specification is to be " +"interpreted." +msgstr "" +"“格式规格”在格式字符串所包含的替换字段内部使用,用于定义单个值应如何呈现 (参见 :ref:`formatstrings`、 " +":ref:`f-strings` 和 :ref:`t-strings`)。它们也可以被直接传给内置的 :func:`format` 函数。 " +"每种可格式化的类型都可以自行定义如何对格式规格进行解读。" + +#: ../../library/string.rst:317 +msgid "" +"Most built-in types implement the following options for format " +"specifications, although some of the formatting options are only supported " +"by the numeric types." +msgstr "大多数内置类型都为格式规格实现了下列选项,不过某些格式化选项只被数值类型所支持。" + +#: ../../library/string.rst:320 +msgid "" +"A general convention is that an empty format specification produces the same" +" result as if you had called :func:`str` on the value. A non-empty format " +"specification typically modifies the result." +msgstr "一般约定空的格式描述将产生与在值上调用 :func:`str` 相同的结果。非空格式描述通常会修改此结果。" + +#: ../../library/string.rst:324 +msgid "The general form of a *standard format specifier* is:" +msgstr "*标准格式说明符* 的一般形式如下:" + +#: ../../library/string.rst:341 +msgid "" +"If a valid *align* value is specified, it can be preceded by a *fill* " +"character that can be any character and defaults to a space if omitted. It " +"is not possible to use a literal curly brace (\"``{``\" or \"``}``\") as the" +" *fill* character in a :ref:`formatted string literal ` or when " +"using the :meth:`str.format` method. However, it is possible to insert a " +"curly brace with a nested replacement field. This limitation doesn't affect" +" the :func:`format` function." +msgstr "" +"如果指定了一个有效的 *align* 值,则可以在该值前面加一个 *fill* 字符,它可以为任意字符,如果省略则默认为空格符。在 " +":ref:`格式化字符串字面值 ` 或在使用 :meth:`str.format` 方法时是无法使用花括号字面值 ) 作为 " +"*fill* 字符的。但是,通过嵌套替换字段插入花括号则是可以的。这个限制不会影响 :func:`format` 函数。" + +#: ../../library/string.rst:350 +msgid "The meaning of the various alignment options is as follows:" +msgstr "各种对齐选项的含义如下:" + +#: ../../library/string.rst:359 ../../library/string.rst:391 +#: ../../library/string.rst:457 +msgid "Option" +msgstr "选项" + +#: ../../library/string.rst:359 ../../library/string.rst:391 +#: ../../library/string.rst:457 ../../library/string.rst:493 +#: ../../library/string.rst:504 ../../library/string.rst:544 +msgid "Meaning" +msgstr "含意" + +#: ../../library/string.rst:361 +msgid "``'<'``" +msgstr "``'<'``" + +#: ../../library/string.rst:361 +msgid "" +"Forces the field to be left-aligned within the available space (this is the " +"default for most objects)." +msgstr "强制字段在可用空间内左对齐(这是大多数对象的默认值)。" + +#: ../../library/string.rst:364 +msgid "``'>'``" +msgstr "``'>'``" + +#: ../../library/string.rst:364 +msgid "" +"Forces the field to be right-aligned within the available space (this is the" +" default for numbers)." +msgstr "强制字段在可用空间内右对齐(这是数字的默认值)。" + +#: ../../library/string.rst:367 +msgid "``'='``" +msgstr "``'='``" + +#: ../../library/string.rst:367 +msgid "" +"Forces the padding to be placed after the sign (if any) but before the " +"digits. This is used for printing fields in the form '+000000120'. This " +"alignment option is only valid for numeric types, excluding " +":class:`complex`. It becomes the default for numbers when '0' immediately " +"precedes the field width." +msgstr "" +"强制在符号(如果有)之后数字之前放置填充。这被用于以 '+000000120' 形式打印字段。 " +"这个对齐选项仅适用于数字类型,:class:`complex` 除外。当 '0' 紧接在字段宽度之前时这是默认行为。" + +#: ../../library/string.rst:374 +msgid "``'^'``" +msgstr "``'^'``" + +#: ../../library/string.rst:374 +msgid "Forces the field to be centered within the available space." +msgstr "强制字段在可用空间内居中。" + +#: ../../library/string.rst:378 +msgid "" +"Note that unless a minimum field width is defined, the field width will " +"always be the same size as the data to fill it, so that the alignment option" +" has no meaning in this case." +msgstr "请注意,除非定义了最小字段宽度,否则字段宽度将始终与填充它的数据大小相同,因此在这种情况下,对齐选项没有意义。" + +#: ../../library/string.rst:382 +msgid "" +"The *sign* option is only valid for number types, and can be one of the " +"following:" +msgstr "*sign* 选项仅对数字类型有效,可以是以下之一:" + +#: ../../library/string.rst:393 +msgid "``'+'``" +msgstr "``'+'``" + +#: ../../library/string.rst:393 +msgid "" +"Indicates that a sign should be used for both positive as well as negative " +"numbers." +msgstr "表示正负号应当同时用于正数与负数。" + +#: ../../library/string.rst:396 +msgid "``'-'``" +msgstr "``'-'``" + +#: ../../library/string.rst:396 +msgid "" +"Indicates that a sign should be used only for negative numbers (this is the " +"default behavior)." +msgstr "表示正负号应当仅用于负数(这是默认的行为)。" + +#: ../../library/string.rst:385 ../../library/string.rst:399 +msgid "space" +msgstr "space" + +#: ../../library/string.rst:399 +msgid "" +"Indicates that a leading space should be used on positive numbers, and a " +"minus sign on negative numbers." +msgstr "表示应当对正数使用前导空格,而对负数使用负号。" + +#: ../../library/string.rst:406 +msgid "" +"The ``'z'`` option coerces negative zero floating-point values to positive " +"zero after rounding to the format precision. This option is only valid for " +"floating-point presentation types." +msgstr " ``'z'`` 选项是在舍入到格式精度后将负零浮点值强制转为正零。此选项适用于浮点表示类型。" + +#: ../../library/string.rst:410 +msgid "Added the ``'z'`` option (see also :pep:`682`)." +msgstr "增加了 ``'z'`` 选项 (另请参阅 :pep:`682`)。" + +#: ../../library/string.rst:415 +msgid "" +"The ``'#'`` option causes the \"alternate form\" to be used for the " +"conversion. The alternate form is defined differently for different types." +" This option is only valid for integer, float and complex types. For " +"integers, when binary, octal, or hexadecimal output is used, this option " +"adds the respective prefix ``'0b'``, ``'0o'``, ``'0x'``, or ``'0X'`` to the " +"output value. For float and complex the alternate form causes the result of " +"the conversion to always contain a decimal-point character, even if no " +"digits follow it. Normally, a decimal-point character appears in the result " +"of these conversions only if a digit follows it. In addition, for ``'g'`` " +"and ``'G'`` conversions, trailing zeros are not removed from the result." +msgstr "" +"``'#'`` 选项可让“替代形式”被用于执行转换。替代形式会针对不同的类型分别定义。此选项仅适用于整数、浮点数和复数类型。 " +"对于整数类型,当使用二进制、八进制或十六进制输出时,此选项会为输出值分别添加相应的 ``'0b'``, ``'0o'``, ``'0x'`` 或 " +"``'0X'`` 前缀。对于浮点数和复数类型,替代形式会使得转换结果总是包含小数点符号,即使其不带小数部分。 " +"通常只有在带有小数部分的情况下,此类转换的结果中才会出现小数点符号。此外,对于 ``'g'`` 和 ``'G'`` 转换,末尾的零不会从结果中被移除。" + +#: ../../library/string.rst:427 +msgid "" +"The *width* is a decimal integer defining the minimum total field width, " +"including any prefixes, separators, and other formatting characters. If not " +"specified, then the field width will be determined by the content." +msgstr "*width* 是一个定义最小总字段宽度的十进制整数,包括任何前缀、分隔符和其他格式化字符。如果未指定,则字段宽度将由内容确定。" + +#: ../../library/string.rst:431 +msgid "" +"When no explicit alignment is given, preceding the *width* field by a zero " +"(``'0'``) character enables sign-aware zero-padding for numeric types, " +"excluding :class:`complex`. This is equivalent to a *fill* character of " +"``'0'`` with an *alignment* type of ``'='``." +msgstr "" +"当未显式给出对齐方式时,在 *width* 字符前加一个零 (``'0'``) 字符将为数字类型启用感知正负号的零填充,:class:`complex`" +" 除外。这相当于将 *fill* 字符设为 ``'0'`` 并将 *alignment* 类型设为 ``'='``。" + +#: ../../library/string.rst:436 +msgid "" +"Preceding the *width* field by ``'0'`` no longer affects the default " +"alignment for strings." +msgstr "在 *width* 字段之前添加 ``'0'`` 不会再影响字符串的默认对齐。" + +#: ../../library/string.rst:440 +msgid "" +"The *precision* is a decimal integer indicating how many digits should be " +"displayed after the decimal point for presentation types ``'f'`` and " +"``'F'``, or before and after the decimal point for presentation types " +"``'g'`` or ``'G'``. For string presentation types the field indicates the " +"maximum field size - in other words, how many characters will be used from " +"the field content. The *precision* is not allowed for integer presentation " +"types." +msgstr "" +"*precision* 是一个十进制整数,它表示对于以表示类型 ``'f'`` 和 ``'F'`` " +"格式化的数值应当在小数点后显示多少个数位,或者对于以表示类型 ``'g'`` 或 ``'G'`` 格式化的数值应当在小数点前后显示多少个数位。 " +"对于字符串表示类型,该字段表示最大的字段大小 ——换句话说,就是要使用多少个来自字段内容的字符。不允许对整数表示类型指定 *precision* 字段。" + +#: ../../library/string.rst:448 +msgid "" +"The *grouping* option after *width* and *precision* fields specifies a digit" +" group separator for the integral and fractional parts of a number " +"respectively. It can be one of the following:" +msgstr "" +"*width* 和 *precision* 字段后的 *grouping* 选项分别为数字的整数和小数部分指定数字组分隔符。它可以是下列值之一:" + +#: ../../library/string.rst:459 +msgid "``','``" +msgstr "``','``" + +#: ../../library/string.rst:459 +msgid "" +"Inserts a comma every 3 digits for integer presentation type ``'d'`` and " +"floating-point presentation types, excluding ``'n'``. For other presentation" +" types, this option is not supported." +msgstr "对于整数表示类型 ``'d'`` 和 ``'n'`` 以外的浮点数表示类型,每 3 个数位插入一个逗号。对于其他表示类型,此选项不受支持。" + +#: ../../library/string.rst:465 +msgid "``'_'``" +msgstr "``'_'``" + +#: ../../library/string.rst:465 +msgid "" +"Inserts an underscore every 3 digits for integer presentation type ``'d'`` " +"and floating-point presentation types, excluding ``'n'``. For integer " +"presentation types ``'b'``, ``'o'``, ``'x'``, and ``'X'``, underscores are " +"inserted every 4 digits. For other presentation types, this option is not " +"supported." +msgstr "" +"对于整数表示类型 ``'d'`` 和 ``'n'`` 以外的浮点数表示类型,每 3 个数位插入一个下划线。对于整数表示类型 ``'b'``, " +"``'o'``, ``'x'`` 和 ``'X'``,则每 4 个数位插入一个下划线。对于其他表示类型,此选项不受支持。" + +#: ../../library/string.rst:475 +msgid "" +"For a locale-aware separator, use the ``'n'`` :ref:`float presentation type " +"` or :ref:`integer presentation type ` " +"instead." +msgstr "" + +#: ../../library/string.rst:479 +msgid "Added the ``','`` option (see also :pep:`378`)." +msgstr "添加了 ``','`` 选项 (另请参阅 :pep:`378`)。" + +#: ../../library/string.rst:482 +msgid "Added the ``'_'`` option (see also :pep:`515`)." +msgstr "添加了 ``'_'`` 选项 (另请参阅 :pep:`515`)。" + +#: ../../library/string.rst:485 +msgid "Support the *grouping* option for the fractional part." +msgstr "支持分数部分的 *grouping* 分组选项。" + +#: ../../library/string.rst:488 +msgid "Finally, the *type* determines how the data should be presented." +msgstr "最后,*type* 确定了数据应如何呈现。" + +#: ../../library/string.rst:490 +msgid "The available string presentation types are:" +msgstr "可用的字符串表示类型是:" + +#: ../../library/string.rst:493 ../../library/string.rst:504 +#: ../../library/string.rst:544 +msgid "Type" +msgstr "类型" + +#: ../../library/string.rst:495 +msgid "``'s'``" +msgstr "``'s'``" + +#: ../../library/string.rst:495 +msgid "" +"String format. This is the default type for strings and may be omitted." +msgstr "字符串格式。这是字符串的默认类型,可以省略。" + +#: ../../library/string.rst:498 ../../library/string.rst:532 +#: ../../library/string.rst:626 +msgid "None" +msgstr "None" + +#: ../../library/string.rst:498 +msgid "The same as ``'s'``." +msgstr "和 ``'s'`` 一样。" + +#: ../../library/string.rst:501 +msgid "The available integer presentation types are:" +msgstr "可用的整数表示类型是:" + +#: ../../library/string.rst:506 +msgid "``'b'``" +msgstr "``'b'``" + +#: ../../library/string.rst:506 +msgid "Binary format. Outputs the number in base 2." +msgstr "二进制格式。输出以 2 为基数的数字。" + +#: ../../library/string.rst:508 +msgid "``'c'``" +msgstr "``'c'``" + +#: ../../library/string.rst:508 +msgid "" +"Character. Converts the integer to the corresponding unicode character " +"before printing." +msgstr "字符。在打印之前将整数转换为相应的 unicode 字符。" + +#: ../../library/string.rst:511 +msgid "``'d'``" +msgstr "``'d'``" + +#: ../../library/string.rst:511 +msgid "Decimal Integer. Outputs the number in base 10." +msgstr "十进制整数。输出以 10 为基数的数字。" + +#: ../../library/string.rst:513 +msgid "``'o'``" +msgstr "``'o'``" + +#: ../../library/string.rst:513 +msgid "Octal format. Outputs the number in base 8." +msgstr "八进制格式。输出以 8 为基数的数字。" + +#: ../../library/string.rst:515 +msgid "``'x'``" +msgstr "``'x'``" + +#: ../../library/string.rst:515 +msgid "" +"Hex format. Outputs the number in base 16, using lower-case letters for the " +"digits above 9." +msgstr "十六进制格式。输出以 16 为基数的数字,使用小写字母表示 9 以上的数码。" + +#: ../../library/string.rst:518 +msgid "``'X'``" +msgstr "``'X'``" + +#: ../../library/string.rst:518 +msgid "" +"Hex format. Outputs the number in base 16, using upper-case letters for the " +"digits above 9. In case ``'#'`` is specified, the prefix ``'0x'`` will be " +"upper-cased to ``'0X'`` as well." +msgstr "" +"十六进制格式。输出以 16 为基数的数字,使用大写字母表示 9 以上的数码。在指定 ``'#'`` 的情况下,前缀 ``'0x'`` 也将被转为大写形式" +" ``'0X'``。" + +#: ../../library/string.rst:523 ../../library/string.rst:613 +msgid "``'n'``" +msgstr "``'n'``" + +#: ../../library/string.rst:525 +msgid "" +"Number. This is the same as ``'d'``, except that it uses the current locale " +"setting to insert the appropriate digit group separators. Note that the " +"default locale is not the system locale. Depending on your use case, you may" +" wish to set :const:`~locale.LC_NUMERIC` with :func:`locale.setlocale` " +"before using ``'n'``." +msgstr "" + +#: ../../library/string.rst:532 +msgid "The same as ``'d'``." +msgstr "和 ``'d'`` 相同。" + +#: ../../library/string.rst:535 +msgid "" +"In addition to the above presentation types, integers can be formatted with " +"the floating-point presentation types listed below (except ``'n'`` and " +"``None``). When doing so, :func:`float` is used to convert the integer to a " +"floating-point number before formatting." +msgstr "" +"在上述的表示类型之外,整数还可以通过下列的浮点表示类型来格式化 (除了 ``'n'`` 和 ``None``)。当这样做时,会在格式化之前使用 " +":func:`float` 将整数转换为浮点数。" + +#: ../../library/string.rst:540 +msgid "" +"The available presentation types for :class:`float` and " +":class:`~decimal.Decimal` values are:" +msgstr ":class:`float` 和 :class:`~decimal.Decimal` 值的可用表示类型有:" + +#: ../../library/string.rst:546 +msgid "``'e'``" +msgstr "``'e'``" + +#: ../../library/string.rst:546 +msgid "" +"Scientific notation. For a given precision ``p``, formats the number in " +"scientific notation with the letter 'e' separating the coefficient from the " +"exponent. The coefficient has one digit before and ``p`` digits after the " +"decimal point, for a total of ``p + 1`` significant digits. With no " +"precision given, uses a precision of ``6`` digits after the decimal point " +"for :class:`float`, and shows all coefficient digits for " +":class:`~decimal.Decimal`. If ``p=0``, the decimal point is omitted unless " +"the ``#`` option is used." +msgstr "" +"科学计数法。对于给定的精度 ``p``,将数字格式化为以字母 'e' 分隔系数和指数的科学计数法表示形式。系数在小数点之前有一位而在之后有 ``p`` " +"位,总计 ``p + 1`` 个有效数位。如未指定精度,则会对 :class:`float` 采用小数点之后 ``6`` 位精度,而对 " +":class:`~decimal.Decimal` 则显示所有系数位。如果 ``p=0``,则小数点会被略去,除非使用了 ``#`` 选项。" + +#: ../../library/string.rst:557 +msgid "" +"For :class:`float`, the exponent always contains at least two digits, and is" +" zero if the value is zero." +msgstr "对于 :class:`float`,指数总是包含至少两位数字,如果值为零则指数也为零。" + +#: ../../library/string.rst:560 +msgid "``'E'``" +msgstr "``'E'``" + +#: ../../library/string.rst:560 +msgid "" +"Scientific notation. Same as ``'e'`` except it uses an upper case 'E' as the" +" separator character." +msgstr "科学计数法。与 ``'e'`` 相似,不同之处在于它使用大写字母 'E' 作为分隔字符。" + +#: ../../library/string.rst:563 +msgid "``'f'``" +msgstr "``'f'``" + +#: ../../library/string.rst:563 +msgid "" +"Fixed-point notation. For a given precision ``p``, formats the number as a " +"decimal number with exactly ``p`` digits following the decimal point. With " +"no precision given, uses a precision of ``6`` digits after the decimal point" +" for :class:`float`, and uses a precision large enough to show all " +"coefficient digits for :class:`~decimal.Decimal`. If ``p=0``, the decimal " +"point is omitted unless the ``#`` option is used." +msgstr "" +"定点表示法。对于给定的精度 ``p``,将数字格式化为小数点之后恰好有 ``p`` 位的小数形式。如未指定精度,则会对 :class:`float` " +"采用小数点之后 ``6`` 位精度,而对 :class:`~decimal.Decimal` 则使用大到足够显示所有系数位的精度。如果 " +"``p=0``,则小数点会被略去,除非使用了 ``#`` 选项。" + +#: ../../library/string.rst:572 +msgid "``'F'``" +msgstr "``'F'``" + +#: ../../library/string.rst:572 +msgid "" +"Fixed-point notation. Same as ``'f'``, but converts ``nan`` to ``NAN`` and " +"``inf`` to ``INF``." +msgstr "定点表示。与 ``'f'`` 相似,但会将 ``nan`` 转为 ``NAN`` 并将 ``inf`` 转为 ``INF``。" + +#: ../../library/string.rst:575 +msgid "``'g'``" +msgstr "``'g'``" + +#: ../../library/string.rst:575 +msgid "" +"General format. For a given precision ``p >= 1``, this rounds the number to" +" ``p`` significant digits and then formats the result in either fixed-point " +"format or in scientific notation, depending on its magnitude. A precision of" +" ``0`` is treated as equivalent to a precision of ``1``." +msgstr "" +"常规格式。对于给定精度 ``p >= 1``,这会将数值舍入到 ``p`` " +"个有效数位,再将结果以定点表示法或科学计数法进行格式化,具体取决于其值的大小。精度 ``0`` 会被视为等价于精度 ``1``。" + +#: ../../library/string.rst:582 +msgid "" +"The precise rules are as follows: suppose that the result formatted with " +"presentation type ``'e'`` and precision ``p-1`` would have exponent ``exp``." +" Then, if ``m <= exp < p``, where ``m`` is -4 for floats and -6 for " +":class:`Decimals `, the number is formatted with " +"presentation type ``'f'`` and precision ``p-1-exp``. Otherwise, the number " +"is formatted with presentation type ``'e'`` and precision ``p-1``. In both " +"cases insignificant trailing zeros are removed from the significand, and the" +" decimal point is also removed if there are no remaining digits following " +"it, unless the ``'#'`` option is used." +msgstr "" +"准确的规则如下:假设使用表示类型 ``'e'`` 和精度 ``p-1`` 进行格式化的结果具有指数值 ``exp``。那么如果 ``m <= exp <" +" p``,其中 ``m`` 以 -4 表示浮点值而以 -6 表示 :class:`Decimal ` " +"值,该数字将使用类型 ``'f'`` 和精度 ``p-1-exp`` 进行格式化。否则的话,该数字将使用表示类型 ``'e'`` 和精度 ``p-1``" +" 进行格式化。在两种情况下,都会从有效数字中移除无意义的末尾零,如果小数点之后没有余下数字则小数点也会被移除,除非使用了 ``'#'`` 选项。" + +#: ../../library/string.rst:595 +msgid "" +"With no precision given, uses a precision of ``6`` significant digits for " +":class:`float`. For :class:`~decimal.Decimal`, the coefficient of the result" +" is formed from the coefficient digits of the value; scientific notation is " +"used for values smaller than ``1e-6`` in absolute value and values where the" +" place value of the least significant digit is larger than 1, and fixed-" +"point notation is used otherwise." +msgstr "" +"如未指定精度,会对 :class:`float` 采用 ``6`` 个有效数位的精度。对于 " +":class:`~decimal.Decimal`,结果的系数会沿用原值的系数数位;对于绝对值小于 ``1e-6`` 的值以及最小有效数位的位值大于 1" +" 的数值将会使用科学计数法,在其他情况下则会使用定点表示法。" + +#: ../../library/string.rst:604 +msgid "" +"Positive and negative infinity, positive and negative zero, and nans, are " +"formatted as ``inf``, ``-inf``, ``0``, ``-0`` and ``nan`` respectively, " +"regardless of the precision." +msgstr "" +"正负无穷,正负零和 nan 会分别被格式化为 ``inf``, ``-inf``, ``0``, ``-0`` 和 ``nan``,无论精度如何设定。" + +#: ../../library/string.rst:609 +msgid "``'G'``" +msgstr "``'G'``" + +#: ../../library/string.rst:609 +msgid "" +"General format. Same as ``'g'`` except switches to ``'E'`` if the number " +"gets too large. The representations of infinity and NaN are uppercased, too." +msgstr "常规格式。类似于 ``'g'``,不同之处在于当数值非常大时会切换为 ``'E'``。无穷与 NaN 也会表示为大写形式。" + +#: ../../library/string.rst:615 +msgid "" +"Number. This is the same as ``'g'``, except that it uses the current locale " +"setting to insert the appropriate digit group separators for the integral " +"part of a number. Note that the default locale is not the system locale. " +"Depending on your use case, you may wish to set :const:`~locale.LC_NUMERIC` " +"with :func:`locale.setlocale` before using ``'n'``." +msgstr "" + +#: ../../library/string.rst:623 +msgid "``'%'``" +msgstr "``'%'``" + +#: ../../library/string.rst:623 +msgid "" +"Percentage. Multiplies the number by 100 and displays in fixed (``'f'``) " +"format, followed by a percent sign." +msgstr "百分比。将数字乘以 100 并显示为定点 (``'f'``) 格式,后面带一个百分号。" + +#: ../../library/string.rst:626 +msgid "" +"For :class:`float` this is like the ``'g'`` type, except that when fixed-" +"point notation is used to format the result, it always includes at least one" +" digit past the decimal point, and switches to the scientific notation when " +"``exp >= p - 1``. When the precision is not specified, the latter will be " +"as large as needed to represent the given value faithfully." +msgstr "" +"对于 :class:`float` 来说这类似于 ``'g'`` 类型,不同之处在于当使用定点表示形式来格式化结果时,它将总是包括小数点后至少一位,并在" +" ``exp >= p - 1`` 时切换为科学计数法表示形式。当未指定精度时,后者的精度将大到足以精确表示给定的值。" + +#: ../../library/string.rst:634 +msgid "" +"For :class:`~decimal.Decimal`, this is the same as either ``'g'`` or ``'G'``" +" depending on the value of ``context.capitals`` for the current decimal " +"context." +msgstr "" +"对于 :class:`~decimal.Decimal` 来说这相当于 ``'g'`` 或 ``'G'``,具体取决于当前 decimal 上下文的 " +"``context.capitals`` 值。" + +#: ../../library/string.rst:638 +msgid "" +"The overall effect is to match the output of :func:`str` as altered by the " +"other format modifiers." +msgstr "总体效果是将 :func:`str` 的输出匹配为其他格式化因子所调整出的样子。" + +#: ../../library/string.rst:642 +msgid "" +"The result should be correctly rounded to a given precision ``p`` of digits " +"after the decimal point. The rounding mode for :class:`float` matches that " +"of the :func:`round` builtin. For :class:`~decimal.Decimal`, the rounding " +"mode of the current :ref:`context ` will be used." +msgstr "" +"结果应当被正确地舍入到给定的小数点后 ``p`` 位精度。针对 :class:`float` 的舍入模式与 :func:`round` " +"内置函数的相匹配。对于 :class:`~decimal.Decimal`,将使用当前 :ref:`上下文 ` " +"的舍入模式。" + +#: ../../library/string.rst:647 +msgid "" +"The available presentation types for :class:`complex` are the same as those " +"for :class:`float` (``'%'`` is not allowed). Both the real and imaginary " +"components of a complex number are formatted as floating-point numbers, " +"according to the specified presentation type. They are separated by the " +"mandatory sign of the imaginary part, the latter being terminated by a ``j``" +" suffix. If the presentation type is missing, the result will match the " +"output of :func:`str` (complex numbers with a non-zero real part are also " +"surrounded by parentheses), possibly altered by other format modifiers." +msgstr "" +"针对 :class:`complex` 的可用表示类型与针对 :class:`float` 的相同(但 ``'%'`` 不被允许)。 " +"复数的实部和虚部都将被作为浮点数来格式化,使用指定的表示类型。它们将以必须带有的虚部正负符号来分隔,虚部还将带有 ``j`` 后缀。 " +"如果未提供表示类型,结果将匹配 :func:`str` 的输出(具有非零实部的复数还将带有圆括号),并可能被其他格式说明符所修改。" + +#: ../../library/string.rst:660 +msgid "Format examples" +msgstr "格式示例" + +#: ../../library/string.rst:662 +msgid "" +"This section contains examples of the :meth:`str.format` syntax and " +"comparison with the old ``%``-formatting." +msgstr "本节包含 :meth:`str.format` 语法的示例以及与旧式 ``%`` 格式化的比较。" + +#: ../../library/string.rst:665 +msgid "" +"In most of the cases the syntax is similar to the old ``%``-formatting, with" +" the addition of the ``{}`` and with ``:`` used instead of ``%``. For " +"example, ``'%03.2f'`` can be translated to ``'{:03.2f}'``." +msgstr "" +"该语法在大多数情况下与旧式的 ``%`` 格式化类似,只是增加了 ``{}`` 和 ``:`` 来取代 ``%``。例如,``'%03.2f'`` " +"可以被改写为 ``'{:03.2f}'``。" + +#: ../../library/string.rst:669 +msgid "" +"The new format syntax also supports new and different options, shown in the " +"following examples." +msgstr "新的格式语法还支持新增的不同选项,将在以下示例中说明。" + +#: ../../library/string.rst:672 +msgid "Accessing arguments by position::" +msgstr "按位置访问参数::" + +#: ../../library/string.rst:674 +msgid "" +">>> '{0}, {1}, {2}'.format('a', 'b', 'c')\n" +"'a, b, c'\n" +">>> '{}, {}, {}'.format('a', 'b', 'c') # 3.1+ only\n" +"'a, b, c'\n" +">>> '{2}, {1}, {0}'.format('a', 'b', 'c')\n" +"'c, b, a'\n" +">>> '{2}, {1}, {0}'.format(*'abc') # unpacking argument sequence\n" +"'c, b, a'\n" +">>> '{0}{1}{0}'.format('abra', 'cad') # arguments' indices can be repeated\n" +"'abracadabra'" +msgstr "" +">>> '{0}, {1}, {2}'.format('a', 'b', 'c')\n" +"'a, b, c'\n" +">>> '{}, {}, {}'.format('a', 'b', 'c') # 3.1+ only\n" +"'a, b, c'\n" +">>> '{2}, {1}, {0}'.format('a', 'b', 'c')\n" +"'c, b, a'\n" +">>> '{2}, {1}, {0}'.format(*'abc') # 解包参数序列\n" +"'c, b, a'\n" +">>> '{0}{1}{0}'.format('abra', 'cad') # 参数的索引可重复使用\n" +"'abracadabra'" + +#: ../../library/string.rst:685 +msgid "Accessing arguments by name::" +msgstr "按名称访问参数::" + +#: ../../library/string.rst:687 +msgid "" +">>> 'Coordinates: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-115.81W')\n" +"'Coordinates: 37.24N, -115.81W'\n" +">>> coord = {'latitude': '37.24N', 'longitude': '-115.81W'}\n" +">>> 'Coordinates: {latitude}, {longitude}'.format(**coord)\n" +"'Coordinates: 37.24N, -115.81W'" +msgstr "" +">>> 'Coordinates: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-115.81W')\n" +"'Coordinates: 37.24N, -115.81W'\n" +">>> coord = {'latitude': '37.24N', 'longitude': '-115.81W'}\n" +">>> 'Coordinates: {latitude}, {longitude}'.format(**coord)\n" +"'Coordinates: 37.24N, -115.81W'" + +#: ../../library/string.rst:693 +msgid "Accessing arguments' attributes::" +msgstr "访问参数的属性::" + +#: ../../library/string.rst:695 +msgid "" +">>> c = 3-5j\n" +">>> ('The complex number {0} is formed from the real part {0.real} '\n" +"... 'and the imaginary part {0.imag}.').format(c)\n" +"'The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0.'\n" +">>> class Point:\n" +"... def __init__(self, x, y):\n" +"... self.x, self.y = x, y\n" +"... def __str__(self):\n" +"... return 'Point({self.x}, {self.y})'.format(self=self)\n" +"...\n" +">>> str(Point(4, 2))\n" +"'Point(4, 2)'" +msgstr "" +">>> c = 3-5j\n" +">>> ('The complex number {0} is formed from the real part {0.real} '\n" +"... 'and the imaginary part {0.imag}.').format(c)\n" +"'The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0.'\n" +">>> class Point:\n" +"... def __init__(self, x, y):\n" +"... self.x, self.y = x, y\n" +"... def __str__(self):\n" +"... return 'Point({self.x}, {self.y})'.format(self=self)\n" +"...\n" +">>> str(Point(4, 2))\n" +"'Point(4, 2)'" + +#: ../../library/string.rst:708 +msgid "Accessing arguments' items::" +msgstr "访问参数的项::" + +#: ../../library/string.rst:710 +msgid "" +">>> coord = (3, 5)\n" +">>> 'X: {0[0]}; Y: {0[1]}'.format(coord)\n" +"'X: 3; Y: 5'" +msgstr "" +">>> coord = (3, 5)\n" +">>> 'X: {0[0]}; Y: {0[1]}'.format(coord)\n" +"'X: 3; Y: 5'" + +#: ../../library/string.rst:714 +msgid "Replacing ``%s`` and ``%r``::" +msgstr "替代 ``%s`` 和 ``%r``::" + +#: ../../library/string.rst:716 +msgid "" +">>> \"repr() shows quotes: {!r}; str() doesn't: {!s}\".format('test1', 'test2')\n" +"\"repr() shows quotes: 'test1'; str() doesn't: test2\"" +msgstr "" +">>> \"repr() shows quotes: {!r}; str() doesn't: {!s}\".format('test1', 'test2')\n" +"\"repr() shows quotes: 'test1'; str() doesn't: test2\"" + +#: ../../library/string.rst:719 +msgid "Aligning the text and specifying a width::" +msgstr "对齐文本以及指定宽度::" + +#: ../../library/string.rst:721 +msgid "" +">>> '{:<30}'.format('left aligned')\n" +"'left aligned '\n" +">>> '{:>30}'.format('right aligned')\n" +"' right aligned'\n" +">>> '{:^30}'.format('centered')\n" +"' centered '\n" +">>> '{:*^30}'.format('centered') # use '*' as a fill char\n" +"'***********centered***********'" +msgstr "" +">>> '{:<30}'.format('left aligned')\n" +"'left aligned '\n" +">>> '{:>30}'.format('right aligned')\n" +"' right aligned'\n" +">>> '{:^30}'.format('centered')\n" +"' centered '\n" +">>> '{:*^30}'.format('centered') # 使用 '*' 作为填充字符\n" +"'***********centered***********'" + +#: ../../library/string.rst:730 +msgid "Replacing ``%+f``, ``%-f``, and ``% f`` and specifying a sign::" +msgstr "替代 ``%+f``, ``%-f`` 和 ``% f`` 以及指定正负号::" + +#: ../../library/string.rst:732 +msgid "" +">>> '{:+f}; {:+f}'.format(3.14, -3.14) # show it always\n" +"'+3.140000; -3.140000'\n" +">>> '{: f}; {: f}'.format(3.14, -3.14) # show a space for positive numbers\n" +"' 3.140000; -3.140000'\n" +">>> '{:-f}; {:-f}'.format(3.14, -3.14) # show only the minus -- same as '{:f}; {:f}'\n" +"'3.140000; -3.140000'" +msgstr "" +">>> '{:+f}; {:+f}'.format(3.14, -3.14) # 总是显示\n" +"'+3.140000; -3.140000'\n" +">>> '{: f}; {: f}'.format(3.14, -3.14) # 对正数显示一个空格\n" +"' 3.140000; -3.140000'\n" +">>> '{:-f}; {:-f}'.format(3.14, -3.14) # 只显示负号 -- 等同于 '{:f}; {:f}'\n" +"'3.140000; -3.140000'" + +#: ../../library/string.rst:739 +msgid "" +"Replacing ``%x`` and ``%o`` and converting the value to different bases::" +msgstr "替代 ``%x`` 和 ``%o`` 以及转换基于不同进位制的值::" + +#: ../../library/string.rst:741 +msgid "" +">>> # format also supports binary numbers\n" +">>> \"int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}\".format(42)\n" +"'int: 42; hex: 2a; oct: 52; bin: 101010'\n" +">>> # with 0x, 0o, or 0b as prefix:\n" +">>> \"int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}\".format(42)\n" +"'int: 42; hex: 0x2a; oct: 0o52; bin: 0b101010'" +msgstr "" +">>> # 格式也支持二进制数\n" +">>> \"int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}\".format(42)\n" +"'int: 42; hex: 2a; oct: 52; bin: 101010'\n" +">>> # with 0x, 0o, or 0b as prefix:\n" +">>> \"int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}\".format(42)\n" +"'int: 42; hex: 0x2a; oct: 0o52; bin: 0b101010'" + +#: ../../library/string.rst:748 +msgid "Using the comma or the underscore as a digit group separator::" +msgstr "使用逗号或下划线作为数字组分隔符::" + +#: ../../library/string.rst:750 +msgid "" +">>> '{:,}'.format(1234567890)\n" +"'1,234,567,890'\n" +">>> '{:_}'.format(1234567890)\n" +"'1_234_567_890'\n" +">>> '{:_b}'.format(1234567890)\n" +"'100_1001_1001_0110_0000_0010_1101_0010'\n" +">>> '{:_x}'.format(1234567890)\n" +"'4996_02d2'\n" +">>> '{:_}'.format(123456789.123456789)\n" +"'123_456_789.12345679'\n" +">>> '{:.,}'.format(123456789.123456789)\n" +"'123456789.123,456,79'\n" +">>> '{:,._}'.format(123456789.123456789)\n" +"'123,456,789.123_456_79'" +msgstr "" +">>> '{:,}'.format(1234567890)\n" +"'1,234,567,890'\n" +">>> '{:_}'.format(1234567890)\n" +"'1_234_567_890'\n" +">>> '{:_b}'.format(1234567890)\n" +"'100_1001_1001_0110_0000_0010_1101_0010'\n" +">>> '{:_x}'.format(1234567890)\n" +"'4996_02d2'\n" +">>> '{:_}'.format(123456789.123456789)\n" +"'123_456_789.12345679'\n" +">>> '{:.,}'.format(123456789.123456789)\n" +"'123456789.123,456,79'\n" +">>> '{:,._}'.format(123456789.123456789)\n" +"'123,456,789.123_456_79'" + +#: ../../library/string.rst:765 +msgid "Expressing a percentage::" +msgstr "表示为百分数::" + +#: ../../library/string.rst:767 +msgid "" +">>> points = 19\n" +">>> total = 22\n" +">>> 'Correct answers: {:.2%}'.format(points/total)\n" +"'Correct answers: 86.36%'" +msgstr "" +">>> points = 19\n" +">>> total = 22\n" +">>> 'Correct answers: {:.2%}'.format(points/total)\n" +"'Correct answers: 86.36%'" + +#: ../../library/string.rst:772 +msgid "Using type-specific formatting::" +msgstr "使用特定类型的专属格式化::" + +#: ../../library/string.rst:774 +msgid "" +">>> import datetime as dt\n" +">>> d = dt.datetime(2010, 7, 4, 12, 15, 58)\n" +">>> '{:%Y-%m-%d %H:%M:%S}'.format(d)\n" +"'2010-07-04 12:15:58'" +msgstr "" + +#: ../../library/string.rst:779 +msgid "Nesting arguments and more complex examples::" +msgstr "嵌套参数以及更复杂的示例::" + +#: ../../library/string.rst:781 +msgid "" +">>> for align, text in zip('<^>', ['left', 'center', 'right']):\n" +"... '{0:{fill}{align}16}'.format(text, fill=align, align=align)\n" +"...\n" +"'left<<<<<<<<<<<<'\n" +"'^^^^^center^^^^^'\n" +"'>>>>>>>>>>>right'\n" +">>>\n" +">>> octets = [192, 168, 0, 1]\n" +">>> '{:02X}{:02X}{:02X}{:02X}'.format(*octets)\n" +"'C0A80001'\n" +">>> int(_, 16)\n" +"3232235521\n" +">>>\n" +">>> width = 5\n" +">>> for num in range(5,12):\n" +"... for base in 'dXob':\n" +"... print('{0:{width}{base}}'.format(num, base=base, width=width), end=' ')\n" +"... print()\n" +"...\n" +" 5 5 5 101\n" +" 6 6 6 110\n" +" 7 7 7 111\n" +" 8 8 10 1000\n" +" 9 9 11 1001\n" +" 10 A 12 1010\n" +" 11 B 13 1011" +msgstr "" +">>> for align, text in zip('<^>', ['left', 'center', 'right']):\n" +"... '{0:{fill}{align}16}'.format(text, fill=align, align=align)\n" +"...\n" +"'left<<<<<<<<<<<<'\n" +"'^^^^^center^^^^^'\n" +"'>>>>>>>>>>>right'\n" +">>>\n" +">>> octets = [192, 168, 0, 1]\n" +">>> '{:02X}{:02X}{:02X}{:02X}'.format(*octets)\n" +"'C0A80001'\n" +">>> int(_, 16)\n" +"3232235521\n" +">>>\n" +">>> width = 5\n" +">>> for num in range(5,12):\n" +"... for base in 'dXob':\n" +"... print('{0:{width}{base}}'.format(num, base=base, width=width), end=' ')\n" +"... print()\n" +"...\n" +" 5 5 5 101\n" +" 6 6 6 110\n" +" 7 7 7 111\n" +" 8 8 10 1000\n" +" 9 9 11 1001\n" +" 10 A 12 1010\n" +" 11 B 13 1011" + +#: ../../library/string.rst:813 +msgid "Template strings ($-strings)" +msgstr "模板字符串 ($-字符串)" + +#: ../../library/string.rst:817 +msgid "" +"The feature described here was introduced in Python 2.4; a simple templating" +" method based upon regular expressions. It predates :meth:`str.format`, " +":ref:`formatted string literals `, and :ref:`template string " +"literals `." +msgstr "" +"此处介绍的特性是在 Python 2.4 中引入的;是一种基于正则表达式的简单模板方法。它的引入时间早于 :meth:`str.format`, " +":ref:`格式化字符串字面值 ` 和 :ref:`模板字符串字面值 `。" + +#: ../../library/string.rst:822 +msgid "" +"It is unrelated to template string literals (t-strings), which were " +"introduced in Python 3.14. These evaluate to " +":class:`string.templatelib.Template` objects, found in the " +":mod:`string.templatelib` module." +msgstr "" +"它与模板字符串字面值(t-字符串)无关,后者是在 Python 3.14 中引入的。这些 t-字符串 会被求值为 " +":class:`string.templatelib.Template` 对象,该对象位于 :mod:`string.templatelib` 模块中。" + +#: ../../library/string.rst:827 +msgid "" +"Template strings provide simpler string substitutions as described in " +":pep:`292`. A primary use case for template strings is for " +"internationalization (i18n) since in that context, the simpler syntax and " +"functionality makes it easier to translate than other built-in string " +"formatting facilities in Python. As an example of a library built on " +"template strings for i18n, see the `flufl.i18n " +"`_ package." +msgstr "" +"模板字符串提供了由 :pep:`292` 所描述的更简便的字符串替换方式。模板字符串的一个主要用例是文本国际化 " +"(i18n),因为在此情境下,更简单的语法和功能使得文本翻译过程比使用 Python 的其他内置字符串格式化工具更方便。作为基于模板字符串构建以实现 " +"i18n 的库的一个例子,请参看 `flufl.i18n `_" +" 包。" + +#: ../../library/string.rst:837 +msgid "" +"Template strings support ``$``-based substitutions, using the following " +"rules:" +msgstr "模板字符串支持基于 ``$`` 的替换,使用以下规则:" + +#: ../../library/string.rst:839 +msgid "``$$`` is an escape; it is replaced with a single ``$``." +msgstr "``$$`` 为转义符号;它会被替换为单个的 ``$``。" + +#: ../../library/string.rst:841 +msgid "" +"``$identifier`` names a substitution placeholder matching a mapping key of " +"``\"identifier\"``. By default, ``\"identifier\"`` is restricted to any " +"case-insensitive ASCII alphanumeric string (including underscores) that " +"starts with an underscore or ASCII letter. The first non-identifier " +"character after the ``$`` character terminates this placeholder " +"specification." +msgstr "" +"``$identifier`` 为替换占位符,它会匹配一个名为 ``\"identifier\"`` 的映射键。 " +"在默认情况下,``\"identifier\"`` 限制为任意 ASCII 字母数字(包括下划线)组成的字符串,不区分大小写,以下划线或 ASCII " +"字母开头。在 ``$`` 字符之后的第一个非标识符字符将表明占位符的终结。" + +#: ../../library/string.rst:848 +msgid "" +"``${identifier}`` is equivalent to ``$identifier``. It is required when " +"valid identifier characters follow the placeholder but are not part of the " +"placeholder, such as ``\"${noun}ification\"``." +msgstr "" +"``${identifier}`` 等价于 ``$identifier``。当占位符之后紧跟着有效的但又不是占位符一部分的标识符字符时需要使用,例如 " +"``\"${noun}ification\"``。" + +#: ../../library/string.rst:852 +msgid "" +"Any other appearance of ``$`` in the string will result in a " +":exc:`ValueError` being raised." +msgstr "在字符串的其他位置出现 ``$`` 将导致引发 :exc:`ValueError`。" + +#: ../../library/string.rst:855 +msgid "" +"The :mod:`!string` module provides a :class:`Template` class that implements" +" these rules. The methods of :class:`Template` are:" +msgstr "" +":mod:`!string` 模块提供了实现这些规则的 :class:`Template` 类。 :class:`Template` 具有下列方法:" + +#: ../../library/string.rst:861 +msgid "The constructor takes a single argument which is the template string." +msgstr "该构造器接受一个参数作为模板字符串。" + +#: ../../library/string.rst:866 +msgid "" +"Performs the template substitution, returning a new string. *mapping* is " +"any dictionary-like object with keys that match the placeholders in the " +"template. Alternatively, you can provide keyword arguments, where the " +"keywords are the placeholders. When both *mapping* and *kwds* are given and" +" there are duplicates, the placeholders from *kwds* take precedence." +msgstr "" +"执行模板替换,返回一个新字符串。 *mapping* 为任意字典类对象,其中的键将匹配模板中的占位符。 " +"或者你也可以提供一组关键字参数,其中的关键字即对应占位符。当同时给出 *mapping* 和 *kwds* 并且存在重复时,则以 *kwds* " +"中的占位符为优先。" + +#: ../../library/string.rst:875 +msgid "" +"Like :meth:`substitute`, except that if placeholders are missing from " +"*mapping* and *kwds*, instead of raising a :exc:`KeyError` exception, the " +"original placeholder will appear in the resulting string intact. Also, " +"unlike with :meth:`substitute`, any other appearances of the ``$`` will " +"simply return ``$`` instead of raising :exc:`ValueError`." +msgstr "" +"类似于 :meth:`substitute`,不同之处是如果有占位符未在 *mapping* 和 *kwds* 中找到,不是引发 " +":exc:`KeyError` 异常,而是将原始占位符不加修改地显示在结果字符串中。另一个与 :meth:`substitute` " +"的差异是任何在其他情况下出现的 ``$`` 将简单地返回 ``$`` 而不是引发 :exc:`ValueError`。" + +#: ../../library/string.rst:881 +msgid "" +"While other exceptions may still occur, this method is called \"safe\" " +"because it always tries to return a usable string instead of raising an " +"exception. In another sense, :meth:`safe_substitute` may be anything other " +"than safe, since it will silently ignore malformed templates containing " +"dangling delimiters, unmatched braces, or placeholders that are not valid " +"Python identifiers." +msgstr "" +"此方法被认为“安全”,因为虽然仍有可能发生其他异常,但它总是尝试返回可用的字符串而不是引发一个异常。 " +"从另一方面来说,:meth:`safe_substitute` " +"也可能根本算不上安全,因为它将静默地忽略错误格式的模板,例如包含多余的分隔符、不成对的花括号或不是合法 Python 标识符的占位符等等。" + +#: ../../library/string.rst:891 +msgid "" +"Returns ``False`` if the template has invalid placeholders that will cause " +":meth:`substitute` to raise :exc:`ValueError`." +msgstr "如果模板有会导致 :meth:`substitute` 引发 :exc:`ValueError` 的无效占位符则返回 ``False``。" + +#: ../../library/string.rst:899 +msgid "" +"Returns a list of the valid identifiers in the template, in the order they " +"first appear, ignoring any invalid identifiers." +msgstr "返回模板中有效占位符的列表,按它们首次出现的顺序排列,忽略任何无效标识符。" + +#: ../../library/string.rst:904 +msgid ":class:`Template` instances also provide one public data attribute:" +msgstr ":class:`Template` 的实例还提供一个公有数据属性:" + +#: ../../library/string.rst:908 +msgid "" +"This is the object passed to the constructor's *template* argument. In " +"general, you shouldn't change it, but read-only access is not enforced." +msgstr "这是作为构造器的 *template* 参数被传入的对象。一般来说,你不应该修改它,但并不强制要求只读访问。" + +#: ../../library/string.rst:911 +msgid "Here is an example of how to use a Template::" +msgstr "以下是一个如何使用模版的示例:" + +#: ../../library/string.rst:913 +msgid "" +">>> from string import Template\n" +">>> s = Template('$who likes $what')\n" +">>> s.substitute(who='tim', what='kung pao')\n" +"'tim likes kung pao'\n" +">>> d = dict(who='tim')\n" +">>> Template('Give $who $100').substitute(d)\n" +"Traceback (most recent call last):\n" +"...\n" +"ValueError: Invalid placeholder in string: line 1, col 11\n" +">>> Template('$who likes $what').substitute(d)\n" +"Traceback (most recent call last):\n" +"...\n" +"KeyError: 'what'\n" +">>> Template('$who likes $what').safe_substitute(d)\n" +"'tim likes $what'" +msgstr "" +">>> from string import Template\n" +">>> s = Template('$who likes $what')\n" +">>> s.substitute(who='tim', what='kung pao')\n" +"'tim likes kung pao'\n" +">>> d = dict(who='tim')\n" +">>> Template('Give $who $100').substitute(d)\n" +"Traceback (most recent call last):\n" +"...\n" +"ValueError: Invalid placeholder in string: line 1, col 11\n" +">>> Template('$who likes $what').substitute(d)\n" +"Traceback (most recent call last):\n" +"...\n" +"KeyError: 'what'\n" +">>> Template('$who likes $what').safe_substitute(d)\n" +"'tim likes $what'" + +#: ../../library/string.rst:929 +msgid "" +"Advanced usage: you can derive subclasses of :class:`Template` to customize " +"the placeholder syntax, delimiter character, or the entire regular " +"expression used to parse template strings. To do this, you can override " +"these class attributes:" +msgstr "" +"进阶用法:你可以派生 :class:`Template` 的子类来自定义占位符语法、分隔符,或用于解析模板字符串的整个正则表达式。 " +"为此目的,你可以重载这些类属性:" + +#: ../../library/string.rst:934 +msgid "" +"*delimiter* -- This is the literal string describing a placeholder " +"introducing delimiter. The default value is ``$``. Note that this should " +"*not* be a regular expression, as the implementation will call " +":meth:`re.escape` on this string as needed. Note further that you cannot " +"change the delimiter after class creation (i.e. a different delimiter must " +"be set in the subclass's class namespace)." +msgstr "" +"*delimiter* -- 这是用来表示占位符的起始的分隔符的字符串字面值。默认值为 ``$``。请注意此参数 *不能* " +"为正则表达式,因为其实现将在必要时对此字符串调用 :meth:`re.escape`。 " +"还要注意你不能在创建类之后改变此分隔符(例如在子类的类命名空间中必须设置不同的分隔符)。" + +#: ../../library/string.rst:941 +msgid "" +"*idpattern* -- This is the regular expression describing the pattern for " +"non-braced placeholders. The default value is the regular expression " +"``(?a:[_a-z][_a-z0-9]*)``. If this is given and *braceidpattern* is " +"``None`` this pattern will also apply to braced placeholders." +msgstr "" +"*idpattern* -- 这是用来描述不带花括号的占位符的模式的正则表达式。默认值为正则表达式 " +"``(?a:[_a-z][_a-z0-9]*)``。如果给出了此属性并且 *braceidpattern* 为 ``None`` " +"则此模式也将作用于带花括号的占位符。" + +#: ../../library/string.rst:948 +msgid "" +"Since default *flags* is ``re.IGNORECASE``, pattern ``[a-z]`` can match with" +" some non-ASCII characters. That's why we use the local ``a`` flag here." +msgstr "" +"由于默认的 *flags* 为 ``re.IGNORECASE``,模式 ``[a-z]`` 可以匹配某些非 ASCII 字符。 " +"因此我们在这里使用了局部旗标 ``a``。" + +#: ../../library/string.rst:952 +msgid "" +"*braceidpattern* can be used to define separate patterns used inside and " +"outside the braces." +msgstr "*braceidpattern* 可被用来定义对花括号内部和外部进行区分的模式。" + +#: ../../library/string.rst:956 +msgid "" +"*braceidpattern* -- This is like *idpattern* but describes the pattern for " +"braced placeholders. Defaults to ``None`` which means to fall back to " +"*idpattern* (i.e. the same pattern is used both inside and outside braces). " +"If given, this allows you to define different patterns for braced and " +"unbraced placeholders." +msgstr "" +"*braceidpattern* -- 此属性类似于 *idpattern* 但是用来描述带花括号的占位符的模式。默认值 ``None`` 意味着回退到" +" *idpattern* (即在花括号内部和外部使用相同的模式)。如果给出此属性,这将允许你为带花括号和不带花括号的占位符定义不同的模式。" + +#: ../../library/string.rst:964 +msgid "" +"*flags* -- The regular expression flags that will be applied when compiling " +"the regular expression used for recognizing substitutions. The default " +"value is ``re.IGNORECASE``. Note that ``re.VERBOSE`` will always be added " +"to the flags, so custom *idpattern*\\ s must follow conventions for verbose " +"regular expressions." +msgstr "" +"*flags* -- 将在编译用于识别替换内容的正则表达式被应用的正则表达式旗标。默认值为 ``re.IGNORECASE``。请注意 " +"``re.VERBOSE`` 总是会被加为旗标,因此自定义的 *idpattern* 必须遵循详细正则表达式的约定。" + +#: ../../library/string.rst:972 +msgid "" +"Alternatively, you can provide the entire regular expression pattern by " +"overriding the class attribute *pattern*. If you do this, the value must be" +" a regular expression pattern string, or a compiled regular expression " +"object, with four named capturing groups. The capturing groups correspond " +"to the rules given above, along with the invalid placeholder rule:" +msgstr "" + +#: ../../library/string.rst:979 +msgid "" +"*escaped* -- This group matches the escape sequence, e.g. ``$$``, in the " +"default pattern." +msgstr "*escaped* -- 这个组匹配转义序列,在默认模式中即 ``$$``。" + +#: ../../library/string.rst:982 +msgid "" +"*named* -- This group matches the unbraced placeholder name; it should not " +"include the delimiter in capturing group." +msgstr "*named* -- 这个组匹配不带花括号的占位符名称;它不应当包含捕获组中的分隔符。" + +#: ../../library/string.rst:985 +msgid "" +"*braced* -- This group matches the brace enclosed placeholder name; it " +"should not include either the delimiter or braces in the capturing group." +msgstr "*braced* -- 这个组匹配带有花括号的占位符名称;它不应当包含捕获组中的分隔符或者花括号。" + +#: ../../library/string.rst:988 +msgid "" +"*invalid* -- This group matches any other delimiter pattern (usually a " +"single delimiter), and it should appear last in the regular expression." +msgstr "*invalid* -- 这个组匹配任何其他分隔符模式(通常为单个分隔符),并且它应当出现在正则表达式的末尾。" + +#: ../../library/string.rst:991 +msgid "" +"The methods on this class will raise :exc:`ValueError` if the pattern " +"matches the template without one of these named groups matching." +msgstr "如果模式匹配模板但这些命名分组均不匹配则该类上的方法将引发 :exc:`ValueError`。" + +#: ../../library/string.rst:996 +msgid "Helper functions" +msgstr "辅助函数" + +#: ../../library/string.rst:1000 +msgid "" +"Split the argument into words using :meth:`str.split`, capitalize each word " +"using :meth:`str.capitalize`, and join the capitalized words using " +":meth:`str.join`. If the optional second argument *sep* is absent or " +"``None``, runs of whitespace characters are replaced by a single space and " +"leading and trailing whitespace are removed, otherwise *sep* is used to " +"split and join the words." +msgstr "" +"使用 :meth:`str.split` 将参数拆分为单词,使用 :meth:`str.capitalize` 将单词转为大写形式,使用 " +":meth:`str.join` 将大写的单词进行拼接。如果可选的第二个参数 *sep* 被省略或为 " +"``None``,则连续的空白字符会被替换为单个空格符并且开头和末尾的空白字符会被移除,否则 *sep* 会被用来拆分和拼接单词。" + +#: ../../library/string.rst:205 +msgid "{} (curly brackets)" +msgstr "{} (花括号)" + +#: ../../library/string.rst:205 ../../library/string.rst:352 +#: ../../library/string.rst:385 ../../library/string.rst:404 +#: ../../library/string.rst:413 ../../library/string.rst:452 +msgid "in string formatting" +msgstr "在字符串格式化中" + +#: ../../library/string.rst:205 +msgid ". (dot)" +msgstr ". (点号)" + +#: ../../library/string.rst:205 +msgid "[] (square brackets)" +msgstr "[] (方括号)" + +#: ../../library/string.rst:205 +msgid "! (exclamation)" +msgstr "! (感叹号)" + +#: ../../library/string.rst:205 +msgid ": (colon)" +msgstr ": (冒号)" + +#: ../../library/string.rst:352 +msgid "< (less)" +msgstr "< (小于号)" + +#: ../../library/string.rst:352 +msgid "> (greater)" +msgstr "> (大于号)" + +#: ../../library/string.rst:352 +msgid "= (equals)" +msgstr "= (等于号)" + +#: ../../library/string.rst:352 +msgid "^ (caret)" +msgstr "^ (脱字号)" + +#: ../../library/string.rst:385 +msgid "+ (plus)" +msgstr "+ (加号)" + +#: ../../library/string.rst:385 +msgid "- (minus)" +msgstr "- (减号)" + +#: ../../library/string.rst:404 +msgid "z" +msgstr "z" + +#: ../../library/string.rst:413 +msgid "# (hash)" +msgstr "# (hash)" + +#: ../../library/string.rst:452 +msgid ", (comma)" +msgstr ", (逗号)" + +#: ../../library/string.rst:452 +msgid "_ (underscore)" +msgstr "_ (下划线)" + +#: ../../library/string.rst:835 +msgid "$ (dollar)" +msgstr "$ (货币符号)" + +#: ../../library/string.rst:835 +msgid "in template strings" +msgstr "在模板字符串中" diff --git a/library/string.templatelib.po b/library/string.templatelib.po new file mode 100644 index 0000000000..a9beb0edc6 --- /dev/null +++ b/library/string.templatelib.po @@ -0,0 +1,369 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/string.templatelib.rst:2 +msgid ":mod:`!string.templatelib` --- Support for template string literals" +msgstr ":mod:`!string.templatelib` --- 对模板字符串字面值的支持" + +#: ../../library/string.templatelib.rst:7 +msgid "**Source code:** :source:`Lib/string/templatelib.py`" +msgstr "**源代码:** :source:`Lib/string/templatelib.py`" + +#: ../../library/string.templatelib.rst:13 +msgid ":ref:`Format strings `" +msgstr ":ref:`格式化字符串 `" + +#: ../../library/string.templatelib.rst:14 +msgid ":ref:`Template string literal (t-string) syntax `" +msgstr ":ref:`模板字符串字面值(t-字符串)语法 `" + +#: ../../library/string.templatelib.rst:15 +msgid ":pep:`750`" +msgstr ":pep:`750`" + +#: ../../library/string.templatelib.rst:20 +msgid "Template strings" +msgstr "模板字符串" + +#: ../../library/string.templatelib.rst:24 +msgid "" +"Template strings are a mechanism for custom string processing. They have the" +" full flexibility of Python's :ref:`f-strings`, but return a " +":class:`Template` instance that gives access to the static and interpolated " +"(in curly brackets) parts of a string *before* they are combined." +msgstr "" +"模板字符串是一种用于自定义字符串处理的机制。它们具有 Python 的 :ref:`f-strings` 的全部灵活性,但返回一个 " +":class:`Template` 实例,它提供在将静态部分和(以花括号标记的)插值部分组合起来 *之前* 对它们的访问。" + +#: ../../library/string.templatelib.rst:30 +msgid "" +"To write a t-string, use a ``'t'`` prefix instead of an ``'f'``, like so:" +msgstr "要编写 t-字符串,使用 ``'t'`` 前缀而不是 ``'f'``,如下所示:" + +#: ../../library/string.templatelib.rst:32 +msgid "" +">>> pi = 3.14\n" +">>> t't-strings are new in Python {pi!s}!'\n" +"Template(\n" +" strings=('t-strings are new in Python ', '!'),\n" +" interpolations=(Interpolation(3.14, 'pi', 's', ''),)\n" +")" +msgstr "" +">>> pi = 3.14\n" +">>> t't-strings are new in Python {pi!s}!'\n" +"Template(\n" +" strings=('t-strings are new in Python ', '!'),\n" +" interpolations=(Interpolation(3.14, 'pi', 's', ''),)\n" +")" + +#: ../../library/string.templatelib.rst:42 +msgid "Types" +msgstr "类型" + +#: ../../library/string.templatelib.rst:46 +msgid "" +"The :class:`!Template` class describes the contents of a template string. It" +" is immutable, meaning that attributes of a template cannot be reassigned." +msgstr ":class:`!Template` 类描述了模板字符串的内容。它是不可变的,意味着模板的属性不能被重新赋值。" + +#: ../../library/string.templatelib.rst:49 +msgid "" +"The most common way to create a :class:`!Template` instance is to use the " +":ref:`template string literal syntax `. This syntax is identical " +"to that of :ref:`f-strings `, except that it uses a ``t`` prefix " +"in place of an ``f``:" +msgstr "" +"创建 :class:`!Template` 实例的最常见方式是使用 :ref:`模板字符串字面值语法 `。这种语法与 " +":ref:`f-字符串 ` 的语法相同,只是它使用 ``t`` 前缀代替 ``f``:" + +#: ../../library/string.templatelib.rst:59 +msgid "" +"Templates are stored as sequences of literal :attr:`~Template.strings` and " +"dynamic :attr:`~Template.interpolations`. A :attr:`~Template.values` " +"attribute holds the values of the interpolations:" +msgstr "" +"模板被存储为字面值 :attr:`~Template.strings` 序列和动态 :attr:`~Template.interpolations` " +"序列。一个 :attr:`~Template.values` 属性保存插值的值:" + +#: ../../library/string.templatelib.rst:72 +msgid "" +"The :attr:`!strings` tuple has one more element than :attr:`!interpolations`" +" and :attr:`!values`; the interpolations “belong” between the strings. This " +"may be easier to understand when tuples are aligned" +msgstr "" +":attr:`!strings` 元组比 :attr:`!interpolations` 和 :attr:`!values` " +"多一个元素;插值“属于”字符串之间。当元组对齐时可能更容易理解" + +#: ../../library/string.templatelib.rst:76 +msgid "" +"template.strings: ('Ah! We do have ', '.')\n" +"template.values: ( 'Camembert', )" +msgstr "" +"template.strings: ('Ah! We do have ', '.')\n" +"template.values: ( 'Camembert', )" + +#: ../../library/string.templatelib.rst:82 +#: ../../library/string.templatelib.rst:249 +msgid "Attributes" +msgstr "属性" + +#: ../../library/string.templatelib.rst:86 +msgid "A :class:`tuple` of the static strings in the template." +msgstr "模板中静态字符串的 :class:`tuple`。" + +#: ../../library/string.templatelib.rst:93 +msgid "Empty strings *are* included in the tuple:" +msgstr "空字符串 *确实* 包含在元组中:" + +#: ../../library/string.templatelib.rst:101 +msgid "" +"The ``strings`` tuple is never empty, and always contains one more string " +"than the ``interpolations`` and ``values`` tuples:" +msgstr "``strings`` 元组从不为空,并且总是比 ``interpolations`` 和 ``values`` 元组多一个字符串:" + +#: ../../library/string.templatelib.rst:116 +msgid "A :class:`tuple` of the interpolations in the template." +msgstr "模板中插值的 :class:`tuple`。" + +#: ../../library/string.templatelib.rst:123 +msgid "" +"The ``interpolations`` tuple may be empty and always contains one fewer " +"values than the ``strings`` tuple:" +msgstr "``interpolations`` 元组可能为空,并且总是比 ``strings`` 元组少一个值:" + +#: ../../library/string.templatelib.rst:132 +msgid "A tuple of all interpolated values in the template." +msgstr "模板中所有插值值的元组。" + +#: ../../library/string.templatelib.rst:139 +msgid "" +"The ``values`` tuple always has the same length as the ``interpolations`` " +"tuple. It is always equivalent to ``tuple(i.value for i in " +"template.interpolations)``." +msgstr "" +"``values`` 元组总是与 ``interpolations`` 元组长度相同。它总是等同于 ``tuple(i.value for i in " +"template.interpolations)``." + +#: ../../library/string.templatelib.rst:144 +#: ../../library/string.templatelib.rst:317 +msgid "Methods" +msgstr "方法" + +#: ../../library/string.templatelib.rst:147 +msgid "" +"While literal syntax is the most common way to create a :class:`!Template`, " +"it is also possible to create them directly using the constructor:" +msgstr "虽然字面值语法是创建 :class:`!Template` 的最常见方式,但也可以直接使用构造函数创建它们:" + +#: ../../library/string.templatelib.rst:158 +msgid "" +"If multiple strings are passed consecutively, they will be concatenated into" +" a single value in the :attr:`~Template.strings` attribute. For example, the" +" following code creates a :class:`Template` with a single final string:" +msgstr "" +"如果连续传递多个字符串,它们将被连接成一个单一的值,存储在 :attr:`~Template.strings` 属性中。例如,以下代码创建了一个 " +":class:`Template`,其最终字符串为单一值:" + +#: ../../library/string.templatelib.rst:167 +msgid "" +"If multiple interpolations are passed consecutively, they will be treated as" +" separate interpolations and an empty string will be inserted between them. " +"For example, the following code creates a template with empty placeholders " +"in the :attr:`~Template.strings` attribute:" +msgstr "" +"如果连续传递多个插值,它们将被视为独立的插值,并在它们之间插入一个空字符串。例如,以下代码创建了一个模板,在 " +":attr:`~Template.strings` 属性中包含空占位符:" + +#: ../../library/string.templatelib.rst:182 +msgid "" +"Iterate over the template, yielding each non-empty string and " +":class:`Interpolation` in the correct order:" +msgstr "遍历模板,按正确顺序生成每个非空字符串和 :class:`Interpolation`:" + +#: ../../library/string.templatelib.rst:191 +msgid "Empty strings are **not** included in the iteration:" +msgstr "空字符串 **不** 包含在迭代中:" + +#: ../../library/string.templatelib.rst:204 +msgid "" +"Concatenate this template with another, returning a new :class:`!Template` " +"instance:" +msgstr "将此模板与另一个模板连接,返回一个新的 :class:`!Template` 实例:" + +#: ../../library/string.templatelib.rst:211 +msgid "" +"Concatenating a :class:`!Template` and a ``str`` is **not** supported. This " +"is because it is unclear whether the string should be treated as a static " +"string or an interpolation. If you want to concatenate a :class:`!Template` " +"with a string, you should either wrap the string directly in a " +":class:`!Template` (to treat it as a static string) or use an " +":class:`!Interpolation` (to treat it as dynamic):" +msgstr "" +"连接一个 :class:`!Template` 和一个 ``str`` 是 **不** 支持的。 " +"这是因为不清楚该字符串应被视为静态字符串还是插值。如果您想将 :class:`!Template` 与字符串连接,您应该要么直接将字符串包装在 " +":class:`!Template` 中 (将其视为静态字符串),要么使用 :class:`!Interpolation` (将其视为动态字符串):" + +#: ../../library/string.templatelib.rst:232 +msgid "" +"The :class:`!Interpolation` type represents an expression inside a template " +"string. It is immutable, meaning that attributes of an interpolation cannot " +"be reassigned." +msgstr ":class:`!Interpolation` 类型表示模板字符串内的一个表达式。它是不可变的,意味着插值的属性不能被重新赋值。" + +#: ../../library/string.templatelib.rst:235 +msgid "" +"Interpolations support pattern matching, allowing you to match against their" +" attributes with the :ref:`match statement `:" +msgstr "插值支持模式匹配,允许你使用 :ref:`match 语句 ` 匹配其属性:" + +#: ../../library/string.templatelib.rst:253 +msgid "The evaluated value of the interpolation." +msgstr "插值的计算值。" + +#: ../../library/string.templatelib.rst:261 +msgid "" +"For interpolations created by t-string literals, :attr:`!expression` is the " +"expression text found inside the curly brackets (``{`` & ``}``), including " +"any whitespace, excluding the curly brackets themselves, and ending before " +"the first ``!``, ``:``, or ``=`` if any is present. For manually created " +"interpolations, :attr:`!expression` is the arbitrary string provided when " +"constructing the interpolation instance." +msgstr "" +"对于由 t-字符串字面值创建的插值,:attr:`!expression` 是在花括号 (``{`` & ``}``) " +"以内的表达式文本,包括任何空白符,不包括花括号本身,并到可能存在的 ``!``, ``:`` 或 ``=`` 前为止。 " +"对于手动创建的插值,:attr:`!expression` 是构造插值实例时提供的任意字符串。" + +#: ../../library/string.templatelib.rst:268 +msgid "" +"We recommend using valid Python expressions or the empty string for the " +"``expression`` field of manually created :class:`!Interpolation` instances, " +"although this is not enforced at runtime." +msgstr "" +"我们建议使用有效的 Python 表达式或空字符串作为手动创建的 :class:`!Interpolation` 实例的 ``expression`` " +"字段,但这并不会在运行时强制要求。" + +#: ../../library/string.templatelib.rst:278 +msgid "The conversion to apply to the value, or ``None``." +msgstr "要应用于值的转换,或 ``None``。" + +#: ../../library/string.templatelib.rst:280 +msgid "" +"The :attr:`!conversion` is the optional conversion to apply to the value:" +msgstr ":attr:`!conversion` 是应用于值的可选转换:" + +#: ../../library/string.templatelib.rst:288 +msgid "" +"Unlike f-strings, where conversions are applied automatically, the expected " +"behavior with t-strings is that code that *processes* the :class:`!Template`" +" will decide how to interpret and whether to apply the :attr:`!conversion`. " +"For convenience, the :func:`convert` function can be used to mimic f-string " +"conversion semantics." +msgstr "" +"与 f-字符串 不同,f-字符串 中的转换会自动应用,t-字符串 的预期行为是处理 :class:`!Template` " +"的代码将决定如何解释以及是否应用 :attr:`!conversion`。为方便起见,可以使用 :func:`convert` 函数来模拟 f-字符串 " +"转换语义。" + +#: ../../library/string.templatelib.rst:298 +msgid "The format specification to apply to the value." +msgstr "要应用于值的格式规范。" + +#: ../../library/string.templatelib.rst:300 +msgid "" +"The :attr:`!format_spec` is an optional, arbitrary string used as the format" +" specification to present the value:" +msgstr ":attr:`!format_spec` 是一个可选的、任意的字符串,用作格式规范来呈现值:" + +#: ../../library/string.templatelib.rst:308 +msgid "" +"Unlike f-strings, where format specifications are applied automatically via " +"the :func:`format` protocol, the expected behavior with t-strings is that " +"code that *processes* the interpolation will decide how to interpret and " +"whether to apply the format specification. As a result, :attr:`!format_spec`" +" values in interpolations can be arbitrary strings, including those that do " +"not conform to the :func:`format` protocol." +msgstr "" +"与 f-字符串不同,f-字符串中的格式规范会通过 :func:`format` 协议自动应用,而 " +"t-字符串的预期行为是处理插值的代码将决定如何解释以及是否应用格式规范。因此,插值中的 :attr:`!format_spec` " +"值可以是任意字符串,包括那些不符合 :func:`format` 协议的字符串。" + +#: ../../library/string.templatelib.rst:323 +msgid "Create a new :class:`!Interpolation` object from component parts." +msgstr "从组成部分创建一个新的 :class:`!Interpolation` 对象。" + +#: ../../library/string.templatelib.rst:0 +msgid "Parameters" +msgstr "参数" + +#: ../../library/string.templatelib.rst:325 +msgid "The evaluated, in-scope result of the interpolation." +msgstr "插值运算的评估结果(在作用域范围内)。" + +#: ../../library/string.templatelib.rst:326 +msgid "The text of a valid Python expression, or an empty string." +msgstr "一个有效 Python 表达式的文本,或一个空字符串。" + +#: ../../library/string.templatelib.rst:328 +msgid "" +"The :ref:`conversion ` to be used, one of ``None``, ``'a'``, " +"``'r'``, or ``'s'``." +msgstr "" +"要使用的 :ref:`转换 `,可以是 ``None``、``'a'``、``'r'`` 或 ``'s'`` 之一。" + +#: ../../library/string.templatelib.rst:330 +msgid "" +"An optional, arbitrary string used as the :ref:`format specification " +"` to present the value." +msgstr "一个可选的、任意字符串,用作呈现值的 :ref:`格式规范 `。" + +#: ../../library/string.templatelib.rst:335 +msgid "Helper functions" +msgstr "辅助函数" + +#: ../../library/string.templatelib.rst:339 +msgid "" +"Applies formatted string literal :ref:`conversion ` semantics to the given object *obj*. This is frequently useful " +"for custom template string processing logic." +msgstr "" +"对给定对象 *obj* 应用格式化字符串字面量 :ref:`转换 ` " +"语义。这对于自定义模板字符串处理逻辑通常很有用。" + +#: ../../library/string.templatelib.rst:343 +msgid "Three conversion flags are currently supported:" +msgstr "目前支持三种转换标志:" + +#: ../../library/string.templatelib.rst:345 +msgid "``'s'`` which calls :func:`str` on the value (like ``!s``)," +msgstr "``'s'`` 调用 :func:`str` 对值进行转换 (类似于 ``!s``)," + +#: ../../library/string.templatelib.rst:346 +msgid "``'r'`` which calls :func:`repr` (like ``!r``), and" +msgstr "``'r'`` 调用 :func:`repr` (类似于 ``!r``),以及" + +#: ../../library/string.templatelib.rst:347 +msgid "``'a'`` which calls :func:`ascii` (like ``!a``)." +msgstr "``'a'`` 调用 :func:`ascii` (就如 ``!a``)。" + +#: ../../library/string.templatelib.rst:349 +msgid "If the conversion flag is ``None``, *obj* is returned unchanged." +msgstr "如果转换标志为 ``None``,则 *obj* 不变返回。" diff --git a/library/stringprep.po b/library/stringprep.po new file mode 100644 index 0000000000..127a631b8a --- /dev/null +++ b/library/stringprep.po @@ -0,0 +1,175 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/stringprep.rst:2 +msgid ":mod:`!stringprep` --- Internet String Preparation" +msgstr ":mod:`!stringprep` --- 因特网字符串预处理" + +#: ../../library/stringprep.rst:10 +msgid "**Source code:** :source:`Lib/stringprep.py`" +msgstr "**源代码:** :source:`Lib/stringprep.py`" + +#: ../../library/stringprep.rst:14 +msgid "" +"When identifying things (such as host names) in the internet, it is often " +"necessary to compare such identifications for \"equality\". Exactly how this" +" comparison is executed may depend on the application domain, e.g. whether " +"it should be case-insensitive or not. It may be also necessary to restrict " +"the possible identifications, to allow only identifications consisting of " +"\"printable\" characters." +msgstr "。这种比较的具体执行可能会取决于应用域的不同,例如是否要区分大小写等等。 有时也可能需要限制允许的标识为仅由\"可打印\"字符组成。" + +#: ../../library/stringprep.rst:21 +msgid "" +":rfc:`3454` defines a procedure for \"preparing\" Unicode strings in " +"internet protocols. Before passing strings onto the wire, they are processed" +" with the preparation procedure, after which they have a certain normalized " +"form. The RFC defines a set of tables, which can be combined into profiles. " +"Each profile must define which tables it uses, and what other optional parts" +" of the ``stringprep`` procedure are part of the profile. One example of a " +"``stringprep`` profile is ``nameprep``, which is used for internationalized " +"domain names." +msgstr "" +":rfc:`3454` 定义了在因特网协议中 Unicode 字符串的“预备”过程。 " +"在将字符串连线传输之前,它们会先使用预备过程进行处理,之后它们将具有特定的标准形式。该 RFC 定义了一系列表格,它们可以被组合为选项配置。 " +"每个配置必须定义所使用的表格,``stringprep`` 过程的其他可选项也是配置的组成部分。``stringprep`` 配置的一个例子是 " +"``nameprep``,它被用于国际化域名。" + +#: ../../library/stringprep.rst:29 +msgid "" +"The module :mod:`!stringprep` only exposes the tables from :rfc:`3454`. As " +"these tables would be very large to represent as dictionaries or lists, the " +"module uses the Unicode character database internally. The module source " +"code itself was generated using the ``mkstringprep.py`` utility." +msgstr "" +":mod:`!stringprep` 模块只暴露了来自 :rfc:`3454` 的表格。由于这些表格如果表示为字典或列表将会非常庞大,该模块在内部使用 " +"Unicode 字符数据库。模块源代码本身是使用 ``mkstringprep.py`` 工具生成的。" + +#: ../../library/stringprep.rst:34 +msgid "" +"As a result, these tables are exposed as functions, not as data structures. " +"There are two kinds of tables in the RFC: sets and mappings. For a set, " +":mod:`!stringprep` provides the \"characteristic function\", i.e. a function" +" that returns ``True`` if the parameter is part of the set. For mappings, it" +" provides the mapping function: given the key, it returns the associated " +"value. Below is a list of all functions available in the module." +msgstr "" +"因此,这些表格是以函数而非数据结构的形式暴露的。RFC 中有两种类型的表格:集合与映射。对于集合,:mod:`!stringprep` " +",即当形参属于该集合时返回 ``True`` 的函数。对于映射,它提供了映射函数:给定键,返回对应的值。 以下是该模块中所有可用函数的列表。" + +#: ../../library/stringprep.rst:44 +msgid "" +"Determine whether *code* is in tableA.1 (Unassigned code points in Unicode " +"3.2)." +msgstr "确定 *code* 是否属于 tableA.1 (Unicode 3.2 中的未分配码位)。" + +#: ../../library/stringprep.rst:49 +msgid "Determine whether *code* is in tableB.1 (Commonly mapped to nothing)." +msgstr "确定 *code* 是否属于 tableB.1 (通常映射为空值)。" + +#: ../../library/stringprep.rst:54 +msgid "" +"Return the mapped value for *code* according to tableB.2 (Mapping for case-" +"folding used with NFKC)." +msgstr "返回 *code* 依据 tableB.2 (配合 NFKC 使用的大小写转换映射) 所映射的值。" + +#: ../../library/stringprep.rst:60 +msgid "" +"Return the mapped value for *code* according to tableB.3 (Mapping for case-" +"folding used with no normalization)." +msgstr "返回 *code* 依据 tableB.3 (不附带正规化的大小写折叠映射) 所映射的值。" + +#: ../../library/stringprep.rst:66 +msgid "Determine whether *code* is in tableC.1.1 (ASCII space characters)." +msgstr "确定 *code* 是否属于 tableC.1.1 (ASCII 空白字符)。" + +#: ../../library/stringprep.rst:71 +msgid "" +"Determine whether *code* is in tableC.1.2 (Non-ASCII space characters)." +msgstr "确定 *code* 是否属于 tableC.1.2 (非 ASCII 空白字符)。" + +#: ../../library/stringprep.rst:76 +msgid "" +"Determine whether *code* is in tableC.1 (Space characters, union of C.1.1 " +"and C.1.2)." +msgstr "确定 *code* 是否属于 tableC.1 (空白字符,C.1.1 和 C.1.2 的并集)。" + +#: ../../library/stringprep.rst:82 +msgid "Determine whether *code* is in tableC.2.1 (ASCII control characters)." +msgstr "确定 *code* 是否属于 tableC.2.1 (ASCII 控制字符)。" + +#: ../../library/stringprep.rst:87 +msgid "" +"Determine whether *code* is in tableC.2.2 (Non-ASCII control characters)." +msgstr "确定 *code* 是否属于 tableC.2.2 (非 ASCII 控制字符)。" + +#: ../../library/stringprep.rst:92 +msgid "" +"Determine whether *code* is in tableC.2 (Control characters, union of C.2.1" +" and C.2.2)." +msgstr "确定 *code* 是否属于 tableC.2 (控制字符,C.2.1 和 C.2.2 的并集)。" + +#: ../../library/stringprep.rst:98 +msgid "Determine whether *code* is in tableC.3 (Private use)." +msgstr "确定 *code* 是否属于 tableC.3 (私有使用)。" + +#: ../../library/stringprep.rst:103 +msgid "Determine whether *code* is in tableC.4 (Non-character code points)." +msgstr "确定 *code* 是否属于 tableC.4 (非字符码位)。" + +#: ../../library/stringprep.rst:108 +msgid "Determine whether *code* is in tableC.5 (Surrogate codes)." +msgstr "确定 *code* 是否属于 tableC.5 (替代码)。" + +#: ../../library/stringprep.rst:113 +msgid "" +"Determine whether *code* is in tableC.6 (Inappropriate for plain text)." +msgstr "确定 *code* 是否属于 tableC.6 (不适用于纯文本)。" + +#: ../../library/stringprep.rst:118 +msgid "" +"Determine whether *code* is in tableC.7 (Inappropriate for canonical " +"representation)." +msgstr "确定 *code* 是否属于 tableC.7 (不适用于规范表示)。" + +#: ../../library/stringprep.rst:124 +msgid "" +"Determine whether *code* is in tableC.8 (Change display properties or are " +"deprecated)." +msgstr "确定 *code* 是否属于 tableC.8 (改变显示属性或已弃用)。" + +#: ../../library/stringprep.rst:130 +msgid "Determine whether *code* is in tableC.9 (Tagging characters)." +msgstr "确定 *code* 是否属于 tableC.9 (标记字符)。" + +#: ../../library/stringprep.rst:135 +msgid "" +"Determine whether *code* is in tableD.1 (Characters with bidirectional " +"property \"R\" or \"AL\")." +msgstr "确定 *code* 是否属于 tableD.1 (带有双向属性 \"R\" 或 \"AL\" 的字符)。" + +#: ../../library/stringprep.rst:141 +msgid "" +"Determine whether *code* is in tableD.2 (Characters with bidirectional " +"property \"L\")." +msgstr "确定 *code* 是否属于 tableD.2 (带有双向属性 \"L\" 的字符)。" diff --git a/library/struct.po b/library/struct.po new file mode 100644 index 0000000000..81ef9e025a --- /dev/null +++ b/library/struct.po @@ -0,0 +1,1286 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-15 16:14+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/struct.rst:2 +msgid ":mod:`!struct` --- Interpret bytes as packed binary data" +msgstr ":mod:`!struct` --- 将字节串解读为打包的二进制数据" + +#: ../../library/struct.rst:11 +msgid "**Source code:** :source:`Lib/struct.py`" +msgstr "**源代码:** :source:`Lib/struct.py`" + +#: ../../library/struct.rst:19 +msgid "" +"This module converts between Python values and C structs represented as " +"Python :class:`bytes` objects. Compact :ref:`format strings ` describe the intended conversions to/from Python values. The " +"module's functions and objects can be used for two largely distinct " +"applications, data exchange with external sources (files or network " +"connections), or data transfer between the Python application and the C " +"layer." +msgstr "" +"此模块可在 Python 值和以 Python :class:`bytes` 对象表示的 C 结构体之间进行转换。通过紧凑 :ref:`格式字符串 " +"` 描述预期的 Python 值转换目标/来源。 " +"此模块的函数和对象可被用于两种相当不同的应用程序,与外部源(文件或网络连接)进行数据交换,或者在 Python 应用和 C 层级之间进行数据传输。" + +#: ../../library/struct.rst:29 +msgid "" +"When no prefix character is given, native mode is the default. It packs or " +"unpacks data based on the platform and compiler on which the Python " +"interpreter was built. The result of packing a given C struct includes pad " +"bytes which maintain proper alignment for the C types involved; similarly, " +"alignment is taken into account when unpacking. In contrast, when " +"communicating data between external sources, the programmer is responsible " +"for defining byte ordering and padding between elements. See :ref:`struct-" +"alignment` for details." +msgstr "" +"当未给出前缀字符时,将默认为原生模式。它会基于构建 Python 解释器的平台和编译器来打包和解包数据。打包一个给定 C 结构体的结果包括为所涉及的 C" +" 类型保持正确对齐的填充字节;类似地,当解包时也会将对齐纳入考虑。 " +"相反地,当在外部源之间进行数据通信时,将由程序员负责定义字节顺序和元素之间的填充。请参阅 :ref:`struct-alignment` 了解详情。" + +#: ../../library/struct.rst:39 +msgid "" +"Several :mod:`!struct` functions (and methods of :class:`Struct`) take a " +"*buffer* argument. This refers to objects that implement the " +":ref:`bufferobjects` and provide either a readable or read-writable buffer." +" The most common types used for that purpose are :class:`bytes` and " +":class:`bytearray`, but many other types that can be viewed as an array of " +"bytes implement the buffer protocol, so that they can be read/filled without" +" additional copying from a :class:`bytes` object." +msgstr "" +"某些 :mod:`!struct` 函数(和 :class:`Struct` 的方法)接受一个 *buffer* 参数。这是指实现了 " +":ref:`bufferobjects` 并提供可读或可读写缓冲区的对象。用于此目的的最常见类型是 :class:`bytes` 和 " +":class:`bytearray`,但许多其他可被视为字节数组的类型也实现了缓冲区协议,因此它们可以在无需从 :class:`bytes` " +"对象进行额外复制的情况下被读取/填充。" + +#: ../../library/struct.rst:48 +msgid "Functions and Exceptions" +msgstr "函数和异常" + +#: ../../library/struct.rst:50 +msgid "The module defines the following exception and functions:" +msgstr "此模块定义了下列异常和函数:" + +#: ../../library/struct.rst:55 +msgid "" +"Exception raised on various occasions; argument is a string describing what " +"is wrong." +msgstr "会在多种场合下被引发的异常;其参数为一个描述错误信息的字符串。" + +#: ../../library/struct.rst:61 +msgid "" +"Return a bytes object containing the values *v1*, *v2*, ... packed according" +" to the format string *format*. The arguments must match the values " +"required by the format exactly." +msgstr "" +"返回一个 bytes 对象,其中包含根据格式字符串 *format* 打包的值 *v1*, *v2*, ... " +"参数个数必须与格式字符串所要求的值完全匹配。" + +#: ../../library/struct.rst:68 +msgid "" +"Pack the values *v1*, *v2*, ... according to the format string *format* and " +"write the packed bytes into the writable buffer *buffer* starting at " +"position *offset*. Note that *offset* is a required argument. A negative " +"*offset* counts from the end of *buffer*." +msgstr "" + +#: ../../library/struct.rst:76 +msgid "" +"Unpack from the buffer *buffer* (presumably packed by ``pack(format, ...)``)" +" according to the format string *format*. The result is a tuple even if it " +"contains exactly one item. The buffer's size in bytes must match the size " +"required by the format, as reflected by :func:`calcsize`." +msgstr "" +"根据格式字符串 *format* 从缓冲区 *buffer* 解包(假定是由 ``pack(format, ...)`` 打包)。 " +"结果为一个元组,即使其只包含一个条目。缓冲区的字节大小必须匹配格式所要求的大小,如 :func:`calcsize` 所示。" + +#: ../../library/struct.rst:84 +msgid "" +"Unpack from *buffer* starting at position *offset*, according to the format " +"string *format*. The result is a tuple even if it contains exactly one " +"item. The buffer's size in bytes, starting at position *offset*, must be at" +" least the size required by the format, as reflected by :func:`calcsize`. A " +"negative *offset* counts from the end of *buffer*." +msgstr "" + +#: ../../library/struct.rst:93 +msgid "" +"Iteratively unpack from the buffer *buffer* according to the format string " +"*format*. This function returns an iterator which will read equally sized " +"chunks from the buffer until all its contents have been consumed. The " +"buffer's size in bytes must be a multiple of the size required by the " +"format, as reflected by :func:`calcsize`." +msgstr "" +"根据格式字符串 *format* 以迭代方式从缓冲区 *buffer* 中解包。 " +"此函数返回一个迭代器,它将从缓冲区读取大小相等的块直到其所有内容耗尽为止。缓冲区的字节大小必须是格式所要求的大小的整数倍,如 " +":func:`calcsize` 所显示的。" + +#: ../../library/struct.rst:99 +msgid "Each iteration yields a tuple as specified by the format string." +msgstr "每次迭代将产生一个如格式字符串所指定的元组。" + +#: ../../library/struct.rst:106 +msgid "" +"Return the size of the struct (and hence of the bytes object produced by " +"``pack(format, ...)``) corresponding to the format string *format*." +msgstr "返回与格式字符串 *format* 相对应的结构的大小(亦即 ``pack(format, ...)`` 所产生的字节串对象的大小)。" + +#: ../../library/struct.rst:113 +msgid "Format Strings" +msgstr "格式字符串" + +#: ../../library/struct.rst:115 +msgid "" +"Format strings describe the data layout when packing and unpacking data. " +"They are built up from :ref:`format characters`, which " +"specify the type of data being packed/unpacked. In addition, special " +"characters control the :ref:`byte order, size and alignment`. Each format string consists of an optional prefix character " +"which describes the overall properties of the data and one or more format " +"characters which describe the actual data values and padding." +msgstr "" +"格式字符串描述了打包和解包数据时的数据布局。它们是使用 :ref:`格式字符 ` " +"来构建的,格式字符指明被打包/解包的数据的类型。此外,还有用来控制 :ref:`字节顺序、大小和对齐 ` " +"的特殊字符。每个格式字符串都是由一个可选的描述数据总体属性的前缀字符和一个或多个描述实际数据值和填充的格式字符组成的。" + +#: ../../library/struct.rst:127 +msgid "Byte Order, Size, and Alignment" +msgstr "字节顺序,大小和对齐方式" + +#: ../../library/struct.rst:129 +msgid "" +"By default, C types are represented in the machine's native format and byte " +"order, and properly aligned by skipping pad bytes if necessary (according to" +" the rules used by the C compiler). This behavior is chosen so that the " +"bytes of a packed struct correspond exactly to the memory layout of the " +"corresponding C struct. Whether to use native byte ordering and padding or " +"standard formats depends on the application." +msgstr "" +"在默认情况下,C 类型将以所在机器的原生格式和字节顺序来表示,并在必要时通过跳过填充字节来正确地对齐(根据 C 编译器所使用的规则)。 " +"选择此行为是为了使已打包结构体的字节与对应的 C 结构体的内存布局完全对应。使用原生字节顺序和填充还是标准格式取决于应用程序本身。" + +#: ../../library/struct.rst:145 +msgid "" +"Alternatively, the first character of the format string can be used to " +"indicate the byte order, size and alignment of the packed data, according to" +" the following table:" +msgstr "或者,根据下表,格式字符串的第一个字符可用于指示打包数据的字节顺序,大小和对齐方式:" + +#: ../../library/struct.rst:150 +msgid "Character" +msgstr "字符" + +#: ../../library/struct.rst:150 +msgid "Byte order" +msgstr "字节顺序" + +#: ../../library/struct.rst:150 +msgid "Size" +msgstr "大小" + +#: ../../library/struct.rst:150 +msgid "Alignment" +msgstr "对齐方式" + +#: ../../library/struct.rst:152 +msgid "``@``" +msgstr "``@``" + +#: ../../library/struct.rst:152 ../../library/struct.rst:154 +msgid "native" +msgstr "原生" + +#: ../../library/struct.rst:154 +msgid "``=``" +msgstr "``=``" + +#: ../../library/struct.rst:154 ../../library/struct.rst:156 +#: ../../library/struct.rst:158 ../../library/struct.rst:160 +msgid "standard" +msgstr "标准" + +#: ../../library/struct.rst:154 ../../library/struct.rst:156 +#: ../../library/struct.rst:158 ../../library/struct.rst:160 +msgid "none" +msgstr "无" + +#: ../../library/struct.rst:156 +msgid "``<``" +msgstr "``<``" + +#: ../../library/struct.rst:156 +msgid "little-endian" +msgstr "小端" + +#: ../../library/struct.rst:158 +msgid "``>``" +msgstr "``>``" + +#: ../../library/struct.rst:158 +msgid "big-endian" +msgstr "大端" + +#: ../../library/struct.rst:160 +msgid "``!``" +msgstr "``!``" + +#: ../../library/struct.rst:160 +msgid "network (= big-endian)" +msgstr "网络(=大端)" + +#: ../../library/struct.rst:163 +msgid "If the first character is not one of these, ``'@'`` is assumed." +msgstr "如果第一个字符不是其中之一,则假定为 ``'@'``。" + +#: ../../library/struct.rst:167 +msgid "" +"The number 1023 (``0x3ff`` in hexadecimal) has the following byte " +"representations:" +msgstr "数字 1023 (十六进制的 ``0x3ff``) 具有以下字节表示形式:" + +#: ../../library/struct.rst:169 +msgid "``03 ff`` in big-endian (``>``)" +msgstr "大端序 (``>``) 的 ``03 ff``" + +#: ../../library/struct.rst:170 +msgid "``ff 03`` in little-endian (``<``)" +msgstr "小端序 (``<``) 的 ``ff 03``" + +#: ../../library/struct.rst:172 +msgid "Python example:" +msgstr "Python 示例:" + +#: ../../library/struct.rst:180 +msgid "" +"Native byte order is big-endian or little-endian, depending on the host " +"system. For example, Intel x86, AMD64 (x86-64), and Apple M1 are little-" +"endian; IBM z and many legacy architectures are big-endian. Use " +":data:`sys.byteorder` to check the endianness of your system." +msgstr "" +"原生字节顺序可能为大端序或小端序,具体取决于主机系统。例如,Intel x86, AMD64 (x86-64) 和 Apple M1 是小端序的;IBM" +" z 和许多旧式架构则是大端序的。请使用 :data:`sys.byteorder` 来检查你的系统字节顺序。" + +#: ../../library/struct.rst:185 +msgid "" +"Native size and alignment are determined using the C compiler's ``sizeof`` " +"expression. This is always combined with native byte order." +msgstr "本机大小和对齐方式是使用 C 编译器的 ``sizeof`` 表达式来确定的。这总是会与本机字节顺序相绑定。" + +#: ../../library/struct.rst:188 +msgid "" +"Standard size depends only on the format character; see the table in the " +":ref:`format-characters` section." +msgstr "标准大小仅取决于格式字符;请参阅 :ref:`format-characters` 部分中的表格。" + +#: ../../library/struct.rst:191 +msgid "" +"Note the difference between ``'@'`` and ``'='``: both use native byte order," +" but the size and alignment of the latter is standardized." +msgstr "请注意 ``'@'`` 和 ``'='`` 之间的区别:两个都使用本机字节顺序,但后者的大小和对齐方式是标准化的。" + +#: ../../library/struct.rst:194 +msgid "" +"The form ``'!'`` represents the network byte order which is always big-" +"endian as defined in `IETF RFC 1700 `_." +msgstr "形式 ``'!'`` 代表网络字节顺序总是使用在 `IETF RFC 1700 `_ 中所定义的大端序。" + +#: ../../library/struct.rst:197 +msgid "" +"There is no way to indicate non-native byte order (force byte-swapping); use" +" the appropriate choice of ``'<'`` or ``'>'``." +msgstr "没有什么方式能指定非本机字节顺序(强制字节对调);请正确选择使用 ``'<'`` 或 ``'>'``。" + +#: ../../library/struct.rst:200 ../../library/struct.rst:292 +msgid "Notes:" +msgstr "注意:" + +#: ../../library/struct.rst:202 +msgid "" +"Padding is only automatically added between successive structure members. No" +" padding is added at the beginning or the end of the encoded struct." +msgstr "填充只会在连续结构成员之间自动添加。填充不会添加到已编码结构的开头和末尾。" + +#: ../../library/struct.rst:205 +msgid "" +"No padding is added when using non-native size and alignment, e.g. with '<'," +" '>', '=', and '!'." +msgstr "当使用非本机大小和对齐方式即 '<', '>', '=', and '!' 时不会添加任何填充。" + +#: ../../library/struct.rst:208 +msgid "" +"To align the end of a structure to the alignment requirement of a particular" +" type, end the format with the code for that type with a repeat count of " +"zero. See :ref:`struct-examples`." +msgstr "要将结构的末尾对齐到符合特定类型的对齐要求,请以该类型代码加重复计数的零作为格式结束。参见 :ref:`struct-examples`。" + +#: ../../library/struct.rst:216 +msgid "Format Characters" +msgstr "格式字符" + +#: ../../library/struct.rst:218 +msgid "" +"Format characters have the following meaning; the conversion between C and " +"Python values should be obvious given their types. The 'Standard size' " +"column refers to the size of the packed value in bytes when using standard " +"size; that is, when the format string starts with one of ``'<'``, ``'>'``, " +"``'!'`` or ``'='``. When using native size, the size of the packed value is" +" platform-dependent." +msgstr "" +"格式字符具有以下含义;C 和 Python 值之间的按其指定类型的转换应当是相当明显的。 " +"‘标准大小’列是指当使用标准大小时以字节表示的已打包值大小;也就是当格式字符串以 ``'<'``, ``'>'``, ``'!'`` 或 ``'='``" +" 之一开头的情况。当使用本机大小时,已打包值的大小取决于具体的平台。" + +#: ../../library/struct.rst:226 +msgid "Format" +msgstr "格式" + +#: ../../library/struct.rst:226 +msgid "C Type" +msgstr "C 类型" + +#: ../../library/struct.rst:226 +msgid "Python type" +msgstr "Python 类型" + +#: ../../library/struct.rst:226 +msgid "Standard size" +msgstr "标准大小" + +#: ../../library/struct.rst:226 +msgid "Notes" +msgstr "备注" + +#: ../../library/struct.rst:228 +msgid "``x``" +msgstr "``x``" + +#: ../../library/struct.rst:228 +msgid "pad byte" +msgstr "填充字节" + +#: ../../library/struct.rst:228 +msgid "no value" +msgstr "无" + +#: ../../library/struct.rst:228 +msgid "\\(7)" +msgstr "\\(7)" + +#: ../../library/struct.rst:230 +msgid "``c``" +msgstr "``c``" + +#: ../../library/struct.rst:230 +msgid ":c:expr:`char`" +msgstr ":c:expr:`char`" + +#: ../../library/struct.rst:230 +msgid "bytes of length 1" +msgstr "长度为 1 的字节串" + +#: ../../library/struct.rst:230 ../../library/struct.rst:232 +#: ../../library/struct.rst:234 ../../library/struct.rst:236 +msgid "1" +msgstr "1" + +#: ../../library/struct.rst:232 +msgid "``b``" +msgstr "``b``" + +#: ../../library/struct.rst:232 +msgid ":c:expr:`signed char`" +msgstr ":c:expr:`signed char`" + +#: ../../library/struct.rst:232 ../../library/struct.rst:234 +#: ../../library/struct.rst:238 ../../library/struct.rst:240 +#: ../../library/struct.rst:242 ../../library/struct.rst:244 +#: ../../library/struct.rst:246 ../../library/struct.rst:248 +#: ../../library/struct.rst:250 ../../library/struct.rst:252 +#: ../../library/struct.rst:255 ../../library/struct.rst:257 +#: ../../library/struct.rst:273 +msgid "int" +msgstr "int" + +#: ../../library/struct.rst:232 ../../library/struct.rst:234 +#: ../../library/struct.rst:238 ../../library/struct.rst:240 +#: ../../library/struct.rst:242 ../../library/struct.rst:244 +#: ../../library/struct.rst:246 ../../library/struct.rst:248 +#: ../../library/struct.rst:250 ../../library/struct.rst:252 +msgid "\\(2)" +msgstr "\\(2)" + +#: ../../library/struct.rst:234 +msgid "``B``" +msgstr "``B``" + +#: ../../library/struct.rst:234 +msgid ":c:expr:`unsigned char`" +msgstr ":c:expr:`unsigned char`" + +#: ../../library/struct.rst:236 +msgid "``?``" +msgstr "``?``" + +#: ../../library/struct.rst:236 +msgid ":c:expr:`_Bool`" +msgstr ":c:expr:`_Bool`" + +#: ../../library/struct.rst:236 +msgid "bool" +msgstr "bool" + +#: ../../library/struct.rst:236 +msgid "\\(1)" +msgstr "\\(1)" + +#: ../../library/struct.rst:238 +msgid "``h``" +msgstr "``h``" + +#: ../../library/struct.rst:238 +msgid ":c:expr:`short`" +msgstr ":c:expr:`short`" + +#: ../../library/struct.rst:238 ../../library/struct.rst:240 +#: ../../library/struct.rst:259 +msgid "2" +msgstr "2" + +#: ../../library/struct.rst:240 +msgid "``H``" +msgstr "``H``" + +#: ../../library/struct.rst:240 +msgid ":c:expr:`unsigned short`" +msgstr ":c:expr:`unsigned short`" + +#: ../../library/struct.rst:242 +msgid "``i``" +msgstr "``i``" + +#: ../../library/struct.rst:242 +msgid ":c:expr:`int`" +msgstr ":c:expr:`int`" + +#: ../../library/struct.rst:242 ../../library/struct.rst:244 +#: ../../library/struct.rst:246 ../../library/struct.rst:248 +#: ../../library/struct.rst:261 +msgid "4" +msgstr "4" + +#: ../../library/struct.rst:244 +msgid "``I``" +msgstr "``I``" + +#: ../../library/struct.rst:244 +msgid ":c:expr:`unsigned int`" +msgstr ":c:expr:`unsigned int`" + +#: ../../library/struct.rst:246 +msgid "``l``" +msgstr "``l``" + +#: ../../library/struct.rst:246 +msgid ":c:expr:`long`" +msgstr ":c:expr:`long`" + +#: ../../library/struct.rst:248 +msgid "``L``" +msgstr "``L``" + +#: ../../library/struct.rst:248 +msgid ":c:expr:`unsigned long`" +msgstr ":c:expr:`unsigned long`" + +#: ../../library/struct.rst:250 +msgid "``q``" +msgstr "``q``" + +#: ../../library/struct.rst:250 +msgid ":c:expr:`long long`" +msgstr ":c:expr:`long long`" + +#: ../../library/struct.rst:250 ../../library/struct.rst:252 +#: ../../library/struct.rst:263 ../../library/struct.rst:265 +msgid "8" +msgstr "8" + +#: ../../library/struct.rst:252 +msgid "``Q``" +msgstr "``Q``" + +#: ../../library/struct.rst:252 +msgid ":c:expr:`unsigned long long`" +msgstr ":c:expr:`unsigned long long`" + +#: ../../library/struct.rst:255 +msgid "``n``" +msgstr "``n``" + +#: ../../library/struct.rst:255 +msgid ":c:type:`ssize_t`" +msgstr ":c:type:`ssize_t`" + +#: ../../library/struct.rst:255 ../../library/struct.rst:257 +msgid "\\(2), \\(3)" +msgstr "" + +#: ../../library/struct.rst:257 +msgid "``N``" +msgstr "``N``" + +#: ../../library/struct.rst:257 +msgid ":c:type:`size_t`" +msgstr ":c:type:`size_t`" + +#: ../../library/struct.rst:259 +msgid "``e``" +msgstr "``e``" + +#: ../../library/struct.rst:259 +msgid ":c:expr:`_Float16`" +msgstr ":c:expr:`_Float16`" + +#: ../../library/struct.rst:259 ../../library/struct.rst:261 +#: ../../library/struct.rst:263 +msgid "float" +msgstr "float" + +#: ../../library/struct.rst:259 +msgid "\\(4), \\(6)" +msgstr "\\(4), \\(6)" + +#: ../../library/struct.rst:261 +msgid "``f``" +msgstr "``f``" + +#: ../../library/struct.rst:261 +msgid ":c:expr:`float`" +msgstr ":c:expr:`float`" + +#: ../../library/struct.rst:261 ../../library/struct.rst:263 +msgid "\\(4)" +msgstr "\\(4)" + +#: ../../library/struct.rst:263 +msgid "``d``" +msgstr "``d``" + +#: ../../library/struct.rst:263 +msgid ":c:expr:`double`" +msgstr ":c:expr:`double`" + +#: ../../library/struct.rst:265 +msgid "``F``" +msgstr "``F``" + +#: ../../library/struct.rst:265 +msgid ":c:expr:`float complex`" +msgstr ":c:expr:`float complex`" + +#: ../../library/struct.rst:265 ../../library/struct.rst:267 +msgid "complex" +msgstr "复数" + +#: ../../library/struct.rst:265 ../../library/struct.rst:267 +msgid "\\(10)" +msgstr "\\(10)" + +#: ../../library/struct.rst:267 +msgid "``D``" +msgstr "``D``" + +#: ../../library/struct.rst:267 +msgid ":c:expr:`double complex`" +msgstr ":c:expr:`double complex`" + +#: ../../library/struct.rst:267 +msgid "16" +msgstr "16" + +#: ../../library/struct.rst:269 +msgid "``s``" +msgstr "``s``" + +#: ../../library/struct.rst:269 ../../library/struct.rst:271 +msgid ":c:expr:`char[]`" +msgstr ":c:expr:`char[]`" + +#: ../../library/struct.rst:269 ../../library/struct.rst:271 +msgid "bytes" +msgstr "字节串" + +#: ../../library/struct.rst:269 +msgid "\\(9)" +msgstr "\\(9)" + +#: ../../library/struct.rst:271 +msgid "``p``" +msgstr "``p``" + +#: ../../library/struct.rst:271 +msgid "\\(8)" +msgstr "\\(8)" + +#: ../../library/struct.rst:273 +msgid "``P``" +msgstr "``P``" + +#: ../../library/struct.rst:273 +msgid ":c:expr:`void \\*`" +msgstr ":c:expr:`void \\*`" + +#: ../../library/struct.rst:273 +msgid "\\(2), \\(5)" +msgstr "" + +#: ../../library/struct.rst:276 +msgid "Added support for the ``'n'`` and ``'N'`` formats." +msgstr "增加了对 ``'n'`` 和 ``'N'`` 格式的支持" + +#: ../../library/struct.rst:279 +msgid "Added support for the ``'e'`` format." +msgstr "添加了对 ``'e'`` 格式的支持。" + +#: ../../library/struct.rst:282 +msgid "Added support for the ``'F'`` and ``'D'`` formats." +msgstr "增加了对 ``'F'`` 和 ``'D'`` 格式的支持。" + +#: ../../library/struct.rst:287 +msgid "" +"The :mod:`array` and :ref:`ctypes ` modules, " +"as well as third-party modules like `numpy " +"`__," +" use similar -- but slightly different -- type codes." +msgstr "" +":mod:`array` 和 :ref:`ctypes ` 模块,以及某些第三方模块如 " +"`numpy " +"`__" +" 均使用类似 -- 但略有差异的 -- 类型代码。" + +#: ../../library/struct.rst:297 +msgid "" +"The ``'?'`` conversion code corresponds to the :c:expr:`_Bool` type defined " +"by C standards since C99. In standard mode, it is represented by one byte." +msgstr "" +"``'?'`` 转换码对应于自 C99 开始由 C 标准所定义的 :c:expr:`_Bool` 类型。在标准模式下,它总是以一个字节来表示。" + +#: ../../library/struct.rst:302 +msgid "" +"When attempting to pack a non-integer using any of the integer conversion " +"codes, if the non-integer has a :meth:`~object.__index__` method then that " +"method is called to convert the argument to an integer before packing." +msgstr "" +"当尝试使用任何整数转换码打包一个非整数时,如果该非整数具有 :meth:`~object.__index__` " +"方法,则会在打包之前将参数转换为一个整数。" + +#: ../../library/struct.rst:306 +msgid "Added use of the :meth:`~object.__index__` method for non-integers." +msgstr "增加了用于非整数的 :meth:`~object.__index__` 方法。" + +#: ../../library/struct.rst:310 +msgid "" +"The ``'n'`` and ``'N'`` conversion codes are only available for the native " +"size (selected as the default or with the ``'@'`` byte order character). For" +" the standard size, you can use whichever of the other integer formats fits " +"your application." +msgstr "" +"``'n'`` 和 ``'N'`` 转换码仅对本机大小可用(选择为默认或使用 ``'@'`` 字节顺序字符)。 " +"对于标准大小,你可以使用适合你的应用的任何其他整数格式。" + +#: ../../library/struct.rst:316 +msgid "" +"For the ``'f'``, ``'d'`` and ``'e'`` conversion codes, the packed " +"representation uses the IEEE 754 binary32, binary64 or binary16 format (for " +"``'f'``, ``'d'`` or ``'e'`` respectively), regardless of the floating-point " +"format used by the platform." +msgstr "" +"对于 ``'f'``, ``'d'`` 和 ``'e'`` 转换码,打包表示形式将使用 IEEE 754 binary32, binary64 或 " +"binary16 格式 (分别对应于 ``'f'``, ``'d'`` 或 ``'e'``),无论平台使用何种浮点格式。" + +#: ../../library/struct.rst:322 +msgid "" +"The ``'P'`` format character is only available for the native byte ordering " +"(selected as the default or with the ``'@'`` byte order character). The byte" +" order character ``'='`` chooses to use little- or big-endian ordering based" +" on the host system. The struct module does not interpret this as native " +"ordering, so the ``'P'`` format is not available." +msgstr "" +"``'P'`` 格式字符仅对本机字节顺序可用(选择为默认或使用 ``'@'`` 字节顺序字符)。字节顺序字符 ``'='`` " +"选择使用基于主机系统的小端或大端排序。struct 模块不会将其解读为本机排序,因此 ``'P'`` 格式将不可用。" + +#: ../../library/struct.rst:329 +msgid "" +"The IEEE 754 binary16 \"half precision\" type was introduced in the 2008 " +"revision of the `IEEE 754 standard `_. It has a sign " +"bit, a 5-bit exponent and 11-bit precision (with 10 bits explicitly stored)," +" and can represent numbers between approximately ``6.1e-05`` and ``6.5e+04``" +" at full precision. This type is not widely supported by C compilers: it's " +"available as :c:expr:`_Float16` type, if the compiler supports the Annex H " +"of the C23 standard. On a typical machine, an unsigned short can be used " +"for storage, but not for math operations. See the Wikipedia page on the " +"`half-precision floating-point format `_ for more " +"information." +msgstr "" +"IEEE 754 binary16 \"半精度\" 类型是在 `IEEE 754 标准 `_ 的 2008 " +"修订版中引入的。 它包含一个符号位,5 个指数位和 11 个精度位(明确存储 10 位),可用完全精度表示大致范围在 ``6.1e-05`` 和 " +"``6.5e+04`` 之间的数字。 此类型并不被 C 编译器广泛支持:它可以作为 :c:expr:`_Float16` 类型,如果编译器支持 C23 " +"标准附件 H 的话。 在一台典型的机器上,可以使用 unsigned short 来存储,但不会被用于数学运算。 请参阅 Wikipedia 页面 " +"`half-precision floating-point format `_ 了解详情。" + +#: ../../library/struct.rst:341 +msgid "When packing, ``'x'`` inserts one NUL byte." +msgstr "在打包时,``'x'`` 会插入一个 NUL 字节。" + +#: ../../library/struct.rst:344 +msgid "" +"The ``'p'`` format character encodes a \"Pascal string\", meaning a short " +"variable-length string stored in a *fixed number of bytes*, given by the " +"count. The first byte stored is the length of the string, or 255, whichever " +"is smaller. The bytes of the string follow. If the byte string passed in " +"to :func:`pack` is too long (longer than the count minus 1), only the " +"leading ``count-1`` bytes of the string are stored. If the byte string is " +"shorter than ``count-1``, it is padded with null bytes so that exactly count" +" bytes in all are used. Note that for :func:`unpack`, the ``'p'`` format " +"character consumes ``count`` bytes, but that the :class:`!bytes` object " +"returned can never contain more than 255 bytes. When packing, arguments of " +"types :class:`bytes` and :class:`bytearray` are accepted." +msgstr "" + +#: ../../library/struct.rst:358 +msgid "" +"For the ``'s'`` format character, the count is interpreted as the length of " +"the byte string, not a repeat count like for the other format characters; " +"for example, ``'10s'`` means a single 10-byte string mapping to or from a " +"single Python byte string, while ``'10c'`` means 10 separate one byte " +"character elements (e.g., ``cccccccccc``) mapping to or from ten different " +"Python byte objects. (See :ref:`struct-examples` for a concrete " +"demonstration of the difference.) If a count is not given, it defaults to 1." +" For packing, the byte string is truncated or padded with null bytes as " +"appropriate to make it fit. For unpacking, the resulting :class:`!bytes` " +"object always has exactly the specified number of bytes. As a special case," +" ``'0s'`` means a single, empty byte string (while ``'0c'`` means 0 " +"characters). When packing, arguments of types :class:`bytes` and " +":class:`bytearray` are accepted." +msgstr "" + +#: ../../library/struct.rst:374 +msgid "" +"For the ``'F'`` and ``'D'`` format characters, the packed representation " +"uses the IEEE 754 binary32 and binary64 format for components of the complex" +" number, regardless of the floating-point format used by the platform. Note " +"that complex types (``F`` and ``D``) are available unconditionally, despite " +"complex types being an optional feature in C. As specified in the C11 " +"standard, each complex type is represented by a two-element C array " +"containing, respectively, the real and imaginary parts." +msgstr "" +"对于 ``'F'`` 和 ``'D'`` 格式字符,打包的表示形式使用 IEEE 754 binary32 和 binary64 " +"格式来表示复数的各部分,不管平台是使用哪种浮点格式。请注意复数类型 (``F`` 和 ``D``) 是无条件可用的,尽管复数类型在 C " +"中属于可选特性。正如 C11 标准所指明的,每个复数类型都是由两个元素组成的 C 数组来表示的,其两个元素分别包含实部和虚部。" + +#: ../../library/struct.rst:383 +msgid "" +"A format character may be preceded by an integral repeat count. For " +"example, the format string ``'4h'`` means exactly the same as ``'hhhh'``." +msgstr "格式字符之前可以带有整数重复计数。例如,格式字符串 ``'4h'`` 的含义与 ``'hhhh'`` 完全相同。" + +#: ../../library/struct.rst:386 +msgid "" +"Whitespace characters between formats are ignored; a count and its format " +"must not contain whitespace though." +msgstr "格式之间的空白字符会被忽略;但是计数及其格式字符中不可有空白字符。" + +#: ../../library/struct.rst:389 +msgid "" +"When packing a value ``x`` using one of the integer formats (``'b'``, " +"``'B'``, ``'h'``, ``'H'``, ``'i'``, ``'I'``, ``'l'``, ``'L'``, ``'q'``, " +"``'Q'``), if ``x`` is outside the valid range for that format then " +":exc:`struct.error` is raised." +msgstr "" +"当使用某一种整数格式 (``'b'``, ``'B'``, ``'h'``, ``'H'``, ``'i'``, ``'I'``, ``'l'``, " +"``'L'``, ``'q'``, ``'Q'``) 打包值 ``x`` 时,如果 ``x`` 在该格式的有效范围之外则将引发 " +":exc:`struct.error`." + +#: ../../library/struct.rst:394 +msgid "" +"Previously, some of the integer formats wrapped out-of-range values and " +"raised :exc:`DeprecationWarning` instead of :exc:`struct.error`." +msgstr "" +"在之前版本中,某些整数格式包装了超范围的值并会引发 :exc:`DeprecationWarning` 而不是 :exc:`struct.error`。" + +#: ../../library/struct.rst:400 +msgid "" +"For the ``'?'`` format character, the return value is either :const:`True` " +"or :const:`False`. When packing, the truth value of the argument object is " +"used. Either 0 or 1 in the native or standard bool representation will be " +"packed, and any non-zero value will be ``True`` when unpacking." +msgstr "" +"对于 ``'?'`` 格式字符,返回值为 :const:`True` 或 :const:`False`。在打包时将会使用参数对象的逻辑值。 以本机或标准" +" bool 类型表示的 0 或 1 将被打包,任何非零值在解包时将为 ``True``。" + +#: ../../library/struct.rst:410 +msgid "Examples" +msgstr "例子" + +#: ../../library/struct.rst:413 +msgid "" +"Native byte order examples (designated by the ``'@'`` format prefix or lack " +"of any prefix character) may not match what the reader's machine produces as" +" that depends on the platform and compiler." +msgstr "" +"原生字节顺序的示例 (由 ``'@'`` 格式前缀或不带任何前缀字符的形式指定) 可能与读者机器所产生的内容不匹配,因为这取决于具体的平台和编译器。" + +#: ../../library/struct.rst:418 +msgid "" +"Pack and unpack integers of three different sizes, using big endian " +"ordering::" +msgstr "打包和解包三种不同大小的整数,使用大端序::" + +#: ../../library/struct.rst:421 +msgid "" +">>> from struct import *\n" +">>> pack(\">bhl\", 1, 2, 3)\n" +"b'\\x01\\x00\\x02\\x00\\x00\\x00\\x03'\n" +">>> unpack('>bhl', b'\\x01\\x00\\x02\\x00\\x00\\x00\\x03')\n" +"(1, 2, 3)\n" +">>> calcsize('>bhl')\n" +"7" +msgstr "" +">>> from struct import *\n" +">>> pack(\">bhl\", 1, 2, 3)\n" +"b'\\x01\\x00\\x02\\x00\\x00\\x00\\x03'\n" +">>> unpack('>bhl', b'\\x01\\x00\\x02\\x00\\x00\\x00\\x03')\n" +"(1, 2, 3)\n" +">>> calcsize('>bhl')\n" +"7" + +#: ../../library/struct.rst:429 +msgid "Attempt to pack an integer which is too large for the defined field::" +msgstr "尝试打包一个对于所定义字段来说过大的整数::" + +#: ../../library/struct.rst:431 +msgid "" +">>> pack(\">h\", 99999)\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"struct.error: 'h' format requires -32768 <= number <= 32767" +msgstr "" +">>> pack(\">h\", 99999)\n" +"Traceback (most recent call last):\n" +" File \"\", line 1, in \n" +"struct.error: 'h' format requires -32768 <= number <= 32767" + +#: ../../library/struct.rst:436 +msgid "" +"Demonstrate the difference between ``'s'`` and ``'c'`` format characters::" +msgstr "显示 ``'s'`` 和 ``'c'`` 格式字符之间的差异::" + +#: ../../library/struct.rst:439 +msgid "" +">>> pack(\"@ccc\", b'1', b'2', b'3')\n" +"b'123'\n" +">>> pack(\"@3s\", b'123')\n" +"b'123'" +msgstr "" +">>> pack(\"@ccc\", b'1', b'2', b'3')\n" +"b'123'\n" +">>> pack(\"@3s\", b'123')\n" +"b'123'" + +#: ../../library/struct.rst:444 +msgid "" +"Unpacked fields can be named by assigning them to variables or by wrapping " +"the result in a named tuple::" +msgstr "解包的字段可通过将它们赋值给变量或将结果包装为一个具名元组来命名::" + +#: ../../library/struct.rst:447 +msgid "" +">>> record = b'raymond \\x32\\x12\\x08\\x01\\x08'\n" +">>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)\n" +"\n" +">>> from collections import namedtuple\n" +">>> Student = namedtuple('Student', 'name serialnum school gradelevel')\n" +">>> Student._make(unpack('<10sHHb', record))\n" +"Student(name=b'raymond ', serialnum=4658, school=264, gradelevel=8)" +msgstr "" +">>> record = b'raymond \\x32\\x12\\x08\\x01\\x08'\n" +">>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)\n" +"\n" +">>> from collections import namedtuple\n" +">>> Student = namedtuple('Student', 'name serialnum school gradelevel')\n" +">>> Student._make(unpack('<10sHHb', record))\n" +"Student(name=b'raymond ', serialnum=4658, school=264, gradelevel=8)" + +#: ../../library/struct.rst:455 +msgid "" +"The ordering of format characters may have an impact on size in native mode " +"since padding is implicit. In standard mode, the user is responsible for " +"inserting any desired padding. Note in the first ``pack`` call below that " +"three NUL bytes were added after the packed ``'#'`` to align the following " +"integer on a four-byte boundary. In this example, the output was produced on" +" a little endian machine::" +msgstr "" +"格式字符的顺序可能会因为填充是隐式的而对在原生模式中的大小产生影响。在标准模式下,用户要负责插入任何必要的填充。请注意下面的第一个 ``pack`` " +"调用中在已打包的 ``'#'`` 之后添加了三个 NUL 字节以便在四字节边界上对齐到下面的整数。在这个例子中,输出是在一台小端序的机器上产生的::" + +#: ../../library/struct.rst:463 +msgid "" +">>> pack('@ci', b'#', 0x12131415)\n" +"b'#\\x00\\x00\\x00\\x15\\x14\\x13\\x12'\n" +">>> pack('@ic', 0x12131415, b'#')\n" +"b'\\x15\\x14\\x13\\x12#'\n" +">>> calcsize('@ci')\n" +"8\n" +">>> calcsize('@ic')\n" +"5" +msgstr "" +">>> pack('@ci', b'#', 0x12131415)\n" +"b'#\\x00\\x00\\x00\\x15\\x14\\x13\\x12'\n" +">>> pack('@ic', 0x12131415, b'#')\n" +"b'\\x15\\x14\\x13\\x12#'\n" +">>> calcsize('@ci')\n" +"8\n" +">>> calcsize('@ic')\n" +"5" + +#: ../../library/struct.rst:472 +msgid "" +"The following format ``'llh0l'`` results in two pad bytes being added at the" +" end, assuming the platform's longs are aligned on 4-byte boundaries::" +msgstr "以下格式 ``'llh0l'`` 将会在末尾添加两个填充字节,假定平台的 long 类型按 4 个字节的边界对齐的话::" + +#: ../../library/struct.rst:475 +msgid "" +">>> pack('@llh0l', 1, 2, 3)\n" +"b'\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x02\\x00\\x03\\x00\\x00'" +msgstr "" +">>> pack('@llh0l', 1, 2, 3)\n" +"b'\\x00\\x00\\x00\\x01\\x00\\x00\\x00\\x02\\x00\\x03\\x00\\x00'" + +#: ../../library/struct.rst:481 +msgid "Module :mod:`array`" +msgstr "模块 :mod:`array`" + +#: ../../library/struct.rst:482 +msgid "Packed binary storage of homogeneous data." +msgstr "被打包为二进制存储的同质数据。" + +#: ../../library/struct.rst:484 +msgid "Module :mod:`json`" +msgstr "模块 :mod:`json`" + +#: ../../library/struct.rst:485 +msgid "JSON encoder and decoder." +msgstr "JSON 编码器和解码器。" + +#: ../../library/struct.rst:487 +msgid "Module :mod:`pickle`" +msgstr "模块 :mod:`pickle`" + +#: ../../library/struct.rst:488 +msgid "Python object serialization." +msgstr "Python 对象序列化。" + +#: ../../library/struct.rst:494 +msgid "Applications" +msgstr "应用" + +#: ../../library/struct.rst:496 +msgid "" +"Two main applications for the :mod:`!struct` module exist, data interchange " +"between Python and C code within an application or another application " +"compiled using the same compiler (:ref:`native formats`), and data interchange between applications using agreed upon data" +" layout (:ref:`standard formats`). Generally " +"speaking, the format strings constructed for these two domains are distinct." +msgstr "" +":mod:`!struct` 模块有两种主要用途,在应用程序内部 Python 与 C 代码之间或与使用同一编译器编译的另一个应用程序之间的数据交换 " +"(:ref:`原生格式 `),以及使用商定的数据布局在应用程序之间的数据交换 (:ref:`标准格式 " +"`)。一般来说,为这两个领域构造的格式字符串是不同的。" + +#: ../../library/struct.rst:507 +msgid "Native Formats" +msgstr "原生格式" + +#: ../../library/struct.rst:509 +msgid "" +"When constructing format strings which mimic native layouts, the compiler " +"and machine architecture determine byte ordering and padding. In such cases," +" the ``@`` format character should be used to specify native byte ordering " +"and data sizes. Internal pad bytes are normally inserted automatically. It" +" is possible that a zero-repeat format code will be needed at the end of a " +"format string to round up to the correct byte boundary for proper alignment " +"of consecutive chunks of data." +msgstr "" +"当构造模仿原生布局的格式字符串时,编译器和机器架构会决定字节顺序和填充。在这种情况下,应当使用 ``@`` 格式字符来指明原生字节顺序和数据大小。 " +"内部填充字节通常是自动插入的。为了正确对齐连续的数据块可能会在格式字符串末尾需要一个零重复的格式代码以舍入到正确的字节边界。" + +#: ../../library/struct.rst:517 +msgid "" +"Consider these two simple examples (on a 64-bit, little-endian machine)::" +msgstr "请看这两个简单的示例(在 64 位的小端序机器上)::" + +#: ../../library/struct.rst:520 +msgid "" +">>> calcsize('@lhl')\n" +"24\n" +">>> calcsize('@llh')\n" +"18" +msgstr "" +">>> calcsize('@lhl')\n" +"24\n" +">>> calcsize('@llh')\n" +"18" + +#: ../../library/struct.rst:525 +msgid "" +"Data is not padded to an 8-byte boundary at the end of the second format " +"string without the use of extra padding. A zero-repeat format code solves " +"that problem::" +msgstr "在不使用额外填充的情况下不会将数据填充到第二个格式字符串末尾的 8 字节边界上。零重复的格式代码解决了这个问题::" + +#: ../../library/struct.rst:529 +msgid "" +">>> calcsize('@llh0l')\n" +"24" +msgstr "" +">>> calcsize('@llh0l')\n" +"24" + +#: ../../library/struct.rst:532 +msgid "" +"The ``'x'`` format code can be used to specify the repeat, but for native " +"formats it is better to use a zero-repeat format like ``'0l'``." +msgstr "``'x'`` 格式代码可被用来指定重复,但对于原生格式来说最好是使用 ``'0l'`` 这样的零重复格式。" + +#: ../../library/struct.rst:535 +msgid "" +"By default, native byte ordering and alignment is used, but it is better to " +"be explicit and use the ``'@'`` prefix character." +msgstr "在默认情况下,将使用原生字节顺序和对齐,但最好是显式指定并使用 ``'@'`` 前缀字符。" + +#: ../../library/struct.rst:542 +msgid "Standard Formats" +msgstr "标准格式" + +#: ../../library/struct.rst:544 +msgid "" +"When exchanging data beyond your process such as networking or storage, be " +"precise. Specify the exact byte order, size, and alignment. Do not assume " +"they match the native order of a particular machine. For example, network " +"byte order is big-endian, while many popular CPUs are little-endian. By " +"defining this explicitly, the user need not care about the specifics of the " +"platform their code is running on. The first character should typically be " +"``<`` or ``>`` (or ``!``). Padding is the responsibility of the programmer." +" The zero-repeat format character won't work. Instead, the user must " +"explicitly add ``'x'`` pad bytes where needed. Revisiting the examples from" +" the previous section, we have::" +msgstr "" +"当与你的进程之外如网络或存储交换数据时,请务必保持精确。准确地指定字节顺序、大小和对齐。不要假定它们与特定机器的原生顺序相匹配。 " +"例如,网络字节顺序是大端序的,而许多流行的 CPU 则是小端序的。通过显式定义,用户将无需关心他们的代码运行所在平台的具体规格。第一个字符通常应为 " +"``<`` 或 ``>`` (或者 ``!``)。程序员要负责填充操作。零重复格式字符是无效的。相反,用户必须在需要时显式地添加 ``'x'`` " +"填充字节。回顾上一节中的示例,我们得到::" + +#: ../../library/struct.rst:556 +msgid "" +">>> calcsize('>> pack('>> calcsize('@llh')\n" +"18\n" +">>> pack('@llh', 1, 2, 3) == pack('>> calcsize('>> calcsize('@llh0l')\n" +"24\n" +">>> pack('@llh0l', 1, 2, 3) == pack('>> calcsize('>> pack('>> calcsize('@llh')\n" +"18\n" +">>> pack('@llh', 1, 2, 3) == pack('>> calcsize('>> calcsize('@llh0l')\n" +"24\n" +">>> pack('@llh0l', 1, 2, 3) == pack('>> calcsize('>> calcsize('@llh0l')\n" +"12\n" +">>> pack('@llh0l', 1, 2, 3) == pack('>> calcsize('>> calcsize('@llh0l')\n" +"12\n" +">>> pack('@llh0l', 1, 2, 3) == pack(' (greater)" +msgstr "> (大于)" + +#: ../../library/struct.rst:138 +msgid "! (exclamation)" +msgstr "! (感叹号)" + +#: ../../library/struct.rst:295 ../../library/struct.rst:398 +msgid "? (question mark)" +msgstr "? (问号)" diff --git a/library/subprocess.po b/library/subprocess.po new file mode 100644 index 0000000000..3b42b3b574 --- /dev/null +++ b/library/subprocess.po @@ -0,0 +1,2434 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/subprocess.rst:2 +msgid ":mod:`!subprocess` --- Subprocess management" +msgstr ":mod:`!subprocess` --- 子进程管理" + +#: ../../library/subprocess.rst:7 +msgid "**Source code:** :source:`Lib/subprocess.py`" +msgstr "**源代码:** :source:`Lib/subprocess.py`" + +#: ../../library/subprocess.rst:11 +msgid "" +"The :mod:`!subprocess` module allows you to spawn new processes, connect to " +"their input/output/error pipes, and obtain their return codes. This module " +"intends to replace several older modules and functions::" +msgstr "" + +#: ../../library/subprocess.rst:15 +msgid "" +"os.system\n" +"os.spawn*" +msgstr "" +"os.system\n" +"os.spawn*" + +#: ../../library/subprocess.rst:18 +msgid "" +"Information about how the :mod:`!subprocess` module can be used to replace " +"these modules and functions can be found in the following sections." +msgstr "" + +#: ../../library/subprocess.rst:23 +msgid ":pep:`324` -- PEP proposing the subprocess module" +msgstr ":pep:`324` -- 提出 subprocess 模块的 PEP" + +#: ../../library/subprocess.rst:595 ../../library/subprocess.rst:602 +#: ../../library/subprocess.rst:612 ../../library/subprocess.rst:621 +#: ../../library/subprocess.rst:636 ../../library/subprocess.rst:642 +#: ../../library/subprocess.rst:1524 ../../library/subprocess.rst:1546 +#: ../../includes/wasm-mobile-notavail.rst:3 +msgid "Availability" +msgstr "Availability" + +#: ../../includes/wasm-mobile-notavail.rst:5 +msgid "" +"This module is not supported on :ref:`mobile platforms ` or :ref:`WebAssembly platforms `." +msgstr "" +"此模块在 :ref:`移动平台 ` 或 :ref:`WebAssembly 平台 ` 上不受支持。" + +#: ../../library/subprocess.rst:28 +msgid "Using the :mod:`!subprocess` Module" +msgstr "使用 :mod:`!subprocess` 模块" + +#: ../../library/subprocess.rst:30 +msgid "" +"The recommended approach to invoking subprocesses is to use the :func:`run` " +"function for all use cases it can handle. For more advanced use cases, the " +"underlying :class:`Popen` interface can be used directly." +msgstr "" +"推荐的调用子进程的方式是在任何它支持的用例中使用 :func:`run` 函数。对于更进阶的用例,也可以使用底层的 :class:`Popen` 接口。" + +#: ../../library/subprocess.rst:40 +msgid "" +"Run the command described by *args*. Wait for command to complete, then " +"return a :class:`CompletedProcess` instance." +msgstr "运行被 *args* 描述的指令。等待指令完成,然后返回一个 :class:`CompletedProcess` 实例。" + +#: ../../library/subprocess.rst:43 +msgid "" +"The arguments shown above are merely the most common ones, described below " +"in :ref:`frequently-used-arguments` (hence the use of keyword-only notation " +"in the abbreviated signature). The full function signature is largely the " +"same as that of the :class:`Popen` constructor - most of the arguments to " +"this function are passed through to that interface. (*timeout*, *input*, " +"*check*, and *capture_output* are not.)" +msgstr "" +"以上显示的参数仅仅是最简单的一些,下面 :ref:`frequently-used-arguments` " +"描述(因此在缩写签名中使用仅关键字标示)。完整的函数头和 :class:`Popen` " +"的构造函数一样,此函数接受的大多数参数都被传递给该接口。(*timeout*, *input*, *check* 和 *capture_output* " +"除外)。" + +#: ../../library/subprocess.rst:50 +msgid "" +"If *capture_output* is true, stdout and stderr will be captured. When used, " +"the internal :class:`Popen` object is automatically created with *stdout* " +"and *stderr* both set to :data:`~subprocess.PIPE`. The *stdout* and *stderr*" +" arguments may not be supplied at the same time as *capture_output*. If you " +"wish to capture and combine both streams into one, set *stdout* to " +":data:`~subprocess.PIPE` and *stderr* to :data:`~subprocess.STDOUT`, instead" +" of using *capture_output*." +msgstr "" +"如果 *capture_output* 为真值,则 stdout 和 stderr 将被捕获。当被使用时,内部 :class:`Popen` " +"对象将自动创建并把 *stdout* 和 *stderr* 均设为 :data:`~subprocess.PIPE`。 *stdout* 和 " +"*stderr* 参数不可与 *capture_output* 同时提供。如果你希望捕获并将两个流合并在一起,请将 *stdout* 设为 " +":data:`~subprocess.PIPE` 并将 *stderr* 设为 :data:`~subprocess.STDOUT`,而不是使用 " +"*capture_output*." + +#: ../../library/subprocess.rst:59 +msgid "" +"A *timeout* may be specified in seconds, it is internally passed on to " +":meth:`Popen.communicate`. If the timeout expires, the child process will be" +" killed and waited for. The :exc:`TimeoutExpired` exception will be re-" +"raised after the child process has terminated. The initial process creation " +"itself cannot be interrupted on many platform APIs so you are not guaranteed" +" to see a timeout exception until at least after however long process " +"creation takes." +msgstr "" +"可以指定以秒为单位的 *timeout*,它会在内部传递给 :meth:`Popen.communicate`。 " +"如果达到超时限制,子进程将被杀掉并等待。 :exc:`TimeoutExpired` 异常将在子进程终结后重新被引发。在许多平台 API " +"上初始进程创建本身不可以被打断因此不保证你能看到超时异常直到至少进程创建花费的时间结束后。" + +#: ../../library/subprocess.rst:67 +msgid "" +"The *input* argument is passed to :meth:`Popen.communicate` and thus to the " +"subprocess's stdin. If used it must be a byte sequence, or a string if " +"*encoding* or *errors* is specified or *text* is true. When used, the " +"internal :class:`Popen` object is automatically created with *stdin* set to " +":data:`~subprocess.PIPE`, and the *stdin* argument may not be used as well." +msgstr "" +"*input* 参数将被传递给 :meth:`Popen.communicate` 以及子进程的 stdin。 " +"如果使用此参数则它必须是一个字节序列,或者如果指定了 *encoding* 或 *errors* 或 *text* 为真值则可以是一个字符串。 " +"当使用此参数时,将自动创建内部的 :class:`Popen` 对象并将其 *stdin* 设为 " +":data:`~subprocess.PIPE`,并且不可同时使用 *stdin* 参数。" + +#: ../../library/subprocess.rst:74 +msgid "" +"If *check* is true, and the process exits with a non-zero exit code, a " +":exc:`CalledProcessError` exception will be raised. Attributes of that " +"exception hold the arguments, the exit code, and stdout and stderr if they " +"were captured." +msgstr "" +"如果 *check* 设为 True, 并且进程以非零状态码退出,一个 :exc:`CalledProcessError` " +"异常将被抛出。这个异常的属性将设置为参数,退出码,以及标准输出和标准错误,如果被捕获到。" + +#: ../../library/subprocess.rst:79 +msgid "" +"If *encoding* or *errors* are specified, or *text* is true, file objects for" +" stdin, stdout and stderr are opened in text mode using the specified " +"*encoding* and *errors* or the :class:`io.TextIOWrapper` default. The " +"*universal_newlines* argument is equivalent to *text* and is provided for " +"backwards compatibility. By default, file objects are opened in binary mode." +msgstr "" +"如果指定了 *encoding* 或 *errors*,或者 *text* 被设为真值,标准输入、标准输出和标准错误的文件对象将使用指定的 " +"*encoding* 和 *errors* 或者 :class:`io.TextIOWrapper` 默认值以文本模式打开。 " +"*universal_newlines* 参数等同于 *text* 并且提供了向后兼容性。默认情况下,文件对象是以二进制模式打开的。" + +#: ../../library/subprocess.rst:85 +msgid "" +"If *env* is not ``None``, it must be a mapping that defines the environment " +"variables for the new process; these are used instead of the default " +"behavior of inheriting the current process' environment. It is passed " +"directly to :class:`Popen`. This mapping can be str to str on any platform " +"or bytes to bytes on POSIX platforms much like :data:`os.environ` or " +":data:`os.environb`." +msgstr "" +"如果 *env* 不为 ``None``,则它必须是一个为新进程定义环境变量的映射;它们将顶替继承当前进程环境的默认行为被使用。它会被直接传递给 " +":class:`Popen`。这个映射在任何平台上均可以是字符串到字符串的映射或者在 POSIX 平台上也可以是字节串到字节串的映射,就像是 " +":data:`os.environ` 或者 :data:`os.environb`。" + +#: ../../library/subprocess.rst:92 +msgid "Examples::" +msgstr "示例::" + +#: ../../library/subprocess.rst:94 +msgid "" +">>> subprocess.run([\"ls\", \"-l\"]) # doesn't capture output\n" +"CompletedProcess(args=['ls', '-l'], returncode=0)\n" +"\n" +">>> subprocess.run(\"exit 1\", shell=True, check=True)\n" +"Traceback (most recent call last):\n" +" ...\n" +"subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1\n" +"\n" +">>> subprocess.run([\"ls\", \"-l\", \"/dev/null\"], capture_output=True)\n" +"CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,\n" +"stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\\n', stderr=b'')" +msgstr "" +">>> subprocess.run([\"ls\", \"-l\"]) # 不捕获输出\n" +"CompletedProcess(args=['ls', '-l'], returncode=0)\n" +"\n" +">>> subprocess.run(\"exit 1\", shell=True, check=True)\n" +"Traceback (most recent call last):\n" +" ...\n" +"subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1\n" +"\n" +">>> subprocess.run([\"ls\", \"-l\", \"/dev/null\"], capture_output=True)\n" +"CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,\n" +"stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\\n', stderr=b'')" + +#: ../../library/subprocess.rst:110 +msgid "Added *encoding* and *errors* parameters" +msgstr "添加了 *encoding* 和 *errors* 形参。" + +#: ../../library/subprocess.rst:114 +msgid "" +"Added the *text* parameter, as a more understandable alias of " +"*universal_newlines*. Added the *capture_output* parameter." +msgstr "" +"添加了 *text* 形参,作为 *universal_newlines* 的一个更好理解的别名。添加了 *capture_output* 形参。" + +#: ../../library/subprocess.rst:119 ../../library/subprocess.rst:503 +#: ../../library/subprocess.rst:1244 ../../library/subprocess.rst:1284 +#: ../../library/subprocess.rst:1347 +msgid "" +"Changed Windows shell search order for ``shell=True``. The current directory" +" and ``%PATH%`` are replaced with ``%COMSPEC%`` and " +"``%SystemRoot%\\System32\\cmd.exe``. As a result, dropping a malicious " +"program named ``cmd.exe`` into a current directory no longer works." +msgstr "" +"针对 ``shell=True`` 改变的 Windows shell 搜索顺序。当前目录和 ``%PATH%`` 会被替换为 " +"``%COMSPEC%`` 和 ``%SystemRoot%\\\\System32\\\\cmd.exe``。因此,在当前目录中投放一个命名为 " +"``cmd.exe`` 的恶意程序不会再起作用。" + +#: ../../library/subprocess.rst:127 +msgid "" +"The return value from :func:`run`, representing a process that has finished." +msgstr ":func:`run` 的返回值,代表一个进程已经结束。" + +#: ../../library/subprocess.rst:131 +msgid "" +"The arguments used to launch the process. This may be a list or a string." +msgstr "被用作启动进程的参数。可能是一个列表或字符串。" + +#: ../../library/subprocess.rst:135 +msgid "" +"Exit status of the child process. Typically, an exit status of 0 indicates " +"that it ran successfully." +msgstr "子进程的退出状态码。通常来说,一个为 0 的退出码表示进程运行正常。" + +#: ../../library/subprocess.rst:138 ../../library/subprocess.rst:970 +msgid "" +"A negative value ``-N`` indicates that the child was terminated by signal " +"``N`` (POSIX only)." +msgstr "一个负值 ``-N`` 表示子进程被信号 ``N`` 中断 (仅 POSIX)." + +#: ../../library/subprocess.rst:143 +msgid "" +"Captured stdout from the child process. A bytes sequence, or a string if " +":func:`run` was called with an encoding, errors, or text=True. ``None`` if " +"stdout was not captured." +msgstr "" +"从子进程捕获到的标准输出。 一个字节序列,或者如果 :func:`run` 是设置了 *encoding*, *errors* 或者 " +"``text=True`` 来运行的则为一个字符串。 如果标准输出未被捕获则该值为 ``None``。" + +#: ../../library/subprocess.rst:147 +msgid "" +"If you ran the process with ``stderr=subprocess.STDOUT``, stdout and stderr " +"will be combined in this attribute, and :attr:`stderr` will be ``None``." +msgstr "" +"如果你通过 ``stderr=subprocess.STDOUT`` 运行进程,标准输出和标准错误将被组合在这个属性中,并且 " +":attr:`stderr` 将为 ``None``。" + +#: ../../library/subprocess.rst:153 +msgid "" +"Captured stderr from the child process. A bytes sequence, or a string if " +":func:`run` was called with an encoding, errors, or text=True. ``None`` if " +"stderr was not captured." +msgstr "" +"捕获到的子进程的标准错误。 一个字节序列,或者如果 :func:`run` 是设置了参数 *encoding*, *errors* 或者 " +"``text=True`` 运行的则为一个字符串。 如果标准错误未被捕获则该值为 ``None``。" + +#: ../../library/subprocess.rst:159 +msgid "If :attr:`returncode` is non-zero, raise a :exc:`CalledProcessError`." +msgstr "如果 :attr:`returncode` 非零,则会抛出 :exc:`CalledProcessError` 异常。" + +#: ../../library/subprocess.rst:165 +msgid "" +"Special value that can be used as the *stdin*, *stdout* or *stderr* argument" +" to :class:`Popen` and indicates that the special file :data:`os.devnull` " +"will be used." +msgstr "" +"可被 :class:`Popen` 的 *stdin*, *stdout* 或者 *stderr* 参数使用的特殊值,表示使用特殊文件 " +":data:`os.devnull`." + +#: ../../library/subprocess.rst:174 +msgid "" +"Special value that can be used as the *stdin*, *stdout* or *stderr* argument" +" to :class:`Popen` and indicates that a pipe to the standard stream should " +"be opened. Most useful with :meth:`Popen.communicate`." +msgstr "" +"可被 :class:`Popen` 的 *stdin*, *stdout* 或者 *stderr* 参数使用的特殊值,表示打开标准流的管道。常用于 " +":meth:`Popen.communicate`." + +#: ../../library/subprocess.rst:181 +msgid "" +"Special value that can be used as the *stderr* argument to :class:`Popen` " +"and indicates that standard error should go into the same handle as standard" +" output." +msgstr "可被 :class:`Popen` 的 *stderr* 参数使用的特殊值,表示标准错误与标准输出使用同一句柄。" + +#: ../../library/subprocess.rst:188 +msgid "Base class for all other exceptions from this module." +msgstr "此模块的其他异常的基类。" + +#: ../../library/subprocess.rst:195 +msgid "" +"Subclass of :exc:`SubprocessError`, raised when a timeout expires while " +"waiting for a child process." +msgstr ":exc:`SubprocessError` 的子类,等待子进程的过程中发生超时时被抛出。" + +#: ../../library/subprocess.rst:200 ../../library/subprocess.rst:244 +msgid "Command that was used to spawn the child process." +msgstr "用于创建子进程的指令。" + +#: ../../library/subprocess.rst:204 +msgid "Timeout in seconds." +msgstr "超时秒数。" + +#: ../../library/subprocess.rst:208 +msgid "" +"Output of the child process if it was captured by :func:`run` or " +":func:`check_output`. Otherwise, ``None``. This is always :class:`bytes` " +"when any output was captured regardless of the ``text=True`` setting. It " +"may remain ``None`` instead of ``b''`` when no output was observed." +msgstr "" +"当被 :func:`run` 或 :func:`check_output` 捕获时的子进程的输出。在其它情况下将为 " +"``None``。当有任何输出被捕获时这将始终为 :class:`bytes` 而不考虑是否设置了 ``text=True``。 " +"当未检测到输出时它可能会保持为 ``None`` 而不是 ``b''``。" + +#: ../../library/subprocess.rst:216 ../../library/subprocess.rst:253 +msgid "Alias for output, for symmetry with :attr:`stderr`." +msgstr "对 output 的别名,对应的有 :attr:`stderr`。" + +#: ../../library/subprocess.rst:220 +msgid "" +"Stderr output of the child process if it was captured by :func:`run`. " +"Otherwise, ``None``. This is always :class:`bytes` when stderr output was " +"captured regardless of the ``text=True`` setting. It may remain ``None`` " +"instead of ``b''`` when no stderr output was observed." +msgstr "" +"当被 :func:`run` 捕获时的标准错误输出。在其它情况下将为 ``None``。当有标准错误输出被捕获时这将始终为 :class:`bytes`" +" 而不考虑是否设置了 ``text=True``。当未检测到标准错误输出时它可能会保持为 ``None`` 而不是 ``b''``。" + +#: ../../library/subprocess.rst:227 ../../library/subprocess.rst:260 +msgid "*stdout* and *stderr* attributes added" +msgstr "添加了 *stdout* 和 *stderr* 属性。" + +#: ../../library/subprocess.rst:232 +msgid "" +"Subclass of :exc:`SubprocessError`, raised when a process run by " +":func:`check_call`, :func:`check_output`, or :func:`run` (with " +"``check=True``) returns a non-zero exit status." +msgstr "" +":exc:`SubprocessError` 的子类,当一个由 :func:`check_call`, :func:`check_output` 或 " +":func:`run` (附带 ``check=True``) 运行的进程返回了非零退出状态码时将被引发。" + +#: ../../library/subprocess.rst:239 +msgid "" +"Exit status of the child process. If the process exited due to a signal, " +"this will be the negative signal number." +msgstr "子进程的退出状态。如果程序由一个信号终止,这将会被设为一个负的信号码。" + +#: ../../library/subprocess.rst:248 +msgid "" +"Output of the child process if it was captured by :func:`run` or " +":func:`check_output`. Otherwise, ``None``." +msgstr "子进程的输出,如果被 :func:`run` 或 :func:`check_output` 捕获。否则为 ``None``。" + +#: ../../library/subprocess.rst:257 +msgid "" +"Stderr output of the child process if it was captured by :func:`run`. " +"Otherwise, ``None``." +msgstr "子进程的标准错误输出,如果被 :func:`run` 捕获。否则为 ``None``。" + +#: ../../library/subprocess.rst:267 +msgid "Frequently Used Arguments" +msgstr "常用参数" + +#: ../../library/subprocess.rst:269 +msgid "" +"To support a wide variety of use cases, the :class:`Popen` constructor (and " +"the convenience functions) accept a large number of optional arguments. For " +"most typical use cases, many of these arguments can be safely left at their " +"default values. The arguments that are most commonly needed are:" +msgstr "" +"为了支持丰富的使用案例, :class:`Popen` " +"的构造函数(以及方便的函数)接受大量可选的参数。对于大多数典型的用例,许多参数可以被安全地留以它们的默认值。通常需要的参数有:" + +#: ../../library/subprocess.rst:274 +msgid "" +"*args* is required for all calls and should be a string, or a sequence of " +"program arguments. Providing a sequence of arguments is generally preferred," +" as it allows the module to take care of any required escaping and quoting " +"of arguments (e.g. to permit spaces in file names). If passing a single " +"string, either *shell* must be :const:`True` (see below) or else the string " +"must simply name the program to be executed without specifying any " +"arguments." +msgstr "" +"*args* 被所有调用需要,应当为一个字符串,或者一个程序参数序列。 " +"提供一个参数序列通常更好,它可以更小心地使用参数中的转义字符以及引用(例如允许文件名中的空格)。 如果传递一个简单的字符串,则 *shell* " +"参数必须为 :const:`True` (见下文) 或者该字符串中将被运行的程序名必须用简单的命名而不指定任何参数。" + +#: ../../library/subprocess.rst:282 +msgid "" +"*stdin*, *stdout* and *stderr* specify the executed program's standard " +"input, standard output and standard error file handles, respectively. Valid" +" values are ``None``, :data:`PIPE`, :data:`DEVNULL`, an existing file " +"descriptor (a positive integer), and an existing :term:`file object` with a " +"valid file descriptor. With the default settings of ``None``, no " +"redirection will occur. :data:`PIPE` indicates that a new pipe to the child" +" should be created. :data:`DEVNULL` indicates that the special file " +":data:`os.devnull` will be used. Additionally, *stderr* can be " +":data:`STDOUT`, which indicates that the stderr data from the child process " +"should be captured into the same file handle as for *stdout*." +msgstr "" +"*stdin*, *stdout* 和 *stderr* 分别指定被执行程序的标准输入、标准输出和标准错误文件句柄。合法的值包括 ``None``, " +":data:`PIPE`, :data:`DEVNULL`, 现存的文件描述符(一个正整数),现存的具有合法文件描述符的 :term:`file " +"object`。当使用默认设置 ``None`` 时,将不会进行任何重定向。 :data:`PIPE` 表示应当新建一个连接子进程的管道。 " +":data:`DEVNULL` 表示将使用特殊文件 :data:`os.devnull`。此外,*stderr* 还可以为 " +":data:`STDOUT`,这表示来自子进程的 stderr 数据应当被捕获到与 *stdout* 相同的文件句柄中。" + +#: ../../library/subprocess.rst:296 +msgid "" +"If *encoding* or *errors* are specified, or *text* (also known as " +"*universal_newlines*) is true, the file objects *stdin*, *stdout* and " +"*stderr* will be opened in text mode using the *encoding* and *errors* " +"specified in the call or the defaults for :class:`io.TextIOWrapper`." +msgstr "" +"如果指定了 *encoding* 或 *errors*,或者 *text* (也称 *universal_newlines*) 为真,则文件对象 " +"*stdin*、 *stdout* 与 *stderr* 将会使用在此次调用中指定的 *encoding* 和 *errors* 或者 " +":class:`io.TextIOWrapper` 的默认值以文本模式打开。" + +#: ../../library/subprocess.rst:302 +msgid "" +"For *stdin*, line ending characters ``'\\n'`` in the input will be converted" +" to the default line separator :data:`os.linesep`. For *stdout* and " +"*stderr*, all line endings in the output will be converted to ``'\\n'``. " +"For more information see the documentation of the :class:`io.TextIOWrapper` " +"class when the *newline* argument to its constructor is ``None``." +msgstr "" +"当构造函数的 *newline* 参数为 ``None`` 时。对于 *stdin*,输入的换行符 ``'\\\\n'`` 将被转换为默认的换行符 " +":data:`os.linesep`。对于 *stdout* 和 *stderr*,所有输出的换行符都被转换为 ``'\\\\n'``。更多信息,查看 " +":class:`io.TextIOWrapper` 类的文档。" + +#: ../../library/subprocess.rst:308 +msgid "" +"If text mode is not used, *stdin*, *stdout* and *stderr* will be opened as " +"binary streams. No encoding or line ending conversion is performed." +msgstr "如果文本模式未被使用, *stdin*, *stdout* 和 *stderr* 将会以二进制流模式打开。没有编码与换行符转换发生。" + +#: ../../library/subprocess.rst:311 ../../library/subprocess.rst:1533 +#: ../../library/subprocess.rst:1551 +msgid "Added the *encoding* and *errors* parameters." +msgstr "增加了 *encoding* 和 *errors* 形参。" + +#: ../../library/subprocess.rst:314 +msgid "Added the *text* parameter as an alias for *universal_newlines*." +msgstr "添加了 *text* 形参作为 *universal_newlines* 的别名。" + +#: ../../library/subprocess.rst:319 +msgid "" +"The newlines attribute of the file objects :attr:`Popen.stdin`, " +":attr:`Popen.stdout` and :attr:`Popen.stderr` are not updated by the " +":meth:`Popen.communicate` method." +msgstr "" +"文件对象 :attr:`Popen.stdin`、 :attr:`Popen.stdout` 和 :attr:`Popen.stderr` " +"的换行符属性不会被 :meth:`Popen.communicate` 方法更新。" + +#: ../../library/subprocess.rst:323 +msgid "" +"If *shell* is ``True``, the specified command will be executed through the " +"shell. This can be useful if you are using Python primarily for the " +"enhanced control flow it offers over most system shells and still want " +"convenient access to other shell features such as shell pipes, filename " +"wildcards, environment variable expansion, and expansion of ``~`` to a " +"user's home directory. However, note that Python itself offers " +"implementations of many shell-like features (in particular, :mod:`glob`, " +":mod:`fnmatch`, :func:`os.walk`, :func:`os.path.expandvars`, " +":func:`os.path.expanduser`, and :mod:`shutil`)." +msgstr "" +"如果 *shell* 设为 ``True``,则使用 shell 执行指定的指令。如果您主要使用 Python 增强的控制流(它比大多数系统 shell" +" 提供的强大),并且仍然希望方便地使用其他 shell 功能,如 shell 管道、文件通配符、环境变量展开以及 ``~`` " +"展开到用户家目录,这将非常有用。但是,注意 Python 自己也实现了许多类似 shell 的特性 (例如 :mod:`glob`, " +":mod:`fnmatch`, :func:`os.walk`, :func:`os.path.expandvars`, " +":func:`os.path.expanduser` 和 :mod:`shutil`)。" + +#: ../../library/subprocess.rst:333 +msgid "" +"When *universal_newlines* is ``True``, the class uses the encoding " +":func:`locale.getpreferredencoding(False) ` " +"instead of ``locale.getpreferredencoding()``. See the " +":class:`io.TextIOWrapper` class for more information on this change." +msgstr "" +"当 *universal_newlines* 被设为 ``True``,则类将使用 " +":func:`locale.getpreferredencoding(False) ` " +"编码格式来代替 ``locale.getpreferredencoding()``。关于它们的区别的更多信息,见 " +":class:`io.TextIOWrapper`." + +#: ../../library/subprocess.rst:341 ../../library/subprocess.rst:462 +msgid "" +"Read the `Security Considerations`_ section before using ``shell=True``." +msgstr "在使用 ``shell=True`` 之前,请阅读 `Security Considerations`_ 段落。" + +#: ../../library/subprocess.rst:343 +msgid "" +"These options, along with all of the other options, are described in more " +"detail in the :class:`Popen` constructor documentation." +msgstr "这些选项以及所有其他选项在 :class:`Popen` 构造函数文档中有更详细的描述。" + +#: ../../library/subprocess.rst:348 +msgid "Popen Constructor" +msgstr "Popen 构造函数" + +#: ../../library/subprocess.rst:350 +msgid "" +"The underlying process creation and management in this module is handled by " +"the :class:`Popen` class. It offers a lot of flexibility so that developers " +"are able to handle the less common cases not covered by the convenience " +"functions." +msgstr "" +"此模块的底层的进程创建与管理由 :class:`Popen` 类处理。它提供了很大的灵活性,因此开发者能够处理未被便利函数覆盖的不常见用例。" + +#: ../../library/subprocess.rst:365 +msgid "" +"Execute a child program in a new process. On POSIX, the class uses " +":meth:`os.execvpe`-like behavior to execute the child program. On Windows, " +"the class uses the Windows ``CreateProcess()`` function. The arguments to " +":class:`Popen` are as follows." +msgstr "" +"在一个新的进程中执行子程序。在 POSIX 上,该类会使用类似于 :meth:`os.execvpe` 的行为来执行子程序。在 Windows " +"上,该类会使用 Windows ``CreateProcess()`` 函数。 :class:`Popen` 的参数如下。" + +#: ../../library/subprocess.rst:370 +msgid "" +"*args* should be a sequence of program arguments or else a single string or " +":term:`path-like object`. By default, the program to execute is the first " +"item in *args* if *args* is a sequence. If *args* is a string, the " +"interpretation is platform-dependent and described below. See the *shell* " +"and *executable* arguments for additional differences from the default " +"behavior. Unless otherwise stated, it is recommended to pass *args* as a " +"sequence." +msgstr "" +"*args* 应当是一个程序参数的序列或者是一个单独的字符串或 :term:`path-like object`。默认情况下,如果 *args* " +"是序列则要运行的程序为 *args* 中的第一项。如果 *args* 是字符串,则其解读依赖于具体平台,如下所述。请查看 *shell* 和 " +"*executable* 参数了解其与默认行为的其他差异。除非另有说明,否则推荐以序列形式传入 *args*。" + +#: ../../library/subprocess.rst:380 +msgid "" +"For maximum reliability, use a fully qualified path for the executable. To " +"search for an unqualified name on :envvar:`PATH`, use :meth:`shutil.which`. " +"On all platforms, passing :data:`sys.executable` is the recommended way to " +"launch the current Python interpreter again, and use the ``-m`` command-line" +" format to launch an installed module." +msgstr "" +"为了最大化可靠性,请使用可执行文件的完整限定路径。要在 :envvar:`PATH` 中搜索一个非限定名称,请使用 " +":meth:`shutil.which`。在所有平台上,传入 :data:`sys.executable` 是再次启动当前 Python " +"解释器的推荐方式,并请使用 ``-m`` 命令行格式来启动已安装的模块。" + +#: ../../library/subprocess.rst:386 +msgid "" +"Resolving the path of *executable* (or the first item of *args*) is platform" +" dependent. For POSIX, see :meth:`os.execvpe`, and note that when resolving " +"or searching for the executable path, *cwd* overrides the current working " +"directory and *env* can override the ``PATH`` environment variable. For " +"Windows, see the documentation of the ``lpApplicationName`` and " +"``lpCommandLine`` parameters of WinAPI ``CreateProcess``, and note that when" +" resolving or searching for the executable path with ``shell=False``, *cwd* " +"does not override the current working directory and *env* cannot override " +"the ``PATH`` environment variable. Using a full path avoids all of these " +"variations." +msgstr "" +"对 *executable* (或 *args* 的第一项) 路径的解析方式依赖于具体平台。对于 POSIX,请参阅 " +":meth:`os.execvpe`,并要注意当解析或搜索可执行文件路径时,*cwd* 会覆盖当前工作目录而 *env* 可以覆盖 ``PATH`` " +"环境变量。对于 Windows,请参阅 ``lpApplicationName`` 的文档以及 ``lpCommandLine`` 形参 (传给 " +"WinAPI ``CreateProcess``),并要注意当解析或搜索可执行文件路径时如果传入 ``shell=False``,则 *cwd* " +"不会覆盖当前工作目录而 *env* 无法覆盖 ``PATH`` 环境变量。使用完整路径可避免所有这些变化情况。" + +#: ../../library/subprocess.rst:397 +msgid "" +"An example of passing some arguments to an external program as a sequence " +"is::" +msgstr "向外部程序传入序列形式参数的一个例子如下::" + +#: ../../library/subprocess.rst:400 +msgid "Popen([\"/usr/bin/git\", \"commit\", \"-m\", \"Fixes a bug.\"])" +msgstr "Popen([\"/usr/bin/git\", \"commit\", \"-m\", \"Fixes a bug.\"])" + +#: ../../library/subprocess.rst:402 +msgid "" +"On POSIX, if *args* is a string, the string is interpreted as the name or " +"path of the program to execute. However, this can only be done if not " +"passing arguments to the program." +msgstr "" +"在 POSIX,如果 *args* 是一个字符串,此字符串被作为将被执行的程序的命名或路径解释。但是,只有在不传递任何参数给程序的情况下才能这么做。" + +#: ../../library/subprocess.rst:408 +msgid "" +"It may not be obvious how to break a shell command into a sequence of " +"arguments, especially in complex cases. :meth:`shlex.split` can illustrate " +"how to determine the correct tokenization for *args*::" +msgstr "" +"将 shell 命令拆分为参数序列的方式可能并不很直观,特别是在复杂的情况下。 :meth:`shlex.split` 可以演示如何确定 *args* " +"适当的拆分形式::" + +#: ../../library/subprocess.rst:412 +msgid "" +">>> import shlex, subprocess\n" +">>> command_line = input()\n" +"/bin/vikings -input eggs.txt -output \"spam spam.txt\" -cmd \"echo '$MONEY'\"\n" +">>> args = shlex.split(command_line)\n" +">>> print(args)\n" +"['/bin/vikings', '-input', 'eggs.txt', '-output', 'spam spam.txt', '-cmd', \"echo '$MONEY'\"]\n" +">>> p = subprocess.Popen(args) # Success!" +msgstr "" +">>> import shlex, subprocess\n" +">>> command_line = input()\n" +"/bin/vikings -input eggs.txt -output \"spam spam.txt\" -cmd \"echo '$MONEY'\"\n" +">>> args = shlex.split(command_line)\n" +">>> print(args)\n" +"['/bin/vikings', '-input', 'eggs.txt', '-output', 'spam spam.txt', '-cmd', \"echo '$MONEY'\"]\n" +">>> p = subprocess.Popen(args) # Success!" + +#: ../../library/subprocess.rst:420 +msgid "" +"Note in particular that options (such as *-input*) and arguments (such as " +"*eggs.txt*) that are separated by whitespace in the shell go in separate " +"list elements, while arguments that need quoting or backslash escaping when " +"used in the shell (such as filenames containing spaces or the *echo* command" +" shown above) are single list elements." +msgstr "" +"特别注意,由 shell 中的空格分隔的选项(例如 *-input*)和参数(例如 *eggs.txt* " +")位于分开的列表元素中,而在需要时使用引号或反斜杠转义的参数在 shell(例如包含空格的文件名或上面显示的 *echo* 命令)是单独的列表元素。" + +#: ../../library/subprocess.rst:426 +msgid "" +"On Windows, if *args* is a sequence, it will be converted to a string in a " +"manner described in :ref:`converting-argument-sequence`. This is because " +"the underlying ``CreateProcess()`` operates on strings." +msgstr "" +"在 Windows,如果 *args* 是一个序列,它将通过一个在 :ref:`converting-argument-sequence` " +"描述的方式被转换为一个字符串。这是因为底层的 ``CreateProcess()`` 只处理字符串。" + +#: ../../library/subprocess.rst:430 +msgid "" +"*args* parameter accepts a :term:`path-like object` if *shell* is ``False`` " +"and a sequence containing path-like objects on POSIX." +msgstr "" +"在 POSIX 上如果 *shell* 为 ``False`` 并且序列包含路径类对象则 *args* 形参可以接受一个 :term:`path-" +"like object`." + +#: ../../library/subprocess.rst:434 +msgid "" +"*args* parameter accepts a :term:`path-like object` if *shell* is ``False`` " +"and a sequence containing bytes and path-like objects on Windows." +msgstr "" +"如果在 Windows 上 *shell* 为 ``False`` 并且序列包含字节串和路径类对象则 *args* 形参可以接受一个 " +":term:`path-like object`." + +#: ../../library/subprocess.rst:439 +msgid "" +"The *shell* argument (which defaults to ``False``) specifies whether to use " +"the shell as the program to execute. If *shell* is ``True``, it is " +"recommended to pass *args* as a string rather than as a sequence." +msgstr "" +"参数 *shell* (默认为 ``False``) 指定是否使用 shell 执行程序。 如果 *shell* 为 ``True``,更推荐将 " +"*args* 作为字符串传递而非序列。" + +#: ../../library/subprocess.rst:443 +msgid "" +"On POSIX with ``shell=True``, the shell defaults to :file:`/bin/sh`. If " +"*args* is a string, the string specifies the command to execute through the " +"shell. This means that the string must be formatted exactly as it would be " +"when typed at the shell prompt. This includes, for example, quoting or " +"backslash escaping filenames with spaces in them. If *args* is a sequence, " +"the first item specifies the command string, and any additional items will " +"be treated as additional arguments to the shell itself. That is to say, " +":class:`Popen` does the equivalent of::" +msgstr "" +"在 POSIX,当 ``shell=True``,shell 默认为 :file:`/bin/sh`。如果 *args* " +"是一个字符串,此字符串指定将通过 shell " +"执行的命令。这意味着字符串的格式必须和在命令提示符中所输入的完全相同。这包括,例如,引号和反斜杠转义包含空格的文件名。如果 *args* " +"是一个序列,第一项指定了命令,另外的项目将作为传递给 shell(而非命令)的参数对待。也就是说, :class:`Popen` 等同于::" + +#: ../../library/subprocess.rst:452 +msgid "Popen(['/bin/sh', '-c', args[0], args[1], ...])" +msgstr "Popen(['/bin/sh', '-c', args[0], args[1], ...])" + +#: ../../library/subprocess.rst:454 +msgid "" +"On Windows with ``shell=True``, the :envvar:`COMSPEC` environment variable " +"specifies the default shell. The only time you need to specify " +"``shell=True`` on Windows is when the command you wish to execute is built " +"into the shell (e.g. :command:`dir` or :command:`copy`). You do not need " +"``shell=True`` to run a batch file or console-based executable." +msgstr "" +"在 Windows,使用 ``shell=True``,环境变量 :envvar:`COMSPEC` 指定了默认 shell。在 Windows " +"你唯一需要指定 ``shell=True`` 的情况是你想要执行内置在 shell 中的命令 (例如 :command:`dir` 或者 " +":command:`copy`)。 在运行一个批处理文件或者基于控制台的可执行文件时,不需要 ``shell=True``。" + +#: ../../library/subprocess.rst:464 +msgid "" +"*bufsize* will be supplied as the corresponding argument to the :func:`open`" +" function when creating the stdin/stdout/stderr pipe file objects:" +msgstr "*bufsize* 将在 :func:`open` 函数创建了 stdin/stdout/stderr 管道文件对象时作为对应的参数供应:" + +#: ../../library/subprocess.rst:468 +msgid "" +"``0`` means unbuffered (read and write are one system call and can return " +"short)" +msgstr "``0`` 表示不使用缓冲区(读取与写入是一个系统调用并且可以返回短内容)" + +#: ../../library/subprocess.rst:470 +msgid "" +"``1`` means line buffered (only usable if ``text=True`` or " +"``universal_newlines=True``)" +msgstr "``1`` 表示带有行缓冲(仅在 ``text=True`` 或 ``universal_newlines=True`` 时有用)" + +#: ../../library/subprocess.rst:472 +msgid "any other positive value means use a buffer of approximately that size" +msgstr "任何其他正值表示使用一个约为对应大小的缓冲区" + +#: ../../library/subprocess.rst:474 +msgid "" +"negative bufsize (the default) means the system default of " +"io.DEFAULT_BUFFER_SIZE will be used." +msgstr "负的 *bufsize* (默认)表示使用系统默认的 io.DEFAULT_BUFFER_SIZE。" + +#: ../../library/subprocess.rst:477 +msgid "" +"*bufsize* now defaults to -1 to enable buffering by default to match the " +"behavior that most code expects. In versions prior to Python 3.2.4 and " +"3.3.1 it incorrectly defaulted to ``0`` which was unbuffered and allowed " +"short reads. This was unintentional and did not match the behavior of " +"Python 2 as most code expected." +msgstr "" +"*bufsize* 现在默认为 -1 表示启用缓冲以符合大多数代码所期望的行为。在 Python 3.2.4 和 3.3.1 " +"之前的版本中它错误地将默认值设为 ``0`` 即无缓冲并且允许短读取。这是无意的失误并且与大多数代码所期望的 Python 2 的行为不一致。" + +#: ../../library/subprocess.rst:484 +msgid "" +"The *executable* argument specifies a replacement program to execute. It " +"is very seldom needed. When ``shell=False``, *executable* replaces the " +"program to execute specified by *args*. However, the original *args* is " +"still passed to the program. Most programs treat the program specified by " +"*args* as the command name, which can then be different from the program " +"actually executed. On POSIX, the *args* name becomes the display name for " +"the executable in utilities such as :program:`ps`. If ``shell=True``, on " +"POSIX the *executable* argument specifies a replacement shell for the " +"default :file:`/bin/sh`." +msgstr "" +"*executable* 参数指定一个要执行的替换程序。这很少需要。当 ``shell=False``, *executable* 替换 *args* " +"指定运行的程序。但是,原始的 *args* 仍然被传递给程序。大多数程序将被 *args* 指定的程序作为命令名对待,这可以与实际运行的程序不同。在 " +"POSIX, *args* 名作为实际调用程序中可执行文件的显示名称,例如 :program:`ps`。如果 ``shell=True``,在 " +"POSIX, *executable* 参数指定用于替换默认 shell :file:`/bin/sh` 的 shell。" + +#: ../../library/subprocess.rst:494 +msgid "*executable* parameter accepts a :term:`path-like object` on POSIX." +msgstr "在 POSIX 上 *executable* 形参可以接受一个 :term:`path-like object`。" + +#: ../../library/subprocess.rst:497 +msgid "" +"*executable* parameter accepts a bytes and :term:`path-like object` on " +"Windows." +msgstr "在 Windows 上 *executable* 形参可以接受一个字节串和 :term:`path-like object`。" + +#: ../../library/subprocess.rst:509 +msgid "" +"*stdin*, *stdout* and *stderr* specify the executed program's standard " +"input, standard output and standard error file handles, respectively. Valid" +" values are ``None``, :data:`PIPE`, :data:`DEVNULL`, an existing file " +"descriptor (a positive integer), and an existing :term:`file object` with a " +"valid file descriptor. With the default settings of ``None``, no " +"redirection will occur. :data:`PIPE` indicates that a new pipe to the child" +" should be created. :data:`DEVNULL` indicates that the special file " +":data:`os.devnull` will be used. Additionally, *stderr* can be " +":data:`STDOUT`, which indicates that the stderr data from the applications " +"should be captured into the same file handle as for *stdout*." +msgstr "" +"*stdin*, *stdout* 和 *stderr* 分别指定被执行程序的标准输入、标准输出和标准错误文件句柄。合法的值包括 ``None``, " +":data:`PIPE`, :data:`DEVNULL`, 现存的文件描述符(一个正整数),现存的具有合法文件描述符的 :term:`file " +"object`。当使用默认设置 ``None`` 时,将不会进行任何重定向。 :data:`PIPE` 表示应当新建一个连接子进程的管道。 " +":data:`DEVNULL` 表示将使用特殊文件 :data:`os.devnull`。此外,*stderr* 还可以为 " +":data:`STDOUT`,这表示来自子进程的 stderr 数据应当被捕获到与 *stdout* 相同的文件句柄中。" + +#: ../../library/subprocess.rst:520 +msgid "" +"If *preexec_fn* is set to a callable object, this object will be called in " +"the child process just before the child is executed. (POSIX only)" +msgstr "如果 *preexec_fn* 被设为一个可调用对象,此对象将在子进程刚创建时被调用。(仅 POSIX)" + +#: ../../library/subprocess.rst:526 +msgid "" +"The *preexec_fn* parameter is NOT SAFE to use in the presence of threads in " +"your application. The child process could deadlock before exec is called." +msgstr "*preexec_fn* 形参在应用程序中存在多线程时是不安全的。子进程在 exec 被调用之前可能会死锁。" + +#: ../../library/subprocess.rst:532 +msgid "" +"If you need to modify the environment for the child use the *env* parameter " +"rather than doing it in a *preexec_fn*. The *start_new_session* and " +"*process_group* parameters should take the place of code using *preexec_fn* " +"to call :func:`os.setsid` or :func:`os.setpgid` in the child." +msgstr "" +"如果你需要为子进程修改环境请使用 *env* 形参而不要在 *preexec_fn* 中操作。 *start_new_session* 和 " +"*process_group* 形参应当代替使用 *preexec_fn* 的代码来在子进程中调用 :func:`os.setsid` 或 " +":func:`os.setpgid`." + +#: ../../library/subprocess.rst:539 +msgid "" +"The *preexec_fn* parameter is no longer supported in subinterpreters. The " +"use of the parameter in a subinterpreter raises :exc:`RuntimeError`. The new" +" restriction may affect applications that are deployed in mod_wsgi, uWSGI, " +"and other embedded environments." +msgstr "" +"*preexec_fn* 形参在子解释器中已不再受支持。在子解释器中使用此形参将引发 :exc:`RuntimeError`。 " +"这个新限制可能会影响部署在 mod_wsgi, uWSGI 和其他嵌入式环境中的应用。" + +#: ../../library/subprocess.rst:544 +msgid "" +"If *close_fds* is true, all file descriptors except ``0``, ``1`` and ``2`` " +"will be closed before the child process is executed. Otherwise when " +"*close_fds* is false, file descriptors obey their inheritable flag as " +"described in :ref:`fd_inheritance`." +msgstr "" +"如果 *close_fds* 为真值,则除 ``0``, ``1`` 和 ``2`` 之外的所有文件描述符都将在子进程执行前被关闭。而当 " +"*close_fds* 为假值时,文件描述符将遵循它们的可继承旗标,如 :ref:`fd_inheritance` 所描述的。" + +#: ../../library/subprocess.rst:549 +msgid "" +"On Windows, if *close_fds* is true then no handles will be inherited by the " +"child process unless explicitly passed in the ``handle_list`` element of " +":attr:`STARTUPINFO.lpAttributeList`, or by standard handle redirection." +msgstr "" +"在 Windows,如果 *close_fds* 为真,则子进程不会继承任何句柄,除非在 " +":attr:`STARTUPINFO.lpAttributeList` 的 ``handle_list`` 的键中显式传递,或者通过标准句柄重定向传递。" + +#: ../../library/subprocess.rst:553 +msgid "" +"The default for *close_fds* was changed from :const:`False` to what is " +"described above." +msgstr "*close_fds* 的默认值已经从 :const:`False` 修改为上述值。" + +#: ../../library/subprocess.rst:557 +msgid "" +"On Windows the default for *close_fds* was changed from :const:`False` to " +":const:`True` when redirecting the standard handles. It's now possible to " +"set *close_fds* to :const:`True` when redirecting the standard handles." +msgstr "" +"在 Windows,当重定向标准句柄时 *close_fds* 的默认值从 :const:`False` 变为 " +":const:`True`。现在重定向标准句柄时有可能设置 *close_fds* 为 :const:`True`。(标准句柄指三个 stdio " +"的句柄)" + +#: ../../library/subprocess.rst:562 +msgid "" +"*pass_fds* is an optional sequence of file descriptors to keep open between " +"the parent and child. Providing any *pass_fds* forces *close_fds* to be " +":const:`True`. (POSIX only)" +msgstr "" +"*pass_fds* 是一个可选的在父子进程间保持打开的文件描述符序列。提供任何 *pass_fds* 将强制 *close_fds* 为 " +":const:`True`。(仅 POSIX)" + +#: ../../library/subprocess.rst:566 +msgid "The *pass_fds* parameter was added." +msgstr "加入了 *pass_fds* 形参。" + +#: ../../library/subprocess.rst:569 +msgid "" +"If *cwd* is not ``None``, the function changes the working directory to " +"*cwd* before executing the child. *cwd* can be a string, bytes or " +":term:`path-like ` object. On POSIX, the function looks " +"for *executable* (or for the first item in *args*) relative to *cwd* if the " +"executable path is a relative path." +msgstr "" +"如果 *cwd* 不为 ``None``,此函数在执行子进程前会将当前工作目录改为 *cwd*。 *cwd* 可以是一个字符串、字节串或 " +":term:`路径类对象 `。在 POSIX 上,如果可执行文件路径为相对路径则此函数会相对于 *cwd* 来查找 " +"*executable* (或 *args* 的第一项)。" + +#: ../../library/subprocess.rst:575 +msgid "*cwd* parameter accepts a :term:`path-like object` on POSIX." +msgstr "在 POSIX 上 *cwd* 形参接受一个 :term:`path-like object`。" + +#: ../../library/subprocess.rst:578 +msgid "*cwd* parameter accepts a :term:`path-like object` on Windows." +msgstr "在 Windows 上 *cwd* 形参接受一个 :term:`path-like object`。" + +#: ../../library/subprocess.rst:581 +msgid "*cwd* parameter accepts a bytes object on Windows." +msgstr "在 Windows 上 *cwd* 形参接受一个字节串对象。" + +#: ../../library/subprocess.rst:584 +msgid "" +"If *restore_signals* is true (the default) all signals that Python has set " +"to SIG_IGN are restored to SIG_DFL in the child process before the exec. " +"Currently this includes the SIGPIPE, SIGXFZ and SIGXFSZ signals. (POSIX " +"only)" +msgstr "" +" 如果 *restore_signals* 为 true(默认值),则 Python 设置为 SIG_IGN 的所有信号将在 exec " +"之前的子进程中恢复为 SIG_DFL。目前,这包括 SIGPIPE,SIGXFZ 和 SIGXFSZ 信号。 (仅 POSIX)" + +#: ../../library/subprocess.rst:589 +msgid "*restore_signals* was added." +msgstr "*restore_signals* 被加入。" + +#: ../../library/subprocess.rst:592 +msgid "" +"If *start_new_session* is true the ``setsid()`` system call will be made in " +"the child process prior to the execution of the subprocess." +msgstr "如果 *start_new_session* 为真值则 ``setsid()`` 系统调用将在执行子进程之前在子进程中执行。" + +#: ../../library/subprocess.rst:596 +msgid "*start_new_session* was added." +msgstr "*start_new_session* 被添加。" + +#: ../../library/subprocess.rst:599 +msgid "" +"If *process_group* is a non-negative integer, the ``setpgid(0, value)`` " +"system call will be made in the child process prior to the execution of the " +"subprocess." +msgstr "" +"如果 *process_group* 为非负整数,则 ``setpgid(0, value)`` 系统调用将在执行子进程之前在子进程中执行。" + +#: ../../library/subprocess.rst:603 +msgid "*process_group* was added." +msgstr "添加了 *process_group*。" + +#: ../../library/subprocess.rst:606 +msgid "" +"If *group* is not ``None``, the setregid() system call will be made in the " +"child process prior to the execution of the subprocess. If the provided " +"value is a string, it will be looked up via :func:`grp.getgrnam` and the " +"value in ``gr_gid`` will be used. If the value is an integer, it will be " +"passed verbatim. (POSIX only)" +msgstr "" +"如果 *group* 不为 ``None``,则 setregid() 系统调用将在子进程执行之前在下级进程中进行。如果所提供的值是一个字符串,将通过 " +":func:`grp.getgrnam` 来查找它并将使用 ``gr_gid`` 中的值。如果该值是一个整数,它将被原样传递。 (POSIX 专属)" + +#: ../../library/subprocess.rst:615 +msgid "" +"If *extra_groups* is not ``None``, the setgroups() system call will be made " +"in the child process prior to the execution of the subprocess. Strings " +"provided in *extra_groups* will be looked up via :func:`grp.getgrnam` and " +"the values in ``gr_gid`` will be used. Integer values will be passed " +"verbatim. (POSIX only)" +msgstr "" +"如果 *extra_groups* 不为 ``None``,则 setgroups() 系统调用将在子进程执行之前在下级进程中进行。在 " +"*extra_groups* 中提供的字符串将通过 :func:`grp.getgrnam` 来查找并将使用 ``gr_gid`` 中的值。 " +"整数值将被原样传递。 (POSIX 专属)" + +#: ../../library/subprocess.rst:624 +msgid "" +"If *user* is not ``None``, the setreuid() system call will be made in the " +"child process prior to the execution of the subprocess. If the provided " +"value is a string, it will be looked up via :func:`pwd.getpwnam` and the " +"value in ``pw_uid`` will be used. If the value is an integer, it will be " +"passed verbatim. (POSIX only)" +msgstr "" +"如果 *user* 不为 ``None``,则 setreuid() 系统调用将在子进程执行之前 在下级进程中进行。如果所提供的值是一个字符串,将通过 " +":func:`pwd.getpwnam` 来查找它并将使用 ``pw_uid`` 中的值。如果该值是一个整数,它将被原样传递。 (POSIX 专属)" + +#: ../../library/subprocess.rst:632 +msgid "" +"Specifying *user* will not drop existing supplementary group memberships! " +"The caller must also pass ``extra_groups=()`` to reduce the group membership" +" of the child process for security purposes." +msgstr "" + +#: ../../library/subprocess.rst:639 +msgid "" +"If *umask* is not negative, the umask() system call will be made in the " +"child process prior to the execution of the subprocess." +msgstr "如果 *umask* 不为负值,则 umask() 系统调用将在子进程执行之前在下级进程中进行。" + +#: ../../library/subprocess.rst:645 +msgid "" +"If *env* is not ``None``, it must be a mapping that defines the environment " +"variables for the new process; these are used instead of the default " +"behavior of inheriting the current process' environment. This mapping can be" +" str to str on any platform or bytes to bytes on POSIX platforms much like " +":data:`os.environ` or :data:`os.environb`." +msgstr "" +"如果 *env* 不为 ``None``,则它必须是一个为新进程定义环境变量的映射;它们将顶替继承当前环境的默认行为被使用。 " +"这个映射在任何平台上均可以是字符串到字符串的映射或者在 POSIX 平台上也可以是字节串到字节串的映射,就像是 :data:`os.environ` " +"或者 :data:`os.environb`。" + +#: ../../library/subprocess.rst:653 +msgid "" +"If specified, *env* must provide any variables required for the program to " +"execute. On Windows, in order to run a `side-by-side assembly`_ the " +"specified *env* **must** include a valid ``%SystemRoot%``." +msgstr "" +"如果指定,*env* 必须提供待执行程序所需的任何变量。在 Windows 中,为了运行一个 `side-by-side assembly`_ 指定的 " +"*env* **必须** 包括一个有效的 ``%SystemRoot%``。" + +#: ../../library/subprocess.rst:659 +msgid "" +"If *encoding* or *errors* are specified, or *text* is true, the file objects" +" *stdin*, *stdout* and *stderr* are opened in text mode with the specified " +"*encoding* and *errors*, as described above in :ref:`frequently-used-" +"arguments`. The *universal_newlines* argument is equivalent to *text* and " +"is provided for backwards compatibility. By default, file objects are opened" +" in binary mode." +msgstr "" +"如果指定了 *encoding* 或 *errors*,或者如果 *text* 为真值,则文件对象 *stdin*, *stdout* 和 " +"*stderr* 将使用指定的 *encoding* 和 *errors* 以文本模式打开,就如上文 :ref:`frequently-used-" +"arguments` 中所描述的。 *universal_newlines* 参数等同于 *text* 且是出于下向兼容性考虑而提供的。 " +"在默认情况下,文件对象将以二进制模式打开。" + +#: ../../library/subprocess.rst:665 +msgid "*encoding* and *errors* were added." +msgstr "*encoding* 和 *errors* 被添加。" + +#: ../../library/subprocess.rst:668 ../../library/subprocess.rst:1342 +msgid "*text* was added as a more readable alias for *universal_newlines*." +msgstr "*text* 作为 *universal_newlines* 的一个更具可读性的别名被添加。" + +#: ../../library/subprocess.rst:671 +msgid "" +"If given, *startupinfo* will be a :class:`STARTUPINFO` object, which is " +"passed to the underlying ``CreateProcess`` function." +msgstr "" +"如果给出,*startupinfo* 将是一个 :class:`STARTUPINFO` 对象,它会被传递给下层的 ``CreateProcess`` " +"函数。" + +#: ../../library/subprocess.rst:674 +msgid "If given, *creationflags*, can be one or more of the following flags:" +msgstr "如果给出,*creationflags* 可以是下列旗标中的一个或多个:" + +#: ../../library/subprocess.rst:676 +msgid ":data:`CREATE_NEW_CONSOLE`" +msgstr ":data:`CREATE_NEW_CONSOLE`" + +#: ../../library/subprocess.rst:677 +msgid ":data:`CREATE_NEW_PROCESS_GROUP`" +msgstr ":data:`CREATE_NEW_PROCESS_GROUP`" + +#: ../../library/subprocess.rst:678 +msgid ":data:`ABOVE_NORMAL_PRIORITY_CLASS`" +msgstr ":data:`ABOVE_NORMAL_PRIORITY_CLASS`" + +#: ../../library/subprocess.rst:679 +msgid ":data:`BELOW_NORMAL_PRIORITY_CLASS`" +msgstr ":data:`BELOW_NORMAL_PRIORITY_CLASS`" + +#: ../../library/subprocess.rst:680 +msgid ":data:`HIGH_PRIORITY_CLASS`" +msgstr ":data:`HIGH_PRIORITY_CLASS`" + +#: ../../library/subprocess.rst:681 +msgid ":data:`IDLE_PRIORITY_CLASS`" +msgstr ":data:`IDLE_PRIORITY_CLASS`" + +#: ../../library/subprocess.rst:682 +msgid ":data:`NORMAL_PRIORITY_CLASS`" +msgstr ":data:`NORMAL_PRIORITY_CLASS`" + +#: ../../library/subprocess.rst:683 +msgid ":data:`REALTIME_PRIORITY_CLASS`" +msgstr ":data:`REALTIME_PRIORITY_CLASS`" + +#: ../../library/subprocess.rst:684 +msgid ":data:`CREATE_NO_WINDOW`" +msgstr ":data:`CREATE_NO_WINDOW`" + +#: ../../library/subprocess.rst:685 +msgid ":data:`DETACHED_PROCESS`" +msgstr ":data:`DETACHED_PROCESS`" + +#: ../../library/subprocess.rst:686 +msgid ":data:`CREATE_DEFAULT_ERROR_MODE`" +msgstr ":data:`CREATE_DEFAULT_ERROR_MODE`" + +#: ../../library/subprocess.rst:687 +msgid ":data:`CREATE_BREAKAWAY_FROM_JOB`" +msgstr ":data:`CREATE_BREAKAWAY_FROM_JOB`" + +#: ../../library/subprocess.rst:689 +msgid "" +"*pipesize* can be used to change the size of the pipe when :data:`PIPE` is " +"used for *stdin*, *stdout* or *stderr*. The size of the pipe is only changed" +" on platforms that support this (only Linux at this time of writing). Other " +"platforms will ignore this parameter." +msgstr "" +"当 :data:`PIPE` 被用作 *stdin*, *stdout* 或 *stderr* 时 *pipesize* 可被用于改变管道的大小。 " +"管道的大小仅会在受支持的平台上被改变(当撰写本文档时只有 Linux 支持)。其他平台将忽略此形参。" + +#: ../../library/subprocess.rst:694 +msgid "Added the *pipesize* parameter." +msgstr "增加了 *pipesize* 形参。" + +#: ../../library/subprocess.rst:697 +msgid "" +"Popen objects are supported as context managers via the :keyword:`with` " +"statement: on exit, standard file descriptors are closed, and the process is" +" waited for. ::" +msgstr "Popen 对象支持通过 :keyword:`with` 语句作为上下文管理器,在退出时关闭文件描述符并等待进程::" + +#: ../../library/subprocess.rst:701 +msgid "" +"with Popen([\"ifconfig\"], stdout=PIPE) as proc:\n" +" log.write(proc.stdout.read())" +msgstr "" +"with Popen([\"ifconfig\"], stdout=PIPE) as proc:\n" +" log.write(proc.stdout.read())" + +#: ../../library/subprocess.rst:704 ../../library/subprocess.rst:706 +msgid "" +"Popen and the other functions in this module that use it raise an " +":ref:`auditing event ` ``subprocess.Popen`` with arguments " +"``executable``, ``args``, ``cwd``, and ``env``. The value for ``args`` may " +"be a single string or a list of strings, depending on platform." +msgstr "" +"Popen 和此模块中用到它的其他函数会引发一个 :ref:`审计事件 ` ``subprocess.Popen``,附带参数 " +"``executable``, ``args``, ``cwd`` 和 ``env``。``args`` " +"的值可以是单个字符串或字符串列表,取决于具体的平台。" + +#: ../../library/subprocess.rst:711 +msgid "Added context manager support." +msgstr "添加了上下文管理器支持。" + +#: ../../library/subprocess.rst:714 +msgid "" +"Popen destructor now emits a :exc:`ResourceWarning` warning if the child " +"process is still running." +msgstr "现在,如果 Popen 析构时子进程仍然在运行,则析构器会发送一个 :exc:`ResourceWarning` 警告。" + +#: ../../library/subprocess.rst:718 +msgid "" +"Popen can use :func:`os.posix_spawn` in some cases for better performance. " +"On Windows Subsystem for Linux and QEMU User Emulation, Popen constructor " +"using :func:`os.posix_spawn` no longer raise an exception on errors like " +"missing program, but the child process fails with a non-zero " +":attr:`~Popen.returncode`." +msgstr "" +"在某些情况下 Popen 可以使用 :func:`os.posix_spawn` 以获得更好的性能。在适用于 Linux 的 Windows 子系统和 " +"QEMU 用户模拟器上,使用 :func:`os.posix_spawn` 的 Popen " +"构造器不再会因找不到程序等错误而引发异常,而是子进程失败并返回一个非零的 :attr:`~Popen.returncode`。" + +#: ../../library/subprocess.rst:727 +msgid "Exceptions" +msgstr "异常" + +#: ../../library/subprocess.rst:729 +msgid "" +"Exceptions raised in the child process, before the new program has started " +"to execute, will be re-raised in the parent." +msgstr "在子进程中抛出的异常,在新的进程开始执行前,将会被再次在父进程中抛出。" + +#: ../../library/subprocess.rst:732 +msgid "" +"The most common exception raised is :exc:`OSError`. This occurs, for " +"example, when trying to execute a non-existent file. Applications should " +"prepare for :exc:`OSError` exceptions. Note that, when ``shell=True``, " +":exc:`OSError` will be raised by the child only if the selected shell itself" +" was not found. To determine if the shell failed to find the requested " +"application, it is necessary to check the return code or output from the " +"subprocess." +msgstr "" +"被引发的最一般异常是 :exc:`OSError`。例如这会在尝试执行一个不存在的文件时发生。应用程序应当为 :exc:`OSError` " +"异常做好准备。请注意,如果 ``shell=True``,则 :exc:`OSError` 仅会在未找到选定的 shell 本身时被引发。要确定 " +"shell 是否未找到所请求的应用程序,必须检查来自子进程的返回码或输出。" + +#: ../../library/subprocess.rst:739 +msgid "" +"A :exc:`ValueError` will be raised if :class:`Popen` is called with invalid " +"arguments." +msgstr "如果 :class:`Popen` 调用时有无效的参数,则一个 :exc:`ValueError` 将被抛出。" + +#: ../../library/subprocess.rst:742 +msgid "" +":func:`check_call` and :func:`check_output` will raise " +":exc:`CalledProcessError` if the called process returns a non-zero return " +"code." +msgstr "" +":func:`check_call` 与 :func:`check_output` 在调用的进程返回非零退出码时将抛出 " +":exc:`CalledProcessError`." + +#: ../../library/subprocess.rst:746 +msgid "" +"All of the functions and methods that accept a *timeout* parameter, such as " +":func:`run` and :meth:`Popen.communicate` will raise :exc:`TimeoutExpired` " +"if the timeout expires before the process exits." +msgstr "" +"所有接受 *timeout* 形参的函数与方法,例如 :func:`run` 和 :meth:`Popen.communicate` " +"将会在进程退出前超时到期时引发 :exc:`TimeoutExpired`。" + +#: ../../library/subprocess.rst:750 +msgid "" +"Exceptions defined in this module all inherit from :exc:`SubprocessError`." +msgstr "此模块中定义的异常都继承自 :exc:`SubprocessError`。" + +#: ../../library/subprocess.rst:752 +msgid "The :exc:`SubprocessError` base class was added." +msgstr "基类 :exc:`SubprocessError` 被添加。" + +#: ../../library/subprocess.rst:758 +msgid "Security Considerations" +msgstr "安全考量" + +#: ../../library/subprocess.rst:760 +msgid "" +"Unlike some other popen functions, this library will not implicitly choose " +"to call a system shell. This means that all characters, including shell " +"metacharacters, can safely be passed to child processes. If the shell is " +"invoked explicitly, via ``shell=True``, it is the application's " +"responsibility to ensure that all whitespace and metacharacters are quoted " +"appropriately to avoid `shell injection " +"`_ " +"vulnerabilities. On :ref:`some platforms `, it is " +"possible to use :func:`shlex.quote` for this escaping." +msgstr "" +"不同于某些其他的 popen 函数,这个库将不会隐式地选择调用系统 shell。这意味着所有字符,包括 shell 元字符都可以被安全地传递给子进程。 " +"如果 shell 是通过 ``shell=True`` 被显式地唤起的,则应用程序要负责确保所有空白符和元字符被适当地转义以避免 `shell 注入 " +"`_ 安全漏洞。在 " +":ref:`某些平台 ` 上,可以使用 :func:`shlex.quote` 来执行这种转义。" + +#: ../../library/subprocess.rst:770 +msgid "" +"On Windows, batch files (:file:`*.bat` or :file:`*.cmd`) may be launched by " +"the operating system in a system shell regardless of the arguments passed to" +" this library. This could result in arguments being parsed according to " +"shell rules, but without any escaping added by Python. If you are " +"intentionally launching a batch file with arguments from untrusted sources, " +"consider passing ``shell=True`` to allow Python to escape special " +"characters. See :gh:`114539` for additional discussion." +msgstr "" +"在 Windows 上,批处理文件 (:file:`*.bat` 或 :file:`*.cmd`) 可以在系统 shell " +"中通过操作系统调用来启动而忽略传给该库的参数。这可能导致根据 shell 规则来解析参数,而没有任何 Python 添加的转义。 " +"如果你想要附带来自不受信任源的参数启动批处理文件,请考虑传入 ``shell=True`` 以允许 Python 转义特殊字符。请参阅 " +":gh:`114539` 了解相关讨论。" + +#: ../../library/subprocess.rst:780 +msgid "Popen Objects" +msgstr "Popen 对象" + +#: ../../library/subprocess.rst:782 +msgid "Instances of the :class:`Popen` class have the following methods:" +msgstr ":class:`Popen` 类的实例拥有以下方法:" + +#: ../../library/subprocess.rst:787 +msgid "" +"Check if child process has terminated. Set and return " +":attr:`~Popen.returncode` attribute. Otherwise, returns ``None``." +msgstr "检查子进程是否已被终止。设置并返回 :attr:`~Popen.returncode` 属性。否则返回 ``None``。" + +#: ../../library/subprocess.rst:793 +msgid "" +"Wait for child process to terminate. Set and return " +":attr:`~Popen.returncode` attribute." +msgstr "等待子进程被终止。设置并返回 :attr:`~Popen.returncode` 属性。" + +#: ../../library/subprocess.rst:796 +msgid "" +"If the process does not terminate after *timeout* seconds, raise a " +":exc:`TimeoutExpired` exception. It is safe to catch this exception and " +"retry the wait." +msgstr "如果进程在 *timeout* 秒后未中断,抛出一个 :exc:`TimeoutExpired` 异常,可以安全地捕获此异常并重新等待。" + +#: ../../library/subprocess.rst:802 +msgid "" +"This will deadlock when using ``stdout=PIPE`` or ``stderr=PIPE`` and the " +"child process generates enough output to a pipe such that it blocks waiting " +"for the OS pipe buffer to accept more data. Use :meth:`Popen.communicate` " +"when using pipes to avoid that." +msgstr "" +"当 ``stdout=PIPE`` 或者 ``stderr=PIPE`` 并且子进程产生了足以阻塞 OS " +"管道缓冲区接收更多数据的输出到管道时,将会发生死锁。当使用管道时用 :meth:`Popen.communicate` 来规避它。" + +#: ../../library/subprocess.rst:809 +msgid "" +"When ``timeout`` is not ``None`` and the platform supports it, an efficient " +"event-driven mechanism is used to wait for process termination:" +msgstr "" + +#: ../../library/subprocess.rst:812 +msgid "Linux >= 5.3 uses :func:`os.pidfd_open` + :func:`select.poll`" +msgstr "" + +#: ../../library/subprocess.rst:813 +msgid "" +"macOS and other BSD variants use :func:`select.kqueue` + ``KQ_FILTER_PROC`` " +"+ ``KQ_NOTE_EXIT``" +msgstr "" + +#: ../../library/subprocess.rst:815 +msgid "Windows uses ``WaitForSingleObject``" +msgstr "" + +#: ../../library/subprocess.rst:817 +msgid "" +"If none of these mechanisms are available, the function falls back to a busy" +" loop (non-blocking call and short sleeps)." +msgstr "" + +#: ../../library/subprocess.rst:822 +msgid "" +"Use the :mod:`asyncio` module for an asynchronous wait: see " +":class:`asyncio.create_subprocess_exec`." +msgstr "" + +#: ../../library/subprocess.rst:825 ../../library/subprocess.rst:877 +#: ../../library/subprocess.rst:1239 ../../library/subprocess.rst:1279 +#: ../../library/subprocess.rst:1333 +msgid "*timeout* was added." +msgstr "*timeout* 被添加" + +#: ../../library/subprocess.rst:828 +msgid "" +"if *timeout* is not ``None``, use efficient event-driven implementation on " +"Linux >= 5.3 and macOS / BSD." +msgstr "" + +#: ../../library/subprocess.rst:834 +msgid "" +"Interact with process: Send data to stdin. Read data from stdout and " +"stderr, until end-of-file is reached. Wait for process to terminate and set" +" the :attr:`~Popen.returncode` attribute. The optional *input* argument " +"should be data to be sent to the child process, or ``None``, if no data " +"should be sent to the child. If streams were opened in text mode, *input* " +"must be a string. Otherwise, it must be bytes." +msgstr "" +"与进程交互:将数据发送到 stdin。从 stdout 和 stderr 读取数据,直到抵达文件结尾。等待进程终止并设置 " +":attr:`~Popen.returncode` 属性。可选的 *input* 参数应为要发送到下级进程的数据,或者如果没有要发送到下级进程的数据则为" +" ``None``。如果流是以文本模式打开的,则 *input* 必须为字符串。 在其他情况下,它必须为字节串。" + +#: ../../library/subprocess.rst:841 +msgid "" +":meth:`communicate` returns a tuple ``(stdout_data, stderr_data)``. The data" +" will be strings if streams were opened in text mode; otherwise, bytes." +msgstr "" +":meth:`communicate` 返回一个 ``(stdout_data, stderr_data)`` " +"元组。如果文件以文本模式打开则为字符串;否则字节。" + +#: ../../library/subprocess.rst:845 +msgid "" +"Note that if you want to send data to the process's stdin, you need to " +"create the Popen object with ``stdin=PIPE``. Similarly, to get anything " +"other than ``None`` in the result tuple, you need to give ``stdout=PIPE`` " +"and/or ``stderr=PIPE`` too." +msgstr "" +"注意如果你想要向进程的 stdin 传输数据,你需要通过 ``stdin=PIPE`` 创建此 Popen 对象。类似的,要从结果元组获取任何非 " +"``None`` 值,你同样需要设置 ``stdout=PIPE`` 或者 ``stderr=PIPE``。" + +#: ../../library/subprocess.rst:850 +msgid "" +"If the process does not terminate after *timeout* seconds, a " +":exc:`TimeoutExpired` exception will be raised. Catching this exception and" +" retrying communication will not lose any output. Supplying *input* to a " +"subsequent post-timeout :meth:`communicate` call is in undefined behavior " +"and may become an error in the future." +msgstr "" +"如果进程在 *timeout* 秒后仍未终结,将会引发 :exc:`TimeoutExpired` 异常。捕获此异常并重试通信将不会丢失任何输出。将 " +"*input* 提供给后续的已超时 :meth:`communicate` 调用是未定义的行为并可能在未来导致错误。" + +#: ../../library/subprocess.rst:856 +msgid "" +"The child process is not killed if the timeout expires, so in order to " +"cleanup properly a well-behaved application should kill the child process " +"and finish communication::" +msgstr "如果超时到期,子进程不会被杀死,所以为了正确清理一个行为良好的应用程序应该杀死子进程并完成通讯。" + +#: ../../library/subprocess.rst:860 +msgid "" +"proc = subprocess.Popen(...)\n" +"try:\n" +" outs, errs = proc.communicate(timeout=15)\n" +"except TimeoutExpired:\n" +" proc.kill()\n" +" outs, errs = proc.communicate()" +msgstr "" +"proc = subprocess.Popen(...)\n" +"try:\n" +" outs, errs = proc.communicate(timeout=15)\n" +"except TimeoutExpired:\n" +" proc.kill()\n" +" outs, errs = proc.communicate()" + +#: ../../library/subprocess.rst:867 +msgid "" +"After a call to :meth:`~Popen.communicate` raises :exc:`TimeoutExpired`, do " +"not call :meth:`~Popen.wait`. Use an additional :meth:`~Popen.communicate` " +"call to finish handling pipes and populate the :attr:`~Popen.returncode` " +"attribute." +msgstr "" +"在对 :meth:`~Popen.communicate` 的调用引发 :exc:`TimeoutExpired` 之后,不要调用 " +":meth:`~Popen.wait`。请用一个额外的 :meth:`~Popen.communicate` 来结束处理管道并填充 " +":attr:`~Popen.returncode` 属性。" + +#: ../../library/subprocess.rst:874 +msgid "" +"The data read is buffered in memory, so do not use this method if the data " +"size is large or unlimited." +msgstr "内存里数据读取是缓冲的,所以如果数据尺寸过大或无限,不要使用此方法。" + +#: ../../library/subprocess.rst:883 +msgid "Sends the signal *signal* to the child." +msgstr "将信号 *signal* 发送给子进程。" + +#: ../../library/subprocess.rst:885 +msgid "Do nothing if the process completed." +msgstr "如果进程已完成则不做任何操作。" + +#: ../../library/subprocess.rst:889 +msgid "" +"On Windows, SIGTERM is an alias for :meth:`terminate`. CTRL_C_EVENT and " +"CTRL_BREAK_EVENT can be sent to processes started with a *creationflags* " +"parameter which includes ``CREATE_NEW_PROCESS_GROUP``." +msgstr "" +"在 Windows 上,SIGTERM 是 :meth:`terminate` 的别名。CTRL_C_EVENT 和 CTRL_BREAK_EVENT " +"可被发送给以包括 ``CREATE_NEW_PROCESS_GROUP`` 的 *creationflags* 形参来启动的进程。" + +#: ../../library/subprocess.rst:896 +msgid "" +"Stop the child. On POSIX OSs the method sends :py:const:`~signal.SIGTERM` to" +" the child. On Windows the Win32 API function :c:func:`!TerminateProcess` is" +" called to stop the child." +msgstr "" +"停止子进程。在 POSIX 操作系统上此方法会发送 :py:const:`~signal.SIGTERM` 给子进程。在 Windows 上则会调用 " +"Win32 API 函数 :c:func:`!TerminateProcess` 来停止子进程。" + +#: ../../library/subprocess.rst:903 +msgid "" +"Kills the child. On POSIX OSs the function sends SIGKILL to the child. On " +"Windows :meth:`kill` is an alias for :meth:`terminate`." +msgstr "" +"杀死子进程。在 POSIX 操作系统上,此函数会发送 SIGKILL 给子进程。在 Windows 上 :meth:`kill` 则是 " +":meth:`terminate` 的别名。" + +#: ../../library/subprocess.rst:907 +msgid "" +"The following attributes are also set by the class for you to access. " +"Reassigning them to new values is unsupported:" +msgstr "下列属性也会通过类来设置以供你访问。将它们重赋新值是不受支持的:" + +#: ../../library/subprocess.rst:912 +msgid "" +"The *args* argument as it was passed to :class:`Popen` -- a sequence of " +"program arguments or else a single string." +msgstr "*args* 参数传递给 :class:`Popen` -- 一个程序参数的序列或者一个简单字符串。" + +#: ../../library/subprocess.rst:919 +msgid "" +"If the *stdin* argument was :data:`PIPE`, this attribute is a writeable " +"stream object as returned by :func:`open`. If the *encoding* or *errors* " +"arguments were specified or the *text* or *universal_newlines* argument was " +"``True``, the stream is a text stream, otherwise it is a byte stream. If the" +" *stdin* argument was not :data:`PIPE`, this attribute is ``None``." +msgstr "" +"如果 *stdin* 参数为 :data:`PIPE`,此属性是一个类似 :func:`open` 所返回对象的可写流对象。如果指定了 " +"*encoding* 或 *errors* 参数或者 *text* 或 *universal_newlines* 参数为 " +"``True``,则这个流将是一个文本流,否则将是一个字节流。如果 *stdin* 参数不为 :data:`PIPE`,则此属性将为 ``None``." + +#: ../../library/subprocess.rst:928 +msgid "" +"If the *stdout* argument was :data:`PIPE`, this attribute is a readable " +"stream object as returned by :func:`open`. Reading from the stream provides " +"output from the child process. If the *encoding* or *errors* arguments were " +"specified or the *text* or *universal_newlines* argument was ``True``, the " +"stream is a text stream, otherwise it is a byte stream. If the *stdout* " +"argument was not :data:`PIPE`, this attribute is ``None``." +msgstr "" +"如果 *stdout* 参数为 :data:`PIPE`,此属性是一个类似 :func:`open` 所返回对象的可读流对象。 " +"从流中读取将会提供来自子进程的输出。如果 *encoding* 或 *errors* 参数被指定或者 *text* 或 " +"*universal_newlines* 参数为 ``True``,则这个流将是一个文本流,否则将是一个字节流。如果 *stdout* 参数不为 " +":data:`PIPE`,则此属性将为 ``None``。" + +#: ../../library/subprocess.rst:938 +msgid "" +"If the *stderr* argument was :data:`PIPE`, this attribute is a readable " +"stream object as returned by :func:`open`. Reading from the stream provides " +"error output from the child process. If the *encoding* or *errors* arguments" +" were specified or the *text* or *universal_newlines* argument was ``True``," +" the stream is a text stream, otherwise it is a byte stream. If the *stderr*" +" argument was not :data:`PIPE`, this attribute is ``None``." +msgstr "" +"如果 *stderr* 参数为 :data:`PIPE`,此属性是一个类似 :func:`open` 所返回对象的可读流对象。 " +"从流中读取将会提供来自子进程的错误输出。如果 *encoding* 或 *errors* 参数被指定或者 *text* 或 " +"*universal_newlines* 参数为 ``True``,则这个流将是一个文本流,否则将是一个字节流。如果 *stderr* 参数不为 " +":data:`PIPE`,则此属性将为 ``None``。" + +#: ../../library/subprocess.rst:947 +msgid "" +"Use :meth:`~Popen.communicate` rather than :attr:`.stdin.write " +"`, :attr:`.stdout.read ` or :attr:`.stderr.read " +"` to avoid deadlocks due to any of the other OS pipe buffers " +"filling up and blocking the child process." +msgstr "" +"使用 :meth:`~Popen.communicate` 而非 :attr:`.stdin.write `, " +":attr:`.stdout.read ` 或者 :attr:`.stderr.read ` " +"来避免由于任意其他 OS 管道缓冲区被子进程填满阻塞而导致的死锁。" + +#: ../../library/subprocess.rst:955 +msgid "The process ID of the child process." +msgstr "子进程的进程号。" + +#: ../../library/subprocess.rst:957 +msgid "" +"Note that if you set the *shell* argument to ``True``, this is the process " +"ID of the spawned shell." +msgstr "注意如果你设置了 *shell* 参数为 ``True``,则这是生成的子 shell 的进程号。" + +#: ../../library/subprocess.rst:963 +msgid "" +"The child return code. Initially ``None``, :attr:`returncode` is set by a " +"call to the :meth:`poll`, :meth:`wait`, or :meth:`communicate` methods if " +"they detect that the process has terminated." +msgstr "" +"子进程的返回码。初始为 ``None``,:attr:`returncode` 是通过在检测到进程终结时调用 :meth:`poll`, " +":meth:`wait` 或 :meth:`communicate` 等方法来设置的。" + +#: ../../library/subprocess.rst:967 +msgid "" +"A ``None`` value indicates that the process hadn't yet terminated at the " +"time of the last method call." +msgstr "``None`` 值表示在最近一次方法调用时进程尚未终结" + +#: ../../library/subprocess.rst:973 +msgid "" +"When ``shell=True``, the return code reflects the exit status of the shell " +"itself (e.g. ``/bin/sh``), which may map signals to codes such as ``128+N``." +" See the documentation of the shell (for example, the Bash manual's Exit " +"Status) for details." +msgstr "" + +#: ../../library/subprocess.rst:980 +msgid "Windows Popen Helpers" +msgstr "Windows Popen 助手" + +#: ../../library/subprocess.rst:982 +msgid "" +"The :class:`STARTUPINFO` class and following constants are only available on" +" Windows." +msgstr ":class:`STARTUPINFO` 类和以下常数仅在 Windows 有效。" + +#: ../../library/subprocess.rst:988 +msgid "" +"Partial support of the Windows `STARTUPINFO `__ structure is used for :class:`Popen` " +"creation. The following attributes can be set by passing them as keyword-" +"only arguments." +msgstr "" +"在 :class:`Popen` 创建时部分支持 Windows 的 `STARTUPINFO " +"`__ " +"结构。接下来的属性仅能通过关键词参数设置。" + +#: ../../library/subprocess.rst:993 +msgid "Keyword-only argument support was added." +msgstr "仅关键词参数支持被加入。" + +#: ../../library/subprocess.rst:998 +msgid "" +"A bit field that determines whether certain :class:`STARTUPINFO` attributes " +"are used when the process creates a window. ::" +msgstr "一个位字段,用于确定进程在创建窗口时是否使用某些 :class:`STARTUPINFO` 属性。" + +#: ../../library/subprocess.rst:1001 +msgid "" +"si = subprocess.STARTUPINFO()\n" +"si.dwFlags = subprocess.STARTF_USESTDHANDLES | subprocess.STARTF_USESHOWWINDOW" +msgstr "" +"si = subprocess.STARTUPINFO()\n" +"si.dwFlags = subprocess.STARTF_USESTDHANDLES | subprocess.STARTF_USESHOWWINDOW" + +#: ../../library/subprocess.rst:1006 +msgid "" +"If :attr:`dwFlags` specifies :data:`STARTF_USESTDHANDLES`, this attribute is" +" the standard input handle for the process. If :data:`STARTF_USESTDHANDLES` " +"is not specified, the default for standard input is the keyboard buffer." +msgstr "" +"如果 :attr:`dwFlags` 被指定为 :data:`STARTF_USESTDHANDLES`,则此属性是进程的标准输入句柄,如果 " +":data:`STARTF_USESTDHANDLES` 未指定,则默认的标准输入是键盘缓冲区。" + +#: ../../library/subprocess.rst:1013 +msgid "" +"If :attr:`dwFlags` specifies :data:`STARTF_USESTDHANDLES`, this attribute is" +" the standard output handle for the process. Otherwise, this attribute is " +"ignored and the default for standard output is the console window's buffer." +msgstr "" +"如果 :attr:`dwFlags` 被指定为 " +":data:`STARTF_USESTDHANDLES`,则此属性是进程的标准输出句柄。除此之外,此属性将被忽略并且默认标准输出是控制台窗口缓冲区。" + +#: ../../library/subprocess.rst:1020 +msgid "" +"If :attr:`dwFlags` specifies :data:`STARTF_USESTDHANDLES`, this attribute is" +" the standard error handle for the process. Otherwise, this attribute is " +"ignored and the default for standard error is the console window's buffer." +msgstr "" +"如果 :attr:`dwFlags` 被指定为 " +":data:`STARTF_USESTDHANDLES`,则此属性是进程的标准错误句柄。除此之外,此属性将被忽略并且默认标准错误为控制台窗口的缓冲区。" + +#: ../../library/subprocess.rst:1026 +msgid "" +"If :attr:`dwFlags` specifies :data:`STARTF_USESHOWWINDOW`, this attribute " +"can be any of the values that can be specified in the ``nCmdShow`` parameter" +" for the `ShowWindow `__ function, except for " +"``SW_SHOWDEFAULT``. Otherwise, this attribute is ignored." +msgstr "" +"如果 :attr:`dwFlags` 指定了 :data:`STARTF_USESHOWWINDOW`,此属性可为能被指定为 函数 " +"`ShowWindow `__ 的 nCmdShow 的形参的任意值,除了 " +"``SW_SHOWDEFAULT``。如此之外,此属性被忽略。" + +#: ../../library/subprocess.rst:1033 +msgid "" +":data:`SW_HIDE` is provided for this attribute. It is used when " +":class:`Popen` is called with ``shell=True``." +msgstr ":data:`SW_HIDE` 被提供给此属性。它在 :class:`Popen` 由 ``shell=True`` 调用时使用。" + +#: ../../library/subprocess.rst:1038 +msgid "" +"A dictionary of additional attributes for process creation as given in " +"``STARTUPINFOEX``, see `UpdateProcThreadAttribute " +"`__." +msgstr "" +"``STARTUPINFOEX`` 给出的用于进程创建的额外属性字典,参阅 `UpdateProcThreadAttribute " +"`__." + +#: ../../library/subprocess.rst:1042 +msgid "Supported attributes:" +msgstr "支持的属性:" + +#: ../../library/subprocess.rst:1044 +msgid "**handle_list**" +msgstr "**handle_list**" + +#: ../../library/subprocess.rst:1045 +msgid "" +"Sequence of handles that will be inherited. *close_fds* must be true if non-" +"empty." +msgstr "将被继承的句柄的序列。如果非空, *close_fds* 必须为 true。" + +#: ../../library/subprocess.rst:1048 +msgid "" +"The handles must be temporarily made inheritable by " +":func:`os.set_handle_inheritable` when passed to the :class:`Popen` " +"constructor, else :class:`OSError` will be raised with Windows error " +"``ERROR_INVALID_PARAMETER`` (87)." +msgstr "" +"当传递给 :class:`Popen` 构造函数时,这些句柄必须暂时地能被 :func:`os.set_handle_inheritable` " +"继承,否则 :class:`OSError` 将以 Windows error ``ERROR_INVALID_PARAMETER`` (87) 抛出。" + +#: ../../library/subprocess.rst:1055 +msgid "" +"In a multithreaded process, use caution to avoid leaking handles that are " +"marked inheritable when combining this feature with concurrent calls to " +"other process creation functions that inherit all handles such as " +":func:`os.system`. This also applies to standard handle redirection, which " +"temporarily creates inheritable handles." +msgstr "" +"在多线程进程中,请谨慎使用,以便在将此功能与对继承所有句柄的其他进程创建函数——例如 :func:`os.system` " +"的并发调用——相结合时,避免泄漏标记为可继承的句柄。这也应用于临时性创建可继承句柄的标准句柄重定向。" + +#: ../../library/subprocess.rst:1065 +msgid "Windows Constants" +msgstr "Windows 常数" + +#: ../../library/subprocess.rst:1067 +msgid "The :mod:`!subprocess` module exposes the following constants." +msgstr ":mod:`!subprocess` 模块对外暴露了下列常量。" + +#: ../../library/subprocess.rst:1071 +msgid "" +"The standard input device. Initially, this is the console input buffer, " +"``CONIN$``." +msgstr "标准输入设备,这是控制台输入缓冲区 ``CONIN$``。" + +#: ../../library/subprocess.rst:1076 +msgid "" +"The standard output device. Initially, this is the active console screen " +"buffer, ``CONOUT$``." +msgstr "标准输出设备。最初,这是活动控制台屏幕缓冲区 ``CONOUT$``。" + +#: ../../library/subprocess.rst:1081 +msgid "" +"The standard error device. Initially, this is the active console screen " +"buffer, ``CONOUT$``." +msgstr "标准错误设备。最初,这是活动控制台屏幕缓冲区 ``CONOUT$``。" + +#: ../../library/subprocess.rst:1086 +msgid "Hides the window. Another window will be activated." +msgstr "隐藏窗口。另一个窗口将被激活。" + +#: ../../library/subprocess.rst:1090 +msgid "" +"Specifies that the :attr:`STARTUPINFO.hStdInput`, " +":attr:`STARTUPINFO.hStdOutput`, and :attr:`STARTUPINFO.hStdError` attributes" +" contain additional information." +msgstr "" +"指明 :attr:`STARTUPINFO.hStdInput`, :attr:`STARTUPINFO.hStdOutput` 和 " +":attr:`STARTUPINFO.hStdError` 属性包含额外的信息。" + +#: ../../library/subprocess.rst:1096 +msgid "" +"Specifies that the :attr:`STARTUPINFO.wShowWindow` attribute contains " +"additional information." +msgstr "指明 :attr:`STARTUPINFO.wShowWindow` 属性包含额外的信息。" + +#: ../../library/subprocess.rst:1101 +msgid "" +"A :attr:`STARTUPINFO.dwFlags` parameter to specify that the *Working in " +"Background* mouse cursor will be displayed while a process is launching. " +"This is the default behavior for GUI processes." +msgstr "" +":attr:`STARTUPINFO.dwFlags` 形参指明在进程启动时将显示一个 *正在后台操作* 鼠标提示。这是 GUI 进程的默认行为。" + +#: ../../library/subprocess.rst:1110 +msgid "" +"A :attr:`STARTUPINFO.dwFlags` parameter to specify that the mouse cursor " +"will not be changed when launching a process." +msgstr ":attr:`STARTUPINFO.dwFlags` 形参指明在启动进程时鼠标提示将不会改变。" + +#: ../../library/subprocess.rst:1117 +msgid "" +"The new process has a new console, instead of inheriting its parent's " +"console (the default)." +msgstr "新的进程将有新的控制台,而不是继承父进程的(默认)控制台。" + +#: ../../library/subprocess.rst:1122 +msgid "" +"A :class:`Popen` ``creationflags`` parameter to specify that a new process " +"group will be created. This flag is necessary for using :func:`os.kill` on " +"the subprocess." +msgstr "" +"用于指明将创建一个新的进程组的 :class:`Popen` ``creationflags`` 形参。这个旗标对于在子进程上使用 " +":func:`os.kill` 来说是必须的。" + +#: ../../library/subprocess.rst:1126 +msgid "This flag is ignored if :data:`CREATE_NEW_CONSOLE` is specified." +msgstr "如果指定了 :data:`CREATE_NEW_CONSOLE` 则这个旗标会被忽略。" + +#: ../../library/subprocess.rst:1130 +msgid "" +"A :class:`Popen` ``creationflags`` parameter to specify that a new process " +"will have an above average priority." +msgstr "用于指明一个新进程将具有高于平均的优先级的 :class:`Popen` ``creationflags`` 形参。" + +#: ../../library/subprocess.rst:1137 +msgid "" +"A :class:`Popen` ``creationflags`` parameter to specify that a new process " +"will have a below average priority." +msgstr "用于指明一个新进程将具有低于平均的优先级的 :class:`Popen` ``creationflags`` 形参。" + +#: ../../library/subprocess.rst:1144 +msgid "" +"A :class:`Popen` ``creationflags`` parameter to specify that a new process " +"will have a high priority." +msgstr "用于指明一个新进程将具有高优先级的 :class:`Popen` ``creationflags`` 形参。" + +#: ../../library/subprocess.rst:1151 +msgid "" +"A :class:`Popen` ``creationflags`` parameter to specify that a new process " +"will have an idle (lowest) priority." +msgstr "用于指明一个新进程将具有空闲(最低)优先级的 :class:`Popen` ``creationflags`` 形参。" + +#: ../../library/subprocess.rst:1158 +msgid "" +"A :class:`Popen` ``creationflags`` parameter to specify that a new process " +"will have a normal priority. (default)" +msgstr "用于指明一个新进程将具有正常(默认)优先级的 :class:`Popen` ``creationflags`` 形参。" + +#: ../../library/subprocess.rst:1165 +msgid "" +"A :class:`Popen` ``creationflags`` parameter to specify that a new process " +"will have realtime priority. You should almost never use " +"REALTIME_PRIORITY_CLASS, because this interrupts system threads that manage " +"mouse input, keyboard input, and background disk flushing. This class can be" +" appropriate for applications that \"talk\" directly to hardware or that " +"perform brief tasks that should have limited interruptions." +msgstr "" +"用于指明一个新进程将具有实时优先级的 :class:`Popen` ``creationflags`` 形参。你应当几乎永远不使用 " +"REALTIME_PRIORITY_CLASS,因为这会中断管理鼠标输入、键盘输入以及后台磁盘刷新的系统线程。 " +"这个类只适用于直接与硬件“对话”,或者执行短暂任务具有受限中断的应用。" + +#: ../../library/subprocess.rst:1176 +msgid "" +"A :class:`Popen` ``creationflags`` parameter to specify that a new process " +"will not create a window." +msgstr "指明一个新进程将不会创建窗口的 :class:`Popen` ``creationflags`` 形参。" + +#: ../../library/subprocess.rst:1183 +msgid "" +"A :class:`Popen` ``creationflags`` parameter to specify that a new process " +"will not inherit its parent's console. This value cannot be used with " +"CREATE_NEW_CONSOLE." +msgstr "" +"指明一个新进程将不会继承其父控制台的 :class:`Popen` ``creationflags`` 形参。这个值不能与 " +"CREATE_NEW_CONSOLE 一同使用。" + +#: ../../library/subprocess.rst:1191 +msgid "" +"A :class:`Popen` ``creationflags`` parameter to specify that a new process " +"does not inherit the error mode of the calling process. Instead, the new " +"process gets the default error mode. This feature is particularly useful for" +" multithreaded shell applications that run with hard errors disabled." +msgstr "" +"指明一个新进程不会继承调用方进程的错误模式的 :class:`Popen` ``creationflags`` 形参。新进程会转为采用默认的错误模式。 " +"这个特性特别适用于运行时禁用硬错误的多线程 shell 应用。" + +#: ../../library/subprocess.rst:1201 +msgid "" +"A :class:`Popen` ``creationflags`` parameter to specify that a new process " +"is not associated with the job." +msgstr "指明一个新进程不会关联到任务的 :class:`Popen` ``creationflags`` 形参。" + +#: ../../library/subprocess.rst:1209 +msgid "Older high-level API" +msgstr "较旧的高阶 API" + +#: ../../library/subprocess.rst:1211 +msgid "" +"Prior to Python 3.5, these three functions comprised the high level API to " +"subprocess. You can now use :func:`run` in many cases, but lots of existing " +"code calls these functions." +msgstr "" +"在 Python 3.5 之前,这三个函数组成了 subprocess 的高阶 API。现在你可以在许多情况下使用 " +":func:`run`,但有大量现在代码仍会调用这些函数。" + +#: ../../library/subprocess.rst:1218 +msgid "" +"Run the command described by *args*. Wait for command to complete, then " +"return the :attr:`~Popen.returncode` attribute." +msgstr "运行由 *args* 所描述的命令。等待命令完成,然后返回 :attr:`~Popen.returncode` 属性。" + +#: ../../library/subprocess.rst:1221 ../../library/subprocess.rst:1261 +msgid "" +"Code needing to capture stdout or stderr should use :func:`run` instead::" +msgstr "需要捕获 stdout 或 stderr 的代码应当改用 :func:`run`::" + +#: ../../library/subprocess.rst:1223 +msgid "run(...).returncode" +msgstr "run(...).returncode" + +#: ../../library/subprocess.rst:1225 ../../library/subprocess.rst:1265 +msgid "To suppress stdout or stderr, supply a value of :data:`DEVNULL`." +msgstr "要屏蔽 stdout 或 stderr,可提供 :data:`DEVNULL` 这个值。" + +#: ../../library/subprocess.rst:1227 ../../library/subprocess.rst:1267 +msgid "" +"The arguments shown above are merely some common ones. The full function " +"signature is the same as that of the :class:`Popen` constructor - this " +"function passes all supplied arguments other than *timeout* directly through" +" to that interface." +msgstr "" +"上面显示的参数只是常见的一些。完整的函数签名与 :class:`Popen` 构造器的相同 —— 此函数会将所提供的 *timeout* " +"之外的全部参数直接传递给目标接口。" + +#: ../../library/subprocess.rst:1234 ../../library/subprocess.rst:1274 +msgid "" +"Do not use ``stdout=PIPE`` or ``stderr=PIPE`` with this function. The child" +" process will block if it generates enough output to a pipe to fill up the " +"OS pipe buffer as the pipes are not being read from." +msgstr "" +"请不要在此函数中使用 ``stdout=PIPE`` 或 ``stderr=PIPE``。如果子进程向管道生成了足以填满 OS " +"管道缓冲区的输出而管道还未被读取时它将会阻塞。" + +#: ../../library/subprocess.rst:1254 +msgid "" +"Run command with arguments. Wait for command to complete. If the return " +"code was zero then return, otherwise raise :exc:`CalledProcessError`. The " +":exc:`CalledProcessError` object will have the return code in the " +":attr:`~CalledProcessError.returncode` attribute. If :func:`check_call` was " +"unable to start the process it will propagate the exception that was raised." +msgstr "" +"附带参数运行命令。等待命令完成。如果返回码为零则正常返回,否则引发 :exc:`CalledProcessError`。 " +":exc:`CalledProcessError` 对象将在 :attr:`~CalledProcessError.returncode` " +"属性中保存返回码。如果 :func:`check_call` 无法开始进程则它将传播已被引发的异常。" + +#: ../../library/subprocess.rst:1263 +msgid "run(..., check=True)" +msgstr "run(..., check=True)" + +#: ../../library/subprocess.rst:1296 +msgid "Run command with arguments and return its output." +msgstr "附带参数运行命令并返回其输出。" + +#: ../../library/subprocess.rst:1298 +msgid "" +"If the return code was non-zero it raises a :exc:`CalledProcessError`. The " +":exc:`CalledProcessError` object will have the return code in the " +":attr:`~CalledProcessError.returncode` attribute and any output in the " +":attr:`~CalledProcessError.output` attribute." +msgstr "" +"如果返回码非零则会引发 :exc:`CalledProcessError`。 :exc:`CalledProcessError` 对象将在 " +":attr:`~CalledProcessError.returncode` 属性中保存返回码并在 " +":attr:`~CalledProcessError.output` 属性中保存所有输出。" + +#: ../../library/subprocess.rst:1303 +msgid "This is equivalent to::" +msgstr "这相当于:" + +#: ../../library/subprocess.rst:1305 +msgid "run(..., check=True, stdout=PIPE).stdout" +msgstr "run(..., check=True, stdout=PIPE).stdout" + +#: ../../library/subprocess.rst:1307 +msgid "" +"The arguments shown above are merely some common ones. The full function " +"signature is largely the same as that of :func:`run` - most arguments are " +"passed directly through to that interface. One API deviation from " +":func:`run` behavior exists: passing ``input=None`` will behave the same as " +"``input=b''`` (or ``input=''``, depending on other arguments) rather than " +"using the parent's standard input file handle." +msgstr "" +"上面显示的参数只是常见的一些。完整的函数签名与 :func:`run` 的大致相同 —— 大部分参数会通过该接口直接传递。存在一个与 " +":func:`run` 行为不同的 API 差异:传递 ``input=None`` 的行为将与 ``input=b''`` (或 " +"``input=''``,具体取决于其他参数) 一样而不是使用父对象的标准输入文件处理。" + +#: ../../library/subprocess.rst:1314 +msgid "" +"By default, this function will return the data as encoded bytes. The actual " +"encoding of the output data may depend on the command being invoked, so the " +"decoding to text will often need to be handled at the application level." +msgstr "" +"默认情况下,此函数将把数据返回为已编码的字节串。输出数据的实际编码格式将取决于唤起的命令,因此解码为文本的操作往往需要在应用程序层级上进行处理。" + +#: ../../library/subprocess.rst:1318 +msgid "" +"This behaviour may be overridden by setting *text*, *encoding*, *errors*, or" +" *universal_newlines* to ``True`` as described in :ref:`frequently-used-" +"arguments` and :func:`run`." +msgstr "" +"此行为可以通过设置 *text*, *encoding*, *errors* 或将 *universal_newlines* 设为 ``True`` " +"来重载,具体描述见 :ref:`frequently-used-arguments` 和 :func:`run`。" + +#: ../../library/subprocess.rst:1322 +msgid "" +"To also capture standard error in the result, use " +"``stderr=subprocess.STDOUT``::" +msgstr "要在结果中同时捕获标准错误,请使用 ``stderr=subprocess.STDOUT``::" + +#: ../../library/subprocess.rst:1325 +msgid "" +">>> subprocess.check_output(\n" +"... \"ls non_existent_file; exit 0\",\n" +"... stderr=subprocess.STDOUT,\n" +"... shell=True)\n" +"'ls: non_existent_file: No such file or directory\\n'" +msgstr "" +">>> subprocess.check_output(\n" +"... \"ls non_existent_file; exit 0\",\n" +"... stderr=subprocess.STDOUT,\n" +"... shell=True)\n" +"'ls: non_existent_file: No such file or directory\\n'" + +#: ../../library/subprocess.rst:1336 +msgid "Support for the *input* keyword argument was added." +msgstr "增加了对 *input* 关键字参数的支持。" + +#: ../../library/subprocess.rst:1339 +msgid "*encoding* and *errors* were added. See :func:`run` for details." +msgstr "增加了 *encoding* 和 *errors*。详情参见 :func:`run`。" + +#: ../../library/subprocess.rst:1357 +msgid "Replacing Older Functions with the :mod:`!subprocess` Module" +msgstr "使用 :mod:`!subprocess` 模块替代旧有函数" + +#: ../../library/subprocess.rst:1359 +msgid "" +"In this section, \"a becomes b\" means that b can be used as a replacement " +"for a." +msgstr "在这一节中,\"a 改为 b\" 意味着 b 可以被用作 a 的替代。" + +#: ../../library/subprocess.rst:1363 +msgid "" +"All \"a\" functions in this section fail (more or less) silently if the " +"executed program cannot be found; the \"b\" replacements raise " +":exc:`OSError` instead." +msgstr "在这一节中的所有 \"a\" 函数会在找不到被执行的程序时(差不多)静默地失败;\"b\" 替代函数则会改为引发 :exc:`OSError`。" + +#: ../../library/subprocess.rst:1367 +msgid "" +"In addition, the replacements using :func:`check_output` will fail with a " +":exc:`CalledProcessError` if the requested operation produces a non-zero " +"return code. The output is still available as the " +":attr:`~CalledProcessError.output` attribute of the raised exception." +msgstr "" +"此外,在使用 :func:`check_output` 时如果替代函数所请求的操作产生了非零返回值则将失败并引发 " +":exc:`CalledProcessError`。操作的输出仍能以所引发异常的 :attr:`~CalledProcessError.output` " +"属性的方式被访问。" + +#: ../../library/subprocess.rst:1372 +msgid "" +"In the following examples, we assume that the relevant functions have " +"already been imported from the :mod:`!subprocess` module." +msgstr "" + +#: ../../library/subprocess.rst:1377 +msgid "Replacing :program:`/bin/sh` shell command substitution" +msgstr "替代 :program:`/bin/sh` shell 命令替换" + +#: ../../library/subprocess.rst:1379 +msgid "output=$(mycmd myarg)" +msgstr "output=$(mycmd myarg)" + +#: ../../library/subprocess.rst:1383 ../../library/subprocess.rst:1394 +#: ../../library/subprocess.rst:1411 +msgid "becomes::" +msgstr "改为::" + +#: ../../library/subprocess.rst:1385 +msgid "output = check_output([\"mycmd\", \"myarg\"])" +msgstr "output = check_output([\"mycmd\", \"myarg\"])" + +#: ../../library/subprocess.rst:1388 +msgid "Replacing shell pipeline" +msgstr "替代 shell 管道" + +#: ../../library/subprocess.rst:1390 ../../library/subprocess.rst:1407 +msgid "output=$(dmesg | grep hda)" +msgstr "output=$(dmesg | grep hda)" + +#: ../../library/subprocess.rst:1396 +msgid "" +"p1 = Popen([\"dmesg\"], stdout=PIPE)\n" +"p2 = Popen([\"grep\", \"hda\"], stdin=p1.stdout, stdout=PIPE)\n" +"p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits.\n" +"output = p2.communicate()[0]" +msgstr "" +"p1 = Popen([\"dmesg\"], stdout=PIPE)\n" +"p2 = Popen([\"grep\", \"hda\"], stdin=p1.stdout, stdout=PIPE)\n" +"p1.stdout.close() # 允许 p1 在 p2 退出时接收 SIGPIPE。\n" +"output = p2.communicate()[0]" + +#: ../../library/subprocess.rst:1401 +msgid "" +"The ``p1.stdout.close()`` call after starting the p2 is important in order " +"for p1 to receive a SIGPIPE if p2 exits before p1." +msgstr "" +"启动 p2 之后再执行 ``p1.stdout.close()`` 调用很重要,这是为了让 p1 能在 p2 先于 p1 退出时接收到 SIGPIPE。" + +#: ../../library/subprocess.rst:1404 +msgid "" +"Alternatively, for trusted input, the shell's own pipeline support may still" +" be used directly:" +msgstr "另外,对于受信任的输入,shell 本身的管道支持仍然可被直接使用:" + +#: ../../library/subprocess.rst:1413 +msgid "output = check_output(\"dmesg | grep hda\", shell=True)" +msgstr "output = check_output(\"dmesg | grep hda\", shell=True)" + +#: ../../library/subprocess.rst:1417 +msgid "Replacing :func:`os.system`" +msgstr "替代 :func:`os.system`" + +#: ../../library/subprocess.rst:1421 +msgid "" +"sts = os.system(\"mycmd\" + \" myarg\")\n" +"# becomes\n" +"retcode = call(\"mycmd\" + \" myarg\", shell=True)" +msgstr "" +"sts = os.system(\"mycmd\" + \" myarg\")\n" +"# 变为\n" +"retcode = call(\"mycmd\" + \" myarg\", shell=True)" + +#: ../../library/subprocess.rst:1425 +msgid "Notes:" +msgstr "注释:" + +#: ../../library/subprocess.rst:1427 +msgid "Calling the program through the shell is usually not required." +msgstr "通过 shell 来调用程序通常是不必要的。" + +#: ../../library/subprocess.rst:1428 +msgid "" +"The :func:`call` return value is encoded differently to that of " +":func:`os.system`." +msgstr ":func:`call` 返回值的编码方式与 :func:`os.system` 的不同。" + +#: ../../library/subprocess.rst:1431 +msgid "" +"The :func:`os.system` function ignores SIGINT and SIGQUIT signals while the " +"command is running, but the caller must do this separately when using the " +":mod:`!subprocess` module." +msgstr "" + +#: ../../library/subprocess.rst:1435 +msgid "A more realistic example would look like this::" +msgstr "一个更现实的例子如下所示::" + +#: ../../library/subprocess.rst:1437 +msgid "" +"try:\n" +" retcode = call(\"mycmd\" + \" myarg\", shell=True)\n" +" if retcode < 0:\n" +" print(\"Child was terminated by signal\", -retcode, file=sys.stderr)\n" +" else:\n" +" print(\"Child returned\", retcode, file=sys.stderr)\n" +"except OSError as e:\n" +" print(\"Execution failed:\", e, file=sys.stderr)" +msgstr "" +"try:\n" +" retcode = call(\"mycmd\" + \" myarg\", shell=True)\n" +" if retcode < 0:\n" +" print(\"Child was terminated by signal\", -retcode, file=sys.stderr)\n" +" else:\n" +" print(\"Child returned\", retcode, file=sys.stderr)\n" +"except OSError as e:\n" +" print(\"Execution failed:\", e, file=sys.stderr)" + +#: ../../library/subprocess.rst:1448 +msgid "Replacing the :func:`os.spawn ` family" +msgstr "替代 :func:`os.spawn ` 函数族" + +#: ../../library/subprocess.rst:1450 +msgid "P_NOWAIT example::" +msgstr "P_NOWAIT 示例::" + +#: ../../library/subprocess.rst:1452 +msgid "" +"pid = os.spawnlp(os.P_NOWAIT, \"/bin/mycmd\", \"mycmd\", \"myarg\")\n" +"==>\n" +"pid = Popen([\"/bin/mycmd\", \"myarg\"]).pid" +msgstr "" +"pid = os.spawnlp(os.P_NOWAIT, \"/bin/mycmd\", \"mycmd\", \"myarg\")\n" +"==>\n" +"pid = Popen([\"/bin/mycmd\", \"myarg\"]).pid" + +#: ../../library/subprocess.rst:1456 +msgid "P_WAIT example::" +msgstr "P_WAIT 示例::" + +#: ../../library/subprocess.rst:1458 +msgid "" +"retcode = os.spawnlp(os.P_WAIT, \"/bin/mycmd\", \"mycmd\", \"myarg\")\n" +"==>\n" +"retcode = call([\"/bin/mycmd\", \"myarg\"])" +msgstr "" +"retcode = os.spawnlp(os.P_WAIT, \"/bin/mycmd\", \"mycmd\", \"myarg\")\n" +"==>\n" +"retcode = call([\"/bin/mycmd\", \"myarg\"])" + +#: ../../library/subprocess.rst:1462 +msgid "Vector example::" +msgstr "Vector 示例::" + +#: ../../library/subprocess.rst:1464 +msgid "" +"os.spawnvp(os.P_NOWAIT, path, args)\n" +"==>\n" +"Popen([path] + args[1:])" +msgstr "" +"os.spawnvp(os.P_NOWAIT, path, args)\n" +"==>\n" +"Popen([path] + args[1:])" + +#: ../../library/subprocess.rst:1468 +msgid "Environment example::" +msgstr "Environment 示例::" + +#: ../../library/subprocess.rst:1470 +msgid "" +"os.spawnlpe(os.P_NOWAIT, \"/bin/mycmd\", \"mycmd\", \"myarg\", env)\n" +"==>\n" +"Popen([\"/bin/mycmd\", \"myarg\"], env={\"PATH\": \"/usr/bin\"})" +msgstr "" +"os.spawnlpe(os.P_NOWAIT, \"/bin/mycmd\", \"mycmd\", \"myarg\", env)\n" +"==>\n" +"Popen([\"/bin/mycmd\", \"myarg\"], env={\"PATH\": \"/usr/bin\"})" + +#: ../../library/subprocess.rst:1477 +msgid "Replacing :func:`os.popen`" +msgstr "替代 :func:`os.popen`" + +#: ../../library/subprocess.rst:1479 +msgid "Return code handling translates as follows::" +msgstr "返回码以如下方式处理转写::" + +#: ../../library/subprocess.rst:1481 +msgid "" +"pipe = os.popen(cmd, 'w')\n" +"...\n" +"rc = pipe.close()\n" +"if rc is not None and rc >> 8:\n" +" print(\"There were some errors\")\n" +"==>\n" +"process = Popen(cmd, stdin=PIPE)\n" +"...\n" +"process.stdin.close()\n" +"if process.wait() != 0:\n" +" print(\"There were some errors\")" +msgstr "" +"pipe = os.popen(cmd, 'w')\n" +"...\n" +"rc = pipe.close()\n" +"if rc is not None and rc >> 8:\n" +" print(\"There were some errors\")\n" +"==>\n" +"process = Popen(cmd, stdin=PIPE)\n" +"...\n" +"process.stdin.close()\n" +"if process.wait() != 0:\n" +" print(\"There were some errors\")" + +#: ../../library/subprocess.rst:1495 +msgid "Legacy Shell Invocation Functions" +msgstr "旧式的 Shell 发起函数" + +#: ../../library/subprocess.rst:1497 +msgid "" +"This module also provides the following legacy functions from the 2.x " +"``commands`` module. These operations implicitly invoke the system shell and" +" none of the guarantees described above regarding security and exception " +"handling consistency are valid for these functions." +msgstr "" +"此模块还提供了以下来自 2.x ``commands`` 模块的旧版函数。这些操作会隐式地唤起系统 shell " +"并且上文所描述的有关安全与异常处理一致性保证都不适用于这些函数。" + +#: ../../library/subprocess.rst:1504 +msgid "Return ``(exitcode, output)`` of executing *cmd* in a shell." +msgstr "返回在 shell 中执行 *cmd* 产生的 ``(exitcode, output)``。" + +#: ../../library/subprocess.rst:1506 +msgid "" +"Execute the string *cmd* in a shell with :func:`check_output` and return a " +"2-tuple ``(exitcode, output)``. *encoding* and *errors* are used to decode " +"output; see the notes on :ref:`frequently-used-arguments` for more details." +msgstr "" +"在 shell 中 附带 :func:`check_output` 来执行字符串 *cmd* 并返回一个 2 元组 ``(exitcode, " +"output)``。 *encoding* 和 *errors* 将被用于对输出进行解码;请参阅 :ref:`frequently-used-" +"arguments` 中的说明来了解详情。" + +#: ../../library/subprocess.rst:1511 +msgid "" +"A trailing newline is stripped from the output. The exit code for the " +"command can be interpreted as the return code of subprocess. Example::" +msgstr "末尾的一个换行符会从输出中被去除。命令的退出码可被解读为子进程的返回码。例如::" + +#: ../../library/subprocess.rst:1515 +msgid "" +">>> subprocess.getstatusoutput('ls /bin/ls')\n" +"(0, '/bin/ls')\n" +">>> subprocess.getstatusoutput('cat /bin/junk')\n" +"(1, 'cat: /bin/junk: No such file or directory')\n" +">>> subprocess.getstatusoutput('/bin/junk')\n" +"(127, 'sh: /bin/junk: not found')\n" +">>> subprocess.getstatusoutput('/bin/kill $$')\n" +"(-15, '')" +msgstr "" +">>> subprocess.getstatusoutput('ls /bin/ls')\n" +"(0, '/bin/ls')\n" +">>> subprocess.getstatusoutput('cat /bin/junk')\n" +"(1, 'cat: /bin/junk: No such file or directory')\n" +">>> subprocess.getstatusoutput('/bin/junk')\n" +"(127, 'sh: /bin/junk: not found')\n" +">>> subprocess.getstatusoutput('/bin/kill $$')\n" +"(-15, '')" + +#: ../../library/subprocess.rst:1526 +msgid "Windows support was added." +msgstr "添加了 Windows 支持。" + +#: ../../library/subprocess.rst:1529 +msgid "" +"The function now returns (exitcode, output) instead of (status, output) as " +"it did in Python 3.3.3 and earlier. exitcode has the same value as " +":attr:`~Popen.returncode`." +msgstr "" +"此函数现在返回 (exitcode, output) 而不是像 Python 3.3.3 及更早的版本那样返回 (status, output)。 " +"exitcode 的值与 :attr:`~Popen.returncode` 相同。" + +#: ../../library/subprocess.rst:1538 +msgid "Return output (stdout and stderr) of executing *cmd* in a shell." +msgstr "返回在 shell 中执行 *cmd* 产生的输出(stdout 和 stderr)。" + +#: ../../library/subprocess.rst:1540 +msgid "" +"Like :func:`getstatusoutput`, except the exit code is ignored and the return" +" value is a string containing the command's output. Example::" +msgstr "类似于 :func:`getstatusoutput`,但退出码会被忽略并且返回值为包含命令输出的字符串。例如::" + +#: ../../library/subprocess.rst:1543 +msgid "" +">>> subprocess.getoutput('ls /bin/ls')\n" +"'/bin/ls'" +msgstr "" +">>> subprocess.getoutput('ls /bin/ls')\n" +"'/bin/ls'" + +#: ../../library/subprocess.rst:1548 +msgid "Windows support added" +msgstr "添加了 Windows 支持" + +#: ../../library/subprocess.rst:1556 +msgid "Notes" +msgstr "备注" + +#: ../../library/subprocess.rst:1561 +msgid "Timeout Behavior" +msgstr "超时行为" + +#: ../../library/subprocess.rst:1563 +msgid "" +"When using the ``timeout`` parameter in functions like :func:`run`, " +":meth:`Popen.wait`, or :meth:`Popen.communicate`, users should be aware of " +"the following behaviors:" +msgstr "" +"当在 :func:`run`、:meth:`Popen.wait` 或 :meth:`Popen.communicate` 等函数中使用 " +"``timeout`` 形参时,用户应该注意以下行为:" + +#: ../../library/subprocess.rst:1567 +msgid "" +"**Process Creation Delay**: The initial process creation itself cannot be " +"interrupted on many platform APIs. This means that even when specifying a " +"timeout, you are not guaranteed to see a timeout exception until at least " +"after however long process creation takes." +msgstr "" +"**进程创建延迟**:在许多平台 API " +"上,初始进程创建本身不能被中断。这意味着,即使指定了超时,也不能保证在创建进程之前看到超时异常,无论创建进程花了多长时间。" + +#: ../../library/subprocess.rst:1572 +msgid "" +"**Extremely Small Timeout Values**: Setting very small timeout values (such " +"as a few milliseconds) may result in almost immediate :exc:`TimeoutExpired` " +"exceptions because process creation and system scheduling inherently require" +" time." +msgstr "" +"**非常小的超时值**: 设置非常小的超时值(比如几毫秒)可能会导致几乎立即出现 :exc:`TimeoutExpired` " +"异常,因为进程创建和系统调度本身就需要时间。" + +#: ../../library/subprocess.rst:1579 +msgid "Converting an argument sequence to a string on Windows" +msgstr "在 Windows 上将参数列表转换为一个字符串" + +#: ../../library/subprocess.rst:1581 +msgid "" +"On Windows, an *args* sequence is converted to a string that can be parsed " +"using the following rules (which correspond to the rules used by the MS C " +"runtime):" +msgstr "在 Windows 上,*args* 序列会被转换为可使用以下规则来解析的字符串(对应于 MS C 运行时所使用的规则):" + +#: ../../library/subprocess.rst:1585 +msgid "" +"Arguments are delimited by white space, which is either a space or a tab." +msgstr "参数以空白符分隔,即空格符或制表符。" + +#: ../../library/subprocess.rst:1588 +msgid "" +"A string surrounded by double quotation marks is interpreted as a single " +"argument, regardless of white space contained within. A quoted string can " +"be embedded in an argument." +msgstr "用双引号标示的字符串会被解读为单个参数,而不再考虑其中的空白符。一个参数可以嵌套用引号标示的字符串。" + +#: ../../library/subprocess.rst:1593 +msgid "" +"A double quotation mark preceded by a backslash is interpreted as a literal " +"double quotation mark." +msgstr "带有一个反斜杠前缀的双引号会被解读为双引号字面值。" + +#: ../../library/subprocess.rst:1596 +msgid "" +"Backslashes are interpreted literally, unless they immediately precede a " +"double quotation mark." +msgstr "反斜杠会按字面值解读,除非它是作为双引号的前缀。" + +#: ../../library/subprocess.rst:1599 +msgid "" +"If backslashes immediately precede a double quotation mark, every pair of " +"backslashes is interpreted as a literal backslash. If the number of " +"backslashes is odd, the last backslash escapes the next double quotation " +"mark as described in rule 3." +msgstr "" +"如果反斜杠被作为双引号的前缀,则每个反斜杠对会被解读为一个反斜杠字面值。如果反斜杠数量为奇数,则最后一个反斜杠会如规则 3 " +"所描述的那样转义下一个双引号。" + +#: ../../library/subprocess.rst:1608 +msgid ":mod:`shlex`" +msgstr ":mod:`shlex`" + +#: ../../library/subprocess.rst:1609 +msgid "Module which provides function to parse and escape command lines." +msgstr "此模块提供了用于解析和转义命令行的函数。" + +#: ../../library/subprocess.rst:1615 +msgid "Disable use of ``posix_spawn()``" +msgstr "禁用 ``posix_spawn()``" + +#: ../../library/subprocess.rst:1617 +msgid "" +"On Linux, :mod:`!subprocess` defaults to using the ``vfork()`` system call " +"internally when it is safe to do so rather than ``fork()``. This greatly " +"improves performance." +msgstr "" +"在 Linux 上,:mod:`!subprocess` 默认只要能保证安全就在内部使用 ``vfork()`` 系统调用而不是 ``fork()``。" +" 这可以大幅提升性能。" + +#: ../../library/subprocess.rst:1623 +msgid "subprocess._USE_POSIX_SPAWN = False # See CPython issue gh-NNNNNN." +msgstr "subprocess._USE_POSIX_SPAWN = False # 参见 CPython 程序问题 gh-NNNNNN。" + +#: ../../library/subprocess.rst:1625 +msgid "" +"It is safe to set this to false on any Python version. It will have no " +"effect on older or newer versions where unsupported. Do not assume the " +"attribute is available to read. Despite the name, a true value does not " +"indicate the corresponding function will be used, only that it may be." +msgstr "" +"在任何 Python 版本上将其设置为 false 都是安全的。它对不受支持的旧版本或新版本没有影响。不要假设该属性可以读取。除了名称之外,true " +"值并不表示将使用相应的函数,只是表示可能会使用。" + +#: ../../library/subprocess.rst:1630 +msgid "" +"Please file issues any time you have to use these private knobs with a way " +"to reproduce the issue you were seeing. Link to that issue from a comment in" +" your code." +msgstr "当你不得不使用这些私有属性并遇到问题时请随时提交问题并附带你所看到的问题的重现方式。请从你代码中的某条注释链接到该问题。" + +#: ../../library/subprocess.rst:1634 +msgid "``_USE_POSIX_SPAWN``" +msgstr "``_USE_POSIX_SPAWN``" + +#: ../../library/subprocess.rst:293 +msgid "universal newlines" +msgstr "universal newlines -- 通用换行" + +#: ../../library/subprocess.rst:293 +msgid "subprocess module" +msgstr "subprocess 模块" diff --git a/library/sunau.po b/library/sunau.po new file mode 100644 index 0000000000..5b0a487ac6 --- /dev/null +++ b/library/sunau.po @@ -0,0 +1,43 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/sunau.rst:2 +msgid ":mod:`!sunau` --- Read and write Sun AU files" +msgstr ":mod:`!sunau` --- 读写 Sun AU 文件" + +#: ../../library/sunau.rst:10 +msgid "" +"This module is no longer part of the Python standard library. It was " +":ref:`removed in Python 3.13 ` after being deprecated in" +" Python 3.11. The removal was decided in :pep:`594`." +msgstr "" +"此模块已不再是 Python 标准库的一部分。它在 Python 3.11 中被弃用后又在 :ref:`Python 3.13 中被移除 " +"`。移除计划是在 :pep:`594` 确定的。" + +#: ../../library/sunau.rst:14 +msgid "" +"The last version of Python that provided the :mod:`!sunau` module was " +"`Python 3.12 `_." +msgstr "" +"提供 :mod:`!sunau` 模块的最后一个 Python 版本是 `Python 3.12 " +"`_." diff --git a/library/superseded.po b/library/superseded.po new file mode 100644 index 0000000000..88301ffd73 --- /dev/null +++ b/library/superseded.po @@ -0,0 +1,58 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: 99 , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/superseded.rst:5 +msgid "Superseded modules" +msgstr "" + +#: ../../library/superseded.rst:7 +msgid "" +"The modules described in this chapter have been superseded by other modules " +"for most use cases, and are retained primarily to preserve backwards " +"compatibility." +msgstr "本章介绍的模块在大部分场合下都已被其他模块所取代,它们被保留主要是为了能够向下兼容。" + +#: ../../library/superseded.rst:10 +msgid "" +"Modules may appear in this chapter because they only cover a limited subset " +"of a problem space, and a more generally applicable solution is available " +"elsewhere in the standard library (for example, :mod:`getopt` covers the " +"very specific task of \"mimic the C :c:func:`!getopt` API in Python\", " +"rather than the broader command line option parsing and argument parsing " +"capabilities offered by :mod:`optparse` and :mod:`argparse`)." +msgstr "" +"某些模块出现在本章中可能是因为它们只覆盖了某个问题空间的有限子集,而更为普遍应用的解决方案存在于标准库的其他地方 (例如,:mod:`getopt` " +"覆盖了非常特定的 \"在 Python 中模拟 C :c:func:`!getopt` API\" 任务,而不是如 :mod:`optparse` 和 " +":mod:`argparse` 所提供的更为宽泛的命令行选项解析和参数解析功能)。" + +#: ../../library/superseded.rst:17 +msgid "" +"Alternatively, modules may appear in this chapter because they are " +"deprecated outright, and awaiting removal in a future release, or they are " +":term:`soft deprecated` and their use is actively discouraged in new " +"projects. With the removal of various obsolete modules through :pep:`594`, " +"there are currently no modules in this latter category." +msgstr "" +"另外,某些模块出现在本章中也可能是因为它们已被弃用,并将在未来的发布版中被移除,或者它们已被 :term:`soft deprecated` " +"并且不再鼓励在新项目中使用。随着多个过时模块根据 :pep:`594` 被移除,目前已不存在属于此类情况的模块。" diff --git a/library/symtable.po b/library/symtable.po new file mode 100644 index 0000000000..e58eb7279f --- /dev/null +++ b/library/symtable.po @@ -0,0 +1,476 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: 99 , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/symtable.rst:2 +msgid ":mod:`!symtable` --- Access to the compiler's symbol tables" +msgstr ":mod:`!symtable` --- 访问编译器的符号表" + +#: ../../library/symtable.rst:7 +msgid "**Source code:** :source:`Lib/symtable.py`" +msgstr "**源代码:** :source:`Lib/symtable.py`" + +#: ../../library/symtable.rst:11 +msgid "" +"Symbol tables are generated by the compiler from AST just before bytecode is" +" generated. The symbol table is responsible for calculating the scope of " +"every identifier in the code. :mod:`!symtable` provides an interface to " +"examine these tables." +msgstr "" +"符号表由编译器在生成字节码之前根据 AST 生成。符号表负责计算代码中每个标识符的作用域。 :mod:`!symtable` " +"提供了检查这些符号表的接口。" + +#: ../../library/symtable.rst:18 +msgid "Generating Symbol Tables" +msgstr "符号表的生成" + +#: ../../library/symtable.rst:22 +msgid "" +"Return the toplevel :class:`SymbolTable` for the Python source *code*. " +"*filename* is the name of the file containing the code. *compile_type* is " +"like the *mode* argument to :func:`compile`. The optional argument *module* " +"specifies the module name. It is needed to unambiguous :ref:`filter " +"` syntax warnings by module name." +msgstr "" + +#: ../../library/symtable.rst:29 +msgid "Added the *module* parameter." +msgstr "" + +#: ../../library/symtable.rst:34 +msgid "Examining Symbol Tables" +msgstr "符号表的查看" + +#: ../../library/symtable.rst:38 +msgid "An enumeration indicating the type of a :class:`SymbolTable` object." +msgstr "一个指明 :class:`SymbolTable` 对象的类型的枚举。" + +#: ../../library/symtable.rst:43 +msgid "Used for the symbol table of a module." +msgstr "用于模块的符号表。" + +#: ../../library/symtable.rst:48 +msgid "Used for the symbol table of a function." +msgstr "用于函数的符号表。" + +#: ../../library/symtable.rst:53 +msgid "Used for the symbol table of a class." +msgstr "用于类的符号表。" + +#: ../../library/symtable.rst:55 +msgid "" +"The following members refer to different flavors of :ref:`annotation scopes " +"`." +msgstr "以下成员指向不同风格的 :ref:`标注作用域 `。" + +#: ../../library/symtable.rst:61 +msgid "" +"Used for annotations if ``from __future__ import annotations`` is active." +msgstr "当 ``from __future__ import annotations`` 被激活时用于标注。" + +#: ../../library/symtable.rst:66 +msgid "Used for the symbol table of :keyword:`type` constructions." +msgstr "用于 :keyword:`type` 构造的符号表。" + +#: ../../library/symtable.rst:71 +msgid "" +"Used for the symbol table of :ref:`generic functions ` or" +" :ref:`generic classes `." +msgstr "" +"用于 :ref:`泛型函数 ` 或 :ref:`泛型类 ` 的符号表。" + +#: ../../library/symtable.rst:77 +msgid "" +"Used for the symbol table of the bound, the constraint tuple or the default " +"value of a single type variable in the formal sense, i.e., a TypeVar, a " +"TypeVarTuple or a ParamSpec object (the latter two do not support a bound or" +" a constraint tuple)." +msgstr "" +"用于正式意义下单个类型变量的绑定、约束元组或默认值的符号表,即 TypeVar、TypeVarTuple 或 ParamSpec " +"对象(后两者不支持绑定或约束元组)。" + +#: ../../library/symtable.rst:86 +msgid "A namespace table for a block. The constructor is not public." +msgstr "某个代码块的命名空间表。构造函数不公开。" + +#: ../../library/symtable.rst:90 +msgid "" +"Return the type of the symbol table. Possible values are members of the " +":class:`SymbolTableType` enumeration." +msgstr "返回符号表的类型。可能的值为 :class:`SymbolTableType` 枚举的成员。" + +#: ../../library/symtable.rst:93 +msgid "" +"Added ``'annotation'``, ``'TypeVar bound'``, ``'type alias'``, and ``'type " +"parameter'`` as possible return values." +msgstr "" +"增加 ``'annotation'``, ``'TypeVar bound'``, ``'type alias'`` 和 ``'type " +"parameter'`` 作为可能的返回值。" + +#: ../../library/symtable.rst:97 +msgid "Return values are members of the :class:`SymbolTableType` enumeration." +msgstr "返回值为 :class:`SymbolTableType` 枚举的成员。" + +#: ../../library/symtable.rst:100 +msgid "" +"The exact values of the returned string may change in the future, and thus, " +"it is recommended to use :class:`SymbolTableType` members instead of hard-" +"coded strings." +msgstr "返回字符串的实际值可能在未来发生变化,因此,建议使用 :class:`SymbolTableType` 成员而不是硬编码的字符串。" + +#: ../../library/symtable.rst:106 +msgid "Return the table's identifier." +msgstr "返回符号表的标识符" + +#: ../../library/symtable.rst:110 +msgid "" +"Return the table's name. This is the name of the class if the table is for " +"a class, the name of the function if the table is for a function, or " +"``'top'`` if the table is global (:meth:`get_type` returns ``'module'``). " +"For type parameter scopes (which are used for generic classes, functions, " +"and type aliases), it is the name of the underlying class, function, or type" +" alias. For type alias scopes, it is the name of the type alias. For " +":class:`~typing.TypeVar` bound scopes, it is the name of the ``TypeVar``." +msgstr "" +"返回表名称。如果表是针对类的则为类名;如果是针对函数的则为函数名;或者如果表是全局的 (:meth:`get_type` 返回 " +"``'module'``) 则为 ``'top'``。对于类型形参作用域 " +"(用于泛型类、函数和类型别名),它将为底层类、函数或类型别名的名称。对于类型别名作用域,它将为类型别名的名称。对于 " +":class:`~typing.TypeVar` 绑定作用域,它将为 ``TypeVar`` 的名称。" + +#: ../../library/symtable.rst:120 +msgid "" +"Return the number of the first line in the block this table represents." +msgstr "返回符号表所代表代码块的第一行编号。" + +#: ../../library/symtable.rst:124 +msgid "Return ``True`` if the locals in this table can be optimized." +msgstr "如果符号表中的局部变量可能被优化过,则返回 ``True``。" + +#: ../../library/symtable.rst:128 +msgid "Return ``True`` if the block is a nested class or function." +msgstr "如果代码块是嵌套类或函数,则返回 ``True``。" + +#: ../../library/symtable.rst:132 +msgid "" +"Return ``True`` if the block has nested namespaces within it. These can be " +"obtained with :meth:`get_children`." +msgstr "如果代码块中有嵌套的命名空间,则返回 ``True``。可通过 :meth:`get_children` 读取。" + +#: ../../library/symtable.rst:137 +msgid "" +"Return a view object containing the names of symbols in the table. See the " +":ref:`documentation of view objects `." +msgstr "返回一个包含表中符号名称的视图对象。参见 :ref:`视图对象文档 `。" + +#: ../../library/symtable.rst:142 +msgid "Lookup *name* in the table and return a :class:`Symbol` instance." +msgstr "在符号表中查找 *name* 并返回一个 :class:`Symbol` 实例。" + +#: ../../library/symtable.rst:146 +msgid "Return a list of :class:`Symbol` instances for names in the table." +msgstr "返回符号表中所有符号的 :class:`Symbol` 实例的列表。" + +#: ../../library/symtable.rst:150 +msgid "Return a list of the nested symbol tables." +msgstr "返回嵌套符号表的列表。" + +#: ../../library/symtable.rst:155 +msgid "" +"A namespace for a function or method. This class inherits from " +":class:`SymbolTable`." +msgstr "函数或方法的命名空间。该类继承自 :class:`SymbolTable`。" + +#: ../../library/symtable.rst:160 +msgid "Return a tuple containing names of parameters to this function." +msgstr "返回由函数的参数名组成的元组。" + +#: ../../library/symtable.rst:164 +msgid "Return a tuple containing names of locals in this function." +msgstr "返回函数中局部变量名组成的元组。" + +#: ../../library/symtable.rst:168 +msgid "Return a tuple containing names of globals in this function." +msgstr "返回函数中全局变量名组成的元组。" + +#: ../../library/symtable.rst:172 +msgid "" +"Return a tuple containing names of explicitly declared nonlocals in this " +"function." +msgstr "返回一个包含在此函数中显式声明的非局部变量名称的元组。" + +#: ../../library/symtable.rst:176 +msgid "" +"Return a tuple containing names of :term:`free (closure) variables ` in this function." +msgstr "返回一个包含在此函数中的 :term:`自由(闭包)变量 ` 名称的元组。" + +#: ../../library/symtable.rst:181 +msgid "" +"Return a tuple containing names of :term:`cell variables `" +" in this table." +msgstr "" + +#: ../../library/symtable.rst:188 +msgid "" +"A namespace of a class. This class inherits from :class:`SymbolTable`." +msgstr "类的命名空间。该类继承自 :class:`SymbolTable`。" + +#: ../../library/symtable.rst:192 +msgid "" +"Return a tuple containing the names of method-like functions declared in the" +" class." +msgstr "返回一个包含类中声明的方法型函数的名称的元组。" + +#: ../../library/symtable.rst:195 +msgid "" +"Here, the term 'method' designates *any* function defined in the class body " +"via :keyword:`def` or :keyword:`async def`." +msgstr "" +"在这里,术语 '方法' 是指 *任何* 在 class 语句体中通过 :keyword:`def` 或 :keyword:`async def` " +"定义的函数。" + +#: ../../library/symtable.rst:198 +msgid "" +"Functions defined in a deeper scope (e.g., in an inner class) are not picked" +" up by :meth:`get_methods`." +msgstr "在更深的作用域(例如内部类)中定义的函数不会被 :meth:`get_methods` 所获取。" + +#: ../../library/symtable.rst:201 +msgid "For example:" +msgstr "例如:" + +#: ../../library/symtable.rst:214 +msgid "" +">>> import symtable\n" +">>> st = symtable.symtable('''\n" +"... def outer(): pass\n" +"...\n" +"... class A:\n" +"... def f():\n" +"... def w(): pass\n" +"...\n" +"... def g(self): pass\n" +"...\n" +"... @classmethod\n" +"... async def h(cls): pass\n" +"...\n" +"... global outer\n" +"... def outer(self): pass\n" +"... ''', 'test', 'exec')\n" +">>> class_A = st.get_children()[2]\n" +">>> class_A.get_methods()\n" +"('f', 'g', 'h')" +msgstr "" +">>> import symtable\n" +">>> st = symtable.symtable('''\n" +"... def outer(): pass\n" +"...\n" +"... class A:\n" +"... def f():\n" +"... def w(): pass\n" +"...\n" +"... def g(self): pass\n" +"...\n" +"... @classmethod\n" +"... async def h(cls): pass\n" +"...\n" +"... global outer\n" +"... def outer(self): pass\n" +"... ''', 'test', 'exec')\n" +">>> class_A = st.get_children()[2]\n" +">>> class_A.get_methods()\n" +"('f', 'g', 'h')" + +#: ../../library/symtable.rst:236 +msgid "" +"Although ``A().f()`` raises :exc:`TypeError` at runtime, ``A.f`` is still " +"considered as a method-like function." +msgstr "虽然 ``A().f()`` 在运行时会引发 :exc:`TypeError`,但 ``A.f`` 仍然被视为是方法型函数。" + +#: ../../library/symtable.rst:244 +msgid "" +"An entry in a :class:`SymbolTable` corresponding to an identifier in the " +"source. The constructor is not public." +msgstr ":class:`SymbolTable` 中的数据项,对应于源码中的某个标识符。构造函数不公开。" + +#: ../../library/symtable.rst:249 +msgid "Return the symbol's name." +msgstr "返回符号名" + +#: ../../library/symtable.rst:253 +msgid "Return ``True`` if the symbol is used in its block." +msgstr "如果符号在代码块中被引用了,则返回 ``True``。" + +#: ../../library/symtable.rst:257 +msgid "Return ``True`` if the symbol is created from an import statement." +msgstr "如果符号是由导入语句创建的,则返回 ``True``。" + +#: ../../library/symtable.rst:261 +msgid "Return ``True`` if the symbol is a parameter." +msgstr "如果符号是参数,返回 ``True``。" + +#: ../../library/symtable.rst:265 +msgid "Return ``True`` if the symbol is a type parameter." +msgstr "如果符号是一个类型形参则返回 ``True``。" + +#: ../../library/symtable.rst:271 +msgid "Return ``True`` if the symbol is global." +msgstr "如果符号是全局变量,则返回 ``True``。" + +#: ../../library/symtable.rst:275 +msgid "Return ``True`` if the symbol is nonlocal." +msgstr "如果符号为非局部变量,则返回 ``True``。" + +#: ../../library/symtable.rst:279 +msgid "" +"Return ``True`` if the symbol is declared global with a global statement." +msgstr "如果符号用 global 声明为全局变量,则返回 ``True``。" + +#: ../../library/symtable.rst:283 +msgid "Return ``True`` if the symbol is local to its block." +msgstr "如果符号是代码块内的局部变量,则返回 ``True``。" + +#: ../../library/symtable.rst:287 +msgid "Return ``True`` if the symbol is annotated." +msgstr "如果符号带有注解,则返回 ``True``。" + +#: ../../library/symtable.rst:293 +msgid "" +"Return ``True`` if the symbol is referenced in its block, but not assigned " +"to." +msgstr "如果符号在代码块中被引用,但未赋值,则返回 ``True``。" + +#: ../../library/symtable.rst:298 +msgid "" +"Return ``True`` if the symbol is referenced but not assigned in a nested " +"block." +msgstr "" + +#: ../../library/symtable.rst:304 +msgid "" +"Return *True* if a class-scoped symbol is free from the perspective of a " +"method." +msgstr "如果类级作用域的符号对于一个方法来说是自由的则返回 *True*。" + +#: ../../library/symtable.rst:307 +msgid "Consider the following example::" +msgstr "比如下面的例子::" + +#: ../../library/symtable.rst:309 +msgid "" +"def f():\n" +" x = 1 # function-scoped\n" +" class C:\n" +" x = 2 # class-scoped\n" +" def method(self):\n" +" return x" +msgstr "" +"def f():\n" +" x = 1 # 函数级作用域\n" +" class C:\n" +" x = 2 # 类级作用域\n" +" def method(self):\n" +" return x" + +#: ../../library/symtable.rst:316 +msgid "" +"In this example, the class-scoped symbol ``x`` is considered to be free from" +" the perspective of ``C.method``, thereby allowing the latter to return *1* " +"at runtime and not *2*." +msgstr "" +"在这个示例中,类级作用域的符号 ``x`` 从 ``C.method`` 的视角来说是自由的,因此允许后者在运行时返回 *1* 而不是 *2*。" + +#: ../../library/symtable.rst:324 +msgid "Return ``True`` if the symbol is assigned to in its block." +msgstr "如果符号在代码块中赋值,则返回 ``True``。" + +#: ../../library/symtable.rst:328 +msgid "Return ``True`` if the symbol is a comprehension iteration variable." +msgstr "如果符号是一个推导式的迭代变量则返回 ``True``。" + +#: ../../library/symtable.rst:334 +msgid "Return ``True`` if the symbol is a cell in an inlined comprehension." +msgstr "如果符号是一个内联推导式中的单元则返回 ``True``。" + +#: ../../library/symtable.rst:340 +msgid "Return ``True`` if name binding introduces new namespace." +msgstr "如果符号名绑定引入了新的命名空间,则返回 ``True``。" + +#: ../../library/symtable.rst:342 +msgid "" +"If the name is used as the target of a function or class statement, this " +"will be true." +msgstr "如果符号名用于函数或类定义语句,则为 True。" + +#: ../../library/symtable.rst:345 +msgid "For example::" +msgstr "例如:" + +#: ../../library/symtable.rst:347 +msgid "" +">>> table = symtable.symtable(\"def some_func(): pass\", \"string\", \"exec\")\n" +">>> table.lookup(\"some_func\").is_namespace()\n" +"True" +msgstr "" +">>> table = symtable.symtable(\"def some_func(): pass\", \"string\", \"exec\")\n" +">>> table.lookup(\"some_func\").is_namespace()\n" +"True" + +#: ../../library/symtable.rst:351 +msgid "" +"Note that a single name can be bound to multiple objects. If the result is " +"``True``, the name may also be bound to other objects, like an int or list, " +"that does not introduce a new namespace." +msgstr "" +"注意,一个符号名可以与多个对象绑定。如果结果为 ``True``,则该符号名还可以绑定到其他对象上,比如 int 或 list " +",且不会引入新的命名空间。" + +#: ../../library/symtable.rst:357 +msgid "Return a list of namespaces bound to this name." +msgstr "返回与符号名绑定的命名空间的列表。" + +#: ../../library/symtable.rst:361 +msgid "" +"Return the namespace bound to this name. If more than one or no namespace is" +" bound to this name, a :exc:`ValueError` is raised." +msgstr "返回绑定到这个名称的命名空间。如果有多个命名空间或没有命名空间被绑定到这个名称,则会引发 :exc:`ValueError`。" + +#: ../../library/symtable.rst:368 +msgid "Command-Line Usage" +msgstr "命令行用法" + +#: ../../library/symtable.rst:372 +msgid "" +"The :mod:`!symtable` module can be executed as a script from the command " +"line." +msgstr ":mod:`!symtable` 模块可以作为脚本从命令行执行。" + +#: ../../library/symtable.rst:374 +msgid "python -m symtable [infile...]" +msgstr "python -m symtable [infile...]" + +#: ../../library/symtable.rst:378 +msgid "" +"Symbol tables are generated for the specified Python source files and dumped" +" to stdout. If no input file is specified, the content is read from stdin." +msgstr "符号表将针对指定的 Python 文件生成并转储至 stdout。如果未指定输入文件,将从 stdin 读取内容。" diff --git a/library/sys.monitoring.po b/library/sys.monitoring.po new file mode 100644 index 0000000000..25cc3f85f9 --- /dev/null +++ b/library/sys.monitoring.po @@ -0,0 +1,733 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/sys.monitoring.rst:2 +msgid ":mod:`!sys.monitoring` --- Execution event monitoring" +msgstr ":mod:`!sys.monitoring` --- 执行事件监测" + +#: ../../library/sys.monitoring.rst:13 +msgid "" +":mod:`!sys.monitoring` is a namespace within the :mod:`sys` module, not an " +"independent module, and ``import sys.monitoring`` would fail with a " +":exc:`ModuleNotFoundError`. Instead, simply ``import sys`` and then use " +"``sys.monitoring``." +msgstr "" +":mod:`!sys.monitoring` 是 :mod:`sys` 模块内的一个命名空间,而非独立的模块,且 ``import " +"sys.monitoring`` 将失败并引发 :exc:`ModuleNotFoundError`。 实际上,只需简单地 ``import sys``" +" 然后使用 ``sys.monitoring``。" + +#: ../../library/sys.monitoring.rst:19 +msgid "" +"This namespace provides access to the functions and constants necessary to " +"activate and control event monitoring." +msgstr "这个命名空间提供了对于激活和控制事件监控所需的函数和常量的访问。" + +#: ../../library/sys.monitoring.rst:22 +msgid "" +"As programs execute, events occur that might be of interest to tools that " +"monitor execution. The :mod:`!sys.monitoring` namespace provides means to " +"receive callbacks when events of interest occur." +msgstr "" +"当程序执行时,会发生执行监控工具可能感兴趣的事件。 :mod:`!sys.monitoring` 命名空间提供了在感兴趣的事件发生时接收回调的途径。" + +#: ../../library/sys.monitoring.rst:26 +msgid "The monitoring API consists of three components:" +msgstr "monitoring API 由三个部分组成:" + +#: ../../library/sys.monitoring.rst:28 +msgid "`Tool identifiers`_" +msgstr "`Tool identifiers`_" + +#: ../../library/sys.monitoring.rst:29 +msgid "`Events`_" +msgstr "`Events`_" + +#: ../../library/sys.monitoring.rst:30 +msgid ":ref:`Callbacks `" +msgstr ":ref:`回调 `" + +#: ../../library/sys.monitoring.rst:33 +msgid "Tool identifiers" +msgstr "工具标识符" + +#: ../../library/sys.monitoring.rst:35 +msgid "" +"A tool identifier is an integer and the associated name. Tool identifiers " +"are used to discourage tools from interfering with each other and to allow " +"multiple tools to operate at the same time. Currently tools are completely " +"independent and cannot be used to monitor each other. This restriction may " +"be lifted in the future." +msgstr "" +"工具标识符是一个整数及其所关联的名称。工具标识符被用来防止工具之间的相互干扰并允许同时操作多个工具。目前工具是完全独立的且不能被用于相互监控。 " +"这一限制在将来可能会被取消。" + +#: ../../library/sys.monitoring.rst:41 +msgid "" +"Before registering or activating events, a tool should choose an identifier." +" Identifiers are integers in the range 0 to 5 inclusive." +msgstr "在注册或激活事件之前,工具应选择一个标识符。标识符是 0 到 5 的闭区间内的整数。" + +#: ../../library/sys.monitoring.rst:45 +msgid "Registering and using tools" +msgstr "注册和使用工具" + +#: ../../library/sys.monitoring.rst:49 +msgid "" +"Must be called before *tool_id* can be used. *tool_id* must be in the range " +"0 to 5 inclusive. Raises a :exc:`ValueError` if *tool_id* is in use." +msgstr "" +"必须在 *tool_id* 可被使用之前调用。 *tool_id* 必须在 0 到 5 的闭区间内。如果 *tool_id* 已被使用则会引发 " +":exc:`ValueError`." + +#: ../../library/sys.monitoring.rst:55 +msgid "" +"Unregister all events and callback functions associated with *tool_id*." +msgstr "注销与 *tool_id* 相关联的所有事件和回调函数。" + +#: ../../library/sys.monitoring.rst:59 +msgid "" +"Should be called once a tool no longer requires *tool_id*. Will call " +":func:`clear_tool_id` before releasing *tool_id*." +msgstr "应该在工具不再需要 *tool_id* 时调用。在释放 *tool_id* 之前将调用 :func:`clear_tool_id`。" + +#: ../../library/sys.monitoring.rst:64 +msgid "" +"Returns the name of the tool if *tool_id* is in use, otherwise it returns " +"``None``. *tool_id* must be in the range 0 to 5 inclusive." +msgstr "如果 *tool_id* 已被使用则返回工具名称,否则返回 ``None``。 *tool_id* 取值必须在 0 至 5 的闭区间内。" + +#: ../../library/sys.monitoring.rst:68 +msgid "" +"All IDs are treated the same by the VM with regard to events, but the " +"following IDs are pre-defined to make co-operation of tools easier::" +msgstr "虚拟机在处理事件时对所有 ID 都一视同仁,但为便于工具之间的协作而预定义了下列 ID::" + +#: ../../library/sys.monitoring.rst:71 +msgid "" +"sys.monitoring.DEBUGGER_ID = 0\n" +"sys.monitoring.COVERAGE_ID = 1\n" +"sys.monitoring.PROFILER_ID = 2\n" +"sys.monitoring.OPTIMIZER_ID = 5" +msgstr "" +"sys.monitoring.DEBUGGER_ID = 0\n" +"sys.monitoring.COVERAGE_ID = 1\n" +"sys.monitoring.PROFILER_ID = 2\n" +"sys.monitoring.OPTIMIZER_ID = 5" + +#: ../../library/sys.monitoring.rst:78 +msgid "Events" +msgstr "事件" + +#: ../../library/sys.monitoring.rst:80 +msgid "The following events are supported:" +msgstr "以下事件是受支持的:" + +#: ../../library/sys.monitoring.rst:84 +msgid "A conditional branch goes left." +msgstr "条件分支向左。" + +#: ../../library/sys.monitoring.rst:86 +msgid "" +"It is up to the tool to determine how to present \"left\" and \"right\" " +"branches. There is no guarantee which branch is \"left\" and which is " +"\"right\", except that it will be consistent for the duration of the " +"program." +msgstr "由该工具决定如何表示“左”和“右”分支。不能保证哪个分支是“左”哪个分支是“右”,除非它在程序的持续时间内是一致的。" + +#: ../../library/sys.monitoring.rst:92 +msgid "A conditional branch goes right." +msgstr "条件分支向右。" + +#: ../../library/sys.monitoring.rst:96 +msgid "A call in Python code (event occurs before the call)." +msgstr "Python 代码中的调用(事件发生在调用之前)。" + +#: ../../library/sys.monitoring.rst:100 +msgid "" +"An exception raised from any callable, except for Python functions (event " +"occurs after the exit)." +msgstr "从任意可调用对象引发的异常。Python 函数除外(事件发生在退出之后)。" + +#: ../../library/sys.monitoring.rst:104 +msgid "" +"Return from any callable, except for Python functions (event occurs after " +"the return)." +msgstr "从任意可调用对象返回,Python 函数除外(事件在返回之后发生)。" + +#: ../../library/sys.monitoring.rst:108 +msgid "An exception is handled." +msgstr "一个异常被处理。" + +#: ../../library/sys.monitoring.rst:112 +msgid "A VM instruction is about to be executed." +msgstr "一个 VM 指令即将被执行。" + +#: ../../library/sys.monitoring.rst:116 +msgid "An unconditional jump in the control flow graph is made." +msgstr "在控制流图中进行一次无条件的跳转。" + +#: ../../library/sys.monitoring.rst:120 +msgid "" +"An instruction is about to be executed that has a different line number from" +" the preceding instruction." +msgstr "一条与之前指令行号不同的指令即将被执行。" + +#: ../../library/sys.monitoring.rst:124 +msgid "" +"Resumption of a Python function (for generator and coroutine functions), " +"except for ``throw()`` calls." +msgstr "恢复执行一个 Python 函数(用于生成器和协程函数),``throw()`` 调用除外。" + +#: ../../library/sys.monitoring.rst:128 +msgid "" +"Return from a Python function (occurs immediately before the return, the " +"callee's frame will be on the stack)." +msgstr "从一个 Python 函数返回(在返回之前立即发生,被调用方的帧将在栈中)。" + +#: ../../library/sys.monitoring.rst:132 +msgid "" +"Start of a Python function (occurs immediately after the call, the callee's " +"frame will be on the stack)" +msgstr "开始一个 Python 函数(在调用之后立即发生,被调用方的帧将在栈中)" + +#: ../../library/sys.monitoring.rst:136 +msgid "A Python function is resumed by a ``throw()`` call." +msgstr "一个 Python 函数由 ``throw()`` 调用恢复执行。" + +#: ../../library/sys.monitoring.rst:140 +msgid "" +"Exit from a Python function during exception unwinding. This includes " +"exceptions raised directly within the function and that are allowed to " +"continue to propagate." +msgstr "在异常展开期间从一个 Python 函数退出。这包括在该函数内直接引发的以及被允许继续传播的异常。" + +#: ../../library/sys.monitoring.rst:145 +msgid "" +"Yield from a Python function (occurs immediately before the yield, the " +"callee's frame will be on the stack)." +msgstr "从一个 Python 函数产出数据(在产出之前立即发生,被调用方的帧将在栈中)。" + +#: ../../library/sys.monitoring.rst:149 +msgid "" +"An exception is raised, except those that cause a :monitoring-" +"event:`STOP_ITERATION` event." +msgstr "一个异常被引发,导致 :monitoring-event:`STOP_ITERATION` 事件的异常除外。" + +#: ../../library/sys.monitoring.rst:153 +msgid "" +"An exception is re-raised, for example at the end of a :keyword:`finally` " +"block." +msgstr "一个异常被重新引发,例如在 :keyword:`finally` 代码块结束的时候。" + +#: ../../library/sys.monitoring.rst:157 +msgid "" +"An artificial :exc:`StopIteration` is raised; see `the STOP_ITERATION " +"event`_." +msgstr "一个 :exc:`StopIteration` 被人工引发;参见 `the STOP_ITERATION event`_。" + +#: ../../library/sys.monitoring.rst:160 +msgid "More events may be added in the future." +msgstr "将来可能会添加更多事件。" + +#: ../../library/sys.monitoring.rst:162 +msgid "" +"These events are attributes of the :mod:`!sys.monitoring.events` namespace. " +"Each event is represented as a power-of-2 integer constant. To define a set " +"of events, simply bitwise OR the individual events together. For example, to" +" specify both :monitoring-event:`PY_RETURN` and :monitoring-event:`PY_START`" +" events, use the expression ``PY_RETURN | PY_START``." +msgstr "" +"这些事件都是 :mod:`!sys.monitoring.events` 命名空间的属性。每个事件用整数常量的 2 次幂来表示。 " +"要定义一组事件,只需对多个单独事件执行按位或运算即可。例如,要同时指定 :monitoring-event:`PY_RETURN` 和 " +":monitoring-event:`PY_START` 事件,则使用表达式 ``PY_RETURN | PY_START``。" + +#: ../../library/sys.monitoring.rst:170 +msgid "An alias for ``0`` so users can do explicit comparisons like::" +msgstr "代表 ``0`` 的别名以便用户可以这样执行显式比较::" + +#: ../../library/sys.monitoring.rst:172 +msgid "" +"if get_events(DEBUGGER_ID) == NO_EVENTS:\n" +" ..." +msgstr "" +"if get_events(DEBUGGER_ID) == NO_EVENTS:\n" +" ..." + +#: ../../library/sys.monitoring.rst:175 +msgid "Setting this event deactivates all events." +msgstr "设置此事件将撤销所有事件的激活。" + +#: ../../library/sys.monitoring.rst:180 +msgid "Local events" +msgstr "本地事件" + +#: ../../library/sys.monitoring.rst:182 +msgid "" +"Local events are associated with normal execution of the program and happen " +"at clearly defined locations. All local events can be disabled per location." +" The local events are:" +msgstr "" + +#: ../../library/sys.monitoring.rst:186 +msgid ":monitoring-event:`PY_START`" +msgstr ":monitoring-event:`PY_START`" + +#: ../../library/sys.monitoring.rst:187 +msgid ":monitoring-event:`PY_RESUME`" +msgstr ":monitoring-event:`PY_RESUME`" + +#: ../../library/sys.monitoring.rst:188 +msgid ":monitoring-event:`PY_RETURN`" +msgstr ":monitoring-event:`PY_RETURN`" + +#: ../../library/sys.monitoring.rst:189 +msgid ":monitoring-event:`PY_YIELD`" +msgstr ":monitoring-event:`PY_YIELD`" + +#: ../../library/sys.monitoring.rst:190 +msgid ":monitoring-event:`CALL`" +msgstr ":monitoring-event:`CALL`" + +#: ../../library/sys.monitoring.rst:191 +msgid ":monitoring-event:`LINE`" +msgstr ":monitoring-event:`LINE`" + +#: ../../library/sys.monitoring.rst:192 +msgid ":monitoring-event:`INSTRUCTION`" +msgstr ":monitoring-event:`INSTRUCTION`" + +#: ../../library/sys.monitoring.rst:193 +msgid ":monitoring-event:`JUMP`" +msgstr ":monitoring-event:`JUMP`" + +#: ../../library/sys.monitoring.rst:194 +msgid ":monitoring-event:`BRANCH_LEFT`" +msgstr ":monitoring-event:`BRANCH_LEFT`" + +#: ../../library/sys.monitoring.rst:195 +msgid ":monitoring-event:`BRANCH_RIGHT`" +msgstr ":monitoring-event:`BRANCH_RIGHT`" + +#: ../../library/sys.monitoring.rst:196 +msgid ":monitoring-event:`STOP_ITERATION`" +msgstr ":monitoring-event:`STOP_ITERATION`" + +#: ../../library/sys.monitoring.rst:199 +msgid "Deprecated event" +msgstr "已弃用的事件" + +#: ../../library/sys.monitoring.rst:201 +msgid "``BRANCH``" +msgstr "``BRANCH``" + +#: ../../library/sys.monitoring.rst:203 +msgid "" +"The ``BRANCH`` event is deprecated in 3.14. Using :monitoring-" +"event:`BRANCH_LEFT` and :monitoring-event:`BRANCH_RIGHT` events will give " +"much better performance as they can be disabled independently." +msgstr "" +"``BRANCH`` 事件已在 3.14 中被弃用。使用 :monitoring-event:`BRANCH_LEFT` 和 :monitoring-" +"event:`BRANCH_RIGHT` 事件可以提供更好的性能,因为它们可以被单独禁用。" + +#: ../../library/sys.monitoring.rst:211 +msgid "Ancillary events" +msgstr "辅助事件" + +#: ../../library/sys.monitoring.rst:213 +msgid "" +"Ancillary events can be monitored like other events, but are controlled by " +"another event:" +msgstr "辅助事件可以像其他事件一样被监视,但是由另一个事件来控制:" + +#: ../../library/sys.monitoring.rst:216 +msgid ":monitoring-event:`C_RAISE`" +msgstr ":monitoring-event:`C_RAISE`" + +#: ../../library/sys.monitoring.rst:217 +msgid ":monitoring-event:`C_RETURN`" +msgstr ":monitoring-event:`C_RETURN`" + +#: ../../library/sys.monitoring.rst:219 +msgid "" +"The :monitoring-event:`C_RETURN` and :monitoring-event:`C_RAISE` events are " +"controlled by the :monitoring-event:`CALL` event. :monitoring-" +"event:`C_RETURN` and :monitoring-event:`C_RAISE` events will only be seen if" +" the corresponding :monitoring-event:`CALL` event is being monitored." +msgstr "" +":monitoring-event:`C_RETURN` 和 :monitoring-event:`C_RAISE` 事件是由 :monitoring-" +"event:`CALL` 事件控制的。 :monitoring-event:`C_RETURN` 和 :monitoring-" +"event:`C_RAISE` 事件只会在相应的 :monitoring-event:`CALL` 事件被监控时才能被看到。" + +#: ../../library/sys.monitoring.rst:228 +msgid "Other events" +msgstr "其他事件" + +#: ../../library/sys.monitoring.rst:230 +msgid "" +"Other events are not necessarily tied to a specific location in the program " +"and cannot be individually disabled per location." +msgstr "" + +#: ../../library/sys.monitoring.rst:233 +msgid "The other events that can be monitored are:" +msgstr "可以被监视的其他事件包括:" + +#: ../../library/sys.monitoring.rst:235 +msgid ":monitoring-event:`PY_THROW`" +msgstr ":monitoring-event:`PY_THROW`" + +#: ../../library/sys.monitoring.rst:236 +msgid ":monitoring-event:`PY_UNWIND`" +msgstr ":monitoring-event:`PY_UNWIND`" + +#: ../../library/sys.monitoring.rst:237 +msgid ":monitoring-event:`RAISE`" +msgstr ":monitoring-event:`RAISE`" + +#: ../../library/sys.monitoring.rst:238 +msgid ":monitoring-event:`EXCEPTION_HANDLED`" +msgstr ":monitoring-event:`EXCEPTION_HANDLED`" + +#: ../../library/sys.monitoring.rst:239 +msgid ":monitoring-event:`RERAISE`" +msgstr "" + +#: ../../library/sys.monitoring.rst:241 +msgid "" +"Other events can now be turned on and disabled on a per code object basis. " +"Returning :data:`DISABLE` from a callback disables the event for the entire " +"code object (for the current tool)." +msgstr "" + +#: ../../library/sys.monitoring.rst:248 +msgid "The STOP_ITERATION event" +msgstr "STOP_ITERATION 事件" + +#: ../../library/sys.monitoring.rst:250 +msgid "" +":pep:`PEP 380 <380#use-of-stopiteration-to-return-values>` specifies that a " +":exc:`StopIteration` exception is raised when returning a value from a " +"generator or coroutine. However, this is a very inefficient way to return a " +"value, so some Python implementations, notably CPython 3.12+, do not raise " +"an exception unless it would be visible to other code." +msgstr "" +":pep:`PEP 380 <380#use-of-stopiteration-to-return-values>` " +"规定了当从生成器或协程返回值时会引发 :exc:`StopIteration` 异常。不过,这是一种非常低效的返回值的方式,因此某些 Python " +"实现,比如 CPython 3.12+,只有在异常对其他代码可见时才会引发它。" + +#: ../../library/sys.monitoring.rst:256 +msgid "" +"To allow tools to monitor for real exceptions without slowing down " +"generators and coroutines, the :monitoring-event:`STOP_ITERATION` event is " +"provided. :monitoring-event:`STOP_ITERATION` can be locally disabled." +msgstr "" + +#: ../../library/sys.monitoring.rst:260 +msgid "" +"Note that the :monitoring-event:`STOP_ITERATION` event and the :monitoring-" +"event:`RAISE` event for a :exc:`StopIteration` exception are equivalent, and" +" are treated as interchangeable when generating events. Implementations will" +" favor :monitoring-event:`STOP_ITERATION` for performance reasons, but may " +"generate a :monitoring-event:`RAISE` event with a :exc:`StopIteration`." +msgstr "" +"请注意,:monitoring-event:`STOP_ITERATION` 事件和 :exc:`StopIteration` 异常的 " +":monitoring-event:`RAISE` 事件是等价的,并且在生成事件时被视为可互换的。出于性能原因,实现将倾向于 :monitoring-" +"event:`STOP_ITERATION`,但可能会使用 :exc:`StopIteration` 生成 :monitoring-" +"event:`RAISE` 事件。" + +#: ../../library/sys.monitoring.rst:268 +msgid "Turning events on and off" +msgstr "开启和关闭事件" + +#: ../../library/sys.monitoring.rst:270 +msgid "" +"In order to monitor an event, it must be turned on and a corresponding " +"callback must be registered. Events can be turned on or off by setting the " +"events either globally and/or for a particular code object. An event will " +"trigger only once, even if it is turned on both globally and locally." +msgstr "" +"要监视一个事件,它必须被开启且相应的回调必须被注册。可以通过将事件设置为全局的和/或针对特定代码对象的来开启或关闭事件。 " +"一个事件将只被触发一次,即使它在全局和局部都被开启。" + +#: ../../library/sys.monitoring.rst:277 +msgid "Setting events globally" +msgstr "全局设置事件" + +#: ../../library/sys.monitoring.rst:279 +msgid "" +"Events can be controlled globally by modifying the set of events being " +"monitored." +msgstr "通过修改被监视的事件集可以对事件进行全局控制。" + +#: ../../library/sys.monitoring.rst:283 +msgid "Returns the ``int`` representing all the active events." +msgstr "返回代表所有活动事件的 ``int``。" + +#: ../../library/sys.monitoring.rst:287 +msgid "" +"Activates all events which are set in *event_set*. Raises a " +":exc:`ValueError` if *tool_id* is not in use." +msgstr "激活在 *event_set* 中设置的所有事件。如果 *tool_id* 未被使用则会引发 :exc:`ValueError`。" + +#: ../../library/sys.monitoring.rst:290 +msgid "No events are active by default." +msgstr "在默认情况下没有被激活的事件。" + +#: ../../library/sys.monitoring.rst:293 +msgid "Per code object events" +msgstr "针对特定代码对象的事件" + +#: ../../library/sys.monitoring.rst:295 +msgid "" +"Events can also be controlled on a per code object basis. The functions " +"defined below which accept a :class:`types.CodeType` should be prepared to " +"accept a look-alike object from functions which are not defined in Python " +"(see :ref:`c-api-monitoring`)." +msgstr "" +"事件也可以基于每个代码对象来控制。下面定义的接受一个 :class:`types.CodeType` 的函数应当准备好接受来自不是在 Python " +"中定义的类似对象 (参见 :ref:`c-api-monitoring`)。" + +#: ../../library/sys.monitoring.rst:302 +msgid "" +"Returns all the :ref:`local events ` for *code*" +msgstr "返回 *code* 的所有 :ref:`局部事件 `" + +#: ../../library/sys.monitoring.rst:306 +msgid "" +"Activates all the :ref:`local events ` for *code* " +"which are set in *event_set*. Raises a :exc:`ValueError` if *tool_id* is not" +" in use." +msgstr "" +"激活在 *event_set* 中针对 *code* 设置的所有 :ref:`局部事件 `。如果 " +"*tool_id* 未被使用则会引发 :exc:`ValueError`。" + +#: ../../library/sys.monitoring.rst:312 +msgid "Disabling events" +msgstr "禁用事件" + +#: ../../library/sys.monitoring.rst:316 +msgid "" +"A special value that can be returned from a callback function to disable " +"events for the current code location." +msgstr "一个可从回调函数返回以禁用当前代码位置上的事件的特殊值。" + +#: ../../library/sys.monitoring.rst:319 +msgid "" +":ref:`Local events ` can be disabled for a specific " +"code location by returning :data:`sys.monitoring.DISABLE` from a callback " +"function. This does not change which events are set, or any other code " +"locations for the same event." +msgstr "" +"可以通过从回调函数返回 :data:`sys.monitoring.DISABLE` 来禁用特定代码位置上的 :ref:`局部事件 " +"`。这不会改变已设置的事件,也不会改变针对同一事件的其他代码位置。" + +#: ../../library/sys.monitoring.rst:324 +msgid "" +":ref:`Other events ` can be disabled on a per code " +"object basis by returning :data:`sys.monitoring.DISABLE` from a callback " +"function. This disables the event for the entire code object (for the " +"current tool)." +msgstr "" + +#: ../../library/sys.monitoring.rst:329 +msgid "" +"Disabling events for specific locations is very important for high " +"performance monitoring. For example, a program can be run under a debugger " +"with no overhead if the debugger disables all monitoring except for a few " +"breakpoints." +msgstr "禁用特定位置的事件对高性能的监控非常重要。例如,如果调试器禁用了除几个断点外的所有监控那么程序在调试器下运行时就不会产生额外的开销。" + +#: ../../library/sys.monitoring.rst:335 +msgid "" +"Enable all the events that were disabled by :data:`sys.monitoring.DISABLE` " +"for all tools." +msgstr "启用 :data:`sys.monitoring.DISABLE` 针对所有工具禁用的所有事件。" + +#: ../../library/sys.monitoring.rst:342 +msgid "Registering callback functions" +msgstr "注册回调函数" + +#: ../../library/sys.monitoring.rst:346 +msgid "Registers the callable *func* for the *event* with the given *tool_id*" +msgstr "使用给定的 *tool_id* 为 *event* 注册可调用对象 *func*" + +#: ../../library/sys.monitoring.rst:348 +msgid "" +"If another callback was registered for the given *tool_id* and *event*, it " +"is unregistered and returned. Otherwise :func:`register_callback` returns " +"``None``." +msgstr "" +"如果已经为给定的 *tool_id* 和 *event* 注册了另一个回调,它将被注销并返回。在其他情况下 " +":func:`register_callback` 将返回 ``None``。" + +#: ../../library/sys.monitoring.rst:352 +msgid "" +"Raises an :ref:`auditing event ` " +"``sys.monitoring.register_callback`` with argument ``func``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``sys.monitoring.register_callback`` 并附带参数 " +"``func``." + +#: ../../library/sys.monitoring.rst:354 +msgid "" +"Functions can be unregistered by calling " +"``sys.monitoring.register_callback(tool_id, event, None)``." +msgstr "" +"函数可以通过调用 ``sys.monitoring.register_callback(tool_id, event, None)`` 来注销。" + +#: ../../library/sys.monitoring.rst:357 +msgid "Callback functions can be registered and unregistered at any time." +msgstr "回调函数可在任何时候被注册或注销。" + +#: ../../library/sys.monitoring.rst:359 +msgid "" +"Callbacks are called only once regardless if the event is turned on both " +"globally and locally. As such, if an event could be turned on for both " +"global and local events by your code then the callback needs to be written " +"to handle either trigger." +msgstr "" +"回调将只被调用一次,即使事件在全局和局部都被开启。因此,如果一个事件可以被你的代码在全局和局部同时开启那么回调就需要被编写为同时处理两个触发器。" + +#: ../../library/sys.monitoring.rst:366 +msgid "Callback function arguments" +msgstr "回调函数参数" + +#: ../../library/sys.monitoring.rst:370 +msgid "" +"A special value that is passed to a callback function to indicate that there" +" are no arguments to the call." +msgstr "一个传给回调函数表明该调用不附带任何参数的特殊值。" + +#: ../../library/sys.monitoring.rst:373 +msgid "" +"When an active event occurs, the registered callback function is called. " +"Callback functions returning an object other than :data:`DISABLE` will have " +"no effect. Different events will provide the callback function with " +"different arguments, as follows:" +msgstr "" +"当一个激活的事件发生时,已注册的回调函数将被调用。回调函数返回 :data:`DISABLE` 以外的对象将没有任何效果。 " +"不同的事件将提供具有不同参数的回调函数,如下所示:" + +#: ../../library/sys.monitoring.rst:377 +msgid ":monitoring-event:`PY_START` and :monitoring-event:`PY_RESUME`::" +msgstr ":monitoring-event:`PY_START` 和 :monitoring-event:`PY_RESUME`::" + +#: ../../library/sys.monitoring.rst:379 ../../library/sys.monitoring.rst:416 +msgid "func(code: CodeType, instruction_offset: int) -> object" +msgstr "func(code: CodeType, instruction_offset: int) -> object" + +#: ../../library/sys.monitoring.rst:381 +msgid ":monitoring-event:`PY_RETURN` and :monitoring-event:`PY_YIELD`::" +msgstr ":monitoring-event:`PY_RETURN` 和 :monitoring-event:`PY_YIELD`::" + +#: ../../library/sys.monitoring.rst:383 +msgid "" +"func(code: CodeType, instruction_offset: int, retval: object) -> object" +msgstr "" +"func(code: CodeType, instruction_offset: int, retval: object) -> object" + +#: ../../library/sys.monitoring.rst:385 +msgid "" +":monitoring-event:`CALL`, :monitoring-event:`C_RAISE` and :monitoring-" +"event:`C_RETURN` (*arg0* can be :data:`MISSING` specifically)::" +msgstr "" +":monitoring-event:`CALL`, :monitoring-event:`C_RAISE` 和 :monitoring-" +"event:`C_RETURN` (特别地 *arg0* 可以为 :data:`MISSING`)::" + +#: ../../library/sys.monitoring.rst:388 +msgid "" +"func(code: CodeType, instruction_offset: int, callable: object, arg0: " +"object) -> object" +msgstr "" +"func(code: CodeType, instruction_offset: int, callable: object, arg0: " +"object) -> object" + +#: ../../library/sys.monitoring.rst:390 +msgid "" +"*code* represents the code object where the call is being made, while " +"*callable* is the object that is about to be called (and thus triggered the " +"event). If there are no arguments, *arg0* is set to " +":data:`sys.monitoring.MISSING`." +msgstr "" +"*code* 代表调用所在的代码对象,而 *callable* 是将要被调用的对象(并因此触发事件)。如果没有参数,*arg0* 将被设为 " +":data:`sys.monitoring.MISSING`." + +#: ../../library/sys.monitoring.rst:395 +msgid "" +"For instance methods, *callable* will be the function object as found on the" +" class with *arg0* set to the instance (i.e. the ``self`` argument to the " +"method)." +msgstr "对于实例方法,*callable* 将是在类上找到的函数对象,*arg0* 设为该实例(即方法的 ``self`` 参数)。" + +#: ../../library/sys.monitoring.rst:399 +msgid "" +":monitoring-event:`RAISE`, :monitoring-event:`RERAISE`, :monitoring-" +"event:`EXCEPTION_HANDLED`, :monitoring-event:`PY_UNWIND`, :monitoring-" +"event:`PY_THROW` and :monitoring-event:`STOP_ITERATION`::" +msgstr "" +":monitoring-event:`RAISE`, :monitoring-event:`RERAISE`, :monitoring-" +"event:`EXCEPTION_HANDLED`, :monitoring-event:`PY_UNWIND`, :monitoring-" +"event:`PY_THROW` 和 :monitoring-event:`STOP_ITERATION`::" + +#: ../../library/sys.monitoring.rst:402 +msgid "" +"func(code: CodeType, instruction_offset: int, exception: BaseException) -> " +"object" +msgstr "" +"func(code: CodeType, instruction_offset: int, exception: BaseException) -> " +"object" + +#: ../../library/sys.monitoring.rst:404 +msgid ":monitoring-event:`LINE`::" +msgstr ":monitoring-event:`LINE`::" + +#: ../../library/sys.monitoring.rst:406 +msgid "func(code: CodeType, line_number: int) -> object" +msgstr "func(code: CodeType, line_number: int) -> object" + +#: ../../library/sys.monitoring.rst:408 +msgid "" +":monitoring-event:`BRANCH_LEFT`, :monitoring-event:`BRANCH_RIGHT` and " +":monitoring-event:`JUMP`::" +msgstr "" +":monitoring-event:`BRANCH_LEFT`、 :monitoring-event:`BRANCH_RIGHT` 和 " +":monitoring-event:`JUMP`::" + +#: ../../library/sys.monitoring.rst:410 +msgid "" +"func(code: CodeType, instruction_offset: int, destination_offset: int) -> " +"object" +msgstr "" +"func(code: CodeType, instruction_offset: int, destination_offset: int) -> " +"object" + +#: ../../library/sys.monitoring.rst:412 +msgid "" +"Note that the *destination_offset* is where the code will next execute." +msgstr "注意,*destination_offset* 是代码下一次执行的地方。" + +#: ../../library/sys.monitoring.rst:414 +msgid ":monitoring-event:`INSTRUCTION`::" +msgstr ":monitoring-event:`INSTRUCTION`::" diff --git a/library/sys.po b/library/sys.po new file mode 100644 index 0000000000..cd53af43e2 --- /dev/null +++ b/library/sys.po @@ -0,0 +1,3442 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-21 16:26+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/sys.rst:2 +msgid ":mod:`!sys` --- System-specific parameters and functions" +msgstr ":mod:`!sys` --- 系统相关的形参和函数" + +#: ../../library/sys.rst:9 +msgid "" +"This module provides access to some variables used or maintained by the " +"interpreter and to functions that interact strongly with the interpreter. It" +" is always available. Unless explicitly noted otherwise, all variables are " +"read-only." +msgstr "该模块提供了一些由解释器使用或维护的变量以及与解释器高强度交互的函数。它将始终可用。除非显式地说明例外情况,所有变量都是只读的。" + +#: ../../library/sys.rst:16 +msgid "" +"On POSIX systems where Python was built with the standard ``configure`` " +"script, this contains the ABI flags as specified by :pep:`3149`." +msgstr "" +"在 POSIX 系统上,以标准的 ``configure`` 脚本构建的 Python 中,这个变量会包含 :pep:`3149` 中定义的 ABI " +"标签。" + +#: ../../library/sys.rst:21 +msgid "" +"Default flags became an empty string (``m`` flag for pymalloc has been " +"removed)." +msgstr "默认的 flags 变为了空字符串(用于 pymalloc 的 ``m`` 旗标已经移除)" + +#: ../../library/sys.rst:25 ../../library/sys.rst:298 +#: ../../library/sys.rst:368 ../../library/sys.rst:789 +#: ../../library/sys.rst:807 ../../library/sys.rst:1056 +#: ../../library/sys.rst:1666 ../../library/sys.rst:1909 +#: ../../library/sys.rst:1924 ../../library/sys.rst:1932 +#: ../../library/sys.rst:1973 ../../library/sys.rst:1990 +#: ../../library/sys.rst:2237 +msgid "Availability" +msgstr "Availability" + +#: ../../library/sys.rst:30 +msgid "" +"Append the callable *hook* to the list of active auditing hooks for the " +"current (sub)interpreter." +msgstr "将可调用的对象 *hook* 附加到当前(子)解释器的活动的审计钩子列表中。" + +#: ../../library/sys.rst:33 +msgid "" +"When an auditing event is raised through the :func:`sys.audit` function, " +"each hook will be called in the order it was added with the event name and " +"the tuple of arguments. Native hooks added by :c:func:`PySys_AddAuditHook` " +"are called first, followed by hooks added in the current (sub)interpreter. " +"Hooks can then log the event, raise an exception to abort the operation, or " +"terminate the process entirely." +msgstr "" +"当通过 :func:`sys.audit` 函数引发审计事件时,每个钩子将按照其被加入的先后顺序被调用,调用时会传入事件名称和参数元组。由 " +":c:func:`PySys_AddAuditHook` 添加的原生钩子会先被调用,然后是当前(子)解释器中添加的钩子。 " +"接下来这些钩子会记录事件,引发异常来中止操作,或是完全终止进程。" + +#: ../../library/sys.rst:40 +msgid "" +"Note that audit hooks are primarily for collecting information about " +"internal or otherwise unobservable actions, whether by Python or libraries " +"written in Python. They are not suitable for implementing a \"sandbox\". In " +"particular, malicious code can trivially disable or bypass hooks added using" +" this function. At a minimum, any security-sensitive hooks must be added " +"using the C API :c:func:`PySys_AddAuditHook` before initialising the " +"runtime, and any modules allowing arbitrary memory modification (such as " +":mod:`ctypes`) should be completely removed or closely monitored." +msgstr "" +"请注意审计钩子主要是用于收集有关内部或在其他情况下不可观察操作的信息,可能是通过 Python 或者用 Python 编写的库。 " +"它们不适合用于实现“沙盒”。特别重要的一点是,恶意代码可以轻易地禁用或绕过使用此函数添加的钩子。至少,在初始化运行时之前必须使用 C API " +":c:func:`PySys_AddAuditHook` 来添加任何安全敏感的钩子,并且应当完全删除或密切监视任何允许任意修改内存的模块 (如 " +":mod:`ctypes`)." + +#: ../../library/sys.rst:49 ../../library/sys.rst:51 +msgid "" +"Calling :func:`sys.addaudithook` will itself raise an auditing event named " +"``sys.addaudithook`` with no arguments. If any existing hooks raise an " +"exception derived from :class:`RuntimeError`, the new hook will not be added" +" and the exception suppressed. As a result, callers cannot assume that their" +" hook has been added unless they control all existing hooks." +msgstr "" +"调用 :func:`sys.addaudithook` 时它自身将引发一个名为 ``sys.addaudithook`` 的审计事件且不附带参数。 " +"如果任何现有的钩子引发了派生自 :class:`RuntimeError` 的异常,则新的钩子不会被添加并且该异常会被抑制。 " +"其结果就是,调用者无法确保他们的钩子已经被添加,除非他们控制了全部现有的钩子。" + +#: ../../library/sys.rst:58 +msgid "" +"See the :ref:`audit events table ` for all events raised by " +"CPython, and :pep:`578` for the original design discussion." +msgstr "" +"请参阅 :ref:`审计事件表 ` 以获取由 CPython 引发的所有事件,并参阅 :pep:`578` " +"了解最初的设计讨论。" + +#: ../../library/sys.rst:65 +msgid "" +"Exceptions derived from :class:`Exception` but not :class:`RuntimeError` are" +" no longer suppressed." +msgstr "派生自 :class:`Exception` 但不是 :class:`RuntimeError` 的异常不再会被抑制。" + +#: ../../library/sys.rst:70 +msgid "" +"When tracing is enabled (see :func:`settrace`), Python hooks are only traced" +" if the callable has a ``__cantrace__`` member that is set to a true value. " +"Otherwise, trace functions will skip the hook." +msgstr "" +"启用跟踪时 (参阅 :func:`settrace`),仅当可调用对象(钩子)的 ``__cantrace__`` 成员设为真值时,才会跟踪该钩子。 " +"否则,跟踪功能将跳过该钩子。" + +#: ../../library/sys.rst:77 +msgid "" +"The list of command line arguments passed to a Python script. ``argv[0]`` is" +" the script name (it is operating system dependent whether this is a full " +"pathname or not). If the command was executed using the :option:`-c` " +"command line option to the interpreter, ``argv[0]`` is set to the string " +"``'-c'``. If no script name was passed to the Python interpreter, " +"``argv[0]`` is the empty string." +msgstr "" +"一个列表,其中包含了被传递给 Python 脚本的命令行参数。``argv[0]`` 为脚本的名称(是否是完整的路径名取决于操作系统)。如果是通过 " +"Python 解释器的命令行参数 :option:`-c` 来执行的,``argv[0]`` 会被设置成字符串 ``'-c'`` " +"。如果没有脚本名被传递给 Python 解释器,``argv[0]`` 为空字符串。" + +#: ../../library/sys.rst:83 +msgid "" +"To loop over the standard input, or the list of files given on the command " +"line, see the :mod:`fileinput` module." +msgstr "为了遍历标准输入,或者通过命令行传递的文件列表,参照 :mod:`fileinput` 模块" + +#: ../../library/sys.rst:86 +msgid "See also :data:`sys.orig_argv`." +msgstr "另请参阅 :data:`sys.orig_argv`。" + +#: ../../library/sys.rst:89 +msgid "" +"On Unix, command line arguments are passed by bytes from OS. Python decodes" +" them with filesystem encoding and \"surrogateescape\" error handler. When " +"you need original bytes, you can get it by ``[os.fsencode(arg) for arg in " +"sys.argv]``." +msgstr "" +"在 Unix 上,系统传递的命令行参数是字节类型的。Python 使用文件系统编码和 \"surrogateescape\" " +"错误处理方案对它们进行解码。当需要原始字节时,可以通过 ``[os.fsencode(arg) for arg in sys.argv]`` 来获取。" + +#: ../../library/sys.rst:101 +msgid "" +"Raise an auditing event and trigger any active auditing hooks. *event* is a " +"string identifying the event, and *args* may contain optional arguments with" +" more information about the event. The number and types of arguments for a " +"given event are considered a public and stable API and should not be " +"modified between releases." +msgstr "" +"引发一个审计事件并触发任何激活的审计钩子。 *event* 是一个用于标识事件的字符串,*args* 会包含有关事件的更多信息的可选参数。 " +"特定事件的参数的数量和类型会被视为是公有的稳定 API 且不应当在版本之间进行修改。" + +#: ../../library/sys.rst:107 +msgid "" +"For example, one auditing event is named ``os.chdir``. This event has one " +"argument called *path* that will contain the requested new working " +"directory." +msgstr "例如,有一个审计事件的名称为 ``os.chdir``。此事件具有一个名为 *path* 的参数,该参数将包含所请求的新工作目录。" + +#: ../../library/sys.rst:111 +msgid "" +":func:`sys.audit` will call the existing auditing hooks, passing the event " +"name and arguments, and will re-raise the first exception from any hook. In " +"general, if an exception is raised, it should not be handled and the process" +" should be terminated as quickly as possible. This allows hook " +"implementations to decide how to respond to particular events: they can " +"merely log the event or abort the operation by raising an exception." +msgstr "" +":func:`sys.audit` 将调用现有的审计钩子,传入事件名称和参数,并将重新引发来自任何钩子的第一个异常。 " +"通常来说,如果有一个异常被引发,则它不应当被处理且其进程应当被尽可能快地终止。 " +"这将允许钩子实现来决定对特定事件要如何反应:它们可以只是将事件写入日志或是通过引发异常来中止操作。" + +#: ../../library/sys.rst:119 +msgid "" +"Hooks are added using the :func:`sys.addaudithook` or " +":c:func:`PySys_AddAuditHook` functions." +msgstr "钩子程序由 :func:`sys.addaudithook` 或 :c:func:`PySys_AddAuditHook` 函数添加。" + +#: ../../library/sys.rst:122 +msgid "" +"The native equivalent of this function is :c:func:`PySys_Audit`. Using the " +"native function is preferred when possible." +msgstr "与本函数相等效的原生函数是 :c:func:`PySys_Audit`,应尽量使用原生函数。" + +#: ../../library/sys.rst:125 +msgid "" +"See the :ref:`audit events table ` for all events raised by " +"CPython." +msgstr "参阅 :ref:`审计事件表 ` 以获取 CPython 定义的所有审计事件。" + +#: ../../library/sys.rst:133 +msgid "" +"Equivalent to :data:`exec_prefix`, but referring to the base Python " +"installation." +msgstr "相当于 :data:`exec_prefix`,但指向基本 Python 安装版。" + +#: ../../library/sys.rst:135 +msgid "" +"When running under :ref:`sys-path-init-virtual-environments`, " +":data:`exec_prefix` gets overwritten to the virtual environment prefix. " +":data:`base_exec_prefix`, conversely, does not change, and always points to " +"the base Python installation. Refer to :ref:`sys-path-init-virtual-" +"environments` for more information." +msgstr "" +"当在 :ref:`sys-path-init-virtual-environments` 下运行时,:data:`exec_prefix` " +"被覆盖为虚拟环境前缀。相反,:data:`base_exec_prefix` 不会改变,并且始终指向基本 Python 安装。更多信息请参考 " +":ref:`sys-path-init-virtual-environments`." + +#: ../../library/sys.rst:146 +msgid "" +"Equivalent to :data:`prefix`, but referring to the base Python installation." +msgstr "相当于 :data:`prefix`,但指向基本 Python 安装。" + +#: ../../library/sys.rst:148 +msgid "" +"When running under :ref:`virtual environment `, :data:`prefix` " +"gets overwritten to the virtual environment prefix. :data:`base_prefix`, " +"conversely, does not change, and always points to the base Python " +"installation. Refer to :ref:`sys-path-init-virtual-environments` for more " +"information." +msgstr "" +"当在 :ref:`虚拟环境 ` 下运行时,:data:`prefix` 被覆盖为虚拟环境前缀。 " +"相反,:data:`base_prefix` 不会改变,并且始终指向基本 Python 安装。更多信息请参考 :ref:`sys-path-init-" +"virtual-environments`." + +#: ../../library/sys.rst:159 +msgid "" +"An indicator of the native byte order. This will have the value ``'big'`` " +"on big-endian (most-significant byte first) platforms, and ``'little'`` on " +"little-endian (least-significant byte first) platforms." +msgstr "" +"本地字节顺序的指示符。在大端序(最高有效位优先)操作系统上值为 ``'big'``,在小端序(最低有效位优先)操作系统上为 ``'little'`` 。" + +#: ../../library/sys.rst:166 +msgid "" +"A tuple of strings containing the names of all modules that are compiled " +"into this Python interpreter. (This information is not available in any " +"other way --- ``modules.keys()`` only lists the imported modules.)" +msgstr "" +"一个包含所有被编译进 Python 解释器的模块的名称的字符串元组。 (此信息无法通过任何其他办法获取 --- ``modules.keys()`` " +"仅会列出导入的模块。)" + +#: ../../library/sys.rst:170 +msgid "See also the :data:`sys.stdlib_module_names` list." +msgstr "另请参阅 :data:`sys.stdlib_module_names` 列表。" + +#: ../../library/sys.rst:175 +msgid "" +"Call ``func(*args)``, while tracing is enabled. The tracing state is saved," +" and restored afterwards. This is intended to be called from a debugger " +"from a checkpoint, to recursively debug or profile some other code." +msgstr "" +"当启用跟踪时,调用 ``func(*args)``。跟踪状态将被保存,并在以后恢复。 " +"这被设计为由调试器从某个检查点执行调用,以便递归地调试或分析某些其他代码。" + +#: ../../library/sys.rst:179 +msgid "" +"Tracing is suspended while calling a tracing function set by " +":func:`settrace` or :func:`setprofile` to avoid infinite recursion. " +":func:`!call_tracing` enables explicit recursion of the tracing function." +msgstr "" +"在调用由 :func:`settrace` 或 :func:`setprofile` 设置的跟踪函数时跟踪将暂停以避免无限递归。 " +":func:`!call_tracing` 会启用跟踪函数的显式递归。" + +#: ../../library/sys.rst:186 +msgid "" +"A string containing the copyright pertaining to the Python interpreter." +msgstr "一个字符串,包含了 Python 解释器有关的版权信息" + +#: ../../library/sys.rst:191 +msgid "" +"Clear the internal type cache. The type cache is used to speed up attribute " +"and method lookups. Use the function *only* to drop unnecessary references " +"during reference leak debugging." +msgstr "清除内部的类型缓存。类型缓存是为了加速查找方法和属性的。在调试引用泄漏的时候调用这个函数 *只会* 清除不必要的引用。" + +#: ../../library/sys.rst:195 ../../library/sys.rst:222 +#: ../../library/sys.rst:235 +msgid "" +"This function should be used for internal and specialized purposes only." +msgstr "这个函数应该只在内部为了一些特定的目的使用。" + +#: ../../library/sys.rst:197 +msgid "Use the more general :func:`_clear_internal_caches` function instead." +msgstr "改用更一般化的 :func:`_clear_internal_caches` 函数。" + +#: ../../library/sys.rst:203 +msgid "" +"Clear all internal performance-related caches. Use this function *only* to " +"release unnecessary references and memory blocks when hunting for leaks." +msgstr "清空所有内部性能相关的缓存。此函数的使用 *仅限于* 释放不再需要的引用和寻找泄漏的内存块时。" + +#: ../../library/sys.rst:211 +msgid "" +"Return a dictionary mapping each thread's identifier to the topmost stack " +"frame currently active in that thread at the time the function is called. " +"Note that functions in the :mod:`traceback` module can build the call stack " +"given such a frame." +msgstr "" +"返回一个字典,存放着每个线程的标识符与(调用本函数时)该线程栈顶的帧(当前活动的帧)之间的映射。注意 :mod:`traceback` " +"模块中的函数可以在给定某一帧的情况下构建调用堆栈。" + +#: ../../library/sys.rst:216 +msgid "" +"This is most useful for debugging deadlock: this function does not require " +"the deadlocked threads' cooperation, and such threads' call stacks are " +"frozen for as long as they remain deadlocked. The frame returned for a non-" +"deadlocked thread may bear no relationship to that thread's current activity" +" by the time calling code examines the frame." +msgstr "" +"这对于调试死锁最有用:本函数不需要死锁线程的配合,并且只要这些线程的调用栈保持死锁,它们就是冻结的。在调用本代码来检查栈顶的帧的那一刻,非死锁线程返回的帧可能与该线程当前活动的帧没有任何关系。" + +#: ../../library/sys.rst:224 +msgid "" +"Raises an :ref:`auditing event ` ``sys._current_frames`` with no " +"arguments." +msgstr "引发一个不带参数的 :ref:`审计事件 ` ``sys._current_frames``。" + +#: ../../library/sys.rst:228 +msgid "" +"Return a dictionary mapping each thread's identifier to the topmost " +"exception currently active in that thread at the time the function is " +"called. If a thread is not currently handling an exception, it is not " +"included in the result dictionary." +msgstr "" +"返回一个字典,存放着每个线程的标识与调用此函数时该线程当前活动帧的栈顶异常之间的映射。如果某个线程当前未在处理异常,它将不被包括在结果字典中。" + +#: ../../library/sys.rst:233 +msgid "This is most useful for statistical profiling." +msgstr "这对于静态性能分析来说最为有用。" + +#: ../../library/sys.rst:237 +msgid "" +"Raises an :ref:`auditing event ` ``sys._current_exceptions`` with " +"no arguments." +msgstr "引发一个不带参数的 :ref:`审计事件 ` ``sys._current_exceptions``。" + +#: ../../library/sys.rst:239 +msgid "" +"Each value in the dictionary is now a single exception instance, rather than" +" a 3-tuple as returned from ``sys.exc_info()``." +msgstr "现在字典中的每个值都是单独的异常实例,而不是如 ``sys.exc_info()`` 所返回的 3 元组。" + +#: ../../library/sys.rst:245 +msgid "" +"This hook function is called by built-in :func:`breakpoint`. By default, it" +" drops you into the :mod:`pdb` debugger, but it can be set to any other " +"function so that you can choose which debugger gets used." +msgstr "" +"本钩子函数由内建函数 :func:`breakpoint` 调用。默认情况下,它将进入 :mod:`pdb` " +"调试器,但可以将其改为任何其他函数,以选择使用哪个调试器。" + +#: ../../library/sys.rst:249 +msgid "" +"The signature of this function is dependent on what it calls. For example, " +"the default binding (e.g. ``pdb.set_trace()``) expects no arguments, but you" +" might bind it to a function that expects additional arguments (positional " +"and/or keyword). The built-in ``breakpoint()`` function passes its " +"``*args`` and ``**kws`` straight through. Whatever ``breakpointhooks()`` " +"returns is returned from ``breakpoint()``." +msgstr "" +"该函数的特征取决于其调用的函数。例如,默认绑定(即 ``pdb.set_trace()`` " +")不要求提供参数,但可以将绑定换成要求提供附加参数(位置参数/关键字参数)的函数。内建函数 ``breakpoint()`` 直接将其 " +"``*args`` 和 ``**kws`` 传入。``breakpointhooks()`` 返回的所有内容都会从 ``breakpoint()`` " +"返回。" + +#: ../../library/sys.rst:256 +msgid "" +"The default implementation first consults the environment variable " +":envvar:`PYTHONBREAKPOINT`. If that is set to ``\"0\"`` then this function " +"returns immediately; i.e. it is a no-op. If the environment variable is not" +" set, or is set to the empty string, ``pdb.set_trace()`` is called. " +"Otherwise this variable should name a function to run, using Python's " +"dotted-import nomenclature, e.g. ``package.subpackage.module.function``. In " +"this case, ``package.subpackage.module`` would be imported and the resulting" +" module must have a callable named ``function()``. This is run, passing in " +"``*args`` and ``**kws``, and whatever ``function()`` returns, " +"``sys.breakpointhook()`` returns to the built-in :func:`breakpoint` " +"function." +msgstr "" +"默认的实现首先会查询环境变量 :envvar:`PYTHONBREAKPOINT`。如果将该变量设置为 " +"``\"0\"``,则本函数立即返回,表示在断点处无操作。如果未设置该环境变量或将其设置为空字符串,则调用 " +"``pdb.set_trace()``。否则,此变量应指定要运行的函数,指定函数时应使用 Python 的点导入命名法,如 " +"``package.subpackage.module.function``。这种情况下将导入 " +"``package.subpackage.module``,且导入的模块必须有一个名为 ``function()`` " +"的可调用对象。该可调用对象会运行,``*args`` 和 ``**kws`` 会传入,且无论 ``function()`` " +"返回什么,``sys.breakpointhook()`` 都将返回到內建函数 :func:`breakpoint`。" + +#: ../../library/sys.rst:268 +msgid "" +"Note that if anything goes wrong while importing the callable named by " +":envvar:`PYTHONBREAKPOINT`, a :exc:`RuntimeWarning` is reported and the " +"breakpoint is ignored." +msgstr "" +"请注意,如果在导入 :envvar:`PYTHONBREAKPOINT` 指定的可调用对象时出错,则将报告一个 " +":exc:`RuntimeWarning` 并忽略断点。" + +#: ../../library/sys.rst:272 +msgid "" +"Also note that if ``sys.breakpointhook()`` is overridden programmatically, " +":envvar:`PYTHONBREAKPOINT` is *not* consulted." +msgstr "" +"另请注意,如果以编程方式覆盖 ``sys.breakpointhook()``,则 *不会* 查询 " +":envvar:`PYTHONBREAKPOINT`." + +#: ../../library/sys.rst:279 +msgid "" +"Print low-level information to stderr about the state of CPython's memory " +"allocator." +msgstr "将有关 CPython 内存分配器状态的底层的信息打印至 stderr。" + +#: ../../library/sys.rst:282 +msgid "" +"If Python is :ref:`built in debug mode ` (:option:`configure " +"--with-pydebug option <--with-pydebug>`), it also performs some expensive " +"internal consistency checks." +msgstr "" +"如果 Python 是 :ref:`以调试模式编译的 ` (:option:`使用 --with-pydebug 配置选项 " +"<--with-pydebug>`),它还会执行某些高开销的内部一致性检查。" + +#: ../../library/sys.rst:290 +msgid "" +"This function is specific to CPython. The exact output format is not " +"defined here, and may change." +msgstr "本函数仅限 CPython。此处没有定义确切的输出格式,且可能会更改。" + +#: ../../library/sys.rst:296 +msgid "Integer specifying the handle of the Python DLL." +msgstr "指向 Python DLL 句柄的整数。" + +#: ../../library/sys.rst:303 +msgid "" +"If *value* is not ``None``, this function prints ``repr(value)`` to " +"``sys.stdout``, and saves *value* in ``builtins._``. If ``repr(value)`` is " +"not encodable to ``sys.stdout.encoding`` with ``sys.stdout.errors`` error " +"handler (which is probably ``'strict'``), encode it to " +"``sys.stdout.encoding`` with ``'backslashreplace'`` error handler." +msgstr "" +"如果 *value* 不是 ``None``,则本函数会将 ``repr(value)`` 打印至 ``sys.stdout``,并将 *value* " +"保存在 ``builtins._`` 中。如果 ``repr(value)`` 无法用 ``sys.stdout.errors`` 错误处理方案 " +"(可能为 ``'strict'``) 编码为 ``sys.stdout.encoding``,则用 ``'backslashreplace'`` " +"错误处理方案将其编码为 ``sys.stdout.encoding``。" + +#: ../../library/sys.rst:309 +msgid "" +"``sys.displayhook`` is called on the result of evaluating an " +":term:`expression` entered in an interactive Python session. The display of" +" these values can be customized by assigning another one-argument function " +"to ``sys.displayhook``." +msgstr "" +"在交互式 Python 会话中运行 :term:`expression` 产生结果后,将在结果上调用 " +"``sys.displayhook``。若要自定义这些 value 的显示,可以将 ``sys.displayhook`` 指定为另一个单参数函数。" + +#: ../../library/sys.rst:313 +msgid "Pseudo-code::" +msgstr "伪代码::" + +#: ../../library/sys.rst:315 +msgid "" +"def displayhook(value):\n" +" if value is None:\n" +" return\n" +" # Set '_' to None to avoid recursion\n" +" builtins._ = None\n" +" text = repr(value)\n" +" try:\n" +" sys.stdout.write(text)\n" +" except UnicodeEncodeError:\n" +" bytes = text.encode(sys.stdout.encoding, 'backslashreplace')\n" +" if hasattr(sys.stdout, 'buffer'):\n" +" sys.stdout.buffer.write(bytes)\n" +" else:\n" +" text = bytes.decode(sys.stdout.encoding, 'strict')\n" +" sys.stdout.write(text)\n" +" sys.stdout.write(\"\\n\")\n" +" builtins._ = value" +msgstr "" +"def displayhook(value):\n" +" if value is None:\n" +" return\n" +" # 将 '_' 设为 None 以避免继续递归\n" +" builtins._ = None\n" +" text = repr(value)\n" +" try:\n" +" sys.stdout.write(text)\n" +" except UnicodeEncodeError:\n" +" bytes = text.encode(sys.stdout.encoding, 'backslashreplace')\n" +" if hasattr(sys.stdout, 'buffer'):\n" +" sys.stdout.buffer.write(bytes)\n" +" else:\n" +" text = bytes.decode(sys.stdout.encoding, 'strict')\n" +" sys.stdout.write(text)\n" +" sys.stdout.write(\"\\n\")\n" +" builtins._ = value" + +#: ../../library/sys.rst:333 +msgid "Use ``'backslashreplace'`` error handler on :exc:`UnicodeEncodeError`." +msgstr "在发生 :exc:`UnicodeEncodeError` 时使用 ``'backslashreplace'`` 错误处理方案。" + +#: ../../library/sys.rst:339 +msgid "" +"If this is true, Python won't try to write ``.pyc`` files on the import of " +"source modules. This value is initially set to ``True`` or ``False`` " +"depending on the :option:`-B` command line option and the " +":envvar:`PYTHONDONTWRITEBYTECODE` environment variable, but you can set it " +"yourself to control bytecode file generation." +msgstr "" +"如果该值为 true,则 Python 在导入源码模块时将不会尝试写入 ``.pyc`` 文件。该值会被初始化为 ``True`` 或 " +"``False``,依据是 :option:`-B` 命令行选项和 :envvar:`PYTHONDONTWRITEBYTECODE` " +"环境变量,可以自行设置该值,来控制是否生成字节码文件。" + +#: ../../library/sys.rst:348 +msgid "" +"A :term:`named tuple` holding information about the environment on the " +"*wasm32-emscripten* platform. The named tuple is provisional and may change " +"in the future." +msgstr "" +"这个 :term:`named tuple` 保存了 *wasm32-emscripten* 平台中环境的相关信息。 " +"该命名元组处于暂定状态并可能在将来被更改。" + +#: ../../library/sys.rst:354 +msgid "" +"Emscripten version as tuple of ints (major, minor, micro), e.g. ``(3, 1, " +"8)``." +msgstr "以整数元组 (major, minor, micro) 表示的 Emscripten 版本,例如 ``(3, 1, 8)``。" + +#: ../../library/sys.rst:358 +msgid "" +"Runtime string, e.g. browser user agent, ``'Node.js v14.18.2'``, or " +"``'UNKNOWN'``." +msgstr "运行时字符串,例如 browser user agent, ``'Node.js v14.18.2'`` 或 ``'UNKNOWN'``。" + +#: ../../library/sys.rst:362 +msgid "``True`` if Python is compiled with Emscripten pthreads support." +msgstr "如果 Python 编译附带了 Emscripten pthreads 支持则为 ``True``。" + +#: ../../library/sys.rst:366 +msgid "``True`` if Python is compiled with shared memory support." +msgstr "如果 Python 编译附带了共享内存支持则为 ``True``。" + +#: ../../library/sys.rst:375 +msgid "" +"If this is set (not ``None``), Python will write bytecode-cache ``.pyc`` " +"files to (and read them from) a parallel directory tree rooted at this " +"directory, rather than from ``__pycache__`` directories in the source code " +"tree. Any ``__pycache__`` directories in the source code tree will be " +"ignored and new ``.pyc`` files written within the pycache prefix. Thus if " +"you use :mod:`compileall` as a pre-build step, you must ensure you run it " +"with the same pycache prefix (if any) that you will use at runtime." +msgstr "" +"如果设置了该值 (不为 ``None``),Python 会将字节码缓存文件 ``.pyc`` " +"写入到以该值指定的目录为根的并行目录树中(并从中读取),而不是在源代码树的 ``__pycache__`` 目录下读写。源代码树中所有的 " +"``__pycache__`` 目录都将被忽略并且新的 ``.pyc`` 文件将被写入到 pycache 前缀指定的位置。因此如果你使用 " +":mod:`compileall` 作为预编译步骤,你必须确保使用与在运行时相同的 pycache 前缀(如果有的话)来运行它。" + +#: ../../library/sys.rst:383 +msgid "" +"A relative path is interpreted relative to the current working directory." +msgstr "相对路径将解释为相对于当前工作目录。" + +#: ../../library/sys.rst:385 +msgid "" +"This value is initially set based on the value of the :option:`-X` " +"``pycache_prefix=PATH`` command-line option or the " +":envvar:`PYTHONPYCACHEPREFIX` environment variable (command-line takes " +"precedence). If neither are set, it is ``None``." +msgstr "" +"该值的初值设置,依据 :option:`-X` ``pycache_prefix=PATH`` 命令行选项或 " +":envvar:`PYTHONPYCACHEPREFIX` 环境变量的值(命令行优先)。如果两者均未设置,则为 ``None``。" + +#: ../../library/sys.rst:395 +msgid "" +"This function prints out a given traceback and exception to ``sys.stderr``." +msgstr "本函数会将所给的回溯和异常输出到 ``sys.stderr`` 中。" + +#: ../../library/sys.rst:397 +msgid "" +"When an exception other than :exc:`SystemExit` is raised and uncaught, the " +"interpreter calls ``sys.excepthook`` with three arguments, the exception " +"class, exception instance, and a traceback object. In an interactive " +"session this happens just before control is returned to the prompt; in a " +"Python program this happens just before the program exits. The handling of " +"such top-level exceptions can be customized by assigning another three-" +"argument function to ``sys.excepthook``." +msgstr "" +"当有 :exc:`SystemExit` 以外的异常被引发且未被捕获时,解释器会调用 ``sys.excepthook`` " +"并附带三个参数:异常类、异常实例和回溯对象。在交互会话中这将发生在控制返回提示符之前;在 Python 程序中这将发生在程序退出之前。 " +"这种最高层级异常的处理可以通过为 ``sys.excepthook`` 指定另一个三参数函数来实现自定义。" + +#: ../../library/sys.rst:404 ../../library/sys.rst:406 +msgid "" +"Raise an auditing event ``sys.excepthook`` with arguments ``hook``, " +"``type``, ``value``, ``traceback`` when an uncaught exception occurs. If no " +"hook has been set, ``hook`` may be ``None``. If any hook raises an exception" +" derived from :class:`RuntimeError` the call to the hook will be suppressed." +" Otherwise, the audit hook exception will be reported as unraisable and " +"``sys.excepthook`` will be called." +msgstr "" +"当发生未捕获的异常时,引发一个审计事件 ``sys.excepthook``,附带参数 ``hook``, ``type``, ``value``, " +"``traceback``。如果没有设置钩子,``hook`` 可能为 ``None``。如果某个钩子抛出了派生自 " +":class:`RuntimeError` 的异常,则将禁止对该钩子的调用。否则,审计钩子的异常将被报告为无法抛出,并将调用 " +"``sys.excepthook``." + +#: ../../library/sys.rst:415 +msgid "" +"The :func:`sys.unraisablehook` function handles unraisable exceptions and " +"the :func:`threading.excepthook` function handles exception raised by " +":func:`threading.Thread.run`." +msgstr "" +":func:`sys.unraisablehook` 函数处理无法抛出的异常,:func:`threading.excepthook` 函数处理 " +":func:`threading.Thread.run` 抛出的异常。" + +#: ../../library/sys.rst:425 +msgid "" +"These objects contain the original values of ``breakpointhook``, " +"``displayhook``, ``excepthook``, and ``unraisablehook`` at the start of the " +"program. They are saved so that ``breakpointhook``, ``displayhook`` and " +"``excepthook``, ``unraisablehook`` can be restored in case they happen to " +"get replaced with broken or alternative objects." +msgstr "" +"程序开始时,这些对象存有 ``breakpointhook``、``displayhook``、``excepthook`` 和 " +"``unraisablehook`` 的初始值。保存它们是为了可以在 ``breakpointhook``、``displayhook`` 和 " +"``excepthook``、``unraisablehook`` 被破坏或被替换时恢复它们。" + +#: ../../library/sys.rst:431 +msgid "__breakpointhook__" +msgstr "__breakpointhook__" + +#: ../../library/sys.rst:434 +msgid "__unraisablehook__" +msgstr "__unraisablehook__" + +#: ../../library/sys.rst:440 +msgid "" +"This function, when called while an exception handler is executing (such as " +"an ``except`` or ``except*`` clause), returns the exception instance that " +"was caught by this handler. When exception handlers are nested within one " +"another, only the exception handled by the innermost handler is accessible." +msgstr "" +"当此函数在某个异常处理器执行过程中(如 ``except`` 或 ``except*`` 子句)被调用时,将返回被该处理器所捕获的异常实例。 " +"当有多个异常处理器彼此嵌套时,只有最内层处理器所处理的异常可以被访问到。" + +#: ../../library/sys.rst:445 +msgid "If no exception handler is executing, this function returns ``None``." +msgstr "如果没有任何异常处理器在执行,此函数将返回 ``None``。" + +#: ../../library/sys.rst:452 +msgid "" +"This function returns the old-style representation of the handled exception." +" If an exception ``e`` is currently handled (so :func:`exception` would " +"return ``e``), :func:`exc_info` returns the tuple ``(type(e), e, " +"e.__traceback__)``. That is, a tuple containing the type of the exception (a" +" subclass of :exc:`BaseException`), the exception itself, and a " +":ref:`traceback object ` which typically encapsulates the" +" call stack at the point where the exception last occurred." +msgstr "" +"此函数返回被处理异常的旧式表示形式。如果异常 ``e`` 当前已被处理 (因此 :func:`exception` 将会返回 ``e``),则 " +":func:`exc_info` 将返回元组 ``(type(e), e, e.__traceback__)``。也就是说,一个包含了该异常类型 " +"(:exc:`BaseException` 的子类) ,异常本身,以及通常封装了异常最后发生位置上调用栈的 :ref:`回溯对象 ` 的元组。" + +#: ../../library/sys.rst:463 +msgid "" +"If no exception is being handled anywhere on the stack, this function return" +" a tuple containing three ``None`` values." +msgstr "如果堆栈上的任何地方都没有处理异常,则此函数将返回一个包含三个 ``None`` 的元组。" + +#: ../../library/sys.rst:466 +msgid "" +"The ``type`` and ``traceback`` fields are now derived from the ``value`` " +"(the exception instance), so when an exception is modified while it is being" +" handled, the changes are reflected in the results of subsequent calls to " +":func:`exc_info`." +msgstr "" +"``type`` 和 ``traceback`` 字段现在是派生自 ``value`` (异常实例),因此当一个异常在处理期间被修改时,其变化会在后续对" +" :func:`exc_info` 的调用结果中反映出来。" + +#: ../../library/sys.rst:474 +msgid "" +"A string giving the site-specific directory prefix where the platform-" +"dependent Python files are installed; by default, this is also " +"``'/usr/local'``. This can be set at build time with the ``--exec-prefix`` " +"argument to the :program:`configure` script. Specifically, all " +"configuration files (e.g. the :file:`pyconfig.h` header file) are installed " +"in the directory :file:`{exec_prefix}/lib/python{X.Y}/config`, and shared " +"library modules are installed in :file:`{exec_prefix}/lib/python{X.Y}/lib-" +"dynload`, where *X.Y* is the version number of Python, for example ``3.2``." +msgstr "" +"一个字符串,提供特定域的目录前缀,该目录中安装了与平台相关的 Python 文件,默认也是 ``'/usr/local'``。该目录前缀可以在构建时使用" +" :program:`configure` 脚本的 ``--exec-prefix`` 参数进行设置。具体而言,所有配置文件(如 " +":file:`pyconfig.h` 头文件)都安装在目录 :file:`{exec_prefix}/lib/python{X.Y}/config` " +"中,共享库模块安装在 :file:`{exec_prefix}/lib/python{X.Y}/lib-dynload` 中,其中 *X.Y* 是 " +"Python 的版本号,如 ``3.2``。" + +#: ../../library/sys.rst:485 +msgid "" +"If a :ref:`virtual environment ` is in effect, this " +":data:`exec_prefix` will point to the virtual environment. The value for the" +" Python installation will still be available, via :data:`base_exec_prefix`. " +"Refer to :ref:`sys-path-init-virtual-environments` for more information." +msgstr "" +"如果在一个 :ref:`虚拟环境 ` 中,:data:`exec_prefix` 将指向虚拟环境。Python 安装位置仍然可以用 " +":data:`base_exec_prefix` 来获取。详情请参阅 :ref:`sys-path-init-virtual-" +"environments`." + +#: ../../library/sys.rst:492 ../../library/sys.rst:1631 +msgid "" +"When running under a :ref:`virtual environment `, :data:`prefix` " +"and :data:`exec_prefix` are now set to the virtual environment prefix by the" +" :ref:`path initialization `, instead of :mod:`site`. This " +"means that :data:`prefix` and :data:`exec_prefix` always point to the " +"virtual environment, even when :mod:`site` is disabled (:option:`-S`)." +msgstr "" +"如果在一个 :ref:`虚拟环境 ` 中运行,:data:`prefix` 和 :data:`exec_prefix` " +"现在将设置虚拟环境前缀为 :ref:`初始化路径 `,而不是 :mod:`site`。这意味着 " +":data:`prefix` 和 :data:`exec_prefix` 始终指向该虚拟环境,即便在 :mod:`site` 已被禁用时 " +"(:option:`-S`)." + +#: ../../library/sys.rst:501 +msgid "" +"A string giving the absolute path of the executable binary for the Python " +"interpreter, on systems where this makes sense. If Python is unable to " +"retrieve the real path to its executable, :data:`sys.executable` will be an " +"empty string or ``None``." +msgstr "" +"一个字符串,提供 Python 解释器的可执行二进制文件的绝对路径,仅在部分系统中此值有意义。如果 Python 无法获取其可执行文件的真实路径,则 " +":data:`sys.executable` 将为空字符串或 ``None``。" + +#: ../../library/sys.rst:509 +msgid "" +"Raise a :exc:`SystemExit` exception, signaling an intention to exit the " +"interpreter." +msgstr "引发一个 :exc:`SystemExit` 异常,表示打算退出解释器。" + +#: ../../library/sys.rst:511 +msgid "" +"The optional argument *arg* can be an integer giving the exit status " +"(defaulting to zero), or another type of object. If it is an integer, zero " +"is considered \"successful termination\" and any nonzero value is considered" +" \"abnormal termination\" by shells and the like. Most systems require it " +"to be in the range 0--127, and produce undefined results otherwise. Some " +"systems have a convention for assigning specific meanings to specific exit " +"codes, but these are generally underdeveloped; Unix programs generally use 2" +" for command line syntax errors and 1 for all other kinds of errors. If " +"another type of object is passed, ``None`` is equivalent to passing zero, " +"and any other object is printed to :data:`stderr` and results in an exit " +"code of 1. In particular, ``sys.exit(\"some error message\")`` is a quick " +"way to exit a program when an error occurs." +msgstr "" +"可选参数 *arg* 可以是一个表示退出状态的整数(默认为零),或为其他类型的对象。 如果它是整数,则系统 shell " +"等程序会将零值视为“成功终止”而将非零值视为“异常终止”。 大多数系统要求该值范围是 0--127,否则会产生未定义的结果。 " +"某些系统为退出代码约定了特别的含义,但通常并不完善;Unix 程序通常用 2 表示命令行语法错误而用 1 表示所有其他种类的错误。 " +"如果转入了其他类型的对象,则 ``None`` 等同于传入零,而任何其他对象都将被打印到 :data:`stderr` 且退出代码将为 1。 " +"特别要注意,``sys.exit(\"some error message\")`` 是当发生错误时退出程序的快速方式。" + +#: ../../library/sys.rst:524 +msgid "" +"Since :func:`exit` ultimately \"only\" raises an exception, it will only " +"exit the process when called from the main thread, and the exception is not " +"intercepted. Cleanup actions specified by finally clauses of :keyword:`try` " +"statements are honored, and it is possible to intercept the exit attempt at " +"an outer level." +msgstr "" +"由于 :func:`exit` 最终 \"只\" 引发了一个异常,它只在从主线程调用时退出进程,而异常不会被拦截。 :keyword:`try` 语句的" +" finally 子句所指定的清理动作会被遵守,并且有可能在外层拦截退出的尝试。" + +#: ../../library/sys.rst:529 +msgid "" +"If an error occurs in the cleanup after the Python interpreter has caught " +":exc:`SystemExit` (such as an error flushing buffered data in the standard " +"streams), the exit status is changed to 120." +msgstr "" +"在 Python 解释器捕获 :exc:`SystemExit` 后,如果在清理中发生错误(如清除标准流中的缓冲数据时出错),则退出状态码将变为 " +"120。" + +#: ../../library/sys.rst:537 +msgid "" +"The :term:`named tuple` *flags* exposes the status of command line flags. " +"Flags should only be accessed only by name and not by index. The attributes" +" are read only." +msgstr "" +":term:`具名元组 ` *flags* 含有命令行标志的状态。标志应仅通过名称访问,而不应通过索引访问。这些属性是只读的。" + +#: ../../library/sys.rst:544 +msgid ":option:`-d`" +msgstr ":option:`-d`" + +#: ../../library/sys.rst:547 ../../library/sys.rst:550 +msgid ":option:`-i`" +msgstr ":option:`-i`" + +#: ../../library/sys.rst:553 +msgid ":option:`-I`" +msgstr ":option:`-I`" + +#: ../../library/sys.rst:556 +msgid ":option:`-O` or :option:`-OO`" +msgstr ":option:`-O` 或 :option:`-OO`" + +#: ../../library/sys.rst:559 +msgid ":option:`-B`" +msgstr ":option:`-B`" + +#: ../../library/sys.rst:562 +msgid ":option:`-s`" +msgstr ":option:`-s`" + +#: ../../library/sys.rst:565 +msgid ":option:`-S`" +msgstr ":option:`-S`" + +#: ../../library/sys.rst:568 +msgid ":option:`-E`" +msgstr ":option:`-E`" + +#: ../../library/sys.rst:571 +msgid ":option:`-v`" +msgstr ":option:`-v`" + +#: ../../library/sys.rst:574 +msgid ":option:`-b`" +msgstr ":option:`-b`" + +#: ../../library/sys.rst:577 +msgid ":option:`-q`" +msgstr ":option:`-q`" + +#: ../../library/sys.rst:580 +msgid ":option:`-R`" +msgstr ":option:`-R`" + +#: ../../library/sys.rst:583 +msgid ":option:`-X dev <-X>` (:ref:`Python Development Mode `)" +msgstr ":option:`-X dev <-X>` (:ref:`Python 开发模式 `)" + +#: ../../library/sys.rst:586 +msgid ":option:`-X utf8 <-X>`" +msgstr ":option:`-X utf8 <-X>`" + +#: ../../library/sys.rst:589 +msgid ":option:`-P`" +msgstr ":option:`-P`" + +#: ../../library/sys.rst:592 +msgid "" +":option:`-X int_max_str_digits <-X>` (:ref:`integer string conversion length" +" limitation `)" +msgstr "" +":option:`-X int_max_str_digits <-X>` (:ref:`integer string conversion length" +" limitation `)" + +#: ../../library/sys.rst:596 +msgid ":option:`-X warn_default_encoding <-X>`" +msgstr ":option:`-X warn_default_encoding <-X>`" + +#: ../../library/sys.rst:599 +msgid ":option:`-X gil <-X>` and :envvar:`PYTHON_GIL`" +msgstr ":option:`-X gil <-X>` 和 :envvar:`PYTHON_GIL`" + +#: ../../library/sys.rst:602 +msgid "" +":option:`-X thread_inherit_context <-X>` and " +":envvar:`PYTHON_THREAD_INHERIT_CONTEXT`" +msgstr "" +":option:`-X thread_inherit_context <-X>` 和 " +":envvar:`PYTHON_THREAD_INHERIT_CONTEXT`" + +#: ../../library/sys.rst:606 +msgid "" +":option:`-X context_aware_warnings <-X>` and " +":envvar:`PYTHON_CONTEXT_AWARE_WARNINGS`" +msgstr "" +":option:`-X context_aware_warnings <-X>` 和 " +":envvar:`PYTHON_CONTEXT_AWARE_WARNINGS`" + +#: ../../library/sys.rst:610 +msgid "Added ``quiet`` attribute for the new :option:`-q` flag." +msgstr "为新的 :option:`-q` 标志添加了 ``quiet`` 属性" + +#: ../../library/sys.rst:613 +msgid "The ``hash_randomization`` attribute." +msgstr "``hash_randomization`` 属性" + +#: ../../library/sys.rst:616 +msgid "Removed obsolete ``division_warning`` attribute." +msgstr "删除了过时的 ``division_warning`` 属性" + +#: ../../library/sys.rst:619 +msgid "Added ``isolated`` attribute for :option:`-I` ``isolated`` flag." +msgstr "为 :option:`-I` ``isolated`` 标志添加了 ``isolated`` 属性。" + +#: ../../library/sys.rst:622 +msgid "" +"Added the ``dev_mode`` attribute for the new :ref:`Python Development Mode " +"` and the ``utf8_mode`` attribute for the new :option:`-X` " +"``utf8`` flag." +msgstr "" +"为新的 :ref:`Python 开发模式 ` 添加了 ``dev_mode`` 属性,为新的 :option:`-X` " +"``utf8`` 标志添加了 ``utf8_mode`` 属性。" + +#: ../../library/sys.rst:627 +msgid "" +"Added ``warn_default_encoding`` attribute for :option:`-X` " +"``warn_default_encoding`` flag." +msgstr "" +"为 :option:`-X` ``warn_default_encoding`` 旗标添加了 ``warn_default_encoding`` 属性。" + +#: ../../library/sys.rst:630 +msgid "Added the ``safe_path`` attribute for :option:`-P` option." +msgstr "添加了用于 :option:`-P` 选项的 ``safe_path`` 属性。" + +#: ../../library/sys.rst:633 +msgid "Added the ``int_max_str_digits`` attribute." +msgstr "增加了 ``int_max_str_digits`` 属性。" + +#: ../../library/sys.rst:636 +msgid "Added the ``gil`` attribute." +msgstr "增加了 ``gil`` 属性。" + +#: ../../library/sys.rst:639 +msgid "Added the ``thread_inherit_context`` attribute." +msgstr "增加了 ``thread_inherit_context`` 属性。" + +#: ../../library/sys.rst:642 +msgid "Added the ``context_aware_warnings`` attribute." +msgstr "增加了 ``context_aware_warnings`` 属性。" + +#: ../../library/sys.rst:648 +msgid "" +"A :term:`named tuple` holding information about the float type. It contains " +"low level information about the precision and internal representation. The " +"values correspond to the various floating-point constants defined in the " +"standard header file :file:`float.h` for the 'C' programming language; see " +"section 5.2.4.2.2 of the 1999 ISO/IEC C standard [C99]_, 'Characteristics of" +" floating types', for details." +msgstr "" +"一个 :term:`具名元组 `,存有浮点型的相关信息。它包含的是关于精度和内部表示的底层信息。这些值与标准头文件 " +":file:`float.h` 中为 C 语言定义的各种浮点常量对应,详情请参阅 1999 ISO/IEC C 标准 [C99]_ 的 " +"5.2.4.2.2 节,'Characteristics of floating types(浮点型的特性)'。" + +#: ../../library/sys.rst:655 +msgid "Attributes of the :data:`!float_info` :term:`named tuple`" +msgstr ":data:`!float_info` :term:`named tuple` 的属性" + +#: ../../library/sys.rst:658 +msgid "attribute" +msgstr "attribute -- 属性" + +#: ../../library/sys.rst:659 +msgid "float.h macro" +msgstr "float.h 宏" + +#: ../../library/sys.rst:660 +msgid "explanation" +msgstr "说明" + +#: ../../library/sys.rst:663 +msgid ":c:macro:`!DBL_EPSILON`" +msgstr ":c:macro:`!DBL_EPSILON`" + +#: ../../library/sys.rst:664 +msgid "" +"difference between 1.0 and the least value greater than 1.0 that is " +"representable as a float." +msgstr "1.0 与可表示为浮点数的大于 1.0 的最小值之间的差。" + +#: ../../library/sys.rst:667 +msgid "See also :func:`math.ulp`." +msgstr "另请参阅 :func:`math.ulp`。" + +#: ../../library/sys.rst:670 +msgid ":c:macro:`!DBL_DIG`" +msgstr ":c:macro:`!DBL_DIG`" + +#: ../../library/sys.rst:671 +msgid "" +"The maximum number of decimal digits that can be faithfully represented in a" +" float; see below." +msgstr "浮点数可以真实表示的十进制数的最大位数;见下文。" + +#: ../../library/sys.rst:675 +msgid ":c:macro:`!DBL_MANT_DIG`" +msgstr ":c:macro:`!DBL_MANT_DIG`" + +#: ../../library/sys.rst:676 +msgid "" +"Float precision: the number of base-``radix`` digits in the significand of a" +" float." +msgstr "浮点数精度:以 ``radix`` 为基数浮点数的有效位数。" + +#: ../../library/sys.rst:680 +msgid ":c:macro:`!DBL_MAX`" +msgstr ":c:macro:`!DBL_MAX`" + +#: ../../library/sys.rst:681 +msgid "The maximum representable positive finite float." +msgstr "可表示的最大正有限浮点数。" + +#: ../../library/sys.rst:684 +msgid ":c:macro:`!DBL_MAX_EXP`" +msgstr ":c:macro:`!DBL_MAX_EXP`" + +#: ../../library/sys.rst:685 +msgid "" +"The maximum integer *e* such that ``radix**(e-1)`` is a representable finite" +" float." +msgstr "使得 ``radix**(e-1)`` 是可表示的有限浮点数的最大整数 *e*。" + +#: ../../library/sys.rst:689 +msgid ":c:macro:`!DBL_MAX_10_EXP`" +msgstr ":c:macro:`!DBL_MAX_10_EXP`" + +#: ../../library/sys.rst:690 +msgid "" +"The maximum integer *e* such that ``10**e`` is in the range of representable" +" finite floats." +msgstr "使得 ``10**e`` 在可表示的有限浮点数范围内的最大整数 *e*。" + +#: ../../library/sys.rst:694 +msgid ":c:macro:`!DBL_MIN`" +msgstr ":c:macro:`!DBL_MIN`" + +#: ../../library/sys.rst:695 +msgid "The minimum representable positive *normalized* float." +msgstr "可表示的最小正 *规范化* 浮点数。" + +#: ../../library/sys.rst:697 +msgid "" +"Use :func:`math.ulp(0.0) ` to get the smallest positive " +"*denormalized* representable float." +msgstr "使用 :func:`math.ulp(0.0) ` 获取可表示的最小正 *非规格化* 浮点数" + +#: ../../library/sys.rst:701 +msgid ":c:macro:`!DBL_MIN_EXP`" +msgstr ":c:macro:`!DBL_MIN_EXP`" + +#: ../../library/sys.rst:702 +msgid "" +"The minimum integer *e* such that ``radix**(e-1)`` is a normalized float." +msgstr "使得 ``radix**(e-1)`` 是规范化浮点数的最小整数 *e*。" + +#: ../../library/sys.rst:706 +msgid ":c:macro:`!DBL_MIN_10_EXP`" +msgstr ":c:macro:`!DBL_MIN_10_EXP`" + +#: ../../library/sys.rst:707 +msgid "The minimum integer *e* such that ``10**e`` is a normalized float." +msgstr "使得 ``10**e`` 是规范化浮点数的最小整数 *e*。" + +#: ../../library/sys.rst:710 +msgid ":c:macro:`!FLT_RADIX`" +msgstr ":c:macro:`!FLT_RADIX`" + +#: ../../library/sys.rst:711 +msgid "The radix of exponent representation." +msgstr "指数表示法中采用的基数。" + +#: ../../library/sys.rst:714 +msgid ":c:macro:`!FLT_ROUNDS`" +msgstr ":c:macro:`!FLT_ROUNDS`" + +#: ../../library/sys.rst:715 +msgid "" +"An integer representing the rounding mode for floating-point arithmetic. " +"This reflects the value of the system :c:macro:`!FLT_ROUNDS` macro at " +"interpreter startup time:" +msgstr "一个代表浮点运算舍入模式的整数。它反映了解释器启动时系统 :c:macro:`!FLT_ROUNDS` 宏的值:" + +#: ../../library/sys.rst:719 +msgid "``-1``: indeterminable" +msgstr "``-1``: 不确定" + +#: ../../library/sys.rst:720 +msgid "``0``: toward zero" +msgstr "``0``: 向零值" + +#: ../../library/sys.rst:721 +msgid "``1``: to nearest" +msgstr "``1``: 向最近值" + +#: ../../library/sys.rst:722 +msgid "``2``: toward positive infinity" +msgstr "``2``: 向正无穷" + +#: ../../library/sys.rst:723 +msgid "``3``: toward negative infinity" +msgstr "``3``: 向负无穷" + +#: ../../library/sys.rst:725 +msgid "" +"All other values for :c:macro:`!FLT_ROUNDS` characterize implementation-" +"defined rounding behavior." +msgstr ":c:macro:`!FLT_ROUNDS` 的所有其他值被用于代表具体实现所定义的舍入行为。" + +#: ../../library/sys.rst:728 +msgid "" +"The attribute :attr:`sys.float_info.dig` needs further explanation. If " +"``s`` is any string representing a decimal number with at most " +":attr:`!sys.float_info.dig` significant digits, then converting ``s`` to a " +"float and back again will recover a string representing the same decimal " +"value::" +msgstr "" +"属性 :attr:`sys.float_info.dig` 需要进一步的解释。如果 ``s`` 是表示十进制数的字符串,且最多有 " +":attr:`!sys.float_info.dig` 位有效数字,那么将 ``s`` 转换为浮点数再转换回来将恢复为一个表示相同十进制值的字符串::" + +#: ../../library/sys.rst:734 +msgid "" +">>> import sys\n" +">>> sys.float_info.dig\n" +"15\n" +">>> s = '3.14159265358979' # decimal string with 15 significant digits\n" +">>> format(float(s), '.15g') # convert to float and back -> same value\n" +"'3.14159265358979'" +msgstr "" +">>> import sys\n" +">>> sys.float_info.dig\n" +"15\n" +">>> s = '3.14159265358979' # 有 15 个有效位的十进制数字符串\n" +">>> format(float(s), '.15g') # 转换为浮点数再转换回来 -> 相同的值\n" +"'3.14159265358979'" + +#: ../../library/sys.rst:741 +msgid "" +"But for strings with more than :attr:`sys.float_info.dig` significant " +"digits, this isn't always true::" +msgstr "但是对于超过 :attr:`sys.float_info.dig` 位有效数字的字符串,转换前后并非总是相同::" + +#: ../../library/sys.rst:744 +msgid "" +">>> s = '9876543211234567' # 16 significant digits is too many!\n" +">>> format(float(s), '.16g') # conversion changes value\n" +"'9876543211234568'" +msgstr "" +">>> s = '9876543211234567' # 16 个有效位就太多了!\n" +">>> format(float(s), '.16g') # 转换将改变原值\n" +"'9876543211234568'" + +#: ../../library/sys.rst:750 +msgid "" +"A string indicating how the :func:`repr` function behaves for floats. If " +"the string has value ``'short'`` then for a finite float ``x``, ``repr(x)`` " +"aims to produce a short string with the property that ``float(repr(x)) == " +"x``. This is the usual behaviour in Python 3.1 and later. Otherwise, " +"``float_repr_style`` has value ``'legacy'`` and ``repr(x)`` behaves in the " +"same way as it did in versions of Python prior to 3.1." +msgstr "" +"一个字符串,反映 :func:`repr` 函数在浮点数上的行为。如果该字符串是 ``'short'``,那么对于(非无穷的)浮点数 " +"``x``,``repr(x)`` 将会生成一个短字符串,满足 ``float(repr(x)) == x`` 的特性。这是 Python 3.1 " +"及更高版本中的常见行为。否则 ``float_repr_style`` 的值将是 ``'legacy'``,此时 ``repr(x)`` 的行为方式将与" +" Python 3.1 之前的版本相同。" + +#: ../../library/sys.rst:763 +msgid "" +"Return the number of memory blocks currently allocated by the interpreter, " +"regardless of their size. This function is mainly useful for tracking and " +"debugging memory leaks. Because of the interpreter's internal caches, the " +"result can vary from call to call; you may have to call " +":func:`_clear_internal_caches` and :func:`gc.collect` to get more " +"predictable results." +msgstr "" +"返回解释器当前已分配的内存块数,无论它们的大小如何。此函数主要用于跟踪和调试内存泄漏。 因为解释器有内部缓存,所以不同调用的结果会有变化;你可能需要调用" +" :func:`_clear_internal_caches` 和 :func:`gc.collect` 来获得更可预测的结果。" + +#: ../../library/sys.rst:770 +msgid "" +"If a Python build or implementation cannot reasonably compute this " +"information, :func:`getallocatedblocks` is allowed to return 0 instead." +msgstr "如果一个 Python 构建或实现无法合理地计算此信息,则允许 :func:`getallocatedblocks` 返回 0。" + +#: ../../library/sys.rst:778 +msgid "Return the number of unicode objects that have been interned." +msgstr "返回已被驻留的 unicode 对象数量。" + +#: ../../library/sys.rst:785 +msgid "" +"Return the build-time API level of Android as an integer. This represents " +"the minimum version of Android this build of Python can run on. For runtime " +"version information, see :func:`platform.android_ver`." +msgstr "" +"以一个整数的形式返回 Android 的构建时级别。这代表此 Python 构建版可运行的最小 Android 版本。对于运行时版本信息,请查看 " +":func:`platform.android_ver`." + +#: ../../library/sys.rst:796 +msgid "" +"Return ``'utf-8'``. This is the name of the default string encoding, used in" +" methods like :meth:`str.encode`." +msgstr "返回 ``'utf-8'``。这是默认字符编码格式的名称,被用于 :meth:`str.encode` 等方法。" + +#: ../../library/sys.rst:802 +msgid "" +"Return the current value of the flags that are used for :c:func:`dlopen` " +"calls. Symbolic names for the flag values can be found in the :mod:`os` " +"module (:samp:`RTLD_{xxx}` constants, e.g. :const:`os.RTLD_LAZY`)." +msgstr "" +"返回用于 :c:func:`dlopen` 调用的旗标的当前值。旗标值的符号名称可在 :mod:`os` 模块中找到 " +"(:samp:`RTLD_{xxx}` 常量,例如 :const:`os.RTLD_LAZY`)。" + +#: ../../library/sys.rst:812 +msgid "" +"Get the :term:`filesystem encoding `:" +" the encoding used with the :term:`filesystem error handler ` to convert between Unicode filenames and bytes " +"filenames. The filesystem error handler is returned from " +":func:`getfilesystemencodeerrors`." +msgstr "" +"获取 :term:`文件系统编码格式 `: 该编码格式与 " +":term:`文件系统错误处理器 ` 一起使用以便在 Unicode " +"文件名和字节文件名之间进行转换。文件系统错误处理器是从 :func:`getfilesystemencodeerrors` 返回的。" + +#: ../../library/sys.rst:818 +msgid "" +"For best compatibility, str should be used for filenames in all cases, " +"although representing filenames as bytes is also supported. Functions " +"accepting or returning filenames should support either str or bytes and " +"internally convert to the system's preferred representation." +msgstr "" +"为获得最佳兼容性,在任何时候都应使用 str 来表示文件名,尽管使用 bytes 来表示文件名也是受支持的。接受或返回文件名的函数应当支持 str 或 " +"bytes 并在内部将其转换为系统首选的表示形式。" + +#: ../../library/sys.rst:823 ../../library/sys.rst:851 +msgid "" +":func:`os.fsencode` and :func:`os.fsdecode` should be used to ensure that " +"the correct encoding and errors mode are used." +msgstr "应使用 :func:`os.fsencode` 和 :func:`os.fsdecode` 来保证所采用的编码和错误处理方案都是正确的。" + +#: ../../library/sys.rst:826 ../../library/sys.rst:854 +msgid "" +"The :term:`filesystem encoding and error handler` are configured at Python " +"startup by the :c:func:`PyConfig_Read` function: see " +":c:member:`~PyConfig.filesystem_encoding` and " +":c:member:`~PyConfig.filesystem_errors` members of :c:type:`PyConfig`." +msgstr "" +":term:`filesystem encoding and error handler` 是在 Python 启动时通过 " +":c:func:`PyConfig_Read` 函数来配置的:请参阅 :c:type:`PyConfig` 的 " +":c:member:`~PyConfig.filesystem_encoding` 和 " +":c:member:`~PyConfig.filesystem_errors` 等成员。" + +#: ../../library/sys.rst:831 +msgid ":func:`getfilesystemencoding` result cannot be ``None`` anymore." +msgstr ":func:`getfilesystemencoding` 的结果将不再有可能是 ``None``。" + +#: ../../library/sys.rst:834 +msgid "" +"Windows is no longer guaranteed to return ``'mbcs'``. See :pep:`529` and " +":func:`_enablelegacywindowsfsencoding` for more information." +msgstr "" +"Windows 不再保证会返回 ``'mbcs'``。详情请参阅 :pep:`529` 和 " +":func:`_enablelegacywindowsfsencoding`." + +#: ../../library/sys.rst:838 +msgid "" +"Return ``'utf-8'`` if the :ref:`Python UTF-8 Mode ` is enabled." +msgstr "返回 ``'utf-8'``,如果启用了 :ref:`Python UTF-8 模式 ` 的话。" + +#: ../../library/sys.rst:845 +msgid "" +"Get the :term:`filesystem error handler `: the error handler used with the :term:`filesystem encoding " +"` to convert between Unicode " +"filenames and bytes filenames. The filesystem encoding is returned from " +":func:`getfilesystemencoding`." +msgstr "" +"获取 :term:`文件系统错误处理器 `: 该错误处理器与 " +":term:`文件系统编码格式 ` 一起使用以便在 Unicode " +"文件名和字节文件名之间进行转换。文件系统编码格式是由 :func:`getfilesystemencoding` 来返回的。" + +#: ../../library/sys.rst:863 +msgid "" +"Returns the current value for the :ref:`integer string conversion length " +"limitation `. See also :func:`set_int_max_str_digits`." +msgstr "" +"返回 :ref:`整数字符串转换长度限制 ` 的当前值。另请参阅 " +":func:`set_int_max_str_digits`." + +#: ../../library/sys.rst:870 +msgid "" +"Return the reference count of the *object*. The count returned is generally" +" one higher than you might expect, because it includes the (temporary) " +"reference as an argument to :func:`getrefcount`." +msgstr "" +"返回 *object* 的引用计数。返回的计数通常比预期的多一,因为它包括了作为 :func:`getrefcount` 参数的这一次(临时)引用。" + +#: ../../library/sys.rst:874 +msgid "" +"Note that the returned value may not actually reflect how many references to" +" the object are actually held. For example, some objects are " +":term:`immortal` and have a very high refcount that does not reflect the " +"actual number of references. Consequently, do not rely on the returned " +"value to be accurate, other than a value of 0 or 1." +msgstr "" +"请注意返回的值可能并不真正反映实际持有的对象引用数。例如,有些对象属于 :term:`immortal` 对象并具有并不反映实际引用数的非常高的 " +"refcount 值。因此,除了 0 或 1 这两个值,不要依赖返回值的准确性。" + +#: ../../library/sys.rst:882 +msgid "" +":term:`Immortal ` objects with a large reference count can be " +"identified via :func:`_is_immortal`." +msgstr "具有大量引用计数的 :term:`不朽的 ` 对象可以通过 :func:`_is_immortal` 来识别。" + +#: ../../library/sys.rst:885 +msgid "" +"Immortal objects have very large refcounts that do not match the actual " +"number of references to the object." +msgstr "永生对象具有与对象的实际引用次数不相符的非常大的引用计数。" + +#: ../../library/sys.rst:891 +msgid "" +"Return the current value of the recursion limit, the maximum depth of the " +"Python interpreter stack. This limit prevents infinite recursion from " +"causing an overflow of the C stack and crashing Python. It can be set by " +":func:`setrecursionlimit`." +msgstr "" +"返回当前的递归限制值,即 Python 解释器堆栈的最大深度。此限制可防止无限递归导致的 C 堆栈溢出和 Python 崩溃。该值可以通过 " +":func:`setrecursionlimit` 设置。" + +#: ../../library/sys.rst:899 +msgid "" +"Return the size of an object in bytes. The object can be any type of object." +" All built-in objects will return correct results, but this does not have to" +" hold true for third-party extensions as it is implementation specific." +msgstr "返回对象的大小(以字节为单位)。该对象可以是任何类型。所有内建对象返回的结果都是正确的,但对于第三方扩展不一定正确,因为这与具体实现有关。" + +#: ../../library/sys.rst:904 +msgid "" +"Only the memory consumption directly attributed to the object is accounted " +"for, not the memory consumption of objects it refers to." +msgstr "只计算直接分配给对象的内存消耗,不计算它所引用的对象的内存消耗。" + +#: ../../library/sys.rst:907 +msgid "" +"If given, *default* will be returned if the object does not provide means to" +" retrieve the size. Otherwise a :exc:`TypeError` will be raised." +msgstr "对象不提供计算大小的方法时,如果传入过 *default* 则返回它,否则抛出 :exc:`TypeError` 异常。" + +#: ../../library/sys.rst:910 +msgid "" +":func:`getsizeof` calls the object's ``__sizeof__`` method and adds an " +"additional garbage collector overhead if the object is managed by the " +"garbage collector." +msgstr "" +"如果对象由垃圾回收器管理,则 :func:`getsizeof` 将调用对象的 ``__sizeof__`` 方法,并额外加上垃圾回收器的开销。" + +#: ../../library/sys.rst:914 +msgid "" +"See `recursive sizeof recipe " +"`_ for an example of using :func:`getsizeof` " +"recursively to find the size of containers and all their contents." +msgstr "" +"请参阅 `recursive sizeof recipe " +"`_ 获取一个递归地使用 :func:`getsizeof` 来找出各个容器及其全部内容大小的示例。" + +#: ../../library/sys.rst:920 +msgid "" +"Return the interpreter's \"thread switch interval\" in seconds; see " +":func:`setswitchinterval`." +msgstr "返回解释器的以秒为单位的“线程切换间隔时间”;参见 :func:`setswitchinterval`。" + +#: ../../library/sys.rst:928 +msgid "" +"Return a frame object from the call stack. If optional integer *depth* is " +"given, return the frame object that many calls below the top of the stack. " +"If that is deeper than the call stack, :exc:`ValueError` is raised. The " +"default for *depth* is zero, returning the frame at the top of the call " +"stack." +msgstr "" +"返回来自调用栈的一个帧对象。如果传入可选整数 *depth*,则返回从栈顶往下相应调用层数的帧对象。如果该数比调用栈更深,则抛出 " +":exc:`ValueError`。*depth* 的默认值是 0,返回调用栈顶部的帧。" + +#: ../../library/sys.rst:933 +msgid "" +"Raises an :ref:`auditing event ` ``sys._getframe`` with argument " +"``frame``." +msgstr "引发一个 :ref:`审计事件 ` ``sys._getframe`` 并附带参数 ``frame``。" + +#: ../../library/sys.rst:937 ../../library/sys.rst:953 +msgid "" +"This function should be used for internal and specialized purposes only. It " +"is not guaranteed to exist in all implementations of Python." +msgstr "这个函数应该只在内部为了一些特定的目的使用。不保证它在所有 Python 实现中都存在。" + +#: ../../library/sys.rst:943 +msgid "" +"Return the name of a module from the call stack. If optional integer " +"*depth* is given, return the module that many calls below the top of the " +"stack. If that is deeper than the call stack, or if the module is " +"unidentifiable, ``None`` is returned. The default for *depth* is zero, " +"returning the module at the top of the call stack." +msgstr "" +"从调用栈返回一个模块的名称。如果给出了可选的整数 *depth*,则返回从栈顶往下相应调用层数的模块。 " +"如果该数值比调用栈更深,或者如果该模块不可被标识,则返回 ``None``。 *depth* 的默认值为零,即返回位于调用栈顶端的模块。" + +#: ../../library/sys.rst:949 +msgid "" +"Raises an :ref:`auditing event ` ``sys._getframemodulename`` with " +"argument ``depth``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``sys._getframemodulename`` 并附带参数 ``depth``。" + +#: ../../library/sys.rst:961 +msgid "" +"This function only exists if CPython was built using the specialized " +"configure option :option:`--with-trace-refs`. It is intended only for " +"debugging garbage-collection issues." +msgstr "" +"此函数仅当 CPython 使用专门的配置选项 :option:`--with-trace-refs` 构建时才存在。它仅针对调试垃圾回收问题而设计。" + +#: ../../library/sys.rst:965 +msgid "" +"Return a list of up to *limit* dynamically allocated Python objects. If " +"*type* is given, only objects of that exact type (not subtypes) are " +"included." +msgstr "" +"返回由至多 *limit* 个动态分配的 Python 对象组成的列表。如果给定了 *type*,则仅会包括该特定类型(不包括子类型)的对象。" + +#: ../../library/sys.rst:969 +msgid "" +"Objects from the list are not safe to use. Specifically, the result will " +"include objects from all interpreters that share their object allocator " +"state (that is, ones created with " +":c:member:`PyInterpreterConfig.use_main_obmalloc` set to 1 or using " +":c:func:`Py_NewInterpreter`, and the :ref:`main interpreter `). Mixing objects from different interpreters may lead " +"to crashes or other unexpected behavior." +msgstr "" +"使用来自该列表的对象并不保证安全。具体来说,该结果将包括来自共享对象分配状态的所有解释器的对象 (即创建时是将 " +":c:member:`PyInterpreterConfig.use_main_obmalloc` 设为 1 或是使用 " +":c:func:`Py_NewInterpreter`,以及 :ref:`主解释器 `)。 " +"混合来自不同解释器的对象可能导致程序崩溃或其他非预期的行为。" + +#: ../../library/sys.rst:980 ../../library/sys.rst:1388 +msgid "" +"This function should be used for specialized purposes only. It is not " +"guaranteed to exist in all implementations of Python." +msgstr "此函数应当仅用于一些特定的目的。并不保证它在所有 Python 实现中都存在。" + +#: ../../library/sys.rst:985 +msgid "The result may include objects from other interpreters." +msgstr "结果可能包括来自其他解释器的对象。" + +#: ../../library/sys.rst:994 +msgid "Get the profiler function as set by :func:`setprofile`." +msgstr "返回由 :func:`setprofile` 设置的性能分析函数。" + +#: ../../library/sys.rst:1003 +msgid "Get the trace function as set by :func:`settrace`." +msgstr "返回由 :func:`settrace` 设置的跟踪函数。" + +#: ../../library/sys.rst:1007 +msgid "" +"The :func:`gettrace` function is intended only for implementing debuggers, " +"profilers, coverage tools and the like. Its behavior is part of the " +"implementation platform, rather than part of the language definition, and " +"thus may not be available in all Python implementations." +msgstr "" +":func:`gettrace` 函数仅用于实现调试器,性能分析器,打包工具等。它的行为是实现平台的一部分,而不是语言定义的一部分,因此并非在所有 " +"Python 实现中都可用。" + +#: ../../library/sys.rst:1015 +msgid "" +"Return a named tuple describing the Windows version currently running. The " +"named elements are *major*, *minor*, *build*, *platform*, *service_pack*, " +"*service_pack_minor*, *service_pack_major*, *suite_mask*, *product_type* and" +" *platform_version*. *service_pack* contains a string, *platform_version* a " +"3-tuple and all other values are integers. The components can also be " +"accessed by name, so ``sys.getwindowsversion()[0]`` is equivalent to " +"``sys.getwindowsversion().major``. For compatibility with prior versions, " +"only the first 5 elements are retrievable by indexing." +msgstr "" +"返回一个具名元组,描述当前正在运行的 Windows 版本。元素名称包括 *major*, *minor*, *build*, *platform*, " +"*service_pack*, *service_pack_minor*, *service_pack_major*, *suite_mask*, " +"*product_type* 和 *platform_version*。*service_pack* " +"包含一个字符串,*platform_version* 包含一个三元组,其他所有值都是整数。元素也可以通过名称来访问,所以 " +"``sys.getwindowsversion()[0]`` 与 ``sys.getwindowsversion().major`` " +"是等效的。为保持与旧版本的兼容性,只有前 5 个元素可以用索引检索。" + +#: ../../library/sys.rst:1026 +msgid "*platform* will be ``2`` (VER_PLATFORM_WIN32_NT)." +msgstr "*platform* 将为 ``2`` (VER_PLATFORM_WIN32_NT)。" + +#: ../../library/sys.rst:1028 +msgid "*product_type* may be one of the following values:" +msgstr "*product_type* 可能是以下值之一:" + +#: ../../library/sys.rst:1031 +msgid "Constant" +msgstr "常量" + +#: ../../library/sys.rst:1031 +msgid "Meaning" +msgstr "含意" + +#: ../../library/sys.rst:1033 +msgid "``1`` (VER_NT_WORKSTATION)" +msgstr "``1`` (VER_NT_WORKSTATION)" + +#: ../../library/sys.rst:1033 +msgid "The system is a workstation." +msgstr "系统是工作站。" + +#: ../../library/sys.rst:1035 +msgid "``2`` (VER_NT_DOMAIN_CONTROLLER)" +msgstr "``2`` (VER_NT_DOMAIN_CONTROLLER)" + +#: ../../library/sys.rst:1035 +msgid "The system is a domain controller." +msgstr "系统是域控制器。" + +#: ../../library/sys.rst:1038 +msgid "``3`` (VER_NT_SERVER)" +msgstr "``3`` (VER_NT_SERVER)" + +#: ../../library/sys.rst:1038 +msgid "The system is a server, but not a domain controller." +msgstr "系统是服务器,但不是域控制器。" + +#: ../../library/sys.rst:1042 +msgid "" +"This function wraps the Win32 :c:func:`!GetVersionEx` function; see the " +"Microsoft documentation on :c:func:`!OSVERSIONINFOEX` for more information " +"about these fields." +msgstr "" +"该函数包装了 Win32 :c:func:`!GetVersionEx` 函数;有关这些字段的更多信息请参阅 " +":c:func:`!OSVERSIONINFOEX` 的 Microsoft 文档。" + +#: ../../library/sys.rst:1046 +msgid "" +"*platform_version* returns the major version, minor version and build number" +" of the current operating system, rather than the version that is being " +"emulated for the process. It is intended for use in logging rather than for " +"feature detection." +msgstr "" +"*platform_version* 返回当前操作系统的主要版本、次要版本和编译版本号,而不是为该进程所模拟的版本。它旨在用于日志记录而非特性检测。" + +#: ../../library/sys.rst:1052 +msgid "" +"*platform_version* derives the version from kernel32.dll which can be of a " +"different version than the OS version. Please use :mod:`platform` module for" +" achieving accurate OS version." +msgstr "" +"*platform_version* 会从 kernel32.dll 获取版本号,这个版本可能与 OS 版本不同。请使用 :mod:`platform`" +" 模块来获取准确的 OS 版本号。" + +#: ../../library/sys.rst:1058 +msgid "" +"Changed to a named tuple and added *service_pack_minor*, " +"*service_pack_major*, *suite_mask*, and *product_type*." +msgstr "" +"更改为具名元组,添加 *service_pack_minor*, *service_pack_major*, *suite_mask* 和 " +"*product_type*." + +#: ../../library/sys.rst:1062 +msgid "Added *platform_version*" +msgstr "添加了 *platform_version*" + +#: ../../library/sys.rst:1068 +msgid "" +"Returns an *asyncgen_hooks* object, which is similar to a " +":class:`~collections.namedtuple` of the form ``(firstiter, finalizer)``, " +"where *firstiter* and *finalizer* are expected to be either ``None`` or " +"functions which take an :term:`asynchronous generator iterator` as an " +"argument, and are used to schedule finalization of an asynchronous generator" +" by an event loop." +msgstr "" +"返回一个 *asyncgen_hooks* 对象,该对象类似于 ``(firstiter, finalizer)`` 形式的 " +":class:`~collections.namedtuple`,其中 *firstiter* 和 *finalizer* 应为 ``None`` " +"或是一个接受 :term:`asynchronous generator iterator` " +"作为参数的函数,并被用来在事件循环中调度异步生成器的最终化。" + +#: ../../library/sys.rst:1075 +msgid "See :pep:`525` for more details." +msgstr "详情请参阅 :pep:`525`。" + +#: ../../library/sys.rst:1079 ../../library/sys.rst:1878 +msgid "" +"This function has been added on a provisional basis (see :pep:`411` for " +"details.)" +msgstr "本函数已添加至暂定类别 (详情请参阅 :pep:`411`)。" + +#: ../../library/sys.rst:1085 +msgid "" +"Get the current coroutine origin tracking depth, as set by " +":func:`set_coroutine_origin_tracking_depth`." +msgstr "获取由 :func:`set_coroutine_origin_tracking_depth` 设置的协程来源的追踪深度。" + +#: ../../library/sys.rst:1091 ../../library/sys.rst:1899 +msgid "" +"This function has been added on a provisional basis (see :pep:`411` for " +"details.) Use it only for debugging purposes." +msgstr "本函数已添加至暂定类别 (详情请参阅 :pep:`411`)。仅将其用于调试目的。" + +#: ../../library/sys.rst:1097 +msgid "" +"A :term:`named tuple` giving parameters of the numeric hash implementation." +" For more details about hashing of numeric types, see :ref:`numeric-hash`." +msgstr "" +"一个 :term:`具名元组 `,给出数字类型的哈希的实现参数。关于数字类型的哈希的详情请参阅 :ref:`numeric-" +"hash`." + +#: ../../library/sys.rst:1103 +msgid "The width in bits used for hash values" +msgstr "用于哈希值的位宽度" + +#: ../../library/sys.rst:1107 +msgid "The prime modulus P used for numeric hash scheme" +msgstr "用于数字哈希方案的质数模数 P" + +#: ../../library/sys.rst:1111 +msgid "The hash value returned for a positive infinity" +msgstr "为正无穷大返回的哈希值" + +#: ../../library/sys.rst:1115 +msgid "(This attribute is no longer used)" +msgstr "(该属性已不再被使用)" + +#: ../../library/sys.rst:1119 +msgid "The multiplier used for the imaginary part of a complex number" +msgstr "用于复数虚部的乘数" + +#: ../../library/sys.rst:1123 +msgid "The name of the algorithm for hashing of str, bytes, and memoryview" +msgstr "对字符串、字节串和内存视图进行哈希的算法名称" + +#: ../../library/sys.rst:1127 +msgid "The internal output size of the hash algorithm" +msgstr "哈希算法的内部输出大小" + +#: ../../library/sys.rst:1131 +msgid "The size of the seed key of the hash algorithm" +msgstr "哈希算法种子密钥的大小" + +#: ../../library/sys.rst:1135 +msgid "Cutoff for small string DJBX33A optimization in range ``[1, cutoff)``." +msgstr "用于 ``[1, cutoff)`` 范围内小型字符串的 DJBX33A 优化的截取值。" + +#: ../../library/sys.rst:1139 +msgid "Added *algorithm*, *hash_bits*, *seed_bits*, and *cutoff*." +msgstr "增加了 *algorithm*, *hash_bits*, *seed_bits* 和 *cutoff*。" + +#: ../../library/sys.rst:1145 +msgid "" +"The version number encoded as a single integer. This is guaranteed to " +"increase with each version, including proper support for non-production " +"releases. For example, to test that the Python interpreter is at least " +"version 1.5.2, use::" +msgstr "" +"编码为单个整数的版本号。该整数会确保每个版本都自增,其中适当包括了未发布版本。举例来说,要测试 Python 解释器的版本不低于 1.5.2,请使用::" + +#: ../../library/sys.rst:1149 +msgid "" +"if sys.hexversion >= 0x010502F0:\n" +" # use some advanced feature\n" +" ...\n" +"else:\n" +" # use an alternative implementation or warn the user\n" +" ..." +msgstr "" +"if sys.hexversion >= 0x010502F0:\n" +" # 使用某些高级特性\n" +" ...\n" +"else:\n" +" # 使用替代实现或警告用户\n" +" ..." + +#: ../../library/sys.rst:1156 +msgid "" +"This is called ``hexversion`` since it only really looks meaningful when " +"viewed as the result of passing it to the built-in :func:`hex` function. " +"The :term:`named tuple` :data:`sys.version_info` may be used for a more " +"human-friendly encoding of the same information." +msgstr "" +"之所以称它为 ``hexversion``,是因为只有将它传入内置函数 :func:`hex` 后,其结果才看起来有意义。也可以使用 " +":term:`具名元组 ` :data:`sys.version_info`,它对相同信息有着更人性化的编码。" + +#: ../../library/sys.rst:1161 +msgid "More details of ``hexversion`` can be found at :ref:`apiabiversion`." +msgstr "关于 ``hexversion`` 的更多信息可以在 :ref:`apiabiversion` 中找到。" + +#: ../../library/sys.rst:1166 +msgid "" +"An object containing information about the implementation of the currently " +"running Python interpreter. The following attributes are required to exist " +"in all Python implementations." +msgstr "一个对象,该对象包含当前运行的 Python 解释器的实现信息。所有 Python 实现中都必须存在下列属性。" + +#: ../../library/sys.rst:1170 +msgid "" +"*name* is the implementation's identifier, e.g. ``'cpython'``. The actual " +"string is defined by the Python implementation, but it is guaranteed to be " +"lower case." +msgstr "*name* 是当前实现的标识符,如 ``'cpython'``。实际的字符串由 Python 实现定义,但保证是小写字母。" + +#: ../../library/sys.rst:1174 +msgid "" +"*version* is a named tuple, in the same format as :data:`sys.version_info`." +" It represents the version of the Python *implementation*. This has a " +"distinct meaning from the specific version of the Python *language* to which" +" the currently running interpreter conforms, which ``sys.version_info`` " +"represents. For example, for PyPy 1.8 ``sys.implementation.version`` might " +"be ``sys.version_info(1, 8, 0, 'final', 0)``, whereas ``sys.version_info`` " +"would be ``sys.version_info(2, 7, 2, 'final', 0)``. For CPython they are " +"the same value, since it is the reference implementation." +msgstr "" +"*version* 是一个具名元组,格式与 :data:`sys.version_info` 相同。它表示 Python *实现* 的版本。另一个(由 " +"``sys.version_info`` 表示)是当前解释器遵循的相应 Python *语言* 的版本,两者具有不同的含义。例如,对于 PyPy " +"1.8,``sys.implementation.version`` 可能是 ``sys.version_info(1, 8, 0, 'final', " +"0)``,而 ``sys.version_info`` 则是 ``sys.version_info(2, 7, 2, 'final', 0)``。对于 " +"CPython 而言两个值是相同的,因为它是参考实现。" + +#: ../../library/sys.rst:1184 +msgid "" +"*hexversion* is the implementation version in hexadecimal format, like " +":data:`sys.hexversion`." +msgstr "*hexversion* 是十六进制的实现版本,类似于 :data:`sys.hexversion`。" + +#: ../../library/sys.rst:1187 +msgid "" +"*cache_tag* is the tag used by the import machinery in the filenames of " +"cached modules. By convention, it would be a composite of the " +"implementation's name and version, like ``'cpython-33'``. However, a Python" +" implementation may use some other value if appropriate. If ``cache_tag`` " +"is set to ``None``, it indicates that module caching should be disabled." +msgstr "" +"*cache_tag* 是导入机制使用的标记,用于已缓存模块的文件名。按照惯例,它将由实现的名称和版本组成,如 " +"``'cpython-33'``。但如果合适,Python 实现可以使用其他值。如果 ``cache_tag`` 被置为 " +"``None``,表示模块缓存已禁用。" + +#: ../../library/sys.rst:1194 +msgid "" +"*supports_isolated_interpreters* is a boolean value, whether this " +"implementation supports multiple isolated interpreters. It is ``True`` for " +"CPython on most platforms. Platforms with this support implement the low-" +"level :mod:`!_interpreters` module." +msgstr "" +"*supports_isolated_interpreters* 是一个布尔值,表示该实现是否支持多个隔离解释器。对于大多数平台上的 CPython " +"来说,它是 ``True``。具有此支持的平台实现底层 :mod:`!_interpreters` 模块。" + +#: ../../library/sys.rst:1201 +msgid ":pep:`684`, :pep:`734`, and :mod:`concurrent.interpreters`." +msgstr ":pep:`684`, :pep:`734` 以及 :mod:`concurrent.interpreters`。" + +#: ../../library/sys.rst:1203 +msgid "" +":data:`sys.implementation` may contain additional attributes specific to the" +" Python implementation. These non-standard attributes must start with an " +"underscore, and are not described here. Regardless of its contents, " +":data:`sys.implementation` will not change during a run of the interpreter, " +"nor between implementation versions. (It may change between Python language" +" versions, however.) See :pep:`421` for more information." +msgstr "" +":data:`sys.implementation` 可能包含相应 Python " +"实现的其他属性。这些非标准属性必须以下划线开头,此处不详细阐述。无论其内容如何,:data:`sys.implementation` " +"在解释器运行期间或不同实现版本之间都不会更改。(但是不同 Python 语言版本间可能会不同。)详情请参阅 :pep:`421`。" + +#: ../../library/sys.rst:1212 +msgid "Added ``supports_isolated_interpreters`` field." +msgstr "增加了 ``supports_isolated_interpreters`` 字段。" + +#: ../../library/sys.rst:1217 +msgid "" +"The addition of new required attributes must go through the normal PEP " +"process. See :pep:`421` for more information." +msgstr "新的必要属性的添加必须经过常规的 PEP 过程。详情请参阅 :pep:`421`。" + +#: ../../library/sys.rst:1222 +msgid "" +"A :term:`named tuple` that holds information about Python's internal " +"representation of integers. The attributes are read only." +msgstr "一个 :term:`具名元组 `,包含 Python 内部整数表示形式的信息。这些属性是只读的。" + +#: ../../library/sys.rst:1227 +msgid "" +"The number of bits held in each digit. Python integers are stored internally" +" in base ``2**int_info.bits_per_digit``." +msgstr "每个数位占用的比特位数。Python 整数在内部以 ``2**int_info.bits_per_digit`` 为基数存储。" + +#: ../../library/sys.rst:1232 +msgid "The size in bytes of the C type used to represent a digit." +msgstr "用于表示一个数位的 C 类型的以字节为单位的大小。" + +#: ../../library/sys.rst:1236 +msgid "" +"The default value for :func:`sys.get_int_max_str_digits` when it is not " +"otherwise explicitly configured." +msgstr ":func:`sys.get_int_max_str_digits` 在未被显式配置时所使用的默认值。" + +#: ../../library/sys.rst:1241 +msgid "" +"The minimum non-zero value for :func:`sys.set_int_max_str_digits`, " +":envvar:`PYTHONINTMAXSTRDIGITS`, or :option:`-X int_max_str_digits <-X>`." +msgstr "" +":func:`sys.set_int_max_str_digits`, :envvar:`PYTHONINTMAXSTRDIGITS` 或 " +":option:`-X int_max_str_digits <-X>` 的最小非零值。" + +#: ../../library/sys.rst:1248 +msgid "" +"Added :attr:`~int_info.default_max_str_digits` and " +":attr:`~int_info.str_digits_check_threshold`." +msgstr "" +"添加了 :attr:`~int_info.default_max_str_digits` 和 " +":attr:`~int_info.str_digits_check_threshold`." + +#: ../../library/sys.rst:1254 +msgid "" +"When this attribute exists, its value is automatically called (with no " +"arguments) when the interpreter is launched in :ref:`interactive mode `. This is done after the :envvar:`PYTHONSTARTUP` file is read," +" so that you can set this hook there. The :mod:`site` module :ref:`sets " +"this `." +msgstr "" +"当本属性存在,则以 :ref:`交互模式 ` 启动解释器时,将自动(不带参数地)调用本属性的值。该过程是在读取 " +":envvar:`PYTHONSTARTUP` 文件之后完成的,所以可以在该文件中设置这一钩子。:mod:`site` 模块 :ref:`设置了这一属性" +" `." + +#: ../../library/sys.rst:1260 ../../library/sys.rst:1262 +msgid "" +"Raises an :ref:`auditing event ` ``cpython.run_interactivehook`` " +"with the hook object as the argument when the hook is called on startup." +msgstr "" +"如果在启动时调用了钩子,则引发一个 :ref:`审计事件 ` " +"``cpython.run_interactivehook``,附带参数为 hook 对象。" + +#: ../../library/sys.rst:1271 +msgid "" +"Enter *string* in the table of \"interned\" strings and return the interned " +"string -- which is *string* itself or a copy. Interning strings is useful to" +" gain a little performance on dictionary lookup -- if the keys in a " +"dictionary are interned, and the lookup key is interned, the key comparisons" +" (after hashing) can be done by a pointer compare instead of a string " +"compare. Normally, the names used in Python programs are automatically " +"interned, and the dictionaries used to hold module, class or instance " +"attributes have interned keys." +msgstr "" +"将 *string* 插入 \"interned\" (驻留)字符串表,返回被插入的字符串 -- 它是 *string* " +"本身或副本。驻留字符串对提高字典查找的性能很有用 -- " +"如果字典中的键已驻留,且所查找的键也已驻留,则键(取散列后)的比较可以用指针代替字符串来比较。通常,Python " +"程序使用到的名称会被自动驻留,且用于保存模块、类或实例属性的字典的键也已驻留。" + +#: ../../library/sys.rst:1279 +msgid "" +"Interned strings are not :term:`immortal`; you must keep a reference to the " +"return value of :func:`intern` around to benefit from it." +msgstr "驻留字符串不属于 :term:`immortal` 对象;你必须保留一个对 :func:`intern` 返回值的引用才能发挥其优势。" + +#: ../../library/sys.rst:1285 +msgid "" +"Return :const:`True` if the :term:`GIL` is enabled and :const:`False` if it " +"is disabled." +msgstr "如果 :term:`GIL` 已启用则返回 :const:`True` 而如果已禁用则返回 :const:`False`。" + +#: ../../library/sys.rst:1292 ../../library/sys.rst:1400 +msgid "It is not guaranteed to exist in all implementations of Python." +msgstr "不保证存在于所有的 Python 实现。" + +#: ../../library/sys.rst:1296 +msgid "" +"Return :const:`True` if the main Python interpreter is :term:`shutting down " +"`. Return :const:`False` otherwise." +msgstr "" +"如果主 Python 解释器 :term:`正在关闭 ` 则返回 :const:`True`。 " +"在其他情况下返回 :const:`False`。" + +#: ../../library/sys.rst:1299 +msgid "See also the :exc:`PythonFinalizationError` exception." +msgstr "另请参阅 :exc:`PythonFinalizationError` 异常。" + +#: ../../library/sys.rst:1305 +msgid "Utilities for observing just-in-time compilation." +msgstr "用于观察即时编译的工具。" + +#: ../../library/sys.rst:1309 +msgid "" +"JIT compilation is an *experimental implementation detail* of CPython. " +"``sys._jit`` is not guaranteed to exist or behave the same way in all Python" +" implementations, versions, or build configurations." +msgstr "" +"JIT 编译是 CPython 的一个 *实验性实现细节*。``sys._jit`` 不能保证在所有 Python " +"实现、版本或构建配置中都以相同的方式存在或表现。" + +#: ../../library/sys.rst:1317 +msgid "" +"Return ``True`` if the current Python executable supports JIT compilation, " +"and ``False`` otherwise. This can be controlled by building CPython with " +"the ``--experimental-jit`` option on Windows, and the :option:`--enable-" +"experimental-jit` option on all other platforms." +msgstr "" +"如果当前 Python 可执行文件支持 JIT 编译,返回 ``True``,否则返回 ``False``。在 Windows 上这可以通过使用 " +"``--experimental-jit`` 选项构建 CPython 来控制,在其他所有平台上使用 :option:`--enable-" +"experimental-jit` 选项。" + +#: ../../library/sys.rst:1324 +msgid "" +"Return ``True`` if JIT compilation is enabled for the current Python process" +" (implies :func:`sys._jit.is_available`), and ``False`` otherwise. If JIT " +"compilation is available, this can be controlled by setting the " +":envvar:`PYTHON_JIT` environment variable to ``0`` (disabled) or ``1`` " +"(enabled) at interpreter startup." +msgstr "" +"如果当前 Python 进程启用了 JIT 编译,则返回 ``True`` (意味着 " +":func:`sys._jit.is_available`),否则返回 ``False``。如果 JIT 编译可用,可以通过在解释器启动时将 " +":envvar:`PYTHON_JIT` 环境变量设置为 ``0`` (禁用) 或 ``1`` (启用) 来控制。" + +#: ../../library/sys.rst:1332 +msgid "" +"Return ``True`` if the topmost Python frame is currently executing JIT code " +"(implies :func:`sys._jit.is_enabled`), and ``False`` otherwise." +msgstr "" +"如果最顶层的 Python 帧当前正在执行 JIT 代码,则返回 ``True`` (意味着 " +":func:`sys._jit.is_enabled`),否则返回 ``False``。" + +#: ../../library/sys.rst:1337 +msgid "" +"This function is intended for testing and debugging the JIT itself. It " +"should be avoided for any other purpose." +msgstr "此函数用于测试和调试 JIT 本身。任何其他用途都应避免使用。" + +#: ../../library/sys.rst:1342 +msgid "" +"Due to the nature of tracing JIT compilers, repeated calls to this function " +"may give surprising results. For example, branching on its return value will" +" likely lead to unexpected behavior (if doing so causes JIT code to be " +"entered or exited):" +msgstr "" +"由于跟踪 JIT 编译器的性质,对这个函数的重复调用可能会产生令人惊讶的结果。例如,对其返回值进行分支可能会导致意外行为(如果这样做会导致进入或退出 " +"JIT 代码):" + +#: ../../library/sys.rst:1347 +msgid "" +">>> for warmup in range(BIG_NUMBER):\n" +"... # This line is \"hot\", and is eventually JIT-compiled:\n" +"... if sys._jit.is_active():\n" +"... # This line is \"cold\", and is run in the interpreter:\n" +"... assert sys._jit.is_active()\n" +"...\n" +"Traceback (most recent call last):\n" +" File \"\", line 5, in \n" +" assert sys._jit.is_active()\n" +" ~~~~~~~~~~~~~~~~~~^^\n" +"AssertionError" +msgstr "" +">>> for warmup in range(BIG_NUMBER):\n" +"... # 这一行是“hot”,并最终被 jit 编译:\n" +"... if sys._jit.is_active():\n" +"... # 这一行是“cold”,在解释器中运行:\n" +"... assert sys._jit.is_active()\n" +"...\n" +"Traceback (most recent call last):\n" +" File \"\", line 5, in \n" +" assert sys._jit.is_active()\n" +" ~~~~~~~~~~~~~~~~~~^^\n" +"AssertionError" + +#: ../../library/sys.rst:1363 +msgid "" +"This variable is not always defined; it is set to the exception instance " +"when an exception is not handled and the interpreter prints an error message" +" and a stack traceback. Its intended use is to allow an interactive user to" +" import a debugger module and engage in post-mortem debugging without having" +" to re-execute the command that caused the error. (Typical use is ``import " +"pdb; pdb.pm()`` to enter the post-mortem debugger; see :mod:`pdb` module for" +" more information.)" +msgstr "" +"该变量并非总是会被定义;当有未处理的异常时它将被设为相应的异常实例并且解释器将打印异常消息和栈回溯。它的预期用途是允许交互用户导入调试器模块并进行事后调试而不必重新运行导致了错误的命令。" +" (典型用法是执行 ``import pdb; pdb.pm()`` 来进入事后调试器;请参阅 :mod:`pdb` 了解详情。)" + +#: ../../library/sys.rst:1375 +msgid "" +"Return :const:`True` if the given object is :term:`immortal`, :const:`False`" +" otherwise." +msgstr "如果给定对象是 :term:`immortal` 则返回 :const:`True`,否则返回 :const:`False`。" + +#: ../../library/sys.rst:1380 +msgid "" +"Objects that are immortal (and thus return ``True`` upon being passed to " +"this function) are not guaranteed to be immortal in future versions, and " +"vice versa for mortal objects." +msgstr "永生的对象 (因此在传递给此函数时返回 ``True``) 不能保证在未来的版本中也是永生的,对于普通对象则相反。" + +#: ../../library/sys.rst:1393 +msgid "" +"Return :const:`True` if the given string is \"interned\", :const:`False` " +"otherwise." +msgstr "如果给定的字符串为“驻留字符串”则返回 :const:`True`,在其他情况下返回 :const:`False`。" + +#: ../../library/sys.rst:1407 +msgid "" +"These three variables are deprecated; use :data:`sys.last_exc` instead. They" +" hold the legacy representation of ``sys.last_exc``, as returned from " +":func:`exc_info` above." +msgstr "" +"这三个变量已被弃用;请改用 :data:`sys.last_exc`。它们将保存 ``sys.last_exc`` 的旧表示形式,如上面 " +":func:`exc_info` 所返回的。" + +#: ../../library/sys.rst:1413 +msgid "" +"An integer giving the maximum value a variable of type :c:type:`Py_ssize_t` " +"can take. It's usually ``2**31 - 1`` on a 32-bit platform and ``2**63 - 1``" +" on a 64-bit platform." +msgstr "" +"一个整数,表示 :c:type:`Py_ssize_t` 类型的变量可以取到的最大值。在 32 位平台上通常为 ``2**31 - 1``,在 64 " +"位平台上通常为 ``2**63 - 1``。" + +#: ../../library/sys.rst:1420 +msgid "" +"An integer giving the value of the largest Unicode code point, i.e. " +"``1114111`` (``0x10FFFF`` in hexadecimal)." +msgstr "一个整数,表示最大的 Unicode 码点值,如 ``1114111`` (十六进制为 ``0x10FFFF``)。" + +#: ../../library/sys.rst:1423 +msgid "" +"Before :pep:`393`, ``sys.maxunicode`` used to be either ``0xFFFF`` or " +"``0x10FFFF``, depending on the configuration option that specified whether " +"Unicode characters were stored as UCS-2 or UCS-4." +msgstr "" +"在 :pep:`393` 之前,``sys.maxunicode`` 曾是 ``0xFFFF`` 或 " +"``0x10FFFF``,具体取决于配置选项,该选项指定将 Unicode 字符存储为 UCS-2 还是 UCS-4。" + +#: ../../library/sys.rst:1431 +msgid "" +"A list of :term:`meta path finder` objects that have their " +":meth:`~importlib.abc.MetaPathFinder.find_spec` methods called to see if one" +" of the objects can find the module to be imported. By default, it holds " +"entries that implement Python's default import semantics. The " +":meth:`~importlib.abc.MetaPathFinder.find_spec` method is called with at " +"least the absolute name of the module being imported. If the module to be " +"imported is contained in a package, then the parent package's " +":attr:`~module.__path__` attribute is passed in as a second argument. The " +"method returns a :term:`module spec`, or ``None`` if the module cannot be " +"found." +msgstr "" +"一个由 :term:`meta path finder` 对象组成的列表,这些对象的 " +":meth:`~importlib.abc.MetaPathFinder.find_spec` 方法将会被调用以确定其中的某个对象能否找到要导入的模块。" +" 在默认情况下,它将存放实现了 Python 默认导入语法的条目。调用 " +":meth:`~importlib.abc.MetaPathFinder.find_spec` 方法至少要附带待导入模块的绝对名称。 " +"如果待导入模块包含在一个包中,则父包的 :attr:`~module.__path__` 属性将作为第二个参数被传入。此方法将返回一个 " +":term:`module spec`,或者如果找不到模块则返回 ``None``。" + +#: ../../library/sys.rst:1444 +msgid ":class:`importlib.abc.MetaPathFinder`" +msgstr ":class:`importlib.abc.MetaPathFinder`" + +#: ../../library/sys.rst:1445 +msgid "" +"The abstract base class defining the interface of finder objects on " +":data:`meta_path`." +msgstr "抽象基类,定义了 :data:`meta_path` 内的查找器对象的接口。" + +#: ../../library/sys.rst:1447 +msgid ":class:`importlib.machinery.ModuleSpec`" +msgstr ":class:`importlib.machinery.ModuleSpec`" + +#: ../../library/sys.rst:1448 +msgid "" +"The concrete class which :meth:`~importlib.abc.MetaPathFinder.find_spec` " +"should return instances of." +msgstr ":meth:`~importlib.abc.MetaPathFinder.find_spec` 返回的实例所对应的具体类。" + +#: ../../library/sys.rst:1454 +msgid "" +":term:`Module specs ` were introduced in Python 3.4, by " +":pep:`451`." +msgstr ":term:`模块规格说明 ` 是在 Python 3.4 中根据 :pep:`451` 引入的。" + +#: ../../library/sys.rst:1459 +msgid "" +"Removed the fallback that looked for a :meth:`!find_module` method if a " +":data:`meta_path` entry didn't have a " +":meth:`~importlib.abc.MetaPathFinder.find_spec` method." +msgstr "" +"移除了当 :data:`meta_path` 条目没有 :meth:`~importlib.abc.MetaPathFinder.find_spec` " +"方法时查找 :meth:`!find_module` 方法的回退。" + +#: ../../library/sys.rst:1465 +msgid "" +"This is a dictionary that maps module names to modules which have already " +"been loaded. This can be manipulated to force reloading of modules and " +"other tricks. However, replacing the dictionary will not necessarily work as" +" expected and deleting essential items from the dictionary may cause Python " +"to fail. If you want to iterate over this global dictionary always use " +"``sys.modules.copy()`` or ``tuple(sys.modules)`` to avoid exceptions as its " +"size may change during iteration as a side effect of code or activity in " +"other threads." +msgstr "" +"这是一个字典,它将模块名称映射到已经被加载的模块。 " +"这可以被操纵来强制重新加载模块和其他技巧。然而,替换这个字典不一定会像预期的那样工作,从字典中删除重要的项目可能会导致 Python 出错。 " +"如果你想对这个全局字典进行迭代,一定要使用 ``sys.modules.copy()`` 或 ``tuple(sys.modules)`` " +"来避免异常,因为它的大小在迭代过程中可能会因为其他线程中的代码或活动的副作用而改变。" + +#: ../../library/sys.rst:1477 +msgid "" +"The list of the original command line arguments passed to the Python " +"executable." +msgstr "传给 Python 可执行文件的原始命令行参数列表。" + +#: ../../library/sys.rst:1480 +msgid "" +"The elements of :data:`sys.orig_argv` are the arguments to the Python " +"interpreter, while the elements of :data:`sys.argv` are the arguments to the" +" user's program. Arguments consumed by the interpreter itself will be " +"present in :data:`sys.orig_argv` and missing from :data:`sys.argv`." +msgstr "" +":data:`sys.orig_argv` 中的元素是传给 Python 解释器的参数,而 :data:`sys.argv` " +"中的元素则是传给用户程序的参数。解释器本身所使用的参数将出现在 :data:`sys.orig_argv` 中而不会出现在 " +":data:`sys.argv` 中。" + +#: ../../library/sys.rst:1492 +msgid "" +"A list of strings that specifies the search path for modules. Initialized " +"from the environment variable :envvar:`PYTHONPATH`, plus an installation-" +"dependent default." +msgstr "" +"一个由字符串组成的列表,用于指定模块的搜索路径。初始化自环境变量 :envvar:`PYTHONPATH`,再加上一条与安装有关的默认路径。" + +#: ../../library/sys.rst:1496 +msgid "" +"By default, as initialized upon program startup, a potentially unsafe path " +"is prepended to :data:`sys.path` (*before* the entries inserted as a result " +"of :envvar:`PYTHONPATH`):" +msgstr "" +"在默认情况下,如在程序启动时被初始化的时候,会有潜在的不安全路径被添加到 :data:`sys.path` 的开头 (在作为的 " +":envvar:`PYTHONPATH` 结果被插入的条目 *之前* 位置):" + +#: ../../library/sys.rst:1500 +msgid "" +"``python -m module`` command line: prepend the current working directory." +msgstr "``python -m module`` 命令行:添加当前工作目录。" + +#: ../../library/sys.rst:1502 +msgid "" +"``python script.py`` command line: prepend the script's directory. If it's a" +" symbolic link, resolve symbolic links." +msgstr "``python script.py`` 命令行:添加脚本的目录。如果是一个符号链接,则会解析符号链接。" + +#: ../../library/sys.rst:1504 +msgid "" +"``python -c code`` and ``python`` (REPL) command lines: prepend an empty " +"string, which means the current working directory." +msgstr "``python -c code`` 和 ``python`` (REPL) 命令行:添加一个空字符串,这表示当前工作目录。" + +#: ../../library/sys.rst:1507 +msgid "" +"To not prepend this potentially unsafe path, use the :option:`-P` command " +"line option or the :envvar:`PYTHONSAFEPATH` environment variable." +msgstr "" +"如果不想添加这个具有潜在不安全性的路径,请使用 :option:`-P` 命令行选项或 :envvar:`PYTHONSAFEPATH` 环境变量。" + +#: ../../library/sys.rst:1510 +msgid "" +"A program is free to modify this list for its own purposes. Only strings " +"should be added to :data:`sys.path`; all other data types are ignored during" +" import." +msgstr "程序可以出于自己的目的随意修改此列表。应当只将字符串添加到 :data:`sys.path` 中;所有其他数据类型都将在导入期间被忽略。" + +#: ../../library/sys.rst:1516 +msgid "" +"Module :mod:`site` This describes how to use .pth files to extend " +":data:`sys.path`." +msgstr ":mod:`site` 模块,该模块描述了如何使用 .pth 文件来扩展 :data:`sys.path`。" + +#: ../../library/sys.rst:1521 +msgid "" +"A list of callables that take a path argument to try to create a " +":term:`finder` for the path. If a finder can be created, it is to be " +"returned by the callable, else raise :exc:`ImportError`." +msgstr "" +"一个由可调用对象组成的列表,这些对象接受一个路径作为参数,并尝试为该路径创建一个 :term:`查找器 " +"`。如果成功创建查找器,则可调用对象将返回它,否则将引发 :exc:`ImportError` 异常。" + +#: ../../library/sys.rst:1525 ../../library/sys.rst:1536 +msgid "Originally specified in :pep:`302`." +msgstr "本特性最早在 :pep:`302` 中被提及。" + +#: ../../library/sys.rst:1530 +msgid "" +"A dictionary acting as a cache for :term:`finder` objects. The keys are " +"paths that have been passed to :data:`sys.path_hooks` and the values are the" +" finders that are found. If a path is a valid file system path but no finder" +" is found on :data:`sys.path_hooks` then ``None`` is stored." +msgstr "" +"一个字典,作为 :term:`查找器 ` 对象的缓存。key 是传入 :data:`sys.path_hooks` 的路径,value " +"是相应已找到的查找器。如果路径是有效的文件系统路径,但在 :data:`sys.path_hooks` 中未找到查找器,则存入 ``None``。" + +#: ../../library/sys.rst:1541 +msgid "A string containing a platform identifier. Known values are:" +msgstr "一个包含平台标识的字符串。已知的值有:" + +#: ../../library/sys.rst:1544 +msgid "System" +msgstr "系统" + +#: ../../library/sys.rst:1544 +msgid "``platform`` value" +msgstr "``platform`` 值" + +#: ../../library/sys.rst:1546 +msgid "AIX" +msgstr "AIX" + +#: ../../library/sys.rst:1546 +msgid "``'aix'``" +msgstr "``'aix'``" + +#: ../../library/sys.rst:1547 +msgid "Android" +msgstr "Android" + +#: ../../library/sys.rst:1547 +msgid "``'android'``" +msgstr "``'android'``" + +#: ../../library/sys.rst:1548 +msgid "Emscripten" +msgstr "Emscripten" + +#: ../../library/sys.rst:1548 +msgid "``'emscripten'``" +msgstr "``'emscripten'``" + +#: ../../library/sys.rst:1549 +msgid "FreeBSD" +msgstr "FreeBSD" + +#: ../../library/sys.rst:1549 +msgid "``'freebsd'``" +msgstr "``'freebsd'``" + +#: ../../library/sys.rst:1550 +msgid "iOS" +msgstr "iOS" + +#: ../../library/sys.rst:1550 +msgid "``'ios'``" +msgstr "``'ios'``" + +#: ../../library/sys.rst:1551 +msgid "Linux" +msgstr "Linux" + +#: ../../library/sys.rst:1551 +msgid "``'linux'``" +msgstr "``'linux'``" + +#: ../../library/sys.rst:1552 +msgid "macOS" +msgstr "macOS" + +#: ../../library/sys.rst:1552 +msgid "``'darwin'``" +msgstr "``'darwin'``" + +#: ../../library/sys.rst:1553 +msgid "Windows" +msgstr "Windows" + +#: ../../library/sys.rst:1553 +msgid "``'win32'``" +msgstr "``'win32'``" + +#: ../../library/sys.rst:1554 +msgid "Windows/Cygwin" +msgstr "Windows/Cygwin" + +#: ../../library/sys.rst:1554 +msgid "``'cygwin'``" +msgstr "``'cygwin'``" + +#: ../../library/sys.rst:1555 +msgid "WASI" +msgstr "WASI" + +#: ../../library/sys.rst:1555 +msgid "``'wasi'``" +msgstr "``'wasi'``" + +#: ../../library/sys.rst:1558 +msgid "" +"On Unix systems not listed in the table, the value is the lowercased OS name" +" as returned by ``uname -s``, with the first part of the version as returned" +" by ``uname -r`` appended, e.g. ``'sunos5'``, *at the time when Python was " +"built*. Unless you want to test for a specific system version, it is " +"therefore recommended to use the following idiom::" +msgstr "" +"对于未在表中列出的 Unix 系统,该值是类似 ``uname -s`` 所返回的小写形式 OS 名称,并附加类似 ``uname -r`` " +"所返回的版本号的第一部分,例如在 ``'sunos5'`` 上,*是 Python 被构建的时间*。 " +"除非你想要检测特定的系统版本,否则建议使用以下惯例::" + +#: ../../library/sys.rst:1564 +msgid "" +"if sys.platform.startswith('sunos'):\n" +" # SunOS-specific code here..." +msgstr "" +"if sys.platform.startswith('sunos'):\n" +" # 这里是特定于 SunOS 的代码..." + +#: ../../library/sys.rst:1567 +msgid "" +"On Linux, :data:`sys.platform` doesn't contain the major version anymore. It" +" is always ``'linux'``, instead of ``'linux2'`` or ``'linux3'``." +msgstr "" +"在 Linux 上,:data:`sys.platform` 将不再包含主版本号。它将始终为 ``'linux'``,而不是 ``'linux2'`` " +"或 ``'linux3'``。" + +#: ../../library/sys.rst:1571 +msgid "" +"On AIX, :data:`sys.platform` doesn't contain the major version anymore. It " +"is always ``'aix'``, instead of ``'aix5'`` or ``'aix7'``." +msgstr "" +"在 AIX 上,:data:`sys.platform` 将不再包含主版本号。它将始终为 ``'aix'``,而不是 ``'aix5'`` 或 " +"``'aix7'``." + +#: ../../library/sys.rst:1575 +msgid "" +"On Android, :data:`sys.platform` now returns ``'android'`` rather than " +"``'linux'``." +msgstr "在 Android 上,:data:`sys.platform` 现在将返回 ``'android'`` 而不是 ``'linux'``。" + +#: ../../library/sys.rst:1579 +msgid "" +"On FreeBSD, :data:`sys.platform` doesn't contain the major version anymore. " +"It is always ``'freebsd'``, instead of ``'freebsd13'`` or ``'freebsd14'``." +msgstr "" +"在 FreeBSD 上,:data:`sys.platform` 将不再包含主版本号。它将始终为 ``'freebsd'``,而不是 " +"``'freebsd13'`` 或 ``'freebsd14'``。" + +#: ../../library/sys.rst:1585 +msgid "" +":data:`os.name` has a coarser granularity. :func:`os.uname` gives system-" +"dependent version information." +msgstr ":data:`os.name` 具有更粗的粒度。 :func:`os.uname` 将给出依赖于具体系统的版本信息。" + +#: ../../library/sys.rst:1588 +msgid "" +"The :mod:`platform` module provides detailed checks for the system's " +"identity." +msgstr ":mod:`platform` 模块对系统的标识有更详细的检查。" + +#: ../../library/sys.rst:1594 +msgid "" +"Name of the platform-specific library directory. It is used to build the " +"path of standard library and the paths of installed extension modules." +msgstr "平台专用库目录。用于构建标准库的路径和已安装扩展模块的路径。" + +#: ../../library/sys.rst:1597 +msgid "" +"It is equal to ``\"lib\"`` on most platforms. On Fedora and SuSE, it is " +"equal to ``\"lib64\"`` on 64-bit platforms which gives the following " +"``sys.path`` paths (where ``X.Y`` is the Python ``major.minor`` version):" +msgstr "" +"在大多数平台上,它等同于 ``\"lib\"``。 在 Fedora 和 SuSE 上,它等同于给出了以下 ``sys.path`` 路径的 64 " +"位平台上的 ``\"lib64\"`` (其中 ``X.Y`` 是 Python 的 ``major.minor`` 版本)。" + +#: ../../library/sys.rst:1601 +msgid "" +"``/usr/lib64/pythonX.Y/``: Standard library (like ``os.py`` of the :mod:`os`" +" module)" +msgstr "``/usr/lib64/pythonX.Y/``: 标准库 (如 :mod:`os` 模块的 ``os.py``)" + +#: ../../library/sys.rst:1603 +msgid "" +"``/usr/lib64/pythonX.Y/lib-dynload/``: C extension modules of the standard " +"library (like the :mod:`errno` module, the exact filename is platform " +"specific)" +msgstr "" +"``/usr/lib64/pythonX.Y/lib-dynload/``:标准库的 C 扩展模块(如 :mod:`errno` " +"模块,确切的文件名取决于平台)" + +#: ../../library/sys.rst:1606 +msgid "" +"``/usr/lib/pythonX.Y/site-packages/`` (always use ``lib``, not " +":data:`sys.platlibdir`): Third-party modules" +msgstr "" +"``/usr/lib/pythonX.Y/site-packages/`` (请使用 ``lib``, 而非 " +":data:`sys.platlibdir`): 第三方模块" + +#: ../../library/sys.rst:1608 +msgid "" +"``/usr/lib64/pythonX.Y/site-packages/``: C extension modules of third-party " +"packages" +msgstr "``/usr/lib64/pythonX.Y/site-packages/``: 第三方包的 C 扩展模块" + +#: ../../library/sys.rst:1616 +msgid "" +"A string giving the site-specific directory prefix where the platform " +"independent Python files are installed; on Unix, the default is " +":file:`/usr/local`. This can be set at build time with the " +":option:`--prefix` argument to the :program:`configure` script. See " +":ref:`installation_paths` for derived paths." +msgstr "" +"一个指定用于安装与平台无关的 Python 文件的站点专属目录前缀的字符串;在 Unix 上,默认为 :file:`/usr/local`。 " +"这可以在构建时通过将 :option:`--prefix` 参数传入 :program:`configure` 脚本来设置。请参阅 " +":ref:`installation_paths` 了解衍生的路径。" + +#: ../../library/sys.rst:1624 +msgid "" +"If a :ref:`virtual environment ` is in effect, this :data:`prefix`" +" will point to the virtual environment. The value for the Python " +"installation will still be available, via :data:`base_prefix`. Refer to " +":ref:`sys-path-init-virtual-environments` for more information." +msgstr "" +"如果在一个 :ref:`虚拟环境 ` 中,:data:`prefix` 将指向虚拟环境。Python 安装位置仍然可以用 " +":data:`base_prefix` 来获取。详情请参阅 :ref:`sys-path-init-virtual-environments`。" + +#: ../../library/sys.rst:1648 +msgid "" +"Strings specifying the primary and secondary prompt of the interpreter. " +"These are only defined if the interpreter is in interactive mode. Their " +"initial values in this case are ``'>>> '`` and ``'... '``. If a non-string " +"object is assigned to either variable, its :func:`str` is re-evaluated each " +"time the interpreter prepares to read a new interactive command; this can be" +" used to implement a dynamic prompt." +msgstr "" +"字符串,指定解释器的首要和次要提示符。仅当解释器处于交互模式时,它们才有定义。这种情况下,它们的初值为 ``'>>> '`` 和 ``'... " +"'``。如果赋给其中某个变量的是非字符串对象,则每次解释器准备读取新的交互式命令时,都会重新运行该对象的 " +":func:`str`,这可以用来实现动态的提示符。" + +#: ../../library/sys.rst:1658 +msgid "" +"Set the flags used by the interpreter for :c:func:`dlopen` calls, such as " +"when the interpreter loads extension modules. Among other things, this will" +" enable a lazy resolving of symbols when importing a module, if called as " +"``sys.setdlopenflags(0)``. To share symbols across extension modules, call " +"as ``sys.setdlopenflags(os.RTLD_GLOBAL)``. Symbolic names for the flag " +"values can be found in the :mod:`os` module (:samp:`RTLD_{xxx}` constants, " +"e.g. :const:`os.RTLD_LAZY`)." +msgstr "" +"设置解释器在调用 :c:func:`dlopen` 时使用的旗标,例如当解释器加载扩展模块的时候。首先,如果以 " +"``sys.setdlopenflags(0)`` 的形式调用的话这将在导入模块时启用符号的惰性求值。要在扩展模块之间共享符号,请以 " +"``sys.setdlopenflags(os.RTLD_GLOBAL)`` 的形式调用。旗标志值的符号名称可以在 :mod:`os` 模块中找到 " +"(:samp:`RTLD_{xxx}` 常量,例如 :const:`os.RTLD_LAZY`)。" + +#: ../../library/sys.rst:1670 +msgid "" +"Set the :ref:`integer string conversion length limitation " +"` used by this interpreter. See also " +":func:`get_int_max_str_digits`." +msgstr "" +"设置解释器所使用的 :ref:`整数字符串转换长度限制 `。另请参阅 " +":func:`get_int_max_str_digits`." + +#: ../../library/sys.rst:1682 +msgid "" +"Set the system's profile function, which allows you to implement a Python " +"source code profiler in Python. See chapter :ref:`profile` for more " +"information on the Python profiler. The system's profile function is called" +" similarly to the system's trace function (see :func:`settrace`), but it is " +"called with different events, for example it isn't called for each executed " +"line of code (only on call and return, but the return event is reported even" +" when an exception has been set). The function is thread-specific, but there" +" is no way for the profiler to know about context switches between threads, " +"so it does not make sense to use this in the presence of multiple threads. " +"Also, its return value is not used, so it can simply return ``None``. Error" +" in the profile function will cause itself unset." +msgstr "" +"设置系统的性能分析函数,该函数使得在 Py​​thon 中能够实现一个 Python 源代码性能分析器。关于 Python Profiler " +"的更多信息请参阅 :ref:`profile` 章节。性能分析函数的调用方式类似于系统的跟踪函数(参阅 :func:`settrace` " +"),但它是通过不同的事件调用的,例如,不是每执行一行代码就调用它一次(仅在调用某函数和从某函数返回时才会调用性能分析函数,但即使某函数发生异常也会算作返回事件)。该函数是特定于单个线程的,但是性能分析器无法得知线程之间的上下文切换,因此在存在多个线程的情况下使用它是没有意义的。另外,因为它的返回值不会被用到,所以可以简单地返回" +" ``None``。性能分析函数中的错误将导致其自身被解除设置。" + +#: ../../library/sys.rst:1694 +msgid "" +"The same tracing mechanism is used for :func:`!setprofile` as " +":func:`settrace`. To trace calls with :func:`!setprofile` inside a tracing " +"function (e.g. in a debugger breakpoint), see :func:`call_tracing`." +msgstr "" +":func:`!setprofile` 使用与 :func:`settrace` 相同的跟踪机制。要在跟踪函数内部使用 " +":func:`!setprofile` 来跟踪调用(例如在调试器断点内),请参阅 :func:`call_tracing`。" + +#: ../../library/sys.rst:1698 +msgid "" +"Profile functions should have three arguments: *frame*, *event*, and *arg*. " +"*frame* is the current stack frame. *event* is a string: ``'call'``, " +"``'return'``, ``'c_call'``, ``'c_return'``, or ``'c_exception'``. *arg* " +"depends on the event type." +msgstr "" +"性能分析函数应接收三个参数:*frame*、*event* 和 *arg*。*frame* 是当前的堆栈帧。 *event* 是一个字符串: " +"``'call'``、``'return'``、``'c_call'``、``'c_return'`` 或 " +"``'c_exception'``。*arg* 取决于事件类型。" + +#: ../../library/sys.rst:1703 ../../library/sys.rst:1790 +msgid "The events have the following meaning:" +msgstr "这些事件具有以下含义:" + +#: ../../library/sys.rst:1705 ../../library/sys.rst:1792 +msgid "``'call'``" +msgstr "``'call'``" + +#: ../../library/sys.rst:1706 +msgid "" +"A function is called (or some other code block entered). The profile " +"function is called; *arg* is ``None``." +msgstr "表示调用了某个函数(或进入了其他的代码块)。性能分析函数将被调用,*arg* 为 ``None``。" + +#: ../../library/sys.rst:1709 ../../library/sys.rst:1807 +msgid "``'return'``" +msgstr "``'return'``" + +#: ../../library/sys.rst:1710 +msgid "" +"A function (or other code block) is about to return. The profile function " +"is called; *arg* is the value that will be returned, or ``None`` if the " +"event is caused by an exception being raised." +msgstr "" +"表示某个函数(或别的代码块)即将返回。性能分析函数将被调用,*arg* 是即将返回的值,如果此次返回事件是由于抛出异常,*arg* 为 " +"``None``." + +#: ../../library/sys.rst:1714 +msgid "``'c_call'``" +msgstr "``'c_call'``" + +#: ../../library/sys.rst:1715 +msgid "" +"A C function is about to be called. This may be an extension function or a " +"built-in. *arg* is the C function object." +msgstr "表示即将调用某个 C 函数。它可能是扩展函数或是内建函数。*arg* 是 C 函数对象。" + +#: ../../library/sys.rst:1718 +msgid "``'c_return'``" +msgstr "``'c_return'``" + +#: ../../library/sys.rst:1719 +msgid "A C function has returned. *arg* is the C function object." +msgstr "表示返回了某个 C 函数。*arg* 是 C 函数对象。" + +#: ../../library/sys.rst:1721 +msgid "``'c_exception'``" +msgstr "``'c_exception'``" + +#: ../../library/sys.rst:1722 +msgid "A C function has raised an exception. *arg* is the C function object." +msgstr "表示某个 C 函数抛出了异常。*arg* 是 C 函数对象。" + +#: ../../library/sys.rst:1724 +msgid "" +"Raises an :ref:`auditing event ` ``sys.setprofile`` with no " +"arguments." +msgstr "引发一个不带参数的 :ref:`审计事件 ` ``sys.setprofile``。" + +#: ../../library/sys.rst:1729 +msgid "" +"Set the maximum depth of the Python interpreter stack to *limit*. This " +"limit prevents infinite recursion from causing an overflow of the C stack " +"and crashing Python." +msgstr "将 Python 解释器堆栈的最大深度设置为 *limit*。此限制可防止无限递归导致的 C 堆栈溢出和 Python 崩溃。" + +#: ../../library/sys.rst:1733 +msgid "" +"The highest possible limit is platform-dependent. A user may need to set " +"the limit higher when they have a program that requires deep recursion and a" +" platform that supports a higher limit. This should be done with care, " +"because a too-high limit can lead to a crash." +msgstr "" +"不同平台所允许的最高限值不同。当用户有需要深度递归的程序且平台支持更高的限值,可能就需要调高限值。进行该操作需要谨慎,因为过高的限值可能会导致崩溃。" + +#: ../../library/sys.rst:1738 +msgid "" +"If the new limit is too low at the current recursion depth, a " +":exc:`RecursionError` exception is raised." +msgstr "如果新的限值低于当前的递归深度,将抛出 :exc:`RecursionError` 异常。" + +#: ../../library/sys.rst:1741 +msgid "" +"A :exc:`RecursionError` exception is now raised if the new limit is too low " +"at the current recursion depth." +msgstr "如果新的限值低于当前的递归深度,现在将抛出 :exc:`RecursionError` 异常。" + +#: ../../library/sys.rst:1748 +msgid "" +"Set the interpreter's thread switch interval (in seconds). This floating-" +"point value determines the ideal duration of the \"timeslices\" allocated to" +" concurrently running Python threads. Please note that the actual value can" +" be higher, especially if long-running internal functions or methods are " +"used. Also, which thread becomes scheduled at the end of the interval is " +"the operating system's decision. The interpreter doesn't have its own " +"scheduler." +msgstr "" +"设置解释器的线程切换间隔时间(单位为秒)。该浮点数决定了“时间片”的理想持续时间,时间片将分配给同时运行的 Python " +"线程。请注意,实际值可能更高,尤其是使用了运行时间长的内部函数或方法时。同时,在时间间隔末尾调度哪个线程是操作系统的决定。解释器没有自己的调度程序。" + +#: ../../library/sys.rst:1765 +msgid "" +"Set the system's trace function, which allows you to implement a Python " +"source code debugger in Python. The function is thread-specific; for a " +"debugger to support multiple threads, it must register a trace function " +"using :func:`settrace` for each thread being debugged or use " +":func:`threading.settrace`." +msgstr "" +"设置系统的跟踪函数,使得用户在 Python 中就可以实现 Python " +"源代码调试器。该函数是特定于单个线程的,所以要让调试器支持多线程,必须为正在调试的每个线程都用 :func:`settrace` " +"注册一个跟踪函数,或使用 :func:`threading.settrace`。" + +#: ../../library/sys.rst:1770 +msgid "" +"Trace functions should have three arguments: *frame*, *event*, and *arg*. " +"*frame* is the :ref:`current stack frame `. *event* is a " +"string: ``'call'``, ``'line'``, ``'return'``, ``'exception'`` or " +"``'opcode'``. *arg* depends on the event type." +msgstr "" +"跟踪函数应接收三个参数:*frame*、*event* 和 *arg*。*frame* 是 :ref:`当前堆栈帧 `。*event* 是一个字符串: ``'call'``、``'line'``、``'return'``、``'exception'``" +" 或 ``'opcode'``。*arg* 取决于事件类型。" + +#: ../../library/sys.rst:1775 +msgid "" +"The trace function is invoked (with *event* set to ``'call'``) whenever a " +"new local scope is entered; it should return a reference to a local trace " +"function to be used for the new scope, or ``None`` if the scope shouldn't be" +" traced." +msgstr "" +"每次进入 trace 函数的新的局部作用范围,都会调用 trace 函数( *event* 会被设置为 ``'call'`` " +"),它应该返回一个引用,指向即将用在新作用范围上的局部跟踪函数;如果不需要跟踪当前的作用范围,则返回 ``None``。" + +#: ../../library/sys.rst:1780 +msgid "" +"The local trace function should return a reference to itself, or to another " +"function which would then be used as the local trace function for the scope." +msgstr "本地跟踪函数应返回对自身的引用,或对另一个函数的引用然后将其用作本作用域的局部跟踪函数。" + +#: ../../library/sys.rst:1783 +msgid "" +"If there is any error occurred in the trace function, it will be unset, just" +" like ``settrace(None)`` is called." +msgstr "如果跟踪函数出错,则该跟踪函数将被取消设置,类似于调用 ``settrace(None)``。" + +#: ../../library/sys.rst:1787 +msgid "" +"Tracing is disabled while calling the trace function (e.g. a function set by" +" :func:`!settrace`). For recursive tracing see :func:`call_tracing`." +msgstr "" +"在调用跟踪函数(例如由 :func:`!settrace` 设置的函数)时将禁用跟踪。有关递归跟踪请参阅 :func:`call_tracing`。" + +#: ../../library/sys.rst:1793 +msgid "" +"A function is called (or some other code block entered). The global trace " +"function is called; *arg* is ``None``; the return value specifies the local " +"trace function." +msgstr "表示调用了某个函数(或进入了其他的代码块)。全局跟踪函数将被调用,*arg* 为 ``None``。返回值将指定局部跟踪函数。" + +#: ../../library/sys.rst:1797 +msgid "``'line'``" +msgstr "``'line'``" + +#: ../../library/sys.rst:1798 +msgid "" +"The interpreter is about to execute a new line of code or re-execute the " +"condition of a loop. The local trace function is called; *arg* is ``None``;" +" the return value specifies the new local trace function. See " +":file:`Objects/lnotab_notes.txt` for a detailed explanation of how this " +"works. Per-line events may be disabled for a frame by setting " +":attr:`~frame.f_trace_lines` to :const:`False` on that :ref:`frame `." +msgstr "" +"解释器即将执行一个新的代码行或重新执行一个循环的条件。局部跟踪函数将被调用;*arg* 为 ``None``;其返回值将指定新的局部跟踪函数。请参阅 " +":file:`Objects/lnotab_notes.txt` 查看有关其工作原理的详细说明。可以通过在某个 :ref:`帧 ` 上把 :attr:`~frame.f_trace_lines` 设为 :const:`False` 来禁用相应帧的每行触发事件。" + +#: ../../library/sys.rst:1808 +msgid "" +"A function (or other code block) is about to return. The local trace " +"function is called; *arg* is the value that will be returned, or ``None`` if" +" the event is caused by an exception being raised. The trace function's " +"return value is ignored." +msgstr "" +"表示某个函数(或别的代码块)即将返回。局部跟踪函数将被调用,*arg* 是即将返回的值,如果此次返回事件是由于抛出异常,*arg* 为 " +"``None``。跟踪函数的返回值将被忽略。" + +#: ../../library/sys.rst:1813 +msgid "``'exception'``" +msgstr "``'exception'``" + +#: ../../library/sys.rst:1814 +msgid "" +"An exception has occurred. The local trace function is called; *arg* is a " +"tuple ``(exception, value, traceback)``; the return value specifies the new " +"local trace function." +msgstr "" +"表示发生了某个异常。局部跟踪函数将被调用,*arg* 是一个 ``(exception, value, traceback)`` " +"元组,返回值将指定新的局部跟踪函数。" + +#: ../../library/sys.rst:1818 +msgid "``'opcode'``" +msgstr "``'opcode'``" + +#: ../../library/sys.rst:1819 +msgid "" +"The interpreter is about to execute a new opcode (see :mod:`dis` for opcode " +"details). The local trace function is called; *arg* is ``None``; the return" +" value specifies the new local trace function. Per-opcode events are not " +"emitted by default: they must be explicitly requested by setting " +":attr:`~frame.f_trace_opcodes` to :const:`True` on the :ref:`frame `." +msgstr "" +"解释器即将执行一个新的操作码(请参阅 :mod:`dis` 了解有关操作码的详情)。局部跟踪函数将被调用;*arg* 为 " +"``None``;其返回值将指定新的局部跟踪函数。在默认情况下不会发出每个操作码触发事件:必须通过在某个 :ref:`帧 ` 上把 :attr:`~frame.f_trace_opcodes` 设为 :const:`True` 来显式地发出请求。" + +#: ../../library/sys.rst:1826 +msgid "" +"Note that as an exception is propagated down the chain of callers, an " +"``'exception'`` event is generated at each level." +msgstr "注意,由于异常是在链式调用中传播的,所以每一级都会产生一个 ``'exception'`` 事件。" + +#: ../../library/sys.rst:1829 +msgid "" +"For more fine-grained usage, it's possible to set a trace function by " +"assigning ``frame.f_trace = tracefunc`` explicitly, rather than relying on " +"it being set indirectly via the return value from an already installed trace" +" function. This is also required for activating the trace function on the " +"current frame, which :func:`settrace` doesn't do. Note that in order for " +"this to work, a global tracing function must have been installed with " +":func:`settrace` in order to enable the runtime tracing machinery, but it " +"doesn't need to be the same tracing function (e.g. it could be a low " +"overhead tracing function that simply returns ``None`` to disable itself " +"immediately on each frame)." +msgstr "" +"更细微的用法是,可以显式地通过赋值 ``frame.f_trace = tracefunc`` " +"来设置跟踪函数,而不是用现有跟踪函数的返回值去间接设置它。当前帧上的跟踪函数必须激活,而 :func:`settrace` " +"还没有做这件事。注意,为了使上述设置起效,必须使用 :func:`settrace` " +"来安装全局跟踪函数才能启用运行时跟踪机制,但是它不必与上述是同一个跟踪函数(它可以是一个开销很低的跟踪函数,只返回 " +"``None``,即在各个帧上立即将其自身禁用)。" + +#: ../../library/sys.rst:1840 +msgid "For more information on code and frame objects, refer to :ref:`types`." +msgstr "关于代码对象和帧对象的更多信息请参考 :ref:`types`。" + +#: ../../library/sys.rst:1842 +msgid "" +"Raises an :ref:`auditing event ` ``sys.settrace`` with no " +"arguments." +msgstr "引发一个不带参数的 :ref:`审计事件 ` ``sys.settrace``。" + +#: ../../library/sys.rst:1846 +msgid "" +"The :func:`settrace` function is intended only for implementing debuggers, " +"profilers, coverage tools and the like. Its behavior is part of the " +"implementation platform, rather than part of the language definition, and " +"thus may not be available in all Python implementations." +msgstr "" +":func:`settrace` 函数仅用于实现调试器,性能分析器,打包工具等。它的行为是实现平台的一部分,而不是语言定义的一部分,因此并非在所有 " +"Python 实现中都可用。" + +#: ../../library/sys.rst:1853 +msgid "" +"``'opcode'`` event type added; :attr:`~frame.f_trace_lines` and " +":attr:`~frame.f_trace_opcodes` attributes added to frames" +msgstr "" +"添加了 ``'opcode'`` 事件类型;为帧添加了 :attr:`~frame.f_trace_lines` 和 " +":attr:`~frame.f_trace_opcodes` 属性" + +#: ../../library/sys.rst:1858 +msgid "" +"Accepts two optional keyword arguments which are callables that accept an " +":term:`asynchronous generator iterator` as an argument. The *firstiter* " +"callable will be called when an asynchronous generator is iterated for the " +"first time. The *finalizer* will be called when an asynchronous generator is" +" about to be garbage collected." +msgstr "" +"接受两个可选的关键字参数,要求它们是可调用对象,且接受一个 :term:`异步生成器迭代器 ` 作为参数。*firstiter* 对象将在异步生成器第一次迭代时调用。*finalizer* 将在异步生成器即将被销毁时调用。" + +#: ../../library/sys.rst:1864 +msgid "" +"Raises an :ref:`auditing event ` " +"``sys.set_asyncgen_hooks_firstiter`` with no arguments." +msgstr "" +"引发一个不带参数的 :ref:`审计事件 ` ``sys.set_asyncgen_hooks_firstiter``。" + +#: ../../library/sys.rst:1866 +msgid "" +"Raises an :ref:`auditing event ` " +"``sys.set_asyncgen_hooks_finalizer`` with no arguments." +msgstr "" +"引发一个不带参数的 :ref:`审计事件 ` ``sys.set_asyncgen_hooks_finalizer``。" + +#: ../../library/sys.rst:1868 +msgid "" +"Two auditing events are raised because the underlying API consists of two " +"calls, each of which must raise its own event." +msgstr "之所以会引发两个审计事件,是因为底层的 API 由两个调用组成,每个调用都须要引发自己的事件。" + +#: ../../library/sys.rst:1871 +msgid "" +"See :pep:`525` for more details, and for a reference example of a " +"*finalizer* method see the implementation of " +"``asyncio.Loop.shutdown_asyncgens`` in :source:`Lib/asyncio/base_events.py`" +msgstr "" +"更多详情请参阅 :pep:`525`,*finalizer* 方法的参考示例可参阅 " +":source:`Lib/asyncio/base_events.py` 中 ``asyncio.Loop.shutdown_asyncgens`` " +"的实现。" + +#: ../../library/sys.rst:1883 +msgid "" +"Allows enabling or disabling coroutine origin tracking. When enabled, the " +"``cr_origin`` attribute on coroutine objects will contain a tuple of " +"(filename, line number, function name) tuples describing the traceback where" +" the coroutine object was created, with the most recent call first. When " +"disabled, ``cr_origin`` will be ``None``." +msgstr "" +"允许启用或禁用协程溯源。当启用时,协程对象上的 ``cr_origin`` 属性将包含一个由 (文件名,行号,函数名) " +"元组组成的元组,它描述了协程对象自创建以来的回溯信息,最近的调用在最上面。当禁用时,``cr_origin`` 将为 ``None``。" + +#: ../../library/sys.rst:1890 +msgid "" +"To enable, pass a *depth* value greater than zero; this sets the number of " +"frames whose information will be captured. To disable, set *depth* to zero." +msgstr "要启用,请向 *depth* 传递一个大于 0 的值,它指定了有多少帧将被捕获信息。要禁用,请将 *depth* 设置为 0。" + +#: ../../library/sys.rst:1894 +msgid "This setting is thread-specific." +msgstr "该设置是特定于单个线程的。" + +#: ../../library/sys.rst:1904 +msgid "" +"Activate the stack profiler trampoline *backend*. The only supported backend" +" is ``\"perf\"``." +msgstr "激活栈性能分析器 trampoline *backend*。唯一受支持的后端是 ``\"perf\"``。" + +#: ../../library/sys.rst:1907 +msgid "Stack trampolines cannot be activated if the JIT is active." +msgstr "如果 JIT 处于激活状态,堆栈蹦床将无法被激活。" + +#: ../../library/sys.rst:1915 +msgid ":ref:`perf_profiling`" +msgstr ":ref:`perf_profiling`" + +#: ../../library/sys.rst:1916 +msgid "https://perf.wiki.kernel.org" +msgstr "https://perf.wiki.kernel.org" + +#: ../../library/sys.rst:1920 +msgid "Deactivate the current stack profiler trampoline backend." +msgstr "取消激活当前的栈性能分析器 trampoline 后端。" + +#: ../../library/sys.rst:1922 +msgid "If no stack profiler is activated, this function has no effect." +msgstr "如果没有激活的栈性能分析器,此函数将没有任何效果。" + +#: ../../library/sys.rst:1930 +msgid "Return ``True`` if a stack profiler trampoline is active." +msgstr "如果激活了栈性能分析器 trampoline 则返回 ``True``。" + +#: ../../library/sys.rst:1939 +msgid "" +"Executes *script*, a file containing Python code in the remote process with " +"the given *pid*." +msgstr "在具有给定 *pid* 的远程进程中执行 *script*,即一个包含 Python 代码的文件。" + +#: ../../library/sys.rst:1942 +msgid "" +"This function returns immediately, and the code will be executed by the " +"target process's main thread at the next available opportunity, similarly to" +" how signals are handled. There is no interface to determine when the code " +"has been executed. The caller is responsible for making sure that the file " +"still exists whenever the remote process tries to read it and that it hasn't" +" been overwritten." +msgstr "" +"此函数立即返回,并且代码将由目标进程的主线程在下一个可用的机会中执行,类似于处理信号的方式。没有接口来确定代码何时被执行。调用方负责确保无论何时远程进程尝试读取该文件,该文件都仍然存在,并且没有被覆盖。" + +#: ../../library/sys.rst:1949 +msgid "" +"The remote process must be running a CPython interpreter of the same major " +"and minor version as the local process. If either the local or remote " +"interpreter is pre-release (alpha, beta, or release candidate) then the " +"local and remote interpreters must be the same exact version." +msgstr "" +"远程进程必须运行与本地进程相同的主要和次要版本的 CPython 解释器。如果本地或远程解释器是预发布(alpha、beta " +"或候选发布),那么本地和远程解释器必须是相同的版本。" + +#: ../../library/sys.rst:1954 +msgid "" +"See :ref:`remote-debugging` for more information about the remote debugging " +"mechanism." +msgstr "请参阅 :ref:`remote-debugging` 了解有关远程调试机制的更多信息。" + +#: ../../library/sys.rst:1957 ../../library/sys.rst:1959 +msgid "" +"When the code is executed in the remote process, an :ref:`auditing event " +"` ``sys.remote_exec`` is raised with the *pid* and the path to the" +" script file. This event is raised in the process that called " +":func:`sys.remote_exec`." +msgstr "" +"当代码在远程进程中被执行时,将引发一个 :ref:`审计事件 ` ``sys.remote_exec`` 并附带 *pid* " +"和脚本文件的路径。此事件会在调用 :func:`sys.remote_exec` 的进程中被引发。" + +#: ../../library/sys.rst:1964 ../../library/sys.rst:1966 +msgid "" +"When the script is executed in the remote process, an :ref:`auditing event " +"` ``cpython.remote_debugger_script`` is raised with the path in " +"the remote process. This event is raised in the remote process, not the one " +"that called :func:`sys.remote_exec`." +msgstr "" +"当脚本在远程进程中执行时,一个 :ref:`审计事件 ` ``cpython.remote_debugger_script`` " +"被抛出,带有远程进程中的路径。此事件在远程进程中被引发,不是调用 :func:`sys.remote_exec` 的进程。" + +#: ../../library/sys.rst:1974 +msgid "See :pep:`768` for more details." +msgstr "请参阅 :pep:`768` 了解详情。" + +#: ../../library/sys.rst:1980 +msgid "" +"Changes the :term:`filesystem encoding and error handler` to 'mbcs' and " +"'replace' respectively, for consistency with versions of Python prior to " +"3.6." +msgstr "" +"将 :term:`filesystem encoding and error handler` 分别修改为 'mbcs' 和 'replace',以便与" +" 3.6 之前版本的 Python 保持一致。" + +#: ../../library/sys.rst:1984 +msgid "" +"This is equivalent to defining the :envvar:`PYTHONLEGACYWINDOWSFSENCODING` " +"environment variable before launching Python." +msgstr "这等同于在启动 Python 前先定义好 :envvar:`PYTHONLEGACYWINDOWSFSENCODING` 环境变量。" + +#: ../../library/sys.rst:1987 +msgid "" +"See also :func:`sys.getfilesystemencoding` and " +":func:`sys.getfilesystemencodeerrors`." +msgstr "" +"另请参阅 :func:`sys.getfilesystemencoding` 和 " +":func:`sys.getfilesystemencodeerrors`." + +#: ../../library/sys.rst:1993 +msgid "" +"Changing the filesystem encoding after Python startup is risky because the " +"old fsencoding or paths encoded by the old fsencoding may be cached " +"somewhere. Use :envvar:`PYTHONLEGACYWINDOWSFSENCODING` instead." +msgstr "" +"在 Python 启动后改变文件系统编码格式是有风险的因为旧的文件系统编码格式或由旧的文件系统编码格式所编码的路径可能已被缓存。请改用 " +":envvar:`PYTHONLEGACYWINDOWSFSENCODING`." + +#: ../../library/sys.rst:1997 +msgid "See :pep:`529` for more details." +msgstr "更多详情请参阅 :pep:`529`。" + +#: ../../library/sys.rst:2000 +msgid "Use :envvar:`PYTHONLEGACYWINDOWSFSENCODING` instead." +msgstr "应改用 :envvar:`PYTHONLEGACYWINDOWSFSENCODING`。" + +#: ../../library/sys.rst:2007 +msgid "" +":term:`File objects ` used by the interpreter for standard " +"input, output and errors:" +msgstr "解释器用于标准输入、标准输出和标准错误的 :term:`文件对象 `:" + +#: ../../library/sys.rst:2010 +msgid "" +"``stdin`` is used for all interactive input (including calls to " +":func:`input`);" +msgstr "``stdin`` 用于所有交互式输入(包括对 :func:`input` 的调用);" + +#: ../../library/sys.rst:2012 +msgid "" +"``stdout`` is used for the output of :func:`print` and :term:`expression` " +"statements and for the prompts of :func:`input`;" +msgstr "" +"``stdout`` 用于 :func:`print` 和 :term:`expression` 语句的输出,以及用于 :func:`input` " +"的提示符;" + +#: ../../library/sys.rst:2014 +msgid "The interpreter's own prompts and its error messages go to ``stderr``." +msgstr "解释器自身的提示符和它的错误消息都发往 ``stderr``。" + +#: ../../library/sys.rst:2016 +msgid "" +"These streams are regular :term:`text files ` like those returned" +" by the :func:`open` function. Their parameters are chosen as follows:" +msgstr "这些流都是常规 :term:`文本文件 `,与 :func:`open` 函数返回的对象一致。它们的参数选择如下:" + +#: ../../library/sys.rst:2020 +msgid "" +"The encoding and error handling are initialized from " +":c:member:`PyConfig.stdio_encoding` and :c:member:`PyConfig.stdio_errors`." +msgstr "" + +#: ../../library/sys.rst:2023 +msgid "" +"On Windows, UTF-8 is used for the console device. Non-character devices " +"such as disk files and pipes use the system locale encoding (i.e. the ANSI " +"codepage). Non-console character devices such as NUL (i.e. where " +"``isatty()`` returns ``True``) use the value of the console input and output" +" codepages at startup, respectively for stdin and stdout/stderr. This " +"defaults to the system :term:`locale encoding` if the process is not " +"initially attached to a console." +msgstr "" +"在 Windows 上,控制台设备使用 UTF-8。非字符设备如磁盘文件和管道使用系统语言区域编码格式(例如 ANSI 代码页)。非控制台字符设备如 " +"NUL(例如当 ``isatty()`` 返回 ``True`` 时)会在启动时分别让 stdin 和 stdout/stderr " +"使用控制台输入和输出代码页。如果进程初始化时没有被附加到控制台则会使用默认的系统 :term:`locale encoding`。" + +#: ../../library/sys.rst:2032 +msgid "" +"The special behaviour of the console can be overridden by setting the " +"environment variable PYTHONLEGACYWINDOWSSTDIO before starting Python. In " +"that case, the console codepages are used as for any other character device." +msgstr "" +"要重写控制台的特殊行为,可以在启动 Python 前设置 PYTHONLEGACYWINDOWSSTDIO " +"环境变量。此时,控制台代码页将用于其他字符设备。" + +#: ../../library/sys.rst:2037 +msgid "" +"Under all platforms, you can override the character encoding by setting the " +":envvar:`PYTHONIOENCODING` environment variable before starting Python or by" +" using the new :option:`-X` ``utf8`` command line option and " +":envvar:`PYTHONUTF8` environment variable. However, for the Windows " +"console, this only applies when :envvar:`PYTHONLEGACYWINDOWSSTDIO` is also " +"set." +msgstr "" +"在所有平台上,都可以通过在 Python 启动前设置 :envvar:`PYTHONIOENCODING` 环境变量来重写字符编码,或通过新的 " +":option:`-X` ``utf8`` 命令行选项和 :envvar:`PYTHONUTF8` 环境变量来设置。但是,对 Windows " +"控制台来说,上述方法仅在设置了 :envvar:`PYTHONLEGACYWINDOWSSTDIO` 后才起效。" + +#: ../../library/sys.rst:2044 +msgid "" +"When interactive, the ``stdout`` stream is line-buffered. Otherwise, it is " +"block-buffered like regular text files. The ``stderr`` stream is line-" +"buffered in both cases. You can make both streams unbuffered by passing the" +" :option:`-u` command-line option or setting the :envvar:`PYTHONUNBUFFERED` " +"environment variable." +msgstr "" +"交互模式下,``stdout`` 流是行缓冲的。其他情况下,它像常规文本文件一样是块缓冲的。两种情况下的 ``stderr`` " +"流都是行缓冲的。要使得两个流都变成无缓冲,可以传入 :option:`-u` 命令行选项或设置 :envvar:`PYTHONUNBUFFERED` " +"环境变量。" + +#: ../../library/sys.rst:2050 +msgid "" +"Non-interactive ``stderr`` is now line-buffered instead of fully buffered." +msgstr "非交互模式下,``stderr`` 现在是行缓冲的,而不是全缓冲的。" + +#: ../../library/sys.rst:2056 +msgid "" +"To write or read binary data from/to the standard streams, use the " +"underlying binary :data:`~io.TextIOBase.buffer` object. For example, to " +"write bytes to :data:`stdout`, use ``sys.stdout.buffer.write(b'abc')``." +msgstr "" +"要从标准流写入或读取二进制数据,请使用底层二进制 :data:`~io.TextIOBase.buffer` 对象。例如,要将字节写入 " +":data:`stdout`,请使用 ``sys.stdout.buffer.write(b'abc')``。" + +#: ../../library/sys.rst:2060 +msgid "" +"However, if you are writing a library (and do not control in which context " +"its code will be executed), be aware that the standard streams may be " +"replaced with file-like objects like :class:`io.StringIO` which do not " +"support the :attr:`!buffer` attribute." +msgstr "" +"但是,如果你正在编写一个库(并且不能控制其代码执行所在的上下文),请注意标准流可能会被不支持 :attr:`!buffer` 属性的文件型对象如 " +":class:`io.StringIO` 所取代。" + +#: ../../library/sys.rst:2070 +msgid "" +"These objects contain the original values of ``stdin``, ``stderr`` and " +"``stdout`` at the start of the program. They are used during finalization, " +"and could be useful to print to the actual standard stream no matter if the " +"``sys.std*`` object has been redirected." +msgstr "" +"程序开始时,这些对象存有 ``stdin``、``stderr`` 和 ``stdout`` " +"的初始值。它们在程序结束前都可以使用,且在需要向实际的标准流打印内容时很有用,无论 ``sys.std*`` 对象是否已重定向。" + +#: ../../library/sys.rst:2075 +msgid "" +"It can also be used to restore the actual files to known working file " +"objects in case they have been overwritten with a broken object. However, " +"the preferred way to do this is to explicitly save the previous stream " +"before replacing it, and restore the saved object." +msgstr "" +"如果实际文件已经被覆盖成一个损坏的对象了,那它也可用于将实际文件还原成能正常工作的文件对象。但是,本过程的最佳方法应该是,在原来的流被替换之前就显式地保存它,并使用这一保存的对象来还原。" + +#: ../../library/sys.rst:2081 +msgid "" +"Under some conditions ``stdin``, ``stdout`` and ``stderr`` as well as the " +"original values ``__stdin__``, ``__stdout__`` and ``__stderr__`` can be " +"``None``. It is usually the case for Windows GUI apps that aren't connected " +"to a console and Python apps started with :program:`pythonw`." +msgstr "" +"某些情况下的 ``stdin``、``stdout`` 和 ``stderr`` 以及初始值 ``__stdin__``、``__stdout__`` " +"和 ``__stderr__`` 可以是 ``None``。通常发生在未连接到控制台的 Windows GUI app 中,以及在用 " +":program:`pythonw` 启动的 Python app 中。" + +#: ../../library/sys.rst:2089 +msgid "" +"A frozenset of strings containing the names of standard library modules." +msgstr "一个包含标准库模块名称字符串的冻结集合。" + +#: ../../library/sys.rst:2091 +msgid "" +"It is the same on all platforms. Modules which are not available on some " +"platforms and modules disabled at Python build are also listed. All module " +"kinds are listed: pure Python, built-in, frozen and extension modules. Test " +"modules are excluded." +msgstr "" +"它在所有平台上都保持一致。在某些平台上不可用的模块和在 Python 编译时被禁用的模块也会被列出。所有种类的模块都会被列出:纯 Python " +"模块、内置模块、冻结模块和扩展模块等。测试模块则会被排除掉。" + +#: ../../library/sys.rst:2096 +msgid "" +"For packages, only the main package is listed: sub-packages and sub-modules " +"are not listed. For example, the ``email`` package is listed, but the " +"``email.mime`` sub-package and the ``email.message`` sub-module are not " +"listed." +msgstr "" +"对于包来说,仅会列出主包:子包和子模块不会被列出。例如,``email`` 包会被列出,但 ``email.mime`` 子包和 " +"``email.message`` 子模块不会被列出。" + +#: ../../library/sys.rst:2101 +msgid "See also the :data:`sys.builtin_module_names` list." +msgstr "另请参阅 :data:`sys.builtin_module_names` 列表。" + +#: ../../library/sys.rst:2108 +msgid "" +"A :term:`named tuple` holding information about the thread implementation." +msgstr "一个 :term:`具名元组 `,包含线程实现的信息。" + +#: ../../library/sys.rst:2113 +msgid "The name of the thread implementation:" +msgstr "线程实现的名称:" + +#: ../../library/sys.rst:2115 +msgid "``\"nt\"``: Windows threads" +msgstr "``\"nt\"``: Windows 线程" + +#: ../../library/sys.rst:2116 +msgid "``\"pthread\"``: POSIX threads" +msgstr "``\"pthread\"``: POSIX 线程" + +#: ../../library/sys.rst:2117 +msgid "" +"``\"pthread-stubs\"``: stub POSIX threads (on WebAssembly platforms without " +"threading support)" +msgstr "``\"pthread-stubs\"``: 存根 POSIX 线程(在不支持线程的 WebAssembly 平台上)" + +#: ../../library/sys.rst:2119 +msgid "``\"solaris\"``: Solaris threads" +msgstr "``\"solaris\"``: Solaris 线程" + +#: ../../library/sys.rst:2123 +msgid "The name of the lock implementation:" +msgstr "锁实现的名称:" + +#: ../../library/sys.rst:2125 +msgid "``\"semaphore\"``: a lock uses a semaphore" +msgstr "``\"semaphore\"``: 锁使用一个信号量" + +#: ../../library/sys.rst:2126 +msgid "``\"mutex+cond\"``: a lock uses a mutex and a condition variable" +msgstr "``\"mutex+cond\"``: 锁使用互斥和条件变量" + +#: ../../library/sys.rst:2127 +msgid "``None`` if this information is unknown" +msgstr "``None`` 如果此信息未知" + +#: ../../library/sys.rst:2131 +msgid "" +"The name and version of the thread library. It is a string, or ``None`` if " +"this information is unknown." +msgstr "线程库的名称和版本。它是一个字符串,如果此信息未知则为 ``None``。" + +#: ../../library/sys.rst:2139 +msgid "" +"When this variable is set to an integer value, it determines the maximum " +"number of levels of traceback information printed when an unhandled " +"exception occurs. The default is ``1000``. When set to ``0`` or less, all " +"traceback information is suppressed and only the exception type and value " +"are printed." +msgstr "" +"当该变量值设置为整数,在发生未处理的异常时,它将决定打印的回溯信息的最大层级数。默认为 ``1000``。当将其设置为 ``0`` 或小于 " +"0,将关闭所有回溯信息,并且只打印异常类型和异常值。" + +#: ../../library/sys.rst:2147 +msgid "Handle an unraisable exception." +msgstr "处理一个无法抛出的异常。" + +#: ../../library/sys.rst:2149 +msgid "" +"Called when an exception has occurred but there is no way for Python to " +"handle it. For example, when a destructor raises an exception or during " +"garbage collection (:func:`gc.collect`)." +msgstr "" +"它会在发生了一个异常但 Python 没有办法处理时被调用。例如,当一个析构器引发了异常,或在垃圾回收 (:func:`gc.collect`) " +"期间引发了异常。" + +#: ../../library/sys.rst:2153 +msgid "The *unraisable* argument has the following attributes:" +msgstr "*unraisable* 参数具有以下属性:" + +#: ../../library/sys.rst:2155 +msgid ":attr:`!exc_type`: Exception type." +msgstr ":attr:`!exc_type`: 异常类型。" + +#: ../../library/sys.rst:2156 +msgid ":attr:`!exc_value`: Exception value, can be ``None``." +msgstr ":attr:`!exc_value`: 异常值,可以为 ``None``。" + +#: ../../library/sys.rst:2157 +msgid ":attr:`!exc_traceback`: Exception traceback, can be ``None``." +msgstr ":attr:`!exc_traceback`: 异常回溯,可以为 ``None``。" + +#: ../../library/sys.rst:2158 +msgid ":attr:`!err_msg`: Error message, can be ``None``." +msgstr ":attr:`!err_msg`: 错误消息,可以为 ``None``。" + +#: ../../library/sys.rst:2159 +msgid ":attr:`!object`: Object causing the exception, can be ``None``." +msgstr ":attr:`!object`: 导致异常的对象,可以为 ``None``。" + +#: ../../library/sys.rst:2161 +msgid "" +"The default hook formats :attr:`!err_msg` and :attr:`!object` as: " +"``f'{err_msg}: {object!r}'``; use \"Exception ignored in\" error message if " +":attr:`!err_msg` is ``None``." +msgstr "" +"默认的钩子会将 :attr:`!err_msg` 和 :attr:`!object` 格式化为: ``f'{err_msg}: " +"{object!r}'``;如果 :attr:`!err_msg` 为 ``None`` 则会使用 \"Exception ignored in\" " +"错误消息。" + +#: ../../library/sys.rst:2165 +msgid "" +":func:`sys.unraisablehook` can be overridden to control how unraisable " +"exceptions are handled." +msgstr "要改变无法抛出的异常的处理过程,可以重写 :func:`sys.unraisablehook`。" + +#: ../../library/sys.rst:2170 +msgid ":func:`excepthook` which handles uncaught exceptions." +msgstr ":func:`excepthook` 处理未捕获的异常。" + +#: ../../library/sys.rst:2174 +msgid "" +"Storing :attr:`!exc_value` using a custom hook can create a reference cycle." +" It should be cleared explicitly to break the reference cycle when the " +"exception is no longer needed." +msgstr "使用自定义钩子存储 :attr:`!exc_value` 可能会创建引用循环。当该异常不再需要时应当显式地清空以打破引用循环。" + +#: ../../library/sys.rst:2178 +msgid "" +"Storing :attr:`!object` using a custom hook can resurrect it if it is set to" +" an object which is being finalized. Avoid storing :attr:`!object` after the" +" custom hook completes to avoid resurrecting objects." +msgstr "" +"使用自定义钩子存储 :attr:`!object` 可能会在它被设为正在终结的对象时将其复活。为避免对象复活应当避免在自定义钩子完成后存储 " +":attr:`!object`." + +#: ../../library/sys.rst:2182 ../../library/sys.rst:2184 +msgid "" +"Raise an auditing event ``sys.unraisablehook`` with arguments *hook*, " +"*unraisable* when an exception that cannot be handled occurs. The " +"*unraisable* object is the same as what will be passed to the hook. If no " +"hook has been set, *hook* may be ``None``." +msgstr "" +"当发生无法处理的异常时将引发一个审计事件 ``sys.unraisablehook``,附带参数 *hook*、*unraisable*。其中 " +"*unraisable* 对象与传递给钩子的对象相同。如果没有设置钩子,那么 *hook* 可以为 ``None``。" + +#: ../../library/sys.rst:2193 +msgid "" +"A string containing the version number of the Python interpreter plus " +"additional information on the build number and compiler used. This string " +"is displayed when the interactive interpreter is started. Do not extract " +"version information out of it, rather, use :data:`version_info` and the " +"functions provided by the :mod:`platform` module." +msgstr "" +"一个包含 Python 解释器版本号加编译版本号以及所用编译器等额外信息的字符串。此字符串会在交互式解释器启动时显示。 " +"请不要从中提取版本信息,而应当使用 :data:`version_info` 以及 :mod:`platform` 模块所提供的函数。" + +#: ../../library/sys.rst:2202 +msgid "" +"The C API version, equivalent to the C macro :c:macro:`PYTHON_API_VERSION`. " +"Defined for backwards compatibility." +msgstr "该 C API 版本与 C 宏 :c:macro:`PYTHON_API_VERSION` 等效,为保持向后兼容性而定义。" + +#: ../../library/sys.rst:2205 +msgid "" +"Currently, this constant is not updated in new Python versions, and is not " +"useful for versioning. This may change in the future." +msgstr "目前,该常量在新的 Python 版本中没有更新,并且对于版本控制没有用处。这在未来可能会改变。" + +#: ../../library/sys.rst:2211 +msgid "" +"A tuple containing the five components of the version number: *major*, " +"*minor*, *micro*, *releaselevel*, and *serial*. All values except " +"*releaselevel* are integers; the release level is ``'alpha'``, ``'beta'``, " +"``'candidate'``, or ``'final'``. The ``version_info`` value corresponding " +"to the Python version 2.0 is ``(2, 0, 0, 'final', 0)``. The components can " +"also be accessed by name, so ``sys.version_info[0]`` is equivalent to " +"``sys.version_info.major`` and so on." +msgstr "" +"一个包含版本号五部分的元组:*major*, *minor*, *micro*, *releaselevel* 和 *serial*。除 " +"*releaselevel* 外的所有值均为整数;发布级别值则为 ``'alpha'``, ``'beta'``, ``'candidate'`` 或 " +"``'final'``。对应于 Python 版本 2.0 的 ``version_info`` 值为 ``(2, 0, 0, 'final', " +"0)``。这些部分也可按名称访问,因此 ``sys.version_info[0]`` 就等价于 " +"``sys.version_info.major``,依此类推。" + +#: ../../library/sys.rst:2219 +msgid "Added named component attributes." +msgstr "增加了以名称表示的各部分属性。" + +#: ../../library/sys.rst:2224 +msgid "" +"This is an implementation detail of the warnings framework; do not modify " +"this value. Refer to the :mod:`warnings` module for more information on the" +" warnings framework." +msgstr "这是警告框架的一个实现细节;请不要修改此值。有关警告框架的更多信息请参阅 :mod:`warnings` 模块。" + +#: ../../library/sys.rst:2231 +msgid "" +"The version number used to form registry keys on Windows platforms. This is " +"stored as string resource 1000 in the Python DLL. The value is normally the" +" major and minor versions of the running Python interpreter. It is provided" +" in the :mod:`!sys` module for informational purposes; modifying this value " +"has no effect on the registry keys used by Python." +msgstr "" +"用于在 Windows 平台上作为注册表键的版本号。这在 Python DLL 中被存储为 1000 号字符串资源。 其值通常是正在运行的 Python" +" 解释器的主要和次要版本号。 它在 :mod:`!sys` 模块中提供是为了信息展示目的;修改此值不会影响 Python 所使用的注册表键。" + +#: ../../library/sys.rst:2243 +msgid "" +"Namespace containing functions and constants for register callbacks and " +"controlling monitoring events. See :mod:`sys.monitoring` for details." +msgstr "包含用于注册回调和控制监控事件的函数和常量的命名空间。详情参见 :mod:`sys.monitoring`。" + +#: ../../library/sys.rst:2249 +msgid "" +"A dictionary of the various implementation-specific flags passed through the" +" :option:`-X` command-line option. Option names are either mapped to their " +"values, if given explicitly, or to :const:`True`. Example:" +msgstr "" +"一个字典,包含通过 :option:`-X` 命令行选项传递的旗标,这些旗标专属于各种具体实现。选项名称将会映射到对应的值(如果显式指定)或者 " +":const:`True`。例如:" + +#: ../../library/sys.rst:2253 +msgid "" +"$ ./python -Xa=b -Xc\n" +"Python 3.2a3+ (py3k, Oct 16 2010, 20:14:50)\n" +"[GCC 4.4.3] on linux2\n" +"Type \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n" +">>> import sys\n" +">>> sys._xoptions\n" +"{'a': 'b', 'c': True}" +msgstr "" +"$ ./python -Xa=b -Xc\n" +"Python 3.2a3+ (py3k, Oct 16 2010, 20:14:50)\n" +"[GCC 4.4.3] on linux2\n" +"Type \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n" +">>> import sys\n" +">>> sys._xoptions\n" +"{'a': 'b', 'c': True}" + +#: ../../library/sys.rst:2265 +msgid "" +"This is a CPython-specific way of accessing options passed through " +":option:`-X`. Other implementations may export them through other means, or" +" not at all." +msgstr "这是 CPython 专属的访问通过 :option:`-X` 传递的选项的方式。其他实现可能会通过其他方式导出它们,或者完全不导出。" + +#: ../../library/sys.rst:2273 +msgid "Citations" +msgstr "引用" + +#: ../../library/sys.rst:2274 +msgid "" +"ISO/IEC 9899:1999. \"Programming languages -- C.\" A public draft of this " +"standard is available at https://www.open-" +"std.org/jtc1/sc22/wg14/www/docs/n1256.pdf\\ ." +msgstr "" +"ISO/IEC 9899:1999. \"Programming languages -- C.\" 该标准的公开草案可从 " +"https://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf 获得。" + +#: ../../library/sys.rst:99 +msgid "auditing" +msgstr "审计" + +#: ../../library/sys.rst:461 +msgid "object" +msgstr "object -- 对象" + +#: ../../library/sys.rst:461 +msgid "traceback" +msgstr "traceback -- 回溯" + +#: ../../library/sys.rst:990 ../../library/sys.rst:1678 +msgid "profile function" +msgstr "性能分析函数" + +#: ../../library/sys.rst:990 ../../library/sys.rst:1678 +msgid "profiler" +msgstr "性能分析器" + +#: ../../library/sys.rst:999 ../../library/sys.rst:1761 +msgid "trace function" +msgstr "追踪函数" + +#: ../../library/sys.rst:999 ../../library/sys.rst:1761 +msgid "debugger" +msgstr "调试器" + +#: ../../library/sys.rst:1490 +msgid "module" +msgstr "module" + +#: ../../library/sys.rst:1490 +msgid "search" +msgstr "搜索" + +#: ../../library/sys.rst:1490 +msgid "path" +msgstr "path" + +#: ../../library/sys.rst:1642 +msgid "interpreter prompts" +msgstr "解释器提示符" + +#: ../../library/sys.rst:1642 +msgid "prompts, interpreter" +msgstr "提示符,解释器" + +#: ../../library/sys.rst:1642 +msgid ">>>" +msgstr ">>>" + +#: ../../library/sys.rst:1642 +msgid "interpreter prompt" +msgstr "解释器提示符" + +#: ../../library/sys.rst:1642 +msgid "..." +msgstr "..." diff --git a/library/sys_path_init.po b/library/sys_path_init.po new file mode 100644 index 0000000000..02a12432a6 --- /dev/null +++ b/library/sys_path_init.po @@ -0,0 +1,270 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: 99 , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/sys_path_init.rst:4 +msgid "The initialization of the :data:`sys.path` module search path" +msgstr ":data:`sys.path` 模块搜索路径的初始化" + +#: ../../library/sys_path_init.rst:6 +msgid "" +"A module search path is initialized when Python starts. This module search " +"path may be accessed at :data:`sys.path`." +msgstr "模块搜索路径是在 Python 启动时被初始化的。这个模块搜索路径可通过 :data:`sys.path` 来访问。" + +#: ../../library/sys_path_init.rst:9 +msgid "" +"The first entry in the module search path is the directory that contains the" +" input script, if there is one. Otherwise, the first entry is the current " +"directory, which is the case when executing the interactive shell, a " +":option:`-c` command, or :option:`-m` module." +msgstr "" +"模块搜索路径的第一个条目是包含输入脚本的目录,如果存在输入脚本的话。否则,第一个条目将是当前目录,当执行交互式 shell, :option:`-c` " +"命令,或 :option:`-m` 模块时都属于这种情况。" + +#: ../../library/sys_path_init.rst:14 +msgid "" +"The :envvar:`PYTHONPATH` environment variable is often used to add " +"directories to the search path. If this environment variable is found then " +"the contents are added to the module search path." +msgstr ":envvar:`PYTHONPATH` 环境变量经常被用于将目录添加到搜索路径。如果发现了该环境变量则其内容将被添加到模块搜索路径中。" + +#: ../../library/sys_path_init.rst:20 +msgid "" +":envvar:`PYTHONPATH` will affect all installed Python versions/environments." +" Be wary of setting this in your shell profile or global environment " +"variables. The :mod:`site` module offers more nuanced techniques as " +"mentioned below." +msgstr "" +":envvar:`PYTHONPATH` 将影响所有已安装的 Python 版本/环境。在你的 shell " +"用户配置或全局环境变量中设置它时需要小心谨慎。 :mod:`site` 模块提供了下文所述的更细微的技巧。" + +#: ../../library/sys_path_init.rst:24 +msgid "" +"The next items added are the directories containing standard Python modules " +"as well as any :term:`extension module`\\s that these modules depend on. " +"Extension modules are ``.pyd`` files on Windows and ``.so`` files on other " +"platforms. The directory with the platform-independent Python modules is " +"called ``prefix``. The directory with the extension modules is called " +"``exec_prefix``." +msgstr "" +"随后加入的条目是包含标准 Python 模块以及这些模块所依赖的任何 :term:`extension module` 的目录。扩展模块在 " +"Windows 上为 ``.pyd`` 文件而在其他平台上则为 ``.so`` 文件。独立于平台的 Python 模块的目录称为 " +"``prefix``。扩展模块的目录称为 ``exec_prefix``。" + +#: ../../library/sys_path_init.rst:30 +msgid "" +"The :envvar:`PYTHONHOME` environment variable may be used to set the " +"``prefix`` and ``exec_prefix`` locations. Otherwise these directories are " +"found by using the Python executable as a starting point and then looking " +"for various 'landmark' files and directories. Note that any symbolic links " +"are followed so the real Python executable location is used as the search " +"starting point. The Python executable location is called ``home``." +msgstr "" +":envvar:`PYTHONHOME` 环境变量可以被用于设置 ``prefix`` 和 ``exec_prefix`` 的位置。 " +"在其他情况下这些目录将使用 Python 可执行文件作为起始点来确定然后再查找几处 '地标' 文件和目录。 " +"请注意任何符号链接也会被追踪解析以便使用实际的 Python 可执行文件位置作为搜索起始点。这个 Python 可执行文件位置被称为 ``home``." + +#: ../../library/sys_path_init.rst:37 +msgid "" +"Once ``home`` is determined, the ``prefix`` directory is found by first " +"looking for :file:`python{majorversion}{minorversion}.zip` " +"(``python311.zip``). On Windows the zip archive is searched for in ``home`` " +"and on Unix the archive is expected to be in :file:`lib`. Note that the " +"expected zip archive location is added to the module search path even if the" +" archive does not exist. If no archive was found, Python on Windows will " +"continue the search for ``prefix`` by looking for :file:`Lib\\\\os.py`. " +"Python on Unix will look for " +":file:`lib/python{majorversion}.{minorversion}/os.py` " +"(``lib/python3.11/os.py``). On Windows ``prefix`` and ``exec_prefix`` are " +"the same, however on other platforms " +":file:`lib/python{majorversion}.{minorversion}/lib-dynload` " +"(``lib/python3.11/lib-dynload``) is searched for and used as an anchor for " +"``exec_prefix``. On some platforms :file:`lib` may be :file:`lib64` or " +"another value, see :data:`sys.platlibdir` and :envvar:`PYTHONPLATLIBDIR`." +msgstr "" +"一旦确定了 ``home``,则 ``prefix`` 目录将通过首先查找 " +":file:`python{majorversion}{minorversion}.zip` (``python311.zip``) 来找到。在 " +"Windows 上将会到 ``home`` 中搜索 zip 归档而在 Unix 上则会到 :file:`lib` 中搜索它。请注意预期的 zip " +"归档位置即使在此归档不存在时仍然会被添加到模块搜索路径。如果未找到归档,在 Windows 上 Python 将继续通过查找 " +":file:`Lib\\\\os.py` 来搜索 ``prefix``。在 Unix 上 Python 将查找 " +":file:`lib/python{majorversion}.{minorversion}/os.py` " +"(``lib/python3.11/os.py``)。在 Windows 上 ``prefix`` 和 ``exec_prefix`` " +"是相同的,但是在其他平台上则会搜索 :file:`lib/python{majorversion}.{minorversion}/lib-" +"dynload` (``lib/python3.11/lib-dynload``) 并将其用作 ``exec_prefix`` 的锚点。在某些平台上 " +":file:`lib` 可能为 :file:`lib64` 或其他值,请参阅 :data:`sys.platlibdir` 和 " +":envvar:`PYTHONPLATLIBDIR`." + +#: ../../library/sys_path_init.rst:50 +msgid "" +"Once found, ``prefix`` and ``exec_prefix`` are available at " +":data:`sys.base_prefix` and :data:`sys.base_exec_prefix` respectively." +msgstr "" +"一旦找到,``prefix`` 和 ``exec_prefix`` 将分别在 :data:`sys.base_prefix` 和 " +":data:`sys.base_exec_prefix` 上可用。" + +#: ../../library/sys_path_init.rst:53 +msgid "" +"If :envvar:`PYTHONHOME` is not set, and a ``pyvenv.cfg`` file is found " +"alongside the main executable, or in its parent directory, " +":data:`sys.prefix` and :data:`sys.exec_prefix` get set to the directory " +"containing ``pyvenv.cfg``, otherwise they are set to the same value as " +":data:`sys.base_prefix` and :data:`sys.base_exec_prefix`, respectively. This" +" is used by :ref:`sys-path-init-virtual-environments`." +msgstr "" +"如果未设置 :envvar:`PYTHONHOME`,而在主可执行文件所在位置或其父目录中找到了 ``pyvenv.cfg`` 文件,则会将 " +":data:`sys.prefix` 和 :data:`sys.exec_prefix` 设为包含 ``pyvenv.cfg`` " +"的目录,在其他情况下它们会被分别设为与 :data:`sys.base_prefix` 和 :data:`sys.base_exec_prefix` " +"相同的值。该值将被 :ref:`sys-path-init-virtual-environments` 使用。" + +#: ../../library/sys_path_init.rst:60 +msgid "" +"Finally, the :mod:`site` module is processed and :file:`site-packages` " +"directories are added to the module search path. The " +":envvar:`PYTHONUSERBASE` environment variable controls where is searched for" +" user site-packages and the :envvar:`PYTHONNOUSERSITE` environment variable " +"prevents searching for user site-packages all together. A common way to " +"customize the search path is to create :mod:`sitecustomize` or " +":mod:`usercustomize` modules as described in the :mod:`site` module " +"documentation." +msgstr "" + +#: ../../library/sys_path_init.rst:70 +msgid "" +"The command line options :option:`-E`, :option:`-P`, :option:`-I`, " +":option:`-S` and :option:`-s` further affect path calculations, see their " +"documentation for details." +msgstr "" + +#: ../../library/sys_path_init.rst:76 +msgid "" +":data:`sys.prefix` and :data:`sys.exec_prefix` are now set to the " +"``pyvenv.cfg`` directory during the path initialization. This was previously" +" done by :mod:`site`, therefore affected by :option:`-S`." +msgstr "" +"在路径初始化期间 :data:`sys.prefix` 和 :data:`sys.exec_prefix` 现在会被设为 ``pyvenv.cfg`` " +"目录。在之前版本中这是由 :mod:`site` 完成的,因而会受 :option:`-S` 影响。" + +#: ../../library/sys_path_init.rst:83 +msgid "Virtual Environments" +msgstr "虚拟环境" + +#: ../../library/sys_path_init.rst:85 +msgid "" +"Virtual environments place a ``pyvenv.cfg`` file in their prefix, which " +"causes :data:`sys.prefix` and :data:`sys.exec_prefix` to point to them, " +"instead of the base installation." +msgstr "" +"各虚拟环境会在其前缀中放置一个 ``pyvenv.cfg`` 文件,这将使得 :data:`sys.prefix` 和 " +":data:`sys.exec_prefix` 指向它们,而非指向基本安装位置。" + +#: ../../library/sys_path_init.rst:89 +msgid "" +"The ``prefix`` and ``exec_prefix`` values of the base installation are " +"available at :data:`sys.base_prefix` and :data:`sys.base_exec_prefix`." +msgstr "" +"基本安装版的 ``prefix`` 和 ``exec_prefix`` 值可从 :data:`sys.base_prefix` 和 " +":data:`sys.base_exec_prefix` 获取。" + +#: ../../library/sys_path_init.rst:92 +msgid "" +"As well as being used as a marker to identify virtual environments, " +"``pyvenv.cfg`` may also be used to configure the :mod:`site` initialization." +" Please refer to :mod:`site`'s :ref:`virtual environments documentation " +"`." +msgstr "" +"除了用作标识虚拟环境的标记,``pyvenv.cfg`` 还可被用来配置 :mod:`site` 的初始化。请参阅 :mod:`site` 的 " +":ref:`虚拟环境文档 `。" + +#: ../../library/sys_path_init.rst:99 +msgid ":envvar:`PYTHONHOME` overrides the ``pyvenv.cfg`` detection." +msgstr ":envvar:`PYTHONHOME` 将覆盖 ``pyvenv.cfg`` 检测。" + +#: ../../library/sys_path_init.rst:103 +msgid "" +"There are other ways \"virtual environments\" could be implemented. This " +"documentation refers to implementations based on the ``pyvenv.cfg`` " +"mechanism, such as :mod:`venv`, that many virtual environment " +"implementations follow." +msgstr "" + +#: ../../library/sys_path_init.rst:109 +msgid "_pth files" +msgstr "_pth 文件" + +#: ../../library/sys_path_init.rst:111 +msgid "" +"To completely override :data:`sys.path` create a ``._pth`` file with the " +"same name as the shared library or executable (``python._pth`` or " +"``python311._pth``). The shared library path is always known on Windows, " +"however it may not be available on other platforms. In the ``._pth`` file " +"specify one line for each path to add to :data:`sys.path`. The file based on" +" the shared library name overrides the one based on the executable, which " +"allows paths to be restricted for any program loading the runtime if " +"desired." +msgstr "" +"若要完全覆盖 :data:`sys.path` 则请创建一个与共享库或可执行文件 (``python._pth`` 或 " +"``python311._pth``) 同名的 ``._pth`` 文件。共享库路径在 Windows 上始终是已知的,但这在其他平台上也许会不可用。 " +"请在 ``._pth`` 文件中为添加到 :data:`sys.path` 的每个路径指定对应的一行。 " +"基于共享库名称的文件会覆盖基于可执行文件的对应文件,这允许在必要时为任何加载运行时的程序限制路径。" + +#: ../../library/sys_path_init.rst:119 +msgid "" +"When the file exists, all registry and environment variables are ignored, " +"isolated mode is enabled, and :mod:`site` is not imported unless one line in" +" the file specifies ``import site``. Blank paths and lines starting with " +"``#`` are ignored. Each path may be absolute or relative to the location of " +"the file. Import statements other than to ``site`` are not permitted, and " +"arbitrary code cannot be specified." +msgstr "" +"当文件存在时,将忽略所有注册表和环境变量,启用隔离模式,并且:除非文件中的一行指定 ``import site``,否则不会导入 " +":mod:`site`。空白路径和以 ``#`` 开头的行将被忽略。每个路径可以是绝对的或相对于文件的位置。不允许使用除 ``site`` " +"以外的导入语句,并且不能指定任意代码。" + +#: ../../library/sys_path_init.rst:126 +msgid "" +"Note that ``.pth`` files (without leading underscore) will be processed " +"normally by the :mod:`site` module when ``import site`` has been specified." +msgstr "请注意,当指定 ``import site`` 时,``.pth`` 文件(没有前导下划线)将由 :mod:`site` 模块正常处理。" + +#: ../../library/sys_path_init.rst:130 +msgid "Embedded Python" +msgstr "嵌入式 Python" + +#: ../../library/sys_path_init.rst:132 +msgid "" +"If Python is embedded within another application " +":c:func:`Py_InitializeFromConfig` and the :c:type:`PyConfig` structure can " +"be used to initialize Python. The path specific details are described at " +":ref:`init-path-config`." +msgstr "" +"如果 Python 被嵌入其他应用程序中则 :c:func:`Py_InitializeFromConfig` 和 :c:type:`PyConfig`" +" 结构体可被用来初始化 Python。路径专属的细节描述见 :ref:`init-path-config`。" + +#: ../../library/sys_path_init.rst:138 +msgid ":ref:`windows_finding_modules` for detailed Windows notes." +msgstr ":ref:`windows_finding_modules` 了解更多有关 Windows 的细节说明。" + +#: ../../library/sys_path_init.rst:139 +msgid ":ref:`using-on-unix` for Unix details." +msgstr ":ref:`using-on-unix` 了解 Unix 的相关细节。" diff --git a/library/sysconfig.po b/library/sysconfig.po new file mode 100644 index 0000000000..bfd94f2921 --- /dev/null +++ b/library/sysconfig.po @@ -0,0 +1,826 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/sysconfig.rst:2 +msgid "" +":mod:`!sysconfig` --- Provide access to Python's configuration information" +msgstr ":mod:`!sysconfig` --- 提供对 Python 配置信息的访问" + +#: ../../library/sysconfig.rst:12 +msgid "**Source code:** :source:`Lib/sysconfig`" +msgstr "**源代码:** :source:`Lib/sysconfig`" + +#: ../../library/sysconfig.rst:19 +msgid "" +"The :mod:`!sysconfig` module provides access to Python's configuration " +"information like the list of installation paths and the configuration " +"variables relevant for the current platform." +msgstr "" + +#: ../../library/sysconfig.rst:25 +msgid "Configuration variables" +msgstr "配置变量" + +#: ../../library/sysconfig.rst:27 +msgid "" +"A Python distribution contains a :file:`Makefile` and a :file:`pyconfig.h` " +"header file that are necessary to build both the Python binary itself and " +"third-party C extensions compiled using ``setuptools``." +msgstr "" +"一个包含 :file:`Makefile` 和 :file:`pyconfig.h` 头文件的 Python 分发版,这是构建 Python " +"二进制文件本身和用 ``setuptools`` 编译的第三方 C 扩展所必需的。" + +#: ../../library/sysconfig.rst:31 +msgid "" +":mod:`!sysconfig` puts all variables found in these files in a dictionary " +"that can be accessed using :func:`get_config_vars` or " +":func:`get_config_var`." +msgstr "" + +#: ../../library/sysconfig.rst:34 +msgid "Notice that on Windows, it's a much smaller set." +msgstr "请注意在 Windows 上,这是一个小得多的集合。" + +#: ../../library/sysconfig.rst:38 +msgid "" +"With no arguments, return a dictionary of all configuration variables " +"relevant for the current platform." +msgstr "不带参数时,返回一个与当前平台相关的所有配置变量的字典。" + +#: ../../library/sysconfig.rst:41 +msgid "" +"With arguments, return a list of values that result from looking up each " +"argument in the configuration variable dictionary." +msgstr "带参数时,返回一个由在配置变量字典中查找每个参数的结果的值组成的列表。" + +#: ../../library/sysconfig.rst:44 +msgid "For each argument, if the value is not found, return ``None``." +msgstr "对于每个参数,如果未找到值,则返回 ``None``。" + +#: ../../library/sysconfig.rst:49 +msgid "" +"Return the value of a single variable *name*. Equivalent to " +"``get_config_vars().get(name)``." +msgstr "返回单个变量 *name* 的值。等价于 ``get_config_vars().get(name)``。" + +#: ../../library/sysconfig.rst:52 +msgid "If *name* is not found, return ``None``." +msgstr "如果未找到 *name*,则返回 ``None``。" + +#: ../../library/sysconfig.rst:54 +msgid "Example of usage::" +msgstr "用法示例::" + +#: ../../library/sysconfig.rst:56 +msgid "" +">>> import sysconfig\n" +">>> sysconfig.get_config_var('Py_ENABLE_SHARED')\n" +"0\n" +">>> sysconfig.get_config_var('LIBDIR')\n" +"'/usr/local/lib'\n" +">>> sysconfig.get_config_vars('AR', 'CXX')\n" +"['ar', 'g++']" +msgstr "" +">>> import sysconfig\n" +">>> sysconfig.get_config_var('Py_ENABLE_SHARED')\n" +"0\n" +">>> sysconfig.get_config_var('LIBDIR')\n" +"'/usr/local/lib'\n" +">>> sysconfig.get_config_vars('AR', 'CXX')\n" +"['ar', 'g++']" + +#: ../../library/sysconfig.rst:68 +msgid "Installation paths" +msgstr "安装路径" + +#: ../../library/sysconfig.rst:70 +msgid "" +"Python uses an installation scheme that differs depending on the platform " +"and on the installation options. These schemes are stored in " +":mod:`!sysconfig` under unique identifiers based on the value returned by " +":const:`os.name`. The schemes are used by package installers to determine " +"where to copy files to." +msgstr "" + +#: ../../library/sysconfig.rst:75 +msgid "Python currently supports nine schemes:" +msgstr "Python 目前支持九种方案:" + +#: ../../library/sysconfig.rst:77 +msgid "" +"*posix_prefix*: scheme for POSIX platforms like Linux or macOS. This is the" +" default scheme used when Python or a component is installed." +msgstr "" +"*posix_prefix*: 针对 POSIX 平台如 Linux 或 macOS 的方案。这是在安装 Python 或者组件时的默认方案。" + +#: ../../library/sysconfig.rst:79 +msgid "" +"*posix_home*: scheme for POSIX platforms, when the *home* option is used. " +"This scheme defines paths located under a specific home prefix." +msgstr "*posix_home*: 当使用 *home* 选项时,针对 POSIX 平台的方案。该方案定义了位于特定 home 前缀下的路径。" + +#: ../../library/sysconfig.rst:81 +msgid "" +"*posix_user*: scheme for POSIX platforms, when the *user* option is used. " +"This scheme defines paths located under the user's home directory " +"(:const:`site.USER_BASE`)." +msgstr "" +"*posix_user*: 当使用 *user* 选项时,针对 POSIX 平台的方案。该方案定义了位于用户主目录 " +"(:const:`site.USER_BASE`) 下的路径。" + +#: ../../library/sysconfig.rst:84 +msgid "" +"*posix_venv*: scheme for :mod:`Python virtual environments ` on POSIX " +"platforms; by default it is the same as *posix_prefix*." +msgstr "" +"*posix_venv*: 针对 POSIX 平台上 :mod:`Python 虚拟环境 ` 的方案;在默认情况下与 " +"*posix_prefix* 相同。" + +#: ../../library/sysconfig.rst:86 +msgid "" +"*nt*: scheme for Windows. This is the default scheme used when Python or a " +"component is installed." +msgstr "*nt*: 针对 Windows 的方案。这是在安装 Python 或其组件时的默认方案。" + +#: ../../library/sysconfig.rst:88 +msgid "*nt_user*: scheme for Windows, when the *user* option is used." +msgstr "*nt_user*: 针对 Windows,当使用了 *user* 选项时的方案。" + +#: ../../library/sysconfig.rst:89 +msgid "" +"*nt_venv*: scheme for :mod:`Python virtual environments ` on Windows; " +"by default it is the same as *nt*." +msgstr "" +"*nt_venv*: 针对 Windows 上 :mod:`Python 虚拟环境 ` 的方案;在默认情况下与 *nt* 相同。" + +#: ../../library/sysconfig.rst:91 +msgid "" +"*venv*: a scheme with values from either *posix_venv* or *nt_venv* depending" +" on the platform Python runs on." +msgstr "*venv*: 根据 Python 运行所在平台的不同来设置 *posix_venv* 或 *nt_venv* 的值的方案。" + +#: ../../library/sysconfig.rst:93 +msgid "" +"*osx_framework_user*: scheme for macOS, when the *user* option is used." +msgstr "*osx_framework_user*: 针对 macOS,当使用了 *user* 选项时的方案。" + +#: ../../library/sysconfig.rst:95 +msgid "" +"Each scheme is itself composed of a series of paths and each path has a " +"unique identifier. Python currently uses eight paths:" +msgstr "每个方案本身由一系列路径组成并且每个路径都有唯一的标识符。Python 目前使用了八个路径:" + +#: ../../library/sysconfig.rst:98 +msgid "" +"*stdlib*: directory containing the standard Python library files that are " +"not platform-specific." +msgstr "*stdlib*: 包含非平台专属的标准 Python 库文件的目录。" + +#: ../../library/sysconfig.rst:100 +msgid "" +"*platstdlib*: directory containing the standard Python library files that " +"are platform-specific." +msgstr "*platstdlib*: 包含平台专属的标准 Python 库文件的目录。" + +#: ../../library/sysconfig.rst:102 +msgid "*platlib*: directory for site-specific, platform-specific files." +msgstr "*platlib*: 用于站点专属、平台专属的文件的目录。" + +#: ../../library/sysconfig.rst:103 +msgid "" +"*purelib*: directory for site-specific, non-platform-specific files ('pure' " +"Python)." +msgstr "*purelib*: 用于站点专属、非平台专属的文件(‘纯’Python)的目录。" + +#: ../../library/sysconfig.rst:104 +msgid "" +"*include*: directory for non-platform-specific header files for the Python " +"C-API." +msgstr "*include*: 针对用于 Python C-API 的非平台专属头文件的目录。" + +#: ../../library/sysconfig.rst:106 +msgid "" +"*platinclude*: directory for platform-specific header files for the Python " +"C-API." +msgstr "*platinclude*: 针对用于 Python C-API 的平台专属头文件的目录。" + +#: ../../library/sysconfig.rst:108 +msgid "*scripts*: directory for script files." +msgstr "*scripts*: 用于脚本文件的目录。" + +#: ../../library/sysconfig.rst:109 +msgid "*data*: directory for data files." +msgstr "*data*: 用于数据文件的目录。" + +#: ../../library/sysconfig.rst:115 +msgid "User scheme" +msgstr "用户方案" + +#: ../../library/sysconfig.rst:117 +msgid "" +"This scheme is designed to be the most convenient solution for users that " +"don't have write permission to the global site-packages directory or don't " +"want to install into it." +msgstr "此方案被设计为针对没有全局 site-packages 目录写入权限或不想安装到该目录的用户的最便捷解决方案。" + +#: ../../library/sysconfig.rst:121 +msgid "" +"Files will be installed into subdirectories of :const:`site.USER_BASE` " +"(written as :file:`{userbase}` hereafter). This scheme installs pure Python" +" modules and extension modules in the same location (also known as " +":const:`site.USER_SITE`)." +msgstr "" +"文件将被安装到 :const:`site.USER_BASE` (以下称为 :file:`{userbase}`) 的子目录中。此方案将在同一个位置 " +"(或称 :const:`site.USER_SITE`) 中安装纯 Python 模块和扩展模块。" + +#: ../../library/sysconfig.rst:126 +msgid "``posix_user``" +msgstr "``posix_user``" + +#: ../../library/sysconfig.rst:129 ../../library/sysconfig.rst:144 +#: ../../library/sysconfig.rst:159 ../../library/sysconfig.rst:187 +#: ../../library/sysconfig.rst:229 ../../library/sysconfig.rst:245 +msgid "Path" +msgstr "Path" + +#: ../../library/sysconfig.rst:129 ../../library/sysconfig.rst:144 +#: ../../library/sysconfig.rst:159 ../../library/sysconfig.rst:187 +#: ../../library/sysconfig.rst:229 ../../library/sysconfig.rst:245 +msgid "Installation directory" +msgstr "安装目录" + +#: ../../library/sysconfig.rst:131 ../../library/sysconfig.rst:146 +#: ../../library/sysconfig.rst:161 ../../library/sysconfig.rst:189 +#: ../../library/sysconfig.rst:231 ../../library/sysconfig.rst:247 +msgid "*stdlib*" +msgstr "*stdlib*" + +#: ../../library/sysconfig.rst:131 ../../library/sysconfig.rst:132 +msgid ":file:`{userbase}/lib/python{X.Y}`" +msgstr ":file:`{userbase}/lib/python{X.Y}`" + +#: ../../library/sysconfig.rst:132 ../../library/sysconfig.rst:147 +#: ../../library/sysconfig.rst:162 ../../library/sysconfig.rst:190 +#: ../../library/sysconfig.rst:232 ../../library/sysconfig.rst:248 +msgid "*platstdlib*" +msgstr "*platstdlib*" + +#: ../../library/sysconfig.rst:133 ../../library/sysconfig.rst:148 +#: ../../library/sysconfig.rst:163 ../../library/sysconfig.rst:191 +#: ../../library/sysconfig.rst:233 ../../library/sysconfig.rst:249 +msgid "*platlib*" +msgstr "*platlib*" + +#: ../../library/sysconfig.rst:133 ../../library/sysconfig.rst:134 +msgid ":file:`{userbase}/lib/python{X.Y}/site-packages`" +msgstr ":file:`{userbase}/lib/python{X.Y}/site-packages`" + +#: ../../library/sysconfig.rst:134 ../../library/sysconfig.rst:149 +#: ../../library/sysconfig.rst:164 ../../library/sysconfig.rst:192 +#: ../../library/sysconfig.rst:234 ../../library/sysconfig.rst:250 +msgid "*purelib*" +msgstr "*purelib*" + +#: ../../library/sysconfig.rst:135 ../../library/sysconfig.rst:150 +#: ../../library/sysconfig.rst:165 ../../library/sysconfig.rst:193 +#: ../../library/sysconfig.rst:235 ../../library/sysconfig.rst:251 +msgid "*include*" +msgstr "*include*" + +#: ../../library/sysconfig.rst:135 ../../library/sysconfig.rst:165 +msgid ":file:`{userbase}/include/python{X.Y}`" +msgstr ":file:`{userbase}/include/python{X.Y}`" + +#: ../../library/sysconfig.rst:136 ../../library/sysconfig.rst:151 +#: ../../library/sysconfig.rst:166 ../../library/sysconfig.rst:195 +#: ../../library/sysconfig.rst:237 ../../library/sysconfig.rst:253 +msgid "*scripts*" +msgstr "*scripts*" + +#: ../../library/sysconfig.rst:136 ../../library/sysconfig.rst:166 +msgid ":file:`{userbase}/bin`" +msgstr ":file:`{userbase}/bin`" + +#: ../../library/sysconfig.rst:137 ../../library/sysconfig.rst:152 +#: ../../library/sysconfig.rst:167 ../../library/sysconfig.rst:196 +#: ../../library/sysconfig.rst:238 ../../library/sysconfig.rst:254 +msgid "*data*" +msgstr "*data*" + +#: ../../library/sysconfig.rst:137 ../../library/sysconfig.rst:152 +#: ../../library/sysconfig.rst:167 +msgid ":file:`{userbase}`" +msgstr ":file:`{userbase}`" + +#: ../../library/sysconfig.rst:141 +msgid "``nt_user``" +msgstr "``nt_user``" + +#: ../../library/sysconfig.rst:146 ../../library/sysconfig.rst:147 +msgid ":file:`{userbase}\\\\Python{XY}`" +msgstr ":file:`{userbase}\\\\Python{XY}`" + +#: ../../library/sysconfig.rst:148 ../../library/sysconfig.rst:149 +msgid ":file:`{userbase}\\\\Python{XY}\\\\site-packages`" +msgstr ":file:`{userbase}\\\\Python{XY}\\\\site-packages`" + +#: ../../library/sysconfig.rst:150 +msgid ":file:`{userbase}\\\\Python{XY}\\\\Include`" +msgstr ":file:`{userbase}\\\\Python{XY}\\\\Include`" + +#: ../../library/sysconfig.rst:151 +msgid ":file:`{userbase}\\\\Python{XY}\\\\Scripts`" +msgstr ":file:`{userbase}\\\\Python{XY}\\\\Scripts`" + +#: ../../library/sysconfig.rst:156 +msgid "``osx_framework_user``" +msgstr "``osx_framework_user``" + +#: ../../library/sysconfig.rst:161 ../../library/sysconfig.rst:162 +msgid ":file:`{userbase}/lib/python`" +msgstr ":file:`{userbase}/lib/python`" + +#: ../../library/sysconfig.rst:163 ../../library/sysconfig.rst:164 +msgid ":file:`{userbase}/lib/python/site-packages`" +msgstr ":file:`{userbase}/lib/python/site-packages`" + +#: ../../library/sysconfig.rst:174 +msgid "Home scheme" +msgstr "主方案" + +#: ../../library/sysconfig.rst:176 +msgid "" +"The idea behind the \"home scheme\" is that you build and maintain a " +"personal stash of Python modules. This scheme's name is derived from the " +"idea of a \"home\" directory on Unix, since it's not unusual for a Unix user" +" to make their home directory have a layout similar to :file:`/usr/` or " +":file:`/usr/local/`. This scheme can be used by anyone, regardless of the " +"operating system they are installing for." +msgstr "" +"“主方案”背后的理念是你可以构建并维护个人的 Python 模块集。该方案的名称源自 Unix 上“主目录”的概念,因为通常 Unix " +"用户会将其主目录的布局设置为与 :file:`/usr/` 或 :file:`/usr/local/` 相似。 " +"任何人都可以使用该方案,无论其安装的操作系统是什么。" + +#: ../../library/sysconfig.rst:184 +msgid "``posix_home``" +msgstr "``posix_home``" + +#: ../../library/sysconfig.rst:189 ../../library/sysconfig.rst:190 +#: ../../library/sysconfig.rst:191 ../../library/sysconfig.rst:192 +msgid ":file:`{home}/lib/python`" +msgstr ":file:`{home}/lib/python`" + +#: ../../library/sysconfig.rst:193 ../../library/sysconfig.rst:194 +msgid ":file:`{home}/include/python`" +msgstr ":file:`{home}/include/python`" + +#: ../../library/sysconfig.rst:194 ../../library/sysconfig.rst:236 +#: ../../library/sysconfig.rst:252 +msgid "*platinclude*" +msgstr "*platinclude*" + +#: ../../library/sysconfig.rst:195 +msgid ":file:`{home}/bin`" +msgstr ":file:`{home}/bin`" + +#: ../../library/sysconfig.rst:196 +msgid ":file:`{home}`" +msgstr ":file:`{home}`" + +#: ../../library/sysconfig.rst:203 +msgid "Prefix scheme" +msgstr "前缀方案" + +#: ../../library/sysconfig.rst:205 +msgid "" +"The \"prefix scheme\" is useful when you wish to use one Python installation" +" to perform the build/install (i.e., to run the setup script), but install " +"modules into the third-party module directory of a different Python " +"installation (or something that looks like a different Python installation)." +" If this sounds a trifle unusual, it is---that's why the user and home " +"schemes come before. However, there are at least two known cases where the " +"prefix scheme will be useful." +msgstr "" +"“前缀方案”适用于当你希望使用一个 Python 安装程序来执行构建/安装(即运行 setup 脚本),但需要将模块安装到另一个 Python " +"安装版(或看起来类似于另一个 Python 安装版)的第三方模块目录中的情况。如果这听起来有点不寻常,确实如此 --- " +"这就是为什么要先介绍用户和主目录方案的原因。然而,至少有两种已知的情况会用到前缀方案。" + +#: ../../library/sysconfig.rst:212 +msgid "" +"First, consider that many Linux distributions put Python in :file:`/usr`, " +"rather than the more traditional :file:`/usr/local`. This is entirely " +"appropriate, since in those cases Python is part of \"the system\" rather " +"than a local add-on. However, if you are installing Python modules from " +"source, you probably want them to go in :file:`/usr/local/lib/python2.{X}` " +"rather than :file:`/usr/lib/python2.{X}`." +msgstr "" +"首先,许多 Linux 发行版都会将 Python 放在 :file:`/usr` 中,而不是传统的 :file:`/usr/local` 中。 " +"这是完全适当的,因为在这些情况下,Python 是“系统”的一部分而不是本地的附加组件。但是,如果你从源代码安装 Python " +"模块,你可能会想要将它们放在 :file:`/usr/local/lib/python2.{X}` 而不是 " +":file:`/usr/lib/python2.{X}` 中。" + +#: ../../library/sysconfig.rst:219 +msgid "" +"Another possibility is a network filesystem where the name used to write to " +"a remote directory is different from the name used to read it: for example, " +"the Python interpreter accessed as :file:`/usr/local/bin/python` might " +"search for modules in :file:`/usr/local/lib/python2.{X}`, but those modules " +"would have to be installed to, say, " +":file:`/mnt/{@server}/export/lib/python2.{X}`." +msgstr "" +"另一种可能性是在用于写入远程目录的名称与用于读取该目录的名称不同的网络文件系统:例如,作为 :file:`/usr/local/bin/python` " +"访问的 Python 解释器可能会在 :file:`/usr/local/lib/python2.{X}` 中搜索模块,但这些模块又必须安装到 " +":file:`/mnt/{@server}/export/lib/python2.{X}` 这样的地方。" + +#: ../../library/sysconfig.rst:226 +msgid "``posix_prefix``" +msgstr "``posix_prefix``" + +#: ../../library/sysconfig.rst:231 ../../library/sysconfig.rst:232 +msgid ":file:`{prefix}/lib/python{X.Y}`" +msgstr ":file:`{prefix}/lib/python{X.Y}`" + +#: ../../library/sysconfig.rst:233 ../../library/sysconfig.rst:234 +msgid ":file:`{prefix}/lib/python{X.Y}/site-packages`" +msgstr ":file:`{prefix}/lib/python{X.Y}/site-packages`" + +#: ../../library/sysconfig.rst:235 ../../library/sysconfig.rst:236 +msgid ":file:`{prefix}/include/python{X.Y}`" +msgstr ":file:`{prefix}/include/python{X.Y}`" + +#: ../../library/sysconfig.rst:237 +msgid ":file:`{prefix}/bin`" +msgstr ":file:`{prefix}/bin`" + +#: ../../library/sysconfig.rst:238 ../../library/sysconfig.rst:254 +msgid ":file:`{prefix}`" +msgstr ":file:`{prefix}`" + +#: ../../library/sysconfig.rst:242 +msgid "``nt``" +msgstr "``nt``" + +#: ../../library/sysconfig.rst:247 ../../library/sysconfig.rst:248 +msgid ":file:`{prefix}\\\\Lib`" +msgstr ":file:`{prefix}\\\\Lib`" + +#: ../../library/sysconfig.rst:249 ../../library/sysconfig.rst:250 +msgid ":file:`{prefix}\\\\Lib\\\\site-packages`" +msgstr ":file:`{prefix}\\\\Lib\\\\site-packages`" + +#: ../../library/sysconfig.rst:251 ../../library/sysconfig.rst:252 +msgid ":file:`{prefix}\\\\Include`" +msgstr ":file:`{prefix}\\\\Include`" + +#: ../../library/sysconfig.rst:253 +msgid ":file:`{prefix}\\\\Scripts`" +msgstr ":file:`{prefix}\\\\Scripts`" + +#: ../../library/sysconfig.rst:259 +msgid "Installation path functions" +msgstr "安装路径函数" + +#: ../../library/sysconfig.rst:261 +msgid "" +":mod:`!sysconfig` provides some functions to determine these installation " +"paths." +msgstr "" + +#: ../../library/sysconfig.rst:265 +msgid "" +"Return a tuple containing all schemes currently supported in " +":mod:`!sysconfig`." +msgstr "" + +#: ../../library/sysconfig.rst:271 +msgid "Return the default scheme name for the current platform." +msgstr "返回针对当前平台的默认方案的名称。" + +#: ../../library/sysconfig.rst:273 +msgid "" +"This function was previously named ``_get_default_scheme()`` and considered " +"an implementation detail." +msgstr "此函数之前被命名为 ``_get_default_scheme()`` 并被认为属于实现细节。" + +#: ../../library/sysconfig.rst:277 +msgid "" +"When Python runs from a virtual environment, the *venv* scheme is returned." +msgstr "当 Python 运行于虚拟环境时,将返回 *venv* 方案。" + +#: ../../library/sysconfig.rst:283 +msgid "" +"Return a preferred scheme name for an installation layout specified by " +"*key*." +msgstr "返回针对由 *key* 所指定的安装布局的推荐方案的名称。" + +#: ../../library/sysconfig.rst:285 +msgid "*key* must be either ``\"prefix\"``, ``\"home\"``, or ``\"user\"``." +msgstr "*key* 必须为 ``\"prefix\"``, ``\"home\"`` 或 ``\"user\"``。" + +#: ../../library/sysconfig.rst:287 +msgid "" +"The return value is a scheme name listed in :func:`get_scheme_names`. It can" +" be passed to :mod:`!sysconfig` functions that take a *scheme* argument, " +"such as :func:`get_paths`." +msgstr "" + +#: ../../library/sysconfig.rst:293 +msgid "" +"When Python runs from a virtual environment and ``key=\"prefix\"``, the " +"*venv* scheme is returned." +msgstr "当 Python 运行于虚拟环境且 ``key=\"prefix\"`` 时,将返回 *venv* 方案。" + +#: ../../library/sysconfig.rst:300 +msgid "" +"Return a dict containing preferred scheme names on the current platform. " +"Python implementers and redistributors may add their preferred schemes to " +"the ``_INSTALL_SCHEMES`` module-level global value, and modify this function" +" to return those scheme names, to e.g. provide different schemes for system " +"and language package managers to use, so packages installed by either do not" +" mix with those by the other." +msgstr "" +"返回一个包含当前平台推荐的方案名称的字典。Python 的实现方和再分发方可以将他们推荐的方案添加到 ``_INSTALL_SCHEMES`` " +"模块层级全局值,并修改此函数以返回这些方案名称,例如为各种系统和语言的包管理器提供不同的方案,这样它们各自安装的包就不会彼此混淆。" + +#: ../../library/sysconfig.rst:307 +msgid "" +"End users should not use this function, but :func:`get_default_scheme` and " +":func:`get_preferred_scheme` instead." +msgstr "" +"最终用户不应使用此函数,而应改用 :func:`get_default_scheme` 和 :func:`get_preferred_scheme`。" + +#: ../../library/sysconfig.rst:315 +msgid "" +"Return a tuple containing all path names currently supported in " +":mod:`!sysconfig`." +msgstr "" + +#: ../../library/sysconfig.rst:321 +msgid "" +"Return an installation path corresponding to the path *name*, from the " +"install scheme named *scheme*." +msgstr "返回一个对应于路径 *name*,来自名为 *scheme* 的安装方案的安装路径。" + +#: ../../library/sysconfig.rst:324 +msgid "" +"*name* has to be a value from the list returned by :func:`get_path_names`." +msgstr "*name* 必须是一个来自 :func:`get_path_names` 所返回的列表的值。" + +#: ../../library/sysconfig.rst:326 +msgid "" +":mod:`!sysconfig` stores installation paths corresponding to each path name," +" for each platform, with variables to be expanded. For instance the " +"*stdlib* path for the *nt* scheme is: ``{base}/Lib``." +msgstr "" + +#: ../../library/sysconfig.rst:330 +msgid "" +":func:`get_path` will use the variables returned by :func:`get_config_vars` " +"to expand the path. All variables have default values for each platform so " +"one may call this function and get the default value." +msgstr "" +":func:`get_path` 将使用 :func:`get_config_vars` 所返回的变量来扩展路径。 " +"所有变量对于每种平台都有相应的默认值因此使用者可以调用此函数来获取默认值。" + +#: ../../library/sysconfig.rst:334 +msgid "" +"If *scheme* is provided, it must be a value from the list returned by " +":func:`get_scheme_names`. Otherwise, the default scheme for the current " +"platform is used." +msgstr "" +"如果提供了 *scheme*,则它必须是一个来自 :func:`get_scheme_names` 所返回的列表的值。 " +"在其他情况下,将会使用针对当前平台的默认方案。" + +#: ../../library/sysconfig.rst:338 +msgid "" +"If *vars* is provided, it must be a dictionary of variables that will update" +" the dictionary returned by :func:`get_config_vars`." +msgstr "如果提供了 *vars*,则它必须是一个将要更新 :func:`get_config_vars` 所返回的字典的变量字典。" + +#: ../../library/sysconfig.rst:341 +msgid "" +"If *expand* is set to ``False``, the path will not be expanded using the " +"variables." +msgstr "如果 *expand* 被设为 ``False``,则将不使用这些变量来扩展路径。" + +#: ../../library/sysconfig.rst:344 +msgid "If *name* is not found, raise a :exc:`KeyError`." +msgstr "如果 *name* 未找到,则会引发 :exc:`KeyError`。" + +#: ../../library/sysconfig.rst:349 +msgid "" +"Return a dictionary containing all installation paths corresponding to an " +"installation scheme. See :func:`get_path` for more information." +msgstr "返回一个包含与特定安装方案对应的安装路径的字典。请参阅 :func:`get_path` 了解详情。" + +#: ../../library/sysconfig.rst:352 +msgid "" +"If *scheme* is not provided, will use the default scheme for the current " +"platform." +msgstr "如果未提供 *scheme*,则将使用针对当前平台的默认方案。" + +#: ../../library/sysconfig.rst:355 +msgid "" +"If *vars* is provided, it must be a dictionary of variables that will update" +" the dictionary used to expand the paths." +msgstr "如果提供了 *vars*,则它必须是一个将要更新用于扩展的字典的变量字典。" + +#: ../../library/sysconfig.rst:358 +msgid "If *expand* is set to false, the paths will not be expanded." +msgstr "如果 *expand* 被设为假值,则路径将不会被扩展。" + +#: ../../library/sysconfig.rst:360 +msgid "" +"If *scheme* is not an existing scheme, :func:`get_paths` will raise a " +":exc:`KeyError`." +msgstr "如果 *scheme* 不是一个现有的方案,则 :func:`get_paths` 将引发 :exc:`KeyError`。" + +#: ../../library/sysconfig.rst:365 +msgid "Other functions" +msgstr "其他函数" + +#: ../../library/sysconfig.rst:369 +msgid "" +"Return the ``MAJOR.MINOR`` Python version number as a string. Similar to " +"``'%d.%d' % sys.version_info[:2]``." +msgstr "" +"以字符串形式 ``MAJOR.MINOR`` 返回 Python 版本号。类似于 ``'%d.%d' % sys.version_info[:2]``." + +#: ../../library/sysconfig.rst:375 +msgid "Return a string that identifies the current platform." +msgstr "返回一个标识当前平台的字符串。" + +#: ../../library/sysconfig.rst:377 +msgid "" +"This is used mainly to distinguish platform-specific build directories and " +"platform-specific built distributions. Typically includes the OS name and " +"version and the architecture (as supplied by :func:`os.uname`), although the" +" exact information included depends on the OS; e.g., on Linux, the kernel " +"version isn't particularly important." +msgstr "" +"这主要被用来区分平台专属的构建目录和平台专属的构建分发版。通常包括 OS 名称和版本以及架构(即 :func:`os.uname` " +"所提供的信息),但是实际包括的信息取决于具体 OS;例如,在 Linux 上,内核版本并不是特别重要。" + +#: ../../library/sysconfig.rst:383 +msgid "Examples of returned values:" +msgstr "返回值的示例:" + +#: ../../library/sysconfig.rst:386 +msgid "Windows:" +msgstr "Windows:" + +#: ../../library/sysconfig.rst:388 +msgid "win-amd64 (64-bit Windows on AMD64, aka x86_64, Intel64, and EM64T)" +msgstr "win-amd64 (在 AMD64 即 x86_64, Intel64 和 EM64T 上的 64 位 Windows)" + +#: ../../library/sysconfig.rst:389 +msgid "win-arm64 (64-bit Windows on ARM64, aka AArch64)" +msgstr "win-arm64 (在 ARM64 即 AArch64 上的 64 位 Windows)" + +#: ../../library/sysconfig.rst:390 +msgid "win32 (all others - specifically, sys.platform is returned)" +msgstr "win32(所有其他的 —— 确切地说,返回 sys.platform)" + +#: ../../library/sysconfig.rst:392 +msgid "POSIX based OS:" +msgstr "基于 POSIX 的操作系统:" + +#: ../../library/sysconfig.rst:394 +msgid "linux-x86_64" +msgstr "linux-x86_64" + +#: ../../library/sysconfig.rst:395 +msgid "macosx-15.5-arm64" +msgstr "macosx-15.5-arm64" + +#: ../../library/sysconfig.rst:396 +msgid "macosx-26.0-universal2 (macOS on Apple Silicon or Intel)" +msgstr "macosx-26.0-universal2 (Apple Silicon 或 Intel 上的 macOS)" + +#: ../../library/sysconfig.rst:397 +msgid "android-24-arm64_v8a" +msgstr "android-24-arm64_v8a" + +#: ../../library/sysconfig.rst:399 +msgid "" +"For other non-POSIX platforms, currently just returns :data:`sys.platform`." +msgstr "对于其他非-POSIX 平台,目前只是返回 :data:`sys.platform`。" + +#: ../../library/sysconfig.rst:404 +msgid "" +"Return ``True`` if the running Python interpreter was built from source and " +"is being run from its built location, and not from a location resulting from" +" e.g. running ``make install`` or installing via a binary installer." +msgstr "" +"如果正在运行的 Python 解释器是使用源代码构建的并在其构建位置上运行,而不是在其他位置例如通过运行 ``make install`` " +"或通过二进制安装程序安装则返回 ``True``。" + +#: ../../library/sysconfig.rst:411 +msgid "Parse a :file:`config.h`\\-style file." +msgstr "解析一个 :file:`config.h` 风格的文件。" + +#: ../../library/sysconfig.rst:413 +msgid "*fp* is a file-like object pointing to the :file:`config.h`\\-like file." +msgstr "*fp* 是一个指向 :file:`config.h` 风格的文件的文件型对象。" + +#: ../../library/sysconfig.rst:415 +msgid "" +"A dictionary containing name/value pairs is returned. If an optional " +"dictionary is passed in as the second argument, it is used instead of a new " +"dictionary, and updated with the values read in the file." +msgstr "返回一个包含名称/值对的字典。如果传入一个可选的字典作为第二个参数,则将使用它而不是新的字典,并使用从文件中读取的值更新它。" + +#: ../../library/sysconfig.rst:422 +msgid "Return the path of :file:`pyconfig.h`." +msgstr "返回 :file:`pyconfig.h` 的路径。" + +#: ../../library/sysconfig.rst:426 +msgid "Return the path of :file:`Makefile`." +msgstr "返回 :file:`Makefile` 的路径。" + +#: ../../library/sysconfig.rst:432 +msgid "Command-line usage" +msgstr "命令行用法" + +#: ../../library/sysconfig.rst:434 +msgid "You can use :mod:`!sysconfig` as a script with Python's *-m* option:" +msgstr "你可以通过 Python 的 *-m* 选项将 :mod:`!sysconfig` 作为脚本使用:" + +#: ../../library/sysconfig.rst:436 +msgid "" +"$ python -m sysconfig\n" +"Platform: \"macosx-10.4-i386\"\n" +"Python version: \"3.2\"\n" +"Current installation scheme: \"posix_prefix\"\n" +"\n" +"Paths:\n" +" data = \"/usr/local\"\n" +" include = \"/Users/tarek/Dev/svn.python.org/py3k/Include\"\n" +" platinclude = \".\"\n" +" platlib = \"/usr/local/lib/python3.2/site-packages\"\n" +" platstdlib = \"/usr/local/lib/python3.2\"\n" +" purelib = \"/usr/local/lib/python3.2/site-packages\"\n" +" scripts = \"/usr/local/bin\"\n" +" stdlib = \"/usr/local/lib/python3.2\"\n" +"\n" +"Variables:\n" +" AC_APPLE_UNIVERSAL_BUILD = \"0\"\n" +" AIX_GENUINE_CPLUSPLUS = \"0\"\n" +" AR = \"ar\"\n" +" ARFLAGS = \"rc\"\n" +" ..." +msgstr "" +"$ python -m sysconfig\n" +"Platform: \"macosx-10.4-i386\"\n" +"Python version: \"3.2\"\n" +"Current installation scheme: \"posix_prefix\"\n" +"\n" +"Paths:\n" +" data = \"/usr/local\"\n" +" include = \"/Users/tarek/Dev/svn.python.org/py3k/Include\"\n" +" platinclude = \".\"\n" +" platlib = \"/usr/local/lib/python3.2/site-packages\"\n" +" platstdlib = \"/usr/local/lib/python3.2\"\n" +" purelib = \"/usr/local/lib/python3.2/site-packages\"\n" +" scripts = \"/usr/local/bin\"\n" +" stdlib = \"/usr/local/lib/python3.2\"\n" +"\n" +"Variables:\n" +" AC_APPLE_UNIVERSAL_BUILD = \"0\"\n" +" AIX_GENUINE_CPLUSPLUS = \"0\"\n" +" AR = \"ar\"\n" +" ARFLAGS = \"rc\"\n" +" ..." + +#: ../../library/sysconfig.rst:460 +msgid "" +"This call will print in the standard output the information returned by " +":func:`get_platform`, :func:`get_python_version`, :func:`get_path` and " +":func:`get_config_vars`." +msgstr "" +"此调用将把 :func:`get_platform`, :func:`get_python_version`, :func:`get_path` 和 " +":func:`get_config_vars` 所返回的信息打印至标准输出。" + +#: ../../library/sysconfig.rst:14 +msgid "configuration information" +msgstr "配置信息" diff --git a/library/syslog.po b/library/syslog.po new file mode 100644 index 0000000000..091bfff383 --- /dev/null +++ b/library/syslog.po @@ -0,0 +1,261 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/syslog.rst:2 +msgid ":mod:`!syslog` --- Unix syslog library routines" +msgstr ":mod:`!syslog` --- Unix syslog 库例程" + +#: ../../library/syslog.rst:9 +msgid "" +"This module provides an interface to the Unix ``syslog`` library routines. " +"Refer to the Unix manual pages for a detailed description of the ``syslog`` " +"facility." +msgstr "此模块提供一个到 Unix ``syslog`` 库例程的接口。参考 Unix 手册页了解关于 ``syslog`` 设施的详细描述。" + +#: ../../library/syslog.rst:13 +msgid "Availability" +msgstr "可用性" + +#: ../../library/syslog.rst:15 +msgid "" +"This module wraps the system ``syslog`` family of routines. A pure Python " +"library that can speak to a syslog server is available in the " +":mod:`logging.handlers` module as :class:`~logging.handlers.SysLogHandler`." +msgstr "" +"此模块包装了系统 ``syslog`` 例程族。一个能与 syslog 服务器对话的纯 Python 库则在 " +":mod:`logging.handlers` 模块中以 :class:`~logging.handlers.SysLogHandler` " +"类的形式提供。" + +#: ../../library/syslog.rst:19 +msgid "The module defines the following functions:" +msgstr "这个模块定义了以下函数:" + +#: ../../library/syslog.rst:25 +msgid "" +"Send the string *message* to the system logger. A trailing newline is added" +" if necessary. Each message is tagged with a priority composed of a " +"*facility* and a *level*. The optional *priority* argument, which defaults " +"to :const:`LOG_INFO`, determines the message priority. If the facility is " +"not encoded in *priority* using logical-or (``LOG_INFO | LOG_USER``), the " +"value given in the :func:`openlog` call is used." +msgstr "" +"将字符串 *message* 发送到系统日志记录器。如有必要会添加末尾换行符。每条消息都带有一个由 *facility* 和 *level* " +"组成的优先级标签。可选的 *priority* 参数默认值为 :const:`LOG_INFO`,它确定消息的优先级。如果未在 *priority* " +"中使用逻辑或 (``LOG_INFO | LOG_USER``) 对 facility 进行编码,则会使用在 :func:`openlog` " +"调用中所给定的值。" + +#: ../../library/syslog.rst:32 +msgid "" +"If :func:`openlog` has not been called prior to the call to :func:`syslog`, " +":func:`openlog` will be called with no arguments." +msgstr "" +"如果 :func:`openlog` 未在对 :func:`syslog` 的调用之前被调用,则将不带参数地调用 :func:`openlog`。" + +#: ../../library/syslog.rst:35 +msgid "" +"Raises an :ref:`auditing event ` ``syslog.syslog`` with arguments " +"``priority``, ``message``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``syslog.syslog`` 并附带参数 ``priority``, " +"``message``." + +#: ../../library/syslog.rst:37 +msgid "" +"In previous versions, :func:`openlog` would not be called automatically if " +"it wasn't called prior to the call to :func:`syslog`, deferring to the " +"syslog implementation to call ``openlog()``." +msgstr "" +"在之前的版本中,如果 :func:`openlog` 未在对 :func:`syslog` 的调用之前被调用则它将不会被自动调用,而是由 syslog " +"实现来负责调用 ``openlog()``。" + +#: ../../library/syslog.rst:42 +msgid "" +"This function is restricted in subinterpreters. (Only code that runs in " +"multiple interpreters is affected and the restriction is not relevant for " +"most users.) :func:`openlog` must be called in the main interpreter before " +":func:`syslog` may be used in a subinterpreter. Otherwise it will raise " +":exc:`RuntimeError`." +msgstr "" +"此函数在子解释器中受到限制。 (该限制只影响在多解释器中运行的代码因而与大多数用户无关。) :func:`openlog` 必须在子解释器使用 " +":func:`syslog` 之前在主解释器中被调用。否则它将引发 :exc:`RuntimeError`。" + +#: ../../library/syslog.rst:52 +msgid "" +"Logging options of subsequent :func:`syslog` calls can be set by calling " +":func:`openlog`. :func:`syslog` will call :func:`openlog` with no arguments" +" if the log is not currently open." +msgstr "" +"后续 :func:`syslog` 调用的日志选项可以通过调用 :func:`openlog` 来设置。如果日志当前未打开则 " +":func:`syslog` 将不带参数地调用 :func:`openlog`。" + +#: ../../library/syslog.rst:56 +msgid "" +"The optional *ident* keyword argument is a string which is prepended to " +"every message, and defaults to ``sys.argv[0]`` with leading path components " +"stripped. The optional *logoption* keyword argument (default is 0) is a bit" +" field -- see below for possible values to combine. The optional *facility*" +" keyword argument (default is :const:`LOG_USER`) sets the default facility " +"for messages which do not have a facility explicitly encoded." +msgstr "" +"可选的 *ident* 关键字参数是在每条消息前添加的字符串,默认为 ``sys.argv[0]`` 去除打头的路径部分。可选的 *logoption*" +" 关键字参数(默认为 0)是一个位字段 -- 请参见下文了解可能的组合值。可选的 *facility* 关键字参数 (默认为 " +":const:`LOG_USER`) 为没有显式编码 facility 的消息设置默认的 facility。" + +#: ../../library/syslog.rst:63 +msgid "" +"Raises an :ref:`auditing event ` ``syslog.openlog`` with arguments" +" ``ident``, ``logoption``, ``facility``." +msgstr "" +"引发一个 :ref:`审计事件 ` ``syslog.openlog`` 并附带参数 ``ident``, " +"``logoption``, ``facility``." + +#: ../../library/syslog.rst:65 +msgid "" +"In previous versions, keyword arguments were not allowed, and *ident* was " +"required." +msgstr "在之前的版本中,不允许使用关键字参数,并且要求必须有 *ident*。" + +#: ../../library/syslog.rst:69 ../../library/syslog.rst:88 +msgid "" +"This function is restricted in subinterpreters. (Only code that runs in " +"multiple interpreters is affected and the restriction is not relevant for " +"most users.) This may only be called in the main interpreter. It will raise " +":exc:`RuntimeError` if called in a subinterpreter." +msgstr "" +"此函数在子解释器中受到限制。 (该限制只影响在多解释器中运行的代码因而与大多数用户无关。)此函数只能在主解释器中被调用。 如果在子解释器中被调用它将引发" +" :exc:`RuntimeError`。" + +#: ../../library/syslog.rst:79 +msgid "" +"Reset the syslog module values and call the system library ``closelog()``." +msgstr "重置 syslog 模块值并调用系统库 ``closelog()``。" + +#: ../../library/syslog.rst:81 +msgid "" +"This causes the module to behave as it does when initially imported. For " +"example, :func:`openlog` will be called on the first :func:`syslog` call (if" +" :func:`openlog` hasn't already been called), and *ident* and other " +":func:`openlog` parameters are reset to defaults." +msgstr "" +"这会使得此模块的行为恢复到初始导入时的状态。例如,:func:`openlog` 将在首次调用 :func:`syslog` 时被调用(如果 " +":func:`openlog` 还未被调用过),并且 *ident* 和其他 :func:`openlog` 形参会被重置为默认值。" + +#: ../../library/syslog.rst:86 +msgid "" +"Raises an :ref:`auditing event ` ``syslog.closelog`` with no " +"arguments." +msgstr "引发一个不带参数的 :ref:`审计事件 ` ``syslog.closelog``。" + +#: ../../library/syslog.rst:98 +msgid "" +"Set the priority mask to *maskpri* and return the previous mask value. " +"Calls to :func:`syslog` with a priority level not set in *maskpri* are " +"ignored. The default is to log all priorities. The function " +"``LOG_MASK(pri)`` calculates the mask for the individual priority *pri*. " +"The function ``LOG_UPTO(pri)`` calculates the mask for all priorities up to " +"and including *pri*." +msgstr "" +"将优先级掩码设为 *maskpri* 并返回之前的掩码值。调用 :func:`syslog` 并附带未在 *maskpri* " +"中设置的优先级将会被忽略。默认设置为记录所有优先级。函数 ``LOG_MASK(pri)`` 可计算单个优先级 *pri* 的掩码。函数 " +"``LOG_UPTO(pri)`` 可计算包括 *pri* 在内的所有优先级的掩码。" + +#: ../../library/syslog.rst:105 +msgid "" +"Raises an :ref:`auditing event ` ``syslog.setlogmask`` with " +"argument ``maskpri``." +msgstr "引发一个 :ref:`审计事件 ` ``syslog.setlogmask`` 并附带参数 ``maskpri``。" + +#: ../../library/syslog.rst:107 +msgid "The module defines the following constants:" +msgstr "此模块定义了以下常量:" + +#: ../../library/syslog.rst:119 +msgid "Priority levels (high to low)." +msgstr "优先级别(从高到低)。" + +#: ../../library/syslog.rst:148 +msgid "" +"Facilities, depending on availability in ```` for " +":const:`LOG_AUTHPRIV`, :const:`LOG_FTP`, :const:`LOG_NETINFO`, " +":const:`LOG_REMOTEAUTH`, :const:`LOG_INSTALL` and :const:`LOG_RAS`." +msgstr "" +"功能项,根据在 ```` 中 :const:`LOG_AUTHPRIV`, :const:`LOG_FTP`, " +":const:`LOG_NETINFO`, :const:`LOG_REMOTEAUTH`, :const:`LOG_INSTALL` 和 " +":const:`LOG_RAS` 的可用性确定。" + +#: ../../library/syslog.rst:152 +msgid "" +"Added :const:`LOG_FTP`, :const:`LOG_NETINFO`, :const:`LOG_REMOTEAUTH`, " +":const:`LOG_INSTALL`, :const:`LOG_RAS`, and :const:`LOG_LAUNCHD`." +msgstr "" +"增加了 :const:`LOG_FTP`, :const:`LOG_NETINFO`, :const:`LOG_REMOTEAUTH`, " +":const:`LOG_INSTALL`, :const:`LOG_RAS` 和 :const:`LOG_LAUNCHD`。" + +#: ../../library/syslog.rst:163 +msgid "" +"Log options, depending on availability in ```` for " +":const:`LOG_ODELAY`, :const:`LOG_NOWAIT` and :const:`LOG_PERROR`." +msgstr "" +"日志选项,根据在 ```` 中 :const:`LOG_ODELAY`, :const:`LOG_NOWAIT` 和 " +":const:`LOG_PERROR` 的可用性确定。" + +#: ../../library/syslog.rst:168 +msgid "Examples" +msgstr "例子" + +#: ../../library/syslog.rst:171 +msgid "Simple example" +msgstr "简单示例" + +#: ../../library/syslog.rst:173 +msgid "A simple set of examples::" +msgstr "一个简单的示例集::" + +#: ../../library/syslog.rst:175 +msgid "" +"import syslog\n" +"\n" +"syslog.syslog('Processing started')\n" +"if error:\n" +" syslog.syslog(syslog.LOG_ERR, 'Processing started')" +msgstr "" +"import syslog\n" +"\n" +"syslog.syslog('Processing started')\n" +"if error:\n" +" syslog.syslog(syslog.LOG_ERR, 'Processing started')" + +#: ../../library/syslog.rst:181 +msgid "" +"An example of setting some log options, these would include the process ID " +"in logged messages, and write the messages to the destination facility used " +"for mail logging::" +msgstr "一个设置多种日志选项的示例,其中有在日志消息中包含进程 ID,以及将消息写入用于邮件日志记录的目标设施等::" + +#: ../../library/syslog.rst:185 +msgid "" +"syslog.openlog(logoption=syslog.LOG_PID, facility=syslog.LOG_MAIL)\n" +"syslog.syslog('E-mail processing initiated...')" +msgstr "" +"syslog.openlog(logoption=syslog.LOG_PID, facility=syslog.LOG_MAIL)\n" +"syslog.syslog('E-mail processing initiated...')" diff --git a/library/tabnanny.po b/library/tabnanny.po new file mode 100644 index 0000000000..e0409728d3 --- /dev/null +++ b/library/tabnanny.po @@ -0,0 +1,88 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/tabnanny.rst:2 +msgid ":mod:`!tabnanny` --- Detection of ambiguous indentation" +msgstr ":mod:`!tabnanny` --- 检测有歧义的缩进" + +#: ../../library/tabnanny.rst:13 +msgid "**Source code:** :source:`Lib/tabnanny.py`" +msgstr "**源代码:** :source:`Lib/tabnanny.py`" + +#: ../../library/tabnanny.rst:17 +msgid "" +"For the time being this module is intended to be called as a script. However" +" it is possible to import it into an IDE and use the function :func:`check` " +"described below." +msgstr "目前,该模块旨在作为脚本调用。但是可以使用下面描述的 :func:`check` 函数将其导入 IDE。" + +#: ../../library/tabnanny.rst:23 +msgid "" +"The API provided by this module is likely to change in future releases; such" +" changes may not be backward compatible." +msgstr "此模块提供的 API 可能会在将来的版本中更改;此类更改可能无法向后兼容。" + +#: ../../library/tabnanny.rst:29 +msgid "" +"If *file_or_dir* is a directory and not a symbolic link, then recursively " +"descend the directory tree named by *file_or_dir*, checking all :file:`.py` " +"files along the way. If *file_or_dir* is an ordinary Python source file, it" +" is checked for whitespace related problems. The diagnostic messages are " +"written to standard output using the :func:`print` function." +msgstr "" +"如果 *file_or_dir* 是目录而非符号链接,则递归地在名为 *file_or_dir* 的目录树中下行,沿途检查所有 :file:`.py` " +"文件。如果 *file_or_dir* 是一个普通 Python 源文件,将检查其中的空格相关问题。诊断消息将使用 :func:`print` " +"函数写入到标准输出。" + +#: ../../library/tabnanny.rst:38 +msgid "" +"Flag indicating whether to print verbose messages. This is incremented by " +"the ``-v`` option if called as a script." +msgstr "此旗标指明是否打印详细消息。如果作为脚本调用则是通过 ``-v`` 选项来增加。" + +#: ../../library/tabnanny.rst:44 +msgid "" +"Flag indicating whether to print only the filenames of files containing " +"whitespace related problems. This is set to true by the ``-q`` option if " +"called as a script." +msgstr "此旗标指明是否只打印包含空格相关问题文件的文件名。如果作为脚本调用则是通过 ``-q`` 选项来设为真值。" + +#: ../../library/tabnanny.rst:51 +msgid "" +"Raised by :func:`process_tokens` if detecting an ambiguous indent. Captured " +"and handled in :func:`check`." +msgstr "如果检测到有歧义的缩进则由 :func:`process_tokens` 引发。在 :func:`check` 中捕获并处理。" + +#: ../../library/tabnanny.rst:57 +msgid "" +"This function is used by :func:`check` to process tokens generated by the " +":mod:`tokenize` module." +msgstr "此函数由 :func:`check` 用来处理由 :mod:`tokenize` 模块所生成的标记。" + +#: ../../library/tabnanny.rst:66 +msgid "Module :mod:`tokenize`" +msgstr "模块 :mod:`tokenize`" + +#: ../../library/tabnanny.rst:67 +msgid "Lexical scanner for Python source code." +msgstr "用于 Python 源代码的词法扫描程序。" diff --git a/library/tarfile.po b/library/tarfile.po new file mode 100644 index 0000000000..0a31eec227 --- /dev/null +++ b/library/tarfile.po @@ -0,0 +1,2373 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/tarfile.rst:2 +msgid ":mod:`!tarfile` --- Read and write tar archive files" +msgstr ":mod:`!tarfile` --- 读写 tar 归档文件" + +#: ../../library/tarfile.rst:7 +msgid "**Source code:** :source:`Lib/tarfile.py`" +msgstr "**源代码:** :source:`Lib/tarfile.py`" + +#: ../../library/tarfile.rst:11 +msgid "" +"The :mod:`!tarfile` module makes it possible to read and write tar archives," +" including those using gzip, bz2 and lzma compression. Use the " +":mod:`zipfile` module to read or write :file:`.zip` files, or the higher-" +"level functions in :ref:`shutil `." +msgstr "" + +#: ../../library/tarfile.rst:16 +msgid "Some facts and figures:" +msgstr "一些事实和数字:" + +#: ../../library/tarfile.rst:18 +msgid "" +"reads and writes :mod:`gzip`, :mod:`bz2`, :mod:`compression.zstd`, and " +":mod:`lzma` compressed archives if the respective modules are available." +msgstr "" +"在相应的模块可用时读写 :mod:`gzip`, :mod:`bz2`, :mod:`compression.zstd` 和 :mod:`lzma` " +"压缩的归档。" + +#: ../../library/tarfile.rst:24 +msgid "" +"If any of these :term:`optional modules ` are missing from " +"your copy of CPython, look for documentation from your distributor (that is," +" whoever provided Python to you). If you are the distributor, see " +":ref:`optional-module-requirements`." +msgstr "" +"如果这些 :term:`可选模块 ` 中的任何一个在你的 CPython " +"副本中缺失,请查看你的发行方(也就是说,向你提供 Python 的人)。如果你就是发行方,请参阅 :ref:`optional-module-" +"requirements`." + +#: ../../library/tarfile.rst:29 +msgid "read/write support for the POSIX.1-1988 (ustar) format." +msgstr "支持读取 / 写入 POSIX.1-1988 (ustar) 格式。" + +#: ../../library/tarfile.rst:31 +msgid "" +"read/write support for the GNU tar format including *longname* and " +"*longlink* extensions, read-only support for all variants of the *sparse* " +"extension including restoration of sparse files." +msgstr "" +"对 GNU tar 格式的读/写支持,包括 *longname* 和 *longlink* 扩展,对所有种类 *sparse* 扩展的只读支持,包括 " +"sparse 文件的恢复。" + +#: ../../library/tarfile.rst:35 +msgid "read/write support for the POSIX.1-2001 (pax) format." +msgstr "对 POSIX.1-2001 (pax) 格式的读/写支持。" + +#: ../../library/tarfile.rst:37 +msgid "" +"handles directories, regular files, hardlinks, symbolic links, fifos, " +"character devices and block devices and is able to acquire and restore file " +"information like timestamp, access permissions and owner." +msgstr "处理目录、正常文件、硬链接、符号链接、fifo 管道、字符设备和块设备,并且能够获取和恢复文件信息例如时间戳、访问权限和所有者等。" + +#: ../../library/tarfile.rst:41 +msgid "Added support for :mod:`lzma` compression." +msgstr "添加了对 :mod:`lzma` 压缩的支持。" + +#: ../../library/tarfile.rst:44 +msgid "" +"Archives are extracted using a :ref:`filter `, " +"which makes it possible to either limit surprising/dangerous features, or to" +" acknowledge that they are expected and the archive is fully trusted." +msgstr "" +"归档文件使用 :ref:`过滤器 ` " +"来提取,这将可以限制令人惊讶/危险的特性,或确认它们符合预期并且归档文档受到完全信任。 " + +#: ../../library/tarfile.rst:49 +msgid "" +"Set the default extraction filter to :func:`data `, which " +"disallows some dangerous features such as links to absolute paths or paths " +"outside of the destination. Previously, the filter strategy was equivalent " +"to :func:`fully_trusted `." +msgstr "" +"将默认的提取过滤器设置为 :func:`data " +"`,这将禁止一些危险的特性,比如链接到绝对路径或目的地之外的路径。以前,过滤器策略相当于 " +":func:`fully_trusted `." + +#: ../../library/tarfile.rst:57 +msgid "Added support for Zstandard compression using :mod:`compression.zstd`." +msgstr "使用 :mod:`compression.zstd` 增加对 Zstandard 压缩的支持。" + +#: ../../library/tarfile.rst:61 +msgid "" +"Return a :class:`TarFile` object for the pathname *name*. For detailed " +"information on :class:`TarFile` objects and the keyword arguments that are " +"allowed, see :ref:`tarfile-objects`." +msgstr "" +"针对路径名 *name* 返回 :class:`TarFile` 对象。有关 :class:`TarFile` " +"对象以及所允许的关键字参数的详细信息请参阅 :ref:`tarfile-objects`。" + +#: ../../library/tarfile.rst:65 +msgid "" +"*mode* has to be a string of the form ``'filemode[:compression]'``, it " +"defaults to ``'r'``. Here is a full list of mode combinations:" +msgstr "" +"*mode* 必须是 ``'filemode[:compression]'`` 形式的字符串,其默认值为 ``'r'``。以下是模式组合的完整列表:" + +#: ../../library/tarfile.rst:69 +msgid "mode" +msgstr "模式" + +#: ../../library/tarfile.rst:69 +msgid "action" +msgstr "动作" + +#: ../../library/tarfile.rst:71 +msgid "``'r'`` or ``'r:*'``" +msgstr "``'r'`` 或 ``'r:*'``" + +#: ../../library/tarfile.rst:71 +msgid "Open for reading with transparent compression (recommended)." +msgstr "打开和读取使用透明压缩(推荐)。" + +#: ../../library/tarfile.rst:74 +msgid "``'r:'``" +msgstr "``'r:'``" + +#: ../../library/tarfile.rst:74 +msgid "Open for reading exclusively without compression." +msgstr "打开和读取不使用压缩。" + +#: ../../library/tarfile.rst:77 +msgid "``'r:gz'``" +msgstr "``'r:gz'``" + +#: ../../library/tarfile.rst:77 +msgid "Open for reading with gzip compression." +msgstr "打开和读取使用 gzip 压缩。" + +#: ../../library/tarfile.rst:79 +msgid "``'r:bz2'``" +msgstr "``'r:bz2'``" + +#: ../../library/tarfile.rst:79 +msgid "Open for reading with bzip2 compression." +msgstr "打开和读取使用 bzip2 压缩。" + +#: ../../library/tarfile.rst:81 +msgid "``'r:xz'``" +msgstr "``'r:xz'``" + +#: ../../library/tarfile.rst:81 +msgid "Open for reading with lzma compression." +msgstr "打开和读取使用 lzma 压缩。" + +#: ../../library/tarfile.rst:83 +msgid "``'r:zst'``" +msgstr "``'r:zst'``" + +#: ../../library/tarfile.rst:83 +msgid "Open for reading with Zstandard compression." +msgstr "打开以使用 Zstandard 压缩格式进行读取。" + +#: ../../library/tarfile.rst:85 +msgid "``'x'`` or ``'x:'``" +msgstr "``'x'`` 或 ``'x:'``" + +#: ../../library/tarfile.rst:85 +msgid "" +"Create a tarfile exclusively without compression. Raise a " +":exc:`FileExistsError` exception if it already exists." +msgstr "单独创建一个 tarfile 而不带压缩。如果它已经存在则会引发 :exc:`FileExistsError` 异常。" + +#: ../../library/tarfile.rst:90 +msgid "``'x:gz'``" +msgstr "``'x:gz'``" + +#: ../../library/tarfile.rst:90 +msgid "" +"Create a tarfile with gzip compression. Raise a :exc:`FileExistsError` " +"exception if it already exists." +msgstr "使用 gzip 压缩创建一个 tarfile。如果它已经存在则会引发 :exc:`FileExistsError` 异常。" + +#: ../../library/tarfile.rst:94 +msgid "``'x:bz2'``" +msgstr "``'x:bz2'``" + +#: ../../library/tarfile.rst:94 +msgid "" +"Create a tarfile with bzip2 compression. Raise a :exc:`FileExistsError` " +"exception if it already exists." +msgstr "使用 bzip2 压缩创建一个 tarfile。如果它已经存在则会引发 :exc:`FileExistsError` 异常。" + +#: ../../library/tarfile.rst:98 +msgid "``'x:xz'``" +msgstr "``'x:xz'``" + +#: ../../library/tarfile.rst:98 +msgid "" +"Create a tarfile with lzma compression. Raise a :exc:`FileExistsError` " +"exception if it already exists." +msgstr "使用 lzma 压缩创建一个 tarfile。如果它已经存在则会引发 :exc:`FileExistsError` 异常。" + +#: ../../library/tarfile.rst:102 +msgid "``'x:zst'``" +msgstr "``'x:zst'``" + +#: ../../library/tarfile.rst:102 +msgid "" +"Create a tarfile with Zstandard compression. Raise a :exc:`FileExistsError` " +"exception if it already exists." +msgstr "创建一个使用 Zstandard 压缩的 tar 文件。如果它已经存在则会引发 :exc:`FileExistsError` 异常。" + +#: ../../library/tarfile.rst:106 +msgid "``'a'`` or ``'a:'``" +msgstr "``'a'`` 或 ``'a:'``" + +#: ../../library/tarfile.rst:106 +msgid "" +"Open for appending with no compression. The file is created if it does not " +"exist." +msgstr "打开以便在没有压缩的情况下追加。如果文件不存在,则创建该文件。" + +#: ../../library/tarfile.rst:109 +msgid "``'w'`` or ``'w:'``" +msgstr "``'w'`` 或 ``'w:'``" + +#: ../../library/tarfile.rst:109 +msgid "Open for uncompressed writing." +msgstr "打开用于未压缩的写入。" + +#: ../../library/tarfile.rst:112 +msgid "``'w:gz'``" +msgstr "``'w:gz'``" + +#: ../../library/tarfile.rst:112 +msgid "Open for gzip compressed writing." +msgstr "打开用于 gzip 压缩的写入。" + +#: ../../library/tarfile.rst:114 +msgid "``'w:bz2'``" +msgstr "``'w:bz2'``" + +#: ../../library/tarfile.rst:114 +msgid "Open for bzip2 compressed writing." +msgstr "打开用于 bzip2 压缩的写入。" + +#: ../../library/tarfile.rst:116 +msgid "``'w:xz'``" +msgstr "``'w:xz'``" + +#: ../../library/tarfile.rst:116 +msgid "Open for lzma compressed writing." +msgstr "打开用于 lzma 压缩的写入。" + +#: ../../library/tarfile.rst:118 +msgid "``'w:zst'``" +msgstr "``'w:zst'``" + +#: ../../library/tarfile.rst:118 +msgid "Open for Zstandard compressed writing." +msgstr "打开以使用 Zstandard 压缩格式进行写入。" + +#: ../../library/tarfile.rst:121 +msgid "" +"Note that ``'a:gz'``, ``'a:bz2'`` or ``'a:xz'`` is not possible. If *mode* " +"is not suitable to open a certain (compressed) file for reading, " +":exc:`ReadError` is raised. Use *mode* ``'r'`` to avoid this. If a " +"compression method is not supported, :exc:`CompressionError` is raised." +msgstr "" +"请注意 ``'a:gz'``, ``'a:bz2'`` 或 ``'a:xz'`` 是不可能的组合。如果 *mode* " +"不适用于打开特定(压缩的)文件用于读取,则会引发 :exc:`ReadError`。请使用 *mode* ``'r'`` 来避免这种情况。 " +"如果某种压缩方法不受支持,则会引发 :exc:`CompressionError`。" + +#: ../../library/tarfile.rst:126 +msgid "" +"If *fileobj* is specified, it is used as an alternative to a :term:`file " +"object` opened in binary mode for *name*. It is supposed to be at position " +"0." +msgstr "" +"如果指定了 *fileobj*,它会被用作对应于 *name* 的以二进制模式打开的 :term:`file object` 的替代。 " +"它会被设定为处在位置 0。" + +#: ../../library/tarfile.rst:129 +msgid "" +"For modes ``'w:gz'``, ``'x:gz'``, ``'w|gz'``, ``'w:bz2'``, ``'x:bz2'``, " +"``'w|bz2'``, :func:`tarfile.open` accepts the keyword argument " +"*compresslevel* (default ``6``) to specify the compression level of the " +"file." +msgstr "" + +#: ../../library/tarfile.rst:133 +msgid "" +"For modes ``'w:xz'``, ``'x:xz'`` and ``'w|xz'``, :func:`tarfile.open` " +"accepts the keyword argument *preset* to specify the compression level of " +"the file." +msgstr "" +"对于 ``'w:xz'``, ``'x:xz'`` 和 ``'w|xz'`` 等模式,:func:`tarfile.open` 接受关键字参数 " +"*preset* 来指定文件的压缩等级。" + +#: ../../library/tarfile.rst:136 +msgid "" +"For modes ``'w:zst'``, ``'x:zst'`` and ``'w|zst'``, :func:`tarfile.open` " +"accepts the keyword argument *level* to specify the compression level of the" +" file. The keyword argument *options* may also be passed, providing advanced" +" Zstandard compression parameters described by " +":class:`~compression.zstd.CompressionParameter`. The keyword argument " +"*zstd_dict* can be passed to provide a :class:`~compression.zstd.ZstdDict`, " +"a Zstandard dictionary used to improve compression of smaller amounts of " +"data." +msgstr "" +"对于 ``'w:zst'``, ``'x:zst'`` 和 ``'w|zst'`` 模式,:func:`tarfile.open` 接受关键字参数 " +"*level* 以指定文件的压缩级别。还可以传入关键字参数 *options*,它提供由 " +":class:`~compression.zstd.CompressionParameter` 描述的高级 Zstandard 压缩形参。 " +"还可以传入关键字参数 *zstd_dict* 以提供 " +":class:`~compression.zstd.ZstdDict`,这是用于提升较小量数据压缩效率的 Zstandard 字典。" + +#: ../../library/tarfile.rst:145 +msgid "" +"For modes ``'w:gz'`` and ``'w|gz'``, :func:`tarfile.open` accepts the " +"keyword argument *mtime* to create a gzip archive header with that mtime. By" +" default, the mtime is set to the time of creation of the archive." +msgstr "" + +#: ../../library/tarfile.rst:149 +msgid "" +"For special purposes, there is a second format for *mode*: " +"``'filemode|[compression]'``. :func:`tarfile.open` will return a " +":class:`TarFile` object that processes its data as a stream of blocks. No " +"random seeking will be done on the file. If given, *fileobj* may be any " +"object that has a :meth:`~io.RawIOBase.read` or :meth:`~io.RawIOBase.write` " +"method (depending on the *mode*) that works with bytes. *bufsize* specifies " +"the blocksize and defaults to ``20 * 512`` bytes. Use this variant in " +"combination with e.g. ``sys.stdin.buffer``, a socket :term:`file object` or " +"a tape device. However, such a :class:`TarFile` object is limited in that it" +" does not allow random access, see :ref:`tar-examples`. The currently " +"possible modes:" +msgstr "" +"针对特殊的目的,还存在第二种 *mode* 格式: ``'filemode|[compression]'``。 :func:`tarfile.open`" +" 将返回一个将其数据作为数据块流来处理的 :class:`TarFile` 对象。对此文件将不能执行随机查找。如果给定了 " +"*fileobj*,它可以是任何具有 :meth:`~io.RawIOBase.read` 或 :meth:`~io.RawIOBase.write` " +"方法(由 *mode* 确定)的对象。 *bufsize* 指定块大小,默认为 ``20 * 512`` 字节。可与此格式组合使用的有 " +"``sys.stdin.buffer``、套接字 :term:`file object` 或磁带设备等。但是,这样的 :class:`TarFile` " +"对象存在不允许随机访问的限制,参见 :ref:`tar-examples`。当前可用的模式有:" + +#: ../../library/tarfile.rst:163 +msgid "Mode" +msgstr "模式" + +#: ../../library/tarfile.rst:163 +msgid "Action" +msgstr "动作" + +#: ../../library/tarfile.rst:165 +msgid "``'r|*'``" +msgstr "``'r|*'``" + +#: ../../library/tarfile.rst:165 +msgid "" +"Open a *stream* of tar blocks for reading with transparent compression." +msgstr "打开 tar 块的 *流* 以进行透明压缩读取。" + +#: ../../library/tarfile.rst:168 +msgid "``'r|'``" +msgstr "``'r|'``" + +#: ../../library/tarfile.rst:168 +msgid "Open a *stream* of uncompressed tar blocks for reading." +msgstr "打开一个未压缩的 tar 块的 *stream* 用于读取。" + +#: ../../library/tarfile.rst:171 +msgid "``'r|gz'``" +msgstr "``'r|gz'``" + +#: ../../library/tarfile.rst:171 +msgid "Open a gzip compressed *stream* for reading." +msgstr "打开一个 gzip 压缩的 *stream* 用于读取。" + +#: ../../library/tarfile.rst:174 +msgid "``'r|bz2'``" +msgstr "``'r|bz2'``" + +#: ../../library/tarfile.rst:174 +msgid "Open a bzip2 compressed *stream* for reading." +msgstr "打开一个 bzip2 压缩的 *stream* 用于读取。" + +#: ../../library/tarfile.rst:177 +msgid "``'r|xz'``" +msgstr "``'r|xz'``" + +#: ../../library/tarfile.rst:177 +msgid "Open an lzma compressed *stream* for reading." +msgstr "打开一个 lzma 压缩 *stream* 用于读取。" + +#: ../../library/tarfile.rst:180 +msgid "``'r|zst'``" +msgstr "``'r|zst'``" + +#: ../../library/tarfile.rst:180 +msgid "Open a Zstandard compressed *stream* for reading." +msgstr "打开一个 Zstandard 压缩的 *stream* 用于读取。" + +#: ../../library/tarfile.rst:183 +msgid "``'w|'``" +msgstr "``'w|'``" + +#: ../../library/tarfile.rst:183 +msgid "Open an uncompressed *stream* for writing." +msgstr "打开一个未压缩的 *stream* 用于写入。" + +#: ../../library/tarfile.rst:185 +msgid "``'w|gz'``" +msgstr "``'w|gz'``" + +#: ../../library/tarfile.rst:185 +msgid "Open a gzip compressed *stream* for writing." +msgstr "打开一个 gzip 压缩的 *stream* 用于写入。" + +#: ../../library/tarfile.rst:188 +msgid "``'w|bz2'``" +msgstr "``'w|bz2'``" + +#: ../../library/tarfile.rst:188 +msgid "Open a bzip2 compressed *stream* for writing." +msgstr "打开一个 bzip2 压缩的 *stream* 用于写入。" + +#: ../../library/tarfile.rst:191 +msgid "``'w|xz'``" +msgstr "``'w|xz'``" + +#: ../../library/tarfile.rst:191 +msgid "Open an lzma compressed *stream* for writing." +msgstr "打开一个 lzma 压缩的 *stream* 用于写入。" + +#: ../../library/tarfile.rst:194 +msgid "``'w|zst'``" +msgstr "``'w|zst'``" + +#: ../../library/tarfile.rst:194 +msgid "Open a Zstandard compressed *stream* for writing." +msgstr "打开一个 Zstandard 压缩的 *stream* 用于写入。" + +#: ../../library/tarfile.rst:198 ../../library/tarfile.rst:481 +msgid "The ``'x'`` (exclusive creation) mode was added." +msgstr "添加了 ``'x'`` (单独创建) 模式。" + +#: ../../library/tarfile.rst:201 ../../library/tarfile.rst:484 +#: ../../library/tarfile.rst:732 +msgid "The *name* parameter accepts a :term:`path-like object`." +msgstr "*name* 形参接受一个 :term:`path-like object`。" + +#: ../../library/tarfile.rst:204 +msgid "The *compresslevel* keyword argument also works for streams." +msgstr "*compresslevel* 关键字参数也适用于流式数据。" + +#: ../../library/tarfile.rst:207 +msgid "The *preset* keyword argument also works for streams." +msgstr "*preset* 关键字参数也适用于流式数据。" + +#: ../../library/tarfile.rst:210 +msgid "" +"The default compression level was reduced to 6 (down from 9). It is the " +"default level used by most compression tools and a better tradeoff between " +"speed and performance." +msgstr "" + +#: ../../library/tarfile.rst:218 +msgid "" +"Class for reading and writing tar archives. Do not use this class directly: " +"use :func:`tarfile.open` instead. See :ref:`tarfile-objects`." +msgstr "" +"用于读取和写入 tar 归档的类。请不要直接使用这个类:而要使用 :func:`tarfile.open`。参见 :ref:`tarfile-" +"objects`." + +#: ../../library/tarfile.rst:224 +msgid "" +"Return :const:`True` if *name* is a tar archive file, that the " +":mod:`!tarfile` module can read. *name* may be a :class:`str`, file, or " +"file-like object." +msgstr "" + +#: ../../library/tarfile.rst:227 +msgid "Support for file and file-like objects." +msgstr "支持文件或类文件对象。" + +#: ../../library/tarfile.rst:231 +msgid "The :mod:`!tarfile` module defines the following exceptions:" +msgstr "" + +#: ../../library/tarfile.rst:236 +msgid "Base class for all :mod:`!tarfile` exceptions." +msgstr "" + +#: ../../library/tarfile.rst:241 +msgid "" +"Is raised when a tar archive is opened, that either cannot be handled by the" +" :mod:`!tarfile` module or is somehow invalid." +msgstr "" + +#: ../../library/tarfile.rst:247 +msgid "" +"Is raised when a compression method is not supported or when the data cannot" +" be decoded properly." +msgstr "当一个压缩方法不受支持或者当数据无法被正确解码时将被引发。" + +#: ../../library/tarfile.rst:253 +msgid "" +"Is raised for the limitations that are typical for stream-like " +":class:`TarFile` objects." +msgstr "当达到流式 :class:`TarFile` 对象的典型限制时将被引发。" + +#: ../../library/tarfile.rst:259 +msgid "" +"Is raised for *non-fatal* errors when using :meth:`TarFile.extract`, but " +"only if :attr:`TarFile.errorlevel`\\ ``== 2``." +msgstr "" +"当使用 :meth:`TarFile.extract` 时针对 *non-fatal* 所引发的异常,但是仅限 " +":attr:`TarFile.errorlevel`\\ ``== 2``." + +#: ../../library/tarfile.rst:265 +msgid "Is raised by :meth:`TarInfo.frombuf` if the buffer it gets is invalid." +msgstr "如果获取的缓冲区无效则会由 :meth:`TarInfo.frombuf` 引发的异常。" + +#: ../../library/tarfile.rst:270 +msgid "" +"Base class for members :ref:`refused ` by " +"filters." +msgstr "被过滤器 :ref:`拒绝 ` 的成员的基类。" + +#: ../../library/tarfile.rst:275 +msgid "" +"Information about the member that the filter refused to extract, as " +":ref:`TarInfo `." +msgstr "关于过滤器拒绝提取的成员的信息,为 :ref:`TarInfo ` 类型。" + +#: ../../library/tarfile.rst:280 +msgid "Raised to refuse extracting a member with an absolute path." +msgstr "在拒绝提取具有绝对路径的成员时引发。" + +#: ../../library/tarfile.rst:284 +msgid "" +"Raised to refuse extracting a member outside the destination directory." +msgstr "在拒绝提取目标目录以外的成员时引发。" + +#: ../../library/tarfile.rst:288 +msgid "Raised to refuse extracting a special file (e.g. a device or pipe)." +msgstr "在拒绝提取特殊文件(例如设备或管道)时引发。" + +#: ../../library/tarfile.rst:292 +msgid "Raised to refuse extracting a symbolic link with an absolute path." +msgstr "在拒绝提取具有绝对路径的符号链接时引发。" + +#: ../../library/tarfile.rst:296 +msgid "" +"Raised to refuse extracting a symbolic link pointing outside the destination" +" directory." +msgstr "在拒绝提取指向目标目录以外的符号链接时引发。" + +#: ../../library/tarfile.rst:301 +msgid "" +"Raised to refuse emulating a link (hard or symbolic) by extracting another " +"archive member, when that member would be rejected by the filter location. " +"The exception that was raised to reject the replacement member is available " +"as :attr:`!BaseException.__context__`." +msgstr "" +"在要拒绝通过提取其他归档成员来模拟一个链接(硬链接或符号链接),而该成员会被过滤位置丢弃时被引发。被引发以丢弃替换成员的异常可作为 " +":attr:`!BaseException.__context__` 被访问。" + +#: ../../library/tarfile.rst:309 +msgid "The following constants are available at the module level:" +msgstr "以下常量在模块层级上可用:" + +#: ../../library/tarfile.rst:313 +msgid "" +"The default character encoding: ``'utf-8'`` on Windows, the value returned " +"by :func:`sys.getfilesystemencoding` otherwise." +msgstr "" +"默认的字符编码格式:在 Windows 上为 ``'utf-8'``,其他系统上则为 :func:`sys.getfilesystemencoding`" +" 所返回的值。" + +#: ../../library/tarfile.rst:319 +msgid "A regular file :attr:`~TarInfo.type`." +msgstr "常规文件 :attr:`~TarInfo.type`。" + +#: ../../library/tarfile.rst:323 +msgid "A link (inside tarfile) :attr:`~TarInfo.type`." +msgstr "(tar 文件中的)链接 :attr:`~TarInfo.type`。" + +#: ../../library/tarfile.rst:327 +msgid "A symbolic link :attr:`~TarInfo.type`." +msgstr "符号链接 :attr:`~TarInfo.type`。" + +#: ../../library/tarfile.rst:331 +msgid "A character special device :attr:`~TarInfo.type`." +msgstr "字符特殊设备 :attr:`~TarInfo.type`。" + +#: ../../library/tarfile.rst:335 +msgid "A block special device :attr:`~TarInfo.type`." +msgstr "块特殊设备 :attr:`~TarInfo.type`。" + +#: ../../library/tarfile.rst:339 +msgid "A directory :attr:`~TarInfo.type`." +msgstr "目录 :attr:`~TarInfo.type`。" + +#: ../../library/tarfile.rst:343 +msgid "A FIFO special device :attr:`~TarInfo.type`." +msgstr "FIFO 特殊设备 :attr:`~TarInfo.type`。" + +#: ../../library/tarfile.rst:347 +msgid "A contiguous file :attr:`~TarInfo.type`." +msgstr "连续文件 :attr:`~TarInfo.type`。" + +#: ../../library/tarfile.rst:351 +msgid "A GNU tar longname :attr:`~TarInfo.type`." +msgstr "GNU tar 长名称 :attr:`~TarInfo.type`。" + +#: ../../library/tarfile.rst:355 +msgid "A GNU tar longlink :attr:`~TarInfo.type`." +msgstr "GNU tar 长链接 :attr:`~TarInfo.type`。" + +#: ../../library/tarfile.rst:359 +msgid "A GNU tar sparse file :attr:`~TarInfo.type`." +msgstr "GNU tar 离散文件 :attr:`~TarInfo.type`。" + +#: ../../library/tarfile.rst:362 +msgid "" +"Each of the following constants defines a tar archive format that the " +":mod:`!tarfile` module is able to create. See section :ref:`tar-formats` for" +" details." +msgstr "" + +#: ../../library/tarfile.rst:369 +msgid "POSIX.1-1988 (ustar) format." +msgstr "POSIX.1-1988 (ustar) 格式。" + +#: ../../library/tarfile.rst:374 +msgid "GNU tar format." +msgstr "GNU tar 格式。" + +#: ../../library/tarfile.rst:379 +msgid "POSIX.1-2001 (pax) format." +msgstr "POSIX.1-2001 (pax) 格式。" + +#: ../../library/tarfile.rst:384 +msgid "" +"The default format for creating archives. This is currently " +":const:`PAX_FORMAT`." +msgstr "用于创建归档的默认格式。目前为 :const:`PAX_FORMAT`。" + +#: ../../library/tarfile.rst:386 +msgid "" +"The default format for new archives was changed to :const:`PAX_FORMAT` from " +":const:`GNU_FORMAT`." +msgstr "新归档的默认格式已更改为 :const:`PAX_FORMAT` 而不再是 :const:`GNU_FORMAT`。" + +#: ../../library/tarfile.rst:393 +msgid "Module :mod:`zipfile`" +msgstr "模块 :mod:`zipfile`" + +#: ../../library/tarfile.rst:394 +msgid "Documentation of the :mod:`zipfile` standard module." +msgstr ":mod:`zipfile` 标准模块的文档。" + +#: ../../library/tarfile.rst:396 +msgid ":ref:`archiving-operations`" +msgstr ":ref:`archiving-operations`" + +#: ../../library/tarfile.rst:397 +msgid "" +"Documentation of the higher-level archiving facilities provided by the " +"standard :mod:`shutil` module." +msgstr "标准 :mod:`shutil` 模块所提供的高层级归档工具的文档。" + +#: ../../library/tarfile.rst:400 +msgid "" +"`GNU tar manual, Basic Tar Format " +"`_" +msgstr "" +"`GNU tar manual, Basic Tar Format " +"`_" + +#: ../../library/tarfile.rst:401 +msgid "Documentation for tar archive files, including GNU tar extensions." +msgstr "针对 tar 归档文件的文档,包含 GNU tar 扩展。" + +#: ../../library/tarfile.rst:407 +msgid "TarFile Objects" +msgstr "TarFile 对象" + +#: ../../library/tarfile.rst:409 +msgid "" +"The :class:`TarFile` object provides an interface to a tar archive. A tar " +"archive is a sequence of blocks. An archive member (a stored file) is made " +"up of a header block followed by data blocks. It is possible to store a file" +" in a tar archive several times. Each archive member is represented by a " +":class:`TarInfo` object, see :ref:`tarinfo-objects` for details." +msgstr "" +":class:`TarFile` 对象提供了一个 tar 归档的接口。一个 tar 归档就是数据块的序列。 " +"一个归档成员(被保存文件)是由一个标头块加多个数据块组成的。一个文件可以在一个 tar 归档中多次被保存。每个归档成员都由一个 " +":class:`TarInfo` 对象来代表,详情参见 :ref:`tarinfo-objects`。" + +#: ../../library/tarfile.rst:415 +msgid "" +"A :class:`TarFile` object can be used as a context manager in a " +":keyword:`with` statement. It will automatically be closed when the block is" +" completed. Please note that in the event of an exception an archive opened " +"for writing will not be finalized; only the internally used file object will" +" be closed. See the :ref:`tar-examples` section for a use case." +msgstr "" +":class:`TarFile` 对象可在 :keyword:`with` 语句中作为上下文管理器使用。当语句块结束时它将自动被关闭。 " +"请注意在发生异常事件时被打开用于写入的归档将不会被终结;只有内部使用的文件对象将被关闭。相关用例请参见 :ref:`tar-examples`。" + +#: ../../library/tarfile.rst:421 +msgid "Added support for the context management protocol." +msgstr "添加了对上下文管理器协议的支持。" + +#: ../../library/tarfile.rst:426 +msgid "" +"All following arguments are optional and can be accessed as instance " +"attributes as well." +msgstr "下列所有参数都是可选项并且也可作为实例属性来访问。" + +#: ../../library/tarfile.rst:429 +msgid "" +"*name* is the pathname of the archive. *name* may be a :term:`path-like " +"object`. It can be omitted if *fileobj* is given. In this case, the file " +"object's :attr:`!name` attribute is used if it exists." +msgstr "" +"*name* 是归档的路径名。 *name* 可以是一个 :term:`path-like object`。如果给定了 *fileobj* " +"则它可以被省略。在此情况下,如果对象存在 :attr:`!name` 属性则将使用它。" + +#: ../../library/tarfile.rst:433 +msgid "" +"*mode* is either ``'r'`` to read from an existing archive, ``'a'`` to append" +" data to an existing file, ``'w'`` to create a new file overwriting an " +"existing one, or ``'x'`` to create a new file only if it does not already " +"exist." +msgstr "" +"*mode* 可以为 ``'r'`` 表示从现有归档读取,``'a'`` 表示将数据追加到现有文件,``'w'`` 表示创建新文件覆盖现有文件,或者 " +"``'x'`` 表示仅在文件不存在时创建新文件。" + +#: ../../library/tarfile.rst:437 +msgid "" +"If *fileobj* is given, it is used for reading or writing data. If it can be " +"determined, *mode* is overridden by *fileobj*'s mode. *fileobj* will be used" +" from position 0." +msgstr "" +"如果给定了 *fileobj*,它会被用于读取或写入数据。如果可以被确定,则 *mode* 会被 *fileobj* 的模式所覆盖。 *fileobj*" +" 的使用将从位置 0 开始。" + +#: ../../library/tarfile.rst:443 +msgid "*fileobj* is not closed, when :class:`TarFile` is closed." +msgstr "当 :class:`TarFile` 被关闭时,*fileobj* 不会被关闭。" + +#: ../../library/tarfile.rst:445 +msgid "" +"*format* controls the archive format for writing. It must be one of the " +"constants :const:`USTAR_FORMAT`, :const:`GNU_FORMAT` or :const:`PAX_FORMAT` " +"that are defined at module level. When reading, format will be automatically" +" detected, even if different formats are present in a single archive." +msgstr "" +"*format* 控制用于写入的归档格式。它必须为在模块层级定义的常量 :const:`USTAR_FORMAT`, " +":const:`GNU_FORMAT` 或 :const:`PAX_FORMAT` 中的一个。 " +"当读取时,格式将被自动检测,即使单个归档中存在不同的格式。" + +#: ../../library/tarfile.rst:450 +msgid "" +"The *tarinfo* argument can be used to replace the default :class:`TarInfo` " +"class with a different one." +msgstr "*tarinfo* 参数可以被用来将默认的 :class:`TarInfo` 类替换为另一个。" + +#: ../../library/tarfile.rst:453 +msgid "" +"If *dereference* is :const:`False`, add symbolic and hard links to the " +"archive. If it is :const:`True`, add the content of the target files to the " +"archive. This has no effect on systems that do not support symbolic links." +msgstr "" +"如果 *dereference* 为 :const:`False`,则会将符号链接和硬链接添加到归档中。如果为 " +":const:`True`,则会将目标文件的内容添加到归档中。在不支持符号链接的系统上参数将不起作用。" + +#: ../../library/tarfile.rst:457 +msgid "" +"If *ignore_zeros* is :const:`False`, treat an empty block as the end of the " +"archive. If it is :const:`True`, skip empty (and invalid) blocks and try to " +"get as many members as possible. This is only useful for reading " +"concatenated or damaged archives." +msgstr "" +"如果 *ignore_zeros* 为 :const:`False`,则会将空的数据块当作归档的末尾来处理。如果为 " +":const:`True`,则会跳过空的(和无效的)数据块并尝试获取尽可能多的成员。此参数仅适用于读取拼接的或损坏的归档。" + +#: ../../library/tarfile.rst:461 +msgid "" +"*debug* can be set from ``0`` (no debug messages) up to ``3`` (all debug " +"messages). The messages are written to ``sys.stderr``." +msgstr "*debug* 可设为从 ``0`` (无调试消息) 到 ``3`` (全部调试消息)。消息会被写入到 ``sys.stderr``。" + +#: ../../library/tarfile.rst:464 +msgid "" +"*errorlevel* controls how extraction errors are handled, see :attr:`the " +"corresponding attribute `." +msgstr "*errorlevel* 控制如何处理解压错误,参见 :attr:`相应的属性 `。" + +#: ../../library/tarfile.rst:467 +msgid "" +"The *encoding* and *errors* arguments define the character encoding to be " +"used for reading or writing the archive and how conversion errors are going " +"to be handled. The default settings will work for most users. See section " +":ref:`tar-unicode` for in-depth information." +msgstr "" +"*encoding* 和 *errors* 参数定义了读取或写入归档所使用的字符编码格式以及要如何处理转换错误。默认设置将适用于大多数用户。 " +"要深入了解详情可参阅 :ref:`tar-unicode` 小节。" + +#: ../../library/tarfile.rst:472 +msgid "" +"The *pax_headers* argument is an optional dictionary of strings which will " +"be added as a pax global header if *format* is :const:`PAX_FORMAT`." +msgstr "" +"可选的 *pax_headers* 参数是字符串的字典,如果 *format* 为 :const:`PAX_FORMAT` 它将被作为 pax " +"全局标头被添加。" + +#: ../../library/tarfile.rst:475 +msgid "" +"If *stream* is set to :const:`True` then while reading the archive info " +"about files in the archive are not cached, saving memory." +msgstr "如果 *stream* 被设为 :const:`True` 则在读取时有关归档中文件的归档信息不会被缓存,以节省内存消耗。" + +#: ../../library/tarfile.rst:478 ../../library/tarfile.rst:801 +msgid "Use ``'surrogateescape'`` as the default for the *errors* argument." +msgstr "使用 ``'surrogateescape'`` 作为 *errors* 参数的默认值。" + +#: ../../library/tarfile.rst:487 +msgid "Add the *stream* parameter." +msgstr "增加了 *stream* 形参。" + +#: ../../library/tarfile.rst:492 +msgid "" +"Alternative constructor. The :func:`tarfile.open` function is actually a " +"shortcut to this classmethod." +msgstr "作为替代的构造器。 :func:`tarfile.open` 函数实际上是这个类方法的快捷方式。" + +#: ../../library/tarfile.rst:498 +msgid "" +"Return a :class:`TarInfo` object for member *name*. If *name* can not be " +"found in the archive, :exc:`KeyError` is raised." +msgstr "" +"返回成员 *name* 的 :class:`TarInfo` 对象。如果 *name* 在归档中找不到,则会引发 :exc:`KeyError`。" + +#: ../../library/tarfile.rst:503 +msgid "" +"If a member occurs more than once in the archive, its last occurrence is " +"assumed to be the most up-to-date version." +msgstr "如果一个成员在归档中出现超过一次,它的最后一次出现会被视为是最新的版本。" + +#: ../../library/tarfile.rst:509 +msgid "" +"Return the members of the archive as a list of :class:`TarInfo` objects. The" +" list has the same order as the members in the archive." +msgstr "以 :class:`TarInfo` 对象列表的形式返回归档的成员。列表的顺序与归档中成员的顺序一致。" + +#: ../../library/tarfile.rst:515 +msgid "" +"Return the members as a list of their names. It has the same order as the " +"list returned by :meth:`getmembers`." +msgstr "以名称列表的形式返回成员。它的顺序与 :meth:`getmembers` 所返回列表的顺序一致。" + +#: ../../library/tarfile.rst:521 +msgid "" +"Print a table of contents to ``sys.stdout``. If *verbose* is :const:`False`," +" only the names of the members are printed. If it is :const:`True`, output " +"similar to that of :program:`ls -l` is produced. If optional *members* is " +"given, it must be a subset of the list returned by :meth:`getmembers`." +msgstr "" +"将内容清单打印到 ``sys.stdout``。如果 *verbose* 为 :const:`False`,则将只打印成员名称。如果为 " +":const:`True`,则输出将类似于 :program:`ls -l` 的输出效果。如果给定了可选的 *members*,它必须为 " +":meth:`getmembers` 所返回的列表的一个子集。" + +#: ../../library/tarfile.rst:526 +msgid "Added the *members* parameter." +msgstr "添加了 *members* 形参。" + +#: ../../library/tarfile.rst:532 +msgid "" +"Return the next member of the archive as a :class:`TarInfo` object, when " +":class:`TarFile` is opened for reading. Return :const:`None` if there is no " +"more available." +msgstr "" +"当 :class:`TarFile` 被打开用于读取时,以 :class:`TarInfo` 对象的形式返回归档的下一个成员。如果不再有可用对象则返回 " +":const:`None`." + +#: ../../library/tarfile.rst:539 +msgid "" +"Extract all members from the archive to the current working directory or " +"directory *path*. If optional *members* is given, it must be a subset of the" +" list returned by :meth:`getmembers`. Directory information like owner, " +"modification time and permissions are set after all members have been " +"extracted. This is done to work around two problems: A directory's " +"modification time is reset each time a file is created in it. And, if a " +"directory's permissions do not allow writing, extracting files to it will " +"fail." +msgstr "" +"将归档中的所有成员提取到当前工作目录或 *path* 目录。如果给定了可选的 *members*,则它必须为 :meth:`getmembers` " +"所返回的列表的一个子集。目录信息例如所有者、修改时间和权限会在所有成员提取完毕后被设置。 " +"这样做是为了避免两个问题:目录的修改时间会在每当在其中创建文件时被重置。并且如果目录的权限不允许写入,提取文件到目录的操作将失败。" + +#: ../../library/tarfile.rst:547 +msgid "" +"If *numeric_owner* is :const:`True`, the uid and gid numbers from the " +"tarfile are used to set the owner/group for the extracted files. Otherwise, " +"the named values from the tarfile are used." +msgstr "" +"如果 *numeric_owner* 为 :const:`True`,则将使用来自 tarfile 的 uid 和 gid " +"数值来设置被提取文件的所有者/用户组。在其他情况下,则会使用来自 tarfile 的名称值。" + +#: ../../library/tarfile.rst:551 +msgid "" +"The *filter* argument specifies how ``members`` are modified or rejected " +"before extraction. See :ref:`tarfile-extraction-filter` for details. It is " +"recommended to set this explicitly only if specific *tar* features are " +"required, or as ``filter='data'`` to support Python versions with a less " +"secure default (3.13 and lower)." +msgstr "" +"*filter* 参数指定在提取成员之前如何修改或拒绝 ``members``。详细信息请参见 :ref:`tarfile-extraction-" +"filter`。建议仅在需要特定的 *tar* 特性时才显式设置此值,或者设置 ``filter='data'`` 以支持默认安全性较低的 Python" +" 版本(3.13 及以下)。" + +#: ../../library/tarfile.rst:560 +msgid "" +"Never extract archives from untrusted sources without prior inspection." +msgstr "绝不要在没有预先检查的情况下从不受信任的来源提取归档文件。" + +#: ../../library/tarfile.rst:562 +msgid "" +"Since Python 3.14, the default (:func:`data `) will prevent the" +" most dangerous security issues. However, it will not prevent *all* " +"unintended or insecure behavior. Read the :ref:`tarfile-extraction-filter` " +"section for details." +msgstr "" +"从 Python 3.14 起,默认的 (:func:`data `) 将能防止最危险的安全问题。不过,它不能防止 *所有* " +"非故意或不安全的行为。请参阅 :ref:`tarfile-extraction-filter` 一节了解详情。" + +#: ../../library/tarfile.rst:567 ../../library/tarfile.rst:604 +msgid "Added the *numeric_owner* parameter." +msgstr "添加了 *numeric_owner* 形参。" + +#: ../../library/tarfile.rst:570 ../../library/tarfile.rst:607 +msgid "The *path* parameter accepts a :term:`path-like object`." +msgstr "*path* 形参接受一个 :term:`path-like object`。" + +#: ../../library/tarfile.rst:573 ../../library/tarfile.rst:610 +#: ../../library/tarfile.rst:694 +msgid "Added the *filter* parameter." +msgstr "添加了 *filter* 形参。" + +#: ../../library/tarfile.rst:576 +msgid "The *filter* parameter now defaults to ``'data'``." +msgstr "现在 *filter* 形参的默认值为 ``'data'``。" + +#: ../../library/tarfile.rst:582 +msgid "" +"Extract a member from the archive to the current working directory, using " +"its full name. Its file information is extracted as accurately as possible. " +"*member* may be a filename or a :class:`TarInfo` object. You can specify a " +"different directory using *path*. *path* may be a :term:`path-like object`. " +"File attributes (owner, mtime, mode) are set unless *set_attrs* is false." +msgstr "" +"从归档中提取出一个成员放入当前工作目录,将使用其完整名称。成员的文件信息会尽可能精确地被提取。 *member* 可以是一个文件名或 " +":class:`TarInfo` 对象。你可以使用 *path* 指定一个不同的目录。 *path* 可以是一个 :term:`path-like " +"object`。将会设置文件属性 (owner, mtime, mode) 除非 *set_attrs* 为假值。" + +#: ../../library/tarfile.rst:588 +msgid "" +"The *numeric_owner* and *filter* arguments are the same as for " +":meth:`extractall`." +msgstr "*numeric_owner* 和 *filter* 参数与 :meth:`extractall` 中的相同。" + +#: ../../library/tarfile.rst:593 +msgid "" +"The :meth:`extract` method does not take care of several extraction issues. " +"In most cases you should consider using the :meth:`extractall` method." +msgstr ":meth:`extract` 方法不会处理某些提取问题。在大多数情况下你应当考虑使用 :meth:`extractall` 方法。" + +#: ../../library/tarfile.rst:598 +msgid "" +"Never extract archives from untrusted sources without prior inspection. See " +"the warning for :meth:`extractall` for details." +msgstr "绝不要在没有预先检查的情况下从不受信任的来源提取归档文件。请参阅 :meth:`extractall` 的警告信息了解详情。" + +#: ../../library/tarfile.rst:601 +msgid "Added the *set_attrs* parameter." +msgstr "添加了 *set_attrs* 形参。" + +#: ../../library/tarfile.rst:616 +msgid "" +"Extract a member from the archive as a file object. *member* may be a " +"filename or a :class:`TarInfo` object. If *member* is a regular file or a " +"link, an :class:`io.BufferedReader` object is returned. For all other " +"existing members, :const:`None` is returned. If *member* does not appear in " +"the archive, :exc:`KeyError` is raised." +msgstr "" +"将归档中的一个成员提取为文件对象。 *member* 可以是一个文件名或 :class:`TarInfo` 对象。如果 *member* " +"是一个常规文件或链接,则会返回一个 :class:`io.BufferedReader` 对象。对于所有其他现有成员,则都将返回 " +":const:`None`。如果 *member* 未在归档中出现,则会引发 :exc:`KeyError`。" + +#: ../../library/tarfile.rst:622 +msgid "Return an :class:`io.BufferedReader` object." +msgstr "返回一个 :class:`io.BufferedReader` 对象。" + +#: ../../library/tarfile.rst:625 +msgid "" +"The returned :class:`io.BufferedReader` object has the :attr:`!mode` " +"attribute which is always equal to ``'rb'``." +msgstr "返回的 :class:`io.BufferedReader` 对象具有 :attr:`!mode` 属性并且总是会等于 ``'rb'``。" + +#: ../../library/tarfile.rst:632 +msgid "" +"If *errorlevel* is ``0``, errors are ignored when using " +":meth:`TarFile.extract` and :meth:`TarFile.extractall`. Nevertheless, they " +"appear as error messages in the debug output when *debug* is greater than 0." +" If ``1`` (the default), all *fatal* errors are raised as :exc:`OSError` or " +":exc:`FilterError` exceptions. If ``2``, all *non-fatal* errors are raised " +"as :exc:`TarError` exceptions as well." +msgstr "" +"如果 *errorlevel* 为 ``0``,则在使用 :meth:`TarFile.extract` 和 " +":meth:`TarFile.extractall` 时错误会被忽略。不过,当 *debug* 大于 0 时它们将会作为错误消息在调试输出中出现。 如果" +" *errorlevel*为 ``1`` (默认值),则所有 *fatal* 错误都会作为 :exc:`OSError` 或 " +":exc:`FilterError` 异常被引发。如果为 ``2``,则所有 *non-fatal* 错误也会作为 :exc:`TarError` " +"异常被引发。" + +#: ../../library/tarfile.rst:640 +msgid "" +"Some exceptions, e.g. ones caused by wrong argument types or data " +"corruption, are always raised." +msgstr "某些异常,如参数类型错误或数据损坏导致的异常,总是会被触发。" + +#: ../../library/tarfile.rst:643 +msgid "" +"Custom :ref:`extraction filters ` should raise " +":exc:`FilterError` for *fatal* errors and :exc:`ExtractError` for *non-" +"fatal* ones." +msgstr "" +"自定义 :ref:`提取过滤器 ` 应针对 *fatal* 错误引发 " +":exc:`FilterError`,针对 *non-fatal* 错误引发 :exc:`ExtractError`。" + +#: ../../library/tarfile.rst:647 +msgid "" +"Note that when an exception is raised, the archive may be partially " +"extracted. It is the user’s responsibility to clean up." +msgstr "请注意,当出现异常时,存档可能会被部分提取。需要用户负责进行清理。" + +#: ../../library/tarfile.rst:654 +msgid "" +"The :ref:`extraction filter ` used as a default " +"for the *filter* argument of :meth:`~TarFile.extract` and " +":meth:`~TarFile.extractall`." +msgstr "" +"被用作 :meth:`~TarFile.extract` 和 :meth:`~TarFile.extractall` 的 *filter* " +"参数的默认值的 :ref:`提取过滤器 `。" + +#: ../../library/tarfile.rst:658 +msgid "" +"The attribute may be ``None`` or a callable. String names are not allowed " +"for this attribute, unlike the *filter* argument to " +":meth:`~TarFile.extract`." +msgstr "" +"该属性可以为 ``None`` 或是一个可调用对象。与 :meth:`~TarFile.extract` 的 *filter* " +"参数不同,该属性不允许使用字符串名称。" + +#: ../../library/tarfile.rst:662 +msgid "" +"If ``extraction_filter`` is ``None`` (the default), extraction methods will " +"use the :func:`data ` filter by default." +msgstr "" +"如果 ``extraction_filter`` 为 ``None`` (默认值),则提取方法默认将使用 :func:`data " +"` 过滤器。" + +#: ../../library/tarfile.rst:665 +msgid "" +"The attribute may be set on instances or overridden in subclasses. It also " +"is possible to set it on the ``TarFile`` class itself to set a global " +"default, although, since it affects all uses of *tarfile*, it is best " +"practice to only do so in top-level applications or :mod:`site configuration" +" `. To set a global default this way, a filter function needs to be " +"wrapped in :func:`staticmethod` to prevent injection of a ``self`` argument." +msgstr "" +"该属性可在实例上设置或在子类中覆盖。也可以在 ``TarFile`` 类本身上设置它以设置一个全局默认值,不过,由于它会影响 *tarfile* " +"的所有使用,最好的做法是只在最高层级应用程序或 :mod:`站点配置 ` 中这样做。要以这种方式设置全局默认值,需要将一个过滤器函数包装在 " +":func:`staticmethod` 中以防止 ``self`` 参数的注入。" + +#: ../../library/tarfile.rst:675 +msgid "" +"The default filter is set to :func:`data `, which disallows " +"some dangerous features such as links to absolute paths or paths outside of " +"the destination. Previously, the default was equivalent to " +":func:`fully_trusted `." +msgstr "" +"默认的提取过滤器是设置为 :func:`data " +"`,这将禁止一些危险的特性,比如链接到绝对路径或目的地之外的路径。以前,默认的过滤器相当于 " +":func:`fully_trusted `." + +#: ../../library/tarfile.rst:683 +msgid "" +"Add the file *name* to the archive. *name* may be any type of file " +"(directory, fifo, symbolic link, etc.). If given, *arcname* specifies an " +"alternative name for the file in the archive. Directories are added " +"recursively by default. This can be avoided by setting *recursive* to " +":const:`False`. Recursion adds entries in sorted order. If *filter* is " +"given, it should be a function that takes a :class:`TarInfo` object argument" +" and returns the changed :class:`TarInfo` object. If it instead returns " +":const:`None` the :class:`TarInfo` object will be excluded from the archive." +" See :ref:`tar-examples` for an example." +msgstr "" +"将文件 *name* 添加到归档。 *name* 可以为任意类型的文件(目录、fifo、符号链接等等)。如果给出 *arcname* " +"则它将为归档中的文件指定一个替代名称。默认情况下会递归地添加目录。这可以通过将 *recursive* 设为 :const:`False` 来避免。 " +"递归操作会按排序顺序添加条目。如果给定了 *filter*,它应当为一个接受 :class:`TarInfo` 对象并返回已修改 " +":class:`TarInfo` 对象的函数。如果它返回 :const:`None` 则 :class:`TarInfo` 对象将从归档中被排除。 " +"具体示例参见 :ref:`tar-examples`。" + +#: ../../library/tarfile.rst:697 +msgid "Recursion adds entries in sorted order." +msgstr "递归操作按排序顺序添加条目。" + +#: ../../library/tarfile.rst:703 +msgid "" +"Add the :class:`TarInfo` object *tarinfo* to the archive. If *tarinfo* " +"represents a non zero-size regular file, the *fileobj* argument should be a " +":term:`binary file`, and ``tarinfo.size`` bytes are read from it and added " +"to the archive. You can create :class:`TarInfo` objects directly, or by " +"using :meth:`gettarinfo`." +msgstr "" +"将 :class:`TarInfo` 对象 *tarinfo* 添加到归档中。如果 *tarinfo* 代表一个大小不为零的常规文件,则 " +"*fileobj* 参数应为一个 :term:`binary file`,且会从中读取 ``tarinfo.size`` 个字节并添加到归档中。 " +"你可以直接创建 :class:`TarInfo` 对象,或者也可以使用 :meth:`gettarinfo`。" + +#: ../../library/tarfile.rst:710 +msgid "*fileobj* must be given for non-zero-sized regular files." +msgstr "对于大小不为零的常规文件必须给出 *fileobj*。" + +#: ../../library/tarfile.rst:715 +msgid "" +"Create a :class:`TarInfo` object from the result of :func:`os.stat` or " +"equivalent on an existing file. The file is either named by *name*, or " +"specified as a :term:`file object` *fileobj* with a file descriptor. *name* " +"may be a :term:`path-like object`. If given, *arcname* specifies an " +"alternative name for the file in the archive, otherwise, the name is taken " +"from *fileobj*’s :attr:`~io.FileIO.name` attribute, or the *name* argument." +" The name should be a text string." +msgstr "" +"基于 :func:`os.stat` 的结果或者现有文件的相同数据创建一个 :class:`TarInfo`。文件或者是命名为 " +"*name*,或者是使用文件描述符指定为一个 :term:`file object` *fileobj*。 *name* 可以是一个 " +":term:`path-like object`。如果给定了 *arcname*,则它将为归档中的文件指定一个替代名称,在其他情况下,名称将从 " +"*fileobj* 的 :attr:`~io.FileIO.name` 属性或 *name* 参数获取。名称应当是一个文本字符串。" + +#: ../../library/tarfile.rst:724 +msgid "" +"You can modify some of the :class:`TarInfo`’s attributes before you add it " +"using :meth:`addfile`. If the file object is not an ordinary file object " +"positioned at the beginning of the file, attributes such as " +":attr:`~TarInfo.size` may need modifying. This is the case for objects such" +" as :class:`~gzip.GzipFile`. The :attr:`~TarInfo.name` may also be modified," +" in which case *arcname* could be a dummy string." +msgstr "" +"你可以在使用 :meth:`addfile` 添加 :class:`TarInfo` 的某些属性之前修改它们。 " +"如果文件对象不是从文件开头进行定位的普通文件对象,:attr:`~TarInfo.size` 之类的属性就可能需要修改。例如 " +":class:`~gzip.GzipFile` 之类的文件就属于这种情况。 :attr:`~TarInfo.name` 也可以被修改,在这种情况下 " +"*arcname* 可以是一个占位字符串。" + +#: ../../library/tarfile.rst:738 +msgid "" +"Close the :class:`TarFile`. In write mode, two finishing zero blocks are " +"appended to the archive." +msgstr "关闭 :class:`TarFile`。在写入模式下,会向归档添加两个表示结束的零数据块。" + +#: ../../library/tarfile.rst:745 +msgid "A dictionary containing key-value pairs of pax global headers." +msgstr "一个包含 pax 全局标头的键值对的字典。" + +#: ../../library/tarfile.rst:752 +msgid "TarInfo Objects" +msgstr "TarInfo 对象" + +#: ../../library/tarfile.rst:754 +msgid "" +"A :class:`TarInfo` object represents one member in a :class:`TarFile`. Aside" +" from storing all required attributes of a file (like file type, size, time," +" permissions, owner etc.), it provides some useful methods to determine its " +"type. It does *not* contain the file's data itself." +msgstr "" +":class:`TarInfo` 对象代表 :class:`TarFile` 中的一个文件。 " +"除了会存储所有必要的文件属性(例如文件类型、大小、时间、权限、所有者等),它还提供了一些确定文件类型的有用方法。此对象 *并不* 包含文件数据本身。" + +#: ../../library/tarfile.rst:759 +msgid "" +":class:`TarInfo` objects are returned by :class:`TarFile`'s methods " +":meth:`~TarFile.getmember`, :meth:`~TarFile.getmembers` and " +":meth:`~TarFile.gettarinfo`." +msgstr "" +":class:`TarInfo` 对象可通过 :class:`TarFile` 的方法 :meth:`~TarFile.getmember`, " +":meth:`~TarFile.getmembers` 和 :meth:`~TarFile.gettarinfo` 返回。" + +#: ../../library/tarfile.rst:763 +msgid "" +"Modifying the objects returned by :meth:`~TarFile.getmember` or " +":meth:`~TarFile.getmembers` will affect all subsequent operations on the " +"archive. For cases where this is unwanted, you can use :mod:`copy.copy() " +"` or call the :meth:`~TarInfo.replace` method to create a modified " +"copy in one step." +msgstr "" +"修改 :meth:`~TarFile.getmember` 或 :meth:`~TarFile.getmembers` " +"返回的对象会影响归档上的所有后续操作。对于不想要这样的场景,你可以使用 :mod:`copy.copy() ` 或调用 " +":meth:`~TarInfo.replace` 方法一次性创建修改后的副本。" + +#: ../../library/tarfile.rst:769 +msgid "" +"Several attributes can be set to ``None`` to indicate that a piece of " +"metadata is unused or unknown. Different :class:`TarInfo` methods handle " +"``None`` differently:" +msgstr "" +"部分属性可以设为 ``None`` 以表示一些元数据未被使用或未知。不同的 :class:`TarInfo` 方法会以不同的方式处理 ``None``:" + +#: ../../library/tarfile.rst:773 +msgid "" +"The :meth:`~TarFile.extract` or :meth:`~TarFile.extractall` methods will " +"ignore the corresponding metadata, leaving it set to a default." +msgstr "" +":meth:`~TarFile.extract` 或 :meth:`~TarFile.extractall` 方法会忽略相应的元数据,让其保持默认设置。" + +#: ../../library/tarfile.rst:775 +msgid ":meth:`~TarFile.addfile` will fail." +msgstr ":meth:`~TarFile.addfile` 将会失败。" + +#: ../../library/tarfile.rst:776 +msgid ":meth:`~TarFile.list` will print a placeholder string." +msgstr ":meth:`~TarFile.list` 将打印一个占位字符串。" + +#: ../../library/tarfile.rst:780 +msgid "Create a :class:`TarInfo` object." +msgstr "创建一个 :class:`TarInfo` 对象。" + +#: ../../library/tarfile.rst:785 +msgid "Create and return a :class:`TarInfo` object from string buffer *buf*." +msgstr "基于字符串缓冲区 *buf* 创建并返回一个 :class:`TarInfo` 对象。" + +#: ../../library/tarfile.rst:787 +msgid "Raises :exc:`HeaderError` if the buffer is invalid." +msgstr "如果缓冲区无效则会引发 :exc:`HeaderError`。" + +#: ../../library/tarfile.rst:792 +msgid "" +"Read the next member from the :class:`TarFile` object *tarfile* and return " +"it as a :class:`TarInfo` object." +msgstr "从 :class:`TarFile` 对象 *tarfile* 读取下一个成员并将其作为 :class:`TarInfo` 对象返回。" + +#: ../../library/tarfile.rst:798 +msgid "" +"Create a string buffer from a :class:`TarInfo` object. For information on " +"the arguments see the constructor of the :class:`TarFile` class." +msgstr "基于 :class:`TarInfo` 对象创建一个字符串缓冲区。有关参数的信息请参见 :class:`TarFile` 类的构造器。" + +#: ../../library/tarfile.rst:805 +msgid "A ``TarInfo`` object has the following public data attributes:" +msgstr "``TarInfo`` 对象具有以下公有数据属性:" + +#: ../../library/tarfile.rst:811 +msgid "Name of the archive member." +msgstr "归档成员的名称。" + +#: ../../library/tarfile.rst:817 +msgid "Size in bytes." +msgstr "以字节表示的大小。" + +#: ../../library/tarfile.rst:823 +msgid "" +"Time of last modification in seconds since the :ref:`epoch `, as in " +":attr:`os.stat_result.st_mtime`." +msgstr "" +"以 :ref:`Unix 纪元 ` 秒数表示的最近修改时间,与 :attr:`os.stat_result.st_mtime` 相同。" + +#: ../../library/tarfile.rst:828 ../../library/tarfile.rst:839 +#: ../../library/tarfile.rst:871 ../../library/tarfile.rst:882 +#: ../../library/tarfile.rst:893 ../../library/tarfile.rst:904 +msgid "" +"Can be set to ``None`` for :meth:`~TarFile.extract` and " +":meth:`~TarFile.extractall`, causing extraction to skip applying this " +"attribute." +msgstr "" +"对于 :meth:`~TarFile.extract` 和 :meth:`~TarFile.extractall` 可设为 " +"``None``,以使解压缩操作跳过应用此属性。" + +#: ../../library/tarfile.rst:835 +msgid "Permission bits, as for :func:`os.chmod`." +msgstr "权限比特位,与 :func:`os.chmod` 相同。" + +#: ../../library/tarfile.rst:845 +msgid "" +"File type. *type* is usually one of these constants: :const:`REGTYPE`, " +":const:`AREGTYPE`, :const:`LNKTYPE`, :const:`SYMTYPE`, :const:`DIRTYPE`, " +":const:`FIFOTYPE`, :const:`CONTTYPE`, :const:`CHRTYPE`, :const:`BLKTYPE`, " +":const:`GNUTYPE_SPARSE`. To determine the type of a :class:`TarInfo` object" +" more conveniently, use the ``is*()`` methods below." +msgstr "" +"文件类型。 *type* 通常为以下常量之一::const:`REGTYPE`, :const:`AREGTYPE`, " +":const:`LNKTYPE`, :const:`SYMTYPE`, :const:`DIRTYPE`, :const:`FIFOTYPE`, " +":const:`CONTTYPE`, :const:`CHRTYPE`, :const:`BLKTYPE`, " +":const:`GNUTYPE_SPARSE`。要更方便地确定一个 :class:`TarInfo` 对象的类型,请使用下述的 ``is*()`` " +"方法。" + +#: ../../library/tarfile.rst:855 +msgid "" +"Name of the target file name, which is only present in :class:`TarInfo` " +"objects of type :const:`LNKTYPE` and :const:`SYMTYPE`." +msgstr "" +"目标文件名的名称,该属性仅在类型为 :const:`LNKTYPE` 和 :const:`SYMTYPE` 的 :class:`TarInfo` " +"对象中存在。" + +#: ../../library/tarfile.rst:858 +msgid "" +"For symbolic links (``SYMTYPE``), the *linkname* is relative to the " +"directory that contains the link. For hard links (``LNKTYPE``), the " +"*linkname* is relative to the root of the archive." +msgstr "" +"对于符号链接 (``SYMTYPE``),*linkname* 是相对于包含链接的目录的。对于硬链接 (``LNKTYPE``),*linkname* " +"则是相对于存档根目录的。" + +#: ../../library/tarfile.rst:867 +msgid "User ID of the user who originally stored this member." +msgstr "最初保存该成员的用户的用户 ID。" + +#: ../../library/tarfile.rst:878 +msgid "Group ID of the user who originally stored this member." +msgstr "最初保存该成员的用户的分组 ID。" + +#: ../../library/tarfile.rst:889 +msgid "User name." +msgstr "用户名。" + +#: ../../library/tarfile.rst:900 +msgid "Group name." +msgstr "分组名。" + +#: ../../library/tarfile.rst:911 +msgid "Header checksum." +msgstr "标头校验和。" + +#: ../../library/tarfile.rst:917 +msgid "Device major number." +msgstr "设备主编号。" + +#: ../../library/tarfile.rst:923 +msgid "Device minor number." +msgstr "设备次编号。" + +#: ../../library/tarfile.rst:929 +msgid "The tar header starts here." +msgstr "tar 标头从这里开始。" + +#: ../../library/tarfile.rst:935 +msgid "The file's data starts here." +msgstr "文件的数据从这里开始。" + +#: ../../library/tarfile.rst:940 +msgid "Sparse member information." +msgstr "离散的成员信息。" + +#: ../../library/tarfile.rst:946 +msgid "" +"A dictionary containing key-value pairs of an associated pax extended " +"header." +msgstr "一个包含所关联的 pax 扩展标头的键值对的字典。" + +#: ../../library/tarfile.rst:954 +msgid "" +"Return a *new* copy of the :class:`!TarInfo` object with the given " +"attributes changed. For example, to return a ``TarInfo`` with the group name" +" set to ``'staff'``, use::" +msgstr "" +"返回修改了给定属性的 :class:`!TarInfo` 对象的 *新* 副本。例如,要返回组名设为 ``'staff'`` 的 " +"``TarInfo``,请使用::" + +#: ../../library/tarfile.rst:958 +msgid "new_tarinfo = old_tarinfo.replace(gname='staff')" +msgstr "new_tarinfo = old_tarinfo.replace(gname='staff')" + +#: ../../library/tarfile.rst:960 +msgid "" +"By default, a deep copy is made. If *deep* is false, the copy is shallow, " +"i.e. ``pax_headers`` and any custom attributes are shared with the original " +"``TarInfo`` object." +msgstr "" +"在默认情况下,将执行深拷贝。如果 *deep* 为假值,则执行浅拷贝,即 ``pax_headers`` 及任何自定义属性都与原始 " +"``TarInfo`` 对象共享。" + +#: ../../library/tarfile.rst:964 +msgid "A :class:`TarInfo` object also provides some convenient query methods:" +msgstr ":class:`TarInfo` 对象还提供了一些便捷查询方法:" + +#: ../../library/tarfile.rst:969 +msgid "Return :const:`True` if the :class:`TarInfo` object is a regular file." +msgstr "如果 :class:`TarInfo` 对象为普通文件则返回 :const:`True`。" + +#: ../../library/tarfile.rst:974 +msgid "Same as :meth:`isfile`." +msgstr "与 :meth:`isfile` 相同。" + +#: ../../library/tarfile.rst:979 +msgid "Return :const:`True` if it is a directory." +msgstr "如果为目录则返回 :const:`True`。" + +#: ../../library/tarfile.rst:984 +msgid "Return :const:`True` if it is a symbolic link." +msgstr "如果为符号链接则返回 :const:`True`。" + +#: ../../library/tarfile.rst:989 +msgid "Return :const:`True` if it is a hard link." +msgstr "如果为硬链接则返回 :const:`True`。" + +#: ../../library/tarfile.rst:994 +msgid "Return :const:`True` if it is a character device." +msgstr "如果为字符设备则返回 :const:`True`。" + +#: ../../library/tarfile.rst:999 +msgid "Return :const:`True` if it is a block device." +msgstr "如果为块设备则返回 :const:`True`。" + +#: ../../library/tarfile.rst:1004 +msgid "Return :const:`True` if it is a FIFO." +msgstr "如果为 FIFO 则返回 :const:`True`。" + +#: ../../library/tarfile.rst:1009 +msgid "" +"Return :const:`True` if it is one of character device, block device or FIFO." +msgstr "如果为字符设备、块设备或 FIFO 之一则返回 :const:`True`。" + +#: ../../library/tarfile.rst:1015 +msgid "Extraction filters" +msgstr "解压缩过滤器" + +#: ../../library/tarfile.rst:1019 +msgid "" +"The *tar* format is designed to capture all details of a UNIX-like " +"filesystem, which makes it very powerful. Unfortunately, the features make " +"it easy to create tar files that have unintended -- and possibly malicious " +"-- effects when extracted. For example, extracting a tar file can overwrite " +"arbitrary files in various ways (e.g. by using absolute paths, ``..`` path " +"components, or symlinks that affect later members)." +msgstr "" +"*tar* 格式的设计旨在捕捉类 UNIX 文件系统的所有细节,这使其功能非常强大。不幸的是,这些特性也使得很容易创建在解压缩时产生意想不到的 -- " +"甚至可能是恶意的 -- 影响的 tar 文件。举例来说,解压缩 tar 文件时可以通过各种方式覆盖任意文件(例如通过使用绝对路径、``..`` " +"路径组件或影响后续成员的符号链接等)。" + +#: ../../library/tarfile.rst:1027 +msgid "" +"In most cases, the full functionality is not needed. Therefore, *tarfile* " +"supports extraction filters: a mechanism to limit functionality, and thus " +"mitigate some of the security issues." +msgstr "在大多数情况下,并不需要全部的功能。因此,*tarfile* 支持提取过滤器:一种限制功能的机制,从而避免一些安全问题。" + +#: ../../library/tarfile.rst:1033 +msgid "" +"None of the available filters blocks *all* dangerous archive features. Never" +" extract archives from untrusted sources without prior inspection. See also " +":ref:`tarfile-further-verification`." +msgstr "" +"没有可用的过滤器阻止 *所有* 危险的归档特性。在没有事先检查的情况下,不要从不可信的来源提取归档。参见 :ref:`tarfile-further-" +"verification`." + +#: ../../library/tarfile.rst:1039 +msgid ":pep:`706`" +msgstr ":pep:`706`" + +#: ../../library/tarfile.rst:1040 +msgid "Contains further motivation and rationale behind the design." +msgstr "包含设计背后进一步的动机和理由。" + +#: ../../library/tarfile.rst:1042 +msgid "" +"The *filter* argument to :meth:`TarFile.extract` or " +":meth:`~TarFile.extractall` can be:" +msgstr "" +":meth:`TarFile.extract` 或 :meth:`~TarFile.extractall` 的 *filter* 参数可以是:" + +#: ../../library/tarfile.rst:1045 +msgid "" +"the string ``'fully_trusted'``: Honor all metadata as specified in the " +"archive. Should be used if the user trusts the archive completely, or " +"implements their own complex verification." +msgstr "" +"字符串 ``'fully_trusted'``: 尊重归档文件中指定的所有元数据。如果用户完全信任该归档,或实现了自己的复杂验证则应使用此过滤器。" + +#: ../../library/tarfile.rst:1050 +msgid "" +"the string ``'tar'``: Honor most *tar*-specific features (i.e. features of " +"UNIX-like filesystems), but block features that are very likely to be " +"surprising or malicious. See :func:`tar_filter` for details." +msgstr "" +"字符串 ``'tar'``: 尊重大多数 *tar* 专属的特性(即类 UNIX 文件系统的功能),但阻止极有可能令人惊讶的或恶意的功能。详情参见 " +":func:`tar_filter`." + +#: ../../library/tarfile.rst:1054 +msgid "" +"the string ``'data'``: Ignore or block most features specific to UNIX-like " +"filesystems. Intended for extracting cross-platform data archives. See " +":func:`data_filter` for details." +msgstr "" +"字符串 ``'data'``: 忽略或阻止大多数类 UNIX 文件系统专属的特性。用于提取跨平台数据归档文件。详情参见 " +":func:`data_filter`。" + +#: ../../library/tarfile.rst:1058 +msgid "``None`` (default): Use :attr:`TarFile.extraction_filter`." +msgstr "``None`` (默认): 使用 :attr:`TarFile.extraction_filter`。" + +#: ../../library/tarfile.rst:1060 +msgid "" +"If that is also ``None`` (the default), the ``'data'`` filter will be used." +msgstr "如果该参数也为 ``None`` (默认值),则将使用 ``'data'`` 过滤器。" + +#: ../../library/tarfile.rst:1064 +msgid "" +"The default filter is set to :func:`data `. Previously, the " +"default was equivalent to :func:`fully_trusted `." +msgstr "" +"默认过滤器被设为 :func:`data `。在之前版本中,默认值等于 :func:`fully_trusted " +"`." + +#: ../../library/tarfile.rst:1068 +msgid "" +"A callable which will be called for each extracted member with a " +":ref:`TarInfo ` describing the member and the destination " +"path to where the archive is extracted (i.e. the same path is used for all " +"members)::" +msgstr "" +"该可调用对象将针对每个被提取的成员执行调用并附带一个 :ref:`TarInfo ` " +"来描述该成员以及被提取归档文件的目标路径(即供所有成员使用的相同路径)::" + +#: ../../library/tarfile.rst:1073 +msgid "filter(member: TarInfo, path: str, /) -> TarInfo | None" +msgstr "filter(member: TarInfo, path: str, /) -> TarInfo | None" + +#: ../../library/tarfile.rst:1075 +msgid "" +"The callable is called just before each member is extracted, so it can take " +"the current state of the disk into account. It can:" +msgstr "该可调用对象会在提取每个成员之前被调用,因此它能够将磁盘的当前状态考虑在内。它可以:" + +#: ../../library/tarfile.rst:1079 +msgid "" +"return a :class:`TarInfo` object which will be used instead of the metadata " +"in the archive, or" +msgstr "返回一个 :class:`TarInfo` 对象,该对象将被用来代替归档文件中的元数据,或者" + +#: ../../library/tarfile.rst:1081 +msgid "return ``None``, in which case the member will be skipped, or" +msgstr "返回 ``None``,在这种情况下该成员将被跳过,或者" + +#: ../../library/tarfile.rst:1082 +msgid "" +"raise an exception to abort the operation or skip the member, depending on " +":attr:`~TarFile.errorlevel`. Note that when extraction is aborted, " +":meth:`~TarFile.extractall` may leave the archive partially extracted. It " +"does not attempt to clean up." +msgstr "" +"根据 :attr:`~TarFile.errorlevel` 的值引发一个异常以中止操作或跳过成员。 " +"请注意当提取操作中止时,:meth:`~TarFile.extractall` 可能会保留部分已提取的归档文件。它不会尝试执行清理。" + +#: ../../library/tarfile.rst:1088 +msgid "Default named filters" +msgstr "默认的命名过滤器" + +#: ../../library/tarfile.rst:1090 +msgid "" +"The pre-defined, named filters are available as functions, so they can be " +"reused in custom filters:" +msgstr "预定义的命名过滤器可作为函数使用,因此它们可在自定义过滤器中被重用:" + +#: ../../library/tarfile.rst:1095 +msgid "Return *member* unchanged." +msgstr "不加修改地返回 *member*。" + +#: ../../library/tarfile.rst:1097 +msgid "This implements the ``'fully_trusted'`` filter." +msgstr "实现 ``'fully_trusted'`` 过滤器。" + +#: ../../library/tarfile.rst:1101 +msgid "Implements the ``'tar'`` filter." +msgstr "实现 ``'tar'`` 过滤器。" + +#: ../../library/tarfile.rst:1103 +msgid "Strip leading slashes (``/`` and :data:`os.sep`) from filenames." +msgstr "从文件名中去除开头的斜杠 (``/`` 和 :data:`os.sep`)。" + +#: ../../library/tarfile.rst:1104 +msgid "" +":ref:`Refuse ` to extract files with absolute " +"paths (in case the name is absolute even after stripping slashes, e.g. " +"``C:/foo`` on Windows). This raises :class:`~tarfile.AbsolutePathError`." +msgstr "" +":ref:`拒绝 ` 提取具有绝对路径的文件(针对名称在去除斜杠后仍为绝对路径的情况,例如 " +"Windows 上 ``C:/foo`` 这样的路径)。这会引发 :class:`~tarfile.AbsolutePathError`。" + +#: ../../library/tarfile.rst:1108 +msgid "" +":ref:`Refuse ` to extract files whose absolute " +"path (after following symlinks) would end up outside the destination. This " +"raises :class:`~tarfile.OutsideDestinationError`." +msgstr "" +":ref:`拒绝 ` 提取具有位于目标以外的绝对路径(跟随符号链接之后)的文件。这会引发 " +":class:`~tarfile.OutsideDestinationError`." + +#: ../../library/tarfile.rst:1111 +msgid "" +"Clear high mode bits (setuid, setgid, sticky) and group/other write bits " +"(:const:`~stat.S_IWGRP` | :const:`~stat.S_IWOTH`)." +msgstr "" +"清空高模式位 (setuid, setgid, sticky) 和 group/other 写入位 (:const:`~stat.S_IWGRP` | " +":const:`~stat.S_IWOTH`)." + +#: ../../library/tarfile.rst:1114 ../../library/tarfile.rst:1153 +msgid "Return the modified ``TarInfo`` member." +msgstr "返回修改后的 ``TarInfo`` 成员。" + +#: ../../library/tarfile.rst:1118 +msgid "" +"Implements the ``'data'`` filter. In addition to what ``tar_filter`` does:" +msgstr "实现 ``'data'`` 过滤器。在 ``tar_filter`` 的所具有的功能之外:" + +#: ../../library/tarfile.rst:1121 +msgid "" +"Normalize link targets (:attr:`TarInfo.linkname`) using " +":func:`os.path.normpath`. Note that this removes internal ``..`` components," +" which may change the meaning of the link if the path in " +":attr:`!TarInfo.linkname` traverses symbolic links." +msgstr "" +"使用 :func:`os.path.normpath` 来正规化链接目标 (:attr:`TarInfo.linkname`)。请注意这将移除内部的 " +"``..`` 组件,这可能在 :attr:`!TarInfo.linkname` 中的路径会遍历符号链接时改变链接的含义。" + +#: ../../library/tarfile.rst:1127 +msgid "" +":ref:`Refuse ` to extract links (hard or soft) " +"that link to absolute paths, or ones that link outside the destination." +msgstr "" +":ref:`拒绝 ` 提取链接到绝对路径的链接(不论是硬链接还是软链接),或链接到目标之外的链接。" + +#: ../../library/tarfile.rst:1130 +msgid "" +"This raises :class:`~tarfile.AbsoluteLinkError` or " +":class:`~tarfile.LinkOutsideDestinationError`." +msgstr "" +"这会引发 :class:`~tarfile.AbsoluteLinkError` 或 " +":class:`~tarfile.LinkOutsideDestinationError`." + +#: ../../library/tarfile.rst:1133 +msgid "" +"Note that such files are refused even on platforms that do not support " +"symbolic links." +msgstr "请注意即使在不支持符号链接的平台上此类文件也会被拒绝。" + +#: ../../library/tarfile.rst:1136 +msgid "" +":ref:`Refuse ` to extract device files (including" +" pipes). This raises :class:`~tarfile.SpecialFileError`." +msgstr "" +":ref:`拒绝 ` 提取设备文件(包括管道)。这会引发 " +":class:`~tarfile.SpecialFileError`." + +#: ../../library/tarfile.rst:1140 +msgid "For regular files, including hard links:" +msgstr "用于常规文件,包括硬链接:" + +#: ../../library/tarfile.rst:1142 +msgid "" +"Set the owner read and write permissions (:const:`~stat.S_IRUSR` | " +":const:`~stat.S_IWUSR`)." +msgstr "设置所有者读写权限 (:const:`~stat.S_IRUSR` | :const:`~stat.S_IWUSR`)。" + +#: ../../library/tarfile.rst:1144 +msgid "" +"Remove the group & other executable permission (:const:`~stat.S_IXGRP` | " +":const:`~stat.S_IXOTH`) if the owner doesn’t have it " +"(:const:`~stat.S_IXUSR`)." +msgstr "" +"如果所有者没有可执行权限 (:const:`~stat.S_IXUSR`) 则移除 group 和 other 的可执行权限 " +"(:const:`~stat.S_IXGRP` | :const:`~stat.S_IXOTH`)." + +#: ../../library/tarfile.rst:1148 +msgid "" +"For other files (directories), set ``mode`` to ``None``, so that extraction " +"methods skip applying permission bits." +msgstr "对于其他文件(目录),将 ``mode`` 设为 ``None``,以便提取方法跳过应用权限位。" + +#: ../../library/tarfile.rst:1150 +msgid "" +"Set user and group info (``uid``, ``gid``, ``uname``, ``gname``) to " +"``None``, so that extraction methods skip setting it." +msgstr "" +"将用户和组信息 (``uid``, ``gid``, ``uname``, ``gname``) 设为 ``None``,以使得提取方法跳过对它的设置。" + +#: ../../library/tarfile.rst:1155 +msgid "" +"Note that this filter does not block *all* dangerous archive features. See " +":ref:`tarfile-further-verification` for details." +msgstr "" +"请注意该过滤器不会阻挡 *所有* 危险的归档特性。请参阅 :ref:`tarfile-further-verification` 了解详情。" + +#: ../../library/tarfile.rst:1160 +msgid "Link targets are now normalized." +msgstr "链接目标现在会被正规化。" + +#: ../../library/tarfile.rst:1166 +msgid "Filter errors" +msgstr "过滤器错误" + +#: ../../library/tarfile.rst:1168 +msgid "" +"When a filter refuses to extract a file, it will raise an appropriate " +"exception, a subclass of :class:`~tarfile.FilterError`. This will abort the " +"extraction if :attr:`TarFile.errorlevel` is 1 or more. With ``errorlevel=0``" +" the error will be logged and the member will be skipped, but extraction " +"will continue." +msgstr "" +"当过滤器拒绝提取文件时,它将引发一个适当的异常,即 :class:`~tarfile.FilterError` 的子类。如果 " +":attr:`TarFile.errorlevel` 为 1 或更大的值则提取将中止。如果 ``errorlevel=0`` " +"则会记录错误并跳过该成员,但提取仍会继续。" + +#: ../../library/tarfile.rst:1178 +msgid "Hints for further verification" +msgstr "进一步核验的提示" + +#: ../../library/tarfile.rst:1180 +msgid "" +"Even with ``filter='data'``, *tarfile* is not suited for extracting " +"untrusted files without prior inspection. Among other issues, the pre-" +"defined filters do not prevent denial-of-service attacks. Users should do " +"additional checks." +msgstr "" +"即使 ``filter='data'``,*tarfile* 也不适合在没有事先检查的情况下提取不受信任的文件。 " +"除其他问题外,预定义的过滤器不能防止拒绝服务攻击。用户应当进行额外的检查。" + +#: ../../library/tarfile.rst:1185 +msgid "Here is an incomplete list of things to consider:" +msgstr "以下是一份不完整的考虑事项列表:" + +#: ../../library/tarfile.rst:1187 +msgid "" +"Extract to a :func:`new temporary directory ` to prevent " +"e.g. exploiting pre-existing links, and to make it easier to clean up after " +"a failed extraction." +msgstr "提取到 :func:`新的临时目录 ` 以避免滥用已存在的链接等问题,并使得提取失败后更容易清理。" + +#: ../../library/tarfile.rst:1190 +msgid "Disallow symbolic links if you do not need the functionality." +msgstr "如果你不需要此功能则请禁用符号链接。" + +#: ../../library/tarfile.rst:1191 +msgid "" +"When working with untrusted data, use external (e.g. OS-level) limits on " +"disk, memory and CPU usage." +msgstr "在处理不受信任的数据时,使用外部(例如操作系统层级)的磁盘、内存和 CPU 使用限制。" + +#: ../../library/tarfile.rst:1193 +msgid "" +"Check filenames against an allow-list of characters (to filter out control " +"characters, confusables, foreign path separators, and so on)." +msgstr "根据允许字符列表检查文件名(以过滤掉控制字符、易混淆字符、外来路径分隔符等等)。" + +#: ../../library/tarfile.rst:1196 +msgid "" +"Check that filenames have expected extensions (discouraging files that " +"execute when you “click on them”, or extension-less files like Windows " +"special device names)." +msgstr "检查文件名是否有预期的扩展名(不鼓励使用在“点击”时会被执行的文件,或像 Windows 特殊设备名称这样没有扩展名的文件)。" + +#: ../../library/tarfile.rst:1199 +msgid "" +"Limit the number of extracted files, total size of extracted data, filename " +"length (including symlink length), and size of individual files." +msgstr "限制提取文件的数量、提取数据的总大小、文件名长度(包括符号链接长度)以及单个文件的大小。" + +#: ../../library/tarfile.rst:1201 +msgid "" +"Check for files that would be shadowed on case-insensitive filesystems." +msgstr "检查在不区分大小写的文件系统上会被屏蔽的文件。" + +#: ../../library/tarfile.rst:1203 +msgid "Also note that:" +msgstr "还需要注意:" + +#: ../../library/tarfile.rst:1205 +msgid "" +"Tar files may contain multiple versions of the same file. Later ones are " +"expected to overwrite any earlier ones. This feature is crucial to allow " +"updating tape archives, but can be abused maliciously." +msgstr "Tar 文件可能包含同一文件的多个版本。较晚的版本会覆盖任何较早的版本。这一功能对于更新磁带归档来说至关重要,但也可能被恶意滥用。" + +#: ../../library/tarfile.rst:1209 +msgid "" +"*tarfile* does not protect against issues with “live” data, e.g. an attacker" +" tinkering with the destination (or source) directory while extraction (or " +"archiving) is in progress." +msgstr "*tarfile* 无法为“实时”数据的问题提供保护,例如在提取(或归档)过程中攻击者对目标(或源)目录进行了改动。" + +#: ../../library/tarfile.rst:1215 +msgid "Supporting older Python versions" +msgstr "支持较早的 Python 版本" + +#: ../../library/tarfile.rst:1217 +msgid "" +"Extraction filters were added to Python 3.12, but may be backported to older" +" versions as security updates. To check whether the feature is available, " +"use e.g. ``hasattr(tarfile, 'data_filter')`` rather than checking the Python" +" version." +msgstr "" +"提取过滤器是在 Python 3.12 中增加的,但可能会作为安全更新向下移植到较老的版本。要检查该特性是否可用,请使用 " +"``hasattr(tarfile, 'data_filter')`` 而不是检查 Python 版本。" + +#: ../../library/tarfile.rst:1222 +msgid "" +"The following examples show how to support Python versions with and without " +"the feature. Note that setting ``extraction_filter`` will affect any " +"subsequent operations." +msgstr "" +"下面的例子演示了如何支持带有和没有该功能的 Python 版本。请注意设置 ``extraction_filter`` 会影响任何后续的操作。" + +#: ../../library/tarfile.rst:1226 +msgid "Fully trusted archive::" +msgstr "完全受信任的归档::" + +#: ../../library/tarfile.rst:1228 +msgid "" +"my_tarfile.extraction_filter = (lambda member, path: member)\n" +"my_tarfile.extractall()" +msgstr "" +"my_tarfile.extraction_filter = (lambda member, path: member)\n" +"my_tarfile.extractall()" + +#: ../../library/tarfile.rst:1231 +msgid "" +"Use the ``'data'`` filter if available, but revert to Python 3.11 behavior " +"(``'fully_trusted'``) if this feature is not available::" +msgstr "" +"如果可用则使用 ``'data'`` 过滤器;如果此特性不可用,则恢复为 Python 3.11 的行为 (``'fully_trusted'``)::" + +#: ../../library/tarfile.rst:1234 +msgid "" +"my_tarfile.extraction_filter = getattr(tarfile, 'data_filter',\n" +" (lambda member, path: member))\n" +"my_tarfile.extractall()" +msgstr "" +"my_tarfile.extraction_filter = getattr(tarfile, 'data_filter',\n" +" (lambda member, path: member))\n" +"my_tarfile.extractall()" + +#: ../../library/tarfile.rst:1238 +msgid "Use the ``'data'`` filter; *fail* if it is not available::" +msgstr "使用 ``'data'`` 过滤器;如果不可用则 *失败*::" + +#: ../../library/tarfile.rst:1240 +msgid "my_tarfile.extractall(filter=tarfile.data_filter)" +msgstr "my_tarfile.extractall(filter=tarfile.data_filter)" + +#: ../../library/tarfile.rst:1242 +msgid "or::" +msgstr "或者::" + +#: ../../library/tarfile.rst:1244 +msgid "" +"my_tarfile.extraction_filter = tarfile.data_filter\n" +"my_tarfile.extractall()" +msgstr "" +"my_tarfile.extraction_filter = tarfile.data_filter\n" +"my_tarfile.extractall()" + +#: ../../library/tarfile.rst:1247 +msgid "Use the ``'data'`` filter; *warn* if it is not available::" +msgstr "使用 ``'data'`` 过滤器;如果不可用则 *警告*::" + +#: ../../library/tarfile.rst:1249 +msgid "" +"if hasattr(tarfile, 'data_filter'):\n" +" my_tarfile.extractall(filter='data')\n" +"else:\n" +" # remove this when no longer needed\n" +" warn_the_user('Extracting may be unsafe; consider updating Python')\n" +" my_tarfile.extractall()" +msgstr "" +"if hasattr(tarfile, 'data_filter'):\n" +" my_tarfile.extractall(filter='data')\n" +"else:\n" +" # 当不再需要时移除这个\n" +" warn_the_user('Extracting may be unsafe; consider updating Python')\n" +" my_tarfile.extractall()" + +#: ../../library/tarfile.rst:1258 +msgid "Stateful extraction filter example" +msgstr "有状态的提取过滤器示例" + +#: ../../library/tarfile.rst:1260 +msgid "" +"While *tarfile*'s extraction methods take a simple *filter* callable, custom" +" filters may be more complex objects with an internal state. It may be " +"useful to write these as context managers, to be used like this::" +msgstr "" +"*tarfile* 的提取方法接受一个简单的 *filter* 可调用对象,而自定义过滤器则可以是具有内部状态的更复杂对象。 " +"将其写成上下文管理器可能会很有用处,即以这样的方式使用::" + +#: ../../library/tarfile.rst:1264 +msgid "" +"with StatefulFilter() as filter_func:\n" +" tar.extractall(path, filter=filter_func)" +msgstr "" +"with StatefulFilter() as filter_func:\n" +" tar.extractall(path, filter=filter_func)" + +#: ../../library/tarfile.rst:1267 +msgid "Such a filter can be written as, for example::" +msgstr "例如,这种过滤器可以写成::" + +#: ../../library/tarfile.rst:1269 +msgid "" +"class StatefulFilter:\n" +" def __init__(self):\n" +" self.file_count = 0\n" +"\n" +" def __enter__(self):\n" +" return self\n" +"\n" +" def __call__(self, member, path):\n" +" self.file_count += 1\n" +" return member\n" +"\n" +" def __exit__(self, *exc_info):\n" +" print(f'{self.file_count} files extracted')" +msgstr "" +"class StatefulFilter:\n" +" def __init__(self):\n" +" self.file_count = 0\n" +"\n" +" def __enter__(self):\n" +" return self\n" +"\n" +" def __call__(self, member, path):\n" +" self.file_count += 1\n" +" return member\n" +"\n" +" def __exit__(self, *exc_info):\n" +" print(f'{self.file_count} files extracted')" + +#: ../../library/tarfile.rst:1289 +msgid "Command-Line Interface" +msgstr "命令行接口" + +#: ../../library/tarfile.rst:1293 +msgid "" +"The :mod:`!tarfile` module provides a simple command-line interface to " +"interact with tar archives." +msgstr "" + +#: ../../library/tarfile.rst:1296 +msgid "" +"If you want to create a new tar archive, specify its name after the " +":option:`-c` option and then list the filename(s) that should be included:" +msgstr "如果你想要创建一个新的 tar 归档,请在 :option:`-c` 选项后指定其名称然后列出应当被包含的文件名:" + +#: ../../library/tarfile.rst:1299 +msgid "$ python -m tarfile -c monty.tar spam.txt eggs.txt" +msgstr "$ python -m tarfile -c monty.tar spam.txt eggs.txt" + +#: ../../library/tarfile.rst:1303 +msgid "Passing a directory is also acceptable:" +msgstr "传入一个目录也是可接受的:" + +#: ../../library/tarfile.rst:1305 +msgid "$ python -m tarfile -c monty.tar life-of-brian_1979/" +msgstr "$ python -m tarfile -c monty.tar life-of-brian_1979/" + +#: ../../library/tarfile.rst:1309 +msgid "" +"If you want to extract a tar archive into the current directory, use the " +":option:`-e` option:" +msgstr "如果你想要将一个 tar 归档提取到当前目录,请使用 :option:`-e` 选项:" + +#: ../../library/tarfile.rst:1312 +msgid "$ python -m tarfile -e monty.tar" +msgstr "$ python -m tarfile -e monty.tar" + +#: ../../library/tarfile.rst:1316 +msgid "" +"You can also extract a tar archive into a different directory by passing the" +" directory's name:" +msgstr "你也可以通过传入目录名称将一个 tar 归档提取到不同的目录:" + +#: ../../library/tarfile.rst:1319 +msgid "$ python -m tarfile -e monty.tar other-dir/" +msgstr "$ python -m tarfile -e monty.tar other-dir/" + +#: ../../library/tarfile.rst:1323 +msgid "For a list of the files in a tar archive, use the :option:`-l` option:" +msgstr "要获取一个 tar 归档中文件的列表,请使用 :option:`-l` 选项:" + +#: ../../library/tarfile.rst:1325 +msgid "$ python -m tarfile -l monty.tar" +msgstr "$ python -m tarfile -l monty.tar" + +#: ../../library/tarfile.rst:1331 +msgid "Command-line options" +msgstr "命令行选项" + +#: ../../library/tarfile.rst:1336 +msgid "List files in a tarfile." +msgstr "列出一个 tarfile 中的文件名。" + +#: ../../library/tarfile.rst:1341 +msgid "Create tarfile from source files." +msgstr "基于源文件创建 tarfile。" + +#: ../../library/tarfile.rst:1346 +msgid "" +"Extract tarfile into the current directory if *output_dir* is not specified." +msgstr "如果未指定 *output_dir* 则会将 tarfile 提取到当前目录。" + +#: ../../library/tarfile.rst:1351 +msgid "Test whether the tarfile is valid or not." +msgstr "检测 tarfile 是否有效。" + +#: ../../library/tarfile.rst:1355 +msgid "Verbose output." +msgstr "更详细地输出结果。" + +#: ../../library/tarfile.rst:1359 +msgid "" +"Specifies the *filter* for ``--extract``. See :ref:`tarfile-extraction-" +"filter` for details. Only string names are accepted (that is, " +"``fully_trusted``, ``tar``, and ``data``)." +msgstr "" +"为 ``--extract`` 指定 *filter*。详情参见 :ref:`tarfile-extraction-filter`。只接受字符串名称 " +"(包括 ``fully_trusted``, ``tar`` 和 ``data``)。" + +#: ../../library/tarfile.rst:1367 +msgid "Examples" +msgstr "例子" + +#: ../../library/tarfile.rst:1370 +msgid "Reading examples" +msgstr "读取示例" + +#: ../../library/tarfile.rst:1372 +msgid "" +"How to extract an entire tar archive to the current working directory::" +msgstr "如何将整个 tar 归档提取到当前工作目录::" + +#: ../../library/tarfile.rst:1374 +msgid "" +"import tarfile\n" +"tar = tarfile.open(\"sample.tar.gz\")\n" +"tar.extractall(filter='data')\n" +"tar.close()" +msgstr "" +"import tarfile\n" +"tar = tarfile.open(\"sample.tar.gz\")\n" +"tar.extractall(filter='data')\n" +"tar.close()" + +#: ../../library/tarfile.rst:1379 +msgid "" +"How to extract a subset of a tar archive with :meth:`TarFile.extractall` " +"using a generator function instead of a list::" +msgstr "如何通过 :meth:`TarFile.extractall` 使用生成器函数而非列表来提取一个 tar 归档的子集::" + +#: ../../library/tarfile.rst:1382 +msgid "" +"import os\n" +"import tarfile\n" +"\n" +"def py_files(members):\n" +" for tarinfo in members:\n" +" if os.path.splitext(tarinfo.name)[1] == \".py\":\n" +" yield tarinfo\n" +"\n" +"tar = tarfile.open(\"sample.tar.gz\")\n" +"tar.extractall(members=py_files(tar))\n" +"tar.close()" +msgstr "" +"import os\n" +"import tarfile\n" +"\n" +"def py_files(members):\n" +" for tarinfo in members:\n" +" if os.path.splitext(tarinfo.name)[1] == \".py\":\n" +" yield tarinfo\n" +"\n" +"tar = tarfile.open(\"sample.tar.gz\")\n" +"tar.extractall(members=py_files(tar))\n" +"tar.close()" + +#: ../../library/tarfile.rst:1394 +msgid "" +"How to read a gzip compressed tar archive and display some member " +"information::" +msgstr "如何读取一个 gzip 压缩的 tar 归档并显示一些成员信息::" + +#: ../../library/tarfile.rst:1396 +msgid "" +"import tarfile\n" +"tar = tarfile.open(\"sample.tar.gz\", \"r:gz\")\n" +"for tarinfo in tar:\n" +" print(tarinfo.name, \"is\", tarinfo.size, \"bytes in size and is \", end=\"\")\n" +" if tarinfo.isreg():\n" +" print(\"a regular file.\")\n" +" elif tarinfo.isdir():\n" +" print(\"a directory.\")\n" +" else:\n" +" print(\"something else.\")\n" +"tar.close()" +msgstr "" +"import tarfile\n" +"tar = tarfile.open(\"sample.tar.gz\", \"r:gz\")\n" +"for tarinfo in tar:\n" +" print(tarinfo.name, \"is\", tarinfo.size, \"bytes in size and is \", end=\"\")\n" +" if tarinfo.isreg():\n" +" print(\"a regular file.\")\n" +" elif tarinfo.isdir():\n" +" print(\"a directory.\")\n" +" else:\n" +" print(\"something else.\")\n" +"tar.close()" + +#: ../../library/tarfile.rst:1409 +msgid "Writing examples" +msgstr "写入示例" + +#: ../../library/tarfile.rst:1411 +msgid "How to create an uncompressed tar archive from a list of filenames::" +msgstr "如何基于一个文件名列表创建未压缩的 tar 归档::" + +#: ../../library/tarfile.rst:1413 +msgid "" +"import tarfile\n" +"tar = tarfile.open(\"sample.tar\", \"w\")\n" +"for name in [\"foo\", \"bar\", \"quux\"]:\n" +" tar.add(name)\n" +"tar.close()" +msgstr "" +"import tarfile\n" +"tar = tarfile.open(\"sample.tar\", \"w\")\n" +"for name in [\"foo\", \"bar\", \"quux\"]:\n" +" tar.add(name)\n" +"tar.close()" + +#: ../../library/tarfile.rst:1419 +msgid "The same example using the :keyword:`with` statement::" +msgstr "使用 :keyword:`with` 语句的同一个示例::" + +#: ../../library/tarfile.rst:1421 +msgid "" +"import tarfile\n" +"with tarfile.open(\"sample.tar\", \"w\") as tar:\n" +" for name in [\"foo\", \"bar\", \"quux\"]:\n" +" tar.add(name)" +msgstr "" +"import tarfile\n" +"with tarfile.open(\"sample.tar\", \"w\") as tar:\n" +" for name in [\"foo\", \"bar\", \"quux\"]:\n" +" tar.add(name)" + +#: ../../library/tarfile.rst:1426 +msgid "" +"How to create and write an archive to stdout using :data:`sys.stdout.buffer " +"` in the *fileobj* parameter in :meth:`TarFile.add`::" +msgstr "" +"如何使用 :data:`sys.stdout.buffer ` 作为 :meth:`TarFile.add` 方法中 " +"*fileobj* 形参的值,从而创建归档文件并将其写到标准输出::" + +#: ../../library/tarfile.rst:1430 +msgid "" +"import sys\n" +"import tarfile\n" +"with tarfile.open(\"sample.tar.gz\", \"w|gz\", fileobj=sys.stdout.buffer) as tar:\n" +" for name in [\"foo\", \"bar\", \"quux\"]:\n" +" tar.add(name)" +msgstr "" +"import sys\n" +"import tarfile\n" +"with tarfile.open(\"sample.tar.gz\", \"w|gz\", fileobj=sys.stdout.buffer) as tar:\n" +" for name in [\"foo\", \"bar\", \"quux\"]:\n" +" tar.add(name)" + +#: ../../library/tarfile.rst:1436 +msgid "" +"How to create an archive and reset the user information using the *filter* " +"parameter in :meth:`TarFile.add`::" +msgstr "如何创建一个归档并使用 :meth:`TarFile.add` 中的 *filter* 形参来重置用户信息::" + +#: ../../library/tarfile.rst:1439 +msgid "" +"import tarfile\n" +"def reset(tarinfo):\n" +" tarinfo.uid = tarinfo.gid = 0\n" +" tarinfo.uname = tarinfo.gname = \"root\"\n" +" return tarinfo\n" +"tar = tarfile.open(\"sample.tar.gz\", \"w:gz\")\n" +"tar.add(\"foo\", filter=reset)\n" +"tar.close()" +msgstr "" +"import tarfile\n" +"def reset(tarinfo):\n" +" tarinfo.uid = tarinfo.gid = 0\n" +" tarinfo.uname = tarinfo.gname = \"root\"\n" +" return tarinfo\n" +"tar = tarfile.open(\"sample.tar.gz\", \"w:gz\")\n" +"tar.add(\"foo\", filter=reset)\n" +"tar.close()" + +#: ../../library/tarfile.rst:1452 +msgid "Supported tar formats" +msgstr "受支持的 tar 格式" + +#: ../../library/tarfile.rst:1454 +msgid "" +"There are three tar formats that can be created with the :mod:`!tarfile` " +"module:" +msgstr "" + +#: ../../library/tarfile.rst:1456 +msgid "" +"The POSIX.1-1988 ustar format (:const:`USTAR_FORMAT`). It supports filenames" +" up to a length of at best 256 characters and linknames up to 100 " +"characters. The maximum file size is 8 GiB. This is an old and limited but " +"widely supported format." +msgstr "" +"POSIX.1-1988 ustar 格式 (:const:`USTAR_FORMAT`)。它支持最多 256 个字符的文件名长度和最多 100 " +"个字符的链接名长度。文件大小上限为 8 GiB。这是一种老旧但广受支持的格式。" + +#: ../../library/tarfile.rst:1461 +msgid "" +"The GNU tar format (:const:`GNU_FORMAT`). It supports long filenames and " +"linknames, files bigger than 8 GiB and sparse files. It is the de facto " +"standard on GNU/Linux systems. :mod:`!tarfile` fully supports the GNU tar " +"extensions for long names, sparse file support is read-only." +msgstr "" + +#: ../../library/tarfile.rst:1466 +msgid "" +"The POSIX.1-2001 pax format (:const:`PAX_FORMAT`). It is the most flexible " +"format with virtually no limits. It supports long filenames and linknames, " +"large files and stores pathnames in a portable way. Modern tar " +"implementations, including GNU tar, bsdtar/libarchive and star, fully " +"support extended *pax* features; some old or unmaintained libraries may not," +" but should treat *pax* archives as if they were in the universally " +"supported *ustar* format. It is the current default format for new archives." +msgstr "" +"POSIX.1-2001 pax 格式 (:const:`PAX_FORMAT`)。它是几乎无限制的最灵活格式。 " +"它支持长文件名和链接名,大文件以及使用可移植方式存储路径名。现代的 tar 实现,包括 GNU tar, bsdtar/libarchive 和 " +"star,都完全支持扩展的 *pax* 特性;某些老旧或不再维护的库可能不支持,但应当会将 *pax* 归档视为广受支持的 *ustar* 格式。 " +"它是当前新建归档的默认格式。" + +#: ../../library/tarfile.rst:1474 +msgid "" +"It extends the existing *ustar* format with extra headers for information " +"that cannot be stored otherwise. There are two flavours of pax headers: " +"Extended headers only affect the subsequent file header, global headers are " +"valid for the complete archive and affect all following files. All the data " +"in a pax header is encoded in *UTF-8* for portability reasons." +msgstr "" +"它扩展了现有的 *ustar* 格式,包括用于无法以其他方式存储的附加标头。存在两种形式的 pax " +"标头:扩展标头只影响后续的文件标头,全局标头则适用于完整归档并会影响所有后续的文件。为了便于移植,在 pax 标头中的所有数据均以 *UTF-8* " +"编码。" + +#: ../../library/tarfile.rst:1480 +msgid "" +"There are some more variants of the tar format which can be read, but not " +"created:" +msgstr "还有一些 tar 格式的其他变种,它们可以被读取但不能被创建:" + +#: ../../library/tarfile.rst:1483 +msgid "" +"The ancient V7 format. This is the first tar format from Unix Seventh " +"Edition, storing only regular files and directories. Names must not be " +"longer than 100 characters, there is no user/group name information. Some " +"archives have miscalculated header checksums in case of fields with non-" +"ASCII characters." +msgstr "" +"古老的 V7 格式。这是来自 Unix 第七版的第一个 tar 格式,它只存储常规文件和目录。名称长度不能超过 100 " +"个字符,并且没有用户/分组名信息。某些归档在带有非 ASCII 字符字段的情况下会产生计算错误的标头校验和。" + +#: ../../library/tarfile.rst:1488 +msgid "" +"The SunOS tar extended format. This format is a variant of the POSIX.1-2001 " +"pax format, but is not compatible." +msgstr "SunOS tar 扩展格式。此格式是 POSIX.1-2001 pax 格式的一个变种,但并不保持兼容。" + +#: ../../library/tarfile.rst:1494 +msgid "Unicode issues" +msgstr "Unicode 问题" + +#: ../../library/tarfile.rst:1496 +msgid "" +"The tar format was originally conceived to make backups on tape drives with " +"the main focus on preserving file system information. Nowadays tar archives " +"are commonly used for file distribution and exchanging archives over " +"networks. One problem of the original format (which is the basis of all " +"other formats) is that there is no concept of supporting different character" +" encodings. For example, an ordinary tar archive created on a *UTF-8* system" +" cannot be read correctly on a *Latin-1* system if it contains non-*ASCII* " +"characters. Textual metadata (like filenames, linknames, user/group names) " +"will appear damaged. Unfortunately, there is no way to autodetect the " +"encoding of an archive. The pax format was designed to solve this problem. " +"It stores non-ASCII metadata using the universal character encoding *UTF-8*." +msgstr "" +"最初 tar 格式被设计用来在磁带机上生成备份,主要关注于保存文件系统信息。现在 tar 归档通常用于文件分发和在网络上交换归档。 " +"最初格式(它是所有其他格式的基础)的一个问题是它没有支持不同字符编码格式的概念。例如,一个在 *UTF-8* 系统上创建的普通 tar 归档如果包含非 " +"*ASCII* 字符则将无法在 *Latin-1* 系统上被正确读取。文本元数据(例如文件名,链接名,用户/分组名)将变为损坏状态。 " +"不幸的是,没有什么办法能够自动检测一个归档的编码格式。pax 格式被设计用来解决这个问题。它使用通用字符编码格式 *UTF-8* 来存储非 ASCII " +"元数据。" + +#: ../../library/tarfile.rst:1508 +msgid "" +"The details of character conversion in :mod:`!tarfile` are controlled by the" +" *encoding* and *errors* keyword arguments of the :class:`TarFile` class." +msgstr "" + +#: ../../library/tarfile.rst:1511 +msgid "" +"*encoding* defines the character encoding to use for the metadata in the " +"archive. The default value is :func:`sys.getfilesystemencoding` or " +"``'ascii'`` as a fallback. Depending on whether the archive is read or " +"written, the metadata must be either decoded or encoded. If *encoding* is " +"not set appropriately, this conversion may fail." +msgstr "" +"*encoding* 定义了用于归档中元数据的字符编码格式。默认值为 :func:`sys.getfilesystemencoding` 或是回退选项 " +"``'ascii'``。根据归档是被读取还是被写入,元数据必须被解码或编码。如果没有正确设置 *encoding*,转换可能会失败。" + +#: ../../library/tarfile.rst:1517 +msgid "" +"The *errors* argument defines how characters are treated that cannot be " +"converted. Possible values are listed in section :ref:`error-handlers`. The " +"default scheme is ``'surrogateescape'`` which Python also uses for its file " +"system calls, see :ref:`os-filenames`." +msgstr "" +"*errors* 参数定义了不能被转换的字符将如何处理。可能的取值在 :ref:`error-handlers` 小节列出。默认方案为 " +"``'surrogateescape'``,它也被 Python 用于文件系统调用,参见 :ref:`os-filenames`。" + +#: ../../library/tarfile.rst:1522 +msgid "" +"For :const:`PAX_FORMAT` archives (the default), *encoding* is generally not " +"needed because all the metadata is stored using *UTF-8*. *encoding* is only " +"used in the rare cases when binary pax headers are decoded or when strings " +"with surrogate characters are stored." +msgstr "" +"对于 :const:`PAX_FORMAT` 归档(默认格式),*encoding* 通常是不必要的,因为所有元数据都使用 *UTF-8* 来存储。 " +"*encoding* 仅在解码二进制 pax 标头或存储带有替代字符的字符串等少数场景下会被使用。" diff --git a/library/telnetlib.po b/library/telnetlib.po new file mode 100644 index 0000000000..2283719b1b --- /dev/null +++ b/library/telnetlib.po @@ -0,0 +1,52 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/telnetlib.rst:2 +msgid ":mod:`!telnetlib` --- Telnet client" +msgstr ":mod:`!telnetlib` --- Telnet 客户端" + +#: ../../library/telnetlib.rst:10 +msgid "" +"This module is no longer part of the Python standard library. It was " +":ref:`removed in Python 3.13 ` after being deprecated in" +" Python 3.11. The removal was decided in :pep:`594`." +msgstr "" +"此模块已不再是 Python 标准库的一部分。它在 Python 3.11 中被弃用后又在 :ref:`Python 3.13 中被移除 " +"`。移除计划是在 :pep:`594` 确定的。" + +#: ../../library/telnetlib.rst:14 +msgid "" +"Possible replacements are third-party libraries from PyPI: " +":pypi:`telnetlib3` or :pypi:`Exscript`. These are not supported or " +"maintained by the Python core team." +msgstr "" +"可用的替代有来自 PyPI 的第三方库::pypi:`telnetlib3` 或 :pypi:`Exscript`。它们不被 Python " +"核心团队所支持或维护。" + +#: ../../library/telnetlib.rst:18 +msgid "" +"The last version of Python that provided the :mod:`!telnetlib` module was " +"`Python 3.12 `_." +msgstr "" +"提供 :mod:`!telnetlib` 模块的最后一个 Python 版本是 `Python 3.12 " +"`_." diff --git a/library/tempfile.po b/library/tempfile.po new file mode 100644 index 0000000000..a3f12d2427 --- /dev/null +++ b/library/tempfile.po @@ -0,0 +1,777 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/tempfile.rst:2 +msgid ":mod:`!tempfile` --- Generate temporary files and directories" +msgstr ":mod:`!tempfile` --- 生成临时文件和目录" + +#: ../../library/tempfile.rst:9 +msgid "**Source code:** :source:`Lib/tempfile.py`" +msgstr "**源代码:** :source:`Lib/tempfile.py`" + +#: ../../library/tempfile.rst:17 +msgid "" +"This module creates temporary files and directories. It works on all " +"supported platforms. :class:`TemporaryFile`, :class:`NamedTemporaryFile`, " +":class:`TemporaryDirectory`, and :class:`SpooledTemporaryFile` are high-" +"level interfaces which provide automatic cleanup and can be used as " +":term:`context managers `. :func:`mkstemp` and " +":func:`mkdtemp` are lower-level functions which require manual cleanup." +msgstr "" +"该模块可以创建临时文件和目录。它适用于所有受支持的平台。 :class:`TemporaryFile`, " +":class:`NamedTemporaryFile`, :class:`TemporaryDirectory` 和 " +":class:`SpooledTemporaryFile` 是提供自动清理功能的高层级接口并可用作 :term:`上下文管理器 `。 :func:`mkstemp` 和 :func:`mkdtemp` 是需要执行手动清理的低层级函数。" + +#: ../../library/tempfile.rst:24 +msgid "" +"All the user-callable functions and constructors take additional arguments " +"which allow direct control over the location and name of temporary files and" +" directories. Files names used by this module include a string of random " +"characters which allows those files to be securely created in shared " +"temporary directories. To maintain backward compatibility, the argument " +"order is somewhat odd; it is recommended to use keyword arguments for " +"clarity." +msgstr "" +"所有由用户调用的函数和构造函数都带有参数,这些参数可以设置临时文件和临时目录的路径和名称。该模块生成的文件名包括一串随机字符,在公共的临时目录中,这些字符可以让创建文件更加安全。为了保持向后兼容性,参数的顺序有些奇怪。所以为了代码清晰,建议使用关键字参数。" + +#: ../../library/tempfile.rst:32 +msgid "The module defines the following user-callable items:" +msgstr "这个模块定义了以下内容供用户调用:" + +#: ../../library/tempfile.rst:36 +msgid "" +"Return a :term:`file-like object` that can be used as a temporary storage " +"area. The file is created securely, using the same rules as :func:`mkstemp`." +" It will be destroyed as soon as it is closed (including an implicit close " +"when the object is garbage collected). Under Unix, the directory entry for " +"the file is either not created at all or is removed immediately after the " +"file is created. Other platforms do not support this; your code should not " +"rely on a temporary file created using this function having or not having a " +"visible name in the file system." +msgstr "" +"返回一个 :term:`file-like object` 作为临时存储区域。创建该文件使用了与 :func:`mkstemp` " +"相同的安全规则。它将在关闭后立即销毁(包括垃圾回收机制关闭该对象时)。在 Unix " +"下,该文件在目录中的条目根本不创建,或者创建文件后立即就被删除了,其他平台不支持此功能。您的代码不应依赖使用此功能创建的临时文件名称,因为它在文件系统中的名称可能是可见的,也可能是不可见的。" + +#: ../../library/tempfile.rst:44 +msgid "" +"The resulting object can be used as a :term:`context manager` (see " +":ref:`tempfile-examples`). On completion of the context or destruction of " +"the file object the temporary file will be removed from the filesystem." +msgstr "" +"结果对象可以用作 :term:`context manager` (参见 :ref:`tempfile-examples`)。 " +"上下文结束或文件对象销毁后会将临时文件从文件系统中移除。" + +#: ../../library/tempfile.rst:49 +msgid "" +"The *mode* parameter defaults to ``'w+b'`` so that the file created can be " +"read and written without being closed. Binary mode is used so that it " +"behaves consistently on all platforms without regard for the data that is " +"stored. *buffering*, *encoding*, *errors* and *newline* are interpreted as " +"for :func:`open`." +msgstr "" +"*mode* 参数默认值为 " +"``'w+b'``,所以创建的文件不用关闭,就可以读取或写入。因为用的是二进制模式,所以无论存的是什么数据,它在所有平台上都表现一致。*buffering*、*encoding*、*errors*" +" 和 *newline* 的含义与 :func:`open` 中的相同。" + +#: ../../library/tempfile.rst:55 +msgid "" +"The *dir*, *prefix* and *suffix* parameters have the same meaning and " +"defaults as with :func:`mkstemp`." +msgstr "参数 *dir*、*prefix* 和 *suffix* 的含义和默认值都与它们在 :func:`mkstemp` 中的相同。" + +#: ../../library/tempfile.rst:58 +msgid "" +"The returned object is a true file object on POSIX platforms. On other " +"platforms, it is a file-like object whose :attr:`!file` attribute is the " +"underlying true file object." +msgstr "" +"在 POSIX 平台上,它返回的对象是真实的文件对象。在其他平台上,它是一个文件型对象,它的 :attr:`!file` 属性是底层的真实文件对象。" + +#: ../../library/tempfile.rst:62 +msgid "" +"The :py:const:`os.O_TMPFILE` flag is used if it is available and works " +"(Linux-specific, requires Linux kernel 3.11 or later)." +msgstr "" +"在可用且有效时将使用 :py:const:`os.O_TMPFILE` 旗标(Linux 专属,需要 Linux 内核版本为 3.11 或更高)。" + +#: ../../library/tempfile.rst:65 +msgid "" +"On platforms that are neither Posix nor Cygwin, TemporaryFile is an alias " +"for NamedTemporaryFile." +msgstr "在 Posix 或 Cygwin 以外的平台上,TemporaryFile 是 NamedTemporaryFile 的别名。" + +#: ../../library/tempfile.rst:68 ../../library/tempfile.rst:137 +#: ../../library/tempfile.rst:265 +msgid "" +"Raises an :ref:`auditing event ` ``tempfile.mkstemp`` with " +"argument ``fullpath``." +msgstr "引发一个 :ref:`审计事件 ` ``tempfile.mkstemp`` 并附带参数 ``fullpath``。" + +#: ../../library/tempfile.rst:72 +msgid "The :py:const:`os.O_TMPFILE` flag is now used if available." +msgstr "在可以时现在将使用 :py:const:`os.O_TMPFILE` 旗标。" + +#: ../../library/tempfile.rst:74 ../../library/tempfile.rst:139 +#: ../../library/tempfile.rst:169 +msgid "Added *errors* parameter." +msgstr "添加了 *errors* 参数。" + +#: ../../library/tempfile.rst:80 +msgid "" +"This function operates exactly as :func:`TemporaryFile` does, except the " +"following differences:" +msgstr "此函数的操作与 :func:`TemporaryFile` 所做的完全相同,除了存在下列差异:" + +#: ../../library/tempfile.rst:83 +msgid "" +"This function returns a file that is guaranteed to have a visible name in " +"the file system." +msgstr "此函数将返回一个肯定具有在文件系统中的可见名称的文件。" + +#: ../../library/tempfile.rst:85 +msgid "" +"To manage the named file, it extends the parameters of :func:`TemporaryFile`" +" with *delete* and *delete_on_close* parameters that determine whether and " +"how the named file should be automatically deleted." +msgstr "" +"为管理指定名称的文件,它将为 :func:`TemporaryFile` 扩展 *delete* 和 *delete_on_close* " +"形参来确定指定名称的文件是否要被自动删除以及要如何执行删除。" + +#: ../../library/tempfile.rst:89 +msgid "" +"The returned object is always a :term:`file-like object` whose :attr:`!file`" +" attribute is the underlying true file object. This file-like object can be " +"used in a :keyword:`with` statement, just like a normal file. The name of " +"the temporary file can be retrieved from the :attr:`!name` attribute of the " +"returned file-like object. On Unix, unlike with the :func:`TemporaryFile`, " +"the directory entry does not get unlinked immediately after the file " +"creation." +msgstr "" +"返回的对象将总是一个 :term:`file-like object` 并且其 :attr:`!file` 属性为底层的实际文件对象。 " +"这个文件型对象可在 :keyword:`with` 语句中使用,就像普通的文件一样。该临时文件的文件名可从被返回的文件型对象的 " +":attr:`!name` 属性中提取。在 Unix 上,不同于 :func:`TemporaryFile`,其目录项不会在创建文件之后立即被取消链接。" + +#: ../../library/tempfile.rst:97 +msgid "" +"If *delete* is true (the default) and *delete_on_close* is true (the " +"default), the file is deleted as soon as it is closed. If *delete* is true " +"and *delete_on_close* is false, the file is deleted on context manager exit " +"only, or else when the :term:`file-like object` is finalized. Deletion is " +"not always guaranteed in this case (see :meth:`object.__del__`). If *delete*" +" is false, the value of *delete_on_close* is ignored." +msgstr "" +"如果 *delete* 为(默认的)真值且 *delete_on_close* 也为(默认的)真值,则文件将在关闭后立即被删除。如果 *delete* " +"为真值而 *delete_on_close* 为假值,则文件将在退出上下文管理器,或者当 :term:`file-like object` " +"被终结时才会被删除。在此情况下将不保证总是能删除文件(参见 :meth:`object.__del__` 文档)。如果 *delete* 为假值,则 " +"*delete_on_close* 的值将被忽略。" + +#: ../../library/tempfile.rst:104 +msgid "" +"Therefore to use the name of the temporary file to reopen the file after " +"closing it, either make sure not to delete the file upon closure (set the " +"*delete* parameter to be false) or, in case the temporary file is created in" +" a :keyword:`with` statement, set the *delete_on_close* parameter to be " +"false. The latter approach is recommended as it provides assistance in " +"automatic cleaning of the temporary file upon the context manager exit." +msgstr "" +"因此要使用该临时文件的名称在关闭文件之后重新打开它,那么注意在关闭时不要删除文件(将 *delete* 形参设为假值),或者如果该临时文件是在 " +":keyword:`with` 语句中创建的,则要将 *delete_on_close* 形参设为假值。 " +"更推荐后一种方式因为它在上下文管理器退出时提供了自动清理协助。" + +#: ../../library/tempfile.rst:111 +msgid "" +"Opening the temporary file again by its name while it is still open works as" +" follows:" +msgstr "临时文件仍然打开时使用其名称再次打开它的操作如下所示:" + +#: ../../library/tempfile.rst:114 +msgid "On POSIX the file can always be opened again." +msgstr "在 POSIX 上该文件总是可以被再次打开。" + +#: ../../library/tempfile.rst:115 +msgid "" +"On Windows, make sure that at least one of the following conditions are " +"fulfilled:" +msgstr "在 Windows 上,要确保至少满足下列条件之一:" + +#: ../../library/tempfile.rst:118 +msgid "*delete* is false" +msgstr "*delete* 为假值" + +#: ../../library/tempfile.rst:119 +msgid "" +"additional open shares delete access (e.g. by calling :func:`os.open` with " +"the flag ``O_TEMPORARY``)" +msgstr "额外的打开将共享删除操作(例如调用 :func:`os.open` 时附带了 ``O_TEMPORARY`` 旗标)" + +#: ../../library/tempfile.rst:121 +msgid "" +"*delete* is true but *delete_on_close* is false. Note, that in this case the" +" additional opens that do not share delete access (e.g. created via builtin " +":func:`open`) must be closed before exiting the context manager, else the " +":func:`os.unlink` call on context manager exit will fail with a " +":exc:`PermissionError`." +msgstr "" +"*delete* 为真值但 *delete_on_close* 为假值。注意,在此情况下没有共享删除操作的额外的打开(例如通过内置的 " +":func:`open` 创建)必须在退出上下文管理器之前被关闭,否则在退出上下文管理器时的 :func:`os.unlink` 调用将失败并引发 " +":exc:`PermissionError`." + +#: ../../library/tempfile.rst:127 +msgid "" +"On Windows, if *delete_on_close* is false, and the file is created in a " +"directory for which the user lacks delete access, then the :func:`os.unlink`" +" call on exit of the context manager will fail with a " +":exc:`PermissionError`. This cannot happen when *delete_on_close* is true " +"because delete access is requested by the open, which fails immediately if " +"the requested access is not granted." +msgstr "" +"在 Windows 上,如果 *delete_on_close* 为假值,并且文件是在用户没有删除权限的目录中创建的,则退出上下文管理器时的 " +":func:`os.unlink` 调用将失败并引发 :exc:`PermissionError`。这在 *delete_on_close* " +"为真值时不会发生因为删除权限是由打开操作所请求的,如果未获得所请求的权限此操作将立即失败。" + +#: ../../library/tempfile.rst:134 +msgid "" +"On POSIX (only), a process that is terminated abruptly with SIGKILL cannot " +"automatically delete any NamedTemporaryFiles it created." +msgstr "(只有)在 POSIX 上,一个用 SIGKILL 突然终止的进程无法自动删除它所创建的任何 NamedTemporaryFiles。" + +#: ../../library/tempfile.rst:142 +msgid "Added *delete_on_close* parameter." +msgstr "增加了 *delete_on_close* 形参。" + +#: ../../library/tempfile.rst:148 +msgid "" +"This class operates exactly as :func:`TemporaryFile` does, except that data " +"is spooled in memory until the file size exceeds *max_size*, or until the " +"file's :func:`~io.IOBase.fileno` method is called, at which point the " +"contents are written to disk and operation proceeds as with " +":func:`TemporaryFile`." +msgstr "" +"这个类执行的操作与 :func:`TemporaryFile` 完全相同,但会将数据放入内存池直到文件大小超过 *max_size*,或者直到文件的 " +":func:`~io.IOBase.fileno` 方法被调用,这时文件内容会被写入磁盘并如使用 :func:`TemporaryFile` " +"时一样执行后续操作。" + +#: ../../library/tempfile.rst:156 +msgid "" +"The resulting file has one additional method, :meth:`!rollover`, which " +"causes the file to roll over to an on-disk file regardless of its size." +msgstr "结果文件有一个额外的方法 :meth:`!rollover`,它可以忽略文件大小将其立即写入到磁盘文件。" + +#: ../../library/tempfile.rst:159 +msgid "" +"The returned object is a file-like object whose :attr:`!_file` attribute is " +"either an :class:`io.BytesIO` or :class:`io.TextIOWrapper` object (depending" +" on whether binary or text *mode* was specified) or a true file object, " +"depending on whether :meth:`rollover` has been called. This file-like " +"object can be used in a :keyword:`with` statement, just like a normal file." +msgstr "" +"返回的对象是一个文件型对象,它的 :attr:`!_file` 属性是 :class:`io.BytesIO` 或 " +":class:`io.TextIOWrapper` 对象(这取决于所指定的 *mode* 是二进制还是文本)或真实的文件对象,这取决于 " +":meth:`rollover` 是否已被调用。这个文件型对象可以像普通文件一样在 :keyword:`with` 语句中使用。" + +#: ../../library/tempfile.rst:166 +msgid "the truncate method now accepts a *size* argument." +msgstr "现在 truncate 方法可接受一个 *size* 参数。" + +#: ../../library/tempfile.rst:172 +msgid "" +"Fully implements the :class:`io.BufferedIOBase` and :class:`io.TextIOBase` " +"abstract base classes (depending on whether binary or text *mode* was " +"specified)." +msgstr "" +"完整实现 :class:`io.BufferedIOBase` 和 :class:`io.TextIOBase` 抽象基类(取决于二进制或文本 " +"*mode* 是否已指定)。" + +#: ../../library/tempfile.rst:180 +msgid "" +"This class securely creates a temporary directory using the same rules as " +":func:`mkdtemp`. The resulting object can be used as a :term:`context " +"manager` (see :ref:`tempfile-examples`). On completion of the context or " +"destruction of the temporary directory object, the newly created temporary " +"directory and all its contents are removed from the filesystem." +msgstr "" +"这个类会使用与 :func:`mkdtemp` 相同的规则安全地创建一个临时目录。结果对象可以被用作 :term:`context manager` " +"(参见 :ref:`tempfile-examples`)。在完成上下文或销毁临时目录对象时,新创建的临时目录及其所有内容会从文件系统中被移除。" + +#: ../../library/tempfile.rst:188 +msgid "" +"The directory name can be retrieved from the :attr:`!name` attribute of the " +"returned object. When the returned object is used as a :term:`context " +"manager`, the :attr:`!name` will be assigned to the target of the " +":keyword:`!as` clause in the :keyword:`with` statement, if there is one." +msgstr "" +"可以从所返回对象的 :attr:`!name` 属性中提取目录名称。当返回的对象被用作 :term:`context manager` 时,这个 " +":attr:`!name` 将被作为 :keyword:`with` 语句中 :keyword:`!as` 子句的目标,如果存在该子句的话。" + +#: ../../library/tempfile.rst:195 +msgid "" +"The directory can be explicitly cleaned up by calling the :meth:`!cleanup` " +"method. If *ignore_cleanup_errors* is true, any unhandled exceptions during " +"explicit or implicit cleanup (such as a :exc:`PermissionError` removing open" +" files on Windows) will be ignored, and the remaining removable items " +"deleted on a \"best-effort\" basis. Otherwise, errors will be raised in " +"whatever context cleanup occurs (the :meth:`!cleanup` call, exiting the " +"context manager, when the object is garbage-collected or during interpreter " +"shutdown)." +msgstr "" +"此目录可通过调用 :meth:`!cleanup` 方法来显式地清理。如果 *ignore_cleanup_errors* " +"为真值,则在显式或隐式清理(例如在 Windows 上 :exc:`PermissionError` " +"移除打开的文件)期间出现的未处理异常将被忽略,并且剩余的可移除条目会被“尽可能”地删除。在其他情况下,错误将在任何上下文清理发生时被引发(如 " +":meth:`!cleanup` 调用,退出上下文管理器、对象被作为垃圾回收或解释器关闭等情况)。" + +#: ../../library/tempfile.rst:204 +msgid "" +"The *delete* parameter can be used to disable cleanup of the directory tree " +"upon exiting the context. While it may seem unusual for a context manager " +"to disable the action taken when exiting the context, it can be useful " +"during debugging or when you need your cleanup behavior to be conditional " +"based on other logic." +msgstr "" +"*delete* 可被用于禁止在退出上下文时清理目录树。 " +"虽然在退出上下文时禁止此操作看起来可能很不常见,但这在进行调试或在你的清理行为需要以其他逻辑为条件时将会很有用处。" + +#: ../../library/tempfile.rst:210 ../../library/tempfile.rst:291 +msgid "" +"Raises an :ref:`auditing event ` ``tempfile.mkdtemp`` with " +"argument ``fullpath``." +msgstr "引发一个 :ref:`审计事件 ` ``tempfile.mkdtemp`` 并附带参数 ``fullpath``。" + +#: ../../library/tempfile.rst:214 +msgid "Added *ignore_cleanup_errors* parameter." +msgstr "添加了 *ignore_cleanup_errors* 形参。" + +#: ../../library/tempfile.rst:217 +msgid "Added the *delete* parameter." +msgstr "增加了 *delete* 形参。" + +#: ../../library/tempfile.rst:223 +msgid "" +"Creates a temporary file in the most secure manner possible. There are no " +"race conditions in the file's creation, assuming that the platform properly " +"implements the :const:`os.O_EXCL` flag for :func:`os.open`. The file is " +"readable and writable only by the creating user ID. If the platform uses " +"permission bits to indicate whether a file is executable, the file is " +"executable by no one." +msgstr "" +"以尽可能安全的方式创建一个临时文件。假设平台正确地为 :func:`os.open` 实现了 :const:`os.O_EXCL` " +"旗标,则文件的创建不会导致竞争条件。该文件只能由创建它的用户 ID 来读写。如果平台使用权限位来指明文件是否可执行,则文件对任何人均不可执行。" + +#: ../../library/tempfile.rst:230 +msgid "" +"The file descriptor is :ref:`not inherited by child processes " +"`." +msgstr "文件描述符 :ref:`不会被子进程继承 `。" + +#: ../../library/tempfile.rst:232 +msgid "" +"Unlike :func:`TemporaryFile`, the user of :func:`mkstemp` is responsible for" +" deleting the temporary file when done with it." +msgstr "与 :func:`TemporaryFile` 不同,:func:`mkstemp` 用户用完临时文件后需要自行将其删除。" + +#: ../../library/tempfile.rst:235 +msgid "" +"If *suffix* is not ``None``, the file name will end with that suffix, " +"otherwise there will be no suffix. :func:`mkstemp` does not put a dot " +"between the file name and the suffix; if you need one, put it at the " +"beginning of *suffix*." +msgstr "" +"如果 *suffix* 不是 ``None`` 则文件名将以该后缀结尾,是 ``None`` 则没有后缀。:func:`mkstemp` " +"不会在文件名和后缀之间加点,如果需要加一个点号,请将其放在 *suffix* 的开头。" + +#: ../../library/tempfile.rst:240 +msgid "" +"If *prefix* is not ``None``, the file name will begin with that prefix; " +"otherwise, a default prefix is used. The default is the return value of " +":func:`gettempprefix` or :func:`gettempprefixb`, as appropriate." +msgstr "" +"如果 *prefix* 不是 ``None``,则文件名将以该前缀开头,是 ``None`` 则使用默认前缀。默认前缀是 " +":func:`gettempprefix` 或 :func:`gettempprefixb` 函数的返回值(自动调用合适的函数)。" + +#: ../../library/tempfile.rst:244 +msgid "" +"If *dir* is not ``None``, the file will be created in that directory; " +"otherwise, a default directory is used. The default directory is chosen " +"from a platform-dependent list, but the user of the application can control " +"the directory location by setting the *TMPDIR*, *TEMP* or *TMP* environment " +"variables. There is thus no guarantee that the generated filename will have" +" any nice properties, such as not requiring quoting when passed to external " +"commands via ``os.popen()``." +msgstr "" +"如果 *dir* 不为 ``None``,则在指定的目录创建文件,是 ``None`` " +"则使用默认目录。默认目录是从一个列表中选择出来的,这个列表不同平台不一样,但是用户可以设置 *TMPDIR*、*TEMP* 或 *TMP* " +"环境变量来设置目录的位置。因此,不能保证生成的临时文件路径很规范,比如,通过 ``os.popen()`` 将路径传递给外部命令时仍需要加引号。" + +#: ../../library/tempfile.rst:252 +msgid "" +"If any of *suffix*, *prefix*, and *dir* are not ``None``, they must be the " +"same type. If they are bytes, the returned name will be bytes instead of " +"str. If you want to force a bytes return value with otherwise default " +"behavior, pass ``suffix=b''``." +msgstr "" +"如果 *suffix*、*prefix* 和 *dir* 中的任何一个不是 ``None``,就要保证它们是同一数据类型。如果它们是 " +"bytes,则返回的名称的类型就是 bytes 而不是 str。如果确实要用默认参数,但又想要返回值是 bytes 类型,请传入 " +"``suffix=b''``." + +#: ../../library/tempfile.rst:258 +msgid "" +"If *text* is specified and true, the file is opened in text mode. Otherwise," +" (the default) the file is opened in binary mode." +msgstr "如果指定了 *text* 且为真值,文件会以文本模式打开。否则,文件(默认)会以二进制模式打开。" + +#: ../../library/tempfile.rst:261 +msgid "" +":func:`mkstemp` returns a tuple containing an OS-level handle to an open " +"file (as would be returned by :func:`os.open`) and the absolute pathname of " +"that file, in that order." +msgstr "" +":func:`mkstemp` 返回一个元组,元组中第一个元素是句柄,它是一个系统级句柄,指向一个打开的文件(等同于 :func:`os.open` " +"的返回值),第二元素是该文件的绝对路径。" + +#: ../../library/tempfile.rst:267 ../../library/tempfile.rst:293 +msgid "" +"*suffix*, *prefix*, and *dir* may now be supplied in bytes in order to " +"obtain a bytes return value. Prior to this, only str was allowed. *suffix* " +"and *prefix* now accept and default to ``None`` to cause an appropriate " +"default value to be used." +msgstr "" +"现在,*suffix*、*prefix* 和 *dir* 可以以 bytes 类型按顺序提供,以获得 bytes 类型的返回值。之前只允许使用 " +"str。*suffix* 和 *prefix* 现在可以接受 ``None``,并且默认为 ``None`` 以使用合适的默认值。" + +#: ../../library/tempfile.rst:273 ../../library/tempfile.rst:299 +msgid "The *dir* parameter now accepts a :term:`path-like object`." +msgstr "*dir* 参数现在可接受一个路径类对象 (:term:`path-like object`)。" + +#: ../../library/tempfile.rst:279 +msgid "" +"Creates a temporary directory in the most secure manner possible. There are " +"no race conditions in the directory's creation. The directory is readable, " +"writable, and searchable only by the creating user ID." +msgstr "以最安全的方式创建一个临时目录,创建该目录时不会有竞争的情况。该目录只能由创建者读取、写入和搜索。" + +#: ../../library/tempfile.rst:283 +msgid "" +"The user of :func:`mkdtemp` is responsible for deleting the temporary " +"directory and its contents when done with it." +msgstr ":func:`mkdtemp` 用户用完临时目录后需要自行将其删除。" + +#: ../../library/tempfile.rst:286 +msgid "" +"The *prefix*, *suffix*, and *dir* arguments are the same as for " +":func:`mkstemp`." +msgstr "*prefix*、*suffix* 和 *dir* 的含义与它们在 :func:`mkstemp` 中的相同。" + +#: ../../library/tempfile.rst:289 +msgid ":func:`mkdtemp` returns the absolute pathname of the new directory." +msgstr ":func:`mkdtemp` 返回新目录的绝对路径。" + +#: ../../library/tempfile.rst:302 +msgid "" +":func:`mkdtemp` now always returns an absolute path, even if *dir* is " +"relative." +msgstr ":func:`mkdtemp` 现在将始终返回绝对路径,即使 *dir* 为相对路径。" + +#: ../../library/tempfile.rst:308 +msgid "" +"Return the name of the directory used for temporary files. This defines the " +"default value for the *dir* argument to all functions in this module." +msgstr "返回放置临时文件的目录的名称。这个方法的返回值就是本模块所有函数的 *dir* 参数的默认值。" + +#: ../../library/tempfile.rst:312 +msgid "" +"Python searches a standard list of directories to find one which the calling" +" user can create files in. The list is:" +msgstr "Python 搜索标准目录列表,以找到调用者可以在其中创建文件的目录。这个列表是:" + +#: ../../library/tempfile.rst:315 +msgid "The directory named by the :envvar:`TMPDIR` environment variable." +msgstr ":envvar:`TMPDIR` 环境变量指向的目录。" + +#: ../../library/tempfile.rst:317 +msgid "The directory named by the :envvar:`TEMP` environment variable." +msgstr ":envvar:`TEMP` 环境变量指向的目录。" + +#: ../../library/tempfile.rst:319 +msgid "The directory named by the :envvar:`TMP` environment variable." +msgstr ":envvar:`TMP` 环境变量指向的目录。" + +#: ../../library/tempfile.rst:321 +msgid "A platform-specific location:" +msgstr "与平台相关的位置:" + +#: ../../library/tempfile.rst:323 +msgid "" +"On Windows, the directories :file:`C:\\\\TEMP`, :file:`C:\\\\TMP`, " +":file:`\\\\TEMP`, and :file:`\\\\TMP`, in that order." +msgstr "" +"在 Windows 上,依次为 :file:`C:\\\\TEMP`、:file:`C:\\\\TMP`、:file:`\\\\TEMP` 和 " +":file:`\\\\TMP`." + +#: ../../library/tempfile.rst:326 +msgid "" +"On all other platforms, the directories :file:`/tmp`, :file:`/var/tmp`, and " +":file:`/usr/tmp`, in that order." +msgstr "在所有其他平台上,依次为 :file:`/tmp`、:file:`/var/tmp` 和 :file:`/usr/tmp`。" + +#: ../../library/tempfile.rst:329 +msgid "As a last resort, the current working directory." +msgstr "不得已时,使用当前工作目录。" + +#: ../../library/tempfile.rst:331 +msgid "" +"The result of this search is cached, see the description of :data:`tempdir` " +"below." +msgstr "搜索的结果会缓存起来,参见下面 :data:`tempdir` 的描述。" + +#: ../../library/tempfile.rst:336 +msgid "" +"Always returns a str. Previously it would return any :data:`tempdir` value " +"regardless of type so long as it was not ``None``." +msgstr "总是返回一个字符串。在之前的版本中它会返回任意 :data:`tempdir` 值而不考虑它的类型,只要它不为 ``None``。" + +#: ../../library/tempfile.rst:341 +msgid "Same as :func:`gettempdir` but the return value is in bytes." +msgstr "与 :func:`gettempdir` 相同,但返回值为字节类型。" + +#: ../../library/tempfile.rst:347 +msgid "" +"Return the filename prefix used to create temporary files. This does not " +"contain the directory component." +msgstr "返回用于创建临时文件的文件名前缀,它不包含目录部分。" + +#: ../../library/tempfile.rst:352 +msgid "Same as :func:`gettempprefix` but the return value is in bytes." +msgstr "与 :func:`gettempprefix` 相同,但返回值为字节类型。" + +#: ../../library/tempfile.rst:356 +msgid "" +"The module uses a global variable to store the name of the directory used " +"for temporary files returned by :func:`gettempdir`. It can be set directly " +"to override the selection process, but this is discouraged. All functions in" +" this module take a *dir* argument which can be used to specify the " +"directory. This is the recommended approach that does not surprise other " +"unsuspecting code by changing global API behavior." +msgstr "" +"本模块使用一个全局变量来存储由 :func:`gettempdir` 返回的临时文件使用的目录路径。它可被直接设置以覆盖选择过程,但不建议这样做。 " +"本模块中的所有函数都接受一个 *dir* 参数,它可被用于指定目录。这是不会通过改变全局 API 行为对其他无准备代码造成影响的推荐做法。" + +#: ../../library/tempfile.rst:365 +msgid "" +"When set to a value other than ``None``, this variable defines the default " +"value for the *dir* argument to the functions defined in this module, " +"including its type, bytes or str. It cannot be a :term:`path-like object`." +msgstr "" +"当设为 ``None`` 以外的值时,此变量会为本模块中定义的函数的 *dir* 参数定义默认值,包括确定其类型为字节串还是字符串。它不可以为 " +":term:`path-like object`." + +#: ../../library/tempfile.rst:370 +msgid "" +"If ``tempdir`` is ``None`` (the default) at any call to any of the above " +"functions except :func:`gettempprefix` it is initialized following the " +"algorithm described in :func:`gettempdir`." +msgstr "" +"如果在调用除 :func:`gettempprefix` 外的上述任何函数时 ``tempdir`` 为 ``None`` (默认值) 则它会按照 " +":func:`gettempdir` 中所描述的算法来初始化。" + +#: ../../library/tempfile.rst:376 +msgid "" +"Beware that if you set ``tempdir`` to a bytes value, there is a nasty side " +"effect: The global default return type of :func:`mkstemp` and " +":func:`mkdtemp` changes to bytes when no explicit ``prefix``, ``suffix``, or" +" ``dir`` arguments of type str are supplied. Please do not write code " +"expecting or depending on this. This awkward behavior is maintained for " +"compatibility with the historical implementation." +msgstr "" +"请注意如果你将 ``tempdir`` 设为字节串值,会有一个麻烦的副作用::func:`mkstemp` 和 :func:`mkdtemp` " +"的全局默认返回类型会在没有显式提供字符串类型的 ``prefix``、``suffix`` 或 ``dir`` 的时候被改为字节串。 " +"请不要编写预期或依赖于此行为的代码。这个笨拙行为是为了保持与历史实现的兼容性。" + +#: ../../library/tempfile.rst:387 +msgid "Examples" +msgstr "例子" + +#: ../../library/tempfile.rst:389 +msgid "" +"Here are some examples of typical usage of the :mod:`!tempfile` module::" +msgstr "以下是 :mod:`!tempfile` 模块的一些典型用法示例::" + +#: ../../library/tempfile.rst:391 +msgid "" +">>> import tempfile\n" +"\n" +"# create a temporary file and write some data to it\n" +">>> fp = tempfile.TemporaryFile()\n" +">>> fp.write(b'Hello world!')\n" +"# read data from file\n" +">>> fp.seek(0)\n" +">>> fp.read()\n" +"b'Hello world!'\n" +"# close the file, it will be removed\n" +">>> fp.close()\n" +"\n" +"# create a temporary file using a context manager\n" +">>> with tempfile.TemporaryFile() as fp:\n" +"... fp.write(b'Hello world!')\n" +"... fp.seek(0)\n" +"... fp.read()\n" +"b'Hello world!'\n" +">>>\n" +"# file is now closed and removed\n" +"\n" +"# create a temporary file using a context manager\n" +"# close the file, use the name to open the file again\n" +">>> with tempfile.NamedTemporaryFile(delete_on_close=False) as fp:\n" +"... fp.write(b'Hello world!')\n" +"... fp.close()\n" +"... # the file is closed, but not removed\n" +"... # open the file again by using its name\n" +"... with open(fp.name, mode='rb') as f:\n" +"... f.read()\n" +"b'Hello world!'\n" +">>>\n" +"# file is now removed\n" +"\n" +"# create a temporary directory using the context manager\n" +">>> with tempfile.TemporaryDirectory() as tmpdirname:\n" +"... print('created temporary directory', tmpdirname)\n" +">>>\n" +"# directory and contents have been removed" +msgstr "" +">>> import tempfile\n" +"\n" +"# 创建一个临时文件并向其写入一些数据\n" +">>> fp = tempfile.TemporaryFile()\n" +">>> fp.write(b'Hello world!')\n" +"# 从文件读取数据\n" +">>> fp.seek(0)\n" +">>> fp.read()\n" +"b'Hello world!'\n" +"# 关闭文件,它将被移除\n" +">>> fp.close()\n" +"\n" +"# 使用上下文管理器创建一个临时文件\n" +">>> with tempfile.TemporaryFile() as fp:\n" +"... fp.write(b'Hello world!')\n" +"... fp.seek(0)\n" +"... fp.read()\n" +"b'Hello world!'\n" +">>>\n" +"# 现在文件已被关闭并移除\n" +"\n" +"# 使用上下文管理器创建一个临时文件\n" +"# 关闭该文件,再使用文件名再次打开该文件\n" +">>> with tempfile.NamedTemporaryFile(delete_on_close=False) as fp:\n" +"... fp.write(b'Hello world!')\n" +"... fp.close()\n" +"... # 文件已被关闭,但未被移除\n" +"... # 使用文件名再次打开该文件\n" +"... with open(fp.name, mode='rb') as f:\n" +"... f.read()\n" +"b'Hello world!'\n" +">>>\n" +"# 现在文件已被移除\n" +"\n" +"# 使用上下文管理器创建一个临时目录\n" +">>> with tempfile.TemporaryDirectory() as tmpdirname:\n" +"... print('created temporary directory', tmpdirname)\n" +">>>\n" +"# 目录及其内容已被移除" + +#: ../../library/tempfile.rst:434 +msgid "Deprecated functions and variables" +msgstr "已弃用的函数和变量" + +#: ../../library/tempfile.rst:436 +msgid "" +"A historical way to create temporary files was to first generate a file name" +" with the :func:`mktemp` function and then create a file using this name. " +"Unfortunately this is not secure, because a different process may create a " +"file with this name in the time between the call to :func:`mktemp` and the " +"subsequent attempt to create the file by the first process. The solution is " +"to combine the two steps and create the file immediately. This approach is " +"used by :func:`mkstemp` and the other functions described above." +msgstr "" +"创建临时文件有一种历史方法,首先使用 :func:`mktemp` 函数生成一个文件名,然后使用该文件名创建文件。不幸的是,这是不安全的,因为在调用 " +":func:`mktemp` " +"与随后尝试创建文件的进程之间的时间里,其他进程可能会使用该名称创建文件。解决方案是将两个步骤结合起来,立即创建文件。这个方案目前被 " +":func:`mkstemp` 和上述其他函数所采用。" + +#: ../../library/tempfile.rst:447 +msgid "Use :func:`mkstemp` instead." +msgstr "使用 :func:`mkstemp` 来代替。" + +#: ../../library/tempfile.rst:450 +msgid "" +"Return an absolute pathname of a file that did not exist at the time the " +"call is made. The *prefix*, *suffix*, and *dir* arguments are similar to " +"those of :func:`mkstemp`, except that bytes file names, ``suffix=None`` and " +"``prefix=None`` are not supported." +msgstr "" +"返回一个绝对路径,这个路径指向的文件在调用本方法时不存在。*prefix*、*suffix* 和 *dir* 参数与 :func:`mkstemp` " +"中的同名参数类似,不同之处在于不支持字节类型的文件名,不支持 ``suffix=None`` 和 ``prefix=None``。" + +#: ../../library/tempfile.rst:457 +msgid "" +"Use of this function may introduce a security hole in your program. By the " +"time you get around to doing anything with the file name it returns, someone" +" else may have beaten you to the punch. :func:`mktemp` usage can be " +"replaced easily with :func:`NamedTemporaryFile`, passing it the " +"``delete=False`` parameter::" +msgstr "" +"使用此功能可能会在程序中引入安全漏洞。当你开始使用本方法返回的文件执行任何操作时,可能有人已经捷足先登了。:func:`mktemp` " +"的功能可以很轻松地用 :func:`NamedTemporaryFile` 代替,当然需要传递 ``delete=False`` 参数::" + +#: ../../library/tempfile.rst:463 +msgid "" +">>> f = NamedTemporaryFile(delete=False)\n" +">>> f.name\n" +"'/tmp/tmptjujjt'\n" +">>> f.write(b\"Hello World!\\n\")\n" +"13\n" +">>> f.close()\n" +">>> os.unlink(f.name)\n" +">>> os.path.exists(f.name)\n" +"False" +msgstr "" +">>> f = NamedTemporaryFile(delete=False)\n" +">>> f.name\n" +"'/tmp/tmptjujjt'\n" +">>> f.write(b\"Hello World!\\n\")\n" +"13\n" +">>> f.close()\n" +">>> os.unlink(f.name)\n" +">>> os.path.exists(f.name)\n" +"False" + +#: ../../library/tempfile.rst:11 +msgid "temporary" +msgstr "临时" + +#: ../../library/tempfile.rst:11 +msgid "file name" +msgstr "文件名" + +#: ../../library/tempfile.rst:11 +msgid "file" +msgstr "文件" diff --git a/library/termios.po b/library/termios.po new file mode 100644 index 0000000000..e3c555a2af --- /dev/null +++ b/library/termios.po @@ -0,0 +1,218 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/termios.rst:2 +msgid ":mod:`!termios` --- POSIX style tty control" +msgstr ":mod:`!termios` --- POSIX 风格的 tty 控制" + +#: ../../library/termios.rst:13 +msgid "" +"This module provides an interface to the POSIX calls for tty I/O control. " +"For a complete description of these calls, see :manpage:`termios(3)` Unix " +"manual page. It is only available for those Unix versions that support " +"POSIX *termios* style tty I/O control configured during installation." +msgstr "" +"此模块提供了针对 tty I/O 控制的 POSIX 调用的接口。有关此类调用的完整描述,请参阅 :manpage:`termios(3)` Unix " +"指南页。它仅在当安装时配置了支持 POSIX *termios* 风格的 tty I/O 控制的 Unix 版本上可用。" + +#: ../../library/termios.rst:18 +msgid "Availability" +msgstr "Availability" + +#: ../../library/termios.rst:20 +msgid "" +"All functions in this module take a file descriptor *fd* as their first " +"argument. This can be an integer file descriptor, such as returned by " +"``sys.stdin.fileno()``, or a :term:`file object`, such as ``sys.stdin`` " +"itself." +msgstr "" +"此模块中的所有函数均接受一个文件描述符 *fd* 作为第一个参数。这可以是一个整数形式的文件描述符,例如 ``sys.stdin.fileno()`` " +"所返回的对象,或是一个 :term:`file object`,例如 ``sys.stdin`` 本身。" + +#: ../../library/termios.rst:24 +msgid "" +"This module also defines all the constants needed to work with the functions" +" provided here; these have the same name as their counterparts in C. Please" +" refer to your system documentation for more information on using these " +"terminal control interfaces." +msgstr "" +"这个模块还定义了与此处所提供的函数一起使用的所有必要的常量;这些常量与它们在 C 中的对应常量同名。 " +"请参考你的系统文档了解有关如何使用这些终端控制接口的更多信息。" + +#: ../../library/termios.rst:29 +msgid "The module defines the following functions:" +msgstr "这个模块定义了以下函数:" + +#: ../../library/termios.rst:34 +msgid "" +"Return a list containing the tty attributes for file descriptor *fd*, as " +"follows: ``[iflag, oflag, cflag, lflag, ispeed, ospeed, cc]`` where *cc* is " +"a list of the tty special characters (each a string of length 1, except the " +"items with indices :const:`VMIN` and :const:`VTIME`, which are integers when" +" these fields are defined). The interpretation of the flags and the speeds " +"as well as the indexing in the *cc* array must be done using the symbolic " +"constants defined in the :mod:`!termios` module." +msgstr "" +"返回一个包含文件描述符 *fd* 的 tty 属性的列表,形式如下:``[iflag, oflag, cflag, lflag, ispeed, " +"ospeed, cc]`` 其中 *cc* 是一个包含 tty 特殊字符的列表(每项均为长度为 1 的字符串,但索引为 :const:`VMIN` 和 " +":const:`VTIME` 的项除外,当这些字段有定义时它们为整数)。对标志和速率的解读以及对 *cc* 数组的索引必须使用 " +":mod:`!termios` 模块中定义的符号常量来完成。" + +#: ../../library/termios.rst:45 +msgid "" +"Set the tty attributes for file descriptor *fd* from the *attributes*, which" +" is a list like the one returned by :func:`tcgetattr`. The *when* argument " +"determines when the attributes are changed:" +msgstr "" +"根据 *attributes* 为文件描述符 *fd* 设置 tty 的属性,它是一个类似于 :func:`tcgetattr` 的返回值的列表。 " +"*when* 参数决定这些属性在何时被更改:" + +#: ../../library/termios.rst:51 +msgid "Change attributes immediately." +msgstr "立即更改属性。" + +#: ../../library/termios.rst:55 +msgid "Change attributes after transmitting all queued output." +msgstr "传输完所有队列输出后再更改属性。" + +#: ../../library/termios.rst:59 +msgid "" +"Change attributes after transmitting all queued output and discarding all " +"queued input." +msgstr "传输完所有队列输出并丢弃所有队列输入后再更改属性。" + +#: ../../library/termios.rst:65 +msgid "" +"Send a break on file descriptor *fd*. A zero *duration* sends a break for " +"0.25--0.5 seconds; a nonzero *duration* has a system dependent meaning." +msgstr "" +"在文件描述符 *fd* 上发送一个中断。 *duration* 为零表示发送时长为 0.25--0.5 秒的中断;*duration* " +"非零值的含义取决于具体系统。" + +#: ../../library/termios.rst:71 +msgid "" +"Wait until all output written to file descriptor *fd* has been transmitted." +msgstr "进入等待状态直到写入文件描述符 *fd* 的所有输出都传送完毕。" + +#: ../../library/termios.rst:76 +msgid "" +"Discard queued data on file descriptor *fd*. The *queue* selector specifies" +" which queue: :const:`TCIFLUSH` for the input queue, :const:`TCOFLUSH` for " +"the output queue, or :const:`TCIOFLUSH` for both queues." +msgstr "" +"在文件描述符 *fd* 上丢弃队列数据。 *queue* 选择器指定哪个队列::const:`TCIFLUSH` " +"表示输入队列,:const:`TCOFLUSH` 表示输出队列,或 :const:`TCIOFLUSH` 表示两个队列同时。" + +#: ../../library/termios.rst:83 +msgid "" +"Suspend or resume input or output on file descriptor *fd*. The *action* " +"argument can be :const:`TCOOFF` to suspend output, :const:`TCOON` to restart" +" output, :const:`TCIOFF` to suspend input, or :const:`TCION` to restart " +"input." +msgstr "" +"在文件描述符 *fd* 上挂起或恢复输入或输出。 *action* 参数可以为 :const:`TCOOFF` " +"表示挂起输出,:const:`TCOON` 表示重启输出,:const:`TCIOFF` 表示挂起输入,或 :const:`TCION` 表示重启输入。" + +#: ../../library/termios.rst:90 +msgid "" +"Return a tuple ``(ws_row, ws_col)`` containing the tty window size for file " +"descriptor *fd*. Requires :const:`termios.TIOCGWINSZ` or " +":const:`termios.TIOCGSIZE`." +msgstr "" +"返回一个包含文件描述符 *fd* 的 tty 窗口大小的元组 ``(ws_row, ws_col)``。需要 " +":const:`termios.TIOCGWINSZ` 或 :const:`termios.TIOCGSIZE`。" + +#: ../../library/termios.rst:99 +msgid "" +"Set the tty window size for file descriptor *fd* from *winsize*, which is a " +"two-item tuple ``(ws_row, ws_col)`` like the one returned by " +":func:`tcgetwinsize`. Requires at least one of the pairs " +"(:const:`termios.TIOCGWINSZ`, :const:`termios.TIOCSWINSZ`); " +"(:const:`termios.TIOCGSIZE`, :const:`termios.TIOCSSIZE`) to be defined." +msgstr "" +"将文件描述符 *fd* 的 tty 窗口大小设置为 *winsize*,这是一个包含两项的元组 ``(ws_row, ws_col)``,如 " +":func:`tcgetwinsize` 所返回的一样。要求至少定义了 (:const:`termios.TIOCGWINSZ`, " +":const:`termios.TIOCSWINSZ`); (:const:`termios.TIOCGSIZE`, " +":const:`termios.TIOCSSIZE`) 对之一。" + +#: ../../library/termios.rst:110 +msgid "Module :mod:`tty`" +msgstr "模块 :mod:`tty`" + +#: ../../library/termios.rst:111 +msgid "Convenience functions for common terminal control operations." +msgstr "针对常用终端控制操作的便捷函数。" + +#: ../../library/termios.rst:117 +msgid "Example" +msgstr "示例" + +#: ../../library/termios.rst:119 +msgid "" +"Here's a function that prompts for a password with echoing turned off. Note" +" the technique using a separate :func:`tcgetattr` call and a :keyword:`try` " +"... :keyword:`finally` statement to ensure that the old tty attributes are " +"restored exactly no matter what happens::" +msgstr "" +"这个函数可提示输入密码并且关闭回显。请注意其采取的技巧是使用一个单独的 :func:`tcgetattr` 调用和一个 :keyword:`try` " +"... :keyword:`finally` 语句来确保旧的 tty 属性无论在何种情况下都会被原样恢复::" + +#: ../../library/termios.rst:124 +msgid "" +"def getpass(prompt=\"Password: \"):\n" +" import termios, sys\n" +" fd = sys.stdin.fileno()\n" +" old = termios.tcgetattr(fd)\n" +" new = termios.tcgetattr(fd)\n" +" new[3] = new[3] & ~termios.ECHO # lflags\n" +" try:\n" +" termios.tcsetattr(fd, termios.TCSADRAIN, new)\n" +" passwd = input(prompt)\n" +" finally:\n" +" termios.tcsetattr(fd, termios.TCSADRAIN, old)\n" +" return passwd" +msgstr "" +"def getpass(prompt=\"Password: \"):\n" +" import termios, sys\n" +" fd = sys.stdin.fileno()\n" +" old = termios.tcgetattr(fd)\n" +" new = termios.tcgetattr(fd)\n" +" new[3] = new[3] & ~termios.ECHO # lflags\n" +" try:\n" +" termios.tcsetattr(fd, termios.TCSADRAIN, new)\n" +" passwd = input(prompt)\n" +" finally:\n" +" termios.tcsetattr(fd, termios.TCSADRAIN, old)\n" +" return passwd" + +#: ../../library/termios.rst:7 +msgid "POSIX" +msgstr "POSIX" + +#: ../../library/termios.rst:7 +msgid "I/O control" +msgstr "I/O 控制" + +#: ../../library/termios.rst:7 +msgid "tty" +msgstr "tty" diff --git a/library/test.po b/library/test.po new file mode 100644 index 0000000000..7f2002aa8d --- /dev/null +++ b/library/test.po @@ -0,0 +1,2450 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/test.rst:2 +msgid ":mod:`!test` --- Regression tests package for Python" +msgstr ":mod:`!test` --- Python 回归测试包" + +#: ../../library/test.rst:10 +msgid "" +"The :mod:`!test` package is meant for internal use by Python only. It is " +"documented for the benefit of the core developers of Python. Any use of this" +" package outside of Python's standard library is discouraged as code " +"mentioned here can change or be removed without notice between releases of " +"Python." +msgstr "" +":mod:`!test` 包被设计为仅供 Python 内部使用。 将它写入文档是为了服务 Python 的核心开发者。 不建议在 Python " +"的标准库之外使用这个包因为这里涉及的代码可能在 Python 的不同发布版中被改变或移除而不预先通知。" + +#: ../../library/test.rst:18 +msgid "" +"The :mod:`!test` package contains all regression tests for Python as well as" +" the modules :mod:`test.support` and :mod:`test.regrtest`. " +":mod:`test.support` is used to enhance your tests while :mod:`test.regrtest`" +" drives the testing suite." +msgstr "" +"在 :mod:`!test` 包中包含所有针对 Python 的回归测试以及 :mod:`test.support` 和 " +":mod:`test.regrtest` 模块。 :mod:`test.support` 用于增强你的测试而 :mod:`test.regrtest` " +"用于驱动测试套件。" + +#: ../../library/test.rst:23 +msgid "" +"Each module in the :mod:`!test` package whose name starts with ``test_`` is " +"a testing suite for a specific module or feature. All new tests should be " +"written using the :mod:`unittest` or :mod:`doctest` module. Some older " +"tests are written using a \"traditional\" testing style that compares output" +" printed to ``sys.stdout``; this style of test is considered deprecated." +msgstr "" +":mod:`!test` 包中每个名字以 ``test_`` 开头的模块都是一个特定模块或功能的测试套件。 所有新的测试都应该使用 " +":mod:`unittest` 或 :mod:`doctest` 模块来编写。 一些较旧的测试是使用“传统”测试风格编写的,即比较打印到 " +"``sys.stdout`` 的输出;这种测试风格被视为已弃用。" + +#: ../../library/test.rst:32 +msgid "Module :mod:`unittest`" +msgstr "模块 :mod:`unittest`" + +#: ../../library/test.rst:33 +msgid "Writing PyUnit regression tests." +msgstr "编写 PyUnit 回归测试。" + +#: ../../library/test.rst:35 +msgid "Module :mod:`doctest`" +msgstr "模块 :mod:`doctest`" + +#: ../../library/test.rst:36 +msgid "Tests embedded in documentation strings." +msgstr "嵌入到文档字符串的测试。" + +#: ../../library/test.rst:42 +msgid "Writing Unit Tests for the :mod:`!test` package" +msgstr "为 :mod:`!test` 编写单元测试" + +#: ../../library/test.rst:44 +msgid "" +"It is preferred that tests that use the :mod:`unittest` module follow a few " +"guidelines. One is to name the test module by starting it with ``test_`` and" +" end it with the name of the module being tested. The test methods in the " +"test module should start with ``test_`` and end with a description of what " +"the method is testing. This is needed so that the methods are recognized by " +"the test driver as test methods. Also, no documentation string for the " +"method should be included. A comment (such as ``# Tests function returns " +"only True or False``) should be used to provide documentation for test " +"methods. This is done because documentation strings get printed out if they " +"exist and thus what test is being run is not stated." +msgstr "" +"使用 :mod:`unittest` 模块的测试最好是遵循一些准则。其中一条是测试模块的名称要以 ``test_`` 打头并以被测试模块的名称结尾。 " +"测试模块中的测试方法应当以 ``test_`` 打头并以该方法所测试的内容的说明结尾。这很有必要因为这样测试驱动程序就会将这些方法识别为测试方法。 " +"此外,该方法不应当包括任何文档字符串。应当使用注释 (例如 ``# Tests function returns only True or " +"False``) 来为测试方法提供文档说明。这样做是因为文档字符串如果存在则会被打印出来因此无法指明正在运行哪个测试。" + +#: ../../library/test.rst:55 +msgid "A basic boilerplate is often used::" +msgstr "有一个基本模板经常会被使用::" + +#: ../../library/test.rst:57 +msgid "" +"import unittest\n" +"from test import support\n" +"\n" +"class MyTestCase1(unittest.TestCase):\n" +"\n" +" # Only use setUp() and tearDown() if necessary\n" +"\n" +" def setUp(self):\n" +" ... code to execute in preparation for tests ...\n" +"\n" +" def tearDown(self):\n" +" ... code to execute to clean up after tests ...\n" +"\n" +" def test_feature_one(self):\n" +" # Test feature one.\n" +" ... testing code ...\n" +"\n" +" def test_feature_two(self):\n" +" # Test feature two.\n" +" ... testing code ...\n" +"\n" +" ... more test methods ...\n" +"\n" +"class MyTestCase2(unittest.TestCase):\n" +" ... same structure as MyTestCase1 ...\n" +"\n" +"... more test classes ...\n" +"\n" +"if __name__ == '__main__':\n" +" unittest.main()" +msgstr "" +"import unittest\n" +"from test import support\n" +"\n" +"class MyTestCase1(unittest.TestCase):\n" +"\n" +" # 仅在需要时使用 setUp() 和 tearDown()\n" +"\n" +" def setUp(self):\n" +" ... 为准备测试而执行的代码 ...\n" +"\n" +" def tearDown(self):\n" +" ... 为测试后的清理而执行的代码 ...\n" +"\n" +" def test_feature_one(self):\n" +" # 测试特性一。\n" +" ... 测试代码 ...\n" +"\n" +" def test_feature_two(self):\n" +" # 测试特性二。\n" +" ... 测试代码 ...\n" +"\n" +" ... 更多的测试方法 ...\n" +"\n" +"class MyTestCase2(unittest.TestCase):\n" +" ... 与 MyTestCase1 的结构相同 ...\n" +"\n" +"... 更多的测试类 ...\n" +"\n" +"if __name__ == '__main__':\n" +" unittest.main()" + +#: ../../library/test.rst:88 +msgid "" +"This code pattern allows the testing suite to be run by " +":mod:`test.regrtest`, on its own as a script that supports the " +":mod:`unittest` CLI, or via the ``python -m unittest`` CLI." +msgstr "" +"这种代码模式允许测试套件由 :mod:`test.regrtest` 运行,作为支持 :mod:`unittest` CLI 的脚本单独运行,或者通过 " +"``python -m unittest`` CLI 来运行。" + +#: ../../library/test.rst:92 +msgid "" +"The goal for regression testing is to try to break code. This leads to a few" +" guidelines to be followed:" +msgstr "回归测试的目标是尝试破坏代码。这引出了一些需要遵循的准则:" + +#: ../../library/test.rst:95 +msgid "" +"The testing suite should exercise all classes, functions, and constants. " +"This includes not just the external API that is to be presented to the " +"outside world but also \"private\" code." +msgstr "测试套件应当测试所有的类、函数和常量。这不仅包括要向外界展示的外部 API 也包括“私有”的代码。" + +#: ../../library/test.rst:99 +msgid "" +"Whitebox testing (examining the code being tested when the tests are being " +"written) is preferred. Blackbox testing (testing only the published user " +"interface) is not complete enough to make sure all boundary and edge cases " +"are tested." +msgstr "白盒测试(在编写测试时检查被测试的代码)是最推荐的。黑盒测试(只测试已发布的用户接口)因不够完整而不能确保所有边界和边缘情况都被测试到。" + +#: ../../library/test.rst:104 +msgid "" +"Make sure all possible values are tested including invalid ones. This makes " +"sure that not only all valid values are acceptable but also that improper " +"values are handled correctly." +msgstr "确保所有可能的值包括无效的值都被测试到。这能确保不仅全部的有效值都可被接受而且不适当的值也能被正确地处理。" + +#: ../../library/test.rst:108 +msgid "" +"Exhaust as many code paths as possible. Test where branching occurs and thus" +" tailor input to make sure as many different paths through the code are " +"taken." +msgstr "覆盖尽可能多的代码路径。测试发生分支的地方从而调整输入以确保通过代码采取尽可能多的不同路径。" + +#: ../../library/test.rst:111 +msgid "" +"Add an explicit test for any bugs discovered for the tested code. This will " +"make sure that the error does not crop up again if the code is changed in " +"the future." +msgstr "为受测试的代码所发现的任何代码缺陷添加明确的测试。这将确保如果代码在将来被改变错误也不会再次出现。" + +#: ../../library/test.rst:115 +msgid "" +"Make sure to clean up after your tests (such as close and remove all " +"temporary files)." +msgstr "确保在你的测试完成后执行清理(例如关闭并删除所有临时文件)。" + +#: ../../library/test.rst:118 +msgid "" +"If a test is dependent on a specific condition of the operating system then " +"verify the condition already exists before attempting the test." +msgstr "如果某个测试依赖于操作系统上的特定条件那么要在尝试测试之前先验证该条件是否已存在。" + +#: ../../library/test.rst:121 +msgid "" +"Import as few modules as possible and do it as soon as possible. This " +"minimizes external dependencies of tests and also minimizes possible " +"anomalous behavior from side-effects of importing a module." +msgstr "" +"尽可能少地导入模块并尽可能快地完成操作。这可以最大限度地减少测试的外部依赖性并且还可以最大限度地减少导入模块带来的附带影响所导致的异常行为。" + +#: ../../library/test.rst:125 +msgid "" +"Try to maximize code reuse. On occasion, tests will vary by something as " +"small as what type of input is used. Minimize code duplication by " +"subclassing a basic test class with a class that specifies the input::" +msgstr "" +"尝试最大限度地重用代码。在某些情况下,测试结果会因使用不同类型的输入这样的小细节而变化。 " +"可通过一个指定输入的类来子类化一个基本测试类来最大限度地减少重复代码::" + +#: ../../library/test.rst:129 +msgid "" +"class TestFuncAcceptsSequencesMixin:\n" +"\n" +" func = mySuperWhammyFunction\n" +"\n" +" def test_func(self):\n" +" self.func(self.arg)\n" +"\n" +"class AcceptLists(TestFuncAcceptsSequencesMixin, unittest.TestCase):\n" +" arg = [1, 2, 3]\n" +"\n" +"class AcceptStrings(TestFuncAcceptsSequencesMixin, unittest.TestCase):\n" +" arg = 'abc'\n" +"\n" +"class AcceptTuples(TestFuncAcceptsSequencesMixin, unittest.TestCase):\n" +" arg = (1, 2, 3)" +msgstr "" +"class TestFuncAcceptsSequencesMixin:\n" +"\n" +" func = mySuperWhammyFunction\n" +"\n" +" def test_func(self):\n" +" self.func(self.arg)\n" +"\n" +"class AcceptLists(TestFuncAcceptsSequencesMixin, unittest.TestCase):\n" +" arg = [1, 2, 3]\n" +"\n" +"class AcceptStrings(TestFuncAcceptsSequencesMixin, unittest.TestCase):\n" +" arg = 'abc'\n" +"\n" +"class AcceptTuples(TestFuncAcceptsSequencesMixin, unittest.TestCase):\n" +" arg = (1, 2, 3)" + +#: ../../library/test.rst:145 +msgid "" +"When using this pattern, remember that all classes that inherit from " +":class:`unittest.TestCase` are run as tests. The " +":class:`!TestFuncAcceptsSequencesMixin` class in the example above does not " +"have any data and so can't be run by itself, thus it does not inherit from " +":class:`unittest.TestCase`." +msgstr "" +"当使用这种模式时,请记住所有继承自 :class:`unittest.TestCase` 的类都会作为测试来运行。上面例子中的 " +":class:`!TestFuncAcceptsSequencesMixin` 类没有任何数据所以其本身是无法运行的,因此它不是继承自 " +":class:`unittest.TestCase`." + +#: ../../library/test.rst:153 +msgid "Test Driven Development" +msgstr "测试驱动的开发" + +#: ../../library/test.rst:154 +msgid "A book by Kent Beck on writing tests before code." +msgstr "Kent Beck 所著的阐述在实现代码之前编写测试的书。" + +#: ../../library/test.rst:160 +msgid "Running tests using the command-line interface" +msgstr "使用命令行界面运行测试" + +#: ../../library/test.rst:165 +msgid "" +"The :mod:`!test` package can be run as a script to drive Python's regression" +" test suite, thanks to the :option:`-m` option: :program:`python -m test`. " +"Under the hood, it uses :mod:`!test.regrtest`; the call :program:`python -m " +"test.regrtest` used in previous Python versions still works. Running the " +"script by itself automatically starts running all regression tests in the " +":mod:`!test` package. It does this by finding all modules in the package " +"whose name starts with ``test_``, importing them, and executing the function" +" :func:`test_main` if present or loading the tests via " +"unittest.TestLoader.loadTestsFromModule if ``test_main`` does not exist. " +"The names of tests to execute may also be passed to the script. Specifying a" +" single regression test (:program:`python -m test test_spam`) will minimize " +"output and only print whether the test passed or failed." +msgstr "" + +#: ../../library/test.rst:178 +msgid "" +"Running :mod:`!test` directly allows what resources are available for tests " +"to use to be set. You do this by using the ``-u`` command-line option. " +"Specifying ``all`` as the value for the ``-u`` option enables all possible " +"resources: :program:`python -m test -uall`. If all but one resource is " +"desired (a more common case), a comma-separated list of resources that are " +"not desired may be listed after ``all``. The command :program:`python -m " +"test -uall,-audio,-largefile` will run :mod:`!test` with all resources " +"except the ``audio`` and ``largefile`` resources. For a list of all " +"resources and more command-line options, run :program:`python -m test -h`." +msgstr "" + +#: ../../library/test.rst:189 +msgid "" +"Some other ways to execute the regression tests depend on what platform the " +"tests are being executed on. On Unix, you can run :program:`make test` at " +"the top-level directory where Python was built. On Windows, executing " +":program:`rt.bat` from your :file:`PCbuild` directory will run all " +"regression tests." +msgstr "" +"另外一些执行回归测试的方式依赖于执行测试所在的系统平台。在 Unix 上,你可以在构建 Python 的最高层级目录中运行 :program:`make" +" test`。在 Windows 上,在你的 :file:`PCbuild` 目录中执行 :program:`rt.bat` 将运行所有的回归测试。" + +#: ../../library/test.rst:195 +msgid "" +"Output is colorized by default and can be :ref:`controlled using environment" +" variables `." +msgstr "输出在默认情况下是彩色的并且可以 :ref:`使用环境变量控制 `。" + +#: ../../library/test.rst:201 +msgid ":mod:`!test.support` --- Utilities for the Python test suite" +msgstr ":mod:`!test.support` --- 针对 Python 测试套件的工具" + +#: ../../library/test.rst:207 +msgid "" +"The :mod:`!test.support` module provides support for Python's regression " +"test suite." +msgstr ":mod:`!test.support` 模块提供了对 Python 的回归测试套件的支持。" + +#: ../../library/test.rst:212 +msgid "" +":mod:`!test.support` is not a public module. It is documented here to help " +"Python developers write tests. The API of this module is subject to change " +"without backwards compatibility concerns between releases." +msgstr "" +":mod:`!test.support` 不是一个公用模块。 它被写入本文档是为了帮助 Python 开发者编写测试。 此模块的 API " +"可能被修改而不会考虑发布版之间的向下兼容性问题。" + +#: ../../library/test.rst:217 +msgid "This module defines the following exceptions:" +msgstr "此模块定义了以下异常:" + +#: ../../library/test.rst:221 +msgid "" +"Exception to be raised when a test fails. This is deprecated in favor of " +":mod:`unittest`\\ -based tests and :class:`unittest.TestCase`'s assertion " +"methods." +msgstr "" +"当一个测试失败时将被引发的异常。此异常已被弃用而应改用基于 :mod:`unittest` 的测试以及 " +":class:`unittest.TestCase` 的断言方法。" + +#: ../../library/test.rst:228 +msgid "" +"Subclass of :exc:`unittest.SkipTest`. Raised when a resource (such as a " +"network connection) is not available. Raised by the :func:`requires` " +"function." +msgstr "" +":exc:`unittest.SkipTest` 的子类。当一个资源(例如网络连接)不可用时将被引发。由 :func:`requires` 函数所引发。" + +#: ../../library/test.rst:233 +msgid "The :mod:`!test.support` module defines the following constants:" +msgstr ":mod:`!test.support` 模块定义了下列常量:" + +#: ../../library/test.rst:237 +msgid "" +"``True`` when verbose output is enabled. Should be checked when more " +"detailed information is desired about a running test. *verbose* is set by " +":mod:`test.regrtest`." +msgstr "" +"当启用详细输出时为 ``True``。当需要有关运行中的测试的更详细信息时应当被选择。 *verbose* 是由 " +":mod:`test.regrtest` 来设置的。" + +#: ../../library/test.rst:244 +msgid "``True`` if the running interpreter is Jython." +msgstr "如果所运行的解释器是 Jython 时为 ``True``。" + +#: ../../library/test.rst:249 +msgid "``True`` if ``sys.platform`` is ``android``." +msgstr "如果 ``sys.platform`` 是 ``android`` 则为 ``True``。" + +#: ../../library/test.rst:254 +msgid "``True`` if ``sys.platform`` is ``emscripten``." +msgstr "如果 ``sys.platform`` 是 ``emscripten`` 则为 ``True``。" + +#: ../../library/test.rst:259 +msgid "``True`` if ``sys.platform`` is ``wasi``." +msgstr "如果 ``sys.platform`` 是 ``wasi`` 则为 ``True``。" + +#: ../../library/test.rst:264 +msgid "``True`` if ``sys.platform`` is ``ios``, ``tvos``, or ``watchos``." +msgstr "如果 ``sys.platform`` 是 ``ios``, ``tvos`` 或 ``watchos`` 则为 ``True``。" + +#: ../../library/test.rst:269 +msgid "" +"``True`` if ``sys.platform`` is ``darwin`` or ``is_apple_mobile`` is " +"``True``." +msgstr "" +"如果 ``sys.platform`` 是 ``darwin`` 或者 ``is_apple_mobile`` 是 ``True`` 则为 " +"``True``." + +#: ../../library/test.rst:274 +msgid "Path for shell if not on Windows; otherwise ``None``." +msgstr "如果系统不是 Windows 时则为 shell 的路径;否则为 ``None``。" + +#: ../../library/test.rst:279 +msgid "" +"Timeout in seconds for tests using a network server listening on the network" +" local loopback interface like ``127.0.0.1``." +msgstr "使用网络服务器监听网络本地环回接口如 ``127.0.0.1`` 的测试的以秒为单位的超时值。" + +#: ../../library/test.rst:282 +msgid "" +"The timeout is long enough to prevent test failure: it takes into account " +"that the client and the server can run in different threads or even " +"different processes." +msgstr "该超时长到足以防止测试失败:它要考虑客户端和服务器可能会在不同线程甚至不同进程中运行。" + +#: ../../library/test.rst:286 +msgid "" +"The timeout should be long enough for :meth:`~socket.socket.connect`, " +":meth:`~socket.socket.recv` and :meth:`~socket.socket.send` methods of " +":class:`socket.socket`." +msgstr "" +"该超时应当对于 :class:`socket.socket` 的 :meth:`~socket.socket.connect`, " +":meth:`~socket.socket.recv` 和 :meth:`~socket.socket.send` 方法都足够长。" + +#: ../../library/test.rst:290 +msgid "Its default value is 5 seconds." +msgstr "其默认值为 5 秒。" + +#: ../../library/test.rst:292 +msgid "See also :data:`INTERNET_TIMEOUT`." +msgstr "参见 :data:`INTERNET_TIMEOUT`。" + +#: ../../library/test.rst:297 +msgid "Timeout in seconds for network requests going to the internet." +msgstr "发往互联网的网络请求的以秒为单位的超时值。" + +#: ../../library/test.rst:299 +msgid "" +"The timeout is short enough to prevent a test to wait for too long if the " +"internet request is blocked for whatever reason." +msgstr "该超时短到足以避免测试在互联网请求因任何原因被阻止时等待太久。" + +#: ../../library/test.rst:302 +msgid "" +"Usually, a timeout using :data:`INTERNET_TIMEOUT` should not mark a test as " +"failed, but skip the test instead: see " +":func:`~test.support.socket_helper.transient_internet`." +msgstr "" +"通常使用 :data:`INTERNET_TIMEOUT` 的超时不应该将测试标记为失败,而是跳过测试:参见 " +":func:`~test.support.socket_helper.transient_internet`." + +#: ../../library/test.rst:306 +msgid "Its default value is 1 minute." +msgstr "其默认值是 1 分钟。" + +#: ../../library/test.rst:308 +msgid "See also :data:`LOOPBACK_TIMEOUT`." +msgstr "参见 :data:`LOOPBACK_TIMEOUT`。" + +#: ../../library/test.rst:313 +msgid "" +"Timeout in seconds to mark a test as failed if the test takes \"too long\"." +msgstr "如果测试耗时“太长”而要将测试标记为失败的以秒为单位的超时值。" + +#: ../../library/test.rst:315 +msgid "" +"The timeout value depends on the regrtest ``--timeout`` command line option." +msgstr "该超时值取决于 regrtest ``--timeout`` 命令行选项。" + +#: ../../library/test.rst:317 +msgid "" +"If a test using :data:`SHORT_TIMEOUT` starts to fail randomly on slow " +"buildbots, use :data:`LONG_TIMEOUT` instead." +msgstr "" +"如果一个使用 :data:`SHORT_TIMEOUT` 的测试在慢速 buildbots 上开始随机失败,请使用 " +":data:`LONG_TIMEOUT` 来代替。" + +#: ../../library/test.rst:320 +msgid "Its default value is 30 seconds." +msgstr "其默认值为 30 秒。" + +#: ../../library/test.rst:325 +msgid "Timeout in seconds to detect when a test hangs." +msgstr "用于检测测试何时挂起的以秒为单位的超时值。" + +#: ../../library/test.rst:327 +msgid "" +"It is long enough to reduce the risk of test failure on the slowest Python " +"buildbots. It should not be used to mark a test as failed if the test takes " +"\"too long\". The timeout value depends on the regrtest ``--timeout`` " +"command line option." +msgstr "" +"它的长度足够在最慢的 Python buildbot 上降低测试失败的风险。如果测试耗时“过长”也不应当用它将该测试标记为失败。此超时值依赖于 " +"regrtest ``--timeout`` 命令行选项。" + +#: ../../library/test.rst:332 +msgid "Its default value is 5 minutes." +msgstr "其默认值为 5 分钟。" + +#: ../../library/test.rst:334 +msgid "" +"See also :data:`LOOPBACK_TIMEOUT`, :data:`INTERNET_TIMEOUT` and " +":data:`SHORT_TIMEOUT`." +msgstr "" +"另请参见 :data:`LOOPBACK_TIMEOUT`, :data:`INTERNET_TIMEOUT` 和 " +":data:`SHORT_TIMEOUT`." + +#: ../../library/test.rst:340 +msgid "Set when tests can be skipped when they are not useful for PGO." +msgstr "当测试对 PGO 没有用处时设置是否要跳过测试。" + +#: ../../library/test.rst:345 +msgid "" +"A constant that is likely larger than the underlying OS pipe buffer size, to" +" make writes blocking." +msgstr "一个通常大于下层 OS 管道缓冲区大小的常量,以产生写入阻塞。" + +#: ../../library/test.rst:351 +msgid "" +"``True`` if Python was built with the :c:macro:`Py_DEBUG` macro defined, " +"that is, if Python was :ref:`built in debug mode `." +msgstr "" +"如果 Python 编译时定义了 :c:macro:`Py_DEBUG` 宏则为 ``True``,也就是说,当 Python 是 " +":ref:`以调试模式编译 ` 的时候。" + +#: ../../library/test.rst:360 +msgid "" +"A constant that is likely larger than the underlying OS socket buffer size, " +"to make writes blocking." +msgstr "一个通常大于下层 OS 套接字缓冲区大小的常量,以产生写入阻塞。" + +#: ../../library/test.rst:366 +msgid "Set to the top level directory that contains :mod:`!test.support`." +msgstr "设为包含 :mod:`!test.support` 的最高层级目录。" + +#: ../../library/test.rst:371 +msgid "Set to the top level directory for the test package." +msgstr "设为 test 包的最高层级目录。" + +#: ../../library/test.rst:376 +msgid "Set to the ``data`` directory within the test package." +msgstr "设为 test 包中的 ``data`` 目录。" + +#: ../../library/test.rst:381 +msgid "Set to :data:`sys.maxsize` for big memory tests." +msgstr "设为大内存测试的 :data:`sys.maxsize`。" + +#: ../../library/test.rst:386 +msgid "" +"Set by :func:`set_memlimit` as the memory limit for big memory tests. " +"Limited by :data:`MAX_Py_ssize_t`." +msgstr "通过 :func:`set_memlimit` 设为针对大内存测试的内存限制。受 :data:`MAX_Py_ssize_t` 的限制。" + +#: ../../library/test.rst:392 +msgid "" +"Set by :func:`set_memlimit` as the memory limit for big memory tests. Not " +"limited by :data:`MAX_Py_ssize_t`." +msgstr "通过 :func:`set_memlimit` 设为针对大内存测试的内存限制。不受 :data:`MAX_Py_ssize_t` 的限制。" + +#: ../../library/test.rst:398 +msgid "" +"Set to ``True`` if Python is built without docstrings (the " +":c:macro:`WITH_DOC_STRINGS` macro is not defined). See the " +":option:`configure --without-doc-strings <--without-doc-strings>` option." +msgstr "" +"如果 Python 编译时不带文档字符串(即未定义 :c:macro:`WITH_DOC_STRINGS` 宏)则设为 ``True``。参见 " +":option:`configure --without-doc-strings <--without-doc-strings>` 选项。" + +#: ../../library/test.rst:402 +msgid "See also the :data:`HAVE_DOCSTRINGS` variable." +msgstr "另请参阅 :data:`HAVE_DOCSTRINGS` 变量。" + +#: ../../library/test.rst:407 +msgid "" +"Set to ``True`` if function docstrings are available. See the " +":option:`python -OO <-O>` option, which strips docstrings of functions " +"implemented in Python." +msgstr "" +"如果函数带有文档字符串则设为 ``True``。参见 :option:`python -OO <-O>` 选项,该选项会去除在 Python " +"中实现的函数的文档字符串。" + +#: ../../library/test.rst:410 +msgid "See also the :data:`MISSING_C_DOCSTRINGS` variable." +msgstr "另请参阅 :data:`MISSING_C_DOCSTRINGS` 变量。" + +#: ../../library/test.rst:415 +msgid "Define the URL of a dedicated HTTP server for the network tests." +msgstr "定义用于网络测试的专用 HTTP 服务器的 URL。" + +#: ../../library/test.rst:420 +msgid "Object that is equal to anything. Used to test mixed type comparison." +msgstr "等于任何对象的对象。用于测试混合类型比较。" + +#: ../../library/test.rst:425 +msgid "" +"Object that is not equal to anything (even to :data:`ALWAYS_EQ`). Used to " +"test mixed type comparison." +msgstr "不等于任何对象的对象 (即使是 :data:`ALWAYS_EQ`)。用于测试混合类型比较。" + +#: ../../library/test.rst:431 +msgid "" +"Object that is greater than anything (except itself). Used to test mixed " +"type comparison." +msgstr "大于任何对象的对象(除了其自身)。用于测试混合类型比较。" + +#: ../../library/test.rst:437 +msgid "" +"Object that is less than anything (except itself). Used to test mixed type " +"comparison." +msgstr "小于任何对象的对象(除了其自身)。用于测试混合类型比较。" + +#: ../../library/test.rst:441 +msgid "The :mod:`!test.support` module defines the following functions:" +msgstr ":mod:`!test.support` 模块定义了下列函数:" + +#: ../../library/test.rst:445 +msgid "Run the loop body until ``break`` stops the loop." +msgstr "运行循环体直到以 ``break`` 停止循环。" + +#: ../../library/test.rst:447 +msgid "" +"After *timeout* seconds, raise an :exc:`AssertionError` if *error* is true, " +"or just stop the loop if *error* is false." +msgstr "" +"在 *timeout* 秒后,如果 *error* 为真值则引发 :exc:`AssertionError`,或者如果 *error* " +"为假值则只停止循环。" + +#: ../../library/test.rst:450 +msgid "Example::" +msgstr "示例:" + +#: ../../library/test.rst:452 +msgid "" +"for _ in support.busy_retry(support.SHORT_TIMEOUT):\n" +" if check():\n" +" break" +msgstr "" +"for _ in support.busy_retry(support.SHORT_TIMEOUT):\n" +" if check():\n" +" break" + +#: ../../library/test.rst:456 ../../library/test.rst:480 +msgid "Example of error=False usage::" +msgstr "error=False 的用法示例::" + +#: ../../library/test.rst:458 +msgid "" +"for _ in support.busy_retry(support.SHORT_TIMEOUT, error=False):\n" +" if check():\n" +" break\n" +"else:\n" +" raise RuntimeError('my custom error')" +msgstr "" +"for _ in support.busy_retry(support.SHORT_TIMEOUT, error=False):\n" +" if check():\n" +" break\n" +"else:\n" +" raise RuntimeError('my custom error')" + +#: ../../library/test.rst:466 +msgid "Wait strategy that applies exponential backoff." +msgstr "应用指数回退的等待策略。" + +#: ../../library/test.rst:468 +msgid "" +"Run the loop body until ``break`` stops the loop. Sleep at each loop " +"iteration, but not at the first iteration. The sleep delay is doubled at " +"each iteration (up to *max_delay* seconds)." +msgstr "" +"运行循环体直到以 ``break`` 停止循环。在每次循环迭代时休眠,但第一次迭代时除外。每次迭代的休眠延时都将加倍(至多 *max_delay* " +"秒)。" + +#: ../../library/test.rst:472 +msgid "See :func:`busy_retry` documentation for the parameters usage." +msgstr "请参阅 :func:`busy_retry` 文档了解相关形参的用法。" + +#: ../../library/test.rst:474 +msgid "Example raising an exception after SHORT_TIMEOUT seconds::" +msgstr "在 SHORT_TIMEOUT 秒后引发异常的示例::" + +#: ../../library/test.rst:476 +msgid "" +"for _ in support.sleeping_retry(support.SHORT_TIMEOUT):\n" +" if check():\n" +" break" +msgstr "" +"for _ in support.sleeping_retry(support.SHORT_TIMEOUT):\n" +" if check():\n" +" break" + +#: ../../library/test.rst:482 +msgid "" +"for _ in support.sleeping_retry(support.SHORT_TIMEOUT, error=False):\n" +" if check():\n" +" break\n" +"else:\n" +" raise RuntimeError('my custom error')" +msgstr "" +"for _ in support.sleeping_retry(support.SHORT_TIMEOUT, error=False):\n" +" if check():\n" +" break\n" +"else:\n" +" raise RuntimeError('my custom error')" + +#: ../../library/test.rst:490 +msgid "" +"Return ``True`` if *resource* is enabled and available. The list of " +"available resources is only set when :mod:`test.regrtest` is executing the " +"tests." +msgstr "" +"如果 *resource* 已启用并可用则返回 ``True``。可用资源列表只有当 :mod:`test.regrtest` " +"正在执行测试时才会被设置。" + +#: ../../library/test.rst:497 +msgid "" +"Return the value specified for *resource* (as :samp:`-u " +"{resource}={value}`). Return ``None`` if *resource* is disabled or no value " +"is specified." +msgstr "" +"返回为 *resource* 指定的值 (形式为 :samp:`-u {resource}={value}`)。如果 *resource* " +"被禁用或未指定值则返回 ``None``。" + +#: ../../library/test.rst:503 +msgid "Return ``True`` if Python was not built with ``-O0`` or ``-Og``." +msgstr "如果 Python 编译未使用 ``-O0`` 或 ``-Og`` 则返回 ``True``。" + +#: ../../library/test.rst:508 +msgid "Return :const:`_testcapi.WITH_PYMALLOC`." +msgstr "返回 :const:`_testcapi.WITH_PYMALLOC`。" + +#: ../../library/test.rst:513 +msgid "" +"Raise :exc:`ResourceDenied` if *resource* is not available. *msg* is the " +"argument to :exc:`ResourceDenied` if it is raised. Always returns ``True`` " +"if called by a function whose ``__name__`` is ``'__main__'``. Used when " +"tests are executed by :mod:`test.regrtest`." +msgstr "" +"如果 *resource* 不可用则引发 :exc:`ResourceDenied`。如果该异常被引发则 *msg* 为传给 " +":exc:`ResourceDenied` 的参数。如果被 ``__name__`` 为 ``'__main__'`` 的函数调用则总是返回 " +"``True``。在测试由 :mod:`test.regrtest` 执行时使用。" + +#: ../../library/test.rst:521 +msgid "Return a repr of *dict* with keys sorted." +msgstr "返回 *dict* 按键排序的 repr。" + +#: ../../library/test.rst:526 +msgid "" +"Return the path to the file named *filename*. If no match is found " +"*filename* is returned. This does not equal a failure since it could be the " +"path to the file." +msgstr "返回名为 *filename* 的文件的路径。如果未找到匹配结果则返回 *filename*。这并不等于失败因为它也算是该文件的路径。" + +#: ../../library/test.rst:530 +msgid "" +"Setting *subdir* indicates a relative path to use to find the file rather " +"than looking directly in the path directories." +msgstr "设置 *subdir* 指明要用来查找文件的相对路径而不是直接在路径目录中查找。" + +#: ../../library/test.rst:536 +msgid "Get size of a page in bytes." +msgstr "获取以字节表示的分页大小。" + +#: ../../library/test.rst:543 +msgid "" +"Set the :func:`sys.setswitchinterval` to the given *interval*. Defines a " +"minimum interval for Android systems to prevent the system from hanging." +msgstr "" +"将 :func:`sys.setswitchinterval` 设为给定的 *interval*。请为 Android " +"系统定义一个最小间隔以防止系统挂起。" + +#: ../../library/test.rst:549 +msgid "" +"Use this check to guard CPython's implementation-specific tests or to run " +"them only on the implementations guarded by the arguments. This function " +"returns ``True`` or ``False`` depending on the host platform. Example " +"usage::" +msgstr "" +"使用此检测来保护 CPython 实现专属的测试或者仅在有这些参数保护的实现上运行它们。此函数将根据主机系统平台的不同返回 ``True`` 或 " +"``False``。用法示例::" + +#: ../../library/test.rst:554 +msgid "" +"check_impl_detail() # Only on CPython (default).\n" +"check_impl_detail(jython=True) # Only on Jython.\n" +"check_impl_detail(cpython=False) # Everywhere except CPython." +msgstr "" +"check_impl_detail() # 仅限 CPython (默认)。\n" +"check_impl_detail(jython=True) # 仅限 Jython。\n" +"check_impl_detail(cpython=False) # 除 CPython 以外的任何地方。" + +#: ../../library/test.rst:561 +msgid "" +"Set the values for :data:`max_memuse` and :data:`real_max_memuse` for big " +"memory tests." +msgstr "针对大内存测试设置 :data:`max_memuse` 和 :data:`real_max_memuse` 的值。" + +#: ../../library/test.rst:567 +msgid "" +"Store the value from *stdout*. It is meant to hold the stdout at the time " +"the regrtest began." +msgstr "存放来自 *stdout* 的值。它旨在保存回归测试开始时的 stdout。" + +#: ../../library/test.rst:573 +msgid "" +"Return the original stdout set by :func:`record_original_stdout` or " +"``sys.stdout`` if it's not set." +msgstr "" +"返回 :func:`record_original_stdout` 所设置的原始 stdout 或者如果未设置则为 ``sys.stdout``。" + +#: ../../library/test.rst:579 +msgid "" +"Return a list of command line arguments reproducing the current settings in " +"``sys.flags`` and ``sys.warnoptions``." +msgstr "返回在 ``sys.flags`` 和 ``sys.warnoptions`` 中重新产生当前设置的命令行参数列表。" + +#: ../../library/test.rst:585 +msgid "" +"Return a list of command line arguments reproducing the current optimization" +" settings in ``sys.flags``." +msgstr "返回在 ``sys.flags`` 中重新产生当前优化设置的命令行参数列表。" + +#: ../../library/test.rst:593 +msgid "" +"A context managers that temporarily replaces the named stream with " +":class:`io.StringIO` object." +msgstr "使用 :class:`io.StringIO` 对象临时替换指定流的上下文管理器。" + +#: ../../library/test.rst:596 +msgid "Example use with output streams::" +msgstr "使用输出流的示例::" + +#: ../../library/test.rst:598 +msgid "" +"with captured_stdout() as stdout, captured_stderr() as stderr:\n" +" print(\"hello\")\n" +" print(\"error\", file=sys.stderr)\n" +"assert stdout.getvalue() == \"hello\\n\"\n" +"assert stderr.getvalue() == \"error\\n\"" +msgstr "" +"with captured_stdout() as stdout, captured_stderr() as stderr:\n" +" print(\"hello\")\n" +" print(\"error\", file=sys.stderr)\n" +"assert stdout.getvalue() == \"hello\\n\"\n" +"assert stderr.getvalue() == \"error\\n\"" + +#: ../../library/test.rst:604 +msgid "Example use with input stream::" +msgstr "使用输入流的示例::" + +#: ../../library/test.rst:606 +msgid "" +"with captured_stdin() as stdin:\n" +" stdin.write('hello\\n')\n" +" stdin.seek(0)\n" +" # call test code that consumes from sys.stdin\n" +" captured = input()\n" +"self.assertEqual(captured, \"hello\")" +msgstr "" +"with captured_stdin() as stdin:\n" +" stdin.write('hello\\n')\n" +" stdin.seek(0)\n" +" # 调用接受 sys.stdin 的代码\n" +" captured = input()\n" +"self.assertEqual(captured, \"hello\")" + +#: ../../library/test.rst:616 +msgid "A context manager that temporary disables :mod:`faulthandler`." +msgstr "临时禁用 :mod:`faulthandler` 的上下文管理器。" + +#: ../../library/test.rst:621 +msgid "" +"Force as many objects as possible to be collected. This is needed because " +"timely deallocation is not guaranteed by the garbage collector. This means " +"that ``__del__`` methods may be called later than expected and weakrefs may " +"remain alive for longer than expected." +msgstr "" +"强制收集尽可能多的对象。这是有必要的因为垃圾回收器并不能保证及时回收资源。这意味着 ``__del__`` " +"方法的调用可能会晚于预期而弱引用的存活长于预期。" + +#: ../../library/test.rst:629 +msgid "" +"A context manager that disables the garbage collector on entry. On exit, the" +" garbage collector is restored to its prior state." +msgstr "在进入时禁用垃圾回收器的上下文管理器。在退出时,垃圾回收器将恢复到先前状态。" + +#: ../../library/test.rst:635 +msgid "Context manager to swap out an attribute with a new object." +msgstr "上下文管理器用一个新对象来交换一个属性。" + +#: ../../library/test.rst:637 ../../library/test.rst:655 +#: ../../library/test.rst:910 ../../library/test.rst:1376 +msgid "Usage::" +msgstr "用法:" + +#: ../../library/test.rst:639 +msgid "" +"with swap_attr(obj, \"attr\", 5):\n" +" ..." +msgstr "" +"with swap_attr(obj, \"attr\", 5):\n" +" ..." + +#: ../../library/test.rst:642 +msgid "" +"This will set ``obj.attr`` to 5 for the duration of the ``with`` block, " +"restoring the old value at the end of the block. If ``attr`` doesn't exist " +"on ``obj``, it will be created and then deleted at the end of the block." +msgstr "" +"这将把 ``obj.attr`` 设为 5 并在 ``with`` 语句块内保持,在语句块结束时恢复旧值。如果 ``attr`` 不存在于 " +"``obj`` 中,它将被创建并在语句块结束时被删除。" + +#: ../../library/test.rst:647 ../../library/test.rst:665 +msgid "" +"The old value (or ``None`` if it doesn't exist) will be assigned to the " +"target of the \"as\" clause, if there is one." +msgstr "旧值 (或者如果不存在旧值则为 ``None``) 将被赋给 \"as\" 子句的目标,如果存在子句的话。" + +#: ../../library/test.rst:653 +msgid "Context manager to swap out an item with a new object." +msgstr "上下文管理器用一个新对象来交换一个条目。" + +#: ../../library/test.rst:657 +msgid "" +"with swap_item(obj, \"item\", 5):\n" +" ..." +msgstr "" +"with swap_item(obj, \"item\", 5):\n" +" ..." + +#: ../../library/test.rst:660 +msgid "" +"This will set ``obj[\"item\"]`` to 5 for the duration of the ``with`` block," +" restoring the old value at the end of the block. If ``item`` doesn't exist " +"on ``obj``, it will be created and then deleted at the end of the block." +msgstr "" +"这将把 ``obj[\"item\"]`` 设为 5 并在 ``with`` 语句块内保持,在语句块结束时恢复旧值。如果 ``item`` 不存在于 " +"``obj`` 中,它将被创建并在语句块结束时被删除。" + +#: ../../library/test.rst:671 +msgid "" +"Call the ``flush()`` method on :data:`sys.stdout` and then on " +":data:`sys.stderr`. It can be used to make sure that the logs order is " +"consistent before writing into stderr." +msgstr "" +"在 :data:`sys.stdout` 然后又在 :data:`sys.stderr` 上调用 ``flush()`` 方法。 " +"它可被用来确保日志顺序在写入到 stderr 之前的一致性。" + +#: ../../library/test.rst:680 +msgid "" +"Print a warning into :data:`sys.__stderr__`. Format the message as: " +"``f\"Warning -- {msg}\"``. If *msg* is made of multiple lines, add " +"``\"Warning -- \"`` prefix to each line." +msgstr "" +"打印一个警告到 :data:`sys.__stderr__`。将消息格式化为:``f\"Warning -- {msg}\"``。如果 *msg* " +"包含多行,则为每行添加 ``\"Warning -- \"`` 前缀。" + +#: ../../library/test.rst:689 +msgid "" +"Wait until process *pid* completes and check that the process exit code is " +"*exitcode*." +msgstr "等待直到进程 *pid* 结束并检查进程退出代码是否为 *exitcode*。" + +#: ../../library/test.rst:692 +msgid "" +"Raise an :exc:`AssertionError` if the process exit code is not equal to " +"*exitcode*." +msgstr "如果进程退出代码不等于 *exitcode* 则引发 :exc:`AssertionError`。" + +#: ../../library/test.rst:695 +msgid "" +"If the process runs longer than *timeout* seconds (:data:`SHORT_TIMEOUT` by " +"default), kill the process and raise an :exc:`AssertionError`. The timeout " +"feature is not available on Windows." +msgstr "" +"如果进程运行时长超过 *timeout* 秒 (默认为 :data:`SHORT_TIMEOUT`),则杀死进程并引发 " +":exc:`AssertionError`。超时特性在 Windows 上不可用。" + +#: ../../library/test.rst:704 +msgid "" +"Return the size of the :c:type:`PyObject` whose structure members are " +"defined by *fmt*. The returned value includes the size of the Python object " +"header and alignment." +msgstr "返回 :c:type:`PyObject` 的大小,其结构成员由 *fmt* 定义。返回的值包括 Python 对象头的大小和对齐方式。" + +#: ../../library/test.rst:710 +msgid "" +"Return the size of the :c:type:`PyVarObject` whose structure members are " +"defined by *fmt*. The returned value includes the size of the Python object " +"header and alignment." +msgstr "" +"返回 :c:type:`PyVarObject` 的大小,其结构成员由 *fmt* 定义。返回的值包括 Python 对象头的大小和对齐方式。" + +#: ../../library/test.rst:716 +msgid "" +"For testcase *test*, assert that the ``sys.getsizeof`` for *o* plus the GC " +"header size equals *size*." +msgstr "对于测试用例 *test*,断言 *o* 的 ``sys.getsizeof`` 加 GC 头的大小等于 *size*。" + +#: ../../library/test.rst:722 +msgid "" +"A decorator to conditionally mark tests with " +":func:`unittest.expectedFailure`. Any use of this decorator should have an " +"associated comment identifying the relevant tracker issue." +msgstr "" +"一个有条件地用 :func:`unittest.expectedFailure` 来标记测试的装饰器。 " +"任何对此装饰器的使用都应当具有标识相应追踪事项的有关联注释。" + +#: ../../library/test.rst:729 +msgid "" +"A decorator that skips the decorated test on TLS certification validation " +"failures." +msgstr "一个在 TLS 证书验证失败时跳过被装饰测试的装饰器。" + +#: ../../library/test.rst:734 +msgid "" +"A decorator for running a function in a different locale, correctly " +"resetting it after it has finished. *catstr* is the locale category as a " +"string (for example ``\"LC_ALL\"``). The *locales* passed will be tried " +"sequentially, and the first valid locale will be used." +msgstr "" +"一个在不同语言区域下运行函数的装饰器,并在其结束后正确地重置语言区域。 *catstr* 是字符串形式的语言区域类别 (例如 " +"``\"LC_ALL\"``)。传入的 *locales* 将依次被尝试,并将使用第一个有效的语言区域。" + +#: ../../library/test.rst:742 +msgid "" +"A decorator for running a function in a specific timezone, correctly " +"resetting it after it has finished." +msgstr "一个在指定时区下运行函数的装饰器,并在其结束后正确地重置时区。" + +#: ../../library/test.rst:748 +msgid "" +"Decorator for the minimum version when running test on FreeBSD. If the " +"FreeBSD version is less than the minimum, the test is skipped." +msgstr "当在 FreeBSD 上运行测试时指定最低版本的装饰器。如果 FreeBSD 版本号低于指定值,测试将被跳过。" + +#: ../../library/test.rst:754 +msgid "" +"Decorator for the minimum version when running test on Linux. If the Linux " +"version is less than the minimum, the test is skipped." +msgstr "当在 Linux 上运行测试时指定最低版本的装饰器。如果 Linux 版本号低于指定值,测试将被跳过。" + +#: ../../library/test.rst:760 +msgid "" +"Decorator for the minimum version when running test on macOS. If the macOS " +"version is less than the minimum, the test is skipped." +msgstr "当在 macOS 上运行测试时指定最低版本的装饰器。如果 macOS 版本号低于指定值,测试将被跳过。" + +#: ../../library/test.rst:766 +msgid "" +"Decorator for skipping tests on the free-threaded build. If the :term:`GIL`" +" is disabled, the test is skipped." +msgstr "在自由线程编译版上跳过测试的装饰器。如果禁用了 :term:`GIL`,测试将被跳过。" + +#: ../../library/test.rst:772 +msgid "Decorator for skipping tests on non-IEEE 754 platforms." +msgstr "用于在非 IEEE 754 平台上跳过测试的装饰器。" + +#: ../../library/test.rst:777 +msgid "Decorator for skipping tests if :mod:`zlib` doesn't exist." +msgstr "用于当 :mod:`zlib` 不存在时跳过测试的装饰器。" + +#: ../../library/test.rst:782 +msgid "Decorator for skipping tests if :mod:`gzip` doesn't exist." +msgstr "用于当 :mod:`gzip` 不存在时跳过测试的装饰器。" + +#: ../../library/test.rst:787 +msgid "Decorator for skipping tests if :mod:`bz2` doesn't exist." +msgstr "用于当 :mod:`bz2` 不存在时跳过测试的装饰器。" + +#: ../../library/test.rst:792 +msgid "Decorator for skipping tests if :mod:`lzma` doesn't exist." +msgstr "用于当 :mod:`lzma` 不存在时跳过测试的装饰器。" + +#: ../../library/test.rst:797 +msgid "Decorator for skipping tests if *resource* is not available." +msgstr "用于当 *resource* 不可用时跳过测试的装饰器。" + +#: ../../library/test.rst:802 +msgid "Decorator for only running the test if :data:`HAVE_DOCSTRINGS`." +msgstr "用于仅当 :data:`HAVE_DOCSTRINGS` 时才运行测试的装饰器。" + +#: ../../library/test.rst:807 +msgid "" +"Decorator for only running the test if :ref:`Limited C API ` " +"is available." +msgstr "设置仅在 :ref:`受限 C API ` 可用时运行测试的装饰器。" + +#: ../../library/test.rst:813 +msgid "Decorator for tests only applicable to CPython." +msgstr "表示仅适用于 CPython 的测试的装饰器。" + +#: ../../library/test.rst:818 +msgid "" +"Decorator for invoking :func:`check_impl_detail` on *guards*. If that " +"returns ``False``, then uses *msg* as the reason for skipping the test." +msgstr "" +"用于在 *guards* 上调用 :func:`check_impl_detail` 的装饰器。如果调用返回 ``False``,则使用 *msg* " +"作为跳过测试的原因。" + +#: ../../library/test.rst:823 +msgid "" +"Decorator for marking tests as thread-unsafe. This test always runs in one " +"thread even when invoked with ``--parallel-threads``." +msgstr "用于将测试标记为线程不安全的装饰器。此测试即使在使用 ``--parallel-threads`` 调用时也总是会在一个线程中运行。" + +#: ../../library/test.rst:829 +msgid "" +"Decorator to temporarily turn off tracing for the duration of the test." +msgstr "用于在测试期间临时关闭追踪的装饰器。" + +#: ../../library/test.rst:834 +msgid "" +"Decorator for tests which involve reference counting. The decorator does " +"not run the test if it is not run by CPython. Any trace function is unset " +"for the duration of the test to prevent unexpected refcounts caused by the " +"trace function." +msgstr "" +"用于涉及引用计数的测试的装饰器。如果测试不是由 CPython 运行则该装饰器不会运行测试。 " +"在测试期间会取消设置任何追踪函数以防止由追踪函数导致的意外引用计数。" + +#: ../../library/test.rst:842 +msgid "Decorator for bigmem tests." +msgstr "用于大内存测试的装饰器。" + +#: ../../library/test.rst:844 +msgid "" +"*size* is a requested size for the test (in arbitrary, test-interpreted " +"units.) *memuse* is the number of bytes per unit for the test, or a good " +"estimate of it. For example, a test that needs two byte buffers, of 4 GiB " +"each, could be decorated with ``@bigmemtest(size=_4G, memuse=2)``." +msgstr "" +"*size* 是测试所请求的大小(以任意的,由测试解读的单位。) *memuse* 是测试的每单元字节数,或是对它的良好估计。 " +"例如,一个需要两个字节缓冲区,每个缓冲区 4 GiB,则可以用 ``@bigmemtest(size=_4G, memuse=2)`` 来装饰。" + +#: ../../library/test.rst:849 +msgid "" +"The *size* argument is normally passed to the decorated test method as an " +"extra argument. If *dry_run* is ``True``, the value passed to the test " +"method may be less than the requested value. If *dry_run* is ``False``, it " +"means the test doesn't support dummy runs when ``-M`` is not specified." +msgstr "" +"*size* 参数通常作为额外参数传递给被测试的方法。如果 *dry_run* 为 ``True``,则传给测试方法的值可能少于所请求的值。如果 " +"*dry_run* 为 ``False``,则意味着当未指定 ``-M`` 时测试将不支持虚拟运行。" + +#: ../../library/test.rst:857 +msgid "Decorator for tests that fill the address space." +msgstr "用于填充地址空间的测试的装饰器。" + +#: ../../library/test.rst:862 +msgid "" +"Return ``False`` if there is no evidence the interpreter was compiled with " +"``musl``, otherwise return a version triple, either ``(0, 0, 0)`` if the " +"version is unknown, or the actual version if it is known. Intended for use " +"in ``skip`` decorators. ``emscripten`` and ``wasi`` are assumed to be " +"compiled with ``musl``; otherwise ``platform.libc_ver`` is checked." +msgstr "" +"如果没有证据表明解释器是使用 ``musl`` 编译则返回 ``False``,在其他情况下返回版本号三元组,如果版本号未知则为 ``(0, 0, " +"0)``,或者如果已知则为实际版本号。被设计用于 ``skip`` 装饰器。``emscripten`` 和 ``wasi`` 被认为是使用 " +"``musl`` 编译;在其他情况下将检查 ``platform.libc_ver``。" + +#: ../../library/test.rst:871 +msgid "" +"Test for syntax errors in *statement* by attempting to compile *statement*. " +"*testcase* is the :mod:`unittest` instance for the test. *errtext* is the " +"regular expression which should match the string representation of the " +"raised :exc:`SyntaxError`. If *lineno* is not ``None``, compares to the " +"line of the exception. If *offset* is not ``None``, compares to the offset " +"of the exception." +msgstr "" +"用于通过尝试编译 *statement* 来测试 *statement* 中的语法错误。 *testcase* 是测试的 :mod:`unittest`" +" 实例。 *errtext* 是应当匹配所引发的 :exc:`SyntaxError` 的字符串表示形式的正则表达式。如果 *lineno* 不为 " +"``None``,则与异常所在的行进行比较。如果 *offset* 不为 ``None``,则与异常的偏移量进行比较。" + +#: ../../library/test.rst:881 +msgid "Open *url*. If open fails, raises :exc:`TestFailed`." +msgstr "打开 *url*。如果打开失败,则引发 :exc:`TestFailed`。" + +#: ../../library/test.rst:886 +msgid "" +"Use this at the end of ``test_main`` whenever sub-processes are started. " +"This will help ensure that no extra children (zombies) stick around to hog " +"resources and create problems when looking for refleaks." +msgstr "" +"只要有子进程启动就在 ``test_main`` 的末尾使用此函数。这将有助于确保没有多余的子进程(僵尸)存在占用资源并在查找引用泄漏时造成问题。" + +#: ../../library/test.rst:893 +msgid "" +"Get an attribute, raising :exc:`unittest.SkipTest` if :exc:`AttributeError` " +"is raised." +msgstr "获取一个属性,如果引发了 :exc:`AttributeError` 则会引发 :exc:`unittest.SkipTest`。" + +#: ../../library/test.rst:899 +msgid "" +"Context manager catching unraisable exception using " +":func:`sys.unraisablehook`." +msgstr "使用 :func:`sys.unraisablehook` 来捕获不可引发的异常的上下文管理器。" + +#: ../../library/test.rst:902 +msgid "" +"Storing the exception value (``cm.unraisable.exc_value``) creates a " +"reference cycle. The reference cycle is broken explicitly when the context " +"manager exits." +msgstr "存储异常值 (``cm.unraisable.exc_value``) 会创建一个引用循环。引用循环将在上下文管理器退出时被显式地打破。" + +#: ../../library/test.rst:906 +msgid "" +"Storing the object (``cm.unraisable.object``) can resurrect it if it is set " +"to an object which is being finalized. Exiting the context manager clears " +"the stored object." +msgstr "" +"存储对象 (``cm.unraisable.object``) 如果被设置为一个正在最终化的对象则可以恢复它。退出上下文管理器将清除已存在对象。" + +#: ../../library/test.rst:912 +msgid "" +"with support.catch_unraisable_exception() as cm:\n" +" # code creating an \"unraisable exception\"\n" +" ...\n" +"\n" +" # check the unraisable exception: use cm.unraisable\n" +" ...\n" +"\n" +"# cm.unraisable attribute no longer exists at this point\n" +"# (to break a reference cycle)" +msgstr "" +"with support.catch_unraisable_exception() as cm:\n" +" # 创建一个“不可引发的异常”的代码\n" +" ...\n" +"\n" +" # 检测这个不可引发的异常:使用 cm.unraisable\n" +" ...\n" +"\n" +"# 此时 cm.unraisable 属性已不存在\n" +"# (以打破循环引用)" + +#: ../../library/test.rst:927 +msgid "" +"Generic implementation of the :mod:`unittest` ``load_tests`` protocol for " +"use in test packages. *pkg_dir* is the root directory of the package; " +"*loader*, *standard_tests*, and *pattern* are the arguments expected by " +"``load_tests``. In simple cases, the test package's ``__init__.py`` can be " +"the following::" +msgstr "" +"在测试包中使用的 :mod:`unittest` ``load_tests`` 协议的通用实现。 *pkg_dir* 是包的根目录;*loader*, " +"*standard_tests* 和 *pattern* 是 ``load_tests`` 所期望的参数。在简单的情况下,测试包的 " +"``__init__.py`` 可以是下面这样的::" + +#: ../../library/test.rst:933 +msgid "" +"import os\n" +"from test.support import load_package_tests\n" +"\n" +"def load_tests(*args):\n" +" return load_package_tests(os.path.dirname(__file__), *args)" +msgstr "" +"import os\n" +"from test.support import load_package_tests\n" +"\n" +"def load_tests(*args):\n" +" return load_package_tests(os.path.dirname(__file__), *args)" + +#: ../../library/test.rst:942 +msgid "" +"Returns the set of attributes, functions or methods of *ref_api* not found " +"on *other_api*, except for a defined list of items to be ignored in this " +"check specified in *ignore*." +msgstr "" +"返回未在 *other_api* 中找到的 *ref_api* 的属性、函数或方法的集合,除去在 *ignore* " +"中指明的要在这个检查中忽略的已定义条目列表。" + +#: ../../library/test.rst:946 +msgid "" +"By default this skips private attributes beginning with '_' but includes all" +" magic methods, i.e. those starting and ending in '__'." +msgstr "在默认情况下这将跳过以 '_' 打头的私有属性但包括所有魔术方法,即以 '__' 打头和结尾的方法。" + +#: ../../library/test.rst:954 +msgid "" +"Override *object_to_patch.attr_name* with *new_value*. Also add cleanup " +"procedure to *test_instance* to restore *object_to_patch* for *attr_name*. " +"The *attr_name* should be a valid attribute for *object_to_patch*." +msgstr "" +"用 *new_value* 重载 *object_to_patch.attr_name*。并向 *test_instance* 添加清理过程以便为 " +"*attr_name* 恢复 *object_to_patch*。 *attr_name* 应当是 *object_to_patch* 的一个有效属性。" + +#: ../../library/test.rst:962 +msgid "" +"Run *code* in subinterpreter. Raise :exc:`unittest.SkipTest` if " +":mod:`tracemalloc` is enabled." +msgstr "" +"在子解释器中运行 *code*。如果启用了 :mod:`tracemalloc` 则会引发 :exc:`unittest.SkipTest`。" + +#: ../../library/test.rst:968 +msgid "Assert instances of *cls* are deallocated after iterating." +msgstr "断言 *cls* 的实例在迭代后被释放。" + +#: ../../library/test.rst:973 +msgid "" +"Check for the existence of the compiler executables whose names are listed " +"in *cmd_names* or all the compiler executables when *cmd_names* is empty and" +" return the first missing executable or ``None`` when none is found missing." +msgstr "" +"检查在 *cmd_names* 中列出名称的或者当 *cmd_names* " +"为空时所有的编译器可执行文件是否存在并返回第一个丢失的可执行文件或者如果未发现任何丢失则返回 ``None``。" + +#: ../../library/test.rst:981 +msgid "" +"Assert that the ``__all__`` variable of *module* contains all public names." +msgstr "断言 *module* 的 ``__all__`` 变量包含全部公共名称。" + +#: ../../library/test.rst:983 +msgid "" +"The module's public names (its API) are detected automatically based on " +"whether they match the public name convention and were defined in *module*." +msgstr "模块的公共名称(它的 API)是根据它们是否符合公共名称惯例并在 *module* 中被定义来自动检测的。" + +#: ../../library/test.rst:987 +msgid "" +"The *name_of_module* argument can specify (as a string or tuple thereof) " +"what module(s) an API could be defined in order to be detected as a public " +"API. One case for this is when *module* imports part of its public API from " +"other modules, possibly a C backend (like ``csv`` and its ``_csv``)." +msgstr "" +"*name_of_module* 参数可以(用字符串或元组的形式)指定一个 API 可以被定义为什么模块以便被检测为一个公共 API。 " +"一种这样的情况会在 *module* 从其他模块,可能是一个 C 后端 (如 ``csv`` 和它的 ``_csv``) 导入其公共 API " +"的某一组成部分时发生。" + +#: ../../library/test.rst:992 +msgid "" +"The *extra* argument can be a set of names that wouldn't otherwise be " +"automatically detected as \"public\", like objects without a proper " +":attr:`~definition.__module__` attribute. If provided, it will be added to " +"the automatically detected ones." +msgstr "" +"*extra* 参数可以是一个在其他情况下不会被自动检测为 \"public\" 的名称的集合,例如没有适当的 " +":attr:`~definition.__module__` 属性的对象。如果提供该参数,它将被添加到被自动检测的对象中。" + +#: ../../library/test.rst:996 +msgid "" +"The *not_exported* argument can be a set of names that must not be treated " +"as part of the public API even though their names indicate otherwise." +msgstr "*not_exported* 参数可以是一个不可被当作公共 API 的一部分的名称集合,即使其名称没有显式指明这一点。" + +#: ../../library/test.rst:999 ../../library/test.rst:1636 +msgid "Example use::" +msgstr "用法示例::" + +#: ../../library/test.rst:1001 +msgid "" +"import bar\n" +"import foo\n" +"import unittest\n" +"from test import support\n" +"\n" +"class MiscTestCase(unittest.TestCase):\n" +" def test__all__(self):\n" +" support.check__all__(self, foo)\n" +"\n" +"class OtherTestCase(unittest.TestCase):\n" +" def test__all__(self):\n" +" extra = {'BAR_CONST', 'FOO_CONST'}\n" +" not_exported = {'baz'} # Undocumented name.\n" +" # bar imports part of its API from _bar.\n" +" support.check__all__(self, bar, ('bar', '_bar'),\n" +" extra=extra, not_exported=not_exported)" +msgstr "" +"import bar\n" +"import foo\n" +"import unittest\n" +"from test import support\n" +"\n" +"class MiscTestCase(unittest.TestCase):\n" +" def test__all__(self):\n" +" support.check__all__(self, foo)\n" +"\n" +"class OtherTestCase(unittest.TestCase):\n" +" def test__all__(self):\n" +" extra = {'BAR_CONST', 'FOO_CONST'}\n" +" not_exported = {'baz'} # 未写入文档的名称。\n" +" # bar 从 _bar 导入其 API 的一部分。\n" +" support.check__all__(self, bar, ('bar', '_bar'),\n" +" extra=extra, not_exported=not_exported)" + +#: ../../library/test.rst:1022 +msgid "" +"Skip tests if the :mod:`multiprocessing.synchronize` module is missing, if " +"there is no available semaphore implementation, or if creating a lock raises" +" an :exc:`OSError`." +msgstr "" +"如果没有 :mod:`multiprocessing.synchronize` 模块,没有可用的 semaphore 实现,或者如果创建一个锁会引发 " +":exc:`OSError` 则跳过测试。" + +#: ../../library/test.rst:1031 +msgid "Assert that type *tp* cannot be instantiated using *args* and *kwds*." +msgstr "断言类型 *tp* 不能使用 *args* 和 *kwds* 来实例化。" + +#: ../../library/test.rst:1038 +msgid "" +"This function returns a context manager that will change the global " +":func:`sys.set_int_max_str_digits` setting for the duration of the context " +"to allow execution of test code that needs a different limit on the number " +"of digits when converting between an integer and string." +msgstr "" +"此函数返回一个将在上下文生效期间改变全局 :func:`sys.set_int_max_str_digits` " +"设置的上下文管理器以便允许执行当在整数和字符串之间进行转换时需要对位数有不同限制的测试代码。" + +#: ../../library/test.rst:1046 +msgid "The :mod:`!test.support` module defines the following classes:" +msgstr ":mod:`!test.support` 模块定义了下列类:" + +#: ../../library/test.rst:1051 +msgid "" +"A context manager used to try to prevent crash dialog popups on tests that " +"are expected to crash a subprocess." +msgstr "一个用于在预期会使子进程崩溃的测试时尽量防止弹出崩溃对话框的上下文管理器。" + +#: ../../library/test.rst:1054 +msgid "" +"On Windows, it disables Windows Error Reporting dialogs using `SetErrorMode " +"`_." +msgstr "" +"在 Windows 上,它会使用 `SetErrorMode `_ 来禁用 Windows 错误报告对话框。" + +#: ../../library/test.rst:1057 +msgid "" +"On UNIX, :func:`resource.setrlimit` is used to set " +":const:`resource.RLIMIT_CORE`'s soft limit to 0 to prevent coredump file " +"creation." +msgstr "" +"在 UNIX 上,会使用 :func:`resource.setrlimit` 来将 :const:`resource.RLIMIT_CORE` " +"的软限制设为 0 以防止创建核心转储文件。" + +#: ../../library/test.rst:1061 +msgid "" +"On both platforms, the old value is restored by :meth:`~object.__exit__`." +msgstr "在这两个平台上,旧值都可通过 :meth:`~object.__exit__` 恢复。" + +#: ../../library/test.rst:1066 +msgid "" +"Class to save and restore signal handlers registered by the Python signal " +"handler." +msgstr "用于保存和恢复由 Python 信号处理器所注册的信号处理程序。" + +#: ../../library/test.rst:1071 +msgid "" +"Save the signal handlers to a dictionary mapping signal numbers to the " +"current signal handler." +msgstr "将信号处理器保存到一个将信号编号映射到当前信号处理器的字典。" + +#: ../../library/test.rst:1076 +msgid "" +"Set the signal numbers from the :meth:`save` dictionary to the saved " +"handler." +msgstr "将来自 :meth:`save` 字典的信号编号设置到已保存的处理器上。" + +#: ../../library/test.rst:1084 +msgid "Try to match a single dict with the supplied arguments." +msgstr "尝试对单个字典与所提供的参数进行匹配。" + +#: ../../library/test.rst:1089 +msgid "Try to match a single stored value (*dv*) with a supplied value (*v*)." +msgstr "尝试对单个已存储值 (*dv*) 与所提供的值 (*v*) 进行匹配。" + +#: ../../library/test.rst:1093 +msgid ":mod:`!test.support.socket_helper` --- Utilities for socket tests" +msgstr ":mod:`!test.support.socket_helper` --- 针对套接字测试的工具" + +#: ../../library/test.rst:1099 +msgid "" +"The :mod:`!test.support.socket_helper` module provides support for socket " +"tests." +msgstr "" + +#: ../../library/test.rst:1106 +msgid "Set to ``True`` if IPv6 is enabled on this host, ``False`` otherwise." +msgstr "如果此主机启用了 IPv6 则设为 ``True``,否则为 ``False``。" + +#: ../../library/test.rst:1111 +msgid "" +"Returns an unused port that should be suitable for binding. This is " +"achieved by creating a temporary socket with the same family and type as the" +" ``sock`` parameter (default is :const:`~socket.AF_INET`, " +":const:`~socket.SOCK_STREAM`), and binding it to the specified host address " +"(defaults to ``0.0.0.0``) with the port set to 0, eliciting an unused " +"ephemeral port from the OS. The temporary socket is then closed and deleted," +" and the ephemeral port is returned." +msgstr "" +"返回一个应当适合绑定的未使用端口。这是通过创建一个与 ``sock`` 形参相同协议族和类型的临时套接字来达成的 (默认为 " +":const:`~socket.AF_INET`, :const:`~socket.SOCK_STREAM`),并将其绑定到指定的主机地址 (默认为 " +"``0.0.0.0``) 并将端口设为 0,以从 OS 引出一个未使用的瞬时端口。这个临时套接字随后将被关闭并删除,然后返回该瞬时端口。" + +#: ../../library/test.rst:1120 +msgid "" +"Either this method or :func:`bind_port` should be used for any tests where a" +" server socket needs to be bound to a particular port for the duration of " +"the test. Which one to use depends on whether the calling code is creating a" +" Python socket, or if an unused port needs to be provided in a constructor " +"or passed to an external program (i.e. the ``-accept`` argument to openssl's" +" s_server mode). Always prefer :func:`bind_port` over " +":func:`find_unused_port` where possible. Using a hard coded port is " +"discouraged since it can make multiple instances of the test impossible to " +"run simultaneously, which is a problem for buildbots." +msgstr "" +"这个方法或 :func:`bind_port` 应当被用于任何在测试期间需要绑定到特定端口的测试。具体使用哪个取决于调用方代码是否会创建 Python " +"套接字,或者是否需要在构造器中提供或向外部程序提供未使用的端口(例如传给 openssl 的 s_server 模式的 ``-accept`` " +"参数)。在可能的情况下将总是优先使用 :func:`bind_port` 而非 :func:`find_unused_port`。 " +"不建议使用硬编码的端口因为将使测试的多个实例无法同时运行,这对 buildbot 来说是个问题。" + +#: ../../library/test.rst:1134 +msgid "" +"Bind the socket to a free port and return the port number. Relies on " +"ephemeral ports in order to ensure we are using an unbound port. This is " +"important as many tests may be running simultaneously, especially in a " +"buildbot environment. This method raises an exception if the " +"``sock.family`` is :const:`~socket.AF_INET` and ``sock.type`` is " +":const:`~socket.SOCK_STREAM`, and the socket has " +":const:`~socket.SO_REUSEADDR` or :const:`~socket.SO_REUSEPORT` set on it. " +"Tests should never set these socket options for TCP/IP sockets. The only " +"case for setting these options is testing multicasting via multiple UDP " +"sockets." +msgstr "" +"将套接字绑定到一个空闲端口并返回端口号。这依赖于瞬时端口以确保我们能使用一个未绑定端口。这很重要因为可能会有许多测试同时运行,特别是在 buildbot" +" 环境中。如果 ``sock.family`` 为 :const:`~socket.AF_INET` 而 ``sock.type`` 为 " +":const:`~socket.SOCK_STREAM`,并且套接字上设置了 :const:`~socket.SO_REUSEADDR` 或 " +":const:`~socket.SO_REUSEPORT` 则此方法将引发异常。测试绝不应该为 TCP/IP 套接字设置这些套接字选项。 " +"唯一需要设置这些选项的情况是通过多个 UDP 套接字来测试组播。" + +#: ../../library/test.rst:1145 +msgid "" +"Additionally, if the :const:`~socket.SO_EXCLUSIVEADDRUSE` socket option is " +"available (i.e. on Windows), it will be set on the socket. This will " +"prevent anyone else from binding to our host/port for the duration of the " +"test." +msgstr "" +"此外,如果 :const:`~socket.SO_EXCLUSIVEADDRUSE` 套接字选项是可用的(例如在 Windows " +"上),它将在套接字上被设置。这将阻止其他任何人在测试期间绑定到我们的主机/端口。" + +#: ../../library/test.rst:1153 +msgid "" +"Bind a Unix socket, raising :exc:`unittest.SkipTest` if " +":exc:`PermissionError` is raised." +msgstr "" +"绑定一个 Unix 套接字,如果 :exc:`PermissionError` 被引发则会引发 :exc:`unittest.SkipTest`。" + +#: ../../library/test.rst:1159 +msgid "" +"A decorator for running tests that require a functional ``bind()`` for Unix " +"sockets." +msgstr "一个用于运行需要 Unix 套接字 ``bind()`` 功能的测试的装饰器。" + +#: ../../library/test.rst:1165 +msgid "" +"A context manager that raises :exc:`~test.support.ResourceDenied` when " +"various issues with the internet connection manifest themselves as " +"exceptions." +msgstr "" +"一个在互联网连接的各种问题以异常的形式表现出来时会引发 :exc:`~test.support.ResourceDenied` 的上下文管理器。" + +#: ../../library/test.rst:1171 +msgid "" +":mod:`!test.support.script_helper` --- Utilities for the Python execution " +"tests" +msgstr "" + +#: ../../library/test.rst:1177 +msgid "" +"The :mod:`!test.support.script_helper` module provides support for Python's " +"script execution tests." +msgstr "" + +#: ../../library/test.rst:1182 +msgid "" +"Return ``True`` if ``sys.executable interpreter`` requires environment " +"variables in order to be able to run at all." +msgstr "如果 ``sys.executable interpreter`` 需要环境变量才能运行则返回 ``True``。" + +#: ../../library/test.rst:1185 +msgid "" +"This is designed to be used with ``@unittest.skipIf()`` to annotate tests " +"that need to use an ``assert_python*()`` function to launch an isolated mode" +" (``-I``) or no environment mode (``-E``) sub-interpreter process." +msgstr "" +"这被设计用来配合 ``@unittest.skipIf()`` 以便标注需要使用 ``assert_python*()`` 函数来启动隔离模式 " +"(``-I``) 或无环境模式 (``-E``) 子解释器进程的测试。" + +#: ../../library/test.rst:1189 +msgid "" +"A normal build & test does not run into this situation but it can happen " +"when trying to run the standard library test suite from an interpreter that " +"doesn't have an obvious home with Python's current home finding logic." +msgstr "" +"正常的编译和测试运行不会进入这种状况但它在尝试从一个使用 Python 的当前家目录查找逻辑找不到明确的家目录的解释器运行标准库测试套件时有可能发生。" + +#: ../../library/test.rst:1193 +msgid "" +"Setting :envvar:`PYTHONHOME` is one way to get most of the testsuite to run " +"in that situation. :envvar:`PYTHONPATH` or :envvar:`PYTHONUSERSITE` are " +"other common environment variables that might impact whether or not the " +"interpreter can start." +msgstr "" +"设置 :envvar:`PYTHONHOME` 是一种能让大多数测试套件在这种情况下运行的办法。 :envvar:`PYTHONPATH` 或 " +":envvar:`PYTHONUSERSITE` 是另外两个可影响解释器是否能启动的常见环境变量。" + +#: ../../library/test.rst:1201 +msgid "" +"Set up the environment based on *env_vars* for running the interpreter in a " +"subprocess. The values can include ``__isolated``, ``__cleanenv``, " +"``__cwd``, and ``TERM``." +msgstr "" +"基于 *env_vars* 设置环境以便在子进程中运行解释器。它的值可以包括 ``__isolated``, ``__cleanenv``, " +"``__cwd`` 和 ``TERM``。" + +#: ../../library/test.rst:1205 ../../library/test.rst:1221 +#: ../../library/test.rst:1233 +msgid "The function no longer strips whitespaces from *stderr*." +msgstr "此函数不会再从 *stderr* 去除空格符。" + +#: ../../library/test.rst:1211 +msgid "" +"Assert that running the interpreter with *args* and optional environment " +"variables *env_vars* succeeds (``rc == 0``) and return a ``(return code, " +"stdout, stderr)`` tuple." +msgstr "" +"断言附带 *args* 和可选的环境变量 *env_vars* 运行解释器会成功 (``rc == 0``) 并返回一个 ``(return code," +" stdout, stderr)`` 元组。" + +#: ../../library/test.rst:1215 +msgid "" +"If the *__cleanenv* keyword-only parameter is set, *env_vars* is used as a " +"fresh environment." +msgstr "如果设置了 *__cleanenv* 仅限关键字形参,*env_vars* 会被用作一个全新的环境。" + +#: ../../library/test.rst:1218 +msgid "" +"Python is started in isolated mode (command line option ``-I``), except if " +"the *__isolated* keyword-only parameter is set to ``False``." +msgstr "" +"Python 是以隔离模式 (命令行选项 ``-I``) 启动的,除非 *__isolated* 仅限关键字形参被设为 ``False``。" + +#: ../../library/test.rst:1227 +msgid "" +"Assert that running the interpreter with *args* and optional environment " +"variables *env_vars* fails (``rc != 0``) and return a ``(return code, " +"stdout, stderr)`` tuple." +msgstr "" +"断言附带 *args* 和可选的环境变量 *env_vars* 运行解释器会失败 (``rc != 0``) 并返回一个 ``(return code," +" stdout, stderr)`` 元组。" + +#: ../../library/test.rst:1231 +msgid "See :func:`assert_python_ok` for more options." +msgstr "更多选项请参阅 :func:`assert_python_ok`。" + +#: ../../library/test.rst:1239 +msgid "Run a Python subprocess with the given arguments." +msgstr "使用给定的参数运行一个 Python 子进程。" + +#: ../../library/test.rst:1241 +msgid "" +"*kw* is extra keyword args to pass to :func:`subprocess.Popen`. Returns a " +":class:`subprocess.Popen` object." +msgstr "" +"*kw* 是要传给 :func:`subprocess.Popen` 的额外关键字参数。返回一个 :class:`subprocess.Popen` " +"对象。" + +#: ../../library/test.rst:1247 +msgid "" +"Run the given :class:`subprocess.Popen` process until completion and return " +"stdout." +msgstr "运行给定的 :class:`subprocess.Popen` 进程直至完成并返回 stdout。" + +#: ../../library/test.rst:1253 +msgid "" +"Create script containing *source* in path *script_dir* and " +"*script_basename*. If *omit_suffix* is ``False``, append ``.py`` to the " +"name. Return the full script path." +msgstr "" +"在路径 *script_dir* 和 *script_basename* 中创建包含 *source* 的脚本。如果 *omit_suffix* 为 " +"``False``,则为名称添加 ``.py``。返回完整的脚本路径。" + +#: ../../library/test.rst:1260 +msgid "" +"Create zip file at *zip_dir* and *zip_basename* with extension ``zip`` which" +" contains the files in *script_name*. *name_in_zip* is the archive name. " +"Return a tuple containing ``(full path, full path of archive name)``." +msgstr "" +"使用 *zip_dir* 和 *zip_basename* 创建扩展名为 ``zip`` 的 zip 文件,其中包含 *script_name* " +"中的文件。 *name_in_zip* 为归档名。返回一个包含 ``(full path, full path of archive name)`` " +"的元组。" + +#: ../../library/test.rst:1267 +msgid "" +"Create a directory named *pkg_dir* containing an ``__init__`` file with " +"*init_source* as its contents." +msgstr "创建一个名为 *pkg_dir* 的目录,其中包含一个 ``__init__`` 文件并以 *init_source* 作为其内容。" + +#: ../../library/test.rst:1274 +msgid "" +"Create a zip package directory with a path of *zip_dir* and *zip_basename* " +"containing an empty ``__init__`` file and a file *script_basename* " +"containing the *source*. If *compiled* is ``True``, both source files will " +"be compiled and added to the zip package. Return a tuple of the full zip " +"path and the archive name for the zip file." +msgstr "" +"使用 *zip_dir* 和 *zip_basename* 创建一个 zip 包目录,其中包含一个空的 ``__init__`` 文件和一个包含 " +"*source* 的文件 *script_basename*。如果 *compiled* 为 ``True``,则两个源文件将被编译并添加到 zip " +"包中。返回一个以完整 zip 路径和 zip 文件归档名为元素的元组。" + +#: ../../library/test.rst:1282 +msgid "" +":mod:`!test.support.bytecode_helper` --- Support tools for testing correct " +"bytecode generation" +msgstr "" + +#: ../../library/test.rst:1287 +msgid "" +"The :mod:`!test.support.bytecode_helper` module provides support for testing" +" and inspecting bytecode generation." +msgstr "" + +#: ../../library/test.rst:1292 +msgid "The module defines the following class:" +msgstr " 此模块定义了以下类:" + +#: ../../library/test.rst:1296 +msgid "This class has custom assertion methods for inspecting bytecode." +msgstr "这个类具有用于检查字节码的自定义断言。" + +#: ../../library/test.rst:1300 +msgid "Return the disassembly of *co* as string." +msgstr "以字符串形式返回 *co* 的反汇编码。" + +#: ../../library/test.rst:1305 +msgid "" +"Return instr if *opname* is found, otherwise throws :exc:`AssertionError`." +msgstr "如果找到 *opname* 则返回 instr,否则抛出 :exc:`AssertionError`。" + +#: ../../library/test.rst:1310 +msgid "Throws :exc:`AssertionError` if *opname* is found." +msgstr "如果找到 *opname* 则抛出 :exc:`AssertionError`。" + +#: ../../library/test.rst:1314 +msgid "" +":mod:`!test.support.threading_helper` --- Utilities for threading tests" +msgstr "" + +#: ../../library/test.rst:1319 +msgid "" +"The :mod:`!test.support.threading_helper` module provides support for " +"threading tests." +msgstr "" + +#: ../../library/test.rst:1326 +msgid "" +"Join a *thread* within *timeout*. Raise an :exc:`AssertionError` if thread " +"is still alive after *timeout* seconds." +msgstr "" +"在 *timeout* 秒之内合并一个 *thread*。如果线程在 *timeout* 秒后仍然存活则引发 " +":exc:`AssertionError`." + +#: ../../library/test.rst:1332 +msgid "Decorator to ensure the threads are cleaned up even if the test fails." +msgstr "用于确保即使测试失败线程仍然会被清理的装饰器。" + +#: ../../library/test.rst:1337 +msgid "" +"Context manager to start *threads*, which is a sequence of threads. *unlock*" +" is a function called after the threads are started, even if an exception " +"was raised; an example would be :meth:`threading.Event.set`. " +"``start_threads`` will attempt to join the started threads upon exit." +msgstr "" +"启动 *threads* 的上下文管理器,该参数为一个线程序列。 *unlock* " +"是一个在所有线程启动之后被调用的函数,即使引发了异常也会执行;一个例子是 :meth:`threading.Event.set`。 " +"``start_threads`` 将在退出时尝试合并已启动的线程。" + +#: ../../library/test.rst:1345 +msgid "" +"Cleanup up threads not specified in *original_values*. Designed to emit a " +"warning if a test leaves running threads in the background." +msgstr "清理未在 *original_values* 中指定的线程。被设计为如果有一个测试在后台离开正在运行的线程时会发出警告。" + +#: ../../library/test.rst:1351 +msgid "Return current thread count and copy of dangling threads." +msgstr "返回当前线程计数和悬空线程的副本。" + +#: ../../library/test.rst:1356 +msgid "" +"Context manager to wait until all threads created in the ``with`` statement " +"exit." +msgstr "等待直到 ``with`` 语句中所有已创建线程退出的上下文管理器。" + +#: ../../library/test.rst:1362 +msgid "" +"Context manager catching :class:`threading.Thread` exception using " +":func:`threading.excepthook`." +msgstr "" +"使用 :func:`threading.excepthook` 来捕获 :class:`threading.Thread` 异常的上下文管理器。" + +#: ../../library/test.rst:1365 +msgid "Attributes set when an exception is caught:" +msgstr "当异常被捕获时要设置的属性:" + +#: ../../library/test.rst:1367 +msgid "``exc_type``" +msgstr "``exc_type``" + +#: ../../library/test.rst:1368 +msgid "``exc_value``" +msgstr "``exc_value``" + +#: ../../library/test.rst:1369 +msgid "``exc_traceback``" +msgstr "``exc_traceback``" + +#: ../../library/test.rst:1370 +msgid "``thread``" +msgstr "``thread``" + +#: ../../library/test.rst:1372 +msgid "See :func:`threading.excepthook` documentation." +msgstr "参见 :func:`threading.excepthook` 文档。" + +#: ../../library/test.rst:1374 +msgid "These attributes are deleted at the context manager exit." +msgstr "这些属性在上下文管理器退出时将被删除。" + +#: ../../library/test.rst:1378 +msgid "" +"with threading_helper.catch_threading_exception() as cm:\n" +" # code spawning a thread which raises an exception\n" +" ...\n" +"\n" +" # check the thread exception, use cm attributes:\n" +" # exc_type, exc_value, exc_traceback, thread\n" +" ...\n" +"\n" +"# exc_type, exc_value, exc_traceback, thread attributes of cm no longer\n" +"# exists at this point\n" +"# (to avoid reference cycles)" +msgstr "" +"with threading_helper.catch_threading_exception() as cm:\n" +" # 生成一个引发异常的线程的代码\n" +" ...\n" +"\n" +" # 检测这个线程异常,使用 cm 的属性:\n" +" # exc_type, exc_value, exc_traceback, thread\n" +" ...\n" +"\n" +"# 此时 cm 的 exc_type, exc_value, exc_traceback, thread 属性\n" +"# 已不存在\n" +"# (以避免循环引用)" + +#: ../../library/test.rst:1395 +msgid "" +"Run the worker function concurrently in multiple threads. Re-raises an " +"exception if any thread raises one, after all threads have finished." +msgstr "在多个线程中并发运行工作函数。若任一线程引发异常,将在所有线程执行完毕后重新引发该异常。" + +#: ../../library/test.rst:1401 +msgid ":mod:`!test.support.os_helper` --- Utilities for os tests" +msgstr "" + +#: ../../library/test.rst:1406 +msgid "" +"The :mod:`!test.support.os_helper` module provides support for os tests." +msgstr ":mod:`!test.support.os_helper` 模块提供了对操作系统测试的支持。" + +#: ../../library/test.rst:1413 +msgid "A non-ASCII character encodable by :func:`os.fsencode`." +msgstr "一个可通过 :func:`os.fsencode` 编码的非 ASCII 字符。" + +#: ../../library/test.rst:1418 +msgid "Set to :func:`os.getcwd`." +msgstr "设置为 :func:`os.getcwd`。" + +#: ../../library/test.rst:1423 +msgid "" +"Set to a name that is safe to use as the name of a temporary file. Any " +"temporary file that is created should be closed and unlinked (removed)." +msgstr "设置为一个可以安全地用作临时文件名的名称。任何被创建的临时文件都应当被关闭和撤销链接(移除)。" + +#: ../../library/test.rst:1429 +msgid "" +"Set to a filename containing the :data:`FS_NONASCII` character, if it " +"exists. This guarantees that if the filename exists, it can be encoded and " +"decoded with the default filesystem encoding. This allows tests that require" +" a non-ASCII filename to be easily skipped on platforms where they can't " +"work." +msgstr "" +"如果存在的话,设置为一个包含 :data:`FS_NONASCII` 字符的文件名。这会确保当文件名存在时,它可使用默认文件系统编码格式来编码和解码。 " +"这允许需要非 ASCII 文件名的测试在其不可用的平台上被方便地跳过。" + +#: ../../library/test.rst:1437 +msgid "" +"Set to a filename (str type) that should not be able to be encoded by file " +"system encoding in strict mode. It may be ``None`` if it's not possible to " +"generate such a filename." +msgstr "设置为一个应当在严格模式下不可使用文件系统编码格式来编码的文件名(str 类型)。如果无法生成这样的文件名则可以为 ``None``。" + +#: ../../library/test.rst:1444 +msgid "" +"Set to a filename (bytes type) that should not be able to be decoded by file" +" system encoding in strict mode. It may be ``None`` if it's not possible to" +" generate such a filename." +msgstr "设置为一个应当在严格模式下不可使用文件系统编码格式来编码的文件名(bytes 类型)。如果无法生成这样的文件名则可以为 ``None``。" + +#: ../../library/test.rst:1451 +msgid "Set to a non-ASCII name for a temporary file." +msgstr "设置为用于临时文件的非 ASCII 名称。" + +#: ../../library/test.rst:1456 +msgid "" +"Class used to temporarily set or unset environment variables. Instances can" +" be used as a context manager and have a complete dictionary interface for " +"querying/modifying the underlying ``os.environ``. After exit from the " +"context manager all changes to environment variables done through this " +"instance will be rolled back." +msgstr "" +"用于临时性地设置或取消设置环境变量的类。其实例可被用作上下文管理器并具有完整的字典接口用来查询/修改下层的 ``os.environ``。 " +"在从上下文管理器退出之后所有通过此实例对环境变量进行的修改都将被回滚。" + +#: ../../library/test.rst:1462 +msgid "Added dictionary interface." +msgstr "增加了字典接口。" + +#: ../../library/test.rst:1468 +msgid "" +"Simple :term:`path-like object`. It implements the " +":meth:`~os.PathLike.__fspath__` method which just returns the *path* " +"argument. If *path* is an exception, it will be raised in " +":meth:`!__fspath__`." +msgstr "" +"简单的 :term:`path-like object`。它实现了返回 *path* 参数的 " +":meth:`~os.PathLike.__fspath__` 方法。如果 *path* 是一个异常,它将在 :meth:`!__fspath__` " +"中被引发。" + +#: ../../library/test.rst:1476 +msgid "" +"Temporarily set the environment variable ``envvar`` to the value of " +"``value``." +msgstr "临时性地将环境变量 ``envvar`` 的值设为 ``value``。" + +#: ../../library/test.rst:1482 +msgid "Temporarily unset one or more environment variables." +msgstr "临时性地取消一个或多个环境变量。" + +#: ../../library/test.rst:1484 +msgid "More than one environment variable can be unset." +msgstr "可以取消多个环境变量。" + +#: ../../library/test.rst:1490 +msgid "" +"Return ``True`` if the OS supports symbolic links, ``False`` otherwise." +msgstr "如果操作系统支持符号链接则返回 ``True``,否则返回 ``False``。" + +#: ../../library/test.rst:1496 +msgid "Return ``True`` if the OS supports xattr, ``False`` otherwise." +msgstr "如果操作系统支持 xattr 则返回 ``True``,否则返回 ``False``。" + +#: ../../library/test.rst:1502 +msgid "" +"A context manager that temporarily changes the current working directory to " +"*path* and yields the directory." +msgstr "一个临时性地将当前工作目录改为 *path* 并输出该目录的上下文管理器。" + +#: ../../library/test.rst:1505 +msgid "" +"If *quiet* is ``False``, the context manager raises an exception on error. " +"Otherwise, it issues only a warning and keeps the current working directory " +"the same." +msgstr "" +"如果 *quiet* 为 ``False``,此上下文管理器将在发生错误时引发一个异常。在其他情况下,它将只发出一个警告并将当前工作目录保持原状。" + +#: ../../library/test.rst:1512 +msgid "" +"Create an empty file with *filename*. If it already exists, truncate it." +msgstr "创建一个名为 *filename* 的空文件。如果文件已存在,则清空其内容。" + +#: ../../library/test.rst:1517 +msgid "Count the number of open file descriptors." +msgstr "统计打开的文件描述符数量。" + +#: ../../library/test.rst:1522 +msgid "" +"Return ``True`` if the file system for *directory* is case-insensitive." +msgstr "如果 *directory* 的文件系统对大小写不敏感则返回 ``True``。" + +#: ../../library/test.rst:1527 +msgid "" +"Create an invalid file descriptor by opening and closing a temporary file, " +"and returning its descriptor." +msgstr "通过打开并关闭临时文件来创建一个无效的文件描述符,并返回其描述符。" + +#: ../../library/test.rst:1533 +msgid "" +"Call :func:`os.rmdir` on *filename*. On Windows platforms, this is wrapped " +"with a wait loop that checks for the existence of the file, which is needed " +"due to antivirus programs that can hold files open and prevent deletion." +msgstr "" +"在 *filename* 上调用 :func:`os.rmdir`。在 Windows " +"平台上,这将使用一个检测文件是否存在的等待循环来包装,需要这样做是因为反病毒程序会保持文件打开并阻止其被删除。" + +#: ../../library/test.rst:1541 +msgid "" +"Call :func:`shutil.rmtree` on *path* or call :func:`os.lstat` and " +":func:`os.rmdir` to remove a path and its contents. As with :func:`rmdir`, " +"on Windows platforms this is wrapped with a wait loop that checks for the " +"existence of the files." +msgstr "" +"在 *path* 上调用 :func:`shutil.rmtree` 或者调用 :func:`os.lstat` 和 :func:`os.rmdir` " +"来移除一个路径及其内容。与 :func:`rmdir` 一样,在 Windows 平台上这将使用一个检测文件是否存在的等待循环来包装。" + +#: ../../library/test.rst:1549 +msgid "A decorator for running tests that require support for symbolic links." +msgstr "一个用于运行需要符号链接支持的测试的装饰器。" + +#: ../../library/test.rst:1554 +msgid "A decorator for running tests that require support for xattr." +msgstr "一个用于运行需要 xattr 支持的测试的装饰器。" + +#: ../../library/test.rst:1559 +msgid "" +"A context manager that temporarily creates a new directory and changes the " +"current working directory (CWD)." +msgstr "一个临时性地创建新目录并改变当前工作目录(CWD)的上下文管理器。" + +#: ../../library/test.rst:1562 +msgid "" +"The context manager creates a temporary directory in the current directory " +"with name *name* before temporarily changing the current working directory." +" If *name* is ``None``, the temporary directory is created using " +":func:`tempfile.mkdtemp`." +msgstr "" +"临时性地改变当前工作目录之前此上下文管理器会在当前目录下创建一个名为 *name* 的临时目录。如果 *name* 为 ``None``,则会使用 " +":func:`tempfile.mkdtemp` 创建临时目录。" + +#: ../../library/test.rst:1567 +msgid "" +"If *quiet* is ``False`` and it is not possible to create or change the CWD, " +"an error is raised. Otherwise, only a warning is raised and the original " +"CWD is used." +msgstr "" +"如果 *quiet* 为 ``False`` 并且无法创建或修改 CWD,则会引发一个错误。在其他情况下,只会引发一个警告并使用原始 CWD。" + +#: ../../library/test.rst:1574 +msgid "" +"A context manager that creates a temporary directory at *path* and yields " +"the directory." +msgstr "一个在 *path* 上创建临时目录并输出该目录的上下文管理器。" + +#: ../../library/test.rst:1577 +msgid "" +"If *path* is ``None``, the temporary directory is created using " +":func:`tempfile.mkdtemp`. If *quiet* is ``False``, the context manager " +"raises an exception on error. Otherwise, if *path* is specified and cannot " +"be created, only a warning is issued." +msgstr "" +"如果 *path* 为 ``None``,则会使用 :func:`tempfile.mkdtemp` 来创建临时目录。如果 *quiet* 为 " +"``False``,则该上下文管理器在发生错误时会引发一个异常。在其他情况下,如果 *path* 已被指定并且无法创建,则只会发出一个警告。" + +#: ../../library/test.rst:1585 +msgid "A context manager that temporarily sets the process umask." +msgstr "一个临时性地设置进程掩码的上下文管理器。" + +#: ../../library/test.rst:1590 +msgid "" +"Call :func:`os.unlink` on *filename*. As with :func:`rmdir`, on Windows " +"platforms, this is wrapped with a wait loop that checks for the existence of" +" the file." +msgstr "" +"在 *filename* 上调用 :func:`os.unlink`。与 :func:`rmdir` 一样,在 Windows " +"平台上这将使用一个检测文件是否存在的等待循环来包装。" + +#: ../../library/test.rst:1596 +msgid ":mod:`!test.support.import_helper` --- Utilities for import tests" +msgstr "" +":mod:`!test.support.import_helper` --- 用于导入测试的工具Utilities for import tests" + +#: ../../library/test.rst:1601 +msgid "" +"The :mod:`!test.support.import_helper` module provides support for import " +"tests." +msgstr ":mod:`!test.support.import_helper` 模块提供了对导入测试的支持。" + +#: ../../library/test.rst:1608 +msgid "" +"Remove the module named *module_name* from ``sys.modules`` and delete any " +"byte-compiled files of the module." +msgstr "从 ``sys.modules`` 移除名为 *module_name* 的模块并删除该模块的已编译字节码文件。" + +#: ../../library/test.rst:1614 +msgid "" +"This function imports and returns a fresh copy of the named Python module by" +" removing the named module from ``sys.modules`` before doing the import. " +"Note that unlike :func:`reload`, the original module is not affected by this" +" operation." +msgstr "" +"此函数会在执行导入之前通过从 ``sys.modules`` 移除指定模块来导入并返回指定 Python 模块的新副本。请注意这不同于 " +":func:`reload`,原来的模块不会受到此操作的影响。" + +#: ../../library/test.rst:1619 +msgid "" +"*fresh* is an iterable of additional module names that are also removed from" +" the ``sys.modules`` cache before doing the import." +msgstr "*fresh* 是包含在执行导入之前还要从 ``sys.modules`` 缓存中移除的附加模块名称的可迭代对象。" + +#: ../../library/test.rst:1622 +msgid "" +"*blocked* is an iterable of module names that are replaced with ``None`` in " +"the module cache during the import to ensure that attempts to import them " +"raise :exc:`ImportError`." +msgstr "" +"*blocked* 是包含模块名称的可迭代对象,导入期间在模块缓存中它会被替换为 ``None`` 以确保尝试导入将引发 " +":exc:`ImportError`." + +#: ../../library/test.rst:1626 +msgid "" +"The named module and any modules named in the *fresh* and *blocked* " +"parameters are saved before starting the import and then reinserted into " +"``sys.modules`` when the fresh import is complete." +msgstr "" +"指定名称的模块以及任何在 *fresh* 和 *blocked* 形参中指明的模块会在开始导入之前被保存并在全新导入完成时被重新插入到 " +"``sys.modules`` 中。" + +#: ../../library/test.rst:1630 +msgid "" +"Module and package deprecation messages are suppressed during this import if" +" *deprecated* is ``True``." +msgstr "如果 *deprecated* 为 ``True`` 则在此导入操作期间模块和包的弃用消息会被屏蔽。" + +#: ../../library/test.rst:1633 +msgid "" +"This function will raise :exc:`ImportError` if the named module cannot be " +"imported." +msgstr "如果指定名称的模块无法被导入则此函数将引发 :exc:`ImportError`。" + +#: ../../library/test.rst:1638 +msgid "" +"# Get copies of the warnings module for testing without affecting the\n" +"# version being used by the rest of the test suite. One copy uses the\n" +"# C implementation, the other is forced to use the pure Python fallback\n" +"# implementation\n" +"py_warnings = import_fresh_module('warnings', blocked=['_warnings'])\n" +"c_warnings = import_fresh_module('warnings', fresh=['_warnings'])" +msgstr "" +"# 获取 warnings 模块的副本用于测试而不会影响\n" +"# 测试套件的其他部分所使用的版本。一个副本\n" +"# 使用 C 实现,另一个被强制使用纯 Python 的\n" +"# 回退实现\n" +"py_warnings = import_fresh_module('warnings', blocked=['_warnings'])\n" +"c_warnings = import_fresh_module('warnings', fresh=['_warnings'])" + +#: ../../library/test.rst:1650 +msgid "" +"This function imports and returns the named module. Unlike a normal import, " +"this function raises :exc:`unittest.SkipTest` if the module cannot be " +"imported." +msgstr "此函数会导入并返回指定名称的模块。不同于正常的导入,如果模块无法被导入则此函数将引发 :exc:`unittest.SkipTest`。" + +#: ../../library/test.rst:1654 +msgid "" +"Module and package deprecation messages are suppressed during this import if" +" *deprecated* is ``True``. If a module is required on a platform but " +"optional for others, set *required_on* to an iterable of platform prefixes " +"which will be compared against :data:`sys.platform`." +msgstr "" +"如果 *deprecated* 为 ``True`` 则在此导入操作期间模块和包的弃用消息会被屏蔽。 " +"如果某个模块在特定平台上是必需的而在其他平台上是可选的,请为包含平台前缀的可迭代对象设置 *required_on*,此对象将与 " +":data:`sys.platform` 进行比对。" + +#: ../../library/test.rst:1664 +msgid "Return a copy of :data:`sys.modules`." +msgstr "返回 :data:`sys.modules` 的副本。" + +#: ../../library/test.rst:1669 +msgid "" +"Remove modules except for *oldmodules* and ``encodings`` in order to " +"preserve internal cache." +msgstr "移除 *oldmodules* 和 ``encodings`` 以外的模块以保留内部缓冲区。" + +#: ../../library/test.rst:1675 +msgid "Delete *name* from ``sys.modules``." +msgstr "从 ``sys.modules`` 中删除 *name*。" + +#: ../../library/test.rst:1680 +msgid "" +"Move a :pep:`3147`/:pep:`488` pyc file to its legacy pyc location and return" +" the file system path to the legacy pyc file. The *source* value is the " +"file system path to the source file. It does not need to exist, however the" +" PEP 3147/488 pyc file must exist." +msgstr "" +"将 :pep:`3147`/:pep:`488` pyc 文件移至旧版 pyc 位置并返回该旧版 pyc 文件的文件系统路径。 *source* " +"的值是源文件的文件系统路径。它不必真实存在,但是 PEP 3147/488 pyc 文件必须存在。" + +#: ../../library/test.rst:1688 +msgid "" +"A context manager to force import to return a new module reference. This is" +" useful for testing module-level behaviors, such as the emission of a " +":exc:`DeprecationWarning` on import. Example usage::" +msgstr "" +"强制导入以返回一个新的模块引用的上下文管理器。这适用于测试模块层级的行为,例如在导入时发出 :exc:`DeprecationWarning`。 " +"示例用法::" + +#: ../../library/test.rst:1692 +msgid "" +"with CleanImport('foo'):\n" +" importlib.import_module('foo') # New reference." +msgstr "" +"with CleanImport('foo'):\n" +" importlib.import_module('foo') # 新引用" + +#: ../../library/test.rst:1698 +msgid "A context manager to temporarily add directories to :data:`sys.path`." +msgstr "一个临时性地向 :data:`sys.path` 添加目录的上下文管理器。" + +#: ../../library/test.rst:1700 +msgid "" +"This makes a copy of :data:`sys.path`, appends any directories given as " +"positional arguments, then reverts :data:`sys.path` to the copied settings " +"when the context ends." +msgstr "" +"这将创建 :data:`sys.path` 的一个副本,添加作为位置参数传入的任何目录,然后在上下文结束时将 :data:`sys.path` " +"还原到副本的设置。" + +#: ../../library/test.rst:1704 +msgid "" +"Note that *all* :data:`sys.path` modifications in the body of the context " +"manager, including replacement of the object, will be reverted at the end of" +" the block." +msgstr "请注意该上下文管理器代码块中 *所有* 对 :data:`sys.path` 的修改,包括对象的替换,都将在代码块结束时被还原。" + +#: ../../library/test.rst:1710 +msgid ":mod:`!test.support.warnings_helper` --- Utilities for warnings tests" +msgstr "" +":mod:`!test.support.warnings_helper` --- 用于警告测试的工具Utilities for warnings " +"tests" + +#: ../../library/test.rst:1715 +msgid "" +"The :mod:`!test.support.warnings_helper` module provides support for " +"warnings tests." +msgstr ":mod:`!test.support.warnings_helper` 模块提供了对警告测试的支持。" + +#: ../../library/test.rst:1722 +msgid "" +"Suppress warnings that are instances of *category*, which must be " +":exc:`Warning` or a subclass. Roughly equivalent to " +":func:`warnings.catch_warnings` with :meth:`warnings.simplefilter('ignore', " +"category=category) `. For example::" +msgstr "" +"抑制作为 *category* 实例的警告,它必须为 :exc:`Warning` 或其子类。大致等价于 " +":func:`warnings.catch_warnings` 设置 :meth:`warnings.simplefilter('ignore', " +"category=category) `。例如::" + +#: ../../library/test.rst:1728 +msgid "" +"@warning_helper.ignore_warnings(category=DeprecationWarning)\n" +"def test_suppress_warning():\n" +" # do something" +msgstr "" +"@warning_helper.ignore_warnings(category=DeprecationWarning)\n" +"def test_suppress_warning():\n" +" # 做些什么" + +#: ../../library/test.rst:1737 +msgid "" +"Context manager to check that no :exc:`ResourceWarning` was raised. You " +"must remove the object which may emit :exc:`ResourceWarning` before the end " +"of the context manager." +msgstr "" +"检测是否没有任何 :exc:`ResourceWarning` 被引发的上下文管理器。你必须在该上下文管理器结束之前移除可能发出 " +":exc:`ResourceWarning` 的对象。" + +#: ../../library/test.rst:1744 +msgid "" +"Test for syntax warning in *statement* by attempting to compile *statement*." +" Test also that the :exc:`SyntaxWarning` is emitted only once, and that it " +"will be converted to a :exc:`SyntaxError` when turned into error. *testcase*" +" is the :mod:`unittest` instance for the test. *errtext* is the regular " +"expression which should match the string representation of the emitted " +":exc:`SyntaxWarning` and raised :exc:`SyntaxError`. If *lineno* is not " +"``None``, compares to the line of the warning and exception. If *offset* is " +"not ``None``, compares to the offset of the exception." +msgstr "" +"用于通过尝试编译 *statement* 来测试 *statement* 中的语法警告。还会测试 :exc:`SyntaxWarning` " +"是否只发出了一次,以及它在转成错误时是否将被转换为 :exc:`SyntaxError`。 *testcase* 是用于测试的 " +":mod:`unittest` 实例。 *errtext* 是应当匹配所发出的 :exc:`SyntaxWarning` 以及所引发的 " +":exc:`SyntaxError` 的字符串表示形式的正则表达式。如果 *lineno* 不为 ``None``,则与警告和异常所在的行进行比较。 " +"如果 *offset* 不为 ``None``,则与异常的偏移量进行比较。" + +#: ../../library/test.rst:1758 +msgid "" +"A convenience wrapper for :func:`warnings.catch_warnings` that makes it " +"easier to test that a warning was correctly raised. It is approximately " +"equivalent to calling ``warnings.catch_warnings(record=True)`` with " +":meth:`warnings.simplefilter` set to ``always`` and with the option to " +"automatically validate the results that are recorded." +msgstr "" +"一个用于 :func:`warnings.catch_warnings` 以更容易地测试特定警告是否被正确引发的便捷包装器。它大致等价于调用 " +"``warnings.catch_warnings(record=True)`` 并将 :meth:`warnings.simplefilter` 设为" +" ``always`` 并附带自动验证已记录结果的选项。" + +#: ../../library/test.rst:1764 +msgid "" +"``check_warnings`` accepts 2-tuples of the form ``(\"message regexp\", " +"WarningCategory)`` as positional arguments. If one or more *filters* are " +"provided, or if the optional keyword argument *quiet* is ``False``, it " +"checks to make sure the warnings are as expected: each specified filter " +"must match at least one of the warnings raised by the enclosed code or the " +"test fails, and if any warnings are raised that do not match any of the " +"specified filters the test fails. To disable the first of these checks, set" +" *quiet* to ``True``." +msgstr "" +"``check_warnings`` 接受 ``(\"message regexp\", WarningCategory)`` 形式的 2 " +"元组作为位置参数。如果提供了一个或多个 *filters*,或者如果可选的关键字参数 *quiet* 为 " +"``False``,则它会检查确认警告是符合预期的:每个已指定的过滤器必须匹配至少一个被包围的代码或测试失败时引发的警告,并且如果有任何未能匹配已指定过滤器的警告被引发则测试将失败。" +" 要禁用这些检查中的第一项,请将 *quiet* 设为 ``True``。" + +#: ../../library/test.rst:1773 +msgid "If no arguments are specified, it defaults to::" +msgstr "如果未指定任何参数,则默认为::" + +#: ../../library/test.rst:1775 +msgid "check_warnings((\"\", Warning), quiet=True)" +msgstr "check_warnings((\"\", Warning), quiet=True)" + +#: ../../library/test.rst:1777 +msgid "In this case all warnings are caught and no errors are raised." +msgstr "在此情况下所有警告都会被捕获而不会引发任何错误。" + +#: ../../library/test.rst:1779 +msgid "" +"On entry to the context manager, a :class:`WarningRecorder` instance is " +"returned. The underlying warnings list from :func:`~warnings.catch_warnings`" +" is available via the recorder object's :attr:`warnings` attribute. As a " +"convenience, the attributes of the object representing the most recent " +"warning can also be accessed directly through the recorder object (see " +"example below). If no warning has been raised, then any of the attributes " +"that would otherwise be expected on an object representing a warning will " +"return ``None``." +msgstr "" +"在进入该上下文管理器时,将返回一个 :class:`WarningRecorder` 实例。来自 " +":func:`~warnings.catch_warnings` 的下层警告列表可通过该记录器对象的 :attr:`warnings` 属性来访问。 " +"作为一个便捷方式,该对象中代表最近的警告的属性也可通过该记录器对象来直接访问(参见以下示例)。 " +"如果未引发任何警告,则在其他情况下预期代表一个警告的任何对象属性都将返回 ``None``。" + +#: ../../library/test.rst:1788 +msgid "" +"The recorder object also has a :meth:`reset` method, which clears the " +"warnings list." +msgstr "该记录器对象还有一个 :meth:`reset` 方法,该方法会清空警告列表。" + +#: ../../library/test.rst:1791 +msgid "The context manager is designed to be used like this::" +msgstr "该上下文管理器被设计为像这样来使用::" + +#: ../../library/test.rst:1793 +msgid "" +"with check_warnings((\"assertion is always true\", SyntaxWarning),\n" +" (\"\", UserWarning)):\n" +" exec('assert(False, \"Hey!\")')\n" +" warnings.warn(UserWarning(\"Hide me!\"))" +msgstr "" +"with check_warnings((\"assertion is always true\", SyntaxWarning),\n" +" (\"\", UserWarning)):\n" +" exec('assert(False, \"Hey!\")')\n" +" warnings.warn(UserWarning(\"Hide me!\"))" + +#: ../../library/test.rst:1798 +msgid "" +"In this case if either warning was not raised, or some other warning was " +"raised, :func:`check_warnings` would raise an error." +msgstr "在此情况下如果两个警告都未被引发,或是引发了其他的警告,则 :func:`check_warnings` 将会引发一个错误。" + +#: ../../library/test.rst:1801 +msgid "" +"When a test needs to look more deeply into the warnings, rather than just " +"checking whether or not they occurred, code like this can be used::" +msgstr "当一个测试需要更深入地查看这些警告,而不是仅仅检查它们是否发生时,可以使用这样的代码::" + +#: ../../library/test.rst:1804 +msgid "" +"with check_warnings(quiet=True) as w:\n" +" warnings.warn(\"foo\")\n" +" assert str(w.args[0]) == \"foo\"\n" +" warnings.warn(\"bar\")\n" +" assert str(w.args[0]) == \"bar\"\n" +" assert str(w.warnings[0].args[0]) == \"foo\"\n" +" assert str(w.warnings[1].args[0]) == \"bar\"\n" +" w.reset()\n" +" assert len(w.warnings) == 0" +msgstr "" +"with check_warnings(quiet=True) as w:\n" +" warnings.warn(\"foo\")\n" +" assert str(w.args[0]) == \"foo\"\n" +" warnings.warn(\"bar\")\n" +" assert str(w.args[0]) == \"bar\"\n" +" assert str(w.warnings[0].args[0]) == \"foo\"\n" +" assert str(w.warnings[1].args[0]) == \"bar\"\n" +" w.reset()\n" +" assert len(w.warnings) == 0" + +#: ../../library/test.rst:1815 +msgid "" +"Here all warnings will be caught, and the test code tests the captured " +"warnings directly." +msgstr "在这里所有的警告都将被捕获,而测试代码会直接测试被捕获的警告。" + +#: ../../library/test.rst:1818 +msgid "New optional arguments *filters* and *quiet*." +msgstr "新增可选参数 *filters* 和 *quiet*。" + +#: ../../library/test.rst:1824 +msgid "" +"Class used to record warnings for unit tests. See documentation of " +":func:`check_warnings` above for more details." +msgstr "用于为单元测试记录警告的类。请参阅以上 :func:`check_warnings` 的文档来了解详情。" diff --git a/library/text.po b/library/text.po new file mode 100644 index 0000000000..ea61cadd92 --- /dev/null +++ b/library/text.po @@ -0,0 +1,41 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/text.rst:6 +msgid "Text Processing Services" +msgstr "文本处理服务" + +#: ../../library/text.rst:8 +msgid "" +"The modules described in this chapter provide a wide range of string " +"manipulation operations and other text processing services." +msgstr "本章介绍的模块提供了广泛的字符串操作和其他文本处理服务。" + +#: ../../library/text.rst:11 +msgid "" +"The :mod:`codecs` module described under :ref:`binaryservices` is also " +"highly relevant to text processing. In addition, see the documentation for " +"Python's built-in string type in :ref:`textseq`." +msgstr "" +"在 :ref:`binaryservices` 之下描述的 :mod:`codecs` 模块也与文本处理高度相关。此外也请参阅 Python " +"内置字符串类型的文档 :ref:`textseq`。" diff --git a/library/textwrap.po b/library/textwrap.po new file mode 100644 index 0000000000..5e201189d7 --- /dev/null +++ b/library/textwrap.po @@ -0,0 +1,471 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/textwrap.rst:2 +msgid ":mod:`!textwrap` --- Text wrapping and filling" +msgstr ":mod:`!textwrap` --- 文本自动换行与填充" + +#: ../../library/textwrap.rst:10 +msgid "**Source code:** :source:`Lib/textwrap.py`" +msgstr "**源代码:** :source:`Lib/textwrap.py`" + +#: ../../library/textwrap.rst:14 +msgid "" +"The :mod:`!textwrap` module provides some convenience functions, as well as " +":class:`TextWrapper`, the class that does all the work. If you're just " +"wrapping or filling one or two text strings, the convenience functions " +"should be good enough; otherwise, you should use an instance of " +":class:`TextWrapper` for efficiency." +msgstr "" +":mod:`!textwrap` 模块提供了一些便捷函数,以及 :class:`TextWrapper`——负责完成所有工作的类。 " +"如果你只是要对一两个文本字符串进行自动换行或填充,便捷函数应该就够用了;否则的话,你应该使用 :class:`TextWrapper` " +"的实例来提高效率。" + +#: ../../library/textwrap.rst:27 +msgid "" +"Wraps the single paragraph in *text* (a string) so every line is at most " +"*width* characters long. Returns a list of output lines, without final " +"newlines." +msgstr "对 *text* (字符串) 中的单独段落自动换行以使每行长度最多为 *width* 个字符。返回由输出行组成的列表,行尾不带换行符。" + +#: ../../library/textwrap.rst:31 +msgid "" +"Optional keyword arguments correspond to the instance attributes of " +":class:`TextWrapper`, documented below." +msgstr "与 :class:`TextWrapper` 的实例属性对应的可选的关键字参数,具体文档见下。" + +#: ../../library/textwrap.rst:34 +msgid "" +"See the :meth:`TextWrapper.wrap` method for additional details on how " +":func:`wrap` behaves." +msgstr "请参阅 :meth:`TextWrapper.wrap` 方法了解有关 :func:`wrap` 行为的详细信息。" + +#: ../../library/textwrap.rst:45 +msgid "" +"Wraps the single paragraph in *text*, and returns a single string containing" +" the wrapped paragraph. :func:`fill` is shorthand for ::" +msgstr "对 *text* 中的单独段落自动换行,并返回一个包含被自动换行段落的单独字符串。 :func:`fill` 是以下语句的快捷方式 ::" + +#: ../../library/textwrap.rst:48 +msgid "\"\\n\".join(wrap(text, ...))" +msgstr "\"\\n\".join(wrap(text, ...))" + +#: ../../library/textwrap.rst:50 +msgid "" +"In particular, :func:`fill` accepts exactly the same keyword arguments as " +":func:`wrap`." +msgstr "特别要说明的是,:func:`fill` 接受与 :func:`wrap` 完全相同的关键字参数。" + +#: ../../library/textwrap.rst:58 +msgid "Collapse and truncate the given *text* to fit in the given *width*." +msgstr "折叠并截短给定的 *text* 以符合给定的 *width*。" + +#: ../../library/textwrap.rst:60 +msgid "" +"First the whitespace in *text* is collapsed (all whitespace is replaced by " +"single spaces). If the result fits in the *width*, it is returned. " +"Otherwise, enough words are dropped from the end so that the remaining words" +" plus the *placeholder* fit within *width*::" +msgstr "" +"首先 *text* 中的空白符会被折叠(所有连续空白符会替换为单个空格)。如果结果能适合 *width*,它将被返回。 " +"在其他情况下,将在末尾丢弃足够数量的单词以使剩余的单词加 *placeholder* 能适合 *width*::" + +#: ../../library/textwrap.rst:65 +msgid "" +">>> textwrap.shorten(\"Hello world!\", width=12)\n" +"'Hello world!'\n" +">>> textwrap.shorten(\"Hello world!\", width=11)\n" +"'Hello [...]'\n" +">>> textwrap.shorten(\"Hello world\", width=10, placeholder=\"...\")\n" +"'Hello...'" +msgstr "" +">>> textwrap.shorten(\"Hello world!\", width=12)\n" +"'Hello world!'\n" +">>> textwrap.shorten(\"Hello world!\", width=11)\n" +"'Hello [...]'\n" +">>> textwrap.shorten(\"Hello world\", width=10, placeholder=\"...\")\n" +"'Hello...'" + +#: ../../library/textwrap.rst:72 +msgid "" +"Optional keyword arguments correspond to the instance attributes of " +":class:`TextWrapper`, documented below. Note that the whitespace is " +"collapsed before the text is passed to the :class:`TextWrapper` :meth:`fill`" +" function, so changing the value of :attr:`.tabsize`, :attr:`.expand_tabs`, " +":attr:`.drop_whitespace`, and :attr:`.replace_whitespace` will have no " +"effect." +msgstr "" +"可选的关键字参数对应于 :class:`TextWrapper` 的实例属性,具体见下文。请注意文本在被传入 :class:`TextWrapper` " +"的 :meth:`fill` 函数之前会被折叠,因此改变 :attr:`.tabsize`, :attr:`.expand_tabs`, " +":attr:`.drop_whitespace` 和 :attr:`.replace_whitespace` 的值将没有任何效果。" + +#: ../../library/textwrap.rst:82 +msgid "Remove any common leading whitespace from every line in *text*." +msgstr "移除 *text* 中每一行的任何相同前缀空白符。" + +#: ../../library/textwrap.rst:84 +msgid "" +"This can be used to make triple-quoted strings line up with the left edge of" +" the display, while still presenting them in the source code in indented " +"form." +msgstr "这可以用来清除三重引号字符串行左侧空格,而仍然在源码中显示为缩进格式。" + +#: ../../library/textwrap.rst:87 +msgid "" +"Note that tabs and spaces are both treated as whitespace, but they are not " +"equal: the lines ``\" hello\"`` and ``\"\\thello\"`` are considered to have" +" no common leading whitespace." +msgstr "" +"请注意制表符和空格符都被视为是空白符,但它们并不相等:以下两行 ``\" hello\"`` 和 ``\"\\thello\"`` " +"不会被视为具有相同的前缀空白符。" + +#: ../../library/textwrap.rst:91 +msgid "" +"Lines containing only whitespace are ignored in the input and normalized to " +"a single newline character in the output." +msgstr "只包含空白符的行会在输入时被忽略并在输出时被标准化为单个换行符。" + +#: ../../library/textwrap.rst:94 ../../library/textwrap.rst:119 +msgid "For example::" +msgstr "例如::" + +#: ../../library/textwrap.rst:96 +msgid "" +"def test():\n" +" # end first line with \\ to avoid the empty line!\n" +" s = '''\\\n" +" hello\n" +" world\n" +" '''\n" +" print(repr(s)) # prints ' hello\\n world\\n '\n" +" print(repr(dedent(s))) # prints 'hello\\n world\\n'" +msgstr "" +"def test():\n" +" # 第一行以 \\ 结束以避免出现空行!\n" +" s = '''\\\n" +" hello\n" +" world\n" +" '''\n" +" print(repr(s)) # prints ' hello\\n world\\n '\n" +" print(repr(dedent(s))) # prints 'hello\\n world\\n'" + +#: ../../library/textwrap.rst:105 +msgid "" +"The :func:`!dedent` function now correctly normalizes blank lines containing" +" only whitespace characters. Previously, the implementation only normalized " +"blank lines containing tabs and spaces." +msgstr "现在 :func:`!dedent` 函数将能正确地规范化仅包含空白符的空行。在之前版本中,其实现只能规范化包含制表符和空格符的空行。" + +#: ../../library/textwrap.rst:112 +msgid "Add *prefix* to the beginning of selected lines in *text*." +msgstr "将 *prefix* 添加到 *text* 中选定行的开头。" + +#: ../../library/textwrap.rst:114 +msgid "Lines are separated by calling ``text.splitlines(True)``." +msgstr "通过调用 ``text.splitlines(True)`` 来对行进行拆分。" + +#: ../../library/textwrap.rst:116 +msgid "" +"By default, *prefix* is added to all lines that do not consist solely of " +"whitespace (including any line endings)." +msgstr "默认情况下,*prefix* 会被添加到所有不是只由空白符(包括任何行结束符)组成的行。" + +#: ../../library/textwrap.rst:121 +msgid "" +">>> s = 'hello\\n\\n \\nworld'\n" +">>> indent(s, ' ')\n" +"' hello\\n\\n \\n world'" +msgstr "" +">>> s = 'hello\\n\\n \\nworld'\n" +">>> indent(s, ' ')\n" +"' hello\\n\\n \\n world'" + +#: ../../library/textwrap.rst:125 +msgid "" +"The optional *predicate* argument can be used to control which lines are " +"indented. For example, it is easy to add *prefix* to even empty and " +"whitespace-only lines::" +msgstr "可选的 *predicate* 参数可用来控制哪些行要缩进。例如,可以很容易地为空行或只有空白符的行添加 *prefix*::" + +#: ../../library/textwrap.rst:129 +msgid "" +">>> print(indent(s, '+ ', lambda line: True))\n" +"+ hello\n" +"+\n" +"+\n" +"+ world" +msgstr "" +">>> print(indent(s, '+ ', lambda line: True))\n" +"+ hello\n" +"+\n" +"+\n" +"+ world" + +#: ../../library/textwrap.rst:138 +msgid "" +":func:`wrap`, :func:`fill` and :func:`shorten` work by creating a " +":class:`TextWrapper` instance and calling a single method on it. That " +"instance is not reused, so for applications that process many text strings " +"using :func:`wrap` and/or :func:`fill`, it may be more efficient to create " +"your own :class:`TextWrapper` object." +msgstr "" +":func:`wrap`, :func:`fill` 和 :func:`shorten` 的作用方式为创建一个 :class:`TextWrapper`" +" 实例并在其上调用单个方法。该实例不会被重用,因此对于要使用 :func:`wrap` 和/或 :func:`fill` " +"来处理许多文本字符串的应用来说,创建你自己的 :class:`TextWrapper` 对象可能会更有效率。" + +#: ../../library/textwrap.rst:144 +msgid "" +"Text is preferably wrapped on whitespaces and right after the hyphens in " +"hyphenated words; only then will long words be broken if necessary, unless " +":attr:`TextWrapper.break_long_words` is set to false." +msgstr "" +"文本最好在空白符位置自动换行,包括带连字符单词的连字符之后;长单词仅在必要时会被拆分,除非 " +":attr:`TextWrapper.break_long_words` 被设为假值。" + +#: ../../library/textwrap.rst:150 +msgid "" +"The :class:`TextWrapper` constructor accepts a number of optional keyword " +"arguments. Each keyword argument corresponds to an instance attribute, so " +"for example ::" +msgstr ":class:`TextWrapper` 构造器接受多个可选的关键字参数。每个关键字参数对应一个实例属性,比如说 ::" + +#: ../../library/textwrap.rst:154 +msgid "wrapper = TextWrapper(initial_indent=\"* \")" +msgstr "wrapper = TextWrapper(initial_indent=\"* \")" + +#: ../../library/textwrap.rst:156 +msgid "is the same as ::" +msgstr "相当于:" + +#: ../../library/textwrap.rst:158 +msgid "" +"wrapper = TextWrapper()\n" +"wrapper.initial_indent = \"* \"" +msgstr "" +"wrapper = TextWrapper()\n" +"wrapper.initial_indent = \"* \"" + +#: ../../library/textwrap.rst:161 +msgid "" +"You can reuse the same :class:`TextWrapper` object many times, and you can " +"change any of its options through direct assignment to instance attributes " +"between uses." +msgstr "你可以多次重用相同的 :class:`TextWrapper` 对象,并且你也可以在使用期间通过直接向实例属性赋值来修改它的任何选项。" + +#: ../../library/textwrap.rst:165 +msgid "" +"The :class:`TextWrapper` instance attributes (and keyword arguments to the " +"constructor) are as follows:" +msgstr ":class:`TextWrapper` 的实例属性(以及构造器的关键字参数)如下所示:" + +#: ../../library/textwrap.rst:171 +msgid "" +"(default: ``70``) The maximum length of wrapped lines. As long as there are" +" no individual words in the input text longer than :attr:`width`, " +":class:`TextWrapper` guarantees that no output line will be longer than " +":attr:`width` characters." +msgstr "" +"(默认:``70``) 自动换行的最大行长度。只要输入文本中没有长于 :attr:`width` 的单个单词,:class:`TextWrapper` " +"就能保证没有长于 :attr:`width` 个字符的输出行。" + +#: ../../library/textwrap.rst:179 +msgid "" +"(default: ``True``) If true, then all tab characters in *text* will be " +"expanded to spaces using the :meth:`~str.expandtabs` method of *text*." +msgstr "" +"(默认值:``True``) 如果为真值,则 *text* 中的所有制表符将使用 *text* 的 :meth:`~str.expandtabs` " +"方法扩展为空格符。" + +#: ../../library/textwrap.rst:185 +msgid "" +"(default: ``8``) If :attr:`expand_tabs` is true, then all tab characters in " +"*text* will be expanded to zero or more spaces, depending on the current " +"column and the given tab size." +msgstr "" +"(默认:``8``) 如果 :attr:`expand_tabs` 为真值,则 *text* " +"中所有的制表符将扩展为零个或多个空格,具体取决于当前列位置和给定的制表宽度。" + +#: ../../library/textwrap.rst:194 +msgid "" +"(default: ``True``) If true, after tab expansion but before wrapping, the " +":meth:`wrap` method will replace each whitespace character with a single " +"space. The whitespace characters replaced are as follows: tab, newline, " +"vertical tab, formfeed, and carriage return (``'\\t\\n\\v\\f\\r'``)." +msgstr "" +"(默认:``True``) 如果为真值,在制表符扩展之后、自动换行之前,:meth:`wrap` 方法将把每个空白字符都替换为单个空格。 " +"会被替换的空白字符如下:制表,换行,垂直制表,进纸和回车 (``'\\t\\n\\v\\f\\r'``)。" + +#: ../../library/textwrap.rst:202 +msgid "" +"If :attr:`expand_tabs` is false and :attr:`replace_whitespace` is true, each" +" tab character will be replaced by a single space, which is *not* the same " +"as tab expansion." +msgstr "" +"如果 :attr:`expand_tabs` 为假值且 :attr:`replace_whitespace` " +"为真值,每个制表符将被替换为单个空格,这与制表符扩展是 *不* 一样的。" + +#: ../../library/textwrap.rst:208 +msgid "" +"If :attr:`replace_whitespace` is false, newlines may appear in the middle of" +" a line and cause strange output. For this reason, text should be split into" +" paragraphs (using :meth:`str.splitlines` or similar) which are wrapped " +"separately." +msgstr "" +"如果 :attr:`replace_whitespace` 为假值,在一行的中间有可能出现换行符并导致怪异的输出。因此,文本应当(使用 " +":meth:`str.splitlines` 或类似方法)拆分为段落并分别进行自动换行。" + +#: ../../library/textwrap.rst:216 +msgid "" +"(default: ``True``) If true, whitespace at the beginning and ending of every" +" line (after wrapping but before indenting) is dropped. Whitespace at the " +"beginning of the paragraph, however, is not dropped if non-whitespace " +"follows it. If whitespace being dropped takes up an entire line, the whole " +"line is dropped." +msgstr "" +"(默认:``True``) 如果为真值,每一行开头和末尾的空白字符(在包装之后、缩进之前)会被丢弃。 " +"但是段落开头的空白字符如果后面不带任何非空白字符则不会被丢弃。如果被丢弃的空白字符占据了一个整行,则该整行将被丢弃。" + +#: ../../library/textwrap.rst:225 +msgid "" +"(default: ``''``) String that will be prepended to the first line of wrapped" +" output. Counts towards the length of the first line. The empty string is " +"not indented." +msgstr "(默认:``''``) 将被添加到被自动换行输出内容的第一行的字符串。其长度会被计入第一行的长度。空字符串不会被缩进。" + +#: ../../library/textwrap.rst:232 +msgid "" +"(default: ``''``) String that will be prepended to all lines of wrapped " +"output except the first. Counts towards the length of each line except the " +"first." +msgstr "(默认:``''``) 将被添加到被自动换行输出内容除第一行外的所有行的字符串。其长度会被计入除第一行外的所有行的长度。" + +#: ../../library/textwrap.rst:239 +msgid "" +"(default: ``False``) If true, :class:`TextWrapper` attempts to detect " +"sentence endings and ensure that sentences are always separated by exactly " +"two spaces. This is generally desired for text in a monospaced font. " +"However, the sentence detection algorithm is imperfect: it assumes that a " +"sentence ending consists of a lowercase letter followed by one of ``'.'``, " +"``'!'``, or ``'?'``, possibly followed by one of ``'\"'`` or ``\"'\"``, " +"followed by a space. One problem with this algorithm is that it is unable " +"to detect the difference between \"Dr.\" in ::" +msgstr "" +"(默认值: ``False``) 如果为真值,:class:`TextWrapper` 将尝试检测句子结尾并确保句子间总是以恰好两个空格符分隔。 " +"对于使用等宽字体的文本来说通常都需要这样。 但是句子检测算法并不完美:它假定句子结尾是一个小写字母加字符 ``'.'``, ``'!'`` 或 " +"``'?'`` 之一,并可能跟一个 ``'\"'`` 或 ``\"'\"``,再跟一个空格。 此算法的一个问题是它无法区分以下文本中的 “Dr.” ::" + +#: ../../library/textwrap.rst:248 +msgid "[...] Dr. Frankenstein's monster [...]" +msgstr "[...] Dr. Frankenstein's monster [...]" + +#: ../../library/textwrap.rst:250 +msgid "and \"Spot.\" in ::" +msgstr "和以下文本中的 “Spot.” ::" + +#: ../../library/textwrap.rst:252 +msgid "[...] See Spot. See Spot run [...]" +msgstr "[...] See Spot. See Spot run [...]" + +#: ../../library/textwrap.rst:254 +msgid ":attr:`fix_sentence_endings` is false by default." +msgstr ":attr:`fix_sentence_endings` 默认为假值。" + +#: ../../library/textwrap.rst:256 +msgid "" +"Since the sentence detection algorithm relies on ``string.lowercase`` for " +"the definition of \"lowercase letter\", and a convention of using two spaces" +" after a period to separate sentences on the same line, it is specific to " +"English-language texts." +msgstr "" +"由于句子检测算法依赖于 ``string.lowercase`` " +"来确定“小写字母”,以及约定在句点后使用两个空格来分隔处于同一行的句子,因此只适用于英语文本。" + +#: ../../library/textwrap.rst:264 +msgid "" +"(default: ``True``) If true, then words longer than :attr:`width` will be " +"broken in order to ensure that no lines are longer than :attr:`width`. If " +"it is false, long words will not be broken, and some lines may be longer " +"than :attr:`width`. (Long words will be put on a line by themselves, in " +"order to minimize the amount by which :attr:`width` is exceeded.)" +msgstr "" +"(默认:``True``) 如果为真值,则长度超过 :attr:`width` 的单词将被分开以保证行的长度不会超过 :attr:`width`。 " +"如果为假值,超长单词不会被分开,因而某些行的长度可能会超过 :attr:`width`。 (超长单词将被单独作为一行,以尽量减少超出 " +":attr:`width` 的情况。)" + +#: ../../library/textwrap.rst:273 +msgid "" +"(default: ``True``) If true, wrapping will occur preferably on whitespaces " +"and right after hyphens in compound words, as it is customary in English. If" +" false, only whitespaces will be considered as potentially good places for " +"line breaks, but you need to set :attr:`break_long_words` to false if you " +"want truly insecable words. Default behaviour in previous versions was to " +"always allow breaking hyphenated words." +msgstr "" +"(默认:``True``) 如果为真值,将根据英语的惯例首选在空白符和复合词的连字符之后自动换行。 " +"如果为假值,则只有空白符会被视为合适的潜在断行位置,但如果你确实不希望出现分开的单词则你必须将 :attr:`break_long_words` " +"设为假值。之前版本的默认行为总是允许分开带有连字符的单词。" + +#: ../../library/textwrap.rst:283 +msgid "" +"(default: ``None``) If not ``None``, then the output will contain at most " +"*max_lines* lines, with *placeholder* appearing at the end of the output." +msgstr "" +"(默认:``None``) 如果不为 ``None``,则输出内容将最多包含 *max_lines* 行,并使 *placeholder* " +"出现在输出内容的末尾。" + +#: ../../library/textwrap.rst:293 +msgid "" +"(default: ``' [...]'``) String that will appear at the end of the output " +"text if it has been truncated." +msgstr "(默认:``' [...]'``) 该文本将在输出文本被截短时出现在文本末尾。" + +#: ../../library/textwrap.rst:299 +msgid "" +":class:`TextWrapper` also provides some public methods, analogous to the " +"module-level convenience functions:" +msgstr ":class:`TextWrapper` 还提供了一些公有方法,类似于模块层级的便捷函数:" + +#: ../../library/textwrap.rst:304 +msgid "" +"Wraps the single paragraph in *text* (a string) so every line is at most " +":attr:`width` characters long. All wrapping options are taken from instance" +" attributes of the :class:`TextWrapper` instance. Returns a list of output " +"lines, without final newlines. If the wrapped output has no content, the " +"returned list is empty." +msgstr "" +"对 *text* (字符串) 中的单独段落自动换行以使每行长度最多为 :attr:`width` 个字符。所有自动换行选项均获取自 " +":class:`TextWrapper` 实例的实例属性。返回由输出行组成的列表,行尾不带换行符。如果自动换行输出结果没有任何内容,则返回空列表。" + +#: ../../library/textwrap.rst:313 +msgid "" +"Wraps the single paragraph in *text*, and returns a single string containing" +" the wrapped paragraph." +msgstr "对 *text* 中的单独段落自动换行并返回包含被自动换行段落的单独字符串。" + +#: ../../library/textwrap.rst:289 +msgid "..." +msgstr "..." + +#: ../../library/textwrap.rst:289 +msgid "placeholder" +msgstr "placeholder" diff --git a/library/threading.po b/library/threading.po new file mode 100644 index 0000000000..e25c521fd0 --- /dev/null +++ b/library/threading.po @@ -0,0 +1,2299 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-23 15:46+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/threading.rst:2 +msgid ":mod:`!threading` --- Thread-based parallelism" +msgstr ":mod:`!threading` --- 基于线程的并行" + +#: ../../library/threading.rst:7 +msgid "**Source code:** :source:`Lib/threading.py`" +msgstr "**源代码:** :source:`Lib/threading.py`" + +#: ../../library/threading.rst:11 +msgid "" +"This module constructs higher-level threading interfaces on top of the lower" +" level :mod:`_thread` module." +msgstr "这个模块在低层级的 :mod:`_thread` 模块之上构造了高层级的线程接口。" + +#: ../../library/threading.rst:194 ../../library/threading.rst:293 +#: ../../library/threading.rst:678 ../../includes/wasm-notavail.rst:3 +msgid "Availability" +msgstr "Availability" + +#: ../../includes/wasm-notavail.rst:5 +msgid "" +"This module does not work or is not available on WebAssembly. See " +":ref:`wasm-availability` for more information." +msgstr "此模块在 WebAssembly 平台上无效或不可用。请参阅 :ref:`wasm-availability` 了解详情。" + +#: ../../library/threading.rst:17 +msgid "Introduction" +msgstr "概述" + +#: ../../library/threading.rst:19 +msgid "" +"The :mod:`!threading` module provides a way to run multiple `threads " +"`_ (smaller units of a " +"process) concurrently within a single process. It allows for the creation " +"and management of threads, making it possible to execute tasks in parallel, " +"sharing memory space. Threads are particularly useful when tasks are I/O " +"bound, such as file operations or making network requests, where much of the" +" time is spent waiting for external resources." +msgstr "" +":mod:`!threading` 模块提供了一种在单个进程内部并发地运行多个 `线程 " +"`_ (从进程分出的更小单位) 的方式。 " +"它允许创建和管理线程,以便能够平行地执行多个任务,并共享内存空间。线程特别适用于 I/O " +"密集型的任务,如文件操作或发送网络请求,在此类任务中大部分时间都会消耗于等待外部资源。" + +#: ../../library/threading.rst:27 +msgid "" +"A typical use case for :mod:`!threading` includes managing a pool of worker " +"threads that can process multiple tasks concurrently. Here's a basic " +"example of creating and starting threads using :class:`~threading.Thread`::" +msgstr "" +"典型的 :mod:`!threading` 使用场景包括管理一个工作线程池来并发地处理多个任务。下面是一个使用 " +":class:`~threading.Thread` 创建并启动线程的简单示例::" + +#: ../../library/threading.rst:31 +msgid "" +"import threading\n" +"import time\n" +"\n" +"def crawl(link, delay=3):\n" +" print(f\"crawl started for {link}\")\n" +" time.sleep(delay) # Blocking I/O (simulating a network request)\n" +" print(f\"crawl ended for {link}\")\n" +"\n" +"links = [\n" +" \"https://python.org\",\n" +" \"https://docs.python.org\",\n" +" \"https://peps.python.org\",\n" +"]\n" +"\n" +"# Start threads for each link\n" +"threads = []\n" +"for link in links:\n" +" # Using `args` to pass positional arguments and `kwargs` for keyword arguments\n" +" t = threading.Thread(target=crawl, args=(link,), kwargs={\"delay\": 2})\n" +" threads.append(t)\n" +"\n" +"# Start each thread\n" +"for t in threads:\n" +" t.start()\n" +"\n" +"# Wait for all threads to finish\n" +"for t in threads:\n" +" t.join()" +msgstr "" +"import threading\n" +"import time\n" +"\n" +"def crawl(link, delay=3):\n" +" print(f\"crawl started for {link}\")\n" +" time.sleep(delay) # 阻塞 I/O (模拟网络请求)\n" +" print(f\"crawl ended for {link}\")\n" +"\n" +"links = [\n" +" \"https://python.org\",\n" +" \"https://docs.python.org\",\n" +" \"https://peps.python.org\",\n" +"]\n" +"\n" +"# 针对每个链接启动线程\n" +"threads = []\n" +"for link in links:\n" +" # 使用 `args` 传入位置参数并使用 `kwargs` 传入关键字参数\n" +" t = threading.Thread(target=crawl, args=(link,), kwargs={\"delay\": 2})\n" +" threads.append(t)\n" +"\n" +"# 启动每个线程\n" +"for t in threads:\n" +" t.start()\n" +"\n" +"# 等待所有线程结束\n" +"for t in threads:\n" +" t.join()" + +#: ../../library/threading.rst:60 +msgid "This module used to be optional, it is now always available." +msgstr "这个模块曾经为可选项,但现在总是可用。" + +#: ../../library/threading.rst:65 +msgid "" +":class:`concurrent.futures.ThreadPoolExecutor` offers a higher level " +"interface to push tasks to a background thread without blocking execution of" +" the calling thread, while still being able to retrieve their results when " +"needed." +msgstr "" +":class:`concurrent.futures.ThreadPoolExecutor` " +"提供了一个高层级接口用来向后台线程推送任务而不会阻塞调用方线程的执行,同时仍然能够在需要时获取任务的结果。" + +#: ../../library/threading.rst:69 +msgid "" +":mod:`queue` provides a thread-safe interface for exchanging data between " +"running threads." +msgstr ":mod:`queue` 提供了一个线程安全的接口用来在运行中的线程之间交换数据。" + +#: ../../library/threading.rst:72 +msgid "" +":mod:`asyncio` offers an alternative approach to achieving task level " +"concurrency without requiring the use of multiple operating system threads." +msgstr ":mod:`asyncio` 提供了一个替代方式用来实现任务层级的并发而不要求使用多个操作系统线程。" + +#: ../../library/threading.rst:77 +msgid "" +"In the Python 2.x series, this module contained ``camelCase`` names for some" +" methods and functions. These are deprecated as of Python 3.10, but they are" +" still supported for compatibility with Python 2.5 and lower." +msgstr "" +"在 Python 2.x 系列中,此模块包含有某些方法和函数 ``camelCase`` 形式的名称。它们在 Python 3.10 中已弃用,但为了与" +" Python 2.5 及更旧版本的兼容性而仍受到支持。" + +#: ../../library/threading.rst:84 +msgid "" +"In CPython, due to the :term:`Global Interpreter Lock `, only one thread can execute Python code at once (even though certain" +" performance-oriented libraries might overcome this limitation). If you want" +" your application to make better use of the computational resources of " +"multi-core machines, you are advised to use :mod:`multiprocessing` or " +":class:`concurrent.futures.ProcessPoolExecutor`. However, threading is still" +" an appropriate model if you want to run multiple I/O-bound tasks " +"simultaneously." +msgstr "" +"在 CPython 中,由于存在 :term:`全局解释器锁 `,同一时刻只有一个线程可以执行 " +"Python 代码(虽然某些性能导向的库可能会去除此限制)。如果你想让你的应用更好地利用多核心计算机的计算资源,推荐你使用 " +":mod:`multiprocessing` 或 :class:`concurrent.futures.ProcessPoolExecutor`。 " +"但是,如果你想要同时运行多个 I/O 密集型任务,则多线程仍然是一个合适的模型。" + +#: ../../library/threading.rst:95 +msgid "GIL and performance considerations" +msgstr "GIL 和性能的考量" + +#: ../../library/threading.rst:97 +msgid "" +"Unlike the :mod:`multiprocessing` module, which uses separate processes to " +"bypass the :term:`global interpreter lock` (GIL), the threading module " +"operates within a single process, meaning that all threads share the same " +"memory space. However, the GIL limits the performance gains of threading " +"when it comes to CPU-bound tasks, as only one thread can execute Python " +"bytecode at a time. Despite this, threads remain a useful tool for achieving" +" concurrency in many scenarios." +msgstr "" +"与使用多个进程来绕过 :term:`global interpreter lock` (GIL) 的 :mod:`multiprocessing` " +"模块不同,threading 模块是在单个进程内部操作的,这意味着所有线程共享相同的内存空间。不过,对于 CPU 密集型任务来说 GIL 会限制 " +"threading 带来的性能提升,因为在同一时刻只有一个线程能执行 Python 字节码。尽管如此,在许多场景中线程仍然是实现并发的有用工具。" + +#: ../../library/threading.rst:105 +msgid "" +"As of Python 3.13, :term:`free-threaded ` builds can disable" +" the GIL, enabling true parallel execution of threads, but this feature is " +"not available by default (see :pep:`703`)." +msgstr "" +"对于 Python 3.13, :term:`自由线程 ` 构建版可以禁用 " +"GIL,启用真正的线程并行执行,但此特性在默认情况下不可用 (参见 :pep:`703`)。" + +#: ../../library/threading.rst:112 +msgid "Reference" +msgstr "参考" + +#: ../../library/threading.rst:114 +msgid "This module defines the following functions:" +msgstr "这个模块定义了以下函数:" + +#: ../../library/threading.rst:119 +msgid "" +"Return the number of :class:`Thread` objects currently alive. The returned " +"count is equal to the length of the list returned by :func:`.enumerate`." +msgstr "返回当前存活的 :class:`Thread` 对象的数量。返回值与 :func:`.enumerate` 所返回的列表长度一致。" + +#: ../../library/threading.rst:122 +msgid "The function ``activeCount`` is a deprecated alias for this function." +msgstr "函数 ``activeCount`` 是此函数的已弃用别名。" + +#: ../../library/threading.rst:127 +msgid "" +"Return the current :class:`Thread` object, corresponding to the caller's " +"thread of control. If the caller's thread of control was not created " +"through the :mod:`!threading` module, a dummy thread object with limited " +"functionality is returned." +msgstr "" +"返回当前对应于调用方控制线程的 :class:`Thread` 对象。如果调用方的控制线程不是通过 :mod:`!threading` " +"模块创建的,则会返回一个功能受限的假线程对象。" + +#: ../../library/threading.rst:132 +msgid "" +"The function ``currentThread`` is a deprecated alias for this function." +msgstr "函数 ``currentThread`` 是此函数的已弃用别名。" + +#: ../../library/threading.rst:137 +msgid "Handle uncaught exception raised by :func:`Thread.run`." +msgstr "处理由 :func:`Thread.run` 引发的未捕获异常。" + +#: ../../library/threading.rst:139 +msgid "The *args* argument has the following attributes:" +msgstr "*args* 参数具有以下属性:" + +#: ../../library/threading.rst:141 +msgid "*exc_type*: Exception type." +msgstr "*exc_type*: 异常类型" + +#: ../../library/threading.rst:142 +msgid "*exc_value*: Exception value, can be ``None``." +msgstr "*exc_value*: 异常值,可以是 ``None``." + +#: ../../library/threading.rst:143 +msgid "*exc_traceback*: Exception traceback, can be ``None``." +msgstr "*exc_traceback*: 异常回溯,可以是 ``None``." + +#: ../../library/threading.rst:144 +msgid "*thread*: Thread which raised the exception, can be ``None``." +msgstr "*thread*: 引发异常的线程,可以为 ``None``。" + +#: ../../library/threading.rst:146 +msgid "" +"If *exc_type* is :exc:`SystemExit`, the exception is silently ignored. " +"Otherwise, the exception is printed out on :data:`sys.stderr`." +msgstr "" +"如果 *exc_type* 为 :exc:`SystemExit`,则异常会被静默地忽略。在其他情况下,异常将被打印到 " +":data:`sys.stderr`." + +#: ../../library/threading.rst:149 +msgid "" +"If this function raises an exception, :func:`sys.excepthook` is called to " +"handle it." +msgstr "如果此函数引发了异常,则会调用 :func:`sys.excepthook` 来处理它。" + +#: ../../library/threading.rst:152 +msgid "" +":func:`threading.excepthook` can be overridden to control how uncaught " +"exceptions raised by :func:`Thread.run` are handled." +msgstr "" +":func:`threading.excepthook` 可以被重载以控制由 :func:`Thread.run` 引发的未捕获异常的处理方式。" + +#: ../../library/threading.rst:155 +msgid "" +"Storing *exc_value* using a custom hook can create a reference cycle. It " +"should be cleared explicitly to break the reference cycle when the exception" +" is no longer needed." +msgstr "使用定制钩子存放 *exc_value* 可能会创建引用循环。它应当在不再需要异常时被显式地清空以打破引用循环。" + +#: ../../library/threading.rst:159 +msgid "" +"Storing *thread* using a custom hook can resurrect it if it is set to an " +"object which is being finalized. Avoid storing *thread* after the custom " +"hook completes to avoid resurrecting objects." +msgstr "" +"如果一个对象正在被销毁,那么使用自定义的钩子储存 *thread* 可能会将其复活。请在自定义钩子生效后避免储存 *thread*,以避免对象的复活。" + +#: ../../library/threading.rst:164 +msgid ":func:`sys.excepthook` handles uncaught exceptions." +msgstr ":func:`sys.excepthook` 处理未捕获的异常。" + +#: ../../library/threading.rst:170 +msgid "" +"Holds the original value of :func:`threading.excepthook`. It is saved so " +"that the original value can be restored in case they happen to get replaced " +"with broken or alternative objects." +msgstr "" +"保存 :func:`threading.excepthook` 的原始值。它被保存以便在原始值碰巧被已损坏或替代对象所替换的情况下可被恢复。" + +#: ../../library/threading.rst:178 +msgid "" +"Return the 'thread identifier' of the current thread. This is a nonzero " +"integer. Its value has no direct meaning; it is intended as a magic cookie " +"to be used e.g. to index a dictionary of thread-specific data. Thread " +"identifiers may be recycled when a thread exits and another thread is " +"created." +msgstr "" +"返回当前线程的“线程标识符”。它是一个非零的整数。它的值没有直接含义,主要是用作 magic " +"cookie,比如作为含有线程相关数据的字典的索引。线程标识符可能会在线程退出,新线程创建时被复用。" + +#: ../../library/threading.rst:189 +msgid "" +"Return the native integral Thread ID of the current thread assigned by the " +"kernel. This is a non-negative integer. Its value may be used to uniquely " +"identify this particular thread system-wide (until the thread terminates, " +"after which the value may be recycled by the OS)." +msgstr "" +"返回内核分配给当前线程的原生集成线程 ID。这是一个非负整数。它的值可被用来在整个系统中唯一地标识这个特定线程(直到线程终结,在那之后该值可能会被 OS" +" 回收再利用)。" + +#: ../../library/threading.rst:198 +msgid "Added support for GNU/kFreeBSD." +msgstr "增加了对 GNU/kFreeBSD 的支持。" + +#: ../../library/threading.rst:204 +msgid "" +"Return a list of all :class:`Thread` objects currently active. The list " +"includes daemonic threads and dummy thread objects created by " +":func:`current_thread`. It excludes terminated threads and threads that " +"have not yet been started. However, the main thread is always part of the " +"result, even when terminated." +msgstr "" +"返回当前所有存活的 :class:`Thread` 对象的列表。该列表包括守护线程以及 :func:`current_thread` 创建的空线程。 " +"它不包括已终结的和尚未开始的线程。但是,主线程将总是结果的一部分,即使是在已终结的时候。" + +#: ../../library/threading.rst:213 +msgid "" +"Return the main :class:`Thread` object. In normal conditions, the main " +"thread is the thread from which the Python interpreter was started." +msgstr "返回主 :class:`Thread` 对象。一般情况下,主线程是 Python 解释器开始时创建的线程。" + +#: ../../library/threading.rst:224 +msgid "" +"Set a trace function for all threads started from the :mod:`!threading` " +"module. The *func* will be passed to :func:`sys.settrace` for each thread, " +"before its :meth:`~Thread.run` method is called." +msgstr "" +"为所有从 :mod:`!threading` 模块启动的线程设置追踪函数,在每个线程的 :meth:`~Thread.run` " +"方法被调用前,*func* 会被传递给 :func:`sys.settrace`。" + +#: ../../library/threading.rst:230 +msgid "" +"Set a trace function for all threads started from the :mod:`!threading` " +"module and all Python threads that are currently executing." +msgstr "为从 :mod:`!threading` 模块启动的所有线程以及当前正在执行的所有 Python 线程设置追踪函数。" + +#: ../../library/threading.rst:233 +msgid "" +"The *func* will be passed to :func:`sys.settrace` for each thread, before " +"its :meth:`~Thread.run` method is called." +msgstr "" +"*func* 将为每个线程传递给 :func:`sys.settrace`,在其 :meth:`~Thread.run` 方法被调用之前。" + +#: ../../library/threading.rst:244 +msgid "Get the trace function as set by :func:`settrace`." +msgstr "返回由 :func:`settrace` 设置的跟踪函数。" + +#: ../../library/threading.rst:253 +msgid "" +"Set a profile function for all threads started from the :mod:`!threading` " +"module. The *func* will be passed to :func:`sys.setprofile` for each " +"thread, before its :meth:`~Thread.run` method is called." +msgstr "" +"为从 :mod:`!threading` 模块启动的所有线程设置性能分析函数。在每个线程的 :meth:`~Thread.run` " +"方法被调用前,*func* 会被传递给 :func:`sys.setprofile`。" + +#: ../../library/threading.rst:259 +msgid "" +"Set a profile function for all threads started from the :mod:`!threading` " +"module and all Python threads that are currently executing." +msgstr "为从 :mod:`!threading` 模块启动的所有线程和当前正在执行的所有 Python 线程设置性能分析函数。" + +#: ../../library/threading.rst:262 +msgid "" +"The *func* will be passed to :func:`sys.setprofile` for each thread, before" +" its :meth:`~Thread.run` method is called." +msgstr "" +"*func* 将为每个线程传递给 :func:`sys.setprofile`,在其 :meth:`~Thread.run` 方法被调用之前。" + +#: ../../library/threading.rst:271 +msgid "Get the profiler function as set by :func:`setprofile`." +msgstr "返回由 :func:`setprofile` 设置的性能分析函数。" + +#: ../../library/threading.rst:278 +msgid "" +"Return the thread stack size used when creating new threads. The optional " +"*size* argument specifies the stack size to be used for subsequently created" +" threads, and must be 0 (use platform or configured default) or a positive " +"integer value of at least 32,768 (32 KiB). If *size* is not specified, 0 is " +"used. If changing the thread stack size is unsupported, a " +":exc:`RuntimeError` is raised. If the specified stack size is invalid, a " +":exc:`ValueError` is raised and the stack size is unmodified. 32 KiB is " +"currently the minimum supported stack size value to guarantee sufficient " +"stack space for the interpreter itself. Note that some platforms may have " +"particular restrictions on values for the stack size, such as requiring a " +"minimum stack size > 32 KiB or requiring allocation in multiples of the " +"system memory page size - platform documentation should be referred to for " +"more information (4 KiB pages are common; using multiples of 4096 for the " +"stack size is the suggested approach in the absence of more specific " +"information)." +msgstr "" +"返回创建线程时使用的堆栈大小。可选参数 *size* 指定之后新建的线程的堆栈大小,而且一定要是 0(根据平台或者默认配置)或者最小是 " +"32,768(32KiB) 的一个正整数。如果 *size* 没有指定,默认是 0。如果不支持改变线程堆栈大小,会抛出 " +":exc:`RuntimeError` 错误。如果指定的堆栈大小不合法,会抛出 :exc:`ValueError` 错误并且不会修改堆栈大小。32KiB" +" 是当前最小的能保证解释器有足够堆栈空间的堆栈大小。需要注意的是部分平台对于堆栈大小会有特定的限制,例如要求大于 32KiB " +"的堆栈大小或者需要根据系统内存页面的整数倍进行分配 - 应当查阅平台文档有关详细信息(4KiB 页面比较普遍,在没有更具体信息的情况下,建议的方法是使用" +" 4096 的倍数作为堆栈大小)。" + +#: ../../library/threading.rst:295 +msgid "Unix platforms with POSIX threads support." +msgstr "带有 POSIX 线程支持的 Unix 平台。" + +#: ../../library/threading.rst:298 +msgid "This module also defines the following constant:" +msgstr "这个模块同时定义了以下常量:" + +#: ../../library/threading.rst:302 +msgid "" +"The maximum value allowed for the *timeout* parameter of blocking functions " +"(:meth:`Lock.acquire`, :meth:`RLock.acquire`, :meth:`Condition.wait`, etc.)." +" Specifying a timeout greater than this value will raise an " +":exc:`OverflowError`." +msgstr "" +"阻塞函数( :meth:`Lock.acquire`, :meth:`RLock.acquire`, :meth:`Condition.wait`, " +"...)中形参 *timeout* 允许的最大值。传入超过这个值的 timeout 会抛出 :exc:`OverflowError` 异常。" + +#: ../../library/threading.rst:310 +msgid "" +"This module defines a number of classes, which are detailed in the sections " +"below." +msgstr "这个模块定义了许多类,详见以下部分。" + +#: ../../library/threading.rst:313 +msgid "" +"The design of this module is loosely based on Java's threading model. " +"However, where Java makes locks and condition variables basic behavior of " +"every object, they are separate objects in Python. Python's :class:`Thread`" +" class supports a subset of the behavior of Java's Thread class; currently, " +"there are no priorities, no thread groups, and threads cannot be destroyed, " +"stopped, suspended, resumed, or interrupted. The static methods of Java's " +"Thread class, when implemented, are mapped to module-level functions." +msgstr "" +"该模块的设计基于 Java 的线程模型。但是,在 Java 里面,锁和条件变量是每个对象的基础特性,而在 Python 里面,这些被独立成了单独的对象。" +" Python 的 :class:`Thread` 类只是 Java 的 Thread " +"类的一个子集;目前还没有优先级,没有线程组,线程还不能被销毁、停止、暂停、恢复或中断。Java 的 Thread " +"类的静态方法在实现时会映射为模块级函数。" + +#: ../../library/threading.rst:321 +msgid "All of the methods described below are executed atomically." +msgstr "下述方法的执行都是原子性的。" + +#: ../../library/threading.rst:325 +msgid "Thread-local data" +msgstr "线程局部数据" + +#: ../../library/threading.rst:327 +msgid "" +"Thread-local data is data whose values are thread specific. If you have data" +" that you want to be local to a thread, create a :class:`local` object and " +"use its attributes::" +msgstr "线程局部数据是指具有线程专属值的数据。如果你希望某些数据是线程局部数据,则创建一个 :class:`local` 对象并使用其属性::" + +#: ../../library/threading.rst:331 +msgid "" +">>> mydata = local()\n" +">>> mydata.number = 42\n" +">>> mydata.number\n" +"42" +msgstr "" +">>> mydata = local()\n" +">>> mydata.number = 42\n" +">>> mydata.number\n" +"42" + +#: ../../library/threading.rst:336 +msgid "You can also access the :class:`local`-object's dictionary::" +msgstr "你也可以访问 :class:`local` 对象的字典::" + +#: ../../library/threading.rst:338 +msgid "" +">>> mydata.__dict__\n" +"{'number': 42}\n" +">>> mydata.__dict__.setdefault('widgets', [])\n" +"[]\n" +">>> mydata.widgets\n" +"[]" +msgstr "" +">>> mydata.__dict__\n" +"{'number': 42}\n" +">>> mydata.__dict__.setdefault('widgets', [])\n" +"[]\n" +">>> mydata.widgets\n" +"[]" + +#: ../../library/threading.rst:345 +msgid "If we access the data in a different thread::" +msgstr "如果我们在另一个线程中访问此数据::" + +#: ../../library/threading.rst:347 +msgid "" +">>> log = []\n" +">>> def f():\n" +"... items = sorted(mydata.__dict__.items())\n" +"... log.append(items)\n" +"... mydata.number = 11\n" +"... log.append(mydata.number)\n" +"\n" +">>> import threading\n" +">>> thread = threading.Thread(target=f)\n" +">>> thread.start()\n" +">>> thread.join()\n" +">>> log\n" +"[[], 11]" +msgstr "" +">>> log = []\n" +">>> def f():\n" +"... items = sorted(mydata.__dict__.items())\n" +"... log.append(items)\n" +"... mydata.number = 11\n" +"... log.append(mydata.number)\n" +"\n" +">>> import threading\n" +">>> thread = threading.Thread(target=f)\n" +">>> thread.start()\n" +">>> thread.join()\n" +">>> log\n" +"[[], 11]" + +#: ../../library/threading.rst:361 +msgid "" +"we get different data. Furthermore, changes made in the other thread don't " +"affect data seen in this thread::" +msgstr "我们将得到不同的数据。此外,在其他线程中进行的修改也不会影响在本线程中看到的数据::" + +#: ../../library/threading.rst:364 +msgid "" +">>> mydata.number\n" +"42" +msgstr "" +">>> mydata.number\n" +"42" + +#: ../../library/threading.rst:367 +msgid "" +"Of course, values you get from a :class:`local` object, including their " +":attr:`~object.__dict__` attribute, are for whatever thread was current at " +"the time the attribute was read. For that reason, you generally don't want " +"to save these values across threads, as they apply only to the thread they " +"came from." +msgstr "" +"当然,你从 :class:`local` 对象获取的值,包括其 :attr:`~object.__dict__` 属性,都只针对属性被读取时的当前线程。" +" 出于此理由,通常你不会跨线程保存这些值,因为它们仅适用于它们所在的线程。" + +#: ../../library/threading.rst:373 +msgid "" +"You can create custom :class:`local` objects by subclassing the " +":class:`local` class::" +msgstr "你可以通过子类化 :class:`local` 类来创建自定义的 :class:`local` 对象::" + +#: ../../library/threading.rst:376 +msgid "" +">>> class MyLocal(local):\n" +"... number = 2\n" +"... def __init__(self, /, **kw):\n" +"... self.__dict__.update(kw)\n" +"... def squared(self):\n" +"... return self.number ** 2" +msgstr "" +">>> class MyLocal(local):\n" +"... number = 2\n" +"... def __init__(self, /, **kw):\n" +"... self.__dict__.update(kw)\n" +"... def squared(self):\n" +"... return self.number ** 2" + +#: ../../library/threading.rst:383 +msgid "" +"This can be useful to support default values, methods and initialization. " +"Note that if you define an :py:meth:`~object.__init__` method, it will be " +"called each time the :class:`local` object is used in a separate thread. " +"This is necessary to initialize each thread's dictionary." +msgstr "" +"这适用于提供默认值、方法和初始化支持。请注意如果你定义了 :py:meth:`~object.__init__` 方法,则每当该 " +":class:`local` 对象在不同线程中被使用时都将调用它。这对于初始化每个线程的字典是必要的。" + +#: ../../library/threading.rst:389 +msgid "Now if we create a :class:`local` object::" +msgstr "现在如果我们创建一个 :class:`local` 对象::" + +#: ../../library/threading.rst:391 +msgid ">>> mydata = MyLocal(color='red')" +msgstr ">>> mydata = MyLocal(color='red')" + +#: ../../library/threading.rst:393 +msgid "we have a default number::" +msgstr "我们将有一个默认的 number 值::" + +#: ../../library/threading.rst:395 +msgid "" +">>> mydata.number\n" +"2" +msgstr "" +">>> mydata.number\n" +"2" + +#: ../../library/threading.rst:398 +msgid "an initial color::" +msgstr "一个初始的 color 值::" + +#: ../../library/threading.rst:400 +msgid "" +">>> mydata.color\n" +"'red'\n" +">>> del mydata.color" +msgstr "" +">>> mydata.color\n" +"'red'\n" +">>> del mydata.color" + +#: ../../library/threading.rst:404 +msgid "And a method that operates on the data::" +msgstr "以及一个操作数据的方法::" + +#: ../../library/threading.rst:406 +msgid "" +">>> mydata.squared()\n" +"4" +msgstr "" +">>> mydata.squared()\n" +"4" + +#: ../../library/threading.rst:409 +msgid "As before, we can access the data in a separate thread::" +msgstr "像之前一样,我们可以在不同的线程中访问该数据::" + +#: ../../library/threading.rst:411 +msgid "" +">>> log = []\n" +">>> thread = threading.Thread(target=f)\n" +">>> thread.start()\n" +">>> thread.join()\n" +">>> log\n" +"[[('color', 'red')], 11]" +msgstr "" +">>> log = []\n" +">>> thread = threading.Thread(target=f)\n" +">>> thread.start()\n" +">>> thread.join()\n" +">>> log\n" +"[[('color', 'red')], 11]" + +#: ../../library/threading.rst:418 +msgid "without affecting this thread's data::" +msgstr "而不会影响本线程的数据::" + +#: ../../library/threading.rst:420 +msgid "" +">>> mydata.number\n" +"2\n" +">>> mydata.color\n" +"Traceback (most recent call last):\n" +"...\n" +"AttributeError: 'MyLocal' object has no attribute 'color'" +msgstr "" +">>> mydata.number\n" +"2\n" +">>> mydata.color\n" +"Traceback (most recent call last):\n" +"...\n" +"AttributeError: 'MyLocal' object has no attribute 'color'" + +#: ../../library/threading.rst:427 +msgid "" +"Note that subclasses can define :term:`__slots__`, but they are not thread " +"local. They are shared across threads::" +msgstr "请注意子类可以定义 :term:`__slots__`,但它们不是线程局部的。它们会被跨线程共享::" + +#: ../../library/threading.rst:430 +msgid "" +">>> class MyLocal(local):\n" +"... __slots__ = 'number'\n" +"\n" +">>> mydata = MyLocal()\n" +">>> mydata.number = 42\n" +">>> mydata.color = 'red'" +msgstr "" +">>> class MyLocal(local):\n" +"... __slots__ = 'number'\n" +"\n" +">>> mydata = MyLocal()\n" +">>> mydata.number = 42\n" +">>> mydata.color = 'red'" + +#: ../../library/threading.rst:437 +msgid "So, the separate thread::" +msgstr "因此,不同的线程::" + +#: ../../library/threading.rst:439 +msgid "" +">>> thread = threading.Thread(target=f)\n" +">>> thread.start()\n" +">>> thread.join()" +msgstr "" +">>> thread = threading.Thread(target=f)\n" +">>> thread.start()\n" +">>> thread.join()" + +#: ../../library/threading.rst:443 +msgid "affects what we see::" +msgstr "会影响我们的值::" + +#: ../../library/threading.rst:445 +msgid "" +">>> mydata.number\n" +"11" +msgstr "" +">>> mydata.number\n" +"11" + +#: ../../library/threading.rst:451 +msgid "A class that represents thread-local data." +msgstr "一个代表线程本地数据的类。" + +#: ../../library/threading.rst:457 +msgid "Thread objects" +msgstr "线程对象" + +#: ../../library/threading.rst:459 +msgid "" +"The :class:`Thread` class represents an activity that is run in a separate " +"thread of control. There are two ways to specify the activity: by passing a" +" callable object to the constructor, or by overriding the " +":meth:`~Thread.run` method in a subclass. No other methods (except for the " +"constructor) should be overridden in a subclass. In other words, *only* " +"override the ``__init__()`` and :meth:`~Thread.run` methods of this class." +msgstr "" +":class:`Thread` 类代表一个在独立控制线程中运行的活动。指定活动有两种方式:向构造器传递一个可调用对象,或在子类中重载 " +":meth:`~Thread.run` 方法。其他方法不应在子类中重载(除了构造器)。换句话说,*只能* 重载这个类的 ``__init__()`` 和" +" :meth:`~Thread.run` 方法。" + +#: ../../library/threading.rst:466 +msgid "" +"Once a thread object is created, its activity must be started by calling the" +" thread's :meth:`~Thread.start` method. This invokes the " +":meth:`~Thread.run` method in a separate thread of control." +msgstr "" +"当线程对象一旦被创建,其活动必须通过调用线程的 :meth:`~Thread.start` 方法开始。这会在独立的控制线程中唤起 " +":meth:`~Thread.run` 方法。" + +#: ../../library/threading.rst:470 +msgid "" +"Once the thread's activity is started, the thread is considered 'alive'. It " +"stops being alive when its :meth:`~Thread.run` method terminates -- either " +"normally, or by raising an unhandled exception. The " +":meth:`~Thread.is_alive` method tests whether the thread is alive." +msgstr "" +"一旦线程活动开始,该线程会被认为是 '存活的' 。当它的 :meth:`~Thread.run` " +"方法终结了(不管是正常的还是抛出未被处理的异常),就不是'存活的'。 :meth:`~Thread.is_alive` 方法用于检查线程是否存活。" + +#: ../../library/threading.rst:475 +msgid "" +"Other threads can call a thread's :meth:`~Thread.join` method. This blocks " +"the calling thread until the thread whose :meth:`~Thread.join` method is " +"called is terminated." +msgstr "" +"其他线程可以调用一个线程的 :meth:`~Thread.join` 方法。这会阻塞调用该方法的线程,直到被调用 " +":meth:`~Thread.join` 方法的线程终结。" + +#: ../../library/threading.rst:479 +msgid "" +"A thread has a name. The name can be passed to the constructor, and read or" +" changed through the :attr:`~Thread.name` attribute." +msgstr "线程有名字。名字可以传递给构造函数,也可以通过 :attr:`~Thread.name` 属性读取或者修改。" + +#: ../../library/threading.rst:482 +msgid "" +"If the :meth:`~Thread.run` method raises an exception, " +":func:`threading.excepthook` is called to handle it. By default, " +":func:`threading.excepthook` ignores silently :exc:`SystemExit`." +msgstr "" +"如果 :meth:`~Thread.run` 方法引发了异常,则会调用 :func:`threading.excepthook` 来处理它。 " +"在默认情况下,:func:`threading.excepthook` 会静默地忽略 :exc:`SystemExit`。" + +#: ../../library/threading.rst:486 +msgid "" +"A thread can be flagged as a \"daemon thread\". The significance of this " +"flag is that the entire Python program exits when only daemon threads are " +"left. The initial value is inherited from the creating thread. The flag " +"can be set through the :attr:`~Thread.daemon` property or the *daemon* " +"constructor argument." +msgstr "" +"一个线程可以被标记成一个“守护线程”。这个标识的意义是,当剩下的线程都是守护线程时,整个 Python 程序将会退出。初始值继承于创建线程。 " +"这个标识可以通过 :attr:`~Thread.daemon` 特征属性或者 *daemon* 构造器参数来设置。" + +#: ../../library/threading.rst:493 +msgid "" +"Daemon threads are abruptly stopped at shutdown. Their resources (such as " +"open files, database transactions, etc.) may not be released properly. If " +"you want your threads to stop gracefully, make them non-daemonic and use a " +"suitable signalling mechanism such as an :class:`Event`." +msgstr "" +"守护线程在程序关闭时会突然关闭。他们的资源(例如已经打开的文档,数据库事务等等)可能没有被正确释放。如果你想你的线程正常停止,设置他们成为非守护模式并且使用合适的信号机制,例如:" +" :class:`Event`." + +#: ../../library/threading.rst:498 +msgid "" +"There is a \"main thread\" object; this corresponds to the initial thread of" +" control in the Python program. It is not a daemon thread." +msgstr "有个 \"主线程\" 对象;这对应 Python 程序里面初始的控制线程。它不是一个守护线程。" + +#: ../../library/threading.rst:501 +msgid "" +"There is the possibility that \"dummy thread objects\" are created. These " +"are thread objects corresponding to \"alien threads\", which are threads of " +"control started outside the threading module, such as directly from C code." +" Dummy thread objects have limited functionality; they are always " +"considered alive and daemonic, and cannot be :ref:`joined `. They are never deleted, since it is impossible to detect the " +"termination of alien threads." +msgstr "" +"创建“虚拟线程对象”是有可能的。它们是与“外部线程”相对应 的线程对象,是在 threading 模块之外启动的控制线程,例如直接来自 C 代码。 " +"虚拟线程对象的功能是受限的;它们总是会被视为处于激活和守护状态,且无法被 :ref:`合并 `。 " +"它们绝不会被删除,因为检测外部线程的终结是不可能做到的。" + +#: ../../library/threading.rst:512 +msgid "" +"This constructor should always be called with keyword arguments. Arguments " +"are:" +msgstr "应当始终使用关键字参数调用此构造函数。参数如下:" + +#: ../../library/threading.rst:515 +msgid "" +"*group* must be ``None`` as it is reserved for future extension when a " +":class:`!ThreadGroup` class is implemented." +msgstr "" + +#: ../../library/threading.rst:518 +msgid "" +"*target* is the callable object to be invoked by the :meth:`run` method. " +"Defaults to ``None``, meaning nothing is called." +msgstr "*target* 是用于 :meth:`run` 方法调用的可调用对象。默认是 ``None``,表示不需要调用任何方法。" + +#: ../../library/threading.rst:521 +msgid "" +"*name* is the thread name. By default, a unique name is constructed of the " +"form \"Thread-*N*\" where *N* is a small decimal number, or \"Thread-*N* " +"(target)\" where \"target\" is ``target.__name__`` if the *target* argument " +"is specified." +msgstr "" +"*name* 是线程名称。在默认情况下,会以 \"Thread-*N*\" 的形式构造唯一名称,其中 *N* 为一个较小的十进制数值,或是 " +"\"Thread-*N* (target)\" 的形式,其中 \"target\" 为 ``target.__name__``,如果指定了 " +"*target* 参数的话。" + +#: ../../library/threading.rst:526 +msgid "" +"*args* is a list or tuple of arguments for the target invocation. Defaults " +"to ``()``." +msgstr "*args* 是用于唤起目标函数的参数列表或元组。默认为 ``()``。" + +#: ../../library/threading.rst:528 +msgid "" +"*kwargs* is a dictionary of keyword arguments for the target invocation. " +"Defaults to ``{}``." +msgstr "*kwargs* 是用于调用目标函数的关键字参数字典。默认是 ``{}``。" + +#: ../../library/threading.rst:531 +msgid "" +"If not ``None``, *daemon* explicitly sets whether the thread is daemonic. If" +" ``None`` (the default), the daemonic property is inherited from the current" +" thread." +msgstr "" +"如果不是 ``None``,*daemon* 参数将显式地设置该线程是否为守护模式。如果是 ``None`` " +"(默认值),线程将继承当前线程的守护模式属性。" + +#: ../../library/threading.rst:535 +msgid "" +"*context* is the :class:`~contextvars.Context` value to use when starting " +"the thread. The default value is ``None`` which indicates that the " +":data:`sys.flags.thread_inherit_context` flag controls the behaviour. If " +"the flag is true, threads will start with a copy of the context of the " +"caller of :meth:`~Thread.start`. If false, they will start with an empty " +"context. To explicitly start with an empty context, pass a new instance of " +":class:`~contextvars.Context()`. To explicitly start with a copy of the " +"current context, pass the value from :func:`~contextvars.copy_context`. The " +"flag defaults true on free-threaded builds and false otherwise." +msgstr "" +"*context* 是 :class:`~contextvars.Context` 值,以便在启动线程时使用。默认值是 ``None``,表示 " +":data:`sys.flags.thread_inherit_context` 标志控制行为。如果该标志为 true,线程将从 " +":meth:`~Thread.start` 调用程序的上下文副本开始。如果为 false,它们将从空上下文开始。要显式地从空上下文开始,传递 " +":class:`~contextvars.Context()` 的新实例。要显式地从当前上下文的副本开始,请传递来自 " +":func:`~contextvars.copy_context` 的值。该标志在自由线程构建时默认为 true,否则为 false。" + +#: ../../library/threading.rst:545 +msgid "" +"If the subclass overrides the constructor, it must make sure to invoke the " +"base class constructor (``Thread.__init__()``) before doing anything else to" +" the thread." +msgstr "如果子类型重载了构造函数,它一定要确保在做任何事前,先唤起基类构造器 (``Thread.__init__()``)。" + +#: ../../library/threading.rst:549 +msgid "Added the *daemon* parameter." +msgstr "增加了 *daemon* 形参。" + +#: ../../library/threading.rst:552 +msgid "Use the *target* name if *name* argument is omitted." +msgstr "使用 *target* 名称,如果 *name* 参数被省略的话。" + +#: ../../library/threading.rst:555 +msgid "Added the *context* parameter." +msgstr "增加了 *context* 形参。" + +#: ../../library/threading.rst:560 +msgid "Start the thread's activity." +msgstr "开始线程活动。" + +#: ../../library/threading.rst:562 +msgid "" +"It must be called at most once per thread object. It arranges for the " +"object's :meth:`~Thread.run` method to be invoked in a separate thread of " +"control." +msgstr "它在一个线程里最多只能被调用一次。它安排对象的 :meth:`~Thread.run` 方法在一个独立的控制线程中被调用。" + +#: ../../library/threading.rst:566 +msgid "" +"This method will raise a :exc:`RuntimeError` if called more than once on the" +" same thread object." +msgstr "如果同一个线程对象中调用这个方法的次数大于一次,会抛出 :exc:`RuntimeError`。" + +#: ../../library/threading.rst:569 +msgid "" +"If supported, set the operating system thread name to " +":attr:`threading.Thread.name`. The name can be truncated depending on the " +"operating system thread name limits." +msgstr "如果支持,将操作系统线程名设置为 :attr:`threading.Thread.name`。该名称可以根据操作系统线程名称限制进行截断。" + +#: ../../library/threading.rst:573 +msgid "Set the operating system thread name." +msgstr "设置操作系统线程名称。" + +#: ../../library/threading.rst:578 +msgid "Method representing the thread's activity." +msgstr "代表线程活动的方法。" + +#: ../../library/threading.rst:580 +msgid "" +"You may override this method in a subclass. The standard :meth:`run` method" +" invokes the callable object passed to the object's constructor as the " +"*target* argument, if any, with positional and keyword arguments taken from " +"the *args* and *kwargs* arguments, respectively." +msgstr "" +"你可以在子类型里重载这个方法。标准的 :meth:`run` 方法会对作为 *target* " +"参数传递给该对象构造器的可调用对象(如果存在)被唤起,并附带从 *args* 和 *kwargs* 参数分别获取的位置和关键字参数。" + +#: ../../library/threading.rst:585 +msgid "" +"Using list or tuple as the *args* argument which passed to the " +":class:`Thread` could achieve the same effect." +msgstr "使用列表或元组作为传给 :class:`Thread` 的 *args* 参数可以达成同样的效果。" + +#: ../../library/threading.rst:588 +msgid "Example::" +msgstr "示例:" + +#: ../../library/threading.rst:590 +msgid "" +">>> from threading import Thread\n" +">>> t = Thread(target=print, args=[1])\n" +">>> t.run()\n" +"1\n" +">>> t = Thread(target=print, args=(1,))\n" +">>> t.run()\n" +"1" +msgstr "" +">>> from threading import Thread\n" +">>> t = Thread(target=print, args=[1])\n" +">>> t.run()\n" +"1\n" +">>> t = Thread(target=print, args=(1,))\n" +">>> t.run()\n" +"1" + +#: ../../library/threading.rst:602 +msgid "" +"Wait until the thread terminates. This blocks the calling thread until the " +"thread whose :meth:`~Thread.join` method is called terminates -- either " +"normally or through an unhandled exception -- or until the optional timeout " +"occurs." +msgstr "" +"等待,直到线程终结。这会阻塞调用这个方法的线程,直到被调用 :meth:`~Thread.join` 的线程终结 -- 不管是正常终结还是抛出未处理异常" +" -- 或者直到发生超时,超时选项是可选的。" + +#: ../../library/threading.rst:607 +msgid "" +"When the *timeout* argument is present and not ``None``, it should be a " +"floating-point number specifying a timeout for the operation in seconds (or " +"fractions thereof). As :meth:`~Thread.join` always returns ``None``, you " +"must call :meth:`~Thread.is_alive` after :meth:`~Thread.join` to decide " +"whether a timeout happened -- if the thread is still alive, the " +":meth:`~Thread.join` call timed out." +msgstr "" +"当 *timeout* 参数存在而且不是 ``None`` 时,它应该是一个用于指定操作超时的以秒为单位的浮点数(或者分数)。因为 " +":meth:`~Thread.join` 总是返回 ``None``,所以你一定要在 :meth:`~Thread.join` 后调用 " +":meth:`~Thread.is_alive` 才能判断是否发生超时 -- 如果线程仍然存活,则 :meth:`~Thread.join` 超时。" + +#: ../../library/threading.rst:614 +msgid "" +"When the *timeout* argument is not present or ``None``, the operation will " +"block until the thread terminates." +msgstr "当 *timeout* 参数不存在或者是 ``None``,这个操作会阻塞直到线程终结。" + +#: ../../library/threading.rst:617 +msgid "A thread can be joined many times." +msgstr "一个线程可以被合并多次。" + +#: ../../library/threading.rst:619 +msgid "" +":meth:`~Thread.join` raises a :exc:`RuntimeError` if an attempt is made to " +"join the current thread as that would cause a deadlock. It is also an error " +"to :meth:`~Thread.join` a thread before it has been started and attempts to " +"do so raise the same exception." +msgstr "" +"如果尝试加入当前线程会导致死锁, :meth:`~Thread.join` 会引起 :exc:`RuntimeError` 异常。如果尝试 " +":meth:`~Thread.join` 一个尚未开始的线程,也会抛出相同的异常。" + +#: ../../library/threading.rst:624 +msgid "" +"If an attempt is made to join a running daemonic thread in late stages of " +":term:`Python finalization ` :meth:`!join` raises a " +":exc:`PythonFinalizationError`." +msgstr "" +"如果在 :term:`Python 最终化 ` 的后期阶段尝试加入正在运行的守护线程则 " +":meth:`!join` 会引发 :exc:`PythonFinalizationError`。" + +#: ../../library/threading.rst:630 +msgid "May raise :exc:`PythonFinalizationError`." +msgstr "可能引发 :exc:`PythonFinalizationError`。" + +#: ../../library/threading.rst:634 +msgid "" +"A string used for identification purposes only. It has no semantics. " +"Multiple threads may be given the same name. The initial name is set by the" +" constructor." +msgstr "只用于识别的字符串。它没有语义。多个线程可以赋予相同的名称。初始名称由构造函数设置。" + +#: ../../library/threading.rst:638 +msgid "" +"On some platforms, the thread name is set at the operating system level when" +" the thread starts, so that it is visible in task managers. This name may be" +" truncated to fit in a system-specific limit (for example, 15 bytes on Linux" +" or 63 bytes on macOS)." +msgstr "" +"在某些平台上,线程名称在线程启动时在操作系统级别设置,以便在任务管理器中可见。该名称可以被截断以适应特定于系统的限制(例如,Linux 上是 15 " +"字节或 macOS 上是 63 字节)。" + +#: ../../library/threading.rst:643 +msgid "" +"Changes to *name* are only reflected at the OS level when the currently " +"running thread is renamed. (Setting the *name* attribute of a different " +"thread only updates the Python Thread object.)" +msgstr "" +"对 *name* 的更改仅在当前运行的线程被重命名时反映在操作系统级别。(设置不同线程的 *name* 属性只会更新 Python 线程对象。)" + +#: ../../library/threading.rst:650 +msgid "" +"Deprecated getter/setter API for :attr:`~Thread.name`; use it directly as a " +"property instead." +msgstr "已被弃用的 :attr:`~Thread.name` 的取值/设值 API;请改为直接以特征属性方式使用它。" + +#: ../../library/threading.rst:657 +msgid "" +"The 'thread identifier' of this thread or ``None`` if the thread has not " +"been started. This is a nonzero integer. See the :func:`get_ident` " +"function. Thread identifiers may be recycled when a thread exits and " +"another thread is created. The identifier is available even after the " +"thread has exited." +msgstr "" +"这个线程的 '线程标识符',如果线程尚未开始则为 ``None``。这是个非零整数。参见 " +":func:`get_ident` 函数。当一个线程退出而另外一个线程被创建,线程标识符会被复用。即使线程退出后,仍可得到标识符。" + +#: ../../library/threading.rst:665 +msgid "" +"The Thread ID (``TID``) of this thread, as assigned by the OS (kernel). This" +" is a non-negative integer, or ``None`` if the thread has not been started. " +"See the :func:`get_native_id` function. This value may be used to uniquely " +"identify this particular thread system-wide (until the thread terminates, " +"after which the value may be recycled by the OS)." +msgstr "" +"此线程的线程 ID (``TID``),由 OS (内核) 分配。这是一个非负整数,或者如果线程还未启动则为 ``None``。请参阅 " +":func:`get_native_id` 函数。这个值可被用来在全系统范围内唯一地标识这个特定线程 (直到线程终结,在那之后该值可能会被 OS " +"回收再利用)。" + +#: ../../library/threading.rst:674 +msgid "" +"Similar to Process IDs, Thread IDs are only valid (guaranteed unique system-" +"wide) from the time the thread is created until the thread has been " +"terminated." +msgstr "类似于进程 ID,线程 ID 的有效期(全系统范围内保证唯一)将从线程被创建开始直到线程被终结。" + +#: ../../library/threading.rst:684 +msgid "Return whether the thread is alive." +msgstr "返回线程是否存活。" + +#: ../../library/threading.rst:686 +msgid "" +"This method returns ``True`` just before the :meth:`~Thread.run` method " +"starts until just after the :meth:`~Thread.run` method terminates. The " +"module function :func:`.enumerate` returns a list of all alive threads." +msgstr "" +"当 :meth:`~Thread.run` 方法刚开始直到 :meth:`~Thread.run` 方法刚结束,这个方法返回 ``True`` " +"。模块函数 :func:`.enumerate` 返回包含所有存活线程的列表。" + +#: ../../library/threading.rst:692 +msgid "" +"A boolean value indicating whether this thread is a daemon thread (``True``)" +" or not (``False``). This must be set before :meth:`~Thread.start` is " +"called, otherwise :exc:`RuntimeError` is raised. Its initial value is " +"inherited from the creating thread; the main thread is not a daemon thread " +"and therefore all threads created in the main thread default to " +":attr:`~Thread.daemon` = ``False``." +msgstr "" +"一个布尔值,表示这个线程是否属于守护线程 (``True``) 或不属于 (``False``)。 这个值必须在调用 " +":meth:`~Thread.start` 之前设置,否则会引发 :exc:`RuntimeError`。 " +"它的初始值继承自创建线程;主线程不是一个守护线程,因此所有在主线程中创建的线程默认为 :attr:`~Thread.daemon` = " +"``False``。" + +#: ../../library/threading.rst:699 +msgid "" +"The entire Python program exits when no alive non-daemon threads are left." +msgstr "当没有存活的非守护线程时,整个 Python 程序才会退出。" + +#: ../../library/threading.rst:704 +msgid "" +"Deprecated getter/setter API for :attr:`~Thread.daemon`; use it directly as " +"a property instead." +msgstr "已被弃用的 :attr:`~Thread.daemon` 的取值/设值 API;请改为直接以特征属性方式使用它。" + +#: ../../library/threading.rst:713 +msgid "Lock objects" +msgstr "Lock 对象" + +#: ../../library/threading.rst:715 +msgid "" +"A primitive lock is a synchronization primitive that is not owned by a " +"particular thread when locked. In Python, it is currently the lowest level " +"synchronization primitive available, implemented directly by the " +":mod:`_thread` extension module." +msgstr "" +"原始锁是一个在锁定时不属于特定线程的同步基元组件。在 Python 中,它是能用的最低级的同步基元组件,由 :mod:`_thread` " +"扩展模块直接实现。" + +#: ../../library/threading.rst:720 +msgid "" +"A primitive lock is in one of two states, \"locked\" or \"unlocked\". It is " +"created in the unlocked state. It has two basic methods, " +":meth:`~Lock.acquire` and :meth:`~Lock.release`. When the state is " +"unlocked, :meth:`~Lock.acquire` changes the state to locked and returns " +"immediately. When the state is locked, :meth:`~Lock.acquire` blocks until a" +" call to :meth:`~Lock.release` in another thread changes it to unlocked, " +"then the :meth:`~Lock.acquire` call resets it to locked and returns. The " +":meth:`~Lock.release` method should only be called in the locked state; it " +"changes the state to unlocked and returns immediately. If an attempt is made" +" to release an unlocked lock, a :exc:`RuntimeError` will be raised." +msgstr "" +"原始锁处于 \"锁定\" 或者 \"非锁定\" 两种状态之一。它被创建时为非锁定状态。它有两个基本方法, :meth:`~Lock.acquire` 和" +" :meth:`~Lock.release`。当状态为非锁定时, :meth:`~Lock.acquire` 将状态改为 锁定 " +"并立即返回。当状态是锁定时, :meth:`~Lock.acquire` 将阻塞至其他线程调用 :meth:`~Lock.release` " +"将其改为非锁定状态,然后 :meth:`~Lock.acquire` 调用重置其为锁定状态并返回。 :meth:`~Lock.release` " +"只在锁定状态下调用;它将状态改为非锁定并立即返回。如果尝试释放一个非锁定的锁,则会引发 :exc:`RuntimeError`  异常。" + +#: ../../library/threading.rst:731 +msgid "" +"Locks also support the :ref:`context management protocol `." +msgstr "锁同样支持 :ref:`上下文管理协议 `。" + +#: ../../library/threading.rst:733 +msgid "" +"When more than one thread is blocked in :meth:`~Lock.acquire` waiting for " +"the state to turn to unlocked, only one thread proceeds when a " +":meth:`~Lock.release` call resets the state to unlocked; which one of the " +"waiting threads proceeds is not defined, and may vary across " +"implementations." +msgstr "" +"当多个线程在 :meth:`~Lock.acquire` 等待状态转变为未锁定被阻塞,然后 :meth:`~Lock.release` " +"重置状态为未锁定时,只有一个线程能继续执行;至于哪个等待线程继续执行没有定义,并且会根据实现而不同。" + +#: ../../library/threading.rst:738 +msgid "All methods are executed atomically." +msgstr "所有方法的执行都是原子性的。" + +#: ../../library/threading.rst:743 +msgid "" +"The class implementing primitive lock objects. Once a thread has acquired a" +" lock, subsequent attempts to acquire it block, until it is released; any " +"thread may release it." +msgstr "实现原始锁对象的类。一旦一个线程获得一个锁,会阻塞随后尝试获得锁的线程,直到它被释放;任何线程都可以释放它。" + +#: ../../library/threading.rst:747 +msgid "" +"``Lock`` is now a class. In earlier Pythons, ``Lock`` was a factory function" +" which returned an instance of the underlying private lock type." +msgstr "现在 ``Lock`` 是一个类。在更早的 Python 版本中,``Lock`` 是一个返回下层私有锁类型的实例的工厂函数。" + +#: ../../library/threading.rst:755 ../../library/threading.rst:849 +msgid "Acquire a lock, blocking or non-blocking." +msgstr "可以阻塞或非阻塞地获得锁。" + +#: ../../library/threading.rst:757 +msgid "" +"When invoked with the *blocking* argument set to ``True`` (the default), " +"block until the lock is unlocked, then set it to locked and return ``True``." +msgstr "当调用时参数 *blocking* 设置为 ``True`` (缺省值),阻塞直到锁被释放,然后将锁锁定并返回 ``True``。" + +#: ../../library/threading.rst:760 +msgid "" +"When invoked with the *blocking* argument set to ``False``, do not block. If" +" a call with *blocking* set to ``True`` would block, return ``False`` " +"immediately; otherwise, set the lock to locked and return ``True``." +msgstr "" +"在参数 *blocking* 被设置为 ``False`` 的情况下调用,将不会发生阻塞。如果调用时 *blocking* 设为 ``True`` " +"会阻塞,并立即返回 ``False``;否则,将锁锁定并返回 ``True``。" + +#: ../../library/threading.rst:764 +msgid "" +"When invoked with the floating-point *timeout* argument set to a positive " +"value, block for at most the number of seconds specified by *timeout* and as" +" long as the lock cannot be acquired. A *timeout* argument of ``-1`` " +"specifies an unbounded wait. It is forbidden to specify a *timeout* when " +"*blocking* is ``False``." +msgstr "" +"当参数 *timeout* 使用设置为正值的浮点数调用时,最多阻塞 *timeout* 指定的秒数,在此期间锁不能被获取。设置 *timeout* " +"参数为 ``-1`` 表示无限期等待。当 *blocking* 为 ``False`` 时不允许指定 *timeout*。" + +#: ../../library/threading.rst:770 +msgid "" +"The return value is ``True`` if the lock is acquired successfully, ``False``" +" if not (for example if the *timeout* expired)." +msgstr "如果成功获得锁,则返回 ``True``,否则返回 ``False`` (例如发生 *超时* 的时候)。" + +#: ../../library/threading.rst:773 ../../library/threading.rst:887 +#: ../../library/threading.rst:1147 +msgid "The *timeout* parameter is new." +msgstr "新的 *timeout* 形参。" + +#: ../../library/threading.rst:776 +msgid "" +"Lock acquisition can now be interrupted by signals on POSIX if the " +"underlying threading implementation supports it." +msgstr "现在如果底层线程实现支持,则可以通过 POSIX 上的信号中断锁的获取。" + +#: ../../library/threading.rst:780 +msgid "Lock acquisition can now be interrupted by signals on Windows." +msgstr "在 Windows 上现在可以通过信号来中断锁的获取。" + +#: ../../library/threading.rst:786 +msgid "" +"Release a lock. This can be called from any thread, not only the thread " +"which has acquired the lock." +msgstr "释放一个锁。这个方法可以在任何线程中调用,不单指获得锁的线程。" + +#: ../../library/threading.rst:789 +msgid "" +"When the lock is locked, reset it to unlocked, and return. If any other " +"threads are blocked waiting for the lock to become unlocked, allow exactly " +"one of them to proceed." +msgstr "当锁被锁定,将它重置为未锁定,并返回。如果其他线程正在等待这个锁解锁而被阻塞,只允许其中一个继续。" + +#: ../../library/threading.rst:793 +msgid "When invoked on an unlocked lock, a :exc:`RuntimeError` is raised." +msgstr "当在未锁定的锁上唤起时,会引发 :exc:`RuntimeError`。" + +#: ../../library/threading.rst:795 ../../library/threading.rst:903 +msgid "There is no return value." +msgstr "没有返回值。" + +#: ../../library/threading.rst:799 +msgid "Return ``True`` if the lock is acquired." +msgstr "当锁被获取时,返回 ``True``。" + +#: ../../library/threading.rst:806 +msgid "RLock objects" +msgstr "RLock 对象" + +#: ../../library/threading.rst:808 +msgid "" +"A reentrant lock is a synchronization primitive that may be acquired " +"multiple times by the same thread. Internally, it uses the concepts of " +"\"owning thread\" and \"recursion level\" in addition to the locked/unlocked" +" state used by primitive locks. In the locked state, some thread owns the " +"lock; in the unlocked state, no thread owns it." +msgstr "" +"重入锁是一个可以被同一个线程多次获取的同步基元组件。在内部,它在基元锁的锁定/非锁定状态上附加了 \"所属线程\" 和 \"递归等级\" " +"的概念。在锁定状态下,某些线程拥有锁;在非锁定状态下,没有线程拥有它。" + +#: ../../library/threading.rst:814 +msgid "" +"Threads call a lock's :meth:`~RLock.acquire` method to lock it, and its " +":meth:`~Lock.release` method to unlock it." +msgstr "线程调用锁的 :meth:`~RLock.acquire` 方法来锁定它,并调用 :meth:`~Lock.release` 方法来解锁。" + +#: ../../library/threading.rst:819 +msgid "" +"Reentrant locks support the :ref:`context management protocol `," +" so it is recommended to use :keyword:`with` instead of manually calling " +":meth:`~RLock.acquire` and :meth:`~RLock.release` to handle acquiring and " +"releasing the lock for a block of code." +msgstr "" +"重入型锁支持 :ref:`上下文管理协议 `,因此推荐使用 :keyword:`with` 而不是手动调用 " +":meth:`~RLock.acquire` 和 :meth:`~RLock.release` 来针对一个代码块处理锁的获取和释放。" + +#: ../../library/threading.rst:824 +msgid "" +"RLock's :meth:`~RLock.acquire`/:meth:`~RLock.release` call pairs may be " +"nested, unlike Lock's :meth:`~Lock.acquire`/:meth:`~Lock.release`. Only the " +"final :meth:`~RLock.release` (the :meth:`~Lock.release` of the outermost " +"pair) resets the lock to an unlocked state and allows another thread blocked" +" in :meth:`~RLock.acquire` to proceed." +msgstr "" +"RLock 的 :meth:`~RLock.acquire`/:meth:`~RLock.release` 调用对可以嵌套,这不同于 Lock 的 " +":meth:`~Lock.acquire`/:meth:`~Lock.release`。只有最终的 :meth:`~RLock.release` " +"(最外面一对的 :meth:`~Lock.release`) 会将锁重置为已解锁状态并允许在 :meth:`~RLock.acquire` " +"中被阻塞的其他线程继续执行。" + +#: ../../library/threading.rst:830 +msgid "" +":meth:`~RLock.acquire`/:meth:`~RLock.release` must be used in pairs: each " +"acquire must have a release in the thread that has acquired the lock. " +"Failing to call release as many times the lock has been acquired can lead to" +" deadlock." +msgstr "" +":meth:`~RLock.acquire`/:meth:`~RLock.release` 必须成对使用:每个 acquire " +"必须在获取锁的线程中有对应的 release。如果锁调用 release 的次数未能与 acquire 的次数一致则会导致死锁。" + +#: ../../library/threading.rst:837 +msgid "" +"This class implements reentrant lock objects. A reentrant lock must be " +"released by the thread that acquired it. Once a thread has acquired a " +"reentrant lock, the same thread may acquire it again without blocking; the " +"thread must release it once for each time it has acquired it." +msgstr "此类实现了重入锁对象。重入锁必须由获取它的线程释放。一旦线程获得了重入锁,同一个线程再次获取它将不阻塞;线程必须在每次获取它时释放一次。" + +#: ../../library/threading.rst:842 +msgid "" +"Note that ``RLock`` is actually a factory function which returns an instance" +" of the most efficient version of the concrete RLock class that is supported" +" by the platform." +msgstr "需要注意的是 ``RLock`` 其实是一个工厂函数,返回平台支持的具体递归锁类中最有效的版本的实例。" + +#: ../../library/threading.rst:853 +msgid ":ref:`Using RLock as a context manager `" +msgstr ":ref:`将 RLock 用作上下文管理器 `" + +#: ../../library/threading.rst:854 +msgid "" +"Recommended over manual :meth:`!acquire` and :meth:`release` calls whenever " +"practical." +msgstr "在大多数场合下相比手动的 :meth:`!acquire` 和 :meth:`release` 调用更为推荐。" + +#: ../../library/threading.rst:858 +msgid "" +"When invoked with the *blocking* argument set to ``True`` (the default):" +msgstr "当被唤起时将 *blocking* 参数设为 ``True`` (默认值):" + +#: ../../library/threading.rst:860 ../../library/threading.rst:872 +msgid "If no thread owns the lock, acquire the lock and return immediately." +msgstr "如无任何线程持有锁,则获取锁并立即返回。" + +#: ../../library/threading.rst:862 +msgid "" +"If another thread owns the lock, block until we are able to acquire lock, or" +" *timeout*, if set to a positive float value." +msgstr "如有其他线程持有锁,则阻塞执行直至能够获取锁,或直至 *timeout*,如果将其设为一个正浮点数值的话。" + +#: ../../library/threading.rst:865 +msgid "" +"If the same thread owns the lock, acquire the lock again, and return " +"immediately. This is the difference between :class:`Lock` and " +":class:`!RLock`; :class:`Lock` handles this case the same as the previous, " +"blocking until the lock can be acquired." +msgstr "" +"如同一线程持有锁,则再次获取该锁,并立即返回。这是 :class:`Lock` 和 :class:`!RLock` " +"之间的区别;:class:`Lock` 将以与之前相同的方式处理此情况,即阻塞执行直至能够获取锁。" + +#: ../../library/threading.rst:870 +msgid "When invoked with the *blocking* argument set to ``False``:" +msgstr "当被唤起时将 *blocking* 参数设为 ``False``:" + +#: ../../library/threading.rst:874 +msgid "If another thread owns the lock, return immediately." +msgstr "如有其他线程持有锁,则立即返回。" + +#: ../../library/threading.rst:876 +msgid "" +"If the same thread owns the lock, acquire the lock again and return " +"immediately." +msgstr "如同一线程持有锁,则再次获取该锁并立即返回。" + +#: ../../library/threading.rst:879 +msgid "" +"In all cases, if the thread was able to acquire the lock, return ``True``. " +"If the thread was unable to acquire the lock (i.e. if not blocking or the " +"timeout was reached) return ``False``." +msgstr "在所有情况下,如果线程能够获取锁,则返回 ``True``。如果线程不能获取锁(即未阻塞执行或达到超时限制)则返回 ``False``。" + +#: ../../library/threading.rst:883 +msgid "" +"If called multiple times, failing to call :meth:`~RLock.release` as many " +"times may lead to deadlock. Consider using :class:`!RLock` as a context " +"manager rather than calling acquire/release directly." +msgstr "" +"如果被多次调用,则未能调用相同次数的 :meth:`~RLock.release` 可能导致死锁。请考虑将 :class:`!RLock` " +"用作上下文管理器而不是直接调用 acquire/release。" + +#: ../../library/threading.rst:893 +msgid "" +"Release a lock, decrementing the recursion level. If after the decrement it" +" is zero, reset the lock to unlocked (not owned by any thread), and if any " +"other threads are blocked waiting for the lock to become unlocked, allow " +"exactly one of them to proceed. If after the decrement the recursion level " +"is still nonzero, the lock remains locked and owned by the calling thread." +msgstr "" +"释放锁,自减递归等级。如果减到零,则将锁重置为非锁定状态 " +"(不被任何线程拥有),并且,如果其他线程正被阻塞着等待锁被解锁,则仅允许其中一个线程继续。如果自减后,递归等级仍然不是零,则锁保持锁定,仍由调用线程拥有。" + +#: ../../library/threading.rst:899 +msgid "" +"Only call this method when the calling thread owns the lock. A " +":exc:`RuntimeError` is raised if this method is called when the lock is not " +"acquired." +msgstr "只有在调用方线程持有锁时才能调用此方法。如果在未获取锁的情况下调用此方法则会引发 :exc:`RuntimeError`。" + +#: ../../library/threading.rst:908 ../../library/threading.rst:1007 +msgid "Return a boolean indicating whether this object is locked right now." +msgstr "返回一个指明该对象目前是否被锁定的布尔值。" + +#: ../../library/threading.rst:916 +msgid "Condition objects" +msgstr "Condition 对象" + +#: ../../library/threading.rst:918 +msgid "" +"A condition variable is always associated with some kind of lock; this can " +"be passed in or one will be created by default. Passing one in is useful " +"when several condition variables must share the same lock. The lock is part" +" of the condition object: you don't have to track it separately." +msgstr "" +"条件变量总是与某种类型的锁对象相关联,锁对象可以通过传入获得,或者在缺省的情况下自动创建。当多个条件变量需要共享同一个锁时,传入一个锁很有用。锁是条件对象的一部分,你不必单独地跟踪它。" + +#: ../../library/threading.rst:923 +msgid "" +"A condition variable obeys the :ref:`context management protocol `: using the ``with`` statement acquires the associated lock for the " +"duration of the enclosed block. The :meth:`~Condition.acquire` and " +":meth:`~Condition.release` methods also call the corresponding methods of " +"the associated lock." +msgstr "" +"条件变量遵循 :ref:`上下文管理协议 `:使用 ``with`` 语句会在它包围的代码块内获取关联的锁。 " +":meth:`~Condition.acquire` 和 :meth:`~Condition.release` 方法也能调用关联锁的相关方法。" + +#: ../../library/threading.rst:929 +msgid "" +"Other methods must be called with the associated lock held. The " +":meth:`~Condition.wait` method releases the lock, and then blocks until " +"another thread awakens it by calling :meth:`~Condition.notify` or " +":meth:`~Condition.notify_all`. Once awakened, :meth:`~Condition.wait` re-" +"acquires the lock and returns. It is also possible to specify a timeout." +msgstr "" +"其它方法必须在持有关联的锁的情况下调用。 :meth:`~Condition.wait` 方法释放锁,然后阻塞直到其它线程调用 " +":meth:`~Condition.notify` 方法或 :meth:`~Condition.notify_all` 方法唤醒它。一旦被唤醒, " +":meth:`~Condition.wait` 方法重新获取锁并返回。它也可以指定超时时间。" + +#: ../../library/threading.rst:935 +msgid "" +"The :meth:`~Condition.notify` method wakes up one of the threads waiting for" +" the condition variable, if any are waiting. The " +":meth:`~Condition.notify_all` method wakes up all threads waiting for the " +"condition variable." +msgstr "" +" :meth:`~Condition.notify` 方法唤醒正在等待此条件变量的线程之中的一个。 " +":meth:`~Condition.notify_all` 方法唤醒正在等待此条件变量的所有线程。" + +#: ../../library/threading.rst:939 +msgid "" +"Note: the :meth:`~Condition.notify` and :meth:`~Condition.notify_all` " +"methods don't release the lock; this means that the thread or threads " +"awakened will not return from their :meth:`~Condition.wait` call " +"immediately, but only when the thread that called :meth:`~Condition.notify` " +"or :meth:`~Condition.notify_all` finally relinquishes ownership of the lock." +msgstr "" +"注意: :meth:`~Condition.notify` 方法和 :meth:`~Condition.notify_all` " +"方法并不会释放锁,这意味着被唤醒的线程不会立即从它们的 :meth:`~Condition.wait` 方法调用中返回,而是会在调用了 " +":meth:`~Condition.notify` 方法或 :meth:`~Condition.notify_all` " +"方法的线程最终放弃了锁的所有权后返回。" + +#: ../../library/threading.rst:945 +msgid "" +"The typical programming style using condition variables uses the lock to " +"synchronize access to some shared state; threads that are interested in a " +"particular change of state call :meth:`~Condition.wait` repeatedly until " +"they see the desired state, while threads that modify the state call " +":meth:`~Condition.notify` or :meth:`~Condition.notify_all` when they change " +"the state in such a way that it could possibly be a desired state for one of" +" the waiters. For example, the following code is a generic producer-" +"consumer situation with unlimited buffer capacity::" +msgstr "" +"使用条件变量的典型编程风格是将锁用于同步某些共享状态的权限,那些对状态的某些特定改变感兴趣的线程,它们重复调用 " +":meth:`~Condition.wait` " +"方法,直到看到所期望的改变发生;而对于修改状态的线程,它们将当前状态改变为可能是等待者所期待的新状态后,调用 " +":meth:`~Condition.notify` 方法或者 :meth:`~Condition.notify_all` " +"方法。例如,下面的代码是一个通用的无限缓冲区容量的生产者 - 消费者情形:" + +#: ../../library/threading.rst:954 +msgid "" +"# Consume one item\n" +"with cv:\n" +" while not an_item_is_available():\n" +" cv.wait()\n" +" get_an_available_item()\n" +"\n" +"# Produce one item\n" +"with cv:\n" +" make_an_item_available()\n" +" cv.notify()" +msgstr "" +"# 消费一个条目\n" +"with cv:\n" +" while not an_item_is_available():\n" +" cv.wait()\n" +" get_an_available_item()\n" +"\n" +"# 生产一个条目\n" +"with cv:\n" +" make_an_item_available()\n" +" cv.notify()" + +#: ../../library/threading.rst:965 +msgid "" +"The ``while`` loop checking for the application's condition is necessary " +"because :meth:`~Condition.wait` can return after an arbitrary long time, and" +" the condition which prompted the :meth:`~Condition.notify` call may no " +"longer hold true. This is inherent to multi-threaded programming. The " +":meth:`~Condition.wait_for` method can be used to automate the condition " +"checking, and eases the computation of timeouts::" +msgstr "" +"使用 ``while`` 循环检查所要求的条件成立与否是有必要的,因为 :meth:`~Condition.wait` " +"方法可能要经过不确定长度的时间后才会返回,而此时导致 :meth:`~Condition.notify` " +"方法调用的那个条件可能已经不再成立。这是多线程编程所固有的问题。 " +":meth:`~Condition.wait_for` 方法可自动化条件检查,并简化超时计算。" + +#: ../../library/threading.rst:972 +msgid "" +"# Consume an item\n" +"with cv:\n" +" cv.wait_for(an_item_is_available)\n" +" get_an_available_item()" +msgstr "" +"# 消费一个条目\n" +"with cv:\n" +" cv.wait_for(an_item_is_available)\n" +" get_an_available_item()" + +#: ../../library/threading.rst:977 +msgid "" +"To choose between :meth:`~Condition.notify` and " +":meth:`~Condition.notify_all`, consider whether one state change can be " +"interesting for only one or several waiting threads. E.g. in a typical " +"producer-consumer situation, adding one item to the buffer only needs to " +"wake up one consumer thread." +msgstr "" +"选择 :meth:`~Condition.notify` 还是 :meth:`~Condition.notify_all` " +",取决于一次状态改变是只能被一个还是能被多个等待线程所用。例如在一个典型的生产者 - 消费者情形中,添加一个项目到缓冲区只需唤醒一个消费者线程。" + +#: ../../library/threading.rst:985 +msgid "" +"This class implements condition variable objects. A condition variable " +"allows one or more threads to wait until they are notified by another " +"thread." +msgstr "实现条件变量对象的类。一个条件变量对象允许一个或多个线程在被其它线程所通知之前进行等待。" + +#: ../../library/threading.rst:988 +msgid "" +"If the *lock* argument is given and not ``None``, it must be a :class:`Lock`" +" or :class:`RLock` object, and it is used as the underlying lock. " +"Otherwise, a new :class:`RLock` object is created and used as the underlying" +" lock." +msgstr "" +"如果给出了非 ``None`` 的 *lock* 参数,则它必须为 :class:`Lock` 或者 :class:`RLock` " +"对象,并且它将被用作底层锁。否则,将会创建新的 :class:`RLock` 对象,并将其用作底层锁。" + +#: ../../library/threading.rst:992 ../../library/threading.rst:1122 +#: ../../library/threading.rst:1168 ../../library/threading.rst:1220 +#: ../../library/threading.rst:1288 +msgid "changed from a factory function to a class." +msgstr "从工厂函数变为类。" + +#: ../../library/threading.rst:997 +msgid "" +"Acquire the underlying lock. This method calls the corresponding method on " +"the underlying lock; the return value is whatever that method returns." +msgstr "请求底层锁。此方法调用底层锁的相应方法,返回值是底层锁相应方法的返回值。" + +#: ../../library/threading.rst:1002 +msgid "" +"Release the underlying lock. This method calls the corresponding method on " +"the underlying lock; there is no return value." +msgstr "释放底层锁。此方法调用底层锁的相应方法。没有返回值。" + +#: ../../library/threading.rst:1013 +msgid "" +"Wait until notified or until a timeout occurs. If the calling thread has not" +" acquired the lock when this method is called, a :exc:`RuntimeError` is " +"raised." +msgstr "等待直到被通知或发生超时。如果线程在调用此方法时没有获得锁,将会引发 :exc:`RuntimeError` 异常。" + +#: ../../library/threading.rst:1017 +msgid "" +"This method releases the underlying lock, and then blocks until it is " +"awakened by a :meth:`notify` or :meth:`notify_all` call for the same " +"condition variable in another thread, or until the optional timeout occurs." +" Once awakened or timed out, it re-acquires the lock and returns." +msgstr "" +"这个方法释放底层锁,然后阻塞,直到在另外一个线程中调用同一个条件变量的 :meth:`notify` 或 :meth:`notify_all` " +"唤醒它,或者直到可选的超时发生。一旦被唤醒或者超时,它重新获得锁并返回。" + +#: ../../library/threading.rst:1022 +msgid "" +"When the *timeout* argument is present and not ``None``, it should be a " +"floating-point number specifying a timeout for the operation in seconds (or " +"fractions thereof)." +msgstr "当提供了 *timeout* 参数且不是 ``None`` 时,它应该是一个浮点数,代表操作的超时时间,以秒为单位(可以为小数)。" + +#: ../../library/threading.rst:1026 +msgid "" +"When the underlying lock is an :class:`RLock`, it is not released using its " +":meth:`release` method, since this may not actually unlock the lock when it " +"was acquired multiple times recursively. Instead, an internal interface of " +"the :class:`RLock` class is used, which really unlocks it even when it has " +"been recursively acquired several times. Another internal interface is then " +"used to restore the recursion level when the lock is reacquired." +msgstr "" +"当底层锁是个 :class:`RLock`,不会使用它的 :meth:`release` " +"方法释放锁,因为当它被递归多次获取时,实际上可能无法解锁。相反,使用了 :class:`RLock` 类的内部接口,即使多次递归获取它也能解锁它。 " +"然后,在重新获取锁时,使用另一个内部接口来恢复递归级别。" + +#: ../../library/threading.rst:1034 +msgid "" +"The return value is ``True`` unless a given *timeout* expired, in which case" +" it is ``False``." +msgstr "返回 ``True``,除非提供的 *timeout* 过期,这种情况下返回 ``False``。" + +#: ../../library/threading.rst:1037 ../../library/threading.rst:1253 +msgid "Previously, the method always returned ``None``." +msgstr "在此之前,方法总是返回 ``None``。" + +#: ../../library/threading.rst:1042 +msgid "" +"Wait until a condition evaluates to true. *predicate* should be a callable " +"which result will be interpreted as a boolean value. A *timeout* may be " +"provided giving the maximum time to wait." +msgstr "" +"等待,直到条件计算为真。 *predicate* 应该是一个可调用对象而且它的返回值可被解释为一个布尔值。可以提供 *timeout* " +"参数给出最大等待时间。" + +#: ../../library/threading.rst:1046 +msgid "" +"This utility method may call :meth:`wait` repeatedly until the predicate is " +"satisfied, or until a timeout occurs. The return value is the last return " +"value of the predicate and will evaluate to ``False`` if the method timed " +"out." +msgstr "" +"这个实用方法会重复地调用 :meth:`wait` 直到满足判断式或者发生超时。返回值是判断式最后一个返回值,而且如果方法发生超时会返回 " +"``False`` ." + +#: ../../library/threading.rst:1051 +msgid "" +"Ignoring the timeout feature, calling this method is roughly equivalent to " +"writing::" +msgstr "忽略超时功能,调用此方法大致相当于编写::" + +#: ../../library/threading.rst:1054 +msgid "" +"while not predicate():\n" +" cv.wait()" +msgstr "" +"while not predicate():\n" +" cv.wait()" + +#: ../../library/threading.rst:1057 +msgid "" +"Therefore, the same rules apply as with :meth:`wait`: The lock must be held " +"when called and is re-acquired on return. The predicate is evaluated with " +"the lock held." +msgstr "因此,规则同样适用于 :meth:`wait`:锁必须在被调用时保持获取,并在返回时重新获取。随着锁定执行判断式。" + +#: ../../library/threading.rst:1065 +msgid "" +"By default, wake up one thread waiting on this condition, if any. If the " +"calling thread has not acquired the lock when this method is called, a " +":exc:`RuntimeError` is raised." +msgstr "默认唤醒一个等待这个条件的线程。如果调用线程在没有获得锁的情况下调用这个方法,会引发 :exc:`RuntimeError` 异常。" + +#: ../../library/threading.rst:1069 +msgid "" +"This method wakes up at most *n* of the threads waiting for the condition " +"variable; it is a no-op if no threads are waiting." +msgstr "这个方法唤醒最多 *n* 个正在等待这个条件变量的线程;如果没有线程在等待,这是一个空操作。" + +#: ../../library/threading.rst:1072 +msgid "" +"The current implementation wakes up exactly *n* threads, if at least *n* " +"threads are waiting. However, it's not safe to rely on this behavior. A " +"future, optimized implementation may occasionally wake up more than *n* " +"threads." +msgstr "" +"当前实现中,如果至少有 *n* 个线程正在等待,准确唤醒 *n* 个线程。但是依赖这个行为并不安全。未来,优化的实现有时会唤醒超过 *n* 个线程。" + +#: ../../library/threading.rst:1077 +msgid "" +"Note: an awakened thread does not actually return from its :meth:`wait` call" +" until it can reacquire the lock. Since :meth:`notify` does not release the" +" lock, its caller should." +msgstr "" +"注意:被唤醒的线程并没有真正恢复到它调用的 :meth:`wait`,直到它可以重新获得锁。因为 :meth:`notify` " +"不释放锁,其调用者才应该这样做。" + +#: ../../library/threading.rst:1083 +msgid "" +"Wake up all threads waiting on this condition. This method acts like " +":meth:`notify`, but wakes up all waiting threads instead of one. If the " +"calling thread has not acquired the lock when this method is called, a " +":exc:`RuntimeError` is raised." +msgstr "" +"唤醒所有正在等待这个条件的线程。这个方法行为与 :meth:`notify` " +"相似,但并不只唤醒单一线程,而是唤醒所有等待线程。如果调用线程在调用这个方法时没有获得锁,会引发 :exc:`RuntimeError` 异常。" + +#: ../../library/threading.rst:1088 +msgid "The method ``notifyAll`` is a deprecated alias for this method." +msgstr "``notifyAll`` 方法是此方法的已弃用别名。" + +#: ../../library/threading.rst:1094 +msgid "Semaphore objects" +msgstr "Semaphore 对象" + +#: ../../library/threading.rst:1096 +msgid "" +"This is one of the oldest synchronization primitives in the history of " +"computer science, invented by the early Dutch computer scientist Edsger W. " +"Dijkstra (he used the names ``P()`` and ``V()`` instead of " +":meth:`~Semaphore.acquire` and :meth:`~Semaphore.release`)." +msgstr "" +"这是计算机科学史上最古老的同步原语之一,早期的荷兰科学家 Edsger W. Dijkstra 发明了它。 (他使用名称 ``P()`` 和 " +"``V()`` 而不是 :meth:`~Semaphore.acquire` 和 :meth:`~Semaphore.release`)。" + +#: ../../library/threading.rst:1101 +msgid "" +"A semaphore manages an internal counter which is decremented by each " +":meth:`~Semaphore.acquire` call and incremented by each " +":meth:`~Semaphore.release` call. The counter can never go below zero; when " +":meth:`~Semaphore.acquire` finds that it is zero, it blocks, waiting until " +"some other thread calls :meth:`~Semaphore.release`." +msgstr "" +"一个信号量管理一个内部计数器,该计数器因 :meth:`~Semaphore.acquire` 方法的调用而递减,因 " +":meth:`~Semaphore.release` 方法的调用而递增。计数器的值永远不会小于零;当 " +":meth:`~Semaphore.acquire` 方法发现计数器为零时,将会阻塞,直到其它线程调用 " +":meth:`~Semaphore.release` 方法。" + +#: ../../library/threading.rst:1107 +msgid "" +"Semaphores also support the :ref:`context management protocol `." +msgstr "信号量对象也支持 :ref:`上下文管理协议 `。" + +#: ../../library/threading.rst:1112 +msgid "" +"This class implements semaphore objects. A semaphore manages an atomic " +"counter representing the number of :meth:`release` calls minus the number of" +" :meth:`acquire` calls, plus an initial value. The :meth:`acquire` method " +"blocks if necessary until it can return without making the counter negative." +" If not given, *value* defaults to 1." +msgstr "" +"该类实现信号量对象。信号量对象管理一个原子性的计数器,代表 :meth:`release` 方法的调用次数减去 :meth:`acquire` " +"的调用次数再加上一个初始值。如果需要, :meth:`acquire` 方法将会阻塞直到可以返回而不会使得计数器变成负数。在没有显式给出 *value*" +" 的值时,默认为 1。" + +#: ../../library/threading.rst:1118 +msgid "" +"The optional argument gives the initial *value* for the internal counter; it" +" defaults to ``1``. If the *value* given is less than 0, :exc:`ValueError` " +"is raised." +msgstr "" +"可选参数 *value* 赋予内部计数器初始值,默认值为 ``1``。如果 *value* 被赋予小于 0 的值,将会引发 " +":exc:`ValueError` 异常。" + +#: ../../library/threading.rst:1127 +msgid "Acquire a semaphore." +msgstr "获取一个信号量。" + +#: ../../library/threading.rst:1129 +msgid "When invoked without arguments:" +msgstr "在不带参数的情况下调用时:" + +#: ../../library/threading.rst:1131 +msgid "" +"If the internal counter is larger than zero on entry, decrement it by one " +"and return ``True`` immediately." +msgstr "如果在进入时内部计数器的值大于零,则将其减一并立即返回 ``True``。" + +#: ../../library/threading.rst:1133 +msgid "" +"If the internal counter is zero on entry, block until awoken by a call to " +":meth:`~Semaphore.release`. Once awoken (and the counter is greater than " +"0), decrement the counter by 1 and return ``True``. Exactly one thread will" +" be awoken by each call to :meth:`~Semaphore.release`. The order in which " +"threads are awoken should not be relied on." +msgstr "" +"如果在进入时内部计数器的值为零,则将会阻塞直到被对 :meth:`~Semaphore.release` 的调用唤醒。一旦被唤醒(并且计数器的值大于 " +"0),则将计数器减 1 并返回 ``True``。每次对 :meth:`~Semaphore.release` 的调用将只唤醒一个线程。 " +"线程被唤醒的次序是不可确定的。" + +#: ../../library/threading.rst:1139 +msgid "" +"When invoked with *blocking* set to ``False``, do not block. If a call " +"without an argument would block, return ``False`` immediately; otherwise, do" +" the same thing as when called without arguments, and return ``True``." +msgstr "" +"当 *blocking* 设置为 ``False`` 时调用,不会阻塞。如果没有参数的调用会阻塞,立即返回 " +"``False``;否则,做与无参数调用相同的事情时返回 ``True``。" + +#: ../../library/threading.rst:1143 +msgid "" +"When invoked with a *timeout* other than ``None``, it will block for at most" +" *timeout* seconds. If acquire does not complete successfully in that " +"interval, return ``False``. Return ``True`` otherwise." +msgstr "" +"当被唤起时如果 *timeout* 不为 ``None``,则它将阻塞最多 *timeout* 秒。请求在此时段时未能成功完成获取则将返回 " +"``False``。在其他情况下返回 ``True``。" + +#: ../../library/threading.rst:1152 +msgid "" +"Release a semaphore, incrementing the internal counter by *n*. When it was " +"zero on entry and other threads are waiting for it to become larger than " +"zero again, wake up *n* of those threads." +msgstr "释放一个信号量,将内部计数器的值增加 *n*。当进入时值为零且有其他线程正在等待它再次变为大于零时,则唤醒那 *n* 个线程。" + +#: ../../library/threading.rst:1156 +msgid "Added the *n* parameter to release multiple waiting threads at once." +msgstr "增加了 *n* 形参以一次性释放多个等待线程。" + +#: ../../library/threading.rst:1162 +msgid "" +"Class implementing bounded semaphore objects. A bounded semaphore checks to" +" make sure its current value doesn't exceed its initial value. If it does, " +":exc:`ValueError` is raised. In most situations semaphores are used to guard" +" resources with limited capacity. If the semaphore is released too many " +"times it's a sign of a bug. If not given, *value* defaults to 1." +msgstr "" +"该类实现有界信号量。有界信号量通过检查以确保它当前的值不会超过初始值。如果超过了初始值,将会引发 :exc:`ValueError` " +"异常。在大多情况下,信号量用于保护数量有限的资源。如果信号量被释放的次数过多,则表明出现了错误。没有指定时, *value* 的值默认为 1。" + +#: ../../library/threading.rst:1175 +msgid ":class:`Semaphore` example" +msgstr ":class:`Semaphore` 示例" + +#: ../../library/threading.rst:1177 +msgid "" +"Semaphores are often used to guard resources with limited capacity, for " +"example, a database server. In any situation where the size of the resource" +" is fixed, you should use a bounded semaphore. Before spawning any worker " +"threads, your main thread would initialize the semaphore::" +msgstr "" +"信号量通常用于保护数量有限的资源,例如数据库服务器。在资源数量固定的任何情况下,都应该使用有界信号量。在生成任何工作线程前,应该在主线程中初始化信号量。" + +#: ../../library/threading.rst:1182 +msgid "" +"maxconnections = 5\n" +"# ...\n" +"pool_sema = BoundedSemaphore(value=maxconnections)" +msgstr "" +"maxconnections = 5\n" +"# ...\n" +"pool_sema = BoundedSemaphore(value=maxconnections)" + +#: ../../library/threading.rst:1186 +msgid "" +"Once spawned, worker threads call the semaphore's acquire and release " +"methods when they need to connect to the server::" +msgstr "工作线程生成后,当需要连接服务器时,这些线程将调用信号量的 acquire 和 release 方法:" + +#: ../../library/threading.rst:1189 +msgid "" +"with pool_sema:\n" +" conn = connectdb()\n" +" try:\n" +" # ... use connection ...\n" +" finally:\n" +" conn.close()" +msgstr "" +"with pool_sema:\n" +" conn = connectdb()\n" +" try:\n" +" # ... 使用连接 ...\n" +" finally:\n" +" conn.close()" + +#: ../../library/threading.rst:1196 +msgid "" +"The use of a bounded semaphore reduces the chance that a programming error " +"which causes the semaphore to be released more than it's acquired will go " +"undetected." +msgstr "使用有界信号量能减少这种编程错误:信号量的释放次数多于其请求次数。" + +#: ../../library/threading.rst:1203 +msgid "Event objects" +msgstr "Event 对象" + +#: ../../library/threading.rst:1205 +msgid "" +"This is one of the simplest mechanisms for communication between threads: " +"one thread signals an event and other threads wait for it." +msgstr "这是线程之间通信的最简单机制之一:一个线程发出事件信号,而其他线程等待该信号。" + +#: ../../library/threading.rst:1208 +msgid "" +"An event object manages an internal flag that can be set to true with the " +":meth:`~Event.set` method and reset to false with the :meth:`~Event.clear` " +"method. The :meth:`~Event.wait` method blocks until the flag is true." +msgstr "" +"一个事件对象管理一个内部标识,调用 :meth:`~Event.set` 方法可将其设置为 true,调用 :meth:`~Event.clear` " +"方法可将其设置为 false,调用 :meth:`~Event.wait` 方法将进入阻塞直到标识为 true。" + +#: ../../library/threading.rst:1215 +msgid "" +"Class implementing event objects. An event manages a flag that can be set " +"to true with the :meth:`~Event.set` method and reset to false with the " +":meth:`clear` method. The :meth:`wait` method blocks until the flag is " +"true. The flag is initially false." +msgstr "" +"实现事件对象的类。事件对象管理一个内部标识,调用 :meth:`~Event.set` 方法可将其设置为 true。调用 " +":meth:`~Event.clear` 方法可将其设置为 false。调用 :meth:`~Event.wait` 方法将进入阻塞直到标识为 " +"true。这个标识初始时为 false。" + +#: ../../library/threading.rst:1225 +msgid "Return ``True`` if and only if the internal flag is true." +msgstr "当且仅当内部标识为 true 时返回 ``True``。" + +#: ../../library/threading.rst:1227 +msgid "The method ``isSet`` is a deprecated alias for this method." +msgstr "``isSet`` 方法是此方法的已弃用别名。" + +#: ../../library/threading.rst:1231 +msgid "" +"Set the internal flag to true. All threads waiting for it to become true are" +" awakened. Threads that call :meth:`wait` once the flag is true will not " +"block at all." +msgstr "" +"将内部标识设置为 true。所有正在等待这个事件的线程将被唤醒。当标识为 true 时,调用 :meth:`wait` 方法的线程不会被阻塞。" + +#: ../../library/threading.rst:1237 +msgid "" +"Reset the internal flag to false. Subsequently, threads calling :meth:`wait`" +" will block until :meth:`.set` is called to set the internal flag to true " +"again." +msgstr "" +"将内部标识设置为 false。之后调用 :meth:`wait` 方法的线程将会被阻塞,直到调用 :meth:`.set` 方法将内部标识再次设置为 " +"true ." + +#: ../../library/threading.rst:1243 +msgid "" +"Block as long as the internal flag is false and the timeout, if given, has " +"not expired. The return value represents the reason that this blocking " +"method returned; ``True`` if returning because the internal flag is set to " +"true, or ``False`` if a timeout is given and the internal flag did not " +"become true within the given wait time." +msgstr "" +"只要内部旗标为假值且未超出所给出的 timeout 值就保持阻塞。返回值表示阻塞方法返回的原因;如果返回是因为内部旗标被设为真值则为 " +"``True``,或者如果给出了 timeout 值而内部旗标在给定的等待时间内没有变成真值则为 ``False``。" + +#: ../../library/threading.rst:1249 +msgid "" +"When the timeout argument is present and not ``None``, it should be a " +"floating-point number specifying a timeout for the operation in seconds, or " +"fractions thereof." +msgstr "当提供了 timeout 参数且不为 ``None`` 时,它应当为一个指定操作的超时限制秒数的浮点值,也可以为分数。" + +#: ../../library/threading.rst:1260 +msgid "Timer objects" +msgstr "Timer 对象" + +#: ../../library/threading.rst:1262 +msgid "" +"This class represents an action that should be run only after a certain " +"amount of time has passed --- a timer. :class:`Timer` is a subclass of " +":class:`Thread` and as such also functions as an example of creating custom " +"threads." +msgstr "" +"此类表示一个操作应该在等待一定的时间之后运行 --- 相当于一个定时器。 :class:`Timer` 类是 :class:`Thread` " +"类的子类,因此可以像一个自定义线程一样工作。" + +#: ../../library/threading.rst:1266 +msgid "" +"Timers are started, as with threads, by calling their :meth:`Timer.start " +"` method. The timer can be stopped (before its action has " +"begun) by calling the :meth:`~Timer.cancel` method. The interval the timer " +"will wait before executing its action may not be exactly the same as the " +"interval specified by the user." +msgstr "" +"与线程一样,定时器也是通过调用其 :meth:`Timer.start ` 方法来启动的。定时器可以通过调用 " +":meth:`~Timer.cancel` 方法来停止(在其动作开始之前)。定时器在执行其行动之前要等待的时间间隔可能与用户指定的时间间隔不完全相同。" + +#: ../../library/threading.rst:1272 +msgid "For example::" +msgstr "例如:" + +#: ../../library/threading.rst:1274 +msgid "" +"def hello():\n" +" print(\"hello, world\")\n" +"\n" +"t = Timer(30.0, hello)\n" +"t.start() # after 30 seconds, \"hello, world\" will be printed" +msgstr "" +"def hello():\n" +" print(\"hello, world\")\n" +"\n" +"t = Timer(30.0, hello)\n" +"t.start() # 30 秒之后,将打印 \"hello, world\"" + +#: ../../library/threading.rst:1283 +msgid "" +"Create a timer that will run *function* with arguments *args* and keyword " +"arguments *kwargs*, after *interval* seconds have passed. If *args* is " +"``None`` (the default) then an empty list will be used. If *kwargs* is " +"``None`` (the default) then an empty dict will be used." +msgstr "" +"创建一个定时器,在经过 *interval* 秒的间隔事件后,将会用参数 *args* 和关键字参数 *kwargs* 调用 *function*。 " +"如果 *args* 为 ``None`` (默认值),则会使用一个空列表。 如果 *kwargs* 为 ``None`` " +"(默认值),则会使用一个空字典。" + +#: ../../library/threading.rst:1293 +msgid "" +"Stop the timer, and cancel the execution of the timer's action. This will " +"only work if the timer is still in its waiting stage." +msgstr "停止定时器并取消执行计时器将要执行的操作。仅当计时器仍处于等待状态时有效。" + +#: ../../library/threading.rst:1298 +msgid "Barrier objects" +msgstr "Barrier 对象" + +#: ../../library/threading.rst:1302 +msgid "" +"This class provides a simple synchronization primitive for use by a fixed " +"number of threads that need to wait for each other. Each of the threads " +"tries to pass the barrier by calling the :meth:`~Barrier.wait` method and " +"will block until all of the threads have made their :meth:`~Barrier.wait` " +"calls. At this point, the threads are released simultaneously." +msgstr "" +"栅栏类提供一个简单的同步原语,用于应对固定数量的线程需要彼此相互等待的情况。线程调用 :meth:`~Barrier.wait` " +"方法后将阻塞,直到所有线程都调用了 :meth:`~Barrier.wait` 方法。此时所有线程将被同时释放。" + +#: ../../library/threading.rst:1308 +msgid "" +"The barrier can be reused any number of times for the same number of " +"threads." +msgstr "栅栏对象可以被多次使用,但线程的数量不能改变。" + +#: ../../library/threading.rst:1310 +msgid "" +"As an example, here is a simple way to synchronize a client and server " +"thread::" +msgstr "这是一个使用简便的方法实现客户端线程与服务端线程同步的例子:" + +#: ../../library/threading.rst:1312 +msgid "" +"b = Barrier(2, timeout=5)\n" +"\n" +"def server():\n" +" start_server()\n" +" b.wait()\n" +" while True:\n" +" connection = accept_connection()\n" +" process_server_connection(connection)\n" +"\n" +"def client():\n" +" b.wait()\n" +" while True:\n" +" connection = make_connection()\n" +" process_client_connection(connection)" +msgstr "" +"b = Barrier(2, timeout=5)\n" +"\n" +"def server():\n" +" start_server()\n" +" b.wait()\n" +" while True:\n" +" connection = accept_connection()\n" +" process_server_connection(connection)\n" +"\n" +"def client():\n" +" b.wait()\n" +" while True:\n" +" connection = make_connection()\n" +" process_client_connection(connection)" + +#: ../../library/threading.rst:1330 +msgid "" +"Create a barrier object for *parties* number of threads. An *action*, when " +"provided, is a callable to be called by one of the threads when they are " +"released. *timeout* is the default timeout value if none is specified for " +"the :meth:`wait` method." +msgstr "" +"创建一个需要 *parties* 个线程的栅栏对象。如果提供了可调用的 *action* 参数,它会在所有线程被释放时在其中一个线程中自动调用。 " +"*timeout* 是默认的超时时间,如果没有在 :meth:`wait` 方法中指定超时时间的话。" + +#: ../../library/threading.rst:1337 +msgid "" +"Pass the barrier. When all the threads party to the barrier have called " +"this function, they are all released simultaneously. If a *timeout* is " +"provided, it is used in preference to any that was supplied to the class " +"constructor." +msgstr "" +"冲出栅栏。当栅栏中所有线程都已经调用了这个函数,它们将同时被释放。如果提供了 *timeout* 参数,这里的 *timeout* " +"参数优先于创建栅栏对象时提供的 *timeout* 参数。" + +#: ../../library/threading.rst:1342 +msgid "" +"The return value is an integer in the range 0 to *parties* -- 1, different " +"for each thread. This can be used to select a thread to do some special " +"housekeeping, e.g.::" +msgstr "" +"函数返回值是一个整数,取值范围在 0 到 *parties* -- " +"1,在每个线程中的返回值不相同。可用于从所有线程中选择唯一的一个线程执行一些特别的工作。例如:" + +#: ../../library/threading.rst:1346 +msgid "" +"i = barrier.wait()\n" +"if i == 0:\n" +" # Only one thread needs to print this\n" +" print(\"passed the barrier\")" +msgstr "" +"i = barrier.wait()\n" +"if i == 0:\n" +" # 只有一个线程需要打印此文本\n" +" print(\"passed the barrier\")" + +#: ../../library/threading.rst:1351 +msgid "" +"If an *action* was provided to the constructor, one of the threads will have" +" called it prior to being released. Should this call raise an error, the " +"barrier is put into the broken state." +msgstr "如果创建栅栏对象时在构造函数中提供了 *action* 参数,它将在其中一个线程释放前被调用。如果此调用引发了异常,栅栏对象将进入损坏态。" + +#: ../../library/threading.rst:1355 +msgid "If the call times out, the barrier is put into the broken state." +msgstr "如果发生了超时,栅栏对象将进入破损态。" + +#: ../../library/threading.rst:1357 +msgid "" +"This method may raise a :class:`BrokenBarrierError` exception if the barrier" +" is broken or reset while a thread is waiting." +msgstr "如果栅栏对象进入破损态,或重置栅栏时仍有线程等待释放,将会引发 :class:`BrokenBarrierError` 异常。" + +#: ../../library/threading.rst:1362 +msgid "" +"Return the barrier to the default, empty state. Any threads waiting on it " +"will receive the :class:`BrokenBarrierError` exception." +msgstr "重置栅栏为默认的初始态。如果栅栏中仍有线程等待释放,这些线程将会收到 :class:`BrokenBarrierError` 异常。" + +#: ../../library/threading.rst:1365 +msgid "" +"Note that using this function may require some external synchronization if " +"there are other threads whose state is unknown. If a barrier is broken it " +"may be better to just leave it and create a new one." +msgstr "请注意使用此函数时,如果存在状态未知的其他线程,则可能需要执行外部同步。如果栅栏已损坏则最好将其废弃并新建一个。" + +#: ../../library/threading.rst:1371 +msgid "" +"Put the barrier into a broken state. This causes any active or future calls" +" to :meth:`wait` to fail with the :class:`BrokenBarrierError`. Use this for" +" example if one of the threads needs to abort, to avoid deadlocking the " +"application." +msgstr "" +"使栅栏处于损坏状态。这将导致任何现有和未来对 :meth:`wait` 的调用失败并引发 :class:`BrokenBarrierError`。 " +"例如可以在需要中止某个线程时使用此方法,以避免应用程序的死锁。" + +#: ../../library/threading.rst:1376 +msgid "" +"It may be preferable to simply create the barrier with a sensible *timeout* " +"value to automatically guard against one of the threads going awry." +msgstr "更好的方式是:创建栅栏时提供一个合理的超时时间,来自动避免某个线程出错。" + +#: ../../library/threading.rst:1382 +msgid "The number of threads required to pass the barrier." +msgstr "冲出栅栏所需要的线程数量。" + +#: ../../library/threading.rst:1386 +msgid "The number of threads currently waiting in the barrier." +msgstr "当前时刻正在栅栏中阻塞的线程数量。" + +#: ../../library/threading.rst:1390 +msgid "A boolean that is ``True`` if the barrier is in the broken state." +msgstr "一个布尔值,值为 ``True`` 表明栅栏为破损态。" + +#: ../../library/threading.rst:1395 +msgid "" +"This exception, a subclass of :exc:`RuntimeError`, is raised when the " +":class:`Barrier` object is reset or broken." +msgstr "" +"异常类,是 :exc:`RuntimeError` 异常的子类,在 :class:`Barrier` 对象重置时仍有线程阻塞时和对象进入破损态时被引发。" + +#: ../../library/threading.rst:1402 +msgid "" +"Using locks, conditions, and semaphores in the :keyword:`!with` statement" +msgstr "在 :keyword:`!with` 语句中使用锁、条件和信号量" + +#: ../../library/threading.rst:1404 +msgid "" +"All of the objects provided by this module that have ``acquire`` and " +"``release`` methods can be used as context managers for a :keyword:`with` " +"statement. The ``acquire`` method will be called when the block is entered," +" and ``release`` will be called when the block is exited. Hence, the " +"following snippet::" +msgstr "" +"本模块提供的所有具有 ``acquire`` 和 ``release`` 方法的对象都可用作 :keyword:`with` 语句的上下文管理器。 " +"进入语句块时将调用 ``acquire`` 方法,退出语句块时将调用 ``release`` 方法。因此,下面的代码段::" + +#: ../../library/threading.rst:1410 +msgid "" +"with some_lock:\n" +" # do something..." +msgstr "" +"with some_lock:\n" +" # 执行某种操作..." + +#: ../../library/threading.rst:1413 +msgid "is equivalent to::" +msgstr "相当于::" + +#: ../../library/threading.rst:1415 +msgid "" +"some_lock.acquire()\n" +"try:\n" +" # do something...\n" +"finally:\n" +" some_lock.release()" +msgstr "" +"some_lock.acquire()\n" +"try:\n" +" # 执行某种操作...\n" +"finally:\n" +" some_lock.release()" + +#: ../../library/threading.rst:1421 +msgid "" +"Currently, :class:`Lock`, :class:`RLock`, :class:`Condition`, " +":class:`Semaphore`, and :class:`BoundedSemaphore` objects may be used as " +":keyword:`with` statement context managers." +msgstr "" +"现在 :class:`Lock`、 :class:`RLock`、 :class:`Condition`、 :class:`Semaphore` 和 " +":class:`BoundedSemaphore` 对象可以用作 :keyword:`with` 语句的上下文管理器。" + +#: ../../library/threading.rst:222 ../../library/threading.rst:240 +msgid "trace function" +msgstr "追踪函数" + +#: ../../library/threading.rst:240 +msgid "debugger" +msgstr "调试器" + +#: ../../library/threading.rst:251 ../../library/threading.rst:269 +msgid "profile function" +msgstr "性能分析函数" diff --git a/library/threadsafety.po b/library/threadsafety.po new file mode 100644 index 0000000000..b2218c802f --- /dev/null +++ b/library/threadsafety.po @@ -0,0 +1,996 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/threadsafety.rst:5 +msgid "Thread Safety Guarantees" +msgstr "线程安全性保证" + +#: ../../library/threadsafety.rst:7 +msgid "" +"This page documents thread-safety guarantees for built-in types in Python's " +"free-threaded build. The guarantees described here apply when using Python " +"with the :term:`GIL` disabled (free-threaded mode). When the GIL is enabled," +" most operations are implicitly serialized." +msgstr "" +"本页面记录了针对 Python 自由线程构建版中内置类型的线程安全保证。 在此描述的保证适用于 Python 禁用了 :term:`GIL` " +"的情况(即自由线程模式)。 当启用 GIL 时,大多数操作都是隐式地串行的。" + +#: ../../library/threadsafety.rst:12 +msgid "" +"For general guidance on writing thread-safe code in free-threaded Python, " +"see :ref:`freethreading-python-howto`." +msgstr "" +"有关如何在自由线程版 Python 中编写线程安全代码的通用指导,请参阅 :ref:`freethreading-python-howto`。" + +#: ../../library/threadsafety.rst:19 +msgid "Thread safety levels" +msgstr "线程安全性级别" + +#: ../../library/threadsafety.rst:21 +msgid "" +"The C API documentation uses the following levels to describe the thread " +"safety guarantees of each function. The levels are listed from least to most" +" safe." +msgstr "C API 文档使用下列级别来描述每个函数的线程安全性保证。 这些级别按从最低到最高的安全性排列。" + +#: ../../library/threadsafety.rst:28 +msgid "Incompatible" +msgstr "不兼容" + +#: ../../library/threadsafety.rst:30 +msgid "" +"A function or operation that cannot be made safe for concurrent use even " +"with external synchronization. Incompatible code typically accesses global " +"state in an unsynchronized way and must only be called from a single thread " +"throughout the program's lifetime." +msgstr "" +"即便使用外部同步化也无法确保并发使用安全性的函数或操作。 不兼容的代码通常会以非同步方式访问全局状态并且在整个程序生命周期中只能从一个线程调用。" + +#: ../../library/threadsafety.rst:35 +msgid "" +"Example: a function that modifies process-wide state such as signal handlers" +" or environment variables, where concurrent calls from any threads, even " +"with external locking, can conflict with the runtime or other libraries." +msgstr "例如:会修改进程级状态如信号处理器或环境变量的函数,当从任意线程调用时,即便使用了外部锁机制,也可能与运行时或其他库发生冲突。" + +#: ../../library/threadsafety.rst:42 +msgid "Compatible" +msgstr "兼容的" + +#: ../../library/threadsafety.rst:44 +msgid "" +"A function or operation that is safe to call from multiple threads " +"*provided* the caller supplies appropriate external synchronization, for " +"example by holding a :term:`lock` for the duration of each call. Without " +"such synchronization, concurrent calls may produce :term:`race conditions " +"` or :term:`data races `." +msgstr "" +"*只要* 调用方提供了适当的外部同步化,例如通过在每次调用期间持有 :term:`lock` 锁,即可安全地从多个线程调用的函数或操作。 " +"没有这样的同步化,并发调用可能会产生 :term:`竞争条件 ` 或 :term:`数据竞争 `。" + +#: ../../library/threadsafety.rst:50 +msgid "" +"Example: a function that reads from or writes to an object whose internal " +"state is not protected by a lock. Callers must ensure that no two threads " +"access the same object at the same time." +msgstr "例如:针对一个内部状态没有锁保护的对象执行读取或写入的函数。 调用方必须确保不会有两个线程同时访问同一个对象。" + +#: ../../library/threadsafety.rst:57 +msgid "Safe on distinct objects" +msgstr "在单独对象上安全" + +#: ../../library/threadsafety.rst:59 +msgid "" +"A function or operation that is safe to call from multiple threads without " +"external synchronization, as long as each thread operates on a **different**" +" object. Two threads may call the function at the same time, but they must " +"not pass the same object (or objects that share underlying state) as " +"arguments." +msgstr "" +"只要每个线程是在 **不同** 对象上操作,即可安全地从多个线程调用的函数或操作。 " +"两个线程可以同时调用该函数,但它们不能传入同一个对象(或共享底层状态的不同对象)作为参数。" + +#: ../../library/threadsafety.rst:65 +msgid "" +"Example: a function that modifies fields of a struct using non-atomic " +"writes. Two threads can each call the function on their own struct instance " +"safely, but concurrent calls on the *same* instance require external " +"synchronization." +msgstr "" +"例如:使用非原子化写入来修改一个结构体的字段的函数。 两个线程可以分别在它们各自的结构体实例上安全地调用该函数,但在 *相同* " +"实例上并发调用则需要外部同步化。" + +#: ../../library/threadsafety.rst:73 +msgid "Safe on shared objects" +msgstr "在共享对象上安全" + +#: ../../library/threadsafety.rst:75 +msgid "" +"A function or operation that is safe for concurrent use on the **same** " +"object. The implementation uses internal synchronization (such as " +":term:`per-object locks ` or :ref:`critical sections " +"`) to protect shared mutable state, so callers " +"do not need to supply their own locking." +msgstr "" +"在 **相同** 对象上可安全地并发使用的函数或操作。 具体实现会使用内部同步化 (如 :term:`每对象锁 ` 或" +" :ref:`关键节 `) 来保护共享的可变状态,这样调用方就不需要提供它们自己的锁机制。" + +#: ../../library/threadsafety.rst:81 +msgid "" +"Example: :c:func:`PyList_GetItemRef` can be called from multiple threads on " +"the same :c:type:`PyListObject` - it uses internal synchronization to " +"serialize access." +msgstr "" +"例如:可以从多个线程在同一个 :c:type:`PyListObject` 上调用 :c:func:`PyList_GetItemRef` —— " +"它将使用内部同步化来序列化访问。it uses internal synchronization to serialize access." + +#: ../../library/threadsafety.rst:88 +msgid "Atomic" +msgstr "原子化的" + +#: ../../library/threadsafety.rst:90 +msgid "" +"A function or operation that appears :term:`atomic ` with " +"respect to other threads - it executes instantaneously from the perspective " +"of other threads. This is the strongest form of thread safety." +msgstr "" +"对于其他线程来说是 :term:`原子化的 ` 函数或操作 —— 即从其他线程的视角看来是瞬间执行的。 " +"这是线程安全性的最强形式。" + +#: ../../library/threadsafety.rst:94 +msgid "" +"Example: :c:func:`PyMutex_IsLocked` performs an atomic read of the mutex " +"state and can be called from any thread at any time." +msgstr "例如:对于互斥状态 :c:func:`PyMutex_IsLocked` 会执行原子化的读取因而可在任何时刻从任意线程调用。" + +#: ../../library/threadsafety.rst:101 +msgid "Thread safety for list objects" +msgstr "列表对象的线程安全性" + +#: ../../library/threadsafety.rst:103 +msgid "" +"Reading a single element from a :class:`list` is :term:`atomic `:" +msgstr "从 :class:`list` 读取一个元素属于 :term:`原子化的操作 `:" + +#: ../../library/threadsafety.rst:106 +msgid "lst[i] # list.__getitem__" +msgstr "lst[i] # list.__getitem__" + +#: ../../library/threadsafety.rst:111 +msgid "" +"The following methods traverse the list and use :term:`atomic ` reads of each item to perform their function. That means that " +"they may return results affected by concurrent modifications:" +msgstr "" +"下列方法会遍历列表并使用 :term:`原子化操作 ` 读取每个条目来执行其函数。 " +"这意味着它们可能返回受并发修改影响的结果:" + +#: ../../library/threadsafety.rst:115 +msgid "" +"item in lst\n" +"lst.index(item)\n" +"lst.count(item)" +msgstr "" +"item in lst\n" +"lst.index(item)\n" +"lst.count(item)" + +#: ../../library/threadsafety.rst:122 +msgid "" +"All of the above operations avoid acquiring :term:`per-object locks `. They do not block concurrent modifications. Other operations " +"that hold a lock will not block these from observing intermediate states." +msgstr "" +"上述操作都会避免获取 :term:`每对象锁 `。 它们不会阻塞并发的修改。 " +"其他持有锁的操作也不会在观察中间状态时阻塞这些操作。" + +#: ../../library/threadsafety.rst:127 +msgid "" +"All other operations from here on block using the :term:`per-object lock`." +msgstr "从这里开始的所有其他操作都会使用 :term:`per-object lock` 来阻塞执行。" + +#: ../../library/threadsafety.rst:129 +msgid "" +"Writing a single item via ``lst[i] = x`` is safe to call from multiple " +"threads and will not corrupt the list." +msgstr "从多个线程通过 ``lst[i] = x`` 对单个条目的写入调用是安全的并且不会破坏列表。" + +#: ../../library/threadsafety.rst:132 +msgid "" +"The following operations return new objects and appear :term:`atomic ` to other threads:" +msgstr "下列操作会返回新的对象并且对其他线程来说是 :term:`原子化的 `:" + +#: ../../library/threadsafety.rst:135 +msgid "" +"lst1 + lst2 # concatenates two lists into a new list\n" +"x * lst # repeats lst x times into a new list\n" +"lst.copy() # returns a shallow copy of the list" +msgstr "" +"lst1 + lst2 # 将两个列表拼接为一个新列表\n" +"x * lst # 将列表重复 x 次成为一个新列表\n" +"lst.copy() # 返回列表的浅拷贝" + +#: ../../library/threadsafety.rst:142 +msgid "" +"The following methods that only operate on a single element with no shifting" +" required are :term:`atomic `:" +msgstr "以下仅在单个元素上执行操作而无需变换位置的方法都是 :term:`原子化的 `:" + +#: ../../library/threadsafety.rst:145 +msgid "" +"lst.append(x) # append to the end of the list, no shifting required\n" +"lst.pop() # pop element from the end of the list, no shifting required" +msgstr "" +"lst.append(x) # 添加到列表末尾,无需变换位置\n" +"lst.pop() # 从列表末尾弹出元素,无需变换位置" + +#: ../../library/threadsafety.rst:151 +msgid "" +"The :meth:`~list.clear` method is also :term:`atomic `. " +"Other threads cannot observe elements being removed." +msgstr "" +":meth:`~list.clear` 方法也是 :term:`原子化的 `。其他线程无法观察到被移除的元素。" + +#: ../../library/threadsafety.rst:154 +msgid "" +"The :meth:`~list.sort` method is not :term:`atomic `. " +"Other threads cannot observe intermediate states during sorting, but the " +"list appears empty for the duration of the sort." +msgstr "" +":meth:`~list.sort` 方法不是 :term:`原子化的 `。 " +"其他线程无法观察排序期间的中间状态,在排序期间列表将显示为空。" + +#: ../../library/threadsafety.rst:158 +msgid "" +"The following operations may allow :term:`lock-free` operations to observe " +"intermediate states since they modify multiple elements in place:" +msgstr "以下操作可以允许 :term:`lock-free` 操作来观察中间状态因为它们会原地修改多个元素。" + +#: ../../library/threadsafety.rst:161 +msgid "" +"lst.insert(idx, item) # shifts elements\n" +"lst.pop(idx) # idx not at the end of the list, shifts elements\n" +"lst *= x # copies elements in place" +msgstr "" +"lst.insert(idx, item) # 改变元素位置\n" +"lst.pop(idx) # idx 不在列表末尾,会改变元素位置\n" +"lst *= x # 原地拷贝元素" + +#: ../../library/threadsafety.rst:168 +msgid "" +"The :meth:`~list.remove` method may allow concurrent modifications since " +"element comparison may execute arbitrary Python code (via " +":meth:`~object.__eq__`)." +msgstr "" +":meth:`~list.remove` 方法可允许并发修改因为元素比较可能执行任意 Python 代码 (通过 " +":meth:`~object.__eq__`)." + +#: ../../library/threadsafety.rst:172 +msgid "" +":meth:`~list.extend` is safe to call from multiple threads. However, its " +"guarantees depend on the iterable passed to it. If it is a :class:`list`, a " +":class:`tuple`, a :class:`set`, a :class:`frozenset`, a :class:`dict` or a " +":ref:`dictionary view object ` (but not their subclasses), the " +"``extend`` operation is safe from concurrent modifications to the iterable. " +"Otherwise, an iterator is created which can be concurrently modified by " +"another thread. The same applies to inplace concatenation of a list with " +"other iterables when using ``lst += iterable``." +msgstr "" +"从多个线程调用 :meth:`~list.extend` 是安全的。不过,这项保证依赖于传给它的可迭代对象。如果它是 :class:`list`, " +":class:`tuple`, :class:`set`, :class:`frozenset`, :class:`dict` 或 " +":ref:`字典视图对象 ` (但不能是它们的子类),对于此可迭代对象进行的并发修改来说 ``extend`` 操作是安全的。 " +"在其他情况下,则会创建可被另一个线程并发修改的可迭代对象。这种情况同样适合当使用 ``lst += iterable`` " +"将一个列表与另一个可迭代对象进行原地拼接的场合。" + +#: ../../library/threadsafety.rst:181 +msgid "" +"Similarly, assigning to a list slice with ``lst[i:j] = iterable`` is safe to" +" call from multiple threads, but ``iterable`` is only locked when it is also" +" a :class:`list` (but not its subclasses)." +msgstr "" +"类似地,使用 ``lst[i:j] = iterable`` 对一个列表切片赋值的操作从多个线程调用也是安全的,但是 ``iterable`` " +"仅在它也是 :class:`list` (但不是其子类) 的时候才会被锁定。" + +#: ../../library/threadsafety.rst:185 +msgid "" +"Operations that involve multiple accesses, as well as iteration, are never " +"atomic. For example:" +msgstr "涉及到多线程访问,以及迭代的操作一定是非原子化的。例如:" + +#: ../../library/threadsafety.rst:188 +msgid "" +"# NOT atomic: read-modify-write\n" +"lst[i] = lst[i] + 1\n" +"\n" +"# NOT atomic: check-then-act\n" +"if lst:\n" +" item = lst.pop()\n" +"\n" +"# NOT thread-safe: iteration while modifying\n" +"for item in lst:\n" +" process(item) # another thread may modify lst" +msgstr "" +"# 非原子化:读取 - 修改 - 写入\\nlst[i] = lst[i] + 1\n" +"\n" +"# 非原子化:检测 - 等待 - 执行\\nif lst:\n" +" item = lst.pop()\n" +"\n" +"# 非线程安全:在修改期间迭代\n" +"for item in lst:\n" +" process(item) # 其他线程可能修改 lst" + +#: ../../library/threadsafety.rst:202 +msgid "" +"Consider external synchronization when sharing :class:`list` instances " +"across threads." +msgstr "当在线程间共享 :class:`list` 实例时可考虑进行外部同步。" + +#: ../../library/threadsafety.rst:209 +msgid "Thread safety for dict objects" +msgstr "字典对象的线程安全性" + +#: ../../library/threadsafety.rst:211 +msgid "" +"Creating a dictionary with the :class:`dict` constructor is atomic when the " +"argument to it is a :class:`dict` or a :class:`tuple`. When using the " +":meth:`dict.fromkeys` method, dictionary creation is atomic when the " +"argument is a :class:`dict`, :class:`tuple`, :class:`set` or " +":class:`frozenset`." +msgstr "" +"使用 :class:`dict` 构造器创建字典在传入的参数为 :class:`dict` 或 :class:`tuple` 时是原子化的。 如果使用 " +":meth:`dict.fromkeys` 方法,字典创建在参数为 :class:`dict`, :class:`tuple`, " +":class:`set` 或 :class:`frozenset` 时是原子化的。." + +#: ../../library/threadsafety.rst:217 +msgid "" +"The following operations and functions are :term:`lock-free` and " +":term:`atomic `." +msgstr "以下操作和函数都是 :term:`lock-free` 和 :term:`原子化 ` 的。" + +#: ../../library/threadsafety.rst:220 +msgid "" +"d[key] # dict.__getitem__\n" +"d.get(key) # dict.get\n" +"key in d # dict.__contains__\n" +"len(d) # dict.__len__" +msgstr "" +"d[key] # dict.__getitem__\n" +"d.get(key) # dict.get\n" +"key in d # dict.__contains__\n" +"len(d) # dict.__len__" + +#: ../../library/threadsafety.rst:228 +msgid "All other operations from here on hold the :term:`per-object lock`." +msgstr "从这里开始的所有其他操作都会持有 :term:`per-object lock`。" + +#: ../../library/threadsafety.rst:230 +msgid "" +"Writing or removing a single item is safe to call from multiple threads and " +"will not corrupt the dictionary:" +msgstr "写入或移除单个条目的操作从多个线程调用是安全的并且不会破坏字典:" + +#: ../../library/threadsafety.rst:233 +msgid "" +"d[key] = value # write\n" +"del d[key] # delete\n" +"d.pop(key) # remove and return\n" +"d.popitem() # remove and return last item\n" +"d.setdefault(key, v) # insert if missing" +msgstr "" +"d[key] = value # 写入\n" +"del d[key] # 删除\n" +"d.pop(key) # 移除并返回\n" +"d.popitem() # 移除并返回最后一项\n" +"d.setdefault(key, v) # 如果缺失则插入" + +#: ../../library/threadsafety.rst:242 +msgid "" +"These operations may compare keys using :meth:`~object.__eq__`, which can " +"execute arbitrary Python code. During such comparisons, the dictionary may " +"be modified by another thread. For built-in types like :class:`str`, " +":class:`int`, and :class:`float`, that implement :meth:`~object.__eq__` in " +"C, the underlying lock is not released during comparisons and this is not a " +"concern." +msgstr "" +"这些操作可能会使用 :meth:`~object.__eq__` 对键进行比较,这可以执行任意 Python 代码。 " +"在这种比较期间,字典可能会被其他线程修改。 对于内置类型如 :class:`str`, :class:`int` 和 " +":class:`float`,它们是用 C 来实现 :meth:`~object.__eq__` 的,下层的锁在比较期间不会被释放所以这不是问题。" + +#: ../../library/threadsafety.rst:249 +msgid "" +"The following operations return new objects and hold the :term:`per-object " +"lock` for the duration of the operation:" +msgstr "下列操作会返回新的对象并在操作期间持有 :term:`per-object lock`:" + +#: ../../library/threadsafety.rst:252 +msgid "" +"d.copy() # returns a shallow copy of the dictionary\n" +"d | other # merges two dicts into a new dict\n" +"d.keys() # returns a new dict_keys view object\n" +"d.values() # returns a new dict_values view object\n" +"d.items() # returns a new dict_items view object" +msgstr "" +"d.copy() # 返回一个字典的浅拷贝\n" +"d | other # 将两个字典合并为一个新字典\n" +"d.keys() # 返回一个新的 dict_keys 视图对象\n" +"d.values() # 返回一个新的 dict_values 视图对象\n" +"d.items() # 返回一个新的 dict_items 视图对象" + +#: ../../library/threadsafety.rst:261 +msgid "" +"The :meth:`~dict.clear` method holds the lock for its duration. Other " +"threads cannot observe elements being removed." +msgstr ":meth:`~dict.clear` 方法会在其执行期间持有锁。 其他线程无法观察到元素被移除。" + +#: ../../library/threadsafety.rst:264 +msgid "" +"The following operations lock both dictionaries. For :meth:`~dict.update` " +"and ``|=``, this applies only when the other operand is a :class:`dict` that" +" uses the standard dict iterator (but not subclasses that override " +"iteration). For equality comparison, this applies to :class:`dict` and its " +"subclasses:" +msgstr "" +"下列操作会同时锁定两个字典。 对于 :meth:`~dict.update` 和 " +"``|=``,这仅在另一个操作数是使用标准字典迭代器(不能是重写了迭代操作的子类)的 :class:`dict` 时才适用。 对于相等性比较,这适用于 " +":class:`dict` 及其子类:" + +#: ../../library/threadsafety.rst:270 +msgid "" +"d.update(other_dict) # both locked when other_dict is a dict\n" +"d |= other_dict # both locked when other_dict is a dict\n" +"d == other_dict # both locked for dict and subclasses" +msgstr "" +"d.update(other_dict) # 当 other_dict 为字典时双方都会被锁定\n" +"d |= other_dict # 当 other_dict 为字典时双方都会被锁定\n" +"d == other_dict # 对于字典及其子类双方都会被锁定" + +#: ../../library/threadsafety.rst:277 +msgid "" +"All comparison operations also compare values using :meth:`~object.__eq__`, " +"so for non-built-in types the lock may be released during comparison." +msgstr "所有比较操作也都会使用 :meth:`~object.__eq__` 来比较值,因此对于非内置类型来说锁可能会在比较期间被释放。" + +#: ../../library/threadsafety.rst:280 +msgid "" +":meth:`~dict.fromkeys` locks both the new dictionary and the iterable when " +"the iterable is exactly a :class:`dict`, :class:`set`, or :class:`frozenset`" +" (not subclasses):" +msgstr "" +"当可迭代对象为 :class:`dict`, :class:`set` 或 :class:`frozenset` (不能为其子类) 时 " +":meth:`~dict.fromkeys` 会同时锁定新字典和可迭代对象:" + +#: ../../library/threadsafety.rst:284 +msgid "" +"dict.fromkeys(a_dict) # locks both\n" +"dict.fromkeys(a_set) # locks both\n" +"dict.fromkeys(a_frozenset) # locks both" +msgstr "" +"dict.fromkeys(a_dict) # 双方均锁定\n" +"dict.fromkeys(a_set) # 双方均锁定\n" +"dict.fromkeys(a_frozenset) # 双方均锁定" + +#: ../../library/threadsafety.rst:291 +msgid "" +"When updating from a non-dict iterable, only the target dictionary is " +"locked. The iterable may be concurrently modified by another thread:" +msgstr "当使用非字典可迭代对象进行更新时,只有目标字典会被锁定。 可迭代对象可能会被其他线程并发地修改:" + +#: ../../library/threadsafety.rst:294 +msgid "" +"d.update(iterable) # iterable is not a dict: only d locked\n" +"d |= iterable # iterable is not a dict: only d locked\n" +"dict.fromkeys(iterable) # iterable is not a dict/set/frozenset: only result locked" +msgstr "" +"d.update(iterable) # iterable 不是字典:仅 d 被锁定\n" +"d |= iterable # iterable 不是字典:仅 d 被锁定\n" +"dict.fromkeys(iterable) # iterable 不是字典 dict/set/frozenset:仅结果被锁定" + +#: ../../library/threadsafety.rst:301 ../../library/threadsafety.rst:434 +#: ../../library/threadsafety.rst:525 +msgid "" +"Operations that involve multiple accesses, as well as iteration, are never " +"atomic:" +msgstr "涉及多线程访问,以及迭代的操作肯定是非原子化的:" + +#: ../../library/threadsafety.rst:304 +msgid "" +"# NOT atomic: read-modify-write\n" +"d[key] = d[key] + 1\n" +"\n" +"# NOT atomic: check-then-act (TOCTOU)\n" +"if key in d:\n" +" del d[key]\n" +"\n" +"# NOT thread-safe: iteration while modifying\n" +"for key, value in d.items():\n" +" process(key) # another thread may modify d" +msgstr "" +"# 非原子化:读取-修改-写入\n" +"d[key] = d[key] + 1\n" +"\n" +"# 非原子化:先检查再执行(TOCTOU)\n" +"if key in d:\n" +" del d[key]\n" +"\n" +"# 非线程安全:在修改时迭代\n" +"for key, value in d.items():\n" +" process(key) # another thread may modify d" + +#: ../../library/threadsafety.rst:318 +msgid "" +"To avoid time-of-check to time-of-use (TOCTOU) issues, use atomic operations" +" or handle exceptions:" +msgstr "要避免检查时和使用时脱节(TOCTOU)问题,应使用原子化操作或处理异常:" + +#: ../../library/threadsafety.rst:321 +msgid "" +"# Use pop() with default instead of check-then-delete\n" +"d.pop(key, None)\n" +"\n" +"# Or handle the exception\n" +"try:\n" +" del d[key]\n" +"except KeyError:\n" +" pass" +msgstr "" +"# 使用带默认值的而不是先检查再删除\n" +"d.pop(key, None)\n" +"\n" +"# 或者处理异常\n" +"try:\n" +" del d[key]\n" +"except KeyError:\n" +" pass" + +#: ../../library/threadsafety.rst:333 +msgid "" +"To safely iterate over a dictionary that may be modified by another thread, " +"iterate over a copy:" +msgstr "要安全地迭代可能会被另一个线程修改的字典,可以迭代其拷贝:" + +#: ../../library/threadsafety.rst:336 +msgid "" +"# Make a copy to iterate safely\n" +"for key, value in d.copy().items():\n" +" process(key)" +msgstr "" +"# 拷贝以安全地迭代\n" +"for key, value in d.copy().items():\n" +" process(key)" + +#: ../../library/threadsafety.rst:343 +msgid "" +"Consider external synchronization when sharing :class:`dict` instances " +"across threads." +msgstr "在线程间共享 :class:`dict` 实例时可考虑进行外部同步。" + +#: ../../library/threadsafety.rst:350 +msgid "Thread safety for set objects" +msgstr "集合对象的线程安全性" + +#: ../../library/threadsafety.rst:352 ../../library/threadsafety.rst:457 +msgid "" +"The :func:`len` function is lock-free and :term:`atomic `." +msgstr ":func:`len` 函数是免加锁且 :term:`原子化 ` 的。" + +#: ../../library/threadsafety.rst:354 +msgid "" +"The following read operation is lock-free. It does not block concurrent " +"modifications and may observe intermediate states from operations that hold " +"the per-object lock:" +msgstr "以下读取操作是免锁的。 它不会阻塞并发修改并可以观察持有每对象锁的操作的中间状态:" + +#: ../../library/threadsafety.rst:358 +msgid "elem in s # set.__contains__" +msgstr "elem in s # set.__contains__" + +#: ../../library/threadsafety.rst:363 +msgid "" +"This operation may compare elements using :meth:`~object.__eq__`, which can " +"execute arbitrary Python code. During such comparisons, the set may be " +"modified by another thread. For built-in types like :class:`str`, " +":class:`int`, and :class:`float`, :meth:`!__eq__` does not release the " +"underlying lock during comparisons and this is not a concern." +msgstr "" +"此操作可能会使用 :meth:`~object.__eq__` 对元素进行比较,这可以执行任意 Python 代码。 " +"在这种比较期间,集合可能会被其他线程修改。 对于内置类型如 :class:`str`, :class:`int` 和 :class:`float`, " +":meth:`!__eq__` 不会在比较期间释放下层的锁因而这不会有问题。" + +#: ../../library/threadsafety.rst:369 ../../library/threadsafety.rst:470 +msgid "All other operations from here on hold the per-object lock." +msgstr "" +"从这里开始的所有其他操作都会持有每对象锁。All other operations from here on hold the per-object " +"lock." + +#: ../../library/threadsafety.rst:371 +msgid "" +"Adding or removing a single element is safe to call from multiple threads " +"and will not corrupt the set:" +msgstr "添加或移除单个元素的操作从多个线程调用是安全的并且不会破坏集合:" + +#: ../../library/threadsafety.rst:374 +msgid "" +"s.add(elem) # add element\n" +"s.remove(elem) # remove element, raise if missing\n" +"s.discard(elem) # remove element if present\n" +"s.pop() # remove and return arbitrary element" +msgstr "" +"s.add(elem) # 添加元素\n" +"s.remove(elem) # 移除元素,如不存在则引发异常\n" +"s.discard(elem) # 元素如存在则移除\n" +"s.pop() # 移除并返回任意元素" + +#: ../../library/threadsafety.rst:382 +msgid "" +"These operations also compare elements, so the same :meth:`~object.__eq__` " +"considerations as above apply." +msgstr "这些操作也会对元素进行比较,因此也适用与上文相同的 :meth:`~object.__eq__` 考量。" + +#: ../../library/threadsafety.rst:385 +msgid "" +"The :meth:`~set.copy` method returns a new object and holds the per-object " +"lock for the duration so that it is always atomic." +msgstr ":meth:`~set.copy` 方法会返回新的对象并在执行期间持有每对象锁因此它始终是原子化的。" + +#: ../../library/threadsafety.rst:388 +msgid "" +"The :meth:`~set.clear` method holds the lock for its duration. Other threads" +" cannot observe elements being removed." +msgstr ":meth:`~set.clear` 方法会在其执行期间持有锁。 其他线程无法观察到元素被移除。" + +#: ../../library/threadsafety.rst:391 +msgid "" +"The following operations only accept :class:`set` or :class:`frozenset` as " +"operands and always lock both objects:" +msgstr "下列操作仅接受 :class:`set` 或 :class:`frozenset` 作为操作数并且总是同时锁定两个对象:" + +#: ../../library/threadsafety.rst:394 +msgid "" +"s |= other # other must be set/frozenset\n" +"s &= other # other must be set/frozenset\n" +"s -= other # other must be set/frozenset\n" +"s ^= other # other must be set/frozenset\n" +"s & other # other must be set/frozenset\n" +"s | other # other must be set/frozenset\n" +"s - other # other must be set/frozenset\n" +"s ^ other # other must be set/frozenset" +msgstr "" +"s |= other # other 必须为 set/frozenset\n" +"s &= other # other 必须为 set/frozenset\n" +"s -= other # other 必须为 set/frozenset\n" +"s ^= other # other 必须为 set/frozenset\n" +"s & other # other 必须为 set/frozenset\n" +"s | other # other 必须为 set/frozenset\n" +"s - other # other 必须为 set/frozenset\n" +"s ^ other # other 必须为 set/frozenset" + +#: ../../library/threadsafety.rst:406 +msgid "" +":meth:`set.update`, :meth:`set.union`, :meth:`set.intersection` and " +":meth:`set.difference` can take multiple iterables as arguments. They all " +"iterate through all the passed iterables and do the following:" +msgstr "" +":meth:`set.update`, :meth:`set.union`, :meth:`set.intersection` 和 " +":meth:`set.difference` 可接受多个可迭代对象作为参数。 它们将迭代所传入的所有可迭代对象并执行以下操作:" + +#: ../../library/threadsafety.rst:410 +msgid ":meth:`set.update` and :meth:`set.union` lock both objects only when" +msgstr ":meth:`set.update` 和 :meth:`set.union` 仅对以下情况同时锁定两个操作数" + +#: ../../library/threadsafety.rst:411 +msgid "" +"the other operand is a :class:`set`, :class:`frozenset`, or :class:`dict`." +msgstr "另一个操作数为 :class:`set`, :class:`frozenset` 或 :class:`dict`。" + +#: ../../library/threadsafety.rst:412 +msgid ":meth:`set.intersection` and :meth:`set.difference` always try to lock" +msgstr ":meth:`set.intersection` 和 :meth:`set.difference` 总是会尝试锁定" + +#: ../../library/threadsafety.rst:413 +msgid "all objects." +msgstr "所有对象。" + +#: ../../library/threadsafety.rst:415 +msgid ":meth:`set.symmetric_difference` tries to lock both objects." +msgstr ":meth:`set.symmetric_difference` 会尝试同时锁定两个对象。" + +#: ../../library/threadsafety.rst:417 +msgid "" +"The update variants of the above methods also have some differences between " +"them:" +msgstr "以上方法的更新形式也存在一些不同之处:" + +#: ../../library/threadsafety.rst:420 +msgid ":meth:`set.difference_update` and :meth:`set.intersection_update` try" +msgstr ":meth:`set.difference_update` 和 :meth:`set.intersection_update` 会尝试" + +#: ../../library/threadsafety.rst:421 +msgid "to lock all objects one-by-one." +msgstr "一个接一个地锁定所有对象。" + +#: ../../library/threadsafety.rst:422 +msgid "" +":meth:`set.symmetric_difference_update` only locks the arguments if it is" +msgstr ":meth:`set.symmetric_difference_update` 锁定参数仅针对" + +#: ../../library/threadsafety.rst:423 +msgid "of type :class:`set`, :class:`frozenset`, or :class:`dict`." +msgstr ":class:`set`, :class:`frozenset` 或 :class:`dict` 类型。" + +#: ../../library/threadsafety.rst:425 +msgid "The following methods always try to lock both objects:" +msgstr "下列方法总是会尝试锁定双方对象:" + +#: ../../library/threadsafety.rst:427 +msgid "" +"s.isdisjoint(other) # both locked\n" +"s.issubset(other) # both locked\n" +"s.issuperset(other) # both locked" +msgstr "" +"s.isdisjoint(other) # 锁定双方\n" +"s.issubset(other) # 锁定双方\n" +"s.issuperset(other) # 锁定双方" + +#: ../../library/threadsafety.rst:437 +msgid "" +"# NOT atomic: check-then-act\n" +"if elem in s:\n" +" s.remove(elem)\n" +"\n" +"# NOT thread-safe: iteration while modifying\n" +"for elem in s:\n" +" process(elem) # another thread may modify s" +msgstr "" +"# 非原子化的:检查 - 执行\n" +"if elem in s:\n" +" s.remove(elem)\n" +"\n" +"# 非线程安全的:在修改期间迭代\n" +"for elem in s:\n" +" process(elem) # 另一个线程可能会修改 s" + +#: ../../library/threadsafety.rst:448 +msgid "" +"Consider external synchronization when sharing :class:`set` instances across" +" threads. See :ref:`freethreading-python-howto` for more information." +msgstr "" +"当在线程间共享 :class:`set` 实例时可考虑进行外部同步。 详情参见 :ref:`freethreading-python-howto`。" + +#: ../../library/threadsafety.rst:455 +msgid "Thread safety for bytearray objects" +msgstr "bytearray 对象的线程安全性" + +#: ../../library/threadsafety.rst:459 +msgid "" +"Concatenation and comparisons use the buffer protocol, which prevents " +"resizing but does not hold the per-object lock. These operations may observe" +" intermediate states from concurrent modifications:" +msgstr "" + +#: ../../library/threadsafety.rst:463 +msgid "" +"ba + other # may observe concurrent writes\n" +"ba == other # may observe concurrent writes\n" +"ba < other # may observe concurrent writes" +msgstr "" + +#: ../../library/threadsafety.rst:472 +msgid "" +"Reading a single element or slice is safe to call from multiple threads:" +msgstr "" + +#: ../../library/threadsafety.rst:474 +msgid "" +"ba[i] # bytearray.__getitem__\n" +"ba[i:j] # slice" +msgstr "" +"ba[i] # bytearray.__getitem__\n" +"ba[i:j] # 切片" + +#: ../../library/threadsafety.rst:480 +msgid "" +"The following operations are safe to call from multiple threads and will not" +" corrupt the bytearray:" +msgstr "下列操作从多个线程调用是安全的并且不会破坏字节数组:" + +#: ../../library/threadsafety.rst:483 +msgid "" +"ba[i] = x # write single byte\n" +"ba[i:j] = values # write slice\n" +"ba.append(x) # append single byte\n" +"ba.extend(other) # extend with iterable\n" +"ba.insert(i, x) # insert single byte\n" +"ba.pop() # remove and return last byte\n" +"ba.pop(i) # remove and return byte at index\n" +"ba.remove(x) # remove first occurrence\n" +"ba.reverse() # reverse in place\n" +"ba.clear() # remove all bytes" +msgstr "" +"ba[i] = x # 写入单个字节\n" +"ba[i:j] = values # 写入切片\n" +"ba.append(x) # 添加单个字节\n" +"ba.extend(other) # 用可迭代对象扩展\n" +"ba.insert(i, x) # 插入单个字节\n" +"ba.pop() # 移除并返回末尾字节\n" +"ba.pop(i) # 移除并返回指定位置的字节\n" +"ba.remove(x) # 移除第首次出现的值\n" +"ba.reverse() # 原地反转\n" +"ba.clear() # 移除所有字节" + +#: ../../library/threadsafety.rst:497 +msgid "" +"Slice assignment locks both objects when *values* is a :class:`bytearray`:" +msgstr "当 *values* 为 :class:`bytearray` 时切片赋值会将两个对象都锁定:" + +#: ../../library/threadsafety.rst:499 +msgid "ba[i:j] = other_bytearray # both locked" +msgstr "ba[i:j] = other_bytearray # 两者都将被锁定" + +#: ../../library/threadsafety.rst:504 +msgid "" +"The following operations return new objects and hold the per-object lock for" +" the duration:" +msgstr "下列操作会返回新的对象并在执行期间拥有每对象锁:" + +#: ../../library/threadsafety.rst:507 +msgid "" +"ba.copy() # returns a shallow copy\n" +"ba * n # repeat into new bytearray" +msgstr "" +"ba.copy() # 返回一个浅拷贝\n" +"ba * n # 对新的 bytearray 执行重复" + +#: ../../library/threadsafety.rst:513 +msgid "The membership test holds the lock for its duration:" +msgstr "成员检测会在执行期间持有锁:" + +#: ../../library/threadsafety.rst:515 +msgid "x in ba # bytearray.__contains__" +msgstr "x in ba # bytearray.__contains__" + +#: ../../library/threadsafety.rst:520 +msgid "" +"All other bytearray methods (such as :meth:`~bytearray.find`, " +":meth:`~bytearray.replace`, :meth:`~bytearray.split`, " +":meth:`~bytearray.decode`, etc.) hold the per-object lock for their " +"duration." +msgstr "" +"所有其他 bytearray 方法 (如 :meth:`~bytearray.find`, :meth:`~bytearray.replace`, " +":meth:`~bytearray.split`, :meth:`~bytearray.decode` 等) 会在其执行期间持有每对象锁。" + +#: ../../library/threadsafety.rst:528 +msgid "" +"# NOT atomic: check-then-act\n" +"if x in ba:\n" +" ba.remove(x)\n" +"\n" +"# NOT thread-safe: iteration while modifying\n" +"for byte in ba:\n" +" process(byte) # another thread may modify ba" +msgstr "" +"# 非原子化的:检查-执行\n" +"if x in ba:\n" +" ba.remove(x)\n" +"\n" +"# 非线程安全的:在修改期间迭代\n" +"for byte in ba:\n" +" process(byte) # 另一个线程可能会修改 ba" + +#: ../../library/threadsafety.rst:539 +msgid "" +"To safely iterate over a bytearray that may be modified by another thread, " +"iterate over a copy:" +msgstr "要安全地迭代可能会被另一个线程修改的 bytearray,可以迭代其拷贝:" + +#: ../../library/threadsafety.rst:542 +msgid "" +"# Make a copy to iterate safely\n" +"for byte in ba.copy():\n" +" process(byte)" +msgstr "" +"# 创建一个拷贝以安全地迭代\n" +"for byte in ba.copy():\n" +" process(byte)" + +#: ../../library/threadsafety.rst:549 +msgid "" +"Consider external synchronization when sharing :class:`bytearray` instances " +"across threads. See :ref:`freethreading-python-howto` for more information." +msgstr "" +"在跨线程共享 :class:`bytearray` 实例时可考虑进行外部同步化。 详情参见 :ref:`freethreading-python-" +"howto`。" + +#: ../../library/threadsafety.rst:556 +msgid "Thread safety for memoryview objects" +msgstr "memoryview 对象的线程安全性" + +#: ../../library/threadsafety.rst:558 +msgid "" +":class:`memoryview` objects provide access to the internal data of an " +"underlying object without copying. Thread safety depends on both the " +"memoryview itself and the underlying buffer exporter." +msgstr "" +":class:`memoryview` 对象提供对下层对象内部数据的访问而不会拷贝它。 线程安全性同时依赖于 memoryview " +"本身和下层的缓冲区导出器。" + +#: ../../library/threadsafety.rst:562 +msgid "" +"The memoryview implementation uses atomic operations to track its own " +"exports in the :term:`free-threaded build`. Creating and releasing a " +"memoryview are thread-safe. Attribute access (e.g., " +":attr:`~memoryview.shape`, :attr:`~memoryview.format`) reads fields that are" +" immutable for the lifetime of the memoryview, so concurrent reads are safe " +"as long as the memoryview has not been released." +msgstr "" + +#: ../../library/threadsafety.rst:569 +msgid "" +"However, the actual data accessed through the memoryview is owned by the " +"underlying object. Concurrent access to this data is only safe if the " +"underlying object supports it:" +msgstr "" + +#: ../../library/threadsafety.rst:573 +msgid "" +"For immutable objects like :class:`bytes`, concurrent reads through multiple" +" memoryviews are safe." +msgstr "" + +#: ../../library/threadsafety.rst:576 +msgid "" +"For mutable objects like :class:`bytearray`, reading and writing the same " +"memory region from multiple threads without external synchronization is not " +"safe and may result in data corruption. Note that even read-only memoryviews" +" of mutable objects do not prevent data races if the underlying object is " +"modified from another thread." +msgstr "" + +#: ../../library/threadsafety.rst:583 +msgid "" +"# NOT safe: concurrent writes to the same buffer\n" +"data = bytearray(1000)\n" +"view = memoryview(data)\n" +"# Thread 1: view[0:500] = b'x' * 500\n" +"# Thread 2: view[0:500] = b'y' * 500" +msgstr "" + +#: ../../library/threadsafety.rst:592 +msgid "" +"# Safe: use a lock for concurrent access\n" +"import threading\n" +"lock = threading.Lock()\n" +"data = bytearray(1000)\n" +"view = memoryview(data)\n" +"\n" +"with lock:\n" +" view[0:500] = b'x' * 500" +msgstr "" + +#: ../../library/threadsafety.rst:604 +msgid "" +"Resizing or reallocating the underlying object (such as calling " +":meth:`bytearray.resize`) while a memoryview is exported raises " +":exc:`BufferError`. This is enforced regardless of threading." +msgstr "" diff --git a/library/time.po b/library/time.po new file mode 100644 index 0000000000..bc8f495a4e --- /dev/null +++ b/library/time.po @@ -0,0 +1,1720 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/time.rst:2 +msgid ":mod:`!time` --- Time access and conversions" +msgstr ":mod:`!time` --- 时间的访问和转换" + +#: ../../library/time.rst:9 +msgid "" +"This module provides various time-related functions. For related " +"functionality, see also the :mod:`datetime` and :mod:`calendar` modules." +msgstr "该模块提供了各种与时间相关的函数。相关功能还可以参阅 :mod:`datetime` 和 :mod:`calendar` 模块。" + +#: ../../library/time.rst:12 +msgid "" +"Although this module is always available, not all functions are available on" +" all platforms. Most of the functions defined in this module call platform " +"C library functions with the same name. It may sometimes be helpful to " +"consult the platform documentation, because the semantics of these functions" +" varies among platforms." +msgstr "" +"尽管所有平台皆可使用此模块,但模块内的函数并非所有平台都可用。此模块中定义的大多数函数的实现都是调用其所在平台的C语言库的同名函数。因为这些函数的语义可能因平台而异,所以使用时最好查阅对应平台的相关文档。" + +#: ../../library/time.rst:18 +msgid "An explanation of some terminology and conventions is in order." +msgstr "下面是一些术语和惯例的解释." + +#: ../../library/time.rst:24 +msgid "" +"The :dfn:`epoch` is the point where the time starts, the return value of " +"``time.gmtime(0)``. It is January 1, 1970, 00:00:00 (UTC) on all platforms." +msgstr "" +":dfn:`epoch` 是起始的时间点,即 ``time.gmtime(0)`` 的返回值。 这在所有平台上都是 1970-01-01, " +"00:00:00 (UTC)。" + +#: ../../library/time.rst:31 +msgid "" +"The term :dfn:`seconds since the epoch` refers to the total number of " +"elapsed seconds since the epoch, typically excluding `leap seconds`_. Leap " +"seconds are excluded from this total on all POSIX-compliant platforms." +msgstr "" +"术语 :dfn:`纪元秒数` 是指自 epoch (纪元)时间点以来经过的总秒数,通常不包括 `闰秒`_。 在所有符合 POSIX " +"标准的平台上,闰秒都不会记录在总秒数中。" + +#: ../../library/time.rst:38 +msgid "" +"The functions in this module may not handle dates and times before the " +"epoch_ or far in the future. The cut-off point in the future is determined " +"by the C library; for 32-bit systems, it is typically in 2038." +msgstr "" +"此模块中的函数可能无法处理 epoch_ 之前或遥远未来的日期和时间。 “遥远未来”的分界点是由 C 库确定的;对于 32 位系统,它通常是在 2038" +" 年。" + +#: ../../library/time.rst:45 +msgid "" +"Function :func:`strptime` can parse 2-digit years when given ``%y`` format " +"code. When 2-digit years are parsed, they are converted according to the " +"POSIX and ISO C standards: values 69--99 are mapped to 1969--1999, and " +"values 0--68 are mapped to 2000--2068." +msgstr "" +"函数 :func:`strptime` 在接收到 ``%y`` 格式代码时可以解析使用 2 位数表示的年份。当解析 2 位数年份时,函数会按照 " +"POSIX 和 ISO C 标准进行年份转换:数值 69--99 被映射为 1969--1999;数值 0--68 被映射为 2000--2068。" + +#: ../../library/time.rst:55 +msgid "" +"UTC is `Coordinated Universal Time`_ and superseded `Greenwich Mean Time`_ " +"or GMT as the basis of international timekeeping. The acronym UTC is not a " +"mistake but conforms to an earlier, language-agnostic naming scheme for time" +" standards such as UT0, UT1, and UT2." +msgstr "" +"UTC 即 `Coordinated Universal Time`_,它取代 `Greenwich Mean Time`_ 即 GMT " +"作为国际时间计量的基准。 UTC 缩写并非笔误,而是遵循了更早的语言中立的时间标准命名方案如 UT0, UT1 和 UT2。" + +#: ../../library/time.rst:65 +msgid "" +"DST is Daylight Saving Time, an adjustment of the timezone by (usually) one " +"hour during part of the year. DST rules are magic (determined by local law)" +" and can change from year to year. The C library has a table containing the" +" local rules (often it is read from a system file for flexibility) and is " +"the only source of True Wisdom in this respect." +msgstr "" +"DST是夏令时(Daylight Saving Time)的缩写,在一年的某一段时间中将当地时间调整(通常)一小时。 " +"DST的规则非常神奇(由当地法律确定),并且每年的起止时间都不同。C语言库中有一个表格,记录了各地的夏令时规则(实际上,为了灵活性,C语言库通常是从某个系统文件中读取这张表)。从这个角度而言,这张表是夏令时规则的唯一权威真理。" + +#: ../../library/time.rst:71 +msgid "" +"The precision of the various real-time functions may be less than suggested " +"by the units in which their value or argument is expressed. E.g. on most " +"Unix systems, the clock \"ticks\" only 50 or 100 times a second." +msgstr "由于平台限制,各种实时函数的精度可能低于其值或参数所要求(或给定)的精度。例如,在大多数Unix系统上,时钟频率仅为每秒50或100次。" + +#: ../../library/time.rst:75 +msgid "" +"On the other hand, the precision of :func:`.time` and :func:`sleep` is " +"better than their Unix equivalents: times are expressed as floating-point " +"numbers, :func:`.time` returns the most accurate time available (using Unix " +":c:func:`!gettimeofday` where available), and :func:`sleep` will accept a " +"time with a nonzero fraction (Unix :c:func:`!select` is used to implement " +"this, where available)." +msgstr "" +"另一方面,:func:`.time` 和 :func:`sleep` 的精度优于它们的 Unix 等价物:时间表示为浮点数,:func:`.time` " +"返回可用的最准确时间 (如有可能将使用 Unix :c:func:`!gettimeofday`),并且 :func:`sleep` " +"将接受带有非零小数部分的时间 (如有可能将使用 Unix :c:func:`!select` 来实现此功能)。" + +#: ../../library/time.rst:82 +msgid "" +"The time value as returned by :func:`gmtime`, :func:`localtime`, and " +":func:`strptime`, and accepted by :func:`asctime`, :func:`mktime` and " +":func:`strftime`, is a sequence of 9 integers. The return values of " +":func:`gmtime`, :func:`localtime`, and :func:`strptime` also offer attribute" +" names for individual fields." +msgstr "" +"时间值由 :func:`gmtime`,:func:`localtime` 和 :func:`strptime` 返回,并被 " +":func:`asctime`, :func:`mktime` 和 :func:`strftime` 接受,是一个 9 个整数的序列。 " +":func:`gmtime`, :func:`localtime` 和 :func:`strptime` 的返回值还提供各个字段的属性名称。" + +#: ../../library/time.rst:88 +msgid "See :class:`struct_time` for a description of these objects." +msgstr "请参阅 :class:`struct_time` 以获取这些对象的描述。" + +#: ../../library/time.rst:90 +msgid "" +"The :class:`struct_time` type was extended to provide the " +":attr:`~struct_time.tm_gmtoff` and :attr:`~struct_time.tm_zone` attributes " +"when platform supports corresponding ``struct tm`` members." +msgstr "" +"当平台支持相应的 ``struct tm`` 成员时 :class:`struct_time` 类型将被扩展以提供 " +":attr:`~struct_time.tm_gmtoff` 和 :attr:`~struct_time.tm_zone` 属性。" + +#: ../../library/time.rst:96 +msgid "" +"The :class:`struct_time` attributes :attr:`~struct_time.tm_gmtoff` and " +":attr:`~struct_time.tm_zone` are now available on all platforms." +msgstr "" +":class:`struct_time` 的属性 :attr:`~struct_time.tm_gmtoff` 和 " +":attr:`~struct_time.tm_zone` 现在可在所有平台上使用。" + +#: ../../library/time.rst:101 +msgid "Use the following functions to convert between time representations:" +msgstr "使用以下函数在时间表示之间进行转换:" + +#: ../../library/time.rst:104 +msgid "From" +msgstr "从" + +#: ../../library/time.rst:104 +msgid "To" +msgstr "到" + +#: ../../library/time.rst:104 +msgid "Use" +msgstr "使用" + +#: ../../library/time.rst:29 ../../library/time.rst:106 +#: ../../library/time.rst:109 ../../library/time.rst:112 +#: ../../library/time.rst:115 +msgid "seconds since the epoch" +msgstr "自纪元以来的秒数" + +#: ../../library/time.rst:106 ../../library/time.rst:112 +msgid ":class:`struct_time` in UTC" +msgstr "UTC 的 :class:`struct_time`" + +#: ../../library/time.rst:106 +msgid ":func:`gmtime`" +msgstr ":func:`gmtime`" + +#: ../../library/time.rst:109 ../../library/time.rst:115 +msgid ":class:`struct_time` in local time" +msgstr "本地时间的 :class:`struct_time`" + +#: ../../library/time.rst:109 +msgid ":func:`localtime`" +msgstr ":func:`localtime`" + +#: ../../library/time.rst:112 +msgid ":func:`calendar.timegm`" +msgstr ":func:`calendar.timegm`" + +#: ../../library/time.rst:115 +msgid ":func:`mktime`" +msgstr ":func:`mktime`" + +#: ../../library/time.rst:123 +msgid "Functions" +msgstr "函数" + +#: ../../library/time.rst:127 +msgid "" +"Convert a tuple or :class:`struct_time` representing a time as returned by " +":func:`gmtime` or :func:`localtime` to a string of the following form: " +"``'Sun Jun 20 23:21:05 1993'``. The day field is two characters long and is " +"space padded if the day is a single digit, e.g.: ``'Wed Jun 9 04:26:40 " +"1993'``." +msgstr "" +"转换由 :func:`gmtime` 或 :func:`localtime` 所返回的 :class:`struct_time` " +"或相应的表示时间的元组为以下形式的字符串: ``'Sun Jun 20 23:21:05 1993'``。 " +"日期字段的长度为两个字符,如果日期只有一个数字则会以空格填充,例如: ``'Wed Jun 9 04:26:40 1993'``。" + +#: ../../library/time.rst:133 +msgid "" +"If *t* is not provided, the current time as returned by :func:`localtime` is" +" used. Locale information is not used by :func:`asctime`." +msgstr "" +"如果未提供 *t*,则会使用 :func:`localtime` 所返回的当前时间。 :func:`asctime` 不会使用区域设置信息。" + +#: ../../library/time.rst:138 +msgid "" +"Unlike the C function of the same name, :func:`asctime` does not add a " +"trailing newline." +msgstr "与同名的C函数不同, :func:`asctime` 不添加尾随换行符。" + +#: ../../library/time.rst:143 +msgid "" +"Return the *clk_id* of the thread-specific CPU-time clock for the specified " +"*thread_id*." +msgstr "返回指定的 *thread_id* 的特定于线程的CPU时间时钟的 *clk_id* 。" + +#: ../../library/time.rst:145 +msgid "" +"Use :func:`threading.get_ident` or the :attr:`~threading.Thread.ident` " +"attribute of :class:`threading.Thread` objects to get a suitable value for " +"*thread_id*." +msgstr "" +"使用 :class:`threading.Thread` 对象的 :func:`threading.get_ident` 或 " +":attr:`~threading.Thread.ident` 属性为 *thread_id* 获取合适的值。" + +#: ../../library/time.rst:150 +msgid "" +"Passing an invalid or expired *thread_id* may result in undefined behavior, " +"such as segmentation fault." +msgstr "传递无效的或过期的 *thread_id* 可能会导致未定义的行为,例如段错误。" + +#: ../../library/time.rst:153 ../../library/time.rst:165 +#: ../../library/time.rst:178 ../../library/time.rst:187 +#: ../../library/time.rst:200 ../../library/time.rst:212 +#: ../../library/time.rst:768 ../../library/time.rst:792 +#: ../../library/time.rst:888 ../../library/time.rst:899 +#: ../../library/time.rst:909 ../../library/time.rst:919 +#: ../../library/time.rst:928 ../../library/time.rst:937 +#: ../../library/time.rst:946 ../../library/time.rst:957 +#: ../../library/time.rst:965 ../../library/time.rst:976 +#: ../../library/time.rst:987 ../../library/time.rst:996 +#: ../../library/time.rst:1009 +msgid "Availability" +msgstr "Availability" + +#: ../../library/time.rst:155 +msgid "" +"See the man page for :manpage:`pthread_getcpuclockid(3)` for further " +"information." +msgstr "请参阅 :manpage:`pthread_getcpuclockid(3)` 的手册页面了解更多信息。" + +#: ../../library/time.rst:162 +msgid "" +"Return the resolution (precision) of the specified clock *clk_id*. Refer to" +" :ref:`time-clock-id-constants` for a list of accepted values for *clk_id*." +msgstr "" +"返回指定时钟 *clk_id* 的分辨率(精度)。有关 *clk_id* 的可接受值列表,请参阅 :ref:`time-clock-id-" +"constants` 。" + +#: ../../library/time.rst:172 +msgid "" +"Return the time of the specified clock *clk_id*. Refer to :ref:`time-clock-" +"id-constants` for a list of accepted values for *clk_id*." +msgstr "" +"返回指定 *clk_id* 时钟的时间。有关 *clk_id* 的可接受值列表,请参阅 :ref:`time-clock-id-constants` 。" + +#: ../../library/time.rst:175 +msgid "" +"Use :func:`clock_gettime_ns` to avoid the precision loss caused by the " +":class:`float` type." +msgstr "使用 :func:`clock_gettime_ns` 以避免 :class:`float` 类型导致的精度损失。" + +#: ../../library/time.rst:185 +msgid "Similar to :func:`clock_gettime` but return time as nanoseconds." +msgstr "与 :func:`clock_gettime` 相似,但返回时间为纳秒。" + +#: ../../library/time.rst:194 +msgid "" +"Set the time of the specified clock *clk_id*. Currently, " +":data:`CLOCK_REALTIME` is the only accepted value for *clk_id*." +msgstr "设置指定 *clk_id* 时钟的时间。 目前, :data:`CLOCK_REALTIME` 是 *clk_id* 唯一可接受的值。" + +#: ../../library/time.rst:197 +msgid "" +"Use :func:`clock_settime_ns` to avoid the precision loss caused by the " +":class:`float` type." +msgstr "使用 :func:`clock_settime_ns` 以避免 :class:`float` 类型导致的精度损失。" + +#: ../../library/time.rst:204 +msgid "Accepts any real number as *time*, not only integer or float." +msgstr "" + +#: ../../library/time.rst:210 +msgid "Similar to :func:`clock_settime` but set time with nanoseconds." +msgstr "与 :func:`clock_settime` 相似,但设置时间为纳秒。" + +#: ../../library/time.rst:219 +msgid "" +"Convert a time expressed in seconds since the epoch_ to a string of a form: " +"``'Sun Jun 20 23:21:05 1993'`` representing local time. The day field is two" +" characters long and is space padded if the day is a single digit, e.g.: " +"``'Wed Jun 9 04:26:40 1993'``." +msgstr "" +"将以距离 epoch_ 的秒数表示的时间转换为以下形式的字符串: ``'Sun Jun 20 23:21:05 1993'`` 代表本地时间。 " +"日期字段的长度为两个字符且如果日期只有一位数字则会以空格填充,例如: ``'Wed Jun 9 04:26:40 1993'``。" + +#: ../../library/time.rst:224 +msgid "" +"If *secs* is not provided or :const:`None`, the current time as returned by " +":func:`.time` is used. ``ctime(secs)`` is equivalent to " +"``asctime(localtime(secs))``. Locale information is not used by " +":func:`ctime`." +msgstr "" +"如果 *secs* 未提供或为 :const:`None`,则使用 :func:`.time` 所返回的当前时间。 ``ctime(secs)`` " +"等价于 ``asctime(localtime(secs))``。 :func:`ctime` 不会使用区域设置信息。" + +#: ../../library/time.rst:229 ../../library/time.rst:267 +#: ../../library/time.rst:283 ../../library/time.rst:442 +msgid "Accepts any real number, not only integer or float." +msgstr "" + +#: ../../library/time.rst:235 +msgid "" +"Get information on the specified clock as a namespace object. Supported " +"clock names and the corresponding functions to read their value are:" +msgstr "获取有关指定时钟的信息作为命名空间对象。 支持的时钟名称和读取其值的相应函数是:" + +#: ../../library/time.rst:239 +msgid "``'monotonic'``: :func:`time.monotonic`" +msgstr "``'monotonic'``: :func:`time.monotonic`" + +#: ../../library/time.rst:240 +msgid "``'perf_counter'``: :func:`time.perf_counter`" +msgstr "``'perf_counter'``: :func:`time.perf_counter`" + +#: ../../library/time.rst:241 +msgid "``'process_time'``: :func:`time.process_time`" +msgstr "``'process_time'``: :func:`time.process_time`" + +#: ../../library/time.rst:242 +msgid "``'thread_time'``: :func:`time.thread_time`" +msgstr "``'thread_time'``: :func:`time.thread_time`" + +#: ../../library/time.rst:243 +msgid "``'time'``: :func:`time.time`" +msgstr "``'time'``: :func:`time.time`" + +#: ../../library/time.rst:245 +msgid "The result has the following attributes:" +msgstr "结果具有以下属性:" + +#: ../../library/time.rst:247 +msgid "" +"*adjustable*: ``True`` if the clock can be set to jump forward or backward " +"in time, ``False`` otherwise. Does not refer to gradual NTP rate " +"adjustments." +msgstr "" +"*adjustable*: 如果时钟可被设为时间向前跳或向后退则为 ``True``,否则为 ``False``。 不是指渐进式 NTP 速率调整。" + +#: ../../library/time.rst:249 +msgid "" +"*implementation*: The name of the underlying C function used to get the " +"clock value. Refer to :ref:`time-clock-id-constants` for possible values." +msgstr "" +"*implementation* : 用于获取时钟值的基础C函数的名称。有关可能的值,请参阅 :ref:`time-clock-id-" +"constants` 。" + +#: ../../library/time.rst:251 +msgid "" +"*monotonic*: ``True`` if the clock cannot go backward, ``False`` otherwise" +msgstr "*monotonic* :如果时钟不能倒退,则为 ``True`` ,否则为 ``False`` 。" + +#: ../../library/time.rst:253 +msgid "*resolution*: The resolution of the clock in seconds (:class:`float`)" +msgstr "*resolution* : 以秒为单位的时钟分辨率( :class:`float` )" + +#: ../../library/time.rst:260 +msgid "" +"Convert a time expressed in seconds since the epoch_ to a " +":class:`struct_time` in UTC in which the dst flag is always zero. If *secs*" +" is not provided or :const:`None`, the current time as returned by " +":func:`.time` is used. Fractions of a second are ignored. See above for a " +"description of the :class:`struct_time` object. See :func:`calendar.timegm` " +"for the inverse of this function." +msgstr "" +"将以自 epoch_ 开始的秒数表示的时间转换为 UTC 的 :class:`struct_time`,其中 dst 旗标始终为零。 如果未提供 " +"*secs* 或为 :const:`None`,则使用 :func:`.time` 所返回的当前时间。 一秒以内的小数将被忽略。 有关 " +":class:`struct_time` 对象的说明请参见上文。 有关此函数的逆操作请参阅 :func:`calendar.timegm`。" + +#: ../../library/time.rst:273 +msgid "" +"Like :func:`gmtime` but converts to local time. If *secs* is not provided " +"or :const:`None`, the current time as returned by :func:`.time` is used. " +"The dst flag is set to ``1`` when DST applies to the given time." +msgstr "" +"与 :func:`gmtime` 相似但转换为当地时间。如果未提供 *secs* 或为 :const:`None` ,则使用由 " +":func:`.time` 返回的当前时间。当 DST 适用于给定时间时,dst标志设置为 ``1`` 。" + +#: ../../library/time.rst:277 +msgid "" +":func:`localtime` may raise :exc:`OverflowError`, if the timestamp is " +"outside the range of values supported by the platform C :c:func:`localtime` " +"or :c:func:`gmtime` functions, and :exc:`OSError` on :c:func:`localtime` or " +":c:func:`gmtime` failure. It's common for this to be restricted to years " +"between 1970 and 2038." +msgstr "" +":func:`localtime` 可能会引发 :exc:`OverflowError` ,如果时间戳超出平台 C " +":c:func:`localtime` 或 :c:func:`gmtime` 函数支持的范围,并会在 :c:func:`localtime` 或 " +":c:func:`gmtime` 失败时引发 :exc:`OSError` 。这通常被限制在1970至2038年之间。" + +#: ../../library/time.rst:289 +msgid "" +"This is the inverse function of :func:`localtime`. Its argument is the " +":class:`struct_time` or full 9-tuple (since the dst flag is needed; use " +"``-1`` as the dst flag if it is unknown) which expresses the time in *local*" +" time, not UTC. It returns a floating-point number, for compatibility with " +":func:`.time`. If the input value cannot be represented as a valid time, " +"either :exc:`OverflowError` or :exc:`ValueError` will be raised (which " +"depends on whether the invalid value is caught by Python or the underlying C" +" libraries). The earliest date for which it can generate a time is platform-" +"dependent." +msgstr "" +"这是 :func:`localtime` 的反函数。它的参数是 :class:`struct_time` 或者完整的 9 元组(因为需要 dst " +"标志;如果它是未知的则使用 ``-1`` 作为dst标志),它表示 *local* 的时间,而不是 UTC 。它返回一个浮点数,以便与 " +":func:`.time` 兼容。如果输入值不能表示为有效时间,则 :exc:`OverflowError` 或 :exc:`ValueError` " +"将被引发(这取决于 Python 或底层 C 库是否捕获到无效值)。它可以生成时间的最早日期取决于平台。" + +#: ../../library/time.rst:301 +msgid "" +"Return the value (in fractional seconds) of a monotonic clock, i.e. a clock " +"that cannot go backwards. The clock is not affected by system clock " +"updates. The reference point of the returned value is undefined, so that " +"only the difference between the results of two calls is valid." +msgstr "" +"(以小数表示的秒为单位)返回一个单调时钟的值,即不能倒退的时钟。 该时钟不受系统时钟更新的影响。 " +"返回值的参考点未被定义,因此只有两次调用之间的差值才是有效的。" + +#: ../../library/time.rst:306 ../../library/time.rst:729 +msgid "Clock:" +msgstr "时钟:" + +#: ../../library/time.rst:308 +msgid "" +"On Windows, call ``QueryPerformanceCounter()`` and " +"``QueryPerformanceFrequency()``." +msgstr "" +"在 Windows 上,调用 ``QueryPerformanceCounter()`` 和 " +"``QueryPerformanceFrequency()``。" + +#: ../../library/time.rst:310 +msgid "On macOS, call ``mach_absolute_time()`` and ``mach_timebase_info()``." +msgstr "在 macOS 上,调用 ``mach_absolute_time()`` 和 ``mach_timebase_info()``。" + +#: ../../library/time.rst:311 +msgid "On HP-UX, call ``gethrtime()``." +msgstr "在 HP-UX 上,调用 ``gethrtime()``。" + +#: ../../library/time.rst:312 +msgid "Call ``clock_gettime(CLOCK_HIGHRES)`` if available." +msgstr "如果可能则调用 ``clock_gettime(CLOCK_HIGHRES)``。" + +#: ../../library/time.rst:313 +msgid "Otherwise, call ``clock_gettime(CLOCK_MONOTONIC)``." +msgstr "在其他情况下,调用 ``clock_gettime(CLOCK_MONOTONIC)``。" + +#: ../../library/time.rst:315 +msgid "" +"Use :func:`monotonic_ns` to avoid the precision loss caused by the " +":class:`float` type." +msgstr "使用 :func:`monotonic_ns` 以避免 :class:`float` 类型导致的精度损失。" + +#: ../../library/time.rst:320 +msgid "" +"The function is now always available and the clock is now the same for all " +"processes." +msgstr "该函数现在总是可用并且时钟在所有进程上保持一致。" + +#: ../../library/time.rst:324 +msgid "On macOS, the clock is now the same for all processes." +msgstr "在 macOS 上,现在时钟在所有进程上保持一致。" + +#: ../../library/time.rst:330 +msgid "Similar to :func:`monotonic`, but return time as nanoseconds." +msgstr "与 :func:`monotonic` 相似,但是返回时间为纳秒数。" + +#: ../../library/time.rst:339 +msgid "" +"Return the value (in fractional seconds) of a performance counter, i.e. a " +"clock with the highest available resolution to measure a short duration. It" +" does include time elapsed during sleep. The clock is the same for all " +"processes. The reference point of the returned value is undefined, so that " +"only the difference between the results of two calls is valid." +msgstr "" +"(以小数表示的秒为单位)返回一个性能计数器的值,即用于测量较短持续时间的具有最高有效精度的时钟。 " +"它会包括睡眠状态所消耗的时间。时钟对于所有进程来说都是相同的。 返回值的参考点未被定义,因此只有两次调用之间的差值才是有效的。" + +#: ../../library/time.rst:348 +msgid "" +"On CPython, use the same clock as :func:`time.monotonic` and is a monotonic " +"clock, i.e. a clock that cannot go backwards." +msgstr "在 CPython 中,使用与 :func:`time.monotonic` 相同的单调时钟,即无法回退的时钟。" + +#: ../../library/time.rst:351 +msgid "" +"Use :func:`perf_counter_ns` to avoid the precision loss caused by the " +":class:`float` type." +msgstr "使用 :func:`perf_counter_ns` 以避免 :class:`float` 类型导致的精度损失。" + +#: ../../library/time.rst:356 +msgid "On Windows, the clock is now the same for all processes." +msgstr "在 Windows 上,现在时钟在所有进程上保持一致。" + +#: ../../library/time.rst:359 +msgid "Use the same clock as :func:`time.monotonic`." +msgstr "使用与 :func:`time.monotonic` 相同的时钟。" + +#: ../../library/time.rst:365 +msgid "Similar to :func:`perf_counter`, but return time as nanoseconds." +msgstr "与 :func:`perf_counter` 相似,但是返回时间为纳秒。" + +#: ../../library/time.rst:377 +msgid "" +"Return the value (in fractional seconds) of the sum of the system and user " +"CPU time of the current process. It does not include time elapsed during " +"sleep. It is process-wide by definition. The reference point of the " +"returned value is undefined, so that only the difference between the results" +" of two calls is valid." +msgstr "" +"(以小数表示的秒为单位)返回当前进程的系统和用户 CPU 时间的总计值。 它不包括睡眠状态所消耗的时间。 根据定义它只作用于进程范围。 " +"返回值的参考点未被定义,因此只有两次调用之间的差值才是有效的。" + +#: ../../library/time.rst:383 +msgid "" +"Use :func:`process_time_ns` to avoid the precision loss caused by the " +":class:`float` type." +msgstr "使用 :func:`process_time_ns` 以避免 :class:`float` 类型导致的精度损失。" + +#: ../../library/time.rst:390 +msgid "Similar to :func:`process_time` but return time as nanoseconds." +msgstr "与 :func:`process_time` 相似,但是返回时间为纳秒。" + +#: ../../library/time.rst:396 +msgid "" +"Suspend execution of the calling thread for the given number of seconds. The" +" argument may be a non-integer to indicate a more precise sleep time." +msgstr "" + +#: ../../library/time.rst:399 +msgid "" +"If the sleep is interrupted by a signal and no exception is raised by the " +"signal handler, the sleep is restarted with a recomputed timeout." +msgstr "如果休眠被信号打断并且信号处理器未引发异常,休眠将基于重新计算的时延重新开始。" + +#: ../../library/time.rst:402 +msgid "" +"The suspension time may be longer than requested by an arbitrary amount, " +"because of the scheduling of other activity in the system." +msgstr "暂停时间有可能比请求的要长出一段不确定的时间,因为会受系统中的其他活动排期影响。" + +#: ../../library/time.rst:406 +msgid "Windows implementation" +msgstr "Windows 实现" + +#: ../../library/time.rst:407 +msgid "" +"On Windows, if *secs* is zero, the thread relinquishes the remainder of its " +"time slice to any other thread that is ready to run. If there are no other " +"threads ready to run, the function returns immediately, and the thread " +"continues execution. On Windows 10 and newer the implementation uses a " +"`high-resolution timer " +"`_ which provides resolution of 100 nanoseconds. If " +"*secs* is zero, ``Sleep(0)`` is used." +msgstr "" +"在 Windows 上,如果 *secs* 为零,线程会将其时间片的剩余部分让渡给任何其他准备要运行的线程。 " +"如果没有其他准备要运行的线程,该函数将立即返回,而线程将继续执行。 在 Windows 10 及更新的版本中的实现使用一个 `高精度定时器 " +"`_,它提供的精度为 100 纳秒。 如果 *secs* 为零,则会使用 ``Sleep(0)``。" + +#: ../../library/time.rst:416 +msgid "Unix implementation" +msgstr "Unix 实现" + +#: ../../library/time.rst:417 +msgid "Use ``clock_nanosleep()`` if available (resolution: 1 nanosecond);" +msgstr "如果可能则使用 ``clock_nanosleep()`` (精度: 1 纳秒);" + +#: ../../library/time.rst:418 +msgid "Or use ``nanosleep()`` if available (resolution: 1 nanosecond);" +msgstr "或者如果可能则使用 ``nanosleep()`` (精度: 1 纳秒);" + +#: ../../library/time.rst:419 +msgid "Or use ``select()`` (resolution: 1 microsecond)." +msgstr "或者使用 ``select()`` (精度: 1 微秒)." + +#: ../../library/time.rst:423 +msgid "To emulate a \"no-op\", use :keyword:`pass` instead of ``time.sleep(0)``." +msgstr "要模拟“无操作”,请使用 :keyword:`pass` 而非 ``time.sleep(0)``。" + +#: ../../library/time.rst:425 +msgid "" +"To voluntarily relinquish the CPU, specify a real-time :ref:`scheduling " +"policy ` and use :func:`os.sched_yield` instead." +msgstr "" +"要主动让出 CPU,请指定一个实时 :ref:`计划任务策略 ` 并改用 " +":func:`os.sched_yield`。" + +#: ../../library/time.rst:428 +msgid "" +"Raises an :ref:`auditing event ` ``time.sleep`` with argument " +"``secs``." +msgstr "引发一个 :ref:`审计事件 ` ``time.sleep`` 并附带参数 ``secs``。" + +#: ../../library/time.rst:430 +msgid "" +"The function now sleeps at least *secs* even if the sleep is interrupted by " +"a signal, except if the signal handler raises an exception (see :pep:`475` " +"for the rationale)." +msgstr "" +"现在,即使该睡眠过程被信号中断,该函数也会保证调用它的线程至少会睡眠 *secs* " +"秒。信号处理例程抛出异常的情况除外。(欲了解我们做出这次改变的原因,请参见 :pep:`475` )" + +#: ../../library/time.rst:435 +msgid "" +"On Unix, the ``clock_nanosleep()`` and ``nanosleep()`` functions are now " +"used if available. On Windows, a waitable timer is now used." +msgstr "" +"在 Unix 上,现在将在可能的情况下使用 ``clock_nanosleep()`` 和 ``nanosleep()`` 函数。 在 Windows " +"上,现在将使用可等待的计时器。" + +#: ../../library/time.rst:439 +msgid "Raises an auditing event." +msgstr "引发一个审计事件。" + +#: ../../library/time.rst:450 +msgid "" +"Convert a tuple or :class:`struct_time` representing a time as returned by " +":func:`gmtime` or :func:`localtime` to a string as specified by the *format*" +" argument. If *t* is not provided, the current time as returned by " +":func:`localtime` is used. *format* must be a string. :exc:`ValueError` is" +" raised if any field in *t* is outside of the allowed range." +msgstr "" +"转换一个元组或 :class:`struct_time` 表示的由 :func:`gmtime` 或 :func:`localtime` 返回的时间到由" +" *format* 参数指定的字符串。如果未提供 *t* ,则使用由 :func:`localtime` 返回的当前时间。 *format* " +"必须是一个字符串。如果 *t* 中的任何字段超出允许范围,则引发 :exc:`ValueError` 。" + +#: ../../library/time.rst:456 +msgid "" +"0 is a legal argument for any position in the time tuple; if it is normally " +"illegal the value is forced to a correct one." +msgstr "0是时间元组中任何位置的合法参数;如果它通常是非法的,则该值被强制改为正确的值。" + +#: ../../library/time.rst:459 +msgid "" +"The following directives can be embedded in the *format* string. They are " +"shown without the optional field width and precision specification, and are " +"replaced by the indicated characters in the :func:`strftime` result:" +msgstr "" +"以下指令可以嵌入 *format* 字符串中。它们显示时没有可选的字段宽度和精度规范,并被 :func:`strftime` 结果中的指示字符替换:" + +#: ../../library/time.rst:464 +msgid "Directive" +msgstr "指令" + +#: ../../library/time.rst:464 +msgid "Meaning" +msgstr "含意" + +#: ../../library/time.rst:464 +msgid "Notes" +msgstr "备注" + +#: ../../library/time.rst:466 +msgid "``%a``" +msgstr "``%a``" + +#: ../../library/time.rst:466 +msgid "Locale's abbreviated weekday name." +msgstr "本地化的缩写星期中每日的名称。" + +#: ../../library/time.rst:469 +msgid "``%A``" +msgstr "``%A``" + +#: ../../library/time.rst:469 +msgid "Locale's full weekday name." +msgstr "本地化的星期中每日的完整名称。" + +#: ../../library/time.rst:471 +msgid "``%b``" +msgstr "``%b``" + +#: ../../library/time.rst:471 +msgid "Locale's abbreviated month name." +msgstr "本地化的月缩写名称。" + +#: ../../library/time.rst:474 +msgid "``%B``" +msgstr "``%B``" + +#: ../../library/time.rst:474 +msgid "Locale's full month name." +msgstr "本地化的月完整名称。" + +#: ../../library/time.rst:476 +msgid "``%c``" +msgstr "``%c``" + +#: ../../library/time.rst:476 +msgid "Locale's appropriate date and time representation." +msgstr "本地化的适当日期和时间表示。" + +#: ../../library/time.rst:479 +msgid "``%d``" +msgstr "``%d``" + +#: ../../library/time.rst:479 +msgid "Day of the month as a decimal number [01,31]." +msgstr "十进制数 [01,31] 表示的月中日。" + +#: ../../library/time.rst:482 +msgid "``%f``" +msgstr "``%f``" + +#: ../../library/time.rst:482 +msgid "Microseconds as a decimal number" +msgstr "十进制表示的微秒数" + +#: ../../library/time.rst:483 +msgid "[000000,999999]." +msgstr "[000000,999999]." + +#: ../../library/time.rst:482 +msgid "\\(1)" +msgstr "\\(1)" + +#: ../../library/time.rst:486 +msgid "``%H``" +msgstr "``%H``" + +#: ../../library/time.rst:486 +msgid "Hour (24-hour clock) as a decimal number [00,23]." +msgstr "十进制数 [00,23] 表示的小时(24小时制)。" + +#: ../../library/time.rst:489 +msgid "``%I``" +msgstr "``%I``" + +#: ../../library/time.rst:489 +msgid "Hour (12-hour clock) as a decimal number [01,12]." +msgstr "十进制数 [01,12] 表示的小时(12小时制)。" + +#: ../../library/time.rst:492 +msgid "``%j``" +msgstr "``%j``" + +#: ../../library/time.rst:492 +msgid "Day of the year as a decimal number [001,366]." +msgstr "十进制数 [001,366] 表示的年中日。" + +#: ../../library/time.rst:495 +msgid "``%m``" +msgstr "``%m``" + +#: ../../library/time.rst:495 +msgid "Month as a decimal number [01,12]." +msgstr "十进制数 [01,12] 表示的月。" + +#: ../../library/time.rst:498 +msgid "``%M``" +msgstr "``%M``" + +#: ../../library/time.rst:498 +msgid "Minute as a decimal number [00,59]." +msgstr "十进制数 [00,59] 表示的分钟。" + +#: ../../library/time.rst:501 +msgid "``%p``" +msgstr "``%p``" + +#: ../../library/time.rst:501 +msgid "Locale's equivalent of either AM or PM." +msgstr "本地化的 AM 或 PM 。" + +#: ../../library/time.rst:501 +msgid "\\(2)" +msgstr "\\(2)" + +#: ../../library/time.rst:504 +msgid "``%S``" +msgstr "``%S``" + +#: ../../library/time.rst:504 +msgid "Second as a decimal number [00,61]." +msgstr "十进制数 [00,61] 表示的秒。" + +#: ../../library/time.rst:504 +msgid "\\(3)" +msgstr "\\(3)" + +#: ../../library/time.rst:507 +msgid "``%U``" +msgstr "``%U``" + +#: ../../library/time.rst:507 +msgid "" +"Week number of the year (Sunday as the first day of the week) as a decimal " +"number [00,53]. All days in a new year preceding the first Sunday are " +"considered to be in week 0." +msgstr "十进制数 [00,53] 表示的一年中的周数(星期日作为一周的第一天)。 在第一个星期日之前的新年中的所有日子都被认为是在第 0 周。" + +#: ../../library/time.rst:507 ../../library/time.rst:521 +msgid "\\(4)" +msgstr "\\(4)" + +#: ../../library/time.rst:515 +msgid "``%u``" +msgstr "``%u``" + +#: ../../library/time.rst:515 +msgid "Day of the week (Monday is 1; Sunday is 7) as a decimal number [1, 7]." +msgstr "以十进制数 [1, 7] 表示的日期值(星期一为 1;星期日为 7)。" + +#: ../../library/time.rst:518 +msgid "``%w``" +msgstr "``%w``" + +#: ../../library/time.rst:518 +msgid "Weekday as a decimal number [0(Sunday),6]." +msgstr "十进制数 [0(星期日),6] 表示的周中日。" + +#: ../../library/time.rst:521 +msgid "``%W``" +msgstr "``%W``" + +#: ../../library/time.rst:521 +msgid "" +"Week number of the year (Monday as the first day of the week) as a decimal " +"number [00,53]. All days in a new year preceding the first Monday are " +"considered to be in week 0." +msgstr "十进制数 [00,53] 表示的一年中的周数(星期一作为一周的第一天)。 在第一个星期一之前的新年中的所有日子被认为是在第 0 周。" + +#: ../../library/time.rst:529 +msgid "``%x``" +msgstr "``%x``" + +#: ../../library/time.rst:529 +msgid "Locale's appropriate date representation." +msgstr "本地化的适当日期表示。" + +#: ../../library/time.rst:532 +msgid "``%X``" +msgstr "``%X``" + +#: ../../library/time.rst:532 +msgid "Locale's appropriate time representation." +msgstr "本地化的适当时间表示。" + +#: ../../library/time.rst:535 +msgid "``%y``" +msgstr "``%y``" + +#: ../../library/time.rst:535 +msgid "Year without century as a decimal number [00,99]." +msgstr "十进制数 [00,99] 表示的没有世纪的年份。" + +#: ../../library/time.rst:538 +msgid "``%Y``" +msgstr "``%Y``" + +#: ../../library/time.rst:538 +msgid "Year with century as a decimal number." +msgstr "十进制数表示的带世纪的年份。" + +#: ../../library/time.rst:541 +msgid "``%z``" +msgstr "``%z``" + +#: ../../library/time.rst:541 +msgid "" +"Time zone offset indicating a positive or negative time difference from " +"UTC/GMT of the form +HHMM or -HHMM, where H represents decimal hour digits " +"and M represents decimal minute digits [-23:59, +23:59]. [1]_" +msgstr "" +"时区偏移以格式 +HHMM 或 -HHMM 形式的 UTC/GMT 的正或负时差指示,其中H表示十进制小时数字,M表示小数分钟数字 [-23:59, " +"+23:59] 。[1]_" + +#: ../../library/time.rst:547 +msgid "``%Z``" +msgstr "``%Z``" + +#: ../../library/time.rst:547 +msgid "" +"Time zone name (no characters if no time zone exists). Deprecated. [1]_" +msgstr "时区名称(如果不存在时区,则不包含字符)。已弃用。 [1]_" + +#: ../../library/time.rst:550 +msgid "``%G``" +msgstr "``%G``" + +#: ../../library/time.rst:550 +msgid "" +"ISO 8601 year (similar to ``%Y`` but follows the rules for the ISO 8601 " +"calendar year). The year starts with the week that contains the first " +"Thursday of the calendar year." +msgstr "" +"ISO 8601 年份(类似于 ``%Y`` 但遵循针对 ISO 8601 日历年份的规则)。 此年份从包含日历年份的第一个星期四的星期开始。" + +#: ../../library/time.rst:555 +msgid "``%V``" +msgstr "``%V``" + +#: ../../library/time.rst:555 +msgid "" +"ISO 8601 week number (as a decimal number [01,53]). The first week of the " +"year is the one that contains the first Thursday of the year. Weeks start on" +" Monday." +msgstr "" +"ISO 8601 星期序号(以十进制数 [01,53] 表示)。 每年的第一个星期是包含该年的第一个星期四的星期。 每星期的第一天为星期一。" + +#: ../../library/time.rst:560 +msgid "``%%``" +msgstr "``%%``" + +#: ../../library/time.rst:560 +msgid "A literal ``'%'`` character." +msgstr "字面的 ``'%'`` 字符。" + +#: ../../library/time.rst:563 +msgid "Notes:" +msgstr "注释:" + +#: ../../library/time.rst:566 +msgid "" +"The ``%f`` format directive only applies to :func:`strptime`, not to " +":func:`strftime`. However, see also :meth:`datetime.datetime.strptime` and " +":meth:`datetime.datetime.strftime` where the ``%f`` format directive " +":ref:`applies to microseconds `." +msgstr "" +"``%f`` 格式指示符只应用于 :func:`strptime`,而不应用于 :func:`strftime`。 不过,请参看 " +":meth:`datetime.datetime.strptime` 和 :meth:`datetime.datetime.strftime`,在这里 " +"``%f`` 格式指示符 :ref:`应用于微秒数 `。" + +#: ../../library/time.rst:572 +msgid "" +"When used with the :func:`strptime` function, the ``%p`` directive only " +"affects the output hour field if the ``%I`` directive is used to parse the " +"hour." +msgstr "当与 :func:`strptime` 函数一起使用时,如果使用 ``%I`` 指令来解析小时, ``%p`` 指令只影响输出小时字段。" + +#: ../../library/time.rst:578 +msgid "" +"The range really is ``0`` to ``61``; value ``60`` is valid in timestamps " +"representing `leap seconds`_ and value ``61`` is supported for historical " +"reasons." +msgstr "" +"范围真的是 ``0`` 到 ``61`` ;值 ``60`` 在表示 `leap seconds`_ 的时间戳中有效,并且由于历史原因支持值 " +"``61`` 。" + +#: ../../library/time.rst:583 +msgid "" +"When used with the :func:`strptime` function, ``%U`` and ``%W`` are only " +"used in calculations when the day of the week and the year are specified." +msgstr "当与 :func:`strptime` 函数一起使用时, ``%U`` 和 ``%W`` 仅用于指定星期几和年份的计算。" + +#: ../../library/time.rst:586 +msgid "" +"Here is an example, a format for dates compatible with that specified in " +"the :rfc:`5322` Internet email standard. [1]_ ::" +msgstr "下面是一个示例,一个与 :rfc:`5322` Internet 电子邮件标准的规定相兼容的日期格式 [1]_ ::" + +#: ../../library/time.rst:589 +msgid "" +">>> from time import gmtime, strftime\n" +">>> strftime(\"%a, %d %b %Y %H:%M:%S +0000\", gmtime())\n" +"'Thu, 28 Jun 2001 14:17:15 +0000'" +msgstr "" +">>> from time import gmtime, strftime\n" +">>> strftime(\"%a, %d %b %Y %H:%M:%S +0000\", gmtime())\n" +"'Thu, 28 Jun 2001 14:17:15 +0000'" + +#: ../../library/time.rst:593 +msgid "" +"Additional directives may be supported on certain platforms, but only the " +"ones listed here have a meaning standardized by ANSI C. To see the full set" +" of format codes supported on your platform, consult the " +":manpage:`strftime(3)` documentation." +msgstr "" +"某些平台可能支持其他指令,但只有此处列出的指令具有 ANSI C 标准化的含义。要查看平台支持的完整格式代码集,请参阅 " +":manpage:`strftime(3)` 文档。" + +#: ../../library/time.rst:598 +msgid "" +"On some platforms, an optional field width and precision specification can " +"immediately follow the initial ``'%'`` of a directive in the following " +"order; this is also not portable. The field width is normally 2 except for " +"``%j`` where it is 3." +msgstr "" +"在某些平台上,可选的字段宽度和精度规范可以按照以下顺序紧跟在指令的初始 ``'%'`` 之后;这也不可移植。字段宽度通常为2,除了 ``%j`` " +",它是3。" + +#: ../../library/time.rst:609 +msgid "" +"Parse a string representing a time according to a format. The return value " +"is a :class:`struct_time` as returned by :func:`gmtime` or " +":func:`localtime`." +msgstr "" +"根据格式解析表示时间的字符串。 返回值为一个被 :func:`gmtime` 或 :func:`localtime` 返回的 " +":class:`struct_time` 。" + +#: ../../library/time.rst:613 +msgid "" +"The *format* parameter uses the same directives as those used by " +":func:`strftime`; it defaults to ``\"%a %b %d %H:%M:%S %Y\"`` which matches " +"the formatting returned by :func:`ctime`. If *string* cannot be parsed " +"according to *format*, or if it has excess data after parsing, " +":exc:`ValueError` is raised. The default values used to fill in any missing " +"data when more accurate values cannot be inferred are ``(1900, 1, 1, 0, 0, " +"0, 0, 1, -1)``. Both *string* and *format* must be strings." +msgstr "" +"*format* 参数使用与 :func:`strftime` 相同的指令。 它默认为匹配 :func:`ctime` 所返回的格式 ``\"%a %b" +" %d %H:%M:%S %Y\"``。 如果 *string* 不能根据 *format* 来解析,或者解析后它有多余的数据,则会引发 " +":exc:`ValueError`。 当无法推断出更准确的值时,用于填充任何缺失数据的默认值是 ``(1900, 1, 1, 0, 0, 0, 0, " +"1, -1)`` 。 *string* 和 *format* 都必须为字符串。" + +#: ../../library/time.rst:621 +msgid "For example:" +msgstr "例如:" + +#: ../../library/time.rst:628 +msgid "" +"Support for the ``%Z`` directive is based on the values contained in " +"``tzname`` and whether ``daylight`` is true. Because of this, it is " +"platform-specific except for recognizing UTC and GMT which are always known " +"(and are considered to be non-daylight savings timezones)." +msgstr "" +"支持 ``%Z`` 指令是基于 ``tzname`` 中包含的值以及 ``daylight`` 是否为真。因此,它是特定于平台的,除了识别始终已知的 " +"UTC 和 GMT (并且被认为是非夏令时时区)。" + +#: ../../library/time.rst:633 +msgid "" +"Only the directives specified in the documentation are supported. Because " +"``strftime()`` is implemented per platform it can sometimes offer more " +"directives than those listed. But ``strptime()`` is independent of any " +"platform and thus does not necessarily support all directives available that" +" are not documented as supported." +msgstr "" +"仅支持文档中指定的指令。因为每个平台都实现了 ``strftime()`` ,它有时会提供比列出的指令更多的指令。但是 ``strptime()`` " +"独立于任何平台,因此不一定支持所有未记录为支持的可用指令。" + +#: ../../library/time.rst:642 +msgid "" +"The type of the time value sequence returned by :func:`gmtime`, " +":func:`localtime`, and :func:`strptime`. It is an object with a " +":term:`named tuple` interface: values can be accessed by index and by " +"attribute name. The following values are present:" +msgstr "" +"由 :func:`gmtime` 、 :func:`localtime` 和 :func:`strptime` 返回的时间值序列的类型。它是一个带有 " +":term:`named tuple` 接口的对象:可以通过索引和属性名访问值。 存在以下值:" + +#: ../../library/time.rst:649 +msgid "Index" +msgstr "索引" + +#: ../../library/time.rst:650 +msgid "Attribute" +msgstr "属性" + +#: ../../library/time.rst:651 +msgid "Values" +msgstr "值" + +#: ../../library/time.rst:653 +msgid "0" +msgstr "0" + +#: ../../library/time.rst:655 +msgid "(for example, 1993)" +msgstr "(例如,1993)" + +#: ../../library/time.rst:657 +msgid "1" +msgstr "1" + +#: ../../library/time.rst:659 +msgid "range [1, 12]" +msgstr "range [1, 12]" + +#: ../../library/time.rst:661 +msgid "2" +msgstr "2" + +#: ../../library/time.rst:663 +msgid "range [1, 31]" +msgstr "range [1, 31]" + +#: ../../library/time.rst:665 +msgid "3" +msgstr "3" + +#: ../../library/time.rst:667 +msgid "range [0, 23]" +msgstr "range [0, 23]" + +#: ../../library/time.rst:669 +msgid "4" +msgstr "4" + +#: ../../library/time.rst:671 +msgid "range [0, 59]" +msgstr "range [0, 59]" + +#: ../../library/time.rst:673 +msgid "5" +msgstr "5" + +#: ../../library/time.rst:675 +msgid "range [0, 61]; see :ref:`Note (2) ` in :func:`strftime`" +msgstr "range [0, 61];参见 :func:`strftime` 中的 :ref:`注释 (2) `" + +#: ../../library/time.rst:677 +msgid "6" +msgstr "6" + +#: ../../library/time.rst:679 +msgid "range [0, 6]; Monday is 0" +msgstr "取值范围 [0, 6];周一为 0" + +#: ../../library/time.rst:681 +msgid "7" +msgstr "7" + +#: ../../library/time.rst:683 +msgid "range [1, 366]" +msgstr "range [1, 366]" + +#: ../../library/time.rst:685 +msgid "8" +msgstr "8" + +#: ../../library/time.rst:687 +msgid "0, 1 or -1; see below" +msgstr "0, 1 或 -1;如下所示" + +#: ../../library/time.rst:689 ../../library/time.rst:693 +msgid "N/A" +msgstr "N/A" + +#: ../../library/time.rst:691 +msgid "abbreviation of timezone name" +msgstr "时区名称的缩写" + +#: ../../library/time.rst:695 +msgid "offset east of UTC in seconds" +msgstr "以秒为单位的UTC以东偏离" + +#: ../../library/time.rst:697 +msgid "" +"Note that unlike the C structure, the month value is a range of [1, 12], not" +" [0, 11]." +msgstr "请注意,与C结构不同,月份值是 [1,12] 的范围,而不是 [0,11] 。" + +#: ../../library/time.rst:700 +msgid "" +"In calls to :func:`mktime`, :attr:`tm_isdst` may be set to 1 when daylight " +"savings time is in effect, and 0 when it is not. A value of -1 indicates " +"that this is not known, and will usually result in the correct state being " +"filled in." +msgstr "" +"在调用 :func:`mktime` 时, :attr:`tm_isdst` 可以在夏令时生效时设置为1,而在夏令时不生效时设置为0。 " +"值-1表示这是未知的,并且通常会导致填写正确的状态。" + +#: ../../library/time.rst:704 +msgid "" +"When a tuple with an incorrect length is passed to a function expecting a " +":class:`struct_time`, or having elements of the wrong type, a " +":exc:`TypeError` is raised." +msgstr "" +"当一个长度不正确的元组被传递给期望 :class:`struct_time` 的函数,或者具有错误类型的元素时,会引发 :exc:`TypeError`" +" 。" + +#: ../../library/time.rst:710 +msgid "" +"Return the time in seconds since the epoch_ as a floating-point number. The " +"handling of `leap seconds`_ is platform dependent. On Windows and most Unix " +"systems, the leap seconds are not counted towards the time in seconds since " +"the epoch_. This is commonly referred to as `Unix time " +"`_." +msgstr "" +"返回以浮点数表示的从 epoch_ 开始的秒数形式的时间。 对 `leap seconds`_ 的处理取决于具体平台。 在 Windows 和大多数 " +"Unix 系统中,闰秒不会被计入从 epoch_ 开始的秒数形式的时间中。 这通常被称为 `Unix 时间 " +"`_。" + +#: ../../library/time.rst:716 +msgid "" +"Note that even though the time is always returned as a floating-point " +"number, not all systems provide time with a better precision than 1 second. " +"While this function normally returns non-decreasing values, it can return a " +"lower value than a previous call if the system clock has been set back " +"between the two calls." +msgstr "" +"请注意,即使时间总是作为浮点数返回,但并非所有系统都提供高于1秒的精度。虽然此函数通常返回非递减值,但如果在两次调用之间设置了系统时钟,则它可以返回比先前调用更低的值。" + +#: ../../library/time.rst:722 +msgid "" +"The number returned by :func:`.time` may be converted into a more common " +"time format (i.e. year, month, day, hour, etc...) in UTC by passing it to " +":func:`gmtime` function or in local time by passing it to the " +":func:`localtime` function. In both cases a :class:`struct_time` object is " +"returned, from which the components of the calendar date may be accessed as " +"attributes." +msgstr "" +"由 :func:`.time` 返回的数字可以通过将其传递给 :func:`gmtime` 函数转换为 UTC " +"中更常见的时间格式(即年、月、日、小时等),或者通过将它传递给 :func:`localtime` 函数获得本地时间。在这两种情况下都返回一个 " +":class:`struct_time` 对象,日历日期的各分量可以从中作为属性来访问。" + +#: ../../library/time.rst:731 +msgid "On Windows, call ``GetSystemTimePreciseAsFileTime()``." +msgstr "在 Windows 上,调用 ``GetSystemTimePreciseAsFileTime()``。" + +#: ../../library/time.rst:732 +msgid "Call ``clock_gettime(CLOCK_REALTIME)`` if available." +msgstr "如果可能则调用 ``clock_gettime(CLOCK_REALTIME)``。" + +#: ../../library/time.rst:733 +msgid "Otherwise, call ``gettimeofday()``." +msgstr "在其他情况下,调用 ``gettimeofday()``。" + +#: ../../library/time.rst:735 +msgid "" +"Use :func:`time_ns` to avoid the precision loss caused by the :class:`float`" +" type." +msgstr "使用 :func:`time_ns` 以避免 :class:`float` 类型导致的精度损失。" + +#: ../../library/time.rst:740 +msgid "" +"On Windows, calls ``GetSystemTimePreciseAsFileTime()`` instead of " +"``GetSystemTimeAsFileTime()``." +msgstr "" +"在 Windows 上,调用 ``GetSystemTimePreciseAsFileTime()`` 而不是 " +"``GetSystemTimeAsFileTime()``。" + +#: ../../library/time.rst:746 +msgid "" +"Similar to :func:`~time.time` but returns time as an integer number of " +"nanoseconds since the epoch_." +msgstr "与 :func:`~time.time` 相似,但返回时间为用整数表示的自 epoch_ 以来所经过的纳秒数。" + +#: ../../library/time.rst:759 +msgid "" +"Return the value (in fractional seconds) of the sum of the system and user " +"CPU time of the current thread. It does not include time elapsed during " +"sleep. It is thread-specific by definition. The reference point of the " +"returned value is undefined, so that only the difference between the results" +" of two calls in the same thread is valid." +msgstr "" +"(以小数表示的秒为单位)返回当前线程的系统和用户 CPU 时间的总计值。 它不包括睡眠状态所消耗的时间。 根据定义它只作用于线程范围。 " +"返回值的参考点未被定义,因此只有两次调用之间的差值才是有效的。" + +#: ../../library/time.rst:765 +msgid "" +"Use :func:`thread_time_ns` to avoid the precision loss caused by the " +":class:`float` type." +msgstr "使用 :func:`thread_time_ns` 以避免 :class:`float` 类型导致的精度损失。" + +#: ../../library/time.rst:770 +msgid "Unix systems supporting ``CLOCK_THREAD_CPUTIME_ID``." +msgstr "支持 ``CLOCK_THREAD_CPUTIME_ID`` 的 Unix 系统。" + +#: ../../library/time.rst:777 +msgid "Similar to :func:`thread_time` but return time as nanoseconds." +msgstr "与 :func:`thread_time` 相似,但返回纳秒时间。" + +#: ../../library/time.rst:784 +msgid "" +"Reset the time conversion rules used by the library routines. The " +"environment variable :envvar:`TZ` specifies how this is done. It will also " +"set the variables ``tzname`` (from the :envvar:`TZ` environment variable), " +"``timezone`` (non-DST seconds West of UTC), ``altzone`` (DST seconds west of" +" UTC) and ``daylight`` (to 0 if this timezone does not have any daylight " +"saving time rules, or to nonzero if there is a time, past, present or future" +" when daylight saving time applies)." +msgstr "" +"重置库例程使用的时间转换规则。环境变量 :envvar:`TZ` 指定如何完成。它还将设置变量 ``tzname`` (来自 :envvar:`TZ` " +"环境变量), ``timezone`` (UTC的西部非DST秒), ``altzone`` (UTC以西的DST秒)和 ``daylight`` " +"(如果此时区没有任何夏令时规则则为0,如果有夏令时适用的时间,无论过去、现在或未来,则为非零)。" + +#: ../../library/time.rst:796 +msgid "" +"Although in many cases, changing the :envvar:`TZ` environment variable may " +"affect the output of functions like :func:`localtime` without calling " +":func:`tzset`, this behavior should not be relied on." +msgstr "" +"虽然在很多情况下,更改 :envvar:`TZ` 环境变量而不调用 :func:`tzset` 可能会影响函数的输出,例如 " +":func:`localtime` ,不应该依赖此行为。" + +#: ../../library/time.rst:800 +msgid "The :envvar:`TZ` environment variable should contain no whitespace." +msgstr ":envvar:`TZ` 不应该包含空格。" + +#: ../../library/time.rst:802 +msgid "" +"The standard format of the :envvar:`TZ` environment variable is (whitespace " +"added for clarity)::" +msgstr ":envvar:`TZ` 环境变量的标准格式是(为了清晰起见,添加了空格)::" + +#: ../../library/time.rst:805 +msgid "std offset [dst [offset [,start[/time], end[/time]]]]" +msgstr "std offset [dst [offset [,start[/time], end[/time]]]]" + +#: ../../library/time.rst:807 +msgid "Where the components are:" +msgstr "其中各组件是:" + +#: ../../library/time.rst:809 +msgid "``std`` and ``dst``" +msgstr "``std`` 和 ``dst``" + +#: ../../library/time.rst:810 +msgid "" +"Three or more alphanumerics giving the timezone abbreviations. These will be" +" propagated into time.tzname" +msgstr "三个或更多字母数字,给出时区缩写。这些将传到 time.tzname" + +#: ../../library/time.rst:813 +msgid "``offset``" +msgstr "``offset``" + +#: ../../library/time.rst:814 +msgid "" +"The offset has the form: ``± hh[:mm[:ss]]``. This indicates the value added " +"the local time to arrive at UTC. If preceded by a '-', the timezone is east" +" of the Prime Meridian; otherwise, it is west. If no offset follows dst, " +"summer time is assumed to be one hour ahead of standard time." +msgstr "" +"偏移量的形式为: ``± hh[:mm[:ss]]`` 。这表示添加到达UTC的本地时间的值。如果前面有 '-' " +",则时区位于本初子午线的东边;否则,在它是西边。如果dst之后没有偏移,则假设夏令时比标准时间提前一小时。" + +#: ../../library/time.rst:819 +msgid "``start[/time], end[/time]``" +msgstr "``start[/time], end[/time]``" + +#: ../../library/time.rst:820 +msgid "" +"Indicates when to change to and back from DST. The format of the start and " +"end dates are one of the following:" +msgstr "指示何时更改为DST和从DST返回。开始日期和结束日期的格式为以下之一:" + +#: ../../library/time.rst:823 +msgid ":samp:`J{n}`" +msgstr ":samp:`J{n}`" + +#: ../../library/time.rst:824 +msgid "" +"The Julian day *n* (1 <= *n* <= 365). Leap days are not counted, so in all " +"years February 28 is day 59 and March 1 is day 60." +msgstr "Julian日 *n* (1 <= *n* <= 365)。闰日不计算在内,因此在所有年份中,2月28日是第59天,3月1日是第60天。" + +#: ../../library/time.rst:827 +msgid ":samp:`{n}`" +msgstr ":samp:`{n}`" + +#: ../../library/time.rst:828 +msgid "" +"The zero-based Julian day (0 <= *n* <= 365). Leap days are counted, and it " +"is possible to refer to February 29." +msgstr "从零开始的Julian日(0 <= *n* <= 365)。 闰日计入,可以引用2月29日。" + +#: ../../library/time.rst:831 +msgid ":samp:`M{m}.{n}.{d}`" +msgstr ":samp:`M{m}.{n}.{d}`" + +#: ../../library/time.rst:832 +msgid "" +"The *d*'th day (0 <= *d* <= 6) of week *n* of month *m* of the year (1 <= " +"*n* <= 5, 1 <= *m* <= 12, where week 5 means \"the last *d* day in month " +"*m*\" which may occur in either the fourth or the fifth week). Week 1 is the" +" first week in which the *d*'th day occurs. Day zero is a Sunday." +msgstr "" +"一年中 *m* 月的第 *n* 周(1 <= *n* <= 5 ,1 <= *m* <= 12 ,第 5 周表示 “可能在 *m* 月第 4 周或第 5" +" 周出现的最后第 *d* 日”)的第 *d* 天(0 <= *d* <= 6)。 第 1 周是第 *d* 天发生的第一周。 第 0 天是星期天。" + +#: ../../library/time.rst:838 +msgid "" +"``time`` has the same format as ``offset`` except that no leading sign ('-' " +"or '+') is allowed. The default, if time is not given, is 02:00:00." +msgstr "" +"``time`` 的格式与 ``offset`` 的格式相同,但不允许使用前导符号( '-' 或 '+' " +")。如果没有给出时间,则默认值为02:00:00。" + +#: ../../library/time.rst:843 +msgid "" +">>> os.environ['TZ'] = 'EST+05EDT,M4.1.0,M10.5.0'\n" +">>> time.tzset()\n" +">>> time.strftime('%X %x %Z')\n" +"'02:07:36 05/08/03 EDT'\n" +">>> os.environ['TZ'] = 'AEST-10AEDT-11,M10.5.0,M3.5.0'\n" +">>> time.tzset()\n" +">>> time.strftime('%X %x %Z')\n" +"'16:08:12 05/08/03 AEST'" +msgstr "" +">>> os.environ['TZ'] = 'EST+05EDT,M4.1.0,M10.5.0'\n" +">>> time.tzset()\n" +">>> time.strftime('%X %x %Z')\n" +"'02:07:36 05/08/03 EDT'\n" +">>> os.environ['TZ'] = 'AEST-10AEDT-11,M10.5.0,M3.5.0'\n" +">>> time.tzset()\n" +">>> time.strftime('%X %x %Z')\n" +"'16:08:12 05/08/03 AEST'" + +#: ../../library/time.rst:852 +msgid "" +"On many Unix systems (including \\*BSD, Linux, Solaris, and Darwin), it is " +"more convenient to use the system's zoneinfo (:manpage:`tzfile(5)`) " +"database to specify the timezone rules. To do this, set the :envvar:`TZ` " +"environment variable to the path of the required timezone datafile, " +"relative to the root of the systems 'zoneinfo' timezone database, usually " +"located at :file:`/usr/share/zoneinfo`. For example, ``'US/Eastern'``, " +"``'Australia/Melbourne'``, ``'Egypt'`` or ``'Europe/Amsterdam'``. ::" +msgstr "" +"在许多Unix系统(包括 \\*BSD , Linux , Solaris 和 Darwin 上),使用系统的区域信息( " +":manpage:`tzfile(5)` )数据库来指定时区规则会更方便。为此,将 :envvar:`TZ` " +"环境变量设置为所需时区数据文件的路径,相对于系统 'zoneinfo' 时区数据库的根目录,通常位于 " +":file:`/usr/share/zoneinfo` 。 例如,``'US/Eastern'`` 、 " +"``'Australia/Melbourne'`` 、 ``'Egypt'`` 或 ``'Europe/Amsterdam'``。 ::" + +#: ../../library/time.rst:860 +msgid "" +">>> os.environ['TZ'] = 'US/Eastern'\n" +">>> time.tzset()\n" +">>> time.tzname\n" +"('EST', 'EDT')\n" +">>> os.environ['TZ'] = 'Egypt'\n" +">>> time.tzset()\n" +">>> time.tzname\n" +"('EET', 'EEST')" +msgstr "" +">>> os.environ['TZ'] = 'US/Eastern'\n" +">>> time.tzset()\n" +">>> time.tzname\n" +"('EST', 'EDT')\n" +">>> os.environ['TZ'] = 'Egypt'\n" +">>> time.tzset()\n" +">>> time.tzname\n" +"('EET', 'EEST')" + +#: ../../library/time.rst:873 +msgid "Clock ID Constants" +msgstr "Clock ID 常量" + +#: ../../library/time.rst:875 +msgid "" +"These constants are used as parameters for :func:`clock_getres` and " +":func:`clock_gettime`." +msgstr "这些常量用作 :func:`clock_getres` 和 :func:`clock_gettime` 的参数。" + +#: ../../library/time.rst:880 +msgid "" +"Identical to :data:`CLOCK_MONOTONIC`, except it also includes any time that " +"the system is suspended." +msgstr "与 :data:`CLOCK_MONOTONIC` 相同,除了它还包括系统暂停的任何时间。" + +#: ../../library/time.rst:883 +msgid "" +"This allows applications to get a suspend-aware monotonic clock without " +"having to deal with the complications of :data:`CLOCK_REALTIME`, which may " +"have discontinuities if the time is changed using ``settimeofday()`` or " +"similar." +msgstr "" +"这允许应用程序获得一个暂停感知的单调时钟,而不必处理 :data:`CLOCK_REALTIME` 的复杂性,如果使用 " +"``settimeofday()`` 或类似的时间更改时间可能会有不连续性。" + +#: ../../library/time.rst:895 +msgid "" +"The Solaris OS has a ``CLOCK_HIGHRES`` timer that attempts to use an optimal" +" hardware source, and may give close to nanosecond resolution. " +"``CLOCK_HIGHRES`` is the nonadjustable, high-resolution clock." +msgstr "" +"Solaris OS 有一个 ``CLOCK_HIGHRES`` 计时器,试图使用最佳硬件源,并可能提供接近纳秒的分辨率。 " +"``CLOCK_HIGHRES`` 是不可调节的高分辨率时钟。" + +#: ../../library/time.rst:906 +msgid "" +"Clock that cannot be set and represents monotonic time since some " +"unspecified starting point." +msgstr "无法设置的时钟,表示自某些未指定的起点以来的单调时间。" + +#: ../../library/time.rst:916 +msgid "" +"Similar to :data:`CLOCK_MONOTONIC`, but provides access to a raw hardware-" +"based time that is not subject to NTP adjustments." +msgstr "类似于 :data:`CLOCK_MONOTONIC` ,但可以访问不受NTP调整影响的原始硬件时间。" + +#: ../../library/time.rst:925 +msgid "" +"Similar to :data:`CLOCK_MONOTONIC_RAW`, but reads a value cached by the " +"system at context switch and hence has less accuracy." +msgstr "类似于 :data:`CLOCK_MONOTONIC_RAW`,但在上下文切换时将读取由系统缓存的值因此会不够精确。" + +#: ../../library/time.rst:935 ../../library/time.rst:944 +msgid "High-resolution per-process timer from the CPU." +msgstr "来自CPU的高分辨率每进程计时器。" + +#: ../../library/time.rst:952 +msgid "" +"`International Atomic Time `_" +msgstr "" +"`国际原子时间 `_" + +#: ../../library/time.rst:954 +msgid "" +"The system must have a current leap second table in order for this to give " +"the correct answer. PTP or NTP software can maintain a leap second table." +msgstr "该系统必须有一个当前闰秒表以便能给出正确的回答。 PTP 或 NTP 软件可以用来维护闰秒表。" + +#: ../../library/time.rst:963 +msgid "Thread-specific CPU-time clock." +msgstr "特定于线程的CPU时钟。" + +#: ../../library/time.rst:972 +msgid "" +"Time whose absolute value is the time the system has been running and not " +"suspended, providing accurate uptime measurement, both absolute and " +"interval." +msgstr "该时间的绝对值是系统运行且未暂停的时间,提供准确的正常运行时间测量,包括绝对值和间隔值。" + +#: ../../library/time.rst:983 +msgid "" +"Clock that increments monotonically, tracking the time since an arbitrary " +"point, unaffected by frequency or time adjustments and not incremented while" +" the system is asleep." +msgstr "单调递增的时钟,记录从一个任意起点开始的时间,不受频率或时间调整的影响,并且当系统休眠时将不会递增。" + +#: ../../library/time.rst:993 +msgid "" +"Like :data:`CLOCK_UPTIME_RAW`, but the value is cached by the system at " +"context switches and therefore has less accuracy." +msgstr "类似于 :data:`CLOCK_UPTIME_RAW`,但该值在上下文切换时将由系统缓存因此会不够精确。" + +#: ../../library/time.rst:1000 +msgid "" +"The following constant is the only parameter that can be sent to " +":func:`clock_settime`." +msgstr "以下常量是唯一可以发送到 :func:`clock_settime` 的参数。" + +#: ../../library/time.rst:1006 +msgid "" +"Real-time clock. Setting this clock requires appropriate privileges. The " +"clock is the same for all processes." +msgstr "实时时钟。 设置此时钟需要有适当的权限。 该时钟在所有进程上保持一致。" + +#: ../../library/time.rst:1017 +msgid "Timezone Constants" +msgstr "时区常量" + +#: ../../library/time.rst:1021 +msgid "" +"The offset of the local DST timezone, in seconds west of UTC, if one is " +"defined. This is negative if the local DST timezone is east of UTC (as in " +"Western Europe, including the UK). Only use this if ``daylight`` is " +"nonzero. See note below." +msgstr "" +"本地DST时区的偏移量,以UTC为单位的秒数,如果已定义。如果当地DST时区在UTC以东(如在西欧,包括英国),则是负数。 只有当 " +"``daylight`` 非零时才使用它。 见下面的注释。" + +#: ../../library/time.rst:1027 +msgid "Nonzero if a DST timezone is defined. See note below." +msgstr "如果定义了DST时区,则为非零。 见下面的注释。" + +#: ../../library/time.rst:1031 +msgid "" +"The offset of the local (non-DST) timezone, in seconds west of UTC (negative" +" in most of Western Europe, positive in the US, zero in the UK). See note " +"below." +msgstr "本地(非DST)时区的偏移量,UTC以西的秒数(西欧大部分地区为负,美国为正,英国为零)。 见下面的注释。" + +#: ../../library/time.rst:1036 +msgid "" +"A tuple of two strings: the first is the name of the local non-DST timezone," +" the second is the name of the local DST timezone. If no DST timezone is " +"defined, the second string should not be used. See note below." +msgstr "" +"两个字符串的元组:第一个是本地非DST时区的名称,第二个是本地DST时区的名称。 如果未定义DST时区,则不应使用第二个字符串。 见下面的注释。" + +#: ../../library/time.rst:1042 +msgid "" +"For the above Timezone constants (:data:`altzone`, :data:`daylight`, " +":data:`timezone`, and :data:`tzname`), the value is determined by the " +"timezone rules in effect at module load time or the last time :func:`tzset` " +"is called and may be incorrect for times in the past. It is recommended to " +"use the :attr:`~struct_time.tm_gmtoff` and :attr:`~struct_time.tm_zone` " +"results from :func:`localtime` to obtain timezone information." +msgstr "" +"对于上述时区常量 (:data:`altzone`, :data:`daylight`, :data:`timezone` 和 " +":data:`tzname`),该值由当模块加载或 :func:`tzset` 最后一次被调用时生效的时区规则确定并且对于已过去的时间可能不正确。 " +"建议使用来自 :func:`localtime` 结果的 :attr:`~struct_time.tm_gmtoff` 和 " +":attr:`~struct_time.tm_zone` 来获取时区信息。" + +#: ../../library/time.rst:1051 +msgid "Module :mod:`datetime`" +msgstr "模块 :mod:`datetime`" + +#: ../../library/time.rst:1052 +msgid "More object-oriented interface to dates and times." +msgstr "更多面向对象的日期和时间接口。" + +#: ../../library/time.rst:1054 +msgid "Module :mod:`locale`" +msgstr "模块 :mod:`locale`" + +#: ../../library/time.rst:1055 +msgid "" +"Internationalization services. The locale setting affects the " +"interpretation of many format specifiers in :func:`strftime` and " +":func:`strptime`." +msgstr "国际化服务。 区域设置会影响 :func:`strftime` 和 :func:`strptime` 中许多格式说明符的解析。" + +#: ../../library/time.rst:1058 +msgid "Module :mod:`calendar`" +msgstr "模块 :mod:`calendar`" + +#: ../../library/time.rst:1059 +msgid "" +"General calendar-related functions. :func:`~calendar.timegm` is the " +"inverse of :func:`gmtime` from this module." +msgstr "一般日历相关功能。这个模块的 :func:`~calendar.timegm` 是函数 :func:`gmtime` 的反函数。" + +#: ../../library/time.rst:1063 +msgid "Footnotes" +msgstr "备注" + +#: ../../library/time.rst:1064 +msgid "" +"The use of ``%Z`` is now deprecated, but the ``%z`` escape that expands to " +"the preferred hour/minute offset is not supported by all ANSI C libraries. " +"Also, a strict reading of the original 1982 :rfc:`822` standard calls for a " +"two-digit year (``%y`` rather than ``%Y``), but practice moved to 4-digit " +"years long before the year 2000. After that, :rfc:`822` became obsolete and" +" the 4-digit year has been first recommended by :rfc:`1123` and then " +"mandated by :rfc:`2822`, with :rfc:`5322` continuing this requirement." +msgstr "" +"现在使用 ``%Z`` 的做法已被弃用,但是所有 ANSI C 库都不支持扩展为首选/时/分偏移量的 ``%z`` 转义符。 此外,对原始 1982 " +":rfc:`822` 标准的严格解读要求使用两位数年份 (``%y`` 而不是 ``%Y``),但实际上在 2000 年之前很久就已转移至 4 " +"位数年份。 在此之后,:rfc:`822` 已变得过时而 4 位数年份被 :rfc:`1123` 首先推荐然后被 :rfc:`2822` 强制推行,而 " +":rfc:`5322` 延续了这项要求。" + +#: ../../library/time.rst:22 +msgid "epoch" +msgstr "epoch" + +#: ../../library/time.rst:36 +msgid "Year 2038" +msgstr "2038 年" + +#: ../../library/time.rst:42 +msgid "2-digit years" +msgstr "2 位数表示年份" + +#: ../../library/time.rst:50 +msgid "UTC" +msgstr "UTC" + +#: ../../library/time.rst:50 +msgid "Coordinated Universal Time" +msgstr "Coordinated Universal Time" + +#: ../../library/time.rst:50 +msgid "Greenwich Mean Time" +msgstr "Greenwich Mean Time" + +#: ../../library/time.rst:63 +msgid "Daylight Saving Time" +msgstr "Daylight Saving Time" + +#: ../../library/time.rst:336 ../../library/time.rst:372 +#: ../../library/time.rst:754 +msgid "benchmarking" +msgstr "benchmarking" + +#: ../../library/time.rst:372 ../../library/time.rst:754 +msgid "CPU time" +msgstr "CPU time" + +#: ../../library/time.rst:372 ../../library/time.rst:754 +msgid "processor time" +msgstr "processor time" + +#: ../../library/time.rst:445 ../../library/time.rst:604 +msgid "% (percent)" +msgstr "% (百分号)" + +#: ../../library/time.rst:445 ../../library/time.rst:604 +msgid "datetime format" +msgstr "日期时间格式" diff --git a/library/timeit.po b/library/timeit.po new file mode 100644 index 0000000000..a72ee99d56 --- /dev/null +++ b/library/timeit.po @@ -0,0 +1,643 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# python-doc bot, 2025 +# 99 , 2026 +# Freesand Leo , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.15\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 18:34+0000\n" +"PO-Revision-Date: 2025-09-16 00:01+0000\n" +"Last-Translator: Freesand Leo , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/timeit.rst:2 +msgid ":mod:`!timeit` --- Measure execution time of small code snippets" +msgstr ":mod:`!timeit` --- 测量小代码片段的执行时间" + +#: ../../library/timeit.rst:7 +msgid "**Source code:** :source:`Lib/timeit.py`" +msgstr "**源码:** :source:`Lib/timeit.py`" + +#: ../../library/timeit.rst:15 +msgid "" +"This module provides a simple way to time small bits of Python code. It has " +"both a :ref:`timeit-command-line-interface` as well as a :ref:`callable " +"` one. It avoids a number of common traps for measuring " +"execution times. See also Tim Peters' introduction to the \"Algorithms\" " +"chapter in the second edition of *Python Cookbook*, published by O'Reilly." +msgstr "" +"此模块提供了一种简单的方法来计算一小段 Python 代码的耗时。 它有 :ref:`timeit-command-line-interface` " +"以及一个 :ref:`可调用 ` 方法。 它避免了许多测量时间的常见陷阱。 另见 Tim Peters 在 " +"O'Reilly 出版的 *Python Cookbook* 第二版中“算法”章节的概述。" + +#: ../../library/timeit.rst:23 +msgid "Basic examples" +msgstr "" + +#: ../../library/timeit.rst:25 +msgid "" +"The following example shows how the :ref:`timeit-command-line-interface` can" +" be used to compare three different expressions:" +msgstr "以下示例显示了如何使用 :ref:`timeit-command-line-interface` 来比较三个不同的表达式:" + +#: ../../library/timeit.rst:28 +msgid "" +"$ python -m timeit \"'-'.join(str(n) for n in range(100))\"\n" +"10000 loops, best of 5: 30.2 usec per loop\n" +"$ python -m timeit \"'-'.join([str(n) for n in range(100)])\"\n" +"10000 loops, best of 5: 27.5 usec per loop\n" +"$ python -m timeit \"'-'.join(map(str, range(100)))\"\n" +"10000 loops, best of 5: 23.2 usec per loop" +msgstr "" +"$ python -m timeit \"'-'.join(str(n) for n in range(100))\"\n" +"10000 loops, best of 5: 30.2 usec per loop\n" +"$ python -m timeit \"'-'.join([str(n) for n in range(100)])\"\n" +"10000 loops, best of 5: 27.5 usec per loop\n" +"$ python -m timeit \"'-'.join(map(str, range(100)))\"\n" +"10000 loops, best of 5: 23.2 usec per loop" + +#: ../../library/timeit.rst:37 +msgid "This can be achieved from the :ref:`python-interface` with::" +msgstr "这可以通过 :ref:`python-interface` 实现 ::" + +#: ../../library/timeit.rst:39 +msgid "" +">>> import timeit\n" +">>> timeit.timeit('\"-\".join(str(n) for n in range(100))', number=10000)\n" +"0.3018611848820001\n" +">>> timeit.timeit('\"-\".join([str(n) for n in range(100)])', number=10000)\n" +"0.2727368790656328\n" +">>> timeit.timeit('\"-\".join(map(str, range(100)))', number=10000)\n" +"0.23702679807320237" +msgstr "" +">>> import timeit\n" +">>> timeit.timeit('\"-\".join(str(n) for n in range(100))', number=10000)\n" +"0.3018611848820001\n" +">>> timeit.timeit('\"-\".join([str(n) for n in range(100)])', number=10000)\n" +"0.2727368790656328\n" +">>> timeit.timeit('\"-\".join(map(str, range(100)))', number=10000)\n" +"0.23702679807320237" + +#: ../../library/timeit.rst:47 +msgid "A callable can also be passed from the :ref:`python-interface`::" +msgstr "从 :ref:`python-interface` 还可以传入一个可调用对象::" + +#: ../../library/timeit.rst:49 +msgid "" +">>> timeit.timeit(lambda: \"-\".join(map(str, range(100))), number=10000)\n" +"0.19665591977536678" +msgstr "" +">>> timeit.timeit(lambda: \"-\".join(map(str, range(100))), number=10000)\n" +"0.19665591977536678" + +#: ../../library/timeit.rst:52 +msgid "" +"Note however that :func:`.timeit` will automatically determine the number of" +" repetitions only when the command-line interface is used. In the " +":ref:`timeit-examples` section you can find more advanced examples." +msgstr "" +"但请注意 :func:`.timeit` 仅在使用命令行界面时会自动确定重复次数。 在 :ref:`timeit-examples` " +"一节你可以找到更多的进阶示例。" + +#: ../../library/timeit.rst:60 +msgid "Python interface" +msgstr "" + +#: ../../library/timeit.rst:62 +msgid "The module defines three convenience functions and a public class:" +msgstr "该模块定义了三个便利函数和一个公共类:" + +#: ../../library/timeit.rst:67 +msgid "" +"Create a :class:`Timer` instance with the given statement, *setup* code and " +"*timer* function and run its :meth:`.timeit` method with *number* " +"executions. The optional *globals* argument specifies a namespace in which " +"to execute the code." +msgstr "" +"使用给定语句、 *setup* 代码和 *timer* 函数创建一个 :class:`Timer` 实例,并执行 *number* 次其 " +":meth:`.timeit` 方法。可选的 *globals* 参数指定用于执行代码的命名空间。" + +#: ../../library/timeit.rst:72 ../../library/timeit.rst:83 +#: ../../library/timeit.rst:122 +msgid "The optional *globals* parameter was added." +msgstr "添加可选参数 *globals* 。" + +#: ../../library/timeit.rst:78 +msgid "" +"Create a :class:`Timer` instance with the given statement, *setup* code and " +"*timer* function and run its :meth:`.repeat` method with the given *repeat* " +"count and *number* executions. The optional *globals* argument specifies a " +"namespace in which to execute the code." +msgstr "" +"使用给定语句、 *setup* 代码和 *timer* 函数创建一个 :class:`Timer` 实例,并使用给定的 *repeat* 计数和 " +"*number* 执行运行其 :meth:`.repeat` 方法。可选的 *globals* 参数指定用于执行代码的命名空间。" + +#: ../../library/timeit.rst:86 ../../library/timeit.rst:186 +msgid "Default value of *repeat* changed from 3 to 5." +msgstr "*repeat* 的默认值由 3 更改为 5 。" + +#: ../../library/timeit.rst:92 +msgid "" +"The default timer, which is always time.perf_counter(), returns float " +"seconds. An alternative, time.perf_counter_ns, returns integer nanoseconds." +msgstr "" +"默认计时器始终为 time.perf_counter(),它返回浮点形式的秒数。 另一个选择是 " +"time.perf_counter_ns,它返回整数形式的纳秒数。" + +#: ../../library/timeit.rst:95 +msgid ":func:`time.perf_counter` is now the default timer." +msgstr ":func:`time.perf_counter` 现在是默认计时器。" + +#: ../../library/timeit.rst:101 +msgid "Class for timing execution speed of small code snippets." +msgstr "用于小代码片段的计时执行速度的类。" + +#: ../../library/timeit.rst:103 +msgid "" +"The constructor takes a statement to be timed, an additional statement used " +"for setup, and a timer function. Both statements default to ``'pass'``; the" +" timer function is platform-dependent (see the module doc string). *stmt* " +"and *setup* may also contain multiple statements separated by ``;`` or " +"newlines, as long as they don't contain multi-line string literals. The " +"statement will by default be executed within timeit's namespace; this " +"behavior can be controlled by passing a namespace to *globals*." +msgstr "" +"构造函数接受一个将计时的语句、一个用于设置的附加语句和一个定时器函数。两个语句都默认为 ``'pass'`` " +";计时器函数与平台有关(请参阅模块文档字符串)。 *stmt* 和 *setup* 也可能包含多个以 ``;`` " +"或换行符分隔的语句,只要它们不包含多行字符串文字即可。该语句默认在 timeit 的命名空间内执行;可以通过将命名空间传递给 *globals* " +"来控制此行为。" + +#: ../../library/timeit.rst:111 +msgid "" +"To measure the execution time of the first statement, use the " +":meth:`.timeit` method. The :meth:`.repeat` and :meth:`.autorange` methods " +"are convenience methods to call :meth:`.timeit` multiple times." +msgstr "" +"要测量第一个语句的执行时间,请使用 :meth:`.timeit` 方法。 :meth:`.repeat` 和 :meth:`.autorange` " +"方法是方便的方法来调用 :meth:`.timeit` 多次。" + +#: ../../library/timeit.rst:115 +msgid "" +"The execution time of *setup* is excluded from the overall timed execution " +"run." +msgstr "*setup* 的执行时间从总体计时执行中排除。" + +#: ../../library/timeit.rst:117 +msgid "" +"The *stmt* and *setup* parameters can also take objects that are callable " +"without arguments. This will embed calls to them in a timer function that " +"will then be executed by :meth:`.timeit`. Note that the timing overhead is " +"a little larger in this case because of the extra function calls." +msgstr "" +"*stmt* 和 *setup* 参数也可以使用不带参数的可调用对象。这将在一个计时器函数中嵌入对它们的调用,然后由 :meth:`.timeit` " +"执行。请注意,由于额外的函数调用,在这种情况下,计时开销会略大一些。" + +#: ../../library/timeit.rst:127 +msgid "" +"Time *number* executions of the main statement. This executes the setup " +"statement once, and then returns the time it takes to execute the main " +"statement a number of times. The default timer returns seconds as a float. " +"The argument is the number of times through the loop, defaulting to one " +"million. The main statement, the setup statement and the timer function to " +"be used are passed to the constructor." +msgstr "" +"主语句执行次数 *number*。 这会执行一次设置语句,然后返回执行主语句若干次所需的时间。 默认计时器以浮点形式返回秒数。 " +"参数是循环的次数,默认为一百万次。 主语句、设置语句和要使用的定时器函数都将被传递给构造器。" + +#: ../../library/timeit.rst:136 +msgid "" +"By default, :meth:`.timeit` temporarily turns off :term:`garbage collection`" +" during the timing. The advantage of this approach is that it makes " +"independent timings more comparable. The disadvantage is that GC may be an " +"important component of the performance of the function being measured. If " +"so, GC can be re-enabled as the first statement in the *setup* string. For " +"example::" +msgstr "" +"默认情况下, :meth:`.timeit` 暂时关闭 :term:`garbage collection` " +"。这种方法的优点在于它使独立时序更具可比性。缺点是GC可能是所测量功能性能的重要组成部分。如果是这样,可以在 *setup* " +"字符串中的第一个语句重新启用GC。例如::" + +#: ../../library/timeit.rst:143 +msgid "timeit.Timer('for i in range(10): oct(i)', 'gc.enable()').timeit()" +msgstr "timeit.Timer('for i in range(10): oct(i)', 'gc.enable()').timeit()" + +#: ../../library/timeit.rst:148 +msgid "Automatically determine how many times to call :meth:`.timeit`." +msgstr "自动决定调用多少次 :meth:`.timeit` 。" + +#: ../../library/timeit.rst:150 +msgid "" +"This is a convenience function that calls :meth:`.timeit` repeatedly so that" +" the total time >= *Timer.target_time* seconds, returning the eventual " +"(number of loops, time taken for that number of loops). It calls " +":meth:`.timeit` with increasing numbers from the sequence 1, 2, 5, 10, 20, " +"50, ... until the time taken is at least *target_time* seconds." +msgstr "" + +#: ../../library/timeit.rst:156 +msgid "" +"If *callback* is given and is not ``None``, it will be called after each " +"trial with two arguments: ``callback(number, time_taken)``." +msgstr "" +"如果给出 *callback* 并且不是 ``None`` ,则在每次试验后将使用两个参数调用它: ``callback(number, " +"time_taken)`` 。" + +#: ../../library/timeit.rst:161 +msgid "The optional *target_time* parameter was added." +msgstr "" + +#: ../../library/timeit.rst:167 +msgid "Call :meth:`.timeit` a few times." +msgstr "调用 :meth:`.timeit` 几次。" + +#: ../../library/timeit.rst:169 +msgid "" +"This is a convenience function that calls the :meth:`.timeit` repeatedly, " +"returning a list of results. The first argument specifies how many times to" +" call :meth:`.timeit`. The second argument specifies the *number* argument " +"for :meth:`.timeit`." +msgstr "" +"这是一个方便的函数,它反复调用 :meth:`.timeit` ,返回结果列表。第一个参数指定调用 :meth:`.timeit` " +"的次数。第二个参数指定 :meth:`.timeit` 的 *number* 参数。" + +#: ../../library/timeit.rst:176 +msgid "" +"It's tempting to calculate mean and standard deviation from the result " +"vector and report these. However, this is not very useful. In a typical " +"case, the lowest value gives a lower bound for how fast your machine can run" +" the given code snippet; higher values in the result vector are typically " +"not caused by variability in Python's speed, but by other processes " +"interfering with your timing accuracy. So the :func:`min` of the result is " +"probably the only number you should be interested in. After that, you " +"should look at the entire vector and apply common sense rather than " +"statistics." +msgstr "" +"从结果向量计算并报告平均值和标准差这些是很诱人的。但是,这不是很有用。在典型情况下,最低值给出了机器运行给定代码段的速度的下限;结果向量中较高的值通常不是由" +" Python 的速度变化引起的,而是由于其他过程干扰你的计时准确性。所以结果的 :func:`min` " +"可能是你应该感兴趣的唯一数字。之后,你应该看看整个向量并应用常识而不是统计。" + +#: ../../library/timeit.rst:192 +msgid "Helper to print a traceback from the timed code." +msgstr "帮助程序从计时代码中打印回溯。" + +#: ../../library/timeit.rst:194 +msgid "Typical use::" +msgstr "典型使用::" + +#: ../../library/timeit.rst:196 +msgid "" +"t = Timer(...) # outside the try/except\n" +"try:\n" +" t.timeit(...) # or t.repeat(...)\n" +"except Exception:\n" +" t.print_exc()" +msgstr "" +"t = Timer(...) # 在 try/except 之外\n" +"try:\n" +" t.timeit(...) # 或 t.repeat(...)\n" +"except Exception:\n" +" t.print_exc()" + +#: ../../library/timeit.rst:202 +msgid "" +"The advantage over the standard traceback is that source lines in the " +"compiled template will be displayed. The optional *file* argument directs " +"where the traceback is sent; it defaults to :data:`sys.stderr`." +msgstr "" +"与标准回溯相比,优势在于将显示已编译模板中的源行。可选的 *file* 参数指向发送回溯的位置;它默认为 :data:`sys.stderr` 。" + +#: ../../library/timeit.rst:210 +msgid "Command-line interface" +msgstr "" + +#: ../../library/timeit.rst:212 +msgid "" +"When called as a program from the command line, the following form is used::" +msgstr "从命令行调用程序时,使用以下形式::" + +#: ../../library/timeit.rst:214 +msgid "" +"python -m timeit [-n N] [-r N] [-u U] [-s S] [-p] [-v] [-h] [statement ...]" +msgstr "" +"python -m timeit [-n N] [-r N] [-u U] [-s S] [-p] [-v] [-h] [statement ...]" + +#: ../../library/timeit.rst:216 +msgid "Where the following options are understood:" +msgstr "其中可以使用以下选项:" + +#: ../../library/timeit.rst:222 +msgid "how many times to execute 'statement'" +msgstr "执行 '语句' 多少次" + +#: ../../library/timeit.rst:226 +msgid "how many times to repeat the timer (default 5)" +msgstr "重复计时器的次数(默认为5)" + +#: ../../library/timeit.rst:230 +msgid "statement to be executed once initially (default ``pass``)" +msgstr "最初要执行一次的语句(默认为 ``pass`` )" + +#: ../../library/timeit.rst:234 +msgid "" +"measure process time, not wallclock time, using :func:`time.process_time` " +"instead of :func:`time.perf_counter`, which is the default" +msgstr "" +"测量进程时间,而不是 wallclock 时间,使用 :func:`time.process_time` 而不是 " +":func:`time.perf_counter` ,这是默认值" + +#: ../../library/timeit.rst:241 +msgid "" +"specify a time unit for timer output; can select ``nsec``, ``usec``, " +"``msec``, or ``sec``" +msgstr "为定时器输出指定一个时间单位;可以选择 ``nsec``, ``usec``, ``msec`` 或 ``sec``" + +#: ../../library/timeit.rst:247 +msgid "" +"if :option:`--number` is 0, the code will run until it takes at least this " +"many seconds (default: 0.2)" +msgstr "" + +#: ../../library/timeit.rst:254 +msgid "print raw timing results; repeat for more digits precision" +msgstr "打印原始计时结果;重复更多位数精度" + +#: ../../library/timeit.rst:258 +msgid "print a short usage message and exit" +msgstr "打印一条简短的使用信息并退出" + +#: ../../library/timeit.rst:260 +msgid "" +"A multi-line statement may be given by specifying each line as a separate " +"statement argument; indented lines are possible by enclosing an argument in " +"quotes and using leading spaces. Multiple :option:`-s` options are treated " +"similarly." +msgstr "" +"可以通过将每一行指定为单独的语句参数来给出多行语句;通过在引号中包含参数并使用前导空格可以缩进行。多个 :option:`-s` 选项的处理方式相似。" + +#: ../../library/timeit.rst:265 +msgid "" +"If :option:`-n` is not given, a suitable number of loops is calculated by " +"trying increasing numbers from the sequence 1, 2, 5, 10, 20, 50, ... until " +"the total time is at least :option:`--target-time` seconds (default: 0.2)." +msgstr "" + +#: ../../library/timeit.rst:269 +msgid "" +":func:`default_timer` measurements can be affected by other programs running" +" on the same machine, so the best thing to do when accurate timing is " +"necessary is to repeat the timing a few times and use the best time. The " +":option:`-r` option is good for this; the default of 5 repetitions is " +"probably enough in most cases. You can use :func:`time.process_time` to " +"measure CPU time." +msgstr "" +":func:`default_timer` 测量可能受到在同一台机器上运行的其他程序的影响,因此在需要精确计时时最好的做法是重复几次计时并使用最佳时间。" +" :option:`-r` 选项对此有利;在大多数情况下,默认的 5 次重复可能就足够了。 你可以使用 " +":func:`time.process_time` 来测量CPU时间。" + +#: ../../library/timeit.rst:277 +msgid "" +"There is a certain baseline overhead associated with executing a pass " +"statement. The code here doesn't try to hide it, but you should be aware of " +"it. The baseline overhead can be measured by invoking the program without " +"arguments, and it might differ between Python versions." +msgstr "" +"执行 pass 语句会产生一定的基线开销。这里的代码不会试图隐藏它,但你应该知道它。可以通过不带参数调用程序来测量基线开销,并且 Python " +"版本之间可能会有所不同。" + +#: ../../library/timeit.rst:282 +msgid "" +"Output is in color by default and can be :ref:`controlled using environment " +"variables `." +msgstr "" + +#: ../../library/timeit.rst:289 +msgid "Examples" +msgstr "例子" + +#: ../../library/timeit.rst:291 +msgid "" +"It is possible to provide a setup statement that is executed only once at " +"the beginning:" +msgstr "可以提供一个在开头只执行一次的 setup 语句:" + +#: ../../library/timeit.rst:293 +msgid "" +"$ python -m timeit -s \"text = 'sample string'; char = 'g'\" \"char in text\"\n" +"5000000 loops, best of 5: 0.0877 usec per loop\n" +"$ python -m timeit -s \"text = 'sample string'; char = 'g'\" \"text.find(char)\"\n" +"1000000 loops, best of 5: 0.342 usec per loop" +msgstr "" +"$ python -m timeit -s \"text = 'sample string'; char = 'g'\" \"char in text\"\n" +"5000000 loops, best of 5: 0.0877 usec per loop\n" +"$ python -m timeit -s \"text = 'sample string'; char = 'g'\" \"text.find(char)\"\n" +"1000000 loops, best of 5: 0.342 usec per loop" + +#: ../../library/timeit.rst:300 +msgid "" +"In the output, there are three fields. The loop count, which tells you how " +"many times the statement body was run per timing loop repetition. The " +"repetition count ('best of 5') which tells you how many times the timing " +"loop was repeated, and finally the time the statement body took on average " +"within the best repetition of the timing loop. That is, the time the fastest" +" repetition took divided by the loop count." +msgstr "" +"在输出信息中,共有三个字段。 首先是 loop count,它告诉你每个计时循环重复运行了多少次语句体。 然后是 repetition count " +"('best of 5'),它告诉你计时循环重复了多少次,最后是语句体在计时循环重复中最好的平均耗时。 即最快一次重复的耗时除以循环计数。" + +#: ../../library/timeit.rst:309 +msgid "" +">>> import timeit\n" +">>> timeit.timeit('char in text', setup='text = \"sample string\"; char = \"g\"')\n" +"0.41440500499993504\n" +">>> timeit.timeit('text.find(char)', setup='text = \"sample string\"; char = \"g\"')\n" +"1.7246671520006203" +msgstr "" +">>> import timeit\n" +">>> timeit.timeit('char in text', setup='text = \"sample string\"; char = \"g\"')\n" +"0.41440500499993504\n" +">>> timeit.timeit('text.find(char)', setup='text = \"sample string\"; char = \"g\"')\n" +"1.7246671520006203" + +#: ../../library/timeit.rst:315 +msgid "The same can be done using the :class:`Timer` class and its methods::" +msgstr "使用 :class:`Timer` 类及其方法可以完成同样的操作::" + +#: ../../library/timeit.rst:317 +msgid "" +">>> import timeit\n" +">>> t = timeit.Timer('char in text', setup='text = \"sample string\"; char = \"g\"')\n" +">>> t.timeit()\n" +"0.3955516149999312\n" +">>> t.repeat()\n" +"[0.40183617287970225, 0.37027556854118704, 0.38344867356679524, 0.3712595970846668, 0.37866875250654886]" +msgstr "" +">>> import timeit\n" +">>> t = timeit.Timer('char in text', setup='text = \"sample string\"; char = \"g\"')\n" +">>> t.timeit()\n" +"0.3955516149999312\n" +">>> t.repeat()\n" +"[0.40183617287970225, 0.37027556854118704, 0.38344867356679524, 0.3712595970846668, 0.37866875250654886]" + +#: ../../library/timeit.rst:325 +msgid "" +"The following examples show how to time expressions that contain multiple " +"lines. Here we compare the cost of using :func:`hasattr` vs. " +":keyword:`try`/:keyword:`except` to test for missing and present object " +"attributes:" +msgstr "" +"以下示例显示如何计算包含多行的表达式。 在这里我们对比使用 :func:`hasattr` 与 " +":keyword:`try`/:keyword:`except` 的开销来测试缺失与提供对象属性:" + +#: ../../library/timeit.rst:329 +msgid "" +"$ python -m timeit \"try:\" \" str.__bool__\" \"except AttributeError:\" \" pass\"\n" +"20000 loops, best of 5: 15.7 usec per loop\n" +"$ python -m timeit \"if hasattr(str, '__bool__'): pass\"\n" +"50000 loops, best of 5: 4.26 usec per loop\n" +"\n" +"$ python -m timeit \"try:\" \" int.__bool__\" \"except AttributeError:\" \" pass\"\n" +"200000 loops, best of 5: 1.43 usec per loop\n" +"$ python -m timeit \"if hasattr(int, '__bool__'): pass\"\n" +"100000 loops, best of 5: 2.23 usec per loop" +msgstr "" +"$ python -m timeit \"try:\" \" str.__bool__\" \"except AttributeError:\" \" pass\"\n" +"20000 loops, best of 5: 15.7 usec per loop\n" +"$ python -m timeit \"if hasattr(str, '__bool__'): pass\"\n" +"50000 loops, best of 5: 4.26 usec per loop\n" +"\n" +"$ python -m timeit \"try:\" \" int.__bool__\" \"except AttributeError:\" \" pass\"\n" +"200000 loops, best of 5: 1.43 usec per loop\n" +"$ python -m timeit \"if hasattr(int, '__bool__'): pass\"\n" +"100000 loops, best of 5: 2.23 usec per loop" + +#: ../../library/timeit.rst:343 +msgid "" +">>> import timeit\n" +">>> # attribute is missing\n" +">>> s = \"\"\"\\\n" +"... try:\n" +"... str.__bool__\n" +"... except AttributeError:\n" +"... pass\n" +"... \"\"\"\n" +">>> timeit.timeit(stmt=s, number=100000)\n" +"0.9138244460009446\n" +">>> s = \"if hasattr(str, '__bool__'): pass\"\n" +">>> timeit.timeit(stmt=s, number=100000)\n" +"0.5829014980008651\n" +">>>\n" +">>> # attribute is present\n" +">>> s = \"\"\"\\\n" +"... try:\n" +"... int.__bool__\n" +"... except AttributeError:\n" +"... pass\n" +"... \"\"\"\n" +">>> timeit.timeit(stmt=s, number=100000)\n" +"0.04215312199994514\n" +">>> s = \"if hasattr(int, '__bool__'): pass\"\n" +">>> timeit.timeit(stmt=s, number=100000)\n" +"0.08588060699912603" +msgstr "" +">>> import timeit\n" +">>> # 属性缺失\n" +">>> s = \"\"\"\\\n" +"... try:\n" +"... str.__bool__\n" +"... except AttributeError:\n" +"... pass\n" +"... \"\"\"\n" +">>> timeit.timeit(stmt=s, number=100000)\n" +"0.9138244460009446\n" +">>> s = \"if hasattr(str, '__bool__'): pass\"\n" +">>> timeit.timeit(stmt=s, number=100000)\n" +"0.5829014980008651\n" +">>>\n" +">>> # 属性存在\n" +">>> s = \"\"\"\\\n" +"... try:\n" +"... int.__bool__\n" +"... except AttributeError:\n" +"... pass\n" +"... \"\"\"\n" +">>> timeit.timeit(stmt=s, number=100000)\n" +"0.04215312199994514\n" +">>> s = \"if hasattr(int, '__bool__'): pass\"\n" +">>> timeit.timeit(stmt=s, number=100000)\n" +"0.08588060699912603" + +#: ../../library/timeit.rst:371 +msgid "" +"To give the :mod:`!timeit` module access to functions you define, you can " +"pass a *setup* parameter which contains an import statement::" +msgstr "要让 :mod:`!timeit` 模块访问你定义的函数,你可以传递一个包含 import 语句的 *setup* 形参::" + +#: ../../library/timeit.rst:374 +msgid "" +"def test():\n" +" \"\"\"Stupid test function\"\"\"\n" +" L = [i for i in range(100)]\n" +"\n" +"if __name__ == '__main__':\n" +" import timeit\n" +" print(timeit.timeit(\"test()\", setup=\"from __main__ import test\"))" +msgstr "" +"def test():\n" +" \"\"\"愚笨的测试函数\"\"\"\n" +" L = [i for i in range(100)]\n" +"\n" +"if __name__ == '__main__':\n" +" import timeit\n" +" print(timeit.timeit(\"test()\", setup=\"from __main__ import test\"))" + +#: ../../library/timeit.rst:382 +msgid "" +"Another option is to pass :func:`globals` to the *globals* parameter, which" +" will cause the code to be executed within your current global namespace. " +"This can be more convenient than individually specifying imports::" +msgstr "" +"另一种选择是将 :func:`globals` 传递给 *globals* 参数,这将导致代码在当前的全局命名空间中执行。这比单独指定 import " +"更方便 ::" + +#: ../../library/timeit.rst:386 +msgid "" +"def f(x):\n" +" return x**2\n" +"def g(x):\n" +" return x**4\n" +"def h(x):\n" +" return x**8\n" +"\n" +"import timeit\n" +"print(timeit.timeit('[func(42) for func in (f,g,h)]', globals=globals()))" +msgstr "" +"def f(x):\n" +" return x**2\n" +"def g(x):\n" +" return x**4\n" +"def h(x):\n" +" return x**8\n" +"\n" +"import timeit\n" +"print(timeit.timeit('[func(42) for func in (f,g,h)]', globals=globals()))" + +#: ../../library/timeit.rst:9 +msgid "Benchmarking" +msgstr "基准测试" + +#: ../../library/timeit.rst:9 +msgid "Performance" +msgstr "性能" diff --git a/library/tk.po b/library/tk.po new file mode 100644 index 0000000000..2bb8a8f085 --- /dev/null +++ b/library/tk.po @@ -0,0 +1,80 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-08 19:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/tk.rst:5 +msgid "Graphical user interfaces with Tk" +msgstr "使用 Tk 创建图形用户界面" + +#: ../../library/tk.rst:13 +msgid "" +"Tk/Tcl has long been an integral part of Python. It provides a robust and " +"platform independent windowing toolkit, that is available to Python " +"programmers using the :mod:`tkinter` package, and its extension, the " +":mod:`tkinter.ttk` module." +msgstr "" +"Tk/Tcl 早已成为 Python 的一部分。 它提供了一套健壮且独立于平台的窗口工具集,Python 程序员可通过 :mod:`tkinter` " +"包及其扩展 :mod:`tkinter.ttk` 模块来使用它。" + +#: ../../library/tk.rst:17 +msgid "" +"The :mod:`tkinter` package is a thin object-oriented layer on top of Tcl/Tk." +" To use :mod:`tkinter`, you don't need to write Tcl code, but you will need " +"to consult the Tk documentation, and occasionally the Tcl documentation. " +":mod:`tkinter` is a set of wrappers that implement the Tk widgets as Python " +"classes." +msgstr "" +":mod:`tkinter` 包是使用面向对象方式对 Tcl/Tk 进行的一层薄包装。 使用 :mod:`tkinter`,你不需要写 Tcl " +"代码,但你将需要参阅 Tk 文档,有时还需要参阅 Tcl 文档。 :mod:`tkinter` 是一组包装器,它将 Tk 的可视化部件实现为相应的 " +"Python 类。" + +#: ../../library/tk.rst:23 +msgid "" +":mod:`tkinter`'s chief virtues are that it is fast, and that it usually " +"comes bundled with Python. Although its standard documentation is weak, good" +" material is available, which includes: references, tutorials, a book and " +"others. :mod:`tkinter` is also famous for having an outdated look and feel, " +"which has been vastly improved in Tk 8.5. Nevertheless, there are many other" +" GUI libraries that you could be interested in. The Python wiki lists " +"several alternative `GUI frameworks and tools " +"`_." +msgstr "" +":mod:`tkinter` 的主要特点是速度很快,并且通常直接附带在 Python 中。 " +"虽然它的官方文档做得不好,但还是有许多可用的资源,包括:在线参考、教程、入门书等等。 :mod:`tkinter` 还有众所周知的较过时的外观界面,这在" +" Tk 8.5 中已得到很大改进。 无论如何,你还可以考虑许多其他的 GUI 库。 Python wiki 列出了一些替代性的 `GUI 框架和工具 " +"`_。" + +#: ../../library/tk.rst:7 +msgid "GUI" +msgstr "GUI" + +#: ../../library/tk.rst:7 +msgid "Graphical User Interface" +msgstr "图形用户界面" + +#: ../../library/tk.rst:7 +msgid "Tkinter" +msgstr "Tkinter" + +#: ../../library/tk.rst:7 +msgid "Tk" +msgstr "Tk" diff --git a/library/tkinter.colorchooser.po b/library/tkinter.colorchooser.po new file mode 100644 index 0000000000..68206405df --- /dev/null +++ b/library/tkinter.colorchooser.po @@ -0,0 +1,72 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-06-19 17:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/tkinter.colorchooser.rst:2 +msgid ":mod:`!tkinter.colorchooser` --- Color choosing dialog" +msgstr ":mod:`!tkinter.colorchooser` --- 颜色选择对话框" + +#: ../../library/tkinter.colorchooser.rst:7 +msgid "**Source code:** :source:`Lib/tkinter/colorchooser.py`" +msgstr "**源代码:** :source:`Lib/tkinter/colorchooser.py`" + +#: ../../library/tkinter.colorchooser.rst:11 +msgid "" +"The :mod:`!tkinter.colorchooser` module provides the :class:`Chooser` class " +"as an interface to the native color picker dialog. ``Chooser`` implements a " +"modal color choosing dialog window. The ``Chooser`` class inherits from the " +":class:`~tkinter.commondialog.Dialog` class." +msgstr "" +":mod:`!tkinter.colorchooser` 模块提供了 :class:`Chooser` " +"类作为原生颜色选取器对话框的接口。``Chooser`` 实现了一个模态颜色选择对话框窗口。``Chooser`` 类继承自 " +":class:`~tkinter.commondialog.Dialog` 类。" + +#: ../../library/tkinter.colorchooser.rst:18 +msgid "" +"The class implementing the modal color-choosing dialog. Most applications " +"use the :func:`askcolor` convenience function rather than instantiating this" +" class directly." +msgstr "" + +#: ../../library/tkinter.colorchooser.rst:24 +msgid "" +"Show a modal color-choosing dialog and return the chosen color. *color* is " +"the color selected when the dialog opens. The return value is a tuple ``((r," +" g, b), hexstr)``, where ``r``, ``g`` and ``b`` are the red, green and blue " +"components as integers in the range 0–255 and *hexstr* is the equivalent Tk " +"color string, such as ``'#ff8000'``. If the user cancels the dialog, " +"``(None, None)`` is returned." +msgstr "" + +#: ../../library/tkinter.colorchooser.rst:31 +msgid "" +"The RGB values in the returned color are now integers in the range 0–255 " +"instead of floats." +msgstr "" + +#: ../../library/tkinter.colorchooser.rst:38 +msgid "Module :mod:`tkinter.commondialog`" +msgstr "模块 :mod:`tkinter.commondialog`" + +#: ../../library/tkinter.colorchooser.rst:39 +msgid "Tkinter standard dialog module" +msgstr "Tkinter 标准对话框模块" diff --git a/library/tkinter.dnd.po b/library/tkinter.dnd.po new file mode 100644 index 0000000000..5cdeabfbfb --- /dev/null +++ b/library/tkinter.dnd.po @@ -0,0 +1,121 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-17 16:14+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/tkinter.dnd.rst:2 +msgid ":mod:`!tkinter.dnd` --- Drag and drop support" +msgstr ":mod:`!tkinter.dnd` --- 拖放操作支持" + +#: ../../library/tkinter.dnd.rst:7 +msgid "**Source code:** :source:`Lib/tkinter/dnd.py`" +msgstr "**源代码:** :source:`Lib/tkinter/dnd.py`" + +#: ../../library/tkinter.dnd.rst:11 +msgid "" +"This is experimental and due to be deprecated when it is replaced with the " +"Tk DND." +msgstr "此模块是实验性的且在为 Tk DND 所替代后将被弃用。" + +#: ../../library/tkinter.dnd.rst:14 +msgid "" +"The :mod:`!tkinter.dnd` module provides drag-and-drop support for objects " +"within a single application, within the same window or between windows. To " +"enable an object to be dragged, you must create an event binding for it that" +" starts the drag-and-drop process. Typically, you bind a ButtonPress event " +"to a callback function that you write (see :ref:`Bindings-and-Events`). The " +"function should call :func:`dnd_start`, where *source* is the object to be " +"dragged, and *event* is the event that invoked the call (the argument to " +"your callback function)." +msgstr "" + +#: ../../library/tkinter.dnd.rst:22 +msgid "Selection of a target object occurs as follows:" +msgstr "目标对象的选择方式如下:" + +#: ../../library/tkinter.dnd.rst:24 +msgid "Top-down search of the area under the mouse for a target widget:" +msgstr "" + +#: ../../library/tkinter.dnd.rst:26 +msgid "the target widget should have a callable *dnd_accept* attribute;" +msgstr "" + +#: ../../library/tkinter.dnd.rst:27 +msgid "" +"if *dnd_accept* is not present or returns ``None``, the search moves to the " +"parent widget;" +msgstr "" + +#: ../../library/tkinter.dnd.rst:29 +msgid "if no target widget is found, the target object is ``None``." +msgstr "" + +#: ../../library/tkinter.dnd.rst:31 +msgid "Call to ``.dnd_leave(source, event)``." +msgstr "" + +#: ../../library/tkinter.dnd.rst:32 +msgid "Call to ``.dnd_enter(source, event)``." +msgstr "" + +#: ../../library/tkinter.dnd.rst:33 +msgid "Call to ``.dnd_commit(source, event)`` to notify of the drop." +msgstr "" + +#: ../../library/tkinter.dnd.rst:34 +msgid "" +"Call to ``.dnd_end(target, event)`` to signal the end of drag-and-" +"drop." +msgstr "" + +#: ../../library/tkinter.dnd.rst:39 +msgid "" +"The *DndHandler* class handles drag-and-drop events tracking Motion and " +"ButtonRelease events on the root of the event widget." +msgstr "*DndHandler* 类处理拖放事件,在事件控件的根对象上跟踪 Motion 和 ButtonRelease 事件。" + +#: ../../library/tkinter.dnd.rst:44 +msgid "Cancel the drag-and-drop process." +msgstr "取消拖放进程。" + +#: ../../library/tkinter.dnd.rst:48 +msgid "Execute end of drag-and-drop functions." +msgstr "执行结束拖放函数。" + +#: ../../library/tkinter.dnd.rst:52 +msgid "Inspect area below mouse for target objects while a drag is performed." +msgstr "" + +#: ../../library/tkinter.dnd.rst:57 +msgid "Signal end of drag when the release pattern is triggered." +msgstr "当释放模式被触发时表明拖动的结束。" + +#: ../../library/tkinter.dnd.rst:61 +msgid "" +"Factory function for the drag-and-drop process. Return the " +":class:`DndHandler` instance managing the drag, or ``None`` if a drag could " +"not be started." +msgstr "" + +#: ../../library/tkinter.dnd.rst:67 +msgid ":ref:`Bindings-and-Events`" +msgstr ":ref:`Bindings-and-Events`" diff --git a/library/tkinter.font.po b/library/tkinter.font.po new file mode 100644 index 0000000000..aff330df67 --- /dev/null +++ b/library/tkinter.font.po @@ -0,0 +1,201 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-09 16:24+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/tkinter.font.rst:2 +msgid ":mod:`!tkinter.font` --- Tkinter font wrapper" +msgstr ":mod:`!tkinter.font` --- Tkinter 字体包装器" + +#: ../../library/tkinter.font.rst:7 +msgid "**Source code:** :source:`Lib/tkinter/font.py`" +msgstr "**源代码:** :source:`Lib/tkinter/font.py`" + +#: ../../library/tkinter.font.rst:11 +msgid "" +"The :mod:`!tkinter.font` module provides the :class:`Font` class for " +"creating and using named fonts." +msgstr ":mod:`!tkinter.font` 模块提供了 :class:`Font` 类,用于创建和使用命名字体。" + +#: ../../library/tkinter.font.rst:14 +msgid "The different font weights and slants are:" +msgstr "不同的字体粗细和倾斜是:" + +#: ../../library/tkinter.font.rst:23 +msgid "" +"The :class:`Font` class represents a named font. *Font* instances are given " +"unique names and can be specified by their family, size, and style " +"configuration. Named fonts are Tk's method of creating and identifying fonts" +" as a single object, rather than specifying a font by its attributes with " +"each occurrence." +msgstr "" +":class:`Font` 类表示命名字体。*Font* 实例具有唯一的名称,可以通过其族、大小和样式配置进行指定。命名字体是 Tk " +"将字体创建和标识为单个对象的方法,而不是通过每次出现时的属性来指定字体。" + +#: ../../library/tkinter.font.rst:29 +msgid "" +"Two fonts now compare equal (``==``) only when both are :class:`Font` " +"instances with the same name belonging to the same Tcl interpreter." +msgstr "" + +#: ../../library/tkinter.font.rst:33 +msgid "arguments:" +msgstr "参数:" + +#: ../../library/tkinter.font.rst:0 +msgid "*font* - font specifier tuple (family, size, options)" +msgstr "*font* - 字体指示符元组 (family, size, options)" + +#: ../../library/tkinter.font.rst:0 +msgid "*name* - unique font name" +msgstr "*name* - 唯一的字体名" + +#: ../../library/tkinter.font.rst:0 +msgid "*exists* - self points to existing named font if true" +msgstr "*exists* - 指向现有命名字体(如果有)" + +#: ../../library/tkinter.font.rst:39 +msgid "additional keyword options (ignored if *font* is specified):" +msgstr "其他关键字选项(如果指定了 *font*,则忽略):" + +#: ../../library/tkinter.font.rst:0 +msgid "*family* - font family, for example, Courier, Times" +msgstr "" + +#: ../../library/tkinter.font.rst:0 +msgid "*size* - font size" +msgstr "*size* - 字体大小" + +#: ../../library/tkinter.font.rst:0 +msgid "If *size* is positive it is interpreted as size in points." +msgstr "如果 *size* 为正数,则解释为以磅为单位的大小。" + +#: ../../library/tkinter.font.rst:0 +msgid "If *size* is a negative number its absolute value is treated" +msgstr "如果 *size* 是负数,则将其绝对值" + +#: ../../library/tkinter.font.rst:0 +msgid "as size in pixels." +msgstr "解释为以像素为单位的大小。" + +#: ../../library/tkinter.font.rst:0 +msgid "*weight* - font emphasis (NORMAL, BOLD)" +msgstr "*weight* - 字体强调 (NORMAL, BOLD)(普通,加粗)" + +#: ../../library/tkinter.font.rst:0 +msgid "*slant* - ROMAN, ITALIC" +msgstr "*slant* - ROMAN, ITALIC(正体,斜体)" + +#: ../../library/tkinter.font.rst:0 +msgid "*underline* - font underlining (0 - none, 1 - underline)" +msgstr "*underline* - 字体下划线(0 - 无下划线,1 - 有下划线)" + +#: ../../library/tkinter.font.rst:0 +msgid "*overstrike* - font strikeout (0 - none, 1 - strikeout)" +msgstr "*overstrike* - 字体删除线(0 - 无删除线,1 - 有删除线)" + +#: ../../library/tkinter.font.rst:53 +msgid "" +"Return the actual attributes of the font, which may differ from the " +"requested ones because of platform limitations. With no *option*, return a " +"dictionary of all the attributes; if *option* is given, return the value of " +"that single attribute. The attributes are resolved on the display of the " +"*displayof* widget, or the main application window if it is not specified." +msgstr "" + +#: ../../library/tkinter.font.rst:62 +msgid "Retrieve an attribute of the font." +msgstr "检索字体的某一个属性值。" + +#: ../../library/tkinter.font.rst:69 +msgid "" +"Modify one or more attributes of the font. With no arguments, return a " +"dictionary of the current attributes." +msgstr "" + +#: ../../library/tkinter.font.rst:72 +msgid ":meth:`config` is an alias of :meth:`!configure`." +msgstr "" + +#: ../../library/tkinter.font.rst:76 +msgid "" +"Return a distinct copy of the current font: a new named font with the same " +"attributes but a different name, which can be reconfigured independently of " +"the original. If the current font wraps a font description, the copy is " +"instead a named font with its resolved attributes." +msgstr "" + +#: ../../library/tkinter.font.rst:84 +msgid "" +"Return amount of space the text would occupy on the specified display when " +"formatted in the current font, as an integer number of pixels. If no display" +" is specified then the main application window is assumed." +msgstr "" + +#: ../../library/tkinter.font.rst:90 +msgid "" +"Return font-specific data. With no options, return a dictionary mapping each" +" metric name to its integer value; if one option name is given, return that " +"metric's value as an integer. Options include:" +msgstr "" + +#: ../../library/tkinter.font.rst:96 +msgid "*ascent* - distance between baseline and highest point that a" +msgstr "*ascent* - 基线和最高点之间的距离" + +#: ../../library/tkinter.font.rst:97 ../../library/tkinter.font.rst:100 +msgid "character of the font can occupy" +msgstr "(在该字体中的一个字符可以占用的空间中)" + +#: ../../library/tkinter.font.rst:99 +msgid "*descent* - distance between baseline and lowest point that a" +msgstr "*descent* - 基线和最低点之间的距离" + +#: ../../library/tkinter.font.rst:102 +msgid "*linespace* - minimum vertical separation necessary between any two" +msgstr "*linespace* - 所需最小垂直间距(在两个" + +#: ../../library/tkinter.font.rst:103 +msgid "characters of the font that ensures no vertical overlap between lines." +msgstr "该字体的字符间,使得这两个字符在垂直方向上不重叠)。" + +#: ../../library/tkinter.font.rst:105 +msgid "*fixed* - 1 if font is fixed-width else 0" +msgstr "*fixed* - 如果该字体是等宽字体则为 1,否则为 0。" + +#: ../../library/tkinter.font.rst:109 +msgid "Return a tuple of the names of the available font families." +msgstr "" + +#: ../../library/tkinter.font.rst:113 +msgid "Return a tuple of the names of all the defined fonts." +msgstr "" + +#: ../../library/tkinter.font.rst:117 +msgid "" +"Return a :class:`Font` representation of the existing named font *name*. " +"*root* is the widget whose Tcl interpreter owns the font; if omitted, the " +"default root window is used." +msgstr "" + +#: ../../library/tkinter.font.rst:121 +msgid "The *root* parameter was added." +msgstr "增加了 *root* 形参。" diff --git a/library/tkinter.messagebox.po b/library/tkinter.messagebox.po new file mode 100644 index 0000000000..5474e6242b --- /dev/null +++ b/library/tkinter.messagebox.po @@ -0,0 +1,264 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-06-27 16:00+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/tkinter.messagebox.rst:2 +msgid ":mod:`!tkinter.messagebox` --- Tkinter message prompts" +msgstr ":mod:`!tkinter.messagebox` --- Tkinter 消息提示" + +#: ../../library/tkinter.messagebox.rst:7 +msgid "**Source code:** :source:`Lib/tkinter/messagebox.py`" +msgstr "**源代码:** :source:`Lib/tkinter/messagebox.py`" + +#: ../../library/tkinter.messagebox.rst:11 +msgid "" +"The :mod:`!tkinter.messagebox` module provides a template base class as well" +" as a variety of convenience methods for commonly used configurations. The " +"message boxes are modal: each blocks until the user responds, then returns a" +" value that depends on the function. The ``show*`` functions and " +":meth:`Message.show` return the symbolic name of the button the user " +"pressed, as a string (such as :data:`OK` or :data:`YES`), while the ``ask*``" +" functions return a :class:`bool` or ``None`` (see each function below). " +"Common message box styles and layouts include but are not limited to:" +msgstr "" + +#: ../../library/tkinter.messagebox.rst:25 +msgid "" +"Create a message window with an application-specified message, an icon and a" +" set of buttons. Each of the buttons in the message window is identified by " +"a unique symbolic name (see the *type* options)." +msgstr "创建一个带有应用专属消息、图标和按钮组的消息窗口。 消息窗口中的每个按钮均以唯一符号名称进行标识(参见 *type* 选项)。" + +#: ../../library/tkinter.messagebox.rst:29 +msgid "The following options are supported:" +msgstr "支持以下选项:" + +#: ../../library/tkinter.messagebox.rst:31 +msgid "*command*" +msgstr "*command*" + +#: ../../library/tkinter.messagebox.rst:32 +msgid "" +"Specifies the function to invoke when the user closes the dialog. The name " +"of the button clicked by the user to close the dialog is passed as argument." +" This is only available on macOS." +msgstr "指定当用户关闭对话框时要唤起的函数。 用户关闭对话框所点击的按钮名称将作为参数传入。 此选项仅在 macOS 上可用。" + +#: ../../library/tkinter.messagebox.rst:37 +msgid "*default*" +msgstr "*default*" + +#: ../../library/tkinter.messagebox.rst:38 +msgid "" +"Gives the :ref:`symbolic name ` of the default button " +"for this message window (:data:`OK`, :data:`CANCEL`, and so on). If this " +"option is not specified, the first button in the dialog will be made the " +"default." +msgstr "" +"指定消息窗口默认按钮的 :ref:`符号名称 ` (:data:`OK`, :data:`CANCEL` " +"等等)。 如果未指定此选项,则对话框中的第一个按钮将成为默认。" + +#: ../../library/tkinter.messagebox.rst:43 +msgid "*detail*" +msgstr "*detail*" + +#: ../../library/tkinter.messagebox.rst:44 +msgid "" +"Specifies an auxiliary message to the main message given by the *message* " +"option. The message detail will be presented beneath the main message and, " +"where supported by the OS, in a less emphasized font than the main message." +msgstr "" +"为由 *message* 选项给出的主消息指定一条辅助消息。 消息详情将在主消息之下展示,并且在操作系统支持的情况下,会使用次于主消息的字体。" + +#: ../../library/tkinter.messagebox.rst:50 +msgid "*icon*" +msgstr "*icon*" + +#: ../../library/tkinter.messagebox.rst:51 +msgid "" +"Specifies an :ref:`icon ` to display. If this option is " +"not specified, then the :data:`INFO` icon will be displayed." +msgstr "指定一个要显示的 :ref:`图标 `。 如果未指定此选项,则将显示 :data:`INFO` 图标。" + +#: ../../library/tkinter.messagebox.rst:55 +msgid "*message*" +msgstr "*message*" + +#: ../../library/tkinter.messagebox.rst:56 +msgid "" +"Specifies the message to display in this message box. The default value is " +"an empty string." +msgstr "指定要在此消息框中显示的消息。 默认值为空字符串。" + +#: ../../library/tkinter.messagebox.rst:59 +msgid "*parent*" +msgstr "*parent*" + +#: ../../library/tkinter.messagebox.rst:60 +msgid "" +"Makes the specified window the logical parent of the message box. The " +"message box is displayed on top of its parent window." +msgstr "将指定的窗口设为该消息框的逻辑上级。 消息框将在其上级窗口之前显示。" + +#: ../../library/tkinter.messagebox.rst:63 +msgid "*title*" +msgstr "*title*" + +#: ../../library/tkinter.messagebox.rst:64 +msgid "" +"Specifies a string to display as the title of the message box. This option " +"is ignored on macOS, where platform guidelines forbid the use of a title on " +"this kind of dialog." +msgstr "指定要作为消息框标题的字符串。 此选项在 macOS 上会被忽略,因为该平台的设计指导禁止在这种对话框中使用标题。" + +#: ../../library/tkinter.messagebox.rst:68 +msgid "*type*" +msgstr "*type*" + +#: ../../library/tkinter.messagebox.rst:69 +msgid "" +"Arranges for a :ref:`predefined set of buttons ` to be " +"displayed." +msgstr "安排显示一个 :ref:`预定义的按钮集合 `。" + +#: ../../library/tkinter.messagebox.rst:74 +msgid "Tk 8.6 added the *command* option." +msgstr "" + +#: ../../library/tkinter.messagebox.rst:78 +msgid "" +"Display a message window and wait for the user to select one of the buttons." +" Then return the symbolic name of the selected button. Keyword arguments can" +" override options specified in the constructor." +msgstr "显示一个消息窗口并等待用户选择某一个按钮。 然后返回所选择按钮的符号名称。 关键字参数可以覆盖在构造器中指定的选项。" + +#: ../../library/tkinter.messagebox.rst:82 +msgid "**Information message box**" +msgstr "**信息消息框**" + +#: ../../library/tkinter.messagebox.rst:86 +msgid "" +"Creates and displays an information message box with the specified title and" +" message." +msgstr "创建并显示一个具有指定标题和消息的信息消息框。" + +#: ../../library/tkinter.messagebox.rst:89 +msgid "**Warning message boxes**" +msgstr "**警告消息框**" + +#: ../../library/tkinter.messagebox.rst:93 +msgid "" +"Creates and displays a warning message box with the specified title and " +"message." +msgstr "创建并显示一个具有指定标题和消息的警告消息框。" + +#: ../../library/tkinter.messagebox.rst:98 +msgid "" +"Creates and displays an error message box with the specified title and " +"message." +msgstr "创建并显示一个具有指定标题和消息的错误消息框。" + +#: ../../library/tkinter.messagebox.rst:101 +msgid "**Question message boxes**" +msgstr "**疑问消息框**" + +#: ../../library/tkinter.messagebox.rst:105 +msgid "" +"Ask a question. By default shows buttons :data:`YES` and :data:`NO`. Returns" +" the symbolic name of the selected button." +msgstr "提出一个问题。 在默认情况下显示 :data:`YES` 和 :data:`NO` 按钮。 返回所选择按钮的符号名称。" + +#: ../../library/tkinter.messagebox.rst:110 +msgid "" +"Ask if operation should proceed. Shows buttons :data:`OK` and " +":data:`CANCEL`. Returns ``True`` if the answer is ok and ``False`` " +"otherwise." +msgstr "" +"询问操作是否要继续。 显示 :data:`OK` 和 :data:`CANCEL` 按钮。 如果选择确定将返回 ``True`` 否则返回 " +"``False``。" + +#: ../../library/tkinter.messagebox.rst:115 +msgid "" +"Ask if operation should be retried. Shows buttons :data:`RETRY` and " +":data:`CANCEL`. Return ``True`` if the answer is retry and ``False`` " +"otherwise." +msgstr "" + +#: ../../library/tkinter.messagebox.rst:120 +msgid "" +"Ask a question. Shows buttons :data:`YES` and :data:`NO`. Returns ``True`` " +"if the answer is yes and ``False`` otherwise." +msgstr "" +"提出一个问题。 显示 :data:`YES` 和 :data:`NO` 按钮。 如果选择是则返回 ``True`` 否则返回 ``False``。" + +#: ../../library/tkinter.messagebox.rst:125 +msgid "" +"Ask a question. Shows buttons :data:`YES`, :data:`NO` and :data:`CANCEL`. " +"Return ``True`` if the answer is yes, ``None`` if cancelled, and ``False`` " +"otherwise." +msgstr "" +"提出一个问题。 显示 :data:`YES`, :data:`NO` 和 :data:`CANCEL` 按钮。 如果选择是则返回 " +"``True``,取消则返回 ``None``,否则返回 ``False``。" + +#: ../../library/tkinter.messagebox.rst:132 +msgid "Symbolic names of buttons:" +msgstr "按钮的符号名称:" + +#: ../../library/tkinter.messagebox.rst:151 +msgid "Predefined sets of buttons:" +msgstr "预定义的按钮集合:" + +#: ../../library/tkinter.messagebox.rst:156 +msgid "" +"Displays three buttons whose symbolic names are :data:`ABORT`, :data:`RETRY`" +" and :data:`IGNORE`." +msgstr "显示符号名称为 :data:`ABORT`, :data:`RETRY` 和 :data:`IGNORE` 的三个按钮。" + +#: ../../library/tkinter.messagebox.rst:163 +msgid "Displays one button whose symbolic name is :data:`OK`." +msgstr "显示符号名称为 :data:`OK` 的一个按钮。" + +#: ../../library/tkinter.messagebox.rst:168 +msgid "" +"Displays two buttons whose symbolic names are :data:`OK` and :data:`CANCEL`." +msgstr "显示符号名称为 :data:`OK` 和 :data:`CANCEL` 的两个按钮。" + +#: ../../library/tkinter.messagebox.rst:174 +msgid "" +"Displays two buttons whose symbolic names are :data:`RETRY` and " +":data:`CANCEL`." +msgstr "显示符号名称为 :data:`RETRY` 和 :data:`CANCEL` 的两个按钮。" + +#: ../../library/tkinter.messagebox.rst:180 +msgid "" +"Displays two buttons whose symbolic names are :data:`YES` and :data:`NO`." +msgstr "显示符号名称为 :data:`YES` 和 :data:`NO` 的两个按钮。" + +#: ../../library/tkinter.messagebox.rst:186 +msgid "" +"Displays three buttons whose symbolic names are :data:`YES`, :data:`NO` and " +":data:`CANCEL`." +msgstr "显示符号名称为 :data:`YES`, :data:`NO` 和 :data:`CANCEL` 的三个按钮。" + +#: ../../library/tkinter.messagebox.rst:191 +msgid "Icon images:" +msgstr "图标图像:" diff --git a/library/tkinter.po b/library/tkinter.po new file mode 100644 index 0000000000..766dba5119 --- /dev/null +++ b/library/tkinter.po @@ -0,0 +1,8019 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-17 16:14+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/tkinter.rst:2 +msgid ":mod:`!tkinter` --- Python interface to Tcl/Tk" +msgstr ":mod:`!tkinter` --- Tcl/Tk 的 Python 接口" + +#: ../../library/tkinter.rst:9 +msgid "**Source code:** :source:`Lib/tkinter/__init__.py`" +msgstr "**源代码:** :source:`Lib/tkinter/__init__.py`" + +#: ../../library/tkinter.rst:13 +msgid "" +"The :mod:`!tkinter` package (\"Tk interface\") is the standard Python " +"interface to the Tcl/Tk GUI toolkit. Both Tk and :mod:`!tkinter` are " +"available on most Unix platforms, including macOS, as well as on Windows " +"systems." +msgstr "" +":mod:`!tkinter` 包 (\"Tk interface\") 是针对 Tcl/Tk GUI 工具包的标准 Python 接口。 Tk 和 " +":mod:`!tkinter` 在包括 macOS 在内的大多数 Unix 平台以及 Windows 系统上均可用。systems." + +#: ../../library/tkinter.rst:17 +msgid "" +"Running ``python -m tkinter`` from the command line should open a window " +"demonstrating a simple Tk interface, letting you know that :mod:`!tkinter` " +"is properly installed on your system, and also showing what version of " +"Tcl/Tk is installed, so you can read the Tcl/Tk documentation specific to " +"that version." +msgstr "" +"在命令行运行 ``python -m tkinter`` 会打开一个演示简单 simple Tk 界面的窗口,以表明 :mod:`!tkinter` " +"在你的系统上安装正确,还会显示所安装的 Tcl/Tk 版本,以便你参阅对应版本的 Tcl/Tk 文档。" + +#: ../../library/tkinter.rst:22 +msgid "" +"Tkinter supports a range of Tcl/Tk versions, built either with or without " +"thread support. Tcl/Tk 8.5.12 is the minimum supported version; the official" +" Python binary release bundles Tcl/Tk 8.6. See the source code for the " +":mod:`_tkinter` module for more information about supported versions." +msgstr "" + +#: ../../library/tkinter.rst:29 +msgid "Support for Tcl/Tk versions older than 8.5.12 was removed." +msgstr "" + +#: ../../library/tkinter.rst:32 +msgid "" +"Tkinter is not a thin wrapper, but adds a fair amount of its own logic to " +"make the experience more pythonic. This documentation will concentrate on " +"these additions and changes, and refer to the official Tcl/Tk documentation " +"for details that are unchanged." +msgstr "" +"Tkinter 并不只是做了简单的封装,而是增加了相当多的代码逻辑,让使用体验更具 Python 风格(pythonic) " +"。本文将集中介绍这些增加和变化部分,关于未改动部分的细节,请参考 Tcl/Tk 官方文档。" + +#: ../../library/tkinter.rst:39 +msgid "" +"Tcl/Tk 8.5 (2007) introduced a modern set of themed user interface " +"components along with a new API to use them (see :mod:`tkinter.ttk`). Both " +"old and new APIs are still available. Most documentation you will find " +"online still uses the old API and can be woefully outdated." +msgstr "" + +#: ../../includes/optional-module.rst:1 +msgid "" +"This is an :term:`optional module`. If it is missing from your copy of " +"CPython, look for documentation from your distributor (that is, whoever " +"provided Python to you). If you are the distributor, see :ref:`optional-" +"module-requirements`." +msgstr "" +"这是一个 :term:`optional module`。 如果它在你的 CPython 副本中缺失,请查看你的发行方(也就是说,向你提供 Python" +" 的人)的文档。 如果你就是发行方,请参阅 :ref:`optional-module-requirements`。" + +#: ../../library/tkinter.rst:49 +msgid "`TkDocs `_" +msgstr "`TkDocs `_" + +#: ../../library/tkinter.rst:50 +msgid "" +"Extensive tutorial on creating user interfaces with Tkinter. Explains key " +"concepts, and illustrates recommended approaches using the modern API." +msgstr "关于使用 Tkinter 创建用户界面的详细教程。 讲解了关键概念,并介绍了使用现代 API 的推荐方式。" + +#: ../../library/tkinter.rst:53 +msgid "" +"`Tkinter 8.5 reference: a GUI for Python `_" +msgstr "`Tkinter 8.5 参考手册:一种 Python GUI `_" + +#: ../../library/tkinter.rst:54 +msgid "" +"Reference documentation for Tkinter 8.5 detailing available classes, " +"methods, and options." +msgstr "详细讲解可用的类、方法和选项的 Tkinter 8.5 参考文档。" + +#: ../../library/tkinter.rst:56 +msgid "Tcl/Tk Resources:" +msgstr "Tcl/Tk 资源:" + +#: ../../library/tkinter.rst:58 +msgid "`Tk commands `_" +msgstr "" + +#: ../../library/tkinter.rst:59 +msgid "" +"Comprehensive reference to each of the underlying Tcl/Tk commands used by " +"Tkinter." +msgstr "有关 Tkinter 所使用的每个底层 Tcl/Tk 命令的完整参考文档。" + +#: ../../library/tkinter.rst:61 +msgid "`Tcl/Tk Home Page `_" +msgstr "`Tcl/Tk 主页 `_" + +#: ../../library/tkinter.rst:62 +msgid "Additional documentation, and links to Tcl/Tk core development." +msgstr "额外的文档,以及 Tcl/Tk 核心开发相关链接。" + +#: ../../library/tkinter.rst:64 +msgid "Books:" +msgstr "书籍:" + +#: ../../library/tkinter.rst:66 +msgid "" +"`Modern Tkinter for Busy Python Developers `_" +msgstr "" +"`Modern Tkinter for Busy Python Developers `_" + +#: ../../library/tkinter.rst:67 +msgid "By Mark Roseman. (ISBN 978-1999149567)" +msgstr "Mark Roseman 著。 (ISBN 978-1999149567)" + +#: ../../library/tkinter.rst:69 +msgid "" +"`Python GUI programming with Tkinter `_" +msgstr "" +"`Python GUI programming with Tkinter `_" + +#: ../../library/tkinter.rst:70 +msgid "By Alan D. Moore. (ISBN 978-1788835886)" +msgstr "Alan D. Moore 著。 (ISBN 978-1788835886)" + +#: ../../library/tkinter.rst:72 +msgid "`Programming Python `_" +msgstr "`Programming Python `_" + +#: ../../library/tkinter.rst:73 +msgid "By Mark Lutz; has excellent coverage of Tkinter. (ISBN 978-0596158101)" +msgstr "Mark Lutz 著;对 Tkinter 进行了精彩的讲解。 (ISBN 978-0596158101)" + +#: ../../library/tkinter.rst:75 +msgid "" +"`Tcl and the Tk Toolkit (2nd edition) " +"`_" +msgstr "" +"`Tcl and the Tk Toolkit (2nd edition) " +"`_" + +#: ../../library/tkinter.rst:76 +msgid "" +"By John Ousterhout, inventor of Tcl/Tk, and Ken Jones; does not cover " +"Tkinter. (ISBN 978-0321336330)" +msgstr "" +"John Ousterhout ,Tcl/Tk 的创造者,与 Ken Jones 合著;未涉及 Tkinter。 (ISBN " +"978-0321336330)" + +#: ../../library/tkinter.rst:80 +msgid "Architecture" +msgstr "架构" + +#: ../../library/tkinter.rst:82 +msgid "" +"Tcl/Tk is not a single library but rather consists of a few distinct " +"modules, each with separate functionality and its own official " +"documentation. Python's binary releases also ship an add-on module together " +"with it." +msgstr "" +"Tcl/Tk 不是只有单个库,而是由几个不同的模块组成的,每个模块都有各自的功能和各自的官方文档。 Python 的二进制发行版还会再附加一个模块。" + +#: ../../library/tkinter.rst:87 +msgid "Tcl" +msgstr "Tcl" + +#: ../../library/tkinter.rst:88 +msgid "" +"Tcl is a dynamic interpreted programming language, just like Python. Though " +"it can be used on its own as a general-purpose programming language, it is " +"most commonly embedded into C applications as a scripting engine or an " +"interface to the Tk toolkit. The Tcl library has a C interface to create and" +" manage one or more instances of a Tcl interpreter, run Tcl commands and " +"scripts in those instances, and add custom commands implemented in either " +"Tcl or C. Each interpreter has an event queue, and there are facilities to " +"send events to it and process them. Unlike Python, Tcl's execution model is " +"designed around cooperative multitasking, and Tkinter bridges this " +"difference (see `Threading model`_ for details)." +msgstr "" +"Tcl 是一种动态解释型编程语言,正如 Python 一样。尽管它可作为一种通用的编程语言单独使用,但最常见的用法还是作为脚本引擎或 Tk " +"工具包的接口嵌入到 C 程序中。Tcl 库有一个 C 接口,用于创建和管理一个或多个 Tcl 解释器实例,并在这些实例中运行 Tcl 命令和脚本,添加用" +" Tcl 或 C 语言实现的自定义命令。每个解释器都拥有一个事件队列,某些部件可向解释器发送事件交由其处理。与 Python 不同,Tcl " +"的执行模型是围绕协同多任务而设计的,Tkinter 协调了两者的差别(详见 `Threading model`_ )。" + +#: ../../library/tkinter.rst:100 ../../library/tkinter.rst:900 +msgid "Tk" +msgstr "Tk" + +#: ../../library/tkinter.rst:101 +msgid "" +"Tk is a `Tcl package `_ implemented in C " +"that adds custom commands to create and manipulate GUI widgets. Each " +":class:`Tk` object embeds its own Tcl interpreter instance with Tk loaded " +"into it. Tk's widgets are very customizable, though at the cost of a dated " +"appearance. Tk uses Tcl's event queue to generate and process GUI events." +msgstr "" +"Tk 是一个用 C 语言实现的 `Tcl 包 `_,它添加了用于创建和操纵 GUI " +"部件的自定义命令。 每个 :class:`Tk` 对象都嵌入了自己的 Tcl 解释器实例并将 Tk 加载到其中。 Tk " +"的部件是高度可定制的,但其代价则是过时的外观。 Tk 使用 Tcl 的事件队列来生成并处理 GUI 事件。" + +#: ../../library/tkinter.rst:107 +msgid "Ttk" +msgstr "Ttk" + +#: ../../library/tkinter.rst:108 +msgid "" +"Themed Tk (Ttk) is a newer family of Tk widgets that provide a much better " +"appearance on different platforms than many of the classic Tk widgets. Ttk " +"is distributed as part of Tk, starting with Tk version 8.5. Python bindings " +"are provided in a separate module, :mod:`tkinter.ttk`." +msgstr "" +"带有主题的 Tk(Ttk)是较新加入的 Tk 部件,相比很多经典的 Tk 部件,在各平台提供的界面更加美观。自 Tk 8.5 版本开始,Ttk 作为 " +"Tk 的成员进行发布。Python 则捆绑在一个单独的模块中, :mod:`tkinter.ttk`。" + +#: ../../library/tkinter.rst:113 +msgid "" +"Internally, Tk and Ttk use facilities of the underlying operating system, " +"that is, Xlib on Unix/X11, Cocoa on macOS, GDI on Windows." +msgstr "" + +#: ../../library/tkinter.rst:116 +msgid "" +"When your Python application uses a class in Tkinter, for example, to create" +" a widget, the :mod:`!tkinter` module first assembles a Tcl/Tk command " +"string. It passes that Tcl command string to an internal :mod:`_tkinter` " +"binary module, which then calls the Tcl interpreter to evaluate it. The Tcl " +"interpreter will then call into the Tk and/or Ttk packages, which will in " +"turn make calls to Xlib, Cocoa, or GDI." +msgstr "" + +#: ../../library/tkinter.rst:124 +msgid "Tkinter modules" +msgstr "" + +#: ../../library/tkinter.rst:126 +msgid "" +"Support for Tkinter is spread across several modules. Most applications will" +" need the main :mod:`!tkinter` module, as well as the :mod:`tkinter.ttk` " +"module, which provides the modern themed widget set and API::" +msgstr "" +"对 Tkinter 的支持分散于多个模块中。 大多数应用程序都会需要主 :mod:`!tkinter` 模块,以及 :mod:`tkinter.ttk`" +" 模块,后者提供了具有现代主题的控件集和相应的 API::" + +#: ../../library/tkinter.rst:131 +msgid "" +"from tkinter import *\n" +"from tkinter import ttk" +msgstr "" +"from tkinter import *\n" +"from tkinter import ttk" + +#: ../../library/tkinter.rst:135 +msgid "The modules that provide Tk support include:" +msgstr "提供 Tk 支持的模块包括:" + +#: ../../library/tkinter.rst:137 +msgid ":mod:`!tkinter`" +msgstr ":mod:`!tkinter`" + +#: ../../library/tkinter.rst:138 +msgid "Main Tkinter module." +msgstr "主 Tkinter 模块。" + +#: ../../library/tkinter.rst:140 +msgid ":mod:`tkinter.colorchooser`" +msgstr ":mod:`tkinter.colorchooser`" + +#: ../../library/tkinter.rst:141 +msgid "Dialog to let the user choose a color." +msgstr "让用户选择颜色的对话框。" + +#: ../../library/tkinter.rst:143 +msgid ":mod:`tkinter.commondialog`" +msgstr ":mod:`tkinter.commondialog`" + +#: ../../library/tkinter.rst:144 +msgid "Base class for the dialogs defined in the other modules listed here." +msgstr "本文其他模块定义的对话框的基类。" + +#: ../../library/tkinter.rst:146 +msgid ":mod:`tkinter.filedialog`" +msgstr ":mod:`tkinter.filedialog`" + +#: ../../library/tkinter.rst:147 +msgid "Common dialogs to allow the user to specify a file to open or save." +msgstr "允许用户指定文件的通用对话框,用于打开或保存文件。" + +#: ../../library/tkinter.rst:149 +msgid ":mod:`tkinter.font`" +msgstr ":mod:`tkinter.font`" + +#: ../../library/tkinter.rst:150 +msgid "Utilities to help work with fonts." +msgstr "帮助操作字体的工具。" + +#: ../../library/tkinter.rst:152 +msgid ":mod:`tkinter.messagebox`" +msgstr ":mod:`tkinter.messagebox`" + +#: ../../library/tkinter.rst:153 +msgid "Access to standard Tk dialog boxes." +msgstr "访问标准的 Tk 对话框。" + +#: ../../library/tkinter.rst:155 +msgid ":mod:`tkinter.scrolledtext`" +msgstr ":mod:`tkinter.scrolledtext`" + +#: ../../library/tkinter.rst:156 +msgid "Text widget with a vertical scroll bar built in." +msgstr "内置纵向滚动条的文本组件。" + +#: ../../library/tkinter.rst:158 +msgid ":mod:`tkinter.simpledialog`" +msgstr ":mod:`tkinter.simpledialog`" + +#: ../../library/tkinter.rst:159 +msgid "Basic dialogs and convenience functions." +msgstr "基础对话框和一些便捷功能。" + +#: ../../library/tkinter.rst:161 +msgid ":mod:`tkinter.ttk`" +msgstr ":mod:`tkinter.ttk`" + +#: ../../library/tkinter.rst:162 +msgid "" +"Themed widget set introduced in Tk 8.5, providing modern alternatives for " +"many of the classic widgets in the main :mod:`!tkinter` module." +msgstr "在 Tk 8.5 中引入的带主题的控件集,提供了与主 :mod:`!tkinter` 模块中许多经典控件对应的现代化替代版本。" + +#: ../../library/tkinter.rst:165 +msgid "Additional modules:" +msgstr "附加模块:" + +#: ../../library/tkinter.rst:170 +msgid ":mod:`_tkinter`" +msgstr ":mod:`_tkinter`" + +#: ../../library/tkinter.rst:171 +msgid "" +"A binary module that contains the low-level interface to Tcl/Tk. It is " +"automatically imported by the main :mod:`!tkinter` module, and should never " +"be used directly by application programmers. It is usually a shared library " +"(or DLL), but might in some cases be statically linked with the Python " +"interpreter." +msgstr "" +"一个包含低层级 Tcl/Tk 接口的二进制模块。 它会被主 :mod:`!tkinter` 模块自动导入,而绝不应被应用程序编写者直接使用。 " +"它通常是一个共享库(或 DLL),但在某些情况下也可能与 Python 解释器动态链接。" + +#: ../../library/tkinter.rst:177 +msgid ":mod:`idlelib`" +msgstr ":mod:`idlelib`" + +#: ../../library/tkinter.rst:178 +msgid "" +"Python's Integrated Development and Learning Environment (IDLE). Based on " +":mod:`!tkinter`." +msgstr "Python 的集成开发与学习环境(IDLE)。 基于 :mod:`!tkinter`。" + +#: ../../library/tkinter.rst:181 +msgid ":mod:`!tkinter.constants`" +msgstr "" + +#: ../../library/tkinter.rst:182 +msgid "" +"Symbolic constants that can be used in place of strings when passing various" +" parameters to Tkinter calls. Automatically imported by the main " +":mod:`!tkinter` module." +msgstr "当向 Tkinter 调用传入各种形参时可被用来代替字符串的符号常量。 由主 :mod:`!tkinter` 模块自动导入。" + +#: ../../library/tkinter.rst:186 +msgid ":mod:`tkinter.dnd`" +msgstr ":mod:`tkinter.dnd`" + +#: ../../library/tkinter.rst:187 +msgid "" +"(experimental) Drag-and-drop support for :mod:`!tkinter`. This will become " +"deprecated when it is replaced with the Tk DND." +msgstr "" + +#: ../../library/tkinter.rst:190 +msgid ":mod:`turtle`" +msgstr ":mod:`turtle`" + +#: ../../library/tkinter.rst:191 +msgid "Turtle graphics in a Tk window." +msgstr "Tk 窗口中的海龟绘图库。" + +#: ../../library/tkinter.rst:197 +msgid "Tkinter life preserver" +msgstr "" + +#: ../../library/tkinter.rst:199 +msgid "" +"This section is not designed to be an exhaustive tutorial on either Tk or " +"Tkinter. For that, refer to one of the external resources noted earlier. " +"Instead, this section provides a very quick orientation to what a Tkinter " +"application looks like, identifies foundational Tk concepts, and explains " +"how the Tkinter wrapper is structured." +msgstr "" +"这一章节的设计目的不是要编写有关 Tk 或 Tkinter 的冗长教程。 要获取教程,请参阅之前列出的外部资源之一。 相反地,这一章节提供了对于 " +"Tkinter 应用程序大致样貌的快速指导,列出了基本的 Tk 概念,并解释了 Tkinter 包装器的构造是什么样的。" + +#: ../../library/tkinter.rst:205 +msgid "" +"The remainder of this section will help you to identify the classes, " +"methods, and options you'll need in your Tkinter application, and where to " +"find more detailed documentation on them, including in the official Tcl/Tk " +"reference manual." +msgstr "" +"这一章节的剩余部分将帮助你识别在你的 Tkinter 应用程序中需要的类、方法和选项,以及在哪里可以找到有关它们的更详细文档,包括官方 Tcl/Tk " +"参考手册等。" + +#: ../../library/tkinter.rst:212 +msgid "A Hello World program" +msgstr "" + +#: ../../library/tkinter.rst:214 +msgid "" +"We'll start by walking through a \"Hello World\" application in Tkinter. " +"This isn't the smallest one we could write, but has enough to illustrate " +"some key concepts you'll need to know." +msgstr "" +"让我们先来看一个 Tkinter 的 \"Hello World\" 应用程序。 " +"这并不是我们所能写出的最简短版本,但也足够说明你所需要了解的一些关键概念。" + +#: ../../library/tkinter.rst:220 +msgid "" +"from tkinter import *\n" +"from tkinter import ttk\n" +"root = Tk()\n" +"frm = ttk.Frame(root, padding=10)\n" +"frm.grid()\n" +"ttk.Label(frm, text=\"Hello World!\").grid(column=0, row=0)\n" +"ttk.Button(frm, text=\"Quit\", command=root.destroy).grid(column=1, row=0)\n" +"root.mainloop()" +msgstr "" +"from tkinter import *\n" +"from tkinter import ttk\n" +"root = Tk()\n" +"frm = ttk.Frame(root, padding=10)\n" +"frm.grid()\n" +"ttk.Label(frm, text=\"Hello World!\").grid(column=0, row=0)\n" +"ttk.Button(frm, text=\"Quit\", command=root.destroy).grid(column=1, row=0)\n" +"root.mainloop()" + +#: ../../library/tkinter.rst:230 +msgid "" +"After the imports, the next line creates an instance of the :class:`Tk` " +"class, which initializes Tk and creates its associated Tcl interpreter. It " +"also creates a toplevel window, known as the root window, which serves as " +"the main window of the application." +msgstr "" +"在导入语句之后,下一行语句创建了一个 :class:`Tk` 类的实例,它会初始化 Tk 并创建与其关联的 Tcl 解释器。 " +"它还会创建一个顶层窗口,名为 root 窗口,它将被作为应用程序的主窗口。" + +#: ../../library/tkinter.rst:235 +msgid "" +"The following line creates a frame widget, which in this case will contain a" +" label and a button we'll create next. The frame is fit inside the root " +"window." +msgstr "下一行创建了一个框架控件,在本示例中它会包含我们即将创建的一个标签和一个按钮。 框架被嵌在 root 窗口内部。" + +#: ../../library/tkinter.rst:239 +msgid "" +"The next line creates a label widget holding a static text string. The " +":meth:`~Grid.grid` method is used to specify the relative layout (position) " +"of the label within its containing frame widget, similar to how tables in " +"HTML work." +msgstr "" + +#: ../../library/tkinter.rst:244 +msgid "" +"A button widget is then created, and placed to the right of the label. When " +"pressed, it will call the :meth:`~Misc.destroy` method of the root window." +msgstr "" + +#: ../../library/tkinter.rst:247 +msgid "" +"Finally, the :meth:`mainloop` method puts everything on the display, and " +"responds to user input until the program terminates." +msgstr "最后,:meth:`mainloop` 方法将所有控件显示出来,并响应用户输入直到程序终结。" + +#: ../../library/tkinter.rst:253 +msgid "Important Tk concepts" +msgstr "" + +#: ../../library/tkinter.rst:255 +msgid "Even this simple program illustrates the following key Tk concepts:" +msgstr "即便是这样简单的程序也阐明了以下关键 Tk 概念:" + +#: ../../library/tkinter.rst:257 +msgid "widgets" +msgstr "控件" + +#: ../../library/tkinter.rst:258 +msgid "" +"A Tkinter user interface is made up of individual *widgets*. Each widget is " +"represented as a Python object, instantiated from classes like " +":class:`ttk.Frame`, :class:`ttk.Label`, and :class:`ttk.Button`." +msgstr "" +"Tkinter 用户界面是由一个个 *控件* 组成的。 每个控件都由相应的 Python 对象表示,由 :class:`ttk.Frame`, " +":class:`ttk.Label` 以及 :class:`ttk.Button` 这样的类来实例化。" + +#: ../../library/tkinter.rst:262 +msgid "widget hierarchy" +msgstr "控件层级结构" + +#: ../../library/tkinter.rst:263 +msgid "" +"Widgets are arranged in a *hierarchy*. The label and button were contained " +"within a frame, which in turn was contained within the root window. When " +"creating each *child* widget, its *parent* widget is passed as the first " +"argument to the widget constructor." +msgstr "" +"控件按 *层级结构* 来组织。 标签和按钮包含在框架中,框架又包含在根窗口中。 当创建每个 *子* 控件时,它的 *父* " +"控件会作为控件构造器的第一个参数被传入。" + +#: ../../library/tkinter.rst:268 +msgid "configuration options" +msgstr "配置选项" + +#: ../../library/tkinter.rst:269 +msgid "" +"Widgets have *configuration options*, which modify their appearance and " +"behavior, such as the text to display in a label or button. Different " +"classes of widgets will have different sets of options." +msgstr "控件具有 *配置选项*,配置选项会改变控件的外观和行为,例如要在标签或按钮中显示的文本。 不同的控件类会具有不同的选项集。" + +#: ../../library/tkinter.rst:273 +msgid "geometry management" +msgstr "几何管理" + +#: ../../library/tkinter.rst:274 +msgid "" +"Widgets aren't automatically added to the user interface when they are " +"created. A *geometry manager* like ``grid`` controls where in the user " +"interface they are placed." +msgstr "小部件在创建时不会自动添加到用户界面。一个像 ``grid`` 的 *几何管理器* 控制这些小部件在用户界面的位置。" + +#: ../../library/tkinter.rst:278 +msgid "event loop" +msgstr "事件循环" + +#: ../../library/tkinter.rst:279 +msgid "" +"Tkinter reacts to user input, changes from your program, and even refreshes " +"the display only when actively running an *event loop*. If your program " +"isn't running the event loop, your user interface won't update." +msgstr "" +"只有主动运行一个 *事件循环*,Tkinter " +"才会对用户的输入做出反应,改变你的程序,以及刷新显示。如果你的程序没有运行事件循环,你的用户界面不会更新。" + +#: ../../library/tkinter.rst:285 +msgid "Understanding how Tkinter wraps Tcl/Tk" +msgstr "" + +#: ../../library/tkinter.rst:287 +msgid "" +"When your application uses Tkinter's classes and methods, internally Tkinter" +" is assembling strings representing Tcl/Tk commands, and executing those " +"commands in the Tcl interpreter attached to your application's :class:`Tk` " +"instance." +msgstr "" +"当你的应用程序使用 Tkinter 的类和方法时,Tkinter 内部汇编代表 Tcl/Tk 命令的字符串,并在连接到你的应用程序的 " +":class:`Tk` 实例的 Tcl 解释器中执行这些命令。" + +#: ../../library/tkinter.rst:292 +msgid "" +"Whether it's trying to navigate reference documentation, trying to find the " +"right method or option, adapting some existing code, or debugging your " +"Tkinter application, there are times that it will be useful to understand " +"what those underlying Tcl/Tk commands look like." +msgstr "" +"无论是试图浏览参考文档,或是试图找到正确的方法或选项,调整一些现有的代码,亦或是调试 Tkinter 应用程序,有时候理解底层 Tcl/Tk " +"命令是什么样子的会很有用。" + +#: ../../library/tkinter.rst:297 +msgid "" +"To illustrate, here is the Tcl/Tk equivalent of the main part of the Tkinter" +" script above." +msgstr "为了说明这一点,下面是 Tcl/Tk 等价于上面 Tkinter 脚本的主要部分。" + +#: ../../library/tkinter.rst:302 +msgid "" +"ttk::frame .frm -padding 10\n" +"grid .frm\n" +"grid [ttk::label .frm.lbl -text \"Hello World!\"] -column 0 -row 0\n" +"grid [ttk::button .frm.btn -text \"Quit\" -command \"destroy .\"] -column 1 -row 0" +msgstr "" +"ttk::frame .frm -padding 10\n" +"grid .frm\n" +"grid [ttk::label .frm.lbl -text \"Hello World!\"] -column 0 -row 0\n" +"grid [ttk::button .frm.btn -text \"Quit\" -command \"destroy .\"] -column 1 -row 0" + +#: ../../library/tkinter.rst:308 +msgid "" +"Tcl's syntax is similar to many shell languages, where the first word is the" +" command to be executed, with arguments to that command following it, " +"separated by spaces. Without getting into too many details, notice the " +"following:" +msgstr "Tcl 的语法类似于许多 shell 语言,其中第一个单词是要执行的命令,后面是该命令的参数,用空格分隔。不谈太多细节,请注意以下几点:" + +#: ../../library/tkinter.rst:312 +msgid "" +"The commands used to create widgets (like ``ttk::frame``) correspond to " +"widget classes in Tkinter." +msgstr "用于创建控件 (如 ``ttk::frame``) 的命令对应于 Tkinter 中的 widget 类。" + +#: ../../library/tkinter.rst:315 +msgid "" +"Tcl widget options (like ``-text``) correspond to keyword arguments in " +"Tkinter." +msgstr "Tcl 控件选项 (如 ``-text``) 对应于 Tkinter 中的关键字参数。" + +#: ../../library/tkinter.rst:318 +msgid "" +"Widgets are referred to by a *pathname* in Tcl (like ``.frm.btn``), whereas " +"Tkinter doesn't use names but object references." +msgstr "在 Tcl 中,控件是通过 *路径名* 引用的 (例如 ``.frm.btn``),而 Tkinter 则不使用名称而使用对象引用。" + +#: ../../library/tkinter.rst:321 +msgid "" +"A widget's place in the widget hierarchy is encoded in its (hierarchical) " +"pathname, which uses a ``.`` (dot) as a path separator. The pathname for the" +" root window is just ``.`` (dot). In Tkinter, the hierarchy is defined not " +"by pathname but by specifying the parent widget when creating each child " +"widget." +msgstr "" +"控件在控件层次结构中的位置在其(层次结构)路径名中编码,该路径名使用一个 ``.`` (点)作为路径分隔符。根窗口的路径名是 ``.`` (点)。在 " +"Tkinter 中,层次结构不是通过路径名定义的,而是通过在创建每个子控件时指定父控件来定义的。" + +#: ../../library/tkinter.rst:327 +msgid "" +"Operations which are implemented as separate *commands* in Tcl (like " +"``grid`` or ``destroy``) are represented as *methods* on Tkinter widget " +"objects. As you'll see shortly, at other times Tcl uses what appear to be " +"method calls on widget objects, which more closely mirror what is used in " +"Tkinter." +msgstr "" +"在 Tcl 中被实现为单独 *命令* 的操作 (如 ``grid`` 或 ``destroy``) 在 Tkinter 控件对象上以 *方法* 表示。 " +"稍后你将看到,在其他时候 Tcl 会使用在控件对象上作为方法调用的操作,它与 Tkinter 上所使用的东西相互对应。" + +#: ../../library/tkinter.rst:335 +msgid "How do I...? What option does...?" +msgstr "我该如何...?这个选项会做...?" + +#: ../../library/tkinter.rst:337 +msgid "" +"If you're not sure how to do something in Tkinter, and you can't immediately" +" find it in the tutorial or reference documentation you're using, there are " +"a few strategies that can be helpful." +msgstr "如果您不确定如何在 Tkinter 中做一些事情,并且您不能立即在您正在使用的教程或参考文档中找到它,这里有一些策略可以帮助您。" + +#: ../../library/tkinter.rst:341 +msgid "" +"First, remember that the details of how individual widgets work may vary " +"across different versions of both Tkinter and Tcl/Tk. If you're searching " +"documentation, make sure it corresponds to the Python and Tcl/Tk versions " +"installed on your system." +msgstr "" +"首先,请记住,在不同版本的 Tkinter 和 Tcl/Tk 中,各个控件如何工作的细节可能会有所不同。如果您正在搜索文档,请确保它与安装在系统上的 " +"Python 和 Tcl/Tk 版本相对应。" + +#: ../../library/tkinter.rst:346 +msgid "" +"When searching for how to use an API, it helps to know the exact name of the" +" class, option, or method that you're using. Introspection, either in an " +"interactive Python shell or with :func:`print`, can help you identify what " +"you need." +msgstr "" +"在搜索如何使用 API 时,知道正在使用的类、选项或方法的确切名称会有所帮助。内省,无论是在交互式 Python shell 中,还是在 " +":func:`print` 中,都可以帮助你确定你需要什么。" + +#: ../../library/tkinter.rst:351 +msgid "" +"To find out what configuration options are available on any widget, call its" +" :meth:`~Misc.configure` method, which returns a dictionary containing a " +"variety of information about each object, including its default and current " +"values. Use :meth:`~Misc.keys` to get just the names of each option." +msgstr "" + +#: ../../library/tkinter.rst:358 +msgid "" +"btn = ttk.Button(frm, ...)\n" +"print(btn.configure().keys())" +msgstr "" +"btn = ttk.Button(frm, ...)\n" +"print(btn.configure().keys())" + +#: ../../library/tkinter.rst:361 +msgid "" +"As most widgets have many configuration options in common, it can be useful " +"to find out which are specific to a particular widget class. Comparing the " +"list of options to that of a simpler widget, like a frame, is one way to do " +"that." +msgstr "" +"由于大多数控件都有许多共同的配置选项,因此找出特定于特定控件类的配置选项可能会很有用。将选项列表与更简单的控件(如框架)的列表进行比较是一种方法。" + +#: ../../library/tkinter.rst:368 +msgid "print(set(btn.configure().keys()) - set(frm.configure().keys()))" +msgstr "print(set(btn.configure().keys()) - set(frm.configure().keys()))" + +#: ../../library/tkinter.rst:370 +msgid "" +"Similarly, you can find the available methods for a widget object using the " +"standard :func:`dir` function. If you try it, you'll see there are over 200 " +"common widget methods, so again identifying those specific to a widget class" +" is helpful." +msgstr "" +"类似地,你可以使用标准函数 :func:`dir` " +"来查找控件对象的可用方法。如果您尝试一下,您会发现有超过200种常见的控件方法,因此再次确认那些特定于控件类的方法是有帮助的。" + +#: ../../library/tkinter.rst:377 +msgid "" +"print(dir(btn))\n" +"print(set(dir(btn)) - set(dir(frm)))" +msgstr "" +"print(dir(btn))\n" +"print(set(dir(btn)) - set(dir(frm)))" + +#: ../../library/tkinter.rst:382 +msgid "Navigating the Tcl/Tk reference manual" +msgstr "" + +#: ../../library/tkinter.rst:384 +msgid "" +"As noted, the official `Tk commands `_ reference manual (man pages) is " +"often the most accurate description of what specific operations on widgets " +"do. Even when you know the name of the option or method that you need, you " +"may still have a few places to look." +msgstr "" + +#: ../../library/tkinter.rst:391 +msgid "" +"While all operations in Tkinter are implemented as method calls on widget " +"objects, you've seen that many Tcl/Tk operations appear as commands that " +"take a widget pathname as its first parameter, followed by optional " +"parameters, for example" +msgstr "" + +#: ../../library/tkinter.rst:398 +msgid "" +"destroy .\n" +"grid .frm.btn -column 0 -row 0" +msgstr "" +"destroy .\n" +"grid .frm.btn -column 0 -row 0" + +#: ../../library/tkinter.rst:401 +msgid "" +"Others, however, look more like methods called on a widget object (in fact, " +"when you create a widget in Tcl/Tk, it creates a Tcl command with the name " +"of the widget pathname, with the first parameter to that command being the " +"name of a method to call)." +msgstr "" +"但是,其他方法看起来更像在控件对象上调用的方法(实际上,当您在 Tcl/Tk 中创建小部件时,它会使用控件路径名创建 Tcl " +"命令,该命令的第一个参数是要调用的方法名)。" + +#: ../../library/tkinter.rst:408 +msgid "" +".frm.btn invoke\n" +".frm.lbl configure -text \"Goodbye\"" +msgstr "" +".frm.btn invoke\n" +".frm.lbl configure -text \"Goodbye\"" + +#: ../../library/tkinter.rst:412 +msgid "" +"In the official Tcl/Tk reference documentation, you'll find most operations " +"that look like method calls on the man page for a specific widget (for " +"example, you'll find the :meth:`~tkinter.ttk.Button.invoke` method on the " +"`ttk::button `_ " +"man page), while functions that take a widget as a parameter often have " +"their own man page (for example, `grid `_)." +msgstr "" + +#: ../../library/tkinter.rst:420 +msgid "" +"You'll find many common options and methods in the `options " +"`_ or `ttk::widget " +"`_ man pages, " +"while others are found in the man page for a specific widget class." +msgstr "" + +#: ../../library/tkinter.rst:425 +msgid "" +"You'll also find that many Tkinter methods have compound names, for example," +" :meth:`~Misc.winfo_x`, :meth:`~Misc.winfo_height`, " +":meth:`~Misc.winfo_viewable`. You'd find documentation for all of these in " +"the `winfo `_ man " +"page." +msgstr "" + +#: ../../library/tkinter.rst:432 +msgid "" +"Somewhat confusingly, there are also methods on all Tkinter widgets that " +"don't actually operate on the widget, but operate at a global scope, " +"independent of any widget. Examples are methods for accessing the clipboard " +"or the system bell. (They happen to be implemented as methods in the base " +":class:`Widget` class that all Tkinter widgets inherit from)." +msgstr "" +"有些令人困惑的是,所有 Tkinter " +"小部件上还有一些方法实际上并不在控件上操作,而是在全局范围内操作,独立于任何控件。例如访问剪贴板或系统响铃的方法。(它们恰好被实现为所有 Tkinter" +" 小部件都继承自的基类 :class:`Widget` 中的方法)。" + +#: ../../library/tkinter.rst:441 +msgid "Threading model" +msgstr "线程模型" + +#: ../../library/tkinter.rst:443 +msgid "" +"Python and Tcl/Tk have very different threading models, which " +":mod:`!tkinter` tries to bridge. If you use threads, you may need to be " +"aware of this." +msgstr "" + +#: ../../library/tkinter.rst:446 +msgid "" +"A Python interpreter may have many threads associated with it. In Tcl, " +"multiple threads can be created, but each thread has a separate Tcl " +"interpreter instance associated with it. Threads can also create more than " +"one interpreter instance, though each interpreter instance can be used only " +"by the one thread that created it." +msgstr "" +"一个 Python 解释器可能会关联很多线程。在 Tcl 中,可以创建多个线程,但每个线程都关联了单独的 Tcl " +"解释器实例。线程也可以创建一个以上的解释器实例,尽管每个解释器实例只能由创建它的那个线程使用。" + +#: ../../library/tkinter.rst:451 +msgid "" +"Each :class:`Tk` object created by :mod:`!tkinter` contains a Tcl " +"interpreter. It also keeps track of which thread created that interpreter. " +"Calls to :mod:`!tkinter` can be made from any Python thread. Internally, if " +"a call comes from a thread other than the one that created the :class:`Tk` " +"object, an event is posted to the interpreter's event queue, and when " +"executed, the result is returned to the calling Python thread." +msgstr "" + +#: ../../library/tkinter.rst:458 +msgid "" +"Tcl/Tk applications are normally event-driven, meaning that after " +"initialization, the interpreter runs an event loop (that is, " +":meth:`Tk.mainloop `) and responds to events. Because it is " +"single-threaded, event handlers must respond quickly, otherwise they will " +"block other events from being processed. To avoid this, any long-running " +"computations should not run in an event handler, but are either broken into " +"smaller pieces using timers, or run in another thread. This is different " +"from many GUI toolkits where the GUI runs in a completely separate thread " +"from all application code including event handlers." +msgstr "" + +#: ../../library/tkinter.rst:469 +msgid "" +"If the Tcl interpreter is not running the event loop and processing events, " +"any :mod:`!tkinter` calls made from threads other than the one running the " +"Tcl interpreter will fail." +msgstr "" + +#: ../../library/tkinter.rst:473 +msgid "A number of special cases exist:" +msgstr "存在一些特殊情况:" + +#: ../../library/tkinter.rst:475 +msgid "" +"Tcl/Tk libraries built without thread support are now rare: the bundled " +"Tcl/Tk 8.6 is built with thread support, so this case only arises with some " +"older non-threaded builds. When the library is not thread-aware, " +":mod:`!tkinter` calls the library from the originating Python thread, even " +"if this is different than the thread that created the Tcl interpreter. A " +"global lock ensures only one call occurs at a time." +msgstr "" + +#: ../../library/tkinter.rst:482 +msgid "" +"While :mod:`!tkinter` allows you to create more than one instance of a " +":class:`Tk` object (with its own interpreter), all interpreters that are " +"part of the same thread share a common event queue, which gets ugly fast. In" +" practice, don't create more than one instance of :class:`Tk` at a time. " +"Otherwise, it's best to create them in separate threads and ensure you're " +"running a thread-aware Tcl/Tk build." +msgstr "" + +#: ../../library/tkinter.rst:488 +msgid "" +"Blocking event handlers are not the only way to prevent the Tcl interpreter " +"from reentering the event loop. It is even possible to run multiple nested " +"event loops or abandon the event loop entirely. If you're doing anything " +"tricky when it comes to events or threads, be aware of these possibilities." +msgstr "" +"为了防止 Tcl " +"解释器重新进入事件循环,阻塞事件处理程序并不是唯一的做法。甚至可以运行多个嵌套的事件循环,或者完全放弃事件循环。如果在处理事件或线程时碰到棘手的问题,请小心这些可能的事情。" + +#: ../../library/tkinter.rst:493 +msgid "" +"There are a few select :mod:`!tkinter` functions that presently work only " +"when called from the thread that created the Tcl interpreter." +msgstr "" + +#: ../../library/tkinter.rst:498 +msgid "Handy reference" +msgstr "" + +#: ../../library/tkinter.rst:504 +msgid "Setting options" +msgstr "" + +#: ../../library/tkinter.rst:506 +msgid "" +"Options control things like the color and border width of a widget. Options " +"can be set in three ways:" +msgstr "配置参数可以控制组件颜色和边框宽度等。可通过三种方式进行设置:" + +#: ../../library/tkinter.rst:509 +msgid "At object creation time, using keyword arguments" +msgstr "在对象创建时,使用关键字参数" + +#: ../../library/tkinter.rst:512 +msgid "fred = Button(self, fg=\"red\", bg=\"blue\")" +msgstr "fred = Button(self, fg=\"red\", bg=\"blue\")" + +#: ../../library/tkinter.rst:514 +msgid "" +"After object creation, treating the option name like a dictionary index" +msgstr "在对象创建后,将参数名用作字典索引" + +#: ../../library/tkinter.rst:517 +msgid "" +"fred[\"fg\"] = \"red\"\n" +"fred[\"bg\"] = \"blue\"" +msgstr "" +"fred[\"fg\"] = \"red\"\n" +"fred[\"bg\"] = \"blue\"" + +#: ../../library/tkinter.rst:520 +msgid "" +"Use the config() method to update multiple attrs subsequent to object " +"creation" +msgstr "利用 config() 方法修改对象的多个属性" + +#: ../../library/tkinter.rst:523 +msgid "fred.config(fg=\"red\", bg=\"blue\")" +msgstr "fred.config(fg=\"red\", bg=\"blue\")" + +#: ../../library/tkinter.rst:527 +msgid "" +"The ``fg`` and ``bg`` options used here, and other options that control a " +"widget's appearance, belong to the classic :mod:`!tkinter` widgets. The " +"themed :mod:`tkinter.ttk` widgets recommended in the introduction do not " +"accept them; style a themed widget through the :class:`ttk.Style " +"` class instead. The three ways of setting an option " +"shown above apply to both widget sets." +msgstr "" + +#: ../../library/tkinter.rst:536 +msgid "" +"For a complete explanation of a given option and its behavior, see the Tk " +"man pages for the widget in question." +msgstr "关于这些参数及其表现的完整解释,请参阅 Tk 手册中有关组件的 man 帮助页。" + +#: ../../library/tkinter.rst:539 +msgid "" +"Note that the man pages list \"STANDARD OPTIONS\" and \"WIDGET SPECIFIC " +"OPTIONS\" for each widget. The former is a list of options that are common " +"to many widgets, the latter are the options that are idiosyncratic to that " +"particular widget. The Standard Options are documented on the " +":manpage:`options(3)` man page." +msgstr "" +"请注意,man 手册页列出了每个部件的“标准选项”和“组件特有选项”。前者是很多组件通用的选项列表,后者是该组件特有的选项。标准选项在 " +":manpage:`options(3)` man 手册中有文档。" + +#: ../../library/tkinter.rst:545 +msgid "" +"No distinction between standard and widget-specific options is made in this " +"document. Some options don't apply to some kinds of widgets. Whether a " +"given widget responds to a particular option depends on the class of the " +"widget; buttons have a ``command`` option, labels do not." +msgstr "" +"本文没有区分标准选项和部件特有选项。有些选项不适用于某类组件。组件是否对某选项做出响应,取决于组件的类别;按钮组件有一个 ``command`` " +"选项,而标签组件就没有。" + +#: ../../library/tkinter.rst:550 +msgid "" +"The options supported by a given widget are listed in that widget's man " +"page, or can be queried at runtime by calling the :meth:`~Misc.config` " +"method without arguments, or by calling the :meth:`~Misc.keys` method on " +"that widget. The return value of these calls is a dictionary whose key is " +"the name of the option as a string (for example, ``'relief'``) and whose " +"values are 5-tuples." +msgstr "" + +#: ../../library/tkinter.rst:556 +msgid "" +"Some options, like ``bg``, are synonyms for common options with long names " +"(``bg`` is shorthand for \"background\")." +msgstr "" + +#: ../../library/tkinter.rst:560 +msgid "Index" +msgstr "索引" + +#: ../../library/tkinter.rst:560 +msgid "Meaning" +msgstr "含意" + +#: ../../library/tkinter.rst:560 +msgid "Example" +msgstr "示例" + +#: ../../library/tkinter.rst:562 +msgid "0" +msgstr "0" + +#: ../../library/tkinter.rst:562 +msgid "option name" +msgstr "选项名称" + +#: ../../library/tkinter.rst:562 ../../library/tkinter.rst:564 +msgid "``'relief'``" +msgstr "``'relief'``" + +#: ../../library/tkinter.rst:564 +msgid "1" +msgstr "1" + +#: ../../library/tkinter.rst:564 +msgid "option name for database lookup" +msgstr "数据库查找的选项名称" + +#: ../../library/tkinter.rst:566 +msgid "2" +msgstr "2" + +#: ../../library/tkinter.rst:566 +msgid "option class for database lookup" +msgstr "数据库查找的选项类" + +#: ../../library/tkinter.rst:566 +msgid "``'Relief'``" +msgstr "``'Relief'``" + +#: ../../library/tkinter.rst:569 +msgid "3" +msgstr "3" + +#: ../../library/tkinter.rst:569 +msgid "default value" +msgstr "默认值" + +#: ../../library/tkinter.rst:569 +msgid "``'raised'``" +msgstr "``'raised'``" + +#: ../../library/tkinter.rst:571 +msgid "4" +msgstr "4" + +#: ../../library/tkinter.rst:571 +msgid "current value" +msgstr "当前值" + +#: ../../library/tkinter.rst:571 +msgid "``'groove'``" +msgstr "``'groove'``" + +#: ../../library/tkinter.rst:574 +msgid "Example::" +msgstr "示例::" + +#: ../../library/tkinter.rst:576 +msgid "" +">>> print(fred.config())\n" +"{'relief': ('relief', 'relief', 'Relief', 'raised', 'groove')}" +msgstr "" +">>> print(fred.config())\n" +"{'relief': ('relief', 'relief', 'Relief', 'raised', 'groove')}" + +#: ../../library/tkinter.rst:579 +msgid "" +"Of course, the dictionary printed will include all the options available and" +" their values. This is meant only as an example." +msgstr "当然,输出的字典将包含所有可用选项及其值。这里只是举个例子。" + +#: ../../library/tkinter.rst:589 +msgid "Geometry management" +msgstr "" + +#: ../../library/tkinter.rst:595 +msgid "" +"Creating a widget does not display it. A widget appears only after it has " +"been handed to a *geometry manager*, which works out its size and position " +"inside its container and keeps the layout up to date as the container is " +"resized or its content changes. Forgetting to call a geometry manager is a " +"common early mistake: the widget is created, but nothing shows up." +msgstr "" + +#: ../../library/tkinter.rst:602 +msgid "" +"Tk provides three geometry managers. Each is inherited by every widget, so " +"any widget can be managed by any of them (but see the warning below about " +"the incompatibility of grid and pack). The choice depends on the kind of " +"layout you want." +msgstr "" + +#: ../../library/tkinter.rst:607 +msgid ":meth:`grid `" +msgstr "" + +#: ../../library/tkinter.rst:608 +msgid "" +"Arranges widgets in a two-dimensional table of rows and columns. It is the " +"most flexible manager and the one to reach for by default: layouts that " +"would otherwise need several nested frames can often be expressed as a " +"single grid, and rows and columns can be told how to absorb extra space." +msgstr "" + +#: ../../library/tkinter.rst:616 +msgid "" +"ttk.Label(frm, text=\"Name:\").grid(column=0, row=0, sticky=\"w\")\n" +"ttk.Entry(frm).grid(column=1, row=0)\n" +"ttk.Button(frm, text=\"OK\").grid(column=1, row=1, sticky=\"e\")" +msgstr "" + +#: ../../library/tkinter.rst:620 +msgid ":meth:`pack `" +msgstr "" + +#: ../../library/tkinter.rst:621 +msgid "" +"Stacks widgets against one side of their container -- ``\"top\"`` (the " +"default), ``\"bottom\"``, ``\"left\"`` or ``\"right\"`` -- and can make them" +" fill or expand into the space that is left. It is convenient for simple " +"arrangements, such as a single row or column of widgets or a content area " +"framed by a toolbar and a status bar." +msgstr "" + +#: ../../library/tkinter.rst:630 +msgid "" +"toolbar.pack(side=\"top\", fill=\"x\")\n" +"status.pack(side=\"bottom\", fill=\"x\")\n" +"body.pack(side=\"left\", expand=True, fill=\"both\")" +msgstr "" + +#: ../../library/tkinter.rst:634 +msgid ":meth:`place `" +msgstr "" + +#: ../../library/tkinter.rst:635 +msgid "" +"Positions each widget at an explicit spot, given either as absolute screen " +"distances or as a fraction of the container's size. It offers the most " +"control but the least automatic behavior, and is used the least; it suits " +"special cases such as overlapping widgets or precise custom layouts." +msgstr "" + +#: ../../library/tkinter.rst:642 +msgid "" +"background.place(x=0, y=0, relwidth=1.0, relheight=1.0)\n" +"badge.place(relx=1.0, rely=0.0, anchor=\"ne\")" +msgstr "" + +#: ../../library/tkinter.rst:645 +msgid "" +"Layouts are built up by nesting: grid or pack widgets, including frames, " +"inside a frame or toplevel. Toplevels are managed by the OS window manager. " +"Classic and themed :mod:`tkinter.ttk` widgets can be managed " +"interchangeably." +msgstr "" + +#: ../../library/tkinter.rst:652 +msgid "" +"Do not apply :meth:`!pack` and :meth:`!grid` to two widgets that share the " +"same container. The two managers negotiate sizes in incompatible ways, and " +"the application can hang as they repeatedly resize the container against " +"each other. To combine them, keep each manager's widgets in a separate " +"frame." +msgstr "" + +#: ../../library/tkinter.rst:657 +msgid "" +"The full set of options accepted by each manager, with their values and " +"defaults, is documented under :meth:`Grid.grid_configure`, " +":meth:`Pack.pack_configure` and :meth:`Place.place_configure`; see also the " +":manpage:`grid(3tk)`, :manpage:`pack(3tk)` and :manpage:`place(3tk)` man " +"pages." +msgstr "" + +#: ../../library/tkinter.rst:667 +msgid "Coupling widget variables" +msgstr "" + +#: ../../library/tkinter.rst:669 +msgid "" +"Some widgets can tie their current value directly to a program variable, so " +"that the two stay in sync. Options such as ``variable``, ``textvariable``, " +"``value``, ``onvalue`` and ``offvalue`` set up this connection: when the " +"user changes the widget the variable is updated, and when the variable is " +"set the widget redraws to match." +msgstr "" + +#: ../../library/tkinter.rst:676 +msgid "" +"A widget can be linked only to a :class:`Variable` object, not to an " +"ordinary Python variable. This is not a limitation of :mod:`!tkinter` but a " +"consequence of how the two languages differ: the link relies on Tcl being " +"notified every time the value changes, and Python offers no way to react " +"when a plain variable is reassigned. A :class:`Variable` sidesteps this by " +"keeping its value inside the Tcl interpreter and exposing it through " +"explicit :meth:`~Variable.get` and :meth:`~Variable.set` methods." +msgstr "" + +#: ../../library/tkinter.rst:685 +msgid "" +"Ready-made subclasses cover the common types: :class:`StringVar`, " +":class:`IntVar`, :class:`DoubleVar` and :class:`BooleanVar`. Pass one as a " +"widget's ``textvariable`` (or ``variable``) option, then read and update it " +"with :meth:`~Variable.get` and :meth:`~Variable.set`; the widget tracks it " +"with no further work on your part." +msgstr "" + +#: ../../library/tkinter.rst:691 +msgid "" +"Keep a reference to the variable for as long as the widget uses it -- for " +"example by storing it as an attribute. A :class:`Variable` that is garbage " +"collected removes its underlying Tcl variable, breaking the connection to " +"the widget (see :class:`Variable`)." +msgstr "" + +#: ../../library/tkinter.rst:696 ../../library/tkinter.rst:746 +#: ../../library/tkinter.rst:887 +msgid "For example::" +msgstr "例如:" + +#: ../../library/tkinter.rst:698 +msgid "" +"import tkinter as tk\n" +"from tkinter import ttk\n" +"\n" +"root = tk.Tk()\n" +"\n" +"# Create the application variable and give it an initial value.\n" +"contents = tk.StringVar(value=\"this is a variable\")\n" +"\n" +"# Tell the entry widget to track the variable.\n" +"entry = ttk.Entry(root, textvariable=contents)\n" +"entry.pack()\n" +"\n" +"# Print the current value whenever the user presses Return.\n" +"def print_contents(event):\n" +" print(\"The current entry content is:\", contents.get())\n" +"\n" +"entry.bind(\"\", print_contents)\n" +"\n" +"# Setting the variable from the program updates the entry through the\n" +"# same link.\n" +"def clear():\n" +" contents.set(\"\")\n" +"\n" +"ttk.Button(root, text=\"Clear\", command=clear).pack()\n" +"\n" +"root.mainloop()" +msgstr "" + +#: ../../library/tkinter.rst:728 +msgid "The window manager" +msgstr "" + +#: ../../library/tkinter.rst:732 +msgid "" +"The *window manager* is the part of the desktop responsible for the title " +"bar, border and controls drawn around each top-level window, and for such " +"things as its title, position, size and icon. Tk gives access to these " +"through the :class:`Wm` mixin, which is inherited by the :class:`Tk` root " +"window and by every :class:`Toplevel`. You therefore call the window-manager" +" methods directly on a top-level window. Each has a short name and an " +"equivalent ``wm_``-prefixed name, for example :meth:`~Wm.title` and " +":meth:`~Wm.wm_title`." +msgstr "" + +#: ../../library/tkinter.rst:741 +msgid "" +"These methods act on the top-level window whether its content is built from " +"the classic widgets or the themed :mod:`tkinter.ttk` widgets. To reach the " +"top-level window containing an arbitrary widget, call its " +":meth:`~Misc.winfo_toplevel` method." +msgstr "" + +#: ../../library/tkinter.rst:748 +msgid "" +"import tkinter as tk\n" +"from tkinter import ttk\n" +"\n" +"root = tk.Tk()\n" +"root.title(\"My Application\")\n" +"root.geometry(\"640x480\")\n" +"root.minsize(320, 240)\n" +"\n" +"ttk.Label(root, text=\"Hello\").pack(padx=20, pady=20)\n" +"\n" +"root.mainloop()" +msgstr "" + +#: ../../library/tkinter.rst:760 +msgid "See :class:`Wm` for the full set of window-manager methods." +msgstr "" + +#: ../../library/tkinter.rst:766 +msgid "Tk option data types" +msgstr "" + +#: ../../library/tkinter.rst:770 +msgid "" +"Many widget options documented in the reference accept values of a small " +"number of common types, described here." +msgstr "" + +#: ../../library/tkinter.rst:773 +msgid "anchor" +msgstr "anchor" + +#: ../../library/tkinter.rst:774 +msgid "" +"Legal values are points of the compass: ``\"n\"``, ``\"ne\"``, ``\"e\"``, " +"``\"se\"``, ``\"s\"``, ``\"sw\"``, ``\"w\"``, ``\"nw\"``, and also " +"``\"center\"``." +msgstr "" +"合法值是罗盘的方位点:``\"n\"`` 、``\"ne\"`` 、``\"e\"`` 、``\"se\"`` 、``\"s\"`` " +"、``\"sw\"`` 、``\"w\"`` 、``\"nw\"`` 和 ``\"center\"`` 。" + +#: ../../library/tkinter.rst:777 +msgid "bitmap" +msgstr "bitmap" + +#: ../../library/tkinter.rst:778 +msgid "" +"There are ten built-in, named bitmaps: ``'error'``, ``'gray12'``, " +"``'gray25'``, ``'gray50'``, ``'gray75'``, ``'hourglass'``, ``'info'``, " +"``'questhead'``, ``'question'``, ``'warning'``. To specify an X bitmap " +"filename, give the full path to the file, preceded with an ``@``, as in " +"``\"@/usr/contrib/bitmap/gumby.bit\"``." +msgstr "" + +#: ../../library/tkinter.rst:784 +msgid "boolean" +msgstr "boolean" + +#: ../../library/tkinter.rst:785 +msgid "You can pass integers 0 or 1 or the strings ``\"yes\"`` or ``\"no\"``." +msgstr "可以传入整数 0 或 1,或是字符串 ``\"yes\"`` 或 ``\"no\"``。" + +#: ../../library/tkinter.rst:787 +msgid "callback" +msgstr "callback -- 回调" + +#: ../../library/tkinter.rst:788 +msgid "This is any Python function that takes no arguments. For example::" +msgstr "指任何无需调用参数的 Python 函数。 例如:" + +#: ../../library/tkinter.rst:790 +msgid "" +"def print_it():\n" +" print(\"hi there\")\n" +"fred[\"command\"] = print_it" +msgstr "" +"def print_it():\n" +" print(\"hi there\")\n" +"fred[\"command\"] = print_it" + +#: ../../library/tkinter.rst:794 +msgid "color" +msgstr "color" + +#: ../../library/tkinter.rst:795 +msgid "" +"Colors can be given as the names of X colors in the rgb.txt file, or as " +"strings representing RGB values in 4 bit: ``\"#RGB\"``, 8 bit: " +"``\"#RRGGBB\"``, 12 bit: ``\"#RRRGGGBBB\"``, or 16 bit: " +"``\"#RRRRGGGGBBBB\"`` ranges, where R,G,B here represent any legal hex " +"digit. See the :manpage:`colors(3tk)` man page for the list of named " +"colors." +msgstr "" + +#: ../../library/tkinter.rst:801 +msgid "cursor" +msgstr "cursor" + +#: ../../library/tkinter.rst:802 +msgid "" +"The name of the mouse cursor to display while the pointer is over the " +"widget. Tk provides a portable set of cursor names available on all " +"platforms (for example ``\"arrow\"``, ``\"watch\"``, ``\"cross\"``, or " +"``\"hand2\"``); the standard X cursor names from :file:`cursorfont.h` may " +"also be used, without the ``XC_`` prefix (so ``XC_hand2`` becomes " +"``\"hand2\"``). The full list of names, including the platform-specific " +"ones, is given in the :manpage:`cursors(3tk)` manual page. You can also " +"specify a bitmap and mask file of your own. On Windows a cursor file " +"(:file:`.cur` or :file:`.ani`) may be used directly, giving its path " +"preceded with an ``@``, as in ``\"@C:/cursors/bart.ani\"``." +msgstr "" + +#: ../../library/tkinter.rst:813 +msgid "distance" +msgstr "distance" + +#: ../../library/tkinter.rst:814 +msgid "" +"Screen distances can be specified in either pixels or absolute distances. " +"Pixels are given as numbers and absolute distances as strings, with the " +"trailing character denoting units: ``c`` for centimetres, ``i`` for inches, " +"``m`` for millimetres, ``p`` for printer's points. For example, 3.5 inches " +"is expressed as ``\"3.5i\"``." +msgstr "" +"屏幕距离可以用像素或绝对距离来指定。像素是数字,绝对距离是字符串,后面的字符表示单位:``c`` 是厘米,``i`` 是英寸,``m`` " +"是毫米,``p`` 则表示打印机的点数。例如,3.5 英寸可表示为 ``\"3.5i\"``。" + +#: ../../library/tkinter.rst:820 +msgid "font" +msgstr "font" + +#: ../../library/tkinter.rst:821 +msgid "" +"Tk uses a font description such as ``{courier 10 bold}``; in :mod:`!tkinter`" +" this is most naturally passed as a tuple of ``(family, size, *styles)`` (or" +" as the equivalent string ``\"Courier 10 bold\"``). Font sizes with " +"positive numbers are measured in points; sizes with negative numbers are " +"measured in pixels." +msgstr "" + +#: ../../library/tkinter.rst:827 +msgid "geometry" +msgstr "geometry" + +#: ../../library/tkinter.rst:828 +msgid "" +"This is a string of the form ``widthxheight``, where width and height are " +"measured in pixels for most widgets (in characters for widgets displaying " +"text). For example: ``fred[\"geometry\"] = \"200x100\"``." +msgstr "" +"这是一个 ``widthxheight`` " +"形式的字符串,其中宽度和高度对于大多数部件来说是以像素为单位的(对于显示文本的部件来说是以字符为单位的)。例如:fred[\"geometry\"] =" +" \"200x100\"。" + +#: ../../library/tkinter.rst:832 +msgid "justify" +msgstr "justify" + +#: ../../library/tkinter.rst:833 +msgid "Legal values are the strings: ``\"left\"``, ``\"center\"``, and ``\"right\"``." +msgstr "合法的值为字符串: ``\"left\"``, ``\"center\"`` 和 ``\"right\"``。" + +#: ../../library/tkinter.rst:835 +msgid "region" +msgstr "region" + +#: ../../library/tkinter.rst:836 +msgid "" +"This is a string with four space-delimited elements, each of which is a " +"legal distance (see above). For example: ``\"2 3 4 5\"`` and ``\"3i 2i 4.5i" +" 2i\"`` and ``\"3c 2c 4c 10.43c\"`` are all legal regions." +msgstr "" +"这是包含四个元素的字符串,以空格分隔,每个元素是表示一个合法的距离值(见上文)。例如:``\"2 3 4 5\"`` 、 ``\"3i 2i 4.5i " +"2i\"`` 和 ``\"3c 2c 4c 10.43c\"`` 都是合法的区域值。" + +#: ../../library/tkinter.rst:840 +msgid "relief" +msgstr "relief" + +#: ../../library/tkinter.rst:841 +msgid "" +"Determines what the border style of a widget will be. Legal values are: " +"``\"raised\"``, ``\"sunken\"``, ``\"flat\"``, ``\"groove\"``, ``\"ridge\"``," +" and ``\"solid\"``." +msgstr "" + +#: ../../library/tkinter.rst:845 +msgid "scrollcommand" +msgstr "scrollcommand" + +#: ../../library/tkinter.rst:846 +msgid "" +"This is almost always the :meth:`!set` method of some scrollbar widget, but " +"can be any widget method that takes a single argument." +msgstr "这几乎就是带滚动条部件的 :meth:`!set` 方法,但也可是任一只有一个参数的部件方法。" + +#: ../../library/tkinter.rst:849 +msgid "wrap" +msgstr "wrap" + +#: ../../library/tkinter.rst:850 +msgid "Must be one of: ``\"none\"``, ``\"char\"``, or ``\"word\"``." +msgstr "只能是以下值之一:``\"none\"`` 、 ``\"char\"`` 、 ``\"word\"``。" + +#: ../../library/tkinter.rst:855 +msgid "Bindings and events" +msgstr "" + +#: ../../library/tkinter.rst:861 +msgid "" +"The bind method from the widget command allows you to watch for certain " +"events and to have a callback function trigger when that event type occurs." +" The form of the bind method is::" +msgstr "部件命令中的 bind 方法可觉察某些事件,并在事件发生时触发一个回调函数。bind 方法的形式是:" + +#: ../../library/tkinter.rst:865 +msgid "def bind(self, sequence, func, add=''):" +msgstr "def bind(self, sequence, func, add=''):" + +#: ../../library/tkinter.rst:867 +msgid "where:" +msgstr "其中:" + +#: ../../library/tkinter.rst:869 +msgid "sequence" +msgstr "sequence" + +#: ../../library/tkinter.rst:870 +msgid "" +"is a string that denotes the target kind of event. Physical events use the " +"```` form (for example ``\"\"`` or " +"``\"\"``); application-defined virtual events use double " +"angle brackets, as in ``\"<>\"``. (See the :manpage:`bind(3tk)` man " +"page for details.)" +msgstr "" + +#: ../../library/tkinter.rst:876 +msgid "func" +msgstr "func" + +#: ../../library/tkinter.rst:877 +msgid "" +"is a Python function, taking one argument, to be invoked when the event " +"occurs. An Event instance will be passed as the argument. (Functions " +"deployed this way are commonly known as *callbacks*.)" +msgstr "" +"是带有一个参数的 Python 函数,发生事件时将会调用。传入的参数为一个 Event 实例。(以这种方式部署的函数通常称为 *回调函数*。)" + +#: ../../library/tkinter.rst:881 +msgid "add" +msgstr "add" + +#: ../../library/tkinter.rst:882 +msgid "" +"is optional, either ``''`` or ``'+'``. Passing an empty string denotes that" +" this binding is to replace any other bindings that this event is associated" +" with. Passing a ``'+'`` means that this function is to be added to the " +"list of functions bound to this event type." +msgstr "" +"可选项, ``''`` 或 ``'+'`` 。传入空字符串表示本次绑定将替换与此事件关联的其他所有绑定。传递 ``'+'`` " +"则意味着加入此事件类型已绑定函数的列表中。" + +#: ../../library/tkinter.rst:889 +msgid "" +"def turn_red(self, event):\n" +" event.widget[\"activeforeground\"] = \"red\"\n" +"\n" +"self.button.bind(\"\", self.turn_red)" +msgstr "" +"def turn_red(self, event):\n" +" event.widget[\"activeforeground\"] = \"red\"\n" +"\n" +"self.button.bind(\"\", self.turn_red)" + +#: ../../library/tkinter.rst:894 +msgid "" +"Notice how the widget field of the event is being accessed in the " +"``turn_red()`` callback. This field contains the widget that caught the X " +"event. The following table lists the other event fields you can access, and" +" how they are denoted in Tk, which can be useful when referring to the Tk " +"man pages." +msgstr "" +"请注意,在 ``turn_red()`` 回调函数中如何访问事件的 widget 字段。该字段包含了捕获 X " +"事件的控件。下表列出了事件可供访问的其他字段,及其在 Tk 中的表示方式,这在查看 Tk 手册时很有用处。" + +#: ../../library/tkinter.rst:900 +msgid "Tkinter Event Field" +msgstr "Tkinter 事件字段" + +#: ../../library/tkinter.rst:902 +msgid "%f" +msgstr "%f" + +#: ../../library/tkinter.rst:902 +msgid "focus" +msgstr "focus" + +#: ../../library/tkinter.rst:902 +msgid "%A" +msgstr "%A" + +#: ../../library/tkinter.rst:902 +msgid "char" +msgstr "char" + +#: ../../library/tkinter.rst:904 +msgid "%h" +msgstr "%h" + +#: ../../library/tkinter.rst:904 +msgid "height" +msgstr "height" + +#: ../../library/tkinter.rst:904 +msgid "%E" +msgstr "%E" + +#: ../../library/tkinter.rst:904 +msgid "send_event" +msgstr "send_event" + +#: ../../library/tkinter.rst:906 +msgid "%k" +msgstr "%k" + +#: ../../library/tkinter.rst:906 +msgid "keycode" +msgstr "keycode" + +#: ../../library/tkinter.rst:906 +msgid "%K" +msgstr "%K" + +#: ../../library/tkinter.rst:906 +msgid "keysym" +msgstr "keysym" + +#: ../../library/tkinter.rst:908 +msgid "%s" +msgstr "%s" + +#: ../../library/tkinter.rst:908 +msgid "state" +msgstr "state" + +#: ../../library/tkinter.rst:908 +msgid "%N" +msgstr "%N" + +#: ../../library/tkinter.rst:908 +msgid "keysym_num" +msgstr "keysym_num" + +#: ../../library/tkinter.rst:910 +msgid "%t" +msgstr "%t" + +#: ../../library/tkinter.rst:910 +msgid "time" +msgstr "time" + +#: ../../library/tkinter.rst:910 +msgid "%T" +msgstr "%T" + +#: ../../library/tkinter.rst:910 +msgid "type" +msgstr "type" + +#: ../../library/tkinter.rst:912 +msgid "%w" +msgstr "%w" + +#: ../../library/tkinter.rst:912 +msgid "width" +msgstr "width" + +#: ../../library/tkinter.rst:912 +msgid "%W" +msgstr "%W" + +#: ../../library/tkinter.rst:912 +msgid "widget" +msgstr "widget" + +#: ../../library/tkinter.rst:914 +msgid "%x" +msgstr "%x" + +#: ../../library/tkinter.rst:914 +msgid "x" +msgstr "x" + +#: ../../library/tkinter.rst:914 +msgid "%X" +msgstr "%X" + +#: ../../library/tkinter.rst:914 +msgid "x_root" +msgstr "x_root" + +#: ../../library/tkinter.rst:916 +msgid "%y" +msgstr "%y" + +#: ../../library/tkinter.rst:916 +msgid "y" +msgstr "y" + +#: ../../library/tkinter.rst:916 +msgid "%Y" +msgstr "%Y" + +#: ../../library/tkinter.rst:916 +msgid "y_root" +msgstr "y_root" + +#: ../../library/tkinter.rst:918 +msgid "%#" +msgstr "" + +#: ../../library/tkinter.rst:918 +msgid "serial" +msgstr "" + +#: ../../library/tkinter.rst:918 +msgid "%b" +msgstr "" + +#: ../../library/tkinter.rst:918 +msgid "num" +msgstr "" + +#: ../../library/tkinter.rst:920 +msgid "%d" +msgstr "" + +#: ../../library/tkinter.rst:920 +msgid "detail" +msgstr "" + +#: ../../library/tkinter.rst:920 +msgid "%D" +msgstr "" + +#: ../../library/tkinter.rst:920 +msgid "delta" +msgstr "" + +#: ../../library/tkinter.rst:923 +msgid "" +"The ``add`` parameter above only affects the bindings you make yourself. " +"Every widget also inherits *class bindings* that implement its standard " +"behavior -- for example a :class:`Text` widget binds :kbd:`Control-t` to " +"transpose two characters. These are described in the bindings section of the" +" widget's Tk man page (such as :manpage:`text(3tk)` or " +":manpage:`entry(3tk)`)." +msgstr "" + +#: ../../library/tkinter.rst:931 +msgid "" +"Class bindings are processed separately from your own, so binding an event " +"yourself does not replace the default; both run. To suppress an unwanted " +"default binding, bind the event on the widget and return the string " +"``\"break\"`` from your callback." +msgstr "" + +#: ../../library/tkinter.rst:939 +msgid "The index parameter" +msgstr "" + +#: ../../library/tkinter.rst:941 +msgid "" +"A number of widgets require \"index\" parameters to be passed. These are " +"used to point at a specific place in a Text widget, or to particular " +"characters in an Entry widget, or to particular menu items in a Menu widget." +msgstr "" +"很多控件都需要传入 index 参数。该参数用于指明 Text 控件中的位置,或指明 Entry 控件中的字符,或指明 Menu 控件中的菜单项。" + +#: ../../library/tkinter.rst:945 +msgid "Entry widget indexes (index, view index, etc.)" +msgstr "Entry 控件的索引(index、view index 等)" + +#: ../../library/tkinter.rst:946 +msgid "" +"Entry widgets have methods and options that refer to character positions in " +"the text being displayed. Anytime an index is needed, you may pass in:" +msgstr "" + +#: ../../library/tkinter.rst:950 +msgid "" +"an integer which refers to the numeric position of a character, counted from" +" the beginning of the text, starting with 0;" +msgstr "" + +#: ../../library/tkinter.rst:953 +msgid "" +"the string ``\"anchor\"``, which refers to the anchor point of the " +"selection, set with the widget's selection methods;" +msgstr "" + +#: ../../library/tkinter.rst:957 +msgid "" +"the string ``\"end\"``, which refers to the position just after the last " +"character;" +msgstr "" + +#: ../../library/tkinter.rst:960 +msgid "" +"the string ``\"insert\"``, which refers to the character just after the " +"insertion cursor;" +msgstr "" + +#: ../../library/tkinter.rst:963 +msgid "" +"the strings ``\"sel.first\"`` and ``\"sel.last\"``, which refer to the first" +" character in the selection and the position just after the last (it is an " +"error to use these if there is no selection);" +msgstr "" + +#: ../../library/tkinter.rst:968 +msgid "" +"a string consisting of ``@`` followed by an integer, as in ``\"@6\"``, where" +" the integer is interpreted as an x pixel coordinate in the entry's " +"coordinate system, selecting the character spanning that point." +msgstr "" + +#: ../../library/tkinter.rst:973 +msgid "Text widget indexes" +msgstr "Text 控件的索引" + +#: ../../library/tkinter.rst:974 +msgid "" +"The index notation for Text widgets is very rich and is best described in " +"the Tk man pages." +msgstr "Text 控件的索引语法非常复杂,最好还是在 Tk 手册中查看。" + +#: ../../library/tkinter.rst:977 +msgid "Menu indexes (menu.invoke(), menu.entryconfig(), etc.)" +msgstr "Menu 索引(menu.invoke()、menu.entryconfig() 等)" + +#: ../../library/tkinter.rst:978 +msgid "" +"Some options and methods for menus manipulate specific menu entries. Anytime" +" a menu index is needed for an option or a parameter, you may pass in:" +msgstr "菜单的某些属性和方法可以操纵特定的菜单项。只要属性或参数需要用到菜单索引,就可用以下方式传入:" + +#: ../../library/tkinter.rst:981 +msgid "" +"an integer which refers to the numeric position of the entry in the widget, " +"counted from the top, starting with 0;" +msgstr "一个整数,指的是菜单项的数字位置,从顶部开始计数,从 0 开始;" + +#: ../../library/tkinter.rst:984 +msgid "" +"the string ``\"active\"``, which refers to the menu position that is " +"currently under the cursor;" +msgstr "字符串 ``\"active\"``,指的是当前光标所在的菜单;" + +#: ../../library/tkinter.rst:987 +msgid "the string ``\"last\"`` which refers to the last menu item;" +msgstr "字符串 ``\"last\"``,指的是上一个菜单项;" + +#: ../../library/tkinter.rst:989 +msgid "" +"a string consisting of ``@`` followed by an integer, as in ``\"@6\"``, where" +" the integer is interpreted as a y pixel coordinate in the menu's coordinate" +" system;" +msgstr "" + +#: ../../library/tkinter.rst:993 +msgid "" +"the string ``\"none\"``, which indicates no menu entry at all, most often " +"used with menu.activate() to deactivate all entries, and finally," +msgstr "表示没有任何菜单条目的字符串 ``\"none\"`` 经常与 menu.activate() 一同被用来停用所有条目,以及 ——" + +#: ../../library/tkinter.rst:996 +msgid "" +"a text string that is pattern matched against the label of the menu entry, " +"as scanned from the top of the menu to the bottom. Note that this index " +"type is considered after all the others, which means that matches for menu " +"items labelled ``last``, ``active``, or ``none`` may be interpreted as the " +"above literals, instead." +msgstr "" +"与菜单项的文本标签进行模式匹配的文本串,从菜单顶部扫描到底部。请注意,此索引类型是在其他所有索引类型之后才会考虑的,这意味着文本标签为 " +"``last``、``active`` 或 ``none`` 的菜单项匹配成功后,可能会视为这些单词文字本身。" + +#: ../../library/tkinter.rst:1004 +msgid "Images" +msgstr "图片" + +#: ../../library/tkinter.rst:1006 +msgid "" +"Images of different formats can be created through the corresponding " +"subclass of :class:`tkinter.Image`:" +msgstr "通过 :class:`tkinter.Image` 的各种子类可以创建相应格式的图片:" + +#: ../../library/tkinter.rst:1009 +msgid ":class:`BitmapImage` for images in XBM format." +msgstr ":class:`BitmapImage` 对应 XBM 格式的图片。" + +#: ../../library/tkinter.rst:1011 +msgid "" +":class:`PhotoImage` for images in PGM, PPM, GIF and PNG formats. The latter " +"is supported starting with Tk 8.6." +msgstr ":class:`PhotoImage` 对应 PGM、PPM、GIF 和 PNG 格式的图片。后者自 Tk 8.6 开始支持。" + +#: ../../library/tkinter.rst:1014 +msgid "" +"Either type of image is created through either the ``file`` or the ``data`` " +"option (other options are available as well)." +msgstr "这两种图片可通过 ``file`` 或 ``data`` 属性创建的(也可能由其他属性创建)。" + +#: ../../library/tkinter.rst:1017 +msgid "" +"Added the :class:`!PhotoImage` method :meth:`!copy_replace` to copy a region" +" from one image to other image, possibly with pixel zooming and/or " +"subsampling. Add *from_coords* parameter to :class:`!PhotoImage` methods " +":meth:`!copy`, :meth:`!zoom` and :meth:`!subsample`. Add *zoom* and " +"*subsample* parameters to :class:`!PhotoImage` method :meth:`!copy`." +msgstr "" +"添加了 :class:`!PhotoImage` 方法 :meth:`!copy_replace` " +"以将一个图像的某个区域拷贝到另一个图像,可能带有像素缩放和/或子采样。 为 :class:`!PhotoImage` 方法 :meth:`!copy`," +" :meth:`!zoom` 和 :meth:`!subsample` 添加了 *from_coords* 形参。 为 " +":class:`!PhotoImage` 方法 :meth:`!copy` 添加了 *zoom* 和 *subsample* 形参。" + +#: ../../library/tkinter.rst:1026 +msgid "" +"The image object can then be used wherever an ``image`` option is supported " +"by some widget (for example, labels, buttons, menus). In these cases, Tk " +"will not keep a reference to the image. When the last Python reference to " +"the image object is deleted, the image data is deleted as well, and Tk will " +"display an empty box wherever the image was used." +msgstr "" + +#: ../../library/tkinter.rst:1034 +msgid "" +"The `Pillow `_ package adds support for formats " +"such as BMP, JPEG, TIFF, and WebP, among others." +msgstr "" +"`Pillow `_ 包增加了对 BMP, JPEG, TIFF 和 WebP " +"等多种格式的支持。" + +#: ../../library/tkinter.rst:1039 +msgid "Reference" +msgstr "" + +#: ../../library/tkinter.rst:1043 +msgid "" +"This section documents the classes, methods, functions and constants of the " +":mod:`!tkinter` module. Most of them wrap Tcl/Tk commands; consult the " +"official Tcl/Tk manual pages for the full list of widget options and further" +" details." +msgstr "" + +#: ../../library/tkinter.rst:1050 +msgid "" +"The exception raised when a call into the Tcl interpreter fails, for example" +" when a widget is given an unknown option or an invalid value." +msgstr "" + +#: ../../library/tkinter.rst:1054 +msgid "Base and mixin classes" +msgstr "" + +#: ../../library/tkinter.rst:1058 +msgid "" +"The :class:`!Misc` class is a mix-in inherited by :class:`Tk` and, through " +":class:`BaseWidget`, by every widget. It provides the large set of methods " +"common to all Tk objects: querying window information, managing event " +"bindings and the event loop, controlling the keyboard focus and pointer " +"grabs, accessing the selection, clipboard and option database, and assorted " +"utility and introspection services. Because they are inherited, these " +"methods are available on every widget and on the :class:`Tk` application " +"object, and are documented here once rather than repeated for each widget." +msgstr "" + +#: ../../library/tkinter.rst:1070 +msgid "" +"Return the current value of the configuration option named *key* for this " +"widget, as a string. The expression ``widget[key]`` is equivalent and may be" +" used instead." +msgstr "" + +#: ../../library/tkinter.rst:1079 +msgid "" +"Query or modify the configuration options of the widget. With no arguments, " +"return a dictionary mapping every available option name to a tuple " +"describing it (its name, X resource name, X resource class, default value " +"and current value). If a single option name is given as a string, return the" +" tuple for just that option. If one or more keyword arguments are given, or " +"a dictionary is passed as *cnf*, set each named option to the corresponding " +"value; the expression ``widget[key] = value`` sets a single option in the " +"same way." +msgstr "" + +#: ../../library/tkinter.rst:1089 +msgid ":meth:`config` is an alias of :meth:`!configure`." +msgstr "" + +#: ../../library/tkinter.rst:1093 +msgid "" +"Return a list of the names of all configuration options of this widget." +msgstr "" + +#: ../../library/tkinter.rst:1097 +msgid "" +"Interpret the string *s* as a Tcl boolean and return the corresponding " +":class:`bool`. Tcl accepts values such as ``'1'``, ``'0'``, ``'yes'``, " +"``'no'``, ``'true'`` and ``'false'``. Raise :exc:`ValueError` if *s* is not " +"a valid boolean." +msgstr "" + +#: ../../library/tkinter.rst:1105 +msgid "" +"Interpret the string *s* as a Tcl floating-point number and return it as a " +":class:`float`. Raise :exc:`ValueError` if *s* is not a valid number." +msgstr "" + +#: ../../library/tkinter.rst:1114 +msgid "" +"Interpret the string *s* as a Tcl integer and return it as an :class:`int`. " +"Raise :exc:`ValueError` if *s* is not a valid integer." +msgstr "" + +#: ../../library/tkinter.rst:1120 +msgid "Return the value of the Tcl global variable named *name*." +msgstr "" + +#: ../../library/tkinter.rst:1124 +msgid "Set the Tcl global variable named *name* to *value*." +msgstr "" + +#: ../../library/tkinter.rst:1126 +msgid "" +"The :meth:`!getvar` and :meth:`!setvar` methods give direct access to Tcl " +"variables. In most code you will instead use a :class:`Variable` subclass " +"such as :class:`StringVar` or :class:`IntVar`, which wraps a Tcl variable " +"and converts its value to and from a Python type." +msgstr "" + +#: ../../library/tkinter.rst:1134 +msgid "" +"Register the Python callable *func* as a Tcl command and return the name of " +"the new command as a string. Whenever Tcl invokes that command, *func* is " +"called; if *subst* is given, it is applied to the command's arguments first." +" This is the mechanism used internally to turn Python callbacks into the " +"command names passed to Tk options such as *command*. Unless *needcleanup* " +"is false, the command is deleted automatically when the widget is destroyed." +msgstr "" + +#: ../../library/tkinter.rst:1143 +msgid "The arguments passed to *func* are no longer converted to strings." +msgstr "" + +#: ../../library/tkinter.rst:1148 +msgid "" +"Delete the Tcl command named *name*, such as one previously returned by " +":meth:`register`." +msgstr "" + +#: ../../library/tkinter.rst:1153 +msgid "Return the widget instance corresponding to the Tk pathname *name*." +msgstr "" + +#: ../../library/tkinter.rst:1157 +msgid "" +"Send the Tcl command *cmd*, with the given *args*, to the Tcl interpreter " +"registered under the name *interp*, and return its result. This is not " +"available on all platforms." +msgstr "" + +#: ../../library/tkinter.rst:1163 +msgid "" +"Destroy this widget and all of its descendant widgets, and delete the Tcl " +"commands associated with them." +msgstr "" + +#: ../../library/tkinter.rst:1171 +msgid "" +"Raise this widget in the stacking order so that it is drawn on top of its " +"siblings. If *aboveThis* is given, the widget is moved to be just above it " +"in the stacking order instead." +msgstr "" + +#: ../../library/tkinter.rst:1176 +msgid ":meth:`lift` is an alias of :meth:`!tkraise`." +msgstr "" + +#: ../../library/tkinter.rst:1180 +msgid "" +"Lower this widget in the stacking order so that it is drawn beneath its " +"siblings. If *belowThis* is given, the widget is moved to be just below it " +"in the stacking order instead." +msgstr "" + +#: ../../library/tkinter.rst:1185 +msgid "" +":meth:`tkraise`/:meth:`lift` and :meth:`lower` are overridden by the " +":class:`Canvas` widget, where they restack canvas items instead." +msgstr "" + +#: ../../library/tkinter.rst:1191 +msgid "" +"Return the names of all images that currently exist in the Tcl interpreter." +msgstr "" + +#: ../../library/tkinter.rst:1194 +msgid "" +"This is overridden by the :class:`Text` widget, where :meth:`!image_names` " +"returns the names of its embedded images instead." +msgstr "" + +#: ../../library/tkinter.rst:1200 +msgid "" +"Return the available image types, such as ``'photo'`` and ``'bitmap'``." +msgstr "" + +#: ../../library/tkinter.rst:1207 +msgid "" +"Set the anchor that controls where the grid is placed inside this container " +"when the container is larger than the grid and no row or column has a non-" +"zero weight. *anchor* is one of the usual anchor strings, such as ``'nw'`` " +"(the default) or ``'center'``. Called with no argument, this method has no " +"effect." +msgstr "" + +#: ../../library/tkinter.rst:1214 +msgid ":meth:`anchor` is an alias of :meth:`!grid_anchor`." +msgstr "" + +#: ../../library/tkinter.rst:1223 +msgid "" +"Return the bounding box, in pixels, of a region of the grid laid out in this" +" container, as a 4-tuple ``(xoffset, yoffset, width, height)``. With no " +"arguments the bounding box of the whole grid is returned. If *column* and " +"*row* are given, the box spans from the cell at row and column 0 to that " +"cell; if *col2* and *row2* are also given, it spans from the cell (*column*," +" *row*) to the cell (*col2*, *row2*)." +msgstr "" + +#: ../../library/tkinter.rst:1230 +msgid "" +":meth:`bbox` is an alias of :meth:`!grid_bbox`, except on :class:`Canvas`, " +":class:`Listbox`, :class:`Spinbox`, :class:`Text`, :class:`ttk.Entry " +"` and :class:`ttk.Treeview `, which" +" provide their own :meth:`!bbox` method." +msgstr "" + +#: ../../library/tkinter.rst:1241 +msgid "" +"Query or set the properties of the column (or columns) *index* of the grid " +"managed by this container. *index* may be a column number; when setting " +"options it may also be a list of column numbers, the string ``'all'`` to " +"affect every column, or a child widget whose occupied columns are affected. " +"The supported options are:" +msgstr "" + +#: ../../library/tkinter.rst:1248 +msgid "*minsize*" +msgstr "" + +#: ../../library/tkinter.rst:1249 +msgid "The column's minimum size, in pixels." +msgstr "" + +#: ../../library/tkinter.rst:1251 +msgid "*weight*" +msgstr "" + +#: ../../library/tkinter.rst:1252 +msgid "" +"An integer setting how much of any extra space is apportioned to the column." +" A weight of ``0`` keeps the column at its requested size, and a column of " +"weight two grows twice as fast as a column of weight one." +msgstr "" + +#: ../../library/tkinter.rst:1257 +msgid "*uniform*" +msgstr "" + +#: ../../library/tkinter.rst:1258 +msgid "" +"The name of a uniform group. Columns sharing a non-empty group name are kept" +" in sizes that are strictly proportional to their weights." +msgstr "" + +#: ../../library/tkinter.rst:1262 +msgid "*pad*" +msgstr "" + +#: ../../library/tkinter.rst:1263 +msgid "" +"Extra space, in pixels, added to the largest widget in the column when " +"computing the column's size." +msgstr "" + +#: ../../library/tkinter.rst:1266 +msgid "" +"With a single option name, return that option's value; with no options, " +"return a dictionary of all of them." +msgstr "" + +#: ../../library/tkinter.rst:1269 +msgid ":meth:`columnconfigure` is an alias of :meth:`!grid_columnconfigure`." +msgstr "" + +#: ../../library/tkinter.rst:1276 +msgid "" +"Query or set the properties of the row (or rows) *index* of the grid managed" +" by this container. *index* is interpreted as for " +":meth:`grid_columnconfigure`, and the supported options (*minsize*, " +"*weight*, *uniform* and *pad*) are the same, applied to a row instead of a " +"column." +msgstr "" + +#: ../../library/tkinter.rst:1282 +msgid ":meth:`rowconfigure` is an alias of :meth:`!grid_rowconfigure`." +msgstr "" + +#: ../../library/tkinter.rst:1286 +msgid "" +"Return the ``(column, row)`` of the grid cell that contains the pixel at " +"position (*x*, *y*), given in pixels relative to this container. For " +"locations above or to the left of the grid, ``-1`` is returned for the " +"corresponding coordinate." +msgstr "" + +#: ../../library/tkinter.rst:1294 +msgid "" +"Enable or disable geometry propagation for this container when it manages " +"its children with the grid geometry manager. When *flag* is true, the " +"container resizes itself to fit the requested sizes of its children; when it" +" is false, its size is left under your control. Called with no argument, " +"return the current setting as a boolean." +msgstr "" + +#: ../../library/tkinter.rst:1306 +msgid "" +"Return the size of the grid managed by this container as a ``(columns, " +"rows)`` tuple." +msgstr "" + +#: ../../library/tkinter.rst:1309 +msgid "" +":meth:`size` is an alias of :meth:`!grid_size`, except on the " +":class:`Listbox` widget, which provides its own :meth:`!size` method." +msgstr "" + +#: ../../library/tkinter.rst:1315 +msgid "" +"Return a list of the child widgets managed in this container's grid, most " +"recently managed first. If *row* or *column* is given, only the children in " +"that row or column are returned." +msgstr "" + +#: ../../library/tkinter.rst:1327 +msgid "" +"Enable or disable geometry propagation for this container when it manages " +"its children with the pack geometry manager. When *flag* is true, the " +"container resizes itself to fit the requested sizes of its children; when it" +" is false, its size is left under your control. Called with no argument, " +"return the current setting as a boolean." +msgstr "" + +#: ../../library/tkinter.rst:1334 +msgid ":meth:`propagate` is an alias of :meth:`!pack_propagate`." +msgstr "" + +#: ../../library/tkinter.rst:1341 +msgid "" +"Return a list of the child widgets managed by this container with the pack " +"geometry manager, in packing order." +msgstr "" + +#: ../../library/tkinter.rst:1344 +msgid ":meth:`slaves` is an alias of :meth:`!pack_slaves`." +msgstr "" + +#: ../../library/tkinter.rst:1348 +msgid "" +"Return a list of the child widgets managed by this container with the place " +"geometry manager." +msgstr "" + +#: ../../library/tkinter.rst:1353 +msgid "" +"Bind the event pattern *sequence* on this widget to the callable *func*." +msgstr "" + +#: ../../library/tkinter.rst:1355 +msgid "" +"*sequence* is an event pattern, such as ``''`` (a mouse click) or " +"``''``, optionally a concatenation of several such patterns that" +" must occur shortly after one another. When the event occurs, *func* is " +"called with an :class:`Event` instance describing it as its only argument; " +"if *func* returns the string ``'break'``, no further bindings for the event " +"are invoked." +msgstr "" + +#: ../../library/tkinter.rst:1362 +msgid "" +"If *add* is true, *func* is added to any functions already bound to " +"*sequence*; otherwise it replaces them. The binding applies only to this " +"widget." +msgstr "" + +#: ../../library/tkinter.rst:1366 +msgid "" +":meth:`!bind` returns a string identifier (a *funcid*) that can later be " +"passed to :meth:`unbind` to remove the binding without leaking the " +"associated Tcl command." +msgstr "" + +#: ../../library/tkinter.rst:1370 +msgid "" +"If *func* is omitted, return the binding currently associated with " +"*sequence*; if *sequence* is also omitted, return a list of all the " +"sequences for which bindings exist on this widget." +msgstr "" + +#: ../../library/tkinter.rst:1376 +msgid "" +"Like :meth:`bind`, but bind *func* to the binding tag *className* rather " +"than to a single widget, so that the binding applies to every widget having " +"that tag. *className* is usually the name of a widget class, such as " +"``'Button'``, in which case the binding affects all widgets of that class. " +"The set of binding tags for a widget can be inspected and changed with " +":meth:`bindtags`." +msgstr "" + +#: ../../library/tkinter.rst:1384 ../../library/tkinter.rst:1391 +msgid "The remaining arguments and the return value are as for :meth:`bind`." +msgstr "" + +#: ../../library/tkinter.rst:1388 +msgid "" +"Like :meth:`bind`, but bind *func* to the special binding tag ``'all'``, so " +"that the binding applies to every widget in the application." +msgstr "" + +#: ../../library/tkinter.rst:1395 +msgid "Remove bindings for the event pattern *sequence* on this widget." +msgstr "" + +#: ../../library/tkinter.rst:1397 +msgid "" +"If *funcid* is given, only the function identified by it (a value returned " +"from a previous call to :meth:`bind`) is removed, and its associated Tcl " +"command is deleted. Otherwise all bindings for *sequence* are destroyed, " +"leaving it unbound." +msgstr "" + +#: ../../library/tkinter.rst:1402 +msgid "" +"If *funcid* is given, only that callback is unbound; other callbacks bound " +"to *sequence* are kept." +msgstr "" + +#: ../../library/tkinter.rst:1409 +msgid "" +"Remove all bindings for the event pattern *sequence* from the binding tag " +"*className*. See :meth:`bind_class`." +msgstr "" + +#: ../../library/tkinter.rst:1415 +msgid "" +"Remove all bindings for the event pattern *sequence* from the special " +"binding tag ``'all'``. See :meth:`bind_all`." +msgstr "" + +#: ../../library/tkinter.rst:1421 +msgid "" +"If *tagList* is omitted, return a tuple of the binding tags associated with " +"this widget. When an event occurs in a widget, it is applied to each of the " +"widget's binding tags in order, and for each tag the most specific matching " +"binding is executed. By default a widget has four binding tags: its own " +"pathname, its widget class, the pathname of its nearest toplevel ancestor, " +"and ``'all'``, in that order." +msgstr "" + +#: ../../library/tkinter.rst:1430 +msgid "" +"If *tagList* is given, it must be a sequence of strings; the widget's " +"binding tags are set to its elements, which determines the order in which " +"bindings are evaluated." +msgstr "" + +#: ../../library/tkinter.rst:1434 +msgid "" +"The methods with the ``event_`` prefix define virtual events and generate " +"events programmatically." +msgstr "" + +#: ../../library/tkinter.rst:1439 +msgid "" +"Associate the virtual event *virtual*, whose name has the form " +"``'<>'``, with each of the physical event patterns given by " +"*sequences*, so that the virtual event triggers whenever any of them occurs." +" If *virtual* is already defined, the new sequences are added to its " +"existing ones." +msgstr "" + +#: ../../library/tkinter.rst:1448 +msgid "" +"Remove each of *sequences* from those associated with the virtual event " +"*virtual*. Sequences that are not currently associated with *virtual* are " +"ignored. If no *sequences* are given, all physical event sequences are " +"removed, so that *virtual* no longer triggers." +msgstr "" + +#: ../../library/tkinter.rst:1456 +msgid "" +"Generate the event *sequence* on this widget and arrange for it to be " +"processed just as if it had come from the window system. *sequence* must be " +"a single event pattern, such as ``''`` or ``'<>'``, not a " +"concatenation of several. Keyword arguments specify additional fields of the" +" event, for example *x* and *y* for the pointer position, or *when* to " +"control when the event is processed; refer to the Tk ``event`` manual page " +"for the full list." +msgstr "" + +#: ../../library/tkinter.rst:1466 +msgid "" +"If *virtual* is omitted, return a tuple of all the virtual events that are " +"currently defined. If *virtual* is given, return a tuple of the physical " +"event sequences currently associated with it, or an empty tuple if it is not" +" defined." +msgstr "" + +#: ../../library/tkinter.rst:1471 +msgid "" +"The methods with the ``after`` prefix schedule callbacks to run after a " +"delay or when the application is idle." +msgstr "" + +#: ../../library/tkinter.rst:1476 +msgid "" +"Schedule the callable *func* to be called after *ms* milliseconds, with " +"*args* and *kw* passed to it as positional and keyword arguments. Return an " +"identifier that can be passed to :meth:`after_cancel` to cancel the call." +msgstr "" + +#: ../../library/tkinter.rst:1481 +msgid "" +"If *func* is omitted, sleep for *ms* milliseconds instead, processing no " +"events during that time, and return ``None``." +msgstr "" + +#: ../../library/tkinter.rst:1484 +msgid "*func* can now be any callable object, not only a function." +msgstr "" + +#: ../../library/tkinter.rst:1487 ../../library/tkinter.rst:1512 +msgid "Keyword arguments are now passed to *func*." +msgstr "" + +#: ../../library/tkinter.rst:1493 +msgid "" +"Cancel a callback previously scheduled with :meth:`after` or " +":meth:`after_idle`. *id* must be an identifier returned by one of those " +"methods; passing a value that is not such an identifier raises " +":exc:`ValueError`. If the callback has already run or been cancelled, this " +"has no effect." +msgstr "" + +#: ../../library/tkinter.rst:1499 +msgid "" +"Passing ``None`` (or any false value) as *id* now raises :exc:`ValueError`." +msgstr "" + +#: ../../library/tkinter.rst:1506 +msgid "" +"Schedule the callable *func* to be called, with *args* and *kw* passed to " +"it, when the Tk main loop next becomes idle, that is, when it has no other " +"events to process. Return an identifier that can be passed to " +":meth:`after_cancel` to cancel the call." +msgstr "" + +#: ../../library/tkinter.rst:1518 +msgid "" +"If *id* is omitted, return a tuple of the identifiers of all callbacks " +"currently scheduled with :meth:`after` and :meth:`after_idle` for this " +"interpreter." +msgstr "" + +#: ../../library/tkinter.rst:1522 +msgid "" +"If *id* is given, it must identify a callback that has not yet run or been " +"cancelled, and the return value is a tuple ``(script, type)``, where " +"*script* refers to the function to be called and *type* is either ``'idle'``" +" or ``'timer'``. A :exc:`TclError` is raised if *id* does not exist." +msgstr "" + +#: ../../library/tkinter.rst:1533 +msgid "" +"Enter the Tk event loop, which processes events until all windows are " +"destroyed. This is normally called once, on the root window, to run the " +"application." +msgstr "" + +#: ../../library/tkinter.rst:1539 +msgid "Quit the Tcl interpreter, causing :meth:`mainloop` to return." +msgstr "" + +#: ../../library/tkinter.rst:1543 +msgid "" +"Enter the event loop until all pending events, including idle callbacks, " +"have been processed. This brings the display up to date and handles any " +"events that are already queued, then returns." +msgstr "" + +#: ../../library/tkinter.rst:1550 +msgid "" +"Enter the event loop until all pending idle callbacks have been called. This" +" updates the display of windows, for example after geometry changes, but " +"does not process events caused by the user." +msgstr "" + +#: ../../library/tkinter.rst:1559 +msgid "" +"Wait until the Tcl variable *name* is modified, continuing to process events" +" in the meantime so that the application stays responsive. *name* is usually" +" a :class:`Variable` instance, such as an :class:`IntVar` or " +":class:`StringVar`." +msgstr "" + +#: ../../library/tkinter.rst:1564 +msgid ":meth:`waitvar` is an alias of :meth:`!wait_variable`." +msgstr "" + +#: ../../library/tkinter.rst:1568 +msgid "" +"Wait until *window* is destroyed, continuing to process events in the " +"meantime. If *window* is omitted, this widget is used. This is typically " +"used to wait for the user to finish interacting with a dialog box." +msgstr "" + +#: ../../library/tkinter.rst:1576 +msgid "" +"Wait until the visibility state of *window* changes, for example when it " +"first appears on the screen, continuing to process events in the meantime. " +"If *window* is omitted, this widget is used. This is typically used to wait " +"for a newly created window to become visible before acting on it." +msgstr "" + +#: ../../library/tkinter.rst:1583 +msgid "The methods with the ``focus_`` prefix manage the keyboard focus." +msgstr "" + +#: ../../library/tkinter.rst:1590 +msgid "" +"Direct the keyboard input focus for this widget's display to this widget. If" +" the application does not currently have the input focus on this widget's " +"display, the widget is remembered as the focus window for its top level, and" +" the focus will be redirected to it the next time the window manager gives " +"the focus to the top level. :meth:`focus` is an alias of :meth:`!focus_set`," +" except on the :class:`Canvas` and :class:`ttk.Treeview " +"` widgets, which provide their own :meth:`!focus` " +"method." +msgstr "" + +#: ../../library/tkinter.rst:1602 +msgid "" +"Direct the keyboard input focus to this widget even if the application does " +"not currently have the input focus for the widget's display. This method " +"should be used sparingly, if at all; normally an application should wait for" +" the window manager to give it the focus rather than claiming it." +msgstr "" + +#: ../../library/tkinter.rst:1610 +msgid "" +"Return the widget that currently has the keyboard focus in the application, " +"or ``None`` if no widget in the application has the focus. Use " +":meth:`focus_displayof` to work correctly with several displays." +msgstr "" + +#: ../../library/tkinter.rst:1616 +msgid "" +"Return the widget that currently has the keyboard focus on the display where" +" this widget is located, or ``None`` if no widget in the application has the" +" focus on that display." +msgstr "" + +#: ../../library/tkinter.rst:1622 +msgid "" +"Return the most recent widget to have had the keyboard focus among all the " +"widgets in the same top level as this widget; this is the widget that will " +"receive the focus the next time the window manager gives the focus to the " +"top level. If no widget in that top level has ever had the focus, or if the " +"most recent focus widget has been deleted, the top level itself is returned." +msgstr "" + +#: ../../library/tkinter.rst:1631 +msgid "" +"Reconfigure Tk to use an implicit focus model in which the focus is set to a" +" widget whenever the mouse pointer enters it. This cannot easily be disabled" +" once enabled." +msgstr "" + +#: ../../library/tkinter.rst:1637 +msgid "" +"Return the next widget after this one in the keyboard traversal order, or " +"``None`` if there is none. The traversal order goes first to the next child," +" then recursively to the children of that child, and then to the next " +"sibling higher in the stacking order. A widget is skipped if its " +"``takefocus`` option is set to ``0``. This method is used in the default " +"bindings for the :kbd:`Tab` key." +msgstr "" + +#: ../../library/tkinter.rst:1647 +msgid "" +"Return the previous widget before this one in the keyboard traversal order, " +"or ``None`` if there is none. See :meth:`tk_focusNext` for how the order is " +"defined. This method is used in the default bindings for the :kbd:`Shift-" +"Tab` key." +msgstr "" + +#: ../../library/tkinter.rst:1652 +msgid "" +"The methods with the ``grab_`` prefix set and query the input grab, which " +"directs all input events to a single widget." +msgstr "" + +#: ../../library/tkinter.rst:1657 +msgid "" +"Set a local grab on this widget. A grab confines pointer events to this " +"widget and its descendants: while the pointer is outside the widget's " +"subtree, button presses and releases and pointer motion are reported to the " +"grab widget, and windows outside the subtree become insensitive until the " +"grab is released. A local grab affects only the grabbing application. Any " +"grab previously set by this application on the widget's display is " +"automatically released. Setting a grab is the usual way to make a dialog " +"modal: while the grab is in effect the user cannot interact with the other " +"windows of the application." +msgstr "" + +#: ../../library/tkinter.rst:1671 +msgid "" +"Set a global grab on this widget. A global grab is like the local grab set " +"by :meth:`grab_set`, but it locks out all other applications on the screen, " +"so that only this widget's subtree is sensitive to pointer events, and it " +"also grabs the keyboard. Use with caution: it is easy to render a display " +"unusable with a global grab, since other applications stop receiving events " +"until it is released." +msgstr "" + +#: ../../library/tkinter.rst:1682 +msgid "Release the grab on this widget if there is one; otherwise do nothing." +msgstr "" + +#: ../../library/tkinter.rst:1686 +msgid "" +"Return the widget that currently holds the grab in this application for this" +" widget's display, or ``None`` if there is no such widget." +msgstr "" + +#: ../../library/tkinter.rst:1691 +msgid "" +"Return ``None`` if no grab is currently set on this widget, ``\"local\"`` if" +" a local grab is set, or ``\"global\"`` if a global grab is set." +msgstr "" + +#: ../../library/tkinter.rst:1694 +msgid "" +"The methods with the ``selection_`` prefix retrieve and manage the X " +"selection." +msgstr "" + +#: ../../library/tkinter.rst:1699 +msgid "" +"Clear the X selection, so that no window owns it anymore. The selection to " +"clear is given by the keyword argument *selection*, an atom name such as " +"``'PRIMARY'`` or ``'CLIPBOARD'``; it defaults to ``PRIMARY``. The " +"*displayof* keyword argument names a widget that determines the display on " +"which to operate, and defaults to this widget." +msgstr "" + +#: ../../library/tkinter.rst:1706 +msgid "" +"This is overridden by the :class:`Entry`, :class:`Listbox` and " +":class:`Spinbox` widgets, where :meth:`!selection_clear` clears the widget's" +" own selection instead." +msgstr "" + +#: ../../library/tkinter.rst:1712 +msgid "" +"Return the contents of the current X selection. The keyword argument " +"*selection* names the selection and defaults to ``PRIMARY``. The keyword " +"argument *type* specifies the form in which the data is to be returned (the " +"desired conversion target), an atom name such as ``'STRING'`` or " +"``'FILE_NAME'``; it defaults to ``STRING``, except on X11, where " +"``UTF8_STRING`` is tried first and ``STRING`` is used as a fallback. The " +"*displayof* keyword argument names a widget that determines the display from" +" which to retrieve the selection, and defaults to this widget." +msgstr "" + +#: ../../library/tkinter.rst:1726 +msgid "" +"Register *command* as a handler to supply the X selection owned by this " +"widget when another application requests it. When the selection is " +"retrieved, *command* is called with two arguments, the starting character " +"offset and the maximum number of characters to return, and must return at " +"most that many characters of the selection starting at that offset; for very" +" long selections it is called repeatedly with increasing offsets. The " +"keyword argument *selection* names the selection (default ``PRIMARY``) and " +"the keyword argument *type* gives the form of the selection that the handler" +" supplies (such as ``'STRING'`` or ``'FILE_NAME'``, default ``STRING``)." +msgstr "" + +#: ../../library/tkinter.rst:1740 +msgid "" +"Make this widget the owner of the X selection on its display. The previous " +"owner, if any, is notified that it has lost the selection. The keyword " +"argument *selection* names the selection and defaults to ``PRIMARY``." +msgstr "" + +#: ../../library/tkinter.rst:1747 +msgid "" +"Return the widget in this application that owns the X selection on the " +"display containing this widget, or ``None`` if no widget in this application" +" owns the selection. The keyword argument *selection* names the selection " +"and defaults to ``PRIMARY``. The *displayof* keyword argument names a widget" +" that determines the display to query, and defaults to this widget." +msgstr "" + +#: ../../library/tkinter.rst:1755 +msgid "The methods with the ``clipboard_`` prefix manage the clipboard." +msgstr "" + +#: ../../library/tkinter.rst:1759 +msgid "" +"Append *string* to the Tk clipboard and claim ownership of the clipboard on " +"this widget's display. Before appending, the clipboard should be emptied " +"with :meth:`clipboard_clear`; all appends should be completed before " +"returning to the event loop so that the clipboard is updated atomically. The" +" keyword argument *type* specifies the form of the data, an atom name such " +"as ``'STRING'`` or ``'FILE_NAME'`` (default ``STRING``), and the keyword " +"argument *format* specifies the representation used to transmit it (default " +"``STRING``). The *displayof* keyword argument names a widget that determines" +" the target display, and defaults to this widget. The contents can be " +"retrieved with :meth:`clipboard_get` or :meth:`selection_get`." +msgstr "" + +#: ../../library/tkinter.rst:1775 +msgid "" +"Claim ownership of the clipboard on this widget's display and remove any " +"previous contents. The *displayof* keyword argument names a widget that " +"determines the target display, and defaults to this widget." +msgstr "" + +#: ../../library/tkinter.rst:1782 +msgid "" +"Retrieve data from the clipboard on this widget's display. The keyword " +"argument *type* specifies the form in which the data is to be returned, an " +"atom name such as ``'STRING'`` or ``'FILE_NAME'``; it defaults to " +"``STRING``, except on X11, where ``UTF8_STRING`` is tried first and " +"``STRING`` is used as a fallback. The *displayof* keyword argument names a " +"widget that determines the display, and defaults to the root window of the " +"application. This is equivalent to ``selection_get(selection='CLIPBOARD')``." +msgstr "" + +#: ../../library/tkinter.rst:1791 +msgid "" +"The methods with the ``option_`` prefix query and modify the Tk option " +"database." +msgstr "" + +#: ../../library/tkinter.rst:1796 +msgid "" +"Add an option to the Tk option database that associates *value* with " +"*pattern*. *pattern* consists of names and/or classes separated by asterisks" +" or dots, in the usual X format. *priority* is an integer between 0 and 100," +" or one of the symbolic names ``'widgetDefault'`` (20), ``'startupFile'`` " +"(40), ``'userDefault'`` (60), or ``'interactive'`` (80); it defaults to " +"``interactive``." +msgstr "" + +#: ../../library/tkinter.rst:1806 +msgid "" +"Clear the Tk option database. Default options from the " +":envvar:`!RESOURCE_MANAGER` property or the :file:`.Xdefaults` file are " +"reloaded automatically the next time an option is added to or removed from " +"the database." +msgstr "" + +#: ../../library/tkinter.rst:1813 +msgid "" +"Return the value of the option matching this widget under *name* and " +"*className* from the Tk option database, or an empty string if there is no " +"matching entry. When several entries match, the one with the highest " +"priority is returned, and among entries of equal priority the most recently " +"added one." +msgstr "" + +#: ../../library/tkinter.rst:1822 +msgid "" +"Read the file named *fileName*, which should have the standard format for an" +" X resource database such as :file:`.Xdefaults`, and add all the options it " +"specifies to the Tk option database. *priority* is interpreted as for " +":meth:`option_add` and defaults to ``interactive``." +msgstr "" + +#: ../../library/tkinter.rst:1830 +msgid "" +"Ring the bell on the display for this widget, using the display's current " +"bell-related settings, and reset the screen saver for the screen. If " +"*displayof* is given as a widget, the bell is rung on that widget's display " +"instead." +msgstr "" + +#: ../../library/tkinter.rst:1838 +msgid "" +"Set a new color scheme for all Tk widget elements. Existing widgets are " +"updated and the option database is changed so that future widgets use the " +"new colors. A single color argument is taken as the normal background color," +" from which a complete palette is computed. Alternatively, the arguments may" +" be given as keyword *name*/*value* pairs naming individual options in the " +"option database. The recognized option names are ``activeBackground``, " +"``activeForeground``, ``background``, ``disabledForeground``, " +"``foreground``, ``highlightBackground``, ``highlightColor``, " +"``insertBackground``, ``selectColor``, ``selectBackground``, " +"``selectForeground``, and ``troughColor``; reasonable defaults are computed " +"for any that are not specified." +msgstr "" + +#: ../../library/tkinter.rst:1854 +msgid "" +"Restore the application's colors to the light brown (bisque) color scheme " +"used in Tk 3.6 and earlier versions. Provided for backward compatibility." +msgstr "" + +#: ../../library/tkinter.rst:1860 +msgid "" +"Query or set whether Tk's look and feel should strictly adhere to Motif. A " +"true *boolean* value enables strict Motif compliance (for example, no color " +"change when the mouse passes over a slider). Return the resulting setting." +msgstr "" + +#: ../../library/tkinter.rst:1865 +msgid "" +"The methods with the ``busy_`` prefix manage the busy state of a window, " +"which shows a busy cursor and ignores user input." +msgstr "" + +#: ../../library/tkinter.rst:1879 +msgid "" +"Make this widget appear busy. A transparent window is placed in front of the" +" widget, so that it and all of its descendants in the widget hierarchy are " +"blocked from pointer events and display a busy cursor. Normally " +":meth:`update` should be called immediately afterwards to ensure that the " +"hold operation is in effect before the application starts its processing." +msgstr "" + +#: ../../library/tkinter.rst:1887 +msgid "" +"The only supported configuration option is *cursor*, the cursor to be " +"displayed while the widget is busy; it may have any of the values accepted " +"by :meth:`!configure`." +msgstr "" + +#: ../../library/tkinter.rst:1891 +msgid "" +":meth:`busy_hold`, :meth:`busy` and :meth:`tk_busy` are aliases of " +":meth:`!tk_busy_hold`." +msgstr "" + +#: ../../library/tkinter.rst:1908 +msgid "" +"Query or modify the configuration options of the busy window. The widget " +"must have been previously made busy by :meth:`tk_busy_hold`. With no " +"arguments, return a dictionary describing all of the available options; if " +"*cnf* is the name of an option, return a tuple describing that one option. " +"Otherwise set the given options to the given values. Options may have any of" +" the values accepted by :meth:`tk_busy_hold`." +msgstr "" + +#: ../../library/tkinter.rst:1916 +msgid "" +"The option database is referenced through the widget name or class. For " +"example, if a :class:`Frame` widget named ``frame`` is to be made busy, the " +"busy cursor can be specified for it by either of the calls::" +msgstr "" + +#: ../../library/tkinter.rst:1920 +msgid "" +"w.option_add('*frame.busyCursor', 'gumby')\n" +"w.option_add('*Frame.BusyCursor', 'gumby')" +msgstr "" + +#: ../../library/tkinter.rst:1923 +msgid "" +":meth:`busy_configure`, :meth:`busy_config` and :meth:`tk_busy_config` are " +"aliases of :meth:`!tk_busy_configure`." +msgstr "" + +#: ../../library/tkinter.rst:1934 +msgid "" +"Return the current value of the busy configuration *option*. The widget must" +" have been previously made busy by :meth:`tk_busy_hold`, and *option* may " +"have any of the values accepted by that method." +msgstr "" + +#: ../../library/tkinter.rst:1938 +msgid ":meth:`busy_cget` is an alias of :meth:`!tk_busy_cget`." +msgstr "" + +#: ../../library/tkinter.rst:1948 +msgid "" +"Make this widget no longer busy, releasing the resources (including the " +"transparent window) allocated when it was made busy. User events will again " +"be received by the widget. These resources are also released when the widget" +" is destroyed." +msgstr "" + +#: ../../library/tkinter.rst:1953 +msgid ":meth:`busy_forget` is an alias of :meth:`!tk_busy_forget`." +msgstr "" + +#: ../../library/tkinter.rst:1963 +msgid "Return ``True`` if the widget is currently busy, ``False`` otherwise." +msgstr "" + +#: ../../library/tkinter.rst:1965 +msgid ":meth:`busy_status` is an alias of :meth:`!tk_busy_status`." +msgstr "" + +#: ../../library/tkinter.rst:1975 +msgid "" +"Return a list of widgets that are currently busy. If *pattern* is given, " +"only busy widgets whose path names match the pattern are returned." +msgstr "" + +#: ../../library/tkinter.rst:1979 +msgid ":meth:`busy_current` is an alias of :meth:`!tk_busy_current`." +msgstr "" + +#: ../../library/tkinter.rst:1983 +msgid "" +"The methods with the ``winfo_`` prefix retrieve information about windows " +"managed by Tk." +msgstr "" + +#: ../../library/tkinter.rst:1988 +msgid "" +"Return the integer identifier for the atom whose name is *name*, creating a " +"new atom if none exists. If *displayof* is given, the atom is looked up on " +"the display of that window; otherwise it is looked up on the display of the " +"application's main window." +msgstr "" + +#: ../../library/tkinter.rst:1996 +msgid "" +"Return the textual name for the atom whose integer identifier is *id*. This " +"is the inverse of :meth:`winfo_atom`. If *displayof* is given, the " +"identifier is looked up on the display of that window; otherwise it is " +"looked up on the display of the application's main window." +msgstr "" + +#: ../../library/tkinter.rst:2004 +msgid "Return the number of cells in the colormap for the widget." +msgstr "" + +#: ../../library/tkinter.rst:2008 +msgid "" +"Return a list containing the widgets that are children of the widget, in " +"stacking order from lowest to highest. Toplevel windows are returned as " +"children of their logical parents." +msgstr "" + +#: ../../library/tkinter.rst:2014 +msgid "Return the class name of the widget." +msgstr "" + +#: ../../library/tkinter.rst:2018 +msgid "" +"Return ``True`` if the colormap for the widget is known to be full, " +"``False`` otherwise." +msgstr "" + +#: ../../library/tkinter.rst:2023 +msgid "" +"Return the widget containing the point given by *rootX* and *rootY*, or " +"``None`` if no window in this application contains the point. The " +"coordinates are in screen units in the coordinate system of the root window." +" If *displayof* is given, the coordinates refer to the screen containing " +"that window; otherwise they refer to the screen of the application's main " +"window." +msgstr "" + +#: ../../library/tkinter.rst:2033 +msgid "Return the depth of the widget, that is, the number of bits per pixel." +msgstr "" + +#: ../../library/tkinter.rst:2037 +msgid "Return true if the widget exists, false otherwise." +msgstr "" + +#: ../../library/tkinter.rst:2041 +msgid "" +"Return a floating-point value giving the number of pixels in the widget " +"corresponding to the screen distance *number* (for example, ``\"2.0c\"`` or " +"``\"1i\"``). The result may be fractional; for a rounded integer value use " +":meth:`winfo_pixels`." +msgstr "" + +#: ../../library/tkinter.rst:2049 +msgid "" +"Return the geometry of the widget, in the form ``widthxheight+x+y``. All " +"dimensions are in pixels. An offset can be negative; see " +":meth:`~Wm.geometry`." +msgstr "" + +#: ../../library/tkinter.rst:2055 +msgid "" +"Return the height of the widget in pixels. When a window is first created " +"its height is 1 pixel; it is eventually changed by a geometry manager. See " +"also :meth:`winfo_reqheight`." +msgstr "" + +#: ../../library/tkinter.rst:2062 +msgid "" +"Return a low-level platform-specific identifier for the widget. On Unix this" +" is the X window identifier, and on Windows it is the window handle." +msgstr "" + +#: ../../library/tkinter.rst:2068 +msgid "" +"Return a tuple of the names of all Tcl interpreters currently registered for" +" a particular display. If *displayof* is given, the return value refers to " +"the display of that window; otherwise it refers to the display of the " +"application's main window." +msgstr "" + +#: ../../library/tkinter.rst:2076 +msgid "Return true if the widget is currently mapped, false otherwise." +msgstr "" + +#: ../../library/tkinter.rst:2080 +msgid "" +"Return the name of the geometry manager currently responsible for the " +"widget, or an empty string if it is not managed by any geometry manager." +msgstr "" + +#: ../../library/tkinter.rst:2085 +msgid "" +"Return the widget's name within its parent, as opposed to its full path " +"name." +msgstr "" + +#: ../../library/tkinter.rst:2090 +msgid "" +"Return the path name of the widget's parent, or an empty string if the " +"widget is the main window of the application." +msgstr "" + +#: ../../library/tkinter.rst:2095 +msgid "" +"Return the path name of the window whose identifier is *id*. If *displayof* " +"is given, the identifier is looked up on the display of that window; " +"otherwise it is looked up on the display of the application's main window." +msgstr "" + +#: ../../library/tkinter.rst:2102 +msgid "" +"Return the number of pixels in the widget corresponding to the screen " +"distance *number* (for example, ``\"2.0c\"`` or ``\"1i\"``). The result is " +"rounded to the nearest integer; for a fractional result use " +":meth:`winfo_fpixels`." +msgstr "" + +#: ../../library/tkinter.rst:2109 +msgid "" +"Return the pointer's *x* coordinate, in pixels, relative to the screen's " +"root window (or virtual root, if one is in use). Return ``-1`` if the " +"pointer is not on the same screen as the widget." +msgstr "" + +#: ../../library/tkinter.rst:2115 +msgid "" +"Return the pointer's coordinates as an ``(x, y)`` tuple, in pixels, relative" +" to the screen's root window (or virtual root, if one is in use). Both " +"coordinates are ``-1`` if the pointer is not on the same screen as the " +"widget." +msgstr "" + +#: ../../library/tkinter.rst:2122 +msgid "" +"Return the pointer's *y* coordinate, in pixels, relative to the screen's " +"root window (or virtual root, if one is in use). Return ``-1`` if the " +"pointer is not on the same screen as the widget." +msgstr "" + +#: ../../library/tkinter.rst:2128 +msgid "" +"Return the widget's requested height in pixels. This is the value used by " +"the widget's geometry manager to compute its geometry." +msgstr "" + +#: ../../library/tkinter.rst:2134 +msgid "" +"Return the widget's requested width in pixels. This is the value used by the" +" widget's geometry manager to compute its geometry." +msgstr "" + +#: ../../library/tkinter.rst:2140 +msgid "" +"Return an ``(r, g, b)`` tuple of the red, green, and blue intensities, in " +"the range 0 to 65535, that correspond to *color* in the widget. *color* may " +"be specified in any of the forms acceptable for a color option." +msgstr "" + +#: ../../library/tkinter.rst:2147 +msgid "" +"Return the *x* coordinate, in the root window of the screen, of the upper-" +"left corner of the widget's border (or of the widget itself if it has no " +"border)." +msgstr "" + +#: ../../library/tkinter.rst:2153 +msgid "" +"Return the *y* coordinate, in the root window of the screen, of the upper-" +"left corner of the widget's border (or of the widget itself if it has no " +"border)." +msgstr "" + +#: ../../library/tkinter.rst:2159 +msgid "" +"Return the name of the screen associated with the widget, in the form " +"``displayName.screenIndex``." +msgstr "" + +#: ../../library/tkinter.rst:2164 +msgid "" +"Return the number of cells in the default colormap for the widget's screen." +msgstr "" + +#: ../../library/tkinter.rst:2169 +msgid "" +"Return the depth of the root window of the widget's screen, that is, the " +"number of bits per pixel." +msgstr "" + +#: ../../library/tkinter.rst:2174 +msgid "Return the height of the widget's screen in pixels." +msgstr "" + +#: ../../library/tkinter.rst:2178 +msgid "Return the height of the widget's screen in millimeters." +msgstr "" + +#: ../../library/tkinter.rst:2182 +msgid "Return the width of the widget's screen in millimeters." +msgstr "" + +#: ../../library/tkinter.rst:2186 +msgid "" +"Return the default visual class for the widget's screen, one of " +"``\"directcolor\"``, ``\"grayscale\"``, ``\"pseudocolor\"``, " +"``\"staticcolor\"``, ``\"staticgray\"``, or ``\"truecolor\"``." +msgstr "" + +#: ../../library/tkinter.rst:2192 +msgid "Return the width of the widget's screen in pixels." +msgstr "" + +#: ../../library/tkinter.rst:2196 +msgid "" +"Return a string containing information about the server for the widget's " +"display. The exact format of this string may vary from platform to platform." +msgstr "" + +#: ../../library/tkinter.rst:2202 +msgid "" +"Return the top-of-hierarchy window containing the widget. In standard Tk " +"this is always a :class:`Toplevel` widget." +msgstr "" + +#: ../../library/tkinter.rst:2207 +msgid "" +"Return true if the widget and all of its ancestors up through the nearest " +"toplevel window are mapped, false otherwise." +msgstr "" + +#: ../../library/tkinter.rst:2212 +msgid "" +"Return the visual class for the widget, one of ``\"directcolor\"``, " +"``\"grayscale\"``, ``\"pseudocolor\"``, ``\"staticcolor\"``, " +"``\"staticgray\"``, or ``\"truecolor\"``." +msgstr "" + +#: ../../library/tkinter.rst:2218 +msgid "Return the X identifier for the visual for the widget." +msgstr "" + +#: ../../library/tkinter.rst:2222 +msgid "" +"Return a list describing the visuals available for the widget's screen. Each" +" item consists of a visual class (see :meth:`winfo_visual`) followed by an " +"integer depth. If *includeids* is true, the X identifier for the visual is " +"also included." +msgstr "" + +#: ../../library/tkinter.rst:2230 +msgid "" +"Return the height of the virtual root window associated with the widget if " +"there is one; otherwise return the height of the widget's screen." +msgstr "" + +#: ../../library/tkinter.rst:2235 +msgid "" +"Return the width of the virtual root window associated with the widget if " +"there is one; otherwise return the width of the widget's screen." +msgstr "" + +#: ../../library/tkinter.rst:2240 +msgid "" +"Return the *x* offset of the virtual root window associated with the widget," +" relative to the root window of its screen. This is normally zero or " +"negative, and is ``0`` if there is no virtual root window." +msgstr "" + +#: ../../library/tkinter.rst:2247 +msgid "" +"Return the *y* offset of the virtual root window associated with the widget," +" relative to the root window of its screen. This is normally zero or " +"negative, and is ``0`` if there is no virtual root window." +msgstr "" + +#: ../../library/tkinter.rst:2254 +msgid "" +"Return the width of the widget in pixels. When a window is first created its" +" width is 1 pixel; it is eventually changed by a geometry manager. See also " +":meth:`winfo_reqwidth`." +msgstr "" + +#: ../../library/tkinter.rst:2261 +msgid "" +"Return the *x* coordinate, in the widget's parent, of the upper-left corner " +"of the widget's border (or of the widget itself if it has no border)." +msgstr "" + +#: ../../library/tkinter.rst:2267 +msgid "" +"Return the *y* coordinate, in the widget's parent, of the upper-left corner " +"of the widget's border (or of the widget itself if it has no border)." +msgstr "" + +#: ../../library/tkinter.rst:2273 +msgid "" +"Return the Tcl/Tk patch level as a named tuple with the same five fields as " +":data:`sys.version_info`: *major*, *minor*, *micro*, *releaselevel* and " +"*serial*. *releaselevel* is ``'alpha'``, ``'beta'`` or ``'final'``. " +"Converting it to a string gives the version in the usual Tcl/Tk notation, " +"for example ``'9.0.3'`` for a final release or ``'9.1b2'`` for a pre-" +"release." +msgstr "" + +#: ../../library/tkinter.rst:2287 +msgid "" +"The :class:`!Wm` mixin provides access to the window manager, allowing an " +"application to control such things as the title, geometry and icon of a top-" +"level window, the way it is resized, and how it responds to window manager " +"protocols. It is mixed into :class:`Tk` and :class:`Toplevel`, so its " +"methods are available on every top-level window. Each method has two " +"equivalent spellings: a short name and a ``wm_``-prefixed name (for example," +" :meth:`title` and :meth:`wm_title`). See also :ref:`tkinter-window-" +"manager`." +msgstr "" + +#: ../../library/tkinter.rst:2302 +msgid "" +"Constrain the aspect ratio (the ratio of width to height) of the window. If " +"all four arguments are given, the window manager keeps the ratio between " +"``minNumer/minDenom`` and ``maxNumer/maxDenom``; passing empty strings " +"removes any existing restriction. With no arguments, return a tuple of the " +"four current values, or ``None`` if no aspect restriction is in effect. " +":meth:`wm_aspect` is an alias of :meth:`!aspect`." +msgstr "" + +#: ../../library/tkinter.rst:2315 +msgid "" +"Query or set platform-specific attributes of the window. With no arguments, " +"return the platform-specific flags and their values; pass " +"*return_python_dict* as true to get them as a dictionary. A single option " +"name such as ``'alpha'`` returns the value of that option, and options are " +"set using keyword arguments (``alpha=0.5``)." +msgstr "" + +#: ../../library/tkinter.rst:2321 +msgid "The available attributes differ by platform. All platforms support:" +msgstr "" + +#: ../../library/tkinter.rst:2324 +msgid "*alpha*" +msgstr "" + +#: ../../library/tkinter.rst:2325 +msgid "" +"The window's opacity, from ``0.0`` (fully transparent) to ``1.0`` (opaque). " +"Where transparency is unsupported the value stays at ``1.0``." +msgstr "" + +#: ../../library/tkinter.rst:2329 +msgid "*appearance*" +msgstr "" + +#: ../../library/tkinter.rst:2330 +msgid "" +"Whether the window is rendered in dark mode on Windows and macOS: " +"``'auto'``, ``'light'`` or ``'dark'`` (this has no effect on X11)." +msgstr "" + +#: ../../library/tkinter.rst:2333 +msgid "*fullscreen*" +msgstr "" + +#: ../../library/tkinter.rst:2334 +msgid "Whether the window takes up the entire screen and has no borders." +msgstr "" + +#: ../../library/tkinter.rst:2336 +msgid "*topmost*" +msgstr "" + +#: ../../library/tkinter.rst:2337 +msgid "Whether the window is displayed above all other windows." +msgstr "" + +#: ../../library/tkinter.rst:2339 +msgid "Windows additionally supports:" +msgstr "" + +#: ../../library/tkinter.rst:2341 +msgid "*disabled*" +msgstr "" + +#: ../../library/tkinter.rst:2342 +msgid "Whether the window is in a disabled state." +msgstr "" + +#: ../../library/tkinter.rst:2344 +msgid "*toolwindow*" +msgstr "" + +#: ../../library/tkinter.rst:2345 +msgid "Whether the window uses the tool window style." +msgstr "" + +#: ../../library/tkinter.rst:2347 +msgid "*transparentcolor*" +msgstr "" + +#: ../../library/tkinter.rst:2348 +msgid "The color that is made fully transparent, or an empty string for none." +msgstr "" + +#: ../../library/tkinter.rst:2350 +msgid "macOS additionally supports:" +msgstr "" + +#: ../../library/tkinter.rst:2352 +msgid "*class*" +msgstr "" + +#: ../../library/tkinter.rst:2353 +msgid "" +"Whether the underlying Aqua window is an ``nswindow`` or an ``nspanel``; " +"this can only be set before the window is created." +msgstr "" + +#: ../../library/tkinter.rst:2356 +msgid "*modified*" +msgstr "" + +#: ../../library/tkinter.rst:2357 +msgid "" +"The modification state shown by the window's close button and proxy icon." +msgstr "" + +#: ../../library/tkinter.rst:2360 +msgid "*notify*" +msgstr "" + +#: ../../library/tkinter.rst:2361 +msgid "Whether the application's dock icon bounces to request attention." +msgstr "" + +#: ../../library/tkinter.rst:2363 +msgid "*stylemask*" +msgstr "" + +#: ../../library/tkinter.rst:2364 +msgid "" +"The style mask of the underlying Aqua window, given as a list of bit names " +"such as ``titled`` or ``resizable``." +msgstr "" + +#: ../../library/tkinter.rst:2367 +msgid "*tabbingid*" +msgstr "" + +#: ../../library/tkinter.rst:2368 +msgid "The identifier of the tab group that the window belongs to." +msgstr "" + +#: ../../library/tkinter.rst:2370 +msgid "*tabbingmode*" +msgstr "" + +#: ../../library/tkinter.rst:2371 +msgid "" +"Whether the window may be opened as a tab: ``'auto'``, ``'preferred'`` or " +"``'disallowed'``." +msgstr "" + +#: ../../library/tkinter.rst:2374 +msgid "*titlepath*" +msgstr "" + +#: ../../library/tkinter.rst:2375 +msgid "The path of the file represented by the window's proxy icon." +msgstr "" + +#: ../../library/tkinter.rst:2377 +msgid "*transparent*" +msgstr "" + +#: ../../library/tkinter.rst:2378 +msgid "" +"Whether the content area is transparent and the window shadow is turned off." +msgstr "" + +#: ../../library/tkinter.rst:2381 +msgid "X11 additionally supports:" +msgstr "" + +#: ../../library/tkinter.rst:2383 +msgid "*type*" +msgstr "" + +#: ../../library/tkinter.rst:2384 +msgid "" +"The window type, or a list of types in order of preference, that the window " +"manager should use to interpret the window, such as ``'dialog'`` or " +"``'splash'``." +msgstr "" + +#: ../../library/tkinter.rst:2388 +msgid "*zoomed*" +msgstr "" + +#: ../../library/tkinter.rst:2389 +msgid "Whether the window is maximized." +msgstr "" + +#: ../../library/tkinter.rst:2393 +msgid "" +"Tk 8.6 added the *type* attribute, and Tk 9.0 added the *appearance*, " +"*class*, *stylemask*, *tabbingid* and *tabbingmode* attributes." +msgstr "" + +#: ../../library/tkinter.rst:2396 +msgid "" +"On X11 changes are applied asynchronously, so a queried value may not yet " +"reflect the most recent request. :meth:`wm_attributes` is an alias of " +":meth:`!attributes`." +msgstr "" + +#: ../../library/tkinter.rst:2400 +msgid "" +"A single attribute may now be queried by name without the leading ``-``, and" +" attributes may be set using keyword arguments. The *return_python_dict* " +"parameter was added." +msgstr "" + +#: ../../library/tkinter.rst:2405 +msgid "" +"Setting an attribute by passing the option name (with a leading ``-``) and " +"its value as two positional arguments, as in ``w.attributes('-alpha', " +"0.5)``, is deprecated; use keyword arguments instead." +msgstr "" + +#: ../../library/tkinter.rst:2417 +msgid "" +"Store *name*, which should be the name of the host on which the application " +"is running, in the window's ``WM_CLIENT_MACHINE`` property for use by the " +"window or session manager. An empty string deletes the property. With no " +"argument, return the last name set, or an empty string. :meth:`wm_client` is" +" an alias of :meth:`!client`." +msgstr "" + +#: ../../library/tkinter.rst:2429 +msgid "" +"Manipulate the ``WM_COLORMAP_WINDOWS`` property, which tells the window " +"manager about windows that have private colormaps. If *wlist* is given, " +"overwrite the property with those windows (their order is a priority order " +"for installing colormaps). With no arguments, return the list of windows " +"currently named in the property. :meth:`wm_colormapwindows` is an alias of " +":meth:`!colormapwindows`." +msgstr "" + +#: ../../library/tkinter.rst:2442 +msgid "" +"Store *value* in the window's ``WM_COMMAND`` property for use by the window " +"or session manager; it should be a list giving the words of the command used" +" to invoke the application. An empty string deletes the property. With no " +"argument, return the last value set, or an empty string. :meth:`wm_command` " +"is an alias of :meth:`!command`." +msgstr "" + +#: ../../library/tkinter.rst:2454 +msgid "" +"Display the window in normal (non-iconified) form by mapping it. If the " +"window has never been mapped, this ensures it appears de-iconified when it " +"is first mapped. On Windows the window is also raised and given the focus. " +":meth:`wm_deiconify` is an alias of :meth:`!deiconify`." +msgstr "" + +#: ../../library/tkinter.rst:2465 +msgid "" +"Set or query the focus model for the window. *model* is either ``'active'`` " +"(the window claims the input focus for itself or its descendants, even when " +"the focus is in another application) or ``'passive'`` (the window relies on " +"the window manager to give it the focus). With no argument, return the " +"current model. The default is ``'passive'``, which is what the " +":meth:`!focus` command assumes. :meth:`wm_focusmodel` is an alias of " +":meth:`!focusmodel`." +msgstr "" + +#: ../../library/tkinter.rst:2480 +msgid "" +"Unmap *window* from the screen so that it is no longer managed by the window" +" manager. A :class:`Toplevel` is then treated like a :class:`Frame`, " +"although its ``-menu`` configuration is remembered and the menu reappears if" +" the widget is managed again. :meth:`wm_forget` is an alias of " +":meth:`!forget`." +msgstr "" + +#: ../../library/tkinter.rst:2487 +msgid "Not to be confused with :meth:`Pack.forget`." +msgstr "" + +#: ../../library/tkinter.rst:2496 +msgid "" +"Return the platform-specific window identifier for the outermost decorative " +"frame containing the window, if the window manager has reparented it into " +"such a frame; otherwise return the identifier of the window itself. " +":meth:`wm_frame` is an alias of :meth:`!frame`." +msgstr "" + +#: ../../library/tkinter.rst:2507 +msgid "" +"Set or query the geometry of the window. *newGeometry* has the form " +"``=widthxheight+x+y``, where any of ``=``, ``widthxheight`` and the ``+x+y``" +" position may be omitted. *width* and *height* are in pixels (or grid units " +"for a gridded window); a position preceded by ``+`` is measured from the " +"left or top edge of the screen and one preceded by ``-`` from the right or " +"bottom edge. An offset can be negative, as in ``'200x100+-9+-8'``, when the " +"window edge is positioned beyond the corresponding screen edge. An empty " +"string cancels any user-specified geometry, letting the window revert to its" +" natural size. With no argument, return the current geometry as a string of " +"the form ``'200x200+10+10'``. :meth:`wm_geometry` is an alias of " +":meth:`!geometry`." +msgstr "" + +#: ../../library/tkinter.rst:2526 +msgid "" +"Manage the window as a gridded window and define the relationship between " +"grid units and pixels. *baseWidth* and *baseHeight* are the numbers of grid " +"units for the window's internally requested size, and *widthInc* and " +"*heightInc* are the pixel sizes of a horizontal and vertical grid unit. " +"Empty strings turn off gridded management. With no arguments, return a tuple" +" of the four current values, or ``None`` if the window is not gridded. " +":meth:`wm_grid` is an alias of :meth:`!grid`." +msgstr "" + +#: ../../library/tkinter.rst:2536 +msgid "Not to be confused with the grid geometry manager :meth:`Grid.grid`." +msgstr "" + +#: ../../library/tkinter.rst:2543 +msgid "" +"Set or query the leader of a group of related windows. *pathName* gives the " +"path name of the group leader; the window manager may, for example, unmap " +"all windows in the group when the leader is iconified. An empty string " +"removes the window from any group. With no argument, return the path name of" +" the current group leader, or an empty string. :meth:`wm_group` is an alias " +"of :meth:`!group`." +msgstr "" + +#: ../../library/tkinter.rst:2557 +msgid "" +"Set or query the bitmap used by the window manager for the window's icon. " +"*bitmap* names a bitmap in one of the standard forms accepted by Tk; an " +"empty string cancels the current icon bitmap. With no argument, return the " +"name of the current icon bitmap, or an empty string. On Windows the " +"*default* argument names an icon (for example an ``.ico`` file) applied to " +"all top-level windows that have no icon of their own. :meth:`wm_iconbitmap` " +"is an alias of :meth:`!iconbitmap`." +msgstr "" + +#: ../../library/tkinter.rst:2571 +msgid "" +"Iconify the window. If the window has not yet been mapped for the first " +"time, arrange for it to appear in the iconified state when it is eventually " +"mapped. :meth:`wm_iconify` is an alias of :meth:`!iconify`." +msgstr "" + +#: ../../library/tkinter.rst:2581 +msgid "" +"Set or query the bitmap used as a mask for the icon (see " +":meth:`iconbitmap`). Where the mask is zero no icon is displayed; where it " +"is one, the corresponding bits of the icon bitmap are shown. An empty string" +" cancels the current mask. With no argument, return the name of the current " +"icon mask, or an empty string. :meth:`wm_iconmask` is an alias of " +":meth:`!iconmask`." +msgstr "" + +#: ../../library/tkinter.rst:2595 +msgid "" +"Set or query the name displayed by the window manager inside the window's " +"icon. With no argument, return the current icon name, or an empty string if " +"none has been set (in which case the window manager normally displays the " +"window's title). :meth:`wm_iconname` is an alias of :meth:`!iconname`." +msgstr "" + +#: ../../library/tkinter.rst:2607 +msgid "" +"Set the titlebar icon for the window from one or more :class:`PhotoImage` " +"objects given in *images*. Several images of different sizes (for example " +"16x16 and 32x32) may be supplied so that the window manager can choose an " +"appropriate one. The image data is taken as a snapshot at the time of the " +"call; later changes to the images are not reflected. If *default* is true, " +"the icon is also applied to all top-level windows created in the future. On " +"macOS only the first image is used. :meth:`wm_iconphoto` is an alias of " +":meth:`!iconphoto`." +msgstr "" + +#: ../../library/tkinter.rst:2625 +msgid "" +"Set or query a hint to the window manager about where the window's icon " +"should be positioned. Empty strings cancel an existing hint. With no " +"arguments, return a tuple of the two current values, or ``None`` if no hint " +"is in effect. :meth:`wm_iconposition` is an alias of :meth:`!iconposition`." +msgstr "" + +#: ../../library/tkinter.rst:2637 +msgid "" +"Set or query the window used as the icon for the window. When the window is " +"iconified, *pathName* is mapped to serve as its icon and unmapped again when" +" it is de-iconified. An empty string cancels the association. With no " +"argument, return the path name of the current icon window, or an empty " +"string. Not all window managers support icon windows, and the concept is " +"meaningless on non-X11 platforms. :meth:`wm_iconwindow` is an alias of " +":meth:`!iconwindow`." +msgstr "" + +#: ../../library/tkinter.rst:2652 +msgid "" +"Make *widget* a stand-alone top-level window, decorated by the window " +"manager with a title bar and so on. Only :class:`Frame`, :class:`LabelFrame`" +" and :class:`Toplevel` widgets may be used (the :mod:`tkinter.ttk` versions " +"are **not** accepted); passing any other widget type raises an error. " +":meth:`wm_manage` is an alias of :meth:`!manage`." +msgstr "" + +#: ../../library/tkinter.rst:2666 +msgid "" +"Set or query the maximum permissible dimensions of the window, in pixels (or" +" grid units for a gridded window). The window manager restricts the window " +"to be no larger than *width* and *height*. With no arguments, return a tuple" +" of the current maximum width and height. The maximum size defaults to the " +"size of the screen. :meth:`wm_maxsize` is an alias of :meth:`!maxsize`." +msgstr "" + +#: ../../library/tkinter.rst:2680 +msgid "" +"Set or query the minimum permissible dimensions of the window, in pixels (or" +" grid units for a gridded window). The window manager restricts the window " +"to be no smaller than *width* and *height*. With no arguments, return a " +"tuple of the current minimum width and height. The minimum size defaults to " +"one pixel in each dimension. :meth:`wm_minsize` is an alias of " +":meth:`!minsize`." +msgstr "" + +#: ../../library/tkinter.rst:2694 +msgid "" +"Set or query the override-redirect flag for the window. When this flag is " +"set, the window is ignored by the window manager: it is not reparented into " +"a decorative frame and the user cannot manipulate it through the usual " +"window manager controls. With no argument, return a boolean indicating " +"whether the flag is set, or ``None`` if it has not been set. The flag is " +"reliably honored only when the window is first mapped or remapped from the " +"withdrawn state. :meth:`wm_overrideredirect` is an alias of " +":meth:`!overrideredirect`." +msgstr "" + +#: ../../library/tkinter.rst:2709 +msgid "" +"Set or query the source of the window's current position. *who* is either " +"``'program'`` or ``'user'`` and indicates whether the position was requested" +" by the program or by the user; an empty string cancels the current source. " +"With no argument, return the current source, or an empty string if none has " +"been set. Tk automatically sets the source to ``'user'`` when " +":meth:`geometry` is called, unless it has been set explicitly to " +"``'program'``. :meth:`wm_positionfrom` is an alias of :meth:`!positionfrom`." +msgstr "" + +#: ../../library/tkinter.rst:2724 +msgid "" +"Register *func* as the handler for the window manager protocol *name*, an " +"atom such as ``'WM_DELETE_WINDOW'``, ``'WM_SAVE_YOURSELF'`` or " +"``'WM_TAKE_FOCUS'``; *func* is then called whenever the window manager sends" +" a message of that protocol. Tk installs a default ``WM_DELETE_WINDOW`` " +"handler that destroys the window, which this method can replace. If *func* " +"is an empty string, the handler is removed. With only *name*, return the " +"name of its registered handler command, or an empty string if none is set " +"(the default ``WM_DELETE_WINDOW`` handler is not reported); with no " +"arguments, return a tuple of the protocols that currently have handlers. " +":meth:`wm_protocol` is an alias of :meth:`!protocol`." +msgstr "" + +#: ../../library/tkinter.rst:2742 +msgid "" +"Control whether the user may interactively resize the window. *width* and " +"*height* are boolean values that determine whether the window's width and " +"height may be changed. With no arguments, return a tuple of two ``0``/``1`` " +"values indicating whether each dimension is currently resizable. By default " +"a window is resizable in both dimensions. :meth:`wm_resizable` is an alias " +"of :meth:`!resizable`." +msgstr "" + +#: ../../library/tkinter.rst:2755 +msgid "" +"Set or query the source of the window's current size. *who* is either " +"``'program'`` or ``'user'`` and indicates whether the size was requested by " +"the program or by the user; an empty string cancels the current source. With" +" no argument, return the current source, or an empty string if none has been" +" set. :meth:`wm_sizefrom` is an alias of :meth:`!sizefrom`." +msgstr "" + +#: ../../library/tkinter.rst:2768 +msgid "" +"Set or query the state of the window. With no argument, return the current " +"state: one of ``'normal'``, ``'iconic'``, ``'withdrawn'``, ``'icon'`` or, on" +" Windows and macOS only, ``'zoomed'``. ``'iconic'`` refers to a window that " +"has been iconified, while ``'icon'`` refers to a window serving as the icon " +"for another window (see :meth:`iconwindow`); the ``'icon'`` state cannot be " +"set. :meth:`wm_state` is an alias of :meth:`!state`." +msgstr "" + +#: ../../library/tkinter.rst:2777 +msgid "" +"Not to be confused with :meth:`ttk.Widget.state `." +msgstr "" + +#: ../../library/tkinter.rst:2785 +msgid "" +"Set or query the title for the window, which the window manager should " +"display in the window's title bar. With no argument, return the current " +"title. The title defaults to the window's name. :meth:`wm_title` is an alias" +" of :meth:`!title`." +msgstr "" + +#: ../../library/tkinter.rst:2796 +msgid "" +"Mark the window as a transient window (such as a pull-down menu or dialog) " +"working on behalf of *master*, the path name of another top-level window. An" +" empty string clears the transient status. With no argument, return the path" +" name of the current master, or an empty string. A transient window mirrors " +"state changes in its master and may be decorated differently by the window " +"manager; it is an error to make a window a transient of itself. " +":meth:`wm_transient` is an alias of :meth:`!transient`." +msgstr "" + +#: ../../library/tkinter.rst:2812 +msgid "" +"Withdraw the window from the screen, unmapping it and causing the window " +"manager to forget about it. If the window has never been mapped, it is " +"instead mapped in the withdrawn state. It is sometimes necessary to withdraw" +" a window and then re-map it (for example with :meth:`deiconify`) to make " +"some window managers notice changes to window attributes. " +":meth:`wm_withdraw` is an alias of :meth:`!withdraw`." +msgstr "" + +#: ../../library/tkinter.rst:2824 +msgid "" +"Geometry manager that arranges widgets by packing them against the sides of " +"their container. The :class:`!Pack` mix-in is inherited by all widgets " +"(through :class:`Widget`) and provides the methods for managing a widget " +"with the *pack* geometry manager. See also :ref:`tkinter-geometry-" +"management`." +msgstr "" + +#: ../../library/tkinter.rst:2833 +msgid "" +":class:`Pack`, :class:`Place` and :class:`Grid` all define the short method " +"names :meth:`!forget`, :meth:`!info`, :meth:`!slaves`, :meth:`!content` and " +":meth:`!propagate`. On a widget the bare names resolve to the *pack* " +"manager's versions, since :class:`Pack` and :class:`Misc` precede " +":class:`Place` and :class:`Grid` in the method resolution order, whatever " +"manager actually manages the widget; and :meth:`!configure`/:meth:`!config` " +"configure the widget's options, not its geometry. Use the explicit " +"``pack_*``, ``grid_*`` and ``place_*`` methods (and ``pack``, ``grid``, " +"``place`` for geometry configuration) to act on a specific geometry manager." +msgstr "" + +#: ../../library/tkinter.rst:2855 +msgid "" +"Pack the widget inside its container, positioning it relative to the " +"siblings already packed there. The supported options are:" +msgstr "" + +#: ../../library/tkinter.rst:2859 +msgid "*side*" +msgstr "" + +#: ../../library/tkinter.rst:2860 +msgid "" +"Which side of the container to pack the widget against: ``'top'`` (the " +"default), ``'bottom'``, ``'left'`` or ``'right'``." +msgstr "" + +#: ../../library/tkinter.rst:2863 ../../library/tkinter.rst:3487 +msgid "*fill*" +msgstr "" + +#: ../../library/tkinter.rst:2864 +msgid "" +"Whether to stretch the widget to fill its parcel: ``'none'`` (the default), " +"``'x'``, ``'y'`` or ``'both'``." +msgstr "" + +#: ../../library/tkinter.rst:2867 +msgid "*expand*" +msgstr "" + +#: ../../library/tkinter.rst:2868 +msgid "" +"Whether the widget should expand to consume any extra space in its container" +" (a boolean, default false)." +msgstr "" + +#: ../../library/tkinter.rst:2871 ../../library/tkinter.rst:2977 +#: ../../library/tkinter.rst:3597 ../../library/tkinter.rst:3616 +#: ../../library/tkinter.rst:3631 ../../library/tkinter.rst:3644 +msgid "*anchor*" +msgstr "" + +#: ../../library/tkinter.rst:2872 +msgid "" +"Where to position the widget in its parcel when the parcel is larger than " +"the widget: an anchor such as ``'n'`` or ``'sw'`` (default ``'center'``)." +msgstr "" + +#: ../../library/tkinter.rst:2876 ../../library/tkinter.rst:3071 +msgid "*ipadx*, *ipady*" +msgstr "" + +#: ../../library/tkinter.rst:2877 ../../library/tkinter.rst:3072 +msgid "" +"Internal padding added on the left and right (*ipadx*) or top and bottom " +"(*ipady*) of the widget, as a screen distance (default ``0``)." +msgstr "" + +#: ../../library/tkinter.rst:2880 ../../library/tkinter.rst:3075 +msgid "*padx*, *pady*" +msgstr "" + +#: ../../library/tkinter.rst:2881 ../../library/tkinter.rst:3076 +msgid "" +"External padding left on the left and right (*padx*) or top and bottom " +"(*pady*) of the widget, as a screen distance or a pair of two distances for " +"the two sides (default ``0``)." +msgstr "" + +#: ../../library/tkinter.rst:2885 +msgid "*after*" +msgstr "" + +#: ../../library/tkinter.rst:2886 +msgid "" +"Pack the widget after the given widget in the packing order, using the same " +"container." +msgstr "" + +#: ../../library/tkinter.rst:2889 +msgid "*before*" +msgstr "" + +#: ../../library/tkinter.rst:2890 +msgid "" +"Pack the widget before the given widget in the packing order, using the same" +" container." +msgstr "" + +#: ../../library/tkinter.rst:2893 ../../library/tkinter.rst:2997 +#: ../../library/tkinter.rst:3080 +msgid "*in_*" +msgstr "" + +#: ../../library/tkinter.rst:2894 +msgid "" +"The container in which to pack the widget; it defaults to the parent widget." +msgstr "" + +#: ../../library/tkinter.rst:2897 +msgid "" +":meth:`pack`, :meth:`configure` and :meth:`config` are aliases of " +":meth:`!pack_configure`." +msgstr "" + +#: ../../library/tkinter.rst:2905 +msgid "" +"Unmap the widget and remove it from the packing order, forgetting its " +"packing options. It can be packed again later with :meth:`pack_configure`. " +":meth:`forget` is an alias of :meth:`!pack_forget`, except on " +":class:`PanedWindow`, :class:`ttk.Notebook ` and " +":class:`ttk.PanedWindow `, which provide their own " +":meth:`!forget` method." +msgstr "" + +#: ../../library/tkinter.rst:2914 +msgid "Not to be confused with :meth:`Wm.forget`." +msgstr "" + +#: ../../library/tkinter.rst:2921 +msgid "" +"Return a dictionary of the widget's current packing options. :meth:`info` is" +" an alias of :meth:`!pack_info`." +msgstr "" + +#: ../../library/tkinter.rst:2931 +msgid "" +"Same as :meth:`Misc.pack_propagate`, treating this widget as a container: " +"enable or disable geometry propagation. :meth:`propagate` is an alias of " +":meth:`!pack_propagate`." +msgstr "" + +#: ../../library/tkinter.rst:2940 +msgid "" +"Same as :meth:`Misc.pack_slaves`: return the list of widgets packed in this " +"widget. :meth:`slaves` is an alias of :meth:`!pack_slaves`." +msgstr "" + +#: ../../library/tkinter.rst:2947 +msgid "" +"Geometry manager that places widgets at explicit positions and sizes within " +"their container. The :class:`!Place` mix-in is inherited by all widgets " +"(through :class:`Widget`). See also :ref:`tkinter-geometry-management`." +msgstr "" + +#: ../../library/tkinter.rst:2962 +msgid "" +"Place the widget inside its container at an absolute or relative position. " +"The supported options are:" +msgstr "" + +#: ../../library/tkinter.rst:2966 +msgid "*x*, *y*" +msgstr "" + +#: ../../library/tkinter.rst:2967 +msgid "" +"The absolute horizontal and vertical position of the widget's anchor point, " +"as a screen distance (default ``0``)." +msgstr "" + +#: ../../library/tkinter.rst:2970 +msgid "*relx*, *rely*" +msgstr "" + +#: ../../library/tkinter.rst:2971 +msgid "" +"The horizontal and vertical position of the widget's anchor point as a " +"fraction of the container's width and height, where ``0.0`` is the left or " +"top edge and ``1.0`` is the right or bottom edge. If both the absolute and " +"the relative option are given, their values are summed." +msgstr "" + +#: ../../library/tkinter.rst:2978 +msgid "" +"Which point of the widget is placed at the given position: an anchor such as" +" ``'n'`` or ``'se'`` (default ``'nw'``)." +msgstr "" + +#: ../../library/tkinter.rst:2981 ../../library/tkinter.rst:3647 +msgid "*width*, *height*" +msgstr "" + +#: ../../library/tkinter.rst:2982 +msgid "" +"The absolute width and height of the widget, as a screen distance. By " +"default the widget's requested size is used." +msgstr "" + +#: ../../library/tkinter.rst:2985 +msgid "*relwidth*, *relheight*" +msgstr "" + +#: ../../library/tkinter.rst:2986 +msgid "" +"The width and height of the widget as a fraction of the container's width " +"and height. If both the absolute and the relative option are given, their " +"values are summed." +msgstr "" + +#: ../../library/tkinter.rst:2991 +msgid "*bordermode*" +msgstr "" + +#: ../../library/tkinter.rst:2992 +msgid "" +"How the container's border affects placement: ``'inside'`` (the default) " +"measures the area inside the border, ``'outside'`` measures the area " +"including the border, and ``'ignore'`` uses the official X area." +msgstr "" + +#: ../../library/tkinter.rst:2998 +msgid "" +"The container relative to which the widget is placed; it must be the " +"widget's parent or a descendant of the parent, and defaults to the parent." +msgstr "" + +#: ../../library/tkinter.rst:3002 +msgid "" +":meth:`place`, :meth:`configure` and :meth:`config` are aliases of " +":meth:`!place_configure`." +msgstr "" + +#: ../../library/tkinter.rst:3010 +msgid "" +"Unmap the widget and remove it from the placement, forgetting its place " +"options." +msgstr "" + +#: ../../library/tkinter.rst:3018 +msgid "Return a dictionary of the widget's current place options." +msgstr "" + +#: ../../library/tkinter.rst:3025 +msgid "" +"Same as :meth:`Misc.place_slaves`: return the list of widgets placed in this" +" widget." +msgstr "" + +#: ../../library/tkinter.rst:3031 +msgid "" +"Geometry manager that arranges widgets in a two-dimensional grid of rows and" +" columns within their container. The :class:`!Grid` mix-in is inherited by " +"all widgets (through :class:`Widget`). See also :ref:`tkinter-geometry-" +"management`." +msgstr "" + +#: ../../library/tkinter.rst:3046 +msgid "Position the widget in a cell of its container's grid." +msgstr "" + +#: ../../library/tkinter.rst:3048 +msgid "Not to be confused with :meth:`Wm.grid`." +msgstr "" + +#: ../../library/tkinter.rst:3050 +msgid "The supported options are:" +msgstr "" + +#: ../../library/tkinter.rst:3052 +msgid "*row*, *column*" +msgstr "" + +#: ../../library/tkinter.rst:3053 +msgid "" +"The row and column of the cell to place the widget in, counting from ``0``. " +"*column* defaults to the column after the previous widget placed in the same" +" :meth:`!grid_configure` call (or ``0``), and *row* defaults to the next " +"empty row." +msgstr "" + +#: ../../library/tkinter.rst:3059 +msgid "*rowspan*, *columnspan*" +msgstr "" + +#: ../../library/tkinter.rst:3060 +msgid "The number of rows and columns the widget should span (default ``1``)." +msgstr "" + +#: ../../library/tkinter.rst:3062 +msgid "*sticky*" +msgstr "" + +#: ../../library/tkinter.rst:3063 +msgid "" +"How to position or stretch the widget when its cell is larger than the " +"widget: a string containing zero or more of the characters ``'n'``, ``'s'``," +" ``'e'`` and ``'w'``, naming the cell sides the widget sticks to. Specifying" +" both ``'n'`` and ``'s'`` (or ``'e'`` and ``'w'``) stretches the widget to " +"fill the height (or width) of the cell. The default is ``''``, which centers" +" the widget at its requested size." +msgstr "" + +#: ../../library/tkinter.rst:3081 +msgid "" +"The container in whose grid to place the widget; it defaults to the parent " +"widget." +msgstr "" + +#: ../../library/tkinter.rst:3084 +msgid "" +":meth:`grid`, :meth:`configure` and :meth:`config` are aliases of " +":meth:`!grid_configure`." +msgstr "" + +#: ../../library/tkinter.rst:3092 +msgid "" +"Unmap the widget and remove it from the grid, forgetting its grid options." +msgstr "" + +#: ../../library/tkinter.rst:3097 +msgid "" +"Unmap the widget and remove it from the grid, but remember its grid options " +"so that it is restored to the same cell if it is gridded again." +msgstr "" + +#: ../../library/tkinter.rst:3105 +msgid "Return a dictionary of the widget's current grid options." +msgstr "" + +#: ../../library/tkinter.rst:3112 +msgid "" +"Same as :meth:`Misc.grid_bbox`. :meth:`bbox` is an alias of " +":meth:`!grid_bbox`, except on :class:`Canvas`, :class:`Listbox`, " +":class:`Spinbox`, :class:`Text`, :class:`ttk.Entry ` and " +":class:`ttk.Treeview `, which provide their own " +":meth:`!bbox` method." +msgstr "" + +#: ../../library/tkinter.rst:3124 +msgid "" +"Same as :meth:`Misc.grid_columnconfigure`: query or set the options (such as" +" *weight*, *minsize*, *pad* and *uniform*) of a grid column. " +":meth:`columnconfigure` is an alias of :meth:`!grid_columnconfigure`." +msgstr "" + +#: ../../library/tkinter.rst:3133 +msgid "" +"Same as :meth:`Misc.grid_rowconfigure`: query or set the options of a grid " +"row. :meth:`rowconfigure` is an alias of :meth:`!grid_rowconfigure`." +msgstr "" + +#: ../../library/tkinter.rst:3142 +msgid "" +"Same as :meth:`Misc.grid_location`: return the ``(column, row)`` of the cell" +" that covers the pixel at *x*, *y*. :meth:`location` is an alias of " +":meth:`!grid_location`." +msgstr "" + +#: ../../library/tkinter.rst:3151 +msgid "" +"Same as :meth:`Misc.grid_size`: return a ``(columns, rows)`` tuple giving " +"the size of the grid. :meth:`size` is an alias of :meth:`!grid_size`, except" +" on the :class:`Listbox` widget, which provides its own :meth:`!size` " +"method." +msgstr "" + +#: ../../library/tkinter.rst:3164 +msgid "Same as :meth:`Misc.grid_propagate`." +msgstr "" + +#: ../../library/tkinter.rst:3171 +msgid "" +"Same as :meth:`Misc.grid_slaves`: return the widgets managed in the grid, " +"optionally restricted to a *row* and/or *column*." +msgstr "" + +#: ../../library/tkinter.rst:3177 +msgid "" +"Mix-in providing the horizontal-scrolling interface shared by widgets such " +"as :class:`Entry`, :class:`Canvas`, :class:`Listbox`, :class:`Text` and " +":class:`Spinbox`. A widget's :meth:`xview` method is registered as the " +"*command* of a horizontal :class:`Scrollbar`." +msgstr "" + +#: ../../library/tkinter.rst:3185 +msgid "" +"Query or change the horizontal position of the view. With no arguments, " +"return a tuple ``(first, last)`` of two fractions between 0 and 1 giving the" +" portion of the document that is currently visible. Otherwise the arguments " +"are passed to the Tk ``xview`` widget command and are usually generated by a" +" scrollbar; :meth:`xview_moveto` and :meth:`xview_scroll` provide a more " +"convenient interface." +msgstr "" + +#: ../../library/tkinter.rst:3195 +msgid "" +"Adjust the view so that *fraction* of the total width of the document is " +"off-screen to the left. *fraction* is a number between 0 and 1." +msgstr "" + +#: ../../library/tkinter.rst:3201 +msgid "" +"Shift the view left or right by *number* units. *what* is either ``'units'``" +" or ``'pages'``; a negative *number* scrolls left and a positive one scrolls" +" right." +msgstr "" + +#: ../../library/tkinter.rst:3208 +msgid "" +"Mix-in providing the vertical-scrolling interface shared by widgets such as " +":class:`Canvas`, :class:`Listbox` and :class:`Text`. A widget's " +":meth:`yview` method is registered as the *command* of a vertical " +":class:`Scrollbar`." +msgstr "" + +#: ../../library/tkinter.rst:3215 +msgid "" +"Query or change the vertical position of the view. With no arguments, return" +" a tuple ``(first, last)`` of two fractions between 0 and 1 giving the " +"portion of the document that is currently visible. Otherwise the arguments " +"are passed to the Tk ``yview`` widget command, usually generated by a " +"scrollbar; :meth:`yview_moveto` and :meth:`yview_scroll` provide a more " +"convenient interface." +msgstr "" + +#: ../../library/tkinter.rst:3225 +msgid "" +"Adjust the view so that *fraction* of the total height of the document is " +"off-screen above the top. *fraction* is a number between 0 and 1." +msgstr "" + +#: ../../library/tkinter.rst:3231 +msgid "" +"Shift the view up or down by *number* units. *what* is either ``'units'`` or" +" ``'pages'``; a negative *number* scrolls up and a positive one scrolls " +"down." +msgstr "" + +#: ../../library/tkinter.rst:3238 +msgid "" +"Internal base class for all widgets. It inherits from :class:`Misc` and adds" +" the machinery that creates the underlying Tk widget; application code " +"normally uses :class:`Widget` or a concrete widget class rather than " +"instantiating :class:`!BaseWidget` directly." +msgstr "" + +#: ../../library/tkinter.rst:3246 +msgid "" +"Destroy this widget and all of its children, removing the corresponding Tk " +"widgets and deleting the associated Tcl commands." +msgstr "" + +#: ../../library/tkinter.rst:3252 +msgid "" +"Internal base class for the standard widgets. It combines " +":class:`BaseWidget` with the geometry-manager mix-ins :class:`Pack`, " +":class:`Place` and :class:`Grid`, so that every widget can be managed by any" +" of the three geometry managers. The concrete widget classes " +"(:class:`Button`, :class:`Label`, and so on) derive from :class:`!Widget`." +msgstr "" + +#: ../../library/tkinter.rst:3261 +msgid "Toplevel widgets" +msgstr "" + +#: ../../library/tkinter.rst:3265 +msgid "" +"Construct a toplevel Tk widget, which is usually the main window of an " +"application, and initialize a Tcl interpreter for this widget. Each " +"instance has its own associated Tcl interpreter. Inherits from :class:`Misc`" +" and :class:`Wm`." +msgstr "" + +#: ../../library/tkinter.rst:3270 +msgid "" +"To create a Tcl interpreter without initializing the Tk subsystem, use the " +":func:`Tcl` factory function instead." +msgstr "" + +#: ../../library/tkinter.rst:3273 +msgid "" +"The :class:`Tk` class is typically instantiated using all default values. " +"However, the following keyword arguments are currently recognized:" +msgstr ":class:`Tk` 类通常全部使用默认值来初始化。 不过,目前还可识别下列关键字参数:" + +#: ../../library/tkinter.rst:3276 +msgid "*screenName*" +msgstr "*screenName*" + +#: ../../library/tkinter.rst:3277 +msgid "" +"When given (as a string), sets the :envvar:`DISPLAY` environment variable. " +"(X11 only)" +msgstr "当(作为字符串)给出时,设置 :envvar:`DISPLAY` 环境变量。 (仅限 X11)" + +#: ../../library/tkinter.rst:3279 +msgid "*baseName*" +msgstr "*baseName*" + +#: ../../library/tkinter.rst:3280 +msgid "" +"Name of the profile file. By default, *baseName* is derived from the " +"program name (``sys.argv[0]``)." +msgstr "预置文件的名称。 在默认情况下,*baseName* 是来自于程序名称 (``sys.argv[0]``)。" + +#: ../../library/tkinter.rst:3282 +msgid "*className*" +msgstr "*className*" + +#: ../../library/tkinter.rst:3283 +msgid "" +"Name of the widget class. Used as a profile file and also as the name with " +"which Tcl is invoked (*argv0* in *interp*)." +msgstr "控件类的名称。 会被用作预置文件同时也作为 Tcl 唤起的名称 (*interp* 中的 *argv0*)。" + +#: ../../library/tkinter.rst:3285 +msgid "*useTk*" +msgstr "*useTk*" + +#: ../../library/tkinter.rst:3286 +msgid "" +"If ``True``, initialize the Tk subsystem. The :func:`tkinter.Tcl() ` " +"function sets this to ``False``." +msgstr "" +"如果为 ``True``,则初始化 Tk 子系统。 :func:`tkinter.Tcl() ` 函数会将其设为 ``False``。" + +#: ../../library/tkinter.rst:3288 +msgid "*sync*" +msgstr "*sync*" + +#: ../../library/tkinter.rst:3289 +msgid "" +"If ``True``, execute all X server commands synchronously, so that errors are" +" reported immediately. Can be used for debugging. (X11 only)" +msgstr "如果为 ``True``,则同步执行所有 X 服务器命令,以便立即报告错误。 可被用于调试。 (仅限 X11)" + +#: ../../library/tkinter.rst:3291 +msgid "*use*" +msgstr "*use*" + +#: ../../library/tkinter.rst:3292 +msgid "" +"Specifies the *id* of the window in which to embed the application, instead " +"of it being created as an independent toplevel window. *id* must be " +"specified in the same way as the value for the -use option for toplevel " +"widgets (that is, it has a form like that returned by " +":meth:`~Misc.winfo_id`)." +msgstr "" + +#: ../../library/tkinter.rst:3298 +msgid "" +"Note that on some platforms this will only work correctly if *id* refers to " +"a Tk frame or toplevel that has its -container option enabled." +msgstr "请注意在某些平台上只有当 *id* 是指向一个启用了 -container 选项的 Tk 框架或顶层窗口时此参数才能正确生效。" + +#: ../../library/tkinter.rst:3301 +msgid "" +":class:`Tk` reads and interprets profile files, named " +":file:`.{className}.tcl` and :file:`.{baseName}.tcl`, into the Tcl " +"interpreter and calls :func:`exec` on the contents of " +":file:`.{className}.py` and :file:`.{baseName}.py`. The path for the " +"profile files is the :envvar:`HOME` environment variable or, if that isn't " +"defined, then :data:`os.curdir`." +msgstr "" +":class:`Tk` 读取并解释预置文件,其名称为 :file:`.{className}.tcl` 和 " +":file:`.{baseName}.tcl`,进入 Tcl 解释器并基于 :file:`.{className}.py` 和 " +":file:`.{baseName}.py` 的内容来调用 :func:`exec`。 预置文件的路径为 :envvar:`HOME` " +"环境变量,或者如果它未被定义,则为 :data:`os.curdir`。" + +#: ../../library/tkinter.rst:3310 +msgid "" +"On Windows, creating a Tcl interpreter (by instantiating :class:`Tk` or " +"calling :func:`Tcl`) sets the :envvar:`HOME` environment variable for the " +"process, if it is not already set, to ``%HOMEDRIVE%%HOMEPATH%`` (or " +":envvar:`USERPROFILE`, or ``c:\\``). This is done by Tcl and can affect " +"other code that reads :envvar:`HOME`." +msgstr "" + +#: ../../library/tkinter.rst:3318 +msgid "" +"The Tk application object created by instantiating :class:`Tk`. This " +"provides access to the Tcl interpreter. Each widget that is attached the " +"same instance of :class:`Tk` has the same value for its :attr:`tk` " +"attribute." +msgstr "" +"通过实例化 :class:`Tk` 创建的 Tk 应用程序对象。 这提供了对 Tcl 解释器的访问。 每个被附加到相同 :class:`Tk` " +"实例的控件都具有相同的 :attr:`tk` 属性值。" + +#: ../../library/tkinter.rst:3325 +msgid "" +"The widget object that contains this widget. For :class:`Tk`, the " +":attr:`!master` is :const:`None` because it is the main window. The terms " +"*master* and *parent* are similar and sometimes used interchangeably as " +"argument names; however, calling :meth:`~Misc.winfo_parent` returns a string" +" of the widget name whereas :attr:`!master` returns the object. " +"*parent*/*child* reflects the tree-like relationship while *master* (or " +"*container*)/*content* reflects the container structure." +msgstr "" + +#: ../../library/tkinter.rst:3337 +msgid "" +"The immediate descendants of this widget as a :class:`dict` with the child " +"widget names as the keys and the child instance objects as the values." +msgstr "以 :class:`dict` 表示的此控件的直接下级其中的键为子控件名称而值为子实例对象。" + +#: ../../library/tkinter.rst:3343 +msgid "" +"Destroy this and all descendant widgets and, for the main window, end the " +"connection to the underlying Tcl interpreter." +msgstr "" + +#: ../../library/tkinter.rst:3348 +msgid "" +"Finish loading and initializing the Tk subsystem. This is needed only when " +"the interpreter was created without Tk (for example through :func:`Tcl`); it" +" is called automatically when *useTk* is true." +msgstr "" + +#: ../../library/tkinter.rst:3355 +msgid "" +"Read and source the user's profile files :file:`.{className}.tcl` and " +":file:`.{baseName}.tcl` into the Tcl interpreter, and execute the " +"corresponding :file:`.{className}.py` and :file:`.{baseName}.py` files. This" +" is called during initialization; see the description of the constructor " +"above." +msgstr "" + +#: ../../library/tkinter.rst:3363 +msgid "" +"Report a callback exception. This is called when an exception propagates out" +" of a Tkinter callback; *exc*, *val* and *tb* are the exception type, value " +"and traceback as returned by :func:`sys.exc_info`. The default " +"implementation prints a traceback to :data:`sys.stderr`. It can be " +"overridden to customize error handling, for example to display the traceback" +" in a dialog." +msgstr "" + +#: ../../library/tkinter.rst:3374 +msgid "" +"A :class:`!Toplevel` widget is a top-level window, similar to a " +":class:`Frame` except that its X parent is the root window of a screen " +"rather than its logical parent. Its primary purpose is to serve as a " +"container for dialog boxes and other collections of widgets; its only " +"visible features are its background and an optional 3-D border. Notable " +"options include *menu*, which installs a :class:`Menu` as the window's " +"menubar. Inherits from :class:`BaseWidget` and :class:`Wm`, so a toplevel is" +" managed by the window manager. Refer to the Tk ``toplevel`` manual page for" +" the full list of options." +msgstr "" + +#: ../../library/tkinter.rst:3388 +msgid "Widget classes" +msgstr "" + +#: ../../library/tkinter.rst:3392 +msgid "" +"A :class:`!Button` widget displays a textual string, bitmap or image and " +"invokes a command when the user presses it (by clicking mouse button 1 over " +"the button or, when the button has focus, by pressing the space key). " +"Inherits from :class:`Widget`. In addition to the standard widget options, a" +" button accepts the options documented in the Tk ``button`` manual page, " +"such as *command* (the callback invoked when the button is pressed), " +"*textvariable*, *state* and *default*." +msgstr "" + +#: ../../library/tkinter.rst:3402 +msgid "" +"Invoke the command associated with the button, if there is one, and return " +"its result, or an empty string if no command is associated with the button. " +"This is ignored if the button's state is ``disabled``." +msgstr "" + +#: ../../library/tkinter.rst:3409 +msgid "" +"Flash the button by redisplaying it several times, alternating between the " +"active and normal colors. At the end of the flash the button is left in the " +"same normal or active state as when the method was called. This is ignored " +"if the button's state is ``disabled``." +msgstr "" + +#: ../../library/tkinter.rst:3418 +msgid "" +"A :class:`!Canvas` widget implements structured graphics. It displays any " +"number of *items*, such as arcs, lines, ovals, polygons, rectangles, text, " +"bitmaps, images and embedded windows, which may be drawn, moved, re-colored " +"and bound to events. Inherits from :class:`Widget`, :class:`XView` and " +":class:`YView`, so the view can be scrolled horizontally and vertically with" +" :meth:`~XView.xview` and :meth:`~YView.yview`. Refer to the Tk ``canvas`` " +"manual page for the full list of widget and item options." +msgstr "" + +#: ../../library/tkinter.rst:3428 +msgid "" +"Each item has a unique integer *id*, assigned when it is created, and zero " +"or more string *tags*. A tag is an arbitrary string that does not have the " +"form of an integer; the same tag may be shared by many items, which makes " +"tags convenient for grouping items. The special tag ``'all'`` matches every " +"item in the canvas, and ``'current'`` matches the topmost item under the " +"mouse pointer. Most methods take a *tagOrId* argument that may be an integer" +" id naming a single item, or a tag naming zero or more items; as described " +"in the Tk ``canvas`` manual page, a tag may also be a logical expression of " +"tags combined with the operators ``&&``, ``||``, ``^``, ``!`` and " +"parentheses. When a method that operates on a single item is given a " +"*tagOrId* matching several items, it normally uses the lowest matching item " +"in the display list." +msgstr "" + +#: ../../library/tkinter.rst:3443 +msgid "" +"The items are kept in a *display list* that determines drawing order: items " +"later in the list are drawn on top of earlier ones. A newly created item is " +"placed at the top of the list; the order can be changed with " +":meth:`tag_raise` and :meth:`tag_lower`." +msgstr "" + +#: ../../library/tkinter.rst:3458 +msgid "" +"Create a new item of the corresponding type and return its integer id. Each " +"method is called as ``create_TYPE(coord..., **options)``: the leading " +"positional arguments give the coordinates that define the item (as separate " +"numbers, as a single sequence of numbers, or as coordinate pairs), and the " +"keyword arguments set item-specific options. Coordinates and screen " +"distances may be given as numbers (interpreted as pixels) or as strings with" +" a unit suffix (``'m'``, ``'c'``, ``'i'`` or ``'p'`` for millimetres, " +"centimetres, inches or printer's points), but are always stored and returned" +" in pixels." +msgstr "" + +#: ../../library/tkinter.rst:3468 +msgid "" +"The item types are: ``arc`` (an arc-shaped region that is a section of an " +"oval, defined by two diagonally opposite corners ``x1, y1, x2, y2`` of the " +"enclosing rectangle); ``bitmap`` (a two-color bitmap positioned at a point " +"``x, y``); ``image`` (a Tk image positioned at a point ``x, y``); ``line`` " +"(a line or curve through the points ``x1, y1, ..., xn, yn``); ``oval`` (a " +"circle or ellipse inscribed in the rectangle ``x1, y1, x2, y2``); " +"``polygon`` (a closed polygon through the points ``x1, y1, ..., xn, yn``); " +"``rectangle`` (a rectangle with corners ``x1, y1, x2, y2``); ``text`` (a " +"string of text positioned at a point ``x, y``); and ``window`` (a child " +"widget embedded in the canvas at a point ``x, y``, specified with the " +"*window* option)." +msgstr "" + +#: ../../library/tkinter.rst:3480 +msgid "" +"Most item types accept a common set of *standard item options*, plus a few " +"options specific to each type. Option names are passed as keyword arguments," +" without the leading hyphen." +msgstr "" + +#: ../../library/tkinter.rst:3485 +msgid "The standard item options are:" +msgstr "" + +#: ../../library/tkinter.rst:3488 +msgid "" +"The color used to fill the item's interior, or to draw a *line* item or the " +"characters of a *text* item. An empty string (the default for all types " +"except *line* and *text*) leaves the item unfilled." +msgstr "" + +#: ../../library/tkinter.rst:3493 +msgid "*outline*" +msgstr "" + +#: ../../library/tkinter.rst:3494 +msgid "" +"The color used to draw the item's outline. An empty string draws no outline." +msgstr "" + +#: ../../library/tkinter.rst:3497 ../../library/tkinter.rst:3601 +msgid "*width*" +msgstr "" + +#: ../../library/tkinter.rst:3498 +msgid "" +"The width of the outline, defaulting to ``1.0``. Has no effect if *outline* " +"is empty." +msgstr "" + +#: ../../library/tkinter.rst:3501 +msgid "*dash*" +msgstr "" + +#: ../../library/tkinter.rst:3502 +msgid "" +"A dash pattern for the outline, given either as a sequence of segment " +"lengths in pixels or as a string of the characters ``'.'``, ``','``, " +"``'-'``, ``'_'`` and space. An empty pattern (the default) draws a solid " +"outline." +msgstr "" + +#: ../../library/tkinter.rst:3507 +msgid "*dashoffset*" +msgstr "" + +#: ../../library/tkinter.rst:3508 +msgid "" +"The starting offset in pixels into the *dash* pattern. Ignored if there is " +"no *dash* pattern." +msgstr "" + +#: ../../library/tkinter.rst:3511 +msgid "*stipple*" +msgstr "" + +#: ../../library/tkinter.rst:3512 +msgid "" +"A bitmap used as a stipple pattern when filling the item. Only well " +"supported on X11." +msgstr "" + +#: ../../library/tkinter.rst:3515 +msgid "*outlinestipple*" +msgstr "" + +#: ../../library/tkinter.rst:3516 +msgid "" +"A bitmap used as a stipple pattern when drawing the outline. Has no effect " +"if *outline* is empty." +msgstr "" + +#: ../../library/tkinter.rst:3519 +msgid "*offset*, *outlineoffset*" +msgstr "" + +#: ../../library/tkinter.rst:3520 +msgid "" +"The offset of the fill and outline stipple patterns, given as ``'x,y'`` or " +"as a side such as ``'n'``, ``'se'`` or ``'center'``. Stipple offsets are " +"only supported on X11." +msgstr "" + +#: ../../library/tkinter.rst:3524 ../../library/tkinter.rst:4474 +msgid "*state*" +msgstr "" + +#: ../../library/tkinter.rst:3525 +msgid "" +"Overrides the canvas state for this item; one of ``'normal'``, " +"``'disabled'`` or ``'hidden'``." +msgstr "" + +#: ../../library/tkinter.rst:3528 +msgid "*tags*" +msgstr "" + +#: ../../library/tkinter.rst:3529 +msgid "" +"A single tag or a sequence of tags to associate with the item, replacing any" +" existing tags." +msgstr "" + +#: ../../library/tkinter.rst:3532 +msgid "" +"Many of these options have *active...* and *disabled...* variants (such as " +"*activefill*, *disabledfill*, *activewidth*, *disableddash*, " +"*activeoutline*, *disabledstipple*) that override the base option when the " +"item is the active item (under the mouse pointer) or is in the disabled " +"state." +msgstr "" + +#: ../../library/tkinter.rst:3538 +msgid "The following item types support additional options." +msgstr "" + +#: ../../library/tkinter.rst:3540 +msgid "For ``arc`` items:" +msgstr "" + +#: ../../library/tkinter.rst:3542 +msgid "*start*" +msgstr "" + +#: ../../library/tkinter.rst:3543 +msgid "" +"The start of the arc's angular range, in degrees measured counter-clockwise " +"from the 3-o'clock position." +msgstr "" + +#: ../../library/tkinter.rst:3546 +msgid "*extent*" +msgstr "" + +#: ../../library/tkinter.rst:3547 +msgid "" +"The size of the angular range, in degrees counter-clockwise from *start*." +msgstr "" + +#: ../../library/tkinter.rst:3550 +msgid "*style*" +msgstr "" + +#: ../../library/tkinter.rst:3551 +msgid "" +"How the arc is drawn: ``'pieslice'`` (the default), ``'chord'`` or " +"``'arc'``." +msgstr "" + +#: ../../library/tkinter.rst:3554 +msgid "For ``line`` items:" +msgstr "" + +#: ../../library/tkinter.rst:3556 +msgid "*arrow*" +msgstr "" + +#: ../../library/tkinter.rst:3557 +msgid "" +"Where to draw arrowheads: ``'none'`` (the default), ``'first'``, ``'last'`` " +"or ``'both'``." +msgstr "" + +#: ../../library/tkinter.rst:3560 +msgid "*arrowshape*" +msgstr "" + +#: ../../library/tkinter.rst:3561 +msgid "A sequence of three distances describing the shape of the arrowheads." +msgstr "" + +#: ../../library/tkinter.rst:3564 +msgid "*capstyle*" +msgstr "" + +#: ../../library/tkinter.rst:3565 +msgid "" +"How line ends are drawn: ``'butt'`` (the default), ``'projecting'`` or " +"``'round'``." +msgstr "" + +#: ../../library/tkinter.rst:3568 +msgid "*joinstyle*" +msgstr "" + +#: ../../library/tkinter.rst:3569 +msgid "" +"How line vertices are drawn: ``'round'`` (the default), ``'bevel'`` or " +"``'miter'``." +msgstr "" + +#: ../../library/tkinter.rst:3572 +msgid "*smooth*" +msgstr "" + +#: ../../library/tkinter.rst:3573 +msgid "" +"The smoothing method: a false value (the default) for no smoothing, or " +"``'true'``/``'bezier'`` or ``'raw'`` to draw the line as a curve." +msgstr "" + +#: ../../library/tkinter.rst:3576 +msgid "*splinesteps*" +msgstr "" + +#: ../../library/tkinter.rst:3577 +msgid "" +"The number of line segments approximating each spline when *smooth* is " +"enabled." +msgstr "" + +#: ../../library/tkinter.rst:3580 +msgid "For ``polygon`` items:" +msgstr "" + +#: ../../library/tkinter.rst:3582 +msgid "*joinstyle*, *smooth*, *splinesteps*" +msgstr "" + +#: ../../library/tkinter.rst:3583 +msgid "As for ``line`` items, applied to the polygon's outline." +msgstr "" + +#: ../../library/tkinter.rst:3585 +msgid "For ``text`` items:" +msgstr "" + +#: ../../library/tkinter.rst:3587 +msgid "*text*" +msgstr "" + +#: ../../library/tkinter.rst:3588 +msgid "The string to display; newline characters start new lines." +msgstr "" + +#: ../../library/tkinter.rst:3590 ../../library/tkinter.rst:4488 +#: ../../library/tkinter.rst:5372 +msgid "*font*" +msgstr "" + +#: ../../library/tkinter.rst:3591 +msgid "The font used for the text." +msgstr "" + +#: ../../library/tkinter.rst:3593 ../../library/tkinter.rst:5412 +msgid "*justify*" +msgstr "" + +#: ../../library/tkinter.rst:3594 +msgid "" +"How lines are justified: ``'left'`` (the default), ``'right'`` or " +"``'center'``." +msgstr "" + +#: ../../library/tkinter.rst:3598 +msgid "" +"How the text is positioned relative to its point, defaulting to " +"``'center'``." +msgstr "" + +#: ../../library/tkinter.rst:3602 +msgid "The maximum line length; if non-zero, lines are wrapped at spaces." +msgstr "" + +#: ../../library/tkinter.rst:3604 +msgid "*angle*" +msgstr "" + +#: ../../library/tkinter.rst:3605 +msgid "" +"How many degrees to rotate the text counter-clockwise about its positioning " +"point, from ``0.0`` to ``360.0`` (default ``0.0``)." +msgstr "" + +#: ../../library/tkinter.rst:3608 ../../library/tkinter.rst:4470 +#: ../../library/tkinter.rst:5397 +msgid "*underline*" +msgstr "" + +#: ../../library/tkinter.rst:3609 +msgid "The index of a character to underline, or ``-1`` for none." +msgstr "" + +#: ../../library/tkinter.rst:3611 +msgid "For ``bitmap`` items:" +msgstr "" + +#: ../../library/tkinter.rst:3613 ../../library/tkinter.rst:4485 +msgid "*bitmap*" +msgstr "" + +#: ../../library/tkinter.rst:3614 +msgid "The bitmap to display." +msgstr "" + +#: ../../library/tkinter.rst:3617 +msgid "How the bitmap is positioned relative to its point." +msgstr "" + +#: ../../library/tkinter.rst:3619 ../../library/tkinter.rst:4491 +msgid "*background*, *foreground*" +msgstr "" + +#: ../../library/tkinter.rst:3620 +msgid "" +"The colors used for the bitmap's ``0`` and ``1`` pixels; an empty " +"*background* makes the ``0`` pixels transparent. Both have *active...* and " +"*disabled...* variants, and *bitmap* has *activebitmap* and *disabledbitmap*" +" variants." +msgstr "" + +#: ../../library/tkinter.rst:3625 +msgid "For ``image`` items:" +msgstr "" + +#: ../../library/tkinter.rst:3627 ../../library/tkinter.rst:4477 +msgid "*image*" +msgstr "" + +#: ../../library/tkinter.rst:3628 +msgid "The Tk image to display, previously created with the image protocols." +msgstr "" + +#: ../../library/tkinter.rst:3632 +msgid "How the image is positioned relative to its point." +msgstr "" + +#: ../../library/tkinter.rst:3634 +msgid "" +"Both options have *active...* and *disabled...* variants (*activeimage*, " +"*disabledimage*) used in the active and disabled states." +msgstr "" + +#: ../../library/tkinter.rst:3638 +msgid "For ``window`` items:" +msgstr "" + +#: ../../library/tkinter.rst:3640 +msgid "*window*" +msgstr "" + +#: ../../library/tkinter.rst:3641 +msgid "" +"The widget to embed; it must be a child of the canvas or of one of its " +"ancestors, and may not be a top-level window." +msgstr "" + +#: ../../library/tkinter.rst:3645 +msgid "How the window is positioned relative to its point." +msgstr "" + +#: ../../library/tkinter.rst:3648 +msgid "" +"The size to assign to the window; if zero (the default), the window is given" +" its requested size." +msgstr "" + +#: ../../library/tkinter.rst:3651 +msgid "" +"``oval`` and ``rectangle`` items have no type-specific options; they use " +"only the standard item options." +msgstr "" + +#: ../../library/tkinter.rst:3656 +msgid "" +"Tk 8.6 added the *angle* option and Tk 9.0 added the *underline* option for " +"``text`` items." +msgstr "" + +#: ../../library/tkinter.rst:3663 +msgid "" +"Query or modify the coordinates of an item. With only *tagOrId*, return a " +"list of the floating-point coordinates of the item given by *tagOrId* (the " +"first matching item if it matches several). Given new coordinates, replace " +"the coordinates of that item with them; like the ``create_*`` methods, the " +"coordinates may be given as separate numbers, as a single sequence, or as " +"coordinate pairs. The returned coordinates are always in pixels, regardless " +"of the units used to specify them; for rectangles, ovals and arcs they are " +"ordered left, top, right, bottom." +msgstr "" + +#: ../../library/tkinter.rst:3674 +msgid "" +"The arguments are now flattened: the coordinates may be given as separate " +"arguments, as a single sequence, or grouped in pairs, like the ``create_*`` " +"methods." +msgstr "" + +#: ../../library/tkinter.rst:3682 +msgid "" +"Move each of the items given by *tagOrId* in the canvas coordinate space by " +"adding *xAmount* to every x-coordinate and *yAmount* to every y-coordinate " +"of the item." +msgstr "" + +#: ../../library/tkinter.rst:3688 +msgid "" +"Move the items given by *tagOrId* so that the first coordinate pair (the " +"upper-left corner of the bounding box) of the lowest matching item is at " +"position (*x*, *y*). *x* or *y* may be an empty string, in which case the " +"corresponding coordinate is unchanged. All matching items keep their " +"positions relative to each other." +msgstr "" + +#: ../../library/tkinter.rst:3700 +msgid "" +"Rescale the coordinates of all items given by *tagOrId* in canvas coordinate" +" space. Each x-coordinate is adjusted so that its distance from *xOrigin* " +"changes by a factor of *xScale*, and each y-coordinate so that its distance " +"from *yOrigin* changes by a factor of *yScale* (a factor of ``1.0`` leaves " +"the coordinate unchanged)." +msgstr "" + +#: ../../library/tkinter.rst:3709 +msgid "Delete each of the items given by the *tagOrIds* arguments." +msgstr "" + +#: ../../library/tkinter.rst:3714 +msgid "" +"Delete from each of the items given by *tagOrId* the characters (for text " +"items) or coordinates (for line and polygon items) in the range from *first*" +" to *last* inclusive; *last* defaults to *first*. Items that do not support " +"indexing ignore this operation." +msgstr "" + +#: ../../library/tkinter.rst:3721 +msgid "" +"Insert *string* into each of the items given by *tagOrId* just before the " +"character or coordinate whose index is *beforeThis*. For line and polygon " +"items *string* must be a valid sequence of coordinates." +msgstr "" + +#: ../../library/tkinter.rst:3728 +msgid "" +"Return the current value of the configuration option *option* for the item " +"given by *tagOrId* (the lowest matching item if it matches several). This is" +" like :meth:`~Misc.cget` but applies to an individual item." +msgstr "" + +#: ../../library/tkinter.rst:3737 +msgid "" +"Query or modify the configuration options of the items given by *tagOrId*. " +"This mirrors :meth:`~Misc.configure`, except that it applies to individual " +"items rather than to the canvas as a whole. With no options, it returns a " +"dictionary describing the current options of the first matching item; " +"otherwise it sets the given options on every matching item. The legal " +"options are those accepted by the corresponding ``create_*`` method. " +":meth:`itemconfig` is an alias of :meth:`!itemconfigure`." +msgstr "" + +#: ../../library/tkinter.rst:3750 +msgid "" +"Return the type of the item given by *tagOrId* (the first matching item if " +"it matches several), such as ``'rectangle'`` or ``'text'``, or ``None`` if " +"*tagOrId* does not match any item." +msgstr "" + +#: ../../library/tkinter.rst:3756 +msgid "" +"Return a tuple of the tags associated with the item given by *tagOrId* (the " +"first matching item in display-list order if it matches several). Return an " +"empty tuple if no item matches or the item has no tags." +msgstr "" + +#: ../../library/tkinter.rst:3763 +msgid "" +"Remove the tag *tagToDelete* (which defaults to *tagOrId*) from each of the " +"items given by *tagOrId*. Items that do not have that tag are unaffected." +msgstr "" + +#: ../../library/tkinter.rst:3769 +msgid "" +"Add the tag *newtag* to each item selected by the search specification " +"*searchSpec* (and any further *args*). *searchSpec* is one of ``'above'``, " +"``'all'``, ``'below'``, ``'closest'``, ``'enclosed'``, ``'overlapping'`` or " +"``'withtag'``; the ``addtag_*`` methods below are convenient wrappers that " +"supply each of these forms." +msgstr "" + +#: ../../library/tkinter.rst:3778 +msgid "" +"Add the tag *newtag* to the item just above (after) *tagOrId* in the display" +" list." +msgstr "" + +#: ../../library/tkinter.rst:3783 +msgid "Add the tag *newtag* to all items in the canvas." +msgstr "" + +#: ../../library/tkinter.rst:3787 +msgid "" +"Add the tag *newtag* to the item just below (before) *tagOrId* in the " +"display list." +msgstr "" + +#: ../../library/tkinter.rst:3792 +msgid "" +"Add the tag *newtag* to the item closest to the point (*x*, *y*). If *halo* " +"is given, any item within that distance of the point is treated as " +"overlapping it. If *start* is given (a tag or id), select the topmost " +"closest item that lies below *start* in the display list, which can be used " +"to step through all the closest items." +msgstr "" + +#: ../../library/tkinter.rst:3801 +msgid "" +"Add the tag *newtag* to every item completely enclosed within the rectangle " +"(*x1*, *y1*, *x2*, *y2*), where *x1* <= *x2* and *y1* <= *y2*." +msgstr "" + +#: ../../library/tkinter.rst:3806 +msgid "" +"Add the tag *newtag* to every item that overlaps or is enclosed within the " +"rectangle (*x1*, *y1*, *x2*, *y2*), where *x1* <= *x2* and *y1* <= *y2*." +msgstr "" + +#: ../../library/tkinter.rst:3812 +msgid "Add the tag *newtag* to every item given by *tagOrId*." +msgstr "" + +#: ../../library/tkinter.rst:3816 +msgid "" +"Return a tuple of the ids of all items selected by the search specification " +"*searchSpec* (and any further *args*), in stacking order with the lowest " +"item first. The search specification has any of the forms accepted by " +":meth:`addtag`. The ``find_*`` methods below are more convenient wrappers " +"around it." +msgstr "" + +#: ../../library/tkinter.rst:3824 +msgid "" +"Return a tuple containing the id of the item just above *tagOrId* in the " +"display list." +msgstr "" + +#: ../../library/tkinter.rst:3829 +msgid "" +"Return a tuple of the ids of all items in the canvas, in stacking order." +msgstr "" + +#: ../../library/tkinter.rst:3833 +msgid "" +"Return a tuple containing the id of the item just below *tagOrId* in the " +"display list." +msgstr "" + +#: ../../library/tkinter.rst:3838 +msgid "" +"Return a tuple containing the id of the item closest to the point (*x*, " +"*y*). *halo* and *start* are interpreted as for :meth:`addtag_closest`." +msgstr "" + +#: ../../library/tkinter.rst:3844 +msgid "" +"Return a tuple of the ids of all items completely enclosed within the " +"rectangle (*x1*, *y1*, *x2*, *y2*)." +msgstr "" + +#: ../../library/tkinter.rst:3849 +msgid "" +"Return a tuple of the ids of all items that overlap or are enclosed within " +"the rectangle (*x1*, *y1*, *x2*, *y2*)." +msgstr "" + +#: ../../library/tkinter.rst:3854 +msgid "Return a tuple of the ids of all items given by *tagOrId*." +msgstr "" + +#: ../../library/tkinter.rst:3864 +msgid "" +"Move all items given by *tagOrId* to a new position in the display list just" +" above the item given by *aboveThis*, or to the top of the display list if " +"*aboveThis* is omitted. When several items are moved their relative order is" +" preserved. This has no effect on embedded window items, whose stacking " +"order is controlled by :meth:`Misc.tkraise` and :meth:`Misc.lower` instead. " +":meth:`lift` and :meth:`tkraise` are aliases of :meth:`!tag_raise`." +msgstr "" + +#: ../../library/tkinter.rst:3877 +msgid "" +"Move all items given by *tagOrId* to a new position in the display list just" +" below the item given by *belowThis*, or to the bottom of the display list " +"if *belowThis* is omitted. When several items are moved their relative order" +" is preserved. This has no effect on embedded window items. :meth:`lower` is" +" an alias of :meth:`!tag_lower`." +msgstr "" + +#: ../../library/tkinter.rst:3886 +msgid "" +"On a :class:`Canvas`, :meth:`tkraise`/:meth:`lift` and :meth:`lower` restack" +" canvas items, shadowing the inherited " +":meth:`Misc.tkraise`/:meth:`Misc.lift` and :meth:`Misc.lower` methods that " +"restack the widget itself, which are therefore not available." +msgstr "" + +#: ../../library/tkinter.rst:3894 +msgid "" +"Bind the callback *func* to the event *sequence* for all items given by " +"*tagOrId*, so that *func* is invoked whenever that event occurs for one of " +"the items. This is like :meth:`Widget.bind ` but operates on " +"canvas items rather than on whole widgets; only mouse, keyboard and virtual " +"events may be bound. Mouse events are directed to the current item and " +"keyboard events to the focus item (see :meth:`focus`). If *add* is true the " +"new binding is added to any existing bindings for the same sequence, rather " +"than replacing them. Return the identifier of the bound function, which can " +"be passed to :meth:`tag_unbind`." +msgstr "" + +#: ../../library/tkinter.rst:3909 +msgid "" +"Remove for all items given by *tagOrId* the binding for the event " +"*sequence*. If *funcid* is given, only that callback (as returned by " +":meth:`tag_bind`) is unbound and deregistered." +msgstr "" + +#: ../../library/tkinter.rst:3914 ../../library/tkinter.rst:5518 +msgid "If *funcid* is given, only that callback is unbound." +msgstr "" + +#: ../../library/tkinter.rst:3920 +msgid "" +"Return a 4-tuple ``(x1, y1, x2, y2)`` giving an approximate bounding box, in" +" pixels, that encloses all the items given by *tagOrId* and any further " +"*tagOrIds*. The result may overestimate the true bounding box by a few " +"pixels. Return ``None`` if no item matches or the matching items have " +"nothing to display." +msgstr "" + +#: ../../library/tkinter.rst:3927 ../../library/tkinter.rst:4320 +#: ../../library/tkinter.rst:5061 ../../library/tkinter.rst:5288 +msgid "" +"This shadows the inherited :meth:`!Misc.bbox`; use :meth:`~Misc.grid_bbox` " +"for the grid bounding box." +msgstr "" + +#: ../../library/tkinter.rst:3932 +msgid "" +"Given a window x-coordinate *screenx*, return the canvas x-coordinate " +"displayed at that location. If *gridspacing* is given, the result is rounded" +" to the nearest multiple of *gridspacing* units." +msgstr "" + +#: ../../library/tkinter.rst:3939 +msgid "" +"Given a window y-coordinate *screeny*, return the canvas y-coordinate " +"displayed at that location. If *gridspacing* is given, the result is rounded" +" to the nearest multiple of *gridspacing* units." +msgstr "" + +#: ../../library/tkinter.rst:3947 +msgid "" +"With *tagOrId*, set the keyboard focus for the canvas to the first item " +"given by *tagOrId* that supports the insertion cursor; the focus is left " +"unchanged if no such item exists. If *tagOrId* is an empty string, reset the" +" focus so that no item has it. With no argument, return the id of the item " +"that currently has the focus, or an empty string if none does. An item only " +"displays the insertion cursor when both it is the focus item and its canvas " +"has the input focus." +msgstr "" + +#: ../../library/tkinter.rst:3956 +msgid "" +"This shadows the inherited :meth:`!Misc.focus`; use :meth:`~Misc.focus_set` " +"to focus the widget itself." +msgstr "" + +#: ../../library/tkinter.rst:3961 +msgid "" +"Set the insertion cursor of the items given by *tagOrId* to just before the " +"character given by *index*. Items that do not support an insertion cursor " +"are unaffected. The cursor is only displayed when the item has the focus, " +"but its position may be set at any time." +msgstr "" + +#: ../../library/tkinter.rst:3969 +msgid "" +"Return as an integer the numerical index within *tagOrId* corresponding to " +"*index*, which is a textual description of a position (for text items an " +"index into the characters, for line and polygon items an index into the " +"coordinates). If *tagOrId* matches several items, the first one that " +"supports indexing is used." +msgstr "" + +#: ../../library/tkinter.rst:3978 +msgid "" +"Adjust the end of the selection in *tagOrId* nearest to *index* so that it " +"is at *index*, and make the other end the anchor point for future " +":meth:`select_to` calls. If the selection is not currently in *tagOrId*, " +"this behaves like :meth:`select_to`." +msgstr "" + +#: ../../library/tkinter.rst:3986 +msgid "Clear the selection if it is in this canvas; otherwise do nothing." +msgstr "" + +#: ../../library/tkinter.rst:3990 +msgid "" +"Set the selection anchor point to just before the character given by *index*" +" in the item given by *tagOrId*. This does not change the selection itself; " +"it sets the fixed end for future :meth:`select_to` calls." +msgstr "" + +#: ../../library/tkinter.rst:3997 +msgid "" +"Return the id of the item that holds the selection, or ``None`` if the " +"selection is not in this canvas. Unlike :meth:`find` and the ``find_*`` " +"methods, this returns the id as a string rather than an integer." +msgstr "" + +#: ../../library/tkinter.rst:4004 +msgid "" +"Set the selection to the characters of *tagOrId* between the selection " +"anchor point and *index*, inclusive of *index*. The anchor point is the one " +"set by the most recent :meth:`select_adjust` or :meth:`select_from` call." +msgstr "" + +#: ../../library/tkinter.rst:4011 ../../library/tkinter.rst:4416 +#: ../../library/tkinter.rst:5642 +msgid "" +"Record *x*, *y* and the current view, for use with later :meth:`scan_dragto`" +" calls. This is typically bound to a mouse button press in the widget." +msgstr "" + +#: ../../library/tkinter.rst:4017 +msgid "" +"Scroll the canvas by *gain* times the difference between *x*, *y* and the " +"coordinates passed to the last :meth:`scan_mark` call. This is typically " +"bound to mouse motion events in the widget, producing the effect of dragging" +" the canvas at high speed through its window." +msgstr "" + +#: ../../library/tkinter.rst:4024 +msgid "" +"Generate a PostScript (Encapsulated PostScript, version 3.0) representation " +"of part or all of the canvas. If the *file* or *channel* option is given, " +"the PostScript is written there and an empty string is returned; otherwise " +"it is returned as a string. By default only the area currently visible in " +"the window is generated, so it is usually necessary either to call " +":meth:`~Misc.update` first or to use the *width* and *height* options. " +"Supported options include *colormap*, *colormode*, *file*, *fontmap*, " +"*height*, *pageanchor*, *pageheight*, *pagewidth*, *pagex*, *pagey*, " +"*rotate*, *width*, *x* and *y*." +msgstr "" + +#: ../../library/tkinter.rst:4039 +msgid "" +"A :class:`!Checkbutton` widget displays a textual string, bitmap or image " +"together with a square indicator, and toggles a boolean selection when " +"pressed. It has all the behavior of a simple button and, in addition, can be" +" selected: when selected the indicator is drawn with a check mark and the " +"associated variable is set to the ``onvalue``, and when deselected the " +"indicator is drawn empty and the variable is set to the ``offvalue``. " +"Inherits from :class:`Widget`. In addition to the standard widget options, a" +" checkbutton accepts the options documented in the Tk ``checkbutton`` manual" +" page, such as *variable*, *onvalue*, *offvalue* and *command*." +msgstr "" + +#: ../../library/tkinter.rst:4053 +msgid "" +"Do just what would happen if the user pressed the checkbutton with the " +"mouse: toggle the selection state of the button and invoke the associated " +"command, if there is one. Return the result of the command, or an empty " +"string if no command is associated with the checkbutton. This is ignored if " +"the checkbutton's state is ``disabled``." +msgstr "" + +#: ../../library/tkinter.rst:4062 +msgid "" +"Select the checkbutton and set the associated variable to its ``onvalue``." +msgstr "" + +#: ../../library/tkinter.rst:4067 +msgid "" +"Deselect the checkbutton and set the associated variable to its " +"``offvalue``." +msgstr "" + +#: ../../library/tkinter.rst:4072 +msgid "" +"Toggle the selection state of the button, redisplaying it and modifying its " +"associated variable to reflect the new state." +msgstr "" + +#: ../../library/tkinter.rst:4077 +msgid "" +"Flash the checkbutton by redisplaying it several times, alternating between " +"the active and normal colors. At the end of the flash the checkbutton is " +"left in the same normal or active state as when the method was called. This " +"is ignored if the checkbutton's state is ``disabled``." +msgstr "" + +#: ../../library/tkinter.rst:4086 +msgid "" +"An :class:`!Entry` widget displays a single line of text and lets the user " +"edit it. Inherits from :class:`Widget` and :class:`XView`; since entries can" +" hold strings too long to fit in the window, they support horizontal " +"scrolling through :meth:`~XView.xview`." +msgstr "" + +#: ../../library/tkinter.rst:4092 +msgid "" +"In addition to the standard widget options, an entry accepts the options " +"documented in the Tk ``entry`` manual page. Notable ones are *textvariable* " +"(the name of a variable kept in sync with the entry's contents), *show* (if " +"set, each character is displayed as the given character rather than its true" +" value, useful for password entry), *validate* and *validatecommand* (which " +"together let a callback accept or reject edits), and *state* (one of " +"``'normal'``, ``'disabled'`` or ``'readonly'``)." +msgstr "" + +#: ../../library/tkinter.rst:4101 +msgid "" +"Many of the methods below take an *index* argument that selects a character " +"in the entry's string. As described in the Tk ``entry`` manual page, *index*" +" may be a number (counting from 0), ``'insert'`` (the character just after " +"the insertion cursor), ``'end'`` (just after the last character), " +"``'anchor'`` (the selection anchor point), ``'sel.first'`` and " +"``'sel.last'`` (the ends of the selection), or ``@x`` (the character " +"covering pixel x-coordinate *x* in the window). Out-of-range indices are " +"rounded to the nearest legal value." +msgstr "" + +#: ../../library/tkinter.rst:4113 +msgid "" +"Delete the characters from index *first* up to but not including index " +"*last*. If *last* is omitted, only the single character at *first* is " +"deleted." +msgstr "" + +#: ../../library/tkinter.rst:4119 +msgid "Return the entry's current string." +msgstr "" + +#: ../../library/tkinter.rst:4123 +msgid "Insert *string* just before the character given by *index*." +msgstr "" + +#: ../../library/tkinter.rst:4127 ../../library/tkinter.rst:5044 +msgid "" +"Arrange for the insertion cursor to be displayed just before the character " +"given by *index*." +msgstr "" + +#: ../../library/tkinter.rst:4132 +msgid "Return the numerical index corresponding to *index*." +msgstr "" + +#: ../../library/tkinter.rst:4139 +msgid "" +"Locate the end of the selection nearest to the character given by *index*, " +"and adjust that end to be at *index* (including but not going beyond it); " +"the other end becomes the anchor point for future :meth:`selection_to` " +"calls. If there is no selection in the entry, a new one is created between " +"*index* and the most recent anchor point, inclusive. :meth:`select_adjust` " +"is an alias of :meth:`!selection_adjust`." +msgstr "" + +#: ../../library/tkinter.rst:4152 +msgid "" +"Clear the selection if it is currently in this widget. If the selection is " +"not in this widget the method has no effect. :meth:`select_clear` is an " +"alias of :meth:`!selection_clear`." +msgstr "" + +#: ../../library/tkinter.rst:4158 +msgid "" +"This shadows the inherited :meth:`Misc.selection_clear`, which clears the X " +"selection; that method is not available on an :class:`Entry`." +msgstr "" + +#: ../../library/tkinter.rst:4167 +msgid "" +"Set the selection anchor point to just before the character given by " +"*index*, without changing the selection. :meth:`select_from` is an alias of " +":meth:`!selection_from`." +msgstr "" + +#: ../../library/tkinter.rst:4176 +msgid "" +"Return ``True`` if there are characters selected in the entry, ``False`` " +"otherwise. :meth:`select_present` is an alias of :meth:`!selection_present`." +msgstr "" + +#: ../../library/tkinter.rst:4185 +msgid "" +"Set the selection to include the characters starting with the one indexed by" +" *start* and ending with the one just before *end*. If *end* refers to the " +"same character as *start* or an earlier one, the selection is cleared. " +":meth:`select_range` is an alias of :meth:`!selection_range`." +msgstr "" + +#: ../../library/tkinter.rst:4196 +msgid "" +"Set the selection between the anchor point and *index*: if *index* is before" +" the anchor point, the selection runs from *index* up to but not including " +"the anchor; if *index* is after it, from the anchor up to but not including " +"*index*; if they coincide, nothing happens. The anchor point is the one set " +"by the most recent :meth:`selection_from` or :meth:`selection_adjust` call. " +"If there is no selection in the entry, a new one is created using the most " +"recent anchor point. :meth:`select_to` is an alias of :meth:`!selection_to`." +msgstr "" + +#: ../../library/tkinter.rst:4208 +msgid "" +"Record *x* and the current view in the entry window, for use with later " +":meth:`scan_dragto` calls. Typically associated with a mouse button press in" +" the widget." +msgstr "" + +#: ../../library/tkinter.rst:4214 +msgid "" +"Compute the difference between *x* and the *x* given to the last " +":meth:`scan_mark` call, and adjust the view left or right by 10 times that " +"difference. Typically associated with mouse motion events, to produce the " +"effect of dragging the entry at high speed through the window." +msgstr "" + +#: ../../library/tkinter.rst:4223 +msgid "" +"A :class:`!Frame` widget is a simple container. Its primary purpose is to " +"act as a spacer or container for complex window layouts; its only features " +"are its background and an optional 3-D border to make the frame appear " +"raised or sunken. Inherits from :class:`Widget`. Refer to the Tk ``frame`` " +"manual page for the full list of options." +msgstr "" + +#: ../../library/tkinter.rst:4233 +msgid "" +"A :class:`!Label` widget displays a non-interactive textual string, bitmap " +"or image. The displayed text is set with the *text* option or linked to a " +"variable through *textvariable*, and an image can be shown using the *image*" +" option. Text must all be in a single font but may occupy multiple lines, " +"and one character may be underlined with the *underline* option. Inherits " +"from :class:`Widget`. Refer to the Tk ``label`` manual page for the full " +"list of options." +msgstr "" + +#: ../../library/tkinter.rst:4245 +msgid "" +"A :class:`!LabelFrame` widget is a container that has the features of a " +":class:`Frame` plus the ability to display a label. The label text is set " +"with the *text* option and positioned with *labelanchor*, or an arbitrary " +"widget may be used as the label by giving it as the *labelwidget* option. " +"Inherits from :class:`Widget`. Refer to the Tk ``labelframe`` manual page " +"for the full list of options." +msgstr "" + +#: ../../library/tkinter.rst:4256 +msgid "" +"A :class:`!Listbox` widget displays a list of single-line text items, one " +"per line, of which the user can select one or more. The way the selection " +"behaves is governed by the *selectmode* option, which is one of ``browse`` " +"(the default; at most one item, which may be dragged with the mouse), " +"``single`` (at most one item), ``multiple`` (any number of items, toggled " +"individually), or ``extended`` (any number of items, including discontiguous" +" ranges, selected by clicking and dragging). Inherits from :class:`Widget`, " +":class:`XView` and :class:`YView`, so the view can be scrolled horizontally " +"and vertically with :meth:`~XView.xview` and :meth:`~YView.yview`. Refer to " +"the Tk ``listbox`` manual page for the full list of options." +msgstr "" + +#: ../../library/tkinter.rst:4268 +msgid "" +"Many of the methods take an *index* argument identifying a particular item. " +"As described in the Tk ``listbox`` manual page, *index* may be a numeric " +"index (counting from 0 at the top), ``'active'`` (the item with the location" +" cursor, set with :meth:`activate`), ``'anchor'`` (the selection anchor, set" +" with :meth:`selection_anchor`), ``'end'`` (the last item, or for " +":meth:`index` and :meth:`insert` the position just after it), or ``@x,y`` " +"(the item covering pixel coordinates *x*, *y* in the listbox window). " +"Arguments named *first* and *last* are indices of the same forms." +msgstr "" + +#: ../../library/tkinter.rst:4279 +msgid "" +"Insert the given *elements* as new items just before the item given by " +"*index*. If *index* is ``'end'``, the new items are appended to the end of " +"the list." +msgstr "" + +#: ../../library/tkinter.rst:4286 +msgid "" +"Delete the items in the range from *first* to *last* inclusive. If *last* is" +" omitted, it defaults to *first*, so that a single item is deleted." +msgstr "" + +#: ../../library/tkinter.rst:4292 +msgid "" +"If *last* is omitted, return the contents of the item given by *first*, or " +"an empty string if *first* refers to a non-existent item. If *last* is " +"given, return a tuple of all the items in the range from *first* to *last* " +"inclusive." +msgstr "" + +#: ../../library/tkinter.rst:4299 +msgid "Return the total number of items in the listbox." +msgstr "" + +#: ../../library/tkinter.rst:4301 +msgid "" +"This shadows the inherited :meth:`!Misc.size`; use :meth:`~Misc.grid_size` " +"for the grid size." +msgstr "" + +#: ../../library/tkinter.rst:4306 +msgid "" +"Return the integer index value corresponding to *index*, or ``None`` if " +"*index* is out of range. If *index* is ``'end'``, the result is a count of " +"the number of items in the listbox (not the index of the last item)." +msgstr "" + +#: ../../library/tkinter.rst:4313 +msgid "" +"Return a tuple ``(x, y, width, height)`` describing the bounding box, in " +"pixels relative to the widget, of the text of the item given by *index*. " +"Return ``None`` if no part of that item is visible on the screen, or if " +"*index* refers to a non-existent item; if the item is only partly visible, " +"the result still gives the full area of the item, including the parts that " +"are not visible." +msgstr "" + +#: ../../library/tkinter.rst:4325 +msgid "" +"Given a y-coordinate within the listbox window, return the index of the " +"visible item nearest to that y-coordinate." +msgstr "" + +#: ../../library/tkinter.rst:4330 +msgid "" +"Adjust the view so that the item given by *index* is visible. If the item is" +" already visible the method has no effect; if it is near an edge of the " +"window the listbox scrolls just enough to bring it into view at that edge, " +"otherwise the listbox scrolls to center the item." +msgstr "" + +#: ../../library/tkinter.rst:4337 +msgid "" +"Set the active item to the one given by *index*. If *index* is outside the " +"range of items, the closest item is activated instead. The active item is " +"drawn as specified by the *activestyle* option when the widget has the input" +" focus, and its index may be retrieved with the ``'active'`` index." +msgstr "" + +#: ../../library/tkinter.rst:4346 +msgid "" +"Return a tuple containing the numerical indices of all of the items that are" +" currently selected, or an empty tuple if no items are selected." +msgstr "" + +#: ../../library/tkinter.rst:4354 +msgid "" +"Set the selection anchor to the item given by *index*. If *index* refers to " +"a non-existent item, the closest item is used. The selection anchor is the " +"end of the selection that is fixed while dragging out a selection with the " +"mouse, and may afterwards be referred to with the ``'anchor'`` index. " +":meth:`select_anchor` is an alias of :meth:`!selection_anchor`." +msgstr "" + +#: ../../library/tkinter.rst:4366 +msgid "" +"Deselect any of the items in the range from *first* to *last* inclusive that" +" are selected. The selection state of items outside this range is not " +"changed. :meth:`select_clear` is an alias of :meth:`!selection_clear`." +msgstr "" + +#: ../../library/tkinter.rst:4373 +msgid "" +"This shadows the inherited :meth:`Misc.selection_clear`, which clears the X " +"selection; that method is not available on a :class:`Listbox`." +msgstr "" + +#: ../../library/tkinter.rst:4382 +msgid "" +"Return ``True`` if the item given by *index* is currently selected, " +"``False`` otherwise. :meth:`select_includes` is an alias of " +":meth:`!selection_includes`." +msgstr "" + +#: ../../library/tkinter.rst:4391 +msgid "" +"Select all of the items in the range from *first* to *last* inclusive, " +"without affecting the selection state of items outside that range. " +":meth:`select_set` is an alias of :meth:`!selection_set`." +msgstr "" + +#: ../../library/tkinter.rst:4397 +msgid "" +"Return the current value of the configuration option *option* for the item " +"given by *index*." +msgstr "" + +#: ../../library/tkinter.rst:4405 +msgid "" +"Query or modify the configuration options of the item given by *index*. This" +" mirrors :meth:`~Misc.configure`, except that it applies to an individual " +"item rather than to the listbox as a whole. With no options, it returns a " +"dictionary describing the current options of the item; otherwise it sets the" +" given options. The supported item options are *background*, *foreground*, " +"*selectbackground* and *selectforeground*. :meth:`itemconfig` is an alias of" +" :meth:`!itemconfigure`." +msgstr "" + +#: ../../library/tkinter.rst:4422 +msgid "" +"Scroll the listbox by 10 times the difference between *x*, *y* and the " +"coordinates passed to the last :meth:`scan_mark` call. This is typically " +"bound to mouse motion events in the widget, producing the effect of dragging" +" the list at high speed through the window." +msgstr "" + +#: ../../library/tkinter.rst:4430 +msgid "" +"A :class:`!Menu` widget displays a column of entries, each of which may be a" +" command, a checkbutton, a radiobutton, a cascade (which posts an associated" +" submenu) or a separator. Menus are used as the menubar of a toplevel " +"window, as pulldown menus posted from a cascade entry or menubutton, and as " +"popup menus. Inherits from :class:`Widget`." +msgstr "" + +#: ../../library/tkinter.rst:4437 +msgid "" +"Many of the entry methods take an *index* argument that selects which entry " +"to operate on. As described in the Tk ``menu`` manual page, *index* may be a" +" numeric index (counting from 0 at the top), ``'active'`` (the currently " +"active entry), ``'end'`` or ``'last'`` (the bottommost entry), ``'none'`` " +"(no entry at all, written ``{}`` in Tcl), ``@y`` (the entry covering pixel " +"y-coordinate *y* in the menu window), or a pattern matched against the " +"labels of the entries from the top down." +msgstr "" + +#: ../../library/tkinter.rst:4448 +msgid "" +"Add a new entry to the bottom of the menu. *itemType* is one of " +"``'command'``, ``'cascade'``, ``'checkbutton'``, ``'radiobutton'`` or " +"``'separator'`` and determines the type of the new entry; the remaining " +"options configure it. The :meth:`!add_command`, :meth:`!add_cascade`, " +":meth:`!add_checkbutton`, :meth:`!add_radiobutton` and " +":meth:`!add_separator` convenience methods call this method with the " +"corresponding *itemType*." +msgstr "" + +#: ../../library/tkinter.rst:4456 +msgid "" +"The entry is configured by the following options, although not every option " +"applies to every entry type (a separator accepts none of them):" +msgstr "" + +#: ../../library/tkinter.rst:4459 +msgid "*label*" +msgstr "" + +#: ../../library/tkinter.rst:4460 +msgid "The text to display in the entry." +msgstr "" + +#: ../../library/tkinter.rst:4462 +msgid "*command*" +msgstr "" + +#: ../../library/tkinter.rst:4463 +msgid "" +"The function to call when the entry is invoked (command, checkbutton and " +"radiobutton entries)." +msgstr "" + +#: ../../library/tkinter.rst:4466 +msgid "*accelerator*" +msgstr "" + +#: ../../library/tkinter.rst:4467 +msgid "" +"A string displayed at the right of the entry to advertise an accelerator " +"keystroke; it does not itself create the binding." +msgstr "" + +#: ../../library/tkinter.rst:4471 +msgid "" +"The index of a character in the label to underline for keyboard traversal." +msgstr "" + +#: ../../library/tkinter.rst:4475 +msgid "One of ``'normal'``, ``'active'`` or ``'disabled'``." +msgstr "" + +#: ../../library/tkinter.rst:4478 +msgid "An image to display instead of, or together with, the text label." +msgstr "" + +#: ../../library/tkinter.rst:4480 +msgid "*compound*" +msgstr "" + +#: ../../library/tkinter.rst:4481 +msgid "" +"Where to show the image relative to the text: ``'none'`` (the default), " +"``'text'``, ``'image'``, ``'top'``, ``'bottom'``, ``'left'`` or ``'right'``." +msgstr "" + +#: ../../library/tkinter.rst:4486 +msgid "A bitmap to display instead of the text label." +msgstr "" + +#: ../../library/tkinter.rst:4489 ../../library/tkinter.rst:5373 +msgid "The font to use for the text." +msgstr "" + +#: ../../library/tkinter.rst:4492 +msgid "" +"The entry's background and foreground colors in its normal state (ignored on" +" macOS)." +msgstr "" + +#: ../../library/tkinter.rst:4495 +msgid "*activebackground*, *activeforeground*" +msgstr "" + +#: ../../library/tkinter.rst:4496 +msgid "" +"The background and foreground colors used when the entry is active (ignored " +"on macOS)." +msgstr "" + +#: ../../library/tkinter.rst:4499 +msgid "*columnbreak*" +msgstr "" + +#: ../../library/tkinter.rst:4500 +msgid "" +"If true, the entry starts a new column instead of being placed below the " +"previous entry." +msgstr "" + +#: ../../library/tkinter.rst:4503 +msgid "*hidemargin*" +msgstr "" + +#: ../../library/tkinter.rst:4504 +msgid "" +"If true, the standard margin around the entry is omitted, which is useful " +"when a menu is used as a palette." +msgstr "" + +#: ../../library/tkinter.rst:4507 +msgid "*menu*" +msgstr "" + +#: ../../library/tkinter.rst:4508 +msgid "" +"The submenu posted by a cascade entry; it must be a child of this menu." +msgstr "" + +#: ../../library/tkinter.rst:4511 +msgid "*variable*" +msgstr "" + +#: ../../library/tkinter.rst:4512 +msgid "The variable associated with a checkbutton or radiobutton entry." +msgstr "" + +#: ../../library/tkinter.rst:4514 +msgid "*onvalue*, *offvalue*" +msgstr "" + +#: ../../library/tkinter.rst:4515 +msgid "" +"The values stored in *variable* when a checkbutton entry is selected or " +"cleared." +msgstr "" + +#: ../../library/tkinter.rst:4518 +msgid "*value*" +msgstr "" + +#: ../../library/tkinter.rst:4519 +msgid "The value stored in *variable* when a radiobutton entry is selected." +msgstr "" + +#: ../../library/tkinter.rst:4521 +msgid "*indicatoron*" +msgstr "" + +#: ../../library/tkinter.rst:4522 +msgid "" +"Whether to display the indicator of a checkbutton or radiobutton entry." +msgstr "" + +#: ../../library/tkinter.rst:4525 +msgid "*selectcolor*" +msgstr "" + +#: ../../library/tkinter.rst:4526 +msgid "" +"The color of the indicator of a checkbutton or radiobutton entry when it is " +"selected." +msgstr "" + +#: ../../library/tkinter.rst:4529 +msgid "*selectimage*" +msgstr "" + +#: ../../library/tkinter.rst:4530 +msgid "" +"The image displayed when a checkbutton or radiobutton entry is selected and " +"*image* is also given." +msgstr "" + +#: ../../library/tkinter.rst:4535 +msgid "" +"Add a new cascade entry to the bottom of the menu. A cascade entry has an " +"associated submenu, given by its *menu* option, which must be a child of " +"this menu; posting the entry posts the submenu next to it." +msgstr "" + +#: ../../library/tkinter.rst:4542 +msgid "" +"Add a new checkbutton entry to the bottom of the menu. When invoked, a " +"checkbutton entry toggles between its *onvalue* and *offvalue*, storing the " +"result in its associated *variable*, and displays an indicator showing " +"whether it is selected." +msgstr "" + +#: ../../library/tkinter.rst:4549 +msgid "" +"Add a new command entry to the bottom of the menu. A command entry behaves " +"much like a button: when it is invoked, the callback given by its *command* " +"option is called." +msgstr "" + +#: ../../library/tkinter.rst:4555 +msgid "" +"Add a new radiobutton entry to the bottom of the menu. Radiobutton entries " +"sharing the same *variable* form a group of which only one may be selected " +"at a time; selecting an entry stores its *value* in the variable." +msgstr "" + +#: ../../library/tkinter.rst:4562 +msgid "" +"Add a separator to the bottom of the menu. A separator is displayed as a " +"horizontal dividing line and cannot be activated or invoked." +msgstr "" + +#: ../../library/tkinter.rst:4568 +msgid "" +"Same as :meth:`add`, except that the new entry is inserted just before the " +"entry given by *index* instead of being appended to the end of the menu. " +"*itemType* is one of ``'command'``, ``'cascade'``, ``'checkbutton'``, " +"``'radiobutton'`` or ``'separator'``. The :meth:`!insert_command`, " +":meth:`!insert_cascade`, :meth:`!insert_checkbutton`, " +":meth:`!insert_radiobutton` and :meth:`!insert_separator` convenience " +"methods call this method with the corresponding *itemType*." +msgstr "" + +#: ../../library/tkinter.rst:4580 +msgid "" +"Insert a new cascade entry before the entry given by *index* (see " +":meth:`add_cascade`)." +msgstr "" + +#: ../../library/tkinter.rst:4585 +msgid "" +"Insert a new checkbutton entry before the entry given by *index* (see " +":meth:`add_checkbutton`)." +msgstr "" + +#: ../../library/tkinter.rst:4590 +msgid "" +"Insert a new command entry before the entry given by *index* (see " +":meth:`add_command`)." +msgstr "" + +#: ../../library/tkinter.rst:4595 +msgid "" +"Insert a new radiobutton entry before the entry given by *index* (see " +":meth:`add_radiobutton`)." +msgstr "" + +#: ../../library/tkinter.rst:4600 +msgid "" +"Insert a separator before the entry given by *index* (see " +":meth:`add_separator`)." +msgstr "" + +#: ../../library/tkinter.rst:4605 +msgid "" +"Delete all of the menu entries between *index1* and *index2* inclusive. If " +"*index2* is omitted, it defaults to *index1*, so that a single entry is " +"deleted. Attempts to delete a tear-off entry are ignored; remove it by " +"changing the *tearoff* option instead." +msgstr "" + +#: ../../library/tkinter.rst:4613 +msgid "" +"Return the current value of the configuration option *option* for the entry " +"given by *index*." +msgstr "" + +#: ../../library/tkinter.rst:4621 +msgid "" +"Query or modify the configuration options of the entry given by *index*. " +"This mirrors :meth:`~Misc.configure`, except that it applies to an " +"individual entry rather than to the menu as a whole. With no options, it " +"returns a dictionary describing the current options of the entry; otherwise " +"it sets the given options. The supported options are those accepted by " +":meth:`add` for the entry's type. :meth:`entryconfig` is an alias of " +":meth:`!entryconfigure`." +msgstr "" + +#: ../../library/tkinter.rst:4632 +msgid "" +"Return the numerical index corresponding to *index*, or ``None`` if *index* " +"selects no entry." +msgstr "" + +#: ../../library/tkinter.rst:4637 +msgid "" +"Return the type of the entry given by *index*: one of ``'command'``, " +"``'cascade'``, ``'checkbutton'``, ``'radiobutton'``, ``'separator'`` or " +"``'tearoff'`` (for the tear-off entry)." +msgstr "" + +#: ../../library/tkinter.rst:4643 +msgid "" +"Make the entry given by *index* the active entry, redisplaying it with its " +"active colors, and deactivate any previously active entry. If *index* " +"selects no entry, or the selected entry is disabled, the menu ends up with " +"no active entry." +msgstr "" + +#: ../../library/tkinter.rst:4650 +msgid "" +"Invoke the action of the entry given by *index*, as if it had been clicked. " +"Nothing happens if the entry is disabled. If the entry has a *command* " +"associated with it, the result of that command is returned; otherwise the " +"result is an empty string." +msgstr "" + +#: ../../library/tkinter.rst:4658 +msgid "" +"Display the menu on the screen at the root-window coordinates *x* and *y*, " +"adjusting them if necessary so that the whole menu is visible. If the " +"*postcommand* option has been specified, it is evaluated before the menu is " +"posted." +msgstr "" + +#: ../../library/tkinter.rst:4665 +msgid "" +"Post the menu as a popup at the root-window coordinates *x* and *y*. If " +"*entry* is given, the menu is positioned so that this entry is displayed " +"under the pointer." +msgstr "" + +#: ../../library/tkinter.rst:4671 +msgid "" +"Unmap the menu so that it is no longer displayed, also unposting any posted " +"lower-level cascaded submenu. This has no effect on Windows and macOS, which" +" manage the unposting of menus themselves." +msgstr "" + +#: ../../library/tkinter.rst:4678 +msgid "" +"Return the x-coordinate, within the menu window, of the leftmost pixel of " +"the entry given by *index*." +msgstr "" + +#: ../../library/tkinter.rst:4685 +msgid "" +"Return the y-coordinate, within the menu window, of the topmost pixel of the" +" entry given by *index*." +msgstr "" + +#: ../../library/tkinter.rst:4691 +msgid "" +"A :class:`!Menubutton` widget displays a textual string, bitmap or image and" +" posts an associated :class:`Menu`, given by its *menu* option, when the " +"user presses it. Like a :class:`Label` it can show *text*, a *textvariable*," +" or an *image*, and the *direction* option controls where the menu appears " +"relative to the button. Inherits from :class:`Widget`. Refer to the Tk " +"``menubutton`` manual page for the full list of options." +msgstr "" + +#: ../../library/tkinter.rst:4703 +msgid "" +"A :class:`!Message` widget displays a non-interactive textual string, given " +"by the *text* option or linked to a variable through *textvariable*. Unlike " +"a :class:`Label`, it breaks the string into multiple lines in order to " +"produce a given aspect ratio, choosing line breaks at word boundaries, and " +"it can justify the text left, centered or right. Inherits from " +":class:`Widget`. Refer to the Tk ``message`` manual page for the full list " +"of options." +msgstr "" + +#: ../../library/tkinter.rst:4714 +msgid "" +"A helper subclass of :class:`Menubutton` that displays a pop-up menu of " +"mutually exclusive choices. *variable* is a :class:`Variable` kept in sync " +"with the selection, *value* is the initial choice, and *values* are the " +"remaining menu entries. The keyword argument *command* may be given a " +"callback that is invoked with the selected value, and the keyword argument " +"*name* sets the Tk widget name." +msgstr "" + +#: ../../library/tkinter.rst:4723 +msgid "Destroy the widget, also cleaning up the associated pop-up menu." +msgstr "" + +#: ../../library/tkinter.rst:4725 +msgid "Added support for the *name* keyword argument." +msgstr "" + +#: ../../library/tkinter.rst:4732 +msgid "" +"A :class:`!PanedWindow` is a geometry-manager widget that arranges any " +"number of child *panes* in a row (when *orient* is ``'horizontal'``) or a " +"column (when *orient* is ``'vertical'``). Each pane holds one widget, and " +"each pair of adjacent panes is separated by a movable *sash* that the user " +"can drag with the mouse to resize the widgets on either side of it. Inherits" +" from :class:`Widget`." +msgstr "" + +#: ../../library/tkinter.rst:4740 +msgid "" +"The *orient* option selects the layout direction, *sashwidth* sets the width" +" of each sash and *sashrelief* its relief. When *showhandle* is true a small" +" handle is drawn on each sash that the user can grab to drag it. Refer to " +"the Tk ``panedwindow`` manual page for the full list of options." +msgstr "" + +#: ../../library/tkinter.rst:4748 +msgid "" +"Add *child* to the panedwindow as a new pane, placed after any existing " +"panes. The keyword arguments specify per-pane management options for " +"*child*; they may be any of the options accepted by :meth:`paneconfigure`." +msgstr "" + +#: ../../library/tkinter.rst:4758 +msgid "" +"Remove the pane containing *child* from the panedwindow. All geometry " +"management options for *child* are forgotten. :meth:`forget` is an alias of " +":meth:`!remove`. This shadows the inherited geometry-manager " +":meth:`!forget`; use :meth:`~Pack.pack_forget`, :meth:`~Grid.grid_forget` or" +" :meth:`~Place.place_forget` to remove the widget itself from its manager." +msgstr "" + +#: ../../library/tkinter.rst:4767 +msgid "" +"Return a tuple of the widgets managed by the panedwindow, one per pane, in " +"order." +msgstr "" + +#: ../../library/tkinter.rst:4772 +msgid "" +"Return the current value of the management option *option* for the pane " +"containing *child*. *option* may be any value allowed by " +":meth:`paneconfigure`." +msgstr "" + +#: ../../library/tkinter.rst:4781 +msgid "" +"Query or modify the management options of the pane containing the widget " +"*tagOrId*. With no options, it returns a dictionary describing all of the " +"available options for the pane; given a single option name as a string, it " +"returns a description of that one option; otherwise it sets the given " +"options. The supported options include *after* and *before* (insert the pane" +" after or before another managed window), *height* and *width* (the outer " +"dimensions of the window, including any border), *minsize* (the minimum size" +" in the paned dimension), *padx* and *pady* (extra space to leave on each " +"side of the window), *sticky* (position or stretch the window within an " +"oversized pane, using a string of the characters ``n``, ``s``, ``e`` and " +"``w``), *hide* (hide the pane while keeping it in the list of panes) and " +"*stretch* (how extra space is allocated to the pane: one of ``'always'``, " +"``'first'``, ``'last'``, ``'middle'`` or ``'never'``). :meth:`paneconfig` is" +" an alias of :meth:`!paneconfigure`." +msgstr "" + +#: ../../library/tkinter.rst:4799 +msgid "" +"Identify the panedwindow component underneath the point given by *x* and " +"*y*, in window coordinates. If the point is over a sash or a sash handle, " +"the result is a two-element tuple containing the index of the sash or handle" +" and a word indicating whether it is over a sash or a handle, such as ``(0, " +"'sash')`` or ``(2, 'handle')``. If the point is over any other part of the " +"panedwindow, the result is an empty string." +msgstr "" + +#: ../../library/tkinter.rst:4810 +msgid "" +"Query or change the position of the sashes in the panedwindow. This is a " +"thin wrapper around the Tk ``sash`` subcommand; the convenience methods " +":meth:`sash_coord`, :meth:`sash_mark` and :meth:`sash_place` should normally" +" be used instead." +msgstr "" + +#: ../../library/tkinter.rst:4817 +msgid "" +"Return the current x and y coordinate pair for the sash given by *index*, " +"which must be an integer between 0 and one less than the number of panes in " +"the panedwindow. The coordinates returned are those of the top left corner " +"of the region containing the sash." +msgstr "" + +#: ../../library/tkinter.rst:4825 +msgid "" +"Record the current mouse position for the sash given by *index*, for use " +"together with later sash-drag operations to move the sash." +msgstr "" + +#: ../../library/tkinter.rst:4830 +msgid "Place the sash given by *index* at the coordinates *x* and *y*." +msgstr "" + +#: ../../library/tkinter.rst:4834 +msgid "" +"Query or change the position of the sash proxy, the \"ghost\" sash shown " +"while a sash is being dragged with non-opaque resizing. This is a thin " +"wrapper around the Tk ``proxy`` subcommand; the convenience methods " +":meth:`proxy_coord`, :meth:`proxy_forget` and :meth:`proxy_place` should " +"normally be used instead." +msgstr "" + +#: ../../library/tkinter.rst:4842 +msgid "" +"Return a tuple containing the x and y coordinates of the most recent proxy " +"location." +msgstr "" + +#: ../../library/tkinter.rst:4847 +msgid "Remove the proxy from the display." +msgstr "" + +#: ../../library/tkinter.rst:4851 +msgid "Place the proxy at the coordinates *x* and *y*." +msgstr "" + +#: ../../library/tkinter.rst:4856 +msgid "" +"A :class:`!Radiobutton` widget displays a textual string, bitmap or image " +"together with a diamond or circular indicator, and selects one choice out of" +" several. It has all the behavior of a simple button and, in addition, can " +"be selected: typically several radiobuttons share a single *variable*, and " +"selecting one sets that variable to the radiobutton's *value*; each " +"radiobutton also monitors the variable and automatically selects or " +"deselects itself when the variable changes. Inherits from :class:`Widget`. " +"In addition to the standard widget options, a radiobutton accepts the " +"options documented in the Tk ``radiobutton`` manual page, such as " +"*variable*, *value* and *command*." +msgstr "" + +#: ../../library/tkinter.rst:4871 +msgid "" +"Do just what would happen if the user pressed the radiobutton with the " +"mouse: select the button and invoke the associated command, if there is one." +" Return the result of the command, or an empty string if no command is " +"associated with the radiobutton. This is ignored if the radiobutton's state " +"is ``disabled``." +msgstr "" + +#: ../../library/tkinter.rst:4880 +msgid "" +"Select the radiobutton and set the associated variable to the value " +"corresponding to this widget." +msgstr "" + +#: ../../library/tkinter.rst:4885 +msgid "" +"Deselect the radiobutton and set the associated variable to an empty string." +" If this radiobutton was not currently selected, this has no effect." +msgstr "" + +#: ../../library/tkinter.rst:4891 +msgid "" +"Flash the radiobutton by redisplaying it several times, alternating between " +"the active and normal colors. At the end of the flash the radiobutton is " +"left in the same normal or active state as when the method was called. This " +"is ignored if the radiobutton's state is ``disabled``." +msgstr "" + +#: ../../library/tkinter.rst:4900 +msgid "" +"A :class:`!Scale` widget lets the user select a numerical value by moving a " +"slider along a trough. It can be oriented vertically or horizontally and can" +" optionally display a label and the current value. Inherits from " +":class:`Widget`." +msgstr "" + +#: ../../library/tkinter.rst:4906 +msgid "" +"In addition to the standard widget options, a scale accepts the options " +"documented in the Tk ``scale`` manual page, such as *from_*, *to*, " +"*resolution*, *orient*, *tickinterval*, *variable* and *command*. As " +"elsewhere in :mod:`!tkinter`, the leading ``-`` of the Tk option name is " +"dropped; *from* is spelled ``from_`` because :keyword:`from` is a Python " +"keyword." +msgstr "" + +#: ../../library/tkinter.rst:4913 +msgid "" +"With a non-integer *resolution*, see :ref:`numeric values and the locale " +"`." +msgstr "" + +#: ../../library/tkinter.rst:4918 +msgid "" +"Return the current value of the scale. The result is an integer if the " +"scale's *resolution* yields whole numbers, and a float otherwise." +msgstr "" + +#: ../../library/tkinter.rst:4924 +msgid "" +"Set the scale to *value*, moving the slider accordingly. This has no effect " +"if the scale is disabled." +msgstr "" + +#: ../../library/tkinter.rst:4929 +msgid "" +"Return a tuple ``(x, y)`` giving the pixel coordinates, relative to the " +"widget, of the point on the centerline of the trough that corresponds to " +"*value*. If *value* is omitted, the scale's current value is used." +msgstr "" + +#: ../../library/tkinter.rst:4936 +msgid "" +"Return a string describing the part of the scale at the pixel coordinates " +"*x*, *y*: ``'slider'``, ``'trough1'`` (the part of the trough above or to " +"the left of the slider), ``'trough2'`` (below or to the right of the " +"slider), or an empty string if the point is not over any of these elements." +msgstr "" + +#: ../../library/tkinter.rst:4945 +msgid "" +"A :class:`!Scrollbar` widget displays a slider and two arrows that let the " +"user scroll an associated widget, such as a :class:`Listbox`, :class:`Text`," +" :class:`Canvas` or :class:`Entry`. It is connected to the scrolled widget " +"by setting that widget's *xscrollcommand* or *yscrollcommand* option to the " +"scrollbar's :meth:`set` method, and the scrollbar's *command* option to the " +"scrolled widget's :meth:`~XView.xview` or :meth:`~YView.yview` method. " +"Inherits from :class:`Widget`." +msgstr "" + +#: ../../library/tkinter.rst:4956 +msgid "" +"Return the current scrollbar settings as a tuple ``(first, last)`` of two " +"fractions between 0 and 1, describing the portion of the document that is " +"currently visible, as last passed to :meth:`set`." +msgstr "" + +#: ../../library/tkinter.rst:4962 +msgid "" +"Set the scrollbar. *first* and *last* are fractions between 0 and 1 giving " +"the positions of the start and end of the visible portion of the associated " +"document. This method is normally registered as the scrolled widget's " +"*xscrollcommand* or *yscrollcommand* and called by that widget." +msgstr "" + +#: ../../library/tkinter.rst:4970 +msgid "" +"Mark the element *index* (one of ``'arrow1'``, ``'slider'`` or ``'arrow2'``)" +" as active, displaying it according to the *activebackground* and " +"*activerelief* options. If *index* is omitted, return the name of the " +"currently active element, or ``None`` if no element is active." +msgstr "" + +#: ../../library/tkinter.rst:4976 +msgid "The *index* argument is now optional." +msgstr "" + +#: ../../library/tkinter.rst:4981 +msgid "" +"Return a float indicating the fractional change in the scrollbar setting " +"that corresponds to moving the slider by *deltax* pixels horizontally (for " +"horizontal scrollbars) or *deltay* pixels vertically (for vertical " +"scrollbars)." +msgstr "" + +#: ../../library/tkinter.rst:4988 +msgid "" +"Return a float between 0 and 1 indicating where the point at pixel " +"coordinates *x*, *y* lies in the trough: 0 corresponds to the top or left of" +" the trough and 1 to the bottom or right." +msgstr "" + +#: ../../library/tkinter.rst:4994 +msgid "" +"Return the name of the element under the pixel coordinates *x*, *y* (such as" +" ``'arrow1'``), or an empty string if the point does not lie in any element " +"of the scrollbar." +msgstr "" + +#: ../../library/tkinter.rst:5001 +msgid "" +"A :class:`!Spinbox` widget is an :class:`Entry`-like widget with a pair of " +"up/down arrow buttons that let the user step through a range of values in " +"addition to editing the value directly. The set of values may be a numeric " +"range given by the *from_*, *to* and *increment* options, or an explicit " +"list of strings given by the *values* option (which takes precedence over " +"the range). Each time an arrow is invoked the *command* callback, if any, is" +" called; the *wrap* option controls whether stepping past either end of the " +"range wraps around to the other end; the *format* option specifies how " +"numeric values are formatted; and the *validate* option enables validation " +"of the entered text. Inherits from :class:`Widget` and :class:`XView`." +msgstr "" + +#: ../../library/tkinter.rst:5014 +msgid "" +"With a non-integer *increment*, see :ref:`numeric values and the locale " +"`." +msgstr "" + +#: ../../library/tkinter.rst:5017 +msgid "" +"Many of the methods take an *index* argument identifying a character in the " +"spinbox's string. As described in the Tk ``spinbox`` manual page, *index* " +"may be a numeric index (counting from 0), ``'anchor'`` (the selection anchor" +" point), ``'end'`` (just after the last character), ``'insert'`` (the " +"character just after the insertion cursor), ``'sel.first'`` or " +"``'sel.last'`` (the ends of the selection), or ``@x`` (the character " +"covering pixel x-coordinate *x* in the window)." +msgstr "" + +#: ../../library/tkinter.rst:5028 +msgid "Return the spinbox's string." +msgstr "" + +#: ../../library/tkinter.rst:5032 +msgid "" +"Insert the characters of the string *s* just before the character given by " +"*index*." +msgstr "" + +#: ../../library/tkinter.rst:5037 +msgid "" +"Delete one or more characters of the spinbox. *first* is the index of the " +"first character to delete, and *last* is the index of the character just " +"after the last one to delete. If *last* is omitted, a single character at " +"*first* is deleted." +msgstr "" + +#: ../../library/tkinter.rst:5049 +msgid "Return the numerical index corresponding to *index*, as a string." +msgstr "" + +#: ../../library/tkinter.rst:5053 +msgid "" +"Return a tuple of four integers ``(x, y, width, height)`` describing the " +"bounding box of the character given by *index*. *x* and *y* are the pixel " +"coordinates of the upper-left corner of the character relative to the " +"widget, and *width* and *height* are its size in pixels. The bounding box " +"may refer to a region outside the visible area of the window." +msgstr "" + +#: ../../library/tkinter.rst:5066 +msgid "" +"Return the name of the window element at the pixel coordinates *x*, *y*: one" +" of ``'buttondown'``, ``'buttonup'``, ``'entry'`` or ``'none'``." +msgstr "" + +#: ../../library/tkinter.rst:5071 +msgid "" +"Invoke the spin button given by *element*, either ``'buttonup'`` or " +"``'buttondown'``, triggering the action associated with it." +msgstr "" + +#: ../../library/tkinter.rst:5076 +msgid "" +"A thin wrapper around the Tk ``scan`` widget subcommand, used to implement " +"fast dragging of the view: ``scan('mark', x)`` records *x* and the current " +"view, and ``scan('dragto', x)`` adjusts the view relative to that mark. The " +":meth:`scan_mark` and :meth:`scan_dragto` methods wrap the two forms." +msgstr "" + +#: ../../library/tkinter.rst:5084 +msgid "" +"Record *x* and the current view in the spinbox window, for use with a later " +":meth:`scan_dragto` call. This is typically associated with a mouse button " +"press in the widget." +msgstr "" + +#: ../../library/tkinter.rst:5090 +msgid "" +"Adjust the view by 10 times the difference between *x* and the *x* passed to" +" the last :meth:`scan_mark` call. This is typically associated with mouse " +"motion events, producing the effect of dragging the spinbox at high speed " +"through the window." +msgstr "" + +#: ../../library/tkinter.rst:5097 +msgid "" +"A thin wrapper around the Tk ``selection`` widget subcommand, used to adjust" +" the selection within the spinbox. It has several forms depending on the " +"first argument, such as ``selection('adjust', index)``, " +"``selection('clear')``, ``selection('element', ?elem?)``, " +"``selection('from', index)``, ``selection('present')``, ``selection('range'," +" start, end)`` and ``selection('to', index)``. The :meth:`selection_adjust`," +" :meth:`selection_clear`, :meth:`selection_element`, :meth:`selection_from`," +" :meth:`selection_present`, :meth:`selection_range` and :meth:`selection_to`" +" methods wrap these forms." +msgstr "" + +#: ../../library/tkinter.rst:5111 +msgid "" +"Locate the end of the selection nearest to the character given by *index* " +"and adjust that end of the selection to be at *index* (including but not " +"going beyond *index*). The other end becomes the anchor point for future " +":meth:`selection_to` calls. If the selection is not currently in the " +"spinbox, a new selection is created to include the characters between " +"*index* and the most recent anchor point, inclusive." +msgstr "" + +#: ../../library/tkinter.rst:5122 +msgid "" +"Clear the selection if it is currently in this widget. If the selection is " +"not in this widget, the method has no effect." +msgstr "" + +#: ../../library/tkinter.rst:5127 +msgid "" +"This shadows the inherited :meth:`Misc.selection_clear`, which clears the X " +"selection; that method is not available on a :class:`Spinbox`." +msgstr "" + +#: ../../library/tkinter.rst:5133 +msgid "" +"Set or get the currently selected element. If *element* (one of " +"``'buttonup'``, ``'buttondown'`` or ``'none'``) is given, that spin button " +"is selected and displayed depressed; otherwise the name of the currently " +"selected element is returned." +msgstr "" + +#: ../../library/tkinter.rst:5140 +msgid "" +"Set the selection anchor point to just before the character given by " +"*index*, without changing the selection itself." +msgstr "" + +#: ../../library/tkinter.rst:5148 +msgid "" +"Return ``True`` if there are characters selected in the spinbox, ``False`` " +"otherwise." +msgstr "" + +#: ../../library/tkinter.rst:5156 +msgid "" +"Set the selection to include the characters starting with the one indexed by" +" *start* and ending with the one just before *end*. If *end* refers to the " +"same character as *start* or an earlier one, the selection is cleared." +msgstr "" + +#: ../../library/tkinter.rst:5166 +msgid "" +"Set the selection between *index* and the anchor point. If *index* is before" +" the anchor point, the selection runs from *index* up to but not including " +"the anchor point; if it is after, the selection runs from the anchor point " +"up to but not including *index*; if it is the same, nothing happens. The " +"anchor point is the one set by the most recent :meth:`selection_from` or " +":meth:`selection_adjust` call. If the selection is not in this widget, a new" +" selection is created using the most recent anchor point." +msgstr "" + +#: ../../library/tkinter.rst:5182 +msgid "" +"A :class:`!Text` widget displays and edits multi-line text. Portions of the " +"text may be styled with **tags**, particular positions may be annotated with" +" floating **marks**, and arbitrary images and other widgets may be embedded " +"in the text. The widget also provides an unlimited undo/redo mechanism and " +"supports peer widgets that share the same underlying data. Inherits from " +":class:`Widget`, :class:`XView` and :class:`YView`, so the view can be " +"scrolled horizontally and vertically with :meth:`~XView.xview` and " +":meth:`~YView.yview`. Refer to the Tk ``text`` manual page for the full list" +" of options." +msgstr "" + +#: ../../library/tkinter.rst:5193 +msgid "" +"Most of the methods take one or more *index* arguments that identify a " +"position within the text. As described in the Tk ``text`` manual page, an " +"index is a string consisting of a base, optionally followed by one or more " +"modifiers. The base may be ``'line.char'`` (line *line*, character *char*, " +"where lines are counted from 1 and characters within a line from 0; " +"``'line.end'`` refers to the newline ending the line), ``'end'`` (the " +"position just after the last newline), the name of a mark, ``'tag.first'`` " +"or ``'tag.last'`` (the first character tagged with *tag*, or the position " +"just after the last such character), the name of an embedded image or " +"window, or ``@x,y`` (the character covering pixel coordinates *x*, *y* in " +"the widget). A modifier such as ``'+5 chars'``, ``'-3 lines'``, " +"``'linestart'``, ``'lineend'``, ``'wordstart'`` or ``'wordend'`` adjusts the" +" index relative to its base; several modifiers may be combined and are " +"applied from left to right, for example ``'insert wordstart - 1 c'``." +msgstr "" + +#: ../../library/tkinter.rst:5211 +msgid "" +"Insert the string *chars* just before the character at *index* (if *index* " +"is ``'end'``, just before the final newline). By default the new text " +"inherits any tags present on both sides of the insertion point. If *args* is" +" given, it consists of alternating *tagList*, *chars* values: the preceding " +"*chars* receives exactly the tags listed (a tag list may be a single tag " +"name or a sequence of names), overriding the surrounding tags." +msgstr "" + +#: ../../library/tkinter.rst:5222 +msgid "" +"Delete the range of characters from *index1* up to but not including " +"*index2*. If *index2* is omitted, the single character at *index1* is " +"deleted. The widget always keeps a newline as its last character, so a " +"deletion that would remove it is adjusted accordingly." +msgstr "" + +#: ../../library/tkinter.rst:5230 +msgid "" +"Replace the range of characters from *index1* up to but not including " +"*index2* with *chars*. This is equivalent to a :meth:`delete` followed by an" +" :meth:`insert` at *index1*; *args* is interpreted as for :meth:`insert`." +msgstr "" + +#: ../../library/tkinter.rst:5239 +msgid "" +"Return the text from *index1* up to but not including *index2* as a string. " +"If *index2* is omitted, return the single character at *index1*. Embedded " +"images and windows are omitted from the result." +msgstr "" + +#: ../../library/tkinter.rst:5246 +msgid "" +"Return the position corresponding to *index* in the canonical " +"``'line.char'`` form." +msgstr "" + +#: ../../library/tkinter.rst:5251 +msgid "" +"Compare the positions of *index1* and *index2* using the relational operator" +" *op*, which must be one of ``'<'``, ``'<='``, ``'=='``, ``'>='``, ``'>'`` " +"or ``'!='``, and return the boolean result." +msgstr "" + +#: ../../library/tkinter.rst:5257 +msgid "" +"Count the number of items of the requested kinds between *index1* and " +"*index2*; the count is negative if *index1* is after *index2*. Each of " +"*options* names a kind of item to count: ``'chars'``, ``'displaychars'``, " +"``'displayindices'``, ``'displaylines'``, ``'indices'``, ``'lines'``, " +"``'xpixels'`` or ``'ypixels'`` (the default, used when no option is given, " +"is ``'indices'``). The pseudo-option ``'update'`` forces any out-of-date " +"layout information to be recalculated before the following options are " +"evaluated. When *return_ints* is true and a single counting option is given," +" return a plain integer; otherwise return a tuple with one integer per " +"counting option (or ``None`` if the result is empty)." +msgstr "" + +#: ../../library/tkinter.rst:5271 +msgid "Added the *return_ints* parameter." +msgstr "" + +#: ../../library/tkinter.rst:5277 +msgid "" +"Adjust the view so that the character given by *index* is visible. If it is " +"already visible the method has no effect; if it is a short distance out of " +"view the widget scrolls just enough to bring it to the nearest edge, " +"otherwise it scrolls to center *index* in the window." +msgstr "" + +#: ../../library/tkinter.rst:5284 +msgid "" +"Return a tuple ``(x, y, width, height)`` giving the bounding box, in pixels," +" of the visible part of the character at *index*, or ``None`` if that " +"character is not visible on the screen." +msgstr "" + +#: ../../library/tkinter.rst:5293 +msgid "" +"Return a tuple ``(x, y, width, height, baseline)`` describing the display " +"line that contains *index*: the first four values give the bounding box of " +"the line in pixels and *baseline* gives the offset of the baseline measured " +"down from the top of the area. Return ``None`` if that display line is not " +"visible on the screen." +msgstr "" + +#: ../../library/tkinter.rst:5301 +msgid "" +"Set the mark named *markName* to the position just before the character at " +"*index*, creating the mark if it does not already exist. A mark created this" +" way has right gravity by default." +msgstr "" + +#: ../../library/tkinter.rst:5307 +msgid "" +"Remove each of the marks named in *markNames*. The special ``insert`` and " +"``current`` marks may not be removed." +msgstr "" + +#: ../../library/tkinter.rst:5312 +msgid "Return a tuple of the names of all marks currently set in the widget." +msgstr "" + +#: ../../library/tkinter.rst:5316 +msgid "" +"If *direction* is omitted, return the gravity of mark *markName*, either " +"``'left'`` or ``'right'``. Otherwise set its gravity to *direction*. The " +"gravity determines on which side of the mark text inserted at the mark's " +"position appears: a mark with right gravity (the default) stays to the right" +" of such text." +msgstr "" + +#: ../../library/tkinter.rst:5325 +msgid "" +"Return the name of the first mark at or after *index*, or ``None`` if there " +"is none. When *index* is the name of a mark, the search starts just after " +"that mark." +msgstr "" + +#: ../../library/tkinter.rst:5332 +msgid "" +"Return the name of the last mark at or before *index*, or ``None`` if there " +"is none. When *index* is the name of a mark, the search starts just before " +"that mark." +msgstr "" + +#: ../../library/tkinter.rst:5339 +msgid "" +"Add the tag *tagName* to the range of characters from *index1* up to but not" +" including the next index in *args*. Further pairs of indices may follow in " +"*args* to tag additional ranges; a trailing single index tags just the " +"character at that index." +msgstr "" + +#: ../../library/tkinter.rst:5346 +msgid "" +"Remove the tag *tagName* from the characters from *index1* up to but not " +"including *index2* (or from the single character at *index1* if *index2* is " +"omitted). The tag itself continues to exist even if no characters carry it." +msgstr "" + +#: ../../library/tkinter.rst:5353 +msgid "" +"Delete each of the tags named in *tagNames*, removing them from all " +"characters and discarding their options and bindings." +msgstr "" + +#: ../../library/tkinter.rst:5361 +msgid "" +"Query or modify the configuration options of the tag *tagName*. This mirrors" +" :meth:`~Misc.configure`, except that it applies to a tag rather than to the" +" widget as a whole: with no options it returns a dictionary describing the " +"current options, otherwise it sets the given options. Defining a tag this " +"way also gives it a priority higher than any existing tag." +msgstr "" + +#: ../../library/tkinter.rst:5369 +msgid "" +"The supported tag options, all controlling the appearance of the tagged " +"text, are:" +msgstr "" + +#: ../../library/tkinter.rst:5375 +msgid "*foreground*" +msgstr "" + +#: ../../library/tkinter.rst:5376 +msgid "The color to use for the text." +msgstr "" + +#: ../../library/tkinter.rst:5378 +msgid "*background*" +msgstr "" + +#: ../../library/tkinter.rst:5379 +msgid "The color to use for the area behind the text." +msgstr "" + +#: ../../library/tkinter.rst:5381 +msgid "*fgstipple*, *bgstipple*" +msgstr "" + +#: ../../library/tkinter.rst:5382 +msgid "" +"Bitmaps used to stipple the foreground (text) and the background; only well " +"supported on X11." +msgstr "" + +#: ../../library/tkinter.rst:5385 +msgid "*borderwidth*" +msgstr "" + +#: ../../library/tkinter.rst:5386 +msgid "" +"The width of the border drawn around the text according to *relief* (default" +" ``0``)." +msgstr "" + +#: ../../library/tkinter.rst:5389 +msgid "*relief*" +msgstr "" + +#: ../../library/tkinter.rst:5390 +msgid "" +"The 3-D appearance of the text's border: ``'flat'`` (the default), " +"``'raised'``, ``'sunken'``, ``'ridge'``, ``'groove'`` or ``'solid'``." +msgstr "" + +#: ../../library/tkinter.rst:5393 +msgid "*offset*" +msgstr "" + +#: ../../library/tkinter.rst:5394 +msgid "" +"How far the text is raised above (or, if negative, lowered below) the " +"baseline, for superscripts and subscripts." +msgstr "" + +#: ../../library/tkinter.rst:5398 +msgid "Whether to underline the text." +msgstr "" + +#: ../../library/tkinter.rst:5400 +msgid "*underlinefg*" +msgstr "" + +#: ../../library/tkinter.rst:5401 +msgid "The color of the underline; it defaults to the text color." +msgstr "" + +#: ../../library/tkinter.rst:5403 +msgid "*overstrike*" +msgstr "" + +#: ../../library/tkinter.rst:5404 +msgid "Whether to draw a line through the middle of the text." +msgstr "" + +#: ../../library/tkinter.rst:5406 +msgid "*overstrikefg*" +msgstr "" + +#: ../../library/tkinter.rst:5407 +msgid "The color of the overstrike line; it defaults to the text color." +msgstr "" + +#: ../../library/tkinter.rst:5409 +msgid "*elide*" +msgstr "" + +#: ../../library/tkinter.rst:5410 +msgid "Whether the text is elided (hidden)." +msgstr "" + +#: ../../library/tkinter.rst:5413 +msgid "" +"How to justify the first character of a display line: ``'left'`` (the " +"default), ``'right'`` or ``'center'``." +msgstr "" + +#: ../../library/tkinter.rst:5416 +msgid "*wrap*" +msgstr "" + +#: ../../library/tkinter.rst:5417 +msgid "" +"How to wrap lines that are too long: ``'char'``, ``'word'`` or ``'none'``." +msgstr "" + +#: ../../library/tkinter.rst:5420 +msgid "*lmargin1*, *lmargin2*" +msgstr "" + +#: ../../library/tkinter.rst:5421 +msgid "" +"The indentation, in pixels, of the first display line of a logical line and " +"of the remaining display lines." +msgstr "" + +#: ../../library/tkinter.rst:5424 +msgid "*lmargincolor*" +msgstr "" + +#: ../../library/tkinter.rst:5425 +msgid "The color of the left margin area." +msgstr "" + +#: ../../library/tkinter.rst:5427 +msgid "*rmargin*" +msgstr "" + +#: ../../library/tkinter.rst:5428 +msgid "The right-hand margin, in pixels." +msgstr "" + +#: ../../library/tkinter.rst:5430 +msgid "*rmargincolor*" +msgstr "" + +#: ../../library/tkinter.rst:5431 +msgid "The color of the right margin area." +msgstr "" + +#: ../../library/tkinter.rst:5433 +msgid "*spacing1*, *spacing2*, *spacing3*" +msgstr "" + +#: ../../library/tkinter.rst:5434 +msgid "" +"Extra space, in pixels, above the first display line of a logical line, " +"between its display lines, and below its last display line." +msgstr "" + +#: ../../library/tkinter.rst:5437 +msgid "*tabs*" +msgstr "" + +#: ../../library/tkinter.rst:5438 +msgid "The set of tab stops, in the same form as the widget's *tabs* option." +msgstr "" + +#: ../../library/tkinter.rst:5440 +msgid "*tabstyle*" +msgstr "" + +#: ../../library/tkinter.rst:5441 +msgid "How tab stops are interpreted: ``'tabular'`` or ``'wordprocessor'``." +msgstr "" + +#: ../../library/tkinter.rst:5443 +msgid "*selectbackground*, *selectforeground*" +msgstr "" + +#: ../../library/tkinter.rst:5444 +msgid "" +"The background and foreground colors used for the text while it is selected." +msgstr "" + +#: ../../library/tkinter.rst:5449 +msgid "" +"Tk 8.6 added the *lmargincolor*, *overstrikefg*, *rmargincolor*, " +"*selectbackground*, *selectforeground* and *underlinefg* options." +msgstr "" + +#: ../../library/tkinter.rst:5452 +msgid ":meth:`tag_config` is an alias of :meth:`!tag_configure`." +msgstr "" + +#: ../../library/tkinter.rst:5456 +msgid "" +"Return the current value of the configuration option *option* for the tag " +"*tagName*." +msgstr "" + +#: ../../library/tkinter.rst:5461 +msgid "" +"If *index* is omitted, return a tuple of the names of all tags defined in " +"the widget; otherwise return only the names of the tags applied to the " +"character at *index*. The names are ordered from lowest to highest priority." +msgstr "" + +#: ../../library/tkinter.rst:5468 +msgid "" +"Return a tuple of indices describing all ranges of text tagged with " +"*tagName*. The result alternates start and end indices, so that elements " +"``2*i`` and ``2*i+1`` bound the *i*-th range." +msgstr "" + +#: ../../library/tkinter.rst:5475 +msgid "" +"Search forward from *index1* (up to *index2* if given) for the first range " +"of characters tagged with *tagName*, and return a two-element tuple of its " +"start and end indices, or an empty tuple if there is no such range." +msgstr "" + +#: ../../library/tkinter.rst:5482 +msgid "" +"Search backward from *index1* (down to *index2* if given) for the nearest " +"preceding range of characters tagged with *tagName*, and return a two-" +"element tuple of its start and end indices, or an empty tuple if there is no" +" such range." +msgstr "" + +#: ../../library/tkinter.rst:5489 +msgid "" +"Raise the priority of tag *tagName* so that it is just above the priority of" +" *aboveThis*, or to the highest priority of all tags if *aboveThis* is " +"omitted. When the display options of overlapping tags conflict, the higher-" +"priority tag wins." +msgstr "" + +#: ../../library/tkinter.rst:5497 +msgid "" +"Lower the priority of tag *tagName* so that it is just below the priority of" +" *belowThis*, or to the lowest priority of all tags if *belowThis* is " +"omitted." +msgstr "" + +#: ../../library/tkinter.rst:5503 +msgid "" +"Bind the event *sequence* on characters tagged with *tagName* to the " +"callback *func*, so that *func* is invoked when that event occurs over such " +"a character. If *add* is true the binding is added alongside any existing " +"bindings for *sequence*, otherwise it replaces them. Works like " +":meth:`~Misc.bind` and returns the identifier of the new binding." +msgstr "" + +#: ../../library/tkinter.rst:5513 +msgid "" +"Remove the bindings of the event *sequence* on characters tagged with " +"*tagName*. If *funcid* is given, only that binding (as returned by " +":meth:`tag_bind`) is removed and its callback is unregistered." +msgstr "" + +#: ../../library/tkinter.rst:5524 +msgid "" +"Embed an image at *index* and return the name assigned to this image " +"instance, which may then be used as an index or passed to the other " +"``image_*`` methods. The options, given in *cnf* and *kw*, include *image* " +"(the Tk image to display), *name* (a base name for the instance), *align*, " +"*padx* and *pady*." +msgstr "" + +#: ../../library/tkinter.rst:5533 +msgid "" +"Return the current value of the configuration option *option* for the " +"embedded image at *index*." +msgstr "" + +#: ../../library/tkinter.rst:5538 +msgid "" +"Query or modify the configuration options of the embedded image at *index*, " +"like :meth:`~Misc.configure` but applied to that image." +msgstr "" + +#: ../../library/tkinter.rst:5543 +msgid "Return a tuple of the names of all images embedded in the widget." +msgstr "" + +#: ../../library/tkinter.rst:5547 +msgid "" +"This shadows the inherited :meth:`Misc.image_names`, which returns the names" +" of all images in the Tcl interpreter; that method is not available on a " +":class:`Text`." +msgstr "" + +#: ../../library/tkinter.rst:5553 +msgid "" +"Embed a window (any widget) at *index*. The options, given in *cnf* and " +"*kw*, include *window* (the widget to embed), *create* (a callback that " +"creates the widget on demand), *align*, *stretch*, *padx* and *pady*. The " +"embedded widget must be a descendant of the text widget's parent." +msgstr "" + +#: ../../library/tkinter.rst:5561 +msgid "" +"Return the current value of the configuration option *option* for the " +"embedded window at *index*." +msgstr "" + +#: ../../library/tkinter.rst:5569 +msgid "" +"Query or modify the configuration options of the embedded window at *index*," +" like :meth:`~Misc.configure` but applied to that window." +msgstr "" + +#: ../../library/tkinter.rst:5572 +msgid ":meth:`window_config` is an alias of :meth:`!window_configure`." +msgstr "" + +#: ../../library/tkinter.rst:5576 +msgid "Return a tuple of the names of all windows embedded in the widget." +msgstr "" + +#: ../../library/tkinter.rst:5580 +msgid "" +"Low-level wrapper around the Tk ``edit`` widget command that controls the " +"undo/redo mechanism and the modified flag; *args* is the ``edit`` subcommand" +" and its arguments. The :meth:`!edit_\\*` methods below are thin wrappers " +"around it and are usually more convenient." +msgstr "" + +#: ../../library/tkinter.rst:5588 +msgid "" +"If *arg* is omitted, return the current state of the modified flag as true " +"or false; the flag is set automatically whenever the text is inserted or " +"deleted. Otherwise set the flag to the boolean *arg*." +msgstr "" + +#: ../../library/tkinter.rst:5595 +msgid "" +"Undo the most recent edit action, that is, all the inserts and deletes " +"recorded on the undo stack since the previous separator, and move it to the " +"redo stack. Raises :exc:`TclError` if the undo stack is empty. Has no effect" +" unless the *undo* option is true. Since Tk 9.0, returns a tuple of indices " +"delimiting the ranges of text that were changed." +msgstr "" + +#: ../../library/tkinter.rst:5605 +msgid "" +"Reapply the most recently undone edit action, provided no further edits have" +" been made since, and move it back to the undo stack. Raises :exc:`TclError`" +" if the redo stack is empty. Has no effect unless the *undo* option is true." +" Since Tk 9.0, returns a tuple of indices delimiting the ranges of text that" +" were changed." +msgstr "" + +#: ../../library/tkinter.rst:5614 +msgid "Clear the undo and redo stacks." +msgstr "" + +#: ../../library/tkinter.rst:5618 +msgid "" +"Push a separator onto the undo stack, marking a boundary between edit " +"actions for undo and redo. Has no effect unless the *undo* option is true. " +"Separators are inserted automatically when the *autoseparators* option is " +"true." +msgstr "" + +#: ../../library/tkinter.rst:5626 +msgid "" +"Search for *pattern* starting at *index* and return the index of the first " +"character of the first match, or an empty string if there is no match. " +"Searching stops at *stopindex* if given; otherwise it wraps around the ends " +"of the text until the starting position is reached again. The following " +"boolean keyword flags control the search: *forwards* or *backwards* select " +"the direction (forward is the default); *exact* (the default) or *regexp* " +"select literal or regular-expression matching; *nocase* makes the match " +"case-insensitive; and *elide* causes hidden text to be searched as well. If " +"*count* is a :class:`Variable`, the number of index positions in the match " +"is stored in it." +msgstr "" + +#: ../../library/tkinter.rst:5648 +msgid "" +"Scroll the widget by 10 times the difference between *x*, *y* and the " +"coordinates passed to the last :meth:`scan_mark` call. This is typically " +"bound to mouse motion events, producing the effect of dragging the text at " +"high speed through the window." +msgstr "" + +#: ../../library/tkinter.rst:5655 +msgid "" +"If *boolean* is omitted, return whether internal consistency checks of the " +"B-tree data structure are enabled. Otherwise enable or disable them. The " +"setting is shared by all text widgets and may noticeably slow down widgets " +"holding large amounts of text." +msgstr "" + +#: ../../library/tkinter.rst:5663 +msgid "" +"Return the contents of the widget from *index1* up to but not including " +"*index2* (or just the segment at *index1* if *index2* is omitted), including" +" text and information about marks, tags, images and windows. The result is a" +" list of ``(key, value, index)`` triples, where *key* is one of ``'text'``, " +"``'mark'``, ``'tagon'``, ``'tagoff'``, ``'image'`` or ``'window'``. By " +"default all kinds are reported; passing any of the keyword arguments *all*, " +"*text*, *mark*, *tag*, *image* or *window* as true restricts the dump to the" +" selected kinds. If *command* is given, it is called once per triple with " +"the three values as arguments and nothing is returned." +msgstr "" + +#: ../../library/tkinter.rst:5677 +msgid "" +"Create a peer text widget with the path name *newPathName* that shares this " +"widget's underlying data (text, marks, tags, images and the undo stack). " +"Changes made through any peer are reflected in all of them. By default the " +"peer covers the same lines as this widget; standard text options, including " +"*startline* and *endline*, may be given to override this." +msgstr "" + +#: ../../library/tkinter.rst:5689 +msgid "" +"Return a tuple of the path names of this widget's peers, not including the " +"widget itself." +msgstr "" + +#: ../../library/tkinter.rst:5696 +msgid "" +"Adjust the view so that the location given by *what* is visible. This is an " +"obsolete equivalent of :meth:`see`, which should be used instead." +msgstr "" + +#: ../../library/tkinter.rst:5702 +msgid "Variable classes" +msgstr "" + +#: ../../library/tkinter.rst:5706 +msgid "" +"The base class for the Tk variable wrappers. A Tk variable is a value stored" +" in the Tcl interpreter that can be linked to widgets through their " +"*variable* or *textvariable* options (see :ref:`coupling-widget-variables`)," +" so that changes propagate both ways: updating the variable updates every " +"widget bound to it, and a user editing such a widget updates the variable." +msgstr "" + +#: ../../library/tkinter.rst:5713 +msgid "" +"*master* is the widget whose Tcl interpreter owns the variable; if omitted, " +"the default root window is used. *value* is the initial value; if omitted, a" +" type-specific default is used. *name* is the name of the variable in the " +"Tcl interpreter; if omitted, a unique name of the form ``'PY_VARnum'`` is " +"generated. If *name* matches an existing variable and *value* is omitted, " +"the existing value is retained." +msgstr "" + +#: ../../library/tkinter.rst:5721 +msgid "" +"In most cases you should use one of the typed subclasses below -- " +":class:`StringVar`, :class:`IntVar`, :class:`DoubleVar` or " +":class:`BooleanVar` -- rather than :class:`!Variable` directly." +msgstr "" + +#: ../../library/tkinter.rst:5727 +msgid "" +"When a :class:`!Variable` is garbage collected, its Tcl variable is unset. " +"Keep a reference to it for as long as a widget is linked to it, for example " +"by storing it as an attribute rather than in a local variable. Otherwise Tk " +"recreates the Tcl variable to keep the widget working, but it is never unset" +" again, leaking one Tcl variable per dropped wrapper." +msgstr "" + +#: ../../library/tkinter.rst:5733 +msgid "" +"Two variables now compare equal (``==``) only when they have the same name, " +"are of the same class, and belong to the same Tcl interpreter." +msgstr "" + +#: ../../library/tkinter.rst:5739 +msgid "" +"Return the current value of the variable. For the base class the value is " +"returned as a string; the typed subclasses convert it to the appropriate " +"Python type." +msgstr "" + +#: ../../library/tkinter.rst:5748 +msgid "" +"Set the variable to *value*. :meth:`initialize` is an alias of :meth:`!set`." +msgstr "" + +#: ../../library/tkinter.rst:5751 ../../library/tkinter.rst:5882 +msgid "The *initialize* spelling." +msgstr "" + +#: ../../library/tkinter.rst:5756 +msgid "" +"Register *callback* to be called when the variable is accessed according to " +"*mode*. *mode* is one of the strings ``'array'``, ``'read'``, ``'write'`` or" +" ``'unset'``, or a list or tuple of such strings." +msgstr "" + +#: ../../library/tkinter.rst:5761 +msgid "" +"When triggered, *callback* is called with three arguments: the name of the " +"Tcl variable, an index (or an empty string if the variable is not an element" +" of an array), and the *mode* that triggered the call." +msgstr "" + +#: ../../library/tkinter.rst:5765 +msgid "" +"Return the internal name of the registered callback, which can be passed to " +":meth:`trace_remove`." +msgstr "" + +#: ../../library/tkinter.rst:5772 +msgid "" +"Remove a trace callback from the variable. *mode* must match the *mode* that" +" was passed to :meth:`trace_add`, and *cbname* is the callback name returned" +" by :meth:`trace_add`." +msgstr "" + +#: ../../library/tkinter.rst:5780 +msgid "" +"Return a list of ``(modes, cbname)`` pairs describing all traces currently " +"set on the variable, where *modes* is a tuple of mode strings and *cbname* " +"is the internal callback name." +msgstr "" + +#: ../../library/tkinter.rst:5791 +msgid "" +"Register *callback* to be called when the variable is accessed according to " +"*mode*. *mode* is one of the strings ``'r'``, ``'w'`` or ``'u'``, for read, " +"write or unset. Return the internal name of the registered callback. " +":meth:`trace` is an alias of :meth:`!trace_variable`." +msgstr "" + +#: ../../library/tkinter.rst:5798 +msgid "" +"Use :meth:`trace_add` instead. This method wraps a Tcl feature that was " +"removed in Tcl 9.0." +msgstr "" + +#: ../../library/tkinter.rst:5804 +msgid "" +"Remove the trace callback named *cbname* registered for *mode* with " +":meth:`trace_variable`." +msgstr "" + +#: ../../library/tkinter.rst:5807 +msgid "" +"Use :meth:`trace_remove` instead. This method wraps a Tcl feature that was " +"removed in Tcl 9.0." +msgstr "" + +#: ../../library/tkinter.rst:5813 +msgid "" +"Return a list of ``(mode, cbname)`` pairs for all traces set on the variable" +" with :meth:`trace_variable`." +msgstr "" + +#: ../../library/tkinter.rst:5816 +msgid "" +"Use :meth:`trace_info` instead. This method wraps a Tcl feature that was " +"removed in Tcl 9.0." +msgstr "" + +#: ../../library/tkinter.rst:5823 +msgid "" +"A :class:`Variable` subclass that holds a string. The default value is " +"``''``." +msgstr "" + +#: ../../library/tkinter.rst:5828 +msgid "Return the value of the variable as a :class:`str`." +msgstr "" + +#: ../../library/tkinter.rst:5833 +msgid "" +"A :class:`Variable` subclass that holds an integer. The default value is " +"``0``." +msgstr "" + +#: ../../library/tkinter.rst:5838 +msgid "Return the value of the variable as an :class:`int`." +msgstr "" + +#: ../../library/tkinter.rst:5843 +msgid "" +"A :class:`Variable` subclass that holds a float. The default value is " +"``0.0``." +msgstr "" + +#: ../../library/tkinter.rst:5848 +msgid "Return the value of the variable as a :class:`float`." +msgstr "" + +#: ../../library/tkinter.rst:5854 +msgid "" +"A floating-point value is always parsed with a period (``.``) as the decimal" +" separator, but :class:`Spinbox`, :class:`Scale` and :class:`ttk.Spinbox " +"` format it according to the ``LC_NUMERIC`` locale. " +"Under a locale that uses a comma they produce a value that :meth:`get` " +"cannot read, raising :exc:`TclError`. Set ``LC_NUMERIC`` to a locale that " +"uses a period (such as ``'C'``) to avoid this." +msgstr "" + +#: ../../library/tkinter.rst:5865 +msgid "" +"A :class:`Variable` subclass that holds a boolean. The default value is " +"``False``." +msgstr "" + +#: ../../library/tkinter.rst:5870 +msgid "" +"Return the value of the variable as a :class:`bool`. Raise a " +":exc:`ValueError` if the value cannot be interpreted as a boolean." +msgstr "" + +#: ../../library/tkinter.rst:5879 +msgid "" +"Set the variable to *value*, converting it to a boolean. :meth:`initialize` " +"is an alias of :meth:`!set`." +msgstr "" + +#: ../../library/tkinter.rst:5887 +msgid "Image classes" +msgstr "" + +#: ../../library/tkinter.rst:5891 +msgid "" +"Base class for Tk images. *imgtype* is the Tk image type, one of ``'photo'``" +" or ``'bitmap'``. An image is a named object that can be displayed by " +"widgets through their *image* option; deleting all references to the " +":class:`!Image` object deletes the underlying Tk image. Usually you create a" +" :class:`PhotoImage` or :class:`BitmapImage` rather than an :class:`!Image` " +"directly." +msgstr "" + +#: ../../library/tkinter.rst:5899 +msgid "" +"The image's configuration options are given by *cnf* and *kw* and may be " +"queried and changed later with the mapping protocol (using ``image[key]``) " +"or with the :meth:`configure` method." +msgstr "" + +#: ../../library/tkinter.rst:5908 +msgid "" +"Modify one or more configuration options of the image. The valid options " +"depend on the image type; see :class:`PhotoImage` and :class:`BitmapImage`. " +":meth:`config` is an alias of :meth:`!configure`." +msgstr "" + +#: ../../library/tkinter.rst:5915 +msgid "Return the height of the image, in pixels." +msgstr "" + +#: ../../library/tkinter.rst:5919 +msgid "Return the width of the image, in pixels." +msgstr "" + +#: ../../library/tkinter.rst:5923 +msgid "" +"Return the type of the image, that is the value of *imgtype* with which it " +"was created (for example ``'photo'`` or ``'bitmap'``)." +msgstr "" + +#: ../../library/tkinter.rst:5929 +msgid "" +"A full-color image (the Tk ``photo`` image type), stored internally with a " +"varying degree of transparency per pixel. It can read and write GIF, PPM/PGM" +" and (in Tk 8.6 and later) PNG files, read SVG files (in Tk 9.0 and later), " +"and be drawn in widgets. Inherits from :class:`Image`." +msgstr "" + +#: ../../library/tkinter.rst:5935 +msgid "" +"The configuration options include *data* (the image contents as a string), " +"*file* (the name of a file to read the contents from), *format* (the name of" +" the file format handler), *width* and *height* (the size of the image, used" +" when building it up piece by piece), *gamma* and *palette*." +msgstr "" + +#: ../../library/tkinter.rst:5942 +msgid "" +"Blank the image; that is, set the entire image to have no data, so that it " +"is displayed as transparent and the background of whatever window it is " +"displayed in shows through." +msgstr "" + +#: ../../library/tkinter.rst:5948 +msgid "Return the current value of the configuration option *option*." +msgstr "" + +#: ../../library/tkinter.rst:5952 +msgid "Return a new :class:`PhotoImage` with a copy of this image." +msgstr "" + +#: ../../library/tkinter.rst:5954 +msgid "" +"*from_coords* specifies a rectangular sub-region of the source image to be " +"copied. It must be a tuple or a list of 1 to 4 integers ``(x1, y1, x2, " +"y2)``. ``(x1, y1)`` and ``(x2, y2)`` specify diagonally opposite corners of " +"the rectangle. If *x2* and *y2* are not specified, they default to the " +"bottom-right corner of the source image. The pixels copied include the left " +"and top edges of the rectangle but not the bottom or right edges. If " +"*from_coords* is not given, the whole source image is copied." +msgstr "" + +#: ../../library/tkinter.rst:5965 ../../library/tkinter.rst:5997 +msgid "" +"If *zoom* or *subsample* are specified, the image is transformed as in the " +":meth:`zoom` or :meth:`subsample` methods. The value must be a single " +"integer or a pair of integers." +msgstr "" + +#: ../../library/tkinter.rst:5969 +msgid "Added the *from_coords*, *zoom* and *subsample* parameters." +msgstr "" + +#: ../../library/tkinter.rst:5977 +msgid "" +"Copy a region from *sourceImage* (which must be a :class:`PhotoImage`) into " +"this image, possibly with pixel zooming and/or subsampling. If no options " +"are specified, the whole of *sourceImage* is copied into this image, " +"starting at coordinates ``(0, 0)``." +msgstr "" + +#: ../../library/tkinter.rst:5982 ../../library/tkinter.rst:6094 +#: ../../library/tkinter.rst:6150 +msgid "" +"*from_coords* specifies a rectangular sub-region of the source image to be " +"copied, as in the :meth:`copy` method." +msgstr "" + +#: ../../library/tkinter.rst:5985 +msgid "" +"*to* specifies a rectangular sub-region of the destination image to be " +"affected. It must be a tuple or a list of 1 to 4 integers ``(x1, y1, x2, " +"y2)``. If *x2* and *y2* are not specified, they default to ``(x1, y1)`` plus" +" the size of the source region (after subsampling and zooming, if " +"specified). If *x2* and *y2* are specified, the source region is replicated " +"if necessary to fill the destination region in a tiled fashion." +msgstr "" + +#: ../../library/tkinter.rst:5993 +msgid "" +"If *shrink* is true, the size of the destination image is reduced, if " +"necessary, so that the region being copied into is at the bottom-right " +"corner of the image." +msgstr "" + +#: ../../library/tkinter.rst:6001 +msgid "" +"*compositingrule* specifies how transparent pixels in the source image are " +"combined with the destination image. With ``'overlay'`` (the default), the " +"old contents of the destination image remain visible, as if the source image" +" were printed on a piece of transparent film and placed over the top of the " +"destination. With ``'set'``, the old contents of the destination image are " +"discarded and the source image is used as-is." +msgstr "" + +#: ../../library/tkinter.rst:6015 +msgid "Return the image data." +msgstr "" + +#: ../../library/tkinter.rst:6017 +msgid "" +"*format* specifies the name of the image file format handler to use. If it " +"is not given, the data is returned as a tuple (one element per row) of " +"strings containing space-separated (one element per pixel/column) colors in " +"``#RRGGBB`` format." +msgstr "" + +#: ../../library/tkinter.rst:6022 +msgid "" +"*from_coords* specifies a rectangular region of the image to be returned. It" +" must be a tuple or a list of 1 to 4 integers ``(x1, y1, x2, y2)``. If only " +"*x1* and *y1* are specified, the region extends from ``(x1, y1)`` to the " +"bottom-right corner of the image. If all four coordinates are given, they " +"specify diagonally opposite corners of the region, including ``(x1, y1)`` " +"and excluding ``(x2, y2)``. If *from_coords* is not given, the whole image " +"is returned." +msgstr "" + +#: ../../library/tkinter.rst:6030 ../../library/tkinter.rst:6133 +msgid "" +"If *background* is specified, the data does not contain any transparency " +"information; in all transparent pixels the color is replaced by the " +"specified color." +msgstr "" + +#: ../../library/tkinter.rst:6034 ../../library/tkinter.rst:6137 +msgid "" +"If *grayscale* is true, the data does not contain color information; all " +"pixel data is transformed into grayscale." +msgstr "" + +#: ../../library/tkinter.rst:6042 +msgid "" +"Return the color of the pixel at coordinates (*x*, *y*) as an ``(r, g, b)`` " +"tuple of three integers between 0 and 255, representing the red, green and " +"blue components respectively." +msgstr "" + +#: ../../library/tkinter.rst:6048 +msgid "" +"Set pixels of the image to the colors given in *data*, which must be a " +"string or a nested sequence of horizontal rows of pixel colors (for example " +"``\"{red green} {blue yellow}\"``)." +msgstr "" + +#: ../../library/tkinter.rst:6052 +msgid "" +"*to* specifies the coordinates of the region of the image into which the " +"data are copied. It must be a tuple or a list of 2 or 4 integers ``(x1, " +"y1)`` or ``(x1, y1, x2, y2)`` giving the top-left corner, and optionally the" +" bottom-right corner, of the region. The default position is ``(0, 0)``." +msgstr "" + +#: ../../library/tkinter.rst:6062 +msgid "Read image data from the file named *filename* into the image." +msgstr "" + +#: ../../library/tkinter.rst:6064 +msgid "*format* specifies the format of the image data in the file." +msgstr "" + +#: ../../library/tkinter.rst:6066 +msgid "" +"*from_coords* specifies a rectangular sub-region of the image file data to " +"be copied to the destination image. It must be a tuple or a list of 1 to 4 " +"integers ``(x1, y1, x2, y2)``. If only *x1* and *y1* are specified, the " +"region extends from ``(x1, y1)`` to the bottom-right corner of the image in " +"the file. If all four coordinates are given, they specify diagonally " +"opposite corners of the region. If *from_coords* is not given, the whole of " +"the image in the file is read." +msgstr "" + +#: ../../library/tkinter.rst:6076 +msgid "" +"*to* specifies the coordinates of the top-left corner of the region of the " +"image into which the data are read. The default is ``(0, 0)``." +msgstr "" + +#: ../../library/tkinter.rst:6080 +msgid "" +"If *shrink* is true, the size of the image is reduced, if necessary, so that" +" the region into which the file data are read is at the bottom-right corner " +"of the image." +msgstr "" + +#: ../../library/tkinter.rst:6089 +msgid "" +"Return a new :class:`PhotoImage` based on this image but using only every " +"*x*-th pixel in the X direction and every *y*-th pixel in the Y direction. " +"If *y* is not given, it defaults to the same value as *x*." +msgstr "" + +#: ../../library/tkinter.rst:6097 ../../library/tkinter.rst:6153 +msgid "Added the *from_coords* parameter." +msgstr "" + +#: ../../library/tkinter.rst:6103 +msgid "" +"Return ``True`` if the pixel at coordinates (*x*, *y*) is fully transparent," +" ``False`` otherwise." +msgstr "" + +#: ../../library/tkinter.rst:6111 +msgid "" +"Make the pixel at coordinates (*x*, *y*) fully transparent if *boolean* is " +"true, fully opaque otherwise." +msgstr "" + +#: ../../library/tkinter.rst:6120 +msgid "Write image data from the image to the file named *filename*." +msgstr "" + +#: ../../library/tkinter.rst:6122 +msgid "" +"*format* specifies the name of the image file format handler to use. If it " +"is not given, the format is guessed from the file extension." +msgstr "" + +#: ../../library/tkinter.rst:6125 +msgid "" +"*from_coords* specifies a rectangular region of the image to be written. It " +"must be a tuple or a list of 1 to 4 integers ``(x1, y1, x2, y2)``. If only " +"*x1* and *y1* are specified, the region extends from ``(x1, y1)`` to the " +"bottom-right corner of the image. If all four coordinates are given, they " +"specify diagonally opposite corners of the region. If *from_coords* is not " +"given, the whole image is written." +msgstr "" + +#: ../../library/tkinter.rst:6140 +msgid "Added the *background* and *grayscale* parameters." +msgstr "" + +#: ../../library/tkinter.rst:6146 +msgid "" +"Return a new :class:`PhotoImage` with this image magnified by a factor of " +"*x* in the X direction and *y* in the Y direction. If *y* is not given, it " +"defaults to the same value as *x*." +msgstr "" + +#: ../../library/tkinter.rst:6160 +msgid "" +"A two-color image (the Tk ``bitmap`` image type) created from an X11 bitmap." +" Each pixel displays a foreground color, a background color, or nothing " +"(producing a transparent effect). Inherits from :class:`Image`." +msgstr "" + +#: ../../library/tkinter.rst:6165 +msgid "" +"The configuration options are *data* or *file* (the source bitmap, given as " +"a string in X11 bitmap format or as the name of a file in that format), " +"*maskdata* or *maskfile* (the mask bitmap, in the same forms), and " +"*foreground* and *background* (the two colors). For pixels where the mask is" +" zero the image displays nothing; for other pixels it displays the " +"foreground color where the source is one and the background color where the " +"source is zero. If *background* is set to an empty string, the background " +"pixels are transparent." +msgstr "" + +#: ../../library/tkinter.rst:6175 +msgid "" +":class:`!BitmapImage` has no methods of its own beyond those inherited from " +":class:`Image`." +msgstr "" + +#: ../../library/tkinter.rst:6180 +msgid "Other classes" +msgstr "" + +#: ../../library/tkinter.rst:6184 +msgid "" +"A container for the attributes of an event passed to a callback bound with " +":meth:`Misc.bind`. An :class:`!Event` instance has the following attributes," +" each corresponding to a field of the underlying Tk event; depending on the " +"event type, some attributes may be set to the string ``'??'`` to indicate " +"that they are not meaningful. See :ref:`bindings-and-events`." +msgstr "" + +#: ../../library/tkinter.rst:6194 +msgid "The serial number of the event." +msgstr "" + +#: ../../library/tkinter.rst:6198 +msgid "The mouse button that was pressed or released (for button events)." +msgstr "" + +#: ../../library/tkinter.rst:6202 +msgid "Whether the window has the focus (for ``Enter`` and ``Leave`` events)." +msgstr "" + +#: ../../library/tkinter.rst:6207 +msgid "" +"The new height and width of the window (for ``Configure`` and ``Expose`` " +"events)." +msgstr "" + +#: ../../library/tkinter.rst:6212 +msgid "The keycode of the key that was pressed or released." +msgstr "" + +#: ../../library/tkinter.rst:6216 +msgid "" +"The state of the event, as a number (for most events) or a string (for " +"``Visibility`` events)." +msgstr "" + +#: ../../library/tkinter.rst:6221 +msgid "The timestamp of the event, in milliseconds." +msgstr "" + +#: ../../library/tkinter.rst:6226 +msgid "The pointer position relative to the widget, in pixels." +msgstr "" + +#: ../../library/tkinter.rst:6231 +msgid "" +"The pointer position relative to the top-left corner of the screen, in " +"pixels." +msgstr "" + +#: ../../library/tkinter.rst:6236 +msgid "The character typed, as a string (for key events)." +msgstr "" + +#: ../../library/tkinter.rst:6240 +msgid "``True`` if the event was sent by another application." +msgstr "" + +#: ../../library/tkinter.rst:6244 +msgid "The symbolic name of the key that was pressed or released." +msgstr "" + +#: ../../library/tkinter.rst:6248 +msgid "The numeric value of :attr:`keysym`." +msgstr "" + +#: ../../library/tkinter.rst:6252 +msgid "The :class:`EventType` of the event." +msgstr "" + +#: ../../library/tkinter.rst:6256 +msgid "The widget on which the event occurred." +msgstr "" + +#: ../../library/tkinter.rst:6260 +msgid "The amount the mouse wheel was rotated (for ``MouseWheel`` events)." +msgstr "" + +#: ../../library/tkinter.rst:6265 +msgid "" +"An :class:`enum.StrEnum` enumerating the Tk event types, used as the value " +"of :attr:`Event.type`. Its members include, among others, ``KeyPress``, " +"``KeyRelease``, ``ButtonPress``, ``ButtonRelease``, ``Motion``, ``Enter``, " +"``Leave``, ``FocusIn``, ``FocusOut``, ``Configure``, ``Map``, ``Unmap``, " +"``Expose``, ``Destroy`` and ``MouseWheel``." +msgstr "" + +#: ../../library/tkinter.rst:6278 +msgid "" +"Internal helper that wraps a Python callback so that it can be invoked from " +"Tcl. *func* is the Python function, *subst* is an optional function that " +"pre-processes the Tcl arguments, and *widget* is the widget used for error " +"reporting. Instances are created automatically by :meth:`Misc.register`; " +"this class is not normally used directly." +msgstr "" + +#: ../../library/tkinter.rst:6288 +msgid "Module-level functions" +msgstr "" + +#: ../../library/tkinter.rst:6292 +msgid "" +"The :func:`Tcl` function is a factory function which creates an object much " +"like that created by the :class:`Tk` class, except that it does not " +"initialize the Tk subsystem. This is most often useful when driving the Tcl " +"interpreter in an environment where one doesn't want to create extraneous " +"toplevel windows, or where one cannot (such as Unix/Linux systems without an" +" X server). An object created by the :func:`Tcl` object can have a Toplevel " +"window created (and the Tk subsystem initialized) by calling its " +":meth:`~Tk.loadtk` method." +msgstr "" + +#: ../../library/tkinter.rst:6304 +msgid "" +"Inhibit the creation of an implicit default root window. Afterwards " +":mod:`!tkinter` no longer creates a shared default root automatically, and " +"operations that rely on one --- such as constructing a widget without an " +"explicit *master* --- raise a :exc:`RuntimeError`. Call this early in larger" +" applications to make the root window explicit." +msgstr "" + +#: ../../library/tkinter.rst:6312 +msgid "" +"Run the Tk main event loop on the default root window until all windows are " +"destroyed. Equivalent to calling :meth:`Misc.mainloop` on the default root." +msgstr "" + +#: ../../library/tkinter.rst:6318 +msgid "" +"Convert the Tcl boolean string *s* (one of ``'1'``, ``'true'``, ``'yes'``, " +"``'on'`` and similar, or their false counterparts) to a Python " +":class:`bool`. Raise :exc:`TclError` for an invalid value." +msgstr "" + +#: ../../library/tkinter.rst:6325 +msgid "" +"Convert *s* to a floating-point number. This is the built-in :class:`float`." +msgstr "" + +#: ../../library/tkinter.rst:6330 +msgid "Convert *s* to an integer. This is the built-in :class:`int`." +msgstr "" + +#: ../../library/tkinter.rst:6335 +msgid "" +"Return the names of all existing images in the default root's interpreter." +msgstr "" + +#: ../../library/tkinter.rst:6339 +msgid "" +"Return the available image types (such as ``'photo'`` and ``'bitmap'``) in " +"the default root's interpreter." +msgstr "" + +#: ../../library/tkinter.rst:6346 +msgid "File handlers" +msgstr "" + +#: ../../library/tkinter.rst:6348 +msgid "" +"Tk allows you to register and unregister a callback function which will be " +"called from the Tk mainloop when I/O is possible on a file descriptor. Only " +"one handler may be registered per file descriptor. Example code::" +msgstr "" +"Tk 允许为文件操作注册和注销一个回调函数,当对文件描述符进行 I/O 时,Tk " +"的主循环会调用该回调函数。每个文件描述符只能注册一个处理程序。示例代码如下:" + +#: ../../library/tkinter.rst:6352 +msgid "" +"import tkinter\n" +"widget = tkinter.Tk()\n" +"mask = tkinter.READABLE | tkinter.WRITABLE\n" +"widget.tk.createfilehandler(file, mask, callback)\n" +"...\n" +"widget.tk.deletefilehandler(file)" +msgstr "" +"import tkinter\n" +"widget = tkinter.Tk()\n" +"mask = tkinter.READABLE | tkinter.WRITABLE\n" +"widget.tk.createfilehandler(file, mask, callback)\n" +"...\n" +"widget.tk.deletefilehandler(file)" + +#: ../../library/tkinter.rst:6359 +msgid "This feature is not available on Windows." +msgstr "在 Windows 系统中不可用。" + +#: ../../library/tkinter.rst:6361 +msgid "" +"Since you don't know how many bytes are available for reading, you may not " +"want to use the :class:`~io.BufferedIOBase` or :class:`~io.TextIOBase` " +":meth:`~io.BufferedIOBase.read` or :meth:`~io.IOBase.readline` methods, " +"since these will insist on reading a predefined number of bytes. For " +"sockets, the :meth:`~socket.socket.recv` or :meth:`~socket.socket.recvfrom` " +"methods will work fine; for other files, use raw reads or " +"``os.read(file.fileno(), maxbytecount)``." +msgstr "" +"由于不知道可读取多少字节,你可能不希望使用 :class:`~io.BufferedIOBase` 或 :class:`~io.TextIOBase` " +"的 :meth:`~io.BufferedIOBase.read` 或 :meth:`~io.IOBase.readline` " +"方法,因为这些方法必须读取预定数量的字节。 对于套接字,可使用 :meth:`~socket.socket.recv` 或 " +":meth:`~socket.socket.recvfrom` 方法;对于其他文件,可使用原始读取方法或 " +"``os.read(file.fileno(), maxbytecount)``。" + +#: ../../library/tkinter.rst:6372 +msgid "" +"Registers the file handler callback function *func*. The *file* argument may" +" either be an object with a :meth:`~io.IOBase.fileno` method (such as a file" +" or socket object), or an integer file descriptor. The *mask* argument is an" +" ORed combination of any of the three constants below. The callback is " +"called as follows::" +msgstr "" +"注册文件处理程序的回调函数 *func*。 *file* 参数可以是具备 :meth:`~io.IOBase.fileno` " +"方法的对象(例如文件或套接字对象),也可以是整数文件描述符。 *mask* 参数是下述三个常量的逻辑“或”组合。回调函数将用以下格式调用:" + +#: ../../library/tkinter.rst:6378 +msgid "callback(file, mask)" +msgstr "callback(file, mask)" + +#: ../../library/tkinter.rst:6383 +msgid "Unregisters a file handler." +msgstr "注销文件处理函数。" + +#: ../../library/tkinter.rst:6390 +msgid "Constants used in the *mask* arguments." +msgstr " *mask* 参数用到的常量。" + +#: ../../library/tkinter.rst:6394 +msgid "Constants" +msgstr "" + +#: ../../library/tkinter.rst:6396 +msgid "" +"The following symbolic constants are available in both the :mod:`!tkinter` " +"and :mod:`!tkinter.constants` namespaces." +msgstr "" + +#: ../../library/tkinter.rst:6403 +msgid "Truthy values, all equal to the integer ``1``." +msgstr "" + +#: ../../library/tkinter.rst:6409 +msgid "Falsy values, all equal to the integer ``0``." +msgstr "" + +#: ../../library/tkinter.rst:6424 +msgid "" +"Compass directions (``'n'``, ``'s'``, ``'e'``, ``'w'`` and the diagonals and" +" edges) plus ``CENTER`` (``'center'``), used as values for the *anchor* and " +"*sticky* options and by methods such as :meth:`Misc.grid_anchor`." +msgstr "" + +#: ../../library/tkinter.rst:6433 +msgid "" +"Sides for the *side* option of the packer (see :meth:`Pack.pack_configure`)." +msgstr "" + +#: ../../library/tkinter.rst:6440 +msgid "" +"Values for the *fill* option of the packer: ``'x'``, ``'y'``, ``'both'`` or " +"``'none'``." +msgstr "" + +#: ../../library/tkinter.rst:6450 +msgid "Values for the *relief* option, which controls a widget's 3-D border." +msgstr "" + +#: ../../library/tkinter.rst:6455 +msgid "" +"Values for the *orient* option of widgets such as :class:`Scale`, " +":class:`Scrollbar` and :class:`PanedWindow`." +msgstr "" + +#: ../../library/tkinter.rst:6461 +msgid "" +"Values for the *wrap* option of the :class:`Text` widget, selecting line " +"wrapping on character or word boundaries." +msgstr "" + +#: ../../library/tkinter.rst:6466 +msgid "The text-alignment value ``'baseline'``." +msgstr "" + +#: ../../library/tkinter.rst:6471 +msgid "" +"Values for the *bordermode* option of the placer (see " +":meth:`Place.place_configure`)." +msgstr "" + +#: ../../library/tkinter.rst:6482 +msgid "" +"Symbolic indices used by the :class:`Text`, :class:`Entry`, :class:`Listbox`" +" and :class:`Canvas` widgets, such as ``'insert'`` (the insertion cursor), " +"``'current'``, ``'end'``, ``'anchor'`` and the bounds of the selection " +"(``'sel.first'`` and ``'sel.last'``)." +msgstr "" + +#: ../../library/tkinter.rst:6489 +msgid "" +"The special tag ``'all'``, which matches every item of a :class:`Canvas` or " +"every character of a :class:`Text` (for example ``canvas.delete(ALL)``)." +msgstr "" + +#: ../../library/tkinter.rst:6497 +msgid "Values for the *state* option of various widgets and items." +msgstr "" + +#: ../../library/tkinter.rst:6505 +msgid "" +"Menu entry types, used as the *itemType* argument of :meth:`Menu.add` and " +":meth:`Menu.insert`." +msgstr "" + +#: ../../library/tkinter.rst:6513 +msgid "Values for the *selectmode* option of the :class:`Listbox` widget." +msgstr "" + +#: ../../library/tkinter.rst:6519 +msgid "Values for the *style* option of :class:`Canvas` arc items." +msgstr "" + +#: ../../library/tkinter.rst:6527 +msgid "" +"Values for the *capstyle* (``'butt'``, ``'projecting'``, ``'round'``) and " +"*joinstyle* (``'round'``, ``'bevel'``, ``'miter'``) options of " +":class:`Canvas` line items." +msgstr "" + +#: ../../library/tkinter.rst:6534 +msgid "" +"Values for the *arrow* option of :class:`Canvas` line items, indicating " +"which ends have arrowheads." +msgstr "" + +#: ../../library/tkinter.rst:6540 +msgid "" +"The first argument passed by a :class:`Scrollbar` to the :meth:`XView.xview`" +" or :meth:`YView.yview` method of the scrolled widget." +msgstr "" + +#: ../../library/tkinter.rst:6546 +msgid "" +"Values for the *what* argument of :meth:`XView.xview_scroll` and " +":meth:`YView.yview_scroll`." +msgstr "" + +#: ../../library/tkinter.rst:6553 +msgid "Other option values: ``'underline'``, ``'numeric'`` and ``'dotbox'``." +msgstr "" + +#: ../../library/tkinter.rst:591 +msgid "geometry management (widgets)" +msgstr "" + +#: ../../library/tkinter.rst:591 +msgid "packing (widgets)" +msgstr "packing (部件)" + +#: ../../library/tkinter.rst:730 +msgid "window manager (widgets)" +msgstr "window manager (部件)" + +#: ../../library/tkinter.rst:768 +msgid "Tk Option Data Types" +msgstr "Tk 参数的数据类型" + +#: ../../library/tkinter.rst:857 +msgid "bind (widgets)" +msgstr "bind (部件)" + +#: ../../library/tkinter.rst:857 +msgid "events (widgets)" +msgstr "events (部件)" diff --git a/library/tkinter.scrolledtext.po b/library/tkinter.scrolledtext.po new file mode 100644 index 0000000000..356e9ee0da --- /dev/null +++ b/library/tkinter.scrolledtext.po @@ -0,0 +1,64 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-06-19 17:31+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/tkinter.scrolledtext.rst:2 +msgid ":mod:`!tkinter.scrolledtext` --- Scrolled text widget" +msgstr "" + +#: ../../library/tkinter.scrolledtext.rst:9 +msgid "**Source code:** :source:`Lib/tkinter/scrolledtext.py`" +msgstr "**源代码:** :source:`Lib/tkinter/scrolledtext.py`" + +#: ../../library/tkinter.scrolledtext.rst:13 +msgid "" +"The :mod:`!tkinter.scrolledtext` module provides a class of the same name " +"which implements a basic text widget which has a vertical scroll bar " +"configured to do the \"right thing.\" Using the :class:`ScrolledText` class" +" is a lot easier than setting up a text widget and scroll bar directly." +msgstr "" +":mod:`!tkinter.scrolledtext` 模块提供了一个同名类,实现了一个基本的文本控件并带有配置好的垂直滚动条。使用 " +":class:`ScrolledText` 类比直接设置文本控件和滚动条要容易得多。" + +#: ../../library/tkinter.scrolledtext.rst:18 +msgid "" +"The text widget and scrollbar are packed together in a " +":class:`~tkinter.Frame`, and the methods of the :class:`~tkinter.Pack`, " +":class:`~tkinter.Grid` and :class:`~tkinter.Place` geometry managers are " +"acquired from the :class:`~tkinter.Frame` object. This allows the " +":class:`ScrolledText` widget to be used directly to achieve most normal " +"geometry management behavior." +msgstr "" + +#: ../../library/tkinter.scrolledtext.rst:25 +msgid "" +"Should more specific control be necessary, the following attributes are " +"available:" +msgstr "如果需要更具体的控制,可以使用以下属性:" + +#: ../../library/tkinter.scrolledtext.rst:33 +msgid "The frame which surrounds the text and scroll bar widgets." +msgstr "围绕文本和滚动条控件的框架。" + +#: ../../library/tkinter.scrolledtext.rst:38 +msgid "The scroll bar widget." +msgstr "滚动条控件。" diff --git a/library/tkinter.ttk.po b/library/tkinter.ttk.po new file mode 100644 index 0000000000..306af49d56 --- /dev/null +++ b/library/tkinter.ttk.po @@ -0,0 +1,2905 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2001 Python Software Foundation +# This file is distributed under the same license as the Python package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Rafael Fontenelle , 2026 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Python 3.14\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-17 16:14+0000\n" +"PO-Revision-Date: 2026-05-08 17:18+0000\n" +"Last-Translator: Rafael Fontenelle , 2026\n" +"Language-Team: Chinese (China) (https://app.transifex.com/python-doc/teams/5390/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../library/tkinter.ttk.rst:2 +msgid ":mod:`!tkinter.ttk` --- Tk themed widgets" +msgstr ":mod:`!tkinter.ttk` --- Tk 带主题的控件" + +#: ../../library/tkinter.ttk.rst:9 +msgid "**Source code:** :source:`Lib/tkinter/ttk.py`" +msgstr "**源代码:** :source:`Lib/tkinter/ttk.py`" + +#: ../../library/tkinter.ttk.rst:15 +msgid "" +"The :mod:`!tkinter.ttk` module provides access to the Tk themed widget set, " +"introduced in Tk 8.5. Its widgets adapt their appearance to the platform's " +"native theme, giving an application a better and more consistent look and " +"feel than the classic :mod:`tkinter` widgets, whose appearance is fixed." +msgstr "" + +#: ../../library/tkinter.ttk.rst:21 +msgid "" +"The basic idea for :mod:`!tkinter.ttk` is to separate, to the extent " +"possible, the code implementing a widget's behavior from the code " +"implementing its appearance." +msgstr ":mod:`!tkinter.ttk` 的基本思路是尽可能将实现控件行为的代码与实现其外观的代码分离开来。" + +#: ../../library/tkinter.ttk.rst:25 +msgid "" +"Ttk widgets are used just like the classic :mod:`tkinter` widgets and share " +"the same machinery: the widget hierarchy, the geometry managers, variable " +"coupling and event binding. Those foundational concepts are covered in the " +":mod:`tkinter` documentation and are not repeated here." +msgstr "" + +#: ../../library/tkinter.ttk.rst:36 +msgid "" +"`Tk Widget Styling Support (TIP #48) `_" +msgstr "" + +#: ../../library/tkinter.ttk.rst:37 +msgid "" +"The Tcl Improvement Proposal that introduced the themed widget styling " +"engine." +msgstr "" + +#: ../../library/tkinter.ttk.rst:41 +msgid "Using Ttk" +msgstr "ttk 的用法" + +#: ../../library/tkinter.ttk.rst:43 +msgid "To start using Ttk, import its module::" +msgstr "使用 ttk 之前,首先要导入模块:" + +#: ../../library/tkinter.ttk.rst:45 +msgid "from tkinter import ttk" +msgstr "from tkinter import ttk" + +#: ../../library/tkinter.ttk.rst:47 +msgid "" +"To override the basic Tk widgets, the import should follow the Tk import::" +msgstr "为了覆盖基础的 Tk 控件,应该在 Tk 之后进行导入:" + +#: ../../library/tkinter.ttk.rst:49 +msgid "" +"from tkinter import *\n" +"from tkinter.ttk import *" +msgstr "" +"from tkinter import *\n" +"from tkinter.ttk import *" + +#: ../../library/tkinter.ttk.rst:52 +msgid "" +"That code causes several :mod:`!tkinter.ttk` widgets (:class:`Button`, " +":class:`Checkbutton`, :class:`Entry`, :class:`Frame`, :class:`Label`, " +":class:`LabelFrame`, :class:`Menubutton`, :class:`OptionMenu`, " +":class:`PanedWindow`, :class:`Radiobutton`, :class:`Scale`, " +":class:`Scrollbar` and :class:`Spinbox`) to automatically replace the Tk " +"widgets." +msgstr "" + +#: ../../library/tkinter.ttk.rst:61 +msgid "" +"Overriding the classic widgets with ``from tkinter.ttk import *`` is " +"convenient for adapting existing code, but new code is usually clearer if it" +" imports the module as ``from tkinter import ttk`` and refers to the themed " +"widgets explicitly, such as ``ttk.Button``." +msgstr "" + +#: ../../library/tkinter.ttk.rst:67 +msgid "" +"This has the direct benefit of using the new widgets which gives a better " +"look and feel across platforms; however, the replacement widgets are not " +"completely compatible. The main difference is that widget options such as " +"``fg``, ``bg`` and others related to widget styling are no longer present in" +" Ttk widgets. Instead, use the :class:`ttk.Style